tyrell-components 1.0.0-TC36 → 1.0.0-TC38

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.
@@ -1,11 +1,16 @@
1
1
  /* =====================================================================
2
- * tyrell-brand.css — OKLCH-based brand layer for Tyrell Components
2
+ * tyrell-theme.css — the OKLCH theme engine for Tyrell Components
3
3
  * =====================================================================
4
4
  *
5
- * Opt-in. Load AFTER `tyrell.css`. Override a few variables to rebrand.
5
+ * Opt-in. Load AFTER `tyrell.css`. Override a few variables to rebrand
6
+ * or seed a color directly, declare a named theme, scope one to a
7
+ * subtree. `tyrell.css` alone is correct and accessible without this
8
+ * file; this is what turns it into a theming ENGINE rather than a fixed
9
+ * palette: auto-contrast text, seed ingestion, named/scoped themes,
10
+ * animated theme transitions. See CSS_GUIDE.md → Color Customization.
6
11
  *
7
12
  * <link rel="stylesheet" href=".../tyrell.css">
8
- * <link rel="stylesheet" href=".../tyrell-brand.css">
13
+ * <link rel="stylesheet" href=".../tyrell-theme.css">
9
14
  *
10
15
  * :root {
11
16
  * --ty-brand-hue: 200; // teal. Try 260 indigo, 30 orange, 145 emerald.
@@ -24,7 +29,7 @@
24
29
  * H = flavor-hue ← Tier 2
25
30
  * )
26
31
  *
27
- * Pick a flavor (primary / secondary / success / warning / danger /
32
+ * Pick a flavor (primary / success / warning / danger /
28
33
  * neutral). Pick a shade (strong / bold / base / soft / faint). That's
29
34
  * the cell; the formula gives you its color.
30
35
  *
@@ -103,11 +108,6 @@
103
108
  * Bump to ~0.005 (light) / ~0.012 (dark) to warm surfaces toward brand. */
104
109
  --ty-surface-chroma: 0;
105
110
 
106
- /* Secondary rotates from brand by an exposed offset. Default +60°
107
- * (sibling accent). Try 30° for a close sibling, 120° for triadic,
108
- * 180° for complement. Set --ty-secondary-hue to a literal number
109
- * to detach completely. */
110
- --ty-secondary-offset: 60;
111
111
 
112
112
  /* ----------------------------------------------------------------
113
113
  * Tier 2 — PER-FLAVOR ANCHORS
@@ -118,8 +118,6 @@
118
118
  * --ty-warning-chroma: 0.2; (more vivid)
119
119
  * --------------------------------------------------------------*/
120
120
 
121
- --ty-secondary-hue: calc(var(--ty-brand-hue) + var(--ty-secondary-offset));
122
- --ty-secondary-chroma: var(--ty-brand-chroma);
123
121
 
124
122
  --ty-success-hue: 145;
125
123
  --ty-success-chroma: calc(var(--ty-brand-chroma) * 1.08);
@@ -182,6 +180,24 @@
182
180
  --ty-l-border-soft: 0.88; /* was color-neutral-faint */
183
181
  --ty-l-border-faint: 0.92;
184
182
 
183
+ /* Surface ladder + remaining per-mode absolutes, as L dials. These were
184
+ * whole oklch() declarations swapped per mode; as numeric dials they are
185
+ * (a) consistent with every other family and (b) interpolable — which is
186
+ * what lets theme/mode switches ANIMATE (see THEME TRANSITIONS at the
187
+ * end of this file). */
188
+ --ty-l-surface-canvas: 0.985;
189
+ --ty-l-surface-content: 1;
190
+ --ty-l-surface-elevated: 1;
191
+ --ty-l-surface-floating: 1;
192
+ --ty-l-surface-input: 1;
193
+
194
+ --ty-l-solid-neutral: 0.4; /* the neutral "ink" fill — dark in BOTH modes */
195
+ --ty-l-bg-neutral-strong: 0.25; /* opposes the mode: dark bg on light page */
196
+ --ty-l-bg-neutral-faint: 0.99; /* follows the mode */
197
+ --ty-c-bg-neutral-faint-mult: 0.4;
198
+
199
+ --ty-focus-ring-alpha: 5%; /* focus ring mix strength (dark needs more) */
200
+
185
201
  /* ----------------------------------------------------------------
186
202
  * Tier 4 — SATURATION CURVE
187
203
  * Per-shade chroma multipliers. Each shade's chroma =
@@ -217,7 +233,6 @@
217
233
  * --------------------------------------------------------------*/
218
234
 
219
235
  --ty-primary-l-factor: 1;
220
- --ty-secondary-l-factor: 1;
221
236
  --ty-success-l-factor: 1;
222
237
  --ty-warning-l-factor: 1.15;
223
238
  --ty-danger-l-factor: 1;
@@ -254,7 +269,9 @@
254
269
  /* Dark mode overrides for the L-curve and saturation curve. Tier 1 + 2
255
270
  * seeds and Tier 5 L-factors carry through unchanged from :root. */
256
271
  html.dark,
