"use client"; import Link from "next/link"; import { Menu, X } from "lucide-react"; import { useEffect } from "react"; import { Accordion, AccordionContent, AccordionItem, AccordionTrigger, } from "@/components/ui/accordion"; import { programDays } from "@/content/program"; import { site } from "@/content/site"; import { TicketsMarqueeCta } from "@/components/layout/NavTicketsCta"; import { cn } from "@/lib/utils"; const navLinks = [ { href: "/speakers", label: "Lineup" }, { href: "/pitch-competition", label: "Pitch", badge: "Grants" }, { href: "/partners", label: "Partners" }, { href: "/exhibit", label: "Exhibit" }, ] as const; type TriggerProps = { open: boolean; onToggle: () => void; }; export function MobileNavTrigger({ open, onToggle }: TriggerProps) { return ( {open ? "Close" : "Menu"} {open ? : } ); } type DropdownProps = { open: boolean; onClose: () => void; }; export function MobileNavDropdown({ open, onClose }: DropdownProps) { useEffect(() => { if (!open) return; const onKey = (e: KeyboardEvent) => { if (e.key === "Escape") onClose(); }; document.body.style.overflow = "hidden"; window.addEventListener("keydown", onKey); return () => { document.body.style.overflow = ""; window.removeEventListener("keydown", onKey); }; }, [open, onClose]); if (!open) return null; return ( <> svg]:rotate-180", "[&>svg]:size-5 [&>svg]:text-white/50" )} > Program {programDays.map((day) => ( {day.date} {day.title} ))} View full program {navLinks.map((link) => ( {link.label} {"badge" in link && link.badge && ( {link.badge} )} ))} Apply to pitch > ); }