@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,94 @@
1
+ Copyright 2017 The EB Garamond Project Authors (https://github.com/octaviopardo/EBGaramond12)
2
+ Copyright 2015 The Courier Prime Project Authors (https://github.com/quoteunquoteapps/CourierPrime)
3
+
4
+ This Font Software is licensed under the SIL Open Font License, Version 1.1.
5
+ This license is copied below, and is also available with a FAQ at:
6
+ https://scripts.sil.org/OFL
7
+
8
+
9
+ -----------------------------------------------------------
10
+ SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
11
+ -----------------------------------------------------------
12
+
13
+ PREAMBLE
14
+ The goals of the Open Font License (OFL) are to stimulate worldwide
15
+ development of collaborative font projects, to support the font creation
16
+ efforts of academic and linguistic communities, and to provide a free and
17
+ open framework in which fonts may be shared and improved in partnership
18
+ with others.
19
+
20
+ The OFL allows the licensed fonts to be used, studied, modified and
21
+ redistributed freely as long as they are not sold by themselves. The
22
+ fonts, including any derivative works, can be bundled, embedded,
23
+ redistributed and/or sold with any software provided that any reserved
24
+ names are not used by derivative works. The fonts and derivatives,
25
+ however, cannot be released under any other type of license. The
26
+ requirement for fonts to remain under this license does not apply
27
+ to any document created using the fonts or their derivatives.
28
+
29
+ DEFINITIONS
30
+ "Font Software" refers to the set of files released by the Copyright
31
+ Holder(s) under this license and clearly marked as such. This may
32
+ include source files, build scripts and documentation.
33
+
34
+ "Reserved Font Name" refers to any names specified as such after the
35
+ copyright statement(s).
36
+
37
+ "Original Version" refers to the collection of Font Software components as
38
+ distributed by the Copyright Holder(s).
39
+
40
+ "Modified Version" refers to any derivative made by adding to, deleting,
41
+ or substituting -- in part or in whole -- any of the components of the
42
+ Original Version, by changing formats or by porting the Font Software to a
43
+ new environment.
44
+
45
+ "Author" refers to any designer, engineer, programmer, technical
46
+ writer or other person who contributed to the Font Software.
47
+
48
+ PERMISSION & CONDITIONS
49
+ Permission is hereby granted, free of charge, to any person obtaining
50
+ a copy of the Font Software, to use, study, copy, merge, embed, modify,
51
+ redistribute, and sell modified and unmodified copies of the Font
52
+ Software, subject to the following conditions:
53
+
54
+ 1) Neither the Font Software nor any of its individual components,
55
+ in Original or Modified Versions, may be sold by itself.
56
+
57
+ 2) Original or Modified Versions of the Font Software may be bundled,
58
+ redistributed and/or sold with any software, provided that each copy
59
+ contains the above copyright notice and this license. These can be
60
+ included either as stand-alone text files, human-readable headers or
61
+ in the appropriate machine-readable metadata fields within text or
62
+ binary files as long as those fields can be easily viewed by the user.
63
+
64
+ 3) No Modified Version of the Font Software may use the Reserved Font
65
+ Name(s) unless explicit written permission is granted by the corresponding
66
+ Copyright Holder. This restriction only applies to the primary font name as
67
+ presented to the users.
68
+
69
+ 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
70
+ Software shall not be used to promote, endorse or advertise any
71
+ Modified Version, except to acknowledge the contribution(s) of the
72
+ Copyright Holder(s) and the Author(s) or with their explicit written
73
+ permission.
74
+
75
+ 5) The Font Software, modified or unmodified, in part or in whole,
76
+ must be distributed entirely under this license, and must not be
77
+ distributed under any other license. The requirement for fonts to
78
+ remain under this license does not apply to any document created
79
+ using the Font Software.
80
+
81
+ TERMINATION
82
+ This license becomes null and void if any of the above conditions are
83
+ not met.
84
+
85
+ DISCLAIMER
86
+ THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
87
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
88
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
89
+ OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
90
+ COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
91
+ INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
92
+ DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
93
+ FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
94
+ OTHER DEALINGS IN THE FONT SOFTWARE.
@@ -0,0 +1,37 @@
1
+ {
2
+ "schemaVersion": 1,
3
+ "slug": "eink",
4
+ "name": "E-Ink",
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
+ "mode": "light",
7
+ "version": "1.0.0",
8
+ "fonts": {
9
+ "sans": "EB Garamond",
10
+ "mono": "Courier Prime",
11
+ "loaded": ["EB Garamond", "Courier Prime"]
12
+ },
13
+ "preview": {
14
+ "light": {
15
+ "bg": "oklch(0.956 0.007 90)",
16
+ "fg": "oklch(0.24 0.012 85)",
17
+ "accent": "oklch(0.155 0.01 85)",
18
+ "syntax": {
19
+ "keyword": "oklch(0.18 0.01 85)",
20
+ "string": "oklch(0.46 0.012 85)",
21
+ "comment": "oklch(0.505 0.01 85)",
22
+ "callable": "oklch(0.31 0.012 85)"
23
+ }
24
+ },
25
+ "dark": {
26
+ "bg": "oklch(0.215 0.008 80)",
27
+ "fg": "oklch(0.885 0.012 85)",
28
+ "accent": "oklch(0.955 0.008 85)",
29
+ "syntax": {
30
+ "keyword": "oklch(0.96 0.008 85)",
31
+ "string": "oklch(0.715 0.012 85)",
32
+ "comment": "oklch(0.645 0.01 85)",
33
+ "callable": "oklch(0.82 0.01 85)"
34
+ }
35
+ }
36
+ }
37
+ }
@@ -0,0 +1,490 @@
1
+ /* ============================================================
2
+ E-Ink — zudo-doc theme pack (ADR docs/adr/theme-packs.md)
3
+
4
+ E-reader grayscale: warm paper-gray white, near-black ink,
5
+ shadowless 1px hairline chrome, zero radius, hue-free UI.
6
+ The syntax palette works by grayscale VALUE plus typographic
7
+ style — bold keywords, italic comments and types, mid-gray
8
+ strings — never hue; only inserted/deleted carry a trace of
9
+ ultra-desaturated ink-blue/ink-red (diff semantics need it).
10
+ Dark mode is e-ink night: deep warm gray, pale ink, same
11
+ device with the backlight inverted. EB Garamond (variable
12
+ 400–800, roman + italic) is both the reading and display
13
+ face; Courier Prime (400/700) is the typewriter code face.
14
+ Links keep a permanent underline — with hue off the table,
15
+ the underline IS the affordance (hover thickens it).
16
+
17
+ Differentiation from `beacon` (the other hue-minimal pack):
18
+ beacon is AAA-loud pure white/black with blue+red accents and
19
+ thick 3px rules; eink is QUIET warm paper — no accent hue at
20
+ all, and every rule is a 1px hairline.
21
+
22
+ Contrast pre-check (culori, WCAG relative luminance), BOTH
23
+ modes, every pair >= 4.5:1 with headroom (all >= 4.69:1):
24
+ light — fg 14.5:1, muted 6.6:1, accent-as-link 17.2:1,
25
+ code-fg 13.2:1; syntax grays vs code-bg: keyword 15.0,
26
+ name 12.8, callable 10.5, number 8.3, type 6.8, string 5.7,
27
+ comment 4.69; inserted 8.3, deleted 8.2; selection 12.3:1
28
+ dark — fg 12.4:1, muted 6.6:1, accent-as-link 15.4:1,
29
+ code-fg 11.5:1; syntax grays: keyword 14.5, name 11.7,
30
+ callable 9.3, number 7.6, string 6.4, type 5.7, comment
31
+ 4.92; inserted 8.2, deleted 7.7; selection 11.3:1
32
+ Composited surfaces verified too: flattened admonition paper,
33
+ header/pager surface, find-in-page washes, diff-line
34
+ backgrounds (8% mix override keeps 6.7:1+ in both modes),
35
+ chat bubbles, matched-keyword inversion, aria-current
36
+ inversion. Adjacent gray-ladder steps run 1.12x–1.26x in
37
+ relative luminance, on top of the weight/slant distinction.
38
+
39
+ Every rule below is scoped under html[data-theme-pack="eink"]
40
+ — this is what makes the runtime pack swap atomic (Decision 3)
41
+ and lets the validator prove a pack can never leak styles
42
+ while inactive (Decision 6.7). The @font-face blocks are the
43
+ sole exception (at-rules can't be selector-scoped).
44
+
45
+ Prototype 12-eink.html (git b185ee6) was inspiration only —
46
+ no prototype selectors ship here; extras target the stable
47
+ hook table in docs/theme-pack-authoring.md (b). Where the
48
+ prototype kept a teal accent, this pack goes stricter:
49
+ fully hue-free, as the Batch-5 brief demands.
50
+ ============================================================ */
51
+
52
+ /* EB Garamond — variable weight 400-800, roman. Body, headings, chrome.
53
+ Latin subset only (latin-ext trimmed for the payload budget — rare
54
+ extended-Latin glyphs fall back to the generic serif tail). */
55
+ @font-face {
56
+ font-family: "EB Garamond";
57
+ font-style: normal;
58
+ font-weight: 400 800;
59
+ font-display: swap;
60
+ src: url("./fonts/EBGaramond-latin.woff2") format("woff2");
61
+ unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA,
62
+ U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191,
63
+ U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
64
+ }
65
+
66
+ /* EB Garamond — italic. Blockquotes, emphasis, descriptions, pager titles. */
67
+ @font-face {
68
+ font-family: "EB Garamond";
69
+ font-style: italic;
70
+ font-weight: 400 800;
71
+ font-display: swap;
72
+ src: url("./fonts/EBGaramond-latin-italic.woff2") format("woff2");
73
+ unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA,
74
+ U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191,
75
+ U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
76
+ }
77
+
78
+ /* Courier Prime — the e-reader's typewriter code face. Comments and types
79
+ render italic via synthesized oblique (no italic file shipped — the slant
80
+ cue survives; the grayscale VALUE carries the primary distinction). */
81
+ @font-face {
82
+ font-family: "Courier Prime";
83
+ font-style: normal;
84
+ font-weight: 400;
85
+ font-display: swap;
86
+ src: url("./fonts/CourierPrime-400-latin.woff2") format("woff2");
87
+ unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA,
88
+ U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191,
89
+ U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
90
+ }
91
+
92
+ @font-face {
93
+ font-family: "Courier Prime";
94
+ font-style: normal;
95
+ font-weight: 400;
96
+ font-display: swap;
97
+ src: url("./fonts/CourierPrime-400-latin-ext.woff2") format("woff2");
98
+ unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7,
99
+ U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F,
100
+ U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F,
101
+ U+A720-A7FF;
102
+ }
103
+
104
+ @font-face {
105
+ font-family: "Courier Prime";
106
+ font-style: normal;
107
+ font-weight: 700;
108
+ font-display: swap;
109
+ src: url("./fonts/CourierPrime-700-latin.woff2") format("woff2");
110
+ unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA,
111
+ U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191,
112
+ U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
113
+ }
114
+
115
+ @font-face {
116
+ font-family: "Courier Prime";
117
+ font-style: normal;
118
+ font-weight: 700;
119
+ font-display: swap;
120
+ src: url("./fonts/CourierPrime-700-latin-ext.woff2") format("woff2");
121
+ unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7,
122
+ U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F,
123
+ U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F,
124
+ U+A720-A7FF;
125
+ }
126
+
127
+ html[data-theme-pack="eink"] {
128
+ /* Tier-2 semantic roles — warm paper & near-black ink; dark mode is the
129
+ same panel at night. Both modes always via light-dark(). The whole UI
130
+ is hue-free: accent IS ink (a shade blacker than body text), and the
131
+ underline — not color — is the link affordance. */
132
+ --zd-bg: light-dark(oklch(0.956 0.007 90), oklch(0.215 0.008 80));
133
+ --zd-fg: light-dark(oklch(0.24 0.012 85), oklch(0.885 0.012 85));
134
+ /* selection = the e-ink refresh inversion */
135
+ --zd-selection-bg: light-dark(oklch(0.3 0.012 85), oklch(0.84 0.01 85));
136
+ --zd-selection-fg: light-dark(oklch(0.965 0.006 90), oklch(0.19 0.008 80));
137
+ --zd-surface: light-dark(oklch(0.936 0.008 90), oklch(0.245 0.008 80));
138
+ --zd-muted: light-dark(oklch(0.45 0.014 85), oklch(0.7 0.012 85));
139
+ --zd-accent: light-dark(oklch(0.155 0.01 85), oklch(0.955 0.008 85));
140
+ --zd-accent-hover: light-dark(oklch(0.08 0.005 85), oklch(0.995 0.004 85));
141
+ --zd-code-bg: light-dark(oklch(0.924 0.008 90), oklch(0.245 0.008 80));
142
+ --zd-code-fg: light-dark(oklch(0.24 0.012 85), oklch(0.885 0.012 85));
143
+ /* state roles stay grayscale — admonitions differentiate by VALUE,
144
+ border treatment, and glyph, never hue (danger darkest/loudest,
145
+ info lightest/quietest) */
146
+ --zd-success: light-dark(oklch(0.4 0.014 85), oklch(0.75 0.012 85));
147
+ --zd-danger: light-dark(oklch(0.2 0.012 85), oklch(0.93 0.01 85));
148
+ --zd-warning: light-dark(oklch(0.33 0.014 85), oklch(0.8 0.012 85));
149
+ --zd-info: light-dark(oklch(0.46 0.012 85), oklch(0.72 0.012 85));
150
+
151
+ /* an e-ink panel cannot show color anywhere — mermaid diagrams, chat
152
+ bubbles, search marks and image overlays all fold onto the gray ramp
153
+ (the bundled defaults would otherwise leak amber/accent hues) */
154
+ --zd-mermaid-node-bg: light-dark(oklch(0.924 0.008 90), oklch(0.265 0.008 80));
155
+ --zd-mermaid-text: light-dark(oklch(0.24 0.012 85), oklch(0.885 0.012 85));
156
+ --zd-mermaid-line: light-dark(oklch(0.45 0.014 85), oklch(0.62 0.012 85));
157
+ --zd-mermaid-label-bg: light-dark(oklch(0.956 0.007 90), oklch(0.215 0.008 80));
158
+ --zd-mermaid-note-bg: light-dark(oklch(0.9 0.008 90), oklch(0.3 0.008 80));
159
+ --zd-chat-user-bg: light-dark(oklch(0.3 0.012 85), oklch(0.84 0.01 85));
160
+ --zd-chat-user-text: light-dark(oklch(0.965 0.006 90), oklch(0.19 0.008 80));
161
+ --zd-chat-assistant-bg: light-dark(oklch(0.936 0.008 90), oklch(0.265 0.008 80));
162
+ --zd-chat-assistant-text: light-dark(oklch(0.24 0.012 85), oklch(0.885 0.012 85));
163
+ --zd-image-overlay-bg: light-dark(oklch(0.945 0.008 90), oklch(0.19 0.006 80));
164
+ --zd-image-overlay-fg: light-dark(oklch(0.24 0.012 85), oklch(0.885 0.012 85));
165
+ /* search mark = the same refresh inversion as the selection */
166
+ --zd-matched-keyword-bg: light-dark(oklch(0.3 0.012 85), oklch(0.84 0.01 85));
167
+ --zd-matched-keyword-fg: light-dark(oklch(0.965 0.006 90), oklch(0.19 0.008 80));
168
+
169
+ /* syntax — all 9 roles, both modes, told by grayscale VALUE + style:
170
+ the ladder runs keyword (blackest, bold) -> name -> callable (bold) ->
171
+ number -> type (italic) -> string (mid-gray) -> comment (lightest legal
172
+ gray, italic). Only the diff pair keeps a trace of hue: ultra-
173
+ desaturated ink-blue inserted / ink-red deleted. */
174
+ --zd-syntax-keyword: light-dark(oklch(0.18 0.01 85), oklch(0.96 0.008 85));
175
+ --zd-syntax-name: light-dark(oklch(0.25 0.012 85), oklch(0.89 0.01 85));
176
+ --zd-syntax-callable: light-dark(oklch(0.31 0.012 85), oklch(0.82 0.01 85));
177
+ --zd-syntax-number: light-dark(oklch(0.37 0.012 85), oklch(0.76 0.012 85));
178
+ --zd-syntax-type: light-dark(oklch(0.42 0.012 85), oklch(0.685 0.012 85));
179
+ --zd-syntax-string: light-dark(oklch(0.46 0.012 85), oklch(0.715 0.012 85));
180
+ --zd-syntax-comment: light-dark(oklch(0.505 0.01 85), oklch(0.645 0.01 85));
181
+ --zd-syntax-inserted: light-dark(oklch(0.37 0.05 255), oklch(0.78 0.06 250));
182
+ --zd-syntax-deleted: light-dark(oklch(0.38 0.055 25), oklch(0.775 0.075 25));
183
+ /* features.css derives diff-line backgrounds as a 15% mix of the diff ink
184
+ into code-bg; an 8% mix keeps the cue, stays paper-quiet, and holds
185
+ 6.7:1+ for the diff inks in both modes (verified composited). */
186
+ --zfb-hi-ins-bg: color-mix(in srgb, var(--zd-syntax-inserted) 8%, var(--zd-code-bg));
187
+ --zfb-hi-del-bg: color-mix(in srgb, var(--zd-syntax-deleted) 8%, var(--zd-code-bg));
188
+
189
+ /* fonts — EB Garamond reads AND displays (one face, the book way);
190
+ Courier Prime for code. Generic tails keep CJK on platform faces. */
191
+ --font-sans: "EB Garamond", "Iowan Old Style", "Palatino Linotype", Georgia,
192
+ serif;
193
+ --font-mono: "Courier Prime", "Courier New", Courier, monospace;
194
+
195
+ /* Tier-3 component seams — a paper device has no rounded corners and no
196
+ heavy display weights; hierarchy comes from size and hairlines. */
197
+ --zdc-doc-title-font: var(--font-sans);
198
+ --zdc-doc-title-weight: 600;
199
+ --zdc-doc-title-tracking: 0.005em;
200
+ --zdc-doc-h2-font: var(--font-sans);
201
+ --zdc-doc-h2-weight: 600;
202
+ --zdc-doc-h2-tracking: 0.01em;
203
+ --zdc-doc-h3-weight: 600;
204
+ --zdc-doc-h4-weight: 600;
205
+ --zdc-doc-link-decoration: underline;
206
+ --zdc-admonition-radius: 0;
207
+ --zdc-admonition-border-width: 4px;
208
+ --zdc-card-radius: 0;
209
+ --zdc-nav-active-indicator-color: var(--zd-fg);
210
+ --zdc-nav-active-weight: 600;
211
+ }
212
+
213
+ /* ---- E-Ink extras: device stillness — everything drawn with crisp 1px
214
+ warm-gray hairlines; no shadows, no gradients, no corners ---- */
215
+
216
+ /* the page: a book measure for Garamond's small x-height */
217
+ html[data-theme-pack="eink"] body {
218
+ font-size: 1.12rem;
219
+ line-height: 1.7;
220
+ }
221
+ /* .zd-content re-declares font-size/line-height on itself (content.css),
222
+ so the body values above never reach the prose — restate the measure on
223
+ the content root. */
224
+ html[data-theme-pack="eink"] .zd-content {
225
+ font-size: 1.12rem;
226
+ line-height: 1.7;
227
+ }
228
+
229
+ /* chrome hairlines: the only "shading" this pack allows */
230
+ html[data-theme-pack="eink"] header[data-header] {
231
+ border-bottom: 1px solid color-mix(in oklch, var(--zd-fg) 28%, transparent);
232
+ box-shadow: none;
233
+ }
234
+ html[data-theme-pack="eink"] #desktop-sidebar {
235
+ border-right: 1px solid color-mix(in oklch, var(--zd-fg) 28%, transparent);
236
+ }
237
+ html[data-theme-pack="eink"] aside[data-zd-mobile-sidebar] {
238
+ border-right: 1px solid color-mix(in oklch, var(--zd-fg) 28%, transparent);
239
+ box-shadow: none;
240
+ }
241
+ html[data-theme-pack="eink"] nav[data-zd-toc] ul {
242
+ border-left: 1px solid color-mix(in oklch, var(--zd-fg) 28%, transparent);
243
+ }
244
+ html[data-theme-pack="eink"] div[data-zd-mobile-toc] {
245
+ border: 1px solid color-mix(in oklch, var(--zd-fg) 28%, transparent);
246
+ border-radius: 0;
247
+ box-shadow: none;
248
+ }
249
+ html[data-theme-pack="eink"] footer[data-footer] {
250
+ border-top: 1px solid color-mix(in oklch, var(--zd-fg) 28%, transparent);
251
+ }
252
+ html[data-theme-pack="eink"] .zd-content hr {
253
+ border-top: 1px solid color-mix(in oklch, var(--zd-fg) 28%, transparent);
254
+ }
255
+
256
+ /* device-menu chrome labels: small, letterspaced, even in Garamond */
257
+ html[data-theme-pack="eink"] [data-header-logo] {
258
+ font-weight: 600;
259
+ font-size: 1.3rem;
260
+ letter-spacing: 0.01em;
261
+ }
262
+ html[data-theme-pack="eink"] [data-nav-item] {
263
+ font-size: 0.82rem;
264
+ font-weight: 600;
265
+ text-transform: uppercase;
266
+ letter-spacing: 0.12em;
267
+ }
268
+
269
+ /* chapter-title plate: a double book rule under the h1 */
270
+ html[data-theme-pack="eink"] .zd-content h1 {
271
+ padding-bottom: 0.4rem;
272
+ border-bottom: 3px double color-mix(in oklch, var(--zd-fg) 55%, transparent);
273
+ }
274
+ html[data-theme-pack="eink"] .zd-content > p[data-doc-description] {
275
+ font-style: italic;
276
+ font-size: 1.16rem;
277
+ }
278
+
279
+ /* h2: the SSR-inlined `style="border-image:linear-gradient(...)"` bar is
280
+ defeated with border-image none !important (Decision 6.6's sole
281
+ allowlisted carve-out); a crisp 1px hairline replaces the fade. h3/h4
282
+ want NO bar at all, which zeroing the class-level border-top-width
283
+ achieves without !important (a zero-width border area leaves the inline
284
+ border-image nothing to paint on). */
285
+ html[data-theme-pack="eink"] .zd-content h2 {
286
+ border-image: none !important;
287
+ border-top-width: 1px;
288
+ border-top-color: color-mix(in oklch, var(--zd-fg) 28%, transparent);
289
+ padding-top: 1.2rem;
290
+ }
291
+ html[data-theme-pack="eink"] .zd-content h3 {
292
+ border-top-width: 0;
293
+ }
294
+ html[data-theme-pack="eink"] .zd-content h4 {
295
+ border-top-width: 0;
296
+ }
297
+
298
+ /* links: with hue gone, the underline is the affordance — hairline at
299
+ rest, thicker on hover (a non-color hover cue) */
300
+ html[data-theme-pack="eink"] .zd-content a {
301
+ text-decoration-thickness: 1px;
302
+ text-underline-offset: 0.16em;
303
+ }
304
+ html[data-theme-pack="eink"] .zd-content a:hover {
305
+ text-decoration-thickness: 2px;
306
+ }
307
+ /* breadcrumb and footer links sit in text-like contexts — underline them
308
+ too, so no link anywhere relies on color alone */
309
+ html[data-theme-pack="eink"] main nav[aria-label="Breadcrumb"] a,
310
+ html[data-theme-pack="eink"] footer[data-footer] a {
311
+ text-decoration: underline;
312
+ text-decoration-thickness: 1px;
313
+ text-underline-offset: 0.16em;
314
+ }
315
+
316
+ /* literary prose details */
317
+ html[data-theme-pack="eink"] .zd-content blockquote {
318
+ font-style: italic;
319
+ border-left: 1px solid color-mix(in oklch, var(--zd-fg) 55%, transparent);
320
+ }
321
+
322
+ /* inline code: an outlined chip, paper-flat — no fill, no corner */
323
+ html[data-theme-pack="eink"] .zd-content code:not(pre code) {
324
+ background: transparent;
325
+ border: 1px solid color-mix(in oklch, var(--zd-fg) 28%, transparent);
326
+ border-radius: 0;
327
+ font-size: 0.9em;
328
+ padding: 0 0.3rem;
329
+ }
330
+
331
+ /* code block: a flat e-ink panel behind one hairline; roles read by
332
+ weight, slant, and gray value — never hue */
333
+ html[data-theme-pack="eink"] pre.hi-root {
334
+ border: 1px solid color-mix(in oklch, var(--zd-fg) 28%, transparent);
335
+ border-radius: 0;
336
+ font-size: 0.95rem;
337
+ line-height: 1.65;
338
+ }
339
+ html[data-theme-pack="eink"] .hi-kw {
340
+ font-weight: 700;
341
+ }
342
+ html[data-theme-pack="eink"] .hi-fn {
343
+ font-weight: 700;
344
+ }
345
+ html[data-theme-pack="eink"] .hi-com {
346
+ font-style: italic;
347
+ }
348
+ html[data-theme-pack="eink"] .hi-ty {
349
+ font-style: italic;
350
+ }
351
+
352
+ /* find-in-page: the stock warning-tinted washes go gray here — a quiet
353
+ ink wash for matches, the full refresh inversion for the active one */
354
+ html[data-theme-pack="eink"] .find-match {
355
+ background-color: color-mix(in srgb, var(--zd-fg) 12%, transparent);
356
+ border-radius: 0;
357
+ }
358
+ html[data-theme-pack="eink"] .find-match-active {
359
+ background-color: var(--zd-fg);
360
+ color: var(--zd-bg);
361
+ border-radius: 0;
362
+ outline: 1px solid var(--zd-fg);
363
+ }
364
+
365
+ /* admonitions: flat paper cards in a hairline frame — no tint washes.
366
+ With hue off the table, the variants are told apart by VALUE (each
367
+ title reads its state role's gray), by the LEFT-EDGE treatment
368
+ (solid/double, 4px/6px), and by a monochrome text glyph. The flattened
369
+ background also restores each title gray's full contrast ratio. */
370
+ html[data-theme-pack="eink"] [data-admonition] {
371
+ background-color: var(--zd-bg);
372
+ border: 1px solid color-mix(in oklch, var(--zd-fg) 28%, transparent);
373
+ border-left-width: var(--zdc-admonition-border-width);
374
+ border-left-style: solid;
375
+ border-left-color: var(--zd-muted);
376
+ }
377
+ html[data-theme-pack="eink"] [data-admonition] .admonition-title {
378
+ font-size: 0.82rem;
379
+ font-weight: 700;
380
+ text-transform: uppercase;
381
+ letter-spacing: 0.1em;
382
+ }
383
+ html[data-theme-pack="eink"] [data-admonition="note"] {
384
+ border-left-color: var(--zd-accent);
385
+ }
386
+ html[data-theme-pack="eink"] [data-admonition="note"] .admonition-title::before {
387
+ content: "✎ ";
388
+ }
389
+ html[data-theme-pack="eink"] [data-admonition="tip"] {
390
+ border-left-color: var(--zd-success);
391
+ }
392
+ html[data-theme-pack="eink"] [data-admonition="tip"] .admonition-title::before {
393
+ content: "✳ ";
394
+ }
395
+ html[data-theme-pack="eink"] [data-admonition="info"] {
396
+ border-left-color: var(--zd-info);
397
+ }
398
+ html[data-theme-pack="eink"] [data-admonition="info"] .admonition-title::before {
399
+ content: "¶ ";
400
+ }
401
+ html[data-theme-pack="eink"] [data-admonition="important"] {
402
+ border-left-width: 6px;
403
+ border-left-color: var(--zd-accent);
404
+ }
405
+ html[data-theme-pack="eink"] [data-admonition="important"] .admonition-title::before {
406
+ content: "‼ ";
407
+ }
408
+ html[data-theme-pack="eink"] [data-admonition="warning"] {
409
+ border-left-width: 6px;
410
+ border-left-style: double;
411
+ border-left-color: var(--zd-warning);
412
+ }
413
+ html[data-theme-pack="eink"] [data-admonition="warning"] .admonition-title::before {
414
+ content: "▲ ";
415
+ }
416
+ html[data-theme-pack="eink"] [data-admonition="caution"] {
417
+ border-left-width: 6px;
418
+ border-left-style: double;
419
+ border-left-color: var(--zd-danger);
420
+ }
421
+ html[data-theme-pack="eink"] [data-admonition="caution"] .admonition-title::before {
422
+ content: "△ ";
423
+ }
424
+ html[data-theme-pack="eink"] [data-admonition="danger"] {
425
+ border-color: var(--zd-danger);
426
+ border-left-width: 6px;
427
+ border-left-style: solid;
428
+ }
429
+ html[data-theme-pack="eink"] [data-admonition="danger"] .admonition-title::before {
430
+ content: "⊗ ";
431
+ }
432
+
433
+ /* table: a device data-grid — strong hairline under the header row,
434
+ plain hairlines between rows, letterspaced column labels */
435
+ html[data-theme-pack="eink"] .zd-content th {
436
+ font-size: 0.82rem;
437
+ text-transform: uppercase;
438
+ letter-spacing: 0.09em;
439
+ border-bottom: 1px solid color-mix(in oklch, var(--zd-fg) 55%, transparent);
440
+ }
441
+ html[data-theme-pack="eink"] .zd-content td {
442
+ border-bottom: 1px solid color-mix(in oklch, var(--zd-fg) 28%, transparent);
443
+ }
444
+
445
+ /* pager: page-turn cards — hairline frames, no fill; hover answers with
446
+ a stronger rule and the surface gray, never a color */
447
+ html[data-theme-pack="eink"] .zd-content > nav[data-doc-pager] a {
448
+ border-radius: 0;
449
+ border-color: color-mix(in oklch, var(--zd-fg) 28%, transparent);
450
+ box-shadow: none;
451
+ }
452
+ html[data-theme-pack="eink"] .zd-content > nav[data-doc-pager] a:hover {
453
+ border-color: color-mix(in oklch, var(--zd-fg) 55%, transparent);
454
+ background-color: var(--zd-surface);
455
+ }
456
+ html[data-theme-pack="eink"] .zd-content > nav[data-doc-pager] a > div {
457
+ font-size: 0.78rem;
458
+ text-transform: uppercase;
459
+ letter-spacing: 0.1em;
460
+ }
461
+ html[data-theme-pack="eink"] .zd-content > nav[data-doc-pager] a > p {
462
+ font-style: italic;
463
+ }
464
+
465
+ /* theme-pack flyout: an e-reader settings dialog — double hairline frame,
466
+ square, shadowless; the launcher squares off and "presses" with the
467
+ refresh inversion instead of a glow. The offset outer hairline is drawn
468
+ as box-shadow rings, NOT `outline`, so the card's keyboard focus-visible
469
+ accent outline keeps working (an unlayered pack `outline` would silently
470
+ override that utility — the broadsheet/onyx precedent, #2883 class); the
471
+ flat rings also replace the default elevation shadow, keeping the
472
+ e-paper shadowless. */
473
+ html[data-theme-pack="eink"] [data-switcher-card] {
474
+ background-color: var(--zd-bg);
475
+ border: 1px solid color-mix(in oklch, var(--zd-fg) 55%, transparent);
476
+ border-radius: 0;
477
+ box-shadow:
478
+ 0 0 0 3px var(--zd-bg),
479
+ 0 0 0 4px color-mix(in oklch, var(--zd-fg) 55%, transparent);
480
+ }
481
+ html[data-theme-pack="eink"] [data-switcher-launcher] {
482
+ background-color: var(--zd-bg);
483
+ border: 1px solid color-mix(in oklch, var(--zd-fg) 55%, transparent);
484
+ border-radius: 0;
485
+ box-shadow: none;
486
+ }
487
+ html[data-theme-pack="eink"] [data-switcher-launcher]:hover {
488
+ background-color: var(--zd-fg);
489
+ color: var(--zd-bg);
490
+ }
@@ -4,7 +4,7 @@
4
4
  "name": "Foundry",
