tyrell-components 1.0.0-RC11 → 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 (240) 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 +112 -420
  5. package/dist/tyrell-colors-static.css +316 -0
  6. package/dist/tyrell-theme.css +1454 -0
  7. package/dist/tyrell.css +112 -420
  8. package/dist/tyrell.js +1 -1
  9. package/lib/base/ty-component.d.ts +7 -0
  10. package/lib/base/ty-component.d.ts.map +1 -1
  11. package/lib/base/ty-component.js +27 -0
  12. package/lib/base/ty-component.js.map +1 -1
  13. package/lib/components/button.d.ts +16 -1
  14. package/lib/components/button.d.ts.map +1 -1
  15. package/lib/components/button.js +34 -4
  16. package/lib/components/button.js.map +1 -1
  17. package/lib/components/calendar-month.d.ts +23 -0
  18. package/lib/components/calendar-month.d.ts.map +1 -1
  19. package/lib/components/calendar-month.js +168 -11
  20. package/lib/components/calendar-month.js.map +1 -1
  21. package/lib/components/calendar-navigation.d.ts +31 -5
  22. package/lib/components/calendar-navigation.d.ts.map +1 -1
  23. package/lib/components/calendar-navigation.js +71 -31
  24. package/lib/components/calendar-navigation.js.map +1 -1
  25. package/lib/components/calendar.d.ts +17 -2
  26. package/lib/components/calendar.d.ts.map +1 -1
  27. package/lib/components/calendar.js +83 -12
  28. package/lib/components/calendar.js.map +1 -1
  29. package/lib/components/checkbox.d.ts +14 -3
  30. package/lib/components/checkbox.d.ts.map +1 -1
  31. package/lib/components/checkbox.js +86 -57
  32. package/lib/components/checkbox.js.map +1 -1
  33. package/lib/components/copy.d.ts +14 -3
  34. package/lib/components/copy.d.ts.map +1 -1
  35. package/lib/components/copy.js +47 -25
  36. package/lib/components/copy.js.map +1 -1
  37. package/lib/components/date-picker.d.ts +26 -1
  38. package/lib/components/date-picker.d.ts.map +1 -1
  39. package/lib/components/date-picker.js +151 -32
  40. package/lib/components/date-picker.js.map +1 -1
  41. package/lib/components/input.d.ts +17 -2
  42. package/lib/components/input.d.ts.map +1 -1
  43. package/lib/components/input.js +104 -25
  44. package/lib/components/input.js.map +1 -1
  45. package/lib/components/modal.d.ts.map +1 -1
  46. package/lib/components/modal.js +28 -3
  47. package/lib/components/modal.js.map +1 -1
  48. package/lib/components/option.d.ts +0 -27
  49. package/lib/components/option.d.ts.map +1 -1
  50. package/lib/components/option.js +11 -102
  51. package/lib/components/option.js.map +1 -1
  52. package/lib/components/popup.d.ts.map +1 -1
  53. package/lib/components/popup.js +36 -2
  54. package/lib/components/popup.js.map +1 -1
  55. package/lib/components/radio.d.ts +6 -2
  56. package/lib/components/radio.d.ts.map +1 -1
  57. package/lib/components/radio.js +55 -13
  58. package/lib/components/radio.js.map +1 -1
  59. package/lib/components/scroll-container.d.ts +16 -0
  60. package/lib/components/scroll-container.d.ts.map +1 -1
  61. package/lib/components/scroll-container.js +105 -1
  62. package/lib/components/scroll-container.js.map +1 -1
  63. package/lib/components/select.d.ts +550 -0
  64. package/lib/components/select.d.ts.map +1 -0
  65. package/lib/components/select.js +2115 -0
  66. package/lib/components/select.js.map +1 -0
  67. package/lib/components/selected-tags.d.ts +93 -0
  68. package/lib/components/selected-tags.d.ts.map +1 -0
  69. package/lib/components/selected-tags.js +286 -0
  70. package/lib/components/selected-tags.js.map +1 -0
  71. package/lib/components/switch.d.ts +6 -3
  72. package/lib/components/switch.d.ts.map +1 -1
  73. package/lib/components/switch.js +54 -36
  74. package/lib/components/switch.js.map +1 -1
  75. package/lib/components/tabs.d.ts.map +1 -1
  76. package/lib/components/tabs.js +190 -25
  77. package/lib/components/tabs.js.map +1 -1
  78. package/lib/components/tag.d.ts +9 -1
  79. package/lib/components/tag.d.ts.map +1 -1
  80. package/lib/components/tag.js +41 -5
  81. package/lib/components/tag.js.map +1 -1
  82. package/lib/components/textarea.d.ts +3 -0
  83. package/lib/components/textarea.d.ts.map +1 -1
  84. package/lib/components/textarea.js +61 -6
  85. package/lib/components/textarea.js.map +1 -1
  86. package/lib/components/tooltip.d.ts +4 -2
  87. package/lib/components/tooltip.d.ts.map +1 -1
  88. package/lib/components/tooltip.js +109 -70
  89. package/lib/components/tooltip.js.map +1 -1
  90. package/lib/components/wizard.d.ts.map +1 -1
  91. package/lib/components/wizard.js +22 -3
  92. package/lib/components/wizard.js.map +1 -1
  93. package/lib/index.d.ts +3 -2
  94. package/lib/index.d.ts.map +1 -1
  95. package/lib/index.js +3 -2
  96. package/lib/index.js.map +1 -1
  97. package/lib/styles/button.d.ts +41 -6
  98. package/lib/styles/button.d.ts.map +1 -1
  99. package/lib/styles/button.js +294 -254
  100. package/lib/styles/button.js.map +1 -1
  101. package/lib/styles/calendar-month.d.ts +3 -1
  102. package/lib/styles/calendar-month.d.ts.map +1 -1
  103. package/lib/styles/calendar-month.js +100 -67
  104. package/lib/styles/calendar-month.js.map +1 -1
  105. package/lib/styles/calendar-navigation.d.ts +1 -1
  106. package/lib/styles/calendar-navigation.d.ts.map +1 -1
  107. package/lib/styles/calendar-navigation.js +20 -28
  108. package/lib/styles/calendar-navigation.js.map +1 -1
  109. package/lib/styles/checkbox.d.ts +7 -5
  110. package/lib/styles/checkbox.d.ts.map +1 -1
  111. package/lib/styles/checkbox.js +125 -8
  112. package/lib/styles/checkbox.js.map +1 -1
  113. package/lib/styles/copy.d.ts +3 -1
  114. package/lib/styles/copy.d.ts.map +1 -1
  115. package/lib/styles/copy.js +61 -6
  116. package/lib/styles/copy.js.map +1 -1
  117. package/lib/styles/custom-scrollbar.d.ts +1 -1
  118. package/lib/styles/custom-scrollbar.d.ts.map +1 -1
  119. package/lib/styles/custom-scrollbar.js +2 -2
  120. package/lib/styles/date-picker.d.ts +3 -1
  121. package/lib/styles/date-picker.d.ts.map +1 -1
  122. package/lib/styles/date-picker.js +65 -103
  123. package/lib/styles/date-picker.js.map +1 -1
  124. package/lib/styles/file-upload.d.ts +1 -1
  125. package/lib/styles/file-upload.d.ts.map +1 -1
  126. package/lib/styles/file-upload.js +3 -3
  127. package/lib/styles/input.d.ts +3 -1
  128. package/lib/styles/input.d.ts.map +1 -1
  129. package/lib/styles/input.js +93 -419
  130. package/lib/styles/input.js.map +1 -1
  131. package/lib/styles/multiselect.d.ts +3 -1
  132. package/lib/styles/multiselect.d.ts.map +1 -1
  133. package/lib/styles/multiselect.js +26 -2
  134. package/lib/styles/multiselect.js.map +1 -1
  135. package/lib/styles/option.d.ts +1 -1
  136. package/lib/styles/option.d.ts.map +1 -1
  137. package/lib/styles/option.js +20 -47
  138. package/lib/styles/option.js.map +1 -1
  139. package/lib/styles/radio.d.ts +3 -1
  140. package/lib/styles/radio.d.ts.map +1 -1
  141. package/lib/styles/radio.js +24 -21
  142. package/lib/styles/radio.js.map +1 -1
  143. package/lib/styles/scroll-container.d.ts +1 -1
  144. package/lib/styles/scroll-container.d.ts.map +1 -1
  145. package/lib/styles/scroll-container.js +6 -0
  146. package/lib/styles/scroll-container.js.map +1 -1
  147. package/lib/styles/select-base.d.ts +9 -0
  148. package/lib/styles/select-base.d.ts.map +1 -0
  149. package/lib/styles/select-base.js +973 -0
  150. package/lib/styles/select-base.js.map +1 -0
  151. package/lib/styles/select.d.ts +12 -0
  152. package/lib/styles/select.d.ts.map +1 -0
  153. package/lib/styles/select.js +308 -0
  154. package/lib/styles/select.js.map +1 -0
  155. package/lib/styles/step.d.ts +1 -1
  156. package/lib/styles/step.d.ts.map +1 -1
  157. package/lib/styles/switch.d.ts +3 -1
  158. package/lib/styles/switch.d.ts.map +1 -1
  159. package/lib/styles/switch.js +25 -10
  160. package/lib/styles/switch.js.map +1 -1
  161. package/lib/styles/tab.d.ts +1 -1
  162. package/lib/styles/tab.d.ts.map +1 -1
  163. package/lib/styles/tabs.d.ts +1 -1
  164. package/lib/styles/tabs.d.ts.map +1 -1
  165. package/lib/styles/tabs.js +71 -1
  166. package/lib/styles/tabs.js.map +1 -1
  167. package/lib/styles/tag.d.ts +1 -1
  168. package/lib/styles/tag.d.ts.map +1 -1
  169. package/lib/styles/tag.js +40 -141
  170. package/lib/styles/tag.js.map +1 -1
  171. package/lib/styles/textarea.d.ts +1 -1
  172. package/lib/styles/textarea.d.ts.map +1 -1
  173. package/lib/styles/textarea.js +71 -37
  174. package/lib/styles/textarea.js.map +1 -1
  175. package/lib/styles/tooltip.d.ts +4 -2
  176. package/lib/styles/tooltip.d.ts.map +1 -1
  177. package/lib/styles/tooltip.js +4 -119
  178. package/lib/styles/tooltip.js.map +1 -1
  179. package/lib/styles/wizard.d.ts +1 -1
  180. package/lib/styles/wizard.d.ts.map +1 -1
  181. package/lib/styles/wizard.js +18 -6
  182. package/lib/styles/wizard.js.map +1 -1
  183. package/lib/types/common.d.ts +2 -1
  184. package/lib/types/common.d.ts.map +1 -1
  185. package/lib/types/common.js +15 -1
  186. package/lib/types/common.js.map +1 -1
  187. package/lib/utils/calendar-utils.d.ts +0 -48
  188. package/lib/utils/calendar-utils.d.ts.map +1 -1
  189. package/lib/utils/calendar-utils.js +0 -69
  190. package/lib/utils/calendar-utils.js.map +1 -1
  191. package/lib/utils/flavor-sheet.d.ts +32 -0
  192. package/lib/utils/flavor-sheet.d.ts.map +1 -0
  193. package/lib/utils/flavor-sheet.js +40 -0
  194. package/lib/utils/flavor-sheet.js.map +1 -0
  195. package/lib/utils/icon-registry.d.ts +0 -13
  196. package/lib/utils/icon-registry.d.ts.map +1 -1
  197. package/lib/utils/icon-registry.js +0 -35
  198. package/lib/utils/icon-registry.js.map +1 -1
  199. package/lib/utils/icons.d.ts +10 -0
  200. package/lib/utils/icons.d.ts.map +1 -0
  201. package/lib/utils/icons.js +10 -0
  202. package/lib/utils/icons.js.map +1 -0
  203. package/lib/utils/loader-registry.d.ts +2 -2
  204. package/lib/utils/loader-registry.js +2 -2
  205. package/lib/utils/locale.d.ts +0 -57
  206. package/lib/utils/locale.d.ts.map +1 -1
  207. package/lib/utils/locale.js +0 -89
  208. package/lib/utils/locale.js.map +1 -1
  209. package/lib/utils/number-format.d.ts +0 -21
  210. package/lib/utils/number-format.d.ts.map +1 -1
  211. package/lib/utils/number-format.js +0 -27
  212. package/lib/utils/number-format.js.map +1 -1
  213. package/lib/utils/positioning.d.ts +29 -22
  214. package/lib/utils/positioning.d.ts.map +1 -1
  215. package/lib/utils/positioning.js +23 -87
  216. package/lib/utils/positioning.js.map +1 -1
  217. package/lib/utils/scroll-lock.d.ts.map +1 -1
  218. package/lib/utils/scroll-lock.js +0 -1
  219. package/lib/utils/scroll-lock.js.map +1 -1
  220. package/lib/utils/styles.d.ts +0 -5
  221. package/lib/utils/styles.d.ts.map +1 -1
  222. package/lib/utils/styles.js +0 -7
  223. package/lib/utils/styles.js.map +1 -1
  224. package/lib/version.d.ts +1 -1
  225. package/lib/version.js +1 -1
  226. package/package.json +22 -11
  227. package/css/tyrell-brand.css +0 -913
  228. package/dist/tyrell-brand.css +0 -913
  229. package/lib/components/dropdown.d.ts +0 -424
  230. package/lib/components/dropdown.d.ts.map +0 -1
  231. package/lib/components/dropdown.js +0 -1640
  232. package/lib/components/dropdown.js.map +0 -1
  233. package/lib/components/multiselect.d.ts +0 -397
  234. package/lib/components/multiselect.d.ts.map +0 -1
  235. package/lib/components/multiselect.js +0 -1595
  236. package/lib/components/multiselect.js.map +0 -1
  237. package/lib/styles/dropdown.d.ts +0 -12
  238. package/lib/styles/dropdown.d.ts.map +0 -1
  239. package/lib/styles/dropdown.js +0 -1081
  240. package/lib/styles/dropdown.js.map +0 -1
