tyrell-components 1.0.0-RC11 → 1.0.0-RC12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (182) hide show
  1. package/css/tyrell-brand.css +190 -88
  2. package/css/tyrell.css +38 -31
  3. package/dist/tyrell-brand.css +190 -88
  4. package/dist/tyrell.css +38 -31
  5. package/dist/tyrell.js +1 -1
  6. package/lib/base/ty-component.d.ts +7 -0
  7. package/lib/base/ty-component.d.ts.map +1 -1
  8. package/lib/base/ty-component.js +27 -0
  9. package/lib/base/ty-component.js.map +1 -1
  10. package/lib/components/button.d.ts +9 -1
  11. package/lib/components/button.d.ts.map +1 -1
  12. package/lib/components/button.js +22 -3
  13. package/lib/components/button.js.map +1 -1
  14. package/lib/components/calendar-month.d.ts +6 -0
  15. package/lib/components/calendar-month.d.ts.map +1 -1
  16. package/lib/components/calendar-month.js +52 -9
  17. package/lib/components/calendar-month.js.map +1 -1
  18. package/lib/components/calendar-navigation.d.ts +31 -5
  19. package/lib/components/calendar-navigation.d.ts.map +1 -1
  20. package/lib/components/calendar-navigation.js +71 -31
  21. package/lib/components/calendar-navigation.js.map +1 -1
  22. package/lib/components/calendar.d.ts +14 -1
  23. package/lib/components/calendar.d.ts.map +1 -1
  24. package/lib/components/calendar.js +65 -4
  25. package/lib/components/calendar.js.map +1 -1
  26. package/lib/components/checkbox.d.ts +10 -0
  27. package/lib/components/checkbox.d.ts.map +1 -1
  28. package/lib/components/checkbox.js +68 -27
  29. package/lib/components/checkbox.js.map +1 -1
  30. package/lib/components/copy.d.ts +10 -0
  31. package/lib/components/copy.d.ts.map +1 -1
  32. package/lib/components/copy.js +25 -4
  33. package/lib/components/copy.js.map +1 -1
  34. package/lib/components/date-picker.d.ts +14 -0
  35. package/lib/components/date-picker.d.ts.map +1 -1
  36. package/lib/components/date-picker.js +29 -0
  37. package/lib/components/date-picker.js.map +1 -1
  38. package/lib/components/input.d.ts +14 -0
  39. package/lib/components/input.d.ts.map +1 -1
  40. package/lib/components/input.js +80 -4
  41. package/lib/components/input.js.map +1 -1
  42. package/lib/components/modal.js +6 -0
  43. package/lib/components/modal.js.map +1 -1
  44. package/lib/components/option.d.ts +0 -16
  45. package/lib/components/option.d.ts.map +1 -1
  46. package/lib/components/option.js +9 -1
  47. package/lib/components/option.js.map +1 -1
  48. package/lib/components/radio.d.ts +1 -0
  49. package/lib/components/radio.d.ts.map +1 -1
  50. package/lib/components/radio.js +39 -8
  51. package/lib/components/radio.js.map +1 -1
  52. package/lib/components/scroll-container.d.ts +16 -0
  53. package/lib/components/scroll-container.d.ts.map +1 -1
  54. package/lib/components/scroll-container.js +105 -1
  55. package/lib/components/scroll-container.js.map +1 -1
  56. package/lib/components/{multiselect.d.ts → select.d.ts} +110 -67
  57. package/lib/components/select.d.ts.map +1 -0
  58. package/lib/components/{multiselect.js → select.js} +642 -490
  59. package/lib/components/select.js.map +1 -0
  60. package/lib/components/selected-tags.d.ts +80 -0
  61. package/lib/components/selected-tags.d.ts.map +1 -0
  62. package/lib/components/selected-tags.js +250 -0
  63. package/lib/components/selected-tags.js.map +1 -0
  64. package/lib/components/switch.d.ts +2 -0
  65. package/lib/components/switch.d.ts.map +1 -1
  66. package/lib/components/switch.js +37 -7
  67. package/lib/components/switch.js.map +1 -1
  68. package/lib/components/tabs.d.ts.map +1 -1
  69. package/lib/components/tabs.js +10 -0
  70. package/lib/components/tabs.js.map +1 -1
  71. package/lib/components/tag.d.ts +9 -1
  72. package/lib/components/tag.d.ts.map +1 -1
  73. package/lib/components/tag.js +40 -4
  74. package/lib/components/tag.js.map +1 -1
  75. package/lib/components/textarea.d.ts +3 -0
  76. package/lib/components/textarea.d.ts.map +1 -1
  77. package/lib/components/textarea.js +61 -6
  78. package/lib/components/textarea.js.map +1 -1
  79. package/lib/index.d.ts +2 -2
  80. package/lib/index.d.ts.map +1 -1
  81. package/lib/index.js +2 -2
  82. package/lib/index.js.map +1 -1
  83. package/lib/styles/button.d.ts +7 -2
  84. package/lib/styles/button.d.ts.map +1 -1
  85. package/lib/styles/button.js +74 -237
  86. package/lib/styles/button.js.map +1 -1
  87. package/lib/styles/calendar-month.d.ts +1 -1
  88. package/lib/styles/calendar-month.d.ts.map +1 -1
  89. package/lib/styles/calendar-month.js +44 -66
  90. package/lib/styles/calendar-month.js.map +1 -1
  91. package/lib/styles/calendar-navigation.d.ts +1 -1
  92. package/lib/styles/calendar-navigation.d.ts.map +1 -1
  93. package/lib/styles/calendar-navigation.js +19 -27
  94. package/lib/styles/calendar-navigation.js.map +1 -1
  95. package/lib/styles/checkbox.d.ts +5 -5
  96. package/lib/styles/checkbox.d.ts.map +1 -1
  97. package/lib/styles/checkbox.js +147 -8
  98. package/lib/styles/checkbox.js.map +1 -1
  99. package/lib/styles/copy.d.ts +1 -1
  100. package/lib/styles/copy.d.ts.map +1 -1
  101. package/lib/styles/copy.js +32 -0
  102. package/lib/styles/copy.js.map +1 -1
  103. package/lib/styles/date-picker.d.ts +1 -1
  104. package/lib/styles/date-picker.d.ts.map +1 -1
  105. package/lib/styles/date-picker.js +12 -4
  106. package/lib/styles/date-picker.js.map +1 -1
  107. package/lib/styles/input.d.ts +1 -1
  108. package/lib/styles/input.d.ts.map +1 -1
  109. package/lib/styles/input.js +28 -298
  110. package/lib/styles/input.js.map +1 -1
  111. package/lib/styles/option.d.ts +1 -1
  112. package/lib/styles/option.d.ts.map +1 -1
  113. package/lib/styles/option.js +29 -5
  114. package/lib/styles/option.js.map +1 -1
  115. package/lib/styles/radio.d.ts +1 -1
  116. package/lib/styles/radio.d.ts.map +1 -1
  117. package/lib/styles/scroll-container.d.ts +1 -1
  118. package/lib/styles/scroll-container.d.ts.map +1 -1
  119. package/lib/styles/scroll-container.js +6 -0
  120. package/lib/styles/scroll-container.js.map +1 -1
  121. package/lib/styles/select.d.ts +12 -0
  122. package/lib/styles/select.d.ts.map +1 -0
  123. package/lib/styles/select.js +240 -0
  124. package/lib/styles/select.js.map +1 -0
  125. package/lib/styles/switch.d.ts +1 -1
  126. package/lib/styles/switch.d.ts.map +1 -1
  127. package/lib/styles/tag.d.ts +1 -1
  128. package/lib/styles/tag.d.ts.map +1 -1
  129. package/lib/styles/tag.js +36 -140
  130. package/lib/styles/tag.js.map +1 -1
  131. package/lib/styles/textarea.d.ts +1 -1
  132. package/lib/styles/textarea.d.ts.map +1 -1
  133. package/lib/styles/textarea.js +67 -33
  134. package/lib/styles/textarea.js.map +1 -1
  135. package/lib/types/common.d.ts +2 -1
  136. package/lib/types/common.d.ts.map +1 -1
  137. package/lib/types/common.js +13 -1
  138. package/lib/types/common.js.map +1 -1
  139. package/lib/utils/calendar-utils.d.ts +0 -48
  140. package/lib/utils/calendar-utils.d.ts.map +1 -1
  141. package/lib/utils/calendar-utils.js +0 -69
  142. package/lib/utils/calendar-utils.js.map +1 -1
  143. package/lib/utils/flavor-sheet.d.ts +32 -0
  144. package/lib/utils/flavor-sheet.d.ts.map +1 -0
  145. package/lib/utils/flavor-sheet.js +40 -0
  146. package/lib/utils/flavor-sheet.js.map +1 -0
  147. package/lib/utils/icon-registry.d.ts +0 -13
  148. package/lib/utils/icon-registry.d.ts.map +1 -1
  149. package/lib/utils/icon-registry.js +0 -35
  150. package/lib/utils/icon-registry.js.map +1 -1
  151. package/lib/utils/locale.d.ts +0 -57
  152. package/lib/utils/locale.d.ts.map +1 -1
  153. package/lib/utils/locale.js +0 -89
  154. package/lib/utils/locale.js.map +1 -1
  155. package/lib/utils/number-format.d.ts +0 -21
  156. package/lib/utils/number-format.d.ts.map +1 -1
  157. package/lib/utils/number-format.js +0 -27
  158. package/lib/utils/number-format.js.map +1 -1
  159. package/lib/utils/positioning.d.ts +0 -24
  160. package/lib/utils/positioning.d.ts.map +1 -1
  161. package/lib/utils/positioning.js +3 -86
  162. package/lib/utils/positioning.js.map +1 -1
  163. package/lib/utils/scroll-lock.d.ts.map +1 -1
  164. package/lib/utils/scroll-lock.js +0 -1
  165. package/lib/utils/scroll-lock.js.map +1 -1
  166. package/lib/utils/styles.d.ts +0 -5
  167. package/lib/utils/styles.d.ts.map +1 -1
  168. package/lib/utils/styles.js +0 -7
  169. package/lib/utils/styles.js.map +1 -1
  170. package/lib/version.d.ts +1 -1
  171. package/lib/version.js +1 -1
  172. package/package.json +17 -9
  173. package/lib/components/dropdown.d.ts +0 -424
  174. package/lib/components/dropdown.d.ts.map +0 -1
  175. package/lib/components/dropdown.js +0 -1640
  176. package/lib/components/dropdown.js.map +0 -1
  177. package/lib/components/multiselect.d.ts.map +0 -1
  178. package/lib/components/multiselect.js.map +0 -1
  179. package/lib/styles/dropdown.d.ts +0 -12
  180. package/lib/styles/dropdown.d.ts.map +0 -1
  181. package/lib/styles/dropdown.js +0 -1081
  182. package/lib/styles/dropdown.js.map +0 -1
