"use client"; import { createContext, useCallback, useContext, useEffect, useState, type ReactNode, } from "react"; const STORAGE_KEY = "theme"; export type Theme = "light" | "dark"; type ThemeContextValue = { theme: Theme; setTheme: (theme: Theme) => void; toggleTheme: () => void; }; const ThemeContext = createContext(null); function getInitialTheme(): Theme { if (typeof window === "undefined") return "light"; try { const stored = localStorage.getItem(STORAGE_KEY) as Theme | null; if (stored === "dark" || stored === "light") return stored; return window.matchMedia("(prefers-color-scheme: dark)").matches ? "dark" : "light"; } catch { return "light"; } } function applyTheme(theme: Theme) { const root = document.documentElement; root.classList.toggle("dark", theme === "dark"); } export function ThemeProvider({ children }: { children: ReactNode }) { const [theme, setThemeState] = useState(getInitialTheme); useEffect(() => { applyTheme(theme); try { localStorage.setItem(STORAGE_KEY, theme); } catch { /* ignore */ } }, [theme]); const setTheme = useCallback((newTheme: Theme) => { setThemeState(newTheme); }, []); const toggleTheme = useCallback(() => { setThemeState((prev) => (prev === "light" ? "dark" : "light")); }, []); return ( {children} ); } export function useTheme() { const ctx = useContext(ThemeContext); if (!ctx) throw new Error("useTheme must be used within ThemeProvider"); return ctx; }