tyrell-components 1.0.0-TC19 → 1.0.0-TC23

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 (56) hide show
  1. package/css/tyrell-brand.css +913 -0
  2. package/css/tyrell.css +64 -168
  3. package/dist/tyrell-brand.css +913 -0
  4. package/dist/tyrell.css +64 -168
  5. package/dist/tyrell.js +1 -1
  6. package/lib/components/tooltip.js +1 -1
  7. package/lib/styles/button.d.ts +1 -1
  8. package/lib/styles/button.d.ts.map +1 -1
  9. package/lib/styles/button.js +1 -1
  10. package/lib/styles/calendar-month.d.ts +1 -1
  11. package/lib/styles/calendar-month.js +3 -3
  12. package/lib/styles/checkbox.d.ts +1 -1
  13. package/lib/styles/checkbox.d.ts.map +1 -1
  14. package/lib/styles/custom-scrollbar.d.ts +1 -1
  15. package/lib/styles/custom-scrollbar.d.ts.map +1 -1
  16. package/lib/styles/custom-scrollbar.js +8 -8
  17. package/lib/styles/date-picker.d.ts +1 -1
  18. package/lib/styles/date-picker.d.ts.map +1 -1
  19. package/lib/styles/date-picker.js +16 -16
  20. package/lib/styles/dropdown.d.ts +1 -1
  21. package/lib/styles/dropdown.d.ts.map +1 -1
  22. package/lib/styles/dropdown.js +7 -7
  23. package/lib/styles/input.d.ts +1 -1
  24. package/lib/styles/input.d.ts.map +1 -1
  25. package/lib/styles/input.js +16 -16
  26. package/lib/styles/multiselect.d.ts +1 -1
  27. package/lib/styles/multiselect.d.ts.map +1 -1
  28. package/lib/styles/multiselect.js +1 -1
  29. package/lib/styles/option.d.ts +1 -1
  30. package/lib/styles/option.js +1 -1
  31. package/lib/styles/radio.d.ts +1 -1
  32. package/lib/styles/radio.d.ts.map +1 -1
  33. package/lib/styles/scroll-container.d.ts +1 -1
  34. package/lib/styles/scroll-container.d.ts.map +1 -1
  35. package/lib/styles/scroll-container.js +10 -10
  36. package/lib/styles/step.d.ts +1 -1
  37. package/lib/styles/step.d.ts.map +1 -1
  38. package/lib/styles/switch.d.ts +1 -1
  39. package/lib/styles/switch.d.ts.map +1 -1
  40. package/lib/styles/tab.d.ts +1 -1
  41. package/lib/styles/tab.d.ts.map +1 -1
  42. package/lib/styles/tag.d.ts +1 -1
  43. package/lib/styles/tag.d.ts.map +1 -1
  44. package/lib/styles/tag.js +15 -15
  45. package/lib/styles/textarea.d.ts +1 -1
  46. package/lib/styles/textarea.js +1 -1
  47. package/lib/styles/tooltip.d.ts.map +1 -1
  48. package/lib/styles/tooltip.js +12 -15
  49. package/lib/styles/tooltip.js.map +1 -1
  50. package/lib/styles/wizard.d.ts +12 -7
  51. package/lib/styles/wizard.d.ts.map +1 -1
  52. package/lib/styles/wizard.js +46 -74
  53. package/lib/styles/wizard.js.map +1 -1
  54. package/lib/version.d.ts +1 -1
  55. package/lib/version.js +1 -1
  56. package/package.json +3 -3
