tyrell-components 1.0.0-RC12 → 1.0.0-RC13

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 (178) hide show
  1. package/README.md +1 -0
  2. package/css/tyrell-colors-static.css +316 -0
  3. package/css/tyrell-theme.css +1454 -0
  4. package/css/tyrell.css +108 -423
  5. package/dist/tyrell-colors-static.css +316 -0
  6. package/dist/tyrell-theme.css +1454 -0
  7. package/dist/tyrell.css +108 -423
  8. package/dist/tyrell.js +1 -1
  9. package/lib/components/button.d.ts +7 -0
  10. package/lib/components/button.d.ts.map +1 -1
  11. package/lib/components/button.js +12 -1
  12. package/lib/components/button.js.map +1 -1
  13. package/lib/components/calendar-month.d.ts +17 -0
  14. package/lib/components/calendar-month.d.ts.map +1 -1
  15. package/lib/components/calendar-month.js +121 -7
  16. package/lib/components/calendar-month.js.map +1 -1
  17. package/lib/components/calendar.d.ts +3 -1
  18. package/lib/components/calendar.d.ts.map +1 -1
  19. package/lib/components/calendar.js +19 -9
  20. package/lib/components/calendar.js.map +1 -1
  21. package/lib/components/checkbox.d.ts +4 -3
  22. package/lib/components/checkbox.d.ts.map +1 -1
  23. package/lib/components/checkbox.js +23 -35
  24. package/lib/components/checkbox.js.map +1 -1
  25. package/lib/components/copy.d.ts +4 -3
  26. package/lib/components/copy.d.ts.map +1 -1
  27. package/lib/components/copy.js +22 -21
  28. package/lib/components/copy.js.map +1 -1
  29. package/lib/components/date-picker.d.ts +12 -1
  30. package/lib/components/date-picker.d.ts.map +1 -1
  31. package/lib/components/date-picker.js +122 -32
  32. package/lib/components/date-picker.js.map +1 -1
  33. package/lib/components/input.d.ts +3 -2
  34. package/lib/components/input.d.ts.map +1 -1
  35. package/lib/components/input.js +24 -21
  36. package/lib/components/input.js.map +1 -1
  37. package/lib/components/modal.d.ts.map +1 -1
  38. package/lib/components/modal.js +22 -3
  39. package/lib/components/modal.js.map +1 -1
  40. package/lib/components/option.d.ts +0 -11
  41. package/lib/components/option.d.ts.map +1 -1
  42. package/lib/components/option.js +4 -103
  43. package/lib/components/option.js.map +1 -1
  44. package/lib/components/popup.d.ts.map +1 -1
  45. package/lib/components/popup.js +36 -2
  46. package/lib/components/popup.js.map +1 -1
  47. package/lib/components/radio.d.ts +5 -2
  48. package/lib/components/radio.d.ts.map +1 -1
  49. package/lib/components/radio.js +16 -5
  50. package/lib/components/radio.js.map +1 -1
  51. package/lib/components/select.d.ts +119 -9
  52. package/lib/components/select.d.ts.map +1 -1
  53. package/lib/components/select.js +426 -58
  54. package/lib/components/select.js.map +1 -1
  55. package/lib/components/selected-tags.d.ts +19 -6
  56. package/lib/components/selected-tags.d.ts.map +1 -1
  57. package/lib/components/selected-tags.js +43 -7
  58. package/lib/components/selected-tags.js.map +1 -1
  59. package/lib/components/switch.d.ts +4 -3
  60. package/lib/components/switch.d.ts.map +1 -1
  61. package/lib/components/switch.js +17 -29
  62. package/lib/components/switch.js.map +1 -1
  63. package/lib/components/tabs.d.ts.map +1 -1
  64. package/lib/components/tabs.js +180 -25
  65. package/lib/components/tabs.js.map +1 -1
  66. package/lib/components/tag.js +1 -1
  67. package/lib/components/tag.js.map +1 -1
  68. package/lib/components/tooltip.d.ts +4 -2
  69. package/lib/components/tooltip.d.ts.map +1 -1
  70. package/lib/components/tooltip.js +109 -70
  71. package/lib/components/tooltip.js.map +1 -1
  72. package/lib/components/wizard.d.ts.map +1 -1
  73. package/lib/components/wizard.js +22 -3
  74. package/lib/components/wizard.js.map +1 -1
  75. package/lib/index.d.ts +2 -1
  76. package/lib/index.d.ts.map +1 -1
  77. package/lib/index.js +2 -1
  78. package/lib/index.js.map +1 -1
  79. package/lib/styles/button.d.ts +36 -6
  80. package/lib/styles/button.d.ts.map +1 -1
  81. package/lib/styles/button.js +239 -36
  82. package/lib/styles/button.js.map +1 -1
  83. package/lib/styles/calendar-month.d.ts +3 -1
  84. package/lib/styles/calendar-month.d.ts.map +1 -1
  85. package/lib/styles/calendar-month.js +64 -9
  86. package/lib/styles/calendar-month.js.map +1 -1
  87. package/lib/styles/calendar-navigation.d.ts +1 -1
  88. package/lib/styles/calendar-navigation.d.ts.map +1 -1
  89. package/lib/styles/calendar-navigation.js +1 -1
  90. package/lib/styles/checkbox.d.ts +3 -1
  91. package/lib/styles/checkbox.d.ts.map +1 -1
  92. package/lib/styles/checkbox.js +33 -55
  93. package/lib/styles/checkbox.js.map +1 -1
  94. package/lib/styles/copy.d.ts +3 -1
  95. package/lib/styles/copy.d.ts.map +1 -1
  96. package/lib/styles/copy.js +29 -6
  97. package/lib/styles/copy.js.map +1 -1
  98. package/lib/styles/custom-scrollbar.d.ts +1 -1
  99. package/lib/styles/custom-scrollbar.d.ts.map +1 -1
  100. package/lib/styles/custom-scrollbar.js +2 -2
  101. package/lib/styles/date-picker.d.ts +3 -1
  102. package/lib/styles/date-picker.d.ts.map +1 -1
  103. package/lib/styles/date-picker.js +53 -99
  104. package/lib/styles/date-picker.js.map +1 -1
  105. package/lib/styles/file-upload.d.ts +1 -1
  106. package/lib/styles/file-upload.d.ts.map +1 -1
  107. package/lib/styles/file-upload.js +3 -3
  108. package/lib/styles/input.d.ts +3 -1
  109. package/lib/styles/input.d.ts.map +1 -1
  110. package/lib/styles/input.js +67 -123
  111. package/lib/styles/input.js.map +1 -1
  112. package/lib/styles/multiselect.d.ts +3 -1
  113. package/lib/styles/multiselect.d.ts.map +1 -1
  114. package/lib/styles/multiselect.js +26 -2
  115. package/lib/styles/multiselect.js.map +1 -1
  116. package/lib/styles/option.d.ts +1 -1
  117. package/lib/styles/option.d.ts.map +1 -1
  118. package/lib/styles/option.js +0 -51
  119. package/lib/styles/option.js.map +1 -1
  120. package/lib/styles/radio.d.ts +3 -1
  121. package/lib/styles/radio.d.ts.map +1 -1
  122. package/lib/styles/radio.js +24 -21
  123. package/lib/styles/radio.js.map +1 -1
  124. package/lib/styles/scroll-container.d.ts +1 -1
  125. package/lib/styles/scroll-container.d.ts.map +1 -1
  126. package/lib/styles/select-base.d.ts +9 -0
  127. package/lib/styles/select-base.d.ts.map +1 -0
  128. package/lib/styles/select-base.js +973 -0
  129. package/lib/styles/select-base.js.map +1 -0
  130. package/lib/styles/select.d.ts +3 -3
  131. package/lib/styles/select.d.ts.map +1 -1
  132. package/lib/styles/select.js +98 -30
  133. package/lib/styles/select.js.map +1 -1
  134. package/lib/styles/step.d.ts +1 -1
  135. package/lib/styles/step.d.ts.map +1 -1
  136. package/lib/styles/switch.d.ts +3 -1
  137. package/lib/styles/switch.d.ts.map +1 -1
  138. package/lib/styles/switch.js +25 -10
  139. package/lib/styles/switch.js.map +1 -1
  140. package/lib/styles/tab.d.ts +1 -1
  141. package/lib/styles/tab.d.ts.map +1 -1
  142. package/lib/styles/tabs.d.ts +1 -1
  143. package/lib/styles/tabs.d.ts.map +1 -1
  144. package/lib/styles/tabs.js +71 -1
  145. package/lib/styles/tabs.js.map +1 -1
  146. package/lib/styles/tag.d.ts.map +1 -1
  147. package/lib/styles/tag.js +4 -1
  148. package/lib/styles/tag.js.map +1 -1
  149. package/lib/styles/textarea.d.ts +1 -1
  150. package/lib/styles/textarea.d.ts.map +1 -1
  151. package/lib/styles/textarea.js +5 -5
  152. package/lib/styles/tooltip.d.ts +4 -2
  153. package/lib/styles/tooltip.d.ts.map +1 -1
  154. package/lib/styles/tooltip.js +4 -119
  155. package/lib/styles/tooltip.js.map +1 -1
  156. package/lib/styles/wizard.d.ts +1 -1
  157. package/lib/styles/wizard.d.ts.map +1 -1
  158. package/lib/styles/wizard.js +18 -6
  159. package/lib/styles/wizard.js.map +1 -1
  160. package/lib/types/common.d.ts +1 -1
  161. package/lib/types/common.d.ts.map +1 -1
  162. package/lib/types/common.js +3 -1
  163. package/lib/types/common.js.map +1 -1
  164. package/lib/utils/icons.d.ts +10 -0
  165. package/lib/utils/icons.d.ts.map +1 -0
  166. package/lib/utils/icons.js +10 -0
  167. package/lib/utils/icons.js.map +1 -0
  168. package/lib/utils/loader-registry.d.ts +2 -2
  169. package/lib/utils/loader-registry.js +2 -2
  170. package/lib/utils/positioning.d.ts +31 -0
  171. package/lib/utils/positioning.d.ts.map +1 -1
  172. package/lib/utils/positioning.js +22 -3
  173. package/lib/utils/positioning.js.map +1 -1
  174. package/lib/version.d.ts +1 -1
  175. package/lib/version.js +1 -1
  176. package/package.json +7 -4
  177. package/css/tyrell-brand.css +0 -1015
  178. package/dist/tyrell-brand.css +0 -1015
