feat: extract ThemeWatcher component for system theme detection

This commit is contained in:
2026-04-15 17:50:43 -04:00
parent 2b79abb351
commit a3cb55814f
2 changed files with 16 additions and 2 deletions
+14 -2
View File
@@ -43,6 +43,20 @@ function getNextTheme(current) {
return systemIsDark ? 'dark' : 'auto';
}
export function ThemeWatcher() {
useEffect(() => {
const mq = window.matchMedia('(prefers-color-scheme: dark)');
function onSystemChange(e) {
if (localStorage.getItem('theme')) return;
document.documentElement.classList.toggle('dark', e.matches);
}
mq.addEventListener('change', onSystemChange);
return () => mq.removeEventListener('change', onSystemChange);
}, []);
return null;
}
export function useTheme() {
const [theme, setTheme] = useState('auto');
const [systemIsDark, setSystemIsDark] = useState(false);
@@ -54,8 +68,6 @@ export function useTheme() {
const mq = window.matchMedia('(prefers-color-scheme: dark)');
function onSystemChange(e) {
setSystemIsDark(e.matches);
if (localStorage.getItem('theme')) return;
document.documentElement.classList.toggle('dark', e.matches);
}
mq.addEventListener('change', onSystemChange);
return () => mq.removeEventListener('change', onSystemChange);
+2
View File
@@ -1,10 +1,12 @@
'use client';
import { ToastProvider, ToastContainer } from '@zen/core/toast';
import { ThemeWatcher } from '@zen/core/themes';
export function ZenProvider({ children }) {
return (
<ToastProvider>
<ThemeWatcher />
{children}
<ToastContainer />
</ToastProvider>