@takazudo/zudo-doc 3.2.0 → 4.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (439) hide show
  1. package/CHANGELOG.md +61 -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 -4
  14. package/dist/chrome/derive.js +64 -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 +227 -0
  20. package/dist/chrome-bindings.js +6 -0
  21. package/dist/code-syntax/code-block-enhancer-script.d.ts +4 -0
  22. package/dist/code-syntax/code-block-enhancer-script.js +7 -4
  23. package/dist/code-syntax/code-block-enhancer.d.ts +2 -2
  24. package/dist/code-syntax/code-block-enhancer.js +1 -3
  25. package/dist/code-syntax/index.d.ts +5 -5
  26. package/dist/code-syntax/index.js +4 -13
  27. package/dist/code-syntax/mermaid-init-script.d.ts +1 -22
  28. package/dist/code-syntax/mermaid-init-script.js +0 -2
  29. package/dist/code-syntax/mermaid-init.d.ts +0 -1
  30. package/dist/code-syntax/mermaid-init.js +3 -4
  31. package/dist/code-syntax/tabs-init.d.ts +0 -1
  32. package/dist/code-syntax/tabs-init.js +1 -3
  33. package/dist/code-syntax/tabs.d.ts +0 -1
  34. package/dist/code-syntax/tabs.js +1 -3
  35. package/dist/color-scheme-utils.d.ts +72 -4
  36. package/dist/color-scheme-utils.js +137 -0
  37. package/dist/color-schemes-defaults/index.d.ts +23 -0
  38. package/dist/color-schemes-defaults/index.js +134 -0
  39. package/dist/config.d.ts +459 -0
  40. package/dist/config.js +125 -0
  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 +82 -27
  47. package/dist/design-token-panel-bootstrap.js +110 -21
  48. package/dist/design-token-panel-config/index.d.ts +49 -0
  49. package/dist/design-token-panel-config/index.js +211 -0
  50. package/dist/design-token-panel-config/manifest.d.ts +46 -0
  51. package/dist/design-token-panel-config/manifest.js +105 -0
  52. package/dist/directive-vocabulary-defaults/index.d.ts +16 -0
  53. package/dist/directive-vocabulary-defaults/index.js +12 -0
  54. package/dist/doc-body-end-islands/design-token-panel-island.d.ts +15 -0
  55. package/dist/doc-body-end-islands/design-token-panel-island.js +31 -0
  56. package/dist/doc-body-end-islands/index.d.ts +52 -7
  57. package/dist/doc-body-end-islands/index.js +19 -0
  58. package/dist/doc-body-end-islands/theme-pack-switcher-island.d.ts +37 -0
  59. package/dist/doc-body-end-islands/theme-pack-switcher-island.js +18 -0
  60. package/dist/doc-content-header/index.js +1 -1
  61. package/dist/doc-history-area/index.d.ts +10 -4
  62. package/dist/doc-history-area/index.js +3 -2
  63. package/dist/doc-metainfo-area/index.d.ts +1 -0
  64. package/dist/doc-page-props/index.d.ts +7 -23
  65. package/dist/doc-page-renderer/index.d.ts +1 -0
  66. package/dist/doc-page-renderer/index.js +1 -0
  67. package/dist/doc-page-shell/index.js +19 -12
  68. package/dist/doc-pager/index.js +1 -1
  69. package/dist/doc-route-entries/index.d.ts +2 -2
  70. package/dist/doclayout/doc-layout-with-defaults.js +4 -4
  71. package/dist/doclayout/doc-layout.d.ts +8 -0
  72. package/dist/doclayout/doc-layout.js +10 -1
  73. package/dist/docs-schema/index.d.ts +67 -0
  74. package/dist/docs-schema/index.js +43 -0
  75. package/dist/eject/index.d.ts +16 -0
  76. package/dist/eject/index.js +122 -28
  77. package/dist/extract-headings/index.d.ts +5 -8
  78. package/dist/extract-headings/index.js +2 -9
  79. package/dist/factory-context/index.d.ts +56 -4
  80. package/dist/features.css +65 -43
  81. package/dist/find-in-page/find-bar.d.ts +9 -0
  82. package/dist/find-in-page/find-bar.js +114 -0
  83. package/dist/find-in-page/find-in-page.d.ts +17 -0
  84. package/dist/find-in-page/find-in-page.js +131 -0
  85. package/dist/find-in-page/index.d.ts +11 -0
  86. package/dist/find-in-page/index.js +49 -0
  87. package/dist/footer/footer.js +1 -0
  88. package/dist/frontmatter-preview-defaults/index.d.ts +16 -0
  89. package/dist/frontmatter-preview-defaults/index.js +25 -0
  90. package/dist/head-with-defaults/index.d.ts +2 -0
  91. package/dist/head-with-defaults/index.js +16 -0
  92. package/dist/header/header.d.ts +10 -5
  93. package/dist/header/header.js +45 -5
  94. package/dist/header/index.d.ts +1 -1
  95. package/dist/header/types.d.ts +30 -1
  96. package/dist/header-with-defaults/index.js +1 -0
  97. package/dist/home-page/index.d.ts +2 -0
  98. package/dist/home-page/index.js +11 -5
  99. package/dist/home-page/prepare-home-data.js +1 -1
  100. package/dist/i18n-defaults/index.d.ts +22 -0
  101. package/dist/i18n-defaults/index.js +167 -0
  102. package/dist/locale-merge/index.d.ts +9 -14
  103. package/dist/locale-merge/index.js +6 -4
  104. package/dist/mdx-components/index.js +4 -4
  105. package/dist/plugins/claude-resources.d.ts +1 -0
  106. package/dist/plugins/claude-resources.js +4 -2
  107. package/dist/plugins/doc-history.js +1 -1
  108. package/dist/{integrations → plugins/internal}/claude-resources/index.d.ts +1 -16
  109. package/dist/{integrations → plugins/internal}/claude-resources/index.js +0 -9
  110. package/dist/{integrations → plugins/internal}/doc-history/index.d.ts +0 -17
  111. package/dist/{integrations → plugins/internal}/doc-history/index.js +0 -4
  112. package/dist/{integrations → plugins/internal}/doc-history/pre-build.d.ts +2 -4
  113. package/dist/plugins/internal/llms-txt/index.d.ts +7 -0
  114. package/dist/{integrations → plugins/internal}/llms-txt/load.d.ts +1 -1
  115. package/dist/{integrations → plugins/internal}/llms-txt/load.js +2 -2
  116. package/dist/{integrations → plugins/internal}/llms-txt/strip.d.ts +2 -3
  117. package/dist/{integrations → plugins/internal}/llms-txt/strip.js +1 -1
  118. package/dist/{integrations → plugins/internal}/llms-txt/types.d.ts +13 -22
  119. package/dist/{integrations → plugins/internal}/search-index/collect.js +1 -1
  120. package/dist/plugins/internal/theme-packs/copy.d.ts +32 -0
  121. package/dist/plugins/internal/theme-packs/copy.js +45 -0
  122. package/dist/plugins/internal/theme-packs/dev-middleware.d.ts +22 -0
  123. package/dist/plugins/internal/theme-packs/dev-middleware.js +80 -0
  124. package/dist/plugins/internal/theme-packs/index.d.ts +6 -0
  125. package/dist/plugins/internal/theme-packs/index.js +9 -0
  126. package/dist/plugins/internal/theme-packs/resolve.d.ts +17 -0
  127. package/dist/plugins/internal/theme-packs/resolve.js +17 -0
  128. package/dist/plugins/internal/theme-packs/types.d.ts +22 -0
  129. package/dist/plugins/internal/theme-packs/types.js +0 -0
  130. package/dist/plugins/llms-txt.js +1 -1
  131. package/dist/plugins/routes.js +55 -21
  132. package/dist/plugins/search-index.js +1 -1
  133. package/dist/plugins/theme-packs.d.ts +3 -0
  134. package/dist/plugins/theme-packs.js +40 -0
  135. package/dist/preset.d.ts +28 -14
  136. package/dist/preset.js +24 -9
  137. package/dist/route-context/index.js +4 -6
  138. package/dist/route-enumerators/index.d.ts +6 -18
  139. package/dist/route-enumerators/index.js +8 -6
  140. package/dist/routes/404.js +3 -1
  141. package/dist/routes/_chrome.js +3 -2
  142. package/dist/routes/_context.d.ts +7 -3
  143. package/dist/routes/_context.js +2 -0
  144. package/dist/routes/_docs-helpers.js +9 -21
  145. package/dist/safelist.css +1 -1
  146. package/dist/settings.d.ts +64 -12
  147. package/dist/sidebar-tree/build-tree.d.ts +3 -4
  148. package/dist/sidebar-tree/build-tree.js +4 -3
  149. package/dist/sidebar-tree/index.d.ts +2 -2
  150. package/dist/sidebar-tree/types.d.ts +6 -17
  151. package/dist/site-tree-nav-island/index.d.ts +3 -1
  152. package/dist/site-tree-nav-island/index.js +17 -5
  153. package/dist/site-tree-nav-island/state.d.ts +4 -0
  154. package/dist/site-tree-nav-island/state.js +10 -0
  155. package/dist/tag-helpers/index.d.ts +6 -13
  156. package/dist/tag-helpers/index.js +5 -23
  157. package/dist/tag-pages/index.d.ts +8 -21
  158. package/dist/tag-pages/index.js +14 -10
  159. package/dist/tags-audit.d.ts +16 -44
  160. package/dist/tags-audit.js +9 -172
  161. package/dist/theme/color-scheme-provider.d.ts +2 -3
  162. package/dist/theme/color-scheme-provider.js +2 -10
  163. package/dist/theme/index.d.ts +1 -4
  164. package/dist/theme/index.js +2 -30
  165. package/dist/theme/theme-pack-provider.d.ts +42 -0
  166. package/dist/theme/theme-pack-provider.js +75 -0
  167. package/dist/theme-cli/apply.d.ts +16 -0
  168. package/dist/theme-cli/apply.js +61 -0
  169. package/dist/theme-cli/config-io.d.ts +15 -0
  170. package/dist/theme-cli/config-io.js +51 -0
  171. package/dist/theme-cli/config-rewriter.d.ts +21 -0
  172. package/dist/theme-cli/config-rewriter.js +141 -0
  173. package/dist/theme-cli/config-scanner.d.ts +63 -0
  174. package/dist/theme-cli/config-scanner.js +288 -0
  175. package/dist/theme-cli/index.d.ts +7 -0
  176. package/dist/theme-cli/index.js +38 -0
  177. package/dist/theme-cli/list.d.ts +27 -0
  178. package/dist/theme-cli/list.js +64 -0
  179. package/dist/theme-cli/provenance.d.ts +17 -0
  180. package/dist/theme-cli/provenance.js +35 -0
  181. package/dist/theme-cli/registry.d.ts +14 -0
  182. package/dist/theme-cli/registry.js +13 -0
  183. package/dist/theme-pack-dialog/dialog-state.d.ts +25 -0
  184. package/dist/theme-pack-dialog/dialog-state.js +40 -0
  185. package/dist/theme-pack-dialog/index.d.ts +5 -0
  186. package/dist/theme-pack-dialog/index.js +152 -0
  187. package/dist/theme-pack-dialog/theme-pack-card.d.ts +25 -0
  188. package/dist/theme-pack-dialog/theme-pack-card.js +72 -0
  189. package/dist/theme-pack-switcher/index.d.ts +49 -0
  190. package/dist/theme-pack-switcher/index.js +205 -0
  191. package/dist/theme-pack-switcher/switcher-state.d.ts +56 -0
  192. package/dist/theme-pack-switcher/switcher-state.js +43 -0
  193. package/dist/theme-pack-switcher/theme-pack-sync.d.ts +85 -0
  194. package/dist/theme-pack-switcher/theme-pack-sync.js +121 -0
  195. package/dist/theme-packs/beacon/fonts/AtkinsonHyperlegible-400-latin.woff2 +0 -0
  196. package/dist/theme-packs/beacon/fonts/AtkinsonHyperlegible-700-latin.woff2 +0 -0
  197. package/dist/theme-packs/beacon/fonts/AtkinsonHyperlegible-italic-400-latin.woff2 +0 -0
  198. package/dist/theme-packs/beacon/fonts/AtkinsonHyperlegible-italic-700-latin.woff2 +0 -0
  199. package/dist/theme-packs/beacon/fonts/AtkinsonHyperlegibleMono-italic-latin.woff2 +0 -0
  200. package/dist/theme-packs/beacon/fonts/AtkinsonHyperlegibleMono-latin.woff2 +0 -0
  201. package/dist/theme-packs/beacon/fonts/OFL.txt +94 -0
  202. package/dist/theme-packs/beacon/meta.json +37 -0
  203. package/dist/theme-packs/beacon/pack.css +442 -0
  204. package/dist/theme-packs/broadsheet/fonts/CourierPrime-400-latin.woff2 +0 -0
  205. package/dist/theme-packs/broadsheet/fonts/CourierPrime-700-latin.woff2 +0 -0
  206. package/dist/theme-packs/broadsheet/fonts/OFL.txt +95 -0
  207. package/dist/theme-packs/broadsheet/fonts/PlayfairDisplay-italic-latin.woff2 +0 -0
  208. package/dist/theme-packs/broadsheet/fonts/PlayfairDisplay-latin.woff2 +0 -0
  209. package/dist/theme-packs/broadsheet/fonts/SourceSerif4-italic-latin.woff2 +0 -0
  210. package/dist/theme-packs/broadsheet/fonts/SourceSerif4-latin.woff2 +0 -0
  211. package/dist/theme-packs/broadsheet/meta.json +38 -0
  212. package/dist/theme-packs/broadsheet/pack.css +448 -0
  213. package/dist/theme-packs/brutalist/fonts/ArchivoBlack-latin.woff2 +0 -0
  214. package/dist/theme-packs/brutalist/fonts/IBMPlexMono-400-latin.woff2 +0 -0
  215. package/dist/theme-packs/brutalist/fonts/IBMPlexMono-500-latin.woff2 +0 -0
  216. package/dist/theme-packs/brutalist/fonts/IBMPlexMono-700-latin.woff2 +0 -0
  217. package/dist/theme-packs/brutalist/fonts/OFL.txt +95 -0
  218. package/dist/theme-packs/brutalist/fonts/SpaceGrotesk-latin.woff2 +0 -0
  219. package/dist/theme-packs/brutalist/meta.json +38 -0
  220. package/dist/theme-packs/brutalist/pack.css +546 -0
  221. package/dist/theme-packs/default/meta.json +37 -0
  222. package/dist/theme-packs/drift/fonts/IBMPlexMono-400-latin-ext.woff2 +0 -0
  223. package/dist/theme-packs/drift/fonts/IBMPlexMono-400-latin.woff2 +0 -0
  224. package/dist/theme-packs/drift/fonts/IBMPlexMono-500-latin-ext.woff2 +0 -0
  225. package/dist/theme-packs/drift/fonts/IBMPlexMono-500-latin.woff2 +0 -0
  226. package/dist/theme-packs/drift/fonts/IBMPlexSans-italic-latin.woff2 +0 -0
  227. package/dist/theme-packs/drift/fonts/IBMPlexSans-latin-ext.woff2 +0 -0
  228. package/dist/theme-packs/drift/fonts/IBMPlexSans-latin.woff2 +0 -0
  229. package/dist/theme-packs/drift/fonts/OFL.txt +93 -0
  230. package/dist/theme-packs/drift/meta.json +37 -0
  231. package/dist/theme-packs/drift/pack.css +478 -0
  232. package/dist/theme-packs/fjord/fonts/Inter-latin-ext.woff2 +0 -0
  233. package/dist/theme-packs/fjord/fonts/Inter-latin.woff2 +0 -0
  234. package/dist/theme-packs/fjord/fonts/JetBrainsMono-latin-ext.woff2 +0 -0
  235. package/dist/theme-packs/fjord/fonts/JetBrainsMono-latin.woff2 +0 -0
  236. package/dist/theme-packs/fjord/fonts/OFL.txt +94 -0
  237. package/dist/theme-packs/fjord/meta.json +37 -0
  238. package/dist/theme-packs/fjord/pack.css +375 -0
  239. package/dist/theme-packs/foundry/fonts/Inter-latin-ext.woff2 +0 -0
  240. package/dist/theme-packs/foundry/fonts/Inter-latin.woff2 +0 -0
  241. package/dist/theme-packs/foundry/fonts/OFL.txt +93 -0
  242. package/dist/theme-packs/foundry/meta.json +37 -0
  243. package/dist/theme-packs/foundry/pack.css +202 -0
  244. package/dist/theme-packs/futura-editorial/fonts/Jost-latin.woff2 +0 -0
  245. package/dist/theme-packs/futura-editorial/fonts/NotoSans-italic-latin.woff2 +0 -0
  246. package/dist/theme-packs/futura-editorial/fonts/NotoSans-latin.woff2 +0 -0
  247. package/dist/theme-packs/futura-editorial/fonts/OFL.txt +95 -0
  248. package/dist/theme-packs/futura-editorial/fonts/SpaceMono-400-latin.woff2 +0 -0
  249. package/dist/theme-packs/futura-editorial/fonts/SpaceMono-700-latin.woff2 +0 -0
  250. package/dist/theme-packs/futura-editorial/meta.json +38 -0
  251. package/dist/theme-packs/futura-editorial/pack.css +313 -0
  252. package/dist/theme-packs/hearth/fonts/Fraunces-italic-latin.woff2 +0 -0
  253. package/dist/theme-packs/hearth/fonts/Fraunces-latin.woff2 +0 -0
  254. package/dist/theme-packs/hearth/fonts/Nunito-latin.woff2 +0 -0
  255. package/dist/theme-packs/hearth/fonts/OFL.txt +95 -0
  256. package/dist/theme-packs/hearth/fonts/SplineSansMono-latin.woff2 +0 -0
  257. package/dist/theme-packs/hearth/meta.json +38 -0
  258. package/dist/theme-packs/hearth/pack.css +385 -0
  259. package/dist/theme-packs/hollow/fonts/OFL.txt +94 -0
  260. package/dist/theme-packs/hollow/fonts/SpaceGrotesk-latin.woff2 +0 -0
  261. package/dist/theme-packs/hollow/fonts/SpaceMono-400-italic-latin.woff2 +0 -0
  262. package/dist/theme-packs/hollow/fonts/SpaceMono-400-latin.woff2 +0 -0
  263. package/dist/theme-packs/hollow/fonts/SpaceMono-700-latin.woff2 +0 -0
  264. package/dist/theme-packs/hollow/meta.json +37 -0
  265. package/dist/theme-packs/hollow/pack.css +428 -0
  266. package/dist/theme-packs/ledger/fonts/CrimsonPro-latin-ext-italic.woff2 +0 -0
  267. package/dist/theme-packs/ledger/fonts/CrimsonPro-latin-ext.woff2 +0 -0
  268. package/dist/theme-packs/ledger/fonts/CrimsonPro-latin-italic.woff2 +0 -0
  269. package/dist/theme-packs/ledger/fonts/CrimsonPro-latin.woff2 +0 -0
  270. package/dist/theme-packs/ledger/fonts/IBMPlexMono-400-latin-ext.woff2 +0 -0
  271. package/dist/theme-packs/ledger/fonts/IBMPlexMono-400-latin.woff2 +0 -0
  272. package/dist/theme-packs/ledger/fonts/IBMPlexMono-500-latin-ext.woff2 +0 -0
  273. package/dist/theme-packs/ledger/fonts/IBMPlexMono-500-latin.woff2 +0 -0
  274. package/dist/theme-packs/ledger/fonts/OFL.txt +94 -0
  275. package/dist/theme-packs/ledger/meta.json +37 -0
  276. package/dist/theme-packs/ledger/pack.css +463 -0
  277. package/dist/theme-packs/manuscript/fonts/CourierPrime-400-latin-ext.woff2 +0 -0
  278. package/dist/theme-packs/manuscript/fonts/CourierPrime-400-latin.woff2 +0 -0
  279. package/dist/theme-packs/manuscript/fonts/CourierPrime-700-latin-ext.woff2 +0 -0
  280. package/dist/theme-packs/manuscript/fonts/CourierPrime-700-latin.woff2 +0 -0
  281. package/dist/theme-packs/manuscript/fonts/EBGaramond-latin-italic.woff2 +0 -0
  282. package/dist/theme-packs/manuscript/fonts/EBGaramond-latin.woff2 +0 -0
  283. package/dist/theme-packs/manuscript/fonts/OFL.txt +94 -0
  284. package/dist/theme-packs/manuscript/meta.json +37 -0
  285. package/dist/theme-packs/manuscript/pack.css +376 -0
  286. package/dist/theme-packs/matcha/fonts/MPLUS1Code-latin.woff2 +0 -0
  287. package/dist/theme-packs/matcha/fonts/OFL.txt +95 -0
  288. package/dist/theme-packs/matcha/fonts/ShipporiMincho-500-latin.woff2 +0 -0
  289. package/dist/theme-packs/matcha/fonts/ShipporiMincho-700-latin.woff2 +0 -0
  290. package/dist/theme-packs/matcha/fonts/ZenKakuGothicNew-400-latin.woff2 +0 -0
  291. package/dist/theme-packs/matcha/fonts/ZenKakuGothicNew-500-latin.woff2 +0 -0
  292. package/dist/theme-packs/matcha/meta.json +38 -0
  293. package/dist/theme-packs/matcha/pack.css +409 -0
  294. package/dist/theme-packs/nocturne/fonts/CormorantGaramond-italic-latin.woff2 +0 -0
  295. package/dist/theme-packs/nocturne/fonts/CormorantGaramond-latin.woff2 +0 -0
  296. package/dist/theme-packs/nocturne/fonts/IBMPlexMono-400-latin.woff2 +0 -0
  297. package/dist/theme-packs/nocturne/fonts/IBMPlexMono-500-latin.woff2 +0 -0
  298. package/dist/theme-packs/nocturne/fonts/IBMPlexMono-italic-latin.woff2 +0 -0
  299. package/dist/theme-packs/nocturne/fonts/Manrope-latin.woff2 +0 -0
  300. package/dist/theme-packs/nocturne/fonts/OFL.txt +95 -0
  301. package/dist/theme-packs/nocturne/meta.json +38 -0
  302. package/dist/theme-packs/nocturne/pack.css +502 -0
  303. package/dist/theme-packs/observatory/fonts/JosefinSans-latin.woff2 +0 -0
  304. package/dist/theme-packs/observatory/fonts/Jost-italic-latin.woff2 +0 -0
  305. package/dist/theme-packs/observatory/fonts/Jost-latin.woff2 +0 -0
  306. package/dist/theme-packs/observatory/fonts/OFL.txt +95 -0
  307. package/dist/theme-packs/observatory/fonts/SpaceMono-400-latin.woff2 +0 -0
  308. package/dist/theme-packs/observatory/fonts/SpaceMono-700-latin.woff2 +0 -0
  309. package/dist/theme-packs/observatory/fonts/SpaceMono-italic-latin.woff2 +0 -0
  310. package/dist/theme-packs/observatory/meta.json +38 -0
  311. package/dist/theme-packs/observatory/pack.css +728 -0
  312. package/dist/theme-packs/onyx/fonts/CormorantGaramond-italic-latin.woff2 +0 -0
  313. package/dist/theme-packs/onyx/fonts/CormorantGaramond-latin.woff2 +0 -0
  314. package/dist/theme-packs/onyx/fonts/IBMPlexMono-400-latin-ext.woff2 +0 -0
  315. package/dist/theme-packs/onyx/fonts/IBMPlexMono-400-latin.woff2 +0 -0
  316. package/dist/theme-packs/onyx/fonts/IBMPlexMono-500-latin-ext.woff2 +0 -0
  317. package/dist/theme-packs/onyx/fonts/IBMPlexMono-500-latin.woff2 +0 -0
  318. package/dist/theme-packs/onyx/fonts/Jost-latin.woff2 +0 -0
  319. package/dist/theme-packs/onyx/fonts/OFL.txt +95 -0
  320. package/dist/theme-packs/onyx/meta.json +38 -0
  321. package/dist/theme-packs/onyx/pack.css +497 -0
  322. package/dist/theme-packs/phosphor/fonts/JetBrainsMono-latin-ext.woff2 +0 -0
  323. package/dist/theme-packs/phosphor/fonts/JetBrainsMono-latin.woff2 +0 -0
  324. package/dist/theme-packs/phosphor/fonts/OFL.txt +94 -0
  325. package/dist/theme-packs/phosphor/fonts/VT323-latin-ext.woff2 +0 -0
  326. package/dist/theme-packs/phosphor/fonts/VT323-latin.woff2 +0 -0
  327. package/dist/theme-packs/phosphor/meta.json +38 -0
  328. package/dist/theme-packs/phosphor/pack.css +493 -0
  329. package/dist/theme-packs/solar/fonts/OFL.txt +94 -0
  330. package/dist/theme-packs/solar/fonts/SourceCodePro-italic-latin.woff2 +0 -0
  331. package/dist/theme-packs/solar/fonts/SourceCodePro-latin.woff2 +0 -0
  332. package/dist/theme-packs/solar/fonts/SourceSans3-italic-latin.woff2 +0 -0
  333. package/dist/theme-packs/solar/fonts/SourceSans3-latin.woff2 +0 -0
  334. package/dist/theme-packs/solar/meta.json +37 -0
  335. package/dist/theme-packs/solar/pack.css +380 -0
  336. package/dist/theme-packs/sumi/fonts/IBMPlexMono-400-latin-ext.woff2 +0 -0
  337. package/dist/theme-packs/sumi/fonts/IBMPlexMono-400-latin.woff2 +0 -0
  338. package/dist/theme-packs/sumi/fonts/IBMPlexMono-500-latin-ext.woff2 +0 -0
  339. package/dist/theme-packs/sumi/fonts/IBMPlexMono-500-latin.woff2 +0 -0
  340. package/dist/theme-packs/sumi/fonts/OFL.txt +95 -0
  341. package/dist/theme-packs/sumi/fonts/ShipporiMinchoB1-600-latin.woff2 +0 -0
  342. package/dist/theme-packs/sumi/fonts/ShipporiMinchoB1-700-latin.woff2 +0 -0
  343. package/dist/theme-packs/sumi/fonts/ShipporiMinchoB1-800-latin.woff2 +0 -0
  344. package/dist/theme-packs/sumi/fonts/ZenKakuGothicNew-400-latin.woff2 +0 -0
  345. package/dist/theme-packs/sumi/fonts/ZenKakuGothicNew-500-latin.woff2 +0 -0
  346. package/dist/theme-packs/sumi/meta.json +38 -0
  347. package/dist/theme-packs/sumi/pack.css +502 -0
  348. package/dist/theme-packs/swissgrid/fonts/IBMPlexMono-400-latin-ext.woff2 +0 -0
  349. package/dist/theme-packs/swissgrid/fonts/IBMPlexMono-400-latin.woff2 +0 -0
  350. package/dist/theme-packs/swissgrid/fonts/IBMPlexMono-600-latin.woff2 +0 -0
  351. package/dist/theme-packs/swissgrid/fonts/Inter-latin-ext.woff2 +0 -0
  352. package/dist/theme-packs/swissgrid/fonts/Inter-latin.woff2 +0 -0
  353. package/dist/theme-packs/swissgrid/fonts/InterTight-latin.woff2 +0 -0
  354. package/dist/theme-packs/swissgrid/fonts/OFL.txt +95 -0
  355. package/dist/theme-packs/swissgrid/meta.json +38 -0
  356. package/dist/theme-packs/swissgrid/pack.css +518 -0
  357. package/dist/theme-packs/washi/fonts/MPlus1Code-400-latin.woff2 +0 -0
  358. package/dist/theme-packs/washi/fonts/MPlus1Code-500-latin.woff2 +0 -0
  359. package/dist/theme-packs/washi/fonts/OFL.txt +95 -0
  360. package/dist/theme-packs/washi/fonts/ShipporiMincho-500-latin.woff2 +0 -0
  361. package/dist/theme-packs/washi/fonts/ShipporiMincho-600-latin.woff2 +0 -0
  362. package/dist/theme-packs/washi/fonts/ShipporiMincho-700-latin.woff2 +0 -0
  363. package/dist/theme-packs/washi/fonts/ZenKakuGothicNew-400-latin.woff2 +0 -0
  364. package/dist/theme-packs/washi/fonts/ZenKakuGothicNew-500-latin.woff2 +0 -0
  365. package/dist/theme-packs/washi/fonts/ZenKakuGothicNew-700-latin.woff2 +0 -0
  366. package/dist/theme-packs/washi/meta.json +38 -0
  367. package/dist/theme-packs/washi/pack.css +479 -0
  368. package/dist/theme-packs-registry/index.d.ts +5 -0
  369. package/dist/theme-packs-registry/index.js +30 -0
  370. package/dist/theme-packs-registry/load-registry.d.ts +23 -0
  371. package/dist/theme-packs-registry/load-registry.js +64 -0
  372. package/dist/theme-packs-registry/meta-schema.d.ts +70 -0
  373. package/dist/theme-packs-registry/meta-schema.js +38 -0
  374. package/dist/theme-packs-registry/resolve-enabled-packs.d.ts +25 -0
  375. package/dist/theme-packs-registry/resolve-enabled-packs.js +43 -0
  376. package/dist/theme-packs-registry/token-manifest.d.ts +19 -0
  377. package/dist/theme-packs-registry/token-manifest.js +57 -0
  378. package/dist/theme-packs-registry/validator.d.ts +35 -0
  379. package/dist/theme-packs-registry/validator.js +284 -0
  380. package/dist/theme-toggle/color-scheme-sync.d.ts +2 -4
  381. package/dist/theme.css +319 -0
  382. package/dist/versions-page/index.d.ts +2 -2
  383. package/dist/versions-page/index.js +8 -8
  384. package/dist/z-index-defaults/index.d.ts +45 -0
  385. package/dist/z-index-defaults/index.js +34 -0
  386. package/eject/breadcrumb/breadcrumb.tsx +4 -4
  387. package/eject/breadcrumb/find-path.ts +2 -2
  388. package/eject/breadcrumb/index.ts +1 -1
  389. package/eject/breadcrumb/types.ts +0 -6
  390. package/eject/code-group/index.tsx +2 -2
  391. package/eject/doc-history/index.tsx +1 -1
  392. package/eject/doc-pager/index.tsx +1 -1
  393. package/eject/footer/footer.tsx +1 -0
  394. package/eject/header/header.tsx +86 -21
  395. package/eject/header/index.ts +3 -0
  396. package/eject/header/types.ts +39 -1
  397. package/eject/site-tree-nav-island/index.tsx +15 -3
  398. package/eject/site-tree-nav-island/state.ts +9 -0
  399. package/eject/theme-toggle/color-scheme-sync.ts +2 -4
  400. package/package.json +82 -29
  401. package/routes-src/404.tsx +4 -1
  402. package/routes-src/_chrome.tsx +31 -8
  403. package/routes-src/_context.ts +4 -0
  404. package/routes-src/_docs-helpers.ts +9 -29
  405. package/routes-src/_virtual.d.ts +38 -2
  406. package/tsconfig.base.json +29 -0
  407. package/virtual-modules.d.ts +83 -0
  408. package/zfb-config-shim.d.ts +210 -0
  409. package/dist/integrations/llms-txt/index.d.ts +0 -33
  410. package/dist/theme/color-tweak-export-modal.d.ts +0 -16
  411. package/dist/theme/color-tweak-export-modal.js +0 -138
  412. package/dist/theme/design-token-serde.d.ts +0 -183
  413. package/dist/theme/design-token-serde.js +0 -346
  414. package/dist/theme/design-token-types.d.ts +0 -13
  415. package/dist/theme/design-token-types.js +0 -6
  416. package/dist/theme/iframe-bridge.d.ts +0 -42
  417. package/dist/theme/iframe-bridge.js +0 -72
  418. /package/dist/{integrations → plugins/internal}/claude-resources/escape-for-mdx.d.ts +0 -0
  419. /package/dist/{integrations → plugins/internal}/claude-resources/escape-for-mdx.js +0 -0
  420. /package/dist/{integrations → plugins/internal}/claude-resources/generate.d.ts +0 -0
  421. /package/dist/{integrations → plugins/internal}/claude-resources/generate.js +0 -0
  422. /package/dist/{integrations → plugins/internal}/doc-history/pre-build.js +0 -0
  423. /package/dist/{integrations → plugins/internal}/llms-txt/dev-middleware.d.ts +0 -0
  424. /package/dist/{integrations → plugins/internal}/llms-txt/dev-middleware.js +0 -0
  425. /package/dist/{integrations → plugins/internal}/llms-txt/emit.d.ts +0 -0
  426. /package/dist/{integrations → plugins/internal}/llms-txt/emit.js +0 -0
  427. /package/dist/{integrations → plugins/internal}/llms-txt/generate.d.ts +0 -0
  428. /package/dist/{integrations → plugins/internal}/llms-txt/generate.js +0 -0
  429. /package/dist/{integrations → plugins/internal}/llms-txt/index.js +0 -0
  430. /package/dist/{integrations → plugins/internal}/llms-txt/types.js +0 -0
  431. /package/dist/{integrations → plugins/internal}/search-index/build-emitter.d.ts +0 -0
  432. /package/dist/{integrations → plugins/internal}/search-index/build-emitter.js +0 -0
  433. /package/dist/{integrations → plugins/internal}/search-index/collect.d.ts +0 -0
  434. /package/dist/{integrations → plugins/internal}/search-index/dev-middleware.d.ts +0 -0
  435. /package/dist/{integrations → plugins/internal}/search-index/dev-middleware.js +0 -0
  436. /package/dist/{integrations → plugins/internal}/search-index/index.d.ts +0 -0
  437. /package/dist/{integrations → plugins/internal}/search-index/index.js +0 -0
  438. /package/dist/{integrations → plugins/internal}/search-index/types.d.ts +0 -0
  439. /package/dist/{integrations → plugins/internal}/search-index/types.js +0 -0