@@ -0,0 +1,913 @@
1
+ /* =====================================================================
2
+ * tyrell-brand.css — OKLCH-based brand layer for Tyrell Components
3
+ * =====================================================================
4
+ *
5
+ * Opt-in. Load AFTER `tyrell.css`. Override a few variables to rebrand.
6
+ *
7
+ * <link rel="stylesheet" href=".../tyrell.css">
8
+ * <link rel="stylesheet" href=".../tyrell-brand.css">
9
+ *
10
+ * :root {
11
+ * --ty-brand-hue: 200; // teal. Try 260 indigo, 30 orange, 145 emerald.
12
+ * --ty-brand-chroma: 0.13;
13
+ * }
14
+ *
15
+ * =====================================================================
16
+ * THE FORMULA
17
+ * =====================================================================
18
+ *
19
+ * Every color in the library is one formula on five axes:
20
+ *
21
+ * oklch(
22
+ * L = L-curve[shade] × flavor-l-factor ← Tier 3 × Tier 5
23
+ * C = flavor-chroma × saturation-curve[shade] ← Tier 2 × Tier 4
24
+ * H = flavor-hue ← Tier 2
25
+ * )
26
+ *
27
+ * Pick a flavor (primary / secondary / success / warning / danger /
28
+ * neutral). Pick a shade (strong / bold / base / soft / faint). That's
29
+ * the cell; the formula gives you its color.
30
+ *
31
+ * FLAVOR axis — which semantic role (carries its own hue, chroma,
32
+ * l-factor seeds)
33
+ * SHADE axis — 5 emphasis stops shared across flavors
34
+ * (strong / bold / base / soft / faint)
35
+ * HUE axis — what color family (0°–360°)
36
+ * CHROMA axis — how saturated (0 = grey, ~0.4 = max vivid)
37
+ * L axis — how dark or light (0 = black, 1 = white)
38
+ * Light mode: low L = more emphasis.
39
+ * Dark mode: high L = more emphasis (curve flips).
40
+ *
41
+ * Worked example — `--ty-color-warning-bold` in LIGHT mode:
42
+ *
43
+ * L = 0.46 × 1 = 0.46 ← l-bold × warning-l-factor
44
+ * C = 0.26 × 1.00 = 0.26 ← warning-chroma × c-bold-mult
45
+ * H = 75° ← warning-hue
46
+ * → oklch(0.46 0.26 75) (a punchy amber for +1 emphasis text)
47
+ *
48
+ * Want warning a notch darker without touching anything else? Set
49
+ * `--ty-warning-l-factor: 0.85` and the new L becomes 0.46 × 0.85 =
50
+ * 0.39. Every warning shade shifts in step; primary / success / danger
51
+ * are untouched.
52
+ *
53
+ * =====================================================================
54
+ * FILE LAYOUT
55
+ * =====================================================================
56
+ *
57
+ * SECTION 1 — KNOBS (~lines 80–225)
58
+ * The variables you might want to override. Five tiers from drop-in
59
+ * rebrand (Tier 1) to surgical per-flavor tweak (Tier 5).
60
+ *
61
+ * SECTION 2 — IMPLEMENTATION
62
+ * The oklch() expressions that wire the knobs through to the actual
63
+ * color tokens. Rarely needs editing — Section 1 is the contract.
64
+ *
65
+ * Browser support: OKLCH is in every evergreen browser since mid-2023.
66
+ *
67
+ * ===================================================================== */
68
+
69
+ /* =====================================================================
70
+ * SECTION 1 — KNOBS
71
+ * =====================================================================
72
+ *
73
+ * Five tiers, ordered by how often you'd touch them. Override any of
74
+ * these in your own `:root` (or `html.dark` for per-mode tuning) —
75
+ * your declaration wins by source order.
76
+ *
77
+ * Tier 1 — SEEDS brand-hue + chroma. Rebrand in 2 lines.
78
+ * Tier 2 — PER-FLAVOR ANCHORS each flavor's hue + chroma.
79
+ * Tier 3 — L-CURVE 5 lightness stops for the emphasis ramp.
80
+ * Tier 4 — SATURATION CURVE per-shade chroma multipliers.
81
+ * Tier 5 — PER-FLAVOR L-FACTOR per-flavor lightness multiplier — push
82
+ * one flavor up or down without touching
83
+ * the others. Default 1.
84
+ * ===================================================================== */
85
+
86
+ :root {
87
+ /* ----------------------------------------------------------------
88
+ * Tier 1 — SEEDS
89
+ * Brand-hue + chroma drive primary, neutral, surfaces, inputs,
90
+ * solid buttons. One slider rebrands the page.
91
+ * --------------------------------------------------------------*/
92
+
93
+ --ty-brand-hue: 230;
94
+ --ty-brand-chroma: 0.13;
95
+
96
+ /* Secondary rotates from brand by an exposed offset. Default +60°
97
+ * (sibling accent). Try 30° for a close sibling, 120° for triadic,
98
+ * 180° for complement. Set --ty-secondary-hue to a literal number
99
+ * to detach completely. */
100
+ --ty-secondary-offset: 60;
101
+
102
+ /* ----------------------------------------------------------------
103
+ * Tier 2 — PER-FLAVOR ANCHORS
104
+ * Semantic colors (success/warning/danger/neutral) have their own
105
+ * hue + chroma seeds so they keep meaning across brand changes.
106
+ * Override any individually:
107
+ * --ty-success-hue: 160; (more teal)
108
+ * --ty-warning-chroma: 0.2; (more vivid)
109
+ * --------------------------------------------------------------*/
110
+
111
+ --ty-secondary-hue: calc(var(--ty-brand-hue) + var(--ty-secondary-offset));
112
+ --ty-secondary-chroma: var(--ty-brand-chroma);
113
+
114
+ --ty-success-hue: 145;
115
+ --ty-success-chroma: calc(var(--ty-brand-chroma) * 1.08);
116
+
117
+ --ty-warning-hue: 75;
118
+ --ty-warning-chroma: calc(var(--ty-brand-chroma) * 2);
119
+
120
+ --ty-danger-hue: 25;
121
+ --ty-danger-chroma: calc(var(--ty-brand-chroma) * 1.31);
122
+
123
+ --ty-neutral-hue: var(--ty-brand-hue);
124
+ --ty-neutral-chroma: calc(var(--ty-brand-chroma) * 0.04);
125
+
126
+ /* ----------------------------------------------------------------
127
+ * Tier 3 — L-CURVE (light mode)
128
+ * 5 lightness stops per flavor for the emphasis ramp.
129
+ * Lower L = darker = more emphasis in light mode.
130
+ * Plus 3 bg L stops for the soft-tint backgrounds.
131
+ * --------------------------------------------------------------*/
132
+
133
+ --ty-l-strong: 0.38; /* ++ max emphasis */
134
+ --ty-l-bold: 0.46; /* + high emphasis */
135
+ --ty-l-base: 0.54; /* body */
136
+ --ty-l-soft: 0.72; /* - low emphasis */
137
+ --ty-l-faint: 0.88; /* -- min emphasis */
138
+
139
+ --ty-l-bg-base: 0.96;
140
+ --ty-l-bg-bold: 0.92;
141
+ --ty-l-bg-soft: 0.98;
142
+
143
+ /* ----------------------------------------------------------------
144
+ * Tier 4 — SATURATION CURVE
145
+ * Per-shade chroma multipliers. Each shade's chroma =
146
+ * flavor-chroma × multiplier. Drops near the extremes so
147
+ * near-white and near-black can hold their tint.
148
+ * --------------------------------------------------------------*/
149
+
150
+ --ty-c-strong-mult: 0.77;
151
+ --ty-c-bold-mult: 1;
152
+ --ty-c-base-mult: 0.92;
153
+ --ty-c-soft-mult: 0.77;
154
+ --ty-c-faint-mult: 0.46;
155
+
156
+ --ty-c-bg-base-mult: 0.15;
157
+ --ty-c-bg-bold-mult: 0.38;
158
+ --ty-c-bg-soft-mult: 0.08;
159
+
160
+ /* ----------------------------------------------------------------
161
+ * Tier 5 — PER-FLAVOR L-FACTOR
162
+ * Multiplies the L-curve values for that flavor only. Default 1 =
163
+ * no change. Useful when one flavor's brand-default sits too close
164
+ * to brand-hue on the wheel and the buttons blend.
165
+ *
166
+ * Example: brand-hue: 47° (gold). Warning sits at 75° (amber).
167
+ * Both render as similar warm browns at brand-chroma. Drop warning
168
+ * a notch and it darkens enough to stand apart:
169
+ * --ty-warning-l-factor: 0.85;
170
+ *
171
+ * NOTE: the L-curve flips between light and dark mode, so a factor
172
+ * < 1 darkens in light mode but DIMS in dark mode. If you want
173
+ * symmetric "more emphatic" in both modes, set the factor here for
174
+ * light AND set its inverse (1 / factor, roughly) in `html.dark`.
175
+ * --------------------------------------------------------------*/
176
+
177
+ --ty-primary-l-factor: 1;
178
+ --ty-secondary-l-factor: 1;
179
+ --ty-success-l-factor: 1;
180
+ --ty-warning-l-factor: 1.15;
181
+ --ty-danger-l-factor: 1;
182
+ --ty-neutral-l-factor: 1;
183
+ }
184
+
185
+ /* Dark mode overrides for the L-curve and saturation curve. Tier 1 + 2
186
+ * seeds and Tier 5 L-factors carry through unchanged from :root. */
187
+ html.dark,
188
+ html[data-theme="dark"] {
189
+ /* Tier 3 dark — inverted curve. Higher L = lighter text = more
190
+ * emphasis on a dark background. */
191
+ --ty-l-strong: 0.86;
192
+ --ty-l-bold: 0.74;
193
+ --ty-l-base: 0.62;
194
+ --ty-l-soft: 0.46;
195
+ --ty-l-faint: 0.3;
196
+
197
+ --ty-l-bg-base: 0.22;
198
+ --ty-l-bg-bold: 0.26;
199
+ --ty-l-bg-soft: 0.19;
200
+
201
+ /* Tier 4 dark — dim shades hold more chroma so they don't grey out;
202
+ * strong shades trim chroma so bright tones don't over-pop. */
203
+ --ty-c-strong-mult: 0.77;
204
+ --ty-c-bold-mult: 1;
205
+ --ty-c-base-mult: 0.92;
206
+ --ty-c-soft-mult: 0.77;
207
+ --ty-c-faint-mult: 0.5;
208
+
209
+ --ty-c-bg-base-mult: 0.38;
210
+ --ty-c-bg-bold-mult: 0.54;
211
+ --ty-c-bg-soft-mult: 0.23;
212
+ }
213
+
214
+ /* =====================================================================
215
+ * SECTION 2 — IMPLEMENTATION
216
+ * =====================================================================
217
+ *
218
+ * The oklch() expressions that turn Section 1's knobs into the actual
219
+ * --ty-color-*, --ty-bg-*, --ty-border-*, --ty-surface-*, --ty-input-*,
220
+ * and --ty-solid-* tokens that components read.
221
+ *
222
+ * Pattern for each flavor's 5-shade fg ramp + 3-shade bg ramp:
223
+ *
224
+ * --ty-color-{flavor}-{shade}: oklch(
225
+ * calc(var(--ty-l-{shade}) * var(--ty-{flavor}-l-factor)) ← L
226
+ * calc(var(--ty-{flavor}-chroma) * var(--ty-c-{shade}-mult)) ← C
227
+ * var(--ty-{flavor}-hue) ← H
228
+ * );
229
+ *
230
+ * Computed tokens are declared in BOTH `:root` and `html.dark` blocks
231
+ * because tyrell.css ships hardcoded dark-mode hexes at html.dark
232
+ * specificity (0,1,1); our brand-layer `:root` (0,1,0) would lose
233
+ * source-order otherwise. Same math both blocks — just different L/C
234
+ * inputs from Tier 3/4.
235
+ * ===================================================================== */
236
+
237
+ :root {
238
+ /* ----------------------------------------------------------------
239
+ * Flavor color ramps (fg + bg + border)
240
+ * --------------------------------------------------------------*/
241
+
242
+ /* Primary */
243
+ --ty-color-primary-strong: oklch(
244
+ calc(var(--ty-l-strong) * var(--ty-primary-l-factor))
245
+ calc(var(--ty-brand-chroma) * var(--ty-c-strong-mult)) var(--ty-brand-hue)
246
+ );
247
+ --ty-color-primary-bold: oklch(
248
+ calc(var(--ty-l-bold) * var(--ty-primary-l-factor))
249
+ calc(var(--ty-brand-chroma) * var(--ty-c-bold-mult)) var(--ty-brand-hue)
250
+ );
251
+ --ty-color-primary: oklch(
252
+ calc(var(--ty-l-base) * var(--ty-primary-l-factor))
253
+ calc(var(--ty-brand-chroma) * var(--ty-c-base-mult)) var(--ty-brand-hue)
254
+ );
255
+ --ty-color-primary-soft: oklch(
256
+ calc(var(--ty-l-soft) * var(--ty-primary-l-factor))
257
+ calc(var(--ty-brand-chroma) * var(--ty-c-soft-mult)) var(--ty-brand-hue)
258
+ );
259
+ --ty-color-primary-faint: oklch(
260
+ calc(var(--ty-l-faint) * var(--ty-primary-l-factor))
261
+ calc(var(--ty-brand-chroma) * var(--ty-c-faint-mult)) var(--ty-brand-hue)
262
+ );
263
+ --ty-bg-primary: oklch(
264
+ calc(var(--ty-l-bg-base) * var(--ty-primary-l-factor))
265
+ calc(var(--ty-brand-chroma) * var(--ty-c-bg-base-mult))
266
+ var(--ty-brand-hue)
267
+ );
268
+ --ty-bg-primary-bold: oklch(
269
+ calc(var(--ty-l-bg-bold) * var(--ty-primary-l-factor))
270
+ calc(var(--ty-brand-chroma) * var(--ty-c-bg-bold-mult))
271
+ var(--ty-brand-hue)
272
+ );
273
+ --ty-bg-primary-soft: oklch(
274
+ calc(var(--ty-l-bg-soft) * var(--ty-primary-l-factor))
275
+ calc(var(--ty-brand-chroma) * var(--ty-c-bg-soft-mult))
276
+ var(--ty-brand-hue)
277
+ );
278
+ --ty-border-primary: var(--ty-color-primary-soft);
279
+
280
+ /* Secondary */
281
+ --ty-color-secondary-strong: oklch(
282
+ calc(var(--ty-l-strong) * var(--ty-secondary-l-factor))
283
+ calc(var(--ty-secondary-chroma) * var(--ty-c-strong-mult))
284
+ var(--ty-secondary-hue)
285
+ );
286
+ --ty-color-secondary-bold: oklch(
287
+ calc(var(--ty-l-bold) * var(--ty-secondary-l-factor))
288
+ calc(var(--ty-secondary-chroma) * var(--ty-c-bold-mult))
289
+ var(--ty-secondary-hue)
290
+ );
291
+ --ty-color-secondary: oklch(
292
+ calc(var(--ty-l-base) * var(--ty-secondary-l-factor))
293
+ calc(var(--ty-secondary-chroma) * var(--ty-c-base-mult))
294
+ var(--ty-secondary-hue)
295
+ );
296
+ --ty-color-secondary-soft: oklch(
297
+ calc(var(--ty-l-soft) * var(--ty-secondary-l-factor))
298
+ calc(var(--ty-secondary-chroma) * var(--ty-c-soft-mult))
299
+ var(--ty-secondary-hue)
300
+ );
301
+ --ty-color-secondary-faint: oklch(
302
+ calc(var(--ty-l-faint) * var(--ty-secondary-l-factor))
303
+ calc(var(--ty-secondary-chroma) * var(--ty-c-faint-mult))
304
+ var(--ty-secondary-hue)
305
+ );
306
+ --ty-bg-secondary: oklch(
307
+ calc(var(--ty-l-bg-base) * var(--ty-secondary-l-factor))
308
+ calc(var(--ty-secondary-chroma) * var(--ty-c-bg-base-mult))
309
+ var(--ty-secondary-hue)
310
+ );
311
+ --ty-bg-secondary-bold: oklch(
312
+ calc(var(--ty-l-bg-bold) * var(--ty-secondary-l-factor))
313
+ calc(var(--ty-secondary-chroma) * var(--ty-c-bg-bold-mult))
314
+ var(--ty-secondary-hue)
315
+ );
316
+ --ty-bg-secondary-soft: oklch(
317
+ calc(var(--ty-l-bg-soft) * var(--ty-secondary-l-factor))
318
+ calc(var(--ty-secondary-chroma) * var(--ty-c-bg-soft-mult))
319
+ var(--ty-secondary-hue)
320
+ );
321
+ --ty-border-secondary: var(--ty-color-secondary-soft);
322
+
323
+ /* Success */
324
+ --ty-color-success-strong: oklch(
325
+ calc(var(--ty-l-strong) * var(--ty-success-l-factor))
326
+ calc(var(--ty-success-chroma) * var(--ty-c-strong-mult))
327
+ var(--ty-success-hue)
328
+ );
329
+ --ty-color-success-bold: oklch(
330
+ calc(var(--ty-l-bold) * var(--ty-success-l-factor))
331
+ calc(var(--ty-success-chroma) * var(--ty-c-bold-mult))
332
+ var(--ty-success-hue)
333
+ );
334
+ --ty-color-success: oklch(
335
+ calc(var(--ty-l-base) * var(--ty-success-l-factor))
336
+ calc(var(--ty-success-chroma) * var(--ty-c-base-mult))
337
+ var(--ty-success-hue)
338
+ );
339
+ --ty-color-success-soft: oklch(
340
+ calc(var(--ty-l-soft) * var(--ty-success-l-factor))
341
+ calc(var(--ty-success-chroma) * var(--ty-c-soft-mult))
342
+ var(--ty-success-hue)
343
+ );
344
+ --ty-color-success-faint: oklch(
345
+ calc(var(--ty-l-faint) * var(--ty-success-l-factor))
346
+ calc(var(--ty-success-chroma) * var(--ty-c-faint-mult))
347
+ var(--ty-success-hue)
348
+ );
349
+ --ty-bg-success: oklch(
350
+ calc(var(--ty-l-bg-base) * var(--ty-success-l-factor))
351
+ calc(var(--ty-success-chroma) * var(--ty-c-bg-base-mult))
352
+ var(--ty-success-hue)
353
+ );
354
+ --ty-bg-success-bold: oklch(
355
+ calc(var(--ty-l-bg-bold) * var(--ty-success-l-factor))
356
+ calc(var(--ty-success-chroma) * var(--ty-c-bg-bold-mult))
357
+ var(--ty-success-hue)
358
+ );
359
+ --ty-bg-success-soft: oklch(
360
+ calc(var(--ty-l-bg-soft) * var(--ty-success-l-factor))
361
+ calc(var(--ty-success-chroma) * var(--ty-c-bg-soft-mult))
362
+ var(--ty-success-hue)
363
+ );
364
+ --ty-border-success: var(--ty-color-success-soft);
365
+
366
+ /* Danger */
367
+ --ty-color-danger-strong: oklch(
368
+ calc(var(--ty-l-strong) * var(--ty-danger-l-factor))
369
+ calc(var(--ty-danger-chroma) * var(--ty-c-strong-mult))
370
+ var(--ty-danger-hue)
371
+ );
372
+ --ty-color-danger-bold: oklch(
373
+ calc(var(--ty-l-bold) * var(--ty-danger-l-factor))
374
+ calc(var(--ty-danger-chroma) * var(--ty-c-bold-mult)) var(--ty-danger-hue)
375
+ );
376
+ --ty-color-danger: oklch(
377
+ calc(var(--ty-l-base) * var(--ty-danger-l-factor))
378
+ calc(var(--ty-danger-chroma) * var(--ty-c-base-mult)) var(--ty-danger-hue)
379
+ );
380
+ --ty-color-danger-soft: oklch(
381
+ calc(var(--ty-l-soft) * var(--ty-danger-l-factor))
382
+ calc(var(--ty-danger-chroma) * var(--ty-c-soft-mult)) var(--ty-danger-hue)
383
+ );
384
+ --ty-color-danger-faint: oklch(
385
+ calc(var(--ty-l-faint) * var(--ty-danger-l-factor))
386
+ calc(var(--ty-danger-chroma) * var(--ty-c-faint-mult))
387
+ var(--ty-danger-hue)
388
+ );
389
+ --ty-bg-danger: oklch(
390
+ calc(var(--ty-l-bg-base) * var(--ty-danger-l-factor))
391
+ calc(var(--ty-danger-chroma) * var(--ty-c-bg-base-mult))
392
+ var(--ty-danger-hue)
393
+ );
394
+ --ty-bg-danger-bold: oklch(
395
+ calc(var(--ty-l-bg-bold) * var(--ty-danger-l-factor))
396
+ calc(var(--ty-danger-chroma) * var(--ty-c-bg-bold-mult))
397
+ var(--ty-danger-hue)
398
+ );
399
+ --ty-bg-danger-soft: oklch(
400
+ calc(var(--ty-l-bg-soft) * var(--ty-danger-l-factor))
401
+ calc(var(--ty-danger-chroma) * var(--ty-c-bg-soft-mult))
402
+ var(--ty-danger-hue)
403
+ );
404
+ --ty-border-danger: var(--ty-color-danger-soft);
405
+
406
+ /* Warning */
407
+ --ty-color-warning-strong: oklch(
408
+ calc(var(--ty-l-strong) * var(--ty-warning-l-factor))
409
+ calc(var(--ty-warning-chroma) * var(--ty-c-strong-mult))
410
+ var(--ty-warning-hue)
411
+ );
412
+ --ty-color-warning-bold: oklch(
413
+ calc(var(--ty-l-bold) * var(--ty-warning-l-factor))
414
+ calc(var(--ty-warning-chroma) * var(--ty-c-bold-mult))
415
+ var(--ty-warning-hue)
416
+ );
417
+ --ty-color-warning: oklch(
418
+ calc(var(--ty-l-base) * var(--ty-warning-l-factor))
419
+ calc(var(--ty-warning-chroma) * var(--ty-c-base-mult))
420
+ var(--ty-warning-hue)
421
+ );
422
+ --ty-color-warning-soft: oklch(
423
+ calc(var(--ty-l-soft) * var(--ty-warning-l-factor))
424
+ calc(var(--ty-warning-chroma) * var(--ty-c-soft-mult))
425
+ var(--ty-warning-hue)
426
+ );
427
+ --ty-color-warning-faint: oklch(
428
+ calc(var(--ty-l-faint) * var(--ty-warning-l-factor))
429
+ calc(var(--ty-warning-chroma) * var(--ty-c-faint-mult))
430
+ var(--ty-warning-hue)
431
+ );
432
+ --ty-bg-warning: oklch(
433
+ calc(var(--ty-l-bg-base) * var(--ty-warning-l-factor))
434
+ calc(var(--ty-warning-chroma) * var(--ty-c-bg-base-mult))
435
+ var(--ty-warning-hue)
436
+ );
437
+ --ty-bg-warning-bold: oklch(
438
+ calc(var(--ty-l-bg-bold) * var(--ty-warning-l-factor))
439
+ calc(var(--ty-warning-chroma) * var(--ty-c-bg-bold-mult))
440
+ var(--ty-warning-hue)
441
+ );
442
+ --ty-bg-warning-soft: oklch(
443
+ calc(var(--ty-l-bg-soft) * var(--ty-warning-l-factor))
444
+ calc(var(--ty-warning-chroma) * var(--ty-c-bg-soft-mult))
445
+ var(--ty-warning-hue)
446
+ );
447
+ --ty-border-warning: var(--ty-color-warning-soft);
448
+
449
+ /* Neutral — same L curve, near-zero chroma so the grey scale stays grey. */
450
+ --ty-color-neutral-strong: oklch(
451
+ calc(var(--ty-l-strong) * var(--ty-neutral-l-factor))
452
+ calc(var(--ty-neutral-chroma) * var(--ty-c-strong-mult))
453
+ var(--ty-neutral-hue)
454
+ );
455
+ --ty-color-neutral-bold: oklch(
456
+ calc(var(--ty-l-bold) * var(--ty-neutral-l-factor))
457
+ calc(var(--ty-neutral-chroma) * var(--ty-c-bold-mult))
458
+ var(--ty-neutral-hue)
459
+ );
460
+ --ty-color-neutral: oklch(
461
+ calc(var(--ty-l-base) * var(--ty-neutral-l-factor))
462
+ calc(var(--ty-neutral-chroma) * var(--ty-c-base-mult))
463
+ var(--ty-neutral-hue)
464
+ );
465
+ --ty-color-neutral-soft: oklch(
466
+ calc(var(--ty-l-soft) * var(--ty-neutral-l-factor))
467
+ calc(var(--ty-neutral-chroma) * var(--ty-c-soft-mult))
468
+ var(--ty-neutral-hue)
469
+ );
470
+ --ty-color-neutral-faint: oklch(
471
+ calc(var(--ty-l-faint) * var(--ty-neutral-l-factor))
472
+ calc(var(--ty-neutral-chroma) * var(--ty-c-faint-mult))
473
+ var(--ty-neutral-hue)
474
+ );
475
+ --ty-bg-neutral: oklch(
476
+ calc(var(--ty-l-bg-base) * var(--ty-neutral-l-factor))
477
+ calc(var(--ty-neutral-chroma) * var(--ty-c-bg-base-mult))
478
+ var(--ty-neutral-hue)
479
+ );
480
+ --ty-bg-neutral-bold: oklch(
481
+ calc(var(--ty-l-bg-bold) * var(--ty-neutral-l-factor))
482
+ calc(var(--ty-neutral-chroma) * var(--ty-c-bg-bold-mult))
483
+ var(--ty-neutral-hue)
484
+ );
485
+ --ty-bg-neutral-soft: oklch(
486
+ calc(var(--ty-l-bg-soft) * var(--ty-neutral-l-factor))
487
+ calc(var(--ty-neutral-chroma) * var(--ty-c-bg-soft-mult))
488
+ var(--ty-neutral-hue)
489
+ );
490
+ --ty-bg-neutral-strong: oklch(
491
+ 0.25 calc(var(--ty-neutral-chroma) * 2) var(--ty-neutral-hue)
492
+ );
493
+ --ty-bg-neutral-faint: oklch(
494
+ 0.99 calc(var(--ty-neutral-chroma) * 0.4) var(--ty-neutral-hue)
495
+ );
496
+
497
+ /* ----------------------------------------------------------------
498
+ * Global neutral borders — read off the neutral color ramp.
499
+ * --------------------------------------------------------------*/
500
+ --ty-border-strong: var(--ty-color-neutral-bold);
501
+ --ty-border: var(--ty-color-neutral-soft);
502
+ --ty-border-bold: var(--ty-color-neutral-soft);
503
+ --ty-border-soft: var(--ty-color-neutral-faint);
504
+ --ty-border-faint: var(--ty-color-neutral-faint);
505
+
506
+ /* ----------------------------------------------------------------
507
+ * Surfaces — canvas tinted slightly toward brand for warmth.
508
+ * --------------------------------------------------------------*/
509
+ --ty-surface-canvas: oklch(0.985 0.005 var(--ty-brand-hue));
510
+ --ty-surface-content: oklch(1 0 0);
511
+ --ty-surface-elevated: oklch(1 0 0);
512
+ --ty-surface-floating: oklch(1 0 0);
513
+ --ty-surface-input: oklch(1 0 0);
514
+
515
+ /* ----------------------------------------------------------------
516
+ * Inputs — tied to neutral ramp so form controls retint with brand.
517
+ * --------------------------------------------------------------*/
518
+ --ty-input-bg: var(--ty-surface-input);
519
+ --ty-input-color: var(--ty-color-neutral-strong);
520
+ --ty-input-border: var(--ty-color-neutral-soft);
521
+ --ty-input-border-hover: var(--ty-color-neutral-bold);
522
+ --ty-input-border-focus: var(--ty-color-primary);
523
+ --ty-input-placeholder: var(--ty-color-neutral-soft);
524
+ --ty-input-disabled-bg: var(--ty-color-neutral-faint);
525
+ --ty-input-disabled-border: var(--ty-color-neutral-faint);
526
+ --ty-input-disabled-color: var(--ty-color-neutral-bold);
527
+ --ty-input-shadow-focus: color-mix(
528
+ in oklab,
529
+ var(--ty-color-primary) 5%,
530
+ transparent
531
+ );
532
+
533
+ /* ----------------------------------------------------------------
534
+ * Solid buttons — re-route through --ty-color-*.
535
+ * --------------------------------------------------------------*/
536
+ --ty-solid-primary: var(--ty-color-primary);
537
+ --ty-solid-primary-strong: var(--ty-color-primary-bold);
538
+ --ty-solid-primary-soft: var(--ty-color-primary-soft);
539
+ --ty-solid-primary-fg: white;
540
+
541
+ --ty-solid-secondary: var(--ty-color-secondary);
542
+ --ty-solid-secondary-strong: var(--ty-color-secondary-bold);
543
+ --ty-solid-secondary-soft: var(--ty-color-secondary-soft);
544
+ --ty-solid-secondary-fg: white;
545
+
546
+ --ty-solid-success: var(--ty-color-success);
547
+ --ty-solid-success-strong: var(--ty-color-success-bold);
548
+ --ty-solid-success-soft: var(--ty-color-success-soft);
549
+ --ty-solid-success-fg: white;
550
+
551
+ --ty-solid-danger: var(--ty-color-danger);
552
+ --ty-solid-danger-strong: var(--ty-color-danger-bold);
553
+ --ty-solid-danger-soft: var(--ty-color-danger-soft);
554
+ --ty-solid-danger-fg: white;
555
+
556
+ --ty-solid-warning: var(--ty-color-warning);
557
+ --ty-solid-warning-strong: var(--ty-color-warning-bold);
558
+ --ty-solid-warning-soft: var(--ty-color-warning-soft);
559
+ --ty-solid-warning-fg: white;
560
+
561
+ /* Solid neutral routes to a darker shade than neutral-base. The "soft"
562
+ * solid-neutral softens to a mid-grey for inactive states. */
563
+ --ty-solid-neutral-soft: oklch(
564
+ 0.6 calc(var(--ty-neutral-chroma) * var(--ty-c-strong-mult))
565
+ var(--ty-neutral-hue)
566
+ );
567
+ --ty-solid-neutral: oklch(
568
+ 0.4 calc(var(--ty-neutral-chroma) * var(--ty-c-strong-mult))
569
+ var(--ty-neutral-hue)
570
+ );
571
+ --ty-solid-neutral-strong: oklch(
572
+ 0.2 calc(var(--ty-neutral-chroma) * var(--ty-c-strong-mult))
573
+ var(--ty-neutral-hue)
574
+ );
575
+ }
576
+
577
+ /* =====================================================================
578
+ * SECTION 2 DARK — same computations re-declared so html.dark (0,1,1)
579
+ * matches tyrell.css's hardcoded dark-mode hexes at source-order
580
+ * specificity. The math is identical to the :root block above; only
581
+ * the L/C inputs differ (from html.dark's Tier 3/4 overrides).
582
+ * ===================================================================== */
583
+
584
+ html.dark,
585
+ html[data-theme="dark"] {
586
+ /* Primary */
587
+ --ty-color-primary-strong: oklch(
588
+ calc(var(--ty-l-strong) * var(--ty-primary-l-factor))
589
+ calc(var(--ty-brand-chroma) * var(--ty-c-strong-mult)) var(--ty-brand-hue)
590
+ );
591
+ --ty-color-primary-bold: oklch(
592
+ calc(var(--ty-l-bold) * var(--ty-primary-l-factor))
593
+ calc(var(--ty-brand-chroma) * var(--ty-c-bold-mult)) var(--ty-brand-hue)
594
+ );
595
+ --ty-color-primary: oklch(
596
+ calc(var(--ty-l-base) * var(--ty-primary-l-factor))
597
+ calc(var(--ty-brand-chroma) * var(--ty-c-base-mult)) var(--ty-brand-hue)
598
+ );
599
+ --ty-color-primary-soft: oklch(
600
+ calc(var(--ty-l-soft) * var(--ty-primary-l-factor))
601
+ calc(var(--ty-brand-chroma) * var(--ty-c-soft-mult)) var(--ty-brand-hue)
602
+ );
603
+ --ty-color-primary-faint: oklch(
604
+ calc(var(--ty-l-faint) * var(--ty-primary-l-factor))
605
+ calc(var(--ty-brand-chroma) * var(--ty-c-faint-mult)) var(--ty-brand-hue)
606
+ );
607
+ --ty-bg-primary: oklch(
608
+ calc(var(--ty-l-bg-base) * var(--ty-primary-l-factor))
609
+ calc(var(--ty-brand-chroma) * var(--ty-c-bg-base-mult))
610
+ var(--ty-brand-hue)
611
+ );
612
+ --ty-bg-primary-bold: oklch(
613
+ calc(var(--ty-l-bg-bold) * var(--ty-primary-l-factor))
614
+ calc(var(--ty-brand-chroma) * var(--ty-c-bg-bold-mult))
615
+ var(--ty-brand-hue)
616
+ );
617
+ --ty-bg-primary-soft: oklch(
618
+ calc(var(--ty-l-bg-soft) * var(--ty-primary-l-factor))
619
+ calc(var(--ty-brand-chroma) * var(--ty-c-bg-soft-mult))
620
+ var(--ty-brand-hue)
621
+ );
622
+ --ty-border-primary: var(--ty-color-primary-soft);
623
+
624
+ /* Secondary */
625
+ --ty-color-secondary-strong: oklch(
626
+ calc(var(--ty-l-strong) * var(--ty-secondary-l-factor))
627
+ calc(var(--ty-secondary-chroma) * var(--ty-c-strong-mult))
628
+ var(--ty-secondary-hue)
629
+ );
630
+ --ty-color-secondary-bold: oklch(
631
+ calc(var(--ty-l-bold) * var(--ty-secondary-l-factor))
632
+ calc(var(--ty-secondary-chroma) * var(--ty-c-bold-mult))
633
+ var(--ty-secondary-hue)
634
+ );
635
+ --ty-color-secondary: oklch(
636
+ calc(var(--ty-l-base) * var(--ty-secondary-l-factor))
637
+ calc(var(--ty-secondary-chroma) * var(--ty-c-base-mult))
638
+ var(--ty-secondary-hue)
639
+ );
640
+ --ty-color-secondary-soft: oklch(
641
+ calc(var(--ty-l-soft) * var(--ty-secondary-l-factor))
642
+ calc(var(--ty-secondary-chroma) * var(--ty-c-soft-mult))
643
+ var(--ty-secondary-hue)
644
+ );
645
+ --ty-color-secondary-faint: oklch(
646
+ calc(var(--ty-l-faint) * var(--ty-secondary-l-factor))
647
+ calc(var(--ty-secondary-chroma) * var(--ty-c-faint-mult))
648
+ var(--ty-secondary-hue)
649
+ );
650
+ --ty-bg-secondary: oklch(
651
+ calc(var(--ty-l-bg-base) * var(--ty-secondary-l-factor))
652
+ calc(var(--ty-secondary-chroma) * var(--ty-c-bg-base-mult))
653
+ var(--ty-secondary-hue)
654
+ );
655
+ --ty-bg-secondary-bold: oklch(
656
+ calc(var(--ty-l-bg-bold) * var(--ty-secondary-l-factor))
657
+ calc(var(--ty-secondary-chroma) * var(--ty-c-bg-bold-mult))
658
+ var(--ty-secondary-hue)
659
+ );
660
+ --ty-bg-secondary-soft: oklch(
661
+ calc(var(--ty-l-bg-soft) * var(--ty-secondary-l-factor))
662
+ calc(var(--ty-secondary-chroma) * var(--ty-c-bg-soft-mult))
663
+ var(--ty-secondary-hue)
664
+ );
665
+ --ty-border-secondary: var(--ty-color-secondary-soft);
666
+
667
+ /* Success */
668
+ --ty-color-success-strong: oklch(
669
+ calc(var(--ty-l-strong) * var(--ty-success-l-factor))
670
+ calc(var(--ty-success-chroma) * var(--ty-c-strong-mult))
671
+ var(--ty-success-hue)
672
+ );
673
+ --ty-color-success-bold: oklch(
674
+ calc(var(--ty-l-bold) * var(--ty-success-l-factor))
675
+ calc(var(--ty-success-chroma) * var(--ty-c-bold-mult))
676
+ var(--ty-success-hue)
677
+ );
678
+ --ty-color-success: oklch(
679
+ calc(var(--ty-l-base) * var(--ty-success-l-factor))
680
+ calc(var(--ty-success-chroma) * var(--ty-c-base-mult))
681
+ var(--ty-success-hue)
682
+ );
683
+ --ty-color-success-soft: oklch(
684
+ calc(var(--ty-l-soft) * var(--ty-success-l-factor))
685
+ calc(var(--ty-success-chroma) * var(--ty-c-soft-mult))
686
+ var(--ty-success-hue)
687
+ );
688
+ --ty-color-success-faint: oklch(
689
+ calc(var(--ty-l-faint) * var(--ty-success-l-factor))
690
+ calc(var(--ty-success-chroma) * var(--ty-c-faint-mult))
691
+ var(--ty-success-hue)
692
+ );
693
+ --ty-bg-success: oklch(
694
+ calc(var(--ty-l-bg-base) * var(--ty-success-l-factor))
695
+ calc(var(--ty-success-chroma) * var(--ty-c-bg-base-mult))
696
+ var(--ty-success-hue)
697
+ );
698
+ --ty-bg-success-bold: oklch(
699
+ calc(var(--ty-l-bg-bold) * var(--ty-success-l-factor))
700
+ calc(var(--ty-success-chroma) * var(--ty-c-bg-bold-mult))
701
+ var(--ty-success-hue)
702
+ );
703
+ --ty-bg-success-soft: oklch(
704
+ calc(var(--ty-l-bg-soft) * var(--ty-success-l-factor))
705
+ calc(var(--ty-success-chroma) * var(--ty-c-bg-soft-mult))
706
+ var(--ty-success-hue)
707
+ );
708
+ --ty-border-success: var(--ty-color-success-soft);
709
+
710
+ /* Danger */
711
+ --ty-color-danger-strong: oklch(
712
+ calc(var(--ty-l-strong) * var(--ty-danger-l-factor))
713
+ calc(var(--ty-danger-chroma) * var(--ty-c-strong-mult))
714
+ var(--ty-danger-hue)
715
+ );
716
+ --ty-color-danger-bold: oklch(
717
+ calc(var(--ty-l-bold) * var(--ty-danger-l-factor))
718
+ calc(var(--ty-danger-chroma) * var(--ty-c-bold-mult)) var(--ty-danger-hue)
719
+ );
720
+ --ty-color-danger: oklch(
721
+ calc(var(--ty-l-base) * var(--ty-danger-l-factor))
722
+ calc(var(--ty-danger-chroma) * var(--ty-c-base-mult)) var(--ty-danger-hue)
723
+ );
724
+ --ty-color-danger-soft: oklch(
725
+ calc(var(--ty-l-soft) * var(--ty-danger-l-factor))
726
+ calc(var(--ty-danger-chroma) * var(--ty-c-soft-mult)) var(--ty-danger-hue)
727
+ );
728
+ --ty-color-danger-faint: oklch(
729
+ calc(var(--ty-l-faint) * var(--ty-danger-l-factor))
730
+ calc(var(--ty-danger-chroma) * var(--ty-c-faint-mult))
731
+ var(--ty-danger-hue)
732
+ );
733
+ --ty-bg-danger: oklch(
734
+ calc(var(--ty-l-bg-base) * var(--ty-danger-l-factor))
735
+ calc(var(--ty-danger-chroma) * var(--ty-c-bg-base-mult))
736
+ var(--ty-danger-hue)
737
+ );
738
+ --ty-bg-danger-bold: oklch(
739
+ calc(var(--ty-l-bg-bold) * var(--ty-danger-l-factor))
740
+ calc(var(--ty-danger-chroma) * var(--ty-c-bg-bold-mult))
741
+ var(--ty-danger-hue)
742
+ );
743
+ --ty-bg-danger-soft: oklch(
744
+ calc(var(--ty-l-bg-soft) * var(--ty-danger-l-factor))
745
+ calc(var(--ty-danger-chroma) * var(--ty-c-bg-soft-mult))
746
+ var(--ty-danger-hue)
747
+ );
748
+ --ty-border-danger: var(--ty-color-danger-soft);
749
+
750
+ /* Warning */
751
+ --ty-color-warning-strong: oklch(
752
+ calc(var(--ty-l-strong) * var(--ty-warning-l-factor))
753
+ calc(var(--ty-warning-chroma) * var(--ty-c-strong-mult))
754
+ var(--ty-warning-hue)
755
+ );
756
+ --ty-color-warning-bold: oklch(
757
+ calc(var(--ty-l-bold) * var(--ty-warning-l-factor))
758
+ calc(var(--ty-warning-chroma) * var(--ty-c-bold-mult))
759
+ var(--ty-warning-hue)
760
+ );
761
+ --ty-color-warning: oklch(
762
+ calc(var(--ty-l-base) * var(--ty-warning-l-factor))
763
+ calc(var(--ty-warning-chroma) * var(--ty-c-base-mult))
764
+ var(--ty-warning-hue)
765
+ );
766
+ --ty-color-warning-soft: oklch(
767
+ calc(var(--ty-l-soft) * var(--ty-warning-l-factor))
768
+ calc(var(--ty-warning-chroma) * var(--ty-c-soft-mult))
769
+ var(--ty-warning-hue)
770
+ );
771
+ --ty-color-warning-faint: oklch(
772
+ calc(var(--ty-l-faint) * var(--ty-warning-l-factor))
773
+ calc(var(--ty-warning-chroma) * var(--ty-c-faint-mult))
774
+ var(--ty-warning-hue)
775
+ );
776
+ --ty-bg-warning: oklch(
777
+ calc(var(--ty-l-bg-base) * var(--ty-warning-l-factor))
778
+ calc(var(--ty-warning-chroma) * var(--ty-c-bg-base-mult))
779
+ var(--ty-warning-hue)
780
+ );
781
+ --ty-bg-warning-bold: oklch(
782
+ calc(var(--ty-l-bg-bold) * var(--ty-warning-l-factor))
783
+ calc(var(--ty-warning-chroma) * var(--ty-c-bg-bold-mult))
784
+ var(--ty-warning-hue)
785
+ );
786
+ --ty-bg-warning-soft: oklch(
787
+ calc(var(--ty-l-bg-soft) * var(--ty-warning-l-factor))
788
+ calc(var(--ty-warning-chroma) * var(--ty-c-bg-soft-mult))
789
+ var(--ty-warning-hue)
790
+ );
791
+ --ty-border-warning: var(--ty-color-warning-soft);
792
+
793
+ /* Neutral */
794
+ --ty-color-neutral-strong: oklch(
795
+ calc(var(--ty-l-strong) * var(--ty-neutral-l-factor))
796
+ calc(var(--ty-neutral-chroma) * var(--ty-c-strong-mult))
797
+ var(--ty-neutral-hue)
798
+ );
799
+ --ty-color-neutral-bold: oklch(
800
+ calc(var(--ty-l-bold) * var(--ty-neutral-l-factor))
801
+ calc(var(--ty-neutral-chroma) * var(--ty-c-bold-mult))
802
+ var(--ty-neutral-hue)
803
+ );
804
+ --ty-color-neutral: oklch(
805
+ calc(var(--ty-l-base) * var(--ty-neutral-l-factor))
806
+ calc(var(--ty-neutral-chroma) * var(--ty-c-base-mult))
807
+ var(--ty-neutral-hue)
808
+ );
809
+ --ty-color-neutral-soft: oklch(
810
+ calc(var(--ty-l-soft) * var(--ty-neutral-l-factor))
811
+ calc(var(--ty-neutral-chroma) * var(--ty-c-soft-mult))
812
+ var(--ty-neutral-hue)
813
+ );
814
+ --ty-color-neutral-faint: oklch(
815
+ calc(var(--ty-l-faint) * var(--ty-neutral-l-factor))
816
+ calc(var(--ty-neutral-chroma) * var(--ty-c-faint-mult))
817
+ var(--ty-neutral-hue)
818
+ );
819
+ --ty-bg-neutral: oklch(
820
+ calc(var(--ty-l-bg-base) * var(--ty-neutral-l-factor))
821
+ calc(var(--ty-neutral-chroma) * var(--ty-c-bg-base-mult))
822
+ var(--ty-neutral-hue)
823
+ );
824
+ --ty-bg-neutral-bold: oklch(
825
+ calc(var(--ty-l-bg-bold) * var(--ty-neutral-l-factor))
826
+ calc(var(--ty-neutral-chroma) * var(--ty-c-bg-bold-mult))
827
+ var(--ty-neutral-hue)
828
+ );
829
+ --ty-bg-neutral-soft: oklch(
830
+ calc(var(--ty-l-bg-soft) * var(--ty-neutral-l-factor))
831
+ calc(var(--ty-neutral-chroma) * var(--ty-c-bg-soft-mult))
832
+ var(--ty-neutral-hue)
833
+ );
834
+ --ty-bg-neutral-strong: oklch(
835
+ 0.95 calc(var(--ty-neutral-chroma) * 2) var(--ty-neutral-hue)
836
+ );
837
+ --ty-bg-neutral-faint: oklch(
838
+ 0.15 calc(var(--ty-neutral-chroma) * 2) var(--ty-neutral-hue)
839
+ );
840
+
841
+ /* Global neutral borders */
842
+ --ty-border-strong: var(--ty-color-neutral-bold);
843
+ --ty-border: var(--ty-color-neutral-soft);
844
+ --ty-border-bold: var(--ty-color-neutral-soft);
845
+ --ty-border-soft: var(--ty-color-neutral-faint);
846
+ --ty-border-faint: var(--ty-color-neutral-faint);
847
+
848
+ /* Surfaces — flip dark with a hint of brand chroma. */
849
+ --ty-surface-canvas: oklch(0.12 0.012 var(--ty-brand-hue));
850
+ --ty-surface-content: oklch(0.16 0.012 var(--ty-brand-hue));
851
+ --ty-surface-elevated: oklch(0.19 0.013 var(--ty-brand-hue));
852
+ --ty-surface-floating: oklch(0.22 0.015 var(--ty-brand-hue));
853
+ --ty-surface-input: oklch(0.18 0.012 var(--ty-brand-hue));
854
+
855
+ /* Inputs — re-declared at html.dark specificity. */
856
+ --ty-input-bg: var(--ty-surface-input);
857
+ --ty-input-color: var(--ty-color-neutral-strong);
858
+ --ty-input-border: var(--ty-color-neutral-faint);
859
+ --ty-input-border-hover: var(--ty-color-neutral-bold);
860
+ --ty-input-border-focus: var(--ty-color-primary);
861
+ --ty-input-placeholder: var(--ty-color-neutral-soft);
862
+ --ty-input-disabled-bg: var(--ty-color-neutral-faint);
863
+ --ty-input-disabled-border: var(--ty-color-neutral-faint);
864
+ --ty-input-disabled-color: var(--ty-color-neutral-bold);
865
+ --ty-input-shadow-focus: color-mix(
866
+ in oklab,
867
+ var(--ty-color-primary) 20%,
868
+ transparent
869
+ );
870
+
871
+ /* Solid buttons */
872
+ --ty-solid-primary: var(--ty-color-primary);
873
+ --ty-solid-primary-strong: var(--ty-color-primary-bold);
874
+ --ty-solid-primary-soft: var(--ty-color-primary-soft);
875
+ --ty-solid-primary-fg: white;
876
+
877
+ --ty-solid-secondary: var(--ty-color-secondary);
878
+ --ty-solid-secondary-strong: var(--ty-color-secondary-bold);
879
+ --ty-solid-secondary-soft: var(--ty-color-secondary-soft);
880
+ --ty-solid-secondary-fg: white;
881
+
882
+ --ty-solid-success: var(--ty-color-success);
883
+ --ty-solid-success-strong: var(--ty-color-success-bold);
884
+ --ty-solid-success-soft: var(--ty-color-success-soft);
885
+ --ty-solid-success-fg: white;
886
+
887
+ --ty-solid-danger: var(--ty-color-danger);
888
+ --ty-solid-danger-strong: var(--ty-color-danger-bold);
889
+ --ty-solid-danger-soft: var(--ty-color-danger-soft);
890
+ --ty-solid-danger-fg: white;
891
+
892
+ --ty-solid-warning: var(--ty-color-warning);
893
+ --ty-solid-warning-strong: var(--ty-color-warning-bold);
894
+ --ty-solid-warning-soft: var(--ty-color-warning-soft);
895
+ --ty-solid-warning-fg: white;
896
+
897
+ /* Solid neutral — in dark mode, "dark grey" lives at the other end
898
+ * of the ramp. Both modes get a shade darker than the page surface
899
+ * for a punchy default action. */
900
+ --ty-solid-neutral-soft: oklch(
901
+ 0.2 calc(var(--ty-neutral-chroma) * var(--ty-c-strong-mult))
902
+ var(--ty-neutral-hue)
903
+ );
904
+ --ty-solid-neutral: oklch(
905
+ 0.3 calc(var(--ty-neutral-chroma) * var(--ty-c-strong-mult))
906
+ var(--ty-neutral-hue)
907
+ );
908
+ --ty-solid-neutral-strong: oklch(
909
+ 0.4 calc(var(--ty-neutral-chroma) * var(--ty-c-strong-mult))
910
+ var(--ty-neutral-hue)
911
+ );
912
+ --ty-solid-neutral-fg: white;
913
+ }