"use client"; import * as React from "react"; export type Theme = "light" | "dark"; export type ThemePreference = Theme | "system"; const STORAGE_KEY = "carrier-theme"; type ThemeContextValue = { theme: Theme; preference: ThemePreference; setPreference: (pref: ThemePreference) => void; toggle: () => void; }; const ThemeContext = React.createContext(null); function resolve(pref: ThemePreference): Theme { if (pref === "system" && typeof window !== "undefined") { return window.matchMedia("(prefers-color-scheme: dark)").matches ? "dark" : "light"; } return pref === "dark" ? "dark" : "light"; } function applyToDocument(theme: Theme) { const root = document.documentElement; root.setAttribute("data-theme", theme); root.style.colorScheme = theme; } export function ThemeProvider({ children }: { children: React.ReactNode }) { const [preference, setPreferenceState] = React.useState("light"); const [theme, setTheme] = React.useState("light"); React.useEffect(() => { try { const stored = window.localStorage.getItem(STORAGE_KEY); if (stored === "light" || stored === "dark" || stored === "system") { setPreferenceState(stored); const next = resolve(stored); setTheme(next); applyToDocument(next); return; } } catch { /* private mode */ } applyToDocument("light"); }, []); const setPreference = React.useCallback((pref: ThemePreference) => { setPreferenceState(pref); const next = resolve(pref); setTheme(next); applyToDocument(next); try { window.localStorage.setItem(STORAGE_KEY, pref); } catch { /* ignore */ } }, []); const toggle = React.useCallback(() => { setPreference(theme === "dark" ? "light" : "dark"); }, [theme, setPreference]); const value = React.useMemo( () => ({ theme, preference, setPreference, toggle }), [theme, preference, setPreference, toggle], ); return {children}; } export function useTheme(): ThemeContextValue { const ctx = React.useContext(ThemeContext); if (!ctx) throw new Error("useTheme must be used within "); return ctx; }