@cogenta/theme-magazine 1.1.2 → 1.3.3

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 (126) hide show
  1. package/dist/src/index.d.ts +3 -0
  2. package/dist/src/index.d.ts.map +1 -1
  3. package/dist/src/index.js +3 -0
  4. package/dist/src/index.js.map +1 -1
  5. package/dist/src/render/article.d.ts +32 -0
  6. package/dist/src/render/article.d.ts.map +1 -0
  7. package/dist/src/render/article.js +137 -0
  8. package/dist/src/render/article.js.map +1 -0
  9. package/dist/src/render/blocks/accordion.d.ts.map +1 -1
  10. package/dist/src/render/blocks/accordion.js +9 -13
  11. package/dist/src/render/blocks/accordion.js.map +1 -1
  12. package/dist/src/render/blocks/collection-list.d.ts.map +1 -1
  13. package/dist/src/render/blocks/collection-list.js +91 -118
  14. package/dist/src/render/blocks/collection-list.js.map +1 -1
  15. package/dist/src/render/blocks/cta.d.ts +4 -4
  16. package/dist/src/render/blocks/cta.d.ts.map +1 -1
  17. package/dist/src/render/blocks/cta.js +7 -9
  18. package/dist/src/render/blocks/cta.js.map +1 -1
  19. package/dist/src/render/blocks/embed.d.ts.map +1 -1
  20. package/dist/src/render/blocks/embed.js +17 -20
  21. package/dist/src/render/blocks/embed.js.map +1 -1
  22. package/dist/src/render/blocks/faq.d.ts.map +1 -1
  23. package/dist/src/render/blocks/faq.js +12 -11
  24. package/dist/src/render/blocks/faq.js.map +1 -1
  25. package/dist/src/render/blocks/feature-grid.d.ts.map +1 -1
  26. package/dist/src/render/blocks/feature-grid.js +13 -20
  27. package/dist/src/render/blocks/feature-grid.js.map +1 -1
  28. package/dist/src/render/blocks/gallery.d.ts +6 -6
  29. package/dist/src/render/blocks/gallery.d.ts.map +1 -1
  30. package/dist/src/render/blocks/gallery.js +15 -13
  31. package/dist/src/render/blocks/gallery.js.map +1 -1
  32. package/dist/src/render/blocks/hero.d.ts +6 -5
  33. package/dist/src/render/blocks/hero.d.ts.map +1 -1
  34. package/dist/src/render/blocks/hero.js +15 -14
  35. package/dist/src/render/blocks/hero.js.map +1 -1
  36. package/dist/src/render/blocks/logo-strip.d.ts.map +1 -1
  37. package/dist/src/render/blocks/logo-strip.js +8 -11
  38. package/dist/src/render/blocks/logo-strip.js.map +1 -1
  39. package/dist/src/render/blocks/logos.d.ts.map +1 -1
  40. package/dist/src/render/blocks/logos.js +16 -16
  41. package/dist/src/render/blocks/logos.js.map +1 -1
  42. package/dist/src/render/blocks/media-figure.d.ts +8 -8
  43. package/dist/src/render/blocks/media-figure.d.ts.map +1 -1
  44. package/dist/src/render/blocks/media-figure.js +23 -19
  45. package/dist/src/render/blocks/media-figure.js.map +1 -1
  46. package/dist/src/render/blocks/pricing-table.d.ts.map +1 -1
  47. package/dist/src/render/blocks/pricing-table.js +19 -22
  48. package/dist/src/render/blocks/pricing-table.js.map +1 -1
  49. package/dist/src/render/blocks/prose.d.ts +6 -10
  50. package/dist/src/render/blocks/prose.d.ts.map +1 -1
  51. package/dist/src/render/blocks/prose.js +8 -11
  52. package/dist/src/render/blocks/prose.js.map +1 -1
  53. package/dist/src/render/blocks/quote.d.ts +6 -9
  54. package/dist/src/render/blocks/quote.d.ts.map +1 -1
  55. package/dist/src/render/blocks/quote.js +11 -13
  56. package/dist/src/render/blocks/quote.js.map +1 -1
  57. package/dist/src/render/blocks/stat-counter.d.ts.map +1 -1
  58. package/dist/src/render/blocks/stat-counter.js +9 -10
  59. package/dist/src/render/blocks/stat-counter.js.map +1 -1
  60. package/dist/src/render/blocks/stats.d.ts.map +1 -1
  61. package/dist/src/render/blocks/stats.js +9 -12
  62. package/dist/src/render/blocks/stats.js.map +1 -1
  63. package/dist/src/render/blocks/testimonial.d.ts +4 -13
  64. package/dist/src/render/blocks/testimonial.d.ts.map +1 -1
  65. package/dist/src/render/blocks/testimonial.js +7 -15
  66. package/dist/src/render/blocks/testimonial.js.map +1 -1
  67. package/dist/src/render/chrome.d.ts.map +1 -1
  68. package/dist/src/render/chrome.js +109 -97
  69. package/dist/src/render/chrome.js.map +1 -1
  70. package/dist/src/render/layout.d.ts +28 -0
  71. package/dist/src/render/layout.d.ts.map +1 -0
  72. package/dist/src/render/layout.js +72 -0
  73. package/dist/src/render/layout.js.map +1 -0
  74. package/dist/src/render/render-block.d.ts +15 -13
  75. package/dist/src/render/render-block.d.ts.map +1 -1
  76. package/dist/src/render/render-block.js +53 -29
  77. package/dist/src/render/render-block.js.map +1 -1
  78. package/dist/src/render/story.d.ts +41 -0
  79. package/dist/src/render/story.d.ts.map +1 -0
  80. package/dist/src/render/story.js +65 -0
  81. package/dist/src/render/story.js.map +1 -0
  82. package/dist/src/render/term-archive.d.ts +0 -10
  83. package/dist/src/render/term-archive.d.ts.map +1 -1
  84. package/dist/src/render/term-archive.js +42 -19
  85. package/dist/src/render/term-archive.js.map +1 -1
  86. package/dist/src/render/widget-areas.d.ts +12 -0
  87. package/dist/src/render/widget-areas.d.ts.map +1 -0
  88. package/dist/src/render/widget-areas.js +19 -0
  89. package/dist/src/render/widget-areas.js.map +1 -0
  90. package/dist/theme.config.js +2 -2
  91. package/dist/theme.config.js.map +1 -1
  92. package/package.json +5 -5
  93. package/src/index.ts +3 -0
  94. package/src/render/article.ts +239 -0
  95. package/src/render/blocks/accordion.ts +23 -30
  96. package/src/render/blocks/collection-list.ts +161 -225
  97. package/src/render/blocks/cta.ts +19 -13
  98. package/src/render/blocks/embed.ts +40 -36
  99. package/src/render/blocks/faq.ts +31 -36
  100. package/src/render/blocks/feature-grid.ts +26 -36
  101. package/src/render/blocks/gallery.ts +24 -18
  102. package/src/render/blocks/hero.ts +32 -32
  103. package/src/render/blocks/logo-strip.ts +17 -17
  104. package/src/render/blocks/logos.ts +23 -31
  105. package/src/render/blocks/media-figure.ts +36 -20
  106. package/src/render/blocks/pricing-table.ts +29 -34
  107. package/src/render/blocks/prose.ts +13 -13
  108. package/src/render/blocks/quote.ts +24 -24
  109. package/src/render/blocks/stat-counter.ts +16 -24
  110. package/src/render/blocks/stats.ts +14 -24
  111. package/src/render/blocks/testimonial.ts +12 -17
  112. package/src/render/chrome.ts +123 -104
  113. package/src/render/layout.ts +105 -0
  114. package/src/render/render-block.ts +61 -33
  115. package/src/render/story.ts +139 -0
  116. package/src/render/term-archive.ts +111 -58
  117. package/src/render/widget-areas.ts +22 -0
  118. package/src/styles/archive.css +114 -17
  119. package/src/styles/article.css +237 -0
  120. package/src/styles/base.css +848 -591
  121. package/src/styles/blocks.css +903 -921
  122. package/src/styles/stories.css +593 -0
  123. package/src/styles/theme.css +28 -9
  124. package/src/styles/tokens.css +200 -185
  125. package/src/styles/widgets.css +614 -0
  126. package/tokens.json +18 -18
