'use client'; import { createContext, useCallback, useContext, useEffect, useMemo, useState, type ReactNode } from 'react'; import type { ThemeMode } from '@nextcraft/types'; interface ThemeContextValue { mode: ThemeMode; toggle: () => void; setMode: (mode: ThemeMode) => void; } const ThemeContext = createContext(null); export function ThemeProvider({ children }: { children: ReactNode }) { const [mode, setModeState] = useState('light'); useEffect(() => { const stored = typeof window !== 'undefined' ? window.localStorage.getItem('nextcraft-theme') : null; const prefersDark = typeof window !== 'undefined' && window.matchMedia('(prefers-color-scheme: dark)').matches; const initial: ThemeMode = stored === 'dark' || stored === 'light' ? stored : prefersDark ? 'dark' : 'light'; setModeState(initial); }, []); useEffect(() => { const root = document.documentElement; if (mode === 'dark') root.classList.add('dark'); else root.classList.remove('dark'); window.localStorage.setItem('nextcraft-theme', mode); }, [mode]); const setMode = useCallback((m: ThemeMode) => setModeState(m), []); const toggle = useCallback(() => setModeState((m) => (m === 'dark' ? 'light' : 'dark')), []); const value = useMemo(() => ({ mode, toggle, setMode }), [mode, toggle, setMode]); return {children}; } export function useTheme(): ThemeContextValue { const ctx = useContext(ThemeContext); if (!ctx) throw new Error('useTheme must be used within ThemeProvider'); return ctx; }