@@ -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
  ] }),
@@ -0,0 +1,67 @@
1
+ /**
2
+ * Default docs-frontmatter zod schema builder.
3
+ *
4
+ * Ported (and parameterized) from the `create-zudo-doc` base template's
5
+ * `src/config/docs-schema.ts` `buildDocsSchema` export (epic
6
+ * zudolab/zudo-doc#2651, S4 #2654).
7
+ *
8
+ * Unlike the template original — which read the host `settings` and
9
+ * `tag-vocabulary` singletons directly — this package default NEVER imports
10
+ * host singletons: governance mode and the vocabulary entries are passed in
11
+ * as `opts`. `zudoDoc()` (#2657) calls this with the project's merged
12
+ * governance config; a project may also override `buildDocsSchema` entirely
13
+ * via `ZudoDocConfig.buildDocsSchema`.
14
+ */
15
+ import { z } from "zod";
16
+ import type { PresetTagVocabularyEntry } from "../preset.js";
17
+ export interface BuildDocsSchemaOptions {
18
+ tagGovernance?: "off" | "warn" | "strict";
19
+ tagVocabulary?: readonly PresetTagVocabularyEntry[];
20
+ }
21
+ /**
22
+ * Build the docs frontmatter zod schema.
23
+ *
24
+ * Returns a single `z.object(...).passthrough()` reused for every docs
25
+ * collection (default + per-locale + per-version + per-version-per-locale).
26
+ * The `tags` field is governance-aware: `buildTagsSchema()` returns a plain
27
+ * `z.array(z.string())` when governance is off (or `opts` is omitted), or a
28
+ * restricted `z.enum` when `opts.tagGovernance: "strict"` plus a non-empty
29
+ * `opts.tagVocabulary` is supplied.
30
+ *
31
+ * `.passthrough()` keeps custom frontmatter keys (e.g. `author`, `status`)
32
+ * available downstream — the frontmatter-preview UI relies on this to
33
+ * surface arbitrary keys without declaring each one here.
34
+ */
35
+ export declare function buildDocsSchema(opts?: BuildDocsSchemaOptions): z.ZodObject<{
36
+ title: z.ZodString;
37
+ description: z.ZodOptional<z.ZodString>;
38
+ category: z.ZodOptional<z.ZodString>;
39
+ sidebar_position: z.ZodOptional<z.ZodNumber>;
40
+ sidebar_label: z.ZodOptional<z.ZodString>;
41
+ tags: z.ZodOptional<z.ZodArray<z.ZodString>> | z.ZodOptional<z.ZodArray<z.ZodEnum<{
42
+ [x: string]: string;
43
+ }>>>;
44
+ search_exclude: z.ZodOptional<z.ZodBoolean>;
45
+ pagination_next: z.ZodOptional<z.ZodNullable<z.ZodString>>;
46
+ pagination_prev: z.ZodOptional<z.ZodNullable<z.ZodString>>;
47
+ draft: z.ZodOptional<z.ZodBoolean>;
48
+ unlisted: z.ZodOptional<z.ZodBoolean>;
49
+ hide_sidebar: z.ZodOptional<z.ZodBoolean>;
50
+ hide_toc: z.ZodOptional<z.ZodBoolean>;
51
+ wide: z.ZodOptional<z.ZodBoolean>;
52
+ doc_history: z.ZodOptional<z.ZodBoolean>;
53
+ standalone: z.ZodOptional<z.ZodBoolean>;
54
+ slug: z.ZodOptional<z.ZodString>;
55
+ generated: z.ZodOptional<z.ZodBoolean>;
56
+ category_no_page: z.ZodOptional<z.ZodBoolean>;
57
+ category_sort_order: z.ZodOptional<z.ZodEnum<{
58
+ asc: "asc";
59
+ desc: "desc";
60
+ }>>;
61
+ }, z.core.$loose>;
62
+ /**
63
+ * TypeScript type inferred from the default docs frontmatter zod schema.
64
+ * A project overriding `buildDocsSchema` via `ZudoDocConfig` should derive
65
+ * its own `DocsData` type from its own builder instead of this one.
66
+ */
67
+ export type DocsData = z.infer<ReturnType<typeof buildDocsSchema>>;
@@ -0,0 +1,43 @@
1
+ import { z } from "zod";
2
+ function buildTagsSchema(opts) {
3
+ const vocabulary = opts?.tagVocabulary ?? [];
4
+ const vocabularyActive = vocabulary.length > 0 && opts?.tagGovernance === "strict";
5
+ if (!vocabularyActive) return z.array(z.string()).optional();
6
+ const allowed = new Set(vocabulary.map((entry) => entry.id));
7
+ const allowedList = [...allowed];
8
+ if (allowedList.length === 0) return z.array(z.string()).optional();
9
+ const [first, ...rest] = allowedList;
10
+ return z.array(z.enum([first, ...rest])).optional();
11
+ }
12
+ function buildDocsSchema(opts) {
13
+ return z.object({
14
+ title: z.string(),
15
+ description: z.string().optional(),
16
+ category: z.string().optional(),
17
+ sidebar_position: z.number().optional(),
18
+ sidebar_label: z.string().optional(),
19
+ tags: buildTagsSchema(opts),
20
+ search_exclude: z.boolean().optional(),
21
+ pagination_next: z.string().nullable().optional(),
22
+ pagination_prev: z.string().nullable().optional(),
23
+ draft: z.boolean().optional(),
24
+ unlisted: z.boolean().optional(),
25
+ hide_sidebar: z.boolean().optional(),
26
+ hide_toc: z.boolean().optional(),
27
+ wide: z.boolean().optional(),
28
+ doc_history: z.boolean().optional(),
29
+ standalone: z.boolean().optional(),
30
+ slug: z.string().optional(),
31
+ generated: z.boolean().optional(),
32
+ // Category metadata expressed as a directory index.mdx's frontmatter — the
33
+ // frontmatter form of `_category_.json`. `category_no_page` makes the index
34
+ // a non-linked sidebar header excluded from routes/sitemap/search;
35
+ // `category_sort_order` sets the child sort direction. Frontmatter wins
36
+ // over the sidecar.
37
+ category_no_page: z.boolean().optional(),
38
+ category_sort_order: z.enum(["asc", "desc"]).optional()
39
+ }).passthrough();
40
+ }
41
+ export {
42
+ buildDocsSchema
43
+ };
@@ -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")) {
@@ -1,5 +1,6 @@
1
1
  import type { Settings, TagVocabularyEntry } from "../settings.js";
