"use client"; import { createContext, useContext, useState, useEffect, type ReactNode } from "react"; export type Theme = "light" | "dark" | "system"; interface ThemeContextType { theme: Theme; setTheme: (t: Theme) => void; resolved: "light" | "dark"; } const ThemeContext = createContext({ theme: "system", setTheme: () => {}, resolved: "dark", }); export function ThemeProvider({ children }: { children: ReactNode }) { const [theme, setThemeState] = useState("system"); const [resolved, setResolved] = useState<"light" | "dark">("dark"); useEffect(() => { const saved = localStorage.getItem("theme") as Theme | null; if (saved && ["light", "dark", "system"].includes(saved)) { setThemeState(saved); } }, []); useEffect(() => { const resolve = () => { if (theme === "system") { return window.matchMedia("(prefers-color-scheme: dark)").matches ? "dark" : "light"; } return theme; }; const r = resolve(); setResolved(r); const root = document.documentElement; root.classList.remove("light", "dark"); root.classList.add(r); root.setAttribute("data-theme", r); if (theme === "system") { const mq = window.matchMedia("(prefers-color-scheme: dark)"); const handler = () => { const nr = mq.matches ? "dark" : "light"; setResolved(nr); root.classList.remove("light", "dark"); root.classList.add(nr); root.setAttribute("data-theme", nr); }; mq.addEventListener("change", handler); return () => mq.removeEventListener("change", handler); } }, [theme]); const setTheme = (t: Theme) => { setThemeState(t); localStorage.setItem("theme", t); }; return ( {children} ); } export function useTheme() { return useContext(ThemeContext); }