ObsiViewer/scripts/refactor-colors.mjs

170 lines
6.6 KiB
JavaScript

#!/usr/bin/env node
/**
* Script pour remplacer les couleurs hardcodées par des tokens CSS
* Usage: node scripts/refactor-colors.mjs
*/
import { readFileSync, writeFileSync, readdirSync, statSync } from 'fs';
import { join, extname } from 'path';
// Mapping des classes Tailwind hardcodées vers les tokens
const COLOR_REPLACEMENTS = [
// Dark mode backgrounds
{ from: /\bdark:bg-slate-700\b/g, to: 'dark:bg-surface2' },
{ from: /\bdark:bg-slate-800\b/g, to: 'dark:bg-card' },
{ from: /\bdark:bg-slate-900\b/g, to: 'dark:bg-main' },
{ from: /\bdark:bg-gray-700\b/g, to: 'dark:bg-surface2' },
{ from: /\bdark:bg-gray-800\b/g, to: 'dark:bg-card' },
{ from: /\bdark:bg-gray-900\b/g, to: 'dark:bg-main' },
{ from: /\bdark:bg-zinc-700\b/g, to: 'dark:bg-surface2' },
{ from: /\bdark:bg-zinc-800\b/g, to: 'dark:bg-card' },
{ from: /\bdark:bg-zinc-900\b/g, to: 'dark:bg-main' },
// Dark mode text
{ from: /\bdark:text-slate-200\b/g, to: 'dark:text-main' },
{ from: /\bdark:text-slate-300\b/g, to: 'dark:text-main' },
{ from: /\bdark:text-slate-400\b/g, to: 'dark:text-muted' },
{ from: /\bdark:text-gray-200\b/g, to: 'dark:text-main' },
{ from: /\bdark:text-gray-300\b/g, to: 'dark:text-main' },
{ from: /\bdark:text-gray-400\b/g, to: 'dark:text-muted' },
{ from: /\bdark:text-zinc-200\b/g, to: 'dark:text-main' },
{ from: /\bdark:text-zinc-300\b/g, to: 'dark:text-main' },
{ from: /\bdark:text-zinc-400\b/g, to: 'dark:text-muted' },
// Dark mode borders
{ from: /\bdark:border-slate-600\b/g, to: 'dark:border-border' },
{ from: /\bdark:border-slate-700\b/g, to: 'dark:border-border' },
{ from: /\bdark:border-gray-600\b/g, to: 'dark:border-border' },
{ from: /\bdark:border-gray-700\b/g, to: 'dark:border-border' },
{ from: /\bdark:border-zinc-600\b/g, to: 'dark:border-border' },
{ from: /\bdark:border-zinc-700\b/g, to: 'dark:border-border' },
// Dark hover states
{ from: /\bdark:hover:bg-slate-700\b/g, to: 'dark:hover:bg-surface2' },
{ from: /\bdark:hover:bg-slate-800\b/g, to: 'dark:hover:bg-card' },
{ from: /\bdark:hover:bg-gray-700\b/g, to: 'dark:hover:bg-surface2' },
{ from: /\bdark:hover:bg-gray-800\b/g, to: 'dark:hover:bg-card' },
{ from: /\bdark:hover:text-slate-200\b/g, to: 'dark:hover:text-main' },
{ from: /\bdark:hover:text-gray-200\b/g, to: 'dark:hover:text-main' },
// Backgrounds
{ from: /\bbg-slate-50\b/g, to: 'bg-surface1' },
{ from: /\bbg-slate-100\b/g, to: 'bg-surface1' },
{ from: /\bbg-slate-200\b/g, to: 'bg-surface2' },
{ from: /\bbg-slate-300\b/g, to: 'bg-muted' },
{ from: /\bbg-gray-50\b/g, to: 'bg-surface1' },
{ from: /\bbg-gray-100\b/g, to: 'bg-surface1' },
{ from: /\bbg-gray-200\b/g, to: 'bg-surface2' },
{ from: /\bbg-gray-300\b/g, to: 'bg-muted' },
{ from: /\bbg-gray-800\b/g, to: 'bg-card' },
{ from: /\bbg-gray-900\b/g, to: 'bg-main' },
{ from: /\bbg-zinc-50\b/g, to: 'bg-surface1' },
{ from: /\bbg-zinc-100\b/g, to: 'bg-surface1' },
{ from: /\bbg-zinc-800\b/g, to: 'bg-card' },
{ from: /\bbg-zinc-900\b/g, to: 'bg-main' },
{ from: /\bbg-white\b/g, to: 'bg-card' },
// Text colors
{ from: /\btext-slate-400\b/g, to: 'text-muted' },
{ from: /\btext-slate-500\b/g, to: 'text-muted' },
{ from: /\btext-slate-600\b/g, to: 'text-muted' },
{ from: /\btext-slate-700\b/g, to: 'text-main' },
{ from: /\btext-slate-800\b/g, to: 'text-main' },
{ from: /\btext-slate-900\b/g, to: 'text-main' },
{ from: /\btext-gray-400\b/g, to: 'text-muted' },
{ from: /\btext-gray-500\b/g, to: 'text-muted' },
{ from: /\btext-gray-600\b/g, to: 'text-muted' },
{ from: /\btext-gray-700\b/g, to: 'text-main' },
{ from: /\btext-gray-800\b/g, to: 'text-main' },
{ from: /\btext-gray-900\b/g, to: 'text-main' },
{ from: /\btext-zinc-400\b/g, to: 'text-muted' },
{ from: /\btext-zinc-500\b/g, to: 'text-muted' },
{ from: /\btext-zinc-600\b/g, to: 'text-muted' },
{ from: /\btext-zinc-700\b/g, to: 'text-main' },
{ from: /\btext-zinc-800\b/g, to: 'text-main' },
{ from: /\btext-zinc-900\b/g, to: 'text-main' },
// Borders
{ from: /\bborder-slate-200\b/g, to: 'border-border' },
{ from: /\bborder-slate-300\b/g, to: 'border-border' },
{ from: /\bborder-gray-200\b/g, to: 'border-border' },
{ from: /\bborder-gray-300\b/g, to: 'border-border' },
{ from: /\bborder-zinc-200\b/g, to: 'border-border' },
{ from: /\bborder-zinc-300\b/g, to: 'border-border' },
// Hover states
{ from: /\bhover:bg-slate-100\b/g, to: 'hover:bg-surface1' },
{ from: /\bhover:bg-slate-200\b/g, to: 'hover:bg-surface2' },
{ from: /\bhover:bg-gray-100\b/g, to: 'hover:bg-surface1' },
{ from: /\bhover:bg-gray-200\b/g, to: 'hover:bg-surface2' },
{ from: /\bhover:bg-zinc-100\b/g, to: 'hover:bg-surface1' },
{ from: /\bhover:text-slate-900\b/g, to: 'hover:text-main' },
{ from: /\bhover:text-gray-900\b/g, to: 'hover:text-main' },
// Focus states
{ from: /\bfocus:border-slate-400\b/g, to: 'focus:border-primary' },
{ from: /\bfocus:border-gray-400\b/g, to: 'focus:border-primary' },
{ from: /\bfocus:ring-slate-500\b/g, to: 'focus:ring-ring' },
{ from: /\bfocus:ring-gray-500\b/g, to: 'focus:ring-ring' },
];
function processFile(filePath) {
try {
let content = readFileSync(filePath, 'utf-8');
let modified = false;
for (const { from, to } of COLOR_REPLACEMENTS) {
if (from.test(content)) {
content = content.replace(from, to);
modified = true;
}
}
if (modified) {
writeFileSync(filePath, content, 'utf-8');
console.log(`✓ Updated: ${filePath}`);
return 1;
}
return 0;
} catch (error) {
console.error(`✗ Error processing ${filePath}:`, error.message);
return 0;
}
}
function walkDirectory(dir, extensions = ['.ts', '.html']) {
let filesUpdated = 0;
const items = readdirSync(dir);
for (const item of items) {
const fullPath = join(dir, item);
const stat = statSync(fullPath);
if (stat.isDirectory()) {
// Skip node_modules, .angular, dist, etc.
if (!['node_modules', '.angular', 'dist', '.git'].includes(item)) {
filesUpdated += walkDirectory(fullPath, extensions);
}
} else if (stat.isFile()) {
const ext = extname(fullPath);
if (extensions.includes(ext)) {
filesUpdated += processFile(fullPath);
}
}
}
return filesUpdated;
}
// Main execution
const srcDir = join(process.cwd(), 'src');
console.log('🎨 Starting color refactoring...\n');
console.log(`Scanning: ${srcDir}\n`);
const filesUpdated = walkDirectory(srcDir);
console.log(`\n✨ Refactoring complete!`);
console.log(`📝 Files updated: ${filesUpdated}`);