@takazudo/zudo-doc 4.2.1 → 4.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (164) hide show
  1. package/CHANGELOG.md +43 -0
  2. package/README.md +3 -3
  3. package/bin/zudo-doc.mjs +54 -13
  4. package/dist/auto-logo/index.d.ts +18 -0
  5. package/dist/auto-logo/index.js +33 -0
  6. package/dist/auto-logo/shapes.d.ts +32 -0
  7. package/dist/auto-logo/shapes.js +183 -0
  8. package/dist/auto-logo/standalone.d.ts +7 -0
  9. package/dist/auto-logo/standalone.js +35 -0
  10. package/dist/color-scheme-utils.d.ts +4 -3
  11. package/dist/color-scheme-utils.js +1 -1
  12. package/dist/config/component-tokens.js +2 -2
  13. package/dist/config.d.ts +23 -1
  14. package/dist/config.js +3 -0
  15. package/dist/content.css +4 -3
  16. package/dist/doc-content-header/index.js +1 -1
  17. package/dist/doc-history/index.js +1 -1
  18. package/dist/doc-history-area/index.d.ts +1 -0
  19. package/dist/doc-history-area/index.js +3 -0
  20. package/dist/doc-page-shell/index.js +1 -1
  21. package/dist/doc-pager/index.js +2 -2
  22. package/dist/eject-logo/config-parse.d.ts +25 -0
  23. package/dist/eject-logo/config-parse.js +68 -0
  24. package/dist/eject-logo/config-rewriter.d.ts +22 -0
  25. package/dist/eject-logo/config-rewriter.js +68 -0
  26. package/dist/eject-logo/eject.d.ts +18 -0
  27. package/dist/eject-logo/eject.js +66 -0
  28. package/dist/eject-logo/index.d.ts +4 -0
  29. package/dist/eject-logo/index.js +16 -0
  30. package/dist/eject-logo/site-name.d.ts +21 -0
  31. package/dist/eject-logo/site-name.js +31 -0
  32. package/dist/features.css +8 -29
  33. package/dist/header/header.js +14 -6
  34. package/dist/header/nav-class-tokens.d.ts +12 -0
  35. package/dist/header/nav-class-tokens.js +80 -0
  36. package/dist/header/nav-overflow-script.js +33 -16
  37. package/dist/home-page/index.d.ts +34 -5
  38. package/dist/home-page/index.js +95 -38
  39. package/dist/home-page/prepare-home-data.d.ts +9 -0
  40. package/dist/home-page/prepare-home-data.js +10 -3
  41. package/dist/html-preview-wrapper/highlight-runtime.d.ts +40 -0
  42. package/dist/html-preview-wrapper/highlight-runtime.js +58 -0
  43. package/dist/html-preview-wrapper/highlighted-code.d.ts +3 -2
  44. package/dist/html-preview-wrapper/highlighted-code.js +11 -30
  45. package/dist/i18n-defaults/index.js +3 -0
  46. package/dist/metainfo/doc-metainfo.js +35 -22
  47. package/dist/plugins/doc-history.js +6 -2
  48. package/dist/plugins/internal/doc-history/index.d.ts +2 -0
  49. package/dist/plugins/internal/doc-history/index.js +5 -0
  50. package/dist/plugins/internal/doc-history/pre-build.d.ts +2 -0
  51. package/dist/plugins/internal/doc-history/pre-build.js +3 -0
  52. package/dist/preset.d.ts +1 -0
  53. package/dist/preset.js +2 -1
  54. package/dist/routes/index.js +13 -3
  55. package/dist/routes/locale-index.js +12 -2
  56. package/dist/safelist.css +1 -1
  57. package/dist/settings.d.ts +15 -0
  58. package/dist/sidebar-tree-island/index.js +3 -3
  59. package/dist/theme-cli/config-scanner.js +47 -0
  60. package/dist/theme-packs/academia/fonts/CourierPrime-400-latin.woff2 +0 -0
  61. package/dist/theme-packs/academia/fonts/CourierPrime-700-latin.woff2 +0 -0
  62. package/dist/theme-packs/academia/fonts/OFL.txt +94 -0
  63. package/dist/theme-packs/academia/fonts/SourceSerif4-italic-latin.woff2 +0 -0
  64. package/dist/theme-packs/academia/fonts/SourceSerif4-latin.woff2 +0 -0
  65. package/dist/theme-packs/academia/meta.json +37 -0
  66. package/dist/theme-packs/academia/pack.css +505 -0
  67. package/dist/theme-packs/bauhaus/fonts/ArchivoBlack-latin.woff2 +0 -0
  68. package/dist/theme-packs/bauhaus/fonts/Jost-latin.woff2 +0 -0
  69. package/dist/theme-packs/bauhaus/fonts/OFL.txt +95 -0
  70. package/dist/theme-packs/bauhaus/fonts/SpaceMono-400-latin.woff2 +0 -0
  71. package/dist/theme-packs/bauhaus/fonts/SpaceMono-700-latin.woff2 +0 -0
  72. package/dist/theme-packs/bauhaus/meta.json +38 -0
  73. package/dist/theme-packs/bauhaus/pack.css +614 -0
  74. package/dist/theme-packs/blueprint/fonts/IBMPlexMono-400-latin-ext.woff2 +0 -0
  75. package/dist/theme-packs/blueprint/fonts/IBMPlexMono-400-latin.woff2 +0 -0
  76. package/dist/theme-packs/blueprint/fonts/IBMPlexMono-500-latin-ext.woff2 +0 -0
  77. package/dist/theme-packs/blueprint/fonts/IBMPlexMono-500-latin.woff2 +0 -0
  78. package/dist/theme-packs/blueprint/fonts/Inter-latin-ext.woff2 +0 -0
  79. package/dist/theme-packs/blueprint/fonts/Inter-latin.woff2 +0 -0
  80. package/dist/theme-packs/blueprint/fonts/JosefinSans-latin.woff2 +0 -0
  81. package/dist/theme-packs/blueprint/fonts/OFL.txt +95 -0
  82. package/dist/theme-packs/blueprint/meta.json +38 -0
  83. package/dist/theme-packs/blueprint/pack.css +577 -0
  84. package/dist/theme-packs/botanica/fonts/CormorantGaramond-latin.woff2 +0 -0
  85. package/dist/theme-packs/botanica/fonts/CourierPrime-400-latin-ext.woff2 +0 -0
  86. package/dist/theme-packs/botanica/fonts/CourierPrime-400-latin.woff2 +0 -0
  87. package/dist/theme-packs/botanica/fonts/CourierPrime-700-latin-ext.woff2 +0 -0
  88. package/dist/theme-packs/botanica/fonts/CourierPrime-700-latin.woff2 +0 -0
  89. package/dist/theme-packs/botanica/fonts/CrimsonPro-latin-italic.woff2 +0 -0
  90. package/dist/theme-packs/botanica/fonts/CrimsonPro-latin.woff2 +0 -0
  91. package/dist/theme-packs/botanica/fonts/OFL.txt +95 -0
  92. package/dist/theme-packs/botanica/meta.json +38 -0
  93. package/dist/theme-packs/botanica/pack.css +546 -0
  94. package/dist/theme-packs/brutalist/meta.json +1 -1
  95. package/dist/theme-packs/brutalist/pack.css +10 -9
  96. package/dist/theme-packs/eink/fonts/CourierPrime-400-latin-ext.woff2 +0 -0
  97. package/dist/theme-packs/eink/fonts/CourierPrime-400-latin.woff2 +0 -0
  98. package/dist/theme-packs/eink/fonts/CourierPrime-700-latin-ext.woff2 +0 -0
  99. package/dist/theme-packs/eink/fonts/CourierPrime-700-latin.woff2 +0 -0
  100. package/dist/theme-packs/eink/fonts/EBGaramond-latin-italic.woff2 +0 -0
  101. package/dist/theme-packs/eink/fonts/EBGaramond-latin.woff2 +0 -0
  102. package/dist/theme-packs/eink/fonts/OFL.txt +94 -0
  103. package/dist/theme-packs/eink/meta.json +37 -0
  104. package/dist/theme-packs/eink/pack.css +490 -0
  105. package/dist/theme-packs/foundry/meta.json +1 -1
  106. package/dist/theme-packs/foundry/pack.css +2 -2
  107. package/dist/theme-packs/hearth/meta.json +1 -1
  108. package/dist/theme-packs/hearth/pack.css +15 -4
  109. package/dist/theme-packs/nocturne/pack.css +4 -0
  110. package/dist/theme-packs/observatory/meta.json +1 -1
  111. package/dist/theme-packs/observatory/pack.css +4 -1
  112. package/dist/theme-packs/onyx/pack.css +6 -0
  113. package/dist/theme-packs/phosphor/pack.css +4 -0
  114. package/dist/theme-packs/riso/fonts/ArchivoBlack-latin.woff2 +0 -0
  115. package/dist/theme-packs/riso/fonts/OFL.txt +95 -0
  116. package/dist/theme-packs/riso/fonts/SpaceGrotesk-latin.woff2 +0 -0
  117. package/dist/theme-packs/riso/fonts/SpaceMono-400-italic-latin.woff2 +0 -0
  118. package/dist/theme-packs/riso/fonts/SpaceMono-400-latin.woff2 +0 -0
  119. package/dist/theme-packs/riso/fonts/SpaceMono-700-latin.woff2 +0 -0
  120. package/dist/theme-packs/riso/meta.json +38 -0
  121. package/dist/theme-packs/riso/pack.css +602 -0
  122. package/dist/theme-packs/sakura/fonts/MPlus1Code-400-latin.woff2 +0 -0
  123. package/dist/theme-packs/sakura/fonts/MPlus1Code-500-latin.woff2 +0 -0
  124. package/dist/theme-packs/sakura/fonts/Nunito-latin.woff2 +0 -0
  125. package/dist/theme-packs/sakura/fonts/OFL.txt +95 -0
  126. package/dist/theme-packs/sakura/fonts/ShipporiMincho-600-latin.woff2 +0 -0
  127. package/dist/theme-packs/sakura/fonts/ShipporiMincho-700-latin.woff2 +0 -0
  128. package/dist/theme-packs/sakura/meta.json +38 -0
  129. package/dist/theme-packs/sakura/pack.css +473 -0
  130. package/dist/theme-packs/scandi/fonts/Manrope-latin.woff2 +0 -0
  131. package/dist/theme-packs/scandi/fonts/OFL.txt +94 -0
  132. package/dist/theme-packs/scandi/fonts/SplineSansMono-latin.woff2 +0 -0
  133. package/dist/theme-packs/scandi/meta.json +37 -0
  134. package/dist/theme-packs/scandi/pack.css +370 -0
  135. package/dist/theme-packs/sumi/meta.json +1 -1
  136. package/dist/theme-packs/sumi/pack.css +4 -1
  137. package/dist/theme-packs/swissgrid/pack.css +4 -0
  138. package/dist/theme-packs/tidepool/fonts/JetBrainsMono-latin-ext.woff2 +0 -0
  139. package/dist/theme-packs/tidepool/fonts/JetBrainsMono-latin.woff2 +0 -0
  140. package/dist/theme-packs/tidepool/fonts/OFL.txt +94 -0
  141. package/dist/theme-packs/tidepool/fonts/SpaceGrotesk-latin.woff2 +0 -0
  142. package/dist/theme-packs/tidepool/meta.json +37 -0
  143. package/dist/theme-packs/tidepool/pack.css +425 -0
  144. package/dist/theme-packs/timberline/fonts/Fraunces-italic-latin.woff2 +0 -0
  145. package/dist/theme-packs/timberline/fonts/Fraunces-latin.woff2 +0 -0
  146. package/dist/theme-packs/timberline/fonts/JetBrainsMono-latin.woff2 +0 -0
  147. package/dist/theme-packs/timberline/fonts/OFL.txt +95 -0
  148. package/dist/theme-packs/timberline/fonts/SourceSans3-italic-latin.woff2 +0 -0
  149. package/dist/theme-packs/timberline/fonts/SourceSans3-latin.woff2 +0 -0
  150. package/dist/theme-packs/timberline/meta.json +38 -0
  151. package/dist/theme-packs/timberline/pack.css +509 -0
  152. package/dist/theme-packs/washi/meta.json +1 -1
  153. package/dist/theme-packs/washi/pack.css +6 -26
  154. package/dist/theme-packs-registry/validator.js +24 -1
  155. package/dist/theme.css +1 -1
  156. package/eject/doc-history/index.tsx +1 -1
  157. package/eject/doc-pager/index.tsx +2 -2
  158. package/eject/header/header.tsx +16 -8
  159. package/eject/header/nav-class-tokens.ts +115 -0
  160. package/eject/header/nav-overflow-script.ts +49 -16
  161. package/eject/sidebar-tree-island/index.tsx +4 -4
  162. package/package.json +16 -13
  163. package/routes-src/index.tsx +10 -3
  164. package/routes-src/locale-index.tsx +9 -2
