@felloinnovations/brand-kit 0.4.0 → 0.5.1

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 (363) hide show
  1. package/AGENTS.md +198 -24
  2. package/CHANGELOG.md +221 -0
  3. package/README.md +38 -9
  4. package/design-system/01-how-claude-decides.md +26 -17
  5. package/design-system/02-principles.md +11 -6
  6. package/design-system/03-colour.md +135 -47
  7. package/design-system/04-type.md +45 -23
  8. package/design-system/05-space-and-layout.md +175 -52
  9. package/design-system/06-sizing-profiles.md +4 -4
  10. package/design-system/07-scrolling.md +66 -20
  11. package/design-system/08-choosing-components.md +50 -22
  12. package/design-system/09-charts.md +71 -28
  13. package/design-system/10-patterns.md +33 -10
  14. package/design-system/11-page-recipes.md +110 -23
  15. package/design-system/12-content.md +2 -1
  16. package/design-system/13-motion.md +330 -47
  17. package/design-system/14-accessibility.md +47 -24
  18. package/design-system/15-ai-experiences.md +11 -6
  19. package/design-system/16-creativity.md +1 -1
  20. package/design-system/17-decisions.md +367 -1
  21. package/design-system/18-checklist.md +79 -16
  22. package/design-system/19-public-pages.md +6 -4
  23. package/design-system/20-palettes.md +275 -0
  24. package/design-system/README.md +30 -17
  25. package/design-system/components/ActionList/README.md +96 -10
  26. package/design-system/components/ActionList/preview.html +52 -7
  27. package/design-system/components/ActionList/style.css +64 -0
  28. package/design-system/components/ActivityGrid/README.md +38 -2
  29. package/design-system/components/ActivityGrid/preview.html +1 -1
  30. package/design-system/components/ActivityGrid/style.css +35 -0
  31. package/design-system/components/AppShell/README.md +205 -75
  32. package/design-system/components/AppShell/preview.html +339 -58
  33. package/design-system/components/AppShell/style.css +154 -0
  34. package/design-system/components/Avatar/README.md +37 -10
  35. package/design-system/components/Avatar/preview.html +13 -4
  36. package/design-system/components/Avatar/style.css +14 -0
  37. package/design-system/components/Badge/README.md +41 -19
  38. package/design-system/components/Badge/preview.html +13 -10
  39. package/design-system/components/Badge/style.css +23 -0
  40. package/design-system/components/Banner/README.md +30 -9
  41. package/design-system/components/Banner/preview.html +1 -1
  42. package/design-system/components/Banner/style.css +19 -0
  43. package/design-system/components/Breadcrumb/README.md +58 -46
  44. package/design-system/components/Breadcrumb/preview.html +16 -16
  45. package/design-system/components/Breadcrumb/style.css +17 -0
  46. package/design-system/components/Button/README.md +113 -55
  47. package/design-system/components/Button/preview.html +98 -25
  48. package/design-system/components/Button/style.css +86 -0
  49. package/design-system/components/Card/README.md +158 -49
  50. package/design-system/components/Card/preview.html +141 -19
  51. package/design-system/components/Card/style.css +115 -0
  52. package/design-system/components/CardBoard/README.md +58 -37
  53. package/design-system/components/CardBoard/preview.html +26 -29
  54. package/design-system/components/ChatCard/README.md +115 -29
  55. package/design-system/components/ChatCard/preview.html +149 -32
  56. package/design-system/components/ChatCard/style.css +49 -0
  57. package/design-system/components/ChatShell/README.md +116 -0
  58. package/design-system/components/ChatShell/preview.html +201 -0
  59. package/design-system/components/ChatShell/style.css +86 -0
  60. package/design-system/components/ChatTurn/README.md +78 -35
  61. package/design-system/components/ChatTurn/preview.html +60 -28
  62. package/design-system/components/ChatTurn/style.css +50 -0
  63. package/design-system/components/CheckRow/README.md +141 -0
  64. package/design-system/components/CheckRow/preview.html +140 -0
  65. package/design-system/components/CheckRow/style.css +88 -0
  66. package/design-system/components/Checkbox/README.md +58 -22
  67. package/design-system/components/Checkbox/preview.html +112 -50
  68. package/design-system/components/Checkbox/style.css +45 -0
  69. package/design-system/components/Chip/README.md +78 -47
  70. package/design-system/components/Chip/preview.html +29 -4
  71. package/design-system/components/Chip/style.css +17 -0
  72. package/design-system/components/Combobox/README.md +44 -11
  73. package/design-system/components/Combobox/preview.html +35 -12
  74. package/design-system/components/Combobox/style.css +54 -0
  75. package/design-system/components/Composer/README.md +137 -35
  76. package/design-system/components/Composer/preview.html +115 -40
  77. package/design-system/components/Composer/style.css +81 -0
  78. package/design-system/components/ConfirmDialog/README.md +73 -52
  79. package/design-system/components/ConfirmDialog/preview.html +70 -26
  80. package/design-system/components/ConfirmDialog/style.css +5 -0
  81. package/design-system/components/Cover/preview.html +3 -3
  82. package/design-system/components/Cover/style.css +19 -0
  83. package/design-system/components/DateInput/README.md +77 -12
  84. package/design-system/components/DateInput/preview.html +27 -12
  85. package/design-system/components/DateInput/style.css +38 -0
  86. package/design-system/components/Dialog/README.md +112 -44
  87. package/design-system/components/Dialog/preview.html +141 -18
  88. package/design-system/components/Dialog/style.css +74 -0
  89. package/design-system/components/EmptyState/README.md +42 -12
  90. package/design-system/components/EmptyState/preview.html +11 -11
  91. package/design-system/components/EmptyState/style.css +9 -0
  92. package/design-system/components/EntryShell/README.md +73 -48
  93. package/design-system/components/EntryShell/preview.html +60 -27
  94. package/design-system/components/EntryShell/style.css +19 -0
  95. package/design-system/components/FeatureGrid/README.md +61 -39
  96. package/design-system/components/FeatureGrid/preview.html +2 -2
  97. package/design-system/components/FeatureGrid/style.css +20 -0
  98. package/design-system/components/FileUpload/README.md +33 -3
  99. package/design-system/components/FileUpload/preview.html +18 -4
  100. package/design-system/components/FileUpload/style.css +23 -0
  101. package/design-system/components/FilterBar/README.md +114 -0
  102. package/design-system/components/FilterBar/preview.html +82 -0
  103. package/design-system/components/FilterBar/style.css +22 -0
  104. package/design-system/components/Fold/README.md +84 -26
  105. package/design-system/components/Fold/preview.html +77 -34
  106. package/design-system/components/Fold/style.css +48 -0
  107. package/design-system/components/Footer/README.md +62 -39
  108. package/design-system/components/Footer/preview.html +5 -5
  109. package/design-system/components/Footer/style.css +30 -0
  110. package/design-system/components/FunnelBars/README.md +24 -3
  111. package/design-system/components/FunnelBars/preview.html +5 -5
  112. package/design-system/components/FunnelBars/style.css +13 -0
  113. package/design-system/components/GoalBars/README.md +54 -10
  114. package/design-system/components/GoalBars/preview.html +69 -28
  115. package/design-system/components/GoalBars/style.css +51 -0
  116. package/design-system/components/GoalTicks/README.md +74 -58
  117. package/design-system/components/GoalTicks/preview.html +41 -118
  118. package/design-system/components/GoalTicks/style.css +37 -0
  119. package/design-system/components/GoalTubes/README.md +29 -3
  120. package/design-system/components/GoalTubes/preview.html +6 -6
  121. package/design-system/components/GoalTubes/style.css +23 -0
  122. package/design-system/components/Heatmap/README.md +133 -0
  123. package/design-system/components/Heatmap/preview.html +168 -0
  124. package/design-system/components/Heatmap/style.css +119 -0
  125. package/design-system/components/Hero/README.md +58 -40
  126. package/design-system/components/Hero/preview.html +1 -1
  127. package/design-system/components/Hero/style.css +19 -0
  128. package/design-system/components/HoverCard/README.md +114 -0
  129. package/design-system/components/HoverCard/preview.html +107 -0
  130. package/design-system/components/HoverCard/style.css +59 -0
  131. package/design-system/components/IconButton/README.md +69 -38
  132. package/design-system/components/IconButton/preview.html +77 -43
  133. package/design-system/components/IconButton/style.css +45 -0
  134. package/design-system/components/Input/README.md +36 -11
  135. package/design-system/components/Input/preview.html +1 -1
  136. package/design-system/components/Input/style.css +23 -0
  137. package/design-system/components/KanbanBoard/README.md +93 -45
  138. package/design-system/components/KanbanBoard/preview.html +159 -43
  139. package/design-system/components/KanbanBoard/style.css +53 -0
  140. package/design-system/components/Kbd/README.md +25 -9
  141. package/design-system/components/Kbd/preview.html +6 -2
  142. package/design-system/components/Kbd/style.css +9 -0
  143. package/design-system/components/KitButton/README.md +81 -47
  144. package/design-system/components/KitButton/preview.html +35 -13
  145. package/design-system/components/KitButton/style.css +46 -0
  146. package/design-system/components/KitCard/README.md +75 -44
  147. package/design-system/components/KitCard/preview.html +18 -10
  148. package/design-system/components/KitCard/style.css +15 -0
  149. package/design-system/components/KitInput/README.md +54 -39
  150. package/design-system/components/KitInput/preview.html +7 -7
  151. package/design-system/components/KitInput/style.css +23 -0
  152. package/design-system/components/Leaderboard/README.md +76 -49
  153. package/design-system/components/Leaderboard/preview.html +61 -26
  154. package/design-system/components/Leaderboard/style.css +44 -0
  155. package/design-system/components/ListDetail/README.md +222 -0
  156. package/design-system/components/ListDetail/preview.html +213 -0
  157. package/design-system/components/ListDetail/style.css +148 -0
  158. package/design-system/components/LoadBar/README.md +79 -0
  159. package/design-system/components/LoadBar/preview.html +40 -0
  160. package/design-system/components/LoadBar/style.css +17 -0
  161. package/design-system/components/MarketingNav/README.md +76 -42
  162. package/design-system/components/MarketingNav/preview.html +37 -8
  163. package/design-system/components/MarketingNav/style.css +45 -0
  164. package/design-system/components/Matrix/README.md +129 -0
  165. package/design-system/components/Matrix/preview.html +99 -0
  166. package/design-system/components/Matrix/style.css +84 -0
  167. package/design-system/components/Menu/README.md +117 -41
  168. package/design-system/components/Menu/preview.html +85 -23
  169. package/design-system/components/Menu/style.css +61 -0
  170. package/design-system/components/Meter/README.md +39 -4
  171. package/design-system/components/Meter/preview.html +18 -1
  172. package/design-system/components/Meter/style.css +23 -0
  173. package/design-system/components/MetricTile/README.md +237 -0
  174. package/design-system/components/MetricTile/preview.html +241 -0
  175. package/design-system/components/MetricTile/style.css +129 -0
  176. package/design-system/components/Morph/README.md +106 -0
  177. package/design-system/components/Morph/preview.html +103 -0
  178. package/design-system/components/Morph/style.css +31 -0
  179. package/design-system/components/Motion/README.md +164 -0
  180. package/design-system/components/Motion/preview.html +2537 -0
  181. package/design-system/components/NumberInput/README.md +27 -8
  182. package/design-system/components/NumberInput/preview.html +21 -5
  183. package/design-system/components/NumberInput/style.css +34 -0
  184. package/design-system/components/PaceBar/README.md +75 -0
  185. package/design-system/components/PaceBar/preview.html +67 -0
  186. package/design-system/components/PaceBar/style.css +25 -0
  187. package/design-system/components/Page/README.md +57 -18
  188. package/design-system/components/Page/preview.html +15 -17
  189. package/design-system/components/Page/style.css +7 -0
  190. package/design-system/components/PageBar/README.md +90 -34
  191. package/design-system/components/PageBar/preview.html +60 -19
  192. package/design-system/components/PageBar/style.css +35 -0
  193. package/design-system/components/PageHero/README.md +87 -51
  194. package/design-system/components/PageHero/preview.html +35 -6
  195. package/design-system/components/PageHero/style.css +31 -0
  196. package/design-system/components/Pagination/README.md +70 -49
  197. package/design-system/components/Pagination/preview.html +24 -15
  198. package/design-system/components/Pagination/style.css +12 -0
  199. package/design-system/components/Panel/README.md +109 -51
  200. package/design-system/components/Panel/preview.html +118 -20
  201. package/design-system/components/Panel/style.css +51 -0
  202. package/design-system/components/PasswordInput/README.md +50 -18
  203. package/design-system/components/PasswordInput/preview.html +71 -21
  204. package/design-system/components/PasswordInput/style.css +31 -0
  205. package/design-system/components/Plate/README.md +75 -17
  206. package/design-system/components/Plate/preview.html +40 -7
  207. package/design-system/components/Plate/style.css +37 -0
  208. package/design-system/components/Popover/README.md +70 -49
  209. package/design-system/components/Popover/preview.html +44 -22
  210. package/design-system/components/Popover/style.css +41 -0
  211. package/design-system/components/PricingTable/README.md +69 -49
  212. package/design-system/components/PricingTable/preview.html +21 -21
  213. package/design-system/components/PricingTable/style.css +21 -0
  214. package/design-system/components/ProgressPetals/README.md +31 -3
  215. package/design-system/components/ProgressPetals/preview.html +14 -15
  216. package/design-system/components/ProgressPetals/style.css +27 -0
  217. package/design-system/components/README.md +151 -0
  218. package/design-system/components/Radio/README.md +40 -17
  219. package/design-system/components/Radio/preview.html +16 -1
  220. package/design-system/components/Radio/style.css +21 -0
  221. package/design-system/components/RankBar/README.md +29 -2
  222. package/design-system/components/RankBar/preview.html +14 -12
  223. package/design-system/components/RankBar/style.css +18 -0
  224. package/design-system/components/Ring/README.md +61 -11
  225. package/design-system/components/Ring/preview.html +55 -10
  226. package/design-system/components/Ring/style.css +49 -0
  227. package/design-system/components/ScoreHero/README.md +91 -0
  228. package/design-system/components/ScoreHero/preview.html +104 -0
  229. package/design-system/components/ScoreHero/style.css +32 -0
  230. package/design-system/components/Section/README.md +72 -33
  231. package/design-system/components/Section/preview.html +46 -16
  232. package/design-system/components/Section/style.css +18 -0
  233. package/design-system/components/Segmented/README.md +100 -55
  234. package/design-system/components/Segmented/preview.html +107 -26
  235. package/design-system/components/Segmented/style.css +94 -0
  236. package/design-system/components/SegmentedProgress/README.md +64 -0
  237. package/design-system/components/SegmentedProgress/preview.html +69 -0
  238. package/design-system/components/SegmentedProgress/style.css +11 -0
  239. package/design-system/components/Select/README.md +47 -12
  240. package/design-system/components/Select/preview.html +28 -2
  241. package/design-system/components/Select/style.css +22 -0
  242. package/design-system/components/ShareBar/README.md +69 -0
  243. package/design-system/components/ShareBar/preview.html +72 -0
  244. package/design-system/components/ShareBar/style.css +25 -0
  245. package/design-system/components/SideList/README.md +147 -0
  246. package/design-system/components/SideList/preview.html +139 -0
  247. package/design-system/components/SideList/style.css +94 -0
  248. package/design-system/components/Skeleton/README.md +53 -16
  249. package/design-system/components/Skeleton/preview.html +35 -23
  250. package/design-system/components/Skeleton/style.css +17 -0
  251. package/design-system/components/Slider/README.md +95 -0
  252. package/design-system/components/Slider/preview.html +49 -0
  253. package/design-system/components/Slider/style.css +13 -0
  254. package/design-system/components/Split/README.md +112 -0
  255. package/design-system/components/Split/preview.html +105 -0
  256. package/design-system/components/Split/style.css +30 -0
  257. package/design-system/components/Starter/README.md +21 -9
  258. package/design-system/components/Starter/preview.html +5 -5
  259. package/design-system/components/Stat/README.md +64 -43
  260. package/design-system/components/Stat/preview.html +3 -3
  261. package/design-system/components/Stat/style.css +15 -0
  262. package/design-system/components/StatTiles/README.md +88 -44
  263. package/design-system/components/StatTiles/preview.html +142 -71
  264. package/design-system/components/StatTiles/style.css +64 -0
  265. package/design-system/components/StatusLine/README.md +85 -0
  266. package/design-system/components/StatusLine/preview.html +49 -0
  267. package/design-system/components/StatusLine/style.css +14 -0
  268. package/design-system/components/StatusScreen/README.md +49 -35
  269. package/design-system/components/StatusScreen/preview.html +20 -5
  270. package/design-system/components/StatusScreen/style.css +9 -0
  271. package/design-system/components/StepLine/README.md +97 -0
  272. package/design-system/components/StepLine/preview.html +108 -0
  273. package/design-system/components/StepLine/style.css +62 -0
  274. package/design-system/components/Stepper/README.md +35 -13
  275. package/design-system/components/Stepper/style.css +13 -0
  276. package/design-system/components/StreakCalendar/README.md +22 -1
  277. package/design-system/components/StreakCalendar/preview.html +10 -10
  278. package/design-system/components/StreakCalendar/style.css +12 -0
  279. package/design-system/components/SuggestionChip/README.md +87 -0
  280. package/design-system/components/SuggestionChip/preview.html +42 -0
  281. package/design-system/components/SuggestionChip/style.css +20 -0
  282. package/design-system/components/Switch/README.md +44 -24
  283. package/design-system/components/Switch/preview.html +23 -8
  284. package/design-system/components/Switch/style.css +31 -0
  285. package/design-system/components/Table/README.md +129 -58
  286. package/design-system/components/Table/preview.html +106 -72
  287. package/design-system/components/Table/style.css +104 -0
  288. package/design-system/components/Tabs/README.md +71 -46
  289. package/design-system/components/Tabs/preview.html +56 -24
  290. package/design-system/components/Tabs/style.css +44 -0
  291. package/design-system/components/Testimonial/README.md +48 -32
  292. package/design-system/components/Testimonial/preview.html +14 -14
  293. package/design-system/components/Testimonial/style.css +12 -0
  294. package/design-system/components/TextArea/README.md +27 -11
  295. package/design-system/components/TextArea/preview.html +8 -2
  296. package/design-system/components/TextArea/style.css +12 -0
  297. package/design-system/components/ThemeSwitch/README.md +116 -0
  298. package/design-system/components/ThemeSwitch/preview.html +57 -0
  299. package/design-system/components/ThemeSwitch/style.css +6 -0
  300. package/design-system/components/TickRow/README.md +52 -36
  301. package/design-system/components/TickRow/preview.html +64 -41
  302. package/design-system/components/TickRow/style.css +23 -0
  303. package/design-system/components/TickStrip/README.md +95 -0
  304. package/design-system/components/TickStrip/preview.html +88 -0
  305. package/design-system/components/TickStrip/style.css +42 -0
  306. package/design-system/components/Tile/README.md +79 -18
  307. package/design-system/components/Tile/preview.html +91 -40
  308. package/design-system/components/Tile/style.css +36 -0
  309. package/design-system/components/Timeline/README.md +68 -48
  310. package/design-system/components/Timeline/preview.html +27 -15
  311. package/design-system/components/Timeline/style.css +25 -0
  312. package/design-system/components/Toast/README.md +70 -38
  313. package/design-system/components/Toast/preview.html +43 -8
  314. package/design-system/components/Toast/style.css +25 -0
  315. package/design-system/components/Tooltip/README.md +93 -35
  316. package/design-system/components/Tooltip/preview.html +69 -15
  317. package/design-system/components/Tooltip/style.css +78 -0
  318. package/design-system/components/TopBar/README.md +67 -53
  319. package/design-system/components/TopBar/preview.html +14 -27
  320. package/design-system/components/TopBar/style.css +35 -0
  321. package/design-system/components/TopicRail/README.md +108 -0
  322. package/design-system/components/TopicRail/preview.html +58 -0
  323. package/design-system/components/TopicRail/style.css +48 -0
  324. package/design-system/components/TrendBars/README.md +52 -14
  325. package/design-system/components/TrendBars/preview.html +65 -32
  326. package/design-system/components/TrendBars/style.css +25 -0
  327. package/design-system/components/TrendLine/README.md +164 -0
  328. package/design-system/components/TrendLine/preview.html +373 -0
  329. package/design-system/components/TrendLine/style.css +155 -0
  330. package/design-system/components/Well/README.md +64 -22
  331. package/design-system/components/Well/preview.html +14 -14
  332. package/design-system/components/Well/style.css +22 -0
  333. package/design-system/components/_house.css +324 -0
  334. package/design-system/components/bundle.css +4086 -744
  335. package/design-system/tokens.json +1310 -124
  336. package/dist/fello-core.css +2 -2
  337. package/dist/fello.css +6 -1369
  338. package/dist/fello.scoped.css +7 -0
  339. package/dist/index.d.ts +109 -10
  340. package/dist/index.js +781 -96
  341. package/dist/palettes.d.ts +464 -0
  342. package/dist/palettes.js +497 -0
  343. package/dist/scoped.d.ts +3 -0
  344. package/dist/scoped.js +16 -0
  345. package/dist/toast.d.ts +14 -0
  346. package/dist/toast.js +33 -29
  347. package/dist/tokens.d.ts +1686 -62
  348. package/dist/tokens.js +1668 -61
  349. package/package.json +20 -4
  350. package/scripts/check-palette.mjs +295 -0
  351. package/scripts/token-model.mjs +552 -0
  352. package/tokens/_dark.css +173 -0
  353. package/tokens/_palettes.css +46 -0
  354. package/tokens/_product.css +266 -53
  355. package/tokens/_source.hubl.css +39 -19
  356. package/tokens/design-tokens.json +319 -0
  357. package/tokens/palettes.ts +504 -0
  358. package/tokens/shadcn-compat.css +19 -19
  359. package/tokens/shadcn-compat.hsl.css +76 -0
  360. package/tokens/tokens.css +1287 -62
  361. package/tokens/tokens.md +587 -61
  362. package/tokens/tokens.root.css +1293 -62
  363. package/tokens/tokens.ts +1677 -64
