@takazudo/zudo-doc 5.28.2 → 6.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (511) hide show
  1. package/CHANGELOG.md +33 -0
  2. package/README.md +49 -16
  3. package/bin/gen-z-index.mjs +18 -18
  4. package/dist/agent-docs/identity.d.ts +4 -0
  5. package/dist/agent-docs/identity.js +24 -0
  6. package/dist/agent-docs/index.d.ts +5 -0
  7. package/dist/agent-docs/index.js +5 -0
  8. package/dist/agent-docs/limits.d.ts +11 -0
  9. package/dist/agent-docs/limits.js +24 -0
  10. package/dist/agent-docs/search.d.ts +14 -0
  11. package/dist/agent-docs/search.js +82 -0
  12. package/dist/agent-docs/tokenize.d.ts +2 -0
  13. package/dist/agent-docs/tokenize.js +22 -0
  14. package/dist/agent-docs/types.d.ts +68 -0
  15. package/dist/agent-docs/types.js +0 -0
  16. package/dist/ai-chat-modal/index.d.ts +1 -4
  17. package/dist/ai-chat-modal/index.js +183 -123
  18. package/dist/asset-components/asset-card.d.ts +1 -2
  19. package/dist/asset-components/asset-card.js +12 -12
  20. package/dist/asset-components/asset-code.d.ts +1 -2
  21. package/dist/asset-components/asset-code.js +10 -10
  22. package/dist/asset-components/shared.d.ts +3 -4
  23. package/dist/asset-components/shared.js +4 -4
  24. package/dist/asset-index-page/body.d.ts +5 -6
  25. package/dist/asset-index-page/body.js +6 -6
  26. package/dist/asset-index-page/index.d.ts +1 -2
  27. package/dist/asset-index-page/index.js +1 -1
  28. package/dist/asset-page/body.d.ts +5 -9
  29. package/dist/asset-page/body.js +3 -3
  30. package/dist/asset-page/components.d.ts +16 -17
  31. package/dist/asset-page/components.js +10 -9
  32. package/dist/asset-page/index.d.ts +1 -2
  33. package/dist/asset-page/index.js +1 -1
  34. package/dist/auto-logo/index.d.ts +1 -2
  35. package/dist/auto-logo/index.js +2 -2
  36. package/dist/body-foot-util/body-foot-util-area.d.ts +3 -4
  37. package/dist/body-foot-util/body-foot-util-area.js +1 -2
  38. package/dist/body-foot-util/edit-link.d.ts +2 -3
  39. package/dist/body-foot-util/edit-link.js +1 -2
  40. package/dist/breadcrumb/breadcrumb.d.ts +6 -6
  41. package/dist/breadcrumb/breadcrumb.js +3 -4
  42. package/dist/catalog.js +1 -1
  43. package/dist/category-nav/index.d.ts +1 -2
  44. package/dist/category-nav/index.js +11 -5
  45. package/dist/category-tree-nav/index.d.ts +1 -2
  46. package/dist/category-tree-nav/index.js +3 -3
  47. package/dist/chrome/derive.d.ts +18 -27
  48. package/dist/chrome/derive.js +47 -29
  49. package/dist/chrome/index.d.ts +5 -5
  50. package/dist/chrome/index.js +1 -1
  51. package/dist/chrome/island-data.d.ts +4 -0
  52. package/dist/chrome/island-data.js +52 -0
  53. package/dist/chrome/primary-slots.d.ts +2 -3
  54. package/dist/chrome-bindings.d.ts +30 -22
  55. package/dist/code-group/index.d.ts +3 -4
  56. package/dist/code-group/index.js +3 -7
  57. package/dist/code-syntax/code-block-enhancer.d.ts +1 -2
  58. package/dist/code-syntax/code-block-enhancer.js +2 -2
  59. package/dist/code-syntax/mermaid-init.d.ts +1 -2
  60. package/dist/code-syntax/mermaid-init.js +5 -2
  61. package/dist/code-syntax/tabs-init-script.js +1 -1
  62. package/dist/code-syntax/tabs-init.d.ts +1 -2
  63. package/dist/code-syntax/tabs-init.js +2 -2
  64. package/dist/code-syntax/tabs.d.ts +6 -6
  65. package/dist/code-syntax/tabs.js +8 -8
  66. package/dist/compiled.css +2937 -2942
  67. package/dist/config/component-tokens.d.ts +1 -1
  68. package/dist/config/component-tokens.js +22 -0
  69. package/dist/config-assertions/index.d.ts +13 -0
  70. package/dist/config-assertions/index.js +14 -0
  71. package/dist/config.d.ts +36 -17
  72. package/dist/config.js +23 -95
  73. package/dist/content/content-blockquote.d.ts +2 -3
  74. package/dist/content/content-blockquote.js +3 -3
  75. package/dist/content/content-code.d.ts +3 -4
  76. package/dist/content/content-code.js +5 -5
  77. package/dist/content/content-link.d.ts +3 -4
  78. package/dist/content/content-link.js +10 -10
  79. package/dist/content/content-ol.d.ts +2 -3
  80. package/dist/content/content-ol.js +5 -4
  81. package/dist/content/content-paragraph.d.ts +2 -3
  82. package/dist/content/content-paragraph.js +1 -1
  83. package/dist/content/content-strong.d.ts +2 -3
  84. package/dist/content/content-strong.js +3 -3
  85. package/dist/content/content-table.d.ts +2 -3
  86. package/dist/content/content-table.js +4 -4
  87. package/dist/content/content-ul.d.ts +2 -3
  88. package/dist/content/content-ul.js +4 -4
  89. package/dist/content/heading-h2.d.ts +2 -3
  90. package/dist/content/heading-h2.js +4 -4
  91. package/dist/content/heading-h3.d.ts +2 -3
  92. package/dist/content/heading-h3.js +4 -4
  93. package/dist/content/heading-h4.d.ts +2 -3
  94. package/dist/content/heading-h4.js +4 -4
  95. package/dist/content-admonition/index.d.ts +3 -4
  96. package/dist/content-admonition/index.js +2 -2
  97. package/dist/content.css +35 -33
  98. package/dist/design-token-panel-bootstrap-controller.d.ts +178 -0
  99. package/dist/design-token-panel-bootstrap-controller.js +359 -0
  100. package/dist/design-token-panel-bootstrap-island.d.ts +5 -0
  101. package/dist/design-token-panel-bootstrap-island.js +19 -0
  102. package/dist/design-token-panel-bootstrap.d.ts +5 -195
  103. package/dist/design-token-panel-bootstrap.js +3 -288
  104. package/dist/desktop-sidebar-toggle-island/index.d.ts +2 -7
  105. package/dist/desktop-sidebar-toggle-island/index.js +2 -58
  106. package/dist/desktop-sidebar-toggle-island/island.d.ts +4 -0
  107. package/dist/desktop-sidebar-toggle-island/island.js +43 -0
  108. package/dist/desktop-sidebar-toggle-island/storage.d.ts +4 -0
  109. package/dist/desktop-sidebar-toggle-island/storage.js +29 -0
  110. package/dist/desktop-toc-toggle-island/index.d.ts +2 -7
  111. package/dist/desktop-toc-toggle-island/index.js +2 -58
  112. package/dist/desktop-toc-toggle-island/island.d.ts +4 -0
  113. package/dist/desktop-toc-toggle-island/island.js +43 -0
  114. package/dist/desktop-toc-toggle-island/storage.d.ts +4 -0
  115. package/dist/desktop-toc-toggle-island/storage.js +29 -0
  116. package/dist/details/details.d.ts +3 -4
  117. package/dist/details/details.js +1 -1
  118. package/dist/doc-body-end/index.d.ts +1 -2
  119. package/dist/doc-body-end/index.js +1 -1
  120. package/dist/doc-body-end-islands/design-token-panel-island.d.ts +2 -2
  121. package/dist/doc-body-end-islands/design-token-panel-island.js +3 -7
  122. package/dist/doc-body-end-islands/index.d.ts +4 -21
  123. package/dist/doc-body-end-islands/index.js +5 -3
  124. package/dist/doc-body-end-islands/theme-pack-switcher-island.d.ts +3 -13
  125. package/dist/doc-body-end-islands/theme-pack-switcher-island.js +11 -13
  126. package/dist/doc-content-header/index.d.ts +1 -2
  127. package/dist/doc-content-header/index.js +1 -1
  128. package/dist/doc-history/index.d.ts +1 -1
  129. package/dist/doc-history/index.js +166 -141
  130. package/dist/doc-history-area/index.d.ts +6 -4
  131. package/dist/doc-history-area/index.js +17 -16
  132. package/dist/doc-metainfo-area/index.d.ts +2 -3
  133. package/dist/doc-metainfo-area/index.js +1 -1
  134. package/dist/doc-page-renderer/index.d.ts +13 -7
  135. package/dist/doc-page-renderer/index.js +10 -1
  136. package/dist/doc-page-shell/index.d.ts +20 -7
  137. package/dist/doc-page-shell/index.js +17 -6
  138. package/dist/doc-pager/index.d.ts +1 -2
  139. package/dist/doc-pager/index.js +3 -3
  140. package/dist/doc-tags-area/index.d.ts +2 -3
  141. package/dist/doc-tags-area/index.js +1 -1
  142. package/dist/doclayout/doc-layout-with-defaults.d.ts +9 -9
  143. package/dist/doclayout/doc-layout-with-defaults.js +5 -15
  144. package/dist/doclayout/doc-layout.d.ts +26 -27
  145. package/dist/doclayout/doc-layout.js +23 -14
  146. package/dist/docs-schema/index.d.ts +4 -0
  147. package/dist/docs-schema/index.js +1 -0
  148. package/dist/extract-headings/index.js +43 -12
  149. package/dist/factory-context/index.d.ts +22 -19
  150. package/dist/features.css +75 -8
  151. package/dist/find-in-page/find-bar.d.ts +4 -2
  152. package/dist/find-in-page/find-bar.js +58 -69
  153. package/dist/find-in-page/index.d.ts +2 -8
  154. package/dist/find-in-page/index.js +33 -30
  155. package/dist/footer/footer.d.ts +3 -4
  156. package/dist/footer/footer.js +3 -3
  157. package/dist/footer-with-defaults/index.d.ts +2 -3
  158. package/dist/footer-with-defaults/index.js +1 -1
  159. package/dist/frontmatter-preview-defaults/index.js +1 -0
  160. package/dist/head/doc-head.d.ts +1 -1
  161. package/dist/head/doc-head.js +24 -32
  162. package/dist/head/og-tags.d.ts +1 -1
  163. package/dist/head/og-tags.js +8 -7
  164. package/dist/head/twitter-card.d.ts +1 -1
  165. package/dist/head/twitter-card.js +1 -1
  166. package/dist/head-with-defaults/index.d.ts +7 -2
  167. package/dist/head-with-defaults/index.js +46 -32
  168. package/dist/header/header.d.ts +8 -8
  169. package/dist/header/header.js +9 -11
  170. package/dist/header/types.d.ts +7 -7
  171. package/dist/header-with-defaults/index.d.ts +3 -4
  172. package/dist/header-with-defaults/index.js +27 -14
  173. package/dist/home-intro/index.d.ts +2 -5
  174. package/dist/home-intro/index.js +7 -5
  175. package/dist/home-intro/prepare.js +4 -3
  176. package/dist/home-page/index.d.ts +3 -3
  177. package/dist/home-page/index.js +19 -17
  178. package/dist/html-preview-wrapper/highlighted-code.d.ts +3 -4
  179. package/dist/html-preview-wrapper/highlighted-code.js +19 -17
  180. package/dist/html-preview-wrapper/html-preview-wrapper.d.ts +4 -25
  181. package/dist/html-preview-wrapper/html-preview-wrapper.js +2 -87
  182. package/dist/html-preview-wrapper/html-preview.d.ts +3 -10
  183. package/dist/html-preview-wrapper/html-preview.js +13 -37
  184. package/dist/html-preview-wrapper/index.d.ts +2 -1
  185. package/dist/html-preview-wrapper/index.js +1 -1
  186. package/dist/html-preview-wrapper/preview-base.d.ts +3 -5
  187. package/dist/html-preview-wrapper/preview-base.js +56 -59
  188. package/dist/html-preview-wrapper/wrapper.d.ts +20 -0
  189. package/dist/html-preview-wrapper/wrapper.js +37 -0
  190. package/dist/hydration-pending.d.ts +3 -5
  191. package/dist/hydration-pending.js +7 -5
  192. package/dist/i18n-version/language-switcher.d.ts +5 -32
  193. package/dist/i18n-version/language-switcher.js +5 -106
  194. package/dist/i18n-version/switcher-generated-scripts.d.ts +2 -0
  195. package/dist/i18n-version/switcher-generated-scripts.js +107 -0
  196. package/dist/i18n-version/switcher-url-state.d.ts +76 -0
  197. package/dist/i18n-version/switcher-url-state.js +103 -0
  198. package/dist/i18n-version/version-banner.d.ts +2 -3
  199. package/dist/i18n-version/version-banner.js +1 -1
  200. package/dist/i18n-version/version-switcher.d.ts +5 -50
  201. package/dist/i18n-version/version-switcher.js +5 -157
  202. package/dist/icons/index.d.ts +18 -19
  203. package/dist/icons/index.js +17 -33
  204. package/dist/image-enlarge/index.d.ts +1 -10
  205. package/dist/image-enlarge/index.js +80 -55
  206. package/dist/image-enlarge/public.d.ts +2 -0
  207. package/dist/image-enlarge/public.js +6 -0
  208. package/dist/image-enlarge/ssr-fallback.d.ts +2 -0
  209. package/dist/image-enlarge/ssr-fallback.js +8 -0
  210. package/dist/index.d.ts +11 -4
  211. package/dist/inline-version-switcher/index.d.ts +1 -2
  212. package/dist/inline-version-switcher/index.js +1 -1
  213. package/dist/island-types/index.d.ts +2 -2
  214. package/dist/island-types/index.js +1 -5
  215. package/dist/math-block/index.d.ts +4 -7
  216. package/dist/math-block/index.js +5 -5
  217. package/dist/mcp/handler.d.ts +8 -0
  218. package/dist/mcp/handler.js +129 -0
  219. package/dist/mcp/index.d.ts +4 -0
  220. package/dist/mcp/index.js +7 -0
  221. package/dist/mcp/loader.d.ts +19 -0
  222. package/dist/mcp/loader.js +202 -0
  223. package/dist/mdx-components/index.js +40 -108
  224. package/dist/mermaid-enlarge/index.d.ts +1 -8
  225. package/dist/mermaid-enlarge/index.js +174 -158
  226. package/dist/mermaid-enlarge/public.d.ts +2 -0
  227. package/dist/mermaid-enlarge/public.js +6 -0
  228. package/dist/mermaid-enlarge/ssr-fallback.d.ts +2 -0
  229. package/dist/mermaid-enlarge/ssr-fallback.js +8 -0
  230. package/dist/metainfo/doc-metainfo.d.ts +2 -3
  231. package/dist/metainfo/doc-metainfo.js +1 -4
  232. package/dist/metainfo/doc-tags.d.ts +2 -3
  233. package/dist/metainfo/doc-tags.js +1 -1
  234. package/dist/metainfo/frontmatter-preview.d.ts +3 -4
  235. package/dist/metainfo/frontmatter-preview.js +1 -1
  236. package/dist/nav-data-prep/index.js +6 -4
  237. package/dist/nav-indexing/category-nav.d.ts +2 -3
  238. package/dist/nav-indexing/category-nav.js +1 -2
  239. package/dist/nav-indexing/category-tree-nav.d.ts +2 -3
  240. package/dist/nav-indexing/category-tree-nav.js +1 -1
  241. package/dist/nav-indexing/doc-card-grid.d.ts +2 -3
  242. package/dist/nav-indexing/doc-card-grid.js +1 -2
  243. package/dist/nav-indexing/docs-sitemap.d.ts +2 -3
  244. package/dist/nav-indexing/docs-sitemap.js +2 -2
  245. package/dist/nav-indexing/index.d.ts +1 -1
  246. package/dist/nav-indexing/nav-card-grid.d.ts +2 -3
  247. package/dist/nav-indexing/nav-card-grid.js +1 -2
  248. package/dist/nav-indexing/note-tray-index-parts/card-list.d.ts +1 -2
  249. package/dist/nav-indexing/note-tray-index-parts/card-list.js +4 -4
  250. package/dist/nav-indexing/note-tray-index-parts/date-line.d.ts +2 -3
  251. package/dist/nav-indexing/note-tray-index-parts/date-line.js +1 -1
  252. package/dist/nav-indexing/note-tray-index-parts/index-list.d.ts +1 -2
  253. package/dist/nav-indexing/note-tray-index-parts/index-list.js +2 -2
  254. package/dist/nav-indexing/note-tray-index-parts/timeline.d.ts +1 -2
  255. package/dist/nav-indexing/note-tray-index-parts/timeline.js +2 -2
  256. package/dist/nav-indexing/note-tray-index.d.ts +1 -2
  257. package/dist/nav-indexing/note-tray-index.js +1 -1
  258. package/dist/nav-indexing/site-tree-nav-demo.d.ts +2 -3
  259. package/dist/nav-indexing/site-tree-nav-demo.js +2 -2
  260. package/dist/nav-indexing/tag-nav.d.ts +1 -2
  261. package/dist/nav-indexing/tag-nav.js +1 -1
  262. package/dist/nav-indexing/types.d.ts +2 -2
  263. package/dist/nav-indexing/versions-page-content.d.ts +2 -3
  264. package/dist/nav-indexing/versions-page-content.js +8 -8
  265. package/dist/note-tray-index/index.d.ts +1 -2
  266. package/dist/note-tray-index/index.js +1 -1
  267. package/dist/page-loading/page-loading-overlay.d.ts +1 -2
  268. package/dist/page-loading/page-loading-overlay.js +3 -5
  269. package/dist/plugins/agent-export.d.ts +3 -0
  270. package/dist/plugins/agent-export.js +34 -0
  271. package/dist/plugins/internal/agent-export/chunk.d.ts +5 -0
  272. package/dist/plugins/internal/agent-export/chunk.js +90 -0
  273. package/dist/plugins/internal/agent-export/index.d.ts +24 -0
  274. package/dist/plugins/internal/agent-export/index.js +123 -0
  275. package/dist/plugins/internal/agent-export/normalize.d.ts +5 -0
  276. package/dist/plugins/internal/agent-export/normalize.js +73 -0
  277. package/dist/plugins/internal/llms-txt/dev-middleware.d.ts +6 -0
  278. package/dist/plugins/internal/llms-txt/dev-middleware.js +8 -3
  279. package/dist/plugins/internal/llms-txt/emit.js +23 -6
  280. package/dist/plugins/internal/llms-txt/generate.d.ts +7 -1
  281. package/dist/plugins/internal/llms-txt/generate.js +9 -2
  282. package/dist/plugins/internal/llms-txt/load.d.ts +2 -0
  283. package/dist/plugins/internal/llms-txt/load.js +20 -4
  284. package/dist/plugins/internal/llms-txt/types.d.ts +10 -0
  285. package/dist/plugins/routes.js +4 -0
  286. package/dist/preset.d.ts +19 -9
  287. package/dist/preset.js +20 -1
  288. package/dist/route-context-payload/index.js +1 -1
  289. package/dist/routes/404.d.ts +2 -3
  290. package/dist/routes/404.js +1 -1
  291. package/dist/routes/_chrome.d.ts +5 -5
  292. package/dist/routes/_chrome.js +7 -2
  293. package/dist/routes/_context.d.ts +4 -4
  294. package/dist/routes/_design-token-panel-bootstrap.d.ts +1 -4
  295. package/dist/routes/_design-token-panel-bootstrap.js +9 -1
  296. package/dist/routes/docs-slug.d.ts +2 -3
  297. package/dist/routes/docs-tags-index.d.ts +2 -3
  298. package/dist/routes/docs-tags-index.js +1 -1
  299. package/dist/routes/docs-tags-tag.d.ts +2 -3
  300. package/dist/routes/docs-tags-tag.js +1 -1
  301. package/dist/routes/docs-versions.d.ts +2 -3
  302. package/dist/routes/docs-versions.js +1 -1
  303. package/dist/routes/files-path.d.ts +2 -3
  304. package/dist/routes/files-path.js +1 -1
  305. package/dist/routes/index.d.ts +2 -3
  306. package/dist/routes/index.js +1 -1
  307. package/dist/routes/locale-docs-slug.d.ts +2 -3
  308. package/dist/routes/locale-docs-tags-index.d.ts +2 -3
  309. package/dist/routes/locale-docs-tags-index.js +1 -1
  310. package/dist/routes/locale-docs-tags-tag.d.ts +2 -3
  311. package/dist/routes/locale-docs-tags-tag.js +1 -1
  312. package/dist/routes/locale-docs-versions.d.ts +2 -3
  313. package/dist/routes/locale-docs-versions.js +1 -1
  314. package/dist/routes/locale-files-path.d.ts +2 -3
  315. package/dist/routes/locale-files-path.js +1 -1
  316. package/dist/routes/locale-index.d.ts +2 -3
  317. package/dist/routes/locale-index.js +1 -1
  318. package/dist/routes/mcp.d.ts +5 -0
  319. package/dist/routes/mcp.js +25 -0
  320. package/dist/routes/v-docs-slug.d.ts +2 -3
  321. package/dist/routes/v-locale-docs-slug.d.ts +2 -3
  322. package/dist/search-widget/index.d.ts +1 -2
  323. package/dist/search-widget/index.js +4 -7
  324. package/dist/search-widget-script/generated-script.js +12 -5
  325. package/dist/settings-defaults.d.ts +2 -0
  326. package/dist/settings-defaults.js +93 -0
  327. package/dist/settings.d.ts +8 -2
  328. package/dist/sidebar/client-data.d.ts +18 -0
  329. package/dist/sidebar/client-data.js +47 -0
  330. package/dist/sidebar/index.d.ts +3 -1
  331. package/dist/sidebar/index.js +3 -1
  332. package/dist/sidebar/sidebar.d.ts +12 -44
  333. package/dist/sidebar/sidebar.js +4 -3
  334. package/dist/sidebar/types.d.ts +14 -0
  335. package/dist/sidebar-prepaint/index.d.ts +1 -2
  336. package/dist/sidebar-prepaint/index.js +4 -6
  337. package/dist/sidebar-resizer/sidebar-resizer-init.d.ts +2 -3
  338. package/dist/sidebar-resizer/sidebar-resizer-init.js +3 -3
  339. package/dist/sidebar-toggle-island/index.d.ts +8 -11
  340. package/dist/sidebar-toggle-island/index.js +75 -62
  341. package/dist/sidebar-tree/build-tree.js +5 -6
  342. package/dist/sidebar-tree/types.d.ts +2 -0
  343. package/dist/sidebar-tree-island/index.d.ts +4 -19
  344. package/dist/sidebar-tree-island/index.js +782 -436
  345. package/dist/sidebar-tree-island/scope-state.d.ts +38 -0
  346. package/dist/sidebar-tree-island/scope-state.js +151 -0
  347. package/dist/sidebar-tree-island/sidebar-scroll-preserve.js +6 -2
  348. package/dist/sidebar-utils/index.d.ts +17 -19
  349. package/dist/sidebar-utils/index.js +100 -3
  350. package/dist/sidebar-utils/scope.d.ts +11 -0
  351. package/dist/sidebar-utils/scope.js +67 -0
  352. package/dist/sidebar-with-defaults/index.d.ts +1 -2
  353. package/dist/sidebar-with-defaults/index.js +19 -18
  354. package/dist/site-schema/nav-tree.js +15 -15
  355. package/dist/site-schema/types.d.ts +1 -0
  356. package/dist/site-tree-nav/index.d.ts +2 -3
  357. package/dist/site-tree-nav/index.js +11 -12
  358. package/dist/site-tree-nav/normalize-island-props.d.ts +16 -0
  359. package/dist/site-tree-nav/normalize-island-props.js +122 -0
  360. package/dist/site-tree-nav-island/index.d.ts +3 -3
  361. package/dist/site-tree-nav-island/index.js +243 -144
  362. package/dist/smart-break/index.d.ts +3 -4
  363. package/dist/smart-break/index.js +1 -1
  364. package/dist/tab-item/tab-item.d.ts +3 -4
  365. package/dist/tab-item/tab-item.js +1 -1
  366. package/dist/tag-pages/index.d.ts +3 -3
  367. package/dist/tag-pages/index.js +10 -10
  368. package/dist/theme/color-scheme-provider.d.ts +3 -3
  369. package/dist/theme/color-scheme-provider.js +3 -3
  370. package/dist/theme/theme-pack-provider.d.ts +1 -1
  371. package/dist/theme/theme-pack-provider.js +3 -3
  372. package/dist/theme/theme-toggle.d.ts +2 -3
  373. package/dist/theme/theme-toggle.js +1 -1
  374. package/dist/theme-pack-dialog/index.d.ts +1 -1
  375. package/dist/theme-pack-dialog/index.js +69 -75
  376. package/dist/theme-pack-dialog/theme-pack-card.d.ts +3 -4
  377. package/dist/theme-pack-dialog/theme-pack-card.js +19 -17
  378. package/dist/theme-pack-switcher/index.d.ts +4 -5
  379. package/dist/theme-pack-switcher/index.js +52 -49
  380. package/dist/theme-packs/academia/meta.json +1 -1
  381. package/dist/theme-packs/academia/pack.css +1 -1
  382. package/dist/theme-packs/bauhaus/meta.json +1 -1
  383. package/dist/theme-packs/bauhaus/pack.css +2 -2
  384. package/dist/theme-packs/blueprint/meta.json +1 -1
  385. package/dist/theme-packs/blueprint/pack.css +2 -2
  386. package/dist/theme-packs/botanica/meta.json +1 -1
  387. package/dist/theme-packs/botanica/pack.css +2 -2
  388. package/dist/theme-packs/broadsheet/meta.json +1 -1
  389. package/dist/theme-packs/broadsheet/pack.css +2 -2
  390. package/dist/theme-packs/brutalist/meta.json +1 -1
  391. package/dist/theme-packs/brutalist/pack.css +2 -2
  392. package/dist/theme-packs/eink/meta.json +1 -1
  393. package/dist/theme-packs/eink/pack.css +1 -1
  394. package/dist/theme-packs/futura-editorial/meta.json +1 -1
  395. package/dist/theme-packs/futura-editorial/pack.css +2 -2
  396. package/dist/theme-packs/hearth/meta.json +1 -1
  397. package/dist/theme-packs/hearth/pack.css +2 -2
  398. package/dist/theme-packs/ledger/meta.json +1 -1
  399. package/dist/theme-packs/ledger/pack.css +1 -1
  400. package/dist/theme-packs/manuscript/meta.json +1 -1
  401. package/dist/theme-packs/manuscript/pack.css +1 -1
  402. package/dist/theme-packs/matcha/meta.json +1 -1
  403. package/dist/theme-packs/matcha/pack.css +2 -2
  404. package/dist/theme-packs/nocturne/meta.json +1 -1
  405. package/dist/theme-packs/nocturne/pack.css +2 -2
  406. package/dist/theme-packs/observatory/meta.json +1 -1
  407. package/dist/theme-packs/observatory/pack.css +2 -2
  408. package/dist/theme-packs/onyx/meta.json +1 -1
  409. package/dist/theme-packs/onyx/pack.css +2 -2
  410. package/dist/theme-packs/phosphor/meta.json +1 -1
  411. package/dist/theme-packs/phosphor/pack.css +2 -2
  412. package/dist/theme-packs/riso/meta.json +1 -1
  413. package/dist/theme-packs/riso/pack.css +2 -2
  414. package/dist/theme-packs/sakura/meta.json +1 -1
  415. package/dist/theme-packs/sakura/pack.css +2 -2
  416. package/dist/theme-packs/scandi/meta.json +1 -1
  417. package/dist/theme-packs/scandi/pack.css +1 -1
  418. package/dist/theme-packs/solar/meta.json +1 -1
  419. package/dist/theme-packs/solar/pack.css +1 -1
  420. package/dist/theme-packs/sumi/meta.json +1 -1
  421. package/dist/theme-packs/sumi/pack.css +2 -2
  422. package/dist/theme-packs/swissgrid/meta.json +1 -1
  423. package/dist/theme-packs/swissgrid/pack.css +1 -1
  424. package/dist/theme-packs/timberline/meta.json +1 -1
  425. package/dist/theme-packs/timberline/pack.css +2 -2
  426. package/dist/theme-packs/washi/meta.json +1 -1
  427. package/dist/theme-packs/washi/pack.css +2 -2
  428. package/dist/theme-toggle/index.d.ts +1 -1
  429. package/dist/theme-toggle/index.js +154 -167
  430. package/dist/theme.css +47 -121
  431. package/dist/toc/mobile-toc.d.ts +3 -5
  432. package/dist/toc/mobile-toc.js +29 -27
  433. package/dist/toc/toc.d.ts +3 -4
  434. package/dist/toc/toc.js +18 -18
  435. package/dist/toc/use-active-heading.d.ts +5 -4
  436. package/dist/toc/use-active-heading.js +36 -30
  437. package/dist/toc-prepaint/index.d.ts +1 -2
  438. package/dist/toc-prepaint/index.js +4 -6
  439. package/dist/transitions/nested-island-props-refresh.d.ts +3 -16
  440. package/dist/transitions/nested-island-props-refresh.js +133 -151
  441. package/dist/transitions/page-events.d.ts +8 -13
  442. package/dist/tree-nav-shared/index.d.ts +4 -5
  443. package/dist/tree-nav-shared/index.js +6 -7
  444. package/dist/use-modal-dialog/index.d.ts +9 -63
  445. package/dist/use-modal-dialog/index.js +41 -59
  446. package/dist/versions-page/index.d.ts +3 -3
  447. package/dist/versions-page/index.js +5 -5
  448. package/dist/wind/index.d.ts +5 -0
  449. package/dist/wind/index.js +169 -0
  450. package/dist/wind.json +498 -0
  451. package/dist/z-index-defaults/index.d.ts +4 -4
  452. package/dist/zdtp-loader.d.ts +7 -0
  453. package/dist/zdtp-loader.js +8 -0
  454. package/eject/asset-components/asset-card.tsx +14 -16
  455. package/eject/asset-components/asset-code.tsx +10 -12
  456. package/eject/asset-components/shared.tsx +5 -7
  457. package/eject/breadcrumb/breadcrumb.tsx +15 -16
  458. package/eject/code-group/index.tsx +4 -10
  459. package/eject/content-admonition/index.tsx +5 -6
  460. package/eject/desktop-sidebar-toggle-island/index.ts +4 -0
  461. package/eject/desktop-sidebar-toggle-island/island.tsx +50 -0
  462. package/eject/desktop-sidebar-toggle-island/storage.ts +27 -0
  463. package/eject/details/details.tsx +3 -5
  464. package/eject/doc-history/index.tsx +193 -179
  465. package/eject/doc-pager/index.tsx +3 -4
  466. package/eject/footer/footer.tsx +7 -9
  467. package/eject/header/header.tsx +42 -54
  468. package/eject/header/nav-overflow-script.ts +1 -1
  469. package/eject/header/types.ts +12 -13
  470. package/eject/image-enlarge/index.tsx +84 -69
  471. package/eject/image-enlarge/public.ts +2 -0
  472. package/eject/image-enlarge/ssr-fallback.tsx +7 -0
  473. package/eject/page-loading/page-loading-overlay.tsx +8 -15
  474. package/eject/sidebar/client-data.ts +68 -0
  475. package/eject/sidebar/index.ts +3 -0
  476. package/eject/sidebar/sidebar.tsx +16 -97
  477. package/eject/sidebar/types.ts +15 -0
  478. package/eject/sidebar-toggle-island/index.tsx +103 -102
  479. package/eject/sidebar-tree-island/index.tsx +827 -615
  480. package/eject/sidebar-tree-island/scope-state.ts +154 -0
  481. package/eject/sidebar-tree-island/sidebar-scroll-preserve.ts +8 -2
  482. package/eject/site-tree-nav-island/index.tsx +349 -222
  483. package/eject/tab-item/tab-item.tsx +2 -4
  484. package/eject/theme-toggle/hydration-pending.ts +6 -10
  485. package/eject/theme-toggle/index.tsx +133 -173
  486. package/eject/toc/mobile-toc.tsx +27 -31
  487. package/eject/toc/toc.tsx +21 -24
  488. package/eject/toc/use-active-heading.ts +43 -38
  489. package/package.json +40 -22
  490. package/routes-src/404.tsx +2 -3
  491. package/routes-src/_chrome.tsx +7 -2
  492. package/routes-src/_design-token-panel-bootstrap.tsx +1 -63
  493. package/routes-src/docs-slug.tsx +2 -3
  494. package/routes-src/docs-tags-index.tsx +2 -3
  495. package/routes-src/docs-tags-tag.tsx +2 -3
  496. package/routes-src/docs-versions.tsx +2 -3
  497. package/routes-src/files-path.tsx +2 -4
  498. package/routes-src/index.tsx +2 -3
  499. package/routes-src/locale-docs-slug.tsx +2 -3
  500. package/routes-src/locale-docs-tags-index.tsx +2 -3
  501. package/routes-src/locale-docs-tags-tag.tsx +2 -3
  502. package/routes-src/locale-docs-versions.tsx +2 -3
  503. package/routes-src/locale-files-path.tsx +2 -4
  504. package/routes-src/locale-index.tsx +2 -3
  505. package/routes-src/mcp.tsx +25 -0
  506. package/routes-src/v-docs-slug.tsx +2 -3
  507. package/routes-src/v-locale-docs-slug.tsx +2 -3
  508. package/tsconfig.base.json +1 -1
  509. package/dist/safelist.css +0 -2
  510. package/dist/theme-no-reset.css +0 -379
  511. package/eject/desktop-sidebar-toggle-island/index.tsx +0 -110
