import { createContext, useContext, useEffect, useState, type ReactNode, } from 'react' type Theme = 'light' | 'dark' | 'system' interface ThemeContextValue { theme: Theme resolved: 'light' | 'dark' setTheme: (t: Theme) => void } const ThemeContext = createContext(null) const STORAGE_KEY = 'sundynix-theme' function systemTheme(): 'light' | 'dark' { return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light' } export function ThemeProvider({ children }: { children: ReactNode }) { const [theme, setThemeState] = useState( () => (localStorage.getItem(STORAGE_KEY) as Theme) ?? 'system', ) const [resolved, setResolved] = useState<'light' | 'dark'>(() => theme === 'system' ? systemTheme() : theme, ) useEffect(() => { const apply = () => { const r = theme === 'system' ? systemTheme() : theme setResolved(r) document.documentElement.classList.toggle('dark', r === 'dark') } apply() const mq = window.matchMedia('(prefers-color-scheme: dark)') mq.addEventListener('change', apply) return () => mq.removeEventListener('change', apply) }, [theme]) const setTheme = (t: Theme) => { localStorage.setItem(STORAGE_KEY, t) setThemeState(t) } return ( {children} ) } export function useTheme() { const ctx = useContext(ThemeContext) if (!ctx) throw new Error('useTheme must be used within ThemeProvider') return ctx }