tyrell-components 1.0.0-TC19 → 1.0.0-TC22

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 (53) hide show
  1. package/css/tyrell-brand.css +767 -0
  2. package/css/tyrell.css +64 -168
  3. package/dist/tyrell-brand.css +767 -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/calendar-month.d.ts +1 -1
  8. package/lib/styles/calendar-month.js +3 -3
  9. package/lib/styles/checkbox.d.ts +1 -1
  10. package/lib/styles/checkbox.d.ts.map +1 -1
  11. package/lib/styles/custom-scrollbar.d.ts +1 -1
  12. package/lib/styles/custom-scrollbar.d.ts.map +1 -1
  13. package/lib/styles/custom-scrollbar.js +8 -8
  14. package/lib/styles/date-picker.d.ts +1 -1
  15. package/lib/styles/date-picker.d.ts.map +1 -1
  16. package/lib/styles/date-picker.js +16 -16
  17. package/lib/styles/dropdown.d.ts +1 -1
  18. package/lib/styles/dropdown.d.ts.map +1 -1
  19. package/lib/styles/dropdown.js +7 -7
  20. package/lib/styles/input.d.ts +1 -1
  21. package/lib/styles/input.d.ts.map +1 -1
  22. package/lib/styles/input.js +16 -16
  23. package/lib/styles/multiselect.d.ts +1 -1
  24. package/lib/styles/multiselect.d.ts.map +1 -1
  25. package/lib/styles/multiselect.js +1 -1
  26. package/lib/styles/option.d.ts +1 -1
  27. package/lib/styles/option.js +1 -1
  28. package/lib/styles/radio.d.ts +1 -1
  29. package/lib/styles/radio.d.ts.map +1 -1
  30. package/lib/styles/scroll-container.d.ts +1 -1
  31. package/lib/styles/scroll-container.d.ts.map +1 -1
  32. package/lib/styles/scroll-container.js +10 -10
  33. package/lib/styles/step.d.ts +1 -1
  34. package/lib/styles/step.d.ts.map +1 -1
  35. package/lib/styles/switch.d.ts +1 -1
  36. package/lib/styles/switch.d.ts.map +1 -1
  37. package/lib/styles/tab.d.ts +1 -1
  38. package/lib/styles/tab.d.ts.map +1 -1
  39. package/lib/styles/tag.d.ts +1 -1
  40. package/lib/styles/tag.d.ts.map +1 -1
  41. package/lib/styles/tag.js +15 -15
  42. package/lib/styles/textarea.d.ts +1 -1
  43. package/lib/styles/textarea.js +1 -1
  44. package/lib/styles/tooltip.d.ts.map +1 -1
  45. package/lib/styles/tooltip.js +12 -15
  46. package/lib/styles/tooltip.js.map +1 -1
  47. package/lib/styles/wizard.d.ts +12 -7
  48. package/lib/styles/wizard.d.ts.map +1 -1
  49. package/lib/styles/wizard.js +46 -74
  50. package/lib/styles/wizard.js.map +1 -1
  51. package/lib/version.d.ts +1 -1
  52. package/lib/version.js +1 -1
  53. package/package.json +3 -3
