From 0437496236b8861db1b000b1c4c0f4113d3bbd64 Mon Sep 17 00:00:00 2001 From: "solver-app[bot]" <152345546+solver-app[bot]@users.noreply.github.com> Date: Tue, 11 Mar 2025 04:11:21 +0000 Subject: [PATCH] Improve theme toggle with system preference detection --- src/components/ui/mode-toggle.tsx | 27 ++++++++++++--------------- src/providers/theme.tsx | 20 +++++++++++++++++++- 2 files changed, 31 insertions(+), 16 deletions(-) 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')