tyrell-components 1.0.0-TC52 → 1.0.0-TC53

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 (105) hide show
  1. package/css/tyrell-theme.css +25 -2
  2. package/css/tyrell.css +4 -0
  3. package/dist/tyrell-colors-static.css +1 -316
  4. package/dist/tyrell-theme.css +1 -1443
  5. package/dist/tyrell.css +1 -1390
  6. package/dist/tyrell.js +1 -1
  7. package/lib/base/ty-component.js +196 -196
  8. package/lib/components/button.d.ts +1 -1
  9. package/lib/components/button.js +260 -259
  10. package/lib/components/calendar-month.d.ts +2 -2
  11. package/lib/components/calendar-month.js +426 -416
  12. package/lib/components/calendar-navigation.js +238 -238
  13. package/lib/components/calendar.js +605 -602
  14. package/lib/components/checkbox.d.ts +1 -1
  15. package/lib/components/checkbox.js +273 -272
  16. package/lib/components/copy.d.ts +1 -1
  17. package/lib/components/copy.js +279 -278
  18. package/lib/components/date-picker.d.ts +1 -1
  19. package/lib/components/date-picker.js +1103 -1108
  20. package/lib/components/file-upload.js +404 -404
  21. package/lib/components/icon.js +141 -141
  22. package/lib/components/input.d.ts +1 -1
  23. package/lib/components/input.js +593 -596
  24. package/lib/components/modal.js +319 -319
  25. package/lib/components/option.js +167 -167
  26. package/lib/components/popup.js +233 -233
  27. package/lib/components/radio.d.ts +2 -2
  28. package/lib/components/radio.js +407 -406
  29. package/lib/components/resize-observer.js +67 -67
  30. package/lib/components/scroll-container.js +294 -294
  31. package/lib/components/select.d.ts +1 -1
  32. package/lib/components/select.js +1524 -1532
  33. package/lib/components/selected-tags.js +184 -184
  34. package/lib/components/step.js +62 -62
  35. package/lib/components/switch.d.ts +1 -1
  36. package/lib/components/switch.js +214 -213
  37. package/lib/components/tab.js +62 -62
  38. package/lib/components/tabs.js +507 -507
  39. package/lib/components/tag.d.ts +1 -1
  40. package/lib/components/tag.js +236 -235
  41. package/lib/components/textarea.d.ts +1 -1
  42. package/lib/components/textarea.js +457 -456
  43. package/lib/components/tooltip.js +283 -283
  44. package/lib/components/wizard.js +384 -384
  45. package/lib/icons/heroicons/micro.js +392 -392
  46. package/lib/icons/heroicons/mini.js +382 -382
  47. package/lib/icons/heroicons/outline.js +337 -337
  48. package/lib/icons/heroicons/solid.js +407 -407
  49. package/lib/icons/lucide.js +22843 -22843
  50. package/lib/icons/material/filled.js +9653 -9653
  51. package/lib/icons/material/outlined.js +10271 -10271
  52. package/lib/icons/material/round.js +10495 -10495
  53. package/lib/icons/material/sharp.js +9905 -9905
  54. package/lib/icons/material/two-tone.js +12792 -12792
  55. package/lib/index.js +21 -21
  56. package/lib/styles/button.js +176 -288
  57. package/lib/styles/calendar-month.js +123 -183
  58. package/lib/styles/calendar-navigation.js +60 -79
  59. package/lib/styles/calendar.js +8 -9
  60. package/lib/styles/checkbox.js +45 -72
  61. package/lib/styles/copy.js +67 -91
  62. package/lib/styles/custom-scrollbar.js +80 -100
  63. package/lib/styles/date-picker.js +261 -331
  64. package/lib/styles/field-size.d.ts +6 -0
  65. package/lib/styles/field-size.js +91 -0
  66. package/lib/styles/file-upload.js +139 -169
  67. package/lib/styles/icon.js +92 -156
  68. package/lib/styles/input.js +125 -241
  69. package/lib/styles/modal.js +67 -102
  70. package/lib/styles/option.d.ts +1 -1
  71. package/lib/styles/option.js +47 -67
  72. package/lib/styles/popup.js +34 -65
  73. package/lib/styles/radio.js +69 -96
  74. package/lib/styles/resize-observer.js +2 -5
  75. package/lib/styles/scroll-container.js +100 -130
  76. package/lib/styles/select-base.js +525 -778
  77. package/lib/styles/select.js +140 -228
  78. package/lib/styles/step.js +22 -29
  79. package/lib/styles/switch.js +34 -55
  80. package/lib/styles/tab.js +22 -29
  81. package/lib/styles/tabs.js +171 -252
  82. package/lib/styles/tag.js +135 -188
  83. package/lib/styles/textarea.d.ts +1 -1
  84. package/lib/styles/textarea.js +205 -271
  85. package/lib/styles/tooltip.js +3 -3
  86. package/lib/styles/wizard.js +170 -226
  87. package/lib/types/common.d.ts +2 -0
  88. package/lib/types/common.js +6 -5
  89. package/lib/utils/calendar-utils.js +100 -100
  90. package/lib/utils/custom-scrollbar.js +272 -272
  91. package/lib/utils/flavor-sheet.js +14 -14
  92. package/lib/utils/icon-registry.js +127 -127
  93. package/lib/utils/loader-registry.js +3 -3
  94. package/lib/utils/locale.js +34 -34
  95. package/lib/utils/mobile.js +1 -1
  96. package/lib/utils/number-format.js +54 -54
  97. package/lib/utils/positioning.js +212 -212
  98. package/lib/utils/property-capture.js +36 -36
  99. package/lib/utils/property-manager.js +125 -125
  100. package/lib/utils/resize-observer.js +23 -23
  101. package/lib/utils/scroll-lock.js +57 -57
  102. package/lib/utils/styles.js +17 -17
  103. package/lib/version.d.ts +1 -1
  104. package/lib/version.js +1 -1
  105. package/package.json +4 -4
