-
1
-
2
-
3
-
4
-
5
-
6
-
7
-
8
-
9
-
10
-
11
-
12
-
13
-
14
-
15
-
16
-
17
-
18
-
19
-
20
-
21
-
22
-
23
-
24
-
25
-
26
-
27
-
28
-
29
-
30
-
31
-
32
-
33
-
34
-
35
-
36
-
37
-
38
-
39
-
40
-
41
-
42
/** @jsxImportSource ../jsx */
import { el, fragment, prop } from "../ef.js";
import { NavGroup, NavItem } from "../components/nav.js";
import { type Route } from "../route.js";
import type { OutlineItem } from "../plugins/markdown";
interface DocsProps {
html: string;
title: string;
outline: readonly OutlineItem[];
}
export function docs({ html, title: t, outline }: DocsProps): Route {
return {
title: t,
content() {
return <div>{el("div", [prop("innerHTML", html)])}</div>;
},
outline() {
return fragment(outline.map((item) => <OutlineEntry item={item} />));
},
};
}
interface OutlineEntryProps {
item: OutlineItem;
}
function OutlineEntry({ item }: OutlineEntryProps) {
if (item.children.length > 0) {
return (
<NavGroup label={item.content} href={`#${item.id}`}>
{item.children.map((child) => (
<OutlineEntry item={child} />
))}
</NavGroup>
);
}
return <NavItem href={`#${item.id}`}>{item.content}</NavItem>;
}