@cogenta/theme-entreprise 1.1.2

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 (117) hide show
  1. package/LICENSE +373 -0
  2. package/dist/src/index.d.ts +16 -0
  3. package/dist/src/index.d.ts.map +1 -0
  4. package/dist/src/index.js +16 -0
  5. package/dist/src/index.js.map +1 -0
  6. package/dist/src/render/blocks/accordion.d.ts +4 -0
  7. package/dist/src/render/blocks/accordion.d.ts.map +1 -0
  8. package/dist/src/render/blocks/accordion.js +24 -0
  9. package/dist/src/render/blocks/accordion.js.map +1 -0
  10. package/dist/src/render/blocks/collection-list.d.ts +14 -0
  11. package/dist/src/render/blocks/collection-list.d.ts.map +1 -0
  12. package/dist/src/render/blocks/collection-list.js +55 -0
  13. package/dist/src/render/blocks/collection-list.js.map +1 -0
  14. package/dist/src/render/blocks/cta.d.ts +12 -0
  15. package/dist/src/render/blocks/cta.d.ts.map +1 -0
  16. package/dist/src/render/blocks/cta.js +19 -0
  17. package/dist/src/render/blocks/cta.js.map +1 -0
  18. package/dist/src/render/blocks/embed.d.ts +4 -0
  19. package/dist/src/render/blocks/embed.d.ts.map +1 -0
  20. package/dist/src/render/blocks/embed.js +92 -0
  21. package/dist/src/render/blocks/embed.js.map +1 -0
  22. package/dist/src/render/blocks/faq.d.ts +4 -0
  23. package/dist/src/render/blocks/faq.d.ts.map +1 -0
  24. package/dist/src/render/blocks/faq.js +25 -0
  25. package/dist/src/render/blocks/faq.js.map +1 -0
  26. package/dist/src/render/blocks/feature-grid.d.ts +4 -0
  27. package/dist/src/render/blocks/feature-grid.d.ts.map +1 -0
  28. package/dist/src/render/blocks/feature-grid.js +33 -0
  29. package/dist/src/render/blocks/feature-grid.js.map +1 -0
  30. package/dist/src/render/blocks/gallery.d.ts +15 -0
  31. package/dist/src/render/blocks/gallery.d.ts.map +1 -0
  32. package/dist/src/render/blocks/gallery.js +28 -0
  33. package/dist/src/render/blocks/gallery.js.map +1 -0
  34. package/dist/src/render/blocks/hero.d.ts +15 -0
  35. package/dist/src/render/blocks/hero.d.ts.map +1 -0
  36. package/dist/src/render/blocks/hero.js +31 -0
  37. package/dist/src/render/blocks/hero.js.map +1 -0
  38. package/dist/src/render/blocks/logo-strip.d.ts +4 -0
  39. package/dist/src/render/blocks/logo-strip.d.ts.map +1 -0
  40. package/dist/src/render/blocks/logo-strip.js +21 -0
  41. package/dist/src/render/blocks/logo-strip.js.map +1 -0
  42. package/dist/src/render/blocks/logos.d.ts +4 -0
  43. package/dist/src/render/blocks/logos.d.ts.map +1 -0
  44. package/dist/src/render/blocks/logos.js +30 -0
  45. package/dist/src/render/blocks/logos.js.map +1 -0
  46. package/dist/src/render/blocks/media-figure.d.ts +13 -0
  47. package/dist/src/render/blocks/media-figure.d.ts.map +1 -0
  48. package/dist/src/render/blocks/media-figure.js +28 -0
  49. package/dist/src/render/blocks/media-figure.js.map +1 -0
  50. package/dist/src/render/blocks/pricing-table.d.ts +4 -0
  51. package/dist/src/render/blocks/pricing-table.d.ts.map +1 -0
  52. package/dist/src/render/blocks/pricing-table.js +33 -0
  53. package/dist/src/render/blocks/pricing-table.js.map +1 -0
  54. package/dist/src/render/blocks/prose.d.ts +9 -0
  55. package/dist/src/render/blocks/prose.d.ts.map +1 -0
  56. package/dist/src/render/blocks/prose.js +10 -0
  57. package/dist/src/render/blocks/prose.js.map +1 -0
  58. package/dist/src/render/blocks/quote.d.ts +18 -0
  59. package/dist/src/render/blocks/quote.d.ts.map +1 -0
  60. package/dist/src/render/blocks/quote.js +31 -0
  61. package/dist/src/render/blocks/quote.js.map +1 -0
  62. package/dist/src/render/blocks/stat-counter.d.ts +4 -0
  63. package/dist/src/render/blocks/stat-counter.d.ts.map +1 -0
  64. package/dist/src/render/blocks/stat-counter.js +23 -0
  65. package/dist/src/render/blocks/stat-counter.js.map +1 -0
  66. package/dist/src/render/blocks/stats.d.ts +4 -0
  67. package/dist/src/render/blocks/stats.d.ts.map +1 -0
  68. package/dist/src/render/blocks/stats.js +23 -0
  69. package/dist/src/render/blocks/stats.js.map +1 -0
  70. package/dist/src/render/blocks/testimonial.d.ts +16 -0
  71. package/dist/src/render/blocks/testimonial.d.ts.map +1 -0
  72. package/dist/src/render/blocks/testimonial.js +25 -0
  73. package/dist/src/render/blocks/testimonial.js.map +1 -0
  74. package/dist/src/render/chrome.d.ts +3 -0
  75. package/dist/src/render/chrome.d.ts.map +1 -0
  76. package/dist/src/render/chrome.js +101 -0
  77. package/dist/src/render/chrome.js.map +1 -0
  78. package/dist/src/render/render-block.d.ts +24 -0
  79. package/dist/src/render/render-block.d.ts.map +1 -0
  80. package/dist/src/render/render-block.js +108 -0
  81. package/dist/src/render/render-block.js.map +1 -0
  82. package/dist/src/render/term-archive.d.ts +12 -0
  83. package/dist/src/render/term-archive.d.ts.map +1 -0
  84. package/dist/src/render/term-archive.js +34 -0
  85. package/dist/src/render/term-archive.js.map +1 -0
  86. package/dist/theme.config.d.ts +16 -0
  87. package/dist/theme.config.d.ts.map +1 -0
  88. package/dist/theme.config.js +46 -0
  89. package/dist/theme.config.js.map +1 -0
  90. package/package.json +57 -0
  91. package/src/index.ts +15 -0
  92. package/src/render/blocks/accordion.ts +60 -0
  93. package/src/render/blocks/collection-list.ts +122 -0
  94. package/src/render/blocks/cta.ts +48 -0
  95. package/src/render/blocks/embed.ts +115 -0
  96. package/src/render/blocks/faq.ts +61 -0
  97. package/src/render/blocks/feature-grid.ts +73 -0
  98. package/src/render/blocks/gallery.ts +48 -0
  99. package/src/render/blocks/hero.ts +60 -0
  100. package/src/render/blocks/logo-strip.ts +36 -0
  101. package/src/render/blocks/logos.ts +60 -0
  102. package/src/render/blocks/media-figure.ts +43 -0
  103. package/src/render/blocks/pricing-table.ts +77 -0
  104. package/src/render/blocks/prose.ts +11 -0
  105. package/src/render/blocks/quote.ts +48 -0
  106. package/src/render/blocks/stat-counter.ts +45 -0
  107. package/src/render/blocks/stats.ts +50 -0
  108. package/src/render/blocks/testimonial.ts +41 -0
  109. package/src/render/chrome.ts +128 -0
  110. package/src/render/render-block.ts +144 -0
  111. package/src/render/term-archive.ts +80 -0
  112. package/src/styles/archive.css +68 -0
  113. package/src/styles/base.css +895 -0
  114. package/src/styles/blocks.css +1433 -0
  115. package/src/styles/theme.css +36 -0
  116. package/src/styles/tokens.css +326 -0
  117. package/tokens.json +36 -0
