site: rename nav link type

This commit is contained in:
Glen Huang
2025-10-08 12:35:48 +08:00
committed by Johannes Kirschbauer
parent bf46ea1ebb
commit 7f0e6d74e6
3 changed files with 21 additions and 25 deletions

View File

@@ -1,9 +1,9 @@
<script lang="ts"> <script lang="ts">
import type { NormalizedNavLink } from "./utils"; import type { NavLink } from "./utils";
let { children, data } = $props(); let { children, data } = $props();
</script> </script>
{#snippet navLinkSnippet(navLink: NormalizedNavLink)} {#snippet navLinkSnippet(navLink: NavLink)}
{#if "items" in navLink} {#if "items" in navLink}
<li> <li>
<details open={!navLink.collapsed}> <details open={!navLink.collapsed}>

View File

@@ -1,6 +1,6 @@
import type { NavLink } from "./utils"; import type { RawNavLink } from "./utils";
export const navLinks: NavLink[] = [ export const navLinks: RawNavLink[] = [
{ {
label: "Getting Started", label: "Getting Started",
items: ["getting-started/add-machines"], items: ["getting-started/add-machines"],

View File

@@ -8,61 +8,59 @@ export const articles = Object.fromEntries(
).map(([key, fn]) => [key.slice("./".length, -".md".length), fn]), ).map(([key, fn]) => [key.slice("./".length, -".md".length), fn]),
); );
export type NavLink = export type RawNavLink =
| string | string
| { | {
label: string; label: string;
items: NavLink[]; items: RawNavLink[];
collapsed?: boolean; collapsed?: boolean;
badge?: Badge; badge?: RawBadge;
} }
| { | {
label: string; label: string;
autogenerate: { directory: string }; autogenerate: { directory: string };
collapsed?: boolean; collapsed?: boolean;
badge?: Badge; badge?: RawBadge;
} }
| { | {
label?: string; label?: string;
slug: string; slug: string;
badge?: Badge; badge?: RawBadge;
} }
| { | {
label: string; label: string;
link: string; link: string;
badge?: Badge; badge?: RawBadge;
}; };
export type NormalizedNavLink = export type NavLink =
| { | {
label: string; label: string;
items: NormalizedNavLink[]; items: NavLink[];
collapsed: boolean; collapsed: boolean;
badge?: NormalizedBadge; badge?: Badge;
} }
| { | {
label: string; label: string;
link: string; link: string;
badge?: NormalizedBadge; badge?: Badge;
external: boolean; external: boolean;
}; };
export type Badge = string | NormalizedBadge; export type RawBadge = string | Badge;
export type NormalizedBadge = { export type Badge = {
text: string; text: string;
variant: "caution" | "normal"; variant: "caution" | "normal";
}; };
export async function normalizeNavLinks( export async function normalizeNavLinks(
navLinks: NavLink[], navLinks: RawNavLink[],
): Promise<NormalizedNavLink[]> { ): Promise<NavLink[]> {
return await Promise.all(navLinks.map(normalizeNavLink)); return await Promise.all(navLinks.map(normalizeNavLink));
} }
export async function normalizeNavLink( export async function normalizeNavLink(navLink: RawNavLink): Promise<NavLink> {
navLink: NavLink,
): Promise<NormalizedNavLink> {
if (typeof navLink === "string") { if (typeof navLink === "string") {
const article = articles[navLink]; const article = articles[navLink];
if (!article) { if (!article) {
@@ -122,7 +120,7 @@ export async function normalizeNavLink(
} }
if (titleMissing) throw new Error("Aborting due to errors."); if (titleMissing) throw new Error("Aborting due to errors.");
const items: NormalizedNavLink[] = await Promise.all( const items: NavLink[] = await Promise.all(
frontmatters frontmatters
.sort((a, b) => { .sort((a, b) => {
const orderA = a.frontmatter.order; const orderA = a.frontmatter.order;
@@ -162,9 +160,7 @@ export async function normalizeNavLink(
}; };
} }
export function normalizeBadge( export function normalizeBadge(badge: RawBadge | undefined): Badge | undefined {
badge: Badge | undefined,
): NormalizedBadge | undefined {
if (!badge) { if (!badge) {
return undefined; return undefined;
} }