@takazudo/zudo-doc 3.3.0 → 4.1.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 (423) hide show
  1. package/CHANGELOG.md +51 -0
  2. package/README.md +2 -2
  3. package/bin/tag-cli-config.ts +126 -0
  4. package/bin/tags-audit-runner.ts +60 -76
  5. package/bin/tags-audit.mjs +17 -36
  6. package/bin/tags-suggest-runner.ts +429 -0
  7. package/bin/tags-suggest.mjs +30 -0
  8. package/bin/zudo-doc.mjs +78 -25
  9. package/dist/breadcrumb/breadcrumb.d.ts +4 -4
  10. package/dist/breadcrumb/find-path.d.ts +2 -2
  11. package/dist/breadcrumb/index.d.ts +1 -1
  12. package/dist/breadcrumb/types.d.ts +0 -5
  13. package/dist/chrome/derive.d.ts +16 -10
  14. package/dist/chrome/derive.js +53 -4
  15. package/dist/chrome/index.d.ts +13 -10
  16. package/dist/chrome/index.js +12 -6
  17. package/dist/chrome/primary-slots.d.ts +21 -0
  18. package/dist/chrome/primary-slots.js +59 -0
  19. package/dist/chrome-bindings.d.ts +68 -0
  20. package/dist/code-syntax/code-block-enhancer-script.d.ts +4 -0
  21. package/dist/code-syntax/code-block-enhancer-script.js +7 -4
  22. package/dist/code-syntax/code-block-enhancer.d.ts +2 -2
  23. package/dist/code-syntax/code-block-enhancer.js +1 -3
  24. package/dist/code-syntax/index.d.ts +5 -5
  25. package/dist/code-syntax/index.js +4 -13
  26. package/dist/code-syntax/mermaid-init-script.d.ts +1 -22
  27. package/dist/code-syntax/mermaid-init-script.js +0 -2
  28. package/dist/code-syntax/mermaid-init.d.ts +0 -1
  29. package/dist/code-syntax/mermaid-init.js +3 -4
  30. package/dist/code-syntax/tabs-init.d.ts +0 -1
  31. package/dist/code-syntax/tabs-init.js +1 -3
  32. package/dist/code-syntax/tabs.d.ts +0 -1
  33. package/dist/code-syntax/tabs.js +1 -3
  34. package/dist/color-scheme-utils.d.ts +71 -3
  35. package/dist/color-scheme-utils.js +137 -0
  36. package/dist/color-schemes-defaults/index.js +13 -0
  37. package/dist/config/component-tokens.d.ts +1 -1
  38. package/dist/config/component-tokens.js +104 -5
  39. package/dist/config.d.ts +28 -12
  40. package/dist/config.js +11 -2
  41. package/dist/content/component-map.d.ts +0 -16
  42. package/dist/content/component-map.js +2 -4
  43. package/dist/content/index.d.ts +1 -1
  44. package/dist/content/index.js +2 -3
  45. package/dist/content.css +1 -1
  46. package/dist/design-token-panel-bootstrap.d.ts +45 -40
  47. package/dist/design-token-panel-bootstrap.js +98 -21
  48. package/dist/design-token-panel-config/index.js +1 -4
  49. package/dist/doc-body-end-islands/design-token-panel-island.d.ts +15 -0
  50. package/dist/doc-body-end-islands/design-token-panel-island.js +31 -0
  51. package/dist/doc-body-end-islands/index.d.ts +39 -17
  52. package/dist/doc-body-end-islands/index.js +13 -21
  53. package/dist/doc-body-end-islands/theme-pack-switcher-island.d.ts +37 -0
  54. package/dist/doc-body-end-islands/theme-pack-switcher-island.js +18 -0
  55. package/dist/doc-content-header/index.js +1 -1
  56. package/dist/doc-history-area/index.d.ts +10 -4
  57. package/dist/doc-history-area/index.js +3 -2
  58. package/dist/doc-metainfo-area/index.d.ts +1 -0
  59. package/dist/doc-page-props/index.d.ts +7 -23
  60. package/dist/doc-page-renderer/index.d.ts +1 -0
  61. package/dist/doc-page-renderer/index.js +1 -0
  62. package/dist/doc-page-shell/index.js +19 -12
  63. package/dist/doc-pager/index.js +1 -1
  64. package/dist/doc-route-entries/index.d.ts +2 -2
  65. package/dist/doclayout/doc-layout-with-defaults.js +4 -4
  66. package/dist/doclayout/doc-layout.d.ts +8 -0
  67. package/dist/doclayout/doc-layout.js +10 -1
  68. package/dist/docs-schema/index.js +1 -5
  69. package/dist/eject/index.d.ts +16 -0
  70. package/dist/eject/index.js +122 -28
  71. package/dist/extract-headings/index.d.ts +5 -8
  72. package/dist/extract-headings/index.js +2 -9
  73. package/dist/factory-context/index.d.ts +42 -4
  74. package/dist/features.css +80 -45
  75. package/dist/footer/footer.js +1 -0
  76. package/dist/head-with-defaults/index.d.ts +2 -0
  77. package/dist/head-with-defaults/index.js +16 -0
  78. package/dist/header/header.d.ts +10 -5
  79. package/dist/header/header.js +45 -5
  80. package/dist/header/index.d.ts +1 -1
  81. package/dist/header/types.d.ts +30 -1
  82. package/dist/header-with-defaults/index.js +1 -0
  83. package/dist/home-page/index.d.ts +2 -0
  84. package/dist/home-page/index.js +11 -5
  85. package/dist/home-page/prepare-home-data.js +1 -1
  86. package/dist/locale-merge/index.d.ts +9 -14
  87. package/dist/locale-merge/index.js +6 -4
  88. package/dist/mdx-components/index.js +4 -4
  89. package/dist/plugins/claude-resources.d.ts +1 -0
  90. package/dist/plugins/claude-resources.js +4 -2
  91. package/dist/plugins/doc-history.js +1 -1
  92. package/dist/{integrations → plugins/internal}/claude-resources/index.d.ts +1 -16
  93. package/dist/{integrations → plugins/internal}/claude-resources/index.js +0 -9
  94. package/dist/{integrations → plugins/internal}/doc-history/index.d.ts +0 -17
  95. package/dist/{integrations → plugins/internal}/doc-history/index.js +0 -4
  96. package/dist/{integrations → plugins/internal}/doc-history/pre-build.d.ts +2 -4
  97. package/dist/plugins/internal/llms-txt/index.d.ts +7 -0
  98. package/dist/{integrations → plugins/internal}/llms-txt/load.d.ts +1 -1
  99. package/dist/{integrations → plugins/internal}/llms-txt/load.js +2 -2
  100. package/dist/{integrations → plugins/internal}/llms-txt/strip.d.ts +2 -3
  101. package/dist/{integrations → plugins/internal}/llms-txt/strip.js +1 -1
  102. package/dist/{integrations → plugins/internal}/llms-txt/types.d.ts +13 -22
  103. package/dist/{integrations → plugins/internal}/search-index/collect.js +1 -1
  104. package/dist/plugins/internal/theme-packs/copy.d.ts +32 -0
  105. package/dist/plugins/internal/theme-packs/copy.js +45 -0
  106. package/dist/plugins/internal/theme-packs/dev-middleware.d.ts +22 -0
  107. package/dist/plugins/internal/theme-packs/dev-middleware.js +80 -0
  108. package/dist/plugins/internal/theme-packs/index.d.ts +6 -0
  109. package/dist/plugins/internal/theme-packs/index.js +9 -0
  110. package/dist/plugins/internal/theme-packs/resolve.d.ts +17 -0
  111. package/dist/plugins/internal/theme-packs/resolve.js +17 -0
  112. package/dist/plugins/internal/theme-packs/types.d.ts +22 -0
  113. package/dist/plugins/internal/theme-packs/types.js +0 -0
  114. package/dist/plugins/llms-txt.js +1 -1
  115. package/dist/plugins/routes.js +11 -1
  116. package/dist/plugins/search-index.js +1 -1
  117. package/dist/plugins/theme-packs.d.ts +3 -0
  118. package/dist/plugins/theme-packs.js +40 -0
  119. package/dist/preset.d.ts +19 -14
  120. package/dist/preset.js +24 -9
  121. package/dist/route-context/index.js +4 -6
  122. package/dist/route-enumerators/index.d.ts +6 -18
  123. package/dist/route-enumerators/index.js +8 -6
  124. package/dist/routes/404.js +3 -1
  125. package/dist/routes/_chrome.js +2 -2
  126. package/dist/routes/_context.d.ts +7 -3
  127. package/dist/routes/_context.js +2 -0
  128. package/dist/routes/_docs-helpers.js +9 -21
  129. package/dist/safelist.css +1 -1
  130. package/dist/settings.d.ts +27 -12
  131. package/dist/sidebar-toggle-island/index.js +1 -0
  132. package/dist/sidebar-tree/build-tree.d.ts +3 -4
  133. package/dist/sidebar-tree/build-tree.js +4 -3
  134. package/dist/sidebar-tree/index.d.ts +2 -2
  135. package/dist/sidebar-tree/types.d.ts +6 -17
  136. package/dist/site-tree-nav-island/index.d.ts +3 -1
  137. package/dist/site-tree-nav-island/index.js +17 -5
  138. package/dist/site-tree-nav-island/state.d.ts +4 -0
  139. package/dist/site-tree-nav-island/state.js +10 -0
  140. package/dist/tag-helpers/index.d.ts +6 -13
  141. package/dist/tag-helpers/index.js +5 -23
  142. package/dist/tag-pages/index.d.ts +8 -21
  143. package/dist/tag-pages/index.js +14 -10
  144. package/dist/tags-audit.d.ts +16 -44
  145. package/dist/tags-audit.js +9 -172
  146. package/dist/theme/color-scheme-provider.d.ts +2 -3
  147. package/dist/theme/color-scheme-provider.js +2 -10
  148. package/dist/theme/index.d.ts +1 -4
  149. package/dist/theme/index.js +2 -30
  150. package/dist/theme/theme-pack-provider.d.ts +42 -0
  151. package/dist/theme/theme-pack-provider.js +75 -0
  152. package/dist/theme-cli/apply.d.ts +16 -0
  153. package/dist/theme-cli/apply.js +61 -0
  154. package/dist/theme-cli/config-io.d.ts +15 -0
  155. package/dist/theme-cli/config-io.js +51 -0
  156. package/dist/theme-cli/config-rewriter.d.ts +21 -0
  157. package/dist/theme-cli/config-rewriter.js +141 -0
  158. package/dist/theme-cli/config-scanner.d.ts +63 -0
  159. package/dist/theme-cli/config-scanner.js +288 -0
  160. package/dist/theme-cli/index.d.ts +7 -0
  161. package/dist/theme-cli/index.js +38 -0
  162. package/dist/theme-cli/list.d.ts +27 -0
  163. package/dist/theme-cli/list.js +64 -0
  164. package/dist/theme-cli/provenance.d.ts +17 -0
  165. package/dist/theme-cli/provenance.js +35 -0
  166. package/dist/theme-cli/registry.d.ts +14 -0
  167. package/dist/theme-cli/registry.js +13 -0
  168. package/dist/theme-pack-dialog/dialog-state.d.ts +25 -0
  169. package/dist/theme-pack-dialog/dialog-state.js +40 -0
  170. package/dist/theme-pack-dialog/index.d.ts +5 -0
  171. package/dist/theme-pack-dialog/index.js +152 -0
  172. package/dist/theme-pack-dialog/theme-pack-card.d.ts +25 -0
  173. package/dist/theme-pack-dialog/theme-pack-card.js +72 -0
  174. package/dist/theme-pack-switcher/index.d.ts +49 -0
  175. package/dist/theme-pack-switcher/index.js +205 -0
  176. package/dist/theme-pack-switcher/switcher-state.d.ts +56 -0
  177. package/dist/theme-pack-switcher/switcher-state.js +43 -0
  178. package/dist/theme-pack-switcher/theme-pack-sync.d.ts +85 -0
  179. package/dist/theme-pack-switcher/theme-pack-sync.js +121 -0
  180. package/dist/theme-packs/beacon/fonts/AtkinsonHyperlegible-400-latin.woff2 +0 -0
  181. package/dist/theme-packs/beacon/fonts/AtkinsonHyperlegible-700-latin.woff2 +0 -0
  182. package/dist/theme-packs/beacon/fonts/AtkinsonHyperlegible-italic-400-latin.woff2 +0 -0
  183. package/dist/theme-packs/beacon/fonts/AtkinsonHyperlegible-italic-700-latin.woff2 +0 -0
  184. package/dist/theme-packs/beacon/fonts/AtkinsonHyperlegibleMono-italic-latin.woff2 +0 -0
  185. package/dist/theme-packs/beacon/fonts/AtkinsonHyperlegibleMono-latin.woff2 +0 -0
  186. package/dist/theme-packs/beacon/fonts/OFL.txt +94 -0
  187. package/dist/theme-packs/beacon/meta.json +37 -0
  188. package/dist/theme-packs/beacon/pack.css +442 -0
  189. package/dist/theme-packs/broadsheet/fonts/CourierPrime-400-latin.woff2 +0 -0
  190. package/dist/theme-packs/broadsheet/fonts/CourierPrime-700-latin.woff2 +0 -0
  191. package/dist/theme-packs/broadsheet/fonts/OFL.txt +95 -0
  192. package/dist/theme-packs/broadsheet/fonts/PlayfairDisplay-italic-latin.woff2 +0 -0
  193. package/dist/theme-packs/broadsheet/fonts/PlayfairDisplay-latin.woff2 +0 -0
  194. package/dist/theme-packs/broadsheet/fonts/SourceSerif4-italic-latin.woff2 +0 -0
  195. package/dist/theme-packs/broadsheet/fonts/SourceSerif4-latin.woff2 +0 -0
  196. package/dist/theme-packs/broadsheet/meta.json +38 -0
  197. package/dist/theme-packs/broadsheet/pack.css +448 -0
  198. package/dist/theme-packs/brutalist/fonts/ArchivoBlack-latin.woff2 +0 -0
  199. package/dist/theme-packs/brutalist/fonts/IBMPlexMono-400-latin.woff2 +0 -0
  200. package/dist/theme-packs/brutalist/fonts/IBMPlexMono-500-latin.woff2 +0 -0
  201. package/dist/theme-packs/brutalist/fonts/IBMPlexMono-700-latin.woff2 +0 -0
  202. package/dist/theme-packs/brutalist/fonts/OFL.txt +95 -0
  203. package/dist/theme-packs/brutalist/fonts/SpaceGrotesk-latin.woff2 +0 -0
  204. package/dist/theme-packs/brutalist/meta.json +38 -0
  205. package/dist/theme-packs/brutalist/pack.css +546 -0
  206. package/dist/theme-packs/default/meta.json +37 -0
  207. package/dist/theme-packs/drift/fonts/IBMPlexMono-400-latin-ext.woff2 +0 -0
  208. package/dist/theme-packs/drift/fonts/IBMPlexMono-400-latin.woff2 +0 -0
  209. package/dist/theme-packs/drift/fonts/IBMPlexMono-500-latin-ext.woff2 +0 -0
  210. package/dist/theme-packs/drift/fonts/IBMPlexMono-500-latin.woff2 +0 -0
  211. package/dist/theme-packs/drift/fonts/IBMPlexSans-italic-latin.woff2 +0 -0
  212. package/dist/theme-packs/drift/fonts/IBMPlexSans-latin-ext.woff2 +0 -0
  213. package/dist/theme-packs/drift/fonts/IBMPlexSans-latin.woff2 +0 -0
  214. package/dist/theme-packs/drift/fonts/OFL.txt +93 -0
  215. package/dist/theme-packs/drift/meta.json +37 -0
  216. package/dist/theme-packs/drift/pack.css +478 -0
  217. package/dist/theme-packs/fjord/fonts/Inter-latin-ext.woff2 +0 -0
  218. package/dist/theme-packs/fjord/fonts/Inter-latin.woff2 +0 -0
  219. package/dist/theme-packs/fjord/fonts/JetBrainsMono-latin-ext.woff2 +0 -0
  220. package/dist/theme-packs/fjord/fonts/JetBrainsMono-latin.woff2 +0 -0
  221. package/dist/theme-packs/fjord/fonts/OFL.txt +94 -0
  222. package/dist/theme-packs/fjord/meta.json +37 -0
  223. package/dist/theme-packs/fjord/pack.css +375 -0
  224. package/dist/theme-packs/foundry/fonts/Inter-latin-ext.woff2 +0 -0
  225. package/dist/theme-packs/foundry/fonts/Inter-latin.woff2 +0 -0
  226. package/dist/theme-packs/foundry/fonts/OFL.txt +93 -0
  227. package/dist/theme-packs/foundry/meta.json +37 -0
  228. package/dist/theme-packs/foundry/pack.css +202 -0
  229. package/dist/theme-packs/futura-editorial/fonts/Jost-latin.woff2 +0 -0
  230. package/dist/theme-packs/futura-editorial/fonts/NotoSans-italic-latin.woff2 +0 -0
  231. package/dist/theme-packs/futura-editorial/fonts/NotoSans-latin.woff2 +0 -0
  232. package/dist/theme-packs/futura-editorial/fonts/OFL.txt +95 -0
  233. package/dist/theme-packs/futura-editorial/fonts/SpaceMono-400-latin.woff2 +0 -0
  234. package/dist/theme-packs/futura-editorial/fonts/SpaceMono-700-latin.woff2 +0 -0
  235. package/dist/theme-packs/futura-editorial/meta.json +38 -0
  236. package/dist/theme-packs/futura-editorial/pack.css +313 -0
  237. package/dist/theme-packs/hearth/fonts/Fraunces-italic-latin.woff2 +0 -0
  238. package/dist/theme-packs/hearth/fonts/Fraunces-latin.woff2 +0 -0
  239. package/dist/theme-packs/hearth/fonts/Nunito-latin.woff2 +0 -0
  240. package/dist/theme-packs/hearth/fonts/OFL.txt +95 -0
  241. package/dist/theme-packs/hearth/fonts/SplineSansMono-latin.woff2 +0 -0
  242. package/dist/theme-packs/hearth/meta.json +38 -0
  243. package/dist/theme-packs/hearth/pack.css +385 -0
  244. package/dist/theme-packs/hollow/fonts/OFL.txt +94 -0
  245. package/dist/theme-packs/hollow/fonts/SpaceGrotesk-latin.woff2 +0 -0
  246. package/dist/theme-packs/hollow/fonts/SpaceMono-400-italic-latin.woff2 +0 -0
  247. package/dist/theme-packs/hollow/fonts/SpaceMono-400-latin.woff2 +0 -0
  248. package/dist/theme-packs/hollow/fonts/SpaceMono-700-latin.woff2 +0 -0
  249. package/dist/theme-packs/hollow/meta.json +37 -0
  250. package/dist/theme-packs/hollow/pack.css +428 -0
  251. package/dist/theme-packs/ledger/fonts/CrimsonPro-latin-ext-italic.woff2 +0 -0
  252. package/dist/theme-packs/ledger/fonts/CrimsonPro-latin-ext.woff2 +0 -0
  253. package/dist/theme-packs/ledger/fonts/CrimsonPro-latin-italic.woff2 +0 -0
  254. package/dist/theme-packs/ledger/fonts/CrimsonPro-latin.woff2 +0 -0
  255. package/dist/theme-packs/ledger/fonts/IBMPlexMono-400-latin-ext.woff2 +0 -0
  256. package/dist/theme-packs/ledger/fonts/IBMPlexMono-400-latin.woff2 +0 -0
  257. package/dist/theme-packs/ledger/fonts/IBMPlexMono-500-latin-ext.woff2 +0 -0
  258. package/dist/theme-packs/ledger/fonts/IBMPlexMono-500-latin.woff2 +0 -0
  259. package/dist/theme-packs/ledger/fonts/OFL.txt +94 -0
  260. package/dist/theme-packs/ledger/meta.json +37 -0
  261. package/dist/theme-packs/ledger/pack.css +463 -0
  262. package/dist/theme-packs/manuscript/fonts/CourierPrime-400-latin-ext.woff2 +0 -0
  263. package/dist/theme-packs/manuscript/fonts/CourierPrime-400-latin.woff2 +0 -0
  264. package/dist/theme-packs/manuscript/fonts/CourierPrime-700-latin-ext.woff2 +0 -0
  265. package/dist/theme-packs/manuscript/fonts/CourierPrime-700-latin.woff2 +0 -0
  266. package/dist/theme-packs/manuscript/fonts/EBGaramond-latin-italic.woff2 +0 -0
  267. package/dist/theme-packs/manuscript/fonts/EBGaramond-latin.woff2 +0 -0
  268. package/dist/theme-packs/manuscript/fonts/OFL.txt +94 -0
  269. package/dist/theme-packs/manuscript/meta.json +37 -0
  270. package/dist/theme-packs/manuscript/pack.css +376 -0
  271. package/dist/theme-packs/matcha/fonts/MPLUS1Code-latin.woff2 +0 -0
  272. package/dist/theme-packs/matcha/fonts/OFL.txt +95 -0
  273. package/dist/theme-packs/matcha/fonts/ShipporiMincho-500-latin.woff2 +0 -0
  274. package/dist/theme-packs/matcha/fonts/ShipporiMincho-700-latin.woff2 +0 -0
  275. package/dist/theme-packs/matcha/fonts/ZenKakuGothicNew-400-latin.woff2 +0 -0
  276. package/dist/theme-packs/matcha/fonts/ZenKakuGothicNew-500-latin.woff2 +0 -0
  277. package/dist/theme-packs/matcha/meta.json +38 -0
  278. package/dist/theme-packs/matcha/pack.css +409 -0
  279. package/dist/theme-packs/nocturne/fonts/CormorantGaramond-italic-latin.woff2 +0 -0
  280. package/dist/theme-packs/nocturne/fonts/CormorantGaramond-latin.woff2 +0 -0
  281. package/dist/theme-packs/nocturne/fonts/IBMPlexMono-400-latin.woff2 +0 -0
  282. package/dist/theme-packs/nocturne/fonts/IBMPlexMono-500-latin.woff2 +0 -0
  283. package/dist/theme-packs/nocturne/fonts/IBMPlexMono-italic-latin.woff2 +0 -0
  284. package/dist/theme-packs/nocturne/fonts/Manrope-latin.woff2 +0 -0
  285. package/dist/theme-packs/nocturne/fonts/OFL.txt +95 -0
  286. package/dist/theme-packs/nocturne/meta.json +38 -0
  287. package/dist/theme-packs/nocturne/pack.css +502 -0
  288. package/dist/theme-packs/observatory/fonts/JosefinSans-latin.woff2 +0 -0
  289. package/dist/theme-packs/observatory/fonts/Jost-italic-latin.woff2 +0 -0
  290. package/dist/theme-packs/observatory/fonts/Jost-latin.woff2 +0 -0
  291. package/dist/theme-packs/observatory/fonts/OFL.txt +95 -0
  292. package/dist/theme-packs/observatory/fonts/SpaceMono-400-latin.woff2 +0 -0
  293. package/dist/theme-packs/observatory/fonts/SpaceMono-700-latin.woff2 +0 -0
  294. package/dist/theme-packs/observatory/fonts/SpaceMono-italic-latin.woff2 +0 -0
  295. package/dist/theme-packs/observatory/meta.json +38 -0
  296. package/dist/theme-packs/observatory/pack.css +728 -0
  297. package/dist/theme-packs/onyx/fonts/CormorantGaramond-italic-latin.woff2 +0 -0
  298. package/dist/theme-packs/onyx/fonts/CormorantGaramond-latin.woff2 +0 -0
  299. package/dist/theme-packs/onyx/fonts/IBMPlexMono-400-latin-ext.woff2 +0 -0
  300. package/dist/theme-packs/onyx/fonts/IBMPlexMono-400-latin.woff2 +0 -0
  301. package/dist/theme-packs/onyx/fonts/IBMPlexMono-500-latin-ext.woff2 +0 -0
  302. package/dist/theme-packs/onyx/fonts/IBMPlexMono-500-latin.woff2 +0 -0
  303. package/dist/theme-packs/onyx/fonts/Jost-latin.woff2 +0 -0
  304. package/dist/theme-packs/onyx/fonts/OFL.txt +95 -0
  305. package/dist/theme-packs/onyx/meta.json +38 -0
  306. package/dist/theme-packs/onyx/pack.css +497 -0
  307. package/dist/theme-packs/phosphor/fonts/JetBrainsMono-latin-ext.woff2 +0 -0
  308. package/dist/theme-packs/phosphor/fonts/JetBrainsMono-latin.woff2 +0 -0
  309. package/dist/theme-packs/phosphor/fonts/OFL.txt +94 -0
  310. package/dist/theme-packs/phosphor/fonts/VT323-latin-ext.woff2 +0 -0
  311. package/dist/theme-packs/phosphor/fonts/VT323-latin.woff2 +0 -0
  312. package/dist/theme-packs/phosphor/meta.json +38 -0
  313. package/dist/theme-packs/phosphor/pack.css +493 -0
  314. package/dist/theme-packs/solar/fonts/OFL.txt +94 -0
  315. package/dist/theme-packs/solar/fonts/SourceCodePro-italic-latin.woff2 +0 -0
  316. package/dist/theme-packs/solar/fonts/SourceCodePro-latin.woff2 +0 -0
  317. package/dist/theme-packs/solar/fonts/SourceSans3-italic-latin.woff2 +0 -0
  318. package/dist/theme-packs/solar/fonts/SourceSans3-latin.woff2 +0 -0
  319. package/dist/theme-packs/solar/meta.json +37 -0
  320. package/dist/theme-packs/solar/pack.css +380 -0
  321. package/dist/theme-packs/sumi/fonts/IBMPlexMono-400-latin-ext.woff2 +0 -0
  322. package/dist/theme-packs/sumi/fonts/IBMPlexMono-400-latin.woff2 +0 -0
  323. package/dist/theme-packs/sumi/fonts/IBMPlexMono-500-latin-ext.woff2 +0 -0
  324. package/dist/theme-packs/sumi/fonts/IBMPlexMono-500-latin.woff2 +0 -0
  325. package/dist/theme-packs/sumi/fonts/OFL.txt +95 -0
  326. package/dist/theme-packs/sumi/fonts/ShipporiMinchoB1-600-latin.woff2 +0 -0
  327. package/dist/theme-packs/sumi/fonts/ShipporiMinchoB1-700-latin.woff2 +0 -0
  328. package/dist/theme-packs/sumi/fonts/ShipporiMinchoB1-800-latin.woff2 +0 -0
  329. package/dist/theme-packs/sumi/fonts/ZenKakuGothicNew-400-latin.woff2 +0 -0
  330. package/dist/theme-packs/sumi/fonts/ZenKakuGothicNew-500-latin.woff2 +0 -0
  331. package/dist/theme-packs/sumi/meta.json +38 -0
  332. package/dist/theme-packs/sumi/pack.css +502 -0
  333. package/dist/theme-packs/swissgrid/fonts/IBMPlexMono-400-latin-ext.woff2 +0 -0
  334. package/dist/theme-packs/swissgrid/fonts/IBMPlexMono-400-latin.woff2 +0 -0
  335. package/dist/theme-packs/swissgrid/fonts/IBMPlexMono-600-latin.woff2 +0 -0
  336. package/dist/theme-packs/swissgrid/fonts/Inter-latin-ext.woff2 +0 -0
  337. package/dist/theme-packs/swissgrid/fonts/Inter-latin.woff2 +0 -0
  338. package/dist/theme-packs/swissgrid/fonts/InterTight-latin.woff2 +0 -0
  339. package/dist/theme-packs/swissgrid/fonts/OFL.txt +95 -0
  340. package/dist/theme-packs/swissgrid/meta.json +38 -0
  341. package/dist/theme-packs/swissgrid/pack.css +518 -0
  342. package/dist/theme-packs/washi/fonts/MPlus1Code-400-latin.woff2 +0 -0
  343. package/dist/theme-packs/washi/fonts/MPlus1Code-500-latin.woff2 +0 -0
  344. package/dist/theme-packs/washi/fonts/OFL.txt +95 -0
  345. package/dist/theme-packs/washi/fonts/ShipporiMincho-500-latin.woff2 +0 -0
  346. package/dist/theme-packs/washi/fonts/ShipporiMincho-600-latin.woff2 +0 -0
  347. package/dist/theme-packs/washi/fonts/ShipporiMincho-700-latin.woff2 +0 -0
  348. package/dist/theme-packs/washi/fonts/ZenKakuGothicNew-400-latin.woff2 +0 -0
  349. package/dist/theme-packs/washi/fonts/ZenKakuGothicNew-500-latin.woff2 +0 -0
  350. package/dist/theme-packs/washi/fonts/ZenKakuGothicNew-700-latin.woff2 +0 -0
  351. package/dist/theme-packs/washi/meta.json +38 -0
  352. package/dist/theme-packs/washi/pack.css +479 -0
  353. package/dist/theme-packs-registry/index.d.ts +5 -0
  354. package/dist/theme-packs-registry/index.js +30 -0
  355. package/dist/theme-packs-registry/load-registry.d.ts +23 -0
  356. package/dist/theme-packs-registry/load-registry.js +64 -0
  357. package/dist/theme-packs-registry/meta-schema.d.ts +70 -0
  358. package/dist/theme-packs-registry/meta-schema.js +38 -0
  359. package/dist/theme-packs-registry/resolve-enabled-packs.d.ts +25 -0
  360. package/dist/theme-packs-registry/resolve-enabled-packs.js +43 -0
  361. package/dist/theme-packs-registry/token-manifest.d.ts +19 -0
  362. package/dist/theme-packs-registry/token-manifest.js +57 -0
  363. package/dist/theme-packs-registry/validator.d.ts +35 -0
  364. package/dist/theme-packs-registry/validator.js +284 -0
  365. package/dist/theme-toggle/color-scheme-sync.d.ts +2 -4
  366. package/dist/toc/mobile-toc.js +1 -1
  367. package/dist/versions-page/index.d.ts +2 -2
  368. package/dist/versions-page/index.js +8 -8
  369. package/eject/breadcrumb/breadcrumb.tsx +4 -4
  370. package/eject/breadcrumb/find-path.ts +2 -2
  371. package/eject/breadcrumb/index.ts +1 -1
  372. package/eject/breadcrumb/types.ts +0 -6
  373. package/eject/code-group/index.tsx +2 -2
  374. package/eject/doc-history/index.tsx +1 -1
  375. package/eject/doc-pager/index.tsx +1 -1
  376. package/eject/footer/footer.tsx +1 -0
  377. package/eject/header/header.tsx +86 -21
  378. package/eject/header/index.ts +3 -0
  379. package/eject/header/types.ts +39 -1
  380. package/eject/sidebar-toggle-island/index.tsx +7 -1
  381. package/eject/site-tree-nav-island/index.tsx +15 -3
  382. package/eject/site-tree-nav-island/state.ts +9 -0
  383. package/eject/theme-toggle/color-scheme-sync.ts +2 -4
  384. package/eject/toc/mobile-toc.tsx +9 -1
  385. package/package.json +35 -29
  386. package/routes-src/404.tsx +4 -1
  387. package/routes-src/_chrome.tsx +6 -5
  388. package/routes-src/_context.ts +4 -0
  389. package/routes-src/_docs-helpers.ts +9 -29
  390. package/routes-src/_virtual.d.ts +4 -0
  391. package/virtual-modules.d.ts +4 -0
  392. package/zfb-config-shim.d.ts +40 -18
  393. package/dist/integrations/llms-txt/index.d.ts +0 -33
  394. package/dist/theme/color-tweak-export-modal.d.ts +0 -16
  395. package/dist/theme/color-tweak-export-modal.js +0 -138
  396. package/dist/theme/design-token-serde.d.ts +0 -183
  397. package/dist/theme/design-token-serde.js +0 -346
  398. package/dist/theme/design-token-types.d.ts +0 -13
  399. package/dist/theme/design-token-types.js +0 -6
  400. package/dist/theme/iframe-bridge.d.ts +0 -42
  401. package/dist/theme/iframe-bridge.js +0 -72
  402. /package/dist/{integrations → plugins/internal}/claude-resources/escape-for-mdx.d.ts +0 -0
  403. /package/dist/{integrations → plugins/internal}/claude-resources/escape-for-mdx.js +0 -0
  404. /package/dist/{integrations → plugins/internal}/claude-resources/generate.d.ts +0 -0
  405. /package/dist/{integrations → plugins/internal}/claude-resources/generate.js +0 -0
  406. /package/dist/{integrations → plugins/internal}/doc-history/pre-build.js +0 -0
  407. /package/dist/{integrations → plugins/internal}/llms-txt/dev-middleware.d.ts +0 -0
  408. /package/dist/{integrations → plugins/internal}/llms-txt/dev-middleware.js +0 -0
  409. /package/dist/{integrations → plugins/internal}/llms-txt/emit.d.ts +0 -0
  410. /package/dist/{integrations → plugins/internal}/llms-txt/emit.js +0 -0
  411. /package/dist/{integrations → plugins/internal}/llms-txt/generate.d.ts +0 -0
  412. /package/dist/{integrations → plugins/internal}/llms-txt/generate.js +0 -0
  413. /package/dist/{integrations → plugins/internal}/llms-txt/index.js +0 -0
  414. /package/dist/{integrations → plugins/internal}/llms-txt/types.js +0 -0
  415. /package/dist/{integrations → plugins/internal}/search-index/build-emitter.d.ts +0 -0
  416. /package/dist/{integrations → plugins/internal}/search-index/build-emitter.js +0 -0
  417. /package/dist/{integrations → plugins/internal}/search-index/collect.d.ts +0 -0
  418. /package/dist/{integrations → plugins/internal}/search-index/dev-middleware.d.ts +0 -0
  419. /package/dist/{integrations → plugins/internal}/search-index/dev-middleware.js +0 -0
  420. /package/dist/{integrations → plugins/internal}/search-index/index.d.ts +0 -0
  421. /package/dist/{integrations → plugins/internal}/search-index/index.js +0 -0
  422. /package/dist/{integrations → plugins/internal}/search-index/types.d.ts +0 -0
  423. /package/dist/{integrations → plugins/internal}/search-index/types.js +0 -0
