@takazudo/zudo-doc 8.1.3 → 9.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (36) hide show
  1. package/CHANGELOG.md +19 -0
  2. package/README.md +1 -1
  3. package/dist/ai-chat-modal/index.js +1 -0
  4. package/dist/catalog.js +1 -1
  5. package/dist/chrome/derive.js +2 -2
  6. package/dist/config.d.ts +13 -7
  7. package/dist/config.js +6 -0
  8. package/dist/footer/footer.js +1 -1
  9. package/dist/head-with-defaults/index.js +2 -2
  10. package/dist/metainfo/doc-tags.js +3 -0
  11. package/dist/nav-indexing/tag-nav.js +7 -1
  12. package/dist/preset.d.ts +10 -4
  13. package/dist/preset.js +11 -1
  14. package/dist/route-context-payload/index.d.ts +4 -1
  15. package/dist/route-context-payload/index.js +6 -0
  16. package/dist/settings-defaults.js +3 -1
  17. package/dist/settings.d.ts +9 -5
  18. package/dist/theme/theme-pack-provider.d.ts +4 -2
  19. package/dist/theme/theme-pack-provider.js +2 -1
  20. package/dist/theme-cli/config-io.js +26 -3
  21. package/dist/theme-cli/list.js +1 -1
  22. package/dist/theme-packs/default/meta.json +2 -2
  23. package/dist/theme-packs/graphite/meta.json +37 -0
  24. package/dist/theme-packs/graphite/pack.css +401 -0
  25. package/dist/theme-packs/quiet-slate/meta.json +37 -0
  26. package/dist/theme-packs/quiet-slate/pack.css +401 -0
  27. package/dist/theme-packs/warm-mineral/meta.json +37 -0
  28. package/dist/theme-packs/warm-mineral/pack.css +401 -0
  29. package/dist/theme-packs-registry/configured-theme-pack.d.ts +21 -0
  30. package/dist/theme-packs-registry/configured-theme-pack.js +13 -0
  31. package/dist/theme-packs-registry/index.d.ts +1 -0
  32. package/dist/theme-packs-registry/index.js +6 -0
  33. package/dist/theme-packs-registry/resolve-enabled-packs.d.ts +13 -6
  34. package/dist/theme-packs-registry/resolve-enabled-packs.js +15 -5
  35. package/eject/footer/footer.tsx +1 -1
  36. package/package.json +9 -9
@@ -1,6 +1,9 @@
1
1
  import fs from "fs-extra";
2
2
  import path from "node:path";
