@takazudo/zudo-doc 5.28.2 → 6.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (511) hide show
  1. package/CHANGELOG.md +33 -0
  2. package/README.md +49 -16
  3. package/bin/gen-z-index.mjs +18 -18
  4. package/dist/agent-docs/identity.d.ts +4 -0
  5. package/dist/agent-docs/identity.js +24 -0
  6. package/dist/agent-docs/index.d.ts +5 -0
  7. package/dist/agent-docs/index.js +5 -0
  8. package/dist/agent-docs/limits.d.ts +11 -0
  9. package/dist/agent-docs/limits.js +24 -0
  10. package/dist/agent-docs/search.d.ts +14 -0
  11. package/dist/agent-docs/search.js +82 -0
  12. package/dist/agent-docs/tokenize.d.ts +2 -0
  13. package/dist/agent-docs/tokenize.js +22 -0
  14. package/dist/agent-docs/types.d.ts +68 -0
  15. package/dist/agent-docs/types.js +0 -0
  16. package/dist/ai-chat-modal/index.d.ts +1 -4
  17. package/dist/ai-chat-modal/index.js +183 -123
  18. package/dist/asset-components/asset-card.d.ts +1 -2
  19. package/dist/asset-components/asset-card.js +12 -12
  20. package/dist/asset-components/asset-code.d.ts +1 -2
  21. package/dist/asset-components/asset-code.js +10 -10
  22. package/dist/asset-components/shared.d.ts +3 -4
  23. package/dist/asset-components/shared.js +4 -4
  24. package/dist/asset-index-page/body.d.ts +5 -6
  25. package/dist/asset-index-page/body.js +6 -6
  26. package/dist/asset-index-page/index.d.ts +1 -2
  27. package/dist/asset-index-page/index.js +1 -1
  28. package/dist/asset-page/body.d.ts +5 -9
  29. package/dist/asset-page/body.js +3 -3
  30. package/dist/asset-page/components.d.ts +16 -17
  31. package/dist/asset-page/components.js +10 -9
  32. package/dist/asset-page/index.d.ts +1 -2
  33. package/dist/asset-page/index.js +1 -1
  34. package/dist/auto-logo/index.d.ts +1 -2
  35. package/dist/auto-logo/index.js +2 -2
  36. package/dist/body-foot-util/body-foot-util-area.d.ts +3 -4
  37. package/dist/body-foot-util/body-foot-util-area.js +1 -2
  38. package/dist/body-foot-util/edit-link.d.ts +2 -3
  39. package/dist/body-foot-util/edit-link.js +1 -2
  40. package/dist/breadcrumb/breadcrumb.d.ts +6 -6
  41. package/dist/breadcrumb/breadcrumb.js +3 -4
  42. package/dist/catalog.js +1 -1
  43. package/dist/category-nav/index.d.ts +1 -2
  44. package/dist/category-nav/index.js +11 -5
  45. package/dist/category-tree-nav/index.d.ts +1 -2
  46. package/dist/category-tree-nav/index.js +3 -3
  47. package/dist/chrome/derive.d.ts +18 -27
  48. package/dist/chrome/derive.js +47 -29
  49. package/dist/chrome/index.d.ts +5 -5
  50. package/dist/chrome/index.js +1 -1
  51. package/dist/chrome/island-data.d.ts +4 -0
  52. package/dist/chrome/island-data.js +52 -0
  53. package/dist/chrome/primary-slots.d.ts +2 -3
  54. package/dist/chrome-bindings.d.ts +30 -22
  55. package/dist/code-group/index.d.ts +3 -4
  56. package/dist/code-group/index.js +3 -7
  57. package/dist/code-syntax/code-block-enhancer.d.ts +1 -2
  58. package/dist/code-syntax/code-block-enhancer.js +2 -2
  59. package/dist/code-syntax/mermaid-init.d.ts +1 -2
  60. package/dist/code-syntax/mermaid-init.js +5 -2
  61. package/dist/code-syntax/tabs-init-script.js +1 -1
  62. package/dist/code-syntax/tabs-init.d.ts +1 -2
  63. package/dist/code-syntax/tabs-init.js +2 -2
  64. package/dist/code-syntax/tabs.d.ts +6 -6
  65. package/dist/code-syntax/tabs.js +8 -8
  66. package/dist/compiled.css +2937 -2942
  67. package/dist/config/component-tokens.d.ts +1 -1
  68. package/dist/config/component-tokens.js +22 -0
  69. package/dist/config-assertions/index.d.ts +13 -0
  70. package/dist/config-assertions/index.js +14 -0
  71. package/dist/config.d.ts +36 -17
  72. package/dist/config.js +23 -95
  73. package/dist/content/content-blockquote.d.ts +2 -3
  74. package/dist/content/content-blockquote.js +3 -3
  75. package/dist/content/content-code.d.ts +3 -4
  76. package/dist/content/content-code.js +5 -5
  77. package/dist/content/content-link.d.ts +3 -4
  78. package/dist/content/content-link.js +10 -10
  79. package/dist/content/content-ol.d.ts +2 -3
  80. package/dist/content/content-ol.js +5 -4
  81. package/dist/content/content-paragraph.d.ts +2 -3
  82. package/dist/content/content-paragraph.js +1 -1
  83. package/dist/content/content-strong.d.ts +2 -3
  84. package/dist/content/content-strong.js +3 -3
  85. package/dist/content/content-table.d.ts +2 -3
  86. package/dist/content/content-table.js +4 -4
  87. package/dist/content/content-ul.d.ts +2 -3
  88. package/dist/content/content-ul.js +4 -4
  89. package/dist/content/heading-h2.d.ts +2 -3
  90. package/dist/content/heading-h2.js +4 -4
  91. package/dist/content/heading-h3.d.ts +2 -3
  92. package/dist/content/heading-h3.js +4 -4
  93. package/dist/content/heading-h4.d.ts +2 -3
  94. package/dist/content/heading-h4.js +4 -4
  95. package/dist/content-admonition/index.d.ts +3 -4
  96. package/dist/content-admonition/index.js +2 -2
  97. package/dist/content.css +35 -33
  98. package/dist/design-token-panel-bootstrap-controller.d.ts +178 -0
  99. package/dist/design-token-panel-bootstrap-controller.js +359 -0
  100. package/dist/design-token-panel-bootstrap-island.d.ts +5 -0
  101. package/dist/design-token-panel-bootstrap-island.js +19 -0
  102. package/dist/design-token-panel-bootstrap.d.ts +5 -195
  103. package/dist/design-token-panel-bootstrap.js +3 -288
  104. package/dist/desktop-sidebar-toggle-island/index.d.ts +2 -7
  105. package/dist/desktop-sidebar-toggle-island/index.js +2 -58
  106. package/dist/desktop-sidebar-toggle-island/island.d.ts +4 -0
  107. package/dist/desktop-sidebar-toggle-island/island.js +43 -0
  108. package/dist/desktop-sidebar-toggle-island/storage.d.ts +4 -0
  109. package/dist/desktop-sidebar-toggle-island/storage.js +29 -0
  110. package/dist/desktop-toc-toggle-island/index.d.ts +2 -7
  111. package/dist/desktop-toc-toggle-island/index.js +2 -58
  112. package/dist/desktop-toc-toggle-island/island.d.ts +4 -0
  113. package/dist/desktop-toc-toggle-island/island.js +43 -0
  114. package/dist/desktop-toc-toggle-island/storage.d.ts +4 -0
  115. package/dist/desktop-toc-toggle-island/storage.js +29 -0
  116. package/dist/details/details.d.ts +3 -4
  117. package/dist/details/details.js +1 -1
  118. package/dist/doc-body-end/index.d.ts +1 -2
  119. package/dist/doc-body-end/index.js +1 -1
  120. package/dist/doc-body-end-islands/design-token-panel-island.d.ts +2 -2
  121. package/dist/doc-body-end-islands/design-token-panel-island.js +3 -7
  122. package/dist/doc-body-end-islands/index.d.ts +4 -21
  123. package/dist/doc-body-end-islands/index.js +5 -3
  124. package/dist/doc-body-end-islands/theme-pack-switcher-island.d.ts +3 -13
  125. package/dist/doc-body-end-islands/theme-pack-switcher-island.js +11 -13
  126. package/dist/doc-content-header/index.d.ts +1 -2
  127. package/dist/doc-content-header/index.js +1 -1
  128. package/dist/doc-history/index.d.ts +1 -1
  129. package/dist/doc-history/index.js +166 -141
  130. package/dist/doc-history-area/index.d.ts +6 -4
  131. package/dist/doc-history-area/index.js +17 -16
  132. package/dist/doc-metainfo-area/index.d.ts +2 -3
  133. package/dist/doc-metainfo-area/index.js +1 -1
  134. package/dist/doc-page-renderer/index.d.ts +13 -7
  135. package/dist/doc-page-renderer/index.js +10 -1
  136. package/dist/doc-page-shell/index.d.ts +20 -7
  137. package/dist/doc-page-shell/index.js +17 -6
  138. package/dist/doc-pager/index.d.ts +1 -2
  139. package/dist/doc-pager/index.js +3 -3
  140. package/dist/doc-tags-area/index.d.ts +2 -3
  141. package/dist/doc-tags-area/index.js +1 -1
  142. package/dist/doclayout/doc-layout-with-defaults.d.ts +9 -9
  143. package/dist/doclayout/doc-layout-with-defaults.js +5 -15
  144. package/dist/doclayout/doc-layout.d.ts +26 -27
  145. package/dist/doclayout/doc-layout.js +23 -14
  146. package/dist/docs-schema/index.d.ts +4 -0
  147. package/dist/docs-schema/index.js +1 -0
  148. package/dist/extract-headings/index.js +43 -12
  149. package/dist/factory-context/index.d.ts +22 -19
  150. package/dist/features.css +75 -8
  151. package/dist/find-in-page/find-bar.d.ts +4 -2
  152. package/dist/find-in-page/find-bar.js +58 -69
  153. package/dist/find-in-page/index.d.ts +2 -8
  154. package/dist/find-in-page/index.js +33 -30
  155. package/dist/footer/footer.d.ts +3 -4
  156. package/dist/footer/footer.js +3 -3
  157. package/dist/footer-with-defaults/index.d.ts +2 -3
  158. package/dist/footer-with-defaults/index.js +1 -1
  159. package/dist/frontmatter-preview-defaults/index.js +1 -0
  160. package/dist/head/doc-head.d.ts +1 -1
  161. package/dist/head/doc-head.js +24 -32
  162. package/dist/head/og-tags.d.ts +1 -1
  163. package/dist/head/og-tags.js +8 -7
  164. package/dist/head/twitter-card.d.ts +1 -1
  165. package/dist/head/twitter-card.js +1 -1
  166. package/dist/head-with-defaults/index.d.ts +7 -2
  167. package/dist/head-with-defaults/index.js +46 -32
  168. package/dist/header/header.d.ts +8 -8
  169. package/dist/header/header.js +9 -11
  170. package/dist/header/types.d.ts +7 -7
  171. package/dist/header-with-defaults/index.d.ts +3 -4
  172. package/dist/header-with-defaults/index.js +27 -14
  173. package/dist/home-intro/index.d.ts +2 -5
  174. package/dist/home-intro/index.js +7 -5
  175. package/dist/home-intro/prepare.js +4 -3
  176. package/dist/home-page/index.d.ts +3 -3
  177. package/dist/home-page/index.js +19 -17
  178. package/dist/html-preview-wrapper/highlighted-code.d.ts +3 -4
  179. package/dist/html-preview-wrapper/highlighted-code.js +19 -17
  180. package/dist/html-preview-wrapper/html-preview-wrapper.d.ts +4 -25
  181. package/dist/html-preview-wrapper/html-preview-wrapper.js +2 -87
  182. package/dist/html-preview-wrapper/html-preview.d.ts +3 -10
  183. package/dist/html-preview-wrapper/html-preview.js +13 -37
  184. package/dist/html-preview-wrapper/index.d.ts +2 -1
  185. package/dist/html-preview-wrapper/index.js +1 -1
  186. package/dist/html-preview-wrapper/preview-base.d.ts +3 -5
  187. package/dist/html-preview-wrapper/preview-base.js +56 -59
  188. package/dist/html-preview-wrapper/wrapper.d.ts +20 -0
  189. package/dist/html-preview-wrapper/wrapper.js +37 -0
  190. package/dist/hydration-pending.d.ts +3 -5
  191. package/dist/hydration-pending.js +7 -5
  192. package/dist/i18n-version/language-switcher.d.ts +5 -32
  193. package/dist/i18n-version/language-switcher.js +5 -106
  194. package/dist/i18n-version/switcher-generated-scripts.d.ts +2 -0
  195. package/dist/i18n-version/switcher-generated-scripts.js +107 -0
  196. package/dist/i18n-version/switcher-url-state.d.ts +76 -0
  197. package/dist/i18n-version/switcher-url-state.js +103 -0
  198. package/dist/i18n-version/version-banner.d.ts +2 -3
  199. package/dist/i18n-version/version-banner.js +1 -1
  200. package/dist/i18n-version/version-switcher.d.ts +5 -50
  201. package/dist/i18n-version/version-switcher.js +5 -157
  202. package/dist/icons/index.d.ts +18 -19
  203. package/dist/icons/index.js +17 -33
  204. package/dist/image-enlarge/index.d.ts +1 -10
  205. package/dist/image-enlarge/index.js +80 -55
  206. package/dist/image-enlarge/public.d.ts +2 -0
  207. package/dist/image-enlarge/public.js +6 -0
  208. package/dist/image-enlarge/ssr-fallback.d.ts +2 -0
  209. package/dist/image-enlarge/ssr-fallback.js +8 -0
  210. package/dist/index.d.ts +11 -4
  211. package/dist/inline-version-switcher/index.d.ts +1 -2
  212. package/dist/inline-version-switcher/index.js +1 -1
  213. package/dist/island-types/index.d.ts +2 -2
  214. package/dist/island-types/index.js +1 -5
  215. package/dist/math-block/index.d.ts +4 -7
  216. package/dist/math-block/index.js +5 -5
  217. package/dist/mcp/handler.d.ts +8 -0
  218. package/dist/mcp/handler.js +129 -0
  219. package/dist/mcp/index.d.ts +4 -0
  220. package/dist/mcp/index.js +7 -0
  221. package/dist/mcp/loader.d.ts +19 -0
  222. package/dist/mcp/loader.js +202 -0
  223. package/dist/mdx-components/index.js +40 -108
  224. package/dist/mermaid-enlarge/index.d.ts +1 -8
  225. package/dist/mermaid-enlarge/index.js +174 -158
  226. package/dist/mermaid-enlarge/public.d.ts +2 -0
  227. package/dist/mermaid-enlarge/public.js +6 -0
  228. package/dist/mermaid-enlarge/ssr-fallback.d.ts +2 -0
  229. package/dist/mermaid-enlarge/ssr-fallback.js +8 -0
  230. package/dist/metainfo/doc-metainfo.d.ts +2 -3
  231. package/dist/metainfo/doc-metainfo.js +1 -4
  232. package/dist/metainfo/doc-tags.d.ts +2 -3
  233. package/dist/metainfo/doc-tags.js +1 -1
  234. package/dist/metainfo/frontmatter-preview.d.ts +3 -4
  235. package/dist/metainfo/frontmatter-preview.js +1 -1
  236. package/dist/nav-data-prep/index.js +6 -4
  237. package/dist/nav-indexing/category-nav.d.ts +2 -3
  238. package/dist/nav-indexing/category-nav.js +1 -2
  239. package/dist/nav-indexing/category-tree-nav.d.ts +2 -3
  240. package/dist/nav-indexing/category-tree-nav.js +1 -1
  241. package/dist/nav-indexing/doc-card-grid.d.ts +2 -3
  242. package/dist/nav-indexing/doc-card-grid.js +1 -2
  243. package/dist/nav-indexing/docs-sitemap.d.ts +2 -3
  244. package/dist/nav-indexing/docs-sitemap.js +2 -2
  245. package/dist/nav-indexing/index.d.ts +1 -1
  246. package/dist/nav-indexing/nav-card-grid.d.ts +2 -3
  247. package/dist/nav-indexing/nav-card-grid.js +1 -2
  248. package/dist/nav-indexing/note-tray-index-parts/card-list.d.ts +1 -2
  249. package/dist/nav-indexing/note-tray-index-parts/card-list.js +4 -4
  250. package/dist/nav-indexing/note-tray-index-parts/date-line.d.ts +2 -3
  251. package/dist/nav-indexing/note-tray-index-parts/date-line.js +1 -1
  252. package/dist/nav-indexing/note-tray-index-parts/index-list.d.ts +1 -2
  253. package/dist/nav-indexing/note-tray-index-parts/index-list.js +2 -2
  254. package/dist/nav-indexing/note-tray-index-parts/timeline.d.ts +1 -2
  255. package/dist/nav-indexing/note-tray-index-parts/timeline.js +2 -2
  256. package/dist/nav-indexing/note-tray-index.d.ts +1 -2
  257. package/dist/nav-indexing/note-tray-index.js +1 -1
  258. package/dist/nav-indexing/site-tree-nav-demo.d.ts +2 -3
  259. package/dist/nav-indexing/site-tree-nav-demo.js +2 -2
  260. package/dist/nav-indexing/tag-nav.d.ts +1 -2
  261. package/dist/nav-indexing/tag-nav.js +1 -1
  262. package/dist/nav-indexing/types.d.ts +2 -2
  263. package/dist/nav-indexing/versions-page-content.d.ts +2 -3
  264. package/dist/nav-indexing/versions-page-content.js +8 -8
  265. package/dist/note-tray-index/index.d.ts +1 -2
  266. package/dist/note-tray-index/index.js +1 -1
  267. package/dist/page-loading/page-loading-overlay.d.ts +1 -2
  268. package/dist/page-loading/page-loading-overlay.js +3 -5
  269. package/dist/plugins/agent-export.d.ts +3 -0
  270. package/dist/plugins/agent-export.js +34 -0
  271. package/dist/plugins/internal/agent-export/chunk.d.ts +5 -0
  272. package/dist/plugins/internal/agent-export/chunk.js +90 -0
  273. package/dist/plugins/internal/agent-export/index.d.ts +24 -0
  274. package/dist/plugins/internal/agent-export/index.js +123 -0
  275. package/dist/plugins/internal/agent-export/normalize.d.ts +5 -0
  276. package/dist/plugins/internal/agent-export/normalize.js +73 -0
  277. package/dist/plugins/internal/llms-txt/dev-middleware.d.ts +6 -0
  278. package/dist/plugins/internal/llms-txt/dev-middleware.js +8 -3
  279. package/dist/plugins/internal/llms-txt/emit.js +23 -6
  280. package/dist/plugins/internal/llms-txt/generate.d.ts +7 -1
  281. package/dist/plugins/internal/llms-txt/generate.js +9 -2
  282. package/dist/plugins/internal/llms-txt/load.d.ts +2 -0
  283. package/dist/plugins/internal/llms-txt/load.js +20 -4
  284. package/dist/plugins/internal/llms-txt/types.d.ts +10 -0
  285. package/dist/plugins/routes.js +4 -0
  286. package/dist/preset.d.ts +19 -9
  287. package/dist/preset.js +20 -1
  288. package/dist/route-context-payload/index.js +1 -1
  289. package/dist/routes/404.d.ts +2 -3
  290. package/dist/routes/404.js +1 -1
  291. package/dist/routes/_chrome.d.ts +5 -5
  292. package/dist/routes/_chrome.js +7 -2
  293. package/dist/routes/_context.d.ts +4 -4
  294. package/dist/routes/_design-token-panel-bootstrap.d.ts +1 -4
  295. package/dist/routes/_design-token-panel-bootstrap.js +9 -1
  296. package/dist/routes/docs-slug.d.ts +2 -3
  297. package/dist/routes/docs-tags-index.d.ts +2 -3
  298. package/dist/routes/docs-tags-index.js +1 -1
  299. package/dist/routes/docs-tags-tag.d.ts +2 -3
  300. package/dist/routes/docs-tags-tag.js +1 -1
  301. package/dist/routes/docs-versions.d.ts +2 -3
  302. package/dist/routes/docs-versions.js +1 -1
  303. package/dist/routes/files-path.d.ts +2 -3
  304. package/dist/routes/files-path.js +1 -1
  305. package/dist/routes/index.d.ts +2 -3
  306. package/dist/routes/index.js +1 -1
  307. package/dist/routes/locale-docs-slug.d.ts +2 -3
  308. package/dist/routes/locale-docs-tags-index.d.ts +2 -3
  309. package/dist/routes/locale-docs-tags-index.js +1 -1
  310. package/dist/routes/locale-docs-tags-tag.d.ts +2 -3
  311. package/dist/routes/locale-docs-tags-tag.js +1 -1
  312. package/dist/routes/locale-docs-versions.d.ts +2 -3
  313. package/dist/routes/locale-docs-versions.js +1 -1
  314. package/dist/routes/locale-files-path.d.ts +2 -3
  315. package/dist/routes/locale-files-path.js +1 -1
  316. package/dist/routes/locale-index.d.ts +2 -3
  317. package/dist/routes/locale-index.js +1 -1
  318. package/dist/routes/mcp.d.ts +5 -0
  319. package/dist/routes/mcp.js +25 -0
  320. package/dist/routes/v-docs-slug.d.ts +2 -3
  321. package/dist/routes/v-locale-docs-slug.d.ts +2 -3
  322. package/dist/search-widget/index.d.ts +1 -2
  323. package/dist/search-widget/index.js +4 -7
  324. package/dist/search-widget-script/generated-script.js +12 -5
  325. package/dist/settings-defaults.d.ts +2 -0
  326. package/dist/settings-defaults.js +93 -0
  327. package/dist/settings.d.ts +8 -2
  328. package/dist/sidebar/client-data.d.ts +18 -0
  329. package/dist/sidebar/client-data.js +47 -0
  330. package/dist/sidebar/index.d.ts +3 -1
  331. package/dist/sidebar/index.js +3 -1
  332. package/dist/sidebar/sidebar.d.ts +12 -44
  333. package/dist/sidebar/sidebar.js +4 -3
  334. package/dist/sidebar/types.d.ts +14 -0
  335. package/dist/sidebar-prepaint/index.d.ts +1 -2
  336. package/dist/sidebar-prepaint/index.js +4 -6
  337. package/dist/sidebar-resizer/sidebar-resizer-init.d.ts +2 -3
  338. package/dist/sidebar-resizer/sidebar-resizer-init.js +3 -3
  339. package/dist/sidebar-toggle-island/index.d.ts +8 -11
  340. package/dist/sidebar-toggle-island/index.js +75 -62
  341. package/dist/sidebar-tree/build-tree.js +5 -6
  342. package/dist/sidebar-tree/types.d.ts +2 -0
  343. package/dist/sidebar-tree-island/index.d.ts +4 -19
  344. package/dist/sidebar-tree-island/index.js +782 -436
  345. package/dist/sidebar-tree-island/scope-state.d.ts +38 -0
  346. package/dist/sidebar-tree-island/scope-state.js +151 -0
  347. package/dist/sidebar-tree-island/sidebar-scroll-preserve.js +6 -2
  348. package/dist/sidebar-utils/index.d.ts +17 -19
  349. package/dist/sidebar-utils/index.js +100 -3
  350. package/dist/sidebar-utils/scope.d.ts +11 -0
  351. package/dist/sidebar-utils/scope.js +67 -0
  352. package/dist/sidebar-with-defaults/index.d.ts +1 -2
  353. package/dist/sidebar-with-defaults/index.js +19 -18
  354. package/dist/site-schema/nav-tree.js +15 -15
  355. package/dist/site-schema/types.d.ts +1 -0
  356. package/dist/site-tree-nav/index.d.ts +2 -3
  357. package/dist/site-tree-nav/index.js +11 -12
  358. package/dist/site-tree-nav/normalize-island-props.d.ts +16 -0
  359. package/dist/site-tree-nav/normalize-island-props.js +122 -0
  360. package/dist/site-tree-nav-island/index.d.ts +3 -3
  361. package/dist/site-tree-nav-island/index.js +243 -144
  362. package/dist/smart-break/index.d.ts +3 -4
  363. package/dist/smart-break/index.js +1 -1
  364. package/dist/tab-item/tab-item.d.ts +3 -4
  365. package/dist/tab-item/tab-item.js +1 -1
  366. package/dist/tag-pages/index.d.ts +3 -3
  367. package/dist/tag-pages/index.js +10 -10
  368. package/dist/theme/color-scheme-provider.d.ts +3 -3
  369. package/dist/theme/color-scheme-provider.js +3 -3
  370. package/dist/theme/theme-pack-provider.d.ts +1 -1
  371. package/dist/theme/theme-pack-provider.js +3 -3
  372. package/dist/theme/theme-toggle.d.ts +2 -3
  373. package/dist/theme/theme-toggle.js +1 -1
  374. package/dist/theme-pack-dialog/index.d.ts +1 -1
  375. package/dist/theme-pack-dialog/index.js +69 -75
  376. package/dist/theme-pack-dialog/theme-pack-card.d.ts +3 -4
  377. package/dist/theme-pack-dialog/theme-pack-card.js +19 -17
  378. package/dist/theme-pack-switcher/index.d.ts +4 -5
  379. package/dist/theme-pack-switcher/index.js +52 -49
  380. package/dist/theme-packs/academia/meta.json +1 -1
  381. package/dist/theme-packs/academia/pack.css +1 -1
  382. package/dist/theme-packs/bauhaus/meta.json +1 -1
  383. package/dist/theme-packs/bauhaus/pack.css +2 -2
  384. package/dist/theme-packs/blueprint/meta.json +1 -1
  385. package/dist/theme-packs/blueprint/pack.css +2 -2
  386. package/dist/theme-packs/botanica/meta.json +1 -1
  387. package/dist/theme-packs/botanica/pack.css +2 -2
  388. package/dist/theme-packs/broadsheet/meta.json +1 -1
  389. package/dist/theme-packs/broadsheet/pack.css +2 -2
  390. package/dist/theme-packs/brutalist/meta.json +1 -1
  391. package/dist/theme-packs/brutalist/pack.css +2 -2
  392. package/dist/theme-packs/eink/meta.json +1 -1
  393. package/dist/theme-packs/eink/pack.css +1 -1
  394. package/dist/theme-packs/futura-editorial/meta.json +1 -1
  395. package/dist/theme-packs/futura-editorial/pack.css +2 -2
  396. package/dist/theme-packs/hearth/meta.json +1 -1
  397. package/dist/theme-packs/hearth/pack.css +2 -2
  398. package/dist/theme-packs/ledger/meta.json +1 -1
  399. package/dist/theme-packs/ledger/pack.css +1 -1
  400. package/dist/theme-packs/manuscript/meta.json +1 -1
  401. package/dist/theme-packs/manuscript/pack.css +1 -1
  402. package/dist/theme-packs/matcha/meta.json +1 -1
  403. package/dist/theme-packs/matcha/pack.css +2 -2
  404. package/dist/theme-packs/nocturne/meta.json +1 -1
  405. package/dist/theme-packs/nocturne/pack.css +2 -2
  406. package/dist/theme-packs/observatory/meta.json +1 -1
  407. package/dist/theme-packs/observatory/pack.css +2 -2
  408. package/dist/theme-packs/onyx/meta.json +1 -1
  409. package/dist/theme-packs/onyx/pack.css +2 -2
  410. package/dist/theme-packs/phosphor/meta.json +1 -1
  411. package/dist/theme-packs/phosphor/pack.css +2 -2
  412. package/dist/theme-packs/riso/meta.json +1 -1
  413. package/dist/theme-packs/riso/pack.css +2 -2
  414. package/dist/theme-packs/sakura/meta.json +1 -1
  415. package/dist/theme-packs/sakura/pack.css +2 -2
  416. package/dist/theme-packs/scandi/meta.json +1 -1
  417. package/dist/theme-packs/scandi/pack.css +1 -1
  418. package/dist/theme-packs/solar/meta.json +1 -1
  419. package/dist/theme-packs/solar/pack.css +1 -1
  420. package/dist/theme-packs/sumi/meta.json +1 -1
  421. package/dist/theme-packs/sumi/pack.css +2 -2
  422. package/dist/theme-packs/swissgrid/meta.json +1 -1
  423. package/dist/theme-packs/swissgrid/pack.css +1 -1
  424. package/dist/theme-packs/timberline/meta.json +1 -1
  425. package/dist/theme-packs/timberline/pack.css +2 -2
  426. package/dist/theme-packs/washi/meta.json +1 -1
  427. package/dist/theme-packs/washi/pack.css +2 -2
  428. package/dist/theme-toggle/index.d.ts +1 -1
  429. package/dist/theme-toggle/index.js +154 -167
  430. package/dist/theme.css +47 -121
  431. package/dist/toc/mobile-toc.d.ts +3 -5
  432. package/dist/toc/mobile-toc.js +29 -27
  433. package/dist/toc/toc.d.ts +3 -4
  434. package/dist/toc/toc.js +18 -18
  435. package/dist/toc/use-active-heading.d.ts +5 -4
  436. package/dist/toc/use-active-heading.js +36 -30
  437. package/dist/toc-prepaint/index.d.ts +1 -2
  438. package/dist/toc-prepaint/index.js +4 -6
  439. package/dist/transitions/nested-island-props-refresh.d.ts +3 -16
  440. package/dist/transitions/nested-island-props-refresh.js +133 -151
  441. package/dist/transitions/page-events.d.ts +8 -13
  442. package/dist/tree-nav-shared/index.d.ts +4 -5
  443. package/dist/tree-nav-shared/index.js +6 -7
  444. package/dist/use-modal-dialog/index.d.ts +9 -63
  445. package/dist/use-modal-dialog/index.js +41 -59
  446. package/dist/versions-page/index.d.ts +3 -3
  447. package/dist/versions-page/index.js +5 -5
  448. package/dist/wind/index.d.ts +5 -0
  449. package/dist/wind/index.js +169 -0
  450. package/dist/wind.json +498 -0
  451. package/dist/z-index-defaults/index.d.ts +4 -4
  452. package/dist/zdtp-loader.d.ts +7 -0
  453. package/dist/zdtp-loader.js +8 -0
  454. package/eject/asset-components/asset-card.tsx +14 -16
  455. package/eject/asset-components/asset-code.tsx +10 -12
  456. package/eject/asset-components/shared.tsx +5 -7
  457. package/eject/breadcrumb/breadcrumb.tsx +15 -16
  458. package/eject/code-group/index.tsx +4 -10
  459. package/eject/content-admonition/index.tsx +5 -6
  460. package/eject/desktop-sidebar-toggle-island/index.ts +4 -0
  461. package/eject/desktop-sidebar-toggle-island/island.tsx +50 -0
  462. package/eject/desktop-sidebar-toggle-island/storage.ts +27 -0
  463. package/eject/details/details.tsx +3 -5
  464. package/eject/doc-history/index.tsx +193 -179
  465. package/eject/doc-pager/index.tsx +3 -4
  466. package/eject/footer/footer.tsx +7 -9
  467. package/eject/header/header.tsx +42 -54
  468. package/eject/header/nav-overflow-script.ts +1 -1
  469. package/eject/header/types.ts +12 -13
  470. package/eject/image-enlarge/index.tsx +84 -69
  471. package/eject/image-enlarge/public.ts +2 -0
  472. package/eject/image-enlarge/ssr-fallback.tsx +7 -0
  473. package/eject/page-loading/page-loading-overlay.tsx +8 -15
  474. package/eject/sidebar/client-data.ts +68 -0
  475. package/eject/sidebar/index.ts +3 -0
  476. package/eject/sidebar/sidebar.tsx +16 -97
  477. package/eject/sidebar/types.ts +15 -0
  478. package/eject/sidebar-toggle-island/index.tsx +103 -102
  479. package/eject/sidebar-tree-island/index.tsx +827 -615
  480. package/eject/sidebar-tree-island/scope-state.ts +154 -0
  481. package/eject/sidebar-tree-island/sidebar-scroll-preserve.ts +8 -2
  482. package/eject/site-tree-nav-island/index.tsx +349 -222
  483. package/eject/tab-item/tab-item.tsx +2 -4
  484. package/eject/theme-toggle/hydration-pending.ts +6 -10
  485. package/eject/theme-toggle/index.tsx +133 -173
  486. package/eject/toc/mobile-toc.tsx +27 -31
  487. package/eject/toc/toc.tsx +21 -24
  488. package/eject/toc/use-active-heading.ts +43 -38
  489. package/package.json +40 -22
  490. package/routes-src/404.tsx +2 -3
  491. package/routes-src/_chrome.tsx +7 -2
  492. package/routes-src/_design-token-panel-bootstrap.tsx +1 -63
  493. package/routes-src/docs-slug.tsx +2 -3
  494. package/routes-src/docs-tags-index.tsx +2 -3
  495. package/routes-src/docs-tags-tag.tsx +2 -3
  496. package/routes-src/docs-versions.tsx +2 -3
  497. package/routes-src/files-path.tsx +2 -4
  498. package/routes-src/index.tsx +2 -3
  499. package/routes-src/locale-docs-slug.tsx +2 -3
  500. package/routes-src/locale-docs-tags-index.tsx +2 -3
  501. package/routes-src/locale-docs-tags-tag.tsx +2 -3
  502. package/routes-src/locale-docs-versions.tsx +2 -3
  503. package/routes-src/locale-files-path.tsx +2 -4
  504. package/routes-src/locale-index.tsx +2 -3
  505. package/routes-src/mcp.tsx +25 -0
  506. package/routes-src/v-docs-slug.tsx +2 -3
  507. package/routes-src/v-locale-docs-slug.tsx +2 -3
  508. package/tsconfig.base.json +1 -1
  509. package/dist/safelist.css +0 -2
  510. package/dist/theme-no-reset.css +0 -379
  511. package/eject/desktop-sidebar-toggle-island/index.tsx +0 -110
