@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
@@ -17,71 +17,182 @@
17
17
  /* === Surfaces and edges (colour) ===
18
18
  Ignite globals.css "The desk's design system" (re-based 13 Oct 2026 on
19
19
  the designer's Figma). Each is a kit colour or a mix of two. */
20
- --ws-page: var(--color-gray-stroke);
20
+ /* D15 (4 Nov 2026): every colour below derives from the palette contract (tokens/design-tokens.json "palette"), so
21
+ an app palette that moves the page, the tray, the words or a chart tone moves everything that follows it. Where
22
+ the source drew a value that no plain mix of two contract tokens lands on, it is the contract token mixed with a
23
+ partner solved so the default paints the source's value exactly (no rounding: the share is a fraction CSS writes
24
+ exactly and the partner a whole or short-decimal colour). The partner is a constant; the share is the follow. */
25
+ --ws-page: color-mix(in srgb, var(--ws-tray) 97.5%, #252525); /* #e8e8e8: the shell, a step under the tray */
21
26
  --ws-surface-sunk: color-mix(in srgb, var(--color-bg-page) 95%, var(--color-gray-8));
22
27
  --ws-surface-press: color-mix(in srgb, var(--color-bg-page) 90%, var(--color-gray-8));
23
- --ws-sidebar-hover: color-mix(in srgb, var(--color-gray-2) 85%, var(--color-white));
24
- --ws-sidebar-press: var(--color-gray-2);
28
+ --ws-sidebar-hover: color-mix(in srgb, var(--ws-tray) 85%, var(--color-surface));
29
+ --ws-sidebar-press: var(--ws-tray);
25
30
  --ws-menu-line: color-mix(in srgb, var(--color-bg-page) 87%, var(--color-gray-8));
26
31
  --ws-menu-hover: color-mix(in srgb, var(--color-bg-page) 96%, var(--color-gray-8));
27
- --ws-well: var(--color-gray-2);
28
- --ws-field: var(--color-white); /* fields are white on the cream (21 Oct 2026) */
29
- --ws-tint-accent: var(--color-surface-stripe);
30
- --ws-tint-needs: color-mix(in srgb, var(--color-brand-salmon) 10%, var(--color-white));
31
- --ws-tint-live: color-mix(in srgb, var(--color-stat-positive) 12%, var(--color-white));
32
- --ws-edge: var(--color-border-default);
32
+ --ws-well: var(--ws-tray);
33
+ --ws-field: var(--color-surface); /* fields are white on the cream (21 Oct 2026) */
34
+ --ws-tint-accent: color-mix(in srgb, var(--color-bg-page) 96%, #4f4c7c); /* #f7f4f4: the zebra row, the page a step cooler */
35
+ --ws-tint-needs: color-mix(in srgb, var(--ws-chart-under-half) 10%, var(--color-surface));
36
+ --ws-tint-live: color-mix(in srgb, var(--ws-chart-finished) 12%, var(--color-surface));
37
+ --ws-edge: var(--color-gray-stroke);
33
38
  --ws-edge-card: var(--color-gray-3); /* the designer's border/card */
34
- --ws-edge-chip: #d9d5d0; /* the designer's border/chip, not a kit colour */
35
- --ws-edge-slot: #e2e2e2; /* the designer's border/slot, not a kit colour */
36
- --ws-edge-tray: #d9d3cb; /* the designer's border/tray, not a kit colour */
39
+ --ws-edge-card-1x: color-mix(in srgb, var(--ws-edge-card) 50%, transparent); /* the card edge on a screen under 1.5 dppx, where 0.5 px rounds up to 1 */
40
+ --ws-edge-chip: color-mix(in srgb, var(--ws-edge-card) 75%, #ebdbc7); /* #d9d5d0, the designer's border/chip: the card edge, warmed */
41
+ --ws-edge-slot: color-mix(in srgb, var(--ws-edge-card) 62.5%, #fbfbfb); /* #e2e2e2, the designer's border/slot: the card edge, lighter */
42
+ --ws-edge-tray: color-mix(in srgb, var(--ws-tray) 84%, rgb(112 74.5 24.5)); /* #d9d3cb, the designer's border/tray: the tray, a warm step darker */
37
43
  --ws-chart-foot: color-mix(in srgb, var(--color-bg-page) 95%, var(--color-gray-8));
44
+ /* Semantic names the dark theme swaps (dark-theme notes, 4 Nov 2026). Each is
45
+ the light value the kit already painted, so none moves a light pixel. */
46
+ --ws-raised: var(--color-bg-page); /* a thing lifted off the page: menu, popover, tooltip, dialog, panel, toast */
47
+ --ws-track: var(--ws-tray); /* an empty track: meter, upload bar, password segment, a pending stat */
48
+ --ws-field-ink: color-mix(in srgb, var(--color-text-body) 46.25%, #040404); /* #292929, a field's words: the body words, darker */
49
+ --ws-field-mark: var(--color-text-heading); /* a field's marks (chevron, calendar, eye, steppers): navy; the navy ground re-points it (promoted from Input, 0.5.0) */
50
+ --ws-on-act: var(--color-white); /* words and marks on the act fill (the navy primary, a pressed or chosen item) */
51
+ --ws-ink: var(--color-text-heading); /* the ink of Seth's alpha washes and lines (a hover, a scrollbar, a track): color-mix(in srgb, var(--ws-ink) 5%, transparent) */
52
+ --ws-shade: var(--color-text-heading); /* the tint of a float's drop: the heading in light, black in dark */
53
+ /* The two as channels, kept for apps that wrote rgba(var(--ws-ink-rgb), .05) before 0.5.0. They are the default's
54
+ values and do not follow a palette: the kit reads --ws-ink and --ws-shade. */
55
+ --ws-ink-rgb: 9, 53, 85;
56
+ --ws-shade-rgb: 9, 53, 85;
57
+ /* A message on the act's own ground (a toast, a note tip, the site footer): the act and its words in light; in dark
58
+ the brand navy and white, a brand pair whose words stay AA under any palette (D12). */
59
+ --ws-inverse: var(--color-text-heading);
60
+ --ws-on-inverse: var(--ws-on-act);
61
+ --ws-control-off: color-mix(in srgb, var(--color-text-muted) 80%, #e3e3e3); /* #7f7f7f, an off control's fill (a switch's track at rest): the muted words a step lighter, 3:1 as a control */
62
+ /* Promoted at integration (0.5.0, 4 Nov 2026) from the packages' scoped stand-ins. */
63
+ --ws-raised-sunk: var(--ws-surface-sunk); /* sunk inside a raised surface (menu, popover, dialog, panel): the house sunk in light, a step that still shows in dark */
64
+ --ws-edge-hover: #aaa49d; /* North (style1.css:80): an outlined control's 0.5 px edge under the pointer, not a kit colour */
65
+ --ws-act-hover: #0f4a73; /* North: the navy act a shade brighter under the pointer, not a kit colour */
66
+ --ws-act-light: color-mix(in srgb, var(--ws-on-act) 24%, transparent); /* North: the soft light under the pointer on the navy act */
67
+ --ws-agent-tally: #2c4870; /* Seth's agent/tally: a softer act (the figure tabs' current cell, a seat meter's fill, a hatch) */
68
+ /* The other assistants' tones (Seth's agent/coach, agent/growth, agent/recruit; palette contract, D15), each a data tone. */
69
+ --ws-agent-coach: var(--color-stat-positive);
70
+ --ws-agent-growth: var(--ws-chart-past-half);
71
+ --ws-agent-recruit: var(--ws-chart-under-half);
72
+ --ws-mask: #000; /* the opaque stop of a fade or tick mask: only its alpha is read, it never paints */
73
+ --ws-mark-muted: color-mix(in srgb, var(--color-text-muted) 76%, #fcfcfc); /* #8a8a8a, Seth's resting mark grey: nav icons at rest, the not-checked dash, axis greys (3.3:1 on the cream, a mark, never words) */
74
+ --ws-chart-rest: color-mix(in srgb, var(--ws-tray) 90%, #252525); /* #d9d9d9, Seth's "what stays" ground in a share bar: the tray, darker */
75
+ --ws-ghost: color-mix(in srgb, var(--ws-well-hover) 98%, #b24c17); /* #e3dfdb, North's ghost chart shape behind a loading shimmer: the rim under the pointer, warmer */
76
+ --ws-veil: color-mix(in srgb, var(--ws-page) 30%, transparent); /* the page seen through behind a floating chat bar (with --ws-blur-panel) */
77
+ --ws-word-answer: color-mix(in srgb, var(--color-text-body) 71.25%, #040404); /* #3d3d3d, North's answer ink: a chat answer's words, a step softer than the field ink */
78
+
79
+ /* === The rimmed tray (D5, 4 Nov 2026) ===
80
+ Seth's product card, in both Fia frames and North: the #EDEDED tray shows as a
81
+ 1 px rim around the cream surface, concentric corners (8 outside, 7 inside;
82
+ 12 and 11 for a drawer), an optional foot on the rim, rows joined by 0.5 px
83
+ full-width dividers, no outline, no shadow at rest. */
84
+ --ws-tray: var(--color-gray-2);
85
+ --ws-rim: var(--ws-line);
86
+ --ws-divider: var(--ws-hairline) solid var(--ws-edge);
87
+ --ws-divider-inset: inset 0 var(--ws-hairline) 0 var(--ws-edge); /* the same line drawn as a shadow on a row's top, so it takes no room (CheckRow, Matrix, ListDetail; promoted 0.5.0) */
88
+ --ws-well-hover: #e4e2df; /* North: a well card's frame under the pointer (style1.css:268), not a kit colour */
89
+
90
+ /* === The stage (North, style1.css:13-78; insets per D3) ===
91
+ The page ground is a cool-to-cream wash; the stage is white glass over it with
92
+ a 1 px edge. #ebf0f5 and #fef9f6 are Seth's, not kit colours; each is a contract
93
+ token, so a palette moves the wash without writing a gradient. */
94
+ --ws-frame-top: #ebf0f5; /* the wash's cool top (palette contract, D15) */
95
+ --ws-stage-foot: #fef9f6; /* a washed stage's warm foot (palette contract, D15) */
96
+ --ws-frame: linear-gradient(180deg, var(--ws-frame-top) 0, var(--color-bg-page) 640px) var(--color-bg-page);
97
+ --ws-stage-wash: linear-gradient(180deg, var(--color-bg-page), var(--ws-stage-foot));
98
+ --ws-glass: color-mix(in srgb, var(--color-surface) 59%, transparent); /* white at 59 % over the wash (Seth), so it follows the surface */
99
+ --ws-glass-blur: 4px;
100
+ --ws-glass-blur-chat: 28px;
101
+ --ws-edge-stage: var(--ws-page); /* the glass stage's 1 px edge: the shell's grey */
102
+ --ws-stage-inset-top: 13px;
103
+ --ws-stage-inset: var(--space-sm);
38
104
 
39
105
  /* === Words in a data tone (colour) ===
40
106
  Ignite globals.css (15 Oct 2026): salmon and teal fail AA as small words,
41
107
  so words take an AA step of the same tone. ws-word-needs is the kit's own
42
108
  --color-text-brand-strong (0.3.0), which Ignite wrote as the same hex
43
109
  while it was on kit 0.2.1. */
44
- --ws-word-needs: var(--color-text-brand-strong);
45
- --ws-word-positive: color-mix(in srgb, var(--color-stat-positive) 85%, var(--color-brand-navy));
110
+ /* #A84B3C was #B35040, 4.33:1 on the #EDEDED tray; darkened, hue held, until it clears 4.5 on every light ground
111
+ (2026-11-04, D2). The kit's --color-text-brand-strong reads it (D15: the kit's word follows the palette's). */
112
+ --ws-word-needs: #A84B3C;
113
+ /* 85% -> 76% teal on 4 Nov 2026 (D2): at 85% it was 4.48:1 on the #EDEDED tray
114
+ and on its own live tint, 4.22 on a pressed row; 76% clears 4.5 on all of them. */
115
+ --ws-word-positive: color-mix(in srgb, var(--ws-chart-finished) 76%, var(--color-text-heading));
116
+ /* The rest of the tones as words (D2): each is its mark tone, or the AA step of
117
+ it, on the cream, white, the sunk plate and the #EDEDED tray. Ratios are in
118
+ tokens.md, computed by scripts/generate-tokens.mjs, which stops on a fail. */
119
+ --ws-word-needs-work: color-mix(in srgb, var(--ws-chart-needs-work) 37.5%, rgb(142.2 4.8 68)); /* #b42d68: Seth's pink #f370a4 is 2.34 on the tray; Ignite ships this step (globals.css:358) */
120
+ --ws-word-alert: var(--ws-chart-alert); /* Seth's status red passes as words (6.13 on the tray) */
121
+ --ws-word-past-half: var(--ws-chart-past-half); /* the purple passes as words (5.06 on the tray) */
122
+ --ws-tint-needs-work: color-mix(in srgb, var(--ws-chart-needs-work) 20%, var(--color-bg-page)); /* the needs-work tag (Seth 301:1630) */
46
123
 
47
124
  /* === Chart tones (colour) ===
48
125
  Ignite globals.css, the designer's "Team practice" radial and "Fia
49
126
  charts, new style" (13 to 14 Oct 2026). The purple, the fades and the
50
127
  tints are the designer's, not kit colours (reported in 17-decisions.md). */
51
- --ws-chart-finished: var(--color-stat-positive);
128
+ --ws-chart-finished: #098486; /* the kit's teal; --color-stat-positive reads it (D15) */
52
129
  --ws-chart-past-half: #6d4fc2;
53
130
  --ws-chart-under-half: var(--color-brand-salmon);
54
- --ws-chart-empty: var(--color-gray-1);
131
+ --ws-chart-empty: color-mix(in srgb, var(--color-surface) 97.6%, #050505); /* #f9f9f9: white, a hair under */
55
132
  --ws-chart-dot: color-mix(in srgb, var(--color-bg-page) 91%, var(--color-gray-8));
56
133
  --ws-chart-navy-light: #2e6088;
57
- --ws-chart-navy-fade: #a8c0d3;
58
- --ws-chart-salmon-fade: #ffd2c8;
59
- --ws-chart-purple-fade: #d8ccf6;
60
- --ws-chart-teal-fade: #b0e2dd;
61
- --ws-chart-finished-tint: #9fddd6;
62
- --ws-chart-past-half-tint: #cbbdf3;
63
- --ws-chart-under-half-tint: #f9dfc6;
134
+ /* The fades and tints: each its tone over a near-white, the designer's value exactly (a partner whose exact value
135
+ repeats is written to ten places, so a gradient between two of them paints the same pixels as the hex did). */
136
+ --ws-chart-navy-fade: color-mix(in srgb, var(--ws-chart-navy-light) 20%, rgb(198.5 216 229.75)); /* #a8c0d3 */
137
+ --ws-chart-salmon-fade: color-mix(in srgb, var(--ws-chart-under-half) 25%, #fff2ec); /* #ffd2c8 */
138
+ --ws-chart-purple-fade: color-mix(in srgb, var(--ws-chart-past-half) 10%, rgb(227.8888888889 217.8888888889 251.7777777778)); /* #d8ccf6 */
139
+ --ws-chart-teal-fade: color-mix(in srgb, var(--ws-chart-finished) 20%, rgb(217.75 249.5 242.75)); /* #b0e2dd */
140
+ --ws-chart-finished-tint: color-mix(in srgb, var(--ws-chart-finished) 20%, rgb(196.5 243.25 234)); /* #9fddd6 */
141
+ --ws-chart-past-half-tint: color-mix(in srgb, var(--ws-chart-past-half) 15%, rgb(219.5882352941 208.4117647059 251.6470588235)); /* #cbbdf3 */
142
+ --ws-chart-under-half-tint: color-mix(in srgb, var(--ws-chart-under-half) 20%, rgb(247.5 250.25 224.5)); /* #f9dfc6 */
64
143
  --ws-chart-cell-edge: var(--ws-edge-slot);
144
+ --ws-chart-needs-work: #f370a4; /* Seth's "Needs work" mark (Grow 301:1630); Ignite globals.css:357 */
145
+ --ws-chart-alert: #b1042f; /* Seth's status red, North --alert (style1.css:7) and Fixes 313:2712 */
146
+
147
+ /* === Rating tones (D10, 4 Nov 2026) ===
148
+ Marks keep Seth's tone; their words take --ws-word-positive,
149
+ --color-text-interactive and --ws-word-needs-work. Salmon stays "needs you". */
150
+ --ws-rating-strong: var(--color-stat-positive);
151
+ --ws-rating-middle: var(--color-brand-mid-blue);
152
+ --ws-rating-needs-work: var(--ws-chart-needs-work);
153
+
154
+ /* === Loading shimmer (North style1.css:1458-1469; one quiet tone since 0.5.1, Amit 10 Nov 2026) ===
155
+ The ghost grey with a lighter pass of the same grey: no chart hues. North's timing stays (--ws-loop-shimmer,
156
+ --ws-ease-shimmer). */
157
+ /* Drawn at 300% wide, so a still frame (position 0 or 100%, reduced motion) shows a third of it: the pass runs from
158
+ 34% to 66%, so both ends of the sweep are the plain ghost. The ground is the ghost itself, the same at rest and in
159
+ motion, so it shows on the cream (1.29:1) and on the tray (1.13:1) and a ghost in a card's foot needs no ground of
160
+ its own; the pass is the ghost 70% of the way to the cream, 1.07:1 off the cream and 1.06:1 off the tray. Blended
161
+ "in srgb", as the stops always were (a derived stop would otherwise blend in Oklab). */
162
+ --ws-shimmer-ground: var(--ws-ghost); /* #e3dfdb */
163
+ --ws-shimmer: linear-gradient(100deg in srgb, var(--ws-shimmer-ground) 0 34%,
164
+ color-mix(in srgb, var(--ws-shimmer-ground) 30%, var(--color-bg-page)) 50%,
165
+ var(--ws-shimmer-ground) 66% 100%); /* the pass #f6f3f0 */
65
166
 
66
167
  /* === Chat card tints and the scrim (colour) ===
67
168
  Ignite globals.css "Agent cards" (8 Oct 2026) and the motion block. */
68
- --ws-card-tint-blue: color-mix(in srgb, var(--color-brand-mid-blue) 10%, var(--color-white));
69
- --ws-card-tint-done: color-mix(in srgb, var(--color-stat-positive) 10%, var(--color-white));
70
- --ws-scrim: color-mix(in srgb, var(--color-brand-navy) 35%, transparent);
169
+ --ws-card-tint-blue: color-mix(in srgb, var(--ws-rating-middle) 10%, var(--color-surface));
170
+ --ws-card-tint-done: color-mix(in srgb, var(--ws-chart-finished) 10%, var(--color-surface));
171
+ --ws-scrim: color-mix(in srgb, var(--color-text-heading) 35%, transparent);
71
172
 
72
173
  /* === Hero washes (gradients, CSS only) ===
73
174
  Ignite globals.css (22 to 23 Oct 2026, from the designer's Team
74
175
  reference): three faint radial washes each, still, never moving. The
75
176
  design-system token page cannot hold a gradient, so they are not in
76
177
  design-system/tokens.json; the PageHero README carries them. */
178
+ /* D15: the blue is the link words, the navy the heading; the rose, the pink and the bright blue are the AI colours
179
+ drawn from the chart tones (their exact values in the default). */
180
+ --ws-glow-rose: color-mix(in srgb, var(--ws-chart-under-half) 50%, #ebb8ca); /* --color-ai-rose #f59593 */
181
+ --ws-glow-pink: color-mix(in srgb, var(--ws-chart-needs-work) 90%, #ad167c); /* --color-ai-pink #ec67a0 */
182
+ --ws-glow-blue: color-mix(in srgb, var(--ws-chart-navy-light) 10%, rgb(57.1111111111 158.2222222222 251.5555555556)); /* --color-ai-blue #3898f0 */
77
183
  --ws-team-glow:
78
- radial-gradient(75% 70% at 10% 0%, color-mix(in srgb, var(--color-brand-mid-blue) 14%, transparent), transparent),
79
- radial-gradient(70% 75% at 95% 100%, color-mix(in srgb, var(--color-ai-rose) 22%, transparent), transparent),
80
- radial-gradient(55% 60% at 70% 45%, color-mix(in srgb, var(--color-ai-pink) 8%, transparent), transparent);
184
+ radial-gradient(75% 70% at 10% 0%, color-mix(in srgb, var(--color-text-interactive) 14%, transparent), transparent),
185
+ radial-gradient(70% 75% at 95% 100%, color-mix(in srgb, var(--ws-glow-rose) 22%, transparent), transparent),
186
+ radial-gradient(55% 60% at 70% 45%, color-mix(in srgb, var(--ws-glow-pink) 8%, transparent), transparent);
81
187
  --ws-cool-glow:
82
- radial-gradient(75% 70% at 10% 0%, color-mix(in srgb, var(--color-brand-mid-blue) 16%, transparent), transparent),
83
- radial-gradient(60% 70% at 92% 30%, color-mix(in srgb, var(--color-ai-blue) 10%, transparent), transparent),
84
- radial-gradient(70% 60% at 60% 100%, color-mix(in srgb, var(--color-brand-navy) 6%, transparent), transparent);
188
+ radial-gradient(75% 70% at 10% 0%, color-mix(in srgb, var(--color-text-interactive) 16%, transparent), transparent),
189
+ radial-gradient(60% 70% at 92% 30%, color-mix(in srgb, var(--ws-glow-blue) 10%, transparent), transparent),
190
+ radial-gradient(70% 60% at 60% 100%, color-mix(in srgb, var(--color-text-heading) 6%, transparent), transparent);
191
+ /* The working orb (StatusScreen): the AI cyan, blue and violet, drawn from the chart tones. */
192
+ --ws-orb: radial-gradient(circle at 30% 30% in srgb,
193
+ color-mix(in srgb, var(--ws-chart-finished) 37.5%, rgb(26.6 218.4 244.4)),
194
+ var(--ws-glow-blue) 45%,
195
+ color-mix(in srgb, var(--ws-chart-past-half) 37.5%, rgb(160.2 122.2 251.6)) 80%); /* #14bacb, #3898f0, #8d6ae6 */
85
196
 
86
197
  /* === Type sizes and leading ===
87
198
  Ignite globals.css "Type, sizes and spacing" (13 Oct 2026). 11, 15 and
@@ -97,6 +208,22 @@
97
208
  --ws-text-display: var(--font-size-7xl);
98
209
  --ws-leading-message: var(--space-lg);
99
210
  --ws-leading-title: calc(var(--space-lg) + var(--space-xxs));
211
+ /* Seth's steps (D6, 4 Nov 2026; Grow, Fixes, Inbox and Tally frames). Built on
212
+ his base values, not the Figma-scaled fractions (D3). */
213
+ --ws-text-control: var(--font-size-xs); /* control words: tabs, buttons, tags, links, status, labels; 500 */
214
+ --ws-leading-control: 18px;
215
+ --ws-text-section: var(--ws-text-chart); /* section titles and row titles, 600; row names, 500 */
216
+ --ws-leading-section: 22px;
217
+ --ws-leading-row: calc(var(--space-md) + var(--space-xxs)); /* a row's name: 15 / 20 */
218
+ --ws-leading-micro: 13px; /* the 11 px sub-line, a mark or meta that passes AA */
219
+ --ws-text-figure-row: 28px; /* a list row's figure (301:1773) */
220
+ --ws-leading-figure-row: var(--space-xl);
221
+ --ws-text-figure: var(--space-xl); /* a tile's figure, 32 / 38 (313:2691) */
222
+ --ws-leading-figure: 38px;
223
+ --ws-text-figure-lg: 44px; /* a pane's figure (301:2026, 308:2484, 319:3471) */
224
+ --ws-leading-figure-lg: var(--space-3xl);
225
+ --ws-text-score: var(--space-6xl); /* the report's hero figure, 96 / 96 (301:1670) */
226
+ --ws-leading-score: var(--space-6xl);
100
227
 
101
228
  /* === Gaps and insets ===
102
229
  Ignite globals.css; ws-card-inset and ws-band-inset from Lokesh's
@@ -106,8 +233,10 @@
106
233
  --ws-gap-loose: var(--space-sm);
107
234
  --ws-gap-component: var(--space-md);
108
235
  --ws-gap-group: var(--space-lg);
109
- --ws-gap-turn: calc(var(--space-lg) - var(--space-xxs) / 2);
110
- --ws-gutter: var(--space-lg);
236
+ --ws-gap-turn: calc(var(--space-lg) + var(--space-xxs)); /* North's docked thread, 28 */
237
+ --ws-gap-block: var(--space-xl); /* Seth's report blocks, 32 (Grow 301:1657, 305:2307) */
238
+ --ws-gap-section: calc(var(--space-3xl) + var(--space-xs)); /* between page sections, 56 (North, Tally 319:3302) */
239
+ --ws-gutter: var(--space-xl); /* Seth's 32 page gutter (D4); a phone keeps 16 */
111
240
  --ws-card-padding: var(--space-sm);
112
241
  --ws-card-padding-lg: var(--space-md);
113
242
  --ws-card-inset: calc(var(--space-md) + var(--space-xxs));
@@ -117,27 +246,55 @@
117
246
 
118
247
  /* === Corners ===
119
248
  Ignite globals.css, the designer's ladder (15 Oct 2026): a bar 1, a chip
120
- 2, a control 4, a row 6, a card 8, a bubble 12, a panel 16. */
121
- --ws-radius-bar: calc(var(--radius-xs) / 2);
122
- --ws-radius-chip: var(--radius-xs);
123
- --ws-radius-control: var(--radius-sm);
124
- --ws-radius-row: var(--radius-md);
125
- --ws-radius-card: var(--radius-lg);
126
- --ws-radius-bubble: calc(var(--radius-lg) + var(--radius-sm));
127
- --ws-radius-panel: var(--radius-xl);
249
+ 2, a control 4, a row 6, a card 8, a bubble 12, a panel 16. Written as
250
+ lengths, not on --radius-*, since 0.5.0: Tailwind v4 owns --radius-xs to
251
+ --radius-2xl (its xl is 12, the kit's 16) and shadcn hosts re-point them to
252
+ their --radius, so a product corner must not move with the host's. */
253
+ --ws-radius-bar: 1px;
254
+ --ws-radius-chip: 2px;
255
+ --ws-radius-control: 4px;
256
+ --ws-radius-row: 6px;
257
+ --ws-radius-card: 8px;
258
+ --ws-radius-menu: 10px; /* North's menus, flyouts, panels and brief rows (style1.css:657) */
259
+ --ws-radius-card-inner: calc(var(--ws-radius-card) - var(--ws-rim)); /* the cream inside the rim (D5) */
260
+ --ws-radius-bubble: 12px;
261
+ --ws-radius-drawer: var(--ws-radius-bubble); /* a drawer's rimmed tray, 12 outside (D5) */
262
+ --ws-radius-drawer-inner: calc(var(--ws-radius-drawer) - var(--ws-rim));
263
+ --ws-radius-panel: 16px;
128
264
 
129
265
  /* === Shadows and rings ===
130
266
  Ignite globals.css. The product is flat: an edge, not a float. The band's
131
267
  five inset layers are the designer's tray shade. */
132
268
  --ws-shadow-hairline: 0 0 0 var(--ws-hairline) var(--ws-edge-card);
269
+ --ws-shadow-hairline-in: inset 0 0 0 var(--ws-hairline) var(--ws-edge-card); /* the same edge drawn inside, so a scroller never clips it (every outlined control) */
133
270
  --ws-shadow-band: inset 0 var(--ws-hairline) 0 var(--ws-edge-tray), inset 0 28px 8px 0 rgba(0, 0, 0, 0),
134
271
  inset 0 18px 7px 0 rgba(0, 0, 0, 0.01), inset 0 10px 6px 0 rgba(0, 0, 0, 0.03),
135
272
  inset 0 4px 4px 0 rgba(0, 0, 0, 0.05), inset 0 1px 2px 0 rgba(0, 0, 0, 0.06);
136
273
  --ws-shadow-lift: var(--shadow-card-hover);
137
- --ws-ring-selected: 0 0 0 2px color-mix(in srgb, var(--color-brand-navy) 55%, transparent);
138
- --ws-card-ring-lit: 0 0 0 2px color-mix(in srgb, var(--color-brand-navy) 30%, transparent);
139
- --ws-card-ring-person: inset 0 0 0 1px color-mix(in srgb, var(--color-brand-navy) 12%, transparent);
140
- --ws-focus-inset: inset 0 0 0 2px var(--color-text-interactive);
274
+ --ws-ring-selected: 0 0 0 2px color-mix(in srgb, var(--ws-ink) 55%, transparent);
275
+ --ws-card-ring-lit: 0 0 0 2px color-mix(in srgb, var(--ws-ink) 30%, transparent);
276
+ --ws-card-ring-person: inset 0 0 0 1px color-mix(in srgb, var(--ws-ink) 12%, transparent);
277
+ /* One family for everything that floats (North style1.css:87, :209, :657, :507):
278
+ a single negative-spread drop, tinted by --ws-shade, so it turns black in
279
+ dark; --ws-float-rim adds the 0.5 px light rim dark needs (none in light). */
280
+ --ws-float-rim: 0 0 0 0 transparent;
281
+ --ws-shadow-pop: var(--ws-float-rim), 0 12px 32px -16px color-mix(in srgb, var(--ws-shade) 35%, transparent);
282
+ --ws-shadow-menu: var(--ws-float-rim), 0 16px 32px -16px color-mix(in srgb, var(--ws-shade) 35%, transparent);
283
+ --ws-shadow-tip: var(--ws-float-rim), 0 16px 32px -20px color-mix(in srgb, var(--ws-shade) 45%, transparent);
284
+ --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);
285
+ --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); /* the centred chat bar (North) */
286
+ /* Seth's hover washes (North): a list row .03, a nav or menu row .05, an icon button .06. */
287
+ /* Each alpha is the 8-bit step rgba(.03 / .05 / .06) always painted (8, 13 and 15 of 255), so a wash laid as a
288
+ gradient over a fill paints exactly as it did. */
289
+ --ws-hover-faint: color-mix(in srgb, var(--ws-ink) 3.137254902%, transparent);
290
+ --ws-hover: color-mix(in srgb, var(--ws-ink) 5.0980392157%, transparent);
291
+ --ws-hover-strong: color-mix(in srgb, var(--ws-ink) 5.8823529412%, transparent);
292
+ /* Focus (D8): a 2 px navy outline 2 px out on :focus-visible everywhere (North
293
+ style1.css:17); inside a dense row or a clipped box, the inset ring. */
294
+ --ws-focus-color: var(--color-text-heading);
295
+ --ws-focus-width: var(--ws-ring);
296
+ --ws-focus-offset: var(--ws-ring);
297
+ --ws-focus-inset: inset 0 0 0 var(--ws-focus-width) var(--ws-focus-color);
141
298
 
142
299
  /* === Stroke widths ===
143
300
  ws-hairline from Ignite globals.css (every edge 0.5 px, 15 Oct 2026); the
@@ -157,18 +314,20 @@
157
314
  --ws-control-h: var(--space-xl);
158
315
  --ws-control-h-md: calc(var(--space-xl) + var(--space-xxs));
159
316
  --ws-touch: 40px;
317
+ --ws-touch-public: 44px; /* every act on a public page (14-accessibility.md:10) */
160
318
  --ws-row-h: var(--space-3xl);
161
319
  --ws-row-h-dense: var(--space-2xl);
162
320
  --ws-composer-h: 52px;
163
321
  --ws-header-h: calc(var(--space-3xl) + var(--space-xs));
164
322
  --ws-topbar-h: var(--space-3xl);
165
323
  --ws-band-h: 80px;
166
- --ws-rail-width: calc(var(--space-2xl) + var(--space-xl));
324
+ --ws-rail-width: var(--space-4xl); /* North's folded rail, 64 (app.js B9) */
167
325
  --ws-sidebar-width: calc(var(--space-9xl) + var(--space-xl));
168
326
  --ws-thing-width: calc(var(--space-9xl) * 2 + var(--space-2xl));
169
327
  --ws-chart-card-w: calc(var(--space-9xl) * 2 + var(--space-8xl) - var(--space-xxs));
170
328
  --ws-chart-card-min: 480px;
171
329
  --ws-column-width: calc(var(--space-9xl) * 3 + var(--space-3xl) + var(--space-xs));
330
+ --ws-float-width: calc(var(--space-9xl) * 1.5); /* a popover's width and a note's wrap, 300 (North; Seth's notes) */
172
331
  --ws-icon-sm: 12px;
173
332
  --ws-icon: 16px;
174
333
  --ws-icon-lg: 20px;
@@ -180,22 +339,76 @@
180
339
  --ws-tracking-display: -0.03em;
181
340
 
182
341
  /* === Motion ===
183
- Ignite globals.css, the motion system (29 Sep to 22 Oct 2026): one soft
184
- curve, short steps, one working beat. No overshoot since 22 Oct 2026, so
185
- ws-ease-spring is the soft curve itself. */
186
- --ws-duration-instant: 120ms;
342
+ Ignite globals.css, the motion system (29 Sep to 22 Oct 2026), extended on
343
+ 4 Nov 2026 (D7) with Seth's North DialKit config (north-motion notes): tokens
344
+ named by role. Soft is still the default curve; shapes that change size use
345
+ grow, layout uses shift, a shared element in flight morph; only small marks
346
+ and indicators may overshoot (pop, lift). Reduced motion: all still.
347
+ The springs are not written here: scripts/token-model.mjs samples every
348
+ preset in design-tokens.json motion.springs into --ws-spring-<name> (a
349
+ linear() curve) and --ws-spring-<name>-duration, from the motion library's
350
+ own solver, so a CSS transition moves on Seth's exact spring. */
351
+ --ws-duration-instant: 120ms; /* press feedback */
352
+ --ws-duration-exit: 120ms; /* every exit: menus, tooltips, details (North .1 to .16 s) */
187
353
  --ws-duration-gentle: 200ms;
188
- --ws-duration-settle: 320ms;
354
+ --ws-duration-hover: 200ms; /* hover colour, tint, edge, opacity (North .2 s) */
355
+ --ws-duration-text: 250ms; /* text colour and small fades: a segment's words, a nav label, a card ground (North .25 s) */
356
+ --ws-duration-settle: 320ms; /* details settling, tooltip rows */
357
+ --ws-duration-reveal: 350ms; /* a reveal: a link underline growing, a top bar's ground, a chevron (North .35 s) */
358
+ --ws-duration-shrink: 400ms; /* a tile closing back */
189
359
  --ws-duration-calm: 420ms;
190
360
  --ws-duration-glide: 400ms;
361
+ --ws-duration-morph: 450ms; /* a shared element in flight, a band folding */
362
+ --ws-duration-grow: 550ms; /* a tile growing open from its slot */
363
+ --ws-duration-shift: 550ms; /* a panel docking, columns trading width */
364
+ --ws-duration-fill: 700ms; /* a bar filling */
365
+ --ws-duration-draw: 900ms; /* a chart drawing inside an opened card, a gauge */
366
+ --ws-duration-draw-chat: 1500ms; /* a chart sweeping in inside chat */
367
+ --ws-duration-fill-page: 1700ms; /* a dashboard building in: its tiles' charts and its goal bars filling (North "Metric + goal bars fill") */
368
+ --ws-duration-build: 2400ms; /* a page's first-paint build-in, at most */
191
369
  --ws-stagger: 30ms;
370
+ --ws-stagger-detail: 22ms; /* details inside an opening tile */
371
+ --ws-stagger-row: 45ms; /* rows in a tooltip or an opened card */
372
+ --ws-stagger-part: 70ms; /* blocks under a chart arriving */
373
+ --ws-ripple: 4ms; /* per tick, a hover grow spreading along a run */
374
+ --ws-stagger-square: 35ms; /* details inside an opening heatmap square (North tileStagger) */
375
+ --ws-hover-intent: 40ms; /* before a hover opens a tile */
376
+ --ws-hover-leave: 60ms; /* a hover-opened tile closes this long after the pointer leaves (North) */
377
+ --ws-hover-grace: 180ms; /* a tooltip stays after the pointer leaves its mark */
378
+ --ws-close-delay: 160ms; /* a flyout closes after the pointer leaves */
192
379
  --ws-sweep: calc(var(--ws-duration-calm) - var(--ws-duration-gentle));
193
- --ws-loop: 1.2s;
380
+ --ws-loop: 1s; /* working dots, the load dot (North 1 s; was 1.2 s) */
381
+ --ws-loop-status: 1.6s; /* a status line's shimmering words */
382
+ --ws-loop-shimmer: 1.8s; /* a loading shimmer over ghost shapes */
194
383
  --ws-loop-slow: 2.4s;
384
+ --ws-loop-ambient: 6s; /* the brand sheen on a selected glass edge */
195
385
  --ws-ease-soft: cubic-bezier(0.22, 1, 0.36, 1);
196
386
  --ws-ease-exit: cubic-bezier(0.4, 0, 1, 1);
197
387
  --ws-ease-glide: cubic-bezier(0.75, 0, 0.25, 1);
198
388
  --ws-ease-steady: linear;
199
389
  --ws-ease-spring: var(--ws-ease-soft);
390
+ --ws-ease-settle: cubic-bezier(0.16, 1, 0.3, 1); /* things that land and rest: a mark, a bar fill */
391
+ --ws-ease-grow: cubic-bezier(0.32, 0.72, 0, 1); /* a shape changing size: a tile open and close, a switch thumb */
392
+ --ws-ease-shift: cubic-bezier(0.25, 1, 0.5, 1); /* layout moving: docking, columns */
393
+ --ws-ease-morph: cubic-bezier(0.5, 0, 0.15, 1); /* a shared element in flight */
394
+ --ws-ease-sweep: cubic-bezier(0.45, 0, 0.55, 1); /* a chart drawing left to right */
395
+ --ws-ease-commit: cubic-bezier(0.65, 0, 0.35, 1); /* a decisive one-shot: sending, a check mark */
396
+ --ws-ease-shimmer: cubic-bezier(0.4, 0, 0.2, 1); /* loading sweeps */
397
+ --ws-ease-ambient: cubic-bezier(0.45, 0, 0.3, 1); /* the slow brand sheen */
398
+ --ws-ease-loop: cubic-bezier(0.42, 0, 0.58, 1); /* a symmetric loop (ease-in-out): working dots, pulses */
399
+ --ws-ease-pop: cubic-bezier(0.34, 1.4, 0.64, 1); /* overshoot, small marks only */
400
+ --ws-ease-lift: cubic-bezier(0.22, 1.25, 0.36, 1); /* overshoot, ticks and wedges growing on hover */
200
401
  --ws-press-scale: 0.97;
402
+ --ws-press-scale-round: 0.94; /* a round icon button: the voice act (North) */
403
+ --ws-press-scale-send: 0.92; /* the send act (North) */
404
+ --ws-open-scale: 0.97; /* a menu, a popover or the docked panel opens from this scale (North) */
405
+ --ws-open-scale-pane: 0.98; /* a dialog window opens from this scale (North) */
406
+ --ws-open-scale-toast: 0.96; /* a toast arrives from this scale (North) */
407
+ --ws-pop-scale: 0.94; /* tooltips start and leave at this scale */
408
+ --ws-grow-scale: 1.16; /* a hovered tick or ring wedge */
409
+ --ws-dim: 0.3; /* the rest of a chart while one part is hovered */
410
+ --ws-nudge: var(--space-xxs); /* tooltip, menu and arrow offsets */
411
+ --ws-drop: var(--space-sm); /* a greeting or placeholder rolling in */
412
+ --ws-blur-arrive: 3px; /* details arriving */
413
+ --ws-blur-panel: 8px; /* a panel arriving */
201
414
  }
@@ -36,8 +36,12 @@
36
36
  /* === Greys (11) === */
37
37
  --color-background: #FEFBF9;
38
38
  --color-white: #FFFFFF;
39
+ /* What white is FOR: a marketing card, a well row under the pointer, the current
40
+ AppShell mark. White itself stays white in every theme; this one swaps in dark
41
+ (dark-theme, 2026-11-04). */
42
+ --color-surface: var(--color-white);
39
43
  --color-gray-1: #F9F9F9;
40
- --color-surface-stripe: #F7F4F4; /* warm zebra-stripe tint (table rows, between gray-1 and background) */
44
+ --color-surface-stripe: var(--ws-tint-accent); /* warm zebra-stripe tint (table rows, between gray-1 and background), #F7F4F4: follows the palette's page (D15) */
41
45
  --color-gray-2: #EDEDED;
42
46
  --color-gray-stroke: #E8E8E8;
43
47
  --color-gray-3: #D3D3D3;
@@ -45,7 +49,7 @@
45
49
  --color-gray-6: #7F7F7F;
46
50
  --color-gray-7: #545454;
47
51
  --color-gray-8: #292929;
48
- --color-text-primary: #353E5A;
52
+ --color-text-primary: color-mix(in srgb, var(--color-text-heading) 50%, #61475f); /* #353E5A: between the heading and a grey (D15) */
49
53
 
50
54
  /* === AI gradient (5 stops + composed gradient) === */
51
55
  --color-ai-cyan: #14BACB;
@@ -81,19 +85,22 @@
81
85
  These are the values inherited from boilerplate form + system styling,
82
86
  hoisted into tokens so there is one change-point. CONFIRM exact values
83
87
  with Anjali, then finalise. Do not add more raw status hex to components. */
84
- --color-feedback-error: #ef6b51;
88
+ --color-feedback-error: color-mix(in srgb, var(--ws-chart-under-half) 87.5%, #7f3a04); /* #ef6b51: the salmon tone, deeper (D15) */
85
89
  --color-feedback-success-text: #4f7d24;
86
- --color-feedback-success-bg: #cde3cc;
90
+ --color-feedback-success-bg: color-mix(in srgb, var(--ws-chart-finished) 20%, rgb(254 250.75 221.5)); /* #cde3cc: the teal tone over a pale green (D15) */
87
91
 
88
92
  /* === Homepage capture colours — PROVISIONAL (no Figma variable exists;
89
93
  flagged in the Anjali review doc). homepage/{desktop,mobile}-sections.md */
90
94
  --color-alert: #e90f0f; /* "PROBLEM WITHOUT FELLO" overline red */
91
- --color-stat-positive: #098486; /* GCI calculator teal dollar values */
95
+ --color-stat-positive: var(--ws-chart-finished); /* GCI calculator teal dollar values, #098486: the palette's first chart tone (D15) */
92
96
 
93
97
  /* === Semantic colour tokens — the public consumer-facing names ===
94
98
  Component CSS consumes THESE, never the brand primitives directly.
95
99
  Change a primitive (or its Theme Setting) and every consumer moves. */
96
- --color-bg-page: var(--color-background);
100
+ /* The cream written out, not var(--color-background): shadcn v4 hosts define --color-background in @theme inline
101
+ (var(--background)), and Tailwind emits the host's over the kit's, so the kit's page went host-white, near-black
102
+ under .dark, and empty with shadcn-compat (--background -> --color-bg-page -> --color-background, a cycle). */
103
+ --color-bg-page: #FEFBF9;
97
104
  --color-text-heading: var(--color-brand-navy);
98
105
  --color-text-body: var(--color-gray-7);
99
106
  /* Un-aliased from gray-6 on 2026-09-30. Gray 6 (#7F7F7F) is 4.00:1 on white
@@ -101,30 +108,34 @@
101
108
  failing WCAG AA. The grey ramp keeps its value for fills and rules; this
102
109
  is the corrected one for words, and is not a second opinion about the
103
110
  palette. Same fix felix-slate had already made for the same hex. */
104
- --color-text-muted: #6E6E6E;
111
+ --color-text-muted: #666666;
112
+ /* #6E6E6E -> #666666 on 2026-11-04 (kit 0.5.0, D2): #6E6E6E was 4.36:1 on the
113
+ #EDEDED tray and 4.16 on the grey shell, where Seth's cards and the AppShell
114
+ put muted words. #666666 is the AA step Ignite ships as --ws-word-muted:
115
+ 5.57 cream, 5.74 white, 5.10 plate, 4.90 tray, 4.69 shell. */
105
116
 
106
117
  /* Text-safe forms of the brand and feedback colours. The colours themselves
107
118
  are for fills, rules and borders: salmon on white is 2.69:1 and cannot
108
119
  carry words. These are darkened until they clear 4.5:1 on their own
109
120
  tinted background, hue held. */
110
- --color-text-brand-strong: #B35040;
111
- --color-text-error-strong: #AE4E3B;
112
- --color-text-success-strong: #3C601B;
121
+ --color-text-brand-strong: var(--ws-word-needs); /* #A84B3C (tokens/_product.css says why): the palette's needs-you words (D15) */
122
+ --color-text-error-strong: color-mix(in srgb, var(--ws-word-needs) 95%, #944b00); /* #A74B39, was #AE4E3B (4.28 on a pressed row); darkened, hue held (2026-11-04, D2); the needs-you words a step warmer (D15) */
123
+ --color-text-success-strong: color-mix(in srgb, var(--ws-word-positive) 20%, rgb(72.75 91.74 3.19)); /* #3C601B: the good-news words over an olive (D15) */
113
124
 
114
125
  /* Placeholders are text. Gray 5 was 2.35:1. */
115
- --color-text-placeholder: #6E6E6E;
126
+ --color-text-placeholder: color-mix(in srgb, var(--color-text-muted) 93.75%, #e6e6e6); /* #6E6E6E: the muted words, a step lighter (D15) */
116
127
  /* Overlines + secondary-button ink. (Nav LABELS are navy per final header
117
128
  design 2026-06-11 — they use --color-text-heading, not this.) */
118
129
  --color-text-interactive: var(--color-brand-mid-blue);
119
- --color-border-default: var(--color-gray-stroke);
130
+ --color-border-default: var(--ws-edge); /* #E8E8E8: the palette's row line (D15) */
120
131
  /* Card/control hairlines (dropdown panel, mobile drawer cards, hamburger,
121
132
  Log In outline) — gray-3, deliberately darker than border-default. */
122
- --color-border-hairline: var(--color-gray-3);
133
+ --color-border-hairline: var(--ws-edge-card); /* #D3D3D3: the palette's card edge (D15) */
123
134
  --color-border-btn: var(--color-button-border);
124
135
  --color-bg-dark: var(--color-brand-navy);
125
136
  /* Tinted interaction background — hover AND current-page state share it
126
137
  (final header design defines no separate active tint). */
127
- --color-nav-hover-bg: color-mix(in srgb, var(--color-brand-mid-blue) 5%, transparent);
138
+ --color-nav-hover-bg: color-mix(in srgb, var(--color-text-interactive) 5%, transparent);
128
139
  /* Button gradient is static across rest/hover/active — matches live
129
140
  fello.ai, where only shadow + transform change on interaction. */
130
141
  --gradient-btn-primary: linear-gradient(
@@ -160,9 +171,13 @@
160
171
  --font-size-8xl: 193px; /* LP §8 results "40%" — Figma 192.649 */
161
172
 
162
173
  /* === Spacing scale (8pt base, 14 tokens) === */
174
+ --space-3xs: 2px; /* the half step: 44 kit uses as calc(var(--space-xxs) / 2), and Seth's 2 px gaps (2026-11-04, D4) */
163
175
  --space-xxs: 4px;
176
+ --space-xxs-plus: 6px; /* a step plus the 2 px half step: Seth's button icon gap, row hover pill corner inset, North rows (D4) */
164
177
  --space-xs: 8px;
178
+ --space-xs-plus: 10px; /* Seth's chip and bubble padding, the composer's inside, North sidebar rows (D4) */
165
179
  --space-sm: 12px;
180
+ --space-sm-plus: 14px; /* Seth's bubble sides, the figure edge inside a tile, the pace bar (D4) */
166
181
  --space-md: 16px;
167
182
  --space-lg: 24px;
168
183
  --space-xl: 32px;
@@ -321,10 +336,11 @@
321
336
  --shadow-label-pill: 2px 22px 6px 0 rgba(0, 0, 0, 0),
322
337
  1px 14px 6px 0 rgba(0, 0, 0, 0.01), 1px 8px 5px 0 rgba(0, 0, 0, 0.04),
323
338
  0 3px 4px 0 rgba(0, 0, 0, 0.07), 0 1px 2px 0 rgba(0, 0, 0, 0.08);
324
- --shadow-card-default: 0 1px 2px rgba(9, 53, 85, 0.04),
325
- 0 4px 8px rgba(9, 53, 85, 0.06);
326
- --shadow-card-hover: 0 4px 8px rgba(9, 53, 85, 0.06),
327
- 0 8px 24px rgba(9, 53, 85, 0.08);
339
+ /* The card shadows are the heading navy at 4 to 8% (D15: they follow the palette's heading). */
340
+ --shadow-card-default: 0 1px 2px color-mix(in srgb, var(--color-text-heading) 4%, transparent),
341
+ 0 4px 8px color-mix(in srgb, var(--color-text-heading) 6%, transparent);
342
+ --shadow-card-hover: 0 4px 8px color-mix(in srgb, var(--color-text-heading) 6%, transparent),
343
+ 0 8px 24px color-mix(in srgb, var(--color-text-heading) 8%, transparent);
328
344
  /* Sticky navbar pill + dropdown panel — soft BLACK 4-layer stack, exact
329
345
  values from the final header Figma (extracted from the SVG filter;
330
346
  desktop-states.md §3/§6). The pill's extra 0 189px 53px layer in Figma
@@ -340,7 +356,11 @@
340
356
  --shadow-btn-hover: 0 32px 9px rgba(0, 0, 0, 0), 0 20px 8px rgba(0, 0, 0, 0.02),
341
357
  0 11px 7px rgba(0, 0, 0, 0.06), 0 5px 5px rgba(0, 0, 0, 0.09),
342
358
  0 1px 3px rgba(0, 0, 0, 0.11);
343
- --shadow-focus-ring: 0 0 0 3px rgba(255, 114, 92, 0.2);
359
+ /* The focus ring as a box-shadow, for a part that cannot take an outline. Was
360
+ a salmon halo at 20% (1.21:1 on the cream, not a visible focus). Since
361
+ 2026-11-04 (D8) it draws Seth's North focus: a 2 px navy ring 2 px out, the
362
+ gap in the page colour. 12.3:1 on the cream. */
363
+ --shadow-focus-ring: 0 0 0 2px var(--color-bg-page), 0 0 0 4px var(--color-text-heading);
344
364
 
345
365
  /* === Animation === */
346
366
  --transition-fast: 150ms ease-out;