import { useCallback, useEffect, useState } from "react"; type Theme = "light" | "dark" | "system"; function getSystemTheme(): "light" | "dark" { return window.matchMedia("(prefers-color-scheme: dark)").matches ? "dark" : "light"; } function applyTheme(theme: Theme) { const resolved = theme === "system" ? getSystemTheme() : theme; document.documentElement.classList.toggle("dark", resolved === "dark"); } export function useTheme() { const [theme, setThemeState] = useState(() => { if (typeof window === "undefined") return "system"; return (localStorage.getItem("theme") as Theme) ?? "system"; }); const setTheme = useCallback((next: Theme) => { setThemeState(next); if (next === "system") { localStorage.removeItem("theme"); } else { localStorage.setItem("theme", next); } applyTheme(next); }, []); useEffect(() => { applyTheme(theme); if (theme !== "system") return; const mq = window.matchMedia("(prefers-color-scheme: dark)"); const handler = () => applyTheme("system"); mq.addEventListener("change", handler); return () => mq.removeEventListener("change", handler); }, [theme]); return { theme, setTheme }; } const iconClass = "h-4 w-4"; function SunIcon() { return ( ); } function MoonIcon() { return ( ); } export function ThemeToggle() { const { theme, setTheme } = useTheme(); const resolved = theme === "system" ? getSystemTheme() : theme; return ( ); }