← Back to Theming

Mode sombre avec transitions automatiques et préférences utilisateur

SETUPImplémentation Next.js

Configuration avec next-themes pour une gestion automatique

import { ThemeProvider } from 'next-themes'

export default function Layout({ children }) {
  return (
    <ThemeProvider
      attribute="class"
      defaultTheme="system"
      enableSystem
      disableTransitionOnChange={false}
    >
      {children}
    </ThemeProvider>
  )
}
CSSVariables Dark Theme

Redéfinition des variables CSS pour le mode sombre

.dark {
  /* Background Colors */
  --background: 222.2 84% 4.9%;
  --foreground: 210 40% 98%;

  /* Card Colors */
  --card: 222.2 84% 4.9%;
  --card-foreground: 210 40% 98%;

  /* Muted Colors */
  --muted: 217.2 32.6% 17.5%;
  --muted-foreground: 215 20.2% 65.1%;

  /* Border Colors */
  --border: 217.2 32.6% 17.5%;
  --input: 217.2 32.6% 17.5%;
}
COMPTheme Toggle Component

Composant de basculement avec icônes dynamiques

import { Moon, Sun } from 'lucide-react'
import { useTheme } from 'next-themes'

export function ThemeToggle() {
  const { setTheme, theme } = useTheme()

  return (
    <Button
      variant="outline"
      size="icon"
      onClick={() => setTheme(theme === "light" ? "dark" : "light")}
    >
      <Sun className="h-[1.2rem] w-[1.2rem] rotate-0 scale-100 transition-all dark:-rotate-90 dark:scale-0" />
      <Moon className="absolute h-[1.2rem] w-[1.2rem] rotate-90 scale-0 transition-all dark:rotate-0 dark:scale-100" />
    </Button>
  )
}
AUTODétection Système

Respect automatique des préférences système utilisateur

Fonctionnalités

  • • 🔍 Media Query Detection - prefers-color-scheme: dark
  • • 💾 LocalStorage Persistence - Sauvegarde des préférences
  • • 🔄 Hydration Safe - Pas de flash entre les modes
  • • ⚡ Smooth Transitions - Animations fluides
TIPSBonnes Pratiques

✅ À FAIRE

  • • Utiliser des variables CSS
  • • Tester la lisibilité
  • • Prévoir les transitions
  • • Respecter l'accessibilité

❌ ÉVITER

  • • Couleurs codées en dur
  • • Flash de contenu
  • • Manque de contraste
  • • Transitions trop brusques