package/dist/index.js CHANGED
@@ -13,10 +13,11 @@ var cn = (...inputs) => twMerge(clsx(inputs));
13
13
  import { jsxs } from "react/jsx-runtime";
14
14
  var buttonVariants = cva(
15
15
  [
16
- "inline-flex items-center justify-center gap-[var(--space-xs)] whitespace-nowrap",
17
- "font-[family-name:var(--font-body)] cursor-pointer appearance-none",
18
- "transition-[background,color,box-shadow,transform,filter] duration-150 ease-out",
19
- "outline-none focus-visible:shadow-[var(--shadow-focus-ring)]",
16
+ "relative inline-flex max-w-full items-center justify-center gap-[var(--space-xs)] text-center text-balance no-underline",
17
+ "font-[family-name:var(--font-body)] font-semibold cursor-pointer appearance-none",
18
+ "motion-safe:transition-[background-color,color,box-shadow,transform,filter] motion-safe:duration-150 motion-safe:ease-out",
19
+ "focus-visible:outline-solid focus-visible:outline-[length:var(--ws-focus-width)] focus-visible:outline-[color:var(--ws-focus-color)] focus-visible:outline-offset-[var(--ws-focus-offset)]",
20
+ "[&_svg]:size-[var(--ws-icon)] [&_svg]:shrink-0",
20
21
  "disabled:opacity-50 disabled:cursor-not-allowed disabled:pointer-events-none",
21
22
  "aria-disabled:opacity-50 aria-disabled:cursor-not-allowed aria-disabled:pointer-events-none"
22
23
  ],
@@ -25,42 +26,57 @@ var buttonVariants = cva(
25
26
  variant: {
26
27
  primary: [
27
28
  "bg-[image:var(--gradient-btn-primary)] text-[color:var(--color-white)]",
28
- "border-0 border-b-[3px] border-b-[var(--color-border-btn)]",
29
+ "border-0 border-b-[length:calc(var(--space-xxs)*0.75)] border-b-[color:var(--color-button-border)]",
29
30
  "hover:brightness-[1.04]",
30
- "active:translate-y-[2px] active:border-b-transparent"
31
+ "active:translate-y-[calc(var(--space-xxs)/2)] active:border-b-transparent"
31
32
  ],
32
33
  secondary: [
33
- "bg-[var(--color-background)] text-[color:var(--color-text-interactive)]",
34
- "border border-[var(--color-border-hairline)] font-semibold",
35
- "hover:bg-[var(--color-nav-hover-bg)]"
34
+ "bg-[color:var(--color-bg-page)] text-[color:var(--color-text-interactive)]",
35
+ "border border-[color:var(--color-border-hairline)]",
36
+ "hover:bg-[image:linear-gradient(var(--color-nav-hover-bg),var(--color-nav-hover-bg))]"
36
37
  ],
37
38
  navy: [
38
- "bg-[linear-gradient(180deg,var(--color-brand-mid-blue),color-mix(in_srgb,var(--color-brand-navy)_35%,var(--color-brand-mid-blue)))]",
39
- "text-[color:var(--color-white)] border-0 border-b-[3px] border-b-[var(--color-brand-navy)]",
40
- "shadow-[var(--shadow-btn)] hover:shadow-[var(--shadow-btn-hover)]",
41
- "active:translate-y-[2px] active:border-b-transparent active:shadow-none"
39
+ "bg-[image:linear-gradient(180deg,var(--color-brand-mid-blue),color-mix(in_srgb,var(--color-brand-navy)_35%,var(--color-brand-mid-blue)))]",
40
+ "text-[color:var(--color-white)] border-0 border-b-[length:calc(var(--space-xxs)*0.75)] border-b-[color:var(--color-brand-navy)]",
41
+ "shadow-[var(--shadow-btn)] hover:shadow-[var(--shadow-btn-hover)] hover:brightness-[1.04]",
42
+ "active:translate-y-[calc(var(--space-xxs)/2)] active:border-b-transparent active:shadow-none"
42
43
  ],
43
44
  tertiary: [
44
- "bg-transparent text-[color:var(--color-brand-navy)]",
45
- "border border-[var(--color-brand-navy)]",
46
- "hover:bg-[var(--color-brand-navy)] hover:text-[color:var(--color-white)]"
45
+ "bg-transparent text-[color:var(--color-text-heading)]",
46
+ "border border-[color:var(--color-text-heading)]",
47
+ "hover:bg-[color:var(--color-text-heading)] hover:text-[color:var(--ws-on-act)]"
47
48
  ],
48
- clean: [
49
- "border-0 bg-transparent text-[color:var(--color-brand-navy)] min-w-0 px-0",
50
- "hover:text-[color:var(--color-brand-salmon)]"
51
- ]
49
+ // Underlines on hover: a salmon word would be 2.7:1, under AA. Its no-sides and no-floor width are a compound
50
+ // variant below: here, tailwind-merge drops them for the size's own padding and min-width, which come later.
51
+ clean: "border-0 bg-transparent text-[color:var(--color-text-heading)] hover:underline"
52
52
  },
53
53
  size: {
54
- // Heights and type are the Figma dimensions table, not a guess.
55
- large: "h-[45px] px-[20px] min-w-[100px] text-[length:var(--font-size-md)] font-semibold rounded-[var(--radius-lg)] leading-none",
56
- medium: "h-[36px] px-[var(--space-md)] min-w-[80px] text-[length:var(--font-size-sm)] font-semibold rounded-[var(--radius-lg)] leading-none",
57
- small: "h-[28px] px-[12px] min-w-[60px] text-[length:var(--font-size-2xs)] font-medium rounded-[var(--radius-md)] leading-none"
54
+ // Heights and type are the Figma dimensions table (45, 36, 28), as floors.
55
+ large: [
56
+ "min-h-[calc(var(--space-2xl)+var(--space-xxs)+var(--ws-line))] min-w-[calc(var(--space-5xl)+var(--space-md)+var(--space-xxs))]",
57
+ "px-[calc(var(--space-md)+var(--space-xxs))] py-[var(--space-xs)] rounded-[var(--ws-radius-card)]",
58
+ "text-[length:var(--font-size-md)] leading-[calc(var(--space-md)+var(--space-xxs))]"
59
+ ],
60
+ medium: [
61
+ "min-h-[calc(var(--space-xl)+var(--space-xxs))] min-w-[var(--space-5xl)]",
62
+ "px-[var(--space-md)] py-[var(--space-xxs-plus)] rounded-[var(--ws-radius-card)]",
63
+ "text-[length:var(--font-size-sm)] leading-[var(--ws-leading-control)]",
64
+ "pointer-coarse:after:absolute pointer-coarse:after:inset-x-0 pointer-coarse:after:inset-y-[min(0px,calc((100%-var(--ws-touch-public))/2))] pointer-coarse:after:content-['']"
65
+ ],
66
+ small: [
67
+ "min-h-[calc(var(--space-lg)+var(--space-xxs))] min-w-[calc(var(--space-3xl)+var(--space-sm))]",
68
+ "px-[var(--space-sm)] py-[var(--space-xxs)] rounded-[var(--ws-radius-row)]",
69
+ "text-[length:var(--font-size-2xs)] leading-[var(--space-md)] font-medium [&_svg]:size-[var(--ws-icon-sm)]",
70
+ "pointer-coarse:after:absolute pointer-coarse:after:inset-x-0 pointer-coarse:after:inset-y-[min(0px,calc((100%-var(--ws-touch-public))/2))] pointer-coarse:after:content-['']"
71
+ ]
58
72
  },
59
73
  /** Elevation. Primary and navy carry their own lift; this adds the stack. */
60
74
  shadow: { true: "", false: "" },
61
75
  fullWidth: { true: "w-full", false: "" }
62
76
  },
63
77
  compoundVariants: [
78
+ // `clean` has no sides and no width floor at any size, as `.ws-kit-button--clean`.
79
+ { variant: "clean", class: "min-w-0 px-0" },
64
80
  {
65
81
  shadow: true,
66
82
  variant: ["primary", "secondary", "navy", "tertiary"],
@@ -92,16 +108,16 @@ import { forwardRef as forwardRef2 } from "react";
92
108
  import { cva as cva2 } from "class-variance-authority";
93
109
  import { jsx } from "react/jsx-runtime";
94
110
  var badgeVariants = cva2(
95
- "inline-flex items-center gap-[var(--space-xxs)] rounded-[var(--radius-full)] px-[10px] py-[2px] text-[length:var(--font-size-2xs)] font-medium leading-[18px] whitespace-nowrap",
111
+ "inline-flex h-[var(--space-lg)] items-center gap-[var(--space-xxs)] rounded-[var(--radius-full)] px-[var(--space-xs-plus)] py-0 text-[length:var(--font-size-2xs)] font-medium leading-[var(--space-md)] whitespace-nowrap",
96
112
  {
97
113
  variants: {
98
114
  tone: {
99
- neutral: "bg-[var(--color-gray-2)] text-[color:var(--color-gray-8)]",
115
+ neutral: "bg-[color:var(--ws-track)] text-[color:var(--color-text-heading)]",
100
116
  brand: "bg-[color-mix(in_srgb,var(--color-brand-salmon)_12%,transparent)] text-[color:var(--color-text-brand-strong)]",
101
- navy: "bg-[color-mix(in_srgb,var(--color-brand-navy)_10%,transparent)] text-[color:var(--color-brand-navy)]",
117
+ navy: "bg-[color-mix(in_srgb,var(--color-text-heading)_10%,transparent)] text-[color:var(--color-text-heading)]",
102
118
  success: "bg-[var(--color-feedback-success-bg)] text-[color:var(--color-text-success-strong)]",
103
119
  error: "bg-[color-mix(in_srgb,var(--color-feedback-error)_14%,transparent)] text-[color:var(--color-text-error-strong)]",
104
- outline: "border border-[var(--color-border-hairline)] text-[color:var(--color-text-body)]"
120
+ outline: "shadow-[inset_0_0_0_var(--ws-line)_var(--color-border-hairline)] text-[color:var(--color-text-body)]"
105
121
  }
106
122
  },
107
123
  defaultVariants: { tone: "neutral" }
@@ -115,15 +131,18 @@ var Badge = forwardRef2(function Badge2({ className, tone, ...props }, ref) {
115
131
  import { forwardRef as forwardRef3 } from "react";
116
132
  import { cva as cva3 } from "class-variance-authority";
117
133
  import { jsx as jsx2 } from "react/jsx-runtime";
118
- var cardVariants = cva3("rounded-[var(--radius-sm)] border", {
134
+ var cardVariants = cva3("min-w-0 rounded-[var(--ws-radius-control)] border", {
119
135
  variants: {
120
136
  surface: {
121
- white: "bg-[var(--color-white)] border-[var(--color-border-default)]",
122
- tinted: "bg-[var(--color-gray-1)] border-[var(--color-border-default)]",
123
- transparent: "bg-transparent border-[var(--color-border-hairline)]"
137
+ white: "bg-[color:var(--color-surface)] border-[color:var(--color-border-default)]",
138
+ tinted: "bg-[color:var(--ws-surface-sunk)] border-[color:var(--color-border-default)]",
139
+ transparent: "bg-transparent border-[color:var(--color-border-hairline)]"
124
140
  },
125
141
  interactive: {
126
- true: "transition-shadow duration-200 hover:shadow-[var(--shadow-card-default)]",
142
+ true: [
143
+ "block cursor-pointer text-[color:inherit] no-underline hover:bg-[image:linear-gradient(var(--color-nav-hover-bg),var(--color-nav-hover-bg))]",
144
+ "focus-visible:outline-solid focus-visible:outline-[length:var(--ws-focus-width)] focus-visible:outline-[color:var(--ws-focus-color)] focus-visible:outline-offset-[var(--ws-focus-offset)]"
145
+ ],
127
146
  false: ""
128
147
  }
129
148
  },
@@ -151,7 +170,7 @@ var CardTitle = forwardRef3(
151
170
  {
152
171
  ref,
153
172
  className: cn(
154
- "text-[length:var(--font-size-2xl)] font-medium leading-[32px] text-[color:var(--color-text-heading)]",
173
+ "text-[length:var(--font-size-2xl)] font-medium leading-[var(--space-xl)] text-[color:var(--color-text-heading)] text-balance wrap-break-word hyphens-auto",
155
174
  className
156
175
  ),
157
176
  ...props
@@ -165,7 +184,7 @@ var CardDescription = forwardRef3(function CardDescription2({ className, ...prop
165
184
  {
166
185
  ref,
167
186
  className: cn(
168
- "text-[length:var(--font-size-sm)] leading-[20px] text-[color:var(--color-text-muted)]",
187
+ "text-[length:var(--font-size-sm)] leading-[calc(var(--space-md)+var(--space-xxs))] text-[color:var(--color-text-muted)]",
169
188
  className
170
189
  ),
171
190
  ...props
@@ -183,7 +202,7 @@ var CardFooter = forwardRef3(
183
202
  "div",
184
203
  {
185
204
  ref,
186
- className: cn("flex items-center gap-[var(--space-sm)] p-[var(--space-lg)] pt-0", className),
205
+ className: cn("flex flex-wrap items-center gap-[var(--space-sm)] p-[var(--space-lg)] pt-0", className),
187
206
  ...props
188
207
  }
189
208
  );
@@ -197,8 +216,8 @@ var Checkbox = forwardRef4(function Checkbox2({ className, label, description, i
197
216
  const generated = useId();
198
217
  const inputId = id ?? generated;
199
218
  const descriptionId = `${inputId}-description`;
200
- return /* @__PURE__ */ jsxs2("div", { className: "flex gap-[var(--space-sm)]", children: [
201
- /* @__PURE__ */ jsxs2("span", { className: "relative mt-[1px] inline-flex h-[18px] w-[18px] shrink-0", children: [
219
+ return /* @__PURE__ */ jsxs2("div", { className: "relative flex gap-[var(--space-xs-plus)]", children: [
220
+ /* @__PURE__ */ jsxs2("span", { className: "relative mt-[var(--ws-line)] inline-flex size-[calc(var(--space-md)+var(--space-3xs))] shrink-0", children: [
202
221
  /* @__PURE__ */ jsx3(
203
222
  "input",
204
223
  {
@@ -209,11 +228,14 @@ var Checkbox = forwardRef4(function Checkbox2({ className, label, description, i
209
228
  "aria-describedby": description ? descriptionId : void 0,
210
229
  className: cn(
211
230
  "peer h-full w-full cursor-pointer appearance-none",
212
- "rounded-[var(--radius-xs)] border border-[var(--color-border-hairline)] bg-[var(--color-white)]",
213
- "transition-[background-color,border-color,box-shadow] duration-150 ease-out",
214
- "hover:border-[var(--color-gray-5)]",
215
- "checked:border-[var(--color-brand-salmon)] checked:bg-[var(--color-brand-salmon)]",
216
- "focus-visible:outline-none focus-visible:shadow-[var(--shadow-focus-ring)]",
231
+ "rounded-[var(--ws-radius-control)] border-0 bg-[color:var(--color-bg-page)]",
232
+ "shadow-[inset_0_0_0_calc(var(--ws-line)*1.5)_var(--color-text-heading)]",
233
+ "aria-[invalid=true]:not-checked:shadow-[inset_0_0_0_calc(var(--ws-line)*1.5)_var(--ws-word-needs)]",
234
+ "motion-safe:transition-[background-color,box-shadow] motion-safe:duration-150 motion-safe:ease-out",
235
+ // Hover washes an empty, enabled box only, where the pointer really hovers: the chosen one stays navy.
236
+ "enabled:not-checked:hover:bg-[image:linear-gradient(var(--ws-hover-strong),var(--ws-hover-strong))]",
237
+ "checked:bg-[color:var(--color-text-heading)] checked:shadow-none",
238
+ "focus-visible:outline-solid focus-visible:outline-[length:var(--ws-focus-width)] focus-visible:outline-[color:var(--ws-focus-color)] focus-visible:outline-offset-[var(--ws-focus-offset)]",
217
239
  "disabled:cursor-not-allowed disabled:opacity-50",
218
240
  className
219
241
  ),
@@ -226,12 +248,12 @@ var Checkbox = forwardRef4(function Checkbox2({ className, label, description, i
226
248
  "aria-hidden": true,
227
249
  viewBox: "0 0 16 16",
228
250
  fill: "none",
229
- className: "pointer-events-none absolute inset-0 h-full w-full scale-90 opacity-0 transition-opacity duration-150 peer-checked:opacity-100",
251
+ className: "pointer-events-none absolute inset-0 m-auto size-[var(--ws-icon-sm)] text-[color:var(--ws-on-act)] opacity-0 motion-safe:transition-opacity motion-safe:duration-150 peer-checked:opacity-100",
230
252
  children: /* @__PURE__ */ jsx3(
231
253
  "path",
232
254
  {
233
255
  d: "M3.5 8.5l3 3 6-6",
234
- stroke: "var(--color-white)",
256
+ stroke: "currentColor",
235
257
  strokeWidth: "2",
236
258
  strokeLinecap: "round",
237
259
  strokeLinejoin: "round"
@@ -246,7 +268,9 @@ var Checkbox = forwardRef4(function Checkbox2({ className, label, description, i
246
268
  {
247
269
  htmlFor: inputId,
248
270
  className: cn(
249
- "block text-[length:var(--font-size-sm)] leading-[20px] text-[color:var(--color-text-heading)]",
271
+ "block text-[length:var(--ws-text-body)] leading-[calc(var(--space-md)+var(--space-xxs))] font-medium text-[color:var(--color-text-heading)]",
272
+ // Touch: the label's hit area covers the whole row, box included, 44px tall (the public floor).
273
+ "pointer-coarse:after:absolute pointer-coarse:after:inset-x-0 pointer-coarse:after:inset-y-[min(0px,calc((100%-var(--ws-touch-public))/2))] pointer-coarse:after:content-['']",
250
274
  disabled ? "cursor-not-allowed opacity-50" : "cursor-pointer"
251
275
  ),
252
276
  children: label
@@ -257,7 +281,7 @@ var Checkbox = forwardRef4(function Checkbox2({ className, label, description, i
257
281
  {
258
282
  id: descriptionId,
259
283
  className: cn(
260
- "m-0 text-[length:var(--font-size-2xs)] leading-[16px] text-[color:var(--color-text-muted)]",
284
+ "m-0 text-[length:var(--font-size-2xs)] leading-[var(--space-md)] text-[color:var(--color-text-muted)]",
261
285
  disabled && "opacity-50"
262
286
  ),
263
287
  children: description
@@ -280,7 +304,7 @@ var Label = forwardRef5(
280
304
  {
281
305
  ref,
282
306
  className: cn(
283
- "text-[length:var(--font-size-2xs)] font-medium leading-[16px] text-[color:var(--color-gray-7)]",
307
+ "text-[length:var(--font-size-2xs)] font-medium leading-[var(--space-md)] text-[color:var(--color-text-body)]",
284
308
  "peer-disabled:cursor-not-allowed peer-disabled:opacity-50",
285
309
  className
286
310
  ),
@@ -297,7 +321,7 @@ var Input = forwardRef6(function Input2({ className, label, error, hint, id, ...
297
321
  const inputId = id ?? generated;
298
322
  const messageId = `${inputId}-message`;
299
323
  const message = error ?? hint;
300
- return /* @__PURE__ */ jsxs3("div", { className: "flex flex-col gap-[var(--space-xxs)]", children: [
324
+ return /* @__PURE__ */ jsxs3("div", { className: "flex min-w-0 flex-col gap-[var(--space-xxs)]", children: [
301
325
  label && /* @__PURE__ */ jsx5(Label, { htmlFor: inputId, children: label }),
302
326
  /* @__PURE__ */ jsx5(
303
327
  "input",
@@ -307,15 +331,16 @@ var Input = forwardRef6(function Input2({ className, label, error, hint, id, ...
307
331
  "aria-invalid": error ? true : void 0,
308
332
  "aria-describedby": message ? messageId : void 0,
309
333
  className: cn(
310
- "h-[40px] w-full rounded-[var(--radius-md)] px-[12px] py-[9px]",
311
- "bg-[var(--color-white)] text-[length:var(--font-size-sm)] text-[color:var(--color-gray-8)]",
312
- "border border-[var(--color-border-default)]",
334
+ "h-[var(--space-2xl)] w-full rounded-[var(--ws-radius-row)] px-[var(--space-sm)] py-0",
335
+ "bg-[color:var(--ws-field)] text-[length:var(--font-size-sm)] text-[color:var(--ws-field-ink)]",
336
+ "border border-[color:var(--color-border-default)]",
313
337
  "placeholder:text-[color:var(--color-text-placeholder)]",
314
- "transition-[border-color,box-shadow] duration-150 ease-out",
315
- "hover:border-[var(--color-gray-5)]",
316
- "outline-none focus-visible:border-[var(--color-brand-salmon)] focus-visible:shadow-[var(--shadow-focus-ring)]",
338
+ "motion-safe:transition-[border-color] motion-safe:duration-150 motion-safe:ease-out",
339
+ "enabled:hover:border-[color:var(--ws-edge-hover)]",
340
+ "focus-visible:outline-solid focus-visible:outline-[length:var(--ws-focus-width)] focus-visible:outline-[color:var(--ws-focus-color)] focus-visible:outline-offset-[var(--ws-focus-offset)]",
341
+ "pointer-coarse:h-[var(--ws-touch-public)] pointer-coarse:text-[length:var(--font-size-md)]",
317
342
  "disabled:cursor-not-allowed disabled:opacity-50",
318
- error && "border-[var(--color-brand-salmon)]",
343
+ error && "border-[color:var(--color-brand-salmon)] enabled:hover:border-[color:var(--color-brand-salmon)]",
319
344
  className
320
345
  ),
321
346
  ...props
@@ -326,7 +351,7 @@ var Input = forwardRef6(function Input2({ className, label, error, hint, id, ...
326
351
  {
327
352
  id: messageId,
328
353
  className: cn(
329
- "text-[length:var(--font-size-2xs)] leading-[16px]",
354
+ "m-0 text-[length:var(--font-size-2xs)] leading-[var(--space-md)]",
330
355
  error ? "text-[color:var(--color-text-error-strong)]" : "text-[color:var(--color-text-muted)]"
331
356
  ),
332
357
  children: message
@@ -347,8 +372,8 @@ var Radio = forwardRef7(function Radio2({ className, label, description, id, dis
347
372
  const isDisabled = disabled ?? group?.disabled;
348
373
  const resolvedName = name ?? group?.name;
349
374
  const resolvedChecked = checked ?? (group && value !== void 0 ? group.value === value : void 0);
350
- return /* @__PURE__ */ jsxs4("div", { className: "flex gap-[var(--space-sm)]", children: [
351
- /* @__PURE__ */ jsxs4("span", { className: "relative mt-[1px] inline-flex h-[18px] w-[18px] shrink-0", children: [
375
+ return /* @__PURE__ */ jsxs4("div", { className: "relative flex gap-[var(--space-sm)]", children: [
376
+ /* @__PURE__ */ jsxs4("span", { className: "relative mt-[var(--ws-line)] inline-flex size-[calc(var(--space-md)+var(--space-3xs))] shrink-0", children: [
352
377
  /* @__PURE__ */ jsx6(
353
378
  "input",
354
379
  {
@@ -366,11 +391,12 @@ var Radio = forwardRef7(function Radio2({ className, label, description, id, dis
366
391
  },
367
392
  className: cn(
368
393
  "peer h-full w-full cursor-pointer appearance-none",
369
- "rounded-[var(--radius-full)] border border-[var(--color-border-hairline)] bg-[var(--color-white)]",
370
- "transition-[border-color,box-shadow] duration-150 ease-out",
371
- "hover:border-[var(--color-gray-5)]",
372
- "checked:border-[var(--color-brand-salmon)]",
373
- "focus-visible:outline-none focus-visible:shadow-[var(--shadow-focus-ring)]",
394
+ "rounded-[var(--radius-full)] border border-[color:var(--ws-edge-card)] bg-[color:var(--ws-field)]",
395
+ "motion-safe:transition-[border-color] motion-safe:duration-150 motion-safe:ease-out",
396
+ // Hover firms an empty, enabled box only: the chosen one keeps its navy edge under the pointer.
397
+ "enabled:not-checked:hover:border-[color:var(--ws-edge-hover)]",
398
+ "checked:border-[color:var(--color-text-heading)]",
399
+ "focus-visible:outline-solid focus-visible:outline-[length:var(--ws-focus-width)] focus-visible:outline-[color:var(--ws-focus-color)] focus-visible:outline-offset-[var(--ws-focus-offset)]",
374
400
  "disabled:cursor-not-allowed disabled:opacity-50",
375
401
  className
376
402
  ),
@@ -381,7 +407,7 @@ var Radio = forwardRef7(function Radio2({ className, label, description, id, dis
381
407
  "span",
382
408
  {
383
409
  "aria-hidden": true,
384
- className: "pointer-events-none absolute left-1/2 top-1/2 h-[8px] w-[8px] -translate-x-1/2 -translate-y-1/2 scale-50 rounded-[var(--radius-full)] bg-[var(--color-brand-salmon)] opacity-0 transition-[opacity,transform] duration-150 peer-checked:scale-100 peer-checked:opacity-100"
410
+ className: "pointer-events-none absolute left-1/2 top-1/2 size-[var(--space-xs)] -translate-x-1/2 -translate-y-1/2 scale-50 rounded-[var(--radius-full)] bg-[color:var(--color-text-heading)] opacity-0 motion-safe:transition-[opacity,transform] motion-safe:duration-150 peer-checked:scale-100 peer-checked:opacity-100"
385
411
  }
386
412
  )
387
413
  ] }),
@@ -391,7 +417,9 @@ var Radio = forwardRef7(function Radio2({ className, label, description, id, dis
391
417
  {
392
418
  htmlFor: inputId,
393
419
  className: cn(
394
- "block text-[length:var(--font-size-sm)] leading-[20px] text-[color:var(--color-text-heading)]",
420
+ "block text-[length:var(--font-size-sm)] leading-[calc(var(--space-md)+var(--space-xxs))] text-[color:var(--color-text-heading)]",
421
+ // Touch: the label's hit area covers the whole row, box included, 44px tall (the public floor).
422
+ "pointer-coarse:after:absolute pointer-coarse:after:inset-x-0 pointer-coarse:after:inset-y-[min(0px,calc((100%-var(--ws-touch-public))/2))] pointer-coarse:after:content-['']",
395
423
  isDisabled ? "cursor-not-allowed opacity-50" : "cursor-pointer"
396
424
  ),
397
425
  children: label
@@ -402,7 +430,7 @@ var Radio = forwardRef7(function Radio2({ className, label, description, id, dis
402
430
  {
403
431
  id: descriptionId,
404
432
  className: cn(
405
- "m-0 text-[length:var(--font-size-2xs)] leading-[16px] text-[color:var(--color-text-muted)]",
433
+ "m-0 text-[length:var(--font-size-2xs)] leading-[var(--space-md)] text-[color:var(--color-text-muted)]",
406
434
  isDisabled && "opacity-50"
407
435
  ),
408
436
  children: description
@@ -420,8 +448,8 @@ var RadioGroup = forwardRef7(function RadioGroup2({ className, name, legend, val
420
448
  disabled,
421
449
  ...props,
422
450
  children: [
423
- legend && /* @__PURE__ */ jsx6("legend", { className: "mb-[var(--space-sm)] p-0 text-[length:var(--font-size-2xs)] font-medium leading-[16px] text-[color:var(--color-gray-7)]", children: legend }),
424
- /* @__PURE__ */ jsx6("div", { className: "flex flex-col gap-[var(--space-sm)]", children })
451
+ legend && /* @__PURE__ */ jsx6("legend", { className: "mb-[var(--space-sm)] p-0 text-[length:var(--font-size-2xs)] font-medium leading-[var(--space-md)] text-[color:var(--color-text-body)]", children: legend }),
452
+ /* @__PURE__ */ jsx6("div", { className: "flex flex-col gap-[var(--space-sm)] pointer-coarse:gap-[var(--space-lg)]", children })
425
453
  ]
426
454
  }
427
455
  ) });
@@ -444,8 +472,8 @@ var TabsList = forwardRef8(function TabsList2({ className, ...props }, ref) {
444
472
  {
445
473
  ref,
446
474
  className: cn(
447
- "flex items-center",
448
- variant === "underline" ? "gap-[var(--space-lg)] border-b border-[var(--color-border-default)]" : "gap-[2px] rounded-[var(--radius-full)] bg-[var(--color-gray-1)] p-[3px]",
475
+ "items-center",
476
+ variant === "underline" ? "flex gap-[var(--space-md)] overflow-x-auto [scrollbar-width:none] [&::-webkit-scrollbar]:hidden shadow-[inset_0_calc(var(--ws-line)*-1)_0_var(--ws-edge-slot)]" : "inline-flex max-w-full gap-[var(--space-3xs)] rounded-[var(--radius-full)] bg-[color:var(--ws-surface-sunk)] p-[var(--ws-halo)]",
449
477
  className
450
478
  ),
451
479
  ...props
@@ -459,23 +487,31 @@ var TabsTrigger = forwardRef8(function TabsTrigger2({ className, ...props }, ref
459
487
  {
460
488
  ref,
461
489
  className: cn(
462
- "cursor-pointer whitespace-nowrap border-0 bg-transparent font-medium",
463
- "text-[length:var(--font-size-sm)] text-[color:var(--color-text-muted)]",
464
- "transition-[color,background-color,border-color] duration-150 ease-out",
490
+ "inline-flex shrink-0 cursor-pointer items-center whitespace-nowrap border-0 bg-transparent font-medium",
491
+ "text-[length:var(--font-size-sm)] text-[color:var(--color-text-body)]",
492
+ "motion-safe:transition-[color,background-color,border-color] motion-safe:duration-150 motion-safe:ease-out",
465
493
  "hover:text-[color:var(--color-text-heading)]",
466
- "focus-visible:outline-none focus-visible:shadow-[var(--shadow-focus-ring)]",
494
+ "focus-visible:outline-solid focus-visible:outline-[length:var(--ws-focus-width)] focus-visible:outline-[color:var(--ws-focus-color)] focus-visible:outline-offset-[calc(var(--ws-focus-width)*-1)]",
495
+ "pointer-coarse:min-h-[var(--ws-touch-public)]",
467
496
  "disabled:cursor-not-allowed disabled:opacity-50",
468
497
  variant === "underline" ? [
469
498
  // The transparent border is load-bearing: it reserves the 2px so
470
- // selecting a tab does not shift the row by two pixels.
471
- "border-b-2 border-b-transparent px-0 pb-[10px] -mb-px",
472
- "data-[state=active]:border-b-[var(--color-brand-salmon)]",
499
+ // selecting a tab does not shift the row by two pixels. It sits
500
+ // over the list's hairline (an inset shadow, not a border, so the
501
+ // rule stays inside the scroller and is not clipped). The 4px
502
+ // sides hold the inset focus ring off the words, as .ws-tabs__tab.
503
+ "border-b-[length:var(--ws-ring)] border-b-transparent px-[var(--space-xxs)] pb-[var(--space-xs-plus)]",
504
+ "data-[state=active]:border-b-[color:var(--color-text-heading)]",
473
505
  "data-[state=active]:text-[color:var(--color-text-heading)]"
474
506
  ] : [
475
- "rounded-[var(--radius-full)] px-[14px] py-[6px]",
476
- "data-[state=active]:bg-[var(--color-white)]",
477
- "data-[state=active]:text-[color:var(--color-text-heading)]",
478
- "data-[state=active]:shadow-[var(--shadow-card-default)]"
507
+ "rounded-[var(--radius-full)] px-[var(--space-sm-plus)] py-[var(--space-xxs-plus)]",
508
+ // The chosen tab is the navy thumb with the act's word, as `.ws-segmented__item`: a white thumb was
509
+ // the surface on the sunk track, 1.05:1 in dark, with a shadow that does not show there.
510
+ "data-[state=active]:bg-[color:var(--color-text-heading)]",
511
+ "data-[state=active]:text-[color:var(--ws-on-act)]",
512
+ // The focused tab is the chosen one (Radix moves both together), so the ring stands 2px off the navy
513
+ // thumb instead of inside it, where it would be navy on navy. A pill set does not scroll, so nothing clips it.
514
+ "focus-visible:outline-offset-[var(--ws-focus-offset)]"
479
515
  ],
480
516
  className
481
517
  ),
@@ -489,7 +525,7 @@ var TabsContent = forwardRef8(function TabsContent2({ className, ...props }, ref
489
525
  {
490
526
  ref,
491
527
  className: cn(
492
- "mt-[var(--space-lg)] focus-visible:outline-none focus-visible:shadow-[var(--shadow-focus-ring)]",
528
+ "mt-[var(--space-lg)] focus-visible:outline-solid focus-visible:outline-[length:var(--ws-focus-width)] focus-visible:outline-[color:var(--ws-focus-color)] focus-visible:outline-offset-[var(--ws-focus-offset)]",
493
529
  className
494
530
  ),
495
531
  ...props
@@ -505,7 +541,7 @@ function Skeleton({ className, ...props }) {
505
541
  {
506
542
  "aria-hidden": true,
507
543
  className: cn(
508
- "animate-pulse rounded-[var(--radius-md)] bg-[var(--color-gray-2)] motion-reduce:animate-none",
544
+ "ws-shimmer rounded-[var(--ws-radius-control)] bg-[image:var(--ws-shimmer)] bg-[length:300%_100%]",
509
545
  className
510
546
  ),
511
547
  ...props
@@ -519,22 +555,666 @@ function Stat({ label, value, note, tone = "default", pending = false, className
519
555
  const toneColor = {
520
556
  default: "text-[color:var(--color-text-heading)]",
521
557
  positive: "text-[color:var(--color-stat-positive)]",
522
- brand: "text-[color:var(--color-brand-salmon)]",
558
+ brand: "text-[color:var(--color-text-brand-strong)]",
523
559
  muted: "text-[color:var(--color-text-muted)]"
524
560
  }[tone];
525
561
  return /* @__PURE__ */ jsxs5("div", { className: cn("min-w-0", className), children: [
526
- /* @__PURE__ */ jsx9("div", { className: "text-[length:var(--font-size-3xs)] font-semibold uppercase tracking-[var(--letter-spacing-overline)] text-[color:var(--color-text-muted)]", children: label }),
527
- /* @__PURE__ */ jsx9("div", { className: cn("mt-[var(--space-xxs)] text-[length:var(--font-size-2xl)] font-semibold leading-[1.05] tabular-nums", toneColor), children: pending ? /* @__PURE__ */ jsx9("span", { className: "block h-[29px] w-20 animate-pulse rounded-[var(--radius-md)] bg-[var(--color-gray-2)] motion-reduce:animate-none", children: /* @__PURE__ */ jsx9("span", { className: "sr-only", children: "Loading" }) }) : value === null ? (
528
- // Real text, not an aria-label: a screen reader should hear the same
529
- // "no data" the sighted reader sees.
530
- /* @__PURE__ */ jsxs5("span", { className: "text-[color:var(--color-gray-5)]", children: [
531
- /* @__PURE__ */ jsx9("span", { "aria-hidden": true, children: "\u2013" }),
532
- /* @__PURE__ */ jsx9("span", { className: "sr-only", children: "No data" })
533
- ] })
534
- ) : value }),
535
- note && /* @__PURE__ */ jsx9("div", { className: "mt-[var(--space-xxs)] text-[length:var(--font-size-2xs)] leading-[16px] text-[color:var(--color-text-muted)]", children: note })
562
+ /* @__PURE__ */ jsx9("div", { className: "text-[length:var(--font-size-2xs)] leading-[var(--space-md)] font-semibold uppercase tracking-[var(--letter-spacing-overline)] text-[color:var(--color-text-muted)]", children: label }),
563
+ /* @__PURE__ */ jsx9(
564
+ "div",
565
+ {
566
+ className: cn(
567
+ "mt-[var(--space-xxs)] text-[length:var(--ws-text-figure-row)] leading-[var(--ws-leading-figure-row)] font-semibold tabular-nums",
568
+ toneColor
569
+ ),
570
+ "aria-busy": pending || void 0,
571
+ children: pending ? /* @__PURE__ */ jsx9("span", { className: "ws-shimmer block h-[var(--ws-leading-figure-row)] w-[var(--space-5xl)] rounded-[var(--ws-radius-row)] bg-[image:var(--ws-shimmer)] bg-[length:300%_100%]", children: /* @__PURE__ */ jsx9("span", { className: "sr-only", children: "Loading" }) }) : value === null ? (
572
+ // Real text, not an aria-label: a screen reader should hear the same
573
+ // "no data" the sighted reader sees.
574
+ /* @__PURE__ */ jsxs5("span", { className: "text-[color:var(--color-text-muted)]", children: [
575
+ /* @__PURE__ */ jsx9("span", { "aria-hidden": true, children: "\u2013" }),
576
+ /* @__PURE__ */ jsx9("span", { className: "sr-only", children: "No data" })
577
+ ] })
578
+ ) : value
579
+ }
580
+ ),
581
+ note && /* @__PURE__ */ jsx9("div", { className: "mt-[var(--space-xxs)] text-[length:var(--font-size-2xs)] leading-[var(--space-md)] text-[color:var(--color-text-muted)]", children: note })
536
582
  ] });
537
583
  }
584
+
585
+ // src/lib/motion.ts
586
+ var reduced = () => typeof matchMedia === "function" && matchMedia("(prefers-reduced-motion: reduce)").matches;
587
+ var last = 0;
588
+ var lifted = /* @__PURE__ */ new WeakMap();
589
+ var FOCUSABLE = 'button:not([disabled]), [href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), summary, [tabindex]:not([tabindex="-1"])';
590
+ function place(el, close) {
591
+ const was = lifted.get(el);
592
+ if (was) {
593
+ lifted.delete(el);
594
+ el.removeEventListener("keydown", was.onKey);
595
+ if (el.matches(":popover-open")) el.hidePopover();
596
+ el.removeAttribute("popover");
597
+ delete el.dataset.wsLifted;
598
+ }
599
+ if (getComputedStyle(el).position === "fixed" && typeof el.showPopover === "function") {
600
+ const onKey = (e) => {
601
+ if (e.key !== "Escape" || e.defaultPrevented || el.querySelector(":popover-open, dialog[open]")) return;
602
+ e.preventDefault();
603
+ void morph(close, { as: "full", el, close });
604
+ };
605
+ el.dataset.wsLifted = "";
606
+ el.popover = "manual";
607
+ el.showPopover();
608
+ el.addEventListener("keydown", onKey);
609
+ lifted.set(el, { opener: was ? was.opener : document.activeElement, onKey });
610
+ if (!el.contains(document.activeElement)) {
611
+ const to = el.querySelector("[autofocus]") ?? el.querySelector(FOCUSABLE) ?? el;
612
+ if (to === el && !el.hasAttribute("tabindex")) el.tabIndex = -1;
613
+ to.focus({ preventScroll: true });
614
+ }
615
+ } else if (was) {
616
+ const opener = was.opener, here = document.activeElement;
617
+ if (opener?.isConnected && opener !== here && (!here || here === document.body || el.contains(here))) opener.focus({ preventScroll: true });
618
+ }
619
+ }
620
+ function morph(update, { as = "full", el, close } = {}) {
621
+ const run = as === "full" && el ? async () => {
622
+ await update();
623
+ place(el, close ?? update);
624
+ } : update;
625
+ if (typeof document === "undefined" || !("startViewTransition" in document) || reduced()) {
626
+ try {
627
+ return Promise.resolve(run()).then(() => {
628
+ });
629
+ } catch (error) {
630
+ return Promise.reject(error);
631
+ }
632
+ }
633
+ const root = document.documentElement;
634
+ const id = ++last;
635
+ if (el) {
636
+ const s = getComputedStyle(el);
637
+ root.style.setProperty("--ws-morph-ground", s.backgroundColor);
638
+ root.style.setProperty("--ws-morph-radius", s.borderRadius);
639
+ root.style.setProperty("--ws-morph-backdrop", s.backdropFilter || "none");
640
+ el.style.viewTransitionName = "ws-morph";
641
+ }
642
+ root.dataset.wsMorph = as;
643
+ const move = document.startViewTransition(run);
644
+ move.ready.catch(() => {
645
+ });
646
+ return move.finished.finally(() => {
647
+ if (el) el.style.viewTransitionName = "";
648
+ if (id !== last) return;
649
+ delete root.dataset.wsMorph;
650
+ for (const p of ["--ws-morph-ground", "--ws-morph-radius", "--ws-morph-backdrop"]) root.style.removeProperty(p);
651
+ });
652
+ }
653
+ function rollPlaceholder(roll, every = 3400) {
654
+ const lines = [...roll.children];
655
+ let at = 0;
656
+ lines[0]?.setAttribute("data-on", "");
657
+ if (lines.length < 2 || reduced()) return () => {
658
+ };
659
+ const timer = setInterval(() => {
660
+ const was = lines[at];
661
+ at = (at + 1) % lines.length;
662
+ const next = lines[at];
663
+ for (const l of lines) l.removeAttribute("data-off");
664
+ next.removeAttribute("data-on");
665
+ void next.offsetWidth;
666
+ was.removeAttribute("data-on");
667
+ was.setAttribute("data-off", "");
668
+ next.setAttribute("data-on", "");
669
+ }, every);
670
+ return () => clearInterval(timer);
671
+ }
672
+
673
+ // src/lib/reorder.ts
674
+ var ROWS = ".ws-kanban-board__card, .ws-list-detail__rows > li, .ws-side-list__picks > li";
675
+ function spring() {
676
+ const s = getComputedStyle(document.documentElement);
677
+ const easing = s.getPropertyValue("--ws-spring-reorder").trim(), duration = parseFloat(s.getPropertyValue("--ws-spring-reorder-duration"));
678
+ return easing && duration > 0 ? { duration, easing } : null;
679
+ }
680
+ var ids = /* @__PURE__ */ new WeakMap();
681
+ var count = 0;
682
+ function inView(el) {
683
+ const r = el.getBoundingClientRect();
684
+ if (r.bottom < 0 || r.right < 0 || r.top > innerHeight || r.left > innerWidth) return false;
685
+ for (let p = el.parentElement; p; p = p.parentElement) {
686
+ const s = getComputedStyle(p);
687
+ if (s.overflowX === "visible" && s.overflowY === "visible") continue;
688
+ const c = p.getBoundingClientRect(), top = c.top + p.clientTop, left = c.left + p.clientLeft;
689
+ if (r.top < top - 1 || r.left < left - 1 || r.bottom > top + p.clientHeight + 1 || r.right > left + p.clientWidth + 1) return false;
690
+ }
691
+ return true;
692
+ }
693
+ function reorder(update, within = document, rows = ROWS) {
694
+ const d = typeof document === "undefined" ? null : document;
695
+ if (!d?.startViewTransition || matchMedia("(prefers-reduced-motion: reduce)").matches) return Promise.resolve(update()).then(() => {
696
+ });
697
+ const kept = /* @__PURE__ */ new Map(), from = /* @__PURE__ */ new Map(), raised = [];
698
+ const name = (after) => within.querySelectorAll(rows).forEach((el) => {
699
+ if (!kept.has(el)) kept.set(el, el.style.viewTransitionName);
700
+ if (!ids.has(el)) ids.set(el, `ws-row-${el.dataset.key || el.id || `auto-${++count}`}`);
701
+ const id = CSS.escape(ids.get(el));
702
+ el.style.viewTransitionName = inView(el) ? id : kept.get(el);
703
+ if (!after) from.set(id, el.parentElement);
704
+ else if (from.has(id) && from.get(id) !== el.parentElement) raised.push(id);
705
+ });
706
+ name(false);
707
+ const t = d.startViewTransition(async () => {
708
+ await update();
709
+ name(true);
710
+ });
711
+ t.ready.then(() => {
712
+ const timing = spring();
713
+ for (const a of d.getAnimations()) {
714
+ const fx = a.effect;
715
+ if (timing && fx?.pseudoElement?.startsWith("::view-transition-group(") && fx.pseudoElement !== "::view-transition-group(root)") fx.updateTiming(timing);
716
+ }
717
+ for (const id of raised) d.documentElement.animate({ zIndex: [1, 1] }, { duration: timing?.duration ?? 250, pseudoElement: `::view-transition-group(${id})` });
718
+ }, () => {
719
+ });
720
+ const restore = () => kept.forEach((v, el) => {
721
+ el.style.viewTransitionName = v;
722
+ });
723
+ t.finished.then(restore, restore);
724
+ return t.updateCallbackDone;
725
+ }
726
+
727
+ // tokens/palettes.ts
728
+ var contract = [
729
+ {
730
+ "name": "--color-bg-page",
731
+ "group": "ground",
732
+ "meaning": "The page and every card's surface: the cream most words sit on."
733
+ },
734
+ {
735
+ "name": "--ws-frame-top",
736
+ "group": "ground",
737
+ "meaning": "The top of the page wash behind a glass stage, fading into the page by 640 px; in dark the frame is flat and paints it (the shell, unless a palette says)."
738
+ },
739
+ {
740
+ "name": "--ws-stage-foot",
741
+ "group": "ground",
742
+ "meaning": "The foot of a washed stage, whose gradient starts at the page (light only)."
743
+ },
744
+ {
745
+ "name": "--color-surface",
746
+ "group": "ground",
747
+ "meaning": "What is white: a marketing card, a well row under the pointer, a chat bubble, the glass of the stage."
748
+ },
749
+ {
750
+ "name": "--ws-raised",
751
+ "group": "ground",
752
+ "meaning": "What floats off the page: a menu, a popover, a tooltip, a dialog, a panel, a toast."
753
+ },
754
+ {
755
+ "name": "--ws-tray",
756
+ "group": "ground",
757
+ "meaning": "The rim and foot of a rimmed card, and the well behind rows."
758
+ },
759
+ {
760
+ "name": "--ws-edge-card",
761
+ "group": "edge",
762
+ "meaning": "A card's and an outlined control's 0.5 px edge."
763
+ },
764
+ {
765
+ "name": "--ws-edge",
766
+ "group": "edge",
767
+ "meaning": "A divider between rows; a quiet line."
768
+ },
769
+ {
770
+ "name": "--ws-edge-hover",
771
+ "group": "edge",
772
+ "meaning": "An outlined control's edge under the pointer."
773
+ },
774
+ {
775
+ "name": "--ws-well-hover",
776
+ "group": "edge",
777
+ "meaning": "A rimmed card's rim under the pointer."
778
+ },
779
+ {
780
+ "name": "--color-text-heading",
781
+ "group": "word",
782
+ "meaning": "Titles, names, figures, navy marks, and the act fill (the primary button, a thumb, a checked box)."
783
+ },
784
+ {
785
+ "name": "--color-text-body",
786
+ "group": "word",
787
+ "meaning": "Body words: a card's line, a row."
788
+ },
789
+ {
790
+ "name": "--color-text-muted",
791
+ "group": "word",
792
+ "meaning": "Meta, labels, captions."
793
+ },
794
+ {
795
+ "name": "--color-text-interactive",
796
+ "group": "word",
797
+ "meaning": 'Links and words that go somewhere, a falling number, "working".'
798
+ },
799
+ {
800
+ "name": "--ws-on-act",
801
+ "group": "act",
802
+ "meaning": "Words and marks on the act fill."
803
+ },
804
+ {
805
+ "name": "--ws-act-hover",
806
+ "group": "act",
807
+ "meaning": "The act fill under the pointer."
808
+ },
809
+ {
810
+ "name": "--ws-word-needs",
811
+ "group": "accent",
812
+ "meaning": "Needs you, in words: the current page, something to fix (the accent's AA step)."
813
+ },
814
+ {
815
+ "name": "--ws-focus-color",
816
+ "group": "focus",
817
+ "meaning": "The 2 px focus ring, outside or inset."
818
+ },
819
+ {
820
+ "name": "--ws-word-positive",
821
+ "group": "status",
822
+ "meaning": "Good news in words."
823
+ },
824
+ {
825
+ "name": "--ws-word-alert",
826
+ "group": "status",
827
+ "meaning": "Something wrong now, in words."
828
+ },
829
+ {
830
+ "name": "--ws-chart-finished",
831
+ "group": "chart",
832
+ "meaning": "Tone 1: done, passed, positive marks."
833
+ },
834
+ {
835
+ "name": "--ws-chart-past-half",
836
+ "group": "chart",
837
+ "meaning": "Tone 2: past halfway marks."
838
+ },
839
+ {
840
+ "name": "--ws-chart-under-half",
841
+ "group": "chart",
842
+ "meaning": "Tone 3: under halfway marks and needs-you dots."
843
+ },
844
+ {
845
+ "name": "--ws-chart-navy-light",
846
+ "group": "chart",
847
+ "meaning": "Tone 4: a second navy, for a series beside the heading navy."
848
+ },
849
+ {
850
+ "name": "--ws-chart-needs-work",
851
+ "group": "chart",
852
+ "meaning": "Tone 5: needs work marks."
853
+ },
854
+ {
855
+ "name": "--ws-chart-alert",
856
+ "group": "chart",
857
+ "meaning": "Tone 6: alert marks."
858
+ },
859
+ {
860
+ "name": "--ws-rating-strong",
861
+ "group": "rating",
862
+ "meaning": "Strong: its marks."
863
+ },
864
+ {
865
+ "name": "--ws-rating-middle",
866
+ "group": "rating",
867
+ "meaning": "Getting there (the middle band): its marks."
868
+ },
869
+ {
870
+ "name": "--ws-rating-needs-work",
871
+ "group": "rating",
872
+ "meaning": "Needs work: its marks."
873
+ },
874
+ {
875
+ "name": "--ws-agent-coach",
876
+ "group": "agent",
877
+ "meaning": "The coaching assistant's mark."
878
+ },
879
+ {
880
+ "name": "--ws-agent-growth",
881
+ "group": "agent",
882
+ "meaning": "The growth assistant's mark."
883
+ },
884
+ {
885
+ "name": "--ws-agent-recruit",
886
+ "group": "agent",
887
+ "meaning": "The recruiting assistant's mark."
888
+ },
889
+ {
890
+ "name": "--ws-agent-tally",
891
+ "group": "agent",
892
+ "meaning": "The money assistant's mark, and a softer act (a figure tab's current cell, a seat meter, a hatch)."
893
+ }
894
+ ];
895
+ var palettes = {
896
+ "default": {
897
+ "light": {
898
+ "--color-bg-page": "#fefbf9",
899
+ "--ws-frame-top": "#ebf0f5",
900
+ "--ws-stage-foot": "#fef9f6",
901
+ "--color-surface": "#ffffff",
902
+ "--ws-raised": "#fefbf9",
903
+ "--ws-tray": "#ededed",
904
+ "--ws-edge-card": "#d3d3d3",
905
+ "--ws-edge": "#e8e8e8",
906
+ "--ws-edge-hover": "#aaa49d",
907
+ "--ws-well-hover": "#e4e2df",
908
+ "--color-text-heading": "#093555",
909
+ "--color-text-body": "#545454",
910
+ "--color-text-muted": "#666666",
911
+ "--color-text-interactive": "#495883",
912
+ "--ws-on-act": "#ffffff",
913
+ "--ws-act-hover": "#0f4a73",
914
+ "--ws-word-needs": "#a84b3c",
915
+ "--ws-focus-color": "#093555",
916
+ "--ws-word-positive": "#09717a",
917
+ "--ws-word-alert": "#b1042f",
918
+ "--ws-chart-finished": "#098486",
919
+ "--ws-chart-past-half": "#6d4fc2",
920
+ "--ws-chart-under-half": "#ff725c",
921
+ "--ws-chart-navy-light": "#2e6088",
922
+ "--ws-chart-needs-work": "#f370a4",
923
+ "--ws-chart-alert": "#b1042f",
924
+ "--ws-rating-strong": "#098486",
925
+ "--ws-rating-middle": "#495883",
926
+ "--ws-rating-needs-work": "#f370a4",
927
+ "--ws-agent-coach": "#098486",
928
+ "--ws-agent-growth": "#6d4fc2",
929
+ "--ws-agent-recruit": "#ff725c",
930
+ "--ws-agent-tally": "#2c4870"
931
+ },
932
+ "dark": {
933
+ "--color-bg-page": "#0f1922",
934
+ "--ws-frame-top": "#0a1118",
935
+ "--ws-stage-foot": "#0f1922",
936
+ "--color-surface": "#131e28",
937
+ "--ws-raised": "#16222d",
938
+ "--ws-tray": "#1e2b38",
939
+ "--ws-edge-card": "#273544",
940
+ "--ws-edge": "#1e2a36",
941
+ "--ws-edge-hover": "#8494a5",
942
+ "--ws-well-hover": "#273544",
943
+ "--color-text-heading": "#e8edf3",
944
+ "--color-text-body": "#b0bbc7",
945
+ "--color-text-muted": "#8494a5",
946
+ "--color-text-interactive": "#93a6dc",
947
+ "--ws-on-act": "#0f1922",
948
+ "--ws-act-hover": "#d7dce2",
949
+ "--ws-word-needs": "#ff8b78",
950
+ "--ws-focus-color": "#e8edf3",
951
+ "--ws-word-positive": "#4fc7be",
952
+ "--ws-word-alert": "#ff5470",
953
+ "--ws-chart-finished": "#23a8a3",
954
+ "--ws-chart-past-half": "#9a84ee",
955
+ "--ws-chart-under-half": "#ff725c",
956
+ "--ws-chart-navy-light": "#6e9cc4",
957
+ "--ws-chart-needs-work": "#f370a4",
958
+ "--ws-chart-alert": "#ff5470",
959
+ "--ws-rating-strong": "#3bb8b2",
960
+ "--ws-rating-middle": "#93a6dc",
961
+ "--ws-rating-needs-work": "#f370a4",
962
+ "--ws-agent-coach": "#3bb8b2",
963
+ "--ws-agent-growth": "#9a84ee",
964
+ "--ws-agent-recruit": "#ff725c",
965
+ "--ws-agent-tally": "#e8edf3"
966
+ },
967
+ "navy": {
968
+ "--color-bg-page": "#021a32",
969
+ "--ws-frame-top": "#021a32",
970
+ "--ws-stage-foot": "#021a32",
971
+ "--color-surface": "#0f253c",
972
+ "--ws-raised": "#162c42",
973
+ "--ws-tray": "#2a3f53",
974
+ "--ws-edge-card": "rgba(255, 255, 255, 0.18)",
975
+ "--ws-edge": "rgba(255, 255, 255, 0.1)",
976
+ "--ws-edge-hover": "#a9a9a9",
977
+ "--ws-well-hover": "#273544",
978
+ "--color-text-heading": "#ffffff",
979
+ "--color-text-body": "#d3d3d3",
980
+ "--color-text-muted": "#a9a9a9",
981
+ "--color-text-interactive": "#93a6dc",
982
+ "--ws-on-act": "#021a32",
983
+ "--ws-act-hover": "#ebedef",
984
+ "--ws-word-needs": "#ff8b78",
985
+ "--ws-focus-color": "#ffffff",
986
+ "--ws-word-positive": "#4fc7be",
987
+ "--ws-word-alert": "#ff8282",
988
+ "--ws-chart-finished": "#23a8a3",
989
+ "--ws-chart-past-half": "#9a84ee",
990
+ "--ws-chart-under-half": "#ff725c",
991
+ "--ws-chart-navy-light": "#6e9cc4",
992
+ "--ws-chart-needs-work": "#f370a4",
993
+ "--ws-chart-alert": "#ff5470",
994
+ "--ws-rating-strong": "#3bb8b2",
995
+ "--ws-rating-middle": "#93a6dc",
996
+ "--ws-rating-needs-work": "#f370a4",
997
+ "--ws-agent-coach": "#3bb8b2",
998
+ "--ws-agent-growth": "#9a84ee",
999
+ "--ws-agent-recruit": "#ff725c",
1000
+ "--ws-agent-tally": "#ffffff"
1001
+ }
1002
+ },
1003
+ "cool": {
1004
+ "light": {
1005
+ "--color-bg-page": "#fefbf9",
1006
+ "--ws-frame-top": "#ebf0f5",
1007
+ "--ws-stage-foot": "#fefbf9",
1008
+ "--color-surface": "#ffffff",
1009
+ "--ws-raised": "#fefbf9",
1010
+ "--ws-tray": "#ededed",
1011
+ "--ws-edge-card": "#d3d3d3",
1012
+ "--ws-edge": "#e2e2e2",
1013
+ "--ws-edge-hover": "#aaa49d",
1014
+ "--ws-well-hover": "#e4e2df",
1015
+ "--color-text-heading": "#093555",
1016
+ "--color-text-body": "#545454",
1017
+ "--color-text-muted": "#666666",
1018
+ "--color-text-interactive": "#093555",
1019
+ "--ws-on-act": "#ffffff",
1020
+ "--ws-act-hover": "#0f4a73",
1021
+ "--ws-word-needs": "#a84b3c",
1022
+ "--ws-focus-color": "#093555",
1023
+ "--ws-word-positive": "#09717a",
1024
+ "--ws-word-alert": "#b1042f",
1025
+ "--ws-chart-finished": "#098486",
1026
+ "--ws-chart-past-half": "#6d4fc2",
1027
+ "--ws-chart-under-half": "#ff725c",
1028
+ "--ws-chart-navy-light": "#2e6088",
1029
+ "--ws-chart-needs-work": "#f370a4",
1030
+ "--ws-chart-alert": "#b1042f",
1031
+ "--ws-rating-strong": "#098486",
1032
+ "--ws-rating-middle": "#495883",
1033
+ "--ws-rating-needs-work": "#f370a4",
1034
+ "--ws-agent-coach": "#098486",
1035
+ "--ws-agent-growth": "#6d4fc2",
1036
+ "--ws-agent-recruit": "#ff725c",
1037
+ "--ws-agent-tally": "#2c4870"
1038
+ },
1039
+ "dark": {
1040
+ "--color-bg-page": "#0f1922",
1041
+ "--ws-frame-top": "#0a1118",
1042
+ "--ws-stage-foot": "#0f1922",
1043
+ "--color-surface": "#131e28",
1044
+ "--ws-raised": "#16222d",
1045
+ "--ws-tray": "#1e2b38",
1046
+ "--ws-edge-card": "#273544",
1047
+ "--ws-edge": "#1e2a36",
1048
+ "--ws-edge-hover": "#8494a5",
1049
+ "--ws-well-hover": "#273544",
1050
+ "--color-text-heading": "#e8edf3",
1051
+ "--color-text-body": "#b0bbc7",
1052
+ "--color-text-muted": "#8494a5",
1053
+ "--color-text-interactive": "#e8edf3",
1054
+ "--ws-on-act": "#0f1922",
1055
+ "--ws-act-hover": "#d7dce2",
1056
+ "--ws-word-needs": "#ff8b78",
1057
+ "--ws-focus-color": "#e8edf3",
1058
+ "--ws-word-positive": "#4fc7be",
1059
+ "--ws-word-alert": "#ff5470",
1060
+ "--ws-chart-finished": "#23a8a3",
1061
+ "--ws-chart-past-half": "#9a84ee",
1062
+ "--ws-chart-under-half": "#ff725c",
1063
+ "--ws-chart-navy-light": "#6e9cc4",
1064
+ "--ws-chart-needs-work": "#f370a4",
1065
+ "--ws-chart-alert": "#ff5470",
1066
+ "--ws-rating-strong": "#3bb8b2",
1067
+ "--ws-rating-middle": "#e8edf3",
1068
+ "--ws-rating-needs-work": "#f370a4",
1069
+ "--ws-agent-coach": "#3bb8b2",
1070
+ "--ws-agent-growth": "#9a84ee",
1071
+ "--ws-agent-recruit": "#ff725c",
1072
+ "--ws-agent-tally": "#e8edf3"
1073
+ },
1074
+ "navy": {
1075
+ "--color-bg-page": "#021a32",
1076
+ "--ws-frame-top": "#021a32",
1077
+ "--ws-stage-foot": "#021a32",
1078
+ "--color-surface": "#0f253c",
1079
+ "--ws-raised": "#162c42",
1080
+ "--ws-tray": "#2a3f53",
1081
+ "--ws-edge-card": "rgba(255, 255, 255, 0.18)",
1082
+ "--ws-edge": "rgba(255, 255, 255, 0.1)",
1083
+ "--ws-edge-hover": "#a9a9a9",
1084
+ "--ws-well-hover": "#273544",
1085
+ "--color-text-heading": "#ffffff",
1086
+ "--color-text-body": "#d3d3d3",
1087
+ "--color-text-muted": "#a9a9a9",
1088
+ "--color-text-interactive": "#ffffff",
1089
+ "--ws-on-act": "#021a32",
1090
+ "--ws-act-hover": "#ebedef",
1091
+ "--ws-word-needs": "#ff8b78",
1092
+ "--ws-focus-color": "#ffffff",
1093
+ "--ws-word-positive": "#4fc7be",
1094
+ "--ws-word-alert": "#ff8282",
1095
+ "--ws-chart-finished": "#23a8a3",
1096
+ "--ws-chart-past-half": "#9a84ee",
1097
+ "--ws-chart-under-half": "#ff725c",
1098
+ "--ws-chart-navy-light": "#6e9cc4",
1099
+ "--ws-chart-needs-work": "#f370a4",
1100
+ "--ws-chart-alert": "#ff5470",
1101
+ "--ws-rating-strong": "#3bb8b2",
1102
+ "--ws-rating-middle": "#ffffff",
1103
+ "--ws-rating-needs-work": "#f370a4",
1104
+ "--ws-agent-coach": "#3bb8b2",
1105
+ "--ws-agent-growth": "#9a84ee",
1106
+ "--ws-agent-recruit": "#ff725c",
1107
+ "--ws-agent-tally": "#ffffff"
1108
+ }
1109
+ },
1110
+ "warm": {
1111
+ "light": {
1112
+ "--color-bg-page": "#fefbf9",
1113
+ "--ws-frame-top": "#fefbf9",
1114
+ "--ws-stage-foot": "#fef9f6",
1115
+ "--color-surface": "#ffffff",
1116
+ "--ws-raised": "#fefbf9",
1117
+ "--ws-tray": "#ededed",
1118
+ "--ws-edge-card": "#d3d3d3",
1119
+ "--ws-edge": "#e8e8e8",
1120
+ "--ws-edge-hover": "#aaa49d",
1121
+ "--ws-well-hover": "#e4e2df",
1122
+ "--color-text-heading": "#093555",
1123
+ "--color-text-body": "#545454",
1124
+ "--color-text-muted": "#666666",
1125
+ "--color-text-interactive": "#495883",
1126
+ "--ws-on-act": "#ffffff",
1127
+ "--ws-act-hover": "#0f4a73",
1128
+ "--ws-word-needs": "#a84b3c",
1129
+ "--ws-focus-color": "#093555",
1130
+ "--ws-word-positive": "#09717a",
1131
+ "--ws-word-alert": "#b1042f",
1132
+ "--ws-chart-finished": "#098486",
1133
+ "--ws-chart-past-half": "#6d4fc2",
1134
+ "--ws-chart-under-half": "#ff725c",
1135
+ "--ws-chart-navy-light": "#2e6088",
1136
+ "--ws-chart-needs-work": "#f370a4",
1137
+ "--ws-chart-alert": "#b1042f",
1138
+ "--ws-rating-strong": "#098486",
1139
+ "--ws-rating-middle": "#495883",
1140
+ "--ws-rating-needs-work": "#f370a4",
1141
+ "--ws-agent-coach": "#098486",
1142
+ "--ws-agent-growth": "#6d4fc2",
1143
+ "--ws-agent-recruit": "#ff725c",
1144
+ "--ws-agent-tally": "#2c4870"
1145
+ },
1146
+ "dark": {
1147
+ "--color-bg-page": "#0f1922",
1148
+ "--ws-frame-top": "#0a1118",
1149
+ "--ws-stage-foot": "#0f1922",
1150
+ "--color-surface": "#131e28",
1151
+ "--ws-raised": "#16222d",
1152
+ "--ws-tray": "#1e2b38",
1153
+ "--ws-edge-card": "#273544",
1154
+ "--ws-edge": "#1e2a36",
1155
+ "--ws-edge-hover": "#8494a5",
1156
+ "--ws-well-hover": "#273544",
1157
+ "--color-text-heading": "#e8edf3",
1158
+ "--color-text-body": "#b0bbc7",
1159
+ "--color-text-muted": "#8494a5",
1160
+ "--color-text-interactive": "#93a6dc",
1161
+ "--ws-on-act": "#0f1922",
1162
+ "--ws-act-hover": "#d7dce2",
1163
+ "--ws-word-needs": "#ff8b78",
1164
+ "--ws-focus-color": "#e8edf3",
1165
+ "--ws-word-positive": "#4fc7be",
1166
+ "--ws-word-alert": "#ff5470",
1167
+ "--ws-chart-finished": "#23a8a3",
1168
+ "--ws-chart-past-half": "#9a84ee",
1169
+ "--ws-chart-under-half": "#ff725c",
1170
+ "--ws-chart-navy-light": "#6e9cc4",
1171
+ "--ws-chart-needs-work": "#f370a4",
1172
+ "--ws-chart-alert": "#ff5470",
1173
+ "--ws-rating-strong": "#3bb8b2",
1174
+ "--ws-rating-middle": "#93a6dc",
1175
+ "--ws-rating-needs-work": "#f370a4",
1176
+ "--ws-agent-coach": "#3bb8b2",
1177
+ "--ws-agent-growth": "#9a84ee",
1178
+ "--ws-agent-recruit": "#ff725c",
1179
+ "--ws-agent-tally": "#e8edf3"
1180
+ },
1181
+ "navy": {
1182
+ "--color-bg-page": "#021a32",
1183
+ "--ws-frame-top": "#021a32",
1184
+ "--ws-stage-foot": "#021a32",
1185
+ "--color-surface": "#0f253c",
1186
+ "--ws-raised": "#162c42",
1187
+ "--ws-tray": "#2a3f53",
1188
+ "--ws-edge-card": "rgba(255, 255, 255, 0.18)",
1189
+ "--ws-edge": "rgba(255, 255, 255, 0.1)",
1190
+ "--ws-edge-hover": "#a9a9a9",
1191
+ "--ws-well-hover": "#273544",
1192
+ "--color-text-heading": "#ffffff",
1193
+ "--color-text-body": "#d3d3d3",
1194
+ "--color-text-muted": "#a9a9a9",
1195
+ "--color-text-interactive": "#93a6dc",
1196
+ "--ws-on-act": "#021a32",
1197
+ "--ws-act-hover": "#ebedef",
1198
+ "--ws-word-needs": "#ff8b78",
1199
+ "--ws-focus-color": "#ffffff",
1200
+ "--ws-word-positive": "#4fc7be",
1201
+ "--ws-word-alert": "#ff8282",
1202
+ "--ws-chart-finished": "#23a8a3",
1203
+ "--ws-chart-past-half": "#9a84ee",
1204
+ "--ws-chart-under-half": "#ff725c",
1205
+ "--ws-chart-navy-light": "#6e9cc4",
1206
+ "--ws-chart-needs-work": "#f370a4",
1207
+ "--ws-chart-alert": "#ff5470",
1208
+ "--ws-rating-strong": "#3bb8b2",
1209
+ "--ws-rating-middle": "#93a6dc",
1210
+ "--ws-rating-needs-work": "#f370a4",
1211
+ "--ws-agent-coach": "#3bb8b2",
1212
+ "--ws-agent-growth": "#9a84ee",
1213
+ "--ws-agent-recruit": "#ff725c",
1214
+ "--ws-agent-tally": "#ffffff"
1215
+ }
1216
+ }
1217
+ };
538
1218
  export {
539
1219
  Badge,
540
1220
  Button,
@@ -558,5 +1238,10 @@ export {
558
1238
  badgeVariants,
559
1239
  buttonVariants,
560
1240
  cardVariants,
561
- cn
1241
+ cn,
1242
+ contract,
1243
+ morph,
1244
+ palettes,
1245
+ reorder,
1246
+ rollPlaceholder
562
1247
  };