package/css/tyrell.css CHANGED
@@ -124,58 +124,10 @@ CSS VARIABLES - DESIGN TOKENS
124
124
 
125
125
  /* Default theme (light) */
126
126
  html {
127
- /* =================================================================
128
- 5-VARIANT COLOR SYSTEM
129
- Simplified from 7 variants to 5 practical variants:
130
- -strong = Strong emphasis - active states, strong borders
131
- -bold = Moderate emphasis - hover states, focus rings
132
- = Base color - default appearance
133
- -soft = Reduced emphasis - muted backgrounds, secondary
134
- -faint = Minimal emphasis - subtle hints, disabled states
135
- ================================================================= */
136
-
137
- /* Primary */
138
- --ty-color-primary-strong: #163793;
139
- --ty-color-primary-bold: #304c9f;
140
- --ty-color-primary: #466bce;
141
- --ty-color-primary-soft: #60a5fa;
142
- --ty-color-primary-faint: #93c5fd;
143
-
144
- /* Secondary */
145
- --ty-color-secondary-strong: #7442c2;
146
- --ty-color-secondary-bold: #8153cf;
147
- --ty-color-secondary: #9774e7;
148
- --ty-color-secondary-soft: #a78bfa;
149
- --ty-color-secondary-faint: #c4b5fd;
150
-
151
- /* Success */
152
- --ty-color-success-strong: #177858;
153
- --ty-color-success-bold: #3e9779;
154
- --ty-color-success: #3eaa86;
155
- --ty-color-success-soft: #64b399;
156
- --ty-color-success-faint: #7fd4b2;
157
-
158
- /* Danger */
159
- --ty-color-danger-strong: #b91c1c;
160
- --ty-color-danger-bold: #dc2626;
161
- --ty-color-danger: #ef4444;
162
- --ty-color-danger-soft: #f87171;
163
- --ty-color-danger-faint: #fca5a5;
164
-
165
- /* Warning */
166
- --ty-color-warning-strong: #e86400;
167
- --ty-color-warning-bold: #ee7f00;
168
- --ty-color-warning: #f59e0b;
169
- --ty-color-warning-soft: #fbbf24;
170
- --ty-color-warning-faint: #fcd34d;
171
-
172
- /* Neutral */
173
- --ty-color-neutral-strong: #000000;
174
- --ty-color-neutral-bold: #000000;
175
- --ty-color-neutral: #111827;
176
- --ty-color-neutral-soft: #374151;
177
- --ty-color-neutral-faint: #9ca3af;
178
-
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. */
179
131
 
180
132
  /* =================================================================
181
133
  BACKGROUND COLORS
@@ -195,58 +147,13 @@ BACKGROUND COLORS
195
147
  /* Focus ring gap - matches page background for button focus ring effect */
196
148
  --ty-focus-ring-gap: #ffffff;
197
149
 
198
- /* Primary backgrounds */
199
- --ty-bg-primary: #e3eefc;
200
- --ty-bg-primary-bold: #d5e4f8;
201
- --ty-bg-primary-soft: #eff6ff;
202
-
203
- /* Secondary backgrounds */
204
- --ty-bg-secondary: #e9d5ff;
205
- --ty-bg-secondary-bold: #ddd6fe;
206
- --ty-bg-secondary-soft: #f3e8ff;
207
-
208
- /* Success backgrounds */
209
- --ty-bg-success: #d1fae5;
210
- --ty-bg-success-bold: #a7f3d0;
211
- --ty-bg-success-soft: #ecfdf5;
212
-
213
- /* Danger backgrounds */
214
- --ty-bg-danger: #fee2e2;
215
- --ty-bg-danger-bold: #fecaca;
216
- --ty-bg-danger-soft: #fef2f2;
217
-
218
- /* Warning backgrounds */
219
- --ty-bg-warning: #fef3c7;
220
- --ty-bg-warning-bold: #fde68a;
221
- --ty-bg-warning-soft: #fffbeb;
222
-
223
- /* Neutral backgrounds */
224
- --ty-bg-neutral: #e0e0e0;
225
- --ty-bg-neutral-bold: #cecece;
226
- --ty-bg-neutral-soft: #ededed;
227
-
228
-
229
150
  /* =================================================================
230
151
  BORDER COLORS
231
152
  ================================================================= */
232
153
 
233
- --ty-border: #e5e7eb;
234
- --ty-border-bold: #d1d5db;
235
- --ty-border-strong: #6b7280;
236
- --ty-border-soft: #f3f4f6;
237
- --ty-border-faint: #fafafa;
238
-
239
154
  /* Border width — used as fallback by surface utilities (--ty-{surface}-border-width) */
240
155
  --ty-border-width: 1px;
241
156
 
242
- /* Semantic borders */
243
- --ty-border-primary: var(--ty-color-primary);
244
- --ty-border-secondary: var(--ty-color-secondary);
245
- --ty-border-success: var(--ty-color-success);
246
- --ty-border-danger: var(--ty-color-danger);
247
- --ty-border-warning: var(--ty-color-warning);
248
- --ty-border-neutral: var(--ty-color-neutral);
249
-
250
157
  /* =================================================================
251
158
  SCROLLBAR
252
159
  ================================================================= */
@@ -261,19 +168,11 @@ SCROLLBAR
261
168
  SURFACE SYSTEM
262
169
  ================================================================= */
263
170
 
264
- --ty-surface-canvas: #fcfcfc;
265
- --ty-surface-content: #ffffff;
266
- --ty-surface-elevated: #ffffff;
267
- --ty-surface-floating: #ffffff;
268
- --ty-surface-input: #ffffff;
269
-
270
171
  /* Surface borders — opt-in. Set color to make a surface's border visible.
271
172
  Width and style fall back to --ty-border-width and `solid` if unset. */
272
- --ty-elevated-border: #e5e7eb;
273
173
  --ty-elevated-border-width: var(--ty-border-width);
274
174
  --ty-elevated-border-style: solid;
275
175
 
276
- --ty-floating-border: #e5e7eb;
277
176
  --ty-floating-border-width: var(--ty-border-width);
278
177
  --ty-floating-border-style: solid;
279
178
 
@@ -281,12 +180,12 @@ SURFACE SYSTEM
281
180
  --ty-canvas-border-width: var(--ty-border-width);
282
181
  --ty-canvas-border-style: solid;
283
182
 
284
- --ty-content-border: #e5e7eb;
285
183
  --ty-content-border-width: var(--ty-border-width);
286
184
  --ty-content-border-style: solid;
287
185
 
288
- /* --ty-input-border is already declared above as a color token used by
289
- <ty-input> shadow DOM; .ty-input utility reuses it. Width/style still here. */
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. */
290
189
  --ty-input-border-width: var(--ty-border-width);
291
190
  --ty-input-border-style: solid;
292
191
 
@@ -297,17 +196,6 @@ SURFACE SYSTEM
297
196
  --ty-divide-color: var(--ty-border);
298
197
  --ty-divide-width: var(--ty-border-width);
299
198
 
300
- /* =================================================================
301
- TEXT HIERARCHY
302
- ================================================================= */
303
-
304
- /* Text hierarchy - emphasis based, not semantic */
305
- --ty-text: #111827;
306
- --ty-text-bold: #000000;
307
- --ty-text-strong: #000000;
308
- --ty-text-soft: #374151;
309
- --ty-text-faint: #9ca3af;
310
-
311
199
  /* =================================================================
312
200
  COMPONENT TOKENS
313
201
  ================================================================= */
@@ -332,78 +220,8 @@ COMPONENT TOKENS
332
220
  --ty-modal-full-height: 95vh;
333
221
 
334
222
  /* Input component tokens */
335
- --ty-input-bg: #ffffff;
336
- --ty-input-color: #111827;
337
- --ty-input-border: #e5e7eb;
338
- --ty-input-border-hover: #d1d5db;
339
- --ty-input-border-focus: var(--ty-color-primary);
340
- --ty-input-shadow-focus: rgba(59, 130, 246, 0.1);
341
- --ty-input-placeholder: #9ca3af;
342
- --ty-input-disabled-bg: #f9fafb;
343
- --ty-input-disabled-border: #e5e7eb;
344
- --ty-input-disabled-color: #9ca3af;
345
223
  --ty-label-color: #374151;
346
224
 
347
- /* Input semantic states */
348
- --ty-input-success-border: var(--ty-color-success);
349
- --ty-input-danger-border: var(--ty-color-danger);
350
- --ty-input-warning-border: var(--ty-color-warning);
351
-
352
- /* =================================================================
353
- SOLID BUTTON FILLS — plain default values (the contract). The smart
354
- per-state derivation (hover/active/tone via OKLCH) lives in the theme
355
- engines (tyrell-brand.css / tyrell-simple.css), not here. hover/active
356
- alias to -strong as a simple default; a theme overrides them.
357
- ================================================================= */
358
-
359
- /* Primary */
360
- --ty-solid-primary: #4076b9;
361
- --ty-solid-primary-strong: var(--ty-color-primary-bold);
362
- --ty-solid-primary-soft: #7ea7d9;
363
- --ty-solid-primary-hover: var(--ty-solid-primary-strong);
364
- --ty-solid-primary-active: var(--ty-solid-primary-strong);
365
- --ty-solid-primary-fg: white;
366
-
367
- /* Secondary */
368
- --ty-solid-secondary: #7e67b4;
369
- --ty-solid-secondary-strong: #7d58d1;
370
- --ty-solid-secondary-soft: #9f8ec5;
371
- --ty-solid-secondary-hover: var(--ty-solid-secondary-strong);
372
- --ty-solid-secondary-active: var(--ty-solid-secondary-strong);
373
- --ty-solid-secondary-fg: white;
374
-
375
- /* Success */
376
- --ty-solid-success: #3bb68d;
377
- --ty-solid-success-strong: #27956e;
378
- --ty-solid-success-soft: #69b99e;
379
- --ty-solid-success-hover: var(--ty-solid-success-strong);
380
- --ty-solid-success-active: var(--ty-solid-success-strong);
381
- --ty-solid-success-fg: white;
382
-
383
- /* Danger */
384
- --ty-solid-danger: #df5b5b;
385
- --ty-solid-danger-strong: #cc3e3e;
386
- --ty-solid-danger-soft: #d57a7a;
387
- --ty-solid-danger-hover: var(--ty-solid-danger-strong);
388
- --ty-solid-danger-active: var(--ty-solid-danger-strong);
389
- --ty-solid-danger-fg: white;
390
-
391
- /* Warning */
392
- --ty-solid-warning: #e1a644;
393
- --ty-solid-warning-strong: #f59e0b;
394
- --ty-solid-warning-soft: #fbc56d;
395
- --ty-solid-warning-hover: var(--ty-solid-warning-strong);
396
- --ty-solid-warning-active: var(--ty-solid-warning-strong);
397
- --ty-solid-warning-fg: white;
398
-
399
- /* Neutral */
400
- --ty-solid-neutral: #414141;
401
- --ty-solid-neutral-strong: #000000;
402
- --ty-solid-neutral-soft: #6e6e6e;
403
- --ty-solid-neutral-hover: var(--ty-solid-neutral-strong);
404
- --ty-solid-neutral-active: var(--ty-solid-neutral-strong);
405
- --ty-solid-neutral-fg: white;
406
-
407
225
  /* =================================================================
408
226
  DESIGN SYSTEM TOKENS
409
227
  ================================================================= */
@@ -503,6 +321,39 @@ DESIGN SYSTEM TOKENS
503
321
  --ty-font-bold: 680;
504
322
  --ty-font-extrabold: 800;
505
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
+
506
357
  --ty-line-height-none: 1;
507
358
  --ty-line-height-tight: 1.25;
508
359
  --ty-line-height-snug: 1.375;
@@ -510,26 +361,33 @@ DESIGN SYSTEM TOKENS
510
361
  --ty-line-height-relaxed: 1.625;
511
362
  --ty-line-height-loose: 2;
512
363
 
513
- /* Transitions */
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. */
514
370
  --ty-transition-none: none;
515
- --ty-transition-all: all 150ms cubic-bezier(0.4, 0, 0.2, 1);
516
- --ty-transition-colors:
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,
517
373
  bg-color, border-color, color, fill,
518
- stroke 150ms cubic-bezier(0.4, 0, 0.2, 1);
519
- --ty-transition-shadow: box-shadow 150ms cubic-bezier(0.4, 0, 0.2, 1);
520
- --ty-transition-transform: transform 150ms cubic-bezier(0.4, 0, 0.2, 1);
521
-
522
- /* Component Sizes */
523
- --ty-size-xs: 1.5rem;
524
- /* 24px */
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. */
525
385
  --ty-size-sm: 2rem;
526
386
  /* 32px */
527
- --ty-size-md: 2.5rem;
387
+ --ty-size-md: 2.25rem;
388
+ /* 36px */
389
+ --ty-size-lg: 2.5rem;
528
390
  /* 40px */
529
- --ty-size-lg: 3rem;
530
- /* 48px */
531
- --ty-size-xl: 3.5rem;
532
- /* 56px */
533
391
 
534
392
  /* Z-Index Scale */
535
393
  --ty-z-auto: auto;
@@ -564,6 +422,34 @@ DESIGN SYSTEM TOKENS
564
422
  transparent
565
423
  );