2
2
  import type { ColorScheme } from "../color-scheme-utils.js";
3
+ import type { ThemePackRegistry } from "../theme-packs-registry/index.js";
3
4
  import type { UrlHelpers } from "../url-helpers/index.js";
4
5
  import type { NavSourceDocsAPI } from "../nav-source-docs/index.js";
5
6
  import type { DocRouteEntriesAPI } from "../doc-route-entries/index.js";
@@ -8,6 +9,7 @@ import type { ResolvedTag } from "../tag-helpers/index.js";
8
9
  import type { DocNavNode, DocPageEntry } from "../doc-page-props/index.js";
9
10
  import type { HeadingItem } from "../extract-headings/index.js";
10
11
  import type { CategoryMeta } from "../sidebar-tree/index.js";
12
+ import type { HeaderRightComponentRegistry } from "../header/types.js";
11
13
  /**
12
14
  * The i18n surface a factory may read. Parameterizes what `base.ts` used to read
13
15
  * off the project's `@/config/i18n` singleton directly, so URL/locale logic moves
@@ -103,6 +105,21 @@ export interface RouteContextPayload<S = Settings> {
103
105
  /** Host color-scheme palette map; `null` when the host passed none (chrome
104
106
  * then falls back to a neutral default scheme). */
105
107
  colorSchemes: Record<string, ColorScheme> | null;
