tyrell-components 1.0.0-RC10

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 (344) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +221 -0
  3. package/css/tyrell-brand.css +767 -0
  4. package/css/tyrell.css +1679 -0
  5. package/dist/tyrell-brand.css +767 -0
  6. package/dist/tyrell.css +1679 -0
  7. package/dist/tyrell.js +2 -0
  8. package/lib/base/ty-component.d.ts +133 -0
  9. package/lib/base/ty-component.d.ts.map +1 -0
  10. package/lib/base/ty-component.js +297 -0
  11. package/lib/base/ty-component.js.map +1 -0
  12. package/lib/components/button.d.ts +135 -0
  13. package/lib/components/button.d.ts.map +1 -0
  14. package/lib/components/button.js +277 -0
  15. package/lib/components/button.js.map +1 -0
  16. package/lib/components/calendar-month.d.ts +132 -0
  17. package/lib/components/calendar-month.d.ts.map +1 -0
  18. package/lib/components/calendar-month.js +440 -0
  19. package/lib/components/calendar-month.js.map +1 -0
  20. package/lib/components/calendar-navigation.d.ts +137 -0
  21. package/lib/components/calendar-navigation.d.ts.map +1 -0
  22. package/lib/components/calendar-navigation.js +366 -0
  23. package/lib/components/calendar-navigation.js.map +1 -0
  24. package/lib/components/calendar.d.ts +166 -0
  25. package/lib/components/calendar.d.ts.map +1 -0
  26. package/lib/components/calendar.js +774 -0
  27. package/lib/components/calendar.js.map +1 -0
  28. package/lib/components/checkbox.d.ts +189 -0
  29. package/lib/components/checkbox.d.ts.map +1 -0
  30. package/lib/components/checkbox.js +400 -0
  31. package/lib/components/checkbox.js.map +1 -0
  32. package/lib/components/copy.d.ts +180 -0
  33. package/lib/components/copy.d.ts.map +1 -0
  34. package/lib/components/copy.js +393 -0
  35. package/lib/components/copy.js.map +1 -0
  36. package/lib/components/date-picker.d.ts +379 -0
  37. package/lib/components/date-picker.d.ts.map +1 -0
  38. package/lib/components/date-picker.js +1586 -0
  39. package/lib/components/date-picker.js.map +1 -0
  40. package/lib/components/dropdown.d.ts +424 -0
  41. package/lib/components/dropdown.d.ts.map +1 -0
  42. package/lib/components/dropdown.js +1640 -0
  43. package/lib/components/dropdown.js.map +1 -0
  44. package/lib/components/file-upload.d.ts +121 -0
  45. package/lib/components/file-upload.d.ts.map +1 -0
  46. package/lib/components/file-upload.js +441 -0
  47. package/lib/components/file-upload.js.map +1 -0
  48. package/lib/components/icon.d.ts +118 -0
  49. package/lib/components/icon.d.ts.map +1 -0
  50. package/lib/components/icon.js +245 -0
  51. package/lib/components/icon.js.map +1 -0
  52. package/lib/components/input.d.ts +270 -0
  53. package/lib/components/input.d.ts.map +1 -0
  54. package/lib/components/input.js +721 -0
  55. package/lib/components/input.js.map +1 -0
  56. package/lib/components/modal.d.ts +78 -0
  57. package/lib/components/modal.d.ts.map +1 -0
  58. package/lib/components/modal.js +497 -0
  59. package/lib/components/modal.js.map +1 -0
  60. package/lib/components/multiselect.d.ts +397 -0
  61. package/lib/components/multiselect.d.ts.map +1 -0
  62. package/lib/components/multiselect.js +1595 -0
  63. package/lib/components/multiselect.js.map +1 -0
  64. package/lib/components/option.d.ts +66 -0
  65. package/lib/components/option.d.ts.map +1 -0
  66. package/lib/components/option.js +314 -0
  67. package/lib/components/option.js.map +1 -0
  68. package/lib/components/popup.d.ts +43 -0
  69. package/lib/components/popup.d.ts.map +1 -0
  70. package/lib/components/popup.js +380 -0
  71. package/lib/components/popup.js.map +1 -0
  72. package/lib/components/radio.d.ts +198 -0
  73. package/lib/components/radio.d.ts.map +1 -0
  74. package/lib/components/radio.js +437 -0
  75. package/lib/components/radio.js.map +1 -0
  76. package/lib/components/resize-observer.d.ts +48 -0
  77. package/lib/components/resize-observer.d.ts.map +1 -0
  78. package/lib/components/resize-observer.js +108 -0
  79. package/lib/components/resize-observer.js.map +1 -0
  80. package/lib/components/scroll-container.d.ts +51 -0
  81. package/lib/components/scroll-container.d.ts.map +1 -0
  82. package/lib/components/scroll-container.js +239 -0
  83. package/lib/components/scroll-container.js.map +1 -0
  84. package/lib/components/step.d.ts +26 -0
  85. package/lib/components/step.d.ts.map +1 -0
  86. package/lib/components/step.js +75 -0
  87. package/lib/components/step.js.map +1 -0
  88. package/lib/components/switch.d.ts +111 -0
  89. package/lib/components/switch.d.ts.map +1 -0
  90. package/lib/components/switch.js +240 -0
  91. package/lib/components/switch.js.map +1 -0
  92. package/lib/components/tab.d.ts +23 -0
  93. package/lib/components/tab.d.ts.map +1 -0
  94. package/lib/components/tab.js +76 -0
  95. package/lib/components/tab.js.map +1 -0
  96. package/lib/components/tabs.d.ts +93 -0
  97. package/lib/components/tabs.d.ts.map +1 -0
  98. package/lib/components/tabs.js +653 -0
  99. package/lib/components/tabs.js.map +1 -0
  100. package/lib/components/tag.d.ts +144 -0
  101. package/lib/components/tag.d.ts.map +1 -0
  102. package/lib/components/tag.js +316 -0
  103. package/lib/components/tag.js.map +1 -0
  104. package/lib/components/textarea.d.ts +241 -0
  105. package/lib/components/textarea.d.ts.map +1 -0
  106. package/lib/components/textarea.js +585 -0
  107. package/lib/components/textarea.js.map +1 -0
  108. package/lib/components/tooltip.d.ts +40 -0
  109. package/lib/components/tooltip.d.ts.map +1 -0
  110. package/lib/components/tooltip.js +439 -0
  111. package/lib/components/tooltip.js.map +1 -0
  112. package/lib/components/wizard.d.ts +86 -0
  113. package/lib/components/wizard.d.ts.map +1 -0
  114. package/lib/components/wizard.js +636 -0
  115. package/lib/components/wizard.js.map +1 -0
  116. package/lib/icons/fontawesome/brands.d.ts +557 -0
  117. package/lib/icons/fontawesome/brands.d.ts.map +1 -0
  118. package/lib/icons/fontawesome/brands.js +557 -0
  119. package/lib/icons/fontawesome/brands.js.map +1 -0
  120. package/lib/icons/fontawesome/regular.d.ts +281 -0
  121. package/lib/icons/fontawesome/regular.d.ts.map +1 -0
  122. package/lib/icons/fontawesome/regular.js +281 -0
  123. package/lib/icons/fontawesome/regular.js.map +1 -0
  124. package/lib/icons/fontawesome/solid.d.ts +1992 -0
  125. package/lib/icons/fontawesome/solid.d.ts.map +1 -0
  126. package/lib/icons/fontawesome/solid.js +1992 -0
  127. package/lib/icons/fontawesome/solid.js.map +1 -0
  128. package/lib/icons/heroicons/micro.d.ts +324 -0
  129. package/lib/icons/heroicons/micro.d.ts.map +1 -0
  130. package/lib/icons/heroicons/micro.js +1032 -0
  131. package/lib/icons/heroicons/micro.js.map +1 -0
  132. package/lib/icons/heroicons/mini.d.ts +332 -0
  133. package/lib/icons/heroicons/mini.d.ts.map +1 -0
  134. package/lib/icons/heroicons/mini.js +1038 -0
  135. package/lib/icons/heroicons/mini.js.map +1 -0
  136. package/lib/icons/heroicons/outline.d.ts +332 -0
  137. package/lib/icons/heroicons/outline.d.ts.map +1 -0
  138. package/lib/icons/heroicons/outline.js +993 -0
  139. package/lib/icons/heroicons/outline.js.map +1 -0
  140. package/lib/icons/heroicons/solid.d.ts +332 -0
  141. package/lib/icons/heroicons/solid.d.ts.map +1 -0
  142. package/lib/icons/heroicons/solid.js +1063 -0
  143. package/lib/icons/heroicons/solid.js.map +1 -0
  144. package/lib/icons/lucide.d.ts +1872 -0
  145. package/lib/icons/lucide.d.ts.map +1 -0
  146. package/lib/icons/lucide.js +28212 -0
  147. package/lib/icons/lucide.js.map +1 -0
  148. package/lib/icons/material/filled.d.ts +2180 -0
  149. package/lib/icons/material/filled.d.ts.map +1 -0
  150. package/lib/icons/material/filled.js +14003 -0
  151. package/lib/icons/material/filled.js.map +1 -0
  152. package/lib/icons/material/outlined.d.ts +2142 -0
  153. package/lib/icons/material/outlined.d.ts.map +1 -0
  154. package/lib/icons/material/outlined.js +14545 -0
  155. package/lib/icons/material/outlined.js.map +1 -0
  156. package/lib/icons/material/round.d.ts +2147 -0
  157. package/lib/icons/material/round.d.ts.map +1 -0
  158. package/lib/icons/material/round.js +14779 -0
  159. package/lib/icons/material/round.js.map +1 -0
  160. package/lib/icons/material/sharp.d.ts +2147 -0
  161. package/lib/icons/material/sharp.d.ts.map +1 -0
  162. package/lib/icons/material/sharp.js +14189 -0
  163. package/lib/icons/material/sharp.js.map +1 -0
  164. package/lib/icons/material/two-tone.d.ts +2185 -0
  165. package/lib/icons/material/two-tone.d.ts.map +1 -0
  166. package/lib/icons/material/two-tone.js +17152 -0
  167. package/lib/icons/material/two-tone.js.map +1 -0
  168. package/lib/index.d.ts +86 -0
  169. package/lib/index.d.ts.map +1 -0
  170. package/lib/index.js +78 -0
  171. package/lib/index.js.map +1 -0
  172. package/lib/styles/button.d.ts +14 -0
  173. package/lib/styles/button.d.ts.map +1 -0
  174. package/lib/styles/button.js +498 -0
  175. package/lib/styles/button.js.map +1 -0
  176. package/lib/styles/calendar-month.d.ts +6 -0
  177. package/lib/styles/calendar-month.d.ts.map +1 -0
  178. package/lib/styles/calendar-month.js +275 -0
  179. package/lib/styles/calendar-month.js.map +1 -0
  180. package/lib/styles/calendar-navigation.d.ts +6 -0
  181. package/lib/styles/calendar-navigation.d.ts.map +1 -0
  182. package/lib/styles/calendar-navigation.js +143 -0
  183. package/lib/styles/calendar-navigation.js.map +1 -0
  184. package/lib/styles/calendar.d.ts +6 -0
  185. package/lib/styles/calendar.d.ts.map +1 -0
  186. package/lib/styles/calendar.js +28 -0
  187. package/lib/styles/calendar.js.map +1 -0
  188. package/lib/styles/checkbox.d.ts +9 -0
  189. package/lib/styles/checkbox.d.ts.map +1 -0
  190. package/lib/styles/checkbox.js +19 -0
  191. package/lib/styles/checkbox.js.map +1 -0
  192. package/lib/styles/copy.d.ts +7 -0
  193. package/lib/styles/copy.d.ts.map +1 -0
  194. package/lib/styles/copy.js +94 -0
  195. package/lib/styles/copy.js.map +1 -0
  196. package/lib/styles/custom-scrollbar.d.ts +6 -0
  197. package/lib/styles/custom-scrollbar.d.ts.map +1 -0
  198. package/lib/styles/custom-scrollbar.js +157 -0
  199. package/lib/styles/custom-scrollbar.js.map +1 -0
  200. package/lib/styles/date-picker.d.ts +6 -0
  201. package/lib/styles/date-picker.d.ts.map +1 -0
  202. package/lib/styles/date-picker.js +438 -0
  203. package/lib/styles/date-picker.js.map +1 -0
  204. package/lib/styles/dropdown.d.ts +12 -0
  205. package/lib/styles/dropdown.d.ts.map +1 -0
  206. package/lib/styles/dropdown.js +1081 -0
  207. package/lib/styles/dropdown.js.map +1 -0
  208. package/lib/styles/file-upload.d.ts +2 -0
  209. package/lib/styles/file-upload.d.ts.map +1 -0
  210. package/lib/styles/file-upload.js +241 -0
  211. package/lib/styles/file-upload.js.map +1 -0
  212. package/lib/styles/icon.d.ts +6 -0
  213. package/lib/styles/icon.d.ts.map +1 -0
  214. package/lib/styles/icon.js +241 -0
  215. package/lib/styles/icon.js.map +1 -0
  216. package/lib/styles/input.d.ts +7 -0
  217. package/lib/styles/input.d.ts.map +1 -0
  218. package/lib/styles/input.js +685 -0
  219. package/lib/styles/input.js.map +1 -0
  220. package/lib/styles/modal.d.ts +8 -0
  221. package/lib/styles/modal.d.ts.map +1 -0
  222. package/lib/styles/modal.js +134 -0
  223. package/lib/styles/modal.js.map +1 -0
  224. package/lib/styles/multiselect.d.ts +6 -0
  225. package/lib/styles/multiselect.d.ts.map +1 -0
  226. package/lib/styles/multiselect.js +825 -0
  227. package/lib/styles/multiselect.js.map +1 -0
  228. package/lib/styles/option.d.ts +6 -0
  229. package/lib/styles/option.d.ts.map +1 -0
  230. package/lib/styles/option.js +116 -0
  231. package/lib/styles/option.js.map +1 -0
  232. package/lib/styles/popup.d.ts +8 -0
  233. package/lib/styles/popup.d.ts.map +1 -0
  234. package/lib/styles/popup.js +95 -0
  235. package/lib/styles/popup.js.map +1 -0
  236. package/lib/styles/radio.d.ts +8 -0
  237. package/lib/styles/radio.d.ts.map +1 -0
  238. package/lib/styles/radio.js +160 -0
  239. package/lib/styles/radio.js.map +1 -0
  240. package/lib/styles/resize-observer.d.ts +6 -0
  241. package/lib/styles/resize-observer.d.ts.map +1 -0
  242. package/lib/styles/resize-observer.js +18 -0
  243. package/lib/styles/resize-observer.js.map +1 -0
  244. package/lib/styles/scroll-container.d.ts +6 -0
  245. package/lib/styles/scroll-container.d.ts.map +1 -0
  246. package/lib/styles/scroll-container.js +198 -0
  247. package/lib/styles/scroll-container.js.map +1 -0
  248. package/lib/styles/step.d.ts +5 -0
  249. package/lib/styles/step.d.ts.map +1 -0
  250. package/lib/styles/step.js +50 -0
  251. package/lib/styles/step.js.map +1 -0
  252. package/lib/styles/switch.d.ts +9 -0
  253. package/lib/styles/switch.d.ts.map +1 -0
  254. package/lib/styles/switch.js +100 -0
  255. package/lib/styles/switch.js.map +1 -0
  256. package/lib/styles/tab.d.ts +5 -0
  257. package/lib/styles/tab.d.ts.map +1 -0
  258. package/lib/styles/tab.js +51 -0
  259. package/lib/styles/tab.js.map +1 -0
  260. package/lib/styles/tabs.d.ts +13 -0
  261. package/lib/styles/tabs.d.ts.map +1 -0
  262. package/lib/styles/tabs.js +184 -0
  263. package/lib/styles/tabs.js.map +1 -0
  264. package/lib/styles/tag.d.ts +6 -0
  265. package/lib/styles/tag.d.ts.map +1 -0
  266. package/lib/styles/tag.js +409 -0
  267. package/lib/styles/tag.js.map +1 -0
  268. package/lib/styles/textarea.d.ts +6 -0
  269. package/lib/styles/textarea.d.ts.map +1 -0
  270. package/lib/styles/textarea.js +350 -0
  271. package/lib/styles/textarea.js.map +1 -0
  272. package/lib/styles/tooltip.d.ts +9 -0
  273. package/lib/styles/tooltip.d.ts.map +1 -0
  274. package/lib/styles/tooltip.js +133 -0
  275. package/lib/styles/tooltip.js.map +1 -0
  276. package/lib/styles/wizard.d.ts +25 -0
  277. package/lib/styles/wizard.d.ts.map +1 -0
  278. package/lib/styles/wizard.js +348 -0
  279. package/lib/styles/wizard.js.map +1 -0
  280. package/lib/types/common.d.ts +143 -0
  281. package/lib/types/common.d.ts.map +1 -0
  282. package/lib/types/common.js +5 -0
  283. package/lib/types/common.js.map +1 -0
  284. package/lib/utils/calendar-utils.d.ts +176 -0
  285. package/lib/utils/calendar-utils.d.ts.map +1 -0
  286. package/lib/utils/calendar-utils.js +370 -0
  287. package/lib/utils/calendar-utils.js.map +1 -0
  288. package/lib/utils/custom-scrollbar.d.ts +82 -0
  289. package/lib/utils/custom-scrollbar.d.ts.map +1 -0
  290. package/lib/utils/custom-scrollbar.js +320 -0
  291. package/lib/utils/custom-scrollbar.js.map +1 -0
  292. package/lib/utils/icon-registry.d.ts +78 -0
  293. package/lib/utils/icon-registry.d.ts.map +1 -0
  294. package/lib/utils/icon-registry.js +304 -0
  295. package/lib/utils/icon-registry.js.map +1 -0
  296. package/lib/utils/loader-registry.d.ts +35 -0
  297. package/lib/utils/loader-registry.d.ts.map +1 -0
  298. package/lib/utils/loader-registry.js +43 -0
  299. package/lib/utils/loader-registry.js.map +1 -0
  300. package/lib/utils/locale.d.ts +136 -0
  301. package/lib/utils/locale.d.ts.map +1 -0
  302. package/lib/utils/locale.js +213 -0
  303. package/lib/utils/locale.js.map +1 -0
  304. package/lib/utils/mobile.d.ts +14 -0
  305. package/lib/utils/mobile.d.ts.map +1 -0
  306. package/lib/utils/mobile.js +21 -0
  307. package/lib/utils/mobile.js.map +1 -0
  308. package/lib/utils/number-format.d.ts +83 -0
  309. package/lib/utils/number-format.d.ts.map +1 -0
  310. package/lib/utils/number-format.js +143 -0
  311. package/lib/utils/number-format.js.map +1 -0
  312. package/lib/utils/parse-boolean.d.ts +39 -0
  313. package/lib/utils/parse-boolean.d.ts.map +1 -0
  314. package/lib/utils/parse-boolean.js +58 -0
  315. package/lib/utils/parse-boolean.js.map +1 -0
  316. package/lib/utils/positioning.d.ts +143 -0
  317. package/lib/utils/positioning.d.ts.map +1 -0
  318. package/lib/utils/positioning.js +308 -0
  319. package/lib/utils/positioning.js.map +1 -0
  320. package/lib/utils/property-capture.d.ts +132 -0
  321. package/lib/utils/property-capture.d.ts.map +1 -0
  322. package/lib/utils/property-capture.js +152 -0
  323. package/lib/utils/property-capture.js.map +1 -0
  324. package/lib/utils/property-manager.d.ts +90 -0
  325. package/lib/utils/property-manager.d.ts.map +1 -0
  326. package/lib/utils/property-manager.js +197 -0
  327. package/lib/utils/property-manager.js.map +1 -0
  328. package/lib/utils/resize-observer.d.ts +42 -0
  329. package/lib/utils/resize-observer.d.ts.map +1 -0
  330. package/lib/utils/resize-observer.js +71 -0
  331. package/lib/utils/resize-observer.js.map +1 -0
  332. package/lib/utils/scroll-lock.d.ts +79 -0
  333. package/lib/utils/scroll-lock.d.ts.map +1 -0
  334. package/lib/utils/scroll-lock.js +197 -0
  335. package/lib/utils/scroll-lock.js.map +1 -0
  336. package/lib/utils/styles.d.ts +27 -0
  337. package/lib/utils/styles.d.ts.map +1 -0
  338. package/lib/utils/styles.js +53 -0
  339. package/lib/utils/styles.js.map +1 -0
  340. package/lib/version.d.ts +8 -0
  341. package/lib/version.d.ts.map +1 -0
  342. package/lib/version.js +11 -0
  343. package/lib/version.js.map +1 -0
  344. package/package.json +163 -0