package/css/tyrell.css CHANGED
@@ -124,59 +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
-
179
- /* Accent - brand highlights, focus rings, selection states */
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. */
180
131
 
181
132
  /* =================================================================
182
133
  BACKGROUND COLORS
@@ -196,59 +147,13 @@ BACKGROUND COLORS
196
147
  /* Focus ring gap - matches page background for button focus ring effect */
197
148
  --ty-focus-ring-gap: #ffffff;
198
149
 
199
- /* Primary backgrounds */
200
- --ty-bg-primary: #e3eefc;
201
- --ty-bg-primary-bold: #d5e4f8;
202
- --ty-bg-primary-soft: #eff6ff;
203
-
204
- /* Secondary backgrounds */
205
- --ty-bg-secondary: #e9d5ff;
206
- --ty-bg-secondary-bold: #ddd6fe;
207
- --ty-bg-secondary-soft: #f3e8ff;
208
-
209
- /* Success backgrounds */
210
- --ty-bg-success: #d1fae5;
211
- --ty-bg-success-bold: #a7f3d0;
212
- --ty-bg-success-soft: #ecfdf5;
213
-
214
- /* Danger backgrounds */
215
- --ty-bg-danger: #fee2e2;
216
- --ty-bg-danger-bold: #fecaca;
217
- --ty-bg-danger-soft: #fef2f2;
218
-
219
- /* Warning backgrounds */
220
- --ty-bg-warning: #fef3c7;
221
- --ty-bg-warning-bold: #fde68a;
222
- --ty-bg-warning-soft: #fffbeb;
223
-
224
- /* Neutral backgrounds */
225
- --ty-bg-neutral: #e0e0e0;
226
- --ty-bg-neutral-bold: #cecece;
227
- --ty-bg-neutral-soft: #ededed;
228
-
229
- /* Accent backgrounds */
230
-
231
150
  /* =================================================================
232
151
  BORDER COLORS
233
152
  ================================================================= */
