tyrell-components 1.0.0-TC7

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 (330) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +221 -0
  3. package/css/tyrell.css +1783 -0
  4. package/dist/tyrell.css +1783 -0
  5. package/dist/tyrell.js +2 -0
  6. package/lib/base/ty-component.d.ts +133 -0
  7. package/lib/base/ty-component.d.ts.map +1 -0
  8. package/lib/base/ty-component.js +297 -0
  9. package/lib/base/ty-component.js.map +1 -0
  10. package/lib/components/button.d.ts +126 -0
  11. package/lib/components/button.d.ts.map +1 -0
  12. package/lib/components/button.js +244 -0
  13. package/lib/components/button.js.map +1 -0
  14. package/lib/components/calendar-month.d.ts +132 -0
  15. package/lib/components/calendar-month.d.ts.map +1 -0
  16. package/lib/components/calendar-month.js +440 -0
  17. package/lib/components/calendar-month.js.map +1 -0
  18. package/lib/components/calendar-navigation.d.ts +137 -0
  19. package/lib/components/calendar-navigation.d.ts.map +1 -0
  20. package/lib/components/calendar-navigation.js +366 -0
  21. package/lib/components/calendar-navigation.js.map +1 -0
  22. package/lib/components/calendar.d.ts +166 -0
  23. package/lib/components/calendar.d.ts.map +1 -0
  24. package/lib/components/calendar.js +774 -0
  25. package/lib/components/calendar.js.map +1 -0
  26. package/lib/components/checkbox.d.ts +189 -0
  27. package/lib/components/checkbox.d.ts.map +1 -0
  28. package/lib/components/checkbox.js +400 -0
  29. package/lib/components/checkbox.js.map +1 -0
  30. package/lib/components/copy.d.ts +180 -0
  31. package/lib/components/copy.d.ts.map +1 -0
  32. package/lib/components/copy.js +393 -0
  33. package/lib/components/copy.js.map +1 -0
  34. package/lib/components/date-picker.d.ts +379 -0
  35. package/lib/components/date-picker.d.ts.map +1 -0
  36. package/lib/components/date-picker.js +1586 -0
  37. package/lib/components/date-picker.js.map +1 -0
  38. package/lib/components/dropdown.d.ts +402 -0
  39. package/lib/components/dropdown.d.ts.map +1 -0
  40. package/lib/components/dropdown.js +1564 -0
  41. package/lib/components/dropdown.js.map +1 -0
  42. package/lib/components/icon.d.ts +107 -0
  43. package/lib/components/icon.d.ts.map +1 -0
  44. package/lib/components/icon.js +230 -0
  45. package/lib/components/icon.js.map +1 -0
  46. package/lib/components/input.d.ts +270 -0
  47. package/lib/components/input.d.ts.map +1 -0
  48. package/lib/components/input.js +721 -0
  49. package/lib/components/input.js.map +1 -0
  50. package/lib/components/modal.d.ts +58 -0
  51. package/lib/components/modal.d.ts.map +1 -0
  52. package/lib/components/modal.js +473 -0
  53. package/lib/components/modal.js.map +1 -0
  54. package/lib/components/multiselect.d.ts +397 -0
  55. package/lib/components/multiselect.d.ts.map +1 -0
  56. package/lib/components/multiselect.js +1580 -0
  57. package/lib/components/multiselect.js.map +1 -0
  58. package/lib/components/option.d.ts +66 -0
  59. package/lib/components/option.d.ts.map +1 -0
  60. package/lib/components/option.js +314 -0
  61. package/lib/components/option.js.map +1 -0
  62. package/lib/components/popup.d.ts +43 -0
  63. package/lib/components/popup.d.ts.map +1 -0
  64. package/lib/components/popup.js +380 -0
  65. package/lib/components/popup.js.map +1 -0
  66. package/lib/components/radio.d.ts +198 -0
  67. package/lib/components/radio.d.ts.map +1 -0
  68. package/lib/components/radio.js +437 -0
  69. package/lib/components/radio.js.map +1 -0
  70. package/lib/components/resize-observer.d.ts +48 -0
  71. package/lib/components/resize-observer.d.ts.map +1 -0
  72. package/lib/components/resize-observer.js +108 -0
  73. package/lib/components/resize-observer.js.map +1 -0
  74. package/lib/components/scroll-container.d.ts +51 -0
  75. package/lib/components/scroll-container.d.ts.map +1 -0
  76. package/lib/components/scroll-container.js +239 -0
  77. package/lib/components/scroll-container.js.map +1 -0
  78. package/lib/components/step.d.ts +26 -0
  79. package/lib/components/step.d.ts.map +1 -0
  80. package/lib/components/step.js +75 -0
  81. package/lib/components/step.js.map +1 -0
  82. package/lib/components/switch.d.ts +111 -0
  83. package/lib/components/switch.d.ts.map +1 -0
  84. package/lib/components/switch.js +240 -0
  85. package/lib/components/switch.js.map +1 -0
  86. package/lib/components/tab.d.ts +23 -0
  87. package/lib/components/tab.d.ts.map +1 -0
  88. package/lib/components/tab.js +76 -0
  89. package/lib/components/tab.js.map +1 -0
  90. package/lib/components/tabs.d.ts +93 -0
  91. package/lib/components/tabs.d.ts.map +1 -0
  92. package/lib/components/tabs.js +653 -0
  93. package/lib/components/tabs.js.map +1 -0
  94. package/lib/components/tag.d.ts +144 -0
  95. package/lib/components/tag.d.ts.map +1 -0
  96. package/lib/components/tag.js +314 -0
  97. package/lib/components/tag.js.map +1 -0
  98. package/lib/components/textarea.d.ts +241 -0
  99. package/lib/components/textarea.d.ts.map +1 -0
  100. package/lib/components/textarea.js +585 -0
  101. package/lib/components/textarea.js.map +1 -0
  102. package/lib/components/tooltip.d.ts +40 -0
  103. package/lib/components/tooltip.d.ts.map +1 -0
  104. package/lib/components/tooltip.js +439 -0
  105. package/lib/components/tooltip.js.map +1 -0
  106. package/lib/components/wizard.d.ts +86 -0
  107. package/lib/components/wizard.d.ts.map +1 -0
  108. package/lib/components/wizard.js +636 -0
  109. package/lib/components/wizard.js.map +1 -0
  110. package/lib/icons/fontawesome/brands.d.ts +557 -0
  111. package/lib/icons/fontawesome/brands.d.ts.map +1 -0
  112. package/lib/icons/fontawesome/brands.js +557 -0
  113. package/lib/icons/fontawesome/brands.js.map +1 -0
  114. package/lib/icons/fontawesome/regular.d.ts +281 -0
  115. package/lib/icons/fontawesome/regular.d.ts.map +1 -0
  116. package/lib/icons/fontawesome/regular.js +281 -0
  117. package/lib/icons/fontawesome/regular.js.map +1 -0
  118. package/lib/icons/fontawesome/solid.d.ts +1992 -0
  119. package/lib/icons/fontawesome/solid.d.ts.map +1 -0
  120. package/lib/icons/fontawesome/solid.js +1992 -0
  121. package/lib/icons/fontawesome/solid.js.map +1 -0
  122. package/lib/icons/heroicons/micro.d.ts +324 -0
  123. package/lib/icons/heroicons/micro.d.ts.map +1 -0
  124. package/lib/icons/heroicons/micro.js +1032 -0
  125. package/lib/icons/heroicons/micro.js.map +1 -0
  126. package/lib/icons/heroicons/mini.d.ts +332 -0
  127. package/lib/icons/heroicons/mini.d.ts.map +1 -0
  128. package/lib/icons/heroicons/mini.js +1038 -0
  129. package/lib/icons/heroicons/mini.js.map +1 -0
  130. package/lib/icons/heroicons/outline.d.ts +332 -0
  131. package/lib/icons/heroicons/outline.d.ts.map +1 -0
  132. package/lib/icons/heroicons/outline.js +993 -0
  133. package/lib/icons/heroicons/outline.js.map +1 -0
  134. package/lib/icons/heroicons/solid.d.ts +332 -0
  135. package/lib/icons/heroicons/solid.d.ts.map +1 -0
  136. package/lib/icons/heroicons/solid.js +1063 -0
  137. package/lib/icons/heroicons/solid.js.map +1 -0
  138. package/lib/icons/lucide.d.ts +1872 -0
  139. package/lib/icons/lucide.d.ts.map +1 -0
  140. package/lib/icons/lucide.js +28212 -0
  141. package/lib/icons/lucide.js.map +1 -0
  142. package/lib/icons/material/filled.d.ts +2180 -0
  143. package/lib/icons/material/filled.d.ts.map +1 -0
  144. package/lib/icons/material/filled.js +14003 -0
  145. package/lib/icons/material/filled.js.map +1 -0
  146. package/lib/icons/material/outlined.d.ts +2142 -0
  147. package/lib/icons/material/outlined.d.ts.map +1 -0
  148. package/lib/icons/material/outlined.js +14545 -0
  149. package/lib/icons/material/outlined.js.map +1 -0
  150. package/lib/icons/material/round.d.ts +2147 -0
  151. package/lib/icons/material/round.d.ts.map +1 -0
  152. package/lib/icons/material/round.js +14779 -0
  153. package/lib/icons/material/round.js.map +1 -0
  154. package/lib/icons/material/sharp.d.ts +2147 -0
  155. package/lib/icons/material/sharp.d.ts.map +1 -0
  156. package/lib/icons/material/sharp.js +14189 -0
  157. package/lib/icons/material/sharp.js.map +1 -0
  158. package/lib/icons/material/two-tone.d.ts +2185 -0
  159. package/lib/icons/material/two-tone.d.ts.map +1 -0
  160. package/lib/icons/material/two-tone.js +17152 -0
  161. package/lib/icons/material/two-tone.js.map +1 -0
  162. package/lib/index.d.ts +78 -0
  163. package/lib/index.d.ts.map +1 -0
  164. package/lib/index.js +71 -0
  165. package/lib/index.js.map +1 -0
  166. package/lib/styles/button.d.ts +14 -0
  167. package/lib/styles/button.d.ts.map +1 -0
  168. package/lib/styles/button.js +457 -0
  169. package/lib/styles/button.js.map +1 -0
  170. package/lib/styles/calendar-month.d.ts +6 -0
  171. package/lib/styles/calendar-month.d.ts.map +1 -0
  172. package/lib/styles/calendar-month.js +229 -0
  173. package/lib/styles/calendar-month.js.map +1 -0
  174. package/lib/styles/calendar-navigation.d.ts +6 -0
  175. package/lib/styles/calendar-navigation.d.ts.map +1 -0
  176. package/lib/styles/calendar-navigation.js +125 -0
  177. package/lib/styles/calendar-navigation.js.map +1 -0
  178. package/lib/styles/calendar.d.ts +6 -0
  179. package/lib/styles/calendar.d.ts.map +1 -0
  180. package/lib/styles/calendar.js +28 -0
  181. package/lib/styles/calendar.js.map +1 -0
  182. package/lib/styles/checkbox.d.ts +9 -0
  183. package/lib/styles/checkbox.d.ts.map +1 -0
  184. package/lib/styles/checkbox.js +19 -0
  185. package/lib/styles/checkbox.js.map +1 -0
  186. package/lib/styles/copy.d.ts +7 -0
  187. package/lib/styles/copy.d.ts.map +1 -0
  188. package/lib/styles/copy.js +94 -0
  189. package/lib/styles/copy.js.map +1 -0
  190. package/lib/styles/custom-scrollbar.d.ts +6 -0
  191. package/lib/styles/custom-scrollbar.d.ts.map +1 -0
  192. package/lib/styles/custom-scrollbar.js +157 -0
  193. package/lib/styles/custom-scrollbar.js.map +1 -0
  194. package/lib/styles/date-picker.d.ts +6 -0
  195. package/lib/styles/date-picker.d.ts.map +1 -0
  196. package/lib/styles/date-picker.js +400 -0
  197. package/lib/styles/date-picker.js.map +1 -0
  198. package/lib/styles/dropdown.d.ts +12 -0
  199. package/lib/styles/dropdown.d.ts.map +1 -0
  200. package/lib/styles/dropdown.js +983 -0
  201. package/lib/styles/dropdown.js.map +1 -0
  202. package/lib/styles/icon.d.ts +6 -0
  203. package/lib/styles/icon.d.ts.map +1 -0
  204. package/lib/styles/icon.js +231 -0
  205. package/lib/styles/icon.js.map +1 -0
  206. package/lib/styles/input.d.ts +7 -0
  207. package/lib/styles/input.d.ts.map +1 -0
  208. package/lib/styles/input.js +685 -0
  209. package/lib/styles/input.js.map +1 -0
  210. package/lib/styles/modal.d.ts +8 -0
  211. package/lib/styles/modal.d.ts.map +1 -0
  212. package/lib/styles/modal.js +134 -0
  213. package/lib/styles/modal.js.map +1 -0
  214. package/lib/styles/multiselect.d.ts +6 -0
  215. package/lib/styles/multiselect.d.ts.map +1 -0
  216. package/lib/styles/multiselect.js +774 -0
  217. package/lib/styles/multiselect.js.map +1 -0
  218. package/lib/styles/option.d.ts +6 -0
  219. package/lib/styles/option.d.ts.map +1 -0
  220. package/lib/styles/option.js +116 -0
  221. package/lib/styles/option.js.map +1 -0
  222. package/lib/styles/popup.d.ts +8 -0
  223. package/lib/styles/popup.d.ts.map +1 -0
  224. package/lib/styles/popup.js +95 -0
  225. package/lib/styles/popup.js.map +1 -0
  226. package/lib/styles/radio.d.ts +8 -0
  227. package/lib/styles/radio.d.ts.map +1 -0
  228. package/lib/styles/radio.js +160 -0
  229. package/lib/styles/radio.js.map +1 -0
  230. package/lib/styles/resize-observer.d.ts +6 -0
  231. package/lib/styles/resize-observer.d.ts.map +1 -0
  232. package/lib/styles/resize-observer.js +18 -0
  233. package/lib/styles/resize-observer.js.map +1 -0
  234. package/lib/styles/scroll-container.d.ts +6 -0
  235. package/lib/styles/scroll-container.d.ts.map +1 -0
  236. package/lib/styles/scroll-container.js +198 -0
  237. package/lib/styles/scroll-container.js.map +1 -0
  238. package/lib/styles/step.d.ts +5 -0
  239. package/lib/styles/step.d.ts.map +1 -0
  240. package/lib/styles/step.js +50 -0
  241. package/lib/styles/step.js.map +1 -0
  242. package/lib/styles/switch.d.ts +9 -0
  243. package/lib/styles/switch.d.ts.map +1 -0
  244. package/lib/styles/switch.js +100 -0
  245. package/lib/styles/switch.js.map +1 -0
  246. package/lib/styles/tab.d.ts +5 -0
  247. package/lib/styles/tab.d.ts.map +1 -0
  248. package/lib/styles/tab.js +51 -0
  249. package/lib/styles/tab.js.map +1 -0
  250. package/lib/styles/tabs.d.ts +13 -0
  251. package/lib/styles/tabs.d.ts.map +1 -0
  252. package/lib/styles/tabs.js +184 -0
  253. package/lib/styles/tabs.js.map +1 -0
  254. package/lib/styles/tag.d.ts +6 -0
  255. package/lib/styles/tag.d.ts.map +1 -0
  256. package/lib/styles/tag.js +415 -0
  257. package/lib/styles/tag.js.map +1 -0
  258. package/lib/styles/textarea.d.ts +6 -0
  259. package/lib/styles/textarea.d.ts.map +1 -0
  260. package/lib/styles/textarea.js +350 -0
  261. package/lib/styles/textarea.js.map +1 -0
  262. package/lib/styles/tooltip.d.ts +9 -0
  263. package/lib/styles/tooltip.d.ts.map +1 -0
  264. package/lib/styles/tooltip.js +136 -0
  265. package/lib/styles/tooltip.js.map +1 -0
  266. package/lib/styles/wizard.d.ts +25 -0
  267. package/lib/styles/wizard.d.ts.map +1 -0
  268. package/lib/styles/wizard.js +325 -0
  269. package/lib/styles/wizard.js.map +1 -0
  270. package/lib/types/common.d.ts +143 -0
  271. package/lib/types/common.d.ts.map +1 -0
  272. package/lib/types/common.js +5 -0
  273. package/lib/types/common.js.map +1 -0
  274. package/lib/utils/calendar-utils.d.ts +176 -0
  275. package/lib/utils/calendar-utils.d.ts.map +1 -0
  276. package/lib/utils/calendar-utils.js +370 -0
  277. package/lib/utils/calendar-utils.js.map +1 -0
  278. package/lib/utils/custom-scrollbar.d.ts +82 -0
  279. package/lib/utils/custom-scrollbar.d.ts.map +1 -0
  280. package/lib/utils/custom-scrollbar.js +320 -0
  281. package/lib/utils/custom-scrollbar.js.map +1 -0
  282. package/lib/utils/icon-registry.d.ts +78 -0
  283. package/lib/utils/icon-registry.d.ts.map +1 -0
  284. package/lib/utils/icon-registry.js +304 -0
  285. package/lib/utils/icon-registry.js.map +1 -0
  286. package/lib/utils/locale.d.ts +136 -0
  287. package/lib/utils/locale.d.ts.map +1 -0
  288. package/lib/utils/locale.js +213 -0
  289. package/lib/utils/locale.js.map +1 -0
  290. package/lib/utils/mobile.d.ts +14 -0
  291. package/lib/utils/mobile.d.ts.map +1 -0
  292. package/lib/utils/mobile.js +21 -0
  293. package/lib/utils/mobile.js.map +1 -0
  294. package/lib/utils/number-format.d.ts +83 -0
  295. package/lib/utils/number-format.d.ts.map +1 -0
  296. package/lib/utils/number-format.js +143 -0
  297. package/lib/utils/number-format.js.map +1 -0
  298. package/lib/utils/parse-boolean.d.ts +39 -0
  299. package/lib/utils/parse-boolean.d.ts.map +1 -0
  300. package/lib/utils/parse-boolean.js +58 -0
  301. package/lib/utils/parse-boolean.js.map +1 -0
  302. package/lib/utils/positioning.d.ts +143 -0
  303. package/lib/utils/positioning.d.ts.map +1 -0
  304. package/lib/utils/positioning.js +308 -0
  305. package/lib/utils/positioning.js.map +1 -0
  306. package/lib/utils/property-capture.d.ts +132 -0
  307. package/lib/utils/property-capture.d.ts.map +1 -0
  308. package/lib/utils/property-capture.js +152 -0
  309. package/lib/utils/property-capture.js.map +1 -0
  310. package/lib/utils/property-manager.d.ts +90 -0
  311. package/lib/utils/property-manager.d.ts.map +1 -0
  312. package/lib/utils/property-manager.js +197 -0
  313. package/lib/utils/property-manager.js.map +1 -0
  314. package/lib/utils/resize-observer.d.ts +42 -0
  315. package/lib/utils/resize-observer.d.ts.map +1 -0
  316. package/lib/utils/resize-observer.js +71 -0
  317. package/lib/utils/resize-observer.js.map +1 -0
  318. package/lib/utils/scroll-lock.d.ts +79 -0
  319. package/lib/utils/scroll-lock.d.ts.map +1 -0
  320. package/lib/utils/scroll-lock.js +197 -0
  321. package/lib/utils/scroll-lock.js.map +1 -0
  322. package/lib/utils/styles.d.ts +27 -0
  323. package/lib/utils/styles.d.ts.map +1 -0
  324. package/lib/utils/styles.js +53 -0
  325. package/lib/utils/styles.js.map +1 -0
  326. package/lib/version.d.ts +8 -0
  327. package/lib/version.d.ts.map +1 -0
  328. package/lib/version.js +11 -0
  329. package/lib/version.js.map +1 -0
  330. package/package.json +159 -0
