@takazudo/zudo-doc 6.0.0 → 6.0.2

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 (66) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/README.md +1 -1
  3. package/dist/catalog.js +1 -1
  4. package/dist/chrome-bindings.d.ts +7 -5
  5. package/dist/compiled.css +5 -0
  6. package/dist/config/component-tokens.d.ts +1 -1
  7. package/dist/config/component-tokens.js +22 -0
  8. package/dist/features.css +5 -0
  9. package/dist/header-with-defaults/index.d.ts +2 -2
  10. package/dist/header-with-defaults/index.js +14 -11
  11. package/dist/sidebar/client-data.d.ts +18 -0
  12. package/dist/sidebar/client-data.js +47 -0
  13. package/dist/sidebar/index.d.ts +2 -0
  14. package/dist/sidebar/index.js +3 -1
  15. package/dist/sidebar-with-defaults/index.js +2 -2
  16. package/dist/theme-packs/academia/meta.json +1 -1
  17. package/dist/theme-packs/academia/pack.css +1 -1
  18. package/dist/theme-packs/bauhaus/meta.json +1 -1
  19. package/dist/theme-packs/bauhaus/pack.css +2 -2
  20. package/dist/theme-packs/blueprint/meta.json +1 -1
  21. package/dist/theme-packs/blueprint/pack.css +2 -2
  22. package/dist/theme-packs/botanica/meta.json +1 -1
  23. package/dist/theme-packs/botanica/pack.css +2 -2
  24. package/dist/theme-packs/broadsheet/meta.json +1 -1
  25. package/dist/theme-packs/broadsheet/pack.css +2 -2
  26. package/dist/theme-packs/brutalist/meta.json +1 -1
  27. package/dist/theme-packs/brutalist/pack.css +2 -2
  28. package/dist/theme-packs/eink/meta.json +1 -1
  29. package/dist/theme-packs/eink/pack.css +1 -1
  30. package/dist/theme-packs/futura-editorial/meta.json +1 -1
  31. package/dist/theme-packs/futura-editorial/pack.css +2 -2
  32. package/dist/theme-packs/hearth/meta.json +1 -1
  33. package/dist/theme-packs/hearth/pack.css +2 -2
  34. package/dist/theme-packs/ledger/meta.json +1 -1
  35. package/dist/theme-packs/ledger/pack.css +1 -1
  36. package/dist/theme-packs/manuscript/meta.json +1 -1
  37. package/dist/theme-packs/manuscript/pack.css +1 -1
  38. package/dist/theme-packs/matcha/meta.json +1 -1
  39. package/dist/theme-packs/matcha/pack.css +2 -2
  40. package/dist/theme-packs/nocturne/meta.json +1 -1
  41. package/dist/theme-packs/nocturne/pack.css +2 -2
  42. package/dist/theme-packs/observatory/meta.json +1 -1
  43. package/dist/theme-packs/observatory/pack.css +2 -2
  44. package/dist/theme-packs/onyx/meta.json +1 -1
  45. package/dist/theme-packs/onyx/pack.css +2 -2
  46. package/dist/theme-packs/phosphor/meta.json +1 -1
  47. package/dist/theme-packs/phosphor/pack.css +2 -2
  48. package/dist/theme-packs/riso/meta.json +1 -1
  49. package/dist/theme-packs/riso/pack.css +2 -2
  50. package/dist/theme-packs/sakura/meta.json +1 -1
  51. package/dist/theme-packs/sakura/pack.css +2 -2
  52. package/dist/theme-packs/scandi/meta.json +1 -1
  53. package/dist/theme-packs/scandi/pack.css +1 -1
  54. package/dist/theme-packs/solar/meta.json +1 -1
  55. package/dist/theme-packs/solar/pack.css +1 -1
  56. package/dist/theme-packs/sumi/meta.json +1 -1
  57. package/dist/theme-packs/sumi/pack.css +2 -2
  58. package/dist/theme-packs/swissgrid/meta.json +1 -1
  59. package/dist/theme-packs/swissgrid/pack.css +1 -1
  60. package/dist/theme-packs/timberline/meta.json +1 -1
  61. package/dist/theme-packs/timberline/pack.css +2 -2
  62. package/dist/theme-packs/washi/meta.json +1 -1
  63. package/dist/theme-packs/washi/pack.css +2 -2
  64. package/eject/sidebar/client-data.ts +68 -0
  65. package/eject/sidebar/index.ts +2 -0
  66. package/package.json +8 -8
package/CHANGELOG.md CHANGED
@@ -8,6 +8,23 @@ The format is based on Keep a Changelog, and release notes are generated from th
8
8
 
9
9
  No unreleased changes.
10
10
 
