"use client"; import { cn } from "@midday/ui/cn"; import { Icons } from "@midday/ui/icons"; import { AnimatePresence, motion } from "motion/react"; import Link from "next/link"; import { usePathname } from "next/navigation"; import { type RefObject, useEffect, useRef, useState } from "react"; import type { docsNavigation } from "@/lib/docs"; type DocsNavPanelProps = { navigation: typeof docsNavigation; isOpen: boolean; onClose: () => void; triggerRef?: RefObject; }; export function DocsNavPanel({ navigation, isOpen, onClose, triggerRef, }: DocsNavPanelProps) { const pathname = usePathname(); const panelRef = useRef(null); // Only expand the first section by default const [expandedSections, setExpandedSections] = useState( navigation.length > 0 ? [navigation[0].slug] : [], ); // Close on Escape key useEffect(() => { const handleKeyDown = (e: KeyboardEvent) => { if (e.key === "Escape" && isOpen) { onClose(); } }; document.addEventListener("keydown", handleKeyDown); return () => document.removeEventListener("keydown", handleKeyDown); }, [isOpen, onClose]); // Close on click outside (but not on trigger button) useEffect(() => { const handleClickOutside = (e: MouseEvent) => { if ( isOpen && panelRef.current && !panelRef.current.contains(e.target as Node) && !triggerRef?.current?.contains(e.target as Node) ) { onClose(); } }; document.addEventListener("mousedown", handleClickOutside); return () => document.removeEventListener("mousedown", handleClickOutside); }, [isOpen, onClose, triggerRef]); const toggleSection = (slug: string) => { setExpandedSections((prev) => prev.includes(slug) ? prev.filter((s) => s !== slug) : [...prev, slug], ); }; const currentSlug = pathname.split("/").pop(); return ( {isOpen && ( {/* Navigation */}
{navigation.map((section) => (
{expandedSections.includes(section.slug) && (
{section.docs.map((doc) => ( {doc.title} ))}
)}
))}
)}
); }