@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/AGENTS.md CHANGED
@@ -1,4 +1,4 @@
1
- # brand-kit for coding agents (0.4.0)
1
+ # brand-kit for coding agents (0.5.1)
2
2
 
3
3
  Read this before writing UI in any Fello project that uses `@felloinnovations/brand-kit`. It ships inside the
4
4
  package at `node_modules/@felloinnovations/brand-kit/AGENTS.md`. The HubSpot website (felix-theme) is out of scope:
@@ -14,35 +14,134 @@ All paths are under `node_modules/@felloinnovations/brand-kit/`.
14
14
  | --- | --- |
15
15
  | `design-system/README.md` | The guide's front page. Read it first. |
16
16
  | `design-system/01-how-claude-decides.md` | The decision workflow: situation, recipe, components, foundations, states, verify. Follow it in order. |
17
- | `design-system/<NN>-*.md` | The other numbered chapters, one per topic: colour, type, space, sizing, scrolling, choosing components, charts, patterns, page recipes, content, motion, accessibility, AI experiences, creativity, public pages, decisions, and `18-checklist.md`. |
18
- | `design-system/components/<Name>/` | The catalog: `README.md` (use, states, rules) and `preview.html` (markup to copy). |
19
- | `tokens/tokens.md` | Every token and its value. Grep it before writing any value. |
20
- | `dist/fello.css` | The whole kit in one file. |
17
+ | `design-system/<NN>-*.md` | The other numbered chapters, one per topic: colour, type, space, sizing, scrolling, choosing components, charts, patterns, page recipes, content, motion, accessibility, AI experiences, creativity, public pages, palettes (`20-palettes.md`), decisions, and `18-checklist.md`. |
18
+ | `design-system/components/README.md` | The catalog's index: every component by group, one line each. |
19
+ | `design-system/components/<Name>/` | The catalog: `README.md` (use, anatomy, states, rules) and `preview.html` (markup to copy). |
20
+ | `tokens/tokens.md` | Every token and its value, light and dark, and every word's contrast on every ground. Grep it before writing any value. |
21
+ | `dist/fello.css` | The whole kit in one file, in cascade layers. |
22
+ | `dist/fello.scoped.css` | The whole kit under a `.fello` root, for an app inside a host it does not own. |
21
23
  | `tokens/tokens.css` | Tokens only, as a Tailwind v4 `@theme`. |
24
+ | `scripts/check-palette.mjs` | Checks an app's own palette file against the contract (Palettes, below). |
22
25
 
23
26
  The same guide is hosted, always current, at `https://brand-kit-site-production.up.railway.app/latest/llms.txt`
24
- (pinned copies under `/v/0.4.0/`).
27
+ (pinned copies under `/v/0.5.1/`).
25
28
 
26
29
  ---
27
30
 
28
- ## fello.css or tokens.css
31
+ ## Which stylesheet
29
32
 
30
- - **`fello.css`** (`@felloinnovations/brand-kit/fello.css`): Instrument Sans, every token as `:root` custom
31
- properties (kit and product layer), and the `ws-*` component classes the catalog markup uses. Works in any stack,
32
- Tailwind or not. One import gives a page the whole kit.
33
+ | Your app | Import |
34
+ | --- | --- |
35
+ | Owns its page, Tailwind v4 | `tokens.css` and `fello.css` (below) |
36
+ | Owns its page, no Tailwind | `fello.css`, or `tokens.root.css` for the tokens alone |
37
+ | Owns its page, Tailwind v3 | the scoped build (below): v3's preflight is unlayered and beats every layered `fello.css` rule |
38
+ | Lives inside a host it does not own: a platform's guest app, a shared bundle, a Tailwind v3 host, a host with its own shadcn tokens | the scoped build (below) |
39
+
40
+ - **`fello.css`** (`@felloinnovations/brand-kit/fello.css`): Instrument Sans, every token (kit and product layer, light
41
+ and dark), and the `ws-*` component classes the catalog markup uses. Every rule sits in a `fello` layer nested in
42
+ Tailwind v4's own (`theme.fello`, `base.fello`, `components.fello`), so the app's utilities still win and its theme
43
+ stays its own. Its resets touch only elements that wear a `ws-*` class or sit inside one; only `html` and `body` are
44
+ styled bare. Unlayered CSS beats every layered rule, so an app's own bare `button`, `body` or `*:focus` rules now win
45
+ over the kit: keep them in a layer or off `ws-*` elements, or take the scoped build.
33
46
  - **`tokens.css`** (`@felloinnovations/brand-kit/tokens.css`): the tokens only, as a Tailwind v4 `@theme`, so utilities
34
- such as `bg-brand-salmon` exist. Not on Tailwind v4: use `tokens.root.css` (plain `:root`) or `fello.css`.
47
+ such as `bg-brand-salmon` exist. It leaves Tailwind's `--radius-*` names to the host; the kit's corners are the
48
+ `--ws-radius-*` lengths.
35
49
 
36
- A Tailwind v4 app usually takes both:
50
+ A Tailwind v4 app usually takes both, with the font first:
37
51
 
38
52
  ```css
53
+ @import url("https://fonts.googleapis.com/css2?family=Instrument+Sans:wght@400..700&display=swap");
39
54
  @import "tailwindcss";
40
55
  @import "@felloinnovations/brand-kit/tokens.css";
41
56
  @import "@felloinnovations/brand-kit/fello.css";
42
57
  @source "../node_modules/@felloinnovations/brand-kit/dist";
43
58
  ```
44
59
 