11
+ ## [6.0.2] - 2026-10-12
12
+
13
+ ### Other Changes
14
+
15
+ - Requires zfb 4.3.2: the `@takazudo/zfb`, `zfb-runtime`, `zfb-md-wasm` and `zfb-adapter-cloudflare` peer floors move from `^4.3.1` to `^4.3.2`. zfb 4.3.2 makes zudo-wind honor `wind.sources.ignoreAttributes` for MDX components that come after frontmatter or prose, so markup inside ignored attributes such as the `html` prop of `HtmlPreview` no longer leaks class candidates into the Wind scan. Upgrade the zfb family to 4.3.2 together with this release. (a0997719)
16
+
17
+ ## [6.0.1] - 2026-10-12
18
+
19
+ ### Features
20
+
21
+ - Add `--zdc-header-logo-font` and `--zdc-header-logo-weight` to style the site-name anchor independently of navigation and controls. Shipped theme packs honor both tokens while preserving their existing defaults ([#4533](https://github.com/zudolab/zudo-doc/issues/4533)). (96243bc6)
22
+
23
+ ### Bug Fixes
24
+
25
+ - `defineChromeBindings({ mdxExtras })` accepts MDX components with their own required typed props again (for example `(props: { html: string }) => Child`), fixing a 6.0.0 TS2322 regression. Entries must still be components returning a renderable `Child`; fixed chrome slots keep their call-side prop checks ([#4530](https://github.com/zudolab/zudo-doc/issues/4530)). (bd090491)
26
+ - The native sidebar islands (`SidebarToggle`, `SidebarTree`) no longer serialize page descriptions into their client payload, shrinking each page's hydration data. The new `toSidebarClientData(nodes, navigation?)` helper in `@takazudo/zudo-doc/sidebar` gives custom island hosts the same projection. Custom `sidebarNodes` arrays are now copied rather than passed by identity ([#4536](https://github.com/zudolab/zudo-doc/issues/4536)). (a1e01aad)
27
+
11
28
  ## [6.0.0] - 2026-10-11
12
29
 
13
30
  ### Breaking Changes
package/README.md CHANGED
@@ -109,7 +109,7 @@ If your project renders **semi-trusted or user-submitted** HTML in a preview, ov
109
109
 
110
110
  **6.0.0** is the coordinated major release of `@takazudo/zudo-doc`,
111
111
  `@takazudo/zudo-doc-history-server` and `create-zudo-doc`. It targets the
112
- published **zfb 4.3.1** family (peer floor **^4.3.1**).
112
+ published **zfb 4.3.2** family (peer floor **^4.3.2**).
113
113
  [Upstream #4097](https://github.com/Takazudo/zudo-front-builder/issues/4097) is
114
114
  resolved; its strict published 4.3.1 consumer control passed 3/3 with no skips or
115
115
  retries in the [source-bound verification](../../docs/findings/zfb-4.3.1/verification.md).
package/dist/catalog.js CHANGED
@@ -3,7 +3,7 @@
3
3
  // validated src/theme-packs/<slug>/meta.json registry. Re-run `pnpm build`
4
4
  // to regenerate after adding, removing, or editing a theme pack.
5
5
  // Catalog schemaVersion 2 is distinct from each pack's meta.json schemaVersion 1.
6
- const catalog = {"schemaVersion":2,"packs":[{"slug":"default","meta":{"schemaVersion":1,"slug":"default","name":"Default","description":"The stock zudo-doc look. No pack stylesheet is loaded — your project's configured color scheme and fonts render unchanged.","mode":"dark","version":"1.0.0","fonts":{"sans":"System","mono":"System","loaded":[]},"preview":{"light":{"bg":"oklch(0.965 0.004 65)","fg":"oklch(0.185 0.005 65)","accent":"oklch(0.470 0.120 56)","syntax":{"keyword":"oklch(0.470 0.120 56)","string":"oklch(0.470 0.140 145)","comment":"oklch(0.480 0.008 65)","callable":"oklch(0.485 0.122 245)"}},"dark":{"bg":"oklch(0.185 0.005 65)","fg":"oklch(0.965 0.004 65)","accent":"oklch(0.700 0.158 62)","syntax":{"keyword":"oklch(0.700 0.158 62)","string":"oklch(0.680 0.145 145)","comment":"oklch(0.705 0.008 65)","callable":"oklch(0.680 0.130 245)"}}}},"hasStylesheet":false},{"slug":"academia","meta":{"schemaVersion":1,"slug":"academia","name":"Academia","description":"A LaTeX paper for the web — white page, Computer-Modern-black ink, hyperref navy links, numbered theorem admonitions, booktabs tables. Dark mode is a scholarly slate.","mode":"light","version":"1.0.2","fonts":{"sans":"Source Serif 4","mono":"Courier Prime","loaded":["Source Serif 4","Courier Prime"]},"preview":{"light":{"bg":"#ffffff","fg":"#141414","accent":"#1c3d8f","syntax":{"keyword":"#1c3d8f","string":"#93262a","comment":"#2e6b2e","callable":"#295e80"}},"dark":{"bg":"#1d222b","fg":"#e7eaf0","accent":"#97b8ee","syntax":{"keyword":"#a3c0f2","string":"#e0a09a","comment":"#8cbc8c","callable":"#85c2da"}}}},"hasStylesheet":true},{"slug":"bauhaus","meta":{"schemaVersion":1,"slug":"bauhaus","name":"Bauhaus","description":"Primary triad as structure — gallery white, near-black ink, and red, yellow, blue doing structural work: circle, triangle, square markers, thick geometric rules, zero radius.","mode":"light","version":"1.0.0","fonts":{"sans":"Jost","mono":"Space Mono","display":"Archivo Black","loaded":["Jost","Archivo Black","Space Mono"]},"preview":{"light":{"bg":"#ffffff","fg":"#141414","accent":"#b3231b","syntax":{"keyword":"#b3231b","string":"#6d5800","comment":"#63615a","callable":"#1c4bbe"}},"dark":{"bg":"#18181b","fg":"#f0efe9","accent":"#ff7d70","syntax":{"keyword":"#ff7d70","string":"#e9ce6a","comment":"#999689","callable":"#8fb0ff"}}}},"hasStylesheet":true},{"slug":"beacon","meta":{"schemaVersion":1,"slug":"beacon","name":"Beacon","description":"WCAG-AAA high contrast — 7:1+ ink everywhere, 3px focus rings, always-underlined links. Clarity as beauty.","mode":"light","version":"1.0.1","fonts":{"sans":"Atkinson Hyperlegible","mono":"Atkinson Hyperlegible Mono","loaded":["Atkinson Hyperlegible","Atkinson Hyperlegible Mono"]},"preview":{"light":{"bg":"#ffffff","fg":"#000000","accent":"#0044cc","syntax":{"keyword":"#0044cc","string":"#a50000","comment":"#595959","callable":"#00287a"}},"dark":{"bg":"#000000","fg":"#ffffff","accent":"#6db3ff","syntax":{"keyword":"#6db3ff","string":"#ff8f8f","comment":"#b3b3b3","callable":"#a8d1ff"}}}},"hasStylesheet":true},{"slug":"blueprint","meta":{"schemaVersion":1,"slug":"blueprint","name":"Blueprint","description":"Cyanotype drafting sheet — pale-cyan linework on prussian grid paper, title-block caps, dashed rules, mono-caps labels. Light mode is the vellum original.","mode":"dark","version":"1.0.1","fonts":{"sans":"Inter","mono":"IBM Plex Mono","display":"Josefin Sans","loaded":["Inter","Josefin Sans","IBM Plex Mono"]},"preview":{"light":{"bg":"oklch(0.965 0.012 235)","fg":"oklch(0.28 0.05 253)","accent":"oklch(0.44 0.095 235)","syntax":{"keyword":"oklch(0.46 0.1 80)","string":"oklch(0.43 0.085 195)","comment":"oklch(0.5 0.03 248)","callable":"oklch(0.44 0.09 235)"}},"dark":{"bg":"oklch(0.27 0.055 252)","fg":"oklch(0.965 0.01 220)","accent":"oklch(0.86 0.09 205)","syntax":{"keyword":"oklch(0.87 0.12 95)","string":"oklch(0.83 0.1 185)","comment":"oklch(0.72 0.032 235)","callable":"oklch(0.83 0.085 215)"}}}},"hasStylesheet":true},{"slug":"botanica","meta":{"schemaVersion":1,"slug":"botanica","name":"Botanica","description":"A vintage botanical plate — herbarium cream, deep green ink, engraved double rules, Latin small-caps plate labels.","mode":"light","version":"1.0.0","fonts":{"sans":"Crimson Pro","mono":"Courier Prime","display":"Cormorant Garamond","loaded":["Cormorant Garamond","Crimson Pro","Courier Prime"]},"preview":{"light":{"bg":"oklch(0.956 0.02 92)","fg":"oklch(0.29 0.03 95)","accent":"oklch(0.42 0.09 152)","syntax":{"keyword":"oklch(0.4 0.075 60)","string":"oklch(0.43 0.095 150)","comment":"oklch(0.48 0.04 95)","callable":"oklch(0.43 0.075 205)"}},"dark":{"bg":"oklch(0.215 0.022 160)","fg":"oklch(0.92 0.02 95)","accent":"oklch(0.78 0.09 148)","syntax":{"keyword":"oklch(0.82 0.085 80)","string":"oklch(0.8 0.095 145)","comment":"oklch(0.7 0.03 110)","callable":"oklch(0.78 0.075 200)"}}}},"hasStylesheet":true},{"slug":"broadsheet","meta":{"schemaVersion":1,"slug":"broadsheet","name":"Broadsheet","description":"Newspaper editorial — Playfair masthead, Oxford ink rules, a red drop cap, and a night-edition dark mode.","mode":"light","version":"1.0.2","fonts":{"sans":"Source Serif 4","mono":"Courier Prime","display":"Playfair Display","loaded":["Playfair Display","Source Serif 4","Courier Prime"]},"preview":{"light":{"bg":"oklch(0.955 0.012 92)","fg":"oklch(0.205 0.012 80)","accent":"oklch(0.455 0.155 27)","syntax":{"keyword":"oklch(0.445 0.155 27)","string":"oklch(0.45 0.075 60)","comment":"oklch(0.5 0.016 78)","callable":"oklch(0.42 0.09 252)"}},"dark":{"bg":"oklch(0.185 0.012 75)","fg":"oklch(0.935 0.015 90)","accent":"oklch(0.7 0.145 27)","syntax":{"keyword":"oklch(0.72 0.14 27)","string":"oklch(0.79 0.07 70)","comment":"oklch(0.7 0.02 85)","callable":"oklch(0.74 0.08 248)"}}}},"hasStylesheet":true},{"slug":"brutalist","meta":{"schemaVersion":1,"slug":"brutalist","name":"Brutalist","description":"Raw concrete web — stark black on white, 4px slab borders, zero radius, hazard-orange tape. Structure you can see.","mode":"light","version":"1.0.3","fonts":{"sans":"Space Grotesk","mono":"IBM Plex Mono","display":"Archivo Black","loaded":["Archivo Black","Space Grotesk","IBM Plex Mono"]},"preview":{"light":{"bg":"#ffffff","fg":"#000000","accent":"#c2410c","syntax":{"keyword":"#c2410c","string":"#9a3412","comment":"#767676","callable":"#000000"}},"dark":{"bg":"#0d0d0d","fg":"#f5f5f5","accent":"#ff6a1f","syntax":{"keyword":"#ff7a2e","string":"#ffb38a","comment":"#878787","callable":"#ffffff"}}}},"hasStylesheet":true},{"slug":"drift","meta":{"schemaVersion":1,"slug":"drift","name":"Drift","description":"Floaty slate-blue comfort dark for long reading — soft glows in place of borders, gentle elevation, relaxed Plex type.","mode":"dark","version":"1.0.2","fonts":{"sans":"IBM Plex Sans","mono":"IBM Plex Mono","loaded":["IBM Plex Sans","IBM Plex Mono"]},"preview":{"light":{"bg":"#edf2f6","fg":"#24303d","accent":"#236799","syntax":{"keyword":"#49539c","string":"#2b754f","comment":"#596673","callable":"#00688d"}},"dark":{"bg":"#181f26","fg":"#d6dee4","accent":"#6cafd9","syntax":{"keyword":"#9caeee","string":"#88cba4","comment":"#8494a4","callable":"#75c6e1"}}}},"hasStylesheet":true},{"slug":"eink","meta":{"schemaVersion":1,"slug":"eink","name":"E-Ink","description":"E-reader grayscale — warm paper, near-black ink, shadowless hairline chrome, zero radius. Code is told by weight, slant, and gray value; only diffs keep a trace of ink-blue and ink-red.","mode":"light","version":"1.0.0","fonts":{"sans":"EB Garamond","mono":"Courier Prime","loaded":["EB Garamond","Courier Prime"]},"preview":{"light":{"bg":"oklch(0.956 0.007 90)","fg":"oklch(0.24 0.012 85)","accent":"oklch(0.155 0.01 85)","syntax":{"keyword":"oklch(0.18 0.01 85)","string":"oklch(0.46 0.012 85)","comment":"oklch(0.505 0.01 85)","callable":"oklch(0.31 0.012 85)"}},"dark":{"bg":"oklch(0.215 0.008 80)","fg":"oklch(0.885 0.012 85)","accent":"oklch(0.955 0.008 85)","syntax":{"keyword":"oklch(0.96 0.008 85)","string":"oklch(0.715 0.012 85)","comment":"oklch(0.645 0.01 85)","callable":"oklch(0.82 0.01 85)"}}}},"hasStylesheet":true},{"slug":"fjord","meta":{"schemaVersion":1,"slug":"fjord","name":"Fjord","description":"Polar-night blue under a faint aurora — frost-cyan accents, icy borders, snow-white text. Cold nordic calm.","mode":"dark","version":"1.0.2","fonts":{"sans":"Inter","mono":"JetBrains Mono","loaded":["Inter","JetBrains Mono"]},"preview":{"light":{"bg":"oklch(0.971 0.008 230)","fg":"oklch(0.255 0.03 255)","accent":"oklch(0.455 0.092 205)","syntax":{"keyword":"oklch(0.455 0.105 250)","string":"oklch(0.495 0.105 165)","comment":"oklch(0.51 0.03 245)","callable":"oklch(0.445 0.098 202)"}},"dark":{"bg":"oklch(0.232 0.024 255)","fg":"oklch(0.93 0.012 235)","accent":"oklch(0.79 0.095 195)","syntax":{"keyword":"oklch(0.76 0.095 242)","string":"oklch(0.8 0.105 158)","comment":"oklch(0.63 0.03 245)","callable":"oklch(0.815 0.095 195)"}}}},"hasStylesheet":true},{"slug":"foundry","meta":{"schemaVersion":1,"slug":"foundry","name":"Foundry","description":"GitHub-neutral baseline — white paper, near-black ink, Primer-blue links, quiet gray rules. Restraint, perfected.","mode":"light","version":"1.0.2","fonts":{"sans":"Inter","mono":"System","loaded":["Inter"]},"preview":{"light":{"bg":"#ffffff","fg":"#1f2328","accent":"#0969da","syntax":{"keyword":"#cf222e","string":"#0a3069","comment":"#6e7781","callable":"#8250df"}},"dark":{"bg":"#0d1117","fg":"#e6edf3","accent":"#4493f8","syntax":{"keyword":"#ff7b72","string":"#a5d6ff","comment":"#8b949e","callable":"#d2a8ff"}}}},"hasStylesheet":true},{"slug":"futura-editorial","meta":{"schemaVersion":1,"slug":"futura-editorial","name":"Futura Editorial","description":"Normal-weight geometric Futura headings over Noto Sans body — clean white, near-black ink, one restrained red accent.","mode":"light","version":"1.0.1","fonts":{"sans":"Noto Sans","mono":"Space Mono","display":"Jost","loaded":["Jost","Noto Sans","Space Mono"]},"preview":{"light":{"bg":"oklch(1 0 0)","fg":"oklch(0.17 0 0)","accent":"oklch(0.505 0.18 28)","syntax":{"keyword":"oklch(0.505 0.18 28)","string":"oklch(0.47 0.09 160)","comment":"oklch(0.52 0 0)","callable":"oklch(0.45 0.1 250)"}},"dark":{"bg":"oklch(0.165 0 0)","fg":"oklch(0.935 0 0)","accent":"oklch(0.72 0.15 29)","syntax":{"keyword":"oklch(0.72 0.15 29)","string":"oklch(0.76 0.1 160)","comment":"oklch(0.63 0 0)","callable":"oklch(0.73 0.095 250)"}}}},"hasStylesheet":true},{"slug":"hearth","meta":{"schemaVersion":1,"slug":"hearth","name":"Hearth","description":"Warm cream & brick-red fireside docs — Fraunces headings, amber code blocks, ember-glow dark mode.","mode":"light","version":"1.0.3","fonts":{"sans":"Nunito","mono":"Spline Sans Mono","display":"Fraunces","loaded":["Fraunces","Nunito","Spline Sans Mono"]},"preview":{"light":{"bg":"oklch(0.958 0.02 85)","fg":"oklch(0.255 0.028 40)","accent":"oklch(0.49 0.145 31)","syntax":{"keyword":"oklch(0.48 0.148 30)","string":"oklch(0.47 0.1 135)","comment":"oklch(0.51 0.035 60)","callable":"oklch(0.45 0.092 245)"}},"dark":{"bg":"oklch(0.215 0.022 45)","fg":"oklch(0.915 0.02 80)","accent":"oklch(0.735 0.128 45)","syntax":{"keyword":"oklch(0.745 0.138 40)","string":"oklch(0.785 0.1 130)","comment":"oklch(0.645 0.032 65)","callable":"oklch(0.765 0.075 235)"}}}},"hasStylesheet":true},{"slug":"hollow","meta":{"schemaVersion":1,"slug":"hollow","name":"Hollow","description":"Dark violet space — neon pink headings, violet links, a quiet starfield, and razor-square midnight chrome.","mode":"dark","version":"1.0.2","fonts":{"sans":"Space Grotesk","mono":"Space Mono","loaded":["Space Grotesk","Space Mono"]},"preview":{"light":{"bg":"oklch(0.962 0.012 300)","fg":"oklch(0.24 0.045 295)","accent":"oklch(0.45 0.17 300)","syntax":{"keyword":"oklch(0.53 0.2 348)","string":"oklch(0.45 0.1 195)","comment":"oklch(0.51 0.035 292)","callable":"oklch(0.46 0.16 300)"}},"dark":{"bg":"oklch(0.155 0.035 295)","fg":"oklch(0.93 0.015 295)","accent":"oklch(0.74 0.14 300)","syntax":{"keyword":"oklch(0.76 0.17 347)","string":"oklch(0.83 0.1 190)","comment":"oklch(0.62 0.045 292)","callable":"oklch(0.76 0.13 300)"}}}},"hasStylesheet":true},{"slug":"ledger","meta":{"schemaVersion":1,"slug":"ledger","name":"Ledger","description":"Cream academic serif in the Tufte tradition — warm paper, ink prose, oxblood links, hairline rules, quiet code.","mode":"light","version":"1.0.1","fonts":{"sans":"Crimson Pro","mono":"IBM Plex Mono","loaded":["Crimson Pro","IBM Plex Mono"]},"preview":{"light":{"bg":"#fffff8","fg":"#16130e","accent":"#8b1a1a","syntax":{"keyword":"#8b1a1a","string":"#4e6328","comment":"#766b5c","callable":"#33586e"}},"dark":{"bg":"#191510","fg":"#e9e2d0","accent":"#d68a75","syntax":{"keyword":"#e2907c","string":"#a8b47c","comment":"#948a77","callable":"#93b4cd"}}}},"hasStylesheet":true},{"slug":"manuscript","meta":{"schemaVersion":1,"slug":"manuscript","name":"Manuscript","description":"A quiet Garamond book page — warm paper, soft ink, sepia rubrication, small-caps subheads, fleuron section marks.","mode":"light","version":"1.0.1","fonts":{"sans":"EB Garamond","mono":"Courier Prime","loaded":["EB Garamond","Courier Prime"]},"preview":{"light":{"bg":"oklch(0.963 0.013 85)","fg":"oklch(0.245 0.018 60)","accent":"oklch(0.44 0.095 55)","syntax":{"keyword":"oklch(0.455 0.13 30)","string":"oklch(0.44 0.085 150)","comment":"oklch(0.5 0.03 70)","callable":"oklch(0.435 0.09 275)"}},"dark":{"bg":"oklch(0.215 0.015 65)","fg":"oklch(0.885 0.022 80)","accent":"oklch(0.735 0.095 70)","syntax":{"keyword":"oklch(0.72 0.115 35)","string":"oklch(0.745 0.085 150)","comment":"oklch(0.645 0.03 75)","callable":"oklch(0.745 0.07 275)"}}}},"hasStylesheet":true},{"slug":"matcha","meta":{"schemaVersion":1,"slug":"matcha","name":"Matcha","description":"Green tea ceremony — deep matcha on warm cream, mincho headings, zen whitespace, tea-foam surfaces in both modes.","mode":"light","version":"1.0.2","fonts":{"sans":"Zen Kaku Gothic New","mono":"M PLUS 1 Code","display":"Shippori Mincho","loaded":["Zen Kaku Gothic New","Shippori Mincho","M PLUS 1 Code"]},"preview":{"light":{"bg":"oklch(0.973 0.012 106)","fg":"oklch(0.245 0.018 148)","accent":"oklch(0.435 0.105 142)","syntax":{"keyword":"oklch(0.418 0.105 150)","string":"oklch(0.47 0.092 106)","comment":"oklch(0.512 0.034 130)","callable":"oklch(0.438 0.082 196)"}},"dark":{"bg":"oklch(0.205 0.016 152)","fg":"oklch(0.938 0.018 106)","accent":"oklch(0.79 0.115 138)","syntax":{"keyword":"oklch(0.782 0.118 148)","string":"oklch(0.822 0.102 108)","comment":"oklch(0.668 0.034 130)","callable":"oklch(0.772 0.088 192)"}}}},"hasStylesheet":true},{"slug":"nocturne","meta":{"schemaVersion":1,"slug":"nocturne","name":"Nocturne","description":"Purple midnight — velvet aubergine depths, lavender links, and muted gold hairlines. Elegant, never neon.","mode":"dark","version":"1.0.2","fonts":{"sans":"Manrope","mono":"IBM Plex Mono","display":"Cormorant Garamond","loaded":["Cormorant Garamond","Manrope","IBM Plex Mono"]},"preview":{"light":{"bg":"oklch(0.958 0.012 300)","fg":"oklch(0.245 0.05 312)","accent":"oklch(0.455 0.15 295)","syntax":{"keyword":"oklch(0.46 0.16 295)","string":"oklch(0.5 0.105 85)","comment":"oklch(0.5 0.042 305)","callable":"oklch(0.455 0.125 265)"}},"dark":{"bg":"oklch(0.155 0.03 310)","fg":"oklch(0.922 0.018 300)","accent":"oklch(0.765 0.105 292)","syntax":{"keyword":"oklch(0.772 0.128 293)","string":"oklch(0.8 0.108 88)","comment":"oklch(0.645 0.045 302)","callable":"oklch(0.77 0.095 262)"}}}},"hasStylesheet":true},{"slug":"observatory","meta":{"schemaVersion":1,"slug":"observatory","name":"Observatory","description":"Night-sky atlas: star-field depth, constellation-line rules, nebula violet and comet gold over astronomer's navy.","mode":"dark","version":"1.0.3","fonts":{"sans":"Jost","mono":"Space Mono","display":"Josefin Sans","loaded":["Josefin Sans","Jost","Space Mono"]},"preview":{"light":{"bg":"oklch(0.965 0.012 255)","fg":"oklch(0.235 0.045 268)","accent":"oklch(0.47 0.1 75)","syntax":{"keyword":"oklch(0.46 0.14 300)","string":"oklch(0.45 0.1 162)","comment":"oklch(0.5 0.03 265)","callable":"oklch(0.46 0.11 250)"}},"dark":{"bg":"oklch(0.155 0.028 268)","fg":"oklch(0.93 0.015 255)","accent":"oklch(0.82 0.13 86)","syntax":{"keyword":"oklch(0.76 0.118 300)","string":"oklch(0.8 0.112 162)","comment":"oklch(0.61 0.038 265)","callable":"oklch(0.78 0.095 240)"}}}},"hasStylesheet":true},{"slug":"onyx","meta":{"schemaVersion":1,"slug":"onyx","name":"Onyx","description":"Luxury noir — jet black, champagne serif headings, and a single gold hairline accent. Watch-brand restraint.","mode":"dark","version":"1.0.3","fonts":{"sans":"Jost","mono":"IBM Plex Mono","display":"Cormorant Garamond","loaded":["Cormorant Garamond","Jost","IBM Plex Mono"]},"preview":{"light":{"bg":"oklch(0.972 0.005 85)","fg":"oklch(0.22 0.012 80)","accent":"oklch(0.5 0.105 80)","syntax":{"keyword":"oklch(0.51 0.105 82)","string":"oklch(0.47 0.07 155)","comment":"oklch(0.5 0.015 85)","callable":"oklch(0.45 0.045 250)"}},"dark":{"bg":"oklch(0.145 0.003 80)","fg":"oklch(0.92 0.022 88)","accent":"oklch(0.79 0.115 88)","syntax":{"keyword":"oklch(0.8 0.115 88)","string":"oklch(0.78 0.07 155)","comment":"oklch(0.62 0.02 85)","callable":"oklch(0.82 0.04 250)"}}}},"hasStylesheet":true},{"slug":"phosphor","meta":{"schemaVersion":1,"slug":"phosphor","name":"Phosphor","description":"Green CRT terminal — phosphor glow, scanlines, inverse-video nav, monospace everything.","mode":"dark","version":"1.0.1","fonts":{"sans":"JetBrains Mono","mono":"JetBrains Mono","display":"VT323","loaded":["VT323","JetBrains Mono"]},"preview":{"light":{"bg":"oklch(0.955 0.014 150)","fg":"oklch(0.28 0.058 150)","accent":"oklch(0.42 0.13 150)","syntax":{"keyword":"oklch(0.4 0.13 148)","string":"oklch(0.39 0.095 165)","comment":"oklch(0.49 0.05 150)","callable":"oklch(0.43 0.095 200)"}},"dark":{"bg":"oklch(0.135 0.014 150)","fg":"oklch(0.845 0.145 150)","accent":"oklch(0.87 0.215 148)","syntax":{"keyword":"oklch(0.9 0.21 148)","string":"oklch(0.9 0.12 165)","comment":"oklch(0.58 0.062 150)","callable":"oklch(0.83 0.125 200)"}}}},"hasStylesheet":true},{"slug":"riso","meta":{"schemaVersion":1,"slug":"riso","name":"Riso","description":"Risograph duotone print — warm paper, two inks (riso blue + fluorescent coral), misregistered offset shadows, and a soft linear paper grain.","mode":"light","version":"1.0.0","fonts":{"sans":"Space Grotesk","mono":"Space Mono","display":"Archivo Black","loaded":["Space Grotesk","Archivo Black","Space Mono"]},"preview":{"light":{"bg":"#f9f3e5","fg":"#1d3345","accent":"#0d5c94","syntax":{"keyword":"#a02310","string":"#0d5e6e","comment":"#4d5c66","callable":"#0b5b9b"}},"dark":{"bg":"#101d28","fg":"#f1e9d8","accent":"#58b8e8","syntax":{"keyword":"#ff8d72","string":"#66d4cf","comment":"#93a4ad","callable":"#5aaef5"}}}},"hasStylesheet":true},{"slug":"sakura","meta":{"schemaVersion":1,"slug":"sakura","name":"Sakura","description":"Cherry-blossom pastels — blush-white paper, plum ink, and rose accents on petal-soft corners; dark mode is yozakura, night blossoms under lantern-pink light.","mode":"light","version":"1.0.1","fonts":{"sans":"Nunito","mono":"M PLUS 1 Code","display":"Shippori Mincho","loaded":["Nunito","Shippori Mincho","M PLUS 1 Code"]},"preview":{"light":{"bg":"oklch(0.977 0.009 350)","fg":"oklch(0.29 0.055 340)","accent":"oklch(0.5 0.168 358)","syntax":{"keyword":"oklch(0.5 0.168 358)","string":"oklch(0.49 0.115 150)","comment":"oklch(0.5 0.04 340)","callable":"oklch(0.49 0.135 300)"}},"dark":{"bg":"oklch(0.215 0.03 330)","fg":"oklch(0.935 0.014 350)","accent":"oklch(0.78 0.115 355)","syntax":{"keyword":"oklch(0.79 0.125 355)","string":"oklch(0.78 0.115 150)","comment":"oklch(0.71 0.038 345)","callable":"oklch(0.78 0.105 300)"}}}},"hasStylesheet":true},{"slug":"scandi","meta":{"schemaVersion":1,"slug":"scandi","name":"Scandi","description":"Hygge minimalism — oat linen, sage & clay, pill nav actives and 8px corners; night mode is warm charcoal lit by candle amber.","mode":"light","version":"1.0.0","fonts":{"sans":"Manrope","mono":"Spline Sans Mono","loaded":["Manrope","Spline Sans Mono"]},"preview":{"light":{"bg":"oklch(0.963 0.012 83)","fg":"oklch(0.28 0.02 55)","accent":"oklch(0.44 0.08 152)","syntax":{"keyword":"oklch(0.47 0.105 40)","string":"oklch(0.45 0.09 150)","comment":"oklch(0.5 0.02 70)","callable":"oklch(0.45 0.08 240)"}},"dark":{"bg":"oklch(0.235 0.015 55)","fg":"oklch(0.92 0.012 85)","accent":"oklch(0.82 0.105 75)","syntax":{"keyword":"oklch(0.76 0.1 45)","string":"oklch(0.78 0.09 150)","comment":"oklch(0.66 0.02 75)","callable":"oklch(0.75 0.075 238)"}}}},"hasStylesheet":true},{"slug":"solar","meta":{"schemaVersion":1,"slug":"solar","name":"Solar","description":"Solarized precision — low-eyestrain paper tones, blue/cyan/orange accents, mono labels, technical calm in both modes.","mode":"light","version":"1.0.1","fonts":{"sans":"Source Sans 3","mono":"Source Code Pro","loaded":["Source Sans 3","Source Code Pro"]},"preview":{"light":{"bg":"#fdf6e3","fg":"#4f6369","accent":"#1c6a9f","syntax":{"keyword":"#606f00","string":"#12746c","comment":"#586b72","callable":"#1d6da3"}},"dark":{"bg":"#002b36","fg":"#93a1a1","accent":"#53a6df","syntax":{"keyword":"#8ea300","string":"#2caaa0","comment":"#899da4","callable":"#49a0dd"}}}},"hasStylesheet":true},{"slug":"sumi","meta":{"schemaVersion":1,"slug":"sumi","name":"Sumi","description":"Sumi-e ink on washi — bold mincho brush headings, deep black strokes, one vermillion hanko seal accent.","mode":"light","version":"1.0.3","fonts":{"sans":"Zen Kaku Gothic New","mono":"IBM Plex Mono","display":"Shippori Mincho B1","loaded":["Shippori Mincho B1","Zen Kaku Gothic New","IBM Plex Mono"]},"preview":{"light":{"bg":"#f7f4ec","fg":"#1b1a18","accent":"#b8232e","syntax":{"keyword":"#b8232e","string":"#6a6156","comment":"#726b5e","callable":"#433d35"}},"dark":{"bg":"#161514","fg":"#ece7db","accent":"#ea6a72","syntax":{"keyword":"#ee7a81","string":"#c8bfa6","comment":"#837d72","callable":"#f4efe4"}}}},"hasStylesheet":true},{"slug":"swissgrid","meta":{"schemaVersion":1,"slug":"swissgrid","name":"Swissgrid","description":"International Typographic Style — grid discipline, black on white, one hot Swiss-red accent, oversized section numbers.","mode":"light","version":"1.0.1","fonts":{"sans":"Inter","mono":"IBM Plex Mono","display":"Inter Tight","loaded":["Inter","Inter Tight","IBM Plex Mono"]},"preview":{"light":{"bg":"#ffffff","fg":"#0a0a0a","accent":"#e60000","syntax":{"keyword":"#d40000","string":"#3f3f3f","comment":"#6b6b6b","callable":"#0a0a0a"}},"dark":{"bg":"#0c0c0c","fg":"#f2f2f2","accent":"#ff4d4d","syntax":{"keyword":"#ff4d4d","string":"#c9c9c9","comment":"#8c8c8c","callable":"#ffffff"}}}},"hasStylesheet":true},{"slug":"tidepool","meta":{"schemaVersion":1,"slug":"tidepool","name":"Tidepool","description":"Marine teal dark — deep-sea teal surfaces, seafoam text, bioluminescent aqua accents, kelp-green success, coral danger. Light mode is the same pool at low tide.","mode":"dark","version":"1.0.0","fonts":{"sans":"Space Grotesk","mono":"JetBrains Mono","loaded":["Space Grotesk","JetBrains Mono"]},"preview":{"light":{"bg":"oklch(0.966 0.013 165)","fg":"oklch(0.27 0.045 200)","accent":"oklch(0.43 0.073 195)","syntax":{"keyword":"oklch(0.42 0.071 193)","string":"oklch(0.42 0.11 150)","comment":"oklch(0.44 0.03 200)","callable":"oklch(0.44 0.089 232)"}},"dark":{"bg":"oklch(0.235 0.032 205)","fg":"oklch(0.92 0.028 180)","accent":"oklch(0.82 0.13 185)","syntax":{"keyword":"oklch(0.84 0.14 183)","string":"oklch(0.83 0.14 152)","comment":"oklch(0.69 0.035 195)","callable":"oklch(0.8 0.1 228)"}}}},"hasStylesheet":true},{"slug":"timberline","meta":{"schemaVersion":1,"slug":"timberline","name":"Timberline","description":"Forest cabin after dark — pine & umber planks, cream prose, and matte lantern-amber accents; light mode is the same lodge at morning.","mode":"dark","version":"1.0.1","fonts":{"sans":"Source Sans 3","mono":"JetBrains Mono","display":"Fraunces","loaded":["Fraunces","Source Sans 3","JetBrains Mono"]},"preview":{"light":{"bg":"oklch(0.962 0.016 90)","fg":"oklch(0.27 0.032 155)","accent":"oklch(0.465 0.11 62)","syntax":{"keyword":"oklch(0.475 0.11 70)","string":"oklch(0.46 0.09 145)","comment":"oklch(0.49 0.035 140)","callable":"oklch(0.45 0.085 235)"}},"dark":{"bg":"oklch(0.207 0.02 60)","fg":"oklch(0.928 0.02 88)","accent":"oklch(0.78 0.125 72)","syntax":{"keyword":"oklch(0.8 0.125 80)","string":"oklch(0.79 0.1 135)","comment":"oklch(0.66 0.035 110)","callable":"oklch(0.78 0.075 220)"}}}},"hasStylesheet":true},{"slug":"washi","meta":{"schemaVersion":1,"slug":"washi","name":"Washi","description":"Warm washi paper, sumi ink, and ai-iro indigo seals — quiet Japanese stationery for calm documentation.","mode":"light","version":"1.0.3","fonts":{"sans":"Zen Kaku Gothic New","mono":"M PLUS 1 Code","display":"Shippori Mincho","loaded":["Zen Kaku Gothic New","Shippori Mincho","M PLUS 1 Code"]},"preview":{"light":{"bg":"#f6f1e4","fg":"#2b2822","accent":"#274a78","syntax":{"keyword":"#274a78","string":"#41653a","comment":"#6f6654","callable":"#963f34"}},"dark":{"bg":"#1b212c","fg":"#eae3d2","accent":"#8ab0dd","syntax":{"keyword":"#97b9e6","string":"#a9cb90","comment":"#8894a4","callable":"#e0a49a"}}}},"hasStylesheet":true}]};
6
+ const catalog = {"schemaVersion":2,"packs":[{"slug":"default","meta":{"schemaVersion":1,"slug":"default","name":"Default","description":"The stock zudo-doc look. No pack stylesheet is loaded — your project's configured color scheme and fonts render unchanged.","mode":"dark","version":"1.0.0","fonts":{"sans":"System","mono":"System","loaded":[]},"preview":{"light":{"bg":"oklch(0.965 0.004 65)","fg":"oklch(0.185 0.005 65)","accent":"oklch(0.470 0.120 56)","syntax":{"keyword":"oklch(0.470 0.120 56)","string":"oklch(0.470 0.140 145)","comment":"oklch(0.480 0.008 65)","callable":"oklch(0.485 0.122 245)"}},"dark":{"bg":"oklch(0.185 0.005 65)","fg":"oklch(0.965 0.004 65)","accent":"oklch(0.700 0.158 62)","syntax":{"keyword":"oklch(0.700 0.158 62)","string":"oklch(0.680 0.145 145)","comment":"oklch(0.705 0.008 65)","callable":"oklch(0.680 0.130 245)"}}}},"hasStylesheet":false},{"slug":"academia","meta":{"schemaVersion":1,"slug":"academia","name":"Academia","description":"A LaTeX paper for the web — white page, Computer-Modern-black ink, hyperref navy links, numbered theorem admonitions, booktabs tables. Dark mode is a scholarly slate.","mode":"light","version":"1.0.3","fonts":{"sans":"Source Serif 4","mono":"Courier Prime","loaded":["Source Serif 4","Courier Prime"]},"preview":{"light":{"bg":"#ffffff","fg":"#141414","accent":"#1c3d8f","syntax":{"keyword":"#1c3d8f","string":"#93262a","comment":"#2e6b2e","callable":"#295e80"}},"dark":{"bg":"#1d222b","fg":"#e7eaf0","accent":"#97b8ee","syntax":{"keyword":"#a3c0f2","string":"#e0a09a","comment":"#8cbc8c","callable":"#85c2da"}}}},"hasStylesheet":true},{"slug":"bauhaus","meta":{"schemaVersion":1,"slug":"bauhaus","name":"Bauhaus","description":"Primary triad as structure — gallery white, near-black ink, and red, yellow, blue doing structural work: circle, triangle, square markers, thick geometric rules, zero radius.","mode":"light","version":"1.0.1","fonts":{"sans":"Jost","mono":"Space Mono","display":"Archivo Black","loaded":["Jost","Archivo Black","Space Mono"]},"preview":{"light":{"bg":"#ffffff","fg":"#141414","accent":"#b3231b","syntax":{"keyword":"#b3231b","string":"#6d5800","comment":"#63615a","callable":"#1c4bbe"}},"dark":{"bg":"#18181b","fg":"#f0efe9","accent":"#ff7d70","syntax":{"keyword":"#ff7d70","string":"#e9ce6a","comment":"#999689","callable":"#8fb0ff"}}}},"hasStylesheet":true},{"slug":"beacon","meta":{"schemaVersion":1,"slug":"beacon","name":"Beacon","description":"WCAG-AAA high contrast — 7:1+ ink everywhere, 3px focus rings, always-underlined links. Clarity as beauty.","mode":"light","version":"1.0.1","fonts":{"sans":"Atkinson Hyperlegible","mono":"Atkinson Hyperlegible Mono","loaded":["Atkinson Hyperlegible","Atkinson Hyperlegible Mono"]},"preview":{"light":{"bg":"#ffffff","fg":"#000000","accent":"#0044cc","syntax":{"keyword":"#0044cc","string":"#a50000","comment":"#595959","callable":"#00287a"}},"dark":{"bg":"#000000","fg":"#ffffff","accent":"#6db3ff","syntax":{"keyword":"#6db3ff","string":"#ff8f8f","comment":"#b3b3b3","callable":"#a8d1ff"}}}},"hasStylesheet":true},{"slug":"blueprint","meta":{"schemaVersion":1,"slug":"blueprint","name":"Blueprint","description":"Cyanotype drafting sheet — pale-cyan linework on prussian grid paper, title-block caps, dashed rules, mono-caps labels. Light mode is the vellum original.","mode":"dark","version":"1.0.2","fonts":{"sans":"Inter","mono":"IBM Plex Mono","display":"Josefin Sans","loaded":["Inter","Josefin Sans","IBM Plex Mono"]},"preview":{"light":{"bg":"oklch(0.965 0.012 235)","fg":"oklch(0.28 0.05 253)","accent":"oklch(0.44 0.095 235)","syntax":{"keyword":"oklch(0.46 0.1 80)","string":"oklch(0.43 0.085 195)","comment":"oklch(0.5 0.03 248)","callable":"oklch(0.44 0.09 235)"}},"dark":{"bg":"oklch(0.27 0.055 252)","fg":"oklch(0.965 0.01 220)","accent":"oklch(0.86 0.09 205)","syntax":{"keyword":"oklch(0.87 0.12 95)","string":"oklch(0.83 0.1 185)","comment":"oklch(0.72 0.032 235)","callable":"oklch(0.83 0.085 215)"}}}},"hasStylesheet":true},{"slug":"botanica","meta":{"schemaVersion":1,"slug":"botanica","name":"Botanica","description":"A vintage botanical plate — herbarium cream, deep green ink, engraved double rules, Latin small-caps plate labels.","mode":"light","version":"1.0.1","fonts":{"sans":"Crimson Pro","mono":"Courier Prime","display":"Cormorant Garamond","loaded":["Cormorant Garamond","Crimson Pro","Courier Prime"]},"preview":{"light":{"bg":"oklch(0.956 0.02 92)","fg":"oklch(0.29 0.03 95)","accent":"oklch(0.42 0.09 152)","syntax":{"keyword":"oklch(0.4 0.075 60)","string":"oklch(0.43 0.095 150)","comment":"oklch(0.48 0.04 95)","callable":"oklch(0.43 0.075 205)"}},"dark":{"bg":"oklch(0.215 0.022 160)","fg":"oklch(0.92 0.02 95)","accent":"oklch(0.78 0.09 148)","syntax":{"keyword":"oklch(0.82 0.085 80)","string":"oklch(0.8 0.095 145)","comment":"oklch(0.7 0.03 110)","callable":"oklch(0.78 0.075 200)"}}}},"hasStylesheet":true},{"slug":"broadsheet","meta":{"schemaVersion":1,"slug":"broadsheet","name":"Broadsheet","description":"Newspaper editorial — Playfair masthead, Oxford ink rules, a red drop cap, and a night-edition dark mode.","mode":"light","version":"1.0.3","fonts":{"sans":"Source Serif 4","mono":"Courier Prime","display":"Playfair Display","loaded":["Playfair Display","Source Serif 4","Courier Prime"]},"preview":{"light":{"bg":"oklch(0.955 0.012 92)","fg":"oklch(0.205 0.012 80)","accent":"oklch(0.455 0.155 27)","syntax":{"keyword":"oklch(0.445 0.155 27)","string":"oklch(0.45 0.075 60)","comment":"oklch(0.5 0.016 78)","callable":"oklch(0.42 0.09 252)"}},"dark":{"bg":"oklch(0.185 0.012 75)","fg":"oklch(0.935 0.015 90)","accent":"oklch(0.7 0.145 27)","syntax":{"keyword":"oklch(0.72 0.14 27)","string":"oklch(0.79 0.07 70)","comment":"oklch(0.7 0.02 85)","callable":"oklch(0.74 0.08 248)"}}}},"hasStylesheet":true},{"slug":"brutalist","meta":{"schemaVersion":1,"slug":"brutalist","name":"Brutalist","description":"Raw concrete web — stark black on white, 4px slab borders, zero radius, hazard-orange tape. Structure you can see.","mode":"light","version":"1.0.4","fonts":{"sans":"Space Grotesk","mono":"IBM Plex Mono","display":"Archivo Black","loaded":["Archivo Black","Space Grotesk","IBM Plex Mono"]},"preview":{"light":{"bg":"#ffffff","fg":"#000000","accent":"#c2410c","syntax":{"keyword":"#c2410c","string":"#9a3412","comment":"#767676","callable":"#000000"}},"dark":{"bg":"#0d0d0d","fg":"#f5f5f5","accent":"#ff6a1f","syntax":{"keyword":"#ff7a2e","string":"#ffb38a","comment":"#878787","callable":"#ffffff"}}}},"hasStylesheet":true},{"slug":"drift","meta":{"schemaVersion":1,"slug":"drift","name":"Drift","description":"Floaty slate-blue comfort dark for long reading — soft glows in place of borders, gentle elevation, relaxed Plex type.","mode":"dark","version":"1.0.2","fonts":{"sans":"IBM Plex Sans","mono":"IBM Plex Mono","loaded":["IBM Plex Sans","IBM Plex Mono"]},"preview":{"light":{"bg":"#edf2f6","fg":"#24303d","accent":"#236799","syntax":{"keyword":"#49539c","string":"#2b754f","comment":"#596673","callable":"#00688d"}},"dark":{"bg":"#181f26","fg":"#d6dee4","accent":"#6cafd9","syntax":{"keyword":"#9caeee","string":"#88cba4","comment":"#8494a4","callable":"#75c6e1"}}}},"hasStylesheet":true},{"slug":"eink","meta":{"schemaVersion":1,"slug":"eink","name":"E-Ink","description":"E-reader grayscale — warm paper, near-black ink, shadowless hairline chrome, zero radius. Code is told by weight, slant, and gray value; only diffs keep a trace of ink-blue and ink-red.","mode":"light","version":"1.0.1","fonts":{"sans":"EB Garamond","mono":"Courier Prime","loaded":["EB Garamond","Courier Prime"]},"preview":{"light":{"bg":"oklch(0.956 0.007 90)","fg":"oklch(0.24 0.012 85)","accent":"oklch(0.155 0.01 85)","syntax":{"keyword":"oklch(0.18 0.01 85)","string":"oklch(0.46 0.012 85)","comment":"oklch(0.505 0.01 85)","callable":"oklch(0.31 0.012 85)"}},"dark":{"bg":"oklch(0.215 0.008 80)","fg":"oklch(0.885 0.012 85)","accent":"oklch(0.955 0.008 85)","syntax":{"keyword":"oklch(0.96 0.008 85)","string":"oklch(0.715 0.012 85)","comment":"oklch(0.645 0.01 85)","callable":"oklch(0.82 0.01 85)"}}}},"hasStylesheet":true},{"slug":"fjord","meta":{"schemaVersion":1,"slug":"fjord","name":"Fjord","description":"Polar-night blue under a faint aurora — frost-cyan accents, icy borders, snow-white text. Cold nordic calm.","mode":"dark","version":"1.0.2","fonts":{"sans":"Inter","mono":"JetBrains Mono","loaded":["Inter","JetBrains Mono"]},"preview":{"light":{"bg":"oklch(0.971 0.008 230)","fg":"oklch(0.255 0.03 255)","accent":"oklch(0.455 0.092 205)","syntax":{"keyword":"oklch(0.455 0.105 250)","string":"oklch(0.495 0.105 165)","comment":"oklch(0.51 0.03 245)","callable":"oklch(0.445 0.098 202)"}},"dark":{"bg":"oklch(0.232 0.024 255)","fg":"oklch(0.93 0.012 235)","accent":"oklch(0.79 0.095 195)","syntax":{"keyword":"oklch(0.76 0.095 242)","string":"oklch(0.8 0.105 158)","comment":"oklch(0.63 0.03 245)","callable":"oklch(0.815 0.095 195)"}}}},"hasStylesheet":true},{"slug":"foundry","meta":{"schemaVersion":1,"slug":"foundry","name":"Foundry","description":"GitHub-neutral baseline — white paper, near-black ink, Primer-blue links, quiet gray rules. Restraint, perfected.","mode":"light","version":"1.0.2","fonts":{"sans":"Inter","mono":"System","loaded":["Inter"]},"preview":{"light":{"bg":"#ffffff","fg":"#1f2328","accent":"#0969da","syntax":{"keyword":"#cf222e","string":"#0a3069","comment":"#6e7781","callable":"#8250df"}},"dark":{"bg":"#0d1117","fg":"#e6edf3","accent":"#4493f8","syntax":{"keyword":"#ff7b72","string":"#a5d6ff","comment":"#8b949e","callable":"#d2a8ff"}}}},"hasStylesheet":true},{"slug":"futura-editorial","meta":{"schemaVersion":1,"slug":"futura-editorial","name":"Futura Editorial","description":"Normal-weight geometric Futura headings over Noto Sans body — clean white, near-black ink, one restrained red accent.","mode":"light","version":"1.0.2","fonts":{"sans":"Noto Sans","mono":"Space Mono","display":"Jost","loaded":["Jost","Noto Sans","Space Mono"]},"preview":{"light":{"bg":"oklch(1 0 0)","fg":"oklch(0.17 0 0)","accent":"oklch(0.505 0.18 28)","syntax":{"keyword":"oklch(0.505 0.18 28)","string":"oklch(0.47 0.09 160)","comment":"oklch(0.52 0 0)","callable":"oklch(0.45 0.1 250)"}},"dark":{"bg":"oklch(0.165 0 0)","fg":"oklch(0.935 0 0)","accent":"oklch(0.72 0.15 29)","syntax":{"keyword":"oklch(0.72 0.15 29)","string":"oklch(0.76 0.1 160)","comment":"oklch(0.63 0 0)","callable":"oklch(0.73 0.095 250)"}}}},"hasStylesheet":true},{"slug":"hearth","meta":{"schemaVersion":1,"slug":"hearth","name":"Hearth","description":"Warm cream & brick-red fireside docs — Fraunces headings, amber code blocks, ember-glow dark mode.","mode":"light","version":"1.0.4","fonts":{"sans":"Nunito","mono":"Spline Sans Mono","display":"Fraunces","loaded":["Fraunces","Nunito","Spline Sans Mono"]},"preview":{"light":{"bg":"oklch(0.958 0.02 85)","fg":"oklch(0.255 0.028 40)","accent":"oklch(0.49 0.145 31)","syntax":{"keyword":"oklch(0.48 0.148 30)","string":"oklch(0.47 0.1 135)","comment":"oklch(0.51 0.035 60)","callable":"oklch(0.45 0.092 245)"}},"dark":{"bg":"oklch(0.215 0.022 45)","fg":"oklch(0.915 0.02 80)","accent":"oklch(0.735 0.128 45)","syntax":{"keyword":"oklch(0.745 0.138 40)","string":"oklch(0.785 0.1 130)","comment":"oklch(0.645 0.032 65)","callable":"oklch(0.765 0.075 235)"}}}},"hasStylesheet":true},{"slug":"hollow","meta":{"schemaVersion":1,"slug":"hollow","name":"Hollow","description":"Dark violet space — neon pink headings, violet links, a quiet starfield, and razor-square midnight chrome.","mode":"dark","version":"1.0.2","fonts":{"sans":"Space Grotesk","mono":"Space Mono","loaded":["Space Grotesk","Space Mono"]},"preview":{"light":{"bg":"oklch(0.962 0.012 300)","fg":"oklch(0.24 0.045 295)","accent":"oklch(0.45 0.17 300)","syntax":{"keyword":"oklch(0.53 0.2 348)","string":"oklch(0.45 0.1 195)","comment":"oklch(0.51 0.035 292)","callable":"oklch(0.46 0.16 300)"}},"dark":{"bg":"oklch(0.155 0.035 295)","fg":"oklch(0.93 0.015 295)","accent":"oklch(0.74 0.14 300)","syntax":{"keyword":"oklch(0.76 0.17 347)","string":"oklch(0.83 0.1 190)","comment":"oklch(0.62 0.045 292)","callable":"oklch(0.76 0.13 300)"}}}},"hasStylesheet":true},{"slug":"ledger","meta":{"schemaVersion":1,"slug":"ledger","name":"Ledger","description":"Cream academic serif in the Tufte tradition — warm paper, ink prose, oxblood links, hairline rules, quiet code.","mode":"light","version":"1.0.2","fonts":{"sans":"Crimson Pro","mono":"IBM Plex Mono","loaded":["Crimson Pro","IBM Plex Mono"]},"preview":{"light":{"bg":"#fffff8","fg":"#16130e","accent":"#8b1a1a","syntax":{"keyword":"#8b1a1a","string":"#4e6328","comment":"#766b5c","callable":"#33586e"}},"dark":{"bg":"#191510","fg":"#e9e2d0","accent":"#d68a75","syntax":{"keyword":"#e2907c","string":"#a8b47c","comment":"#948a77","callable":"#93b4cd"}}}},"hasStylesheet":true},{"slug":"manuscript","meta":{"schemaVersion":1,"slug":"manuscript","name":"Manuscript","description":"A quiet Garamond book page — warm paper, soft ink, sepia rubrication, small-caps subheads, fleuron section marks.","mode":"light","version":"1.0.2","fonts":{"sans":"EB Garamond","mono":"Courier Prime","loaded":["EB Garamond","Courier Prime"]},"preview":{"light":{"bg":"oklch(0.963 0.013 85)","fg":"oklch(0.245 0.018 60)","accent":"oklch(0.44 0.095 55)","syntax":{"keyword":"oklch(0.455 0.13 30)","string":"oklch(0.44 0.085 150)","comment":"oklch(0.5 0.03 70)","callable":"oklch(0.435 0.09 275)"}},"dark":{"bg":"oklch(0.215 0.015 65)","fg":"oklch(0.885 0.022 80)","accent":"oklch(0.735 0.095 70)","syntax":{"keyword":"oklch(0.72 0.115 35)","string":"oklch(0.745 0.085 150)","comment":"oklch(0.645 0.03 75)","callable":"oklch(0.745 0.07 275)"}}}},"hasStylesheet":true},{"slug":"matcha","meta":{"schemaVersion":1,"slug":"matcha","name":"Matcha","description":"Green tea ceremony — deep matcha on warm cream, mincho headings, zen whitespace, tea-foam surfaces in both modes.","mode":"light","version":"1.0.3","fonts":{"sans":"Zen Kaku Gothic New","mono":"M PLUS 1 Code","display":"Shippori Mincho","loaded":["Zen Kaku Gothic New","Shippori Mincho","M PLUS 1 Code"]},"preview":{"light":{"bg":"oklch(0.973 0.012 106)","fg":"oklch(0.245 0.018 148)","accent":"oklch(0.435 0.105 142)","syntax":{"keyword":"oklch(0.418 0.105 150)","string":"oklch(0.47 0.092 106)","comment":"oklch(0.512 0.034 130)","callable":"oklch(0.438 0.082 196)"}},"dark":{"bg":"oklch(0.205 0.016 152)","fg":"oklch(0.938 0.018 106)","accent":"oklch(0.79 0.115 138)","syntax":{"keyword":"oklch(0.782 0.118 148)","string":"oklch(0.822 0.102 108)","comment":"oklch(0.668 0.034 130)","callable":"oklch(0.772 0.088 192)"}}}},"hasStylesheet":true},{"slug":"nocturne","meta":{"schemaVersion":1,"slug":"nocturne","name":"Nocturne","description":"Purple midnight — velvet aubergine depths, lavender links, and muted gold hairlines. Elegant, never neon.","mode":"dark","version":"1.0.3","fonts":{"sans":"Manrope","mono":"IBM Plex Mono","display":"Cormorant Garamond","loaded":["Cormorant Garamond","Manrope","IBM Plex Mono"]},"preview":{"light":{"bg":"oklch(0.958 0.012 300)","fg":"oklch(0.245 0.05 312)","accent":"oklch(0.455 0.15 295)","syntax":{"keyword":"oklch(0.46 0.16 295)","string":"oklch(0.5 0.105 85)","comment":"oklch(0.5 0.042 305)","callable":"oklch(0.455 0.125 265)"}},"dark":{"bg":"oklch(0.155 0.03 310)","fg":"oklch(0.922 0.018 300)","accent":"oklch(0.765 0.105 292)","syntax":{"keyword":"oklch(0.772 0.128 293)","string":"oklch(0.8 0.108 88)","comment":"oklch(0.645 0.045 302)","callable":"oklch(0.77 0.095 262)"}}}},"hasStylesheet":true},{"slug":"observatory","meta":{"schemaVersion":1,"slug":"observatory","name":"Observatory","description":"Night-sky atlas: star-field depth, constellation-line rules, nebula violet and comet gold over astronomer's navy.","mode":"dark","version":"1.0.4","fonts":{"sans":"Jost","mono":"Space Mono","display":"Josefin Sans","loaded":["Josefin Sans","Jost","Space Mono"]},"preview":{"light":{"bg":"oklch(0.965 0.012 255)","fg":"oklch(0.235 0.045 268)","accent":"oklch(0.47 0.1 75)","syntax":{"keyword":"oklch(0.46 0.14 300)","string":"oklch(0.45 0.1 162)","comment":"oklch(0.5 0.03 265)","callable":"oklch(0.46 0.11 250)"}},"dark":{"bg":"oklch(0.155 0.028 268)","fg":"oklch(0.93 0.015 255)","accent":"oklch(0.82 0.13 86)","syntax":{"keyword":"oklch(0.76 0.118 300)","string":"oklch(0.8 0.112 162)","comment":"oklch(0.61 0.038 265)","callable":"oklch(0.78 0.095 240)"}}}},"hasStylesheet":true},{"slug":"onyx","meta":{"schemaVersion":1,"slug":"onyx","name":"Onyx","description":"Luxury noir — jet black, champagne serif headings, and a single gold hairline accent. Watch-brand restraint.","mode":"dark","version":"1.0.4","fonts":{"sans":"Jost","mono":"IBM Plex Mono","display":"Cormorant Garamond","loaded":["Cormorant Garamond","Jost","IBM Plex Mono"]},"preview":{"light":{"bg":"oklch(0.972 0.005 85)","fg":"oklch(0.22 0.012 80)","accent":"oklch(0.5 0.105 80)","syntax":{"keyword":"oklch(0.51 0.105 82)","string":"oklch(0.47 0.07 155)","comment":"oklch(0.5 0.015 85)","callable":"oklch(0.45 0.045 250)"}},"dark":{"bg":"oklch(0.145 0.003 80)","fg":"oklch(0.92 0.022 88)","accent":"oklch(0.79 0.115 88)","syntax":{"keyword":"oklch(0.8 0.115 88)","string":"oklch(0.78 0.07 155)","comment":"oklch(0.62 0.02 85)","callable":"oklch(0.82 0.04 250)"}}}},"hasStylesheet":true},{"slug":"phosphor","meta":{"schemaVersion":1,"slug":"phosphor","name":"Phosphor","description":"Green CRT terminal — phosphor glow, scanlines, inverse-video nav, monospace everything.","mode":"dark","version":"1.0.2","fonts":{"sans":"JetBrains Mono","mono":"JetBrains Mono","display":"VT323","loaded":["VT323","JetBrains Mono"]},"preview":{"light":{"bg":"oklch(0.955 0.014 150)","fg":"oklch(0.28 0.058 150)","accent":"oklch(0.42 0.13 150)","syntax":{"keyword":"oklch(0.4 0.13 148)","string":"oklch(0.39 0.095 165)","comment":"oklch(0.49 0.05 150)","callable":"oklch(0.43 0.095 200)"}},"dark":{"bg":"oklch(0.135 0.014 150)","fg":"oklch(0.845 0.145 150)","accent":"oklch(0.87 0.215 148)","syntax":{"keyword":"oklch(0.9 0.21 148)","string":"oklch(0.9 0.12 165)","comment":"oklch(0.58 0.062 150)","callable":"oklch(0.83 0.125 200)"}}}},"hasStylesheet":true},{"slug":"riso","meta":{"schemaVersion":1,"slug":"riso","name":"Riso","description":"Risograph duotone print — warm paper, two inks (riso blue + fluorescent coral), misregistered offset shadows, and a soft linear paper grain.","mode":"light","version":"1.0.1","fonts":{"sans":"Space Grotesk","mono":"Space Mono","display":"Archivo Black","loaded":["Space Grotesk","Archivo Black","Space Mono"]},"preview":{"light":{"bg":"#f9f3e5","fg":"#1d3345","accent":"#0d5c94","syntax":{"keyword":"#a02310","string":"#0d5e6e","comment":"#4d5c66","callable":"#0b5b9b"}},"dark":{"bg":"#101d28","fg":"#f1e9d8","accent":"#58b8e8","syntax":{"keyword":"#ff8d72","string":"#66d4cf","comment":"#93a4ad","callable":"#5aaef5"}}}},"hasStylesheet":true},{"slug":"sakura","meta":{"schemaVersion":1,"slug":"sakura","name":"Sakura","description":"Cherry-blossom pastels — blush-white paper, plum ink, and rose accents on petal-soft corners; dark mode is yozakura, night blossoms under lantern-pink light.","mode":"light","version":"1.0.2","fonts":{"sans":"Nunito","mono":"M PLUS 1 Code","display":"Shippori Mincho","loaded":["Nunito","Shippori Mincho","M PLUS 1 Code"]},"preview":{"light":{"bg":"oklch(0.977 0.009 350)","fg":"oklch(0.29 0.055 340)","accent":"oklch(0.5 0.168 358)","syntax":{"keyword":"oklch(0.5 0.168 358)","string":"oklch(0.49 0.115 150)","comment":"oklch(0.5 0.04 340)","callable":"oklch(0.49 0.135 300)"}},"dark":{"bg":"oklch(0.215 0.03 330)","fg":"oklch(0.935 0.014 350)","accent":"oklch(0.78 0.115 355)","syntax":{"keyword":"oklch(0.79 0.125 355)","string":"oklch(0.78 0.115 150)","comment":"oklch(0.71 0.038 345)","callable":"oklch(0.78 0.105 300)"}}}},"hasStylesheet":true},{"slug":"scandi","meta":{"schemaVersion":1,"slug":"scandi","name":"Scandi","description":"Hygge minimalism — oat linen, sage & clay, pill nav actives and 8px corners; night mode is warm charcoal lit by candle amber.","mode":"light","version":"1.0.1","fonts":{"sans":"Manrope","mono":"Spline Sans Mono","loaded":["Manrope","Spline Sans Mono"]},"preview":{"light":{"bg":"oklch(0.963 0.012 83)","fg":"oklch(0.28 0.02 55)","accent":"oklch(0.44 0.08 152)","syntax":{"keyword":"oklch(0.47 0.105 40)","string":"oklch(0.45 0.09 150)","comment":"oklch(0.5 0.02 70)","callable":"oklch(0.45 0.08 240)"}},"dark":{"bg":"oklch(0.235 0.015 55)","fg":"oklch(0.92 0.012 85)","accent":"oklch(0.82 0.105 75)","syntax":{"keyword":"oklch(0.76 0.1 45)","string":"oklch(0.78 0.09 150)","comment":"oklch(0.66 0.02 75)","callable":"oklch(0.75 0.075 238)"}}}},"hasStylesheet":true},{"slug":"solar","meta":{"schemaVersion":1,"slug":"solar","name":"Solar","description":"Solarized precision — low-eyestrain paper tones, blue/cyan/orange accents, mono labels, technical calm in both modes.","mode":"light","version":"1.0.2","fonts":{"sans":"Source Sans 3","mono":"Source Code Pro","loaded":["Source Sans 3","Source Code Pro"]},"preview":{"light":{"bg":"#fdf6e3","fg":"#4f6369","accent":"#1c6a9f","syntax":{"keyword":"#606f00","string":"#12746c","comment":"#586b72","callable":"#1d6da3"}},"dark":{"bg":"#002b36","fg":"#93a1a1","accent":"#53a6df","syntax":{"keyword":"#8ea300","string":"#2caaa0","comment":"#899da4","callable":"#49a0dd"}}}},"hasStylesheet":true},{"slug":"sumi","meta":{"schemaVersion":1,"slug":"sumi","name":"Sumi","description":"Sumi-e ink on washi — bold mincho brush headings, deep black strokes, one vermillion hanko seal accent.","mode":"light","version":"1.0.4","fonts":{"sans":"Zen Kaku Gothic New","mono":"IBM Plex Mono","display":"Shippori Mincho B1","loaded":["Shippori Mincho B1","Zen Kaku Gothic New","IBM Plex Mono"]},"preview":{"light":{"bg":"#f7f4ec","fg":"#1b1a18","accent":"#b8232e","syntax":{"keyword":"#b8232e","string":"#6a6156","comment":"#726b5e","callable":"#433d35"}},"dark":{"bg":"#161514","fg":"#ece7db","accent":"#ea6a72","syntax":{"keyword":"#ee7a81","string":"#c8bfa6","comment":"#837d72","callable":"#f4efe4"}}}},"hasStylesheet":true},{"slug":"swissgrid","meta":{"schemaVersion":1,"slug":"swissgrid","name":"Swissgrid","description":"International Typographic Style — grid discipline, black on white, one hot Swiss-red accent, oversized section numbers.","mode":"light","version":"1.0.2","fonts":{"sans":"Inter","mono":"IBM Plex Mono","display":"Inter Tight","loaded":["Inter","Inter Tight","IBM Plex Mono"]},"preview":{"light":{"bg":"#ffffff","fg":"#0a0a0a","accent":"#e60000","syntax":{"keyword":"#d40000","string":"#3f3f3f","comment":"#6b6b6b","callable":"#0a0a0a"}},"dark":{"bg":"#0c0c0c","fg":"#f2f2f2","accent":"#ff4d4d","syntax":{"keyword":"#ff4d4d","string":"#c9c9c9","comment":"#8c8c8c","callable":"#ffffff"}}}},"hasStylesheet":true},{"slug":"tidepool","meta":{"schemaVersion":1,"slug":"tidepool","name":"Tidepool","description":"Marine teal dark — deep-sea teal surfaces, seafoam text, bioluminescent aqua accents, kelp-green success, coral danger. Light mode is the same pool at low tide.","mode":"dark","version":"1.0.0","fonts":{"sans":"Space Grotesk","mono":"JetBrains Mono","loaded":["Space Grotesk","JetBrains Mono"]},"preview":{"light":{"bg":"oklch(0.966 0.013 165)","fg":"oklch(0.27 0.045 200)","accent":"oklch(0.43 0.073 195)","syntax":{"keyword":"oklch(0.42 0.071 193)","string":"oklch(0.42 0.11 150)","comment":"oklch(0.44 0.03 200)","callable":"oklch(0.44 0.089 232)"}},"dark":{"bg":"oklch(0.235 0.032 205)","fg":"oklch(0.92 0.028 180)","accent":"oklch(0.82 0.13 185)","syntax":{"keyword":"oklch(0.84 0.14 183)","string":"oklch(0.83 0.14 152)","comment":"oklch(0.69 0.035 195)","callable":"oklch(0.8 0.1 228)"}}}},"hasStylesheet":true},{"slug":"timberline","meta":{"schemaVersion":1,"slug":"timberline","name":"Timberline","description":"Forest cabin after dark — pine & umber planks, cream prose, and matte lantern-amber accents; light mode is the same lodge at morning.","mode":"dark","version":"1.0.2","fonts":{"sans":"Source Sans 3","mono":"JetBrains Mono","display":"Fraunces","loaded":["Fraunces","Source Sans 3","JetBrains Mono"]},"preview":{"light":{"bg":"oklch(0.962 0.016 90)","fg":"oklch(0.27 0.032 155)","accent":"oklch(0.465 0.11 62)","syntax":{"keyword":"oklch(0.475 0.11 70)","string":"oklch(0.46 0.09 145)","comment":"oklch(0.49 0.035 140)","callable":"oklch(0.45 0.085 235)"}},"dark":{"bg":"oklch(0.207 0.02 60)","fg":"oklch(0.928 0.02 88)","accent":"oklch(0.78 0.125 72)","syntax":{"keyword":"oklch(0.8 0.125 80)","string":"oklch(0.79 0.1 135)","comment":"oklch(0.66 0.035 110)","callable":"oklch(0.78 0.075 220)"}}}},"hasStylesheet":true},{"slug":"washi","meta":{"schemaVersion":1,"slug":"washi","name":"Washi","description":"Warm washi paper, sumi ink, and ai-iro indigo seals — quiet Japanese stationery for calm documentation.","mode":"light","version":"1.0.4","fonts":{"sans":"Zen Kaku Gothic New","mono":"M PLUS 1 Code","display":"Shippori Mincho","loaded":["Zen Kaku Gothic New","Shippori Mincho","M PLUS 1 Code"]},"preview":{"light":{"bg":"#f6f1e4","fg":"#2b2822","accent":"#274a78","syntax":{"keyword":"#274a78","string":"#41653a","comment":"#6f6654","callable":"#963f34"}},"dark":{"bg":"#1b212c","fg":"#eae3d2","accent":"#8ab0dd","syntax":{"keyword":"#97b9e6","string":"#a9cb90","comment":"#8894a4","callable":"#e0a49a"}}}},"hasStylesheet":true}]};
7
7
 
8
8
  /**
9
9
  * Validate the browser-facing catalog contract before consuming its entries.
@@ -188,12 +188,14 @@ export interface ChromeBindingsInput {
188
188
  */
189
189
  frontmatterRenderers?: Record<string, Component<FrontmatterRendererSlotProps>>;
190
190
  /**
191
- * MDX content-component overrides (renderer record). Component props are a
192
- * broad record because each MDX component has its own authored prop shape;
193
- * the showcase's `MdxStub = (_props: unknown) => null` is accepted because
194
- * `unknown` safely accepts that record.
191
+ * MDX content-component overrides (heterogeneous component registry). There
192
+ * is no package call-side contract: each component's props are authored at
193
+ * its MDX call site, so any parameter shape is accepted — including required
194
+ * typed props such as `(props: { html: string }) => Child` (#4530) and the
195
+ * showcase's `MdxStub = (_props: unknown) => null`. `Component<never>` still
196
+ * requires every entry to be a component returning a `Child`.
195
197
  */
196
- mdxExtras?: Record<string, Component<Record<string, unknown>>>;
198
+ mdxExtras?: Record<string, Component<never>>;
197
199
  /**
198
200
  * Frontmatter preview entry builder. `doc-content-header` calls it with the
199
201
  * page `data` (`Record<string, unknown>`) and spreads the result into
package/dist/compiled.css CHANGED
@@ -1820,6 +1820,11 @@ header[data-header] {
1820
1820
  font-family: var(--zdc-header-font, var(--zdc-chrome-font, var(--font-sans)));
1821
1821
  }
1822
1822
 
1823
+ a[data-header-logo] {
1824
+ font-family: var(--zdc-header-logo-font, inherit);
1825
+ font-weight: var(--zdc-header-logo-weight, var(--font-weight-bold));
1826
+ }
1827
+
1823
1828
  #desktop-sidebar, aside[data-zd-mobile-sidebar] {
1824
1829
  font-family: var(--zdc-sidebar-font, var(--zdc-chrome-font, var(--font-sans)));
1825
1830
  }
@@ -16,7 +16,7 @@ export type ComponentTokenSurface = "content" | "chrome";
16
16
  * Provides autocomplete when a consumer iterates or references individual tokens.
17
17
  * Must be kept in sync with the `cssVar` values in `COMPONENT_TOKENS` below.
18
18
  */
19
- export type ComponentTokenName = "--zdc-doc-title-font" | "--zdc-doc-title-weight" | "--zdc-doc-title-tracking" | "--zdc-doc-h2-font" | "--zdc-doc-h2-weight" | "--zdc-doc-h2-tracking" | "--zdc-doc-h3-weight" | "--zdc-doc-h4-weight" | "--zdc-doc-prose-font" | "--zdc-doc-link-decoration" | "--zdc-admonition-radius" | "--zdc-admonition-border-width" | "--zdc-card-radius" | "--zdc-content-max-width" | "--zdc-toc-width" | "--zdc-nav-active-indicator-color" | "--zdc-nav-active-weight" | "--zdc-chrome-font" | "--zdc-header-font" | "--zdc-sidebar-font" | "--zdc-toc-font";
19
+ export type ComponentTokenName = "--zdc-doc-title-font" | "--zdc-doc-title-weight" | "--zdc-doc-title-tracking" | "--zdc-doc-h2-font" | "--zdc-doc-h2-weight" | "--zdc-doc-h2-tracking" | "--zdc-doc-h3-weight" | "--zdc-doc-h4-weight" | "--zdc-doc-prose-font" | "--zdc-doc-link-decoration" | "--zdc-admonition-radius" | "--zdc-admonition-border-width" | "--zdc-card-radius" | "--zdc-content-max-width" | "--zdc-toc-width" | "--zdc-nav-active-indicator-color" | "--zdc-nav-active-weight" | "--zdc-chrome-font" | "--zdc-header-font" | "--zdc-header-logo-font" | "--zdc-header-logo-weight" | "--zdc-sidebar-font" | "--zdc-toc-font";
20
20
  export interface ComponentToken {
21
21
  /**
22
22
  * The CSS custom-property name the consumer redefines in `:root`, e.g.
@@ -337,6 +337,28 @@ const COMPONENT_TOKENS = [
337
337
  category: "typography",
338
338
  description: "Font family of the site header. Defaults to the `--zdc-chrome-font` seam (a no-op until redefined); set in :root to give the header its own face, e.g. a display font for the wordmark and nav. Scoped to the header itself \u2014 it does not leak into the mobile sidebar drawer that the header hosts."
339
339
  },
340
+ // Wordmark-only knobs: the anchor selector beats its font-bold utility.
341
+ // Packs with explicit logo typography preserve their own fallbacks.
342
+ {
343
+ cssVar: "--zdc-header-logo-font",
344
+ selector: "a[data-header-logo]",
345
+ property: "font-family",
346
+ default: "inherit",
347
+ component: "header-logo",
348
+ surface: "chrome",
349
+ category: "typography",
350
+ description: "Font family of the site-name anchor only. Defaults to the inherited header font; theme packs retain their existing logo family as fallback. Navigation and header controls keep their own typography."
351
+ },
352
+ {
353
+ cssVar: "--zdc-header-logo-weight",
354
+ selector: "a[data-header-logo]",
355
+ property: "font-weight",
356
+ default: "var(--font-weight-bold)",
357
+ component: "header-logo",
358
+ surface: "chrome",
359
+ category: "typography",
360
+ description: "Font weight of the site-name anchor only. Defaults to --font-weight-bold, matching font-bold; theme packs retain their existing logo weight as fallback."
361
+ },
340
362
  {
341
363
  cssVar: "--zdc-sidebar-font",
342
364
  selector: "#desktop-sidebar, aside[data-zd-mobile-sidebar]",
package/dist/features.css CHANGED
@@ -1036,6 +1036,11 @@ header[data-header] {
1036
1036
  font-family: var(--zdc-header-font, var(--zdc-chrome-font, var(--font-sans)));
1037
1037
  }
1038
1038
 
1039
+ a[data-header-logo] {
1040
+ font-family: var(--zdc-header-logo-font, inherit);
1041
+ font-weight: var(--zdc-header-logo-weight, var(--font-weight-bold));
1042
+ }
1043
+
1039
1044
  #desktop-sidebar, aside[data-zd-mobile-sidebar] {
1040
1045
  font-family: var(--zdc-sidebar-font, var(--zdc-chrome-font, var(--font-sans)));
1041
1046
  }
@@ -21,8 +21,8 @@ export interface HeaderWithDefaultsProps {
21
21
  * resolved per render against that render's `lang`/`navSection`/
22
22
  * `currentVersion`.
23
23
  *
24
- * - An array is passed to `SidebarToggle` as-is — no default build, no
25
- * version-href remapping.
24
+ * - An array skips the default build and version-href remapping. Transport
25
+ * copies only sidebar client fields, omitting server-only descriptions.
26
26
  * - A callback receives the resolved `lang`/`navSection`/`currentVersion`
27
27
  * plus a lazy `buildDefault()` that reproduces today's default tree
28
28
  * (`buildSidebarNodes(lang, navSection, currentVersion)`) only when
@@ -8,6 +8,8 @@ import {
8
8
  import { ThemeToggle } from "../theme-toggle/index.js";
9
9
  import { themeToggleLabels } from "../theme-toggle/labels.js";
10
10
  import { SidebarToggle } from "../sidebar-toggle-island/index.js";
11
+ import { toSidebarClientData } from "../sidebar/client-data.js";
12
+ import { normalizeIslandData } from "../chrome/island-data.js";
11
13
  import { buildGitHubRepoUrl as buildGitHubRepoUrlBase } from "../github-helpers/index.js";
12
14
  import { assertChromeContext } from "../chrome/assert-chrome-context.js";
13
15
  import {
@@ -62,17 +64,18 @@ function createHeaderWithDefaults(ctx) {
62
64
  children: /* @__PURE__ */ jsx(
63
65
  SidebarToggle,
64
66
  {
65
- nodes: sidebarNodes,
66
- ...defaultSidebar?.navigation ? { navigation: defaultSidebar.navigation } : {},
67
- ...currentSlug !== void 0 ? { currentSlug } : {},
68
- rootMenuItems,
69
- ...backToMenuLabel !== void 0 ? { backToMenuLabel } : {},
70
- locale: lang,
71
- ...localeLinks !== void 0 ? { localeLinks } : {},
72
- ...themeDefaultMode !== void 0 ? { themeDefaultMode } : {},
73
- themeLabels: themeToggleLabels(t, lang),
74
- themeRespectSystem,
75
- dateFormats: dateFormatsFor(lang)
67
+ ...normalizeIslandData({
68
+ ...toSidebarClientData(sidebarNodes, defaultSidebar?.navigation),
69
+ currentSlug,
70
+ rootMenuItems,
71
+ backToMenuLabel,
72
+ locale: lang,
73
+ localeLinks,
74
+ themeDefaultMode,
75
+ themeLabels: themeToggleLabels(t, lang),
76
+ themeRespectSystem,
77
+ dateFormats: dateFormatsFor(lang)
78
+ })
76
79
  }
77
80
  )
78
81
  });
@@ -0,0 +1,18 @@
1
+ import type { SidebarNavNode, SidebarNavigationContext } from "./types.js";
2
+ /** Navigation data needed by the native sidebar islands, without server prose. */
3
+ export type SidebarClientNode = Omit<SidebarNavNode, "description" | "children"> & {
4
+ children: SidebarClientNode[];
5
+ };
6
+ export type SidebarClientNavigation = Omit<SidebarNavigationContext, "roots"> & {
7
+ roots: SidebarClientNode[];
8
+ };
9
+ /**
10
+ * Copy navigation for SSR and hydration at an island boundary. Server builders
11
+ * retain descriptions; custom island hosts can opt into this same projection.
12
+ * Validate before selecting fields so discarded data cannot conceal invalid
13
+ * transport values. Preserve the opaque scope ID and editorial topology.
14
+ */
15
+ export declare function toSidebarClientData(nodes: SidebarNavNode[], navigation?: SidebarNavigationContext): {
16
+ nodes: SidebarClientNode[];
17
+ navigation?: SidebarClientNavigation;
18
+ };
@@ -0,0 +1,47 @@
1
+ import { normalizeIslandData } from "../chrome/island-data.js";
2
+ const nodeFields = {
3
+ occurrenceId: true,
4
+ slug: true,
5
+ label: true,
6
+ description: false,
7
+ position: true,
8
+ href: true,
9
+ hasPage: true,
10
+ children: true,
11
+ sortOrder: true,
12
+ collapsed: true,
13
+ shape: true,
14
+ noteTrayDated: true,
15
+ noteTraySidebar: true,
16
+ date: true,
17
+ updated: true,
18
+ rank: true
19
+ };
20
+ function toSidebarClientData(nodes, navigation) {
21
+ const source = normalizeIslandData({ nodes, navigation });
22
+ function project(node) {
23
+ const result = {};
24
+ for (const key of Object.keys(nodeFields)) {
25
+ if (nodeFields[key] && key !== "children" && node[key] !== void 0) {
26
+ result[key] = node[key];
27
+ }
28
+ }
29
+ result.children = node.children.map(project);
30
+ return result;
31
+ }
32
+ return {
33
+ nodes: source.nodes.map(project),
34
+ ...source.navigation ? {
35
+ navigation: {
36
+ id: source.navigation.id,
37
+ roots: source.navigation.roots.map(project),
38
+ parents: source.navigation.parents,
39
+ ...source.navigation.initialExpansion !== void 0 ? { initialExpansion: source.navigation.initialExpansion } : {},
40
+ ...source.navigation.localParentId !== void 0 ? { localParentId: source.navigation.localParentId } : {}
41
+ }
42
+ } : {}
43
+ };
44
+ }
45
+ export {
46
+ toSidebarClientData
47
+ };
@@ -17,5 +17,7 @@
17
17
  * `treeComponent` prop (or rendered as `children`).
18
18
  */
19
19
  export { Sidebar } from "./sidebar.js";
20
+ export { toSidebarClientData } from "./client-data.js";
21
+ export type { SidebarClientNode, SidebarClientNavigation } from "./client-data.js";
20
22
  export type { SidebarProps } from "./sidebar.js";
21
23
  export type { SidebarLocaleLink, SidebarNavNode, SidebarNavigationContext, SidebarRootMenuItem, SidebarTreeIslandProps, } from "./types.js";
@@ -1,4 +1,6 @@
1
1
  import { Sidebar } from "./sidebar.js";
2
+ import { toSidebarClientData } from "./client-data.js";
2
3
  export {
3
- Sidebar
4
+ Sidebar,
5
+ toSidebarClientData
4
6
  };
@@ -4,6 +4,7 @@ import { SidebarTree } from "../sidebar-tree-island/index.js";
4
4
  import { themeToggleLabels } from "../theme-toggle/labels.js";
5
5
  import { deriveDateFormats, deriveNavDataPrep } from "../chrome/derive.js";
6
6
  import { normalizeIslandData } from "../chrome/island-data.js";
7
+ import { toSidebarClientData } from "../sidebar/client-data.js";
7
8
  import { assertChromeContext } from "../chrome/assert-chrome-context.js";
8
9
  function createSidebarWithDefaults(ctx) {
9
10
  assertChromeContext(ctx, "createSidebarWithDefaults");
@@ -26,8 +27,7 @@ function createSidebarWithDefaults(ctx) {
26
27
  const localeLinks = buildLocaleLinksForNav(currentPath, lang, localeCount);
27
28
  const themeDefaultMode = getThemeDefaultMode();
28
29
  const treeProps = normalizeIslandData({
29
- nodes,
30
- navigation,
30
+ ...toSidebarClientData(nodes, navigation),
31
31
  ...currentSlug !== void 0 ? { currentSlug } : {},
32
32
  rootMenuItems,
33
33
  ...backToMenuLabel !== void 0 ? { backToMenuLabel } : {},
@@ -4,7 +4,7 @@
4
4
  "name": "Academia",
5
5
  "description": "A LaTeX paper for the web — white page, Computer-Modern-black ink, hyperref navy links, numbered theorem admonitions, booktabs tables. Dark mode is a scholarly slate.",
6
6
  "mode": "light",
7
- "version": "1.0.2",
7
+ "version": "1.0.3",
8
8
  "fonts": {
9
9
  "sans": "Source Serif 4",
10
10
  "mono": "Courier Prime",
@@ -397,7 +397,7 @@ html[data-theme-pack="academia"] header[data-header] {
397
397
  }
398
398
  html[data-theme-pack="academia"] [data-header-logo] {
399
399
  font-variant-caps: small-caps;
400
- font-weight: 600;
400
+ font-weight: var(--zdc-header-logo-weight, 600);
401
401
  letter-spacing: 0.03em;
402
402
  font-size: 1.3rem;
403
403
  }
@@ -4,7 +4,7 @@
4
4
  "name": "Bauhaus",
5
5
  "description": "Primary triad as structure — gallery white, near-black ink, and red, yellow, blue doing structural work: circle, triangle, square markers, thick geometric rules, zero radius.",
6
6
  "mode": "light",
7
- "version": "1.0.0",
7
+ "version": "1.0.1",
8
8
  "fonts": {
9
9
  "sans": "Jost",
10
10
  "mono": "Space Mono",
@@ -207,8 +207,8 @@ html[data-theme-pack="bauhaus"] header[data-header] {
207
207
  background-repeat: no-repeat;
208
208
  }
209
209
  html[data-theme-pack="bauhaus"] [data-header-logo] {
210
- font-family: var(--font-display);
211
- font-weight: 400;
210
+ font-family: var(--zdc-header-logo-font, var(--font-display));
211
+ font-weight: var(--zdc-header-logo-weight, 400);
212
212
  letter-spacing: 0.01em;
213
213
  }
214
214
  html[data-theme-pack="bauhaus"] [data-header-logo]::before {
@@ -4,7 +4,7 @@
4
4
  "name": "Blueprint",
5
5
  "description": "Cyanotype drafting sheet — pale-cyan linework on prussian grid paper, title-block caps, dashed rules, mono-caps labels. Light mode is the vellum original.",
6
6
  "mode": "dark",
7
- "version": "1.0.1",
7
+ "version": "1.0.2",
8
8
  "fonts": {
9
9
  "sans": "Inter",
10
10
  "mono": "IBM Plex Mono",
@@ -274,9 +274,9 @@ html[data-theme-pack="blueprint"] header[data-header]::after {
274
274
  /* the logo is the title-block cell: Josefin caps, bordered, with a
275
275
  drafting center-mark stamp */
276
276
  html[data-theme-pack="blueprint"] [data-header-logo] {
277
- font-family: var(--font-display);
277
+ font-family: var(--zdc-header-logo-font, var(--font-display));
278
278
  font-size: 1rem;
279
- font-weight: 600;
279
+ font-weight: var(--zdc-header-logo-weight, 600);
280
280
  text-transform: uppercase;
281
281
  letter-spacing: 0.14em;
282
282
  border: 1px solid color-mix(in oklch, var(--zd-fg) 55%, transparent);
@@ -4,7 +4,7 @@
4
4
  "name": "Botanica",
5
5
  "description": "A vintage botanical plate — herbarium cream, deep green ink, engraved double rules, Latin small-caps plate labels.",
6
6
  "mode": "light",
7
- "version": "1.0.0",
7
+ "version": "1.0.1",
8
8
  "fonts": {
9
9
  "sans": "Crimson Pro",
10
10
  "mono": "Courier Prime",
@@ -208,9 +208,9 @@ html[data-theme-pack="botanica"] header[data-header] {
208
208
  border-bottom: 3px double color-mix(in oklch, var(--zd-fg) 50%, transparent);
209
209
  }
210
210
  html[data-theme-pack="botanica"] [data-header-logo] {
211
- font-family: var(--font-display);
211
+ font-family: var(--zdc-header-logo-font, var(--font-display));
212
212
  font-size: 1.45rem;
213
- font-weight: 600;
213
+ font-weight: var(--zdc-header-logo-weight, 600);
214
214
  letter-spacing: 0.02em;
215
215
  }
216
216
  html[data-theme-pack="botanica"] [data-header-logo]::before {
@@ -4,7 +4,7 @@
4
4
  "name": "Broadsheet",
5
5
  "description": "Newspaper editorial — Playfair masthead, Oxford ink rules, a red drop cap, and a night-edition dark mode.",
6
6
  "mode": "light",
7
- "version": "1.0.2",
7
+ "version": "1.0.3",
8
8
  "fonts": {
9
9
  "sans": "Source Serif 4",
10
10
  "mono": "Courier Prime",
@@ -202,8 +202,8 @@ html[data-theme-pack="broadsheet"] header[data-header] {
202
202
  box-shadow: 0 6px 0 -5px var(--zd-fg);
203
203
  }
204
204
  html[data-theme-pack="broadsheet"] [data-header-logo] {
205
- font-family: var(--font-display);
206
- font-weight: 900;
205
+ font-family: var(--zdc-header-logo-font, var(--font-display));
206
+ font-weight: var(--zdc-header-logo-weight, 900);
207
207
  letter-spacing: 0.01em;
208
208
  }
209
209
  html[data-theme-pack="broadsheet"] [data-nav-item] {
@@ -4,7 +4,7 @@
4
4
  "name": "Brutalist",
5
5
  "description": "Raw concrete web — stark black on white, 4px slab borders, zero radius, hazard-orange tape. Structure you can see.",
6
6
  "mode": "light",
7
- "version": "1.0.3",
7
+ "version": "1.0.4",
8
8
  "fonts": {
9
9
  "sans": "Space Grotesk",
10
10
  "mono": "IBM Plex Mono",
@@ -255,8 +255,8 @@ html[data-theme-pack="brutalist"] header[data-header] button:focus-visible {
255
255
 
256
256
  html[data-theme-pack="brutalist"] [data-header-logo] {
257
257
  color: var(--zd-bg);
258
- font-family: var(--font-display);
259
- font-weight: 400;
258
+ font-family: var(--zdc-header-logo-font, var(--font-display));
259
+ font-weight: var(--zdc-header-logo-weight, 400);
260
260
  font-size: 1.02rem;
261
261
  text-transform: uppercase;
262
262
  letter-spacing: 0.04em;
@@ -4,7 +4,7 @@
4
4
  "name": "E-Ink",
5
5
  "description": "E-reader grayscale — warm paper, near-black ink, shadowless hairline chrome, zero radius. Code is told by weight, slant, and gray value; only diffs keep a trace of ink-blue and ink-red.",
6
6
  "mode": "light",
7
- "version": "1.0.0",
7
+ "version": "1.0.1",
8
8
  "fonts": {
9
9
  "sans": "EB Garamond",
10
10
  "mono": "Courier Prime",
@@ -255,7 +255,7 @@ html[data-theme-pack="eink"] .zd-content hr {
255
255
 
256
256
  /* device-menu chrome labels: small, letterspaced, even in Garamond */
257
257
  html[data-theme-pack="eink"] [data-header-logo] {
258
- font-weight: 600;
258
+ font-weight: var(--zdc-header-logo-weight, 600);
259
259
  font-size: 1.3rem;
260
260
  letter-spacing: 0.01em;
261
261
  }
@@ -4,7 +4,7 @@
4
4
  "name": "Futura Editorial",
5
5
  "description": "Normal-weight geometric Futura headings over Noto Sans body — clean white, near-black ink, one restrained red accent.",
6
6
  "mode": "light",
7
- "version": "1.0.1",
7
+ "version": "1.0.2",
8
8
  "fonts": {
9
9
  "sans": "Noto Sans",
10
10
  "mono": "Space Mono",
@@ -175,8 +175,8 @@ html[data-theme-pack="futura-editorial"] header[data-header] {
175
175
  border-bottom: 1px solid var(--zd-fg);
176
176
  }
177
177
  html[data-theme-pack="futura-editorial"] [data-header-logo] {
178
- font-family: var(--font-display);
179
- font-weight: 400;
178
+ font-family: var(--zdc-header-logo-font, var(--font-display));
179
+ font-weight: var(--zdc-header-logo-weight, 400);
180
180
  font-size: 1.05rem;
181
181
  text-transform: uppercase;
182
182
  letter-spacing: 0.16em;
@@ -4,7 +4,7 @@
4
4
  "name": "Hearth",
5
5
  "description": "Warm cream & brick-red fireside docs — Fraunces headings, amber code blocks, ember-glow dark mode.",
6
6
  "mode": "light",
7
- "version": "1.0.3",
7
+ "version": "1.0.4",
8
8
  "fonts": {
9
9
  "sans": "Nunito",
10
10
  "mono": "Spline Sans Mono",
@@ -193,8 +193,8 @@ html[data-theme-pack="hearth"] header[data-header] {
193
193
  );
194
194
  }
195
195
  html[data-theme-pack="hearth"] [data-header-logo] {
196
- font-family: var(--font-display);
197
- font-weight: 620;
196
+ font-family: var(--zdc-header-logo-font, var(--font-display));
197
+ font-weight: var(--zdc-header-logo-weight, 620);
198
198
  color: var(--zd-accent);
199
199
  }
200
200
  /* Exclude the current page: it carries the base `bg-fg text-bg` inverted
@@ -4,7 +4,7 @@
4
4
  "name": "Ledger",
5
5
  "description": "Cream academic serif in the Tufte tradition — warm paper, ink prose, oxblood links, hairline rules, quiet code.",
6
6
  "mode": "light",
7
- "version": "1.0.1",
7
+ "version": "1.0.2",
8
8
  "fonts": {
9
9
  "sans": "Crimson Pro",
10
10
  "mono": "IBM Plex Mono",
@@ -203,7 +203,7 @@ html[data-theme-pack="ledger"] header[data-header] {
203
203
  border-bottom-color: color-mix(in srgb, var(--zd-fg) 30%, transparent);
204
204
  }
205
205
  html[data-theme-pack="ledger"] [data-header-logo] {
206
- font-weight: 500;
206
+ font-weight: var(--zdc-header-logo-weight, 500);
207
207
  font-style: italic;
208
208
  font-size: 1.4rem;
209
209
  letter-spacing: 0.01em;
@@ -4,7 +4,7 @@
4
4
  "name": "Manuscript",
5
5
  "description": "A quiet Garamond book page — warm paper, soft ink, sepia rubrication, small-caps subheads, fleuron section marks.",
6
6
  "mode": "light",
7
- "version": "1.0.1",
7
+ "version": "1.0.2",
8
8
  "fonts": {
9
9
  "sans": "EB Garamond",
10
10
  "mono": "Courier Prime",
@@ -183,7 +183,7 @@ html[data-theme-pack="manuscript"] header[data-header] {
183
183
  html[data-theme-pack="manuscript"] [data-header-logo] {
184
184
  font-variant-caps: small-caps;
185
185
  letter-spacing: 0.06em;
186
- font-weight: 600;
186
+ font-weight: var(--zdc-header-logo-weight, 600);
187
187
  font-size: 1.35rem;
188
188
  }
189
189
  html[data-theme-pack="manuscript"] [data-nav-item] {
@@ -4,7 +4,7 @@
4
4
  "name": "Matcha",
5
5
  "description": "Green tea ceremony — deep matcha on warm cream, mincho headings, zen whitespace, tea-foam surfaces in both modes.",
6
6
  "mode": "light",
7
- "version": "1.0.2",
7
+ "version": "1.0.3",
8
8
  "fonts": {
9
9
  "sans": "Zen Kaku Gothic New",
10
10
  "mono": "M PLUS 1 Code",
@@ -251,8 +251,8 @@ html[data-theme-pack="matcha"] header[data-header] {
251
251
  );
252
252
  }
253
253
  html[data-theme-pack="matcha"] [data-header-logo] {
254
- font-family: var(--font-display);
255
- font-weight: 600;
254
+ font-family: var(--zdc-header-logo-font, var(--font-display));
255
+ font-weight: var(--zdc-header-logo-weight, 600);
256
256
  letter-spacing: 0.05em;
257
257
  }
258
258
 
@@ -4,7 +4,7 @@
4
4
  "name": "Nocturne",
5
5
  "description": "Purple midnight — velvet aubergine depths, lavender links, and muted gold hairlines. Elegant, never neon.",
6
6
  "mode": "dark",
7
- "version": "1.0.2",
7
+ "version": "1.0.3",
8
8
  "fonts": {
9
9
  "sans": "Manrope",
10
10
  "mono": "IBM Plex Mono",
@@ -235,8 +235,8 @@ html[data-theme-pack="nocturne"] header[data-header] {
235
235
  );
236
236
  }
237
237
  html[data-theme-pack="nocturne"] [data-header-logo] {
238
- font-family: var(--font-display);
239
- font-weight: 600;
238
+ font-family: var(--zdc-header-logo-font, var(--font-display));
239
+ font-weight: var(--zdc-header-logo-weight, 600);
240
240
  font-size: 1.45rem;
241
241
  letter-spacing: 0.02em;
242
242
  }
@@ -4,7 +4,7 @@
4
4
  "name": "Observatory",
5
5
  "description": "Night-sky atlas: star-field depth, constellation-line rules, nebula violet and comet gold over astronomer's navy.",
6
6
  "mode": "dark",
7
- "version": "1.0.3",
7
+ "version": "1.0.4",
8
8
  "fonts": {
9
9
  "sans": "Jost",
10
10
  "mono": "Space Mono",
@@ -288,8 +288,8 @@ html[data-theme-pack="observatory"] header[data-header] {
288
288
  );
289
289
  }
290
290
  html[data-theme-pack="observatory"] [data-header-logo] {
291
- font-family: var(--font-display);
292
- font-weight: 300;
291
+ font-family: var(--zdc-header-logo-font, var(--font-display));
292
+ font-weight: var(--zdc-header-logo-weight, 300);
293
293
  font-size: 1.05rem;
294
294
  letter-spacing: 0.16em;
295
295
  text-transform: uppercase;
@@ -4,7 +4,7 @@
4
4
  "name": "Onyx",
5
5
  "description": "Luxury noir — jet black, champagne serif headings, and a single gold hairline accent. Watch-brand restraint.",
6
6
  "mode": "dark",
7
- "version": "1.0.3",
7
+ "version": "1.0.4",
8
8
  "fonts": {
9
9
  "sans": "Jost",
10
10
  "mono": "IBM Plex Mono",
@@ -229,8 +229,8 @@ html[data-theme-pack="onyx"] header[data-header] {
229
229
  border-bottom: 1px solid color-mix(in oklch, var(--zd-accent) 38%, transparent);
230
230
  }
231
231
  html[data-theme-pack="onyx"] [data-header-logo] {
232
- font-family: var(--font-display);
233
- font-weight: 600;
232
+ font-family: var(--zdc-header-logo-font, var(--font-display));
233
+ font-weight: var(--zdc-header-logo-weight, 600);
234
234
  font-size: 1.35rem;
235
235
  letter-spacing: 0.04em;
236
236
  }
@@ -4,7 +4,7 @@
4
4
  "name": "Phosphor",
5
5
  "description": "Green CRT terminal — phosphor glow, scanlines, inverse-video nav, monospace everything.",
6
6
  "mode": "dark",
7
- "version": "1.0.1",
7
+ "version": "1.0.2",
8
8
  "fonts": {
9
9
  "sans": "JetBrains Mono",
10
10
  "mono": "JetBrains Mono",
@@ -225,8 +225,8 @@ html[data-theme-pack="phosphor"] header[data-header] {
225
225
  border-bottom-color: color-mix(in oklch, var(--zd-accent) 40%, transparent);
226
226
  }
227
227
  html[data-theme-pack="phosphor"] [data-header-logo] {
228
- font-family: var(--font-display);
229
- font-weight: 400;
228
+ font-family: var(--zdc-header-logo-font, var(--font-display));
229
+ font-weight: var(--zdc-header-logo-weight, 400);
230
230
  font-size: 1.55rem;
231
231
  color: var(--zd-accent);
232
232
  }
@@ -4,7 +4,7 @@
4
4
  "name": "Riso",
5
5
  "description": "Risograph duotone print — warm paper, two inks (riso blue + fluorescent coral), misregistered offset shadows, and a soft linear paper grain.",
6
6
  "mode": "light",
7
- "version": "1.0.0",
7
+ "version": "1.0.1",
8
8
  "fonts": {
9
9
  "sans": "Space Grotesk",
10
10
  "mono": "Space Mono",
@@ -235,8 +235,8 @@ html[data-theme-pack="riso"] header[data-header] {
235
235
  border-bottom: 3px solid var(--zd-accent);
236
236
  }
237
237
  html[data-theme-pack="riso"] [data-header-logo] {
238
- font-family: var(--font-display);
239
- font-weight: 400;
238
+ font-family: var(--zdc-header-logo-font, var(--font-display));
239
+ font-weight: var(--zdc-header-logo-weight, 400);
240
240
  letter-spacing: 0.01em;
241
241
  }
242
242
  html[data-theme-pack="riso"] [data-header-logo]::before {
@@ -4,7 +4,7 @@
4
4
  "name": "Sakura",
5
5
  "description": "Cherry-blossom pastels — blush-white paper, plum ink, and rose accents on petal-soft corners; dark mode is yozakura, night blossoms under lantern-pink light.",
6
6
  "mode": "light",
7
- "version": "1.0.1",
7
+ "version": "1.0.2",
8
8
  "fonts": {
9
9
  "sans": "Nunito",
10
10
  "mono": "M PLUS 1 Code",
@@ -215,8 +215,8 @@ html[data-theme-pack="sakura"] header[data-header] {
215
215
 
216
216
  /* wordmark — mincho voice with a single blossom */
217
217
  html[data-theme-pack="sakura"] [data-header-logo] {
218
- font-family: var(--font-display);
219
- font-weight: 700;
218
+ font-family: var(--zdc-header-logo-font, var(--font-display));
219
+ font-weight: var(--zdc-header-logo-weight, 700);
220
220
  letter-spacing: 0.015em;
221
221
  }
222
222
  html[data-theme-pack="sakura"] [data-header-logo]::after {
@@ -4,7 +4,7 @@
4
4
  "name": "Scandi",
5
5
  "description": "Hygge minimalism — oat linen, sage & clay, pill nav actives and 8px corners; night mode is warm charcoal lit by candle amber.",
6
6
  "mode": "light",
7
- "version": "1.0.0",
7
+ "version": "1.0.1",
8
8
  "fonts": {
9
9
  "sans": "Manrope",
10
10
  "mono": "Spline Sans Mono",
@@ -144,7 +144,7 @@ html[data-theme-pack="scandi"] header[data-header] {
144
144
  border-bottom-color: color-mix(in srgb, var(--zd-muted) 26%, transparent);
145
145
  }
146
146
  html[data-theme-pack="scandi"] [data-header-logo] {
147
- font-weight: 800;
147
+ font-weight: var(--zdc-header-logo-weight, 800);
148
148
  letter-spacing: -0.02em;
149
149
  }
150
150
  html[data-theme-pack="scandi"] [data-nav-item] {
@@ -4,7 +4,7 @@
4
4
  "name": "Solar",
5
5
  "description": "Solarized precision — low-eyestrain paper tones, blue/cyan/orange accents, mono labels, technical calm in both modes.",
6
6
  "mode": "light",
7
- "version": "1.0.1",
7
+ "version": "1.0.2",
8
8
  "fonts": {
9
9
  "sans": "Source Sans 3",
10
10
  "mono": "Source Code Pro",
@@ -190,7 +190,7 @@ html[data-theme-pack="solar"] body {
190
190
 
191
191
  /* logo gets the sun glyph in solarized orange */
192
192
  html[data-theme-pack="solar"] [data-header-logo] {
193
- font-weight: 600;
193
+ font-weight: var(--zdc-header-logo-weight, 600);
194
194
  letter-spacing: -0.01em;
195
195
  }
196
196
  html[data-theme-pack="solar"] [data-header-logo]::after {
@@ -4,7 +4,7 @@
4
4
  "name": "Sumi",
5
5
  "description": "Sumi-e ink on washi — bold mincho brush headings, deep black strokes, one vermillion hanko seal accent.",
6
6
  "mode": "light",
7
- "version": "1.0.3",
7
+ "version": "1.0.4",
8
8
  "fonts": {
9
9
  "sans": "Zen Kaku Gothic New",
10
10
  "mono": "IBM Plex Mono",
@@ -253,8 +253,8 @@ html[data-theme-pack="sumi"] header[data-header] {
253
253
  border-bottom: 3px solid var(--zd-fg);
254
254
  }
255
255
  html[data-theme-pack="sumi"] [data-header-logo] {
256
- font-family: var(--font-display);
257
- font-weight: 800;
256
+ font-family: var(--zdc-header-logo-font, var(--font-display));
257
+ font-weight: var(--zdc-header-logo-weight, 800);
258
258
  letter-spacing: 0.02em;
259
259
  }
260
260
  html[data-theme-pack="sumi"] [data-header-logo]::after {
@@ -4,7 +4,7 @@
4
4
  "name": "Swissgrid",
5
5
  "description": "International Typographic Style — grid discipline, black on white, one hot Swiss-red accent, oversized section numbers.",
6
6
  "mode": "light",
7
- "version": "1.0.1",
7
+ "version": "1.0.2",
8
8
  "fonts": {
9
9
  "sans": "Inter",
10
10
  "mono": "IBM Plex Mono",
@@ -204,7 +204,7 @@ html[data-theme-pack="swissgrid"] header[data-header] {
204
204
  border-bottom: 3px solid var(--zd-fg);
205
205
  }
206
206
  html[data-theme-pack="swissgrid"] [data-header-logo] {
207
- font-weight: 900;
207
+ font-weight: var(--zdc-header-logo-weight, 900);
208
208
  letter-spacing: -0.03em;
209
209
  }
210
210
  html[data-theme-pack="swissgrid"] [data-header-logo]::before {
@@ -4,7 +4,7 @@
4
4
  "name": "Timberline",
5
5
  "description": "Forest cabin after dark — pine & umber planks, cream prose, and matte lantern-amber accents; light mode is the same lodge at morning.",
6
6
  "mode": "dark",
7
- "version": "1.0.1",
7
+ "version": "1.0.2",
8
8
  "fonts": {
9
9
  "sans": "Source Sans 3",
10
10
  "mono": "JetBrains Mono",
@@ -212,8 +212,8 @@ html[data-theme-pack="timberline"] header[data-header] {
212
212
  box-shadow: 0 1px 0 0 light-dark(oklch(0.988 0.008 95 / 0.85), oklch(0.87 0.07 80 / 0.13));
213
213
  }
214
214
  html[data-theme-pack="timberline"] [data-header-logo] {
215
- font-family: var(--font-display);
216
- font-weight: 620;
215
+ font-family: var(--zdc-header-logo-font, var(--font-display));
216
+ font-weight: var(--zdc-header-logo-weight, 620);
217
217
  letter-spacing: -0.005em;
218
218
  color: var(--zd-accent);
219
219
  }
@@ -4,7 +4,7 @@
4
4
  "name": "Washi",
5
5
  "description": "Warm washi paper, sumi ink, and ai-iro indigo seals — quiet Japanese stationery for calm documentation.",
6
6
  "mode": "light",
7
- "version": "1.0.3",
7
+ "version": "1.0.4",
8
8
  "fonts": {
9
9
  "sans": "Zen Kaku Gothic New",
10
10
  "mono": "M PLUS 1 Code",
@@ -276,8 +276,8 @@ html[data-theme-pack="washi"] header[data-header] {
276
276
 
277
277
  /* header logo: mincho wordmark with a small square indigo mark */
278
278
  html[data-theme-pack="washi"] [data-header-logo] {
279
- font-family: var(--font-display);
280
- font-weight: 700;
279
+ font-family: var(--zdc-header-logo-font, var(--font-display));
280
+ font-weight: var(--zdc-header-logo-weight, 700);
281
281
  letter-spacing: 0.02em;
282
282
  }
283
283
  html[data-theme-pack="washi"] [data-header-logo]::before {
@@ -0,0 +1,68 @@
1
+ import { normalizeIslandData } from "../chrome/island-data.js";
2
+ import type { SidebarNavNode, SidebarNavigationContext } from "./types.js";
3
+
4
+ /** Navigation data needed by the native sidebar islands, without server prose. */
5
+ export type SidebarClientNode = Omit<SidebarNavNode, "description" | "children"> & {
6
+ children: SidebarClientNode[];
7
+ };
8
+
9
+ export type SidebarClientNavigation = Omit<SidebarNavigationContext, "roots"> & {
10
+ roots: SidebarClientNode[];
11
+ };
12
+
13
+ // Exhaustive policy: new server fields require an explicit transport decision.
14
+ const nodeFields = {
15
+ occurrenceId: true,
16
+ slug: true,
17
+ label: true,
18
+ description: false,
19
+ position: true,
20
+ href: true,
21
+ hasPage: true,
22
+ children: true,
23
+ sortOrder: true,
24
+ collapsed: true,
25
+ shape: true,
26
+ noteTrayDated: true,
27
+ noteTraySidebar: true,
28
+ date: true,
29
+ updated: true,
30
+ rank: true,
31
+ } as const satisfies Record<keyof SidebarNavNode, boolean>;
32
+
33
+ /**
34
+ * Copy navigation for SSR and hydration at an island boundary. Server builders
35
+ * retain descriptions; custom island hosts can opt into this same projection.
36
+ * Validate before selecting fields so discarded data cannot conceal invalid
37
+ * transport values. Preserve the opaque scope ID and editorial topology.
38
+ */
39
+ export function toSidebarClientData(
40
+ nodes: SidebarNavNode[],
41
+ navigation?: SidebarNavigationContext,
42
+ ): { nodes: SidebarClientNode[]; navigation?: SidebarClientNavigation } {
43
+ const source = normalizeIslandData({ nodes, navigation });
44
+ function project(node: SidebarNavNode): SidebarClientNode {
45
+ const result: Record<string, unknown> = {};
46
+ for (const key of Object.keys(nodeFields) as Array<keyof SidebarNavNode>) {
47
+ if (nodeFields[key] && key !== "children" && node[key] !== undefined) {
48
+ result[key] = node[key];
49
+ }
50
+ }
51
+ result.children = node.children.map(project);
52
+ return result as SidebarClientNode;
53
+ }
54
+ return {
55
+ nodes: source.nodes.map(project),
56
+ ...(source.navigation ? {
57
+ navigation: {
58
+ id: source.navigation.id,
59
+ roots: source.navigation.roots.map(project),
60
+ parents: source.navigation.parents,
61
+ ...(source.navigation.initialExpansion !== undefined
62
+ ? { initialExpansion: source.navigation.initialExpansion } : {}),
63
+ ...(source.navigation.localParentId !== undefined
64
+ ? { localParentId: source.navigation.localParentId } : {}),
65
+ },
66
+ } : {}),
67
+ };
68
+ }
@@ -18,6 +18,8 @@
18
18
  */
19
19
 
20
20
  export { Sidebar } from "./sidebar.js";
21
+ export { toSidebarClientData } from "./client-data.js";
22
+ export type { SidebarClientNode, SidebarClientNavigation } from "./client-data.js";
21
23
  export type { SidebarProps } from "./sidebar.js";
22
24
  export type {
23
25
  SidebarLocaleLink,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@takazudo/zudo-doc",
3
- "version": "6.0.0",
3
+ "version": "6.0.2",
4
4
  "type": "module",
5
5
  "description": "zudo-doc framework primitives layer that sits on top of zfb's engine — sidebar, theme, TOC, breadcrumb, layouts, head injection, View Transitions, SSR-skip wrappers (per ADR-003).",
6
6
  "license": "MIT",
@@ -733,9 +733,9 @@
733
733
  "peerDependencies": {
734
734
  "@modelcontextprotocol/sdk": "1.32.1",
735
735
  "@takazudo/zdtp": "^0.5.2 || ^0.6.0 || ^0.7.0 || ^0.8.0",
736
- "@takazudo/zfb": "^4.3.1",
737
- "@takazudo/zfb-md-wasm": "^4.3.1",
738
- "@takazudo/zfb-runtime": "^4.3.1",
736
+ "@takazudo/zfb": "^4.3.2",
737
+ "@takazudo/zfb-md-wasm": "^4.3.2",
738
+ "@takazudo/zfb-runtime": "^4.3.2",
739
739
  "@takazudo/zudo-doc-history-server": "^6.0.0",
740
740
  "diff": "^8.0.0",
741
741
  "katex": "^0.16.0",
@@ -776,9 +776,9 @@
776
776
  "devDependencies": {
777
777
  "@modelcontextprotocol/sdk": "1.32.1",
778
778
  "@takazudo/mdx-formatter": "1.3.0",
779
- "@takazudo/zfb": "4.3.1",
780
- "@takazudo/zfb-md-wasm": "4.3.1",
781
- "@takazudo/zfb-runtime": "4.3.1",
779
+ "@takazudo/zfb": "4.3.2",
780
+ "@takazudo/zfb-md-wasm": "4.3.2",
781
+ "@takazudo/zfb-runtime": "4.3.2",
782
782
  "@types/fs-extra": "^11.0.4",
783
783
  "@types/minimist": "^1.2.5",
784
784
  "@types/node": "^25.3.5",
@@ -788,7 +788,7 @@
788
788
  "typescript": "^5.0.0",
789
789
  "vitest": "^4.1.0",
790
790
  "zod": "^4.3.6",
791
- "@takazudo/zudo-doc-history-server": "6.0.0"
791
+ "@takazudo/zudo-doc-history-server": "6.0.2"
792
792
  },
793
793
  "scripts": {
794
794
  "gen:search-widget-script": "node scripts/gen-search-widget-script.mjs",