"use client"; import { useEffect, useState } from "react"; import { Moon, Sun } from "lucide-react"; const THEME_STORAGE_KEY = "theme"; type ThemeMode = "light" | "dark"; const getPreferredTheme = (): ThemeMode => { if (typeof window === "undefined") return "light"; const stored = window.localStorage.getItem(THEME_STORAGE_KEY); if (stored === "light" || stored === "dark") return stored; const prefersDark = window.matchMedia("(prefers-color-scheme: dark)").matches; return prefersDark ? "dark" : "light"; }; const applyTheme = (mode: ThemeMode) => { if (typeof document === "undefined") return; document.documentElement.classList.toggle("dark", mode === "dark"); }; export const ThemeToggle = () => { // Keep SSR + initial hydration stable ("light") to avoid markup mismatch. const [theme, setTheme] = useState("light"); useEffect(() => { const preferred = getPreferredTheme(); // eslint-disable-next-line react-hooks/set-state-in-effect setTheme(preferred); applyTheme(preferred); }, []); const toggleTheme = () => { setTheme((current) => { const next: ThemeMode = current === "dark" ? "light" : "dark"; if (typeof window !== "undefined") { window.localStorage.setItem(THEME_STORAGE_KEY, next); } applyTheme(next); return next; }); }; const isDark = theme === "dark"; return ( ); };