package/css/tyrell.css ADDED
@@ -0,0 +1,1783 @@
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
+ /* =================================================================
128
+ 5-VARIANT COLOR SYSTEM
129
+ Simplified from 7 variants to 5 practical variants:
130
+ -strong = Strong emphasis - active states, strong borders
131
+ -mild = 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-mild: #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-mild: #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-mild: #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-mild: #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-mild: #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-mild: #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 */
180
+ --ty-color-accent-mild: #ff8800; /* darker - hover/active */
181
+ --ty-color-accent: #e67b00; /* base */
182
+ --ty-color-accent-soft: #f59e42; /* lighter - subtle */
183
+
184
+ /* =================================================================
185
+ BACKGROUND COLORS
186
+ ================================================================= */
187
+
188
+ --ty-bg-faint: #f8fafc;
189
+ /* Very light canvas - for minimal backgrounds */
190
+ --ty-bg-soft: #f1f5f9;
191
+ /* Light canvas - app backgrounds */
192
+ --ty-bg: #ffffff;
193
+ /* WHITE - primary content baseline */
194
+ --ty-bg-mild: #f8fafc;
195
+ /* Subtle elevation - cards with light tint */
196
+ --ty-bg-strong: #e2e8f0;
197
+ /* Maximum elevation - clear distinction */
198
+
199
+ /* Focus ring gap - matches page background for button focus ring effect */
200
+ --ty-focus-ring-gap: #ffffff;
201
+
202
+ /* Primary backgrounds */
203
+ --ty-bg-primary: #e3eefc;
204
+ --ty-bg-primary-mild: #d5e4f8;
205
+ --ty-bg-primary-soft: #eff6ff;
206
+
207
+ /* Secondary backgrounds */
208
+ --ty-bg-secondary: #e9d5ff;
209
+ --ty-bg-secondary-mild: #ddd6fe;
210
+ --ty-bg-secondary-soft: #f3e8ff;
211
+
212
+ /* Success backgrounds */
213
+ --ty-bg-success: #d1fae5;
214
+ --ty-bg-success-mild: #a7f3d0;
215
+ --ty-bg-success-soft: #ecfdf5;
216
+
217
+ /* Danger backgrounds */
218
+ --ty-bg-danger: #fee2e2;
219
+ --ty-bg-danger-mild: #fecaca;
220
+ --ty-bg-danger-soft: #fef2f2;
221
+
222
+ /* Warning backgrounds */
223
+ --ty-bg-warning: #fef3c7;
224
+ --ty-bg-warning-mild: #fde68a;
225
+ --ty-bg-warning-soft: #fffbeb;
226
+
227
+ /* Neutral backgrounds */
228
+ --ty-bg-neutral: #e0e0e0;
229
+ --ty-bg-neutral-mild: #cecece;
230
+ --ty-bg-neutral-soft: #ededed;
231
+
232
+ /* Accent backgrounds */
233
+ --ty-bg-accent: #ffedd5; /* light orange tint */
234
+ --ty-bg-accent-mild: #fed7aa; /* slightly stronger */
235
+ --ty-bg-accent-soft: #fff7ed; /* very subtle */
236
+
237
+ /* =================================================================
238
+ BORDER COLORS
239
+ ================================================================= */
240
+
241
+ --ty-border: #e5e7eb;
242
+ --ty-border-mild: #d1d5db;
243
+ --ty-border-strong: #6b7280;
244
+ --ty-border-soft: #f3f4f6;
245
+ --ty-border-faint: #fafafa;
246
+
247
+ /* Border width — used as fallback by surface utilities (--ty-{surface}-border-width) */
248
+ --ty-border-width: 1px;
249
+
250
+ /* Semantic borders */
251
+ --ty-border-primary: var(--ty-color-primary);
252
+ --ty-border-secondary: var(--ty-color-secondary);
253
+ --ty-border-success: var(--ty-color-success);
254
+ --ty-border-danger: var(--ty-color-danger);
255
+ --ty-border-warning: var(--ty-color-warning);
256
+ --ty-border-neutral: var(--ty-color-neutral);
257
+ --ty-border-accent-mild: var(--ty-color-accent-mild);
258
+ --ty-border-accent: var(--ty-color-accent);
259
+ --ty-border-accent-soft: var(--ty-color-accent-soft);
260
+
261
+ /* =================================================================
262
+ SCROLLBAR
263
+ ================================================================= */
264
+
265
+ --ty-scrollbar-thumb: rgba(0, 0, 0, 0.35);
266
+ --ty-scrollbar-thumb-hover: rgba(0, 0, 0, 0.5);
267
+ --ty-scrollbar-thumb-active: rgba(0, 0, 0, 0.6);
268
+ --ty-scrollbar-track: transparent;
269
+ --ty-scrollbar-track-hover: rgba(0, 0, 0, 0.06);
270
+
271
+ /* =================================================================
272
+ SURFACE SYSTEM
273
+ ================================================================= */
274
+
275
+ --ty-surface-canvas: #fcfcfc;
276
+ --ty-surface-content: #fcfcfc;
277
+ --ty-surface-elevated: #ffffff;
278
+ --ty-surface-floating: #ffffff;
279
+ --ty-surface-input: #ffffff;
280
+
281
+ /* Surface borders — opt-in. Set color to make a surface's border visible.
282
+ Width and style fall back to --ty-border-width and `solid` if unset. */
283
+ --ty-elevated-border: #e5e7eb;
284
+ --ty-elevated-border-width: var(--ty-border-width);
285
+ --ty-elevated-border-style: solid;
286
+
287
+ --ty-floating-border: #e5e7eb;
288
+ --ty-floating-border-width: var(--ty-border-width);
289
+ --ty-floating-border-style: solid;
290
+
291
+ --ty-canvas-border: transparent;
292
+ --ty-canvas-border-width: var(--ty-border-width);
293
+ --ty-canvas-border-style: solid;
294
+
295
+ --ty-content-border: #e5e7eb;
296
+ --ty-content-border-width: var(--ty-border-width);
297
+ --ty-content-border-style: solid;
298
+
299
+ /* --ty-input-border is already declared above as a color token used by
300
+ <ty-input> shadow DOM; .ty-input utility reuses it. Width/style still here. */
301
+ --ty-input-border-width: var(--ty-border-width);
302
+ --ty-input-border-style: solid;
303
+
304
+ /* Divider context — consumed by .ty-divide-x / .ty-divide-y utilities.
305
+ Each surface re-points --ty-divide-color to its own --ty-{surface}-border
306
+ token, so the same knob controls both the surface's chrome AND any
307
+ dividers inside it. Inherits down the tree via CSS variable inheritance. */
308
+ --ty-divide-color: var(--ty-border);
309
+ --ty-divide-width: var(--ty-border-width);
310
+
311
+ /* =================================================================
312
+ TEXT HIERARCHY
313
+ ================================================================= */
314
+
315
+ /* Text hierarchy - emphasis based, not semantic */
316
+ --ty-text: #111827;
317
+ --ty-text-mild: #000000;
318
+ --ty-text-strong: #000000;
319
+ --ty-text-soft: #374151;
320
+ --ty-text-faint: #9ca3af;
321
+
322
+ /* =================================================================
323
+ COMPONENT TOKENS
324
+ ================================================================= */
325
+
326
+ /* Modal tokens */
327
+ --ty-modal-bg: #ffffff;
328
+ --ty-modal-color: #111827;
329
+ --ty-modal-border: #e5e7eb;
330
+ --ty-modal-backdrop: rgba(0, 0, 0, 0.5);
331
+ --ty-modal-backdrop-blur: blur(2px);
332
+ --ty-modal-border-radius: 16px;
333
+ --ty-modal-shadow:
334
+ 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04);
335
+ --ty-modal-duration: 200ms;
336
+
337
+ /* Modal sizing */
338
+ --ty-modal-sm-width: 300px;
339
+ --ty-modal-md-width: 500px;
340
+ --ty-modal-lg-width: 700px;
341
+ --ty-modal-xl-width: 900px;
342
+ --ty-modal-full-width: 95vw;
343
+ --ty-modal-full-height: 95vh;
344
+
345
+ /* Input component tokens */
346
+ --ty-input-bg: #ffffff;
347
+ --ty-input-color: #111827;
348
+ --ty-input-border: #d1d5db;
349
+ --ty-input-border-hover: #9ca3af;
350
+ --ty-input-border-focus: var(--ty-color-primary);
351
+ --ty-input-shadow-focus: rgba(59, 130, 246, 0.1);
352
+ --ty-input-placeholder: #9ca3af;
353
+ --ty-input-disabled-bg: #f9fafb;
354
+ --ty-input-disabled-border: #e5e7eb;
355
+ --ty-input-disabled-color: #9ca3af;
356
+ --ty-label-color: #374151;
357
+
358
+ /* Input semantic states */
359
+ --ty-input-success-border: var(--ty-color-success);
360
+ --ty-input-danger-border: var(--ty-color-danger);
361
+ --ty-input-warning-border: var(--ty-color-warning);
362
+
363
+ /* =================================================================
364
+ SOLID BUTTON FILLS — saturated brand backgrounds for appearance="solid"
365
+ Each flavor defines:
366
+ --ty-solid-{flavor} base saturated fill
367
+ --ty-solid-{flavor}-strong stronger fill (for solid+ tone)
368
+ --ty-solid-{flavor}-soft softer fill (for solid- tone)
369
+ --ty-solid-{flavor}-fg paired text color (default white)
370
+ Strong/soft default to var(--ty-color-{flavor}-strong/-soft) so they
371
+ inherit from the existing color hierarchy. Override per flavor if needed.
372
+ ================================================================= */
373
+
374
+ /* Primary */
375
+ --ty-solid-primary: #4076b9;
376
+ --ty-solid-primary-strong: var(--ty-color-primary-mild);
377
+ --ty-solid-primary-soft: #7ea7d9;
378
+ --ty-solid-primary-fg: white;
379
+
380
+ /* Secondary */
381
+ --ty-solid-secondary: #7e67b4;
382
+ --ty-solid-secondary-strong: #7d58d1;
383
+ --ty-solid-secondary-soft: #9f8ec5;
384
+ --ty-solid-secondary-fg: white;
385
+
386
+ /* Success */
387
+ --ty-solid-success: #3bb68d;
388
+ --ty-solid-success-strong: #27956e;
389
+ --ty-solid-success-soft: #69b99e;
390
+ --ty-solid-success-fg: white;
391
+
392
+ /* Danger */
393
+ --ty-solid-danger: #df5b5b;
394
+ --ty-solid-danger-strong: #cc3e3e;
395
+ --ty-solid-danger-soft: #d57a7a;
396
+ --ty-solid-danger-fg: white;
397
+
398
+ /* Warning */
399
+ --ty-solid-warning: #e1a644;
400
+ --ty-solid-warning-strong: #f59e0b;
401
+ --ty-solid-warning-soft: #fbc56d;
402
+ --ty-solid-warning-fg: white;
403
+
404
+ /* Neutral */
405
+ --ty-solid-neutral: #414141;
406
+ --ty-solid-neutral-strong: #000000;
407
+ --ty-solid-neutral-soft: #6e6e6e;
408
+ --ty-solid-neutral-fg: white;
409
+
410
+ /* Brand-highlight pseudo-flavor (orange) — kept under ty-accent-* namespace */
411
+ --ty-accent-accent: #cc6d00;
412
+
413
+ /* =================================================================
414
+ DESIGN SYSTEM TOKENS
415
+ ================================================================= */
416
+
417
+ /* Spacing Scale */
418
+ --ty-spacing-0: 0;
419
+ --ty-spacing-px: 1px;
420
+ --ty-spacing-mini: 0.125rem;
421
+ --ty-spacing-1: 0.25rem;
422
+ --ty-spacing-2: 0.5rem;
423
+ --ty-spacing-3: 0.75rem;
424
+ --ty-spacing-4: 1rem;
425
+ --ty-spacing-5: 1.25rem;
426
+ --ty-spacing-6: 1.5rem;
427
+ --ty-spacing-7: 1.75rem;
428
+ --ty-spacing-8: 2rem;
429
+ --ty-spacing-9: 2.25rem;
430
+ --ty-spacing-10: 2.5rem;
431
+ --ty-spacing-12: 3rem;
432
+ --ty-spacing-16: 4rem;
433
+ --ty-spacing-20: 5rem;
434
+ --ty-spacing-24: 6rem;
435
+
436
+ /* Border Radius */
437
+ --ty-radius-none: 0;
438
+ --ty-radius-sm: 0.25rem; /* 4px */
439
+ --ty-radius-base: 0.375rem; /* 6px */
440
+ --ty-radius-md: 0.5rem; /* 8px (anchor) */
441
+ --ty-radius-lg: 0.75rem; /* 12px */
442
+ --ty-radius-xl: 1rem; /* 16px */
443
+ --ty-radius-2xl: 1.5rem; /* 24px */
444
+ --ty-radius-3xl: 2rem; /* 32px */
445
+ --ty-radius-full: 9999px;
446
+
447
+ /* Shadows */
448
+ --ty-shadow-none: none;
449
+ --ty-shadow-sm: 0 1px 2px 0 rgba(0, 0, 0, 0.05);
450
+ --ty-shadow-base:
451
+ 0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px -1px rgba(0, 0, 0, 0.1);
452
+ --ty-shadow-md:
453
+ 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -2px rgba(0, 0, 0, 0.1);
454
+ --ty-shadow-lg:
455
+ 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -4px rgba(0, 0, 0, 0.1);
456
+ --ty-shadow-xl:
457
+ 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 8px 10px -6px rgba(0, 0, 0, 0.1);
458
+ --ty-shadow-2xl: 0 25px 50px -12px rgba(0, 0, 0, 0.25);
459
+
460
+ /* Typography */
461
+ --ty-font-sans:
462
+ system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
463
+ --ty-font-mono: ui-monospace, SFMono-Regular, "SF Mono", Consolas, monospace;
464
+
465
+ --ty-font-xxs: 0.625rem;
466
+ --ty-font-xs: 0.75rem;
467
+ --ty-font-sm: 0.875rem;
468
+ --ty-font-base: 1rem;
469
+ --ty-font-lg: 1.125rem;
470
+ --ty-font-xl: 1.25rem;
471
+ --ty-font-2xl: 1.5rem;
472
+ --ty-font-3xl: 1.875rem;
473
+ --ty-font-4xl: 2.25rem;
474
+ --ty-font-5xl: 3rem;
475
+
476
+ /* Paired line-heights — values follow Linear's text-* tokens (text-small
477
+ uses 21px not 20px; text-regular uses 1.6 ratio for breathable body text).
478
+ Paired with --ty-font-* so that `font-size: var(--ty-font-sm)` should also
479
+ use `line-height: var(--ty-leading-sm)`. */
480
+ --ty-leading-xxs: 0.9375rem; /* 15px paired with 10px text (Linear text-tiny 1.5) */
481
+ --ty-leading-xs: 1.05rem; /* ≈16.8px paired with 12px text (Linear text-micro 1.4) */
482
+ --ty-leading-sm: 1.3125rem; /* 21px paired with 14px text (Linear text-small) */
483
+ --ty-leading-base: 1.5rem; /* 24px paired with 16px text (Linear text-regular 1.6 ≈) */
484
+ --ty-leading-lg: 1.6875rem; /* 27px paired with 18px text (Linear text-large) */
485
+ --ty-leading-xl: 1.75rem; /* 28px paired with 20px text */
486
+ --ty-leading-2xl: 2rem; /* 32px paired with 24px text */
487
+ --ty-leading-3xl: 2.25rem; /* 36px paired with 30px text */
488
+ --ty-leading-4xl: 2.5rem; /* 40px paired with 36px text */
489
+ --ty-leading-5xl: 1; /* paired with 48px+ display text */
490
+
491
+ /* Letter-spacing (tracking) tokens — pulled from Linear's per-size values.
492
+ Linear uses slightly negative tracking on most text to tighten Inter. */
493
+ --ty-tracking-xxs: -0.015em; /* paired with text-tiny */
494
+ --ty-tracking-xs: 0; /* paired with text-micro */
495
+ --ty-tracking-sm: -0.013em; /* paired with text-small */
496
+ --ty-tracking-base: -0.011em; /* paired with text-regular */
497
+ --ty-tracking-lg: 0; /* paired with text-large */
498
+ --ty-tracking-tight: -0.022em; /* for titles (Linear title-4 and up) */
499
+ --ty-tracking-title: -0.012em; /* for titles (Linear title-1..3) */
500
+
501
+ /* Weights tuned to Linear (Inter Variable). With the system font stack
502
+ these round to the nearest available (500/600/700); load Inter Variable
503
+ for the exact rendering. */
504
+ --ty-font-thin: 100;
505
+ --ty-font-light: 300;
506
+ --ty-font-normal: 400;
507
+ --ty-font-medium: 510;
508
+ --ty-font-semibold: 590;
509
+ --ty-font-bold: 680;
510
+ --ty-font-extrabold: 800;
511
+
512
+ --ty-line-height-none: 1;
513
+ --ty-line-height-tight: 1.25;
514
+ --ty-line-height-snug: 1.375;
515
+ --ty-line-height-normal: 1.5;
516
+ --ty-line-height-relaxed: 1.625;
517
+ --ty-line-height-loose: 2;
518
+
519
+ /* Transitions */
520
+ --ty-transition-none: none;
521
+ --ty-transition-all: all 150ms cubic-bezier(0.4, 0, 0.2, 1);
522
+ --ty-transition-colors:
523
+ bg-color, border-color, color, fill,
524
+ stroke 150ms cubic-bezier(0.4, 0, 0.2, 1);
525
+ --ty-transition-shadow: box-shadow 150ms cubic-bezier(0.4, 0, 0.2, 1);
526
+ --ty-transition-transform: transform 150ms cubic-bezier(0.4, 0, 0.2, 1);
527
+
528
+ /* Component Sizes */
529
+ --ty-size-xs: 1.5rem;
530
+ /* 24px */
531
+ --ty-size-sm: 2rem;
532
+ /* 32px */
533
+ --ty-size-md: 2.5rem;
534
+ /* 40px */
535
+ --ty-size-lg: 3rem;
536
+ /* 48px */
537
+ --ty-size-xl: 3.5rem;
538
+ /* 56px */
539
+
540
+ /* Z-Index Scale */
541
+ --ty-z-auto: auto;
542
+ --ty-z-0: 0;
543
+ --ty-z-10: 10;
544
+ --ty-z-20: 20;
545
+ --ty-z-30: 30;
546
+ --ty-z-40: 40;
547
+ --ty-z-50: 50;
548
+ --ty-z-sticky: 1020;
549
+ --ty-z-fixed: 1030;
550
+ --ty-z-modal-backdrop: 1040;
551
+ --ty-z-modal: 1050;
552
+ --ty-z-popover: 1060;
553
+ --ty-z-tooltip: 1070;
554
+ --ty-z-dropdown: 1080;
555
+
556
+ /* =================================================================
557
+ SCROLL SHADOW SYSTEM
558
+ Uses clip-path technique for smooth corner fade
559
+ ================================================================= */
560
+ --ty-scroll-shadow-top: radial-gradient(
561
+ ellipse 100% 30% at center,
562
+ rgba(0, 0, 0, 0.1),
563
+ rgba(0, 0, 0, 0),
564
+ transparent
565
+ );
566
+ --ty-scroll-shadow-bottom: radial-gradient(
567
+ ellipse 100% 20% at center,
568
+ rgba(0, 0, 0, 0.15),
569
+ rgba(0, 0, 0, 0),
570
+ transparent
571
+ );
572
+ --ty-scroll-shadow-transition: opacity 0.2s ease-out;
573
+ }
574
+
575
+ /* =================================================================
576
+ DARK THEME OVERRIDES
577
+ ================================================================= */
578
+
579
+ html.dark,
580
+ html[data-theme="dark"] {
581
+ /* =================================================================
582
+ 5-VARIANT COLOR SYSTEM - DARK THEME
583
+ Emphasis logic inverts: lighter = more emphasis
584
+ ================================================================= */
585
+
586
+ /* Primary */
587
+ --ty-color-primary-strong: #9cbde5;
588
+ --ty-color-primary-mild: #6c9bd5;
589
+ --ty-color-primary: #4976ae;
590
+ --ty-color-primary-soft: #4b698b;
591
+ --ty-color-primary-faint: #445b77;
592
+
593
+ /* Secondary */
594
+ --ty-color-secondary-strong: #ddd6fe;
595
+ --ty-color-secondary-mild: #c4b5fd;
596
+ --ty-color-secondary: #a78bfa;
597
+ --ty-color-secondary-soft: #8269bc;
598
+ --ty-color-secondary-faint: #76619f;
599
+
600
+ /* Success */
601
+ --ty-color-success-strong: #c2f0df;
602
+ --ty-color-success-mild: #6ee7b7;
603
+ --ty-color-success: #3aba8b;
604
+ --ty-color-success-soft: #459679;
605
+ --ty-color-success-faint: #1b795c;
606
+
607
+ /* Danger */
608
+ --ty-color-danger-strong: #ffabab;
609
+ --ty-color-danger-mild: #e58787;
610
+ --ty-color-danger: #d06f6f;
611
+ --ty-color-danger-soft: #b06666;
612
+ --ty-color-danger-faint: #aa6e6e;
613
+
614
+ /* Warning */
615
+ --ty-color-warning-strong: #fde68a;
616
+ --ty-color-warning-mild: #fcd34d;
617
+ --ty-color-warning: #fbbf24;
618
+ --ty-color-warning-soft: #f59e0b;
619
+ --ty-color-warning-faint: #a06726;
620
+
621
+ /* Neutral */
622
+ --ty-color-neutral-strong: #ffffff;
623
+ --ty-color-neutral-mild: #f9fafb;
624
+ --ty-color-neutral: #d6d6d6;
625
+ --ty-color-neutral-soft: #696969;
626
+ --ty-color-neutral-faint: #474747;
627
+
628
+ /* Accent - dark mode (emphasis inverted) */
629
+ --ty-color-accent-mild: #ffb366; /* lighter = more emphasis */
630
+ --ty-color-accent: #e67b00; /* base */
631
+ --ty-color-accent-soft: #ac5f00; /* darker = less emphasis */
632
+
633
+ /* Backgrounds for dark mode */
634
+ --ty-bg-faint: #0f1419;
635
+ --ty-bg-soft: #111827;
636
+ --ty-bg: #1f2937;
637
+ --ty-bg-mild: #374151;
638
+ --ty-bg-strong: #6b7280;
639
+
640
+ /* Focus ring gap */
641
+ --ty-focus-ring-gap: #1f2937;
642
+
643
+ /* Semantic backgrounds - much darker in dark mode */
644
+ --ty-bg-primary-mild: #43517a;
645
+ --ty-bg-primary: #394159;
646
+ --ty-bg-primary-soft: #323a4f;
647
+
648
+ --ty-bg-secondary-mild: #58368e;
649
+ --ty-bg-secondary: #4a3c65;
650
+ --ty-bg-secondary-soft: #3b3645;
651
+
652
+ --ty-bg-success: #3a4442;
653
+ --ty-bg-success-mild: #405752;
654
+ --ty-bg-success-soft: #2f3b38;
655
+
656
+ --ty-bg-danger-mild: #853535;
657
+ --ty-bg-danger: #522828;
658
+ --ty-bg-danger-soft: #483c3c;
659
+
660
+ --ty-bg-warning-mild: #743953;
661
+ --ty-bg-warning: #694555;
662
+ --ty-bg-warning-soft: #45333b;
663
+
664
+ --ty-bg-neutral-mild: #414141;
665
+ --ty-bg-neutral: #323232;
666
+ --ty-bg-neutral-soft: #242424;
667
+
668
+ /* Accent backgrounds - dark mode */
669
+ --ty-bg-accent: #996432;
670
+ --ty-bg-accent-mild: #da7d25;
671
+ --ty-bg-accent-soft: #5c3d1a;
672
+
673
+ /* Borders for dark mode */
674
+ --ty-border-strong: #8c8c8c;
675
+ --ty-border-mild: #666666;
676
+ --ty-border: #535353;
677
+ --ty-border-soft: #1f2937;
678
+ --ty-border-faint: #030712;
679
+
680
+ /* Scrollbar - dark mode */
681
+ --ty-scrollbar-thumb: rgba(255, 255, 255, 0.22);
682
+ --ty-scrollbar-thumb-hover: rgba(255, 255, 255, 0.38);
683
+ --ty-scrollbar-thumb-active: rgba(255, 255, 255, 0.48);
684
+ --ty-scrollbar-track: transparent;
685
+ --ty-scrollbar-track-hover: rgba(255, 255, 255, 0.06);
686
+
687
+ --ty-surface-canvas: black;
688
+ --ty-surface-content: #1a1a1a;
689
+ --ty-surface-elevated: #282828;
690
+ --ty-surface-floating: #343434;
691
+ --ty-surface-input: #1f2937;
692
+
693
+ --ty-content-border: #030712;
694
+ --ty-elevated-border: #414141;
695
+ --ty-border: #3e3e3e;
696
+ --ty-floating-border: #494949;
697
+
698
+ --ty-text-mild: #f9fafb;
699
+ --ty-text-strong: #ffffff;
700
+ --ty-text: #d6d6d6;
701
+ --ty-text-soft: #7f8590;
702
+ --ty-text-faint: #555a63;
703
+
704
+ /* Shadows need to be darker/more prominent in dark mode */
705
+ --ty-shadow-sm: 0 1px 2px 0 rgba(0, 0, 0, 0.2);
706
+ --ty-shadow-base:
707
+ 0 1px 3px 0 rgba(0, 0, 0, 0.3), 0 1px 2px -1px rgba(0, 0, 0, 0.3);
708
+ --ty-shadow-md:
709
+ 0 4px 6px -1px rgba(0, 0, 0, 0.3), 0 2px 4px -2px rgba(0, 0, 0, 0.3);
710
+ --ty-shadow-lg:
711
+ 0 10px 15px -3px rgba(0, 0, 0, 0.3), 0 4px 6px -4px rgba(0, 0, 0, 0.3);
712
+ --ty-shadow-xl:
713
+ 0 20px 25px -5px rgba(0, 0, 0, 0.3), 0 8px 10px -6px rgba(0, 0, 0, 0.3);
714
+ --ty-shadow-2xl: 0 25px 50px -12px rgba(0, 0, 0, 0.5);
715
+
716
+ /* Solid button fills for dark mode — strong/soft/fg chain through automatically.
717
+ Note: --ty-color-{flavor}-strong is light-toned in dark mode (emphasis
718
+ inverts), so solid+ buttons will have a light bg with white text — low
719
+ contrast for some flavors. Override per flavor via --ty-solid-{flavor}-fg
720
+ if a specific brand needs darker text. */
721
+ --ty-solid-primary: #3e536c;
722
+ --ty-solid-primary-strong: #426084;
723
+ --ty-solid-primary-soft: #343f4c;
724
+ --ty-solid-primary-fg: white;
725
+
726
+ --ty-solid-secondary: #7e67b4;
727
+ --ty-solid-secondary-strong: #8269bc;
728
+ --ty-solid-secondary-soft: #52466a;
729
+ --ty-solid-secondary-fg: white;
730
+
731
+ /* Success */
732
+ --ty-solid-success: #3bb68d;
733
+ --ty-solid-success-strong: #459679;
734
+ --ty-solid-success-soft: #285748;
735
+ --ty-solid-success-fg: white;
736
+
737
+ /* Danger */
738
+ --ty-solid-danger: #df5b5b;
739
+ --ty-solid-danger-strong: #cc3e3e;
740
+ --ty-solid-danger-soft: #875656;
741
+ --ty-solid-danger-fg: white;
742
+
743
+ /* Warning */
744
+ --ty-solid-warning: #e1a644;
745
+ --ty-solid-warning-strong: #f59e0b;
746
+ --ty-solid-warning-soft: #8b6334;
747
+ --ty-solid-warning-fg: white;
748
+
749
+ --ty-solid-neutral: #414141;
750
+ --ty-solid-neutral-strong: #4c4c4c;
751
+ --ty-solid-neutral-soft: #2a2a2a;
752
+ --ty-solid-neutral-fg: white;
753
+
754
+ --ty-accent-accent: #cc6d00;
755
+
756
+ /* Input component tokens - dark mode */
757
+ --ty-input-bg: #1b1b1b;
758
+ --ty-input-color: #f9fafb;
759
+ --ty-input-border: #505050;
760
+ --ty-input-border-hover: #7f7f7f;
761
+ --ty-input-border-focus: var(--ty-color-primary);
762
+ --ty-input-shadow-focus: rgba(96, 165, 250, 0.1);
763
+ --ty-input-placeholder: #717171;
764
+ --ty-input-disabled-bg: #282828;
765
+ --ty-input-disabled-border: #2e2e2e;
766
+ --ty-input-disabled-color: #717171;
767
+ --ty-label-color: #d1d5db;
768
+
769
+ /* Modal - dark mode */
770
+ --ty-modal-bg: var(--ty-bg-mild);
771
+ --ty-modal-color: var(--ty-color-neutral-mild);
772
+ --ty-modal-border: var(--ty-border);
773
+ --ty-modal-backdrop: rgba(0, 0, 0, 0.7);
774
+ --ty-modal-shadow:
775
+ 0 20px 25px -5px rgba(0, 0, 0, 0.4), 0 10px 10px -5px rgba(0, 0, 0, 0.2);
776
+
777
+ /* Scroll shadows - lighter tint for dark mode */
778
+ --ty-scroll-shadow-top: radial-gradient(
779
+ ellipse 100% 30% at center,
780
+ rgba(172, 172, 172, 0.2),
781
+ rgba(0, 0, 0, 0),
782
+ transparent
783
+ );
784
+ --ty-scroll-shadow-bottom: radial-gradient(
785
+ ellipse 100% 20% at center,
786
+ rgba(172, 172, 172, 0.3),
787
+ rgba(0, 0, 0, 0),
788
+ transparent
789
+ );
790
+ }
791
+
792
+ /* =================================================================
793
+ TEXT SELECTION STYLING
794
+ Global and semantic text selection colors
795
+ ================================================================= */
796
+
797
+ /* Global text selection - uses primary colors by default */
798
+ ::selection {
799
+ background-color: var(--ty-selection-bg, var(--ty-bg-primary-mild));
800
+ color: var(--ty-selection-color, var(--ty-text-strong));
801
+ }
802
+
803
+ ::-moz-selection {
804
+ background-color: var(--ty-selection-bg, var(--ty-color-primary));
805
+ color: var(--ty-selection-color, var(--ty-text-strong));
806
+ }
807
+
808
+ /* Code block selection - special handling for better readability */
809
+ pre ::selection,
810
+ code ::selection,
811
+ pre::-moz-selection,
812
+ code::-moz-selection {
813
+ background-color: var(--ty-color-warning-soft);
814
+ color: var(--ty-color-neutral-strong);
815
+ }
816
+
817
+ html.dark pre ::selection,
818
+ html.dark code ::selection,
819
+ html.dark pre::-moz-selection,
820
+ html.dark code::-moz-selection {
821
+ background-color: var(--ty-color-warning);
822
+ color: var(--ty-bg-strong);
823
+ }
824
+
825
+ /* Input and textarea selection - higher contrast */
826
+ input::selection,
827
+ textarea::selection,
828
+ input::-moz-selection,
829
+ textarea::-moz-selection {
830
+ background-color: var(--ty-color-primary);
831
+ color: white;
832
+ }
833
+
834
+ html.dark input::selection,
835
+ html.dark textarea::selection,
836
+ html.dark input::-moz-selection,
837
+ html.dark textarea::-moz-selection {
838
+ background-color: var(--ty-color-primary-soft);
839
+ color: var(--ty-color-primary-strong);
840
+ }
841
+
842
+ /* Semantic selection utility classes */
843
+ .ty-selection-primary ::selection,
844
+ .ty-selection-primary::-moz-selection {
845
+ background-color: var(--ty-color-primary-soft);
846
+ color: var(--ty-color-primary-strong);
847
+ }
848
+
849
+ .ty-selection-secondary ::selection,
850
+ .ty-selection-secondary::-moz-selection {
851
+ background-color: var(--ty-color-secondary-soft);
852
+ color: var(--ty-color-secondary-strong);
853
+ }
854
+
855
+ .ty-selection-success ::selection,
856
+ .ty-selection-success::-moz-selection {
857
+ background-color: var(--ty-color-success-soft);
858
+ color: var(--ty-color-success-strong);
859
+ }
860
+
861
+ .ty-selection-warning ::selection,
862
+ .ty-selection-warning::-moz-selection {
863
+ background-color: var(--ty-color-warning-soft);
864
+ color: var(--ty-color-warning-strong);
865
+ }
866
+
867
+ .ty-selection-danger ::selection,
868
+ .ty-selection-danger::-moz-selection {
869
+ background-color: var(--ty-color-danger-soft);
870
+ color: var(--ty-color-danger-strong);
871
+ }
872
+
873
+ .ty-selection-neutral ::selection,
874
+ .ty-selection-neutral::-moz-selection {
875
+ background-color: var(--ty-color-neutral-soft);
876
+ color: var(--ty-color-neutral-strong);
877
+ }
878
+
879
+ /* Dark mode semantic selections */
880
+ html.dark .ty-selection-primary ::selection,
881
+ html.dark .ty-selection-primary::-moz-selection {
882
+ background-color: var(--ty-color-primary);
883
+ color: white;
884
+ }
885
+
886
+ html.dark .ty-selection-secondary ::selection,
887
+ html.dark .ty-selection-secondary::-moz-selection {
888
+ background-color: var(--ty-color-secondary);
889
+ color: white;
890
+ }
891
+
892
+ html.dark .ty-selection-success ::selection,
893
+ html.dark .ty-selection-success::-moz-selection {
894
+ background-color: var(--ty-color-success);
895
+ color: white;
896
+ }
897
+
898
+ html.dark .ty-selection-warning ::selection,
899
+ html.dark .ty-selection-warning::-moz-selection {
900
+ background-color: var(--ty-color-warning);
901
+ color: var(--ty-bg-strong);
902
+ }
903
+
904
+ html.dark .ty-selection-danger ::selection,
905
+ html.dark .ty-selection-danger::-moz-selection {
906
+ background-color: var(--ty-color-danger);
907
+ color: white;
908
+ }
909
+
910
+ html.dark .ty-selection-neutral ::selection,
911
+ html.dark .ty-selection-neutral::-moz-selection {
912
+ background-color: var(--ty-color-neutral);
913
+ color: white;
914
+ }
915
+
916
+ /* =================================================================
917
+ UTILITY CLASSES
918
+ ================================================================= */
919
+
920
+ /* Sensible default for any border that doesn't set its own color —
921
+ Tailwind's `border` / `border-t`, plain CSS `border: 1px solid`, etc.
922
+ Scoped to `html` to win specificity over Tailwind's (0,0,0) preflight
923
+ regardless of injection order. Class-based overrides (`border-red-500`,
924
+ `ty-border-primary`, etc.) still win their cascade. Theme-aware:
925
+ `--ty-border` switches in dark mode automatically. */
926
+ html *,
927
+ html ::before,
928
+ html ::after {
929
+ border-color: var(--ty-border);
930
+ }
931
+
932
+ /* =================================================================
933
+ SURFACE UTILITIES
934
+ ================================================================= */
935
+
936
+ /* Elevated surfaces - cards, panels, components */
937
+ .ty-elevated {
938
+ box-sizing: border-box !important;
939
+ background-color: var(--ty-surface-elevated) !important;
940
+ border: var(--ty-elevated-border-width, var(--ty-border-width, 1px))
941
+ var(--ty-elevated-border-style, solid)
942
+ var(--ty-elevated-border, transparent) !important;
943
+ box-shadow:
944
+ 0 1px 3px 0 rgb(0 0 0 / 0.1),
945
+ 0 1px 2px -1px rgb(0 0 0 / 0.1) !important;
946
+ --ty-divide-color: var(--ty-elevated-border);
947
+ }
948
+
949
+ /* Floating surfaces - modals, dropdowns, tooltips */
950
+ .ty-floating {
951
+ box-sizing: border-box !important;
952
+ background-color: var(--ty-surface-floating) !important;
953
+ border: var(--ty-floating-border-width, var(--ty-border-width, 1px))
954
+ var(--ty-floating-border-style, solid)
955
+ var(--ty-floating-border, transparent) !important;
956
+ box-shadow:
957
+ 0 4px 6px -1px rgb(0 0 0 / 0.1),
958
+ 0 2px 4px -2px rgb(0 0 0 / 0.1) !important;
959
+ --ty-divide-color: var(--ty-floating-border);
960
+ }
961
+
962
+ /* App and page backgrounds - the canvas for content */
963
+ .ty-canvas {
964
+ box-sizing: border-box !important;
965
+ background-color: var(--ty-surface-canvas) !important;
966
+ border: var(--ty-canvas-border-width, var(--ty-border-width, 1px))
967
+ var(--ty-canvas-border-style, solid) var(--ty-canvas-border, transparent) !important;
968
+ --ty-divide-color: var(--ty-canvas-border);
969
+ }
970
+
971
+ /* Main content areas - primary content background */
972
+ .ty-content {
973
+ box-sizing: border-box !important;
974
+ background-color: var(--ty-surface-content) !important;
975
+ border: var(--ty-content-border-width, var(--ty-border-width, 1px))
976
+ var(--ty-content-border-style, solid) var(--ty-content-border, transparent) !important;
977
+ --ty-divide-color: var(--ty-content-border);
978
+ }
979
+
980
+ /* Input surfaces - form controls, text areas, inputs */
981
+ .ty-input {
982
+ box-sizing: border-box !important;
983
+ background-color: var(--ty-input-bg) !important;
984
+ border: var(--ty-input-border-width, var(--ty-border-width, 1px))
985
+ var(--ty-input-border-style, solid) var(--ty-input-border, transparent) !important;
986
+ --ty-divide-color: var(--ty-input-border);
987
+ }
988
+
989
+ /* Divider utilities — consume --ty-divide-color from the nearest surface
990
+ context (set on .ty-elevated/.ty-floating/.ty-canvas/.ty-content/.ty-input)
991
+ via CSS variable inheritance. Override per-instance:
992
+ style="--ty-divide-color: var(--ty-border-strong);" */
993
+ .ty-divide-y > * + * {
994
+ border-top: var(--ty-divide-width, var(--ty-border-width, 1px)) solid
995
+ var(--ty-divide-color, var(--ty-border));
996
+ }
997
+
998
+ .ty-divide-x > * + * {
999
+ border-left: var(--ty-divide-width, var(--ty-border-width, 1px)) solid
1000
+ var(--ty-divide-color, var(--ty-border));
1001
+ }
1002
+
1003
+ /* Dark theme adjustments for shadows */
1004
+ html.dark .ty-elevated {
1005
+ background-color: var(--ty-surface-elevated) !important;
1006
+ box-shadow:
1007
+ 0 1px 3px 0 rgb(0 0 0 / 0.2),
1008
+ 0 1px 2px -1px rgb(0 0 0 / 0.2) !important;
1009
+ }
1010
+
1011
+ html.dark .ty-floating {
1012
+ background-color: var(--ty-surface-floating) !important;
1013
+ box-shadow:
1014
+ 0 4px 6px -1px rgb(0 0 0 / 0.3),
1015
+ 0 2px 4px -2px rgb(0 0 0 / 0.3) !important;
1016
+ }
1017
+
1018
+ html.dark .ty-high-elevation {
1019
+ background-color: var(--ty-surface-floating) !important;
1020
+ box-shadow:
1021
+ 0 10px 15px -3px rgb(0 0 0 / 0.4),
1022
+ 0 4px 6px -4px rgb(0 0 0 / 0.4) !important;
1023
+ }
1024
+
1025
+ html.dark .ty-sunken {
1026
+ background-color: var(--ty-surface-input) !important;
1027
+ box-shadow: inset 0 1px 2px 0 rgb(0 0 0 / 0.1) !important;
1028
+ }
1029
+
1030
+ /* =================================================================
1031
+ SEMANTIC BACKGROUND UTILITIES
1032
+ ================================================================= */
1033
+
1034
+ /* Semantic backgrounds - these are the key theme utilities */
1035
+ .ty-bg-primary {
1036
+ background-color: var(--ty-bg-primary);
1037
+ }
1038
+
1039
+ .ty-bg-primary\+ {
1040
+ background-color: var(--ty-bg-primary-mild);
1041
+ }
1042
+
1043
+ .ty-bg-primary- {
1044
+ background-color: var(--ty-bg-primary-soft);
1045
+ }
1046
+
1047
+ .ty-bg-secondary {
1048
+ background-color: var(--ty-bg-secondary);
1049
+ }
1050
+
1051
+ .ty-bg-secondary\+ {
1052
+ background-color: var(--ty-bg-secondary-mild);
1053
+ }
1054
+
1055
+ .ty-bg-secondary- {
1056
+ background-color: var(--ty-bg-secondary-soft);
1057
+ }
1058
+
1059
+ .ty-bg-success {
1060
+ background-color: var(--ty-bg-success);
1061
+ }
1062
+
1063
+ .ty-bg-success\+ {
1064
+ background-color: var(--ty-bg-success-mild);
1065
+ }
1066
+
1067
+ .ty-bg-success- {
1068
+ background-color: var(--ty-bg-success-soft);
1069
+ }
1070
+
1071
+ .ty-bg-danger {
1072
+ background-color: var(--ty-bg-danger);
1073
+ }
1074
+
1075
+ .ty-bg-danger\+ {
1076
+ background-color: var(--ty-bg-danger-mild);
1077
+ }
1078
+
1079
+ .ty-bg-danger- {
1080
+ background-color: var(--ty-bg-danger-soft);
1081
+ }
1082
+
1083
+ .ty-bg-warning {
1084
+ background-color: var(--ty-bg-warning);
1085
+ }
1086
+
1087
+ .ty-bg-warning\+ {
1088
+ background-color: var(--ty-bg-warning-mild);
1089
+ }
1090
+
1091
+ .ty-bg-warning- {
1092
+ background-color: var(--ty-bg-warning-soft);
1093
+ }
1094
+
1095
+ .ty-bg-neutral {
1096
+ background-color: var(--ty-bg-neutral);
1097
+ }
1098
+
1099
+ .ty-bg-neutral\+ {
1100
+ background-color: var(--ty-bg-neutral-mild);
1101
+ }
1102
+
1103
+ .ty-bg-neutral- {
1104
+ background-color: var(--ty-bg-neutral-soft);
1105
+ }
1106
+
1107
+ /* Accent backgrounds */
1108
+ .ty-bg-accent {
1109
+ background-color: var(--ty-bg-accent);
1110
+ }
1111
+
1112
+ .ty-bg-accent\+ {
1113
+ background-color: var(--ty-bg-accent-mild);
1114
+ }
1115
+
1116
+ .ty-bg-accent- {
1117
+ background-color: var(--ty-bg-accent-soft);
1118
+ }
1119
+
1120
+ /* =================================================================
1121
+ TEXT HIERARCHY UTILITIES
1122
+ ================================================================= */
1123
+
1124
+ /* Base text hierarchy - emphasis based, not semantic */
1125
+ .ty-text {
1126
+ color: var(--ty-text) !important;
1127
+ }
1128
+
1129
+ .ty-text\+ {
1130
+ color: var(--ty-text-mild) !important;
1131
+ }
1132
+
1133
+ .ty-text\+\+ {
1134
+ color: var(--ty-text-strong) !important;
1135
+ }
1136
+
1137
+ .ty-text- {
1138
+ color: var(--ty-text-soft) !important;
1139
+ }
1140
+
1141
+ .ty-text-- {
1142
+ color: var(--ty-text-faint) !important;
1143
+ }
1144
+
1145
+ /* =================================================================
1146
+ SEMANTIC TEXT COLORS - 5-VARIANT SYSTEM
1147
+ ================================================================= */
1148
+
1149
+ /* Primary text colors with full 5-variant system */
1150
+ .ty-text-primary\+\+ {
1151
+ color: var(--ty-color-primary-strong) !important;
1152
+ }
1153
+
1154
+ .ty-text-primary\+ {
1155
+ color: var(--ty-color-primary-mild) !important;
1156
+ }
1157
+
1158
+ .ty-text-primary {
1159
+ color: var(--ty-color-primary) !important;
1160
+ }
1161
+
1162
+ .ty-text-primary- {
1163
+ color: var(--ty-color-primary-soft) !important;
1164
+ }
1165
+
1166
+ .ty-text-primary-- {
1167
+ color: var(--ty-color-primary-faint) !important;
1168
+ }
1169
+
1170
+ /* Secondary text colors */
1171
+ .ty-text-secondary\+\+ {
1172
+ color: var(--ty-color-secondary-strong) !important;
1173
+ }
1174
+
1175
+ .ty-text-secondary\+ {
1176
+ color: var(--ty-color-secondary-mild) !important;
1177
+ }
1178
+
1179
+ .ty-text-secondary {
1180
+ color: var(--ty-color-secondary) !important;
1181
+ }
1182
+
1183
+ .ty-text-secondary- {
1184
+ color: var(--ty-color-secondary-soft) !important;
1185
+ }
1186
+
1187
+ .ty-text-secondary-- {
1188
+ color: var(--ty-color-secondary-faint) !important;
1189
+ }
1190
+
1191
+ /* Success text colors */
1192
+ .ty-text-success\+\+ {
1193
+ color: var(--ty-color-success-strong) !important;
1194
+ }
1195
+
1196
+ .ty-text-success\+ {
1197
+ color: var(--ty-color-success-mild) !important;
1198
+ }
1199
+
1200
+ .ty-text-success {
1201
+ color: var(--ty-color-success) !important;
1202
+ }
1203
+
1204
+ .ty-text-success- {
1205
+ color: var(--ty-color-success-soft) !important;
1206
+ }
1207
+
1208
+ .ty-text-success-- {
1209
+ color: var(--ty-color-success-faint) !important;
1210
+ }
1211
+
1212
+ /* Danger text colors */
1213
+ .ty-text-danger\+\+ {
1214
+ color: var(--ty-color-danger-strong) !important;
1215
+ }
1216
+
1217
+ .ty-text-danger\+ {
1218
+ color: var(--ty-color-danger-mild) !important;
1219
+ }
1220
+
1221
+ .ty-text-danger {
1222
+ color: var(--ty-color-danger) !important;
1223
+ }
1224
+
1225
+ .ty-text-danger- {
1226
+ color: var(--ty-color-danger-soft) !important;
1227
+ }
1228
+
1229
+ .ty-text-danger-- {
1230
+ color: var(--ty-color-danger-faint) !important;
1231
+ }
1232
+
1233
+ /* Warning text colors */
1234
+ .ty-text-warning\+\+ {
1235
+ color: var(--ty-color-warning-strong) !important;
1236
+ }
1237
+
1238
+ .ty-text-warning\+ {
1239
+ color: var(--ty-color-warning-mild) !important;
1240
+ }
1241
+
1242
+ .ty-text-warning {
1243
+ color: var(--ty-color-warning) !important;
1244
+ }
1245
+
1246
+ .ty-text-warning- {
1247
+ color: var(--ty-color-warning-soft) !important;
1248
+ }
1249
+
1250
+ .ty-text-warning-- {
1251
+ color: var(--ty-color-warning-faint) !important;
1252
+ }
1253
+
1254
+ /* Neutral text colors */
1255
+ .ty-text-neutral\+\+ {
1256
+ color: var(--ty-color-neutral-strong) !important;
1257
+ }
1258
+
1259
+ .ty-text-neutral\+ {
1260
+ color: var(--ty-color-neutral-mild) !important;
1261
+ }
1262
+
1263
+ .ty-text-neutral {
1264
+ color: var(--ty-color-neutral) !important;
1265
+ }
1266
+
1267
+ .ty-text-neutral- {
1268
+ color: var(--ty-color-neutral-soft) !important;
1269
+ }
1270
+
1271
+ .ty-text-neutral-- {
1272
+ color: var(--ty-color-neutral-faint) !important;
1273
+ }
1274
+
1275
+ /* Accent text colors */
1276
+ .ty-text-accent\+ {
1277
+ color: var(--ty-color-accent-mild) !important;
1278
+ }
1279
+
1280
+ .ty-text-accent {
1281
+ color: var(--ty-color-accent) !important;
1282
+ }
1283
+
1284
+ .ty-text-accent- {
1285
+ color: var(--ty-color-accent-soft) !important;
1286
+ }
1287
+
1288
+ /* =================================================================
1289
+ BORDER UTILITIES
1290
+ ================================================================= */
1291
+
1292
+ /* Base border colors with emphasis */
1293
+ .ty-border {
1294
+ border-color: var(--ty-border) !important;
1295
+ }
1296
+
1297
+ .ty-border\+ {
1298
+ border-color: var(--ty-border-mild) !important;
1299
+ }
1300
+
1301
+ .ty-border\+\+ {
1302
+ border-color: var(--ty-border-strong) !important;
1303
+ }
1304
+
1305
+ .ty-border- {
1306
+ border-color: var(--ty-border-soft);
1307
+ }
1308
+
1309
+ .ty-border-- {
1310
+ border-color: var(--ty-border-faint);
1311
+ }
1312
+
1313
+ /* Semantic border colors */
1314
+ .ty-border-primary {
1315
+ border-color: var(--ty-border-primary);
1316
+ }
1317
+
1318
+ .ty-border-secondary {
1319
+ border-color: var(--ty-border-secondary);
1320
+ }
1321
+
1322
+ .ty-border-success {
1323
+ border-color: var(--ty-border-success);
1324
+ }
1325
+
1326
+ .ty-border-danger {
1327
+ border-color: var(--ty-border-danger);
1328
+ }
1329
+
1330
+ .ty-border-warning {
1331
+ border-color: var(--ty-border-warning);
1332
+ }
1333
+
1334
+ .ty-border-neutral {
1335
+ border-color: var(--ty-border-neutral);
1336
+ }
1337
+
1338
+ .ty-border-accent\+ {
1339
+ border-color: var(--ty-border-accent-mild);
1340
+ }
1341
+
1342
+ .ty-border-accent {
1343
+ border-color: var(--ty-border-accent);
1344
+ }
1345
+
1346
+ .ty-border-accent- {
1347
+ border-color: var(--ty-border-accent-soft);
1348
+ }
1349
+
1350
+ /* =================================================================
1351
+ COMPONENT UTILITIES
1352
+ ================================================================= */
1353
+
1354
+ /* Card/Panel utilities */
1355
+ .ty-card {
1356
+ background-color: var(--ty-surface-elevated);
1357
+ color: var(--ty-color-neutral-mild);
1358
+ }
1359
+
1360
+ .ty-card-elevated {
1361
+ background-color: var(--ty-surface-floating);
1362
+ box-shadow: var(--ty-shadow-md);
1363
+ }
1364
+
1365
+ /* Input-like utilities for custom form elements */
1366
+ .ty-input-bg {
1367
+ background-color: var(--ty-input-bg);
1368
+ }
1369
+
1370
+ .ty-input-border {
1371
+ border-color: var(--ty-input-border);
1372
+ }
1373
+
1374
+ .ty-input-focus {
1375
+ border-color: var(--ty-input-border-focus);
1376
+ }
1377
+
1378
+ /* Modal/overlay utilities */
1379
+ .ty-modal-bg {
1380
+ background-color: var(--ty-modal-bg);
1381
+ }
1382
+
1383
+ .ty-modal-backdrop {
1384
+ background-color: var(--ty-modal-backdrop);
1385
+ }
1386
+
1387
+ /* =================================================================
1388
+ INTERACTIVE STATES
1389
+ ================================================================= */
1390
+
1391
+ .hover\:ty-bg-neutral--:hover {
1392
+ background-color: var(--ty-bg-neutral-faint);
1393
+ }
1394
+
1395
+ .hover\:ty-bg-neutral-:hover {
1396
+ background-color: var(--ty-bg-neutral-soft);
1397
+ }
1398
+
1399
+ .hover\:ty-bg-neutral:hover {
1400
+ background-color: var(--ty-bg-neutral);
1401
+ }
1402
+
1403
+ .hover\:ty-bg-neutral\+:hover {
1404
+ background-color: var(--ty-bg-neutral-mild);
1405
+ }
1406
+
1407
+ .hover\:ty-bg-neutral\+\+:hover {
1408
+ background-color: var(--ty-bg-neutral-strong);
1409
+ }
1410
+
1411
+ .hover\:ty-bg-primary:hover {
1412
+ background-color: var(--ty-bg-primary);
1413
+ }
1414
+
1415
+ .hover\:ty-bg-primary\+:hover {
1416
+ background-color: var(--ty-bg-primary-mild);
1417
+ }
1418
+
1419
+ .hover\:ty-bg-secondary:hover {
1420
+ background-color: var(--ty-bg-secondary);
1421
+ }
1422
+
1423
+ .hover\:ty-bg-secondary\+:hover {
1424
+ background-color: var(--ty-bg-secondary-mild);
1425
+ }
1426
+
1427
+ .hover\:ty-bg-success:hover {
1428
+ background-color: var(--ty-bg-success);
1429
+ }
1430
+
1431
+ .hover\:ty-bg-success\+:hover {
1432
+ background-color: var(--ty-bg-success-mild);
1433
+ }
1434
+
1435
+ .hover\:ty-bg-danger:hover {
1436
+ background-color: var(--ty-bg-danger);
1437
+ }
1438
+
1439
+ .hover\:ty-bg-danger\+:hover {
1440
+ background-color: var(--ty-bg-danger-mild);
1441
+ }
1442
+
1443
+ .hover\:ty-bg-danger-:hover {
1444
+ background-color: var(--ty-bg-danger-soft);
1445
+ }
1446
+
1447
+ .hover\:ty-bg-accent:hover {
1448
+ background-color: var(--ty-bg-accent);
1449
+ }
1450
+
1451
+ .hover\:ty-bg-accent\+:hover {
1452
+ background-color: var(--ty-bg-accent-mild);
1453
+ }
1454
+
1455
+ .hover\:ty-bg-accent-:hover {
1456
+ background-color: var(--ty-bg-accent-soft);
1457
+ }
1458
+
1459
+ /* Hover states for text colors */
1460
+ .hover\:ty-text:hover {
1461
+ color: var(--ty-text);
1462
+ }
1463
+
1464
+ .hover\:ty-text\+:hover {
1465
+ color: var(--ty-text-mild);
1466
+ }
1467
+
1468
+ .hover\:ty-text\+\+:hover {
1469
+ color: var(--ty-text-strong);
1470
+ }
1471
+
1472
+ .hover\:ty-text-:hover {
1473
+ color: var(--ty-text-soft);
1474
+ }
1475
+
1476
+ .hover\:ty-text--:hover {
1477
+ color: var(--ty-text-faint);
1478
+ }
1479
+
1480
+ /* Hover states for semantic text colors */
1481
+ /* Primary text hover states */
1482
+ .hover\:ty-text-primary\+\+:hover {
1483
+ color: var(--ty-color-primary-strong) !important;
1484
+ }
1485
+
1486
+ .hover\:ty-text-primary\+:hover {
1487
+ color: var(--ty-color-primary-mild) !important;
1488
+ }
1489
+
1490
+ .hover\:ty-text-primary:hover {
1491
+ color: var(--ty-color-primary) !important;
1492
+ }
1493
+
1494
+ .hover\:ty-text-primary-:hover {
1495
+ color: var(--ty-color-primary-soft) !important;
1496
+ }
1497
+
1498
+ .hover\:ty-text-primary--:hover {
1499
+ color: var(--ty-color-primary-faint) !important;
1500
+ }
1501
+
1502
+ /* Secondary text hover states */
1503
+ .hover\:ty-text-secondary\+\+:hover {
1504
+ color: var(--ty-color-secondary-strong) !important;
1505
+ }
1506
+
1507
+ .hover\:ty-text-secondary\+:hover {
1508
+ color: var(--ty-color-secondary-mild) !important;
1509
+ }
1510
+
1511
+ .hover\:ty-text-secondary:hover {
1512
+ color: var(--ty-color-secondary) !important;
1513
+ }
1514
+
1515
+ .hover\:ty-text-secondary-:hover {
1516
+ color: var(--ty-color-secondary-soft) !important;
1517
+ }
1518
+
1519
+ .hover\:ty-text-secondary--:hover {
1520
+ color: var(--ty-color-secondary-faint) !important;
1521
+ }
1522
+
1523
+ /* Success text hover states */
1524
+ .hover\:ty-text-success\+\+:hover {
1525
+ color: var(--ty-color-success-strong) !important;
1526
+ }
1527
+
1528
+ .hover\:ty-text-success\+:hover {
1529
+ color: var(--ty-color-success-mild) !important;
1530
+ }
1531
+
1532
+ .hover\:ty-text-success:hover {
1533
+ color: var(--ty-color-success) !important;
1534
+ }
1535
+
1536
+ .hover\:ty-text-success-:hover {
1537
+ color: var(--ty-color-success-soft) !important;
1538
+ }
1539
+
1540
+ .hover\:ty-text-success--:hover {
1541
+ color: var(--ty-color-success-faint) !important;
1542
+ }
1543
+
1544
+ /* Danger text hover states */
1545
+ .hover\:ty-text-danger\+\+:hover {
1546
+ color: var(--ty-color-danger-strong) !important;
1547
+ }
1548
+
1549
+ .hover\:ty-text-danger\+:hover {
1550
+ color: var(--ty-color-danger-mild) !important;
1551
+ }
1552
+
1553
+ .hover\:ty-text-danger:hover {
1554
+ color: var(--ty-color-danger) !important;
1555
+ }
1556
+
1557
+ .hover\:ty-text-danger-:hover {
1558
+ color: var(--ty-color-danger-soft) !important;
1559
+ }
1560
+
1561
+ .hover\:ty-text-danger--:hover {
1562
+ color: var(--ty-color-danger-faint) !important;
1563
+ }
1564
+
1565
+ /* Warning text hover states */
1566
+ .hover\:ty-text-warning\+\+:hover {
1567
+ color: var(--ty-color-warning-strong) !important;
1568
+ }
1569
+
1570
+ .hover\:ty-text-warning\+:hover {
1571
+ color: var(--ty-color-warning-mild) !important;
1572
+ }
1573
+
1574
+ .hover\:ty-text-warning:hover {
1575
+ color: var(--ty-color-warning) !important;
1576
+ }
1577
+
1578
+ .hover\:ty-text-warning-:hover {
1579
+ color: var(--ty-color-warning-soft) !important;
1580
+ }
1581
+
1582
+ .hover\:ty-text-warning--:hover {
1583
+ color: var(--ty-color-warning-faint) !important;
1584
+ }
1585
+
1586
+ /* Neutral text hover states */
1587
+ .hover\:ty-text-neutral\+\+:hover {
1588
+ color: var(--ty-color-neutral-strong) !important;
1589
+ }
1590
+
1591
+ .hover\:ty-text-neutral + :hover {
1592
+ color: var(--ty-color-neutral-mild) !important;
1593
+ }
1594
+
1595
+ .hover\:ty-text-neutral:hover {
1596
+ color: var(--ty-color-neutral) !important;
1597
+ }
1598
+
1599
+ .hover\:ty-text-neutral-:hover {
1600
+ color: var(--ty-color-neutral-soft) !important;
1601
+ }
1602
+
1603
+ .hover\:ty-text-neutral--:hover {
1604
+ color: var(--ty-color-neutral-faint) !important;
1605
+ }
1606
+
1607
+ /* Accent text hover states */
1608
+ .hover\:ty-text-accent\+:hover {
1609
+ color: var(--ty-color-accent-mild) !important;
1610
+ }
1611
+
1612
+ .hover\:ty-text-accent:hover {
1613
+ color: var(--ty-color-accent) !important;
1614
+ }
1615
+
1616
+ .hover\:ty-text-accent-:hover {
1617
+ color: var(--ty-color-accent-soft) !important;
1618
+ }
1619
+
1620
+ /* Hover states for borders */
1621
+ /* Base border hover states */
1622
+ .hover\:ty-border\+\+:hover {
1623
+ border-color: var(--ty-border-strong) !important;
1624
+ }
1625
+
1626
+ .hover\:ty-border\+:hover {
1627
+ border-color: var(--ty-border-mild) !important;
1628
+ }
1629
+
1630
+ .hover\:ty-border:hover {
1631
+ border-color: var(--ty-border) !important;
1632
+ }
1633
+
1634
+ .hover\:ty-border-:hover {
1635
+ border-color: var(--ty-border-soft) !important;
1636
+ }
1637
+
1638
+ .hover\:ty-border--:hover {
1639
+ border-color: var(--ty-border-faint) !important;
1640
+ }
1641
+
1642
+ /* Semantic border hover states */
1643
+ .hover\:ty-border-primary:hover {
1644
+ border-color: var(--ty-border-primary) !important;
1645
+ }
1646
+
1647
+ .hover\:ty-border-secondary:hover {
1648
+ border-color: var(--ty-border-secondary) !important;
1649
+ }
1650
+
1651
+ .hover\:ty-border-success:hover {
1652
+ border-color: var(--ty-border-success) !important;
1653
+ }
1654
+
1655
+ .hover\:ty-border-danger:hover {
1656
+ border-color: var(--ty-border-danger) !important;
1657
+ }
1658
+
1659
+ .hover\:ty-border-warning:hover {
1660
+ border-color: var(--ty-border-warning) !important;
1661
+ }
1662
+
1663
+ .hover\:ty-border-neutral:hover {
1664
+ border-color: var(--ty-border-neutral) !important;
1665
+ }
1666
+
1667
+ .hover\:ty-border-accent\+:hover {
1668
+ border-color: var(--ty-border-accent-mild) !important;
1669
+ }
1670
+
1671
+ .hover\:ty-border-accent:hover {
1672
+ border-color: var(--ty-border-accent) !important;
1673
+ }
1674
+
1675
+ .hover\:ty-border-accent-:hover {
1676
+ border-color: var(--ty-border-accent-soft) !important;
1677
+ }
1678
+
1679
+ .focus\:ty-border\+\+:focus {
1680
+ border-color: var(--ty-border-strong) !important;
1681
+ }
1682
+
1683
+ .focus\:ty-border + :focus {
1684
+ border-color: var(--ty-border-mild) !important;
1685
+ }
1686
+
1687
+ .focus\:ty-border:focus {
1688
+ border-color: var(--ty-border) !important;
1689
+ }
1690
+
1691
+ .focus\:ty-border-:focus {
1692
+ border-color: var(--ty-border-soft) !important;
1693
+ }
1694
+
1695
+ .focus\:ty-border--:focus {
1696
+ border-color: var(--ty-border-faint) !important;
1697
+ }
1698
+
1699
+ /* Semantic border focus states */
1700
+ .focus\:ty-border-primary:focus {
1701
+ border-color: var(--ty-border-primary) !important;
1702
+ }
1703
+
1704
+ .focus\:ty-border-secondary:focus {
1705
+ border-color: var(--ty-border-secondary) !important;
1706
+ }
1707
+
1708
+ .focus\:ty-border-success:focus {
1709
+ border-color: var(--ty-border-success) !important;
1710
+ }
1711
+
1712
+ .focus\:ty-border-danger:focus {
1713
+ border-color: var(--ty-border-danger) !important;
1714
+ }
1715
+
1716
+ .focus\:ty-border-warning:focus {
1717
+ border-color: var(--ty-border-warning) !important;
1718
+ }
1719
+
1720
+ .focus\:ty-border-neutral:focus {
1721
+ border-color: var(--ty-border-neutral) !important;
1722
+ }
1723
+
1724
+ .focus\:ty-border-accent\+:focus {
1725
+ border-color: var(--ty-border-accent-mild) !important;
1726
+ }
1727
+
1728
+ .focus\:ty-border-accent:focus {
1729
+ border-color: var(--ty-border-accent) !important;
1730
+ }
1731
+
1732
+ .focus\:ty-border-accent-:focus {
1733
+ border-color: var(--ty-border-accent-soft) !important;
1734
+ }
1735
+
1736
+ /* =================================================================
1737
+ RESPONSIVE VARIANTS
1738
+ ================================================================= */
1739
+
1740
+ /* Small screens and up */
1741
+ @media (min-width: 640px) {
1742
+ .sm\:ty-bg-primary {
1743
+ background-color: var(--ty-bg-primary);
1744
+ }
1745
+
1746
+ .sm\:ty-text-primary {
1747
+ color: var(--ty-color-primary);
1748
+ }
1749
+ }
1750
+
1751
+ /* Medium screens and up */
1752
+ @media (min-width: 768px) {
1753
+ .md\:ty-bg-primary {
1754
+ background-color: var(--ty-bg-primary);
1755
+ }
1756
+
1757
+ .md\:ty-text-primary {
1758
+ color: var(--ty-color-primary);
1759
+ }
1760
+ }
1761
+
1762
+ /* Large screens and up */
1763
+ @media (min-width: 1024px) {
1764
+ .lg\:ty-bg-primary {
1765
+ background-color: var(--ty-bg-primary);
1766
+ }
1767
+
1768
+ .lg\:ty-text-primary {
1769
+ color: var(--ty-color-primary);
1770
+ }
1771
+ }
1772
+
1773
+ /* =================================================================
1774
+ MOBILE FONT SIZE
1775
+ Prevents iOS Safari auto-zoom on input focus (requires >= 16px)
1776
+ and improves readability on small screens.
1777
+ ================================================================= */
1778
+
1779
+ @media (max-width: 768px) {
1780
+ :root {
1781
+ --ty-font-sm: 1rem;
1782
+ }
1783
+ }