@felloinnovations/brand-kit 0.4.0 → 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 (363) hide show
  1. package/AGENTS.md +198 -24
  2. package/CHANGELOG.md +197 -0
  3. package/README.md +34 -7
  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 +134 -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 +357 -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 +52 -16
  249. package/design-system/components/Skeleton/preview.html +35 -23
  250. package/design-system/components/Skeleton/style.css +22 -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 +4091 -744
  335. package/design-system/tokens.json +1314 -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 +110 -11
  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 +174 -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 +1292 -62
  361. package/tokens/tokens.md +588 -61
  362. package/tokens/tokens.root.css +1298 -62
  363. package/tokens/tokens.ts +1677 -64
@@ -0,0 +1,141 @@
1
+ A rimmed list of checks, each row a name, a strip of ticks for its score, the score, a status and a chevron that opens
2
+ it; or a list of fixes, each row a box to tick, the fix and its effort, its act, and a chevron that opens it in place.
3
+ Seth's checks list (301:1728) and Fixes checklist (308:2466).
4
+
5
+ ## Use it when
6
+
7
+ - A report breaks one score into a few checks and each check opens its detail (an audit's "Your AI visibility checks").
8
+ - A short list of fixes is worked through and ticked off, each with one act and a few steps behind it.
9
+
10
+ ## Not for
11
+
12
+ - Records with many columns: use `Table`.
13
+ - A ranking of people: use `Leaderboard`.
14
+ - Next acts with a reason each, in a card: use `ActionList`.
15
+ - A grid of yes-or-no answers: use `Matrix`.
16
+
17
+ ## Anatomy
18
+
19
+ - A rim (`ul.ws-check-row`): the tray grey (`--ws-tray`), 1 px of it round the rows (`--ws-rim`), 8 px corners outside,
20
+ 7 inside (`--ws-radius-card-inner`) on the first and last row. Rows cream, joined by 0.5 px lines (`--ws-edge`),
21
+ full width, drawn inside the top of the row (an inset line, not a border), so a row's height includes its line as in
22
+ Seth's frames. No outline, no shadow.
23
+ - Every row is at least 56 (`--ws-check-row-h`), with an act or without, so lists line up (Seth's rows ran 46 to 70).
24
+ - A check row (`__row`, a button with `aria-expanded`, or a link): 12 above and below, 20 in, 16 out, parts 24 apart, on
25
+ one grid every row shares:
26
+
27
+ | Part | Width | Type |
28
+ | --- | --- | --- |
29
+ | Name (`__name`) | 150 | 15 / 20 medium navy, wraps |
30
+ | Ticks (`__ticks`) | the rest | 40 ticks, 32 tall, 3 apart, 1 px corners |
31
+ | Score (`__score`) | 56, right | 28 / 32 regular navy, tabular |
32
+ | Status (`__status`) | 112, right | 13 / 18 medium body grey (`--quiet` muted) |
33
+ | Chevron (`__chev`) | 16 | navy, 1.5 stroke |
34
+
35
+ - The ticks: lit ticks (`b`) in the row's rating tone (D10): strong teal (`--ws-rating-strong`, the default),
36
+ getting there mid blue (`--middle`), needs work pink (`--needs-work`); the rest (`i`) the empty track. Lit is
37
+ `round(score / 100 x 40)`.
38
+ - Not checked: every tick empty, a short muted rule in place of the score (`__none`, 20 wide, its words for a screen
39
+ reader), the status "Could not check" muted; the chevron stays (it still opens).
40
+ - A fix row (`li.ws-check-row__fix` holding `__line`): the box (an 18 wide column, the skinned `Checkbox`, a 24 target,
41
+ 40 on touch), the fix (`__open`, a button whose hit area covers the line): the title 15 / 22 medium navy and the
42
+ effort 13 / 18 muted 8 after it on the baseline, or a done line under it (`__meta`, 13 / 18 medium in the positive
43
+ word, 6 below); its act (Seth's grey act: a medium `Button --well`, 32 tall, 12 at the sides, no edge; `--primary`
44
+ on the open row) and a 16 px chevron; parts 16 apart, 12 above and below, 20 in, 16 out.
45
+ - Every part of a fix row sits on the title's first line: the box and the chevron centre on it and the act is centred
46
+ on it, so a done row's box stays beside its title, not mid-way down the two lines (Seth's 308:2466 centred it on the
47
+ block). A one-line row's line sits mid-row.
48
+ - The open fix's panel (`__detail`): cream, 6 px corners, 24 inside, its left edge on the title's (20 + 18 + 16 = 54; Seth's
49
+ frame drew it 4 px off at 58), 16 from the right and below.
50
+
51
+ ## Variants and sizes
52
+
53
+ | Part | Value |
54
+ | --- | --- |
55
+ | Row | 56 at least, 12 / 16 / 12 / 20 inside |
56
+ | Check columns | 150, the rest, 56, 112, 16; 24 apart |
57
+ | Ticks | 40, 32 tall, 3 apart |
58
+ | Fix columns | 18, the rest, the act (32, `--well`), 16; 16 apart; all on the title's first line |
59
+ | Panel | 54 in, 24 inside, 6 px corners |
60
+ | Narrow (under 40rem) | check: name and status over the ticks, the score beside them; fix: the act under the words, the box and the chevron on the title's first line |
61
+
62
+ ## States
63
+
64
+ - **Default**: cream.
65
+ - **Hover**: North's faint navy wash (`--ws-hover-faint`) laid over the cream (a background image, so the grey rim never
66
+ shows through), nothing moves (not drawn by Seth); never on an open or a current row, which keep their sunk ground.
67
+ - **Open** (`aria-expanded="true"`): the sunk cream (`--ws-surface-sunk`); a check's status turns navy; a fix's title
68
+ turns semibold at the same size, its act turns primary, its chevron points up and its panel shows.
69
+ - **Focus**: the 2 px navy ring drawn inside the row.
70
+ - **Not checked**: as above.
71
+ - **Done** (a fix, `--done`): the box ticked, the title muted, the done line under it in the positive word.
72
+ - **Loading**: the name and the ticks as ghosts in the chart colours' sweep (`__ghost ws-shimmer`, `__ticks ws-shimmer`);
73
+ still under reduced motion.
74
+ - **Long name**: wraps within its 150; the row grows, every column still lines up.
75
+
76
+ ## Behaviour
77
+
78
+ - Keyboard: a check row is one button (it opens the check's drawer, `aria-expanded` saying so); a fix row's box, its
79
+ open button and its act are three stops, in that order.
80
+ - Pointer: clicking anywhere on a fix row's line opens it, except on the box and the act, which do their own thing.
81
+ - Motion: the lit ticks grow up from their base on arrival, 700 ms on `--ws-ease-settle`, left to right 4 ms a tick
82
+ (`--ws-ripple`, where the browser can count siblings; elsewhere together). A fix opens in place on North's fold
83
+ ("Sidebar sections open / close", the fold spring .32 / 0): its panel (`__detail`, wearing the house's `ws-unfold`,
84
+ shown and hidden by `hidden`) grows from nothing to its height with its padding and margin and fades in, and the
85
+ chevron turns 180 on the same spring (`--ws-spring-fold` over `--ws-spring-fold-duration`); closing runs it back.
86
+ Without `@starting-style` or `interpolate-size` the panel opens at once. Under reduced motion nothing moves.
87
+
88
+ ## Content
89
+
90
+ - A check's name is one or two words ("Local search"); its status a count of fixes ("2 fixes") or a plain state
91
+ ("Nothing to fix", "Could not check").
92
+ - A fix starts with a verb ("Speed up the homepage on phones"); its effort says how long ("A few days").
93
+ - No em dashes; the not-checked mark is a drawn rule, not a dash.
94
+
95
+ ## Rules
96
+
97
+ - **One grid for every check row**, so the scores stack in one right-aligned column (Seth: name 150, score 56 right,
98
+ status 112 right).
99
+ - **One minimum height for every row** in a list, act or no act.
100
+ - **A selected or open state never changes size**: weight and ground change, line heights do not.
101
+ - **Words pass AA on their ground** (D2): Seth's #7F7F7F and #8A8A8A words take `--color-text-muted`; the teal done line
102
+ takes `--ws-word-positive`. The tick tones are marks and keep Seth's hue.
103
+
104
+ ## Source
105
+
106
+ **Derived from**: Seth's Grow audit report (301:1630: the checks list 301:1725 to 2010) and Fixes checklist (308:2466:
107
+ the fix rows and the open fix), on the kit's rim (D5), rating tones (D10) and North's tick ripple (D7). The tick strip
108
+ is the same shape as `TickStrip` (40 ticks, 32 tall, 3 apart) and can be swapped for it. **Precedent**: new in 0.5.0
109
+ (4 Nov 2026).
110
+
111
+ ## Markup
112
+
113
+ ```html
114
+ <ul class="ws-check-row" aria-label="Your AI visibility checks">
115
+ <li><button type="button" class="ws-check-row__row" aria-expanded="false">
116
+ <span class="ws-check-row__name">Website</span>
117
+ <span class="ws-check-row__ticks" aria-hidden="true"><b></b><b></b><b></b><i></i><!-- 40 in all: round(score / 100 x 40) b, the rest i --></span>
118
+ <span class="ws-check-row__score">75</span>
119
+ <span class="ws-check-row__status">2 fixes</span>
120
+ <svg class="ws-check-row__chev" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M6.6 5.2L9.4 8l-2.8 2.8"/></svg>
121
+ </button></li>
122
+ </ul>
123
+
124
+ <ul class="ws-check-row" aria-label="Website fixes">
125
+ <li class="ws-check-row__fix">
126
+ <div class="ws-check-row__line">
127
+ <label class="ws-check"><input type="checkbox" aria-label="Done: Speed up the homepage on phones"><span class="ws-check__box" aria-hidden="true"><svg viewBox="0 0 12 12" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round"><path d="M2.5 6.25L4.75 8.5L9.5 3.75"/></svg></span></label>
128
+ <button type="button" class="ws-check-row__open" aria-expanded="false" aria-controls="fix-1"><span class="ws-check-row__title">Speed up the homepage on phones</span><span class="ws-check-row__effort">A few days</span></button>
129
+ <button type="button" class="ws-btn ws-btn--well ws-check-row__act">Send to my web person</button>
130
+ <svg class="ws-check-row__chev" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M4 6l4 4 4-4"/></svg>
131
+ </div>
132
+ <div class="ws-check-row__detail ws-unfold" id="fix-1" hidden><p class="ws-body">Your homepage takes 6.2 seconds to show on a phone.</p></div>
133
+ </li>
134
+ </ul>
135
+ ```
136
+
137
+ ## Styles
138
+
139
+ `design-system/components/CheckRow/style.css`, in `bundle.css` and `fello.css`. Dark and the navy ground come from the
140
+ tokens (`--ws-tray`, `--ws-edge`, `--ws-track`, `--ws-rating-*`, `--ws-surface-sunk`). The rim is a size container
141
+ named `ws-check-row`.
@@ -0,0 +1,140 @@
1
+ <!-- @dsCard group="Data" height=980 -->
2
+ <!doctype html>
3
+ <html>
4
+ <head>
5
+ <meta charset="utf-8">
6
+ <title>CheckRow</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">
12
+
13
+ <div class="ws-stack">
14
+ <span class="ws-muted">Check rows (Seth 301:1728): one grid for every row, so names, ticks, scores and statuses line up; the open row is sunk with its status in navy; a check that could not run keeps its row and its chevron; ticks in the rating's tone (strong teal, getting there mid blue, needs work pink)</span>
15
+ <h3 class="ws-section">Your AI visibility checks</h3>
16
+ <ul class="ws-check-row" aria-label="Your AI visibility checks">
17
+ <li><button type="button" class="ws-check-row__row" aria-expanded="true" aria-label="Local search, score 39 of 100, needs work, 2 fixes">
18
+ <span class="ws-check-row__name">Local search</span>
19
+ <span class="ws-check-row__ticks ws-check-row__ticks--needs-work" aria-hidden="true"><b></b><b></b><b></b><b></b><b></b><b></b><b></b><b></b><b></b><b></b><b></b><b></b><b></b><b></b><b></b><b></b><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i></span>
20
+ <span class="ws-check-row__score">39</span>
21
+ <span class="ws-check-row__status">2 fixes</span>
22
+ <svg class="ws-check-row__chev" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M6.6 5.2L9.4 8l-2.8 2.8"/></svg>
23
+ </button></li>
24
+ <li><button type="button" class="ws-check-row__row" aria-expanded="false" aria-label="Website, score 75 of 100, strong, 2 fixes">
25
+ <span class="ws-check-row__name">Website</span>
26
+ <span class="ws-check-row__ticks" aria-hidden="true"><b></b><b></b><b></b><b></b><b></b><b></b><b></b><b></b><b></b><b></b><b></b><b></b><b></b><b></b><b></b><b></b><b></b><b></b><b></b><b></b><b></b><b></b><b></b><b></b><b></b><b></b><b></b><b></b><b></b><b></b><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i></span>
27
+ <span class="ws-check-row__score">75</span>
28
+ <span class="ws-check-row__status">2 fixes</span>
29
+ <svg class="ws-check-row__chev" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M6.6 5.2L9.4 8l-2.8 2.8"/></svg>
30
+ </button></li>
31
+ <li><button type="button" class="ws-check-row__row" aria-expanded="false" aria-label="Social, score 55 of 100, getting there, 1 fix">
32
+ <span class="ws-check-row__name">Social</span>
33
+ <span class="ws-check-row__ticks ws-check-row__ticks--middle" aria-hidden="true"><b></b><b></b><b></b><b></b><b></b><b></b><b></b><b></b><b></b><b></b><b></b><b></b><b></b><b></b><b></b><b></b><b></b><b></b><b></b><b></b><b></b><b></b><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i></span>
34
+ <span class="ws-check-row__score">55</span>
35
+ <span class="ws-check-row__status">1 fix</span>
36
+ <svg class="ws-check-row__chev" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M6.6 5.2L9.4 8l-2.8 2.8"/></svg>
37
+ </button></li>
38
+ <li><button type="button" class="ws-check-row__row" aria-expanded="false" aria-label="Zillow, score 100 of 100, strong, Nothing to fix">
39
+ <span class="ws-check-row__name">Zillow</span>
40
+ <span class="ws-check-row__ticks" aria-hidden="true"><b></b><b></b><b></b><b></b><b></b><b></b><b></b><b></b><b></b><b></b><b></b><b></b><b></b><b></b><b></b><b></b><b></b><b></b><b></b><b></b><b></b><b></b><b></b><b></b><b></b><b></b><b></b><b></b><b></b><b></b><b></b><b></b><b></b><b></b><b></b><b></b><b></b><b></b><b></b><b></b></span>
41
+ <span class="ws-check-row__score">100</span>
42
+ <span class="ws-check-row__status ws-check-row__status--quiet">Nothing to fix</span>
43
+ <svg class="ws-check-row__chev" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M6.6 5.2L9.4 8l-2.8 2.8"/></svg>
44
+ </button></li>
45
+ <li><button type="button" class="ws-check-row__row" aria-expanded="false" aria-label="Google Business Profile, not checked, Could not check">
46
+ <span class="ws-check-row__name">Google Business Profile</span>
47
+ <span class="ws-check-row__ticks" aria-hidden="true"><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i></span>
48
+ <span class="ws-check-row__score"><span class="ws-check-row__none" aria-hidden="true"></span><span class="ws-sr">Not checked</span></span>
49
+ <span class="ws-check-row__status ws-check-row__status--quiet">Could not check</span>
50
+ <svg class="ws-check-row__chev" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M6.6 5.2L9.4 8l-2.8 2.8"/></svg>
51
+ </button></li>
52
+ <li><button type="button" class="ws-check-row__row" aria-expanded="false" aria-label="AI answers, not checked, Could not check">
53
+ <span class="ws-check-row__name">AI answers</span>
54
+ <span class="ws-check-row__ticks" aria-hidden="true"><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i></span>
55
+ <span class="ws-check-row__score"><span class="ws-check-row__none" aria-hidden="true"></span><span class="ws-sr">Not checked</span></span>
56
+ <span class="ws-check-row__status ws-check-row__status--quiet">Could not check</span>
57
+ <svg class="ws-check-row__chev" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M6.6 5.2L9.4 8l-2.8 2.8"/></svg>
58
+ </button></li>
59
+ </ul>
60
+ </div>
61
+
62
+ <div class="ws-stack">
63
+ <span class="ws-muted">Fix rows (Seth 308:2466): every row 56 at least, with an act or without; the open fix is sunk, its act primary, its panel on the title's edge; a done fix keeps its row, its title muted and a line under it</span>
64
+ <div class="ws-stack ws-stack--group">
65
+ <div class="ws-stack">
66
+ <h3 class="ws-section">Website <span class="ws-muted">0 of 2 done</span></h3>
67
+ <ul class="ws-check-row" aria-label="Website fixes">
68
+ <li class="ws-check-row__fix">
69
+ <div class="ws-check-row__line">
70
+ <label class="ws-check"><input type="checkbox" aria-label="Done: Speed up the homepage on phones"><span class="ws-check__box" aria-hidden="true"><svg viewBox="0 0 12 12" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round"><path d="M2.5 6.25L4.75 8.5L9.5 3.75"/></svg></span></label>
71
+ <button type="button" class="ws-check-row__open" aria-expanded="false" aria-controls="fx-1"><span class="ws-check-row__title">Speed up the homepage on phones</span><span class="ws-check-row__effort">A few days</span></button>
72
+ <button type="button" class="ws-btn ws-btn--well ws-check-row__act">Send to my web person</button>
73
+ <svg class="ws-check-row__chev" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M4 6l4 4 4-4"/></svg>
74
+ </div>
75
+ <div class="ws-check-row__detail ws-unfold" id="fx-1" hidden><p class="ws-body">Your homepage takes 6.2 seconds to show on a phone.</p></div>
76
+ </li>
77
+ <li class="ws-check-row__fix">
78
+ <div class="ws-check-row__line">
79
+ <label class="ws-check"><input type="checkbox" aria-label="Done: Run an accessibility check and fix the flagged issues"><span class="ws-check__box" aria-hidden="true"><svg viewBox="0 0 12 12" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round"><path d="M2.5 6.25L4.75 8.5L9.5 3.75"/></svg></span></label>
80
+ <button type="button" class="ws-check-row__open" aria-expanded="true" aria-controls="fx-2"><span class="ws-check-row__title">Run an accessibility check and fix the flagged issues</span><span class="ws-check-row__effort">An hour or two</span></button>
81
+ <button type="button" class="ws-btn ws-btn--primary ws-check-row__act">Send to my web person</button>
82
+ <svg class="ws-check-row__chev" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M4 6l4 4 4-4"/></svg>
83
+ </div>
84
+ <div class="ws-check-row__detail ws-unfold" id="fx-2"><p class="ws-body">Buyers and sellers using assistive technology need to read your content and use your tools too. Grow checks for 90 or more.</p></div>
85
+ </li>
86
+ </ul>
87
+ </div>
88
+ <div class="ws-stack">
89
+ <h3 class="ws-section">Social <span class="ws-muted">1 of 2 done</span></h3>
90
+ <ul class="ws-check-row" aria-label="Social fixes">
91
+ <li class="ws-check-row__fix ws-check-row__fix--done">
92
+ <div class="ws-check-row__line">
93
+ <label class="ws-check"><input type="checkbox" checked aria-label="Done: Reply to comments on your posts within a day"><span class="ws-check__box" aria-hidden="true"><svg viewBox="0 0 12 12" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round"><path d="M2.5 6.25L4.75 8.5L9.5 3.75"/></svg></span></label>
94
+ <button type="button" class="ws-check-row__open" aria-expanded="false"><span class="ws-check-row__title">Reply to comments on your posts within a day</span><span class="ws-check-row__meta">Done today, Grow checks it again Nov 9</span></button>
95
+
96
+ <svg class="ws-check-row__chev" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M4 6l4 4 4-4"/></svg>
97
+ </div>
98
+ </li>
99
+ <li class="ws-check-row__fix">
100
+ <div class="ws-check-row__line">
101
+ <label class="ws-check"><input type="checkbox" aria-label="Done: Cross-promote your Instagram on your other channels"><span class="ws-check__box" aria-hidden="true"><svg viewBox="0 0 12 12" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round"><path d="M2.5 6.25L4.75 8.5L9.5 3.75"/></svg></span></label>
102
+ <button type="button" class="ws-check-row__open" aria-expanded="false"><span class="ws-check-row__title">Cross-promote your Instagram on your other channels</span><span class="ws-check-row__effort">An hour or two</span></button>
103
+
104
+ <svg class="ws-check-row__chev" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M4 6l4 4 4-4"/></svg>
105
+ </div>
106
+ </li>
107
+ </ul>
108
+ </div>
109
+ </div>
110
+ </div>
111
+
112
+ <div class="ws-stack" style="width: 560px;">
113
+ <span class="ws-muted">Loading: the rows' places as ghosts in the chart colours' sweep</span>
114
+ <ul class="ws-check-row" aria-busy="true" aria-label="Checks, loading">
115
+ <li><div class="ws-check-row__row" aria-hidden="true">
116
+ <span class="ws-check-row__name"><span class="ws-check-row__ghost ws-shimmer" style="width: 70%;"></span></span>
117
+ <span class="ws-check-row__ticks ws-shimmer"></span>
118
+ </div></li>
119
+ <li><div class="ws-check-row__row" aria-hidden="true">
120
+ <span class="ws-check-row__name"><span class="ws-check-row__ghost ws-shimmer" style="width: 70%;"></span></span>
121
+ <span class="ws-check-row__ticks ws-shimmer"></span>
122
+ </div></li>
123
+ </ul>
124
+ </div>
125
+
126
+ </div>
127
+ <script>
128
+ // Open and close a fix the way an app does (aria-expanded on its open button, hidden on its panel, its act primary
129
+ // while open), so the fold shows here: the panel grows open and the chevron turns on the fold spring.
130
+ for (const b of document.querySelectorAll('.ws-check-row__open[aria-controls]')) b.addEventListener('click', () => {
131
+ const open = b.getAttribute('aria-expanded') !== 'true';
132
+ b.setAttribute('aria-expanded', String(open));
133
+ document.getElementById(b.getAttribute('aria-controls')).hidden = !open;
134
+ const act = b.parentElement.querySelector('.ws-check-row__act');
135
+ act?.classList.toggle('ws-btn--primary', open);
136
+ act?.classList.toggle('ws-btn--well', !open);
137
+ });
138
+ </script>
139
+ </body>
140
+ </html>
@@ -0,0 +1,88 @@
1
+ /* ---- CheckRow: Seth's rimmed list of check rows (301:1728) and fix rows (308:2466). A check row is one grid every row
2
+ shares (name 150, ticks the rest, score 56 right, status 112 right, chevron 16, 24 apart, 56 tall), so the scores
3
+ stack in one column. A fix row is a box, the fix and its effort, its act and a chevron; it opens in place onto a
4
+ cream panel on the title's edge. Every row takes the same 56 px minimum, so lists with and without acts line up. ---- */
5
+ .ws-check-row { --ws-check-row-name: calc(var(--space-9xl) * 0.75); --ws-check-row-score: calc(var(--space-3xl) + var(--space-xs)); --ws-check-row-status: calc(var(--space-6xl) + var(--space-md)); --ws-check-row-box: calc(var(--space-md) + var(--space-3xs)); --ws-check-row-h: calc(var(--space-3xl) + var(--space-xs)); --ws-check-row-tone: var(--ws-rating-strong); container: ws-check-row / inline-size; display: flex; flex-direction: column; padding: var(--ws-rim); border-radius: var(--ws-radius-card); background: var(--ws-tray); }
6
+ /* Cream rows joined by 0.5 px lines, full width, drawn inside the row's top (Seth's 56 includes its line, so a border
7
+ would add 0.5 a row); an open check row's sunk ground covers its li, so it draws the line too. The rim's inner corners
8
+ on the first and last. */
9
+ .ws-check-row > li { background: var(--color-bg-page); }
10
+ .ws-check-row > li + li, .ws-check-row > li + li > .ws-check-row__row:is([aria-expanded="true"], [aria-current="true"]) { box-shadow: inset 0 var(--ws-hairline) 0 var(--ws-edge); }
11
+ .ws-check-row > li:first-child { border-top-left-radius: var(--ws-radius-card-inner); border-top-right-radius: var(--ws-radius-card-inner); }
12
+ .ws-check-row > li:last-child { border-bottom-left-radius: var(--ws-radius-card-inner); border-bottom-right-radius: var(--ws-radius-card-inner); }
13
+
14
+ /* A check row: the whole row opens its check (a button with aria-expanded, or a link). */
15
+ .ws-check-row__row { display: grid; grid-template-columns: var(--ws-check-row-name) minmax(0, 1fr) var(--ws-check-row-score) var(--ws-check-row-status) var(--ws-icon); grid-template-areas: "name ticks score status chev"; align-items: center; gap: var(--space-lg); width: 100%; min-height: var(--ws-check-row-h); padding: var(--space-sm) var(--space-md) var(--space-sm) var(--ws-card-inset); border: 0; border-radius: inherit; background: transparent; text-align: left; text-decoration: none; color: inherit; cursor: pointer; transition: background-color var(--ws-duration-hover) var(--ws-ease-soft); }
16
+ .ws-check-row__row:focus-visible { outline-offset: calc(var(--ws-focus-width) * -1); }
17
+ @media (hover: hover) { .ws-check-row__row:not([aria-expanded="true"], [aria-current="true"]):hover { background-color: var(--ws-hover-faint); } }
18
+ /* Open (its drawer showing): the sunk cream, the status in navy. Nothing else moves. */
19
+ .ws-check-row__row[aria-expanded="true"], .ws-check-row__row[aria-current="true"] { background-color: var(--ws-surface-sunk); }
20
+ .ws-check-row__name { grid-area: name; min-width: 0; font-size: var(--ws-text-section); line-height: var(--ws-leading-row); font-weight: 500; color: var(--color-text-heading); }
21
+ /* The ticks: 40 equal ticks across the column, 32 tall, 3 apart, 1 px corners; lit ones (b) in the row's rating tone,
22
+ the rest (i) the empty track. Strong teal, middle mid blue, needs work pink (D10). */
23
+ .ws-check-row__ticks { grid-area: ticks; display: flex; gap: var(--ws-halo); height: var(--space-xl); min-width: 0; }
24
+ .ws-check-row__ticks > * { flex: 1 0 0; min-width: var(--ws-line); border-radius: var(--ws-radius-bar); background: var(--ws-track); }
25
+ .ws-check-row__ticks > b { background: var(--ws-check-row-tone); }
26
+ .ws-check-row__ticks--middle { --ws-check-row-tone: var(--ws-rating-middle); }
27
+ .ws-check-row__ticks--needs-work { --ws-check-row-tone: var(--ws-rating-needs-work); }
28
+ .ws-check-row__score { grid-area: score; text-align: right; font-size: var(--ws-text-figure-row); line-height: var(--ws-leading-figure-row); font-weight: 400; color: var(--color-text-heading); font-variant-numeric: tabular-nums; white-space: nowrap; }
29
+ /* Not checked: a short rule in place of the figure (its words for a screen reader), on the figures' right edge. */
30
+ .ws-check-row__none { display: block; width: calc(var(--space-md) + var(--space-xxs)); height: var(--ws-chart-line); margin-left: auto; border-radius: var(--ws-radius-bar); background: var(--ws-mark-muted); }
31
+ .ws-check-row__status { grid-area: status; text-align: right; font-size: var(--ws-text-control); line-height: var(--ws-leading-control); font-weight: 500; color: var(--color-text-body); }
32
+ .ws-check-row__status--quiet { color: var(--color-text-muted); }
33
+ .ws-check-row__row[aria-expanded="true"] .ws-check-row__status, .ws-check-row__row[aria-current="true"] .ws-check-row__status { color: var(--color-text-heading); }
34
+ .ws-check-row__chev { grid-area: chev; width: var(--ws-icon); height: var(--ws-icon); color: var(--color-text-heading); }
35
+ /* Arrival: the lit ticks grow up from their base, left to right, North's 4 ms ripple a tick (where the browser can count
36
+ siblings; elsewhere they grow together). */
37
+ @media (prefers-reduced-motion: no-preference) {
38
+ .ws-check-row__line > .ws-check-row__chev { transition: transform var(--ws-spring-fold-duration) var(--ws-spring-fold); }
39
+ .ws-check-row__ticks > b { transform-origin: bottom; animation: ws-grow-up var(--ws-duration-fill) var(--ws-ease-settle) backwards; animation-delay: calc(sibling-index() * var(--ws-ripple)); }
40
+ }
41
+ /* Loading: the name and the ticks as ghosts in the chart colours' sweep (add ws-shimmer). */
42
+ .ws-check-row__ghost { display: block; height: calc(var(--space-xs) + var(--space-3xs)); border-radius: var(--ws-radius-bar); background: var(--ws-track); }
43
+ .ws-check-row__ghost.ws-shimmer, .ws-check-row__ticks.ws-shimmer { background: var(--ws-shimmer); background-size: 300% 100%; }
44
+
45
+ /* A fix row: the box (outside the open target), the fix and its effort, its act, the chevron. The open button's hit area
46
+ covers the whole line; the box and the act sit above it. Every part sits on the title's first line (22), however many
47
+ lines the words run to (a done line under the title, a long fix): the box and the chevron are that line's height, the
48
+ act is centred on it (its margins trim it to the line), and a one-line row's line sits mid-row. */
49
+ .ws-check-row__fix { transition: background-color var(--ws-duration-hover) var(--ws-ease-soft); }
50
+ .ws-check-row__line { position: relative; display: grid; border-radius: inherit; grid-template-columns: var(--ws-check-row-box) minmax(0, 1fr) auto var(--ws-icon); grid-template-areas: "box words act chev"; align-items: start; align-content: center; column-gap: var(--space-md); min-height: var(--ws-check-row-h); padding: var(--space-sm) var(--space-md) var(--space-sm) var(--ws-card-inset); }
51
+ .ws-check-row__line > .ws-check { grid-area: box; position: relative; z-index: 1; align-items: center; justify-content: center; width: var(--ws-check-row-box); height: var(--ws-leading-section); padding: 0; }
52
+ .ws-check-row__line > .ws-check-row__chev { height: var(--ws-leading-section); }
53
+ /* Its target: 24 square (the box column is 18, the line 22), 40 on touch, drawn as a hit area so nothing moves. */
54
+ .ws-check-row__line > .ws-check::after { content: ""; position: absolute; inset: calc((100% - var(--space-lg)) / 2); }
55
+ @media (pointer: coarse) { .ws-check-row__line > .ws-check::after { inset: calc((100% - var(--ws-touch)) / 2); } }
56
+ .ws-check-row__line .ws-check__box { margin-top: 0; }
57
+ .ws-check-row__open { grid-area: words; display: flex; flex-wrap: wrap; align-items: baseline; gap: var(--space-xxs-plus) var(--space-xs); min-width: 0; padding: 0; border: 0; border-radius: inherit; background: none; text-align: left; color: inherit; cursor: pointer; }
58
+ .ws-check-row__open::after { content: ""; position: absolute; inset: 0; border-radius: inherit; }
59
+ .ws-check-row__open:focus-visible { outline: 0; }
60
+ .ws-check-row__open:focus-visible::after { box-shadow: var(--ws-focus-inset); }
61
+ .ws-check-row__title { font-size: var(--ws-text-section); line-height: var(--ws-leading-section); font-weight: 500; color: var(--color-text-heading); }
62
+ .ws-check-row__effort { font-size: var(--ws-text-control); line-height: var(--ws-leading-control); font-weight: 400; color: var(--color-text-muted); }
63
+ .ws-check-row__meta { flex-basis: 100%; font-size: var(--ws-text-control); line-height: var(--ws-leading-control); font-weight: 500; color: var(--ws-word-positive); }
64
+ /* The act (Seth's 32 well, primary when open; 40 on touch) is trimmed to the title's line, so it centres on it. */
65
+ .ws-check-row__act { --ws-check-row-act: var(--ws-control-h); grid-area: act; position: relative; z-index: 1; margin-block: calc((var(--ws-leading-section) - var(--ws-check-row-act)) / 2); }
66
+ .ws-check-row__act.ws-btn--sm { --ws-check-row-act: var(--ws-control-h-sm); }
67
+ @media (pointer: coarse) { .ws-check-row .ws-check-row__act { --ws-check-row-act: var(--ws-touch); } }
68
+ /* Hover: the faint wash laid over the cream (a background-color would replace the cream and let the grey rim through). */
69
+ @media (hover: hover) { .ws-check-row__fix:not(:has(> .ws-check-row__line [aria-expanded="true"])):hover { background-image: linear-gradient(var(--ws-hover-faint), var(--ws-hover-faint)); } }
70
+ /* Open: the row sunk, its title semibold (the size never changes), the chevron up, the panel under it. */
71
+ .ws-check-row__fix:has(> .ws-check-row__line [aria-expanded="true"]) { background-color: var(--ws-surface-sunk); }
72
+ .ws-check-row__open[aria-expanded="true"] .ws-check-row__title { font-weight: 600; }
73
+ .ws-check-row__line:has([aria-expanded="true"]) > .ws-check-row__chev { transform: rotate(180deg); }
74
+ /* Done: the title muted, the line under it in the positive word. */
75
+ .ws-check-row__fix--done .ws-check-row__title { color: var(--color-text-muted); }
76
+ /* The panel: cream, 6 px corners, 24 inside, its left edge on the title's (20 + the box + 16), 16 from the right and below. */
77
+ .ws-check-row__detail { margin: 0 var(--space-md) var(--space-md) calc(var(--ws-card-inset) + var(--ws-check-row-box) + var(--space-md)); padding: var(--space-lg); border-radius: var(--ws-radius-row); background: var(--color-bg-page); }
78
+ .ws-check-row__detail[hidden] { display: none; }
79
+
80
+ /* Narrow: a check row stacks the name and status over the ticks, the score beside them; a fix row's act drops under its words. */
81
+ @container ws-check-row (max-width: 40rem) {
82
+ .ws-check-row__row { grid-template-columns: minmax(0, 1fr) auto var(--ws-icon); grid-template-areas: "name score chev" "status score chev" "ticks ticks ticks"; gap: var(--space-xxs) var(--space-sm); }
83
+ .ws-check-row__status { text-align: left; }
84
+ .ws-check-row__ticks { margin-top: var(--space-xs); }
85
+ .ws-check-row__line { grid-template-columns: var(--ws-check-row-box) minmax(0, 1fr) var(--ws-icon); grid-template-areas: "box words chev" ". act ."; }
86
+ .ws-check-row__act { justify-self: start; margin-block: var(--space-xs) 0; }
87
+ .ws-check-row__detail { margin-left: var(--space-md); }
88
+ }
@@ -15,12 +15,21 @@ A real native checkbox under a skin, drawn with a navy tick when chosen, its lab
15
15
 
