|
|
@@ -0,0 +1,43 @@
|
|
|
+import { Moon, Sun } from 'lucide-react';
|
|
|
+import { useTheme } from 'next-themes';
|
|
|
+import { Button } from '@/components/ui/button';
|
|
|
+import { useEffect, useState } from 'react';
|
|
|
+
|
|
|
+const ThemeToggle = () => {
|
|
|
+ const { theme, setTheme } = useTheme();
|
|
|
+ const [mounted, setMounted] = useState(false);
|
|
|
+
|
|
|
+ // Éviter l'hydration mismatch
|
|
|
+ useEffect(() => {
|
|
|
+ setMounted(true);
|
|
|
+ }, []);
|
|
|
+
|
|
|
+ if (!mounted) {
|
|
|
+ return (
|
|
|
+ <Button variant="ghost" size="sm" disabled>
|
|
|
+ <Sun className="h-4 w-4" />
|
|
|
+ </Button>
|
|
|
+ );
|
|
|
+ }
|
|
|
+
|
|
|
+ const toggleTheme = () => {
|
|
|
+ setTheme(theme === 'dark' ? 'light' : 'dark');
|
|
|
+ };
|
|
|
+
|
|
|
+ return (
|
|
|
+ <Button
|
|
|
+ variant="ghost"
|
|
|
+ size="sm"
|
|
|
+ onClick={toggleTheme}
|
|
|
+ aria-label={theme === 'dark' ? 'Activer le mode clair' : 'Activer le mode sombre'}
|
|
|
+ >
|
|
|
+ {theme === 'dark' ? (
|
|
|
+ <Sun className="h-4 w-4" />
|
|
|
+ ) : (
|
|
|
+ <Moon className="h-4 w-4" />
|
|
|
+ )}
|
|
|
+ </Button>
|
|
|
+ );
|
|
|
+};
|
|
|
+
|
|
|
+export default ThemeToggle;
|