@@ -1,39 +1,32 @@
1
1
  /*
2
- * The magazine theme's design system.
2
+ * `@cogenta/theme-magazine`'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. Nothing below adds to that set:
7
- * every value here is *derived* from `--cogenta-*` by composition (`calc`,
8
- * `color-mix`, relative colour syntax), so a skin swap rewrites the
9
- * generated `--cogenta-*` sheet and this whole system follows with no build
10
- * step.
4
+ * The register is a serious daily of quality: white newsprint, black ink, one
5
+ * editorial red kept for section kickers and a few rules, and structure drawn
6
+ * with rules and space, never with boxes or shadows. Fraunces sets the
7
+ * nameplate and every headline at the optical size drawn for its point size,
8
+ * Source Serif 4 sets the text a reader reads, and Libre Franklin sets what a
9
+ * reader scans: kickers, bylines, dates, navigation, captions.
11
10
  *
12
- * Two rules hold everywhere in this file and the two that import it:
11
+ * Contract D fixes a closed skin token set, so nothing here adds a token:
12
+ * every value is derived from a `--cogenta-*` property (`calc`, `color-mix`,
13
+ * relative colour syntax). The skin names the display face (`serif`) and the
14
+ * interface face (`sans`); the text face is this theme's own choice, set in
15
+ * front of the skin's serif stack so a skin that changes the display face
16
+ * never leaves the reading column without a text face.
13
17
  *
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
- * `test/isolation.test.ts` enforces this on the source.
17
- * 2. **No second scale.** The type steps come from `--cogenta-font-size-*`
18
- * and the spacing multiplier from `--cogenta-space-scale`, both emitted
19
- * by `renderSkin` from the same tokens the validator checked.
18
+ * Two rules hold in every stylesheet of this theme:
20
19
  *
21
- * The two Google Fonts loaded below are the one deliberate exception to "no
22
- * external dependency": `fonts.googleapis.com` is the one host every
23
- * Cogenta theme is allowed to reach for a stylesheet, and both faces carry a
24
- * full system fallback stack in `tokens.json` — a browser that cannot reach
25
- * Google Fonts (or a site that strips the `@import` for a stricter CSP)
26
- * still gets Georgia/system-ui, never an unstyled page.
20
+ * 1. No colour literal. Every colour is a skin token or a function of one.
21
+ * 2. No second scale. Type steps come from `--cogenta-font-size-*`; the
22
+ * display steps above `3xl` continue the same ratio, and fluid sizes only
23
+ * interpolate between steps of that one ladder.
27
24
  */
