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,767 @@
1
+ /* =====================================================================
2
+ * tyrell-brand.css — OKLCH-based brand layer for Tyrell Components
3
+ * =====================================================================
4
+ *
5
+ * Opt-in. Load AFTER `tyrell.css`. Override a few variables to rebrand.
6
+ *
7
+ * <link rel="stylesheet" href=".../tyrell.css">
8
+ * <link rel="stylesheet" href=".../tyrell-brand.css">
9
+ *
10
+ * :root {
11
+ * --ty-brand-hue: 200; // teal. Try 260 indigo, 30 orange, 145 emerald.
12
+ * --ty-brand-chroma: 0.13;
13
+ * }
14
+ *
15
+ * Primary, secondary, neutral, surfaces, inputs, solid buttons all retint.
16
+ * Success / danger / warning stay semantic (green / red / amber) — override
17
+ * their *-hue/*-chroma seeds if you want them to follow the brand too.
18
+ *
19
+ * Three layers of knobs you can override at :root (or html.dark for
20
+ * per-mode tuning):
21
+ *
22
+ * 1. SEEDS — per-flavor hue + chroma.
23
+ * --ty-brand-hue, --ty-brand-chroma
24
+ * --ty-secondary-hue, --ty-secondary-chroma (default: brand + 60°)
25
+ * --ty-success-hue, --ty-success-chroma (default: 145°)
26
+ * --ty-danger-hue, --ty-danger-chroma (default: 25°)
27
+ * --ty-warning-hue, --ty-warning-chroma (default: 75°)
28
+ * --ty-neutral-hue, --ty-neutral-chroma (default: brand-hue, 0.005)
29
+ *
30
+ * 2. L-CURVE — lightness stops shared by every flavor.
31
+ * --ty-l-strong, --ty-l-bold, --ty-l-base, --ty-l-soft, --ty-l-faint
32
+ * --ty-l-bg-base, --ty-l-bg-bold, --ty-l-bg-soft
33
+ * Defaults in `:root` are tuned for light mode (lower L = more
34
+ * emphasis). The `html.dark` block redefines them with inverted
35
+ * values. Override either block to compress / expand the ladder.
36
+ *
37
+ * 3. SATURATION CURVE — chroma multipliers per shade.
38
+ * --ty-c-strong-mult, --ty-c-bold-mult, --ty-c-base-mult,
39
+ * --ty-c-soft-mult, --ty-c-faint-mult
40
+ * --ty-c-bg-base-mult, --ty-c-bg-bold-mult, --ty-c-bg-soft-mult
41
+ * Multiplied against the flavor chroma seed. Bump --ty-c-bold-mult
42
+ * to 1.2 to make `+`-emphasis text more saturated; drop
43
+ * --ty-c-faint-mult to 0.2 for whisper-quiet placeholders.
44
+ *
45
+ * Browser support: OKLCH is in every evergreen browser since mid-2023.
46
+ *
47
+ * ===================================================================== */
48
+
49
+ :root {
50
+ /* ----------------------------------------------------------------
51
+ * SEEDS
52
+ * --------------------------------------------------------------*/
53
+
54
+ --ty-brand-hue: 230;
55
+ --ty-brand-chroma: 0.13;
56
+
57
+ /* Every flavor's chroma tracks --ty-brand-chroma by default, at a
58
+ * proportion that preserves the relative saturation hierarchy (danger
59
+ * punchier than primary, neutral near-grey). Drag --ty-brand-chroma to
60
+ * 0 → everything goes greyscale; push to 0.30 → everything goes vibrant.
61
+ *
62
+ * Pin any flavor independently by setting --ty-{flavor}-chroma to a
63
+ * literal number (e.g. --ty-success-chroma: 0.14;). The multiplier
64
+ * relationship breaks for that one flavor only. */
65
+
66
+ /* Secondary rotates from brand by an exposed offset. Defaults to +60°
67
+ * (sibling accent). Try 30° for a close sibling, 120° for triadic,
68
+ * 180° for complement. Set --ty-secondary-hue to a literal number to
69
+ * detach completely. */
70
+ --ty-secondary-offset: 60;
71
+ --ty-secondary-hue: calc(var(--ty-brand-hue) + var(--ty-secondary-offset));
72
+ --ty-secondary-chroma: var(--ty-brand-chroma);
73
+
74
+ --ty-success-hue: 145;
75
+ --ty-success-chroma: calc(var(--ty-brand-chroma) * 1.08);
76
+
77
+ --ty-danger-hue: 25;
78
+ --ty-danger-chroma: calc(var(--ty-brand-chroma) * 1.31);
79
+
80
+ --ty-warning-hue: 75;
81
+ --ty-warning-chroma: calc(var(--ty-brand-chroma) * 1.15);
82
+
83
+ --ty-neutral-hue: var(--ty-brand-hue);
84
+ --ty-neutral-chroma: calc(var(--ty-brand-chroma) * 0.04);
85
+
86
+ /* ----------------------------------------------------------------
87
+ * L-CURVE — light mode. Lower L = more emphasis.
88
+ * --------------------------------------------------------------*/
89
+
90
+ --ty-l-strong: 0.38; /* ++ max emphasis */
91
+ --ty-l-bold: 0.46; /* + high emphasis */
92
+ --ty-l-base: 0.54; /* body */
93
+ --ty-l-soft: 0.72; /* - low emphasis */
94
+ --ty-l-faint: 0.88; /* -- min emphasis */
95
+
96
+ --ty-l-bg-base: 0.96;
97
+ --ty-l-bg-bold: 0.92;
98
+ --ty-l-bg-soft: 0.98;
99
+
100
+ /* ----------------------------------------------------------------
101
+ * SATURATION CURVE — per-shade chroma multipliers.
102
+ * Each shade's chroma = flavor-chroma × multiplier.
103
+ * --------------------------------------------------------------*/
104
+
105
+ --ty-c-strong-mult: 0.77;
106
+ --ty-c-bold-mult: 1;
107
+ --ty-c-base-mult: 0.92;
108
+ --ty-c-soft-mult: 0.77;
109
+ --ty-c-faint-mult: 0.46;
110
+
111
+ --ty-c-bg-base-mult: 0.15;
112
+ --ty-c-bg-bold-mult: 0.38;
113
+ --ty-c-bg-soft-mult: 0.08;
114
+
115
+ /* ================================================================
116
+ * LIGHT MODE — derived tokens. The math is the same for every
117
+ * flavor; only the seed (hue + chroma) differs.
118
+ * ================================================================ */
119
+
120
+ /* Primary */
121
+ --ty-color-primary-strong: oklch(
122
+ var(--ty-l-strong) calc(var(--ty-brand-chroma) * var(--ty-c-strong-mult))
123
+ var(--ty-brand-hue)
124
+ );
125
+ --ty-color-primary-bold: oklch(
126
+ var(--ty-l-bold) calc(var(--ty-brand-chroma) * var(--ty-c-bold-mult))
127
+ var(--ty-brand-hue)
128
+ );
129
+ --ty-color-primary: oklch(
130
+ var(--ty-l-base) calc(var(--ty-brand-chroma) * var(--ty-c-base-mult))
131
+ var(--ty-brand-hue)
132
+ );
133
+ --ty-color-primary-soft: oklch(
134
+ var(--ty-l-soft) calc(var(--ty-brand-chroma) * var(--ty-c-soft-mult))
135
+ var(--ty-brand-hue)
136
+ );
137
+ --ty-color-primary-faint: oklch(
138
+ var(--ty-l-faint) calc(var(--ty-brand-chroma) * var(--ty-c-faint-mult))
139
+ var(--ty-brand-hue)
140
+ );
141
+ --ty-bg-primary: oklch(
142
+ var(--ty-l-bg-base) calc(var(--ty-brand-chroma) * var(--ty-c-bg-base-mult))
143
+ var(--ty-brand-hue)
144
+ );
145
+ --ty-bg-primary-bold: oklch(
146
+ var(--ty-l-bg-bold) calc(var(--ty-brand-chroma) * var(--ty-c-bg-bold-mult))
147
+ var(--ty-brand-hue)
148
+ );
149
+ --ty-bg-primary-soft: oklch(
150
+ var(--ty-l-bg-soft) calc(var(--ty-brand-chroma) * var(--ty-c-bg-soft-mult))
151
+ var(--ty-brand-hue)
152
+ );
153
+ --ty-border-primary: var(--ty-color-primary-soft);
154
+
155
+ /* Secondary */
156
+ --ty-color-secondary-strong: oklch(
157
+ var(--ty-l-strong)
158
+ calc(var(--ty-secondary-chroma) * var(--ty-c-strong-mult))
159
+ var(--ty-secondary-hue)
160
+ );
161
+ --ty-color-secondary-bold: oklch(
162
+ var(--ty-l-bold) calc(var(--ty-secondary-chroma) * var(--ty-c-bold-mult))
163
+ var(--ty-secondary-hue)
164
+ );
165
+ --ty-color-secondary: oklch(
166
+ var(--ty-l-base) calc(var(--ty-secondary-chroma) * var(--ty-c-base-mult))
167
+ var(--ty-secondary-hue)
168
+ );
169
+ --ty-color-secondary-soft: oklch(
170
+ var(--ty-l-soft) calc(var(--ty-secondary-chroma) * var(--ty-c-soft-mult))
171
+ var(--ty-secondary-hue)
172
+ );
173
+ --ty-color-secondary-faint: oklch(
174
+ var(--ty-l-faint) calc(var(--ty-secondary-chroma) * var(--ty-c-faint-mult))
175
+ var(--ty-secondary-hue)
176
+ );
177
+ --ty-bg-secondary: oklch(
178
+ var(--ty-l-bg-base)
179
+ calc(var(--ty-secondary-chroma) * var(--ty-c-bg-base-mult))
180
+ var(--ty-secondary-hue)
181
+ );
182
+ --ty-bg-secondary-bold: oklch(
183
+ var(--ty-l-bg-bold)
184
+ calc(var(--ty-secondary-chroma) * var(--ty-c-bg-bold-mult))
185
+ var(--ty-secondary-hue)
186
+ );
187
+ --ty-bg-secondary-soft: oklch(
188
+ var(--ty-l-bg-soft)
189
+ calc(var(--ty-secondary-chroma) * var(--ty-c-bg-soft-mult))
190
+ var(--ty-secondary-hue)
191
+ );
192
+ --ty-border-secondary: var(--ty-color-secondary-soft);
193
+
194
+ /* Success */
195
+ --ty-color-success-strong: oklch(
196
+ var(--ty-l-strong) calc(var(--ty-success-chroma) * var(--ty-c-strong-mult))
197
+ var(--ty-success-hue)
198
+ );
199
+ --ty-color-success-bold: oklch(
200
+ var(--ty-l-bold) calc(var(--ty-success-chroma) * var(--ty-c-bold-mult))
201
+ var(--ty-success-hue)
202
+ );
203
+ --ty-color-success: oklch(
204
+ var(--ty-l-base) calc(var(--ty-success-chroma) * var(--ty-c-base-mult))
205
+ var(--ty-success-hue)
206
+ );
207
+ --ty-color-success-soft: oklch(
208
+ var(--ty-l-soft) calc(var(--ty-success-chroma) * var(--ty-c-soft-mult))
209
+ var(--ty-success-hue)
210
+ );
211
+ --ty-color-success-faint: oklch(
212
+ var(--ty-l-faint) calc(var(--ty-success-chroma) * var(--ty-c-faint-mult))
213
+ var(--ty-success-hue)
214
+ );
215
+ --ty-bg-success: oklch(
216
+ var(--ty-l-bg-base)
217
+ calc(var(--ty-success-chroma) * var(--ty-c-bg-base-mult))
218
+ var(--ty-success-hue)
219
+ );
220
+ --ty-bg-success-bold: oklch(
221
+ var(--ty-l-bg-bold)
222
+ calc(var(--ty-success-chroma) * var(--ty-c-bg-bold-mult))
223
+ var(--ty-success-hue)
224
+ );
225
+ --ty-bg-success-soft: oklch(
226
+ var(--ty-l-bg-soft)
227
+ calc(var(--ty-success-chroma) * var(--ty-c-bg-soft-mult))
228
+ var(--ty-success-hue)
229
+ );
230
+ --ty-border-success: var(--ty-color-success-soft);
231
+
232
+ /* Danger */
233
+ --ty-color-danger-strong: oklch(
234
+ var(--ty-l-strong) calc(var(--ty-danger-chroma) * var(--ty-c-strong-mult))
235
+ var(--ty-danger-hue)
236
+ );
237
+ --ty-color-danger-bold: oklch(
238
+ var(--ty-l-bold) calc(var(--ty-danger-chroma) * var(--ty-c-bold-mult))
239
+ var(--ty-danger-hue)
240
+ );
241
+ --ty-color-danger: oklch(
242
+ var(--ty-l-base) calc(var(--ty-danger-chroma) * var(--ty-c-base-mult))
243
+ var(--ty-danger-hue)
244
+ );
245
+ --ty-color-danger-soft: oklch(
246
+ var(--ty-l-soft) calc(var(--ty-danger-chroma) * var(--ty-c-soft-mult))
247
+ var(--ty-danger-hue)
248
+ );
249
+ --ty-color-danger-faint: oklch(
250
+ var(--ty-l-faint) calc(var(--ty-danger-chroma) * var(--ty-c-faint-mult))
251
+ var(--ty-danger-hue)
252
+ );
253
+ --ty-bg-danger: oklch(
254
+ var(--ty-l-bg-base) calc(var(--ty-danger-chroma) * var(--ty-c-bg-base-mult))
255
+ var(--ty-danger-hue)
256
+ );
257
+ --ty-bg-danger-bold: oklch(
258
+ var(--ty-l-bg-bold) calc(var(--ty-danger-chroma) * var(--ty-c-bg-bold-mult))
259
+ var(--ty-danger-hue)
260
+ );
261
+ --ty-bg-danger-soft: oklch(
262
+ var(--ty-l-bg-soft) calc(var(--ty-danger-chroma) * var(--ty-c-bg-soft-mult))
263
+ var(--ty-danger-hue)
264
+ );
265
+ --ty-border-danger: var(--ty-color-danger-soft);
266
+
267
+ /* Warning */
268
+ --ty-color-warning-strong: oklch(
269
+ var(--ty-l-strong) calc(var(--ty-warning-chroma) * var(--ty-c-strong-mult))
270
+ var(--ty-warning-hue)
271
+ );
272
+ --ty-color-warning-bold: oklch(
273
+ var(--ty-l-bold) calc(var(--ty-warning-chroma) * var(--ty-c-bold-mult))
274
+ var(--ty-warning-hue)
275
+ );
276
+ --ty-color-warning: oklch(
277
+ var(--ty-l-base) calc(var(--ty-warning-chroma) * var(--ty-c-base-mult))
278
+ var(--ty-warning-hue)
279
+ );
280
+ --ty-color-warning-soft: oklch(
281
+ var(--ty-l-soft) calc(var(--ty-warning-chroma) * var(--ty-c-soft-mult))
282
+ var(--ty-warning-hue)
283
+ );
284
+ --ty-color-warning-faint: oklch(
285
+ var(--ty-l-faint) calc(var(--ty-warning-chroma) * var(--ty-c-faint-mult))
286
+ var(--ty-warning-hue)
287
+ );
288
+ --ty-bg-warning: oklch(
289
+ var(--ty-l-bg-base)
290
+ calc(var(--ty-warning-chroma) * var(--ty-c-bg-base-mult))
291
+ var(--ty-warning-hue)
292
+ );
293
+ --ty-bg-warning-bold: oklch(
294
+ var(--ty-l-bg-bold)
295
+ calc(var(--ty-warning-chroma) * var(--ty-c-bg-bold-mult))
296
+ var(--ty-warning-hue)
297
+ );
298
+ --ty-bg-warning-soft: oklch(
299
+ var(--ty-l-bg-soft)
300
+ calc(var(--ty-warning-chroma) * var(--ty-c-bg-soft-mult))
301
+ var(--ty-warning-hue)
302
+ );
303
+ --ty-border-warning: var(--ty-color-warning-soft);
304
+
305
+ /* Neutral — same L curve, near-zero chroma so the grey scale stays grey. */
306
+ --ty-color-neutral-strong: oklch(
307
+ var(--ty-l-strong) calc(var(--ty-neutral-chroma) * var(--ty-c-strong-mult))
308
+ var(--ty-neutral-hue)
309
+ );
310
+ --ty-color-neutral-bold: oklch(
311
+ var(--ty-l-bold) calc(var(--ty-neutral-chroma) * var(--ty-c-bold-mult))
312
+ var(--ty-neutral-hue)
313
+ );
314
+ --ty-color-neutral: oklch(
315
+ var(--ty-l-base) calc(var(--ty-neutral-chroma) * var(--ty-c-base-mult))
316
+ var(--ty-neutral-hue)
317
+ );
318
+ --ty-color-neutral-soft: oklch(
319
+ var(--ty-l-soft) calc(var(--ty-neutral-chroma) * var(--ty-c-soft-mult))
320
+ var(--ty-neutral-hue)
321
+ );
322
+ --ty-color-neutral-faint: oklch(
323
+ var(--ty-l-faint) calc(var(--ty-neutral-chroma) * var(--ty-c-faint-mult))
324
+ var(--ty-neutral-hue)
325
+ );
326
+ --ty-bg-neutral: oklch(
327
+ var(--ty-l-bg-base)
328
+ calc(var(--ty-neutral-chroma) * var(--ty-c-bg-base-mult))
329
+ var(--ty-neutral-hue)
330
+ );
331
+ --ty-bg-neutral-bold: oklch(
332
+ var(--ty-l-bg-bold)
333
+ calc(var(--ty-neutral-chroma) * var(--ty-c-bg-bold-mult))
334
+ var(--ty-neutral-hue)
335
+ );
336
+ --ty-bg-neutral-soft: oklch(
337
+ var(--ty-l-bg-soft)
338
+ calc(var(--ty-neutral-chroma) * var(--ty-c-bg-soft-mult))
339
+ var(--ty-neutral-hue)
340
+ );
341
+ --ty-bg-neutral-strong: oklch(
342
+ 0.25 calc(var(--ty-neutral-chroma) * 2) var(--ty-neutral-hue)
343
+ );
344
+ --ty-bg-neutral-faint: oklch(
345
+ 0.99 calc(var(--ty-neutral-chroma) * 0.4) var(--ty-neutral-hue)
346
+ );
347
+
348
+ /* Global neutral borders — read off the neutral color ramp. */
349
+ --ty-border-strong: var(--ty-color-neutral-bold);
350
+ --ty-border: var(--ty-color-neutral-soft);
351
+ --ty-border-bold: var(--ty-color-neutral-soft);
352
+ --ty-border-soft: var(--ty-color-neutral-faint);
353
+ --ty-border-faint: var(--ty-color-neutral-faint);
354
+
355
+ /* Surfaces — canvas tinted slightly toward brand for warmth. */
356
+ --ty-surface-canvas: oklch(0.985 0.005 var(--ty-brand-hue));
357
+ --ty-surface-content: oklch(1 0 0);
358
+ --ty-surface-elevated: oklch(1 0 0);
359
+ --ty-surface-floating: oklch(1 0 0);
360
+ --ty-surface-input: oklch(1 0 0);
361
+
362
+ /* Inputs — tied to neutral ramp so form controls retint with brand. */
363
+ --ty-input-bg: var(--ty-surface-input);
364
+ --ty-input-color: var(--ty-color-neutral-strong);
365
+ --ty-input-border: var(--ty-color-neutral-soft);
366
+ --ty-input-border-hover: var(--ty-color-neutral-bold);
367
+ --ty-input-border-focus: var(--ty-color-primary);
368
+ --ty-input-placeholder: var(--ty-color-neutral-soft);
369
+ --ty-input-disabled-bg: var(--ty-color-neutral-faint);
370
+ --ty-input-disabled-border: var(--ty-color-neutral-faint);
371
+ --ty-input-disabled-color: var(--ty-color-neutral-bold);
372
+ --ty-input-shadow-focus: color-mix(
373
+ in oklab,
374
+ var(--ty-color-primary) 5%,
375
+ transparent
376
+ );
377
+
378
+ /* Solid buttons — re-route through --ty-color-*. */
379
+ --ty-solid-primary: var(--ty-color-primary);
380
+ --ty-solid-primary-strong: var(--ty-color-primary-bold);
381
+ --ty-solid-primary-soft: var(--ty-color-primary-soft);
382
+ --ty-solid-primary-fg: white;
383
+
384
+ --ty-solid-secondary: var(--ty-color-secondary);
385
+ --ty-solid-secondary-strong: var(--ty-color-secondary-bold);
386
+ --ty-solid-secondary-soft: var(--ty-color-secondary-soft);
387
+ --ty-solid-secondary-fg: white;
388
+
389
+ --ty-solid-success: var(--ty-color-success);
390
+ --ty-solid-success-strong: var(--ty-color-success-bold);
391
+ --ty-solid-success-soft: var(--ty-color-success-soft);
392
+ --ty-solid-success-fg: white;
393
+
394
+ --ty-solid-danger: var(--ty-color-danger);
395
+ --ty-solid-danger-strong: var(--ty-color-danger-bold);
396
+ --ty-solid-danger-soft: var(--ty-color-danger-soft);
397
+ --ty-solid-danger-fg: white;
398
+
399
+ --ty-solid-warning: var(--ty-color-warning);
400
+ --ty-solid-warning-strong: var(--ty-color-warning-bold);
401
+ --ty-solid-warning-soft: var(--ty-color-warning-soft);
402
+ --ty-solid-warning-fg: white;
403
+
404
+ /* Solid neutral routes to neutral-strong rather than neutral-base.
405
+ * Neutral-base (L_base) reads as a washy mid-grey on white surfaces;
406
+ * neutral-strong gives the dark-grey "default action" weight that
407
+ * design systems typically use for neutral buttons. The "strong"
408
+ * solid variant clamps higher emphasis (same shade, kept for the
409
+ * solid-* API shape); "soft" softens to neutral-bold for inactive
410
+ * states. */
411
+
412
+ --ty-solid-neutral-soft: oklch(
413
+ 0.6 calc(var(--ty-neutral-chroma) * var(--ty-c-strong-mult))
414
+ var(--ty-neutral-hue)
415
+ );
416
+ --ty-solid-neutral: oklch(
417
+ 0.4 calc(var(--ty-neutral-chroma) * var(--ty-c-strong-mult))
418
+ var(--ty-neutral-hue)
419
+ );
420
+
421
+ --ty-solid-neutral-strong: oklch(
422
+ 0.2 calc(var(--ty-neutral-chroma) * var(--ty-c-strong-mult))
423
+ var(--ty-neutral-hue)
424
+ );
425
+ }
426
+
427
+ /* =====================================================================
428
+ * DARK MODE — L-curve and saturation-curve overridden. Same flavor
429
+ * seeds drive both modes; only the L and chroma multipliers change.
430
+ * ===================================================================== */
431
+
432
+ html.dark,
433
+ html[data-theme="dark"] {
434
+ --ty-l-strong: 0.86; /* ++ max emphasis in dark = brightest */
435
+ --ty-l-bold: 0.74;
436
+ --ty-l-base: 0.62;
437
+ --ty-l-soft: 0.46;
438
+ --ty-l-faint: 0.3; /* -- min emphasis = darkest */
439
+
440
+ --ty-l-bg-base: 0.22;
441
+ --ty-l-bg-bold: 0.26;
442
+ --ty-l-bg-soft: 0.19;
443
+
444
+ /* Saturation curve — dark pushes faint chroma up so dim shades don't
445
+ * collapse into grey, and trims strong so bright tones don't over-pop. */
446
+ --ty-c-strong-mult: 0.77;
447
+ --ty-c-bold-mult: 1;
448
+ --ty-c-base-mult: 0.92;
449
+ --ty-c-soft-mult: 0.77;
450
+ --ty-c-faint-mult: 0.5;
451
+
452
+ --ty-c-bg-base-mult: 0.38;
453
+ --ty-c-bg-bold-mult: 0.54;
454
+ --ty-c-bg-soft-mult: 0.23;
455
+
456
+ /* Color tokens re-declared here so we match tyrell.css's `html.dark` block
457
+ * at the same selector specificity (0,1,1). Without these, tyrell.css's
458
+ * hardcoded dark-mode hexes out-rank the brand-layer ':root' definitions
459
+ * and the brand-hue slider does nothing in dark mode. The math is the
460
+ * same as the light block — just uses the dark L-curve / chroma curve
461
+ * defined above. */
462
+
463
+ /* Primary */
464
+ --ty-color-primary-strong: oklch(
465
+ var(--ty-l-strong) calc(var(--ty-brand-chroma) * var(--ty-c-strong-mult))
466
+ var(--ty-brand-hue)
467
+ );
468
+ --ty-color-primary-bold: oklch(
469
+ var(--ty-l-bold) calc(var(--ty-brand-chroma) * var(--ty-c-bold-mult))
470
+ var(--ty-brand-hue)
471
+ );
472
+ --ty-color-primary: oklch(
473
+ var(--ty-l-base) calc(var(--ty-brand-chroma) * var(--ty-c-base-mult))
474
+ var(--ty-brand-hue)
475
+ );
476
+ --ty-color-primary-soft: oklch(
477
+ var(--ty-l-soft) calc(var(--ty-brand-chroma) * var(--ty-c-soft-mult))
478
+ var(--ty-brand-hue)
479
+ );
480
+ --ty-color-primary-faint: oklch(
481
+ var(--ty-l-faint) calc(var(--ty-brand-chroma) * var(--ty-c-faint-mult))
482
+ var(--ty-brand-hue)
483
+ );
484
+ --ty-bg-primary: oklch(
485
+ var(--ty-l-bg-base) calc(var(--ty-brand-chroma) * var(--ty-c-bg-base-mult))
486
+ var(--ty-brand-hue)
487
+ );
488
+ --ty-bg-primary-bold: oklch(
489
+ var(--ty-l-bg-bold) calc(var(--ty-brand-chroma) * var(--ty-c-bg-bold-mult))
490
+ var(--ty-brand-hue)
491
+ );
492
+ --ty-bg-primary-soft: oklch(
493
+ var(--ty-l-bg-soft) calc(var(--ty-brand-chroma) * var(--ty-c-bg-soft-mult))
494
+ var(--ty-brand-hue)
495
+ );
496
+ --ty-border-primary: var(--ty-color-primary-soft);
497
+
498
+ /* Secondary */
499
+ --ty-color-secondary-strong: oklch(
500
+ var(--ty-l-strong)
501
+ calc(var(--ty-secondary-chroma) * var(--ty-c-strong-mult))
502
+ var(--ty-secondary-hue)
503
+ );
504
+ --ty-color-secondary-bold: oklch(
505
+ var(--ty-l-bold) calc(var(--ty-secondary-chroma) * var(--ty-c-bold-mult))
506
+ var(--ty-secondary-hue)
507
+ );
508
+ --ty-color-secondary: oklch(
509
+ var(--ty-l-base) calc(var(--ty-secondary-chroma) * var(--ty-c-base-mult))
510
+ var(--ty-secondary-hue)
511
+ );
512
+ --ty-color-secondary-soft: oklch(
513
+ var(--ty-l-soft) calc(var(--ty-secondary-chroma) * var(--ty-c-soft-mult))
514
+ var(--ty-secondary-hue)
515
+ );
516
+ --ty-color-secondary-faint: oklch(
517
+ var(--ty-l-faint) calc(var(--ty-secondary-chroma) * var(--ty-c-faint-mult))
518
+ var(--ty-secondary-hue)
519
+ );
520
+ --ty-bg-secondary: oklch(
521
+ var(--ty-l-bg-base)
522
+ calc(var(--ty-secondary-chroma) * var(--ty-c-bg-base-mult))
523
+ var(--ty-secondary-hue)
524
+ );
525
+ --ty-bg-secondary-bold: oklch(
526
+ var(--ty-l-bg-bold)
527
+ calc(var(--ty-secondary-chroma) * var(--ty-c-bg-bold-mult))
528
+ var(--ty-secondary-hue)
529
+ );
530
+ --ty-bg-secondary-soft: oklch(
531
+ var(--ty-l-bg-soft)
532
+ calc(var(--ty-secondary-chroma) * var(--ty-c-bg-soft-mult))
533
+ var(--ty-secondary-hue)
534
+ );
535
+ --ty-border-secondary: var(--ty-color-secondary-soft);
536
+
537
+ /* Success */
538
+ --ty-color-success-strong: oklch(
539
+ var(--ty-l-strong) calc(var(--ty-success-chroma) * var(--ty-c-strong-mult))
540
+ var(--ty-success-hue)
541
+ );
542
+ --ty-color-success-bold: oklch(
543
+ var(--ty-l-bold) calc(var(--ty-success-chroma) * var(--ty-c-bold-mult))
544
+ var(--ty-success-hue)
545
+ );
546
+ --ty-color-success: oklch(
547
+ var(--ty-l-base) calc(var(--ty-success-chroma) * var(--ty-c-base-mult))
548
+ var(--ty-success-hue)
549
+ );
550
+ --ty-color-success-soft: oklch(
551
+ var(--ty-l-soft) calc(var(--ty-success-chroma) * var(--ty-c-soft-mult))
552
+ var(--ty-success-hue)
553
+ );
554
+ --ty-color-success-faint: oklch(
555
+ var(--ty-l-faint) calc(var(--ty-success-chroma) * var(--ty-c-faint-mult))
556
+ var(--ty-success-hue)
557
+ );
558
+ --ty-bg-success: oklch(
559
+ var(--ty-l-bg-base)
560
+ calc(var(--ty-success-chroma) * var(--ty-c-bg-base-mult))
561
+ var(--ty-success-hue)
562
+ );
563
+ --ty-bg-success-bold: oklch(
564
+ var(--ty-l-bg-bold)
565
+ calc(var(--ty-success-chroma) * var(--ty-c-bg-bold-mult))
566
+ var(--ty-success-hue)
567
+ );
568
+ --ty-bg-success-soft: oklch(
569
+ var(--ty-l-bg-soft)
570
+ calc(var(--ty-success-chroma) * var(--ty-c-bg-soft-mult))
571
+ var(--ty-success-hue)
572
+ );
573
+ --ty-border-success: var(--ty-color-success-soft);
574
+
575
+ /* Danger */
576
+ --ty-color-danger-strong: oklch(
577
+ var(--ty-l-strong) calc(var(--ty-danger-chroma) * var(--ty-c-strong-mult))
578
+ var(--ty-danger-hue)
579
+ );
580
+ --ty-color-danger-bold: oklch(
581
+ var(--ty-l-bold) calc(var(--ty-danger-chroma) * var(--ty-c-bold-mult))
582
+ var(--ty-danger-hue)
583
+ );
584
+ --ty-color-danger: oklch(
585
+ var(--ty-l-base) calc(var(--ty-danger-chroma) * var(--ty-c-base-mult))
586
+ var(--ty-danger-hue)
587
+ );
588
+ --ty-color-danger-soft: oklch(
589
+ var(--ty-l-soft) calc(var(--ty-danger-chroma) * var(--ty-c-soft-mult))
590
+ var(--ty-danger-hue)
591
+ );
592
+ --ty-color-danger-faint: oklch(
593
+ var(--ty-l-faint) calc(var(--ty-danger-chroma) * var(--ty-c-faint-mult))
594
+ var(--ty-danger-hue)
595
+ );
596
+ --ty-bg-danger: oklch(
597
+ var(--ty-l-bg-base) calc(var(--ty-danger-chroma) * var(--ty-c-bg-base-mult))
598
+ var(--ty-danger-hue)
599
+ );
600
+ --ty-bg-danger-bold: oklch(
601
+ var(--ty-l-bg-bold) calc(var(--ty-danger-chroma) * var(--ty-c-bg-bold-mult))
602
+ var(--ty-danger-hue)
603
+ );
604
+ --ty-bg-danger-soft: oklch(
605
+ var(--ty-l-bg-soft) calc(var(--ty-danger-chroma) * var(--ty-c-bg-soft-mult))
606
+ var(--ty-danger-hue)
607
+ );
608
+ --ty-border-danger: var(--ty-color-danger-soft);
609
+
610
+ /* Warning */
611
+ --ty-color-warning-strong: oklch(
612
+ var(--ty-l-strong) calc(var(--ty-warning-chroma) * var(--ty-c-strong-mult))
613
+ var(--ty-warning-hue)
614
+ );
615
+ --ty-color-warning-bold: oklch(
616
+ var(--ty-l-bold) calc(var(--ty-warning-chroma) * var(--ty-c-bold-mult))
617
+ var(--ty-warning-hue)
618
+ );
619
+ --ty-color-warning: oklch(
620
+ var(--ty-l-base) calc(var(--ty-warning-chroma) * var(--ty-c-base-mult))
621
+ var(--ty-warning-hue)
622
+ );
623
+ --ty-color-warning-soft: oklch(
624
+ var(--ty-l-soft) calc(var(--ty-warning-chroma) * var(--ty-c-soft-mult))
625
+ var(--ty-warning-hue)
626
+ );
627
+ --ty-color-warning-faint: oklch(
628
+ var(--ty-l-faint) calc(var(--ty-warning-chroma) * var(--ty-c-faint-mult))
629
+ var(--ty-warning-hue)
630
+ );
631
+ --ty-bg-warning: oklch(
632
+ var(--ty-l-bg-base)
633
+ calc(var(--ty-warning-chroma) * var(--ty-c-bg-base-mult))
634
+ var(--ty-warning-hue)
635
+ );
636
+ --ty-bg-warning-bold: oklch(
637
+ var(--ty-l-bg-bold)
638
+ calc(var(--ty-warning-chroma) * var(--ty-c-bg-bold-mult))
639
+ var(--ty-warning-hue)
640
+ );
641
+ --ty-bg-warning-soft: oklch(
642
+ var(--ty-l-bg-soft)
643
+ calc(var(--ty-warning-chroma) * var(--ty-c-bg-soft-mult))
644
+ var(--ty-warning-hue)
645
+ );
646
+ --ty-border-warning: var(--ty-color-warning-soft);
647
+
648
+ /* Neutral */
649
+ --ty-color-neutral-strong: oklch(
650
+ var(--ty-l-strong) calc(var(--ty-neutral-chroma) * var(--ty-c-strong-mult))
651
+ var(--ty-neutral-hue)
652
+ );
653
+ --ty-color-neutral-bold: oklch(
654
+ var(--ty-l-bold) calc(var(--ty-neutral-chroma) * var(--ty-c-bold-mult))
655
+ var(--ty-neutral-hue)
656
+ );
657
+ --ty-color-neutral: oklch(
658
+ var(--ty-l-base) calc(var(--ty-neutral-chroma) * var(--ty-c-base-mult))
659
+ var(--ty-neutral-hue)
660
+ );
661
+ --ty-color-neutral-soft: oklch(
662
+ var(--ty-l-soft) calc(var(--ty-neutral-chroma) * var(--ty-c-soft-mult))
663
+ var(--ty-neutral-hue)
664
+ );
665
+ --ty-color-neutral-faint: oklch(
666
+ var(--ty-l-faint) calc(var(--ty-neutral-chroma) * var(--ty-c-faint-mult))
667
+ var(--ty-neutral-hue)
668
+ );
669
+ --ty-bg-neutral: oklch(
670
+ var(--ty-l-bg-base)
671
+ calc(var(--ty-neutral-chroma) * var(--ty-c-bg-base-mult))
672
+ var(--ty-neutral-hue)
673
+ );
674
+ --ty-bg-neutral-bold: oklch(
675
+ var(--ty-l-bg-bold)
676
+ calc(var(--ty-neutral-chroma) * var(--ty-c-bg-bold-mult))
677
+ var(--ty-neutral-hue)
678
+ );
679
+ --ty-bg-neutral-soft: oklch(
680
+ var(--ty-l-bg-soft)
681
+ calc(var(--ty-neutral-chroma) * var(--ty-c-bg-soft-mult))
682
+ var(--ty-neutral-hue)
683
+ );
684
+ --ty-bg-neutral-strong: oklch(
685
+ 0.95 calc(var(--ty-neutral-chroma) * 2) var(--ty-neutral-hue)
686
+ );
687
+ --ty-bg-neutral-faint: oklch(
688
+ 0.15 calc(var(--ty-neutral-chroma) * 2) var(--ty-neutral-hue)
689
+ );
690
+
691
+ /* Global neutral borders */
692
+ --ty-border-strong: var(--ty-color-neutral-bold);
693
+ --ty-border: var(--ty-color-neutral-soft);
694
+ --ty-border-bold: var(--ty-color-neutral-soft);
695
+ --ty-border-soft: var(--ty-color-neutral-faint);
696
+ --ty-border-faint: var(--ty-color-neutral-faint);
697
+
698
+ /* Surfaces — flip dark with a hint of brand chroma. */
699
+ --ty-surface-canvas: oklch(0.12 0.012 var(--ty-brand-hue));
700
+ --ty-surface-content: oklch(0.16 0.012 var(--ty-brand-hue));
701
+ --ty-surface-elevated: oklch(0.19 0.013 var(--ty-brand-hue));
702
+ --ty-surface-floating: oklch(0.22 0.015 var(--ty-brand-hue));
703
+ --ty-surface-input: oklch(0.18 0.012 var(--ty-brand-hue));
704
+
705
+ /* Inputs — re-declared so tyrell.css's hardcoded dark values don't
706
+ * out-rank our brand-derived ones (same selector specificity, source
707
+ * order wins). */
708
+ --ty-input-bg: var(--ty-surface-input);
709
+ --ty-input-color: var(--ty-color-neutral-strong);
710
+ --ty-input-border: var(--ty-color-neutral-faint);
711
+ --ty-input-border-hover: var(--ty-color-neutral-bold);
712
+ --ty-input-border-focus: var(--ty-color-primary);
713
+ --ty-input-placeholder: var(--ty-color-neutral-soft);
714
+ --ty-input-disabled-bg: var(--ty-color-neutral-faint);
715
+ --ty-input-disabled-border: var(--ty-color-neutral-faint);
716
+ --ty-input-disabled-color: var(--ty-color-neutral-bold);
717
+ --ty-input-shadow-focus: color-mix(
718
+ in oklab,
719
+ var(--ty-color-primary) 20%,
720
+ transparent
721
+ );
722
+
723
+ /* Solid buttons — same reason. */
724
+ --ty-solid-primary: var(--ty-color-primary);
725
+ --ty-solid-primary-strong: var(--ty-color-primary-bold);
726
+ --ty-solid-primary-soft: var(--ty-color-primary-soft);
727
+ --ty-solid-primary-fg: white;
728
+
729
+ --ty-solid-secondary: var(--ty-color-secondary);
730
+ --ty-solid-secondary-strong: var(--ty-color-secondary-bold);
731
+ --ty-solid-secondary-soft: var(--ty-color-secondary-soft);
732
+ --ty-solid-secondary-fg: white;
733
+
734
+ --ty-solid-success: var(--ty-color-success);
735
+ --ty-solid-success-strong: var(--ty-color-success-bold);
736
+ --ty-solid-success-soft: var(--ty-color-success-soft);
737
+ --ty-solid-success-fg: white;
738
+
739
+ --ty-solid-danger: var(--ty-color-danger);
740
+ --ty-solid-danger-strong: var(--ty-color-danger-bold);
741
+ --ty-solid-danger-soft: var(--ty-color-danger-soft);
742
+ --ty-solid-danger-fg: white;
743
+
744
+ --ty-solid-warning: var(--ty-color-warning);
745
+ --ty-solid-warning-strong: var(--ty-color-warning-bold);
746
+ --ty-solid-warning-soft: var(--ty-color-warning-soft);
747
+ --ty-solid-warning-fg: white;
748
+
749
+ /* Solid neutral — see comment in the :root block. In dark mode the
750
+ * "dark grey" position lives at the OTHER end of the ramp (faint),
751
+ * because the L-curve inverts. Both modes get "a darker shade than
752
+ * the page surface" for a punchy default action. */
753
+ --ty-solid-neutral-soft: oklch(
754
+ 0.2 calc(var(--ty-neutral-chroma) * var(--ty-c-strong-mult))
755
+ var(--ty-neutral-hue)
756
+ );
757
+ --ty-solid-neutral: oklch(
758
+ 0.3 calc(var(--ty-neutral-chroma) * var(--ty-c-strong-mult))
759
+ var(--ty-neutral-hue)
760
+ );
761
+
762
+ --ty-solid-neutral-strong: oklch(
763
+ 0.4 calc(var(--ty-neutral-chroma) * var(--ty-c-strong-mult))
764
+ var(--ty-neutral-hue)
765
+ );
766
+ --ty-solid-neutral-fg: white;
767
+ }