@@ -36,6 +36,8 @@ function DashboardShell({ children }: { children: React.ReactNode }) {
3636 const [ userMenuOpen , setUserMenuOpen ] = useState ( false ) ;
3737 const [ mobileMenuOpen , setMobileMenuOpen ] = useState ( false ) ;
3838 const userMenuRef = useRef < HTMLDivElement > ( null ) ;
39+ const mobileMenuRef = useRef < HTMLDivElement > ( null ) ;
40+ const mobileBtnRef = useRef < HTMLButtonElement > ( null ) ;
3941
4042 /* ── Auth guard ── */
4143 useEffect ( ( ) => {
@@ -58,7 +60,14 @@ function DashboardShell({ children }: { children: React.ReactNode }) {
5860 if ( userMenuRef . current && ! userMenuRef . current . contains ( e . target as Node ) ) {
5961 setUserMenuOpen ( false ) ;
6062 }
61- setMobileMenuOpen ( false ) ;
63+ if (
64+ mobileMenuRef . current &&
65+ ! mobileMenuRef . current . contains ( e . target as Node ) &&
66+ mobileBtnRef . current &&
67+ ! mobileBtnRef . current . contains ( e . target as Node )
68+ ) {
69+ setMobileMenuOpen ( false ) ;
70+ }
6271 } ;
6372 document . addEventListener ( "click" , handler ) ;
6473 return ( ) => document . removeEventListener ( "click" , handler ) ;
@@ -343,6 +352,7 @@ function DashboardShell({ children }: { children: React.ReactNode }) {
343352
344353 { /* Mobile hamburger */ }
345354 < button
355+ ref = { mobileBtnRef }
346356 className = "dash-nav-mobile-btn"
347357 onClick = { e => { e . stopPropagation ( ) ; setMobileMenuOpen ( v => ! v ) ; } }
348358 style = { {
@@ -371,6 +381,7 @@ function DashboardShell({ children }: { children: React.ReactNode }) {
371381 { /* Mobile dropdown menu */ }
372382 { mobileMenuOpen && (
373383 < div
384+ ref = { mobileMenuRef }
374385 className = "dash-nav-mobile-menu"
375386 style = { {
376387 borderTop : "1px solid var(--border-subtle)" ,
0 commit comments