"use client"; import React, { createContext, useCallback, useContext, useEffect, useState } from "react"; type Theme = "system" | "light" | "dark"; const ThemeCtx = createContext<{ theme: Theme; resolvedTheme: "light" | "dark"; setTheme: (t: Theme) => void }>({ theme: "system", resolvedTheme: "light", setTheme: () => {}, }); function getSystemTheme(): "light" | "dark" { if (typeof window === "undefined") return "light"; 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"); return resolved; } export function ThemeProvider({ children }: { children: React.ReactNode }) { const [theme, setThemeState] = useState("system"); const [resolvedTheme, setResolvedTheme] = useState<"light" | "dark">("light"); useEffect(() => { try { const stored = localStorage.getItem("theme") as Theme | null; if (stored === "dark" || stored === "light" || stored === "system") { setThemeState(stored); } } catch {} }, []); useEffect(() => { const resolved = applyTheme(theme); setResolvedTheme(resolved); }, [theme]); useEffect(() => { if (theme !== "system") return; const mql = window.matchMedia("(prefers-color-scheme: dark)"); const handler = () => { const resolved = applyTheme(theme); setResolvedTheme(resolved); }; mql.addEventListener("change", handler); return () => mql.removeEventListener("change", handler); }, [theme]); const setTheme = useCallback((t: Theme) => { setThemeState(t); try { localStorage.setItem("theme", t); } catch {} }, []); return {children}; } export function useTheme() { return useContext(ThemeCtx); }