tyrell-components 1.0.0-TC35 → 1.0.0-TC36

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.
@@ -130,8 +130,13 @@
130
130
  --ty-danger-hue: 25;
131
131
  --ty-danger-chroma: calc(var(--ty-brand-chroma) * 1.31);
132
132
 
133
- --ty-neutral-hue: var(--ty-brand-hue);
134
- --ty-neutral-chroma: calc(var(--ty-brand-chroma) * 0.04);
133
+ /* Neutral is ACHROMATIC by default — greys do not follow the brand.
134
+ * Most of an interface is monochrome; a rebrand should not drift it.
135
+ * To warm greys toward the brand (the pre-2026-08 behavior), opt in:
136
+ * --ty-neutral-hue: var(--ty-brand-hue);
137
+ * --ty-neutral-chroma: calc(var(--ty-brand-chroma) * 0.04); */
138
+ --ty-neutral-hue: 0;
139
+ --ty-neutral-chroma: 0;
135
140
 
136
141
  /* ----------------------------------------------------------------
137
142
  * Tier 3 — L-CURVE (light mode)
@@ -150,6 +155,33 @@
150
155
  --ty-l-bg-bold: 0.92;
151
156
  --ty-l-bg-soft: 0.98;
152
157
 
158
+ /* Text ladder (--ty-text-*) and surface borders — historically
159
+ * hardcoded hexes in tyrell.css that a rebrand never touched; now
160
+ * engine-wired at the SAME lightness the hexes had (measured via
161
+ * oklch(from #hex l c h)), tinted by the neutral seeds. At the
162
+ * default --ty-neutral-chroma (≈0.005) the tint is imperceptible. */
163
+ --ty-l-text-strong: 0; /* was #000 */
164
+ --ty-l-text-bold: 0; /* was #000 */
165
+ --ty-l-text-base: 0.21; /* was #111827 */
166
+ --ty-l-text-soft: 0.37; /* was #374151 */
167
+ --ty-l-text-faint: 0.71; /* was #9ca3af */
168
+
169
+ --ty-l-border-content: 0.93; /* was #e5e7eb */
170
+ --ty-l-border-elevated: 0.93;
171
+ --ty-l-border-floating: 0.93;
172
+
173
+ /* Generic border ladder — borders are their OWN family, not ink.
174
+ * Historically --ty-border-* aliased the neutral text ramp; that tied
175
+ * app chrome to the text emphasis curve (and to --ty-neutral-l-factor),
176
+ * so tuning text moved every border. Defaults preserve the exact L the
177
+ * aliases produced. Borders sit relative to the surfaces they separate;
178
+ * tune them here without touching text. */
179
+ --ty-l-border-strong: 0.46; /* was color-neutral-bold */
180
+ --ty-l-border-bold: 0.64;
181
+ --ty-l-border: 0.76; /* was color-neutral-soft */
182
+ --ty-l-border-soft: 0.88; /* was color-neutral-faint */
183
+ --ty-l-border-faint: 0.92;
184
+
153
185
  /* ----------------------------------------------------------------
154
186
  * Tier 4 — SATURATION CURVE
155
187
  * Per-shade chroma multipliers. Each shade's chroma =
@@ -235,6 +267,25 @@ html[data-theme="dark"] {
235
267
  --ty-l-bg-bold: 0.26;
236
268
  --ty-l-bg-soft: 0.19;
237
269
 
270
+ /* Text ladder + surface borders dark — L matched to the hexes
271
+ * tyrell.css used to hardcode (#fff/#f9fafb/#d6d6d6/#7f8590/#555a63,
272
+ * borders #030712/#414141/#494949). */
273
+ --ty-l-text-strong: 1;
274
+ --ty-l-text-bold: 0.985;
275
+ --ty-l-text-base: 0.88;
276
+ --ty-l-text-soft: 0.62;
277
+ --ty-l-text-faint: 0.47;
278
+
279
+ --ty-l-border-content: 0.13;
280
+ --ty-l-border-elevated: 0.375;
281
+ --ty-l-border-floating: 0.41;
282
+
283
+ --ty-l-border-strong: 0.66;
284
+ --ty-l-border-bold: 0.46;
285
+ --ty-l-border: 0.38;
286
+ --ty-l-border-soft: 0.3;
287
+ --ty-l-border-faint: 0.3;
288
+
238
289
  /* Tier 4 dark — dim shades hold more chroma so they don't grey out;
239
290
  * strong shades trim chroma so bright tones don't over-pop. */