28
25
 
29
- @import url("https://fonts.googleapis.com/css2?family=Fraunces:ital,opsz,wght@0,9..144,400;0,9..144,500;0,9..144,600;0,9..144,700;0,9..144,900;1,9..144,500;1,9..144,600&family=Public+Sans:wght@400;500;600;700&display=swap");
30
-
31
26
  :where(:root) {
32
27
  color-scheme: light dark;
33
28
  }
34
29
 
35
- /* An explicit choice wins over the OS preference. No script ships with this
36
- theme to set it; the attribute is the hook a site (or the admin) can flip. */
37
30
  :where(:root[data-theme="dark"]) {
38
31
  color-scheme: dark;
39
32
  }
@@ -43,7 +36,7 @@
43
36
  }
44
37
 
45
38
  /* --------------------------------------------------------------------------
46
- Space — one multiplier, one unit, a scale of multiples
39
+ Space: one unit, one section rhythm, one twelve-column grid.
47
40
  -------------------------------------------------------------------------- */
48
41
 
49
42
  :where(:root) {
@@ -63,17 +56,30 @@
63
56
  --cg-s20: calc(var(--cg-unit) * 20);
64
57
  --cg-s24: calc(var(--cg-unit) * 24);
65
58
 
66
- --cg-gutter: var(--cg-s5);
67
- --cg-gap-tight: var(--cg-s2);
68
- --cg-gap: var(--cg-s4);
69
- --cg-gap-loose: var(--cg-s8);
70
- --cg-section-y: var(--cg-s16);
71
- --cg-rule-gap: var(--cg-s6);
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, whatever
61
+ their order. A newspaper is denser than a book: the step is short. */
62
+ --cg-section: clamp(var(--cg-s10), 5.5vw, var(--cg-s16));
63
+
64
+ /* Twelve columns with constant gutters. A column rule sits in the middle
65
+ of a gutter, never against the text. */
66
+ --cg-columns: 12;
67
+ --cg-gutter: clamp(var(--cg-s4), 3.2vw, var(--cg-s10));
68
+ --cg-col-gap: clamp(var(--cg-s5), 2.2vw, var(--cg-s8));
69
+ --cg-page: 80rem;
72
70
 
73
71
  --cg-measure: 66ch;
74
- --cg-measure-narrow: 46ch;
75
- --cg-page: 76rem;
76
- --cg-page-narrow: 48rem;
72
+ --cg-measure-short: 48ch;
73
+
74
+ /* Where text sits on the twelve columns of a wide screen. The reading
75
+ column is centred (columns 4 to 9): a page that reads down one column
76
+ should not leave a third of the screen empty on one side only. A
77
+ headline reaches one column further right, a pull quote hangs one column
78
+ further left, and a wide figure takes columns 2 to 11. */
79
+ --cg-col-reading: 4 / span 6;
80
+ --cg-col-headline: 4 / span 7;
81
+ --cg-col-hang: 3 / span 6;
82
+ --cg-col-wide: 2 / span 10;
77
83
  }
78
84
 
