@cogenta/theme-docs 0.3.3 → 0.5.4

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 (148) hide show
  1. package/dist/src/index.d.ts +2 -0
  2. package/dist/src/index.d.ts.map +1 -1
  3. package/dist/src/index.js +2 -0
  4. package/dist/src/index.js.map +1 -1
  5. package/dist/src/render/blocks/accordion.d.ts +8 -0
  6. package/dist/src/render/blocks/accordion.d.ts.map +1 -1
  7. package/dist/src/render/blocks/accordion.js +10 -10
  8. package/dist/src/render/blocks/accordion.js.map +1 -1
  9. package/dist/src/render/blocks/collection-list.d.ts +3 -11
  10. package/dist/src/render/blocks/collection-list.d.ts.map +1 -1
  11. package/dist/src/render/blocks/collection-list.js +69 -68
  12. package/dist/src/render/blocks/collection-list.js.map +1 -1
  13. package/dist/src/render/blocks/cta.d.ts +6 -0
  14. package/dist/src/render/blocks/cta.d.ts.map +1 -1
  15. package/dist/src/render/blocks/cta.js +9 -4
  16. package/dist/src/render/blocks/cta.js.map +1 -1
  17. package/dist/src/render/blocks/embed.d.ts.map +1 -1
  18. package/dist/src/render/blocks/embed.js +14 -13
  19. package/dist/src/render/blocks/embed.js.map +1 -1
  20. package/dist/src/render/blocks/faq.d.ts +7 -0
  21. package/dist/src/render/blocks/faq.d.ts.map +1 -1
  22. package/dist/src/render/blocks/faq.js +10 -10
  23. package/dist/src/render/blocks/faq.js.map +1 -1
  24. package/dist/src/render/blocks/feature-grid.d.ts.map +1 -1
  25. package/dist/src/render/blocks/feature-grid.js +19 -19
  26. package/dist/src/render/blocks/feature-grid.js.map +1 -1
  27. package/dist/src/render/blocks/gallery.d.ts +8 -4
  28. package/dist/src/render/blocks/gallery.d.ts.map +1 -1
  29. package/dist/src/render/blocks/gallery.js +19 -13
  30. package/dist/src/render/blocks/gallery.js.map +1 -1
  31. package/dist/src/render/blocks/hero.d.ts +12 -9
  32. package/dist/src/render/blocks/hero.d.ts.map +1 -1
  33. package/dist/src/render/blocks/hero.js +22 -20
  34. package/dist/src/render/blocks/hero.js.map +1 -1
  35. package/dist/src/render/blocks/logo-strip.d.ts +6 -0
  36. package/dist/src/render/blocks/logo-strip.d.ts.map +1 -1
  37. package/dist/src/render/blocks/logo-strip.js +6 -10
  38. package/dist/src/render/blocks/logo-strip.js.map +1 -1
  39. package/dist/src/render/blocks/logos.d.ts +10 -0
  40. package/dist/src/render/blocks/logos.d.ts.map +1 -1
  41. package/dist/src/render/blocks/logos.js +20 -17
  42. package/dist/src/render/blocks/logos.js.map +1 -1
  43. package/dist/src/render/blocks/media-figure.d.ts +0 -6
  44. package/dist/src/render/blocks/media-figure.d.ts.map +1 -1
  45. package/dist/src/render/blocks/media-figure.js +28 -16
  46. package/dist/src/render/blocks/media-figure.js.map +1 -1
  47. package/dist/src/render/blocks/pricing-table.d.ts.map +1 -1
  48. package/dist/src/render/blocks/pricing-table.js +16 -20
  49. package/dist/src/render/blocks/pricing-table.js.map +1 -1
  50. package/dist/src/render/blocks/prose.d.ts +13 -1
  51. package/dist/src/render/blocks/prose.d.ts.map +1 -1
  52. package/dist/src/render/blocks/prose.js +12 -31
  53. package/dist/src/render/blocks/prose.js.map +1 -1
  54. package/dist/src/render/blocks/quote.d.ts +5 -3
  55. package/dist/src/render/blocks/quote.d.ts.map +1 -1
  56. package/dist/src/render/blocks/quote.js +10 -14
  57. package/dist/src/render/blocks/quote.js.map +1 -1
  58. package/dist/src/render/blocks/stat-counter.d.ts +5 -0
  59. package/dist/src/render/blocks/stat-counter.d.ts.map +1 -1
  60. package/dist/src/render/blocks/stat-counter.js +6 -10
  61. package/dist/src/render/blocks/stat-counter.js.map +1 -1
  62. package/dist/src/render/blocks/stats.d.ts +10 -0
  63. package/dist/src/render/blocks/stats.d.ts.map +1 -1
  64. package/dist/src/render/blocks/stats.js +13 -8
  65. package/dist/src/render/blocks/stats.js.map +1 -1
  66. package/dist/src/render/blocks/testimonial.d.ts +4 -5
  67. package/dist/src/render/blocks/testimonial.d.ts.map +1 -1
  68. package/dist/src/render/blocks/testimonial.js +9 -13
  69. package/dist/src/render/blocks/testimonial.js.map +1 -1
  70. package/dist/src/render/chrome.d.ts +36 -1
  71. package/dist/src/render/chrome.d.ts.map +1 -1
  72. package/dist/src/render/chrome.js +122 -80
  73. package/dist/src/render/chrome.js.map +1 -1
  74. package/dist/src/render/doc-index.d.ts +25 -0
  75. package/dist/src/render/doc-index.d.ts.map +1 -0
  76. package/dist/src/render/doc-index.js +49 -0
  77. package/dist/src/render/doc-index.js.map +1 -0
  78. package/dist/src/render/doc-page.d.ts +6 -0
  79. package/dist/src/render/doc-page.d.ts.map +1 -0
  80. package/dist/src/render/doc-page.js +127 -0
  81. package/dist/src/render/doc-page.js.map +1 -0
  82. package/dist/src/render/layout.d.ts +23 -0
  83. package/dist/src/render/layout.d.ts.map +1 -0
  84. package/dist/src/render/layout.js +40 -0
  85. package/dist/src/render/layout.js.map +1 -0
  86. package/dist/src/render/render-block.d.ts +9 -6
  87. package/dist/src/render/render-block.d.ts.map +1 -1
  88. package/dist/src/render/render-block.js +47 -100
  89. package/dist/src/render/render-block.js.map +1 -1
  90. package/dist/src/render/rich-text.d.ts +26 -0
  91. package/dist/src/render/rich-text.d.ts.map +1 -0
  92. package/dist/src/render/rich-text.js +325 -0
  93. package/dist/src/render/rich-text.js.map +1 -0
  94. package/dist/src/render/search.d.ts +15 -0
  95. package/dist/src/render/search.d.ts.map +1 -0
  96. package/dist/src/render/search.js +31 -0
  97. package/dist/src/render/search.js.map +1 -0
  98. package/dist/src/render/strings.d.ts +51 -0
  99. package/dist/src/render/strings.d.ts.map +1 -0
  100. package/dist/src/render/strings.js +60 -0
  101. package/dist/src/render/strings.js.map +1 -0
  102. package/dist/src/render/term-archive.d.ts +5 -5
  103. package/dist/src/render/term-archive.d.ts.map +1 -1
  104. package/dist/src/render/term-archive.js +27 -16
  105. package/dist/src/render/term-archive.js.map +1 -1
  106. package/dist/src/render/widget-areas.d.ts +22 -0
  107. package/dist/src/render/widget-areas.d.ts.map +1 -0
  108. package/dist/src/render/widget-areas.js +29 -0
  109. package/dist/src/render/widget-areas.js.map +1 -0
  110. package/package.json +4 -4
  111. package/src/index.ts +2 -0
  112. package/src/render/blocks/accordion.ts +31 -42
  113. package/src/render/blocks/collection-list.ts +132 -123
  114. package/src/render/blocks/cta.ts +23 -18
  115. package/src/render/blocks/embed.ts +37 -28
  116. package/src/render/blocks/faq.ts +26 -37
  117. package/src/render/blocks/feature-grid.ts +34 -42
  118. package/src/render/blocks/gallery.ts +33 -29
  119. package/src/render/blocks/hero.ts +41 -45
  120. package/src/render/blocks/logo-strip.ts +21 -21
  121. package/src/render/blocks/logos.ts +32 -42
  122. package/src/render/blocks/media-figure.ts +47 -25
  123. package/src/render/blocks/pricing-table.ts +34 -41
  124. package/src/render/blocks/prose.ts +25 -40
  125. package/src/render/blocks/quote.ts +25 -19
  126. package/src/render/blocks/stat-counter.ts +27 -29
  127. package/src/render/blocks/stats.ts +35 -32
  128. package/src/render/blocks/testimonial.ts +18 -19
  129. package/src/render/chrome.ts +170 -83
  130. package/src/render/doc-index.ts +65 -0
  131. package/src/render/doc-page.ts +303 -0
  132. package/src/render/layout.ts +73 -0
  133. package/src/render/render-block.ts +67 -191
  134. package/src/render/rich-text.ts +446 -0
  135. package/src/render/search.ts +41 -0
  136. package/src/render/strings.ts +67 -0
  137. package/src/render/term-archive.ts +62 -38
  138. package/src/render/widget-areas.ts +33 -0
  139. package/src/styles/archive.css +21 -27
  140. package/src/styles/base.css +438 -838
  141. package/src/styles/blocks.css +658 -916
  142. package/src/styles/chrome.css +439 -0
  143. package/src/styles/docs.css +404 -0
  144. package/src/styles/rich.css +337 -0
  145. package/src/styles/theme.css +28 -23
  146. package/src/styles/tokens.css +209 -215
  147. package/src/styles/widgets.css +890 -0
  148. package/tokens.json +15 -15
