import { useEffect, useState } from 'react' type ThemeMode = 'light' | 'dark' | 'auto' function getInitialMode(): ThemeMode { if (typeof window === 'undefined') { return 'auto' } const stored = window.localStorage.getItem('theme') if (stored === 'light' || stored === 'dark' || stored === 'auto') { return stored } return 'auto' } function applyThemeMode(mode: ThemeMode) { const prefersDark = window.matchMedia('(prefers-color-scheme: dark)').matches const resolved = mode === 'auto' ? (prefersDark ? 'dark' : 'light') : mode document.documentElement.classList.remove('light', 'dark') document.documentElement.classList.add(resolved) if (mode === 'auto') { document.documentElement.removeAttribute('data-theme') } else { document.documentElement.setAttribute('data-theme', mode) } document.documentElement.style.colorScheme = resolved } export default function ThemeToggle() { const [mode, setMode] = useState('auto') useEffect(() => { const initialMode = getInitialMode() setMode(initialMode) applyThemeMode(initialMode) }, []) useEffect(() => { if (mode !== 'auto') { return } const media = window.matchMedia('(prefers-color-scheme: dark)') const onChange = () => applyThemeMode('auto') media.addEventListener('change', onChange) return () => { media.removeEventListener('change', onChange) } }, [mode]) function toggleMode() { const nextMode: ThemeMode = mode === 'light' ? 'dark' : mode === 'dark' ? 'auto' : 'light' setMode(nextMode) applyThemeMode(nextMode) window.localStorage.setItem('theme', nextMode) } const label = mode === 'auto' ? 'Theme mode: auto (system). Click to switch to light mode.' : `Theme mode: ${mode}. Click to switch mode.` return ( ) }