@takazudo/zudo-doc 5.28.2 → 6.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (511) hide show
  1. package/CHANGELOG.md +33 -0
  2. package/README.md +49 -16
  3. package/bin/gen-z-index.mjs +18 -18
  4. package/dist/agent-docs/identity.d.ts +4 -0
  5. package/dist/agent-docs/identity.js +24 -0
  6. package/dist/agent-docs/index.d.ts +5 -0
  7. package/dist/agent-docs/index.js +5 -0
  8. package/dist/agent-docs/limits.d.ts +11 -0
  9. package/dist/agent-docs/limits.js +24 -0
  10. package/dist/agent-docs/search.d.ts +14 -0
  11. package/dist/agent-docs/search.js +82 -0
  12. package/dist/agent-docs/tokenize.d.ts +2 -0
  13. package/dist/agent-docs/tokenize.js +22 -0
  14. package/dist/agent-docs/types.d.ts +68 -0
  15. package/dist/agent-docs/types.js +0 -0
  16. package/dist/ai-chat-modal/index.d.ts +1 -4
  17. package/dist/ai-chat-modal/index.js +183 -123
  18. package/dist/asset-components/asset-card.d.ts +1 -2
  19. package/dist/asset-components/asset-card.js +12 -12
  20. package/dist/asset-components/asset-code.d.ts +1 -2
  21. package/dist/asset-components/asset-code.js +10 -10
  22. package/dist/asset-components/shared.d.ts +3 -4
  23. package/dist/asset-components/shared.js +4 -4
  24. package/dist/asset-index-page/body.d.ts +5 -6
  25. package/dist/asset-index-page/body.js +6 -6
  26. package/dist/asset-index-page/index.d.ts +1 -2
  27. package/dist/asset-index-page/index.js +1 -1
  28. package/dist/asset-page/body.d.ts +5 -9
  29. package/dist/asset-page/body.js +3 -3
  30. package/dist/asset-page/components.d.ts +16 -17
  31. package/dist/asset-page/components.js +10 -9
  32. package/dist/asset-page/index.d.ts +1 -2
  33. package/dist/asset-page/index.js +1 -1
  34. package/dist/auto-logo/index.d.ts +1 -2
  35. package/dist/auto-logo/index.js +2 -2
  36. package/dist/body-foot-util/body-foot-util-area.d.ts +3 -4
  37. package/dist/body-foot-util/body-foot-util-area.js +1 -2
  38. package/dist/body-foot-util/edit-link.d.ts +2 -3
  39. package/dist/body-foot-util/edit-link.js +1 -2
  40. package/dist/breadcrumb/breadcrumb.d.ts +6 -6
  41. package/dist/breadcrumb/breadcrumb.js +3 -4
  42. package/dist/catalog.js +1 -1
  43. package/dist/category-nav/index.d.ts +1 -2
  44. package/dist/category-nav/index.js +11 -5
  45. package/dist/category-tree-nav/index.d.ts +1 -2
  46. package/dist/category-tree-nav/index.js +3 -3
  47. package/dist/chrome/derive.d.ts +18 -27
  48. package/dist/chrome/derive.js +47 -29
  49. package/dist/chrome/index.d.ts +5 -5
  50. package/dist/chrome/index.js +1 -1
  51. package/dist/chrome/island-data.d.ts +4 -0
  52. package/dist/chrome/island-data.js +52 -0
  53. package/dist/chrome/primary-slots.d.ts +2 -3
  54. package/dist/chrome-bindings.d.ts +30 -22
  55. package/dist/code-group/index.d.ts +3 -4
  56. package/dist/code-group/index.js +3 -7
  57. package/dist/code-syntax/code-block-enhancer.d.ts +1 -2
  58. package/dist/code-syntax/code-block-enhancer.js +2 -2
  59. package/dist/code-syntax/mermaid-init.d.ts +1 -2
  60. package/dist/code-syntax/mermaid-init.js +5 -2
  61. package/dist/code-syntax/tabs-init-script.js +1 -1
  62. package/dist/code-syntax/tabs-init.d.ts +1 -2
  63. package/dist/code-syntax/tabs-init.js +2 -2
  64. package/dist/code-syntax/tabs.d.ts +6 -6
  65. package/dist/code-syntax/tabs.js +8 -8
  66. package/dist/compiled.css +2937 -2942
  67. package/dist/config/component-tokens.d.ts +1 -1
  68. package/dist/config/component-tokens.js +22 -0
  69. package/dist/config-assertions/index.d.ts +13 -0
  70. package/dist/config-assertions/index.js +14 -0
  71. package/dist/config.d.ts +36 -17
  72. package/dist/config.js +23 -95
  73. package/dist/content/content-blockquote.d.ts +2 -3
  74. package/dist/content/content-blockquote.js +3 -3
  75. package/dist/content/content-code.d.ts +3 -4
  76. package/dist/content/content-code.js +5 -5
  77. package/dist/content/content-link.d.ts +3 -4
  78. package/dist/content/content-link.js +10 -10
  79. package/dist/content/content-ol.d.ts +2 -3
  80. package/dist/content/content-ol.js +5 -4
  81. package/dist/content/content-paragraph.d.ts +2 -3
  82. package/dist/content/content-paragraph.js +1 -1
  83. package/dist/content/content-strong.d.ts +2 -3
  84. package/dist/content/content-strong.js +3 -3
  85. package/dist/content/content-table.d.ts +2 -3
  86. package/dist/content/content-table.js +4 -4
  87. package/dist/content/content-ul.d.ts +2 -3
  88. package/dist/content/content-ul.js +4 -4
  89. package/dist/content/heading-h2.d.ts +2 -3
  90. package/dist/content/heading-h2.js +4 -4
  91. package/dist/content/heading-h3.d.ts +2 -3
  92. package/dist/content/heading-h3.js +4 -4
  93. package/dist/content/heading-h4.d.ts +2 -3
  94. package/dist/content/heading-h4.js +4 -4
  95. package/dist/content-admonition/index.d.ts +3 -4
  96. package/dist/content-admonition/index.js +2 -2
  97. package/dist/content.css +35 -33
  98. package/dist/design-token-panel-bootstrap-controller.d.ts +178 -0
  99. package/dist/design-token-panel-bootstrap-controller.js +359 -0
  100. package/dist/design-token-panel-bootstrap-island.d.ts +5 -0
  101. package/dist/design-token-panel-bootstrap-island.js +19 -0
  102. package/dist/design-token-panel-bootstrap.d.ts +5 -195
  103. package/dist/design-token-panel-bootstrap.js +3 -288
  104. package/dist/desktop-sidebar-toggle-island/index.d.ts +2 -7
  105. package/dist/desktop-sidebar-toggle-island/index.js +2 -58
  106. package/dist/desktop-sidebar-toggle-island/island.d.ts +4 -0
  107. package/dist/desktop-sidebar-toggle-island/island.js +43 -0
  108. package/dist/desktop-sidebar-toggle-island/storage.d.ts +4 -0
  109. package/dist/desktop-sidebar-toggle-island/storage.js +29 -0
  110. package/dist/desktop-toc-toggle-island/index.d.ts +2 -7
  111. package/dist/desktop-toc-toggle-island/index.js +2 -58
  112. package/dist/desktop-toc-toggle-island/island.d.ts +4 -0
  113. package/dist/desktop-toc-toggle-island/island.js +43 -0
  114. package/dist/desktop-toc-toggle-island/storage.d.ts +4 -0
  115. package/dist/desktop-toc-toggle-island/storage.js +29 -0
  116. package/dist/details/details.d.ts +3 -4
  117. package/dist/details/details.js +1 -1
  118. package/dist/doc-body-end/index.d.ts +1 -2
  119. package/dist/doc-body-end/index.js +1 -1
  120. package/dist/doc-body-end-islands/design-token-panel-island.d.ts +2 -2
  121. package/dist/doc-body-end-islands/design-token-panel-island.js +3 -7
  122. package/dist/doc-body-end-islands/index.d.ts +4 -21
  123. package/dist/doc-body-end-islands/index.js +5 -3
  124. package/dist/doc-body-end-islands/theme-pack-switcher-island.d.ts +3 -13
  125. package/dist/doc-body-end-islands/theme-pack-switcher-island.js +11 -13
  126. package/dist/doc-content-header/index.d.ts +1 -2
  127. package/dist/doc-content-header/index.js +1 -1
  128. package/dist/doc-history/index.d.ts +1 -1
  129. package/dist/doc-history/index.js +166 -141
  130. package/dist/doc-history-area/index.d.ts +6 -4
  131. package/dist/doc-history-area/index.js +17 -16
  132. package/dist/doc-metainfo-area/index.d.ts +2 -3
  133. package/dist/doc-metainfo-area/index.js +1 -1
  134. package/dist/doc-page-renderer/index.d.ts +13 -7
  135. package/dist/doc-page-renderer/index.js +10 -1
  136. package/dist/doc-page-shell/index.d.ts +20 -7
  137. package/dist/doc-page-shell/index.js +17 -6
  138. package/dist/doc-pager/index.d.ts +1 -2
  139. package/dist/doc-pager/index.js +3 -3
  140. package/dist/doc-tags-area/index.d.ts +2 -3
  141. package/dist/doc-tags-area/index.js +1 -1
  142. package/dist/doclayout/doc-layout-with-defaults.d.ts +9 -9
  143. package/dist/doclayout/doc-layout-with-defaults.js +5 -15
  144. package/dist/doclayout/doc-layout.d.ts +26 -27
  145. package/dist/doclayout/doc-layout.js +23 -14
  146. package/dist/docs-schema/index.d.ts +4 -0
  147. package/dist/docs-schema/index.js +1 -0
  148. package/dist/extract-headings/index.js +43 -12
  149. package/dist/factory-context/index.d.ts +22 -19
  150. package/dist/features.css +75 -8
  151. package/dist/find-in-page/find-bar.d.ts +4 -2
  152. package/dist/find-in-page/find-bar.js +58 -69
  153. package/dist/find-in-page/index.d.ts +2 -8
  154. package/dist/find-in-page/index.js +33 -30
  155. package/dist/footer/footer.d.ts +3 -4
  156. package/dist/footer/footer.js +3 -3
  157. package/dist/footer-with-defaults/index.d.ts +2 -3
  158. package/dist/footer-with-defaults/index.js +1 -1
  159. package/dist/frontmatter-preview-defaults/index.js +1 -0
  160. package/dist/head/doc-head.d.ts +1 -1
  161. package/dist/head/doc-head.js +24 -32
  162. package/dist/head/og-tags.d.ts +1 -1
  163. package/dist/head/og-tags.js +8 -7
  164. package/dist/head/twitter-card.d.ts +1 -1
  165. package/dist/head/twitter-card.js +1 -1
  166. package/dist/head-with-defaults/index.d.ts +7 -2
  167. package/dist/head-with-defaults/index.js +46 -32
  168. package/dist/header/header.d.ts +8 -8
  169. package/dist/header/header.js +9 -11
  170. package/dist/header/types.d.ts +7 -7
  171. package/dist/header-with-defaults/index.d.ts +3 -4
  172. package/dist/header-with-defaults/index.js +27 -14
  173. package/dist/home-intro/index.d.ts +2 -5
  174. package/dist/home-intro/index.js +7 -5
  175. package/dist/home-intro/prepare.js +4 -3
  176. package/dist/home-page/index.d.ts +3 -3
  177. package/dist/home-page/index.js +19 -17
  178. package/dist/html-preview-wrapper/highlighted-code.d.ts +3 -4
  179. package/dist/html-preview-wrapper/highlighted-code.js +19 -17
  180. package/dist/html-preview-wrapper/html-preview-wrapper.d.ts +4 -25
  181. package/dist/html-preview-wrapper/html-preview-wrapper.js +2 -87
  182. package/dist/html-preview-wrapper/html-preview.d.ts +3 -10
  183. package/dist/html-preview-wrapper/html-preview.js +13 -37
  184. package/dist/html-preview-wrapper/index.d.ts +2 -1
  185. package/dist/html-preview-wrapper/index.js +1 -1
  186. package/dist/html-preview-wrapper/preview-base.d.ts +3 -5
  187. package/dist/html-preview-wrapper/preview-base.js +56 -59
  188. package/dist/html-preview-wrapper/wrapper.d.ts +20 -0
  189. package/dist/html-preview-wrapper/wrapper.js +37 -0
  190. package/dist/hydration-pending.d.ts +3 -5
  191. package/dist/hydration-pending.js +7 -5
  192. package/dist/i18n-version/language-switcher.d.ts +5 -32
  193. package/dist/i18n-version/language-switcher.js +5 -106
  194. package/dist/i18n-version/switcher-generated-scripts.d.ts +2 -0
  195. package/dist/i18n-version/switcher-generated-scripts.js +107 -0
  196. package/dist/i18n-version/switcher-url-state.d.ts +76 -0
  197. package/dist/i18n-version/switcher-url-state.js +103 -0
  198. package/dist/i18n-version/version-banner.d.ts +2 -3
  199. package/dist/i18n-version/version-banner.js +1 -1
  200. package/dist/i18n-version/version-switcher.d.ts +5 -50
  201. package/dist/i18n-version/version-switcher.js +5 -157
  202. package/dist/icons/index.d.ts +18 -19
  203. package/dist/icons/index.js +17 -33
  204. package/dist/image-enlarge/index.d.ts +1 -10
  205. package/dist/image-enlarge/index.js +80 -55
  206. package/dist/image-enlarge/public.d.ts +2 -0
  207. package/dist/image-enlarge/public.js +6 -0
  208. package/dist/image-enlarge/ssr-fallback.d.ts +2 -0
  209. package/dist/image-enlarge/ssr-fallback.js +8 -0
  210. package/dist/index.d.ts +11 -4
  211. package/dist/inline-version-switcher/index.d.ts +1 -2
  212. package/dist/inline-version-switcher/index.js +1 -1
  213. package/dist/island-types/index.d.ts +2 -2
  214. package/dist/island-types/index.js +1 -5
  215. package/dist/math-block/index.d.ts +4 -7
  216. package/dist/math-block/index.js +5 -5
  217. package/dist/mcp/handler.d.ts +8 -0
  218. package/dist/mcp/handler.js +129 -0
  219. package/dist/mcp/index.d.ts +4 -0
  220. package/dist/mcp/index.js +7 -0
  221. package/dist/mcp/loader.d.ts +19 -0
  222. package/dist/mcp/loader.js +202 -0
  223. package/dist/mdx-components/index.js +40 -108
  224. package/dist/mermaid-enlarge/index.d.ts +1 -8
  225. package/dist/mermaid-enlarge/index.js +174 -158
  226. package/dist/mermaid-enlarge/public.d.ts +2 -0
  227. package/dist/mermaid-enlarge/public.js +6 -0
  228. package/dist/mermaid-enlarge/ssr-fallback.d.ts +2 -0
  229. package/dist/mermaid-enlarge/ssr-fallback.js +8 -0
  230. package/dist/metainfo/doc-metainfo.d.ts +2 -3
  231. package/dist/metainfo/doc-metainfo.js +1 -4
  232. package/dist/metainfo/doc-tags.d.ts +2 -3
  233. package/dist/metainfo/doc-tags.js +1 -1
  234. package/dist/metainfo/frontmatter-preview.d.ts +3 -4
  235. package/dist/metainfo/frontmatter-preview.js +1 -1
  236. package/dist/nav-data-prep/index.js +6 -4
  237. package/dist/nav-indexing/category-nav.d.ts +2 -3
  238. package/dist/nav-indexing/category-nav.js +1 -2
  239. package/dist/nav-indexing/category-tree-nav.d.ts +2 -3
  240. package/dist/nav-indexing/category-tree-nav.js +1 -1
  241. package/dist/nav-indexing/doc-card-grid.d.ts +2 -3
  242. package/dist/nav-indexing/doc-card-grid.js +1 -2
  243. package/dist/nav-indexing/docs-sitemap.d.ts +2 -3
  244. package/dist/nav-indexing/docs-sitemap.js +2 -2
  245. package/dist/nav-indexing/index.d.ts +1 -1
  246. package/dist/nav-indexing/nav-card-grid.d.ts +2 -3
  247. package/dist/nav-indexing/nav-card-grid.js +1 -2
  248. package/dist/nav-indexing/note-tray-index-parts/card-list.d.ts +1 -2
  249. package/dist/nav-indexing/note-tray-index-parts/card-list.js +4 -4
  250. package/dist/nav-indexing/note-tray-index-parts/date-line.d.ts +2 -3
  251. package/dist/nav-indexing/note-tray-index-parts/date-line.js +1 -1
  252. package/dist/nav-indexing/note-tray-index-parts/index-list.d.ts +1 -2
  253. package/dist/nav-indexing/note-tray-index-parts/index-list.js +2 -2
  254. package/dist/nav-indexing/note-tray-index-parts/timeline.d.ts +1 -2
  255. package/dist/nav-indexing/note-tray-index-parts/timeline.js +2 -2
  256. package/dist/nav-indexing/note-tray-index.d.ts +1 -2
  257. package/dist/nav-indexing/note-tray-index.js +1 -1
  258. package/dist/nav-indexing/site-tree-nav-demo.d.ts +2 -3
  259. package/dist/nav-indexing/site-tree-nav-demo.js +2 -2
  260. package/dist/nav-indexing/tag-nav.d.ts +1 -2
  261. package/dist/nav-indexing/tag-nav.js +1 -1
  262. package/dist/nav-indexing/types.d.ts +2 -2
  263. package/dist/nav-indexing/versions-page-content.d.ts +2 -3
  264. package/dist/nav-indexing/versions-page-content.js +8 -8
  265. package/dist/note-tray-index/index.d.ts +1 -2
  266. package/dist/note-tray-index/index.js +1 -1
  267. package/dist/page-loading/page-loading-overlay.d.ts +1 -2
  268. package/dist/page-loading/page-loading-overlay.js +3 -5
  269. package/dist/plugins/agent-export.d.ts +3 -0
  270. package/dist/plugins/agent-export.js +34 -0
  271. package/dist/plugins/internal/agent-export/chunk.d.ts +5 -0
  272. package/dist/plugins/internal/agent-export/chunk.js +90 -0
  273. package/dist/plugins/internal/agent-export/index.d.ts +24 -0
  274. package/dist/plugins/internal/agent-export/index.js +123 -0
  275. package/dist/plugins/internal/agent-export/normalize.d.ts +5 -0
  276. package/dist/plugins/internal/agent-export/normalize.js +73 -0
  277. package/dist/plugins/internal/llms-txt/dev-middleware.d.ts +6 -0
  278. package/dist/plugins/internal/llms-txt/dev-middleware.js +8 -3
  279. package/dist/plugins/internal/llms-txt/emit.js +23 -6
  280. package/dist/plugins/internal/llms-txt/generate.d.ts +7 -1
  281. package/dist/plugins/internal/llms-txt/generate.js +9 -2
  282. package/dist/plugins/internal/llms-txt/load.d.ts +2 -0
  283. package/dist/plugins/internal/llms-txt/load.js +20 -4
  284. package/dist/plugins/internal/llms-txt/types.d.ts +10 -0
  285. package/dist/plugins/routes.js +4 -0
  286. package/dist/preset.d.ts +19 -9
  287. package/dist/preset.js +20 -1
  288. package/dist/route-context-payload/index.js +1 -1
  289. package/dist/routes/404.d.ts +2 -3
  290. package/dist/routes/404.js +1 -1
  291. package/dist/routes/_chrome.d.ts +5 -5
  292. package/dist/routes/_chrome.js +7 -2
  293. package/dist/routes/_context.d.ts +4 -4
  294. package/dist/routes/_design-token-panel-bootstrap.d.ts +1 -4
  295. package/dist/routes/_design-token-panel-bootstrap.js +9 -1
  296. package/dist/routes/docs-slug.d.ts +2 -3
  297. package/dist/routes/docs-tags-index.d.ts +2 -3
  298. package/dist/routes/docs-tags-index.js +1 -1
  299. package/dist/routes/docs-tags-tag.d.ts +2 -3
  300. package/dist/routes/docs-tags-tag.js +1 -1
  301. package/dist/routes/docs-versions.d.ts +2 -3
  302. package/dist/routes/docs-versions.js +1 -1
  303. package/dist/routes/files-path.d.ts +2 -3
  304. package/dist/routes/files-path.js +1 -1
  305. package/dist/routes/index.d.ts +2 -3
  306. package/dist/routes/index.js +1 -1
  307. package/dist/routes/locale-docs-slug.d.ts +2 -3
  308. package/dist/routes/locale-docs-tags-index.d.ts +2 -3
  309. package/dist/routes/locale-docs-tags-index.js +1 -1
  310. package/dist/routes/locale-docs-tags-tag.d.ts +2 -3
  311. package/dist/routes/locale-docs-tags-tag.js +1 -1
  312. package/dist/routes/locale-docs-versions.d.ts +2 -3
  313. package/dist/routes/locale-docs-versions.js +1 -1
  314. package/dist/routes/locale-files-path.d.ts +2 -3
  315. package/dist/routes/locale-files-path.js +1 -1
  316. package/dist/routes/locale-index.d.ts +2 -3
  317. package/dist/routes/locale-index.js +1 -1
  318. package/dist/routes/mcp.d.ts +5 -0
  319. package/dist/routes/mcp.js +25 -0
  320. package/dist/routes/v-docs-slug.d.ts +2 -3
  321. package/dist/routes/v-locale-docs-slug.d.ts +2 -3
  322. package/dist/search-widget/index.d.ts +1 -2
  323. package/dist/search-widget/index.js +4 -7
  324. package/dist/search-widget-script/generated-script.js +12 -5
  325. package/dist/settings-defaults.d.ts +2 -0
  326. package/dist/settings-defaults.js +93 -0
  327. package/dist/settings.d.ts +8 -2
  328. package/dist/sidebar/client-data.d.ts +18 -0
  329. package/dist/sidebar/client-data.js +47 -0
  330. package/dist/sidebar/index.d.ts +3 -1
  331. package/dist/sidebar/index.js +3 -1
  332. package/dist/sidebar/sidebar.d.ts +12 -44
  333. package/dist/sidebar/sidebar.js +4 -3
  334. package/dist/sidebar/types.d.ts +14 -0
  335. package/dist/sidebar-prepaint/index.d.ts +1 -2
  336. package/dist/sidebar-prepaint/index.js +4 -6
  337. package/dist/sidebar-resizer/sidebar-resizer-init.d.ts +2 -3
  338. package/dist/sidebar-resizer/sidebar-resizer-init.js +3 -3
  339. package/dist/sidebar-toggle-island/index.d.ts +8 -11
  340. package/dist/sidebar-toggle-island/index.js +75 -62
  341. package/dist/sidebar-tree/build-tree.js +5 -6
  342. package/dist/sidebar-tree/types.d.ts +2 -0
  343. package/dist/sidebar-tree-island/index.d.ts +4 -19
  344. package/dist/sidebar-tree-island/index.js +782 -436
  345. package/dist/sidebar-tree-island/scope-state.d.ts +38 -0
  346. package/dist/sidebar-tree-island/scope-state.js +151 -0
  347. package/dist/sidebar-tree-island/sidebar-scroll-preserve.js +6 -2
  348. package/dist/sidebar-utils/index.d.ts +17 -19
  349. package/dist/sidebar-utils/index.js +100 -3
  350. package/dist/sidebar-utils/scope.d.ts +11 -0
  351. package/dist/sidebar-utils/scope.js +67 -0
  352. package/dist/sidebar-with-defaults/index.d.ts +1 -2
  353. package/dist/sidebar-with-defaults/index.js +19 -18
  354. package/dist/site-schema/nav-tree.js +15 -15
  355. package/dist/site-schema/types.d.ts +1 -0
  356. package/dist/site-tree-nav/index.d.ts +2 -3
  357. package/dist/site-tree-nav/index.js +11 -12
  358. package/dist/site-tree-nav/normalize-island-props.d.ts +16 -0
  359. package/dist/site-tree-nav/normalize-island-props.js +122 -0
  360. package/dist/site-tree-nav-island/index.d.ts +3 -3
  361. package/dist/site-tree-nav-island/index.js +243 -144
  362. package/dist/smart-break/index.d.ts +3 -4
  363. package/dist/smart-break/index.js +1 -1
  364. package/dist/tab-item/tab-item.d.ts +3 -4
  365. package/dist/tab-item/tab-item.js +1 -1
  366. package/dist/tag-pages/index.d.ts +3 -3
  367. package/dist/tag-pages/index.js +10 -10
  368. package/dist/theme/color-scheme-provider.d.ts +3 -3
  369. package/dist/theme/color-scheme-provider.js +3 -3
  370. package/dist/theme/theme-pack-provider.d.ts +1 -1
  371. package/dist/theme/theme-pack-provider.js +3 -3
  372. package/dist/theme/theme-toggle.d.ts +2 -3
  373. package/dist/theme/theme-toggle.js +1 -1
  374. package/dist/theme-pack-dialog/index.d.ts +1 -1
  375. package/dist/theme-pack-dialog/index.js +69 -75
  376. package/dist/theme-pack-dialog/theme-pack-card.d.ts +3 -4
  377. package/dist/theme-pack-dialog/theme-pack-card.js +19 -17
  378. package/dist/theme-pack-switcher/index.d.ts +4 -5
  379. package/dist/theme-pack-switcher/index.js +52 -49
  380. package/dist/theme-packs/academia/meta.json +1 -1
  381. package/dist/theme-packs/academia/pack.css +1 -1
  382. package/dist/theme-packs/bauhaus/meta.json +1 -1
  383. package/dist/theme-packs/bauhaus/pack.css +2 -2
  384. package/dist/theme-packs/blueprint/meta.json +1 -1
  385. package/dist/theme-packs/blueprint/pack.css +2 -2
  386. package/dist/theme-packs/botanica/meta.json +1 -1
  387. package/dist/theme-packs/botanica/pack.css +2 -2
  388. package/dist/theme-packs/broadsheet/meta.json +1 -1
  389. package/dist/theme-packs/broadsheet/pack.css +2 -2
  390. package/dist/theme-packs/brutalist/meta.json +1 -1
  391. package/dist/theme-packs/brutalist/pack.css +2 -2
  392. package/dist/theme-packs/eink/meta.json +1 -1
  393. package/dist/theme-packs/eink/pack.css +1 -1
  394. package/dist/theme-packs/futura-editorial/meta.json +1 -1
  395. package/dist/theme-packs/futura-editorial/pack.css +2 -2
  396. package/dist/theme-packs/hearth/meta.json +1 -1
  397. package/dist/theme-packs/hearth/pack.css +2 -2
  398. package/dist/theme-packs/ledger/meta.json +1 -1
  399. package/dist/theme-packs/ledger/pack.css +1 -1
  400. package/dist/theme-packs/manuscript/meta.json +1 -1
  401. package/dist/theme-packs/manuscript/pack.css +1 -1
  402. package/dist/theme-packs/matcha/meta.json +1 -1
  403. package/dist/theme-packs/matcha/pack.css +2 -2
  404. package/dist/theme-packs/nocturne/meta.json +1 -1
  405. package/dist/theme-packs/nocturne/pack.css +2 -2
  406. package/dist/theme-packs/observatory/meta.json +1 -1
  407. package/dist/theme-packs/observatory/pack.css +2 -2
  408. package/dist/theme-packs/onyx/meta.json +1 -1
  409. package/dist/theme-packs/onyx/pack.css +2 -2
  410. package/dist/theme-packs/phosphor/meta.json +1 -1
  411. package/dist/theme-packs/phosphor/pack.css +2 -2
  412. package/dist/theme-packs/riso/meta.json +1 -1
  413. package/dist/theme-packs/riso/pack.css +2 -2
  414. package/dist/theme-packs/sakura/meta.json +1 -1
  415. package/dist/theme-packs/sakura/pack.css +2 -2
  416. package/dist/theme-packs/scandi/meta.json +1 -1
  417. package/dist/theme-packs/scandi/pack.css +1 -1
  418. package/dist/theme-packs/solar/meta.json +1 -1
  419. package/dist/theme-packs/solar/pack.css +1 -1
  420. package/dist/theme-packs/sumi/meta.json +1 -1
  421. package/dist/theme-packs/sumi/pack.css +2 -2
  422. package/dist/theme-packs/swissgrid/meta.json +1 -1
  423. package/dist/theme-packs/swissgrid/pack.css +1 -1
  424. package/dist/theme-packs/timberline/meta.json +1 -1
  425. package/dist/theme-packs/timberline/pack.css +2 -2
  426. package/dist/theme-packs/washi/meta.json +1 -1
  427. package/dist/theme-packs/washi/pack.css +2 -2
  428. package/dist/theme-toggle/index.d.ts +1 -1
  429. package/dist/theme-toggle/index.js +154 -167
  430. package/dist/theme.css +47 -121
  431. package/dist/toc/mobile-toc.d.ts +3 -5
  432. package/dist/toc/mobile-toc.js +29 -27
  433. package/dist/toc/toc.d.ts +3 -4
  434. package/dist/toc/toc.js +18 -18
  435. package/dist/toc/use-active-heading.d.ts +5 -4
  436. package/dist/toc/use-active-heading.js +36 -30
  437. package/dist/toc-prepaint/index.d.ts +1 -2
  438. package/dist/toc-prepaint/index.js +4 -6
  439. package/dist/transitions/nested-island-props-refresh.d.ts +3 -16
  440. package/dist/transitions/nested-island-props-refresh.js +133 -151
  441. package/dist/transitions/page-events.d.ts +8 -13
  442. package/dist/tree-nav-shared/index.d.ts +4 -5
  443. package/dist/tree-nav-shared/index.js +6 -7
  444. package/dist/use-modal-dialog/index.d.ts +9 -63
  445. package/dist/use-modal-dialog/index.js +41 -59
  446. package/dist/versions-page/index.d.ts +3 -3
  447. package/dist/versions-page/index.js +5 -5
  448. package/dist/wind/index.d.ts +5 -0
  449. package/dist/wind/index.js +169 -0
  450. package/dist/wind.json +498 -0
  451. package/dist/z-index-defaults/index.d.ts +4 -4
  452. package/dist/zdtp-loader.d.ts +7 -0
  453. package/dist/zdtp-loader.js +8 -0
  454. package/eject/asset-components/asset-card.tsx +14 -16
  455. package/eject/asset-components/asset-code.tsx +10 -12
  456. package/eject/asset-components/shared.tsx +5 -7
  457. package/eject/breadcrumb/breadcrumb.tsx +15 -16
  458. package/eject/code-group/index.tsx +4 -10
  459. package/eject/content-admonition/index.tsx +5 -6
  460. package/eject/desktop-sidebar-toggle-island/index.ts +4 -0
  461. package/eject/desktop-sidebar-toggle-island/island.tsx +50 -0
  462. package/eject/desktop-sidebar-toggle-island/storage.ts +27 -0
  463. package/eject/details/details.tsx +3 -5
  464. package/eject/doc-history/index.tsx +193 -179
  465. package/eject/doc-pager/index.tsx +3 -4
  466. package/eject/footer/footer.tsx +7 -9
  467. package/eject/header/header.tsx +42 -54
  468. package/eject/header/nav-overflow-script.ts +1 -1
  469. package/eject/header/types.ts +12 -13
  470. package/eject/image-enlarge/index.tsx +84 -69
  471. package/eject/image-enlarge/public.ts +2 -0
  472. package/eject/image-enlarge/ssr-fallback.tsx +7 -0
  473. package/eject/page-loading/page-loading-overlay.tsx +8 -15
  474. package/eject/sidebar/client-data.ts +68 -0
  475. package/eject/sidebar/index.ts +3 -0
  476. package/eject/sidebar/sidebar.tsx +16 -97
  477. package/eject/sidebar/types.ts +15 -0
  478. package/eject/sidebar-toggle-island/index.tsx +103 -102
  479. package/eject/sidebar-tree-island/index.tsx +827 -615
  480. package/eject/sidebar-tree-island/scope-state.ts +154 -0
  481. package/eject/sidebar-tree-island/sidebar-scroll-preserve.ts +8 -2
  482. package/eject/site-tree-nav-island/index.tsx +349 -222
  483. package/eject/tab-item/tab-item.tsx +2 -4
  484. package/eject/theme-toggle/hydration-pending.ts +6 -10
  485. package/eject/theme-toggle/index.tsx +133 -173
  486. package/eject/toc/mobile-toc.tsx +27 -31
  487. package/eject/toc/toc.tsx +21 -24
  488. package/eject/toc/use-active-heading.ts +43 -38
  489. package/package.json +40 -22
  490. package/routes-src/404.tsx +2 -3
  491. package/routes-src/_chrome.tsx +7 -2
  492. package/routes-src/_design-token-panel-bootstrap.tsx +1 -63
  493. package/routes-src/docs-slug.tsx +2 -3
  494. package/routes-src/docs-tags-index.tsx +2 -3
  495. package/routes-src/docs-tags-tag.tsx +2 -3
  496. package/routes-src/docs-versions.tsx +2 -3
  497. package/routes-src/files-path.tsx +2 -4
  498. package/routes-src/index.tsx +2 -3
  499. package/routes-src/locale-docs-slug.tsx +2 -3
  500. package/routes-src/locale-docs-tags-index.tsx +2 -3
  501. package/routes-src/locale-docs-tags-tag.tsx +2 -3
  502. package/routes-src/locale-docs-versions.tsx +2 -3
  503. package/routes-src/locale-files-path.tsx +2 -4
  504. package/routes-src/locale-index.tsx +2 -3
  505. package/routes-src/mcp.tsx +25 -0
  506. package/routes-src/v-docs-slug.tsx +2 -3
  507. package/routes-src/v-locale-docs-slug.tsx +2 -3
  508. package/tsconfig.base.json +1 -1
  509. package/dist/safelist.css +0 -2
  510. package/dist/theme-no-reset.css +0 -379
  511. package/eject/desktop-sidebar-toggle-island/index.tsx +0 -110
