import Link from "next/link"; import { useEffect, useRef, useState, type ReactNode } from "react"; import type { DocLink } from "@/lib/docs"; import { sectionFor } from "@/lib/navigation"; export function Brand() { return ( Endor /{" "} Tabularium 文档 ); } export function Navigation({ docs, current, onNavigate, }: { docs: DocLink[]; current?: string; onNavigate?: () => void; }) { const groups = [...new Set(docs.map((d) => sectionFor(d.slug).group))]; return ( ); } export function Shell({ docs, current, children, }: { docs: DocLink[]; current?: string; children: ReactNode; }) { const dialog = useRef(null); const input = useRef(null); const trigger = useRef(null); const [query, setQuery] = useState(""); const [selected, setSelected] = useState(0); const [menu, setMenu] = useState(false); const results = docs.filter((d) => `${d.title} ${d.searchText}` .toLocaleLowerCase() .includes(query.trim().toLocaleLowerCase()), ); function openSearch() { setQuery(""); setSelected(0); dialog.current?.showModal(); input.current?.focus(); } function closeSearch() { dialog.current?.close(); trigger.current?.focus(); } useEffect(() => { function keyboard(e: KeyboardEvent) { if ((e.metaKey || e.ctrlKey) && e.key.toLowerCase() === "k") { e.preventDefault(); dialog.current?.showModal(); input.current?.focus(); } } document.addEventListener("keydown", keyboard); return () => document.removeEventListener("keydown", keyboard); }, []); return ( <> 跳到正文
{menu && (
setMenu(false)} />
)} {children} { if (e.target === e.currentTarget) closeSearch(); }} onClose={() => trigger.current?.focus()} >
{ setQuery(e.target.value); setSelected(0); }} onKeyDown={(e) => { if (e.key === "ArrowDown") { e.preventDefault(); setSelected((i) => Math.max(0, Math.min(i + 1, results.length - 1)), ); } if (e.key === "ArrowUp") { e.preventDefault(); setSelected((i) => Math.max(i - 1, 0)); } if (e.key === "Enter") { e.preventDefault(); dialog.current ?.querySelector( `[data-result="${selected}"]`, ) ?.click(); } }} />

{query ? `${results.length} 篇匹配文档` : "浏览文档"}

{results.map((d, i) => ( {sectionFor(d.slug).group} {d.title} {sectionFor(d.slug).description} ))} {!results.length && (

没有找到相关文档。试试「节点」「SVG」或「pnpm」。

)}
↑ ↓ 选择 Enter 打开 · Esc 关闭
); }