566
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 */
567
453
  }
568
454
 
569
455
  /* =================================================================
@@ -572,53 +458,20 @@ DARK THEME OVERRIDES
572
458
 
573
459
  html.dark,
574
460
  html[data-theme="dark"] {
575
- /* =================================================================
576
- 5-VARIANT COLOR SYSTEM - DARK THEME
577
- Emphasis logic inverts: lighter = more emphasis
578
- ================================================================= */
579
-
580
- /* Primary */
581
- --ty-color-primary-strong: #9cbde5;
582
- --ty-color-primary-bold: #6c9bd5;
583
- --ty-color-primary: #4976ae;
584
- --ty-color-primary-soft: #4b698b;
585
- --ty-color-primary-faint: #445b77;
586
-
587
- /* Secondary */
588
- --ty-color-secondary-strong: #ddd6fe;
589
- --ty-color-secondary-bold: #c4b5fd;
590
- --ty-color-secondary: #a78bfa;
591
- --ty-color-secondary-soft: #8269bc;
592
- --ty-color-secondary-faint: #76619f;
593
-
594
- /* Success */
595
- --ty-color-success-strong: #c2f0df;
596
- --ty-color-success-bold: #6ee7b7;
597
- --ty-color-success: #3aba8b;
598
- --ty-color-success-soft: #459679;
599
- --ty-color-success-faint: #1b795c;
600
-
601
- /* Danger */
602
- --ty-color-danger-strong: #ffabab;
603
- --ty-color-danger-bold: #e58787;
604
- --ty-color-danger: #d06f6f;
605
- --ty-color-danger-soft: #b06666;
606
- --ty-color-danger-faint: #aa6e6e;
607
-
608
- /* Warning */
609
- --ty-color-warning-strong: #fde68a;
610
- --ty-color-warning-bold: #fcd34d;
611
- --ty-color-warning: #fbbf24;
612
- --ty-color-warning-soft: #f59e0b;
613
- --ty-color-warning-faint: #a06726;
614
-
615
- /* Neutral */
616
- --ty-color-neutral-strong: #ffffff;
617
- --ty-color-neutral-bold: #f9fafb;
618
- --ty-color-neutral: #d6d6d6;
619
- --ty-color-neutral-soft: #696969;
620
- --ty-color-neutral-faint: #474747;
621
-
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;
622
475
 