79
85
  :where([data-density="compact"]) {
@@ -89,220 +95,229 @@
89
95
  }
90
96
 
91
97
  /* --------------------------------------------------------------------------
92
- Type — the skin's scale, named; the editorial rhythm the scale does not
93
- carry. Two families: a characterful display serif for headlines and pull
94
- quotes, a quiet sans for running text, bylines and dates — the split the
95
- masthead itself uses on the front page.
98
+ Type: Fraunces to announce, Source Serif 4 to read, Libre Franklin to scan.
96
99
  -------------------------------------------------------------------------- */
97
100
 
98
101
  :where(:root) {
99
- --cg-text-xs: var(--cogenta-font-size-xs, 0.64rem);
100
- --cg-text-sm: var(--cogenta-font-size-sm, 0.8rem);
101
- --cg-text-md: var(--cogenta-font-size-md, var(--cogenta-font-base-size, 1rem));
102
- --cg-text-lg: var(--cogenta-font-size-lg, 1.25rem);
103
- --cg-text-xl: var(--cogenta-font-size-xl, 1.5625rem);
104
- --cg-text-2xl: var(--cogenta-font-size-2xl, 1.9531rem);
105
- --cg-text-3xl: var(--cogenta-font-size-3xl, 2.4414rem);
106
-
107
- --cg-leading-tight: 1.02;
108
- --cg-leading-snug: 1.22;
109
- --cg-leading-normal: 1.5;
110
- --cg-leading-relaxed: 1.72;
111
-
112
- /* Display serif reads best tightened; the sans used for metadata reads
113
- best opened up into small-caps-style spacing. */
114
- --cg-tracking-tight: -0.018em;
115
- --cg-tracking-snug: -0.008em;
116
- --cg-tracking-normal: 0em;
117
- --cg-tracking-wide: 0.09em;
118
- --cg-tracking-wider: 0.14em;
102
+ --cg-font-display: var(--cogenta-font-serif);
103
+ --cg-font-text: "Source Serif 4", var(--cogenta-font-serif);
104
+ --cg-font-ui: var(--cogenta-font-sans);
105
+ --cg-font-code: var(--cogenta-font-mono);
106
+
107
+ --cg-text-xs: var(--cogenta-font-size-xs, 0.68rem);
108
+ --cg-text-sm: var(--cogenta-font-size-sm, 0.85rem);
109
+ --cg-text-md: var(--cogenta-font-size-md, var(--cogenta-font-base-size, 1.0625rem));
110
+ --cg-text-lg: var(--cogenta-font-size-lg, 1.33rem);
111
+ --cg-text-xl: var(--cogenta-font-size-xl, 1.66rem);
112
+ --cg-text-2xl: var(--cogenta-font-size-2xl, 2.08rem);
113
+ --cg-text-3xl: var(--cogenta-font-size-3xl, 2.59rem);
114
+ /* The same ladder, continued: each step is the previous one times the
115
+ skin's own ratio. */
116
+ --cg-text-4xl: calc(var(--cg-text-3xl) * var(--cogenta-font-scale, 1.25));
117
+ --cg-text-5xl: calc(var(--cg-text-4xl) * var(--cogenta-font-scale, 1.25));
118
+ --cg-text-6xl: calc(var(--cg-text-5xl) * var(--cogenta-font-scale, 1.25));
119
+
120
+ /* Labels sit between `xs` and `sm`: capitals at `sm` shout, at `xs` they
121
+ fade. Interface text sits between `sm` and `md`. */
122
+ --cg-text-label: calc((var(--cg-text-xs) + var(--cg-text-sm)) / 2);
123
+ --cg-text-ui: calc((var(--cg-text-sm) + var(--cg-text-md)) / 2);
124
+ /* The reading size: `md` on a phone, a little above it on a desk. */
125
+ --cg-text-reading: clamp(
126
+ var(--cg-text-md),
127
+ calc(0.94rem + 0.28vw),
128
+ calc((var(--cg-text-md) * 3 + var(--cg-text-lg)) / 4)
129
+ );
119
130
 
131
+ --cg-size-nameplate: clamp(var(--cg-text-3xl), calc(1rem + 5.4vw), var(--cg-text-6xl));
132
+ --cg-size-headline: clamp(var(--cg-text-2xl), calc(0.9rem + 3.6vw), var(--cg-text-5xl));
133
+ --cg-size-lead: clamp(var(--cg-text-xl), calc(0.9rem + 2.1vw), var(--cg-text-4xl));
134
+ --cg-size-rail: clamp(var(--cg-text-xl), calc(0.95rem + 1.1vw), var(--cg-text-2xl));
135
+ --cg-size-title: clamp(var(--cg-text-2xl), calc(1rem + 2.4vw), var(--cg-text-4xl));
136
+ --cg-size-heading: clamp(var(--cg-text-xl), calc(0.95rem + 1.2vw), var(--cg-text-2xl));
137
+ --cg-size-brief: clamp(
138
+ var(--cg-text-lg),
139
+ calc(0.95rem + 0.5vw),
140
+ calc((var(--cg-text-lg) + var(--cg-text-xl)) / 2)
141
+ );
142
+ --cg-size-story: calc((var(--cg-text-md) + var(--cg-text-lg)) / 2);
143
+ --cg-size-standfirst: clamp(var(--cg-text-lg), calc(1rem + 0.55vw), var(--cg-text-xl));
144
+ --cg-size-quote: clamp(var(--cg-text-xl), calc(1rem + 1.2vw), var(--cg-text-2xl));
145
+ --cg-size-figure: clamp(var(--cg-text-2xl), calc(1rem + 2.2vw), var(--cg-text-4xl));
146
+
147
+ --cg-leading-display: 1.02;
148
+ --cg-leading-heading: 1.1;
149
+ --cg-leading-snug: 1.3;
150
+ --cg-leading-text: 1.6;
151
+ --cg-leading-ui: 1.4;
152
+
153
+ --cg-tracking-display: -0.012em;
154
+ --cg-tracking-heading: -0.006em;
155
+ --cg-tracking-caps: 0.1em;
156
+ --cg-tracking-nav: 0.14em;
157
+
158
+ --cg-weight-light: 300;
120
159
  --cg-weight-regular: 400;
121
160
  --cg-weight-medium: 500;
122
161
  --cg-weight-semibold: 600;
123
162
  --cg-weight-bold: 700;
124
- --cg-weight-black: 900;
163
+ --cg-weight-heavy: 800;
125
164
  }