234
153
 
235
- --ty-border: #e5e7eb;
236
- --ty-border-bold: #d1d5db;
237
- --ty-border-strong: #6b7280;
238
- --ty-border-soft: #f3f4f6;
239
- --ty-border-faint: #fafafa;
240
-
241
154
  /* Border width — used as fallback by surface utilities (--ty-{surface}-border-width) */
242
155
  --ty-border-width: 1px;
243
156
 
244
- /* Semantic borders */
245
- --ty-border-primary: var(--ty-color-primary);
246
- --ty-border-secondary: var(--ty-color-secondary);
247
- --ty-border-success: var(--ty-color-success);
248
- --ty-border-danger: var(--ty-color-danger);
249
- --ty-border-warning: var(--ty-color-warning);
250
- --ty-border-neutral: var(--ty-color-neutral);
251
-
252
157
  /* =================================================================
253
158
  SCROLLBAR
254
159
  ================================================================= */
@@ -263,19 +168,11 @@ SCROLLBAR
263
168
  SURFACE SYSTEM
264
169
  ================================================================= */
265
170
 
266
- --ty-surface-canvas: #fcfcfc;
267
- --ty-surface-content: #ffffff;
268
- --ty-surface-elevated: #ffffff;
269
- --ty-surface-floating: #ffffff;
270
- --ty-surface-input: #ffffff;
271
-
272
171
  /* Surface borders — opt-in. Set color to make a surface's border visible.
273
172
  Width and style fall back to --ty-border-width and `solid` if unset. */