623
476
  /* Backgrounds for dark mode */
624
477
  --ty-bg-faint: #0f1419;
@@ -630,39 +483,6 @@ Emphasis logic inverts: lighter = more emphasis
630
483
  /* Focus ring gap */
631
484
  --ty-focus-ring-gap: #1f2937;
632
485
 
633
- /* Semantic backgrounds - much darker in dark mode */
634
- --ty-bg-primary-bold: #43517a;
635
- --ty-bg-primary: #394159;
636
- --ty-bg-primary-soft: #323a4f;
637
-
638
- --ty-bg-secondary-bold: #58368e;
639
- --ty-bg-secondary: #4a3c65;
640
- --ty-bg-secondary-soft: #3b3645;
641
-
642
- --ty-bg-success: #3a4442;
643
- --ty-bg-success-bold: #405752;
644
- --ty-bg-success-soft: #2f3b38;
645
-
646
- --ty-bg-danger-bold: #853535;
647
- --ty-bg-danger: #522828;
648
- --ty-bg-danger-soft: #483c3c;
649
-
650
- --ty-bg-warning-bold: #743953;
651
- --ty-bg-warning: #694555;
652
- --ty-bg-warning-soft: #45333b;
653
-
654
- --ty-bg-neutral-bold: #414141;
655
- --ty-bg-neutral: #323232;
656
- --ty-bg-neutral-soft: #242424;
657
-
658
-
659
- /* Borders for dark mode */
660
- --ty-border-strong: #8c8c8c;
661
- --ty-border-bold: #666666;
662
- --ty-border: #535353;
663
- --ty-border-soft: #1f2937;
664
- --ty-border-faint: #030712;
665
-
666
486
  /* Scrollbar - dark mode */