@@ -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,11 @@
91
97
  * --------------------------------------------------------------*/
92
98
 
93
99
  --ty-brand-hue: 230;
94
- --ty-brand-chroma: 0.13;
100
+ --ty-brand-chroma: 0.12; /* restrained EU default; the loud 0.2 read as "bollywood" */
101
+
102
+ /* Surface tint. 0 = monochrome surfaces (default, no brand leak).
103
+ * Bump to ~0.005 (light) / ~0.012 (dark) to warm surfaces toward brand. */
104
+ --ty-surface-chroma: 0;
95
105
 
96
106
  /* Secondary rotates from brand by an exposed offset. Default +60°
97
107
  * (sibling accent). Try 30° for a close sibling, 120° for triadic,
@@ -180,6 +190,33 @@
180
190
  --ty-warning-l-factor: 1.15;
181
191
  --ty-danger-l-factor: 1;
182
192
  --ty-neutral-l-factor: 1;
193
+
194
+ /* ----------------------------------------------------------------
195
+ * Tier 6 — SOLID FILLS
196
+ * Solid buttons are their OWN system, not the emphasis ramp. Each
197
+ * flavor's fill defaults to --ty-color-{flavor}; the knobs below
198
+ * derive its hover / active / tone+ / tone- and per-theme adjust.
199
+ * Math lives in SECTION 2 (search "Tier 6 — SOLID"); these are the
200
+ * dials.
201
+ *
202
+ * Axis A — interaction & tone, OKLCH L offsets on the fill.
203
+ * Axis B — per-theme adjust applied to the base fill (dim/desaturate).
204
+ *
205
+ * NOTE: like Tier 5, the emphasis curve flips for dark, so these L
206
+ * offsets are sign-flipped in `html.dark` below (darken in light =
207
+ * lighten in dark). Keep the two blocks in sync.
208
+ * --------------------------------------------------------------*/
209
+
210
+ /* Axis A — interaction (light: darken on press, so offsets are negative) */
211
+ --ty-solid-hover-l: -0.04; /* :hover */
212
+ --ty-solid-active-l: -0.08; /* :active */
213
+ --ty-solid-strong-l: -0.06; /* tone+ */
214
+ --ty-solid-soft-l: 0.1; /* tone- */
215
+
216
+ /* Axis B — per-theme adjust (light reads fine → identity) */
217
+ --ty-solid-l: 0; /* lightness offset — negative dims */
218
+ --ty-solid-c: 1; /* chroma multiplier — <1 desaturates */
219
+ --ty-solid-h: 0; /* hue offset (deg) */
183
220
  }