274
- --ty-elevated-border: #e5e7eb;
275
173
  --ty-elevated-border-width: var(--ty-border-width);
276
174
  --ty-elevated-border-style: solid;
277
175
 
278
- --ty-floating-border: #e5e7eb;
279
176
  --ty-floating-border-width: var(--ty-border-width);
280
177
  --ty-floating-border-style: solid;
281
178
 
@@ -283,12 +180,12 @@ SURFACE SYSTEM
283
180
  --ty-canvas-border-width: var(--ty-border-width);
284
181
  --ty-canvas-border-style: solid;
285
182
 
286
- --ty-content-border: #e5e7eb;
287
183
  --ty-content-border-width: var(--ty-border-width);
288
184
  --ty-content-border-style: solid;
289
185
 
290
- /* --ty-input-border is already declared above as a color token used by
291
- <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. */
292
189
  --ty-input-border-width: var(--ty-border-width);
293
190
  --ty-input-border-style: solid;
294
191
 
@@ -299,17 +196,6 @@ SURFACE SYSTEM
299
196
  --ty-divide-color: var(--ty-border);
300
197
  --ty-divide-width: var(--ty-border-width);
301
198
 
302
- /* =================================================================
303
- TEXT HIERARCHY
304
- ================================================================= */
305
-
306
- /* Text hierarchy - emphasis based, not semantic */
307
- --ty-text: #111827;
308
- --ty-text-bold: #000000;
309
- --ty-text-strong: #000000;
310
- --ty-text-soft: #374151;
311
- --ty-text-faint: #9ca3af;
312
-
313
199
  /* =================================================================
314
200
  COMPONENT TOKENS
315
201
  ================================================================= */
@@ -334,70 +220,8 @@ COMPONENT TOKENS
334
220
  --ty-modal-full-height: 95vh;
335
221
 
336
222
  /* Input component tokens */
337
- --ty-input-bg: #ffffff;
338
- --ty-input-color: #111827;
339
- --ty-input-border: #d1d5db;
340
- --ty-input-border-hover: #9ca3af;
341
- --ty-input-border-focus: var(--ty-color-primary);
342
- --ty-input-shadow-focus: rgba(59, 130, 246, 0.1);
343
- --ty-input-placeholder: #9ca3af;
344
- --ty-input-disabled-bg: #f9fafb;
345
- --ty-input-disabled-border: #e5e7eb;
346
- --ty-input-disabled-color: #9ca3af;
347
223
  --ty-label-color: #374151;