257
- html[data-theme="dark"] {
272
+ html[data-theme="dark"],
273
+ [data-ty-theme].dark,
274
+ [data-ty-theme][data-theme="dark"] {
258
275
  /* Tier 3 dark — inverted curve. Higher L = lighter text = more
259
276
  * emphasis on a dark background. */
260
277
  --ty-l-strong: 0.72;
@@ -286,6 +303,23 @@ html[data-theme="dark"] {
286
303
  --ty-l-border-soft: 0.3;
287
304
  --ty-l-border-faint: 0.3;
288
305
 
306
+ /* Surface ladder + absolutes dark — hand-tuned values, now as dials. */
307
+ --ty-l-surface-canvas: 0.12;
308
+ --ty-l-surface-content: 0.16;
309
+ --ty-l-surface-elevated: 0.19;
310
+ --ty-l-surface-floating: 0.22;
311
+ --ty-l-surface-input: 0.18;
312
+
313
+ --ty-l-solid-neutral: 0.23;
314
+ --ty-l-bg-neutral-strong: 0.95;
315
+ --ty-l-bg-neutral-faint: 0.15;
316
+ --ty-c-bg-neutral-faint-mult: 2;
317
+
318
+ /* Tier 5 dark — neutral inks pulled down a notch against dark surfaces. */
319
+ --ty-neutral-l-factor: 0.8;
320
+
321
+ --ty-focus-ring-alpha: 20%;
322
+
289
323
  /* Tier 4 dark — dim shades hold more chroma so they don't grey out;
290
324
  * strong shades trim chroma so bright tones don't over-pop. */
291
325
  --ty-c-strong-mult: 0.77;
@@ -300,7 +334,7 @@ html[data-theme="dark"] {
300
334
 
301
335
  /* Tier 6 dark — interaction offsets flip sign (press LIGHTENS on dark),
302
336
  * and the per-theme adjust dims + desaturates the fills against the
303
- * dark canvas. (Computed solid tokens live in SECTION 2 DARK.) */
337
+ * dark canvas. (Computed solid tokens are declared once at html:root.) */
304
338
  --ty-solid-hover-l: 0.04; /* :hover */
305
339
  --ty-solid-active-l: 0.08; /* :active */
306
340
  --ty-solid-strong-l: 0.06; /* tone+ */
@@ -338,264 +372,269 @@ html[data-theme="dark"] {
338
372
  * it there unless its VALUE is mode-specific.
339
373
  * ===================================================================== */
340
374
 
341
- html:root {
375
+ html:root,
376
+ [data-ty-theme] {
342
377
  /* ----------------------------------------------------------------
343
378
  * Flavor color ramps (fg + bg + border)
379
+ *
380
+ * SEED INGESTION — every flavor resolves ONE seed color, and every
381
+ * ramp formula reads that seed's c + h channels via relative color
382
+ * syntax; L always comes from the mode-flipped curve. Two ways in:
383
+ *
384
+ * numbers (default) — the Tier 1/2 hue+chroma dials construct the
385
+ * seed: --ty-brand-hue: 200; --ty-brand-chroma: 0.13;
386
+ *
387
+ * a color — set the seed directly and the dials are bypassed:
388
+ * --ty-primary-seed: #76467c;
389
+ * --ty-danger-seed: crimson;
390
+ *
391
+ * The seed's LIGHTNESS is discarded by design: a color's identity
392
+ * here is hue + chroma; where each shade sits per mode is the
393
+ * L-curve's job. That is what makes dark mode, tones and contrast
394
+ * correct for ANY seed — light or dark. (Your exact pixel may
395
+ * appear nowhere; pin --ty-solid-X etc. if you need it literally.)
344
396
  * --------------------------------------------------------------*/
397
+ --ty-primary-seed-resolved: var(
398
+ --ty-primary-seed,
399
+ oklch(0.5 var(--ty-brand-chroma) var(--ty-brand-hue))
400
+ );
401
+ --ty-success-seed-resolved: var(
402
+ --ty-success-seed,
403
+ oklch(0.5 var(--ty-success-chroma) var(--ty-success-hue))
404
+ );
405
+ --ty-warning-seed-resolved: var(
406
+ --ty-warning-seed,
407
+ oklch(0.5 var(--ty-warning-chroma) var(--ty-warning-hue))
408
+ );
409
+ --ty-danger-seed-resolved: var(
410
+ --ty-danger-seed,
411
+ oklch(0.5 var(--ty-danger-chroma) var(--ty-danger-hue))
412
+ );
413
+ --ty-neutral-seed-resolved: var(
414
+ --ty-neutral-seed,
415
+ oklch(0.5 var(--ty-neutral-chroma) var(--ty-neutral-hue))
416
+ );
345
417
 
346
418
  /* Primary */
347
419
  --ty-color-primary-strong: oklch(
348
- calc(var(--ty-l-strong) * var(--ty-primary-l-factor))
349
- calc(var(--ty-brand-chroma) * var(--ty-c-strong-mult)) var(--ty-brand-hue)
420
+ from var(--ty-primary-seed-resolved)
421
+ calc(var(--ty-l-strong) * var(--ty-primary-l-factor))
422
+ calc(c * var(--ty-c-strong-mult)) h
350
423
  );
351
424
  --ty-color-primary-bold: oklch(
352
- calc(var(--ty-l-bold) * var(--ty-primary-l-factor))
353
- calc(var(--ty-brand-chroma) * var(--ty-c-bold-mult)) var(--ty-brand-hue)
425
+ from var(--ty-primary-seed-resolved)
426
+ calc(var(--ty-l-bold) * var(--ty-primary-l-factor))
427
+ calc(c * var(--ty-c-bold-mult)) h
354
428
  );
355
429
  --ty-color-primary: oklch(
356
- calc(var(--ty-l-base) * var(--ty-primary-l-factor))
357
- calc(var(--ty-brand-chroma) * var(--ty-c-base-mult)) var(--ty-brand-hue)
430
+ from var(--ty-primary-seed-resolved)
431
+ calc(var(--ty-l-base) * var(--ty-primary-l-factor))
432
+ calc(c * var(--ty-c-base-mult)) h
358
433
  );
359
434
  --ty-color-primary-soft: oklch(
360
- calc(var(--ty-l-soft) * var(--ty-primary-l-factor))
361
- calc(var(--ty-brand-chroma) * var(--ty-c-soft-mult)) var(--ty-brand-hue)
435
+ from var(--ty-primary-seed-resolved)
436
+ calc(var(--ty-l-soft) * var(--ty-primary-l-factor))
437
+ calc(c * var(--ty-c-soft-mult)) h
362
438
  );
363
439
  --ty-color-primary-faint: oklch(
364
- calc(var(--ty-l-faint) * var(--ty-primary-l-factor))
365
- calc(var(--ty-brand-chroma) * var(--ty-c-faint-mult)) var(--ty-brand-hue)
440
+ from var(--ty-primary-seed-resolved)
441
+ calc(var(--ty-l-faint) * var(--ty-primary-l-factor))
442
+ calc(c * var(--ty-c-faint-mult)) h
366
443
  );
367
444
  --ty-bg-primary: oklch(
368
- calc(var(--ty-l-bg-base) * var(--ty-primary-l-factor))
369
- calc(var(--ty-brand-chroma) * var(--ty-c-bg-base-mult))
370
- var(--ty-brand-hue)
445
+ from var(--ty-primary-seed-resolved)
446
+ calc(var(--ty-l-bg-base) * var(--ty-primary-l-factor))
447
+ calc(c * var(--ty-c-bg-base-mult)) h
371
448
  );
372
449
  --ty-bg-primary-bold: oklch(
373
- calc(var(--ty-l-bg-bold) * var(--ty-primary-l-factor))
374
- calc(var(--ty-brand-chroma) * var(--ty-c-bg-bold-mult))
375
- var(--ty-brand-hue)
450
+ from var(--ty-primary-seed-resolved)
451
+ calc(var(--ty-l-bg-bold) * var(--ty-primary-l-factor))
452
+ calc(c * var(--ty-c-bg-bold-mult)) h
376
453
  );
377
454
  --ty-bg-primary-soft: oklch(
378
- calc(var(--ty-l-bg-soft) * var(--ty-primary-l-factor))
379
- calc(var(--ty-brand-chroma) * var(--ty-c-bg-soft-mult))
380
- var(--ty-brand-hue)
455
+ from var(--ty-primary-seed-resolved)
456
+ calc(var(--ty-l-bg-soft) * var(--ty-primary-l-factor))
457
+ calc(c * var(--ty-c-bg-soft-mult)) h
381
458
  );
382
459
  --ty-border-primary: var(--ty-color-primary-soft);
383
460
 
384
- /* Secondary */
385
- --ty-color-secondary-strong: oklch(
386
- calc(var(--ty-l-strong) * var(--ty-secondary-l-factor))
387
- calc(var(--ty-secondary-chroma) * var(--ty-c-strong-mult))
388
- var(--ty-secondary-hue)
389
- );
390
- --ty-color-secondary-bold: oklch(
391
- calc(var(--ty-l-bold) * var(--ty-secondary-l-factor))
392
- calc(var(--ty-secondary-chroma) * var(--ty-c-bold-mult))
393
- var(--ty-secondary-hue)
394
- );
395
- --ty-color-secondary: oklch(
396
- calc(var(--ty-l-base) * var(--ty-secondary-l-factor))
397
- calc(var(--ty-secondary-chroma) * var(--ty-c-base-mult))
398
- var(--ty-secondary-hue)
399
- );
400
- --ty-color-secondary-soft: oklch(
401
- calc(var(--ty-l-soft) * var(--ty-secondary-l-factor))
402
- calc(var(--ty-secondary-chroma) * var(--ty-c-soft-mult))
403
- var(--ty-secondary-hue)
404
- );
405
- --ty-color-secondary-faint: oklch(
406
- calc(var(--ty-l-faint) * var(--ty-secondary-l-factor))
407
- calc(var(--ty-secondary-chroma) * var(--ty-c-faint-mult))
408
- var(--ty-secondary-hue)
409
- );
410
- --ty-bg-secondary: oklch(
411
- calc(var(--ty-l-bg-base) * var(--ty-secondary-l-factor))
412
- calc(var(--ty-secondary-chroma) * var(--ty-c-bg-base-mult))
413
- var(--ty-secondary-hue)
414
- );
415
- --ty-bg-secondary-bold: oklch(
416
- calc(var(--ty-l-bg-bold) * var(--ty-secondary-l-factor))
417
- calc(var(--ty-secondary-chroma) * var(--ty-c-bg-bold-mult))
418
- var(--ty-secondary-hue)
419
- );
420
- --ty-bg-secondary-soft: oklch(
421
- calc(var(--ty-l-bg-soft) * var(--ty-secondary-l-factor))
422
- calc(var(--ty-secondary-chroma) * var(--ty-c-bg-soft-mult))
423
- var(--ty-secondary-hue)
424
- );
425
- --ty-border-secondary: var(--ty-color-secondary-soft);
426
-
427
461
  /* Success */
428
462
  --ty-color-success-strong: oklch(
429
- calc(var(--ty-l-strong) * var(--ty-success-l-factor))
430
- calc(var(--ty-success-chroma) * var(--ty-c-strong-mult))
431
- var(--ty-success-hue)
463
+ from var(--ty-success-seed-resolved)
464
+ calc(var(--ty-l-strong) * var(--ty-success-l-factor))
465
+ calc(c * var(--ty-c-strong-mult)) h
432
466
  );
433
467
  --ty-color-success-bold: oklch(
434
- calc(var(--ty-l-bold) * var(--ty-success-l-factor))
435
- calc(var(--ty-success-chroma) * var(--ty-c-bold-mult))
436
- var(--ty-success-hue)
468
+ from var(--ty-success-seed-resolved)
469
+ calc(var(--ty-l-bold) * var(--ty-success-l-factor))
470
+ calc(c * var(--ty-c-bold-mult)) h
437
471
  );
438
472
  --ty-color-success: oklch(
439
- calc(var(--ty-l-base) * var(--ty-success-l-factor))
440
- calc(var(--ty-success-chroma) * var(--ty-c-base-mult))
441
- var(--ty-success-hue)
473
+ from var(--ty-success-seed-resolved)
474
+ calc(var(--ty-l-base) * var(--ty-success-l-factor))
475
+ calc(c * var(--ty-c-base-mult)) h
442
476
  );
443
477
  --ty-color-success-soft: oklch(
444
- calc(var(--ty-l-soft) * var(--ty-success-l-factor))
445
- calc(var(--ty-success-chroma) * var(--ty-c-soft-mult))
446
- var(--ty-success-hue)
478
+ from var(--ty-success-seed-resolved)
479
+ calc(var(--ty-l-soft) * var(--ty-success-l-factor))
480
+ calc(c * var(--ty-c-soft-mult)) h
447
481
  );
448
482
  --ty-color-success-faint: oklch(
449
- calc(var(--ty-l-faint) * var(--ty-success-l-factor))
450
- calc(var(--ty-success-chroma) * var(--ty-c-faint-mult))
451
- var(--ty-success-hue)
483
+ from var(--ty-success-seed-resolved)
484
+ calc(var(--ty-l-faint) * var(--ty-success-l-factor))
485
+ calc(c * var(--ty-c-faint-mult)) h
452
486
  );
453
487
  --ty-bg-success: oklch(
454
- calc(var(--ty-l-bg-base) * var(--ty-success-l-factor))
455
- calc(var(--ty-success-chroma) * var(--ty-c-bg-base-mult))
456
- var(--ty-success-hue)
488
+ from var(--ty-success-seed-resolved)
489
+ calc(var(--ty-l-bg-base) * var(--ty-success-l-factor))
490
+ calc(c * var(--ty-c-bg-base-mult)) h
457
491
  );
458
492
  --ty-bg-success-bold: oklch(
459
- calc(var(--ty-l-bg-bold) * var(--ty-success-l-factor))
460
- calc(var(--ty-success-chroma) * var(--ty-c-bg-bold-mult))
461
- var(--ty-success-hue)
493
+ from var(--ty-success-seed-resolved)
494
+ calc(var(--ty-l-bg-bold) * var(--ty-success-l-factor))
495
+ calc(c * var(--ty-c-bg-bold-mult)) h
462
496
  );
463
497
  --ty-bg-success-soft: oklch(
464
- calc(var(--ty-l-bg-soft) * var(--ty-success-l-factor))
465
- calc(var(--ty-success-chroma) * var(--ty-c-bg-soft-mult))
466
- var(--ty-success-hue)
498
+ from var(--ty-success-seed-resolved)
499
+ calc(var(--ty-l-bg-soft) * var(--ty-success-l-factor))
500
+ calc(c * var(--ty-c-bg-soft-mult)) h
467
501
  );
468
502
  --ty-border-success: var(--ty-color-success-soft);
469
503
 
470
504
  /* Danger */
471
505
  --ty-color-danger-strong: oklch(
472
- calc(var(--ty-l-strong) * var(--ty-danger-l-factor))
473
- calc(var(--ty-danger-chroma) * var(--ty-c-strong-mult))
474
- var(--ty-danger-hue)
506
+ from var(--ty-danger-seed-resolved)
507
+ calc(var(--ty-l-strong) * var(--ty-danger-l-factor))
508
+ calc(c * var(--ty-c-strong-mult)) h
475
509
  );
476
510
  --ty-color-danger-bold: oklch(
477
- calc(var(--ty-l-bold) * var(--ty-danger-l-factor))
478
- calc(var(--ty-danger-chroma) * var(--ty-c-bold-mult)) var(--ty-danger-hue)
511
+ from var(--ty-danger-seed-resolved)
512
+ calc(var(--ty-l-bold) * var(--ty-danger-l-factor))
513
+ calc(c * var(--ty-c-bold-mult)) h
479
514
  );
480
515
  --ty-color-danger: oklch(
481
- calc(var(--ty-l-base) * var(--ty-danger-l-factor))
482
- calc(var(--ty-danger-chroma) * var(--ty-c-base-mult)) var(--ty-danger-hue)
516
+ from var(--ty-danger-seed-resolved)
517
+ calc(var(--ty-l-base) * var(--ty-danger-l-factor))
518
+ calc(c * var(--ty-c-base-mult)) h
483
519
  );
484
520
  --ty-color-danger-soft: oklch(
485
- calc(var(--ty-l-soft) * var(--ty-danger-l-factor))
486
- calc(var(--ty-danger-chroma) * var(--ty-c-soft-mult)) var(--ty-danger-hue)
521
+ from var(--ty-danger-seed-resolved)
522
+ calc(var(--ty-l-soft) * var(--ty-danger-l-factor))
523
+ calc(c * var(--ty-c-soft-mult)) h
487
524
  );
488
525
  --ty-color-danger-faint: oklch(
489
- calc(var(--ty-l-faint) * var(--ty-danger-l-factor))
490
- calc(var(--ty-danger-chroma) * var(--ty-c-faint-mult))
491
- var(--ty-danger-hue)
526
+ from var(--ty-danger-seed-resolved)
527
+ calc(var(--ty-l-faint) * var(--ty-danger-l-factor))
528
+ calc(c * var(--ty-c-faint-mult)) h
492
529
  );
493
530
  --ty-bg-danger: oklch(
494
- calc(var(--ty-l-bg-base) * var(--ty-danger-l-factor))
495
- calc(var(--ty-danger-chroma) * var(--ty-c-bg-base-mult))
496
- var(--ty-danger-hue)
531
+ from var(--ty-danger-seed-resolved)
532
+ calc(var(--ty-l-bg-base) * var(--ty-danger-l-factor))
533
+ calc(c * var(--ty-c-bg-base-mult)) h
497
534
  );
498
535
  --ty-bg-danger-bold: oklch(
499
- calc(var(--ty-l-bg-bold) * var(--ty-danger-l-factor))
500
- calc(var(--ty-danger-chroma) * var(--ty-c-bg-bold-mult))
501
- var(--ty-danger-hue)
536
+ from var(--ty-danger-seed-resolved)
537
+ calc(var(--ty-l-bg-bold) * var(--ty-danger-l-factor))
538
+ calc(c * var(--ty-c-bg-bold-mult)) h
502
539
  );
503
540
  --ty-bg-danger-soft: oklch(
504
- calc(var(--ty-l-bg-soft) * var(--ty-danger-l-factor))
505
- calc(var(--ty-danger-chroma) * var(--ty-c-bg-soft-mult))
506
- var(--ty-danger-hue)
541
+ from var(--ty-danger-seed-resolved)
542
+ calc(var(--ty-l-bg-soft) * var(--ty-danger-l-factor))
543
+ calc(c * var(--ty-c-bg-soft-mult)) h
507
544
  );
508
545
  --ty-border-danger: var(--ty-color-danger-soft);
509
546
 
510
547
  /* Warning */
511
548
  --ty-color-warning-strong: oklch(
512
- calc(var(--ty-l-strong) * var(--ty-warning-l-factor))
513
- calc(var(--ty-warning-chroma) * var(--ty-c-strong-mult))
514
- var(--ty-warning-hue)
549
+ from var(--ty-warning-seed-resolved)
550
+ calc(var(--ty-l-strong) * var(--ty-warning-l-factor))
551
+ calc(c * var(--ty-c-strong-mult)) h
515
552
  );
516
553
  --ty-color-warning-bold: oklch(
517
- calc(var(--ty-l-bold) * var(--ty-warning-l-factor))
518
- calc(var(--ty-warning-chroma) * var(--ty-c-bold-mult))
519
- var(--ty-warning-hue)
554
+ from var(--ty-warning-seed-resolved)
555
+ calc(var(--ty-l-bold) * var(--ty-warning-l-factor))
556
+ calc(c * var(--ty-c-bold-mult)) h
520
557
  );
521
558
  --ty-color-warning: oklch(
522
- calc(var(--ty-l-base) * var(--ty-warning-l-factor))
523
- calc(var(--ty-warning-chroma) * var(--ty-c-base-mult))
524
- var(--ty-warning-hue)
559
+ from var(--ty-warning-seed-resolved)
560
+ calc(var(--ty-l-base) * var(--ty-warning-l-factor))
561
+ calc(c * var(--ty-c-base-mult)) h
525
562
  );
526
563
  --ty-color-warning-soft: oklch(
527
- calc(var(--ty-l-soft) * var(--ty-warning-l-factor))
528
- calc(var(--ty-warning-chroma) * var(--ty-c-soft-mult))
529
- var(--ty-warning-hue)
564
+ from var(--ty-warning-seed-resolved)
565
+ calc(var(--ty-l-soft) * var(--ty-warning-l-factor))
566
+ calc(c * var(--ty-c-soft-mult)) h
530
567
  );
531
568
  --ty-color-warning-faint: oklch(
532
- calc(var(--ty-l-faint) * var(--ty-warning-l-factor))
533
- calc(var(--ty-warning-chroma) * var(--ty-c-faint-mult))
534
- var(--ty-warning-hue)
569
+ from var(--ty-warning-seed-resolved)
570
+ calc(var(--ty-l-faint) * var(--ty-warning-l-factor))
571
+ calc(c * var(--ty-c-faint-mult)) h
535
572
  );
536
573
  --ty-bg-warning: oklch(
537
- calc(var(--ty-l-bg-base) * var(--ty-warning-l-factor))
538
- calc(var(--ty-warning-chroma) * var(--ty-c-bg-base-mult))
539
- var(--ty-warning-hue)
574
+ from var(--ty-warning-seed-resolved)
575
+ calc(var(--ty-l-bg-base) * var(--ty-warning-l-factor))
576
+ calc(c * var(--ty-c-bg-base-mult)) h
540
577
  );
541
578
  --ty-bg-warning-bold: oklch(
542
- calc(var(--ty-l-bg-bold) * var(--ty-warning-l-factor))
543
- calc(var(--ty-warning-chroma) * var(--ty-c-bg-bold-mult))
544
- var(--ty-warning-hue)
579
+ from var(--ty-warning-seed-resolved)
580
+ calc(var(--ty-l-bg-bold) * var(--ty-warning-l-factor))
581
+ calc(c * var(--ty-c-bg-bold-mult)) h
545
582
  );
546
583
  --ty-bg-warning-soft: oklch(
547
- calc(var(--ty-l-bg-soft) * var(--ty-warning-l-factor))
548
- calc(var(--ty-warning-chroma) * var(--ty-c-bg-soft-mult))
549
- var(--ty-warning-hue)
584
+ from var(--ty-warning-seed-resolved)
585
+ calc(var(--ty-l-bg-soft) * var(--ty-warning-l-factor))
586
+ calc(c * var(--ty-c-bg-soft-mult)) h
550
587
  );
551
588
  --ty-border-warning: var(--ty-color-warning-soft);
552
589
 
553
590
  /* Neutral — same L curve, near-zero chroma so the grey scale stays grey. */
554
591
  --ty-color-neutral-strong: oklch(
555
- calc(var(--ty-l-strong) * var(--ty-neutral-l-factor))
556
- calc(var(--ty-neutral-chroma) * var(--ty-c-strong-mult))
557
- var(--ty-neutral-hue)
592
+ from var(--ty-neutral-seed-resolved)
593
+ calc(var(--ty-l-strong) * var(--ty-neutral-l-factor))
594
+ calc(c * var(--ty-c-strong-mult)) h
558
595
  );
559
596
  --ty-color-neutral-bold: oklch(
560
- calc(var(--ty-l-bold) * var(--ty-neutral-l-factor))
561
- calc(var(--ty-neutral-chroma) * var(--ty-c-bold-mult))
562
- var(--ty-neutral-hue)
597
+ from var(--ty-neutral-seed-resolved)
598
+ calc(var(--ty-l-bold) * var(--ty-neutral-l-factor))
599
+ calc(c * var(--ty-c-bold-mult)) h
563
600
  );
564
601
  --ty-color-neutral: oklch(
565
- calc(var(--ty-l-base) * var(--ty-neutral-l-factor))
566
- calc(var(--ty-neutral-chroma) * var(--ty-c-base-mult))
567
- var(--ty-neutral-hue)
602
+ from var(--ty-neutral-seed-resolved)
603
+ calc(var(--ty-l-base) * var(--ty-neutral-l-factor))
604
+ calc(c * var(--ty-c-base-mult)) h
568
605
  );
569
606
  --ty-color-neutral-soft: oklch(
570
- calc(var(--ty-l-soft) * var(--ty-neutral-l-factor))
571
- calc(var(--ty-neutral-chroma) * var(--ty-c-soft-mult))
572
- var(--ty-neutral-hue)
607
+ from var(--ty-neutral-seed-resolved)
608
+ calc(var(--ty-l-soft) * var(--ty-neutral-l-factor))
609
+ calc(c * var(--ty-c-soft-mult)) h
573
610
  );
574
611
  --ty-color-neutral-faint: oklch(
575
- calc(var(--ty-l-faint) * var(--ty-neutral-l-factor))
576
- calc(var(--ty-neutral-chroma) * var(--ty-c-faint-mult))
577
- var(--ty-neutral-hue)
612
+ from var(--ty-neutral-seed-resolved)
613
+ calc(var(--ty-l-faint) * var(--ty-neutral-l-factor))
614
+ calc(c * var(--ty-c-faint-mult)) h
578
615
  );
579
616
  --ty-bg-neutral: oklch(
580
- calc(var(--ty-l-bg-base) * var(--ty-neutral-l-factor))
581
- calc(var(--ty-neutral-chroma) * var(--ty-c-bg-base-mult))
582
- var(--ty-neutral-hue)
617
+ from var(--ty-neutral-seed-resolved)
618
+ calc(var(--ty-l-bg-base) * var(--ty-neutral-l-factor))
619
+ calc(c * var(--ty-c-bg-base-mult)) h
583
620
  );
584
621
  --ty-bg-neutral-bold: oklch(
585
- calc(var(--ty-l-bg-bold) * var(--ty-neutral-l-factor))
586
- calc(var(--ty-neutral-chroma) * var(--ty-c-bg-bold-mult))
587
- var(--ty-neutral-hue)
622
+ from var(--ty-neutral-seed-resolved)
623
+ calc(var(--ty-l-bg-bold) * var(--ty-neutral-l-factor))
624
+ calc(c * var(--ty-c-bg-bold-mult)) h
588
625
  );
589
626
  --ty-bg-neutral-soft: oklch(
590
- calc(var(--ty-l-bg-soft) * var(--ty-neutral-l-factor))
591
- calc(var(--ty-neutral-chroma) * var(--ty-c-bg-soft-mult))
592
- var(--ty-neutral-hue)
627
+ from var(--ty-neutral-seed-resolved)
628
+ calc(var(--ty-l-bg-soft) * var(--ty-neutral-l-factor))
629
+ calc(c * var(--ty-c-bg-soft-mult)) h
593
630
  );
594
631
  --ty-bg-neutral-strong: oklch(
595
- 0.25 calc(var(--ty-neutral-chroma) * 2) var(--ty-neutral-hue)
632
+ from var(--ty-neutral-seed-resolved) var(--ty-l-bg-neutral-strong)
633
+ calc(c * 2) h
596
634
  );
597
635
  --ty-bg-neutral-faint: oklch(
598
- 0.99 calc(var(--ty-neutral-chroma) * 0.4) var(--ty-neutral-hue)
636
+ from var(--ty-neutral-seed-resolved) var(--ty-l-bg-neutral-faint)
637
+ calc(c * var(--ty-c-bg-neutral-faint-mult)) h
599
638
  );
600
639
 
601
640
  /* ----------------------------------------------------------------
@@ -606,19 +645,19 @@ html:root {
606
645
  * border SHOULD track its flavor's ink.
607
646
  * --------------------------------------------------------------*/
608
647
  --ty-border-strong: oklch(
609
- var(--ty-l-border-strong) var(--ty-neutral-chroma) var(--ty-neutral-hue)
648
+ from var(--ty-neutral-seed-resolved) var(--ty-l-border-strong) c h
610
649
  );
611
650
  --ty-border: oklch(
612
- var(--ty-l-border) var(--ty-neutral-chroma) var(--ty-neutral-hue)
651
+ from var(--ty-neutral-seed-resolved) var(--ty-l-border) c h
613
652
  );
614
653
  --ty-border-bold: oklch(
615
- var(--ty-l-border-bold) var(--ty-neutral-chroma) var(--ty-neutral-hue)
654
+ from var(--ty-neutral-seed-resolved) var(--ty-l-border-bold) c h
616
655
  );
617
656
  --ty-border-soft: oklch(
618
- var(--ty-l-border-soft) var(--ty-neutral-chroma) var(--ty-neutral-hue)
657
+ from var(--ty-neutral-seed-resolved) var(--ty-l-border-soft) c h
619
658
  );
620
659
  --ty-border-faint: oklch(
621
- var(--ty-l-border-faint) var(--ty-neutral-chroma) var(--ty-neutral-hue)
660
+ from var(--ty-neutral-seed-resolved) var(--ty-l-border-faint) c h
622
661
  );
623
662
 
624
663
  /* ----------------------------------------------------------------
@@ -628,41 +667,54 @@ html:root {
628
667
  * other token here does; a rebrand now reaches body text too.
629
668
  * --------------------------------------------------------------*/
630
669
  --ty-text-strong: oklch(
631
- var(--ty-l-text-strong) var(--ty-neutral-chroma) var(--ty-neutral-hue)
670
+ from var(--ty-neutral-seed-resolved) var(--ty-l-text-strong) c h
632
671
  );
633
672
  --ty-text-bold: oklch(
634
- var(--ty-l-text-bold) var(--ty-neutral-chroma) var(--ty-neutral-hue)
673
+ from var(--ty-neutral-seed-resolved) var(--ty-l-text-bold) c h
635
674
  );
636
675
  --ty-text: oklch(
637
- var(--ty-l-text-base) var(--ty-neutral-chroma) var(--ty-neutral-hue)
676
+ from var(--ty-neutral-seed-resolved) var(--ty-l-text-base) c h
638
677
  );
639
678
  --ty-text-soft: oklch(
640
- var(--ty-l-text-soft) var(--ty-neutral-chroma) var(--ty-neutral-hue)
679
+ from var(--ty-neutral-seed-resolved) var(--ty-l-text-soft) c h
641
680
  );
642
681
  --ty-text-faint: oklch(
643
- var(--ty-l-text-faint) var(--ty-neutral-chroma) var(--ty-neutral-hue)
682
+ from var(--ty-neutral-seed-resolved) var(--ty-l-text-faint) c h
644
683
  );
645
684
 
646
685
  --ty-content-border: oklch(
647
- var(--ty-l-border-content) var(--ty-neutral-chroma) var(--ty-neutral-hue)
686
+ from var(--ty-neutral-seed-resolved) var(--ty-l-border-content) c h
648
687
  );
649
688
  --ty-elevated-border: oklch(
650
- var(--ty-l-border-elevated) var(--ty-neutral-chroma) var(--ty-neutral-hue)
689
+ from var(--ty-neutral-seed-resolved) var(--ty-l-border-elevated) c h
651
690
  );
652
691
  --ty-floating-border: oklch(
653
- var(--ty-l-border-floating) var(--ty-neutral-chroma) var(--ty-neutral-hue)
692
+ from var(--ty-neutral-seed-resolved) var(--ty-l-border-floating) c h
654
693
  );
655
694
 
656
695
  /* ----------------------------------------------------------------
657
696
  * Surfaces — monochrome by default; --ty-surface-chroma warms them.
658
697
  * --------------------------------------------------------------*/
659
698
  --ty-surface-canvas: oklch(
660
- 0.985 var(--ty-surface-chroma) var(--ty-brand-hue)
699
+ from var(--ty-primary-seed-resolved) var(--ty-l-surface-canvas)
700
+ var(--ty-surface-chroma) h
701
+ );
702
+ --ty-surface-content: oklch(
703
+ from var(--ty-primary-seed-resolved) var(--ty-l-surface-content)
704
+ var(--ty-surface-chroma) h
705
+ );
706
+ --ty-surface-elevated: oklch(
707
+ from var(--ty-primary-seed-resolved) var(--ty-l-surface-elevated)
708
+ var(--ty-surface-chroma) h
709
+ );
710
+ --ty-surface-floating: oklch(
711
+ from var(--ty-primary-seed-resolved) var(--ty-l-surface-floating)
712
+ var(--ty-surface-chroma) h
713
+ );
714
+ --ty-surface-input: oklch(
715
+ from var(--ty-primary-seed-resolved) var(--ty-l-surface-input)
716
+ var(--ty-surface-chroma) h
661
717
  );
662
- --ty-surface-content: oklch(1 0 0);
663
- --ty-surface-elevated: oklch(1 0 0);
664
- --ty-surface-floating: oklch(1 0 0);
665
- --ty-surface-input: oklch(1 0 0);
666
718
 
667
719
  /* ----------------------------------------------------------------
668
720
  * Inputs — tied to neutral ramp so form controls retint with brand.
@@ -678,7 +730,7 @@ html:root {
678
730
  --ty-input-disabled-color: var(--ty-color-neutral-bold);
679
731
  --ty-input-shadow-focus: color-mix(
680
732
  in oklab,
681
- var(--ty-color-primary) 5%,
733
+ var(--ty-color-primary) var(--ty-focus-ring-alpha),
682
734
  transparent
683
735
  );
684
736
  }
@@ -700,16 +752,13 @@ html:root {
700
752
  * the oklch(from var(--ty-color-*)) formulas resolve per-mode automatically,
701
753
  * so no dark duplicate is needed.
702
754
  * --------------------------------------------------------------*/
703
- html:root {
755
+ html:root,
756
+ [data-ty-theme] {
704
757
  /* base fill per flavor (= flavor color, theme-adjusted by Axis B) */
705
758
  --ty-solid-primary: oklch(
706
759
  from var(--ty-color-primary) calc(l + var(--ty-solid-l))
707
760
  calc(c * var(--ty-solid-c)) calc(h + var(--ty-solid-h))
708
761
  );
709
- --ty-solid-secondary: oklch(
710
- from var(--ty-color-secondary) calc(l + var(--ty-solid-l))
711
- calc(c * var(--ty-solid-c)) calc(h + var(--ty-solid-h))
712
- );
713
762
  --ty-solid-success: oklch(
714
763
  from var(--ty-color-success) calc(l + var(--ty-solid-l))
715
764
  calc(c * var(--ty-solid-c)) calc(h + var(--ty-solid-h))
@@ -724,8 +773,8 @@ html:root {
724
773
  );
725
774
  /* neutral is a deliberate dark grey fill, not the neutral text color */
726
775
  --ty-solid-neutral: oklch(
727
- 0.4 calc(var(--ty-neutral-chroma) * var(--ty-c-strong-mult))
728
- var(--ty-neutral-hue)
776
+ from var(--ty-neutral-seed-resolved) var(--ty-l-solid-neutral)
777
+ calc(c * var(--ty-c-strong-mult)) h
729
778
  );
730
779
 
731
780
  /* ----------------------------------------------------------------
@@ -765,18 +814,6 @@ html:root {
765
814
  clamp(0, (var(--ty-solid-fg-threshold) - l) * 1000, 1) 0 0
766
815
  );
767
816
 
768
- --ty-solid-secondary-fg: oklch(
769
- from var(--ty-solid-secondary)
770
- clamp(0, (var(--ty-solid-fg-threshold) - l) * 1000, 1) 0 0
771
- );
772
- --ty-solid-secondary-soft-fg: oklch(
773
- from var(--ty-solid-secondary-soft)
774
- clamp(0, (var(--ty-solid-fg-threshold) - l) * 1000, 1) 0 0
775
- );
776
- --ty-solid-secondary-strong-fg: oklch(
777
- from var(--ty-solid-secondary-strong)
778
- clamp(0, (var(--ty-solid-fg-threshold) - l) * 1000, 1) 0 0
779
- );
780
817
 
781
818
  --ty-solid-success-fg: oklch(
782
819
  from var(--ty-solid-success)
@@ -844,18 +881,6 @@ html:root {
844
881
  from var(--ty-solid-primary) calc(l + var(--ty-solid-soft-l)) c h
845
882
  );
846
883
 
847
- --ty-solid-secondary-hover: oklch(
848
- from var(--ty-solid-secondary) calc(l + var(--ty-solid-hover-l)) c h
849
- );
850
- --ty-solid-secondary-active: oklch(
851
- from var(--ty-solid-secondary) calc(l + var(--ty-solid-active-l)) c h
852
- );
853
- --ty-solid-secondary-strong: oklch(
854
- from var(--ty-solid-secondary) calc(l + var(--ty-solid-strong-l)) c h
855
- );
856
- --ty-solid-secondary-soft: oklch(
857
- from var(--ty-solid-secondary) calc(l + var(--ty-solid-soft-l)) c h
858
- );
859
884
 
860
885
  --ty-solid-success-hover: oklch(
861
886
  from var(--ty-solid-success) calc(l + var(--ty-solid-hover-l)) c h
@@ -910,53 +935,439 @@ html:root {
910
935
  );
911
936
  }
912
937
 
938
+
913
939
  /* =====================================================================
914
- * SECTION 2 DARK PER-MODE DATA ONLY
940
+ * SECTION 3THEME TRANSITIONS
915
941
  * =====================================================================
916
- * No formulas here. Every computed token is declared once at html:root
917
- * above and resolves per-mode through its dial inputs (SECTION 1 flips
918
- * those at html.dark). This block holds only values that ARE the dark
919
- * design data hand-tuned absolutes with no light-mode derivation.
942
+ *
943
+ * Every dial above is a plain number (or percentage) and every color
944
+ * in the system is a pure function of those dials. Registering the
945
+ * dials as typed custom properties makes them INTERPOLABLE, so a theme
946
+ * or mode switch (html.dark, html.love, a [data-ty-theme] pack) does
947
+ * not snap: the dials animate, and every derived color — buttons,
948
+ * borders, surfaces, text, focus rings — crossfades through OKLCH
949
+ * space frame by frame. No JS, no repaint tricks; it falls out of the
950
+ * dials-not-colors architecture.
951
+ *
952
+ * Opt out (or retune) per app:
953
+ * :root { --ty-theme-transition: 0s; } no animation
954
+ * :root { --ty-theme-transition: 1.2s; } slower crossfade
955
+ * Reduced-motion users never get the animation.
956
+ *
957
+ * Browsers without @property simply skip registration — themes still
958
+ * work, switches just snap (the pre-TC37 behavior).
920
959
  * ===================================================================== */
921
960
 
922
- html.dark,
923
- html[data-theme="dark"] {
924
- /* Surface ladder — hand-tuned; nothing to derive from light (which
925
- * is 0.985 canvas + pure white everywhere else). */
926
- --ty-surface-canvas: oklch(0.12 var(--ty-surface-chroma) var(--ty-brand-hue));
927
- --ty-surface-content: oklch(
928
- 0.16 var(--ty-surface-chroma) var(--ty-brand-hue)
929
- );
930
- --ty-surface-elevated: oklch(
931
- 0.19 var(--ty-surface-chroma) var(--ty-brand-hue)
932
- );
933
- --ty-surface-floating: oklch(
934
- 0.22 var(--ty-surface-chroma) var(--ty-brand-hue)
935
- );
936
- --ty-surface-input: oklch(0.18 var(--ty-surface-chroma) var(--ty-brand-hue));
937
-
938
- /* Focus ring needs more alpha against dark surfaces (light: 5%). */
939
- --ty-input-shadow-focus: color-mix(
940
- in oklab,
941
- var(--ty-color-primary) 20%,
942
- transparent
943
- );
944
-
945
- /* Hand-pinned bg extremes — these OPPOSE the mode (strong bg is dark
946
- * in light mode, light in dark mode) so they can't ride the bg ramp. */
947
- --ty-bg-neutral-strong: oklch(
948
- 0.95 calc(var(--ty-neutral-chroma) * 2) var(--ty-neutral-hue)
949
- );
950
- --ty-bg-neutral-faint: oklch(
951
- 0.15 calc(var(--ty-neutral-chroma) * 2) var(--ty-neutral-hue)
952
- );
961
+ @property --ty-brand-hue {
962
+ syntax: "<number>";
963
+ inherits: true;
964
+ initial-value: 45;
965
+ }
966
+ @property --ty-brand-chroma {
967
+ syntax: "<number>";
968
+ inherits: true;
969
+ initial-value: 0.125;
970
+ }
971
+ @property --ty-surface-chroma {
972
+ syntax: "<number>";
973
+ inherits: true;
974
+ initial-value: 0;
975
+ }
976
+ @property --ty-success-hue {
977
+ syntax: "<number>";
978
+ inherits: true;
979
+ initial-value: 145;
980
+ }
981
+ @property --ty-success-chroma {
982
+ syntax: "<number>";
983
+ inherits: true;
984
+ initial-value: 0.135;
985
+ }
986
+ @property --ty-warning-hue {
987
+ syntax: "<number>";
988
+ inherits: true;
989
+ initial-value: 75;
990
+ }
991
+ @property --ty-warning-chroma {
992
+ syntax: "<number>";
993
+ inherits: true;
994
+ initial-value: 0.25;
995
+ }
996
+ @property --ty-danger-hue {
997
+ syntax: "<number>";
998
+ inherits: true;
999
+ initial-value: 25;
1000
+ }
1001
+ @property --ty-danger-chroma {
1002
+ syntax: "<number>";
1003
+ inherits: true;
1004
+ initial-value: 0.164;
1005
+ }
1006
+ @property --ty-neutral-hue {
1007
+ syntax: "<number>";
1008
+ inherits: true;
1009
+ initial-value: 0;
1010
+ }
1011
+ @property --ty-neutral-chroma {
1012
+ syntax: "<number>";
1013
+ inherits: true;
1014
+ initial-value: 0;
1015
+ }
1016
+ @property --ty-l-strong {
1017
+ syntax: "<number>";
1018
+ inherits: true;
1019
+ initial-value: 0.38;
1020
+ }
1021
+ @property --ty-l-bold {
1022
+ syntax: "<number>";
1023
+ inherits: true;
1024
+ initial-value: 0.46;
1025
+ }
1026
+ @property --ty-l-base {
1027
+ syntax: "<number>";
1028
+ inherits: true;
1029
+ initial-value: 0.54;
1030
+ }
1031
+ @property --ty-l-soft {
1032
+ syntax: "<number>";
1033
+ inherits: true;
1034
+ initial-value: 0.72;
1035
+ }
1036
+ @property --ty-l-faint {
1037
+ syntax: "<number>";
1038
+ inherits: true;
1039
+ initial-value: 0.88;
1040
+ }
1041
+ @property --ty-l-bg-base {
1042
+ syntax: "<number>";
1043
+ inherits: true;
1044
+ initial-value: 0.96;
1045
+ }
1046
+ @property --ty-l-bg-bold {
1047
+ syntax: "<number>";
1048
+ inherits: true;
1049
+ initial-value: 0.92;
1050
+ }
1051
+ @property --ty-l-bg-soft {
1052
+ syntax: "<number>";
1053
+ inherits: true;
1054
+ initial-value: 0.98;
1055
+ }
1056
+ @property --ty-l-text-strong {
1057
+ syntax: "<number>";
1058
+ inherits: true;
1059
+ initial-value: 0;
1060
+ }
1061
+ @property --ty-l-text-bold {
1062
+ syntax: "<number>";
1063
+ inherits: true;
1064
+ initial-value: 0;
1065
+ }
1066
+ @property --ty-l-text-base {
1067
+ syntax: "<number>";
1068
+ inherits: true;
1069
+ initial-value: 0.21;
1070
+ }
1071
+ @property --ty-l-text-soft {
1072
+ syntax: "<number>";
1073
+ inherits: true;
1074
+ initial-value: 0.37;
1075
+ }
1076
+ @property --ty-l-text-faint {
1077
+ syntax: "<number>";
1078
+ inherits: true;
1079
+ initial-value: 0.71;
1080
+ }
1081
+ @property --ty-l-border-content {
1082
+ syntax: "<number>";
1083
+ inherits: true;
1084
+ initial-value: 0.93;
1085
+ }
1086
+ @property --ty-l-border-elevated {
1087
+ syntax: "<number>";
1088
+ inherits: true;
1089
+ initial-value: 0.93;
1090
+ }
1091
+ @property --ty-l-border-floating {
1092
+ syntax: "<number>";
1093
+ inherits: true;
1094
+ initial-value: 0.93;
1095
+ }
1096
+ @property --ty-l-border-strong {
1097
+ syntax: "<number>";
1098
+ inherits: true;
1099
+ initial-value: 0.46;
1100
+ }
1101
+ @property --ty-l-border-bold {
1102
+ syntax: "<number>";
1103
+ inherits: true;
1104
+ initial-value: 0.64;
1105
+ }
1106
+ @property --ty-l-border {
1107
+ syntax: "<number>";
1108
+ inherits: true;
1109
+ initial-value: 0.76;
1110
+ }
1111
+ @property --ty-l-border-soft {
1112
+ syntax: "<number>";
1113
+ inherits: true;
1114
+ initial-value: 0.88;
1115
+ }
1116
+ @property --ty-l-border-faint {
1117
+ syntax: "<number>";
1118
+ inherits: true;
1119
+ initial-value: 0.92;
1120
+ }
1121
+ @property --ty-l-surface-canvas {
1122
+ syntax: "<number>";
1123
+ inherits: true;
1124
+ initial-value: 0.985;
1125
+ }
1126
+ @property --ty-l-surface-content {
1127
+ syntax: "<number>";
1128
+ inherits: true;
1129
+ initial-value: 1;
1130
+ }
1131
+ @property --ty-l-surface-elevated {
1132
+ syntax: "<number>";
1133
+ inherits: true;
1134
+ initial-value: 1;
1135
+ }
1136
+ @property --ty-l-surface-floating {
1137
+ syntax: "<number>";
1138
+ inherits: true;
1139
+ initial-value: 1;
1140
+ }
1141
+ @property --ty-l-surface-input {
1142
+ syntax: "<number>";
1143
+ inherits: true;
1144
+ initial-value: 1;
1145
+ }
1146
+ @property --ty-l-solid-neutral {
1147
+ syntax: "<number>";
1148
+ inherits: true;
1149
+ initial-value: 0.4;
1150
+ }
1151
+ @property --ty-l-bg-neutral-strong {
1152
+ syntax: "<number>";
1153
+ inherits: true;
1154
+ initial-value: 0.25;
1155
+ }
1156
+ @property --ty-l-bg-neutral-faint {
1157
+ syntax: "<number>";
1158
+ inherits: true;
1159
+ initial-value: 0.99;
1160
+ }
1161
+ @property --ty-c-bg-neutral-faint-mult {
1162
+ syntax: "<number>";
1163
+ inherits: true;
1164
+ initial-value: 0.4;
1165
+ }
1166
+ @property --ty-c-strong-mult {
1167
+ syntax: "<number>";
1168
+ inherits: true;
1169
+ initial-value: 0.77;
1170
+ }
1171
+ @property --ty-c-bold-mult {
1172
+ syntax: "<number>";
1173
+ inherits: true;
1174
+ initial-value: 1;
1175
+ }
1176
+ @property --ty-c-base-mult {
1177
+ syntax: "<number>";
1178
+ inherits: true;
1179
+ initial-value: 0.92;
1180
+ }
1181
+ @property --ty-c-soft-mult {
1182
+ syntax: "<number>";
1183
+ inherits: true;
1184
+ initial-value: 0.77;
1185
+ }
1186
+ @property --ty-c-faint-mult {
1187
+ syntax: "<number>";
1188
+ inherits: true;
1189
+ initial-value: 0.46;
1190
+ }
1191
+ @property --ty-c-bg-base-mult {
1192
+ syntax: "<number>";
1193
+ inherits: true;
1194
+ initial-value: 0.15;
1195
+ }
1196
+ @property --ty-c-bg-bold-mult {
1197
+ syntax: "<number>";
1198
+ inherits: true;
1199
+ initial-value: 0.38;
1200
+ }
1201
+ @property --ty-c-bg-soft-mult {
1202
+ syntax: "<number>";
1203
+ inherits: true;
1204
+ initial-value: 0.08;
1205
+ }
1206
+ @property --ty-primary-l-factor {
1207
+ syntax: "<number>";
1208
+ inherits: true;
1209
+ initial-value: 1;
1210
+ }
1211
+ @property --ty-success-l-factor {
1212
+ syntax: "<number>";
1213
+ inherits: true;
1214
+ initial-value: 1;
1215
+ }
1216
+ @property --ty-warning-l-factor {
1217
+ syntax: "<number>";
1218
+ inherits: true;
1219
+ initial-value: 1.15;
1220
+ }
1221
+ @property --ty-danger-l-factor {
1222
+ syntax: "<number>";
1223
+ inherits: true;
1224
+ initial-value: 1;
1225
+ }
1226
+ @property --ty-neutral-l-factor {
1227
+ syntax: "<number>";
1228
+ inherits: true;
1229
+ initial-value: 1;
1230
+ }
1231
+ @property --ty-solid-hover-l {
1232
+ syntax: "<number>";
1233
+ inherits: true;
1234
+ initial-value: -0.04;
1235
+ }
1236
+ @property --ty-solid-active-l {
1237
+ syntax: "<number>";
1238
+ inherits: true;
1239
+ initial-value: -0.08;
1240
+ }
1241
+ @property --ty-solid-strong-l {
1242
+ syntax: "<number>";
1243
+ inherits: true;
1244
+ initial-value: -0.06;
1245
+ }
1246
+ @property --ty-solid-soft-l {
1247
+ syntax: "<number>";
1248
+ inherits: true;
1249
+ initial-value: 0.1;
1250
+ }
1251
+ @property --ty-solid-l {
1252
+ syntax: "<number>";
1253
+ inherits: true;
1254
+ initial-value: 0;
1255
+ }
1256
+ @property --ty-solid-c {
1257
+ syntax: "<number>";
1258
+ inherits: true;
1259
+ initial-value: 1;
1260
+ }
1261
+ @property --ty-solid-h {
1262
+ syntax: "<number>";
1263
+ inherits: true;
1264
+ initial-value: 0;
1265
+ }
1266
+ @property --ty-solid-fg-threshold {
1267
+ syntax: "<number>";
1268
+ inherits: true;
1269
+ initial-value: 0.62;
1270
+ }
1271
+ @property --ty-focus-ring-alpha {
1272
+ syntax: "<percentage>";
1273
+ inherits: true;
1274
+ initial-value: 5%;
1275
+ }
953
1276
 
954
- /* Neutral solid fill is an "ink" — dark grey in BOTH modes (0.4 light),
955
- * dimmed a notch here. It ignores the emphasis curve and Axis B. */
956
- --ty-solid-neutral: oklch(
957
- 0.23 calc(var(--ty-neutral-chroma) * var(--ty-c-strong-mult))
958
- var(--ty-neutral-hue)
959
- );
1277
+ @property --ty-primary-seed-resolved {
1278
+ syntax: "<color>";
1279
+ inherits: true;
1280
+ initial-value: #808080;
1281
+ }
1282
+ @property --ty-success-seed-resolved {
1283
+ syntax: "<color>";
1284
+ inherits: true;
1285
+ initial-value: #808080;
1286
+ }
1287
+ @property --ty-warning-seed-resolved {
1288
+ syntax: "<color>";
1289
+ inherits: true;
1290
+ initial-value: #808080;
1291
+ }
1292
+ @property --ty-danger-seed-resolved {
1293
+ syntax: "<color>";
1294
+ inherits: true;
1295
+ initial-value: #808080;
1296
+ }
1297
+ @property --ty-neutral-seed-resolved {
1298
+ syntax: "<color>";
1299
+ inherits: true;
1300
+ initial-value: #808080;
1301
+ }
960
1302
 
961
- --ty-neutral-l-factor: 0.8;
1303
+ @media (prefers-reduced-motion: no-preference) {
1304
+ html,
1305
+ [data-ty-theme] {
1306
+ transition-property:
1307
+ --ty-brand-hue,
1308
+ --ty-brand-chroma,
1309
+ --ty-surface-chroma,
1310
+ --ty-success-hue,
1311
+ --ty-success-chroma,
1312
+ --ty-warning-hue,
1313
+ --ty-warning-chroma,
1314
+ --ty-danger-hue,
1315
+ --ty-danger-chroma,
1316
+ --ty-neutral-hue,
1317
+ --ty-neutral-chroma,
1318
+ --ty-l-strong,
1319
+ --ty-l-bold,
1320
+ --ty-l-base,
1321
+ --ty-l-soft,
1322
+ --ty-l-faint,
1323
+ --ty-l-bg-base,
1324
+ --ty-l-bg-bold,
1325
+ --ty-l-bg-soft,
1326
+ --ty-l-text-strong,
1327
+ --ty-l-text-bold,
1328
+ --ty-l-text-base,
1329
+ --ty-l-text-soft,
1330
+ --ty-l-text-faint,
1331
+ --ty-l-border-content,
1332
+ --ty-l-border-elevated,
1333
+ --ty-l-border-floating,
1334
+ --ty-l-border-strong,
1335
+ --ty-l-border-bold,
1336
+ --ty-l-border,
1337
+ --ty-l-border-soft,
1338
+ --ty-l-border-faint,
1339
+ --ty-l-surface-canvas,
1340
+ --ty-l-surface-content,
1341
+ --ty-l-surface-elevated,
1342
+ --ty-l-surface-floating,
1343
+ --ty-l-surface-input,
1344
+ --ty-l-solid-neutral,
1345
+ --ty-l-bg-neutral-strong,
1346
+ --ty-l-bg-neutral-faint,
1347
+ --ty-c-bg-neutral-faint-mult,
1348
+ --ty-c-strong-mult,
1349
+ --ty-c-bold-mult,
1350
+ --ty-c-base-mult,
1351
+ --ty-c-soft-mult,
1352
+ --ty-c-faint-mult,
1353
+ --ty-c-bg-base-mult,
1354
+ --ty-c-bg-bold-mult,
1355
+ --ty-c-bg-soft-mult,
1356
+ --ty-primary-l-factor,
1357
+ --ty-success-l-factor,
1358
+ --ty-warning-l-factor,
1359
+ --ty-danger-l-factor,
1360
+ --ty-neutral-l-factor,
1361
+ --ty-solid-hover-l,
1362
+ --ty-solid-active-l,
1363
+ --ty-solid-strong-l,
1364
+ --ty-solid-soft-l,
1365
+ --ty-solid-l,
1366
+ --ty-solid-c,
1367
+ --ty-solid-h,
1368
+ --ty-solid-fg-threshold,
1369
+ --ty-focus-ring-alpha;
1370
+ transition-duration: var(--ty-theme-transition, 0.45s);
1371
+ transition-timing-function: ease;
1372
+ }
962
1373
  }