667
487
  --ty-scrollbar-thumb: rgba(255, 255, 255, 0.13);
668
488
  --ty-scrollbar-thumb-hover: rgba(255, 255, 255, 0.22);
@@ -670,23 +490,6 @@ Emphasis logic inverts: lighter = more emphasis
670
490
  --ty-scrollbar-track: transparent;
671
491
  --ty-scrollbar-track-hover: rgba(255, 255, 255, 0.04);
672
492
 
673
- --ty-surface-canvas: black;
674
- --ty-surface-content: #1a1a1a;
675
- --ty-surface-elevated: #282828;
676
- --ty-surface-floating: #343434;
677
- --ty-surface-input: #1f2937;
678
-
679
- --ty-content-border: #030712;
680
- --ty-elevated-border: #414141;
681
- --ty-border: #3e3e3e;
682
- --ty-floating-border: #494949;
683
-
684
- --ty-text-bold: #f9fafb;
685
- --ty-text-strong: #ffffff;
686
- --ty-text: #d6d6d6;
687
- --ty-text-soft: #7f8590;
688
- --ty-text-faint: #555a63;
689
-
690
493
  /* Shadows need to be darker/more prominent in dark mode */
691
494
  --ty-shadow-sm: 0 1px 2px 0 rgba(0, 0, 0, 0.2);