@@ -1,9 +1,12 @@
1
- import { jsx, jsxs } from "preact/jsx-runtime";
2
- import { useEffect, useRef, useState } from "preact/hooks";
3
- import { HighlightedCode } from "./highlighted-code.js";
1
+ import { jsx, jsxs } from "@takazudo/zfb/zudo-react/jsx-runtime";
4
2
  import {
5
- createPreviewAutoHeightController
6
- } from "./preview-auto-height.js";
3
+ computed,
4
+ getScope,
5
+ signal,
6
+ Show
7
+ } from "@takazudo/zfb/zudo-react";
8
+ import { HighlightedCode } from "./highlighted-code.js";
9
+ import { createPreviewAutoHeightController } from "./preview-auto-height.js";
7
10
  const DEFAULT_LABELS = {
8
11
  mobile: "Mobile",
9
12
  tablet: "Tablet",
@@ -49,52 +52,44 @@ function PreviewBase({
49
52
  const sourceVisible = showSource ?? true;
50
53
  const viewportControlsVisible = showViewportControls ?? true;
51
54
  const viewports = viewportControlsVisible ? buildViewports(resolvedLabels) : DEFAULT_VIEWPORTS;
52
- const [activeViewport, setActiveViewport] = useState(2);
53
- const [codeOpen, setCodeOpen] = useState(
54
- sourceVisible && (defaultOpen ?? false)
55
- );
56
- const [iframeHeight, setIframeHeight] = useState(height ?? 200);
57
- const iframeRef = useRef(null);
58
- const iframeHeightRef = useRef(iframeHeight);
59
- const autoHeightControllerRef = useRef(
60
- null
61
- );
62
- iframeHeightRef.current = iframeHeight;
55
+ const scope = getScope();
56
+ const activeViewport = signal(2);
57
+ const codeOpen = signal(sourceVisible && (defaultOpen ?? false));
58
+ const iframeHeight = signal(height ?? 200);
59
+ const iframeRef = { current: null };
63
60
  const autoHeightEnabled = (autoHeight ?? true) && height == null;
64
- useEffect(() => {
65
- const iframe = iframeRef.current;
66
- if (!iframe || !autoHeightEnabled) return;
67
- const controller = createPreviewAutoHeightController({
68
- iframe,
61
+ let controller = null;
62
+ scope.onActivate(() => {
63
+ const frame = iframeRef.current;
64
+ if (!frame || !autoHeightEnabled) return;
65
+ const nextController = createPreviewAutoHeightController({
66
+ iframe: frame,
69
67
  syncDelay,
70
- getCurrentHeight: () => iframeHeightRef.current,
68
+ getCurrentHeight: () => iframeHeight.value,
71
69
  setHeight: (nextHeight) => {
72
- iframeHeightRef.current = nextHeight;
73
- setIframeHeight(nextHeight);
70
+ iframeHeight.value = nextHeight;
74
71
  }
75
72
  });
76
- autoHeightControllerRef.current = controller;
77
- const onLoad = () => controller.handleLoad();
78
- iframe.addEventListener("load", onLoad);
73
+ controller = nextController;
74
+ const onLoad = () => nextController.handleLoad();
75
+ frame.addEventListener("load", onLoad);
79
76
  try {
80
- if (iframe.contentDocument?.readyState === "complete") {
81
- controller.handleLoad();
82
- }
77
+ if (frame.contentDocument?.readyState === "complete") nextController.handleLoad();
83
78
  } catch {
84
79
  }
85
80
  return () => {
86
- iframe.removeEventListener("load", onLoad);
87
- controller.destroy();
88
- if (autoHeightControllerRef.current === controller) {
89
- autoHeightControllerRef.current = null;
90
- }
81
+ frame.removeEventListener("load", onLoad);
82
+ nextController.destroy();
83
+ controller = null;
91
84
  };
92
- }, [autoHeightEnabled, srcdoc, syncDelay]);
93
- useEffect(() => {
94
- if (!autoHeightEnabled) return;
95
- autoHeightControllerRef.current?.schedule();
96
- }, [activeViewport, autoHeightEnabled]);
97
- const containerWidth = viewportControlsVisible ? viewports[activeViewport]?.width ?? "100%" : "100%";
85
+ });
86
+ scope.effect(() => {
87
+ activeViewport.value;
88
+ if (autoHeightEnabled) controller?.schedule();
89
+ });
90
+ const containerWidth = computed(
91
+ () => viewportControlsVisible ? viewports[activeViewport.value]?.width ?? "100%" : "100%"
92
+ );
98
93
  return /* @__PURE__ */ jsxs("div", { class: "border border-muted rounded-lg overflow-hidden my-vsp-md", children: [
99
94
  (viewportControlsVisible || title) && /* @__PURE__ */ jsxs("div", { class: "flex items-center justify-between px-hsp-md py-hsp-sm bg-surface border-b border-muted gap-hsp-sm flex-wrap", children: [
100
95
  title && /* @__PURE__ */ jsx("span", { class: "text-caption font-semibold text-fg", children: title }),
@@ -108,12 +103,13 @@ function PreviewBase({
108
103
  "button",
109
104
  {
110
105
  type: "button",
111
- class: `min-h-[44px] min-w-[44px] px-hsp-sm py-hsp-2xs text-caption border rounded-full cursor-pointer transition-[background,color,border-color] duration-150 leading-snug ${i === activeViewport ? "bg-accent text-bg border-accent hover:bg-accent-hover hover:border-accent-hover" : "bg-transparent text-muted border-muted hover:bg-[color-mix(in_srgb,var(--color-surface)_80%,var(--color-fg)_20%)]"}`,
112
- "aria-pressed": i === activeViewport,
113
- onClick: () => setActiveViewport(i),
106
+ class: computed(() => `min-h-[44px] min-w-[44px] px-hsp-sm py-hsp-2xs text-caption border rounded-full cursor-pointer transition-[background,color,border-color] duration-150 leading-snug ${i === activeViewport.value ? "bg-accent text-bg border-accent hover:bg-accent-hover hover:border-accent-hover" : "bg-transparent text-muted border-muted hover:bg-[color-mix(in_srgb,var(--color-surface)_80%,var(--color-fg)_20%)]"}`),
107
+ "aria-pressed": computed(() => i === activeViewport.value),
108
+ "on:click": () => {
109
+ activeViewport.value = i;
110
+ },
114
111
  children: vp.label
115
- },
116
- vp.label
112
+ }
117
113
  ))
118
114
  }
119
115
  )
@@ -122,16 +118,16 @@ function PreviewBase({
122
118
  "div",
123
119
  {
124
120
  class: "resize-x overflow-auto max-w-full mx-auto",
125
- style: { width: containerWidth },
121
+ style: computed(() => ({ width: containerWidth.value })),
126
122
  children: /* @__PURE__ */ jsx(
127
123
  "iframe",
128
124
  {
129
125
  ref: iframeRef,
130
- class: "block w-full border-none bg-[#fff] rounded shadow-[0_1px_3px_color-mix(in_srgb,var(--color-fg)_8%,transparent)]",
131
- srcDoc: srcdoc,
132
- sandbox,
133
- style: { height: height ?? iframeHeight },
134
- title: title ?? resolvedLabels.preview
126
+ class: "block w-full border-none bg-[#fff] rounded zd-preview-shadow",
127
+ title: title ?? resolvedLabels.preview,
128
+ ...sandbox !== void 0 ? { sandbox } : {},
129
+ srcdoc,
130
+ style: computed(() => ({ height: `${iframeHeight.value}px` }))
135
131
  }
136
132
  )
137
133
  }
@@ -142,22 +138,24 @@ function PreviewBase({
142
138
  {
143
139
  type: "button",
144
140
  class: "flex min-h-[44px] min-w-[44px] items-center w-full px-hsp-md py-hsp-sm text-caption font-medium text-muted bg-surface border-none cursor-pointer gap-hsp-xs hover:bg-[color-mix(in_srgb,var(--color-surface)_80%,var(--color-fg)_20%)]",
145
- onClick: () => setCodeOpen((v) => !v),
141
+ "on:click": () => {
142
+ codeOpen.value = !codeOpen.value;
143
+ },
146
144
  "aria-expanded": codeOpen,
147
145
  children: [
148
146
  /* @__PURE__ */ jsx(
149
147
  "span",
150
148
  {
151
- class: `text-caption transition-transform duration-200 ${codeOpen ? "rotate-90" : ""}`,
149
+ class: computed(() => `text-caption transition-transform duration-200 ${codeOpen.value ? "rotate-90" : ""}`),
152
150
  "aria-hidden": "true",
153
151
  children: "\u25B6"
154
152
  }
155
153
  ),
156
- codeOpen ? resolvedLabels.hideCode : resolvedLabels.showCode
154
+ computed(() => codeOpen.value ? resolvedLabels.hideCode : resolvedLabels.showCode)
157
155
  ]
158
156
  }
159
157
  ),
160
- codeOpen && /* @__PURE__ */ jsx("div", { children: codeBlocks.map((block, idx) => /* @__PURE__ */ jsxs(
158
+ /* @__PURE__ */ jsx(Show, { when: codeOpen, children: () => /* @__PURE__ */ jsx("div", { children: codeBlocks.map((block, idx) => /* @__PURE__ */ jsxs(
161
159
  "div",
162
160
  {
163
161
  class: `overflow-x-auto ${idx > 0 ? "border-t border-muted" : ""}`,
@@ -165,9 +163,8 @@ function PreviewBase({
165
163
  /* @__PURE__ */ jsx("span", { class: "block px-hsp-md py-hsp-xs text-caption font-semibold text-muted bg-surface border-b border-muted uppercase tracking-wider", children: block.title }),
166
164
  /* @__PURE__ */ jsx(HighlightedCode, { code: block.code, language: block.language })
167
165
  ]
168
- },
169
- block.title
170
- )) })
166
+ }
167
+ )) }) })
171
168
  ] })
172
169
  ] });
173
170
  }
@@ -0,0 +1,20 @@
1
+ /** @jsxRuntime automatic */
2
+ import type { Child } from "@takazudo/zfb/zudo-react";
3
+ import { type HtmlPreviewWrapperProps } from "./html-preview-wrapper.js";
4
+ /**
5
+ * HTML preview wrapper component — the public MDX-registered binding
6
+ * (`HtmlPreview: HtmlPreviewWrapper`).
7
+ *
8
+ * Eager mode wraps the bare `HtmlPreviewWrapperInner` in
9
+ * `<Island when="visible">`, mirroring the legacy `client:visible` hydration
10
+ * timing while preserving the server-rendered controls and iframe. Visible mode
11
+ * uses zfb's skip-SSR fallback path: static output contains only an inert
12
+ * nonzero reservation, while the real serializable inner props remain on the
13
+ * island marker for native visible scheduling and client mount.
14
+ *
15
+ * The public export name and signature are unchanged from before the
16
+ * zudolab/zudo-doc#1925 fix, so existing consumers that register
17
+ * `HtmlPreview: HtmlPreviewWrapper` keep working (and now hydrate correctly)
18
+ * with no call-site change.
19
+ */
20
+ export declare function HtmlPreviewWrapper(props: HtmlPreviewWrapperProps): Child;
@@ -0,0 +1,37 @@
1
+ import { jsx } from "@takazudo/zfb/zudo-react/jsx-runtime";
2
+ import { Island } from "@takazudo/zfb";
3
+ import { HtmlPreviewWrapperInner } from "./html-preview-wrapper.js";
4
+ function reservationHeight(height) {
5
+ return height != null && height > 0 ? height : 200;
6
+ }
7
+ function HtmlPreviewReservation({
8
+ height
9
+ }) {
10
+ return /* @__PURE__ */ jsx(
11
+ "div",
12
+ {
13
+ "aria-hidden": "true",
14
+ "data-zd-html-preview-reservation": true,
15
+ style: { height: `${reservationHeight(height)}px` }
16
+ }
17
+ );
18
+ }
19
+ function HtmlPreviewWrapper(props) {
20
+ const { loading = "eager", ...innerProps } = props;
21
+ if (loading === "visible") {
22
+ const rendered2 = Island({
23
+ when: "visible",
24
+ ssrFallback: /* @__PURE__ */ jsx(HtmlPreviewReservation, { height: innerProps.height }),
25
+ children: /* @__PURE__ */ jsx(HtmlPreviewWrapperInner, { ...innerProps })
26
+ });
27
+ return rendered2;
28
+ }
29
+ const rendered = Island({
30
+ when: "visible",
31
+ children: /* @__PURE__ */ jsx(HtmlPreviewWrapperInner, { ...innerProps })
32
+ });
33
+ return rendered;
34
+ }
35
+ export {
36
+ HtmlPreviewWrapper
37
+ };
@@ -1,5 +1,3 @@
1
- /**
2
- * Keep an interactive control pending until its first successful client mount.
3
- * Initializing from `enabled` preserves server/client-first-render parity.
4
- */
5
- export declare function useHydrationPending(enabled: boolean): boolean;
1
+ import type { ReadonlySignal, Scope } from "@takazudo/zfb/zudo-react";
2
+ /** Keep SSR and the first client render pending, then release on activation. */
3
+ export declare function hydrationPending(scope: Scope, enabled: boolean): ReadonlySignal<boolean>;
@@ -1,9 +1,11 @@
1
- import { useEffect, useState } from "preact/hooks";
2
- function useHydrationPending(enabled) {
3
- const [pending, setPending] = useState(enabled);
4
- useEffect(() => setPending(false), []);
1
+ import { signal } from "@takazudo/zfb/zudo-react";
2
+ function hydrationPending(scope, enabled) {
3
+ const pending = signal(enabled);
4
+ scope.onActivate(() => {
5
+ pending.value = false;
6
+ });
5
7
  return pending;
6
8
  }
7
9
  export {
8
- useHydrationPending
10
+ hydrationPending
9
11
  };
@@ -1,35 +1,8 @@
1
1
  /** @jsxRuntime automatic */
2
- /** @jsxImportSource preact */
3
- import type { VNode } from "preact";
2
+ import type { Child } from "@takazudo/zfb/zudo-react";
4
3
  import type { LocaleLink } from "./types.js";
5
- /**
6
- * The minimal project config the client re-wire needs to reproduce
7
- * `getPathForLocale`'s output from the live pathname. Emitted as `data-*`
8
- * attributes on the switcher container so {@link LANGUAGE_SWITCHER_INIT_SCRIPT}
9
- * can read it without any serialized props.
10
- */
11
- export interface LanguageSwitcherConfig {
12
- /** Normalized site base with no trailing slash (`""` for a root site). */
13
- base: string;
14
- /** The project's default locale (rendered without a locale prefix). */
15
- defaultLocale: string;
16
- /** Whether the project appends trailing slashes to page URLs. */
17
- trailingSlash: boolean;
18
- }
19
- /**
20
- * Client-side re-computation of a locale-switched href from the *current*
21
- * pathname. This is a self-contained port of `getPathForLocale` (+ its
22
- * `stripBase` / version-prefix split / `withBase` / `applyTrailingSlash`
23
- * dependencies) from `url-helpers`. It MUST stay behaviourally identical to
24
- * that function — pinned by the drift-guard test in
25
- * `__tests__/language-switcher.test.tsx`, which asserts equality against the
26
- * real `buildLocaleLinks` output across a case table.
27
- *
28
- * It is deliberately self-contained (no references to module-scope helpers)
29
- * because {@link LANGUAGE_SWITCHER_INIT_SCRIPT} embeds it verbatim via
30
- * `.toString()`, so it must be valid as a standalone function in the browser.
31
- */
32
- export declare function switchLocaleHref(pathname: string, config: LanguageSwitcherConfig, currentLang: string, targetLang: string): string;
4
+ import type { LanguageSwitcherConfig } from "./switcher-url-state.js";
5
+ export { switchLocaleHref, type LanguageSwitcherConfig } from "./switcher-url-state.js";
33
6
  /**
34
7
  * Inline init script that keeps the switcher's per-page hrefs correct inside a
35
8
  * persisted header. Mounted once wherever a header is rendered (see
@@ -48,7 +21,7 @@ export declare function switchLocaleHref(pathname: string, config: LanguageSwitc
48
21
  * `nav-overflow-script.ts` / `sidebar-tree-island` / `version-switcher.tsx`
49
22
  * use (zudolab/zudo-doc#3398, consolidated by #3408).
50
23
  */
51
- export declare const LANGUAGE_SWITCHER_INIT_SCRIPT: string;
24
+ export { LANGUAGE_SWITCHER_INIT_SCRIPT } from "./switcher-generated-scripts.js";
52
25
  export interface LanguageSwitcherProps {
53
26
  /**
54
27
  * Pre-built locale links, ordered as they should appear in the bar.
@@ -81,5 +54,5 @@ export interface LanguageSwitcherProps {
81
54
  * template's `localeLinks.length > 1 &&` guard so call-sites can mount
82
55
  * the component unconditionally).
83
56
  */
84
- export declare function LanguageSwitcher({ links, config, currentLocale, accessibleLabel, idSuffix, }: LanguageSwitcherProps): VNode | null;
57
+ export declare function LanguageSwitcher({ links, config, currentLocale, accessibleLabel, idSuffix, }: LanguageSwitcherProps): Child;
85
58
  export type { LocaleLink };
@@ -1,106 +1,6 @@
1
- import { jsx, jsxs } from "preact/jsx-runtime";
2
- import { AFTER_NAVIGATE_EVENT } from "../transitions/index.js";
3
- import { CURRENT_PATH_SCRIPT_PRELUDE } from "../current-path/index.js";
4
- function switchLocaleHref(pathname, config, currentLang, targetLang) {
5
- const normalizedBase = config.base;
6
- const defaultLocale = config.defaultLocale;
7
- const trailingSlash = config.trailingSlash;
8
- const stripBase = (path) => {
9
- if (normalizedBase === "") return path;
10
- if (path === normalizedBase) return "/";
11
- return path.indexOf(normalizedBase + "/") === 0 ? path.slice(normalizedBase.length) : path;
12
- };
13
- const applyTrailingSlash = (url) => {
14
- if (!trailingSlash) return url;
15
- if (url.charAt(url.length - 1) === "/") return url;
16
- const suffixIdx = url.search(/[?#]/);
17
- const pathPart = suffixIdx >= 0 ? url.slice(0, suffixIdx) : url;
18
- const suffix = suffixIdx >= 0 ? url.slice(suffixIdx) : "";
19
- if (pathPart.charAt(pathPart.length - 1) === "/") return url;
20
- const segments = pathPart.split("/");
21
- const lastSegment = segments[segments.length - 1] || "";
22
- if (/\.[a-zA-Z]\w*$/.test(lastSegment)) return url;
23
- return pathPart + "/" + suffix;
24
- };
25
- const withBase = (path) => {
26
- const raw = normalizedBase === "" ? path : normalizedBase + (path.charAt(0) === "/" ? path : "/" + path);
27
- return applyTrailingSlash(raw);
28
- };
29
- const stripped = stripBase(pathname);
30
- const versionMatch = stripped.match(/^(\/v\/[^/]+)(\/.*|$)/);
31
- const versionPrefix = versionMatch ? versionMatch[1] || "" : "";
32
- let relativePath = versionMatch ? versionMatch[2] || "/" : stripped;
33
- if (currentLang !== defaultLocale) {
34
- relativePath = relativePath.replace(
35
- new RegExp("^/" + currentLang + "(?:/|$)"),
36
- "/"
37
- );
38
- }
39
- if (targetLang !== defaultLocale) {
40
- relativePath = "/" + targetLang + relativePath;
41
- }
42
- return withBase(versionPrefix + relativePath);
43
- }
44
- const LANGUAGE_SWITCHER_INIT_SCRIPT = `(function(){
45
- var FLAG="__zdLanguageSwitcherInit";
46
- ${CURRENT_PATH_SCRIPT_PRELUDE}
47
- var switchLocaleHref=${switchLocaleHref.toString()};
48
- function close(c,restoreFocus){
49
- var toggle=c.querySelector("[data-language-toggle]");
50
- var menu=c.querySelector("[data-language-menu]");
51
- if(!toggle||!menu)return;
52
- menu.classList.add("hidden");
53
- toggle.setAttribute("aria-expanded","false");
54
- if(restoreFocus)toggle.focus();
55
- }
56
- function refresh(){
57
- var containers=document.querySelectorAll("[data-language-switcher]");
58
- for(var i=0;i<containers.length;i++){
59
- var c=containers[i];
60
- close(c,false);
61
- var menu=c.querySelector("[data-language-menu]");
62
- if(menu){
63
- menu.classList.remove("group-hover:block","group-focus-within:block");
64
- }
65
- if(!c.hasAttribute("data-default-locale"))continue;
66
- var config={base:c.getAttribute("data-base")||"",defaultLocale:c.getAttribute("data-default-locale")||"",trailingSlash:c.getAttribute("data-trailing-slash")==="true"};
67
- var currentLang=c.getAttribute("data-current-locale")||config.defaultLocale;
68
- var anchors=c.querySelectorAll("a[lang]");
69
- for(var j=0;j<anchors.length;j++){
70
- var a=anchors[j];
71
- var target=a.getAttribute("lang");
72
- if(!target)continue;
73
- a.setAttribute("href",switchLocaleHref(readCurrentPath(CURRENT_PATH_DATASET_KEY),config,currentLang,target));
74
- }
75
- }
76
- }
77
- if(window[FLAG]){window[FLAG]();return;}
78
- window[FLAG]=refresh;
79
- document.addEventListener("click",function(e){
80
- var target=e.target;
81
- var toggle=target&&target.closest?target.closest("[data-language-toggle]"):null;
82
- if(toggle){
83
- var switcher=toggle.closest("[data-language-switcher]");
84
- if(switcher){
85
- var menu=switcher.querySelector("[data-language-menu]");
86
- var willOpen=toggle.getAttribute("aria-expanded")!=="true";
87
- document.querySelectorAll("[data-language-switcher]").forEach(function(c){if(c!==switcher)close(c,false);});
88
- if(menu){menu.classList.toggle("hidden",!willOpen);toggle.setAttribute("aria-expanded",String(willOpen));}
89
- }
90
- return;
91
- }
92
- document.querySelectorAll("[data-language-switcher]").forEach(function(c){if(!c.contains(target))close(c,false);});
93
- });
94
- document.addEventListener("keydown",function(e){
95
- if(e.key!=="Escape")return;
96
- document.querySelectorAll('[data-language-toggle][aria-expanded="true"]').forEach(function(toggle){
97
- var switcher=toggle.closest("[data-language-switcher]");
98
- if(switcher)close(switcher,true);
99
- });
100
- });
101
- refresh();
102
- document.addEventListener(${JSON.stringify(AFTER_NAVIGATE_EVENT)},refresh);
103
- })();`;
1
+ import { jsx, jsxs } from "@takazudo/zfb/zudo-react/jsx-runtime";
2
+ import { switchLocaleHref } from "./switcher-url-state.js";
3
+ import { LANGUAGE_SWITCHER_INIT_SCRIPT } from "./switcher-generated-scripts.js";
104
4
  function LanguageSwitcher({
105
5
  links,
106
6
  config,
@@ -130,7 +30,7 @@ function LanguageSwitcher({
130
30
  {
131
31
  type: "button",
132
32
  id: toggleId,
133
- class: "flex max-w-[16rem] cursor-pointer items-center gap-hsp-2xs whitespace-nowrap rounded border border-muted px-hsp-sm py-vsp-3xs text-small text-muted transition-colors hover:border-accent hover:text-accent focus-visible:border-accent focus-visible:text-accent",
33
+ class: "flex max-w-[16rem] cursor-pointer items-center gap-hsp-2xs whitespace-nowrap rounded border border-muted px-hsp-sm py-vsp-3xs text-small text-muted transition-colors duration-0 hover:border-accent hover:text-accent focus-visible:border-accent focus-visible:text-accent",
134
34
  "aria-label": accessibleLabel,
135
35
  "aria-controls": menuId,
136
36
  "aria-expanded": "false",
@@ -146,7 +46,7 @@ function LanguageSwitcher({
146
46
  {
147
47
  id: menuId,
148
48
  "aria-labelledby": toggleId,
149
- class: "absolute right-0 top-full z-dropdown mt-vsp-3xs hidden min-w-[8rem] max-w-[calc(100vw-var(--spacing-hsp-xl))] overflow-x-auto whitespace-nowrap rounded border border-muted bg-surface py-vsp-3xs shadow-lg group-hover:block group-focus-within:block",
49
+ class: "absolute right-0 top-full z-dropdown mt-vsp-3xs hidden min-w-[8rem] max-w-[calc(100vw_-_var(--spacing-hsp-xl))] overflow-x-auto whitespace-nowrap rounded border border-muted bg-surface py-vsp-3xs shadow-lg group-hover:block group-focus-within:block",
150
50
  "data-language-menu": true,
151
51
  children: links.map((link) => /* @__PURE__ */ jsx("li", { children: link.active ? /* @__PURE__ */ jsx(
152
52
  "span",
@@ -175,7 +75,6 @@ function ChevronDownIcon() {
175
75
  return /* @__PURE__ */ jsx(
176
76
  "svg",
177
77
  {
178
- xmlns: "http://www.w3.org/2000/svg",
179
78
  class: "h-icon-xs w-icon-xs shrink-0",
180
79
  fill: "none",
181
80
  viewBox: "0 0 24 24",
@@ -0,0 +1,2 @@
1
+ export declare const LANGUAGE_SWITCHER_INIT_SCRIPT = "(function(){\nvar FLAG=\"__zdLanguageSwitcherInit\";\nvar CURRENT_PATH_DATASET_KEY=\"zdCurrentPath\";var readCurrentPath=function readCurrentPath(datasetKey, explicit) {\n const override = typeof document === \"undefined\" ? void 0 : document.documentElement.dataset[datasetKey];\n return explicit || override || (typeof window === \"undefined\" ? void 0 : window.location.pathname);\n};\nvar switchLocaleHref=function switchLocaleHref(pathname, config, currentLang, targetLang) {\n const normalizedBase = config.base;\n const defaultLocale = config.defaultLocale;\n const trailingSlash = config.trailingSlash;\n const stripBase = (path) => {\n if (normalizedBase === \"\") return path;\n if (path === normalizedBase) return \"/\";\n return path.indexOf(normalizedBase + \"/\") === 0 ? path.slice(normalizedBase.length) : path;\n };\n const applyTrailingSlash = (url) => {\n if (!trailingSlash) return url;\n if (url.charAt(url.length - 1) === \"/\") return url;\n const suffixIdx = url.search(/[?#]/);\n const pathPart = suffixIdx >= 0 ? url.slice(0, suffixIdx) : url;\n const suffix = suffixIdx >= 0 ? url.slice(suffixIdx) : \"\";\n if (pathPart.charAt(pathPart.length - 1) === \"/\") return url;\n const segments = pathPart.split(\"/\");\n const lastSegment = segments[segments.length - 1] || \"\";\n if (/\\.[a-zA-Z]\\w*$/.test(lastSegment)) return url;\n return pathPart + \"/\" + suffix;\n };\n const withBase = (path) => {\n const raw = normalizedBase === \"\" ? path : normalizedBase + (path.charAt(0) === \"/\" ? path : \"/\" + path);\n return applyTrailingSlash(raw);\n };\n const stripped = stripBase(pathname);\n const versionMatch = stripped.match(/^(\\/v\\/[^/]+)(\\/.*|$)/);\n const versionPrefix = versionMatch ? versionMatch[1] || \"\" : \"\";\n let relativePath = versionMatch ? versionMatch[2] || \"/\" : stripped;\n if (currentLang !== defaultLocale) {\n relativePath = relativePath.replace(\n new RegExp(\"^/\" + currentLang + \"(?:/|$)\"),\n \"/\"\n );\n }\n if (targetLang !== defaultLocale) {\n relativePath = \"/\" + targetLang + relativePath;\n }\n return withBase(versionPrefix + relativePath);\n};\nfunction close(c,restoreFocus){\nvar toggle=c.querySelector(\"[data-language-toggle]\");\nvar menu=c.querySelector(\"[data-language-menu]\");\nif(!toggle||!menu)return;\nmenu.classList.add(\"hidden\");\ntoggle.setAttribute(\"aria-expanded\",\"false\");\nif(restoreFocus)toggle.focus();\n}\nfunction refresh(){\nvar containers=document.querySelectorAll(\"[data-language-switcher]\");\nfor(var i=0;i<containers.length;i++){\nvar c=containers[i];\nclose(c,false);\nvar menu=c.querySelector(\"[data-language-menu]\");\nif(menu){\nmenu.classList.remove(\"group-hover:block\",\"group-focus-within:block\");\n}\nif(!c.hasAttribute(\"data-default-locale\"))continue;\nvar config={base:c.getAttribute(\"data-base\")||\"\",defaultLocale:c.getAttribute(\"data-default-locale\")||\"\",trailingSlash:c.getAttribute(\"data-trailing-slash\")===\"true\"};\nvar currentLang=c.getAttribute(\"data-current-locale\")||config.defaultLocale;\nvar anchors=c.querySelectorAll(\"a[lang]\");\nfor(var j=0;j<anchors.length;j++){\nvar a=anchors[j];\nvar target=a.getAttribute(\"lang\");\nif(!target)continue;\na.setAttribute(\"href\",switchLocaleHref(readCurrentPath(CURRENT_PATH_DATASET_KEY),config,currentLang,target));\n}\n}\n}\nif(window[FLAG]){window[FLAG]();return;}\nwindow[FLAG]=refresh;\ndocument.addEventListener(\"click\",function(e){\nvar target=e.target;\nvar toggle=target&&target.closest?target.closest(\"[data-language-toggle]\"):null;\nif(toggle){\nvar switcher=toggle.closest(\"[data-language-switcher]\");\nif(switcher){\nvar menu=switcher.querySelector(\"[data-language-menu]\");\nvar willOpen=toggle.getAttribute(\"aria-expanded\")!==\"true\";\ndocument.querySelectorAll(\"[data-language-switcher]\").forEach(function(c){if(c!==switcher)close(c,false);});\nif(menu){menu.classList.toggle(\"hidden\",!willOpen);toggle.setAttribute(\"aria-expanded\",String(willOpen));}\n}\nreturn;\n}\ndocument.querySelectorAll(\"[data-language-switcher]\").forEach(function(c){if(!c.contains(target))close(c,false);});\n});\ndocument.addEventListener(\"keydown\",function(e){\nif(e.key!==\"Escape\")return;\ndocument.querySelectorAll('[data-language-toggle][aria-expanded=\"true\"]').forEach(function(toggle){\nvar switcher=toggle.closest(\"[data-language-switcher]\");\nif(switcher)close(switcher,true);\n});\n});\nrefresh();\ndocument.addEventListener(\"zfb:after-swap\",refresh);\n})();";
2
+ export declare const VERSION_SWITCHER_REWIRE_SCRIPT = "(function(){\nvar FLAG=\"__zdVersionSwitcherRewire\";\nif(window[FLAG])return;\nwindow[FLAG]=true;\nvar ATTR=\"data-doc-unavailable-versions\";\nvar CURRENT_PATH_DATASET_KEY=\"zdCurrentPath\";var readCurrentPath=function readCurrentPath(datasetKey, explicit) {\n const override = typeof document === \"undefined\" ? void 0 : document.documentElement.dataset[datasetKey];\n return explicit || override || (typeof window === \"undefined\" ? void 0 : window.location.pathname);\n};\nvar computeVersionSwitcherState=function computeVersionSwitcherState(pathname, config, versionSlugs) {\n const normalizedBase = config.base;\n const defaultLocale = config.defaultLocale;\n const currentLocale = config.currentLocale;\n const trailingSlash = config.trailingSlash;\n const stripBase = (path) => {\n if (normalizedBase === \"\") return path;\n if (path === normalizedBase) return \"/\";\n return path.indexOf(normalizedBase + \"/\") === 0 ? path.slice(normalizedBase.length) : path;\n };\n const applyTrailingSlash = (url) => {\n if (!trailingSlash) return url;\n if (url.charAt(url.length - 1) === \"/\") return url;\n const suffixIdx = url.search(/[?#]/);\n const pathPart = suffixIdx >= 0 ? url.slice(0, suffixIdx) : url;\n const suffix = suffixIdx >= 0 ? url.slice(suffixIdx) : \"\";\n if (pathPart.charAt(pathPart.length - 1) === \"/\") return url;\n const segments = pathPart.split(\"/\");\n const lastSegment = segments[segments.length - 1] || \"\";\n if (/\\.[a-zA-Z]\\w*$/.test(lastSegment)) return url;\n return pathPart + \"/\" + suffix;\n };\n const withBase = (path) => {\n const raw = normalizedBase === \"\" ? path : normalizedBase + (path.charAt(0) === \"/\" ? path : \"/\" + path);\n return applyTrailingSlash(raw);\n };\n const versionsPageUrl = withBase(\n currentLocale === defaultLocale ? \"/docs/versions\" : \"/\" + currentLocale + \"/docs/versions\"\n );\n const stripped = stripBase(pathname);\n const versionMatch = stripped.match(/^\\/v\\/([^/]+)(\\/.*|$)/);\n const rest = versionMatch ? versionMatch[2] || \"/\" : stripped;\n let localeStripped = rest;\n if (currentLocale !== defaultLocale) {\n localeStripped = rest.replace(\n new RegExp(\"^/\" + currentLocale + \"(?:/|$)\"),\n \"/\"\n );\n }\n const isVersionsIndex = localeStripped === \"/docs/versions\" || localeStripped === \"/docs/versions/\";\n const isDocPage = /^\\/docs(\\/|$)/.test(localeStripped) && !isVersionsIndex;\n const activeVersion = isDocPage && versionMatch ? versionMatch[1] || null : null;\n const versionHrefs = {};\n let latestHref;\n if (isDocPage) {\n latestHref = withBase(rest);\n for (let i = 0; i < versionSlugs.length; i++) {\n const slug = versionSlugs[i];\n if (slug) versionHrefs[slug] = withBase(\"/v/\" + slug + rest);\n }\n } else {\n latestHref = versionsPageUrl;\n for (let i = 0; i < versionSlugs.length; i++) {\n const slug = versionSlugs[i];\n if (slug) versionHrefs[slug] = versionsPageUrl;\n }\n }\n return { latestHref, versionHrefs, activeVersion };\n};\nfunction setActive(a,active){\na.classList.toggle(\"font-bold\",active);\na.classList.toggle(\"text-accent\",active);\na.classList.toggle(\"text-fg\",!active);\nif(active){a.setAttribute(\"aria-current\",\"page\");}else{a.removeAttribute(\"aria-current\");}\n}\nfunction setDisabled(a,disabled,unavailableLabel){\na.classList.toggle(\"hover:bg-accent/10\",!disabled);\na.classList.toggle(\"hover:underline\",!disabled);\na.classList.toggle(\"focus-visible:underline\",!disabled);\na.classList.toggle(\"text-muted/50\",disabled);\na.classList.toggle(\"cursor-not-allowed\",disabled);\na.classList.toggle(\"pointer-events-none\",disabled);\nif(disabled){\na.setAttribute(\"aria-disabled\",\"true\");\na.setAttribute(\"tabindex\",\"-1\");\na.setAttribute(\"title\",unavailableLabel);\na.classList.remove(\"font-bold\",\"text-accent\",\"text-fg\");\na.removeAttribute(\"aria-current\");\n}else{\na.removeAttribute(\"aria-disabled\");\na.removeAttribute(\"tabindex\");\na.removeAttribute(\"title\");\n}\n}\nfunction rewire(){\nvar articleEl=document.querySelector(\"[\"+ATTR+\"]\");\nvar hasAvailabilityData=articleEl!==null;\nvar unavailableSlugs=hasAvailabilityData?(articleEl.getAttribute(ATTR)||\"\").split(\",\").filter(Boolean):[];\nvar containers=document.querySelectorAll(\"[data-version-rewire]\");\nfor(var i=0;i<containers.length;i++){\nvar c=containers[i];\nvar config={base:c.getAttribute(\"data-base\")||\"\",defaultLocale:c.getAttribute(\"data-default-locale\")||\"\",trailingSlash:c.getAttribute(\"data-trailing-slash\")===\"true\",currentLocale:c.getAttribute(\"data-current-locale\")||\"\"};\nvar unavailableLabel=c.getAttribute(\"data-unavailable-label\")||\"\";\nvar versionAnchors=c.querySelectorAll(\"[data-version-slug]\");\nvar slugs=[];\nfor(var j=0;j<versionAnchors.length;j++){\nvar s=versionAnchors[j].getAttribute(\"data-version-slug\");\nif(s)slugs.push(s);\n}\nvar state=computeVersionSwitcherState(readCurrentPath(CURRENT_PATH_DATASET_KEY),config,slugs);\nvar latest=c.querySelector(\"[data-version-latest]\");\nif(latest){\nlatest.setAttribute(\"href\",state.latestHref);\nsetActive(latest,state.activeVersion===null);\n}\nfor(var k=0;k<versionAnchors.length;k++){\nvar a=versionAnchors[k];\nvar slug=a.getAttribute(\"data-version-slug\");\nif(!slug)continue;\nvar href=state.versionHrefs[slug];\nif(href!=null)a.setAttribute(\"href\",href);\nif(hasAvailabilityData){\nvar disabled=unavailableSlugs.indexOf(slug)!==-1;\nsetDisabled(a,disabled,unavailableLabel);\nif(!disabled)setActive(a,state.activeVersion===slug);\n}else{\nvar alreadyDisabled=a.getAttribute(\"aria-disabled\")===\"true\";\nif(!alreadyDisabled)setActive(a,state.activeVersion===slug);\n}\n}\nvar label=c.querySelector(\"[data-version-trigger-label]\");\nif(label){\nif(state.activeVersion===null){\nif(latest)label.textContent=latest.textContent;\n}else{\nvar activeLabel=null;\nfor(var m=0;m<versionAnchors.length;m++){\nif(versionAnchors[m].getAttribute(\"data-version-slug\")===state.activeVersion){activeLabel=versionAnchors[m].textContent;break;}\n}\nlabel.textContent=activeLabel!=null?activeLabel:state.activeVersion;\n}\n}\n}\n}\n// The initial call is deferred to DOMContentLoaded when the script (inline in\n// <header>, which parses before <article>) would otherwise run before the\n// article element exists. Running early would read a missing ATTR as \"no\n// unavailable slugs\" and clobber the SSR-correct disabled state with\n// everything-enabled \u2014 a first-paint variant of the bug this rewire exists\n// to fix (see the doc comment above; SSR already rendered the right state for\n// this page, so a brief deferral loses nothing).\nif(document.readyState===\"loading\"){document.addEventListener(\"DOMContentLoaded\",rewire);}else{rewire();}\ndocument.addEventListener(\"zfb:after-swap\",rewire);\n})();";
@@ -0,0 +1,107 @@
1
+ const LANGUAGE_SWITCHER_INIT_SCRIPT = `(function(){
2
+ var FLAG="__zdLanguageSwitcherInit";
3
+ var CURRENT_PATH_DATASET_KEY="zdCurrentPath";var readCurrentPath=function readCurrentPath(datasetKey, explicit) {
4
+ const override = typeof document === "undefined" ? void 0 : document.documentElement.dataset[datasetKey];
5
+ return explicit || override || (typeof window === "undefined" ? void 0 : window.location.pathname);
6
+ };
7
+ var switchLocaleHref=function switchLocaleHref(pathname, config, currentLang, targetLang) {
8
+ const normalizedBase = config.base;
9
+ const defaultLocale = config.defaultLocale;
10
+ const trailingSlash = config.trailingSlash;
11
+ const stripBase = (path) => {
12
+ if (normalizedBase === "") return path;
13
+ if (path === normalizedBase) return "/";
14
+ return path.indexOf(normalizedBase + "/") === 0 ? path.slice(normalizedBase.length) : path;
15
+ };
16
+ const applyTrailingSlash = (url) => {
17
+ if (!trailingSlash) return url;
18
+ if (url.charAt(url.length - 1) === "/") return url;
19
+ const suffixIdx = url.search(/[?#]/);
20
+ const pathPart = suffixIdx >= 0 ? url.slice(0, suffixIdx) : url;
21
+ const suffix = suffixIdx >= 0 ? url.slice(suffixIdx) : "";
22
+ if (pathPart.charAt(pathPart.length - 1) === "/") return url;
23
+ const segments = pathPart.split("/");
24
+ const lastSegment = segments[segments.length - 1] || "";
25
+ if (/\\.[a-zA-Z]\\w*$/.test(lastSegment)) return url;
26
+ return pathPart + "/" + suffix;
27
+ };
28
+ const withBase = (path) => {
29
+ const raw = normalizedBase === "" ? path : normalizedBase + (path.charAt(0) === "/" ? path : "/" + path);
30
+ return applyTrailingSlash(raw);
31
+ };
32
+ const stripped = stripBase(pathname);
33
+ const versionMatch = stripped.match(/^(\\/v\\/[^/]+)(\\/.*|$)/);
34
+ const versionPrefix = versionMatch ? versionMatch[1] || "" : "";
35
+ let relativePath = versionMatch ? versionMatch[2] || "/" : stripped;
36
+ if (currentLang !== defaultLocale) {
37
+ relativePath = relativePath.replace(
38
+ new RegExp("^/" + currentLang + "(?:/|$)"),
39
+ "/"
40
+ );
41
+ }
42
+ if (targetLang !== defaultLocale) {
43
+ relativePath = "/" + targetLang + relativePath;
44
+ }
45
+ return withBase(versionPrefix + relativePath);
46
+ };
47
+ function close(c,restoreFocus){
48
+ var toggle=c.querySelector("[data-language-toggle]");
49
+ var menu=c.querySelector("[data-language-menu]");
50
+ if(!toggle||!menu)return;
51
+ menu.classList.add("hidden");
52
+ toggle.setAttribute("aria-expanded","false");
53
+ if(restoreFocus)toggle.focus();
54
+ }
55
+ function refresh(){
56
+ var containers=document.querySelectorAll("[data-language-switcher]");
57
+ for(var i=0;i<containers.length;i++){
58
+ var c=containers[i];
59
+ close(c,false);
60
+ var menu=c.querySelector("[data-language-menu]");
61
+ if(menu){
62
+ menu.classList.remove("group-hover:block","group-focus-within:block");
63
+ }
64
+ if(!c.hasAttribute("data-default-locale"))continue;
65
+ var config={base:c.getAttribute("data-base")||"",defaultLocale:c.getAttribute("data-default-locale")||"",trailingSlash:c.getAttribute("data-trailing-slash")==="true"};
66
+ var currentLang=c.getAttribute("data-current-locale")||config.defaultLocale;
67
+ var anchors=c.querySelectorAll("a[lang]");
68
+ for(var j=0;j<anchors.length;j++){
69
+ var a=anchors[j];
70
+ var target=a.getAttribute("lang");
71
+ if(!target)continue;
72
+ a.setAttribute("href",switchLocaleHref(readCurrentPath(CURRENT_PATH_DATASET_KEY),config,currentLang,target));
73
+ }
74
+ }
75
+ }
76
+ if(window[FLAG]){window[FLAG]();return;}
77
+ window[FLAG]=refresh;
78
+ document.addEventListener("click",function(e){
79
+ var target=e.target;
80
+ var toggle=target&&target.closest?target.closest("[data-language-toggle]"):null;
81
+ if(toggle){
82
+ var switcher=toggle.closest("[data-language-switcher]");
83
+ if(switcher){
84
+ var menu=switcher.querySelector("[data-language-menu]");
85
+ var willOpen=toggle.getAttribute("aria-expanded")!=="true";
86
+ document.querySelectorAll("[data-language-switcher]").forEach(function(c){if(c!==switcher)close(c,false);});
87
+ if(menu){menu.classList.toggle("hidden",!willOpen);toggle.setAttribute("aria-expanded",String(willOpen));}
88
+ }
89
+ return;
90
+ }
91
+ document.querySelectorAll("[data-language-switcher]").forEach(function(c){if(!c.contains(target))close(c,false);});
92
+ });
93
+ document.addEventListener("keydown",function(e){
94
+ if(e.key!=="Escape")return;
95
+ document.querySelectorAll('[data-language-toggle][aria-expanded="true"]').forEach(function(toggle){
96
+ var switcher=toggle.closest("[data-language-switcher]");
97
+ if(switcher)close(switcher,true);
98
+ });
99
+ });
100
+ refresh();
101
+ document.addEventListener("zfb:after-swap",refresh);
102
+ })();`;
103
+ const VERSION_SWITCHER_REWIRE_SCRIPT = '(function(){\nvar FLAG="__zdVersionSwitcherRewire";\nif(window[FLAG])return;\nwindow[FLAG]=true;\nvar ATTR="data-doc-unavailable-versions";\nvar CURRENT_PATH_DATASET_KEY="zdCurrentPath";var readCurrentPath=function readCurrentPath(datasetKey, explicit) {\n const override = typeof document === "undefined" ? void 0 : document.documentElement.dataset[datasetKey];\n return explicit || override || (typeof window === "undefined" ? void 0 : window.location.pathname);\n};\nvar computeVersionSwitcherState=function computeVersionSwitcherState(pathname, config, versionSlugs) {\n const normalizedBase = config.base;\n const defaultLocale = config.defaultLocale;\n const currentLocale = config.currentLocale;\n const trailingSlash = config.trailingSlash;\n const stripBase = (path) => {\n if (normalizedBase === "") return path;\n if (path === normalizedBase) return "/";\n return path.indexOf(normalizedBase + "/") === 0 ? path.slice(normalizedBase.length) : path;\n };\n const applyTrailingSlash = (url) => {\n if (!trailingSlash) return url;\n if (url.charAt(url.length - 1) === "/") return url;\n const suffixIdx = url.search(/[?#]/);\n const pathPart = suffixIdx >= 0 ? url.slice(0, suffixIdx) : url;\n const suffix = suffixIdx >= 0 ? url.slice(suffixIdx) : "";\n if (pathPart.charAt(pathPart.length - 1) === "/") return url;\n const segments = pathPart.split("/");\n const lastSegment = segments[segments.length - 1] || "";\n if (/\\.[a-zA-Z]\\w*$/.test(lastSegment)) return url;\n return pathPart + "/" + suffix;\n };\n const withBase = (path) => {\n const raw = normalizedBase === "" ? path : normalizedBase + (path.charAt(0) === "/" ? path : "/" + path);\n return applyTrailingSlash(raw);\n };\n const versionsPageUrl = withBase(\n currentLocale === defaultLocale ? "/docs/versions" : "/" + currentLocale + "/docs/versions"\n );\n const stripped = stripBase(pathname);\n const versionMatch = stripped.match(/^\\/v\\/([^/]+)(\\/.*|$)/);\n const rest = versionMatch ? versionMatch[2] || "/" : stripped;\n let localeStripped = rest;\n if (currentLocale !== defaultLocale) {\n localeStripped = rest.replace(\n new RegExp("^/" + currentLocale + "(?:/|$)"),\n "/"\n );\n }\n const isVersionsIndex = localeStripped === "/docs/versions" || localeStripped === "/docs/versions/";\n const isDocPage = /^\\/docs(\\/|$)/.test(localeStripped) && !isVersionsIndex;\n const activeVersion = isDocPage && versionMatch ? versionMatch[1] || null : null;\n const versionHrefs = {};\n let latestHref;\n if (isDocPage) {\n latestHref = withBase(rest);\n for (let i = 0; i < versionSlugs.length; i++) {\n const slug = versionSlugs[i];\n if (slug) versionHrefs[slug] = withBase("/v/" + slug + rest);\n }\n } else {\n latestHref = versionsPageUrl;\n for (let i = 0; i < versionSlugs.length; i++) {\n const slug = versionSlugs[i];\n if (slug) versionHrefs[slug] = versionsPageUrl;\n }\n }\n return { latestHref, versionHrefs, activeVersion };\n};\nfunction setActive(a,active){\na.classList.toggle("font-bold",active);\na.classList.toggle("text-accent",active);\na.classList.toggle("text-fg",!active);\nif(active){a.setAttribute("aria-current","page");}else{a.removeAttribute("aria-current");}\n}\nfunction setDisabled(a,disabled,unavailableLabel){\na.classList.toggle("hover:bg-accent/10",!disabled);\na.classList.toggle("hover:underline",!disabled);\na.classList.toggle("focus-visible:underline",!disabled);\na.classList.toggle("text-muted/50",disabled);\na.classList.toggle("cursor-not-allowed",disabled);\na.classList.toggle("pointer-events-none",disabled);\nif(disabled){\na.setAttribute("aria-disabled","true");\na.setAttribute("tabindex","-1");\na.setAttribute("title",unavailableLabel);\na.classList.remove("font-bold","text-accent","text-fg");\na.removeAttribute("aria-current");\n}else{\na.removeAttribute("aria-disabled");\na.removeAttribute("tabindex");\na.removeAttribute("title");\n}\n}\nfunction rewire(){\nvar articleEl=document.querySelector("["+ATTR+"]");\nvar hasAvailabilityData=articleEl!==null;\nvar unavailableSlugs=hasAvailabilityData?(articleEl.getAttribute(ATTR)||"").split(",").filter(Boolean):[];\nvar containers=document.querySelectorAll("[data-version-rewire]");\nfor(var i=0;i<containers.length;i++){\nvar c=containers[i];\nvar config={base:c.getAttribute("data-base")||"",defaultLocale:c.getAttribute("data-default-locale")||"",trailingSlash:c.getAttribute("data-trailing-slash")==="true",currentLocale:c.getAttribute("data-current-locale")||""};\nvar unavailableLabel=c.getAttribute("data-unavailable-label")||"";\nvar versionAnchors=c.querySelectorAll("[data-version-slug]");\nvar slugs=[];\nfor(var j=0;j<versionAnchors.length;j++){\nvar s=versionAnchors[j].getAttribute("data-version-slug");\nif(s)slugs.push(s);\n}\nvar state=computeVersionSwitcherState(readCurrentPath(CURRENT_PATH_DATASET_KEY),config,slugs);\nvar latest=c.querySelector("[data-version-latest]");\nif(latest){\nlatest.setAttribute("href",state.latestHref);\nsetActive(latest,state.activeVersion===null);\n}\nfor(var k=0;k<versionAnchors.length;k++){\nvar a=versionAnchors[k];\nvar slug=a.getAttribute("data-version-slug");\nif(!slug)continue;\nvar href=state.versionHrefs[slug];\nif(href!=null)a.setAttribute("href",href);\nif(hasAvailabilityData){\nvar disabled=unavailableSlugs.indexOf(slug)!==-1;\nsetDisabled(a,disabled,unavailableLabel);\nif(!disabled)setActive(a,state.activeVersion===slug);\n}else{\nvar alreadyDisabled=a.getAttribute("aria-disabled")==="true";\nif(!alreadyDisabled)setActive(a,state.activeVersion===slug);\n}\n}\nvar label=c.querySelector("[data-version-trigger-label]");\nif(label){\nif(state.activeVersion===null){\nif(latest)label.textContent=latest.textContent;\n}else{\nvar activeLabel=null;\nfor(var m=0;m<versionAnchors.length;m++){\nif(versionAnchors[m].getAttribute("data-version-slug")===state.activeVersion){activeLabel=versionAnchors[m].textContent;break;}\n}\nlabel.textContent=activeLabel!=null?activeLabel:state.activeVersion;\n}\n}\n}\n}\n// The initial call is deferred to DOMContentLoaded when the script (inline in\n// <header>, which parses before <article>) would otherwise run before the\n// article element exists. Running early would read a missing ATTR as "no\n// unavailable slugs" and clobber the SSR-correct disabled state with\n// everything-enabled \u2014 a first-paint variant of the bug this rewire exists\n// to fix (see the doc comment above; SSR already rendered the right state for\n// this page, so a brief deferral loses nothing).\nif(document.readyState==="loading"){document.addEventListener("DOMContentLoaded",rewire);}else{rewire();}\ndocument.addEventListener("zfb:after-swap",rewire);\n})();';
104
+ export {
105
+ LANGUAGE_SWITCHER_INIT_SCRIPT,
106
+ VERSION_SWITCHER_REWIRE_SCRIPT
107
+ };