diff --git a/index.html b/index.html
index 6d2862a7..70b26a2d 100644
--- a/index.html
+++ b/index.html
@@ -16,6 +16,19 @@
}
})();
+
diff --git a/src/components/shared/DarkModeToggle.tsx b/src/components/shared/DarkModeToggle.tsx
index 7230338c..c7efd507 100644
--- a/src/components/shared/DarkModeToggle.tsx
+++ b/src/components/shared/DarkModeToggle.tsx
@@ -2,18 +2,51 @@ import { useState, useEffect } from 'react';
import { Moon, Sun } from 'lucide-react';
const DarkModeToggle = () => {
- const [isDarkMode, setIsDarkMode] = useState(false);
+ // Initialize from the class that was already set in index.html
+ const [isDarkMode, setIsDarkMode] = useState(() => {
+ return document.documentElement.classList.contains('dark');
+ });
const [isHovered, setIsHovered] = useState(false);
useEffect(() => {
+ // Sync with localStorage and system preference on mount
const theme = localStorage.getItem('theme');
+ const prefersDark = window.matchMedia('(prefers-color-scheme: dark)').matches;
+
if (theme === 'dark') {
document.documentElement.classList.add('dark');
setIsDarkMode(true);
- } else {
+ } else if (theme === 'light') {
document.documentElement.classList.remove('dark');
setIsDarkMode(false);
+ } else {
+ // If no preference saved, respect system preference
+ if (prefersDark) {
+ document.documentElement.classList.add('dark');
+ setIsDarkMode(true);
+ } else {
+ document.documentElement.classList.remove('dark');
+ setIsDarkMode(false);
+ }
}
+
+ // Listen for system theme changes (only if no manual preference is set)
+ const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)');
+ const handleThemeChange = (e: MediaQueryListEvent) => {
+ // Only update if user hasn't set a manual preference
+ if (!localStorage.getItem('theme')) {
+ if (e.matches) {
+ document.documentElement.classList.add('dark');
+ setIsDarkMode(true);
+ } else {
+ document.documentElement.classList.remove('dark');
+ setIsDarkMode(false);
+ }
+ }
+ };
+
+ mediaQuery.addEventListener('change', handleThemeChange);
+ return () => mediaQuery.removeEventListener('change', handleThemeChange);
}, []);
const toggleDarkMode = () => {
@@ -34,24 +67,25 @@ const DarkModeToggle = () => {
const translateX = isDarkMode ? trackWidth - thumbWidth - padding : padding;
return (
-