240
291
  --ty-c-strong-mult: 0.77;
@@ -255,8 +306,8 @@ html[data-theme="dark"] {
255
306
  --ty-solid-strong-l: 0.06; /* tone+ */
256
307
  --ty-solid-soft-l: -0.1; /* tone- */
257
308
 
258
- --ty-solid-l: -0.25; /* dim against dark canvas */
259
- --ty-solid-c: 0.65; /* desaturate against dark canvas */
309
+ --ty-solid-l: -0.2; /* dim against dark canvas */
310
+ --ty-solid-c: 0.7; /* desaturate against dark canvas */
260
311
  --ty-solid-h: 0; /* hue offset */
261
312
  }
262
313
 
@@ -276,14 +327,18 @@ html[data-theme="dark"] {
276
327
  * var(--ty-{flavor}-hue) ← H
277
328
  * );
278
329
  *
279
- * Computed tokens are declared in BOTH `:root` and `html.dark` blocks
280
- * because tyrell.css ships hardcoded dark-mode hexes at html.dark
281
- * specificity (0,1,1); our brand-layer `:root` (0,1,0) would lose
282
- * source-order otherwise. Same math both blocks just different L/C
283
- * inputs from Tier 3/4.
330
+ * Formulas are declared ONCE, at `html:root` (specificity 0,1,1 — NOT
331
+ * plain `:root` (0,1,0)): they out-rank tyrell.css's hardcoded light
332
+ * tokens by specificity and its hardcoded `html.dark` hexes (0,1,1) by
333
+ * source order, since the brand layer loads after. Dark mode needs no
334
+ * formula duplicates — the dials they read (Tier 3/4, SECTION 1) are
335
+ * what flip per mode. The `html.dark` block at the END of this file
336
+ * holds only genuine per-mode DATA (surface ladder, hand-pinned
337
+ * absolutes) — never formulas. If you add a token here, do NOT mirror
338
+ * it there unless its VALUE is mode-specific.
284
339
  * ===================================================================== */
285
340
 
