tyrell-components 1.0.0-TC23 → 1.0.0-TC24

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.
package/css/tyrell.css CHANGED
@@ -352,50 +352,58 @@ COMPONENT TOKENS
352
352
  --ty-input-warning-border: var(--ty-color-warning);
353
353
 
354
354
  /* =================================================================
355
- SOLID BUTTON FILLS — saturated brand backgrounds for appearance="solid"
356
- Each flavor defines:
357
- --ty-solid-{flavor} base saturated fill
358
- --ty-solid-{flavor}-strong stronger fill (for solid+ tone)
359
- --ty-solid-{flavor}-soft softer fill (for solid- tone)
360
- --ty-solid-{flavor}-fg paired text color (default white)
361
- Strong/soft default to var(--ty-color-{flavor}-strong/-soft) so they
362
- inherit from the existing color hierarchy. Override per flavor if needed.
355
+ SOLID BUTTON FILLS — plain default values (the contract). The smart
356
+ per-state derivation (hover/active/tone via OKLCH) lives in the theme
357
+ engines (tyrell-brand.css / tyrell-simple.css), not here. hover/active
358
+ alias to -strong as a simple default; a theme overrides them.
363
359
  ================================================================= */
364
360
 
365
361
  /* Primary */
366
362
  --ty-solid-primary: #4076b9;
367
363
  --ty-solid-primary-strong: var(--ty-color-primary-bold);
368
364
  --ty-solid-primary-soft: #7ea7d9;
365
+ --ty-solid-primary-hover: var(--ty-solid-primary-strong);
366
+ --ty-solid-primary-active: var(--ty-solid-primary-strong);
369
367
  --ty-solid-primary-fg: white;
370
368
 
371
369
  /* Secondary */
372
370
  --ty-solid-secondary: #7e67b4;
373
371
  --ty-solid-secondary-strong: #7d58d1;
374
372
  --ty-solid-secondary-soft: #9f8ec5;
373
+ --ty-solid-secondary-hover: var(--ty-solid-secondary-strong);
374
+ --ty-solid-secondary-active: var(--ty-solid-secondary-strong);
375
375
  --ty-solid-secondary-fg: white;
376
376
 
377
377
  /* Success */
378
378
  --ty-solid-success: #3bb68d;
379
379
  --ty-solid-success-strong: #27956e;
380
380
  --ty-solid-success-soft: #69b99e;
381
+ --ty-solid-success-hover: var(--ty-solid-success-strong);
382
+ --ty-solid-success-active: var(--ty-solid-success-strong);
381
383
  --ty-solid-success-fg: white;
382
384
 
383
385
  /* Danger */
384
386
  --ty-solid-danger: #df5b5b;
385
387
  --ty-solid-danger-strong: #cc3e3e;
386
388
  --ty-solid-danger-soft: #d57a7a;
389
+ --ty-solid-danger-hover: var(--ty-solid-danger-strong);
390
+ --ty-solid-danger-active: var(--ty-solid-danger-strong);
387
391
  --ty-solid-danger-fg: white;
388
392
 
389
393
  /* Warning */
390
394
  --ty-solid-warning: #e1a644;
391
395
  --ty-solid-warning-strong: #f59e0b;
392
396
  --ty-solid-warning-soft: #fbc56d;
397
+ --ty-solid-warning-hover: var(--ty-solid-warning-strong);
398
+ --ty-solid-warning-active: var(--ty-solid-warning-strong);
393
399
  --ty-solid-warning-fg: white;
394
400
 
395
401
  /* Neutral */
396
402
  --ty-solid-neutral: #414141;
397
403
  --ty-solid-neutral-strong: #000000;
398
404
  --ty-solid-neutral-soft: #6e6e6e;
405
+ --ty-solid-neutral-hover: var(--ty-solid-neutral-strong);
406
+ --ty-solid-neutral-active: var(--ty-solid-neutral-strong);
399
407
  --ty-solid-neutral-fg: white;
400
408
 