184
221
 
185
222
  /* Dark mode overrides for the L-curve and saturation curve. Tier 1 + 2
@@ -188,8 +225,8 @@ html.dark,
188
225
  html[data-theme="dark"] {
189
226
  /* Tier 3 dark — inverted curve. Higher L = lighter text = more
190
227
  * emphasis on a dark background. */
191
- --ty-l-strong: 0.86;
192
- --ty-l-bold: 0.74;
228
+ --ty-l-strong: 0.72;
229
+ --ty-l-bold: 0.66;
193
230
  --ty-l-base: 0.62;
194
231
  --ty-l-soft: 0.46;
195
232
  --ty-l-faint: 0.3;
@@ -209,6 +246,18 @@ html[data-theme="dark"] {
209
246
  --ty-c-bg-base-mult: 0.38;
210
247
  --ty-c-bg-bold-mult: 0.54;
211
248
  --ty-c-bg-soft-mult: 0.23;
249
+
250
+ /* Tier 6 dark — interaction offsets flip sign (press LIGHTENS on dark),
251
+ * and the per-theme adjust dims + desaturates the fills against the
252
+ * dark canvas. (Computed solid tokens live in SECTION 2 DARK.) */
253
+ --ty-solid-hover-l: 0.04; /* :hover */
254
+ --ty-solid-active-l: 0.08; /* :active */
255
+ --ty-solid-strong-l: 0.06; /* tone+ */
256
+ --ty-solid-soft-l: -0.1; /* tone- */
257
+
258
+ --ty-solid-l: -0.25; /* dim against dark canvas */
259
+ --ty-solid-c: 0.65; /* desaturate against dark canvas */
260
+ --ty-solid-h: 0; /* hue offset */
212
261
  }