@@ -1,6 +1,7 @@
1
1
  export type { HeadingItem } from "../extract-headings/index.js";
2
2
  import type { HeadingItem } from "../extract-headings/index.js";
3
3
  import type { BreadcrumbItem } from "../breadcrumb/types.js";
4
+ import type { CollectionEntry } from "@takazudo/zfb/content";
4
5
  /**
5
6
  * Nav tree node shape as consumed by doc-route pages.
6
7
  *
@@ -35,37 +36,20 @@ export interface DocPageFrontmatter {
35
36
  draft?: boolean;
36
37
  unlisted?: boolean;
37
38
  standalone?: boolean;
39
+ sidebar_position?: number;
40
+ sidebar_label?: string;
38
41
  category_no_page?: boolean;
42
+ category_sort_order?: "asc" | "desc";
39
43
  pagination_prev?: string | null;
40
44
  pagination_next?: string | null;
41
45
  tags?: string[];
42
46
  [key: string]: unknown;
43
47
  }
44
48
  /**
45
- * A zfb content collection entry augmented with the `id`/`collection` fields
46
- * the host's `@/utils/docs` helpers expect, plus the typed `data` and
47
- * renderer surface.
48
- *
49
- * Structural counterpart of the host's `DocPageEntry` (from
50
- * `pages/lib/doc-page-props.ts`). The host stub re-exports this type under
51
- * the original name.
49
+ * The native zfb collection entry with docs frontmatter. Route consumers
50
+ * derive canonical route slugs from `entry.data.slug ?? toRouteSlug(entry.slug)`.
52
51
  */