692
495
  --ty-shadow-base:
@@ -699,61 +502,7 @@ Emphasis logic inverts: lighter = more emphasis
699
502
  0 20px 25px -5px rgba(0, 0, 0, 0.3), 0 8px 10px -6px rgba(0, 0, 0, 0.3);
700
503
  --ty-shadow-2xl: 0 25px 50px -12px rgba(0, 0, 0, 0.5);
701
504
 
702
- /* Solid button fills — plain dark defaults. hover/active alias -strong;
703
- theme engines override with smart per-state derivation. */
704
- --ty-solid-primary: #3e536c;
705
- --ty-solid-primary-strong: #426084;
706
- --ty-solid-primary-soft: #343f4c;
707
- --ty-solid-primary-hover: var(--ty-solid-primary-strong);
708
- --ty-solid-primary-active: var(--ty-solid-primary-strong);
709
- --ty-solid-primary-fg: white;
710
-
711
- --ty-solid-secondary: #7e67b4;
712
- --ty-solid-secondary-strong: #8269bc;
713
- --ty-solid-secondary-soft: #52466a;
714
- --ty-solid-secondary-hover: var(--ty-solid-secondary-strong);
715
- --ty-solid-secondary-active: var(--ty-solid-secondary-strong);
716
- --ty-solid-secondary-fg: white;
717
-
718
- --ty-solid-success: #3bb68d;
719
- --ty-solid-success-strong: #459679;
720
- --ty-solid-success-soft: #285748;
721
- --ty-solid-success-hover: var(--ty-solid-success-strong);
722
- --ty-solid-success-active: var(--ty-solid-success-strong);
723
- --ty-solid-success-fg: white;
724
-
725
- --ty-solid-danger: #df5b5b;
726
- --ty-solid-danger-strong: #cc3e3e;
727
- --ty-solid-danger-soft: #875656;
728
- --ty-solid-danger-hover: var(--ty-solid-danger-strong);
729
- --ty-solid-danger-active: var(--ty-solid-danger-strong);
730
- --ty-solid-danger-fg: white;
731
-
732
- --ty-solid-warning: #e1a644;
733
- --ty-solid-warning-strong: #f59e0b;
734
- --ty-solid-warning-soft: #8b6334;
735
- --ty-solid-warning-hover: var(--ty-solid-warning-strong);
736
- --ty-solid-warning-active: var(--ty-solid-warning-strong);
737
- --ty-solid-warning-fg: white;
738
-
739
- --ty-solid-neutral: #414141;
740
- --ty-solid-neutral-strong: #4c4c4c;
741
- --ty-solid-neutral-soft: #2a2a2a;
742
- --ty-solid-neutral-hover: var(--ty-solid-neutral-strong);
743
- --ty-solid-neutral-active: var(--ty-solid-neutral-strong);
744
- --ty-solid-neutral-fg: white;
745
-
746
505
  /* Input component tokens - dark mode */