213
262
 
214
263
  /* =====================================================================
@@ -504,9 +553,9 @@ html[data-theme="dark"] {
504
553
  --ty-border-faint: var(--ty-color-neutral-faint);
505
554
 
506
555
  /* ----------------------------------------------------------------
507
- * Surfaces — canvas tinted slightly toward brand for warmth.
556
+ * Surfaces — monochrome by default; --ty-surface-chroma warms them.
508
557
  * --------------------------------------------------------------*/
509
- --ty-surface-canvas: oklch(0.985 0.005 var(--ty-brand-hue));
558
+ --ty-surface-canvas: oklch(0.985 var(--ty-surface-chroma) var(--ty-brand-hue));
510
559
  --ty-surface-content: oklch(1 0 0);
511
560
  --ty-surface-elevated: oklch(1 0 0);
512
561
  --ty-surface-floating: oklch(1 0 0);
@@ -517,8 +566,8 @@ html[data-theme="dark"] {
517
566
  * --------------------------------------------------------------*/
518
567
  --ty-input-bg: var(--ty-surface-input);
519
568
  --ty-input-color: var(--ty-color-neutral-strong);
520
- --ty-input-border: var(--ty-color-neutral-soft);
521
- --ty-input-border-hover: var(--ty-color-neutral-bold);
569
+ --ty-input-border: var(--ty-color-neutral-faint);
570
+ --ty-input-border-hover: var(--ty-color-neutral-soft);
522
571
  --ty-input-border-focus: var(--ty-color-primary);
523
572
  --ty-input-placeholder: var(--ty-color-neutral-soft);
524
573
  --ty-input-disabled-bg: var(--ty-color-neutral-faint);
@@ -529,48 +578,137 @@ html[data-theme="dark"] {
529
578
  var(--ty-color-primary) 5%,
530
579
  transparent
531
580
  );
581
+ }
532
582
 
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;
583
+ /* ----------------------------------------------------------------
584
+ * Tier 6SOLID (implementation)
585
+ * Solid is its OWN system, NOT the text/emphasis ramp. The dials
586
+ * (--ty-solid-hover-l / -active-l / -strong-l / -soft-l and
587
+ * --ty-solid-l / -c / -h) live in SECTION 1, Tier 6. Below is the
588
+ * derivation only: base fill bakes in the per-theme adjust (Axis B);
589
+ * hover/active/strong/soft offset the base by Axis A. Override any
590
+ * single --ty-solid-{flavor}-{state} to recolor just that segment.
591
+ *
592
+ * Declared at `html:root` (specificity 0,1,1) — NOT plain `:root` (0,1,0) —
593
+ * on purpose: it must out-rank tyrell.css's hardcoded dark solids at
594
+ * `html.dark` (0,1,1). It wins light by specificity over base's `html{}`,
595
+ * and wins dark by source order over base's `html.dark` (brand loads after).
596
+ * That's what lets dark solids re-tint with --ty-brand-hue. Declared ONCE —
597
+ * the oklch(from var(--ty-color-*)) formulas resolve per-mode automatically,
598
+ * so no dark duplicate is needed.
599
+ * --------------------------------------------------------------*/
600
+ html:root {
601
+ /* base fill per flavor (= flavor color, theme-adjusted by Axis B) */
602
+ --ty-solid-primary: oklch(
603
+ from var(--ty-color-primary) calc(l + var(--ty-solid-l))
604
+ calc(c * var(--ty-solid-c)) calc(h + var(--ty-solid-h))
605
+ );
606
+ --ty-solid-secondary: oklch(
607
+ from var(--ty-color-secondary) calc(l + var(--ty-solid-l))
608
+ calc(c * var(--ty-solid-c)) calc(h + var(--ty-solid-h))
609
+ );
610
+ --ty-solid-success: oklch(
611
+ from var(--ty-color-success) calc(l + var(--ty-solid-l))
612
+ calc(c * var(--ty-solid-c)) calc(h + var(--ty-solid-h))
613
+ );
614
+ --ty-solid-danger: oklch(
615
+ from var(--ty-color-danger) calc(l + var(--ty-solid-l))
616
+ calc(c * var(--ty-solid-c)) calc(h + var(--ty-solid-h))
617
+ );
618
+ --ty-solid-warning: oklch(
619
+ from var(--ty-color-warning) calc(l + var(--ty-solid-l))
620
+ calc(c * var(--ty-solid-c)) calc(h + var(--ty-solid-h))
621
+ );
622
+ /* neutral is a deliberate dark grey fill, not the neutral text color */
623
+ --ty-solid-neutral: oklch(
624
+ 0.4 calc(var(--ty-neutral-chroma) * var(--ty-c-strong-mult))
625
+ var(--ty-neutral-hue)
626
+ );
540
627
 
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);
628
+ --ty-solid-primary-fg: white;
544
629
  --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