401
409
  /* =================================================================
@@ -695,42 +703,48 @@ Emphasis logic inverts: lighter = more emphasis
695
703
  0 20px 25px -5px rgba(0, 0, 0, 0.3), 0 8px 10px -6px rgba(0, 0, 0, 0.3);
696
704
  --ty-shadow-2xl: 0 25px 50px -12px rgba(0, 0, 0, 0.5);
697
705
 
698
- /* Solid button fills for dark mode — strong/soft/fg chain through automatically.
699
- Note: --ty-color-{flavor}-strong is light-toned in dark mode (emphasis
700
- inverts), so solid+ buttons will have a light bg with white text — low
701
- contrast for some flavors. Override per flavor via --ty-solid-{flavor}-fg
702
- if a specific brand needs darker text. */
706
+ /* Solid button fills plain dark defaults. hover/active alias -strong;
707
+ theme engines override with smart per-state derivation. */
703
708
  --ty-solid-primary: #3e536c;
704
709
  --ty-solid-primary-strong: #426084;
705
710
  --ty-solid-primary-soft: #343f4c;
711
+ --ty-solid-primary-hover: var(--ty-solid-primary-strong);
712
+ --ty-solid-primary-active: var(--ty-solid-primary-strong);
706
713
  --ty-solid-primary-fg: white;
707
714
 
708
715
  --ty-solid-secondary: #7e67b4;
709
716
  --ty-solid-secondary-strong: #8269bc;
710
717
  --ty-solid-secondary-soft: #52466a;
718
+ --ty-solid-secondary-hover: var(--ty-solid-secondary-strong);
719
+ --ty-solid-secondary-active: var(--ty-solid-secondary-strong);
711
720
  --ty-solid-secondary-fg: white;
712
721
 
713
- /* Success */
714
722
  --ty-solid-success: #3bb68d;
715
723
  --ty-solid-success-strong: #459679;
716
724
  --ty-solid-success-soft: #285748;
725
+ --ty-solid-success-hover: var(--ty-solid-success-strong);
726
+ --ty-solid-success-active: var(--ty-solid-success-strong);
717
727
  --ty-solid-success-fg: white;
718
728
 
719
- /* Danger */
720
729
  --ty-solid-danger: #df5b5b;
721
730
  --ty-solid-danger-strong: #cc3e3e;
722
731
  --ty-solid-danger-soft: #875656;
732
+ --ty-solid-danger-hover: var(--ty-solid-danger-strong);
733
+ --ty-solid-danger-active: var(--ty-solid-danger-strong);
723
734
  --ty-solid-danger-fg: white;
724
735
 
725
- /* Warning */
726
736
  --ty-solid-warning: #e1a644;
727
737
  --ty-solid-warning-strong: #f59e0b;
728
738
  --ty-solid-warning-soft: #8b6334;
739
+ --ty-solid-warning-hover: var(--ty-solid-warning-strong);
740
+ --ty-solid-warning-active: var(--ty-solid-warning-strong);
729
741
  --ty-solid-warning-fg: white;
730
742
 
731
743
  --ty-solid-neutral: #414141;
732
744
  --ty-solid-neutral-strong: #4c4c4c;
733
745
  --ty-solid-neutral-soft: #2a2a2a;
746
+ --ty-solid-neutral-hover: var(--ty-solid-neutral-strong);
747
+ --ty-solid-neutral-active: var(--ty-solid-neutral-strong);
734
748
  --ty-solid-neutral-fg: white;
735
749
 
736
750
  /* Input component tokens - dark mode */
@@ -54,15 +54,19 @@
54
54
  * FILE LAYOUT
55
55
  * =====================================================================
56
56
  *
57
- * SECTION 1 — KNOBS (~lines 80–225)
58
- * The variables you might want to override. Five tiers from drop-in
59
- * rebrand (Tier 1) to surgical per-flavor tweak (Tier 5).
57
+ * SECTION 1 — KNOBS
58
+ * The variables you might want to override. Six tiers from drop-in
59
+ * rebrand (Tier 1) to surgical per-flavor tweak (Tier 5) plus solid
60
+ * buttons (Tier 6).
60
61
  *
61
62
  * SECTION 2 — IMPLEMENTATION
62
63
  * The oklch() expressions that wire the knobs through to the actual
63
64
  * color tokens. Rarely needs editing — Section 1 is the contract.
64
65
  *
