"use client"; import { useState, useEffect, useRef } from "react"; import { Menu, X } from "lucide-react"; import { cn } from "@/utils/cn"; import type { NavigationItem } from "./Navbar"; interface MobileMenuProps { items: NavigationItem[]; } export function MobileMenu({ items }: MobileMenuProps) { const [isOpen, setIsOpen] = useState(false); const menuRef = useRef(null); useEffect(() => { const handleClickOutside = (event: MouseEvent) => { if (menuRef.current && !menuRef.current.contains(event.target as Node)) { setIsOpen(false); } }; if (isOpen) { document.addEventListener("mousedown", handleClickOutside); document.body.style.overflow = "hidden"; } return () => { document.removeEventListener("mousedown", handleClickOutside); document.body.style.overflow = ""; }; }, [isOpen]); useEffect(() => { const handleEscape = (e: KeyboardEvent) => { if (e.key === "Escape") setIsOpen(false); }; if (isOpen) { document.addEventListener("keydown", handleEscape); return () => document.removeEventListener("keydown", handleEscape); } }, [isOpen]); return (
{items.map((item, index) => ( setIsOpen(false)} target={item.external ? "_blank" : undefined} rel={item.external ? "noopener noreferrer" : undefined} > {item.icon && {item.icon}} {item.label} ))}
{isOpen && (
setIsOpen(false)} aria-hidden="true" /> )}
); }