@@ -0,0 +1,38 @@
1
+ import { type ReadonlySignal, type Ref } from "@takazudo/zfb/zudo-react";
2
+ import type { SidebarNavNode, SidebarNavigationContext } from "../sidebar/types.js";
3
+ export interface ScopeControls {
4
+ focus: (node: SidebarNavNode) => void;
5
+ focusLabel: string;
6
+ expansion: {
7
+ value: Record<string, boolean>;
8
+ };
9
+ reveal: ReadonlySignal<number>;
10
+ save: () => void;
11
+ defaultOpen: (node: SidebarNavNode) => boolean;
12
+ defaultGroupOpen: (items: SidebarNavNode[]) => boolean;
13
+ }
14
+ /** One controller shared by the real desktop tree and mobile drawer. SSR always
15
+ * starts with configured roots; session state is applied only on activation. */
16
+ export declare function useSidebarScope({ nodes, navigation, activeSlug, query, locale }: {
17
+ nodes: SidebarNavNode[];
18
+ navigation?: SidebarNavigationContext;
19
+ activeSlug: ReadonlySignal<string | undefined>;
20
+ query: {
21
+ value: string;
22
+ };
23
+ locale: string;
24
+ }): {
25
+ selected: import("@takazudo/zfb/zudo-react").Signal<string | null>;
26
+ selectedNodes: ReadonlySignal<SidebarNavNode[]>;
27
+ broader: ReadonlySignal<string | null>;
28
+ labels: {
29
+ broaden: string;
30
+ restore: string;
31
+ focus: string;
32
+ };
33
+ canRestore: ReadonlySignal<boolean>;
34
+ changeScope: (id: string | null) => void;
35
+ save: () => void;
36
+ navRef: Ref<HTMLElement>;
37
+ scopeControls: ScopeControls | undefined;
38
+ };
@@ -0,0 +1,151 @@
1
+ import { computed, getScope, signal } from "@takazudo/zfb/zudo-react";
2
+ import { broaderSidebarScope, sidebarScopeNodes, reconcileSidebarScope, indexSidebarOccurrences, sidebarInitialExpansion, sidebarBaselineOpen, SIDEBAR_FOREST_SCOPE } from "../sidebar-utils/index.js";
3
+ import { getNoteTrayItems, groupItems } from "../note-tray-model/index.js";
4
+ import { AFTER_NAVIGATE_EVENT } from "../transitions/index.js";
5
+ function useSidebarScope({ nodes, navigation, activeSlug, query, locale }) {
6
+ const selected = signal(null);
7
+ const expansion = signal({});
8
+ const reveal = signal(0);
9
+ let lastPage = activeSlug.value;
10
+ const navRef = { current: null };
11
+ const stateKey = "zd-sidebar-scope";
12
+ const syncEvent = "zd:sidebar-scope";
13
+ const labels = locale === "ja" ? {
14
+ broaden: "\u30C4\u30EA\u30FC\u3092\u5E83\u3052\u308B",
15
+ restore: "\u73FE\u5728\u306E\u30DA\u30FC\u30B8\u306E\u30C4\u30EA\u30FC\u306B\u623B\u3059",
16
+ focus: "\u3053\u306E\u679D\u3060\u3051\u3092\u8868\u793A"
17
+ } : {
18
+ broaden: "Broaden tree",
19
+ restore: "Restore current page\u2019s local tree",
20
+ focus: "Show only this branch"
21
+ };
22
+ const selectedNodes = computed(() => navigation ? sidebarScopeNodes(navigation, nodes, selected.value) : nodes);
23
+ const broader = computed(() => navigation ? broaderSidebarScope(navigation, nodes, selected.value) : null);
24
+ const occurrenceIndex = navigation ? indexSidebarOccurrences(navigation.roots) : /* @__PURE__ */ new Map();
25
+ const trayGroups = [...occurrenceIndex].flatMap(([id, node]) => {
26
+ const grouping = node.noteTraySidebar;
27
+ if (node.shape !== "note-tray" || !grouping || grouping === "index") return [];
28
+ return groupItems(getNoteTrayItems(node), grouping, node.sortOrder ?? "asc").map((group) => ({ key: `${id}#${group.key}`, items: group.items }));
29
+ });
30
+ const groupKeys = new Set(trayGroups.map((group) => group.key));
31
+ const defaultOpen = (node) => sidebarBaselineOpen(node, navigation ? sidebarInitialExpansion(navigation, activeSlug.value) : void 0, activeSlug.value);
32
+ const defaultGroupOpen = (items) => items.some((item) => item.slug === activeSlug.value) || !!navigation && sidebarInitialExpansion(navigation, activeSlug.value) === "expanded";
33
+ const canRestore = computed(() => {
34
+ if (JSON.stringify(selectedNodes.value) !== JSON.stringify(nodes)) return true;
35
+ for (const [id, node] of occurrenceIndex) {
36
+ if (node.children.length && (expansion.value[id] ?? defaultOpen(node)) !== defaultOpen(node)) return true;
37
+ }
38
+ return trayGroups.some((group) => (expansion.value[group.key] ?? defaultGroupOpen(group.items)) !== defaultGroupOpen(group.items));
39
+ });
40
+ const revealPath = (id) => {
41
+ if (!navigation) return;
42
+ const next = { ...expansion.value };
43
+ for (const [key, node] of occurrenceIndex) {
44
+ if (node.slug !== activeSlug.value && key !== id) continue;
45
+ let ancestor = key;
46
+ while (ancestor) {
47
+ next[ancestor] = true;
48
+ ancestor = navigation.parents[ancestor];
49
+ }
50
+ }
51
+ for (const group of trayGroups) {
52
+ if (group.items.some((item) => item.slug === activeSlug.value)) next[group.key] = true;
53
+ }
54
+ expansion.value = next;
55
+ reveal.value++;
56
+ };
57
+ const save = () => {
58
+ if (!navigation) return;
59
+ try {
60
+ sessionStorage.setItem(stateKey, JSON.stringify({ context: navigation.id, page: activeSlug.value, selected: selected.value, query: query.value, expansion: expansion.value }));
61
+ } catch {
62
+ }
63
+ document.dispatchEvent(new CustomEvent(syncEvent, { detail: { context: navigation.id, page: activeSlug.value, selected: selected.value, query: query.value, expansion: expansion.value } }));
64
+ };
65
+ const changeScope = (id) => {
66
+ const previous = selected.value;
67
+ selected.value = navigation && JSON.stringify(sidebarScopeNodes(navigation, nodes, id)) === JSON.stringify(nodes) ? null : id;
68
+ if (id === null) {
69
+ expansion.value = {};
70
+ revealPath();
71
+ } else {
72
+ revealPath(previous);
73
+ revealPath(id);
74
+ }
75
+ save();
76
+ queueMicrotask(() => {
77
+ const nav = navRef.current;
78
+ const controls = [...nav?.querySelectorAll("[data-sidebar-focus]") ?? []];
79
+ const activeBranch = controls.reverse().find((button) => {
80
+ const node = occurrenceIndex.get(button.dataset.sidebarFocusScope ?? "");
81
+ const contains = (n) => n.slug === activeSlug.value || n.children.some(contains);
82
+ return node && contains(node);
83
+ });
84
+ const rootLink = id && id !== SIDEBAR_FOREST_SCOPE && broader.value !== null ? nav?.querySelector("[data-sidebar-tree-root] a") : null;
85
+ const currentLink = nav?.querySelector('[aria-current="page"]');
86
+ const control = (id === null ? currentLink : rootLink) ?? nav?.querySelector("[data-sidebar-broaden]") ?? activeBranch ?? currentLink ?? nav?.querySelector("[data-sidebar-focus], [data-sidebar-tree-root] a, input");
87
+ const target = control;
88
+ let viewport = nav?.parentElement;
89
+ while (viewport && viewport !== document.body && viewport.scrollHeight <= viewport.clientHeight) viewport = viewport.parentElement;
90
+ if (target && viewport && viewport !== document.body) {
91
+ const row = target.getBoundingClientRect();
92
+ const bounds = viewport.getBoundingClientRect();
93
+ if (row.top < bounds.top) viewport.scrollTop += row.top - bounds.top - 8;
94
+ else if (row.bottom > bounds.bottom) viewport.scrollTop += row.bottom - bounds.bottom + 8;
95
+ }
96
+ control?.focus({ preventScroll: true });
97
+ });
98
+ };
99
+ const scopeControls = navigation ? {
100
+ focus: (node) => {
101
+ if (node.occurrenceId) changeScope(node.occurrenceId);
102
+ },
103
+ focusLabel: labels.focus,
104
+ expansion,
105
+ reveal,
106
+ defaultOpen,
107
+ defaultGroupOpen,
108
+ save
109
+ } : void 0;
110
+ getScope().onActivate(() => {
111
+ if (!navigation) return;
112
+ lastPage = activeSlug.value;
113
+ try {
114
+ const stored = JSON.parse(sessionStorage.getItem(stateKey) ?? "null");
115
+ if (stored?.context === navigation.id) {
116
+ const candidate = typeof stored.selected === "string" ? stored.selected : null;
117
+ const valid = candidate === SIDEBAR_FOREST_SCOPE || candidate !== null && occurrenceIndex.has(candidate) ? candidate : null;
118
+ selected.value = stored.page === activeSlug.value ? valid : reconcileSidebarScope(navigation, nodes, valid, activeSlug.value);
119
+ query.value = typeof stored.query === "string" ? stored.query : "";
120
+ if (stored.expansion && typeof stored.expansion === "object") expansion.value = Object.fromEntries(Object.entries(stored.expansion).filter(([id, value]) => (occurrenceIndex.has(id) || groupKeys.has(id)) && typeof value === "boolean"));
121
+ if (stored.page !== activeSlug.value) revealPath(selected.value);
122
+ }
123
+ } catch {
124
+ }
125
+ save();
126
+ const sync = (event) => {
127
+ const state = event.detail;
128
+ if (state?.context !== navigation.id || state.page !== activeSlug.value) return;
129
+ selected.value = state.selected;
130
+ query.value = state.query;
131
+ expansion.value = state.expansion;
132
+ };
133
+ const navigate = () => {
134
+ if (lastPage === activeSlug.value) return;
135
+ lastPage = activeSlug.value;
136
+ selected.value = reconcileSidebarScope(navigation, nodes, selected.value, activeSlug.value);
137
+ revealPath(selected.value);
138
+ save();
139
+ };
140
+ document.addEventListener(syncEvent, sync);
141
+ document.addEventListener(AFTER_NAVIGATE_EVENT, navigate);
142
+ return () => {
143
+ document.removeEventListener(syncEvent, sync);
144
+ document.removeEventListener(AFTER_NAVIGATE_EVENT, navigate);
145
+ };
146
+ });
147
+ return { selected, selectedNodes, broader, labels, canRestore, changeScope, save, navRef, scopeControls };
148
+ }
149
+ export {
150
+ useSidebarScope
151
+ };
@@ -1,4 +1,7 @@
1
- import { AFTER_NAVIGATE_EVENT, BEFORE_NAVIGATE_EVENT } from "../transitions/index.js";
1
+ import {
2
+ AFTER_NAVIGATE_EVENT,
3
+ BEFORE_NAVIGATE_EVENT
4
+ } from "../transitions/index.js";
2
5
  const installedControllers = /* @__PURE__ */ new WeakMap();