5
5
  "description": "GitHub-neutral baseline — white paper, near-black ink, Primer-blue links, quiet gray rules. Restraint, perfected.",
6
6
  "mode": "light",
7
- "version": "1.0.1",
7
+ "version": "1.0.2",
8
8
  "fonts": {
9
9
  "sans": "Inter",
10
10
  "mono": "System",
@@ -129,13 +129,13 @@ html[data-theme-pack="foundry"] [data-nav-item] {
129
129
  }
130
130
  html[data-theme-pack="foundry"] [data-nav-item]:hover {
131
131
  text-decoration: none;
132
- background: color-mix(in srgb, var(--zd-muted) 14%, transparent);
132
+ background: color-mix(in srgb, var(--zd-muted) 8%, transparent);
133
133
  }
134
134
 
135
135
  /* sidebar: gray hover wash; active item = subtle fill + Primer-blue bar */
136
136
  html[data-theme-pack="foundry"] #desktop-sidebar a:hover {
137
137
  text-decoration: none;
138
- background: color-mix(in srgb, var(--zd-muted) 14%, transparent);
138
+ background: color-mix(in srgb, var(--zd-muted) 8%, transparent);
139
139
  }
140
140
  html[data-theme-pack="foundry"] a[data-nav-active] {
141
141
  background: color-mix(in srgb, var(--zd-muted) 16%, transparent);
@@ -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.1",
7
+ "version": "1.0.2",
8
8
  "fonts": {
9
9
  "sans": "Nunito",
10
10
  "mono": "Spline Sans Mono",