16
16
  ## Anatomy
17
17
 
18
- - Box: 16px (`--ws-icon`) square, `--radius-xs` (2px, the designer's ladder step for "a chip, a short bar, a tick") corners,
19
- 1px (`--ws-line`) edge in `--ws-edge-card` at rest.
20
- - Chosen: the box fills `--color-text-heading` (navy), the edge turns navy too, and a white tick draws inside.
21
- - Label: 14px medium, `--color-text-heading`, beside the box; a description line below it in `.ws-muted` (`--color-text-muted`) (12px,
22
- `--color-text-muted`).
23
- - The whole row, box and label and description together, is the tap target, not an 18px square alone.
18
+ - Box: Seth's action box, 18 px square, 4 px corners (`--ws-radius-control`), a 1.5 px navy edge at rest (12:1 on the
19
+ cream, past the 3:1 a control asks), drawn inside so the box is exactly 18.
20
+ - Chosen: the box fills navy and a 12 px cream tick (stroke 1.75, round caps) sits in its middle. Some chosen (a select
21
+ all): a cream dash instead of the tick.
22
+ - Label: 14 / 20 medium navy, 10 px from the box (`--space-xs-plus`); a description below it in `.ws-muted`, 2 apart.
23
+ The box sits on the label's first line (1 px down).
24
+ - `--quiet`: Seth's status box (select all, replied), its edge the muted grey: his #D3D3D3 is 1.45:1, under the 3:1 a
25
+ control asks, so the AA step is used.
26
+ - `--sm`: Tally's 16 px box with a 12 / 16 label, 8 from it, for a dense row.
27
+ - `--step`: a checklist step (Seth's Steps, 308): the label 14 / 20 regular, and muted (`--color-text-muted`) once its
28
+ box is ticked. Steps sit 12 apart: put them in a `ws-stack--loose`.
29
+ - `--control`: Seth's control words (313, "Mark as replied"): the label 13 / 18 medium on an 18 px line.
30
+ - The row is its label's line (20 tall, no padding), as wide as its words and no wider, so a click far right of the
31
+ words does nothing in a column. The whole row, box and label and description together, is the target, at least
32
+ 24 tall through a hit area that moves nothing.
24
33
 
25
34
  ## Variants and sizes
26
35
 
@@ -28,36 +37,42 @@ A real native checkbox under a skin, drawn with a navy tick when chosen, its lab
28
37
  | --- | --- | --- |
29
38
  | Plain | label only | a short setting ("Send a copy to the team channel") |
30
39
  | With description | label plus a muted line under it | a setting that needs one more sentence to be clear |
40
+ | `--quiet` | the box's edge in the muted grey | a status or a select all beside rows of action boxes (Seth's Review inbox) |
41
+ | `--sm` | a 16 px box, a 12 / 16 label | a dense row of chart controls (Tally's "Cancelled") |
42
+ | `--step` | a 14 / 20 regular label, muted once done | a checklist's steps, 12 apart (`ws-stack--loose`) |
43
+ | `--control` | a 13 / 18 medium label | a status act in a row ("Mark as replied") |
31
44
 
32
- There is one size.
45
+ Sizes: 18 (the default) and 16 (`--sm`).
33
46
 
34
47
  ## States
35
48
 
36
- - **Default (not chosen):** the cream box with the fine grey edge.
37
- - **Hover:** the row may take a faint sunk tint where it sits in a list; the box itself does not change at rest.
38
- - **Focus:** the kit's focus halo (`--shadow-focus-ring`) around the box, from the native input's own focus, not a
39
- hand-rolled one.
49
+ - **Default (not chosen):** the cream box with its navy edge.
50
+ - **Hover (a mouse only):** the box takes the navy wash while it is not chosen.
51
+ - **Focus:** the kit's ring, 2 px navy, 2 px out, round the box, from the native input's own focus.
40
52
  - **Pressed:** the native input's own press; nothing is drawn for it beyond what the browser gives.
41
- - **Selected (chosen):** navy fill, navy edge, white tick. **The system's rule is navy, not the kit's salmon tick**: the kit
42
- draws its chosen state in salmon, which the system reports as a gap and overrides.
53
+ - **Pictured states (a preview or a mockup):** `is-hover` on the label draws the wash, `is-focus` the ring round the box.
54
+ - **Done (a step):** with `--step`, a ticked step's label turns muted, so what is left reads first.
55
+ - **Selected (chosen):** navy fill, the cream tick popping in (the small-mark overshoot, `--ws-ease-pop`). Navy, never
56
+ the kit's salmon tick.
57
+ - **Some chosen:** `input.indeterminate = true` draws the cream dash.
43
58
  - **Pending / loading:** not applicable; a checkbox has no network state of its own.
44
59
  - **Disabled:** 50% opacity on the whole row, pointer events off; a disabled, chosen box still shows its tick so the
45
60
  state stays legible.
46
- - **Error:** not a state the kit's `Checkbox` defines; a group needing one draws its own message below, as a field does.
61
+ - **Error:** a box that must be ticked (a consent) takes the salmon's AA step as its edge (`aria-invalid="true"`) and a
62
+ message below its label that says what to do.
47
63
  - **Empty:** not applicable; a checkbox is always one of two states.
48
- - **Long label:** the label wraps onto a second line; the box stays aligned to the first line's cap height
49
- (`margin-top`), not centred against the wrapped block.
64
+ - **Long label:** the label wraps; the box stays on the first line, not centred against the wrapped block.
50
65
  - **Narrow:** the row shrinks with its column; only the label wraps, never the box.
51
- - **Touch:** the whole label, not the 16px box, is the tap target, which clears the 40px floor in a list row's own
52
- height.
66
+ - **Touch:** one line is a 40 px row (the house's floor), the box still on the label's first line.
67
+ - **Dark:** the navy edge and fill become the light ink, the tick the dark act words.
53
68
 
54
69
  ## Behaviour
55
70
 
56
71
  - Keyboard: a native `<input type="checkbox">`; Tab reaches it, Space toggles it.
57
72
  - Pointer / touch: clicking or tapping anywhere in the label toggles it, since the label is part of the control.
58
- - Touch: the row (not just the box) is the target, so phones never need an 18px precision tap.
59
- - Motion: the fill and edge colour transition over `--ws-duration-instant` on `--ws-ease-soft`; nothing moves under
60
- `prefers-reduced-motion: reduce`.
73
+ - Touch: the row (not just the box) is the target, so phones never need an 18 px precision tap.
74
+ - Motion: the fill over the hover beat; the tick pops in over the settle beat on `--ws-ease-pop`; still under reduced
75
+ motion.
61
76
 
62
77
  ## Content
63
78
 
@@ -88,4 +103,25 @@ There is one size.
88
103
 
89
104
  **Derived from**: the kit's own `Checkbox` contract and its native-input-under-a-skin reasoning, with the tick
90
105
  overridden to navy instead of the kit's salmon (a reported gap, 21 Oct 2026; the same gap applies to `Radio`).
91
- **Precedent**: the first product built on the system.
106
+ **Precedent**: the first product built on the system. 0.5.0: Seth's action box (Fixes 308:2509, 308:2594; Review inbox
107
+ 313:2746, 313:2960; Tally 319:3468): 18 px, 4 px corners, a 1.5 px navy edge, a 12 px cream tick with a 1.75 stroke;
108
+ his status box, taken to 3:1.
109
+
110
+ ## Markup
111
+
112
+ ```html
113
+ <label class="ws-check">
114
+ <input type="checkbox">
115
+ <span class="ws-check__box" aria-hidden="true"><svg viewBox="0 0 12 12" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round"><path d="M2.5 6.25L4.75 8.5L9.5 3.75"/></svg></span>
116
+ <span class="ws-check__words">
117
+ <span class="ws-check__label">Include last month's calls</span>
118
+ <span class="ws-muted">Adds September's cold calls to this report</span>
119
+ </span>
120
+ </label>
121
+ ```
122
+
123
+ ## Styles
124
+
125
+ `design-system/components/Checkbox/style.css`: `ws-check` with `--quiet`, `--sm`, `--step`, `--control`, the pictured
126
+ states `is-hover` and `is-focus`, and `ws-check--disabled` (0.4.0's disabled class, still honoured; a disabled input
127
+ does the same on its own); `__box`, `__words`, `__label`.