348
224
 
349
- /* Input semantic states */
350
- --ty-input-success-border: var(--ty-color-success);
351
- --ty-input-danger-border: var(--ty-color-danger);
352
- --ty-input-warning-border: var(--ty-color-warning);
353
-
354
- /* =================================================================
355
- SOLID BUTTON FILLS — saturated brand backgrounds for appearance="solid"
356
- Each flavor defines:
357
- --ty-solid-{flavor} base saturated fill
358
- --ty-solid-{flavor}-strong stronger fill (for solid+ tone)
359
- --ty-solid-{flavor}-soft softer fill (for solid- tone)
360
- --ty-solid-{flavor}-fg paired text color (default white)
361
- Strong/soft default to var(--ty-color-{flavor}-strong/-soft) so they
362
- inherit from the existing color hierarchy. Override per flavor if needed.
363
- ================================================================= */
364
-
365
- /* Primary */
366
- --ty-solid-primary: #4076b9;
367
- --ty-solid-primary-strong: var(--ty-color-primary-bold);
368
- --ty-solid-primary-soft: #7ea7d9;
369
- --ty-solid-primary-fg: white;
370
-
371
- /* Secondary */
372
- --ty-solid-secondary: #7e67b4;
373
- --ty-solid-secondary-strong: #7d58d1;
374
- --ty-solid-secondary-soft: #9f8ec5;
375
- --ty-solid-secondary-fg: white;
376
-
377
- /* Success */
378
- --ty-solid-success: #3bb68d;
379
- --ty-solid-success-strong: #27956e;
380
- --ty-solid-success-soft: #69b99e;
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-fg: white;
388
-
389
- /* Warning */
390
- --ty-solid-warning: #e1a644;
391
- --ty-solid-warning-strong: #f59e0b;
392
- --ty-solid-warning-soft: #fbc56d;
393
- --ty-solid-warning-fg: white;
394
-
395
- /* Neutral */
396
- --ty-solid-neutral: #414141;
397
- --ty-solid-neutral-strong: #000000;
398
- --ty-solid-neutral-soft: #6e6e6e;
399
- --ty-solid-neutral-fg: white;
400
-
401
225
  /* =================================================================
402
226
  DESIGN SYSTEM TOKENS
403
227
  ================================================================= */
@@ -497,6 +321,39 @@ DESIGN SYSTEM TOKENS
497
321
  --ty-font-bold: 680;
498
322
  --ty-font-extrabold: 800;
499
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
+
500
357
  --ty-line-height-none: 1;
501
358
  --ty-line-height-tight: 1.25;
502
359
  --ty-line-height-snug: 1.375;
@@ -504,26 +361,33 @@ DESIGN SYSTEM TOKENS
504
361
  --ty-line-height-relaxed: 1.625;
505
362
  --ty-line-height-loose: 2;
506
363
 
507
- /* 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. */
508
370
  --ty-transition-none: none;
509
- --ty-transition-all: all 150ms cubic-bezier(0.4, 0, 0.2, 1);
510
- --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,
511
373
  bg-color, border-color, color, fill,
512
- stroke 150ms cubic-bezier(0.4, 0, 0.2, 1);
513
- --ty-transition-shadow: box-shadow 150ms cubic-bezier(0.4, 0, 0.2, 1);
514
- --ty-transition-transform: transform 150ms cubic-bezier(0.4, 0, 0.2, 1);
515
-
516
- /* Component Sizes */
517
- --ty-size-xs: 1.5rem;
518
- /* 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. */
519
385
  --ty-size-sm: 2rem;
520
386
  /* 32px */
521
- --ty-size-md: 2.5rem;
387
+ --ty-size-md: 2.25rem;
388
+ /* 36px */
389
+ --ty-size-lg: 2.5rem;
522
390
  /* 40px */
523
- --ty-size-lg: 3rem;
524
- /* 48px */
525
- --ty-size-xl: 3.5rem;
526
- /* 56px */
527
391
 
528
392
  /* Z-Index Scale */
529
393
  --ty-z-auto: auto;
@@ -558,6 +422,34 @@ DESIGN SYSTEM TOKENS
558
422
  transparent
559
423
  );
560
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 */
561
453
  }
562
454
 