@@ -1,21 +1,21 @@
1
1
  "use client";
2
- import { Fragment, jsx, jsxs } from "preact/jsx-runtime";
3
- import { useState, useEffect, useCallback, useMemo, useRef } from "preact/compat";
2
+ import { Fragment, jsx, jsxs } from "@takazudo/zfb/zudo-react/jsx-runtime";
3
+ import { computed, For, getScope, Show, signal } from "@takazudo/zfb/zudo-react";
4
4
  import { SmartBreak } from "../smart-break/index.js";
5
5
  import { History, Close, ArrowLeft } from "../icons/index.js";
6
6
  import { AFTER_NAVIGATE_EVENT } from "../transitions/index.js";
7
- import { useModalDialog } from "../use-modal-dialog/index.js";
7
+ import { modalDialog } from "../use-modal-dialog/index.js";
8
8
  import { formatDate } from "../format-date/index.js";
9
9
  function Spinner() {
10
- return /* @__PURE__ */ jsx("div", { className: "flex items-center justify-center py-vsp-xl", children: /* @__PURE__ */ jsx(
10
+ return /* @__PURE__ */ jsx("div", { class: "flex items-center justify-center py-vsp-xl", children: /* @__PURE__ */ jsx(
11
11
  "span",
12
12
  {
13
- className: "inline-block box-border rounded-full animate-spin",
13
+ class: "inline-block box-border rounded-full page-loading-spinner",
14
14
  style: {
15
- width: 48,
16
- height: 48,
15
+ width: "48px",
16
+ height: "48px",
17
17
  border: "5px solid var(--color-fg, #fff)",
18
- borderBottomColor: "transparent"
18
+ "border-bottom-color": "transparent"
19
19
  }
20
20
  }
21
21
  ) });
@@ -87,7 +87,7 @@ function buildSideBySideRows(changes) {
87
87
  }
88
88
  const DIFF_CACHE_LIMIT = 32;
89
89
  const diffCache = /* @__PURE__ */ new Map();
90
- async function getCachedDiff(olderHash, newerHash, olderContent, newerContent) {
90
+ async function getCachedDiff(olderHash, newerHash, olderContent, newerContent, isCurrent) {
91
91
  const key = `${olderHash}::${newerHash}`;
92
92
  const hit = diffCache.get(key);
93
93
  if (hit) {
@@ -101,6 +101,7 @@ async function getCachedDiff(olderHash, newerHash, olderContent, newerContent) {
101
101
  throw new Error('Compare requires the optional peer "diff": install it to use docHistory');
102
102
  }
103
103
  );
104
+ if (!isCurrent()) throw new Error("Comparison cancelled");
104
105
  const changes = diffLines(olderContent, newerContent);
105
106
  diffCache.set(key, changes);
106
107
  if (diffCache.size > DIFF_CACHE_LIMIT) {
@@ -114,70 +115,72 @@ function DiffViewer({
114
115
  onBack,
115
116
  showBackButton
116
117
  }) {
117
- const [changes, setChanges] = useState(null);
118
- const [diffError, setDiffError] = useState(null);
119
- useEffect(() => {
118
+ const scope = getScope();
119
+ const changes = signal(null);
120
+ const diffError = signal(null);
121
+ const tableRevision = signal(0);
122
+ scope.onActivate(() => {
120
123
  let cancelled = false;
121
- setDiffError(null);
122
124
  getCachedDiff(
123
125
  selection.older.hash,
124
126
  selection.newer.hash,
125
127
  selection.older.content,
126
- selection.newer.content
128
+ selection.newer.content,
129
+ () => !cancelled && !scope.abortSignal.aborted
127
130
  ).then((result) => {
128
- if (!cancelled) setChanges(result);
131
+ if (!cancelled && !scope.abortSignal.aborted) {
132
+ changes.value = result;
133
+ tableRevision.value++;
134
+ }
129
135
  }).catch((e) => {
130
- if (!cancelled) {
131
- setDiffError(e instanceof Error ? e.message : "Failed to compute diff");
136
+ if (!cancelled && !scope.abortSignal.aborted) {
137
+ diffError.value = e instanceof Error ? e.message : "Failed to compute diff";
132
138
  }
133
139
  });
134
140
  return () => {
135
141
  cancelled = true;
136
142
  };
137
- }, [selection.older.hash, selection.newer.hash]);
138
- const rows = useMemo(
139
- () => changes ? buildSideBySideRows(changes) : [],
140
- [changes]
141
- );
142
- return /* @__PURE__ */ jsxs("div", { className: "flex flex-col h-full", children: [
143
- /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-hsp-sm px-hsp-lg py-vsp-xs border-b border-muted", children: [
143
+ });
144
+ const tableSnapshots = computed(() => changes.value ? [{ revision: tableRevision.value, rows: buildSideBySideRows(changes.value) }] : []);
145
+ return /* @__PURE__ */ jsxs("div", { class: "flex flex-col h-full", children: [
146
+ /* @__PURE__ */ jsxs("div", { class: "flex items-center gap-hsp-sm px-hsp-lg py-vsp-xs border-b border-muted", children: [
144
147
  showBackButton && /* @__PURE__ */ jsx(
145
148
  "button",
146
149
  {
147
150
  type: "button",
148
- onClick: onBack,
149
- className: "text-muted hover:text-fg lg:hidden",
151
+ "on:click": onBack,
152
+ class: "text-muted hover:text-fg lg:hidden",
150
153
  "aria-label": "Back to revisions",
151
- children: /* @__PURE__ */ jsx(ArrowLeft, { className: "h-icon-sm w-icon-sm" })
154
+ children: /* @__PURE__ */ jsx(ArrowLeft, { class: "h-icon-sm w-icon-sm" })
152
155
  }
153
156
  ),
154
- /* @__PURE__ */ jsxs("div", { className: "flex-1 min-w-0 flex", children: [
155
- /* @__PURE__ */ jsx("div", { className: "w-1/2 text-small text-muted font-mono truncate pr-hsp-sm", children: selection.older.hash.slice(0, 7) }),
156
- /* @__PURE__ */ jsx("div", { className: "w-1/2 text-small text-muted font-mono truncate pl-hsp-sm", children: selection.newer.hash.slice(0, 7) })
157
+ /* @__PURE__ */ jsxs("div", { class: "flex-1 min-w-0 flex", children: [
158
+ /* @__PURE__ */ jsx("div", { class: "w-1/2 text-small text-muted font-mono truncate pr-hsp-sm", children: selection.older.hash.slice(0, 7) }),
159
+ /* @__PURE__ */ jsx("div", { class: "w-1/2 text-small text-muted font-mono truncate pl-hsp-sm", children: selection.newer.hash.slice(0, 7) })
157
160
  ] })
158
161
  ] }),
159
- diffError && /* @__PURE__ */ jsx("div", { className: "px-hsp-lg py-vsp-lg text-danger text-small", children: diffError }),
160
- !changes && !diffError && /* @__PURE__ */ jsx(Spinner, {}),
161
- /* @__PURE__ */ jsx("div", { className: `flex-1 overflow-auto${!changes ? " hidden" : ""}`, children: /* @__PURE__ */ jsxs("table", { className: "w-full border-collapse", style: { tableLayout: "fixed" }, children: [
162
+ /* @__PURE__ */ jsx(Show, { when: computed(() => diffError.value !== null), children: () => /* @__PURE__ */ jsx("div", { class: "px-hsp-lg py-vsp-lg text-danger text-small", children: diffError }) }),
163
+ /* @__PURE__ */ jsx(Show, { when: computed(() => !changes.value && !diffError.value), children: () => /* @__PURE__ */ jsx(Spinner, {}) }),
164
+ /* @__PURE__ */ jsx("div", { class: computed(() => `flex-1 overflow-auto${!changes.value ? " hidden" : ""}`), children: /* @__PURE__ */ jsx(For, { each: tableSnapshots, by: (snapshot) => snapshot.revision, children: (snapshot) => /* @__PURE__ */ jsxs("table", { class: "w-full border-collapse", style: { "table-layout": "fixed" }, children: [
162
165
  /* @__PURE__ */ jsxs("colgroup", { children: [
163
166
  /* @__PURE__ */ jsx("col", { style: { width: "2.5rem" } }),
164
167
  /* @__PURE__ */ jsx("col", {}),
165
168
  /* @__PURE__ */ jsx("col", { style: { width: "2.5rem" } }),
166
169
  /* @__PURE__ */ jsx("col", {})
167
170
  ] }),
168
- /* @__PURE__ */ jsx("tbody", { children: rows.map((row, idx) => {
171
+ /* @__PURE__ */ jsx("tbody", { children: snapshot.value.rows.map((row) => {
169
172
  const leftBg = row.type === "removed" || row.type === "changed" ? "diff-line-removed" : "";
170
173
  const rightBg = row.type === "added" || row.type === "changed" ? "diff-line-added" : "";
171
174
  const leftEmpty = row.leftLine === null;
172
175
  const rightEmpty = row.rightLine === null;
173
- return /* @__PURE__ */ jsxs("tr", { className: "diff-row", children: [
174
- /* @__PURE__ */ jsx("td", { className: `diff-line-num ${leftBg}`, children: row.leftNum ?? "" }),
175
- /* @__PURE__ */ jsx("td", { className: `diff-line-content ${leftBg}${leftEmpty ? " diff-line-empty" : ""}`, children: row.leftLine ?? "" }),
176
- /* @__PURE__ */ jsx("td", { className: `diff-line-num ${rightBg}`, children: row.rightNum ?? "" }),
177
- /* @__PURE__ */ jsx("td", { className: `diff-line-content ${rightBg}${rightEmpty ? " diff-line-empty" : ""}`, children: row.rightLine ?? "" })
178
- ] }, idx);
176
+ return /* @__PURE__ */ jsxs("tr", { class: "diff-row", children: [
177
+ /* @__PURE__ */ jsx("td", { class: `diff-line-num ${leftBg}`, children: row.leftNum ?? "" }),
178
+ /* @__PURE__ */ jsx("td", { class: `diff-line-content ${leftBg}${leftEmpty ? " diff-line-empty" : ""}`, children: row.leftLine ?? "" }),
179
+ /* @__PURE__ */ jsx("td", { class: `diff-line-num ${rightBg}`, children: row.rightNum ?? "" }),
180
+ /* @__PURE__ */ jsx("td", { class: `diff-line-content ${rightBg}${rightEmpty ? " diff-line-empty" : ""}`, children: row.rightLine ?? "" })
181
+ ] });
179
182
  }) })
180
- ] }) })
183
+ ] }) }) })
181
184
  ] });
182
185
  }
183
186
  function RevisionList({
@@ -186,16 +189,17 @@ function RevisionList({
186
189
  displayLocale,
187
190
  dateFormats
188
191
  }) {
189
- const [selectedA, setSelectedA] = useState(1);
190
- const [selectedB, setSelectedB] = useState(0);
192
+ const revisionEntries = signal(entries);
193
+ const selectedA = signal(1);
194
+ const selectedB = signal(0);
191
195
  if (entries.length === 0) {
192
- return /* @__PURE__ */ jsx("div", { className: "px-hsp-lg py-vsp-lg text-muted text-small", children: "No revision history available." });
196
+ return /* @__PURE__ */ jsx("div", { class: "px-hsp-lg py-vsp-lg text-muted text-small", children: "No revision history available." });
193
197
  }
194
- const canCompare = selectedA !== selectedB && selectedA >= 0 && selectedB >= 0 && selectedA < entries.length && selectedB < entries.length;
198
+ const canCompare = computed(() => selectedA.value !== selectedB.value && selectedA.value >= 0 && selectedB.value >= 0 && selectedA.value < entries.length && selectedB.value < entries.length);
195
199
  function handleCompare() {
196
- if (!canCompare) return;
197
- const idxOlder = Math.max(selectedA, selectedB);
198
- const idxNewer = Math.min(selectedA, selectedB);
200
+ if (!canCompare.value) return;
201
+ const idxOlder = Math.max(selectedA.value, selectedB.value);
202
+ const idxNewer = Math.min(selectedA.value, selectedB.value);
199
203
  const olderEntry = entries[idxOlder];
200
204
  const newerEntry = entries[idxNewer];
201
205
  if (!olderEntry || !newerEntry) return;
@@ -204,41 +208,49 @@ function RevisionList({
204
208
  newer: newerEntry
205
209
  });
206
210
  }
207
- return /* @__PURE__ */ jsxs("div", { className: "flex flex-col h-full", children: [
208
- entries.length >= 2 && /* @__PURE__ */ jsxs("div", { className: "px-hsp-lg py-vsp-xs border-b border-muted flex items-center gap-hsp-sm", children: [
211
+ return /* @__PURE__ */ jsxs("div", { class: "flex flex-col h-full", children: [
212
+ entries.length >= 2 && /* @__PURE__ */ jsxs("div", { class: "px-hsp-lg py-vsp-xs border-b border-muted flex items-center gap-hsp-sm", children: [
209
213
  /* @__PURE__ */ jsx(
210
214
  "button",
211
215
  {
212
216
  type: "button",
213
- disabled: !canCompare,
214
- onClick: handleCompare,
215
- className: canCompare ? "px-hsp-md py-vsp-2xs text-small rounded bg-accent text-bg hover:bg-accent-hover" : "px-hsp-md py-vsp-2xs text-small rounded bg-surface text-muted cursor-not-allowed",
217
+ disabled: computed(() => !canCompare.value),
218
+ "on:click": handleCompare,
219
+ class: computed(
220
+ () => canCompare.value ? "px-hsp-md py-vsp-2xs text-small rounded bg-accent text-bg hover:bg-accent-hover" : "px-hsp-md py-vsp-2xs text-small rounded bg-surface text-muted cursor-not-allowed"
221
+ ),
216
222
  children: "Compare"
217
223
  }
218
224
  ),
219
- /* @__PURE__ */ jsx("span", { className: "text-caption text-muted", children: "Select two revisions (A / B)" })
225
+ /* @__PURE__ */ jsx("span", { class: "text-caption text-muted", children: "Select two revisions (A / B)" })
220
226
  ] }),
221
- /* @__PURE__ */ jsx("div", { className: "flex-1 overflow-auto", children: entries.map((entry, idx) => {
222
- const isA = selectedA === idx;
223
- const isB = selectedB === idx;
227
+ /* @__PURE__ */ jsx("div", { class: "flex-1 overflow-auto", children: /* @__PURE__ */ jsx(For, { each: revisionEntries, by: (entry) => entry.hash, children: (entry, idx) => {
228
+ const isA = computed(() => selectedA.value === idx.value);
229
+ const isB = computed(() => selectedB.value === idx.value);
224
230
  const dateStr = formatDate(
225
- entry.date,
231
+ entry.value.date,
226
232
  displayLocale ?? "en",
227
233
  dateFormats?.full
228
234
  );
229
235
  return /* @__PURE__ */ jsx(
230
236
  "div",
231
237
  {
232
- className: isA || isB ? "px-hsp-lg py-vsp-xs border-b border-muted bg-surface" : "px-hsp-lg py-vsp-xs border-b border-muted hover:bg-surface",
233
- children: /* @__PURE__ */ jsxs("div", { className: "flex items-start gap-hsp-sm", children: [
234
- entries.length >= 2 && /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-vsp-2xs pt-[2px] shrink-0", children: [
238
+ class: computed(
239
+ () => isA.value || isB.value ? "px-hsp-lg py-vsp-xs border-b border-muted bg-surface" : "px-hsp-lg py-vsp-xs border-b border-muted hover:bg-surface"
240
+ ),
241
+ children: /* @__PURE__ */ jsxs("div", { class: "flex items-start gap-hsp-sm", children: [
242
+ entries.length >= 2 && /* @__PURE__ */ jsxs("div", { class: "flex flex-col gap-vsp-2xs pt-[2px] shrink-0", children: [
235
243
  /* @__PURE__ */ jsx(
236
244
  "button",
237
245
  {
238
246
  type: "button",
239
- onClick: () => setSelectedA(idx),
240
- className: isA ? "w-[1.5rem] h-[1.25rem] text-caption rounded flex items-center justify-center bg-accent text-bg" : "w-[1.5rem] h-[1.25rem] text-caption rounded flex items-center justify-center border border-muted text-muted hover:border-fg hover:text-fg",
241
- "aria-label": `Select revision ${entry.hash.slice(0, 7)} as A`,
247
+ "on:click": () => {
248
+ selectedA.value = idx.value;
249
+ },
250
+ class: computed(
251
+ () => isA.value ? "w-[1.5rem] h-[1.25rem] text-caption rounded flex items-center justify-center bg-accent text-bg" : "w-[1.5rem] h-[1.25rem] text-caption rounded flex items-center justify-center border border-muted text-muted hover:border-fg hover:text-fg"
252
+ ),
253
+ "aria-label": `Select revision ${entry.value.hash.slice(0, 7)} as A`,
242
254
  children: "A"
243
255
  }
244
256
  ),
@@ -246,26 +258,29 @@ function RevisionList({
246
258
  "button",
247
259
  {
248
260
  type: "button",
249
- onClick: () => setSelectedB(idx),
250
- className: isB ? "w-[1.5rem] h-[1.25rem] text-caption rounded flex items-center justify-center bg-accent text-bg" : "w-[1.5rem] h-[1.25rem] text-caption rounded flex items-center justify-center border border-muted text-muted hover:border-fg hover:text-fg",
251
- "aria-label": `Select revision ${entry.hash.slice(0, 7)} as B`,
261
+ "on:click": () => {
262
+ selectedB.value = idx.value;
263
+ },
264
+ class: computed(
265
+ () => isB.value ? "w-[1.5rem] h-[1.25rem] text-caption rounded flex items-center justify-center bg-accent text-bg" : "w-[1.5rem] h-[1.25rem] text-caption rounded flex items-center justify-center border border-muted text-muted hover:border-fg hover:text-fg"
266
+ ),
267
+ "aria-label": `Select revision ${entry.value.hash.slice(0, 7)} as B`,
252
268
  children: "B"
253
269
  }
254
270
  )
255
271
  ] }),
256
- /* @__PURE__ */ jsxs("div", { className: "min-w-0 flex-1", children: [
257
- /* @__PURE__ */ jsxs("div", { className: "flex items-baseline gap-hsp-sm", children: [
258
- /* @__PURE__ */ jsx("code", { className: "text-caption text-accent font-mono", children: entry.hash.slice(0, 7) }),
259
- /* @__PURE__ */ jsx("span", { className: "text-caption text-muted", children: dateStr })
272
+ /* @__PURE__ */ jsxs("div", { class: "min-w-0 flex-1", children: [
273
+ /* @__PURE__ */ jsxs("div", { class: "flex items-baseline gap-hsp-sm", children: [
274
+ /* @__PURE__ */ jsx("code", { class: "text-caption text-accent font-mono", children: entry.value.hash.slice(0, 7) }),
275
+ /* @__PURE__ */ jsx("span", { class: "text-caption text-muted", children: dateStr })
260
276
  ] }),
261
- /* @__PURE__ */ jsx("div", { className: "text-small text-fg mt-vsp-2xs truncate", children: /* @__PURE__ */ jsx(SmartBreak, { children: entry.message }) }),
262
- /* @__PURE__ */ jsx("div", { className: "text-caption text-muted", children: entry.author })
277
+ /* @__PURE__ */ jsx("div", { class: "text-small text-fg mt-vsp-2xs truncate", children: /* @__PURE__ */ jsx(SmartBreak, { children: entry.value.message }) }),
278
+ /* @__PURE__ */ jsx("div", { class: "text-caption text-muted", children: entry.value.author })
263
279
  ] })
264
280
  ] })
265
- },
266
- entry.hash
281
+ }
267
282
  );
268
- }) })
283
+ } }) })
269
284
  ] });
270
285
  }
271
286
  function DocHistory({
@@ -275,67 +290,81 @@ function DocHistory({
275
290
  displayLocale,
276
291
  dateFormats
277
292
  }) {
278
- const [view, setView] = useState("closed");
279
- const [data, setData] = useState(null);
280
- const [loading, setLoading] = useState(false);
281
- const [error, setError] = useState(null);
282
- const [diffSelection, setDiffSelection] = useState(
283
- null
284
- );
285
- const returnFocusRef = useRef(null);
293
+ const scope = getScope();
294
+ const view = signal("closed");
295
+ const data = signal(null);
296
+ const loading = signal(false);
297
+ const error = signal(null);
298
+ const diffSelection = signal(null);
299
+ const returnFocusRef = { current: null };
286
300
  const base = basePath.replace(/\/+$/, "");
287
301
  const historySlug = slug === "" ? "index" : slug;
288
302
  const fetchPath = locale ? `${base}/doc-history/${locale}/${historySlug}.json` : `${base}/doc-history/${historySlug}.json`;
289
- const fetchHistory = useCallback(async () => {
290
- if (data) return;
291
- setLoading(true);
292
- setError(null);
303
+ let fetchController = null;
304
+ let fetchRun = 0;
305
+ const fetchHistory = async () => {
306
+ if (data.value || loading.value) return;
307
+ fetchController?.abort();
308
+ const controller = new AbortController();
309
+ fetchController = controller;
310
+ const run = ++fetchRun;
311
+ loading.value = true;
312
+ error.value = null;
293
313
  try {
294
- const res = await fetch(fetchPath);
314
+ const res = await fetch(fetchPath, { signal: controller.signal });
315
+ if (controller.signal.aborted || scope.abortSignal.aborted || run !== fetchRun) return;
295
316
  if (!res.ok) {
296
317
  throw new Error(`Failed to load history (${res.status})`);
297
318
  }
298
319
  const json = await res.json();
320
+ if (controller.signal.aborted || scope.abortSignal.aborted || run !== fetchRun) return;
299
321
  if (!json || !Array.isArray(json.entries)) {
300
322
  throw new Error("Malformed history response");
301
323
  }
302
- setData(json);
324
+ data.value = json;
303
325
  } catch (e) {
304
- setError(e instanceof Error ? e.message : "Failed to load history");
326
+ if (!controller.signal.aborted && !scope.abortSignal.aborted && run === fetchRun)
327
+ error.value = e instanceof Error ? e.message : "Failed to load history";
305
328
  } finally {
306
- setLoading(false);
329
+ if (!scope.abortSignal.aborted && run === fetchRun) loading.value = false;
307
330
  }
308
- }, [data, fetchPath]);
331
+ };
332
+ scope.onActivate(() => () => {
333
+ fetchController?.abort();
334
+ fetchRun++;
335
+ });
309
336
  function handleOpen(e) {
310
337
  returnFocusRef.current = e.currentTarget;
311
- setView("revisions");
312
- fetchHistory();
338
+ view.value = "revisions";
339
+ void fetchHistory();
313
340
  }
314
- const handleClose = useCallback(() => {
315
- setView("closed");
316
- setDiffSelection(null);
317
- }, []);
341
+ const handleClose = () => {
342
+ view.value = "closed";
343
+ diffSelection.value = null;
344
+ fetchController?.abort();
345
+ fetchRun++;
346
+ loading.value = false;
347
+ };
318
348
  function handleSelectDiff(selection) {
319
- setDiffSelection(selection);
320
- setView("diff");
349
+ diffSelection.value = selection;
350
+ view.value = "diff";
321
351
  }
322
352
  function handleBackToRevisions() {
323
- setDiffSelection(null);
324
- setView("revisions");
353
+ diffSelection.value = null;
354
+ view.value = "revisions";
325
355
  }
326
- useEffect(() => {
327
- if (view !== "closed") {
328
- document.body.style.overflow = "hidden";
329
- } else {
330
- document.body.style.overflow = "";
331
- }
356
+ scope.effect(() => {
357
+ if (view.value === "closed") return;
358
+ const previousOverflow = document.body.style.overflow;
359
+ document.body.style.overflow = "hidden";
332
360
  return () => {
333
- document.body.style.overflow = "";
361
+ document.body.style.overflow = previousOverflow;
334
362
  };
335
- }, [view]);
336
- const isOpen = view !== "closed";
337
- const hasDiff = view === "diff" && diffSelection;
338
- const { dialogRef } = useModalDialog({
363
+ });
364
+ const isOpen = computed(() => view.value !== "closed");
365
+ const hasDiff = computed(() => view.value === "diff" && diffSelection.value !== null);
366
+ const diffPairs = computed(() => diffSelection.value && view.value === "diff" ? [{ key: `${diffSelection.value.older.hash}:${diffSelection.value.newer.hash}`, selection: diffSelection.value }] : []);
367
+ const { dialogRef } = modalDialog(scope, {
339
368
  isOpen,
340
369
  onClose: handleClose,
341
370
  navigateEvent: AFTER_NAVIGATE_EVENT,
@@ -343,16 +372,17 @@ function DocHistory({
343
372
  returnFocusRef
344
373
  });
345
374
  return /* @__PURE__ */ jsxs(Fragment, { children: [
346
- /* @__PURE__ */ jsx("div", { className: "flex justify-end mt-vsp-xl", children: /* @__PURE__ */ jsxs(
375
+ /* @__PURE__ */ jsx("div", { class: "flex justify-end mt-vsp-xl", children: /* @__PURE__ */ jsxs(
347
376
  "button",
348
377
  {
349
378
  type: "button",
350
- onClick: handleOpen,
351
- className: "doc-history-trigger flex items-center gap-hsp-xs px-hsp-md py-vsp-xs rounded-lg bg-surface border border-muted text-muted hover:text-accent hover:border-accent focus-visible:text-accent focus-visible:border-accent transition-colors",
379
+ "on:click": handleOpen,
380
+ "data-doc-history-trigger": "",
381
+ class: "flex items-center gap-hsp-xs px-hsp-md py-vsp-xs rounded-lg bg-surface border border-muted text-muted hover:text-accent hover:border-accent focus-visible:text-accent focus-visible:border-accent transition-colors duration-0",
352
382
  "aria-label": "View document history",
353
383
  children: [
354
- /* @__PURE__ */ jsx(History, { className: "h-icon-md w-icon-md" }),
355
- /* @__PURE__ */ jsx("span", { className: "text-small", children: "History" })
384
+ /* @__PURE__ */ jsx(History, { class: "h-icon-md w-icon-md" }),
385
+ /* @__PURE__ */ jsx("span", { class: "text-small", children: "History" })
356
386
  ]
357
387
  }
358
388
  ) }),
@@ -361,34 +391,37 @@ function DocHistory({
361
391
  {
362
392
  ref: dialogRef,
363
393
  "aria-label": "Document revision history",
364
- className: "doc-history-panel z-modal fixed inset-0 m-0 h-full w-full max-h-full max-w-full bg-bg border-none p-0 backdrop:z-modal-backdrop backdrop:bg-bg/30",
394
+ "data-doc-history-panel": "",
395
+ class: "z-modal fixed inset-0 m-0 h-full w-full max-h-full max-w-full bg-bg border-none p-0 backdrop:z-modal-backdrop backdrop:bg-bg/30",
365
396
  style: { color: "var(--color-fg)" },
366
397
  children: [
367
- /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between px-hsp-lg py-vsp-xs border-b border-muted", children: [
368
- /* @__PURE__ */ jsx("h2", { className: "text-body font-semibold text-fg", children: view === "diff" ? "Diff" : "Revision History" }),
398
+ /* @__PURE__ */ jsxs("div", { class: "flex items-center justify-between px-hsp-lg py-vsp-xs border-b border-muted", children: [
399
+ /* @__PURE__ */ jsx("h2", { class: "text-body font-semibold text-fg", children: computed(() => view.value === "diff" ? "Diff" : "Revision History") }),
369
400
  /* @__PURE__ */ jsx(
370
401
  "button",
371
402
  {
372
403
  type: "button",
373
- onClick: handleClose,
374
- className: "text-muted hover:text-fg",
404
+ "on:click": handleClose,
405
+ class: "text-muted hover:text-fg",
375
406
  "aria-label": "Close history panel",
376
- children: /* @__PURE__ */ jsx(Close, { className: "h-icon-md w-icon-md" })
407
+ children: /* @__PURE__ */ jsx(Close, { class: "h-icon-md w-icon-md" })
377
408
  }
378
409
  )
379
410
  ] }),
380
- /* @__PURE__ */ jsxs("div", { className: "h-[calc(100%-3rem)] overflow-hidden", children: [
381
- loading && /* @__PURE__ */ jsx(Spinner, {}),
382
- error && /* @__PURE__ */ jsx("div", { className: "px-hsp-lg py-vsp-lg text-danger text-small", children: error }),
383
- !loading && !error && data && /* @__PURE__ */ jsxs("div", { className: "flex h-full", children: [
411
+ /* @__PURE__ */ jsxs("div", { class: "h-[calc(100%_-_3rem)] overflow-hidden", children: [
412
+ /* @__PURE__ */ jsx(Show, { when: loading, children: () => /* @__PURE__ */ jsx(Spinner, {}) }),
413
+ /* @__PURE__ */ jsx(Show, { when: computed(() => error.value !== null), children: () => /* @__PURE__ */ jsx("div", { class: "px-hsp-lg py-vsp-lg text-danger text-small", children: error }) }),
414
+ /* @__PURE__ */ jsx(Show, { when: computed(() => !loading.value && !error.value && data.value !== null), children: () => /* @__PURE__ */ jsxs("div", { class: "flex h-full", children: [
384
415
  /* @__PURE__ */ jsx(
385
416
  "div",
386
417
  {
387
- className: hasDiff ? "hidden lg:flex lg:flex-col lg:w-[clamp(16rem,25%,22rem)] shrink-0 border-r border-muted h-full" : "flex flex-col w-full h-full",
418
+ class: computed(
419
+ () => hasDiff.value ? "hidden lg:flex lg:flex-col lg:w-[clamp(16rem,25%,22rem)] shrink-0 border-r border-muted h-full" : "flex flex-col w-full h-full"
420
+ ),
388
421
  children: /* @__PURE__ */ jsx(
389
422
  RevisionList,
390
423
  {
391
- entries: data.entries,
424
+ entries: data.value.entries,
392
425
  onSelectDiff: handleSelectDiff,
393
426
  displayLocale,
394
427
  dateFormats
@@ -396,16 +429,8 @@ function DocHistory({
396
429
  )
397
430
  }
398
431
  ),
399
- hasDiff && /* @__PURE__ */ jsx("div", { className: "flex-1 min-w-0 h-full", children: /* @__PURE__ */ jsx(
400
- DiffViewer,
401
- {
402
- selection: diffSelection,
403
- onBack: handleBackToRevisions,
404
- showBackButton: true
405
- },
406
- `${diffSelection.older.hash}:${diffSelection.newer.hash}`
407
- ) })
408
- ] })
432
+ /* @__PURE__ */ jsx(Show, { when: hasDiff, children: () => /* @__PURE__ */ jsx("div", { class: "flex-1 min-w-0 h-full", children: /* @__PURE__ */ jsx(For, { each: diffPairs, by: (pair) => pair.key, children: (pair) => /* @__PURE__ */ jsx(DiffViewer, { selection: pair.value.selection, onBack: handleBackToRevisions, showBackButton: true }) }) }) })
433
+ ] }) })
409
434
  ] })
410
435
  ]
411
436
  }
@@ -1,6 +1,5 @@
1
1
  /** @jsxRuntime automatic */
2
- /** @jsxImportSource preact */
3
- import type { VNode } from "preact";
2
+ import type { Child, Description } from "@takazudo/zfb/zudo-react";
4
3
  import type { ChromeContext } from "../factory-context/index.js";
5
4
  import type { ResolvedDateFormats, Settings } from "../settings.js";
6
5
  /** Per-entry metadata shape from the doc-history manifest. */
@@ -27,12 +26,13 @@ export interface DocHistoryAreaSettings {
27
26
  * Must match the interface of `@takazudo/zudo-doc/doc-history`'s DocHistory.
28
27
  */
29
28
  export type DocHistoryComponent = (props: {
29
+ ssrFallback?: Child;
30
30
  slug: string;
31
31
  locale?: string;
32
32
  basePath?: string;
33
33
  displayLocale?: string;
34
34
  dateFormats?: ResolvedDateFormats;
35
- }) => VNode;
35
+ }) => Description;
36
36
  export interface DocHistoryAreaProps {
37
37
  /** Page slug, e.g. "getting-started/intro". */
38
38
  slug: string;
@@ -77,4 +77,6 @@ export interface DocHistoryAreaProps {
77
77
  * DocHistory island is a HOST-bound slot (`ctx.hostBindings.DocHistory`,
78
78
  * default: a no-op stub rendering an empty fragment).
79
79
  */
80
- export declare function createDocHistoryArea<S extends Settings = Settings>(ctx: ChromeContext<S>): (props: DocHistoryAreaProps) => VNode | null;
80
+ export declare function createDocHistoryArea<S extends Settings = Settings>(ctx: ChromeContext<S>): (props: DocHistoryAreaProps) => Child;
81
+ /** Server-only fixed-target boundary. The fallback never crosses island JSON props. */
82
+ export declare function DocHistoryBoundary({ ssrFallback, ...props }: Parameters<DocHistoryComponent>[0]): Description;
@@ -1,5 +1,6 @@
1
- import { jsx, jsxs } from "preact/jsx-runtime";
1
+ import { Fragment, jsx, jsxs } from "@takazudo/zfb/zudo-react/jsx-runtime";
2
2
  import { Island } from "@takazudo/zfb";
3
+ import { DocHistory as DocHistoryClient } from "../doc-history/index.js";
3
4
  import { compileExclude } from "../doc-history-exclude/index.js";
4
5
  import { BodyFootUtilArea } from "../body-foot-util/index.js";
5
6
  import { toHistorySlug } from "../slug/index.js";
@@ -20,7 +21,6 @@ function createDocHistoryArea(ctx) {
20
21
  );
21
22
  const DocHistory = deriveDocHistorySlot(ctx);
22
23
  const dateFormatsFor = deriveDateFormats(ctx);
23
- DocHistory.displayName = "DocHistory";
24
24
  function DocHistoryArea({
25
25
  slug,
26
26
  locale,
@@ -57,20 +57,17 @@ function createDocHistoryArea(ctx) {
57
57
  updatedDate ? `: ${updatedDate}` : ""
58
58
  ] })
59
59
  ] });
60
- const docHistoryIsland = showDocHistoryUi ? Island({
61
- when: "idle",
62
- ssrFallback: fallback,
63
- children: /* @__PURE__ */ jsx(
64
- DocHistory,
65
- {
66
- slug: historySlug,
67
- locale: docHistoryLocale,
68
- basePath: docHistoryBasePath,
69
- displayLocale: docHistoryDisplayLocale,
70
- dateFormats: docHistoryDateFormats
71
- }
72
- )
73
- }) : null;
60
+ const docHistoryIsland = showDocHistoryUi ? /* @__PURE__ */ jsx(
61
+ DocHistory,
62
+ {
63
+ ssrFallback: fallback,
64
+ slug: historySlug,
65
+ ...docHistoryLocale !== void 0 ? { locale: docHistoryLocale } : {},
66
+ basePath: docHistoryBasePath,
67
+ displayLocale: docHistoryDisplayLocale,
68
+ dateFormats: docHistoryDateFormats
69
+ }
70
+ ) : null;
74
71
  void historyLabel;
75
72
  const utilSettings = settings.bodyFootUtilArea;
76
73
  const sourceExt = meta ? meta.ext : sourceFileExt;
@@ -87,6 +84,10 @@ function createDocHistoryArea(ctx) {
87
84
  }
88
85
  return DocHistoryArea;
89
86
  }
87
+ function DocHistoryBoundary({ ssrFallback, ...props }) {
88
+ return /* @__PURE__ */ jsx(Fragment, { children: /* @__PURE__ */ jsx(Island, { when: "idle", ssrFallback, children: /* @__PURE__ */ jsx(DocHistoryClient, { ...props }) }) });
89
+ }
90
90
  export {
91
+ DocHistoryBoundary,
91
92
  createDocHistoryArea
92
93
  };
@@ -1,6 +1,5 @@
1
1
  /** @jsxRuntime automatic */
2
- /** @jsxImportSource preact */
3
- import type { VNode } from "preact";
2
+ import type { Child } from "@takazudo/zfb/zudo-react";
4
3
  import type { ChromeContext } from "../factory-context/index.js";
5
4
  import type { Settings } from "../settings.js";
6
5
  /** Per-entry metadata shape from the doc-history manifest. */
@@ -40,4 +39,4 @@ export interface DocMetainfoAreaProps {
40
39
  * package slug helper; the per-page git-history manifest is a HOST-bound slot
41
40
  * (`ctx.hostBindings.docHistoryMeta`, default `{}` → no Created/Updated block).
42
41
  */
43
- export declare function createDocMetainfoArea<S extends Settings = Settings>(ctx: ChromeContext<S>): (props: DocMetainfoAreaProps) => VNode | null;
42
+ export declare function createDocMetainfoArea<S extends Settings = Settings>(ctx: ChromeContext<S>): (props: DocMetainfoAreaProps) => Child;
@@ -1,4 +1,4 @@
1
- import { jsx } from "preact/jsx-runtime";
1
+ import { jsx } from "@takazudo/zfb/zudo-react/jsx-runtime";
2
2
  import { DocMetainfo } from "../metainfo/index.js";
3
3
  import { toHistorySlug } from "../slug/index.js";
4
4
  import { assertChromeContext } from "../chrome/assert-chrome-context.js";