630
  --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
631
  --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
632
  --ty-solid-warning-fg: white;
633
+ --ty-solid-neutral-fg: white;
560
634
 
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)
635
+ /* derived states axis 2 offsets on each base fill */
636
+ --ty-solid-primary-hover: oklch(
637
+ from var(--ty-solid-primary) calc(l + var(--ty-solid-hover-l)) c h
566
638
  );
567
- --ty-solid-neutral: oklch(
568
- 0.4 calc(var(--ty-neutral-chroma) * var(--ty-c-strong-mult))
569
- var(--ty-neutral-hue)
639
+ --ty-solid-primary-active: oklch(
640
+ from var(--ty-solid-primary) calc(l + var(--ty-solid-active-l)) c h
641
+ );
642
+ --ty-solid-primary-strong: oklch(
643
+ from var(--ty-solid-primary) calc(l + var(--ty-solid-strong-l)) c h
644
+ );
645
+ --ty-solid-primary-soft: oklch(
646
+ from var(--ty-solid-primary) calc(l + var(--ty-solid-soft-l)) c h
647
+ );
648
+
649
+ --ty-solid-secondary-hover: oklch(
650
+ from var(--ty-solid-secondary) calc(l + var(--ty-solid-hover-l)) c h
651
+ );
652
+ --ty-solid-secondary-active: oklch(
653
+ from var(--ty-solid-secondary) calc(l + var(--ty-solid-active-l)) c h
654
+ );
655
+ --ty-solid-secondary-strong: oklch(
656
+ from var(--ty-solid-secondary) calc(l + var(--ty-solid-strong-l)) c h
657
+ );
658
+ --ty-solid-secondary-soft: oklch(
659
+ from var(--ty-solid-secondary) calc(l + var(--ty-solid-soft-l)) c h
660
+ );
661
+
662
+ --ty-solid-success-hover: oklch(
663
+ from var(--ty-solid-success) calc(l + var(--ty-solid-hover-l)) c h
664
+ );
665
+ --ty-solid-success-active: oklch(
666
+ from var(--ty-solid-success) calc(l + var(--ty-solid-active-l)) c h
667
+ );
668
+ --ty-solid-success-strong: oklch(
669
+ from var(--ty-solid-success) calc(l + var(--ty-solid-strong-l)) c h
670
+ );
671
+ --ty-solid-success-soft: oklch(
672
+ from var(--ty-solid-success) calc(l + var(--ty-solid-soft-l)) c h
673
+ );
674
+
675
+ --ty-solid-danger-hover: oklch(
676
+ from var(--ty-solid-danger) calc(l + var(--ty-solid-hover-l)) c h
677
+ );
678
+ --ty-solid-danger-active: oklch(
679
+ from var(--ty-solid-danger) calc(l + var(--ty-solid-active-l)) c h
680
+ );
681
+ --ty-solid-danger-strong: oklch(
682
+ from var(--ty-solid-danger) calc(l + var(--ty-solid-strong-l)) c h
683
+ );
684
+ --ty-solid-danger-soft: oklch(
685
+ from var(--ty-solid-danger) calc(l + var(--ty-solid-soft-l)) c h
686
+ );
687
+
688
+ --ty-solid-warning-hover: oklch(
689
+ from var(--ty-solid-warning) calc(l + var(--ty-solid-hover-l)) c h
690
+ );
691
+ --ty-solid-warning-active: oklch(
692
+ from var(--ty-solid-warning) calc(l + var(--ty-solid-active-l)) c h
693
+ );
694
+ --ty-solid-warning-strong: oklch(
695
+ from var(--ty-solid-warning) calc(l + var(--ty-solid-strong-l)) c h
696
+ );
697
+ --ty-solid-warning-soft: oklch(
698
+ from var(--ty-solid-warning) calc(l + var(--ty-solid-soft-l)) c h
699
+ );
700
+
701
+ --ty-solid-neutral-hover: oklch(
702
+ from var(--ty-solid-neutral) calc(l + var(--ty-solid-hover-l)) c h
703
+ );
704
+ --ty-solid-neutral-active: oklch(
705
+ from var(--ty-solid-neutral) calc(l + var(--ty-solid-active-l)) c h
570
706
  );
571
707
  --ty-solid-neutral-strong: oklch(
572
- 0.2 calc(var(--ty-neutral-chroma) * var(--ty-c-strong-mult))
573
- var(--ty-neutral-hue)
708
+ from var(--ty-solid-neutral) calc(l + var(--ty-solid-strong-l)) c h
709
+ );
710
+ --ty-solid-neutral-soft: oklch(
711
+ from var(--ty-solid-neutral) calc(l + var(--ty-solid-soft-l)) c h
574
712
  );
575
713
  }
