@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
@@ -0,0 +1,479 @@
1
+ /* ============================================================
2
+ Washi — zudo-doc theme pack (ADR docs/adr/theme-packs.md)
3
+
4
+ Warm washi paper, sumi ink, and ai-iro indigo seals — quiet
5
+ Japanese stationery for calm documentation. Zen Kaku Gothic New
6
+ prose over a CSS-only paper grain, Shippori Mincho headings, an
7
+ indigo hanko (判子) stamp language: a tilted 藍 seal on the h1,
8
+ kanji seal chips on admonitions, an asymmetric two-tone h2 rule.
9
+ Everything is cut square (washi is cut straight — no rounding),
10
+ with a generous 1.95 prose leading. Light = raw warm paper;
11
+ dark = aizome night — the same sheet dyed indigo-charcoal, warm
12
+ paper-white ink, asagi (pale indigo) seals.
13
+
14
+ Every rule below is scoped under html[data-theme-pack="washi"]
15
+ — this is what makes the runtime pack swap atomic (Decision 3)
16
+ and lets the validator prove a pack can never leak styles while
17
+ inactive (Decision 6.7). The @font-face blocks are the sole
18
+ exception (at-rules can't be selector-scoped).
19
+
20
+ CJK font rule (Decision 5): packs do NOT ship CJK subsets. All
21
+ three families load their latin subset only; every family stack
22
+ ends in the correct bare generic (sans-serif / serif / monospace)
23
+ so the platform's own Japanese fonts carry CJK glyphs. The 藍 and
24
+ kanji chip glyphs below are decorative CSS content characters
25
+ rendered by that platform CJK fallback — intentional.
26
+
27
+ Prototype-selector adaptations against the REAL DOM (tokens-dump
28
+ §6 + component sources), noted inline where they matter:
29
+ - `.lead` → `.zd-content > p[data-doc-description]`
30
+ (retargeted onto the stable hook,
31
+ zudolab/zudo-doc#2879 — was
32
+ `.zd-content > p:first-of-type`, which fell
33
+ back to the first body paragraph on
34
+ description-less pages; that fallback deck
35
+ is intentionally gone now, same rationale as
36
+ broadsheet's own retarget)
37
+ - `.sb-group > p::before` (sidebar group-label seal squares) →
38
+ NOT ported — sidebar group labels have no
39
+ stable hook; the sidebar keeps its
40
+ vertical-fiber sheet + accent hover
41
+ - `.toc-active` → `nav[data-zd-toc] a[aria-current="true"]`
42
+ - `.doc-pager` → `.zd-content > nav[data-doc-pager]`
43
+ (retargeted onto the stable hook,
44
+ zudolab/zudo-doc#2879 — was
45
+ `.zd-content > nav:last-of-type:not([aria-label])`)
46
+ - `footer[data-footer]` → `footer[data-footer]` (retargeted onto the
47
+ stable hook, zudolab/zudo-doc#2879 — was
48
+ `.zd-sidebar-content-wrapper > footer`)
49
+ - the theme-switcher flyout/launcher (the square indigo hanko
50
+ launcher + 和紙 stamp) — `[data-switcher-card]` /
51
+ `[data-switcher-launcher]` are stable hooks now too, but stay
52
+ unstyled — pack choice (broadsheet precedent), not a
53
+ missing-hook limitation
54
+ - prototype `--radius`/`--radius-lg` were structural mock tokens,
55
+ not part of the pack token contract — squareness lands via
56
+ `--zdc-admonition-radius: 0`, `--zdc-card-radius: 0`, and
57
+ explicit border-radius: 0 on pager cards + inline code
58
+ - prototype `p { margin-bottom: 1.3rem }` rhythm → NOT ported;
59
+ the real DOM's flow-space owl owns vertical rhythm (margin-top
60
+ based) — the 1.95 leading alone carries the airy feel
61
+ ============================================================ */
62
+
63
+ /* ---- Zen Kaku Gothic New — body/prose gothic (static 400/500/700;
64
+ 500 keeps chrome "medium" weights true, 700 for bold prose).
65
+ Latin subsets only (all three families) — the platform's own
66
+ Japanese fonts render CJK via the bare generic. ---- */
67
+
68
+ @font-face {
69
+ font-family: "Zen Kaku Gothic New";
70
+ font-style: normal;
71
+ font-weight: 400;
72
+ font-display: swap;
73
+ src: url("./fonts/ZenKakuGothicNew-400-latin.woff2") format("woff2");
74
+ unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA,
75
+ U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191,
76
+ U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
77
+ }
78
+
79
+ @font-face {
80
+ font-family: "Zen Kaku Gothic New";
81
+ font-style: normal;
82
+ font-weight: 500;
83
+ font-display: swap;
84
+ src: url("./fonts/ZenKakuGothicNew-500-latin.woff2") format("woff2");
85
+ unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA,
86
+ U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191,
87
+ U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
88
+ }
89
+
90
+ @font-face {
91
+ font-family: "Zen Kaku Gothic New";
92
+ font-style: normal;
93
+ font-weight: 700;
94
+ font-display: swap;
95
+ src: url("./fonts/ZenKakuGothicNew-700-latin.woff2") format("woff2");
96
+ unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA,
97
+ U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191,
98
+ U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
99
+ }
100
+
101
+ /* ---- Shippori Mincho — heading/display serif (static 500/600/700;
102
+ 600 is the heading weight, 700 the logo, 500 catches the
103
+ normal-weight mincho voices: lead, blockquote). ---- */
104
+
105
+ @font-face {
106
+ font-family: "Shippori Mincho";
107
+ font-style: normal;
108
+ font-weight: 500;
109
+ font-display: swap;
110
+ src: url("./fonts/ShipporiMincho-500-latin.woff2") format("woff2");
111
+ unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA,
112
+ U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191,
113
+ U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
114
+ }
115
+
116
+ @font-face {
117
+ font-family: "Shippori Mincho";
118
+ font-style: normal;
119
+ font-weight: 600;
120
+ font-display: swap;
121
+ src: url("./fonts/ShipporiMincho-600-latin.woff2") format("woff2");
122
+ unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA,
123
+ U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191,
124
+ U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
125
+ }
126
+
127
+ @font-face {
128
+ font-family: "Shippori Mincho";
129
+ font-style: normal;
130
+ font-weight: 700;
131
+ font-display: swap;
132
+ src: url("./fonts/ShipporiMincho-700-latin.woff2") format("woff2");
133
+ unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA,
134
+ U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191,
135
+ U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
136
+ }
137
+
138
+ /* ---- M PLUS 1 Code — code face (static 400 + 500; 500 keeps the
139
+ inline-code medium weight true). ---- */
140
+
141
+ @font-face {
142
+ font-family: "M PLUS 1 Code";
143
+ font-style: normal;
144
+ font-weight: 400;
145
+ font-display: swap;
146
+ src: url("./fonts/MPlus1Code-400-latin.woff2") format("woff2");
147
+ unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA,
148
+ U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191,
149
+ U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
150
+ }
151
+
152
+ @font-face {
153
+ font-family: "M PLUS 1 Code";
154
+ font-style: normal;
155
+ font-weight: 500;
156
+ font-display: swap;
157
+ src: url("./fonts/MPlus1Code-500-latin.woff2") format("woff2");
158
+ unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA,
159
+ U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191,
160
+ U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
161
+ }
162
+
163
+ html[data-theme-pack="washi"] {
164
+ /* Tier-2 semantic roles — warm off-white washi + sumi ink + ai-iro
165
+ indigo (#274a78). Dark: aizome night — indigo-dyed charcoal paper,
166
+ warm paper-white ink, asagi (pale indigo) seals. Same paper, dyed
167
+ instead of raw. Both modes always via light-dark(). */
168
+ --zd-bg: light-dark(#f6f1e4, #1b212c);
169
+ --zd-fg: light-dark(#2b2822, #eae3d2);
170
+ --zd-selection-bg: light-dark(#274a78, #8ab0dd);
171
+ --zd-selection-fg: light-dark(#f6f1e4, #161b24);
172
+ --zd-surface: light-dark(#faf6ec, #202836);
173
+ --zd-muted: light-dark(#6d6553, #98a2b0);
174
+ --zd-accent: light-dark(#274a78, #8ab0dd);
175
+ --zd-accent-hover: light-dark(#1c3a62, #aecaec);
176
+ --zd-code-bg: light-dark(#efe9d8, #222a38);
177
+ --zd-code-fg: light-dark(#2b2822, #ece5d5);
178
+ --zd-success: light-dark(#3f6237, #a3c98e);
179
+ --zd-danger: light-dark(#a03a2e, #e0968a);
180
+ --zd-warning: light-dark(#875c12, #d9ac60);
181
+ --zd-info: light-dark(#31608f, #8ab0dd);
182
+
183
+ /* syntax — all 9 roles, both modes: sumi ink annotated with mineral
184
+ pigments. Moss (strings), kuchiba ochre (numbers), ai indigo
185
+ (keywords), muted shu vermilion (callables), asagi teal (types);
186
+ inserted/deleted reuse the moss and vermilion state hues. */
187
+ /* dark comment nudged from the prototype's #828f9f to keep AA
188
+ contrast on the aizome code sheet (4.68:1 vs 4.38:1) */
189
+ --zd-syntax-comment: light-dark(#6f6654, #8894a4);
190
+ --zd-syntax-string: light-dark(#41653a, #a9cb90);
191
+ --zd-syntax-number: light-dark(#8f5716, #ddaa6e);
192
+ --zd-syntax-keyword: light-dark(#274a78, #97b9e6);
193
+ --zd-syntax-callable: light-dark(#963f34, #e0a49a);
194
+ --zd-syntax-type: light-dark(#2a6167, #85c7cc);
195
+ --zd-syntax-name: light-dark(#2b2822, #ece5d5);
196
+ --zd-syntax-inserted: light-dark(#3f6237, #a3c98e);
197
+ --zd-syntax-deleted: light-dark(#a03a2e, #e0968a);
198
+
199
+ /* fonts — JP-friendly gothic prose, mincho display face for
200
+ headings, M PLUS 1 Code for code. Latin subsets loaded; each
201
+ stack ends in its bare generic so platform CJK fonts carry
202
+ Japanese glyphs (Decision 5). */
203
+ --font-sans: "Zen Kaku Gothic New", system-ui, sans-serif;
204
+ --font-mono: "M PLUS 1 Code", ui-monospace, SFMono-Regular, Menlo, monospace;
205
+ --font-display: "Shippori Mincho", serif;
206
+
207
+ /* Tier-3 component seams — mincho headings at 600, gently opened
208
+ tracking, indigo active-nav seal. Washi is cut straight: zero
209
+ radii on admonitions and cards. */
210
+ --zdc-doc-title-font: var(--font-display);
211
+ --zdc-doc-title-weight: 600;
212
+ --zdc-doc-title-tracking: 0.02em;
213
+ --zdc-doc-h2-font: var(--font-display);
214
+ --zdc-doc-h2-weight: 600;
215
+ --zdc-doc-h2-tracking: 0.015em;
216
+ --zdc-admonition-radius: 0;
217
+ --zdc-admonition-border-width: 3px;
218
+ --zdc-card-radius: 0;
219
+ --zdc-nav-active-indicator-color: var(--zd-accent);
220
+ }
221
+
222
+ /* ---- Washi extras ---- */
223
+
224
+ /* signature move #1 — CSS-only paper grain: two fleck sizes + faint
225
+ horizontal fiber lines on the page sheet */
226
+ html[data-theme-pack="washi"] body {
227
+ background-image:
228
+ radial-gradient(
229
+ light-dark(rgb(101 78 42 / 0.05), rgb(214 205 180 / 0.035)) 1px,
230
+ transparent 1.2px
231
+ ),
232
+ radial-gradient(
233
+ light-dark(rgb(101 78 42 / 0.033), rgb(214 205 180 / 0.022)) 1px,
234
+ transparent 1.2px
235
+ ),
236
+ repeating-linear-gradient(
237
+ 0deg,
238
+ transparent 0 3px,
239
+ light-dark(rgb(80 60 30 / 0.014), rgb(220 210 185 / 0.012)) 3px 4px
240
+ );
241
+ background-size:
242
+ 9px 11px,
243
+ 17px 13px,
244
+ auto;
245
+ background-position:
246
+ 0 0,
247
+ 6px 7px,
248
+ 0 0;
249
+ }
250
+
251
+ /* header and footer: single-fleck grain over the surface tone */
252
+ html[data-theme-pack="washi"] header[data-header],
253
+ html[data-theme-pack="washi"] footer[data-footer] {
254
+ background-image: radial-gradient(
255
+ light-dark(rgb(101 78 42 / 0.04), rgb(214 205 180 / 0.028)) 1px,
256
+ transparent 1.2px
257
+ );
258
+ background-size: 11px 13px;
259
+ }
260
+
261
+ /* sidebar: a second sheet of paper — slightly deeper tone, vertical
262
+ fibers (distinct from the page sheet's horizontal ones) */
263
+ html[data-theme-pack="washi"] #desktop-sidebar {
264
+ background-color: light-dark(#f2ecdc, #191f29);
265
+ background-image: repeating-linear-gradient(
266
+ 90deg,
267
+ transparent 0 5px,
268
+ light-dark(rgb(90 70 40 / 0.025), rgb(225 215 190 / 0.018)) 5px 6px
269
+ );
270
+ }
271
+
272
+ /* a thin indigo band across the top of the page — the binding edge */
273
+ html[data-theme-pack="washi"] header[data-header] {
274
+ border-top: 3px solid var(--zd-accent);
275
+ }
276
+
277
+ /* header logo: mincho wordmark with a small square indigo mark */
278
+ html[data-theme-pack="washi"] [data-header-logo] {
279
+ font-family: var(--font-display);
280
+ font-weight: 700;
281
+ letter-spacing: 0.02em;
282
+ }
283
+ html[data-theme-pack="washi"] [data-header-logo]::before {
284
+ content: "";
285
+ display: inline-block;
286
+ width: 0.5em;
287
+ height: 0.5em;
288
+ background: var(--zd-accent);
289
+ margin-right: 0.55em;
290
+ vertical-align: 0.06em;
291
+ }
292
+
293
+ /* vertical rhythm: generous JP-friendly 1.95 leading */
294
+ html[data-theme-pack="washi"] .zd-content {
295
+ line-height: 1.95;
296
+ letter-spacing: 0.01em;
297
+ }
298
+
299
+ /* the lead: mincho standfirst — the description paragraph
300
+ DocContentHeader renders, targeted via the stable
301
+ `data-doc-description` hook. Description-less pages no longer get
302
+ a fallback deck (the prior `:first-of-type` selector fell back to
303
+ the first body paragraph; that soft-fail behavior is intentionally
304
+ gone, same rationale as broadsheet's own retarget). */
305
+ html[data-theme-pack="washi"] .zd-content > p[data-doc-description] {
306
+ font-family: var(--font-display);
307
+ font-size: 1.2rem;
308
+ line-height: 1.8;
309
+ color: color-mix(in srgb, var(--zd-fg) 72%, var(--zd-bg));
310
+ }
311
+
312
+ /* signature move #2 — the h1 carries a small tilted 藍 seal, like a
313
+ maker's hanko stamp on the sheet (platform CJK font renders the
314
+ glyph — decorative content character, Decision 5 CJK rule) */
315
+ html[data-theme-pack="washi"] .zd-content h1::after {
316
+ content: "藍";
317
+ display: inline-block;
318
+ font-family: var(--font-display);
319
+ font-size: 1rem;
320
+ font-weight: 600;
321
+ line-height: 1;
322
+ color: light-dark(#f6f1e4, #161b24);
323
+ background: var(--zd-accent);
324
+ padding: 0.3em 0.32em 0.24em;
325
+ margin-left: 0.8rem;
326
+ vertical-align: 0.5em;
327
+ border-radius: 2px;
328
+ transform: rotate(-4deg);
329
+ box-shadow: 0 1px 2px light-dark(rgb(43 40 34 / 0.25), rgb(0 0 0 / 0.5));
330
+ }
331
+
332
+ /* signature move #3 — quiet asymmetry: the h2 rule is two-tone, a
333
+ short indigo stroke then a long faded one. Replaces the
334
+ SSR-inlined `style="border-image:linear-gradient(...)"` — the
335
+ border-image !important carve-out (Decision 6.6), here re-pointing
336
+ the gradient rather than clearing it. */
337
+ html[data-theme-pack="washi"] .zd-content h2 {
338
+ border-top-width: 2px;
339
+ border-image: linear-gradient(
340
+ to right,
341
+ var(--zd-accent) 0 3.5rem,
342
+ color-mix(in srgb, var(--zd-muted) 38%, transparent) 3.5rem 100%
343
+ )
344
+ 1 !important;
345
+ }
346
+
347
+ /* h3: an unstamped (outline) seal square */
348
+ html[data-theme-pack="washi"] .zd-content h3::before {
349
+ content: "";
350
+ display: inline-block;
351
+ width: 0.5em;
352
+ height: 0.5em;
353
+ border: 1px solid var(--zd-accent);
354
+ margin-right: 0.5em;
355
+ vertical-align: 0.05em;
356
+ }
357
+
358
+ /* links: patient underlines */
359
+ html[data-theme-pack="washi"] .zd-content a {
360
+ text-underline-offset: 3px;
361
+ text-decoration-thickness: 1px;
362
+ }
363
+
364
+ /* blockquote: mincho voice on an indigo thread */
365
+ html[data-theme-pack="washi"] .zd-content blockquote {
366
+ font-family: var(--font-display);
367
+ border-left: 2px solid var(--zd-accent);
368
+ padding-left: 1.2rem;
369
+ color: color-mix(in srgb, var(--zd-fg) 76%, var(--zd-bg));
370
+ }
371
+
372
+ /* hr: a torn deckle edge */
373
+ html[data-theme-pack="washi"] .zd-content hr {
374
+ border-top: 1px dashed color-mix(in srgb, var(--zd-muted) 65%, transparent);
375
+ }
376
+
377
+ /* code blocks: an annotated margin with an indigo rule; faint top
378
+ sheen like a pressed sheet */
379
+ html[data-theme-pack="washi"] pre.hi-root {
380
+ border-left: 3px solid color-mix(in srgb, var(--zd-accent) 75%, transparent);
381
+ box-shadow: inset 0 1px 0 light-dark(rgb(255 255 255 / 0.5), rgb(255 255 255 / 0.04));
382
+ }
383
+
384
+ /* inline code: hairline-framed square chip */
385
+ html[data-theme-pack="washi"] .zd-content code:not(pre code) {
386
+ border: 1px solid color-mix(in srgb, var(--zd-muted) 28%, transparent);
387
+ padding: 1px 0.35rem;
388
+ border-radius: 0;
389
+ }
390
+
391
+ /* signature move #4 — admonitions: kanji seal chips instead of emoji,
392
+ across all seven variants; mincho titles */
393
+ html[data-theme-pack="washi"] [data-admonition] .admonition-title {
394
+ font-family: var(--font-display);
395
+ letter-spacing: 0.04em;
396
+ }
397
+ html[data-theme-pack="washi"] [data-admonition] .admonition-title::before {
398
+ display: inline-flex;
399
+ align-items: center;
400
+ justify-content: center;
401
+ width: 1.4em;
402
+ height: 1.4em;
403
+ margin-right: 0.55em;
404
+ font-family: var(--font-display);
405
+ font-size: 0.82em;
406
+ font-weight: 600;
407
+ line-height: 1;
408
+ border: 1px solid currentColor;
409
+ border-radius: 2px;
410
+ vertical-align: -0.22em;
411
+ }
412
+ html[data-theme-pack="washi"] [data-admonition="note"] .admonition-title::before {
413
+ content: "註"; /* annotation */
414
+ }
415
+ html[data-theme-pack="washi"] [data-admonition="tip"] .admonition-title::before {
416
+ content: "智"; /* wisdom */
417
+ }
418
+ html[data-theme-pack="washi"] [data-admonition="info"] .admonition-title::before {
419
+ content: "報"; /* information */
420
+ }
421
+ html[data-theme-pack="washi"] [data-admonition="warning"] .admonition-title::before {
422
+ content: "警"; /* warning */
423
+ }
424
+ html[data-theme-pack="washi"] [data-admonition="important"] .admonition-title::before {
425
+ content: "要"; /* essential */
426
+ }
427
+ html[data-theme-pack="washi"] [data-admonition="danger"] .admonition-title::before {
428
+ content: "危"; /* danger */
429
+ }
430
+ html[data-theme-pack="washi"] [data-admonition="caution"] .admonition-title::before {
431
+ content: "注"; /* attention */
432
+ }
433
+
434
+ /* table: indigo-threaded header row */
435
+ html[data-theme-pack="washi"] .zd-content th {
436
+ background: color-mix(in srgb, var(--zd-accent) 8%, transparent);
437
+ border-bottom-color: color-mix(in srgb, var(--zd-accent) 55%, transparent);
438
+ letter-spacing: 0.04em;
439
+ }
440
+
441
+ /* sidebar: indigo hover ink. The active link's background is already
442
+ the indigo seal (--zdc-nav-active-indicator-color) with bg-colored
443
+ text — exclude it so hover never paints accent-on-accent. */
444
+ html[data-theme-pack="washi"] #desktop-sidebar a:not([data-nav-active]):hover {
445
+ color: var(--zd-accent);
446
+ }
447
+
448
+ /* TOC: indigo thread rail, indigo hover, solid indigo seal on the
449
+ active entry (real DOM marks it aria-current="true"; its text-bg
450
+ utility keeps paper-colored text on the seal) */
451
+ html[data-theme-pack="washi"] nav[data-zd-toc] ul {
452
+ border-left-color: color-mix(in srgb, var(--zd-accent) 35%, transparent);
453
+ }
454
+ html[data-theme-pack="washi"] nav[data-zd-toc] a:not([aria-current="true"]):hover {
455
+ color: var(--zd-accent);
456
+ }
457
+ html[data-theme-pack="washi"] nav[data-zd-toc] a[aria-current="true"] {
458
+ background: var(--zd-accent);
459
+ }
460
+
461
+ /* pager: flat square paper cards with the sheet grain; hover slides
462
+ an indigo binding edge in from the reading direction (prev = left
463
+ card = left edge; next = right card = right edge — DocPager always
464
+ renders two grid children, so :first/:last-child are stable) */
465
+ html[data-theme-pack="washi"] .zd-content > nav[data-doc-pager] > a {
466
+ background-color: var(--zd-surface);
467
+ background-image: radial-gradient(
468
+ light-dark(rgb(101 78 42 / 0.04), rgb(214 205 180 / 0.028)) 1px,
469
+ transparent 1.2px
470
+ );
471
+ background-size: 11px 13px;
472
+ border-radius: 0;
473
+ }
474
+ html[data-theme-pack="washi"] .zd-content > nav[data-doc-pager] > a:first-child:hover {
475
+ box-shadow: inset 3px 0 0 var(--zd-accent);
476
+ }
477
+ html[data-theme-pack="washi"] .zd-content > nav[data-doc-pager] > a:last-child:hover {
478
+ box-shadow: inset -3px 0 0 var(--zd-accent);
479
+ }
@@ -0,0 +1,5 @@
1
+ export { THEME_PACK_SLUG_RE, DEFAULT_THEME_PACK_SLUG, themePackMetaSchema, type ThemePackMeta, type ThemePackSwatches, } from "./meta-schema.js";
2
+ export { KNOWN_THEME_PACK_TOKEN_NAMES, COMMERCIAL_FONT_DENYLIST, THEME_PACK_SOFT_BUDGET_BYTES, } from "./token-manifest.js";
3
+ export { validateThemePack, type ThemePackValidationInput, type ThemePackValidationIssue, type ThemePackValidationResult, type ThemePackValidationSeverity, } from "./validator.js";
4
+ export { loadThemePackRegistry, type ThemePackRegistry, type ThemePackRegistryEntry, } from "./load-registry.js";
5
+ export { resolveEnabledPacks, type ResolveEnabledPacksSettings, } from "./resolve-enabled-packs.js";
@@ -0,0 +1,30 @@
1
+ import {
2
+ THEME_PACK_SLUG_RE,
3
+ DEFAULT_THEME_PACK_SLUG,
4
+ themePackMetaSchema
5
+ } from "./meta-schema.js";
6
+ import {
7
+ KNOWN_THEME_PACK_TOKEN_NAMES,
8
+ COMMERCIAL_FONT_DENYLIST,
9
+ THEME_PACK_SOFT_BUDGET_BYTES
10
+ } from "./token-manifest.js";
11
+ import {
12
+ validateThemePack
13
+ } from "./validator.js";
14
+ import {
15
+ loadThemePackRegistry
16
+ } from "./load-registry.js";
17
+ import {
18
+ resolveEnabledPacks
19
+ } from "./resolve-enabled-packs.js";
20
+ export {
21
+ COMMERCIAL_FONT_DENYLIST,
22
+ DEFAULT_THEME_PACK_SLUG,
23
+ KNOWN_THEME_PACK_TOKEN_NAMES,
24
+ THEME_PACK_SLUG_RE,
25
+ THEME_PACK_SOFT_BUDGET_BYTES,
26
+ loadThemePackRegistry,
27
+ resolveEnabledPacks,
28
+ themePackMetaSchema,
29
+ validateThemePack
30
+ };
@@ -0,0 +1,23 @@
1
+ import type { ThemePackMeta } from "./meta-schema.js";
2
+ /** One entry in the aggregated, canonically-ordered bundled registry. */
3
+ export interface ThemePackRegistryEntry {
4
+ /** The pack's directory name (equals `meta.slug`). */
5
+ slug: string;
6
+ /** The pack's schema-validated `meta.json`. */
7
+ meta: ThemePackMeta;
8
+ /** Whether this pack ships a `pack.css` (always `false` for `"default"`). */
9
+ hasStylesheet: boolean;
10
+ }
11
+ /** The full bundled registry, or a subset of it (after `resolveEnabledPacks`)
12
+ * — an ordered array; order carries meaning (canonical / switcher order). */
13
+ export type ThemePackRegistry = ThemePackRegistryEntry[];
14
+ /**
15
+ * Scan `dir` (a `theme-packs/` directory — `src/theme-packs/` in the
16
+ * workspace, `dist/theme-packs/` once shipped) for per-slug pack directories,
17
+ * validate each with {@link validateThemePack}, and return them in canonical
18
+ * (alphabetical-by-slug) order. Throws — naming the offending pack and the
19
+ * failed rule(s) — on any pack that fails validation; this is the package's
20
+ * OWN bundled packs, so a failure here means the package itself shipped a
21
+ * broken pack, not a consumer misconfiguration.
22
+ */
23
+ export declare function loadThemePackRegistry(dir: string | URL): ThemePackRegistry;
@@ -0,0 +1,64 @@
1
+ import { existsSync, readdirSync, readFileSync, statSync } from "node:fs";
2
+ import { fileURLToPath } from "node:url";
3
+ import { join } from "node:path";
4
+ import { validateThemePack } from "./validator.js";
5
+ function readFontFiles(fontsDir) {
6
+ if (!existsSync(fontsDir)) return [];
7
+ return readdirSync(fontsDir, { withFileTypes: true }).filter((e) => e.isFile()).map((e) => e.name);
8
+ }
9
+ function computeTotalPayloadBytes(packDir, cssContent) {
10
+ let total = cssContent ? Buffer.byteLength(cssContent, "utf8") : 0;
11
+ const fontsDir = join(packDir, "fonts");
12
+ if (existsSync(fontsDir)) {
13
+ for (const entry of readdirSync(fontsDir, { withFileTypes: true })) {
14
+ if (!entry.isFile() || entry.name.toUpperCase() === "OFL.TXT") continue;
15
+ total += statSync(join(fontsDir, entry.name)).size;
16
+ }
17
+ }
18
+ return total;
19
+ }
20
+ function loadThemePackRegistry(dir) {
21
+ const dirPath = dir instanceof URL ? fileURLToPath(dir) : dir;
22
+ if (!existsSync(dirPath)) {
23
+ throw new Error(
24
+ `zudo-doc: theme-packs directory not found at "${dirPath}" \u2014 the @takazudo/zudo-doc package installation may be incomplete or corrupted.`
25
+ );
26
+ }
27
+ const slugs = readdirSync(dirPath, { withFileTypes: true }).filter((e) => e.isDirectory()).map((e) => e.name).sort();
28
+ const entries = [];
29
+ for (const slug of slugs) {
30
+ const packDir = join(dirPath, slug);
31
+ const metaPath = join(packDir, "meta.json");
32
+ if (!existsSync(metaPath)) {
33
+ throw new Error(`zudo-doc: theme pack "${slug}" is missing meta.json at "${metaPath}".`);
34
+ }
35
+ let metaRaw;
36
+ try {
37
+ metaRaw = JSON.parse(readFileSync(metaPath, "utf8"));
38
+ } catch (err) {
39
+ throw new Error(
40
+ `zudo-doc: theme pack "${slug}" has invalid JSON in meta.json: ${err.message}`
41
+ );
42
+ }
43
+ const cssPath = join(packDir, "pack.css");
44
+ const cssContent = existsSync(cssPath) ? readFileSync(cssPath, "utf8") : null;
45
+ const fontFiles = readFontFiles(join(packDir, "fonts"));
46
+ const totalPayloadBytes = computeTotalPayloadBytes(packDir, cssContent);
47
+ const result = validateThemePack({ dirName: slug, metaRaw, cssContent, fontFiles, totalPayloadBytes });
48
+ for (const issue of result.issues) {
49
+ if (issue.severity === "warning") {
50
+ console.warn(`[zudo-doc] theme pack "${slug}": ${issue.message}`);
51
+ }
52
+ }
53
+ if (!result.valid || !result.meta) {
54
+ const errorLines = result.issues.filter((i) => i.severity === "error").map((i) => ` - [${i.rule}] ${i.message}`).join("\n");
55
+ throw new Error(`zudo-doc: theme pack "${slug}" failed validation:
56
+ ${errorLines}`);
57
+ }
58
+ entries.push({ slug, meta: result.meta, hasStylesheet: cssContent !== null });
59
+ }
60
+ return entries;
61
+ }
62
+ export {
63
+ loadThemePackRegistry
64
+ };
@@ -0,0 +1,70 @@
1
+ import { z } from "zod";
2
+ /** `[a-z0-9][a-z0-9-]*` — a pack's slug MUST equal its directory name
3
+ * (Decision 6.7 "slug regex + dir-name parity"). */
4
+ export declare const THEME_PACK_SLUG_RE: RegExp;
5
+ /** The reserved slug meaning "the stock zudo-doc look" — ships `meta.json`
6
+ * ONLY (no `pack.css`); the runtime never inserts a stylesheet link for it
7
+ * (ADR Decision 1, "The reserved `default` pack"). */
8
+ export declare const DEFAULT_THEME_PACK_SLUG = "default";
9
+ declare const themePackSwatchesSchema: z.ZodObject<{
10
+ bg: z.ZodString;
11
+ fg: z.ZodString;
12
+ accent: z.ZodString;
13
+ syntax: z.ZodObject<{
14
+ keyword: z.ZodString;
15
+ string: z.ZodString;
16
+ comment: z.ZodString;
17
+ callable: z.ZodString;
18
+ }, z.core.$strip>;
19
+ }, z.core.$strip>;
20
+ /** Preview swatches for the dialog grid — RESOLVED plain CSS colors, one set
21
+ * per mode. See {@link themePackMetaSchema}'s `preview` field. */
22
+ export type ThemePackSwatches = z.infer<typeof themePackSwatchesSchema>;
23
+ export declare const themePackMetaSchema: z.ZodObject<{
24
+ schemaVersion: z.ZodLiteral<1>;
25
+ slug: z.ZodString;
26
+ name: z.ZodString;
27
+ description: z.ZodString;
28
+ mode: z.ZodEnum<{
29
+ light: "light";
30
+ dark: "dark";
31
+ }>;
32
+ version: z.ZodString;
33
+ fonts: z.ZodObject<{
34
+ sans: z.ZodString;
35
+ mono: z.ZodString;
36
+ display: z.ZodOptional<z.ZodString>;
37
+ loaded: z.ZodArray<z.ZodString>;
38
+ }, z.core.$strip>;
39
+ preview: z.ZodObject<{
40
+ light: z.ZodObject<{
41
+ bg: z.ZodString;
42
+ fg: z.ZodString;
43
+ accent: z.ZodString;
44
+ syntax: z.ZodObject<{
45
+ keyword: z.ZodString;
46
+ string: z.ZodString;
47
+ comment: z.ZodString;
48
+ callable: z.ZodString;
49
+ }, z.core.$strip>;
50
+ }, z.core.$strip>;
51
+ dark: z.ZodObject<{
52
+ bg: z.ZodString;
53
+ fg: z.ZodString;
54
+ accent: z.ZodString;
55
+ syntax: z.ZodObject<{
56
+ keyword: z.ZodString;
57
+ string: z.ZodString;
58
+ comment: z.ZodString;
59
+ callable: z.ZodString;
60
+ }, z.core.$strip>;
61
+ }, z.core.$strip>;
62
+ }, z.core.$strip>;
63
+ }, z.core.$strip>;
64
+ /**
65
+ * A pack's `meta.json`, schema-validated (ADR Decision 1). `mode` is a
66
+ * designed-primary badge only — every pack still defines BOTH modes via
67
+ * `light-dark()` in `pack.css`.
68
+ */
69
+ export type ThemePackMeta = z.infer<typeof themePackMetaSchema>;
70
+ export {};