tyrell-components 1.0.0-TC36 → 1.0.0-TC37

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