576
714
 
@@ -845,18 +983,18 @@ html[data-theme="dark"] {
845
983
  --ty-border-soft: var(--ty-color-neutral-faint);
846
984
  --ty-border-faint: var(--ty-color-neutral-faint);
847
985
 
848
- /* Surfaces — flip dark with a hint of brand chroma. */
849
- --ty-surface-canvas: oklch(0.12 0.012 var(--ty-brand-hue));
850
- --ty-surface-content: oklch(0.16 0.012 var(--ty-brand-hue));
851
- --ty-surface-elevated: oklch(0.19 0.013 var(--ty-brand-hue));
852
- --ty-surface-floating: oklch(0.22 0.015 var(--ty-brand-hue));
853
- --ty-surface-input: oklch(0.18 0.012 var(--ty-brand-hue));
986
+ /* Surfaces — monochrome by default; --ty-surface-chroma warms them. */
987
+ --ty-surface-canvas: oklch(0.12 var(--ty-surface-chroma) var(--ty-brand-hue));
988
+ --ty-surface-content: oklch(0.16 var(--ty-surface-chroma) var(--ty-brand-hue));
989
+ --ty-surface-elevated: oklch(0.19 var(--ty-surface-chroma) var(--ty-brand-hue));
990
+ --ty-surface-floating: oklch(0.22 var(--ty-surface-chroma) var(--ty-brand-hue));
991
+ --ty-surface-input: oklch(0.18 var(--ty-surface-chroma) var(--ty-brand-hue));
854
992
 
855
993
  /* Inputs — re-declared at html.dark specificity. */
856
994
  --ty-input-bg: var(--ty-surface-input);
857
995
  --ty-input-color: var(--ty-color-neutral-strong);
858
996
  --ty-input-border: var(--ty-color-neutral-faint);
859
- --ty-input-border-hover: var(--ty-color-neutral-bold);
997
+ --ty-input-border-hover: var(--ty-color-neutral-soft);
860
998
  --ty-input-border-focus: var(--ty-color-primary);
861
999
  --ty-input-placeholder: var(--ty-color-neutral-soft);
862
1000
  --ty-input-disabled-bg: var(--ty-color-neutral-faint);
@@ -868,46 +1006,10 @@ html[data-theme="dark"] {
868
1006
  transparent
869
1007
  );
870
1008
 
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
- );
1009
+ /* Tier 6 dark — solid dials live in SECTION 1's html.dark block.
1010
+ * neutral is hand-pinned (it ignores Axis B); dim it per theme here. */
904
1011
  --ty-solid-neutral: oklch(
905
1012
  0.3 calc(var(--ty-neutral-chroma) * var(--ty-c-strong-mult))
906
1013
  var(--ty-neutral-hue)
907
1014
  );
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
1015
  }
package/css/tyrell.css CHANGED
@@ -176,7 +176,6 @@ Simplified from 7 variants to 5 practical variants:
176
176
  --ty-color-neutral-soft: #374151;
177
177
  --ty-color-neutral-faint: #9ca3af;
178
178
 
179
- /* Accent - brand highlights, focus rings, selection states */
180
179
 
181
180
  /* =================================================================
182
181
  BACKGROUND COLORS
@@ -226,7 +225,6 @@ BACKGROUND COLORS
226
225
  --ty-bg-neutral-bold: #cecece;
227
226
  --ty-bg-neutral-soft: #ededed;
228
227
 
229
- /* Accent backgrounds */
230
228
 
231
229
  /* =================================================================
232
230
  BORDER COLORS
@@ -336,8 +334,8 @@ COMPONENT TOKENS
336
334
  /* Input component tokens */
337
335
  --ty-input-bg: #ffffff;
338
336
  --ty-input-color: #111827;
339
- --ty-input-border: #d1d5db;
340
- --ty-input-border-hover: #9ca3af;
337
+ --ty-input-border: #e5e7eb;
338
+ --ty-input-border-hover: #d1d5db;
341
339
  --ty-input-border-focus: var(--ty-color-primary);
342
340
  --ty-input-shadow-focus: rgba(59, 130, 246, 0.1);
343
341
  --ty-input-placeholder: #9ca3af;
@@ -352,50 +350,58 @@ COMPONENT TOKENS
352
350
  --ty-input-warning-border: var(--ty-color-warning);
353
351
 
