@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
@@ -0,0 +1,93 @@
1
+ const DEFAULT_SETTINGS = {
2
+ colorScheme: "Default Dark",
3
+ colorMode: {
4
+ defaultMode: "dark",
5
+ lightScheme: "Default Light",
6
+ darkScheme: "Default Dark",
7
+ respectPrefersColorScheme: true
8
+ },
9
+ siteName: "Docs",
10
+ siteDescription: "",
11
+ logo: "auto",
12
+ favicon: void 0,
13
+ base: "/",
14
+ trailingSlash: false,
15
+ home: { wide: false, introMarkdown: "", sitemapHeading: "" },
16
+ siteTreeNavIgnore: [],
17
+ siteTreeNavSecondary: [],
18
+ minifyHtml: true,
19
+ docsDir: "src/content/docs",
20
+ entryDocSlug: "getting-started",
21
+ dateFormat: "locale",
22
+ defaultLocale: "en",
23
+ locales: {},
24
+ mermaid: true,
25
+ transclude: false,
26
+ noindex: false,
27
+ editUrl: false,
28
+ githubUrl: false,
29
+ siteUrl: "",
30
+ metaTags: {
31
+ description: true,
32
+ keywords: false,
33
+ ogImage: false,
34
+ ogSiteName: true,
35
+ twitterCard: false
36
+ },
37
+ sitemap: false,
38
+ docMetainfo: false,
39
+ docMetainfoFields: ["created", "updated", "author"],
40
+ docTags: false,
41
+ tagPlacement: "after-title",
42
+ tagGovernance: "off",
43
+ tagVocabulary: false,
44
+ agentExport: false,
45
+ mcp: false,
46
+ llmsTxt: false,
47
+ changelogs: false,
48
+ math: false,
49
+ cjkFriendly: false,
50
+ onBrokenMarkdownLinks: "warn",
51
+ aiAssistant: false,
52
+ aiChatDemoMode: false,
53
+ aiChatAllowedOrigins: [],
54
+ // Exact UTC-day paid-call admission cap; false disables it. An admission is
55
+ // consumed before provider fetch and is not provider-confirmed accounting.
56
+ aiChatGlobalDailyLimit: false,
57
+ designTokenPanel: false,
58
+ tocMinDepth: 2,
59
+ tocMaxDepth: 4,
60
+ searchMaxBodyLength: 3e3,
61
+ sidebarResizer: false,
62
+ sidebarToggle: false,
63
+ tocToggle: false,
64
+ imageEnlarge: false,
65
+ findInPage: false,
66
+ dynamicPageTransition: false,
67
+ frontmatterPreview: false,
68
+ docHistory: false,
69
+ docHistoryUi: true,
70
+ docHistoryExclude: [],
71
+ assetViewer: false,
72
+ assetViewerDir: "assets",
73
+ assetViewerRoutePrefix: "files",
74
+ assetViewerExclude: [],
75
+ assetViewerIndex: false,
76
+ assetViewerIndexing: false,
77
+ bodyFootUtilArea: false,
78
+ htmlPreview: void 0,
79
+ versions: false,
80
+ claudeResources: false,
81
+ codexResources: false,
82
+ defaultLocaleOnlyPrefixes: [],
83
+ footer: false,
84
+ headerNav: [],
85
+ headerRightItems: [{ type: "component", component: "theme-toggle" }],
86
+ packageOwnedRoutes: true,
87
+ themePack: "default",
88
+ themePackSwitcher: false,
89
+ themePacks: void 0
90
+ };
91
+ export {
92
+ DEFAULT_SETTINGS
93
+ };
@@ -398,6 +398,10 @@ export interface Settings {
398
398
  tagGovernance: TagGovernanceMode;
399
399
  tagVocabulary: boolean;
400
400
  llmsTxt: boolean;
401
+ /** Generate the package-owned static agent documentation feed. */
402
+ agentExport?: boolean;
403
+ /** Add the stateless read-only MCP endpoint; requires agentExport. */
404
+ mcp?: boolean;
401
405
  changelogs?: ChangelogConfig[] | false;
402
406
  math: boolean;
403
407
  cjkFriendly: boolean;
@@ -555,8 +559,10 @@ export interface Settings {
555
559
  * `chromeBindings.DesignTokenPanelBootstrap`, stub-rendered pages now mount
556
560
  * NO panel island at all (the injected routes still get the configured one,
557
561
  * from any entry page). To get a panel on stub-rendered pages too, thread
558
- * your builder through `chromeBindings.DesignTokenPanelBootstrap` — that
559
- * binding wins everywhere and is unaffected by this rule. See
562
+ * your builder through a client bootstrap and expose its fixed-target,
563
+ * Fragment-wrapped Island server boundary as
564
+ * `chromeBindings.DesignTokenPanelBootstrap` — that boundary wins everywhere
565
+ * and is unaffected by this rule. Do not supply a raw client component. See
560
566
  * `docs/adr/route-injection-seam.md`.
561
567
  *
562
568
  * EDGE CASE (zudolab/zudo-doc#3420, diagnostic added #3428, scoped by
@@ -18,4 +18,4 @@
18
18
  */
19
19
  export { Sidebar } from "./sidebar.js";
20
20
  export type { SidebarProps } from "./sidebar.js";
21
- export type { SidebarLocaleLink, SidebarNavNode, SidebarRootMenuItem, SidebarTreeIslandProps, } from "./types.js";
21
+ export type { SidebarLocaleLink, SidebarNavNode, SidebarNavigationContext, SidebarRootMenuItem, SidebarTreeIslandProps, } from "./types.js";
@@ -1,50 +1,18 @@
1
1
  /** @jsxRuntime automatic */
2
- /** @jsxImportSource preact */
3
- import type { ComponentChildren, FunctionComponent, VNode } from "preact";
2
+ import type { Child, Component } from "@takazudo/zfb/zudo-react";
4
3
  import type { SidebarTreeIslandProps } from "./types.js";
4
+ /**
5
+ * Props for the server-rendered Sidebar shell. Data preparation stays with the
6
+ * caller, which may supply a tree component or already-rendered children.
7
+ */
5
8
  export interface SidebarProps extends SidebarTreeIslandProps {
6
- /**
7
- * The host's SidebarTree component. When present, the shell renders
8
- * `<TreeComponent {...islandProps} />` with the typed props below.
9
- * Mutually exclusive with `children`: prefer this form so v2 owns the
10
- * prop forwarding contract.
11
- */
12
- treeComponent?: FunctionComponent<SidebarTreeIslandProps>;
13
- /**
14
- * Pre-rendered tree content — falls back to this when
15
- * `treeComponent` is omitted. Useful for tests and for layouts that
16
- * compose the tree separately (e.g. inside a host wrapper
17
- * that needs `client:load` on the actual island element).
18
- */
19
- children?: ComponentChildren;
9
+ /** Component used to render the prepared tree. */
10
+ treeComponent?: Component<SidebarTreeIslandProps>;
11
+ /** Pre-rendered tree content for callers that compose the tree separately. */
12
+ children?: Child;
20
13
  }
21
14
  /**
22
- * Sidebar shell — typed wrapper around the SidebarTree island.
23
- *
24
- * Two usage shapes (matching the breadcrumb shell's pattern):
25
- *
26
- * 1. Pass `treeComponent` plus the data props (`nodes`,
27
- * `rootMenuItems`, `localeLinks`, …). The shell forwards them all
28
- * to the supplied component.
29
- *
30
- * 2. Pass `children` (e.g. a pre-instantiated `<SidebarTree
31
- * client:load … />` from an Astro wrapper). The shell renders
32
- * them as-is — the typed island props are then unused but kept on
33
- * the type signature so call-sites stay self-documenting.
34
- *
35
- * **The caller is responsible for wrapping this in `<Island when="load">`**
36
- * so the SSG output emits the `data-zfb-island="Sidebar"` hydration
37
- * marker around the rendered tree. `<DocLayoutWithDefaults>` does this
38
- * for you; consumers who render `<Sidebar>` outside the default layout
39
- * (e.g. via the `sidebarOverride` prop or in a custom layout) must
40
- * apply the wrapper themselves — otherwise no hydration marker is
41
- * emitted, and the runtime walks past the SSR'd tree without claiming
42
- * it as an island. Either way the actual user-facing interactivity
43
- * comes from the `treeComponent`'s own island registration; the
44
- * `<Island>` wrapper here exists so the shell can host data-only
45
- * variants in the future without losing the marker contract.
15
+ * Server-rendered shell around prepared navigation content. An empty node list
16
+ * has no sidebar output and returns null without creating an island boundary.
46
17
  */
47
- export declare function Sidebar(props: SidebarProps): VNode | null;
48
- export declare namespace Sidebar {
49
- var displayName: string;
50
- }
18
+ export declare function Sidebar(props: SidebarProps): Child;
@@ -1,21 +1,23 @@
1
- "use client";
2
- import { Fragment, jsx } from "preact/jsx-runtime";
1
+ import { Fragment, jsx } from "@takazudo/zfb/zudo-react/jsx-runtime";
3
2
  function Sidebar(props) {
4
3
  const {
5
4
  treeComponent: TreeComponent,
6
5
  children,
7
6
  nodes,
7
+ navigation,
8
8
  currentSlug,
9
9
  rootMenuItems,
10
10
  backToMenuLabel,
11
11
  localeLinks,
12
12
  themeDefaultMode
13
13
  } = props;
14
+ if (nodes.length === 0) return null;
14
15
  if (TreeComponent) {
15
16
  return /* @__PURE__ */ jsx(
16
17
  TreeComponent,
17
18
  {
18
19
  nodes,
20
+ navigation,
19
21
  currentSlug,
20
22
  rootMenuItems,
21
23
  backToMenuLabel,
@@ -29,7 +31,6 @@ function Sidebar(props) {
29
31
  }
30
32
  return null;
31
33
  }
32
- Sidebar.displayName = "Sidebar";
33
34
  export {
34
35
  Sidebar
35
36
  };
@@ -25,6 +25,8 @@
25
25
  * Matches `NavNode` in the host project's `src/utils/docs.ts`.
26
26
  */
27
27
  export interface SidebarNavNode {
28
+ /** Stable identity of this editorial occurrence, independent of the page slug. */
29
+ occurrenceId?: string;
28
30
  slug: string;
29
31
  label: string;
30
32
  description?: string;
@@ -67,9 +69,21 @@ export interface SidebarLocaleLink {
67
69
  */
68
70
  export interface SidebarTreeIslandProps {
69
71
  nodes: SidebarNavNode[];
72
+ navigation?: SidebarNavigationContext;
70
73
  currentSlug?: string;
71
74
  rootMenuItems?: SidebarRootMenuItem[];
72
75
  backToMenuLabel?: string;
73
76
  localeLinks?: SidebarLocaleLink[];
74
77
  themeDefaultMode?: "light" | "dark";
75
78
  }
79
+ /** Complete editorial topology, captured before local scoping or filtering. */
80
+ export interface SidebarNavigationContext {
81
+ /** Locale/version/document-context identity including the topology revision. */
82
+ id: string;
83
+ roots: SidebarNavNode[];
84
+ /** Explicit page/index author defaults; resolved against the current destination. */
85
+ initialExpansion?: Record<string, "collapsed" | "expanded">;
86
+ parents: Record<string, string | null>;
87
+ /** Explicit enclosing occurrence for a local forest spanning emitted children. */
88
+ localParentId?: string;
89
+ }
@@ -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
  export interface SidebarPrepaintProps {
5
4
  /**
6
5
  * Mirrors the page's `hide_sidebar: true` frontmatter. When true the desktop
@@ -1,9 +1,7 @@
1
- import { Fragment, jsx } from "preact/jsx-runtime";
1
+ import { Fragment, jsx } from "@takazudo/zfb/zudo-react/jsx-runtime";
2
2
  import { Island } from "@takazudo/zfb";
3
- import {
4
- DesktopSidebarToggle,
5
- SIDEBAR_STORAGE_KEY
6
- } from "../desktop-sidebar-toggle-island/index.js";
3
+ import { DesktopSidebarToggle } from "../desktop-sidebar-toggle-island/index.js";
4
+ import { SIDEBAR_STORAGE_KEY } from "../desktop-sidebar-toggle-island/storage.js";
7
5
  function sidebarPrepaintActive(settings, hideSidebar) {
8
6
  return Boolean(settings.sidebarToggle) && !hideSidebar;
9
7
  }
@@ -18,7 +16,7 @@ function createSidebarVisibilityPrepaint(settings) {
18
16
  return /* @__PURE__ */ jsx(
19
17
  "script",
20
18
  {
21
- dangerouslySetInnerHTML: { __html: SIDEBAR_VISIBILITY_PREPAINT_SCRIPT }
19
+ rawHtml: SIDEBAR_VISIBILITY_PREPAINT_SCRIPT
22
20
  }
23
21
  );
24
22
  }
@@ -1,12 +1,11 @@
1
- /** @jsxImportSource preact */
2
- import type { JSX } from "preact";
1
+ import type { JSX } from "@takazudo/zfb/zudo-react/jsx-runtime";
3
2
  export declare const SIDEBAR_RESIZER_INIT_SCRIPT: string;
4
3
  /**
5
4
  * Drop-in JSX body-end script for sidebar resize initialization.
6
5
  *
7
6
  * Include once in the layout (gated on `settings.sidebarResizer`). Emits
8
7
  * the full `initSidebarResizer` implementation as an inline
9
- * `dangerouslySetInnerHTML` script so it runs without a module import.
8
+ * static rawHtml script so it runs without a module import.
10
9
  *
11
10
  * - Calls `initSidebarResizer()` once on first paint.
12
11
  * - Re-runs on `AFTER_NAVIGATE_EVENT` (`zfb:after-swap`) for
@@ -1,4 +1,4 @@
1
- import { jsx } from "preact/jsx-runtime";
1
+ import { jsx } from "@takazudo/zfb/zudo-react/jsx-runtime";
2
2
  import { AFTER_NAVIGATE_EVENT } from "../transitions/page-events.js";
3
3
  const SIDEBAR_RESIZER_INIT_SCRIPT = `(function(){
4
4
  var SIDEBAR_ID="desktop-sidebar";
@@ -141,7 +141,7 @@ const SIDEBAR_RESIZER_INIT_SCRIPT = `(function(){
141
141
  document.addEventListener(${JSON.stringify(AFTER_NAVIGATE_EVENT)},initSidebarResizer);
142
142
  })();`;
143
143
  function SidebarResizerInit() {
144
- return /* @__PURE__ */ jsx("script", { dangerouslySetInnerHTML: { __html: SIDEBAR_RESIZER_INIT_SCRIPT } });
144
+ return /* @__PURE__ */ jsx("script", { rawHtml: SIDEBAR_RESIZER_INIT_SCRIPT });
145
145
  }
146
146
  var sidebar_resizer_init_default = SidebarResizerInit;
147
147
  const SIDEBAR_RESIZER_RESTORE_SCRIPT = `(function(){try{var w=localStorage.getItem("zudo-doc-sidebar-width");if(!w)return;var n=parseFloat(w);if(!isFinite(n))return;if(n<192)n=192;else if(n>448)n=448;document.documentElement.style.setProperty("--zd-sidebar-w",n+"px");}catch(e){}})();`;
@@ -149,7 +149,7 @@ function SidebarResizerRestore() {
149
149
  return /* @__PURE__ */ jsx(
150
150
  "script",
151
151
  {
152
- dangerouslySetInnerHTML: { __html: SIDEBAR_RESIZER_RESTORE_SCRIPT }
152
+ rawHtml: SIDEBAR_RESIZER_RESTORE_SCRIPT
153
153
  }
154
154
  );
155
155
  }
@@ -1,8 +1,9 @@
1
1
  import type { ThemeToggleLabels } from "../theme-toggle/index.js";
2
- import type { SidebarNavNode, SidebarRootMenuItem, SidebarLocaleLink } from "../sidebar/types.js";
2
+ import type { SidebarNavNode, SidebarRootMenuItem, SidebarLocaleLink, SidebarNavigationContext } from "../sidebar/types.js";
3
3
  import type { ResolvedDateFormats } from "../settings.js";
4
4
  export interface SidebarToggleProps {
5
5
  nodes: SidebarNavNode[];
6
+ navigation?: SidebarNavigationContext;
6
7
  currentSlug?: string;
7
8
  rootMenuItems?: SidebarRootMenuItem[];
8
9
  backToMenuLabel?: string;
@@ -13,19 +14,15 @@ export interface SidebarToggleProps {
13
14
  themeLabels?: ThemeToggleLabels;
14
15
  themeRespectSystem?: boolean;
15
16
  /**
16
- * Forwarded verbatim to the hosted `<SidebarTree>`. This island is the one
17
- * nested under the persisted `<header>`, so on a same-locale soft navigation
18
- * its serialized `data-props` is lifted from the previous page and refreshed
19
- * wholesale by `nested-island-props-refresh` — which carries the resolved
20
- * patterns along with `nodes`, at no extra cost, because that helper copies
21
- * the blob rather than enumerating prop names (#4075). The patterns cannot
22
- * actually differ across such a swap (the persist key is `header-${lang}`,
23
- * so a locale change is never a persisted swap); what matters is that they
24
- * are not LOST from the lifted island.
17
+ * Forwarded verbatim to the hosted `<SidebarTree>`. The same-locale header
18
+ * may persist across a soft navigation; zfb 3.1 keeps this island live when
19
+ * its effective props are unchanged and recreates it from incoming props
20
+ * when page data changes. The locale-keyed header persistence key prevents
21
+ * locale-specific props from crossing locales.
25
22
  */
26
23
  dateFormats?: ResolvedDateFormats;
27
24
  }
28
- export declare function SidebarToggle({ nodes, currentSlug, rootMenuItems, backToMenuLabel, locale, localeLinks, themeDefaultMode, themeLabels, themeRespectSystem, dateFormats, }: SidebarToggleProps): import("preact").JSX.Element;
25
+ export declare function SidebarToggle({ nodes, navigation, currentSlug, rootMenuItems, backToMenuLabel, locale, localeLinks, themeDefaultMode, themeLabels, themeRespectSystem, dateFormats, }: SidebarToggleProps): import("@takazudo/zfb").Description;
29
26
  export declare namespace SidebarToggle {
30
27
  var displayName: string;
31
28
  }
@@ -1,6 +1,6 @@
1
1
  "use client";
2
- import { Fragment, jsx, jsxs } from "preact/jsx-runtime";
3
- import { useState, useEffect, useRef } from "preact/hooks";
2
+ import { Fragment, jsx, jsxs } from "@takazudo/zfb/zudo-react/jsx-runtime";
3
+ import { computed, getScope, signal } from "@takazudo/zfb/zudo-react";
4
4
  import { AFTER_NAVIGATE_EVENT, ensureNestedIslandPropsRefresh } from "../transitions/index.js";
5
5
  import { SidebarTree } from "../sidebar-tree-island/index.js";
6
6
  ensureNestedIslandPropsRefresh();
@@ -8,6 +8,7 @@ const cx = (...classes) => classes.filter(Boolean).join(" ");
8
8
  const HIDDEN_ICON_STYLE = "display:none";
9
9
  function SidebarToggle({
10
10
  nodes,
11
+ navigation,
11
12
  currentSlug,
12
13
  rootMenuItems,
13
14
  backToMenuLabel,
@@ -18,78 +19,93 @@ function SidebarToggle({
18
19
  themeRespectSystem,
19
20
  dateFormats
20
21
  }) {
21
- const [open, setOpen] = useState(false);
22
- const hamburgerRef = useRef(null);
23
- useEffect(() => {
24
- if (open) {
25
- document.body.style.overflow = "hidden";
26
- } else {
27
- document.body.style.overflow = "";
28
- }
22
+ const open = signal(false);
23
+ const hamburgerRef = { current: null };
24
+ const closeIconRef = { current: null };
25
+ const menuIconRef = { current: null };
26
+ const scope = getScope();
27
+ scope.effect(() => {
28
+ const isOpen = open.value;
29
+ document.body.style.overflow = isOpen ? "hidden" : "";
30
+ if (isOpen) closeIconRef.current?.style.removeProperty("display");
31
+ else closeIconRef.current?.style.setProperty("display", "none");
32
+ if (isOpen) menuIconRef.current?.style.setProperty("display", "none");
33
+ else menuIconRef.current?.style.removeProperty("display");
29
34
  return () => {
30
35
  document.body.style.overflow = "";
31
36
  };
32
- }, [open]);
33
- useEffect(() => {
34
- function handleSwap() {
35
- setOpen(false);
36
- }
37
+ });
38
+ scope.onActivate(() => {
39
+ const handleSwap = () => {
40
+ open.value = false;
41
+ };
37
42
  document.addEventListener(AFTER_NAVIGATE_EVENT, handleSwap);
38
43
  return () => document.removeEventListener(AFTER_NAVIGATE_EVENT, handleSwap);
39
- }, []);
40
- useEffect(() => {
41
- if (!open) return;
44
+ });
45
+ scope.effect(() => {
46
+ if (!open.value) return;
42
47
  function handleKeyDown(event) {
43
- if (event.isComposing) return;
44
- if (event.defaultPrevented) return;
45
- if (event.key === "Escape") {
46
- setOpen(false);
48
+ const keyboard = event;
49
+ if (keyboard.isComposing) return;
50
+ if (keyboard.defaultPrevented) return;
51
+ if (keyboard.key === "Escape") {
52
+ open.value = false;
47
53
  hamburgerRef.current?.focus();
48
54
  }
49
55
  }
50
56
  document.addEventListener("keydown", handleKeyDown);
51
57
  return () => document.removeEventListener("keydown", handleKeyDown);
52
- }, [open]);
58
+ });
59
+ const isClosed = computed(() => !open.value);
60
+ const toggleClass = computed(
61
+ () => cx(
62
+ "lg:hidden shrink-0 px-hsp-sm py-vsp-xs -ml-hsp-sm mr-hsp-sm text-muted hover:text-fg",
63
+ open.value && "relative z-modal"
64
+ )
65
+ );
66
+ const backdropClass = computed(
67
+ () => cx(
68
+ "fixed inset-0 z-modal-backdrop bg-overlay/30 lg:hidden",
69
+ !open.value && "hidden"
70
+ )
71
+ );
72
+ const panelClass = computed(() => `
73
+ fixed top-[3.5rem] left-0 z-modal h-[calc(100vh_-_3.5rem)] w-[16rem] flex flex-col
74
+ border-r border-muted bg-bg transition-transform duration-200
75
+ lg:hidden
76
+ ${open.value ? "translate-x-0" : "-translate-x-full"}
77
+ `);
53
78
  return /* @__PURE__ */ jsxs(Fragment, { children: [
54
79
  /* @__PURE__ */ jsxs(
55
80
  "button",
56
81
  {
57
82
  ref: hamburgerRef,
58
83
  type: "button",
59
- onClick: () => setOpen(!open),
60
- className: cx(
61
- "lg:hidden shrink-0 px-hsp-sm py-vsp-xs -ml-hsp-sm mr-hsp-sm text-muted hover:text-fg",
62
- // While open, the button IS the close control (it shows the X), so it
63
- // has to sit in the drawer's own tier rather than under the backdrop —
64
- // `z-modal-backdrop` (50) otherwise intercepts every pointer event at
65
- // the button's own centre and the X is unclickable
66
- // (zudolab/zudo-doc#4369). `relative` is required: a bare `z-index`
67
- // has no effect on a statically-positioned element.
68
- // Conditioning on `open` is load-bearing, not cosmetic: SSR always
69
- // renders `open=false`, so the closed-state markup stays
70
- // byte-identical (hydration-stable, and the A2 no-stub parity hashes
71
- // for this directory do not move).
72
- open && "relative z-modal"
84
+ "on:click": () => {
85
+ open.value = !open.value;
86
+ },
87
+ class: toggleClass,
88
+ "aria-label": computed(
89
+ () => open.value ? "Close sidebar" : "Open sidebar"
73
90
  ),
74
- "aria-label": open ? "Close sidebar" : "Open sidebar",
75
- "aria-expanded": open,
91
+ "aria-expanded": computed(() => open.value ? "true" : "false"),
76
92
  children: [
77
93
  /* @__PURE__ */ jsx(
78
94
  "svg",
79
95
  {
80
- xmlns: "http://www.w3.org/2000/svg",
81
- className: "h-icon-lg w-icon-lg",
82
- style: open ? void 0 : HIDDEN_ICON_STYLE,
96
+ ref: closeIconRef,
97
+ class: "h-icon-lg w-icon-lg",
98
+ style: HIDDEN_ICON_STYLE,
83
99
  "aria-hidden": "true",
84
100
  fill: "none",
85
101
  viewBox: "0 0 24 24",
86
102
  stroke: "currentColor",
87
- strokeWidth: 2,
103
+ "stroke-width": 2,
88
104
  children: /* @__PURE__ */ jsx(
89
105
  "path",
90
106
  {
91
- strokeLinecap: "round",
92
- strokeLinejoin: "round",
107
+ "stroke-linecap": "round",
108
+ "stroke-linejoin": "round",
93
109
  d: "M6 18L18 6M6 6l12 12"
94
110
  }
95
111
  )
@@ -98,19 +114,18 @@ function SidebarToggle({
98
114
  /* @__PURE__ */ jsx(
99
115
  "svg",
100
116
  {
101
- xmlns: "http://www.w3.org/2000/svg",
102
- className: "h-icon-lg w-icon-lg",
103
- style: open ? HIDDEN_ICON_STYLE : void 0,
117
+ ref: menuIconRef,
118
+ class: "h-icon-lg w-icon-lg",
104
119
  "aria-hidden": "true",
105
120
  fill: "none",
106
121
  viewBox: "0 0 24 24",
107
122
  stroke: "currentColor",
108
- strokeWidth: 2,
123
+ "stroke-width": 2,
109
124
  children: /* @__PURE__ */ jsx(
110
125
  "path",
111
126
  {
112
- strokeLinecap: "round",
113
- strokeLinejoin: "round",
127
+ "stroke-linecap": "round",
128
+ "stroke-linejoin": "round",
114
129
  d: "M4 6h16M4 12h16M4 18h16"
115
130
  }
116
131
  )
@@ -122,26 +137,24 @@ function SidebarToggle({
122
137
  /* @__PURE__ */ jsx(
123
138
  "div",
124
139
  {
125
- className: cx("fixed inset-0 z-modal-backdrop bg-overlay/30 lg:hidden", !open && "hidden"),
126
- "aria-hidden": !open,
127
- onClick: () => setOpen(false)
140
+ class: backdropClass,
141
+ "aria-hidden": isClosed,
142
+ "on:click": () => {
143
+ open.value = false;
144
+ }
128
145
  }
129
146
  ),
130
147
  /* @__PURE__ */ jsx(
131
148
  "aside",
132
149
  {
133
- inert: !open,
150
+ inert: isClosed,
134
151
  "data-zd-mobile-sidebar": true,
135
- className: `
136
- fixed top-[3.5rem] left-0 z-modal h-[calc(100vh-3.5rem)] w-[16rem] flex flex-col
137
- border-r border-muted bg-bg transition-transform duration-200
138
- lg:hidden
139
- ${open ? "translate-x-0" : "-translate-x-full"}
140
- `,
141
- children: /* @__PURE__ */ jsx("div", { className: "flex-1 overflow-y-auto", children: /* @__PURE__ */ jsx(
152
+ class: panelClass,
153
+ children: /* @__PURE__ */ jsx("div", { class: "flex-1 overflow-y-auto", children: /* @__PURE__ */ jsx(
142
154
  SidebarTree,
143
155
  {
144
156
  nodes,
157
+ navigation,
145
158
  currentSlug,
146
159
  rootMenuItems,
147
160
  backToMenuLabel,
@@ -57,6 +57,7 @@ function buildSidebarTree(entries, locale, options = {}) {
57
57
  }
58
58
  function toSidebarNodes(parent, locale, buildHref, categoryMeta, parentSortOrder) {
59
59
  const nodes = [];
60
+ const sortPositions = /* @__PURE__ */ new WeakMap();
60
61
  for (const child of parent.children.values()) {
61
62
  const doc = child.doc;
62
63
  const meta = categoryMeta?.get(child.fullPath);
@@ -86,6 +87,7 @@ function toSidebarNodes(parent, locale, buildHref, categoryMeta, parentSortOrder
86
87
  ...href !== void 0 ? { href } : {},
87
88
  hasPage,
88
89
  ...hasSortOrder ? { sortOrder } : {},
90
+ ...meta?.collapsed !== void 0 ? { collapsed: meta.collapsed } : {},
89
91
  ...doc?.data.category_shape !== void 0 ? { shape: doc.data.category_shape } : {},
90
92
  ...doc?.data.note_tray_dated !== void 0 ? { noteTrayDated: doc.data.note_tray_dated } : {},
91
93
  ...doc?.data.note_tray_sidebar !== void 0 ? { noteTraySidebar: doc.data.note_tray_sidebar } : {},
@@ -93,15 +95,12 @@ function toSidebarNodes(parent, locale, buildHref, categoryMeta, parentSortOrder
93
95
  ...doc?.data.updated !== void 0 ? { updated: doc.data.updated } : {},
94
96
  children
95
97
  });
96
- Object.defineProperty(nodes[nodes.length - 1], "__sortPosition", {
97
- value: position,
98
- enumerable: false
99
- });
98
+ sortPositions.set(nodes[nodes.length - 1], position);
100
99
  }
101
100
  const order = parentSortOrder ?? "asc";
102
101
  nodes.sort((a, b) => {
103
- const aPos = a.__sortPosition;
104
- const bPos = b.__sortPosition;
102
+ const aPos = sortPositions.get(a);
103
+ const bPos = sortPositions.get(b);
105
104
  const posCompare = aPos - bPos;
106
105
  if (posCompare !== 0) return order === "desc" ? -posCompare : posCompare;
107
106
  const slugCompare = a.id.localeCompare(b.id);
@@ -14,6 +14,7 @@ export interface SidebarFrontmatter {
14
14
  description?: string;
15
15
  sidebar_position?: number;
16
16
  sidebar_label?: string;
17
+ sidebar_initial_expansion?: "collapsed" | "expanded";
17
18
  draft?: boolean;
18
19
  unlisted?: boolean;
19
20
  hide_sidebar?: boolean;
@@ -64,6 +65,7 @@ export interface CollectionEntryLike<T extends SidebarFrontmatter = SidebarFront
64
65
  * Metadata supplied by a directory's `_category_.json` file.
65
66
  */
66
67
  export interface CategoryMeta {
68
+ collapsed?: boolean;
67
69
  label?: string;
68
70
  position?: number;
69
71
  description?: string;