53
- export interface DocPageEntry {
54
- /** zfb content engine slug (filename without `.md`/`.mdx`). */
55
- slug: string;
56
- /** Bridged from `slug` for host `@/utils/docs` compat. */
57
- id: string;
58
- /** Collection name, e.g. "docs", "docs-ja", "docs-v-1.0". */
59
- collection: string;
60
- /** Parsed frontmatter. Structural superset of `DocPageFrontmatter`. */
61
- data: DocPageFrontmatter;
62
- /** Raw MDX body (for heading extraction). */
63
- body?: string;
64
- /** zfb module specifier (for Content bridge). */
65
- module_specifier: string;
66
- /** zfb content renderer — callable Preact component. */
67
- Content: unknown;
68
- }
52
+ export type DocPageEntry = CollectionEntry<DocPageFrontmatter>;
69
53
  export interface AutoIndexNode extends DocNavNode {
70
54
  children: DocNavNode[];
71
55
  }
@@ -121,6 +121,7 @@ export interface DocPageRendererDeps {
121
121
  slug: string;
122
122
  locale: string;
123
123
  entrySlug?: string;
124
+ sourceFileExt?: ".mdx" | ".md";
124
125
  contentDir?: string;
125
126
  isFallback?: boolean;
126
127
  }) => VNode | null;
