Skip to content

Commit 4fb4a36

Browse files
ervwalterclaude
andcommitted
🐛 fix: resolve mobile menu navigation issues on touch devices
Fixed an issue where clicking on mobile menu items would close the menu instead of navigating. The problem was caused by the mousedown event handler closing the menu before the click event could trigger navigation. Changes: - Moved menuRef to only wrap the mobile menu div instead of entire nav - Added buttonRef to exclude menu button from outside click detection - Only attach click outside listener when menu is actually open - Improved click outside logic to properly detect clicks outside menu 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
1 parent d5d9a9f commit 4fb4a36

1 file changed

Lines changed: 15 additions & 7 deletions

File tree

apps/web/src/components/Header.tsx

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -10,22 +10,30 @@ export function Header() {
1010
const visibility = isInitializing ? "invisible" : "visible";
1111
const [mobileMenuOpen, setMobileMenuOpen] = useState(false);
1212
const menuRef = useRef<HTMLDivElement>(null);
13+
const buttonRef = useRef<HTMLButtonElement>(null);
1314

1415
// Close menu when clicking outside
1516
useEffect(() => {
1617
function handleClickOutside(event: MouseEvent) {
17-
if (menuRef.current && !menuRef.current.contains(event.target as Node)) {
18+
if (
19+
menuRef.current &&
20+
!menuRef.current.contains(event.target as Node) &&
21+
buttonRef.current &&
22+
!buttonRef.current.contains(event.target as Node)
23+
) {
1824
setMobileMenuOpen(false);
1925
}
2026
}
21-
document.addEventListener("mousedown", handleClickOutside);
22-
return () => document.removeEventListener("mousedown", handleClickOutside);
23-
}, []);
27+
if (mobileMenuOpen) {
28+
document.addEventListener("mousedown", handleClickOutside);
29+
return () => document.removeEventListener("mousedown", handleClickOutside);
30+
}
31+
}, [mobileMenuOpen]);
2432

2533
return (
2634
<header className="bg-brand-500 text-white">
2735
<Container>
28-
<nav className="flex items-stretch justify-between" ref={menuRef}>
36+
<nav className="flex items-stretch justify-between">
2937
<div className="flex items-center gap-2 py-3">
3038
<Link to="/" className="font-logo text-3xl font-bold leading-tight">
3139
TrendWeight
@@ -59,12 +67,12 @@ export function Header() {
5967
</button>
6068
)}
6169
</div>
62-
<button className="flex md:hidden items-center p-2 text-white" aria-label="Open menu" onClick={() => setMobileMenuOpen(!mobileMenuOpen)}>
70+
<button ref={buttonRef} className="flex md:hidden items-center p-2 text-white" aria-label="Open menu" onClick={() => setMobileMenuOpen(!mobileMenuOpen)}>
6371
{mobileMenuOpen ? <HiX size={24} /> : <HiMenu size={24} />}
6472
</button>
6573
</nav>
6674
{/* Mobile menu */}
67-
<div className={`md:hidden ${mobileMenuOpen ? "block" : "hidden"} bg-brand-400 -mx-4 px-4 py-4`}>
75+
<div ref={menuRef} className={`md:hidden ${mobileMenuOpen ? "block" : "hidden"} bg-brand-400 -mx-4 px-4 py-4`}>
6876
<div className="flex flex-col space-y-3">
6977
<MobileNavLink to="/" onClick={() => setMobileMenuOpen(false)} visibility={visibility}>
7078
Home

0 commit comments

Comments
 (0)