diff --git a/src/components/ui/mode-toggle.tsx b/src/components/ui/mode-toggle.tsx index d640ba3..317d9cf 100644 --- a/src/components/ui/mode-toggle.tsx +++ b/src/components/ui/mode-toggle.tsx @@ -12,21 +12,18 @@ export function ModeToggle() {
- - - - - - setTheme('light')}>Light - setTheme('dark')}>Dark - - +
Toggle theme diff --git a/src/providers/theme.tsx b/src/providers/theme.tsx index e38d3ab..360f40c 100644 --- a/src/providers/theme.tsx +++ b/src/providers/theme.tsx @@ -20,8 +20,26 @@ const initialState: ThemeProviderState = { const ThemeProviderContext = createContext(initialState) export function ThemeProvider({ children, storageKey = 'app-theme', ...props }: ThemeProviderProps) { - const [theme, setTheme] = useState(() => (localStorage.getItem(storageKey) as Theme) || 'light') + const [theme, setTheme] = useState(() => { + const stored = localStorage.getItem(storageKey) as Theme + if (stored) return stored + + // Check system preference + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + return 'dark' + } + return 'light' + }) + // Listen for system theme changes + useEffect(() => { + const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)') + const handleChange = (e: MediaQueryListEvent) => { + setTheme(e.matches ? 'dark' : 'light') + } + mediaQuery.addEventListener('change', handleChange) + return () => mediaQuery.removeEventListener('change', handleChange) + }, []) useEffect(() => { const root = window.document.documentElement root.classList.remove('light', 'dark')