@@ -0,0 +1,614 @@
1
+ /* ============================================================
2
+ Bauhaus — primary triad as structure
3
+ (ADR docs/adr/theme-packs.md; epic #3055, sub-issue #3057)
4
+
5
+ Gallery white, near-black ink, and red / yellow / blue used
6
+ STRUCTURALLY, never decoratively: red is the accent (links,
7
+ keywords, emphasis, list markers), yellow is the highlight band
8
+ (selection, sidebar/TOC current location, search matches, hover
9
+ washes — always carrying dark ink, never used as text ink on
10
+ white), blue is information (info admonitions, callables, focus
11
+ ring, pager hover). Circle / triangle / square admonition
12
+ markers pair each geometric shape with a triad family; thick
13
+ geometric rules (tri-color masthead/footer stripes, 4px h2 bars
14
+ with a red lead segment, 3px table head rules); zero radius on
15
+ every seam. Dark mode is exhibition night: charcoal walls, the
16
+ same triad brightened a step.
17
+
18
+ Jost (variable 400-600) carries body AND chrome — the OFL
19
+ geometric-sans homage mandated by ADR Decision 5; the commercial
20
+ face it nods to is never named here. Archivo Black is the
21
+ poster face for the h1 and the logotype only; Space Mono
22
+ (400 + 700) sets code with true-bold keywords.
23
+
24
+ Differentiation notes: swissgrid is ONE-red Swiss discipline —
25
+ this pack's identity is the three-color triad with shape-coded
26
+ roles; futura-editorial shares Jost but stays monochrome+red
27
+ with normal-weight headings — this pack goes poster-black h1,
28
+ color-blocked admonition bands, and yellow location bands;
29
+ brutalist is slab borders + Archivo Black everywhere — here the
30
+ poster face appears exactly twice and structure comes from
31
+ color geometry, not border weight.
32
+
33
+ Every rule below is scoped under html[data-theme-pack="bauhaus"]
34
+ — this is what makes the runtime pack swap atomic (Decision 3)
35
+ and lets the validator prove a pack can never leak styles while
36
+ inactive (Decision 6.7). The @font-face blocks are the sole
37
+ exception (at-rules can't be selector-scoped).
38
+
39
+ Adaptations against the REAL DOM (theme-pack-authoring.md (a)/(b));
40
+ the 27-bauhaus prototype was inspiration only, no selector copied:
41
+ - the prototype's .sb-group shape markers don't exist in the real
42
+ SidebarTree island — the shape system lives on the admonition
43
+ hooks instead (the stable .admonition-title::before seam);
44
+ - .toc-active → nav[data-zd-toc] a[aria-current="true"] (the
45
+ aria-current state IS the contract; mobile twin selector kept);
46
+ - .doc-pager → .zd-content > nav[data-doc-pager] (stable hook);
47
+ - .lead → p[data-doc-description];
48
+ - the prototype's lowercase heading transform is intentionally
49
+ NOT ported (proper nouns in real docs must keep their case).
50
+
51
+ Contrast: every text pair below clears WCAG 4.5:1 with headroom
52
+ in both modes, including composited surfaces (band inks, 12%
53
+ admonition tints, 16% yellow hover washes, diff-line washes) —
54
+ verified computationally with culori before commit (#3057).
55
+ ============================================================ */
56
+
57
+ /* ---- Jost — body + chrome face. Variable file covering 400-600:
58
+ 400 body text, 500 labels, 600 h2/h3/h4 and active items. ---- */
59
+
60
+ @font-face {
61
+ font-family: "Jost";
62
+ font-style: normal;
63
+ font-weight: 400 600;
64
+ font-display: swap;
65
+ src: url("./fonts/Jost-latin.woff2") format("woff2");
66
+ unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA,
67
+ U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191,
68
+ U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
69
+ }
70
+
71
+ /* ---- Archivo Black — the poster face. Single black weight, used
72
+ only for the h1 headline and the header logotype. ---- */
73
+
74
+ @font-face {
75
+ font-family: "Archivo Black";
76
+ font-style: normal;
77
+ font-weight: 400;
78
+ font-display: swap;
79
+ src: url("./fonts/ArchivoBlack-latin.woff2") format("woff2");
80
+ unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA,
81
+ U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191,
82
+ U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
83
+ }
84
+
85
+ /* ---- Space Mono — code face (static 400 + 700; the 700 keeps
86
+ keywords genuinely bold, not smeared). ---- */
87
+
88
+ @font-face {
89
+ font-family: "Space Mono";
90
+ font-style: normal;
91
+ font-weight: 400;
92
+ font-display: swap;
93
+ src: url("./fonts/SpaceMono-400-latin.woff2") format("woff2");
94
+ unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA,
95
+ U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191,
96
+ U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
97
+ }
98
+
99
+ @font-face {
100
+ font-family: "Space Mono";
101
+ font-style: normal;
102
+ font-weight: 700;
103
+ font-display: swap;
104
+ src: url("./fonts/SpaceMono-700-latin.woff2") format("woff2");
105
+ unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA,
106
+ U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191,
107
+ U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
108
+ }
109
+
110
+ html[data-theme-pack="bauhaus"] {
111
+ /* Tier-2 semantic roles — both modes always via light-dark().
112
+ Gallery white / charcoal night; warm near-black ink / warm paper.
113
+ Structural triad: red = accent, yellow = highlight band (never
114
+ text ink on white — the text-safe yellow is the ochre in
115
+ --zd-warning), blue = information. Success carries no green of
116
+ its own (triad discipline; semantics by shape + label, and the
117
+ tip admonition below says it with a yellow band + triangle). */
118
+ --zd-bg: light-dark(#ffffff, #18181b);
119
+ --zd-fg: light-dark(#141414, #f0efe9);
120
+ --zd-selection-bg: light-dark(#f2c400, #f2c400);
121
+ --zd-selection-fg: light-dark(#141414, #141414);
122
+ --zd-surface: light-dark(#ffffff, #1f1f23);
123
+ --zd-muted: light-dark(#565656, #a8a69e);
124
+ --zd-accent: light-dark(#b3231b, #ff7d70);
125
+ --zd-accent-hover: light-dark(#8a1510, #ffa79d);
126
+ --zd-code-bg: light-dark(#f2f1ec, #101014);
127
+ --zd-code-fg: light-dark(#141414, #ecebe4);
128
+ --zd-success: light-dark(#141414, #f0efe9);
129
+ --zd-danger: light-dark(#a91910, #ff8a80);
130
+ --zd-warning: light-dark(#6d5500, #f5c51c);
131
+ --zd-info: light-dark(#1e42ad, #8fb0ff);
132
+
133
+ /* find-in-page / search match = the yellow location band, same as
134
+ selection and the sidebar/TOC current markers. */
135
+ --zd-matched-keyword-bg: light-dark(#f2c400, #f5cb1a);
136
+ --zd-matched-keyword-fg: light-dark(#141414, #141414);
137
+
138
+ /* syntax — all 9 roles, both modes. The triad works the code too:
139
+ red = keywords/deleted (control), yellow-ochre = strings/numbers
140
+ (literals; ochre because yellow is never text ink on a light
141
+ panel), blue = callables/types (structure), ink = names/inserted,
142
+ gray = comments. */
143
+ --zd-syntax-comment: light-dark(#63615a, #999689);
144
+ --zd-syntax-string: light-dark(#6d5800, #e9ce6a);
145
+ --zd-syntax-number: light-dark(#815100, #f6bd3c);
146
+ --zd-syntax-keyword: light-dark(#b3231b, #ff7d70);
147
+ --zd-syntax-callable: light-dark(#1c4bbe, #8fb0ff);
148
+ --zd-syntax-type: light-dark(#414f9b, #b8c6f2);
149
+ --zd-syntax-name: light-dark(#1f1f1f, #e9e8e2);
150
+ --zd-syntax-inserted: light-dark(#141414, #f0efe9);
151
+ --zd-syntax-deleted: light-dark(#a01313, #ff8a80);
152
+
153
+ /* fonts — Jost carries body and chrome; Archivo Black is the
154
+ poster display face (h1 + logotype); Space Mono sets code. */
155
+ --font-sans: "Jost", system-ui, sans-serif;
156
+ --font-mono: "Space Mono", ui-monospace, SFMono-Regular, Menlo, monospace;
157
+ --font-display: "Archivo Black", "Jost", system-ui, sans-serif;
158
+
159
+ /* Tier-3 component seams — poster-black single-weight h1, Jost 600
160
+ section heads, zero radius everywhere, band-style admonitions
161
+ (the colored spine is replaced by the color-blocked title band
162
+ below, so the tokenized left border goes to 0). */
163
+ --zdc-doc-title-font: var(--font-display);
164
+ --zdc-doc-title-weight: 400;
165
+ --zdc-doc-title-tracking: 0.01em;
166
+ --zdc-doc-h2-font: var(--font-sans);
167
+ --zdc-doc-h2-weight: 600;
168
+ --zdc-doc-h2-tracking: 0.01em;
169
+ --zdc-doc-h3-weight: 600;
170
+ --zdc-doc-h4-weight: 600;
171
+ --zdc-doc-link-decoration: underline;
172
+ --zdc-admonition-radius: 0;
173
+ --zdc-admonition-border-width: 0px;
174
+ --zdc-card-radius: 0;
175
+ }
176
+
177
+ /* ---- focus: the information blue, hard offset, square ---- */
178
+
179
+ html[data-theme-pack="bauhaus"] :focus-visible {
180
+ outline: 2px solid light-dark(#1e42ad, #8fb0ff);
181
+ outline-offset: 2px;
182
+ }
183
+
184
+ /* ---- emphasis the Bauhaus way: RED — the accent doing structural
185
+ work — layered ON TOP of italics, not replacing them. Jost ships
186
+ upright-only here, so the slant is browser-synthesized oblique;
187
+ acceptable for a geometric sans, and keeping it means emphasis
188
+ never relies on color alone (WCAG 1.4.1). Links stay
189
+ distinguishable by their underline. ---- */
190
+
191
+ html[data-theme-pack="bauhaus"] .zd-content em {
192
+ color: var(--zd-accent);
193
+ }
194
+
195
+ /* ---- masthead: gallery bar over the tri-color stripe ---- */
196
+
197
+ html[data-theme-pack="bauhaus"] header[data-header] {
198
+ border-bottom: none;
199
+ background-image: linear-gradient(
200
+ to right,
201
+ light-dark(#c2201a, #cc2a1f) 0 33.34%,
202
+ light-dark(#f2c400, #f5cb1a) 33.34% 66.67%,
203
+ light-dark(#2143b8, #2c50cf) 66.67% 100%
204
+ );
205
+ background-size: 100% 0.3rem;
206
+ background-position: bottom;
207
+ background-repeat: no-repeat;
208
+ }
209
+ html[data-theme-pack="bauhaus"] [data-header-logo] {
210
+ font-family: var(--font-display);
211
+ font-weight: 400;
212
+ letter-spacing: 0.01em;
213
+ }
214
+ html[data-theme-pack="bauhaus"] [data-header-logo]::before {
215
+ content: "";
216
+ display: inline-block;
217
+ width: 0.5em;
218
+ height: 0.5em;
219
+ border-radius: 50%;
220
+ background: light-dark(#c2201a, #e8564a);
221
+ margin-right: 0.45em;
222
+ vertical-align: 0.03em;
223
+ }
224
+ html[data-theme-pack="bauhaus"] [data-nav-item] {
225
+ font-weight: 500;
226
+ }
227
+ html[data-theme-pack="bauhaus"] [data-nav-item]:hover {
228
+ text-decoration: none;
229
+ color: var(--zd-fg);
230
+ background: color-mix(in srgb, light-dark(#f2c400, #f5cb1a) 16%, var(--zd-bg));
231
+ }
232
+
233
+ /* ---- sidebar: hard ink spine; yellow marks where you are ----
234
+ (Hover and active force fg/ink text — the 16% wash and full
235
+ band were contrast-checked against both inks.) ---- */
236
+
237
+ html[data-theme-pack="bauhaus"] #desktop-sidebar {
238
+ border-right: 2px solid light-dark(#141414, #3a3a40);
239
+ }
240
+ html[data-theme-pack="bauhaus"] aside[data-zd-mobile-sidebar] {
241
+ border-right: 2px solid light-dark(#141414, #3a3a40);
242
+ }
243
+ html[data-theme-pack="bauhaus"] #desktop-sidebar a:hover:not([data-nav-active]):not([aria-current="page"]),
244
+ html[data-theme-pack="bauhaus"] aside[data-zd-mobile-sidebar] a:hover:not([data-nav-active]):not([aria-current="page"]) {
245
+ text-decoration: none;
246
+ color: var(--zd-fg);
247
+ background: color-mix(in srgb, light-dark(#f2c400, #f5cb1a) 16%, var(--zd-bg));
248
+ }
249
+ html[data-theme-pack="bauhaus"] a[data-nav-active] {
250
+ background: light-dark(#f2c400, #f5cb1a);
251
+ color: light-dark(#141414, #141414);
252
+ font-weight: 600;
253
+ border-radius: 0;
254
+ }
255
+
256
+ /* ---- title block: poster h1 over a tri-color bar ----
257
+ (The bar replaces the stock h1 border-b — zeroed so the two
258
+ rules don't double up.) ---- */
259
+
260
+ html[data-theme-pack="bauhaus"] .zd-content h1 {
261
+ border-bottom: 0;
262
+ padding-bottom: 0;
263
+ line-height: 1.12;
264
+ }
265
+ html[data-theme-pack="bauhaus"] .zd-content h1::after {
266
+ content: "";
267
+ display: block;
268
+ width: 9rem;
269
+ height: 0.5rem;
270
+ margin-top: 0.9rem;
271
+ background: linear-gradient(
272
+ to right,
273
+ light-dark(#c2201a, #cc2a1f) 0 3rem,
274
+ light-dark(#f2c400, #f5cb1a) 3rem 6rem,
275
+ light-dark(#2143b8, #2c50cf) 6rem 100%
276
+ );
277
+ }
278
+
279
+ /* ---- section heads: thick geometric rules ----
280
+ h2 — 4px bar with a red lead segment, drawn with the same
281
+ border-image mechanism the stock gradient uses (!important is
282
+ Decision 6.6's sole carve-out, and border-image is its one
283
+ allowlisted property).
284
+ h3 — blue circle; h4 — red square (the marker set continues
285
+ through the heading hierarchy). ---- */
286
+
287
+ html[data-theme-pack="bauhaus"] .zd-content h2 {
288
+ border-top-width: 4px;
289
+ border-image: linear-gradient(
290
+ to right,
291
+ light-dark(#c2201a, #e8564a) 0 3.25rem,
292
+ var(--zd-fg) 3.25rem 100%
293
+ )
294
+ 1 !important;
295
+ padding-top: 0.8rem;
296
+ }
297
+ html[data-theme-pack="bauhaus"] .zd-content h3 {
298
+ border-image: none !important;
299
+ border-top-width: 0;
300
+ }
301
+ html[data-theme-pack="bauhaus"] .zd-content h3::before {
302
+ content: "";
303
+ display: inline-block;
304
+ width: 0.5em;
305
+ height: 0.5em;
306
+ border-radius: 50%;
307
+ background: light-dark(#1e42ad, #8fb0ff);
308
+ margin-right: 0.5rem;
309
+ vertical-align: 0.04em;
310
+ }
311
+ html[data-theme-pack="bauhaus"] .zd-content h4 {
312
+ border-image: none !important;
313
+ border-top-width: 0;
314
+ }
315
+ html[data-theme-pack="bauhaus"] .zd-content h4::before {
316
+ content: "";
317
+ display: inline-block;
318
+ width: 0.45em;
319
+ height: 0.45em;
320
+ background: light-dark(#b3231b, #ff7d70);
321
+ margin-right: 0.5rem;
322
+ vertical-align: 0.06em;
323
+ }
324
+
325
+ /* ---- prose details ---- */
326
+
327
+ html[data-theme-pack="bauhaus"] .zd-content a {
328
+ text-decoration-thickness: 2px;
329
+ text-underline-offset: 0.18em;
330
+ }
331
+ html[data-theme-pack="bauhaus"] .zd-content blockquote {
332
+ border-left: 0.5rem solid light-dark(#f2c400, #f5cb1a);
333
+ color: var(--zd-fg);
334
+ padding-left: 1.15rem;
335
+ font-style: normal;
336
+ }
337
+ html[data-theme-pack="bauhaus"] .zd-content hr {
338
+ border: none;
339
+ height: 0.3rem;
340
+ background: linear-gradient(
341
+ to right,
342
+ light-dark(#c2201a, #cc2a1f) 0 33.34%,
343
+ light-dark(#f2c400, #f5cb1a) 33.34% 66.67%,
344
+ light-dark(#2143b8, #2c50cf) 66.67% 100%
345
+ );
346
+ }
347
+
348
+ /* lists: red markers — the accent doing structural work in the
349
+ margins. Marker COLOR only, deliberately: the prose ul/ol set
350
+ their list-style-type via inline style (content-ul.tsx), so a
351
+ stylesheet type override could never reach them — it would only
352
+ leak markers onto classless non-prose lists inside .zd-content
353
+ (the mobile TOC's <ul> relies on preflight list-style: none).
354
+ ::marker color is inert wherever no marker box exists. */
355
+ html[data-theme-pack="bauhaus"] .zd-content ul > li::marker {
356
+ color: light-dark(#b3231b, #ff7d70);
357
+ }
358
+ html[data-theme-pack="bauhaus"] .zd-content ol > li::marker {
359
+ color: light-dark(#b3231b, #ff7d70);
360
+ font-weight: 600;
361
+ }
362
+
363
+ /* ---- code: squared print panel with a hard yellow offset ----
364
+ (Space Mono 400/700 — keywords use the true 700.) ---- */
365
+
366
+ html[data-theme-pack="bauhaus"] pre.hi-root {
367
+ border: 2px solid light-dark(#141414, #3a3a40);
368
+ border-radius: 0;
369
+ box-shadow: 0.35rem 0.35rem 0 0 light-dark(#f2c400, #f5cb1a);
370
+ }
371
+ html[data-theme-pack="bauhaus"] .hi-kw {
372
+ font-weight: 700;
373
+ }
374
+ html[data-theme-pack="bauhaus"] .zd-content code:not(pre code) {
375
+ border: 1px solid light-dark(rgb(0 0 0 / 0.28), rgb(255 255 255 / 0.24));
376
+ border-radius: 0;
377
+ }
378
+
379
+ /* ---- admonitions: color-blocked title bands, circle / triangle /
380
+ square markers — the signature move. Shape encodes family
381
+ (circle = information, triangle = attention, square = stop);
382
+ band color says it in triad; the inverted ink-band variants
383
+ (info / warning / caution) carry their family color in the
384
+ marker itself. Every band/ink pair and every 12% body tint is
385
+ contrast-checked in both modes. ---- */
386
+
387
+ html[data-theme-pack="bauhaus"] [data-admonition] {
388
+ padding: 0;
389
+ overflow: hidden;
390
+ }
391
+ html[data-theme-pack="bauhaus"] [data-admonition] .admonition-title {
392
+ display: flex;
393
+ align-items: center;
394
+ gap: 0.55rem;
395
+ margin-bottom: 0;
396
+ padding: 0.5rem 1rem;
397
+ font-weight: 600;
398
+ letter-spacing: 0.04em;
399
+ }
400
+ html[data-theme-pack="bauhaus"] [data-admonition] .admonition-title::before {
401
+ content: "";
402
+ flex: none;
403
+ width: 0.7em;
404
+ height: 0.7em;
405
+ margin-right: 0;
406
+ }
407
+ html[data-theme-pack="bauhaus"] [data-admonition] .admonition-body {
408
+ padding: 0.85rem 1rem 0.95rem;
409
+ }
410
+
411
+ /* note — blue band, white circle */
412
+ html[data-theme-pack="bauhaus"] [data-admonition="note"] {
413
+ background-color: color-mix(in srgb, light-dark(#2143b8, #2c50cf) 12%, var(--zd-bg));
414
+ }
415
+ html[data-theme-pack="bauhaus"] [data-admonition="note"] .admonition-title {
416
+ background: light-dark(#2143b8, #2c50cf);
417
+ color: light-dark(#ffffff, #ffffff);
418
+ }
419
+ html[data-theme-pack="bauhaus"] [data-admonition="note"] .admonition-title::before {
420
+ background: light-dark(#ffffff, #ffffff);
421
+ border-radius: 50%;
422
+ }
423
+
424
+ /* info — ink band, blue circle (inverted poster of note) */
425
+ html[data-theme-pack="bauhaus"] [data-admonition="info"] {
426
+ background-color: color-mix(in srgb, light-dark(#2143b8, #2c50cf) 12%, var(--zd-bg));
427
+ }
428
+ html[data-theme-pack="bauhaus"] [data-admonition="info"] .admonition-title {
429
+ background: light-dark(#141414, #0c0c0e);
430
+ color: light-dark(#ffffff, #ffffff);
431
+ }
432
+ html[data-theme-pack="bauhaus"] [data-admonition="info"] .admonition-title::before {
433
+ background: light-dark(#6c8ae5, #7d9bf0);
434
+ border-radius: 50%;
435
+ }
436
+
437
+ /* tip — yellow band, ink triangle (the bright idea) */
438
+ html[data-theme-pack="bauhaus"] [data-admonition="tip"] {
439
+ background-color: color-mix(in srgb, light-dark(#f2c400, #f5cb1a) 12%, var(--zd-bg));
440
+ }
441
+ html[data-theme-pack="bauhaus"] [data-admonition="tip"] .admonition-title {
442
+ background: light-dark(#f2c400, #f5cb1a);
443
+ color: light-dark(#141414, #141414);
444
+ }
445
+ html[data-theme-pack="bauhaus"] [data-admonition="tip"] .admonition-title::before {
446
+ background: light-dark(#141414, #141414);
447
+ clip-path: polygon(50% 0, 100% 100%, 0 100%);
448
+ }
449
+
450
+ /* warning — ink band, yellow triangle (inverted poster of tip) */
451
+ html[data-theme-pack="bauhaus"] [data-admonition="warning"] {
452
+ background-color: color-mix(in srgb, light-dark(#f2c400, #f5cb1a) 12%, var(--zd-bg));
453
+ }
454
+ html[data-theme-pack="bauhaus"] [data-admonition="warning"] .admonition-title {
455
+ background: light-dark(#141414, #0c0c0e);
456
+ color: light-dark(#ffffff, #ffffff);
457
+ }
458
+ html[data-theme-pack="bauhaus"] [data-admonition="warning"] .admonition-title::before {
459
+ background: light-dark(#f2c400, #f5cb1a);
460
+ clip-path: polygon(50% 0, 100% 100%, 0 100%);
461
+ }
462
+
463
+ /* danger — red band, white square (the hard stop) */
464
+ html[data-theme-pack="bauhaus"] [data-admonition="danger"] {
465
+ background-color: color-mix(in srgb, light-dark(#c2201a, #cc2a1f) 12%, var(--zd-bg));
466
+ }
467
+ html[data-theme-pack="bauhaus"] [data-admonition="danger"] .admonition-title {
468
+ background: light-dark(#c2201a, #cc2a1f);
469
+ color: light-dark(#ffffff, #ffffff);
470
+ }
471
+ html[data-theme-pack="bauhaus"] [data-admonition="danger"] .admonition-title::before {
472
+ background: light-dark(#ffffff, #ffffff);
473
+ }
474
+
475
+ /* caution — ink band, red square (inverted poster of danger) */
476
+ html[data-theme-pack="bauhaus"] [data-admonition="caution"] {
477
+ background-color: color-mix(in srgb, light-dark(#c2201a, #cc2a1f) 12%, var(--zd-bg));
478
+ }
479
+ html[data-theme-pack="bauhaus"] [data-admonition="caution"] .admonition-title {
480
+ background: light-dark(#141414, #0c0c0e);
481
+ color: light-dark(#ffffff, #ffffff);
482
+ }
483
+ html[data-theme-pack="bauhaus"] [data-admonition="caution"] .admonition-title::before {
484
+ background: light-dark(#e8564a, #ff7d70);
485
+ }
486
+
487
+ /* important — red band, white circle (urgent, not destructive) */
488
+ html[data-theme-pack="bauhaus"] [data-admonition="important"] {
489
+ background-color: color-mix(in srgb, light-dark(#c2201a, #cc2a1f) 12%, var(--zd-bg));
490
+ }
491
+ html[data-theme-pack="bauhaus"] [data-admonition="important"] .admonition-title {
492
+ background: light-dark(#c2201a, #cc2a1f);
493
+ color: light-dark(#ffffff, #ffffff);
494
+ }
495
+ html[data-theme-pack="bauhaus"] [data-admonition="important"] .admonition-title::before {
496
+ background: light-dark(#ffffff, #ffffff);
497
+ border-radius: 50%;
498
+ }
499
+
500
+ /* ---- table: 3px ink head rule ---- */
501
+
502
+ html[data-theme-pack="bauhaus"] .zd-content th {
503
+ border-bottom: 3px solid var(--zd-fg);
504
+ }
505
+
506
+ /* ---- pager: square cards, information-blue hard offset on hover ---- */
507
+
508
+ html[data-theme-pack="bauhaus"] .zd-content > nav[data-doc-pager] a {
509
+ border: 2px solid light-dark(#141414, #3a3a40);
510
+ border-radius: 0;
511
+ }
512
+ html[data-theme-pack="bauhaus"] .zd-content > nav[data-doc-pager] a:hover {
513
+ border-color: light-dark(#2143b8, #7d9bf0);
514
+ box-shadow: 0.3rem 0.3rem 0 0 light-dark(#2143b8, #2c50cf);
515
+ }
516
+ html[data-theme-pack="bauhaus"] .zd-content > nav[data-doc-pager] a div {
517
+ letter-spacing: 0.14em;
518
+ font-weight: 500;
519
+ }
520
+ html[data-theme-pack="bauhaus"] .zd-content > nav[data-doc-pager] a p {
521
+ font-weight: 600;
522
+ }
523
+
524
+ /* ---- TOC: ink spine; yellow marks where you are (desktop and the
525
+ mobile emitter — separate hooks, zudolab/zudo-doc#2887) ---- */
526
+
527
+ html[data-theme-pack="bauhaus"] nav[data-zd-toc] ul {
528
+ border-left: 2px solid light-dark(#141414, #3a3a40);
529
+ }
530
+ html[data-theme-pack="bauhaus"] nav[data-zd-toc] a:hover,
531
+ html[data-theme-pack="bauhaus"] div[data-zd-mobile-toc] a:hover {
532
+ text-decoration: none;
533
+ color: var(--zd-fg);
534
+ background: color-mix(in srgb, light-dark(#f2c400, #f5cb1a) 16%, var(--zd-bg));
535
+ }
536
+ html[data-theme-pack="bauhaus"] nav[data-zd-toc] a[aria-current="true"],
537
+ html[data-theme-pack="bauhaus"] div[data-zd-mobile-toc] a[aria-current="true"] {
538
+ background: light-dark(#f2c400, #f5cb1a);
539
+ color: light-dark(#141414, #141414);
540
+ font-weight: 600;
541
+ }
542
+ html[data-theme-pack="bauhaus"] div[data-zd-mobile-toc] {
543
+ border: 2px solid light-dark(#141414, #3a3a40);
544
+ border-radius: 0;
545
+ }
546
+
547
+ /* ---- footer: the stripe returns, mirrored from the masthead ---- */
548
+
549
+ html[data-theme-pack="bauhaus"] footer[data-footer] {
550
+ border-top: none;
551
+ background-image: linear-gradient(
552
+ to right,
553
+ light-dark(#c2201a, #cc2a1f) 0 33.34%,
554
+ light-dark(#f2c400, #f5cb1a) 33.34% 66.67%,
555
+ light-dark(#2143b8, #2c50cf) 66.67% 100%
556
+ );
557
+ background-size: 100% 0.3rem;
558
+ background-position: top;
559
+ background-repeat: no-repeat;
560
+ }
561
+ html[data-theme-pack="bauhaus"] footer[data-footer] a:hover {
562
+ color: var(--zd-accent);
563
+ }
564
+
565
+ /* ---- theme-pack switcher: square print objects. The launcher
566
+ trades the stock pill for a square with a red offset; the
567
+ card wears the tri-color stripe and a hard ink shadow. ---- */
568
+
569
+ html[data-theme-pack="bauhaus"] div[data-switcher-card] {
570
+ border: 2px solid var(--zd-fg);
571
+ border-radius: 0;
572
+ box-shadow: 0.5rem 0.5rem 0 0 light-dark(rgb(20 20 20 / 0.16), rgb(0 0 0 / 0.55));
573
+ background-image: linear-gradient(
574
+ to right,
575
+ light-dark(#c2201a, #cc2a1f) 0 33.34%,
576
+ light-dark(#f2c400, #f5cb1a) 33.34% 66.67%,
577
+ light-dark(#2143b8, #2c50cf) 66.67% 100%
578
+ );
579
+ background-size: 100% 0.3rem;
580
+ background-position: top;
581
+ background-repeat: no-repeat;
582
+ }
583
+ html[data-theme-pack="bauhaus"] div[data-switcher-card] span {
584
+ border-radius: 0;
585
+ }
586
+ html[data-theme-pack="bauhaus"] div[data-switcher-card] button {
587
+ border-radius: 0;
588
+ border-color: var(--zd-fg);
589
+ }
590
+ html[data-theme-pack="bauhaus"] div[data-switcher-card] button:hover {
591
+ background-color: light-dark(#f2c400, #f5cb1a);
592
+ border-color: light-dark(#141414, #f5cb1a);
593
+ color: light-dark(#141414, #141414);
594
+ }
595
+ html[data-theme-pack="bauhaus"] button[data-switcher-launcher] {
596
+ border-radius: 0;
597
+ border: 2px solid var(--zd-fg);
598
+ box-shadow: 0.25rem 0.25rem 0 0 light-dark(#c2201a, #cc2a1f);
599
+ }
600
+ html[data-theme-pack="bauhaus"] button[data-switcher-launcher]:hover {
601
+ color: var(--zd-accent);
602
+ border-color: var(--zd-accent);
603
+ }
604
+
605
+ /* browse-all dialog: same square black-frame treatment (the
606
+ aria-labelledby id is the same anchor swissgrid ships against) */
607
+ html[data-theme-pack="bauhaus"] dialog[aria-labelledby="zd-theme-pack-dialog-title"] {
608
+ border: 2px solid var(--zd-fg);
609
+ border-radius: 0;
610
+ box-shadow: 0.5rem 0.5rem 0 0 light-dark(rgb(20 20 20 / 0.16), rgb(0 0 0 / 0.55));
611
+ }
612
+ html[data-theme-pack="bauhaus"] dialog[aria-labelledby="zd-theme-pack-dialog-title"] button {
613
+ border-radius: 0;
614
+ }