@takazudo/zudo-doc 5.28.2 → 6.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (456) hide show
  1. package/CHANGELOG.md +22 -0
  2. package/README.md +49 -16
  3. package/bin/gen-z-index.mjs +18 -18
  4. package/dist/agent-docs/identity.d.ts +4 -0
  5. package/dist/agent-docs/identity.js +24 -0
  6. package/dist/agent-docs/index.d.ts +5 -0
  7. package/dist/agent-docs/index.js +5 -0
  8. package/dist/agent-docs/limits.d.ts +11 -0
  9. package/dist/agent-docs/limits.js +24 -0
  10. package/dist/agent-docs/search.d.ts +14 -0
  11. package/dist/agent-docs/search.js +82 -0
  12. package/dist/agent-docs/tokenize.d.ts +2 -0
  13. package/dist/agent-docs/tokenize.js +22 -0
  14. package/dist/agent-docs/types.d.ts +68 -0
  15. package/dist/agent-docs/types.js +0 -0
  16. package/dist/ai-chat-modal/index.d.ts +1 -4
  17. package/dist/ai-chat-modal/index.js +183 -123
  18. package/dist/asset-components/asset-card.d.ts +1 -2
  19. package/dist/asset-components/asset-card.js +12 -12
  20. package/dist/asset-components/asset-code.d.ts +1 -2
  21. package/dist/asset-components/asset-code.js +10 -10
  22. package/dist/asset-components/shared.d.ts +3 -4
  23. package/dist/asset-components/shared.js +4 -4
  24. package/dist/asset-index-page/body.d.ts +5 -6
  25. package/dist/asset-index-page/body.js +6 -6
  26. package/dist/asset-index-page/index.d.ts +1 -2
  27. package/dist/asset-index-page/index.js +1 -1
  28. package/dist/asset-page/body.d.ts +5 -9
  29. package/dist/asset-page/body.js +3 -3
  30. package/dist/asset-page/components.d.ts +16 -17
  31. package/dist/asset-page/components.js +10 -9
  32. package/dist/asset-page/index.d.ts +1 -2
  33. package/dist/asset-page/index.js +1 -1
  34. package/dist/auto-logo/index.d.ts +1 -2
  35. package/dist/auto-logo/index.js +2 -2
  36. package/dist/body-foot-util/body-foot-util-area.d.ts +3 -4
  37. package/dist/body-foot-util/body-foot-util-area.js +1 -2
  38. package/dist/body-foot-util/edit-link.d.ts +2 -3
  39. package/dist/body-foot-util/edit-link.js +1 -2
  40. package/dist/breadcrumb/breadcrumb.d.ts +6 -6
  41. package/dist/breadcrumb/breadcrumb.js +3 -4
  42. package/dist/category-nav/index.d.ts +1 -2
  43. package/dist/category-nav/index.js +11 -5
  44. package/dist/category-tree-nav/index.d.ts +1 -2
  45. package/dist/category-tree-nav/index.js +3 -3
  46. package/dist/chrome/derive.d.ts +18 -27
  47. package/dist/chrome/derive.js +47 -29
  48. package/dist/chrome/index.d.ts +5 -5
  49. package/dist/chrome/index.js +1 -1
  50. package/dist/chrome/island-data.d.ts +4 -0
  51. package/dist/chrome/island-data.js +52 -0
  52. package/dist/chrome/primary-slots.d.ts +2 -3
  53. package/dist/chrome-bindings.d.ts +28 -22
  54. package/dist/code-group/index.d.ts +3 -4
  55. package/dist/code-group/index.js +3 -7
  56. package/dist/code-syntax/code-block-enhancer.d.ts +1 -2
  57. package/dist/code-syntax/code-block-enhancer.js +2 -2
  58. package/dist/code-syntax/mermaid-init.d.ts +1 -2
  59. package/dist/code-syntax/mermaid-init.js +5 -2
  60. package/dist/code-syntax/tabs-init-script.js +1 -1
  61. package/dist/code-syntax/tabs-init.d.ts +1 -2
  62. package/dist/code-syntax/tabs-init.js +2 -2
  63. package/dist/code-syntax/tabs.d.ts +6 -6
  64. package/dist/code-syntax/tabs.js +8 -8
  65. package/dist/compiled.css +2933 -2943
  66. package/dist/config-assertions/index.d.ts +13 -0
  67. package/dist/config-assertions/index.js +14 -0
  68. package/dist/config.d.ts +36 -17
  69. package/dist/config.js +23 -95
  70. package/dist/content/content-blockquote.d.ts +2 -3
  71. package/dist/content/content-blockquote.js +3 -3
  72. package/dist/content/content-code.d.ts +3 -4
  73. package/dist/content/content-code.js +5 -5
  74. package/dist/content/content-link.d.ts +3 -4
  75. package/dist/content/content-link.js +10 -10
  76. package/dist/content/content-ol.d.ts +2 -3
  77. package/dist/content/content-ol.js +5 -4
  78. package/dist/content/content-paragraph.d.ts +2 -3
  79. package/dist/content/content-paragraph.js +1 -1
  80. package/dist/content/content-strong.d.ts +2 -3
  81. package/dist/content/content-strong.js +3 -3
  82. package/dist/content/content-table.d.ts +2 -3
  83. package/dist/content/content-table.js +4 -4
  84. package/dist/content/content-ul.d.ts +2 -3
  85. package/dist/content/content-ul.js +4 -4
  86. package/dist/content/heading-h2.d.ts +2 -3
  87. package/dist/content/heading-h2.js +4 -4
  88. package/dist/content/heading-h3.d.ts +2 -3
  89. package/dist/content/heading-h3.js +4 -4
  90. package/dist/content/heading-h4.d.ts +2 -3
  91. package/dist/content/heading-h4.js +4 -4
  92. package/dist/content-admonition/index.d.ts +3 -4
  93. package/dist/content-admonition/index.js +2 -2
  94. package/dist/content.css +35 -33
  95. package/dist/design-token-panel-bootstrap-controller.d.ts +178 -0
  96. package/dist/design-token-panel-bootstrap-controller.js +359 -0
  97. package/dist/design-token-panel-bootstrap-island.d.ts +5 -0
  98. package/dist/design-token-panel-bootstrap-island.js +19 -0
  99. package/dist/design-token-panel-bootstrap.d.ts +5 -195
  100. package/dist/design-token-panel-bootstrap.js +3 -288
  101. package/dist/desktop-sidebar-toggle-island/index.d.ts +2 -7
  102. package/dist/desktop-sidebar-toggle-island/index.js +2 -58
  103. package/dist/desktop-sidebar-toggle-island/island.d.ts +4 -0
  104. package/dist/desktop-sidebar-toggle-island/island.js +43 -0
  105. package/dist/desktop-sidebar-toggle-island/storage.d.ts +4 -0
  106. package/dist/desktop-sidebar-toggle-island/storage.js +29 -0
  107. package/dist/desktop-toc-toggle-island/index.d.ts +2 -7
  108. package/dist/desktop-toc-toggle-island/index.js +2 -58
  109. package/dist/desktop-toc-toggle-island/island.d.ts +4 -0
  110. package/dist/desktop-toc-toggle-island/island.js +43 -0
  111. package/dist/desktop-toc-toggle-island/storage.d.ts +4 -0
  112. package/dist/desktop-toc-toggle-island/storage.js +29 -0
  113. package/dist/details/details.d.ts +3 -4
  114. package/dist/details/details.js +1 -1
  115. package/dist/doc-body-end/index.d.ts +1 -2
  116. package/dist/doc-body-end/index.js +1 -1
  117. package/dist/doc-body-end-islands/design-token-panel-island.d.ts +2 -2
  118. package/dist/doc-body-end-islands/design-token-panel-island.js +3 -7
  119. package/dist/doc-body-end-islands/index.d.ts +4 -21
  120. package/dist/doc-body-end-islands/index.js +5 -3
  121. package/dist/doc-body-end-islands/theme-pack-switcher-island.d.ts +3 -13
  122. package/dist/doc-body-end-islands/theme-pack-switcher-island.js +11 -13
  123. package/dist/doc-content-header/index.d.ts +1 -2
  124. package/dist/doc-content-header/index.js +1 -1
  125. package/dist/doc-history/index.d.ts +1 -1
  126. package/dist/doc-history/index.js +166 -141
  127. package/dist/doc-history-area/index.d.ts +6 -4
  128. package/dist/doc-history-area/index.js +17 -16
  129. package/dist/doc-metainfo-area/index.d.ts +2 -3
  130. package/dist/doc-metainfo-area/index.js +1 -1
  131. package/dist/doc-page-renderer/index.d.ts +13 -7
  132. package/dist/doc-page-renderer/index.js +10 -1
  133. package/dist/doc-page-shell/index.d.ts +20 -7
  134. package/dist/doc-page-shell/index.js +17 -6
  135. package/dist/doc-pager/index.d.ts +1 -2
  136. package/dist/doc-pager/index.js +3 -3
  137. package/dist/doc-tags-area/index.d.ts +2 -3
  138. package/dist/doc-tags-area/index.js +1 -1
  139. package/dist/doclayout/doc-layout-with-defaults.d.ts +9 -9
  140. package/dist/doclayout/doc-layout-with-defaults.js +5 -15
  141. package/dist/doclayout/doc-layout.d.ts +26 -27
  142. package/dist/doclayout/doc-layout.js +23 -14
  143. package/dist/docs-schema/index.d.ts +4 -0
  144. package/dist/docs-schema/index.js +1 -0
  145. package/dist/extract-headings/index.js +43 -12
  146. package/dist/factory-context/index.d.ts +22 -19
  147. package/dist/features.css +70 -8
  148. package/dist/find-in-page/find-bar.d.ts +4 -2
  149. package/dist/find-in-page/find-bar.js +58 -69
  150. package/dist/find-in-page/index.d.ts +2 -8
  151. package/dist/find-in-page/index.js +33 -30
  152. package/dist/footer/footer.d.ts +3 -4
  153. package/dist/footer/footer.js +3 -3
  154. package/dist/footer-with-defaults/index.d.ts +2 -3
  155. package/dist/footer-with-defaults/index.js +1 -1
  156. package/dist/frontmatter-preview-defaults/index.js +1 -0
  157. package/dist/head/doc-head.d.ts +1 -1
  158. package/dist/head/doc-head.js +24 -32
  159. package/dist/head/og-tags.d.ts +1 -1
  160. package/dist/head/og-tags.js +8 -7
  161. package/dist/head/twitter-card.d.ts +1 -1
  162. package/dist/head/twitter-card.js +1 -1
  163. package/dist/head-with-defaults/index.d.ts +7 -2
  164. package/dist/head-with-defaults/index.js +46 -32
  165. package/dist/header/header.d.ts +8 -8
  166. package/dist/header/header.js +9 -11
  167. package/dist/header/types.d.ts +7 -7
  168. package/dist/header-with-defaults/index.d.ts +1 -2
  169. package/dist/header-with-defaults/index.js +18 -8
  170. package/dist/home-intro/index.d.ts +2 -5
  171. package/dist/home-intro/index.js +7 -5
  172. package/dist/home-intro/prepare.js +4 -3
  173. package/dist/home-page/index.d.ts +3 -3
  174. package/dist/home-page/index.js +19 -17
  175. package/dist/html-preview-wrapper/highlighted-code.d.ts +3 -4
  176. package/dist/html-preview-wrapper/highlighted-code.js +19 -17
  177. package/dist/html-preview-wrapper/html-preview-wrapper.d.ts +4 -25
  178. package/dist/html-preview-wrapper/html-preview-wrapper.js +2 -87
  179. package/dist/html-preview-wrapper/html-preview.d.ts +3 -10
  180. package/dist/html-preview-wrapper/html-preview.js +13 -37
  181. package/dist/html-preview-wrapper/index.d.ts +2 -1
  182. package/dist/html-preview-wrapper/index.js +1 -1
  183. package/dist/html-preview-wrapper/preview-base.d.ts +3 -5
  184. package/dist/html-preview-wrapper/preview-base.js +56 -59
  185. package/dist/html-preview-wrapper/wrapper.d.ts +20 -0
  186. package/dist/html-preview-wrapper/wrapper.js +37 -0
  187. package/dist/hydration-pending.d.ts +3 -5
  188. package/dist/hydration-pending.js +7 -5
  189. package/dist/i18n-version/language-switcher.d.ts +5 -32
  190. package/dist/i18n-version/language-switcher.js +5 -106
  191. package/dist/i18n-version/switcher-generated-scripts.d.ts +2 -0
  192. package/dist/i18n-version/switcher-generated-scripts.js +107 -0
  193. package/dist/i18n-version/switcher-url-state.d.ts +76 -0
  194. package/dist/i18n-version/switcher-url-state.js +103 -0
  195. package/dist/i18n-version/version-banner.d.ts +2 -3
  196. package/dist/i18n-version/version-banner.js +1 -1
  197. package/dist/i18n-version/version-switcher.d.ts +5 -50
  198. package/dist/i18n-version/version-switcher.js +5 -157
  199. package/dist/icons/index.d.ts +18 -19
  200. package/dist/icons/index.js +17 -33
  201. package/dist/image-enlarge/index.d.ts +1 -10
  202. package/dist/image-enlarge/index.js +80 -55
  203. package/dist/image-enlarge/public.d.ts +2 -0
  204. package/dist/image-enlarge/public.js +6 -0
  205. package/dist/image-enlarge/ssr-fallback.d.ts +2 -0
  206. package/dist/image-enlarge/ssr-fallback.js +8 -0
  207. package/dist/index.d.ts +11 -4
  208. package/dist/inline-version-switcher/index.d.ts +1 -2
  209. package/dist/inline-version-switcher/index.js +1 -1
  210. package/dist/island-types/index.d.ts +2 -2
  211. package/dist/island-types/index.js +1 -5
  212. package/dist/math-block/index.d.ts +4 -7
  213. package/dist/math-block/index.js +5 -5
  214. package/dist/mcp/handler.d.ts +8 -0
  215. package/dist/mcp/handler.js +129 -0
  216. package/dist/mcp/index.d.ts +4 -0
  217. package/dist/mcp/index.js +7 -0
  218. package/dist/mcp/loader.d.ts +19 -0
  219. package/dist/mcp/loader.js +202 -0
  220. package/dist/mdx-components/index.js +40 -108
  221. package/dist/mermaid-enlarge/index.d.ts +1 -8
  222. package/dist/mermaid-enlarge/index.js +174 -158
  223. package/dist/mermaid-enlarge/public.d.ts +2 -0
  224. package/dist/mermaid-enlarge/public.js +6 -0
  225. package/dist/mermaid-enlarge/ssr-fallback.d.ts +2 -0
  226. package/dist/mermaid-enlarge/ssr-fallback.js +8 -0
  227. package/dist/metainfo/doc-metainfo.d.ts +2 -3
  228. package/dist/metainfo/doc-metainfo.js +1 -4
  229. package/dist/metainfo/doc-tags.d.ts +2 -3
  230. package/dist/metainfo/doc-tags.js +1 -1
  231. package/dist/metainfo/frontmatter-preview.d.ts +3 -4
  232. package/dist/metainfo/frontmatter-preview.js +1 -1
  233. package/dist/nav-data-prep/index.js +6 -4
  234. package/dist/nav-indexing/category-nav.d.ts +2 -3
  235. package/dist/nav-indexing/category-nav.js +1 -2
  236. package/dist/nav-indexing/category-tree-nav.d.ts +2 -3
  237. package/dist/nav-indexing/category-tree-nav.js +1 -1
  238. package/dist/nav-indexing/doc-card-grid.d.ts +2 -3
  239. package/dist/nav-indexing/doc-card-grid.js +1 -2
  240. package/dist/nav-indexing/docs-sitemap.d.ts +2 -3
  241. package/dist/nav-indexing/docs-sitemap.js +2 -2
  242. package/dist/nav-indexing/index.d.ts +1 -1
  243. package/dist/nav-indexing/nav-card-grid.d.ts +2 -3
  244. package/dist/nav-indexing/nav-card-grid.js +1 -2
  245. package/dist/nav-indexing/note-tray-index-parts/card-list.d.ts +1 -2
  246. package/dist/nav-indexing/note-tray-index-parts/card-list.js +4 -4
  247. package/dist/nav-indexing/note-tray-index-parts/date-line.d.ts +2 -3
  248. package/dist/nav-indexing/note-tray-index-parts/date-line.js +1 -1
  249. package/dist/nav-indexing/note-tray-index-parts/index-list.d.ts +1 -2
  250. package/dist/nav-indexing/note-tray-index-parts/index-list.js +2 -2
  251. package/dist/nav-indexing/note-tray-index-parts/timeline.d.ts +1 -2
  252. package/dist/nav-indexing/note-tray-index-parts/timeline.js +2 -2
  253. package/dist/nav-indexing/note-tray-index.d.ts +1 -2
  254. package/dist/nav-indexing/note-tray-index.js +1 -1
  255. package/dist/nav-indexing/site-tree-nav-demo.d.ts +2 -3
  256. package/dist/nav-indexing/site-tree-nav-demo.js +2 -2
  257. package/dist/nav-indexing/tag-nav.d.ts +1 -2
  258. package/dist/nav-indexing/tag-nav.js +1 -1
  259. package/dist/nav-indexing/types.d.ts +2 -2
  260. package/dist/nav-indexing/versions-page-content.d.ts +2 -3
  261. package/dist/nav-indexing/versions-page-content.js +8 -8
  262. package/dist/note-tray-index/index.d.ts +1 -2
  263. package/dist/note-tray-index/index.js +1 -1
  264. package/dist/page-loading/page-loading-overlay.d.ts +1 -2
  265. package/dist/page-loading/page-loading-overlay.js +3 -5
  266. package/dist/plugins/agent-export.d.ts +3 -0
  267. package/dist/plugins/agent-export.js +34 -0
  268. package/dist/plugins/internal/agent-export/chunk.d.ts +5 -0
  269. package/dist/plugins/internal/agent-export/chunk.js +90 -0
  270. package/dist/plugins/internal/agent-export/index.d.ts +24 -0
  271. package/dist/plugins/internal/agent-export/index.js +123 -0
  272. package/dist/plugins/internal/agent-export/normalize.d.ts +5 -0
  273. package/dist/plugins/internal/agent-export/normalize.js +73 -0
  274. package/dist/plugins/internal/llms-txt/dev-middleware.d.ts +6 -0
  275. package/dist/plugins/internal/llms-txt/dev-middleware.js +8 -3
  276. package/dist/plugins/internal/llms-txt/emit.js +23 -6
  277. package/dist/plugins/internal/llms-txt/generate.d.ts +7 -1
  278. package/dist/plugins/internal/llms-txt/generate.js +9 -2
  279. package/dist/plugins/internal/llms-txt/load.d.ts +2 -0
  280. package/dist/plugins/internal/llms-txt/load.js +20 -4
  281. package/dist/plugins/internal/llms-txt/types.d.ts +10 -0
  282. package/dist/plugins/routes.js +4 -0
  283. package/dist/preset.d.ts +19 -9
  284. package/dist/preset.js +20 -1
  285. package/dist/route-context-payload/index.js +1 -1
  286. package/dist/routes/404.d.ts +2 -3
  287. package/dist/routes/404.js +1 -1
  288. package/dist/routes/_chrome.d.ts +5 -5
  289. package/dist/routes/_chrome.js +7 -2
  290. package/dist/routes/_context.d.ts +4 -4
  291. package/dist/routes/_design-token-panel-bootstrap.d.ts +1 -4
  292. package/dist/routes/_design-token-panel-bootstrap.js +9 -1
  293. package/dist/routes/docs-slug.d.ts +2 -3
  294. package/dist/routes/docs-tags-index.d.ts +2 -3
  295. package/dist/routes/docs-tags-index.js +1 -1
  296. package/dist/routes/docs-tags-tag.d.ts +2 -3
  297. package/dist/routes/docs-tags-tag.js +1 -1
  298. package/dist/routes/docs-versions.d.ts +2 -3
  299. package/dist/routes/docs-versions.js +1 -1
  300. package/dist/routes/files-path.d.ts +2 -3
  301. package/dist/routes/files-path.js +1 -1
  302. package/dist/routes/index.d.ts +2 -3
  303. package/dist/routes/index.js +1 -1
  304. package/dist/routes/locale-docs-slug.d.ts +2 -3
  305. package/dist/routes/locale-docs-tags-index.d.ts +2 -3
  306. package/dist/routes/locale-docs-tags-index.js +1 -1
  307. package/dist/routes/locale-docs-tags-tag.d.ts +2 -3
  308. package/dist/routes/locale-docs-tags-tag.js +1 -1
  309. package/dist/routes/locale-docs-versions.d.ts +2 -3
  310. package/dist/routes/locale-docs-versions.js +1 -1
  311. package/dist/routes/locale-files-path.d.ts +2 -3
  312. package/dist/routes/locale-files-path.js +1 -1
  313. package/dist/routes/locale-index.d.ts +2 -3
  314. package/dist/routes/locale-index.js +1 -1
  315. package/dist/routes/mcp.d.ts +5 -0
  316. package/dist/routes/mcp.js +25 -0
  317. package/dist/routes/v-docs-slug.d.ts +2 -3
  318. package/dist/routes/v-locale-docs-slug.d.ts +2 -3
  319. package/dist/search-widget/index.d.ts +1 -2
  320. package/dist/search-widget/index.js +4 -7
  321. package/dist/search-widget-script/generated-script.js +12 -5
  322. package/dist/settings-defaults.d.ts +2 -0
  323. package/dist/settings-defaults.js +93 -0
  324. package/dist/settings.d.ts +8 -2
  325. package/dist/sidebar/index.d.ts +1 -1
  326. package/dist/sidebar/sidebar.d.ts +12 -44
  327. package/dist/sidebar/sidebar.js +4 -3
  328. package/dist/sidebar/types.d.ts +14 -0
  329. package/dist/sidebar-prepaint/index.d.ts +1 -2
  330. package/dist/sidebar-prepaint/index.js +4 -6
  331. package/dist/sidebar-resizer/sidebar-resizer-init.d.ts +2 -3
  332. package/dist/sidebar-resizer/sidebar-resizer-init.js +3 -3
  333. package/dist/sidebar-toggle-island/index.d.ts +8 -11
  334. package/dist/sidebar-toggle-island/index.js +75 -62
  335. package/dist/sidebar-tree/build-tree.js +5 -6
  336. package/dist/sidebar-tree/types.d.ts +2 -0
  337. package/dist/sidebar-tree-island/index.d.ts +4 -19
  338. package/dist/sidebar-tree-island/index.js +782 -436
  339. package/dist/sidebar-tree-island/scope-state.d.ts +38 -0
  340. package/dist/sidebar-tree-island/scope-state.js +151 -0
  341. package/dist/sidebar-tree-island/sidebar-scroll-preserve.js +6 -2
  342. package/dist/sidebar-utils/index.d.ts +17 -19
  343. package/dist/sidebar-utils/index.js +100 -3
  344. package/dist/sidebar-utils/scope.d.ts +11 -0
  345. package/dist/sidebar-utils/scope.js +67 -0
  346. package/dist/sidebar-with-defaults/index.d.ts +1 -2
  347. package/dist/sidebar-with-defaults/index.js +19 -18
  348. package/dist/site-schema/nav-tree.js +15 -15
  349. package/dist/site-schema/types.d.ts +1 -0
  350. package/dist/site-tree-nav/index.d.ts +2 -3
  351. package/dist/site-tree-nav/index.js +11 -12
  352. package/dist/site-tree-nav/normalize-island-props.d.ts +16 -0
  353. package/dist/site-tree-nav/normalize-island-props.js +122 -0
  354. package/dist/site-tree-nav-island/index.d.ts +3 -3
  355. package/dist/site-tree-nav-island/index.js +243 -144
  356. package/dist/smart-break/index.d.ts +3 -4
  357. package/dist/smart-break/index.js +1 -1
  358. package/dist/tab-item/tab-item.d.ts +3 -4
  359. package/dist/tab-item/tab-item.js +1 -1
  360. package/dist/tag-pages/index.d.ts +3 -3
  361. package/dist/tag-pages/index.js +10 -10
  362. package/dist/theme/color-scheme-provider.d.ts +3 -3
  363. package/dist/theme/color-scheme-provider.js +3 -3
  364. package/dist/theme/theme-pack-provider.d.ts +1 -1
  365. package/dist/theme/theme-pack-provider.js +3 -3
  366. package/dist/theme/theme-toggle.d.ts +2 -3
  367. package/dist/theme/theme-toggle.js +1 -1
  368. package/dist/theme-pack-dialog/index.d.ts +1 -1
  369. package/dist/theme-pack-dialog/index.js +69 -75
  370. package/dist/theme-pack-dialog/theme-pack-card.d.ts +3 -4
  371. package/dist/theme-pack-dialog/theme-pack-card.js +19 -17
  372. package/dist/theme-pack-switcher/index.d.ts +4 -5
  373. package/dist/theme-pack-switcher/index.js +52 -49
  374. package/dist/theme-toggle/index.d.ts +1 -1
  375. package/dist/theme-toggle/index.js +154 -167
  376. package/dist/theme.css +47 -121
  377. package/dist/toc/mobile-toc.d.ts +3 -5
  378. package/dist/toc/mobile-toc.js +29 -27
  379. package/dist/toc/toc.d.ts +3 -4
  380. package/dist/toc/toc.js +18 -18
  381. package/dist/toc/use-active-heading.d.ts +5 -4
  382. package/dist/toc/use-active-heading.js +36 -30
  383. package/dist/toc-prepaint/index.d.ts +1 -2
  384. package/dist/toc-prepaint/index.js +4 -6
  385. package/dist/transitions/nested-island-props-refresh.d.ts +3 -16
  386. package/dist/transitions/nested-island-props-refresh.js +133 -151
  387. package/dist/transitions/page-events.d.ts +8 -13
  388. package/dist/tree-nav-shared/index.d.ts +4 -5
  389. package/dist/tree-nav-shared/index.js +6 -7
  390. package/dist/use-modal-dialog/index.d.ts +9 -63
  391. package/dist/use-modal-dialog/index.js +41 -59
  392. package/dist/versions-page/index.d.ts +3 -3
  393. package/dist/versions-page/index.js +5 -5
  394. package/dist/wind/index.d.ts +5 -0
  395. package/dist/wind/index.js +169 -0
  396. package/dist/wind.json +498 -0
  397. package/dist/z-index-defaults/index.d.ts +4 -4
  398. package/dist/zdtp-loader.d.ts +7 -0
  399. package/dist/zdtp-loader.js +8 -0
  400. package/eject/asset-components/asset-card.tsx +14 -16
  401. package/eject/asset-components/asset-code.tsx +10 -12
  402. package/eject/asset-components/shared.tsx +5 -7
  403. package/eject/breadcrumb/breadcrumb.tsx +15 -16
  404. package/eject/code-group/index.tsx +4 -10
  405. package/eject/content-admonition/index.tsx +5 -6
  406. package/eject/desktop-sidebar-toggle-island/index.ts +4 -0
  407. package/eject/desktop-sidebar-toggle-island/island.tsx +50 -0
  408. package/eject/desktop-sidebar-toggle-island/storage.ts +27 -0
  409. package/eject/details/details.tsx +3 -5
  410. package/eject/doc-history/index.tsx +193 -179
  411. package/eject/doc-pager/index.tsx +3 -4
  412. package/eject/footer/footer.tsx +7 -9
  413. package/eject/header/header.tsx +42 -54
  414. package/eject/header/nav-overflow-script.ts +1 -1
  415. package/eject/header/types.ts +12 -13
  416. package/eject/image-enlarge/index.tsx +84 -69
  417. package/eject/image-enlarge/public.ts +2 -0
  418. package/eject/image-enlarge/ssr-fallback.tsx +7 -0
  419. package/eject/page-loading/page-loading-overlay.tsx +8 -15
  420. package/eject/sidebar/index.ts +1 -0
  421. package/eject/sidebar/sidebar.tsx +16 -97
  422. package/eject/sidebar/types.ts +15 -0
  423. package/eject/sidebar-toggle-island/index.tsx +103 -102
  424. package/eject/sidebar-tree-island/index.tsx +827 -615
  425. package/eject/sidebar-tree-island/scope-state.ts +154 -0
  426. package/eject/sidebar-tree-island/sidebar-scroll-preserve.ts +8 -2
  427. package/eject/site-tree-nav-island/index.tsx +349 -222
  428. package/eject/tab-item/tab-item.tsx +2 -4
  429. package/eject/theme-toggle/hydration-pending.ts +6 -10
  430. package/eject/theme-toggle/index.tsx +133 -173
  431. package/eject/toc/mobile-toc.tsx +27 -31
  432. package/eject/toc/toc.tsx +21 -24
  433. package/eject/toc/use-active-heading.ts +43 -38
  434. package/package.json +40 -22
  435. package/routes-src/404.tsx +2 -3
  436. package/routes-src/_chrome.tsx +7 -2
  437. package/routes-src/_design-token-panel-bootstrap.tsx +1 -63
  438. package/routes-src/docs-slug.tsx +2 -3
  439. package/routes-src/docs-tags-index.tsx +2 -3
  440. package/routes-src/docs-tags-tag.tsx +2 -3
  441. package/routes-src/docs-versions.tsx +2 -3
  442. package/routes-src/files-path.tsx +2 -4
  443. package/routes-src/index.tsx +2 -3
  444. package/routes-src/locale-docs-slug.tsx +2 -3
  445. package/routes-src/locale-docs-tags-index.tsx +2 -3
  446. package/routes-src/locale-docs-tags-tag.tsx +2 -3
  447. package/routes-src/locale-docs-versions.tsx +2 -3
  448. package/routes-src/locale-files-path.tsx +2 -4
  449. package/routes-src/locale-index.tsx +2 -3
  450. package/routes-src/mcp.tsx +25 -0
  451. package/routes-src/v-docs-slug.tsx +2 -3
  452. package/routes-src/v-locale-docs-slug.tsx +2 -3
  453. package/tsconfig.base.json +1 -1
  454. package/dist/safelist.css +0 -2
  455. package/dist/theme-no-reset.css +0 -379
  456. package/eject/desktop-sidebar-toggle-island/index.tsx +0 -110
