@felloinnovations/brand-kit 0.0.0-stage → 0.5.0

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 (375) hide show
  1. package/AGENTS.md +286 -0
  2. package/CHANGELOG.md +328 -0
  3. package/README.md +208 -2
  4. package/assets/fello-ai-wordmark.svg +10 -0
  5. package/assets/fello-mark-white.png +0 -0
  6. package/assets/fello-mark-white.svg +11 -0
  7. package/assets/fello-mark.png +0 -0
  8. package/assets/fello-mark.svg +11 -0
  9. package/assets/fello-wordmark-white.png +0 -0
  10. package/assets/fello-wordmark-white.svg +10 -0
  11. package/assets/fello-wordmark.png +0 -0
  12. package/assets/fello-wordmark.svg +10 -0
  13. package/assets/powered-by-fello-dark.png +0 -0
  14. package/assets/powered-by-fello-light.png +0 -0
  15. package/design-system/01-how-claude-decides.md +164 -0
  16. package/design-system/02-principles.md +49 -0
  17. package/design-system/03-colour.md +169 -0
  18. package/design-system/04-type.md +63 -0
  19. package/design-system/05-space-and-layout.md +196 -0
  20. package/design-system/06-sizing-profiles.md +27 -0
  21. package/design-system/07-scrolling.md +83 -0
  22. package/design-system/08-choosing-components.md +129 -0
  23. package/design-system/09-charts.md +109 -0
  24. package/design-system/10-patterns.md +112 -0
  25. package/design-system/11-page-recipes.md +217 -0
  26. package/design-system/12-content.md +71 -0
  27. package/design-system/13-motion.md +341 -0
  28. package/design-system/14-accessibility.md +64 -0
  29. package/design-system/15-ai-experiences.md +56 -0
  30. package/design-system/16-creativity.md +53 -0
  31. package/design-system/17-decisions.md +496 -0
  32. package/design-system/18-checklist.md +125 -0
  33. package/design-system/19-public-pages.md +92 -0
  34. package/design-system/20-palettes.md +275 -0
  35. package/design-system/README.md +69 -0
  36. package/design-system/components/ActionList/README.md +127 -0
  37. package/design-system/components/ActionList/preview.html +93 -0
  38. package/design-system/components/ActionList/style.css +64 -0
  39. package/design-system/components/ActivityGrid/README.md +107 -0
  40. package/design-system/components/ActivityGrid/preview.html +159 -0
  41. package/design-system/components/ActivityGrid/style.css +35 -0
  42. package/design-system/components/AppShell/README.md +240 -0
  43. package/design-system/components/AppShell/preview.html +378 -0
  44. package/design-system/components/AppShell/style.css +154 -0
  45. package/design-system/components/Avatar/README.md +119 -0
  46. package/design-system/components/Avatar/preview.html +54 -0
  47. package/design-system/components/Avatar/style.css +14 -0
  48. package/design-system/components/Badge/README.md +114 -0
  49. package/design-system/components/Badge/preview.html +65 -0
  50. package/design-system/components/Badge/style.css +23 -0
  51. package/design-system/components/Banner/README.md +99 -0
  52. package/design-system/components/Banner/preview.html +57 -0
  53. package/design-system/components/Banner/style.css +19 -0
  54. package/design-system/components/Breadcrumb/README.md +93 -0
  55. package/design-system/components/Breadcrumb/preview.html +50 -0
  56. package/design-system/components/Breadcrumb/style.css +17 -0
  57. package/design-system/components/Button/README.md +164 -0
  58. package/design-system/components/Button/preview.html +136 -0
  59. package/design-system/components/Button/style.css +86 -0
  60. package/design-system/components/Card/README.md +203 -0
  61. package/design-system/components/Card/preview.html +204 -0
  62. package/design-system/components/Card/style.css +115 -0
  63. package/design-system/components/CardBoard/README.md +96 -0
  64. package/design-system/components/CardBoard/preview.html +62 -0
  65. package/design-system/components/ChatCard/README.md +197 -0
  66. package/design-system/components/ChatCard/preview.html +196 -0
  67. package/design-system/components/ChatCard/style.css +49 -0
  68. package/design-system/components/ChatShell/README.md +116 -0
  69. package/design-system/components/ChatShell/preview.html +201 -0
  70. package/design-system/components/ChatShell/style.css +86 -0
  71. package/design-system/components/ChatTurn/README.md +133 -0
  72. package/design-system/components/ChatTurn/preview.html +73 -0
  73. package/design-system/components/ChatTurn/style.css +50 -0
  74. package/design-system/components/CheckRow/README.md +141 -0
  75. package/design-system/components/CheckRow/preview.html +140 -0
  76. package/design-system/components/CheckRow/style.css +88 -0
  77. package/design-system/components/Checkbox/README.md +127 -0
  78. package/design-system/components/Checkbox/preview.html +145 -0
  79. package/design-system/components/Checkbox/style.css +45 -0
  80. package/design-system/components/Chip/README.md +141 -0
  81. package/design-system/components/Chip/preview.html +71 -0
  82. package/design-system/components/Chip/style.css +17 -0
  83. package/design-system/components/Combobox/README.md +134 -0
  84. package/design-system/components/Combobox/preview.html +90 -0
  85. package/design-system/components/Combobox/style.css +54 -0
  86. package/design-system/components/Composer/README.md +192 -0
  87. package/design-system/components/Composer/preview.html +162 -0
  88. package/design-system/components/Composer/style.css +81 -0
  89. package/design-system/components/ConfirmDialog/README.md +110 -0
  90. package/design-system/components/ConfirmDialog/preview.html +94 -0
  91. package/design-system/components/ConfirmDialog/style.css +5 -0
  92. package/design-system/components/Cover/preview.html +35 -0
  93. package/design-system/components/Cover/style.css +19 -0
  94. package/design-system/components/DateInput/README.md +157 -0
  95. package/design-system/components/DateInput/preview.html +101 -0
  96. package/design-system/components/DateInput/style.css +38 -0
  97. package/design-system/components/Dialog/README.md +164 -0
  98. package/design-system/components/Dialog/preview.html +190 -0
  99. package/design-system/components/Dialog/style.css +74 -0
  100. package/design-system/components/EmptyState/README.md +106 -0
  101. package/design-system/components/EmptyState/preview.html +73 -0
  102. package/design-system/components/EmptyState/style.css +9 -0
  103. package/design-system/components/EntryShell/README.md +107 -0
  104. package/design-system/components/EntryShell/preview.html +77 -0
  105. package/design-system/components/EntryShell/style.css +19 -0
  106. package/design-system/components/FeatureGrid/README.md +106 -0
  107. package/design-system/components/FeatureGrid/preview.html +55 -0
  108. package/design-system/components/FeatureGrid/style.css +20 -0
  109. package/design-system/components/FileUpload/README.md +117 -0
  110. package/design-system/components/FileUpload/preview.html +105 -0
  111. package/design-system/components/FileUpload/style.css +23 -0
  112. package/design-system/components/FilterBar/README.md +114 -0
  113. package/design-system/components/FilterBar/preview.html +82 -0
  114. package/design-system/components/FilterBar/style.css +22 -0
  115. package/design-system/components/Fold/README.md +139 -0
  116. package/design-system/components/Fold/preview.html +102 -0
  117. package/design-system/components/Fold/style.css +48 -0
  118. package/design-system/components/Footer/README.md +106 -0
  119. package/design-system/components/Footer/preview.html +49 -0
  120. package/design-system/components/Footer/style.css +30 -0
  121. package/design-system/components/FunnelBars/README.md +110 -0
  122. package/design-system/components/FunnelBars/preview.html +95 -0
  123. package/design-system/components/FunnelBars/style.css +13 -0
  124. package/design-system/components/GoalBars/README.md +116 -0
  125. package/design-system/components/GoalBars/preview.html +205 -0
  126. package/design-system/components/GoalBars/style.css +51 -0
  127. package/design-system/components/GoalTicks/README.md +104 -0
  128. package/design-system/components/GoalTicks/preview.html +144 -0
  129. package/design-system/components/GoalTicks/style.css +37 -0
  130. package/design-system/components/GoalTubes/README.md +94 -0
  131. package/design-system/components/GoalTubes/preview.html +157 -0
  132. package/design-system/components/GoalTubes/style.css +23 -0
  133. package/design-system/components/Heatmap/README.md +133 -0
  134. package/design-system/components/Heatmap/preview.html +168 -0
  135. package/design-system/components/Heatmap/style.css +119 -0
  136. package/design-system/components/Hero/README.md +111 -0
  137. package/design-system/components/Hero/preview.html +32 -0
  138. package/design-system/components/Hero/style.css +19 -0
  139. package/design-system/components/HoverCard/README.md +114 -0
  140. package/design-system/components/HoverCard/preview.html +107 -0
  141. package/design-system/components/HoverCard/style.css +59 -0
  142. package/design-system/components/IconButton/README.md +119 -0
  143. package/design-system/components/IconButton/preview.html +118 -0
  144. package/design-system/components/IconButton/style.css +45 -0
  145. package/design-system/components/Input/README.md +111 -0
  146. package/design-system/components/Input/preview.html +64 -0
  147. package/design-system/components/Input/style.css +23 -0
  148. package/design-system/components/KanbanBoard/README.md +140 -0
  149. package/design-system/components/KanbanBoard/preview.html +182 -0
  150. package/design-system/components/KanbanBoard/style.css +53 -0
  151. package/design-system/components/Kbd/README.md +92 -0
  152. package/design-system/components/Kbd/preview.html +41 -0
  153. package/design-system/components/Kbd/style.css +9 -0
  154. package/design-system/components/KitButton/README.md +142 -0
  155. package/design-system/components/KitButton/preview.html +93 -0
  156. package/design-system/components/KitButton/style.css +46 -0
  157. package/design-system/components/KitCard/README.md +131 -0
  158. package/design-system/components/KitCard/preview.html +79 -0
  159. package/design-system/components/KitCard/style.css +15 -0
  160. package/design-system/components/KitInput/README.md +106 -0
  161. package/design-system/components/KitInput/preview.html +65 -0
  162. package/design-system/components/KitInput/style.css +23 -0
  163. package/design-system/components/Leaderboard/README.md +121 -0
  164. package/design-system/components/Leaderboard/preview.html +118 -0
  165. package/design-system/components/Leaderboard/style.css +44 -0
  166. package/design-system/components/ListDetail/README.md +222 -0
  167. package/design-system/components/ListDetail/preview.html +213 -0
  168. package/design-system/components/ListDetail/style.css +148 -0
  169. package/design-system/components/LoadBar/README.md +79 -0
  170. package/design-system/components/LoadBar/preview.html +40 -0
  171. package/design-system/components/LoadBar/style.css +17 -0
  172. package/design-system/components/MarketingNav/README.md +122 -0
  173. package/design-system/components/MarketingNav/preview.html +69 -0
  174. package/design-system/components/MarketingNav/style.css +45 -0
  175. package/design-system/components/Matrix/README.md +129 -0
  176. package/design-system/components/Matrix/preview.html +99 -0
  177. package/design-system/components/Matrix/style.css +84 -0
  178. package/design-system/components/Menu/README.md +156 -0
  179. package/design-system/components/Menu/preview.html +105 -0
  180. package/design-system/components/Menu/style.css +61 -0
  181. package/design-system/components/Meter/README.md +102 -0
  182. package/design-system/components/Meter/preview.html +77 -0
  183. package/design-system/components/Meter/style.css +23 -0
  184. package/design-system/components/MetricTile/README.md +237 -0
  185. package/design-system/components/MetricTile/preview.html +241 -0
  186. package/design-system/components/MetricTile/style.css +129 -0
  187. package/design-system/components/Morph/README.md +106 -0
  188. package/design-system/components/Morph/preview.html +103 -0
  189. package/design-system/components/Morph/style.css +31 -0
  190. package/design-system/components/Motion/README.md +164 -0
  191. package/design-system/components/Motion/preview.html +2537 -0
  192. package/design-system/components/NumberInput/README.md +101 -0
  193. package/design-system/components/NumberInput/preview.html +79 -0
  194. package/design-system/components/NumberInput/style.css +34 -0
  195. package/design-system/components/PaceBar/README.md +75 -0
  196. package/design-system/components/PaceBar/preview.html +67 -0
  197. package/design-system/components/PaceBar/style.css +25 -0
  198. package/design-system/components/Page/README.md +109 -0
  199. package/design-system/components/Page/preview.html +58 -0
  200. package/design-system/components/Page/style.css +7 -0
  201. package/design-system/components/PageBar/README.md +122 -0
  202. package/design-system/components/PageBar/preview.html +98 -0
  203. package/design-system/components/PageBar/style.css +35 -0
  204. package/design-system/components/PageHero/README.md +122 -0
  205. package/design-system/components/PageHero/preview.html +89 -0
  206. package/design-system/components/PageHero/style.css +31 -0
  207. package/design-system/components/Pagination/README.md +106 -0
  208. package/design-system/components/Pagination/preview.html +107 -0
  209. package/design-system/components/Pagination/style.css +12 -0
  210. package/design-system/components/Panel/README.md +148 -0
  211. package/design-system/components/Panel/preview.html +139 -0
  212. package/design-system/components/Panel/style.css +51 -0
  213. package/design-system/components/PasswordInput/README.md +116 -0
  214. package/design-system/components/PasswordInput/preview.html +131 -0
  215. package/design-system/components/PasswordInput/style.css +31 -0
  216. package/design-system/components/Plate/README.md +129 -0
  217. package/design-system/components/Plate/preview.html +80 -0
  218. package/design-system/components/Plate/style.css +37 -0
  219. package/design-system/components/Popover/README.md +106 -0
  220. package/design-system/components/Popover/preview.html +66 -0
  221. package/design-system/components/Popover/style.css +41 -0
  222. package/design-system/components/PricingTable/README.md +112 -0
  223. package/design-system/components/PricingTable/preview.html +54 -0
  224. package/design-system/components/PricingTable/style.css +21 -0
  225. package/design-system/components/ProgressPetals/README.md +93 -0
  226. package/design-system/components/ProgressPetals/preview.html +98 -0
  227. package/design-system/components/ProgressPetals/style.css +27 -0
  228. package/design-system/components/README.md +151 -0
  229. package/design-system/components/Radio/README.md +121 -0
  230. package/design-system/components/Radio/preview.html +69 -0
  231. package/design-system/components/Radio/style.css +21 -0
  232. package/design-system/components/RankBar/README.md +97 -0
  233. package/design-system/components/RankBar/preview.html +117 -0
  234. package/design-system/components/RankBar/style.css +18 -0
  235. package/design-system/components/Ring/README.md +118 -0
  236. package/design-system/components/Ring/preview.html +109 -0
  237. package/design-system/components/Ring/style.css +49 -0
  238. package/design-system/components/ScoreHero/README.md +91 -0
  239. package/design-system/components/ScoreHero/preview.html +104 -0
  240. package/design-system/components/ScoreHero/style.css +32 -0
  241. package/design-system/components/Section/README.md +108 -0
  242. package/design-system/components/Section/preview.html +71 -0
  243. package/design-system/components/Section/style.css +18 -0
  244. package/design-system/components/Segmented/README.md +139 -0
  245. package/design-system/components/Segmented/preview.html +139 -0
  246. package/design-system/components/Segmented/style.css +94 -0
  247. package/design-system/components/SegmentedProgress/README.md +64 -0
  248. package/design-system/components/SegmentedProgress/preview.html +69 -0
  249. package/design-system/components/SegmentedProgress/style.css +11 -0
  250. package/design-system/components/Select/README.md +121 -0
  251. package/design-system/components/Select/preview.html +86 -0
  252. package/design-system/components/Select/style.css +22 -0
  253. package/design-system/components/ShareBar/README.md +69 -0
  254. package/design-system/components/ShareBar/preview.html +72 -0
  255. package/design-system/components/ShareBar/style.css +25 -0
  256. package/design-system/components/SideList/README.md +147 -0
  257. package/design-system/components/SideList/preview.html +139 -0
  258. package/design-system/components/SideList/style.css +94 -0
  259. package/design-system/components/Skeleton/README.md +102 -0
  260. package/design-system/components/Skeleton/preview.html +55 -0
  261. package/design-system/components/Skeleton/style.css +22 -0
  262. package/design-system/components/Slider/README.md +95 -0
  263. package/design-system/components/Slider/preview.html +49 -0
  264. package/design-system/components/Slider/style.css +13 -0
  265. package/design-system/components/Split/README.md +112 -0
  266. package/design-system/components/Split/preview.html +105 -0
  267. package/design-system/components/Split/style.css +30 -0
  268. package/design-system/components/Starter/README.md +72 -0
  269. package/design-system/components/Starter/preview.html +86 -0
  270. package/design-system/components/Stat/README.md +118 -0
  271. package/design-system/components/Stat/preview.html +58 -0
  272. package/design-system/components/Stat/style.css +15 -0
  273. package/design-system/components/StatTiles/README.md +113 -0
  274. package/design-system/components/StatTiles/preview.html +160 -0
  275. package/design-system/components/StatTiles/style.css +64 -0
  276. package/design-system/components/StatusLine/README.md +85 -0
  277. package/design-system/components/StatusLine/preview.html +49 -0
  278. package/design-system/components/StatusLine/style.css +14 -0
  279. package/design-system/components/StatusScreen/README.md +91 -0
  280. package/design-system/components/StatusScreen/preview.html +52 -0
  281. package/design-system/components/StatusScreen/style.css +9 -0
  282. package/design-system/components/StepLine/README.md +97 -0
  283. package/design-system/components/StepLine/preview.html +108 -0
  284. package/design-system/components/StepLine/style.css +62 -0
  285. package/design-system/components/Stepper/README.md +89 -0
  286. package/design-system/components/Stepper/preview.html +109 -0
  287. package/design-system/components/Stepper/style.css +13 -0
  288. package/design-system/components/StreakCalendar/README.md +89 -0
  289. package/design-system/components/StreakCalendar/preview.html +113 -0
  290. package/design-system/components/StreakCalendar/style.css +12 -0
  291. package/design-system/components/SuggestionChip/README.md +87 -0
  292. package/design-system/components/SuggestionChip/preview.html +42 -0
  293. package/design-system/components/SuggestionChip/style.css +20 -0
  294. package/design-system/components/Switch/README.md +119 -0
  295. package/design-system/components/Switch/preview.html +96 -0
  296. package/design-system/components/Switch/style.css +31 -0
  297. package/design-system/components/Table/README.md +177 -0
  298. package/design-system/components/Table/preview.html +182 -0
  299. package/design-system/components/Table/style.css +104 -0
  300. package/design-system/components/Tabs/README.md +113 -0
  301. package/design-system/components/Tabs/preview.html +76 -0
  302. package/design-system/components/Tabs/style.css +44 -0
  303. package/design-system/components/Testimonial/README.md +99 -0
  304. package/design-system/components/Testimonial/preview.html +39 -0
  305. package/design-system/components/Testimonial/style.css +12 -0
  306. package/design-system/components/TextArea/README.md +99 -0
  307. package/design-system/components/TextArea/preview.html +52 -0
  308. package/design-system/components/TextArea/style.css +12 -0
  309. package/design-system/components/ThemeSwitch/README.md +116 -0
  310. package/design-system/components/ThemeSwitch/preview.html +57 -0
  311. package/design-system/components/ThemeSwitch/style.css +6 -0
  312. package/design-system/components/TickRow/README.md +83 -0
  313. package/design-system/components/TickRow/preview.html +116 -0
  314. package/design-system/components/TickRow/style.css +23 -0
  315. package/design-system/components/TickStrip/README.md +95 -0
  316. package/design-system/components/TickStrip/preview.html +88 -0
  317. package/design-system/components/TickStrip/style.css +42 -0
  318. package/design-system/components/Tile/README.md +138 -0
  319. package/design-system/components/Tile/preview.html +107 -0
  320. package/design-system/components/Tile/style.css +36 -0
  321. package/design-system/components/Timeline/README.md +109 -0
  322. package/design-system/components/Timeline/preview.html +79 -0
  323. package/design-system/components/Timeline/style.css +25 -0
  324. package/design-system/components/Toast/README.md +104 -0
  325. package/design-system/components/Toast/preview.html +74 -0
  326. package/design-system/components/Toast/style.css +25 -0
  327. package/design-system/components/Tooltip/README.md +127 -0
  328. package/design-system/components/Tooltip/preview.html +88 -0
  329. package/design-system/components/Tooltip/style.css +78 -0
  330. package/design-system/components/TopBar/README.md +107 -0
  331. package/design-system/components/TopBar/preview.html +52 -0
  332. package/design-system/components/TopBar/style.css +35 -0
  333. package/design-system/components/TopicRail/README.md +108 -0
  334. package/design-system/components/TopicRail/preview.html +58 -0
  335. package/design-system/components/TopicRail/style.css +48 -0
  336. package/design-system/components/TrendBars/README.md +132 -0
  337. package/design-system/components/TrendBars/preview.html +117 -0
  338. package/design-system/components/TrendBars/style.css +25 -0
  339. package/design-system/components/TrendLine/README.md +164 -0
  340. package/design-system/components/TrendLine/preview.html +373 -0
  341. package/design-system/components/TrendLine/style.css +155 -0
  342. package/design-system/components/Well/README.md +134 -0
  343. package/design-system/components/Well/preview.html +67 -0
  344. package/design-system/components/Well/style.css +22 -0
  345. package/design-system/components/_house.css +324 -0
  346. package/design-system/components/bundle.css +4480 -0
  347. package/design-system/tokens.json +2617 -0
  348. package/dist/fello-core.css +3 -0
  349. package/dist/fello.css +7 -0
  350. package/dist/fello.scoped.css +7 -0
  351. package/dist/index.d.ts +288 -0
  352. package/dist/index.js +1247 -0
  353. package/dist/palettes.d.ts +464 -0
  354. package/dist/palettes.js +497 -0
  355. package/dist/scoped.d.ts +3 -0
  356. package/dist/scoped.js +16 -0
  357. package/dist/toast.d.ts +31 -0
  358. package/dist/toast.js +58 -0
  359. package/dist/tokens.d.ts +1856 -0
  360. package/dist/tokens.js +1842 -0
  361. package/package.json +112 -4
  362. package/scripts/check-palette.mjs +295 -0
  363. package/scripts/token-model.mjs +552 -0
  364. package/tokens/_dark.css +174 -0
  365. package/tokens/_palettes.css +46 -0
  366. package/tokens/_product.css +414 -0
  367. package/tokens/_source.hubl.css +379 -0
  368. package/tokens/design-tokens.json +949 -0
  369. package/tokens/palettes.ts +504 -0
  370. package/tokens/shadcn-compat.css +36 -0
  371. package/tokens/shadcn-compat.hsl.css +76 -0
  372. package/tokens/tokens.css +1465 -0
  373. package/tokens/tokens.md +825 -0
  374. package/tokens/tokens.root.css +1468 -0
  375. package/tokens/tokens.ts +1850 -0
