'use client'; import { createContext, useContext, useEffect, useMemo, useState, type ReactNode } from 'react'; export type Theme = 'dark' | 'light'; interface ThemeContextValue { theme: Theme; toggleTheme: () => void; setTheme: (theme: Theme) => void; } const STORAGE_KEY = 'mosaic-theme'; const ThemeContext = createContext(undefined); function getInitialTheme(): Theme { if (typeof document === 'undefined') { return 'dark'; } return document.documentElement.getAttribute('data-theme') === 'light' ? 'light' : 'dark'; } export function ThemeProvider({ children }: { children: ReactNode }): React.JSX.Element { const [theme, setThemeState] = useState(getInitialTheme); useEffect(() => { document.documentElement.setAttribute('data-theme', theme); window.localStorage.setItem(STORAGE_KEY, theme); }, [theme]); useEffect(() => { const storedTheme = window.localStorage.getItem(STORAGE_KEY); if (storedTheme === 'light' || storedTheme === 'dark') { setThemeState(storedTheme); return; } document.documentElement.setAttribute('data-theme', 'dark'); }, []); const value = useMemo( () => ({ theme, toggleTheme: () => setThemeState((current) => (current === 'dark' ? 'light' : 'dark')), setTheme: (nextTheme) => setThemeState(nextTheme), }), [theme], ); return {children}; } export function useTheme(): ThemeContextValue { const context = useContext(ThemeContext); if (!context) { throw new Error('useTheme must be used within ThemeProvider'); } return context; }