@@ -1,10 +1,12 @@
1
1
  "use client";
2
2
 
3
- /** @jsxRuntime automatic */
4
- /** @jsxImportSource preact */
5
- // Use preact hook entrypoints directly — the "react" → "preact/compat" alias
6
- // lets us consume React-typed components in this Preact app.
7
- import { useState } from "preact/hooks";
3
+ import {
4
+ computed,
5
+ For,
6
+ Show,
7
+ signal,
8
+ type ReadonlySignal,
9
+ } from "@takazudo/zfb/zudo-react";
8
10
  import type { SidebarNavNode } from "../sidebar/types.js";
9
11
  import type { ResolvedDateFormats } from "../settings.js";
10
12
  import {
@@ -60,10 +62,10 @@ export interface SiteTreeNavProps {
60
62
  /** Locale used by dated note-tray rows. */
61
63
  locale?: string;
62
64
  /**
63
- * Per-role date patterns already resolved for this page's locale, serialized
65
+ * Per-role date patterns already resolved for the page's locale, serialized
64
66
  * into the island's `data-props` by the SSR wrapper (`site-tree-nav`,
65
67
  * `home-page`). Optional and absent-safe: an omitted value means every role
66
- * behaves as `"locale"` — today's `Intl` output (#4075).
68
+ * behaves as "locale" — today's `Intl` output (#4075).
67
69
  */
68
70
  dateFormats?: ResolvedDateFormats;
69
71
  /** @deprecated — no longer rendered (created date only). */
@@ -88,65 +90,88 @@ export function SiteTreeNav({
88
90
  if (categoryOrder) {
89
91
  processedTree = reorderTree(processedTree, categoryOrder);
90
92
  }
93
+
94
+ // Every value used to seed the tree is part of the JSON-serializable island
95
+ // props. There is no browser storage or location read during setup.
96
+ const roots = signal(processedTree);
91
97
  const initiallyCollapsed = new Set(initiallyCollapsedCategorySlugs);
98
+
92
99
  return (
93
100
  <nav
94
101
  aria-label={ariaLabel}
95
102
  data-site-nav
96
- className="grid gap-vsp-md"
103
+ class="grid gap-vsp-md"
97
104
  style={{
98
- gridTemplateColumns: "repeat(auto-fill, minmax(min(18rem, 100%), 1fr))",
105
+ "grid-template-columns": "repeat(auto-fill, minmax(min(18rem, 100%), 1fr))",
99
106
  }}
100
107
  >
101
- {processedTree.map((node) => {
102
- if (node.shape === "note-tray" && getNoteTrayItems(node).length === 0) {
103
- return null;
104
- }
105
- return (
106
- <div key={node.slug} className="min-w-0 border border-muted pl-hsp-sm py-vsp-2xs">
107
- {node.children.length > 0 ? (
108
- <CategoryNode
109
- node={node}
110
- depth={0}
111
- isLast={true}
112
- initiallyCollapsed={initiallyCollapsed.has(node.slug)}
113
- locale={locale}
114
- dateFormats={dateFormats}
115
- updatedLabel={updatedLabel}
116
- />
117
- ) : (
118
- <LeafNode node={node} depth={0} isLast={true} />
119
- )}
120
- </div>
121
- );
122
- })}
108
+ <For each={roots} by={(node) => node.slug}>
109
+ {(node, index) => {
110
+ const isLast = computed(() => index.value === roots.value.length - 1);
111
+ return (
112
+ <Show
113
+ when={computed(
114
+ () =>
115
+ node.value.shape !== "note-tray" ||
116
+ getNoteTrayItems(node.value).length > 0,
117
+ )}
118
+ >
119
+ {() => (
120
+ <div class="min-w-0 border border-muted pl-hsp-sm py-vsp-2xs">
121
+ <Show
122
+ when={computed(() => node.value.children.length > 0)}
123
+ fallback={() => (
124
+ <LeafNode node={node} depth={0} isLast={isLast} />
125
+ )}
126
+ >
127
+ {() => (
128
+ <CategoryNode
129
+ node={node}
130
+ depth={0}
131
+ isLast={isLast}
132
+ initiallyCollapsed={initiallyCollapsed.has(node.value.slug)}
133
+ locale={locale}
134
+ dateFormats={dateFormats}
135
+ updatedLabel={updatedLabel}
136
+ />
137
+ )}
138
+ </Show>
139
+ </div>
140
+ )}
141
+ </Show>
142
+ );
143
+ }}
144
+ </For>
123
145
  </nav>
124
146
  );
125
147
  }
126
148
  SiteTreeNav.displayName = "SiteTreeNav";
127
149
 
128
- function NodeList({ nodes, depth }: { nodes: SidebarNavNode[]; depth: number }) {
150
+ function NodeList({
151
+ nodes,
152
+ depth,
153
+ }: {
154
+ nodes: ReadonlySignal<readonly SidebarNavNode[]>;
155
+ depth: number;
156
+ }) {
129
157
  return (
130
- <>
131
- {nodes.map((node, index) => {
132
- const isLast = index === nodes.length - 1;
133
- return node.children.length > 0 ? (
134
- <CategoryNode
135
- key={node.slug}
136
- node={node}
137
- depth={depth}
138
- isLast={isLast}
139
- />
140
- ) : (
141
- <LeafNode
142
- key={node.slug}
143
- node={node}
144
- depth={depth}
145
- isLast={isLast}
146
- />
158
+ <For each={nodes} by={(node) => node.slug}>
159
+ {(node, index) => {
160
+ const isLast = computed(() => index.value === nodes.value.length - 1);
161
+ return (
162
+ <Show
163
+ when={computed(() => node.value.children.length > 0)}
164
+ fallback={() => (
165
+ <LeafNode node={node} depth={depth} isLast={isLast} />
166
+ )}
167
+ >
168
+ {() => (
169
+ <CategoryNode node={node} depth={depth} isLast={isLast} />
170
+ )}
171
+ </Show>
147
172
  );
148
- })}
149
- </>
173
+ }}
174
+ </For>
150
175
  );
151
176
  }
152
177
 
@@ -159,87 +184,131 @@ function CategoryNode({
159
184
  dateFormats,
160
185
  updatedLabel = "Updated",
161
186
  }: {
162
- node: SidebarNavNode;
187
+ node: ReadonlySignal<SidebarNavNode>;
163
188
  depth: number;
164
- isLast: boolean;
189
+ isLast: ReadonlySignal<boolean>;
165
190
  initiallyCollapsed?: boolean;
166
191
  locale?: string;
167
192
  dateFormats?: ResolvedDateFormats;
168
193
  updatedLabel?: string;
169
194
  }) {
170
- const [open, setOpen] = useState(() => initialCategoryOpenState(initiallyCollapsed));
171
- const toggle = () => setOpen(toggleCategoryOpenState);
195
+ const open = signal(initialCategoryOpenState(initiallyCollapsed));
196
+ const toggle = () => {
197
+ open.value = toggleCategoryOpenState(open.value);
198
+ };
199
+ const label = computed(() => node.value.label);
200
+ const href = computed(() => node.value.href);
201
+ const children = computed(() => node.value.children);
172
202
  const paddingLeft = padLeft(depth);
173
203
 
174
204
  return (
175
- <div className={`${depth >= 1 && !isLast ? "relative" : ""}`}>
176
- {depth >= 1 && !isLast && open && (
177
- <div
178
- className="absolute border-l border-dashed border-muted z-local-1"
179
- style={{
180
- left: connectorLeft(depth),
181
- top: 0,
182
- bottom: 0,
183
- }}
184
- />
185
- )}
186
- <div className="relative">
187
- <ConnectorLines
188
- depth={depth}
189
- isLast={isLast}
190
- widthScale={2}
191
- topPad="calc(0.15rem + var(--spacing-vsp-xs))"
192
- />
205
+ <div class={computed(() => (depth >= 1 && !isLast.value ? "relative" : ""))}>
206
+ <Show when={computed(() => depth >= 1 && !isLast.value && open.value)}>
207
+ {() => (
208
+ <div
209
+ class="absolute border-l border-dashed border-muted z-local-1"
210
+ style={{
211
+ left: connectorLeft(depth),
212
+ top: "0px",
213
+ bottom: "0px",
214
+ }}
215
+ />
216
+ )}
217
+ </Show>
218
+ <div class="relative">
219
+ <Show when={isLast}>
220
+ {() => (
221
+ <ConnectorLines
222
+ depth={depth}
223
+ isLast={true}
224
+ widthScale={2}
225
+ topPad="calc(0.15rem + var(--spacing-vsp-xs))"
226
+ />
227
+ )}
228
+ </Show>
229
+ <Show when={computed(() => !isLast.value)}>
230
+ {() => (
231
+ <ConnectorLines
232
+ depth={depth}
233
+ isLast={false}
234
+ widthScale={2}
235
+ topPad="calc(0.15rem + var(--spacing-vsp-xs))"
236
+ />
237
+ )}
238
+ </Show>
193
239
  <div
194
- className="flex w-full items-center justify-between text-small font-semibold pt-[0.15rem] text-fg"
195
- style={{ paddingLeft }}
240
+ class="flex w-full items-center justify-between text-small font-semibold pt-[0.15rem] text-fg"
241
+ style={{ "padding-left": paddingLeft }}
196
242
  >
197
- {node.href ? (
198
- <a
199
- href={node.href}
200
- className="flex-1 flex items-start gap-hsp-xs py-vsp-xs text-fg hover:text-accent hover:underline focus:underline focus-visible:text-accent"
201
- >
202
- {depth === 0 && (
203
- <span className="flex h-[1lh] items-center">
204
- <CategoryLinkIcon className="w-[18px] 2xl:w-[24px]" />
205
- </span>
206
- )}
207
- {node.label}
208
- </a>
209
- ) : (
210
- <button
211
- type="button"
212
- onClick={toggle}
213
- className="flex-1 min-w-0 break-words py-vsp-xs text-left hover:text-accent hover:underline focus:underline"
214
- >
215
- {node.label}
216
- </button>
217
- )}
243
+ <Show
244
+ when={computed(() => Boolean(href.value))}
245
+ fallback={() => (
246
+ <button
247
+ type="button"
248
+ on:click={toggle}
249
+ class="flex-1 min-w-0 break-words py-vsp-xs text-left hover:text-accent hover:underline focus:underline"
250
+ >
251
+ {label}
252
+ </button>
253
+ )}
254
+ >
255
+ {() => (
256
+ <a
257
+ href={computed(() => href.value ?? "")}
258
+ class="flex-1 flex items-start gap-hsp-xs py-vsp-xs text-fg hover:text-accent hover:underline focus:underline focus-visible:text-accent"
259
+ >
260
+ {depth === 0 && (
261
+ <span class="flex h-[1lh] items-center">
262
+ <CategoryLinkIcon class="w-[18px]" />
263
+ </span>
264
+ )}
265
+ {label}
266
+ </a>
267
+ )}
268
+ </Show>
218
269
  <button
219
270
  type="button"
220
- onClick={toggle}
221
- className="aspect-square flex items-center justify-center w-[1.75rem] border-y border-l border-muted hover:underline focus:underline"
222
- aria-expanded={open}
223
- aria-label={open ? `Collapse ${node.label}` : `Expand ${node.label}`}
271
+ on:click={toggle}
272
+ class="aspect-square flex items-center justify-center w-[1.75rem] border-y border-l border-muted hover:underline focus:underline"
273
+ aria-expanded={computed(() => (open.value ? "true" : "false"))}
274
+ aria-label={computed(
275
+ () => `${open.value ? "Collapse" : "Expand"} ${label.value}`,
276
+ )}
224
277
  >
225
- <ChevronRight className={`h-icon-xs w-icon-xs transition-transform duration-150 ${open ? "rotate-90" : ""} text-muted`} />
278
+ <span
279
+ class="inline-flex transition-transform duration-150"
280
+ style={computed(
281
+ () => `transform:rotate(${open.value ? "90deg" : "0deg"})`,
282
+ )}
283
+ >
284
+ <ChevronRight class="h-icon-xs w-icon-xs text-muted" />
285
+ </span>
226
286
  </button>
227
287
  </div>
228
288
  </div>
229
- {open && (
230
- <div>
231
- {node.shape === "note-tray" && depth === 0 ? (
232
- <NoteTrayNodeList
233
- node={node}
234
- locale={locale}
235
- dateFormats={dateFormats}
236
- updatedLabel={updatedLabel}
237
- />
238
- ) : (
239
- <NodeList nodes={node.children} depth={depth + 1} />
240
- )}
241
- </div>
242
- )}
289
+ <Show when={open}>
290
+ {() => (
291
+ <div>
292
+ <Show
293
+ when={computed(
294
+ () => node.value.shape === "note-tray" && depth === 0,
295
+ )}
296
+ fallback={() => (
297
+ <NodeList nodes={children} depth={depth + 1} />
298
+ )}
299
+ >
300
+ {() => (
301
+ <NoteTrayNodeList
302
+ node={node}
303
+ locale={locale}
304
+ dateFormats={dateFormats}
305
+ updatedLabel={updatedLabel}
306
+ />
307
+ )}
308
+ </Show>
309
+ </div>
310
+ )}
311
+ </Show>
243
312
  </div>
244
313
  );
245
314
  }
@@ -250,62 +319,83 @@ function NoteTrayNodeList({
250
319
  dateFormats,
251
320
  updatedLabel,
252
321
  }: {
253
- node: SidebarNavNode;
322
+ node: ReadonlySignal<SidebarNavNode>;
254
323
  locale: string;
255
324
  dateFormats?: ResolvedDateFormats;
256
325
  updatedLabel: string;
257
326
  }) {
258
- const items = getNoteTrayItems(node);
259
- const width = rankWidth(items);
260
- const showDate = node.noteTrayDated === true;
261
- const grouping =
262
- showDate && node.noteTraySidebar !== "index"
263
- ? node.noteTraySidebar
264
- : undefined;
265
-
266
- if (grouping === "year" || grouping === "month") {
267
- return (
268
- <div className="pl-hsp-md pr-hsp-sm">
269
- {groupItems(items, grouping, node.sortOrder ?? "asc").map((group) => (
270
- <div key={group.key} data-note-tray-group={group.key}>
271
- <div className="pt-vsp-sm pb-vsp-2xs text-micro tracking-wide uppercase text-muted">
272
- {grouping === "year"
273
- ? formatYearLabel(group.key, locale, dateFormats?.year)
274
- : formatYearMonthLabel(group.key, locale, dateFormats?.yearMonth)}
275
- </div>
276
- {group.items.map((item) => (
277
- <NoteTrayRow
278
- key={item.slug}
279
- item={item}
280
- locale={locale}
281
- dateFormats={dateFormats}
282
- updatedLabel={updatedLabel}
283
- rankWidth={width}
284
- showDate={showDate}
285
- groupedDate={true}
286
- />
287
- ))}
288
- </div>
289
- ))}
290
- </div>
291
- );
292
- }
327
+ const items = computed(() => getNoteTrayItems(node.value));
328
+ const width = computed(() => rankWidth(items.value));
329
+ const showDate = computed(() => node.value.noteTrayDated === true);
330
+ const grouping = computed(() => {
331
+ const mode = node.value.noteTraySidebar;
332
+ return showDate.value && mode !== "index" ? mode : undefined;
333
+ });
334
+ const groups = computed(() => {
335
+ const mode = grouping.value;
336
+ if (mode !== "year" && mode !== "month") return [];
337
+ return groupItems(items.value, mode, node.value.sortOrder ?? "asc");
338
+ });
293
339
 
294
340
  return (
295
- <div className="pl-hsp-md pr-hsp-sm">
296
- {items.map((item) => (
297
- <NoteTrayRow
298
- key={item.slug}
299
- item={item}
300
- locale={locale}
301
- dateFormats={dateFormats}
302
- updatedLabel={updatedLabel}
303
- rankWidth={width}
304
- showDate={showDate}
305
- groupedDate={false}
306
- />
307
- ))}
308
- </div>
341
+ <>
342
+ <Show when={computed(() => grouping.value === "year" || grouping.value === "month")}>
343
+ {() => (
344
+ <div class="pl-hsp-md pr-hsp-sm">
345
+ <For each={groups} by={(group) => group.key}>
346
+ {(group) => {
347
+ const groupItemsSignal = computed(() => group.value.items);
348
+ const heading = computed(() => {
349
+ const mode = grouping.value;
350
+ return mode === "year"
351
+ ? formatYearLabel(group.value.key, locale, dateFormats?.year)
352
+ : formatYearMonthLabel(group.value.key, locale, dateFormats?.yearMonth);
353
+ });
354
+ return (
355
+ <div data-note-tray-group={computed(() => group.value.key)}>
356
+ <div class="pt-vsp-sm pb-vsp-2xs text-micro tracking-wide uppercase text-muted">
357
+ {heading}
358
+ </div>
359
+ <For each={groupItemsSignal} by={(item) => item.slug}>
360
+ {(item) => (
361
+ <NoteTrayRow
362
+ item={item}
363
+ locale={locale}
364
+ dateFormats={dateFormats}
365
+ updatedLabel={updatedLabel}
366
+ rankWidth={width}
367
+ showDate={showDate}
368
+ groupedDate={true}
369
+ />
370
+ )}
371
+ </For>
372
+ </div>
373
+ );
374
+ }}
375
+ </For>
376
+ </div>
377
+ )}
378
+ </Show>
379
+ <Show when={computed(() => grouping.value !== "year" && grouping.value !== "month")}>
380
+ {() => (
381
+ <div class="pl-hsp-md pr-hsp-sm">
382
+ <For each={items} by={(item) => item.slug}>
383
+ {(item) => (
384
+ <NoteTrayRow
385
+ item={item}
386
+ locale={locale}
387
+ dateFormats={dateFormats}
388
+ updatedLabel={updatedLabel}
389
+ rankWidth={width}
390
+ showDate={showDate}
391
+ groupedDate={false}
392
+ />
393
+ )}
394
+ </For>
395
+ </div>
396
+ )}
397
+ </Show>
398
+ </>
309
399
  );
310
400
  }
311
401
 
@@ -313,53 +403,65 @@ function NoteTrayRow({
313
403
  item,
314
404
  locale,
315
405
  dateFormats,
316
- updatedLabel,
317
406
  rankWidth: width,
318
407
  showDate,
319
408
  groupedDate,
320
409
  }: {
321
- item: SidebarNavNode;
410
+ item: ReadonlySignal<SidebarNavNode>;
322
411
  locale: string;
323
412
  dateFormats?: ResolvedDateFormats;
324
413
  updatedLabel: string;
325
- rankWidth: number;
326
- showDate: boolean;
414
+ rankWidth: ReadonlySignal<number>;
415
+ showDate: ReadonlySignal<boolean>;
327
416
  groupedDate: boolean;
328
417
  }) {
329
- if (!item.href) return null;
330
- // formatMonthDay is (iso, pattern, locale) — pattern SECOND, unlike
331
- // formatDate below; a locale in slot 2 is read as a pattern.
332
- const dateLabel = showDate && item.date
333
- ? groupedDate
334
- ? formatMonthDay(item.date, dateFormats?.numericMonthDay, locale)
335
- : formatDate(item.date, locale, dateFormats?.full)
336
- : undefined;
418
+ const href = computed(() => item.value.href);
419
+ const dateLabel = computed(() => {
420
+ if (!showDate.value || !item.value.date) return undefined;
421
+ return groupedDate
422
+ ? formatMonthDay(item.value.date, dateFormats?.numericMonthDay, locale)
423
+ : formatDate(item.value.date, locale, dateFormats?.full);
424
+ });
425
+ const rankLabel = computed(() =>
426
+ item.value.rank === undefined
427
+ ? ""
428
+ : String(item.value.rank).padStart(width.value, "0"),
429
+ );
337
430
 
338
431
  return (
339
- <a
340
- href={item.href}
341
- data-note-tray-row
342
- className="flex items-start gap-hsp-sm py-vsp-2xs text-small text-fg hover:text-accent hover:underline focus:underline focus-visible:text-accent"
343
- >
344
- {dateLabel ? (
345
- <time
346
- dateTime={item.date}
347
- className="shrink-0 font-mono tabular-nums text-caption text-muted"
348
- >
349
- {dateLabel}
350
- </time>
351
- ) : (
352
- <span
353
- className="shrink-0 font-mono tabular-nums text-caption text-muted"
354
- style={{ width: `${width}ch` }}
432
+ <Show when={computed(() => Boolean(href.value))}>
433
+ {() => (
434
+ <a
435
+ href={computed(() => href.value ?? "")}
436
+ data-note-tray-row
437
+ class="flex items-start gap-hsp-sm py-vsp-2xs text-small text-fg hover:text-accent hover:underline focus:underline focus-visible:text-accent"
355
438
  >
356
- {item.rank === undefined ? "" : String(item.rank).padStart(width, "0")}
357
- </span>
439
+ <Show
440
+ when={computed(() => Boolean(dateLabel.value))}
441
+ fallback={() => (
442
+ <span
443
+ class="shrink-0 font-mono tabular-nums text-caption text-muted"
444
+ style={computed(() => ({ width: `${width.value}ch` }))}
445
+ >
446
+ {rankLabel}
447
+ </span>
448
+ )}
449
+ >
450
+ {() => (
451
+ <time
452
+ datetime={computed(() => item.value.date ?? "")}
453
+ class="shrink-0 font-mono tabular-nums text-caption text-muted"
454
+ >
455
+ {computed(() => dateLabel.value ?? "")}
456
+ </time>
457
+ )}
458
+ </Show>
459
+ <span class="min-w-0 break-words">
460
+ <span>{computed(() => item.value.label)}</span>
461
+ </span>
462
+ </a>
358
463
  )}
359
- <span className="min-w-0 break-words">
360
- <span>{item.label}</span>
361
- </span>
362
- </a>
464
+ </Show>
363
465
  );
364
466
  }
365
467
 
@@ -368,11 +470,12 @@ function LeafNode({
368
470
  depth,
369
471
  isLast,
370
472
  }: {
371
- node: SidebarNavNode;
473
+ node: ReadonlySignal<SidebarNavNode>;
372
474
  depth: number;
373
- isLast: boolean;
475
+ isLast: ReadonlySignal<boolean>;
374
476
  }) {
375
- if (!node.href) return null;
477
+ const href = computed(() => node.value.href);
478
+ const label = computed(() => node.value.label);
376
479
  const isRoot = depth === 0;
377
480
  const paddingLeft = padLeft(depth);
378
481
 
@@ -381,25 +484,49 @@ function LeafNode({
381
484
  : "var(--spacing-vsp-2xs)";
382
485
 
383
486
  return (
384
- <div>
385
- <div className="relative">
386
- <ConnectorLines depth={depth} isLast={isLast} widthScale={2} topPad={topPad} />
387
- <a
388
- href={node.href}
389
- className={isRoot
390
- ? "flex items-start gap-hsp-xs py-[calc(var(--spacing-vsp-xs)+0.15rem)] pr-hsp-sm text-small font-semibold text-fg break-words hover:text-accent hover:underline focus:underline focus-visible:text-accent"
391
- : `block py-vsp-2xs pr-hsp-sm ${isLast ? "pb-vsp-xs" : ""} text-small text-fg break-words hover:text-accent hover:underline focus:underline focus-visible:text-accent`
392
- }
393
- style={{ paddingLeft }}
394
- >
395
- {isRoot && (
396
- <span className="flex h-[1lh] items-center">
397
- <CategoryLinkIcon className="w-[18px] 2xl:w-[24px]" />
398
- </span>
399
- )}
400
- {isRoot ? <span className="min-w-0">{node.label}</span> : node.label}
401
- </a>
402
- </div>
403
- </div>
487
+ <Show when={computed(() => Boolean(href.value))}>
488
+ {() => (
489
+ <div>
490
+ <div class="relative">
491
+ <Show when={isLast}>
492
+ {() => (
493
+ <ConnectorLines
494
+ depth={depth}
495
+ isLast={true}
496
+ widthScale={2}
497
+ topPad={topPad}
498
+ />
499
+ )}
500
+ </Show>
501
+ <Show when={computed(() => !isLast.value)}>
502
+ {() => (
503
+ <ConnectorLines
504
+ depth={depth}
505
+ isLast={false}
506
+ widthScale={2}
507
+ topPad={topPad}
508
+ />
509
+ )}
510
+ </Show>
511
+ <a
512
+ href={computed(() => href.value ?? "")}
513
+ class={computed(() =>
514
+ isRoot
515
+ ? "flex items-start gap-hsp-xs py-[calc(var(--spacing-vsp-xs)_+_0.15rem)] pr-hsp-sm text-small font-semibold text-fg break-words hover:text-accent hover:underline focus:underline focus-visible:text-accent"
516
+ : `block py-vsp-2xs pr-hsp-sm ${isLast.value ? "pb-vsp-xs" : ""} text-small text-fg break-words hover:text-accent hover:underline focus:underline focus-visible:text-accent`,
517
+ )}
518
+ style={{ "padding-left": paddingLeft }}
519
+ >
520
+ {isRoot && (
521
+ <span class="flex h-[1lh] items-center">
522
+ <CategoryLinkIcon class="w-[18px]" />
523
+ </span>
524
+ )}
525
+ {isRoot ? <span class="min-w-0">{label}</span> : label}
526
+ </a>
527
+ </div>
528
+ </div>
529
+ )}
530
+ </Show>
404
531
  );
405
532
  }