import { createContext, useContext, useState, useEffect, type ReactNode } from 'react'; type Theme = 'light' | 'dark' | 'system'; type ThemeContextType = { theme: Theme; resolved: 'light' | 'dark'; setTheme: (t: Theme) => void; }; const ThemeContext = createContext(null); function getSystemTheme(): 'light' | 'dark' { return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light'; } function applyTheme(theme: Theme) { const resolved = theme === 'system' ? getSystemTheme() : theme; if (theme === 'system') { document.documentElement.removeAttribute('data-theme'); } else { document.documentElement.setAttribute('data-theme', theme); } return resolved; } export function ThemeProvider({ children }: { children: ReactNode }) { const [theme, setThemeState] = useState(() => { return (localStorage.getItem('agent-fox-theme') as Theme) || 'system'; }); const [resolved, setResolved] = useState<'light' | 'dark'>(() => applyTheme( (localStorage.getItem('agent-fox-theme') as Theme) || 'system' )); const setTheme = (t: Theme) => { localStorage.setItem('agent-fox-theme', t); setThemeState(t); setResolved(applyTheme(t)); }; useEffect(() => { setResolved(applyTheme(theme)); }, [theme]); useEffect(() => { if (theme !== 'system') return; const mq = window.matchMedia('(prefers-color-scheme: dark)'); const handler = () => setResolved(applyTheme('system')); mq.addEventListener('change', handler); return () => mq.removeEventListener('change', handler); }, [theme]); return ( {children} ); } export function useTheme() { const ctx = useContext(ThemeContext); if (!ctx) throw new Error('useTheme must be used within ThemeProvider'); return ctx; }