@takazudo/zudo-doc 5.28.2 → 6.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (456) hide show
  1. package/CHANGELOG.md +22 -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/category-nav/index.d.ts +1 -2
  43. package/dist/category-nav/index.js +11 -5
  44. package/dist/category-tree-nav/index.d.ts +1 -2
  45. package/dist/category-tree-nav/index.js +3 -3
  46. package/dist/chrome/derive.d.ts +18 -27
  47. package/dist/chrome/derive.js +47 -29
  48. package/dist/chrome/index.d.ts +5 -5
  49. package/dist/chrome/index.js +1 -1
  50. package/dist/chrome/island-data.d.ts +4 -0
  51. package/dist/chrome/island-data.js +52 -0
  52. package/dist/chrome/primary-slots.d.ts +2 -3
  53. package/dist/chrome-bindings.d.ts +28 -22
  54. package/dist/code-group/index.d.ts +3 -4
  55. package/dist/code-group/index.js +3 -7
  56. package/dist/code-syntax/code-block-enhancer.d.ts +1 -2
  57. package/dist/code-syntax/code-block-enhancer.js +2 -2
  58. package/dist/code-syntax/mermaid-init.d.ts +1 -2
  59. package/dist/code-syntax/mermaid-init.js +5 -2
  60. package/dist/code-syntax/tabs-init-script.js +1 -1
  61. package/dist/code-syntax/tabs-init.d.ts +1 -2
  62. package/dist/code-syntax/tabs-init.js +2 -2
  63. package/dist/code-syntax/tabs.d.ts +6 -6
  64. package/dist/code-syntax/tabs.js +8 -8
  65. package/dist/compiled.css +2933 -2943
  66. package/dist/config-assertions/index.d.ts +13 -0
  67. package/dist/config-assertions/index.js +14 -0
  68. package/dist/config.d.ts +36 -17
  69. package/dist/config.js +23 -95
  70. package/dist/content/content-blockquote.d.ts +2 -3
  71. package/dist/content/content-blockquote.js +3 -3
  72. package/dist/content/content-code.d.ts +3 -4
  73. package/dist/content/content-code.js +5 -5
  74. package/dist/content/content-link.d.ts +3 -4
  75. package/dist/content/content-link.js +10 -10
  76. package/dist/content/content-ol.d.ts +2 -3
  77. package/dist/content/content-ol.js +5 -4
  78. package/dist/content/content-paragraph.d.ts +2 -3
  79. package/dist/content/content-paragraph.js +1 -1
  80. package/dist/content/content-strong.d.ts +2 -3
  81. package/dist/content/content-strong.js +3 -3
  82. package/dist/content/content-table.d.ts +2 -3
  83. package/dist/content/content-table.js +4 -4
  84. package/dist/content/content-ul.d.ts +2 -3
  85. package/dist/content/content-ul.js +4 -4
  86. package/dist/content/heading-h2.d.ts +2 -3
  87. package/dist/content/heading-h2.js +4 -4
  88. package/dist/content/heading-h3.d.ts +2 -3
  89. package/dist/content/heading-h3.js +4 -4
  90. package/dist/content/heading-h4.d.ts +2 -3
  91. package/dist/content/heading-h4.js +4 -4
  92. package/dist/content-admonition/index.d.ts +3 -4
  93. package/dist/content-admonition/index.js +2 -2
  94. package/dist/content.css +35 -33
  95. package/dist/design-token-panel-bootstrap-controller.d.ts +178 -0
  96. package/dist/design-token-panel-bootstrap-controller.js +359 -0
  97. package/dist/design-token-panel-bootstrap-island.d.ts +5 -0
  98. package/dist/design-token-panel-bootstrap-island.js +19 -0
  99. package/dist/design-token-panel-bootstrap.d.ts +5 -195
  100. package/dist/design-token-panel-bootstrap.js +3 -288
  101. package/dist/desktop-sidebar-toggle-island/index.d.ts +2 -7
  102. package/dist/desktop-sidebar-toggle-island/index.js +2 -58
  103. package/dist/desktop-sidebar-toggle-island/island.d.ts +4 -0
  104. package/dist/desktop-sidebar-toggle-island/island.js +43 -0
  105. package/dist/desktop-sidebar-toggle-island/storage.d.ts +4 -0
  106. package/dist/desktop-sidebar-toggle-island/storage.js +29 -0
  107. package/dist/desktop-toc-toggle-island/index.d.ts +2 -7
  108. package/dist/desktop-toc-toggle-island/index.js +2 -58
  109. package/dist/desktop-toc-toggle-island/island.d.ts +4 -0
  110. package/dist/desktop-toc-toggle-island/island.js +43 -0
  111. package/dist/desktop-toc-toggle-island/storage.d.ts +4 -0
  112. package/dist/desktop-toc-toggle-island/storage.js +29 -0
  113. package/dist/details/details.d.ts +3 -4
  114. package/dist/details/details.js +1 -1
  115. package/dist/doc-body-end/index.d.ts +1 -2
  116. package/dist/doc-body-end/index.js +1 -1
  117. package/dist/doc-body-end-islands/design-token-panel-island.d.ts +2 -2
  118. package/dist/doc-body-end-islands/design-token-panel-island.js +3 -7
  119. package/dist/doc-body-end-islands/index.d.ts +4 -21
  120. package/dist/doc-body-end-islands/index.js +5 -3
  121. package/dist/doc-body-end-islands/theme-pack-switcher-island.d.ts +3 -13
  122. package/dist/doc-body-end-islands/theme-pack-switcher-island.js +11 -13
  123. package/dist/doc-content-header/index.d.ts +1 -2
  124. package/dist/doc-content-header/index.js +1 -1
  125. package/dist/doc-history/index.d.ts +1 -1
  126. package/dist/doc-history/index.js +166 -141
  127. package/dist/doc-history-area/index.d.ts +6 -4
  128. package/dist/doc-history-area/index.js +17 -16
  129. package/dist/doc-metainfo-area/index.d.ts +2 -3
  130. package/dist/doc-metainfo-area/index.js +1 -1
  131. package/dist/doc-page-renderer/index.d.ts +13 -7
  132. package/dist/doc-page-renderer/index.js +10 -1
  133. package/dist/doc-page-shell/index.d.ts +20 -7
  134. package/dist/doc-page-shell/index.js +17 -6
  135. package/dist/doc-pager/index.d.ts +1 -2
  136. package/dist/doc-pager/index.js +3 -3
  137. package/dist/doc-tags-area/index.d.ts +2 -3
  138. package/dist/doc-tags-area/index.js +1 -1
  139. package/dist/doclayout/doc-layout-with-defaults.d.ts +9 -9
  140. package/dist/doclayout/doc-layout-with-defaults.js +5 -15
  141. package/dist/doclayout/doc-layout.d.ts +26 -27
  142. package/dist/doclayout/doc-layout.js +23 -14
  143. package/dist/docs-schema/index.d.ts +4 -0
  144. package/dist/docs-schema/index.js +1 -0
  145. package/dist/extract-headings/index.js +43 -12
  146. package/dist/factory-context/index.d.ts +22 -19
  147. package/dist/features.css +70 -8
  148. package/dist/find-in-page/find-bar.d.ts +4 -2
  149. package/dist/find-in-page/find-bar.js +58 -69
  150. package/dist/find-in-page/index.d.ts +2 -8
  151. package/dist/find-in-page/index.js +33 -30
  152. package/dist/footer/footer.d.ts +3 -4
  153. package/dist/footer/footer.js +3 -3
  154. package/dist/footer-with-defaults/index.d.ts +2 -3
  155. package/dist/footer-with-defaults/index.js +1 -1
  156. package/dist/frontmatter-preview-defaults/index.js +1 -0
  157. package/dist/head/doc-head.d.ts +1 -1
  158. package/dist/head/doc-head.js +24 -32
  159. package/dist/head/og-tags.d.ts +1 -1
  160. package/dist/head/og-tags.js +8 -7
  161. package/dist/head/twitter-card.d.ts +1 -1
  162. package/dist/head/twitter-card.js +1 -1
  163. package/dist/head-with-defaults/index.d.ts +7 -2
  164. package/dist/head-with-defaults/index.js +46 -32
  165. package/dist/header/header.d.ts +8 -8
  166. package/dist/header/header.js +9 -11
  167. package/dist/header/types.d.ts +7 -7
  168. package/dist/header-with-defaults/index.d.ts +1 -2
  169. package/dist/header-with-defaults/index.js +18 -8
  170. package/dist/home-intro/index.d.ts +2 -5
  171. package/dist/home-intro/index.js +7 -5
  172. package/dist/home-intro/prepare.js +4 -3
  173. package/dist/home-page/index.d.ts +3 -3
  174. package/dist/home-page/index.js +19 -17
  175. package/dist/html-preview-wrapper/highlighted-code.d.ts +3 -4
  176. package/dist/html-preview-wrapper/highlighted-code.js +19 -17
  177. package/dist/html-preview-wrapper/html-preview-wrapper.d.ts +4 -25
  178. package/dist/html-preview-wrapper/html-preview-wrapper.js +2 -87
  179. package/dist/html-preview-wrapper/html-preview.d.ts +3 -10
  180. package/dist/html-preview-wrapper/html-preview.js +13 -37
  181. package/dist/html-preview-wrapper/index.d.ts +2 -1
  182. package/dist/html-preview-wrapper/index.js +1 -1
  183. package/dist/html-preview-wrapper/preview-base.d.ts +3 -5
  184. package/dist/html-preview-wrapper/preview-base.js +56 -59
  185. package/dist/html-preview-wrapper/wrapper.d.ts +20 -0
  186. package/dist/html-preview-wrapper/wrapper.js +37 -0
  187. package/dist/hydration-pending.d.ts +3 -5
  188. package/dist/hydration-pending.js +7 -5
  189. package/dist/i18n-version/language-switcher.d.ts +5 -32
  190. package/dist/i18n-version/language-switcher.js +5 -106
  191. package/dist/i18n-version/switcher-generated-scripts.d.ts +2 -0
  192. package/dist/i18n-version/switcher-generated-scripts.js +107 -0
  193. package/dist/i18n-version/switcher-url-state.d.ts +76 -0
  194. package/dist/i18n-version/switcher-url-state.js +103 -0
  195. package/dist/i18n-version/version-banner.d.ts +2 -3
  196. package/dist/i18n-version/version-banner.js +1 -1
  197. package/dist/i18n-version/version-switcher.d.ts +5 -50
  198. package/dist/i18n-version/version-switcher.js +5 -157
  199. package/dist/icons/index.d.ts +18 -19
  200. package/dist/icons/index.js +17 -33
  201. package/dist/image-enlarge/index.d.ts +1 -10
  202. package/dist/image-enlarge/index.js +80 -55
  203. package/dist/image-enlarge/public.d.ts +2 -0
  204. package/dist/image-enlarge/public.js +6 -0
  205. package/dist/image-enlarge/ssr-fallback.d.ts +2 -0
  206. package/dist/image-enlarge/ssr-fallback.js +8 -0
  207. package/dist/index.d.ts +11 -4
  208. package/dist/inline-version-switcher/index.d.ts +1 -2
  209. package/dist/inline-version-switcher/index.js +1 -1
  210. package/dist/island-types/index.d.ts +2 -2
  211. package/dist/island-types/index.js +1 -5
  212. package/dist/math-block/index.d.ts +4 -7
  213. package/dist/math-block/index.js +5 -5
  214. package/dist/mcp/handler.d.ts +8 -0
  215. package/dist/mcp/handler.js +129 -0
  216. package/dist/mcp/index.d.ts +4 -0
  217. package/dist/mcp/index.js +7 -0
  218. package/dist/mcp/loader.d.ts +19 -0
  219. package/dist/mcp/loader.js +202 -0
  220. package/dist/mdx-components/index.js +40 -108
  221. package/dist/mermaid-enlarge/index.d.ts +1 -8
  222. package/dist/mermaid-enlarge/index.js +174 -158
  223. package/dist/mermaid-enlarge/public.d.ts +2 -0
  224. package/dist/mermaid-enlarge/public.js +6 -0
  225. package/dist/mermaid-enlarge/ssr-fallback.d.ts +2 -0
  226. package/dist/mermaid-enlarge/ssr-fallback.js +8 -0
  227. package/dist/metainfo/doc-metainfo.d.ts +2 -3
  228. package/dist/metainfo/doc-metainfo.js +1 -4
  229. package/dist/metainfo/doc-tags.d.ts +2 -3
  230. package/dist/metainfo/doc-tags.js +1 -1
  231. package/dist/metainfo/frontmatter-preview.d.ts +3 -4
  232. package/dist/metainfo/frontmatter-preview.js +1 -1
  233. package/dist/nav-data-prep/index.js +6 -4
  234. package/dist/nav-indexing/category-nav.d.ts +2 -3
  235. package/dist/nav-indexing/category-nav.js +1 -2
  236. package/dist/nav-indexing/category-tree-nav.d.ts +2 -3
  237. package/dist/nav-indexing/category-tree-nav.js +1 -1
  238. package/dist/nav-indexing/doc-card-grid.d.ts +2 -3
  239. package/dist/nav-indexing/doc-card-grid.js +1 -2
  240. package/dist/nav-indexing/docs-sitemap.d.ts +2 -3
  241. package/dist/nav-indexing/docs-sitemap.js +2 -2
  242. package/dist/nav-indexing/index.d.ts +1 -1
  243. package/dist/nav-indexing/nav-card-grid.d.ts +2 -3
  244. package/dist/nav-indexing/nav-card-grid.js +1 -2
  245. package/dist/nav-indexing/note-tray-index-parts/card-list.d.ts +1 -2
  246. package/dist/nav-indexing/note-tray-index-parts/card-list.js +4 -4
  247. package/dist/nav-indexing/note-tray-index-parts/date-line.d.ts +2 -3
  248. package/dist/nav-indexing/note-tray-index-parts/date-line.js +1 -1
  249. package/dist/nav-indexing/note-tray-index-parts/index-list.d.ts +1 -2
  250. package/dist/nav-indexing/note-tray-index-parts/index-list.js +2 -2
  251. package/dist/nav-indexing/note-tray-index-parts/timeline.d.ts +1 -2
  252. package/dist/nav-indexing/note-tray-index-parts/timeline.js +2 -2
  253. package/dist/nav-indexing/note-tray-index.d.ts +1 -2
  254. package/dist/nav-indexing/note-tray-index.js +1 -1
  255. package/dist/nav-indexing/site-tree-nav-demo.d.ts +2 -3
  256. package/dist/nav-indexing/site-tree-nav-demo.js +2 -2
  257. package/dist/nav-indexing/tag-nav.d.ts +1 -2
  258. package/dist/nav-indexing/tag-nav.js +1 -1
  259. package/dist/nav-indexing/types.d.ts +2 -2
  260. package/dist/nav-indexing/versions-page-content.d.ts +2 -3
  261. package/dist/nav-indexing/versions-page-content.js +8 -8
  262. package/dist/note-tray-index/index.d.ts +1 -2
  263. package/dist/note-tray-index/index.js +1 -1
  264. package/dist/page-loading/page-loading-overlay.d.ts +1 -2
  265. package/dist/page-loading/page-loading-overlay.js +3 -5
  266. package/dist/plugins/agent-export.d.ts +3 -0
  267. package/dist/plugins/agent-export.js +34 -0
  268. package/dist/plugins/internal/agent-export/chunk.d.ts +5 -0
  269. package/dist/plugins/internal/agent-export/chunk.js +90 -0
  270. package/dist/plugins/internal/agent-export/index.d.ts +24 -0
  271. package/dist/plugins/internal/agent-export/index.js +123 -0
  272. package/dist/plugins/internal/agent-export/normalize.d.ts +5 -0
  273. package/dist/plugins/internal/agent-export/normalize.js +73 -0
  274. package/dist/plugins/internal/llms-txt/dev-middleware.d.ts +6 -0
  275. package/dist/plugins/internal/llms-txt/dev-middleware.js +8 -3
  276. package/dist/plugins/internal/llms-txt/emit.js +23 -6
  277. package/dist/plugins/internal/llms-txt/generate.d.ts +7 -1
  278. package/dist/plugins/internal/llms-txt/generate.js +9 -2
  279. package/dist/plugins/internal/llms-txt/load.d.ts +2 -0
  280. package/dist/plugins/internal/llms-txt/load.js +20 -4
  281. package/dist/plugins/internal/llms-txt/types.d.ts +10 -0
  282. package/dist/plugins/routes.js +4 -0
  283. package/dist/preset.d.ts +19 -9
  284. package/dist/preset.js +20 -1
  285. package/dist/route-context-payload/index.js +1 -1
  286. package/dist/routes/404.d.ts +2 -3
  287. package/dist/routes/404.js +1 -1
  288. package/dist/routes/_chrome.d.ts +5 -5
  289. package/dist/routes/_chrome.js +7 -2
  290. package/dist/routes/_context.d.ts +4 -4
  291. package/dist/routes/_design-token-panel-bootstrap.d.ts +1 -4
  292. package/dist/routes/_design-token-panel-bootstrap.js +9 -1
  293. package/dist/routes/docs-slug.d.ts +2 -3
  294. package/dist/routes/docs-tags-index.d.ts +2 -3
  295. package/dist/routes/docs-tags-index.js +1 -1
  296. package/dist/routes/docs-tags-tag.d.ts +2 -3
  297. package/dist/routes/docs-tags-tag.js +1 -1
  298. package/dist/routes/docs-versions.d.ts +2 -3
  299. package/dist/routes/docs-versions.js +1 -1
  300. package/dist/routes/files-path.d.ts +2 -3
  301. package/dist/routes/files-path.js +1 -1
  302. package/dist/routes/index.d.ts +2 -3
  303. package/dist/routes/index.js +1 -1
  304. package/dist/routes/locale-docs-slug.d.ts +2 -3
  305. package/dist/routes/locale-docs-tags-index.d.ts +2 -3
  306. package/dist/routes/locale-docs-tags-index.js +1 -1
  307. package/dist/routes/locale-docs-tags-tag.d.ts +2 -3
  308. package/dist/routes/locale-docs-tags-tag.js +1 -1
  309. package/dist/routes/locale-docs-versions.d.ts +2 -3
  310. package/dist/routes/locale-docs-versions.js +1 -1
  311. package/dist/routes/locale-files-path.d.ts +2 -3
  312. package/dist/routes/locale-files-path.js +1 -1
  313. package/dist/routes/locale-index.d.ts +2 -3
  314. package/dist/routes/locale-index.js +1 -1
  315. package/dist/routes/mcp.d.ts +5 -0
  316. package/dist/routes/mcp.js +25 -0
  317. package/dist/routes/v-docs-slug.d.ts +2 -3
  318. package/dist/routes/v-locale-docs-slug.d.ts +2 -3
  319. package/dist/search-widget/index.d.ts +1 -2
  320. package/dist/search-widget/index.js +4 -7
  321. package/dist/search-widget-script/generated-script.js +12 -5
  322. package/dist/settings-defaults.d.ts +2 -0
  323. package/dist/settings-defaults.js +93 -0
  324. package/dist/settings.d.ts +8 -2
  325. package/dist/sidebar/index.d.ts +1 -1
  326. package/dist/sidebar/sidebar.d.ts +12 -44
  327. package/dist/sidebar/sidebar.js +4 -3
  328. package/dist/sidebar/types.d.ts +14 -0
  329. package/dist/sidebar-prepaint/index.d.ts +1 -2
  330. package/dist/sidebar-prepaint/index.js +4 -6
  331. package/dist/sidebar-resizer/sidebar-resizer-init.d.ts +2 -3
  332. package/dist/sidebar-resizer/sidebar-resizer-init.js +3 -3
  333. package/dist/sidebar-toggle-island/index.d.ts +8 -11
  334. package/dist/sidebar-toggle-island/index.js +75 -62
  335. package/dist/sidebar-tree/build-tree.js +5 -6
  336. package/dist/sidebar-tree/types.d.ts +2 -0
  337. package/dist/sidebar-tree-island/index.d.ts +4 -19
  338. package/dist/sidebar-tree-island/index.js +782 -436
  339. package/dist/sidebar-tree-island/scope-state.d.ts +38 -0
  340. package/dist/sidebar-tree-island/scope-state.js +151 -0
  341. package/dist/sidebar-tree-island/sidebar-scroll-preserve.js +6 -2
  342. package/dist/sidebar-utils/index.d.ts +17 -19
  343. package/dist/sidebar-utils/index.js +100 -3
  344. package/dist/sidebar-utils/scope.d.ts +11 -0
  345. package/dist/sidebar-utils/scope.js +67 -0
  346. package/dist/sidebar-with-defaults/index.d.ts +1 -2
  347. package/dist/sidebar-with-defaults/index.js +19 -18
  348. package/dist/site-schema/nav-tree.js +15 -15
  349. package/dist/site-schema/types.d.ts +1 -0
  350. package/dist/site-tree-nav/index.d.ts +2 -3
  351. package/dist/site-tree-nav/index.js +11 -12
  352. package/dist/site-tree-nav/normalize-island-props.d.ts +16 -0
  353. package/dist/site-tree-nav/normalize-island-props.js +122 -0
  354. package/dist/site-tree-nav-island/index.d.ts +3 -3
  355. package/dist/site-tree-nav-island/index.js +243 -144
  356. package/dist/smart-break/index.d.ts +3 -4
  357. package/dist/smart-break/index.js +1 -1
  358. package/dist/tab-item/tab-item.d.ts +3 -4
  359. package/dist/tab-item/tab-item.js +1 -1
  360. package/dist/tag-pages/index.d.ts +3 -3
  361. package/dist/tag-pages/index.js +10 -10
  362. package/dist/theme/color-scheme-provider.d.ts +3 -3
  363. package/dist/theme/color-scheme-provider.js +3 -3
  364. package/dist/theme/theme-pack-provider.d.ts +1 -1
  365. package/dist/theme/theme-pack-provider.js +3 -3
  366. package/dist/theme/theme-toggle.d.ts +2 -3
  367. package/dist/theme/theme-toggle.js +1 -1
  368. package/dist/theme-pack-dialog/index.d.ts +1 -1
  369. package/dist/theme-pack-dialog/index.js +69 -75
  370. package/dist/theme-pack-dialog/theme-pack-card.d.ts +3 -4
  371. package/dist/theme-pack-dialog/theme-pack-card.js +19 -17
  372. package/dist/theme-pack-switcher/index.d.ts +4 -5
  373. package/dist/theme-pack-switcher/index.js +52 -49
  374. package/dist/theme-toggle/index.d.ts +1 -1
  375. package/dist/theme-toggle/index.js +154 -167
  376. package/dist/theme.css +47 -121
  377. package/dist/toc/mobile-toc.d.ts +3 -5
  378. package/dist/toc/mobile-toc.js +29 -27
  379. package/dist/toc/toc.d.ts +3 -4
  380. package/dist/toc/toc.js +18 -18
  381. package/dist/toc/use-active-heading.d.ts +5 -4
  382. package/dist/toc/use-active-heading.js +36 -30
  383. package/dist/toc-prepaint/index.d.ts +1 -2
  384. package/dist/toc-prepaint/index.js +4 -6
  385. package/dist/transitions/nested-island-props-refresh.d.ts +3 -16
  386. package/dist/transitions/nested-island-props-refresh.js +133 -151
  387. package/dist/transitions/page-events.d.ts +8 -13
  388. package/dist/tree-nav-shared/index.d.ts +4 -5
  389. package/dist/tree-nav-shared/index.js +6 -7
  390. package/dist/use-modal-dialog/index.d.ts +9 -63
  391. package/dist/use-modal-dialog/index.js +41 -59
  392. package/dist/versions-page/index.d.ts +3 -3
  393. package/dist/versions-page/index.js +5 -5
  394. package/dist/wind/index.d.ts +5 -0
  395. package/dist/wind/index.js +169 -0
  396. package/dist/wind.json +498 -0
  397. package/dist/z-index-defaults/index.d.ts +4 -4
  398. package/dist/zdtp-loader.d.ts +7 -0
  399. package/dist/zdtp-loader.js +8 -0
  400. package/eject/asset-components/asset-card.tsx +14 -16
  401. package/eject/asset-components/asset-code.tsx +10 -12
  402. package/eject/asset-components/shared.tsx +5 -7
  403. package/eject/breadcrumb/breadcrumb.tsx +15 -16
  404. package/eject/code-group/index.tsx +4 -10
  405. package/eject/content-admonition/index.tsx +5 -6
  406. package/eject/desktop-sidebar-toggle-island/index.ts +4 -0
  407. package/eject/desktop-sidebar-toggle-island/island.tsx +50 -0
  408. package/eject/desktop-sidebar-toggle-island/storage.ts +27 -0
  409. package/eject/details/details.tsx +3 -5
  410. package/eject/doc-history/index.tsx +193 -179
  411. package/eject/doc-pager/index.tsx +3 -4
  412. package/eject/footer/footer.tsx +7 -9
  413. package/eject/header/header.tsx +42 -54
  414. package/eject/header/nav-overflow-script.ts +1 -1
  415. package/eject/header/types.ts +12 -13
  416. package/eject/image-enlarge/index.tsx +84 -69
  417. package/eject/image-enlarge/public.ts +2 -0
  418. package/eject/image-enlarge/ssr-fallback.tsx +7 -0
  419. package/eject/page-loading/page-loading-overlay.tsx +8 -15
  420. package/eject/sidebar/index.ts +1 -0
  421. package/eject/sidebar/sidebar.tsx +16 -97
  422. package/eject/sidebar/types.ts +15 -0
  423. package/eject/sidebar-toggle-island/index.tsx +103 -102
  424. package/eject/sidebar-tree-island/index.tsx +827 -615
  425. package/eject/sidebar-tree-island/scope-state.ts +154 -0
  426. package/eject/sidebar-tree-island/sidebar-scroll-preserve.ts +8 -2
  427. package/eject/site-tree-nav-island/index.tsx +349 -222
  428. package/eject/tab-item/tab-item.tsx +2 -4
  429. package/eject/theme-toggle/hydration-pending.ts +6 -10
  430. package/eject/theme-toggle/index.tsx +133 -173
  431. package/eject/toc/mobile-toc.tsx +27 -31
  432. package/eject/toc/toc.tsx +21 -24
  433. package/eject/toc/use-active-heading.ts +43 -38
  434. package/package.json +40 -22
  435. package/routes-src/404.tsx +2 -3
  436. package/routes-src/_chrome.tsx +7 -2
  437. package/routes-src/_design-token-panel-bootstrap.tsx +1 -63
  438. package/routes-src/docs-slug.tsx +2 -3
  439. package/routes-src/docs-tags-index.tsx +2 -3
  440. package/routes-src/docs-tags-tag.tsx +2 -3
  441. package/routes-src/docs-versions.tsx +2 -3
  442. package/routes-src/files-path.tsx +2 -4
  443. package/routes-src/index.tsx +2 -3
  444. package/routes-src/locale-docs-slug.tsx +2 -3
  445. package/routes-src/locale-docs-tags-index.tsx +2 -3
  446. package/routes-src/locale-docs-tags-tag.tsx +2 -3
  447. package/routes-src/locale-docs-versions.tsx +2 -3
  448. package/routes-src/locale-files-path.tsx +2 -4
  449. package/routes-src/locale-index.tsx +2 -3
  450. package/routes-src/mcp.tsx +25 -0
  451. package/routes-src/v-docs-slug.tsx +2 -3
  452. package/routes-src/v-locale-docs-slug.tsx +2 -3
  453. package/tsconfig.base.json +1 -1
  454. package/dist/safelist.css +0 -2
  455. package/dist/theme-no-reset.css +0 -379
  456. package/eject/desktop-sidebar-toggle-island/index.tsx +0 -110