65
- * Browser support: OKLCH is in every evergreen browser since mid-2023.
66
+ * Browser support: oklch() is in every evergreen browser since mid-2023.
67
+ * Tier 6 (solid) additionally uses OKLCH relative color — oklch(from …) —
68
+ * which lands later: Chrome 119, Safari 16.4, Firefox 128 (mid-2024).
69
+ * Solid fills have no fallback below those versions.
66
70
  *
67
71
  * ===================================================================== */
68
72
 
@@ -81,6 +85,8 @@
81
85
  * Tier 5 — PER-FLAVOR L-FACTOR per-flavor lightness multiplier — push
82
86
  * one flavor up or down without touching
83
87
  * the others. Default 1.
88
+ * Tier 6 — SOLID FILLS solid-button system: hover/active/tone
89
+ * L offsets + per-theme dim/desaturate.
84
90
  * ===================================================================== */
85
91
 
86
92
  :root {
@@ -91,7 +97,7 @@
91
97
  * --------------------------------------------------------------*/
92
98
 
93
99
  --ty-brand-hue: 230;
94
- --ty-brand-chroma: 0.13;
100
+ --ty-brand-chroma: 0.2;
95
101
 
96
102
  /* Secondary rotates from brand by an exposed offset. Default +60°
97
103
  * (sibling accent). Try 30° for a close sibling, 120° for triadic,
@@ -180,6 +186,33 @@
180
186
  --ty-warning-l-factor: 1.15;
181
187
  --ty-danger-l-factor: 1;
182
188
  --ty-neutral-l-factor: 1;
189
+
190
+ /* ----------------------------------------------------------------
191
+ * Tier 6 — SOLID FILLS
192
+ * Solid buttons are their OWN system, not the emphasis ramp. Each
193
+ * flavor's fill defaults to --ty-color-{flavor}; the knobs below
194
+ * derive its hover / active / tone+ / tone- and per-theme adjust.
195
+ * Math lives in SECTION 2 (search "Tier 6 — SOLID"); these are the
196
+ * dials.
197
+ *
198
+ * Axis A — interaction & tone, OKLCH L offsets on the fill.
199
+ * Axis B — per-theme adjust applied to the base fill (dim/desaturate).
200
+ *
201
+ * NOTE: like Tier 5, the emphasis curve flips for dark, so these L
202
+ * offsets are sign-flipped in `html.dark` below (darken in light =
203
+ * lighten in dark). Keep the two blocks in sync.
204
+ * --------------------------------------------------------------*/
205
+
206
+ /* Axis A — interaction (light: darken on press, so offsets are negative) */
207
+ --ty-solid-hover-l: -0.04; /* :hover */
208
+ --ty-solid-active-l: -0.08; /* :active */
209
+ --ty-solid-strong-l: -0.06; /* tone+ */
210
+ --ty-solid-soft-l: 0.1; /* tone- */
211
+
212
+ /* Axis B — per-theme adjust (light reads fine → identity) */
213
+ --ty-solid-l: 0; /* lightness offset — negative dims */
214
+ --ty-solid-c: 1; /* chroma multiplier — <1 desaturates */
215
+ --ty-solid-h: 0; /* hue offset (deg) */
183
216
  }
184
217
 
185
218
  /* Dark mode overrides for the L-curve and saturation curve. Tier 1 + 2
@@ -188,8 +221,8 @@ html.dark,
188
221
  html[data-theme="dark"] {
189
222
  /* Tier 3 dark — inverted curve. Higher L = lighter text = more
190
223
  * emphasis on a dark background. */
191
- --ty-l-strong: 0.86;
192
- --ty-l-bold: 0.74;
224
+ --ty-l-strong: 0.72;
225
+ --ty-l-bold: 0.66;
193
226
  --ty-l-base: 0.62;
194
227
  --ty-l-soft: 0.46;
195
228
  --ty-l-faint: 0.3;