747
- --ty-input-bg: #1b1b1b;
748
- --ty-input-color: #f9fafb;
749
- --ty-input-border: #3a3a3a;
750
- --ty-input-border-hover: #505050;
751
- --ty-input-border-focus: var(--ty-color-primary);
752
- --ty-input-shadow-focus: rgba(96, 165, 250, 0.1);
753
- --ty-input-placeholder: #717171;
754
- --ty-input-disabled-bg: #282828;
755
- --ty-input-disabled-border: #2e2e2e;
756
- --ty-input-disabled-color: #717171;
757
506
  --ty-label-color: #d1d5db;
758
507
 
759
508
  /* Modal - dark mode */
@@ -777,6 +526,10 @@ Emphasis logic inverts: lighter = more emphasis
777
526
  rgba(0, 0, 0, 0),
778
527
  transparent
779
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) */
780
533
  }
781
534
 
782
535
  /* =================================================================
@@ -836,11 +589,6 @@ html.dark textarea::-moz-selection {
836
589
  color: var(--ty-color-primary-strong);
837
590
  }
838
591
 
839
- .ty-selection-secondary ::selection,
840
- .ty-selection-secondary::-moz-selection {
841
- background-color: var(--ty-color-secondary-soft);
842
- color: var(--ty-color-secondary-strong);
843
- }
844
592
 
845
593
  .ty-selection-success ::selection,
846
594
  .ty-selection-success::-moz-selection {
@@ -873,11 +621,6 @@ html.dark .ty-selection-primary::-moz-selection {
873
621
  color: white;
874
622
  }
875
623
 
876
- html.dark .ty-selection-secondary ::selection,
877
- html.dark .ty-selection-secondary::-moz-selection {
878
- background-color: var(--ty-color-secondary);
879
- color: white;
880
- }
881
624
 
882
625
  html.dark .ty-selection-success ::selection,
883
626
  html.dark .ty-selection-success::-moz-selection {
@@ -1034,17 +777,8 @@ SEMANTIC BACKGROUND UTILITIES
1034
777
  background-color: var(--ty-bg-primary-soft);
1035
778
  }
1036
779
 
1037
- .ty-bg-secondary {
1038
- background-color: var(--ty-bg-secondary);
1039
- }
1040
780
 
1041
- .ty-bg-secondary\+ {
1042
- background-color: var(--ty-bg-secondary-bold);
1043
- }
1044
781
 
1045
- .ty-bg-secondary- {
1046
- background-color: var(--ty-bg-secondary-soft);
1047
- }
1048
782
 
1049
783
  .ty-bg-success {
1050
784
  background-color: var(--ty-bg-success);
@@ -1144,26 +878,9 @@ SEMANTIC TEXT COLORS - 5-VARIANT SYSTEM
1144
878
  color: var(--ty-color-primary-faint) !important;
1145
879
  }
1146
880
 
1147
- /* Secondary text colors */
1148
- .ty-text-secondary\+\+ {
1149
- color: var(--ty-color-secondary-strong) !important;
1150
- }
1151
881
 