45
- The `@source` line is what makes Tailwind generate the classes the kit's React components use.
60
+ The font line comes first: compiled into one stylesheet, `fello.css`'s own font `@import` lands after Tailwind's rules,
61
+ where a browser drops it and the face never loads. A `<link>` to the same URL in the document head (or `next/font`)
62
+ does the same job. The `@source` line is what makes Tailwind generate the classes the kit's React components use.
63
+
64
+ **The scoped build** puts every rule under `.fello`, renames the keyframes `fello-ws-*`, and changes nothing outside a
65
+ `.fello` element:
66
+
67
+ ```tsx
68
+ import { felloScopedCss } from '@felloinnovations/brand-kit/scoped';
69
+
70
+ <div className="fello">
71
+ <style>{felloScopedCss}</style>
72
+ {/* the app */}
73
+ </div>
74
+ ```
75
+
76
+ Or link `dist/fello.scoped.css`. Put `class="fello"` on the app's root and on the root of every portal (a menu, a tooltip,
77
+ a dialog rendered outside it), or those lose the kit. It has no font `@import`: link Instrument Sans yourself. The string
78
+ is plain TypeScript, so a Node test run that cannot load CSS still loads it. The `brand-adopt` skill has the whole path
79
+ for a guest app, without touching the host's lockfile or Dockerfile.
80
+
81
+ **shadcn**: `shadcn-compat.css` points shadcn's variables at the kit as `var()` refs (follows dark);
82
+ `shadcn-compat.hsl.css` writes bare HSL channels for a `hsl(var(--x))` config, with light, dark and `.dark` values.
83
+ `--primary` is the navy act and `--ring` the navy focus.
84
+
85
+ ---
86
+
87
+ ## Dark theme
88
+
89
+ Opt-in. A page that sets nothing stays light.
90
+
91
+ ```html
92
+ <html data-theme="dark"> <!-- night, always -->
93
+ <html data-theme="system"> <!-- follow the person's system -->
94
+ <html data-theme="dark" data-ground="navy"> <!-- the navy ground, for brand and event pages -->
95
+ ```
96
+
97
+ Any element takes the same attributes (a container, an app's `.fello` root), and the nearest one wins: dark inside a
98
+ light page, light inside a dark one.
99
+
100
+ Brand colours stay literal in every theme; semantic tokens carry the swap. So in your own CSS use the semantic names:
101
+ `--color-surface` (never `--color-white`) for a white surface, `--ws-raised` for anything that floats, `--ws-track` for an
102
+ empty track, `--ws-field` and `--ws-field-ink` for a field, `--ws-on-act` for words on the navy act, and
103
+ `--color-text-heading` for a navy mark. A wash or a shadow of your own is
104
+ `color-mix(in srgb, var(--ws-ink) 5%, transparent)` or the same with `--ws-shade`; the 0.4 channels `--ws-ink-rgb` and
105
+ `--ws-shade-rgb` still work but do not follow a palette. Prefer a token over a theme selector; if you must write one, use
106
+ `[data-theme="dark"] .x` (any element, not only `:root`) and repeat it for `system` inside
107
+ `@media (prefers-color-scheme: dark)`. A person's choice is the `ThemeSwitch` component.
108
+
109
+ ---
110
+
111
+ ## Palettes
112
+
113
+ An app whose colours differ a little from the kit's sets a palette. It never writes its own values for kit tokens on
114
+ `:root` or in `@theme`: such an override goes unchecked, can set a token that should derive, and, being unlayered,
115
+ beats the kit's dark values too. A palette sets only the 33 contract tokens, everything derived recomputes from them,
116
+ and the check proves it AA in light, night and navy.
117
+
118
+ ```html
119
+ <html data-palette="cool"> <!-- a built-in: default (none), cool, warm -->
120
+ <div class="fello" data-palette="warm" data-theme="dark"> <!-- on a container, with its own theme -->
121
+ ```
122
+
123
+ - Pick by how it should look, and name your own the same way: never after the app.
124
+ - Your own: write the checked form, one file of `[data-palette="name"] { ... }` and the same with
125
+ `[data-theme="dark"]`, setting only contract tokens (in dark, only what the kit's dark does not give you). Check it,
126
+ fix every error, then ship what `--emit` writes, never the file you wrote:
127
+
128
+ ```sh
129
+ node node_modules/@felloinnovations/brand-kit/scripts/check-palette.mjs src/app.css
130
+ node node_modules/@felloinnovations/brand-kit/scripts/check-palette.mjs --emit src/app.css > src/app.shipped.css
131
+ ```
132
+
133
+ The shipped file nests anywhere (on `<html>` or any container, either way round with the theme, light or dark, both
134
+ builds) and load order no longer matters. A dark value left out is the kit's derived dark, never the light value.
135
+ The check reports a hand-written file as "not in the shipped form": as written, its light values also paint in dark
136
+ wherever the theme sits on another element.
137
+ - A contract token the kit derives (the focus ring from the heading, the raised ground, the alert and positive words,
138
+ the rating and agent tones) recomputes on a container unless the palette sets it.
139
+ - A `:root` override does not reach the chart fades, tints and empty cell: they are literal on `:root` and derive only
140
+ on a palette or theme element. Use `data-palette`.
141
+ - Many apps in one bundle: each on its own `.fello` root with its own `data-palette`; its portals carry the same.
142
+ - In JS: `import { palettes, contract } from '@felloinnovations/brand-kit/palettes'` (every built-in resolved per theme).
143
+
144
+ The contract, nesting and the check are in `design-system/20-palettes.md`.
46
145
 
47
146
  ---
48
147
 
@@ -51,8 +150,8 @@ The `@source` line is what makes Tailwind generate the classes the kit's React c
51
150
  Name the face before choosing anything (guide chapter 01, step 0: product workspace, dashboard or report, entry,
52
151
  public web page, email, deck, mockup). The face sets one of two layers, never mixed on one surface:
53
152
 
54
- - **Product layer**: a cream page and cream cards with a 0.5 px edge, 8 px corners, flat; one solid navy button per
55
- card and per page; 14 px body; compact controls. Built from the catalog markup and `ws-*` classes, wrapped in the
153
+ - **Product layer**: a cream page and rimmed cream cards (the 1 px tray rim, 8 px corners), flat; one solid navy button
154
+ per card and per page; 14 px body; compact controls. Built from the catalog markup and `ws-*` classes, wrapped in the
56
155
  app's own thin components.
57
156
  - **Marketing layer** (public pages, chapter 19): white cards at 4 px, the salmon gradient button, the kit's big type
58
157
  steps, 16 px body. The package's React `Button`, `Card`, `Input`, `Badge`, `Checkbox`, `Radio` and `Stat` are this
@@ -64,20 +163,27 @@ public web page, email, deck, mockup). The face sets one of two layers, never mi
64
163
 
65
164
  ## The rules
66
165
 
67
- - **Never invent a value.** No raw hex, px font-size, one-off shadow or ad-hoc radius. Every value is a token in
68
- `tokens/tokens.md`. If none fits, say so and leave it; do not make one up.
166
+ - **Never invent a value.** No raw hex, px font-size, one-off shadow, ad-hoc radius or duration. Every value is a token in
167
+ `tokens/tokens.md`. If none fits, say so and leave it; do not make one up. A one-off spacing snaps to the nearest step.
69
168
  - **Tailwind v4:** write `text-[color:var(--x)]` and `text-[length:var(--x)]`, never bare `text-[var(--x)]`. Tailwind
70
169
  cannot tell a colour from a size behind a bare `var()`, guesses font-size, and drops the colour silently. This has
71
- already shipped a bug.
170
+ already shipped a bug. Never `--radius-xl` or `--radius-2xl` for a product corner: those are Tailwind's.
72
171
  - **Semantic tokens over primitives**: `var(--color-text-heading)`, not `var(--color-brand-navy)`, for the same job.
73
- The semantic layer is what lets a colour be retuned in one place.
172
+ The semantic layer is what lets a colour be retuned, and what turns in dark.
74
173
  - **Check the catalog before building a component.** Never redraw one. If the kit has nothing for it, build it in
75
- the consuming app from tokens and say what was missing. Do not add it to brand-kit and do not open a PR against it
174
+ the consuming app from tokens and say what was missing, as an issue
175
+ (`https://github.com/FelloInnovations/brand-kit/issues/new?template=feedback.yml`). Do not add it to brand-kit and do not open a PR against it
76
176
  from a consuming app; the kit's owners take it from there.
77
177
  - **Close but not exact**: pass `className` to a React export (merged through `tailwind-merge`, so your utility wins).
78
178
  Do not fork it.
79
- - **Accessibility**: native elements first; visible focus (`--shadow-focus-ring`) on every control; an error is a
80
- message wired with `aria-describedby`; targets 40 px boxed on touch and 24 px for words that act; words pass AA.
179
+ - **Layout**: one content edge per surface; numbers in fixed right-aligned columns; rows in a list share one
180
+ min-height; a selected row never changes size. A scroll region's children never shrink: a child that scrolls says so
181
+ (`flex: 1; min-height: 0; overflow: auto`). Never `overflow: hidden` on a card or a table. Inline icons are `ws-icon`.
182
+ - **Accessibility**: native elements first; the 2 px navy focus ring on every control (never `outline: none` without a
183
+ replacement); an error is a message wired with `aria-describedby`; targets 40 px boxed on touch and 24 px for words
184
+ that act; every word passes AA on its ground (use the word tokens).
185
+ - **Motion comes from the kit** (Motion, below): build with the catalog's classes and the motion comes with them.
186
+ Never hand-roll a transition, a duration, a curve or a `@keyframes`.
81
187
  - **Every page scrolls**: no content trapped by a nested `overflow: hidden` or a fixed-height parent. A field on the
82
188
  cream page has a white ground (`ws-field`).
83
189
  - **Words**: sentence case, no em dashes, nothing developer-facing on a screen, never a faked card or number.
@@ -86,12 +192,77 @@ Before calling UI done, run `design-system/18-checklist.md`.
86
192
 
87
193
  ---
88
194
 
195
+ ## Motion
196
+
197
+ Seth's motion is in `fello.css`, on his springs: build with the catalog's markup and classes and every press, slide,
198
+ fold, enter and exit is already there. The situations, with markup, are in `design-system/13-motion.md`.
199
+
200
+ - **Never hand-roll it.** No raw duration, `cubic-bezier()`, `ease-in-out`, `transition-all` or `@keyframes` of your
201
+ own, and no restyling a kit element's transition.
202
+ - **Hover is a tint, never a lift**: `ws-hover-tint` (`--faint`, `--strong`), inside `@media (hover: hover)`. No rise,
203
+ grow or shadow on hover.
204
+ - **Press**: `ws-btn`, `ws-icon-btn`, `ws-suggestion-chip` and chips that act spring to `--ws-press-scale` on their
205
+ own; a pressable of your own adds `ws-press`. Rows never scale; they take `--ws-surface-press`.
206
+ - **A choice slides**: `Segmented`, `Tabs`, `AppShell`'s current row, `SideList` and `ListDetail` move their
207
+ indicator when you move `aria-pressed`, `aria-selected` or `aria-current`. No extra markup or script.
208
+ - **Opening in place**: a kit `<details>`, or `ws-unfold` on a body shown and hidden with `hidden`.
209
+ - **Over the page**: `Menu` and `Popover` as a native `popover`, `Dialog` as a native `<dialog>`; a `Toast`,
210
+ `HoverCard`, `Panel` or mounted menu gets `data-leaving` and stays until its exit has played
211
+ (`Promise.allSettled(el.getAnimations().map((a) => a.finished)).then(() => el.remove())`). Opens grow from their
212
+ source; every exit is quicker than its entrance.
213
+ - **The two moves CSS cannot start**, both from the package root (under reduced motion, or without view transitions,
214
+ each just runs the update):
215
+
216
+ ```ts
217
+ import { morph, reorder } from '@felloinnovations/brand-kit';
218
+
219
+ // as: 'full' a card to full screen and back, 'grow' / 'shrink' a tile opening and closing, 'shift' the chat's modes
220
+ morph(() => flushSync(() => setFull(true)), { as: 'full', el: cardRef.current, close: () => flushSync(() => setFull(false)) });
221
+ // rows re-sorting or filtering, a card moving column
222
+ reorder(() => flushSync(() => setRows(sorted)), listRef.current);
223
+ ```
224
+
225
+ - **A dashboard** wears `ws-build`, each card `ws-build__card` with `--ws-i`; **loading** is `Skeleton` (the shimmer),
226
+ never a spinner; **charts** take their `--draw` variant.
227
+ - **Your own part** (nothing in the catalog has it): a spring for what the person drives,
228
+ `transition: <prop> var(--ws-spring-<name>-duration) var(--ws-spring-<name>)` (the table in `13-motion.md`, "Which
229
+ spring, when"); `--ws-duration-*` with `--ws-ease-*` for what the system plays. In React the same springs:
230
+ `import { springs, eases } from '@felloinnovations/brand-kit/tokens'`, every motion tree in
231
+ `<MotionConfig reducedMotion="user">`.
232
+ - **Reduced motion is still**: write your own motion inside `@media (prefers-reduced-motion: no-preference)`; the
233
+ kit's net does the rest. Every change lands in its final state at once.
234
+ - **Check it** against the Motion card (`design-system/components/Motion/preview.html`: the playground and the
235
+ 206-row reference), side by side.
236
+
237
+ ---
238
+
239
+ ## Checking it
240
+
241
+ The kit's own checks run in the kit's repo, for anyone changing a catalog component (only `check-palette.mjs` ships in
242
+ the package; the rest show what "done" means for your own screens too):
243
+
244
+ ```sh
245
+ node scripts/check-geometry.mjs --only Name1,Name2 --widths 320,390,1440 # alignment, spacing, centring, clipping, targets
246
+ node scripts/check-geometry.mjs --only Name1,Name2 --theme dark
247
+ node scripts/check-geometry.mjs --only Name1,Name2 --palette cool # any built-in palette, with or without --theme
248
+ node scripts/check-geometry.mjs --only Name1,Name2 --hover # rest, hover and focus; no lift, still under reduced motion
249
+ node scripts/check-geometry.mjs --only Name1,Name2 --hover --motion # the same with motion on: a lift that only plays then
250
+ node scripts/check-scope.mjs # the scoped build leaks nothing; fello.css resets miss the host
251
+ node scripts/check-palette.mjs [file.css] # the built-ins, or a palette file, against the contract
252
+ ```
253
+
254
+ Open every screenshot the geometry check writes. In an app, run the same eye over the screen at 320, 390 and 1440,
255
+ light and dark, with the keyboard, with motion on and with reduced motion (Checklist, "Senior QA, by eye").
256
+
257
+ ---
258
+
89
259
  ## Provisional values
90
260
 
91
261
  Not signed off and **will change**. Do not build anything load-bearing on them, and flag it when you use one:
92
262
 
93
263
  - `--color-feedback-*`, `--color-alert`, `--color-stat-positive`: inherited from the HubSpot boilerplate.
94
264
  - The kit `Button`'s `tertiary` and `clean` themes, and all kit `Badge` tones.
265
+ - The dark values of the glass stage and the frame gradient: derived, not drawn.
95
266
 
96
267
  ---
97
268
 
@@ -107,6 +278,9 @@ This project uses `@felloinnovations/brand-kit` (the Fello brand kit). Before wr
107
278
  `node_modules/@felloinnovations/brand-kit/design-system/README.md` and its workflow `01-how-claude-decides.md`.
108
279
 
109
280
  Every value is a token in `node_modules/@felloinnovations/brand-kit/tokens/tokens.md`: never invent a colour,
110
- size, radius or shadow. Check the catalog (`design-system/components/`) before building a component. Write
111
- `text-[color:var(--x)]`, never `text-[var(--x)]`. Run `design-system/18-checklist.md` before calling UI done.
281
+ size, radius, shadow or duration. Motion comes with the catalog's classes (`design-system/13-motion.md`): never
282
+ hand-roll a transition. Check the catalog (`design-system/components/`) before building a component. Write
283
+ `text-[color:var(--x)]`, never `text-[var(--x)]`. Dark is opt-in (`data-theme`). This app's own colours are a palette
284
+ (`data-palette`, `design-system/20-palettes.md`), checked with `scripts/check-palette.mjs` and shipped as its
285
+ `--emit` writes it, never tokens retuned on `:root`. Run `design-system/18-checklist.md` before calling UI done.
112
286
  ```
package/CHANGELOG.md CHANGED
@@ -1,5 +1,226 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.5.1 (10 Nov 2026)
4
+
5
+ Loaders are calm: the shimmer is one quiet grey. Amit looked at the skeletons in an app built on the kit and did not
6
+ like the salmon, purple and green tints sweeping every grey ghost block (Decisions, 10 Nov 2026).
7
+
8
+ - **The shimmer is one neutral tone.** `--ws-shimmer` is the ghost grey with a lighter pass of the same grey, no chart
9
+ hues, in light, night, the navy ground and every palette. North's timing stays: 1.8 s on `--ws-loop-shimmer` and
10
+ `--ws-ease-shimmer`, the 300 % band at 100 deg; still under reduced motion. Every ghost that wears the shimmer
11
+ (Skeleton, a pending Stat, StatTiles, Table, Well, TickStrip, ShareBar, ScoreHero and the rest) changes with no
12
+ markup change.
13
+ - **One ghost grey at rest and in motion.** `--ws-shimmer-ground` is now `--ws-ghost` (#E3DFDB, the night's #273544),
14
+ so a ghost shows on the cream (1.29:1) and on the tray (1.13:1) alike, and the still ghost under reduced motion is the
15
+ same grey. Skeleton's own ground for a card's foot or band is gone.
16
+ - **The chart ghost's colour band is gone.** `ws-skeleton__chart`'s bars are ghosts under the same shimmer; the band
17
+ that crossed the drawing in blend mode colour is removed (a neutral band there would paint nothing).
18
+ - **The docs say so**: the Skeleton card and preview, the Motion card (the shimmer row is now Close, the chart band row
19
+ Not yet), Colour, Motion, Patterns, Charts, Choosing components and every loading line in the catalog.
20
+ - **Pinned links keep working**: `/v/0.5.0/` is kept as a snapshot (`hosted/v/0.5.0`), so a page pinned to it still
21
+ loads after the bump. Pinned links in the docs now point at `/v/0.5.1/`.
22
+
23
+ **Upgrading from 0.5.0**: nothing to change. A copy of the old gradient, or of #ECE8E4 as the shimmer's grey, should
24
+ become `var(--ws-shimmer)` or `var(--ws-shimmer-ground)`. `StatusLine`'s working words keep their colours for now (open
25
+ in Decisions).
26
+
27
+ ## 0.5.0 (4 Nov 2026)
28
+
29
+ The kit the whole team can trust: teams kept hitting alignment, spacing and placement bugs, and Seth (the designer) has
30
+ new, detailed work to learn from. 0.5.0 rebuilds the product layer on his six Fia frames and his North app, fixes every
31
+ fault the field found, stops `fello.css` restyling other apps, adds an opt-in dark theme and lets every app keep its own
32
+ palette. Fifteen decisions set the defaults (D1 to D15 in Decisions, 4 Nov 2026), D1 to D14 open to Amit's veto; every
33
+ kit rule they overturn is logged with Seth's source.
34
+
35
+ - **Seth's layout, measured.** One content edge per surface; numbers in fixed right-aligned columns; rows in a list share
36
+ one min-height and a selected row never changes size; dividers 0.5 px and full width; four half steps on the 4 px
37
+ grid (2, 6, 10, 14), every other value snapped; a 32 px app gutter, the stage 13 from the top and 12 from the right
38
+ and bottom; layouts re-lay out by the room they have, never just shrink.
39
+ - **The rimmed card.** Every product card is Seth's tray: a 1 px #EDEDED rim, concentric corners (8 and 7; a drawer 12
40
+ and 11), the cream surface, an optional foot on the rim, no outline and no shadow at rest. Same class names, so markup
41
+ upgrades in place except the items in "Upgrading from 0.4" below.
42
+ - **Type gains Seth's steps**: a 96 px report score, 44, 32 and 28 px figures, 13/18 control words, 15/22 sections, 15/20
43
+ row names.
44
+ - **Words AA on every ground.** Every word token is computed on eight grounds in light, night and navy, and the build
45
+ stops on a fail. Muted words are #666666. New word and mark tokens for needs work (pink), alert and past halfway; a
46
+ rating is teal, mid blue or pink.
47
+ - **Motion from North**: role-named durations, curves and staggers, and Seth's springs in `tokens.ts` (`springs`,
48
+ `eases`); hover is a colour, never a lift; opens grow from their slot and their details settle after; loading is a
49
+ shimmer in the chart colours. Everything is still under reduced motion, by a net on every kit element.
50
+ - **Motion comes with the components, and the guide says how.** Seth's springs are CSS too (`--ws-spring-<name>` over
51
+ `--ws-spring-<name>-duration`, a `linear()` curve with its overshoot kept), so buttons and chips press on a spring,
52
+ `Segmented`, `Tabs`, `AppShell`, `SideList` and `ListDetail` slide their indicator (CSS anchor positioning), every
53
+ kit `<details>` and `.ws-unfold` folds, and menus, popovers, dialogs, toasts, tooltips, hover cards and panels grow
54
+ in from their source and leave quicker; `morph()` and `reorder()` do the two moves CSS cannot start. Motion is
55
+ rewritten by situation (hover, press, a choice, a fold, an overlay, full screen, a reorder, a dashboard, loading,
56
+ charts), with which spring to use when, the reduced-motion and older-browser fallbacks, and the Motion card as the
57
+ reference; the skill, AGENTS.md, the Checklist, `brand-new` and `brand-audit` carry the same rules, and
58
+ `check-geometry --hover --motion` catches a hover lift that only plays with motion on.
59
+ - **Dashboards build in, in every app** (Amit, 5 Nov). `.ws-build` on a page or section: its cards rise in 70 ms apart
60
+ and each card's charts draw as it lands, once, as it scrolls into view (a scroll trigger where the browser has one,
61
+ first paint elsewhere). `MetricTile` gains North's mini charts (a column strip, a line with dots) that grow and draw
62
+ in and wake to their tone on hover; `SideList` goal rows fill in order, navy, teal past the goal, red behind.
63
+ - **`TrendLine`, a value over periods as a line or as columns.** Bars / Line morphs between them: the columns melt into
64
+ the line on `--ws-spring-morph-chart` while it draws, and grow back down from the dots. A band slides to the hovered
65
+ period and a dot grows; a real table reads it out. It builds in on arrival, or as it scrolls into view. Motion's
66
+ playground now opens on a dashboard that builds in (four tiles, the goals, the chart card) with Replay the arrival.
67
+ - **Full screen covers the window from anywhere.** `morph(update, { as: 'full', el })` lifts a chat card into the top
68
+ layer while it is full (a manual popover), with Escape (`close`) and focus in and back, so the chat's glass, AppShell's
69
+ stage or any ancestor with a transform, filter, `contain` or `will-change` no longer squashes it into a strip. The
70
+ stage draws its blur on a layer, so a toaster or a phone's full-screen panel inside it reaches the window, and a
71
+ tooltip anchors to the window, so the bar and the body's scroll no longer cut it. The Motion card opens on a
72
+ playground: a product screen with every North move live and a numbered hint at each.
73
+ - **Focus you can see**: a 2 px navy ring 2 px outside everything that takes focus, drawn inside dense rows. The old
74
+ salmon halo was 1.21:1.
75
+ - **Dark, opt-in**: `data-theme="dark"` or `"system"` on `<html>` or any container, `data-ground="navy"` for the navy
76
+ ground; the nearest wins, so light inside dark works and the reverse. A page that sets nothing stays light. Brand
77
+ colours stay literal; semantic tokens carry the swap.
78
+ - **Palettes: one kit, many apps** (D15). A palette sets only the contract, 33 existing semantic tokens listed with
79
+ their meaning in `design-tokens.json` and the new Palettes chapter; everything derived recomputes inside the element
80
+ that sets it, and so does a contract token the kit derives (the focus ring from the heading, the raised ground, the
81
+ alert and positive words, the rating and agent tones) unless the palette sets it. Built-ins named for how they look:
82
+ `default` (no attribute), `cool`, `warm`. The first product's tally navy gets no palette: Seth's #2C4870 wins (D1)
83
+ and the product adopts it. On `<html>` or any container, light or dark, nested either way, in `fello.css` and the
84
+ scoped build, so many apps in one bundle each keep their own. `scripts/check-palette.mjs` ships in the package and
85
+ checks any app's palette file (contract only, every word AA on every ground, the focus ring and the act 3:1, chart
86
+ tones apart) in light, night and navy; `--emit` then writes the file to ship, in the built-ins' own form, so an app's
87
+ palette nests anywhere too and load order no longer matters. A dark value a palette leaves out is the kit's derived
88
+ dark, never its light value. `palettes` and `contract` come from the package and
89
+ `@felloinnovations/brand-kit/palettes`. The gallery's Components page gains a theme and palette switch.
90
+ - **Every colour follows the palette** (D15), in light, night and the navy ground. Component styles carry no colour
91
+ literal (`build-bundle --check` fails on one), and every colour a component paints derives from the contract. The
92
+ dark tints and fades are now their tone over the dark page (within CIEDE2000 3.5 of the old literals), so an app's
93
+ dark page moves them; the dark alert tone #FF5A5A became #FF5470, which a chart can tell from salmon. New tokens
94
+ (none renamed): `--ws-frame-top`, `--ws-stage-foot`, `--ws-agent-coach`, `--ws-agent-growth`, `--ws-agent-recruit`;
95
+ `--ws-ink` and `--ws-shade` (the ink of washes and rings, the tint of a drop); `--ws-inverse` and `--ws-on-inverse`
96
+ (the toast, note and footer pair); `--ws-control-off` (a switch's off track); `--ws-shimmer-ground`; `--ws-glow-rose`,
97
+ `--ws-glow-pink`, `--ws-glow-blue` and `--ws-orb`; `--ws-mask` for mask stops. `--ws-ink-rgb` and `--ws-shade-rgb`
98
+ stay as legacy and do not follow a palette. Kit aliases now: `--color-border-default` is `--ws-edge`, the hairline
99
+ `--ws-edge-card`, `--color-stat-positive` `--ws-chart-finished`, `--color-text-brand-strong` `--ws-word-needs`.
100
+ Still the brand's under any palette, by ruling: the toast, the note tip and the footer keep the brand navy with white
101
+ words in dark; `KitButton`'s salmon and navy acts and the `Cover` logo; the navy ground's fields. Proof:
102
+ `check-palette` finds a leftover statically (a colour a component reads that no contract token moves), and the
103
+ poison test (`scripts/palette-poison.mjs`, run in CI from `check-scope`) sets each contract token to a wild colour
104
+ on `<html>` and on a container around every preview, light and dark, and finds nothing stale, leaked or constant.
105
+ - **`fello.css` stops leaking** into the apps around it: every rule sits in a `fello` layer nested in Tailwind's own, so
106
+ utilities win; resets touch only kit elements; Tailwind's radius names stay the host's. New `fello.scoped.css` and
107
+ `@felloinnovations/brand-kit/scoped` (the CSS as a string) put everything under a `.fello` root for a guest app in a
108
+ shared host. `shadcn-compat.hsl.css` for `hsl(var(--x))` configs; `--primary` is now the navy act.
109
+ - **The shell owns its scroll** (the Revenue OS audit, K1 to K17): nothing squashed by its scroller, screen-reader words
110
+ no longer stretch the window, dialogs scroll and fit the window, drawers are the whole screen on a phone, menus open
111
+ in the top layer, one touch block (40 px boxes, 24 px words), inline icons sized (`ws-icon`).
112
+ - **New components**: Split, HoverCard, ListDetail, SideList, Matrix, CheckRow, Slider, FilterBar, ThemeSwitch,
113
+ TickStrip, ScoreHero, SegmentedProgress, ShareBar, StepLine, Heatmap, MetricTile, PaceBar, StatusLine, LoadBar,
114
+ SuggestionChip, TopicRail and ChatShell. Issues #5 to #12 are done (GoalBars, the v7 ring, TickRow sizes, the Example
115
+ tag, the tile row, the snug card, the first-open recipe).
116
+ - **The guide**: Space and layout, Motion, Scrolling, Colour and Type rewritten; interaction states (hover, press, focus,
117
+ selected, pending, loading) in Patterns; every new component in Choosing components and Charts; three new recipes
118
+ (the first open of an AI app's thread, a report with its drawer, an inbox list and detail) and a dashboard home;
119
+ Accessibility on focus and reduced motion; Checklist gains the geometry check and a senior QA list.
120
+ - **Checks**: `yarn check:geometry` measures every preview at 320, 390 and 1440 (`--theme dark`, `--palette cool`,
121
+ `--hover` for focus);
122
+ `yarn check:scope` proves the scoped build changes nothing outside `.fello` and `fello.css`'s resets never touch
123
+ the host's markup. The skills and AGENTS.md cover the scoped build,
124
+ dark and the checks; `brand-adopt` gains the guest-app path (no root lockfile or Dockerfile change).
125
+
126
+ ### Upgrading from 0.4
127
+
128
+ Most markup keeps working: the class names stay, and a card, a button or a row takes the new look by itself. These are
129
+ the exceptions. After the bump, run `yarn check:geometry` on your own previews (or look at each screen at 320, 390 and
130
+ 1440) before you ship.
131
+
132
+ **Classes removed** (7, the only ones 0.4 had that 0.5 does not)
133
+
134
+ | 0.4 | 0.5 |
135
+ | --- | --- |
136
+ | `ws-stat-tiles__stripe` with `--navy`, `--purple`, `--salmon` or `--teal` | Gone: Seth's tile has no stripe, so delete the element. Where the tone meant a category, put it on the tile's mark: a `ws-tick-row ws-tick-row--tall` with `style="--tone: var(--ws-chart-...)"` in `__value-row` |
137
+ | `ws-stat-tiles__ticks` | A `ws-tick-row` (`--tall` for Seth's size) inside `ws-stat-tiles__value-row`, beside the figure |
138
+ | `ws-funnel-bars__fill--first` | Delete it: every bar takes the same 4 px corners now |
139
+
140
+ **Markup to change**
141
+
142
+ | Piece | 0.4 | 0.5 |
143
+ | --- | --- | --- |
144
+ | StatTiles | `<ul class="ws-stat-tiles">` of `<li class="ws-card ws-stat-tiles__tile">` | `<div class="ws-stat-tiles"><ul class="ws-stat-tiles__grid">` of `<li class="ws-stat-tiles__tile"><div class="ws-stat-tiles__surface">...</div><div class="ws-stat-tiles__foot">...</div></li>`. The 0.4 form still lays out (as many tiles of at least 14 rem as its own width holds) but gets no count rule and no foot |
145
+ | A card with a foot | the 80 px band (`ws-band`) for every act | On a page: `<div class="ws-card"><div class="ws-card__surface">...</div><a class="ws-card__foot">...</a></div>`, the foot on the tray. The band stays for a chart card's one act |
146
+ | AppShell, to pin the person | `__wordmark`, `__rows` and `__foot` straight inside `__nav` | `__head` (holding `__wordmark`), then `__groups` (holding each `__group` and its `__rows`), then `__foot`. Without the wrappers the person scrolls away with the rows |
147
+ | A page in AppShell | a `.ws-page` inside `__body` | No `.ws-page` there: the body is the page (its gutter, gap and size container) |
148
+ | PageBar | `__words` held the `h1` and a `<p class="ws-body">` sentence under it | `__words` is one line: `__face`, the `h1` `__title`, a short `__context` word. An old sentence now sits inline beside the title; move it into the page under the bar |
149
+ | Ring, the split | `.ws-ring__split` with `.ws-ring__hole` inside `.ws-ring__ticks` | Inside `.ws-ring__split`, a `.ws-ring__plate` holding `.ws-ring__ticks` and then `.ws-ring__hole` (with `__total` and `__caption`). An old hole inside the ticks shows the dots through it |
150
+ | GoalBars | `__fillbox` held `__not-yet` and `__fill` | Add `<span class="ws-goal-bars__leader"></span>` between them, so each bar's leader runs to its dot |
151
+ | EntryShell, StatusScreen | filled only their parent | A bare page (the shell or the screen straight in `body`) adds `--page` (`ws-entry-shell--page`, `ws-status-screen--page`) to fill and centre in the window. Without it StatusScreen stays in the top third of its parent by design, since it can also sit inside a page as a block |
152
+ | Tooltip | the tip was always drawn; the app mounted it only while it showed | The tip is hidden until its `.ws-tooltip` is hovered or holds keyboard focus; to show it from code, add `ws-tooltip--open` |
153
+
154
+ **Looks and behaviour that change on their own**
155
+
156
+ - **Focus**: a 2 px navy outline 2 px outside, on `:focus-visible`, replaces the salmon halo (it was 1.21:1). A host rule
157
+ such as `*:focus { outline: none }` now hides the kit's focus: remove it.
158
+ - **Corners**: buttons and square icon buttons 6 (were 4); `IconButton` is a square, `ws-icon-btn--round` for voice and
159
+ send; chips 4 (were 2); checkboxes and radios 18 px with 4 px corners and a navy edge (were 16 and grey); cards 8
160
+ outside, 7 inside; dialogs and drawers 12; menus 10; the toast an 18 px pill.
161
+ - **Cards**: the rim is a 1 px `border` in the tray colour, so a card's inside is 2 px narrower and a `border` of your own
162
+ replaces the rim. A child that rounds with the card takes `--ws-radius-card-inner`. Hover on a pressable card darkens
163
+ the rim; nothing lifts.
164
+ - **Buttons**: words 13/18 (were 14/16), `--lg` 40 tall (was 36), `--secondary` has no fill (the cream is gone; the new
165
+ `--well` sits on the tray), primary hover brightens instead of dimming. A button still stays on one line and never
166
+ shrinks beside its row's words, as in 0.4; a label that can be wider than its column opts in with `ws-btn--wrap`
167
+ (balanced lines). The halves of a `ws-btn-split` stack, full width, instead of breaking a label.
168
+ - **Card heads wrap**: in a `.ws-head` the aside drops under the title, as one piece, when it would squeeze the title
169
+ below 200 px, where 0.4 kept one line. Put controls that may drop together in one element (a `ws-cluster`). Icon acts
170
+ (a close, an expand) never drop: they stay top right on the title's first line and the title wraps.
171
+ - **Stacks**: `ws-stack` and `ws-cluster` are 8 apart and no longer read a `--ws-gap` set on a parent; take a modifier
172
+ for another gap (`--tight`, `--loose`, `--component`, `--group`, and on a stack `--block` 32 or `--section` 56).
173
+ - **Titles** (`ws-title`, `ws-section`) lose their -0.5% tracking and balance their lines.
174
+ - **Hover only where a pointer hovers**: every kit hover sits in `@media (hover: hover)`, so a tap on a phone never
175
+ leaves it stuck. A hover of your own on a kit piece needs the same query.
176
+ - **Sizes**: the page gutter is 32 (was 24, still 16 on a phone); the folded rail 64 (was 72); a PageBar title 16/22
177
+ (was 26/32) and one line, with an ellipsis; muted words #666666 (were #6E6E6E). Breadcrumb links are body grey with a
178
+ "/" (were mid blue with chevrons). Section rows lost their 8 px sides and 6 px corners. Toasts are navy pills.
179
+ - **Tailwind's radius names are the host's again**: `tokens.css` no longer sets `--radius-xs` to `--radius-2xl`, so
180
+ `rounded-xl` and `rounded-2xl` go back to Tailwind's own sizes. Use the `--ws-radius-*` lengths for kit corners; every
181
+ kit piece, the marketing ones and the React exports included, rounds with them, so a shadcn `--radius` no longer
182
+ moves a kit corner.
183
+ - **The font in a Tailwind v4 app**: put the Instrument Sans `@import` before `@import "tailwindcss"` (AGENTS.md), or a
184
+ `<link>` in the head. Compiled into one stylesheet, `fello.css`'s own font `@import` lands after Tailwind's rules,
185
+ where a browser drops it, so the face never loaded.
186
+ - **shadcn**: `--primary` in `shadcn-compat.css` is now the navy act with `ws-on-act` words (was salmon with white).
187
+ - **A `:root` override of a chart tone**: the chart fades, tints and empty cell are literal on `:root` and derive on
188
+ every palette or theme element, so a bare `:root { --ws-chart-under-half: X }` without `data-palette` no longer moves
189
+ them. Put the change in a palette.
190
+ - **Washes of your own**: `rgba(var(--ws-ink-rgb), a)` still paints, in the default's colours only (it follows the
191
+ theme, not a palette). Write `color-mix(in srgb, var(--ws-ink) 5%, transparent)` (and `--ws-shade` for a drop) so it
192
+ follows a palette.
193
+ - **Layers**: `fello.css` sits in cascade layers (`theme.fello`, `base.fello`, `components.fello`, inside Tailwind's own),
194
+ so your utilities win, and so does any unlayered CSS of yours. In 0.4 a bare `button { ... }` or `body { ... }` rule of
195
+ the host lost to the kit; now it wins. Put such rules in a layer, scope them away from `ws-*` elements, or take the
196
+ scoped build. Tailwind v3 (its preflight is unlayered) always takes the scoped build.
197
+ - **An artifact** inlines `fello-core.css` (unlayered) and the blocks of the components it uses, as `Starter` and the
198
+ skill do, not the whole `fello.css`, which is now over 400 kB and layered.
199
+
200
+ **Opting in**
201
+
202
+ - **Dark**: `<html data-theme="dark">` for the night ground, `data-theme="system"` to follow the person's setting, and
203
+ `data-ground="navy"` beside it for the navy ground (brand and event pages). A page that sets nothing stays light.
204
+ In the scoped build the same attributes work on the `.fello` element or any ancestor; a host's `.dark` class does not
205
+ turn the kit.
206
+ - **A palette**: an app whose colours differ a little from the kit's sets `data-palette` instead of retuning kit
207
+ tokens on `:root`: a built-in, or its own file of contract tokens, checked with
208
+ `node node_modules/@felloinnovations/brand-kit/scripts/check-palette.mjs <file>` and shipped as
209
+ `check-palette.mjs --emit <file> > <file>.shipped.css` writes it. The `brand-adopt` skill has the step. A theme
210
+ selector of your own can now be `[data-theme="dark"] .x` on any element.
211
+ - **The scoped build**, for an app inside a host it does not own (a platform's guest app, a shared bundle) or any
212
+ Tailwind v3 app: `import { felloScopedCss } from '@felloinnovations/brand-kit/scoped'` and render
213
+ `<div className="fello"><style>{felloScopedCss}</style>...</div>`, or link `fello.scoped.css`. Put `class="fello"` on
214
+ every portal's root too (menus, tooltips, dialogs rendered outside the app). It has no font `@import`: link Instrument
215
+ Sans yourself. `yarn check:scope` proves it changes nothing outside `.fello`.
216
+
217
+ ## Feedback loop (30 Oct 2026)
218
+
219
+ What the kit misses now reaches its owners. A new `brand-feedback` skill turns a job's gaps (a component built from
220
+ tokens, a missing token, an unclear rule, something broken) into one GitHub issue per gap on this repo, after checking
221
+ for an open one to add to. The other skills and the guide offer it when they finish. Without `gh` (claude.ai, Cowork)
222
+ it gives a link that opens the issue already filled in, through the new feedback issue form. No package change.
223
+
3
224
  ## 0.4.0 on npm (30 Oct 2026)
4
225
 
5
226
  The kit moves from GitHub Packages to the public npm registry, so anyone, any app and any deploy installs it with