@@ -102,6 +102,7 @@ function createRenderDocPage(ctx) {
102
102
  slug,
103
103
  locale,
104
104
  entrySlug: props.entry.slug,
105
+ sourceFileExt: props.entry.module_specifier.endsWith(".mdx") ? ".mdx" : props.entry.module_specifier.endsWith(".md") ? ".md" : void 0,
105
106
  contentDir: opts.docHistoryContentDir,
106
107
  isFallback
107
108
  }
@@ -1,29 +1,32 @@
1
1
  import { Fragment, jsx, jsxs } from "preact/jsx-runtime";
2
2
  import { Island } from "@takazudo/zfb";
3
3
  import { DocLayoutWithDefaults } from "../doclayout/index.js";
4
- import { Toc, MobileToc, getTocTitle } from "../toc/index.js";
5
- import { Breadcrumb } from "../breadcrumb/index.js";
4
+ import { MobileToc, getTocTitle } from "../toc/index.js";
6
5
  import { NavCardGrid } from "../nav-indexing/index.js";
7
6
  import {
8
7
  createSidebarPrepaint,
9
8
  createSidebarVisibilityPrepaint
10
9
  } from "../sidebar-prepaint/index.js";
11
10
  import { createHeadWithDefaults } from "../head-with-defaults/index.js";