354
352
  /* =================================================================
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.
353
+ SOLID BUTTON FILLS — plain default values (the contract). The smart
354
+ per-state derivation (hover/active/tone via OKLCH) lives in the theme
355
+ engines (tyrell-brand.css / tyrell-simple.css), not here. hover/active
356
+ alias to -strong as a simple default; a theme overrides them.
363
357
  ================================================================= */
364
358
 
365
359
  /* Primary */
366
360
  --ty-solid-primary: #4076b9;
367
361
  --ty-solid-primary-strong: var(--ty-color-primary-bold);
368
362
  --ty-solid-primary-soft: #7ea7d9;
363
+ --ty-solid-primary-hover: var(--ty-solid-primary-strong);
364
+ --ty-solid-primary-active: var(--ty-solid-primary-strong);
369
365
  --ty-solid-primary-fg: white;
370
366
 
371
367
  /* Secondary */
372
368
  --ty-solid-secondary: #7e67b4;
373
369
  --ty-solid-secondary-strong: #7d58d1;
374
370
  --ty-solid-secondary-soft: #9f8ec5;
371
+ --ty-solid-secondary-hover: var(--ty-solid-secondary-strong);
372
+ --ty-solid-secondary-active: var(--ty-solid-secondary-strong);
375
373
  --ty-solid-secondary-fg: white;
376
374
 
377
375
  /* Success */
378
376
  --ty-solid-success: #3bb68d;
379
377
  --ty-solid-success-strong: #27956e;
380
378
  --ty-solid-success-soft: #69b99e;
379
+ --ty-solid-success-hover: var(--ty-solid-success-strong);
380
+ --ty-solid-success-active: var(--ty-solid-success-strong);
381
381
  --ty-solid-success-fg: white;
382
382
 
383
383
  /* Danger */
384
384
  --ty-solid-danger: #df5b5b;
385
385
  --ty-solid-danger-strong: #cc3e3e;
386
386
  --ty-solid-danger-soft: #d57a7a;
387
+ --ty-solid-danger-hover: var(--ty-solid-danger-strong);
388
+ --ty-solid-danger-active: var(--ty-solid-danger-strong);
387
389
  --ty-solid-danger-fg: white;
388
390
 
389
391
  /* Warning */
390
392
  --ty-solid-warning: #e1a644;
391
393
  --ty-solid-warning-strong: #f59e0b;
392
394
  --ty-solid-warning-soft: #fbc56d;
395
+ --ty-solid-warning-hover: var(--ty-solid-warning-strong);
396
+ --ty-solid-warning-active: var(--ty-solid-warning-strong);
393
397
  --ty-solid-warning-fg: white;
394
398
 
395
399
  /* Neutral */
396
400
  --ty-solid-neutral: #414141;
397
401
  --ty-solid-neutral-strong: #000000;
398
402
  --ty-solid-neutral-soft: #6e6e6e;
403
+ --ty-solid-neutral-hover: var(--ty-solid-neutral-strong);
404
+ --ty-solid-neutral-active: var(--ty-solid-neutral-strong);
399
405
  --ty-solid-neutral-fg: white;
400
406
 
401
407
  /* =================================================================
@@ -613,7 +619,6 @@ Emphasis logic inverts: lighter = more emphasis
613
619
  --ty-color-neutral-soft: #696969;
614
620
  --ty-color-neutral-faint: #474747;
615
621
 
616
- /* Accent - dark mode (emphasis inverted) */
617
622
 
618
623
  /* Backgrounds for dark mode */
619
624
  --ty-bg-faint: #0f1419;
@@ -650,7 +655,6 @@ Emphasis logic inverts: lighter = more emphasis
650
655
  --ty-bg-neutral: #323232;
651
656
  --ty-bg-neutral-soft: #242424;
652
657
 
653
- /* Accent backgrounds - dark mode */
654
658
 
655
659
  /* Borders for dark mode */
656
660
  --ty-border-strong: #8c8c8c;
@@ -660,11 +664,11 @@ Emphasis logic inverts: lighter = more emphasis
660
664
  --ty-border-faint: #030712;
661
665
 
662
666
  /* Scrollbar - dark mode */
663
- --ty-scrollbar-thumb: rgba(255, 255, 255, 0.22);
664
- --ty-scrollbar-thumb-hover: rgba(255, 255, 255, 0.38);
665
- --ty-scrollbar-thumb-active: rgba(255, 255, 255, 0.48);
667
+ --ty-scrollbar-thumb: rgba(255, 255, 255, 0.13);
668
+ --ty-scrollbar-thumb-hover: rgba(255, 255, 255, 0.22);
669
+ --ty-scrollbar-thumb-active: rgba(255, 255, 255, 0.3);
666
670
  --ty-scrollbar-track: transparent;
667
- --ty-scrollbar-track-hover: rgba(255, 255, 255, 0.06);
671
+ --ty-scrollbar-track-hover: rgba(255, 255, 255, 0.04);
668
672
 