@@ -0,0 +1,767 @@
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
+ * Primary, secondary, neutral, surfaces, inputs, solid buttons all retint.
16
+ * Success / danger / warning stay semantic (green / red / amber) — override
17
+ * their *-hue/*-chroma seeds if you want them to follow the brand too.
18
+ *
19
+ * Three layers of knobs you can override at :root (or html.dark for
20
+ * per-mode tuning):
21
+ *
22
+ * 1. SEEDS — per-flavor hue + chroma.
23
+ * --ty-brand-hue, --ty-brand-chroma
24
+ * --ty-secondary-hue, --ty-secondary-chroma (default: brand + 60°)
25
+ * --ty-success-hue, --ty-success-chroma (default: 145°)
26
+ * --ty-danger-hue, --ty-danger-chroma (default: 25°)
27
+ * --ty-warning-hue, --ty-warning-chroma (default: 75°)
28
+ * --ty-neutral-hue, --ty-neutral-chroma (default: brand-hue, 0.005)
29
+ *
30
+ * 2. L-CURVE — lightness stops shared by every flavor.
31
+ * --ty-l-strong, --ty-l-bold, --ty-l-base, --ty-l-soft, --ty-l-faint
32
+ * --ty-l-bg-base, --ty-l-bg-bold, --ty-l-bg-soft
33
+ * Defaults in `:root` are tuned for light mode (lower L = more
34
+ * emphasis). The `html.dark` block redefines them with inverted
35
+ * values. Override either block to compress / expand the ladder.
36
+ *
37
+ * 3. SATURATION CURVE — chroma multipliers per shade.
38
+ * --ty-c-strong-mult, --ty-c-bold-mult, --ty-c-base-mult,
39
+ * --ty-c-soft-mult, --ty-c-faint-mult
40
+ * --ty-c-bg-base-mult, --ty-c-bg-bold-mult, --ty-c-bg-soft-mult
41
+ * Multiplied against the flavor chroma seed. Bump --ty-c-bold-mult
42
+ * to 1.2 to make `+`-emphasis text more saturated; drop
43
+ * --ty-c-faint-mult to 0.2 for whisper-quiet placeholders.
44
+ *
45
+ * Browser support: OKLCH is in every evergreen browser since mid-2023.
46
+ *
47
+ * ===================================================================== */
48
+
49
+ :root {
50
+ /* ----------------------------------------------------------------
51
+ * SEEDS
52
+ * --------------------------------------------------------------*/
53
+
54
+ --ty-brand-hue: 230;
55
+ --ty-brand-chroma: 0.13;
56
+
57
+ /* Every flavor's chroma tracks --ty-brand-chroma by default, at a
58
+ * proportion that preserves the relative saturation hierarchy (danger
59
+ * punchier than primary, neutral near-grey). Drag --ty-brand-chroma to
60
+ * 0 → everything goes greyscale; push to 0.30 → everything goes vibrant.
61
+ *
62
+ * Pin any flavor independently by setting --ty-{flavor}-chroma to a
63
+ * literal number (e.g. --ty-success-chroma: 0.14;). The multiplier
64
+ * relationship breaks for that one flavor only. */
65
+
66
+ /* Secondary rotates from brand by an exposed offset. Defaults to +60°
67
+ * (sibling accent). Try 30° for a close sibling, 120° for triadic,
68
+ * 180° for complement. Set --ty-secondary-hue to a literal number to
69
+ * detach completely. */
70
+ --ty-secondary-offset: 60;
71
+ --ty-secondary-hue: calc(var(--ty-brand-hue) + var(--ty-secondary-offset));
72
+ --ty-secondary-chroma: var(--ty-brand-chroma);
73
+
74
+ --ty-success-hue: 145;
75
+ --ty-success-chroma: calc(var(--ty-brand-chroma) * 1.08);
76
+
77
+ --ty-danger-hue: 25;
78
+ --ty-danger-chroma: calc(var(--ty-brand-chroma) * 1.31);
79
+
80
+ --ty-warning-hue: 75;
81
+ --ty-warning-chroma: calc(var(--ty-brand-chroma) * 1.15);
82
+
83
+ --ty-neutral-hue: var(--ty-brand-hue);
84
+ --ty-neutral-chroma: calc(var(--ty-brand-chroma) * 0.04);
85
+
86
+ /* ----------------------------------------------------------------
87
+ * L-CURVE — light mode. Lower L = more emphasis.
88
+ * --------------------------------------------------------------*/
89
+
90
+ --ty-l-strong: 0.38; /* ++ max emphasis */
91
+ --ty-l-bold: 0.46; /* + high emphasis */
92
+ --ty-l-base: 0.54; /* body */
93
+ --ty-l-soft: 0.72; /* - low emphasis */
94
+ --ty-l-faint: 0.88; /* -- min emphasis */
95
+
96
+ --ty-l-bg-base: 0.96;
97
+ --ty-l-bg-bold: 0.92;
98
+ --ty-l-bg-soft: 0.98;
99
+
100
+ /* ----------------------------------------------------------------
101
+ * SATURATION CURVE — per-shade chroma multipliers.
102
+ * Each shade's chroma = flavor-chroma × multiplier.
103
+ * --------------------------------------------------------------*/
104
+
105
+ --ty-c-strong-mult: 0.77;
106
+ --ty-c-bold-mult: 1;
107
+ --ty-c-base-mult: 0.92;
108
+ --ty-c-soft-mult: 0.77;
109
+ --ty-c-faint-mult: 0.46;
110
+
111
+ --ty-c-bg-base-mult: 0.15;
112
+ --ty-c-bg-bold-mult: 0.38;
113
+ --ty-c-bg-soft-mult: 0.08;
114
+
115
+ /* ================================================================
116
+ * LIGHT MODE — derived tokens. The math is the same for every
117
+ * flavor; only the seed (hue + chroma) differs.
118
+ * ================================================================ */
119
+
120
+ /* Primary */
121
+ --ty-color-primary-strong: oklch(
122
+ var(--ty-l-strong) calc(var(--ty-brand-chroma) * var(--ty-c-strong-mult))
123
+ var(--ty-brand-hue)
124
+ );
125
+ --ty-color-primary-bold: oklch(
126
+ var(--ty-l-bold) calc(var(--ty-brand-chroma) * var(--ty-c-bold-mult))
127
+ var(--ty-brand-hue)
128
+ );
129
+ --ty-color-primary: oklch(
130
+ var(--ty-l-base) calc(var(--ty-brand-chroma) * var(--ty-c-base-mult))
131
+ var(--ty-brand-hue)
132
+ );
133
+ --ty-color-primary-soft: oklch(
134
+ var(--ty-l-soft) calc(var(--ty-brand-chroma) * var(--ty-c-soft-mult))
135
+ var(--ty-brand-hue)
136
+ );
137
+ --ty-color-primary-faint: oklch(
138
+ var(--ty-l-faint) calc(var(--ty-brand-chroma) * var(--ty-c-faint-mult))
139
+ var(--ty-brand-hue)
140
+ );
141
+ --ty-bg-primary: oklch(
142
+ var(--ty-l-bg-base) calc(var(--ty-brand-chroma) * var(--ty-c-bg-base-mult))
143
+ var(--ty-brand-hue)
144
+ );
145
+ --ty-bg-primary-bold: oklch(
146
+ var(--ty-l-bg-bold) calc(var(--ty-brand-chroma) * var(--ty-c-bg-bold-mult))
147
+ var(--ty-brand-hue)
148
+ );
149
+ --ty-bg-primary-soft: oklch(
150
+ var(--ty-l-bg-soft) calc(var(--ty-brand-chroma) * var(--ty-c-bg-soft-mult))
151
+ var(--ty-brand-hue)
152
+ );
153
+ --ty-border-primary: var(--ty-color-primary-soft);
154
+
155
+ /* Secondary */
156
+ --ty-color-secondary-strong: oklch(
157
+ var(--ty-l-strong)
158
+ calc(var(--ty-secondary-chroma) * var(--ty-c-strong-mult))
159
+ var(--ty-secondary-hue)
160
+ );
161
+ --ty-color-secondary-bold: oklch(
162
+ var(--ty-l-bold) calc(var(--ty-secondary-chroma) * var(--ty-c-bold-mult))
163
+ var(--ty-secondary-hue)
164
+ );
165
+ --ty-color-secondary: oklch(
166
+ var(--ty-l-base) calc(var(--ty-secondary-chroma) * var(--ty-c-base-mult))
167
+ var(--ty-secondary-hue)
168
+ );
169
+ --ty-color-secondary-soft: oklch(
170
+ var(--ty-l-soft) calc(var(--ty-secondary-chroma) * var(--ty-c-soft-mult))
171
+ var(--ty-secondary-hue)
172
+ );
173
+ --ty-color-secondary-faint: oklch(
174
+ var(--ty-l-faint) calc(var(--ty-secondary-chroma) * var(--ty-c-faint-mult))
175
+ var(--ty-secondary-hue)
176
+ );
177
+ --ty-bg-secondary: oklch(
178
+ var(--ty-l-bg-base)
179
+ calc(var(--ty-secondary-chroma) * var(--ty-c-bg-base-mult))
180
+ var(--ty-secondary-hue)
181
+ );
182
+ --ty-bg-secondary-bold: oklch(
183
+ var(--ty-l-bg-bold)
184
+ calc(var(--ty-secondary-chroma) * var(--ty-c-bg-bold-mult))
185
+ var(--ty-secondary-hue)
186
+ );
187
+ --ty-bg-secondary-soft: oklch(
188
+ var(--ty-l-bg-soft)
189
+ calc(var(--ty-secondary-chroma) * var(--ty-c-bg-soft-mult))
190
+ var(--ty-secondary-hue)
191
+ );
192
+ --ty-border-secondary: var(--ty-color-secondary-soft);
193
+
194
+ /* Success */
195
+ --ty-color-success-strong: oklch(
196
+ var(--ty-l-strong) calc(var(--ty-success-chroma) * var(--ty-c-strong-mult))
197
+ var(--ty-success-hue)
198
+ );
199
+ --ty-color-success-bold: oklch(
200
+ var(--ty-l-bold) calc(var(--ty-success-chroma) * var(--ty-c-bold-mult))
201
+ var(--ty-success-hue)
202
+ );
203
+ --ty-color-success: oklch(
204
+ var(--ty-l-base) calc(var(--ty-success-chroma) * var(--ty-c-base-mult))
205
+ var(--ty-success-hue)
206
+ );
207
+ --ty-color-success-soft: oklch(
208
+ var(--ty-l-soft) calc(var(--ty-success-chroma) * var(--ty-c-soft-mult))
209
+ var(--ty-success-hue)
210
+ );
211
+ --ty-color-success-faint: oklch(
212
+ var(--ty-l-faint) calc(var(--ty-success-chroma) * var(--ty-c-faint-mult))
213
+ var(--ty-success-hue)
214
+ );
215
+ --ty-bg-success: oklch(
216
+ var(--ty-l-bg-base)
217
+ calc(var(--ty-success-chroma) * var(--ty-c-bg-base-mult))
218
+ var(--ty-success-hue)
219
+ );
220
+ --ty-bg-success-bold: oklch(
221
+ var(--ty-l-bg-bold)
222
+ calc(var(--ty-success-chroma) * var(--ty-c-bg-bold-mult))
223
+ var(--ty-success-hue)
224
+ );
225
+ --ty-bg-success-soft: oklch(
226
+ var(--ty-l-bg-soft)
227
+ calc(var(--ty-success-chroma) * var(--ty-c-bg-soft-mult))
228
+ var(--ty-success-hue)
229
+ );
230
+ --ty-border-success: var(--ty-color-success-soft);
231
+
232
+ /* Danger */
233
+ --ty-color-danger-strong: oklch(
234
+ var(--ty-l-strong) calc(var(--ty-danger-chroma) * var(--ty-c-strong-mult))
235
+ var(--ty-danger-hue)
236
+ );
237
+ --ty-color-danger-bold: oklch(
238
+ var(--ty-l-bold) calc(var(--ty-danger-chroma) * var(--ty-c-bold-mult))
239
+ var(--ty-danger-hue)
240
+ );
241
+ --ty-color-danger: oklch(
242
+ var(--ty-l-base) calc(var(--ty-danger-chroma) * var(--ty-c-base-mult))
243
+ var(--ty-danger-hue)
244
+ );
245
+ --ty-color-danger-soft: oklch(
246
+ var(--ty-l-soft) calc(var(--ty-danger-chroma) * var(--ty-c-soft-mult))
247
+ var(--ty-danger-hue)
248
+ );
249
+ --ty-color-danger-faint: oklch(
250
+ var(--ty-l-faint) calc(var(--ty-danger-chroma) * var(--ty-c-faint-mult))
251
+ var(--ty-danger-hue)
252
+ );
253
+ --ty-bg-danger: oklch(
254
+ var(--ty-l-bg-base) calc(var(--ty-danger-chroma) * var(--ty-c-bg-base-mult))
255
+ var(--ty-danger-hue)
256
+ );
257
+ --ty-bg-danger-bold: oklch(
258
+ var(--ty-l-bg-bold) calc(var(--ty-danger-chroma) * var(--ty-c-bg-bold-mult))
259
+ var(--ty-danger-hue)
260
+ );
261
+ --ty-bg-danger-soft: oklch(
262
+ var(--ty-l-bg-soft) calc(var(--ty-danger-chroma) * var(--ty-c-bg-soft-mult))
263
+ var(--ty-danger-hue)
264
+ );
265
+ --ty-border-danger: var(--ty-color-danger-soft);
266
+
267
+ /* Warning */
268
+ --ty-color-warning-strong: oklch(
269
+ var(--ty-l-strong) calc(var(--ty-warning-chroma) * var(--ty-c-strong-mult))
270
+ var(--ty-warning-hue)
271
+ );
272
+ --ty-color-warning-bold: oklch(
273
+ var(--ty-l-bold) calc(var(--ty-warning-chroma) * var(--ty-c-bold-mult))
274
+ var(--ty-warning-hue)
275
+ );
276
+ --ty-color-warning: oklch(
277
+ var(--ty-l-base) calc(var(--ty-warning-chroma) * var(--ty-c-base-mult))
278
+ var(--ty-warning-hue)
279
+ );
280
+ --ty-color-warning-soft: oklch(
281
+ var(--ty-l-soft) calc(var(--ty-warning-chroma) * var(--ty-c-soft-mult))
282
+ var(--ty-warning-hue)
283
+ );
284
+ --ty-color-warning-faint: oklch(
285
+ var(--ty-l-faint) calc(var(--ty-warning-chroma) * var(--ty-c-faint-mult))
286
+ var(--ty-warning-hue)
287
+ );
288
+ --ty-bg-warning: oklch(
289
+ var(--ty-l-bg-base)
290
+ calc(var(--ty-warning-chroma) * var(--ty-c-bg-base-mult))
291
+ var(--ty-warning-hue)
292
+ );
293
+ --ty-bg-warning-bold: oklch(
294
+ var(--ty-l-bg-bold)
295
+ calc(var(--ty-warning-chroma) * var(--ty-c-bg-bold-mult))
296
+ var(--ty-warning-hue)
297
+ );
298
+ --ty-bg-warning-soft: oklch(
299
+ var(--ty-l-bg-soft)
300
+ calc(var(--ty-warning-chroma) * var(--ty-c-bg-soft-mult))
301
+ var(--ty-warning-hue)
302
+ );
303
+ --ty-border-warning: var(--ty-color-warning-soft);
304
+
305
+ /* Neutral — same L curve, near-zero chroma so the grey scale stays grey. */
306
+ --ty-color-neutral-strong: oklch(
307
+ var(--ty-l-strong) calc(var(--ty-neutral-chroma) * var(--ty-c-strong-mult))
308
+ var(--ty-neutral-hue)
309
+ );
310
+ --ty-color-neutral-bold: oklch(
311
+ var(--ty-l-bold) calc(var(--ty-neutral-chroma) * var(--ty-c-bold-mult))
312
+ var(--ty-neutral-hue)
313
+ );
314
+ --ty-color-neutral: oklch(
315
+ var(--ty-l-base) calc(var(--ty-neutral-chroma) * var(--ty-c-base-mult))
316
+ var(--ty-neutral-hue)
317
+ );
318
+ --ty-color-neutral-soft: oklch(
319
+ var(--ty-l-soft) calc(var(--ty-neutral-chroma) * var(--ty-c-soft-mult))
320
+ var(--ty-neutral-hue)
321
+ );
322
+ --ty-color-neutral-faint: oklch(
323
+ var(--ty-l-faint) calc(var(--ty-neutral-chroma) * var(--ty-c-faint-mult))
324
+ var(--ty-neutral-hue)
325
+ );
326
+ --ty-bg-neutral: oklch(
327
+ var(--ty-l-bg-base)
328
+ calc(var(--ty-neutral-chroma) * var(--ty-c-bg-base-mult))
329
+ var(--ty-neutral-hue)
330
+ );
331
+ --ty-bg-neutral-bold: oklch(
332
+ var(--ty-l-bg-bold)
333
+ calc(var(--ty-neutral-chroma) * var(--ty-c-bg-bold-mult))
334
+ var(--ty-neutral-hue)
335
+ );
336
+ --ty-bg-neutral-soft: oklch(
337
+ var(--ty-l-bg-soft)
338
+ calc(var(--ty-neutral-chroma) * var(--ty-c-bg-soft-mult))
339
+ var(--ty-neutral-hue)
340
+ );
341
+ --ty-bg-neutral-strong: oklch(
342
+ 0.25 calc(var(--ty-neutral-chroma) * 2) var(--ty-neutral-hue)
343
+ );
344
+ --ty-bg-neutral-faint: oklch(
345
+ 0.99 calc(var(--ty-neutral-chroma) * 0.4) var(--ty-neutral-hue)
346
+ );
347
+
348
+ /* Global neutral borders — read off the neutral color ramp. */
349
+ --ty-border-strong: var(--ty-color-neutral-bold);
350
+ --ty-border: var(--ty-color-neutral-soft);
351
+ --ty-border-bold: var(--ty-color-neutral-soft);
352
+ --ty-border-soft: var(--ty-color-neutral-faint);
353
+ --ty-border-faint: var(--ty-color-neutral-faint);
354
+
355
+ /* Surfaces — canvas tinted slightly toward brand for warmth. */
356
+ --ty-surface-canvas: oklch(0.985 0.005 var(--ty-brand-hue));
357
+ --ty-surface-content: oklch(1 0 0);
358
+ --ty-surface-elevated: oklch(1 0 0);
359
+ --ty-surface-floating: oklch(1 0 0);
360
+ --ty-surface-input: oklch(1 0 0);
361
+
362
+ /* Inputs — tied to neutral ramp so form controls retint with brand. */
363
+ --ty-input-bg: var(--ty-surface-input);
364
+ --ty-input-color: var(--ty-color-neutral-strong);
365
+ --ty-input-border: var(--ty-color-neutral-soft);
366
+ --ty-input-border-hover: var(--ty-color-neutral-bold);
367
+ --ty-input-border-focus: var(--ty-color-primary);
368
+ --ty-input-placeholder: var(--ty-color-neutral-soft);
369
+ --ty-input-disabled-bg: var(--ty-color-neutral-faint);
370
+ --ty-input-disabled-border: var(--ty-color-neutral-faint);
371
+ --ty-input-disabled-color: var(--ty-color-neutral-bold);
372
+ --ty-input-shadow-focus: color-mix(
373
+ in oklab,
374
+ var(--ty-color-primary) 5%,
375
+ transparent
376
+ );
377
+
378
+ /* Solid buttons — re-route through --ty-color-*. */
379
+ --ty-solid-primary: var(--ty-color-primary);
380
+ --ty-solid-primary-strong: var(--ty-color-primary-bold);
381
+ --ty-solid-primary-soft: var(--ty-color-primary-soft);
382
+ --ty-solid-primary-fg: white;
383
+
384
+ --ty-solid-secondary: var(--ty-color-secondary);
385
+ --ty-solid-secondary-strong: var(--ty-color-secondary-bold);
386
+ --ty-solid-secondary-soft: var(--ty-color-secondary-soft);
387
+ --ty-solid-secondary-fg: white;
388
+
389
+ --ty-solid-success: var(--ty-color-success);
390
+ --ty-solid-success-strong: var(--ty-color-success-bold);
391
+ --ty-solid-success-soft: var(--ty-color-success-soft);
392
+ --ty-solid-success-fg: white;
393
+
394
+ --ty-solid-danger: var(--ty-color-danger);
395
+ --ty-solid-danger-strong: var(--ty-color-danger-bold);
396
+ --ty-solid-danger-soft: var(--ty-color-danger-soft);
397
+ --ty-solid-danger-fg: white;
398
+
399
+ --ty-solid-warning: var(--ty-color-warning);
400
+ --ty-solid-warning-strong: var(--ty-color-warning-bold);
401
+ --ty-solid-warning-soft: var(--ty-color-warning-soft);
402
+ --ty-solid-warning-fg: white;
403
+
404
+ /* Solid neutral routes to neutral-strong rather than neutral-base.
405
+ * Neutral-base (L_base) reads as a washy mid-grey on white surfaces;
406
+ * neutral-strong gives the dark-grey "default action" weight that
407
+ * design systems typically use for neutral buttons. The "strong"
408
+ * solid variant clamps higher emphasis (same shade, kept for the
409
+ * solid-* API shape); "soft" softens to neutral-bold for inactive
410
+ * states. */
411
+
412
+ --ty-solid-neutral-soft: oklch(
413
+ 0.6 calc(var(--ty-neutral-chroma) * var(--ty-c-strong-mult))
414
+ var(--ty-neutral-hue)
415
+ );
416
+ --ty-solid-neutral: oklch(
417
+ 0.4 calc(var(--ty-neutral-chroma) * var(--ty-c-strong-mult))
418
+ var(--ty-neutral-hue)
419
+ );
420
+
421
+ --ty-solid-neutral-strong: oklch(
422
+ 0.2 calc(var(--ty-neutral-chroma) * var(--ty-c-strong-mult))
423
+ var(--ty-neutral-hue)
424
+ );
425
+ }
426
+
427
+ /* =====================================================================
428
+ * DARK MODE — L-curve and saturation-curve overridden. Same flavor
429
+ * seeds drive both modes; only the L and chroma multipliers change.
430
+ * ===================================================================== */
431
+
432
+ html.dark,
433
+ html[data-theme="dark"] {
434
+ --ty-l-strong: 0.86; /* ++ max emphasis in dark = brightest */
435
+ --ty-l-bold: 0.74;
436
+ --ty-l-base: 0.62;
437
+ --ty-l-soft: 0.46;
438
+ --ty-l-faint: 0.3; /* -- min emphasis = darkest */
439
+
440
+ --ty-l-bg-base: 0.22;
441
+ --ty-l-bg-bold: 0.26;
442
+ --ty-l-bg-soft: 0.19;
443
+
444
+ /* Saturation curve — dark pushes faint chroma up so dim shades don't
445
+ * collapse into grey, and trims strong so bright tones don't over-pop. */
446
+ --ty-c-strong-mult: 0.77;
447
+ --ty-c-bold-mult: 1;
448
+ --ty-c-base-mult: 0.92;
449
+ --ty-c-soft-mult: 0.77;
450
+ --ty-c-faint-mult: 0.5;
451
+
452
+ --ty-c-bg-base-mult: 0.38;
453
+ --ty-c-bg-bold-mult: 0.54;
454
+ --ty-c-bg-soft-mult: 0.23;
455
+
456
+ /* Color tokens re-declared here so we match tyrell.css's `html.dark` block
457
+ * at the same selector specificity (0,1,1). Without these, tyrell.css's
458
+ * hardcoded dark-mode hexes out-rank the brand-layer ':root' definitions
459
+ * and the brand-hue slider does nothing in dark mode. The math is the
460
+ * same as the light block — just uses the dark L-curve / chroma curve
461
+ * defined above. */
462
+
463
+ /* Primary */
464
+ --ty-color-primary-strong: oklch(
465
+ var(--ty-l-strong) calc(var(--ty-brand-chroma) * var(--ty-c-strong-mult))
466
+ var(--ty-brand-hue)
467
+ );
468
+ --ty-color-primary-bold: oklch(
469
+ var(--ty-l-bold) calc(var(--ty-brand-chroma) * var(--ty-c-bold-mult))
470
+ var(--ty-brand-hue)
471
+ );
472
+ --ty-color-primary: oklch(
473
+ var(--ty-l-base) calc(var(--ty-brand-chroma) * var(--ty-c-base-mult))
474
+ var(--ty-brand-hue)
475
+ );
476
+ --ty-color-primary-soft: oklch(
477
+ var(--ty-l-soft) calc(var(--ty-brand-chroma) * var(--ty-c-soft-mult))
478
+ var(--ty-brand-hue)
479
+ );
480
+ --ty-color-primary-faint: oklch(
481
+ var(--ty-l-faint) calc(var(--ty-brand-chroma) * var(--ty-c-faint-mult))
482
+ var(--ty-brand-hue)
483
+ );
484
+ --ty-bg-primary: oklch(
485
+ var(--ty-l-bg-base) calc(var(--ty-brand-chroma) * var(--ty-c-bg-base-mult))
486
+ var(--ty-brand-hue)
487
+ );
488
+ --ty-bg-primary-bold: oklch(
489
+ var(--ty-l-bg-bold) calc(var(--ty-brand-chroma) * var(--ty-c-bg-bold-mult))
490
+ var(--ty-brand-hue)
491
+ );
492
+ --ty-bg-primary-soft: oklch(
493
+ var(--ty-l-bg-soft) calc(var(--ty-brand-chroma) * var(--ty-c-bg-soft-mult))
494
+ var(--ty-brand-hue)
495
+ );
496
+ --ty-border-primary: var(--ty-color-primary-soft);
497
+
498
+ /* Secondary */
499
+ --ty-color-secondary-strong: oklch(
500
+ var(--ty-l-strong)
501
+ calc(var(--ty-secondary-chroma) * var(--ty-c-strong-mult))
502
+ var(--ty-secondary-hue)
503
+ );
504
+ --ty-color-secondary-bold: oklch(
505
+ var(--ty-l-bold) calc(var(--ty-secondary-chroma) * var(--ty-c-bold-mult))
506
+ var(--ty-secondary-hue)
507
+ );
508
+ --ty-color-secondary: oklch(
509
+ var(--ty-l-base) calc(var(--ty-secondary-chroma) * var(--ty-c-base-mult))
510
+ var(--ty-secondary-hue)
511
+ );
512
+ --ty-color-secondary-soft: oklch(
513
+ var(--ty-l-soft) calc(var(--ty-secondary-chroma) * var(--ty-c-soft-mult))
514
+ var(--ty-secondary-hue)
515
+ );
516
+ --ty-color-secondary-faint: oklch(
517
+ var(--ty-l-faint) calc(var(--ty-secondary-chroma) * var(--ty-c-faint-mult))
518
+ var(--ty-secondary-hue)
519
+ );
520
+ --ty-bg-secondary: oklch(
521
+ var(--ty-l-bg-base)
522
+ calc(var(--ty-secondary-chroma) * var(--ty-c-bg-base-mult))
523
+ var(--ty-secondary-hue)
524
+ );
525
+ --ty-bg-secondary-bold: oklch(
526
+ var(--ty-l-bg-bold)
527
+ calc(var(--ty-secondary-chroma) * var(--ty-c-bg-bold-mult))
528
+ var(--ty-secondary-hue)
529
+ );
530
+ --ty-bg-secondary-soft: oklch(
531
+ var(--ty-l-bg-soft)
532
+ calc(var(--ty-secondary-chroma) * var(--ty-c-bg-soft-mult))
533
+ var(--ty-secondary-hue)
534
+ );
535
+ --ty-border-secondary: var(--ty-color-secondary-soft);
536
+
537
+ /* Success */
538
+ --ty-color-success-strong: oklch(
539
+ var(--ty-l-strong) calc(var(--ty-success-chroma) * var(--ty-c-strong-mult))
540
+ var(--ty-success-hue)
541
+ );
542
+ --ty-color-success-bold: oklch(
543
+ var(--ty-l-bold) calc(var(--ty-success-chroma) * var(--ty-c-bold-mult))
544
+ var(--ty-success-hue)
545
+ );
546
+ --ty-color-success: oklch(
547
+ var(--ty-l-base) calc(var(--ty-success-chroma) * var(--ty-c-base-mult))
548
+ var(--ty-success-hue)
549
+ );
550
+ --ty-color-success-soft: oklch(
551
+ var(--ty-l-soft) calc(var(--ty-success-chroma) * var(--ty-c-soft-mult))
552
+ var(--ty-success-hue)
553
+ );
554
+ --ty-color-success-faint: oklch(
555
+ var(--ty-l-faint) calc(var(--ty-success-chroma) * var(--ty-c-faint-mult))
556
+ var(--ty-success-hue)
557
+ );
558
+ --ty-bg-success: oklch(
559
+ var(--ty-l-bg-base)
560
+ calc(var(--ty-success-chroma) * var(--ty-c-bg-base-mult))
561
+ var(--ty-success-hue)
562
+ );
563
+ --ty-bg-success-bold: oklch(
564
+ var(--ty-l-bg-bold)
565
+ calc(var(--ty-success-chroma) * var(--ty-c-bg-bold-mult))
566
+ var(--ty-success-hue)
567
+ );
568
+ --ty-bg-success-soft: oklch(
569
+ var(--ty-l-bg-soft)
570
+ calc(var(--ty-success-chroma) * var(--ty-c-bg-soft-mult))
571
+ var(--ty-success-hue)
572
+ );
573
+ --ty-border-success: var(--ty-color-success-soft);
574
+
575
+ /* Danger */
576
+ --ty-color-danger-strong: oklch(
577
+ var(--ty-l-strong) calc(var(--ty-danger-chroma) * var(--ty-c-strong-mult))
578
+ var(--ty-danger-hue)
579
+ );
580
+ --ty-color-danger-bold: oklch(
581
+ var(--ty-l-bold) calc(var(--ty-danger-chroma) * var(--ty-c-bold-mult))
582
+ var(--ty-danger-hue)
583
+ );
584
+ --ty-color-danger: oklch(
585
+ var(--ty-l-base) calc(var(--ty-danger-chroma) * var(--ty-c-base-mult))
586
+ var(--ty-danger-hue)
587
+ );
588
+ --ty-color-danger-soft: oklch(
589
+ var(--ty-l-soft) calc(var(--ty-danger-chroma) * var(--ty-c-soft-mult))
590
+ var(--ty-danger-hue)
591
+ );
592
+ --ty-color-danger-faint: oklch(
593
+ var(--ty-l-faint) calc(var(--ty-danger-chroma) * var(--ty-c-faint-mult))
594
+ var(--ty-danger-hue)
595
+ );
596
+ --ty-bg-danger: oklch(
597
+ var(--ty-l-bg-base) calc(var(--ty-danger-chroma) * var(--ty-c-bg-base-mult))
598
+ var(--ty-danger-hue)
599
+ );
600
+ --ty-bg-danger-bold: oklch(
601
+ var(--ty-l-bg-bold) calc(var(--ty-danger-chroma) * var(--ty-c-bg-bold-mult))
602
+ var(--ty-danger-hue)
603
+ );
604
+ --ty-bg-danger-soft: oklch(
605
+ var(--ty-l-bg-soft) calc(var(--ty-danger-chroma) * var(--ty-c-bg-soft-mult))
606
+ var(--ty-danger-hue)
607
+ );
608
+ --ty-border-danger: var(--ty-color-danger-soft);
609
+
610
+ /* Warning */
611
+ --ty-color-warning-strong: oklch(
612
+ var(--ty-l-strong) calc(var(--ty-warning-chroma) * var(--ty-c-strong-mult))
613
+ var(--ty-warning-hue)
614
+ );
615
+ --ty-color-warning-bold: oklch(
616
+ var(--ty-l-bold) calc(var(--ty-warning-chroma) * var(--ty-c-bold-mult))
617
+ var(--ty-warning-hue)
618
+ );
619
+ --ty-color-warning: oklch(
620
+ var(--ty-l-base) calc(var(--ty-warning-chroma) * var(--ty-c-base-mult))
621
+ var(--ty-warning-hue)
622
+ );
623
+ --ty-color-warning-soft: oklch(
624
+ var(--ty-l-soft) calc(var(--ty-warning-chroma) * var(--ty-c-soft-mult))
625
+ var(--ty-warning-hue)
626
+ );
627
+ --ty-color-warning-faint: oklch(
628
+ var(--ty-l-faint) calc(var(--ty-warning-chroma) * var(--ty-c-faint-mult))
629
+ var(--ty-warning-hue)
630
+ );
631
+ --ty-bg-warning: oklch(
632
+ var(--ty-l-bg-base)
633
+ calc(var(--ty-warning-chroma) * var(--ty-c-bg-base-mult))
634
+ var(--ty-warning-hue)
635
+ );
636
+ --ty-bg-warning-bold: oklch(
637
+ var(--ty-l-bg-bold)
638
+ calc(var(--ty-warning-chroma) * var(--ty-c-bg-bold-mult))
639
+ var(--ty-warning-hue)
640
+ );
641
+ --ty-bg-warning-soft: oklch(
642
+ var(--ty-l-bg-soft)
643
+ calc(var(--ty-warning-chroma) * var(--ty-c-bg-soft-mult))
644
+ var(--ty-warning-hue)
645
+ );
646
+ --ty-border-warning: var(--ty-color-warning-soft);
647
+
648
+ /* Neutral */
649
+ --ty-color-neutral-strong: oklch(
650
+ var(--ty-l-strong) calc(var(--ty-neutral-chroma) * var(--ty-c-strong-mult))
651
+ var(--ty-neutral-hue)
652
+ );
653
+ --ty-color-neutral-bold: oklch(
654
+ var(--ty-l-bold) calc(var(--ty-neutral-chroma) * var(--ty-c-bold-mult))
655
+ var(--ty-neutral-hue)
656
+ );
657
+ --ty-color-neutral: oklch(
658
+ var(--ty-l-base) calc(var(--ty-neutral-chroma) * var(--ty-c-base-mult))
659
+ var(--ty-neutral-hue)
660
+ );
661
+ --ty-color-neutral-soft: oklch(
662
+ var(--ty-l-soft) calc(var(--ty-neutral-chroma) * var(--ty-c-soft-mult))
663
+ var(--ty-neutral-hue)
664
+ );
665
+ --ty-color-neutral-faint: oklch(
666
+ var(--ty-l-faint) calc(var(--ty-neutral-chroma) * var(--ty-c-faint-mult))
667
+ var(--ty-neutral-hue)
668
+ );
669
+ --ty-bg-neutral: oklch(
670
+ var(--ty-l-bg-base)
671
+ calc(var(--ty-neutral-chroma) * var(--ty-c-bg-base-mult))
672
+ var(--ty-neutral-hue)
673
+ );
674
+ --ty-bg-neutral-bold: oklch(
675
+ var(--ty-l-bg-bold)
676
+ calc(var(--ty-neutral-chroma) * var(--ty-c-bg-bold-mult))
677
+ var(--ty-neutral-hue)
678
+ );
679
+ --ty-bg-neutral-soft: oklch(
680
+ var(--ty-l-bg-soft)
681
+ calc(var(--ty-neutral-chroma) * var(--ty-c-bg-soft-mult))
682
+ var(--ty-neutral-hue)
683
+ );
684
+ --ty-bg-neutral-strong: oklch(
685
+ 0.95 calc(var(--ty-neutral-chroma) * 2) var(--ty-neutral-hue)
686
+ );
687
+ --ty-bg-neutral-faint: oklch(
688
+ 0.15 calc(var(--ty-neutral-chroma) * 2) var(--ty-neutral-hue)
689
+ );
690
+
691
+ /* Global neutral borders */
692
+ --ty-border-strong: var(--ty-color-neutral-bold);
693
+ --ty-border: var(--ty-color-neutral-soft);
694
+ --ty-border-bold: var(--ty-color-neutral-soft);
695
+ --ty-border-soft: var(--ty-color-neutral-faint);
696
+ --ty-border-faint: var(--ty-color-neutral-faint);
697
+
698
+ /* Surfaces — flip dark with a hint of brand chroma. */
699
+ --ty-surface-canvas: oklch(0.12 0.012 var(--ty-brand-hue));
700
+ --ty-surface-content: oklch(0.16 0.012 var(--ty-brand-hue));
701
+ --ty-surface-elevated: oklch(0.19 0.013 var(--ty-brand-hue));
702
+ --ty-surface-floating: oklch(0.22 0.015 var(--ty-brand-hue));
703
+ --ty-surface-input: oklch(0.18 0.012 var(--ty-brand-hue));
704
+
705
+ /* Inputs — re-declared so tyrell.css's hardcoded dark values don't
706
+ * out-rank our brand-derived ones (same selector specificity, source
707
+ * order wins). */
708
+ --ty-input-bg: var(--ty-surface-input);
709
+ --ty-input-color: var(--ty-color-neutral-strong);
710
+ --ty-input-border: var(--ty-color-neutral-faint);
711
+ --ty-input-border-hover: var(--ty-color-neutral-bold);
712
+ --ty-input-border-focus: var(--ty-color-primary);
713
+ --ty-input-placeholder: var(--ty-color-neutral-soft);
714
+ --ty-input-disabled-bg: var(--ty-color-neutral-faint);
715
+ --ty-input-disabled-border: var(--ty-color-neutral-faint);
716
+ --ty-input-disabled-color: var(--ty-color-neutral-bold);
717
+ --ty-input-shadow-focus: color-mix(
718
+ in oklab,
719
+ var(--ty-color-primary) 20%,
720
+ transparent
721
+ );
722
+
723
+ /* Solid buttons — same reason. */
724
+ --ty-solid-primary: var(--ty-color-primary);
725
+ --ty-solid-primary-strong: var(--ty-color-primary-bold);
726
+ --ty-solid-primary-soft: var(--ty-color-primary-soft);
727
+ --ty-solid-primary-fg: white;
728
+
729
+ --ty-solid-secondary: var(--ty-color-secondary);
730
+ --ty-solid-secondary-strong: var(--ty-color-secondary-bold);
731
+ --ty-solid-secondary-soft: var(--ty-color-secondary-soft);
732
+ --ty-solid-secondary-fg: white;
733
+
734
+ --ty-solid-success: var(--ty-color-success);
735
+ --ty-solid-success-strong: var(--ty-color-success-bold);
736
+ --ty-solid-success-soft: var(--ty-color-success-soft);
737
+ --ty-solid-success-fg: white;
738
+
739
+ --ty-solid-danger: var(--ty-color-danger);
740
+ --ty-solid-danger-strong: var(--ty-color-danger-bold);
741
+ --ty-solid-danger-soft: var(--ty-color-danger-soft);
742
+ --ty-solid-danger-fg: white;
743
+
744
+ --ty-solid-warning: var(--ty-color-warning);
745
+ --ty-solid-warning-strong: var(--ty-color-warning-bold);
746
+ --ty-solid-warning-soft: var(--ty-color-warning-soft);
747
+ --ty-solid-warning-fg: white;
748
+
749
+ /* Solid neutral — see comment in the :root block. In dark mode the
750
+ * "dark grey" position lives at the OTHER end of the ramp (faint),
751
+ * because the L-curve inverts. Both modes get "a darker shade than
752
+ * the page surface" for a punchy default action. */
753
+ --ty-solid-neutral-soft: oklch(
754
+ 0.2 calc(var(--ty-neutral-chroma) * var(--ty-c-strong-mult))
755
+ var(--ty-neutral-hue)
756
+ );
757
+ --ty-solid-neutral: oklch(
758
+ 0.3 calc(var(--ty-neutral-chroma) * var(--ty-c-strong-mult))
759
+ var(--ty-neutral-hue)
760
+ );
761
+
762
+ --ty-solid-neutral-strong: oklch(
763
+ 0.4 calc(var(--ty-neutral-chroma) * var(--ty-c-strong-mult))
764
+ var(--ty-neutral-hue)
765
+ );
766
+ --ty-solid-neutral-fg: white;
767
+ }