import { useState, useEffect, useCallback } from "react"; type Theme = "light" | "dark"; const STORAGE_KEY = "theme"; function getInitialTheme(): Theme { const stored = localStorage.getItem(STORAGE_KEY); if (stored === "light" || stored === "dark") return stored; return window.matchMedia("(prefers-color-scheme: dark)").matches ? "dark" : "light"; } function applyTheme(theme: Theme) { document.documentElement.classList.toggle("dark", theme === "dark"); } export function useTheme() { const [theme, setTheme] = useState(getInitialTheme); useEffect(() => { applyTheme(theme); localStorage.setItem(STORAGE_KEY, theme); }, [theme]); // Listen for OS preference changes (only when no explicit user choice) useEffect(() => { const mq = window.matchMedia("(prefers-color-scheme: dark)"); const handler = (e: MediaQueryListEvent) => { if (!localStorage.getItem(STORAGE_KEY)) { setTheme(e.matches ? "dark" : "light"); } }; mq.addEventListener("change", handler); return () => mq.removeEventListener("change", handler); }, []); const toggleTheme = useCallback(() => { setTheme((prev) => (prev === "light" ? "dark" : "light")); }, []); return { theme, toggleTheme } as const; }