first commit

This commit is contained in:
2026-05-22 18:44:46 -03:00
parent eaea57b7e9
commit 0fb351a3e2
40 changed files with 4746 additions and 71 deletions
+43
View File
@@ -0,0 +1,43 @@
import { useCallback, useEffect, useState } from 'react';
import {
applyTheme,
getStoredTheme,
readEffectiveDark,
resolveDark,
toggleStoredTheme,
} from '../lib/theme';
export function useTheme(): { isDark: boolean; toggle: () => void } {
const [isDark, setIsDark] = useState(() => readEffectiveDark());
useEffect(() => {
const mq = window.matchMedia('(prefers-color-scheme: dark)');
const sync = () => {
const stored = getStoredTheme();
const dark = resolveDark(stored, mq.matches);
applyTheme(dark);
setIsDark(dark);
};
sync();
const onPreferenceChange = () => {
if (getStoredTheme() !== null) return;
const dark = resolveDark(null, mq.matches);
applyTheme(dark);
setIsDark(dark);
};
mq.addEventListener('change', onPreferenceChange);
return () => mq.removeEventListener('change', onPreferenceChange);
}, []);
const toggle = useCallback(() => {
const nextDark = toggleStoredTheme();
setIsDark(nextDark);
}, []);
return { isDark, toggle };
}