import { createContext, useContext, useState, useEffect, type ReactNode, } from 'react'; type ThemeMode = 'light' | 'dark' | 'system'; interface ThemeContextType { mode: ThemeMode; setMode: (mode: ThemeMode) => void; /** Tatsaechlich aktives Theme (resolved from system) */ resolved: 'light' | 'dark'; } const ThemeContext = createContext({ mode: 'system', setMode: () => {}, resolved: 'light', }); export function useTheme() { return useContext(ThemeContext); } function getSystemTheme(): 'light' | 'dark' { if ( typeof window !== 'undefined' && window.matchMedia('(prefers-color-scheme: dark)').matches ) { return 'dark'; } return 'light'; } export function ThemeProvider({ children }: { children: ReactNode }) { const [mode, setModeState] = useState(() => { const saved = localStorage.getItem('theme-mode'); if (saved === 'light' || saved === 'dark' || saved === 'system') { return saved; } return 'system'; }); const [systemTheme, setSystemTheme] = useState<'light' | 'dark'>( getSystemTheme, ); // Listen for system theme changes useEffect(() => { const mq = window.matchMedia('(prefers-color-scheme: dark)'); const handler = (e: MediaQueryListEvent) => { setSystemTheme(e.matches ? 'dark' : 'light'); }; mq.addEventListener('change', handler); return () => mq.removeEventListener('change', handler); }, []); const resolved = mode === 'system' ? systemTheme : mode; // Apply theme to document useEffect(() => { document.documentElement.setAttribute('data-theme', resolved); }, [resolved]); const setMode = (newMode: ThemeMode) => { setModeState(newMode); localStorage.setItem('theme-mode', newMode); }; return ( {children} ); }