site: add toggle support to docs navLink

This commit is contained in:
Glen Huang
2025-10-07 21:43:37 +08:00
committed by Johannes Kirschbauer
parent b3dd1c4a46
commit d1e59fedb1
3 changed files with 29 additions and 15 deletions

View File

@@ -6,12 +6,14 @@
{#snippet navLinkSnippet(navLink: NormalizedNavLink)}
{#if "items" in navLink}
<li>
<span class="label group">{navLink.label}</span>
<details open={!navLink.collapsed}>
<summary><span class="label group">{navLink.label}</span></summary>
<ul>
{#each navLink.items as item}
{@render navLinkSnippet(item)}
{/each}
</ul>
</details>
</li>
{:else}
<li>
@@ -41,4 +43,9 @@
width: 300px;
flex: none;
}
summary {
list-style: none;
cursor: pointer;
}
</style>

View File

@@ -1,8 +1,8 @@
import { navLinks } from "./settings";
import { normalizeNavLinks } from "./utils";
export function load() {
export async function load() {
return {
navLinks: normalizeNavLinks(navLinks),
navLinks: await normalizeNavLinks(navLinks),
};
}

View File

@@ -4,7 +4,7 @@ export const articles = Object.fromEntries(
content: string;
frontmatter: Record<string, any>;
toc: string;
}>("./**/*.md", { eager: true }),
}>("./**/*.md"),
).map(([key, fn]) => [key.slice("./".length, -".md".length), fn]),
);
@@ -13,6 +13,7 @@ export type NavLink =
| {
label: string;
items: NavLink[];
collapsed?: boolean;
badge?: Badge;
}
| {
@@ -25,6 +26,7 @@ export type NormalizedNavLink =
| {
label: string;
items: NormalizedNavLink[];
collapsed: boolean;
badge?: NormalizedBadge;
}
| {
@@ -40,18 +42,22 @@ export type NormalizedBadge = {
variant: "caution" | "normal";
};
export function normalizeNavLinks(navLinks: NavLink[]): NormalizedNavLink[] {
return navLinks.map(normalizeNavLink);
export async function normalizeNavLinks(
navLinks: NavLink[],
): Promise<NormalizedNavLink[]> {
return await Promise.all(navLinks.map(normalizeNavLink));
}
export function normalizeNavLink(navLink: NavLink): NormalizedNavLink {
export async function normalizeNavLink(
navLink: NavLink,
): Promise<NormalizedNavLink> {
if (typeof navLink === "string") {
const article = articles[navLink];
if (!article) {
throw new Error(`Doc not found: ${navLink}`);
}
return {
label: article.frontmatter.title,
label: (await article()).frontmatter.title,
slug: `/docs/${navLink}`,
};
}
@@ -63,15 +69,16 @@ export function normalizeNavLink(navLink: NavLink): NormalizedNavLink {
}
return {
...navLink,
label: navLink.label ?? article.frontmatter.title,
label: navLink.label ?? (await article()).frontmatter.title,
badge: normalizeBadge(navLink.badge),
};
}
return {
...navLink,
collapsed: !!navLink.collapsed,
badge: normalizeBadge(navLink.badge),
items: navLink.items.map(normalizeNavLink),
items: await Promise.all(navLink.items.map(normalizeNavLink)),
};
}