126
165
 
127
166
  /* --------------------------------------------------------------------------
128
- Radius — the skin's three, kept small: a print page has square corners,
129
- and this theme's own `tokens.json` already ships tight radii, so nothing
130
- here inflates them into the pill-shaped, card-heavy vocabulary a generic
131
- admin dashboard uses.
167
+ Shape and motion: square corners, motion is a colour change.
132
168
  -------------------------------------------------------------------------- */
133
169
 
134
170
  :where(:root) {
135
- --cg-radius-sm: var(--cogenta-radius-sm);
136
- --cg-radius-md: var(--cogenta-radius-md);
137
- --cg-radius-lg: var(--cogenta-radius-lg);
138
- }
171
+ --cg-radius: var(--cogenta-radius-sm);
172
+ --cg-radius-control: var(--cogenta-radius-md);
139
173
 
140
- /* --------------------------------------------------------------------------
141
- Motion
142
- -------------------------------------------------------------------------- */
143
-
144
- :where(:root) {
145
- --cg-duration-fast: calc(var(--cogenta-motion-duration) * 0.6);
146
- --cg-duration: var(--cogenta-motion-duration);
147
- --cg-duration-slow: calc(var(--cogenta-motion-duration) * 2.4);
174
+ --cg-duration: min(var(--cogenta-motion-duration), 150ms);
148
175
  --cg-ease: var(--cogenta-motion-easing);
176
+
177
+ --cg-rule: 1px;
178
+ --cg-rule-strong: 2px;
179
+ --cg-rule-heavy: 4px;
149
180
  }
150
181
 
