@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,23 @@
1
+ /* ---- TickRow: a count out of a small whole as a row of ticks (also inside StatTiles, GoalTicks, Leaderboard) ---- */
2
+ /* The row shrinks with its column (it never clips a tile or squeezes its label): each tick gives way down to 2 px.
3
+ A done tick is one solid tone (style="--tone: ..." on the row, teal by default), or its own stretch of the gradient
4
+ (an inline background on the tick). An empty tick is the plain track, no edge (Seth). */
5
+ .ws-tick-row { --tone: var(--ws-chart-finished); display: flex; flex-shrink: 1; min-width: 0; gap: var(--space-xxs); }
6
+ .ws-tick-row__tick { flex: 0 1 auto; width: var(--space-xs-plus); min-width: var(--space-3xs); height: calc(var(--space-md) + var(--space-3xs)); border-radius: var(--ws-radius-bar); background: var(--tone); transform-origin: bottom; }
7
+ .ws-tick-row__tick--empty { background: var(--ws-track); }
8
+ /* Fine: 6 x 18, 2 apart, up to 20 (a first-open card). Tall: 10 x 28, 3 apart, up to 20 (Seth's "Need a reply"). */
9
+ .ws-tick-row--fine { gap: var(--space-3xs); }
10
+ .ws-tick-row--fine .ws-tick-row__tick { width: var(--space-xxs-plus); }
11
+ .ws-tick-row--tall { gap: calc(var(--space-3xs) + var(--ws-line)); }
12
+ .ws-tick-row--tall .ws-tick-row__tick { height: calc(var(--space-lg) + var(--space-xxs)); }
13
+ /* The row on a line with its label before it and its count after it. The count takes the rest of the line and wraps
14
+ there (a sentence after the figure), so the ticks keep their size; only when the count's longest word no longer fits
15
+ do the ticks give way, never over the count. Keep the figure whole with no-break spaces ("2.9 of 4"). */
16
+ .ws-tick-row__line { display: flex; align-items: center; gap: var(--space-sm); }
17
+ .ws-tick-row__label { width: var(--space-6xl); flex-shrink: 0; font-size: var(--ws-text-body); line-height: var(--ws-leading-row); color: var(--color-text-heading); }
18
+ .ws-tick-row__count { flex: 1 1 0; font-size: var(--ws-text-value); font-weight: 600; line-height: var(--ws-leading-row); color: var(--color-text-heading); font-variant-numeric: tabular-nums; }
19
+ /* Build-in (North): ticks rise from their foot one after another, each on the settle curve, over a share of the draw.
20
+ Set --i (0, 1, 2 ...) on each tick and --n (the tick count) on the row. */
21
+ @media (prefers-reduced-motion: no-preference) {
22
+ .ws-tick-row--draw .ws-tick-row__tick { animation: ws-grow-up calc(var(--ws-duration-draw) * 0.45) var(--ws-ease-settle) backwards; animation-delay: calc(var(--ws-build-at, 0s) + var(--ws-duration-draw) * 0.55 * var(--i, 0) / max(var(--n, 2) - 1, 1)); }
23
+ }
@@ -0,0 +1,95 @@
1
+ A share drawn as equal ticks across the whole width: the done ones in one tone, the rest the plain track. Seth's score strips.
2
+
3
+ **Use it when**
4
+
5
+ - A score or a share should read at a glance across a row or a card ("72", "39 of 100", "10 of 16 named you").
6
+ - Several rows each carry their own share and line up as one column (a list of checks, each with its strip).
7
+ - Time runs in steps you can count (Tally's months, a quarter a group).
8
+
9
+ **Not for**
10
+
11
+ - A count out of a small whole beside a label, ticks of a fixed size: use `TickRow`.
12
+ - One card's goal with the gradient strip and a breakdown: use `GoalTicks`.
13
+ - A score with its 96 px figure and rating word: use `ScoreHero`, which holds this strip.
14
+ - Progress split by area with labels under each part: use `SegmentedProgress`.
15
+
16
+ **Anatomy**
17
+
18
+ - Strip: `display: flex`, ticks `flex: 1 0 0` so they divide the width, at least 1 px each, 1 px corners (`--ws-radius-bar`).
19
+ - A tick is `--ws-track` until it is `--on`, then `--tone` (teal `--ws-rating-strong` by default). No edge, no gradient.
20
+ - Lit count: `round(value / of * n)`. Seth: 72 of 100 is 36 of 50; 39 is 16 of 40; 75 is 30; 92 is 37; 100 is 40.
21
+ - The gap gives way on a narrow strip: it is the size's gap or a third of a tick's share of the width, whichever is less,
22
+ rounded down to a whole pixel. Set `--n` (the tick count) on the strip for this and for the draw.
23
+
24
+ | Size | Height | Gap | Seth's use |
25
+ | --- | --- | --- | --- |
26
+ | default (md) | 32 | 3 | a check's row, 40 ticks |
27
+ | `--lg` | 40 | 4 | the overall score (50 ticks), one tick an answer (16) |
28
+ | `--sm` | 32 | 2 | a pane's score beside its 44 px figure |
29
+ | `--xs` | 24 | 2 | a score inside a detail, 50 ticks |
30
+ | `--xl` | 96 | 3 | Tally's months, 13 a quarter |
31
+ | `--bar` | 12 | 4 | one segment a step, 2 px corners |
32
+
33
+ - Groups (`.ws-tick-strip__groups`): strips 16 apart, each with a label 6 under it (11/14, `--color-text-muted`) and an
34
+ optional marker over the tick that turns: an 8 px salmon dot and 11/14 medium words in `--ws-word-needs`, 6 apart,
35
+ placed with `style="--at: 0%"`. The strip starts 24 down (Seth draws 22, the marker's 14 line and 8; snapped to the
36
+ grid), so the marker sits 10 over it.
37
+
38
+ **Tones**
39
+
40
+ | Modifier | Mark | The word beside it |
41
+ | --- | --- | --- |
42
+ | default, strong | `--ws-rating-strong` (teal) | `--ws-word-positive` |
43
+ | `--middle`, getting there | `--color-text-interactive` (mid blue, lifted in dark) | `--color-text-interactive` |
44
+ | `--needs-work` | `--ws-rating-needs-work` (pink #F370A4) | `--ws-word-needs-work` |
45
+ | `style="--tone: ..."` | any chart tone, on the strip or one tick | its AA word token |
46
+
47
+ **Parts and modifiers**
48
+
49
+ - `.ws-tick-strip__label`: a group's label under its strip, 11/14 muted, one line with an ellipsis.
50
+ - `.ws-tick-strip__marker`: a salmon dot (`--ws-chart-under-half` (chart tone 3, so a palette that sets it moves it)) and its word over the tick that turns, at `style="--at: 40%"` in the group.
51
+
52
+ **States**
53
+
54
+ - Default: the lit ticks and the track.
55
+ - Draw (`--draw`): one 900 ms draw (`--ws-duration-draw`); tick i starts at its share of the first 55% and rises from
56
+ its foot on `--ws-ease-settle`. Set `--i` on each lit tick.
57
+ - Not checked or zero: every tick the track; the figure beside it says so in words (a dash, "Could not check").
58
+ - Loading (`--loading`): the ticks as a still ghost with the chart colours' sweep (`--ws-shimmer`, 1.8 s). The ticks
59
+ inside are hidden, so the ghost has the strip's exact shape.
60
+ - Hover (`--hover`, opt in): the tick under the pointer grows to 116% from its foot on `--ws-ease-lift`, its two
61
+ neighbours half as much 4 ms later, the rest dim to 30%. Only with a hovering pointer.
62
+ - Reduced motion: no draw, no sweep, no grow; the ghost stays still.
63
+ - Focus, pressed, disabled: do not apply; the strip is a picture, not a control.
64
+
65
+ **Behaviour**
66
+
67
+ - Always `aria-hidden="true"`. The figure next to it is the words ("72", "39 of 100"); a group of strips sits in a
68
+ `<figure aria-label="...">` that says the whole story in one sentence.
69
+ - Inside a row that is a target, the row takes the pointer and the focus; the strip never does.
70
+
71
+ **Rules**
72
+
73
+ - One tone a strip (Seth). The tone's word takes its AA step; the tick keeps the exact mark colour.
74
+ - The empty tick is the track with no edge; it means nothing alone, so the figure always says the number.
75
+ - Rows of strips use one count and one size, so every strip in a list is the same length and the numbers line up.
76
+ - A target tick is named in Seth's Fixes frame but drawn like the rest: its look is unknown, so there is no target part.
77
+
78
+ **Source**
79
+
80
+ **Derived from**: Seth's Grow audit (301:1671, 301:1732, 301:2027, 305:2323), Fixes (308:2538) and Tally (319:3474 to
81
+ 319:3532) frames; hover and draw from North's motion config. **Precedent**: Ignite's `TickStrip` (60 ticks overall there;
82
+ Seth's frame has 50, and the kit follows the frame).
83
+
84
+ **Markup**
85
+
86
+ ```html
87
+ <p class="ws-figure ws-figure--row">39</p>
88
+ <div class="ws-tick-strip ws-tick-strip--needs-work" style="--n: 40;" aria-hidden="true">
89
+ <span class="ws-tick-strip__tick ws-tick-strip__tick--on"></span>
90
+ <!-- 16 lit in all, then the rest -->
91
+ <span class="ws-tick-strip__tick"></span>
92
+ </div>
93
+ ```
94
+
95
+ **Styles**: `TickStrip/style.css`, in `bundle.css` and `fello.css` as `.ws-tick-strip`. Every value is a token.
@@ -0,0 +1,88 @@
1
+ <!-- @dsCard group="Progress" height=980 -->
2
+ <!doctype html>
3
+ <html>
4
+ <head>
5
+ <meta charset="utf-8">
6
+ <title>TickStrip</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">Large (40 tall, 4 apart): the overall score, 72 of 100 as 36 of 50 ticks, strong teal, drawn in once</span>
15
+ <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>
16
+ </div>
17
+
18
+ <div class="ws-stack">
19
+ <span class="ws-muted">Default (32 tall, 3 apart): a check's row, 39 of 100 as 16 of 40, needs work pink</span>
20
+ <div class="ws-tick-strip ws-tick-strip--needs-work" style="--n: 40;" 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"></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>
21
+ </div>
22
+
23
+ <div class="ws-stack">
24
+ <span class="ws-muted">The middle band, "Getting there": 55 of 100 as 22 of 40, mid blue</span>
25
+ <div class="ws-tick-strip ws-tick-strip--middle" style="--n: 40;" 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"></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>
26
+ </div>
27
+
28
+ <div class="ws-stack" style="width: 380px; max-width: 100%;">
29
+ <span class="ws-muted">Small (32 tall, 2 apart): a pane's score beside its figure</span>
30
+ <div class="ws-tick-strip ws-tick-strip--sm ws-tick-strip--needs-work" style="--n: 40;" 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"></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>
31
+ </div>
32
+
33
+ <div class="ws-stack" style="width: 590px; max-width: 100%;">
34
+ <span class="ws-muted">Extra small (24 tall, 2 apart): 83 of 100 in a detail, 42 of 50</span>
35
+ <div class="ws-tick-strip ws-tick-strip--xs" 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 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></div>
36
+ </div>
37
+
38
+ <div class="ws-stack">
39
+ <span class="ws-muted">One tick a unit: 10 of 16 answers named you</span>
40
+ <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>
41
+ </div>
42
+
43
+ <div class="ws-stack">
44
+ <span class="ws-muted">Not checked: every tick the track, the figure beside says it in words</span>
45
+ <div class="ws-tick-strip" style="--n: 40;" 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></div>
46
+ </div>
47
+
48
+ <div class="ws-stack">
49
+ <span class="ws-muted">Loading: the ticks as a ghost with the chart colours' sweep (still with reduced motion)</span>
50
+ <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>
51
+ </div>
52
+
53
+ <div class="ws-stack">
54
+ <span class="ws-muted">Hover (opt in): the tick under the pointer grows from its foot, the rest dim</span>
55
+ <div class="ws-tick-strip ws-tick-strip--hover" style="--n: 40;" 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 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></div>
56
+ </div>
57
+
58
+ <div class="ws-stack">
59
+ <span class="ws-muted">Extra large in groups (96 tall, quarters 16 apart): a tool paid for, then off from Q1 2027</span>
60
+ <figure class="ws-tick-strip__groups" aria-label="Paid every month until Q1 2027, then off">
61
+ <div class="ws-tick-strip__group">
62
+ <div class="ws-tick-strip ws-tick-strip--xl" style="--n: 13; --tone: var(--ws-chart-past-half);" 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></div>
63
+ <span class="ws-tick-strip__label" aria-hidden="true">Today</span>
64
+ </div>
65
+ <div class="ws-tick-strip__group">
66
+ <span class="ws-tick-strip__marker" aria-hidden="true">Off Q1 2027</span>
67
+ <div class="ws-tick-strip ws-tick-strip--xl" style="--n: 13; --tone: var(--ws-chart-under-half);" aria-hidden="true"><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></div>
68
+ <span class="ws-tick-strip__label" aria-hidden="true">Q1 27</span>
69
+ </div>
70
+ <div class="ws-tick-strip__group">
71
+ <div class="ws-tick-strip ws-tick-strip--xl" style="--n: 13;" 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></div>
72
+ <span class="ws-tick-strip__label" aria-hidden="true">Q2 27</span>
73
+ </div>
74
+ <div class="ws-tick-strip__group">
75
+ <div class="ws-tick-strip ws-tick-strip--xl" style="--n: 13;" 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></div>
76
+ <span class="ws-tick-strip__label" aria-hidden="true">Q3 27</span>
77
+ </div>
78
+ </figure>
79
+ </div>
80
+
81
+ <div class="ws-stack">
82
+ <span class="ws-muted">Bar (12 tall, 4 apart, 2 px corners): one segment a step, 1 of 6 done</span>
83
+ <div class="ws-tick-strip ws-tick-strip--bar" style="--n: 6;" aria-hidden="true"><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></div>
84
+ </div>
85
+
86
+ </div>
87
+ </body>
88
+ </html>
@@ -0,0 +1,42 @@
1
+ /* ---- TickStrip: a share as equal ticks across the whole width, the done ones in one tone (Seth's score strips) ---- */
2
+ /* Set --n (the tick count) on the strip; mark each done tick --on. The gap gives way on a narrow strip, so 50 ticks
3
+ still read as ticks at 320 px: it is the size's gap, or a third of a tick's share of the width if that is less,
4
+ rounded down to a whole pixel. */
5
+ .ws-tick-strip { --n: 40; --gap: calc(var(--space-3xs) + var(--ws-line)); --g: round(down, min(var(--gap), 100% / (var(--n) * 3)), var(--ws-line)); --tone: var(--ws-rating-strong); display: flex; gap: var(--g); height: var(--space-xl); }
6
+ .ws-tick-strip__tick { flex: 1 0 0; min-width: var(--ws-line); border-radius: var(--ws-radius-bar); background: var(--ws-track); transform-origin: bottom; }
7
+ .ws-tick-strip__tick--on { background: var(--tone); }
8
+ /* Sizes (Seth): md 32 / 3 (a check row, 40 ticks) is the default; lg 40 / 4 (the overall score, 50; one an answer);
9
+ sm 32 / 2 (a pane); xs 24 / 2 (a score in a detail, 50); xl 96 / 3 (Tally's quarters); bar 12 / 4 with 2 px corners. */
10
+ .ws-tick-strip--lg { --gap: var(--space-xxs); height: var(--space-2xl); }
11
+ .ws-tick-strip--sm { --gap: var(--space-3xs); }
12
+ .ws-tick-strip--xs { --gap: var(--space-3xs); height: var(--space-lg); }
13
+ .ws-tick-strip--xl { --gap: calc(var(--space-3xs) + var(--ws-line)); height: var(--space-6xl); }
14
+ .ws-tick-strip--bar { --gap: var(--space-xxs); height: var(--space-sm); }
15
+ .ws-tick-strip--bar .ws-tick-strip__tick { border-radius: var(--ws-radius-chip); }
16
+ /* Rating tones (D10): strong teal, middle mid blue, needs work pink. The words beside take their AA step. The middle
17
+ mark is --ws-rating-middle: the mid blue in light, its lifted step in dark. */
18
+ .ws-tick-strip--middle { --tone: var(--ws-rating-middle); }
19
+ .ws-tick-strip--needs-work { --tone: var(--ws-rating-needs-work); }
20
+ /* Groups (Tally's vendor quarters): strips 16 apart, a label under each, a marker over the tick that turns. The
21
+ strips start 24 down (Seth's 22, the marker's 14 line and 8, on the grid: D3), so the marker sits 10 over them. */
22
+ .ws-tick-strip__groups { display: flex; gap: var(--space-md); }
23
+ .ws-tick-strip__group { position: relative; display: flex; flex: 1; min-width: 0; flex-direction: column; gap: var(--space-xxs-plus); padding-top: var(--space-lg); }
24
+ .ws-tick-strip__label { overflow: hidden; white-space: nowrap; text-overflow: ellipsis; font-size: var(--ws-text-micro); line-height: var(--space-sm-plus); color: var(--color-text-muted); font-variant-numeric: tabular-nums; }
25
+ .ws-tick-strip__marker { position: absolute; top: 0; left: var(--at, 0%); display: flex; align-items: center; gap: var(--space-xxs-plus); white-space: nowrap; font-size: var(--ws-text-micro); font-weight: 500; line-height: var(--space-sm-plus); color: var(--ws-word-needs); }
26
+ .ws-tick-strip__marker::before { content: ""; width: var(--space-xs); height: var(--space-xs); border-radius: var(--radius-full); background: var(--ws-chart-under-half); }
27
+ /* Loading (North): the ticks as a still ghost, the chart colours' sweep passing over them. */
28
+ .ws-tick-strip--loading { --pitch: calc((100% + var(--g)) / var(--n)); background: var(--ws-shimmer); background-size: 300% 100%; -webkit-mask-image: repeating-linear-gradient(90deg, var(--ws-mask) 0 calc(var(--pitch) - var(--g)), transparent 0 var(--pitch)); mask-image: repeating-linear-gradient(90deg, var(--ws-mask) 0 calc(var(--pitch) - var(--g)), transparent 0 var(--pitch)); }
29
+ .ws-tick-strip--loading > * { visibility: hidden; }
30
+ @media (prefers-reduced-motion: no-preference) {
31
+ .ws-tick-strip--loading { animation: ws-shimmer var(--ws-loop-shimmer) var(--ws-ease-shimmer) infinite; }
32
+ /* Build-in (North): one draw; tick i starts at its share of 55% of it and rises on the settle curve. Set --i on each. */
33
+ .ws-tick-strip--draw .ws-tick-strip__tick--on { animation: ws-grow-up calc(var(--ws-duration-draw) * 0.45) var(--ws-ease-settle) backwards; animation-delay: calc(var(--ws-build-at, 0s) + var(--ws-duration-draw) * 0.55 * var(--i, 0) / max(var(--n) - 1, 1)); }
34
+ .ws-tick-strip--hover .ws-tick-strip__tick { transition: transform var(--ws-duration-settle) var(--ws-ease-lift), opacity var(--ws-duration-hover) var(--ws-ease-soft); }
35
+ }
36
+ /* Hover (North, opt in with --hover on a strip people read tick by tick): the tick under the pointer grows from its
37
+ foot, its neighbours half as much a ripple later, the rest dim. Colour and scale only; nothing moves around it. */
38
+ @media (hover: hover) {
39
+ .ws-tick-strip--hover:hover .ws-tick-strip__tick { opacity: var(--ws-dim); }
40
+ .ws-tick-strip--hover .ws-tick-strip__tick:hover { opacity: 1; transform: scaleY(var(--ws-grow-scale)); }
41
+ .ws-tick-strip--hover .ws-tick-strip__tick:hover + .ws-tick-strip__tick, .ws-tick-strip--hover .ws-tick-strip__tick:has(+ .ws-tick-strip__tick:hover) { opacity: 1; transform: scaleY(calc((1 + var(--ws-grow-scale)) / 2)); transition-delay: var(--ws-ripple); }
42
+ }
@@ -1,10 +1,13 @@
1
- One block of a bento grid: an icon, a title, a meta note and its own body, as the one card.
1
+ One block of a bento grid (an icon, a title, a meta note and its own body, as the one card), and the product tile row:
2
+ what an app can do, a few tiles joined on the tray, each a door or the step it waits on.
2
3
 
3
4
  ## Use it when
4
5
 
5
6
  - Several independent small facts or mini-charts sit together on a dashboard in a grid of tiles (`.ws-board--4`, see `Page`).
6
7
  - Each block has one clear job and a short name (a count, a small chart, a short list), not a whole page's worth of content.
7
8
  - The page's layout should answer to different widths (12 columns wide, 6 on a tablet, one on a phone) without a bespoke breakpoint per screen.
9
+ - An app's first open ends with what it can do: two or three product tiles (`ws-tiles`), each opening a part of the
10
+ app or naming the step it waits on (issue #9).
8
11
 
9
12
  ## Not for
10
13
 
@@ -14,12 +17,18 @@ One block of a bento grid: an icon, a title, a meta note and its own body, as th
14
17
 
15
18
  ## Anatomy
16
19
 
17
- - The tile is the one `Card`, `--space-9xl`-stepped width spans (`span`, in twelfths of a wide screen), overflow hidden.
18
- - Header: `--space-3xl` (48 px) minimum height, `--ws-card-padding-lg` (16 px) sides, an icon disc before the title where given.
19
- - Icon disc: 24 px (`--space-lg`) circle (`ws-disc`, the sunk ground), its icon 12 px (`--space-sm`) inside, navy.
20
- - Title: 16 px semibold navy (`--ws-text-value`, `ws-tracking-title`), truncated to one line; a meta note sits beside it on the same baseline, muted, also truncated.
21
- - Body: below the header, `--space-sm` (12 px) gap between its own children, `--ws-card-padding-lg` (16 px) on the remaining sides.
22
- - The whole tile rises in on arrival (`ws-rise`, `--ws-duration-settle`).
20
+ - The bento tile is the one `Card` (the tray rim, 8 / 7 corners). It is not clipped, so a menu or tip inside it shows.
21
+ - Header: 48 px tall at least (`--space-3xl`), 16 px sides, a 24 px icon disc (`ws-disc`, its icon 12 px, navy) before
22
+ the title, 8 px apart; the title is `ws-section` (15 / 22 semibold navy) and wraps; a meta note sits beside it.
23
+ - Body: 4 px under the header, 16 px on the other sides, its parts 8 px apart (Seth's tile).
24
+ - Figure (`ws-tile__figure`): Seth's tile figure, 32 / 38 regular navy, tight tracking, tabular. A figure not there
25
+ yet ("Not connected") is muted (`ws-tile__figure--none`).
26
+ - The product tile row (`ws-tiles`): the tray (`--ws-tray`) 1 px round and 2 px between the tiles, 8 px corners. Each
27
+ tile (`ws-tiles__tile`, 7 px corners) is the whole target: a cream surface (`ws-tiles__surface`, 16 px inside, 12
28
+ between its parts, 108 px tall at least) holding a 24 px navy line icon, a 14 / 20 medium navy title and a 13 / 18
29
+ medium line in `--color-text-body`; under it, on the grey, the card's foot (`ws-card__foot`, 36 px, 16 px sides):
30
+ a door (`--door`: navy words and a 16 px chevron) or the step it waits on (`--waits`: muted, and the tile is not a
31
+ link). Tiles share the row and wrap under 168 px each.
23
32
 
24
33
  ## Variants and sizes
25
34
 
@@ -36,18 +45,25 @@ The spans are the first product's twelve-column grid. On a page built on fello.c
36
45
 
37
46
  ## States
38
47
 
39
- - **Default**: the card at rest, its icon and title in place.
40
- - **Long title or meta**: both truncate with an ellipsis rather than wrapping the header taller.
41
- - **No icon**: the header's leading disc is simply omitted; the title sits flush left.
42
- - **No meta**: the title alone fills the header's text area.
43
- - **Empty body**: a tile with nothing to show is not placed in the grid at all, the same rule as any other card.
48
+ - **Default**: the card at rest.
49
+ - **Hover** (a tile row's door, a pointer that hovers): the tray under the tile darkens to `--ws-well-hover` and the
50
+ door's words underline. A bento tile that is a link takes `Card`'s hover (the rim darkens).
51
+ - **Pressed**: the tile's cream tints to `--ws-surface-press` at once.
52
+ - **Focus**: the 2 px navy ring, drawn inside a row tile so it never covers its neighbour.
53
+ - **Waiting**: a tile that waits on a step is not a link; its foot says the step in muted words.
54
+ - **Long title or line**: both wrap; nothing is cut off.
55
+ - **No icon**: the header's disc is left out; the title sits flush left.
56
+ - **Empty body**: a tile with nothing to show is not placed, the same rule as any card.
57
+ - **Narrow**: the bento goes one across; the tile row wraps, the last tile taking the whole line.
58
+ - **Dark**: the tray, the cream and the hover follow the theme.
44
59
 
45
60
  ## Behaviour
46
61
 
47
62
  - Keyboard: the tile's title is a real `h2`, naming the tile as a region (`aria-labelledby`) for a screen reader; no interaction of its own unless its body adds one.
48
- - Pointer and touch: the tile itself is not pressable; any pressable content lives inside its body.
49
- - Motion: the tile rises in on first paint (`ws-rise`, `--ws-duration-settle` on `--ws-ease-soft`), the same stagger pattern as a board's cards.
50
- - Reduced motion: it appears in place without rising.
63
+ - Pointer and touch: a bento tile is not pressable unless it is a link card; a row tile is the whole target.
64
+ - Motion: tiles settle in on first paint (`ws-settle`, 22 ms apart with `--ws-i`); hover is colour only, over
65
+ `--ws-duration-hover`.
66
+ - Reduced motion: everything appears in place.
51
67
 
52
68
  ## Content
53
69
 
@@ -69,9 +85,54 @@ The spans are the first product's twelve-column grid. On a page built on fello.c
69
85
 
70
86
  - The tile is the one `Card`: never a hand-drawn rectangle with its own border and radius.
71
87
  - One job per tile: a dashboard's bento never crowds two unrelated facts into one block to save space.
72
- - 16 px padding, 16 px between tiles, in line with the system's compact spacing rule.
88
+ - 16 px padding, 16 px between bento tiles; product tiles are joined on one tray, 2 px apart.
89
+ - A product tile never shows made-up numbers: it says what the app does and opens it, or names the step it waits on.
73
90
 
74
91
  ## Source
75
92
 
76
- **Derived from**: the system's one-card, one-job rule and its compact spacing (16px padding, 16px between tiles).
77
- **Precedent**: the first product built on the system.
93
+ **Derived from**: the system's one-card, one-job rule; Seth's tile figure (Inbox 313:2687: 32 / 38, the 8 px gap) and
94
+ the tray foot; issue #9 (Ignite AppIntro.tsx:91-150, Seth's first open 282:892) for the tile row. **Precedent**: the
95
+ first product built on the system.
96
+
97
+ ## Markup
98
+
99
+ ```html
100
+ <ul class="ws-tiles" aria-label="What Coach can do">
101
+ <li>
102
+ <a class="ws-tiles__tile" href="/coach/practice">
103
+ <span class="ws-tiles__surface">
104
+ <svg class="ws-tiles__icon" viewBox="0 0 24 24" fill="none" aria-hidden="true"><!-- a 24 px line icon --></svg>
105
+ <span class="ws-tiles__words">
106
+ <span class="ws-tiles__title">Practice a call</span>
107
+ <span class="ws-tiles__line">Role-play a seller who wants to wait.</span>
108
+ </span>
109
+ </span>
110
+ <span class="ws-card__foot ws-card__foot--door">
111
+ <span>Start practice</span>
112
+ <svg viewBox="0 0 16 16" fill="none" aria-hidden="true"><path d="M6.6 5.2L9.4 8l-2.8 2.8" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/></svg>
113
+ </span>
114
+ </a>
115
+ </li>
116
+ <li>
117
+ <div class="ws-tiles__tile">
118
+ <span class="ws-tiles__surface"><!-- icon, title, line --></span>
119
+ <span class="ws-card__foot ws-card__foot--waits"><span>After your first practice</span></span>
120
+ </div>
121
+ </li>
122
+ </ul>
123
+
124
+ <div class="ws-card ws-tile">
125
+ <header class="ws-tile__head">
126
+ <span class="ws-disc ws-tile__disc" aria-hidden="true"><svg viewBox="0 0 16 16" fill="none"><!-- icon --></svg></span>
127
+ <h2 class="ws-section">Calls</h2>
128
+ <span class="ws-muted">this week</span>
129
+ </header>
130
+ <div class="ws-tile__body"><p class="ws-tile__figure">26</p></div>
131
+ </div>
132
+ ```
133
+
134
+ ## Styles
135
+
136
+ `Tile/style.css` (the bento tile and the tile row); the foot is `Card`'s (`ws-card__foot`). Tokens: `--ws-tray`,
137
+ `--ws-rim`, `--space-3xs`, `--ws-radius-card`, `--ws-radius-card-inner`, `--ws-well-hover`, `--ws-surface-press`,
138
+ `--ws-text-figure`, `--ws-leading-figure`, `--ws-tracking-display`, `--ws-text-control`.
@@ -1,4 +1,4 @@
1
- <!-- @dsCard group="Layout" height=144 -->
1
+ <!-- @dsCard group="Layout" height=376 -->
2
2
  <!doctype html>
3
3
  <html>
4
4
  <head>
@@ -8,48 +8,99 @@
8
8
  <link rel="stylesheet" href="../bundle.css">
9
9
  </head>
10
10
  <body>
11
- <div class="ws-stage ws-stage--grey">
12
- <div style="display: grid; grid-template-columns: repeat(auto-fill, var(--space-9xl)); width: 100%; gap: var(--ws-gap-component);">
13
-
14
- <div class="ws-card ws-tile">
15
- <header class="ws-tile__head">
16
- <span class="ws-disc ws-tile__disc" aria-hidden="true">
17
- <svg viewBox="0 0 16 16" fill="none"><path d="M2 12l3-4 3 2 3-5 3 3" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/></svg>
18
- </span>
19
- <h2 class="ws-section">Calls</h2>
20
- <span class="ws-muted">this week</span>
21
- </header>
22
- <div class="ws-tile__body">
23
- <p class="ws-tile__figure">26</p>
24
- </div>
25
- </div>
26
-
27
- <div class="ws-card ws-tile">
28
- <header class="ws-tile__head">
29
- <span class="ws-disc ws-tile__disc" aria-hidden="true">
30
- <svg viewBox="0 0 16 16" fill="none"><circle cx="8" cy="8" r="5" stroke="currentColor" stroke-width="1.5"/><path d="M8 5v3l2 1.5" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"/></svg>
31
- </span>
32
- <h2 class="ws-section">On pace</h2>
33
- <span class="ws-muted">for October</span>
34
- </header>
35
- <div class="ws-tile__body">
36
- <p class="ws-tile__figure">65%</p>
37
- </div>
38
- </div>
39
-
40
- <div class="ws-card ws-tile">
41
- <header class="ws-tile__head">
42
- <span class="ws-disc ws-tile__disc" aria-hidden="true">
43
- <svg viewBox="0 0 16 16" fill="none"><circle cx="8" cy="5.5" r="2.5" stroke="currentColor" stroke-width="1.5"/><path d="M3 13c0-2.5 2.2-4 5-4s5 1.5 5 4" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"/></svg>
44
- </span>
45
- <h2 class="ws-section">Leads</h2>
46
- <span class="ws-muted">in pipeline</span>
47
- </header>
48
- <div class="ws-tile__body">
49
- <p class="ws-tile__figure">9</p>
11
+ <div class="ws-stage ws-stage--column">
12
+ <div class="ws-stack">
13
+ <span class="ws-muted">Bento tiles: an icon disc, a title and a note, one figure; a figure not there yet is muted</span>
14
+ <div class="ws-area">
15
+ <div class="ws-board--4" style="display: grid; gap: var(--ws-gap-component);">
16
+ <div class="ws-card ws-tile">
17
+ <header class="ws-tile__head">
18
+ <span class="ws-disc ws-tile__disc" aria-hidden="true">
19
+ <svg viewBox="0 0 16 16" fill="none"><path d="M2 12l3-4 3 2 3-5 3 3" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/></svg>
20
+ </span>
21
+ <h2 class="ws-section">Calls</h2>
22
+ <span class="ws-muted">this week</span>
23
+ </header>
24
+ <div class="ws-tile__body"><p class="ws-tile__figure">26</p></div>
25
+ </div>
26
+ <div class="ws-card ws-tile">
27
+ <header class="ws-tile__head">
28
+ <span class="ws-disc ws-tile__disc" aria-hidden="true">
29
+ <svg viewBox="0 0 16 16" fill="none"><circle cx="8" cy="8" r="5" stroke="currentColor" stroke-width="1.5"/><path d="M8 5v3l2 1.5" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"/></svg>
30
+ </span>
31
+ <h2 class="ws-section">On pace</h2>
32
+ <span class="ws-muted">for October</span>
33
+ </header>
34
+ <div class="ws-tile__body"><p class="ws-tile__figure">65%</p></div>
35
+ </div>
36
+ <div class="ws-card ws-tile">
37
+ <header class="ws-tile__head">
38
+ <span class="ws-disc ws-tile__disc" aria-hidden="true">
39
+ <svg viewBox="0 0 16 16" fill="none"><circle cx="8" cy="5.5" r="2.5" stroke="currentColor" stroke-width="1.5"/><path d="M3 13c0-2.5 2.2-4 5-4s5 1.5 5 4" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"/></svg>
40
+ </span>
41
+ <h2 class="ws-section">Leads in the pipeline</h2>
42
+ </header>
43
+ <div class="ws-tile__body"><p class="ws-tile__figure">9</p></div>
44
+ </div>
45
+ <div class="ws-card ws-tile">
46
+ <header class="ws-tile__head">
47
+ <span class="ws-disc ws-tile__disc" aria-hidden="true">
48
+ <svg viewBox="0 0 16 16" fill="none"><path d="M8 2l1.8 3.7 4 .6-2.9 2.8.7 4L8 11.2 4.4 13.1l.7-4L2.2 6.3l4-.6z" stroke="currentColor" stroke-width="1.5" stroke-linejoin="round"/></svg>
49
+ </span>
50
+ <h2 class="ws-section">Google reviews</h2>
51
+ </header>
52
+ <div class="ws-tile__body"><p class="ws-tile__figure ws-tile__figure--none">Not connected</p></div>
53
+ </div>
50
54
  </div>
51
55
  </div>
56
+ </div>
52
57
 
58
+ <div class="ws-stack" style="max-width: var(--ws-column-width);">
59
+ <span class="ws-muted">Product tile row (first open): each tile a door, or the step it waits on</span>
60
+ <ul class="ws-tiles" aria-label="What Coach can do">
61
+ <li>
62
+ <a class="ws-tiles__tile" href="#" onclick="return false;">
63
+ <span class="ws-tiles__surface">
64
+ <svg class="ws-tiles__icon" viewBox="0 0 24 24" fill="none" aria-hidden="true"><path d="M5 6.5h14a1.5 1.5 0 0 1 1.5 1.5v7a1.5 1.5 0 0 1-1.5 1.5h-8.5L7 19.5v-3H5A1.5 1.5 0 0 1 3.5 15V8A1.5 1.5 0 0 1 5 6.5z" stroke="currentColor" stroke-width="1.5" stroke-linejoin="round"/></svg>
65
+ <span class="ws-tiles__words">
66
+ <span class="ws-tiles__title">Practice a call</span>
67
+ <span class="ws-tiles__line">Role-play a seller who wants to wait.</span>
68
+ </span>
69
+ </span>
70
+ <span class="ws-card__foot ws-card__foot--door">
71
+ <span>Start practice</span>
72
+ <svg viewBox="0 0 16 16" fill="none" aria-hidden="true"><path d="M6.6 5.2L9.4 8l-2.8 2.8" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/></svg>
73
+ </span>
74
+ </a>
75
+ </li>
76
+ <li>
77
+ <a class="ws-tiles__tile" href="#" onclick="return false;">
78
+ <span class="ws-tiles__surface">
79
+ <svg class="ws-tiles__icon" viewBox="0 0 24 24" fill="none" aria-hidden="true"><path d="M4 18l4.5-5 3.5 3 6-7.5" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/><path d="M14 8.5h4v4" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/></svg>
80
+ <span class="ws-tiles__words">
81
+ <span class="ws-tiles__title">See your week</span>
82
+ <span class="ws-tiles__line">Calls, follow-ups and who is next, from your own log.</span>
83
+ </span>
84
+ </span>
85
+ <span class="ws-card__foot ws-card__foot--door">
86
+ <span>Open your week</span>
87
+ <svg viewBox="0 0 16 16" fill="none" aria-hidden="true"><path d="M6.6 5.2L9.4 8l-2.8 2.8" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/></svg>
88
+ </span>
89
+ </a>
90
+ </li>
91
+ <li>
92
+ <div class="ws-tiles__tile">
93
+ <span class="ws-tiles__surface">
94
+ <svg class="ws-tiles__icon" viewBox="0 0 24 24" fill="none" aria-hidden="true"><circle cx="12" cy="12" r="7.5" stroke="currentColor" stroke-width="1.5"/><path d="M12 8v4.5l3 1.8" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/></svg>
95
+ <span class="ws-tiles__words">
96
+ <span class="ws-tiles__title">Get scored on every call</span>
97
+ <span class="ws-tiles__line">What went well and the one thing to try next time.</span>
98
+ </span>
99
+ </span>
100
+ <span class="ws-card__foot ws-card__foot--waits"><span>After your first practice</span></span>
101
+ </div>
102
+ </li>
103
+ </ul>
53
104
  </div>
54
105
  </div>
55
106
  </body>