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
package/dist/tyrell.css CHANGED
@@ -1,1390 +1 @@
1
- /* =================================================================
2
- Ty Component Library - Complete CSS System
3
- Industry-Standard Semantic Design System
4
-
5
- This file contains:
6
- - CSS Variables (Design Tokens)
7
- - Utility Classes
8
- - Theme Support (Light/Dark)
9
- - Surface System
10
- - 5-Variant Color System
11
- ================================================================= */
12
-
13
- /* =================================================================
14
- PRE-DEFINITION STYLES - PREVENT LAYOUT SHIFTS
15
- These styles apply BEFORE custom elements are registered via JavaScript.
16
- They reserve space to prevent FOUC (Flash of Unstyled Content) and layout shifts.
17
- ================================================================= */
18
-
19
- /* Icon component - reserve space before registration */
20
- ty-icon:not(:defined) {
21
- display: inline-block;
22
- aspect-ratio: 1 / 1;
23
- opacity: 0;
24
- transition: opacity 0.15s ease-in;
25
- }
26
-
27
- /* Default size (no attribute or size="md") */
28
- ty-icon:not(:defined),
29
- ty-icon:not(:defined)[size="md"] {
30
- width: 1em;
31
- height: 1em;
32
- }
33
-
34
- /* Em-based sizes */
35
- ty-icon:not(:defined)[size="xs"] {
36
- width: 0.75em;
37
- height: 0.75em;
38
- }
39
-
40
- ty-icon:not(:defined)[size="sm"] {
41
- width: 0.875em;
42
- height: 0.875em;
43
- }
44
-
45
- ty-icon:not(:defined)[size="lg"] {
46
- width: 1.25em;
47
- height: 1.25em;
48
- }
49
-
50
- ty-icon:not(:defined)[size="xl"] {
51
- width: 1.5em;
52
- height: 1.5em;
53
- }
54
-
55
- ty-icon:not(:defined)[size="2xl"] {
56
- width: 2em;
57
- height: 2em;
58
- }
59
-
60
- /* Pixel-based sizes */
61
- ty-icon:not(:defined)[size="12"] {
62
- width: 12px;
63
- height: 12px;
64
- }
65
-
66
- ty-icon:not(:defined)[size="14"] {
67
- width: 14px;
68
- height: 14px;
69
- }
70
-
71
- ty-icon:not(:defined)[size="16"] {
72
- width: 16px;
73
- height: 16px;
74
- }
75
-
76
- ty-icon:not(:defined)[size="18"] {
77
- width: 18px;
78
- height: 18px;
79
- }
80
-
81
- ty-icon:not(:defined)[size="20"] {
82
- width: 20px;
83
- height: 20px;
84
- }
85
-
86
- ty-icon:not(:defined)[size="24"] {
87
- width: 24px;
88
- height: 24px;
89
- }
90
-
91
- ty-icon:not(:defined)[size="32"] {
92
- width: 32px;
93
- height: 32px;
94
- }
95
-
96
- ty-icon:not(:defined)[size="48"] {
97
- width: 48px;
98
- height: 48px;
99
- }
100
-
101
- ty-icon:not(:defined)[size="64"] {
102
- width: 64px;
103
- height: 64px;
104
- }
105
-
106
- ty-icon:not(:defined)[size="80"] {
107
- width: 80px;
108
- height: 80px;
109
- }
110
-
111
- ty-icon:not(:defined)[size="96"] {
112
- width: 96px;
113
- height: 96px;
114
- }
115
-
116
- /* Once defined, fade in smoothly */
117
- ty-icon {
118
- opacity: 1;
119
- }
120
-
121
- /* =================================================================
122
- CSS VARIABLES - DESIGN TOKENS
123
- ================================================================= */
124
-
125
- /* Default theme (light) */
126
- html {
127
- /* Color tokens (--ty-color-*, --ty-bg-{flavor}-*, --ty-border-*,
128
- --ty-surface-*, --ty-text-*, --ty-input-{color}-*, --ty-solid-*) live
129
- in tyrell-colors-static.css or tyrell-theme.css — load one of those
130
- alongside this file. See CSS_GUIDE.md. */
131
-
132
- /* =================================================================
133
- BACKGROUND COLORS
134
- ================================================================= */
135
-
136
- --ty-bg-faint: #f8fafc;
137
- /* Very light canvas - for minimal backgrounds */
138
- --ty-bg-soft: #f1f5f9;
139
- /* Light canvas - app backgrounds */
140
- --ty-bg: #ffffff;
141
- /* WHITE - primary content baseline */
142
- --ty-bg-bold: #f8fafc;
143
- /* Subtle elevation - cards with light tint */
144
- --ty-bg-strong: #e2e8f0;
145
- /* Maximum elevation - clear distinction */
146
-
147
- /* Focus ring gap - matches page background for button focus ring effect */
148
- --ty-focus-ring-gap: #ffffff;
149
-
150
- /* =================================================================
151
- BORDER COLORS
152
- ================================================================= */
153
-
154
- /* Border width — used as fallback by surface utilities (--ty-{surface}-border-width) */
155
- --ty-border-width: 1px;
156
-
157
- /* =================================================================
158
- SCROLLBAR
159
- ================================================================= */
160
-
161
- --ty-scrollbar-thumb: rgba(0, 0, 0, 0.35);
162
- --ty-scrollbar-thumb-hover: rgba(0, 0, 0, 0.5);
163
- --ty-scrollbar-thumb-active: rgba(0, 0, 0, 0.6);
164
- --ty-scrollbar-track: transparent;
165
- --ty-scrollbar-track-hover: rgba(0, 0, 0, 0.06);
166
-
167
- /* =================================================================
168
- SURFACE SYSTEM
169
- ================================================================= */
170
-
171
- /* Surface borders — opt-in. Set color to make a surface's border visible.
172
- Width and style fall back to --ty-border-width and `solid` if unset. */
173
- --ty-elevated-border-width: var(--ty-border-width);
174
- --ty-elevated-border-style: solid;
175
-
176
- --ty-floating-border-width: var(--ty-border-width);
177
- --ty-floating-border-style: solid;
178
-
179
- --ty-canvas-border: transparent;
180
- --ty-canvas-border-width: var(--ty-border-width);
181
- --ty-canvas-border-style: solid;
182
-
183
- --ty-content-border-width: var(--ty-border-width);
184
- --ty-content-border-style: solid;
185
-
186
- /* --ty-input-border is a color token (tyrell-colors-static.css /
187
- tyrell-theme.css) used by <ty-input> shadow DOM and .ty-input utility.
188
- Width/style live here. */
189
- --ty-input-border-width: var(--ty-border-width);
190
- --ty-input-border-style: solid;
191
-
192
- /* Divider context — consumed by .ty-divide-x / .ty-divide-y utilities.
193
- Each surface re-points --ty-divide-color to its own --ty-{surface}-border
194
- token, so the same knob controls both the surface's chrome AND any
195
- dividers inside it. Inherits down the tree via CSS variable inheritance. */
196
- --ty-divide-color: var(--ty-border);
197
- --ty-divide-width: var(--ty-border-width);
198
-
199
- /* =================================================================
200
- COMPONENT TOKENS
201
- ================================================================= */
202
-
203
- /* Modal tokens */
204
- --ty-modal-bg: #ffffff;
205
- --ty-modal-color: #111827;
206
- --ty-modal-border: #e5e7eb;
207
- --ty-modal-backdrop: rgba(0, 0, 0, 0.5);
208
- --ty-modal-backdrop-blur: blur(2px);
209
- --ty-modal-border-radius: 16px;
210
- --ty-modal-shadow:
211
- 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04);
212
- --ty-modal-duration: 200ms;
213
-
214
- /* Modal sizing */
215
- --ty-modal-sm-width: 300px;
216
- --ty-modal-md-width: 500px;
217
- --ty-modal-lg-width: 700px;
218
- --ty-modal-xl-width: 900px;
219
- --ty-modal-full-width: 95vw;
220
- --ty-modal-full-height: 95vh;
221
-
222
- /* Input component tokens */
223
- --ty-label-color: #374151;
224
-
225
- /* =================================================================
226
- DESIGN SYSTEM TOKENS
227
- ================================================================= */
228
-
229
- /* Spacing Scale */
230
- --ty-spacing-0: 0;
231
- --ty-spacing-px: 1px;
232
- --ty-spacing-mini: 0.125rem;
233
- --ty-spacing-1: 0.25rem;
234
- --ty-spacing-2: 0.5rem;
235
- --ty-spacing-3: 0.75rem;
236
- --ty-spacing-4: 1rem;
237
- --ty-spacing-5: 1.25rem;
238
- --ty-spacing-6: 1.5rem;
239
- --ty-spacing-7: 1.75rem;
240
- --ty-spacing-8: 2rem;
241
- --ty-spacing-9: 2.25rem;
242
- --ty-spacing-10: 2.5rem;
243
- --ty-spacing-12: 3rem;
244
- --ty-spacing-16: 4rem;
245
- --ty-spacing-20: 5rem;
246
- --ty-spacing-24: 6rem;
247
-
248
- /* Border Radius */
249
- --ty-radius-none: 0;
250
- --ty-radius-sm: 0.25rem; /* 4px */
251
- --ty-radius-base: 0.375rem; /* 6px */
252
- --ty-radius-md: 0.5rem; /* 8px (anchor) */
253
- --ty-radius-lg: 0.75rem; /* 12px */
254
- --ty-radius-xl: 1rem; /* 16px */
255
- --ty-radius-2xl: 1.5rem; /* 24px */
256
- --ty-radius-3xl: 2rem; /* 32px */
257
- --ty-radius-full: 9999px;
258
-
259
- /* Shadows */
260
- --ty-shadow-none: none;
261
- --ty-shadow-sm: 0 1px 2px 0 rgba(0, 0, 0, 0.05);
262
- --ty-shadow-base:
263
- 0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px -1px rgba(0, 0, 0, 0.1);
264
- --ty-shadow-md:
265
- 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -2px rgba(0, 0, 0, 0.1);
266
- --ty-shadow-lg:
267
- 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -4px rgba(0, 0, 0, 0.1);
268
- --ty-shadow-xl:
269
- 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 8px 10px -6px rgba(0, 0, 0, 0.1);
270
- --ty-shadow-2xl: 0 25px 50px -12px rgba(0, 0, 0, 0.25);
271
-
272
- /* Typography */
273
- --ty-font-sans:
274
- system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
275
- --ty-font-mono: ui-monospace, SFMono-Regular, "SF Mono", Consolas, monospace;
276
-
277
- --ty-font-xxs: 0.625rem;
278
- --ty-font-xs: 0.75rem;
279
- --ty-font-sm: 0.875rem;
280
- --ty-font-base: 1rem;
281
- --ty-font-lg: 1.125rem;
282
- --ty-font-xl: 1.25rem;
283
- --ty-font-2xl: 1.5rem;
284
- --ty-font-3xl: 1.875rem;
285
- --ty-font-4xl: 2.25rem;
286
- --ty-font-5xl: 3rem;
287
-
288
- /* Paired line-heights — values follow Linear's text-* tokens (text-small
289
- uses 21px not 20px; text-regular uses 1.6 ratio for breathable body text).
290
- Paired with --ty-font-* so that `font-size: var(--ty-font-sm)` should also
291
- use `line-height: var(--ty-leading-sm)`. */
292
- --ty-leading-xxs: 0.9375rem; /* 15px paired with 10px text (Linear text-tiny 1.5) */
293
- --ty-leading-xs: 1.05rem; /* ≈16.8px paired with 12px text (Linear text-micro 1.4) */
294
- --ty-leading-sm: 1.3125rem; /* 21px paired with 14px text (Linear text-small) */
295
- --ty-leading-base: 1.5rem; /* 24px paired with 16px text (Linear text-regular 1.6 ≈) */
296
- --ty-leading-lg: 1.6875rem; /* 27px paired with 18px text (Linear text-large) */
297
- --ty-leading-xl: 1.75rem; /* 28px paired with 20px text */
298
- --ty-leading-2xl: 2rem; /* 32px paired with 24px text */
299
- --ty-leading-3xl: 2.25rem; /* 36px paired with 30px text */
300
- --ty-leading-4xl: 2.5rem; /* 40px paired with 36px text */
301
- --ty-leading-5xl: 1; /* paired with 48px+ display text */
302
-
303
- /* Letter-spacing (tracking) tokens — pulled from Linear's per-size values.
304
- Linear uses slightly negative tracking on most text to tighten Inter. */
305
- --ty-tracking-xxs: -0.015em; /* paired with text-tiny */
306
- --ty-tracking-xs: 0; /* paired with text-micro */
307
- --ty-tracking-sm: -0.013em; /* paired with text-small */
308
- --ty-tracking-base: -0.011em; /* paired with text-regular */
309
- --ty-tracking-lg: 0; /* paired with text-large */
310
- --ty-tracking-tight: -0.022em; /* for titles (Linear title-4 and up) */
311
- --ty-tracking-title: -0.012em; /* for titles (Linear title-1..3) */
312
-
313
- /* Weights tuned to Linear (Inter Variable). With the system font stack
314
- these round to the nearest available (500/600/700); load Inter Variable
315
- for the exact rendering. */
316
- --ty-font-thin: 100;
317
- --ty-font-light: 300;
318
- --ty-font-normal: 400;
319
- --ty-font-medium: 510;
320
- --ty-font-semibold: 590;
321
- --ty-font-bold: 680;
322
- --ty-font-extrabold: 800;
323
-
324
- /* Semantic weight dials — MODE-FLIPPED (see the html.dark block).
325
- Light text on dark surfaces optically blooms (halation), so dark mode
326
- wants genuinely lighter weights than light mode; a single fixed weight
327
- can't be right in both. Components consume these instead of the raw
328
- scale above:
329
- --ty-weight-action buttons, interactive chrome
330
- --ty-weight-label tags, chips, badges
331
- Theme these like any other token — per :root, html.dark, a named theme
332
- pack, or one element. The theme layer registers them as typed numbers,
333
- so with a variable font, weight crossfades during theme transitions
334
- along with the colors. */
335
- --ty-weight-action: var(--ty-font-medium);
336
- --ty-weight-label: 440;
337
-
338
- /* Solid-button depth chrome (consumed in button.ts):
339
- --ty-button-depth master intensity 0–1. 0 = pixel-flat (the old
340
- look), 1 = full tactile gloss. Scales the
341
- derived border offset, top sheen and drop
342
- shadow together. Themable per mode / theme
343
- pack / element like any other dial.
344
- --ty-button-border-l L-offset of the fill-derived 1px border,
345
- mode-flipped below: dark mode needs a LIGHTER-
346
- than-fill hairline (solids wash out against
347
- dark surfaces without a lit edge), light mode
348
- a slightly darker one. */
349
- --ty-button-depth: 0.35;
350
- --ty-button-border-l: -0.08;
351
- /* Neutral (ink) gets its own, stronger edge: it has no hue separating it
352
- from the canvas, so the same offset that reads fine on colored fills
353
- nearly vanishes on it — especially in dark mode, where the ink fill
354
- sits close to the page. */
355
- --ty-button-border-l-neutral: -0.25;
356
-
357
- --ty-line-height-none: 1;
358
- --ty-line-height-tight: 1.25;
359
- --ty-line-height-snug: 1.375;
360
- --ty-line-height-normal: 1.5;
361
- --ty-line-height-relaxed: 1.625;
362
- --ty-line-height-loose: 2;
363
-
364
- /* Transitions. Each routes through --ty-local-transition first — unset by
365
- default (falls through to the real value below), but the theme engine's
366
- .ty-theme-switching sets it to `none` for the duration of a theme swap,
367
- so components using these tokens don't run their own hover/focus
368
- transition at the same time as the coordinated theme crossfade. See
369
- tyrell-theme.css SECTION 3 — THEME TRANSITIONS. */
370
- --ty-transition-none: none;
371
- --ty-transition-all: var(--ty-local-transition, all 150ms cubic-bezier(0.4, 0, 0.2, 1));
372
- --ty-transition-colors: var(--ty-local-transition,
373
- bg-color, border-color, color, fill,
374
- stroke 150ms cubic-bezier(0.4, 0, 0.2, 1));
375
- --ty-transition-shadow: var(--ty-local-transition, box-shadow 150ms cubic-bezier(0.4, 0, 0.2, 1));
376
- --ty-transition-transform: var(--ty-local-transition, transform 150ms cubic-bezier(0.4, 0, 0.2, 1));
377
-
378
- /* Component Sizes — single source of truth for FIELD heights.
379
- Fields (ty-input, ty-select, ty-date-picker) come in exactly three
380
- sizes and consume these via min-height: var(--ty-size-*), so the same
381
- `size` attribute is the same height on every field. Shared scale with
382
- ty-button's 4px ladder (see button.ts): field sm = button md (32px),
383
- field md = button lg (36px), field lg = button xl (40px) — a button
384
- and a field of the paired size sit flush, same height, in a row. */
385
- --ty-size-sm: 2rem;
386
- /* 32px */
387
- --ty-size-md: 2.25rem;
388
- /* 36px */
389
- --ty-size-lg: 2.5rem;
390
- /* 40px */
391
-
392
- /* Z-Index Scale */
393
- --ty-z-auto: auto;
394
- --ty-z-0: 0;
395
- --ty-z-10: 10;
396
- --ty-z-20: 20;
397
- --ty-z-30: 30;
398
- --ty-z-40: 40;
399
- --ty-z-50: 50;
400
- --ty-z-sticky: 1020;
401
- --ty-z-fixed: 1030;
402
- --ty-z-modal-backdrop: 1040;
403
- --ty-z-modal: 1050;
404
- --ty-z-popover: 1060;
405
- --ty-z-tooltip: 1070;
406
- --ty-z-dropdown: 1080;
407
-
408
- /* =================================================================
409
- SCROLL SHADOW SYSTEM
410
- Uses clip-path technique for smooth corner fade
411
- ================================================================= */
412
- --ty-scroll-shadow-top: radial-gradient(
413
- ellipse 100% 30% at center,
414
- rgba(0, 0, 0, 0.1),
415
- rgba(0, 0, 0, 0),
416
- transparent
417
- );
418
- --ty-scroll-shadow-bottom: radial-gradient(
419
- ellipse 100% 20% at center,
420
- rgba(0, 0, 0, 0.15),
421
- rgba(0, 0, 0, 0),
422
- transparent
423
- );
424
- --ty-scroll-shadow-transition: opacity 0.2s ease-out;
425
-
426
- /* =================================================================
427
- TOOLTIP (default/"dark" flavor)
428
- Deliberately theme-INDEPENDENT — defined once here, not redeclared in
429
- html.dark below. A tooltip's job is to pop against whatever it's sitting
430
- on, light page or dark; every major library (Material, Bootstrap, Ant,
431
- Shoelace) keeps its default tooltip a fixed dark chip regardless of page
432
- theme. Override on :root (or scope to a container) to retheme globally
433
- without touching flavor="light"/"info"/other components.
434
- Values are pure achromatic gray (R=G=B, no hue) — matches
435
- --ty-solid-neutral's "no tint" convention. Don't reuse a Tailwind
436
- slate/cool-gray hex here (e.g. #1f2937) — those carry a real blue
437
- undertone (blue channel > red/green) and read as a color flavor next to
438
- genuinely neutral buttons, which was exactly the bug being fixed.
439
- ================================================================= */
440
- --ty-tooltip-bg: #262626;
441
- --ty-tooltip-color: #f5f5f5;
442
- --ty-tooltip-border: #404040;
443
-
444
- /* =================================================================
445
- CALENDAR — "other month" day de-emphasis
446
- --ty-color-neutral-faint alone is only ~2.5:1 against white — already
447
- below the 4.5:1 WCAG AA text minimum before the (now-removed) opacity
448
- fade made it worse still. This is its own token, calibrated to actually
449
- pass, rather than reusing -faint here. Real bug, caught by adding
450
- axe-core coverage for the first time, not a design choice being revised.
451
- ================================================================= */
452
- --ty-calendar-other-month-color: #6b7280; /* 4.83:1 vs white */
453
- }
454
-
455
- /* =================================================================
456
- DARK THEME OVERRIDES
457
- ================================================================= */
458
-
459
- html.dark,
460
- html[data-theme="dark"] {
461
- /* Weight dials flip with the mode — light-on-dark text blooms, so dark
462
- mode runs genuinely lighter. See the :root definitions. */
463
- --ty-weight-action: var(--ty-font-normal);
464
- --ty-weight-label: var(--ty-font-normal);
465
-
466
- /* Colored solid buttons: no border in dark mode — border color equals
467
- the fill exactly, so it's geometrically present (depth 0 keeps
468
- geometry stable) but invisible. Neutral keeps its own separate,
469
- stronger dial (below) since its dark ink fill needs the lit edge to
470
- read as a shape at all against a near-black canvas; colored fills
471
- don't have that problem (their own hue/saturation already separates
472
- them from the page), so no border reads as cleaner. */
473
- --ty-button-border-l: 0;
474
- --ty-button-border-l-neutral: 0.5;
475
-
476
- /* Backgrounds for dark mode */
477
- --ty-bg-faint: #0f1419;
478
- --ty-bg-soft: #111827;
479
- --ty-bg: #1f2937;
480
- --ty-bg-bold: #374151;
481
- --ty-bg-strong: #6b7280;
482
-
483
- /* Focus ring gap */
484
- --ty-focus-ring-gap: #1f2937;
485
-
486
- /* Scrollbar - dark mode */
487
- --ty-scrollbar-thumb: rgba(255, 255, 255, 0.13);
488
- --ty-scrollbar-thumb-hover: rgba(255, 255, 255, 0.22);
489
- --ty-scrollbar-thumb-active: rgba(255, 255, 255, 0.3);
490
- --ty-scrollbar-track: transparent;
491
- --ty-scrollbar-track-hover: rgba(255, 255, 255, 0.04);
492
-
493
- /* Shadows need to be darker/more prominent in dark mode */
494
- --ty-shadow-sm: 0 1px 2px 0 rgba(0, 0, 0, 0.2);
495
- --ty-shadow-base:
496
- 0 1px 3px 0 rgba(0, 0, 0, 0.3), 0 1px 2px -1px rgba(0, 0, 0, 0.3);
497
- --ty-shadow-md:
498
- 0 4px 6px -1px rgba(0, 0, 0, 0.3), 0 2px 4px -2px rgba(0, 0, 0, 0.3);
499
- --ty-shadow-lg:
500
- 0 10px 15px -3px rgba(0, 0, 0, 0.3), 0 4px 6px -4px rgba(0, 0, 0, 0.3);
501
- --ty-shadow-xl:
502
- 0 20px 25px -5px rgba(0, 0, 0, 0.3), 0 8px 10px -6px rgba(0, 0, 0, 0.3);
503
- --ty-shadow-2xl: 0 25px 50px -12px rgba(0, 0, 0, 0.5);
504
-
505
- /* Input component tokens - dark mode */
506
- --ty-label-color: #d1d5db;
507
-
508
- /* Modal - dark mode */
509
- --ty-modal-bg: var(--ty-bg-bold);
510
- --ty-modal-color: var(--ty-color-neutral-bold);
511
- --ty-modal-border: var(--ty-border);
512
- --ty-modal-backdrop: rgba(0, 0, 0, 0.7);
513
- --ty-modal-shadow:
514
- 0 20px 25px -5px rgba(0, 0, 0, 0.4), 0 10px 10px -5px rgba(0, 0, 0, 0.2);
515
-
516
- /* Scroll shadows - lighter tint for dark mode */
517
- --ty-scroll-shadow-top: radial-gradient(
518
- ellipse 100% 30% at center,
519
- rgba(172, 172, 172, 0.2),
520
- rgba(0, 0, 0, 0),
521
- transparent
522
- );
523
- --ty-scroll-shadow-bottom: radial-gradient(
524
- ellipse 100% 20% at center,
525
- rgba(172, 172, 172, 0.3),
526
- rgba(0, 0, 0, 0),
527
- transparent
528
- );
529
-
530
- /* Calendar "other month" de-emphasis — see the :root definition for why
531
- this is its own token instead of --ty-color-neutral-faint. */
532
- --ty-calendar-other-month-color: #8a8a8a; /* 5.04:1 vs dark content bg (#1a1a1a) */
533
- }
534
-
535
- /* =================================================================
536
- TEXT SELECTION STYLING
537
- Global and semantic text selection colors
538
- ================================================================= */
539
-
540
- /* Global text selection - uses primary colors by default */
541
- ::selection {
542
- background-color: var(--ty-selection-bg, var(--ty-bg-primary-bold));
543
- color: var(--ty-selection-color, var(--ty-text-strong));
544
- }
545
-
546
- ::-moz-selection {
547
- background-color: var(--ty-selection-bg, var(--ty-color-primary));
548
- color: var(--ty-selection-color, var(--ty-text-strong));
549
- }
550
-
551
- /* Code block selection - special handling for better readability */
552
- pre ::selection,
553
- code ::selection,
554
- pre::-moz-selection,
555
- code::-moz-selection {
556
- background-color: var(--ty-color-warning-soft);
557
- color: var(--ty-color-neutral-strong);
558
- }
559
-
560
- html.dark pre ::selection,
561
- html.dark code ::selection,
562
- html.dark pre::-moz-selection,
563
- html.dark code::-moz-selection {
564
- background-color: var(--ty-color-warning);
565
- color: var(--ty-bg-strong);
566
- }
567
-
568
- /* Input and textarea selection - higher contrast */
569
- input::selection,
570
- textarea::selection,
571
- input::-moz-selection,
572
- textarea::-moz-selection {
573
- background-color: var(--ty-color-primary);
574
- color: white;
575
- }
576
-
577
- html.dark input::selection,
578
- html.dark textarea::selection,
579
- html.dark input::-moz-selection,
580
- html.dark textarea::-moz-selection {
581
- background-color: var(--ty-color-primary-soft);
582
- color: var(--ty-color-primary-strong);
583
- }
584
-
585
- /* Semantic selection utility classes */
586
- .ty-selection-primary ::selection,
587
- .ty-selection-primary::-moz-selection {
588
- background-color: var(--ty-color-primary-soft);
589
- color: var(--ty-color-primary-strong);
590
- }
591
-
592
-
593
- .ty-selection-success ::selection,
594
- .ty-selection-success::-moz-selection {
595
- background-color: var(--ty-color-success-soft);
596
- color: var(--ty-color-success-strong);
597
- }
598
-
599
- .ty-selection-warning ::selection,
600
- .ty-selection-warning::-moz-selection {
601
- background-color: var(--ty-color-warning-soft);
602
- color: var(--ty-color-warning-strong);
603
- }
604
-
605
- .ty-selection-danger ::selection,
606
- .ty-selection-danger::-moz-selection {
607
- background-color: var(--ty-color-danger-soft);
608
- color: var(--ty-color-danger-strong);
609
- }
610
-
611
- .ty-selection-neutral ::selection,
612
- .ty-selection-neutral::-moz-selection {
613
- background-color: var(--ty-color-neutral-soft);
614
- color: var(--ty-color-neutral-strong);
615
- }
616
-
617
- /* Dark mode semantic selections */
618
- html.dark .ty-selection-primary ::selection,
619
- html.dark .ty-selection-primary::-moz-selection {
620
- background-color: var(--ty-color-primary);
621
- color: white;
622
- }
623
-
624
-
625
- html.dark .ty-selection-success ::selection,
626
- html.dark .ty-selection-success::-moz-selection {
627
- background-color: var(--ty-color-success);
628
- color: white;
629
- }
630
-
631
- html.dark .ty-selection-warning ::selection,
632
- html.dark .ty-selection-warning::-moz-selection {
633
- background-color: var(--ty-color-warning);
634
- color: var(--ty-bg-strong);
635
- }
636
-
637
- html.dark .ty-selection-danger ::selection,
638
- html.dark .ty-selection-danger::-moz-selection {
639
- background-color: var(--ty-color-danger);
640
- color: white;
641
- }
642
-
643
- html.dark .ty-selection-neutral ::selection,
644
- html.dark .ty-selection-neutral::-moz-selection {
645
- background-color: var(--ty-color-neutral);
646
- color: white;
647
- }
648
-
649
- /* =================================================================
650
- UTILITY CLASSES
651
- ================================================================= */
652
-
653
- /* Sensible default for any border that doesn't set its own color —
654
- Tailwind's `border` / `border-t`, plain CSS `border: 1px solid`, etc.
655
- Scoped to `html` to win specificity over Tailwind's (0,0,0) preflight
656
- regardless of injection order. Class-based overrides (`border-red-500`,
657
- `ty-border-primary`, etc.) still win their cascade. Theme-aware:
658
- `--ty-border` switches in dark mode automatically. */
659
- html *,
660
- html ::before,
661
- html ::after {
662
- border-color: var(--ty-border);
663
- }
664
-
665
- /* =================================================================
666
- SURFACE UTILITIES
667
- ================================================================= */
668
-
669
- /* Elevated surfaces - cards, panels, components */
670
- .ty-elevated {
671
- box-sizing: border-box !important;
672
- background-color: var(--ty-surface-elevated) !important;
673
- border: var(--ty-elevated-border-width, var(--ty-border-width, 1px))
674
- var(--ty-elevated-border-style, solid)
675
- var(--ty-elevated-border, transparent) !important;
676
- box-shadow:
677
- 0 1px 3px 0 rgb(0 0 0 / 0.1),
678
- 0 1px 2px -1px rgb(0 0 0 / 0.1) !important;
679
- --ty-divide-color: var(--ty-elevated-border);
680
- }
681
-
682
- /* Floating surfaces - modals, dropdowns, tooltips */
683
- .ty-floating {
684
- box-sizing: border-box !important;
685
- background-color: var(--ty-surface-floating) !important;
686
- border: var(--ty-floating-border-width, var(--ty-border-width, 1px))
687
- var(--ty-floating-border-style, solid)
688
- var(--ty-floating-border, transparent) !important;
689
- box-shadow:
690
- 0 4px 6px -1px rgb(0 0 0 / 0.1),
691
- 0 2px 4px -2px rgb(0 0 0 / 0.1) !important;
692
- --ty-divide-color: var(--ty-floating-border);
693
- }
694
-
695
- /* App and page backgrounds - the canvas for content */
696
- .ty-canvas {
697
- box-sizing: border-box !important;
698
- background-color: var(--ty-surface-canvas) !important;
699
- border: var(--ty-canvas-border-width, var(--ty-border-width, 1px))
700
- var(--ty-canvas-border-style, solid) var(--ty-canvas-border, transparent) !important;
701
- --ty-divide-color: var(--ty-canvas-border);
702
- }
703
-
704
- /* Main content areas - primary content background */
705
- .ty-content {
706
- box-sizing: border-box !important;
707
- background-color: var(--ty-surface-content) !important;
708
- border: var(--ty-content-border-width, var(--ty-border-width, 1px))
709
- var(--ty-content-border-style, solid) var(--ty-content-border, transparent) !important;
710
- --ty-divide-color: var(--ty-content-border);
711
- }
712
-
713
- /* Input surfaces - form controls, text areas, inputs */
714
- .ty-input {
715
- box-sizing: border-box !important;
716
- background-color: var(--ty-input-bg) !important;
717
- border: var(--ty-input-border-width, var(--ty-border-width, 1px))
718
- var(--ty-input-border-style, solid) var(--ty-input-border, transparent) !important;
719
- --ty-divide-color: var(--ty-input-border);
720
- }
721
-
722
- /* Divider utilities — consume --ty-divide-color from the nearest surface
723
- context (set on .ty-elevated/.ty-floating/.ty-canvas/.ty-content/.ty-input)
724
- via CSS variable inheritance. Override per-instance:
725
- style="--ty-divide-color: var(--ty-border-strong);" */
726
- .ty-divide-y > * + * {
727
- border-top: var(--ty-divide-width, var(--ty-border-width, 1px)) solid
728
- var(--ty-divide-color, var(--ty-border));
729
- }
730
-
731
- .ty-divide-x > * + * {
732
- border-left: var(--ty-divide-width, var(--ty-border-width, 1px)) solid
733
- var(--ty-divide-color, var(--ty-border));
734
- }
735
-
736
- /* Dark theme adjustments for shadows */
737
- html.dark .ty-elevated {
738
- background-color: var(--ty-surface-elevated) !important;
739
- box-shadow:
740
- 0 1px 3px 0 rgb(0 0 0 / 0.2),
741
- 0 1px 2px -1px rgb(0 0 0 / 0.2) !important;
742
- }
743
-
744
- html.dark .ty-floating {
745
- background-color: var(--ty-surface-floating) !important;
746
- box-shadow:
747
- 0 4px 6px -1px rgb(0 0 0 / 0.3),
748
- 0 2px 4px -2px rgb(0 0 0 / 0.3) !important;
749
- }
750
-
751
- html.dark .ty-high-elevation {
752
- background-color: var(--ty-surface-floating) !important;
753
- box-shadow:
754
- 0 10px 15px -3px rgb(0 0 0 / 0.4),
755
- 0 4px 6px -4px rgb(0 0 0 / 0.4) !important;
756
- }
757
-
758
- html.dark .ty-sunken {
759
- background-color: var(--ty-surface-input) !important;
760
- box-shadow: inset 0 1px 2px 0 rgb(0 0 0 / 0.1) !important;
761
- }
762
-
763
- /* =================================================================
764
- SEMANTIC BACKGROUND UTILITIES
765
- ================================================================= */
766
-
767
- /* Semantic backgrounds - these are the key theme utilities */
768
- .ty-bg-primary {
769
- background-color: var(--ty-bg-primary);
770
- }
771
-
772
- .ty-bg-primary\+ {
773
- background-color: var(--ty-bg-primary-bold);
774
- }
775
-
776
- .ty-bg-primary- {
777
- background-color: var(--ty-bg-primary-soft);
778
- }
779
-
780
-
781
-
782
-
783
- .ty-bg-success {
784
- background-color: var(--ty-bg-success);
785
- }
786
-
787
- .ty-bg-success\+ {
788
- background-color: var(--ty-bg-success-bold);
789
- }
790
-
791
- .ty-bg-success- {
792
- background-color: var(--ty-bg-success-soft);
793
- }
794
-
795
- .ty-bg-danger {
796
- background-color: var(--ty-bg-danger);
797
- }
798
-
799
- .ty-bg-danger\+ {
800
- background-color: var(--ty-bg-danger-bold);
801
- }
802
-
803
- .ty-bg-danger- {
804
- background-color: var(--ty-bg-danger-soft);
805
- }
806
-
807
- .ty-bg-warning {
808
- background-color: var(--ty-bg-warning);
809
- }
810
-
811
- .ty-bg-warning\+ {
812
- background-color: var(--ty-bg-warning-bold);
813
- }
814
-
815
- .ty-bg-warning- {
816
- background-color: var(--ty-bg-warning-soft);
817
- }
818
-
819
- .ty-bg-neutral {
820
- background-color: var(--ty-bg-neutral);
821
- }
822
-
823
- .ty-bg-neutral\+ {
824
- background-color: var(--ty-bg-neutral-bold);
825
- }
826
-
827
- .ty-bg-neutral- {
828
- background-color: var(--ty-bg-neutral-soft);
829
- }
830
-
831
- /* =================================================================
832
- TEXT HIERARCHY UTILITIES
833
- ================================================================= */
834
-
835
- /* Base text hierarchy - emphasis based, not semantic */
836
- .ty-text {
837
- color: var(--ty-text) !important;
838
- }
839
-
840
- .ty-text\+ {
841
- color: var(--ty-text-bold) !important;
842
- }
843
-
844
- .ty-text\+\+ {
845
- color: var(--ty-text-strong) !important;
846
- }
847
-
848
- .ty-text- {
849
- color: var(--ty-text-soft) !important;
850
- }
851
-
852
- .ty-text-- {
853
- color: var(--ty-text-faint) !important;
854
- }
855
-
856
- /* =================================================================
857
- SEMANTIC TEXT COLORS - 5-VARIANT SYSTEM
858
- ================================================================= */
859
-
860
- /* Primary text colors with full 5-variant system */
861
- .ty-text-primary\+\+ {
862
- color: var(--ty-color-primary-strong) !important;
863
- }
864
-
865
- .ty-text-primary\+ {
866
- color: var(--ty-color-primary-bold) !important;
867
- }
868
-
869
- .ty-text-primary {
870
- color: var(--ty-color-primary) !important;
871
- }
872
-
873
- .ty-text-primary- {
874
- color: var(--ty-color-primary-soft) !important;
875
- }
876
-
877
- .ty-text-primary-- {
878
- color: var(--ty-color-primary-faint) !important;
879
- }
880
-
881
-
882
-
883
-
884
-
885
- /* Success text colors */
886
- .ty-text-success\+\+ {
887
- color: var(--ty-color-success-strong) !important;
888
- }
889
-
890
- .ty-text-success\+ {
891
- color: var(--ty-color-success-bold) !important;
892
- }
893
-
894
- .ty-text-success {
895
- color: var(--ty-color-success) !important;
896
- }
897
-
898
- .ty-text-success- {
899
- color: var(--ty-color-success-soft) !important;
900
- }
901
-
902
- .ty-text-success-- {
903
- color: var(--ty-color-success-faint) !important;
904
- }
905
-
906
- /* Danger text colors */
907
- .ty-text-danger\+\+ {
908
- color: var(--ty-color-danger-strong) !important;
909
- }
910
-
911
- .ty-text-danger\+ {
912
- color: var(--ty-color-danger-bold) !important;
913
- }
914
-
915
- .ty-text-danger {
916
- color: var(--ty-color-danger) !important;
917
- }
918
-
919
- .ty-text-danger- {
920
- color: var(--ty-color-danger-soft) !important;
921
- }
922
-
923
- .ty-text-danger-- {
924
- color: var(--ty-color-danger-faint) !important;
925
- }
926
-
927
- /* Warning text colors */
928
- .ty-text-warning\+\+ {
929
- color: var(--ty-color-warning-strong) !important;
930
- }
931
-
932
- .ty-text-warning\+ {
933
- color: var(--ty-color-warning-bold) !important;
934
- }
935
-
936
- .ty-text-warning {
937
- color: var(--ty-color-warning) !important;
938
- }
939
-
940
- .ty-text-warning- {
941
- color: var(--ty-color-warning-soft) !important;
942
- }
943
-
944
- .ty-text-warning-- {
945
- color: var(--ty-color-warning-faint) !important;
946
- }
947
-
948
- /* Neutral text colors */
949
- .ty-text-neutral\+\+ {
950
- color: var(--ty-color-neutral-strong) !important;
951
- }
952
-
953
- .ty-text-neutral\+ {
954
- color: var(--ty-color-neutral-bold) !important;
955
- }
956
-
957
- .ty-text-neutral {
958
- color: var(--ty-color-neutral) !important;
959
- }
960
-
961
- .ty-text-neutral- {
962
- color: var(--ty-color-neutral-soft) !important;
963
- }
964
-
965
- .ty-text-neutral-- {
966
- color: var(--ty-color-neutral-faint) !important;
967
- }
968
-
969
- /* =================================================================
970
- BORDER UTILITIES
971
- ================================================================= */
972
-
973
- /* Base border colors with emphasis */
974
- .ty-border {
975
- border-color: var(--ty-border) !important;
976
- }
977
-
978
- .ty-border\+ {
979
- border-color: var(--ty-border-bold) !important;
980
- }
981
-
982
- .ty-border\+\+ {
983
- border-color: var(--ty-border-strong) !important;
984
- }
985
-
986
- .ty-border- {
987
- border-color: var(--ty-border-soft);
988
- }
989
-
990
- .ty-border-- {
991
- border-color: var(--ty-border-faint);
992
- }
993
-
994
- /* Semantic border colors */
995
- .ty-border-primary {
996
- border-color: var(--ty-border-primary);
997
- }
998
-
999
-
1000
- .ty-border-success {
1001
- border-color: var(--ty-border-success);
1002
- }
1003
-
1004
- .ty-border-danger {
1005
- border-color: var(--ty-border-danger);
1006
- }
1007
-
1008
- .ty-border-warning {
1009
- border-color: var(--ty-border-warning);
1010
- }
1011
-
1012
- .ty-border-neutral {
1013
- border-color: var(--ty-border-neutral);
1014
- }
1015
-
1016
- /* =================================================================
1017
- COMPONENT UTILITIES
1018
- ================================================================= */
1019
-
1020
- /* Card/Panel utilities */
1021
- .ty-card {
1022
- background-color: var(--ty-surface-elevated);
1023
- color: var(--ty-color-neutral-bold);
1024
- }
1025
-
1026
- .ty-card-elevated {
1027
- background-color: var(--ty-surface-floating);
1028
- box-shadow: var(--ty-shadow-md);
1029
- }
1030
-
1031
- /* Input-like utilities for custom form elements */
1032
- .ty-input-bg {
1033
- background-color: var(--ty-input-bg);
1034
- }
1035
-
1036
- .ty-input-border {
1037
- border-color: var(--ty-input-border);
1038
- }
1039
-
1040
- .ty-input-focus {
1041
- border-color: var(--ty-input-border-focus);
1042
- }
1043
-
1044
- /* Modal/overlay utilities */
1045
- .ty-modal-bg {
1046
- background-color: var(--ty-modal-bg);
1047
- }
1048
-
1049
- .ty-modal-backdrop {
1050
- background-color: var(--ty-modal-backdrop);
1051
- }
1052
-
1053
- /* =================================================================
1054
- INTERACTIVE STATES
1055
- ================================================================= */
1056
-
1057
- .hover\:ty-bg-neutral--:hover {
1058
- background-color: var(--ty-bg-neutral-faint) !important;
1059
- }
1060
-
1061
- .hover\:ty-bg-neutral-:hover {
1062
- background-color: var(--ty-bg-neutral-soft) !important;
1063
- }
1064
-
1065
- .hover\:ty-bg-neutral:hover {
1066
- background-color: var(--ty-bg-neutral) !important;
1067
- }
1068
-
1069
- .hover\:ty-bg-neutral\+:hover {
1070
- background-color: var(--ty-bg-neutral-bold) !important;
1071
- }
1072
-
1073
- .hover\:ty-bg-neutral\+\+:hover {
1074
- background-color: var(--ty-bg-neutral-strong) !important;
1075
- }
1076
-
1077
- .hover\:ty-bg-primary:hover {
1078
- background-color: var(--ty-bg-primary) !important;
1079
- }
1080
-
1081
- .hover\:ty-bg-primary\+:hover {
1082
- background-color: var(--ty-bg-primary-bold) !important;
1083
- }
1084
-
1085
-
1086
-
1087
- .hover\:ty-bg-success:hover {
1088
- background-color: var(--ty-bg-success) !important;
1089
- }
1090
-
1091
- .hover\:ty-bg-success\+:hover {
1092
- background-color: var(--ty-bg-success-bold) !important;
1093
- }
1094
-
1095
- .hover\:ty-bg-danger:hover {
1096
- background-color: var(--ty-bg-danger) !important;
1097
- }
1098
-
1099
- .hover\:ty-bg-danger\+:hover {
1100
- background-color: var(--ty-bg-danger-bold) !important;
1101
- }
1102
-
1103
- .hover\:ty-bg-danger-:hover {
1104
- background-color: var(--ty-bg-danger-soft) !important;
1105
- }
1106
-
1107
- /* Hover states for text colors */
1108
- .hover\:ty-text:hover {
1109
- color: var(--ty-text) !important;
1110
- }
1111
-
1112
- .hover\:ty-text\+:hover {
1113
- color: var(--ty-text-bold) !important;
1114
- }
1115
-
1116
- .hover\:ty-text\+\+:hover {
1117
- color: var(--ty-text-strong) !important;
1118
- }
1119
-
1120
- .hover\:ty-text-:hover {
1121
- color: var(--ty-text-soft) !important;
1122
- }
1123
-
1124
- .hover\:ty-text--:hover {
1125
- color: var(--ty-text-faint) !important;
1126
- }
1127
-
1128
- /* Hover states for semantic text colors */
1129
- /* Primary text hover states */
1130
- .hover\:ty-text-primary\+\+:hover {
1131
- color: var(--ty-color-primary-strong) !important;
1132
- }
1133
-
1134
- .hover\:ty-text-primary\+:hover {
1135
- color: var(--ty-color-primary-bold) !important;
1136
- }
1137
-
1138
- .hover\:ty-text-primary:hover {
1139
- color: var(--ty-color-primary) !important;
1140
- }
1141
-
1142
- .hover\:ty-text-primary-:hover {
1143
- color: var(--ty-color-primary-soft) !important;
1144
- }
1145
-
1146
- .hover\:ty-text-primary--:hover {
1147
- color: var(--ty-color-primary-faint) !important;
1148
- }
1149
-
1150
-
1151
-
1152
-
1153
-
1154
- /* Success text hover states */
1155
- .hover\:ty-text-success\+\+:hover {
1156
- color: var(--ty-color-success-strong) !important;
1157
- }
1158
-
1159
- .hover\:ty-text-success\+:hover {
1160
- color: var(--ty-color-success-bold) !important;
1161
- }
1162
-
1163
- .hover\:ty-text-success:hover {
1164
- color: var(--ty-color-success) !important;
1165
- }
1166
-
1167
- .hover\:ty-text-success-:hover {
1168
- color: var(--ty-color-success-soft) !important;
1169
- }
1170
-
1171
- .hover\:ty-text-success--:hover {
1172
- color: var(--ty-color-success-faint) !important;
1173
- }
1174
-
1175
- /* Danger text hover states */
1176
- .hover\:ty-text-danger\+\+:hover {
1177
- color: var(--ty-color-danger-strong) !important;
1178
- }
1179
-
1180
- .hover\:ty-text-danger\+:hover {
1181
- color: var(--ty-color-danger-bold) !important;
1182
- }
1183
-
1184
- .hover\:ty-text-danger:hover {
1185
- color: var(--ty-color-danger) !important;
1186
- }
1187
-
1188
- .hover\:ty-text-danger-:hover {
1189
- color: var(--ty-color-danger-soft) !important;
1190
- }
1191
-
1192
- .hover\:ty-text-danger--:hover {
1193
- color: var(--ty-color-danger-faint) !important;
1194
- }
1195
-
1196
- /* Warning text hover states */
1197
- .hover\:ty-text-warning\+\+:hover {
1198
- color: var(--ty-color-warning-strong) !important;
1199
- }
1200
-
1201
- .hover\:ty-text-warning\+:hover {
1202
- color: var(--ty-color-warning-bold) !important;
1203
- }
1204
-
1205
- .hover\:ty-text-warning:hover {
1206
- color: var(--ty-color-warning) !important;
1207
- }
1208
-
1209
- .hover\:ty-text-warning-:hover {
1210
- color: var(--ty-color-warning-soft) !important;
1211
- }
1212
-
1213
- .hover\:ty-text-warning--:hover {
1214
- color: var(--ty-color-warning-faint) !important;
1215
- }
1216
-
1217
- /* Neutral text hover states */
1218
- .hover\:ty-text-neutral\+\+:hover {
1219
- color: var(--ty-color-neutral-strong) !important;
1220
- }
1221
-
1222
- .hover\:ty-text-neutral + :hover {
1223
- color: var(--ty-color-neutral-bold) !important;
1224
- }
1225
-
1226
- .hover\:ty-text-neutral:hover {
1227
- color: var(--ty-color-neutral) !important;
1228
- }
1229
-
1230
- .hover\:ty-text-neutral-:hover {
1231
- color: var(--ty-color-neutral-soft) !important;
1232
- }
1233
-
1234
- .hover\:ty-text-neutral--:hover {
1235
- color: var(--ty-color-neutral-faint) !important;
1236
- }
1237
-
1238
- /* Hover states for borders */
1239
- /* Base border hover states */
1240
- .hover\:ty-border\+\+:hover {
1241
- border-color: var(--ty-border-strong) !important;
1242
- }
1243
-
1244
- .hover\:ty-border\+:hover {
1245
- border-color: var(--ty-border-bold) !important;
1246
- }
1247
-
1248
- .hover\:ty-border:hover {
1249
- border-color: var(--ty-border) !important;
1250
- }
1251
-
1252
- .hover\:ty-border-:hover {
1253
- border-color: var(--ty-border-soft) !important;
1254
- }
1255
-
1256
- .hover\:ty-border--:hover {
1257
- border-color: var(--ty-border-faint) !important;
1258
- }
1259
-
1260
- /* Semantic border hover states */
1261
- .hover\:ty-border-primary:hover {
1262
- border-color: var(--ty-border-primary) !important;
1263
- }
1264
-
1265
-
1266
- .hover\:ty-border-success:hover {
1267
- border-color: var(--ty-border-success) !important;
1268
- }
1269
-
1270
- .hover\:ty-border-danger:hover {
1271
- border-color: var(--ty-border-danger) !important;
1272
- }
1273
-
1274
- .hover\:ty-border-warning:hover {
1275
- border-color: var(--ty-border-warning) !important;
1276
- }
1277
-
1278
- .hover\:ty-border-neutral:hover {
1279
- border-color: var(--ty-border-neutral) !important;
1280
- }
1281
-
1282
- .focus\:ty-border\+\+:focus {
1283
- border-color: var(--ty-border-strong) !important;
1284
- }
1285
-
1286
- .focus\:ty-border + :focus {
1287
- border-color: var(--ty-border-bold) !important;
1288
- }
1289
-
1290
- .focus\:ty-border:focus {
1291
- border-color: var(--ty-border) !important;
1292
- }
1293
-
1294
- .focus\:ty-border-:focus {
1295
- border-color: var(--ty-border-soft) !important;
1296
- }
1297
-
1298
- .focus\:ty-border--:focus {
1299
- border-color: var(--ty-border-faint) !important;
1300
- }
1301
-
1302
- /* Semantic border focus states */
1303
- .focus\:ty-border-primary:focus {
1304
- border-color: var(--ty-border-primary) !important;
1305
- }
1306
-
1307
-
1308
- .focus\:ty-border-success:focus {
1309
- border-color: var(--ty-border-success) !important;
1310
- }
1311
-
1312
- .focus\:ty-border-danger:focus {
1313
- border-color: var(--ty-border-danger) !important;
1314
- }
1315
-
1316
- .focus\:ty-border-warning:focus {
1317
- border-color: var(--ty-border-warning) !important;
1318
- }
1319
-
1320
- .focus\:ty-border-neutral:focus {
1321
- border-color: var(--ty-border-neutral) !important;
1322
- }
1323
-
1324
- /* =================================================================
1325
- RESPONSIVE VARIANTS
1326
- ================================================================= */
1327
-
1328
- /* Small screens and up */
1329
- @media (min-width: 640px) {
1330
- .sm\:ty-bg-primary {
1331
- background-color: var(--ty-bg-primary);
1332
- }
1333
-
1334
- .sm\:ty-text-primary {
1335
- color: var(--ty-color-primary);
1336
- }
1337
- }
1338
-
1339
- /* Medium screens and up */
1340
- @media (min-width: 768px) {
1341
- .md\:ty-bg-primary {
1342
- background-color: var(--ty-bg-primary);
1343
- }
1344
-
1345
- .md\:ty-text-primary {
1346
- color: var(--ty-color-primary);
1347
- }
1348
- }
1349
-
1350
- /* Large screens and up */
1351
- @media (min-width: 1024px) {
1352
- .lg\:ty-bg-primary {
1353
- background-color: var(--ty-bg-primary);
1354
- }
1355
-
1356
- .lg\:ty-text-primary {
1357
- color: var(--ty-color-primary);
1358
- }
1359
- }
1360
-
1361
- /* =================================================================
1362
- MOBILE FONT SIZE
1363
- Prevents iOS Safari auto-zoom on input focus (requires >= 16px)
1364
- and improves readability on small screens.
1365
- ================================================================= */
1366
-
1367
- @media (max-width: 768px) {
1368
- :root {
1369
- --ty-font-sm: 1rem;
1370
- }
1371
- }
1372
-
1373
- /* =================================================================
1374
- MODAL BACKDROP ZOOM (opt-in)
1375
- While any <ty-modal backdrop-zoom open> is open, the component toggles
1376
- .ty-modal-zoom on <html> and the page body scales down slightly
1377
- (Vaul/shadcn-style). The modal itself renders in the top layer, which
1378
- escapes ancestor transforms — only the page behind it moves.
1379
- Caveat: a scaled <body> becomes the containing block for position:fixed
1380
- descendants — apps with fixed headers/sidebars should not use backdrop-zoom.
1381
- ================================================================= */
1382
-
1383
- body {
1384
- transition: scale var(--ty-modal-duration, 200ms) ease-out;
1385
- }
1386
-
1387
- html.ty-modal-zoom body {
1388
- scale: 0.99;
1389
- transform-origin: 50% 50%;
1390
- }
1
+ ty-icon:not(:defined){display:inline-block;aspect-ratio:1 / 1;opacity:0;transition:opacity .15s ease-in}ty-icon:not(:defined),ty-icon:not(:defined)[size=md]{width:1em;height:1em}ty-icon:not(:defined)[size=xs]{width:.75em;height:.75em}ty-icon:not(:defined)[size=sm]{width:.875em;height:.875em}ty-icon:not(:defined)[size=lg]{width:1.25em;height:1.25em}ty-icon:not(:defined)[size=xl]{width:1.5em;height:1.5em}ty-icon:not(:defined)[size="2xl"]{width:2em;height:2em}ty-icon:not(:defined)[size="12"]{width:12px;height:12px}ty-icon:not(:defined)[size="14"]{width:14px;height:14px}ty-icon:not(:defined)[size="16"]{width:16px;height:16px}ty-icon:not(:defined)[size="18"]{width:18px;height:18px}ty-icon:not(:defined)[size="20"]{width:20px;height:20px}ty-icon:not(:defined)[size="24"]{width:24px;height:24px}ty-icon:not(:defined)[size="32"]{width:32px;height:32px}ty-icon:not(:defined)[size="48"]{width:48px;height:48px}ty-icon:not(:defined)[size="64"]{width:64px;height:64px}ty-icon:not(:defined)[size="80"]{width:80px;height:80px}ty-icon:not(:defined)[size="96"]{width:96px;height:96px}ty-icon{opacity:1}html{--ty-bg-faint: #f8fafc;--ty-bg-soft: #f1f5f9;--ty-bg: #ffffff;--ty-bg-bold: #f8fafc;--ty-bg-strong: #e2e8f0;--ty-focus-ring-gap: #ffffff;--ty-border-width: 1px;--ty-scrollbar-thumb: rgba(0, 0, 0, .35);--ty-scrollbar-thumb-hover: rgba(0, 0, 0, .5);--ty-scrollbar-thumb-active: rgba(0, 0, 0, .6);--ty-scrollbar-track: transparent;--ty-scrollbar-track-hover: rgba(0, 0, 0, .06);--ty-elevated-border-width: var(--ty-border-width);--ty-elevated-border-style: solid;--ty-floating-border-width: var(--ty-border-width);--ty-floating-border-style: solid;--ty-canvas-border: transparent;--ty-canvas-border-width: var(--ty-border-width);--ty-canvas-border-style: solid;--ty-content-border-width: var(--ty-border-width);--ty-content-border-style: solid;--ty-input-border-width: var(--ty-border-width);--ty-input-border-style: solid;--ty-divide-color: var(--ty-border);--ty-divide-width: var(--ty-border-width);--ty-modal-bg: #ffffff;--ty-modal-color: #111827;--ty-modal-border: #e5e7eb;--ty-modal-backdrop: rgba(0, 0, 0, .5);--ty-modal-backdrop-blur: blur(2px);--ty-modal-border-radius: 16px;--ty-modal-shadow: 0 20px 25px -5px rgba(0, 0, 0, .1), 0 10px 10px -5px rgba(0, 0, 0, .04);--ty-modal-duration: .2s;--ty-modal-sm-width: 300px;--ty-modal-md-width: 500px;--ty-modal-lg-width: 700px;--ty-modal-xl-width: 900px;--ty-modal-full-width: 95vw;--ty-modal-full-height: 95vh;--ty-label-color: #374151;--ty-spacing-0: 0;--ty-spacing-px: 1px;--ty-spacing-mini: .125rem;--ty-spacing-1: .25rem;--ty-spacing-2: .5rem;--ty-spacing-3: .75rem;--ty-spacing-4: 1rem;--ty-spacing-5: 1.25rem;--ty-spacing-6: 1.5rem;--ty-spacing-7: 1.75rem;--ty-spacing-8: 2rem;--ty-spacing-9: 2.25rem;--ty-spacing-10: 2.5rem;--ty-spacing-12: 3rem;--ty-spacing-16: 4rem;--ty-spacing-20: 5rem;--ty-spacing-24: 6rem;--ty-radius-none: 0;--ty-radius-sm: .25rem;--ty-radius-base: .375rem;--ty-radius-md: .5rem;--ty-radius-lg: .75rem;--ty-radius-xl: 1rem;--ty-radius-2xl: 1.5rem;--ty-radius-3xl: 2rem;--ty-radius-full: 9999px;--ty-shadow-none: none;--ty-shadow-sm: 0 1px 2px 0 rgba(0, 0, 0, .05);--ty-shadow-base: 0 1px 3px 0 rgba(0, 0, 0, .1), 0 1px 2px -1px rgba(0, 0, 0, .1);--ty-shadow-md: 0 4px 6px -1px rgba(0, 0, 0, .1), 0 2px 4px -2px rgba(0, 0, 0, .1);--ty-shadow-lg: 0 10px 15px -3px rgba(0, 0, 0, .1), 0 4px 6px -4px rgba(0, 0, 0, .1);--ty-shadow-xl: 0 20px 25px -5px rgba(0, 0, 0, .1), 0 8px 10px -6px rgba(0, 0, 0, .1);--ty-shadow-2xl: 0 25px 50px -12px rgba(0, 0, 0, .25);--ty-font-sans: system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;--ty-font-mono: ui-monospace, SFMono-Regular, "SF Mono", Consolas, monospace;--ty-font-xxs: .625rem;--ty-font-xs: .75rem;--ty-font-sm: .875rem;--ty-font-base: 1rem;--ty-font-lg: 1.125rem;--ty-font-xl: 1.25rem;--ty-font-2xl: 1.5rem;--ty-font-3xl: 1.875rem;--ty-font-4xl: 2.25rem;--ty-font-5xl: 3rem;--ty-leading-xxs: .9375rem;--ty-leading-xs: 1.05rem;--ty-leading-sm: 1.3125rem;--ty-leading-base: 1.5rem;--ty-leading-lg: 1.6875rem;--ty-leading-xl: 1.75rem;--ty-leading-2xl: 2rem;--ty-leading-3xl: 2.25rem;--ty-leading-4xl: 2.5rem;--ty-leading-5xl: 1;--ty-tracking-xxs: -.015em;--ty-tracking-xs: 0;--ty-tracking-sm: -.013em;--ty-tracking-base: -.011em;--ty-tracking-lg: 0;--ty-tracking-tight: -.022em;--ty-tracking-title: -.012em;--ty-font-thin: 100;--ty-font-light: 300;--ty-font-normal: 400;--ty-font-medium: 510;--ty-font-semibold: 590;--ty-font-bold: 680;--ty-font-extrabold: 800;--ty-weight-action: var(--ty-font-medium);--ty-weight-label: 440;--ty-button-depth: .35;--ty-button-border-l: -.08;--ty-button-border-l-neutral: -.25;--ty-line-height-none: 1;--ty-line-height-tight: 1.25;--ty-line-height-snug: 1.375;--ty-line-height-normal: 1.5;--ty-line-height-relaxed: 1.625;--ty-line-height-loose: 2;--ty-transition-none: none;--ty-transition-all: var(--ty-local-transition, all .15s cubic-bezier(.4, 0, .2, 1));--ty-transition-colors: var(--ty-local-transition, bg-color, border-color, color, fill, stroke .15s cubic-bezier(.4, 0, .2, 1));--ty-transition-shadow: var(--ty-local-transition, box-shadow .15s cubic-bezier(.4, 0, .2, 1));--ty-transition-transform: var(--ty-local-transition, transform .15s cubic-bezier(.4, 0, .2, 1));--ty-size-xs: 1.75rem;--ty-size-sm: 2rem;--ty-size-md: 2.25rem;--ty-size-lg: 2.5rem;--ty-size-xl: 2.75rem;--ty-z-auto: auto;--ty-z-0: 0;--ty-z-10: 10;--ty-z-20: 20;--ty-z-30: 30;--ty-z-40: 40;--ty-z-50: 50;--ty-z-sticky: 1020;--ty-z-fixed: 1030;--ty-z-modal-backdrop: 1040;--ty-z-modal: 1050;--ty-z-popover: 1060;--ty-z-tooltip: 1070;--ty-z-dropdown: 1080;--ty-scroll-shadow-top: radial-gradient( ellipse 100% 30% at center, rgba(0, 0, 0, .1), rgba(0, 0, 0, 0), transparent );--ty-scroll-shadow-bottom: radial-gradient( ellipse 100% 20% at center, rgba(0, 0, 0, .15), rgba(0, 0, 0, 0), transparent );--ty-scroll-shadow-transition: opacity .2s ease-out;--ty-tooltip-bg: #262626;--ty-tooltip-color: #f5f5f5;--ty-tooltip-border: #404040;--ty-calendar-other-month-color: #6b7280}html.dark,html[data-theme=dark]{--ty-weight-action: var(--ty-font-normal);--ty-weight-label: var(--ty-font-normal);--ty-button-border-l: 0;--ty-button-border-l-neutral: .5;--ty-bg-faint: #0f1419;--ty-bg-soft: #111827;--ty-bg: #1f2937;--ty-bg-bold: #374151;--ty-bg-strong: #6b7280;--ty-focus-ring-gap: #1f2937;--ty-scrollbar-thumb: rgba(255, 255, 255, .13);--ty-scrollbar-thumb-hover: rgba(255, 255, 255, .22);--ty-scrollbar-thumb-active: rgba(255, 255, 255, .3);--ty-scrollbar-track: transparent;--ty-scrollbar-track-hover: rgba(255, 255, 255, .04);--ty-shadow-sm: 0 1px 2px 0 rgba(0, 0, 0, .2);--ty-shadow-base: 0 1px 3px 0 rgba(0, 0, 0, .3), 0 1px 2px -1px rgba(0, 0, 0, .3);--ty-shadow-md: 0 4px 6px -1px rgba(0, 0, 0, .3), 0 2px 4px -2px rgba(0, 0, 0, .3);--ty-shadow-lg: 0 10px 15px -3px rgba(0, 0, 0, .3), 0 4px 6px -4px rgba(0, 0, 0, .3);--ty-shadow-xl: 0 20px 25px -5px rgba(0, 0, 0, .3), 0 8px 10px -6px rgba(0, 0, 0, .3);--ty-shadow-2xl: 0 25px 50px -12px rgba(0, 0, 0, .5);--ty-label-color: #d1d5db;--ty-modal-bg: var(--ty-bg-bold);--ty-modal-color: var(--ty-color-neutral-bold);--ty-modal-border: var(--ty-border);--ty-modal-backdrop: rgba(0, 0, 0, .7);--ty-modal-shadow: 0 20px 25px -5px rgba(0, 0, 0, .4), 0 10px 10px -5px rgba(0, 0, 0, .2);--ty-scroll-shadow-top: radial-gradient( ellipse 100% 30% at center, rgba(172, 172, 172, .2), rgba(0, 0, 0, 0), transparent );--ty-scroll-shadow-bottom: radial-gradient( ellipse 100% 20% at center, rgba(172, 172, 172, .3), rgba(0, 0, 0, 0), transparent );--ty-calendar-other-month-color: #8a8a8a}::selection{background-color:var(--ty-selection-bg, var(--ty-bg-primary-bold));color:var(--ty-selection-color, var(--ty-text-strong))}::-moz-selection{background-color:var(--ty-selection-bg, var(--ty-color-primary));color:var(--ty-selection-color, var(--ty-text-strong))}pre ::selection,code ::selection,pre::-moz-selection,code::-moz-selection{background-color:var(--ty-color-warning-soft);color:var(--ty-color-neutral-strong)}html.dark pre ::selection,html.dark code ::selection,html.dark pre::-moz-selection,html.dark code::-moz-selection{background-color:var(--ty-color-warning);color:var(--ty-bg-strong)}input::selection,textarea::selection,input::-moz-selection,textarea::-moz-selection{background-color:var(--ty-color-primary);color:#fff}html.dark input::selection,html.dark textarea::selection,html.dark input::-moz-selection,html.dark textarea::-moz-selection{background-color:var(--ty-color-primary-soft);color:var(--ty-color-primary-strong)}.ty-selection-primary ::selection,.ty-selection-primary::-moz-selection{background-color:var(--ty-color-primary-soft);color:var(--ty-color-primary-strong)}.ty-selection-success ::selection,.ty-selection-success::-moz-selection{background-color:var(--ty-color-success-soft);color:var(--ty-color-success-strong)}.ty-selection-warning ::selection,.ty-selection-warning::-moz-selection{background-color:var(--ty-color-warning-soft);color:var(--ty-color-warning-strong)}.ty-selection-danger ::selection,.ty-selection-danger::-moz-selection{background-color:var(--ty-color-danger-soft);color:var(--ty-color-danger-strong)}.ty-selection-neutral ::selection,.ty-selection-neutral::-moz-selection{background-color:var(--ty-color-neutral-soft);color:var(--ty-color-neutral-strong)}html.dark .ty-selection-primary ::selection,html.dark .ty-selection-primary::-moz-selection{background-color:var(--ty-color-primary);color:#fff}html.dark .ty-selection-success ::selection,html.dark .ty-selection-success::-moz-selection{background-color:var(--ty-color-success);color:#fff}html.dark .ty-selection-warning ::selection,html.dark .ty-selection-warning::-moz-selection{background-color:var(--ty-color-warning);color:var(--ty-bg-strong)}html.dark .ty-selection-danger ::selection,html.dark .ty-selection-danger::-moz-selection{background-color:var(--ty-color-danger);color:#fff}html.dark .ty-selection-neutral ::selection,html.dark .ty-selection-neutral::-moz-selection{background-color:var(--ty-color-neutral);color:#fff}html *,html :before,html :after{border-color:var(--ty-border)}.ty-elevated{box-sizing:border-box!important;background-color:var(--ty-surface-elevated)!important;border:var(--ty-elevated-border-width, var(--ty-border-width, 1px)) var(--ty-elevated-border-style, solid) var(--ty-elevated-border, transparent)!important;box-shadow:0 1px 3px #0000001a,0 1px 2px -1px #0000001a!important;--ty-divide-color: var(--ty-elevated-border)}.ty-floating{box-sizing:border-box!important;background-color:var(--ty-surface-floating)!important;border:var(--ty-floating-border-width, var(--ty-border-width, 1px)) var(--ty-floating-border-style, solid) var(--ty-floating-border, transparent)!important;box-shadow:0 4px 6px -1px #0000001a,0 2px 4px -2px #0000001a!important;--ty-divide-color: var(--ty-floating-border)}.ty-canvas{box-sizing:border-box!important;background-color:var(--ty-surface-canvas)!important;border:var(--ty-canvas-border-width, var(--ty-border-width, 1px)) var(--ty-canvas-border-style, solid) var(--ty-canvas-border, transparent)!important;--ty-divide-color: var(--ty-canvas-border)}.ty-content{box-sizing:border-box!important;background-color:var(--ty-surface-content)!important;border:var(--ty-content-border-width, var(--ty-border-width, 1px)) var(--ty-content-border-style, solid) var(--ty-content-border, transparent)!important;--ty-divide-color: var(--ty-content-border)}.ty-input{box-sizing:border-box!important;background-color:var(--ty-input-bg)!important;border:var(--ty-input-border-width, var(--ty-border-width, 1px)) var(--ty-input-border-style, solid) var(--ty-input-border, transparent)!important;--ty-divide-color: var(--ty-input-border)}.ty-divide-y>*+*{border-top:var(--ty-divide-width, var(--ty-border-width, 1px)) solid var(--ty-divide-color, var(--ty-border))}.ty-divide-x>*+*{border-left:var(--ty-divide-width, var(--ty-border-width, 1px)) solid var(--ty-divide-color, var(--ty-border))}html.dark .ty-elevated{background-color:var(--ty-surface-elevated)!important;box-shadow:0 1px 3px #0003,0 1px 2px -1px #0003!important}html.dark .ty-floating{background-color:var(--ty-surface-floating)!important;box-shadow:0 4px 6px -1px #0000004d,0 2px 4px -2px #0000004d!important}html.dark .ty-high-elevation{background-color:var(--ty-surface-floating)!important;box-shadow:0 10px 15px -3px #0006,0 4px 6px -4px #0006!important}html.dark .ty-sunken{background-color:var(--ty-surface-input)!important;box-shadow:inset 0 1px 2px #0000001a!important}.ty-bg-primary{background-color:var(--ty-bg-primary)}.ty-bg-primary\+{background-color:var(--ty-bg-primary-bold)}.ty-bg-primary-{background-color:var(--ty-bg-primary-soft)}.ty-bg-success{background-color:var(--ty-bg-success)}.ty-bg-success\+{background-color:var(--ty-bg-success-bold)}.ty-bg-success-{background-color:var(--ty-bg-success-soft)}.ty-bg-danger{background-color:var(--ty-bg-danger)}.ty-bg-danger\+{background-color:var(--ty-bg-danger-bold)}.ty-bg-danger-{background-color:var(--ty-bg-danger-soft)}.ty-bg-warning{background-color:var(--ty-bg-warning)}.ty-bg-warning\+{background-color:var(--ty-bg-warning-bold)}.ty-bg-warning-{background-color:var(--ty-bg-warning-soft)}.ty-bg-neutral{background-color:var(--ty-bg-neutral)}.ty-bg-neutral\+{background-color:var(--ty-bg-neutral-bold)}.ty-bg-neutral-{background-color:var(--ty-bg-neutral-soft)}.ty-text{color:var(--ty-text)!important}.ty-text\+{color:var(--ty-text-bold)!important}.ty-text\+\+{color:var(--ty-text-strong)!important}.ty-text-{color:var(--ty-text-soft)!important}.ty-text--{color:var(--ty-text-faint)!important}.ty-text-primary\+\+{color:var(--ty-color-primary-strong)!important}.ty-text-primary\+{color:var(--ty-color-primary-bold)!important}.ty-text-primary{color:var(--ty-color-primary)!important}.ty-text-primary-{color:var(--ty-color-primary-soft)!important}.ty-text-primary--{color:var(--ty-color-primary-faint)!important}.ty-text-success\+\+{color:var(--ty-color-success-strong)!important}.ty-text-success\+{color:var(--ty-color-success-bold)!important}.ty-text-success{color:var(--ty-color-success)!important}.ty-text-success-{color:var(--ty-color-success-soft)!important}.ty-text-success--{color:var(--ty-color-success-faint)!important}.ty-text-danger\+\+{color:var(--ty-color-danger-strong)!important}.ty-text-danger\+{color:var(--ty-color-danger-bold)!important}.ty-text-danger{color:var(--ty-color-danger)!important}.ty-text-danger-{color:var(--ty-color-danger-soft)!important}.ty-text-danger--{color:var(--ty-color-danger-faint)!important}.ty-text-warning\+\+{color:var(--ty-color-warning-strong)!important}.ty-text-warning\+{color:var(--ty-color-warning-bold)!important}.ty-text-warning{color:var(--ty-color-warning)!important}.ty-text-warning-{color:var(--ty-color-warning-soft)!important}.ty-text-warning--{color:var(--ty-color-warning-faint)!important}.ty-text-neutral\+\+{color:var(--ty-color-neutral-strong)!important}.ty-text-neutral\+{color:var(--ty-color-neutral-bold)!important}.ty-text-neutral{color:var(--ty-color-neutral)!important}.ty-text-neutral-{color:var(--ty-color-neutral-soft)!important}.ty-text-neutral--{color:var(--ty-color-neutral-faint)!important}.ty-border{border-color:var(--ty-border)!important}.ty-border\+{border-color:var(--ty-border-bold)!important}.ty-border\+\+{border-color:var(--ty-border-strong)!important}.ty-border-{border-color:var(--ty-border-soft)}.ty-border--{border-color:var(--ty-border-faint)}.ty-border-primary{border-color:var(--ty-border-primary)}.ty-border-success{border-color:var(--ty-border-success)}.ty-border-danger{border-color:var(--ty-border-danger)}.ty-border-warning{border-color:var(--ty-border-warning)}.ty-border-neutral{border-color:var(--ty-border-neutral)}.ty-card{background-color:var(--ty-surface-elevated);color:var(--ty-color-neutral-bold)}.ty-card-elevated{background-color:var(--ty-surface-floating);box-shadow:var(--ty-shadow-md)}.ty-input-bg{background-color:var(--ty-input-bg)}.ty-input-border{border-color:var(--ty-input-border)}.ty-input-focus{border-color:var(--ty-input-border-focus)}.ty-modal-bg{background-color:var(--ty-modal-bg)}.ty-modal-backdrop{background-color:var(--ty-modal-backdrop)}.hover\:ty-bg-neutral--:hover{background-color:var(--ty-bg-neutral-faint)!important}.hover\:ty-bg-neutral-:hover{background-color:var(--ty-bg-neutral-soft)!important}.hover\:ty-bg-neutral:hover{background-color:var(--ty-bg-neutral)!important}.hover\:ty-bg-neutral\+:hover{background-color:var(--ty-bg-neutral-bold)!important}.hover\:ty-bg-neutral\+\+:hover{background-color:var(--ty-bg-neutral-strong)!important}.hover\:ty-bg-primary:hover{background-color:var(--ty-bg-primary)!important}.hover\:ty-bg-primary\+:hover{background-color:var(--ty-bg-primary-bold)!important}.hover\:ty-bg-success:hover{background-color:var(--ty-bg-success)!important}.hover\:ty-bg-success\+:hover{background-color:var(--ty-bg-success-bold)!important}.hover\:ty-bg-danger:hover{background-color:var(--ty-bg-danger)!important}.hover\:ty-bg-danger\+:hover{background-color:var(--ty-bg-danger-bold)!important}.hover\:ty-bg-danger-:hover{background-color:var(--ty-bg-danger-soft)!important}.hover\:ty-text:hover{color:var(--ty-text)!important}.hover\:ty-text\+:hover{color:var(--ty-text-bold)!important}.hover\:ty-text\+\+:hover{color:var(--ty-text-strong)!important}.hover\:ty-text-:hover{color:var(--ty-text-soft)!important}.hover\:ty-text--:hover{color:var(--ty-text-faint)!important}.hover\:ty-text-primary\+\+:hover{color:var(--ty-color-primary-strong)!important}.hover\:ty-text-primary\+:hover{color:var(--ty-color-primary-bold)!important}.hover\:ty-text-primary:hover{color:var(--ty-color-primary)!important}.hover\:ty-text-primary-:hover{color:var(--ty-color-primary-soft)!important}.hover\:ty-text-primary--:hover{color:var(--ty-color-primary-faint)!important}.hover\:ty-text-success\+\+:hover{color:var(--ty-color-success-strong)!important}.hover\:ty-text-success\+:hover{color:var(--ty-color-success-bold)!important}.hover\:ty-text-success:hover{color:var(--ty-color-success)!important}.hover\:ty-text-success-:hover{color:var(--ty-color-success-soft)!important}.hover\:ty-text-success--:hover{color:var(--ty-color-success-faint)!important}.hover\:ty-text-danger\+\+:hover{color:var(--ty-color-danger-strong)!important}.hover\:ty-text-danger\+:hover{color:var(--ty-color-danger-bold)!important}.hover\:ty-text-danger:hover{color:var(--ty-color-danger)!important}.hover\:ty-text-danger-:hover{color:var(--ty-color-danger-soft)!important}.hover\:ty-text-danger--:hover{color:var(--ty-color-danger-faint)!important}.hover\:ty-text-warning\+\+:hover{color:var(--ty-color-warning-strong)!important}.hover\:ty-text-warning\+:hover{color:var(--ty-color-warning-bold)!important}.hover\:ty-text-warning:hover{color:var(--ty-color-warning)!important}.hover\:ty-text-warning-:hover{color:var(--ty-color-warning-soft)!important}.hover\:ty-text-warning--:hover{color:var(--ty-color-warning-faint)!important}.hover\:ty-text-neutral\+\+:hover{color:var(--ty-color-neutral-strong)!important}.hover\:ty-text-neutral+:hover{color:var(--ty-color-neutral-bold)!important}.hover\:ty-text-neutral:hover{color:var(--ty-color-neutral)!important}.hover\:ty-text-neutral-:hover{color:var(--ty-color-neutral-soft)!important}.hover\:ty-text-neutral--:hover{color:var(--ty-color-neutral-faint)!important}.hover\:ty-border\+\+:hover{border-color:var(--ty-border-strong)!important}.hover\:ty-border\+:hover{border-color:var(--ty-border-bold)!important}.hover\:ty-border:hover{border-color:var(--ty-border)!important}.hover\:ty-border-:hover{border-color:var(--ty-border-soft)!important}.hover\:ty-border--:hover{border-color:var(--ty-border-faint)!important}.hover\:ty-border-primary:hover{border-color:var(--ty-border-primary)!important}.hover\:ty-border-success:hover{border-color:var(--ty-border-success)!important}.hover\:ty-border-danger:hover{border-color:var(--ty-border-danger)!important}.hover\:ty-border-warning:hover{border-color:var(--ty-border-warning)!important}.hover\:ty-border-neutral:hover{border-color:var(--ty-border-neutral)!important}.focus\:ty-border\+\+:focus{border-color:var(--ty-border-strong)!important}.focus\:ty-border+:focus{border-color:var(--ty-border-bold)!important}.focus\:ty-border:focus{border-color:var(--ty-border)!important}.focus\:ty-border-:focus{border-color:var(--ty-border-soft)!important}.focus\:ty-border--:focus{border-color:var(--ty-border-faint)!important}.focus\:ty-border-primary:focus{border-color:var(--ty-border-primary)!important}.focus\:ty-border-success:focus{border-color:var(--ty-border-success)!important}.focus\:ty-border-danger:focus{border-color:var(--ty-border-danger)!important}.focus\:ty-border-warning:focus{border-color:var(--ty-border-warning)!important}.focus\:ty-border-neutral:focus{border-color:var(--ty-border-neutral)!important}@media(min-width:640px){.sm\:ty-bg-primary{background-color:var(--ty-bg-primary)}.sm\:ty-text-primary{color:var(--ty-color-primary)}}@media(min-width:768px){.md\:ty-bg-primary{background-color:var(--ty-bg-primary)}.md\:ty-text-primary{color:var(--ty-color-primary)}}@media(min-width:1024px){.lg\:ty-bg-primary{background-color:var(--ty-bg-primary)}.lg\:ty-text-primary{color:var(--ty-color-primary)}}@media(max-width:768px){:root{--ty-font-sm: 1rem}}body{transition:scale var(--ty-modal-duration, .2s) ease-out}html.ty-modal-zoom body{scale:.99;transform-origin:50% 50%}