151
182
  /* --------------------------------------------------------------------------
152
- Colour — paper, ink, rule, accent. One palette per scheme, both derived
153
- from the same seven skin tokens.
154
-
155
- The block below declares the **light** palette in plain terms; the
156
- scheme-aware values live in the `@supports` block after it, and only
157
- there — the same split `theme-canonical` uses and for the same reason: a
158
- browser that does not know `light-dark()` still stores the declaration
159
- and only fails when the value is *used*, so a feature query is the only
160
- construct that actually falls back, written with `currentColor` so it
161
- needs no colour literal of its own.
162
-
163
- **This dark mode is designed for reading at night, not inverted.** Five
164
- decisions, each independently checked by `test/design-system.test.ts`
165
- against the real stylesheet:
166
-
167
- 1. *Elevation runs upward in lightness*, not via shadow: on black ink,
168
- shadow reads as nothing, so `--cg-paper-panel` (a boxed note, a pull
169
- quote's rule background) is the darkest surface, `--cg-paper` the
170
- canvas, `--cg-paper-raised` (a card, a lead story) the lightest of the
171
- three — the opposite of the light scheme, where the three are the same
172
- sheet of paper and a real drop shadow does the separating.
173
- 2. *The accent is lifted*, from an oklch lightness around 0.49 in daylight
174
- to about 0.72 at night — a brick red that reads correctly on cream
175
- goes muddy on near-black ink, so night mode pushes it toward a warm
176
- ember rather than keeping the daylight value.
177
- 3. *Its foreground flips to ink*, because a light ember needs a dark label
178
- the way the daylight accent needed a cream one — the clearest single
179
- break from a mechanical `bg`/`fg` swap.
180
- 4. *Text stays off pure white* — a warm, slightly toned paper-white, not
181
- `#fff`, which halates against a near-black canvas.
182
- 5. *Rules become light overlays* — a rule one step **up** from the
183
- surface it sits on, never a step down, or it disappears.
183
+ Colour: one palette per scheme, both derived from the same seven tokens.
184
+ --------------------------------------------------------------------------
185
+
186
+ The first block declares the light palette plainly; the scheme-aware
187
+ values follow behind a feature query, so a browser that cannot parse
188
+ `light-dark()` still gets a complete light palette.
189
+
190
+ The dark palette is designed, not inverted:
191
+
192
+ 1. The ground is ink: the skin's own `fg` at a low lightness, the colour
193
+ of a page of newsprint photographed at night. Surfaces step up in
194
+ lightness (sunken, canvas, raised).
195
+ 2. Text is the paper lowered to an off-white, so a long article on ink
196
+ stays calm, and the rules that divide the page step down with it.
197
+ 3. The red is lifted and desaturated until it reads as red on ink rather
198
+ than as a glow, and its foreground flips to ink.
199
+ 4. Hairlines are a step up in lightness from the surface they sit on.
200
+
201
+ Every ratio is computed from this file by `test/design-system.test.ts`,
202
+ in both schemes.
184
203
  -------------------------------------------------------------------------- */
185
204
 
186
205
  :where(:root) {
187
- --cg-paper: var(--cogenta-color-bg);
188
- --cg-paper-raised: var(--cogenta-color-bg);
189
- --cg-paper-panel: var(--cogenta-color-muted);
190
- --cg-paper-tint: color-mix(in oklab, var(--cogenta-color-accent) 9%, var(--cogenta-color-bg));
206
+ --cg-canvas: var(--cogenta-color-bg);
207
+ --cg-surface: var(--cogenta-color-bg);
208
+ --cg-surface-raised: var(--cogenta-color-bg);
209
+ --cg-surface-sunken: var(--cogenta-color-muted);
191
210
 
192
211
  --cg-ink: var(--cogenta-color-fg);
193
- --cg-ink-soft: var(--cogenta-color-muted-fg);
194
- --cg-ink-faint: color-mix(in oklab, var(--cogenta-color-muted-fg) 92%, var(--cogenta-color-bg));
212
+ --cg-ink-muted: var(--cogenta-color-muted-fg);
213
+ --cg-ink-subtle: color-mix(in oklab, var(--cogenta-color-muted-fg) 82%, var(--cogenta-color-bg));
195
214
 
196
215
  --cg-accent: var(--cogenta-color-accent);
197
- --cg-accent-ink: var(--cogenta-color-accent-fg);
198
- --cg-accent-hover: color-mix(in oklab, var(--cogenta-color-accent) 84%, var(--cogenta-color-fg));
199
- --cg-accent-tint: color-mix(in oklab, var(--cogenta-color-accent) 12%, var(--cogenta-color-bg));
200
- --cg-accent-tint-ink: color-mix(
201
- in oklab,
202
- var(--cogenta-color-accent) 70%,
203
- var(--cogenta-color-fg)
204
- );
216
+ --cg-accent-fg: var(--cogenta-color-accent-fg);
217
+ --cg-accent-hover: color-mix(in oklab, var(--cogenta-color-accent) 68%, var(--cogenta-color-fg));
218
+ --cg-accent-line: color-mix(in oklab, var(--cogenta-color-accent) 42%, var(--cogenta-color-bg));
205
219
 
206
- --cg-rule: var(--cogenta-color-border);
207
- --cg-rule-soft: color-mix(in oklab, var(--cogenta-color-border) 50%, var(--cogenta-color-bg));
208
- --cg-rule-heavy: color-mix(in oklab, var(--cogenta-color-border) 45%, var(--cogenta-color-fg));
220
+ --cg-line: var(--cogenta-color-border);
221
+ --cg-line-soft: color-mix(in oklab, var(--cogenta-color-border) 55%, var(--cogenta-color-bg));
222
+ --cg-line-strong: color-mix(in oklab, var(--cogenta-color-border) 38%, var(--cogenta-color-fg));
223
+ --cg-line-ink: var(--cogenta-color-fg);
209
224
 
210
- --cg-scrim: color-mix(in oklab, var(--cogenta-color-fg) 60%, transparent);
225
+ --cg-action: var(--cogenta-color-fg);
226
+ --cg-action-fg: var(--cogenta-color-bg);
227
+ --cg-action-hover: var(--cogenta-color-accent);
228
+ --cg-action-hover-fg: var(--cogenta-color-accent-fg);
229
+
230
+ --cg-image-brightness: 1;
211
231
  }