563
455
  /* =================================================================
@@ -566,54 +458,20 @@ DARK THEME OVERRIDES
566
458
 
567
459
  html.dark,
568
460
  html[data-theme="dark"] {
569
- /* =================================================================
570
- 5-VARIANT COLOR SYSTEM - DARK THEME
571
- Emphasis logic inverts: lighter = more emphasis
572
- ================================================================= */
573
-
574
- /* Primary */
575
- --ty-color-primary-strong: #9cbde5;
576
- --ty-color-primary-bold: #6c9bd5;
577
- --ty-color-primary: #4976ae;
578
- --ty-color-primary-soft: #4b698b;
579
- --ty-color-primary-faint: #445b77;
580
-
581
- /* Secondary */
582
- --ty-color-secondary-strong: #ddd6fe;
583
- --ty-color-secondary-bold: #c4b5fd;
584
- --ty-color-secondary: #a78bfa;
585
- --ty-color-secondary-soft: #8269bc;
586
- --ty-color-secondary-faint: #76619f;
587
-
588
- /* Success */
589
- --ty-color-success-strong: #c2f0df;
590
- --ty-color-success-bold: #6ee7b7;
591
- --ty-color-success: #3aba8b;
592
- --ty-color-success-soft: #459679;
593
- --ty-color-success-faint: #1b795c;
594
-
595
- /* Danger */
596
- --ty-color-danger-strong: #ffabab;
597
- --ty-color-danger-bold: #e58787;
598
- --ty-color-danger: #d06f6f;
599
- --ty-color-danger-soft: #b06666;
600
- --ty-color-danger-faint: #aa6e6e;
601
-
602
- /* Warning */
603
- --ty-color-warning-strong: #fde68a;
604
- --ty-color-warning-bold: #fcd34d;
605
- --ty-color-warning: #fbbf24;
606
- --ty-color-warning-soft: #f59e0b;
607
- --ty-color-warning-faint: #a06726;
608
-
609
- /* Neutral */
610
- --ty-color-neutral-strong: #ffffff;
611
- --ty-color-neutral-bold: #f9fafb;
612
- --ty-color-neutral: #d6d6d6;
613
- --ty-color-neutral-soft: #696969;
614
- --ty-color-neutral-faint: #474747;
615
-
616
- /* Accent - dark mode (emphasis inverted) */
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;
617
475
 
618
476
  /* Backgrounds for dark mode */
619
477
  --ty-bg-faint: #0f1419;
@@ -625,63 +483,12 @@ Emphasis logic inverts: lighter = more emphasis
625
483
  /* Focus ring gap */
626
484
  --ty-focus-ring-gap: #1f2937;
627
485
 
628
- /* Semantic backgrounds - much darker in dark mode */
629
- --ty-bg-primary-bold: #43517a;
630
- --ty-bg-primary: #394159;
631
- --ty-bg-primary-soft: #323a4f;
632
-
633
- --ty-bg-secondary-bold: #58368e;
634
- --ty-bg-secondary: #4a3c65;
635
- --ty-bg-secondary-soft: #3b3645;
636
-
637
- --ty-bg-success: #3a4442;
638
- --ty-bg-success-bold: #405752;
639
- --ty-bg-success-soft: #2f3b38;
640
-
641
- --ty-bg-danger-bold: #853535;
642
- --ty-bg-danger: #522828;
643
- --ty-bg-danger-soft: #483c3c;
644
-
645
- --ty-bg-warning-bold: #743953;
646
- --ty-bg-warning: #694555;
647
- --ty-bg-warning-soft: #45333b;
648
-
649
- --ty-bg-neutral-bold: #414141;
650
- --ty-bg-neutral: #323232;
651
- --ty-bg-neutral-soft: #242424;
652
-
653
- /* Accent backgrounds - dark mode */
654
-
655
- /* Borders for dark mode */
656
- --ty-border-strong: #8c8c8c;
657
- --ty-border-bold: #666666;
658
- --ty-border: #535353;
659
- --ty-border-soft: #1f2937;
660
- --ty-border-faint: #030712;
661
-
662
486
  /* Scrollbar - dark mode */
663
- --ty-scrollbar-thumb: rgba(255, 255, 255, 0.22);
664
- --ty-scrollbar-thumb-hover: rgba(255, 255, 255, 0.38);
665
- --ty-scrollbar-thumb-active: rgba(255, 255, 255, 0.48);
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);
666
490
  --ty-scrollbar-track: transparent;
667
- --ty-scrollbar-track-hover: rgba(255, 255, 255, 0.06);
668
-
669
- --ty-surface-canvas: black;
670
- --ty-surface-content: #1a1a1a;
671
- --ty-surface-elevated: #282828;
672
- --ty-surface-floating: #343434;
673
- --ty-surface-input: #1f2937;
674
-
675
- --ty-content-border: #030712;
676
- --ty-elevated-border: #414141;
677
- --ty-border: #3e3e3e;
678
- --ty-floating-border: #494949;
679
-
680
- --ty-text-bold: #f9fafb;
681
- --ty-text-strong: #ffffff;
682
- --ty-text: #d6d6d6;
683
- --ty-text-soft: #7f8590;
684
- --ty-text-faint: #555a63;
491
+ --ty-scrollbar-track-hover: rgba(255, 255, 255, 0.04);
685
492
 
686
493
  /* Shadows need to be darker/more prominent in dark mode */
687
494
  --ty-shadow-sm: 0 1px 2px 0 rgba(0, 0, 0, 0.2);