@@ -0,0 +1,36 @@
1
+ /*
2
+ * `@cogenta/theme-entreprise`'s stylesheet — the entry point, and nothing
3
+ * else.
4
+ *
5
+ * Three layers, in the only order that works:
6
+ *
7
+ * tokens.css the design system, derived entirely from the skin's
8
+ * `--cogenta-*` custom properties (contract D)
9
+ * base.css document, accessibility floor, page frame, chrome, actions
10
+ * blocks.css the seventeen vocabulary blocks
11
+ *
12
+ * Not one colour, font, radius, duration or shadow is written literally in
13
+ * any of the three: every value comes from a `--cogenta-<group>-<name>`
14
+ * property produced from the skin's tokens, or from a `--cg-*` property
15
+ * composed from those. A single hard-coded hex would be a colour no skin
16
+ * can change.
17
+ *
18
+ * `@import` is resolved at build time by Astro, and by `@cogenta/cli`'s own
19
+ * inliner when `cogenta serve` renders without a build. Both flatten these
20
+ * three into one sheet, so no visitor ever pays for three round trips.
21
+ *
22
+ * The one thing this file adds on its own: the Google Fonts request for the
23
+ * two type families `tokens.json` names (Archivo for the sans, Source Serif
24
+ * 4 for the serif accents in `quote`, `prose`'s blockquotes and the
25
+ * numbered indices in `featureGrid`/`faq`) — loaded here, once, rather than
26
+ * per skin, since a skin only ever *names* a font family; it does not fetch
27
+ * one. Both fall back to a real system stack (`tokens.json`'s `font.sans`/
28
+ * `font.serif`) if Google Fonts is unreachable.
29
+ */
30
+
31
+ @import url("https://fonts.googleapis.com/css2?family=Archivo:ital,wght@0,400;0,500;0,600;0,700;0,800;1,400&family=Source+Serif+4:ital,opsz,wght@0,8..60,400;0,8..60,500;1,8..60,400&display=swap");
32
+
33
+ @import "./tokens.css";
34
+ @import "./base.css";
35
+ @import "./blocks.css";
36
+ @import "./archive.css";
@@ -0,0 +1,326 @@
1
+ /*
2
+ * `@cogenta/theme-entreprise`'s design system.
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.
11
+ *
12
+ * Two rules hold everywhere in this file and the two that import it:
13
+ *
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.
19
+ *
20
+ * The default skin (`tokens.json`) is a light-mode-forward palette built
21
+ * around one confident accent — a deep forest green rather than the more
22
+ * expected "corporate blue" — on a warm near-white ground. This file's own
23
+ * decisions are what turn that into a full system: the light mode is
24
+ * "structured and edged" (hairline borders carry most of the depth, shadow
25
+ * reserved for genuine hover elevation), and the dark mode is designed on
26
+ * its own terms rather than mechanically inverted — see the colour section
27
+ * below for the five choices that make it so.
28
+ */
29
+
30
+ :where(:root) {
31
+ color-scheme: light dark;
32
+ }
33
+
34
+ :where(:root[data-theme="dark"]) {
35
+ color-scheme: dark;
36
+ }
37
+
38
+ :where(:root[data-theme="light"]) {
39
+ color-scheme: light;
40
+ }
41
+
42
+ /* --------------------------------------------------------------------------
43
+ Space — a slightly more generous scale than the type steps alone would
44
+ suggest: the aesthetic direction asks for "real breathing room", which
45
+ this theme spends mostly in its section rhythm (`--cg-section-y`) and
46
+ its row/card padding, not in a larger base unit.
47
+ -------------------------------------------------------------------------- */
48
+
49
+ :where(:root) {
50
+ --cg-density: var(--cogenta-space-scale, 1);
51
+ --cg-unit: calc(var(--cogenta-space-unit) * var(--cg-density));
52
+
53
+ --cg-s1: calc(var(--cg-unit) * 1);
54
+ --cg-s2: calc(var(--cg-unit) * 2);
55
+ --cg-s3: calc(var(--cg-unit) * 3);
56
+ --cg-s4: calc(var(--cg-unit) * 4);
57
+ --cg-s5: calc(var(--cg-unit) * 5);
58
+ --cg-s6: calc(var(--cg-unit) * 6);
59
+ --cg-s8: calc(var(--cg-unit) * 8);
60
+ --cg-s10: calc(var(--cg-unit) * 10);
61
+ --cg-s12: calc(var(--cg-unit) * 12);
62
+ --cg-s16: calc(var(--cg-unit) * 16);
63
+ --cg-s20: calc(var(--cg-unit) * 20);
64
+ --cg-s28: calc(var(--cg-unit) * 28);
65
+
66
+ --cg-gutter: var(--cg-s6);
67
+ --cg-gap-tight: var(--cg-s2);
68
+ --cg-gap: var(--cg-s5);
69
+ --cg-gap-loose: var(--cg-s10);
70
+ --cg-section-y: var(--cg-s20);
71
+
72
+ --cg-measure: 66ch;
73
+ --cg-measure-narrow: 44ch;
74
+ --cg-page: 78rem;
75
+ --cg-page-narrow: 50rem;
76
+ }
77
+
78
+ :where([data-density="compact"]) {
79
+ --cg-density: 0.75;
80
+ }
81
+
82
+ :where([data-density="comfortable"]) {
83
+ --cg-density: 1;
84
+ }
85
+
86
+ :where([data-density="spacious"]) {
87
+ --cg-density: 1.25;
88
+ }
89
+
90
+ /* --------------------------------------------------------------------------
91
+ Type — the skin's scale, named; plus the rhythm the scale does not carry.
92
+ -------------------------------------------------------------------------- */
93
+
94
+ :where(:root) {
95
+ --cg-text-xs: var(--cogenta-font-size-xs, 0.69rem);
96
+ --cg-text-sm: var(--cogenta-font-size-sm, 0.83rem);
97
+ --cg-text-md: var(--cogenta-font-size-md, var(--cogenta-font-base-size, 1rem));
98
+ --cg-text-lg: var(--cogenta-font-size-lg, 1.2rem);
99
+ --cg-text-xl: var(--cogenta-font-size-xl, 1.44rem);
100
+ --cg-text-2xl: var(--cogenta-font-size-2xl, 1.728rem);
101
+ --cg-text-3xl: var(--cogenta-font-size-3xl, 2.0736rem);
102
+
103
+ --cg-leading-tight: 1.08;
104
+ --cg-leading-snug: 1.24;
105
+ --cg-leading-normal: 1.55;
106
+ --cg-leading-relaxed: 1.72;
107
+
108
+ /* A confident display face wants tighter tracking at large sizes, and a
109
+ label set in small caps wants the opposite — both scale with the font
110
+ size because they are written in `em`. */
111
+ --cg-tracking-tight: -0.018em;
112
+ --cg-tracking-snug: -0.008em;
113
+ --cg-tracking-normal: 0em;
114
+ --cg-tracking-wide: 0.1em;
115
+
116
+ --cg-weight-regular: 400;
117
+ --cg-weight-medium: 500;
118
+ --cg-weight-semibold: 600;
119
+ --cg-weight-bold: 700;
120
+ }
121
+
122
+ /* --------------------------------------------------------------------------
123
+ Radius — deliberately sharper than a typical marketing template: a
124
+ consultancy or a software vendor reads as more serious with edges that
125
+ are structured rather than soft. `--cg-radius-pill` is the one rounded
126
+ shape this theme uses freely (the eyebrow tag, small badges) precisely
127
+ because everything else stays close to square.
128
+ -------------------------------------------------------------------------- */
129
+
130
+ :where(:root) {
131
+ --cg-radius-xs: calc(var(--cogenta-radius-sm) / 2);
132
+ --cg-radius-sm: var(--cogenta-radius-sm);
133
+ --cg-radius-md: var(--cogenta-radius-md);
134
+ --cg-radius-lg: var(--cogenta-radius-lg);
135
+ --cg-radius-xl: calc(var(--cogenta-radius-lg) * 1.5);
136
+ --cg-radius-pill: 999rem;
137
+ }
138
+
139
+ /* --------------------------------------------------------------------------
140
+ Motion
141
+ -------------------------------------------------------------------------- */
142
+
143
+ :where(:root) {
144
+ --cg-duration-fast: calc(var(--cogenta-motion-duration) * 0.65);
145
+ --cg-duration: var(--cogenta-motion-duration);
146
+ --cg-duration-slow: calc(var(--cogenta-motion-duration) * 3);
147
+ --cg-ease: var(--cogenta-motion-easing);
148
+ }
149
+
150
+ /* --------------------------------------------------------------------------
151
+ Colour — one palette per scheme, both derived from the same seven tokens.
152
+ --------------------------------------------------------------------------
153
+
154
+ The block below declares the **light** palette in plain terms; the
155
+ scheme-aware values live in the `@supports` block after it, guarded the
156
+ same way for the same reason `theme-canonical` guards it: a browser that
157
+ cannot parse `light-dark()` must still get a usable light palette rather
158
+ than an `unset` custom property.
159
+
160
+ **This dark palette is designed on its own terms, not inverted — five
161
+ decisions, each the opposite of what a mechanical `bg`/`fg` swap would
162
+ produce:**
163
+
164
+ 1. *Elevation is a hairline, almost everywhere.* Light mode expresses a
165
+ raised surface mostly as a **border**, reserving `box-shadow` for
166
+ genuine hover lift (a card, a service row). Dark mode keeps that same
167
+ restraint: elevation is a ring that steps *up* in lightness, never a
168
+ shadow — a shadow on ink conveys nothing.
169
+ 2. *The accent is lifted less than a mechanical swap would allow, and
170
+ **desaturated** rather than just brightened.* A forest green pushed to
171
+ the same lightness a mechanical fix would pick reads as neon; this
172
+ palette lifts it to L 0.68 and pulls a third of its chroma back, which
173
+ is what makes it still read as "the same considered green" instead of
174
+ a highlighter.
175
+ 3. *The accent's foreground flips to ink.* Light text on a lifted accent
176
+ fails contrast, so `accent-fg` is derived dark from the accent's own
177
+ hue rather than kept as the skin's white.
178
+ 4. *Text is never pure light and never fully desaturated.* Ink carries a
179
+ trace of the accent's hue at low chroma — an off-white that still
180
+ belongs to this palette rather than a generic dark-mode grey.
181
+ 5. *A border lightens rather than darkens against its surface* — a
182
+ darker line on dark ink is invisible.
183
+
184
+ The hue and chroma of every dark value come from a skin token, so a skin
185
+ with a different accent gets a dark palette tuned the same way without
186
+ touching this file. Every ratio these values produce is computed for
187
+ real, from this file, by `test/design-system.test.ts`, in both schemes.
188
+
189
+ Known limit, same one `theme-canonical` records: the derivation assumes a
190
+ light-first skin (`bg` lighter than `fg`) — what contract D's default and
191
+ every blueprint use. A skin that starts dark would need a second colour
192
+ group in the contract, a `theme@2.0` change no single theme can make on
193
+ its own.
194
+ -------------------------------------------------------------------------- */
195
+
196
+ :where(:root) {
197
+ --cg-canvas: var(--cogenta-color-bg);
198
+ --cg-surface: var(--cogenta-color-bg);
199
+ --cg-surface-raised: var(--cogenta-color-bg);
200
+ --cg-surface-sunken: var(--cogenta-color-muted);
201
+ --cg-surface-tinted: color-mix(in oklab, var(--cogenta-color-accent) 7%, var(--cogenta-color-bg));
202
+
203
+ --cg-ink: var(--cogenta-color-fg);
204
+ --cg-ink-muted: var(--cogenta-color-muted-fg);
205
+ --cg-ink-subtle: color-mix(in oklab, var(--cogenta-color-muted-fg) 85%, var(--cogenta-color-bg));
206
+
207
+ --cg-accent: var(--cogenta-color-accent);
208
+ --cg-accent-fg: var(--cogenta-color-accent-fg);
209
+ --cg-accent-hover: color-mix(in oklab, var(--cogenta-color-accent) 84%, var(--cogenta-color-fg));
210
+ --cg-accent-soft: color-mix(in oklab, var(--cogenta-color-accent) 9%, var(--cogenta-color-bg));
211
+ --cg-accent-soft-fg: color-mix(
212
+ in oklab,
213
+ var(--cogenta-color-accent) 70%,
214
+ var(--cogenta-color-fg)
215
+ );
216
+
217
+ --cg-line: var(--cogenta-color-border);
218
+ --cg-line-soft: color-mix(in oklab, var(--cogenta-color-border) 50%, var(--cogenta-color-bg));
219
+ --cg-line-strong: color-mix(in oklab, var(--cogenta-color-border) 60%, var(--cogenta-color-fg));
220
+
221
+ --cg-scrim: color-mix(in oklab, var(--cogenta-color-fg) 58%, transparent);
222
+ }
223
+
224
+ @supports (color: light-dark(currentColor, currentColor)) and
225
+ (color: oklch(from currentColor l c h)) {
226
+ :where(:root) {
227
+ --cg-canvas: light-dark(
228
+ var(--cogenta-color-bg),
229
+ oklch(from var(--cogenta-color-fg) 0.155 calc(c * 0.65) h)
230
+ );
231
+ --cg-surface: light-dark(
232
+ var(--cogenta-color-bg),
233
+ oklch(from var(--cogenta-color-fg) 0.155 calc(c * 0.65) h)
234
+ );
235
+ --cg-surface-raised: light-dark(
236
+ var(--cogenta-color-bg),
237
+ oklch(from var(--cogenta-color-fg) 0.225 calc(c * 0.6) h)
238
+ );
239
+ --cg-surface-sunken: light-dark(
240
+ var(--cogenta-color-muted),
241
+ oklch(from var(--cogenta-color-fg) 0.115 calc(c * 0.75) h)
242
+ );
243
+ --cg-surface-tinted: light-dark(
244
+ color-mix(in oklab, var(--cogenta-color-accent) 7%, var(--cogenta-color-bg)),
245
+ oklch(from var(--cogenta-color-accent) 0.235 calc(c * 0.55) h)
246
+ );
247
+
248
+ --cg-ink: light-dark(
249
+ var(--cogenta-color-fg),
250
+ oklch(from var(--cogenta-color-accent) 0.93 0.01 h)
251
+ );
252
+ --cg-ink-muted: light-dark(
253
+ var(--cogenta-color-muted-fg),
254
+ oklch(from var(--cogenta-color-accent) 0.76 0.016 h)
255
+ );
256
+ --cg-ink-subtle: light-dark(
257
+ color-mix(in oklab, var(--cogenta-color-muted-fg) 85%, var(--cogenta-color-bg)),
258
+ oklch(from var(--cogenta-color-accent) 0.63 0.014 h)
259
+ );
260
+
261
+ --cg-accent: light-dark(
262
+ var(--cogenta-color-accent),
263
+ oklch(from var(--cogenta-color-accent) 0.68 calc(c * 0.72) h)
264
+ );
265
+ --cg-accent-fg: light-dark(
266
+ var(--cogenta-color-accent-fg),
267
+ oklch(from var(--cogenta-color-accent) 0.16 calc(c * 0.5) h)
268
+ );
269
+ --cg-accent-hover: light-dark(
270
+ color-mix(in oklab, var(--cogenta-color-accent) 84%, var(--cogenta-color-fg)),
271
+ oklch(from var(--cogenta-color-accent) 0.77 calc(c * 0.68) h)
272
+ );
273
+ --cg-accent-soft: light-dark(
274
+ color-mix(in oklab, var(--cogenta-color-accent) 9%, var(--cogenta-color-bg)),
275
+ oklch(from var(--cogenta-color-accent) 0.28 calc(c * 0.45) h)
276
+ );
277
+ --cg-accent-soft-fg: light-dark(
278
+ color-mix(in oklab, var(--cogenta-color-accent) 70%, var(--cogenta-color-fg)),
279
+ oklch(from var(--cogenta-color-accent) 0.87 calc(c * 0.4) h)
280
+ );
281
+
282
+ --cg-line: light-dark(
283
+ var(--cogenta-color-border),
284
+ oklch(from var(--cogenta-color-accent) 0.34 calc(c * 0.2) h)
285
+ );
286
+ --cg-line-soft: light-dark(
287
+ color-mix(in oklab, var(--cogenta-color-border) 50%, var(--cogenta-color-bg)),
288
+ oklch(from var(--cogenta-color-accent) 0.27 calc(c * 0.18) h)
289
+ );
290
+ --cg-line-strong: light-dark(
291
+ color-mix(in oklab, var(--cogenta-color-border) 60%, var(--cogenta-color-fg)),
292
+ oklch(from var(--cogenta-color-accent) 0.55 calc(c * 0.22) h)
293
+ );
294
+ }
295
+ }
296
+
297
+ /* --------------------------------------------------------------------------
298
+ Elevation — a hairline ring by default in both schemes; a real shadow is
299
+ spent only on hover, never on a resting surface. This is the theme's own
300
+ "structured, edged" answer to elevation, distinct from a shadow-first
301
+ system: a resting card looks like a plate on a desk, not a sticker
302
+ floating above the page.
303
+ -------------------------------------------------------------------------- */
304
+
305
+ :where(:root) {
306
+ --cg-ring: inset 0 0 0 1px var(--cg-line);
307
+ --cg-ring-accent: inset 0 0 0 1px var(--cg-accent);
308
+ --cg-ring-strong: inset 0 0 0 1px var(--cg-line-strong);
309
+
310
+ --cg-elevation-0: none;
311
+ --cg-elevation-1: var(--cg-ring);
312
+ --cg-elevation-2: var(--cogenta-shadow-sm), var(--cg-ring);
313
+ --cg-elevation-3: var(--cogenta-shadow-md), var(--cg-ring);
314
+ }
315
+
316
+ @media (prefers-color-scheme: dark) {
317
+ :where(:root:not([data-theme="light"])) {
318
+ --cg-elevation-2: var(--cg-ring-strong);
319
+ --cg-elevation-3: var(--cg-ring-strong), var(--cogenta-shadow-md);
320
+ }
321
+ }
322
+
323
+ :where(:root[data-theme="dark"]) {
324
+ --cg-elevation-2: var(--cg-ring-strong);
325
+ --cg-elevation-3: var(--cg-ring-strong), var(--cogenta-shadow-md);
326
+ }
package/tokens.json ADDED
@@ -0,0 +1,36 @@
1
+ {
2
+ "color": {
3
+ "bg": "#fbfaf7",
4
+ "fg": "#14201a",
5
+ "accent": "#1f5f45",
6
+ "accentFg": "#ffffff",
7
+ "muted": "#eef1ec",
8
+ "mutedFg": "#42493f",
9
+ "border": "#d7ddd2"
10
+ },
11
+ "font": {
12
+ "sans": "'Archivo', ui-sans-serif, system-ui, -apple-system, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif",
13
+ "serif": "'Source Serif 4', ui-serif, Georgia, Cambria, 'Times New Roman', serif",
14
+ "mono": "ui-monospace, SFMono-Regular, 'SF Mono', Menlo, Consolas, monospace",
15
+ "scale": 1.2,
16
+ "baseSize": "1rem"
17
+ },
18
+ "space": {
19
+ "unit": "0.25rem",
20
+ "density": "comfortable"
21
+ },
22
+ "radius": {
23
+ "sm": "0.125rem",
24
+ "md": "0.25rem",
25
+ "lg": "0.5rem"
26
+ },
27
+ "motion": {
28
+ "duration": "160ms",
29
+ "easing": "cubic-bezier(0.16, 1, 0.3, 1)",
30
+ "reduced": true
31
+ },
32
+ "shadow": {
33
+ "sm": "0 1px 2px rgba(20, 32, 26, 0.06)",
34
+ "md": "0 12px 32px rgba(20, 32, 26, 0.14)"
35
+ }
36
+ }