'use client'; import { createContext, useContext, useEffect, useMemo, useState } from 'react'; type Theme = 'light' | 'dark' | 'system'; interface ThemeContextValue { theme: Theme; resolvedTheme: 'light' | 'dark'; setTheme: (theme: Theme) => void; } const ThemeContext = createContext(null); export function ThemeProvider({ children }: { children: React.ReactNode }) { const [theme, setThemeState] = useState('system'); const [resolvedTheme, setResolvedTheme] = useState<'light' | 'dark'>('light'); useEffect(() => { const stored = localStorage.getItem('docs-theme') as Theme | null; if (stored) setThemeState(stored); }, []); useEffect(() => { const root = document.documentElement; const media = window.matchMedia('(prefers-color-scheme: dark)'); const apply = () => { const next = theme === 'system' ? (media.matches ? 'dark' : 'light') : theme; setResolvedTheme(next); root.classList.toggle('dark', next === 'dark'); }; apply(); media.addEventListener('change', apply); return () => media.removeEventListener('change', apply); }, [theme]); const setTheme = (next: Theme) => { setThemeState(next); localStorage.setItem('docs-theme', next); }; const value = useMemo(() => ({ theme, resolvedTheme, setTheme }), [theme, resolvedTheme]); return {children}; } export function useTheme() { const ctx = useContext(ThemeContext); if (!ctx) throw new Error('useTheme must be used within ThemeProvider'); return ctx; }