12
- import { createSidebarWithDefaults } from "../sidebar-with-defaults/index.js";
13
- import { createHeaderWithDefaults } from "../header-with-defaults/index.js";
14
- import { createFooterWithDefaults } from "../footer-with-defaults/index.js";
11
+ import { resolveThemePackSsrSlug } from "../theme/theme-pack-provider.js";
15
12
  import { createDocBodyEnd } from "../doc-body-end/index.js";
16
- import { createDocPager } from "../doc-pager/index.js";
17
13
  import { deriveComposeMetaTitle } from "../chrome/derive.js";
14
+ import { derivePrimaryChromeSlots } from "../chrome/primary-slots.js";
18
15
  import { assertChromeContext } from "../chrome/assert-chrome-context.js";
19
16
  function createDocPageShell(ctx) {
20
17
  assertChromeContext(ctx, "createDocPageShell");
21
18
  const settings = ctx.settings;
22
19
  const composeMetaTitle = deriveComposeMetaTitle(ctx);
23
20
  const HeadWithDefaults = createHeadWithDefaults(ctx);
24
- const SidebarWithDefaults = createSidebarWithDefaults(ctx);
25
- const HeaderWithDefaults = createHeaderWithDefaults(ctx);
26
- const FooterWithDefaults = createFooterWithDefaults(ctx);
21
+ const {
22
+ Header: HeaderWithDefaults,
23
+ Footer: FooterWithDefaults,
24
+ Sidebar: SidebarWithDefaults,
25
+ Toc,
26
+ Breadcrumb,
27
+ DocPager
28
+ } = derivePrimaryChromeSlots(ctx);
29
+ const customTocIsPresent = ctx.hostBindings.Toc !== void 0;
27
30
  const sidebarToggleEnabled = Boolean(
28
31
  ctx.settings.sidebarToggle
29
32
  );
@@ -34,7 +37,10 @@ function createDocPageShell(ctx) {
34
37
  sidebarToggle: sidebarToggleEnabled
35
38
  });
36
39
  const DocBodyEnd = createDocBodyEnd(ctx);
