diff --git a/savebook/app/globals.css b/savebook/app/globals.css index 333fcbc..daeb521 100644 --- a/savebook/app/globals.css +++ b/savebook/app/globals.css @@ -9,3 +9,19 @@ input::-ms-reveal, input::-ms-clear { display: none; } + +/* Light mode default */ +body { + @apply bg-white text-gray-900; +} + +/* Dark mode */ +.dark body { + @apply bg-gray-900 text-gray-100; +} + +/* Hide default browser password reveal button */ +input::-ms-reveal, +input::-ms-clear { + display: none; +} diff --git a/savebook/components/common/Navbar.js b/savebook/components/common/Navbar.js index b836db6..93a5b2b 100644 --- a/savebook/components/common/Navbar.js +++ b/savebook/components/common/Navbar.js @@ -9,7 +9,29 @@ export default function Navbar() { const [isMenuOpen, setIsMenuOpen] = useState(false); const [isScrolled, setIsScrolled] = useState(false); const [isClient, setIsClient] = useState(false); + const [theme, setTheme] = useState("light"); const { isAuthenticated, user, logout, loading } = useAuth(); + //dark mode state + useEffect(() => { + if (typeof window !== 'undefined') { + const savedTheme = localStorage.getItem('theme') || 'light'; + setTheme(savedTheme); + } + }, []); + + useEffect(() => { + if (theme === "dark") { + document.documentElement.classList.add("dark"); + } else { + document.documentElement.classList.remove("dark"); + } + localStorage.setItem('theme', theme); + }, [theme]); + + const toggleTheme = () => { + setTheme(theme === "light" ? "dark" : "light"); + }; + // Handle client-side mounting useEffect(() => { @@ -77,6 +99,7 @@ export default function Navbar() { SaveBook + {/* Loading skeleton */}