@@ -1,31 +1,26 @@
1
1
  /*
2
2
  * `@cogenta/theme-docs`'s design system.
3
3
  *
4
- * Contract D fixes a *closed* skin token set — seven colours, five type
5
- * tokens, two spacing tokens, three radii, three motion tokens, two shadows
6
- * — and refuses any skin that adds one. So this layer adds nothing to the
7
- * skin: every value below is *derived* from `--cogenta-*` by composition
8
- * (`calc`, `color-mix`, relative colour syntax). A skin swap rewrites the
9
- * generated `--cogenta-*` sheet and this whole system follows, with no
10
- * build step.
4
+ * The register is first-class technical documentation: dense but calm,
5
+ * navigation first, code treated as the main character of a page. White and
6
+ * a cool grey scale carry the page, text is set in a near-black ink, and one
7
+ * deep petrol teal is kept for links, the page a reader is on, and focus.
8
+ * Structure is drawn with space and hairlines, never with boxes, shadows or
9
+ * decorative shapes.
11
10
  *
12
- * Two rules hold everywhere in this file and the two that import it:
11
+ * Two families from one superfamily. IBM Plex Sans sets everything a reader
12
+ * reads and uses; IBM Plex Mono sets code, file names, keys, commands and
13
+ * the handful of labels a program prints (a version, a date in a changelog).
13
14
  *
14
- * 1. **No colour literal.** Not one hex, `rgb()`, `hsl()` or bare `oklch()`.
15
- * Every colour is either a skin token or a function *of* a skin token.
16
- * 2. **No second scale.** The type steps come from `--cogenta-font-size-*`
17
- * and the spacing multiplier from `--cogenta-space-scale`, both emitted
18
- * by `renderSkin` from the same tokens the validator checked.
15
+ * Contract D fixes a closed skin token set, so nothing here adds a token:
16
+ * every value is derived from a `--cogenta-*` property (`calc`, `color-mix`,
17
+ * relative colour syntax).
19
18
  *
20
- * The default skin (`tokens.json`) is a neutral blue-grey ground with one
21
- * confident blue accent — the Docusaurus/GitBook register the aesthetic
22
- * direction asks for: dense, structured, and legible over long reference
23
- * pages rather than expressive. Light mode is "structured and edged"
24
- * (hairline borders carry most of the depth, shadow reserved for genuine
25
- * hover elevation, exactly the language `theme-entreprise` already proved);
26
- * dark mode is a real slate, designed on its own terms rather than
27
- * mechanically inverted — see the colour section below for the five
28
- * decisions that make it so.
19
+ * Two rules hold in every stylesheet of this theme:
20
+ *
21
+ * 1. No colour literal. Every colour is a skin token or a function of one.
22
+ * 2. No second type scale. Steps come from `--cogenta-font-size-*`; fluid
23
+ * sizes only interpolate between steps of that one ladder.
29
24
  */