3
- import { DEFAULT_THEME_PACK_SLUG } from "../theme-packs-registry/index.js";
3
+ import {
4
+ CONFIGURED_DEFAULT_THEME_PACK_SLUG,
5
+ DEFAULT_THEME_PACK_SLUG
6
+ } from "../theme-packs-registry/index.js";
4
7
  import {
5
8
  ConfigSyntaxError,
6
9
  findMatchingBrace,
@@ -16,7 +19,10 @@ function resolveZfbConfigPath(cwd) {
16
19
  }
17
20
  async function detectActiveThemePack(cwd) {
18
21
  const configPath = resolveZfbConfigPath(cwd);
19
- const fallback = { slug: DEFAULT_THEME_PACK_SLUG, detected: false };
22
+ const fallback = {
23
+ slug: CONFIGURED_DEFAULT_THEME_PACK_SLUG,
24
+ detected: false
25
+ };
20
26
  if (!await fs.pathExists(configPath)) return fallback;
21
27
  let source;
22
28
  try {
@@ -33,7 +39,24 @@ async function detectActiveThemePack(cwd) {
33
39
  const members = splitTopLevelMembers(source, braceOpenIdx + 1, braceCloseIdx);
34
40
  if (members.some((m) => m.isSpread)) return fallback;
35
41
  const themePackMember = members.find((m) => m.key === "themePack");
36
- if (!themePackMember) return { slug: DEFAULT_THEME_PACK_SLUG, detected: true };
42
+ if (!themePackMember) {
43
+ const valueText = (key) => {
44
+ const member = members.find((m) => m.key === key);
45
+ if (!member) return void 0;
46
+ if (member.valueStart === null || member.valueEnd === null) return null;
47
+ return source.slice(member.valueStart, member.valueEnd).trim();
48
+ };
49
+ const colorSchemes = valueText("colorSchemes");
50
+ const colorMode = valueText("colorMode");
51
+ if (colorSchemes === null || colorMode === null) return fallback;
52
+ const customSchemes = colorSchemes !== void 0 && colorSchemes !== "undefined" && colorSchemes !== "null" && colorSchemes !== "defaultColorSchemes";
53
+ if (customSchemes || colorMode === "false") {
54
+ return { slug: DEFAULT_THEME_PACK_SLUG, detected: true };
55
+ }
56
+ const colorModeKnownNotFalse = colorMode === void 0 || colorMode === "undefined" || colorMode === "true" || colorMode.startsWith("{");
57
+ if (!colorModeKnownNotFalse) return fallback;
58
+ return { slug: CONFIGURED_DEFAULT_THEME_PACK_SLUG, detected: true };
59
+ }
37
60
  if (themePackMember.valueStart === null || themePackMember.valueEnd === null || !isPlainStringLiteralSpan(source, themePackMember.valueStart, themePackMember.valueEnd)) {
38
61
  return fallback;
39
62
  }
@@ -50,7 +50,7 @@ function formatThemeList(result) {
50
50
  } else {
51
51
  lines.push(
52
52
  pc.dim(
53
- `Active theme pack: ${activeSlug} (default \u2014 no zfb.config.ts "themePack" field found or readable)`
53
+ `Active theme pack: ${activeSlug} (assumed default \u2014 no zfb.config.ts "themePack" field found or readable)`
54
54
  )
55
55
  );
56
56
  }
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "schemaVersion": 1,
3
3
  "slug": "default",
4
- "name": "Default",
5
- "description": "The stock zudo-doc look. No pack stylesheet is loaded — your project's configured color scheme and fonts render unchanged.",
4
+ "name": "Classic",
5
+ "description": "Classic — the original zudo-doc default look. No pack stylesheet is loaded — your project's configured color scheme and fonts render unchanged.",
6
6
  "mode": "dark",
7
7
  "version": "1.0.0",
8
8
  "fonts": {
@@ -0,0 +1,37 @@
1
+ {
2
+ "schemaVersion": 1,
3
+ "slug": "graphite",
4
+ "name": "Graphite",
5
+ "description": "Soft neutral graphite — low-glare grey paper by day, deep graphite at night, one warm copper accent, quiet hairline rules. The configured default.",
6
+ "mode": "dark",
7
+ "version": "1.0.0",
8
+ "fonts": {
9
+ "sans": "System",
10
+ "mono": "System",
11
+ "loaded": []
12
+ },
13
+ "preview": {
14
+ "light": {
15
+ "bg": "#F2F3F2",
16
+ "fg": "#3A4146",
17
+ "accent": "#9A4919",
18
+ "syntax": {
19
+ "keyword": "#9A4919",
20
+ "string": "#4E6552",
21
+ "comment": "#566168",
22
+ "callable": "#4B6373"
23
+ }
24
+ },
25
+ "dark": {
26
+ "bg": "#242629",
27
+ "fg": "#D3D5D9",
28
+ "accent": "#E9AA79",
29
+ "syntax": {
30
+ "keyword": "#E9AA79",
31
+ "string": "#9DBA9A",
32
+ "comment": "#ADB2B8",
33
+ "callable": "#9DB6C5"
34
+ }
35
+ }
36
+ }
37
+ }
@@ -0,0 +1,401 @@
1
+ /* ============================================================
2
+ Graphite — zudo-doc theme pack (ADR docs/adr/theme-packs.md)
3
+
4
+ Neutral grey paper and graphite night, with a single warm copper accent.
5
+ One of the three soft-tone packs (graphite, warm-mineral,
6
+ quiet-slate) that share the same component treatment and differ
7
+ only in palette. Colour only: typography, spacing, geometry and
8
+ heading hierarchy are the package defaults (no fonts loaded).
9
+
10
+ Roles beyond the public --zd-* tokens are inlined per mode:
11
+ line decorative rules, separators and tree guides
12
+ control border necessary field / control / diagram boundaries
13
+ heading heading ink, one step stronger than body text
14
+ hover bg inactive navigation hover fill
15
+ active bg current navigation fill (90% bg + 10% accent)
16
+ state bgs admonition fills (90% bg + 10% state colour)
17
+ Classic (the reserved "default" pack) shares one muted role for
18
+ text, borders and comments; these packs keep muted at readable
19
+ text contrast and give decorative rules their own quieter line.
20
+
21
+ Production-only contrast repairs (not part of the ordinary
22
+ palette): diff rows use the opaque state fills instead of the
23
+ 15% foreground tint, and code line / word highlights use opaque
24
+ active / hover fills (no stacked alpha) keeping the accent marker
25
+ and underline, so every syntax role stays >= 4.6:1.
26
+
27
+ Every rule is scoped under html[data-theme-pack="graphite"]; the
28
+ pack never declares color-scheme and follows the mode the page
29
+ already resolved (light-dark()).
30
+ ============================================================ */
31
+
32
+ html[data-theme-pack="graphite"] {
33
+ /* Tier-2 semantic roles */
34
+ --zd-bg: light-dark(#F2F3F2, #242629);
35
+ --zd-fg: light-dark(#3A4146, #D3D5D9);
36
+ --zd-surface: light-dark(#E8EBEA, #2D3034);
37
+ --zd-muted: light-dark(#566168, #ADB2B8);
38
+ --zd-accent: light-dark(#9A4919, #E9AA79);
39
+ --zd-accent-hover: light-dark(#934619, #EAAF81);
40
+ --zd-code-bg: light-dark(#E8EBEA, #202225);
41
+ --zd-code-fg: light-dark(#3A4146, #D3D5D9);
42
+ --zd-success: light-dark(#4E6552, #9DBA9A);
43
+ --zd-danger: light-dark(#89504E, #CE9B97);
44
+ --zd-warning: light-dark(#775B2E, #CEB077);
45
+ --zd-info: light-dark(#4B6373, #9DB6C5);
46
+ --zd-selection-bg: light-dark(#9A4919, #E9AA79);
47
+ --zd-selection-fg: light-dark(#F9F5EF, #242629);
48
+ --zd-matched-keyword-bg: light-dark(#9A4919, #E9AA79);
49
+ --zd-matched-keyword-fg: light-dark(#F9F5EF, #242629);
50
+ --zd-chat-user-bg: light-dark(#9A4919, #E9AA79);
51
+ --zd-chat-user-text: light-dark(#F9F5EF, #242629);
52
+ --zd-chat-assistant-bg: light-dark(#E8EBEA, #2D3034);
53
+ --zd-chat-assistant-text: light-dark(#3A4146, #D3D5D9);
54
+ --zd-image-overlay-bg: light-dark(#F2F3F2, #242629);
55
+ --zd-image-overlay-fg: light-dark(#3A4146, #D3D5D9);
56
+ /* Mermaid: text is body text; edges are necessary diagram lines */
57
+ --zd-mermaid-node-bg: light-dark(#E8EBEA, #2D3034);
58
+ --zd-mermaid-text: light-dark(#3A4146, #D3D5D9);
59
+ --zd-mermaid-line: light-dark(#737D86, #858D96);
60
+ --zd-mermaid-label-bg: light-dark(#F2F3F2, #242629);
61
+ --zd-mermaid-note-bg: light-dark(#E1E5E4, #35383D);
62
+
63
+ /* syntax — explicit role mapping */
64
+ --zd-syntax-comment: light-dark(#566168, #ADB2B8);
65
+ --zd-syntax-string: light-dark(#4E6552, #9DBA9A);
66
+ --zd-syntax-number: light-dark(#775B2E, #CEB077);
67
+ --zd-syntax-keyword: light-dark(#9A4919, #E9AA79);
68
+ --zd-syntax-callable: light-dark(#4B6373, #9DB6C5);
69
+ --zd-syntax-type: light-dark(#775B2E, #CEB077);
70
+ --zd-syntax-name: light-dark(#3A4146, #D3D5D9);
71
+ --zd-syntax-inserted: light-dark(#4E6552, #9DBA9A);
72
+ --zd-syntax-deleted: light-dark(#89504E, #CE9B97);
73
+ /* diff rows: opaque audited state fills instead of the 15% tint */
74
+ --zfb-hi-ins-bg: light-dark(#E2E5E2, #303534);
75
+ --zfb-hi-del-bg: light-dark(#E8E3E2, #353234);
76
+
77
+ /* Tier-3 seams */
78
+ --zdc-nav-active-indicator-color: light-dark(#E9E2DC, #383331);
79
+ }
80
+
81
+ /* ---- page, chrome surfaces and decorative rules ---- */
82
+
83
+ html[data-theme-pack="graphite"] header[data-header],
84
+ html[data-theme-pack="graphite"] footer[data-footer] {
85
+ background-color: var(--zd-surface);
86
+ border-color: light-dark(#D2D8DC, #41464D);
87
+ }
88
+
89
+ html[data-theme-pack="graphite"] footer[data-footer] div {
90
+ border-color: light-dark(#D2D8DC, #41464D);
91
+ }
92
+
93
+ html[data-theme-pack="graphite"] #desktop-sidebar,
94
+ html[data-theme-pack="graphite"] aside[data-zd-mobile-sidebar],
95
+ html[data-theme-pack="graphite"] #desktop-sidebar div,
96
+ html[data-theme-pack="graphite"] aside[data-zd-mobile-sidebar] div,
97
+ html[data-theme-pack="graphite"] #desktop-sidebar nav,
98
+ html[data-theme-pack="graphite"] aside[data-zd-mobile-sidebar] nav {
99
+ border-color: light-dark(#D2D8DC, #41464D);
100
+ }
101
+
102
+ html[data-theme-pack="graphite"] nav[data-zd-toc] ul,
103
+ html[data-theme-pack="graphite"] div[data-zd-mobile-toc],
104
+ html[data-theme-pack="graphite"] div[data-zd-mobile-toc] ul {
105
+ border-color: light-dark(#D2D8DC, #41464D);
106
+ }
107
+
108
+ html[data-theme-pack="graphite"] [data-site-nav] div,
109
+ html[data-theme-pack="graphite"] [data-tabs-nav],
110
+ html[data-theme-pack="graphite"] [data-version-menu] > li,
111
+ html[data-theme-pack="graphite"] [data-nav-more-menu] > li,
112
+ html[data-theme-pack="graphite"] [data-language-menu] > li,
113
+ html[data-theme-pack="graphite"] dialog[data-search-dialog] > div div,
114
+ html[data-theme-pack="graphite"] dialog[data-search-dialog] [data-search-count-narrow],
115
+ html[data-theme-pack="graphite"] dialog[data-doc-history-panel] > div,
116
+ html[data-theme-pack="graphite"] [data-theme-pack-switcher] dialog div,
117
+ html[data-theme-pack="graphite"] dialog[data-zd-ai-chat] > div > div {
118
+ border-color: light-dark(#D2D8DC, #41464D);
119
+ }
120
+
121
+ html[data-theme-pack="graphite"] .zd-content h1,
122
+ html[data-theme-pack="graphite"] .zd-content table,
123
+ html[data-theme-pack="graphite"] .zd-content th,
124
+ html[data-theme-pack="graphite"] .zd-content td,
125
+ html[data-theme-pack="graphite"] .zd-content hr,
126
+ html[data-theme-pack="graphite"] .zd-content pre,
127
+ html[data-theme-pack="graphite"] .zd-content .code-block-title,
128
+ html[data-theme-pack="graphite"] .zd-content > section,
129
+ html[data-theme-pack="graphite"] .zd-content > ol > li:not(:hover):not(:focus-within),
130
+ html[data-theme-pack="graphite"] .zd-content > nav[data-doc-pager] > a:not(:hover),
131
+ html[data-theme-pack="graphite"] .zd-home-rule {
132
+ border-color: light-dark(#D2D8DC, #41464D);
133
+ }
134
+
135
+ /* ---- necessary control and field boundaries ---- */
136
+
137
+ html[data-theme-pack="graphite"] #desktop-sidebar button,
138
+ html[data-theme-pack="graphite"] aside[data-zd-mobile-sidebar] button,
139
+ html[data-theme-pack="graphite"] header[data-header] button,
140
+ html[data-theme-pack="graphite"] [data-nav-item-dropdown] > div > div,
141
+ html[data-theme-pack="graphite"] [data-version-menu],
142
+ html[data-theme-pack="graphite"] button[data-version-toggle]:not(:hover),
143
+ html[data-theme-pack="graphite"] button[data-language-toggle]:not(:hover),
144
+ html[data-theme-pack="graphite"] button[data-doc-history-trigger]:not(:hover),
145
+ html[data-theme-pack="graphite"] button[data-switcher-launcher]:not(:hover),
146
+ html[data-theme-pack="graphite"] dialog[data-search-dialog] > div,
147
+ html[data-theme-pack="graphite"] [data-site-nav] button,
148
+ html[data-theme-pack="graphite"] [data-nav-more-menu],
149
+ html[data-theme-pack="graphite"] [data-language-menu],
150
+ html[data-theme-pack="graphite"] [data-theme-pack-switcher] dialog,
151
+ html[data-theme-pack="graphite"] dialog[data-zd-ai-chat] input,
152
+ html[data-theme-pack="graphite"] dialog.zd-enlarge-dialog,
153
+ html[data-theme-pack="graphite"] dialog.zd-mermaid-dialog,
154
+ html[data-theme-pack="graphite"] .code-btn:not(:hover),
155
+ html[data-theme-pack="graphite"] .zd-desktop-sidebar-toggle,
156
+ html[data-theme-pack="graphite"] .zd-desktop-toc-toggle,
157
+ html[data-theme-pack="graphite"] kbd {
158
+ border-color: light-dark(#737D86, #858D96);
159
+ }
160
+
161
+ html[data-theme-pack="graphite"] #desktop-sidebar [data-sidebar-filter-region] > div,
162
+ html[data-theme-pack="graphite"] aside[data-zd-mobile-sidebar] [data-sidebar-filter-region] > div {
163
+ box-shadow: inset 0 0 0 1px light-dark(#737D86, #858D96);
164
+ }
165
+
166
+ /* ---- headings ---- */
167
+
168
+ html[data-theme-pack="graphite"] .zd-content h1,
169
+ html[data-theme-pack="graphite"] .zd-content h2,
170
+ html[data-theme-pack="graphite"] .zd-content h3,
171
+ html[data-theme-pack="graphite"] .zd-content h4,
172
+ html[data-theme-pack="graphite"] .zd-content h5,
173
+ html[data-theme-pack="graphite"] .zd-content h6 {
174
+ color: light-dark(#2E363C, #E0E3E6);
175
+ }
176
+
177
+ html[data-theme-pack="graphite"] .zd-content h2:where(:not(.zd-home-heading)):where(:not(.zd-compact-prose *)) {
178
+ border-image: linear-gradient(to right, color-mix(in srgb, light-dark(#737D86, #858D96) 65%, light-dark(#F2F3F2, #242629)), transparent) 1 !important;
179
+ }
180
+
181
+ html[data-theme-pack="graphite"] .zd-content h3:where(:not(.zd-compact-prose *)),
182
+ html[data-theme-pack="graphite"] .zd-content h4:where(:not(.zd-compact-prose *)) {
183
+ border-image: linear-gradient(to right, light-dark(#D2D8DC, #41464D), transparent) 1 !important;
184
+ }
185
+
186
+ /* ---- code ---- */
187
+
188
+ html[data-theme-pack="graphite"] .zd-content .code-block-title {
189
+ background-color: var(--zd-code-bg);
190
+ color: var(--zd-muted);
191
+ }
192
+
193
+ html[data-theme-pack="graphite"] pre.hi-root .line.highlighted,
194
+ html[data-theme-pack="graphite"] pre.hi-root [data-line-highlight="true"] {
195
+ background-color: light-dark(#E9E2DC, #383331);
196
+ box-shadow: inset 3px 0 0 var(--zd-accent);
197
+ }
198
+
199
+ html[data-theme-pack="graphite"] pre.hi-root .line .highlighted-word {
200
+ background-color: light-dark(#E1E5E4, #35383D);
201
+ }
202
+
203
+ html[data-theme-pack="graphite"] .zd-content th,
204
+ html[data-theme-pack="graphite"] .zd-content thead {
205
+ background-color: var(--zd-surface);
206
+ }
207
+
208
+ /* ---- current navigation: active fill, accent text, 3px marker ---- */
209
+
210
+ html[data-theme-pack="graphite"] #desktop-sidebar a[aria-current="page"],
211
+ html[data-theme-pack="graphite"] aside[data-zd-mobile-sidebar] a[aria-current="page"],
212
+ html[data-theme-pack="graphite"] #desktop-sidebar div:has(> a[aria-current="page"]),
213
+ html[data-theme-pack="graphite"] aside[data-zd-mobile-sidebar] div:has(> a[aria-current="page"]) {
214
+ background-color: light-dark(#E9E2DC, #383331);
215
+ color: var(--zd-accent);
216
+ }
217
+
218
+ html[data-theme-pack="graphite"] #desktop-sidebar a[aria-current="page"],
219
+ html[data-theme-pack="graphite"] aside[data-zd-mobile-sidebar] a[aria-current="page"] {
220
+ box-shadow: inset 3px 0 0 var(--zd-accent);
221
+ }
222
+
223
+ html[data-theme-pack="graphite"] #desktop-sidebar a[aria-current="page"] *,
224
+ html[data-theme-pack="graphite"] aside[data-zd-mobile-sidebar] a[aria-current="page"] *,
225
+ html[data-theme-pack="graphite"] #desktop-sidebar div:has(> a[aria-current="page"]) > button,
226
+ html[data-theme-pack="graphite"] aside[data-zd-mobile-sidebar] div:has(> a[aria-current="page"]) > button,
227
+ html[data-theme-pack="graphite"] #desktop-sidebar div:has(> a[aria-current="page"]) > button *,
228
+ html[data-theme-pack="graphite"] aside[data-zd-mobile-sidebar] div:has(> a[aria-current="page"]) > button * {
229
+ color: var(--zd-accent);
230
+ }
231
+
232
+ html[data-theme-pack="graphite"] #desktop-sidebar div:has(> a[aria-current="page"]) > button,
233
+ html[data-theme-pack="graphite"] aside[data-zd-mobile-sidebar] div:has(> a[aria-current="page"]) > button {
234
+ background-color: transparent;
235
+ border-color: light-dark(#737D86, #858D96);
236
+ }
237
+
238
+ html[data-theme-pack="graphite"] #desktop-sidebar a[aria-current="page"]:hover,
239
+ html[data-theme-pack="graphite"] aside[data-zd-mobile-sidebar] a[aria-current="page"]:hover,
240
+ html[data-theme-pack="graphite"] #desktop-sidebar a[aria-current="page"]:focus-visible,
241
+ html[data-theme-pack="graphite"] aside[data-zd-mobile-sidebar] a[aria-current="page"]:focus-visible,
242
+ html[data-theme-pack="graphite"] #desktop-sidebar div:has(> a[aria-current="page"]) > button:hover,
243
+ html[data-theme-pack="graphite"] aside[data-zd-mobile-sidebar] div:has(> a[aria-current="page"]) > button:hover,
244
+ html[data-theme-pack="graphite"] #desktop-sidebar div:has(> a[aria-current="page"]) > button:focus-visible,
245
+ html[data-theme-pack="graphite"] aside[data-zd-mobile-sidebar] div:has(> a[aria-current="page"]) > button:focus-visible {
246
+ background-color: light-dark(#E9E2DC, #383331);
247
+ color: var(--zd-accent-hover);
248
+ }
249
+
250
+ html[data-theme-pack="graphite"] [data-header-nav] a[aria-current="page"],
251
+ html[data-theme-pack="graphite"] [data-header-nav] a[aria-current="page"]:hover,
252
+ html[data-theme-pack="graphite"] [data-header-nav] a[aria-current="page"]:focus-visible {
253
+ background-color: light-dark(#E9E2DC, #383331);
254
+ color: var(--zd-accent);
255
+ box-shadow: inset 0 -3px 0 var(--zd-accent);
256
+ }
257
+
258
+ html[data-theme-pack="graphite"] [data-header-nav] a[aria-current="page"] * {
259
+ color: var(--zd-accent);
260
+ }
261
+
262
+ html[data-theme-pack="graphite"] nav[data-zd-toc] a {
263
+ padding-inline: 0.5rem;
264
+ }
265
+
266
+ html[data-theme-pack="graphite"] nav[data-zd-toc] a[aria-current="true"] {
267
+ background-color: light-dark(#E9E2DC, #383331);
268
+ color: var(--zd-accent);
269
+ box-shadow: inset 3px 0 0 var(--zd-accent);
270
+ }
271
+
272
+ /* ---- inactive navigation hover ---- */
273
+
274
+ html[data-theme-pack="graphite"] #desktop-sidebar [data-sidebar-tree-root] a:not([aria-current="page"]):hover,
275
+ html[data-theme-pack="graphite"] aside[data-zd-mobile-sidebar] [data-sidebar-tree-root] a:not([aria-current="page"]):hover {
276
+ background-color: light-dark(#E1E5E4, #35383D);
277
+ color: var(--zd-accent);
278
+ }
279
+
280
+ html[data-theme-pack="graphite"] [data-site-nav] a:hover {
281
+ color: var(--zd-accent);
282
+ }
283
+
284
+ /* ---- tag chips: line outline, bg fill, opaque muted count ---- */
285
+
286
+ html[data-theme-pack="graphite"] a[data-zd-tag-chip] > [data-zd-tag-chip-outline] {
287
+ background-color: light-dark(#D2D8DC, #41464D);
288
+ }
289
+
290
+ html[data-theme-pack="graphite"] a[data-zd-tag-chip] > [data-zd-tag-chip-label] {
291
+ background-color: var(--zd-bg);
292
+ color: var(--zd-fg);
293
+ }
294
+
295
+ html[data-theme-pack="graphite"] a[data-zd-tag-chip] [data-zd-tag-count],
296
+ html[data-theme-pack="graphite"] footer[data-footer] [data-zd-tag-count] {
297
+ opacity: 1;
298
+ color: var(--zd-muted);
299
+ }
300
+
301
+ html[data-theme-pack="graphite"] a[data-zd-tag-chip]:hover > [data-zd-tag-chip-outline],
302
+ html[data-theme-pack="graphite"] a[data-zd-tag-chip]:focus-visible > [data-zd-tag-chip-outline] {
303
+ background-color: var(--zd-accent);
304
+ }
305
+
306
+ html[data-theme-pack="graphite"] a[data-zd-tag-chip]:hover > [data-zd-tag-chip-label],
307
+ html[data-theme-pack="graphite"] a[data-zd-tag-chip]:focus-visible > [data-zd-tag-chip-label] {
308
+ background-color: light-dark(#E1E5E4, #35383D);
309
+ color: var(--zd-accent);
310
+ }
311
+
312
+ html[data-theme-pack="graphite"] a[data-zd-tag-chip]:hover [data-zd-tag-count],
313
+ html[data-theme-pack="graphite"] a[data-zd-tag-chip]:focus-visible [data-zd-tag-count],
314
+ html[data-theme-pack="graphite"] footer[data-footer] a:hover [data-zd-tag-count],
315
+ html[data-theme-pack="graphite"] footer[data-footer] a:focus-visible [data-zd-tag-count] {
316
+ color: var(--zd-accent);
317
+ }
318
+
319
+ /* ---- admonitions: soft fills, semantic title + stripe (labels/icons kept) ---- */
320
+
321
+ html[data-theme-pack="graphite"] [data-admonition="note"] {
322
+ background-color: light-dark(#E9E2DC, #383331);
323
+ border-left-color: var(--zd-accent);
324
+ }
325
+
326
+ html[data-theme-pack="graphite"] [data-admonition="note"] .admonition-title {
327
+ color: var(--zd-accent);
328
+ }
329
+
330
+ html[data-theme-pack="graphite"] [data-admonition="important"] {
331
+ background-color: light-dark(#E9E2DC, #383331);
332
+ border-left-color: var(--zd-accent);
333
+ }
334
+
335
+ html[data-theme-pack="graphite"] [data-admonition="important"] .admonition-title {
336
+ color: var(--zd-accent);
337
+ }
338
+
339
+ html[data-theme-pack="graphite"] [data-admonition="info"] {
340
+ background-color: light-dark(#E1E5E5, #303439);
341
+ border-left-color: var(--zd-info);
342
+ }
343
+
344
+ html[data-theme-pack="graphite"] [data-admonition="info"] .admonition-title {
345
+ color: var(--zd-info);
346
+ }
347
+
348
+ html[data-theme-pack="graphite"] [data-admonition="tip"] {
349
+ background-color: light-dark(#E2E5E2, #303534);
350
+ border-left-color: var(--zd-success);
351
+ }
352
+
353
+ html[data-theme-pack="graphite"] [data-admonition="tip"] .admonition-title {
354
+ color: var(--zd-success);
355
+ }
356
+
357
+ html[data-theme-pack="graphite"] [data-admonition="warning"] {
358
+ background-color: light-dark(#E6E4DE, #353431);
359
+ border-left-color: var(--zd-warning);
360
+ }
361
+
362
+ html[data-theme-pack="graphite"] [data-admonition="warning"] .admonition-title {
363
+ color: var(--zd-warning);
364
+ }
365
+
366
+ html[data-theme-pack="graphite"] [data-admonition="danger"] {
367
+ background-color: light-dark(#E8E3E2, #353234);
368
+ border-left-color: var(--zd-danger);
369
+ }
370
+
371
+ html[data-theme-pack="graphite"] [data-admonition="danger"] .admonition-title {
372
+ color: var(--zd-danger);
373
+ }
374
+
375
+ html[data-theme-pack="graphite"] [data-admonition="caution"] {
376
+ background-color: light-dark(#E8E3E2, #353234);
377
+ border-left-color: var(--zd-danger);
378
+ }
379
+
380
+ html[data-theme-pack="graphite"] [data-admonition="caution"] .admonition-title {
381
+ color: var(--zd-danger);
382
+ }
383
+
384
+ /* ---- keyboard focus: 2px accent outline, 3px offset (inset inside scrollers so it is never clipped) ---- */
385
+
386
+ html[data-theme-pack="graphite"] :focus-visible {
387
+ outline: 2px solid var(--zd-accent);
388
+ outline-offset: 3px;
389
+ }
390
+
391
+ html[data-theme-pack="graphite"] #desktop-sidebar :focus-visible,
392
+ html[data-theme-pack="graphite"] aside[data-zd-mobile-sidebar] :focus-visible,
393
+ html[data-theme-pack="graphite"] nav[data-zd-toc] :focus-visible,
394
+ html[data-theme-pack="graphite"] div[data-zd-mobile-toc] :focus-visible {
395
+ outline-offset: -2px;
396
+ }
397
+
398
+ html[data-theme-pack="graphite"] .zd-content a,
399
+ html[data-theme-pack="graphite"] .zd-content button {
400
+ text-underline-offset: 3px;
401
+ }
@@ -0,0 +1,37 @@
1
+ {
2
+ "schemaVersion": 1,
3
+ "slug": "quiet-slate",
4
+ "name": "Quiet Slate",
5
+ "description": "Quiet blue-grey slate — misty slate paper by day, cool slate at night, a muted copper accent and quiet hairline rules.",
6
+ "mode": "dark",
7
+ "version": "1.0.0",
8
+ "fonts": {
9
+ "sans": "System",
10
+ "mono": "System",
11
+ "loaded": []
12
+ },
13
+ "preview": {
14
+ "light": {
15
+ "bg": "#EDF1F3",
16
+ "fg": "#3E4953",
17
+ "accent": "#95491E",
18
+ "syntax": {
19
+ "keyword": "#95491E",
20
+ "string": "#4D6356",
21
+ "comment": "#52606D",
22
+ "callable": "#476274"
23
+ }
24
+ },
25
+ "dark": {
26
+ "bg": "#2B3238",
27
+ "fg": "#D8DDE0",
28
+ "accent": "#E4AF89",
29
+ "syntax": {
30
+ "keyword": "#E4AF89",
31
+ "string": "#A9BFAD",
32
+ "comment": "#B3BFC9",
33
+ "callable": "#A3BDCD"
34
+ }
35
+ }
36
+ }
37
+ }