package/AGENTS.md ADDED
@@ -0,0 +1,286 @@
1
+ # brand-kit for coding agents (0.5.0)
2
+
3
+ Read this before writing UI in any Fello project that uses `@felloinnovations/brand-kit`. It ships inside the
4
+ package at `node_modules/@felloinnovations/brand-kit/AGENTS.md`. The HubSpot website (felix-theme) is out of scope:
5
+ it follows its own repo's rules.
6
+
7
+ ---
8
+
9
+ ## Where things are
10
+
11
+ All paths are under `node_modules/@felloinnovations/brand-kit/`.
12
+
13
+ | Path | What it is |
14
+ | --- | --- |
15
+ | `design-system/README.md` | The guide's front page. Read it first. |
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, 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. |
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). |
25
+
26
+ The same guide is hosted, always current, at `https://brand-kit-site-production.up.railway.app/latest/llms.txt`
27
+ (pinned copies under `/v/0.5.0/`).
28
+
29
+ ---
30
+
31
+ ## Which stylesheet
32
+
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.
46
+ - **`tokens.css`** (`@felloinnovations/brand-kit/tokens.css`): the tokens only, as a Tailwind v4 `@theme`, so utilities
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.
49
+
50
+ A Tailwind v4 app usually takes both, with the font first:
51
+
52
+ ```css
53
+ @import url("https://fonts.googleapis.com/css2?family=Instrument+Sans:wght@400..700&display=swap");
54
+ @import "tailwindcss";
55
+ @import "@felloinnovations/brand-kit/tokens.css";
56
+ @import "@felloinnovations/brand-kit/fello.css";
57
+ @source "../node_modules/@felloinnovations/brand-kit/dist";
58
+ ```
59
+
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`.
145
+
146
+ ---
147
+
148
+ ## Face and layer
149
+
150
+ Name the face before choosing anything (guide chapter 01, step 0: product workspace, dashboard or report, entry,
151
+ public web page, email, deck, mockup). The face sets one of two layers, never mixed on one surface:
152
+
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
155
+ app's own thin components.
156
+ - **Marketing layer** (public pages, chapter 19): white cards at 4 px, the salmon gradient button, the kit's big type
157
+ steps, 16 px body. The package's React `Button`, `Card`, `Input`, `Badge`, `Checkbox`, `Radio` and `Stat` are this
158
+ layer (`KitButton`, `KitCard` and friends in the catalog).
159
+
160
+ `Tabs`, `Skeleton`, `Label` and `Toaster` (from `@felloinnovations/brand-kit/toast`) serve both.
161
+
162
+ ---
163
+
164
+ ## The rules
165
+
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.
168
+ - **Tailwind v4:** write `text-[color:var(--x)]` and `text-[length:var(--x)]`, never bare `text-[var(--x)]`. Tailwind
169
+ cannot tell a colour from a size behind a bare `var()`, guesses font-size, and drops the colour silently. This has
170
+ already shipped a bug. Never `--radius-xl` or `--radius-2xl` for a product corner: those are Tailwind's.
171
+ - **Semantic tokens over primitives**: `var(--color-text-heading)`, not `var(--color-brand-navy)`, for the same job.
172
+ The semantic layer is what lets a colour be retuned, and what turns in dark.
173
+ - **Check the catalog before building a component.** Never redraw one. If the kit has nothing for it, build it in
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
176
+ from a consuming app; the kit's owners take it from there.
177
+ - **Close but not exact**: pass `className` to a React export (merged through `tailwind-merge`, so your utility wins).
178
+ Do not fork it.
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`.
187
+ - **Every page scrolls**: no content trapped by a nested `overflow: hidden` or a fixed-height parent. A field on the
188
+ cream page has a white ground (`ws-field`).
189
+ - **Words**: sentence case, no em dashes, nothing developer-facing on a screen, never a faked card or number.
190
+
191
+ Before calling UI done, run `design-system/18-checklist.md`.
192
+
193
+ ---
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
+
259
+ ## Provisional values
260
+
261
+ Not signed off and **will change**. Do not build anything load-bearing on them, and flag it when you use one:
262
+
263
+ - `--color-feedback-*`, `--color-alert`, `--color-stat-positive`: inherited from the HubSpot boilerplate.
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.
266
+
267
+ ---
268
+
269
+ ## Paste this into your project
270
+
271
+ Add to the consuming repo's `CLAUDE.md` or `AGENTS.md`:
272
+
273
+ ```markdown
274
+ ## Design system
275
+
276
+ This project uses `@felloinnovations/brand-kit` (the Fello brand kit). Before writing any UI, read
277
+ `node_modules/@felloinnovations/brand-kit/AGENTS.md`, then the guide's front page
278
+ `node_modules/@felloinnovations/brand-kit/design-system/README.md` and its workflow `01-how-claude-decides.md`.
279
+
280
+ Every value is a token in `node_modules/@felloinnovations/brand-kit/tokens/tokens.md`: never invent a colour,
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.
286
+ ```
package/CHANGELOG.md ADDED
@@ -0,0 +1,328 @@
1
+ # Changelog
2
+
3
+ ## 0.5.0 (4 Nov 2026)
4
+
5
+ The kit the whole team can trust: teams kept hitting alignment, spacing and placement bugs, and Seth (the designer) has
6
+ new, detailed work to learn from. 0.5.0 rebuilds the product layer on his six Fia frames and his North app, fixes every
7
+ fault the field found, stops `fello.css` restyling other apps, adds an opt-in dark theme and lets every app keep its own
8
+ palette. Fifteen decisions set the defaults (D1 to D15 in Decisions, 4 Nov 2026), D1 to D14 open to Amit's veto; every
9
+ kit rule they overturn is logged with Seth's source.
10
+
11
+ - **Seth's layout, measured.** One content edge per surface; numbers in fixed right-aligned columns; rows in a list share
12
+ one min-height and a selected row never changes size; dividers 0.5 px and full width; four half steps on the 4 px
13
+ 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
14
+ and bottom; layouts re-lay out by the room they have, never just shrink.
15
+ - **The rimmed card.** Every product card is Seth's tray: a 1 px #EDEDED rim, concentric corners (8 and 7; a drawer 12
16
+ and 11), the cream surface, an optional foot on the rim, no outline and no shadow at rest. Same class names, so markup
17
+ upgrades in place except the items in "Upgrading from 0.4" below.
18
+ - **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
19
+ row names.
20
+ - **Words AA on every ground.** Every word token is computed on eight grounds in light, night and navy, and the build
21
+ stops on a fail. Muted words are #666666. New word and mark tokens for needs work (pink), alert and past halfway; a
22
+ rating is teal, mid blue or pink.
23
+ - **Motion from North**: role-named durations, curves and staggers, and Seth's springs in `tokens.ts` (`springs`,
24
+ `eases`); hover is a colour, never a lift; opens grow from their slot and their details settle after; loading is a
25
+ shimmer in the chart colours. Everything is still under reduced motion, by a net on every kit element.
26
+ - **Motion comes with the components, and the guide says how.** Seth's springs are CSS too (`--ws-spring-<name>` over
27
+ `--ws-spring-<name>-duration`, a `linear()` curve with its overshoot kept), so buttons and chips press on a spring,
28
+ `Segmented`, `Tabs`, `AppShell`, `SideList` and `ListDetail` slide their indicator (CSS anchor positioning), every
29
+ kit `<details>` and `.ws-unfold` folds, and menus, popovers, dialogs, toasts, tooltips, hover cards and panels grow
30
+ in from their source and leave quicker; `morph()` and `reorder()` do the two moves CSS cannot start. Motion is
31
+ rewritten by situation (hover, press, a choice, a fold, an overlay, full screen, a reorder, a dashboard, loading,
32
+ charts), with which spring to use when, the reduced-motion and older-browser fallbacks, and the Motion card as the
33
+ reference; the skill, AGENTS.md, the Checklist, `brand-new` and `brand-audit` carry the same rules, and
34
+ `check-geometry --hover --motion` catches a hover lift that only plays with motion on.
35
+ - **Dashboards build in, in every app** (Amit, 5 Nov). `.ws-build` on a page or section: its cards rise in 70 ms apart
36
+ and each card's charts draw as it lands, once, as it scrolls into view (a scroll trigger where the browser has one,
37
+ first paint elsewhere). `MetricTile` gains North's mini charts (a column strip, a line with dots) that grow and draw
38
+ in and wake to their tone on hover; `SideList` goal rows fill in order, navy, teal past the goal, red behind.
39
+ - **`TrendLine`, a value over periods as a line or as columns.** Bars / Line morphs between them: the columns melt into
40
+ the line on `--ws-spring-morph-chart` while it draws, and grow back down from the dots. A band slides to the hovered
41
+ period and a dot grows; a real table reads it out. It builds in on arrival, or as it scrolls into view. Motion's
42
+ playground now opens on a dashboard that builds in (four tiles, the goals, the chart card) with Replay the arrival.
43
+ - **Full screen covers the window from anywhere.** `morph(update, { as: 'full', el })` lifts a chat card into the top
44
+ layer while it is full (a manual popover), with Escape (`close`) and focus in and back, so the chat's glass, AppShell's
45
+ stage or any ancestor with a transform, filter, `contain` or `will-change` no longer squashes it into a strip. The
46
+ stage draws its blur on a layer, so a toaster or a phone's full-screen panel inside it reaches the window, and a
47
+ tooltip anchors to the window, so the bar and the body's scroll no longer cut it. The Motion card opens on a
48
+ playground: a product screen with every North move live and a numbered hint at each.
49
+ - **Focus you can see**: a 2 px navy ring 2 px outside everything that takes focus, drawn inside dense rows. The old
50
+ salmon halo was 1.21:1.
51
+ - **Dark, opt-in**: `data-theme="dark"` or `"system"` on `<html>` or any container, `data-ground="navy"` for the navy
52
+ ground; the nearest wins, so light inside dark works and the reverse. A page that sets nothing stays light. Brand
53
+ colours stay literal; semantic tokens carry the swap.
54
+ - **Palettes: one kit, many apps** (D15). A palette sets only the contract, 33 existing semantic tokens listed with
55
+ their meaning in `design-tokens.json` and the new Palettes chapter; everything derived recomputes inside the element
56
+ that sets it, and so does a contract token the kit derives (the focus ring from the heading, the raised ground, the
57
+ alert and positive words, the rating and agent tones) unless the palette sets it. Built-ins named for how they look:
58
+ `default` (no attribute), `cool`, `warm`. The first product's tally navy gets no palette: Seth's #2C4870 wins (D1)
59
+ and the product adopts it. On `<html>` or any container, light or dark, nested either way, in `fello.css` and the
60
+ scoped build, so many apps in one bundle each keep their own. `scripts/check-palette.mjs` ships in the package and
61
+ checks any app's palette file (contract only, every word AA on every ground, the focus ring and the act 3:1, chart
62
+ tones apart) in light, night and navy; `--emit` then writes the file to ship, in the built-ins' own form, so an app's
63
+ palette nests anywhere too and load order no longer matters. A dark value a palette leaves out is the kit's derived
64
+ dark, never its light value. `palettes` and `contract` come from the package and
65
+ `@felloinnovations/brand-kit/palettes`. The gallery's Components page gains a theme and palette switch.
66
+ - **Every colour follows the palette** (D15), in light, night and the navy ground. Component styles carry no colour
67
+ literal (`build-bundle --check` fails on one), and every colour a component paints derives from the contract. The
68
+ dark tints and fades are now their tone over the dark page (within CIEDE2000 3.5 of the old literals), so an app's
69
+ dark page moves them; the dark alert tone #FF5A5A became #FF5470, which a chart can tell from salmon. New tokens
70
+ (none renamed): `--ws-frame-top`, `--ws-stage-foot`, `--ws-agent-coach`, `--ws-agent-growth`, `--ws-agent-recruit`;
71
+ `--ws-ink` and `--ws-shade` (the ink of washes and rings, the tint of a drop); `--ws-inverse` and `--ws-on-inverse`
72
+ (the toast, note and footer pair); `--ws-control-off` (a switch's off track); `--ws-shimmer-ground`; `--ws-glow-rose`,
73
+ `--ws-glow-pink`, `--ws-glow-blue` and `--ws-orb`; `--ws-mask` for mask stops. `--ws-ink-rgb` and `--ws-shade-rgb`
74
+ stay as legacy and do not follow a palette. Kit aliases now: `--color-border-default` is `--ws-edge`, the hairline
75
+ `--ws-edge-card`, `--color-stat-positive` `--ws-chart-finished`, `--color-text-brand-strong` `--ws-word-needs`.
76
+ Still the brand's under any palette, by ruling: the toast, the note tip and the footer keep the brand navy with white
77
+ words in dark; `KitButton`'s salmon and navy acts and the `Cover` logo; the navy ground's fields. Proof:
78
+ `check-palette` finds a leftover statically (a colour a component reads that no contract token moves), and the
79
+ poison test (`scripts/palette-poison.mjs`, run in CI from `check-scope`) sets each contract token to a wild colour
80
+ on `<html>` and on a container around every preview, light and dark, and finds nothing stale, leaked or constant.
81
+ - **`fello.css` stops leaking** into the apps around it: every rule sits in a `fello` layer nested in Tailwind's own, so
82
+ utilities win; resets touch only kit elements; Tailwind's radius names stay the host's. New `fello.scoped.css` and
83
+ `@felloinnovations/brand-kit/scoped` (the CSS as a string) put everything under a `.fello` root for a guest app in a
84
+ shared host. `shadcn-compat.hsl.css` for `hsl(var(--x))` configs; `--primary` is now the navy act.
85
+ - **The shell owns its scroll** (the Revenue OS audit, K1 to K17): nothing squashed by its scroller, screen-reader words
86
+ no longer stretch the window, dialogs scroll and fit the window, drawers are the whole screen on a phone, menus open
87
+ in the top layer, one touch block (40 px boxes, 24 px words), inline icons sized (`ws-icon`).
88
+ - **New components**: Split, HoverCard, ListDetail, SideList, Matrix, CheckRow, Slider, FilterBar, ThemeSwitch,
89
+ TickStrip, ScoreHero, SegmentedProgress, ShareBar, StepLine, Heatmap, MetricTile, PaceBar, StatusLine, LoadBar,
90
+ SuggestionChip, TopicRail and ChatShell. Issues #5 to #12 are done (GoalBars, the v7 ring, TickRow sizes, the Example
91
+ tag, the tile row, the snug card, the first-open recipe).
92
+ - **The guide**: Space and layout, Motion, Scrolling, Colour and Type rewritten; interaction states (hover, press, focus,
93
+ selected, pending, loading) in Patterns; every new component in Choosing components and Charts; three new recipes
94
+ (the first open of an AI app's thread, a report with its drawer, an inbox list and detail) and a dashboard home;
95
+ Accessibility on focus and reduced motion; Checklist gains the geometry check and a senior QA list.
96
+ - **Checks**: `yarn check:geometry` measures every preview at 320, 390 and 1440 (`--theme dark`, `--palette cool`,
97
+ `--hover` for focus);
98
+ `yarn check:scope` proves the scoped build changes nothing outside `.fello` and `fello.css`'s resets never touch
99
+ the host's markup. The skills and AGENTS.md cover the scoped build,
100
+ dark and the checks; `brand-adopt` gains the guest-app path (no root lockfile or Dockerfile change).
101
+
102
+ ### Upgrading from 0.4
103
+
104
+ Most markup keeps working: the class names stay, and a card, a button or a row takes the new look by itself. These are
105
+ the exceptions. After the bump, run `yarn check:geometry` on your own previews (or look at each screen at 320, 390 and
106
+ 1440) before you ship.
107
+
108
+ **Classes removed** (7, the only ones 0.4 had that 0.5 does not)
109
+
110
+ | 0.4 | 0.5 |
111
+ | --- | --- |
112
+ | `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` |
113
+ | `ws-stat-tiles__ticks` | A `ws-tick-row` (`--tall` for Seth's size) inside `ws-stat-tiles__value-row`, beside the figure |
114
+ | `ws-funnel-bars__fill--first` | Delete it: every bar takes the same 4 px corners now |
115
+
116
+ **Markup to change**
117
+
118
+ | Piece | 0.4 | 0.5 |
119
+ | --- | --- | --- |
120
+ | 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 |
121
+ | 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 |
122
+ | 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 |
123
+ | A page in AppShell | a `.ws-page` inside `__body` | No `.ws-page` there: the body is the page (its gutter, gap and size container) |
124
+ | 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 |
125
+ | 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 |
126
+ | 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 |
127
+ | 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 |
128
+ | 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` |
129
+
130
+ **Looks and behaviour that change on their own**
131
+
132
+ - **Focus**: a 2 px navy outline 2 px outside, on `:focus-visible`, replaces the salmon halo (it was 1.21:1). A host rule
133
+ such as `*:focus { outline: none }` now hides the kit's focus: remove it.
134
+ - **Corners**: buttons and square icon buttons 6 (were 4); `IconButton` is a square, `ws-icon-btn--round` for voice and
135
+ send; chips 4 (were 2); checkboxes and radios 18 px with 4 px corners and a navy edge (were 16 and grey); cards 8
136
+ outside, 7 inside; dialogs and drawers 12; menus 10; the toast an 18 px pill.
137
+ - **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
138
+ replaces the rim. A child that rounds with the card takes `--ws-radius-card-inner`. Hover on a pressable card darkens
139
+ the rim; nothing lifts.
140
+ - **Buttons**: words 13/18 (were 14/16), `--lg` 40 tall (was 36), `--secondary` has no fill (the cream is gone; the new
141
+ `--well` sits on the tray), primary hover brightens instead of dimming. A button still stays on one line and never
142
+ 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`
143
+ (balanced lines). The halves of a `ws-btn-split` stack, full width, instead of breaking a label.
144
+ - **Card heads wrap**: in a `.ws-head` the aside drops under the title, as one piece, when it would squeeze the title
145
+ below 200 px, where 0.4 kept one line. Put controls that may drop together in one element (a `ws-cluster`). Icon acts
146
+ (a close, an expand) never drop: they stay top right on the title's first line and the title wraps.
147
+ - **Stacks**: `ws-stack` and `ws-cluster` are 8 apart and no longer read a `--ws-gap` set on a parent; take a modifier
148
+ for another gap (`--tight`, `--loose`, `--component`, `--group`, and on a stack `--block` 32 or `--section` 56).
149
+ - **Titles** (`ws-title`, `ws-section`) lose their -0.5% tracking and balance their lines.
150
+ - **Hover only where a pointer hovers**: every kit hover sits in `@media (hover: hover)`, so a tap on a phone never
151
+ leaves it stuck. A hover of your own on a kit piece needs the same query.
152
+ - **Sizes**: the page gutter is 32 (was 24, still 16 on a phone); the folded rail 64 (was 72); a PageBar title 16/22
153
+ (was 26/32) and one line, with an ellipsis; muted words #666666 (were #6E6E6E). Breadcrumb links are body grey with a
154
+ "/" (were mid blue with chevrons). Section rows lost their 8 px sides and 6 px corners. Toasts are navy pills.
155
+ - **Tailwind's radius names are the host's again**: `tokens.css` no longer sets `--radius-xs` to `--radius-2xl`, so
156
+ `rounded-xl` and `rounded-2xl` go back to Tailwind's own sizes. Use the `--ws-radius-*` lengths for kit corners; every
157
+ kit piece, the marketing ones and the React exports included, rounds with them, so a shadcn `--radius` no longer
158
+ moves a kit corner.
159
+ - **The font in a Tailwind v4 app**: put the Instrument Sans `@import` before `@import "tailwindcss"` (AGENTS.md), or a
160
+ `<link>` in the head. Compiled into one stylesheet, `fello.css`'s own font `@import` lands after Tailwind's rules,
161
+ where a browser drops it, so the face never loaded.
162
+ - **shadcn**: `--primary` in `shadcn-compat.css` is now the navy act with `ws-on-act` words (was salmon with white).
163
+ - **A `:root` override of a chart tone**: the chart fades, tints and empty cell are literal on `:root` and derive on
164
+ every palette or theme element, so a bare `:root { --ws-chart-under-half: X }` without `data-palette` no longer moves
165
+ them. Put the change in a palette.
166
+ - **Washes of your own**: `rgba(var(--ws-ink-rgb), a)` still paints, in the default's colours only (it follows the
167
+ theme, not a palette). Write `color-mix(in srgb, var(--ws-ink) 5%, transparent)` (and `--ws-shade` for a drop) so it
168
+ follows a palette.
169
+ - **Layers**: `fello.css` sits in cascade layers (`theme.fello`, `base.fello`, `components.fello`, inside Tailwind's own),
170
+ so your utilities win, and so does any unlayered CSS of yours. In 0.4 a bare `button { ... }` or `body { ... }` rule of
171
+ the host lost to the kit; now it wins. Put such rules in a layer, scope them away from `ws-*` elements, or take the
172
+ scoped build. Tailwind v3 (its preflight is unlayered) always takes the scoped build.
173
+ - **An artifact** inlines `fello-core.css` (unlayered) and the blocks of the components it uses, as `Starter` and the
174
+ skill do, not the whole `fello.css`, which is now over 400 kB and layered.
175
+
176
+ **Opting in**
177
+
178
+ - **Dark**: `<html data-theme="dark">` for the night ground, `data-theme="system"` to follow the person's setting, and
179
+ `data-ground="navy"` beside it for the navy ground (brand and event pages). A page that sets nothing stays light.
180
+ In the scoped build the same attributes work on the `.fello` element or any ancestor; a host's `.dark` class does not
181
+ turn the kit.
182
+ - **A palette**: an app whose colours differ a little from the kit's sets `data-palette` instead of retuning kit
183
+ tokens on `:root`: a built-in, or its own file of contract tokens, checked with
184
+ `node node_modules/@felloinnovations/brand-kit/scripts/check-palette.mjs <file>` and shipped as
185
+ `check-palette.mjs --emit <file> > <file>.shipped.css` writes it. The `brand-adopt` skill has the step. A theme
186
+ selector of your own can now be `[data-theme="dark"] .x` on any element.
187
+ - **The scoped build**, for an app inside a host it does not own (a platform's guest app, a shared bundle) or any
188
+ Tailwind v3 app: `import { felloScopedCss } from '@felloinnovations/brand-kit/scoped'` and render
189
+ `<div className="fello"><style>{felloScopedCss}</style>...</div>`, or link `fello.scoped.css`. Put `class="fello"` on
190
+ every portal's root too (menus, tooltips, dialogs rendered outside the app). It has no font `@import`: link Instrument
191
+ Sans yourself. `yarn check:scope` proves it changes nothing outside `.fello`.
192
+
193
+ ## Feedback loop (30 Oct 2026)
194
+
195
+ What the kit misses now reaches its owners. A new `brand-feedback` skill turns a job's gaps (a component built from
196
+ tokens, a missing token, an unclear rule, something broken) into one GitHub issue per gap on this repo, after checking
197
+ for an open one to add to. The other skills and the guide offer it when they finish. Without `gh` (claude.ai, Cowork)
198
+ it gives a link that opens the issue already filled in, through the new feedback issue form. No package change.
199
+
200
+ ## 0.4.0 on npm (30 Oct 2026)
201
+
202
+ The kit moves from GitHub Packages to the public npm registry, so anyone, any app and any deploy installs it with
203
+ `npm install @felloinnovations/brand-kit`: no token, no `.npmrc`. Same 0.4.0 tokens, CSS and components; the install
204
+ steps in the README, the skills and llms.txt drop every token line. Releases publish from GitHub through npm's
205
+ trusted publishing, with no stored token.
206
+
207
+ ## 0.4.0
208
+
209
+ The kit gains its guide. Lokesh's design system (his Claude Design System
210
+ export of 26 Oct 2026, built from the first product on the kit) is now part
211
+ of the kit, in `design-system/`: a front page and chapters on how to decide a
212
+ screen, the foundations, patterns, page recipes, content, motion and
213
+ accessibility, plus a catalog of 74 components, each with a README and a
214
+ static preview. It ships in the package and is published as Claude's design
215
+ system, so Claude's Design and Slides use it.
216
+
217
+ - **Any Fello build, not only workspace screens.** "How Claude decides" covers
218
+ seven faces (product workspace, dashboard or console, entry, public web page,
219
+ email or one-pager, deck, mockup or artifact) and two layers (product,
220
+ marketing), with a quick path at the top for artifacts and mockups. New
221
+ chapter: Public pages. Built from our products and the website.
222
+ - **The kit's CSS styles every component.** All catalog styles live in
223
+ `bundle.css` under `ws-<component>` names; previews are markup only. New:
224
+ `ActionList` (a card's list of next acts), `Page` (`.ws-page`, `.ws-board`),
225
+ `PageBar`, `Kbd`, and `Starter` (a paste-ready page).
226
+ - **`fello-core.css`** (tokens and house styles, minified, ~29 kB) plus each
227
+ component's own styles: an artifact inlines only what it uses instead of the
228
+ whole 140 kB `fello.css`. Each component's card in the skill lists its styles.
229
+
230
+ - **One token source, now with the product layer.** The `--ws-*` tokens
231
+ (surfaces, edges, AA words, chart tones, gaps, corners, control heights,
232
+ layout widths, motion) live in `tokens/_product.css`, written the way the
233
+ first product writes them (as kit steps, so they move with the kit), and
234
+ `yarn tokens` emits them with the kit's 106 into every output: 225 tokens
235
+ in `tokens.css`, `tokens.root.css`, `tokens.ts` and `tokens.md`. Includes
236
+ the hero washes (`--ws-team-glow`, `--ws-cool-glow`) and
237
+ `--ws-ease-spring` (no overshoot, so it is the soft curve).
238
+ - **`design-system/tokens.json` is generated** by the same run, in the
239
+ Claude Design System list format: values resolved to literals (a formula
240
+ kept at the end of its usage note), colour aliases kept, Lokesh's notes,
241
+ order and type groups preserved, and the format's rules checked so a bad
242
+ value fails the run instead of vanishing from the page.
243
+ - Kit names keep the kit's values: `--color-text-muted` is #6E6E6E (4.95:1 on
244
+ the cream) and the 0.3.0 text tokens (`--color-text-placeholder`,
245
+ `--color-text-brand-strong`, `-error-strong`, `-success-strong`) are in the
246
+ design system too. `--ws-word-needs` is now `--color-text-brand-strong`
247
+ (same hex). Field placeholders in `bundle.css` use
248
+ `--color-text-placeholder` instead of Gray 5 (2.3:1).
249
+ - **`fello.css`**: one stylesheet with the whole kit, Instrument Sans plus
250
+ every token as `:root` plus the house component styles (`ws-*` classes).
251
+ `import '@felloinnovations/brand-kit/fello.css'`, built into `dist/` by
252
+ every tsup run.
253
+ - **Hosted on the gallery**, with open CORS: `/latest/` and `/v/0.4.0/` each
254
+ serve `fello.css`, `tokens.css`, `tokens.json`, `llms.txt`,
255
+ `llms-full.txt`, `guide/<chapter>.md` and
256
+ `components/<Name>/README.md` + `preview.html`; `/llms.txt` at the root.
257
+ `/v/` is cached as immutable, `/latest/` is not cached.
258
+ - **`llms.txt`**: a short index of the kit for any model (what it is, how to
259
+ use it in Claude, in an artifact, a plain page and a React app, and a link
260
+ with one line for every chapter and component). `llms-full.txt` is the
261
+ whole guide in one file.
262
+ - The package now ships `design-system/` (export `./design-system/*`), so a
263
+ coding agent reads the guide from `node_modules`.
264
+ - New component: **Kbd**, a key as printed on the keyboard (`.ws-kbd`).
265
+ - The gallery has a **Guide** page (the design system, chapter by chapter)
266
+ and a **Components** page (every preview, live, on `fello.css`).
267
+
268
+ ## 0.3.0
269
+
270
+ Accessibility. Six colour pairs were failing WCAG AA and are fixed:
271
+
272
+ - `--color-text-muted` un-aliased from Gray 6. #7F7F7F was 4.00:1 on white
273
+ and 3.89:1 on the cream page, so every muted label in the estate failed. Now
274
+ #6E6E6E, 5.10:1 and 4.95:1. The grey ramp is unchanged for fills and rules.
275
+ - New `--color-text-brand-strong`, `--color-text-error-strong` and
276
+ `--color-text-success-strong`: the brand and feedback hues darkened until
277
+ they clear 4.5:1 on their own tint. Badge labels now use these, which is why
278
+ a salmon badge's text is not salmon.
279
+ - `--color-text-placeholder`. Input placeholders were Gray 5 at 2.35:1.
280
+ - `Stat` used a raw 28px; now on the scale.
281
+
282
+ **Still failing, and not changed:** white on the primary button, 2.44 to
283
+ 2.65:1. That is the live brand CTA, so it is a brand decision rather than a
284
+ kit one.
285
+
286
+ Logos and brand assets ship with the kit, and the gallery serves them
287
+ individually and as a zip.
288
+
289
+ ## 0.2.1
290
+
291
+ - `AGENTS.md` and generated `tokens/tokens.md` ship inside the package, so a
292
+ coding agent in a consuming repo can read the rules and every token value.
293
+ - CI regenerates `tokens/` and `dist/` and fails on any diff, since both are
294
+ generated but committed.
295
+ - Releases publish from GitHub Actions on a tag, using the runner's own
296
+ token. Nobody needs a personal token with `write:packages`.
297
+
298
+ ## 0.2.0
299
+
300
+ - **Checkbox** and **Radio** / **RadioGroup**, native inputs under a custom
301
+ skin so form participation, autofill and keyboard behaviour stay the
302
+ browser's.
303
+ - **Tabs**, on Radix, with `underline` and `pill` variants.
304
+ - **Card**: radius drops to 4px, surface is white by default, shadow only when
305
+ `interactive`. New `surface` prop (`white` / `tinted` / `transparent`).
306
+ - **Toast** gets a gallery page, and its action button is brand salmon rather
307
+ than sonner's default black.
308
+ - Gallery is one page per section with hash routing, rather than one long
309
+ scroll.
310
+ - `AGENTS.md` and generated `tokens/tokens.md` for coding agents.
311
+ - New runtime dependency: `@radix-ui/react-tabs`.
312
+
313
+ ## 0.1.1
314
+
315
+ - **Fixed:** every `text-[var(--color-*)]` was parsed by Tailwind v4 as a
316
+ font-size, so primary and navy buttons rendered their labels in inherited
317
+ body ink instead of white.
318
+ - **Fixed:** `buttonVariants()` used directly on an `<a>` lost its border.
319
+ Each variant now owns its border rather than relying on `tailwind-merge` to
320
+ resolve a base/variant conflict.
321
+ - `Toaster` moved to the `/toast` subpath so `sonner` is genuinely optional.
322
+
323
+ ## 0.1.0
324
+
325
+ - 102 tokens generated from the Figma capture of
326
+ `Marketing - Design System 3.0`: `tokens.css` (Tailwind v4),
327
+ `tokens.root.css` (plain CSS), `tokens.ts` (typed), `shadcn-compat.css`.
328
+ - Button, Badge, Card, Input, Label, Skeleton, Stat, Toaster.