30
25
 
31
26
  :where(:root) {
@@ -41,267 +36,266 @@
41
36
  }
42
37
 
43
38
  /* --------------------------------------------------------------------------
44
- Space — a compact scale: a docs page is read a paragraph at a time, and
45
- the aesthetic direction asks for information density over air.
39
+ Space: one unit, one section rhythm, one page width, three reading columns.
46
40
  -------------------------------------------------------------------------- */
47
41
 
48
42
  :where(:root) {
49
- --cg-density: var(--cogenta-space-scale, 1);
50
- --cg-unit: calc(var(--cogenta-space-unit) * var(--cg-density));
51
-
52
- --cg-s1: calc(var(--cg-unit) * 1);
53
- --cg-s2: calc(var(--cg-unit) * 2);
54
- --cg-s3: calc(var(--cg-unit) * 3);
55
- --cg-s4: calc(var(--cg-unit) * 4);
56
- --cg-s5: calc(var(--cg-unit) * 5);
57
- --cg-s6: calc(var(--cg-unit) * 6);
58
- --cg-s8: calc(var(--cg-unit) * 8);
59
- --cg-s10: calc(var(--cg-unit) * 10);
60
- --cg-s12: calc(var(--cg-unit) * 12);
61
- --cg-s16: calc(var(--cg-unit) * 16);
62
- --cg-s20: calc(var(--cg-unit) * 20);
63
- --cg-s28: calc(var(--cg-unit) * 28);
64
-
65
- --cg-gutter: var(--cg-s6);
66
- --cg-gap-tight: var(--cg-s2);
67
- --cg-gap: var(--cg-s5);
68
- --cg-gap-loose: var(--cg-s10);
69
- --cg-section-y: var(--cg-s16);
70
-
71
- --cg-measure: 72ch;
72
- --cg-measure-narrow: 44ch;
73
- --cg-page: 78rem;
74
- --cg-page-narrow: 50rem;
75
- --cg-sidebar-width: 17rem;
76
- --cg-header-height: 3.75rem;
43
+ --cd-density: var(--cogenta-space-scale, 1);
44
+ --cd-unit: calc(var(--cogenta-space-unit) * var(--cd-density));
45
+
46
+ --cd-s1: calc(var(--cd-unit) * 1);
47
+ --cd-s2: calc(var(--cd-unit) * 2);
48
+ --cd-s3: calc(var(--cd-unit) * 3);
49
+ --cd-s4: calc(var(--cd-unit) * 4);
50
+ --cd-s5: calc(var(--cd-unit) * 5);
51
+ --cd-s6: calc(var(--cd-unit) * 6);
52
+ --cd-s8: calc(var(--cd-unit) * 8);
53
+ --cd-s10: calc(var(--cd-unit) * 10);
54
+ --cd-s12: calc(var(--cd-unit) * 12);
55
+ --cd-s16: calc(var(--cd-unit) * 16);
56
+ --cd-s20: calc(var(--cd-unit) * 20);
57
+ --cd-s24: calc(var(--cd-unit) * 24);
58
+
59
+ /* The only vertical rhythm between blocks. Every block is padded by half of
60
+ it above and below, so any two blocks sit one full step apart. Inside an
61
+ article the step is shorter: a documentation page is read continuously. */
62
+ --cd-section: clamp(var(--cd-s12), 7vw, var(--cd-s24));
63
+ --cd-section-doc: var(--cd-s10);
64
+
65
+ /* The home page and every page outside the documentation sit on twelve
66
+ columns. */
67
+ --cd-columns: 12;
68
+ --cd-gutter: clamp(var(--cd-s5), 3vw, var(--cd-s10));
69
+ --cd-col-gap: clamp(var(--cd-s4), 2vw, var(--cd-s8));
70
+ /* One page width for the header, the footer, the home page and a
71
+ documentation page, so every left edge lines up with the wordmark. */
72
+ --cd-page: 90rem;
73
+
74
+ /* A documentation page: navigation, the article, the table of contents.
75
+ The side columns are fixed so the text never moves when the navigation
76
+ changes. Code, notes and reference tables take the whole article;
77
+ running text keeps to the measure. A `ch` is the width of Plex Sans's
78
+ zero, wider than its average letter: 56ch sets about 70 characters to a
79
+ line, measured in Chrome on the real pages. */
80
+ --cd-sidebar: 16rem;
81
+ --cd-toc: 13.5rem;
82
+ --cd-doc-page: var(--cd-page);
83
+ --cd-article: 46rem;
84
+ --cd-measure: 56ch;
85
+ --cd-header-height: 3.75rem;
77
86
  }
