22
33import { useEffect , useState } from 'react' ;
44import Link from 'next/link' ;
5- import { Menu , X , Activity } from 'lucide-react' ;
5+ import { Menu , X , Activity , Moon , Sun } from 'lucide-react' ;
66import { useGlowEffect } from '@/hooks/useGlowEffect' ;
77
88function GithubMark ( ) {
@@ -22,9 +22,25 @@ const NAV_LINKS = [
2222
2323export default function Navbar ( ) {
2424 const [ open , setOpen ] = useState ( false ) ;
25+
26+ const [ isDark , setIsDark ] = useState ( ( ) => {
27+ if ( typeof window === 'undefined' ) return true ;
28+
29+ return localStorage . getItem ( 'theme' ) !== 'light' ;
30+ } ) ;
31+
2532 const { shellRef, shellVars, handleMouseEnter, handleMouseMove, handleMouseLeave } =
2633 useGlowEffect ( ) ;
2734
35+ useEffect ( ( ) => {
36+ document . documentElement . classList . toggle ( 'dark' , isDark ) ;
37+ localStorage . setItem ( 'theme' , isDark ? 'dark' : 'light' ) ;
38+ } , [ isDark ] ) ;
39+
40+ const toggleTheme = ( ) => {
41+ setIsDark ( ( prev ) => ! prev ) ;
42+ } ;
43+
2844 useEffect ( ( ) => {
2945 const mediaQuery = window . matchMedia ( '(min-width: 768px)' ) ;
3046
@@ -102,6 +118,15 @@ export default function Navbar() {
102118 </ Link >
103119
104120 < div className = "hidden items-center gap-3 md:flex" >
121+ < button
122+ type = "button"
123+ onClick = { toggleTheme }
124+ className = "inline-flex h-10 w-10 items-center justify-center rounded-xl border border-white/15 bg-white/5 text-white transition hover:bg-white/10"
125+ aria-label = "Toggle theme"
126+ >
127+ { isDark ? < Sun size = { 18 } /> : < Moon size = { 18 } /> }
128+ </ button >
129+
105130 { NAV_LINKS . map ( ( link ) => (
106131 < a
107132 key = { link . href }
@@ -118,7 +143,7 @@ export default function Navbar() {
118143
119144 < button
120145 type = "button"
121- className = "inline-flex items-center justify-center rounded-xl border border-white/15 bg-white/5 p-2 text-white/90 transition hover:bg-white/10 md:hidden "
146+ className = "md:hidden inline-flex items-center justify-center rounded-xl border border-white/15 bg-white/5 p-2 text-white/90 transition hover:bg-white/10"
122147 aria-label = { open ? 'Close menu' : 'Open menu' }
123148 aria-expanded = { open }
124149 onClick = { ( ) => setOpen ( ( prev ) => ! prev ) }
0 commit comments