#!/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}`);