108
+ /**
109
+ * Resolved, enabled, ordered theme-pack registry (ADR
110
+ * `docs/adr/theme-packs.md`, Decision 2 "Registry threading to
111
+ * SSR/islands") — settings ∩ the bundled `theme-packs/` directories, in
112
+ * switcher order. `null` (or omitted) renders the whole feature inert (same
113
+ * accepted coupling class as {@link colorSchemes} for a
114
+ * `packageOwnedRoutes: false` host that builds its own payload without
115
+ * threading one).
116
+ *
117
+ * OPTIONAL on purpose: this field was added after the payload shape
118
+ * shipped, so an existing `packageOwnedRoutes: false` host that constructs
119
+ * its own payload predates it. `createRouteContext` normalizes an omitted
120
+ * value to `null` (→ inert) so upgrading such a host does not throw at SSR.
121
+ */
122
+ themePackRegistry?: ThemePackRegistry | null;
106
123
  }
107
124
  /** Aggregated `tag → docs` index entry built by `collectTags`. */
108
125
  export interface TagInfo {
@@ -133,6 +150,9 @@ export interface RouteContext<S = Settings> extends UrlHelpers, NavSourceDocsAPI
133
150
  settings: S;
134
151
  /** Host color-scheme palette map (or `null`); threaded to chrome head CSS. */
135
152
  colorSchemes: Record<string, ColorScheme> | null;
153
+ /** Resolved, enabled, ordered theme-pack registry (or `null`) — see
154
+ * {@link RouteContextPayload.themePackRegistry}. */
155
+ themePackRegistry: ThemePackRegistry | null;
136
156
  /** The reconstructed i18n surface. */
137
157
  i18n: FactoryI18n;
138
158
  /** Default locale code (un-prefixed `/docs/...`). */
@@ -162,14 +182,14 @@ export interface RouteContext<S = Settings> extends UrlHelpers, NavSourceDocsAPI
162
182
  resolveTagBound(raw: string): ResolvedTag;
163
183
  /** Aggregate a `tag → docs` index from a doc collection. */
164
184
  collectTags(entries: ReadonlyArray<{
165
- id: string;
185
+ slug: string;
166
186
  data: {
167
187
  slug?: string;
168
188
  title?: string;
169
189
  description?: string;
170
190
  tags?: string[];
171
191
  };
172
- }>, slugFn: (id: string, data: {
192
+ }>, slugFn: (entrySlug: string, data: {
173
193
  slug?: string;
174
194
  }) => string): Map<string, TagInfo>;
175
195
  /** Build a recursive nav tree from a flat doc collection. */
@@ -188,8 +208,8 @@ export interface RouteContext<S = Settings> extends UrlHelpers, NavSourceDocsAPI
188
208
  isNavVisible(doc: DocPageEntry): boolean;
189
209
  /** The content-bridge handle: identity-stable, draft-filtered docs loader. */
190
210
  stableDocs(collectionName: string): DocPageEntry[];
191
- /** Canonical route slug for a doc id. */
192
- toRouteSlug(id: string): string;
211
+ /** Canonical route slug for a zfb content slug. */
212
+ toRouteSlug(entrySlug: string): string;
193
213
  /** Split a route slug into path params. */
194
214
  toSlugParams(routeSlug: string): string[];
195
215
  }
@@ -202,8 +222,26 @@ export interface RouteContext<S = Settings> extends UrlHelpers, NavSourceDocsAPI
202
222
  * (HOSTCOLLAPSE wave) later passes the real bindings.
203
223
  */
204
224
  export interface ChromeHostBindings {
225
+ /** Primary header chrome. Default: the package HeaderWithDefaults component. */
226
+ Header?: FactoryComponent;
227
+ /** Primary footer chrome. Default: the package FooterWithDefaults component. */
228
+ Footer?: FactoryComponent;
229
+ /** Primary doc sidebar chrome. Default: the package SidebarWithDefaults component. */
230
+ Sidebar?: FactoryComponent;
231
+ /** Primary desktop table of contents. Default: the package Toc component. */
232
+ Toc?: FactoryComponent;
233
+ /** Primary breadcrumb trail. Default: the package Breadcrumb component. */
234
+ Breadcrumb?: FactoryComponent;
235
+ /** Primary previous/next document pager. Default: the package DocPager component. */
236
+ DocPager?: FactoryComponent;
205
237
  /** Header search widget. Default: the package SearchWidget bound to the site base. */
206
238
  SearchWidget?: FactoryComponent;
239
+ /**
240
+ * Project-owned header-right renderers keyed by the serializable component
241
+ * name in `settings.headerRightItems`. Built-in names are reserved and may
242
+ * not be shadowed. Default: `{}`.
243
+ */
244
+ headerRightComponents?: HeaderRightComponentRegistry;
207
245
  /** Per-page git-history meta manifest. Default: `{}` (no Created/Updated block). */
208
246
  docHistoryMeta?: Record<string, unknown>;
209
247
  /** Sidebar section config. Default: `{}` (auto-generated tree only). */
@@ -221,6 +259,20 @@ export interface ChromeHostBindings {
221
259
  BodyEndIslands?: FactoryComponent;
222
260
  /** DocHistory island. Default: a no-op stub rendering an empty fragment. */
223
261
  DocHistory?: FactoryComponent;
262
+ /**
263
+ * Design-token panel bootstrap island (#2658). Default: the PACKAGE-DEFAULT
264
+ * `DesignTokenPanelBootstrap` from
265
+ * `@takazudo/zudo-doc/design-token-panel-bootstrap`, statically imported by
266
+ * `chrome/derive.tsx` (`deriveBodyEndIslands`) so EVERY `createChrome`
267
+ * consumer — the injected `routes/_chrome.tsx` path and the locked-manifest
268
+ * self-contained doc stub alike — gets the settings-gated panel island with
269
+ * no explicit wiring (#2659 gate-2 fix; scanner reachability holds through
270
+ * the static route → chrome → derive → bootstrap chain, the #2480
271
+ * contract). Supply this slot only to REPLACE the island with a host's own
272
+ * bootstrap component. Mounting is still gated on
273
+ * `settings.designTokenPanel` inside `createBodyEndIslands` either way.
274
+ */
275
+ DesignTokenPanelBootstrap?: FactoryComponent;
224
276
  /** MDX content-component overrides (Details / HtmlPreview / Island /
225
277
  * PresetGenerator). Default: package SSR impls + a `PresetGenerator` stub. */
226
278
  mdxExtras?: Record<string, FactoryComponent>;