@@ -209,6 +242,18 @@ html[data-theme="dark"] {
209
242
  --ty-c-bg-base-mult: 0.38;
210
243
  --ty-c-bg-bold-mult: 0.54;
211
244
  --ty-c-bg-soft-mult: 0.23;
245
+
246
+ /* Tier 6 dark — interaction offsets flip sign (press LIGHTENS on dark),
247
+ * and the per-theme adjust dims + desaturates the fills against the
248
+ * dark canvas. (Computed solid tokens live in SECTION 2 DARK.) */
249
+ --ty-solid-hover-l: 0.04; /* :hover */
250
+ --ty-solid-active-l: 0.08; /* :active */
251
+ --ty-solid-strong-l: 0.06; /* tone+ */
252
+ --ty-solid-soft-l: -0.1; /* tone- */
253
+
254
+ --ty-solid-l: -0.25; /* dim against dark canvas */
255
+ --ty-solid-c: 0.65; /* desaturate against dark canvas */
256
+ --ty-solid-h: 0; /* hue offset */
212
257
  }
213
258
 
214
259
  /* =====================================================================
@@ -529,48 +574,137 @@ html[data-theme="dark"] {
529
574
  var(--ty-color-primary) 5%,
530
575
  transparent
531
576
  );
577
+ }
532
578
 
533
- /* ----------------------------------------------------------------
534
- * Solid buttonsre-route through --ty-color-*.
535
- * --------------------------------------------------------------*/
536
- --ty-solid-primary: var(--ty-color-primary);
537
- --ty-solid-primary-strong: var(--ty-color-primary-bold);
538
- --ty-solid-primary-soft: var(--ty-color-primary-soft);
539
- --ty-solid-primary-fg: white;
579
+ /* ----------------------------------------------------------------
580
+ * Tier 6SOLID (implementation)
581
+ * Solid is its OWN system, NOT the text/emphasis ramp. The dials
582
+ * (--ty-solid-hover-l / -active-l / -strong-l / -soft-l and
583
+ * --ty-solid-l / -c / -h) live in SECTION 1, Tier 6. Below is the
584
+ * derivation only: base fill bakes in the per-theme adjust (Axis B);
585
+ * hover/active/strong/soft offset the base by Axis A. Override any
586
+ * single --ty-solid-{flavor}-{state} to recolor just that segment.
587
+ *
588
+ * Declared at `html:root` (specificity 0,1,1) — NOT plain `:root` (0,1,0) —
589
+ * on purpose: it must out-rank tyrell.css's hardcoded dark solids at
590
+ * `html.dark` (0,1,1). It wins light by specificity over base's `html{}`,
591
+ * and wins dark by source order over base's `html.dark` (brand loads after).
592
+ * That's what lets dark solids re-tint with --ty-brand-hue. Declared ONCE —
593
+ * the oklch(from var(--ty-color-*)) formulas resolve per-mode automatically,
594
+ * so no dark duplicate is needed.
595
+ * --------------------------------------------------------------*/
596
+ html:root {
597
+ /* base fill per flavor (= flavor color, theme-adjusted by Axis B) */
598
+ --ty-solid-primary: oklch(
599
+ from var(--ty-color-primary) calc(l + var(--ty-solid-l))
600
+ calc(c * var(--ty-solid-c)) calc(h + var(--ty-solid-h))
601
+ );
602
+ --ty-solid-secondary: oklch(
603
+ from var(--ty-color-secondary) calc(l + var(--ty-solid-l))
604
+ calc(c * var(--ty-solid-c)) calc(h + var(--ty-solid-h))
605
+ );
606
+ --ty-solid-success: oklch(
607
+ from var(--ty-color-success) calc(l + var(--ty-solid-l))
608
+ calc(c * var(--ty-solid-c)) calc(h + var(--ty-solid-h))
609
+ );
610
+ --ty-solid-danger: oklch(
611
+ from var(--ty-color-danger) calc(l + var(--ty-solid-l))
612
+ calc(c * var(--ty-solid-c)) calc(h + var(--ty-solid-h))
613
+ );
614
+ --ty-solid-warning: oklch(
615
+ from var(--ty-color-warning) calc(l + var(--ty-solid-l))
616
+ calc(c * var(--ty-solid-c)) calc(h + var(--ty-solid-h))
617
+ );
618
+ /* neutral is a deliberate dark grey fill, not the neutral text color */
619
+ --ty-solid-neutral: oklch(
620
+ 0.4 calc(var(--ty-neutral-chroma) * var(--ty-c-strong-mult))
621
+ var(--ty-neutral-hue)
622
+ );
540
623
 
541
- --ty-solid-secondary: var(--ty-color-secondary);
542
- --ty-solid-secondary-strong: var(--ty-color-secondary-bold);
543
- --ty-solid-secondary-soft: var(--ty-color-secondary-soft);
624
+ --ty-solid-primary-fg: white;
544
625
  --ty-solid-secondary-fg: white;
545
-
546
- --ty-solid-success: var(--ty-color-success);
547
- --ty-solid-success-strong: var(--ty-color-success-bold);
548
- --ty-solid-success-soft: var(--ty-color-success-soft);
549
626
  --ty-solid-success-fg: white;
550
-
551
- --ty-solid-danger: var(--ty-color-danger);
552
- --ty-solid-danger-strong: var(--ty-color-danger-bold);
553
- --ty-solid-danger-soft: var(--ty-color-danger-soft);
554
627
  --ty-solid-danger-fg: white;
555
-
556
- --ty-solid-warning: var(--ty-color-warning);
557
- --ty-solid-warning-strong: var(--ty-color-warning-bold);
558
- --ty-solid-warning-soft: var(--ty-color-warning-soft);
559
628
  --ty-solid-warning-fg: white;
629
+ --ty-solid-neutral-fg: white;
560
630
 
561
- /* Solid neutral routes to a darker shade than neutral-base. The "soft"
562
- * solid-neutral softens to a mid-grey for inactive states. */
563
- --ty-solid-neutral-soft: oklch(
564
- 0.6 calc(var(--ty-neutral-chroma) * var(--ty-c-strong-mult))
565
- var(--ty-neutral-hue)
631
+ /* derived states axis 2 offsets on each base fill */
632
+ --ty-solid-primary-hover: oklch(
633
+ from var(--ty-solid-primary) calc(l + var(--ty-solid-hover-l)) c h
566
634
  );
567
- --ty-solid-neutral: oklch(
568
- 0.4 calc(var(--ty-neutral-chroma) * var(--ty-c-strong-mult))
569
- var(--ty-neutral-hue)
635
+ --ty-solid-primary-active: oklch(
636
+ from var(--ty-solid-primary) calc(l + var(--ty-solid-active-l)) c h
637
+ );
638
+ --ty-solid-primary-strong: oklch(
639
+ from var(--ty-solid-primary) calc(l + var(--ty-solid-strong-l)) c h
640
+ );
641
+ --ty-solid-primary-soft: oklch(
642
+ from var(--ty-solid-primary) calc(l + var(--ty-solid-soft-l)) c h
643
+ );
644
+
645
+ --ty-solid-secondary-hover: oklch(
646
+ from var(--ty-solid-secondary) calc(l + var(--ty-solid-hover-l)) c h
647
+ );
648
+ --ty-solid-secondary-active: oklch(
649
+ from var(--ty-solid-secondary) calc(l + var(--ty-solid-active-l)) c h
650
+ );
651
+ --ty-solid-secondary-strong: oklch(
652
+ from var(--ty-solid-secondary) calc(l + var(--ty-solid-strong-l)) c h
653
+ );
654
+ --ty-solid-secondary-soft: oklch(
655
+ from var(--ty-solid-secondary) calc(l + var(--ty-solid-soft-l)) c h
656
+ );
657
+
658
+ --ty-solid-success-hover: oklch(
659
+ from var(--ty-solid-success) calc(l + var(--ty-solid-hover-l)) c h
660
+ );
661
+ --ty-solid-success-active: oklch(
662
+ from var(--ty-solid-success) calc(l + var(--ty-solid-active-l)) c h
663
+ );
664
+ --ty-solid-success-strong: oklch(
665
+ from var(--ty-solid-success) calc(l + var(--ty-solid-strong-l)) c h
666
+ );
667
+ --ty-solid-success-soft: oklch(
668
+ from var(--ty-solid-success) calc(l + var(--ty-solid-soft-l)) c h
669
+ );
670
+
671
+ --ty-solid-danger-hover: oklch(
672
+ from var(--ty-solid-danger) calc(l + var(--ty-solid-hover-l)) c h
673
+ );
674
+ --ty-solid-danger-active: oklch(
675
+ from var(--ty-solid-danger) calc(l + var(--ty-solid-active-l)) c h
676
+ );
677
+ --ty-solid-danger-strong: oklch(
678
+ from var(--ty-solid-danger) calc(l + var(--ty-solid-strong-l)) c h
679
+ );
680
+ --ty-solid-danger-soft: oklch(
681
+ from var(--ty-solid-danger) calc(l + var(--ty-solid-soft-l)) c h
682
+ );
683
+
684
+ --ty-solid-warning-hover: oklch(
685
+ from var(--ty-solid-warning) calc(l + var(--ty-solid-hover-l)) c h
686
+ );
687
+ --ty-solid-warning-active: oklch(
688
+ from var(--ty-solid-warning) calc(l + var(--ty-solid-active-l)) c h
689
+ );
690
+ --ty-solid-warning-strong: oklch(
691
+ from var(--ty-solid-warning) calc(l + var(--ty-solid-strong-l)) c h
692
+ );
693
+ --ty-solid-warning-soft: oklch(
694
+ from var(--ty-solid-warning) calc(l + var(--ty-solid-soft-l)) c h
695
+ );
696
+
697
+ --ty-solid-neutral-hover: oklch(
698
+ from var(--ty-solid-neutral) calc(l + var(--ty-solid-hover-l)) c h
699
+ );
700
+ --ty-solid-neutral-active: oklch(
701
+ from var(--ty-solid-neutral) calc(l + var(--ty-solid-active-l)) c h
570
702
  );
571
703
  --ty-solid-neutral-strong: oklch(
572
- 0.2 calc(var(--ty-neutral-chroma) * var(--ty-c-strong-mult))
573
- var(--ty-neutral-hue)
704
+ from var(--ty-solid-neutral) calc(l + var(--ty-solid-strong-l)) c h
705
+ );
706
+ --ty-solid-neutral-soft: oklch(
707
+ from var(--ty-solid-neutral) calc(l + var(--ty-solid-soft-l)) c h
574
708
  );
575
709
  }
576
710
 
@@ -856,7 +990,7 @@ html[data-theme="dark"] {
856
990
  --ty-input-bg: var(--ty-surface-input);
857
991
  --ty-input-color: var(--ty-color-neutral-strong);
858
992
  --ty-input-border: var(--ty-color-neutral-faint);
859
- --ty-input-border-hover: var(--ty-color-neutral-bold);
993
+ --ty-input-border-hover: var(--ty-color-neutral-soft);
860
994
  --ty-input-border-focus: var(--ty-color-primary);
861
995
  --ty-input-placeholder: var(--ty-color-neutral-soft);
862
996
  --ty-input-disabled-bg: var(--ty-color-neutral-faint);
@@ -868,46 +1002,10 @@ html[data-theme="dark"] {
868
1002
  transparent
869
1003
  );
870
1004
 
871
- /* Solid buttons */
872
- --ty-solid-primary: var(--ty-color-primary);
873
- --ty-solid-primary-strong: var(--ty-color-primary-bold);
874
- --ty-solid-primary-soft: var(--ty-color-primary-soft);
875
- --ty-solid-primary-fg: white;
876
-
877
- --ty-solid-secondary: var(--ty-color-secondary);
878
- --ty-solid-secondary-strong: var(--ty-color-secondary-bold);
879
- --ty-solid-secondary-soft: var(--ty-color-secondary-soft);
880
- --ty-solid-secondary-fg: white;
881
-
882
- --ty-solid-success: var(--ty-color-success);
883
- --ty-solid-success-strong: var(--ty-color-success-bold);
884
- --ty-solid-success-soft: var(--ty-color-success-soft);
885
- --ty-solid-success-fg: white;
886
-
887
- --ty-solid-danger: var(--ty-color-danger);
888
- --ty-solid-danger-strong: var(--ty-color-danger-bold);
889
- --ty-solid-danger-soft: var(--ty-color-danger-soft);
890
- --ty-solid-danger-fg: white;
891
-
892
- --ty-solid-warning: var(--ty-color-warning);
893
- --ty-solid-warning-strong: var(--ty-color-warning-bold);
894
- --ty-solid-warning-soft: var(--ty-color-warning-soft);
895
- --ty-solid-warning-fg: white;
896
-
897
- /* Solid neutral — in dark mode, "dark grey" lives at the other end
898
- * of the ramp. Both modes get a shade darker than the page surface
899
- * for a punchy default action. */
900
- --ty-solid-neutral-soft: oklch(
901
- 0.2 calc(var(--ty-neutral-chroma) * var(--ty-c-strong-mult))
902
- var(--ty-neutral-hue)
903
- );
1005
+ /* Tier 6 dark — solid dials live in SECTION 1's html.dark block.
1006
+ * neutral is hand-pinned (it ignores Axis B); dim it per theme here. */
904
1007
  --ty-solid-neutral: oklch(
905
1008
  0.3 calc(var(--ty-neutral-chroma) * var(--ty-c-strong-mult))
906
1009
  var(--ty-neutral-hue)
907
1010
  );
908
- --ty-solid-neutral-strong: oklch(
909
- 0.4 calc(var(--ty-neutral-chroma) * var(--ty-c-strong-mult))
910
- var(--ty-neutral-hue)
911
- );
912
- --ty-solid-neutral-fg: white;
913
1011
  }
package/dist/tyrell.css CHANGED
@@ -352,50 +352,58 @@ COMPONENT TOKENS
352
352
  --ty-input-warning-border: var(--ty-color-warning);
353
353
 
354
354
  /* =================================================================
355
- SOLID BUTTON FILLS — saturated brand backgrounds for appearance="solid"
356
- Each flavor defines:
357
- --ty-solid-{flavor} base saturated fill
358
- --ty-solid-{flavor}-strong stronger fill (for solid+ tone)
359
- --ty-solid-{flavor}-soft softer fill (for solid- tone)
360
- --ty-solid-{flavor}-fg paired text color (default white)
361
- Strong/soft default to var(--ty-color-{flavor}-strong/-soft) so they
362
- inherit from the existing color hierarchy. Override per flavor if needed.
355
+ SOLID BUTTON FILLS — plain default values (the contract). The smart
356
+ per-state derivation (hover/active/tone via OKLCH) lives in the theme
357
+ engines (tyrell-brand.css / tyrell-simple.css), not here. hover/active
358
+ alias to -strong as a simple default; a theme overrides them.
363
359
  ================================================================= */
364
360
 
365
361
  /* Primary */
366
362
  --ty-solid-primary: #4076b9;
367
363
  --ty-solid-primary-strong: var(--ty-color-primary-bold);
368
364
  --ty-solid-primary-soft: #7ea7d9;
365
+ --ty-solid-primary-hover: var(--ty-solid-primary-strong);
366
+ --ty-solid-primary-active: var(--ty-solid-primary-strong);
369
367
  --ty-solid-primary-fg: white;
370
368
 
371
369
  /* Secondary */
372
370
  --ty-solid-secondary: #7e67b4;
373
371
  --ty-solid-secondary-strong: #7d58d1;
374
372
  --ty-solid-secondary-soft: #9f8ec5;
373
+ --ty-solid-secondary-hover: var(--ty-solid-secondary-strong);
374
+ --ty-solid-secondary-active: var(--ty-solid-secondary-strong);
375
375
  --ty-solid-secondary-fg: white;
376
376
 
377
377
  /* Success */
378
378
  --ty-solid-success: #3bb68d;
379
379
  --ty-solid-success-strong: #27956e;
380
380
  --ty-solid-success-soft: #69b99e;
381
+ --ty-solid-success-hover: var(--ty-solid-success-strong);
382
+ --ty-solid-success-active: var(--ty-solid-success-strong);
381
383
  --ty-solid-success-fg: white;
382
384
 
383
385
  /* Danger */
384
386
  --ty-solid-danger: #df5b5b;
385
387
  --ty-solid-danger-strong: #cc3e3e;
386
388
  --ty-solid-danger-soft: #d57a7a;
389
+ --ty-solid-danger-hover: var(--ty-solid-danger-strong);
390
+ --ty-solid-danger-active: var(--ty-solid-danger-strong);
387
391
  --ty-solid-danger-fg: white;
388
392
 
389
393
  /* Warning */
390
394
  --ty-solid-warning: #e1a644;
391
395
  --ty-solid-warning-strong: #f59e0b;
392
396
  --ty-solid-warning-soft: #fbc56d;
397
+ --ty-solid-warning-hover: var(--ty-solid-warning-strong);
398
+ --ty-solid-warning-active: var(--ty-solid-warning-strong);
393
399
  --ty-solid-warning-fg: white;
394
400
 
395
401
  /* Neutral */
396
402
  --ty-solid-neutral: #414141;
397
403
  --ty-solid-neutral-strong: #000000;
398
404
  --ty-solid-neutral-soft: #6e6e6e;
405
+ --ty-solid-neutral-hover: var(--ty-solid-neutral-strong);
406
+ --ty-solid-neutral-active: var(--ty-solid-neutral-strong);
399
407
  --ty-solid-neutral-fg: white;
400
408
 
401
409
  /* =================================================================
@@ -695,42 +703,48 @@ Emphasis logic inverts: lighter = more emphasis
695
703
  0 20px 25px -5px rgba(0, 0, 0, 0.3), 0 8px 10px -6px rgba(0, 0, 0, 0.3);
696
704
  --ty-shadow-2xl: 0 25px 50px -12px rgba(0, 0, 0, 0.5);
697
705
 
698
- /* Solid button fills for dark mode — strong/soft/fg chain through automatically.
699
- Note: --ty-color-{flavor}-strong is light-toned in dark mode (emphasis
700
- inverts), so solid+ buttons will have a light bg with white text — low
701
- contrast for some flavors. Override per flavor via --ty-solid-{flavor}-fg
702
- if a specific brand needs darker text. */
706
+ /* Solid button fills plain dark defaults. hover/active alias -strong;
707
+ theme engines override with smart per-state derivation. */
703
708
  --ty-solid-primary: #3e536c;
704
709
  --ty-solid-primary-strong: #426084;
705
710
  --ty-solid-primary-soft: #343f4c;
711
+ --ty-solid-primary-hover: var(--ty-solid-primary-strong);
712
+ --ty-solid-primary-active: var(--ty-solid-primary-strong);
706
713
  --ty-solid-primary-fg: white;
707
714
 
708
715
  --ty-solid-secondary: #7e67b4;
709
716
  --ty-solid-secondary-strong: #8269bc;
710
717
  --ty-solid-secondary-soft: #52466a;
718
+ --ty-solid-secondary-hover: var(--ty-solid-secondary-strong);
719
+ --ty-solid-secondary-active: var(--ty-solid-secondary-strong);
711
720
  --ty-solid-secondary-fg: white;
712
721
 
713
- /* Success */
714
722
  --ty-solid-success: #3bb68d;
715
723
  --ty-solid-success-strong: #459679;
716
724
  --ty-solid-success-soft: #285748;
725
+ --ty-solid-success-hover: var(--ty-solid-success-strong);
726
+ --ty-solid-success-active: var(--ty-solid-success-strong);
717
727
  --ty-solid-success-fg: white;
718
728
 
719
- /* Danger */
720
729
  --ty-solid-danger: #df5b5b;
721
730
  --ty-solid-danger-strong: #cc3e3e;
722
731
  --ty-solid-danger-soft: #875656;
732
+ --ty-solid-danger-hover: var(--ty-solid-danger-strong);
733
+ --ty-solid-danger-active: var(--ty-solid-danger-strong);
723
734
  --ty-solid-danger-fg: white;
724
735
 
725
- /* Warning */
726
736
  --ty-solid-warning: #e1a644;
727
737
  --ty-solid-warning-strong: #f59e0b;
728
738
  --ty-solid-warning-soft: #8b6334;
739
+ --ty-solid-warning-hover: var(--ty-solid-warning-strong);
740
+ --ty-solid-warning-active: var(--ty-solid-warning-strong);
729
741
  --ty-solid-warning-fg: white;
730
742
 
731
743
  --ty-solid-neutral: #414141;
732
744
  --ty-solid-neutral-strong: #4c4c4c;
733
745
  --ty-solid-neutral-soft: #2a2a2a;
746
+ --ty-solid-neutral-hover: var(--ty-solid-neutral-strong);
747
+ --ty-solid-neutral-active: var(--ty-solid-neutral-strong);
734
748
  --ty-solid-neutral-fg: white;
735
749
 
736
750
  /* Input component tokens - dark mode */