@takazudo/zudo-doc 5.11.0 → 5.12.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +23 -0
- package/bin/tags-audit-runner.ts +2 -2
- package/dist/format-date/index.d.ts +4 -0
- package/dist/format-date/index.js +19 -0
- package/dist/nav-indexing/note-tray-index-parts/card-list.d.ts +5 -0
- package/dist/nav-indexing/note-tray-index-parts/card-list.js +158 -0
- package/dist/nav-indexing/note-tray-index-parts/date-line.d.ts +14 -0
- package/dist/nav-indexing/note-tray-index-parts/date-line.js +27 -0
- package/dist/nav-indexing/note-tray-index-parts/index-list.d.ts +5 -0
- package/dist/nav-indexing/note-tray-index-parts/index-list.js +25 -0
- package/dist/nav-indexing/note-tray-index-parts/timeline.d.ts +5 -0
- package/dist/nav-indexing/note-tray-index-parts/timeline.js +40 -0
- package/dist/nav-indexing/note-tray-index.d.ts +1 -1
- package/dist/nav-indexing/note-tray-index.js +4 -103
- package/dist/safelist.css +1 -1
- package/dist/site-tree-nav-island/index.d.ts +1 -1
- package/dist/site-tree-nav-island/index.js +1 -8
- package/dist/tags-audit.d.ts +3 -2
- package/dist/tags-audit.js +21 -0
- package/eject/site-tree-nav-island/index.tsx +1 -6
- package/package.json +9 -11
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,29 @@ All notable changes to `@takazudo/zudo-doc` are documented in this file.
|
|
|
4
4
|
|
|
5
5
|
The format is based on Keep a Changelog, and release notes are generated from the changelog MDX pages.
|
|
6
6
|
|
|
7
|
+
## [5.12.1] - 2026-08-24
|
|
8
|
+
|
|
9
|
+
### Bug Fixes
|
|
10
|
+
|
|
11
|
+
- Removed the deprecated `string-similarity` runtime dependency from tag auditing while preserving its whitespace-insensitive near-duplicate scoring behavior. (`b5fa7a6c`)
|
|
12
|
+
|
|
13
|
+
### Other Changes
|
|
14
|
+
|
|
15
|
+
- Updated the zfb package family to 2.10.1 and raised the `@takazudo/zudo-doc-history-server` peer floor to the published 5.12.0 release. (`b5fa7a6c`)
|
|
16
|
+
|
|
17
|
+
## [5.12.0] - 2026-08-23
|
|
18
|
+
|
|
19
|
+
### Features
|
|
20
|
+
|
|
21
|
+
- Redesigned note-tray cards as responsive, fully linked subgrid layouts that preserve separate tag links and show localized date stamps on wide screens. (`3b0f9301`)
|
|
22
|
+
- Added accessible day-number markers to monthly note-tray timelines. (`2d1efb7d`)
|
|
23
|
+
|
|
24
|
+
### Bug Fixes
|
|
25
|
+
|
|
26
|
+
- Made numbered note-tray index rows fully clickable with consistent hover and keyboard-focus framing. (`6d729e0a`)
|
|
27
|
+
- Limited note-tray metadata in the site tree to created dates instead of also showing updated dates. (`98283c9c`)
|
|
28
|
+
- Anchored tagged card frames to their first subgrid row so the border stays attached to the card content. (`b33201e5`)
|
|
29
|
+
|
|
7
30
|
## [5.11.0] - 2026-08-23
|
|
8
31
|
|
|
9
32
|
### Features
|
package/bin/tags-audit-runner.ts
CHANGED
|
@@ -21,10 +21,10 @@ import { resolve } from "node:path";
|
|
|
21
21
|
|
|
22
22
|
import pc from "picocolors";
|
|
23
23
|
import pluralize from "pluralize";
|
|
24
|
-
import stringSimilarity from "string-similarity";
|
|
25
24
|
|
|
26
25
|
import {
|
|
27
26
|
audit,
|
|
27
|
+
compareTwoStrings,
|
|
28
28
|
formatTextReport,
|
|
29
29
|
hasHardIssues,
|
|
30
30
|
type AuditOptions,
|
|
@@ -71,7 +71,7 @@ async function main(): Promise<void> {
|
|
|
71
71
|
vocabularyActive: config.vocabularyActive,
|
|
72
72
|
nearDupHelpers: {
|
|
73
73
|
singular: pluralize.singular,
|
|
74
|
-
compareTwoStrings
|
|
74
|
+
compareTwoStrings,
|
|
75
75
|
},
|
|
76
76
|
};
|
|
77
77
|
|
|
@@ -6,6 +6,10 @@ export interface IsoDateParts {
|
|
|
6
6
|
export declare function parseIsoDate(iso: string): IsoDateParts | undefined;
|
|
7
7
|
/** Format an ISO date for display while retaining the established locale map. */
|
|
8
8
|
export declare function formatDate(iso: string, locale: string): string;
|
|
9
|
+
/** Format the localized month/day portion of an ISO date in UTC. */
|
|
10
|
+
export declare function formatMonthDayLabel(iso: string, locale: string): string;
|
|
11
|
+
/** Format the localized year portion of an ISO date in UTC. */
|
|
12
|
+
export declare function formatYear(iso: string, locale: string): string;
|
|
9
13
|
/** Format a year/month label with the year first in every locale. */
|
|
10
14
|
export declare function formatYearMonth(iso: string, locale: string): string;
|
|
11
15
|
/** Return the stable numeric month/day portion of a calendar-valid ISO date. */
|
|
@@ -39,6 +39,23 @@ function formatDate(iso, locale) {
|
|
|
39
39
|
timeZone: "UTC"
|
|
40
40
|
}).format(date);
|
|
41
41
|
}
|
|
42
|
+
function formatMonthDayLabel(iso, locale) {
|
|
43
|
+
const date = toUtcDate(iso);
|
|
44
|
+
if (!date) return iso;
|
|
45
|
+
return new Intl.DateTimeFormat(LOCALE_TO_BCP47[locale] ?? "en-US", {
|
|
46
|
+
month: "short",
|
|
47
|
+
day: "numeric",
|
|
48
|
+
timeZone: "UTC"
|
|
49
|
+
}).format(date);
|
|
50
|
+
}
|
|
51
|
+
function formatYear(iso, locale) {
|
|
52
|
+
const date = toUtcDate(iso);
|
|
53
|
+
if (!date) return iso;
|
|
54
|
+
return new Intl.DateTimeFormat(LOCALE_TO_BCP47[locale] ?? "en-US", {
|
|
55
|
+
year: "numeric",
|
|
56
|
+
timeZone: "UTC"
|
|
57
|
+
}).format(date);
|
|
58
|
+
}
|
|
42
59
|
function formatYearMonth(iso, locale) {
|
|
43
60
|
const date = toUtcDate(iso.length === 7 ? `${iso}-01` : iso);
|
|
44
61
|
if (!date) return iso;
|
|
@@ -59,6 +76,8 @@ function formatMonthDay(iso) {
|
|
|
59
76
|
export {
|
|
60
77
|
formatDate,
|
|
61
78
|
formatMonthDay,
|
|
79
|
+
formatMonthDayLabel,
|
|
80
|
+
formatYear,
|
|
62
81
|
formatYearMonth,
|
|
63
82
|
parseIsoDate
|
|
64
83
|
};
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
import { Fragment, jsx, jsxs } from "preact/jsx-runtime";
|
|
2
|
+
import { formatMonthDayLabel, formatYear } from "../../format-date/index.js";
|
|
3
|
+
import { CategoryLinkIcon } from "../../tree-nav-shared/index.js";
|
|
4
|
+
import { TagNav } from "../tag-nav.js";
|
|
5
|
+
import { DateLine } from "./date-line.js";
|
|
6
|
+
function CardBody({
|
|
7
|
+
item,
|
|
8
|
+
props,
|
|
9
|
+
linked,
|
|
10
|
+
hasStamp
|
|
11
|
+
}) {
|
|
12
|
+
const titleClass = linked ? "flex items-start gap-hsp-xs text-accent underline group-hover:text-accent-hover group-focus-visible:text-accent-hover" : "flex items-start gap-hsp-xs text-accent underline";
|
|
13
|
+
const descriptionClass = linked ? "mt-vsp-xs text-small text-muted group-hover:text-accent group-hover:underline group-focus-visible:text-accent group-focus-visible:underline" : "mt-vsp-xs text-small text-muted";
|
|
14
|
+
return /* @__PURE__ */ jsxs("div", { class: "min-w-0", children: [
|
|
15
|
+
/* @__PURE__ */ jsxs("div", { class: "flex flex-wrap items-baseline gap-x-hsp-md gap-y-vsp-3xs", children: [
|
|
16
|
+
/* @__PURE__ */ jsx("h2", { class: "text-title font-medium leading-tight", children: /* @__PURE__ */ jsxs("span", { class: titleClass, children: [
|
|
17
|
+
/* @__PURE__ */ jsx("span", { class: "flex h-[1lh] items-center", children: /* @__PURE__ */ jsx(CategoryLinkIcon, { className: "w-icon-sm" }) }),
|
|
18
|
+
item.label
|
|
19
|
+
] }) }),
|
|
20
|
+
props.showDate && /* @__PURE__ */ jsx("span", { class: hasStamp ? "sm:hidden" : void 0, children: /* @__PURE__ */ jsx(DateLine, { item, locale: props.locale, updatedLabel: props.updatedLabel }) })
|
|
21
|
+
] }),
|
|
22
|
+
item.description && /* @__PURE__ */ jsx("p", { class: descriptionClass, children: item.description })
|
|
23
|
+
] });
|
|
24
|
+
}
|
|
25
|
+
function DateStamp({
|
|
26
|
+
date,
|
|
27
|
+
updated,
|
|
28
|
+
locale,
|
|
29
|
+
updatedLabel,
|
|
30
|
+
positioned
|
|
31
|
+
}) {
|
|
32
|
+
return /* @__PURE__ */ jsxs(
|
|
33
|
+
"time",
|
|
34
|
+
{
|
|
35
|
+
datetime: date,
|
|
36
|
+
class: positioned ? "hidden sm:flex sm:col-start-2 sm:row-start-1 sm:row-span-2 w-[6.5rem] flex-col items-end self-stretch border-l border-muted pl-hsp-xl text-muted tabular-nums" : "hidden sm:flex w-[6.5rem] flex-col items-end self-stretch border-l border-muted pl-hsp-xl text-muted tabular-nums",
|
|
37
|
+
children: [
|
|
38
|
+
/* @__PURE__ */ jsx("span", { class: "block text-title leading-tight font-medium", children: formatMonthDayLabel(date, locale) }),
|
|
39
|
+
/* @__PURE__ */ jsx("span", { class: "block text-caption", children: formatYear(date, locale) }),
|
|
40
|
+
updated && /* @__PURE__ */ jsxs("span", { class: "mt-vsp-3xs block text-micro", children: [
|
|
41
|
+
updatedLabel,
|
|
42
|
+
" ",
|
|
43
|
+
formatMonthDayLabel(updated, locale)
|
|
44
|
+
] })
|
|
45
|
+
]
|
|
46
|
+
}
|
|
47
|
+
);
|
|
48
|
+
}
|
|
49
|
+
function CardList(props) {
|
|
50
|
+
return /* @__PURE__ */ jsx("div", { class: "grid grid-cols-1 gap-vsp-md", children: props.items.map((item) => /* @__PURE__ */ jsx(
|
|
51
|
+
"article",
|
|
52
|
+
{
|
|
53
|
+
class: props.tagLabels && item.tagLinks?.length ? "grid grid-rows-[auto_auto] gap-y-vsp-md sm:grid-cols-[minmax(0,1fr)_auto] sm:gap-x-hsp-xl" : void 0,
|
|
54
|
+
children: props.tagLabels && item.tagLinks?.length ? /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
55
|
+
item.href ? /* @__PURE__ */ jsxs(
|
|
56
|
+
"a",
|
|
57
|
+
{
|
|
58
|
+
href: item.href,
|
|
59
|
+
class: "group col-span-full row-start-1 row-span-2 grid grid-rows-subgrid sm:grid-cols-subgrid rounded border border-muted bg-surface px-hsp-xl py-vsp-lg hover:border-accent focus-visible:border-accent",
|
|
60
|
+
children: [
|
|
61
|
+
/* @__PURE__ */ jsx("div", { class: "col-start-1 row-start-1 min-w-0", children: /* @__PURE__ */ jsx(
|
|
62
|
+
CardBody,
|
|
63
|
+
{
|
|
64
|
+
item,
|
|
65
|
+
props,
|
|
66
|
+
linked: true,
|
|
67
|
+
hasStamp: Boolean(props.showDate && item.date)
|
|
68
|
+
}
|
|
69
|
+
) }),
|
|
70
|
+
props.showDate && item.date && /* @__PURE__ */ jsx(
|
|
71
|
+
DateStamp,
|
|
72
|
+
{
|
|
73
|
+
date: item.date,
|
|
74
|
+
updated: item.updated,
|
|
75
|
+
locale: props.locale,
|
|
76
|
+
updatedLabel: props.updatedLabel,
|
|
77
|
+
positioned: true
|
|
78
|
+
}
|
|
79
|
+
)
|
|
80
|
+
]
|
|
81
|
+
}
|
|
82
|
+
) : /* @__PURE__ */ jsxs("div", { class: "col-span-full row-start-1 row-span-2 grid grid-rows-subgrid sm:grid-cols-subgrid rounded border border-muted bg-surface px-hsp-xl py-vsp-lg", children: [
|
|
83
|
+
/* @__PURE__ */ jsx("div", { class: "col-start-1 row-start-1 min-w-0", children: /* @__PURE__ */ jsx(
|
|
84
|
+
CardBody,
|
|
85
|
+
{
|
|
86
|
+
item,
|
|
87
|
+
props,
|
|
88
|
+
linked: false,
|
|
89
|
+
hasStamp: Boolean(props.showDate && item.date)
|
|
90
|
+
}
|
|
91
|
+
) }),
|
|
92
|
+
props.showDate && item.date && /* @__PURE__ */ jsx(
|
|
93
|
+
DateStamp,
|
|
94
|
+
{
|
|
95
|
+
date: item.date,
|
|
96
|
+
updated: item.updated,
|
|
97
|
+
locale: props.locale,
|
|
98
|
+
updatedLabel: props.updatedLabel,
|
|
99
|
+
positioned: true
|
|
100
|
+
}
|
|
101
|
+
)
|
|
102
|
+
] }),
|
|
103
|
+
/* @__PURE__ */ jsx("div", { class: "col-start-1 row-start-2 relative pointer-events-none [&_a]:pointer-events-auto ml-[calc(var(--spacing-hsp-xl)+1px)] mr-[calc(var(--spacing-hsp-xl)+1px)] sm:mr-0 mb-vsp-lg", children: /* @__PURE__ */ jsx(TagNav, { variant: "page", tagLinks: item.tagLinks, labels: props.tagLabels }) })
|
|
104
|
+
] }) : item.href ? /* @__PURE__ */ jsxs(
|
|
105
|
+
"a",
|
|
106
|
+
{
|
|
107
|
+
href: item.href,
|
|
108
|
+
class: "group block rounded border border-muted bg-surface px-hsp-xl py-vsp-lg hover:border-accent focus-visible:border-accent sm:grid sm:grid-cols-[minmax(0,1fr)_auto] sm:gap-x-hsp-xl",
|
|
109
|
+
children: [
|
|
110
|
+
/* @__PURE__ */ jsx(
|
|
111
|
+
CardBody,
|
|
112
|
+
{
|
|
113
|
+
item,
|
|
114
|
+
props,
|
|
115
|
+
linked: true,
|
|
116
|
+
hasStamp: Boolean(props.showDate && item.date)
|
|
117
|
+
}
|
|
118
|
+
),
|
|
119
|
+
props.showDate && item.date && /* @__PURE__ */ jsx(
|
|
120
|
+
DateStamp,
|
|
121
|
+
{
|
|
122
|
+
date: item.date,
|
|
123
|
+
updated: item.updated,
|
|
124
|
+
locale: props.locale,
|
|
125
|
+
updatedLabel: props.updatedLabel,
|
|
126
|
+
positioned: false
|
|
127
|
+
}
|
|
128
|
+
)
|
|
129
|
+
]
|
|
130
|
+
}
|
|
131
|
+
) : /* @__PURE__ */ jsxs("div", { class: "block rounded border border-muted bg-surface px-hsp-xl py-vsp-lg sm:grid sm:grid-cols-[minmax(0,1fr)_auto] sm:gap-x-hsp-xl", children: [
|
|
132
|
+
/* @__PURE__ */ jsx(
|
|
133
|
+
CardBody,
|
|
134
|
+
{
|
|
135
|
+
item,
|
|
136
|
+
props,
|
|
137
|
+
linked: false,
|
|
138
|
+
hasStamp: Boolean(props.showDate && item.date)
|
|
139
|
+
}
|
|
140
|
+
),
|
|
141
|
+
props.showDate && item.date && /* @__PURE__ */ jsx(
|
|
142
|
+
DateStamp,
|
|
143
|
+
{
|
|
144
|
+
date: item.date,
|
|
145
|
+
updated: item.updated,
|
|
146
|
+
locale: props.locale,
|
|
147
|
+
updatedLabel: props.updatedLabel,
|
|
148
|
+
positioned: false
|
|
149
|
+
}
|
|
150
|
+
)
|
|
151
|
+
] })
|
|
152
|
+
},
|
|
153
|
+
item.slug
|
|
154
|
+
)) });
|
|
155
|
+
}
|
|
156
|
+
export {
|
|
157
|
+
CardList
|
|
158
|
+
};
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/** @jsxRuntime automatic */
|
|
2
|
+
/** @jsxImportSource preact */
|
|
3
|
+
import type { JSX } from "preact";
|
|
4
|
+
import type { NoteTrayIndexItem } from "../note-tray-index.js";
|
|
5
|
+
import type { TagNavLabels } from "../types.js";
|
|
6
|
+
export declare function DateLine({ item, locale, updatedLabel, }: {
|
|
7
|
+
item: NoteTrayIndexItem;
|
|
8
|
+
locale: string;
|
|
9
|
+
updatedLabel: string;
|
|
10
|
+
}): JSX.Element | null;
|
|
11
|
+
export declare function ItemTags({ item, labels }: {
|
|
12
|
+
item: NoteTrayIndexItem;
|
|
13
|
+
labels?: TagNavLabels;
|
|
14
|
+
}): JSX.Element | null;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { jsx, jsxs } from "preact/jsx-runtime";
|
|
2
|
+
import { formatDate } from "../../note-tray-model/index.js";
|
|
3
|
+
import { TagNav } from "../tag-nav.js";
|
|
4
|
+
function DateLine({
|
|
5
|
+
item,
|
|
6
|
+
locale,
|
|
7
|
+
updatedLabel
|
|
8
|
+
}) {
|
|
9
|
+
if (!item.date && !item.updated) return null;
|
|
10
|
+
return /* @__PURE__ */ jsxs("span", { class: "tabular-nums text-caption text-muted", children: [
|
|
11
|
+
item.date && /* @__PURE__ */ jsx("time", { datetime: item.date, children: formatDate(item.date, locale) }),
|
|
12
|
+
item.date && item.updated && /* @__PURE__ */ jsx("span", { "aria-hidden": "true", children: " \xB7 " }),
|
|
13
|
+
item.updated && /* @__PURE__ */ jsxs("span", { children: [
|
|
14
|
+
updatedLabel,
|
|
15
|
+
" ",
|
|
16
|
+
/* @__PURE__ */ jsx("time", { datetime: item.updated, children: formatDate(item.updated, locale) })
|
|
17
|
+
] })
|
|
18
|
+
] });
|
|
19
|
+
}
|
|
20
|
+
function ItemTags({ item, labels }) {
|
|
21
|
+
if (!labels || !item.tagLinks?.length) return null;
|
|
22
|
+
return /* @__PURE__ */ jsx(TagNav, { variant: "page", tagLinks: item.tagLinks, labels });
|
|
23
|
+
}
|
|
24
|
+
export {
|
|
25
|
+
DateLine,
|
|
26
|
+
ItemTags
|
|
27
|
+
};
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { Fragment, jsx, jsxs } from "preact/jsx-runtime";
|
|
2
|
+
import { rankWidth } from "../../note-tray-model/index.js";
|
|
3
|
+
import { DateLine } from "./date-line.js";
|
|
4
|
+
function IndexList(props) {
|
|
5
|
+
const width = rankWidth(props.items);
|
|
6
|
+
return /* @__PURE__ */ jsx("ol", { class: "[&_li]:mb-0", children: props.items.map((item) => {
|
|
7
|
+
const rowClass = item.href ? "relative -mt-px first:mt-0 border-y border-muted hover:z-local-1 hover:border-accent focus-within:z-local-1 focus-within:border-accent" : "relative -mt-px first:mt-0 border-y border-muted";
|
|
8
|
+
const rankClass = item.href ? "tabular-nums text-heading leading-none text-muted group-hover:text-fg group-focus-visible:text-fg" : "tabular-nums text-heading leading-none text-muted";
|
|
9
|
+
const labelClass = item.href ? "font-medium text-fg underline decoration-muted group-hover:text-accent group-hover:decoration-accent group-focus-visible:text-accent group-focus-visible:decoration-accent" : "font-medium text-fg";
|
|
10
|
+
const detailClass = item.href ? "mt-vsp-2xs block text-small text-muted group-hover:text-accent group-hover:underline group-focus-visible:text-accent group-focus-visible:underline" : "mt-vsp-2xs block text-small text-muted";
|
|
11
|
+
const dateClass = item.href ? "mt-vsp-2xs block text-caption text-muted group-hover:text-accent group-hover:underline group-focus-visible:text-accent group-focus-visible:underline" : "mt-vsp-2xs block text-caption text-muted";
|
|
12
|
+
const rowContent = /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
13
|
+
/* @__PURE__ */ jsx("span", { class: rankClass, style: { width: `${width}ch` }, children: item.rank === void 0 ? "" : String(item.rank).padStart(width, "0") }),
|
|
14
|
+
/* @__PURE__ */ jsxs("span", { class: "min-w-0", children: [
|
|
15
|
+
/* @__PURE__ */ jsx("span", { class: labelClass, children: item.label }),
|
|
16
|
+
item.description && /* @__PURE__ */ jsx("span", { class: detailClass, children: item.description }),
|
|
17
|
+
props.showDate && /* @__PURE__ */ jsx("span", { class: dateClass, children: /* @__PURE__ */ jsx(DateLine, { item, locale: props.locale, updatedLabel: props.updatedLabel }) })
|
|
18
|
+
] })
|
|
19
|
+
] });
|
|
20
|
+
return /* @__PURE__ */ jsx("li", { class: rowClass, children: item.href ? /* @__PURE__ */ jsx("a", { href: item.href, class: "group grid grid-cols-[auto_1fr] gap-x-hsp-lg py-vsp-md", children: rowContent }) : /* @__PURE__ */ jsx("span", { class: "grid grid-cols-[auto_1fr] gap-x-hsp-lg py-vsp-md", children: rowContent }) }, item.slug);
|
|
21
|
+
}) });
|
|
22
|
+
}
|
|
23
|
+
export {
|
|
24
|
+
IndexList
|
|
25
|
+
};
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { jsx, jsxs } from "preact/jsx-runtime";
|
|
2
|
+
import {
|
|
3
|
+
formatDate,
|
|
4
|
+
formatYearMonthLabel,
|
|
5
|
+
groupItems,
|
|
6
|
+
parseIsoDate
|
|
7
|
+
} from "../../note-tray-model/index.js";
|
|
8
|
+
import { ItemTags } from "./date-line.js";
|
|
9
|
+
function Timeline(props) {
|
|
10
|
+
const groups = groupItems(props.items, "month", props.order ?? "asc");
|
|
11
|
+
return /* @__PURE__ */ jsx("div", { class: "space-y-vsp-lg", children: groups.map((group) => /* @__PURE__ */ jsxs("section", { children: [
|
|
12
|
+
/* @__PURE__ */ jsx("h2", { class: "mb-vsp-sm text-small font-medium text-fg", children: formatYearMonthLabel(group.key, props.locale) }),
|
|
13
|
+
/* @__PURE__ */ jsx("ol", { class: "ml-hsp-md border-l border-muted [&_li]:mb-0", children: group.items.map((item) => /* @__PURE__ */ jsxs("li", { class: "relative grid gap-vsp-2xs pl-hsp-xl pb-vsp-lg last:pb-0", children: [
|
|
14
|
+
item.href ? /* @__PURE__ */ jsx(
|
|
15
|
+
"a",
|
|
16
|
+
{
|
|
17
|
+
class: "peer font-medium text-fg underline decoration-muted hover:text-accent hover:decoration-accent focus-visible:text-accent focus-visible:decoration-accent",
|
|
18
|
+
href: item.href,
|
|
19
|
+
children: item.label
|
|
20
|
+
}
|
|
21
|
+
) : /* @__PURE__ */ jsx("span", { class: "peer font-medium text-fg", children: item.label }),
|
|
22
|
+
/* @__PURE__ */ jsxs(
|
|
23
|
+
"time",
|
|
24
|
+
{
|
|
25
|
+
datetime: item.date,
|
|
26
|
+
class: "absolute top-hsp-2xs -left-[calc(var(--spacing-icon-lg)/2)] grid size-icon-lg place-items-center rounded-full border border-muted bg-bg text-caption leading-none tabular-nums text-muted peer-hover:border-accent peer-hover:text-accent peer-focus-visible:border-accent peer-focus-visible:text-accent",
|
|
27
|
+
children: [
|
|
28
|
+
/* @__PURE__ */ jsx("span", { "aria-hidden": "true", children: item.date ? parseIsoDate(item.date)?.day ?? "" : "" }),
|
|
29
|
+
/* @__PURE__ */ jsx("span", { class: "sr-only", children: item.date ? formatDate(item.date, props.locale) : "" })
|
|
30
|
+
]
|
|
31
|
+
}
|
|
32
|
+
),
|
|
33
|
+
item.description && /* @__PURE__ */ jsx("p", { class: "text-small text-muted", children: item.description }),
|
|
34
|
+
/* @__PURE__ */ jsx(ItemTags, { item, labels: props.tagLabels })
|
|
35
|
+
] }, item.slug)) })
|
|
36
|
+
] }, group.key)) });
|
|
37
|
+
}
|
|
38
|
+
export {
|
|
39
|
+
Timeline
|
|
40
|
+
};
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
/** @jsxRuntime automatic */
|
|
2
2
|
/** @jsxImportSource preact */
|
|
3
3
|
import type { JSX } from "preact";
|
|
4
|
-
import { type NoteTrayOrder } from "../note-tray-model/index.js";
|
|
5
4
|
import type { TagLink, TagNavLabels } from "./types.js";
|
|
5
|
+
import type { NoteTrayOrder } from "../note-tray-model/index.js";
|
|
6
6
|
export type NoteTrayIndexStyle = "index" | "cards" | "timeline";
|
|
7
7
|
export interface NoteTrayIndexItem {
|
|
8
8
|
slug: string;
|
|
@@ -1,106 +1,7 @@
|
|
|
1
|
-
import { jsx
|
|
2
|
-
import {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
groupItems,
|
|
6
|
-
rankWidth
|
|
7
|
-
} from "../note-tray-model/index.js";
|
|
8
|
-
import { TagNav } from "./tag-nav.js";
|
|
9
|
-
function DateLine({
|
|
10
|
-
item,
|
|
11
|
-
locale,
|
|
12
|
-
updatedLabel
|
|
13
|
-
}) {
|
|
14
|
-
if (!item.date && !item.updated) return null;
|
|
15
|
-
return /* @__PURE__ */ jsxs("span", { class: "tabular-nums text-caption text-muted", children: [
|
|
16
|
-
item.date && /* @__PURE__ */ jsx("time", { datetime: item.date, children: formatDate(item.date, locale) }),
|
|
17
|
-
item.date && item.updated && /* @__PURE__ */ jsx("span", { "aria-hidden": "true", children: " \xB7 " }),
|
|
18
|
-
item.updated && /* @__PURE__ */ jsxs("span", { children: [
|
|
19
|
-
updatedLabel,
|
|
20
|
-
" ",
|
|
21
|
-
/* @__PURE__ */ jsx("time", { datetime: item.updated, children: formatDate(item.updated, locale) })
|
|
22
|
-
] })
|
|
23
|
-
] });
|
|
24
|
-
}
|
|
25
|
-
function ItemTags({ item, labels }) {
|
|
26
|
-
if (!labels || !item.tagLinks?.length) return null;
|
|
27
|
-
return /* @__PURE__ */ jsx(TagNav, { variant: "page", tagLinks: item.tagLinks, labels });
|
|
28
|
-
}
|
|
29
|
-
function IndexList(props) {
|
|
30
|
-
const width = rankWidth(props.items);
|
|
31
|
-
return /* @__PURE__ */ jsx("ol", { class: "border-t border-muted", children: props.items.map((item) => /* @__PURE__ */ jsxs(
|
|
32
|
-
"li",
|
|
33
|
-
{
|
|
34
|
-
class: "grid grid-cols-[auto_1fr] gap-x-hsp-lg border-b border-muted py-vsp-md",
|
|
35
|
-
children: [
|
|
36
|
-
/* @__PURE__ */ jsx(
|
|
37
|
-
"span",
|
|
38
|
-
{
|
|
39
|
-
class: "tabular-nums text-heading leading-none text-muted",
|
|
40
|
-
style: { width: `${width}ch` },
|
|
41
|
-
children: item.rank === void 0 ? "" : String(item.rank).padStart(width, "0")
|
|
42
|
-
}
|
|
43
|
-
),
|
|
44
|
-
/* @__PURE__ */ jsxs("div", { class: "min-w-0", children: [
|
|
45
|
-
item.href ? /* @__PURE__ */ jsx(
|
|
46
|
-
"a",
|
|
47
|
-
{
|
|
48
|
-
class: "font-medium text-fg hover:text-accent hover:underline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-accent",
|
|
49
|
-
href: item.href,
|
|
50
|
-
children: item.label
|
|
51
|
-
}
|
|
52
|
-
) : /* @__PURE__ */ jsx("span", { class: "font-medium text-fg", children: item.label }),
|
|
53
|
-
item.description && /* @__PURE__ */ jsx("p", { class: "mt-vsp-2xs text-small text-muted", children: item.description }),
|
|
54
|
-
props.showDate && /* @__PURE__ */ jsx("span", { class: "mt-vsp-2xs block", children: /* @__PURE__ */ jsx(DateLine, { item, locale: props.locale, updatedLabel: props.updatedLabel }) })
|
|
55
|
-
] })
|
|
56
|
-
]
|
|
57
|
-
},
|
|
58
|
-
item.slug
|
|
59
|
-
)) });
|
|
60
|
-
}
|
|
61
|
-
function CardList(props) {
|
|
62
|
-
return /* @__PURE__ */ jsx("div", { class: "grid grid-cols-1 gap-vsp-md", children: props.items.map((item) => /* @__PURE__ */ jsxs("article", { class: "rounded border border-muted bg-surface px-hsp-xl py-vsp-lg", children: [
|
|
63
|
-
props.showDate && /* @__PURE__ */ jsx("div", { class: "mb-vsp-xs", children: /* @__PURE__ */ jsx(DateLine, { item, locale: props.locale, updatedLabel: props.updatedLabel }) }),
|
|
64
|
-
/* @__PURE__ */ jsx("h2", { class: "text-title font-medium", children: item.href ? /* @__PURE__ */ jsx(
|
|
65
|
-
"a",
|
|
66
|
-
{
|
|
67
|
-
class: "text-fg hover:text-accent hover:underline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-accent",
|
|
68
|
-
href: item.href,
|
|
69
|
-
children: item.label
|
|
70
|
-
}
|
|
71
|
-
) : item.label }),
|
|
72
|
-
item.description && /* @__PURE__ */ jsx("p", { class: "mt-vsp-xs text-muted", children: item.description }),
|
|
73
|
-
item.tagLinks?.length ? /* @__PURE__ */ jsx("div", { class: "mt-vsp-md", children: /* @__PURE__ */ jsx(ItemTags, { item, labels: props.tagLabels }) }) : null
|
|
74
|
-
] }, item.slug)) });
|
|
75
|
-
}
|
|
76
|
-
function Timeline(props) {
|
|
77
|
-
const groups = groupItems(props.items, "month", props.order ?? "asc");
|
|
78
|
-
return /* @__PURE__ */ jsx("div", { class: "space-y-vsp-lg", children: groups.map((group) => /* @__PURE__ */ jsxs("section", { children: [
|
|
79
|
-
/* @__PURE__ */ jsx("h2", { class: "mb-vsp-sm text-small font-medium text-fg", children: formatYearMonthLabel(group.key, props.locale) }),
|
|
80
|
-
/* @__PURE__ */ jsx("ol", { class: "ml-hsp-xs border-l border-muted", children: group.items.map((item) => /* @__PURE__ */ jsxs("li", { class: "relative grid gap-vsp-2xs pb-vsp-lg pl-hsp-lg last:pb-0", children: [
|
|
81
|
-
/* @__PURE__ */ jsx(
|
|
82
|
-
"span",
|
|
83
|
-
{
|
|
84
|
-
class: "absolute -left-hsp-xs top-vsp-2xs size-icon-xs rounded-full border border-bg bg-muted",
|
|
85
|
-
"aria-hidden": "true"
|
|
86
|
-
}
|
|
87
|
-
),
|
|
88
|
-
/* @__PURE__ */ jsxs("div", { class: "flex flex-wrap items-baseline gap-x-hsp-sm gap-y-vsp-2xs", children: [
|
|
89
|
-
/* @__PURE__ */ jsx(DateLine, { item, locale: props.locale, updatedLabel: props.updatedLabel }),
|
|
90
|
-
item.href ? /* @__PURE__ */ jsx(
|
|
91
|
-
"a",
|
|
92
|
-
{
|
|
93
|
-
class: "font-medium text-fg hover:text-accent hover:underline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-accent",
|
|
94
|
-
href: item.href,
|
|
95
|
-
children: item.label
|
|
96
|
-
}
|
|
97
|
-
) : /* @__PURE__ */ jsx("span", { class: "font-medium text-fg", children: item.label })
|
|
98
|
-
] }),
|
|
99
|
-
item.description && /* @__PURE__ */ jsx("p", { class: "text-small text-muted", children: item.description }),
|
|
100
|
-
/* @__PURE__ */ jsx(ItemTags, { item, labels: props.tagLabels })
|
|
101
|
-
] }, item.slug)) })
|
|
102
|
-
] }, group.key)) });
|
|
103
|
-
}
|
|
1
|
+
import { jsx } from "preact/jsx-runtime";
|
|
2
|
+
import { CardList } from "./note-tray-index-parts/card-list.js";
|
|
3
|
+
import { IndexList } from "./note-tray-index-parts/index-list.js";
|
|
4
|
+
import { Timeline } from "./note-tray-index-parts/timeline.js";
|
|
104
5
|
function NoteTrayIndex(props) {
|
|
105
6
|
if (props.items.length === 0) return null;
|
|
106
7
|
if (props.style === "timeline" && !props.dated) {
|
package/dist/safelist.css
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
/* generated by gen-safelist.mjs — do not edit by hand */
|
|
2
|
-
@source inline("-domtweaker-enabled -elpath-enabled -left-hsp-xs -link -mb-px -ml-hsp-sm -noscript -open -state -translate-x-full 2xl:w-[24px] [&::-webkit-details-marker]:hidden [&_a]:text-accent [&_a]:underline [&_nav]:mb-0 [data-admonition] [data-kbd-shortcut] [data-switcher-launcher] [doc-history-meta] [doc-history] [doc-layout] [llms-txt] [zudo-doc] a a2 abbr about above absent absolute accent accent- accent:accent- access across activated active actual actually added admonition admonition- admonition-body admonition-title admonition/callout after after-breadcrumb after-content after-navigate after-sidebar after-title against agent agents ai-chat ai-chat-md ai-chat-trigger alert align-top all allow allow-same-origin allow-scripts allowed alone already already-executed already-multiline already-picked also always an anchor and and/or animate-pulse animate-spin announce ansehen antialiased any anywhere anzeigen app appear application/json application/xml applied applies apply applying approach approval are area arg argument aria-atomic aria-busy aria-controls aria-current aria-disabled aria-expanded aria-haspopup aria-hidden aria-label aria-labelledby aria-live aria-orientation aria-pressed aria-selected aria-valuemax aria-valuemin aria-valuenow arm arms arrows article as asc aside aspect-[1200/630] aspect-square asset asset- assets assistant async at at-rule attach attribute attributes auf authored auto auto-logo-mask autogenerated availability available avoid await away b back backdrop:bg-bg/30 backdrop:bg-bg/80 backdrop:bg-overlay/60 backdrop:z-modal-backdrop background background-color backtick backticks baked banner bare base base- base64 base:base- based bash batch be bearbeiten because becomes been before below best best-effort between bg bg-[#fff] bg-accent bg-bg bg-chat-assistant-bg bg-chat-user-bg bg-code-bg bg-fg bg-info/10 bg-info/5 bg-muted bg-overlay/30 bg-surface bg-surface/50 bg-transparent bg-warning/10 bg-warning/5 bi bigint bin binaries bind binding blank blanks block blockquote blocks blur body body-end-components body-end-scripts bold boolean bootstrap border border-accent border-b border-b-2 border-b-[5px] border-bg border-bg/30 border-collapse border-danger border-dashed border-fg border-image border-info/30 border-l border-l-0 border-l-[3px] border-left-width border-muted border-none border-r border-r-0 border-radius border-solid border-t border-t-[2px] border-t-[3px] border-transparent border-warning/30 border-width border-y both bottom-hsp-lg bottom-vsp-xl boundaries box box-border br brackets brand breadcrumb:end breadcrumb:start break-words brief brown browser browser-tab browsers browses btn budget bug build builder built built-in bundler but button buttons by bypassed byte-identical bytes c cache cached calendar-valid call callable called caller calls can cancellation candidate cannot canonical canvas caption captured captures card card-grid cards carry cases cat-nav- catch categories category caught caution center center/contain ch chains change changed changelog changelogs changes check child children choose chrome chrome-font ci circle cite class class-less class-mode claude claude-agents claude-commands claude-md claude-resources claude-skills cleaned cleanly clear clearing click client client-router client-side clip clobber clobbering close closed closes closing closure code code-block-sr-announce code-group code-group-panel codex codex-agents codex-agents-md codex-config codex-hooks codex-resources codex-rules codex-skills col col-resize colgroup collapses collapsible collision color color-scheme color-scheme-changed color-scheme-provider color-tweak colorization colors column comma command commands commas comment commercial commercial-font-denylist commit compare component component:github-link component:language-switcher component:search component:theme-toggle component:version-switcher composes composition compute computed concrete config configuration configurations configure configured conflicts confuse connect const construction consumer consumes contain container containers containing contains content content-admonition content-layer content-link content-type content-wrapper:end content-wrapper:start contents context contract control controller controls converts cookie-blocking copied copy core corners correct correctly corrupt could count covered covers crashes created cross-component crumb- cs css css-presence ctx cur current current-path/index.ts current-route currently cursor cursor-not-allowed cursor-pointer custom cycle d danger dark data data-active data-admonition data-auto-logo data-base data-close-search data-current-locale data-default-locale data-doc-date data-doc-description data-doc-metainfo data-doc-pager data-doc-unavailable-versions data-find-active data-find-match data-footer data-group-id data-header data-header-logo data-header-nav data-header-right data-kbd-shortcut data-language-switcher data-loading-index data-mermaid-enlarge-ready data-mermaid-rendered data-mermaid-src data-nav-active data-nav-item data-nav-item-dropdown data-nav-more data-nav-more-menu data-nav-more-toggle data-no-results data-note-tray-group data-note-tray-row data-open-search data-pan-active data-processed data-props data-result-count-template data-search-count data-search-count-narrow data-search-dialog data-search-input data-search-placeholder data-search-results data-search-unavailable data-sidebar-hidden data-sidebar-resizer data-site-nav data-switcher-card data-switcher-launcher data-tab-btn data-tab-default data-tab-label data-tab-value data-tabs data-taglist-group data-testid data-theme data-theme-pack data-theme-pack-switcher data-theme/style data-toc-hidden data-trailing-slash data-unavailable-label data-variant data-version-banner data-version-latest data-version-menu data-version-rewire data-version-slug data-version-switcher data-version-toggle data-version-trigger-label data-zd-mobile-sidebar data-zd-mobile-toc data-zd-nosidebar data-zd-props-preserve data-zd-sidebar-open-key data-zd-theme-pack-css data-zd-theme-pack-css-loading data-zd-theme-pack-loading data-zd-toc data-zd-wide data-zfb-island data-zfb-island-remount data-zfb-transition-persist date dated dd decimal decision declaration declare declared declares decoration decoration-muted deepest deepest-match default default-transition-duration defaults deferral deferred del delegated delete deliberately delimiter dependency depends depth der desc description design design-token design-token-panel design-token-trigger desktop desktop-sidebar desktop-sidebar-toggle desktop-sidebar-toggle-island desktop-toc-toggle destroys destructive detach detached details determine deterministic dev dfn diagram diagrams dialog did die dieser diff diff-line-added diff-line-content diff-line-empty diff-line-num diff-line-removed diff-row different dir directly directories directory disabled disabled:opacity-50 disabled:pointer-events-none disc display display:none dist distance distinct div dl do doc doc-card- doc-content-band doc-history doc-history-generate doc-history-panel doc-history-trigger doc-page doc-pager doc-prose doc-title docblock docs docs- docs-v- document document-level documentation documented does dog double-registration draft drag drawer drift drifts drop dropdown dropdown-parent dropdowns dt duplicate duration-150 duration-200 during dynamically e e2e each earlier early ease-in-out edge editing einer either eject ejectable ejectables ejected el element elements els else em embedded emit emitting empty empty/undefined en enable enabled end enhanced enhancement enlarged entire entirely entities entries entry entrypoint equal error escape escaped even event eventually every everything-enabled exactly example exceeds excerpt excludes exclusively existing exists exit expected explicit export extends extra f factories failed fall fallback fallbacks falling falls false family fast favicon feature fg field fields fieldset figcaption figure file files fill fills finally find find-match find-match-active fire fires first first-paint fix fixed fixed-width fixtures flag flash flat flex flex-1 flex-col flex-wrap flip flipping flips flow flush-left focus focus-visible:border-accent focus-visible:outline-2 focus-visible:outline-accent focus-visible:outline-offset-2 focus-visible:text-accent focus-visible:underline focus:border-accent focus:outline-none focus:text-accent focus:underline follows font font-bold font-face-parity font-family font-file-missing font-medium font-mono font-sans font-scale font-semibold font-size font-weight font-weight-bold font-weight-medium font-weight-normal font-weight-semibold font/woff2 fonts footer footer- for form format former found four-link fox frame free freeze fresh from frontmatter frontmatter-preview frozen frozen-script fs-extra full fully function further g gains gap-[0.3em] gap-[clamp(1.5rem,3vw,4rem)] gap-hsp-2xs gap-hsp-lg gap-hsp-md gap-hsp-sm gap-hsp-xl gap-hsp-xs gap-vsp-2xs gap-vsp-3xs gap-vsp-lg gap-vsp-md gap-vsp-xs gap-x-hsp-2xs gap-x-hsp-lg gap-x-hsp-md gap-x-hsp-sm gap-x-hsp-xs gap-y-vsp-2xs gap-y-vsp-lg gap-y-vsp-md gap-y-vsp-xs gaps gate geladen2026 generate generated generation genuine geometry get getting-started github github-dark github-link give go got grab gradient granular graph gray-matter grid grid-cols-1 grid-cols-2 grid-cols-[auto_1fr] group group-focus-visible:text-accent group-focus-visible:underline group-focus-within:block group-hover:bg-fg group-hover:block group-hover:text-accent group-hover:text-bg group-hover:underline group-open:rotate-90 grouped grouping guard h-[0.5rem] h-[0.625rem] h-[0.875rem] h-[1.125rem] h-[1.25rem] h-[1.575rem] h-[10rem] h-[14px] h-[1em] h-[1lh] h-[2.5rem] h-[2rem] h-[3.5rem] h-[3rem] h-[90vh] h-[calc(100%-3rem)] h-[calc(100vh-3.5rem)] h-dvh h-full h-icon-lg h-icon-md h-icon-sm h-icon-xs h1 h1s h2 h22013h4 h2s h3 h4 h5 h6 half hand-copied hand-editable handle handled handler handlers happens hard-loaded hardcoded has hash-link have head head-links head-scripts header header- header-call:end header-call:start header-right heading heading-h2 heading-h3 heading-h4 heading-rule headings height here hex hidden hide hierarchical highlight history home hook hooks hooks-json horizontal host hover:bg-[color-mix(in_srgb,var(--color-surface)_80%,var(--color-fg)_20%)] hover:bg-accent-hover hover:bg-accent/10 hover:bg-danger/10 hover:bg-surface hover:border-accent hover:border-accent-hover hover:border-fg hover:text-accent hover:text-accent-hover hover:text-fg hover:underline hr href hrefs hsp hsp-2xl hsp-2xs hsp-lg hsp-md hsp-sm hsp-xl hsp-xs html i i18n/theme. i2 i3 i4 ico icon icon-lg icon-md icon-sm icon-xs identical idle idx if iframe image image-enlarge image-overlay-inset image/avif image/gif image/jpeg image/png image/webp image/x-icon img implementation import important important-allowlist imports in inactive includes including incomplete independently index index2026 indirectly info inherit inherited initial initialised injected inline inline-block inline-flex inner input input-clear ins inserted-after-color-mode inserted-after-color-scheme inserted-after-site-name inserted-first insertion inset-0 inside inside-only install installation installed instance instanceof instead instructions intended intent intentionally intercept interface internal interpolation into invalid invalidated inverse inversion invocation invoke is island island-root issues it italic item item- items items-baseline items-center items-end items-start iteration its itself ja javascript js json jsx jumps just justification justify-between justify-center justify-end justify-start katex kbd keep keeping keeps kept key keyboard keyboard-shortcut keydown keys keystroke keyword keywords khroma known-token-names kopieren label landing lands language-switcher last:border-b-0 last:pb-0 later latest launch layout lazy leading-none leading-normal leading-relaxed leading-snug leading-tight leaf leaf- leak leaves leaving left left-0 left:calc legend legitimate length lets letter-spacing lg lg:block lg:border lg:border-fg lg:border-solid lg:flex lg:flex-col lg:flex-row lg:gap-hsp-xl lg:grid-cols-3 lg:grid-cols-[repeat(auto-fit,minmax(12rem,1fr))] lg:h-[90vh] lg:hidden lg:justify-start lg:m-auto lg:max-h-[90vh] lg:max-w-[52.5rem] lg:ml-[var(--zd-sidebar-w)] lg:pt-vsp-2xl lg:px-hsp-2xl lg:py-vsp-2xl lg:text-left lg:w-[90vw] lg:w-[clamp(16rem,25%,22rem)] li li2 library license lifecycle light light/dark like likely line line-height line/statement linger link link- links list list-disc list-none listener lists literal literally literals live lives llms llms-txt load loaded loader loading local local-1 local-2 local-3 locale locales log logo long longer longest-match look loses lostpointercapture lower luminance m m-0 m-auto m21 m6 machinery main major make malformed malformed-markup malicious manually maps mark markdown marks match matches matching math math-display math-inline max max-h-[85vh] max-h-[90vh] max-h-full max-h-none max-w-[64rem] max-w-[85%] max-w-[85vw] max-w-[90vw] max-w-[calc(100vw-2rem)] max-w-[clamp(50rem,75vw,90rem)] max-w-full max-w-none max-w-sm max-width may mb-0 mb-vsp-2xs mb-vsp-lg mb-vsp-md mb-vsp-sm mb-vsp-xl mb-vsp-xs md mdx means measured measurement measures measuring mechanism menu mermaid message messages meta meta-knob meta-schema metadata migration min-h-0 min-h-[60vh] min-h-[calc(100vh-3.5rem)] min-h-screen min-w-0 min-w-[10rem] min-w-[3rem] min-w-[8rem] minifier minor mirror mirroring mirrors missing mit ml-auto ml-hsp-2xl ml-hsp-lg ml-hsp-sm ml-hsp-xl ml-hsp-xs mobile mod modal modal-backdrop mode model modify module moment monospace month more most mount mounted mouseenter mouseleave move mr-hsp-sm ms mt-0 mt-vsp-2xl mt-vsp-2xs mt-vsp-3xs mt-vsp-lg mt-vsp-md mt-vsp-sm mt-vsp-xl mt-vsp-xs multi-changelog multiple must mutates mutation mutations muted mx-auto my-vsp-lg my-vsp-md n name named names native natural nav nav-active nav-card- nav/doc navigating navigation navigations near needed needs neither nested neutral never new newly-swapped next nicht no no-color-scheme no-data-theme-selector no-enlarge no-op no-repeat no-underline noch node node:buffer node:fs node:fs/promises node:module node:path node:url nodes nofollow noindex non-draggable non-empty non-index non-light-dark non-literal non-null non-persisted none noopener noreferrer normal noscript not notable note note-tray notes now null number numeric object object-contain observe observer occurred of off offered offsets ofl-required og:description og:image og:image:alt og:image:height og:image:width og:title og:type og:url oklch ol old older omit omitting on once one only onto opacity-60 open open/close option or order original other others otherwise out outgoing outline-none over overflow overflow-auto overflow-hidden overflow-x-auto overflow-y-auto overflow-y:auto override overrides overscroll-contain overwrite own owned p p-0 p-hsp-2xs p-hsp-lg p-hsp-md p-hsp-sm pack pack-scoped package package-default package-injected package-owned packages packs padding page page-loading page-loading-overlay page-loading-spinner page-navigate-end page-title page-wide pages pages/. paint paint-and-read palette pan panel panels paren-balance-aware parent parse parsed parser parses part pass passed passes patch path paths pattern payload payload-budget pb-[50vh] pb-vsp-2xs pb-vsp-lg pb-vsp-md pb-vsp-xl pb-vsp-xs pending per per-block per-link per-package per-release permanently persisted persistence pi pick picked picks picocolors pins pipelines pl-[1.25rem] pl-hsp-lg pl-hsp-md pl-hsp-sm pl-hsp-xl place placeholder placeholder:text-muted plain plural plus png16 png32 pnpm point pointer pointer-events-none pointercancel pointerdown pointermove pointerup policy polite polygon polyline popover populates port position position:fixed pr-[4px] pr-hsp-lg pr-hsp-md pr-hsp-sm pr-hsp-xl pre pre-lowercased preact preact/compat preact/hooks preact/jsx-runtime preconnect preference prefix preload pres present preserving preview preview-swatch-color previews2026 previously primary print private produce produced produces producing production profiles project project-owned project-root-relative properties property props prose provided proxy pt-[0.15rem] pt-[2px] pt-vsp-3xs pt-vsp-md pt-vsp-sm pt-vsp-xl pt-vsp-xs ptag- public purely puts px px-hsp-2xl px-hsp-2xs px-hsp-lg px-hsp-md px-hsp-sm px-hsp-xl px-hsp-xs py-0 py-[2px] py-[4px] py-[calc(var(--spacing-vsp-xs)+0.15rem)] py-hsp-2xs py-hsp-3xs py-hsp-sm py-hsp-xs py-vsp-2xs py-vsp-3xs py-vsp-lg py-vsp-md py-vsp-sm py-vsp-xl py-vsp-xs python q query question quick r radius radius-full radius-lg rail ramp range rather raw re-encode/decode re-exports re-querying re-render re-renders re-run re-running re-runs re-selects re-syncs reach reached reaches read reader reader-facing reading readings reads/rewrites real real-value received receives recorded recovers rect redefine redistribution ref- reference referenced references refetch refreshes regardless regenerate regenerates regex registry reinit reinits rejected rel relative release released releases reload relying rem remapped remembered remove removed render rendered renderer renderers renders reorder repaint repair repeated repeating replace replaced replacement replaces repopulate report repository require required requires reserved resize resize-x resolve resolved resolves responded response restore restores restyle result result-click results results-area retry return returns reveal revision revisions rewire rewrite rewrites right right- right-0 right-hsp-lg ring-2 ring-accent risking ro robots role roles root rotate-180 rotate-90 round round-trip rounded rounded-[0.75rem] rounded-bl-[0.25rem] rounded-bl-[1rem] rounded-bl-lg rounded-br-[0.25rem] rounded-br-[1rem] rounded-full rounded-lg rounded-md rounded-t-[1rem] rounds route routed router routes routes-src row rule rules run running runs runtime s safe safely safer same same-locale samp sans sans-serif scale scanned scanning scheme scoped scoping score scored script script- script-eval script-evaluation script-injection scripts scroll scrollbar scrolled scrollend scrolling seam search search-index section section- see seed sehen select select-none selection-bg selection-fg selector self self-contained self-hosted self-start semantic semibold semver sentinel separator serialised serialize server server-rendered session set sets setting settles setup shadow shadow-[0_1px_3px_color-mix(in_srgb,var(--color-fg)_8%,transparent)] shadow-lg shadow-md shadowed shape share shared sharing shell ship shipped ships short shortcut should show shown shrink-0 sidebar sidebar- sidebar-toggle-island sidebar-tree-island sidebar-w signal silently similarity simple since single single-line single-object-literal singular site site-search site-tree-nav-island sitemap- sites size size-icon-xs skill skills skipped skipping skips slash slot slug slug-dir-parity slugs sm:border sm:border-muted sm:flex-row sm:grid-cols-2 sm:h-auto sm:items-center sm:justify-between sm:max-h-[80vh] sm:max-w-[52rem] sm:mx-auto sm:my-[10vh] sm:rounded-lg small smol-toml smooth snapping snapshot snapshots so soft soft-nav solid some somehow source sources space-y-vsp-2xs space-y-vsp-lg spacing spacing-0 spacing-px span spans spec specifiers specify spelling splitter spread spurious square sr-only src stable stack stale standalone start state state- state:state- statement status stay staying sticky still stock stop stops stored straddles stray strict string strings strip stripe strips stroke-linecap stroke-linejoin stroke-width strong stronger stub-rendered style style-attribute styled styles stylesheet sub subagents subsequent substitute substitution subtracting success successful summary sup supply supported surface surfaces survives svg swap swapped swaps switcher switching synchronous synchronously syntactically syntax t tab tab-item tab-panel tabindex table tablist tabpanel tabs tabs-container tabs-content tabs-nav tabular-nums tag tag- tag-item- tagged tags tags:audit take tbody td temp-element template temporary temporary-element terminal terms test-results tested text text-accent text-bg text-body text-caption text-center text-chat-assistant-text text-chat-user-text text-code-fg text-danger text-decoration text-display text-fg text-fg/60 text-heading text-info text-left text-micro text-muted text-muted/50 text-right text-scale-2xl text-scale-2xs text-scale-lg text-scale-md text-scale-sm text-scale-xl text-scale-xs text-small text-title text-warning text/css text/plain textarea tfoot th than that the thead their them theme theme-color theme-pack theme-pack-changed theme-packs theme-packs/index.json theme-toggle theme/token then there these they this those though three threw through throw throws tighten time timeline tip title to toast toc toggle toggle- toggle-ai-chat toggle-design-token-panel toggles toggling token tokens tolerates toml too toolbar tooltip top top-0 top-[3.5rem] top-full top-level top-vsp-2xs total touches tr tracked tracking-wide tracking-wider trade-off trailing transition transition-[background,color,border-color] transition-[left,color] transition-[right,color] transition-colors transition-transform translate-x-0 translated translations transparent tray treats tree tree-child- tree-item- tree-top- trigger trigger:ai-chat trigger:design-token-panel triggers true truncate truncated try ts tsx turn twitter:card twitter:creator twitter:description twitter:image twitter:site twitter:title two type typeface typeof typescript typography u ul umschalten unable unavailable unbalanced unchanged und undefined under underline underlines understand unit-tested unknown unlike unlisted unmaintained unobserve unreadable unrelated unreleased unresolvable unresolved unset unterminated until unusable unwrapped up up-to-date update updated uppercase use used useful user uses using usual utf-8 utf8 utilities utility v v2 val value value-reader values var variable variant verbatim version version- version-menu version-switcher versions vertical via video viewing viewport viewports virtual:zudo-doc-chrome-bindings virtual:zudo-doc-design-token-panel-config virtual:zudo-doc-route-context visibility visible vocabulary void von vsp vsp-2xl vsp-2xs vsp-3xs vsp-lg vsp-md vsp-sm vsp-xl vsp-xs w w-1/2 w-[0.5rem] w-[0.625rem] w-[0.875rem] w-[1.125rem] w-[1.575rem] w-[1.5rem] w-[1.75rem] w-[12rem] w-[14px] w-[16px] w-[16rem] w-[18px] w-[1em] w-[2.5rem] w-[280px] w-[2rem] w-[320px] w-[360px] w-[90vw] w-[calc(100vw-2rem)] w-[var(--zd-sidebar-w)] w-dvw w-full w-icon-lg w-icon-md w-icon-sm w-icon-xs walk walks want warn warning was watching way wbr wbr- we website weight went were what when where whereas whether which while whitespace-nowrap whitespace-pre whole whose wide wide-gamut wider-than-scrollbar width will window wins wird wired with without word wordmark working works worktrees would wrap wrapped wrapper wrappers wrapping wraps written wrong wrote wurde x xl:flex xl:hidden y-scrollbar year yet yielded yields you your z-dropdown z-local-1 z-modal z-modal-backdrop z-popover z-sidebar z-toolbar zd-content zd-desktop-sidebar-toggle zd-desktop-toc-toggle zd-doc-content-band zd-enlarge-btn zd-enlarge-dialog zd-enlarge-dialog-close zd-enlargeable zd-html-preview-code zd-mermaid-dialog zd-mermaid-enlargeable zd-mermaid-tool-btn zd-mermaid-toolbar zd-mermaid-transform zd-mermaid-viewport zd-sidebar-content-wrapper zd-sidebar-open zd-theme-pack-dialog-title zd-toc-col zdtp zfb zfb:after-swap zfb:before-preparation zfb:before-swap zod zoom zudo-design-token-panel zudo-design-tokens/v3 zudo-doc zudo-doc-code-wrap zudo-doc-design-token-panel-modal zudo-doc-design-tokens zudo-doc-sidebar-visible zudo-doc-sidebar-width zudo-doc-theme zudo-doc-theme-pack zudo-doc-toc-visible zudo-doc-tweak zum");
|
|
2
|
+
@source inline("-domtweaker-enabled -elpath-enabled -left-[calc(var(--spacing-icon-lg)/2)] -link -mb-px -ml-hsp-sm -mt-px -noscript -open -state -translate-x-full 2xl:w-[24px] [&::-webkit-details-marker]:hidden [&_a]:pointer-events-auto [&_a]:text-accent [&_a]:underline [&_li]:mb-0 [&_nav]:mb-0 [data-admonition] [data-kbd-shortcut] [data-switcher-launcher] [doc-history-meta] [doc-history] [doc-layout] [llms-txt] [zudo-doc] a a2 abbr about above absent absolute accent accent- accent:accent- access across activated active actual actually added admonition admonition- admonition-body admonition-title admonition/callout after after-breadcrumb after-content after-navigate after-sidebar after-title against agent agents ai-chat ai-chat-md ai-chat-trigger alert align-top all allow allow-same-origin allow-scripts allowed alone already already-executed already-multiline already-picked also always an anchor and and/or animate-pulse animate-spin announce ansehen antialiased any anywhere anzeigen app appear application/json application/xml applied applies apply applying approach approval are area arg argument aria-atomic aria-busy aria-controls aria-current aria-disabled aria-expanded aria-haspopup aria-hidden aria-label aria-labelledby aria-live aria-orientation aria-pressed aria-selected aria-valuemax aria-valuemin aria-valuenow arm arms arrows article as asc aside aspect-[1200/630] aspect-square asset asset- assets assistant async at at-rule attach attribute attributes auf authored auto auto-logo-mask autogenerated availability available avoid await away b back backdrop:bg-bg/30 backdrop:bg-bg/80 backdrop:bg-overlay/60 backdrop:z-modal-backdrop background background-color backtick backticks baked banner bare base base- base64 base:base- based bash batch be bearbeiten because becomes been before below best best-effort between bg bg-[#fff] bg-accent bg-bg bg-chat-assistant-bg bg-chat-user-bg bg-code-bg bg-fg bg-info/10 bg-info/5 bg-muted bg-overlay/30 bg-surface bg-surface/50 bg-transparent bg-warning/10 bg-warning/5 bi bigint bin binaries bind binding blank blanks block blockquote blocks blur body body-end-components body-end-scripts bold boolean bootstrap border border-accent border-b border-b-2 border-b-[5px] border-bg/30 border-collapse border-danger border-dashed border-fg border-image border-info/30 border-l border-l-0 border-l-[3px] border-left-width border-muted border-none border-r border-r-0 border-radius border-solid border-t border-t-[2px] border-t-[3px] border-transparent border-warning/30 border-width border-y both bottom-hsp-lg bottom-vsp-xl boundaries box box-border br brackets brand breadcrumb:end breadcrumb:start break-words brief brown browser browser-tab browsers browses btn budget bug build builder built built-in bundler but button buttons by bypassed byte-identical bytes c cache cached calendar-valid call callable called caller calls can cancellation candidate cannot canonical canvas caption captured captures card card-grid cards carry cases cat-nav- catch categories category caught caution center center/contain ch chains change changed changelog changelogs changes check child children choose chrome chrome-font ci circle cite class class-less class-mode claude claude-agents claude-commands claude-md claude-resources claude-skills cleaned cleanly clear clearing click client client-router client-side clip clobber clobbering close closed closes closing closure code code-block-sr-announce code-group code-group-panel codex codex-agents codex-agents-md codex-config codex-hooks codex-resources codex-rules codex-skills col col-resize col-span-full col-start-1 colgroup collapses collapsible collision color color-scheme color-scheme-changed color-scheme-provider color-tweak colorization colors column comma command commands commas comment commercial commercial-font-denylist commit compare component component:github-link component:language-switcher component:search component:theme-toggle component:version-switcher composes composition compute computed concrete config configuration configurations configure configured conflicts confuse connect const construction consumer consumes contain container containers containing contains content content-admonition content-layer content-link content-type content-wrapper:end content-wrapper:start contents context contract control controller controls converts cookie-blocking copied copy core corners correct correctly corrupt could count covered covers crashes created cross-component crumb- cs css css-presence ctx cur current current-path/index.ts current-route currently cursor cursor-not-allowed cursor-pointer custom cycle d danger dark data data-active data-admonition data-auto-logo data-base data-close-search data-current-locale data-default-locale data-doc-date data-doc-description data-doc-metainfo data-doc-pager data-doc-unavailable-versions data-find-active data-find-match data-footer data-group-id data-header data-header-logo data-header-nav data-header-right data-kbd-shortcut data-language-switcher data-loading-index data-mermaid-enlarge-ready data-mermaid-rendered data-mermaid-src data-nav-active data-nav-item data-nav-item-dropdown data-nav-more data-nav-more-menu data-nav-more-toggle data-no-results data-note-tray-group data-note-tray-row data-open-search data-pan-active data-processed data-props data-result-count-template data-search-count data-search-count-narrow data-search-dialog data-search-input data-search-placeholder data-search-results data-search-unavailable data-sidebar-hidden data-sidebar-resizer data-site-nav data-switcher-card data-switcher-launcher data-tab-btn data-tab-default data-tab-label data-tab-value data-tabs data-taglist-group data-testid data-theme data-theme-pack data-theme-pack-switcher data-theme/style data-toc-hidden data-trailing-slash data-unavailable-label data-variant data-version-banner data-version-latest data-version-menu data-version-rewire data-version-slug data-version-switcher data-version-toggle data-version-trigger-label data-zd-mobile-sidebar data-zd-mobile-toc data-zd-nosidebar data-zd-props-preserve data-zd-sidebar-open-key data-zd-theme-pack-css data-zd-theme-pack-css-loading data-zd-theme-pack-loading data-zd-toc data-zd-wide data-zfb-island data-zfb-island-remount data-zfb-transition-persist date dated dd decimal decision declaration declare declared declares decoration decoration-muted deepest deepest-match default default-transition-duration defaults deferral deferred del delegated delete deliberately delimiter dependency depends depth der desc description design design-token design-token-panel design-token-trigger desktop desktop-sidebar desktop-sidebar-toggle desktop-sidebar-toggle-island desktop-toc-toggle destroys destructive detach detached details determine deterministic dev dfn diagram diagrams dialog did die dieser diff diff-line-added diff-line-content diff-line-empty diff-line-num diff-line-removed diff-row different dir directly directories directory disabled disabled:opacity-50 disabled:pointer-events-none disc display display:none dist distance distinct div dl do doc doc-card- doc-content-band doc-history doc-history-generate doc-history-panel doc-history-trigger doc-page doc-pager doc-prose doc-title docblock docs docs- docs-v- document document-level documentation documented does dog double-registration draft drag drawer drift drifts drop dropdown dropdown-parent dropdowns dt duplicate duration-150 duration-200 during dynamically e e2e each earlier early ease-in-out edge editing einer either eject ejectable ejectables ejected el element elements els else em embedded emit emitting empty empty/undefined en enable enabled end enhanced enhancement enlarged entire entirely entities entries entry entrypoint equal error escape escaped even event eventually every everything-enabled exactly example exceeds excerpt excludes exclusively existing exists exit expected explicit export extends extra f factories failed fall fallback fallbacks falling falls false family fast favicon feature fg field fields fieldset figcaption figure file files fill fills finally find find-match find-match-active fire fires first first-paint first:mt-0 fix fixed fixed-width fixtures flag flash flat flex flex-1 flex-col flex-wrap flip flipping flips flow flush-left focus focus-visible:border-accent focus-visible:decoration-accent focus-visible:outline-2 focus-visible:outline-accent focus-visible:outline-offset-2 focus-visible:text-accent focus-visible:underline focus-within:border-accent focus-within:z-local-1 focus:border-accent focus:outline-none focus:text-accent focus:underline follows font font-bold font-face-parity font-family font-file-missing font-medium font-mono font-sans font-scale font-semibold font-size font-weight font-weight-bold font-weight-medium font-weight-normal font-weight-semibold font/woff2 fonts footer footer- for form format former found four-link fox frame free freeze fresh from frontmatter frontmatter-preview frozen frozen-script fs-extra full fully function further g gains gap-[0.3em] gap-[clamp(1.5rem,3vw,4rem)] gap-hsp-2xs gap-hsp-lg gap-hsp-md gap-hsp-sm gap-hsp-xl gap-hsp-xs gap-vsp-2xs gap-vsp-3xs gap-vsp-lg gap-vsp-md gap-vsp-xs gap-x-hsp-2xs gap-x-hsp-lg gap-x-hsp-md gap-x-hsp-sm gap-x-hsp-xs gap-y-vsp-2xs gap-y-vsp-3xs gap-y-vsp-lg gap-y-vsp-md gap-y-vsp-xs gaps gate geladen2026 generate generated generation genuine geometry get getting-started github github-dark github-link give go got grab gradient granular graph gray-matter grid grid-cols-1 grid-cols-2 grid-cols-[auto_1fr] grid-rows-[auto_auto] grid-rows-subgrid group group-focus-visible:decoration-accent group-focus-visible:text-accent group-focus-visible:text-accent-hover group-focus-visible:text-fg group-focus-visible:underline group-focus-within:block group-hover:bg-fg group-hover:block group-hover:decoration-accent group-hover:text-accent group-hover:text-accent-hover group-hover:text-bg group-hover:text-fg group-hover:underline group-open:rotate-90 grouped grouping guard h-[0.5rem] h-[0.625rem] h-[0.875rem] h-[1.125rem] h-[1.25rem] h-[1.575rem] h-[10rem] h-[14px] h-[1em] h-[1lh] h-[2.5rem] h-[2rem] h-[3.5rem] h-[3rem] h-[90vh] h-[calc(100%-3rem)] h-[calc(100vh-3.5rem)] h-dvh h-full h-icon-lg h-icon-md h-icon-sm h-icon-xs h1 h1s h2 h22013h4 h2s h3 h4 h5 h6 half hand-copied hand-editable handle handled handler handlers happens hard-loaded hardcoded has hash-link have head head-links head-scripts header header- header-call:end header-call:start header-right heading heading-h2 heading-h3 heading-h4 heading-rule headings height here hex hidden hide hierarchical highlight history home hook hooks hooks-json horizontal host hover:bg-[color-mix(in_srgb,var(--color-surface)_80%,var(--color-fg)_20%)] hover:bg-accent-hover hover:bg-accent/10 hover:bg-danger/10 hover:bg-surface hover:border-accent hover:border-accent-hover hover:border-fg hover:decoration-accent hover:text-accent hover:text-accent-hover hover:text-fg hover:underline hover:z-local-1 hr href hrefs hsp hsp-2xl hsp-2xs hsp-lg hsp-md hsp-sm hsp-xl hsp-xs html i i18n/theme. i2 i3 i4 ico icon icon-lg icon-md icon-sm icon-xs identical idle idx if iframe image image-enlarge image-overlay-inset image/avif image/gif image/jpeg image/png image/webp image/x-icon img implementation import important important-allowlist imports in inactive includes including incomplete independently index index2026 indirectly info inherit inherited initial initialised injected inline inline-block inline-flex inner input input-clear ins inserted-after-color-mode inserted-after-color-scheme inserted-after-site-name inserted-first insertion inset-0 inside inside-only install installation installed instance instanceof instead instructions intended intent intentionally intercept interface internal interpolation into invalid invalidated inverse inversion invocation invoke is island island-root issues it italic item item- items items-baseline items-center items-end items-start iteration its itself ja javascript js json jsx jumps just justification justify-between justify-center justify-end justify-start katex kbd keep keeping keeps kept key keyboard keyboard-shortcut keydown keys keystroke keyword keywords khroma known-token-names kopieren label landing lands language-switcher last:border-b-0 last:pb-0 later latest launch layout lazy leading-none leading-normal leading-relaxed leading-snug leading-tight leaf leaf- leak leaves leaving left left-0 left:calc legend legitimate length lets letter-spacing lg lg:block lg:border lg:border-fg lg:border-solid lg:flex lg:flex-col lg:flex-row lg:gap-hsp-xl lg:grid-cols-3 lg:grid-cols-[repeat(auto-fit,minmax(12rem,1fr))] lg:h-[90vh] lg:hidden lg:justify-start lg:m-auto lg:max-h-[90vh] lg:max-w-[52.5rem] lg:ml-[var(--zd-sidebar-w)] lg:pt-vsp-2xl lg:px-hsp-2xl lg:py-vsp-2xl lg:text-left lg:w-[90vw] lg:w-[clamp(16rem,25%,22rem)] li li2 library license lifecycle light light/dark like likely line line-height line/statement linger link link- links list list-disc list-none listener lists literal literally literals live lives llms llms-txt load loaded loader loading local local-1 local-2 local-3 locale locales log logo long longer longest-match look loses lostpointercapture lower luminance m m-0 m-auto m21 m6 machinery main major make malformed malformed-markup malicious manually maps mark markdown marks match matches matching math math-display math-inline max max-h-[85vh] max-h-[90vh] max-h-full max-h-none max-w-[64rem] max-w-[85%] max-w-[85vw] max-w-[90vw] max-w-[calc(100vw-2rem)] max-w-[clamp(50rem,75vw,90rem)] max-w-full max-w-none max-w-sm max-width may mb-0 mb-vsp-2xs mb-vsp-lg mb-vsp-md mb-vsp-sm mb-vsp-xl mb-vsp-xs md mdx means measured measurement measures measuring mechanism menu mermaid message messages meta meta-knob meta-schema metadata migration min-h-0 min-h-[60vh] min-h-[calc(100vh-3.5rem)] min-h-screen min-w-0 min-w-[10rem] min-w-[3rem] min-w-[8rem] minifier minor mirror mirroring mirrors missing mit ml-[calc(var(--spacing-hsp-xl)+1px)] ml-auto ml-hsp-2xl ml-hsp-lg ml-hsp-md ml-hsp-sm ml-hsp-xl mobile mod modal modal-backdrop mode model modify module moment monospace month more most mount mounted mouseenter mouseleave move mr-[calc(var(--spacing-hsp-xl)+1px)] mr-hsp-sm ms mt-0 mt-vsp-2xl mt-vsp-2xs mt-vsp-3xs mt-vsp-lg mt-vsp-md mt-vsp-sm mt-vsp-xl mt-vsp-xs multi-changelog multiple must mutates mutation mutations muted mx-auto my-vsp-lg my-vsp-md n name named names native natural nav nav-active nav-card- nav/doc navigating navigation navigations near needed needs neither nested neutral never new newly-swapped next nicht no no-color-scheme no-data-theme-selector no-enlarge no-op no-repeat no-underline noch node node:buffer node:fs node:fs/promises node:module node:path node:url nodes nofollow noindex non-draggable non-empty non-index non-light-dark non-literal non-null non-persisted none noopener noreferrer normal noscript not notable note note-tray notes now null number numeric object object-contain observe observer occurred of off offered offsets ofl-required og:description og:image og:image:alt og:image:height og:image:width og:title og:type og:url oklch ol old older omit omitting on once one only onto opacity-60 open open/close option or order original other others otherwise out outgoing outline-none over overflow overflow-auto overflow-hidden overflow-x-auto overflow-y-auto overflow-y:auto override overrides overscroll-contain overwrite own owned p p-0 p-hsp-2xs p-hsp-lg p-hsp-md p-hsp-sm pack pack-scoped package package-default package-injected package-owned packages packs padding page page-loading page-loading-overlay page-loading-spinner page-navigate-end page-title page-wide pages pages/. paint paint-and-read palette pan panel panels paren-balance-aware parent parse parsed parser parses part pass passed passes patch path paths pattern payload payload-budget pb-[50vh] pb-vsp-2xs pb-vsp-lg pb-vsp-md pb-vsp-xl pb-vsp-xs peer peer-focus-visible:border-accent peer-focus-visible:text-accent peer-hover:border-accent peer-hover:text-accent pending per per-block per-link per-package per-release permanently persisted persistence pi pick picked picks picocolors pins pipelines pl-[1.25rem] pl-hsp-lg pl-hsp-md pl-hsp-sm pl-hsp-xl place place-items-center placeholder placeholder:text-muted plain plural plus png16 png32 pnpm point pointer pointer-events-none pointercancel pointerdown pointermove pointerup policy polite polygon polyline popover populates port position position:fixed pr-[4px] pr-hsp-lg pr-hsp-md pr-hsp-sm pr-hsp-xl pre pre-lowercased preact preact/compat preact/hooks preact/jsx-runtime preconnect preference prefix preload pres present preserving preview preview-swatch-color previews2026 previously primary print private produce produced produces producing production profiles project project-owned project-root-relative properties property props prose provided proxy pt-[0.15rem] pt-[2px] pt-vsp-3xs pt-vsp-md pt-vsp-sm pt-vsp-xl pt-vsp-xs ptag- public purely puts px px-hsp-2xl px-hsp-2xs px-hsp-lg px-hsp-md px-hsp-sm px-hsp-xl px-hsp-xs py-0 py-[2px] py-[4px] py-[calc(var(--spacing-vsp-xs)+0.15rem)] py-hsp-2xs py-hsp-3xs py-hsp-sm py-hsp-xs py-vsp-2xs py-vsp-3xs py-vsp-lg py-vsp-md py-vsp-sm py-vsp-xl py-vsp-xs python q query question quick r radius radius-full radius-lg rail ramp range rather raw re-encode/decode re-exports re-querying re-render re-renders re-run re-running re-runs re-selects re-syncs reach reached reaches read reader reader-facing reading readings reads/rewrites real real-value received receives recorded recovers rect redefine redistribution ref- reference referenced references refetch refreshes regardless regenerate regenerates regex registry reinit reinits rejected rel relative release released releases reload relying rem remapped remembered remove removed render rendered renderer renderers renders reorder repaint repair repeated repeating replace replaced replacement replaces repopulate report repository require required requires reserved resize resize-x resolve resolved resolves responded response restore restores restyle result result-click results results-area retry return returns reveal revision revisions rewire rewrite rewrites right right- right-0 right-hsp-lg ring-2 ring-accent risking ro robots role roles root rotate-180 rotate-90 round round-trip rounded rounded-[0.75rem] rounded-bl-[0.25rem] rounded-bl-[1rem] rounded-bl-lg rounded-br-[0.25rem] rounded-br-[1rem] rounded-full rounded-lg rounded-md rounded-t-[1rem] rounds route routed router routes routes-src row row-span-2 row-start-1 row-start-2 rule rules run running runs runtime s safe safely safer same same-locale samp sans sans-serif scale scanned scanning scheme scoped scoping score scored script script- script-eval script-evaluation script-injection scripts scroll scrollbar scrolled scrollend scrolling seam search search-index section section- see seed sehen select select-none selection-bg selection-fg selector self self-contained self-hosted self-start self-stretch semantic semibold semver sentinel separator serialised serialize server server-rendered session set sets setting settles setup shadow shadow-[0_1px_3px_color-mix(in_srgb,var(--color-fg)_8%,transparent)] shadow-lg shadow-md shadowed shape share shared sharing shell ship shipped ships short shortcut should show shown shrink-0 sidebar sidebar- sidebar-toggle-island sidebar-tree-island sidebar-w signal silently similarity simple since single single-line single-object-literal singular site site-search site-tree-nav-island sitemap- sites size size-icon-lg skill skills skipped skipping skips slash slot slug slug-dir-parity slugs sm:border sm:border-muted sm:col-start-2 sm:flex sm:flex-row sm:gap-x-hsp-xl sm:grid sm:grid-cols-2 sm:grid-cols-[minmax(0,1fr)_auto] sm:grid-cols-subgrid sm:h-auto sm:hidden sm:items-center sm:justify-between sm:max-h-[80vh] sm:max-w-[52rem] sm:mr-0 sm:mx-auto sm:my-[10vh] sm:rounded-lg sm:row-span-2 sm:row-start-1 small smol-toml smooth snapping snapshot snapshots so soft soft-nav solid some somehow source sources space-y-vsp-2xs space-y-vsp-lg spacing spacing-0 spacing-px span spans spec specifiers specify spelling splitter spread spurious square sr-only src stable stack stale standalone start state state- state:state- statement status stay staying sticky still stock stop stops stored straddles stray strict string strings strip stripe strips stroke-linecap stroke-linejoin stroke-width strong stronger stub-rendered style style-attribute styled styles stylesheet sub subagents subsequent substitute substitution subtracting success successful summary sup supply supported surface surfaces survives svg swap swapped swaps switcher switching synchronous synchronously syntactically syntax t tab tab-item tab-panel tabindex table tablist tabpanel tabs tabs-container tabs-content tabs-nav tabular-nums tag tag- tag-item- tagged tags tags:audit take tbody td temp-element template temporary temporary-element terminal terms test-results tested text text-accent text-bg text-body text-caption text-center text-chat-assistant-text text-chat-user-text text-code-fg text-danger text-decoration text-display text-fg text-fg/60 text-heading text-info text-left text-micro text-muted text-muted/50 text-right text-scale-2xl text-scale-2xs text-scale-lg text-scale-md text-scale-sm text-scale-xl text-scale-xs text-small text-title text-warning text/css text/plain textarea tfoot th than that the thead their them theme theme-color theme-pack theme-pack-changed theme-packs theme-packs/index.json theme-toggle theme/token then there these they this those though three threw through throw throws tighten time timeline tip title to toast toc toggle toggle- toggle-ai-chat toggle-design-token-panel toggles toggling token tokens tolerates toml too toolbar tooltip top top-0 top-[3.5rem] top-full top-hsp-2xs top-level total touches tr tracked tracking-wide tracking-wider trade-off trailing transition transition-[background,color,border-color] transition-[left,color] transition-[right,color] transition-colors transition-transform translate-x-0 translated translations transparent tray treats tree tree-child- tree-item- tree-top- trigger trigger:ai-chat trigger:design-token-panel triggers true truncate truncated try ts tsx turn twitter:card twitter:creator twitter:description twitter:image twitter:site twitter:title two type typeface typeof typescript typography u ul umschalten unable unavailable unbalanced unchanged und undefined under underline underlines understand unit-tested unknown unlike unlisted unmaintained unobserve unreadable unrelated unreleased unresolvable unresolved unset unterminated until unusable unwrapped up up-to-date update updated uppercase use used useful user uses using usual utf-8 utf8 utilities utility v v2 val value value-reader values var variable variant verbatim version version- version-menu version-switcher versions vertical via video viewing viewport viewports virtual:zudo-doc-chrome-bindings virtual:zudo-doc-design-token-panel-config virtual:zudo-doc-route-context visibility visible vocabulary void von vsp vsp-2xl vsp-2xs vsp-3xs vsp-lg vsp-md vsp-sm vsp-xl vsp-xs w w-1/2 w-[0.5rem] w-[0.625rem] w-[0.875rem] w-[1.125rem] w-[1.575rem] w-[1.5rem] w-[1.75rem] w-[12rem] w-[14px] w-[16px] w-[16rem] w-[18px] w-[1em] w-[2.5rem] w-[280px] w-[2rem] w-[320px] w-[360px] w-[6.5rem] w-[90vw] w-[calc(100vw-2rem)] w-[var(--zd-sidebar-w)] w-dvw w-full w-icon-lg w-icon-md w-icon-sm w-icon-xs walk walks want warn warning was watching way wbr wbr- we website weight went were what when where whereas whether which while whitespace-nowrap whitespace-pre whole whose wide wide-gamut wider-than-scrollbar width will window wins wird wired with without word wordmark working works worktrees would wrap wrapped wrapper wrappers wrapping wraps written wrong wrote wurde x xl:flex xl:hidden y-scrollbar year yet yielded yields you your z-dropdown z-local-1 z-modal z-modal-backdrop z-popover z-sidebar z-toolbar zd-content zd-desktop-sidebar-toggle zd-desktop-toc-toggle zd-doc-content-band zd-enlarge-btn zd-enlarge-dialog zd-enlarge-dialog-close zd-enlargeable zd-html-preview-code zd-mermaid-dialog zd-mermaid-enlargeable zd-mermaid-tool-btn zd-mermaid-toolbar zd-mermaid-transform zd-mermaid-viewport zd-sidebar-content-wrapper zd-sidebar-open zd-theme-pack-dialog-title zd-toc-col zdtp zfb zfb:after-swap zfb:before-preparation zfb:before-swap zod zoom zudo-design-token-panel zudo-design-tokens/v3 zudo-doc zudo-doc-code-wrap zudo-doc-design-token-panel-modal zudo-doc-design-tokens zudo-doc-sidebar-visible zudo-doc-sidebar-width zudo-doc-theme zudo-doc-theme-pack zudo-doc-toc-visible zudo-doc-tweak zum");
|
|
@@ -8,7 +8,7 @@ export interface SiteTreeNavProps {
|
|
|
8
8
|
initiallyCollapsedCategorySlugs?: string[];
|
|
9
9
|
/** Locale used by dated note-tray rows. */
|
|
10
10
|
locale?: string;
|
|
11
|
-
/**
|
|
11
|
+
/** @deprecated — no longer rendered (created date only). */
|
|
12
12
|
updatedLabel?: string;
|
|
13
13
|
}
|
|
14
14
|
export declare function SiteTreeNav({ tree, ariaLabel, categoryOrder, categoryIgnore, initiallyCollapsedCategorySlugs, locale, updatedLabel, }: SiteTreeNavProps): import("preact").JSX.Element;
|
|
@@ -253,14 +253,7 @@ function NoteTrayRow({
|
|
|
253
253
|
children: item.rank === void 0 ? "" : String(item.rank).padStart(width, "0")
|
|
254
254
|
}
|
|
255
255
|
),
|
|
256
|
-
/* @__PURE__ */
|
|
257
|
-
/* @__PURE__ */ jsx("span", { children: item.label }),
|
|
258
|
-
item.updated && /* @__PURE__ */ jsxs("span", { className: "block text-micro text-muted", children: [
|
|
259
|
-
updatedLabel,
|
|
260
|
-
" ",
|
|
261
|
-
formatDate(item.updated, locale)
|
|
262
|
-
] })
|
|
263
|
-
] })
|
|
256
|
+
/* @__PURE__ */ jsx("span", { className: "min-w-0", children: /* @__PURE__ */ jsx("span", { children: item.label }) })
|
|
264
257
|
]
|
|
265
258
|
}
|
|
266
259
|
);
|
package/dist/tags-audit.d.ts
CHANGED
|
@@ -42,8 +42,7 @@ export interface AuditOptions {
|
|
|
42
42
|
vocabularyActive: boolean;
|
|
43
43
|
/**
|
|
44
44
|
* Near-duplicate detection callbacks. Optional — if omitted the relevant
|
|
45
|
-
* checks are silently skipped so callers
|
|
46
|
-
* can still use the core functions.
|
|
45
|
+
* checks are silently skipped so callers can still use the core functions.
|
|
47
46
|
*/
|
|
48
47
|
nearDupHelpers?: NearDupHelpers;
|
|
49
48
|
}
|
|
@@ -65,6 +64,8 @@ export interface NearDupHelpers {
|
|
|
65
64
|
export declare function buildIndex(vocab: readonly TagVocabularyEntry[]): VocabularyIndex;
|
|
66
65
|
export declare function collectMdxFiles(dir: string): Promise<string[]>;
|
|
67
66
|
export declare function normalizeTags(value: unknown): string[];
|
|
67
|
+
/** Return the Sørensen–Dice similarity of two whitespace-insensitive bigram sets. */
|
|
68
|
+
export declare function compareTwoStrings(first: string, second: string): number;
|
|
68
69
|
export declare function findNearDuplicates(tags: string[], helpers: NearDupHelpers): NearDuplicatePair[];
|
|
69
70
|
export declare function audit(opts: AuditOptions): Promise<AuditReport>;
|
|
70
71
|
export declare function hasHardIssues(report: AuditReport): boolean;
|
package/dist/tags-audit.js
CHANGED
|
@@ -34,6 +34,26 @@ function normalizeTags(value) {
|
|
|
34
34
|
if (!Array.isArray(value)) return [];
|
|
35
35
|
return value.filter((v) => typeof v === "string");
|
|
36
36
|
}
|
|
37
|
+
function compareTwoStrings(first, second) {
|
|
38
|
+
const normalizedFirst = first.replace(/\s+/g, "");
|
|
39
|
+
const normalizedSecond = second.replace(/\s+/g, "");
|
|
40
|
+
if (normalizedFirst === normalizedSecond) return 1;
|
|
41
|
+
if (normalizedFirst.length < 2 || normalizedSecond.length < 2) return 0;
|
|
42
|
+
const firstBigrams = /* @__PURE__ */ new Map();
|
|
43
|
+
for (let index = 0; index < normalizedFirst.length - 1; index++) {
|
|
44
|
+
const bigram = normalizedFirst.slice(index, index + 2);
|
|
45
|
+
firstBigrams.set(bigram, (firstBigrams.get(bigram) ?? 0) + 1);
|
|
46
|
+
}
|
|
47
|
+
let intersectionSize = 0;
|
|
48
|
+
for (let index = 0; index < normalizedSecond.length - 1; index++) {
|
|
49
|
+
const bigram = normalizedSecond.slice(index, index + 2);
|
|
50
|
+
const remaining = firstBigrams.get(bigram) ?? 0;
|
|
51
|
+
if (remaining === 0) continue;
|
|
52
|
+
firstBigrams.set(bigram, remaining - 1);
|
|
53
|
+
intersectionSize++;
|
|
54
|
+
}
|
|
55
|
+
return 2 * intersectionSize / (normalizedFirst.length + normalizedSecond.length - 2);
|
|
56
|
+
}
|
|
37
57
|
const NEAR_DUP_THRESHOLD = 0.82;
|
|
38
58
|
function findNearDuplicates(tags, helpers) {
|
|
39
59
|
const pairs = [];
|
|
@@ -151,6 +171,7 @@ export {
|
|
|
151
171
|
audit,
|
|
152
172
|
buildIndex,
|
|
153
173
|
collectMdxFiles,
|
|
174
|
+
compareTwoStrings,
|
|
154
175
|
findNearDuplicates,
|
|
155
176
|
formatTextReport,
|
|
156
177
|
hasHardIssues,
|
|
@@ -57,7 +57,7 @@ export interface SiteTreeNavProps {
|
|
|
57
57
|
initiallyCollapsedCategorySlugs?: string[];
|
|
58
58
|
/** Locale used by dated note-tray rows. */
|
|
59
59
|
locale?: string;
|
|
60
|
-
/**
|
|
60
|
+
/** @deprecated — no longer rendered (created date only). */
|
|
61
61
|
updatedLabel?: string;
|
|
62
62
|
}
|
|
63
63
|
|
|
@@ -332,11 +332,6 @@ function NoteTrayRow({
|
|
|
332
332
|
)}
|
|
333
333
|
<span className="min-w-0">
|
|
334
334
|
<span>{item.label}</span>
|
|
335
|
-
{item.updated && (
|
|
336
|
-
<span className="block text-micro text-muted">
|
|
337
|
-
{updatedLabel} {formatDate(item.updated, locale)}
|
|
338
|
-
</span>
|
|
339
|
-
)}
|
|
340
335
|
</span>
|
|
341
336
|
</a>
|
|
342
337
|
);
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@takazudo/zudo-doc",
|
|
3
|
-
"version": "5.
|
|
3
|
+
"version": "5.12.1",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "zudo-doc framework primitives layer that sits on top of zfb's engine — sidebar, theme, TOC, breadcrumb, layouts, head injection, View Transitions, SSR-skip wrappers (per ADR-003).",
|
|
6
6
|
"license": "MIT",
|
|
@@ -634,10 +634,10 @@
|
|
|
634
634
|
],
|
|
635
635
|
"peerDependencies": {
|
|
636
636
|
"@takazudo/zdtp": "^0.4.12",
|
|
637
|
-
"@takazudo/zfb": "^2.10.
|
|
638
|
-
"@takazudo/zfb-md-wasm": "^2.10.
|
|
639
|
-
"@takazudo/zfb-runtime": "^2.10.
|
|
640
|
-
"@takazudo/zudo-doc-history-server": "^5.
|
|
637
|
+
"@takazudo/zfb": "^2.10.1",
|
|
638
|
+
"@takazudo/zfb-md-wasm": "^2.10.1",
|
|
639
|
+
"@takazudo/zfb-runtime": "^2.10.1",
|
|
640
|
+
"@takazudo/zudo-doc-history-server": "^5.12.0",
|
|
641
641
|
"diff": "^8.0.0",
|
|
642
642
|
"katex": "^0.16.0",
|
|
643
643
|
"preact": "^10.29.1",
|
|
@@ -669,18 +669,16 @@
|
|
|
669
669
|
"picocolors": "^1.1.1",
|
|
670
670
|
"pluralize": "^8.0.0",
|
|
671
671
|
"smol-toml": "^1.8.0",
|
|
672
|
-
"string-similarity": "^4.0.4",
|
|
673
672
|
"tsx": "^4.21.0"
|
|
674
673
|
},
|
|
675
674
|
"devDependencies": {
|
|
676
|
-
"@takazudo/zfb": "2.10.
|
|
677
|
-
"@takazudo/zfb-md-wasm": "2.10.
|
|
678
|
-
"@takazudo/zfb-runtime": "2.10.
|
|
675
|
+
"@takazudo/zfb": "2.10.1",
|
|
676
|
+
"@takazudo/zfb-md-wasm": "2.10.1",
|
|
677
|
+
"@takazudo/zfb-runtime": "2.10.1",
|
|
679
678
|
"@types/fs-extra": "^11.0.4",
|
|
680
679
|
"@types/minimist": "^1.2.5",
|
|
681
680
|
"@types/node": "^25.3.5",
|
|
682
681
|
"@types/pluralize": "^0.0.33",
|
|
683
|
-
"@types/string-similarity": "^4.0.2",
|
|
684
682
|
"happy-dom": "^20.10.6",
|
|
685
683
|
"npm-run-all2": "^7.0.2",
|
|
686
684
|
"preact": "^10.29.1",
|
|
@@ -689,7 +687,7 @@
|
|
|
689
687
|
"typescript": "^5.0.0",
|
|
690
688
|
"vitest": "^4.1.0",
|
|
691
689
|
"zod": "^4.3.6",
|
|
692
|
-
"@takazudo/zudo-doc-history-server": "5.
|
|
690
|
+
"@takazudo/zudo-doc-history-server": "5.12.1"
|
|
693
691
|
},
|
|
694
692
|
"scripts": {
|
|
695
693
|
"gen:search-widget-script": "node scripts/gen-search-widget-script.mjs",
|