site: add toggle support to docs navLink
This commit is contained in:
committed by
Johannes Kirschbauer
parent
b3dd1c4a46
commit
d1e59fedb1
@@ -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>
|
||||||
|
|||||||
@@ -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),
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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)),
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user