@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
@@ -1,34 +1,34 @@
1
1
  Ordered steps on a line that fills: done is a tick, the one in hand is ringed, the rest wait their turn.
2
2
 
3
- **Use it when**
3
+ ## Use it when
4
4
 
5
5
  - Something happens in a known sequence and the person benefits from seeing where it is (a setup's path, an onboarding
6
6
  checklist, an audit).
7
7
  - Several things run at once rather than in order (a scan's sources), and the page needs to say which are being read right now.
8
8
 
9
- **Not for**
9
+ ## Not for
10
10
 
11
11
  - A share of a goal or a percent: use `GoalTicks` or `Ring`.
12
12
  - A count out of a whole: use `TickRow`.
13
13
  - A plain loading wait with no named steps: a working chip or spinner, not a `Stepper`.
14
14
 
15
- **Anatomy**
15
+ ## Anatomy
16
16
 
17
17
  - Mark: `--space-lg` (24 px) circle, 12 px semibold tabular numerals.
18
18
  - Done: filled `--color-stat-positive` (teal), a white check, popping in on arrival.
19
19
  - In hand: the cream with a 2 px (`calc(--ws-hairline * 4)`) navy inset ring, the step's number inside.
20
- - Waiting: the cream with the fine hairline ring, muted grey number.
20
+ - Waiting: the cream with the fine hairline ring (drawn inside), muted grey number.
21
21
  - Connecting line: a 1 px (`calc(--ws-hairline * 2)`) line between marks in `--ws-edge`, filled teal top to bottom when its step above is done.
22
- - Title: 14 px medium navy; a note under it in `ws-muted` (how far, or "Done").
22
+ - Title: 14 / 20 medium navy, its first line level with the mark; a note under it in `ws-muted` (how far, or "Done").
23
23
 
24
- **Variants and sizes**
24
+ ## Variants and sizes
25
25
 
26
26
  | Variant | What changes |
27
27
  | --- | --- |
28
28
  | In order (default) | The first step not done is the one in hand, found automatically |
29
29
  | Side by side (`active` set on any step) | Only steps with `active: true` are in hand (several at once); none active means none are in hand, every undone step simply waits |
30
30
 
31
- **States**
31
+ ## States
32
32
 
33
33
  - Default: the first undone step is in hand, ringed in navy; everything after it waits.
34
34
  - In hand (parallel): rings navy and breathes on `ws-working`, because something is actually in progress right now.
@@ -36,32 +36,54 @@ Ordered steps on a line that fills: done is a tick, the one in hand is ringed, t
36
36
  - Done: a filled teal circle with a check, popping in (`ws-pop`) the moment it completes, and the line below it filling down (`ws-grow-up`) the same moment.
37
37
  - Disabled / error / hover / focus / pressed / selected: do not apply; a step is a status, not a control.
38
38
  - Reduced motion: ticks, rings and the filling line are all simply in their final state, no pop, breathe or growth.
39
+ - Dark: the teal done mark keeps its tone with the dark act's tick (7.3:1); the rings and words take their dark values.
39
40
 
40
- **Behaviour**
41
+ ## Behaviour
41
42
 
42
43
  - `<ol aria-label="…">`, each step `aria-current="step"` when it is the one in hand, so assistive tech announces it the way a wizard would.
43
- - Motion: a step's line fills on `ws-grow-up` the moment it completes; its tick pops on `ws-pop`; an in-hand mark in the parallel mode pulses on `ws-working` (`--ws-loop`, 1.2 s); still with reduced motion.
44
+ - Motion: a step's line fills on `ws-grow-up` the moment it completes; its tick pops on `ws-pop`; an in-hand mark in the parallel mode pulses on `ws-working` (`--ws-loop`, 1 s); still with reduced motion.
44
45
  - No pointer or keyboard behaviour; the stepper only reports progress, it never advances on its own click.
45
46
 
46
- **Content**
47
+ ## Content
47
48
 
48
49
  - A step's title says what it does, not just its name ("Writing the three recommendations", not "Step 3").
49
50
  - The note under an in-hand step says how far ("2 of 4") or what is happening now ("Reading now"); a waiting step carries no note.
50
51
 
51
- **Props**
52
+ ## Props
52
53
 
53
54
  | Name | Type | Meaning |
54
55
  | --- | --- | --- |
55
56
  | `label` | `string` | Names the whole sequence for the `<ol>` |
56
57
  | `steps` | `{ key, title, note?, done, active? }[]` | Each step; `active` turns on the side-by-side mode across the whole list |
57
58
 
58
- **Rules**
59
+ ## Rules
59
60
 
60
61
  - Sequences and waits are steps; do not reach for a progress bar or a percent where a named sequence says it plainer.
61
62
  - The in-hand ring is always navy; a step never borrows a chart's tone (teal, salmon, purple) for its own status beyond "done".
62
63
  - A step that cannot start yet (no data, blocked) still appears in its place, waiting; it is never removed from the list.
63
64
 
64
- **Source**
65
+ ## Source
65
66
 
66
67
  **Derived from**: the brand kit's own guidance that sequences and waits are drawn as steps, not a progress bar
67
68
  (21 Oct 2026). **Precedent**: the first product built on the system.
69
+
70
+ ## Markup
71
+
72
+ ```html
73
+ <ol class="ws-stepper" aria-label="Audit">
74
+ <li class="ws-stepper__item">
75
+ <span class="ws-stepper__line"><span class="ws-stepper__line-fill ws-grow-up"></span></span>
76
+ <span class="ws-stepper__mark ws-stepper__mark--done" aria-hidden="true"><svg viewBox="0 0 16 16" width="12" height="12" fill="none"><path d="M3.5 8.5L6.5 11.5L12.5 5" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/></svg></span>
77
+ <span class="ws-stepper__body"><span class="ws-stepper__title">Pulled the last 90 days of deals</span><span class="ws-muted">Done</span></span>
78
+ </li>
79
+ <li class="ws-stepper__item" aria-current="step">
80
+ <span class="ws-stepper__mark ws-stepper__mark--current" aria-hidden="true">2</span>
81
+ <span class="ws-stepper__body"><span class="ws-stepper__title">Writing the three recommendations</span><span class="ws-muted">2 of 4</span></span>
82
+ </li>
83
+ </ol>
84
+ ```
85
+
86
+ ## Styles
87
+
88
+ `design-system/components/Stepper/style.css`: `ws-stepper`, `__item`, `__line`, `__line-fill`, `__mark` with `--done`,
89
+ `--current`, `--wait`; `__body`, `__title`.
@@ -0,0 +1,13 @@
1
+ /* ---- Stepper: steps in order, done in teal, the one in hand ringed, the rest waiting ---- */
2
+ .ws-stepper { display: flex; flex-direction: column; }
3
+ .ws-stepper__item { position: relative; display: flex; gap: var(--space-sm); padding-bottom: var(--space-md); }
4
+ .ws-stepper__item:last-child { padding-bottom: 0; }
5
+ .ws-stepper__line { position: absolute; top: var(--space-lg); bottom: 0; left: calc(var(--space-lg) / 2 - var(--ws-hairline)); width: calc(var(--ws-hairline) * 2); background: var(--ws-edge); }
6
+ .ws-stepper__line-fill { position: absolute; inset: 0; transform-origin: top; background: var(--color-stat-positive); }
7
+ .ws-stepper__mark { position: relative; display: inline-flex; flex-shrink: 0; align-items: center; justify-content: center; width: var(--space-lg); height: var(--space-lg); border-radius: var(--radius-full); font-size: var(--ws-text-dense); font-weight: 600; font-variant-numeric: tabular-nums; }
8
+ .ws-stepper__mark--done { background: var(--color-stat-positive); color: var(--ws-on-act); }
9
+ .ws-stepper__mark--current { background: var(--color-bg-page); color: var(--color-text-heading); box-shadow: inset 0 0 0 calc(var(--ws-hairline) * 4) var(--color-text-heading); }
10
+ .ws-stepper__mark--wait { background: var(--color-bg-page); color: var(--color-text-muted); box-shadow: var(--ws-shadow-hairline-in); }
11
+ .ws-stepper__body { display: flex; flex: 1; min-width: 0; flex-direction: column; padding-top: var(--space-3xs); }
12
+ .ws-stepper__title { font-size: var(--ws-text-body); line-height: calc(var(--space-md) + var(--space-xxs)); font-weight: 500; color: var(--color-text-heading); }
13
+
@@ -18,7 +18,7 @@ Eight weeks of activity as rows, Monday to Sunday across: a done day a pill, an
18
18
  - Day letters (M T W T F S S) at 11 px (`--ws-text-micro`) medium muted, once above the grid.
19
19
  - An active day: a filled pill (`--radius-full`), lighter navy on Monday (`--ws-chart-navy-light`) deepening to full `--color-brand-navy` by Sunday, so the eye reads the week's shape left to right.
20
20
  - An empty day: `--color-bg-page` with a `--ws-hairline` `--ws-edge-slot` edge, `--ws-radius-control` (4 px) corners.
21
- - Today: the same pill shape outlined in `calc(--ws-hairline * 3)` salmon on the cream; its row's label turns salmon (`--ws-word-needs`) and semibold.
21
+ - Today: the same pill shape outlined in `calc(--ws-hairline * 3)` salmon (`--ws-chart-under-half` (chart tone 3, so a palette that sets it moves it)) on the cream; its row's label turns salmon (`--ws-word-needs`) and semibold.
22
22
  - A day still to come: the same empty cell, its edge dashed.
23
23
  - Week label: the Monday's short date ("Aug 24"), 13 px (`--ws-text-dense`).
24
24
 
@@ -29,6 +29,10 @@ Eight weeks of activity as rows, Monday to Sunday across: a done day a pill, an
29
29
  | Week count | Eight weeks is the reference card's choice; fewer (two) reads as a short recent window inside a smaller tile |
30
30
  | `tip` | An active day can show its own small card (its calls and outcomes) while pointed at |
31
31
 
32
+ **Parts and modifiers**
33
+
34
+ - `.ws-streak-calendar__cell--future`: a day not reached yet: a dashed edge.
35
+
32
36
  **States**
33
37
 
34
38
  - Default: an active day blooms into its cell (`ws-bloom`) top to bottom over the sweep, the weeks filling in order.
@@ -66,3 +70,20 @@ Eight weeks of activity as rows, Monday to Sunday across: a done day a pill, an
66
70
 
67
71
  **Derived from**: the system's rule that a streak is read from real logged activity, never invented, and the
68
72
  navy-pill, salmon-today colour rules. **Precedent**: the first product built on the system.
73
+
74
+ **Markup**
75
+
76
+ ```html
77
+ <div class="ws-dots ws-streak-calendar__body">
78
+ <figure class="ws-streak-calendar__grid" aria-label="Activity, last 8 weeks: 6 days">
79
+ <span aria-hidden="true"></span><span class="ws-streak-calendar__letter" aria-hidden="true">M</span><!-- T W T F S S -->
80
+ <span class="ws-streak-calendar__label" aria-hidden="true">Aug 24</span>
81
+ <span class="ws-streak-calendar__cell ws-streak-calendar__cell--done"></span>
82
+ <span class="ws-streak-calendar__cell ws-streak-calendar__cell--empty"></span>
83
+ <span class="ws-streak-calendar__cell ws-streak-calendar__cell--today"></span>
84
+ </figure>
85
+ </div>
86
+ ```
87
+
88
+ **Styles**: `StreakCalendar/style.css`, in `bundle.css` and `fello.css` as `.ws-streak-calendar`. Every value is a token. `.ws-streak-calendar` itself has no styles: it is the hook that
89
+ names the chart (and the root for its modifiers); its parts carry the styles.
@@ -25,17 +25,17 @@
25
25
  <span class="ws-streak-calendar__letter" aria-hidden="true">M</span><span class="ws-streak-calendar__letter" aria-hidden="true">T</span><span class="ws-streak-calendar__letter" aria-hidden="true">W</span><span class="ws-streak-calendar__letter" aria-hidden="true">T</span><span class="ws-streak-calendar__letter" aria-hidden="true">F</span><span class="ws-streak-calendar__letter" aria-hidden="true">S</span><span class="ws-streak-calendar__letter" aria-hidden="true">S</span>
26
26
 
27
27
  <span class="ws-streak-calendar__label" aria-hidden="true">Aug 24</span>
28
- <span class="ws-streak-calendar__cell ws-streak-calendar__cell--done ws-bloom" style="background: color-mix(in srgb, var(--ws-chart-navy-light) 100%, var(--color-brand-navy));"></span>
28
+ <span class="ws-streak-calendar__cell ws-streak-calendar__cell--done ws-bloom" style="background: color-mix(in srgb, var(--ws-chart-navy-light) 100%, var(--color-text-heading));"></span>
29
29
  <span class="ws-streak-calendar__cell ws-streak-calendar__cell--empty" aria-hidden="true"></span>
30
- <span class="ws-streak-calendar__cell ws-streak-calendar__cell--done ws-bloom" style="background: color-mix(in srgb, var(--ws-chart-navy-light) 67%, var(--color-brand-navy)); animation-delay: 20ms;"></span>
31
- <span class="ws-streak-calendar__cell ws-streak-calendar__cell--done ws-bloom" style="background: color-mix(in srgb, var(--ws-chart-navy-light) 50%, var(--color-brand-navy)); animation-delay: 30ms;"></span>
30
+ <span class="ws-streak-calendar__cell ws-streak-calendar__cell--done ws-bloom" style="background: color-mix(in srgb, var(--ws-chart-navy-light) 67%, var(--color-text-heading)); animation-delay: 20ms;"></span>
31
+ <span class="ws-streak-calendar__cell ws-streak-calendar__cell--done ws-bloom" style="background: color-mix(in srgb, var(--ws-chart-navy-light) 50%, var(--color-text-heading)); animation-delay: 30ms;"></span>
32
32
  <span class="ws-streak-calendar__cell ws-streak-calendar__cell--empty"></span>
33
33
  <span class="ws-streak-calendar__cell ws-streak-calendar__cell--empty"></span>
34
34
  <span class="ws-streak-calendar__cell ws-streak-calendar__cell--empty"></span>
35
35
 
36
36
  <span class="ws-streak-calendar__label" aria-hidden="true">Aug 31</span>
37
37
  <span class="ws-streak-calendar__cell ws-streak-calendar__cell--empty"></span>
38
- <span class="ws-streak-calendar__cell ws-streak-calendar__cell--done ws-bloom" style="background: color-mix(in srgb, var(--ws-chart-navy-light) 83%, var(--color-brand-navy)); animation-delay: 70ms;"></span>
38
+ <span class="ws-streak-calendar__cell ws-streak-calendar__cell--done ws-bloom" style="background: color-mix(in srgb, var(--ws-chart-navy-light) 83%, var(--color-text-heading)); animation-delay: 70ms;"></span>
39
39
  <span class="ws-streak-calendar__cell ws-streak-calendar__cell--empty"></span>
40
40
  <span class="ws-streak-calendar__cell ws-streak-calendar__cell--empty"></span>
41
41
  <span class="ws-streak-calendar__cell ws-streak-calendar__cell--empty"></span>
@@ -46,9 +46,9 @@
46
46
  <span class="ws-streak-calendar__cell ws-streak-calendar__cell--empty"></span>
47
47
  <span class="ws-streak-calendar__cell ws-streak-calendar__cell--empty"></span>
48
48
  <span class="ws-streak-calendar__cell ws-streak-calendar__cell--empty"></span>
49
- <span class="ws-streak-calendar__cell ws-streak-calendar__cell--done ws-bloom" style="background: color-mix(in srgb, var(--ws-chart-navy-light) 50%, var(--color-brand-navy)); animation-delay: 110ms;"></span>
49
+ <span class="ws-streak-calendar__cell ws-streak-calendar__cell--done ws-bloom" style="background: color-mix(in srgb, var(--ws-chart-navy-light) 50%, var(--color-text-heading)); animation-delay: 110ms;"></span>
50
50
  <span class="ws-streak-calendar__cell ws-streak-calendar__cell--empty"></span>
51
- <span class="ws-streak-calendar__cell ws-streak-calendar__cell--done ws-bloom" style="background: color-mix(in srgb, var(--ws-chart-navy-light) 17%, var(--color-brand-navy)); animation-delay: 120ms;"></span>
51
+ <span class="ws-streak-calendar__cell ws-streak-calendar__cell--done ws-bloom" style="background: color-mix(in srgb, var(--ws-chart-navy-light) 17%, var(--color-text-heading)); animation-delay: 120ms;"></span>
52
52
  <span class="ws-streak-calendar__cell ws-streak-calendar__cell--empty"></span>
53
53
 
54
54
  <span class="ws-streak-calendar__label" aria-hidden="true">Sep 14</span>
@@ -56,12 +56,12 @@
56
56
 
57
57
  <span class="ws-streak-calendar__label" aria-hidden="true">Sep 21</span>
58
58
  <span class="ws-streak-calendar__cell ws-streak-calendar__cell--empty"></span>
59
- <span class="ws-streak-calendar__cell ws-streak-calendar__cell--done ws-bloom" style="background: color-mix(in srgb, var(--ws-chart-navy-light) 83%, var(--color-brand-navy)); animation-delay: 190ms;"></span>
59
+ <span class="ws-streak-calendar__cell ws-streak-calendar__cell--done ws-bloom" style="background: color-mix(in srgb, var(--ws-chart-navy-light) 83%, var(--color-text-heading)); animation-delay: 190ms;"></span>
60
60
  <span class="ws-streak-calendar__cell ws-streak-calendar__cell--empty"></span><span class="ws-streak-calendar__cell ws-streak-calendar__cell--empty"></span><span class="ws-streak-calendar__cell ws-streak-calendar__cell--empty"></span><span class="ws-streak-calendar__cell ws-streak-calendar__cell--empty"></span><span class="ws-streak-calendar__cell ws-streak-calendar__cell--empty"></span>
61
61
 
62
62
  <span class="ws-streak-calendar__label" aria-hidden="true">Sep 28</span>
63
63
  <span class="ws-streak-calendar__cell ws-streak-calendar__cell--empty"></span><span class="ws-streak-calendar__cell ws-streak-calendar__cell--empty"></span>
64
- <span class="ws-streak-calendar__cell ws-streak-calendar__cell--done ws-bloom" style="background: color-mix(in srgb, var(--ws-chart-navy-light) 67%, var(--color-brand-navy)); animation-delay: 230ms;"></span>
64
+ <span class="ws-streak-calendar__cell ws-streak-calendar__cell--done ws-bloom" style="background: color-mix(in srgb, var(--ws-chart-navy-light) 67%, var(--color-text-heading)); animation-delay: 230ms;"></span>
65
65
  <span class="ws-streak-calendar__cell ws-streak-calendar__cell--empty"></span><span class="ws-streak-calendar__cell ws-streak-calendar__cell--empty"></span><span class="ws-streak-calendar__cell ws-streak-calendar__cell--empty"></span><span class="ws-streak-calendar__cell ws-streak-calendar__cell--empty"></span>
66
66
 
67
67
  <span class="ws-streak-calendar__label" aria-hidden="true">Oct 5</span>
@@ -96,8 +96,8 @@
96
96
  <span class="ws-streak-calendar__letter" aria-hidden="true">M</span><span class="ws-streak-calendar__letter" aria-hidden="true">T</span><span class="ws-streak-calendar__letter" aria-hidden="true">W</span><span class="ws-streak-calendar__letter" aria-hidden="true">T</span><span class="ws-streak-calendar__letter" aria-hidden="true">F</span><span class="ws-streak-calendar__letter" aria-hidden="true">S</span><span class="ws-streak-calendar__letter" aria-hidden="true">S</span>
97
97
  <span class="ws-streak-calendar__label" aria-hidden="true">Oct 6</span>
98
98
  <span class="ws-streak-calendar__cell ws-streak-calendar__cell--done"></span>
99
- <span class="ws-streak-calendar__cell ws-streak-calendar__cell--done" style="background: color-mix(in srgb, var(--ws-chart-navy-light) 83%, var(--color-brand-navy));"></span>
100
- <span class="ws-streak-calendar__cell ws-streak-calendar__cell--done" style="background: color-mix(in srgb, var(--ws-chart-navy-light) 67%, var(--color-brand-navy));"></span>
99
+ <span class="ws-streak-calendar__cell ws-streak-calendar__cell--done" style="background: color-mix(in srgb, var(--ws-chart-navy-light) 83%, var(--color-text-heading));"></span>
100
+ <span class="ws-streak-calendar__cell ws-streak-calendar__cell--done" style="background: color-mix(in srgb, var(--ws-chart-navy-light) 67%, var(--color-text-heading));"></span>
101
101
  <span class="ws-streak-calendar__cell ws-streak-calendar__cell--empty"></span><span class="ws-streak-calendar__cell ws-streak-calendar__cell--empty"></span><span class="ws-streak-calendar__cell ws-streak-calendar__cell--empty"></span><span class="ws-streak-calendar__cell ws-streak-calendar__cell--empty"></span>
102
102
  <span class="ws-streak-calendar__label ws-streak-calendar__label--today" aria-hidden="true">Oct 13</span>
103
103
  <span class="ws-streak-calendar__cell ws-streak-calendar__cell--done"></span>
@@ -0,0 +1,12 @@
1
+ /* ---- StreakCalendar: one person's weeks as day cells, a navy dot a day done, today ringed in salmon ---- */
2
+ .ws-streak-calendar__body { padding: 0 var(--ws-card-inset) var(--space-md); }
3
+ .ws-streak-calendar__grid { display: grid; width: 100%; max-width: calc(var(--space-9xl) * 2 + var(--space-6xl) - var(--space-lg) - var(--space-sm)); grid-template-columns: calc(var(--space-4xl) - var(--space-xxs)) repeat(7, minmax(0, 1fr)); align-items: center; column-gap: var(--space-xxs); row-gap: var(--space-xxs); padding-top: var(--space-sm-plus); }
4
+ .ws-streak-calendar__letter { padding-bottom: var(--space-xxs); text-align: center; font-size: var(--ws-text-micro); font-weight: 500; line-height: var(--space-sm); color: var(--color-text-muted); }
5
+ .ws-streak-calendar__label { font-size: var(--ws-text-dense); line-height: var(--space-md); color: var(--color-text-body); white-space: nowrap; }
6
+ .ws-streak-calendar__label--today { font-weight: 600; color: var(--ws-word-needs); }
7
+ .ws-streak-calendar__cell { display: block; min-width: 0; height: var(--space-lg); }
8
+ .ws-streak-calendar__cell--done { border-radius: var(--radius-full); background: var(--color-text-heading); }
9
+ .ws-streak-calendar__cell--empty { border-radius: var(--ws-radius-control); border: var(--ws-hairline) solid var(--ws-edge-slot); background: var(--color-bg-page); }
10
+ .ws-streak-calendar__cell--future { border-style: dashed; }
11
+ .ws-streak-calendar__cell--today { border-radius: var(--radius-full); border: calc(var(--ws-hairline) * 3) solid var(--ws-chart-under-half); background: var(--color-bg-page); }
12
+
@@ -0,0 +1,87 @@
1
+ A starter to tap: a short question under an ask field on a page, or a white pill in the chat that asks the next thing.
2
+
3
+ ## Use it when
4
+
5
+ - An ask field on a page (a home, a report) offers two or three things to ask first.
6
+ - An answer in the chat offers the next questions ("Show Sam's calls", "Draft the nudge").
7
+ - An empty chat offers where to start.
8
+
9
+ ## Not for
10
+
11
+ - A long list of prompts: use `Well`.
12
+ - A filter or a choice that stays on: use `Chip` or `Segmented`.
13
+ - An act that changes something (send, save): use `Button`.
14
+
15
+ ## Anatomy
16
+
17
+ - A row of starters (`ws-suggestions`): 10 px apart on a page, 8 px in the chat (`--chat`); they wrap.
18
+ - The page chip (`ws-suggestion-chip`): 28 px tall at least, 12 px at the sides (8 on the left when an icon leads), 4 px
19
+ corners, the 0.5 px card edge on no fill, 13 / 18 medium navy, an optional 16 px icon 6 px before the words.
20
+ - Ghost (`--ghost`): no edge, 6 px sides, the body grey, regular weight.
21
+ - The chat pill (`--chat`): 32 px tall, 12 px sides, round ends (`--radius-full`: 16 at 32 tall, still a pill at 40 on touch), white (`--color-surface`).
22
+ - A chip never wraps: its words (in a `span`) are cut with an ellipsis, and the chip's `title` holds the whole
23
+ question.
24
+
25
+ ## Variants and sizes
26
+
27
+ | Variant | Where | Look |
28
+ | --- | --- | --- |
29
+ | Page | Under an ask field | 28 px, edged, 4 px corners |
30
+ | Ghost | A quiet "See all" beside them | No edge, body grey |
31
+ | Chat | Under an answer, in an empty chat | 32 px white pill |
32
+
33
+ Touch: every chip is 40 px tall.
34
+
35
+ ## States
36
+
37
+ - **Default**: as above.
38
+ - **Hover** (a pointer that hovers): the edge darkens (North's warm hover edge, built from the card edge and the body
39
+ grey); a ghost takes the navy 5 % wash.
40
+ - **Pressed**: the navy 5 % wash at once, and the chip gives to 0.97 and springs back on North's press spring
41
+ (`--ws-spring-press`, the house's press rule); still under reduced motion.
42
+ - **Focus**: the kit's 2 px navy ring, 2 px out.
43
+ - **Long words**: cut with an ellipsis; the title holds the question.
44
+ - **Dark**: the edge, the pill and the words follow the theme.
45
+
46
+ ## Behaviour
47
+
48
+ - Keyboard: each chip is a real `<button type="button">`; the row is labelled (`aria-label`) for a screen reader.
49
+ - Pointer and touch: a tap asks the question at once (it lands in the thread as the person's turn).
50
+ - Motion: chips in a new answer arrive after its words, 40 ms apart (North); colour changes over
51
+ `--ws-duration-hover`. Reduced motion: they are simply there.
52
+
53
+ ## Content
54
+
55
+ - A starter is a short question in the person's own words, sentence case, under about 30 characters, no em dash.
56
+ - Two or three at a time; never one that repeats what the answer just said.
57
+
58
+ ## Rules
59
+
60
+ - A sentence may wrap, its button never does (North's rule).
61
+ - Starters ask; they never act on the person's behalf.
62
+
63
+ ## Source
64
+
65
+ **Derived from**: North's starters (style1.css:255-260: page chips 29 tall, 0.5 edge, 4 px corners, 13 / 500 navy, 10
66
+ apart, hover edge #AAA49D, the ghost; :602-604: chat pills 32 tall, 16 px corners, white, 8 apart). Sizes on the grid
67
+ (28, 12, 8, 6; D3).
68
+
69
+ ## Markup
70
+
71
+ ```html
72
+ <div class="ws-suggestions" aria-label="Ask about">
73
+ <button type="button" class="ws-suggestion-chip">
74
+ <svg viewBox="0 0 16 16" fill="none" aria-hidden="true"><!-- a 16 px icon --></svg>
75
+ <span>Why did calls drop?</span>
76
+ </button>
77
+ </div>
78
+ <div class="ws-suggestions ws-suggestions--chat" aria-label="Ask next">
79
+ <button type="button" class="ws-suggestion-chip ws-suggestion-chip--chat" title="Show Sam's calls"><span>Show Sam's calls</span></button>
80
+ </div>
81
+ ```
82
+
83
+ ## Styles
84
+
85
+ `SuggestionChip/style.css`. Tokens: `--ws-control-h-sm`, `--ws-control-h`, `--ws-touch`, `--ws-edge-card`,
86
+ `--color-text-body`, `--ws-radius-control`, `--ws-radius-panel`, `--color-surface`, `--ws-hover`,
87
+ `--ws-text-control`. The hover edge is `--ws-edge-hover`.
@@ -0,0 +1,42 @@
1
+ <!-- @dsCard group="Chat" height=260 -->
2
+ <!doctype html>
3
+ <html>
4
+ <head>
5
+ <meta charset="utf-8">
6
+ <title>SuggestionChip</title>
7
+ <link rel="stylesheet" href="../../tokens.css">
8
+ <link rel="stylesheet" href="../bundle.css">
9
+ </head>
10
+ <body>
11
+ <div class="ws-stage ws-stage--column" style="background: var(--ws-frame);">
12
+ <div class="ws-stack" style="max-width: 600px;">
13
+ <span class="ws-muted">On a page, under an ask field: edged chips, an icon before the words, 10 apart</span>
14
+ <div class="ws-suggestions" aria-label="Ask about">
15
+ <button type="button" class="ws-suggestion-chip">
16
+ <svg viewBox="0 0 16 16" fill="none" aria-hidden="true"><path d="M2 12l3-4 3 2 3-5 3 3" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/></svg>
17
+ <span>Why did calls drop?</span>
18
+ </button>
19
+ <button type="button" class="ws-suggestion-chip">
20
+ <svg viewBox="0 0 16 16" fill="none" aria-hidden="true"><circle cx="8" cy="5.5" r="2.5" stroke="currentColor" stroke-width="1.5"/><path d="M3 13c0-2.5 2.2-4 5-4s5 1.5 5 4" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"/></svg>
21
+ <span>Who needs a nudge?</span>
22
+ </button>
23
+ <button type="button" class="ws-suggestion-chip ws-suggestion-chip--ghost"><span>See all</span></button>
24
+ </div>
25
+ </div>
26
+ <div class="ws-stack" style="max-width: 600px;">
27
+ <span class="ws-muted">In the chat: white pills, 8 apart</span>
28
+ <div class="ws-suggestions ws-suggestions--chat" aria-label="Ask next">
29
+ <button type="button" class="ws-suggestion-chip ws-suggestion-chip--chat"><span>Show Sam's calls</span></button>
30
+ <button type="button" class="ws-suggestion-chip ws-suggestion-chip--chat"><span>Draft the nudge</span></button>
31
+ <button type="button" class="ws-suggestion-chip ws-suggestion-chip--chat"><span>Compare with last week</span></button>
32
+ </div>
33
+ </div>
34
+ <div class="ws-stack" style="max-width: 260px;">
35
+ <span class="ws-muted">A long starter in a narrow column: the chip never wraps, its words cut (the title holds them)</span>
36
+ <div class="ws-suggestions ws-suggestions--chat" aria-label="Ask next">
37
+ <button type="button" class="ws-suggestion-chip ws-suggestion-chip--chat" title="Which of my sellers asked to wait until spring?"><span>Which of my sellers asked to wait until spring?</span></button>
38
+ </div>
39
+ </div>
40
+ </div>
41
+ </body>
42
+ </html>
@@ -0,0 +1,20 @@
1
+ /* ---- SuggestionChip: a starter to tap under an ask field or in the chat (North's): an edged chip on the page, a white pill in the chat ---- */
2
+ /* A row of starters: 10 apart on the page, 8 in the chat; they wrap, a chip never does (its words cut with an ellipsis,
3
+ so give it a title). The page chip: 28 tall, 4 px corners, the 0.5 px card edge on no fill, 13 / 18 medium navy,
4
+ an optional 16 px icon 6 before the words. Hover darkens the edge (North's warm edge, from the two greys); a press
5
+ takes the navy wash. Touch: 40 tall. */
6
+ .ws-suggestions { display: flex; flex-wrap: wrap; gap: var(--space-xs-plus); }
7
+ .ws-suggestions--chat { gap: var(--space-xs); }
8
+ .ws-suggestion-chip { display: inline-flex; align-items: center; gap: var(--space-xxs-plus); max-width: 100%; min-height: var(--ws-control-h-sm); padding: 0 var(--space-sm); border: var(--ws-hairline) solid var(--ws-edge-card); border-radius: var(--ws-radius-control); background: transparent; font-size: var(--ws-text-control); line-height: var(--ws-leading-control); font-weight: 500; color: var(--color-text-heading); text-align: left; white-space: nowrap; cursor: pointer; transition: border-color var(--ws-duration-hover) var(--ws-ease-soft), background-color var(--ws-duration-hover) var(--ws-ease-soft); }
9
+ .ws-suggestion-chip > span { min-width: 0; overflow: hidden; text-overflow: ellipsis; }
10
+ .ws-suggestion-chip > svg { flex-shrink: 0; width: var(--ws-icon); height: var(--ws-icon); }
11
+ /* An icon first takes 8 on its left; words alone sit 12 from both sides. */
12
+ .ws-suggestion-chip:has(> svg:first-child) { padding-left: var(--space-xs); }
13
+ @media (hover: hover) { .ws-suggestion-chip:hover { border-color: var(--ws-edge-hover); } }
14
+ .ws-suggestion-chip:active { background-color: var(--ws-hover); transition-duration: var(--ws-duration-instant); }
15
+ /* Ghost: no edge, the body grey, regular; hover is a faint wash. */
16
+ .ws-suggestion-chip--ghost { padding: 0 var(--space-xxs-plus); border-color: transparent; font-weight: 400; color: var(--color-text-body); }
17
+ @media (hover: hover) { .ws-suggestion-chip--ghost:hover { border-color: transparent; background-color: var(--ws-hover); } }
18
+ /* In the chat: a white pill, 32 tall, 12 at the sides, round ends (16 at 32 tall, still round at 40 on touch). */
19
+ .ws-suggestion-chip--chat { min-height: var(--ws-control-h); padding: 0 var(--space-sm); border-radius: var(--radius-full); background: var(--color-surface); }
20
+ @media (pointer: coarse) { .ws-suggestion-chip { min-height: var(--ws-touch); } }
@@ -16,17 +16,12 @@ An on/off setting that applies itself at once, drawn as a sliding track and thum
16
16
 
17
17
  ## Anatomy
18
18
 
19
- - Track: 36 x 20 px, `--radius-full` corners. There is no numeric radius token for "10 px" (half the 20 px height); at
20
- this fixed size `--radius-full` (9999px) is the token that reaches a true pill, the same way it rounds a disc or a
21
- pill meter, so it is used here rather than inventing a `10px` value.
22
- - Off: `--color-bg-page` (cream) fill, `--ws-hairline` edge in `--ws-edge-card`, matching the house rule that every
23
- surface at rest is cream with a fine edge.
24
- - On: solid `--color-text-heading` (navy) fill, no edge. Navy is one of only two fills a control may wear (03-colour.md:
25
- "the tab thumb and a selected toggle are the two navy fills a control may wear").
26
- - Thumb: 16 px (`--ws-icon`) white disc, 2 px inset from the track's edge, travelling to 18 px inset on the other side
27
- (36 − 16 − 2 × 2) when on: a 16 px move, exactly as specified.
28
- - Label: 14 px medium, `--color-text-heading`, to the left of the track (the reverse of `Checkbox`, whose label sits to
29
- the right of its box; the row is still the one tap target in both).
19
+ - Track: 36 by 20, a pill, no border (North's anatomy: a filled track). Off it is #7F7F7F (`--ws-control-off`, the muted words a step lighter): North's
20
+ warm grey (#DCD6CF) is 1.4:1 on the cream, so its tone is taken to the 3:1 a control asks. On it is navy.
21
+ - Thumb: a 16 px disc, 2 px in on every side, with North's soft shade; the surface white when off, the act's cream when
22
+ on. It travels 16 px. (The 0.4.0 thumb sat 2 px from the top and 1 from the bottom, under a 0.5 px border.)
23
+ - `--sm`: North's 28 by 16 track with a 12 px thumb, for a dense list.
24
+ - Label: 14 / 20 medium navy, 10 px after the track; the track sits on the label's first line.
30
25
  - Description: 12 px muted (`--color-text-muted`) under the label, as `Checkbox`'s own description line.
31
26
  - "Saved": `--ws-word-positive` words appearing beside the label for a moment after a change.
32
27
 
@@ -37,12 +32,14 @@ An on/off setting that applies itself at once, drawn as a sliding track and thum
37
32
  | Plain | label only | a short setting with no extra context needed |
38
33
  | With description | label plus a muted line under it | a setting that needs one more sentence to be clear |
39
34
 
40
- There is one size: the track is always 36 x 20 px; the row grows to 40 px on a touch screen.
35
+ | `--sm` | North's 28 by 16 track, a 12 px thumb | a dense list (North's watch list) |
36
+
37
+ Sizes: 36 by 20 (the default) and 28 by 16 (`--sm`); one line is a 40 px row on a touch screen.
41
38
 
42
39
  ## States
43
40
 
44
- - **Off:** cream track, hairline edge, thumb at the left.
45
- - **On:** navy track, no edge, white thumb at the right.
41
+ - **Off:** the grey track, the white thumb at the left.
42
+ - **On:** the navy track, the cream thumb at the right.
46
43
  - **Disabled:** the whole row at 50% opacity (matching `Checkbox`'s disabled treatment), pointer events off; a disabled,
47
44
  on track keeps its navy fill so the state stays legible.
48
45
  - **With description:** the muted line shows under the label; `aria-describedby` wires it to the switch.
@@ -50,17 +47,22 @@ There is one size: the track is always 36 x 20 px; the row grows to 40 px on a t
50
47
  the change is in flight; `aria-busy="true"`.
51
48
  - **Saved:** the working dot is replaced by "Saved" in `--ws-word-positive`, rising in (`ws-arrive`) for a moment, then
52
49
  clearing.
53
- - **Focus:** the kit's focus halo (`--shadow-focus-ring`) around the track, from the native input's own focus.
54
- - **Touch:** the row clears the 40 px floor even though the track itself stays 36 x 20 px.
50
+ - **Focus:** the kit's ring, 2 px navy, 2 px out, round the track.
51
+ - **Hover (a mouse only):** the track answers as Checkbox and Radio do, a colour change and nothing moves: off, its
52
+ grey a step toward the navy; on, North's brighter navy (`--ws-act-hover`). North draws no switch hover; this follows
53
+ its siblings (derived).
54
+ - **Pressed:** nothing beyond the thumb's travel.
55
+ - **Width:** the label is as wide as its words, never the whole column, so a click far from them does nothing.
56
+ - **Touch:** one line is a 40 px row, though the track stays 36 by 20.
57
+ - **Dark:** the on track is the light ink with a dark thumb; the off track keeps its grey (3:1 on both dark grounds).
55
58
 
56
59
  ## Behaviour
57
60
 
58
61
  - Keyboard: a native checkbox input under the skin (`role="switch"`); Tab reaches it, Space toggles it.
59
62
  - Pointer / touch: clicking or tapping anywhere in the row toggles it, since the label is part of the control, exactly
60
63
  as `Checkbox`.
61
- - Motion: the thumb's `transform: translateX()` and the track's background both transition over `--ws-duration-instant`
62
- (120 ms) on `--ws-ease-soft`; "Saved" rises in over `--ws-duration-gentle` (`ws-arrive`). Nothing moves under
63
- `prefers-reduced-motion: reduce`.
64
+ - Motion: North's: the track's colour over the hover beat (200 ms) on `--ws-ease-soft`, the thumb over the settle beat
65
+ (320 ms) on `--ws-ease-grow`; "Saved" rises in (`ws-arrive`). Still under reduced motion.
64
66
 
65
67
  ## Content
66
68
 
@@ -86,14 +88,32 @@ There is one size: the track is always 36 x 20 px; the row grows to 40 px on a t
86
88
  - The system's own component guide previously read: "A setting that applies at once | `Checkbox` (no switch yet); say
87
89
  'Saved' | a switch is listed as later." This component is that "later" arriving (26 Oct 2026): the system now has
88
90
  a switch, and it keeps the "say Saved" confirmation rather than dropping it.
89
- - Navy when on, cream with a hairline when off: the same colour logic as `Checkbox`'s navy-when-chosen rule, applied to
90
- a track instead of a box.
91
- - The label sits on the left here, reversed from `Checkbox`'s label-on-the-right: a deliberate difference, not an
92
- inconsistency, since a switch's row reads left to right as "name, then state."
91
+ - Navy when on, the 3:1 grey when off: an off switch still reads as a control (0.5.0; North's own grey is 1.4:1).
92
+ - The label sits to the right of the track, as `Checkbox`'s does beside its box.
93
93
  - The whole row is the tap target, never the 36 px track alone, since most of this audience is on a phone.
94
94
 
95
95
  ## Source
96
96
 
97
97
  **Derived from**: the system's own documented gap (a switch listed as later, with a checkbox standing in for one),
98
98
  `Checkbox`'s native-input-under-skin pattern, the navy-fill rule for a selected toggle, and `Button`'s pending-dot and
99
- "Saved" confirmation patterns. **Precedent**: an intentional addition decided from the system, 26 Oct 2026.
99
+ "Saved" confirmation patterns. **Precedent**: an intentional addition decided from the system, 26 Oct 2026. 0.5.0:
100
+ Seth's North switch (style1.css:2049-2052): a filled track, a shaded thumb, the track over 200 ms and the thumb over
101
+ 320 ms on the grow curve; the thumb centred (it sat 2 / 1 px under the old border).
102
+
103
+ ## Markup
104
+
105
+ ```html
106
+ <label class="ws-switch">
107
+ <input type="checkbox" role="switch" checked aria-describedby="sw-desc">
108
+ <span class="ws-switch__track"><span class="ws-switch__thumb"></span></span>
109
+ <span class="ws-switch__words">
110
+ <span class="ws-switch__label">Send a copy to the team channel</span>
111
+ <span class="ws-muted" id="sw-desc">Posts the week's summary where the whole team can see it</span>
112
+ </span>
113
+ </label>
114
+ ```
115
+
116
+ ## Styles
117
+
118
+ `design-system/components/Switch/style.css`: `ws-switch` with `--sm`, `--disabled`; `__track`, `__thumb`, `__words`,
119
+ `__label`, `__status`, `__saved`, `__saving`.
@@ -1,4 +1,4 @@
1
- <!-- @dsCard group="Fields" height=388 -->
1
+ <!-- @dsCard group="Fields" height=470 -->
2
2
  <!doctype html>
3
3
  <html>
4
4
  <head>
@@ -14,12 +14,12 @@
14
14
  <span class="ws-muted">Off and on</span>
15
15
  <div class="ws-cluster ws-cluster--component ws-cluster--start">
16
16
  <label class="ws-switch">
17
- <input type="checkbox" role="switch" aria-checked="false">
17
+ <input type="checkbox" role="switch">
18
18
  <span class="ws-switch__track"><span class="ws-switch__thumb"></span></span>
19
19
  <span class="ws-switch__words"><span class="ws-switch__label">Text me a reminder before each call</span></span>
20
20
  </label>
21
21
  <label class="ws-switch">
22
- <input type="checkbox" role="switch" aria-checked="true" checked>
22
+ <input type="checkbox" role="switch" checked>
23
23
  <span class="ws-switch__track"><span class="ws-switch__thumb"></span></span>
24
24
  <span class="ws-switch__words"><span class="ws-switch__label">Share my activity with my team lead</span></span>
25
25
  </label>
@@ -29,7 +29,7 @@
29
29
  <div class="ws-stack">
30
30
  <span class="ws-muted">With a description</span>
31
31
  <label class="ws-switch">
32
- <input type="checkbox" role="switch" aria-checked="true" checked aria-describedby="sw-desc">
32
+ <input type="checkbox" role="switch" checked aria-describedby="sw-desc">
33
33
  <span class="ws-switch__track"><span class="ws-switch__thumb"></span></span>
34
34
  <span class="ws-switch__words">
35
35
  <span class="ws-switch__label">Send a copy to the team channel</span>
@@ -42,7 +42,7 @@
42
42
  <span class="ws-muted">Saving, then saved</span>
43
43
  <div class="ws-cluster ws-cluster--component ws-cluster--start">
44
44
  <label class="ws-switch">
45
- <input type="checkbox" role="switch" aria-checked="true" checked aria-busy="true">
45
+ <input type="checkbox" role="switch" checked aria-busy="true">
46
46
  <span class="ws-switch__track"><span class="ws-switch__thumb"></span></span>
47
47
  <span class="ws-switch__words">
48
48
  <span class="ws-switch__label">Follow-up nudges</span>
@@ -50,7 +50,7 @@
50
50
  </span>
51
51
  </label>
52
52
  <label class="ws-switch">
53
- <input type="checkbox" role="switch" aria-checked="true" checked>
53
+ <input type="checkbox" role="switch" checked>
54
54
  <span class="ws-switch__track"><span class="ws-switch__thumb"></span></span>
55
55
  <span class="ws-switch__words">
56
56
  <span class="ws-switch__label">Follow-up nudges</span>
@@ -60,16 +60,31 @@
60
60
  </div>
61
61
  </div>
62
62
 
63
+ <div class="ws-stack">
64
+ <span class="ws-muted">Small: North's 28 by 16 switch, for a dense list</span>
65
+ <div class="ws-cluster ws-cluster--component ws-cluster--start">
66
+ <label class="ws-switch ws-switch--sm">
67
+ <input type="checkbox" role="switch">
68
+ <span class="ws-switch__track"><span class="ws-switch__thumb"></span></span>
69
+ <span class="ws-switch__words"><span class="ws-switch__label">Watch Zillow Premier Agent</span></span>
70
+ </label>
71
+ <label class="ws-switch ws-switch--sm">
72
+ <input type="checkbox" role="switch" checked>
73
+ <span class="ws-switch__track"><span class="ws-switch__thumb"></span></span>
74
+ <span class="ws-switch__words"><span class="ws-switch__label">Watch Luxury Presence</span></span>
75
+ </label>
76
+ </div>
77
+ </div>
63
78
  <div class="ws-stack">
64
79
  <span class="ws-muted">Disabled, off and on</span>
65
80
  <div class="ws-cluster ws-cluster--component ws-cluster--start">
66
81
  <label class="ws-switch ws-switch--disabled">
67
- <input type="checkbox" role="switch" aria-checked="false" disabled>
82
+ <input type="checkbox" role="switch" disabled>
68
83
  <span class="ws-switch__track"><span class="ws-switch__thumb"></span></span>
69
84
  <span class="ws-switch__words"><span class="ws-switch__label">Voice calls (needs a microphone)</span></span>
70
85
  </label>
71
86
  <label class="ws-switch ws-switch--disabled">
72
- <input type="checkbox" role="switch" aria-checked="true" checked disabled>
87
+ <input type="checkbox" role="switch" checked disabled>
73
88
  <span class="ws-switch__track"><span class="ws-switch__thumb"></span></span>
74
89
  <span class="ws-switch__words"><span class="ws-switch__label">CRM sync (locked by your admin)</span></span>
75
90
  </label>