78
87
 
79
88
  :where([data-density="compact"]) {
80
- --cg-density: 0.85;
89
+ --cd-density: 0.85;
81
90
  }
82
91
 
83
92
  :where([data-density="comfortable"]) {
84
- --cg-density: 1;
93
+ --cd-density: 1;
85
94
  }
86
95
 
87
96
  :where([data-density="spacious"]) {
88
- --cg-density: 1.25;
97
+ --cd-density: 1.2;
89
98
  }
90
99
 
91
100
  /* --------------------------------------------------------------------------
92
- Type — the skin's scale, named; plus the rhythm the scale does not carry.
101
+ Type: Plex Sans to read, Plex Mono for what a machine prints.
93
102
  -------------------------------------------------------------------------- */
94
103
 
95
104
  :where(:root) {
96
- --cg-text-xs: var(--cogenta-font-size-xs, 0.72rem);
97
- --cg-text-sm: var(--cogenta-font-size-sm, 0.85rem);
98
- --cg-text-md: var(--cogenta-font-size-md, var(--cogenta-font-base-size, 1rem));
99
- --cg-text-lg: var(--cogenta-font-size-lg, 1.15rem);
100
- --cg-text-xl: var(--cogenta-font-size-xl, 1.32rem);
101
- --cg-text-2xl: var(--cogenta-font-size-2xl, 1.52rem);
102
- --cg-text-3xl: var(--cogenta-font-size-3xl, 1.75rem);
103
-
104
- --cg-leading-tight: 1.15;
105
- --cg-leading-snug: 1.3;
106
- --cg-leading-normal: 1.6;
107
- --cg-leading-relaxed: 1.75;
108
-
109
- --cg-tracking-tight: -0.012em;
110
- --cg-tracking-snug: -0.006em;
111
- --cg-tracking-normal: 0em;
112
- --cg-tracking-wide: 0.08em;
113
-
114
- --cg-weight-regular: 400;
115
- --cg-weight-medium: 500;
116
- --cg-weight-semibold: 600;
117
- --cg-weight-bold: 700;
105
+ --cd-font-sans: var(--cogenta-font-sans);
106
+ --cd-font-mono: var(--cogenta-font-mono);
107
+
108
+ --cd-text-xs: var(--cogenta-font-size-xs, 0.69rem);
109
+ --cd-text-sm: var(--cogenta-font-size-sm, 0.83rem);
110
+ --cd-text-md: var(--cogenta-font-size-md, var(--cogenta-font-base-size, 1rem));
111
+ --cd-text-lg: var(--cogenta-font-size-lg, 1.2rem);
112
+ --cd-text-xl: var(--cogenta-font-size-xl, 1.44rem);
113
+ --cd-text-2xl: var(--cogenta-font-size-2xl, 1.73rem);
114
+ --cd-text-3xl: var(--cogenta-font-size-3xl, 2.07rem);
115
+ /* The same ladder, continued upward by the skin's own ratio. */
116
+ --cd-text-4xl: calc(var(--cd-text-3xl) * var(--cogenta-font-scale, 1.2));
117
+ --cd-text-5xl: calc(var(--cd-text-4xl) * var(--cogenta-font-scale, 1.2));
118
+
119
+ /* Interface text: navigation, labels, table cells. A quarter step under
120
+ the body size, the size an editor or a terminal uses. */
121
+ --cd-text-ui: calc((var(--cd-text-sm) + var(--cd-text-md) * 3) / 4);
122
+ --cd-text-label: calc((var(--cd-text-sm) * 3 + var(--cd-text-md)) / 4);
123
+ /* Code: Plex Mono sets wide, so it runs a step under the text around it. */
124
+ --cd-text-code: calc((var(--cd-text-sm) + var(--cd-text-md)) / 2);
125
+
126
+ --cd-size-display: clamp(var(--cd-text-3xl), calc(1rem + 3.2vw), var(--cd-text-5xl));
127
+ --cd-size-title: clamp(var(--cd-text-2xl), calc(1rem + 1.9vw), var(--cd-text-4xl));
128
+ --cd-size-section: clamp(var(--cd-text-xl), calc(0.95rem + 1.1vw), var(--cd-text-3xl));
129
+ --cd-size-h2: clamp(var(--cd-text-lg), calc(0.95rem + 0.6vw), var(--cd-text-2xl));
130
+ --cd-size-h3: var(--cd-text-lg);
131
+ --cd-size-lead: clamp(var(--cd-text-md), calc(0.9rem + 0.35vw), var(--cd-text-lg));
132
+ --cd-size-figure: clamp(var(--cd-text-2xl), calc(0.95rem + 1.6vw), var(--cd-text-4xl));
133
+ --cd-size-quote: clamp(var(--cd-text-lg), calc(0.95rem + 0.8vw), var(--cd-text-2xl));
134
+
135
+ --cd-leading-display: 1.08;
136
+ --cd-leading-heading: 1.22;
137
+ --cd-leading-lead: 1.55;
138
+ --cd-leading-text: 1.72;
139
+ --cd-leading-code: 1.7;
140
+ --cd-leading-ui: 1.45;
141
+
142
+ --cd-tracking-display: -0.024em;
143
+ --cd-tracking-heading: -0.012em;
144
+
145
+ --cd-weight-regular: 400;
146
+ --cd-weight-medium: 500;
147
+ --cd-weight-semibold: 600;
118
148
  }
