@takazudo/zudo-doc 5.28.2 → 6.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (511) hide show
  1. package/CHANGELOG.md +33 -0
  2. package/README.md +49 -16
  3. package/bin/gen-z-index.mjs +18 -18
  4. package/dist/agent-docs/identity.d.ts +4 -0
  5. package/dist/agent-docs/identity.js +24 -0
  6. package/dist/agent-docs/index.d.ts +5 -0
  7. package/dist/agent-docs/index.js +5 -0
  8. package/dist/agent-docs/limits.d.ts +11 -0
  9. package/dist/agent-docs/limits.js +24 -0
  10. package/dist/agent-docs/search.d.ts +14 -0
  11. package/dist/agent-docs/search.js +82 -0
  12. package/dist/agent-docs/tokenize.d.ts +2 -0
  13. package/dist/agent-docs/tokenize.js +22 -0
  14. package/dist/agent-docs/types.d.ts +68 -0
  15. package/dist/agent-docs/types.js +0 -0
  16. package/dist/ai-chat-modal/index.d.ts +1 -4
  17. package/dist/ai-chat-modal/index.js +183 -123
  18. package/dist/asset-components/asset-card.d.ts +1 -2
  19. package/dist/asset-components/asset-card.js +12 -12
  20. package/dist/asset-components/asset-code.d.ts +1 -2
  21. package/dist/asset-components/asset-code.js +10 -10
  22. package/dist/asset-components/shared.d.ts +3 -4
  23. package/dist/asset-components/shared.js +4 -4
  24. package/dist/asset-index-page/body.d.ts +5 -6
  25. package/dist/asset-index-page/body.js +6 -6
  26. package/dist/asset-index-page/index.d.ts +1 -2
  27. package/dist/asset-index-page/index.js +1 -1
  28. package/dist/asset-page/body.d.ts +5 -9
  29. package/dist/asset-page/body.js +3 -3
  30. package/dist/asset-page/components.d.ts +16 -17
  31. package/dist/asset-page/components.js +10 -9
  32. package/dist/asset-page/index.d.ts +1 -2
  33. package/dist/asset-page/index.js +1 -1
  34. package/dist/auto-logo/index.d.ts +1 -2
  35. package/dist/auto-logo/index.js +2 -2
  36. package/dist/body-foot-util/body-foot-util-area.d.ts +3 -4
  37. package/dist/body-foot-util/body-foot-util-area.js +1 -2
  38. package/dist/body-foot-util/edit-link.d.ts +2 -3
  39. package/dist/body-foot-util/edit-link.js +1 -2
  40. package/dist/breadcrumb/breadcrumb.d.ts +6 -6
  41. package/dist/breadcrumb/breadcrumb.js +3 -4
  42. package/dist/catalog.js +1 -1
  43. package/dist/category-nav/index.d.ts +1 -2
  44. package/dist/category-nav/index.js +11 -5
  45. package/dist/category-tree-nav/index.d.ts +1 -2
  46. package/dist/category-tree-nav/index.js +3 -3
  47. package/dist/chrome/derive.d.ts +18 -27
  48. package/dist/chrome/derive.js +47 -29
  49. package/dist/chrome/index.d.ts +5 -5
  50. package/dist/chrome/index.js +1 -1
  51. package/dist/chrome/island-data.d.ts +4 -0
  52. package/dist/chrome/island-data.js +52 -0
  53. package/dist/chrome/primary-slots.d.ts +2 -3
  54. package/dist/chrome-bindings.d.ts +30 -22
  55. package/dist/code-group/index.d.ts +3 -4
  56. package/dist/code-group/index.js +3 -7
  57. package/dist/code-syntax/code-block-enhancer.d.ts +1 -2
  58. package/dist/code-syntax/code-block-enhancer.js +2 -2
  59. package/dist/code-syntax/mermaid-init.d.ts +1 -2
  60. package/dist/code-syntax/mermaid-init.js +5 -2
  61. package/dist/code-syntax/tabs-init-script.js +1 -1
  62. package/dist/code-syntax/tabs-init.d.ts +1 -2
  63. package/dist/code-syntax/tabs-init.js +2 -2
  64. package/dist/code-syntax/tabs.d.ts +6 -6
  65. package/dist/code-syntax/tabs.js +8 -8
  66. package/dist/compiled.css +2937 -2942
  67. package/dist/config/component-tokens.d.ts +1 -1
  68. package/dist/config/component-tokens.js +22 -0
  69. package/dist/config-assertions/index.d.ts +13 -0
  70. package/dist/config-assertions/index.js +14 -0
  71. package/dist/config.d.ts +36 -17
  72. package/dist/config.js +23 -95
  73. package/dist/content/content-blockquote.d.ts +2 -3
  74. package/dist/content/content-blockquote.js +3 -3
  75. package/dist/content/content-code.d.ts +3 -4
  76. package/dist/content/content-code.js +5 -5
  77. package/dist/content/content-link.d.ts +3 -4
  78. package/dist/content/content-link.js +10 -10
  79. package/dist/content/content-ol.d.ts +2 -3
  80. package/dist/content/content-ol.js +5 -4
  81. package/dist/content/content-paragraph.d.ts +2 -3
  82. package/dist/content/content-paragraph.js +1 -1
  83. package/dist/content/content-strong.d.ts +2 -3
  84. package/dist/content/content-strong.js +3 -3
  85. package/dist/content/content-table.d.ts +2 -3
  86. package/dist/content/content-table.js +4 -4
  87. package/dist/content/content-ul.d.ts +2 -3
  88. package/dist/content/content-ul.js +4 -4
  89. package/dist/content/heading-h2.d.ts +2 -3
  90. package/dist/content/heading-h2.js +4 -4
  91. package/dist/content/heading-h3.d.ts +2 -3
  92. package/dist/content/heading-h3.js +4 -4
  93. package/dist/content/heading-h4.d.ts +2 -3
  94. package/dist/content/heading-h4.js +4 -4
  95. package/dist/content-admonition/index.d.ts +3 -4
  96. package/dist/content-admonition/index.js +2 -2
  97. package/dist/content.css +35 -33
  98. package/dist/design-token-panel-bootstrap-controller.d.ts +178 -0
  99. package/dist/design-token-panel-bootstrap-controller.js +359 -0
  100. package/dist/design-token-panel-bootstrap-island.d.ts +5 -0
  101. package/dist/design-token-panel-bootstrap-island.js +19 -0
  102. package/dist/design-token-panel-bootstrap.d.ts +5 -195
  103. package/dist/design-token-panel-bootstrap.js +3 -288
  104. package/dist/desktop-sidebar-toggle-island/index.d.ts +2 -7
  105. package/dist/desktop-sidebar-toggle-island/index.js +2 -58
  106. package/dist/desktop-sidebar-toggle-island/island.d.ts +4 -0
  107. package/dist/desktop-sidebar-toggle-island/island.js +43 -0
  108. package/dist/desktop-sidebar-toggle-island/storage.d.ts +4 -0
  109. package/dist/desktop-sidebar-toggle-island/storage.js +29 -0
  110. package/dist/desktop-toc-toggle-island/index.d.ts +2 -7
  111. package/dist/desktop-toc-toggle-island/index.js +2 -58
  112. package/dist/desktop-toc-toggle-island/island.d.ts +4 -0
  113. package/dist/desktop-toc-toggle-island/island.js +43 -0
  114. package/dist/desktop-toc-toggle-island/storage.d.ts +4 -0
  115. package/dist/desktop-toc-toggle-island/storage.js +29 -0
  116. package/dist/details/details.d.ts +3 -4
  117. package/dist/details/details.js +1 -1
  118. package/dist/doc-body-end/index.d.ts +1 -2
  119. package/dist/doc-body-end/index.js +1 -1
  120. package/dist/doc-body-end-islands/design-token-panel-island.d.ts +2 -2
  121. package/dist/doc-body-end-islands/design-token-panel-island.js +3 -7
  122. package/dist/doc-body-end-islands/index.d.ts +4 -21
  123. package/dist/doc-body-end-islands/index.js +5 -3
  124. package/dist/doc-body-end-islands/theme-pack-switcher-island.d.ts +3 -13
  125. package/dist/doc-body-end-islands/theme-pack-switcher-island.js +11 -13
  126. package/dist/doc-content-header/index.d.ts +1 -2
  127. package/dist/doc-content-header/index.js +1 -1
  128. package/dist/doc-history/index.d.ts +1 -1
  129. package/dist/doc-history/index.js +166 -141
  130. package/dist/doc-history-area/index.d.ts +6 -4
  131. package/dist/doc-history-area/index.js +17 -16
  132. package/dist/doc-metainfo-area/index.d.ts +2 -3
  133. package/dist/doc-metainfo-area/index.js +1 -1
  134. package/dist/doc-page-renderer/index.d.ts +13 -7
  135. package/dist/doc-page-renderer/index.js +10 -1
  136. package/dist/doc-page-shell/index.d.ts +20 -7
  137. package/dist/doc-page-shell/index.js +17 -6
  138. package/dist/doc-pager/index.d.ts +1 -2
  139. package/dist/doc-pager/index.js +3 -3
  140. package/dist/doc-tags-area/index.d.ts +2 -3
  141. package/dist/doc-tags-area/index.js +1 -1
  142. package/dist/doclayout/doc-layout-with-defaults.d.ts +9 -9
  143. package/dist/doclayout/doc-layout-with-defaults.js +5 -15
  144. package/dist/doclayout/doc-layout.d.ts +26 -27
  145. package/dist/doclayout/doc-layout.js +23 -14
  146. package/dist/docs-schema/index.d.ts +4 -0
  147. package/dist/docs-schema/index.js +1 -0
  148. package/dist/extract-headings/index.js +43 -12
  149. package/dist/factory-context/index.d.ts +22 -19
  150. package/dist/features.css +75 -8
  151. package/dist/find-in-page/find-bar.d.ts +4 -2
  152. package/dist/find-in-page/find-bar.js +58 -69
  153. package/dist/find-in-page/index.d.ts +2 -8
  154. package/dist/find-in-page/index.js +33 -30
  155. package/dist/footer/footer.d.ts +3 -4
  156. package/dist/footer/footer.js +3 -3
  157. package/dist/footer-with-defaults/index.d.ts +2 -3
  158. package/dist/footer-with-defaults/index.js +1 -1
  159. package/dist/frontmatter-preview-defaults/index.js +1 -0
  160. package/dist/head/doc-head.d.ts +1 -1
  161. package/dist/head/doc-head.js +24 -32
  162. package/dist/head/og-tags.d.ts +1 -1
  163. package/dist/head/og-tags.js +8 -7
  164. package/dist/head/twitter-card.d.ts +1 -1
  165. package/dist/head/twitter-card.js +1 -1
  166. package/dist/head-with-defaults/index.d.ts +7 -2
  167. package/dist/head-with-defaults/index.js +46 -32
  168. package/dist/header/header.d.ts +8 -8
  169. package/dist/header/header.js +9 -11
  170. package/dist/header/types.d.ts +7 -7
  171. package/dist/header-with-defaults/index.d.ts +3 -4
  172. package/dist/header-with-defaults/index.js +27 -14
  173. package/dist/home-intro/index.d.ts +2 -5
  174. package/dist/home-intro/index.js +7 -5
  175. package/dist/home-intro/prepare.js +4 -3
  176. package/dist/home-page/index.d.ts +3 -3
  177. package/dist/home-page/index.js +19 -17
  178. package/dist/html-preview-wrapper/highlighted-code.d.ts +3 -4
  179. package/dist/html-preview-wrapper/highlighted-code.js +19 -17
  180. package/dist/html-preview-wrapper/html-preview-wrapper.d.ts +4 -25
  181. package/dist/html-preview-wrapper/html-preview-wrapper.js +2 -87
  182. package/dist/html-preview-wrapper/html-preview.d.ts +3 -10
  183. package/dist/html-preview-wrapper/html-preview.js +13 -37
  184. package/dist/html-preview-wrapper/index.d.ts +2 -1
  185. package/dist/html-preview-wrapper/index.js +1 -1
  186. package/dist/html-preview-wrapper/preview-base.d.ts +3 -5
  187. package/dist/html-preview-wrapper/preview-base.js +56 -59
  188. package/dist/html-preview-wrapper/wrapper.d.ts +20 -0
  189. package/dist/html-preview-wrapper/wrapper.js +37 -0
  190. package/dist/hydration-pending.d.ts +3 -5
  191. package/dist/hydration-pending.js +7 -5
  192. package/dist/i18n-version/language-switcher.d.ts +5 -32
  193. package/dist/i18n-version/language-switcher.js +5 -106
  194. package/dist/i18n-version/switcher-generated-scripts.d.ts +2 -0
  195. package/dist/i18n-version/switcher-generated-scripts.js +107 -0
  196. package/dist/i18n-version/switcher-url-state.d.ts +76 -0
  197. package/dist/i18n-version/switcher-url-state.js +103 -0
  198. package/dist/i18n-version/version-banner.d.ts +2 -3
  199. package/dist/i18n-version/version-banner.js +1 -1
  200. package/dist/i18n-version/version-switcher.d.ts +5 -50
  201. package/dist/i18n-version/version-switcher.js +5 -157
  202. package/dist/icons/index.d.ts +18 -19
  203. package/dist/icons/index.js +17 -33
  204. package/dist/image-enlarge/index.d.ts +1 -10
  205. package/dist/image-enlarge/index.js +80 -55
  206. package/dist/image-enlarge/public.d.ts +2 -0
  207. package/dist/image-enlarge/public.js +6 -0
  208. package/dist/image-enlarge/ssr-fallback.d.ts +2 -0
  209. package/dist/image-enlarge/ssr-fallback.js +8 -0
  210. package/dist/index.d.ts +11 -4
  211. package/dist/inline-version-switcher/index.d.ts +1 -2
  212. package/dist/inline-version-switcher/index.js +1 -1
  213. package/dist/island-types/index.d.ts +2 -2
  214. package/dist/island-types/index.js +1 -5
  215. package/dist/math-block/index.d.ts +4 -7
  216. package/dist/math-block/index.js +5 -5
  217. package/dist/mcp/handler.d.ts +8 -0
  218. package/dist/mcp/handler.js +129 -0
  219. package/dist/mcp/index.d.ts +4 -0
  220. package/dist/mcp/index.js +7 -0
  221. package/dist/mcp/loader.d.ts +19 -0
  222. package/dist/mcp/loader.js +202 -0
  223. package/dist/mdx-components/index.js +40 -108
  224. package/dist/mermaid-enlarge/index.d.ts +1 -8
  225. package/dist/mermaid-enlarge/index.js +174 -158
  226. package/dist/mermaid-enlarge/public.d.ts +2 -0
  227. package/dist/mermaid-enlarge/public.js +6 -0
  228. package/dist/mermaid-enlarge/ssr-fallback.d.ts +2 -0
  229. package/dist/mermaid-enlarge/ssr-fallback.js +8 -0
  230. package/dist/metainfo/doc-metainfo.d.ts +2 -3
  231. package/dist/metainfo/doc-metainfo.js +1 -4
  232. package/dist/metainfo/doc-tags.d.ts +2 -3
  233. package/dist/metainfo/doc-tags.js +1 -1
  234. package/dist/metainfo/frontmatter-preview.d.ts +3 -4
  235. package/dist/metainfo/frontmatter-preview.js +1 -1
  236. package/dist/nav-data-prep/index.js +6 -4
  237. package/dist/nav-indexing/category-nav.d.ts +2 -3
  238. package/dist/nav-indexing/category-nav.js +1 -2
  239. package/dist/nav-indexing/category-tree-nav.d.ts +2 -3
  240. package/dist/nav-indexing/category-tree-nav.js +1 -1
  241. package/dist/nav-indexing/doc-card-grid.d.ts +2 -3
  242. package/dist/nav-indexing/doc-card-grid.js +1 -2
  243. package/dist/nav-indexing/docs-sitemap.d.ts +2 -3
  244. package/dist/nav-indexing/docs-sitemap.js +2 -2
  245. package/dist/nav-indexing/index.d.ts +1 -1
  246. package/dist/nav-indexing/nav-card-grid.d.ts +2 -3
  247. package/dist/nav-indexing/nav-card-grid.js +1 -2
  248. package/dist/nav-indexing/note-tray-index-parts/card-list.d.ts +1 -2
  249. package/dist/nav-indexing/note-tray-index-parts/card-list.js +4 -4
  250. package/dist/nav-indexing/note-tray-index-parts/date-line.d.ts +2 -3
  251. package/dist/nav-indexing/note-tray-index-parts/date-line.js +1 -1
  252. package/dist/nav-indexing/note-tray-index-parts/index-list.d.ts +1 -2
  253. package/dist/nav-indexing/note-tray-index-parts/index-list.js +2 -2
  254. package/dist/nav-indexing/note-tray-index-parts/timeline.d.ts +1 -2
  255. package/dist/nav-indexing/note-tray-index-parts/timeline.js +2 -2
  256. package/dist/nav-indexing/note-tray-index.d.ts +1 -2
  257. package/dist/nav-indexing/note-tray-index.js +1 -1
  258. package/dist/nav-indexing/site-tree-nav-demo.d.ts +2 -3
  259. package/dist/nav-indexing/site-tree-nav-demo.js +2 -2
  260. package/dist/nav-indexing/tag-nav.d.ts +1 -2
  261. package/dist/nav-indexing/tag-nav.js +1 -1
  262. package/dist/nav-indexing/types.d.ts +2 -2
  263. package/dist/nav-indexing/versions-page-content.d.ts +2 -3
  264. package/dist/nav-indexing/versions-page-content.js +8 -8
  265. package/dist/note-tray-index/index.d.ts +1 -2
  266. package/dist/note-tray-index/index.js +1 -1
  267. package/dist/page-loading/page-loading-overlay.d.ts +1 -2
  268. package/dist/page-loading/page-loading-overlay.js +3 -5
  269. package/dist/plugins/agent-export.d.ts +3 -0
  270. package/dist/plugins/agent-export.js +34 -0
  271. package/dist/plugins/internal/agent-export/chunk.d.ts +5 -0
  272. package/dist/plugins/internal/agent-export/chunk.js +90 -0
  273. package/dist/plugins/internal/agent-export/index.d.ts +24 -0
  274. package/dist/plugins/internal/agent-export/index.js +123 -0
  275. package/dist/plugins/internal/agent-export/normalize.d.ts +5 -0
  276. package/dist/plugins/internal/agent-export/normalize.js +73 -0
  277. package/dist/plugins/internal/llms-txt/dev-middleware.d.ts +6 -0
  278. package/dist/plugins/internal/llms-txt/dev-middleware.js +8 -3
  279. package/dist/plugins/internal/llms-txt/emit.js +23 -6
  280. package/dist/plugins/internal/llms-txt/generate.d.ts +7 -1
  281. package/dist/plugins/internal/llms-txt/generate.js +9 -2
  282. package/dist/plugins/internal/llms-txt/load.d.ts +2 -0
  283. package/dist/plugins/internal/llms-txt/load.js +20 -4
  284. package/dist/plugins/internal/llms-txt/types.d.ts +10 -0
  285. package/dist/plugins/routes.js +4 -0
  286. package/dist/preset.d.ts +19 -9
  287. package/dist/preset.js +20 -1
  288. package/dist/route-context-payload/index.js +1 -1
  289. package/dist/routes/404.d.ts +2 -3
  290. package/dist/routes/404.js +1 -1
  291. package/dist/routes/_chrome.d.ts +5 -5
  292. package/dist/routes/_chrome.js +7 -2
  293. package/dist/routes/_context.d.ts +4 -4
  294. package/dist/routes/_design-token-panel-bootstrap.d.ts +1 -4
  295. package/dist/routes/_design-token-panel-bootstrap.js +9 -1
  296. package/dist/routes/docs-slug.d.ts +2 -3
  297. package/dist/routes/docs-tags-index.d.ts +2 -3
  298. package/dist/routes/docs-tags-index.js +1 -1
  299. package/dist/routes/docs-tags-tag.d.ts +2 -3
  300. package/dist/routes/docs-tags-tag.js +1 -1
  301. package/dist/routes/docs-versions.d.ts +2 -3
  302. package/dist/routes/docs-versions.js +1 -1
  303. package/dist/routes/files-path.d.ts +2 -3
  304. package/dist/routes/files-path.js +1 -1
  305. package/dist/routes/index.d.ts +2 -3
  306. package/dist/routes/index.js +1 -1
  307. package/dist/routes/locale-docs-slug.d.ts +2 -3
  308. package/dist/routes/locale-docs-tags-index.d.ts +2 -3
  309. package/dist/routes/locale-docs-tags-index.js +1 -1
  310. package/dist/routes/locale-docs-tags-tag.d.ts +2 -3
  311. package/dist/routes/locale-docs-tags-tag.js +1 -1
  312. package/dist/routes/locale-docs-versions.d.ts +2 -3
  313. package/dist/routes/locale-docs-versions.js +1 -1
  314. package/dist/routes/locale-files-path.d.ts +2 -3
  315. package/dist/routes/locale-files-path.js +1 -1
  316. package/dist/routes/locale-index.d.ts +2 -3
  317. package/dist/routes/locale-index.js +1 -1
  318. package/dist/routes/mcp.d.ts +5 -0
  319. package/dist/routes/mcp.js +25 -0
  320. package/dist/routes/v-docs-slug.d.ts +2 -3
  321. package/dist/routes/v-locale-docs-slug.d.ts +2 -3
  322. package/dist/search-widget/index.d.ts +1 -2
  323. package/dist/search-widget/index.js +4 -7
  324. package/dist/search-widget-script/generated-script.js +12 -5
  325. package/dist/settings-defaults.d.ts +2 -0
  326. package/dist/settings-defaults.js +93 -0
  327. package/dist/settings.d.ts +8 -2
  328. package/dist/sidebar/client-data.d.ts +18 -0
  329. package/dist/sidebar/client-data.js +47 -0
  330. package/dist/sidebar/index.d.ts +3 -1
  331. package/dist/sidebar/index.js +3 -1
  332. package/dist/sidebar/sidebar.d.ts +12 -44
  333. package/dist/sidebar/sidebar.js +4 -3
  334. package/dist/sidebar/types.d.ts +14 -0
  335. package/dist/sidebar-prepaint/index.d.ts +1 -2
  336. package/dist/sidebar-prepaint/index.js +4 -6
  337. package/dist/sidebar-resizer/sidebar-resizer-init.d.ts +2 -3
  338. package/dist/sidebar-resizer/sidebar-resizer-init.js +3 -3
  339. package/dist/sidebar-toggle-island/index.d.ts +8 -11
  340. package/dist/sidebar-toggle-island/index.js +75 -62
  341. package/dist/sidebar-tree/build-tree.js +5 -6
  342. package/dist/sidebar-tree/types.d.ts +2 -0
  343. package/dist/sidebar-tree-island/index.d.ts +4 -19
  344. package/dist/sidebar-tree-island/index.js +782 -436
  345. package/dist/sidebar-tree-island/scope-state.d.ts +38 -0
  346. package/dist/sidebar-tree-island/scope-state.js +151 -0
  347. package/dist/sidebar-tree-island/sidebar-scroll-preserve.js +6 -2
  348. package/dist/sidebar-utils/index.d.ts +17 -19
  349. package/dist/sidebar-utils/index.js +100 -3
  350. package/dist/sidebar-utils/scope.d.ts +11 -0
  351. package/dist/sidebar-utils/scope.js +67 -0
  352. package/dist/sidebar-with-defaults/index.d.ts +1 -2
  353. package/dist/sidebar-with-defaults/index.js +19 -18
  354. package/dist/site-schema/nav-tree.js +15 -15
  355. package/dist/site-schema/types.d.ts +1 -0
  356. package/dist/site-tree-nav/index.d.ts +2 -3
  357. package/dist/site-tree-nav/index.js +11 -12
  358. package/dist/site-tree-nav/normalize-island-props.d.ts +16 -0
  359. package/dist/site-tree-nav/normalize-island-props.js +122 -0
  360. package/dist/site-tree-nav-island/index.d.ts +3 -3
  361. package/dist/site-tree-nav-island/index.js +243 -144
  362. package/dist/smart-break/index.d.ts +3 -4
  363. package/dist/smart-break/index.js +1 -1
  364. package/dist/tab-item/tab-item.d.ts +3 -4
  365. package/dist/tab-item/tab-item.js +1 -1
  366. package/dist/tag-pages/index.d.ts +3 -3
  367. package/dist/tag-pages/index.js +10 -10
  368. package/dist/theme/color-scheme-provider.d.ts +3 -3
  369. package/dist/theme/color-scheme-provider.js +3 -3
  370. package/dist/theme/theme-pack-provider.d.ts +1 -1
  371. package/dist/theme/theme-pack-provider.js +3 -3
  372. package/dist/theme/theme-toggle.d.ts +2 -3
  373. package/dist/theme/theme-toggle.js +1 -1
  374. package/dist/theme-pack-dialog/index.d.ts +1 -1
  375. package/dist/theme-pack-dialog/index.js +69 -75
  376. package/dist/theme-pack-dialog/theme-pack-card.d.ts +3 -4
  377. package/dist/theme-pack-dialog/theme-pack-card.js +19 -17
  378. package/dist/theme-pack-switcher/index.d.ts +4 -5
  379. package/dist/theme-pack-switcher/index.js +52 -49
  380. package/dist/theme-packs/academia/meta.json +1 -1
  381. package/dist/theme-packs/academia/pack.css +1 -1
  382. package/dist/theme-packs/bauhaus/meta.json +1 -1
  383. package/dist/theme-packs/bauhaus/pack.css +2 -2
  384. package/dist/theme-packs/blueprint/meta.json +1 -1
  385. package/dist/theme-packs/blueprint/pack.css +2 -2
  386. package/dist/theme-packs/botanica/meta.json +1 -1
  387. package/dist/theme-packs/botanica/pack.css +2 -2
  388. package/dist/theme-packs/broadsheet/meta.json +1 -1
  389. package/dist/theme-packs/broadsheet/pack.css +2 -2
  390. package/dist/theme-packs/brutalist/meta.json +1 -1
  391. package/dist/theme-packs/brutalist/pack.css +2 -2
  392. package/dist/theme-packs/eink/meta.json +1 -1
  393. package/dist/theme-packs/eink/pack.css +1 -1
  394. package/dist/theme-packs/futura-editorial/meta.json +1 -1
  395. package/dist/theme-packs/futura-editorial/pack.css +2 -2
  396. package/dist/theme-packs/hearth/meta.json +1 -1
  397. package/dist/theme-packs/hearth/pack.css +2 -2
  398. package/dist/theme-packs/ledger/meta.json +1 -1
  399. package/dist/theme-packs/ledger/pack.css +1 -1
  400. package/dist/theme-packs/manuscript/meta.json +1 -1
  401. package/dist/theme-packs/manuscript/pack.css +1 -1
  402. package/dist/theme-packs/matcha/meta.json +1 -1
  403. package/dist/theme-packs/matcha/pack.css +2 -2
  404. package/dist/theme-packs/nocturne/meta.json +1 -1
  405. package/dist/theme-packs/nocturne/pack.css +2 -2
  406. package/dist/theme-packs/observatory/meta.json +1 -1
  407. package/dist/theme-packs/observatory/pack.css +2 -2
  408. package/dist/theme-packs/onyx/meta.json +1 -1
  409. package/dist/theme-packs/onyx/pack.css +2 -2
  410. package/dist/theme-packs/phosphor/meta.json +1 -1
  411. package/dist/theme-packs/phosphor/pack.css +2 -2
  412. package/dist/theme-packs/riso/meta.json +1 -1
  413. package/dist/theme-packs/riso/pack.css +2 -2
  414. package/dist/theme-packs/sakura/meta.json +1 -1
  415. package/dist/theme-packs/sakura/pack.css +2 -2
  416. package/dist/theme-packs/scandi/meta.json +1 -1
  417. package/dist/theme-packs/scandi/pack.css +1 -1
  418. package/dist/theme-packs/solar/meta.json +1 -1
  419. package/dist/theme-packs/solar/pack.css +1 -1
  420. package/dist/theme-packs/sumi/meta.json +1 -1
  421. package/dist/theme-packs/sumi/pack.css +2 -2
  422. package/dist/theme-packs/swissgrid/meta.json +1 -1
  423. package/dist/theme-packs/swissgrid/pack.css +1 -1
  424. package/dist/theme-packs/timberline/meta.json +1 -1
  425. package/dist/theme-packs/timberline/pack.css +2 -2
  426. package/dist/theme-packs/washi/meta.json +1 -1
  427. package/dist/theme-packs/washi/pack.css +2 -2
  428. package/dist/theme-toggle/index.d.ts +1 -1
  429. package/dist/theme-toggle/index.js +154 -167
  430. package/dist/theme.css +47 -121
  431. package/dist/toc/mobile-toc.d.ts +3 -5
  432. package/dist/toc/mobile-toc.js +29 -27
  433. package/dist/toc/toc.d.ts +3 -4
  434. package/dist/toc/toc.js +18 -18
  435. package/dist/toc/use-active-heading.d.ts +5 -4
  436. package/dist/toc/use-active-heading.js +36 -30
  437. package/dist/toc-prepaint/index.d.ts +1 -2
  438. package/dist/toc-prepaint/index.js +4 -6
  439. package/dist/transitions/nested-island-props-refresh.d.ts +3 -16
  440. package/dist/transitions/nested-island-props-refresh.js +133 -151
  441. package/dist/transitions/page-events.d.ts +8 -13
  442. package/dist/tree-nav-shared/index.d.ts +4 -5
  443. package/dist/tree-nav-shared/index.js +6 -7
  444. package/dist/use-modal-dialog/index.d.ts +9 -63
  445. package/dist/use-modal-dialog/index.js +41 -59
  446. package/dist/versions-page/index.d.ts +3 -3
  447. package/dist/versions-page/index.js +5 -5
  448. package/dist/wind/index.d.ts +5 -0
  449. package/dist/wind/index.js +169 -0
  450. package/dist/wind.json +498 -0
  451. package/dist/z-index-defaults/index.d.ts +4 -4
  452. package/dist/zdtp-loader.d.ts +7 -0
  453. package/dist/zdtp-loader.js +8 -0
  454. package/eject/asset-components/asset-card.tsx +14 -16
  455. package/eject/asset-components/asset-code.tsx +10 -12
  456. package/eject/asset-components/shared.tsx +5 -7
  457. package/eject/breadcrumb/breadcrumb.tsx +15 -16
  458. package/eject/code-group/index.tsx +4 -10
  459. package/eject/content-admonition/index.tsx +5 -6
  460. package/eject/desktop-sidebar-toggle-island/index.ts +4 -0
  461. package/eject/desktop-sidebar-toggle-island/island.tsx +50 -0
  462. package/eject/desktop-sidebar-toggle-island/storage.ts +27 -0
  463. package/eject/details/details.tsx +3 -5
  464. package/eject/doc-history/index.tsx +193 -179
  465. package/eject/doc-pager/index.tsx +3 -4
  466. package/eject/footer/footer.tsx +7 -9
  467. package/eject/header/header.tsx +42 -54
  468. package/eject/header/nav-overflow-script.ts +1 -1
  469. package/eject/header/types.ts +12 -13
  470. package/eject/image-enlarge/index.tsx +84 -69
  471. package/eject/image-enlarge/public.ts +2 -0
  472. package/eject/image-enlarge/ssr-fallback.tsx +7 -0
  473. package/eject/page-loading/page-loading-overlay.tsx +8 -15
  474. package/eject/sidebar/client-data.ts +68 -0
  475. package/eject/sidebar/index.ts +3 -0
  476. package/eject/sidebar/sidebar.tsx +16 -97
  477. package/eject/sidebar/types.ts +15 -0
  478. package/eject/sidebar-toggle-island/index.tsx +103 -102
  479. package/eject/sidebar-tree-island/index.tsx +827 -615
  480. package/eject/sidebar-tree-island/scope-state.ts +154 -0
  481. package/eject/sidebar-tree-island/sidebar-scroll-preserve.ts +8 -2
  482. package/eject/site-tree-nav-island/index.tsx +349 -222
  483. package/eject/tab-item/tab-item.tsx +2 -4
  484. package/eject/theme-toggle/hydration-pending.ts +6 -10
  485. package/eject/theme-toggle/index.tsx +133 -173
  486. package/eject/toc/mobile-toc.tsx +27 -31
  487. package/eject/toc/toc.tsx +21 -24
  488. package/eject/toc/use-active-heading.ts +43 -38
  489. package/package.json +40 -22
  490. package/routes-src/404.tsx +2 -3
  491. package/routes-src/_chrome.tsx +7 -2
  492. package/routes-src/_design-token-panel-bootstrap.tsx +1 -63
  493. package/routes-src/docs-slug.tsx +2 -3
  494. package/routes-src/docs-tags-index.tsx +2 -3
  495. package/routes-src/docs-tags-tag.tsx +2 -3
  496. package/routes-src/docs-versions.tsx +2 -3
  497. package/routes-src/files-path.tsx +2 -4
  498. package/routes-src/index.tsx +2 -3
  499. package/routes-src/locale-docs-slug.tsx +2 -3
  500. package/routes-src/locale-docs-tags-index.tsx +2 -3
  501. package/routes-src/locale-docs-tags-tag.tsx +2 -3
  502. package/routes-src/locale-docs-versions.tsx +2 -3
  503. package/routes-src/locale-files-path.tsx +2 -4
  504. package/routes-src/locale-index.tsx +2 -3
  505. package/routes-src/mcp.tsx +25 -0
  506. package/routes-src/v-docs-slug.tsx +2 -3
  507. package/routes-src/v-locale-docs-slug.tsx +2 -3
  508. package/tsconfig.base.json +1 -1
  509. package/dist/safelist.css +0 -2
  510. package/dist/theme-no-reset.css +0 -379
  511. package/eject/desktop-sidebar-toggle-island/index.tsx +0 -110
