@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,91 @@
1
+ A report's score the way Seth draws it: the 96 px figure, a strip of ticks across the page and the rating in words.
2
+
3
+ **Use it when**
4
+
5
+ - A report opens on one score out of a whole ("72", "10 of 16") and the reader needs to know at once how good it is.
6
+ - The score carries a rating (strong, getting there, needs work) and one sentence on what to do next.
7
+ - It is the first thing on a full page (an audit report, a check's view), not a card in a board.
8
+
9
+ **Not for**
10
+
11
+ - A goal's share with the gradient strip and a breakdown, in a card: use `GoalTicks`.
12
+ - A row of a list with its own small strip: use `TickStrip` inside the row, with a 28 px figure (`ws-figure--row`).
13
+ - A page's few numbers side by side: use `StatTiles`.
14
+
15
+ **Anatomy**
16
+
17
+ - A column, 16 apart (`--space-md`): the head, the strip, the summary.
18
+ - Head: the figure (`ws-figure ws-figure--score`: 96/96, weight 400, -3%, navy, proportional numerals so its ink sits on the strip's
19
+ edge as in Seth's frame; tabular ones put "10 of 16" 11 px in). A line that
20
+ explains the figure ("We asked 4 AI assistants...") sits 2 under it, 15/22 in `--color-text-body`.
21
+ - Strip: a `TickStrip --lg` (40 tall, 4 apart): 50 ticks for a score out of 100, one tick a unit for a count (16).
22
+ - Summary: the rating word (15/22 semibold, in the tone's AA word), 10, then the sentence (15/22 regular,
23
+ `--color-text-body`), as running text that wraps.
24
+ - It measures itself: in a column under 26rem the figure steps down to 72/72, so "10 of 16" fits a phone.
25
+
26
+ | Modifier | Strip | Rating word |
27
+ | --- | --- | --- |
28
+ | default, strong | `--ws-rating-strong` (teal) | `--ws-word-positive` |
29
+ | `--middle`, getting there | `--color-text-interactive` (mid blue, lifted in dark) | `--color-text-interactive` |
30
+ | `--needs-work` | `--ws-rating-needs-work` (pink) | `--ws-word-needs-work` |
31
+ | `--none`, not checked | every tick the track | `--color-text-muted` |
32
+
33
+ **Parts and modifiers**
34
+
35
+ - `.ws-score-hero__ghost`: loading: a ghost the size of the figure (with `ws-shimmer`).
36
+ - `.ws-score-hero__ghost--line`: loading: a ghost the size of the summary line.
37
+
38
+ **States**
39
+
40
+ - Default: the strip draws once (`--draw` on the strip, 900 ms); the summary settles in (rises 6 px out of a 3 px blur)
41
+ once the draw is half way. The figure does not count up (North: headline figures are static).
42
+ - Not checked: an en dash in muted words in place of the figure (`__figure--none`, with `aria-hidden`; the section's
43
+ label says "not checked"), every tick the track, "Could not check" and why.
44
+ - Loading: a ghost the figure's height, the strip as a ghost (`--loading`) and a ghost line, all in the chart colours'
45
+ sweep; `aria-busy="true"` on the section.
46
+ - Long sentence: wraps as running text under the rating; the figure never wraps.
47
+ - Reduced motion: no draw, no settle; the ghosts stay still.
48
+ - Hover, focus, pressed: do not apply; it is read, not pressed.
49
+
50
+ **Behaviour**
51
+
52
+ - The section carries `aria-label` with the whole score in words ("Your score: 72 of 100, strong"); the strip is
53
+ `aria-hidden`.
54
+
55
+ **Content**
56
+
57
+ - The figure is the score as people say it: "72", "10 of 16". No percent sign on a score out of 100.
58
+ - The rating is one or two words; the sentence names the next thing to do.
59
+
60
+ **Rules**
61
+
62
+ - One ScoreHero a page, at its top. Everything under it is smaller (44 pane, 32 tile, 28 row figures).
63
+ - Marks keep Seth's tones; the rating word takes its AA step on the ground it sits on.
64
+ - The not-checked figure is an en dash, never an em dash and never a zero.
65
+
66
+ **Source**
67
+
68
+ **Derived from**: Seth's Grow audit, "Your score" (301:1668) and "Which AI platforms mention you" (305:2318); the middle
69
+ band's tone is D10 (Seth did not draw it). North's draw and settle for the motion.
70
+
71
+ **Markup**
72
+
73
+ ```html
74
+ <section class="ws-score-hero ws-score-hero--needs-work" aria-label="Your score: 39 of 100, needs work">
75
+ <div class="ws-score-hero__head">
76
+ <p class="ws-figure ws-figure--score ws-score-hero__figure">39</p>
77
+ </div>
78
+ <div class="ws-tick-strip ws-tick-strip--lg ws-tick-strip--draw" style="--n: 50;" aria-hidden="true">
79
+ <span class="ws-tick-strip__tick ws-tick-strip__tick--on" style="--i: 0;"></span>
80
+ <!-- 20 lit, then 30 of the track -->
81
+ <span class="ws-tick-strip__tick"></span>
82
+ </div>
83
+ <p class="ws-score-hero__summary">
84
+ <span class="ws-score-hero__rating">Needs work</span>
85
+ <span class="ws-score-hero__line">Start with Local search.</span>
86
+ </p>
87
+ </section>
88
+ ```
89
+
90
+ **Styles**: `ScoreHero/style.css` (with `TickStrip/style.css`), in `bundle.css` and `fello.css` as `.ws-score-hero`.
91
+ Every value is a token.
@@ -0,0 +1,104 @@
1
+ <!-- @dsCard group="Charts" height=1400 -->
2
+ <!doctype html>
3
+ <html>
4
+ <head>
5
+ <meta charset="utf-8">
6
+ <title>ScoreHero</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" style="max-width: 886px;">
14
+ <span class="ws-muted">Strong: the overall score, its strip drawn in once, the rating and what to do next</span>
15
+ <section class="ws-score-hero" aria-label="Your score: 72 of 100, strong">
16
+ <div class="ws-score-hero__head">
17
+ <p class="ws-figure ws-figure--score ws-score-hero__figure">72</p>
18
+ </div>
19
+ <div class="ws-tick-strip ws-tick-strip--lg ws-tick-strip--draw" style="--n: 50;" aria-hidden="true"><span class="ws-tick-strip__tick ws-tick-strip__tick--on" style="--i: 0;"></span><span class="ws-tick-strip__tick ws-tick-strip__tick--on" style="--i: 1;"></span><span class="ws-tick-strip__tick ws-tick-strip__tick--on" style="--i: 2;"></span><span class="ws-tick-strip__tick ws-tick-strip__tick--on" style="--i: 3;"></span><span class="ws-tick-strip__tick ws-tick-strip__tick--on" style="--i: 4;"></span><span class="ws-tick-strip__tick ws-tick-strip__tick--on" style="--i: 5;"></span><span class="ws-tick-strip__tick ws-tick-strip__tick--on" style="--i: 6;"></span><span class="ws-tick-strip__tick ws-tick-strip__tick--on" style="--i: 7;"></span><span class="ws-tick-strip__tick ws-tick-strip__tick--on" style="--i: 8;"></span><span class="ws-tick-strip__tick ws-tick-strip__tick--on" style="--i: 9;"></span><span class="ws-tick-strip__tick ws-tick-strip__tick--on" style="--i: 10;"></span><span class="ws-tick-strip__tick ws-tick-strip__tick--on" style="--i: 11;"></span><span class="ws-tick-strip__tick ws-tick-strip__tick--on" style="--i: 12;"></span><span class="ws-tick-strip__tick ws-tick-strip__tick--on" style="--i: 13;"></span><span class="ws-tick-strip__tick ws-tick-strip__tick--on" style="--i: 14;"></span><span class="ws-tick-strip__tick ws-tick-strip__tick--on" style="--i: 15;"></span><span class="ws-tick-strip__tick ws-tick-strip__tick--on" style="--i: 16;"></span><span class="ws-tick-strip__tick ws-tick-strip__tick--on" style="--i: 17;"></span><span class="ws-tick-strip__tick ws-tick-strip__tick--on" style="--i: 18;"></span><span class="ws-tick-strip__tick ws-tick-strip__tick--on" style="--i: 19;"></span><span class="ws-tick-strip__tick ws-tick-strip__tick--on" style="--i: 20;"></span><span class="ws-tick-strip__tick ws-tick-strip__tick--on" style="--i: 21;"></span><span class="ws-tick-strip__tick ws-tick-strip__tick--on" style="--i: 22;"></span><span class="ws-tick-strip__tick ws-tick-strip__tick--on" style="--i: 23;"></span><span class="ws-tick-strip__tick ws-tick-strip__tick--on" style="--i: 24;"></span><span class="ws-tick-strip__tick ws-tick-strip__tick--on" style="--i: 25;"></span><span class="ws-tick-strip__tick ws-tick-strip__tick--on" style="--i: 26;"></span><span class="ws-tick-strip__tick ws-tick-strip__tick--on" style="--i: 27;"></span><span class="ws-tick-strip__tick ws-tick-strip__tick--on" style="--i: 28;"></span><span class="ws-tick-strip__tick ws-tick-strip__tick--on" style="--i: 29;"></span><span class="ws-tick-strip__tick ws-tick-strip__tick--on" style="--i: 30;"></span><span class="ws-tick-strip__tick ws-tick-strip__tick--on" style="--i: 31;"></span><span class="ws-tick-strip__tick ws-tick-strip__tick--on" style="--i: 32;"></span><span class="ws-tick-strip__tick ws-tick-strip__tick--on" style="--i: 33;"></span><span class="ws-tick-strip__tick ws-tick-strip__tick--on" style="--i: 34;"></span><span class="ws-tick-strip__tick ws-tick-strip__tick--on" style="--i: 35;"></span><span class="ws-tick-strip__tick"></span><span class="ws-tick-strip__tick"></span><span class="ws-tick-strip__tick"></span><span class="ws-tick-strip__tick"></span><span class="ws-tick-strip__tick"></span><span class="ws-tick-strip__tick"></span><span class="ws-tick-strip__tick"></span><span class="ws-tick-strip__tick"></span><span class="ws-tick-strip__tick"></span><span class="ws-tick-strip__tick"></span><span class="ws-tick-strip__tick"></span><span class="ws-tick-strip__tick"></span><span class="ws-tick-strip__tick"></span><span class="ws-tick-strip__tick"></span></div>
20
+ <p class="ws-score-hero__summary">
21
+ <span class="ws-score-hero__rating">Strong</span>
22
+ <span class="ws-score-hero__line">Zillow is your strongest. Start with Local search.</span>
23
+ </p>
24
+ </section>
25
+ </div>
26
+
27
+ <div class="ws-stack" style="max-width: 1350px;">
28
+ <span class="ws-muted">A count with its line under the figure: one tick an answer</span>
29
+ <section class="ws-score-hero" aria-label="10 of 16 answers named you">
30
+ <div class="ws-score-hero__head">
31
+ <p class="ws-figure ws-figure--score ws-score-hero__figure">10 of 16</p>
32
+ <p class="ws-score-hero__line">We asked 4 AI assistants the same 4 questions on Nov 2, about Chagrin Falls, OH.</p>
33
+ </div>
34
+ <div class="ws-tick-strip ws-tick-strip--lg" style="--n: 16;" aria-hidden="true"><span class="ws-tick-strip__tick ws-tick-strip__tick--on"></span><span class="ws-tick-strip__tick ws-tick-strip__tick--on"></span><span class="ws-tick-strip__tick ws-tick-strip__tick--on"></span><span class="ws-tick-strip__tick ws-tick-strip__tick--on"></span><span class="ws-tick-strip__tick ws-tick-strip__tick--on"></span><span class="ws-tick-strip__tick ws-tick-strip__tick--on"></span><span class="ws-tick-strip__tick ws-tick-strip__tick--on"></span><span class="ws-tick-strip__tick ws-tick-strip__tick--on"></span><span class="ws-tick-strip__tick ws-tick-strip__tick--on"></span><span class="ws-tick-strip__tick ws-tick-strip__tick--on"></span><span class="ws-tick-strip__tick"></span><span class="ws-tick-strip__tick"></span><span class="ws-tick-strip__tick"></span><span class="ws-tick-strip__tick"></span><span class="ws-tick-strip__tick"></span><span class="ws-tick-strip__tick"></span></div>
35
+ </section>
36
+ </div>
37
+
38
+ <div class="ws-stack" style="max-width: 886px;">
39
+ <span class="ws-muted">Getting there: the middle band in mid blue</span>
40
+ <section class="ws-score-hero ws-score-hero--middle" aria-label="Your score: 55 of 100, getting there">
41
+ <div class="ws-score-hero__head">
42
+ <p class="ws-figure ws-figure--score ws-score-hero__figure">55</p>
43
+ </div>
44
+ <div class="ws-tick-strip ws-tick-strip--lg" style="--n: 50;" aria-hidden="true"><span class="ws-tick-strip__tick ws-tick-strip__tick--on"></span><span class="ws-tick-strip__tick ws-tick-strip__tick--on"></span><span class="ws-tick-strip__tick ws-tick-strip__tick--on"></span><span class="ws-tick-strip__tick ws-tick-strip__tick--on"></span><span class="ws-tick-strip__tick ws-tick-strip__tick--on"></span><span class="ws-tick-strip__tick ws-tick-strip__tick--on"></span><span class="ws-tick-strip__tick ws-tick-strip__tick--on"></span><span class="ws-tick-strip__tick ws-tick-strip__tick--on"></span><span class="ws-tick-strip__tick ws-tick-strip__tick--on"></span><span class="ws-tick-strip__tick ws-tick-strip__tick--on"></span><span class="ws-tick-strip__tick ws-tick-strip__tick--on"></span><span class="ws-tick-strip__tick ws-tick-strip__tick--on"></span><span class="ws-tick-strip__tick ws-tick-strip__tick--on"></span><span class="ws-tick-strip__tick ws-tick-strip__tick--on"></span><span class="ws-tick-strip__tick ws-tick-strip__tick--on"></span><span class="ws-tick-strip__tick ws-tick-strip__tick--on"></span><span class="ws-tick-strip__tick ws-tick-strip__tick--on"></span><span class="ws-tick-strip__tick ws-tick-strip__tick--on"></span><span class="ws-tick-strip__tick ws-tick-strip__tick--on"></span><span class="ws-tick-strip__tick ws-tick-strip__tick--on"></span><span class="ws-tick-strip__tick ws-tick-strip__tick--on"></span><span class="ws-tick-strip__tick ws-tick-strip__tick--on"></span><span class="ws-tick-strip__tick ws-tick-strip__tick--on"></span><span class="ws-tick-strip__tick ws-tick-strip__tick--on"></span><span class="ws-tick-strip__tick ws-tick-strip__tick--on"></span><span class="ws-tick-strip__tick ws-tick-strip__tick--on"></span><span class="ws-tick-strip__tick ws-tick-strip__tick--on"></span><span class="ws-tick-strip__tick ws-tick-strip__tick--on"></span><span class="ws-tick-strip__tick"></span><span class="ws-tick-strip__tick"></span><span class="ws-tick-strip__tick"></span><span class="ws-tick-strip__tick"></span><span class="ws-tick-strip__tick"></span><span class="ws-tick-strip__tick"></span><span class="ws-tick-strip__tick"></span><span class="ws-tick-strip__tick"></span><span class="ws-tick-strip__tick"></span><span class="ws-tick-strip__tick"></span><span class="ws-tick-strip__tick"></span><span class="ws-tick-strip__tick"></span><span class="ws-tick-strip__tick"></span><span class="ws-tick-strip__tick"></span><span class="ws-tick-strip__tick"></span><span class="ws-tick-strip__tick"></span><span class="ws-tick-strip__tick"></span><span class="ws-tick-strip__tick"></span><span class="ws-tick-strip__tick"></span><span class="ws-tick-strip__tick"></span><span class="ws-tick-strip__tick"></span><span class="ws-tick-strip__tick"></span></div>
45
+ <p class="ws-score-hero__summary">
46
+ <span class="ws-score-hero__rating">Getting there</span>
47
+ <span class="ws-score-hero__line">Your website and social are close. Local search holds you back.</span>
48
+ </p>
49
+ </section>
50
+ </div>
51
+
52
+ <div class="ws-stack" style="max-width: 886px;">
53
+ <span class="ws-muted">Needs work: pink marks, the word in its AA step, a long sentence that wraps</span>
54
+ <section class="ws-score-hero ws-score-hero--needs-work" aria-label="Your score: 39 of 100, needs work">
55
+ <div class="ws-score-hero__head">
56
+ <p class="ws-figure ws-figure--score ws-score-hero__figure">39</p>
57
+ </div>
58
+ <div class="ws-tick-strip ws-tick-strip--lg" style="--n: 50;" aria-hidden="true"><span class="ws-tick-strip__tick ws-tick-strip__tick--on"></span><span class="ws-tick-strip__tick ws-tick-strip__tick--on"></span><span class="ws-tick-strip__tick ws-tick-strip__tick--on"></span><span class="ws-tick-strip__tick ws-tick-strip__tick--on"></span><span class="ws-tick-strip__tick ws-tick-strip__tick--on"></span><span class="ws-tick-strip__tick ws-tick-strip__tick--on"></span><span class="ws-tick-strip__tick ws-tick-strip__tick--on"></span><span class="ws-tick-strip__tick ws-tick-strip__tick--on"></span><span class="ws-tick-strip__tick ws-tick-strip__tick--on"></span><span class="ws-tick-strip__tick ws-tick-strip__tick--on"></span><span class="ws-tick-strip__tick ws-tick-strip__tick--on"></span><span class="ws-tick-strip__tick ws-tick-strip__tick--on"></span><span class="ws-tick-strip__tick ws-tick-strip__tick--on"></span><span class="ws-tick-strip__tick ws-tick-strip__tick--on"></span><span class="ws-tick-strip__tick ws-tick-strip__tick--on"></span><span class="ws-tick-strip__tick ws-tick-strip__tick--on"></span><span class="ws-tick-strip__tick ws-tick-strip__tick--on"></span><span class="ws-tick-strip__tick ws-tick-strip__tick--on"></span><span class="ws-tick-strip__tick ws-tick-strip__tick--on"></span><span class="ws-tick-strip__tick ws-tick-strip__tick--on"></span><span class="ws-tick-strip__tick"></span><span class="ws-tick-strip__tick"></span><span class="ws-tick-strip__tick"></span><span class="ws-tick-strip__tick"></span><span class="ws-tick-strip__tick"></span><span class="ws-tick-strip__tick"></span><span class="ws-tick-strip__tick"></span><span class="ws-tick-strip__tick"></span><span class="ws-tick-strip__tick"></span><span class="ws-tick-strip__tick"></span><span class="ws-tick-strip__tick"></span><span class="ws-tick-strip__tick"></span><span class="ws-tick-strip__tick"></span><span class="ws-tick-strip__tick"></span><span class="ws-tick-strip__tick"></span><span class="ws-tick-strip__tick"></span><span class="ws-tick-strip__tick"></span><span class="ws-tick-strip__tick"></span><span class="ws-tick-strip__tick"></span><span class="ws-tick-strip__tick"></span><span class="ws-tick-strip__tick"></span><span class="ws-tick-strip__tick"></span><span class="ws-tick-strip__tick"></span><span class="ws-tick-strip__tick"></span><span class="ws-tick-strip__tick"></span><span class="ws-tick-strip__tick"></span><span class="ws-tick-strip__tick"></span><span class="ws-tick-strip__tick"></span><span class="ws-tick-strip__tick"></span><span class="ws-tick-strip__tick"></span></div>
59
+ <p class="ws-score-hero__summary">
60
+ <span class="ws-score-hero__rating">Needs work</span>
61
+ <span class="ws-score-hero__line">Buyers near you see you in 5 of 9 spots on Google Maps and never in the top three. Name the towns you serve in your Google Business Profile first.</span>
62
+ </p>
63
+ </section>
64
+ </div>
65
+
66
+ <div class="ws-stack" style="max-width: 886px;">
67
+ <span class="ws-muted">Not checked: a dash in muted words, every tick the track, why in words</span>
68
+ <section class="ws-score-hero ws-score-hero--none" aria-label="Your score: not checked">
69
+ <div class="ws-score-hero__head">
70
+ <p class="ws-figure ws-figure--score ws-score-hero__figure ws-score-hero__figure--none" aria-hidden="true">&ndash;</p>
71
+ </div>
72
+ <div class="ws-tick-strip ws-tick-strip--lg" style="--n: 50;" aria-hidden="true"><span class="ws-tick-strip__tick"></span><span class="ws-tick-strip__tick"></span><span class="ws-tick-strip__tick"></span><span class="ws-tick-strip__tick"></span><span class="ws-tick-strip__tick"></span><span class="ws-tick-strip__tick"></span><span class="ws-tick-strip__tick"></span><span class="ws-tick-strip__tick"></span><span class="ws-tick-strip__tick"></span><span class="ws-tick-strip__tick"></span><span class="ws-tick-strip__tick"></span><span class="ws-tick-strip__tick"></span><span class="ws-tick-strip__tick"></span><span class="ws-tick-strip__tick"></span><span class="ws-tick-strip__tick"></span><span class="ws-tick-strip__tick"></span><span class="ws-tick-strip__tick"></span><span class="ws-tick-strip__tick"></span><span class="ws-tick-strip__tick"></span><span class="ws-tick-strip__tick"></span><span class="ws-tick-strip__tick"></span><span class="ws-tick-strip__tick"></span><span class="ws-tick-strip__tick"></span><span class="ws-tick-strip__tick"></span><span class="ws-tick-strip__tick"></span><span class="ws-tick-strip__tick"></span><span class="ws-tick-strip__tick"></span><span class="ws-tick-strip__tick"></span><span class="ws-tick-strip__tick"></span><span class="ws-tick-strip__tick"></span><span class="ws-tick-strip__tick"></span><span class="ws-tick-strip__tick"></span><span class="ws-tick-strip__tick"></span><span class="ws-tick-strip__tick"></span><span class="ws-tick-strip__tick"></span><span class="ws-tick-strip__tick"></span><span class="ws-tick-strip__tick"></span><span class="ws-tick-strip__tick"></span><span class="ws-tick-strip__tick"></span><span class="ws-tick-strip__tick"></span><span class="ws-tick-strip__tick"></span><span class="ws-tick-strip__tick"></span><span class="ws-tick-strip__tick"></span><span class="ws-tick-strip__tick"></span><span class="ws-tick-strip__tick"></span><span class="ws-tick-strip__tick"></span><span class="ws-tick-strip__tick"></span><span class="ws-tick-strip__tick"></span><span class="ws-tick-strip__tick"></span><span class="ws-tick-strip__tick"></span></div>
73
+ <p class="ws-score-hero__summary">
74
+ <span class="ws-score-hero__rating">Could not check</span>
75
+ <span class="ws-score-hero__line">Connect your Google profile and Grow scores it on the next audit.</span>
76
+ </p>
77
+ </section>
78
+ </div>
79
+
80
+ <div class="ws-stack" style="max-width: 886px;">
81
+ <span class="ws-muted">Loading: ghosts the size of the figure, the strip and the line</span>
82
+ <section class="ws-score-hero" aria-busy="true" aria-label="Your score, loading">
83
+ <div class="ws-score-hero__head">
84
+ <span class="ws-shimmer ws-score-hero__ghost" aria-hidden="true"></span>
85
+ </div>
86
+ <div class="ws-tick-strip ws-tick-strip--lg ws-tick-strip--loading" style="--n: 50;" aria-hidden="true"><span class="ws-tick-strip__tick"></span><span class="ws-tick-strip__tick"></span><span class="ws-tick-strip__tick"></span><span class="ws-tick-strip__tick"></span><span class="ws-tick-strip__tick"></span><span class="ws-tick-strip__tick"></span><span class="ws-tick-strip__tick"></span><span class="ws-tick-strip__tick"></span><span class="ws-tick-strip__tick"></span><span class="ws-tick-strip__tick"></span><span class="ws-tick-strip__tick"></span><span class="ws-tick-strip__tick"></span><span class="ws-tick-strip__tick"></span><span class="ws-tick-strip__tick"></span><span class="ws-tick-strip__tick"></span><span class="ws-tick-strip__tick"></span><span class="ws-tick-strip__tick"></span><span class="ws-tick-strip__tick"></span><span class="ws-tick-strip__tick"></span><span class="ws-tick-strip__tick"></span><span class="ws-tick-strip__tick"></span><span class="ws-tick-strip__tick"></span><span class="ws-tick-strip__tick"></span><span class="ws-tick-strip__tick"></span><span class="ws-tick-strip__tick"></span><span class="ws-tick-strip__tick"></span><span class="ws-tick-strip__tick"></span><span class="ws-tick-strip__tick"></span><span class="ws-tick-strip__tick"></span><span class="ws-tick-strip__tick"></span><span class="ws-tick-strip__tick"></span><span class="ws-tick-strip__tick"></span><span class="ws-tick-strip__tick"></span><span class="ws-tick-strip__tick"></span><span class="ws-tick-strip__tick"></span><span class="ws-tick-strip__tick"></span><span class="ws-tick-strip__tick"></span><span class="ws-tick-strip__tick"></span><span class="ws-tick-strip__tick"></span><span class="ws-tick-strip__tick"></span><span class="ws-tick-strip__tick"></span><span class="ws-tick-strip__tick"></span><span class="ws-tick-strip__tick"></span><span class="ws-tick-strip__tick"></span><span class="ws-tick-strip__tick"></span><span class="ws-tick-strip__tick"></span><span class="ws-tick-strip__tick"></span><span class="ws-tick-strip__tick"></span><span class="ws-tick-strip__tick"></span><span class="ws-tick-strip__tick"></span></div>
87
+ <span class="ws-shimmer ws-score-hero__ghost ws-score-hero__ghost--line" aria-hidden="true"></span>
88
+ </section>
89
+ </div>
90
+
91
+ <div class="ws-stack" style="width: 320px; max-width: 100%;">
92
+ <span class="ws-muted">In a 320 px column: the figure steps down to 72</span>
93
+ <section class="ws-score-hero" aria-label="10 of 16 answers named you">
94
+ <div class="ws-score-hero__head">
95
+ <p class="ws-figure ws-figure--score ws-score-hero__figure">10 of 16</p>
96
+ <p class="ws-score-hero__line">We asked 4 AI assistants the same 4 questions on Nov 2.</p>
97
+ </div>
98
+ <div class="ws-tick-strip ws-tick-strip--lg" style="--n: 16;" aria-hidden="true"><span class="ws-tick-strip__tick ws-tick-strip__tick--on"></span><span class="ws-tick-strip__tick ws-tick-strip__tick--on"></span><span class="ws-tick-strip__tick ws-tick-strip__tick--on"></span><span class="ws-tick-strip__tick ws-tick-strip__tick--on"></span><span class="ws-tick-strip__tick ws-tick-strip__tick--on"></span><span class="ws-tick-strip__tick ws-tick-strip__tick--on"></span><span class="ws-tick-strip__tick ws-tick-strip__tick--on"></span><span class="ws-tick-strip__tick ws-tick-strip__tick--on"></span><span class="ws-tick-strip__tick ws-tick-strip__tick--on"></span><span class="ws-tick-strip__tick ws-tick-strip__tick--on"></span><span class="ws-tick-strip__tick"></span><span class="ws-tick-strip__tick"></span><span class="ws-tick-strip__tick"></span><span class="ws-tick-strip__tick"></span><span class="ws-tick-strip__tick"></span><span class="ws-tick-strip__tick"></span></div>
99
+ </section>
100
+ </div>
101
+
102
+ </div>
103
+ </body>
104
+ </html>
@@ -0,0 +1,32 @@
1
+ /* ---- ScoreHero: a report's score as Seth draws it, the 96 px figure, its strip and the rating in words ---- */
2
+ /* A column 16 apart: the figure (house .ws-figure--score, 96/96, -3%), the TickStrip, the summary. The figure stands
3
+ alone, so its numerals are proportional: tabular ones carry wide side bearings at 96 px ("10 of 16" sat 11 px in from
4
+ the strip's edge; Seth's 72 sits 2 in). A line that
5
+ explains the figure sits 2 under it in the head; a summary line sits under the strip. It measures itself: under
6
+ 26rem the figure steps down to 72 so "10 of 16" fits a phone. */
7
+ .ws-score-hero { --tone-word: var(--ws-word-positive); display: flex; flex-direction: column; gap: var(--space-md); container-type: inline-size; }
8
+ .ws-score-hero__head { display: flex; flex-direction: column; gap: var(--space-3xs); }
9
+ .ws-score-hero__figure { white-space: nowrap; font-variant-numeric: proportional-nums; }
10
+ .ws-score-hero__figure--none { color: var(--color-text-muted); }
11
+ .ws-score-hero__line { font-size: var(--ws-text-section); line-height: var(--ws-leading-section); color: var(--color-text-body); text-wrap: pretty; }
12
+ /* The summary reads as one sentence: the rating word, 10, then the line, wrapping as running text. The markup keeps a
13
+ space between the two (screen readers and copy need it); Instrument Sans' space is 0.2em, so the margin gives it back. */
14
+ .ws-score-hero__summary { font-size: var(--ws-text-section); line-height: var(--ws-leading-section); color: var(--color-text-body); text-wrap: pretty; }
15
+ .ws-score-hero__rating { margin-right: calc(var(--space-xs-plus) - 0.2em); font-weight: 600; color: var(--tone-word); }
16
+ /* Rating tones (D10): the strip takes the mark, the word its AA step. */
17
+ .ws-score-hero--middle { --tone-word: var(--color-text-interactive); }
18
+ .ws-score-hero--middle .ws-tick-strip { --tone: var(--ws-rating-middle); }
19
+ .ws-score-hero--needs-work { --tone-word: var(--ws-word-needs-work); }
20
+ .ws-score-hero--needs-work .ws-tick-strip { --tone: var(--ws-rating-needs-work); }
21
+ .ws-score-hero--none { --tone-word: var(--color-text-muted); }
22
+ /* Loading: ghost blocks the size of what they stand for, in the chart colours' sweep. */
23
+ .ws-score-hero__ghost { width: calc(var(--space-6xl) * 2); max-width: 100%; height: var(--ws-leading-score); }
24
+ .ws-score-hero__ghost--line { width: min(100%, calc(var(--space-9xl) * 2)); height: var(--ws-leading-section); }
25
+ @container (max-width: 26rem) {
26
+ .ws-score-hero__figure { font-size: var(--ws-text-display); line-height: var(--ws-text-display); }
27
+ .ws-score-hero__ghost { height: var(--ws-text-display); }
28
+ }
29
+ @media (prefers-reduced-motion: no-preference) {
30
+ /* The words settle in after the strip's draw has begun (North: details settle after their frame). */
31
+ .ws-score-hero__summary { animation: ws-settle var(--ws-duration-settle) var(--ws-ease-soft) backwards; animation-delay: calc(var(--ws-duration-draw) * 0.55); }
32
+ }
@@ -1,69 +1,108 @@
1
- A group of components under a small heading, with a line of context and one action on its right.
1
+ A group of things under a short heading: Seth's 15 / 22 section title, an optional count on its line, a line of
2
+ context and one act on the right.
2
3
 
3
4
  ## Use it when
4
5
 
5
- - A page or a panel groups a few related rows, controls or small cards under one short heading.
6
- - The group needs a quiet line of context under its heading ("Three waiting since Monday") and, sometimes, one action on the right ("See all").
7
- - The heading is a page- or panel-level grouping device, not a card's own title (a card's title is its header, its head, `.ws-head` (see `Card`), or a `Dialog`'s head, not `Section`).
6
+ - A page or a panel groups a few related rows, controls or cards under one heading ("Your AI visibility checks").
7
+ - The group needs a count beside its title ("Website 0 of 2 done"), a quiet line under it, or one act ("See all").
8
8
 
9
9
  ## Not for
10
10
 
11
- - A card's own title and sentence: use the card's head (`.ws-head`, see `Card`) instead; `Section` is for grouping several things, not naming one card.
12
- - A bounded, edged surface: `Section` has no card edge or background of its own; wrap it in `Card` first if it needs one.
13
- - A tab switch between views: use `Segmented`.
11
+ - A card's own title and sentence: the card's head (`.ws-head`, see `Card`).
12
+ - A bounded, edged surface: a section has no edge or ground; put a `Card` inside it.
13
+ - A switch between views: `Segmented` or `Tabs`.
14
14
 
15
15
  ## Anatomy
16
16
 
17
17
  - A `<section>` named by its heading (`aria-labelledby`).
18
- - Heading row: the title (14 px semibold navy) and, under it, an optional note (`ws-muted`, 12 px); an optional action sits on the right of the same row, bottom-aligned with the title.
19
- - `--space-sm` (12 px) gap between the heading row and the section's content.
18
+ - Head (`__head`): the words at the left, one act at the right on the title's baseline; 12 apart across, 4 when the
19
+ act wraps under (the field fix: the gaps had been swapped). The act wraps only when the words would go under 200.
20
+ - Title (`__title`): 15 / 22 semibold navy (`--ws-text-section`, Seth's D6), an `h2` or `h3`. A long title wraps.
21
+ - Count (`__count`): control words, 13 / 18 medium in muted, 10 after the title on its baseline, inside the heading,
22
+ with a space before it in the markup so the heading reads "Website 0 of 2 done". It wraps under a long title.
23
+ - Note: one line in `ws-muted` (12 / 16), 2 under the title.
24
+ - 12 (`--space-sm`) from the head to the content (North's rule).
25
+ - Rows (`__row`): plain rows, at least 40 tall (`--ws-row-h-dense`), their words on the title's edge, Seth's 0.5 px
26
+ divider (`--ws-divider`) above each one, the first included, running the full width (Tally's side column).
20
27
 
21
28
  ## Variants and sizes
22
29
 
23
30
  | `level` | Heading element | Use |
24
31
  | --- | --- | --- |
25
32
  | `2` (default) | `h2` | A page-level section |
26
- | `3` | `h3` | A section nested inside a pane or another sectioned region |
33
+ | `3` | `h3` | A section nested in a pane or another section |
34
+
35
+ | Class | Title | Use |
36
+ | --- | --- | --- |
37
+ | (default) | 15 / 22 semibold | A group of rows or cards on a page or in a pane |
38
+ | `--area` | 22 / 28 semibold (`--ws-text-title`), 10 to the content | Seth's area heading over its card ("Website 0 of 2 done", Fixes `308:2611`); the count keeps 13 / 18 on the title's baseline |
27
39
 
28
40
  ## States
29
41
 
30
- - **Default**: title, optional note, optional action, content below.
31
- - **No note**: the title sits alone on its line.
32
- - **No action**: the heading row is just the title and note, with nothing on the right.
33
- - **Long title**: the heading row wraps rather than clipping the title; the action moves to its own line only if there is no room beside the title.
34
- - **Empty content**: a section with nothing to show is not rendered at all; `Section` never draws a heading over nothing.
42
+ - **Default**: title, optional count or note, optional act, content.
43
+ - **With a count**: the count sits on the title's line, never on a line of its own.
44
+ - **Long title**: wraps; the act stays beside it while the words keep 200, then moves under.
45
+ - **Empty content**: a section with nothing to show is not drawn; it never heads nothing.
46
+ - **Loading**: the content shows its own ghosts; the head stays.
35
47
 
36
48
  ## Behaviour
37
49
 
38
- - Keyboard: the heading is a real `h2`/`h3`; the action, if given, is a normal link or button in the page's tab order.
39
- - Pointer and touch: only the action (if any) is interactive.
40
- - Motion: `Section` itself has no entrance motion; its content (a list, a tile) carries its own, such as `ws-rise` on rows arriving.
41
- - Reduced motion: unaffected, since the component has no animation of its own.
50
+ - The heading is a real `h2` or `h3`; the act is a normal link or button in the page's tab order.
51
+ - No motion of its own; its content settles in.
42
52
 
43
53
  ## Content
44
54
 
45
- - The title is a short noun phrase naming the group ("Leads to call"), sentence case.
46
- - The note, if present, adds one short qualifying fact, never repeating the title or a number already shown in the content below.
47
- - The action is a short verb phrase ("See all"), never a bare chevron with no words.
55
+ - The title is a short noun phrase ("Leads to call"), sentence case.
56
+ - The count states progress as words a person can read ("0 of 2 done"), never a bare fraction.
57
+ - The note adds one fact the content does not already show.
58
+ - The act is a short verb phrase ("See all"), never a bare chevron.
48
59
 
49
60
  ## Props
50
61
 
51
62
  | Name | Type | Meaning |
52
63
  | --- | --- | --- |
53
- | `title` | `ReactNode` | The section's heading. |
54
- | `titleId` | string | The heading's id, for `aria-labelledby`. |
55
- | `note` | `ReactNode` | A line of context under the title. |
56
- | `action` | `ReactNode` | One action on the right of the heading row. |
57
- | `level` | `2` \| `3` | The heading element. Default `2`. |
58
- | `children` | `ReactNode` | The section's content. |
64
+ | `title` | `ReactNode` | The heading |
65
+ | `titleId` | `string` | The heading's id, for `aria-labelledby` |
66
+ | `count` | `ReactNode` | Progress on the title's line |
67
+ | `note` | `ReactNode` | A line of context under the title |
68
+ | `action` | `ReactNode` | One act on the right |
69
+ | `level` | `2` \| `3` | The heading element, default `2` |
70
+ | `children` | `ReactNode` | The content |
59
71
 
60
72
  ## Rules
61
73
 
62
- - `Section` groups components; it never substitutes for a card's own header (a card head's 22 px title is for a card, `Section`'s 14 px title is for a group of things on a page).
63
- - One action per section, on the right, never a row of several small links competing for the same spot.
64
- - Say each thing once: a section's note never repeats a figure its content already shows (the system's own rule).
74
+ - A section groups things; it never stands in for a card's own head.
75
+ - One act per section, on the right.
76
+ - Say each thing once: the note never repeats a figure the content shows.
77
+ - On a page, sections sit further apart than the things inside them (Seth's North: 56 between sections, 12 under a
78
+ head, 16 between cards): at least 24, a `ws-stack ws-stack--group`, never the 8 of a plain stack.
65
79
 
66
80
  ## Source
67
81
 
68
- **Derived from**: the system's grouping rule that a section is not a card's own header, and the one-action-per-section
69
- rule. **Precedent**: the first product built on the system.
82
+ **Derived from**: Seth's section titles (Fia `301:1725` "Your AI visibility checks" 15 / 22 semibold, 16 to its list;
83
+ Fixes `308:2611` area heading with its count 10 after it on the baseline; Tally `319:3302` side column, a 0.5 px
84
+ rule above every row), North's section head (12 to its content,
85
+ `style1.css` 174 to 180), the 0.5 px divider (D5) and the field fix to the head's gaps (Ignite `surfaces.tsx:69`).
86
+
87
+ ## Markup
88
+
89
+ ```html
90
+ <section class="ws-section-group" aria-labelledby="sec-website">
91
+ <div class="ws-section-group__head">
92
+ <div class="ws-section-group__words">
93
+ <h2 id="sec-website" class="ws-section-group__title">Website <span class="ws-section-group__count">0 of 2 done</span></h2>
94
+ </div>
95
+ <button type="button" class="ws-btn ws-btn--text">See all</button>
96
+ </div>
97
+ <ul>
98
+ <li class="ws-section-group__row"><span class="ws-row__title">Add alt text to listing photos</span><span class="ws-muted">A few days</span></li>
99
+ </ul>
100
+ </section>
101
+ ```
102
+
103
+ ## Styles
104
+
105
+ `Section/style.css`; the act is `Button`'s. Tokens: `--ws-text-section`, `--ws-leading-section`, `--ws-text-title`,
106
+ `--ws-leading-title`, `--space-xs-plus`,
107
+ `--ws-text-control`, `--ws-leading-control`, `--space-sm`, `--space-xs-plus`, `--ws-row-h-dense`, `--ws-divider`,
108
+ `--color-text-heading`, `--color-text-muted`.
@@ -1,4 +1,4 @@
1
- <!-- @dsCard group="Layout" height=218 -->
1
+ <!-- @dsCard group="Layout" height=424 -->
2
2
  <!doctype html>
3
3
  <html>
4
4
  <head>
@@ -8,34 +8,64 @@
8
8
  <link rel="stylesheet" href="../bundle.css">
9
9
  </head>
10
10
  <body>
11
- <div class="ws-stage ws-stage--grey">
11
+ <div class="ws-stage">
12
12
 
13
- <div style="width: 360px; max-width: 100%;">
13
+ <div class="ws-stack" style="width: 360px; max-width: 100%;">
14
+ <span class="ws-muted">A title, a line of context and one act on the title's line</span>
14
15
  <section class="ws-section-group" aria-labelledby="sec-1">
15
16
  <div class="ws-section-group__head">
16
17
  <div class="ws-section-group__words">
17
18
  <h2 id="sec-1" class="ws-section-group__title">Leads to call</h2>
18
- <p class="ws-muted">Three waiting since Monday</p>
19
+ <p class="ws-muted">Waiting since Monday</p>
19
20
  </div>
20
21
  <button type="button" class="ws-btn ws-btn--text">See all</button>
21
22
  </div>
22
23
  <ul>
23
- <li class="ws-section-group__row">
24
- <span class="ws-row__title">Priya Nair</span>
25
- <span class="ws-muted">New lead</span>
26
- </li>
27
- <li class="ws-section-group__row">
28
- <span class="ws-row__title">Dana Ortiz</span>
29
- <span class="ws-muted">Showing booked</span>
30
- </li>
31
- <li class="ws-section-group__row">
32
- <span class="ws-row__title">Jon Park</span>
33
- <span class="ws-muted">Offer out</span>
34
- </li>
24
+ <li class="ws-section-group__row"><span class="ws-row__title">Priya Nair</span><span class="ws-muted">New lead</span></li>
25
+ <li class="ws-section-group__row"><span class="ws-row__title">Dana Ortiz</span><span class="ws-muted">Showing booked</span></li>
26
+ <li class="ws-section-group__row"><span class="ws-row__title">Jon Park</span><span class="ws-muted">Offer out</span></li>
35
27
  </ul>
36
28
  </section>
37
29
  </div>
38
30
 
31
+ <div class="ws-stack" style="width: 360px; max-width: 100%;">
32
+ <span class="ws-muted">Seth's count on the title's line, his 22 / 28 area heading (--area), and a long title that wraps with its act kept beside it; sections sit 24 apart</span>
33
+ <div class="ws-stack ws-stack--group">
34
+ <section class="ws-section-group" aria-labelledby="sec-2">
35
+ <div class="ws-section-group__head">
36
+ <div class="ws-section-group__words">
37
+ <h2 id="sec-2" class="ws-section-group__title">Website <span class="ws-section-group__count">0 of 2 done</span></h2>
38
+ </div>
39
+ </div>
40
+ <ul>
41
+ <li class="ws-section-group__row"><span class="ws-row__title">Add alt text to listing photos</span><span class="ws-muted">A few days</span></li>
42
+ <li class="ws-section-group__row"><span class="ws-row__title">Speed up the home page</span><span class="ws-muted">An hour</span></li>
43
+ </ul>
44
+ </section>
45
+ <section class="ws-section-group ws-section-group--area" aria-labelledby="sec-4">
46
+ <div class="ws-section-group__head">
47
+ <div class="ws-section-group__words">
48
+ <h2 id="sec-4" class="ws-section-group__title">Social <span class="ws-section-group__count">1 of 2 done</span></h2>
49
+ </div>
50
+ </div>
51
+ <ul>
52
+ <li class="ws-section-group__row"><span class="ws-row__title">Post one listing a week</span><span class="ws-muted">An hour</span></li>
53
+ </ul>
54
+ </section>
55
+ <section class="ws-section-group" aria-labelledby="sec-3">
56
+ <div class="ws-section-group__head">
57
+ <div class="ws-section-group__words">
58
+ <h2 id="sec-3" class="ws-section-group__title">Buyers who opened your last two listing emails</h2>
59
+ </div>
60
+ <button type="button" class="ws-btn ws-btn--text">See all</button>
61
+ </div>
62
+ <ul>
63
+ <li class="ws-section-group__row"><span class="ws-row__title">Sam Okafor</span><span class="ws-muted">Opened both</span></li>
64
+ </ul>
65
+ </section>
66
+ </div>
67
+ </div>
68
+
39
69
  </div>
40
70
  </body>
41
71
  </html>
@@ -0,0 +1,18 @@
1
+ /* ---- Section: a group under its heading, Seth's 15 / 22 semibold section title (D6), an optional count on its line, a line
2
+ of context and one act on the right; 12 to the content. (The block is .ws-section-group: .ws-section is the house's
3
+ title words.) ---- */
4
+ .ws-section-group { display: flex; flex-direction: column; gap: var(--space-sm); }
5
+ .ws-section-group__head { display: flex; flex-wrap: wrap; align-items: baseline; justify-content: space-between; gap: var(--space-xxs) var(--space-sm); }
6
+ .ws-section-group__words { display: flex; flex: 1 1 0; flex-direction: column; gap: var(--space-3xs); min-width: min(100%, var(--space-9xl)); }
7
+ .ws-section-group__title { font-size: var(--ws-text-section); line-height: var(--ws-leading-section); font-weight: 600; letter-spacing: var(--ws-tracking-title); color: var(--color-text-heading); }
8
+ /* A count on the title's line ("0 of 2 done"): control words in muted, 10 after the title, on its baseline. Keep a space
9
+ before it in the markup so the heading reads "Website 0 of 2 done"; the flex gap draws the 10. */
10
+ .ws-section-group__title:has(> .ws-section-group__count) { display: flex; flex-wrap: wrap; align-items: baseline; column-gap: var(--space-xs-plus); }
11
+ /* --area: Seth's area heading over its card (Fixes 308:2611, "Website 0 of 2 done"): the 22 / 28 title step (ws-title),
12
+ its count still 13 / 18 on the baseline, 10 to the card. */
13
+ .ws-section-group--area { gap: var(--space-xs-plus); }
14
+ .ws-section-group--area .ws-section-group__title { font-size: var(--ws-text-title); line-height: var(--ws-leading-title); }
15
+ .ws-section-group__count { font-size: var(--ws-text-control); line-height: var(--ws-leading-control); font-weight: 500; letter-spacing: normal; color: var(--color-text-muted); font-variant-numeric: tabular-nums; white-space: nowrap; }
16
+ /* Plain rows under a section: 40 tall, their words on the title's edge, Seth's 0.5 px divider above each one, the first
17
+ included (Tally's side column), full width. */
18
+ .ws-section-group__row { display: flex; align-items: center; justify-content: space-between; gap: var(--space-sm); min-height: var(--ws-row-h-dense); border-top: var(--ws-divider); }