@@ -1,17 +1,28 @@
1
1
  "use client";
2
- import { Fragment, jsx, jsxs } from "preact/jsx-runtime";
3
- import { useState, useEffect } from "preact/compat";
2
+ import { Fragment, jsx, jsxs } from "@takazudo/zfb/zudo-react/jsx-runtime";
3
+ import { computed, getScope, Show, signal } from "@takazudo/zfb/zudo-react";
4
4
  import { AFTER_NAVIGATE_EVENT } from "../transitions/index.js";
5
- import { useModalDialog } from "../use-modal-dialog/index.js";
5
+ import { modalDialog } from "../use-modal-dialog/index.js";
6
6
  import {
7
7
  IMAGE_ENLARGE_DIALOG_CLASS,
8
8
  ENLARGE_DIALOG_STYLE
9
9
  } from "../island-types/index.js";
10
10
  function ImageEnlarge() {
11
- const [imgData, setImgData] = useState(null);
12
- useEffect(() => {
11
+ const scope = getScope();
12
+ const imgData = signal(null);
13
+ const isOpen = computed(() => imgData.value !== null);
14
+ const imageSrc = computed(() => {
15
+ const current = imgData.value;
16
+ return current ? current.currentSrc || current.src : "";
17
+ });
18
+ const imageSrcset = computed(() => imgData.value?.srcset ?? "");
19
+ const imageHasSrcset = computed(() => Boolean(imgData.value?.srcset));
20
+ const imageAlt = computed(() => imgData.value?.alt ?? "");
21
+ scope.onActivate(() => {
22
+ let active = true;
13
23
  const observedImages = /* @__PURE__ */ new Set();
14
24
  const sharedResizeObserver = new ResizeObserver((entries) => {
25
+ if (!active) return;
15
26
  for (const entry of entries) {
16
27
  evaluateEligibility(entry.target);
17
28
  }
@@ -46,35 +57,41 @@ function ImageEnlarge() {
46
57
  }
47
58
  }
48
59
  function scanContent() {
49
- const scope = document.querySelector("main .zd-content");
50
- if (!scope) return;
51
- scope.querySelectorAll(".zd-enlargeable img").forEach(observeImage);
60
+ const content = document.querySelector("main .zd-content");
61
+ if (!content) return;
62
+ content.querySelectorAll(".zd-enlargeable img").forEach(observeImage);
52
63
  }
53
64
  function startObserving() {
54
- const scope = document.querySelector("main .zd-content");
55
- if (scope) {
65
+ const content = document.querySelector("main .zd-content");
66
+ if (content) {
56
67
  mutationObserver = new MutationObserver((mutations) => {
68
+ if (!active) return;
57
69
  for (const mutation of mutations) {
58
70
  for (const node of mutation.addedNodes) {
59
71
  if (!(node instanceof Element)) continue;
60
72
  if (node.matches(".zd-enlargeable")) {
61
73
  node.querySelectorAll("img").forEach(observeImage);
62
74
  }
75
+ if (node instanceof HTMLImageElement && node.closest(".zd-enlargeable")) {
76
+ observeImage(node);
77
+ }
63
78
  node.querySelectorAll(".zd-enlargeable img").forEach(observeImage);
64
79
  }
65
80
  }
66
81
  });
67
- mutationObserver.observe(scope, { childList: true, subtree: true });
82
+ mutationObserver.observe(content, { childList: true, subtree: true });
68
83
  }
69
84
  scanContent();
70
85
  }
71
86
  function handleWindowResize() {
72
87
  clearTimeout(resizeTimer);
73
88
  resizeTimer = window.setTimeout(() => {
89
+ if (!active) return;
74
90
  observedImages.forEach((img) => evaluateEligibility(img));
75
91
  }, 150);
76
92
  }
77
- function handleAfterSwap() {
93
+ function handleAfterNavigate() {
94
+ if (!active) return;
78
95
  sharedResizeObserver.disconnect();
79
96
  observedImages.clear();
80
97
  mutationObserver?.disconnect();
@@ -85,22 +102,25 @@ function ImageEnlarge() {
85
102
  }
86
103
  startObserving();
87
104
  window.addEventListener("resize", handleWindowResize);
88
- document.addEventListener(AFTER_NAVIGATE_EVENT, handleAfterSwap);
105
+ document.addEventListener(AFTER_NAVIGATE_EVENT, handleAfterNavigate);
89
106
  return () => {
107
+ active = false;
90
108
  sharedResizeObserver.disconnect();
91
109
  observedImages.clear();
92
110
  mutationObserver?.disconnect();
93
111
  loadAbortController.abort();
94
112
  window.removeEventListener("resize", handleWindowResize);
95
- document.removeEventListener(AFTER_NAVIGATE_EVENT, handleAfterSwap);
113
+ document.removeEventListener(AFTER_NAVIGATE_EVENT, handleAfterNavigate);
96
114
  clearTimeout(resizeTimer);
97
115
  };
98
- }, []);
99
- useEffect(() => {
100
- function handleDocumentClick(e) {
101
- const sel = window.getSelection();
102
- if (sel && !sel.isCollapsed) return;
103
- const target = e.target;
116
+ });
117
+ scope.onActivate(() => {
118
+ let active = true;
119
+ function handleDocumentClick(event) {
120
+ if (!active || !(event.target instanceof Element)) return;
121
+ const target = event.target;
122
+ const selection = window.getSelection();
123
+ if (selection && !selection.isCollapsed) return;
104
124
  const container = target.closest(".zd-enlargeable");
105
125
  if (!container) return;
106
126
  if (!target.closest(".zd-enlarge-btn") && !target.closest("img")) return;
@@ -108,7 +128,7 @@ function ImageEnlarge() {
108
128
  if (!btn || btn.hasAttribute("hidden")) return;
109
129
  const img = container.querySelector("img");
110
130
  if (!img) return;
111
- setImgData({
131
+ imgData.value = {
112
132
  src: img.src,
113
133
  currentSrc: img.currentSrc,
114
134
  srcset: img.srcset || void 0,
@@ -116,14 +136,19 @@ function ImageEnlarge() {
116
136
  alt: img.alt,
117
137
  naturalWidth: img.naturalWidth,
118
138
  naturalHeight: img.naturalHeight
119
- });
139
+ };
120
140
  }
121
141
  document.addEventListener("click", handleDocumentClick);
122
- return () => document.removeEventListener("click", handleDocumentClick);
123
- }, []);
124
- const handleClose = () => setImgData(null);
125
- const { dialogRef, handleBackdropClick } = useModalDialog({
126
- isOpen: imgData !== null,
142
+ return () => {
143
+ active = false;
144
+ document.removeEventListener("click", handleDocumentClick);
145
+ };
146
+ });
147
+ const handleClose = () => {
148
+ imgData.value = null;
149
+ };
150
+ const { dialogRef, handleBackdropClick } = modalDialog(scope, {
151
+ isOpen,
127
152
  onClose: handleClose,
128
153
  navigateEvent: AFTER_NAVIGATE_EVENT,
129
154
  backdropClickClose: true
@@ -132,45 +157,45 @@ function ImageEnlarge() {
132
157
  "dialog",
133
158
  {
134
159
  ref: dialogRef,
135
- onClick: handleBackdropClick,
136
- className: IMAGE_ENLARGE_DIALOG_CLASS,
160
+ "on:click": handleBackdropClick,
161
+ class: IMAGE_ENLARGE_DIALOG_CLASS,
137
162
  style: ENLARGE_DIALOG_STYLE,
138
- children: imgData && /* @__PURE__ */ jsxs(Fragment, { children: [
139
- /* @__PURE__ */ jsx("div", { className: "relative", children: /* @__PURE__ */ jsx(
140
- "img",
141
- {
142
- src: imgData.currentSrc || imgData.src,
143
- srcSet: imgData.srcset,
144
- sizes: imgData.srcset ? "85vw" : void 0,
145
- alt: imgData.alt,
146
- className: "block max-h-[85vh] max-w-[85vw] object-contain"
147
- }
148
- ) }),
163
+ children: /* @__PURE__ */ jsx(Show, { when: isOpen, children: () => /* @__PURE__ */ jsxs(Fragment, { children: [
164
+ /* @__PURE__ */ jsxs("div", { class: "relative", children: [
165
+ /* @__PURE__ */ jsx(Show, { when: imageHasSrcset, children: () => /* @__PURE__ */ jsx(
166
+ "img",
167
+ {
168
+ src: imageSrc,
169
+ srcset: imageSrcset,
170
+ sizes: "85vw",
171
+ alt: imageAlt,
172
+ class: "block max-h-[85vh] max-w-[85vw] object-contain"
173
+ }
174
+ ) }),
175
+ /* @__PURE__ */ jsx(Show, { when: computed(() => !imageHasSrcset.value), children: () => /* @__PURE__ */ jsx(
176
+ "img",
177
+ {
178
+ src: imageSrc,
179
+ alt: imageAlt,
180
+ class: "block max-h-[85vh] max-w-[85vw] object-contain"
181
+ }
182
+ ) })
183
+ ] }),
149
184
  /* @__PURE__ */ jsx(
150
185
  "button",
151
186
  {
152
187
  type: "button",
153
- onClick: () => dialogRef.current?.close(),
154
- className: "zd-enlarge-dialog-close",
188
+ "on:click": () => dialogRef.current?.close(),
189
+ class: "zd-enlarge-dialog-close",
155
190
  "aria-label": "Close enlarged image",
156
- children: /* @__PURE__ */ jsx("svg", { viewBox: "0 0 161.03 161.03", fill: "currentColor", "aria-hidden": "true", focusable: "false", children: /* @__PURE__ */ jsx("polygon", { points: "161.03 10.27 150.76 0 80.51 70.24 10.27 0 0 10.27 70.24 80.51 0 150.76 10.27 161.03 80.51 90.78 150.76 161.03 161.03 150.76 90.78 80.51 161.03 10.27" }) })
191
+ children: /* @__PURE__ */ jsx("svg", { viewBox: "0 0 161.03 161.03", fill: "currentColor", "aria-hidden": "true", children: /* @__PURE__ */ jsx("polygon", { points: "161.03 10.27 150.76 0 80.51 70.24 10.27 0 0 10.27 70.24 80.51 0 150.76 10.27 161.03 80.51 90.78 150.76 161.03 161.03 150.76 90.78 80.51 161.03 10.27" }) })
157
192
  }
158
193
  )
159
- ] })
194
+ ] }) })
160
195
  }
161
196
  );
162
197
  }
163
198
  ImageEnlarge.displayName = "ImageEnlarge";
164
- function ImageEnlargeSsrFallback() {
165
- return /* @__PURE__ */ jsx(
166
- "dialog",
167
- {
168
- className: IMAGE_ENLARGE_DIALOG_CLASS,
169
- style: ENLARGE_DIALOG_STYLE
170
- }
171
- );
172
- }
173
199
  export {
174
- ImageEnlarge,
175
- ImageEnlargeSsrFallback
200
+ ImageEnlarge
176
201
  };
@@ -0,0 +1,2 @@
1
+ export { ImageEnlarge } from "./index.js";
2
+ export { ImageEnlargeSsrFallback } from "./ssr-fallback.js";
@@ -0,0 +1,6 @@
1
+ import { ImageEnlarge } from "./index.js";
2
+ import { ImageEnlargeSsrFallback } from "./ssr-fallback.js";
3
+ export {
4
+ ImageEnlarge,
5
+ ImageEnlargeSsrFallback
6
+ };
@@ -0,0 +1,2 @@
1
+ /** Closed dialog shell rendered before island activation. */
2
+ export declare function ImageEnlargeSsrFallback(): import("@takazudo/zfb").Description;
@@ -0,0 +1,8 @@
1
+ import { jsx } from "@takazudo/zfb/zudo-react/jsx-runtime";
2
+ import { IMAGE_ENLARGE_DIALOG_CLASS, ENLARGE_DIALOG_STYLE } from "../island-types/index.js";
3
+ function ImageEnlargeSsrFallback() {
4
+ return /* @__PURE__ */ jsx("dialog", { class: IMAGE_ENLARGE_DIALOG_CLASS, style: ENLARGE_DIALOG_STYLE });
5
+ }
6
+ export {
7
+ ImageEnlargeSsrFallback
8
+ };
package/dist/index.d.ts CHANGED
@@ -1,9 +1,9 @@
1
1
  /**
2
2
  * @takazudo/zudo-doc — framework primitives that sit on top of zfb's engine.
3
3
  *
4
- * **Use the subpath exports for actual imports.** This root barrel deliberately
5
- * stays empty so consumers don't drag in the entire framework when they only
6
- * need one piece. Each topic area publishes its own subpath (declared in
4
+ * **Use the subpath exports for runtime imports.** This root barrel exposes
5
+ * shared public types only, so consumers do not drag in runtime code when they
6
+ * need type contracts. Each topic area publishes its own subpath (declared in
7
7
  * `package.json#exports`):
8
8
  *
9
9
  * import { buildSidebarTree, type SidebarNode } from "@takazudo/zudo-doc/sidebar-tree";
@@ -23,4 +23,11 @@
23
23
  *
24
24
  * See packages/zudo-doc/README.md for the topic map.
25
25
  */
26
- export {};
26
+ export type { ChromeContext, ChromeHostBindings, FactoryComponent, FactoryComponents, FactoryContext, FactoryI18n, NavSource, RouteContext, RouteContextPayload, RouteHrefBuilder, TagInfo, } from "./factory-context/index.js";
27
+ export type { BodyEndIslandsSlotProps, BreadcrumbSlotProps, ChromeBindingsInput, DesignTokenPanelBootstrapSlotProps, DocHistorySlotProps, DocPagerSlotProps, FooterSlotProps, FooterTagEntry, FrontmatterRendererSlotProps, HeaderSlotProps, SearchWidgetSlotProps, SidebarSlotProps, TocSlotProps, } from "./chrome-bindings.js";
28
+ export type { HeaderNavChildItem, HeaderNavItem, HeaderRightBuiltinComponentName, HeaderRightComponentItem, HeaderRightComponentName, HeaderRightComponentProps, HeaderRightComponentRegistry, HeaderRightHtmlItem, HeaderRightItem, HeaderRightLinkItem, HeaderRightTriggerItem, HeaderRightTriggerName, Locale, } from "./header/types.js";
29
+ export type { HeaderRightItemFlags } from "./header/right-items.js";
30
+ export type { FrontmatterCellRenderer, FrontmatterCellRendererProps, } from "./metainfo/frontmatter-preview.js";
31
+ export type { ThemePackDialogComponent, ThemePackDialogProps, } from "./theme-pack-switcher/index.js";
32
+ export type { ModalDialogOptions, ModalDialogResult } from "./use-modal-dialog/index.js";
33
+ export type { ChatMessage, DocHistoryData, DocHistoryEntry, EnlargeDialogProps, } from "./island-types/index.js";
@@ -1,6 +1,5 @@
1
1
  /** @jsxRuntime automatic */
2
- /** @jsxImportSource preact */
3
- import type { JSX } from "preact";
2
+ import type { JSX } from "@takazudo/zfb/zudo-react/jsx-runtime";
4
3
  /** Minimal version config entry needed by the inline version switcher. */
5
4
  export interface InlineVersionSwitcherVersionEntry {
6
5
  slug: string;
@@ -1,4 +1,4 @@
1
- import { jsx } from "preact/jsx-runtime";
1
+ import { jsx } from "@takazudo/zfb/zudo-react/jsx-runtime";
2
2
  import {
3
3
  VersionSwitcher
4
4
  } from "../i18n-version/index.js";
@@ -28,7 +28,7 @@ export interface DocHistoryData {
28
28
  /** Shared inline style centering an enlarge `<dialog>` transform-free. */
29
29
  export declare const ENLARGE_DIALOG_STYLE: {
30
30
  readonly position: "fixed";
31
- readonly inset: "0";
31
+ readonly inset: 0;
32
32
  readonly margin: "auto";
33
33
  };
34
34
  /** Class string for the image-enlarge `<dialog>` (hydrated + SSR fallback). */
@@ -38,7 +38,7 @@ export declare const MERMAID_ENLARGE_DIALOG_CLASS = "zd-mermaid-dialog z-modal m
38
38
  /** Shared shape an enlarge `<dialog>` is rendered with. */
39
39
  export interface EnlargeDialogProps {
40
40
  /** Tailwind class string for the `<dialog>`. */
41
- className: string;
41
+ class: string;
42
42
  /** Inline style centering the dialog transform-free. */
43
43
  style: typeof ENLARGE_DIALOG_STYLE;
44
44
  }
@@ -1,8 +1,4 @@
1
- const ENLARGE_DIALOG_STYLE = {
2
- position: "fixed",
3
- inset: "0",
4
- margin: "auto"
5
- };
1
+ const ENLARGE_DIALOG_STYLE = { position: "fixed", inset: 0, margin: "auto" };
6
2
  const IMAGE_ENLARGE_DIALOG_CLASS = "zd-enlarge-dialog z-modal mx-auto max-h-[90vh] max-w-[90vw] overflow-hidden border border-muted bg-surface p-0 backdrop:z-modal-backdrop";
7
3
  const MERMAID_ENLARGE_DIALOG_CLASS = "zd-mermaid-dialog z-modal mx-auto h-[90vh] max-h-[90vh] w-[90vw] max-w-[90vw] overflow-hidden border border-muted bg-surface p-0 backdrop:z-modal-backdrop";
8
4
  export {
@@ -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
  export interface MathBlockProps {
5
4
  /** Raw LaTeX source string. */
6
5
  latex: string;
@@ -10,9 +9,7 @@ export interface MathBlockProps {
10
9
  /**
11
10
  * Server-rendered KaTeX math component.
12
11
  *
13
- * Block mode wraps the output in `<div class="math math-display">`;
14
- * inline mode uses `<span class="math math-inline">`. The class names
15
- * match the standard rehype-katex output so existing CSS (e.g. the
16
- * KaTeX stylesheet) still applies.
12
+ * Block mode wraps the output in `<div data-math="display">`; inline mode
13
+ * uses `<span data-math="inline">`. KaTeX owns the styled inner classes.
17
14
  */
18
- export declare function MathBlock({ latex, block }: MathBlockProps): VNode;
15
+ export declare function MathBlock({ latex, block }: MathBlockProps): Child;
@@ -1,4 +1,4 @@
1
- import { jsx } from "preact/jsx-runtime";
1
+ import { jsx } from "@takazudo/zfb/zudo-react/jsx-runtime";
2
2
  function pickKatex(m) {
3
3
  let cur = m;
4
4
  for (let i = 0; i < 3 && cur && typeof cur === "object"; i++) {
@@ -21,16 +21,16 @@ function MathBlock({ latex, block = false }) {
21
21
  return /* @__PURE__ */ jsx(
22
22
  "div",
23
23
  {
24
- class: "math math-display",
25
- dangerouslySetInnerHTML: { __html: html }
24
+ "data-math": "display",
25
+ rawHtml: html
26
26
  }
27
27
  );
28
28
  }
29
29
  return /* @__PURE__ */ jsx(
30
30
  "span",
31
31
  {
32
- class: "math math-inline",
33
- dangerouslySetInnerHTML: { __html: html }
32
+ "data-math": "inline",
33
+ rawHtml: html
34
34
  }
35
35
  );
36
36
  }
@@ -0,0 +1,8 @@
1
+ import { type ReadAsset } from "./loader.js";
2
+ export interface McpHandlerOptions {
3
+ read: ReadAsset;
4
+ base: string;
5
+ siteUrl?: string;
6
+ }
7
+ /** A deployment-scoped loader is safe to reuse; every operation re-reads the current manifest. */
8
+ export declare function createMcpHandler(options: McpHandlerOptions): (request: Request) => Promise<Response>;
@@ -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
+ }