669
673
  --ty-surface-canvas: black;
670
674
  --ty-surface-content: #1a1a1a;
@@ -695,49 +699,55 @@ Emphasis logic inverts: lighter = more emphasis
695
699
  0 20px 25px -5px rgba(0, 0, 0, 0.3), 0 8px 10px -6px rgba(0, 0, 0, 0.3);
696
700
  --ty-shadow-2xl: 0 25px 50px -12px rgba(0, 0, 0, 0.5);
697
701
 
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. */
702
+ /* Solid button fills plain dark defaults. hover/active alias -strong;
703
+ theme engines override with smart per-state derivation. */
703
704
  --ty-solid-primary: #3e536c;
704
705
  --ty-solid-primary-strong: #426084;
705
706
  --ty-solid-primary-soft: #343f4c;
707
+ --ty-solid-primary-hover: var(--ty-solid-primary-strong);
708
+ --ty-solid-primary-active: var(--ty-solid-primary-strong);
706
709
  --ty-solid-primary-fg: white;
707
710
 
708
711
  --ty-solid-secondary: #7e67b4;
709
712
  --ty-solid-secondary-strong: #8269bc;
710
713
  --ty-solid-secondary-soft: #52466a;
714
+ --ty-solid-secondary-hover: var(--ty-solid-secondary-strong);
715
+ --ty-solid-secondary-active: var(--ty-solid-secondary-strong);
711
716
  --ty-solid-secondary-fg: white;
712
717
 
713
- /* Success */
714
718
  --ty-solid-success: #3bb68d;
715
719
  --ty-solid-success-strong: #459679;
716
720
  --ty-solid-success-soft: #285748;
721
+ --ty-solid-success-hover: var(--ty-solid-success-strong);
722
+ --ty-solid-success-active: var(--ty-solid-success-strong);
717
723
  --ty-solid-success-fg: white;
718
724
 
719
- /* Danger */
720
725
  --ty-solid-danger: #df5b5b;
721
726
  --ty-solid-danger-strong: #cc3e3e;
722
727
  --ty-solid-danger-soft: #875656;
728
+ --ty-solid-danger-hover: var(--ty-solid-danger-strong);
729
+ --ty-solid-danger-active: var(--ty-solid-danger-strong);
723
730
  --ty-solid-danger-fg: white;
724
731
 
725
- /* Warning */
726
732
  --ty-solid-warning: #e1a644;
727
733
  --ty-solid-warning-strong: #f59e0b;
728
734
  --ty-solid-warning-soft: #8b6334;
735
+ --ty-solid-warning-hover: var(--ty-solid-warning-strong);
736
+ --ty-solid-warning-active: var(--ty-solid-warning-strong);
729
737
  --ty-solid-warning-fg: white;
730
738
 
731
739
  --ty-solid-neutral: #414141;
732
740
  --ty-solid-neutral-strong: #4c4c4c;
733
741
  --ty-solid-neutral-soft: #2a2a2a;
742
+ --ty-solid-neutral-hover: var(--ty-solid-neutral-strong);
743
+ --ty-solid-neutral-active: var(--ty-solid-neutral-strong);
734
744
  --ty-solid-neutral-fg: white;
735
745
 
736
746
  /* Input component tokens - dark mode */
737
747
  --ty-input-bg: #1b1b1b;
738
748
  --ty-input-color: #f9fafb;
739
- --ty-input-border: #505050;
740
- --ty-input-border-hover: #7f7f7f;
749
+ --ty-input-border: #3a3a3a;
750
+ --ty-input-border-hover: #505050;
741
751
  --ty-input-border-focus: var(--ty-color-primary);
742
752
  --ty-input-shadow-focus: rgba(96, 165, 250, 0.1);
743
753
  --ty-input-placeholder: #717171;
@@ -1084,7 +1094,6 @@ SEMANTIC BACKGROUND UTILITIES
1084
1094
  background-color: var(--ty-bg-neutral-soft);
1085
1095
  }
1086
1096
 
1087
- /* Accent backgrounds */
1088
1097
  /* =================================================================
1089
1098
  TEXT HIERARCHY UTILITIES
1090
1099
  ================================================================= */
@@ -1240,7 +1249,6 @@ SEMANTIC TEXT COLORS - 5-VARIANT SYSTEM
1240
1249
  color: var(--ty-color-neutral-faint) !important;
1241
1250
  }
1242
1251
 
1243
- /* Accent text colors */
1244
1252
  /* =================================================================
1245
1253
  BORDER UTILITIES
1246
1254
  ================================================================= */
@@ -1536,7 +1544,6 @@ INTERACTIVE STATES
1536
1544
  color: var(--ty-color-neutral-faint) !important;
1537
1545
  }
1538
1546
 
1539
- /* Accent text hover states */
1540
1547
  /* Hover states for borders */
1541
1548
  /* Base border hover states */
1542
1549
  .hover\:ty-border\+\+:hover {