286
- :root {
341
+ html:root {
287
342
  /* ----------------------------------------------------------------
288
343
  * Flavor color ramps (fg + bg + border)
289
344
  * --------------------------------------------------------------*/
@@ -544,18 +599,66 @@ html[data-theme="dark"] {
544
599
  );
545
600
 
546
601
  /* ----------------------------------------------------------------
547
- * Global neutral borders — read off the neutral color ramp.
602
+ * Global neutral borders — own family, own L ladder (Tier 3).
603
+ * Tinted by the neutral seeds like everything grey, but NOT tied to
604
+ * the text emphasis curve or --ty-neutral-l-factor. Per-flavor
605
+ * accent borders (--ty-border-{flavor}) stay ink aliases — a colored
606
+ * border SHOULD track its flavor's ink.
548
607
  * --------------------------------------------------------------*/
549
- --ty-border-strong: var(--ty-color-neutral-bold);
550
- --ty-border: var(--ty-color-neutral-soft);
551
- --ty-border-bold: var(--ty-color-neutral-soft);
552
- --ty-border-soft: var(--ty-color-neutral-faint);
553
- --ty-border-faint: var(--ty-color-neutral-faint);
608
+ --ty-border-strong: oklch(
609
+ var(--ty-l-border-strong) var(--ty-neutral-chroma) var(--ty-neutral-hue)
610
+ );
611
+ --ty-border: oklch(
612
+ var(--ty-l-border) var(--ty-neutral-chroma) var(--ty-neutral-hue)
613
+ );
614
+ --ty-border-bold: oklch(
615
+ var(--ty-l-border-bold) var(--ty-neutral-chroma) var(--ty-neutral-hue)
616
+ );
617
+ --ty-border-soft: oklch(
618
+ var(--ty-l-border-soft) var(--ty-neutral-chroma) var(--ty-neutral-hue)
619
+ );
620
+ --ty-border-faint: oklch(
621
+ var(--ty-l-border-faint) var(--ty-neutral-chroma) var(--ty-neutral-hue)
622
+ );
623
+
624
+ /* ----------------------------------------------------------------
625
+ * Text ladder + surface borders — engine-wired versions of tokens
626
+ * tyrell.css hardcodes as hexes. Own L dials (Tier 3), neutral
627
+ * hue/chroma tint. These out-rank the base hexes the same way every
628
+ * other token here does; a rebrand now reaches body text too.
629
+ * --------------------------------------------------------------*/
630
+ --ty-text-strong: oklch(
631
+ var(--ty-l-text-strong) var(--ty-neutral-chroma) var(--ty-neutral-hue)
632
+ );
633
+ --ty-text-bold: oklch(
634
+ var(--ty-l-text-bold) var(--ty-neutral-chroma) var(--ty-neutral-hue)
635
+ );
636
+ --ty-text: oklch(
637
+ var(--ty-l-text-base) var(--ty-neutral-chroma) var(--ty-neutral-hue)
638
+ );
639
+ --ty-text-soft: oklch(
640
+ var(--ty-l-text-soft) var(--ty-neutral-chroma) var(--ty-neutral-hue)
641
+ );
642
+ --ty-text-faint: oklch(
643
+ var(--ty-l-text-faint) var(--ty-neutral-chroma) var(--ty-neutral-hue)
644
+ );
645
+
646
+ --ty-content-border: oklch(
647
+ var(--ty-l-border-content) var(--ty-neutral-chroma) var(--ty-neutral-hue)
648
+ );
649
+ --ty-elevated-border: oklch(
650
+ var(--ty-l-border-elevated) var(--ty-neutral-chroma) var(--ty-neutral-hue)
651
+ );
652
+ --ty-floating-border: oklch(
653
+ var(--ty-l-border-floating) var(--ty-neutral-chroma) var(--ty-neutral-hue)
654
+ );
554
655
 
555
656
  /* ----------------------------------------------------------------
556
657
  * Surfaces — monochrome by default; --ty-surface-chroma warms them.
557
658
  * --------------------------------------------------------------*/
558
- --ty-surface-canvas: oklch(0.985 var(--ty-surface-chroma) var(--ty-brand-hue));
659
+ --ty-surface-canvas: oklch(
660
+ 0.985 var(--ty-surface-chroma) var(--ty-brand-hue)
661
+ );
559
662
  --ty-surface-content: oklch(1 0 0);
560
663
  --ty-surface-elevated: oklch(1 0 0);
561
664
  --ty-surface-floating: oklch(1 0 0);
@@ -647,7 +750,7 @@ html:root {
647
750
 
648
751
  /* Crossover point. Fills lighter than this get black text. ~0.58-0.62
649
752
  is the sRGB break-even; higher = prefers white, lower = prefers black. */
650
- --ty-solid-fg-threshold: 0.6;
753
+ --ty-solid-fg-threshold: 0.62;
651
754
 
652
755
  --ty-solid-primary-fg: oklch(
653
756
  from var(--ty-solid-primary)
@@ -808,262 +911,39 @@ html:root {
808
911
  }
809
912
 
810
913
  /* =====================================================================
811
- * SECTION 2 DARK — same computations re-declared so html.dark (0,1,1)
812
- * matches tyrell.css's hardcoded dark-mode hexes at source-order
813
- * specificity. The math is identical to the :root block above; only
814
- * the L/C inputs differ (from html.dark's Tier 3/4 overrides).
914
+ * SECTION 2 DARK — PER-MODE DATA ONLY
915
+ * =====================================================================
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.
815
920
  * ===================================================================== */
816
921
 
817
922
  html.dark,
818
923
  html[data-theme="dark"] {
819
- /* Primary */
820
- --ty-color-primary-strong: oklch(
821
- calc(var(--ty-l-strong) * var(--ty-primary-l-factor))
822
- calc(var(--ty-brand-chroma) * var(--ty-c-strong-mult)) var(--ty-brand-hue)
823
- );
824
- --ty-color-primary-bold: oklch(
825
- calc(var(--ty-l-bold) * var(--ty-primary-l-factor))
826
- calc(var(--ty-brand-chroma) * var(--ty-c-bold-mult)) var(--ty-brand-hue)
827
- );
828
- --ty-color-primary: oklch(
829
- calc(var(--ty-l-base) * var(--ty-primary-l-factor))
830
- calc(var(--ty-brand-chroma) * var(--ty-c-base-mult)) var(--ty-brand-hue)
831
- );
832
- --ty-color-primary-soft: oklch(
833
- calc(var(--ty-l-soft) * var(--ty-primary-l-factor))
834
- calc(var(--ty-brand-chroma) * var(--ty-c-soft-mult)) var(--ty-brand-hue)
835
- );
836
- --ty-color-primary-faint: oklch(
837
- calc(var(--ty-l-faint) * var(--ty-primary-l-factor))
838
- calc(var(--ty-brand-chroma) * var(--ty-c-faint-mult)) var(--ty-brand-hue)
839
- );
840
- --ty-bg-primary: oklch(
841
- calc(var(--ty-l-bg-base) * var(--ty-primary-l-factor))
842
- calc(var(--ty-brand-chroma) * var(--ty-c-bg-base-mult))
843
- var(--ty-brand-hue)
844
- );
845
- --ty-bg-primary-bold: oklch(
846
- calc(var(--ty-l-bg-bold) * var(--ty-primary-l-factor))
847
- calc(var(--ty-brand-chroma) * var(--ty-c-bg-bold-mult))
848
- var(--ty-brand-hue)
849
- );
850
- --ty-bg-primary-soft: oklch(
851
- calc(var(--ty-l-bg-soft) * var(--ty-primary-l-factor))
852
- calc(var(--ty-brand-chroma) * var(--ty-c-bg-soft-mult))
853
- var(--ty-brand-hue)
854
- );
855
- --ty-border-primary: var(--ty-color-primary-soft);
856
-
857
- /* Secondary */
858
- --ty-color-secondary-strong: oklch(
859
- calc(var(--ty-l-strong) * var(--ty-secondary-l-factor))
860
- calc(var(--ty-secondary-chroma) * var(--ty-c-strong-mult))
861
- var(--ty-secondary-hue)
862
- );
863
- --ty-color-secondary-bold: oklch(
864
- calc(var(--ty-l-bold) * var(--ty-secondary-l-factor))
865
- calc(var(--ty-secondary-chroma) * var(--ty-c-bold-mult))
866
- var(--ty-secondary-hue)
867
- );
868
- --ty-color-secondary: oklch(
869
- calc(var(--ty-l-base) * var(--ty-secondary-l-factor))
870
- calc(var(--ty-secondary-chroma) * var(--ty-c-base-mult))
871
- var(--ty-secondary-hue)
872
- );
873
- --ty-color-secondary-soft: oklch(
874
- calc(var(--ty-l-soft) * var(--ty-secondary-l-factor))
875
- calc(var(--ty-secondary-chroma) * var(--ty-c-soft-mult))
876
- var(--ty-secondary-hue)
877
- );
878
- --ty-color-secondary-faint: oklch(
879
- calc(var(--ty-l-faint) * var(--ty-secondary-l-factor))
880
- calc(var(--ty-secondary-chroma) * var(--ty-c-faint-mult))
881
- var(--ty-secondary-hue)
882
- );
883
- --ty-bg-secondary: oklch(
884
- calc(var(--ty-l-bg-base) * var(--ty-secondary-l-factor))
885
- calc(var(--ty-secondary-chroma) * var(--ty-c-bg-base-mult))
886
- var(--ty-secondary-hue)
887
- );
888
- --ty-bg-secondary-bold: oklch(
889
- calc(var(--ty-l-bg-bold) * var(--ty-secondary-l-factor))
890
- calc(var(--ty-secondary-chroma) * var(--ty-c-bg-bold-mult))
891
- var(--ty-secondary-hue)
892
- );
893
- --ty-bg-secondary-soft: oklch(
894
- calc(var(--ty-l-bg-soft) * var(--ty-secondary-l-factor))
895
- calc(var(--ty-secondary-chroma) * var(--ty-c-bg-soft-mult))
896
- var(--ty-secondary-hue)
897
- );
898
- --ty-border-secondary: var(--ty-color-secondary-soft);
899
-
900
- /* Success */
901
- --ty-color-success-strong: oklch(
902
- calc(var(--ty-l-strong) * var(--ty-success-l-factor))
903
- calc(var(--ty-success-chroma) * var(--ty-c-strong-mult))
904
- var(--ty-success-hue)
905
- );
906
- --ty-color-success-bold: oklch(
907
- calc(var(--ty-l-bold) * var(--ty-success-l-factor))
908
- calc(var(--ty-success-chroma) * var(--ty-c-bold-mult))
909
- var(--ty-success-hue)
910
- );
911
- --ty-color-success: oklch(
912
- calc(var(--ty-l-base) * var(--ty-success-l-factor))
913
- calc(var(--ty-success-chroma) * var(--ty-c-base-mult))
914
- var(--ty-success-hue)
915
- );
916
- --ty-color-success-soft: oklch(
917
- calc(var(--ty-l-soft) * var(--ty-success-l-factor))
918
- calc(var(--ty-success-chroma) * var(--ty-c-soft-mult))
919
- var(--ty-success-hue)
920
- );
921
- --ty-color-success-faint: oklch(
922
- calc(var(--ty-l-faint) * var(--ty-success-l-factor))
923
- calc(var(--ty-success-chroma) * var(--ty-c-faint-mult))
924
- var(--ty-success-hue)
925
- );
926
- --ty-bg-success: oklch(
927
- calc(var(--ty-l-bg-base) * var(--ty-success-l-factor))
928
- calc(var(--ty-success-chroma) * var(--ty-c-bg-base-mult))
929
- var(--ty-success-hue)
930
- );
931
- --ty-bg-success-bold: oklch(
932
- calc(var(--ty-l-bg-bold) * var(--ty-success-l-factor))
933
- calc(var(--ty-success-chroma) * var(--ty-c-bg-bold-mult))
934
- var(--ty-success-hue)
935
- );
936
- --ty-bg-success-soft: oklch(
937
- calc(var(--ty-l-bg-soft) * var(--ty-success-l-factor))
938
- calc(var(--ty-success-chroma) * var(--ty-c-bg-soft-mult))
939
- var(--ty-success-hue)
940
- );
941
- --ty-border-success: var(--ty-color-success-soft);
942
-
943
- /* Danger */
944
- --ty-color-danger-strong: oklch(
945
- calc(var(--ty-l-strong) * var(--ty-danger-l-factor))
946
- calc(var(--ty-danger-chroma) * var(--ty-c-strong-mult))
947
- var(--ty-danger-hue)
948
- );
949
- --ty-color-danger-bold: oklch(
950
- calc(var(--ty-l-bold) * var(--ty-danger-l-factor))
951
- calc(var(--ty-danger-chroma) * var(--ty-c-bold-mult)) var(--ty-danger-hue)
952
- );
953
- --ty-color-danger: oklch(
954
- calc(var(--ty-l-base) * var(--ty-danger-l-factor))
955
- calc(var(--ty-danger-chroma) * var(--ty-c-base-mult)) var(--ty-danger-hue)
956
- );
957
- --ty-color-danger-soft: oklch(
958
- calc(var(--ty-l-soft) * var(--ty-danger-l-factor))
959
- calc(var(--ty-danger-chroma) * var(--ty-c-soft-mult)) var(--ty-danger-hue)
960
- );
961
- --ty-color-danger-faint: oklch(
962
- calc(var(--ty-l-faint) * var(--ty-danger-l-factor))
963
- calc(var(--ty-danger-chroma) * var(--ty-c-faint-mult))
964
- var(--ty-danger-hue)
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)
965
929
  );
966
- --ty-bg-danger: oklch(
967
- calc(var(--ty-l-bg-base) * var(--ty-danger-l-factor))
968
- calc(var(--ty-danger-chroma) * var(--ty-c-bg-base-mult))
969
- var(--ty-danger-hue)
930
+ --ty-surface-elevated: oklch(
931
+ 0.19 var(--ty-surface-chroma) var(--ty-brand-hue)
970
932
  );
971
- --ty-bg-danger-bold: oklch(
972
- calc(var(--ty-l-bg-bold) * var(--ty-danger-l-factor))
973
- calc(var(--ty-danger-chroma) * var(--ty-c-bg-bold-mult))
974
- var(--ty-danger-hue)
933
+ --ty-surface-floating: oklch(
934
+ 0.22 var(--ty-surface-chroma) var(--ty-brand-hue)
975
935
  );
976
- --ty-bg-danger-soft: oklch(
977
- calc(var(--ty-l-bg-soft) * var(--ty-danger-l-factor))
978
- calc(var(--ty-danger-chroma) * var(--ty-c-bg-soft-mult))
979
- var(--ty-danger-hue)
980
- );
981
- --ty-border-danger: var(--ty-color-danger-soft);
936
+ --ty-surface-input: oklch(0.18 var(--ty-surface-chroma) var(--ty-brand-hue));
982
937
 
983
- /* Warning */
984
- --ty-color-warning-strong: oklch(
985
- calc(var(--ty-l-strong) * var(--ty-warning-l-factor))
986
- calc(var(--ty-warning-chroma) * var(--ty-c-strong-mult))
987
- var(--ty-warning-hue)
988
- );
989
- --ty-color-warning-bold: oklch(
990
- calc(var(--ty-l-bold) * var(--ty-warning-l-factor))
991
- calc(var(--ty-warning-chroma) * var(--ty-c-bold-mult))
992
- var(--ty-warning-hue)
993
- );
994
- --ty-color-warning: oklch(
995
- calc(var(--ty-l-base) * var(--ty-warning-l-factor))
996
- calc(var(--ty-warning-chroma) * var(--ty-c-base-mult))
997
- var(--ty-warning-hue)
998
- );
999
- --ty-color-warning-soft: oklch(
1000
- calc(var(--ty-l-soft) * var(--ty-warning-l-factor))
1001
- calc(var(--ty-warning-chroma) * var(--ty-c-soft-mult))
1002
- var(--ty-warning-hue)
1003
- );
1004
- --ty-color-warning-faint: oklch(
1005
- calc(var(--ty-l-faint) * var(--ty-warning-l-factor))
1006
- calc(var(--ty-warning-chroma) * var(--ty-c-faint-mult))
1007
- var(--ty-warning-hue)
1008
- );
1009
- --ty-bg-warning: oklch(
1010
- calc(var(--ty-l-bg-base) * var(--ty-warning-l-factor))
1011
- calc(var(--ty-warning-chroma) * var(--ty-c-bg-base-mult))
1012
- var(--ty-warning-hue)
1013
- );
1014
- --ty-bg-warning-bold: oklch(
1015
- calc(var(--ty-l-bg-bold) * var(--ty-warning-l-factor))
1016
- calc(var(--ty-warning-chroma) * var(--ty-c-bg-bold-mult))
1017
- var(--ty-warning-hue)
1018
- );
1019
- --ty-bg-warning-soft: oklch(
1020
- calc(var(--ty-l-bg-soft) * var(--ty-warning-l-factor))
1021
- calc(var(--ty-warning-chroma) * var(--ty-c-bg-soft-mult))
1022
- var(--ty-warning-hue)
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
1023
943
  );
1024
- --ty-border-warning: var(--ty-color-warning-soft);
1025
944
 
1026
- /* Neutral */
1027
- --ty-color-neutral-strong: oklch(
1028
- calc(var(--ty-l-strong) * var(--ty-neutral-l-factor))
1029
- calc(var(--ty-neutral-chroma) * var(--ty-c-strong-mult))
1030
- var(--ty-neutral-hue)
1031
- );
1032
- --ty-color-neutral-bold: oklch(
1033
- calc(var(--ty-l-bold) * var(--ty-neutral-l-factor))
1034
- calc(var(--ty-neutral-chroma) * var(--ty-c-bold-mult))
1035
- var(--ty-neutral-hue)
1036
- );
1037
- --ty-color-neutral: oklch(
1038
- calc(var(--ty-l-base) * var(--ty-neutral-l-factor))
1039
- calc(var(--ty-neutral-chroma) * var(--ty-c-base-mult))
1040
- var(--ty-neutral-hue)
1041
- );
1042
- --ty-color-neutral-soft: oklch(
1043
- calc(var(--ty-l-soft) * var(--ty-neutral-l-factor))
1044
- calc(var(--ty-neutral-chroma) * var(--ty-c-soft-mult))
1045
- var(--ty-neutral-hue)
1046
- );
1047
- --ty-color-neutral-faint: oklch(
1048
- calc(var(--ty-l-faint) * var(--ty-neutral-l-factor))
1049
- calc(var(--ty-neutral-chroma) * var(--ty-c-faint-mult))
1050
- var(--ty-neutral-hue)
1051
- );
1052
- --ty-bg-neutral: oklch(
1053
- calc(var(--ty-l-bg-base) * var(--ty-neutral-l-factor))
1054
- calc(var(--ty-neutral-chroma) * var(--ty-c-bg-base-mult))
1055
- var(--ty-neutral-hue)
1056
- );
1057
- --ty-bg-neutral-bold: oklch(
1058
- calc(var(--ty-l-bg-bold) * var(--ty-neutral-l-factor))
1059
- calc(var(--ty-neutral-chroma) * var(--ty-c-bg-bold-mult))
1060
- var(--ty-neutral-hue)
1061
- );
1062
- --ty-bg-neutral-soft: oklch(
1063
- calc(var(--ty-l-bg-soft) * var(--ty-neutral-l-factor))
1064
- calc(var(--ty-neutral-chroma) * var(--ty-c-bg-soft-mult))
1065
- var(--ty-neutral-hue)
1066
- );
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. */
1067
947
  --ty-bg-neutral-strong: oklch(
1068
948
  0.95 calc(var(--ty-neutral-chroma) * 2) var(--ty-neutral-hue)
1069
949
  );
@@ -1071,40 +951,12 @@ html[data-theme="dark"] {
1071
951
  0.15 calc(var(--ty-neutral-chroma) * 2) var(--ty-neutral-hue)
1072
952
  );
1073
953
 
1074
- /* Global neutral borders */
1075
- --ty-border-strong: var(--ty-color-neutral-bold);
1076
- --ty-border: var(--ty-color-neutral-soft);
1077
- --ty-border-bold: var(--ty-color-neutral-soft);
1078
- --ty-border-soft: var(--ty-color-neutral-faint);
1079
- --ty-border-faint: var(--ty-color-neutral-faint);
1080
-
1081
- /* Surfaces — monochrome by default; --ty-surface-chroma warms them. */
1082
- --ty-surface-canvas: oklch(0.12 var(--ty-surface-chroma) var(--ty-brand-hue));
1083
- --ty-surface-content: oklch(0.16 var(--ty-surface-chroma) var(--ty-brand-hue));
1084
- --ty-surface-elevated: oklch(0.19 var(--ty-surface-chroma) var(--ty-brand-hue));
1085
- --ty-surface-floating: oklch(0.22 var(--ty-surface-chroma) var(--ty-brand-hue));
1086
- --ty-surface-input: oklch(0.18 var(--ty-surface-chroma) var(--ty-brand-hue));
1087
-
1088
- /* Inputs — re-declared at html.dark specificity. */
1089
- --ty-input-bg: var(--ty-surface-input);
1090
- --ty-input-color: var(--ty-color-neutral-strong);
1091
- --ty-input-border: var(--ty-color-neutral-faint);
1092
- --ty-input-border-hover: var(--ty-color-neutral-soft);
1093
- --ty-input-border-focus: var(--ty-color-primary);
1094
- --ty-input-placeholder: var(--ty-color-neutral-soft);
1095
- --ty-input-disabled-bg: var(--ty-color-neutral-faint);
1096
- --ty-input-disabled-border: var(--ty-color-neutral-faint);
1097
- --ty-input-disabled-color: var(--ty-color-neutral-bold);
1098
- --ty-input-shadow-focus: color-mix(
1099
- in oklab,
1100
- var(--ty-color-primary) 20%,
1101
- transparent
1102
- );
1103
-
1104
- /* Tier 6 dark — solid dials live in SECTION 1's html.dark block.
1105
- * neutral is hand-pinned (it ignores Axis B); dim it per theme here. */
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. */
1106
956
  --ty-solid-neutral: oklch(
1107
- 0.3 calc(var(--ty-neutral-chroma) * var(--ty-c-strong-mult))
957
+ 0.23 calc(var(--ty-neutral-chroma) * var(--ty-c-strong-mult))
1108
958
  var(--ty-neutral-hue)
1109
959
  );
960
+
961
+ --ty-neutral-l-factor: 0.8;
1110
962
  }