aboutsummaryrefslogtreecommitdiffhomepage
path: root/services/nuldoc/nuldoc-src/components/TableOfContents.ts
diff options
context:
space:
mode:
Diffstat (limited to 'services/nuldoc/nuldoc-src/components/TableOfContents.ts')
-rw-r--r--services/nuldoc/nuldoc-src/components/TableOfContents.ts34
1 files changed, 34 insertions, 0 deletions
diff --git a/services/nuldoc/nuldoc-src/components/TableOfContents.ts b/services/nuldoc/nuldoc-src/components/TableOfContents.ts
new file mode 100644
index 0000000..ac4205a
--- /dev/null
+++ b/services/nuldoc/nuldoc-src/components/TableOfContents.ts
@@ -0,0 +1,34 @@
+import { TocEntry, TocRoot } from "../djot/document.ts";
+import { elem, Element } from "../dom.ts";
+
+type Props = {
+ toc: TocRoot;
+};
+
+export default function TableOfContents({ toc }: Props): Element {
+ return elem(
+ "nav",
+ { class: "toc" },
+ elem("h2", {}, "目次"),
+ elem(
+ "ul",
+ {},
+ ...toc.entries.map((entry) => TocEntryComponent({ entry })),
+ ),
+ );
+}
+
+function TocEntryComponent({ entry }: { entry: TocEntry }): Element {
+ return elem(
+ "li",
+ {},
+ elem("a", { href: `#${entry.id}` }, entry.text),
+ entry.children.length > 0
+ ? elem(
+ "ul",
+ {},
+ ...entry.children.map((child) => TocEntryComponent({ entry: child })),
+ )
+ : null,
+ );
+}