1152
- .ty-text-secondary\+ {
1153
- color: var(--ty-color-secondary-bold) !important;
1154
- }
1155
882
 
1156
- .ty-text-secondary {
1157
- color: var(--ty-color-secondary) !important;
1158
- }
1159
883
 
1160
- .ty-text-secondary- {
1161
- color: var(--ty-color-secondary-soft) !important;
1162
- }
1163
-
1164
- .ty-text-secondary-- {
1165
- color: var(--ty-color-secondary-faint) !important;
1166
- }
1167
884
 
1168
885
  /* Success text colors */
1169
886
  .ty-text-success\+\+ {
@@ -1279,9 +996,6 @@ BORDER UTILITIES
1279
996
  border-color: var(--ty-border-primary);
1280
997
  }
1281
998
 
1282
- .ty-border-secondary {
1283
- border-color: var(--ty-border-secondary);
1284
- }
1285
999
 
1286
1000
  .ty-border-success {
1287
1001
  border-color: var(--ty-border-success);
@@ -1368,13 +1082,7 @@ INTERACTIVE STATES
1368
1082
  background-color: var(--ty-bg-primary-bold) !important;
1369
1083
  }
1370
1084
 
1371
- .hover\:ty-bg-secondary:hover {
1372
- background-color: var(--ty-bg-secondary) !important;
1373
- }
1374
1085
 
1375
- .hover\:ty-bg-secondary\+:hover {
1376
- background-color: var(--ty-bg-secondary-bold) !important;
1377
- }
1378
1086
 
1379
1087
  .hover\:ty-bg-success:hover {
1380
1088
  background-color: var(--ty-bg-success) !important;
@@ -1439,26 +1147,9 @@ INTERACTIVE STATES
1439
1147
  color: var(--ty-color-primary-faint) !important;
1440
1148
  }
1441
1149
 
1442
- /* Secondary text hover states */
1443
- .hover\:ty-text-secondary\+\+:hover {
1444
- color: var(--ty-color-secondary-strong) !important;
1445
- }
1446
-
1447
- .hover\:ty-text-secondary\+:hover {
1448
- color: var(--ty-color-secondary-bold) !important;
1449
- }
1450
1150
 
1451
- .hover\:ty-text-secondary:hover {
1452
- color: var(--ty-color-secondary) !important;
1453
- }
1454
1151
 
1455
- .hover\:ty-text-secondary-:hover {
1456
- color: var(--ty-color-secondary-soft) !important;
1457
- }
1458
1152
 
1459
- .hover\:ty-text-secondary--:hover {
1460
- color: var(--ty-color-secondary-faint) !important;
1461
- }
1462
1153
 
1463
1154
  /* Success text hover states */
1464
1155
  .hover\:ty-text-success\+\+:hover {
@@ -1571,9 +1262,6 @@ INTERACTIVE STATES
1571
1262
  border-color: var(--ty-border-primary) !important;
1572
1263
  }
1573
1264
 
1574
- .hover\:ty-border-secondary:hover {
1575
- border-color: var(--ty-border-secondary) !important;
1576
- }
1577
1265
 
1578
1266
  .hover\:ty-border-success:hover {
1579
1267
  border-color: var(--ty-border-success) !important;
@@ -1616,9 +1304,6 @@ INTERACTIVE STATES
1616
1304
  border-color: var(--ty-border-primary) !important;
1617
1305
  }
1618
1306
 
1619
- .focus\:ty-border-secondary:focus {
1620
- border-color: var(--ty-border-secondary) !important;
1621
- }
1622
1307
 
1623
1308
  .focus\:ty-border-success:focus {
1624
1309
  border-color: var(--ty-border-success) !important;