@@ -1,1443 +1 @@
1
- /* =====================================================================
2
- * tyrell-theme.css — the OKLCH theme engine for Tyrell Components
3
- * =====================================================================
4
- *
5
- * Opt-in. Load AFTER `tyrell.css`. Override a few variables to rebrand —
6
- * or seed a color directly, declare a named theme, scope one to a
7
- * subtree. `tyrell.css` alone is correct and accessible without this
8
- * file; this is what turns it into a theming ENGINE rather than a fixed
9
- * palette: auto-contrast text, seed ingestion, named/scoped themes,
10
- * animated theme transitions. See CSS_GUIDE.md → Color Customization.
11
- *
12
- * <link rel="stylesheet" href=".../tyrell.css">
13
- * <link rel="stylesheet" href=".../tyrell-theme.css">
14
- *
15
- * :root {
16
- * --ty-primary-hue: 200; // teal. Try 260 indigo, 30 orange, 145 emerald.
17
- * --ty-primary-chroma: 0.13;
18
- * }
19
- *
20
- * =====================================================================
21
- * THE FORMULA
22
- * =====================================================================
23
- *
24
- * Every color in the library is one formula on five axes:
25
- *
26
- * oklch(
27
- * L = L-curve[shade] × flavor-l-factor ← Tier 2 × Tier 4
28
- * C = flavor-chroma × saturation-curve[shade] ← Tier 1 × Tier 3
29
- * H = flavor-hue ← Tier 1
30
- * )
31
- *
32
- * Pick a flavor (primary / success / warning / danger /
33
- * neutral). Pick a shade (strong / bold / base / soft / faint). That's
34
- * the cell; the formula gives you its color.
35
- *
36
- * FLAVOR axis — which semantic role (carries its own hue, chroma,
37
- * l-factor seeds)
38
- * SHADE axis — 5 emphasis stops shared across flavors
39
- * (strong / bold / base / soft / faint)
40
- * HUE axis — what color family (0°–360°)
41
- * CHROMA axis — how saturated (0 = grey, ~0.4 = max vivid)
42
- * L axis — how dark or light (0 = black, 1 = white)
43
- * Light mode: low L = more emphasis.
44
- * Dark mode: high L = more emphasis (curve flips).
45
- *
46
- * Worked example — `--ty-color-warning-bold` in LIGHT mode:
47
- *
48
- * L = 0.46 × 1 = 0.46 ← l-bold × warning-l-factor
49
- * C = 0.26 × 1.00 = 0.26 ← warning-chroma × c-bold-mult
50
- * H = 75° ← warning-hue
51
- * → oklch(0.46 0.26 75) (a punchy amber for +1 emphasis text)
52
- *
53
- * Want warning a notch darker without touching anything else? Set
54
- * `--ty-warning-l-factor: 0.85` and the new L becomes 0.46 × 0.85 =
55
- * 0.39. Every warning shade shifts in step; primary / success / danger
56
- * are untouched.
57
- *
58
- * =====================================================================
59
- * FILE LAYOUT
60
- * =====================================================================
61
- *
62
- * SECTION 1 — KNOBS
63
- * The variables you might want to override. Six tiers from drop-in
64
- * rebrand (Tier 1) to surgical per-flavor tweak (Tier 4) plus solid
65
- * buttons (Tier 5).
66
- *
67
- * SECTION 2 — IMPLEMENTATION
68
- * The oklch() expressions that wire the knobs through to the actual
69
- * color tokens. Rarely needs editing — Section 1 is the contract.
70
- *
71
- * Browser support: oklch() is in every evergreen browser since mid-2023.
72
- * Tier 5 (solid) additionally uses OKLCH relative color — oklch(from …) —
73
- * which lands later: Chrome 119, Safari 16.4, Firefox 128 (mid-2024).
74
- * Solid fills have no fallback below those versions.
75
- *
76
- * ===================================================================== */
77
-
78
- /* =====================================================================
79
- * SECTION 1 — KNOBS
80
- * =====================================================================
81
- *
82
- * Five tiers, ordered by how often you'd touch them. Override any of
83
- * these in your own `:root` (or `html.dark` for per-mode tuning) —
84
- * your declaration wins by source order.
85
- *
86
- * Tier 1 — FLAVOR SEEDS each flavor's hue + chroma, incl. primary.
87
- * Tier 2 — L-CURVE 5 lightness stops for the emphasis ramp.
88
- * Tier 3 — SATURATION CURVE per-shade chroma multipliers.
89
- * Tier 4 — PER-FLAVOR L-FACTOR per-flavor lightness multiplier — push
90
- * one flavor up or down without touching
91
- * the others. Default 1.
92
- * Tier 5 — SOLID FILLS solid-button system: hover/active/tone
93
- * L offsets + per-theme dim/desaturate.
94
- * ===================================================================== */
95
-
96
- :root {
97
- /* ----------------------------------------------------------------
98
- * Tier 1 — FLAVOR SEEDS
99
- * Every flavor — including primary — is one hue + one chroma. No
100
- * flavor derives from another; each is a standalone dial:
101
- * --ty-success-hue: 160; (more teal)
102
- * --ty-warning-chroma: 0.2; (more vivid)
103
- * Rebrand by overriding --ty-primary-hue/-chroma alone; touch the
104
- * others only when a specific flavor needs its own tuning.
105
- * --------------------------------------------------------------*/
106
-
107
- --ty-primary-hue: 252;
108
- --ty-primary-chroma: 0.08; /* restrained default; the loud 0.2 read as "bollywood" */
109
-
110
- /* Surface tint. 0 = monochrome surfaces (default, no primary leak).
111
- * Bump to ~0.005 (light) / ~0.012 (dark) to warm surfaces toward primary. */
112
- --ty-surface-chroma: 0;
113
-
114
- --ty-success-hue: 145;
115
- --ty-success-chroma: 0.086;
116
-
117
- --ty-warning-hue: 76;
118
- --ty-warning-chroma: 0.178;
119
-
120
- --ty-danger-hue: 31;
121
- --ty-danger-chroma: 0.134;
122
-
123
- /* Neutral is ACHROMATIC by default — greys do not follow primary.
124
- * Most of an interface is monochrome; a rebrand should not drift it.
125
- * To warm greys toward primary (the pre-2026-08 behavior), opt in:
126
- * --ty-neutral-hue: var(--ty-primary-hue);
127
- * --ty-neutral-chroma: 0.003; */
128
- --ty-neutral-hue: 0;
129
- --ty-neutral-chroma: 0;
130
-
131
- /* ----------------------------------------------------------------
132
- * Tier 2 — L-CURVE (light mode)
133
- * 5 lightness stops per flavor for the emphasis ramp.
134
- * Lower L = darker = more emphasis in light mode.
135
- * Plus 3 bg L stops for the soft-tint backgrounds.
136
- * --------------------------------------------------------------*/
137
-
138
- --ty-l-strong: 0.38; /* ++ max emphasis */
139
- --ty-l-bold: 0.46; /* + high emphasis */
140
- --ty-l-base: 0.54; /* body */
141
- --ty-l-soft: 0.72; /* - low emphasis */
142
- --ty-l-faint: 0.88; /* -- min emphasis */
143
-
144
- /* BG TRACK — the flavor's BASE color at low opacity, composited over
145
- * whatever surface it sits on. No bg-specific L or chroma stops: the
146
- * ink is always mid-scale (gamut-happy, l-factor-safe), and the alpha
147
- * does the washing. Direction is automatic — the same token lightens
148
- * a dark surface and darkens a light one — and l-factor reaches the
149
- * tint only through the ink, scaled by alpha: it points, it doesn't
150
- * shove. */
151
- --ty-a-bg-base: 9%;
152
- --ty-a-bg-bold: 17%;
153
- --ty-a-bg-soft: 4%;
154
-
155
- /* Text ladder (--ty-text-*) and surface borders — historically
156
- * hardcoded hexes in tyrell.css that a rebrand never touched; now
157
- * engine-wired at the SAME lightness the hexes had (measured via
158
- * oklch(from #hex l c h)), tinted by the neutral seeds. At the
159
- * default --ty-neutral-chroma (≈0.005) the tint is imperceptible. */
160
- --ty-l-text-strong: 0; /* was #000 */
161
- --ty-l-text-bold: 0; /* was #000 */
162
- --ty-l-text-base: 0.21; /* was #111827 */
163
- --ty-l-text-soft: 0.37; /* was #374151 */
164
- --ty-l-text-faint: 0.71; /* was #9ca3af */
165
-
166
- --ty-l-border-content: 0.93; /* was #e5e7eb */
167
- --ty-l-border-elevated: 0.93;
168
- --ty-l-border-floating: 0.93;
169
-
170
- /* Generic border ladder — borders are their OWN family, not ink.
171
- * Historically --ty-border-* aliased the neutral text ramp; that tied
172
- * app chrome to the text emphasis curve (and to --ty-neutral-l-factor),
173
- * so tuning text moved every border. Defaults preserve the exact L the
174
- * aliases produced. Borders sit relative to the surfaces they separate;
175
- * tune them here without touching text. */
176
- --ty-l-border-strong: 0.46; /* was color-neutral-bold */
177
- --ty-l-border-bold: 0.64;
178
- --ty-l-border: 0.76; /* was color-neutral-soft */
179
- --ty-l-border-soft: 0.88; /* was color-neutral-faint */
180
- --ty-l-border-faint: 0.92;
181
-
182
- /* Surface ladder + remaining per-mode absolutes, as L dials. These were
183
- * whole oklch() declarations swapped per mode; as numeric dials they are
184
- * (a) consistent with every other family and (b) interpolable — which is
185
- * what lets theme/mode switches ANIMATE (see THEME TRANSITIONS at the
186
- * end of this file). */
187
- --ty-l-surface-canvas: 0.985;
188
- --ty-l-surface-content: 1;
189
- --ty-l-surface-elevated: 1;
190
- --ty-l-surface-floating: 1;
191
- --ty-l-surface-input: 1;
192
-
193
- --ty-l-solid-neutral: 0.4; /* the neutral "ink" fill — dark in BOTH modes */
194
- /* neutral+ is FULL-CONTRAST ink — near-black on light, near-white on dark
195
- (mode block below) — not "anchor + shared offset" like other tones: the
196
- max-emphasis monochrome button is an absolute, not a nudge. Matches the
197
- static tyrell.css light value (#000) that predates this dial. */
198
- --ty-l-solid-neutral-strong: 0.15;
199
- --ty-l-bg-neutral-strong: 0.25; /* opposes the mode: dark bg on light page */
200
- --ty-l-bg-neutral-faint: 0.99; /* follows the mode */
201
- --ty-c-bg-neutral-faint-mult: 0.4;
202
-
203
- --ty-focus-ring-alpha: 5%; /* focus ring mix strength (dark needs more) */
204
-
205
- /* ----------------------------------------------------------------
206
- * Tier 3 — SATURATION CURVE
207
- * Per-shade chroma multipliers. Each shade's chroma =
208
- * flavor-chroma × multiplier. Drops near the extremes so
209
- * near-white and near-black can hold their tint.
210
- * --------------------------------------------------------------*/
211
-
212
- --ty-c-strong-mult: 0.77;
213
- --ty-c-bold-mult: 1;
214
- --ty-c-base-mult: 0.92;
215
- --ty-c-soft-mult: 0.77;
216
- --ty-c-faint-mult: 0.46;
217
-
218
- /* ----------------------------------------------------------------
219
- * Tier 4 — PER-FLAVOR L-FACTOR
220
- * Multiplies the L-curve values for that flavor only. Default 1 =
221
- * no change. Useful when one flavor's hue sits too close to
222
- * primary's on the wheel and the buttons blend.
223
- *
224
- * Example: primary-hue: 47° (gold). Warning sits at 75° (amber).
225
- * Both render as similar warm browns at that chroma. Drop warning
226
- * a notch and it darkens enough to stand apart:
227
- * --ty-warning-l-factor: 0.85;
228
- *
229
- * NOTE: the L-curve flips between light and dark mode, so a factor
230
- * < 1 darkens in light mode but DIMS in dark mode. If you want
231
- * symmetric "more emphatic" in both modes, set the factor here for
232
- * light AND set its inverse (1 / factor, roughly) in `html.dark`.
233
- * --------------------------------------------------------------*/
234
-
235
- --ty-primary-l-factor: 0.96;
236
- --ty-success-l-factor: 1;
237
- --ty-warning-l-factor: 1.3;
238
- --ty-danger-l-factor: 0.93;
239
- --ty-neutral-l-factor: 1;
240
-
241
- /* ----------------------------------------------------------------
242
- * Tier 5 — SOLID FILLS
243
- * Solid buttons are their OWN system, not the emphasis ramp. Each
244
- * flavor's fill defaults to --ty-color-{flavor}; the knobs below
245
- * derive its hover / active / tone+ / tone- and per-theme adjust.
246
- * Math lives in SECTION 2 (search "Tier 5 — SOLID"); these are the
247
- * dials.
248
- *
249
- * Axis A — interaction & tone, OKLCH L offsets on the fill.
250
- * Axis B — per-theme adjust applied to the base fill (dim/desaturate).
251
- *
252
- * NOTE: like Tier 4, the emphasis curve flips for dark, so these L
253
- * offsets are sign-flipped in `html.dark` below (darken in light =
254
- * lighten in dark). Keep the two blocks in sync.
255
- * --------------------------------------------------------------*/
256
-
257
- /* Axis A — interaction (light: darken on press, so offsets are negative) */
258
- --ty-solid-hover-l: -0.04; /* :hover */
259
- --ty-solid-active-l: -0.08; /* :active */
260
- --ty-solid-strong-l: -0.06; /* tone+ */
261
- --ty-solid-soft-l: 0.1; /* tone- */
262
-
263
- /* Axis B — per-theme adjust (light reads fine → identity) */
264
- --ty-solid-l: 0; /* lightness offset — negative dims */
265
- --ty-solid-c: 1; /* chroma multiplier — <1 desaturates */
266
- --ty-solid-h: 0; /* hue offset (deg) */
267
-
268
- /* Axis C — per-flavor solid anchor lift (added to the base fill's L,
269
- * tones/hover/active then derive from the lifted anchor). The solid
270
- * ladder's "darker = stronger" is FALSE for the yellow family: darkened
271
- * hue-75 is brown, so warning's whole ladder shifts UP instead — soft
272
- * 0.82 pale amber, base 0.72 vivid orange, strong 0.66 deep orange, all
273
- * black-text (Material treats amber the same way). Other flavors: 0. */
274
- --ty-primary-solid-l: 0;
275
- --ty-success-solid-l: 0;
276
- --ty-warning-solid-l: 0;
277
- --ty-danger-solid-l: 0;
278
- }
279
-
280
- /* Dark mode overrides for the L-curve and saturation curve, plus Tier 1
281
- * (per-flavor hue/chroma, incl. primary) and Tier 4 (l-factor)
282
- * — dark ships its own distinct flavor tuning here, not a
283
- * carry-through of :root's light values. */
284
- html.dark,
285
- html[data-theme="dark"],
286
- [data-ty-theme].dark,
287
- [data-ty-theme][data-theme="dark"] {
288
- --ty-primary-l-factor: 1;
289
- --ty-solid-fg-threshold: 0.5 !important;
290
- --ty-primary-hue: 226;
291
- --ty-primary-chroma: 0.065;
292
- --ty-success-hue: 129;
293
- --ty-success-chroma: 0.092;
294
- --ty-success-l-factor: 1.09;
295
- --ty-danger-hue: 13;
296
- --ty-danger-chroma: 0.101;
297
- --ty-danger-l-factor: 1.06;
298
- --ty-warning-hue: 82;
299
- --ty-warning-chroma: 0.195;
300
- --ty-warning-l-factor: 1.5;
301
- /* Tier 2 dark — inverted curve. Higher L = lighter text = more
302
- * emphasis on a dark background. */
303
- --ty-l-strong: 0.72;
304
- --ty-l-bold: 0.66;
305
- --ty-l-base: 0.62;
306
- --ty-l-soft: 0.46;
307
- --ty-l-faint: 0.3;
308
-
309
- /* BG TRACK dark — dark ink sits closer to its surface in L than
310
- * light's does, so the tint needs a touch more alpha to be felt. */
311
- --ty-a-bg-base: 13%;
312
- --ty-a-bg-bold: 22%;
313
- --ty-a-bg-soft: 7%;
314
-
315
- /* Text ladder + surface borders dark — L matched to the hexes
316
- * tyrell.css used to hardcode (#fff/#f9fafb/#d6d6d6/#7f8590/#555a63,
317
- * borders #030712/#414141/#494949). */
318
- --ty-l-text-strong: 1;
319
- --ty-l-text-bold: 0.985;
320
- --ty-l-text-base: 0.88;
321
- --ty-l-text-soft: 0.62;
322
- --ty-l-text-faint: 0.47;
323
-
324
- --ty-l-border-content: 0.13;
325
- --ty-l-border-elevated: 0.375;
326
- --ty-l-border-floating: 0.41;
327
-
328
- --ty-l-border-strong: 0.66;
329
- --ty-l-border-bold: 0.46;
330
- --ty-l-border: 0.38;
331
- --ty-l-border-soft: 0.3;
332
- --ty-l-border-faint: 0.3;
333
-
334
- /* Surface ladder + absolutes dark — hand-tuned values, now as dials. */
335
- --ty-l-surface-canvas: 0.12;
336
- --ty-l-surface-content: 0.16;
337
- --ty-l-surface-elevated: 0.19;
338
- --ty-l-surface-floating: 0.22;
339
- --ty-l-surface-input: 0.18;
340
-
341
- --ty-l-solid-neutral: 0.18;
342
- --ty-l-solid-neutral-strong: 0.88; /* inverted ink: white button, black text */
343
- --ty-l-bg-neutral-strong: 0.95;
344
- --ty-l-bg-neutral-faint: 0.15;
345
- --ty-c-bg-neutral-faint-mult: 2;
346
-
347
- /* Tier 4 dark — neutral inks pulled down a notch against dark surfaces. */
348
- --ty-neutral-l-factor: 0.8;
349
-
350
- --ty-focus-ring-alpha: 20%;
351
-
352
- /* Tier 3 dark — dim shades hold more chroma so they don't grey out;
353
- * strong shades trim chroma so bright tones don't over-pop. */
354
- --ty-c-strong-mult: 0.77;
355
- --ty-c-bold-mult: 1;
356
- --ty-c-base-mult: 0.92;
357
- --ty-c-soft-mult: 0.77;
358
- --ty-c-faint-mult: 0.5;
359
-
360
- /* Tier 5 dark — interaction offsets flip sign (press LIGHTENS on dark),
361
- * and the per-theme adjust dims + desaturates the fills against the
362
- * dark canvas. (Computed solid tokens are declared once at html:root.) */
363
- /* Bigger than light mode's 0.04/0.08: small L deltas at the dark end of
364
- * an emissive screen read much weaker than the same delta mid-scale, so
365
- * dark hover needs more push to be felt at all. */
366
- --ty-solid-hover-l: 0.07; /* :hover */
367
- --ty-solid-active-l: 0.11; /* :active */
368
- --ty-solid-strong-l: 0.06; /* tone+ */
369
- --ty-solid-soft-l: -0.1; /* tone- */
370
-
371
- --ty-solid-l: -0.2; /* dim against dark canvas */
372
- --ty-solid-c: 0.7; /* desaturate against dark canvas */
373
- --ty-solid-h: 0; /* hue offset */
374
-
375
- /* Axis C — dark warning fills are already dim enough not to brown out
376
- * (and browns read intentional on dark); no lift needed. */
377
- --ty-warning-solid-l: 0;
378
- }
379
-
380
- /* =====================================================================
381
- * SECTION 2 — IMPLEMENTATION
382
- * =====================================================================
383
- *
384
- * The oklch() expressions that turn Section 1's knobs into the actual
385
- * --ty-color-*, --ty-bg-*, --ty-border-*, --ty-surface-*, --ty-input-*,
386
- * and --ty-solid-* tokens that components read.
387
- *
388
- * Pattern for each flavor's 5-shade fg ramp + 3-shade bg ramp:
389
- *
390
- * --ty-color-{flavor}-{shade}: oklch(
391
- * calc(var(--ty-l-{shade}) * var(--ty-{flavor}-l-factor)) ← L
392
- * calc(var(--ty-{flavor}-chroma) * var(--ty-c-{shade}-mult)) ← C
393
- * var(--ty-{flavor}-hue) ← H
394
- * );
395
- *
396
- * Formulas are declared ONCE, at `html:root` (specificity 0,1,1 — NOT
397
- * plain `:root` (0,1,0)): they out-rank tyrell.css's hardcoded light
398
- * tokens by specificity and its hardcoded `html.dark` hexes (0,1,1) by
399
- * source order, since the theme layer loads after. Dark mode needs no
400
- * formula duplicates — the dials they read (Tier 2/3, SECTION 1) are
401
- * what flip per mode. The `html.dark` block at the END of this file
402
- * holds only genuine per-mode DATA (surface ladder, hand-pinned
403
- * absolutes) — never formulas. If you add a token here, do NOT mirror
404
- * it there unless its VALUE is mode-specific.
405
- * ===================================================================== */
406
-
407
- html:root,
408
- [data-ty-theme] {
409
- /* ----------------------------------------------------------------
410
- * Flavor color ramps (fg + bg + border)
411
- *
412
- * SEED INGESTION — every flavor resolves ONE seed color, and every
413
- * ramp formula reads that seed's c + h channels via relative color
414
- * syntax; L always comes from the mode-flipped curve. Two ways in:
415
- *
416
- * numbers (default) — the Tier 1 hue+chroma dials construct the
417
- * seed: --ty-primary-hue: 200; --ty-primary-chroma: 0.13;
418
- *
419
- * a color — set the seed directly and the dials are bypassed:
420
- * --ty-primary-seed: #76467c;
421
- * --ty-danger-seed: crimson;
422
- *
423
- * The seed's LIGHTNESS is discarded by design: a color's identity
424
- * here is hue + chroma; where each shade sits per mode is the
425
- * L-curve's job. That is what makes dark mode, tones and contrast
426
- * correct for ANY seed — light or dark. (Your exact pixel may
427
- * appear nowhere; pin --ty-solid-X etc. if you need it literally.)
428
- * --------------------------------------------------------------*/
429
- /* BG TRACK — `--ty-bg-X` is the flavor's BASE ink at low alpha, real
430
- * transparency, composited by the browser over whatever is actually
431
- * underneath. Why this beats computing a tint lightness:
432
- *
433
- * - The ink is MID-SCALE (L 0.38–0.88), where the gamut is widest
434
- * and `l-stop × l-factor` behaves — no near-white/near-black
435
- * endpoint math, no chroma clipping, no hue drift.
436
- * - Direction per mode is free: the same token darkens a light
437
- * surface and lightens a dark one, on ANY surface level (content,
438
- * elevated, floating), not just a nominal one.
439
- * - l-factor points rather than shoves: it moves the ink a little,
440
- * and only alpha × that movement reaches the tint.
441
- *
442
- * The wash amount is the --ty-a-bg-* dials (Tier 2 area). */
443
- --ty-primary-seed-resolved: var(
444
- --ty-primary-seed,
445
- oklch(0.5 var(--ty-primary-chroma) var(--ty-primary-hue))
446
- );
447
- --ty-success-seed-resolved: var(
448
- --ty-success-seed,
449
- oklch(0.5 var(--ty-success-chroma) var(--ty-success-hue))
450
- );
451
- --ty-warning-seed-resolved: var(
452
- --ty-warning-seed,
453
- oklch(0.5 var(--ty-warning-chroma) var(--ty-warning-hue))
454
- );
455
- --ty-danger-seed-resolved: var(
456
- --ty-danger-seed,
457
- oklch(0.5 var(--ty-danger-chroma) var(--ty-danger-hue))
458
- );
459
- --ty-neutral-seed-resolved: var(
460
- --ty-neutral-seed,
461
- oklch(0.5 var(--ty-neutral-chroma) var(--ty-neutral-hue))
462
- );
463
-
464
- /* Primary */
465
- --ty-color-primary-strong: oklch(
466
- from var(--ty-primary-seed-resolved)
467
- calc(var(--ty-l-strong) * var(--ty-primary-l-factor))
468
- calc(c * var(--ty-c-strong-mult)) h
469
- );
470
- --ty-color-primary-bold: oklch(
471
- from var(--ty-primary-seed-resolved)
472
- calc(var(--ty-l-bold) * var(--ty-primary-l-factor))
473
- calc(c * var(--ty-c-bold-mult)) h
474
- );
475
- --ty-color-primary: oklch(
476
- from var(--ty-primary-seed-resolved)
477
- calc(var(--ty-l-base) * var(--ty-primary-l-factor))
478
- calc(c * var(--ty-c-base-mult)) h
479
- );
480
- --ty-color-primary-soft: oklch(
481
- from var(--ty-primary-seed-resolved)
482
- calc(var(--ty-l-soft) * var(--ty-primary-l-factor))
483
- calc(c * var(--ty-c-soft-mult)) h
484
- );
485
- --ty-color-primary-faint: oklch(
486
- from var(--ty-primary-seed-resolved)
487
- calc(var(--ty-l-faint) * var(--ty-primary-l-factor))
488
- calc(c * var(--ty-c-faint-mult)) h
489
- );
490
- --ty-bg-primary: oklch(
491
- from var(--ty-color-primary) l c h / var(--ty-a-bg-base)
492
- );
493
- --ty-bg-primary-bold: oklch(
494
- from var(--ty-color-primary) l c h / var(--ty-a-bg-bold)
495
- );
496
- --ty-bg-primary-soft: oklch(
497
- from var(--ty-color-primary) l c h / var(--ty-a-bg-soft)
498
- );
499
- --ty-border-primary: var(--ty-color-primary-soft);
500
-
501
- /* Success */
502
- --ty-color-success-strong: oklch(
503
- from var(--ty-success-seed-resolved)
504
- calc(var(--ty-l-strong) * var(--ty-success-l-factor))
505
- calc(c * var(--ty-c-strong-mult)) h
506
- );
507
- --ty-color-success-bold: oklch(
508
- from var(--ty-success-seed-resolved)
509
- calc(var(--ty-l-bold) * var(--ty-success-l-factor))
510
- calc(c * var(--ty-c-bold-mult)) h
511
- );
512
- --ty-color-success: oklch(
513
- from var(--ty-success-seed-resolved)
514
- calc(var(--ty-l-base) * var(--ty-success-l-factor))
515
- calc(c * var(--ty-c-base-mult)) h
516
- );
517
- --ty-color-success-soft: oklch(
518
- from var(--ty-success-seed-resolved)
519
- calc(var(--ty-l-soft) * var(--ty-success-l-factor))
520
- calc(c * var(--ty-c-soft-mult)) h
521
- );
522
- --ty-color-success-faint: oklch(
523
- from var(--ty-success-seed-resolved)
524
- calc(var(--ty-l-faint) * var(--ty-success-l-factor))
525
- calc(c * var(--ty-c-faint-mult)) h
526
- );
527
- --ty-bg-success: oklch(
528
- from var(--ty-color-success) l c h / var(--ty-a-bg-base)
529
- );
530
- --ty-bg-success-bold: oklch(
531
- from var(--ty-color-success) l c h / var(--ty-a-bg-bold)
532
- );
533
- --ty-bg-success-soft: oklch(
534
- from var(--ty-color-success) l c h / var(--ty-a-bg-soft)
535
- );
536
- --ty-border-success: var(--ty-color-success-soft);
537
-
538
- /* Danger */
539
- --ty-color-danger-strong: oklch(
540
- from var(--ty-danger-seed-resolved)
541
- calc(var(--ty-l-strong) * var(--ty-danger-l-factor))
542
- calc(c * var(--ty-c-strong-mult)) h
543
- );
544
- --ty-color-danger-bold: oklch(
545
- from var(--ty-danger-seed-resolved)
546
- calc(var(--ty-l-bold) * var(--ty-danger-l-factor))
547
- calc(c * var(--ty-c-bold-mult)) h
548
- );
549
- --ty-color-danger: oklch(
550
- from var(--ty-danger-seed-resolved)
551
- calc(var(--ty-l-base) * var(--ty-danger-l-factor))
552
- calc(c * var(--ty-c-base-mult)) h
553
- );
554
- --ty-color-danger-soft: oklch(
555
- from var(--ty-danger-seed-resolved)
556
- calc(var(--ty-l-soft) * var(--ty-danger-l-factor))
557
- calc(c * var(--ty-c-soft-mult)) h
558
- );
559
- --ty-color-danger-faint: oklch(
560
- from var(--ty-danger-seed-resolved)
561
- calc(var(--ty-l-faint) * var(--ty-danger-l-factor))
562
- calc(c * var(--ty-c-faint-mult)) h
563
- );
564
- --ty-bg-danger: oklch(
565
- from var(--ty-color-danger) l c h / var(--ty-a-bg-base)
566
- );
567
- --ty-bg-danger-bold: oklch(
568
- from var(--ty-color-danger) l c h / var(--ty-a-bg-bold)
569
- );
570
- --ty-bg-danger-soft: oklch(
571
- from var(--ty-color-danger) l c h / var(--ty-a-bg-soft)
572
- );
573
- --ty-border-danger: var(--ty-color-danger-soft);
574
-
575
- /* Warning */
576
- --ty-color-warning-strong: oklch(
577
- from var(--ty-warning-seed-resolved)
578
- calc(var(--ty-l-strong) * var(--ty-warning-l-factor))
579
- calc(c * var(--ty-c-strong-mult)) h
580
- );
581
- --ty-color-warning-bold: oklch(
582
- from var(--ty-warning-seed-resolved)
583
- calc(var(--ty-l-bold) * var(--ty-warning-l-factor))
584
- calc(c * var(--ty-c-bold-mult)) h
585
- );
586
- --ty-color-warning: oklch(
587
- from var(--ty-warning-seed-resolved)
588
- calc(var(--ty-l-base) * var(--ty-warning-l-factor))
589
- calc(c * var(--ty-c-base-mult)) h
590
- );
591
- --ty-color-warning-soft: oklch(
592
- from var(--ty-warning-seed-resolved)
593
- calc(var(--ty-l-soft) * var(--ty-warning-l-factor))
594
- calc(c * var(--ty-c-soft-mult)) h
595
- );
596
- --ty-color-warning-faint: oklch(
597
- from var(--ty-warning-seed-resolved)
598
- calc(var(--ty-l-faint) * var(--ty-warning-l-factor))
599
- calc(c * var(--ty-c-faint-mult)) h
600
- );
601
- --ty-bg-warning: oklch(
602
- from var(--ty-color-warning) l c h / var(--ty-a-bg-base)
603
- );
604
- --ty-bg-warning-bold: oklch(
605
- from var(--ty-color-warning) l c h / var(--ty-a-bg-bold)
606
- );
607
- --ty-bg-warning-soft: oklch(
608
- from var(--ty-color-warning) l c h / var(--ty-a-bg-soft)
609
- );
610
- --ty-border-warning: var(--ty-color-warning-soft);
611
-
612
- /* Neutral — same L curve, near-zero chroma so the grey scale stays grey. */
613
- --ty-color-neutral-strong: oklch(
614
- from var(--ty-neutral-seed-resolved)
615
- calc(var(--ty-l-strong) * var(--ty-neutral-l-factor))
616
- calc(c * var(--ty-c-strong-mult)) h
617
- );
618
- --ty-color-neutral-bold: oklch(
619
- from var(--ty-neutral-seed-resolved)
620
- calc(var(--ty-l-bold) * var(--ty-neutral-l-factor))
621
- calc(c * var(--ty-c-bold-mult)) h
622
- );
623
- --ty-color-neutral: oklch(
624
- from var(--ty-neutral-seed-resolved)
625
- calc(var(--ty-l-base) * var(--ty-neutral-l-factor))
626
- calc(c * var(--ty-c-base-mult)) h
627
- );
628
- --ty-color-neutral-soft: oklch(
629
- from var(--ty-neutral-seed-resolved)
630
- calc(var(--ty-l-soft) * var(--ty-neutral-l-factor))
631
- calc(c * var(--ty-c-soft-mult)) h
632
- );
633
- --ty-color-neutral-faint: oklch(
634
- from var(--ty-neutral-seed-resolved)
635
- calc(var(--ty-l-faint) * var(--ty-neutral-l-factor))
636
- calc(c * var(--ty-c-faint-mult)) h
637
- );
638
- --ty-bg-neutral: oklch(
639
- from var(--ty-color-neutral) l c h / var(--ty-a-bg-base)
640
- );
641
- --ty-bg-neutral-bold: oklch(
642
- from var(--ty-color-neutral) l c h / var(--ty-a-bg-bold)
643
- );
644
- --ty-bg-neutral-soft: oklch(
645
- from var(--ty-color-neutral) l c h / var(--ty-a-bg-soft)
646
- );
647
- --ty-bg-neutral-strong: oklch(
648
- from var(--ty-neutral-seed-resolved) var(--ty-l-bg-neutral-strong)
649
- calc(c * 2) h
650
- );
651
- --ty-bg-neutral-faint: oklch(
652
- from var(--ty-neutral-seed-resolved) var(--ty-l-bg-neutral-faint)
653
- calc(c * var(--ty-c-bg-neutral-faint-mult)) h
654
- );
655
-
656
- /* ----------------------------------------------------------------
657
- * Global neutral borders — own family, own L ladder (Tier 2).
658
- * Tinted by the neutral seeds like everything grey, but NOT tied to
659
- * the text emphasis curve or --ty-neutral-l-factor. Per-flavor
660
- * accent borders (--ty-border-{flavor}) stay ink aliases — a colored
661
- * border SHOULD track its flavor's ink.
662
- * --------------------------------------------------------------*/
663
- --ty-border-strong: oklch(
664
- from var(--ty-neutral-seed-resolved) var(--ty-l-border-strong) c h
665
- );
666
- --ty-border: oklch(
667
- from var(--ty-neutral-seed-resolved) var(--ty-l-border) c h
668
- );
669
- --ty-border-bold: oklch(
670
- from var(--ty-neutral-seed-resolved) var(--ty-l-border-bold) c h
671
- );
672
- --ty-border-soft: oklch(
673
- from var(--ty-neutral-seed-resolved) var(--ty-l-border-soft) c h
674
- );
675
- --ty-border-faint: oklch(
676
- from var(--ty-neutral-seed-resolved) var(--ty-l-border-faint) c h
677
- );
678
-
679
- /* ----------------------------------------------------------------
680
- * Text ladder + surface borders — engine-wired versions of tokens
681
- * tyrell.css hardcodes as hexes. Own L dials (Tier 2), neutral
682
- * hue/chroma tint. These out-rank the base hexes the same way every
683
- * other token here does; a rebrand now reaches body text too.
684
- * --------------------------------------------------------------*/
685
- --ty-text-strong: oklch(
686
- from var(--ty-neutral-seed-resolved) var(--ty-l-text-strong) c h
687
- );
688
- --ty-text-bold: oklch(
689
- from var(--ty-neutral-seed-resolved) var(--ty-l-text-bold) c h
690
- );
691
- --ty-text: oklch(
692
- from var(--ty-neutral-seed-resolved) var(--ty-l-text-base) c h
693
- );
694
- --ty-text-soft: oklch(
695
- from var(--ty-neutral-seed-resolved) var(--ty-l-text-soft) c h
696
- );
697
- --ty-text-faint: oklch(
698
- from var(--ty-neutral-seed-resolved) var(--ty-l-text-faint) c h
699
- );
700
-
701
- --ty-content-border: oklch(
702
- from var(--ty-neutral-seed-resolved) var(--ty-l-border-content) c h
703
- );
704
- --ty-elevated-border: oklch(
705
- from var(--ty-neutral-seed-resolved) var(--ty-l-border-elevated) c h
706
- );
707
- --ty-floating-border: oklch(
708
- from var(--ty-neutral-seed-resolved) var(--ty-l-border-floating) c h
709
- );
710
-
711
- /* ----------------------------------------------------------------
712
- * Surfaces — monochrome by default; --ty-surface-chroma warms them.
713
- * --------------------------------------------------------------*/
714
- --ty-surface-canvas: oklch(
715
- from var(--ty-primary-seed-resolved) var(--ty-l-surface-canvas)
716
- var(--ty-surface-chroma) h
717
- );
718
- --ty-surface-content: oklch(
719
- from var(--ty-primary-seed-resolved) var(--ty-l-surface-content)
720
- var(--ty-surface-chroma) h
721
- );
722
- --ty-surface-elevated: oklch(
723
- from var(--ty-primary-seed-resolved) var(--ty-l-surface-elevated)
724
- var(--ty-surface-chroma) h
725
- );
726
- --ty-surface-floating: oklch(
727
- from var(--ty-primary-seed-resolved) var(--ty-l-surface-floating)
728
- var(--ty-surface-chroma) h
729
- );
730
- --ty-surface-input: oklch(
731
- from var(--ty-primary-seed-resolved) var(--ty-l-surface-input)
732
- var(--ty-surface-chroma) h
733
- );
734
-
735
- /* ----------------------------------------------------------------
736
- * Inputs — tied to neutral ramp so form controls retint with primary.
737
- * --------------------------------------------------------------*/
738
- --ty-input-bg: var(--ty-surface-input);
739
- --ty-input-color: var(--ty-color-neutral-strong);
740
- --ty-input-border: var(--ty-color-neutral-faint);
741
- --ty-input-border-hover: var(--ty-color-neutral-soft);
742
- --ty-input-border-focus: var(--ty-color-primary);
743
- --ty-input-placeholder: var(--ty-color-neutral-soft);
744
- --ty-input-disabled-bg: var(--ty-color-neutral-faint);
745
- --ty-input-disabled-border: var(--ty-color-neutral-faint);
746
- --ty-input-disabled-color: var(--ty-color-neutral-bold);
747
- --ty-input-shadow-focus: color-mix(
748
- in oklab,
749
- var(--ty-color-primary) var(--ty-focus-ring-alpha),
750
- transparent
751
- );
752
- }
753
-
754
- /* ----------------------------------------------------------------
755
- * Tier 5 — SOLID (implementation)
756
- * Solid is its OWN system, NOT the text/emphasis ramp. The dials
757
- * (--ty-solid-hover-l / -active-l / -strong-l / -soft-l and
758
- * --ty-solid-l / -c / -h) live in SECTION 1, Tier 5. Below is the
759
- * derivation only: base fill bakes in the per-theme adjust (Axis B);
760
- * hover/active/strong/soft offset the base by Axis A. Override any
761
- * single --ty-solid-{flavor}-{state} to recolor just that segment.
762
- *
763
- * Declared at `html:root` (specificity 0,1,1) — NOT plain `:root` (0,1,0) —
764
- * on purpose: it must out-rank tyrell.css's hardcoded dark solids at
765
- * `html.dark` (0,1,1). It wins light by specificity over base's `html{}`,
766
- * and wins dark by source order over base's `html.dark` (theme layer loads after).
767
- * That's what lets dark solids re-tint with --ty-primary-hue. Declared ONCE —
768
- * the oklch(from var(--ty-color-*)) formulas resolve per-mode automatically,
769
- * so no dark duplicate is needed.
770
- * --------------------------------------------------------------*/
771
- html:root,
772
- [data-ty-theme] {
773
- /* base fill per flavor (= flavor color, theme-adjusted by Axis B) */
774
- --ty-solid-primary: oklch(
775
- from var(--ty-color-primary)
776
- calc(l + var(--ty-solid-l) + var(--ty-primary-solid-l, 0))
777
- calc(c * var(--ty-solid-c)) calc(h + var(--ty-solid-h))
778
- );
779
- --ty-solid-success: oklch(
780
- from var(--ty-color-success)
781
- calc(l + var(--ty-solid-l) + var(--ty-success-solid-l, 0))
782
- calc(c * var(--ty-solid-c)) calc(h + var(--ty-solid-h))
783
- );
784
- --ty-solid-danger: oklch(
785
- from var(--ty-color-danger)
786
- calc(l + var(--ty-solid-l) + var(--ty-danger-solid-l, 0))
787
- calc(c * var(--ty-solid-c)) calc(h + var(--ty-solid-h))
788
- );
789
- --ty-solid-warning: oklch(
790
- from var(--ty-color-warning)
791
- calc(l + var(--ty-solid-l) + var(--ty-warning-solid-l, 0))
792
- calc(c * var(--ty-solid-c)) calc(h + var(--ty-solid-h))
793
- );
794
- /* neutral is a deliberate dark grey fill, not the neutral text color */
795
- --ty-solid-neutral: oklch(
796
- from var(--ty-neutral-seed-resolved) var(--ty-l-solid-neutral)
797
- calc(c * var(--ty-c-strong-mult)) h
798
- );
799
-
800
- /* ----------------------------------------------------------------
801
- * SOLID FOREGROUNDS — auto-contrast.
802
- *
803
- * Each fill gets a foreground picked from its OWN lightness, so a
804
- * rebrand (--ty-primary-hue / --ty-primary-chroma / any L-curve override)
805
- * can't strand white text on a pale fill. Branchless, no JS:
806
- *
807
- * clamp(0, (threshold - l) * 1000, 1) -> 1 (white) when the fill
808
- * is darker than the threshold, 0 (black) when it's lighter.
809
- *
810
- * One token per FILL, not per flavor — base / -soft (tone-) / -strong
811
- * (tone+) each carry a different L, so each needs its own decision.
812
- * Declared once: the oklch(from ...) formulas re-resolve per mode,
813
- * because html.dark redefines the fills these read.
814
- *
815
- * TO REVERT to the old fixed-white behaviour, override in your app:
816
- * :root { --ty-solid-primary-fg: white; ... }
817
- * or set --ty-solid-fg-threshold: 1 to force white everywhere.
818
- * --------------------------------------------------------------*/
819
-
820
- /* Crossover point. Fills lighter than this get black text; higher =
821
- prefers white, lower = prefers black.
822
-
823
- Measured in-browser at stock dials, not guessed: the L at which black
824
- and white give EQUAL WCAG contrast is 0.553 (success) / 0.564 (neutral)
825
- / 0.569 (warning) / 0.570 (primary) / 0.578 (danger) — a 0.025 spread,
826
- so one global dial can serve every hue. Sweeping all 30 fills (15 ×
827
- light/dark), the window where every fill gets the better of black/white
828
- is (0.544, 0.588]; 0.57 sits ~mid-window. It previously read 0.62 —
829
- above every flavor's break-even — which put white on `warning+` in both
830
- modes: 4.23:1 light, 3.95:1 dark, each below AA and each the worse of
831
- the two choices. Locked by test/solid-contrast.test.ts. */
832
- --ty-solid-fg-threshold: 0.75;
833
-
834
- --ty-solid-primary-fg: oklch(
835
- from var(--ty-solid-primary)
836
- clamp(0, (var(--ty-solid-fg-threshold) - l) * 1000, 1) 0 0
837
- );
838
- --ty-solid-primary-soft-fg: oklch(
839
- from var(--ty-solid-primary-soft)
840
- clamp(0, (var(--ty-solid-fg-threshold) - l) * 1000, 1) 0 0
841
- );
842
- --ty-solid-primary-strong-fg: oklch(
843
- from var(--ty-solid-primary-strong)
844
- clamp(0, (var(--ty-solid-fg-threshold) - l) * 1000, 1) 0 0
845
- );
846
-
847
- --ty-solid-success-fg: oklch(
848
- from var(--ty-solid-success)
849
- clamp(0, (var(--ty-solid-fg-threshold) - l) * 1000, 1) 0 0
850
- );
851
- --ty-solid-success-soft-fg: oklch(
852
- from var(--ty-solid-success-soft)
853
- clamp(0, (var(--ty-solid-fg-threshold) - l) * 1000, 1) 0 0
854
- );
855
- --ty-solid-success-strong-fg: oklch(
856
- from var(--ty-solid-success-strong)
857
- clamp(0, (var(--ty-solid-fg-threshold) - l) * 1000, 1) 0 0
858
- );
859
-
860
- --ty-solid-danger-fg: oklch(
861
- from var(--ty-solid-danger)
862
- clamp(0, (var(--ty-solid-fg-threshold) - l) * 1000, 1) 0 0
863
- );
864
- --ty-solid-danger-soft-fg: oklch(
865
- from var(--ty-solid-danger-soft)
866
- clamp(0, (var(--ty-solid-fg-threshold) - l) * 1000, 1) 0 0
867
- );
868
- --ty-solid-danger-strong-fg: oklch(
869
- from var(--ty-solid-danger-strong)
870
- clamp(0, (var(--ty-solid-fg-threshold) - l) * 1000, 1) 0 0
871
- );
872
-
873
- --ty-solid-warning-fg: oklch(
874
- from var(--ty-solid-warning)
875
- clamp(0, (var(--ty-solid-fg-threshold) - l) * 1000, 1) 0 0
876
- );
877
- --ty-solid-warning-soft-fg: oklch(
878
- from var(--ty-solid-warning-soft)
879
- clamp(0, (var(--ty-solid-fg-threshold) - l) * 1000, 1) 0 0
880
- );
881
- --ty-solid-warning-strong-fg: oklch(
882
- from var(--ty-solid-warning-strong)
883
- clamp(0, (var(--ty-solid-fg-threshold) - l) * 1000, 1) 0 0
884
- );
885
-
886
- --ty-solid-neutral-fg: oklch(
887
- from var(--ty-solid-neutral)
888
- clamp(0, (var(--ty-solid-fg-threshold) - l) * 1000, 1) 0 0
889
- );
890
- --ty-solid-neutral-soft-fg: oklch(
891
- from var(--ty-solid-neutral-soft)
892
- clamp(0, (var(--ty-solid-fg-threshold) - l) * 1000, 1) 0 0
893
- );
894
- --ty-solid-neutral-strong-fg: oklch(
895
- from var(--ty-solid-neutral-strong)
896
- clamp(0, (var(--ty-solid-fg-threshold) - l) * 1000, 1) 0 0
897
- );
898
-
899
- /* derived states — axis 2 offsets on each base fill */
900
- --ty-solid-primary-hover: oklch(
901
- from var(--ty-solid-primary) calc(l + var(--ty-solid-hover-l)) c h
902
- );
903
- --ty-solid-primary-active: oklch(
904
- from var(--ty-solid-primary) calc(l + var(--ty-solid-active-l)) c h
905
- );
906
- --ty-solid-primary-strong: oklch(
907
- from var(--ty-solid-primary) calc(l + var(--ty-solid-strong-l)) c h
908
- );
909
- --ty-solid-primary-soft: oklch(
910
- from var(--ty-solid-primary) calc(l + var(--ty-solid-soft-l)) c h
911
- );
912
-
913
- --ty-solid-success-hover: oklch(
914
- from var(--ty-solid-success) calc(l + var(--ty-solid-hover-l)) c h
915
- );
916
- --ty-solid-success-active: oklch(
917
- from var(--ty-solid-success) calc(l + var(--ty-solid-active-l)) c h
918
- );
919
- --ty-solid-success-strong: oklch(
920
- from var(--ty-solid-success) calc(l + var(--ty-solid-strong-l)) c h
921
- );
922
- --ty-solid-success-soft: oklch(
923
- from var(--ty-solid-success) calc(l + var(--ty-solid-soft-l)) c h
924
- );
925
-
926
- --ty-solid-danger-hover: oklch(
927
- from var(--ty-solid-danger) calc(l + var(--ty-solid-hover-l)) c h
928
- );
929
- --ty-solid-danger-active: oklch(
930
- from var(--ty-solid-danger) calc(l + var(--ty-solid-active-l)) c h
931
- );
932
- --ty-solid-danger-strong: oklch(
933
- from var(--ty-solid-danger) calc(l + var(--ty-solid-strong-l)) c h
934
- );
935
- --ty-solid-danger-soft: oklch(
936
- from var(--ty-solid-danger) calc(l + var(--ty-solid-soft-l)) c h
937
- );
938
-
939
- --ty-solid-warning-hover: oklch(
940
- from var(--ty-solid-warning) calc(l + var(--ty-solid-hover-l)) c h
941
- );
942
- --ty-solid-warning-active: oklch(
943
- from var(--ty-solid-warning) calc(l + var(--ty-solid-active-l)) c h
944
- );
945
- --ty-solid-warning-strong: oklch(
946
- from var(--ty-solid-warning) calc(l + var(--ty-solid-strong-l)) c h
947
- );
948
- --ty-solid-warning-soft: oklch(
949
- from var(--ty-solid-warning) calc(l + var(--ty-solid-soft-l)) c h
950
- );
951
-
952
- --ty-solid-neutral-hover: oklch(
953
- from var(--ty-solid-neutral) calc(l + var(--ty-solid-hover-l)) c h
954
- );
955
- --ty-solid-neutral-active: oklch(
956
- from var(--ty-solid-neutral) calc(l + var(--ty-solid-active-l)) c h
957
- );
958
- /* neutral+ reads its own absolute L dial, not anchor + shared offset —
959
- it's the full-contrast ink endpoint (see --ty-l-solid-neutral-strong). */
960
- --ty-solid-neutral-strong: oklch(
961
- from var(--ty-neutral-seed-resolved) var(--ty-l-solid-neutral-strong)
962
- calc(c * var(--ty-c-strong-mult)) h
963
- );
964
- --ty-solid-neutral-soft: oklch(
965
- from var(--ty-solid-neutral) calc(l + var(--ty-solid-soft-l)) c h
966
- );
967
- }
968
-
969
- /* =====================================================================
970
- * SECTION 3 — THEME TRANSITIONS
971
- * =====================================================================
972
- *
973
- * Every dial above is a plain number (or percentage) — and every color
974
- * in the system is a pure function of those dials. Registering the
975
- * dials as typed custom properties makes them INTERPOLABLE, so a theme
976
- * or mode switch (html.dark, html.love, a [data-ty-theme] pack) does
977
- * not snap: the dials animate, and every derived color — buttons,
978
- * borders, surfaces, text, focus rings — crossfades through OKLCH
979
- * space frame by frame. No JS, no repaint tricks; it falls out of the
980
- * dials-not-colors architecture.
981
- *
982
- * Opt out (or retune) per app:
983
- * :root { --ty-theme-transition: 0s; } no animation
984
- * :root { --ty-theme-transition: 1.2s; } slower crossfade
985
- * Reduced-motion users never get the animation.
986
- *
987
- * Browsers without @property simply skip registration — themes still
988
- * work, switches just snap (the pre-TC37 behavior).
989
- * ===================================================================== */
990
-
991
- @property --ty-primary-hue {
992
- syntax: "<number>";
993
- inherits: true;
994
- initial-value: 252;
995
- }
996
- @property --ty-primary-chroma {
997
- syntax: "<number>";
998
- inherits: true;
999
- initial-value: 0.08;
1000
- }
1001
- @property --ty-surface-chroma {
1002
- syntax: "<number>";
1003
- inherits: true;
1004
- initial-value: 0;
1005
- }
1006
- @property --ty-success-hue {
1007
- syntax: "<number>";
1008
- inherits: true;
1009
- initial-value: 145;
1010
- }
1011
- @property --ty-success-chroma {
1012
- syntax: "<number>";
1013
- inherits: true;
1014
- initial-value: 0.135;
1015
- }
1016
- @property --ty-warning-hue {
1017
- syntax: "<number>";
1018
- inherits: true;
1019
- initial-value: 75;
1020
- }
1021
- @property --ty-warning-chroma {
1022
- syntax: "<number>";
1023
- inherits: true;
1024
- initial-value: 0.25;
1025
- }
1026
- @property --ty-danger-hue {
1027
- syntax: "<number>";
1028
- inherits: true;
1029
- initial-value: 25;
1030
- }
1031
- @property --ty-danger-chroma {
1032
- syntax: "<number>";
1033
- inherits: true;
1034
- initial-value: 0.164;
1035
- }
1036
- @property --ty-neutral-hue {
1037
- syntax: "<number>";
1038
- inherits: true;
1039
- initial-value: 0;
1040
- }
1041
- @property --ty-neutral-chroma {
1042
- syntax: "<number>";
1043
- inherits: true;
1044
- initial-value: 0;
1045
- }
1046
- @property --ty-l-strong {
1047
- syntax: "<number>";
1048
- inherits: true;
1049
- initial-value: 0.38;
1050
- }
1051
- @property --ty-l-bold {
1052
- syntax: "<number>";
1053
- inherits: true;
1054
- initial-value: 0.46;
1055
- }
1056
- @property --ty-l-base {
1057
- syntax: "<number>";
1058
- inherits: true;
1059
- initial-value: 0.54;
1060
- }
1061
- @property --ty-l-soft {
1062
- syntax: "<number>";
1063
- inherits: true;
1064
- initial-value: 0.72;
1065
- }
1066
- @property --ty-l-faint {
1067
- syntax: "<number>";
1068
- inherits: true;
1069
- initial-value: 0.88;
1070
- }
1071
- @property --ty-a-bg-base {
1072
- syntax: "<percentage>";
1073
- inherits: true;
1074
- initial-value: 9%;
1075
- }
1076
- @property --ty-a-bg-bold {
1077
- syntax: "<percentage>";
1078
- inherits: true;
1079
- initial-value: 17%;
1080
- }
1081
- @property --ty-a-bg-soft {
1082
- syntax: "<percentage>";
1083
- inherits: true;
1084
- initial-value: 4%;
1085
- }
1086
- @property --ty-l-text-strong {
1087
- syntax: "<number>";
1088
- inherits: true;
1089
- initial-value: 0;
1090
- }
1091
- @property --ty-l-text-bold {
1092
- syntax: "<number>";
1093
- inherits: true;
1094
- initial-value: 0;
1095
- }
1096
- @property --ty-l-text-base {
1097
- syntax: "<number>";
1098
- inherits: true;
1099
- initial-value: 0.21;
1100
- }
1101
- @property --ty-l-text-soft {
1102
- syntax: "<number>";
1103
- inherits: true;
1104
- initial-value: 0.37;
1105
- }
1106
- @property --ty-l-text-faint {
1107
- syntax: "<number>";
1108
- inherits: true;
1109
- initial-value: 0.71;
1110
- }
1111
- @property --ty-l-border-content {
1112
- syntax: "<number>";
1113
- inherits: true;
1114
- initial-value: 0.93;
1115
- }
1116
- @property --ty-l-border-elevated {
1117
- syntax: "<number>";
1118
- inherits: true;
1119
- initial-value: 0.93;
1120
- }
1121
- @property --ty-l-border-floating {
1122
- syntax: "<number>";
1123
- inherits: true;
1124
- initial-value: 0.93;
1125
- }
1126
- @property --ty-l-border-strong {
1127
- syntax: "<number>";
1128
- inherits: true;
1129
- initial-value: 0.46;
1130
- }
1131
- @property --ty-l-border-bold {
1132
- syntax: "<number>";
1133
- inherits: true;
1134
- initial-value: 0.64;
1135
- }
1136
- @property --ty-l-border {
1137
- syntax: "<number>";
1138
- inherits: true;
1139
- initial-value: 0.76;
1140
- }
1141
- @property --ty-l-border-soft {
1142
- syntax: "<number>";
1143
- inherits: true;
1144
- initial-value: 0.88;
1145
- }
1146
- @property --ty-l-border-faint {
1147
- syntax: "<number>";
1148
- inherits: true;
1149
- initial-value: 0.92;
1150
- }
1151
- @property --ty-l-surface-canvas {
1152
- syntax: "<number>";
1153
- inherits: true;
1154
- initial-value: 0.985;
1155
- }
1156
- @property --ty-l-surface-content {
1157
- syntax: "<number>";
1158
- inherits: true;
1159
- initial-value: 1;
1160
- }
1161
- @property --ty-l-surface-elevated {
1162
- syntax: "<number>";
1163
- inherits: true;
1164
- initial-value: 1;
1165
- }
1166
- @property --ty-l-surface-floating {
1167
- syntax: "<number>";
1168
- inherits: true;
1169
- initial-value: 1;
1170
- }
1171
- @property --ty-l-surface-input {
1172
- syntax: "<number>";
1173
- inherits: true;
1174
- initial-value: 1;
1175
- }
1176
- @property --ty-l-solid-neutral {
1177
- syntax: "<number>";
1178
- inherits: true;
1179
- initial-value: 0.4;
1180
- }
1181
- @property --ty-l-solid-neutral-strong {
1182
- syntax: "<number>";
1183
- inherits: true;
1184
- initial-value: 0.15;
1185
- }
1186
- @property --ty-l-bg-neutral-strong {
1187
- syntax: "<number>";
1188
- inherits: true;
1189
- initial-value: 0.25;
1190
- }
1191
- @property --ty-l-bg-neutral-faint {
1192
- syntax: "<number>";
1193
- inherits: true;
1194
- initial-value: 0.99;
1195
- }
1196
- @property --ty-c-bg-neutral-faint-mult {
1197
- syntax: "<number>";
1198
- inherits: true;
1199
- initial-value: 0.4;
1200
- }
1201
- @property --ty-c-strong-mult {
1202
- syntax: "<number>";
1203
- inherits: true;
1204
- initial-value: 0.77;
1205
- }
1206
- @property --ty-c-bold-mult {
1207
- syntax: "<number>";
1208
- inherits: true;
1209
- initial-value: 1;
1210
- }
1211
- @property --ty-c-base-mult {
1212
- syntax: "<number>";
1213
- inherits: true;
1214
- initial-value: 0.92;
1215
- }
1216
- @property --ty-c-soft-mult {
1217
- syntax: "<number>";
1218
- inherits: true;
1219
- initial-value: 0.77;
1220
- }
1221
- @property --ty-c-faint-mult {
1222
- syntax: "<number>";
1223
- inherits: true;
1224
- initial-value: 0.46;
1225
- }
1226
- @property --ty-primary-l-factor {
1227
- syntax: "<number>";
1228
- inherits: true;
1229
- initial-value: 1;
1230
- }
1231
- @property --ty-success-l-factor {
1232
- syntax: "<number>";
1233
- inherits: true;
1234
- initial-value: 1;
1235
- }
1236
- @property --ty-warning-l-factor {
1237
- syntax: "<number>";
1238
- inherits: true;
1239
- initial-value: 1.15;
1240
- }
1241
- @property --ty-danger-l-factor {
1242
- syntax: "<number>";
1243
- inherits: true;
1244
- initial-value: 1;
1245
- }
1246
- @property --ty-neutral-l-factor {
1247
- syntax: "<number>";
1248
- inherits: true;
1249
- initial-value: 1;
1250
- }
1251
- /* Typography + button-depth dials (defined in tyrell.css, mode-flipped
1252
- there). Registered here so they interpolate on theme switch: with a
1253
- variable font, text weight crossfades along with the colors, and the
1254
- solid-button depth chrome (border offset) glides rather than snaps. */
1255
- @property --ty-weight-action {
1256
- syntax: "<number>";
1257
- inherits: true;
1258
- initial-value: 510;
1259
- }
1260
- @property --ty-weight-label {
1261
- syntax: "<number>";
1262
- inherits: true;
1263
- initial-value: 440;
1264
- }
1265
- @property --ty-button-depth {
1266
- syntax: "<number>";
1267
- inherits: true;
1268
- initial-value: 0.35;
1269
- }
1270
- @property --ty-button-border-l {
1271
- syntax: "<number>";
1272
- inherits: true;
1273
- initial-value: -0.08;
1274
- }
1275
- @property --ty-button-border-l-neutral {
1276
- syntax: "<number>";
1277
- inherits: true;
1278
- initial-value: -0.25;
1279
- }
1280
- @property --ty-primary-solid-l {
1281
- syntax: "<number>";
1282
- inherits: true;
1283
- initial-value: 0;
1284
- }
1285
- @property --ty-success-solid-l {
1286
- syntax: "<number>";
1287
- inherits: true;
1288
- initial-value: 0;
1289
- }
1290
- @property --ty-warning-solid-l {
1291
- syntax: "<number>";
1292
- inherits: true;
1293
- initial-value: 0.1;
1294
- }
1295
- @property --ty-danger-solid-l {
1296
- syntax: "<number>";
1297
- inherits: true;
1298
- initial-value: 0;
1299
- }
1300
- @property --ty-solid-hover-l {
1301
- syntax: "<number>";
1302
- inherits: true;
1303
- initial-value: -0.04;
1304
- }
1305
- @property --ty-solid-active-l {
1306
- syntax: "<number>";
1307
- inherits: true;
1308
- initial-value: -0.08;
1309
- }
1310
- @property --ty-solid-strong-l {
1311
- syntax: "<number>";
1312
- inherits: true;
1313
- initial-value: -0.06;
1314
- }
1315
- @property --ty-solid-soft-l {
1316
- syntax: "<number>";
1317
- inherits: true;
1318
- initial-value: 0.1;
1319
- }
1320
- @property --ty-solid-l {
1321
- syntax: "<number>";
1322
- inherits: true;
1323
- initial-value: 0;
1324
- }
1325
- @property --ty-solid-c {
1326
- syntax: "<number>";
1327
- inherits: true;
1328
- initial-value: 1;
1329
- }
1330
- @property --ty-solid-h {
1331
- syntax: "<number>";
1332
- inherits: true;
1333
- initial-value: 0;
1334
- }
1335
- @property --ty-solid-fg-threshold {
1336
- syntax: "<number>";
1337
- inherits: true;
1338
- initial-value: 0.75;
1339
- }
1340
- @property --ty-focus-ring-alpha {
1341
- syntax: "<percentage>";
1342
- inherits: true;
1343
- initial-value: 5%;
1344
- }
1345
-
1346
- @property --ty-primary-seed-resolved {
1347
- syntax: "<color>";
1348
- inherits: true;
1349
- initial-value: #808080;
1350
- }
1351
- @property --ty-success-seed-resolved {
1352
- syntax: "<color>";
1353
- inherits: true;
1354
- initial-value: #808080;
1355
- }
1356
- @property --ty-warning-seed-resolved {
1357
- syntax: "<color>";
1358
- inherits: true;
1359
- initial-value: #808080;
1360
- }
1361
- @property --ty-danger-seed-resolved {
1362
- syntax: "<color>";
1363
- inherits: true;
1364
- initial-value: #808080;
1365
- }
1366
- @property --ty-neutral-seed-resolved {
1367
- syntax: "<color>";
1368
- inherits: true;
1369
- initial-value: #808080;
1370
- }
1371
-
1372
- @media (prefers-reduced-motion: no-preference) {
1373
- html,
1374
- [data-ty-theme] {
1375
- transition-property:
1376
- --ty-primary-hue, --ty-primary-chroma, --ty-surface-chroma,
1377
- --ty-success-hue, --ty-success-chroma, --ty-warning-hue,
1378
- --ty-warning-chroma, --ty-danger-hue, --ty-danger-chroma,
1379
- --ty-neutral-hue, --ty-neutral-chroma, --ty-l-strong, --ty-l-bold,
1380
- --ty-l-base, --ty-l-soft, --ty-l-faint, --ty-a-bg-base, --ty-a-bg-bold,
1381
- --ty-a-bg-soft, --ty-l-text-strong, --ty-l-text-bold, --ty-l-text-base,
1382
- --ty-l-text-soft, --ty-l-text-faint, --ty-l-border-content,
1383
- --ty-l-border-elevated, --ty-l-border-floating, --ty-l-border-strong,
1384
- --ty-l-border-bold, --ty-l-border, --ty-l-border-soft,
1385
- --ty-l-border-faint, --ty-l-surface-canvas, --ty-l-surface-content,
1386
- --ty-l-surface-elevated, --ty-l-surface-floating, --ty-l-surface-input,
1387
- --ty-l-solid-neutral, --ty-l-solid-neutral-strong,
1388
- --ty-l-bg-neutral-strong, --ty-l-bg-neutral-faint,
1389
- --ty-c-bg-neutral-faint-mult, --ty-c-strong-mult, --ty-c-bold-mult,
1390
- --ty-c-base-mult, --ty-c-soft-mult, --ty-c-faint-mult,
1391
- --ty-primary-l-factor, --ty-success-l-factor, --ty-warning-l-factor,
1392
- --ty-danger-l-factor, --ty-neutral-l-factor, --ty-primary-solid-l,
1393
- --ty-success-solid-l, --ty-warning-solid-l, --ty-danger-solid-l,
1394
- --ty-solid-hover-l, --ty-solid-active-l, --ty-solid-strong-l,
1395
- --ty-solid-soft-l, --ty-solid-l, --ty-solid-c, --ty-solid-h,
1396
- --ty-solid-fg-threshold, --ty-focus-ring-alpha, --ty-weight-action,
1397
- --ty-weight-label, --ty-button-depth, --ty-button-border-l,
1398
- --ty-button-border-l-neutral;
1399
- transition-duration: var(--ty-theme-transition, 0.45s);
1400
- transition-timing-function: ease;
1401
- }
1402
- }
1403
-
1404
- /* Interactive components (button, input, switch, tabs, …) each carry their
1405
- * OWN short transition — background-color/border-color/color at 0.15–0.2s —
1406
- * for snappy hover/focus/active feedback. CSS transitions fire on ANY
1407
- * computed-value change, not just interaction, so a theme switch also
1408
- * (re-)triggers every one of those, racing the coordinated 0.45s dial
1409
- * crossfade above at a different speed on every element — hundreds of
1410
- * mistimed transitions instead of one wash, which reads as jittery rather
1411
- * than smooth.
1412
- *
1413
- * `.ty-theme-switching` is an opt-in escape hatch: add it to `<html>` (or
1414
- * a scoped `[data-ty-theme]` root) for the duration of a theme switch to
1415
- * silence local transitions on its descendants — NOT on the switching
1416
- * element itself, so the dial crossfade above is untouched. Five lines of
1417
- * JS around your theme toggle:
1418
- *
1419
- * root.classList.add('ty-theme-switching');
1420
- * root.classList.toggle('dark'); // or flip the theme pack
1421
- * setTimeout(() => root.classList.remove('ty-theme-switching'),
1422
- * parseFloat(getComputedStyle(root)
1423
- * .getPropertyValue('--ty-theme-transition')) * 1000 || 450);
1424
- *
1425
- * Two mechanisms, because Shadow DOM blocks the first from reaching the
1426
- * second: the `*` rule below only matches LIGHT-DOM elements (your own
1427
- * markup, Tailwind-transitioned nav items, etc.) — it cannot reach inside
1428
- * any ty-* component's shadow root, style encapsulation blocks a document
1429
- * stylesheet's universal selector from crossing that boundary. Every ty-*
1430
- * component's OWN local transition is instead wired to the inheriting
1431
- * custom property `--ty-local-transition` (unset by default; components
1432
- * fall back to their normal value) — custom properties DO inherit through
1433
- * shadow boundaries, so setting it once here reaches every component's
1434
- * internal styles for free. Purely additive — nothing here runs unless you
1435
- * add the class yourself. */
1436
- .ty-theme-switching {
1437
- --ty-local-transition: none;
1438
- }
1439
- .ty-theme-switching *,
1440
- .ty-theme-switching *::before,
1441
- .ty-theme-switching *::after {
1442
- transition: none !important;
1443
- }
1
+ :root{--ty-primary-hue: 252;--ty-primary-chroma: .08;--ty-surface-chroma: 0;--ty-success-hue: 145;--ty-success-chroma: .086;--ty-warning-hue: 76;--ty-warning-chroma: .178;--ty-danger-hue: 31;--ty-danger-chroma: .134;--ty-neutral-hue: 0;--ty-neutral-chroma: 0;--ty-l-strong: .38;--ty-l-bold: .46;--ty-l-base: .54;--ty-l-soft: .72;--ty-l-faint: .88;--ty-a-bg-base: 9%;--ty-a-bg-bold: 17%;--ty-a-bg-soft: 4%;--ty-l-text-strong: 0;--ty-l-text-bold: 0;--ty-l-text-base: .21;--ty-l-text-soft: .37;--ty-l-text-faint: .71;--ty-l-border-content: .93;--ty-l-border-elevated: .93;--ty-l-border-floating: .93;--ty-l-border-strong: .46;--ty-l-border-bold: .64;--ty-l-border: .76;--ty-l-border-soft: .88;--ty-l-border-faint: .92;--ty-l-surface-canvas: .985;--ty-l-surface-content: 1;--ty-l-surface-elevated: 1;--ty-l-surface-floating: 1;--ty-l-surface-input: 1;--ty-l-solid-neutral: .4;--ty-l-solid-neutral-strong: .15;--ty-l-bg-neutral-strong: .25;--ty-l-bg-neutral-faint: .99;--ty-c-bg-neutral-faint-mult: .4;--ty-focus-ring-alpha: 5%;--ty-c-strong-mult: .77;--ty-c-bold-mult: 1;--ty-c-base-mult: .92;--ty-c-soft-mult: .77;--ty-c-faint-mult: .46;--ty-primary-l-factor: .96;--ty-success-l-factor: 1;--ty-warning-l-factor: 1.3;--ty-danger-l-factor: .93;--ty-neutral-l-factor: 1;--ty-solid-hover-l: -.04;--ty-solid-active-l: -.08;--ty-solid-strong-l: -.06;--ty-solid-soft-l: .1;--ty-solid-l: 0;--ty-solid-c: 1;--ty-solid-h: 0;--ty-primary-solid-l: 0;--ty-success-solid-l: 0;--ty-warning-solid-l: 0;--ty-danger-solid-l: 0}html.dark,html[data-theme=dark],[data-ty-theme].dark,[data-ty-theme][data-theme=dark]{--ty-primary-l-factor: 1;--ty-solid-fg-threshold: .5 !important;--ty-primary-hue: 226;--ty-primary-chroma: .065;--ty-success-hue: 129;--ty-success-chroma: .092;--ty-success-l-factor: 1.09;--ty-danger-hue: 13;--ty-danger-chroma: .101;--ty-danger-l-factor: 1.06;--ty-warning-hue: 82;--ty-warning-chroma: .195;--ty-warning-l-factor: 1.5;--ty-l-strong: .72;--ty-l-bold: .66;--ty-l-base: .62;--ty-l-soft: .46;--ty-l-faint: .3;--ty-a-bg-base: 13%;--ty-a-bg-bold: 22%;--ty-a-bg-soft: 7%;--ty-l-text-strong: 1;--ty-l-text-bold: .985;--ty-l-text-base: .88;--ty-l-text-soft: .62;--ty-l-text-faint: .47;--ty-l-border-content: .13;--ty-l-border-elevated: .375;--ty-l-border-floating: .41;--ty-l-border-strong: .66;--ty-l-border-bold: .46;--ty-l-border: .38;--ty-l-border-soft: .3;--ty-l-border-faint: .3;--ty-l-surface-canvas: .12;--ty-l-surface-content: .16;--ty-l-surface-elevated: .19;--ty-l-surface-floating: .22;--ty-l-surface-input: .18;--ty-l-solid-neutral: .18;--ty-l-solid-neutral-strong: .88;--ty-l-bg-neutral-strong: .95;--ty-l-bg-neutral-faint: .15;--ty-c-bg-neutral-faint-mult: 2;--ty-neutral-l-factor: .8;--ty-focus-ring-alpha: 20%;--ty-c-strong-mult: .77;--ty-c-bold-mult: 1;--ty-c-base-mult: .92;--ty-c-soft-mult: .77;--ty-c-faint-mult: .5;--ty-solid-hover-l: .07;--ty-solid-active-l: .11;--ty-solid-strong-l: .06;--ty-solid-soft-l: -.1;--ty-solid-l: -.2;--ty-solid-c: .7;--ty-solid-h: 0;--ty-warning-solid-l: 0}html:root,[data-ty-theme]{--ty-primary-seed-resolved: var( --ty-primary-seed, oklch(.5 var(--ty-primary-chroma) var(--ty-primary-hue)) );--ty-success-seed-resolved: var( --ty-success-seed, oklch(.5 var(--ty-success-chroma) var(--ty-success-hue)) );--ty-warning-seed-resolved: var( --ty-warning-seed, oklch(.5 var(--ty-warning-chroma) var(--ty-warning-hue)) );--ty-danger-seed-resolved: var( --ty-danger-seed, oklch(.5 var(--ty-danger-chroma) var(--ty-danger-hue)) );--ty-neutral-seed-resolved: var( --ty-neutral-seed, oklch(.5 var(--ty-neutral-chroma) var(--ty-neutral-hue)) );--ty-color-primary-strong: oklch( from var(--ty-primary-seed-resolved) calc(var(--ty-l-strong) * var(--ty-primary-l-factor)) calc(c * var(--ty-c-strong-mult)) h );--ty-color-primary-bold: oklch( from var(--ty-primary-seed-resolved) calc(var(--ty-l-bold) * var(--ty-primary-l-factor)) calc(c * var(--ty-c-bold-mult)) h );--ty-color-primary: oklch( from var(--ty-primary-seed-resolved) calc(var(--ty-l-base) * var(--ty-primary-l-factor)) calc(c * var(--ty-c-base-mult)) h );--ty-color-primary-soft: oklch( from var(--ty-primary-seed-resolved) calc(var(--ty-l-soft) * var(--ty-primary-l-factor)) calc(c * var(--ty-c-soft-mult)) h );--ty-color-primary-faint: oklch( from var(--ty-primary-seed-resolved) calc(var(--ty-l-faint) * var(--ty-primary-l-factor)) calc(c * var(--ty-c-faint-mult)) h );--ty-bg-primary: oklch( from var(--ty-color-primary) l c h / var(--ty-a-bg-base) );--ty-bg-primary-bold: oklch( from var(--ty-color-primary) l c h / var(--ty-a-bg-bold) );--ty-bg-primary-soft: oklch( from var(--ty-color-primary) l c h / var(--ty-a-bg-soft) );--ty-border-primary: var(--ty-color-primary-soft);--ty-color-success-strong: oklch( from var(--ty-success-seed-resolved) calc(var(--ty-l-strong) * var(--ty-success-l-factor)) calc(c * var(--ty-c-strong-mult)) h );--ty-color-success-bold: oklch( from var(--ty-success-seed-resolved) calc(var(--ty-l-bold) * var(--ty-success-l-factor)) calc(c * var(--ty-c-bold-mult)) h );--ty-color-success: oklch( from var(--ty-success-seed-resolved) calc(var(--ty-l-base) * var(--ty-success-l-factor)) calc(c * var(--ty-c-base-mult)) h );--ty-color-success-soft: oklch( from var(--ty-success-seed-resolved) calc(var(--ty-l-soft) * var(--ty-success-l-factor)) calc(c * var(--ty-c-soft-mult)) h );--ty-color-success-faint: oklch( from var(--ty-success-seed-resolved) calc(var(--ty-l-faint) * var(--ty-success-l-factor)) calc(c * var(--ty-c-faint-mult)) h );--ty-bg-success: oklch( from var(--ty-color-success) l c h / var(--ty-a-bg-base) );--ty-bg-success-bold: oklch( from var(--ty-color-success) l c h / var(--ty-a-bg-bold) );--ty-bg-success-soft: oklch( from var(--ty-color-success) l c h / var(--ty-a-bg-soft) );--ty-border-success: var(--ty-color-success-soft);--ty-color-danger-strong: oklch( from var(--ty-danger-seed-resolved) calc(var(--ty-l-strong) * var(--ty-danger-l-factor)) calc(c * var(--ty-c-strong-mult)) h );--ty-color-danger-bold: oklch( from var(--ty-danger-seed-resolved) calc(var(--ty-l-bold) * var(--ty-danger-l-factor)) calc(c * var(--ty-c-bold-mult)) h );--ty-color-danger: oklch( from var(--ty-danger-seed-resolved) calc(var(--ty-l-base) * var(--ty-danger-l-factor)) calc(c * var(--ty-c-base-mult)) h );--ty-color-danger-soft: oklch( from var(--ty-danger-seed-resolved) calc(var(--ty-l-soft) * var(--ty-danger-l-factor)) calc(c * var(--ty-c-soft-mult)) h );--ty-color-danger-faint: oklch( from var(--ty-danger-seed-resolved) calc(var(--ty-l-faint) * var(--ty-danger-l-factor)) calc(c * var(--ty-c-faint-mult)) h );--ty-bg-danger: oklch( from var(--ty-color-danger) l c h / var(--ty-a-bg-base) );--ty-bg-danger-bold: oklch( from var(--ty-color-danger) l c h / var(--ty-a-bg-bold) );--ty-bg-danger-soft: oklch( from var(--ty-color-danger) l c h / var(--ty-a-bg-soft) );--ty-border-danger: var(--ty-color-danger-soft);--ty-color-warning-strong: oklch( from var(--ty-warning-seed-resolved) calc(var(--ty-l-strong) * var(--ty-warning-l-factor)) calc(c * var(--ty-c-strong-mult)) h );--ty-color-warning-bold: oklch( from var(--ty-warning-seed-resolved) calc(var(--ty-l-bold) * var(--ty-warning-l-factor)) calc(c * var(--ty-c-bold-mult)) h );--ty-color-warning: oklch( from var(--ty-warning-seed-resolved) calc(var(--ty-l-base) * var(--ty-warning-l-factor)) calc(c * var(--ty-c-base-mult)) h );--ty-color-warning-soft: oklch( from var(--ty-warning-seed-resolved) calc(var(--ty-l-soft) * var(--ty-warning-l-factor)) calc(c * var(--ty-c-soft-mult)) h );--ty-color-warning-faint: oklch( from var(--ty-warning-seed-resolved) calc(var(--ty-l-faint) * var(--ty-warning-l-factor)) calc(c * var(--ty-c-faint-mult)) h );--ty-bg-warning: oklch( from var(--ty-color-warning) l c h / var(--ty-a-bg-base) );--ty-bg-warning-bold: oklch( from var(--ty-color-warning) l c h / var(--ty-a-bg-bold) );--ty-bg-warning-soft: oklch( from var(--ty-color-warning) l c h / var(--ty-a-bg-soft) );--ty-border-warning: var(--ty-color-warning-soft);--ty-color-neutral-strong: oklch( from var(--ty-neutral-seed-resolved) calc(var(--ty-l-strong) * var(--ty-neutral-l-factor)) calc(c * var(--ty-c-strong-mult)) h );--ty-color-neutral-bold: oklch( from var(--ty-neutral-seed-resolved) calc(var(--ty-l-bold) * var(--ty-neutral-l-factor)) calc(c * var(--ty-c-bold-mult)) h );--ty-color-neutral: oklch( from var(--ty-neutral-seed-resolved) calc(var(--ty-l-base) * var(--ty-neutral-l-factor)) calc(c * var(--ty-c-base-mult)) h );--ty-color-neutral-soft: oklch( from var(--ty-neutral-seed-resolved) calc(var(--ty-l-soft) * var(--ty-neutral-l-factor)) calc(c * var(--ty-c-soft-mult)) h );--ty-color-neutral-faint: oklch( from var(--ty-neutral-seed-resolved) calc(var(--ty-l-faint) * var(--ty-neutral-l-factor)) calc(c * var(--ty-c-faint-mult)) h );--ty-bg-neutral: oklch( from var(--ty-color-neutral) l c h / var(--ty-a-bg-base) );--ty-bg-neutral-bold: oklch( from var(--ty-color-neutral) l c h / var(--ty-a-bg-bold) );--ty-bg-neutral-soft: oklch( from var(--ty-color-neutral) l c h / var(--ty-a-bg-soft) );--ty-bg-neutral-strong: oklch( from var(--ty-neutral-seed-resolved) var(--ty-l-bg-neutral-strong) calc(c*2) h );--ty-bg-neutral-faint: oklch( from var(--ty-neutral-seed-resolved) var(--ty-l-bg-neutral-faint) calc(c * var(--ty-c-bg-neutral-faint-mult)) h );--ty-border-strong: oklch( from var(--ty-neutral-seed-resolved) var(--ty-l-border-strong) c h );--ty-border: oklch( from var(--ty-neutral-seed-resolved) var(--ty-l-border) c h );--ty-border-bold: oklch( from var(--ty-neutral-seed-resolved) var(--ty-l-border-bold) c h );--ty-border-soft: oklch( from var(--ty-neutral-seed-resolved) var(--ty-l-border-soft) c h );--ty-border-faint: oklch( from var(--ty-neutral-seed-resolved) var(--ty-l-border-faint) c h );--ty-text-strong: oklch( from var(--ty-neutral-seed-resolved) var(--ty-l-text-strong) c h );--ty-text-bold: oklch( from var(--ty-neutral-seed-resolved) var(--ty-l-text-bold) c h );--ty-text: oklch( from var(--ty-neutral-seed-resolved) var(--ty-l-text-base) c h );--ty-text-soft: oklch( from var(--ty-neutral-seed-resolved) var(--ty-l-text-soft) c h );--ty-text-faint: oklch( from var(--ty-neutral-seed-resolved) var(--ty-l-text-faint) c h );--ty-content-border: oklch( from var(--ty-neutral-seed-resolved) var(--ty-l-border-content) c h );--ty-elevated-border: oklch( from var(--ty-neutral-seed-resolved) var(--ty-l-border-elevated) c h );--ty-floating-border: oklch( from var(--ty-neutral-seed-resolved) var(--ty-l-border-floating) c h );--ty-surface-canvas: oklch( from var(--ty-primary-seed-resolved) var(--ty-l-surface-canvas) var(--ty-surface-chroma) h );--ty-surface-content: oklch( from var(--ty-primary-seed-resolved) var(--ty-l-surface-content) var(--ty-surface-chroma) h );--ty-surface-elevated: oklch( from var(--ty-primary-seed-resolved) var(--ty-l-surface-elevated) var(--ty-surface-chroma) h );--ty-surface-floating: oklch( from var(--ty-primary-seed-resolved) var(--ty-l-surface-floating) var(--ty-surface-chroma) h );--ty-surface-input: oklch( from var(--ty-primary-seed-resolved) var(--ty-l-surface-input) var(--ty-surface-chroma) h );--ty-input-bg: var(--ty-surface-input);--ty-input-color: var(--ty-color-neutral-strong);--ty-input-border: var(--ty-border-soft);--ty-input-border-hover: var(--ty-border);--ty-input-border-focus: var(--ty-color-primary);--ty-input-placeholder: var(--ty-color-neutral-soft);--ty-input-disabled-bg: var(--ty-color-neutral-faint);--ty-input-disabled-border: var(--ty-color-neutral-faint);--ty-input-disabled-color: var(--ty-color-neutral-bold);--ty-input-shadow-focus: color-mix( in oklab, var(--ty-color-primary) var(--ty-focus-ring-alpha), transparent )}html.dark,html[data-theme=dark],[data-ty-theme].dark,[data-ty-theme][data-theme=dark]{--ty-input-border: var(--ty-border);--ty-input-border-hover: var(--ty-border-bold)}html:root,[data-ty-theme]{--ty-solid-primary: oklch( from var(--ty-color-primary) calc(l + var(--ty-solid-l) + var(--ty-primary-solid-l, 0)) calc(c * var(--ty-solid-c)) calc(h + var(--ty-solid-h)) );--ty-solid-success: oklch( from var(--ty-color-success) calc(l + var(--ty-solid-l) + var(--ty-success-solid-l, 0)) calc(c * var(--ty-solid-c)) calc(h + var(--ty-solid-h)) );--ty-solid-danger: oklch( from var(--ty-color-danger) calc(l + var(--ty-solid-l) + var(--ty-danger-solid-l, 0)) calc(c * var(--ty-solid-c)) calc(h + var(--ty-solid-h)) );--ty-solid-warning: oklch( from var(--ty-color-warning) calc(l + var(--ty-solid-l) + var(--ty-warning-solid-l, 0)) calc(c * var(--ty-solid-c)) calc(h + var(--ty-solid-h)) );--ty-solid-neutral: oklch( from var(--ty-neutral-seed-resolved) var(--ty-l-solid-neutral) calc(c * var(--ty-c-strong-mult)) h );--ty-solid-fg-threshold: .75;--ty-solid-primary-fg: oklch( from var(--ty-solid-primary) clamp(0, (var(--ty-solid-fg-threshold) - l) * 1000, 1) 0 0 );--ty-solid-primary-soft-fg: oklch( from var(--ty-solid-primary-soft) clamp(0, (var(--ty-solid-fg-threshold) - l) * 1000, 1) 0 0 );--ty-solid-primary-strong-fg: oklch( from var(--ty-solid-primary-strong) clamp(0, (var(--ty-solid-fg-threshold) - l) * 1000, 1) 0 0 );--ty-solid-success-fg: oklch( from var(--ty-solid-success) clamp(0, (var(--ty-solid-fg-threshold) - l) * 1000, 1) 0 0 );--ty-solid-success-soft-fg: oklch( from var(--ty-solid-success-soft) clamp(0, (var(--ty-solid-fg-threshold) - l) * 1000, 1) 0 0 );--ty-solid-success-strong-fg: oklch( from var(--ty-solid-success-strong) clamp(0, (var(--ty-solid-fg-threshold) - l) * 1000, 1) 0 0 );--ty-solid-danger-fg: oklch( from var(--ty-solid-danger) clamp(0, (var(--ty-solid-fg-threshold) - l) * 1000, 1) 0 0 );--ty-solid-danger-soft-fg: oklch( from var(--ty-solid-danger-soft) clamp(0, (var(--ty-solid-fg-threshold) - l) * 1000, 1) 0 0 );--ty-solid-danger-strong-fg: oklch( from var(--ty-solid-danger-strong) clamp(0, (var(--ty-solid-fg-threshold) - l) * 1000, 1) 0 0 );--ty-solid-warning-fg: oklch( from var(--ty-solid-warning) clamp(0, (var(--ty-solid-fg-threshold) - l) * 1000, 1) 0 0 );--ty-solid-warning-soft-fg: oklch( from var(--ty-solid-warning-soft) clamp(0, (var(--ty-solid-fg-threshold) - l) * 1000, 1) 0 0 );--ty-solid-warning-strong-fg: oklch( from var(--ty-solid-warning-strong) clamp(0, (var(--ty-solid-fg-threshold) - l) * 1000, 1) 0 0 );--ty-solid-neutral-fg: oklch( from var(--ty-solid-neutral) clamp(0, (var(--ty-solid-fg-threshold) - l) * 1000, 1) 0 0 );--ty-solid-neutral-soft-fg: oklch( from var(--ty-solid-neutral-soft) clamp(0, (var(--ty-solid-fg-threshold) - l) * 1000, 1) 0 0 );--ty-solid-neutral-strong-fg: oklch( from var(--ty-solid-neutral-strong) clamp(0, (var(--ty-solid-fg-threshold) - l) * 1000, 1) 0 0 );--ty-solid-primary-hover: oklch( from var(--ty-solid-primary) calc(l + var(--ty-solid-hover-l)) c h );--ty-solid-primary-active: oklch( from var(--ty-solid-primary) calc(l + var(--ty-solid-active-l)) c h );--ty-solid-primary-strong: oklch( from var(--ty-solid-primary) calc(l + var(--ty-solid-strong-l)) c h );--ty-solid-primary-soft: oklch( from var(--ty-solid-primary) calc(l + var(--ty-solid-soft-l)) c h );--ty-solid-success-hover: oklch( from var(--ty-solid-success) calc(l + var(--ty-solid-hover-l)) c h );--ty-solid-success-active: oklch( from var(--ty-solid-success) calc(l + var(--ty-solid-active-l)) c h );--ty-solid-success-strong: oklch( from var(--ty-solid-success) calc(l + var(--ty-solid-strong-l)) c h );--ty-solid-success-soft: oklch( from var(--ty-solid-success) calc(l + var(--ty-solid-soft-l)) c h );--ty-solid-danger-hover: oklch( from var(--ty-solid-danger) calc(l + var(--ty-solid-hover-l)) c h );--ty-solid-danger-active: oklch( from var(--ty-solid-danger) calc(l + var(--ty-solid-active-l)) c h );--ty-solid-danger-strong: oklch( from var(--ty-solid-danger) calc(l + var(--ty-solid-strong-l)) c h );--ty-solid-danger-soft: oklch( from var(--ty-solid-danger) calc(l + var(--ty-solid-soft-l)) c h );--ty-solid-warning-hover: oklch( from var(--ty-solid-warning) calc(l + var(--ty-solid-hover-l)) c h );--ty-solid-warning-active: oklch( from var(--ty-solid-warning) calc(l + var(--ty-solid-active-l)) c h );--ty-solid-warning-strong: oklch( from var(--ty-solid-warning) calc(l + var(--ty-solid-strong-l)) c h );--ty-solid-warning-soft: oklch( from var(--ty-solid-warning) calc(l + var(--ty-solid-soft-l)) c h );--ty-solid-neutral-hover: oklch( from var(--ty-solid-neutral) calc(l + var(--ty-solid-hover-l)) c h );--ty-solid-neutral-active: oklch( from var(--ty-solid-neutral) calc(l + var(--ty-solid-active-l)) c h );--ty-solid-neutral-strong: oklch( from var(--ty-neutral-seed-resolved) var(--ty-l-solid-neutral-strong) calc(c * var(--ty-c-strong-mult)) h );--ty-solid-neutral-soft: oklch( from var(--ty-solid-neutral) calc(l + var(--ty-solid-soft-l)) c h )}@property --ty-primary-hue{syntax: "<number>"; inherits: true; initial-value: 252;}@property --ty-primary-chroma{syntax: "<number>"; inherits: true; initial-value: .08;}@property --ty-surface-chroma{syntax: "<number>"; inherits: true; initial-value: 0;}@property --ty-success-hue{syntax: "<number>"; inherits: true; initial-value: 145;}@property --ty-success-chroma{syntax: "<number>"; inherits: true; initial-value: .135;}@property --ty-warning-hue{syntax: "<number>"; inherits: true; initial-value: 75;}@property --ty-warning-chroma{syntax: "<number>"; inherits: true; initial-value: .25;}@property --ty-danger-hue{syntax: "<number>"; inherits: true; initial-value: 25;}@property --ty-danger-chroma{syntax: "<number>"; inherits: true; initial-value: .164;}@property --ty-neutral-hue{syntax: "<number>"; inherits: true; initial-value: 0;}@property --ty-neutral-chroma{syntax: "<number>"; inherits: true; initial-value: 0;}@property --ty-l-strong{syntax: "<number>"; inherits: true; initial-value: .38;}@property --ty-l-bold{syntax: "<number>"; inherits: true; initial-value: .46;}@property --ty-l-base{syntax: "<number>"; inherits: true; initial-value: .54;}@property --ty-l-soft{syntax: "<number>"; inherits: true; initial-value: .72;}@property --ty-l-faint{syntax: "<number>"; inherits: true; initial-value: .88;}@property --ty-a-bg-base{syntax: "<percentage>"; inherits: true; initial-value: 9%;}@property --ty-a-bg-bold{syntax: "<percentage>"; inherits: true; initial-value: 17%;}@property --ty-a-bg-soft{syntax: "<percentage>"; inherits: true; initial-value: 4%;}@property --ty-l-text-strong{syntax: "<number>"; inherits: true; initial-value: 0;}@property --ty-l-text-bold{syntax: "<number>"; inherits: true; initial-value: 0;}@property --ty-l-text-base{syntax: "<number>"; inherits: true; initial-value: .21;}@property --ty-l-text-soft{syntax: "<number>"; inherits: true; initial-value: .37;}@property --ty-l-text-faint{syntax: "<number>"; inherits: true; initial-value: .71;}@property --ty-l-border-content{syntax: "<number>"; inherits: true; initial-value: .93;}@property --ty-l-border-elevated{syntax: "<number>"; inherits: true; initial-value: .93;}@property --ty-l-border-floating{syntax: "<number>"; inherits: true; initial-value: .93;}@property --ty-l-border-strong{syntax: "<number>"; inherits: true; initial-value: .46;}@property --ty-l-border-bold{syntax: "<number>"; inherits: true; initial-value: .64;}@property --ty-l-border{syntax: "<number>"; inherits: true; initial-value: .76;}@property --ty-l-border-soft{syntax: "<number>"; inherits: true; initial-value: .88;}@property --ty-l-border-faint{syntax: "<number>"; inherits: true; initial-value: .92;}@property --ty-l-surface-canvas{syntax: "<number>"; inherits: true; initial-value: .985;}@property --ty-l-surface-content{syntax: "<number>"; inherits: true; initial-value: 1;}@property --ty-l-surface-elevated{syntax: "<number>"; inherits: true; initial-value: 1;}@property --ty-l-surface-floating{syntax: "<number>"; inherits: true; initial-value: 1;}@property --ty-l-surface-input{syntax: "<number>"; inherits: true; initial-value: 1;}@property --ty-l-solid-neutral{syntax: "<number>"; inherits: true; initial-value: .4;}@property --ty-l-solid-neutral-strong{syntax: "<number>"; inherits: true; initial-value: .15;}@property --ty-l-bg-neutral-strong{syntax: "<number>"; inherits: true; initial-value: .25;}@property --ty-l-bg-neutral-faint{syntax: "<number>"; inherits: true; initial-value: .99;}@property --ty-c-bg-neutral-faint-mult{syntax: "<number>"; inherits: true; initial-value: .4;}@property --ty-c-strong-mult{syntax: "<number>"; inherits: true; initial-value: .77;}@property --ty-c-bold-mult{syntax: "<number>"; inherits: true; initial-value: 1;}@property --ty-c-base-mult{syntax: "<number>"; inherits: true; initial-value: .92;}@property --ty-c-soft-mult{syntax: "<number>"; inherits: true; initial-value: .77;}@property --ty-c-faint-mult{syntax: "<number>"; inherits: true; initial-value: .46;}@property --ty-primary-l-factor{syntax: "<number>"; inherits: true; initial-value: 1;}@property --ty-success-l-factor{syntax: "<number>"; inherits: true; initial-value: 1;}@property --ty-warning-l-factor{syntax: "<number>"; inherits: true; initial-value: 1.15;}@property --ty-danger-l-factor{syntax: "<number>"; inherits: true; initial-value: 1;}@property --ty-neutral-l-factor{syntax: "<number>"; inherits: true; initial-value: 1;}@property --ty-weight-action{syntax: "<number>"; inherits: true; initial-value: 510;}@property --ty-weight-label{syntax: "<number>"; inherits: true; initial-value: 440;}@property --ty-button-depth{syntax: "<number>"; inherits: true; initial-value: .35;}@property --ty-button-border-l{syntax: "<number>"; inherits: true; initial-value: -.08;}@property --ty-button-border-l-neutral{syntax: "<number>"; inherits: true; initial-value: -.25;}@property --ty-primary-solid-l{syntax: "<number>"; inherits: true; initial-value: 0;}@property --ty-success-solid-l{syntax: "<number>"; inherits: true; initial-value: 0;}@property --ty-warning-solid-l{syntax: "<number>"; inherits: true; initial-value: .1;}@property --ty-danger-solid-l{syntax: "<number>"; inherits: true; initial-value: 0;}@property --ty-solid-hover-l{syntax: "<number>"; inherits: true; initial-value: -.04;}@property --ty-solid-active-l{syntax: "<number>"; inherits: true; initial-value: -.08;}@property --ty-solid-strong-l{syntax: "<number>"; inherits: true; initial-value: -.06;}@property --ty-solid-soft-l{syntax: "<number>"; inherits: true; initial-value: .1;}@property --ty-solid-l{syntax: "<number>"; inherits: true; initial-value: 0;}@property --ty-solid-c{syntax: "<number>"; inherits: true; initial-value: 1;}@property --ty-solid-h{syntax: "<number>"; inherits: true; initial-value: 0;}@property --ty-solid-fg-threshold{syntax: "<number>"; inherits: true; initial-value: .75;}@property --ty-focus-ring-alpha{syntax: "<percentage>"; inherits: true; initial-value: 5%;}@property --ty-primary-seed-resolved{syntax: "<color>"; inherits: true; initial-value: #808080;}@property --ty-success-seed-resolved{syntax: "<color>"; inherits: true; initial-value: #808080;}@property --ty-warning-seed-resolved{syntax: "<color>"; inherits: true; initial-value: #808080;}@property --ty-danger-seed-resolved{syntax: "<color>"; inherits: true; initial-value: #808080;}@property --ty-neutral-seed-resolved{syntax: "<color>"; inherits: true; initial-value: #808080;}@media(prefers-reduced-motion:no-preference){html,[data-ty-theme]{transition-property:--ty-primary-hue,--ty-primary-chroma,--ty-surface-chroma,--ty-success-hue,--ty-success-chroma,--ty-warning-hue,--ty-warning-chroma,--ty-danger-hue,--ty-danger-chroma,--ty-neutral-hue,--ty-neutral-chroma,--ty-l-strong,--ty-l-bold,--ty-l-base,--ty-l-soft,--ty-l-faint,--ty-a-bg-base,--ty-a-bg-bold,--ty-a-bg-soft,--ty-l-text-strong,--ty-l-text-bold,--ty-l-text-base,--ty-l-text-soft,--ty-l-text-faint,--ty-l-border-content,--ty-l-border-elevated,--ty-l-border-floating,--ty-l-border-strong,--ty-l-border-bold,--ty-l-border,--ty-l-border-soft,--ty-l-border-faint,--ty-l-surface-canvas,--ty-l-surface-content,--ty-l-surface-elevated,--ty-l-surface-floating,--ty-l-surface-input,--ty-l-solid-neutral,--ty-l-solid-neutral-strong,--ty-l-bg-neutral-strong,--ty-l-bg-neutral-faint,--ty-c-bg-neutral-faint-mult,--ty-c-strong-mult,--ty-c-bold-mult,--ty-c-base-mult,--ty-c-soft-mult,--ty-c-faint-mult,--ty-primary-l-factor,--ty-success-l-factor,--ty-warning-l-factor,--ty-danger-l-factor,--ty-neutral-l-factor,--ty-primary-solid-l,--ty-success-solid-l,--ty-warning-solid-l,--ty-danger-solid-l,--ty-solid-hover-l,--ty-solid-active-l,--ty-solid-strong-l,--ty-solid-soft-l,--ty-solid-l,--ty-solid-c,--ty-solid-h,--ty-solid-fg-threshold,--ty-focus-ring-alpha,--ty-weight-action,--ty-weight-label,--ty-button-depth,--ty-button-border-l,--ty-button-border-l-neutral;transition-duration:var(--ty-theme-transition, .45s);transition-timing-function:ease}}.ty-theme-switching{--ty-local-transition: none}.ty-theme-switching *,.ty-theme-switching *:before,.ty-theme-switching *:after{transition:none!important}