@takazudo/zudo-doc 6.2.0 → 7.1.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 +24 -0
- package/README.md +16 -1
- package/dist/compiled.css +33 -10
- package/dist/content.css +9 -0
- package/dist/doclayout/doc-layout.js +2 -0
- package/dist/features.css +31 -56
- package/dist/page-loading/page-loading-overlay.d.ts +2 -2
- package/dist/page-loading/page-loading-overlay.js +4 -2
- package/dist/page-loading.css +13 -2
- package/dist/plugins/optional-peers.d.ts +3 -0
- package/dist/plugins/optional-peers.js +34 -0
- package/dist/preset.d.ts +2 -0
- package/dist/preset.js +14 -1
- package/dist/transitions/chrome-transition-bootstrap.d.ts +2 -0
- package/dist/transitions/chrome-transition-bootstrap.js +23 -0
- package/dist/transitions/page-events.d.ts +4 -0
- package/dist/transitions/page-events.js +4 -0
- package/eject/page-loading/page-loading-overlay.tsx +7 -5
- package/package.json +17 -10
package/CHANGELOG.md
CHANGED
|
@@ -8,6 +8,30 @@ 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
|
+
## [7.1.0] - 2026-10-23
|
|
12
|
+
|
|
13
|
+
### Bug Fixes
|
|
14
|
+
|
|
15
|
+
- Inline code inside table cells no longer breaks mid-word. The narrow-width `overflow-wrap: anywhere` from 7.0.0 collapsed the min-content width of table columns, so short identifiers such as `slug` were split instead of the table wrapper scrolling. Code in `th` / `td` goes back to `overflow-wrap: break-word`. (9d36a247, a30cdd85)
|
|
16
|
+
|
|
17
|
+
### Other Changes
|
|
18
|
+
|
|
19
|
+
- Requires the published zfb 4.7.0 family: the `@takazudo/zfb`, `zfb-runtime` and `zfb-md-wasm` peer floors move from `^4.5.2` to `^4.7.0`. This picks up the 4.5.3 MDX compile fixes: multiline expressions such as HtmlPreview template-literal props keep their authored whitespace, and a template string that contains a decimal comparison no longer fails to compile with `Unexpected numeric literal`. It also picks up the 4.5.4 islands fix: edits outside the browser graph, such as a page title or a Markdown body, no longer change the shipped islands JavaScript. 4.6.0 adds the RUSTSEC-2026-0381 and RUSTSEC-2026-0382 fixes in the CLI's HTTPS client, stages only the pnpm store packages a page can actually reach into the build shadow, and fixes two Windows path bugs in the SSR shadow and plugin virtual modules. 4.7.0 makes Rolldown the page/SSR and island bundler in place of esbuild, so shipped island asset hashes change on the first build after upgrading (set `ZFB_BUNDLER=esbuild` to go back); it also applies a project's tsconfig JSX options to TSX shipped inside packages (zfb#4407), and fixes Windows island builds that import a `?url` resource such as `@takazudo/zfb-md-wasm/highlight` (zfb#4413). Under Rolldown the optional `katex` and `diff` peers stay optional: a new `optional-peers` plugin shadows a peer that is not installed, or whose `math` / `docHistory` feature is off, so the project still builds and an enabled feature shows its usual "install the peer" message (workaround for zfb#4429). Upgrade the zfb family (and `zfb-adapter-cloudflare` when used) together. (f118e4e0, 2b222e31, 957c252d, 81fcc982, 39f1e8a8, 2e6676db)
|
|
20
|
+
|
|
21
|
+
## [7.0.0] - 2026-10-15
|
|
22
|
+
|
|
23
|
+
### Breaking Changes
|
|
24
|
+
|
|
25
|
+
- The supported Node.js runtime moves to the current production LTS line, Node 24 (`>=24 <25`). Node 22 is no longer supported. (98c94df73)
|
|
26
|
+
- Raises the optional KaTeX peer floor to `^0.18.2 || ^0.19.0` for the GHSA-238p-pmpm-9mq7 patch; 0.16.x is no longer supported. Updates the internal KaTeX color selector while preserving server-only rendering, error fallback and math-disabled builds without KaTeX. Math-enabled hosts must install a supported version and import its local CSS. (9ee3950c9)
|
|
27
|
+
- Requires the published zfb 4.5.2 family: the `@takazudo/zfb`, `zfb-runtime` and `zfb-md-wasm` peer floors move from `^4.5.0` to `^4.5.2`. This picks up live `public/assets/` development serving, explicit and compact one-line MDX table fixes, and a `zfb dev` ready banner that waits until routes are published. Upgrade the zfb family (and `zfb-adapter-cloudflare` when used) together. (e5b7de457, d5e0d7078)
|
|
28
|
+
- The `@takazudo/zudo-doc-history-server` peer floor moves from `^6.0.0` to `^7.0.0` with this major release.
|
|
29
|
+
|
|
30
|
+
### Bug Fixes
|
|
31
|
+
|
|
32
|
+
- Keep the header stationary during dynamic page transitions, including when destination markup replaces it, and keep the desktop sidebar stationary within the same navigation category and locale/version/tree context. Fresh destination content and existing sidebar state handling are preserved; changing articles and table-of-contents content still animate. Sidebar entry and exit also cover `hide_sidebar` pages. Loading feedback now covers the content area without dimming the header or desktop sidebar, stays out of the page animation, and clears on the content swap or navigation cancellation. (ae7152ad5, 6abeadf5f, 479309f1f)
|
|
33
|
+
- Ordinary documentation prose and navigation labels now wrap at narrow widths instead of overflowing horizontally (`overflow-wrap: anywhere` on content). Preformatted code keeps its local scrolling. (648e38da8)
|
|
34
|
+
|
|
11
35
|
## [6.2.0] - 2026-10-14
|
|
12
36
|
|
|
13
37
|
### Features
|
package/README.md
CHANGED
|
@@ -109,7 +109,7 @@ If your project renders **semi-trusted or user-submitted** HTML in a preview, ov
|
|
|
109
109
|
|
|
110
110
|
**6.0.0** is the coordinated major release of `@takazudo/zudo-doc`,
|
|
111
111
|
`@takazudo/zudo-doc-history-server` and `create-zudo-doc`. The current workspace
|
|
112
|
-
targets the published **zfb 4.
|
|
112
|
+
targets the published **zfb 4.7.0** family (peer floor **^4.7.0**).
|
|
113
113
|
[Upstream #4097](https://github.com/Takazudo/zudo-front-builder/issues/4097) is
|
|
114
114
|
resolved; its strict published 4.3.1 consumer control passed 3/3 with no skips or
|
|
115
115
|
retries in the [source-bound verification](../../docs/findings/zfb-4.3.1/verification.md).
|
|
@@ -160,3 +160,18 @@ zfb CSS generation. Do not use physical package `dist/*.css` import paths.
|
|
|
160
160
|
This package is published to npm as `@takazudo/zudo-doc` (since `0.2.0`, `latest` tracks the current line). Inside this repo the host site consumes it as a workspace package through its compiled `dist/` — `pnpm dev` at the repo root runs two watchers in parallel, `tsup --watch` for the JS and `tsc -p tsconfig.build.json --watch` for the `.d.ts`, so edits under `src/` rebuild both halves automatically; for a one-off rebuild use `pnpm --filter @takazudo/zudo-doc build`.
|
|
161
161
|
|
|
162
162
|
zfb itself comes from npm (versions pinned in the root `package.json`). To develop against a local zfb checkout, use the temporary `pnpm.overrides` link escape hatch documented in root `CONTRIBUTING.md` — do not commit the override.
|
|
163
|
+
|
|
164
|
+
### Optional math peer (unreleased compatibility floor)
|
|
165
|
+
|
|
166
|
+
Math-enabled consumers install `katex@^0.19.0` (supported peer range:
|
|
167
|
+
`^0.18.2 || ^0.19.0`) and import `katex/dist/katex.min.css` before
|
|
168
|
+
`@takazudo/zudo-doc/features.css` in their CSS entry. CSS and fonts are bundled
|
|
169
|
+
locally. The consumer matrix covers 0.18.2, 0.18.11 and 0.19.0. The old 0.16
|
|
170
|
+
branch is excluded because GHSA-238p-pmpm-9mq7 is patched from 0.18.2.
|
|
171
|
+
KaTeX 0.18's `.katex-base` selector replaces `.base` in the package color rule.
|
|
172
|
+
|
|
173
|
+
`MathBlock` remains server-rendered, with inline/display wrappers, safe defaults
|
|
174
|
+
and visible malformed-input fallback. A math-disabled consumer needs neither
|
|
175
|
+
KaTeX nor its stylesheet; module evaluation succeeds without it, and explicit
|
|
176
|
+
`MathBlock` rendering reports a useful missing-peer error. This source change
|
|
177
|
+
raises the compatibility floor and is not yet published to npm.
|
package/dist/compiled.css
CHANGED
|
@@ -626,6 +626,7 @@ body {
|
|
|
626
626
|
color: var(--color-fg);
|
|
627
627
|
font-size: var(--text-body);
|
|
628
628
|
line-height: var(--leading-relaxed);
|
|
629
|
+
overflow-wrap: anywhere;
|
|
629
630
|
}
|
|
630
631
|
|
|
631
632
|
@layer zd-flow {
|
|
@@ -750,6 +751,10 @@ body {
|
|
|
750
751
|
overflow-wrap: break-word;
|
|
751
752
|
}
|
|
752
753
|
|
|
754
|
+
.zd-content :where(th code, td code) {
|
|
755
|
+
overflow-wrap: break-word;
|
|
756
|
+
}
|
|
757
|
+
|
|
753
758
|
.zd-content :where(th) {
|
|
754
759
|
font-weight: var(--font-weight-semibold);
|
|
755
760
|
text-align: left;
|
|
@@ -1045,6 +1050,7 @@ a.text-accent.underline {
|
|
|
1045
1050
|
|
|
1046
1051
|
.page-loading-overlay {
|
|
1047
1052
|
position: fixed;
|
|
1053
|
+
view-transition-name: zfb-loading;
|
|
1048
1054
|
inset: 0;
|
|
1049
1055
|
z-index: var(--z-index-modal, 100);
|
|
1050
1056
|
display: flex;
|
|
@@ -1053,11 +1059,12 @@ a.text-accent.underline {
|
|
|
1053
1059
|
background: var(--color-page-loading-overlay, color-mix(in oklch, var(--color-overlay, #000) 60%, transparent));
|
|
1054
1060
|
opacity: 0;
|
|
1055
1061
|
pointer-events: none;
|
|
1056
|
-
transition:
|
|
1062
|
+
transition: none;
|
|
1057
1063
|
}
|
|
1058
1064
|
|
|
1059
1065
|
.page-loading-overlay[data-visible] {
|
|
1060
1066
|
opacity: 1;
|
|
1067
|
+
transition: opacity .15s ease-out;
|
|
1061
1068
|
}
|
|
1062
1069
|
|
|
1063
1070
|
a[data-zd-nav-pending], button[data-zd-nav-pending] {
|
|
@@ -1100,6 +1107,14 @@ a[data-zd-nav-pending], button[data-zd-nav-pending] {
|
|
|
1100
1107
|
}
|
|
1101
1108
|
}
|
|
1102
1109
|
|
|
1110
|
+
::view-transition-group(zfb-loading) {
|
|
1111
|
+
animation: none;
|
|
1112
|
+
}
|
|
1113
|
+
|
|
1114
|
+
::view-transition-old(zfb-loading), ::view-transition-new(zfb-loading) {
|
|
1115
|
+
display: none;
|
|
1116
|
+
}
|
|
1117
|
+
|
|
1103
1118
|
header[data-header] {
|
|
1104
1119
|
background-color: var(--color-surface, var(--color-bg));
|
|
1105
1120
|
z-index: var(--z-index-toolbar, 20);
|
|
@@ -1294,7 +1309,7 @@ pre.hi-root .line .highlighted-word {
|
|
|
1294
1309
|
white-space: nowrap;
|
|
1295
1310
|
}
|
|
1296
1311
|
|
|
1297
|
-
.katex .base {
|
|
1312
|
+
.katex .katex-base {
|
|
1298
1313
|
color: var(--zd-fg);
|
|
1299
1314
|
}
|
|
1300
1315
|
|
|
@@ -1403,11 +1418,11 @@ pre.hi-root .line .highlighted-word {
|
|
|
1403
1418
|
}
|
|
1404
1419
|
}
|
|
1405
1420
|
|
|
1406
|
-
|
|
1421
|
+
body > header {
|
|
1407
1422
|
view-transition-name: zfb-header;
|
|
1408
1423
|
}
|
|
1409
1424
|
|
|
1410
|
-
|
|
1425
|
+
#desktop-sidebar:not(.sr-only) {
|
|
1411
1426
|
view-transition-name: zfb-sidebar;
|
|
1412
1427
|
}
|
|
1413
1428
|
|
|
@@ -1415,26 +1430,34 @@ pre.hi-root .line .highlighted-word {
|
|
|
1415
1430
|
view-transition-name: zfb-footer;
|
|
1416
1431
|
}
|
|
1417
1432
|
|
|
1418
|
-
|
|
1433
|
+
.zd-desktop-sidebar-toggle {
|
|
1419
1434
|
view-transition-name: zfb-sidebar-toggle;
|
|
1420
1435
|
}
|
|
1421
1436
|
|
|
1422
|
-
|
|
1437
|
+
.zd-desktop-toc-toggle {
|
|
1423
1438
|
view-transition-name: zfb-toc-toggle;
|
|
1424
1439
|
}
|
|
1425
1440
|
|
|
1426
|
-
::view-transition-old(zfb-header), ::view-transition-new(zfb-header), ::view-transition-group(zfb-header), ::view-transition-
|
|
1441
|
+
::view-transition-old(zfb-header), ::view-transition-new(zfb-header), ::view-transition-group(zfb-header), ::view-transition-group(zfb-sidebar), ::view-transition-old(zfb-footer), ::view-transition-new(zfb-footer), ::view-transition-group(zfb-footer), ::view-transition-old(zfb-sidebar-toggle), ::view-transition-new(zfb-sidebar-toggle), ::view-transition-group(zfb-sidebar-toggle), ::view-transition-old(zfb-toc-toggle), ::view-transition-new(zfb-toc-toggle), ::view-transition-group(zfb-toc-toggle) {
|
|
1427
1442
|
animation: none;
|
|
1428
1443
|
}
|
|
1429
1444
|
|
|
1430
|
-
::view-transition-
|
|
1445
|
+
::view-transition-group(zfb-header) {
|
|
1446
|
+
z-index: var(--z-index-toolbar, 20);
|
|
1447
|
+
}
|
|
1448
|
+
|
|
1449
|
+
::view-transition-old(zfb-sidebar), ::view-transition-old(zfb-footer):only-child, ::view-transition-old(zfb-sidebar-toggle):only-child, ::view-transition-old(zfb-toc-toggle):only-child {
|
|
1431
1450
|
animation: var(--default-transition-duration) ease-in both contentFadeOut;
|
|
1432
1451
|
}
|
|
1433
1452
|
|
|
1434
|
-
::view-transition-new(zfb-
|
|
1453
|
+
::view-transition-new(zfb-sidebar), ::view-transition-new(zfb-footer):only-child, ::view-transition-new(zfb-sidebar-toggle):only-child, ::view-transition-new(zfb-toc-toggle):only-child {
|
|
1435
1454
|
animation: var(--zd-transition-slower) ease-out both contentFadeIn;
|
|
1436
1455
|
}
|
|
1437
1456
|
|
|
1457
|
+
:root[data-zd-sidebar-transition="stationary"]::view-transition-old(zfb-sidebar), :root[data-zd-sidebar-transition="stationary"]::view-transition-new(zfb-sidebar) {
|
|
1458
|
+
animation: none;
|
|
1459
|
+
}
|
|
1460
|
+
|
|
1438
1461
|
::view-transition-old(root) {
|
|
1439
1462
|
animation: var(--default-transition-duration) ease-in both contentFadeOut;
|
|
1440
1463
|
}
|
|
@@ -1444,7 +1467,7 @@ pre.hi-root .line .highlighted-word {
|
|
|
1444
1467
|
}
|
|
1445
1468
|
|
|
1446
1469
|
@media (prefers-reduced-motion: reduce) {
|
|
1447
|
-
::view-transition-old(root), ::view-transition-new(root), ::view-transition-group(root), ::view-transition-old(zfb-
|
|
1470
|
+
::view-transition-old(root), ::view-transition-new(root), ::view-transition-group(root), ::view-transition-old(zfb-sidebar), ::view-transition-old(zfb-footer):only-child, ::view-transition-old(zfb-sidebar-toggle):only-child, ::view-transition-old(zfb-toc-toggle):only-child, ::view-transition-new(zfb-sidebar), ::view-transition-new(zfb-footer):only-child, ::view-transition-new(zfb-sidebar-toggle):only-child, ::view-transition-new(zfb-toc-toggle):only-child {
|
|
1448
1471
|
animation: none;
|
|
1449
1472
|
}
|
|
1450
1473
|
}
|
package/dist/content.css
CHANGED
|
@@ -52,6 +52,9 @@
|
|
|
52
52
|
color: var(--color-fg);
|
|
53
53
|
font-size: var(--text-body);
|
|
54
54
|
line-height: var(--leading-relaxed);
|
|
55
|
+
/* Let ordinary prose and navigation labels reflow at narrow widths (#4585).
|
|
56
|
+
* Preformatted code keeps its white-space contract and local scrolling. */
|
|
57
|
+
overflow-wrap: anywhere;
|
|
55
58
|
}
|
|
56
59
|
|
|
57
60
|
/* ── Flow spacing (vertical rhythm) ── */
|
|
@@ -233,6 +236,12 @@
|
|
|
233
236
|
overflow-wrap: break-word;
|
|
234
237
|
}
|
|
235
238
|
|
|
239
|
+
/* `anywhere` collapses min-content width, so table layout would shrink columns
|
|
240
|
+
* and split identifiers mid-word instead of scrolling the wrapper (#4594). */
|
|
241
|
+
.zd-content :where(th code, td code) {
|
|
242
|
+
overflow-wrap: break-word;
|
|
243
|
+
}
|
|
244
|
+
|
|
236
245
|
.zd-content :where(th) {
|
|
237
246
|
font-weight: var(--font-weight-semibold);
|
|
238
247
|
text-align: left;
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { jsx, jsxs } from "@takazudo/zfb/zudo-react/jsx-runtime";
|
|
2
2
|
import { ClientRouter } from "@takazudo/zfb-runtime";
|
|
3
|
+
import { buildChromeTransitionBootstrap } from "../transitions/chrome-transition-bootstrap.js";
|
|
3
4
|
const DESKTOP_SIDEBAR_ID = "desktop-sidebar";
|
|
4
5
|
function DocLayout(props) {
|
|
5
6
|
const {
|
|
@@ -70,6 +71,7 @@ function DocLayout(props) {
|
|
|
70
71
|
);
|
|
71
72
|
}
|
|
72
73
|
if (head !== void 0) headChildren.push(head);
|
|
74
|
+
if (enableClientRouter !== false) headChildren.push(/* @__PURE__ */ jsx("script", { rawHtml: buildChromeTransitionBootstrap() }));
|
|
73
75
|
return /* @__PURE__ */ jsxs("html", { ...htmlAttrs, children: [
|
|
74
76
|
/* @__PURE__ */ jsx("head", { children: headChildren }),
|
|
75
77
|
/* @__PURE__ */ jsxs("body", { class: "min-h-screen antialiased", children: [
|
package/dist/features.css
CHANGED
|
@@ -283,7 +283,7 @@ pre.hi-root .line .highlighted-word {
|
|
|
283
283
|
}
|
|
284
284
|
|
|
285
285
|
/* Make KaTeX respect our color scheme */
|
|
286
|
-
.katex .base {
|
|
286
|
+
.katex .katex-base {
|
|
287
287
|
color: var(--zd-fg);
|
|
288
288
|
}
|
|
289
289
|
|
|
@@ -457,56 +457,22 @@ html[data-sidebar-hidden] .zd-doc-content-band[data-zd-wide] {
|
|
|
457
457
|
}
|
|
458
458
|
}
|
|
459
459
|
|
|
460
|
-
/*
|
|
461
|
-
*
|
|
462
|
-
*
|
|
463
|
-
*
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
* <header>, <aside id="desktop-sidebar">, <footer>, the desktop-sidebar-toggle
|
|
468
|
-
* button, and (since #3254) the desktop-toc-toggle button each carry a
|
|
469
|
-
* data-zfb-transition-persist attribute whose value is keyed by locale and
|
|
470
|
-
* nav-section. The five attribute selectors below assign a stable
|
|
471
|
-
* view-transition-name based on the attribute value prefix, extracting those
|
|
472
|
-
* elements from the root snapshot into their own named layers:
|
|
473
|
-
* - header-{lang} → zfb-header
|
|
474
|
-
* - sidebar-{locale}-… → zfb-sidebar
|
|
475
|
-
* - footer-{lang} → zfb-footer
|
|
476
|
-
* - desktop-sidebar-toggle → zfb-sidebar-toggle
|
|
477
|
-
* - desktop-toc-toggle → zfb-toc-toggle
|
|
478
|
-
*
|
|
479
|
-
* Once extracted, the root cross-fade animates only non-chrome content (main,
|
|
480
|
-
* article, TOC, etc.). The ::view-transition-{old,new,group}(<name>) rules
|
|
481
|
-
* disable animation for all five chrome layers. The group pseudo must be
|
|
482
|
-
* neutralised too — even when old/new are static the group container can still
|
|
483
|
-
* produce a geometry-morph animation when snapshot size/position differs.
|
|
484
|
-
*
|
|
485
|
-
* Entry/exit cross-fade (zudolab/zudo-doc#2072): animation: none is only
|
|
486
|
-
* correct when the chrome element exists on BOTH pages of a navigation.
|
|
487
|
-
* When it exists on one side only (docs page with sidebar → top page
|
|
488
|
-
* without), the named group holds a single snapshot — frozen at full
|
|
489
|
-
* opacity for the whole transition, then dropped abruptly at finish. The
|
|
490
|
-
* :only-child rules below detect that one-sided case and cross-fade the
|
|
491
|
-
* lone snapshot in sync with the root content fade (spec-standard
|
|
492
|
-
* entry/exit pattern; :only-child outranks the animation: none rules via
|
|
493
|
-
* the extra pseudo-class specificity). */
|
|
494
|
-
|
|
495
|
-
/* Chrome extraction — assign view-transition-name from data-zfb-transition-persist */
|
|
496
|
-
[data-zfb-transition-persist^="header-"] { view-transition-name: zfb-header; }
|
|
497
|
-
[data-zfb-transition-persist^="sidebar-"] { view-transition-name: zfb-sidebar; }
|
|
460
|
+
/* Visual region identity is independent of persistence/remount policy. The
|
|
461
|
+
* layout's header slot is a direct body header, including consumer overrides.
|
|
462
|
+
* A sidebar keeps its name even when incoming island props require replacement.
|
|
463
|
+
* Never name an ancestor of these regions: it would move their whole layer.
|
|
464
|
+
*/
|
|
465
|
+
body > header { view-transition-name: zfb-header; }
|
|
466
|
+
#desktop-sidebar:not(.sr-only) { view-transition-name: zfb-sidebar; }
|
|
498
467
|
[data-zfb-transition-persist^="footer-"] { view-transition-name: zfb-footer; }
|
|
499
|
-
|
|
500
|
-
|
|
468
|
+
.zd-desktop-sidebar-toggle { view-transition-name: zfb-sidebar-toggle; }
|
|
469
|
+
.zd-desktop-toc-toggle { view-transition-name: zfb-toc-toggle; }
|
|
501
470
|
|
|
502
|
-
/*
|
|
503
|
-
*
|
|
504
|
-
* it doesn't animate on SPA swaps). */
|
|
471
|
+
/* Header snapshots and every chrome group stay at their authored geometry.
|
|
472
|
+
* Footer and toggle pairs keep their established stationary policy. */
|
|
505
473
|
::view-transition-old(zfb-header),
|
|
506
474
|
::view-transition-new(zfb-header),
|
|
507
475
|
::view-transition-group(zfb-header),
|
|
508
|
-
::view-transition-old(zfb-sidebar),
|
|
509
|
-
::view-transition-new(zfb-sidebar),
|
|
510
476
|
::view-transition-group(zfb-sidebar),
|
|
511
477
|
::view-transition-old(zfb-footer),
|
|
512
478
|
::view-transition-new(zfb-footer),
|
|
@@ -518,24 +484,35 @@ html[data-sidebar-hidden] .zd-doc-content-band[data-zd-wide] {
|
|
|
518
484
|
::view-transition-new(zfb-toc-toggle),
|
|
519
485
|
::view-transition-group(zfb-toc-toggle) { animation: none; }
|
|
520
486
|
|
|
521
|
-
/*
|
|
522
|
-
*
|
|
523
|
-
::view-transition-
|
|
524
|
-
|
|
487
|
+
/* A translating incoming sidebar/root must not paint over the header's lower
|
|
488
|
+
* edge. Named snapshot groups have their own stacking order above the live DOM. */
|
|
489
|
+
::view-transition-group(zfb-header) { z-index: var(--z-index-toolbar, 20); }
|
|
490
|
+
|
|
491
|
+
/* A category/context change or a one-sided sidebar uses the content animation.
|
|
492
|
+
* The header remains stationary even when replaced or present on only one side.
|
|
493
|
+
* Other chrome retains its established entry/exit behavior. */
|
|
494
|
+
::view-transition-old(zfb-sidebar),
|
|
525
495
|
::view-transition-old(zfb-footer):only-child,
|
|
526
496
|
::view-transition-old(zfb-sidebar-toggle):only-child,
|
|
527
497
|
::view-transition-old(zfb-toc-toggle):only-child {
|
|
528
498
|
animation: var(--default-transition-duration) ease-in both contentFadeOut;
|
|
529
499
|
}
|
|
530
500
|
/* Entry — lone new snapshot fades in with the content cross-fade. */
|
|
531
|
-
::view-transition-new(zfb-
|
|
532
|
-
::view-transition-new(zfb-sidebar):only-child,
|
|
501
|
+
::view-transition-new(zfb-sidebar),
|
|
533
502
|
::view-transition-new(zfb-footer):only-child,
|
|
534
503
|
::view-transition-new(zfb-sidebar-toggle):only-child,
|
|
535
504
|
::view-transition-new(zfb-toc-toggle):only-child {
|
|
536
505
|
animation: var(--zd-transition-slower) ease-out both contentFadeIn;
|
|
537
506
|
}
|
|
538
507
|
|
|
508
|
+
/* Resolved navSection AND the existing navigation context must agree. The
|
|
509
|
+
* context already isolates locale, version and custom-tree topology; article,
|
|
510
|
+
* focused subtree and DOM identity are deliberately irrelevant here. */
|
|
511
|
+
:root[data-zd-sidebar-transition="stationary"]::view-transition-old(zfb-sidebar),
|
|
512
|
+
:root[data-zd-sidebar-transition="stationary"]::view-transition-new(zfb-sidebar) {
|
|
513
|
+
animation: none;
|
|
514
|
+
}
|
|
515
|
+
|
|
539
516
|
/* Root cross-fade rules — animate only the non-chrome snapshot */
|
|
540
517
|
::view-transition-old(root) {
|
|
541
518
|
animation: var(--default-transition-duration) ease-in both contentFadeOut;
|
|
@@ -559,13 +536,11 @@ html[data-sidebar-hidden] .zd-doc-content-band[data-zd-wide] {
|
|
|
559
536
|
::view-transition-old(root),
|
|
560
537
|
::view-transition-new(root),
|
|
561
538
|
::view-transition-group(root),
|
|
562
|
-
::view-transition-old(zfb-
|
|
563
|
-
::view-transition-old(zfb-sidebar):only-child,
|
|
539
|
+
::view-transition-old(zfb-sidebar),
|
|
564
540
|
::view-transition-old(zfb-footer):only-child,
|
|
565
541
|
::view-transition-old(zfb-sidebar-toggle):only-child,
|
|
566
542
|
::view-transition-old(zfb-toc-toggle):only-child,
|
|
567
|
-
::view-transition-new(zfb-
|
|
568
|
-
::view-transition-new(zfb-sidebar):only-child,
|
|
543
|
+
::view-transition-new(zfb-sidebar),
|
|
569
544
|
::view-transition-new(zfb-footer):only-child,
|
|
570
545
|
::view-transition-new(zfb-sidebar-toggle):only-child,
|
|
571
546
|
::view-transition-new(zfb-toc-toggle):only-child {
|
|
@@ -15,13 +15,13 @@ export interface PageLoadingOverlayProps {
|
|
|
15
15
|
*/
|
|
16
16
|
export declare function buildPageLoadingOverlayBootstrap(overlayId: string): string;
|
|
17
17
|
/**
|
|
18
|
-
*
|
|
18
|
+
* Content loading overlay shown while a dynamic navigation is pending.
|
|
19
19
|
*
|
|
20
20
|
* Mount this once per layout (typically inside `DocLayoutWithDefaults`'s
|
|
21
21
|
* `bodyEnd` slot, alongside the existing body-end providers). It is
|
|
22
22
|
* server-rendered and self-wires its visibility — no hydration needed.
|
|
23
23
|
*
|
|
24
|
-
* CSS
|
|
24
|
+
* CSS ships in `@takazudo/zudo-doc/page-loading.css` (`.page-loading-overlay`,
|
|
25
25
|
* `.page-loading-spinner`, `[data-zd-nav-pending]` rules) rather than in an
|
|
26
26
|
* inline `<style>` block here — a `<style>` inside `<body>` violates HTML5
|
|
27
27
|
* element-permitted-content and fails html-validate (same fix applied to the
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { Fragment, jsx, jsxs } from "@takazudo/zfb/zudo-react/jsx-runtime";
|
|
2
2
|
import {
|
|
3
3
|
AFTER_NAVIGATE_EVENT,
|
|
4
|
-
BEFORE_NAVIGATE_EVENT
|
|
4
|
+
BEFORE_NAVIGATE_EVENT,
|
|
5
|
+
NAVIGATION_ABORTED_EVENT
|
|
5
6
|
} from "../transitions/page-events.js";
|
|
6
7
|
const PAGE_LOADING_OVERLAY_ID = "page-loading-overlay";
|
|
7
8
|
function buildPageLoadingOverlayBootstrap(overlayId) {
|
|
@@ -10,7 +11,7 @@ function buildPageLoadingOverlayBootstrap(overlayId) {
|
|
|
10
11
|
const after = JSON.stringify(AFTER_NAVIGATE_EVENT);
|
|
11
12
|
return `(function(){
|
|
12
13
|
var id=${id};
|
|
13
|
-
function show(){var el=document.getElementById(id);if(!el)return;el.setAttribute("data-visible","");el.setAttribute("aria-hidden","false");}
|
|
14
|
+
function show(){var el=document.getElementById(id);if(!el)return;var content=document.querySelector(".zd-sidebar-content-wrapper");var header=document.querySelector("body > header");el.style.left=Math.max(0,content?content.getBoundingClientRect().left:0)+"px";el.style.top=Math.max(0,header?header.getBoundingClientRect().bottom:0)+"px";el.setAttribute("data-visible","");el.setAttribute("aria-hidden","false");}
|
|
14
15
|
function hide(){var el=document.getElementById(id);if(!el)return;el.removeAttribute("data-visible");el.setAttribute("aria-hidden","true");}
|
|
15
16
|
function setPending(ev){document.querySelectorAll("[data-zd-nav-pending]").forEach(function(el){el.removeAttribute("data-zd-nav-pending");});var src=ev&&ev.sourceElement;if(src&&src instanceof Element)src.setAttribute("data-zd-nav-pending","");}
|
|
16
17
|
function clearPending(){document.querySelectorAll("[data-zd-nav-pending]").forEach(function(el){el.removeAttribute("data-zd-nav-pending");});}
|
|
@@ -18,6 +19,7 @@ document.addEventListener(${before},show);
|
|
|
18
19
|
document.addEventListener(${after},hide);
|
|
19
20
|
document.addEventListener(${before},setPending);
|
|
20
21
|
document.addEventListener(${after},clearPending);
|
|
22
|
+
document.addEventListener(${JSON.stringify(NAVIGATION_ABORTED_EVENT)},function(){hide();clearPending();});
|
|
21
23
|
})();`;
|
|
22
24
|
}
|
|
23
25
|
function PageLoadingOverlay({
|
package/dist/page-loading.css
CHANGED
|
@@ -31,8 +31,9 @@
|
|
|
31
31
|
|
|
32
32
|
.page-loading-overlay {
|
|
33
33
|
position: fixed;
|
|
34
|
+
view-transition-name: zfb-loading;
|
|
34
35
|
inset: 0;
|
|
35
|
-
/*
|
|
36
|
+
/* Pending-content overlay — the bootstrap excludes the layout's chrome.
|
|
36
37
|
--z-index-modal fallback (100) ensures the overlay stacks on top even for
|
|
37
38
|
bare consumers that have not defined the token. */
|
|
38
39
|
z-index: var(--z-index-modal, 100);
|
|
@@ -45,11 +46,13 @@
|
|
|
45
46
|
);
|
|
46
47
|
opacity: 0;
|
|
47
48
|
pointer-events: none;
|
|
48
|
-
|
|
49
|
+
/* Hidden loading feedback must disappear synchronously. */
|
|
50
|
+
transition: none;
|
|
49
51
|
}
|
|
50
52
|
|
|
51
53
|
.page-loading-overlay[data-visible] {
|
|
52
54
|
opacity: 1;
|
|
55
|
+
transition: opacity 150ms ease-out;
|
|
53
56
|
}
|
|
54
57
|
|
|
55
58
|
a[data-zd-nav-pending],
|
|
@@ -90,3 +93,11 @@ button[data-zd-nav-pending] {
|
|
|
90
93
|
border-bottom-color: var(--color-page-loading-spinner, #fff);
|
|
91
94
|
}
|
|
92
95
|
}
|
|
96
|
+
|
|
97
|
+
/* Pending feedback belongs to the fetch, not the page cross-fade. Extract it
|
|
98
|
+
* from the root snapshot, then suppress its snapshot layer. This also avoids
|
|
99
|
+
* an unscoped after-preparation event from an older fetch hiding newer feedback.
|
|
100
|
+
*/
|
|
101
|
+
::view-transition-group(zfb-loading) { animation: none; }
|
|
102
|
+
::view-transition-old(zfb-loading),
|
|
103
|
+
::view-transition-new(zfb-loading) { display: none; }
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { createRequire } from "node:module";
|
|
2
|
+
function shadowSource(specifier) {
|
|
3
|
+
const message = `Optional peer "${specifier}" is shadowed: it is not installed or the zudo-doc feature that uses it is off.`;
|
|
4
|
+
return `throw new Error(${JSON.stringify(message)});
|
|
5
|
+
export {};
|
|
6
|
+
`;
|
|
7
|
+
}
|
|
8
|
+
function stringList(value) {
|
|
9
|
+
return Array.isArray(value) ? value.filter((v) => typeof v === "string") : [];
|
|
10
|
+
}
|
|
11
|
+
function isResolvable(specifier) {
|
|
12
|
+
try {
|
|
13
|
+
createRequire(import.meta.url).resolve(specifier);
|
|
14
|
+
return true;
|
|
15
|
+
} catch {
|
|
16
|
+
return false;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
const plugin = {
|
|
20
|
+
name: "optional-peers",
|
|
21
|
+
setup(ctx) {
|
|
22
|
+
const shadow = [
|
|
23
|
+
...stringList(ctx.options["shadow"]),
|
|
24
|
+
...stringList(ctx.options["shadowIfMissing"]).filter((s) => !isResolvable(s))
|
|
25
|
+
];
|
|
26
|
+
for (const specifier of shadow) {
|
|
27
|
+
ctx.addVirtualModule(specifier, () => shadowSource(specifier));
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
};
|
|
31
|
+
var optional_peers_default = plugin;
|
|
32
|
+
export {
|
|
33
|
+
optional_peers_default as default
|
|
34
|
+
};
|
package/dist/preset.d.ts
CHANGED
|
@@ -115,6 +115,8 @@ export interface PresetSettings {
|
|
|
115
115
|
trailingSlash: boolean;
|
|
116
116
|
minifyHtml?: boolean;
|
|
117
117
|
mermaid: boolean;
|
|
118
|
+
/** KaTeX math rendering; when off, the optional `katex` peer is shadowed. */
|
|
119
|
+
math?: boolean;
|
|
118
120
|
/** Enable transclusion of other Markdown/MDX files. */
|
|
119
121
|
transclude?: boolean;
|
|
120
122
|
onBrokenMarkdownLinks: "warn" | "error" | "ignore";
|
package/dist/preset.js
CHANGED
|
@@ -130,6 +130,16 @@ function buildMarkdownFeatures(settings, directiveVocabulary) {
|
|
|
130
130
|
headingIds: { strategy: "hierarchical" }
|
|
131
131
|
};
|
|
132
132
|
}
|
|
133
|
+
function optionalPeerShadows(settings) {
|
|
134
|
+
const peers = [
|
|
135
|
+
["katex", Boolean(settings.math)],
|
|
136
|
+
["diff", Boolean(settings.docHistory)]
|
|
137
|
+
];
|
|
138
|
+
return {
|
|
139
|
+
shadow: peers.filter(([, on]) => !on).map(([name]) => name),
|
|
140
|
+
shadowIfMissing: peers.filter(([, on]) => on).map(([name]) => name)
|
|
141
|
+
};
|
|
142
|
+
}
|
|
133
143
|
function buildPlugins(settings, routeContext) {
|
|
134
144
|
const localeArray = Object.entries(settings.locales).map(([code, locale]) => ({
|
|
135
145
|
code,
|
|
@@ -337,7 +347,10 @@ function buildPlugins(settings, routeContext) {
|
|
|
337
347
|
// `design-token-panel-bootstrap` (#4261). Preset-level rather than inside
|
|
338
348
|
// the routes plugin because the bootstrap is reachable from chrome even
|
|
339
349
|
// when packageOwnedRoutes is off.
|
|
340
|
-
...resolvesBundleZdtp(settings) ? [] : [{ name: "@takazudo/zudo-doc/plugins/zdtp-loader", options: {} }]
|
|
350
|
+
...resolvesBundleZdtp(settings) ? [] : [{ name: "@takazudo/zudo-doc/plugins/zdtp-loader", options: {} }],
|
|
351
|
+
// Absent or disabled katex/diff → throwing shadows, so they cannot fail a
|
|
352
|
+
// Rolldown build (Takazudo/zudo-front-builder#4429).
|
|
353
|
+
{ name: "@takazudo/zudo-doc/plugins/optional-peers", options: optionalPeerShadows(settings) }
|
|
341
354
|
];
|
|
342
355
|
}
|
|
343
356
|
export {
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { BEFORE_SWAP_EVENT } from "./page-events.js";
|
|
2
|
+
function buildChromeTransitionBootstrap() {
|
|
3
|
+
return `(function(){
|
|
4
|
+
if(document.__zdChromeTransitionPolicy)return;
|
|
5
|
+
document.__zdChromeTransitionPolicy=true;
|
|
6
|
+
function identity(doc){
|
|
7
|
+
var sidebar=doc.getElementById("desktop-sidebar");
|
|
8
|
+
var context=sidebar&&sidebar.querySelector("[data-sidebar-context]");
|
|
9
|
+
var band=doc.querySelector("[data-zd-nav-section]");
|
|
10
|
+
return {section:band&&band.getAttribute("data-zd-nav-section"),context:band&&!band.hasAttribute("data-zd-nosidebar")&&context&&context.getAttribute("data-sidebar-context")};
|
|
11
|
+
}
|
|
12
|
+
document.addEventListener(${JSON.stringify(BEFORE_SWAP_EVENT)},function(ev){
|
|
13
|
+
var incoming=ev.newDocument;
|
|
14
|
+
if(!incoming||incoming.nodeType!==9)return;
|
|
15
|
+
var from=identity(document),to=identity(incoming);
|
|
16
|
+
var stationary=!!from.section&&!!from.context&&from.section===to.section&&from.context===to.context;
|
|
17
|
+
incoming.documentElement.setAttribute("data-zd-sidebar-transition",stationary?"stationary":"changing");
|
|
18
|
+
});
|
|
19
|
+
})();`;
|
|
20
|
+
}
|
|
21
|
+
export {
|
|
22
|
+
buildChromeTransitionBootstrap
|
|
23
|
+
};
|
|
@@ -7,6 +7,10 @@
|
|
|
7
7
|
* the v2 vocabulary.
|
|
8
8
|
*/
|
|
9
9
|
export declare const BEFORE_NAVIGATE_EVENT = "zfb:before-preparation";
|
|
10
|
+
/** Fetch/preparation finished, before the native old snapshot is captured. */
|
|
11
|
+
export declare const AFTER_PREPARATION_EVENT = "zfb:after-preparation";
|
|
12
|
+
/** A navigation was abandoned before committing the destination DOM. */
|
|
13
|
+
export declare const NAVIGATION_ABORTED_EVENT = "zfb:navigation-aborted";
|
|
10
14
|
/**
|
|
11
15
|
* Event name fired after a SPA body swap. Today resolves to
|
|
12
16
|
* `"zfb:after-swap"`. The initial page load uses `zfb:page-load` instead;
|
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
const BEFORE_NAVIGATE_EVENT = "zfb:before-preparation";
|
|
2
|
+
const AFTER_PREPARATION_EVENT = "zfb:after-preparation";
|
|
3
|
+
const NAVIGATION_ABORTED_EVENT = "zfb:navigation-aborted";
|
|
2
4
|
const AFTER_NAVIGATE_EVENT = "zfb:after-swap";
|
|
3
5
|
const BEFORE_SWAP_EVENT = "zfb:before-swap";
|
|
4
6
|
function onBeforeNavigate(handler) {
|
|
@@ -15,8 +17,10 @@ function onAfterNavigate(handler) {
|
|
|
15
17
|
}
|
|
16
18
|
export {
|
|
17
19
|
AFTER_NAVIGATE_EVENT,
|
|
20
|
+
AFTER_PREPARATION_EVENT,
|
|
18
21
|
BEFORE_NAVIGATE_EVENT,
|
|
19
22
|
BEFORE_SWAP_EVENT,
|
|
23
|
+
NAVIGATION_ABORTED_EVENT,
|
|
20
24
|
onAfterNavigate,
|
|
21
25
|
onBeforeNavigate
|
|
22
26
|
};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/** @jsxRuntime automatic */
|
|
2
|
-
// Server-rendered, zero-hydration
|
|
2
|
+
// Server-rendered, zero-hydration content loading overlay.
|
|
3
3
|
//
|
|
4
4
|
// Renders the overlay and its bootstrap into the document:
|
|
5
5
|
//
|
|
@@ -15,12 +15,13 @@
|
|
|
15
15
|
// `zfb:after-swap` (AFTER_NAVIGATE_EVENT); see
|
|
16
16
|
// `transitions/page-events.ts` for rationale.
|
|
17
17
|
//
|
|
18
|
-
// Its CSS
|
|
18
|
+
// Its package CSS is imported by the host, and the component is not
|
|
19
19
|
// hydrated: the static script owns its navigation listeners.
|
|
20
20
|
|
|
21
21
|
import {
|
|
22
22
|
AFTER_NAVIGATE_EVENT,
|
|
23
23
|
BEFORE_NAVIGATE_EVENT,
|
|
24
|
+
NAVIGATION_ABORTED_EVENT,
|
|
24
25
|
} from "../transitions/page-events.js";
|
|
25
26
|
|
|
26
27
|
/** Default `id` for the overlay element. Stable so test rigs can target it. */
|
|
@@ -52,7 +53,7 @@ export function buildPageLoadingOverlayBootstrap(overlayId: string): string {
|
|
|
52
53
|
const after = JSON.stringify(AFTER_NAVIGATE_EVENT);
|
|
53
54
|
return `(function(){
|
|
54
55
|
var id=${id};
|
|
55
|
-
function show(){var el=document.getElementById(id);if(!el)return;el.setAttribute("data-visible","");el.setAttribute("aria-hidden","false");}
|
|
56
|
+
function show(){var el=document.getElementById(id);if(!el)return;var content=document.querySelector(".zd-sidebar-content-wrapper");var header=document.querySelector("body > header");el.style.left=Math.max(0,content?content.getBoundingClientRect().left:0)+"px";el.style.top=Math.max(0,header?header.getBoundingClientRect().bottom:0)+"px";el.setAttribute("data-visible","");el.setAttribute("aria-hidden","false");}
|
|
56
57
|
function hide(){var el=document.getElementById(id);if(!el)return;el.removeAttribute("data-visible");el.setAttribute("aria-hidden","true");}
|
|
57
58
|
function setPending(ev){document.querySelectorAll("[data-zd-nav-pending]").forEach(function(el){el.removeAttribute("data-zd-nav-pending");});var src=ev&&ev.sourceElement;if(src&&src instanceof Element)src.setAttribute("data-zd-nav-pending","");}
|
|
58
59
|
function clearPending(){document.querySelectorAll("[data-zd-nav-pending]").forEach(function(el){el.removeAttribute("data-zd-nav-pending");});}
|
|
@@ -60,17 +61,18 @@ document.addEventListener(${before},show);
|
|
|
60
61
|
document.addEventListener(${after},hide);
|
|
61
62
|
document.addEventListener(${before},setPending);
|
|
62
63
|
document.addEventListener(${after},clearPending);
|
|
64
|
+
document.addEventListener(${JSON.stringify(NAVIGATION_ABORTED_EVENT)},function(){hide();clearPending();});
|
|
63
65
|
})();`;
|
|
64
66
|
}
|
|
65
67
|
|
|
66
68
|
/**
|
|
67
|
-
*
|
|
69
|
+
* Content loading overlay shown while a dynamic navigation is pending.
|
|
68
70
|
*
|
|
69
71
|
* Mount this once per layout (typically inside `DocLayoutWithDefaults`'s
|
|
70
72
|
* `bodyEnd` slot, alongside the existing body-end providers). It is
|
|
71
73
|
* server-rendered and self-wires its visibility — no hydration needed.
|
|
72
74
|
*
|
|
73
|
-
* CSS
|
|
75
|
+
* CSS ships in `@takazudo/zudo-doc/page-loading.css` (`.page-loading-overlay`,
|
|
74
76
|
* `.page-loading-spinner`, `[data-zd-nav-pending]` rules) rather than in an
|
|
75
77
|
* inline `<style>` block here — a `<style>` inside `<body>` violates HTML5
|
|
76
78
|
* element-permitted-content and fails html-validate (same fix applied to the
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@takazudo/zudo-doc",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "7.1.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",
|
|
@@ -14,6 +14,9 @@
|
|
|
14
14
|
"bugs": {
|
|
15
15
|
"url": "https://github.com/zudolab/zudo-doc/issues"
|
|
16
16
|
},
|
|
17
|
+
"engines": {
|
|
18
|
+
"node": ">=24 <25"
|
|
19
|
+
},
|
|
17
20
|
"keywords": [
|
|
18
21
|
"zudo-doc",
|
|
19
22
|
"documentation",
|
|
@@ -203,6 +206,10 @@
|
|
|
203
206
|
"types": "./dist/plugins/zdtp-loader.d.ts",
|
|
204
207
|
"default": "./dist/plugins/zdtp-loader.js"
|
|
205
208
|
},
|
|
209
|
+
"./plugins/optional-peers": {
|
|
210
|
+
"types": "./dist/plugins/optional-peers.d.ts",
|
|
211
|
+
"default": "./dist/plugins/optional-peers.js"
|
|
212
|
+
},
|
|
206
213
|
"./content-admonition": {
|
|
207
214
|
"types": "./dist/content-admonition/index.d.ts",
|
|
208
215
|
"default": "./dist/content-admonition/index.js"
|
|
@@ -733,12 +740,12 @@
|
|
|
733
740
|
"peerDependencies": {
|
|
734
741
|
"@modelcontextprotocol/sdk": "1.32.1",
|
|
735
742
|
"@takazudo/zdtp": "^0.5.2 || ^0.6.0 || ^0.7.0 || ^0.8.0",
|
|
736
|
-
"@takazudo/zfb": "^4.
|
|
737
|
-
"@takazudo/zfb-md-wasm": "^4.
|
|
738
|
-
"@takazudo/zfb-runtime": "^4.
|
|
739
|
-
"@takazudo/zudo-doc-history-server": "^
|
|
743
|
+
"@takazudo/zfb": "^4.7.0",
|
|
744
|
+
"@takazudo/zfb-md-wasm": "^4.7.0",
|
|
745
|
+
"@takazudo/zfb-runtime": "^4.7.0",
|
|
746
|
+
"@takazudo/zudo-doc-history-server": "^7.0.0",
|
|
740
747
|
"diff": "^8.0.0",
|
|
741
|
-
"katex": "^0.
|
|
748
|
+
"katex": "^0.18.2 || ^0.19.0",
|
|
742
749
|
"zod": "^4.3.6"
|
|
743
750
|
},
|
|
744
751
|
"peerDependenciesMeta": {
|
|
@@ -776,9 +783,9 @@
|
|
|
776
783
|
"devDependencies": {
|
|
777
784
|
"@modelcontextprotocol/sdk": "1.32.1",
|
|
778
785
|
"@takazudo/mdx-formatter": "1.3.0",
|
|
779
|
-
"@takazudo/zfb": "4.
|
|
780
|
-
"@takazudo/zfb-md-wasm": "4.
|
|
781
|
-
"@takazudo/zfb-runtime": "4.
|
|
786
|
+
"@takazudo/zfb": "4.7.0",
|
|
787
|
+
"@takazudo/zfb-md-wasm": "4.7.0",
|
|
788
|
+
"@takazudo/zfb-runtime": "4.7.0",
|
|
782
789
|
"@types/fs-extra": "^11.0.4",
|
|
783
790
|
"@types/minimist": "^1.2.5",
|
|
784
791
|
"@types/node": "^25.3.5",
|
|
@@ -788,7 +795,7 @@
|
|
|
788
795
|
"typescript": "^5.0.0",
|
|
789
796
|
"vitest": "^4.1.0",
|
|
790
797
|
"zod": "^4.3.6",
|
|
791
|
-
"@takazudo/zudo-doc-history-server": "
|
|
798
|
+
"@takazudo/zudo-doc-history-server": "7.1.0"
|
|
792
799
|
},
|
|
793
800
|
"scripts": {
|
|
794
801
|
"gen:search-widget-script": "node scripts/gen-search-widget-script.mjs",
|