@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
@@ -0,0 +1,129 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import { WebStandardStreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/webStandardStreamableHttp.js";
3
+ import { z } from "zod";
4
+ import { AGENT_MAX_POST_BYTES, AGENT_MAX_TOOL_RESPONSE_BYTES } from "../agent-docs/limits.js";
5
+ import { searchAgentIndex } from "../agent-docs/search.js";
6
+ import { AgentCorpusLoader, CorpusUnavailable } from "./loader.js";
7
+ const encoder = new TextEncoder();
8
+ const annotations = { readOnlyHint: true, idempotentHint: true, destructiveHint: false, openWorldHint: false };
9
+ function json(body, status) {
10
+ return new Response(JSON.stringify(body), { status, headers: { "content-type": "application/json; charset=utf-8" } });
11
+ }
12
+ function absolute(url, origin) {
13
+ return new URL(url, origin).href;
14
+ }
15
+ function toolResult(value, error = false) {
16
+ return error ? { content: [{ type: "text", text: JSON.stringify(value) }], isError: true } : { structuredContent: value, content: [{ type: "text", text: JSON.stringify(value) }] };
17
+ }
18
+ async function cappedBody(request) {
19
+ if (!request.body) return new Uint8Array();
20
+ const reader = request.body.getReader();
21
+ const chunks = [];
22
+ let size = 0;
23
+ try {
24
+ for (; ; ) {
25
+ const { done, value } = await reader.read();
26
+ if (done) break;
27
+ size += value.length;
28
+ if (size > AGENT_MAX_POST_BYTES) {
29
+ await reader.cancel();
30
+ return void 0;
31
+ }
32
+ chunks.push(value);
33
+ }
34
+ } finally {
35
+ reader.releaseLock();
36
+ }
37
+ const bytes = new Uint8Array(size);
38
+ let offset = 0;
39
+ for (const chunk of chunks) {
40
+ bytes.set(chunk, offset);
41
+ offset += chunk.length;
42
+ }
43
+ return bytes;
44
+ }
45
+ function createMcpHandler(options) {
46
+ const loader = new AgentCorpusLoader(options.read, options.base);
47
+ return async (request) => {
48
+ const requestOrigin = new URL(request.url).origin;
49
+ const origin = request.headers.get("origin");
50
+ const allowed = /* @__PURE__ */ new Set([requestOrigin]);
51
+ if (options.siteUrl) {
52
+ try {
53
+ allowed.add(new URL(options.siteUrl).origin);
54
+ } catch {
55
+ }
56
+ }
57
+ const cors = origin && allowed.has(origin) ? origin : void 0;
58
+ const finish = (response) => {
59
+ const headers = new Headers(response.headers);
60
+ headers.set("cache-control", "no-store");
61
+ headers.set("vary", "Origin");
62
+ if (cors) headers.set("access-control-allow-origin", cors);
63
+ return new Response(response.body, { status: response.status, headers });
64
+ };
65
+ if (origin && !cors) return finish(json({ error: "Origin not allowed." }, 403));
66
+ if (request.method === "OPTIONS") return finish(new Response(null, { status: 204, headers: { allow: "POST, OPTIONS", "access-control-allow-methods": "POST, OPTIONS", "access-control-allow-headers": "content-type, accept, mcp-protocol-version" } }));
67
+ if (request.method !== "POST") {
68
+ const response = json({ error: "Method not allowed." }, 405);
69
+ response.headers.set("allow", "POST, OPTIONS");
70
+ return finish(response);
71
+ }
72
+ const mediaType = request.headers.get("content-type")?.split(";")[0]?.trim().toLowerCase();
73
+ if (mediaType !== "application/json") return finish(json({ error: "Expected application/json." }, 415));
74
+ const bytes = await cappedBody(request);
75
+ if (!bytes) return finish(json({ error: "Request body exceeds 65536 bytes." }, 413));
76
+ try {
77
+ const corpus = await loader.corpus();
78
+ let envelope;
79
+ try {
80
+ envelope = JSON.parse(new TextDecoder().decode(bytes));
81
+ } catch {
82
+ }
83
+ if (envelope && typeof envelope === "object" && !Array.isArray(envelope)) {
84
+ const call = envelope;
85
+ const id = call.params?.arguments?.id;
86
+ if (call.method === "tools/call" && call.params?.name === "fetch" && typeof id === "string" && corpus.manifest.items.some((item) => item.id === id)) {
87
+ await loader.item(id);
88
+ }
89
+ }
90
+ } catch (error) {
91
+ if (error instanceof CorpusUnavailable) return finish(json({ error: error.message }, 503));
92
+ throw error;
93
+ }
94
+ const server = new McpServer({ name: "zudo-doc", version: "1.0.0" });
95
+ const publicOrigin = options.siteUrl ? new URL(options.siteUrl).origin : requestOrigin;
96
+ server.registerTool("search", { description: "Search published documentation.", inputSchema: { query: z.string() }, outputSchema: { results: z.array(z.object({ id: z.string(), title: z.string(), url: z.string() })) }, annotations }, async ({ query }) => {
97
+ const corpus = await loader.corpus();
98
+ const outcome = searchAgentIndex(corpus.index, query);
99
+ if (!outcome.ok) return toolResult({ error: outcome.error }, true);
100
+ const currentIds = new Set(corpus.manifest.items.map((item) => item.id));
101
+ const results = outcome.results.filter((item) => currentIds.has(item.id)).map((item) => ({ ...item, url: absolute(item.url, publicOrigin) }));
102
+ while (encoder.encode(JSON.stringify(toolResult({ results }))).length * 2 > AGENT_MAX_TOOL_RESPONSE_BYTES && results.length) results.pop();
103
+ return toolResult({ results });
104
+ });
105
+ server.registerTool("fetch", { description: "Fetch a published documentation item by search result ID.", inputSchema: { id: z.string() }, outputSchema: { id: z.string(), title: z.string(), text: z.string(), url: z.string(), metadata: z.record(z.string(), z.unknown()) }, annotations }, async ({ id }) => {
106
+ const item = await loader.item(id);
107
+ if (!item) return toolResult({ error: `Documentation item not found: ${id}` }, true);
108
+ const result = { ...item, url: absolute(item.url, publicOrigin) };
109
+ return toolResult(result);
110
+ });
111
+ const transport = new WebStandardStreamableHTTPServerTransport({ sessionIdGenerator: void 0, enableJsonResponse: true });
112
+ try {
113
+ await server.connect(transport);
114
+ const sdkRequest = new Request(request.url, { method: "POST", headers: request.headers, body: new Uint8Array(bytes) });
115
+ const response = await transport.handleRequest(sdkRequest);
116
+ const body = await response.text();
117
+ if (encoder.encode(body).length > AGENT_MAX_TOOL_RESPONSE_BYTES) return finish(json({ error: "MCP response exceeds byte limit." }, 503));
118
+ return finish(new Response(body, { status: response.status, headers: response.headers }));
119
+ } catch (error) {
120
+ if (error instanceof CorpusUnavailable) return finish(json({ error: error.message }, 503));
121
+ throw error;
122
+ } finally {
123
+ await server.close();
124
+ }
125
+ };
126
+ }
127
+ export {
128
+ createMcpHandler
129
+ };
@@ -0,0 +1,4 @@
1
+ export { createMcpHandler } from "./handler.js";
2
+ export { AgentCorpusLoader, CorpusUnavailable } from "./loader.js";
3
+ export type { McpHandlerOptions } from "./handler.js";
4
+ export type { ReadAsset } from "./loader.js";
@@ -0,0 +1,7 @@
1
+ import { createMcpHandler } from "./handler.js";
2
+ import { AgentCorpusLoader, CorpusUnavailable } from "./loader.js";
3
+ export {
4
+ AgentCorpusLoader,
5
+ CorpusUnavailable,
6
+ createMcpHandler
7
+ };
@@ -0,0 +1,19 @@
1
+ import { type BuiltAgentSearchIndex } from "../agent-docs/search.js";
2
+ import type { AgentItem, AgentManifest } from "../agent-docs/types.js";
3
+ export type ReadAsset = (path: string) => Promise<Response>;
4
+ export declare class CorpusUnavailable extends Error {
5
+ }
6
+ export declare class AgentCorpusLoader {
7
+ private readonly read;
8
+ private readonly base;
9
+ private current?;
10
+ private loading?;
11
+ constructor(read: ReadAsset, base: string);
12
+ private load;
13
+ corpus(): Promise<{
14
+ fingerprint: string;
15
+ manifest: AgentManifest;
16
+ index: BuiltAgentSearchIndex;
17
+ }>;
18
+ item(id: string): Promise<AgentItem | undefined>;
19
+ }
@@ -0,0 +1,202 @@
1
+ import { AGENT_MAX_ITEMS, AGENT_MAX_MANIFEST_BYTES, AGENT_MAX_SEARCH_INDEX_BYTES } from "../agent-docs/limits.js";
2
+ import { buildAgentSearchIndex } from "../agent-docs/search.js";
3
+ import { z } from "zod";
4
+ const digest = z.string().regex(/^[a-f0-9]{64}$/);
5
+ const pageId = z.string().regex(/^p-[a-f0-9]{16}$/);
6
+ const itemId = z.string().regex(/^p-[a-f0-9]{16}-[0-9]{6}$/);
7
+ const part = z.number().int().positive();
8
+ const itemSchema = z.object({
9
+ id: itemId,
10
+ title: z.string(),
11
+ text: z.string(),
12
+ url: z.string(),
13
+ metadata: z.object({
14
+ locale: z.string(),
15
+ pageId,
16
+ fingerprint: digest,
17
+ part,
18
+ partCount: part,
19
+ description: z.string().optional(),
20
+ section: z.string().optional(),
21
+ unsupportedDynamicContent: z.boolean().optional()
22
+ })
23
+ });
24
+ const manifestSchema = z.object({
25
+ schemaVersion: z.literal(1),
26
+ fingerprint: digest,
27
+ site: z.object({ name: z.string(), url: z.string(), base: z.string() }),
28
+ defaultLocale: z.string(),
29
+ locales: z.array(z.string()),
30
+ searchIndex: z.object({ url: z.string(), sha256: digest }),
31
+ documents: z.array(z.object({
32
+ id: pageId,
33
+ key: pageId,
34
+ locale: z.string(),
35
+ title: z.string(),
36
+ url: z.string(),
37
+ markdownUrl: z.string(),
38
+ itemIds: z.array(itemId)
39
+ })),
40
+ items: z.array(z.object({
41
+ id: itemId,
42
+ key: itemId,
43
+ pageId,
44
+ url: z.string(),
45
+ artifactUrl: z.string(),
46
+ sha256: digest,
47
+ part,
48
+ partCount: part
49
+ })).max(AGENT_MAX_ITEMS)
50
+ });
51
+ const indexSchema = z.object({
52
+ schemaVersion: z.literal(1),
53
+ fingerprint: digest,
54
+ items: z.array(itemSchema).max(AGENT_MAX_ITEMS)
55
+ });
56
+ class CorpusUnavailable extends Error {
57
+ }
58
+ const encoder = new TextEncoder();
59
+ async function sha256(text) {
60
+ const bytes = await crypto.subtle.digest("SHA-256", encoder.encode(text));
61
+ return Array.from(new Uint8Array(bytes), (byte) => byte.toString(16).padStart(2, "0")).join("");
62
+ }
63
+ function basePath(base) {
64
+ return `/${base.split("/").filter(Boolean).join("/")}/agent/v1/`.replace(/^\/\//, "/");
65
+ }
66
+ function safePath(url, root, siteUrl) {
67
+ let path = url;
68
+ if (/^https?:\/\//.test(url)) {
69
+ let parsed;
70
+ try {
71
+ parsed = new URL(url);
72
+ } catch {
73
+ throw new CorpusUnavailable("Invalid agent corpus artifact URL.");
74
+ }
75
+ if (!siteUrl || parsed.origin !== new URL(siteUrl).origin || parsed.search || parsed.hash) throw new CorpusUnavailable("Invalid agent corpus artifact origin.");
76
+ path = parsed.pathname;
77
+ }
78
+ if (!path.startsWith(root) || path.includes("?") || path.includes("#") || path.includes("..") || path.includes("%")) {
79
+ throw new CorpusUnavailable("Invalid agent corpus artifact path.");
80
+ }
81
+ return path;
82
+ }
83
+ async function readText(read, path, max) {
84
+ let response;
85
+ try {
86
+ response = await read(path);
87
+ } catch {
88
+ throw new CorpusUnavailable(`Cannot read agent corpus artifact: ${path}`);
89
+ }
90
+ if (!response.ok || !response.body) throw new CorpusUnavailable(`Missing agent corpus artifact: ${path}`);
91
+ const reader = response.body.getReader();
92
+ const chunks = [];
93
+ let size = 0;
94
+ try {
95
+ for (; ; ) {
96
+ const { done, value } = await reader.read();
97
+ if (done) break;
98
+ size += value.byteLength;
99
+ if (size > max) {
100
+ await reader.cancel();
101
+ throw new CorpusUnavailable(`Agent corpus artifact exceeds ${max} bytes.`);
102
+ }
103
+ chunks.push(value);
104
+ }
105
+ } catch (error) {
106
+ if (error instanceof CorpusUnavailable) throw error;
107
+ throw new CorpusUnavailable(`Cannot read agent corpus artifact: ${path}`);
108
+ } finally {
109
+ reader.releaseLock();
110
+ }
111
+ const bytes = new Uint8Array(size);
112
+ let offset = 0;
113
+ for (const chunk of chunks) {
114
+ bytes.set(chunk, offset);
115
+ offset += chunk.length;
116
+ }
117
+ try {
118
+ return new TextDecoder("utf-8", { fatal: true }).decode(bytes);
119
+ } catch {
120
+ throw new CorpusUnavailable(`Invalid UTF-8 in agent corpus artifact: ${path}`);
121
+ }
122
+ }
123
+ function parse(text, label, schema) {
124
+ let value;
125
+ try {
126
+ value = JSON.parse(text);
127
+ } catch {
128
+ throw new CorpusUnavailable(`Invalid agent ${label} JSON.`);
129
+ }
130
+ const result = schema.safeParse(value);
131
+ if (!result.success) throw new CorpusUnavailable(`Incompatible agent ${label}.`);
132
+ return result.data;
133
+ }
134
+ class AgentCorpusLoader {
135
+ constructor(read, base) {
136
+ this.read = read;
137
+ this.base = base;
138
+ }
139
+ read;
140
+ base;
141
+ current;
142
+ loading;
143
+ async load(manifest) {
144
+ const root = basePath(this.base);
145
+ const indexPath = safePath(manifest.searchIndex.url, root, manifest.site.url);
146
+ if (indexPath !== `${root}search-index.json`) throw new CorpusUnavailable("Invalid agent search index path.");
147
+ const raw = await readText(this.read, indexPath, AGENT_MAX_SEARCH_INDEX_BYTES);
148
+ if (await sha256(raw) !== manifest.searchIndex.sha256) throw new CorpusUnavailable("Agent search index digest mismatch.");
149
+ const data = parse(raw, "search index", indexSchema);
150
+ if (data.schemaVersion !== 1 || data.fingerprint !== manifest.fingerprint || !Array.isArray(data.items) || data.items.length > AGENT_MAX_ITEMS) {
151
+ throw new CorpusUnavailable("Incompatible agent search index.");
152
+ }
153
+ const byId = new Map(manifest.items.map((item) => [item.id, item]));
154
+ if (byId.size !== manifest.items.length || byId.size !== data.items.length || new Set(data.items.map((item) => item.id)).size !== data.items.length || data.items.some((item) => !byId.has(item.id) || item.metadata?.fingerprint !== manifest.fingerprint)) {
155
+ throw new CorpusUnavailable("Agent search index does not match manifest.");
156
+ }
157
+ const loaded = { fingerprint: manifest.fingerprint, manifest, index: buildAgentSearchIndex(data) };
158
+ this.current = loaded;
159
+ return loaded;
160
+ }
161
+ async corpus() {
162
+ const root = basePath(this.base);
163
+ const raw = await readText(this.read, `${root}manifest.json`, AGENT_MAX_MANIFEST_BYTES);
164
+ const manifest = parse(raw, "manifest", manifestSchema);
165
+ if (manifest.schemaVersion !== 1 || !/^[a-f0-9]{64}$/.test(manifest.fingerprint) || !Array.isArray(manifest.items) || manifest.items.length > AGENT_MAX_ITEMS || !manifest.searchIndex?.sha256) {
166
+ throw new CorpusUnavailable("Incompatible agent manifest.");
167
+ }
168
+ if (this.current?.fingerprint === manifest.fingerprint && this.current.manifest.searchIndex.sha256 === manifest.searchIndex.sha256) {
169
+ this.current = { ...this.current, manifest };
170
+ return this.current;
171
+ }
172
+ this.current = void 0;
173
+ if (this.loading) {
174
+ try {
175
+ const loaded = await this.loading;
176
+ if (loaded.fingerprint === manifest.fingerprint && loaded.manifest.searchIndex.sha256 === manifest.searchIndex.sha256) return { ...loaded, manifest };
177
+ } catch {
178
+ }
179
+ }
180
+ this.loading = this.load(manifest).finally(() => {
181
+ this.loading = void 0;
182
+ });
183
+ return this.loading;
184
+ }
185
+ async item(id) {
186
+ const { manifest } = await this.corpus();
187
+ const entry = manifest.items.find((item2) => item2.id === id);
188
+ if (!entry) return void 0;
189
+ const root = basePath(this.base);
190
+ const path = safePath(entry.artifactUrl, `${root}items/`, manifest.site.url);
191
+ if (path !== `${root}items/${entry.key}.json` || !/^p-[a-f0-9]{16}-[0-9]{6}$/.test(entry.key)) throw new CorpusUnavailable("Invalid agent item path.");
192
+ const raw = await readText(this.read, path, 256 * 1024);
193
+ if (await sha256(raw) !== entry.sha256) throw new CorpusUnavailable("Agent item digest mismatch.");
194
+ const item = parse(raw, "item", itemSchema);
195
+ if (item.id !== id || item.metadata?.fingerprint !== manifest.fingerprint || item.metadata.pageId !== entry.pageId) throw new CorpusUnavailable("Agent item does not match manifest.");
196
+ return item;
197
+ }
198
+ }
199
+ export {
200
+ AgentCorpusLoader,
201
+ CorpusUnavailable
202
+ };
@@ -1,4 +1,4 @@
1
- import { toChildArray } from "preact";
1
+ import { h, flattenChildren } from "@takazudo/zfb/zudo-react";
2
2
  import { defaultComponents } from "../content/index.js";
3
3
  import { createContentLink } from "../content/content-link.js";
4
4
  import { decodeAuthoredHref, assetViewerHref } from "../asset-path/index.js";
@@ -18,58 +18,25 @@ function makeContentImg(base) {
18
18
  if (finalTitle !== void 0) {
19
19
  mergedProps.title = finalTitle;
20
20
  }
21
- return { type: "img", props: mergedProps, key: null, constructor: void 0 };
21
+ return h("img", mergedProps);
22
22
  };
23
23
  }
24
- const ENLARGE_SVG = {
25
- type: "svg",
26
- props: {
24
+ const ENLARGE_SVG = h(
25
+ "svg",
26
+ {
27
27
  viewBox: "0 0 38.99 38.99",
28
28
  fill: "currentColor",
29
- focusable: "false",
30
- "aria-hidden": "true",
31
- children: [
32
- {
33
- type: "polygon",
34
- props: {
35
- points: "16.2 13.74 5.92 3.47 11.2 3.47 11.2 0 3.47 0 0 0 0 3.47 0 11.2 3.47 11.2 3.47 5.92 13.74 16.2 16.2 13.74"
36
- },
37
- key: null,
38
- constructor: void 0
39
- },
40
- {
41
- type: "polygon",
42
- props: {
43
- points: "25.24 16.2 35.52 5.92 35.52 11.2 38.99 11.2 38.99 3.47 38.99 0 35.52 0 27.79 0 27.79 3.47 33.07 3.47 22.79 13.74 25.24 16.2"
44
- },
45
- key: null,
46
- constructor: void 0
47
- },
48
- {
49
- type: "polygon",
50
- props: {
51
- points: "22.79 25.24 33.07 35.52 27.79 35.52 27.79 38.99 35.52 38.99 38.99 38.99 38.99 35.52 38.99 27.79 35.52 27.79 35.52 33.07 25.24 22.79 22.79 25.24"
52
- },
53
- key: null,
54
- constructor: void 0
55
- },
56
- {
57
- type: "polygon",
58
- props: {
59
- points: "13.74 22.79 3.47 33.07 3.47 27.79 0 27.79 0 35.52 0 38.99 3.47 38.99 11.2 38.99 11.2 35.52 5.92 35.52 16.2 25.24 13.74 22.79"
60
- },
61
- key: null,
62
- constructor: void 0
63
- }
64
- ]
29
+ "aria-hidden": "true"
65
30
  },
66
- key: null,
67
- constructor: void 0
68
- };
31
+ h("polygon", { points: "16.2 13.74 5.92 3.47 11.2 3.47 11.2 0 3.47 0 0 0 0 3.47 0 11.2 3.47 11.2 3.47 5.92 13.74 16.2 16.2 13.74" }),
32
+ h("polygon", { points: "25.24 16.2 35.52 5.92 35.52 11.2 38.99 11.2 38.99 3.47 38.99 0 35.52 0 27.79 0 27.79 3.47 33.07 3.47 22.79 13.74 25.24 16.2" }),
33
+ h("polygon", { points: "22.79 25.24 33.07 35.52 27.79 35.52 27.79 38.99 35.52 38.99 38.99 38.99 38.99 35.52 38.99 27.79 35.52 27.79 35.52 33.07 25.24 22.79 22.79 25.24" }),
34
+ h("polygon", { points: "13.74 22.79 3.47 33.07 3.47 27.79 0 27.79 0 35.52 0 38.99 3.47 38.99 11.2 38.99 11.2 35.52 5.92 35.52 16.2 25.24 13.74 22.79" })
35
+ );
69
36
  function makeEnlargeableParagraph(imageEnlarge, ContentImg, assetOptions) {
70
37
  return function EnlargeableParagraph(props) {
71
38
  const { children } = props;
72
- const kids = toChildArray(children).filter((child) => {
39
+ const kids = flattenChildren(children).filter((child) => {
73
40
  if (typeof child === "string" || typeof child === "number") {
74
41
  return String(child).trim() !== "";
75
42
  }
@@ -90,71 +57,36 @@ function makeEnlargeableParagraph(imageEnlarge, ContentImg, assetOptions) {
90
57
  ) : void 0;
91
58
  const canEnlarge = imageEnlarge && imgProps.title !== "no-enlarge";
92
59
  if (canEnlarge || imageEntry) {
93
- const enlargeBtn = {
60
+ const enlargeBtn = h("button", {
94
61
  type: "button",
95
- props: {
96
- type: "button",
97
- class: "zd-enlarge-btn",
98
- hidden: true,
99
- "aria-label": "Enlarge image",
100
- children: ENLARGE_SVG
101
- },
102
- key: null,
103
- constructor: void 0
104
- };
62
+ class: "zd-enlarge-btn",
63
+ hidden: true,
64
+ "aria-label": "Enlarge image"
65
+ }, ENLARGE_SVG);
105
66
  const captionText = typeof imgProps.alt === "string" ? imgProps.alt.trim() : "";
106
67
  const dimensions = imageEntry?.width !== void 0 && imageEntry.height !== void 0 ? ` \xB7 ${imageEntry.width} \xD7 ${imageEntry.height}` : "";
107
- const figcaption = imageEntry ? {
108
- type: "figcaption",
109
- props: {
110
- class: "mt-vsp-2xs flex flex-wrap items-baseline justify-center gap-x-hsp-xs text-caption text-muted",
111
- children: [
112
- captionText ? {
113
- type: "span",
114
- props: { children: captionText },
115
- key: null,
116
- constructor: void 0
117
- } : null,
118
- captionText ? {
119
- type: "span",
120
- props: { "aria-hidden": "true", children: "|" },
121
- key: null,
122
- constructor: void 0
123
- } : null,
124
- {
125
- type: "a",
126
- props: {
127
- class: "text-fg hover:text-accent focus-visible:text-accent hover:underline focus-visible:underline",
128
- href: assetViewerHref({
129
- base: assetOptions.base,
130
- routePrefix: assetOptions.routePrefix,
131
- path: imageEntry.path,
132
- locale: assetOptions.isDefaultLocaleOnlyPath?.(
133
- `/${assetOptions.routePrefix}/${imageEntry.path}`
134
- ) ? void 0 : assetOptions.locale
135
- }),
136
- children: `\u2922 Open asset page${dimensions}`
137
- },
138
- key: null,
139
- constructor: void 0
140
- }
141
- ]
142
- },
143
- key: null,
144
- constructor: void 0
145
- } : null;
146
- return {
147
- type: "figure",
148
- props: {
149
- class: [
150
- canEnlarge ? "zd-enlargeable" : null,
151
- imageEntry ? "p-hsp-lg" : null
152
- ].filter((className) => className !== null).join(" "),
153
- children: [vnode, canEnlarge ? enlargeBtn : null, figcaption]
68
+ const figcaption = imageEntry ? h(
69
+ "figcaption",
70
+ {
71
+ class: "mt-vsp-2xs flex flex-wrap items-baseline justify-center gap-x-hsp-xs text-caption text-muted"
154
72
  },
155
- key: null,
156
- constructor: void 0
157
- };
73
+ captionText ? h("span", null, captionText) : null,
74
+ captionText ? h("span", { "aria-hidden": "true" }, "|") : null,
75
+ h("a", {
76
+ class: "text-fg hover:text-accent focus-visible:text-accent hover:underline focus-visible:underline",
77
+ href: assetViewerHref({
78
+ base: assetOptions.base,
79
+ routePrefix: assetOptions.routePrefix,
80
+ path: imageEntry.path,
81
+ locale: assetOptions.isDefaultLocaleOnlyPath?.(
82
+ `/${assetOptions.routePrefix}/${imageEntry.path}`
83
+ ) ? void 0 : assetOptions.locale
84
+ })
85
+ }, `\u2922 Open asset page${dimensions}`)
86
+ ) : null;
87
+ return h("figure", {
88
+ class: [canEnlarge ? "zd-enlargeable" : null, imageEntry ? "p-hsp-lg" : null].filter((name) => name !== null).join(" ")
89
+ }, vnode, canEnlarge ? enlargeBtn : null, figcaption);
158
90
  }
159
91
  }
160
92
  }
@@ -212,8 +144,8 @@ function createMdxComponents(options) {
212
144
  // figures also receive the p-hsp-lg inset. Must come AFTER ...defaultComponents
213
145
  // to override ContentParagraph.
214
146
  p: EnlargeableParagraph,
215
- // Admonitions — real typed Preact components emitting the
216
- // `.admonition` / `data-admonition` structure the design-system CSS
147
+ // Admonitions — server-rendered components emitting the
148
+ // `data-admonition` / variant-class structure the design-system CSS
217
149
  // targets. `:::note` directives emit <Note>; `<Note title="…">` JSX is
218
150
  // also authored directly. github-alerts [!IMPORTANT]/[!CAUTION] map to
219
151
  // Important/Caution — omitting those two 500s their SSR render.
@@ -1,11 +1,4 @@
1
- export declare function MermaidEnlarge(): import("preact").JSX.Element;
1
+ export declare function MermaidEnlarge(): import("@takazudo/zfb").Description;
2
2
  export declare namespace MermaidEnlarge {
3
3
  var displayName: string;
4
4
  }
5
- /**
6
- * Static SSR fallback for the {@link MermaidEnlarge} island.
7
- *
8
- * Renders an empty, closed `<dialog class="zd-mermaid-dialog ...">` so the
9
- * dist HTML carries the dialog shell even before hydration.
10
- */
11
- export declare function MermaidEnlargeSsrFallback(): import("preact").JSX.Element;