119
149
 
120
150
  /* --------------------------------------------------------------------------
121
- Radius — restrained, closer to square than round: a reference site reads
122
- as a tool, not a marketing page.
151
+ Shape and motion: a hair of softening on controls and code, motion is a
152
+ colour or an underline.
123
153
  -------------------------------------------------------------------------- */
124
154
 
125
155
  :where(:root) {
126
- --cg-radius-xs: calc(var(--cogenta-radius-sm) / 2);
127
- --cg-radius-sm: var(--cogenta-radius-sm);
128
- --cg-radius-md: var(--cogenta-radius-md);
129
- --cg-radius-lg: var(--cogenta-radius-lg);
130
- --cg-radius-xl: calc(var(--cogenta-radius-lg) * 1.4);
131
- --cg-radius-pill: 999rem;
132
- }
156
+ --cd-radius-control: var(--cogenta-radius-md);
157
+ --cd-radius-frame: var(--cogenta-radius-lg);
158
+ --cd-radius-inline: var(--cogenta-radius-sm);
133
159
 
134
- /* --------------------------------------------------------------------------
135
- Motion
136
- -------------------------------------------------------------------------- */
160
+ --cd-duration: min(var(--cogenta-motion-duration), 150ms);
161
+ --cd-ease: var(--cogenta-motion-easing);
137
162
 
138
- :where(:root) {
139
- --cg-duration-fast: calc(var(--cogenta-motion-duration) * 0.65);
140
- --cg-duration: var(--cogenta-motion-duration);
141
- --cg-duration-slow: calc(var(--cogenta-motion-duration) * 3);
142
- --cg-ease: var(--cogenta-motion-easing);
163
+ --cd-rule: 1px;
164
+ --cd-rule-strong: 2px;
143
165
  }
144
166
 