@@ -1,145 +1,216 @@
1
1
  "use client";
2
- import { jsx, jsxs } from "preact/jsx-runtime";
3
- import { useState, useEffect, useRef, useCallback, memo } from "preact/compat";
2
+ import { jsx, jsxs } from "@takazudo/zfb/zudo-react/jsx-runtime";
3
+ import {
4
+ batch,
5
+ computed,
6
+ For,
7
+ getScope,
8
+ Show,
9
+ signal
10
+ } from "@takazudo/zfb/zudo-react";
4
11
  import { renderMarkdown } from "../render-markdown/index.js";
5
12
  import { SmartBreak } from "../smart-break/index.js";
6
13
  import { BEFORE_NAVIGATE_EVENT } from "../transitions/index.js";
7
- import { useModalDialog } from "../use-modal-dialog/index.js";
14
+ import { modalDialog } from "../use-modal-dialog/index.js";
8
15
  function isAiChatResponse(data) {
9
16
  return typeof data === "object" && data !== null;
10
17
  }
11
- const ChatMessageRow = memo(function ChatMessageRow2({ msg }) {
18
+ function ChatMessageRow({ msg }) {
12
19
  return /* @__PURE__ */ jsxs(
13
20
  "div",
14
21
  {
15
- className: `mb-vsp-xs flex ${msg.role === "user" ? "justify-end" : "justify-start"}`,
22
+ class: `mb-vsp-xs flex ${msg.role === "user" ? "justify-end" : "justify-start"}`,
16
23
  children: [
17
- /* @__PURE__ */ jsx("span", { className: "sr-only", children: msg.role === "user" ? "You: " : "Assistant: " }),
18
- msg.role === "user" ? /* @__PURE__ */ jsx("div", { className: "max-w-[85%] rounded-t-[1rem] rounded-bl-[1rem] rounded-br-[0.25rem] bg-chat-user-bg px-hsp-md py-vsp-2xs text-small leading-relaxed text-chat-user-text", children: /* @__PURE__ */ jsx(SmartBreak, { children: msg.content }) }) : /* @__PURE__ */ jsx(
19
- "div",
20
- {
21
- className: "ai-chat-md max-w-[85%] rounded-t-[1rem] rounded-br-[1rem] rounded-bl-[0.25rem] bg-chat-assistant-bg px-hsp-md py-vsp-2xs text-small leading-relaxed text-chat-assistant-text",
22
- dangerouslySetInnerHTML: { __html: renderMarkdown(msg.content) }
23
- }
24
+ /* @__PURE__ */ jsx("span", { class: "sr-only", children: msg.role === "user" ? "You: " : "Assistant: " }),
25
+ msg.role === "user" ? /* @__PURE__ */ jsx("div", { class: "max-w-[85%] rounded-t-[1rem] rounded-bl-[1rem] rounded-br-[0.25rem] bg-chat-user-bg px-hsp-md py-vsp-2xs text-small leading-relaxed text-chat-user-text", children: /* @__PURE__ */ jsx(SmartBreak, { children: msg.content }) }) : (
26
+ // `renderMarkdown` escapes authored content before adding its small,
27
+ // protocol-checked tag allowlist. This generated HTML is the only
28
+ // payload assigned to rawHtml; the opaque subtree has no owned children.
29
+ /* @__PURE__ */ jsx(
30
+ "div",
31
+ {
32
+ class: "ai-chat-md max-w-[85%] rounded-t-[1rem] rounded-br-[1rem] rounded-bl-[0.25rem] bg-chat-assistant-bg px-hsp-md py-vsp-2xs text-small leading-relaxed text-chat-assistant-text",
33
+ rawHtml: renderMarkdown(msg.content)
34
+ }
35
+ )
24
36
  )
25
37
  ]
26
38
  }
27
39
  );
28
- });
40
+ }
29
41
  function AiChatModal({ basePath }) {
30
- const messagesEndRef = useRef(null);
31
- const inputRef = useRef(null);
32
- const [isOpen, setIsOpen] = useState(false);
33
- const [messages, setMessages] = useState([]);
34
- const [input, setInput] = useState("");
35
- const [loading, setLoading] = useState(false);
36
- const [error, setError] = useState(null);
37
- const resetState = useCallback(() => {
38
- setIsOpen(false);
39
- setMessages([]);
40
- setInput("");
41
- setError(null);
42
- setLoading(false);
43
- }, []);
44
- const { dialogRef, handleBackdropClick } = useModalDialog({
42
+ const scope = getScope();
43
+ const messagesEndRef = { current: null };
44
+ const inputRef = { current: null };
45
+ const isOpen = signal(false);
46
+ const messages = signal([]);
47
+ const input = signal("");
48
+ const loading = signal(false);
49
+ const error = signal(null);
50
+ const isComposing = signal(false);
51
+ let nextMessageId = 0;
52
+ let requestVersion = 0;
53
+ let activeRequest = null;
54
+ let cleanupActiveRequest = null;
55
+ const busy = computed(() => loading.value);
56
+ const sendDisabled = computed(() => busy.value || input.value.trim().length === 0);
57
+ const showEmptyState = computed(() => messages.value.length === 0 && !busy.value);
58
+ const hasError = computed(() => error.value !== null);
59
+ const latestAssistantMessage = computed(() => {
60
+ const current = messages.value;
61
+ for (let index = current.length - 1; index >= 0; index--) {
62
+ const message = current[index];
63
+ if (message?.role === "assistant") return message.content;
64
+ }
65
+ return "";
66
+ });
67
+ const cancelActiveRequest = () => {
68
+ requestVersion++;
69
+ activeRequest?.abort();
70
+ cleanupActiveRequest?.();
71
+ activeRequest = null;
72
+ cleanupActiveRequest = null;
73
+ };
74
+ const resetState = () => {
75
+ cancelActiveRequest();
76
+ batch(() => {
77
+ isOpen.value = false;
78
+ messages.value = [];
79
+ input.value = "";
80
+ error.value = null;
81
+ loading.value = false;
82
+ isComposing.value = false;
83
+ });
84
+ };
85
+ const { dialogRef, handleBackdropClick } = modalDialog(scope, {
45
86
  isOpen,
46
87
  onClose: resetState,
47
88
  navigateEvent: BEFORE_NAVIGATE_EVENT,
48
89
  backdropClickClose: true,
49
90
  restoreFocusOnly: true
50
91
  });
51
- useEffect(() => {
52
- function handleToggle() {
92
+ scope.onActivate(() => {
93
+ const handleToggle = (_event) => {
53
94
  const dialog = dialogRef.current;
54
- if (!dialog || !dialog.isConnected) return;
95
+ if (!dialog?.isConnected) return;
55
96
  if (dialog.open) {
56
97
  dialog.close();
57
98
  } else {
58
- setIsOpen(true);
99
+ isOpen.value = true;
59
100
  }
60
- }
101
+ };
61
102
  window.addEventListener("toggle-ai-chat", handleToggle);
62
103
  return () => window.removeEventListener("toggle-ai-chat", handleToggle);
63
- }, [dialogRef]);
64
- useEffect(() => {
65
- if (isOpen) {
66
- inputRef.current?.focus();
104
+ });
105
+ scope.onCleanup(cancelActiveRequest);
106
+ scope.effect(() => {
107
+ if (isOpen.value) inputRef.current?.focus();
108
+ });
109
+ scope.effect(() => {
110
+ messages.value;
111
+ loading.value;
112
+ messagesEndRef.current?.scrollIntoView?.({ behavior: "smooth" });
113
+ });
114
+ const sendMessage = async () => {
115
+ const trimmed = input.value.trim();
116
+ if (!trimmed || loading.value || isComposing.value || scope.abortSignal.aborted) {
117
+ return;
67
118
  }
68
- }, [isOpen]);
69
- useEffect(() => {
70
- messagesEndRef.current?.scrollIntoView({ behavior: "smooth" });
71
- }, [messages, loading]);
72
- const sendMessage = useCallback(async () => {
73
- const trimmed = input.trim();
74
- if (!trimmed || loading) return;
75
- const userMessage = { role: "user", content: trimmed };
76
- const updatedMessages = [...messages, userMessage];
77
- setMessages(updatedMessages);
78
- setInput("");
79
- setError(null);
80
- setLoading(true);
119
+ const requestMessages = messages.value.map(({ role, content }) => ({ role, content }));
120
+ const userMessage = {
121
+ id: ++nextMessageId,
122
+ role: "user",
123
+ content: trimmed
124
+ };
125
+ const controller = new AbortController();
126
+ const currentRequest = ++requestVersion;
127
+ activeRequest = controller;
128
+ const abortForScope = () => controller.abort();
129
+ scope.abortSignal.addEventListener("abort", abortForScope, { once: true });
130
+ const cleanupScopeAbort = () => scope.abortSignal.removeEventListener("abort", abortForScope);
131
+ cleanupActiveRequest = cleanupScopeAbort;
132
+ const isCurrentRequest = () => currentRequest === requestVersion && activeRequest === controller && !controller.signal.aborted && !scope.abortSignal.aborted;
133
+ let assistantMessage = null;
134
+ let responseError;
135
+ batch(() => {
136
+ messages.value = [...messages.value, userMessage];
137
+ input.value = "";
138
+ error.value = null;
139
+ loading.value = true;
140
+ });
81
141
  try {
82
142
  const base = basePath.replace(/\/+$/, "");
83
- const res = await fetch(`${base}/api/ai-chat`, {
143
+ const response = await fetch(`${base}/api/ai-chat`, {
84
144
  method: "POST",
85
145
  headers: { "Content-Type": "application/json" },
86
- body: JSON.stringify({
87
- message: trimmed,
88
- history: messages
89
- })
146
+ body: JSON.stringify({ message: trimmed, history: requestMessages }),
147
+ signal: controller.signal
90
148
  });
91
- const raw = await res.json();
149
+ if (!isCurrentRequest()) return;
150
+ const raw = await response.json();
151
+ if (!isCurrentRequest()) return;
92
152
  const data = isAiChatResponse(raw) ? raw : {};
93
- if (!res.ok) {
94
- setError(("error" in data && typeof data.error === "string" ? data.error : null) || "Something went wrong");
153
+ if (!response.ok) {
154
+ responseError = ("error" in data && typeof data.error === "string" ? data.error : null) || "Something went wrong";
95
155
  } else if ("response" in data && typeof data.response === "string" && data.response) {
96
- setMessages((prev) => [
97
- ...prev,
98
- { role: "assistant", content: data.response }
99
- ]);
156
+ assistantMessage = { id: ++nextMessageId, role: "assistant", content: data.response };
100
157
  } else {
101
- setError("Received an empty or invalid response");
158
+ responseError = "Received an empty or invalid response";
102
159
  }
103
160
  } catch {
104
- setError("Failed to connect to the AI assistant");
161
+ if (isCurrentRequest()) responseError = "Failed to connect to the AI assistant";
105
162
  } finally {
106
- setLoading(false);
163
+ cleanupScopeAbort();
164
+ if (activeRequest === controller) cleanupActiveRequest = null;
165
+ if (isCurrentRequest()) {
166
+ activeRequest = null;
167
+ batch(() => {
168
+ if (assistantMessage) messages.value = [...messages.value, assistantMessage];
169
+ if (responseError !== void 0) error.value = responseError;
170
+ loading.value = false;
171
+ });
172
+ }
107
173
  }
108
- }, [input, loading, messages, basePath]);
109
- function handleKeyDown(e) {
110
- if (e.key === "Enter" && !e.shiftKey) {
111
- e.preventDefault();
112
- sendMessage();
174
+ };
175
+ const handleKeyDown = (event) => {
176
+ const keyboard = event;
177
+ if (keyboard.key !== "Enter" || keyboard.shiftKey || keyboard.isComposing || isComposing.value || event.defaultPrevented) {
178
+ return;
113
179
  }
114
- }
180
+ event.preventDefault();
181
+ void sendMessage();
182
+ };
183
+ const handleSendClick = (event) => {
184
+ if (event.defaultPrevented || isComposing.value) return;
185
+ void sendMessage();
186
+ };
115
187
  return /* @__PURE__ */ jsx(
116
188
  "dialog",
117
189
  {
118
190
  ref: dialogRef,
119
- onClick: handleBackdropClick,
120
- className: "z-modal m-0 h-dvh max-h-none w-dvw max-w-none border-none bg-surface p-0 text-fg backdrop:z-modal-backdrop backdrop:bg-bg/80 lg:m-auto lg:h-[90vh] lg:max-h-[90vh] lg:w-[90vw] lg:max-w-[52.5rem] lg:border-solid lg:border lg:border-fg",
121
- children: /* @__PURE__ */ jsxs("div", { className: "flex h-full flex-col", children: [
122
- /* @__PURE__ */ jsxs("div", { className: "flex shrink-0 items-center justify-between border-b border-muted px-hsp-lg py-vsp-xs", children: [
123
- /* @__PURE__ */ jsx("h2", { className: "text-title font-bold text-fg", children: "AI Assistant" }),
191
+ "on:click": handleBackdropClick,
192
+ class: "z-modal m-0 h-dvh max-h-none w-dvw max-w-none border-none bg-surface p-0 text-fg backdrop:z-modal-backdrop backdrop:bg-bg/80 lg:m-auto lg:h-[90vh] lg:max-h-[90vh] lg:w-[90vw] lg:max-w-[52.5rem] lg:border-solid lg:border lg:border-fg",
193
+ children: /* @__PURE__ */ jsxs("div", { class: "flex h-full flex-col", children: [
194
+ /* @__PURE__ */ jsxs("div", { class: "flex shrink-0 items-center justify-between border-b border-muted px-hsp-lg py-vsp-xs", children: [
195
+ /* @__PURE__ */ jsx("h2", { class: "text-title font-bold text-fg", children: "AI Assistant" }),
124
196
  /* @__PURE__ */ jsx(
125
197
  "button",
126
198
  {
127
199
  type: "button",
128
- onClick: () => dialogRef.current?.close(),
129
- className: "flex items-center justify-center text-muted transition-colors hover:text-fg",
200
+ "on:click": () => dialogRef.current?.close(),
201
+ class: "flex items-center justify-center text-muted transition-colors duration-0 hover:text-fg",
130
202
  "aria-label": "Close",
131
203
  children: /* @__PURE__ */ jsxs(
132
204
  "svg",
133
205
  {
134
- xmlns: "http://www.w3.org/2000/svg",
135
206
  width: "20",
136
207
  height: "20",
137
208
  viewBox: "0 0 24 24",
138
209
  fill: "none",
139
210
  stroke: "currentColor",
140
- strokeWidth: "2",
141
- strokeLinecap: "round",
142
- strokeLinejoin: "round",
211
+ "stroke-width": "2",
212
+ "stroke-linecap": "round",
213
+ "stroke-linejoin": "round",
143
214
  "aria-hidden": "true",
144
215
  children: [
145
216
  /* @__PURE__ */ jsx("line", { x1: "18", y1: "6", x2: "6", y2: "18" }),
@@ -150,79 +221,69 @@ function AiChatModal({ basePath }) {
150
221
  }
151
222
  )
152
223
  ] }),
153
- /* @__PURE__ */ jsxs("div", { role: "log", "aria-label": "Chat messages", className: "flex-1 overflow-y-auto px-hsp-lg py-vsp-sm", children: [
154
- messages.length === 0 && !loading && /* @__PURE__ */ jsx("p", { className: "py-vsp-xl text-center text-small text-muted", children: "Ask a question about the documentation." }),
155
- messages.map((msg, i) => /* @__PURE__ */ jsx(ChatMessageRow, { msg }, i)),
156
- /* @__PURE__ */ jsx(
157
- "div",
158
- {
159
- "aria-live": "polite",
160
- "aria-atomic": "true",
161
- className: "sr-only",
162
- children: (() => {
163
- for (let i = messages.length - 1; i >= 0; i--) {
164
- const msg = messages[i];
165
- if (msg && msg.role === "assistant") return msg.content;
166
- }
167
- return "";
168
- })()
169
- }
170
- ),
171
- loading && /* @__PURE__ */ jsx("div", { className: "mb-vsp-xs flex justify-start", children: /* @__PURE__ */ jsx(
224
+ /* @__PURE__ */ jsxs("div", { role: "log", "aria-label": "Chat messages", class: "flex-1 overflow-y-auto px-hsp-lg py-vsp-sm", children: [
225
+ /* @__PURE__ */ jsx(Show, { when: showEmptyState, children: () => /* @__PURE__ */ jsx("p", { class: "py-vsp-xl text-center text-small text-muted", children: "Ask a question about the documentation." }) }),
226
+ /* @__PURE__ */ jsx(For, { each: messages, by: (message) => message.id, children: (message) => /* @__PURE__ */ jsx(ChatMessageRow, { msg: message.value }) }),
227
+ /* @__PURE__ */ jsx("div", { "aria-live": "polite", "aria-atomic": "true", class: "sr-only", children: latestAssistantMessage }),
228
+ /* @__PURE__ */ jsx(Show, { when: busy, children: () => /* @__PURE__ */ jsx("div", { class: "mb-vsp-xs flex justify-start", children: /* @__PURE__ */ jsx(
172
229
  "div",
173
230
  {
174
231
  role: "status",
175
- className: "rounded-t-[1rem] rounded-br-[1rem] rounded-bl-[0.25rem] bg-chat-assistant-bg px-hsp-md py-vsp-2xs text-small text-muted",
232
+ class: "rounded-t-[1rem] rounded-br-[1rem] rounded-bl-[0.25rem] bg-chat-assistant-bg px-hsp-md py-vsp-2xs text-small text-muted",
176
233
  children: "Thinking..."
177
234
  }
178
- ) }),
179
- error && /* @__PURE__ */ jsx(
235
+ ) }) }),
236
+ /* @__PURE__ */ jsx(Show, { when: hasError, children: () => /* @__PURE__ */ jsx(
180
237
  "div",
181
238
  {
182
239
  role: "alert",
183
- className: "mb-vsp-xs rounded-[0.75rem] border border-danger bg-bg px-hsp-md py-vsp-2xs text-small text-danger",
184
- children: error
240
+ class: "mb-vsp-xs rounded-[0.75rem] border border-danger bg-bg px-hsp-md py-vsp-2xs text-small text-danger",
241
+ children: computed(() => error.value ?? "")
185
242
  }
186
- ),
243
+ ) }),
187
244
  /* @__PURE__ */ jsx("div", { ref: messagesEndRef })
188
245
  ] }),
189
- /* @__PURE__ */ jsx("div", { className: "shrink-0 border-t border-muted px-hsp-lg py-vsp-xs", children: /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-x-hsp-sm", children: [
246
+ /* @__PURE__ */ jsx("div", { class: "shrink-0 border-t border-muted px-hsp-lg py-vsp-xs", children: /* @__PURE__ */ jsxs("div", { class: "flex items-center gap-x-hsp-sm", children: [
190
247
  /* @__PURE__ */ jsx(
191
248
  "input",
192
249
  {
193
250
  ref: inputRef,
194
251
  type: "text",
195
- value: input,
196
- onChange: (e) => setInput(e.currentTarget.value),
197
- onKeyDown: handleKeyDown,
198
- disabled: loading,
252
+ modelValue: input,
253
+ "on:compositionstart": () => {
254
+ isComposing.value = true;
255
+ },
256
+ "on:compositionend": () => {
257
+ isComposing.value = false;
258
+ },
259
+ "on:keydown": handleKeyDown,
260
+ disabled: busy,
199
261
  "aria-label": "Type your message",
200
- "aria-busy": loading,
262
+ "aria-busy": busy,
201
263
  placeholder: "Type your message...",
202
- className: "flex-1 rounded-full border border-muted bg-bg px-hsp-lg py-vsp-2xs text-small text-fg placeholder:text-muted focus:border-accent focus:outline-none disabled:opacity-50"
264
+ class: "flex-1 rounded-full border border-muted bg-bg px-hsp-lg py-vsp-2xs text-small text-fg placeholder:text-muted focus:border-accent focus:outline-none disabled:opacity-50"
203
265
  }
204
266
  ),
205
267
  /* @__PURE__ */ jsx(
206
268
  "button",
207
269
  {
208
270
  type: "button",
209
- onClick: sendMessage,
210
- disabled: loading || !input.trim(),
211
- "aria-busy": loading,
212
- className: "flex h-[2rem] w-[2rem] shrink-0 items-center justify-center rounded-full bg-accent text-bg transition-colors hover:bg-accent-hover disabled:opacity-50",
271
+ "on:click": handleSendClick,
272
+ disabled: sendDisabled,
273
+ "aria-busy": busy,
274
+ class: "flex h-[2rem] w-[2rem] shrink-0 items-center justify-center rounded-full bg-accent text-bg transition-colors duration-0 hover:bg-accent-hover disabled:opacity-50",
213
275
  "aria-label": "Send message",
214
276
  children: /* @__PURE__ */ jsxs(
215
277
  "svg",
216
278
  {
217
- xmlns: "http://www.w3.org/2000/svg",
218
279
  width: "16",
219
280
  height: "16",
220
281
  viewBox: "0 0 24 24",
221
282
  fill: "none",
222
283
  stroke: "currentColor",
223
- strokeWidth: "2",
224
- strokeLinecap: "round",
225
- strokeLinejoin: "round",
284
+ "stroke-width": "2",
285
+ "stroke-linecap": "round",
286
+ "stroke-linejoin": "round",
226
287
  "aria-hidden": "true",
227
288
  children: [
228
289
  /* @__PURE__ */ jsx("line", { x1: "22", y1: "2", x2: "11", y2: "13" }),
@@ -237,7 +298,6 @@ function AiChatModal({ basePath }) {
237
298
  }
238
299
  );
239
300
  }
240
- AiChatModal.displayName = "AiChatModal";
241
301
  export {
242
302
  AiChatModal
243
303
  };
@@ -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
  import { type AssetComponentContext } from "./shared.js";
5
4
  export interface AssetCardProps {
6
5
  src: string;
@@ -1,4 +1,4 @@
1
- import { jsx, jsxs } from "preact/jsx-runtime";
1
+ import { jsx, jsxs } from "@takazudo/zfb/zudo-react/jsx-runtime";
2
2
  import { assetRawHref, assetViewerHref } from "../asset-path/index.js";
3
3
  import {
4
4
  AssetFileIcon,
@@ -39,23 +39,23 @@ function createAssetCard(context) {
39
39
  )
40
40
  ].filter((value) => value !== void 0);
41
41
  const finalDescription = description ?? entry.description;
42
- return /* @__PURE__ */ jsx("article", { className: "rounded-lg border border-muted bg-surface px-hsp-lg py-vsp-sm", children: /* @__PURE__ */ jsxs("div", { className: "flex items-start gap-x-hsp-md", children: [
43
- /* @__PURE__ */ jsx("span", { className: "flex h-icon-lg w-icon-lg shrink-0 items-center justify-center text-muted", children: /* @__PURE__ */ jsx(AssetFileIcon, { className: "h-icon-lg w-icon-lg" }) }),
44
- /* @__PURE__ */ jsxs("div", { className: "min-w-0 flex-1", children: [
45
- /* @__PURE__ */ jsxs("div", { className: "font-mono text-small text-fg", children: [
46
- entry.dir ? /* @__PURE__ */ jsxs("span", { className: "text-muted", children: [
42
+ return /* @__PURE__ */ jsx("article", { class: "rounded-lg border border-muted bg-surface px-hsp-lg py-vsp-sm", children: /* @__PURE__ */ jsxs("div", { class: "flex items-start gap-x-hsp-md", children: [
43
+ /* @__PURE__ */ jsx("span", { class: "flex h-icon-lg w-icon-lg shrink-0 items-center justify-center text-muted", children: /* @__PURE__ */ jsx(AssetFileIcon, { class: "h-icon-lg w-icon-lg" }) }),
44
+ /* @__PURE__ */ jsxs("div", { class: "min-w-0 flex-1", children: [
45
+ /* @__PURE__ */ jsxs("div", { class: "font-mono text-small text-fg", children: [
46
+ entry.dir ? /* @__PURE__ */ jsxs("span", { class: "text-muted", children: [
47
47
  entry.dir,
48
48
  "/"
49
49
  ] }) : null,
50
50
  /* @__PURE__ */ jsx("strong", { children: title ?? entry.name })
51
51
  ] }),
52
- /* @__PURE__ */ jsx("div", { className: "mt-vsp-3xs text-caption text-muted", children: details.join(" \xB7 ") }),
53
- finalDescription ? /* @__PURE__ */ jsx("p", { className: "mt-vsp-xs text-small text-muted", children: finalDescription }) : null,
54
- /* @__PURE__ */ jsxs("div", { className: "mt-vsp-xs flex gap-x-hsp-lg text-caption", children: [
52
+ /* @__PURE__ */ jsx("div", { class: "mt-vsp-3xs text-caption text-muted", children: details.join(" \xB7 ") }),
53
+ finalDescription ? /* @__PURE__ */ jsx("p", { class: "mt-vsp-xs text-small text-muted", children: finalDescription }) : null,
54
+ /* @__PURE__ */ jsxs("div", { class: "mt-vsp-xs flex gap-x-hsp-lg text-caption", children: [
55
55
  /* @__PURE__ */ jsxs(
56
56
  "a",
57
57
  {
58
- className: "text-fg hover:text-accent focus-visible:text-accent hover:underline focus-visible:underline",
58
+ class: "text-fg hover:text-accent focus-visible:text-accent hover:underline focus-visible:underline",
59
59
  href: viewerHref,
60
60
  children: [
61
61
  assetComponentText(
@@ -70,9 +70,9 @@ function createAssetCard(context) {
70
70
  /* @__PURE__ */ jsxs(
71
71
  "a",
72
72
  {
73
- className: "text-fg hover:text-accent focus-visible:text-accent hover:underline focus-visible:underline",
73
+ class: "text-fg hover:text-accent focus-visible:text-accent hover:underline focus-visible:underline",
74
74
  href: rawHref,
75
- download: true,
75
+ download: "",
76
76
  children: [
77
77
  assetComponentText(
78
78
  context,
@@ -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
  import { type AssetComponentContext } from "./shared.js";
5
4
  export interface AssetCodeProps {
6
5
  src: string;
@@ -1,4 +1,4 @@
1
- import { jsx, jsxs } from "preact/jsx-runtime";
1
+ import { jsx, jsxs } from "@takazudo/zfb/zudo-react/jsx-runtime";
2
2
  import { assetViewerHref } from "../asset-path/index.js";
3
3
  import {
4
4
  AssetFileIcon,
@@ -49,22 +49,22 @@ function createAssetCode(context) {
49
49
  });
50
50
  const shown = Math.max(0, excerpt.endLine - excerpt.startLine + 1);
51
51
  const rangeLabel = requested.end === void 0 ? `lines ${requested.start}\u2013end` : requested.start === requested.end ? `line ${requested.start}` : `lines ${requested.start}\u2013${requested.end}`;
52
- return /* @__PURE__ */ jsxs("section", { className: "overflow-hidden rounded-lg border border-muted bg-surface", children: [
53
- /* @__PURE__ */ jsxs("header", { className: "flex items-center justify-between gap-x-hsp-md border-b border-muted px-hsp-lg py-vsp-2xs text-caption", children: [
54
- /* @__PURE__ */ jsxs("span", { className: "flex min-w-0 items-center gap-x-hsp-xs font-mono text-fg", children: [
55
- /* @__PURE__ */ jsx(AssetFileIcon, { className: "h-icon-sm w-icon-sm shrink-0" }),
52
+ return /* @__PURE__ */ jsxs("section", { class: "overflow-hidden rounded-lg border border-muted bg-surface", children: [
53
+ /* @__PURE__ */ jsxs("header", { class: "flex items-center justify-between gap-x-hsp-md border-b border-muted px-hsp-lg py-vsp-2xs text-caption", children: [
54
+ /* @__PURE__ */ jsxs("span", { class: "flex min-w-0 items-center gap-x-hsp-xs font-mono text-fg", children: [
55
+ /* @__PURE__ */ jsx(AssetFileIcon, { class: "h-icon-sm w-icon-sm shrink-0" }),
56
56
  /* @__PURE__ */ jsx("span", { children: title ?? resolved.path })
57
57
  ] }),
58
- /* @__PURE__ */ jsx("span", { className: "shrink-0 text-muted", children: rangeLabel })
58
+ /* @__PURE__ */ jsx("span", { class: "shrink-0 text-muted", children: rangeLabel })
59
59
  ] }),
60
60
  /* @__PURE__ */ jsx(
61
61
  "div",
62
62
  {
63
- className: "overflow-x-auto bg-code-bg text-code-fg text-caption",
64
- dangerouslySetInnerHTML: { __html: excerpt.html }
63
+ class: "overflow-x-auto bg-code-bg text-code-fg text-caption",
64
+ rawHtml: excerpt.html
65
65
  }
66
66
  ),
67
- /* @__PURE__ */ jsxs("footer", { className: "flex flex-wrap items-center justify-between gap-x-hsp-md gap-y-vsp-3xs border-t border-muted px-hsp-lg py-vsp-2xs text-caption text-muted", children: [
67
+ /* @__PURE__ */ jsxs("footer", { class: "flex flex-wrap items-center justify-between gap-x-hsp-md gap-y-vsp-3xs border-t border-muted px-hsp-lg py-vsp-2xs text-caption text-muted", children: [
68
68
  /* @__PURE__ */ jsx("span", { children: assetComponentText(
69
69
  context,
70
70
  "asset.showingLines",
@@ -74,7 +74,7 @@ function createAssetCode(context) {
74
74
  /* @__PURE__ */ jsxs(
75
75
  "a",
76
76
  {
77
- className: "text-fg hover:text-accent focus-visible:text-accent hover:underline focus-visible:underline",
77
+ class: "text-fg hover:text-accent focus-visible:text-accent hover:underline focus-visible:underline",
78
78
  href: viewerHref,
79
79
  children: [
80
80
  assetComponentText(
@@ -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
  import type { AssetIndexEntry, AssetManifest } from "../route-context-payload/types.js";
5
4
  export interface AssetComponentContext {
6
5
  base: string;
@@ -22,8 +21,8 @@ export declare function resolveAssetEntry(src: string, context: AssetComponentCo
22
21
  } | null;
23
22
  export declare function formatAssetBytes(bytes: number): string;
24
23
  export declare function formatAssetLanguage(language: string | undefined): string;
25
- export declare function AssetFileIcon({ className, }: {
26
- className?: string;
24
+ export declare function AssetFileIcon({ class: className, }: {
25
+ class?: string;
27
26
  }): JSX.Element;
28
27
  export declare function MissingAssetWarning({ children, }: {
29
28
  children: string;
@@ -1,4 +1,4 @@
1
- import { jsx, jsxs } from "preact/jsx-runtime";
1
+ import { jsx, jsxs } from "@takazudo/zfb/zudo-react/jsx-runtime";
2
2
  import { decodeAuthoredHref } from "../asset-path/index.js";
3
3
  function assetComponentViewerLocale(context, path) {
4
4
  if (context.isDefaultLocaleOnlyPath?.(`/${context.routePrefix}/${path}`)) {
@@ -53,12 +53,12 @@ function formatAssetLanguage(language) {
53
53
  return known[language.toLowerCase()] ?? language;
54
54
  }
55
55
  function AssetFileIcon({
56
- className
56
+ class: className
57
57
  }) {
58
58
  return /* @__PURE__ */ jsxs(
59
59
  "svg",
60
60
  {
61
- className,
61
+ class: className,
62
62
  viewBox: "0 0 24 24",
63
63
  fill: "none",
64
64
  stroke: "currentColor",
@@ -79,7 +79,7 @@ function MissingAssetWarning({
79
79
  return /* @__PURE__ */ jsx(
80
80
  "div",
81
81
  {
82
- className: "rounded border border-warning/30 bg-warning/5 px-hsp-lg py-vsp-xs text-small text-warning",
82
+ class: "rounded border border-warning/30 bg-warning/5 px-hsp-lg py-vsp-xs text-small text-warning",
83
83
  role: "status",
84
84
  children
85
85
  }
@@ -1,6 +1,5 @@
1
1
  /** @jsxRuntime automatic */
2
- /** @jsxImportSource preact */
3
- import type { ComponentType, VNode } from "preact";
2
+ import type { Child, Component } from "@takazudo/zfb/zudo-react";
4
3
  import type { AssetIndexEntry } from "../route-context-payload/types.js";
5
4
  import { type AssetTreeNode } from "./tree.js";
6
5
  /**
@@ -43,8 +42,8 @@ export interface AssetIndexPageLabels {
43
42
  * own strings even when `t` itself falls back internally.
44
43
  */
45
44
  export declare function resolveAssetIndexPageLabels(t: (key: string, locale?: string) => string, locale: string): AssetIndexPageLabels;
46
- export declare function iconFor(asset: AssetIndexEntry): ComponentType<{
47
- className?: string;
45
+ export declare function iconFor(asset: AssetIndexEntry): Component<{
46
+ class?: string;
48
47
  }>;
49
48
  export declare function AssetTree({ node, base, routePrefix, locale, fileCountLabel, fileCountSingleLabel, linesLabel, root }: {
50
49
  node: AssetTreeNode;
@@ -55,7 +54,7 @@ export declare function AssetTree({ node, base, routePrefix, locale, fileCountLa
55
54
  fileCountSingleLabel: string;
56
55
  linesLabel: string;
57
56
  root?: boolean;
58
- }): VNode;
57
+ }): Child;
59
58
  export interface AssetIndexPageBodyProps {
60
59
  /** Every asset entry in the index. */
61
60
  entries: AssetIndexEntry[];
@@ -77,4 +76,4 @@ export interface AssetIndexPageBodyProps {
77
76
  * `DocLayoutWithDefaults`'s children before the #4223 split. Plain props
78
77
  * only, no `ChromeContext`.
79
78
  */
80
- export declare function AssetIndexPageBody({ entries, labels, base, routePrefix, dir, locale }: AssetIndexPageBodyProps): VNode;
79
+ export declare function AssetIndexPageBody({ entries, labels, base, routePrefix, dir, locale }: AssetIndexPageBodyProps): Child;