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

View File

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

View File

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