145
167
  /* --------------------------------------------------------------------------
146
- Colour — one palette per scheme, both derived from the same seven tokens.
168
+ Colour: white, a cool grey scale, near-black ink, one petrol teal.
147
169
  --------------------------------------------------------------------------
148
170
 
149
- The block below declares the **light** palette in plain terms; the
150
- scheme-aware values live in the `@supports` block after it, guarded the
151
- same way `theme-canonical`/`theme-entreprise` guard it: a browser that
152
- cannot parse `light-dark()` must still get a usable light palette rather
153
- than an `unset` custom property.
154
-
155
- **This dark palette is designed on its own terms, not inverted — five
156
- decisions, each the opposite of what a mechanical `bg`/`fg` swap would
157
- produce (the same five `theme-entreprise` already proved, re-derived here
158
- from a blue accent instead of a green one):**
159
-
160
- 1. *Elevation is a hairline, almost everywhere.* A raised surface is a
161
- **border**, shadow reserved for genuine hover lift — a code block or a
162
- sidebar panel looks like a plate on a desk, never a sticker.
163
- 2. *The accent is lifted less than a mechanical swap would allow, and
164
- **desaturated** rather than just brightened* — a saturated blue pushed
165
- to the same lightness a mechanical fix would pick reads as neon on
166
- slate; this palette lifts it and pulls a third of its chroma back.
167
- 3. *The accent's foreground flips to ink* — light text on a lifted accent
168
- fails contrast, so `accent-fg` is derived dark from the accent's own
169
- hue rather than kept as the skin's white.
170
- 4. *Text is never pure light and never fully desaturated* — ink carries a
171
- trace of the accent's hue at low chroma, a blue-tinted slate rather
172
- than a generic dark-mode grey.
173
- 5. *A border lightens rather than darkens against its surface* — a darker
174
- line on dark ink is invisible.
175
-
176
- Known limit, same one `theme-canonical`/`theme-entreprise` record: the
177
- derivation assumes a light-first skin (`bg` lighter than `fg`).
171
+ The first block declares the light palette plainly; the scheme-aware
172
+ values follow behind a feature query, so a browser that cannot parse
173
+ `light-dark()` still gets a complete light palette.
174
+
175
+ The teal (the skin's accent) is for four things only: a link in running
176
+ text, the page the reader is on in the navigation, the rule of a note, and
177
+ the focus ring. It is never a band, a card, a heading or a button fill
178
+ larger than a control.
179
+
180
+ Code has its own quiet ground: a step off the page in light, a step above
181
+ it in dark, always inside a hairline, so a long example reads as one
182
+ object without shouting.
183
+
184
+ The dark palette is designed for reading code at night, not inverted:
185
+
186
+ 1. The ground is a cool near-black taken from the ink's own hue, and depth
187
+ is a lightness step up: canvas, code ground, raised panel.
188
+ 2. Hairlines are a step up from the ground, visible without glowing.
189
+ 3. Text is a soft white, a step below pure white, so long code does not
190
+ vibrate; secondary text and code comments keep AA.
191
+ 4. The teal is lifted to a pale sea green that holds against the dark
192
+ ground, keeping its hue.
193
+ 5. Diagrams and screenshots (light images) are dimmed a little with a
194
+ brightness step, so a white figure does not glare on a dark page.
195
+
196
+ Every ratio is computed from this file by `test/design-system.test.ts`,
197
+ in both schemes.
178
198
  -------------------------------------------------------------------------- */
179
199
 
180
200
  :where(:root) {
181
- --cg-canvas: var(--cogenta-color-bg);
182
- --cg-surface: var(--cogenta-color-bg);
183
- --cg-surface-raised: var(--cogenta-color-bg);
184
- --cg-surface-sunken: var(--cogenta-color-muted);
185
- --cg-surface-tinted: color-mix(in oklab, var(--cogenta-color-accent) 7%, var(--cogenta-color-bg));
186
-
187
- --cg-ink: var(--cogenta-color-fg);
188
- --cg-ink-muted: var(--cogenta-color-muted-fg);
189
- --cg-ink-subtle: color-mix(in oklab, var(--cogenta-color-muted-fg) 85%, var(--cogenta-color-bg));
190
-
191
- --cg-accent: var(--cogenta-color-accent);
192
- --cg-accent-fg: var(--cogenta-color-accent-fg);
193
- --cg-accent-hover: color-mix(in oklab, var(--cogenta-color-accent) 84%, var(--cogenta-color-fg));
194
- --cg-accent-soft: color-mix(in oklab, var(--cogenta-color-accent) 9%, var(--cogenta-color-bg));
195
- --cg-accent-soft-fg: color-mix(
196
- in oklab,
197
- var(--cogenta-color-accent) 70%,
198
- var(--cogenta-color-fg)
199
- );
200
-
201
- --cg-line: var(--cogenta-color-border);
202
- --cg-line-soft: color-mix(in oklab, var(--cogenta-color-border) 50%, var(--cogenta-color-bg));
203
- --cg-line-strong: color-mix(in oklab, var(--cogenta-color-border) 60%, var(--cogenta-color-fg));
204
-
205
- --cg-scrim: color-mix(in oklab, var(--cogenta-color-fg) 58%, transparent);
201
+ --cd-canvas: var(--cogenta-color-bg);
202
+ --cd-surface: color-mix(in oklab, var(--cogenta-color-muted) 55%, var(--cogenta-color-bg));
203
+ --cd-raised: var(--cogenta-color-muted);
204
+ --cd-code-ground: color-mix(in oklab, var(--cogenta-color-muted) 70%, var(--cogenta-color-bg));
205
+
206
+ --cd-ink: var(--cogenta-color-fg);
207
+ --cd-ink-muted: var(--cogenta-color-muted-fg);
208
+ --cd-ink-soft: color-mix(in oklab, var(--cogenta-color-fg) 70%, var(--cogenta-color-muted-fg));
209
+
210
+ --cd-accent: var(--cogenta-color-accent);
211
+ --cd-accent-fg: var(--cogenta-color-accent-fg);
212
+ --cd-accent-hover: color-mix(in oklab, var(--cogenta-color-accent) 80%, var(--cogenta-color-fg));
213
+ --cd-link: var(--cogenta-color-accent);
214
+
215
+ --cd-line: var(--cogenta-color-border);
216
+ --cd-line-strong: color-mix(in oklab, var(--cogenta-color-border) 58%, var(--cogenta-color-fg));
217
+ --cd-line-ink: var(--cogenta-color-fg);
218
+
219
+ --cd-footer: color-mix(in oklab, var(--cogenta-color-muted) 55%, var(--cogenta-color-bg));
220
+
221
+ --cd-image-brightness: 1;
206
222
  }
