+```
+
+## Migration des composants existants
+
+### Avant (avec classes Tailwind)
+```tsx
+
+ ✅ Succès
+
+```
+
+### Après (avec design tokens)
+```tsx
+
+ Succès
+
+```
+
+## Extensibilité
+
+Le système est conçu pour supporter facilement :
+- **Nouveaux thèmes** : Ajouter dans `themeTokens`
+- **Nouveaux patterns** : Étendre `COLOR_PATTERNS`
+- **Nouvelles opacités** : Ajouter dans `OPACITY`
+- **Composants personnalisés** : Utiliser `useDesignTokens`
+
+## Exemples d'usage
+
+### Composant personnalisé
+```tsx
+import { useDesignTokens } from '@/hooks/useDesignTokens';
+
+function CustomComponent() {
+ const { colors, withOpacity } = useDesignTokens();
+
+ return (
+
+ Contenu personnalisé
+
+ );
+}
+```
+
+### Style conditionnel
+```tsx
+function ConditionalComponent({ isActive }: { isActive: boolean }) {
+ const { colors } = useDesignTokens();
+
+ return (
+
+ {isActive ? 'Actif' : 'Inactif'}
+
+ );
+}
+```
+
+Ce système garantit la cohérence visuelle et facilite la maintenance des styles dans toute l'application.
diff --git a/src/lib/design-tokens.ts b/src/lib/design-tokens.ts
new file mode 100644
index 0000000..f3f81d7
--- /dev/null
+++ b/src/lib/design-tokens.ts
@@ -0,0 +1,241 @@
+/**
+ * Design Tokens - Système de couleurs cohérent pour TowerControl
+ *
+ * Ce fichier définit tous les tokens de design utilisés dans l'application.
+ * Il sert de source unique de vérité pour les couleurs et facilite la maintenance.
+ */
+
+export type ColorToken = string;
+
+export interface ColorPalette {
+ // Couleurs principales
+ background: ColorToken;
+ foreground: ColorToken;
+
+ // Surfaces
+ card: ColorToken;
+ cardHover: ColorToken;
+ cardColumn: ColorToken;
+
+ // Bordures et inputs
+ border: ColorToken;
+ input: ColorToken;
+
+ // Couleurs sémantiques
+ primary: ColorToken;
+ primaryForeground: ColorToken;
+ muted: ColorToken;
+ mutedForeground: ColorToken;
+
+ // Couleurs d'état
+ destructive: ColorToken;
+ success: ColorToken;
+ accent: ColorToken;
+
+ // Couleurs étendues
+ purple: ColorToken;
+ yellow: ColorToken;
+ green: ColorToken;
+ blue: ColorToken;
+ gray: ColorToken;
+ grayLight: ColorToken;
+}
+
+export interface ThemeTokens {
+ light: ColorPalette;
+ dark: ColorPalette;
+}
+
+/**
+ * Tokens de couleurs pour le thème clair
+ */
+export const lightTheme: ColorPalette = {
+ // Couleurs principales
+ background: '#f1f5f9', // slate-100
+ foreground: '#0f172a', // slate-900
+
+ // Surfaces
+ card: '#ffffff', // white
+ cardHover: '#f8fafc', // slate-50
+ cardColumn: '#f8fafc', // slate-50
+
+ // Bordures et inputs
+ border: '#cbd5e1', // slate-300
+ input: '#ffffff', // white
+
+ // Couleurs sémantiques
+ primary: '#0891b2', // cyan-600
+ primaryForeground: '#ffffff', // white
+ muted: '#94a3b8', // slate-400
+ mutedForeground: '#64748b', // slate-500
+
+ // Couleurs d'état
+ destructive: '#dc2626', // red-600
+ success: '#059669', // emerald-600
+ accent: '#d97706', // amber-600
+
+ // Couleurs étendues
+ purple: '#8b5cf6', // purple-500
+ yellow: '#eab308', // yellow-500
+ green: '#059669', // emerald-600
+ blue: '#2563eb', // blue-600
+ gray: '#6b7280', // gray-500
+ grayLight: '#e5e7eb', // gray-200
+};
+
+/**
+ * Tokens de couleurs pour le thème sombre
+ */
+export const darkTheme: ColorPalette = {
+ // Couleurs principales
+ background: '#1e293b', // slate-800
+ foreground: '#f1f5f9', // slate-100
+
+ // Surfaces
+ card: '#334155', // slate-700
+ cardHover: '#475569', // slate-600
+ cardColumn: '#0f172a', // slate-900
+
+ // Bordures et inputs
+ border: '#64748b', // slate-500
+ input: '#334155', // slate-700
+
+ // Couleurs sémantiques
+ primary: '#06b6d4', // cyan-500
+ primaryForeground: '#f1f5f9', // slate-100
+ muted: '#64748b', // slate-500
+ mutedForeground: '#94a3b8', // slate-400
+
+ // Couleurs d'état
+ destructive: '#ef4444', // red-500
+ success: '#10b981', // emerald-500
+ accent: '#f59e0b', // amber-500
+
+ // Couleurs étendues
+ purple: '#8b5cf6', // purple-500
+ yellow: '#eab308', // yellow-500
+ green: '#10b981', // emerald-500
+ blue: '#3b82f6', // blue-500
+ gray: '#9ca3af', // gray-400
+ grayLight: '#374151', // gray-700
+};
+
+/**
+ * Collection complète des tokens de thème
+ */
+export const themeTokens: ThemeTokens = {
+ light: lightTheme,
+ dark: darkTheme,
+};
+
+/**
+ * Utilitaires pour les tokens de couleur
+ */
+export class DesignTokenUtils {
+ /**
+ * Génère une couleur avec transparence
+ */
+ static withOpacity(color: ColorToken, opacity: number): string {
+ return `color-mix(in srgb, ${color} ${opacity * 100}%, transparent)`;
+ }
+
+ /**
+ * Génère une couleur de bordure avec transparence
+ */
+ static borderWithOpacity(color: ColorToken, opacity: number, baseBorder: ColorToken): string {
+ return `color-mix(in srgb, ${color} ${opacity * 100}%, ${baseBorder})`;
+ }
+
+ /**
+ * Génère un background avec transparence
+ */
+ static backgroundWithOpacity(color: ColorToken, opacity: number): string {
+ return `color-mix(in srgb, ${color} ${opacity * 100}%, transparent)`;
+ }
+
+ /**
+ * Obtient les tokens pour un thème donné
+ */
+ static getTokens(theme: 'light' | 'dark'): ColorPalette {
+ return themeTokens[theme];
+ }
+
+ /**
+ * Génère les CSS Variables pour un thème
+ */
+ static generateCSSVariables(theme: 'light' | 'dark'): Record
{
+ const tokens = this.getTokens(theme);
+ return {
+ '--background': tokens.background,
+ '--foreground': tokens.foreground,
+ '--card': tokens.card,
+ '--card-hover': tokens.cardHover,
+ '--card-column': tokens.cardColumn,
+ '--border': tokens.border,
+ '--input': tokens.input,
+ '--primary': tokens.primary,
+ '--primary-foreground': tokens.primaryForeground,
+ '--muted': tokens.muted,
+ '--muted-foreground': tokens.mutedForeground,
+ '--destructive': tokens.destructive,
+ '--success': tokens.success,
+ '--accent': tokens.accent,
+ '--purple': tokens.purple,
+ '--yellow': tokens.yellow,
+ '--green': tokens.green,
+ '--blue': tokens.blue,
+ '--gray': tokens.gray,
+ '--gray-light': tokens.grayLight,
+ };
+ }
+}
+
+/**
+ * Constantes pour les opacités courantes
+ */
+export const OPACITY = {
+ subtle: 0.05, // 5% - très subtil
+ light: 0.1, // 10% - léger
+ medium: 0.2, // 20% - moyen
+ strong: 0.3, // 30% - fort
+ solid: 0.8, // 80% - presque opaque
+} as const;
+
+/**
+ * Patterns de couleurs prédéfinis pour les composants
+ */
+export const COLOR_PATTERNS = {
+ // Messages d'état
+ success: {
+ text: 'var(--success)',
+ background: DesignTokenUtils.withOpacity('var(--success)', OPACITY.light),
+ border: DesignTokenUtils.borderWithOpacity('var(--success)', OPACITY.medium, 'var(--border)'),
+ },
+ error: {
+ text: 'var(--destructive)',
+ background: DesignTokenUtils.withOpacity('var(--destructive)', OPACITY.light),
+ border: DesignTokenUtils.borderWithOpacity('var(--destructive)', OPACITY.medium, 'var(--border)'),
+ },
+ warning: {
+ text: 'var(--accent)',
+ background: DesignTokenUtils.withOpacity('var(--accent)', OPACITY.light),
+ border: DesignTokenUtils.borderWithOpacity('var(--accent)', OPACITY.medium, 'var(--border)'),
+ },
+
+ // Cards colorées
+ primary: {
+ text: 'var(--primary)',
+ background: DesignTokenUtils.withOpacity('var(--primary)', OPACITY.light),
+ border: DesignTokenUtils.borderWithOpacity('var(--primary)', OPACITY.medium, 'var(--border)'),
+ },
+ purple: {
+ text: 'var(--purple)',
+ background: DesignTokenUtils.withOpacity('var(--purple)', OPACITY.light),
+ border: DesignTokenUtils.borderWithOpacity('var(--purple)', OPACITY.medium, 'var(--border)'),
+ },
+ yellow: {
+ text: 'var(--yellow)',
+ background: DesignTokenUtils.withOpacity('var(--yellow)', OPACITY.light),
+ border: DesignTokenUtils.borderWithOpacity('var(--yellow)', OPACITY.medium, 'var(--border)'),
+ },
+} as const;