@@ -695,55 +502,7 @@ Emphasis logic inverts: lighter = more emphasis
695
502
  0 20px 25px -5px rgba(0, 0, 0, 0.3), 0 8px 10px -6px rgba(0, 0, 0, 0.3);
696
503
  --ty-shadow-2xl: 0 25px 50px -12px rgba(0, 0, 0, 0.5);
697
504
 
698
- /* Solid button fills for dark mode — strong/soft/fg chain through automatically.
699
- Note: --ty-color-{flavor}-strong is light-toned in dark mode (emphasis
700
- inverts), so solid+ buttons will have a light bg with white text — low
701
- contrast for some flavors. Override per flavor via --ty-solid-{flavor}-fg
702
- if a specific brand needs darker text. */
703
- --ty-solid-primary: #3e536c;
704
- --ty-solid-primary-strong: #426084;
705
- --ty-solid-primary-soft: #343f4c;
706
- --ty-solid-primary-fg: white;
707
-
708
- --ty-solid-secondary: #7e67b4;
709
- --ty-solid-secondary-strong: #8269bc;
710
- --ty-solid-secondary-soft: #52466a;
711
- --ty-solid-secondary-fg: white;
712
-
713
- /* Success */
714
- --ty-solid-success: #3bb68d;
715
- --ty-solid-success-strong: #459679;
716
- --ty-solid-success-soft: #285748;
717
- --ty-solid-success-fg: white;
718
-
719
- /* Danger */
720
- --ty-solid-danger: #df5b5b;
721
- --ty-solid-danger-strong: #cc3e3e;
722
- --ty-solid-danger-soft: #875656;
723
- --ty-solid-danger-fg: white;
724
-
725
- /* Warning */
726
- --ty-solid-warning: #e1a644;
727
- --ty-solid-warning-strong: #f59e0b;
728
- --ty-solid-warning-soft: #8b6334;
729
- --ty-solid-warning-fg: white;
730
-
731
- --ty-solid-neutral: #414141;
732
- --ty-solid-neutral-strong: #4c4c4c;
733
- --ty-solid-neutral-soft: #2a2a2a;
734
- --ty-solid-neutral-fg: white;
735
-
736
505
  /* Input component tokens - dark mode */
737
- --ty-input-bg: #1b1b1b;
738
- --ty-input-color: #f9fafb;
739
- --ty-input-border: #505050;
740
- --ty-input-border-hover: #7f7f7f;
741
- --ty-input-border-focus: var(--ty-color-primary);
742
- --ty-input-shadow-focus: rgba(96, 165, 250, 0.1);
743
- --ty-input-placeholder: #717171;
744
- --ty-input-disabled-bg: #282828;
745
- --ty-input-disabled-border: #2e2e2e;
746
- --ty-input-disabled-color: #717171;
747
506
  --ty-label-color: #d1d5db;
748
507
 
749
508
  /* Modal - dark mode */
@@ -767,6 +526,10 @@ Emphasis logic inverts: lighter = more emphasis
767
526
  rgba(0, 0, 0, 0),
768
527
  transparent
769
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) */
770
533
  }
771
534
 
772
535
  /* =================================================================
@@ -826,11 +589,6 @@ html.dark textarea::-moz-selection {
826
589
  color: var(--ty-color-primary-strong);
827
590
  }
828
591
 
829
- .ty-selection-secondary ::selection,
830
- .ty-selection-secondary::-moz-selection {
831
- background-color: var(--ty-color-secondary-soft);
832
- color: var(--ty-color-secondary-strong);
833
- }
834
592
 
835
593
  .ty-selection-success ::selection,
836
594
  .ty-selection-success::-moz-selection {
@@ -863,11 +621,6 @@ html.dark .ty-selection-primary::-moz-selection {
863
621
  color: white;
864
622
  }
865
623
 
866
- html.dark .ty-selection-secondary ::selection,
867
- html.dark .ty-selection-secondary::-moz-selection {
868
- background-color: var(--ty-color-secondary);
869
- color: white;
870
- }
871
624
 
872
625
  html.dark .ty-selection-success ::selection,
873
626
  html.dark .ty-selection-success::-moz-selection {
@@ -1024,17 +777,8 @@ SEMANTIC BACKGROUND UTILITIES
1024
777
  background-color: var(--ty-bg-primary-soft);
1025
778
  }
1026
779
 
1027
- .ty-bg-secondary {
1028
- background-color: var(--ty-bg-secondary);
1029
- }
1030
780
 
1031
- .ty-bg-secondary\+ {
1032
- background-color: var(--ty-bg-secondary-bold);
1033
- }
1034
781
 
1035
- .ty-bg-secondary- {
1036
- background-color: var(--ty-bg-secondary-soft);
1037
- }
1038
782
 
1039
783
  .ty-bg-success {
1040
784
  background-color: var(--ty-bg-success);
@@ -1084,7 +828,6 @@ SEMANTIC BACKGROUND UTILITIES
1084
828
  background-color: var(--ty-bg-neutral-soft);
1085
829
  }
1086
830
 
1087
- /* Accent backgrounds */
1088
831
  /* =================================================================
1089
832
  TEXT HIERARCHY UTILITIES
1090
833
  ================================================================= */