37
- const DocPager = createDocPager(ctx);
40
+ const dataThemePack = resolveThemePackSsrSlug(
41
+ ctx.themePackRegistry,
42
+ ctx.settings
43
+ );
38
44
  function DocPageShell(props) {
39
45
  const {
40
46
  kind,
@@ -66,7 +72,7 @@ function createDocPageShell(ctx) {
66
72
  } = props;
67
73
  const tocTitle = getTocTitle(locale);
68
74
  const shouldRenderToc = !hideToc && headings.length > 0;
69
- const tocOverride = shouldRenderToc ? Island({
75
+ const tocOverride = shouldRenderToc ? customTocIsPresent ? /* @__PURE__ */ jsx(Toc, { headings, title: tocTitle }) : Island({
70
76
  when: "load",
71
77
  children: /* @__PURE__ */ jsx(Toc, { headings, title: tocTitle })
72
78
  }) : void 0;
@@ -84,6 +90,7 @@ function createDocPageShell(ctx) {
84
90
  /* @__PURE__ */ jsx(SidebarVisibilityPrepaint, { hideSidebar })
85
91
  ] }),
86
92
  lang: locale,
93
+ dataThemePack,
87
94
  noindex: settings.noindex,
88
95
  hideSidebar,
89
96
  hideToc,
@@ -128,7 +135,7 @@ function createDocPageShell(ctx) {
128
135
  /* @__PURE__ */ jsxs(Fragment, { children: [
129
136
  /* @__PURE__ */ jsx("h1", { class: "text-heading font-bold mb-vsp-xs", children: autoIndexLabel }),
130
137
  metainfoSlot,
131
- description && /* @__PURE__ */ jsx("p", { class: "mb-vsp-lg text-title text-muted", children: description }),
138
+ description && /* @__PURE__ */ jsx("p", { class: "mb-vsp-lg text-title text-muted", "data-doc-description": true, children: description }),
132
139
  /* @__PURE__ */ jsx(NavCardGrid, { children: autoIndexChildren ?? [] })
133
140
  ] })
134
141
  ) : (
@@ -5,7 +5,7 @@ function createDocPager(ctx) {
5
5
  assertChromeContext(ctx, "createDocPager");
6
6
  const t = ctx.t;
7
7
  function DocPager({ prev, next, locale }) {
8
- return /* @__PURE__ */ jsxs("nav", { class: "mt-vsp-2xl grid grid-cols-2 gap-hsp-xl", children: [
8
+ return /* @__PURE__ */ jsxs("nav", { class: "mt-vsp-2xl grid grid-cols-2 gap-hsp-xl", "data-doc-pager": true, children: [
9
9
  prev ? /* @__PURE__ */ jsxs(
10
10
  "a",
11
11
  {
@@ -63,7 +63,7 @@ export interface DocRouteEntriesContext {
63
63
  /** Filter top-level nav nodes by a categoryMatch value. */
64
64
  getNavSubtree: (tree: DocNavNode[], categoryMatch?: string) => DocNavNode[];
65
65
  /** Convert a content entry slug to a canonical route slug. */
66
- toRouteSlug: (id: string) => string;
66
+ toRouteSlug: (entrySlug: string) => string;
67
67
  /** Convert a canonical route slug to an optional-catchall params array. */
68
68
  toSlugParams: (slug: string) => string[];
69
69
  /** Extract headings from a raw MDX body (bound to settings depth/strategy). */
@@ -91,7 +91,7 @@ export interface DocRouteEntriesAPI {
91
91
  * import { createDocRouteEntries } from "@takazudo/zudo-doc/doc-route-entries";
92
92
  * import { buildNavTree, buildBreadcrumbs, collectAutoIndexNodes } from "@/utils/docs";
93
93
  * import { getNavSectionForSlug, getNavSubtree } from "@/utils/nav-scope";
94
- * import { toRouteSlug, toSlugParams } from "@/utils/slug";
94
+ * import { toRouteSlug, toSlugParams } from "@takazudo/zudo-doc/slug";
95
95
  * import { extractHeadings } from "./_extract-headings";
96
96
  *
97
97
  * export const { buildDocRouteEntries } = createDocRouteEntries(routeContext);
@@ -120,10 +120,10 @@ function DocLayoutWithDefaults(props) {
120
120
  footer: footerOverride ?? /* @__PURE__ */ jsx(Footer, {}),
121
121
  bodyEndComponents,
122
122
  bodyEndScripts: bodyEndScripts ?? // Default body-end scripts:
123
- // - CodeBlockEnhancer wraps every <pre class="syntect-*"> with
124
- // copy + word-wrap controls and emits an SR-announce live
125
- // region for clipboard feedback. Idempotent on pages with no
126
- // fenced code.
123
+ // - CodeBlockEnhancer wraps every highlighted <pre> (`.hi-root`)
124
+ // with copy + word-wrap controls and emits an SR-announce live
125
+ // region for clipboard feedback.
126
+ // Idempotent on pages with no fenced code.
127
127
  // - TabsInit activates the correct tab panel and wires click
128
128
  // handlers for <Tabs> components.
129
129
  // - MermaidInit lazily imports the mermaid library from
@@ -12,6 +12,14 @@ export interface DocLayoutHtmlAttrs {
12
12
  * Set per `<html>`-level color-scheme strategy.
13
13
  */
14
14
  dataTheme?: string;
15
+ /**
16
+ * Optional `data-theme-pack` attribute value — the CONFIGURED theme-pack
17
+ * slug (ADR `docs/adr/theme-packs.md`, Decision 3 DOM contract, #2822).
18
+ * Unlike `data-theme` (user-preference-only, client-set) the configured
19
+ * pack is build-static, so SSR can and must emit it for the no-JS path;
20
+ * the pre-paint bootstrap re-asserts the user's persisted slug on load.
21
+ */
22
+ dataThemePack?: string;
15
23
  /**
16
24
  * Optional inline `style` value to apply to `<html>` — in practice this
17
25
  * is `color-scheme: light` / `color-scheme: dark`.
@@ -8,6 +8,7 @@ function DocLayout(props) {
8
8
  noindex,
9
9
  lang = "en",
10
10
  dataTheme,
11
+ dataThemePack,
11
12
  htmlStyle,
12
13
  head,
13
14
  header,
@@ -35,6 +36,9 @@ function DocLayout(props) {
35
36
  if (dataTheme !== void 0) {
36
37
  htmlAttrs["data-theme"] = dataTheme;
37
38
  }
39
+ if (dataThemePack !== void 0) {
40
+ htmlAttrs["data-theme-pack"] = dataThemePack;
41
+ }
38
42
  if (htmlStyle !== void 0) {
39
43
  htmlAttrs.style = htmlStyle;
40
44
  }
@@ -46,7 +50,12 @@ function DocLayout(props) {
46
50
  description !== void 0 && /* @__PURE__ */ jsx("meta", { name: "description", content: description }),
47
51
  noindex && /* @__PURE__ */ jsx("meta", { name: "robots", content: "noindex, nofollow" }),
48
52
  enableClientRouter !== false ? ClientRouter({
49
- preserveHtmlAttrs: ["data-sidebar-hidden", "data-theme", "style"]
53
+ preserveHtmlAttrs: [
54
+ "data-sidebar-hidden",
55
+ "data-theme",
56
+ "data-theme-pack",
57
+ "style"
58
+ ]
50
59
  }) : null,
51
60
  head
52
61
  ] }),
@@ -3,11 +3,7 @@ function buildTagsSchema(opts) {
3
3
  const vocabulary = opts?.tagVocabulary ?? [];
4
4
  const vocabularyActive = vocabulary.length > 0 && opts?.tagGovernance === "strict";
5
5
  if (!vocabularyActive) return z.array(z.string()).optional();
6
- const allowed = /* @__PURE__ */ new Set();
7
- for (const entry of vocabulary) {
8
- allowed.add(entry.id);
9
- for (const alias of entry.aliases ?? []) allowed.add(alias);
10
- }
6
+ const allowed = new Set(vocabulary.map((entry) => entry.id));
11
7
  const allowedList = [...allowed];
12
8
  if (allowedList.length === 0) return z.array(z.string()).optional();
13
9
  const [first, ...rest] = allowedList;
@@ -1,8 +1,24 @@
1
+ export type PrimaryChromeSlot = "Header" | "Footer" | "Sidebar" | "Toc" | "Breadcrumb" | "DocPager";
2
+ export type EjectableClassification = {
3
+ kind: "primary";
4
+ /** The matching primary replacement key in `ChromeHostBindings`. */
5
+ slot: PrimaryChromeSlot;
6
+ } | {
7
+ kind: "nested";
8
+ /** Exact supported binding or owner-replacement instructions. */
9
+ remediation: string;
10
+ } | {
11
+ kind: "content";
12
+ /** Exact project-owned MDX registration instructions. */
13
+ remediation: string;
14
+ };
1
15
  export interface EjectableEntry {
2
16
  /** Package subpath, e.g. `@takazudo/zudo-doc/header` */
3
17
  packageSubpath: string;
4
18
  /** Local destination dir, project-relative POSIX (no trailing slash) */
5
19
  localDir: string;
20
+ /** Static rendering/binding class. Never infer this from host call sites. */
21
+ classification: EjectableClassification;
6
22
  }
7
23
  export declare const EJECTABLE: Record<string, EjectableEntry>;
8
24
  export interface ZudoDocJson {
@@ -4,77 +4,171 @@ import pc from "picocolors";
4
4
  const EJECTABLE = {
5
5
  header: {
6
6
  packageSubpath: "@takazudo/zudo-doc/header",
7
- localDir: "src/components/zudo-doc/header"
7
+ localDir: "src/components/zudo-doc/header",
8
+ classification: { kind: "primary", slot: "Header" }
8
9
  },
9
10
  footer: {
10
11
  packageSubpath: "@takazudo/zudo-doc/footer",
11
- localDir: "src/components/zudo-doc/footer"
12
+ localDir: "src/components/zudo-doc/footer",
13
+ classification: { kind: "primary", slot: "Footer" }
12
14
  },
13
15
  breadcrumb: {
14
16
  packageSubpath: "@takazudo/zudo-doc/breadcrumb",
15
- localDir: "src/components/zudo-doc/breadcrumb"
17
+ localDir: "src/components/zudo-doc/breadcrumb",
18
+ classification: { kind: "primary", slot: "Breadcrumb" }
16
19
  },
17
20
  toc: {
18
21
  packageSubpath: "@takazudo/zudo-doc/toc",
19
- localDir: "src/components/zudo-doc/toc"
22
+ localDir: "src/components/zudo-doc/toc",
23
+ classification: { kind: "primary", slot: "Toc" }
20
24
  },
21
25
  sidebar: {
22
26
  packageSubpath: "@takazudo/zudo-doc/sidebar",
23
- localDir: "src/components/zudo-doc/sidebar"
27
+ localDir: "src/components/zudo-doc/sidebar",
28
+ classification: { kind: "primary", slot: "Sidebar" }
24
29
  },
25
30
  "theme-toggle": {
26
31
  packageSubpath: "@takazudo/zudo-doc/theme-toggle",
27
- localDir: "src/components/zudo-doc/theme-toggle"
32
+ localDir: "src/components/zudo-doc/theme-toggle",
33
+ classification: {
34
+ kind: "nested",
35
+ remediation: 'Register the local ThemeToggle under a new name in chromeBindings.headerRightComponents, then use that same name in settings.headerRightItems. The built-in name "theme-toggle" is reserved.'
36
+ }
28
37
  },
29
38
  "page-loading": {
30
39
  packageSubpath: "@takazudo/zudo-doc/page-loading",
31
- localDir: "src/components/zudo-doc/page-loading"
40
+ localDir: "src/components/zudo-doc/page-loading",
41
+ classification: {
42
+ kind: "nested",
43
+ remediation: "Replace chromeBindings.BodyEndIslands with a project-owned composition that imports the local PageLoadingOverlay."
44
+ }
32
45
  },
33
46
  "tab-item": {
34
47
  packageSubpath: "@takazudo/zudo-doc/tab-item",
35
- localDir: "src/components/zudo-doc/tab-item"
48
+ localDir: "src/components/zudo-doc/tab-item",
49
+ classification: {
50
+ kind: "content",
51
+ remediation: "Set chromeBindings.mdxExtras.TabItem to the local TabItem."
52
+ }
36
53
  },
37
54
  "doc-pager": {
38
55
  packageSubpath: "@takazudo/zudo-doc/doc-pager",
39
- localDir: "src/components/zudo-doc/doc-pager"
56
+ localDir: "src/components/zudo-doc/doc-pager",
57
+ classification: { kind: "primary", slot: "DocPager" }
40
58
  },
41
59
  "content-admonition": {
42
60
  packageSubpath: "@takazudo/zudo-doc/content-admonition",
43
- localDir: "src/components/zudo-doc/content-admonition"
61
+ localDir: "src/components/zudo-doc/content-admonition",
62
+ classification: {
63
+ kind: "content",
64
+ remediation: "Create the local admonition renderers with makeAdmonition, then set the matching chromeBindings.mdxExtras keys (Note, Tip, Info, Warning, and Danger)."
65
+ }
44
66
  },
45
67
  "code-group": {
46
68
  packageSubpath: "@takazudo/zudo-doc/code-group",
47
- localDir: "src/components/zudo-doc/code-group"
69
+ localDir: "src/components/zudo-doc/code-group",
70
+ classification: {
71
+ kind: "content",
72
+ remediation: "Set chromeBindings.mdxExtras.CodeGroup to the local CodeGroup."
73
+ }
48
74
  },
49
75
  details: {
50
76
  packageSubpath: "@takazudo/zudo-doc/details",
51
- localDir: "src/components/zudo-doc/details"
77
+ localDir: "src/components/zudo-doc/details",
78
+ classification: {
79
+ kind: "content",
80
+ remediation: "Set chromeBindings.mdxExtras.Details to the local Details component."
81
+ }
52
82
  },
53
83
  "sidebar-tree-island": {
54
84
  packageSubpath: "@takazudo/zudo-doc/sidebar-tree-island",
55
- localDir: "src/components/zudo-doc/sidebar-tree-island"
85
+ localDir: "src/components/zudo-doc/sidebar-tree-island",
86
+ classification: {
87
+ kind: "nested",
88
+ remediation: "Replace the chromeBindings.Sidebar primary component with a project-owned sidebar composition that imports the local SidebarTree island."
89
+ }
56
90
  },
57
91
  "sidebar-toggle-island": {
58
92
  packageSubpath: "@takazudo/zudo-doc/sidebar-toggle-island",
59
- localDir: "src/components/zudo-doc/sidebar-toggle-island"
93
+ localDir: "src/components/zudo-doc/sidebar-toggle-island",
94
+ classification: {
95
+ kind: "nested",
96
+ remediation: "Replace the chromeBindings.Header primary component with a project-owned header composition that imports the local SidebarToggle island."
97
+ }
60
98
  },
61
99
  "desktop-sidebar-toggle-island": {
62
100
  packageSubpath: "@takazudo/zudo-doc/desktop-sidebar-toggle-island",
63
- localDir: "src/components/zudo-doc/desktop-sidebar-toggle-island"
101
+ localDir: "src/components/zudo-doc/desktop-sidebar-toggle-island",
102
+ classification: {
103
+ kind: "nested",
104
+ remediation: "Disable settings.sidebarToggle, then replace the chromeBindings.Sidebar primary component with a project-owned composition that imports the local DesktopSidebarToggle island."
105
+ }
64
106
  },
65
107
  "image-enlarge": {
66
108
  packageSubpath: "@takazudo/zudo-doc/image-enlarge",
67
- localDir: "src/components/zudo-doc/image-enlarge"
109
+ localDir: "src/components/zudo-doc/image-enlarge",
110
+ classification: {
111
+ kind: "nested",
112
+ remediation: "Replace chromeBindings.BodyEndIslands with a project-owned composition that imports the local ImageEnlarge island."
113
+ }
68
114
  },
69
115
  "doc-history": {
70
116
  packageSubpath: "@takazudo/zudo-doc/doc-history",
71
- localDir: "src/components/zudo-doc/doc-history"
117
+ localDir: "src/components/zudo-doc/doc-history",
118
+ classification: {
119
+ kind: "nested",
120
+ remediation: "Set chromeBindings.DocHistory to the local DocHistory component."
121
+ }
72
122
  },
73
123
  "site-tree-nav-island": {
74
124
  packageSubpath: "@takazudo/zudo-doc/site-tree-nav-island",
75
- localDir: "src/components/zudo-doc/site-tree-nav-island"
125
+ localDir: "src/components/zudo-doc/site-tree-nav-island",
126
+ classification: {
127
+ kind: "nested",
128
+ remediation: "Set chromeBindings.mdxExtras.SiteTreeNav to a project-owned wrapper that imports the local SiteTreeNav island. A project-owned home route must also use that wrapper if its home grid should change."
129
+ }
76
130
  }
77
131
  };
132
+ const CUSTOMIZING_GUIDE_URL = "https://zudo-doc.takazudomodular.com/docs/reference/customizing/";
133
+ const MDX_EXTRAS_GUIDE_URL = "https://zudo-doc.takazudomodular.com/docs/guides/custom-components/#global-registration-mdxextras";
134
+ function assertNeverClassification(value) {
135
+ throw new Error(`Unknown ejectable classification: ${JSON.stringify(value)}`);
136
+ }
137
+ function chromeRemediation(classification) {
138
+ switch (classification.kind) {
139
+ case "primary":
140
+ return `Export the local component as chromeBindings.${classification.slot} (the ${classification.slot} primary replacement slot) from your chromeBindingsModule.`;
141
+ case "nested":
142
+ return classification.remediation;
143
+ case "content":
144
+ throw new Error("Content-layer ejectables do not use chrome remediation.");
145
+ default:
146
+ return assertNeverClassification(classification);
147
+ }
148
+ }
149
+ function printNoCallSiteGuidance(entry, component) {
150
+ const classification = entry.classification;
151
+ if (classification.kind === "content") {
152
+ console.log(
153
+ pc.dim(
154
+ ` No host call sites found for ${entry.packageSubpath}.
155
+ This is expected for a content-layer copy. ${classification.remediation}
156
+ Guide: ${MDX_EXTRAS_GUIDE_URL}`
157
+ )
158
+ );
159
+ return false;
160
+ }
161
+ console.warn(
162
+ pc.bold(pc.red(`
163
+ WARNING: the ejected ${component} copy is not wired into your site.`)) + `
164
+ This component is rendered by package chrome. The source was copied to ${entry.localDir}, but no host import referenced ${entry.packageSubpath}.
165
+ ` + pc.bold("Editing the copy will not change your site until you bind it.") + `
166
+ Remediation: ${chromeRemediation(classification)}
167
+ Customization guide: ${CUSTOMIZING_GUIDE_URL}
168
+ `
169
+ );
170
+ return true;
171
+ }
78
172
  async function rewireImports(dir) {
79
173
  const re = /(from\s+)(["'])\.\.\/([\w-]+)\/[^"']+\2/g;
80
174
  const entries = await fs.readdir(dir, { withFileTypes: true });
@@ -93,6 +187,7 @@ async function rewireImports(dir) {
93
187
  }
94
188
  async function rewireHostCallSites(projectRoot, component, localDir) {
95
189
  const packageSubpath = EJECTABLE[component].packageSubpath;
190
+ const destinationDir = path.resolve(projectRoot, localDir);
96
191
  const escapedSubpath = packageSubpath.replace(/[/\\^$*+?.()|[\]{}]/g, "\\$&");
97
192
  const re = new RegExp(`(from\\s+)(["'])${escapedSubpath}\\2`, "g");
98
193
  const searchDirs = [
@@ -106,6 +201,10 @@ async function rewireHostCallSites(projectRoot, component, localDir) {
106
201
  const entries = await fs.readdir(dir, { withFileTypes: true });
107
202
  for (const entry of entries) {
108
203
  const abs = path.join(dir, entry.name);
204
+ const resolvedAbs = path.resolve(abs);
205
+ if (resolvedAbs === destinationDir || resolvedAbs.startsWith(`${destinationDir}${path.sep}`)) {
206
+ continue;
207
+ }
109
208
  if (entry.isDirectory()) {
110
209
  await rewriteDir(abs, path.join(relFromProject, entry.name));
111
210
  continue;
@@ -114,8 +213,7 @@ async function rewireHostCallSites(projectRoot, component, localDir) {
114
213
  const original = await fs.readFile(abs, "utf8");
115
214
  if (!original.includes(packageSubpath)) continue;
116
215
  const fileDir = path.join(projectRoot, relFromProject);
117
- const destAbs = path.join(projectRoot, localDir);
118
- let rel = path.relative(fileDir, destAbs).split(path.sep).join("/");
216
+ let rel = path.relative(fileDir, destinationDir).split(path.sep).join("/");
119
217
  if (!rel.startsWith(".")) rel = `./${rel}`;
120
218
  const rewritten = original.replace(re, (_, from, quote) => {
121
219
  return `${from}${quote}${rel}${quote}`;
@@ -219,27 +317,23 @@ Bump @takazudo/zudo-doc to a version that includes the eject/ tree and retry.`
219
317
  await rewireImports(destAbs);
220
318
  console.log(pc.dim(` Rewired cross-component imports in ${localDir}`));
221
319
  const rewroteCount = await rewireHostCallSites(cwd, component, localDir);
320
+ let unwiredChrome = false;
222
321
  if (rewroteCount > 0) {
223
322
  console.log(
224
323
  pc.dim(` Rewrote ${rewroteCount} host file(s) to import from ${localDir}`)
225
324
  );
226
325
  } else {
227
- console.log(
228
- pc.dim(
229
- ` No host call sites found for ${entry.packageSubpath}.
230
- Update your imports manually: change the \`"${entry.packageSubpath}"\`
231
- specifier to a local one, e.g. \`"@/${localDir}/index.js"\` or a relative path.`
232
- )
233
- );
326
+ unwiredChrome = printNoCallSiteGuidance(entry, component);
234
327
  }
235
328
  provenance.packageVersion = installedVersion;
236
329
  provenance.ejected[component] = localDir;
237
330
  await fs.writeJson(provenancePath, provenance, { spaces: 2 });
238
331
  console.log(pc.green(`Updated .zudo-doc.json`));
332
+ const status = unwiredChrome ? `${pc.yellow("\u26A0")} Copied ${component}, but it is not wired into the rendered site` : `${pc.green("\u2713")} Ejected ${component}`;
239
333
  console.log(
240
334
  pc.bold(
241
335
  `
242
- ${pc.green("\u2713")} Ejected ${component} from @takazudo/zudo-doc@${installedVersion}
336
+ ${status} from @takazudo/zudo-doc@${installedVersion}
243
337
  Source: node_modules/@takazudo/zudo-doc/eject/${component}/
244
338
  Destination: ${localDir}/
245
339
  Provenance: .zudo-doc.json
@@ -1,5 +1,3 @@
1
- /** Heading-ID (anchor) strategy. Mirrors `settings.headingIdStrategy`. */
2
- export type HeadingIdStrategy = "flat" | "hierarchical";
3
1
  /**
4
2
  * Slugify one heading's text — a byte-faithful TS port of zfb's Rust `slugify`
5
3
  * (`crates/zfb-content/src/plugins/heading_links.rs`). Using the exact upstream
@@ -20,9 +18,9 @@ export interface HeadingItem {
20
18
  /**
21
19
  * Extract TOC headings from a raw MDX/markdown body.
22
20
  *
23
- * Uses the same slugging algorithm as zfb's `HeadingLinks` plugin (selected by
24
- * `opts.strategy`) so the `href="#slug"` values in the TOC match the rendered
25
- * heading element IDs. Allocates over ALL matched h2–h6 (keeping the dedup
21
+ * Uses the same hierarchical slugging algorithm as zfb's `HeadingLinks` plugin
22
+ * so the `href="#slug"` values in the TOC match the rendered heading element
23
+ * IDs. Allocates over ALL matched h2–h6 (keeping the dedup
26
24
  * counter and hierarchical ancestor stack in sync with the renderer) but only
27
25
  * pushes depth 2–4 items into the result (configurable via opts). h1 is not
28
26
  * matched — the renderer does not assign ids to h1.
@@ -32,12 +30,11 @@ export interface HeadingItem {
32
30
  * This keeps the package import-graph free of project singletons.
33
31
  *
34
32
  * @param body - Raw markdown body string (frontmatter already stripped).
35
- * @param opts - Settings for heading depth window and ID strategy. Production
36
- * call sites should pass values from the project's `settings` object.
33
+ * @param opts - Settings for the heading depth window. Production call sites
34
+ * should pass values from the project's `settings` object.
37
35
  * @returns Array of `{ depth, slug, text }` items in document order.
38
36
  */
39
37
  export declare function extractHeadings(body: string, opts?: {
40
38
  tocMinDepth?: number;
41
39
  tocMaxDepth?: number;
42
- strategy?: HeadingIdStrategy;
43
40
  }): HeadingItem[];
@@ -21,19 +21,12 @@ function slugify(input) {
21
21
  return out;
22
22
  }
23
23
  class SlugAllocator {
24
- strategy;
25
24
  /** Dedup counter, keyed by the (possibly ancestor-prefixed) slug path. */
26
25
  seen = /* @__PURE__ */ new Map();
27
- /** Hierarchical ancestor stack of `{ depth, final id }` (unused when flat). */
26
+ /** Hierarchical ancestor stack of `{ depth, final id }`. */
28
27
  stack = [];
29
- constructor(strategy) {
30
- this.strategy = strategy;
31
- }
32
28
  allocate(depth, text) {
33
29
  const base = slugify(text);
34
- if (this.strategy === "flat") {
35
- return this.nextSlug(base);
36
- }
37
30
  if (base === "") return "";
38
31
  for (let top = this.stack.at(-1); top !== void 0 && top.depth >= depth; top = this.stack.at(-1)) {
39
32
  this.stack.pop();
@@ -74,7 +67,7 @@ function extractHeadings(body, opts) {
74
67
  opts?.tocMinDepth ?? 2,
75
68
  opts?.tocMaxDepth ?? 4
76
69
  );
77
- const allocator = new SlugAllocator(opts?.strategy ?? "flat");
70
+ const allocator = new SlugAllocator();
78
71
  const headings = [];
79
72
  let codeFenceOpener = null;
80
73
  for (const line of body.split("\n")) {