207
223
 
208
224
  @supports (color: light-dark(currentColor, currentColor)) and
209
225
  (color: oklch(from currentColor l c h)) {
210
226
  :where(:root) {
211
- --cg-canvas: light-dark(
227
+ --cd-canvas: light-dark(
212
228
  var(--cogenta-color-bg),
213
- oklch(from var(--cogenta-color-fg) 0.155 calc(c * 0.65) h)
229
+ oklch(from var(--cogenta-color-fg) 0.175 calc(c * 0.9) h)
214
230
  );
215
- --cg-surface: light-dark(
216
- var(--cogenta-color-bg),
217
- oklch(from var(--cogenta-color-fg) 0.155 calc(c * 0.65) h)
218
- );
219
- --cg-surface-raised: light-dark(
220
- var(--cogenta-color-bg),
221
- oklch(from var(--cogenta-color-fg) 0.225 calc(c * 0.6) h)
231
+ --cd-surface: light-dark(
232
+ color-mix(in oklab, var(--cogenta-color-muted) 55%, var(--cogenta-color-bg)),
233
+ oklch(from var(--cogenta-color-fg) 0.2 calc(c * 0.9) h)
222
234
  );
223
- --cg-surface-sunken: light-dark(
235
+ --cd-raised: light-dark(
224
236
  var(--cogenta-color-muted),
225
- oklch(from var(--cogenta-color-fg) 0.115 calc(c * 0.75) h)
237
+ oklch(from var(--cogenta-color-fg) 0.235 calc(c * 0.9) h)
226
238
  );
227
- --cg-surface-tinted: light-dark(
228
- color-mix(in oklab, var(--cogenta-color-accent) 7%, var(--cogenta-color-bg)),
229
- oklch(from var(--cogenta-color-accent) 0.235 calc(c * 0.55) h)
239
+ --cd-code-ground: light-dark(
240
+ color-mix(in oklab, var(--cogenta-color-muted) 70%, var(--cogenta-color-bg)),
241
+ oklch(from var(--cogenta-color-fg) 0.205 calc(c * 0.9) h)
230
242
  );
231
243
 
232
- --cg-ink: light-dark(
233
- var(--cogenta-color-fg),
234
- oklch(from var(--cogenta-color-accent) 0.93 0.01 h)
235
- );
236
- --cg-ink-muted: light-dark(
244
+ --cd-ink: light-dark(var(--cogenta-color-fg), oklch(from var(--cogenta-color-bg) 0.925 c h));
245
+ --cd-ink-muted: light-dark(
237
246
  var(--cogenta-color-muted-fg),
238
- oklch(from var(--cogenta-color-accent) 0.76 0.016 h)
247
+ oklch(from var(--cogenta-color-muted-fg) 0.76 c h)
239
248
  );
240
- --cg-ink-subtle: light-dark(
241
- color-mix(in oklab, var(--cogenta-color-muted-fg) 85%, var(--cogenta-color-bg)),
242
- oklch(from var(--cogenta-color-accent) 0.63 0.014 h)
249
+ --cd-ink-soft: light-dark(
250
+ color-mix(in oklab, var(--cogenta-color-fg) 70%, var(--cogenta-color-muted-fg)),
251
+ oklch(from var(--cogenta-color-muted-fg) 0.85 c h)
243
252
  );
244
253
 
245
- --cg-accent: light-dark(
254
+ --cd-accent: light-dark(
246
255
  var(--cogenta-color-accent),
247
- oklch(from var(--cogenta-color-accent) 0.68 calc(c * 0.72) h)
256
+ oklch(from var(--cogenta-color-accent) 0.8 calc(c * 0.85) h)
248
257
  );
249
- --cg-accent-fg: light-dark(
258
+ --cd-accent-fg: light-dark(
250
259
  var(--cogenta-color-accent-fg),
251
- oklch(from var(--cogenta-color-accent) 0.16 calc(c * 0.5) h)
260
+ oklch(from var(--cogenta-color-fg) 0.175 calc(c * 0.9) h)
252
261
  );
253
- --cg-accent-hover: light-dark(
254
- color-mix(in oklab, var(--cogenta-color-accent) 84%, var(--cogenta-color-fg)),
255
- oklch(from var(--cogenta-color-accent) 0.77 calc(c * 0.68) h)
262
+ --cd-accent-hover: light-dark(
263
+ color-mix(in oklab, var(--cogenta-color-accent) 80%, var(--cogenta-color-fg)),
264
+ oklch(from var(--cogenta-color-accent) 0.87 calc(c * 0.7) h)
256
265
  );
257
- --cg-accent-soft: light-dark(
258
- color-mix(in oklab, var(--cogenta-color-accent) 9%, var(--cogenta-color-bg)),
259
- oklch(from var(--cogenta-color-accent) 0.28 calc(c * 0.45) h)
260
- );
261
- --cg-accent-soft-fg: light-dark(
262
- color-mix(in oklab, var(--cogenta-color-accent) 70%, var(--cogenta-color-fg)),
263
- oklch(from var(--cogenta-color-accent) 0.87 calc(c * 0.4) h)
266
+ --cd-link: light-dark(
267
+ var(--cogenta-color-accent),
268
+ oklch(from var(--cogenta-color-accent) 0.8 calc(c * 0.85) h)
264
269
  );
265
270
 
266
- --cg-line: light-dark(
271
+ --cd-line: light-dark(
267
272
  var(--cogenta-color-border),
268
- oklch(from var(--cogenta-color-accent) 0.34 calc(c * 0.2) h)
273
+ oklch(from var(--cogenta-color-fg) 0.3 calc(c * 0.9) h)
269
274
  );
270
- --cg-line-soft: light-dark(
271
- color-mix(in oklab, var(--cogenta-color-border) 50%, var(--cogenta-color-bg)),
272
- oklch(from var(--cogenta-color-accent) 0.27 calc(c * 0.18) h)
275
+ --cd-line-strong: light-dark(
276
+ color-mix(in oklab, var(--cogenta-color-border) 58%, var(--cogenta-color-fg)),
277
+ oklch(from var(--cogenta-color-fg) 0.44 calc(c * 0.9) h)
273
278
  );
274
- --cg-line-strong: light-dark(
275
- color-mix(in oklab, var(--cogenta-color-border) 60%, var(--cogenta-color-fg)),
276
- oklch(from var(--cogenta-color-accent) 0.55 calc(c * 0.22) h)
279
+ --cd-line-ink: light-dark(
280
+ var(--cogenta-color-fg),
281
+ oklch(from var(--cogenta-color-bg) 0.925 c h)
277
282
  );
278
- }
279
- }
280
283
 
281
- /* --------------------------------------------------------------------------
282
- Elevation — a hairline ring by default in both schemes; a real shadow is
283
- spent only on hover.
284
- -------------------------------------------------------------------------- */
285
-
286
- :where(:root) {
287
- --cg-ring: inset 0 0 0 1px var(--cg-line);
288
- --cg-ring-accent: inset 0 0 0 1px var(--cg-accent);
289
- --cg-ring-strong: inset 0 0 0 1px var(--cg-line-strong);
290
-
291
- --cg-elevation-0: none;
292
- --cg-elevation-1: var(--cg-ring);
293
- --cg-elevation-2: var(--cogenta-shadow-sm), var(--cg-ring);
294
- --cg-elevation-3: var(--cogenta-shadow-md), var(--cg-ring);
284
+ --cd-footer: light-dark(
285
+ color-mix(in oklab, var(--cogenta-color-muted) 55%, var(--cogenta-color-bg)),
286
+ oklch(from var(--cogenta-color-fg) 0.155 calc(c * 0.9) h)
287
+ );
288
+ }
295
289
  }
296
290
 
291
+ /* A light figure on the dark ground is dimmed a little, so a white diagram
292
+ does not glare. A brightness step, never a blur. */
297
293
  @media (prefers-color-scheme: dark) {
298
294
  :where(:root:not([data-theme="light"])) {
299
- --cg-elevation-2: var(--cg-ring-strong);
300
- --cg-elevation-3: var(--cg-ring-strong), var(--cogenta-shadow-md);
295
+ --cd-image-brightness: 0.88;
301
296
  }
302
297
  }
303
298
 
304
299
  :where(:root[data-theme="dark"]) {
305
- --cg-elevation-2: var(--cg-ring-strong);
306
- --cg-elevation-3: var(--cg-ring-strong), var(--cogenta-shadow-md);
300
+ --cd-image-brightness: 0.88;
307
301
  }