diff --git a/site/src/pages/docs/TableOfContents.tsx b/site/src/pages/docs/TableOfContents.tsx index 80150c3..e3e7835 100644 --- a/site/src/pages/docs/TableOfContents.tsx +++ b/site/src/pages/docs/TableOfContents.tsx @@ -1,52 +1,74 @@ +import React, { useCallback, useRef, useState } from 'react'; import { FaAngleDown } from 'react-icons/fa6'; import { HeadingItem, useHeadings } from '../../hooks/useHeadings'; import { cn } from '../../utils/cn'; export default function TableOfContents() { + const [open, setOpen] = useState(false); + const navRef = useRef(null); + + // Close TOC when clicking outside (mobile only) + React.useEffect(() => { + if (!open) return; + function handleClick(e: MouseEvent) { + if (navRef.current && !navRef.current.contains(e.target as Node)) { + setOpen(false); + } + } + document.addEventListener('mousedown', handleClick); + return () => document.removeEventListener('mousedown', handleClick); + }, [open]); + return ( -
+
); } -function HeadingList() { +function HeadingList({ tocOpen, setTocOpen }: { tocOpen?: boolean; setTocOpen?: (v: boolean) => void }) { const headings = useHeadings(); - return ( ); } -function NestedHeadingList({ items }: { items: HeadingItem[] }) { +function NestedHeadingList({ items, setTocOpen }: { items: HeadingItem[]; setTocOpen?: (v: boolean) => void }) { return (