3
6
  function installSidebarScrollPreserve({
4
7
  document: document2,
@@ -45,7 +48,8 @@ function ensureSidebarScrollPreserve(options) {
45
48
  );
46
49
  }
47
50
  function resolveBrowserOptions() {
48
- if (typeof document === "undefined" || typeof window === "undefined") return void 0;
51
+ if (typeof document === "undefined" || typeof window === "undefined")
52
+ return void 0;
49
53
  return {
50
54
  document,
51
55
  requestAnimationFrame: window.requestAnimationFrame.bind(window),
@@ -25,28 +25,20 @@ export interface SidebarAutogenerated {
25
25
  * A sidebar item — string shorthand is equivalent to `{ type: "doc", id: slug }`.
26
26
  */
27
27
  export type SidebarItem = SidebarDoc | SidebarLink | SidebarCategory | SidebarAutogenerated | string;
28
+ /** An explicit editorial tree with an optional local view of a category's children. */
29
+ export interface SidebarDefinition {
30
+ items: SidebarItem[];
31
+ /** Resolved occurrence indexes from the forest to a category (not URL segments). */
32
+ initialPath?: number[];
33
+ /** Share across sections using the same editorial tree. Locale/version are added by chrome. */
34
+ contextId?: string;
35
+ }
28
36
  /** Sidebar config keyed by section (categoryMatch value). */
29
37
  export type SidebarsConfig = {
30
- [sectionKey: string]: SidebarItem[] | undefined;
38
+ [sectionKey: string]: SidebarItem[] | SidebarDefinition | undefined;
31
39
  };
32
- /** Minimal nav node shape required by sidebar-utils functions. */
33
- export interface SidebarNavNode {
34
- slug: string;
35
- label: string;
36
- description?: string;
37
- position: number;
38
- href?: string;
39
- hasPage: boolean;
40
- children: SidebarNavNode[];
41
- sortOrder?: "asc" | "desc";
42
- collapsed?: boolean;
43
- shape?: "note-tray";
44
- noteTrayDated?: boolean;
45
- noteTraySidebar?: "index" | "year" | "month";
46
- date?: string;
47
- updated?: string;
48
- rank?: number;
49
- }
40
+ export type { SidebarNavNode, SidebarNavigationContext } from "../sidebar/types.js";
41
+ import type { SidebarNavNode, SidebarNavigationContext } from "../sidebar/types.js";
50
42
  /** Category metadata shape (mirrors host's CategoryMeta). */
51
43
  export interface SidebarCategoryMeta {
52
44
  label?: string;
@@ -68,3 +60,9 @@ export interface SidebarCategoryMeta {
68
60
  * values from headerNav, used for the `"!"` fallback category filter.
69
61
  */
70
62
  export declare function buildSidebarForSection(docs: unknown[], lang: string, categoryMatch: string | undefined, categoryMeta: Map<string, SidebarCategoryMeta> | undefined, sidebars: SidebarsConfig, buildNavTree: (docs: unknown[], lang: string, categoryMeta?: Map<string, SidebarCategoryMeta>) => SidebarNavNode[], explicitCategoryPrefixes: string[]): SidebarNavNode[];
63
+ /** Builder-owned provenance keeps omitted autogenerated roots and duplicate links distinct. */
64
+ export declare function buildSidebarNavigation(...args: Parameters<typeof buildSidebarForSection>): {
65
+ nodes: SidebarNavNode[];
66
+ navigation: SidebarNavigationContext;
67
+ };
68
+ export { sidebarInitialExpansion, sidebarBaselineOpen, SIDEBAR_FOREST_SCOPE, indexSidebarOccurrences, sidebarScopeNodes, broaderSidebarScope, reconcileSidebarScope } from "./scope.js";
@@ -78,11 +78,108 @@ function buildSidebarForSection(docs, lang, categoryMatch, categoryMeta, sidebar
78
78
  const tree = buildNavTree(docs, lang, categoryMeta);
79
79
  const sectionKey = categoryMatch ?? "default";
80
80
  const config = sidebars[sectionKey];
81
- if (!config || config.length === 0) {
81
+ if (!config || (Array.isArray(config) ? config.length === 0 : config.items.length === 0)) {
82
82
  return filterByCategory(tree, categoryMatch, explicitCategoryPrefixes);
83
83
  }
84
- return resolveItems(config, tree, lang);
84
+ if (Array.isArray(config)) return resolveItems(config, tree, lang);
85
+ let nodes = resolveItems(config.items, tree, lang);
86
+ for (const index of config.initialPath ?? []) {
87
+ if (!Number.isInteger(index) || index < 0 || !nodes[index]) throw new Error(`Invalid sidebar initialPath for ${sectionKey}`);
88
+ nodes = nodes[index].children;
89
+ }
90
+ return nodes;
91
+ }
92
+ function buildSidebarNavigation(...args) {
93
+ const [docs, lang, categoryMatch, meta, sidebars, buildTree, prefixes] = args;
94
+ const initialExpansion = {};
95
+ for (const entry of docs) {
96
+ const doc = entry;
97
+ const value = doc.data?.sidebar_initial_expansion;
98
+ if (typeof doc.slug === "string" && (value === "collapsed" || value === "expanded")) {
99
+ const slug = doc.data?.slug ?? (doc.slug === "index" ? "" : doc.slug.replace(/\/index$/, ""));
100
+ initialExpansion[slug] = value;
101
+ }
102
+ }
103
+ const tree = buildTree(docs, lang, meta);
104
+ const config = sidebars[categoryMatch ?? "default"];
105
+ const definition = config && !Array.isArray(config) ? config : void 0;
106
+ const items = Array.isArray(config) ? config : definition?.items;
107
+ const parents = {};
108
+ function identify(nodes2, prefix, parent) {
109
+ return nodes2.map((node, index) => {
110
+ const occurrenceId = `${prefix}/${index}`;
111
+ parents[occurrenceId] = parent;
112
+ return { ...node, occurrenceId, children: identify(node.children, occurrenceId, occurrenceId) };
113
+ });
114
+ }
115
+ const automatic = identify(tree, "auto", null);
116
+ let roots;
117
+ let nodes;
118
+ if (!items?.length) {
119
+ roots = automatic;
120
+ nodes = filterByCategory(roots, categoryMatch, prefixes);
121
+ } else if (items.length === 1 && typeof items[0] !== "string" && items[0]?.type === "autogenerated") {
122
+ roots = automatic;
123
+ nodes = items[0].dirName ? findNode(roots, items[0].dirName)?.children ?? [] : roots;
124
+ } else {
125
+ let resolve2 = function(entries, prefix, parent) {
126
+ const canonical = [];
127
+ const visible = [];
128
+ entries.forEach((item, index) => {
129
+ const id = `${prefix}/${index}`;
130
+ if (typeof item !== "string" && item.type === "category") {
131
+ const children = resolve2(item.items, id, id);
132
+ if (item.sortOrder === "desc") {
133
+ children.canonical.reverse();
134
+ children.visible.reverse();
135
+ }
136
+ const node = { occurrenceId: id, slug: `__category__${item.label}`, label: item.label, position: 0, hasPage: false, collapsed: item.collapsed, sortOrder: item.sortOrder, children: children.canonical };
137
+ parents[id] = parent;
138
+ canonical.push(node);
139
+ visible.push({ ...node, children: children.visible });
140
+ } else if (typeof item !== "string" && item.type === "autogenerated" && item.dirName) {
141
+ const source = findNode(tree, item.dirName);
142
+ if (source) {
143
+ const identified = identify([source], id, parent)[0];
144
+ canonical.push(identified);
145
+ visible.push(...identified.children);
146
+ }
147
+ } else {
148
+ const resolved = identify(resolveItem(item, tree, lang), id, parent);
149
+ canonical.push(...resolved);
150
+ visible.push(...resolved);
151
+ }
152
+ });
153
+ return { canonical, visible };
154
+ };
155
+ var resolve = resolve2;
156
+ for (const id of Object.keys(parents)) delete parents[id];
157
+ const result = resolve2(items, "custom", null);
158
+ roots = result.canonical;
159
+ nodes = result.visible;
160
+ }
161
+ let localParentId;
162
+ for (const index of definition?.initialPath ?? []) {
163
+ const node = nodes[index];
164
+ if (!Number.isInteger(index) || index < 0 || !node) throw new Error(`Invalid sidebar initialPath for ${categoryMatch ?? "default"}`);
165
+ localParentId = node.occurrenceId;
166
+ nodes = node.children;
167
+ }
168
+ let hash = 2166136261;
169
+ const serialized = JSON.stringify(Object.keys(initialExpansion).length ? [roots, initialExpansion] : roots);
170
+ for (let i = 0; i < serialized.length; i++) hash = Math.imul(hash ^ serialized.charCodeAt(i), 16777619);
171
+ const kind = !items?.length || items.length === 1 && typeof items[0] !== "string" && items[0]?.type === "autogenerated" ? "automatic" : definition?.contextId ?? categoryMatch ?? "default";
172
+ return { nodes, navigation: { id: `${lang}:${kind}:${hash >>> 0}`, roots, parents, ...Object.keys(initialExpansion).length ? { initialExpansion } : {}, ...localParentId ? { localParentId } : {} } };
85
173
  }
174
+ import { sidebarInitialExpansion, sidebarBaselineOpen, SIDEBAR_FOREST_SCOPE, indexSidebarOccurrences, sidebarScopeNodes, broaderSidebarScope, reconcileSidebarScope } from "./scope.js";
86
175
  export {
87
- buildSidebarForSection
176
+ SIDEBAR_FOREST_SCOPE,
177
+ broaderSidebarScope,
178
+ buildSidebarForSection,
179
+ buildSidebarNavigation,
180
+ indexSidebarOccurrences,
181
+ reconcileSidebarScope,
182
+ sidebarBaselineOpen,
183
+ sidebarInitialExpansion,
184
+ sidebarScopeNodes
88
185
  };
@@ -0,0 +1,11 @@
1
+ import type { SidebarNavNode, SidebarNavigationContext } from "../sidebar/types.js";
2
+ export declare const SIDEBAR_FOREST_SCOPE = "@forest";
3
+ export declare function indexSidebarOccurrences(roots: SidebarNavNode[]): Map<string, SidebarNavNode>;
4
+ export declare function sidebarScopeNodes(context: SidebarNavigationContext, baseline: SidebarNavNode[], selected: string | null): SidebarNavNode[];
5
+ /** Only an actual shared parent can enclose a configured forest. */
6
+ export declare function broaderSidebarScope(context: SidebarNavigationContext, baseline: SidebarNavNode[], selected: string | null): string | null;
7
+ /** On navigation, widen only to the nearest common editorial ancestor. */
8
+ export declare function reconcileSidebarScope(context: SidebarNavigationContext, baseline: SidebarNavNode[], selected: string | null, slug?: string): string | null;
9
+ /** Leaf override, nearest index default, then legacy undefined behavior. */
10
+ export declare function sidebarInitialExpansion(context: SidebarNavigationContext, slug?: string): "collapsed" | "expanded" | undefined;
11
+ export declare function sidebarBaselineOpen(node: SidebarNavNode, mode: "collapsed" | "expanded" | undefined, currentSlug?: string): boolean;
@@ -0,0 +1,67 @@
1
+ const SIDEBAR_FOREST_SCOPE = "@forest";
2
+ function indexSidebarOccurrences(roots) {
3
+ const result = /* @__PURE__ */ new Map();
4
+ const visit = (nodes) => nodes.forEach((node) => {
5
+ if (node.occurrenceId) result.set(node.occurrenceId, node);
6
+ visit(node.children);
7
+ });
8
+ visit(roots);
9
+ return result;
10
+ }
11
+ function sidebarScopeNodes(context, baseline, selected) {
12
+ if (selected === null) return baseline;
13
+ if (selected === SIDEBAR_FOREST_SCOPE) return context.roots;
14
+ const node = indexSidebarOccurrences(context.roots).get(selected);
15
+ return node ? [node] : baseline;
16
+ }
17
+ function broaderSidebarScope(context, baseline, selected) {
18
+ if (selected === SIDEBAR_FOREST_SCOPE) return null;
19
+ if (selected !== null) {
20
+ const parent = context.parents[selected];
21
+ if (parent) return parent;
22
+ if (context.roots.length === 1 && context.roots[0]?.occurrenceId === selected) return null;
23
+ return SIDEBAR_FOREST_SCOPE;
24
+ }
25
+ if (!baseline.length) return null;
26
+ const parents = baseline.map((node) => node.occurrenceId ? context.parents[node.occurrenceId] : void 0);
27
+ if (parents.some((parent) => parent === void 0 || parent !== parents[0])) return context.localParentId ?? null;
28
+ if (parents[0]) return parents[0];
29
+ const rootIds = context.roots.map((node) => node.occurrenceId);
30
+ return baseline.length === rootIds.length && baseline.every((node, i) => node.occurrenceId === rootIds[i]) ? null : SIDEBAR_FOREST_SCOPE;
31
+ }
32
+ function reconcileSidebarScope(context, baseline, selected, slug) {
33
+ if (selected === null || slug === void 0) return selected;
34
+ const index = indexSidebarOccurrences(context.roots);
35
+ if (selected !== SIDEBAR_FOREST_SCOPE && !index.has(selected)) return null;
36
+ const contains = (nodes) => nodes.some((node) => node.slug === slug || contains(node.children));
37
+ if (!contains(context.roots)) return null;
38
+ let candidate = selected;
39
+ while (candidate !== null) {
40
+ if (contains(sidebarScopeNodes(context, baseline, candidate))) return candidate;
41
+ candidate = broaderSidebarScope(context, baseline, candidate);
42
+ }
43
+ return null;
44
+ }
45
+ function sidebarInitialExpansion(context, slug = "") {
46
+ let candidate = slug;
47
+ while (true) {
48
+ const value = context.initialExpansion?.[candidate];
49
+ if (value) return value;
50
+ if (!candidate) return void 0;
51
+ const slash = candidate.lastIndexOf("/");
52
+ candidate = slash < 0 ? "" : candidate.slice(0, slash);
53
+ }
54
+ }
55
+ function sidebarBaselineOpen(node, mode, currentSlug) {
56
+ const contains = (n) => currentSlug !== void 0 && (n.slug === currentSlug || n.children.some(contains));
57
+ return contains(node) || (node.collapsed !== void 0 ? !node.collapsed : mode !== "collapsed");
58
+ }
59
+ export {
60
+ SIDEBAR_FOREST_SCOPE,
61
+ broaderSidebarScope,
62
+ indexSidebarOccurrences,
63
+ reconcileSidebarScope,
64
+ sidebarBaselineOpen,
65
+ sidebarInitialExpansion,
66
+ sidebarScopeNodes
67
+ };
@@ -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 { SidebarNavNode, SidebarRootMenuItem } from "../sidebar/types.js";
5
4
  import type { ChromeContext } from "../factory-context/index.js";
6
5
  import type { Settings } from "../settings.js";
@@ -1,15 +1,17 @@
1
- import { jsx } from "preact/jsx-runtime";
1
+ import { jsx } from "@takazudo/zfb/zudo-react/jsx-runtime";
2
2
  import { Island } from "@takazudo/zfb";
3
3
  import { SidebarTree } from "../sidebar-tree-island/index.js";
4
4
  import { themeToggleLabels } from "../theme-toggle/labels.js";
5
5
  import { deriveDateFormats, deriveNavDataPrep } from "../chrome/derive.js";
6
+ import { normalizeIslandData } from "../chrome/island-data.js";
7
+ import { toSidebarClientData } from "../sidebar/client-data.js";
6
8
  import { assertChromeContext } from "../chrome/assert-chrome-context.js";
7
9
  function createSidebarWithDefaults(ctx) {
8
10
  assertChromeContext(ctx, "createSidebarWithDefaults");
9
11
  const defaultLocale = ctx.defaultLocale;
10
12
  const localeCount = ctx.locales.length;
11
13
  const t = ctx.t;
12
- const { buildRootMenuItems, buildLocaleLinksForNav, buildSidebarNodes, getThemeDefaultMode } = deriveNavDataPrep(ctx);
14
+ const { buildRootMenuItems, buildLocaleLinksForNav, buildSidebarContext, getThemeDefaultMode } = deriveNavDataPrep(ctx);
13
15
  const dateFormatsFor = deriveDateFormats(ctx);
14
16
  function SidebarWithDefaults(props) {
15
17
  const {
@@ -21,25 +23,24 @@ function createSidebarWithDefaults(ctx) {
21
23
  } = props;
22
24
  const rootMenuItems = buildRootMenuItems(lang, currentVersion);
23
25
  const backToMenuLabel = navSection ? t("nav.backToMenu", lang) : void 0;
24
- const nodes = buildSidebarNodes(lang, navSection, currentVersion, false);
26
+ const { nodes, navigation } = buildSidebarContext(lang, navSection, currentVersion, false);
25
27
  const localeLinks = buildLocaleLinksForNav(currentPath, lang, localeCount);
28
+ const themeDefaultMode = getThemeDefaultMode();
29
+ const treeProps = normalizeIslandData({
30
+ ...toSidebarClientData(nodes, navigation),
31
+ ...currentSlug !== void 0 ? { currentSlug } : {},
32
+ rootMenuItems,
33
+ ...backToMenuLabel !== void 0 ? { backToMenuLabel } : {},
34
+ locale: lang,
35
+ ...localeLinks !== void 0 ? { localeLinks } : {},
36
+ ...themeDefaultMode !== void 0 ? { themeDefaultMode } : {},
37
+ themeLabels: themeToggleLabels(t, lang),
38
+ themeRespectSystem: (ctx.settings.colorMode && ctx.settings.colorMode.respectPrefersColorScheme) ?? true,
39
+ dateFormats: dateFormatsFor(lang)
40
+ });
26
41
  return Island({
27
42
  when: "load",
28
- children: /* @__PURE__ */ jsx(
29
- SidebarTree,
30
- {
31
- nodes,
32
- currentSlug,
33
- rootMenuItems,
34
- backToMenuLabel,
35
- locale: lang,
36
- localeLinks,
37
- themeDefaultMode: getThemeDefaultMode(),
38
- themeLabels: themeToggleLabels(t, lang),
39
- themeRespectSystem: (ctx.settings.colorMode && ctx.settings.colorMode.respectPrefersColorScheme) ?? true,
40
- dateFormats: dateFormatsFor(lang)
41
- }
42
- )
43
+ children: /* @__PURE__ */ jsx(SidebarTree, { ...treeProps })
43
44
  });
44
45
  }
45
46
  return SidebarWithDefaults;
@@ -7,18 +7,18 @@ function toNavNode(node) {
7
7
  return {
8
8
  slug: node.id,
9
9
  label: node.label,
10
- description: node.description,
10
+ ...node.description !== void 0 ? { description: node.description } : {},
11
11
  position: node.sidebar_position ?? 999,
12
- href: node.href,
12
+ ...node.href !== void 0 ? { href: node.href } : {},
13
13
  hasPage: node.hasPage,
14
14
  children: node.children.map(toNavNode),
15
15
  sortOrder: node.sortOrder ?? "asc",
16
- shape: node.shape,
17
- noteTrayDated: node.noteTrayDated,
18
- noteTraySidebar: node.noteTraySidebar,
19
- date: node.date,
20
- updated: node.updated,
21
- rank: node.rank
16
+ ...node.shape !== void 0 ? { shape: node.shape } : {},
17
+ ...node.noteTrayDated !== void 0 ? { noteTrayDated: node.noteTrayDated } : {},
18
+ ...node.noteTraySidebar !== void 0 ? { noteTraySidebar: node.noteTraySidebar } : {},
19
+ ...node.date !== void 0 ? { date: node.date } : {},
20
+ ...node.updated !== void 0 ? { updated: node.updated } : {},
21
+ ...node.rank !== void 0 ? { rank: node.rank } : {}
22
22
  };
23
23
  }
24
24
  function findRootIndexDoc(docs) {
@@ -36,17 +36,17 @@ function toRootNavNode(doc, locale, buildHref, categoryMeta) {
36
36
  return {
37
37
  slug: "",
38
38
  label: doc.data.sidebar_label ?? doc.data.title ?? meta?.label ?? "",
39
- description: doc.data.description ?? meta?.description,
39
+ ...(doc.data.description ?? meta?.description) !== void 0 ? { description: doc.data.description ?? meta?.description } : {},
40
40
  position: doc.data.sidebar_position ?? meta?.position ?? 999,
41
- href: noPage ? void 0 : buildHref("", locale),
41
+ ...noPage ? {} : { href: buildHref("", locale) },
42
42
  hasPage: noPage !== true,
43
43
  children: [],
44
44
  sortOrder,
45
- shape: doc.data.category_shape,
46
- noteTrayDated: doc.data.note_tray_dated,
47
- noteTraySidebar: doc.data.note_tray_sidebar,
48
- date: doc.data.date,
49
- updated: doc.data.updated,
45
+ ...doc.data.category_shape !== void 0 ? { shape: doc.data.category_shape } : {},
46
+ ...doc.data.note_tray_dated !== void 0 ? { noteTrayDated: doc.data.note_tray_dated } : {},
47
+ ...doc.data.note_tray_sidebar !== void 0 ? { noteTraySidebar: doc.data.note_tray_sidebar } : {},
48
+ ...doc.data.date !== void 0 ? { date: doc.data.date } : {},
49
+ ...doc.data.updated !== void 0 ? { updated: doc.data.updated } : {},
50
50
  rank: 1
51
51
  };
52
52
  }
@@ -46,6 +46,7 @@ export interface DocPageFrontmatter {
46
46
  standalone?: boolean;
47
47
  sidebar_position?: number;
48
48
  sidebar_label?: string;
49
+ sidebar_initial_expansion?: "collapsed" | "expanded";
49
50
  category_no_page?: boolean;
50
51
  category_sort_order?: "asc" | "desc";
51
52
  category_shape?: "note-tray";
@@ -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 { SidebarNavNode } from "../sidebar/types.js";
5
4
  import type { DateFormatSetting } from "../settings.js";
6
5
  /**
@@ -21,7 +20,7 @@ export interface SiteTreeNavWrapperProps {
21
20
  lang?: string;
22
21
  /**
23
22
  * Optional aria-label for the wrapping <nav> element.
24
- * Forwarded to the v2 SiteTreeNavDemo component.
23
+ * Forwarded to the interactive SiteTreeNav island.
25
24
  */
26
25
  ariaLabel?: string;
27
26
  /**
@@ -1,8 +1,9 @@
1
- import { jsx } from "preact/jsx-runtime";
1
+ import { jsx } from "@takazudo/zfb/zudo-react/jsx-runtime";
2
2
  import { Island } from "@takazudo/zfb";
3
3
  import { SiteTreeNav } from "../site-tree-nav-island/index.js";
4
4
  import { remapVersionedHrefs } from "../nav-data-prep/index.js";
5
5
  import { resolveDateFormats } from "../date-format-resolve/index.js";
6
+ import { normalizeSiteTreeNavProps } from "./normalize-island-props.js";
6
7
  function createSiteTreeNavWrapper(deps) {
7
8
  const {
8
9
  defaultLocale,
@@ -38,19 +39,17 @@ function createSiteTreeNavWrapper(deps) {
38
39
  }
39
40
  }
40
41
  if (tree.length === 0) return null;
42
+ const islandProps = normalizeSiteTreeNavProps({
43
+ tree,
44
+ categoryOrder,
45
+ ...categoryIgnore !== void 0 ? { categoryIgnore } : {},
46
+ ...ariaLabel !== void 0 ? { ariaLabel } : {},
47
+ locale,
48
+ dateFormats: resolveDateFormats(dateFormat, locale)
49
+ });
41
50
  return Island({
42
51
  when: "idle",
43
- children: /* @__PURE__ */ jsx(
44
- SiteTreeNav,
45
- {
46
- tree,
47
- categoryOrder,
48
- categoryIgnore,
49
- ariaLabel,
50
- locale,
51
- dateFormats: resolveDateFormats(dateFormat, locale)
52
- }
53
- )
52
+ children: /* @__PURE__ */ jsx(SiteTreeNav, { ...islandProps })
54
53
  });
55
54
  }
56
55
  return SiteTreeNavWrapper;
@@ -0,0 +1,16 @@
1
+ import type { ResolvedDateFormats } from "../settings.js";
2
+ import type { SidebarNavNode } from "../sidebar/types.js";
3
+ export interface SiteTreeNavIslandProps {
4
+ tree: SidebarNavNode[];
5
+ categoryOrder: string[];
6
+ categoryIgnore?: string[];
7
+ ariaLabel?: string;
8
+ locale: string;
9
+ dateFormats: ResolvedDateFormats;
10
+ }
11
+ /**
12
+ * Copy the host nav payload through the island's finite JSON shape. Optional
13
+ * fields are added only when present, so neither node records nor top-level
14
+ * props carry own `undefined` values across SSR and hydration.
15
+ */
16
+ export declare function normalizeSiteTreeNavProps(input: SiteTreeNavIslandProps): SiteTreeNavIslandProps;