212
232
 
213
233
  @supports (color: light-dark(currentColor, currentColor)) and
214
234
  (color: oklch(from currentColor l c h)) {
215
235
  :where(:root) {
216
- --cg-paper: light-dark(
236
+ --cg-canvas: light-dark(var(--cogenta-color-bg), oklch(from var(--cogenta-color-fg) 0.185 c h));
237
+ --cg-surface: light-dark(
217
238
  var(--cogenta-color-bg),
218
- oklch(from var(--cogenta-color-fg) 0.15 calc(c * 0.65) h)
239
+ oklch(from var(--cogenta-color-fg) 0.185 c h)
219
240
  );
220
- --cg-paper-raised: light-dark(
241
+ --cg-surface-raised: light-dark(
221
242
  var(--cogenta-color-bg),
222
- oklch(from var(--cogenta-color-fg) 0.225 calc(c * 0.55) h)
243
+ oklch(from var(--cogenta-color-fg) 0.235 c h)
223
244
  );
224
- --cg-paper-panel: light-dark(
245
+ --cg-surface-sunken: light-dark(
225
246
  var(--cogenta-color-muted),
226
- oklch(from var(--cogenta-color-fg) 0.115 calc(c * 0.75) h)
227
- );
228
- --cg-paper-tint: light-dark(
229
- color-mix(in oklab, var(--cogenta-color-accent) 9%, var(--cogenta-color-bg)),
230
- oklch(from var(--cogenta-color-accent) 0.26 calc(c * 0.45) h)
247
+ oklch(from var(--cogenta-color-fg) 0.15 c h)
231
248
  );
232
249
 
233
- --cg-ink: light-dark(
234
- var(--cogenta-color-fg),
235
- oklch(from var(--cogenta-color-accent) 0.92 0.014 h)
236
- );
237
- --cg-ink-soft: light-dark(
250
+ --cg-ink: light-dark(var(--cogenta-color-fg), oklch(from var(--cogenta-color-muted) 0.93 c h));
251
+ --cg-ink-muted: light-dark(
238
252
  var(--cogenta-color-muted-fg),
239
- oklch(from var(--cogenta-color-accent) 0.75 0.02 h)
253
+ oklch(from var(--cogenta-color-muted) 0.8 c h)
240
254
  );
241
- --cg-ink-faint: light-dark(
242
- color-mix(in oklab, var(--cogenta-color-muted-fg) 92%, var(--cogenta-color-bg)),
243
- oklch(from var(--cogenta-color-accent) 0.63 0.018 h)
255
+ --cg-ink-subtle: light-dark(
256
+ color-mix(in oklab, var(--cogenta-color-muted-fg) 82%, var(--cogenta-color-bg)),
257
+ oklch(from var(--cogenta-color-muted) 0.71 c h)
244
258
  );
245
259
 
246
260
  --cg-accent: light-dark(
247
261
  var(--cogenta-color-accent),
248
- oklch(from var(--cogenta-color-accent) 0.72 calc(c * 0.9) h)
262
+ oklch(from var(--cogenta-color-accent) 0.66 calc(c * 0.92) h)
249
263
  );
250
- --cg-accent-ink: light-dark(
264
+ --cg-accent-fg: light-dark(
251
265
  var(--cogenta-color-accent-fg),
252
- oklch(from var(--cogenta-color-accent) 0.17 calc(c * 0.5) h)
266
+ oklch(from var(--cogenta-color-accent) 0.16 calc(c * 0.3) h)
253
267
  );
254
268
  --cg-accent-hover: light-dark(
255
- color-mix(in oklab, var(--cogenta-color-accent) 84%, var(--cogenta-color-fg)),
256
- oklch(from var(--cogenta-color-accent) 0.8 calc(c * 0.85) h)
269
+ color-mix(in oklab, var(--cogenta-color-accent) 68%, var(--cogenta-color-fg)),
270
+ oklch(from var(--cogenta-color-accent) 0.8 calc(c * 0.6) h)
257
271
  );
258
- --cg-accent-tint: light-dark(
259
- color-mix(in oklab, var(--cogenta-color-accent) 12%, var(--cogenta-color-bg)),
260
- oklch(from var(--cogenta-color-accent) 0.29 calc(c * 0.5) h)
261
- );
262
- --cg-accent-tint-ink: light-dark(
263
- color-mix(in oklab, var(--cogenta-color-accent) 70%, var(--cogenta-color-fg)),
264
- oklch(from var(--cogenta-color-accent) 0.88 calc(c * 0.4) h)
272
+ --cg-accent-line: light-dark(
273
+ color-mix(in oklab, var(--cogenta-color-accent) 42%, var(--cogenta-color-bg)),
274
+ oklch(from var(--cogenta-color-accent) 0.46 calc(c * 0.6) h)
265
275
  );
266
276
 
267
- --cg-rule: light-dark(
277
+ --cg-line: light-dark(
268
278
  var(--cogenta-color-border),
269
- oklch(from var(--cogenta-color-accent) 0.32 calc(c * 0.2) h)
279
+ oklch(from var(--cogenta-color-fg) 0.32 c h)
270
280
  );
271
- --cg-rule-soft: light-dark(
272
- color-mix(in oklab, var(--cogenta-color-border) 50%, var(--cogenta-color-bg)),
273
- oklch(from var(--cogenta-color-accent) 0.25 calc(c * 0.18) h)
281
+ --cg-line-soft: light-dark(
282
+ color-mix(in oklab, var(--cogenta-color-border) 55%, var(--cogenta-color-bg)),
283
+ oklch(from var(--cogenta-color-fg) 0.26 c h)
274
284
  );
275
- --cg-rule-heavy: light-dark(
276
- color-mix(in oklab, var(--cogenta-color-border) 45%, var(--cogenta-color-fg)),
277
- oklch(from var(--cogenta-color-accent) 0.56 calc(c * 0.22) h)
285
+ --cg-line-strong: light-dark(
286
+ color-mix(in oklab, var(--cogenta-color-border) 38%, var(--cogenta-color-fg)),
287
+ oklch(from var(--cogenta-color-fg) 0.54 c h)
288
+ );
289
+ --cg-line-ink: light-dark(
290
+ var(--cogenta-color-fg),
291
+ oklch(from var(--cogenta-color-muted) 0.84 c h)
278
292
  );
279
- }
280
- }
281
-
282
- /* --------------------------------------------------------------------------
283
- Elevation — a real drop shadow in daylight, a hairline rule at night
284
- -------------------------------------------------------------------------- */
285
-
286
- :where(:root) {
287
- --cg-ring: inset 0 0 0 1px var(--cg-rule);
288
- --cg-ring-accent: inset 0 0 0 1px var(--cg-accent);
289
293
 
290
- --cg-elevation-0: none;
291
- --cg-elevation-1: var(--cogenta-shadow-sm);
292
- --cg-elevation-2: var(--cogenta-shadow-md);
293
- --cg-elevation-3: var(--cogenta-shadow-md), var(--cogenta-shadow-sm);
294
+ --cg-action: light-dark(
295
+ var(--cogenta-color-fg),
296
+ oklch(from var(--cogenta-color-muted) 0.93 c h)
297
+ );
298
+ --cg-action-fg: light-dark(
299
+ var(--cogenta-color-bg),
300
+ oklch(from var(--cogenta-color-fg) 0.185 c h)
301
+ );
302
+ --cg-action-hover: light-dark(
303
+ var(--cogenta-color-accent),
304
+ oklch(from var(--cogenta-color-accent) 0.66 calc(c * 0.92) h)
305
+ );
306
+ --cg-action-hover-fg: light-dark(
307
+ var(--cogenta-color-accent-fg),
308
+ oklch(from var(--cogenta-color-accent) 0.16 calc(c * 0.3) h)
309
+ );
310
+ }
294
311
  }
295
312
 
313
+ /* Photographs are dimmed a little on ink, so a white sky in a picture does
314
+ not glare in a dark room. A brightness step, not a blur. */
296
315
  @media (prefers-color-scheme: dark) {
297
316
  :where(:root:not([data-theme="light"])) {
298
- --cg-elevation-1: var(--cg-ring);
299
- --cg-elevation-2: var(--cg-ring);
300
- --cg-elevation-3: var(--cg-ring), var(--cogenta-shadow-md);
317
+ --cg-image-brightness: 0.88;
301
318
  }
302
319
  }
303
320
 
304
321
  :where(:root[data-theme="dark"]) {
305
- --cg-elevation-1: var(--cg-ring);
306
- --cg-elevation-2: var(--cg-ring);
307
- --cg-elevation-3: var(--cg-ring), var(--cogenta-shadow-md);
322
+ --cg-image-brightness: 0.88;
308
323
  }