@@ -5,7 +5,7 @@ import Image from "next/image";
55import menuLinks from "@/data/menu" ;
66import SocialSharing from "./SocialSharing" ;
77import Search , { SearchItem } from "./Search" ;
8- import { Sheet , SheetContent , SheetTrigger } from "./ui/sheet" ;
8+ import { Sheet , SheetContent , SheetTitle , SheetTrigger } from "./ui/sheet" ;
99import {
1010 RiInstagramLine ,
1111 RiYoutubeFill ,
@@ -15,7 +15,7 @@ import {
1515 RiUser3Line ,
1616} from "react-icons/ri" ;
1717
18- import { useState , useEffect } from "react" ;
18+ import { useEffect , useRef , useState } from "react" ;
1919import { collection , getDocs , query , where } from "firebase/firestore" ;
2020import { db } from "@/lib/firebase" ;
2121import { SITE_NAME } from "@/lib/seo" ;
@@ -24,6 +24,8 @@ import NotificationBell from "./NotificationBell";
2424
2525export default function Header ( ) {
2626 const [ allArticles , setAllArticles ] = useState < SearchItem [ ] > ( [ ] ) ;
27+ const [ isMobileMenuOpen , setIsMobileMenuOpen ] = useState ( false ) ;
28+ const mobileNavRef = useRef < HTMLElement > ( null ) ;
2729 const { user, profile } = usePublicAuth ( ) ;
2830 const accountPhotoURL = profile ?. photoURL || user ?. photoURL || "" ;
2931 const accountLabel = user ? "Open your profile" : "Sign in or create an account" ;
@@ -83,7 +85,7 @@ export default function Header() {
8385 </ div >
8486
8587 { /* Mobile menu */ }
86- < Sheet >
88+ < Sheet open = { isMobileMenuOpen } onOpenChange = { setIsMobileMenuOpen } >
8789 < SheetTrigger
8890 aria-labelledby = "button-label"
8991 className = "relative z-10 md:hidden"
@@ -106,18 +108,34 @@ export default function Header() {
106108 </ SheetTrigger >
107109 < SheetContent
108110 side = "top"
109- className = "w-full pt-14"
110- aria-label = "Menu Toggle"
111+ className = "max-h-[100dvh] w-full overflow-y-auto border-b border-white/30 bg-[#121212] px-4 pb-8 pt-16 text-white shadow-[0_24px_64px_rgba(0,0,0,0.55)] sm:px-6"
112+ aria-describedby = { undefined }
113+ onOpenAutoFocus = { ( event ) => {
114+ event . preventDefault ( ) ;
115+ mobileNavRef . current ?. focus ( { preventScroll : true } ) ;
116+ } }
117+ onPointerDownOutside = { ( ) => setIsMobileMenuOpen ( false ) }
111118 >
119+ < SheetTitle className = "sr-only" > Navigation menu</ SheetTitle >
112120 < nav
113- className = "flex flex-col flex-1 justify-end gap-6"
114- aria-labelledby = "mobile-nav"
121+ ref = { mobileNavRef }
122+ tabIndex = { - 1 }
123+ className = "flex flex-1 flex-col justify-end gap-6 focus:outline-none"
124+ aria-label = "Primary navigation"
115125 >
116126 { /* Mobile Search */ }
117- < Search articles = { allArticles } className = "w-full" />
127+ < Search
128+ articles = { allArticles }
129+ className = "w-full"
130+ onSearchSelect = { ( ) => setIsMobileMenuOpen ( false ) }
131+ />
118132
119133 { menuLinks . map ( ( m , i ) => (
120- < Link key = { i } href = { m . href } >
134+ < Link
135+ key = { i }
136+ href = { m . href }
137+ onClick = { ( ) => setIsMobileMenuOpen ( false ) }
138+ >
121139 { m . label }
122140 </ Link >
123141 ) ) }
@@ -126,6 +144,7 @@ export default function Header() {
126144 < Link
127145 href = "/account"
128146 aria-label = { accountLabel }
147+ onClick = { ( ) => setIsMobileMenuOpen ( false ) }
129148 className = "inline-flex items-center justify-center text-2xl text-white transition-colors duration-300 hover:text-[#8a2ae3]"
130149 >
131150 { accountPhotoURL ? (
0 commit comments