@@ -0,0 +1,1679 @@
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
+ -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 */
180
+
181
+ /* =================================================================
182
+ BACKGROUND COLORS
183
+ ================================================================= */
184
+
185
+ --ty-bg-faint: #f8fafc;
186
+ /* Very light canvas - for minimal backgrounds */
187
+ --ty-bg-soft: #f1f5f9;
188
+ /* Light canvas - app backgrounds */
189
+ --ty-bg: #ffffff;
190
+ /* WHITE - primary content baseline */
191
+ --ty-bg-bold: #f8fafc;
192
+ /* Subtle elevation - cards with light tint */
193
+ --ty-bg-strong: #e2e8f0;
194
+ /* Maximum elevation - clear distinction */
195
+
196
+ /* Focus ring gap - matches page background for button focus ring effect */
197
+ --ty-focus-ring-gap: #ffffff;
198
+
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
+ /* =================================================================
232
+ BORDER COLORS
233
+ ================================================================= */
234
+
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
+ /* Border width — used as fallback by surface utilities (--ty-{surface}-border-width) */
242
+ --ty-border-width: 1px;
243
+
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
+ /* =================================================================
253
+ SCROLLBAR
254
+ ================================================================= */
255
+
256
+ --ty-scrollbar-thumb: rgba(0, 0, 0, 0.35);
257
+ --ty-scrollbar-thumb-hover: rgba(0, 0, 0, 0.5);
258
+ --ty-scrollbar-thumb-active: rgba(0, 0, 0, 0.6);
259
+ --ty-scrollbar-track: transparent;
260
+ --ty-scrollbar-track-hover: rgba(0, 0, 0, 0.06);
261
+
262
+ /* =================================================================
263
+ SURFACE SYSTEM
264
+ ================================================================= */
265
+
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
+ /* Surface borders — opt-in. Set color to make a surface's border visible.
273
+ Width and style fall back to --ty-border-width and `solid` if unset. */
274
+ --ty-elevated-border: #e5e7eb;
275
+ --ty-elevated-border-width: var(--ty-border-width);
276
+ --ty-elevated-border-style: solid;
277
+
278
+ --ty-floating-border: #e5e7eb;
279
+ --ty-floating-border-width: var(--ty-border-width);
280
+ --ty-floating-border-style: solid;
281
+
282
+ --ty-canvas-border: transparent;
283
+ --ty-canvas-border-width: var(--ty-border-width);
284
+ --ty-canvas-border-style: solid;
285
+
286
+ --ty-content-border: #e5e7eb;
287
+ --ty-content-border-width: var(--ty-border-width);
288
+ --ty-content-border-style: solid;
289
+
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. */
292
+ --ty-input-border-width: var(--ty-border-width);
293
+ --ty-input-border-style: solid;
294
+
295
+ /* Divider context — consumed by .ty-divide-x / .ty-divide-y utilities.
296
+ Each surface re-points --ty-divide-color to its own --ty-{surface}-border
297
+ token, so the same knob controls both the surface's chrome AND any
298
+ dividers inside it. Inherits down the tree via CSS variable inheritance. */
299
+ --ty-divide-color: var(--ty-border);
300
+ --ty-divide-width: var(--ty-border-width);
301
+
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
+ /* =================================================================
314
+ COMPONENT TOKENS
315
+ ================================================================= */
316
+
317
+ /* Modal tokens */
318
+ --ty-modal-bg: #ffffff;
319
+ --ty-modal-color: #111827;
320
+ --ty-modal-border: #e5e7eb;
321
+ --ty-modal-backdrop: rgba(0, 0, 0, 0.5);
322
+ --ty-modal-backdrop-blur: blur(2px);
323
+ --ty-modal-border-radius: 16px;
324
+ --ty-modal-shadow:
325
+ 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04);
326
+ --ty-modal-duration: 200ms;
327
+
328
+ /* Modal sizing */
329
+ --ty-modal-sm-width: 300px;
330
+ --ty-modal-md-width: 500px;
331
+ --ty-modal-lg-width: 700px;
332
+ --ty-modal-xl-width: 900px;
333
+ --ty-modal-full-width: 95vw;
334
+ --ty-modal-full-height: 95vh;
335
+
336
+ /* 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
+ --ty-label-color: #374151;
348
+
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
+ /* =================================================================
402
+ DESIGN SYSTEM TOKENS
403
+ ================================================================= */
404
+
405
+ /* Spacing Scale */
406
+ --ty-spacing-0: 0;
407
+ --ty-spacing-px: 1px;
408
+ --ty-spacing-mini: 0.125rem;
409
+ --ty-spacing-1: 0.25rem;
410
+ --ty-spacing-2: 0.5rem;
411
+ --ty-spacing-3: 0.75rem;
412
+ --ty-spacing-4: 1rem;
413
+ --ty-spacing-5: 1.25rem;
414
+ --ty-spacing-6: 1.5rem;
415
+ --ty-spacing-7: 1.75rem;
416
+ --ty-spacing-8: 2rem;
417
+ --ty-spacing-9: 2.25rem;
418
+ --ty-spacing-10: 2.5rem;
419
+ --ty-spacing-12: 3rem;
420
+ --ty-spacing-16: 4rem;
421
+ --ty-spacing-20: 5rem;
422
+ --ty-spacing-24: 6rem;
423
+
424
+ /* Border Radius */
425
+ --ty-radius-none: 0;
426
+ --ty-radius-sm: 0.25rem; /* 4px */
427
+ --ty-radius-base: 0.375rem; /* 6px */
428
+ --ty-radius-md: 0.5rem; /* 8px (anchor) */
429
+ --ty-radius-lg: 0.75rem; /* 12px */
430
+ --ty-radius-xl: 1rem; /* 16px */
431
+ --ty-radius-2xl: 1.5rem; /* 24px */
432
+ --ty-radius-3xl: 2rem; /* 32px */
433
+ --ty-radius-full: 9999px;
434
+
435
+ /* Shadows */
436
+ --ty-shadow-none: none;
437
+ --ty-shadow-sm: 0 1px 2px 0 rgba(0, 0, 0, 0.05);
438
+ --ty-shadow-base:
439
+ 0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px -1px rgba(0, 0, 0, 0.1);
440
+ --ty-shadow-md:
441
+ 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -2px rgba(0, 0, 0, 0.1);
442
+ --ty-shadow-lg:
443
+ 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -4px rgba(0, 0, 0, 0.1);
444
+ --ty-shadow-xl:
445
+ 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 8px 10px -6px rgba(0, 0, 0, 0.1);
446
+ --ty-shadow-2xl: 0 25px 50px -12px rgba(0, 0, 0, 0.25);
447
+
448
+ /* Typography */
449
+ --ty-font-sans:
450
+ system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
451
+ --ty-font-mono: ui-monospace, SFMono-Regular, "SF Mono", Consolas, monospace;
452
+
453
+ --ty-font-xxs: 0.625rem;
454
+ --ty-font-xs: 0.75rem;
455
+ --ty-font-sm: 0.875rem;
456
+ --ty-font-base: 1rem;
457
+ --ty-font-lg: 1.125rem;
458
+ --ty-font-xl: 1.25rem;
459
+ --ty-font-2xl: 1.5rem;
460
+ --ty-font-3xl: 1.875rem;
461
+ --ty-font-4xl: 2.25rem;
462
+ --ty-font-5xl: 3rem;
463
+
464
+ /* Paired line-heights — values follow Linear's text-* tokens (text-small
465
+ uses 21px not 20px; text-regular uses 1.6 ratio for breathable body text).
466
+ Paired with --ty-font-* so that `font-size: var(--ty-font-sm)` should also
467
+ use `line-height: var(--ty-leading-sm)`. */
468
+ --ty-leading-xxs: 0.9375rem; /* 15px paired with 10px text (Linear text-tiny 1.5) */
469
+ --ty-leading-xs: 1.05rem; /* ≈16.8px paired with 12px text (Linear text-micro 1.4) */
470
+ --ty-leading-sm: 1.3125rem; /* 21px paired with 14px text (Linear text-small) */
471
+ --ty-leading-base: 1.5rem; /* 24px paired with 16px text (Linear text-regular 1.6 ≈) */
472
+ --ty-leading-lg: 1.6875rem; /* 27px paired with 18px text (Linear text-large) */
473
+ --ty-leading-xl: 1.75rem; /* 28px paired with 20px text */
474
+ --ty-leading-2xl: 2rem; /* 32px paired with 24px text */
475
+ --ty-leading-3xl: 2.25rem; /* 36px paired with 30px text */
476
+ --ty-leading-4xl: 2.5rem; /* 40px paired with 36px text */
477
+ --ty-leading-5xl: 1; /* paired with 48px+ display text */
478
+
479
+ /* Letter-spacing (tracking) tokens — pulled from Linear's per-size values.
480
+ Linear uses slightly negative tracking on most text to tighten Inter. */
481
+ --ty-tracking-xxs: -0.015em; /* paired with text-tiny */
482
+ --ty-tracking-xs: 0; /* paired with text-micro */
483
+ --ty-tracking-sm: -0.013em; /* paired with text-small */
484
+ --ty-tracking-base: -0.011em; /* paired with text-regular */
485
+ --ty-tracking-lg: 0; /* paired with text-large */
486
+ --ty-tracking-tight: -0.022em; /* for titles (Linear title-4 and up) */
487
+ --ty-tracking-title: -0.012em; /* for titles (Linear title-1..3) */
488
+
489
+ /* Weights tuned to Linear (Inter Variable). With the system font stack
490
+ these round to the nearest available (500/600/700); load Inter Variable
491
+ for the exact rendering. */
492
+ --ty-font-thin: 100;
493
+ --ty-font-light: 300;
494
+ --ty-font-normal: 400;
495
+ --ty-font-medium: 510;
496
+ --ty-font-semibold: 590;
497
+ --ty-font-bold: 680;
498
+ --ty-font-extrabold: 800;
499
+
500
+ --ty-line-height-none: 1;
501
+ --ty-line-height-tight: 1.25;
502
+ --ty-line-height-snug: 1.375;
503
+ --ty-line-height-normal: 1.5;
504
+ --ty-line-height-relaxed: 1.625;
505
+ --ty-line-height-loose: 2;
506
+
507
+ /* Transitions */
508
+ --ty-transition-none: none;
509
+ --ty-transition-all: all 150ms cubic-bezier(0.4, 0, 0.2, 1);
510
+ --ty-transition-colors:
511
+ 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 */
519
+ --ty-size-sm: 2rem;
520
+ /* 32px */
521
+ --ty-size-md: 2.5rem;
522
+ /* 40px */
523
+ --ty-size-lg: 3rem;
524
+ /* 48px */
525
+ --ty-size-xl: 3.5rem;
526
+ /* 56px */
527
+
528
+ /* Z-Index Scale */
529
+ --ty-z-auto: auto;
530
+ --ty-z-0: 0;
531
+ --ty-z-10: 10;
532
+ --ty-z-20: 20;
533
+ --ty-z-30: 30;
534
+ --ty-z-40: 40;
535
+ --ty-z-50: 50;
536
+ --ty-z-sticky: 1020;
537
+ --ty-z-fixed: 1030;
538
+ --ty-z-modal-backdrop: 1040;
539
+ --ty-z-modal: 1050;
540
+ --ty-z-popover: 1060;
541
+ --ty-z-tooltip: 1070;
542
+ --ty-z-dropdown: 1080;
543
+
544
+ /* =================================================================
545
+ SCROLL SHADOW SYSTEM
546
+ Uses clip-path technique for smooth corner fade
547
+ ================================================================= */
548
+ --ty-scroll-shadow-top: radial-gradient(
549
+ ellipse 100% 30% at center,
550
+ rgba(0, 0, 0, 0.1),
551
+ rgba(0, 0, 0, 0),
552
+ transparent
553
+ );
554
+ --ty-scroll-shadow-bottom: radial-gradient(
555
+ ellipse 100% 20% at center,
556
+ rgba(0, 0, 0, 0.15),
557
+ rgba(0, 0, 0, 0),
558
+ transparent
559
+ );
560
+ --ty-scroll-shadow-transition: opacity 0.2s ease-out;
561
+ }
562
+
563
+ /* =================================================================
564
+ DARK THEME OVERRIDES
565
+ ================================================================= */
566
+
567
+ html.dark,
568
+ 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) */
617
+
618
+ /* Backgrounds for dark mode */
619
+ --ty-bg-faint: #0f1419;
620
+ --ty-bg-soft: #111827;
621
+ --ty-bg: #1f2937;
622
+ --ty-bg-bold: #374151;
623
+ --ty-bg-strong: #6b7280;
624
+
625
+ /* Focus ring gap */
626
+ --ty-focus-ring-gap: #1f2937;
627
+
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
+ /* 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);
666
+ --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;
685
+
686
+ /* Shadows need to be darker/more prominent in dark mode */
687
+ --ty-shadow-sm: 0 1px 2px 0 rgba(0, 0, 0, 0.2);
688
+ --ty-shadow-base:
689
+ 0 1px 3px 0 rgba(0, 0, 0, 0.3), 0 1px 2px -1px rgba(0, 0, 0, 0.3);
690
+ --ty-shadow-md:
691
+ 0 4px 6px -1px rgba(0, 0, 0, 0.3), 0 2px 4px -2px rgba(0, 0, 0, 0.3);
692
+ --ty-shadow-lg:
693
+ 0 10px 15px -3px rgba(0, 0, 0, 0.3), 0 4px 6px -4px rgba(0, 0, 0, 0.3);
694
+ --ty-shadow-xl:
695
+ 0 20px 25px -5px rgba(0, 0, 0, 0.3), 0 8px 10px -6px rgba(0, 0, 0, 0.3);
696
+ --ty-shadow-2xl: 0 25px 50px -12px rgba(0, 0, 0, 0.5);
697
+
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
+ /* 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
+ --ty-label-color: #d1d5db;
748
+
749
+ /* Modal - dark mode */
750
+ --ty-modal-bg: var(--ty-bg-bold);
751
+ --ty-modal-color: var(--ty-color-neutral-bold);
752
+ --ty-modal-border: var(--ty-border);
753
+ --ty-modal-backdrop: rgba(0, 0, 0, 0.7);
754
+ --ty-modal-shadow:
755
+ 0 20px 25px -5px rgba(0, 0, 0, 0.4), 0 10px 10px -5px rgba(0, 0, 0, 0.2);
756
+
757
+ /* Scroll shadows - lighter tint for dark mode */
758
+ --ty-scroll-shadow-top: radial-gradient(
759
+ ellipse 100% 30% at center,
760
+ rgba(172, 172, 172, 0.2),
761
+ rgba(0, 0, 0, 0),
762
+ transparent
763
+ );
764
+ --ty-scroll-shadow-bottom: radial-gradient(
765
+ ellipse 100% 20% at center,
766
+ rgba(172, 172, 172, 0.3),
767
+ rgba(0, 0, 0, 0),
768
+ transparent
769
+ );
770
+ }
771
+
772
+ /* =================================================================
773
+ TEXT SELECTION STYLING
774
+ Global and semantic text selection colors
775
+ ================================================================= */
776
+
777
+ /* Global text selection - uses primary colors by default */
778
+ ::selection {
779
+ background-color: var(--ty-selection-bg, var(--ty-bg-primary-bold));
780
+ color: var(--ty-selection-color, var(--ty-text-strong));
781
+ }
782
+
783
+ ::-moz-selection {
784
+ background-color: var(--ty-selection-bg, var(--ty-color-primary));
785
+ color: var(--ty-selection-color, var(--ty-text-strong));
786
+ }
787
+
788
+ /* Code block selection - special handling for better readability */
789
+ pre ::selection,
790
+ code ::selection,
791
+ pre::-moz-selection,
792
+ code::-moz-selection {
793
+ background-color: var(--ty-color-warning-soft);
794
+ color: var(--ty-color-neutral-strong);
795
+ }
796
+
797
+ html.dark pre ::selection,
798
+ html.dark code ::selection,
799
+ html.dark pre::-moz-selection,
800
+ html.dark code::-moz-selection {
801
+ background-color: var(--ty-color-warning);
802
+ color: var(--ty-bg-strong);
803
+ }
804
+
805
+ /* Input and textarea selection - higher contrast */
806
+ input::selection,
807
+ textarea::selection,
808
+ input::-moz-selection,
809
+ textarea::-moz-selection {
810
+ background-color: var(--ty-color-primary);
811
+ color: white;
812
+ }
813
+
814
+ html.dark input::selection,
815
+ html.dark textarea::selection,
816
+ html.dark input::-moz-selection,
817
+ html.dark textarea::-moz-selection {
818
+ background-color: var(--ty-color-primary-soft);
819
+ color: var(--ty-color-primary-strong);
820
+ }
821
+
822
+ /* Semantic selection utility classes */
823
+ .ty-selection-primary ::selection,
824
+ .ty-selection-primary::-moz-selection {
825
+ background-color: var(--ty-color-primary-soft);
826
+ color: var(--ty-color-primary-strong);
827
+ }
828
+
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
+
835
+ .ty-selection-success ::selection,
836
+ .ty-selection-success::-moz-selection {
837
+ background-color: var(--ty-color-success-soft);
838
+ color: var(--ty-color-success-strong);
839
+ }
840
+
841
+ .ty-selection-warning ::selection,
842
+ .ty-selection-warning::-moz-selection {
843
+ background-color: var(--ty-color-warning-soft);
844
+ color: var(--ty-color-warning-strong);
845
+ }
846
+
847
+ .ty-selection-danger ::selection,
848
+ .ty-selection-danger::-moz-selection {
849
+ background-color: var(--ty-color-danger-soft);
850
+ color: var(--ty-color-danger-strong);
851
+ }
852
+
853
+ .ty-selection-neutral ::selection,
854
+ .ty-selection-neutral::-moz-selection {
855
+ background-color: var(--ty-color-neutral-soft);
856
+ color: var(--ty-color-neutral-strong);
857
+ }
858
+
859
+ /* Dark mode semantic selections */
860
+ html.dark .ty-selection-primary ::selection,
861
+ html.dark .ty-selection-primary::-moz-selection {
862
+ background-color: var(--ty-color-primary);
863
+ color: white;
864
+ }
865
+
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
+
872
+ html.dark .ty-selection-success ::selection,
873
+ html.dark .ty-selection-success::-moz-selection {
874
+ background-color: var(--ty-color-success);
875
+ color: white;
876
+ }
877
+
878
+ html.dark .ty-selection-warning ::selection,
879
+ html.dark .ty-selection-warning::-moz-selection {
880
+ background-color: var(--ty-color-warning);
881
+ color: var(--ty-bg-strong);
882
+ }
883
+
884
+ html.dark .ty-selection-danger ::selection,
885
+ html.dark .ty-selection-danger::-moz-selection {
886
+ background-color: var(--ty-color-danger);
887
+ color: white;
888
+ }
889
+
890
+ html.dark .ty-selection-neutral ::selection,
891
+ html.dark .ty-selection-neutral::-moz-selection {
892
+ background-color: var(--ty-color-neutral);
893
+ color: white;
894
+ }
895
+
896
+ /* =================================================================
897
+ UTILITY CLASSES
898
+ ================================================================= */
899
+
900
+ /* Sensible default for any border that doesn't set its own color —
901
+ Tailwind's `border` / `border-t`, plain CSS `border: 1px solid`, etc.
902
+ Scoped to `html` to win specificity over Tailwind's (0,0,0) preflight
903
+ regardless of injection order. Class-based overrides (`border-red-500`,
904
+ `ty-border-primary`, etc.) still win their cascade. Theme-aware:
905
+ `--ty-border` switches in dark mode automatically. */
906
+ html *,
907
+ html ::before,
908
+ html ::after {
909
+ border-color: var(--ty-border);
910
+ }
911
+
912
+ /* =================================================================
913
+ SURFACE UTILITIES
914
+ ================================================================= */
915
+
916
+ /* Elevated surfaces - cards, panels, components */
917
+ .ty-elevated {
918
+ box-sizing: border-box !important;
919
+ background-color: var(--ty-surface-elevated) !important;
920
+ border: var(--ty-elevated-border-width, var(--ty-border-width, 1px))
921
+ var(--ty-elevated-border-style, solid)
922
+ var(--ty-elevated-border, transparent) !important;
923
+ box-shadow:
924
+ 0 1px 3px 0 rgb(0 0 0 / 0.1),
925
+ 0 1px 2px -1px rgb(0 0 0 / 0.1) !important;
926
+ --ty-divide-color: var(--ty-elevated-border);
927
+ }
928
+
929
+ /* Floating surfaces - modals, dropdowns, tooltips */
930
+ .ty-floating {
931
+ box-sizing: border-box !important;
932
+ background-color: var(--ty-surface-floating) !important;
933
+ border: var(--ty-floating-border-width, var(--ty-border-width, 1px))
934
+ var(--ty-floating-border-style, solid)
935
+ var(--ty-floating-border, transparent) !important;
936
+ box-shadow:
937
+ 0 4px 6px -1px rgb(0 0 0 / 0.1),
938
+ 0 2px 4px -2px rgb(0 0 0 / 0.1) !important;
939
+ --ty-divide-color: var(--ty-floating-border);
940
+ }
941
+
942
+ /* App and page backgrounds - the canvas for content */
943
+ .ty-canvas {
944
+ box-sizing: border-box !important;
945
+ background-color: var(--ty-surface-canvas) !important;
946
+ border: var(--ty-canvas-border-width, var(--ty-border-width, 1px))
947
+ var(--ty-canvas-border-style, solid) var(--ty-canvas-border, transparent) !important;
948
+ --ty-divide-color: var(--ty-canvas-border);
949
+ }
950
+
951
+ /* Main content areas - primary content background */
952
+ .ty-content {
953
+ box-sizing: border-box !important;
954
+ background-color: var(--ty-surface-content) !important;
955
+ border: var(--ty-content-border-width, var(--ty-border-width, 1px))
956
+ var(--ty-content-border-style, solid) var(--ty-content-border, transparent) !important;
957
+ --ty-divide-color: var(--ty-content-border);
958
+ }
959
+
960
+ /* Input surfaces - form controls, text areas, inputs */
961
+ .ty-input {
962
+ box-sizing: border-box !important;
963
+ background-color: var(--ty-input-bg) !important;
964
+ border: var(--ty-input-border-width, var(--ty-border-width, 1px))
965
+ var(--ty-input-border-style, solid) var(--ty-input-border, transparent) !important;
966
+ --ty-divide-color: var(--ty-input-border);
967
+ }
968
+
969
+ /* Divider utilities — consume --ty-divide-color from the nearest surface
970
+ context (set on .ty-elevated/.ty-floating/.ty-canvas/.ty-content/.ty-input)
971
+ via CSS variable inheritance. Override per-instance:
972
+ style="--ty-divide-color: var(--ty-border-strong);" */
973
+ .ty-divide-y > * + * {
974
+ border-top: var(--ty-divide-width, var(--ty-border-width, 1px)) solid
975
+ var(--ty-divide-color, var(--ty-border));
976
+ }
977
+
978
+ .ty-divide-x > * + * {
979
+ border-left: var(--ty-divide-width, var(--ty-border-width, 1px)) solid
980
+ var(--ty-divide-color, var(--ty-border));
981
+ }
982
+
983
+ /* Dark theme adjustments for shadows */
984
+ html.dark .ty-elevated {
985
+ background-color: var(--ty-surface-elevated) !important;
986
+ box-shadow:
987
+ 0 1px 3px 0 rgb(0 0 0 / 0.2),
988
+ 0 1px 2px -1px rgb(0 0 0 / 0.2) !important;
989
+ }
990
+
991
+ html.dark .ty-floating {
992
+ background-color: var(--ty-surface-floating) !important;
993
+ box-shadow:
994
+ 0 4px 6px -1px rgb(0 0 0 / 0.3),
995
+ 0 2px 4px -2px rgb(0 0 0 / 0.3) !important;
996
+ }
997
+
998
+ html.dark .ty-high-elevation {
999
+ background-color: var(--ty-surface-floating) !important;
1000
+ box-shadow:
1001
+ 0 10px 15px -3px rgb(0 0 0 / 0.4),
1002
+ 0 4px 6px -4px rgb(0 0 0 / 0.4) !important;
1003
+ }
1004
+
1005
+ html.dark .ty-sunken {
1006
+ background-color: var(--ty-surface-input) !important;
1007
+ box-shadow: inset 0 1px 2px 0 rgb(0 0 0 / 0.1) !important;
1008
+ }
1009
+
1010
+ /* =================================================================
1011
+ SEMANTIC BACKGROUND UTILITIES
1012
+ ================================================================= */
1013
+
1014
+ /* Semantic backgrounds - these are the key theme utilities */
1015
+ .ty-bg-primary {
1016
+ background-color: var(--ty-bg-primary);
1017
+ }
1018
+
1019
+ .ty-bg-primary\+ {
1020
+ background-color: var(--ty-bg-primary-bold);
1021
+ }
1022
+
1023
+ .ty-bg-primary- {
1024
+ background-color: var(--ty-bg-primary-soft);
1025
+ }
1026
+
1027
+ .ty-bg-secondary {
1028
+ background-color: var(--ty-bg-secondary);
1029
+ }
1030
+
1031
+ .ty-bg-secondary\+ {
1032
+ background-color: var(--ty-bg-secondary-bold);
1033
+ }
1034
+
1035
+ .ty-bg-secondary- {
1036
+ background-color: var(--ty-bg-secondary-soft);
1037
+ }
1038
+
1039
+ .ty-bg-success {
1040
+ background-color: var(--ty-bg-success);
1041
+ }
1042
+
1043
+ .ty-bg-success\+ {
1044
+ background-color: var(--ty-bg-success-bold);
1045
+ }
1046
+
1047
+ .ty-bg-success- {
1048
+ background-color: var(--ty-bg-success-soft);
1049
+ }
1050
+
1051
+ .ty-bg-danger {
1052
+ background-color: var(--ty-bg-danger);
1053
+ }
1054
+
1055
+ .ty-bg-danger\+ {
1056
+ background-color: var(--ty-bg-danger-bold);
1057
+ }
1058
+
1059
+ .ty-bg-danger- {
1060
+ background-color: var(--ty-bg-danger-soft);
1061
+ }
1062
+
1063
+ .ty-bg-warning {
1064
+ background-color: var(--ty-bg-warning);
1065
+ }
1066
+
1067
+ .ty-bg-warning\+ {
1068
+ background-color: var(--ty-bg-warning-bold);
1069
+ }
1070
+
1071
+ .ty-bg-warning- {
1072
+ background-color: var(--ty-bg-warning-soft);
1073
+ }
1074
+
1075
+ .ty-bg-neutral {
1076
+ background-color: var(--ty-bg-neutral);
1077
+ }
1078
+
1079
+ .ty-bg-neutral\+ {
1080
+ background-color: var(--ty-bg-neutral-bold);
1081
+ }
1082
+
1083
+ .ty-bg-neutral- {
1084
+ background-color: var(--ty-bg-neutral-soft);
1085
+ }
1086
+
1087
+ /* Accent backgrounds */
1088
+ /* =================================================================
1089
+ TEXT HIERARCHY UTILITIES
1090
+ ================================================================= */
1091
+
1092
+ /* Base text hierarchy - emphasis based, not semantic */
1093
+ .ty-text {
1094
+ color: var(--ty-text) !important;
1095
+ }
1096
+
1097
+ .ty-text\+ {
1098
+ color: var(--ty-text-bold) !important;
1099
+ }
1100
+
1101
+ .ty-text\+\+ {
1102
+ color: var(--ty-text-strong) !important;
1103
+ }
1104
+
1105
+ .ty-text- {
1106
+ color: var(--ty-text-soft) !important;
1107
+ }
1108
+
1109
+ .ty-text-- {
1110
+ color: var(--ty-text-faint) !important;
1111
+ }
1112
+
1113
+ /* =================================================================
1114
+ SEMANTIC TEXT COLORS - 5-VARIANT SYSTEM
1115
+ ================================================================= */
1116
+
1117
+ /* Primary text colors with full 5-variant system */
1118
+ .ty-text-primary\+\+ {
1119
+ color: var(--ty-color-primary-strong) !important;
1120
+ }
1121
+
1122
+ .ty-text-primary\+ {
1123
+ color: var(--ty-color-primary-bold) !important;
1124
+ }
1125
+
1126
+ .ty-text-primary {
1127
+ color: var(--ty-color-primary) !important;
1128
+ }
1129
+
1130
+ .ty-text-primary- {
1131
+ color: var(--ty-color-primary-soft) !important;
1132
+ }
1133
+
1134
+ .ty-text-primary-- {
1135
+ color: var(--ty-color-primary-faint) !important;
1136
+ }
1137
+
1138
+ /* Secondary text colors */
1139
+ .ty-text-secondary\+\+ {
1140
+ color: var(--ty-color-secondary-strong) !important;
1141
+ }
1142
+
1143
+ .ty-text-secondary\+ {
1144
+ color: var(--ty-color-secondary-bold) !important;
1145
+ }
1146
+
1147
+ .ty-text-secondary {
1148
+ color: var(--ty-color-secondary) !important;
1149
+ }
1150
+
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
+
1159
+ /* Success text colors */
1160
+ .ty-text-success\+\+ {
1161
+ color: var(--ty-color-success-strong) !important;
1162
+ }
1163
+
1164
+ .ty-text-success\+ {
1165
+ color: var(--ty-color-success-bold) !important;
1166
+ }
1167
+
1168
+ .ty-text-success {
1169
+ color: var(--ty-color-success) !important;
1170
+ }
1171
+
1172
+ .ty-text-success- {
1173
+ color: var(--ty-color-success-soft) !important;
1174
+ }
1175
+
1176
+ .ty-text-success-- {
1177
+ color: var(--ty-color-success-faint) !important;
1178
+ }
1179
+
1180
+ /* Danger text colors */
1181
+ .ty-text-danger\+\+ {
1182
+ color: var(--ty-color-danger-strong) !important;
1183
+ }
1184
+
1185
+ .ty-text-danger\+ {
1186
+ color: var(--ty-color-danger-bold) !important;
1187
+ }
1188
+
1189
+ .ty-text-danger {
1190
+ color: var(--ty-color-danger) !important;
1191
+ }
1192
+
1193
+ .ty-text-danger- {
1194
+ color: var(--ty-color-danger-soft) !important;
1195
+ }
1196
+
1197
+ .ty-text-danger-- {
1198
+ color: var(--ty-color-danger-faint) !important;
1199
+ }
1200
+
1201
+ /* Warning text colors */
1202
+ .ty-text-warning\+\+ {
1203
+ color: var(--ty-color-warning-strong) !important;
1204
+ }
1205
+
1206
+ .ty-text-warning\+ {
1207
+ color: var(--ty-color-warning-bold) !important;
1208
+ }
1209
+
1210
+ .ty-text-warning {
1211
+ color: var(--ty-color-warning) !important;
1212
+ }
1213
+
1214
+ .ty-text-warning- {
1215
+ color: var(--ty-color-warning-soft) !important;
1216
+ }
1217
+
1218
+ .ty-text-warning-- {
1219
+ color: var(--ty-color-warning-faint) !important;
1220
+ }
1221
+
1222
+ /* Neutral text colors */
1223
+ .ty-text-neutral\+\+ {
1224
+ color: var(--ty-color-neutral-strong) !important;
1225
+ }
1226
+
1227
+ .ty-text-neutral\+ {
1228
+ color: var(--ty-color-neutral-bold) !important;
1229
+ }
1230
+
1231
+ .ty-text-neutral {
1232
+ color: var(--ty-color-neutral) !important;
1233
+ }
1234
+
1235
+ .ty-text-neutral- {
1236
+ color: var(--ty-color-neutral-soft) !important;
1237
+ }
1238
+
1239
+ .ty-text-neutral-- {
1240
+ color: var(--ty-color-neutral-faint) !important;
1241
+ }
1242
+
1243
+ /* Accent text colors */
1244
+ /* =================================================================
1245
+ BORDER UTILITIES
1246
+ ================================================================= */
1247
+
1248
+ /* Base border colors with emphasis */
1249
+ .ty-border {
1250
+ border-color: var(--ty-border) !important;
1251
+ }
1252
+
1253
+ .ty-border\+ {
1254
+ border-color: var(--ty-border-bold) !important;
1255
+ }
1256
+
1257
+ .ty-border\+\+ {
1258
+ border-color: var(--ty-border-strong) !important;
1259
+ }
1260
+
1261
+ .ty-border- {
1262
+ border-color: var(--ty-border-soft);
1263
+ }
1264
+
1265
+ .ty-border-- {
1266
+ border-color: var(--ty-border-faint);
1267
+ }
1268
+
1269
+ /* Semantic border colors */
1270
+ .ty-border-primary {
1271
+ border-color: var(--ty-border-primary);
1272
+ }
1273
+
1274
+ .ty-border-secondary {
1275
+ border-color: var(--ty-border-secondary);
1276
+ }
1277
+
1278
+ .ty-border-success {
1279
+ border-color: var(--ty-border-success);
1280
+ }
1281
+
1282
+ .ty-border-danger {
1283
+ border-color: var(--ty-border-danger);
1284
+ }
1285
+
1286
+ .ty-border-warning {
1287
+ border-color: var(--ty-border-warning);
1288
+ }
1289
+
1290
+ .ty-border-neutral {
1291
+ border-color: var(--ty-border-neutral);
1292
+ }
1293
+
1294
+ /* =================================================================
1295
+ COMPONENT UTILITIES
1296
+ ================================================================= */
1297
+
1298
+ /* Card/Panel utilities */
1299
+ .ty-card {
1300
+ background-color: var(--ty-surface-elevated);
1301
+ color: var(--ty-color-neutral-bold);
1302
+ }
1303
+
1304
+ .ty-card-elevated {
1305
+ background-color: var(--ty-surface-floating);
1306
+ box-shadow: var(--ty-shadow-md);
1307
+ }
1308
+
1309
+ /* Input-like utilities for custom form elements */
1310
+ .ty-input-bg {
1311
+ background-color: var(--ty-input-bg);
1312
+ }
1313
+
1314
+ .ty-input-border {
1315
+ border-color: var(--ty-input-border);
1316
+ }
1317
+
1318
+ .ty-input-focus {
1319
+ border-color: var(--ty-input-border-focus);
1320
+ }
1321
+
1322
+ /* Modal/overlay utilities */
1323
+ .ty-modal-bg {
1324
+ background-color: var(--ty-modal-bg);
1325
+ }
1326
+
1327
+ .ty-modal-backdrop {
1328
+ background-color: var(--ty-modal-backdrop);
1329
+ }
1330
+
1331
+ /* =================================================================
1332
+ INTERACTIVE STATES
1333
+ ================================================================= */
1334
+
1335
+ .hover\:ty-bg-neutral--:hover {
1336
+ background-color: var(--ty-bg-neutral-faint) !important;
1337
+ }
1338
+
1339
+ .hover\:ty-bg-neutral-:hover {
1340
+ background-color: var(--ty-bg-neutral-soft) !important;
1341
+ }
1342
+
1343
+ .hover\:ty-bg-neutral:hover {
1344
+ background-color: var(--ty-bg-neutral) !important;
1345
+ }
1346
+
1347
+ .hover\:ty-bg-neutral\+:hover {
1348
+ background-color: var(--ty-bg-neutral-bold) !important;
1349
+ }
1350
+
1351
+ .hover\:ty-bg-neutral\+\+:hover {
1352
+ background-color: var(--ty-bg-neutral-strong) !important;
1353
+ }
1354
+
1355
+ .hover\:ty-bg-primary:hover {
1356
+ background-color: var(--ty-bg-primary) !important;
1357
+ }
1358
+
1359
+ .hover\:ty-bg-primary\+:hover {
1360
+ background-color: var(--ty-bg-primary-bold) !important;
1361
+ }
1362
+
1363
+ .hover\:ty-bg-secondary:hover {
1364
+ background-color: var(--ty-bg-secondary) !important;
1365
+ }
1366
+
1367
+ .hover\:ty-bg-secondary\+:hover {
1368
+ background-color: var(--ty-bg-secondary-bold) !important;
1369
+ }
1370
+
1371
+ .hover\:ty-bg-success:hover {
1372
+ background-color: var(--ty-bg-success) !important;
1373
+ }
1374
+
1375
+ .hover\:ty-bg-success\+:hover {
1376
+ background-color: var(--ty-bg-success-bold) !important;
1377
+ }
1378
+
1379
+ .hover\:ty-bg-danger:hover {
1380
+ background-color: var(--ty-bg-danger) !important;
1381
+ }
1382
+
1383
+ .hover\:ty-bg-danger\+:hover {
1384
+ background-color: var(--ty-bg-danger-bold) !important;
1385
+ }
1386
+
1387
+ .hover\:ty-bg-danger-:hover {
1388
+ background-color: var(--ty-bg-danger-soft) !important;
1389
+ }
1390
+
1391
+ /* Hover states for text colors */
1392
+ .hover\:ty-text:hover {
1393
+ color: var(--ty-text) !important;
1394
+ }
1395
+
1396
+ .hover\:ty-text\+:hover {
1397
+ color: var(--ty-text-bold) !important;
1398
+ }
1399
+
1400
+ .hover\:ty-text\+\+:hover {
1401
+ color: var(--ty-text-strong) !important;
1402
+ }
1403
+
1404
+ .hover\:ty-text-:hover {
1405
+ color: var(--ty-text-soft) !important;
1406
+ }
1407
+
1408
+ .hover\:ty-text--:hover {
1409
+ color: var(--ty-text-faint) !important;
1410
+ }
1411
+
1412
+ /* Hover states for semantic text colors */
1413
+ /* Primary text hover states */
1414
+ .hover\:ty-text-primary\+\+:hover {
1415
+ color: var(--ty-color-primary-strong) !important;
1416
+ }
1417
+
1418
+ .hover\:ty-text-primary\+:hover {
1419
+ color: var(--ty-color-primary-bold) !important;
1420
+ }
1421
+
1422
+ .hover\:ty-text-primary:hover {
1423
+ color: var(--ty-color-primary) !important;
1424
+ }
1425
+
1426
+ .hover\:ty-text-primary-:hover {
1427
+ color: var(--ty-color-primary-soft) !important;
1428
+ }
1429
+
1430
+ .hover\:ty-text-primary--:hover {
1431
+ color: var(--ty-color-primary-faint) !important;
1432
+ }
1433
+
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
+
1443
+ .hover\:ty-text-secondary:hover {
1444
+ color: var(--ty-color-secondary) !important;
1445
+ }
1446
+
1447
+ .hover\:ty-text-secondary-:hover {
1448
+ color: var(--ty-color-secondary-soft) !important;
1449
+ }
1450
+
1451
+ .hover\:ty-text-secondary--:hover {
1452
+ color: var(--ty-color-secondary-faint) !important;
1453
+ }
1454
+
1455
+ /* Success text hover states */
1456
+ .hover\:ty-text-success\+\+:hover {
1457
+ color: var(--ty-color-success-strong) !important;
1458
+ }
1459
+
1460
+ .hover\:ty-text-success\+:hover {
1461
+ color: var(--ty-color-success-bold) !important;
1462
+ }
1463
+
1464
+ .hover\:ty-text-success:hover {
1465
+ color: var(--ty-color-success) !important;
1466
+ }
1467
+
1468
+ .hover\:ty-text-success-:hover {
1469
+ color: var(--ty-color-success-soft) !important;
1470
+ }
1471
+
1472
+ .hover\:ty-text-success--:hover {
1473
+ color: var(--ty-color-success-faint) !important;
1474
+ }
1475
+
1476
+ /* Danger text hover states */
1477
+ .hover\:ty-text-danger\+\+:hover {
1478
+ color: var(--ty-color-danger-strong) !important;
1479
+ }
1480
+
1481
+ .hover\:ty-text-danger\+:hover {
1482
+ color: var(--ty-color-danger-bold) !important;
1483
+ }
1484
+
1485
+ .hover\:ty-text-danger:hover {
1486
+ color: var(--ty-color-danger) !important;
1487
+ }
1488
+
1489
+ .hover\:ty-text-danger-:hover {
1490
+ color: var(--ty-color-danger-soft) !important;
1491
+ }
1492
+
1493
+ .hover\:ty-text-danger--:hover {
1494
+ color: var(--ty-color-danger-faint) !important;
1495
+ }
1496
+
1497
+ /* Warning text hover states */
1498
+ .hover\:ty-text-warning\+\+:hover {
1499
+ color: var(--ty-color-warning-strong) !important;
1500
+ }
1501
+
1502
+ .hover\:ty-text-warning\+:hover {
1503
+ color: var(--ty-color-warning-bold) !important;
1504
+ }
1505
+
1506
+ .hover\:ty-text-warning:hover {
1507
+ color: var(--ty-color-warning) !important;
1508
+ }
1509
+
1510
+ .hover\:ty-text-warning-:hover {
1511
+ color: var(--ty-color-warning-soft) !important;
1512
+ }
1513
+
1514
+ .hover\:ty-text-warning--:hover {
1515
+ color: var(--ty-color-warning-faint) !important;
1516
+ }
1517
+
1518
+ /* Neutral text hover states */
1519
+ .hover\:ty-text-neutral\+\+:hover {
1520
+ color: var(--ty-color-neutral-strong) !important;
1521
+ }
1522
+
1523
+ .hover\:ty-text-neutral + :hover {
1524
+ color: var(--ty-color-neutral-bold) !important;
1525
+ }
1526
+
1527
+ .hover\:ty-text-neutral:hover {
1528
+ color: var(--ty-color-neutral) !important;
1529
+ }
1530
+
1531
+ .hover\:ty-text-neutral-:hover {
1532
+ color: var(--ty-color-neutral-soft) !important;
1533
+ }
1534
+
1535
+ .hover\:ty-text-neutral--:hover {
1536
+ color: var(--ty-color-neutral-faint) !important;
1537
+ }
1538
+
1539
+ /* Accent text hover states */
1540
+ /* Hover states for borders */
1541
+ /* Base border hover states */
1542
+ .hover\:ty-border\+\+:hover {
1543
+ border-color: var(--ty-border-strong) !important;
1544
+ }
1545
+
1546
+ .hover\:ty-border\+:hover {
1547
+ border-color: var(--ty-border-bold) !important;
1548
+ }
1549
+
1550
+ .hover\:ty-border:hover {
1551
+ border-color: var(--ty-border) !important;
1552
+ }
1553
+
1554
+ .hover\:ty-border-:hover {
1555
+ border-color: var(--ty-border-soft) !important;
1556
+ }
1557
+
1558
+ .hover\:ty-border--:hover {
1559
+ border-color: var(--ty-border-faint) !important;
1560
+ }
1561
+
1562
+ /* Semantic border hover states */
1563
+ .hover\:ty-border-primary:hover {
1564
+ border-color: var(--ty-border-primary) !important;
1565
+ }
1566
+
1567
+ .hover\:ty-border-secondary:hover {
1568
+ border-color: var(--ty-border-secondary) !important;
1569
+ }
1570
+
1571
+ .hover\:ty-border-success:hover {
1572
+ border-color: var(--ty-border-success) !important;
1573
+ }
1574
+
1575
+ .hover\:ty-border-danger:hover {
1576
+ border-color: var(--ty-border-danger) !important;
1577
+ }
1578
+
1579
+ .hover\:ty-border-warning:hover {
1580
+ border-color: var(--ty-border-warning) !important;
1581
+ }
1582
+
1583
+ .hover\:ty-border-neutral:hover {
1584
+ border-color: var(--ty-border-neutral) !important;
1585
+ }
1586
+
1587
+ .focus\:ty-border\+\+:focus {
1588
+ border-color: var(--ty-border-strong) !important;
1589
+ }
1590
+
1591
+ .focus\:ty-border + :focus {
1592
+ border-color: var(--ty-border-bold) !important;
1593
+ }
1594
+
1595
+ .focus\:ty-border:focus {
1596
+ border-color: var(--ty-border) !important;
1597
+ }
1598
+
1599
+ .focus\:ty-border-:focus {
1600
+ border-color: var(--ty-border-soft) !important;
1601
+ }
1602
+
1603
+ .focus\:ty-border--:focus {
1604
+ border-color: var(--ty-border-faint) !important;
1605
+ }
1606
+
1607
+ /* Semantic border focus states */
1608
+ .focus\:ty-border-primary:focus {
1609
+ border-color: var(--ty-border-primary) !important;
1610
+ }
1611
+
1612
+ .focus\:ty-border-secondary:focus {
1613
+ border-color: var(--ty-border-secondary) !important;
1614
+ }
1615
+
1616
+ .focus\:ty-border-success:focus {
1617
+ border-color: var(--ty-border-success) !important;
1618
+ }
1619
+
1620
+ .focus\:ty-border-danger:focus {
1621
+ border-color: var(--ty-border-danger) !important;
1622
+ }
1623
+
1624
+ .focus\:ty-border-warning:focus {
1625
+ border-color: var(--ty-border-warning) !important;
1626
+ }
1627
+
1628
+ .focus\:ty-border-neutral:focus {
1629
+ border-color: var(--ty-border-neutral) !important;
1630
+ }
1631
+
1632
+ /* =================================================================
1633
+ RESPONSIVE VARIANTS
1634
+ ================================================================= */
1635
+
1636
+ /* Small screens and up */
1637
+ @media (min-width: 640px) {
1638
+ .sm\:ty-bg-primary {
1639
+ background-color: var(--ty-bg-primary);
1640
+ }
1641
+
1642
+ .sm\:ty-text-primary {
1643
+ color: var(--ty-color-primary);
1644
+ }
1645
+ }
1646
+
1647
+ /* Medium screens and up */
1648
+ @media (min-width: 768px) {
1649
+ .md\:ty-bg-primary {
1650
+ background-color: var(--ty-bg-primary);
1651
+ }
1652
+
1653
+ .md\:ty-text-primary {
1654
+ color: var(--ty-color-primary);
1655
+ }
1656
+ }
1657
+
1658
+ /* Large screens and up */
1659
+ @media (min-width: 1024px) {
1660
+ .lg\:ty-bg-primary {
1661
+ background-color: var(--ty-bg-primary);
1662
+ }
1663
+
1664
+ .lg\:ty-text-primary {
1665
+ color: var(--ty-color-primary);
1666
+ }
1667
+ }
1668
+
1669
+ /* =================================================================
1670
+ MOBILE FONT SIZE
1671
+ Prevents iOS Safari auto-zoom on input focus (requires >= 16px)
1672
+ and improves readability on small screens.
1673
+ ================================================================= */
1674
+
1675
+ @media (max-width: 768px) {
1676
+ :root {
1677
+ --ty-font-sm: 1rem;
1678
+ }
1679
+ }