@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/tokens/tokens.md CHANGED
@@ -1,10 +1,14 @@
1
1
  # Fello brand tokens
2
2
 
3
- Generated from Figma Marketing - Design System 3.0 (MmOx1GHtbMge4lSLp1kcs8), captured 2026-06-11, and tokens/_product.css. 225 tokens: 106 kit, 119 product layer (`--ws-*`).
3
+ Generated from Figma Marketing - Design System 3.0 (MmOx1GHtbMge4lSLp1kcs8), captured 2026-06-11, tokens/_product.css and tokens/_dark.css. 422 tokens: 111 kit, 311 product layer (`--ws-*`); the dark theme re-points 98 (night) and 42 more on the navy ground.
4
4
 
5
5
  Use these through `var(--token)` or the Tailwind utility of the same name.
6
6
  Never write a raw hex, px font-size, or one-off shadow in a Fello project.
7
7
 
8
+ Tailwind v4 owns `--radius-xs` to `--radius-2xl`: tokens.css leaves them out of `@theme` so a host keeps its own,
9
+ and fello.css declares every token in the `theme.fello` layer, under the host's. The kit's own corners are the
10
+ `--ws-radius-*` lengths, which never ride on them.
11
+
8
12
  ## Colour
9
13
 
10
14
  | Token | Value |
@@ -18,8 +22,9 @@ Never write a raw hex, px font-size, or one-off shadow in a Fello project.
18
22
  | `--color-tertiary-dark-blue` | `var(--color-brand-navy)` |
19
23
  | `--color-background` | `#FEFBF9` |
20
24
  | `--color-white` | `#FFFFFF` |
25
+ | `--color-surface` | `var(--color-white)` |
21
26
  | `--color-gray-1` | `#F9F9F9` |
22
- | `--color-surface-stripe` | `#F7F4F4` |
27
+ | `--color-surface-stripe` | `var(--ws-tint-accent)` |
23
28
  | `--color-gray-2` | `#EDEDED` |
24
29
  | `--color-gray-stroke` | `#E8E8E8` |
25
30
  | `--color-gray-3` | `#D3D3D3` |
@@ -27,32 +32,32 @@ Never write a raw hex, px font-size, or one-off shadow in a Fello project.
27
32
  | `--color-gray-6` | `#7F7F7F` |
28
33
  | `--color-gray-7` | `#545454` |
29
34
  | `--color-gray-8` | `#292929` |
30
- | `--color-text-primary` | `#353E5A` |
35
+ | `--color-text-primary` | `color-mix(in srgb, var(--color-text-heading) 50%, #61475f)` |
31
36
  | `--color-ai-cyan` | `#14BACB` |
32
37
  | `--color-ai-blue` | `#3898F0` |
33
38
  | `--color-ai-violet` | `#8D6AE6` |
34
39
  | `--color-ai-pink` | `#EC67A0` |
35
40
  | `--color-ai-rose` | `#F59593` |
36
41
  | `--color-dropdown-bg` | `#fcfaf9` |
37
- | `--color-feedback-error` | `#ef6b51` |
42
+ | `--color-feedback-error` | `color-mix(in srgb, var(--ws-chart-under-half) 87.5%, #7f3a04)` |
38
43
  | `--color-feedback-success-text` | `#4f7d24` |
39
- | `--color-feedback-success-bg` | `#cde3cc` |
44
+ | `--color-feedback-success-bg` | `color-mix(in srgb, var(--ws-chart-finished) 20%, rgb(254 250.75 221.5))` |
40
45
  | `--color-alert` | `#e90f0f` |
41
- | `--color-stat-positive` | `#098486` |
42
- | `--color-bg-page` | `var(--color-background)` |
46
+ | `--color-stat-positive` | `var(--ws-chart-finished)` |
47
+ | `--color-bg-page` | `#FEFBF9` |
43
48
  | `--color-text-heading` | `var(--color-brand-navy)` |
44
49
  | `--color-text-body` | `var(--color-gray-7)` |
45
- | `--color-text-muted` | `#6E6E6E` |
46
- | `--color-text-brand-strong` | `#B35040` |
47
- | `--color-text-error-strong` | `#AE4E3B` |
48
- | `--color-text-success-strong` | `#3C601B` |
49
- | `--color-text-placeholder` | `#6E6E6E` |
50
+ | `--color-text-muted` | `#666666` |
51
+ | `--color-text-brand-strong` | `var(--ws-word-needs)` |
52
+ | `--color-text-error-strong` | `color-mix(in srgb, var(--ws-word-needs) 95%, #944b00)` |
53
+ | `--color-text-success-strong` | `color-mix(in srgb, var(--ws-word-positive) 20%, rgb(72.75 91.74 3.19))` |
54
+ | `--color-text-placeholder` | `color-mix(in srgb, var(--color-text-muted) 93.75%, #e6e6e6)` |
50
55
  | `--color-text-interactive` | `var(--color-brand-mid-blue)` |
51
- | `--color-border-default` | `var(--color-gray-stroke)` |
52
- | `--color-border-hairline` | `var(--color-gray-3)` |
56
+ | `--color-border-default` | `var(--ws-edge)` |
57
+ | `--color-border-hairline` | `var(--ws-edge-card)` |
53
58
  | `--color-border-btn` | `var(--color-button-border)` |
54
59
  | `--color-bg-dark` | `var(--color-brand-navy)` |
55
- | `--color-nav-hover-bg` | `color-mix(in srgb, var(--color-brand-mid-blue) 5%, transparent)` |
60
+ | `--color-nav-hover-bg` | `color-mix(in srgb, var(--color-text-interactive) 5%, transparent)` |
56
61
 
57
62
 
58
63
  ## Gradient
@@ -95,11 +100,17 @@ Never write a raw hex, px font-size, or one-off shadow in a Fello project.
95
100
 
96
101
  ## Spacing
97
102
 
103
+ The 4 px scale, plus the 2 px half step (`--space-3xs`) and the three half steps Seth reuses (`-plus`: a step and 2 px). A one-off value snaps to the nearest step (D4).
104
+
98
105
  | Token | Value |
99
106
  | --- | --- |
107
+ | `--space-3xs` | `2px` |
100
108
  | `--space-xxs` | `4px` |
109
+ | `--space-xxs-plus` | `6px` |
101
110
  | `--space-xs` | `8px` |
111
+ | `--space-xs-plus` | `10px` |
102
112
  | `--space-sm` | `12px` |
113
+ | `--space-sm-plus` | `14px` |
103
114
  | `--space-md` | `16px` |
104
115
  | `--space-lg` | `24px` |
105
116
  | `--space-xl` | `32px` |
@@ -131,13 +142,13 @@ Never write a raw hex, px font-size, or one-off shadow in a Fello project.
131
142
  | Token | Value |
132
143
  | --- | --- |
133
144
  | `--shadow-label-pill` | `2px 22px 6px 0 rgba(0, 0, 0, 0), 1px 14px 6px 0 rgba(0, 0, 0, 0.01), 1px 8px 5px 0 rgba(0, 0, 0, 0.04), 0 3px 4px 0 rgba(0, 0, 0, 0.07), 0 1px 2px 0 rgba(0, 0, 0, 0.08)` |
134
- | `--shadow-card-default` | `0 1px 2px rgba(9, 53, 85, 0.04), 0 4px 8px rgba(9, 53, 85, 0.06)` |
135
- | `--shadow-card-hover` | `0 4px 8px rgba(9, 53, 85, 0.06), 0 8px 24px rgba(9, 53, 85, 0.08)` |
145
+ | `--shadow-card-default` | `0 1px 2px color-mix(in srgb, var(--color-text-heading) 4%, transparent), 0 4px 8px color-mix(in srgb, var(--color-text-heading) 6%, transparent)` |
146
+ | `--shadow-card-hover` | `0 4px 8px color-mix(in srgb, var(--color-text-heading) 6%, transparent), 0 8px 24px color-mix(in srgb, var(--color-text-heading) 8%, transparent)` |
136
147
  | `--shadow-pill` | `0 8px 17px rgba(0, 0, 0, 0.07), 0 30px 30px rgba(0, 0, 0, 0.06), 0 68px 41px rgba(0, 0, 0, 0.04), 0 121px 48px rgba(0, 0, 0, 0.01)` |
137
148
  | `--shadow-dropdown` | `var(--shadow-pill)` |
138
149
  | `--shadow-btn` | `0 21px 6px rgba(0, 0, 0, 0), 0 13px 5px rgba(0, 0, 0, 0.02), 0 7px 4px rgba(0, 0, 0, 0.06), 0 3px 3px rgba(0, 0, 0, 0.09), 0 1px 2px rgba(0, 0, 0, 0.11)` |
139
150
  | `--shadow-btn-hover` | `0 32px 9px rgba(0, 0, 0, 0), 0 20px 8px rgba(0, 0, 0, 0.02), 0 11px 7px rgba(0, 0, 0, 0.06), 0 5px 5px rgba(0, 0, 0, 0.09), 0 1px 3px rgba(0, 0, 0, 0.11)` |
140
- | `--shadow-focus-ring` | `0 0 0 3px rgba(255, 114, 92, 0.2)` |
151
+ | `--shadow-focus-ring` | `0 0 0 2px var(--color-bg-page), 0 0 0 4px var(--color-text-heading)` |
141
152
 
142
153
 
143
154
  ## Z-index