@@ -1135,26 +878,9 @@ SEMANTIC TEXT COLORS - 5-VARIANT SYSTEM
1135
878
  color: var(--ty-color-primary-faint) !important;
1136
879
  }
1137
880
 
1138
- /* Secondary text colors */
1139
- .ty-text-secondary\+\+ {
1140
- color: var(--ty-color-secondary-strong) !important;
1141
- }
1142
881
 
1143
- .ty-text-secondary\+ {
1144
- color: var(--ty-color-secondary-bold) !important;
1145
- }
1146
882
 
1147
- .ty-text-secondary {
1148
- color: var(--ty-color-secondary) !important;
1149
- }
1150
883
 
1151
- .ty-text-secondary- {
1152
- color: var(--ty-color-secondary-soft) !important;
1153
- }
1154
-
1155
- .ty-text-secondary-- {
1156
- color: var(--ty-color-secondary-faint) !important;
1157
- }
1158
884
 
1159
885
  /* Success text colors */
1160
886
  .ty-text-success\+\+ {
@@ -1240,7 +966,6 @@ SEMANTIC TEXT COLORS - 5-VARIANT SYSTEM
1240
966
  color: var(--ty-color-neutral-faint) !important;
1241
967
  }
1242
968
 
1243
- /* Accent text colors */
1244
969
  /* =================================================================
1245
970
  BORDER UTILITIES
1246
971
  ================================================================= */
@@ -1271,9 +996,6 @@ BORDER UTILITIES
1271
996
  border-color: var(--ty-border-primary);
1272
997
  }
1273
998
 
1274
- .ty-border-secondary {
1275
- border-color: var(--ty-border-secondary);
1276
- }
1277
999
 
1278
1000
  .ty-border-success {
1279
1001
  border-color: var(--ty-border-success);
@@ -1360,13 +1082,7 @@ INTERACTIVE STATES
1360
1082
  background-color: var(--ty-bg-primary-bold) !important;
1361
1083
  }
1362
1084
 
1363
- .hover\:ty-bg-secondary:hover {
1364
- background-color: var(--ty-bg-secondary) !important;
1365
- }
1366
1085
 
1367
- .hover\:ty-bg-secondary\+:hover {
1368
- background-color: var(--ty-bg-secondary-bold) !important;
1369
- }
1370
1086
 
1371
1087
  .hover\:ty-bg-success:hover {
1372
1088
  background-color: var(--ty-bg-success) !important;
@@ -1431,26 +1147,9 @@ INTERACTIVE STATES
1431
1147
  color: var(--ty-color-primary-faint) !important;
1432
1148
  }
1433
1149
 
1434
- /* Secondary text hover states */
1435
- .hover\:ty-text-secondary\+\+:hover {
1436
- color: var(--ty-color-secondary-strong) !important;
1437
- }
1438
-
1439
- .hover\:ty-text-secondary\+:hover {
1440
- color: var(--ty-color-secondary-bold) !important;
1441
- }
1442
1150
 
1443
- .hover\:ty-text-secondary:hover {
1444
- color: var(--ty-color-secondary) !important;
1445
- }
1446
1151
 
1447
- .hover\:ty-text-secondary-:hover {
1448
- color: var(--ty-color-secondary-soft) !important;
1449
- }
1450
1152
 
1451
- .hover\:ty-text-secondary--:hover {
1452
- color: var(--ty-color-secondary-faint) !important;
1453
- }
1454
1153
 
1455
1154
  /* Success text hover states */
1456
1155
  .hover\:ty-text-success\+\+:hover {
@@ -1536,7 +1235,6 @@ INTERACTIVE STATES
1536
1235
  color: var(--ty-color-neutral-faint) !important;
1537
1236
  }
1538
1237
 
1539
- /* Accent text hover states */
1540
1238
  /* Hover states for borders */
1541
1239
  /* Base border hover states */
1542
1240
  .hover\:ty-border\+\+:hover {
@@ -1564,9 +1262,6 @@ INTERACTIVE STATES
1564
1262
  border-color: var(--ty-border-primary) !important;
1565
1263
  }
1566
1264
 
1567
- .hover\:ty-border-secondary:hover {
1568
- border-color: var(--ty-border-secondary) !important;
1569
- }
1570
1265
 
1571
1266
  .hover\:ty-border-success:hover {
1572
1267
  border-color: var(--ty-border-success) !important;
@@ -1609,9 +1304,6 @@ INTERACTIVE STATES
1609
1304
  border-color: var(--ty-border-primary) !important;
1610
1305
  }
1611
1306
 
1612
- .focus\:ty-border-secondary:focus {
1613
- border-color: var(--ty-border-secondary) !important;
1614
- }
1615
1307
 
1616
1308
  .focus\:ty-border-success:focus {
1617
1309
  border-color: var(--ty-border-success) !important;