@takazudo/zudo-doc 5.25.0 → 5.26.0
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 +21 -2
- package/dist/compiled.css +6 -34
- package/dist/config-assertions/index.d.ts +26 -0
- package/dist/config-assertions/index.js +12 -0
- package/dist/config.d.ts +18 -0
- package/dist/config.js +5 -1
- package/dist/header/header.js +2 -1
- package/dist/home-page/index.js +1 -1
- package/dist/integrations/changelog/generate.js +8 -2
- package/dist/integrations/changelog/links.d.ts +25 -0
- package/dist/integrations/changelog/links.js +280 -0
- package/dist/plugins/zdtp-loader.js +1 -1
- package/dist/preset.d.ts +11 -1
- package/dist/preset.js +12 -5
- package/dist/safelist.css +1 -1
- package/dist/settings.d.ts +7 -0
- package/dist/sidebar-toggle-island/index.js +1 -1
- package/dist/theme-packs/riso/pack.css +6 -4
- package/dist/theme-packs/swissgrid/pack.css +7 -4
- package/eject/header/header.tsx +11 -1
- package/eject/sidebar-toggle-island/index.tsx +1 -1
- package/package.json +8 -8
package/CHANGELOG.md
CHANGED
|
@@ -8,6 +8,23 @@ The format is based on Keep a Changelog, and release notes are generated from th
|
|
|
8
8
|
|
|
9
9
|
No unreleased changes.
|
|
10
10
|
|
|
11
|
+
## [5.26.0] - 2026-09-20
|
|
12
|
+
|
|
13
|
+
### Features
|
|
14
|
+
|
|
15
|
+
- Added a `bundleZdtp` setting so hosts can keep the real `@takazudo/zdtp` loader while mounting their own panel with `designTokenPanel: false`. The setting defaults to `designTokenPanel`, preserving existing behavior; the invalid `designTokenPanel: true` plus `bundleZdtp: false` combination is rejected before it can ship a mounted panel backed by the throwing stub. (28bb8e8e4)
|
|
16
|
+
|
|
17
|
+
### Bug Fixes
|
|
18
|
+
|
|
19
|
+
- `gen:changelog` now rewrites relative `.md`/`.mdx` links to emitted entries as in-file anchors and unlinks other relative document links, keeping published package changelogs free of source-tree-only URLs. It also preserves parenthesized link titles, accounts for Setext headings when suffixing duplicate anchors, and retains case-sensitive filename matching. (267b27d12, 290fb0214)
|
|
20
|
+
- Long site names no longer push the mobile header's right-side controls outside a narrow viewport at increased browser font sizes. The site-name link truncates with an ellipsis while its `title` preserves the full text, and the hamburger button no longer shrinks. Swissgrid and Riso also retain their flat truncation treatment with corrected marker baselines. (cc3a3b053, 104841612, 44fd94899)
|
|
21
|
+
- Home-page hero headings now wrap long unbroken words instead of overflowing their container. (c7e058f68)
|
|
22
|
+
|
|
23
|
+
### Other Changes
|
|
24
|
+
|
|
25
|
+
- The `@takazudo/zfb`, `@takazudo/zfb-runtime`, and `@takazudo/zfb-md-wasm` peer dependency floors are now `^2.19.0`. zfb 2.19 adds an opt-in build-shadow diagnostic mode and a parser dependency patch verified equivalent across all 18 upstream baseline cases; it requires no zudo-doc config migration. (4c2048528)
|
|
26
|
+
- Investigated a reported package-route resolution failure on zfb 2.18.0 across 11 consumer topologies, including the reporter's pnpm-workspace symlink shape, without reproducing it. No runtime code or workaround changed; the diagnostic findings remain documented for affected users. (0bd27b8e9)
|
|
27
|
+
|
|
11
28
|
## [5.25.0] - 2026-09-16
|
|
12
29
|
|
|
13
30
|
### Features
|
|
@@ -255,6 +272,9 @@ No unreleased changes.
|
|
|
255
272
|
|
|
256
273
|
### Other Changes
|
|
257
274
|
|
|
275
|
+
- Enabled Asset Viewer routes now localize automatically for existing multi-locale consumers after a package bump, unless `/${assetViewerRoutePrefix}/` is explicitly present in `defaultLocaleOnlyPrefixes`. (#3820)
|
|
276
|
+
- Migration: because the resource indexes are now locale-owned, a resource section only stays default-locale-only when `defaultLocaleOnlyPrefixes` lists its **overview** prefix — `/docs/claude/` or `/docs/codex/` — alongside the sub-section prefixes (`/docs/claude-md/`, `/docs/claude-skills/`, `/docs/claude-agents/`, `/docs/claude-commands/`, and the Codex equivalents). Listing only the sub-section prefixes does not make the section default-locale-only. With the overview prefix missing, the overview index is generated into every configured locale; if that locale directory already holds an authored `claude/index.mdx` without `generated: true` in its frontmatter, the build fails with `resource-docs: refusing to overwrite authored locale index`. Either add the overview prefix, or remove the authored index and move its title, description, and labels to `ZudoDocConfig.translations`. Remove the prefixes entirely for resource sections you want generated in every configured locale. The rule and both ways out are in the Internationalization guide, under Default-Locale-Only Prefixes. (#3820)
|
|
277
|
+
- Migration: before building with 5.15.0, remove or rename any authored locale resource overview/category `index.mdx` at a generator target and move custom titles, descriptions, and labels to `ZudoDocConfig.translations`. The generator refuses to overwrite an existing file unless its frontmatter contains `generated: true`. (#3820)
|
|
258
278
|
- Updated the zfb peer family to 2.14.2. (`5c5bfd2f`)
|
|
259
279
|
|
|
260
280
|
## [5.14.0] - 2026-08-31
|
|
@@ -276,8 +296,7 @@ No unreleased changes.
|
|
|
276
296
|
|
|
277
297
|
### Other Changes
|
|
278
298
|
|
|
279
|
-
-
|
|
280
|
-
- Migration: before building with 5.14.0, remove or rename any authored locale resource overview/category `index.mdx` at a generator target and move custom titles, descriptions, and labels to `ZudoDocConfig.translations`. The generator refuses to overwrite an existing file unless its frontmatter contains `generated: true`. (#3820)
|
|
299
|
+
- Locale-owned Claude/Codex resource indexes and automatically localized Asset Viewer routes ship in [5.15.0](#5150---2026-09-01), not in this release. Before moving on to 5.15.0, add `/docs/claude/` and `/docs/codex/` to `defaultLocaleOnlyPrefixes` if those sections should stay default-locale-only — or remove any authored locale resource `index.mdx` and move its title, description, and labels to `ZudoDocConfig.translations`. The 5.15.0 entry has the full migration. (#3820)
|
|
281
300
|
- Updated the zfb peer family to 2.14.0, `@takazudo/zdtp` to 0.4.14, and the doc-history-server peer floor to 5.13.1. (`dbe8553c7`, `038870c94`, `95a82f15f`)
|
|
282
301
|
|
|
283
302
|
## [5.13.1] - 2026-08-28
|
package/dist/compiled.css
CHANGED
|
@@ -363,9 +363,6 @@
|
|
|
363
363
|
.isolate {
|
|
364
364
|
isolation: isolate;
|
|
365
365
|
}
|
|
366
|
-
.z-50 {
|
|
367
|
-
z-index: 50;
|
|
368
|
-
}
|
|
369
366
|
.z-9999 {
|
|
370
367
|
z-index: 9999;
|
|
371
368
|
}
|
|
@@ -552,9 +549,6 @@
|
|
|
552
549
|
.inline-flex {
|
|
553
550
|
display: inline-flex;
|
|
554
551
|
}
|
|
555
|
-
.list-item {
|
|
556
|
-
display: list-item;
|
|
557
|
-
}
|
|
558
552
|
.table {
|
|
559
553
|
display: table;
|
|
560
554
|
}
|
|
@@ -808,6 +802,9 @@
|
|
|
808
802
|
.flex-1 {
|
|
809
803
|
flex: 1;
|
|
810
804
|
}
|
|
805
|
+
.shrink {
|
|
806
|
+
flex-shrink: 1;
|
|
807
|
+
}
|
|
811
808
|
.shrink-0 {
|
|
812
809
|
flex-shrink: 0;
|
|
813
810
|
}
|
|
@@ -858,9 +855,6 @@
|
|
|
858
855
|
.grid-cols-\[auto_1fr\] {
|
|
859
856
|
grid-template-columns: auto 1fr;
|
|
860
857
|
}
|
|
861
|
-
.grid-cols-\[repeat\(auto-fit\,minmax\(12rem\,1fr\)\)\] {
|
|
862
|
-
grid-template-columns: repeat(auto-fit,minmax(12rem,1fr));
|
|
863
|
-
}
|
|
864
858
|
.grid-rows-\[auto_auto\] {
|
|
865
859
|
grid-template-rows: auto auto;
|
|
866
860
|
}
|
|
@@ -1323,9 +1317,6 @@
|
|
|
1323
1317
|
.pt-vsp-xs {
|
|
1324
1318
|
padding-top: var(--spacing-vsp-xs);
|
|
1325
1319
|
}
|
|
1326
|
-
.pr-\[4px\] {
|
|
1327
|
-
padding-right: 4px;
|
|
1328
|
-
}
|
|
1329
1320
|
.pr-hsp-lg {
|
|
1330
1321
|
padding-right: var(--spacing-hsp-lg);
|
|
1331
1322
|
}
|
|
@@ -1456,6 +1447,9 @@
|
|
|
1456
1447
|
.break-words {
|
|
1457
1448
|
overflow-wrap: break-word;
|
|
1458
1449
|
}
|
|
1450
|
+
.wrap-anywhere {
|
|
1451
|
+
overflow-wrap: anywhere;
|
|
1452
|
+
}
|
|
1459
1453
|
.whitespace-nowrap {
|
|
1460
1454
|
white-space: nowrap;
|
|
1461
1455
|
}
|
|
@@ -1465,18 +1459,9 @@
|
|
|
1465
1459
|
.text-accent {
|
|
1466
1460
|
color: var(--color-accent);
|
|
1467
1461
|
}
|
|
1468
|
-
.text-accent-hover {
|
|
1469
|
-
color: var(--color-accent-hover);
|
|
1470
|
-
}
|
|
1471
1462
|
.text-bg {
|
|
1472
1463
|
color: var(--color-bg);
|
|
1473
1464
|
}
|
|
1474
|
-
.text-bg\/70 {
|
|
1475
|
-
color: var(--color-bg);
|
|
1476
|
-
@supports (color: color-mix(in lab, red, red)) {
|
|
1477
|
-
color: color-mix(in oklab, var(--color-bg) 70%, transparent);
|
|
1478
|
-
}
|
|
1479
|
-
}
|
|
1480
1465
|
.text-chat-assistant-text {
|
|
1481
1466
|
color: var(--color-chat-assistant-text);
|
|
1482
1467
|
}
|
|
@@ -1546,10 +1531,6 @@
|
|
|
1546
1531
|
.opacity-60 {
|
|
1547
1532
|
opacity: 60%;
|
|
1548
1533
|
}
|
|
1549
|
-
.shadow-\[0_1px_3px_color-mix\(in_srgb\,transparent\)\] {
|
|
1550
|
-
--tw-shadow: 0 1px 3px var(--tw-shadow-color, color-mix(in srgb,transparent));
|
|
1551
|
-
box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
|
|
1552
|
-
}
|
|
1553
1534
|
.shadow-\[0_1px_3px_color-mix\(in_srgb\,var\(--color-fg\)_8\%\,transparent\)\] {
|
|
1554
1535
|
--tw-shadow: 0 1px 3px var(--tw-shadow-color, var(--color-fg));
|
|
1555
1536
|
@supports (color: color-mix(in lab, red, red)) {
|
|
@@ -1557,10 +1538,6 @@
|
|
|
1557
1538
|
}
|
|
1558
1539
|
box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
|
|
1559
1540
|
}
|
|
1560
|
-
.shadow-\[0_1px_3px_color-mix\(in_srgb\,…\)\] {
|
|
1561
|
-
--tw-shadow: 0 1px 3px var(--tw-shadow-color, color-mix(in srgb,…));
|
|
1562
|
-
box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
|
|
1563
|
-
}
|
|
1564
1541
|
.shadow-lg {
|
|
1565
1542
|
--tw-shadow: 0 10px 15px -3px var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 4px 6px -4px var(--tw-shadow-color, rgb(0 0 0 / 0.1));
|
|
1566
1543
|
box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
|
|
@@ -1580,10 +1557,6 @@
|
|
|
1580
1557
|
outline-style: var(--tw-outline-style);
|
|
1581
1558
|
outline-width: 1px;
|
|
1582
1559
|
}
|
|
1583
|
-
.sepia {
|
|
1584
|
-
--tw-sepia: sepia(100%);
|
|
1585
|
-
filter: var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,);
|
|
1586
|
-
}
|
|
1587
1560
|
.filter {
|
|
1588
1561
|
filter: var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,);
|
|
1589
1562
|
}
|
|
@@ -2345,7 +2318,6 @@
|
|
|
2345
2318
|
--color-zd-chat-assistant-text: var(--zd-chat-assistant-text);
|
|
2346
2319
|
--color-zd-matched-keyword-bg: var(--zd-matched-keyword-bg);
|
|
2347
2320
|
--color-zd-matched-keyword-fg: var(--zd-matched-keyword-fg);
|
|
2348
|
-
--z-index-content: 0;
|
|
2349
2321
|
--z-index-local-1: 1;
|
|
2350
2322
|
--z-index-local-2: 2;
|
|
2351
2323
|
--z-index-sidebar: 10;
|
|
@@ -42,6 +42,32 @@ export interface EmptyStringFaviconOrLogoSubject {
|
|
|
42
42
|
* object is not an empty string).
|
|
43
43
|
*/
|
|
44
44
|
export declare function assertNoEmptyStringFaviconOrLogo(settings: EmptyStringFaviconOrLogoSubject): void;
|
|
45
|
+
/** Structural subset of `Settings` the zdtp-bundling helpers read. */
|
|
46
|
+
export interface ZdtpBundlingSubject {
|
|
47
|
+
designTokenPanel?: boolean;
|
|
48
|
+
bundleZdtp?: boolean;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Resolve whether `@takazudo/zdtp` is bundled into the island build.
|
|
52
|
+
*
|
|
53
|
+
* `bundleZdtp` is optional and carries NO `DEFAULT_SETTINGS` key — its default
|
|
54
|
+
* is derived here, at the read site, from `designTokenPanel`. So a project
|
|
55
|
+
* that never heard of `bundleZdtp` keeps exactly today's behaviour (#4201):
|
|
56
|
+
* panel off → zdtp shadowed, panel on → zdtp bundled. Setting `bundleZdtp`
|
|
57
|
+
* explicitly decouples the two, which is the whole point (#4261): a host that
|
|
58
|
+
* mounts its own panel through `@takazudo/zudo-doc/design-token-panel-bootstrap`
|
|
59
|
+
* needs the real loader while the package panel stays off.
|
|
60
|
+
*/
|
|
61
|
+
export declare function resolvesBundleZdtp(settings: ZdtpBundlingSubject): boolean;
|
|
62
|
+
/**
|
|
63
|
+
* Reject `designTokenPanel: true` together with `bundleZdtp: false`.
|
|
64
|
+
*
|
|
65
|
+
* That pair mounts the package-owned panel while shadowing
|
|
66
|
+
* `@takazudo/zudo-doc/zdtp-loader` with a throwing stub, so the panel's
|
|
67
|
+
* `loadZdtp()` is guaranteed to reject at runtime — a green build that breaks
|
|
68
|
+
* in the browser. Fail loudly at config resolution instead (#4261).
|
|
69
|
+
*/
|
|
70
|
+
export declare function assertZdtpBundlingConsistent(settings: ZdtpBundlingSubject): void;
|
|
45
71
|
/**
|
|
46
72
|
* Warn about `categoryMatch` values that cannot express the intended
|
|
47
73
|
* dropdown grouping.
|
|
@@ -19,6 +19,16 @@ function assertNoEmptyStringFaviconOrLogo(settings) {
|
|
|
19
19
|
}
|
|
20
20
|
}
|
|
21
21
|
}
|
|
22
|
+
function resolvesBundleZdtp(settings) {
|
|
23
|
+
return settings.bundleZdtp ?? settings.designTokenPanel === true;
|
|
24
|
+
}
|
|
25
|
+
function assertZdtpBundlingConsistent(settings) {
|
|
26
|
+
if (settings.designTokenPanel === true && settings.bundleZdtp === false) {
|
|
27
|
+
throw new TypeError(
|
|
28
|
+
"Invalid combination: designTokenPanel: true with bundleZdtp: false. The package-owned design token panel needs @takazudo/zdtp in the build, but bundleZdtp: false shadows @takazudo/zudo-doc/zdtp-loader with a throwing stub, so the panel would fail to load at runtime. Drop bundleZdtp (it follows designTokenPanel by default), or set designTokenPanel: false if you only meant to keep zdtp out of the build."
|
|
29
|
+
);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
22
32
|
function warnAmbiguousDropdownCategoryMatch(headerNav, logger = console) {
|
|
23
33
|
if (!headerNav) return;
|
|
24
34
|
for (const item of headerNav) {
|
|
@@ -60,5 +70,7 @@ function warnAmbiguousDropdownCategoryMatch(headerNav, logger = console) {
|
|
|
60
70
|
}
|
|
61
71
|
export {
|
|
62
72
|
assertNoEmptyStringFaviconOrLogo,
|
|
73
|
+
assertZdtpBundlingConsistent,
|
|
74
|
+
resolvesBundleZdtp,
|
|
63
75
|
warnAmbiguousDropdownCategoryMatch
|
|
64
76
|
};
|
package/dist/config.d.ts
CHANGED
|
@@ -340,6 +340,24 @@ export interface ZudoDocConfig {
|
|
|
340
340
|
* @default false
|
|
341
341
|
*/
|
|
342
342
|
designTokenPanel?: boolean;
|
|
343
|
+
/**
|
|
344
|
+
* Bundle `@takazudo/zdtp` into the island build. Controls ONLY whether
|
|
345
|
+
* `@takazudo/zudo-doc/zdtp-loader` resolves to the real zdtp re-export or to
|
|
346
|
+
* a throwing stub — it never mounts the package panel or its header trigger
|
|
347
|
+
* (that stays `designTokenPanel`'s job).
|
|
348
|
+
*
|
|
349
|
+
* Set it to `true` when the host mounts its OWN panel through
|
|
350
|
+
* `@takazudo/zudo-doc/design-token-panel-bootstrap` while leaving
|
|
351
|
+
* `designTokenPanel` off (#4261); otherwise the bootstrap's `loadZdtp()`
|
|
352
|
+
* hits the stub and rejects at runtime. The host must then have
|
|
353
|
+
* `@takazudo/zdtp` installed — it is an optional peer, and the build fails
|
|
354
|
+
* resolving `zdtp-loader` if it is missing.
|
|
355
|
+
*
|
|
356
|
+
* `designTokenPanel: true` with `bundleZdtp: false` is rejected at config
|
|
357
|
+
* resolution: a mounted package panel with a stubbed loader can only throw.
|
|
358
|
+
* @default undefined (follows designTokenPanel)
|
|
359
|
+
*/
|
|
360
|
+
bundleZdtp?: boolean;
|
|
343
361
|
/**
|
|
344
362
|
* Minimum heading depth included in the TOC (2–4).
|
|
345
363
|
* @default 2
|
package/dist/config.js
CHANGED
|
@@ -4,7 +4,10 @@ import { defaultDirectiveVocabulary } from "./directive-vocabulary-defaults/inde
|
|
|
4
4
|
import { defaultTranslations } from "./i18n-defaults/index.js";
|
|
5
5
|
import { defaultColorSchemes } from "./color-schemes-defaults/index.js";
|
|
6
6
|
import { assertNoCommaInVersionSlugs } from "./version-availability/index.js";
|
|
7
|
-
import {
|
|
7
|
+
import {
|
|
8
|
+
assertNoEmptyStringFaviconOrLogo,
|
|
9
|
+
assertZdtpBundlingConsistent
|
|
10
|
+
} from "./config-assertions/index.js";
|
|
8
11
|
import { validateAssetViewerSettings } from "./asset-path/index.js";
|
|
9
12
|
function mergeDefaultTranslations(overrides) {
|
|
10
13
|
if (overrides === void 0) return defaultTranslations;
|
|
@@ -148,6 +151,7 @@ function zudoDoc(user = {}) {
|
|
|
148
151
|
);
|
|
149
152
|
assertNoCommaInVersionSlugs(settings.versions);
|
|
150
153
|
assertNoEmptyStringFaviconOrLogo(settings);
|
|
154
|
+
assertZdtpBundlingConsistent(settings);
|
|
151
155
|
const fragment = zudoDocPreset({
|
|
152
156
|
settings,
|
|
153
157
|
buildDocsSchema: userBuildDocsSchema ?? (() => defaultBuildDocsSchema({
|
package/dist/header/header.js
CHANGED
|
@@ -65,7 +65,8 @@ function Header(props) {
|
|
|
65
65
|
"a",
|
|
66
66
|
{
|
|
67
67
|
href: urlHelpers.withBase(isNonDefaultLocale ? `/${lang}/` : "/"),
|
|
68
|
-
class: "
|
|
68
|
+
class: "min-w-0 truncate text-title font-bold text-fg hover:underline focus:underline",
|
|
69
|
+
title: siteName,
|
|
69
70
|
"data-header-logo": true,
|
|
70
71
|
children: siteName
|
|
71
72
|
}
|
package/dist/home-page/index.js
CHANGED
|
@@ -168,7 +168,7 @@ function createHomePageView(ctx) {
|
|
|
168
168
|
}
|
|
169
169
|
) : null,
|
|
170
170
|
/* @__PURE__ */ jsxs("div", { class: "zd-home-copy min-w-0 lg:flex-1", children: [
|
|
171
|
-
/* @__PURE__ */ jsx("h1", { class: "text-heading font-bold mb-vsp-2xs
|
|
171
|
+
/* @__PURE__ */ jsx("h1", { class: "text-heading font-bold mb-vsp-2xs wrap-anywhere", children: settings.siteName }),
|
|
172
172
|
/* @__PURE__ */ jsx("p", { class: "text-muted text-small mb-vsp-sm", children: rawDescription }),
|
|
173
173
|
/* @__PURE__ */ jsx("div", { class: "zd-home-links flex flex-wrap items-center justify-center lg:justify-start gap-hsp-md text-small", children: rowItems.map((item, index) => /* @__PURE__ */ jsxs(Fragment2, { children: [
|
|
174
174
|
index > 0 && /* @__PURE__ */ jsx("span", { class: "text-muted", children: "/" }),
|
|
@@ -1,3 +1,8 @@
|
|
|
1
|
+
import {
|
|
2
|
+
buildChangelogAnchorMap,
|
|
3
|
+
formatChangelogEntryHeadingText,
|
|
4
|
+
rewriteChangelogEntryLinks
|
|
5
|
+
} from "./links.js";
|
|
1
6
|
function generateChangelogMarkdown(entries, options = {}) {
|
|
2
7
|
const title = options.title ?? "Changelog";
|
|
3
8
|
const lines = [`# ${title}`, ""];
|
|
@@ -8,12 +13,13 @@ function generateChangelogMarkdown(entries, options = {}) {
|
|
|
8
13
|
}
|
|
9
14
|
lines.push("");
|
|
10
15
|
lines.push("The format is based on Keep a Changelog, and release notes are generated from the changelog MDX pages.");
|
|
16
|
+
const anchorsByFilename = buildChangelogAnchorMap(title, entries);
|
|
11
17
|
for (const entry of entries) {
|
|
12
18
|
lines.push("");
|
|
13
|
-
lines.push(
|
|
19
|
+
lines.push(`## ${formatChangelogEntryHeadingText(entry)}`);
|
|
14
20
|
if (entry.content) {
|
|
15
21
|
lines.push("");
|
|
16
|
-
lines.push(entry.content);
|
|
22
|
+
lines.push(rewriteChangelogEntryLinks(entry.content, anchorsByFilename));
|
|
17
23
|
}
|
|
18
24
|
}
|
|
19
25
|
lines.push("");
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { ChangelogEntry } from "./types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Heading text shared by the emitted `## [version] - date` line and the
|
|
4
|
+
* anchor map, so the two cannot drift out of step with each other.
|
|
5
|
+
*/
|
|
6
|
+
export declare function formatChangelogEntryHeadingText(entry: Pick<ChangelogEntry, "version" | "date">): string;
|
|
7
|
+
/**
|
|
8
|
+
* Build the anchor map (exact source filename -> in-file anchor) for a full
|
|
9
|
+
* generated changelog document. Anchors must reflect the WHOLE document's
|
|
10
|
+
* heading order, not just the version headings: the `# <title>` line and any
|
|
11
|
+
* ATX or setext headings inside entry bodies consume slugs too, and an earlier
|
|
12
|
+
* entry's body heading can shift a later entry's anchor via GitHub's `-1`,
|
|
13
|
+
* `-2`, … de-duplication.
|
|
14
|
+
*/
|
|
15
|
+
export declare function buildChangelogAnchorMap(title: string, entries: readonly ChangelogEntry[]): ReadonlyMap<string, string>;
|
|
16
|
+
/**
|
|
17
|
+
* Rewrite one entry's already-sanitized markdown content: same-directory
|
|
18
|
+
* `.md`/`.mdx` links to another emitted entry become an in-file anchor link
|
|
19
|
+
* (`#<anchor>`, original `#fragment` dropped, title preserved); any other
|
|
20
|
+
* relative `.md`/`.mdx` link is unlinked to its label text. Everything else
|
|
21
|
+
* (absolute URLs, protocol-relative, root-absolute, pure fragments, images,
|
|
22
|
+
* other extensions, reference-style links, and anything inside fenced or
|
|
23
|
+
* inline code) passes through byte-unchanged.
|
|
24
|
+
*/
|
|
25
|
+
export declare function rewriteChangelogEntryLinks(content: string, anchorByFilename: ReadonlyMap<string, string>): string;
|
|
@@ -0,0 +1,280 @@
|
|
|
1
|
+
import { basename } from "node:path";
|
|
2
|
+
function formatChangelogEntryHeadingText(entry) {
|
|
3
|
+
return entry.date ? `[${entry.version}] - ${entry.date}` : `[${entry.version}]`;
|
|
4
|
+
}
|
|
5
|
+
const GITHUB_SLUG_ALLOWED_RE = /[\p{L}\p{N}_\- ]/u;
|
|
6
|
+
function githubSlugify(text) {
|
|
7
|
+
let out = "";
|
|
8
|
+
for (const ch of text.toLowerCase()) {
|
|
9
|
+
if (GITHUB_SLUG_ALLOWED_RE.test(ch)) {
|
|
10
|
+
out += ch === " " ? "-" : ch;
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
return out;
|
|
14
|
+
}
|
|
15
|
+
class GithubSlugAllocator {
|
|
16
|
+
seen = /* @__PURE__ */ new Map();
|
|
17
|
+
allocate(text) {
|
|
18
|
+
const slug = githubSlugify(text);
|
|
19
|
+
const count = this.seen.get(slug) ?? 0;
|
|
20
|
+
this.seen.set(slug, count + 1);
|
|
21
|
+
return count === 0 ? slug : `${slug}-${count}`;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
function stripInlineLinkSyntax(text) {
|
|
25
|
+
return text.replace(/!?\[([^\]]*)\]\([^)]*\)/g, "$1");
|
|
26
|
+
}
|
|
27
|
+
function isSetextParagraphLine(line) {
|
|
28
|
+
const text = line.trim();
|
|
29
|
+
return /^ {0,3}\S/.test(line) && !/^#{1,6}(?:[ \t]|$)/.test(text) && !/^(?:[-+*]|\d{1,9}[.)])(?:[ \t]|$)/.test(text) && !text.startsWith(">") && !text.includes("|") && !/^(?:(?:\*[ \t]*){3,}|(?:_[ \t]*){3,}|(?:-[ \t]*){3,})$/.test(text);
|
|
30
|
+
}
|
|
31
|
+
function extractHeadingTexts(content) {
|
|
32
|
+
const headings = [];
|
|
33
|
+
let fenceChar = null;
|
|
34
|
+
let fenceLen = 0;
|
|
35
|
+
let paragraphLineCount = 0;
|
|
36
|
+
let paragraphLine = "";
|
|
37
|
+
for (const line of content.split("\n")) {
|
|
38
|
+
const trimmed = line.trimStart();
|
|
39
|
+
const fenceMatch = /^([`~]{3,})/.exec(trimmed);
|
|
40
|
+
if (fenceMatch) {
|
|
41
|
+
paragraphLineCount = 0;
|
|
42
|
+
const fence = fenceMatch[1];
|
|
43
|
+
if (fence === void 0) continue;
|
|
44
|
+
if (fenceChar === null) {
|
|
45
|
+
fenceChar = fence[0] ?? null;
|
|
46
|
+
fenceLen = fence.length;
|
|
47
|
+
} else if (fence[0] === fenceChar && fence.length >= fenceLen) {
|
|
48
|
+
fenceChar = null;
|
|
49
|
+
}
|
|
50
|
+
continue;
|
|
51
|
+
}
|
|
52
|
+
if (fenceChar !== null) continue;
|
|
53
|
+
const headingMatch = /^(#{1,6})[ \t]+(.+)$/.exec(line.trim());
|
|
54
|
+
if (headingMatch) {
|
|
55
|
+
paragraphLineCount = 0;
|
|
56
|
+
const rawText = headingMatch[2];
|
|
57
|
+
if (rawText === void 0) continue;
|
|
58
|
+
const text = stripInlineLinkSyntax(rawText.trim().replace(/\s+#+\s*$/, ""));
|
|
59
|
+
headings.push(text);
|
|
60
|
+
continue;
|
|
61
|
+
}
|
|
62
|
+
if (/^ {0,3}(=+|-+)[ \t]*$/.test(line)) {
|
|
63
|
+
if (paragraphLineCount === 1) {
|
|
64
|
+
headings.push(stripInlineLinkSyntax(paragraphLine));
|
|
65
|
+
}
|
|
66
|
+
paragraphLineCount = 0;
|
|
67
|
+
continue;
|
|
68
|
+
}
|
|
69
|
+
if (isSetextParagraphLine(line)) {
|
|
70
|
+
paragraphLine = line.trim();
|
|
71
|
+
paragraphLineCount += 1;
|
|
72
|
+
} else {
|
|
73
|
+
paragraphLineCount = 0;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
return headings;
|
|
77
|
+
}
|
|
78
|
+
function buildChangelogAnchorMap(title, entries) {
|
|
79
|
+
const allocator = new GithubSlugAllocator();
|
|
80
|
+
allocator.allocate(title);
|
|
81
|
+
const anchors = /* @__PURE__ */ new Map();
|
|
82
|
+
for (const entry of entries) {
|
|
83
|
+
const anchor = allocator.allocate(formatChangelogEntryHeadingText(entry));
|
|
84
|
+
anchors.set(basename(entry.sourcePath), anchor);
|
|
85
|
+
for (const headingText of extractHeadingTexts(entry.content)) {
|
|
86
|
+
allocator.allocate(headingText);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
return anchors;
|
|
90
|
+
}
|
|
91
|
+
const FENCE_PLACEHOLDER_PREFIX = "\0CHANGELOG_LINK_FENCE_";
|
|
92
|
+
const INLINE_CODE_PLACEHOLDER_PREFIX = "\0CHANGELOG_LINK_CODE_";
|
|
93
|
+
const PLACEHOLDER_SUFFIX = "\0";
|
|
94
|
+
function protectCode(content) {
|
|
95
|
+
const stashed = [];
|
|
96
|
+
const stash = (prefix, value) => {
|
|
97
|
+
const token = `${prefix}${stashed.length}${PLACEHOLDER_SUFFIX}`;
|
|
98
|
+
stashed.push(value);
|
|
99
|
+
return token;
|
|
100
|
+
};
|
|
101
|
+
const outLines = [];
|
|
102
|
+
let fenceChar = null;
|
|
103
|
+
let fenceLen = 0;
|
|
104
|
+
let fenceBuf = [];
|
|
105
|
+
for (const line of content.split("\n")) {
|
|
106
|
+
const trimmed = line.trimStart();
|
|
107
|
+
const fenceMatch = /^([`~]{3,})/.exec(trimmed);
|
|
108
|
+
if (fenceChar === null) {
|
|
109
|
+
if (fenceMatch) {
|
|
110
|
+
const fence = fenceMatch[1];
|
|
111
|
+
if (fence !== void 0) {
|
|
112
|
+
fenceChar = fence[0] ?? null;
|
|
113
|
+
fenceLen = fence.length;
|
|
114
|
+
fenceBuf = [line];
|
|
115
|
+
continue;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
outLines.push(line);
|
|
119
|
+
} else {
|
|
120
|
+
fenceBuf.push(line);
|
|
121
|
+
if (fenceMatch) {
|
|
122
|
+
const fence = fenceMatch[1];
|
|
123
|
+
if (fence !== void 0 && fence[0] === fenceChar && fence.length >= fenceLen) {
|
|
124
|
+
outLines.push(stash(FENCE_PLACEHOLDER_PREFIX, fenceBuf.join("\n")));
|
|
125
|
+
fenceChar = null;
|
|
126
|
+
fenceBuf = [];
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
if (fenceChar !== null) {
|
|
132
|
+
outLines.push(...fenceBuf);
|
|
133
|
+
}
|
|
134
|
+
let text = outLines.join("\n");
|
|
135
|
+
text = text.replace(
|
|
136
|
+
/(`+)((?:(?!\n[ \t]*\n)[\s\S])*?)\1(?!`)/g,
|
|
137
|
+
(whole) => stash(INLINE_CODE_PLACEHOLDER_PREFIX, whole)
|
|
138
|
+
);
|
|
139
|
+
return {
|
|
140
|
+
text,
|
|
141
|
+
restore: (s) => {
|
|
142
|
+
let result = s;
|
|
143
|
+
for (let i = 0; i < stashed.length; i += 1) {
|
|
144
|
+
const value = stashed[i];
|
|
145
|
+
if (value === void 0) continue;
|
|
146
|
+
const fenceToken = `${FENCE_PLACEHOLDER_PREFIX}${i}${PLACEHOLDER_SUFFIX}`;
|
|
147
|
+
const codeToken = `${INLINE_CODE_PLACEHOLDER_PREFIX}${i}${PLACEHOLDER_SUFFIX}`;
|
|
148
|
+
result = result.split(fenceToken).join(value).split(codeToken).join(value);
|
|
149
|
+
}
|
|
150
|
+
return result;
|
|
151
|
+
}
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
function findMatchingDelimiter(text, start, open, close) {
|
|
155
|
+
let depth = 1;
|
|
156
|
+
let j = start;
|
|
157
|
+
while (j < text.length) {
|
|
158
|
+
const ch = text[j];
|
|
159
|
+
if (ch === "\\") {
|
|
160
|
+
j += 2;
|
|
161
|
+
continue;
|
|
162
|
+
}
|
|
163
|
+
if (ch === open) depth += 1;
|
|
164
|
+
else if (ch === close) {
|
|
165
|
+
depth -= 1;
|
|
166
|
+
if (depth === 0) return j;
|
|
167
|
+
}
|
|
168
|
+
j += 1;
|
|
169
|
+
}
|
|
170
|
+
return -1;
|
|
171
|
+
}
|
|
172
|
+
function parseLinkInner(inner) {
|
|
173
|
+
const trimmed = inner.trim();
|
|
174
|
+
if (trimmed === "") return { dest: "" };
|
|
175
|
+
let dest;
|
|
176
|
+
let rest;
|
|
177
|
+
if (trimmed.startsWith("<")) {
|
|
178
|
+
const closeIdx = trimmed.indexOf(">");
|
|
179
|
+
if (closeIdx === -1) return null;
|
|
180
|
+
dest = trimmed.slice(1, closeIdx);
|
|
181
|
+
rest = trimmed.slice(closeIdx + 1).trim();
|
|
182
|
+
} else {
|
|
183
|
+
const spaceIdx = trimmed.search(/\s/);
|
|
184
|
+
if (spaceIdx === -1) {
|
|
185
|
+
dest = trimmed;
|
|
186
|
+
rest = "";
|
|
187
|
+
} else {
|
|
188
|
+
dest = trimmed.slice(0, spaceIdx);
|
|
189
|
+
rest = trimmed.slice(spaceIdx).trim();
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
let title;
|
|
193
|
+
if (rest !== "") {
|
|
194
|
+
const quotedTitle = /^(["'])[\s\S]*\1$/.test(rest);
|
|
195
|
+
const parenthesizedTitle = rest.startsWith("(") && findMatchingDelimiter(rest, 1, "(", ")") === rest.length - 1;
|
|
196
|
+
if (!quotedTitle && !parenthesizedTitle) return null;
|
|
197
|
+
title = rest;
|
|
198
|
+
}
|
|
199
|
+
return { dest, title };
|
|
200
|
+
}
|
|
201
|
+
function scanLinks(text) {
|
|
202
|
+
const matches = [];
|
|
203
|
+
let i = 0;
|
|
204
|
+
while (i < text.length) {
|
|
205
|
+
if (text[i] === "[") {
|
|
206
|
+
const isImage = i > 0 && text[i - 1] === "!";
|
|
207
|
+
const labelStart = i + 1;
|
|
208
|
+
const labelEnd = findMatchingDelimiter(text, labelStart, "[", "]");
|
|
209
|
+
if (labelEnd !== -1 && text[labelEnd + 1] === "(") {
|
|
210
|
+
const parenStart = labelEnd + 2;
|
|
211
|
+
const parenEnd = findMatchingDelimiter(text, parenStart, "(", ")");
|
|
212
|
+
if (parenEnd !== -1) {
|
|
213
|
+
const parsed = parseLinkInner(text.slice(parenStart, parenEnd));
|
|
214
|
+
if (parsed) {
|
|
215
|
+
matches.push({
|
|
216
|
+
start: isImage ? i - 1 : i,
|
|
217
|
+
end: parenEnd + 1,
|
|
218
|
+
label: text.slice(labelStart, labelEnd),
|
|
219
|
+
dest: parsed.dest,
|
|
220
|
+
title: parsed.title,
|
|
221
|
+
isImage
|
|
222
|
+
});
|
|
223
|
+
i = parenEnd + 1;
|
|
224
|
+
continue;
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
i += 1;
|
|
230
|
+
}
|
|
231
|
+
return matches;
|
|
232
|
+
}
|
|
233
|
+
const URL_SCHEME_RE = /^[a-z][a-z0-9+.-]*:/i;
|
|
234
|
+
function parseRelativeDocLink(dest) {
|
|
235
|
+
const hashIdx = dest.indexOf("#");
|
|
236
|
+
const withoutFragment = hashIdx === -1 ? dest : dest.slice(0, hashIdx);
|
|
237
|
+
if (withoutFragment === "") return null;
|
|
238
|
+
if (!/\.(?:mdx|md)$/i.test(withoutFragment)) return null;
|
|
239
|
+
if (URL_SCHEME_RE.test(withoutFragment)) return null;
|
|
240
|
+
if (withoutFragment.startsWith("//")) return null;
|
|
241
|
+
if (withoutFragment.startsWith("/")) return null;
|
|
242
|
+
const normalized = withoutFragment.startsWith("./") ? withoutFragment.slice(2) : withoutFragment;
|
|
243
|
+
const sameDir = normalized.length > 0 && !normalized.includes("/");
|
|
244
|
+
return { sameDir, filename: normalized };
|
|
245
|
+
}
|
|
246
|
+
function rewriteChangelogEntryLinks(content, anchorByFilename) {
|
|
247
|
+
const { text: protectedText, restore } = protectCode(content);
|
|
248
|
+
const matches = scanLinks(protectedText);
|
|
249
|
+
let rewritten = "";
|
|
250
|
+
let cursor = 0;
|
|
251
|
+
for (const match of matches) {
|
|
252
|
+
rewritten += protectedText.slice(cursor, match.start);
|
|
253
|
+
if (match.isImage) {
|
|
254
|
+
rewritten += protectedText.slice(match.start, match.end);
|
|
255
|
+
cursor = match.end;
|
|
256
|
+
continue;
|
|
257
|
+
}
|
|
258
|
+
const parsed = parseRelativeDocLink(match.dest);
|
|
259
|
+
if (!parsed) {
|
|
260
|
+
rewritten += protectedText.slice(match.start, match.end);
|
|
261
|
+
cursor = match.end;
|
|
262
|
+
continue;
|
|
263
|
+
}
|
|
264
|
+
const anchor = parsed.sameDir ? anchorByFilename.get(parsed.filename) : void 0;
|
|
265
|
+
if (anchor === void 0) {
|
|
266
|
+
rewritten += match.label;
|
|
267
|
+
} else {
|
|
268
|
+
const titlePart = match.title !== void 0 ? ` ${match.title}` : "";
|
|
269
|
+
rewritten += `[${match.label}](#${anchor}${titlePart})`;
|
|
270
|
+
}
|
|
271
|
+
cursor = match.end;
|
|
272
|
+
}
|
|
273
|
+
rewritten += protectedText.slice(cursor);
|
|
274
|
+
return restore(rewritten);
|
|
275
|
+
}
|
|
276
|
+
export {
|
|
277
|
+
buildChangelogAnchorMap,
|
|
278
|
+
formatChangelogEntryHeadingText,
|
|
279
|
+
rewriteChangelogEntryLinks
|
|
280
|
+
};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
const ZDTP_LOADER_SPECIFIER = "@takazudo/zudo-doc/zdtp-loader";
|
|
2
|
-
const DISABLED_LOADER_SOURCE = 'throw new Error("@takazudo/zdtp is not bundled: designTokenPanel is
|
|
2
|
+
const DISABLED_LOADER_SOURCE = 'throw new Error("@takazudo/zdtp is not bundled: designTokenPanel is false and bundleZdtp is not set, so this build shadows @takazudo/zudo-doc/zdtp-loader. If you reached this through @takazudo/zudo-doc/design-token-panel-bootstrap to mount your own panel, set bundleZdtp: true and install @takazudo/zdtp.");\nexport {};\n';
|
|
3
3
|
const plugin = {
|
|
4
4
|
name: "zdtp-loader",
|
|
5
5
|
setup(ctx) {
|
package/dist/preset.d.ts
CHANGED
|
@@ -124,8 +124,18 @@ export interface PresetSettings {
|
|
|
124
124
|
docHistory?: boolean;
|
|
125
125
|
/** Whether the doc history dropdown UI and related artifacts are enabled. */
|
|
126
126
|
docHistoryUi?: boolean;
|
|
127
|
-
/**
|
|
127
|
+
/**
|
|
128
|
+
* Mount the package-owned design token panel and its header trigger. Does
|
|
129
|
+
* NOT decide bundling on its own — the zdtp-loader plugin follows
|
|
130
|
+
* `bundleZdtp ?? designTokenPanel` (#4201, #4261).
|
|
131
|
+
*/
|
|
128
132
|
designTokenPanel?: boolean;
|
|
133
|
+
/**
|
|
134
|
+
* Bundle `@takazudo/zdtp` into the island build. Omitted → follows
|
|
135
|
+
* `designTokenPanel`. Full contract: `ZudoDocConfig.bundleZdtp` in
|
|
136
|
+
* `config.ts`.
|
|
137
|
+
*/
|
|
138
|
+
bundleZdtp?: boolean;
|
|
129
139
|
docHistoryExclude?: string[];
|
|
130
140
|
/** Generate package-owned viewer pages for files under the configured asset directory. */
|
|
131
141
|
assetViewer?: boolean;
|
package/dist/preset.js
CHANGED
|
@@ -2,6 +2,8 @@ import { z } from "zod";
|
|
|
2
2
|
import { assertNoCommaInVersionSlugs } from "./version-availability/index.js";
|
|
3
3
|
import {
|
|
4
4
|
assertNoEmptyStringFaviconOrLogo,
|
|
5
|
+
assertZdtpBundlingConsistent,
|
|
6
|
+
resolvesBundleZdtp,
|
|
5
7
|
warnAmbiguousDropdownCategoryMatch
|
|
6
8
|
} from "./config-assertions/index.js";
|
|
7
9
|
function zudoDocPreset({
|
|
@@ -14,6 +16,7 @@ function zudoDocPreset({
|
|
|
14
16
|
}) {
|
|
15
17
|
assertNoCommaInVersionSlugs(settings.versions);
|
|
16
18
|
assertNoEmptyStringFaviconOrLogo(settings);
|
|
19
|
+
assertZdtpBundlingConsistent(settings);
|
|
17
20
|
warnAmbiguousDropdownCategoryMatch(settings.headerNav);
|
|
18
21
|
const docsSchemaJson = z.toJSONSchema(buildDocsSchema());
|
|
19
22
|
return {
|
|
@@ -304,11 +307,15 @@ function buildPlugins(settings, routeContext) {
|
|
|
304
307
|
onBroken: settings.onBrokenMarkdownLinks
|
|
305
308
|
}
|
|
306
309
|
},
|
|
307
|
-
//
|
|
308
|
-
// import with a throwing virtual module so the island build emits no
|
|
309
|
-
// (#4201).
|
|
310
|
-
//
|
|
311
|
-
|
|
310
|
+
// zdtp not bundled → shadow the bootstrap's `@takazudo/zudo-doc/zdtp-loader`
|
|
311
|
+
// lazy import with a throwing virtual module so the island build emits no
|
|
312
|
+
// zdtp chunks (#4201). Bundling follows `bundleZdtp ?? designTokenPanel`:
|
|
313
|
+
// omit `bundleZdtp` and it tracks the panel exactly as before; set it to
|
|
314
|
+
// `true` with the panel off when the host mounts its own panel through
|
|
315
|
+
// `design-token-panel-bootstrap` (#4261). Preset-level rather than inside
|
|
316
|
+
// the routes plugin because the bootstrap is reachable from chrome even
|
|
317
|
+
// when packageOwnedRoutes is off.
|
|
318
|
+
...resolvesBundleZdtp(settings) ? [] : [{ name: "@takazudo/zudo-doc/plugins/zdtp-loader", options: {} }]
|
|
312
319
|
];
|
|
313
320
|
}
|
|
314
321
|
export {
|
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-[calc(var(--spacing-icon-lg)/2)] -link -mb-px -ml-hsp-sm -mt-px -noscript -open -state -state-v2 -state-v3 -state-v4 -translate-x-full 2xl:w-[24px] [&::-webkit-details-marker]:hidden [&_a:focus-visible]:text-accent [&_a:hover]:text-accent [&_a]:pointer-events-auto [&_a]:underline [&_li]:mb-0 [&_nav]:mb-0 [asset-viewer] [data-admonition] [data-kbd-shortcut] [data-switcher-launcher] [doc-history-meta] [doc-history] [doc-layout] [img-src-check] [llms-txt] [zudo-doc] a a2 abbr about above absent absolute accent accent- accent:accent- access across activated active actual actually add 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 align-top all allow allow-same-origin allow-scripts allowed alone already already-executed already-multiline already-picked also alt always an anchor and and/or animate-pulse animate-spin announce ansehen antialiased any anywhere anzeigen app appear application/json application/octet-stream application/pdf application/sql application/toml application/x-httpd-php application/xml application/yaml 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 around arrows article as asc ascii aside aspect-[1200/630] aspect-square asset asset- asset-components assets assets/client assistant async at at-rule attach attribute attributes audio auf author authored auto auto-logo-mask autogenerated availability available avc1 avif avis avoid await away b back backdrop:bg-bg/30 backdrop:bg-bg/80 backdrop:bg-overlay/60 backdrop:z-modal-backdrop background background-color backslashes backtick backticks baked band banner bar 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 big bigint bin binaries bind binding blank blanks block blockquote blocks blur bodies 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 broken 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 case-insensitive cases cat-nav- catalog catch categories category caught caution center center/contain ch chains change changed changelog changelogs changes characters check checkbox checked checker child children choose chrome chrome-font ci circle cite cjs 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 collapse 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 complete component component:github-link component:language-switcher component:search component:theme-toggle component:version-switcher composes composition compute computed concrete conf config configuration configurations configure configured conflicting 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 copy-url copyright core corners correct correctly corrupt could count covered covers cpp crashes created cross-component crumb- cs csharp css css-presence csv ctx cur current current-path/index.ts current-route currently cursor cursor-not-allowed cursor-pointer custom cycle d danger dark dash data data-active data-admonition data-asset-details-hidden 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-home-rule data-home-secondary-nav data-kbd-shortcut data-lang data-language-menu data-language-switcher data-language-toggle data-loading-index data-mermaid data-mermaid-enlarge-ready data-mermaid-rendered data-mermaid-src data-nav-active data-nav-category 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-asset-action data-zd-asset-actions data-zd-asset-details data-zd-asset-details-chevron data-zd-asset-details-list data-zd-asset-details-toggle data-zd-asset-index-action data-zd-asset-index-empty data-zd-asset-index-page data-zd-asset-page data-zd-asset-tree data-zd-copy-url data-zd-html-preview-reservation data-zd-label-collapse data-zd-label-expand data-zd-mobile-sidebar data-zd-mobile-toc data-zd-nav-section data-zd-nosidebar data-zd-pending 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-reload data-zfb-transition-persist date dated dd decimal decision declaration declare declared declares decoration 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 differ different dir directives directly directories directory disabled disabled:cursor-default 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 documents does dog dot double-registration download draft drag drawer drift drifts drop dropdown dropdown-parent dropdowns dt duplicate duration duration-150 duration-200 during dynamically e e2e each eager 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 entities entries entry entrypoint env equal error escape escaped escapes even event eventually every everything-enabled exactly example exceeds excerpt excludes exclusively exist existing exists exit expand 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 fit fix fixed fixed-width fixtures flag flash flat flex flex-1 flex-col flex-wrap flip flipping flips flow flush-left focus focus-visible:bg-accent/10 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-within:border-accent focus-within:z-local-1 focus:border-accent focus:outline-none focus:text-accent focus:underline folder folders 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 fragment frame free freeze fresh from frontmatter frontmatter-preview frozen frozen-script fs-extra ftyp 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-xl 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 gif git github github-dark github-link give go got grab gradient granular graph grid grid-cols-1 grid-cols-2 grid-cols-[auto_1fr] grid-rows-[auto_auto] grid-rows-subgrid group group-focus-visible:text-accent group-focus-visible:text-fg 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:text-fg group-hover:underline group-open:rotate-90 grouped grouping guard guards gz h 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-[70vh] 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 hero hex hi-root hidden hide hierarchical highlight highlighting 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 hover:z-local-1 hpp 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 id identical idle idx if iframe ignore ignoring image image-enlarge image-overlay-inset image/avif image/gif image/jpeg image/png image/webp image/x-icon img img-src-check implementation import import/export important important-allowlist imports in inactive includes including incomplete independently index index2026 indirectly info inherit inherited ini 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 inspect install installation installed instance instanceof instead instructions intended intent intentionally intercept interface internal interpolation into introductions invalid invalidated inverse inversion invocation invoke is is-checker island island-root iso2 iso3 iso4 iso5 iso6 isom ispe issues it italic item item- items items-baseline items-center items-end items-start iteration its itself ja java javascript jpeg jpg 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 kotlin kt label landing lands language-menu language-switcher language-toggle larger last:border-b-0 last:pb-0 later latest launch layout lazy leading 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-1 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:pr-hsp-sm 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 lines 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 m10 m14 m16 m21 m6 machinery main major make malformed malformed-markup malicious managed manifest manual 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-[16rem] max-w-[64rem] max-w-[85%] max-w-[85vw] max-w-[90vw] max-w-[calc(100vw-2rem)] max-w-[calc(100vw-var(--spacing-hsp-xl))] max-w-[clamp(50rem,75vw,90rem)] max-w-full max-w-none max-w-sm max-width maximum 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-[20rem] min-h-[44px] min-h-[60vh] min-h-[calc(100vh-3.5rem)] min-h-screen min-w-0 min-w-[10rem] min-w-[3rem] min-w-[44px] min-w-[8rem] minifier minor mirror mirroring mirrors missing mit mjs 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 mov move mp4 mp41 mp42 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 mvhd 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 node:util nodes nofollow noindex non-draggable non-empty non-index non-light-dark non-literal non-null non-persisted nonblank 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 optional or order original other others otherwise out outgoing outline-none output outside over overflow overflow-auto overflow-hidden overflow-x-auto overflow-y-auto overflow-y:auto overlaps override overrides overscroll-contain overwrite own owned p p-0 p-hsp-2xs p-hsp-lg p-hsp-md p-hsp-sm p-hsp-xl 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 paragraph paren-balance-aware parent parse parse/render parse5 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 pdf 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 percent permanently persisted persistence php 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 png png16 png32 pnpm point pointer pointer-events-none pointercancel pointerdown pointermove pointerup policy polite polygon polyline popover populates port position position:fixed poster pr-hsp-lg pr-hsp-md pr-hsp-sm pr-hsp-xl pr-hsp-xs 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 prior private produce produced produces producing production profiles project project-owned project-root-relative properties property props prose protocol-relative 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 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 qt query question quick r radius radius-full radius-lg rail ramp range rar rather raw rb re-encode/decode re-exports re-init re-initialized 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 refresh refreshes refusing regardless regenerate regenerates regex registry reinit reinits rejected rel relative release released releases reload relying rem remapped remembered remove remove/rename removed removing rename render rendered renderer renderers renders reorder repaint repair repeated repeating replace replaced replacement replaces repopulate report repository republished requested require required requires reserved resize resize-x resolve resolved resolves responded response restore restores restyle result result-click results results-area retry return returns rev-parse 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 routes/sitemap.xml row row-span-2 row-start-1 row-start-2 rows rp rs rt ruby rule rules run running runs runtime rust 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 scss seam search search-index section section- see seed segment segments 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 sh 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 sidecar 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 skip skipped skipping skips slash slot slug slug-dir-parity slugs sm:block 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 sort source sources space-y-vsp-2xs space-y-vsp-lg space-y-vsp-sm spacing spacing-0 spacing-px span spans spec specifiers specify spelling splitter spread spurious sql square sr-only src srcset stable stack stale standalone start state state- state:state- statement statements 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 styles stylesheet sub subagents subsequent substitute substitution subtracting success successful summary sup supply supported surface surfaces survives svg swap swapped swaps swift switcher switching symlink 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 tar 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/csv text/html text/javascript text/jsx text/markdown text/mdx text/plain text/tab-separated-values text/tsx text/typescript text/x-c text/x-csharp text/x-go text/x-java-source text/x-kotlin text/x-python text/x-ruby text/x-rust text/x-scss text/x-shellscript text/x-swift textarea tfoot tgz 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 tkhd 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 track tracked tracking-wide tracking-wider trade-off trailing transclude transferred 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 tsv tsx turn twitter:card twitter:creator twitter:description twitter:image twitter:site twitter:title two txt type typeface typeof typescript typography u ul umschalten unable unavailable unbalanced unchanged und undefined under underline underlined underlines understand unit-tested unknown unlike unlisted unmaintained unmatchable unobserve unreadable unrelated unreleased unresolvable unresolved unsafe unset unsupported unterminated until unusable unwrapped up up-to-date update updated upper uppercase url use used useful user uses using usual utf-8 utf8 utilities utility v v2 val value value-reader values var variable variant variants verbatim version version- version-menu version-switcher versions vertical via video video/mp4 video/quicktime video/webm viewer viewing viewport viewports virtual:zudo-doc-asset-bodies 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 webm webp 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 writing written wrong wrote wurde x xl:flex xl:hidden xlink:href xml y-scrollbar yaml year yet yielded yields yml you your z-dropdown z-local-1 z-modal z-modal-backdrop z-popover z-sidebar z-toolbar zd-asset-code zd-asset-details-rail zd-asset-details-toggle zd-asset-filebar zd-asset-media-grid zd-asset-media-rail zd-asset-page zd-asset-pdf zd-asset-stage zd-compact-prose 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-home-copy zd-home-heading zd-home-hero zd-home-inner zd-home-intro zd-home-links zd-home-rule zd-home-sitemap zd-home-tags 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 zdtp-loader zfb zfb:after-swap zfb:before-preparation zfb:before-swap zip zod zoom zudo-design-token-panel zudo-design-tokens/v3 zudo-doc zudo-doc-asset-details-visible 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 -state-v2 -state-v3 -state-v4 -translate-x-full 2xl:w-[24px] [&::-webkit-details-marker]:hidden [&_a:focus-visible]:text-accent [&_a:hover]:text-accent [&_a]:pointer-events-auto [&_a]:underline [&_li]:mb-0 [&_nav]:mb-0 [asset-viewer] [data-admonition] [data-kbd-shortcut] [data-switcher-launcher] [doc-history-meta] [doc-history] [doc-layout] [img-src-check] [llms-txt] [zudo-doc] a a2 abbr about above absent absolute accent accent- accent:accent- access across activated active actual actually add 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 align-top all allow allow-same-origin allow-scripts allowed alone already already-executed already-multiline already-picked also alt always an anchor and and/or animate-pulse animate-spin announce ansehen antialiased any anywhere anzeigen app appear application/json application/octet-stream application/pdf application/sql application/toml application/x-httpd-php application/xml application/yaml 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 around arrows article as asc ascii aside aspect-[1200/630] aspect-square asset asset- asset-components assets assets/client assistant async at at-rule attach attribute attributes audio auf author authored auto auto-logo-mask autogenerated availability available avc1 avif avis avoid await away b back backdrop:bg-bg/30 backdrop:bg-bg/80 backdrop:bg-overlay/60 backdrop:z-modal-backdrop background background-color backslashes backtick backticks baked band banner bar 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 big bigint bin binaries bind binding blank blanks block blockquote blocks blur bodies 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 broken 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 case-insensitive cases cat-nav- catalog catch categories category caught caution center center/contain ch chains change changed changelog changelogs changes characters check checkbox checked checker child children choose chrome chrome-font ci circle cite cjs 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 collapse 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 complete component component:github-link component:language-switcher component:search component:theme-toggle component:version-switcher composes composition compute computed concrete conf config configuration configurations configure configured conflicting 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 copy-url copyright core corners correct correctly corrupt could count covered covers cpp crashes created cross-component crumb- cs csharp css css-presence csv ctx cur current current-path/index.ts current-route currently cursor cursor-not-allowed cursor-pointer custom cycle d danger dark dash data data-active data-admonition data-asset-details-hidden 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-home-rule data-home-secondary-nav data-kbd-shortcut data-lang data-language-menu data-language-switcher data-language-toggle data-loading-index data-mermaid data-mermaid-enlarge-ready data-mermaid-rendered data-mermaid-src data-nav-active data-nav-category 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-asset-action data-zd-asset-actions data-zd-asset-details data-zd-asset-details-chevron data-zd-asset-details-list data-zd-asset-details-toggle data-zd-asset-index-action data-zd-asset-index-empty data-zd-asset-index-page data-zd-asset-page data-zd-asset-tree data-zd-copy-url data-zd-html-preview-reservation data-zd-label-collapse data-zd-label-expand data-zd-mobile-sidebar data-zd-mobile-toc data-zd-nav-section data-zd-nosidebar data-zd-pending 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-reload data-zfb-transition-persist date dated dd decimal decision declaration declare declared declares decoration 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 differ different dir directives directly directories directory disabled disabled:cursor-default 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 documents does dog dot double-registration download draft drag drawer drift drifts drop dropdown dropdown-parent dropdowns dt duplicate duration duration-150 duration-200 during dynamically e e2e each eager 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 entities entries entry entrypoint env equal error escape escaped escapes even event eventually every everything-enabled exactly example exceeds excerpt excludes exclusively exist existing exists exit expand expected explicit export extends extra f factories fail 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 fit fix fixed fixed-width fixtures flag flash flat flex flex-1 flex-col flex-wrap flip flipping flips flow flush-left focus focus-visible:bg-accent/10 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-within:border-accent focus-within:z-local-1 focus:border-accent focus:outline-none focus:text-accent focus:underline folder folders 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 fragment frame free freeze fresh from frontmatter frontmatter-preview frozen frozen-script fs-extra ftyp 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-xl 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 gif git github github-dark github-link give go got grab gradient granular graph grid grid-cols-1 grid-cols-2 grid-cols-[auto_1fr] grid-rows-[auto_auto] grid-rows-subgrid group group-focus-visible:text-accent group-focus-visible:text-fg 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:text-fg group-hover:underline group-open:rotate-90 grouped grouping guard guards gz h 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-[70vh] 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 hero hex hi-root hidden hide hierarchical highlight highlighting 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 hover:z-local-1 hpp 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 id identical idle idx if iframe ignore ignoring image image-enlarge image-overlay-inset image/avif image/gif image/jpeg image/png image/webp image/x-icon img img-src-check implementation import import/export important important-allowlist imports in inactive includes including incomplete independently index index2026 indirectly info inherit inherited ini 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 inspect install installation installed instance instanceof instead instructions intended intent intentionally intercept interface internal interpolation into introductions invalid invalidated inverse inversion invocation invoke is is-checker island island-root iso2 iso3 iso4 iso5 iso6 isom ispe issues it italic item item- items items-baseline items-center items-end items-start iteration its itself ja java javascript jpeg jpg 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 kotlin kt label landing lands language-menu language-switcher language-toggle larger last:border-b-0 last:pb-0 later latest launch layout lazy leading 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-1 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:pr-hsp-sm 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 lines 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 m10 m14 m16 m21 m6 machinery main major make malformed malformed-markup malicious managed manifest manual 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-[16rem] max-w-[64rem] max-w-[85%] max-w-[85vw] max-w-[90vw] max-w-[calc(100vw-2rem)] max-w-[calc(100vw-var(--spacing-hsp-xl))] max-w-[clamp(50rem,75vw,90rem)] max-w-full max-w-none max-w-sm max-width maximum may mb-0 mb-vsp-2xs mb-vsp-lg mb-vsp-md mb-vsp-sm mb-vsp-xl mb-vsp-xs md mdx means meant measured measurement measures measuring mechanism menu mermaid message messages meta meta-knob meta-schema metadata migration min-h-0 min-h-[20rem] min-h-[44px] min-h-[60vh] min-h-[calc(100vh-3.5rem)] min-h-screen min-w-0 min-w-[10rem] min-w-[3rem] min-w-[44px] min-w-[8rem] minifier minor mirror mirroring mirrors missing mit mjs 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 mov move mp4 mp41 mp42 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 mvhd 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 node:util nodes nofollow noindex non-draggable non-empty non-index non-light-dark non-literal non-null non-persisted nonblank 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 optional or order original other others otherwise out outgoing outline-none output outside over overflow overflow-auto overflow-hidden overflow-x-auto overflow-y-auto overflow-y:auto overlaps override overrides overscroll-contain overwrite own owned p p-0 p-hsp-2xs p-hsp-lg p-hsp-md p-hsp-sm p-hsp-xl 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 paragraph paren-balance-aware parent parse parse/render parse5 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 pdf 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 percent permanently persisted persistence php 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 png png16 png32 pnpm point pointer pointer-events-none pointercancel pointerdown pointermove pointerup policy polite polygon polyline popover populates port position position:fixed poster pr-hsp-lg pr-hsp-md pr-hsp-sm pr-hsp-xl pr-hsp-xs 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 prior private produce produced produces producing production profiles project project-owned project-root-relative properties property props prose protocol-relative 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 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 qt query question quick r radius radius-full radius-lg rail ramp range rar rather raw rb re-encode/decode re-exports re-init re-initialized 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 refresh refreshes refusing regardless regenerate regenerates regex registry reinit reinits rejected rel relative release released releases reload relying rem remapped remembered remove remove/rename removed removing rename render rendered renderer renderers renders reorder repaint repair repeated repeating replace replaced replacement replaces repopulate report repository republished requested require required requires reserved resize resize-x resolve resolved resolves responded response restore restores restyle result result-click results results-area retry return returns rev-parse 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 routes/sitemap.xml row row-span-2 row-start-1 row-start-2 rows rp rs rt ruby rule rules run running runs runtime rust 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 scss seam search search-index section section- see seed segment segments 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 sh shadow shadow-[0_1px_3px_color-mix(in_srgb,var(--color-fg)_8%,transparent)] shadow-lg shadow-md shadowed shadows 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 sidecar 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 skip skipped skipping skips slash slot slug slug-dir-parity slugs sm:block 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 sort source sources space-y-vsp-2xs space-y-vsp-lg space-y-vsp-sm spacing spacing-0 spacing-px span spans spec specifiers specify spelling splitter spread spurious sql square sr-only src srcset stable stack stale standalone start state state- state:state- statement statements 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 styles stylesheet sub subagents subsequent substitute substitution subtracting success successful summary sup supply supported surface surfaces survives svg swap swapped swaps swift switcher switching symlink 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 tar 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/csv text/html text/javascript text/jsx text/markdown text/mdx text/plain text/tab-separated-values text/tsx text/typescript text/x-c text/x-csharp text/x-go text/x-java-source text/x-kotlin text/x-python text/x-ruby text/x-rust text/x-scss text/x-shellscript text/x-swift textarea tfoot tgz 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 throwing throws tighten time timeline tip title tkhd 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 track tracked tracking-wide tracking-wider trade-off trailing transclude transferred 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 tsv tsx turn twitter:card twitter:creator twitter:description twitter:image twitter:site twitter:title two txt type typeface typeof typescript typography u ul umschalten unable unavailable unbalanced unchanged und undefined under underline underlined underlines understand unit-tested unknown unlike unlisted unmaintained unmatchable unobserve unreadable unrelated unreleased unresolvable unresolved unsafe unset unsupported unterminated until unusable unwrapped up up-to-date update updated upper uppercase url use used useful user uses using usual utf-8 utf8 utilities utility v v2 val value value-reader values var variable variant variants verbatim version version- version-menu version-switcher versions vertical via video video/mp4 video/quicktime video/webm viewer viewing viewport viewports virtual:zudo-doc-asset-bodies 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 webm webp 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 wrap-anywhere wrapped wrapper wrappers wrapping wraps writing written wrong wrote wurde x xl:flex xl:hidden xlink:href xml y-scrollbar yaml year yet yielded yields yml you your z-dropdown z-local-1 z-modal z-modal-backdrop z-popover z-sidebar z-toolbar zd-asset-code zd-asset-details-rail zd-asset-details-toggle zd-asset-filebar zd-asset-media-grid zd-asset-media-rail zd-asset-page zd-asset-pdf zd-asset-stage zd-compact-prose 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-home-copy zd-home-heading zd-home-hero zd-home-inner zd-home-intro zd-home-links zd-home-rule zd-home-sitemap zd-home-tags 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 zdtp-loader zfb zfb:after-swap zfb:before-preparation zfb:before-swap zip zod zoom zudo-design-token-panel zudo-design-tokens/v3 zudo-doc zudo-doc-asset-details-visible 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");
|
package/dist/settings.d.ts
CHANGED
|
@@ -407,6 +407,13 @@ export interface Settings {
|
|
|
407
407
|
aiChatAllowedOrigins: string[];
|
|
408
408
|
aiChatGlobalDailyLimit: number | false;
|
|
409
409
|
designTokenPanel: boolean;
|
|
410
|
+
/**
|
|
411
|
+
* Bundle `@takazudo/zdtp` into the island build, independently of whether
|
|
412
|
+
* the package panel mounts. Optional with no `DEFAULT_SETTINGS` key — it is
|
|
413
|
+
* resolved at the read site as `bundleZdtp ?? designTokenPanel`. Full
|
|
414
|
+
* contract: `ZudoDocConfig.bundleZdtp` in `config.ts`.
|
|
415
|
+
*/
|
|
416
|
+
bundleZdtp?: boolean;
|
|
410
417
|
tocMinDepth: number;
|
|
411
418
|
tocMaxDepth: number;
|
|
412
419
|
sidebarResizer: boolean;
|
|
@@ -39,7 +39,7 @@ function SidebarToggle({
|
|
|
39
39
|
{
|
|
40
40
|
type: "button",
|
|
41
41
|
onClick: () => setOpen(!open),
|
|
42
|
-
className: "lg:hidden px-hsp-sm py-vsp-xs -ml-hsp-sm mr-hsp-sm text-muted hover:text-fg",
|
|
42
|
+
className: "lg:hidden shrink-0 px-hsp-sm py-vsp-xs -ml-hsp-sm mr-hsp-sm text-muted hover:text-fg",
|
|
43
43
|
"aria-label": open ? "Close sidebar" : "Open sidebar",
|
|
44
44
|
"aria-expanded": open,
|
|
45
45
|
children: [
|
|
@@ -235,20 +235,22 @@ html[data-theme-pack="riso"] header[data-header] {
|
|
|
235
235
|
border-bottom: 3px solid var(--zd-accent);
|
|
236
236
|
}
|
|
237
237
|
html[data-theme-pack="riso"] [data-header-logo] {
|
|
238
|
-
display: inline-flex;
|
|
239
|
-
align-items: center;
|
|
240
|
-
gap: 0.55rem;
|
|
241
238
|
font-family: var(--font-display);
|
|
242
239
|
font-weight: 400;
|
|
243
240
|
letter-spacing: 0.01em;
|
|
244
241
|
}
|
|
245
242
|
html[data-theme-pack="riso"] [data-header-logo]::before {
|
|
246
243
|
content: "";
|
|
244
|
+
display: inline-block;
|
|
247
245
|
width: 0.7em;
|
|
248
246
|
height: 0.7em;
|
|
249
|
-
flex-shrink: 0;
|
|
250
247
|
background: var(--zd-accent);
|
|
251
248
|
box-shadow: 0.16em 0.16em 0 0 light-dark(#ff5b41, #ff7a5f);
|
|
249
|
+
margin-right: 0.55rem;
|
|
250
|
+
/* -0.03em: measured against the marker's pre-#4306 flex-centered
|
|
251
|
+
position — pixel-identical at 1280px and at 390px/24px. The display
|
|
252
|
+
font's baseline differs from swissgrid's, so the offsets differ. */
|
|
253
|
+
vertical-align: -0.03em;
|
|
252
254
|
}
|
|
253
255
|
html[data-theme-pack="riso"] [data-nav-item]:hover {
|
|
254
256
|
text-decoration-line: underline;
|
|
@@ -204,18 +204,21 @@ html[data-theme-pack="swissgrid"] header[data-header] {
|
|
|
204
204
|
border-bottom: 3px solid var(--zd-fg);
|
|
205
205
|
}
|
|
206
206
|
html[data-theme-pack="swissgrid"] [data-header-logo] {
|
|
207
|
-
display: inline-flex;
|
|
208
|
-
align-items: center;
|
|
209
|
-
gap: 0.55rem;
|
|
210
207
|
font-weight: 900;
|
|
211
208
|
letter-spacing: -0.03em;
|
|
212
209
|
}
|
|
213
210
|
html[data-theme-pack="swissgrid"] [data-header-logo]::before {
|
|
214
211
|
content: "";
|
|
212
|
+
display: inline-block;
|
|
215
213
|
width: 0.72em;
|
|
216
214
|
height: 0.72em;
|
|
217
|
-
flex-shrink: 0;
|
|
218
215
|
background: #ff0000;
|
|
216
|
+
margin-right: 0.55rem;
|
|
217
|
+
/* `baseline` is also the initial value — stated explicitly because it was
|
|
218
|
+
the measured outcome: it reproduces the marker's pre-#4306 flex-centered
|
|
219
|
+
position to within half a pixel at 1280px and at 390px/24px. Do not read
|
|
220
|
+
it as a tuned offset (riso needs one; this pack does not). */
|
|
221
|
+
vertical-align: baseline;
|
|
219
222
|
}
|
|
220
223
|
html[data-theme-pack="swissgrid"] [data-nav-item] {
|
|
221
224
|
text-transform: uppercase;
|
package/eject/header/header.tsx
CHANGED
|
@@ -352,7 +352,17 @@ export function Header(props: HeaderProps): JSX.Element {
|
|
|
352
352
|
|
|
353
353
|
<a
|
|
354
354
|
href={urlHelpers.withBase(isNonDefaultLocale ? `/${lang}/` : "/")}
|
|
355
|
-
|
|
355
|
+
// The site name is the row's only item that can actually give ground:
|
|
356
|
+
// the right cluster is pinned against shrinking, the mobile-toggle
|
|
357
|
+
// slot cannot go below its button's min-content width, and the nav's
|
|
358
|
+
// zero flex basis zeroes its scaled shrink factor. So a width deficit
|
|
359
|
+
// is absorbed here as an ellipsis instead of pushing the right
|
|
360
|
+
// controls past the viewport edge (zudolab/zudo-doc#4287).
|
|
361
|
+
// Do not name Tailwind utilities in prose here — the content scanner
|
|
362
|
+
// reads them as class candidates; use the `safelist-ok:` marker if a
|
|
363
|
+
// future note must (see scripts/check-package-safelist.mjs).
|
|
364
|
+
class="min-w-0 truncate text-title font-bold text-fg hover:underline focus:underline"
|
|
365
|
+
title={siteName}
|
|
356
366
|
data-header-logo
|
|
357
367
|
>
|
|
358
368
|
{siteName}
|
|
@@ -108,7 +108,7 @@ export function SidebarToggle({
|
|
|
108
108
|
<button
|
|
109
109
|
type="button"
|
|
110
110
|
onClick={() => setOpen(!open)}
|
|
111
|
-
className="lg:hidden px-hsp-sm py-vsp-xs -ml-hsp-sm mr-hsp-sm text-muted hover:text-fg"
|
|
111
|
+
className="lg:hidden shrink-0 px-hsp-sm py-vsp-xs -ml-hsp-sm mr-hsp-sm text-muted hover:text-fg"
|
|
112
112
|
aria-label={open ? "Close sidebar" : "Open sidebar"}
|
|
113
113
|
aria-expanded={open}
|
|
114
114
|
>
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@takazudo/zudo-doc",
|
|
3
|
-
"version": "5.
|
|
3
|
+
"version": "5.26.0",
|
|
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",
|
|
@@ -717,9 +717,9 @@
|
|
|
717
717
|
],
|
|
718
718
|
"peerDependencies": {
|
|
719
719
|
"@takazudo/zdtp": "^0.5.2 || ^0.6.0 || ^0.7.0 || ^0.8.0",
|
|
720
|
-
"@takazudo/zfb": "^2.
|
|
721
|
-
"@takazudo/zfb-md-wasm": "^2.
|
|
722
|
-
"@takazudo/zfb-runtime": "^2.
|
|
720
|
+
"@takazudo/zfb": "^2.19.0",
|
|
721
|
+
"@takazudo/zfb-md-wasm": "^2.19.0",
|
|
722
|
+
"@takazudo/zfb-runtime": "^2.19.0",
|
|
723
723
|
"@takazudo/zudo-doc-history-server": "^5.17.2",
|
|
724
724
|
"diff": "^8.0.0",
|
|
725
725
|
"katex": "^0.16.0",
|
|
@@ -757,9 +757,9 @@
|
|
|
757
757
|
},
|
|
758
758
|
"devDependencies": {
|
|
759
759
|
"@takazudo/mdx-formatter": "1.3.0-next.4",
|
|
760
|
-
"@takazudo/zfb": "2.
|
|
761
|
-
"@takazudo/zfb-md-wasm": "2.
|
|
762
|
-
"@takazudo/zfb-runtime": "2.
|
|
760
|
+
"@takazudo/zfb": "2.19.0",
|
|
761
|
+
"@takazudo/zfb-md-wasm": "2.19.0",
|
|
762
|
+
"@takazudo/zfb-runtime": "2.19.0",
|
|
763
763
|
"@types/fs-extra": "^11.0.4",
|
|
764
764
|
"@types/minimist": "^1.2.5",
|
|
765
765
|
"@types/node": "^25.3.5",
|
|
@@ -771,7 +771,7 @@
|
|
|
771
771
|
"typescript": "^5.0.0",
|
|
772
772
|
"vitest": "^4.1.0",
|
|
773
773
|
"zod": "^4.3.6",
|
|
774
|
-
"@takazudo/zudo-doc-history-server": "5.
|
|
774
|
+
"@takazudo/zudo-doc-history-server": "5.26.0"
|
|
775
775
|
},
|
|
776
776
|
"scripts": {
|
|
777
777
|
"gen:search-widget-script": "node scripts/gen-search-widget-script.mjs",
|