@@ -177,45 +188,102 @@ The names every product screen is built from (design-system/ says when to use ea
177
188
 
178
189
  | Token | Value |
179
190
  | --- | --- |
180
- | `--ws-page` | `var(--color-gray-stroke)` |
191
+ | `--ws-page` | `color-mix(in srgb, var(--ws-tray) 97.5%, #252525)` |
181
192
  | `--ws-surface-sunk` | `color-mix(in srgb, var(--color-bg-page) 95%, var(--color-gray-8))` |
182
193
  | `--ws-surface-press` | `color-mix(in srgb, var(--color-bg-page) 90%, var(--color-gray-8))` |
183
- | `--ws-sidebar-hover` | `color-mix(in srgb, var(--color-gray-2) 85%, var(--color-white))` |
184
- | `--ws-sidebar-press` | `var(--color-gray-2)` |
194
+ | `--ws-sidebar-hover` | `color-mix(in srgb, var(--ws-tray) 85%, var(--color-surface))` |
195
+ | `--ws-sidebar-press` | `var(--ws-tray)` |
185
196
  | `--ws-menu-line` | `color-mix(in srgb, var(--color-bg-page) 87%, var(--color-gray-8))` |
186
197
  | `--ws-menu-hover` | `color-mix(in srgb, var(--color-bg-page) 96%, var(--color-gray-8))` |
187
- | `--ws-well` | `var(--color-gray-2)` |
188
- | `--ws-field` | `var(--color-white)` |
189
- | `--ws-tint-accent` | `var(--color-surface-stripe)` |
190
- | `--ws-tint-needs` | `color-mix(in srgb, var(--color-brand-salmon) 10%, var(--color-white))` |
191
- | `--ws-tint-live` | `color-mix(in srgb, var(--color-stat-positive) 12%, var(--color-white))` |
192
- | `--ws-edge` | `var(--color-border-default)` |
198
+ | `--ws-well` | `var(--ws-tray)` |
199
+ | `--ws-field` | `var(--color-surface)` |
200
+ | `--ws-tint-accent` | `color-mix(in srgb, var(--color-bg-page) 96%, #4f4c7c)` |
201
+ | `--ws-tint-needs` | `color-mix(in srgb, var(--ws-chart-under-half) 10%, var(--color-surface))` |
202
+ | `--ws-tint-live` | `color-mix(in srgb, var(--ws-chart-finished) 12%, var(--color-surface))` |
203
+ | `--ws-edge` | `var(--color-gray-stroke)` |
193
204
  | `--ws-edge-card` | `var(--color-gray-3)` |
194
- | `--ws-edge-chip` | `#d9d5d0` |
195
- | `--ws-edge-slot` | `#e2e2e2` |
196
- | `--ws-edge-tray` | `#d9d3cb` |
205
+ | `--ws-edge-card-1x` | `color-mix(in srgb, var(--ws-edge-card) 50%, transparent)` |
206
+ | `--ws-edge-chip` | `color-mix(in srgb, var(--ws-edge-card) 75%, #ebdbc7)` |
207
+ | `--ws-edge-slot` | `color-mix(in srgb, var(--ws-edge-card) 62.5%, #fbfbfb)` |
208
+ | `--ws-edge-tray` | `color-mix(in srgb, var(--ws-tray) 84%, rgb(112 74.5 24.5))` |
197
209
  | `--ws-chart-foot` | `color-mix(in srgb, var(--color-bg-page) 95%, var(--color-gray-8))` |
198
- | `--ws-word-needs` | `var(--color-text-brand-strong)` |
199
- | `--ws-word-positive` | `color-mix(in srgb, var(--color-stat-positive) 85%, var(--color-brand-navy))` |
200
- | `--ws-chart-finished` | `var(--color-stat-positive)` |
210
+ | `--ws-raised` | `var(--color-bg-page)` |
211
+ | `--ws-track` | `var(--ws-tray)` |
212
+ | `--ws-field-ink` | `color-mix(in srgb, var(--color-text-body) 46.25%, #040404)` |
213
+ | `--ws-field-mark` | `var(--color-text-heading)` |
214
+ | `--ws-on-act` | `var(--color-white)` |
215
+ | `--ws-ink` | `var(--color-text-heading)` |
216
+ | `--ws-shade` | `var(--color-text-heading)` |
217
+ | `--ws-ink-rgb` | `9, 53, 85` |
218
+ | `--ws-shade-rgb` | `9, 53, 85` |
219
+ | `--ws-inverse` | `var(--color-text-heading)` |
220
+ | `--ws-on-inverse` | `var(--ws-on-act)` |
221
+ | `--ws-control-off` | `color-mix(in srgb, var(--color-text-muted) 80%, #e3e3e3)` |
222
+ | `--ws-raised-sunk` | `var(--ws-surface-sunk)` |
223
+ | `--ws-edge-hover` | `#aaa49d` |
224
+ | `--ws-act-hover` | `#0f4a73` |
225
+ | `--ws-act-light` | `color-mix(in srgb, var(--ws-on-act) 24%, transparent)` |
226
+ | `--ws-agent-tally` | `#2c4870` |
227
+ | `--ws-agent-coach` | `var(--color-stat-positive)` |
228
+ | `--ws-agent-growth` | `var(--ws-chart-past-half)` |
229
+ | `--ws-agent-recruit` | `var(--ws-chart-under-half)` |
230
+ | `--ws-mask` | `#000` |
231
+ | `--ws-mark-muted` | `color-mix(in srgb, var(--color-text-muted) 76%, #fcfcfc)` |
232
+ | `--ws-chart-rest` | `color-mix(in srgb, var(--ws-tray) 90%, #252525)` |
233
+ | `--ws-ghost` | `color-mix(in srgb, var(--ws-well-hover) 98%, #b24c17)` |
234
+ | `--ws-veil` | `color-mix(in srgb, var(--ws-page) 30%, transparent)` |
235
+ | `--ws-word-answer` | `color-mix(in srgb, var(--color-text-body) 71.25%, #040404)` |
236
+ | `--ws-tray` | `var(--color-gray-2)` |
237
+ | `--ws-rim` | `var(--ws-line)` |
238
+ | `--ws-divider` | `var(--ws-hairline) solid var(--ws-edge)` |
239
+ | `--ws-divider-inset` | `inset 0 var(--ws-hairline) 0 var(--ws-edge)` |
240
+ | `--ws-well-hover` | `#e4e2df` |
241
+ | `--ws-frame-top` | `#ebf0f5` |
242
+ | `--ws-stage-foot` | `#fef9f6` |
243
+ | `--ws-frame` | `linear-gradient(180deg, var(--ws-frame-top) 0, var(--color-bg-page) 640px) var(--color-bg-page)` |
244
+ | `--ws-stage-wash` | `linear-gradient(180deg, var(--color-bg-page), var(--ws-stage-foot))` |
245
+ | `--ws-glass` | `color-mix(in srgb, var(--color-surface) 59%, transparent)` |
246
+ | `--ws-glass-blur` | `4px` |
247
+ | `--ws-glass-blur-chat` | `28px` |
248
+ | `--ws-edge-stage` | `var(--ws-page)` |
249
+ | `--ws-stage-inset-top` | `13px` |
250
+ | `--ws-stage-inset` | `var(--space-sm)` |
251
+ | `--ws-word-needs` | `#A84B3C` |
252
+ | `--ws-word-positive` | `color-mix(in srgb, var(--ws-chart-finished) 76%, var(--color-text-heading))` |
253
+ | `--ws-word-needs-work` | `color-mix(in srgb, var(--ws-chart-needs-work) 37.5%, rgb(142.2 4.8 68))` |
254
+ | `--ws-word-alert` | `var(--ws-chart-alert)` |
255
+ | `--ws-word-past-half` | `var(--ws-chart-past-half)` |
256
+ | `--ws-tint-needs-work` | `color-mix(in srgb, var(--ws-chart-needs-work) 20%, var(--color-bg-page))` |
257
+ | `--ws-chart-finished` | `#098486` |
201
258
  | `--ws-chart-past-half` | `#6d4fc2` |
202
259
  | `--ws-chart-under-half` | `var(--color-brand-salmon)` |
203
- | `--ws-chart-empty` | `var(--color-gray-1)` |
260
+ | `--ws-chart-empty` | `color-mix(in srgb, var(--color-surface) 97.6%, #050505)` |
204
261
  | `--ws-chart-dot` | `color-mix(in srgb, var(--color-bg-page) 91%, var(--color-gray-8))` |
205
262
  | `--ws-chart-navy-light` | `#2e6088` |
206
- | `--ws-chart-navy-fade` | `#a8c0d3` |
207
- | `--ws-chart-salmon-fade` | `#ffd2c8` |
208
- | `--ws-chart-purple-fade` | `#d8ccf6` |
209
- | `--ws-chart-teal-fade` | `#b0e2dd` |
210
- | `--ws-chart-finished-tint` | `#9fddd6` |
211
- | `--ws-chart-past-half-tint` | `#cbbdf3` |
212
- | `--ws-chart-under-half-tint` | `#f9dfc6` |
263
+ | `--ws-chart-navy-fade` | `color-mix(in srgb, var(--ws-chart-navy-light) 20%, rgb(198.5 216 229.75))` |
264
+ | `--ws-chart-salmon-fade` | `color-mix(in srgb, var(--ws-chart-under-half) 25%, #fff2ec)` |
265
+ | `--ws-chart-purple-fade` | `color-mix(in srgb, var(--ws-chart-past-half) 10%, rgb(227.8888888889 217.8888888889 251.7777777778))` |
266
+ | `--ws-chart-teal-fade` | `color-mix(in srgb, var(--ws-chart-finished) 20%, rgb(217.75 249.5 242.75))` |
267
+ | `--ws-chart-finished-tint` | `color-mix(in srgb, var(--ws-chart-finished) 20%, rgb(196.5 243.25 234))` |
268
+ | `--ws-chart-past-half-tint` | `color-mix(in srgb, var(--ws-chart-past-half) 15%, rgb(219.5882352941 208.4117647059 251.6470588235))` |
269
+ | `--ws-chart-under-half-tint` | `color-mix(in srgb, var(--ws-chart-under-half) 20%, rgb(247.5 250.25 224.5))` |
213
270
  | `--ws-chart-cell-edge` | `var(--ws-edge-slot)` |
214
- | `--ws-card-tint-blue` | `color-mix(in srgb, var(--color-brand-mid-blue) 10%, var(--color-white))` |
215
- | `--ws-card-tint-done` | `color-mix(in srgb, var(--color-stat-positive) 10%, var(--color-white))` |
216
- | `--ws-scrim` | `color-mix(in srgb, var(--color-brand-navy) 35%, transparent)` |
217
- | `--ws-team-glow` | `radial-gradient(75% 70% at 10% 0%, color-mix(in srgb, var(--color-brand-mid-blue) 14%, transparent), transparent), radial-gradient(70% 75% at 95% 100%, color-mix(in srgb, var(--color-ai-rose) 22%, transparent), transparent), radial-gradient(55% 60% at 70% 45%, color-mix(in srgb, var(--color-ai-pink) 8%, transparent), transparent)` |
218
- | `--ws-cool-glow` | `radial-gradient(75% 70% at 10% 0%, color-mix(in srgb, var(--color-brand-mid-blue) 16%, transparent), transparent), radial-gradient(60% 70% at 92% 30%, color-mix(in srgb, var(--color-ai-blue) 10%, transparent), transparent), radial-gradient(70% 60% at 60% 100%, color-mix(in srgb, var(--color-brand-navy) 6%, transparent), transparent)` |
271
+ | `--ws-chart-needs-work` | `#f370a4` |
272
+ | `--ws-chart-alert` | `#b1042f` |
273
+ | `--ws-rating-strong` | `var(--color-stat-positive)` |
274
+ | `--ws-rating-middle` | `var(--color-brand-mid-blue)` |
275
+ | `--ws-rating-needs-work` | `var(--ws-chart-needs-work)` |
276
+ | `--ws-shimmer-ground` | `var(--ws-ghost)` |
277
+ | `--ws-shimmer` | `linear-gradient(100deg in srgb, var(--ws-shimmer-ground) 0 34%, color-mix(in srgb, var(--ws-shimmer-ground) 30%, var(--color-bg-page)) 50%, var(--ws-shimmer-ground) 66% 100%)` |
278
+ | `--ws-card-tint-blue` | `color-mix(in srgb, var(--ws-rating-middle) 10%, var(--color-surface))` |
279
+ | `--ws-card-tint-done` | `color-mix(in srgb, var(--ws-chart-finished) 10%, var(--color-surface))` |
280
+ | `--ws-scrim` | `color-mix(in srgb, var(--color-text-heading) 35%, transparent)` |
281
+ | `--ws-glow-rose` | `color-mix(in srgb, var(--ws-chart-under-half) 50%, #ebb8ca)` |
282
+ | `--ws-glow-pink` | `color-mix(in srgb, var(--ws-chart-needs-work) 90%, #ad167c)` |
283
+ | `--ws-glow-blue` | `color-mix(in srgb, var(--ws-chart-navy-light) 10%, rgb(57.1111111111 158.2222222222 251.5555555556))` |
284
+ | `--ws-team-glow` | `radial-gradient(75% 70% at 10% 0%, color-mix(in srgb, var(--color-text-interactive) 14%, transparent), transparent), radial-gradient(70% 75% at 95% 100%, color-mix(in srgb, var(--ws-glow-rose) 22%, transparent), transparent), radial-gradient(55% 60% at 70% 45%, color-mix(in srgb, var(--ws-glow-pink) 8%, transparent), transparent)` |
285
+ | `--ws-cool-glow` | `radial-gradient(75% 70% at 10% 0%, color-mix(in srgb, var(--color-text-interactive) 16%, transparent), transparent), radial-gradient(60% 70% at 92% 30%, color-mix(in srgb, var(--ws-glow-blue) 10%, transparent), transparent), radial-gradient(70% 60% at 60% 100%, color-mix(in srgb, var(--color-text-heading) 6%, transparent), transparent)` |
286
+ | `--ws-orb` | `radial-gradient(circle at 30% 30% in srgb, color-mix(in srgb, var(--ws-chart-finished) 37.5%, rgb(26.6 218.4 244.4)), var(--ws-glow-blue) 45%, color-mix(in srgb, var(--ws-chart-past-half) 37.5%, rgb(160.2 122.2 251.6)) 80%)` |
219
287
  | `--ws-text-micro` | `11px` |
220
288
  | `--ws-text-dense` | `var(--font-size-2xs)` |
221
289
  | `--ws-text-meta` | `var(--font-size-xs)` |
@@ -227,33 +295,66 @@ The names every product screen is built from (design-system/ says when to use ea
227
295
  | `--ws-text-display` | `var(--font-size-7xl)` |
228
296
  | `--ws-leading-message` | `var(--space-lg)` |
229
297
  | `--ws-leading-title` | `calc(var(--space-lg) + var(--space-xxs))` |
298
+ | `--ws-text-control` | `var(--font-size-xs)` |
299
+ | `--ws-leading-control` | `18px` |
300
+ | `--ws-text-section` | `var(--ws-text-chart)` |
301
+ | `--ws-leading-section` | `22px` |
302
+ | `--ws-leading-row` | `calc(var(--space-md) + var(--space-xxs))` |
303
+ | `--ws-leading-micro` | `13px` |
304
+ | `--ws-text-figure-row` | `28px` |
305
+ | `--ws-leading-figure-row` | `var(--space-xl)` |
306
+ | `--ws-text-figure` | `var(--space-xl)` |
307
+ | `--ws-leading-figure` | `38px` |
308
+ | `--ws-text-figure-lg` | `44px` |
309
+ | `--ws-leading-figure-lg` | `var(--space-3xl)` |
310
+ | `--ws-text-score` | `var(--space-6xl)` |
311
+ | `--ws-leading-score` | `var(--space-6xl)` |
230
312
  | `--ws-gap-tight` | `var(--space-xxs)` |
231
313
  | `--ws-gap` | `var(--space-xs)` |
232
314
  | `--ws-gap-loose` | `var(--space-sm)` |
233
315
  | `--ws-gap-component` | `var(--space-md)` |
234
316
  | `--ws-gap-group` | `var(--space-lg)` |
235
- | `--ws-gap-turn` | `calc(var(--space-lg) - var(--space-xxs) / 2)` |
236
- | `--ws-gutter` | `var(--space-lg)` |
317
+ | `--ws-gap-turn` | `calc(var(--space-lg) + var(--space-xxs))` |
318
+ | `--ws-gap-block` | `var(--space-xl)` |
319
+ | `--ws-gap-section` | `calc(var(--space-3xl) + var(--space-xs))` |
320
+ | `--ws-gutter` | `var(--space-xl)` |
237
321
  | `--ws-card-padding` | `var(--space-sm)` |
238
322
  | `--ws-card-padding-lg` | `var(--space-md)` |
239
323
  | `--ws-card-inset` | `calc(var(--space-md) + var(--space-xxs))` |
240
324
  | `--ws-band-inset` | `calc(var(--space-lg) + var(--space-xxs))` |
241
325
  | `--ws-rise` | `calc(var(--space-xxs) * 1.5)` |
242
326
  | `--ws-chart-dot-gap` | `calc(var(--space-xs) * 0.8125)` |
243
- | `--ws-radius-bar` | `calc(var(--radius-xs) / 2)` |
244
- | `--ws-radius-chip` | `var(--radius-xs)` |
245
- | `--ws-radius-control` | `var(--radius-sm)` |
246
- | `--ws-radius-row` | `var(--radius-md)` |
247
- | `--ws-radius-card` | `var(--radius-lg)` |
248
- | `--ws-radius-bubble` | `calc(var(--radius-lg) + var(--radius-sm))` |
249
- | `--ws-radius-panel` | `var(--radius-xl)` |
327
+ | `--ws-radius-bar` | `1px` |
328
+ | `--ws-radius-chip` | `2px` |
329
+ | `--ws-radius-control` | `4px` |
330
+ | `--ws-radius-row` | `6px` |
331
+ | `--ws-radius-card` | `8px` |
332
+ | `--ws-radius-menu` | `10px` |
333
+ | `--ws-radius-card-inner` | `calc(var(--ws-radius-card) - var(--ws-rim))` |
334
+ | `--ws-radius-bubble` | `12px` |
335
+ | `--ws-radius-drawer` | `var(--ws-radius-bubble)` |
336
+ | `--ws-radius-drawer-inner` | `calc(var(--ws-radius-drawer) - var(--ws-rim))` |
337
+ | `--ws-radius-panel` | `16px` |
250
338
  | `--ws-shadow-hairline` | `0 0 0 var(--ws-hairline) var(--ws-edge-card)` |
339
+ | `--ws-shadow-hairline-in` | `inset 0 0 0 var(--ws-hairline) var(--ws-edge-card)` |
251
340
  | `--ws-shadow-band` | `inset 0 var(--ws-hairline) 0 var(--ws-edge-tray), inset 0 28px 8px 0 rgba(0, 0, 0, 0), inset 0 18px 7px 0 rgba(0, 0, 0, 0.01), inset 0 10px 6px 0 rgba(0, 0, 0, 0.03), inset 0 4px 4px 0 rgba(0, 0, 0, 0.05), inset 0 1px 2px 0 rgba(0, 0, 0, 0.06)` |
252
341
  | `--ws-shadow-lift` | `var(--shadow-card-hover)` |
253
- | `--ws-ring-selected` | `0 0 0 2px color-mix(in srgb, var(--color-brand-navy) 55%, transparent)` |
254
- | `--ws-card-ring-lit` | `0 0 0 2px color-mix(in srgb, var(--color-brand-navy) 30%, transparent)` |
255
- | `--ws-card-ring-person` | `inset 0 0 0 1px color-mix(in srgb, var(--color-brand-navy) 12%, transparent)` |
256
- | `--ws-focus-inset` | `inset 0 0 0 2px var(--color-text-interactive)` |
342
+ | `--ws-ring-selected` | `0 0 0 2px color-mix(in srgb, var(--ws-ink) 55%, transparent)` |
343
+ | `--ws-card-ring-lit` | `0 0 0 2px color-mix(in srgb, var(--ws-ink) 30%, transparent)` |
344
+ | `--ws-card-ring-person` | `inset 0 0 0 1px color-mix(in srgb, var(--ws-ink) 12%, transparent)` |
345
+ | `--ws-float-rim` | `0 0 0 0 transparent` |
346
+ | `--ws-shadow-pop` | `var(--ws-float-rim), 0 12px 32px -16px color-mix(in srgb, var(--ws-shade) 35%, transparent)` |
347
+ | `--ws-shadow-menu` | `var(--ws-float-rim), 0 16px 32px -16px color-mix(in srgb, var(--ws-shade) 35%, transparent)` |
348
+ | `--ws-shadow-tip` | `var(--ws-float-rim), 0 16px 32px -20px color-mix(in srgb, var(--ws-shade) 45%, transparent)` |
349
+ | `--ws-shadow-float` | `var(--ws-float-rim), 0 40px 80px -30px color-mix(in srgb, var(--ws-shade) 30%, transparent), 0 10px 24px -12px color-mix(in srgb, var(--ws-shade) 14%, transparent)` |
350
+ | `--ws-shadow-bar` | `var(--ws-float-rim), 0 24px 60px -24px color-mix(in srgb, var(--ws-shade) 32%, transparent), 0 2px 10px color-mix(in srgb, var(--ws-shade) 6%, transparent)` |
351
+ | `--ws-hover-faint` | `color-mix(in srgb, var(--ws-ink) 3.137254902%, transparent)` |
352
+ | `--ws-hover` | `color-mix(in srgb, var(--ws-ink) 5.0980392157%, transparent)` |
353
+ | `--ws-hover-strong` | `color-mix(in srgb, var(--ws-ink) 5.8823529412%, transparent)` |
354
+ | `--ws-focus-color` | `var(--color-text-heading)` |
355
+ | `--ws-focus-width` | `var(--ws-ring)` |
356
+ | `--ws-focus-offset` | `var(--ws-ring)` |
357
+ | `--ws-focus-inset` | `inset 0 0 0 var(--ws-focus-width) var(--ws-focus-color)` |
257
358
  | `--ws-hairline` | `0.5px` |
258
359
  | `--ws-line` | `1px` |
259
360
  | `--ws-chart-line` | `1.5px` |
@@ -263,18 +364,20 @@ The names every product screen is built from (design-system/ says when to use ea
263
364
  | `--ws-control-h` | `var(--space-xl)` |
264
365
  | `--ws-control-h-md` | `calc(var(--space-xl) + var(--space-xxs))` |
265
366
  | `--ws-touch` | `40px` |
367
+ | `--ws-touch-public` | `44px` |
266
368
  | `--ws-row-h` | `var(--space-3xl)` |
267
369
  | `--ws-row-h-dense` | `var(--space-2xl)` |
268
370
  | `--ws-composer-h` | `52px` |
269
371
  | `--ws-header-h` | `calc(var(--space-3xl) + var(--space-xs))` |
270
372
  | `--ws-topbar-h` | `var(--space-3xl)` |
271
373
  | `--ws-band-h` | `80px` |
272
- | `--ws-rail-width` | `calc(var(--space-2xl) + var(--space-xl))` |
374
+ | `--ws-rail-width` | `var(--space-4xl)` |
273
375
  | `--ws-sidebar-width` | `calc(var(--space-9xl) + var(--space-xl))` |
274
376
  | `--ws-thing-width` | `calc(var(--space-9xl) * 2 + var(--space-2xl))` |
275
377
  | `--ws-chart-card-w` | `calc(var(--space-9xl) * 2 + var(--space-8xl) - var(--space-xxs))` |
276
378
  | `--ws-chart-card-min` | `480px` |
277
379
  | `--ws-column-width` | `calc(var(--space-9xl) * 3 + var(--space-3xl) + var(--space-xs))` |
380
+ | `--ws-float-width` | `calc(var(--space-9xl) * 1.5)` |
278
381
  | `--ws-icon-sm` | `12px` |
279
382
  | `--ws-icon` | `16px` |
280
383
  | `--ws-icon-lg` | `20px` |
@@ -282,17 +385,440 @@ The names every product screen is built from (design-system/ says when to use ea
282
385
  | `--ws-tracking-title` | `-0.005em` |
283
386
  | `--ws-tracking-display` | `-0.03em` |
284
387
  | `--ws-duration-instant` | `120ms` |
388
+ | `--ws-duration-exit` | `120ms` |
285
389
  | `--ws-duration-gentle` | `200ms` |
390
+ | `--ws-duration-hover` | `200ms` |
391
+ | `--ws-duration-text` | `250ms` |
286
392
  | `--ws-duration-settle` | `320ms` |
393
+ | `--ws-duration-reveal` | `350ms` |
394
+ | `--ws-duration-shrink` | `400ms` |
287
395
  | `--ws-duration-calm` | `420ms` |
288
396
  | `--ws-duration-glide` | `400ms` |
397
+ | `--ws-duration-morph` | `450ms` |
398
+ | `--ws-duration-grow` | `550ms` |
399
+ | `--ws-duration-shift` | `550ms` |
400
+ | `--ws-duration-fill` | `700ms` |
401
+ | `--ws-duration-draw` | `900ms` |
402
+ | `--ws-duration-draw-chat` | `1500ms` |
403
+ | `--ws-duration-fill-page` | `1700ms` |
404
+ | `--ws-duration-build` | `2400ms` |
289
405
  | `--ws-stagger` | `30ms` |
406
+ | `--ws-stagger-detail` | `22ms` |
407
+ | `--ws-stagger-row` | `45ms` |
408
+ | `--ws-stagger-part` | `70ms` |
409
+ | `--ws-ripple` | `4ms` |
410
+ | `--ws-stagger-square` | `35ms` |
411
+ | `--ws-hover-intent` | `40ms` |
412
+ | `--ws-hover-leave` | `60ms` |
413
+ | `--ws-hover-grace` | `180ms` |
414
+ | `--ws-close-delay` | `160ms` |
290
415
  | `--ws-sweep` | `calc(var(--ws-duration-calm) - var(--ws-duration-gentle))` |
291
- | `--ws-loop` | `1.2s` |
416
+ | `--ws-loop` | `1s` |
417
+ | `--ws-loop-status` | `1.6s` |
418
+ | `--ws-loop-shimmer` | `1.8s` |
292
419
  | `--ws-loop-slow` | `2.4s` |
420
+ | `--ws-loop-ambient` | `6s` |
293
421
  | `--ws-ease-soft` | `cubic-bezier(0.22, 1, 0.36, 1)` |
294
422
  | `--ws-ease-exit` | `cubic-bezier(0.4, 0, 1, 1)` |
295
423
  | `--ws-ease-glide` | `cubic-bezier(0.75, 0, 0.25, 1)` |
296
424
  | `--ws-ease-steady` | `linear` |
297
425
  | `--ws-ease-spring` | `var(--ws-ease-soft)` |
426
+ | `--ws-ease-settle` | `cubic-bezier(0.16, 1, 0.3, 1)` |
427
+ | `--ws-ease-grow` | `cubic-bezier(0.32, 0.72, 0, 1)` |
428
+ | `--ws-ease-shift` | `cubic-bezier(0.25, 1, 0.5, 1)` |
429
+ | `--ws-ease-morph` | `cubic-bezier(0.5, 0, 0.15, 1)` |
430
+ | `--ws-ease-sweep` | `cubic-bezier(0.45, 0, 0.55, 1)` |
431
+ | `--ws-ease-commit` | `cubic-bezier(0.65, 0, 0.35, 1)` |
432
+ | `--ws-ease-shimmer` | `cubic-bezier(0.4, 0, 0.2, 1)` |
433
+ | `--ws-ease-ambient` | `cubic-bezier(0.45, 0, 0.3, 1)` |
434
+ | `--ws-ease-loop` | `cubic-bezier(0.42, 0, 0.58, 1)` |
435
+ | `--ws-ease-pop` | `cubic-bezier(0.34, 1.4, 0.64, 1)` |
436
+ | `--ws-ease-lift` | `cubic-bezier(0.22, 1.25, 0.36, 1)` |
298
437
  | `--ws-press-scale` | `0.97` |
438
+ | `--ws-press-scale-round` | `0.94` |
439
+ | `--ws-press-scale-send` | `0.92` |
440
+ | `--ws-open-scale` | `0.97` |
441
+ | `--ws-open-scale-pane` | `0.98` |
442
+ | `--ws-open-scale-toast` | `0.96` |
443
+ | `--ws-pop-scale` | `0.94` |
444
+ | `--ws-grow-scale` | `1.16` |
445
+ | `--ws-dim` | `0.3` |
446
+ | `--ws-nudge` | `var(--space-xxs)` |
447
+ | `--ws-drop` | `var(--space-sm)` |
448
+ | `--ws-blur-arrive` | `3px` |
449
+ | `--ws-blur-panel` | `8px` |
450
+
451
+
452
+ ## Palettes
453
+
454
+ A palette is a set of values for the contract below, named for how it looks: `<html data-palette="cool">`, or on any
455
+ container (`<div class="fello" data-palette="warm" data-theme="dark">`), nested either way. A palette sets only
456
+ these tokens; everything else derives from them and recomputes inside the element that sets the palette. An app
457
+ writes its own the same way, `[data-palette="name"] { ... }` and `[data-palette="name"][data-theme="dark"] { ... }`,
458
+ checks it with `node node_modules/@felloinnovations/brand-kit/scripts/check-palette.mjs its-palette.css`, and ships what
459
+ `check-palette.mjs --emit its-palette.css` writes: the built-ins' own form, so it works on `<html>` or any container,
460
+ nested either way, in light and dark, in either build, loaded before or after the kit, and a dark value it leaves out
461
+ is the kit's, derived from the dark inputs. Every other colour derives from these, in light and dark.
462
+
463
+ The built-ins: `default`, `cool`, `warm` (`default` is no attribute). In JS: `palettes.cool.light` from
464
+ `@felloinnovations/brand-kit/palettes`. Each cell is light / dark; `=` is the default's value.
465
+
466
+ ### The contract
467
+
468
+ | Token | Group | Meaning | default | cool | warm |
469
+ | --- | --- | --- | --- | --- | --- |
470
+ | `--color-bg-page` | ground | The page and every card's surface: the cream most words sit on. | `#fefbf9` / `#0f1922` | = | = |
471
+ | `--ws-frame-top` | ground | 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). | `#ebf0f5` / `#0a1118` | = | `#fefbf9` / `#0a1118` |
472
+ | `--ws-stage-foot` | ground | The foot of a washed stage, whose gradient starts at the page (light only). | `#fef9f6` / `#0f1922` | `#fefbf9` / `#0f1922` | = |
473
+ | `--color-surface` | ground | What is white: a marketing card, a well row under the pointer, a chat bubble, the glass of the stage. | `#ffffff` / `#131e28` | = | = |
474
+ | `--ws-raised` | ground | What floats off the page: a menu, a popover, a tooltip, a dialog, a panel, a toast. | `#fefbf9` / `#16222d` | = | = |
475
+ | `--ws-tray` | ground | The rim and foot of a rimmed card, and the well behind rows. | `#ededed` / `#1e2b38` | = | = |
476
+ | `--ws-edge-card` | edge | A card's and an outlined control's 0.5 px edge. | `#d3d3d3` / `#273544` | = | = |
477
+ | `--ws-edge` | edge | A divider between rows; a quiet line. | `#e8e8e8` / `#1e2a36` | `#e2e2e2` / `#1e2a36` | = |
478
+ | `--ws-edge-hover` | edge | An outlined control's edge under the pointer. | `#aaa49d` / `#8494a5` | = | = |
479
+ | `--ws-well-hover` | edge | A rimmed card's rim under the pointer. | `#e4e2df` / `#273544` | = | = |
480
+ | `--color-text-heading` | word | Titles, names, figures, navy marks, and the act fill (the primary button, a thumb, a checked box). | `#093555` / `#e8edf3` | = | = |
481
+ | `--color-text-body` | word | Body words: a card's line, a row. | `#545454` / `#b0bbc7` | = | = |
482
+ | `--color-text-muted` | word | Meta, labels, captions. | `#666666` / `#8494a5` | = | = |
483
+ | `--color-text-interactive` | word | Links and words that go somewhere, a falling number, "working". | `#495883` / `#93a6dc` | `#093555` / `#e8edf3` | = |
484
+ | `--ws-on-act` | act | Words and marks on the act fill. | `#ffffff` / `#0f1922` | = | = |
485
+ | `--ws-act-hover` | act | The act fill under the pointer. | `#0f4a73` / `#d7dce2` | = | = |
486
+ | `--ws-word-needs` | accent | Needs you, in words: the current page, something to fix (the accent's AA step). | `#a84b3c` / `#ff8b78` | = | = |
487
+ | `--ws-focus-color` | focus | The 2 px focus ring, outside or inset. | `#093555` / `#e8edf3` | = | = |
488
+ | `--ws-word-positive` | status | Good news in words. | `#09717a` / `#4fc7be` | = | = |
489
+ | `--ws-word-alert` | status | Something wrong now, in words. | `#b1042f` / `#ff5470` | = | = |
490
+ | `--ws-chart-finished` | chart | Tone 1: done, passed, positive marks. | `#098486` / `#23a8a3` | = | = |
491
+ | `--ws-chart-past-half` | chart | Tone 2: past halfway marks. | `#6d4fc2` / `#9a84ee` | = | = |
492
+ | `--ws-chart-under-half` | chart | Tone 3: under halfway marks and needs-you dots. Drawn with its word: its 3:1 is reported. | `#ff725c` / `#ff725c` | = | = |
493
+ | `--ws-chart-navy-light` | chart | Tone 4: a second navy, for a series beside the heading navy. | `#2e6088` / `#6e9cc4` | = | = |
494
+ | `--ws-chart-needs-work` | chart | Tone 5: needs work marks. Drawn with its word: its 3:1 is reported. | `#f370a4` / `#f370a4` | = | = |
495
+ | `--ws-chart-alert` | chart | Tone 6: alert marks. | `#b1042f` / `#ff5470` | = | = |
496
+ | `--ws-rating-strong` | rating | Strong: its marks. | `#098486` / `#3bb8b2` | = | = |
497
+ | `--ws-rating-middle` | rating | Getting there (the middle band): its marks. | `#495883` / `#93a6dc` | `#495883` / `#e8edf3` | = |
498
+ | `--ws-rating-needs-work` | rating | Needs work: its marks. | `#f370a4` / `#f370a4` | = | = |
499
+ | `--ws-agent-coach` | agent | The coaching assistant's mark. | `#098486` / `#3bb8b2` | = | = |
500
+ | `--ws-agent-growth` | agent | The growth assistant's mark. | `#6d4fc2` / `#9a84ee` | = | = |
501
+ | `--ws-agent-recruit` | agent | The recruiting assistant's mark. | `#ff725c` / `#ff725c` | = | = |
502
+ | `--ws-agent-tally` | agent | The money assistant's mark, and a softer act (a figure tab's current cell, a seat meter, a hatch). | `#2c4870` / `#e8edf3` | = | = |
503
+
504
+ ### Groups
505
+
506
+ - **ground**: What everything sits on. Every word is checked AA on each.
507
+ - **edge**: Hairlines, and the edges under the pointer.
508
+ - **word**: Words, each AA on every ground it can sit on.
509
+ - **act**: The one primary act. Its fill is the heading colour.
510
+ - **accent**: Needs you: the current page, something to fix.
511
+ - **focus**: The keyboard ring, 3:1 on every ground.
512
+ - **status**: Good and bad news, in words.
513
+ - **chart**: The six data tones charts draw with: told apart from each other (CIEDE2000 10 or more) and 3:1 on the chart ground. A tone marked withWords (salmon, pink) is always drawn beside its word, so its ratio is reported, not required: Seth draws them at 2.6:1 and marks keep his exact tone (D2).
514
+ - **rating**: One rating scale on every screen (D10): its marks. Their words are the status and word tokens.
515
+ - **agent**: Each assistant keeps one tone and nothing else names it (03-colour).
516
+
517
+
518
+ ### The built-ins, checked
519
+
520
+ scripts/check-palette.mjs on tokens/_palettes.css (generate-tokens stops on an error):
521
+
522
+ ```
523
+ default: passes (sets 0: nothing)
524
+ cool: passes (sets 3: --ws-stage-foot, --ws-edge, --color-text-interactive)
525
+ report: dark: no --ws-stage-foot, so it takes the kit's dark --ws-stage-foot (#0f1922), derived from the dark inputs
526
+ report: dark: no --ws-edge, so it takes the kit's dark --ws-edge (#1e2a36), derived from the dark inputs
527
+ warm: passes (sets 1: --ws-frame-top)
528
+ report: dark: no --ws-frame-top, so it takes the kit's dark --ws-frame-top (#0a1118), derived from the dark inputs
529
+ 3 palettes: 0 errors, 3 reports. Checked in light, night and navy: every word AA on every ground, the focus ring and the act fill 3:1, the chart tones CIEDE2000 10 apart and 3:1 on the chart ground (the kit's --ws-chart-under-half 2.61:1 and --ws-chart-needs-work 2.66:1 are drawn beside their words, so their ratio is reported, not required).
530
+ ```
531
+
532
+
533
+ ## Dark theme
534
+
535
+ Opt-in, on any element: `data-theme="dark"` (night), `data-theme="system"` (night on a dark OS, light otherwise),
536
+ `data-theme="light"` (light again inside a dark element), and `data-ground="navy"` beside dark or system for the navy
537
+ ground. The nearest one wins, so light inside dark and dark inside light both work. An app that sets nothing stays
538
+ light. Brand colours stay literal; these semantic names carry the swap. `tokens.ts` exports every theme resolved
539
+ (`themes.dark`, `themes.navy`).
540
+
541
+ ### Night (`[data-theme="dark"]`)
542
+
543
+ | Token | Value |
544
+ | --- | --- |
545
+ | `--ws-page` | `color-mix(in srgb, var(--color-bg-page) 50%, #05090e)` |
546
+ | `--color-bg-page` | `#0F1922` |
547
+ | `--color-surface` | `#131E28` |
548
+ | `--ws-raised` | `#16222D` |
549
+ | `--ws-surface-sunk` | `color-mix(in srgb, var(--color-bg-page) 93.75%, #8fb9e2)` |
550
+ | `--ws-surface-press` | `color-mix(in srgb, var(--color-bg-page) 90%, #a5cdfe)` |
551
+ | `--ws-well` | `color-mix(in srgb, var(--ws-tray) 20%, rgb(6.25 14.25 21))` |
552
+ | `--ws-field` | `color-mix(in srgb, var(--color-bg-page) 50%, #070f16)` |
553
+ | `--ws-chart-foot` | `color-mix(in srgb, var(--color-bg-page) 80%, #000509)` |
554
+ | `--ws-sidebar-hover` | `color-mix(in srgb, var(--color-bg-page) 98.5%, #d7e1ea)` |
555
+ | `--ws-sidebar-press` | `color-mix(in srgb, var(--color-bg-page) 95%, #afcdfe)` |
556
+ | `--ws-menu-hover` | `var(--ws-surface-press)` |
557
+ | `--ws-menu-line` | `color-mix(in srgb, var(--color-bg-page) 80%, #6e8cb8)` |
558
+ | `--ws-tint-accent` | `var(--color-surface)` |
559
+ | `--ws-tint-needs` | `color-mix(in srgb, var(--ws-chart-under-half) 13.05%, var(--color-bg-page))` |
560
+ | `--ws-tint-live` | `color-mix(in srgb, var(--ws-chart-finished) 12.1%, var(--color-bg-page))` |
561
+ | `--ws-card-tint-blue` | `color-mix(in srgb, var(--color-bg-page) 90%, #879bf4)` |
562
+ | `--ws-card-tint-done` | `color-mix(in srgb, var(--ws-chart-finished) 10.4%, var(--color-bg-page))` |
563
+ | `--ws-track` | `color-mix(in srgb, var(--ws-tray) 80%, #0a1215)` |
564
+ | `--color-dropdown-bg` | `var(--ws-raised)` |
565
+ | `--color-feedback-success-bg` | `color-mix(in srgb, var(--ws-chart-finished) 20%, rgb(25 16.75 1.75))` |
566
+ | `--ws-scrim` | `color-mix(in srgb, color-mix(in srgb, var(--ws-page) 20%, rgb(0 3.25 6.5)) 62%, transparent)` |
567
+ | `--ws-edge` | `#1E2A36` |
568
+ | `--ws-edge-card` | `#273544` |
569
+ | `--ws-edge-chip` | `color-mix(in srgb, var(--ws-edge-card) 96%, #a4cbf3)` |
570
+ | `--ws-edge-slot` | `color-mix(in srgb, var(--ws-edge-card) 75%, #071118)` |
571
+ | `--ws-edge-tray` | `color-mix(in srgb, var(--ws-tray) 90%, #aacbf6)` |
572
+ | `--color-text-heading` | `#E8EDF3` |
573
+ | `--color-text-body` | `#B0BBC7` |
574
+ | `--color-text-muted` | `#8494A5` |
575
+ | `--color-text-placeholder` | `var(--color-text-muted)` |
576
+ | `--color-text-interactive` | `#93A6DC` |
577
+ | `--color-text-primary` | `color-mix(in srgb, var(--color-text-heading) 53.5%, var(--color-text-body))` |
578
+ | `--ws-word-needs` | `#FF8B78` |
579
+ | `--color-text-error-strong` | `var(--ws-word-needs)` |
580
+ | `--ws-word-positive` | `#4FC7BE` |
581
+ | `--color-text-success-strong` | `color-mix(in srgb, var(--ws-word-positive) 20%, #aed15f)` |
582
+ | `--color-feedback-success-text` | `var(--color-text-success-strong)` |
583
+ | `--ws-field-ink` | `color-mix(in srgb, var(--color-text-heading) 88%, var(--color-text-body))` |
584
+ | `--ws-on-act` | `var(--color-bg-page)` |
585
+ | `--color-stat-positive` | `color-mix(in srgb, var(--ws-chart-finished) 80%, #9bf8ee)` |
586
+ | `--ws-chart-finished` | `#23A8A3` |
587
+ | `--ws-chart-past-half` | `#9A84EE` |
588
+ | `--ws-chart-navy-light` | `#6E9CC4` |
589
+ | `--ws-chart-empty` | `var(--ws-track)` |
590
+ | `--ws-chart-dot` | `color-mix(in srgb, var(--color-bg-page) 90%, #91afd6)` |
591
+ | `--ws-chart-navy-fade` | `color-mix(in srgb, var(--ws-chart-navy-light) 36.2%, var(--color-bg-page))` |
592
+ | `--ws-chart-salmon-fade` | `color-mix(in srgb, var(--ws-chart-under-half) 33.2%, var(--color-bg-page))` |
593
+ | `--ws-chart-purple-fade` | `color-mix(in srgb, var(--ws-chart-past-half) 31.3%, var(--color-bg-page))` |
594
+ | `--ws-chart-teal-fade` | `color-mix(in srgb, var(--ws-chart-finished) 29.8%, var(--color-bg-page))` |
595
+ | `--ws-chart-finished-tint` | `color-mix(in srgb, var(--ws-chart-finished) 36.8%, var(--color-bg-page))` |
596
+ | `--ws-chart-past-half-tint` | `color-mix(in srgb, var(--ws-chart-past-half) 32.2%, var(--color-bg-page))` |
597
+ | `--ws-chart-under-half-tint` | `color-mix(in srgb, var(--ws-chart-under-half) 20%, rgb(30 44 30.75))` |
598
+ | `--color-feedback-error` | `color-mix(in srgb, var(--ws-chart-under-half) 90%, #ffe0a2)` |
599
+ | `--color-alert` | `#FF5A5A` |
600
+ | `--ws-ink-rgb` | `232, 237, 243` |
601
+ | `--ws-shade-rgb` | `0, 0, 0` |
602
+ | `--ws-shade` | `#000` |
603
+ | `--color-nav-hover-bg` | `color-mix(in srgb, var(--ws-ink) 4%, transparent)` |
604
+ | `--ws-shadow-band` | `inset 0 0.5px 0 color-mix(in srgb, var(--ws-tray) 96%, #82a8ce), inset 0 10px 6px 0 rgba(0, 0, 0, 0.06), inset 0 4px 4px 0 rgba(0, 0, 0, 0.1), inset 0 1px 2px 0 rgba(0, 0, 0, 0.14)` |
605
+ | `--ws-shadow-lift` | `0 0 0 0.5px color-mix(in srgb, var(--ws-ink) 8%, transparent), 0 6px 14px rgba(0, 0, 0, 0.32), 0 16px 40px rgba(0, 0, 0, 0.42)` |
606
+ | `--shadow-card-default` | `0 1px 2px rgba(0, 0, 0, 0.3), 0 4px 8px rgba(0, 0, 0, 0.24)` |
607
+ | `--shadow-card-hover` | `var(--ws-shadow-lift)` |
608
+ | `--shadow-dropdown` | `0 0 0 0.5px color-mix(in srgb, var(--ws-ink) 8%, transparent), 0 8px 17px rgba(0, 0, 0, 0.3), 0 30px 30px rgba(0, 0, 0, 0.26), 0 68px 41px rgba(0, 0, 0, 0.16)` |
609
+ | `--ws-ring-selected` | `0 0 0 2px color-mix(in srgb, var(--ws-ink) 70%, transparent)` |
610
+ | `--ws-card-ring-lit` | `0 0 0 2px color-mix(in srgb, var(--ws-ink) 32%, transparent)` |
611
+ | `--ws-card-ring-person` | `inset 0 0 0 1px color-mix(in srgb, var(--ws-ink) 14%, transparent)` |
612
+ | `--ws-glow-blue` | `color-mix(in srgb, var(--ws-chart-navy-light) 20%, rgb(42.5 151 251))` |
613
+ | `--ws-cool-glow` | `radial-gradient(80% 90% at 85% 10%, color-mix(in srgb, var(--ws-glow-blue) 14%, transparent), transparent), linear-gradient(var(--ws-raised), var(--ws-raised))` |
614
+ | `--ws-team-glow` | `radial-gradient(80% 90% at 85% 10%, color-mix(in srgb, var(--ws-glow-blue) 14%, transparent), transparent), radial-gradient(70% 80% at 0% 90%, color-mix(in srgb, var(--ws-chart-under-half) 12%, transparent), transparent), linear-gradient(var(--ws-raised), var(--ws-raised))` |
615
+ | `--ws-orb` | `radial-gradient(circle at 30% 30% in srgb, color-mix(in srgb, var(--ws-chart-finished) 50%, #05ccf3), var(--ws-glow-blue) 45%, color-mix(in srgb, var(--ws-chart-past-half) 80%, #5902c6) 80%)` |
616
+ | `--ws-tray` | `#1E2B38` |
617
+ | `--ws-edge-card-1x` | `var(--ws-edge-card)` |
618
+ | `--ws-well-hover` | `#273544` |
619
+ | `--ws-frame` | `var(--ws-frame-top)` |
620
+ | `--ws-frame-top` | `var(--ws-page)` |
621
+ | `--ws-stage-foot` | `var(--color-bg-page)` |
622
+ | `--ws-stage-wash` | `var(--color-bg-page)` |
623
+ | `--ws-glass` | `color-mix(in srgb, var(--color-bg-page) 59%, transparent)` |
624
+ | `--ws-edge-stage` | `var(--ws-edge-card)` |
625
+ | `--ws-float-rim` | `0 0 0 0.5px color-mix(in srgb, var(--ws-ink) 8%, transparent)` |
626
+ | `--ws-chart-alert` | `#FF5470` |
627
+ | `--ws-word-needs-work` | `var(--ws-chart-needs-work)` |
628
+ | `--ws-tint-needs-work` | `color-mix(in srgb, var(--ws-chart-needs-work) 18%, var(--color-bg-page))` |
629
+ | `--ws-rating-middle` | `var(--color-text-interactive)` |
630
+ | `--ws-raised-sunk` | `var(--ws-surface-press)` |
631
+ | `--ws-edge-hover` | `var(--color-text-muted)` |
632
+ | `--ws-act-hover` | `color-mix(in srgb, var(--color-text-heading) 92%, var(--ws-on-act))` |
633
+ | `--ws-act-light` | `transparent` |
634
+ | `--ws-agent-tally` | `var(--color-text-heading)` |
635
+ | `--ws-mark-muted` | `color-mix(in srgb, var(--color-text-muted) 79.8%, var(--color-bg-page))` |
636
+ | `--ws-control-off` | `color-mix(in srgb, var(--color-text-muted) 50%, #7a6a59)` |
637
+ | `--ws-shimmer` | `linear-gradient(100deg in srgb, var(--ws-shimmer-ground) 0 34%, color-mix(in srgb, var(--ws-shimmer-ground) 93%, var(--ws-ink)) 50%, var(--ws-shimmer-ground) 66% 100%)` |
638
+ | `--ws-inverse` | `var(--color-bg-dark)` |
639
+ | `--ws-on-inverse` | `var(--color-white)` |
640
+ | `--ws-chart-rest` | `var(--ws-edge-card)` |
641
+ | `--ws-ghost` | `var(--ws-well-hover)` |
642
+ | `--ws-word-answer` | `color-mix(in srgb, var(--color-text-body) 50%, var(--ws-field-ink))` |
643
+
644
+ ### Navy ground (`[data-theme="dark"][data-ground="navy"]`, on top of night)
645
+
646
+ | Token | Value |
647
+ | --- | --- |
648
+ | `--ws-page` | `var(--color-bg-page)` |
649
+ | `--color-bg-page` | `#021A32` |
650
+ | `--color-surface` | `color-mix(in srgb, var(--color-bg-page) 95%, var(--color-white))` |
651
+ | `--ws-raised` | `color-mix(in srgb, var(--color-bg-page) 92%, var(--color-white))` |
652
+ | `--ws-surface-sunk` | `color-mix(in srgb, var(--color-bg-page) 90%, var(--color-white))` |
653
+ | `--ws-surface-press` | `color-mix(in srgb, var(--color-bg-page) 84%, var(--color-white))` |
654
+ | `--ws-well` | `color-mix(in srgb, var(--color-bg-page) 94%, var(--color-white))` |
655
+ | `--ws-field` | `var(--color-white)` |
656
+ | `--ws-chart-foot` | `color-mix(in srgb, var(--color-bg-page) 95%, var(--color-white))` |
657
+ | `--ws-sidebar-hover` | `color-mix(in srgb, var(--color-bg-page) 94%, var(--color-white))` |
658
+ | `--ws-sidebar-press` | `color-mix(in srgb, var(--color-bg-page) 90%, var(--color-white))` |
659
+ | `--ws-menu-hover` | `color-mix(in srgb, var(--color-bg-page) 88%, var(--color-white))` |
660
+ | `--ws-menu-line` | `var(--ws-edge-card)` |
661
+ | `--ws-tint-accent` | `color-mix(in srgb, var(--color-bg-page) 94%, var(--color-white))` |
662
+ | `--ws-tint-needs` | `color-mix(in srgb, var(--ws-chart-under-half) 18%, var(--color-bg-page))` |
663
+ | `--ws-tint-live` | `color-mix(in srgb, var(--ws-chart-finished) 13.1%, var(--color-bg-page))` |
664
+ | `--ws-card-tint-blue` | `color-mix(in srgb, var(--color-brand-mid-blue) 25%, var(--color-bg-page))` |
665
+ | `--ws-card-tint-done` | `var(--ws-tint-live)` |
666
+ | `--ws-track` | `color-mix(in srgb, var(--color-bg-page) 88%, var(--color-white))` |
667
+ | `--ws-edge` | `color-mix(in srgb, var(--color-white) 10%, transparent)` |
668
+ | `--ws-edge-card` | `color-mix(in srgb, var(--color-white) 18%, transparent)` |
669
+ | `--ws-edge-chip` | `var(--ws-edge-card)` |
670
+ | `--ws-edge-slot` | `var(--ws-edge-card)` |
671
+ | `--ws-edge-tray` | `var(--ws-edge-card)` |
672
+ | `--color-text-heading` | `#FFFFFF` |
673
+ | `--color-text-body` | `#D3D3D3` |
674
+ | `--color-text-muted` | `#A9A9A9` |
675
+ | `--color-text-placeholder` | `#6E6E6E` |
676
+ | `--color-text-primary` | `color-mix(in srgb, var(--color-text-heading) 93%, #000000)` |
677
+ | `--ws-field-ink` | `var(--color-brand-navy)` |
678
+ | `--ws-field-mark` | `var(--ws-field-ink)` |
679
+ | `--ws-chart-empty` | `var(--ws-track)` |
680
+ | `--ws-chart-dot` | `color-mix(in srgb, var(--ws-ink) 10%, transparent)` |
681
+ | `--ws-chart-navy-fade` | `color-mix(in srgb, var(--color-text-heading) 30%, var(--color-bg-page))` |
682
+ | `--ws-ink-rgb` | `255, 255, 255` |
683
+ | `--ws-shadow-band` | `inset 0 var(--ws-hairline) 0 var(--ws-edge-tray)` |
684
+ | `--ws-tray` | `color-mix(in srgb, var(--color-bg-page) 84%, var(--color-white))` |
685
+ | `--ws-word-needs-work` | `color-mix(in srgb, var(--ws-chart-needs-work) 80%, #fdcfe0)` |
686
+ | `--ws-word-alert` | `#FF8282` |
687
+ | `--ws-word-past-half` | `color-mix(in srgb, var(--ws-chart-past-half) 80%, #f9f7fd)` |
688
+ | `--ws-mark-muted` | `color-mix(in srgb, var(--color-text-muted) 80%, #0e5eb3)` |
689
+ | `--ws-word-answer` | `color-mix(in srgb, var(--color-text-body) 50%, var(--color-text-heading))` |
690
+
691
+ ## Words on grounds (WCAG AA)
692
+
693
+ Every word token on every ground it can sit on, computed by scripts/generate-tokens.mjs from the values above (it
694
+ stops on a fail). Gated at 4.5:1 on cream (`--color-bg-page`), white (`--color-surface`), the plate
695
+ (`--ws-surface-sunk`), the tray (`--ws-tray`), a raised surface (`--ws-raised`) and its sunk step (`--ws-raised-sunk`),
696
+ the shell (`--ws-page`), a row under a press (`--ws-surface-press`), the well (`--ws-well`), the tints and card tints,
697
+ the chart foot, the sidebar and menu hovers and the table stripe. Reported, not gated: the needs-work tint and the
698
+ success ground (each carries only its own words, gated as a pair: `--ws-word-needs-work`, `--color-text-success-strong`;
699
+ `--color-feedback-success-text` is for the cream or a raised surface, not its own ground) and `--ws-well-hover` (a
700
+ frame under the pointer: keep muted words off it). A mark (tick, bar, dot, ring) keeps its own tone; a word in that
701
+ tone uses the word token here (D2).
702
+
703
+ ### Light
704
+
705
+ | Word | Value | cream | white | plate | tray | raised | shell | press | well | raised sunk | accent tint | needs tint | live tint | blue card | done card | chart foot | sidebar hover | menu hover | stripe | needs-work tint | success | well hover |
706
+ | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
707
+ | `--color-text-heading` | `#093555` | 12.34 | 12.71 | 11.28 | 10.86 | 12.34 | 10.37 | 10.23 | 10.86 | 11.28 | 11.62 | 11.55 | 10.85 | 10.97 | 11.19 | 11.28 | 11.15 | 11.48 | 11.62 | 10.21 | 9.36 | 9.83 |
708
+ | `--color-text-body` | `#545454` | 7.35 | 7.57 | 6.72 | 6.47 | 7.35 | 6.18 | 6.10 | 6.47 | 6.72 | 6.92 | 6.88 | 6.46 | 6.54 | 6.66 | 6.72 | 6.65 | 6.84 | 6.92 | 6.08 | 5.57 | 5.86 |
709
+ | `--color-text-muted` | `#666666` | 5.57 | 5.74 | 5.10 | 4.90 | 5.57 | 4.69 | 4.62 | 4.90 | 5.10 | 5.25 | 5.22 | 4.90 | 4.96 | 5.05 | 5.10 | 5.04 | 5.19 | 5.25 | 4.61 | 4.23 (fails) | 4.44 (fails) |
710
+ | `--color-text-interactive` | `#495883` | 6.78 | 6.98 | 6.20 | 5.97 | 6.78 | 5.70 | 5.62 | 5.97 | 6.20 | 6.39 | 6.35 | 5.96 | 6.03 | 6.15 | 6.20 | 6.13 | 6.31 | 6.39 | 5.61 | 5.14 | 5.40 |
711
+ | `--color-text-brand-strong` | `#a84b3c` | 5.45 | 5.62 | 4.99 | 4.80 | 5.45 | 4.59 | 4.52 | 4.80 | 4.99 | 5.14 | 5.11 | 4.80 | 4.85 | 4.95 | 4.99 | 4.93 | 5.08 | 5.14 | 4.51 | 4.14 (fails) | 4.35 (fails) |
712
+ | `--color-text-error-strong` | `#a74b39` | 5.50 | 5.66 | 5.03 | 4.84 | 5.50 | 4.62 | 4.56 | 4.84 | 5.03 | 5.18 | 5.14 | 4.83 | 4.89 | 4.98 | 5.03 | 4.97 | 5.12 | 5.18 | 4.55 | 4.17 (fails) | 4.38 (fails) |
713
+ | `--color-text-success-strong` | `#3c601b` | 7.07 | 7.29 | 6.47 | 6.23 | 7.07 | 5.95 | 5.87 | 6.23 | 6.47 | 6.66 | 6.62 | 6.22 | 6.29 | 6.41 | 6.47 | 6.40 | 6.59 | 6.66 | 5.85 | 5.36 | 5.64 |
714
+ | `--ws-word-needs` | `#a84b3c` | 5.45 | 5.62 | 4.99 | 4.80 | 5.45 | 4.59 | 4.52 | 4.80 | 4.99 | 5.14 | 5.11 | 4.80 | 4.85 | 4.95 | 4.99 | 4.93 | 5.08 | 5.14 | 4.51 | 4.14 (fails) | 4.35 (fails) |
715
+ | `--ws-word-positive` | `#09717a` | 5.58 | 5.75 | 5.10 | 4.91 | 5.58 | 4.69 | 4.63 | 4.91 | 5.10 | 5.25 | 5.22 | 4.90 | 4.96 | 5.06 | 5.10 | 5.04 | 5.19 | 5.25 | 4.61 | 4.23 (fails) | 4.44 (fails) |
716
+ | `--ws-word-needs-work` | `#b42d68` | 5.80 | 5.97 | 5.30 | 5.10 | 5.80 | 4.87 | 4.81 | 5.10 | 5.30 | 5.46 | 5.43 | 5.10 | 5.16 | 5.26 | 5.30 | 5.24 | 5.40 | 5.46 | 4.80 | 4.40 (fails) | 4.62 |
717
+ | `--ws-word-alert` | `#b1042f` | 6.96 | 7.17 | 6.37 | 6.13 | 6.96 | 5.85 | 5.77 | 6.13 | 6.37 | 6.56 | 6.52 | 6.12 | 6.19 | 6.31 | 6.37 | 6.29 | 6.48 | 6.56 | 5.76 | 5.28 | 5.55 |
718
+ | `--ws-word-past-half` | `#6d4fc2` | 5.74 | 5.92 | 5.25 | 5.06 | 5.74 | 4.83 | 4.76 | 5.06 | 5.25 | 5.41 | 5.38 | 5.05 | 5.11 | 5.21 | 5.25 | 5.19 | 5.35 | 5.41 | 4.75 | 4.36 (fails) | 4.58 |
719
+ | `--ws-word-answer` | `#3d3d3d` | 10.54 | 10.86 | 9.64 | 9.28 | 10.54 | 8.87 | 8.74 | 9.28 | 9.64 | 9.93 | 9.87 | 9.27 | 9.38 | 9.56 | 9.64 | 9.53 | 9.81 | 9.93 | 8.72 | 7.99 | 8.40 |
720
+
721
+ - `--color-text-placeholder` on `--ws-field`: 5.10:1
722
+ - `--ws-field-ink` on `--ws-field`: 14.55:1
723
+ - `--ws-on-act` on `--color-text-heading`: 12.71:1
724
+ - `--ws-word-needs` on `--ws-tint-needs`: 5.11:1
725
+ - `--ws-word-positive` on `--ws-tint-live`: 4.90:1
726
+ - `--ws-word-needs-work` on `--ws-tint-needs-work`: 4.80:1
727
+ - `--color-text-success-strong` on `--color-feedback-success-bg`: 5.36:1
728
+ - `--ws-on-act` on `--ws-agent-tally`: 9.26:1
729
+
730
+
731
+ ### Night
732
+
733
+ | Word | Value | cream | white | plate | tray | raised | shell | press | well | raised sunk | accent tint | needs tint | live tint | blue card | done card | chart foot | sidebar hover | menu hover | stripe | needs-work tint | success | well hover |
734
+ | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
735
+ | `--color-text-heading` | `#e8edf3` | 15.09 | 14.34 | 13.55 | 12.24 | 13.71 | 16.13 | 12.24 | 15.77 | 12.24 | 14.34 | 12.61 | 12.73 | 12.94 | 13.04 | 15.64 | 14.64 | 12.24 | 14.34 | 11.55 | 12.08 | 10.62 |
736
+ | `--color-text-body` | `#b0bbc7` | 9.12 | 8.66 | 8.19 | 7.39 | 8.29 | 9.74 | 7.39 | 9.53 | 7.39 | 8.66 | 7.62 | 7.69 | 7.82 | 7.88 | 9.45 | 8.85 | 7.39 | 8.66 | 6.98 | 7.30 | 6.42 |
737
+ | `--color-text-muted` | `#8494a5` | 5.72 | 5.43 | 5.14 | 4.64 | 5.20 | 6.11 | 4.64 | 5.98 | 4.64 | 5.43 | 4.78 | 4.83 | 4.90 | 4.94 | 5.93 | 5.55 | 4.64 | 5.43 | 4.38 (fails) | 4.58 | 4.03 (fails) |
738
+ | `--color-text-interactive` | `#93a6dc` | 7.38 | 7.02 | 6.63 | 5.99 | 6.71 | 7.89 | 5.99 | 7.72 | 5.99 | 7.02 | 6.17 | 6.23 | 6.33 | 6.38 | 7.65 | 7.16 | 5.99 | 7.02 | 5.65 | 5.91 | 5.20 |
739
+ | `--color-text-brand-strong` | `#ff8b78` | 7.79 | 7.41 | 7.00 | 6.32 | 7.08 | 8.33 | 6.32 | 8.15 | 6.32 | 7.41 | 6.52 | 6.58 | 6.68 | 6.74 | 8.08 | 7.56 | 6.32 | 7.41 | 5.97 | 6.24 | 5.49 |
740
+ | `--color-text-error-strong` | `#ff8b78` | 7.79 | 7.41 | 7.00 | 6.32 | 7.08 | 8.33 | 6.32 | 8.15 | 6.32 | 7.41 | 6.52 | 6.58 | 6.68 | 6.74 | 8.08 | 7.56 | 6.32 | 7.41 | 5.97 | 6.24 | 5.49 |
741
+ | `--color-text-success-strong` | `#9bcf72` | 9.78 | 9.29 | 8.78 | 7.93 | 8.89 | 10.45 | 7.93 | 10.22 | 7.93 | 9.29 | 8.18 | 8.25 | 8.38 | 8.45 | 10.14 | 9.49 | 7.93 | 9.29 | 7.49 | 7.83 | 6.89 |
742
+ | `--ws-word-needs` | `#ff8b78` | 7.79 | 7.41 | 7.00 | 6.32 | 7.08 | 8.33 | 6.32 | 8.15 | 6.32 | 7.41 | 6.52 | 6.58 | 6.68 | 6.74 | 8.08 | 7.56 | 6.32 | 7.41 | 5.97 | 6.24 | 5.49 |
743
+ | `--ws-word-positive` | `#4fc7be` | 8.66 | 8.24 | 7.78 | 7.03 | 7.88 | 9.26 | 7.03 | 9.06 | 7.03 | 8.24 | 7.24 | 7.31 | 7.43 | 7.49 | 8.98 | 8.41 | 7.03 | 8.24 | 6.63 | 6.94 | 6.10 |
744
+ | `--ws-word-needs-work` | `#f370a4` | 6.48 | 6.16 | 5.82 | 5.26 | 5.89 | 6.93 | 5.26 | 6.78 | 5.26 | 6.16 | 5.42 | 5.47 | 5.56 | 5.60 | 6.72 | 6.29 | 5.26 | 6.16 | 4.96 | 5.19 | 4.57 |
745
+ | `--ws-word-alert` | `#ff5470` | 5.71 | 5.43 | 5.13 | 4.63 | 5.19 | 6.11 | 4.63 | 5.97 | 4.63 | 5.43 | 4.78 | 4.82 | 4.90 | 4.94 | 5.92 | 5.54 | 4.63 | 5.43 | 4.37 (fails) | 4.57 | 4.02 (fails) |
746
+ | `--ws-word-past-half` | `#9a84ee` | 5.84 | 5.55 | 5.25 | 4.74 | 5.31 | 6.25 | 4.74 | 6.11 | 4.74 | 5.55 | 4.89 | 4.93 | 5.01 | 5.05 | 6.06 | 5.67 | 4.74 | 5.55 | 4.47 (fails) | 4.68 | 4.12 (fails) |
747
+ | `--ws-word-answer` | `#c9d1db` | 11.52 | 10.95 | 10.35 | 9.35 | 10.48 | 12.32 | 9.35 | 12.05 | 9.35 | 10.95 | 9.64 | 9.73 | 9.88 | 9.96 | 11.95 | 11.18 | 9.35 | 10.95 | 8.82 | 9.23 | 8.12 |
748
+
749
+ - `--color-text-placeholder` on `--ws-field`: 5.98:1
750
+ - `--ws-field-ink` on `--ws-field`: 14.91:1
751
+ - `--ws-on-act` on `--color-text-heading`: 15.09:1
752
+ - `--ws-word-needs` on `--ws-tint-needs`: 6.52:1
753
+ - `--ws-word-positive` on `--ws-tint-live`: 7.31:1
754
+ - `--ws-word-needs-work` on `--ws-tint-needs-work`: 4.96:1
755
+ - `--color-text-success-strong` on `--color-feedback-success-bg`: 7.83:1
756
+ - `--ws-on-act` on `--ws-agent-tally`: 15.09:1
757
+
758
+
759
+ ### Navy ground
760
+
761
+ | Word | Value | cream | white | plate | tray | raised | shell | press | well | raised sunk | accent tint | needs tint | live tint | blue card | done card | chart foot | sidebar hover | menu hover | stripe | needs-work tint | success | well hover |
762
+ | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
763
+ | `--color-text-heading` | `#ffffff` | 17.55 | 15.55 | 13.32 | 10.86 | 14.26 | 17.55 | 10.86 | 15.03 | 10.86 | 15.03 | 13.83 | 14.39 | 14.49 | 14.39 | 15.55 | 15.03 | 12.56 | 15.03 | 13.82 | 14.22 | 12.51 |
764
+ | `--color-text-body` | `#d3d3d3` | 11.73 | 10.39 | 8.90 | 7.25 | 9.52 | 11.73 | 7.25 | 10.04 | 7.25 | 10.04 | 9.24 | 9.61 | 9.68 | 9.61 | 10.39 | 10.04 | 8.39 | 10.04 | 9.23 | 9.50 | 8.36 |
765
+ | `--color-text-muted` | `#a9a9a9` | 7.47 | 6.62 | 5.67 | 4.62 | 6.07 | 7.47 | 4.62 | 6.40 | 4.62 | 6.40 | 5.89 | 6.12 | 6.16 | 6.12 | 6.62 | 6.40 | 5.34 | 6.40 | 5.88 | 6.05 | 5.32 |
766
+ | `--color-text-interactive` | `#93a6dc` | 7.30 | 6.46 | 5.54 | 4.51 | 5.93 | 7.30 | 4.51 | 6.25 | 4.51 | 6.25 | 5.75 | 5.98 | 6.02 | 5.98 | 6.46 | 6.25 | 5.22 | 6.25 | 5.74 | 5.91 | 5.20 |
767
+ | `--color-text-brand-strong` | `#ff8b78` | 7.70 | 6.83 | 5.84 | 4.76 | 6.26 | 7.70 | 4.76 | 6.60 | 4.76 | 6.60 | 6.07 | 6.31 | 6.36 | 6.31 | 6.83 | 6.60 | 5.51 | 6.60 | 6.06 | 6.24 | 5.49 |
768
+ | `--color-text-error-strong` | `#ff8b78` | 7.70 | 6.83 | 5.84 | 4.76 | 6.26 | 7.70 | 4.76 | 6.60 | 4.76 | 6.60 | 6.07 | 6.31 | 6.36 | 6.31 | 6.83 | 6.60 | 5.51 | 6.60 | 6.06 | 6.24 | 5.49 |
769
+ | `--color-text-success-strong` | `#9bcf72` | 9.66 | 8.56 | 7.33 | 5.98 | 7.85 | 9.66 | 5.98 | 8.28 | 5.98 | 8.28 | 7.62 | 7.92 | 7.98 | 7.92 | 8.56 | 8.28 | 6.91 | 8.28 | 7.61 | 7.83 | 6.89 |
770
+ | `--ws-word-needs` | `#ff8b78` | 7.70 | 6.83 | 5.84 | 4.76 | 6.26 | 7.70 | 4.76 | 6.60 | 4.76 | 6.60 | 6.07 | 6.31 | 6.36 | 6.31 | 6.83 | 6.60 | 5.51 | 6.60 | 6.06 | 6.24 | 5.49 |
771
+ | `--ws-word-positive` | `#4fc7be` | 8.56 | 7.59 | 6.50 | 5.30 | 6.96 | 8.56 | 5.30 | 7.33 | 5.30 | 7.33 | 6.75 | 7.02 | 7.07 | 7.02 | 7.59 | 7.33 | 6.13 | 7.33 | 6.74 | 6.94 | 6.10 |
772
+ | `--ws-word-needs-work` | `#f583b0` | 7.32 | 6.48 | 5.55 | 4.53 | 5.94 | 7.32 | 4.53 | 6.27 | 4.53 | 6.27 | 5.77 | 6.00 | 6.04 | 6.00 | 6.48 | 6.27 | 5.24 | 6.27 | 5.76 | 5.93 | 5.22 |
773
+ | `--ws-word-alert` | `#ff8282` | 7.33 | 6.49 | 5.56 | 4.53 | 5.95 | 7.33 | 4.53 | 6.28 | 4.53 | 6.28 | 5.78 | 6.01 | 6.05 | 6.01 | 6.49 | 6.28 | 5.24 | 6.28 | 5.77 | 5.94 | 5.22 |
774
+ | `--ws-word-past-half` | `#ad9bf1` | 7.30 | 6.47 | 5.54 | 4.52 | 5.93 | 7.30 | 4.52 | 6.25 | 4.52 | 6.25 | 5.75 | 5.99 | 6.03 | 5.99 | 6.47 | 6.25 | 5.22 | 6.25 | 5.75 | 5.92 | 5.20 |
775
+ | `--ws-word-answer` | `#e9e9e9` | 14.46 | 12.81 | 10.97 | 8.94 | 11.74 | 14.46 | 8.94 | 12.38 | 8.94 | 12.38 | 11.39 | 11.85 | 11.93 | 11.85 | 12.81 | 12.38 | 10.34 | 12.38 | 11.38 | 11.72 | 10.30 |
776
+
777
+ - `--color-text-placeholder` on `--ws-field`: 5.10:1
778
+ - `--ws-field-ink` on `--ws-field`: 12.71:1
779
+ - `--ws-on-act` on `--color-text-heading`: 17.55:1
780
+ - `--ws-word-needs` on `--ws-tint-needs`: 6.07:1
781
+ - `--ws-word-positive` on `--ws-tint-live`: 7.02:1
782
+ - `--ws-word-needs-work` on `--ws-tint-needs-work`: 5.76:1
783
+ - `--color-text-success-strong` on `--color-feedback-success-bg`: 7.83:1
784
+ - `--ws-on-act` on `--ws-agent-tally`: 17.55:1
785
+
786
+
787
+ ## Springs
788
+
789
+ Seth's presets from his DialKit config, in `tokens.ts` as `springs` (and `eases` for the CSS curves) for the motion
790
+ library, and in every CSS token file as the same spring: `--ws-spring-<name>` is a `linear()` curve sampled from the
791
+ motion library's own solver (within 1% everywhere, overshoot kept), `--ws-spring-<name>-duration` the time it takes to
792
+ settle. Use both together: `transition: scale var(--ws-spring-press-duration) var(--ws-spring-press)`. A browser without
793
+ `linear()` drops the transition and changes at once. A spring is for what the person drives (a press, the pointer, an
794
+ indicator, a panel, a fold); a timed ease is for what the system plays (a draw, a build, a loop). Reduced motion: the
795
+ house makes every CSS transition instant; wrap a motion tree in `<MotionConfig reducedMotion="user">`.
796
+
797
+ | Preset | visualDuration | bounce | CSS | Settles in | Use |
798
+ | --- | --- | --- | --- | --- | --- |
799
+ | `press` | 0.2 s | 0.3 | `--ws-spring-press` | 450ms | A button or chip under a press (scale --ws-press-scale) |
800
+ | `follow` | 0.22 s | 0 | `--ws-spring-follow` | 450ms | A tooltip following the pointer; never bounces |
801
+ | `pop` | 0.35 s | 0.1 | `--ws-spring-pop` | 500ms | A chart tooltip or tip popping in from --ws-pop-scale |
802
+ | `settle` | 0.32 s | 0.1 | `--ws-spring-settle` | 450ms | Menus, pickers and messages settling |
803
+ | `fold` | 0.32 s | 0 | `--ws-spring-fold` | 600ms | A section opening or closing (height and the chevron) |
804
+ | `indicator` | 0.38 s | 0.16 | `--ws-spring-indicator` | 700ms | The Segmented and tab thumb sliding to the chosen item |
805
+ | `highlight` | 0.45 s | 0.14 | `--ws-spring-highlight` | 800ms | A list's selected fill sliding between rows |
806
+ | `nav` | 0.4 s | 0.1 | `--ws-spring-nav` | 550ms | The sidebar's current-row pill sliding |
807
+ | `reorder` | 0.4 s | 0 | `--ws-spring-reorder` | 750ms | List rows moving to new places |
808
+ | `tile` | 0.26 s | 0.06 | `--ws-spring-tile` | 450ms | A heatmap square opening to two cells |
809
+ | `lane` | 0.46 s | 0.04 | `--ws-spring-lane` | 750ms | A lane's detail opening |
810
+ | `lens` | 0.45 s | 0.04 | `--ws-spring-lens` | 750ms | One chart swapping for another inside an open tile |
811
+ | `swap` | 0.6 s | 0.06 | `--ws-spring-swap` | 900ms | A board chart going out and the new one coming in |
812
+ | `panel` | 0.42 s | 0.12 | `--ws-spring-panel` | 550ms | The chat panel opening, moving or docking |
813
+ | `card` | 0.5 s | 0.08 | `--ws-spring-card` | 700ms | A chart card arriving in the thread |
814
+ | `text` | 0.7 s | 0.2 | `--ws-spring-text` | 1200ms | A metric card's words swapping |
815
+ | `badge` | 0.3 s | 0.4 | `--ws-spring-badge` | 650ms | A count badge popping when it changes |
816
+ | `tab` | 0.4 s | 0.12 | `--ws-spring-tab` | 500ms | A tab's underline sliding to the chosen tab (North dc-tab) |
817
+ | `chip` | 0.25 s | 0.1 | `--ws-spring-chip` | 350ms | An attention chip opening into its card |
818
+ | `glow` | 0.3 s | 0 | `--ws-spring-glow` | 600ms | The composer's focus glow arriving |
819
+ | `roll` | 0.45 s | 0.05 | `--ws-spring-roll` | 700ms | The composer's placeholder rolling to the next line |
820
+ | `flag` | 0.26 s | 0.06 | `--ws-spring-flag` | 450ms | A trend read-out following the pointer along a chart |
821
+ | `mark` | 0.35 s | 0.35 | `--ws-spring-mark` | 550ms | A small mark popping in: the pace dot on an opened square |
822
+ | `morphChart` | 0.85 s | 0.06 | `--ws-spring-morph-chart` | 1250ms | A chart morphing between forms (bars to a line) |
823
+ | `orb` | 0.55 s | 0.35 | `--ws-spring-orb` | 850ms | An agent's orb arriving, from scale .3 out of a 4 px blur (North js@532276; a stack of them staggers on .5 / .35, js@531354) |
824
+ | `default` | 0.4 s | 0.15 | `--ws-spring-default` | 750ms | Anything the person drives that has no tuned spring (North's fallback) |