@felloinnovations/brand-kit 0.4.0 → 0.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (363) hide show
  1. package/AGENTS.md +198 -24
  2. package/CHANGELOG.md +221 -0
  3. package/README.md +38 -9
  4. package/design-system/01-how-claude-decides.md +26 -17
  5. package/design-system/02-principles.md +11 -6
  6. package/design-system/03-colour.md +135 -47
  7. package/design-system/04-type.md +45 -23
  8. package/design-system/05-space-and-layout.md +175 -52
  9. package/design-system/06-sizing-profiles.md +4 -4
  10. package/design-system/07-scrolling.md +66 -20
  11. package/design-system/08-choosing-components.md +50 -22
  12. package/design-system/09-charts.md +71 -28
  13. package/design-system/10-patterns.md +33 -10
  14. package/design-system/11-page-recipes.md +110 -23
  15. package/design-system/12-content.md +2 -1
  16. package/design-system/13-motion.md +330 -47
  17. package/design-system/14-accessibility.md +47 -24
  18. package/design-system/15-ai-experiences.md +11 -6
  19. package/design-system/16-creativity.md +1 -1
  20. package/design-system/17-decisions.md +367 -1
  21. package/design-system/18-checklist.md +79 -16
  22. package/design-system/19-public-pages.md +6 -4
  23. package/design-system/20-palettes.md +275 -0
  24. package/design-system/README.md +30 -17
  25. package/design-system/components/ActionList/README.md +96 -10
  26. package/design-system/components/ActionList/preview.html +52 -7
  27. package/design-system/components/ActionList/style.css +64 -0
  28. package/design-system/components/ActivityGrid/README.md +38 -2
  29. package/design-system/components/ActivityGrid/preview.html +1 -1
  30. package/design-system/components/ActivityGrid/style.css +35 -0
  31. package/design-system/components/AppShell/README.md +205 -75
  32. package/design-system/components/AppShell/preview.html +339 -58
  33. package/design-system/components/AppShell/style.css +154 -0
  34. package/design-system/components/Avatar/README.md +37 -10
  35. package/design-system/components/Avatar/preview.html +13 -4
  36. package/design-system/components/Avatar/style.css +14 -0
  37. package/design-system/components/Badge/README.md +41 -19
  38. package/design-system/components/Badge/preview.html +13 -10
  39. package/design-system/components/Badge/style.css +23 -0
  40. package/design-system/components/Banner/README.md +30 -9
  41. package/design-system/components/Banner/preview.html +1 -1
  42. package/design-system/components/Banner/style.css +19 -0
  43. package/design-system/components/Breadcrumb/README.md +58 -46
  44. package/design-system/components/Breadcrumb/preview.html +16 -16
  45. package/design-system/components/Breadcrumb/style.css +17 -0
  46. package/design-system/components/Button/README.md +113 -55
  47. package/design-system/components/Button/preview.html +98 -25
  48. package/design-system/components/Button/style.css +86 -0
  49. package/design-system/components/Card/README.md +158 -49
  50. package/design-system/components/Card/preview.html +141 -19
  51. package/design-system/components/Card/style.css +115 -0
  52. package/design-system/components/CardBoard/README.md +58 -37
  53. package/design-system/components/CardBoard/preview.html +26 -29
  54. package/design-system/components/ChatCard/README.md +115 -29
  55. package/design-system/components/ChatCard/preview.html +149 -32
  56. package/design-system/components/ChatCard/style.css +49 -0
  57. package/design-system/components/ChatShell/README.md +116 -0
  58. package/design-system/components/ChatShell/preview.html +201 -0
  59. package/design-system/components/ChatShell/style.css +86 -0
  60. package/design-system/components/ChatTurn/README.md +78 -35
  61. package/design-system/components/ChatTurn/preview.html +60 -28
  62. package/design-system/components/ChatTurn/style.css +50 -0
  63. package/design-system/components/CheckRow/README.md +141 -0
  64. package/design-system/components/CheckRow/preview.html +140 -0
  65. package/design-system/components/CheckRow/style.css +88 -0
  66. package/design-system/components/Checkbox/README.md +58 -22
  67. package/design-system/components/Checkbox/preview.html +112 -50
  68. package/design-system/components/Checkbox/style.css +45 -0
  69. package/design-system/components/Chip/README.md +78 -47
  70. package/design-system/components/Chip/preview.html +29 -4
  71. package/design-system/components/Chip/style.css +17 -0
  72. package/design-system/components/Combobox/README.md +44 -11
  73. package/design-system/components/Combobox/preview.html +35 -12
  74. package/design-system/components/Combobox/style.css +54 -0
  75. package/design-system/components/Composer/README.md +137 -35
  76. package/design-system/components/Composer/preview.html +115 -40
  77. package/design-system/components/Composer/style.css +81 -0
  78. package/design-system/components/ConfirmDialog/README.md +73 -52
  79. package/design-system/components/ConfirmDialog/preview.html +70 -26
  80. package/design-system/components/ConfirmDialog/style.css +5 -0
  81. package/design-system/components/Cover/preview.html +3 -3
  82. package/design-system/components/Cover/style.css +19 -0
  83. package/design-system/components/DateInput/README.md +77 -12
  84. package/design-system/components/DateInput/preview.html +27 -12
  85. package/design-system/components/DateInput/style.css +38 -0
  86. package/design-system/components/Dialog/README.md +112 -44
  87. package/design-system/components/Dialog/preview.html +141 -18
  88. package/design-system/components/Dialog/style.css +74 -0
  89. package/design-system/components/EmptyState/README.md +42 -12
  90. package/design-system/components/EmptyState/preview.html +11 -11
  91. package/design-system/components/EmptyState/style.css +9 -0
  92. package/design-system/components/EntryShell/README.md +73 -48
  93. package/design-system/components/EntryShell/preview.html +60 -27
  94. package/design-system/components/EntryShell/style.css +19 -0
  95. package/design-system/components/FeatureGrid/README.md +61 -39
  96. package/design-system/components/FeatureGrid/preview.html +2 -2
  97. package/design-system/components/FeatureGrid/style.css +20 -0
  98. package/design-system/components/FileUpload/README.md +33 -3
  99. package/design-system/components/FileUpload/preview.html +18 -4
  100. package/design-system/components/FileUpload/style.css +23 -0
  101. package/design-system/components/FilterBar/README.md +114 -0
  102. package/design-system/components/FilterBar/preview.html +82 -0
  103. package/design-system/components/FilterBar/style.css +22 -0
  104. package/design-system/components/Fold/README.md +84 -26
  105. package/design-system/components/Fold/preview.html +77 -34
  106. package/design-system/components/Fold/style.css +48 -0
  107. package/design-system/components/Footer/README.md +62 -39
  108. package/design-system/components/Footer/preview.html +5 -5
  109. package/design-system/components/Footer/style.css +30 -0
  110. package/design-system/components/FunnelBars/README.md +24 -3
  111. package/design-system/components/FunnelBars/preview.html +5 -5
  112. package/design-system/components/FunnelBars/style.css +13 -0
  113. package/design-system/components/GoalBars/README.md +54 -10
  114. package/design-system/components/GoalBars/preview.html +69 -28
  115. package/design-system/components/GoalBars/style.css +51 -0
  116. package/design-system/components/GoalTicks/README.md +74 -58
  117. package/design-system/components/GoalTicks/preview.html +41 -118
  118. package/design-system/components/GoalTicks/style.css +37 -0
  119. package/design-system/components/GoalTubes/README.md +29 -3
  120. package/design-system/components/GoalTubes/preview.html +6 -6
  121. package/design-system/components/GoalTubes/style.css +23 -0
  122. package/design-system/components/Heatmap/README.md +133 -0
  123. package/design-system/components/Heatmap/preview.html +168 -0
  124. package/design-system/components/Heatmap/style.css +119 -0
  125. package/design-system/components/Hero/README.md +58 -40
  126. package/design-system/components/Hero/preview.html +1 -1
  127. package/design-system/components/Hero/style.css +19 -0
  128. package/design-system/components/HoverCard/README.md +114 -0
  129. package/design-system/components/HoverCard/preview.html +107 -0
  130. package/design-system/components/HoverCard/style.css +59 -0
  131. package/design-system/components/IconButton/README.md +69 -38
  132. package/design-system/components/IconButton/preview.html +77 -43
  133. package/design-system/components/IconButton/style.css +45 -0
  134. package/design-system/components/Input/README.md +36 -11
  135. package/design-system/components/Input/preview.html +1 -1
  136. package/design-system/components/Input/style.css +23 -0
  137. package/design-system/components/KanbanBoard/README.md +93 -45
  138. package/design-system/components/KanbanBoard/preview.html +159 -43
  139. package/design-system/components/KanbanBoard/style.css +53 -0
  140. package/design-system/components/Kbd/README.md +25 -9
  141. package/design-system/components/Kbd/preview.html +6 -2
  142. package/design-system/components/Kbd/style.css +9 -0
  143. package/design-system/components/KitButton/README.md +81 -47
  144. package/design-system/components/KitButton/preview.html +35 -13
  145. package/design-system/components/KitButton/style.css +46 -0
  146. package/design-system/components/KitCard/README.md +75 -44
  147. package/design-system/components/KitCard/preview.html +18 -10
  148. package/design-system/components/KitCard/style.css +15 -0
  149. package/design-system/components/KitInput/README.md +54 -39
  150. package/design-system/components/KitInput/preview.html +7 -7
  151. package/design-system/components/KitInput/style.css +23 -0
  152. package/design-system/components/Leaderboard/README.md +76 -49
  153. package/design-system/components/Leaderboard/preview.html +61 -26
  154. package/design-system/components/Leaderboard/style.css +44 -0
  155. package/design-system/components/ListDetail/README.md +222 -0
  156. package/design-system/components/ListDetail/preview.html +213 -0
  157. package/design-system/components/ListDetail/style.css +148 -0
  158. package/design-system/components/LoadBar/README.md +79 -0
  159. package/design-system/components/LoadBar/preview.html +40 -0
  160. package/design-system/components/LoadBar/style.css +17 -0
  161. package/design-system/components/MarketingNav/README.md +76 -42
  162. package/design-system/components/MarketingNav/preview.html +37 -8
  163. package/design-system/components/MarketingNav/style.css +45 -0
  164. package/design-system/components/Matrix/README.md +129 -0
  165. package/design-system/components/Matrix/preview.html +99 -0
  166. package/design-system/components/Matrix/style.css +84 -0
  167. package/design-system/components/Menu/README.md +117 -41
  168. package/design-system/components/Menu/preview.html +85 -23
  169. package/design-system/components/Menu/style.css +61 -0
  170. package/design-system/components/Meter/README.md +39 -4
  171. package/design-system/components/Meter/preview.html +18 -1
  172. package/design-system/components/Meter/style.css +23 -0
  173. package/design-system/components/MetricTile/README.md +237 -0
  174. package/design-system/components/MetricTile/preview.html +241 -0
  175. package/design-system/components/MetricTile/style.css +129 -0
  176. package/design-system/components/Morph/README.md +106 -0
  177. package/design-system/components/Morph/preview.html +103 -0
  178. package/design-system/components/Morph/style.css +31 -0
  179. package/design-system/components/Motion/README.md +164 -0
  180. package/design-system/components/Motion/preview.html +2537 -0
  181. package/design-system/components/NumberInput/README.md +27 -8
  182. package/design-system/components/NumberInput/preview.html +21 -5
  183. package/design-system/components/NumberInput/style.css +34 -0
  184. package/design-system/components/PaceBar/README.md +75 -0
  185. package/design-system/components/PaceBar/preview.html +67 -0
  186. package/design-system/components/PaceBar/style.css +25 -0
  187. package/design-system/components/Page/README.md +57 -18
  188. package/design-system/components/Page/preview.html +15 -17
  189. package/design-system/components/Page/style.css +7 -0
  190. package/design-system/components/PageBar/README.md +90 -34
  191. package/design-system/components/PageBar/preview.html +60 -19
  192. package/design-system/components/PageBar/style.css +35 -0
  193. package/design-system/components/PageHero/README.md +87 -51
  194. package/design-system/components/PageHero/preview.html +35 -6
  195. package/design-system/components/PageHero/style.css +31 -0
  196. package/design-system/components/Pagination/README.md +70 -49
  197. package/design-system/components/Pagination/preview.html +24 -15
  198. package/design-system/components/Pagination/style.css +12 -0
  199. package/design-system/components/Panel/README.md +109 -51
  200. package/design-system/components/Panel/preview.html +118 -20
  201. package/design-system/components/Panel/style.css +51 -0
  202. package/design-system/components/PasswordInput/README.md +50 -18
  203. package/design-system/components/PasswordInput/preview.html +71 -21
  204. package/design-system/components/PasswordInput/style.css +31 -0
  205. package/design-system/components/Plate/README.md +75 -17
  206. package/design-system/components/Plate/preview.html +40 -7
  207. package/design-system/components/Plate/style.css +37 -0
  208. package/design-system/components/Popover/README.md +70 -49
  209. package/design-system/components/Popover/preview.html +44 -22
  210. package/design-system/components/Popover/style.css +41 -0
  211. package/design-system/components/PricingTable/README.md +69 -49
  212. package/design-system/components/PricingTable/preview.html +21 -21
  213. package/design-system/components/PricingTable/style.css +21 -0
  214. package/design-system/components/ProgressPetals/README.md +31 -3
  215. package/design-system/components/ProgressPetals/preview.html +14 -15
  216. package/design-system/components/ProgressPetals/style.css +27 -0
  217. package/design-system/components/README.md +151 -0
  218. package/design-system/components/Radio/README.md +40 -17
  219. package/design-system/components/Radio/preview.html +16 -1
  220. package/design-system/components/Radio/style.css +21 -0
  221. package/design-system/components/RankBar/README.md +29 -2
  222. package/design-system/components/RankBar/preview.html +14 -12
  223. package/design-system/components/RankBar/style.css +18 -0
  224. package/design-system/components/Ring/README.md +61 -11
  225. package/design-system/components/Ring/preview.html +55 -10
  226. package/design-system/components/Ring/style.css +49 -0
  227. package/design-system/components/ScoreHero/README.md +91 -0
  228. package/design-system/components/ScoreHero/preview.html +104 -0
  229. package/design-system/components/ScoreHero/style.css +32 -0
  230. package/design-system/components/Section/README.md +72 -33
  231. package/design-system/components/Section/preview.html +46 -16
  232. package/design-system/components/Section/style.css +18 -0
  233. package/design-system/components/Segmented/README.md +100 -55
  234. package/design-system/components/Segmented/preview.html +107 -26
  235. package/design-system/components/Segmented/style.css +94 -0
  236. package/design-system/components/SegmentedProgress/README.md +64 -0
  237. package/design-system/components/SegmentedProgress/preview.html +69 -0
  238. package/design-system/components/SegmentedProgress/style.css +11 -0
  239. package/design-system/components/Select/README.md +47 -12
  240. package/design-system/components/Select/preview.html +28 -2
  241. package/design-system/components/Select/style.css +22 -0
  242. package/design-system/components/ShareBar/README.md +69 -0
  243. package/design-system/components/ShareBar/preview.html +72 -0
  244. package/design-system/components/ShareBar/style.css +25 -0
  245. package/design-system/components/SideList/README.md +147 -0
  246. package/design-system/components/SideList/preview.html +139 -0
  247. package/design-system/components/SideList/style.css +94 -0
  248. package/design-system/components/Skeleton/README.md +53 -16
  249. package/design-system/components/Skeleton/preview.html +35 -23
  250. package/design-system/components/Skeleton/style.css +17 -0
  251. package/design-system/components/Slider/README.md +95 -0
  252. package/design-system/components/Slider/preview.html +49 -0
  253. package/design-system/components/Slider/style.css +13 -0
  254. package/design-system/components/Split/README.md +112 -0
  255. package/design-system/components/Split/preview.html +105 -0
  256. package/design-system/components/Split/style.css +30 -0
  257. package/design-system/components/Starter/README.md +21 -9
  258. package/design-system/components/Starter/preview.html +5 -5
  259. package/design-system/components/Stat/README.md +64 -43
  260. package/design-system/components/Stat/preview.html +3 -3
  261. package/design-system/components/Stat/style.css +15 -0
  262. package/design-system/components/StatTiles/README.md +88 -44
  263. package/design-system/components/StatTiles/preview.html +142 -71
  264. package/design-system/components/StatTiles/style.css +64 -0
  265. package/design-system/components/StatusLine/README.md +85 -0
  266. package/design-system/components/StatusLine/preview.html +49 -0
  267. package/design-system/components/StatusLine/style.css +14 -0
  268. package/design-system/components/StatusScreen/README.md +49 -35
  269. package/design-system/components/StatusScreen/preview.html +20 -5
  270. package/design-system/components/StatusScreen/style.css +9 -0
  271. package/design-system/components/StepLine/README.md +97 -0
  272. package/design-system/components/StepLine/preview.html +108 -0
  273. package/design-system/components/StepLine/style.css +62 -0
  274. package/design-system/components/Stepper/README.md +35 -13
  275. package/design-system/components/Stepper/style.css +13 -0
  276. package/design-system/components/StreakCalendar/README.md +22 -1
  277. package/design-system/components/StreakCalendar/preview.html +10 -10
  278. package/design-system/components/StreakCalendar/style.css +12 -0
  279. package/design-system/components/SuggestionChip/README.md +87 -0
  280. package/design-system/components/SuggestionChip/preview.html +42 -0
  281. package/design-system/components/SuggestionChip/style.css +20 -0
  282. package/design-system/components/Switch/README.md +44 -24
  283. package/design-system/components/Switch/preview.html +23 -8
  284. package/design-system/components/Switch/style.css +31 -0
  285. package/design-system/components/Table/README.md +129 -58
  286. package/design-system/components/Table/preview.html +106 -72
  287. package/design-system/components/Table/style.css +104 -0
  288. package/design-system/components/Tabs/README.md +71 -46
  289. package/design-system/components/Tabs/preview.html +56 -24
  290. package/design-system/components/Tabs/style.css +44 -0
  291. package/design-system/components/Testimonial/README.md +48 -32
  292. package/design-system/components/Testimonial/preview.html +14 -14
  293. package/design-system/components/Testimonial/style.css +12 -0
  294. package/design-system/components/TextArea/README.md +27 -11
  295. package/design-system/components/TextArea/preview.html +8 -2
  296. package/design-system/components/TextArea/style.css +12 -0
  297. package/design-system/components/ThemeSwitch/README.md +116 -0
  298. package/design-system/components/ThemeSwitch/preview.html +57 -0
  299. package/design-system/components/ThemeSwitch/style.css +6 -0
  300. package/design-system/components/TickRow/README.md +52 -36
  301. package/design-system/components/TickRow/preview.html +64 -41
  302. package/design-system/components/TickRow/style.css +23 -0
  303. package/design-system/components/TickStrip/README.md +95 -0
  304. package/design-system/components/TickStrip/preview.html +88 -0
  305. package/design-system/components/TickStrip/style.css +42 -0
  306. package/design-system/components/Tile/README.md +79 -18
  307. package/design-system/components/Tile/preview.html +91 -40
  308. package/design-system/components/Tile/style.css +36 -0
  309. package/design-system/components/Timeline/README.md +68 -48
  310. package/design-system/components/Timeline/preview.html +27 -15
  311. package/design-system/components/Timeline/style.css +25 -0
  312. package/design-system/components/Toast/README.md +70 -38
  313. package/design-system/components/Toast/preview.html +43 -8
  314. package/design-system/components/Toast/style.css +25 -0
  315. package/design-system/components/Tooltip/README.md +93 -35
  316. package/design-system/components/Tooltip/preview.html +69 -15
  317. package/design-system/components/Tooltip/style.css +78 -0
  318. package/design-system/components/TopBar/README.md +67 -53
  319. package/design-system/components/TopBar/preview.html +14 -27
  320. package/design-system/components/TopBar/style.css +35 -0
  321. package/design-system/components/TopicRail/README.md +108 -0
  322. package/design-system/components/TopicRail/preview.html +58 -0
  323. package/design-system/components/TopicRail/style.css +48 -0
  324. package/design-system/components/TrendBars/README.md +52 -14
  325. package/design-system/components/TrendBars/preview.html +65 -32
  326. package/design-system/components/TrendBars/style.css +25 -0
  327. package/design-system/components/TrendLine/README.md +164 -0
  328. package/design-system/components/TrendLine/preview.html +373 -0
  329. package/design-system/components/TrendLine/style.css +155 -0
  330. package/design-system/components/Well/README.md +64 -22
  331. package/design-system/components/Well/preview.html +14 -14
  332. package/design-system/components/Well/style.css +22 -0
  333. package/design-system/components/_house.css +324 -0
  334. package/design-system/components/bundle.css +4086 -744
  335. package/design-system/tokens.json +1310 -124
  336. package/dist/fello-core.css +2 -2
  337. package/dist/fello.css +6 -1369
  338. package/dist/fello.scoped.css +7 -0
  339. package/dist/index.d.ts +109 -10
  340. package/dist/index.js +781 -96
  341. package/dist/palettes.d.ts +464 -0
  342. package/dist/palettes.js +497 -0
  343. package/dist/scoped.d.ts +3 -0
  344. package/dist/scoped.js +16 -0
  345. package/dist/toast.d.ts +14 -0
  346. package/dist/toast.js +33 -29
  347. package/dist/tokens.d.ts +1686 -62
  348. package/dist/tokens.js +1668 -61
  349. package/package.json +20 -4
  350. package/scripts/check-palette.mjs +295 -0
  351. package/scripts/token-model.mjs +552 -0
  352. package/tokens/_dark.css +173 -0
  353. package/tokens/_palettes.css +46 -0
  354. package/tokens/_product.css +266 -53
  355. package/tokens/_source.hubl.css +39 -19
  356. package/tokens/design-tokens.json +319 -0
  357. package/tokens/palettes.ts +504 -0
  358. package/tokens/shadcn-compat.css +19 -19
  359. package/tokens/shadcn-compat.hsl.css +76 -0
  360. package/tokens/tokens.css +1287 -62
  361. package/tokens/tokens.md +587 -61
  362. package/tokens/tokens.root.css +1293 -62
  363. package/tokens/tokens.ts +1677 -64
@@ -1,85 +1,106 @@
1
- The foot of a card that holds more rows than it shows at once: where you are in the list, and the two acts that move
1
+ The foot of a card that holds more rows than it shows at once: where you are in the list, and the acts that move
2
2
  through it.
3
3
 
4
4
  ## Use it when
5
5
 
6
- - A `Table` or a long list of rows is too big to show whole and is paged rather than infinitely scrolled.
7
- - The person benefits from knowing exactly how many rows there are and where this page sits in them.
6
+ - A `Table` or a long list of rows is too big to show whole and is paged rather than scrolled.
7
+ - The person benefits from knowing how many rows there are and where this page sits in them.
8
8
 
9
9
  ## Not for
10
10
 
11
- - A short list that fits without paging: no pagination appears at all.
12
- - An infinite or "load more" list: that is a different pattern (a `Button` at the foot, "Show 25 more"), not this piece.
13
- - The page itself: pagination belongs in a card's foot, never floating on the page or in the header band (which holds
14
- the card's one primary act instead).
11
+ - A short list that fits: no pagination at all.
12
+ - A "load more" list: a `Button` at the foot ("Show 25 more").
13
+ - The page itself: pagination is a card's foot, never floating on the page.
15
14
 
16
15
  ## Anatomy
17
16
 
18
- - Sits in a card's foot: a hairline (`--ws-edge-card`) above it, the same padding as the card's own sides.
19
- - Left: a 13 px meta line (`--ws-text-meta`, `--color-text-muted`) stating the range and the total, "1 to 25 of 212".
20
- - Right: two 32 px ghost icon buttons (`IconButton`, `--ws-control-h`) for the previous and next chevrons, and a small
21
- `Select` for rows per page (25, 50, 100).
22
- - The row sits below the card's content, never inside the band (the band is reserved for the card's one act).
17
+ - A card's foot (`.ws-pagination`): Seth's 0.5 px divider above it (`--ws-divider`), 8 above and below, the card's
18
+ 20 px content edge at the sides (`--ws-card-inset`), its two halves 12 apart.
19
+ - Left: the range and the total (`__range`), 13 / 16 in muted, tabular figures, one line ("1 to 25 of 212").
20
+ - Right (`__end`), 12 apart:
21
+ - Rows per page (`__rows`): "Rows" in `ws-muted`, 8, then `Select`'s small one (`ws-select ws-select--sm` in its
22
+ `ws-select-wrap` with the 12 px navy chevron): 28 tall, 12 / 16 medium figures; on touch 40 tall with 16 px figures,
23
+ so a phone never zooms into it on focus. A bare `<select>` (0.4 markup) still draws, with the OS caret.
24
+ - The chevrons (`__nav`), 4 apart: two 32 px ghost `IconButton`s (40 on touch).
25
+ - On a narrow card the right half wraps under the range, at the right.
23
26
 
24
27
  ## Variants and sizes
25
28
 
26
29
  | Part | Size | Token |
27
30
  | --- | --- | --- |
28
- | Chevron buttons | 32 px, ghost | `IconButton` default |
29
- | Rows-per-page select | small | `--ws-control-h-sm` (28 px) |
30
- | Meta line | 13 px | `--ws-text-meta` |
31
+ | Chevron buttons | 32 (40 on touch), ghost | `IconButton` default |
32
+ | Rows-per-page select | 28 (40 on touch) | `Select` `--sm` |
33
+ | Range line | 13 px | `--ws-text-meta` |
31
34
 
32
35
  ## States
33
36
 
34
- - **First page**: the previous chevron is `disabled` (40% opacity, no pointer events), the next chevron active.
35
- - **Middle page**: both chevrons active.
36
- - **Last page**: the next chevron `disabled`, the previous chevron active.
37
- - **Only one page**: the whole pagination row does not render; a single-page list needs no foot at all.
38
- - **Loading the next page**: the chevron just pressed shows the button's own pending state (the working dot) rather
39
- than a separate spinner; a second press is refused while it runs (`aria-busy`).
40
- - **Focus**: the kit's `--shadow-focus-ring` on each chevron and the select.
37
+ - **First page**: Previous `disabled`, Next active.
38
+ - **Middle page**: both active.
39
+ - **Last page**: Next `disabled`.
40
+ - **Only one page**: the foot is not drawn.
41
+ - **Loading the next page**: the pressed chevron shows the button's pending state; a second press waits
42
+ (`aria-busy`).
43
+ - **Narrow**: the right half goes under the range.
44
+ - **Hover** (pointers that hover): the chevrons take `IconButton`'s wash; the select's edge darkens (`Select`).
45
+ - **Focus**: the house's 2 px navy ring on each chevron and the select.
41
46
 
42
47
  ## Behaviour
43
48
 
44
- - Keyboard: both chevrons are real `<button>`s, reachable by Tab, activated by Enter or Space; the select is a native
45
- `<select>`.
46
- - Pointer: a chevron press moves one page; the rows select changes the page size and returns to page 1.
47
- - Touch: both icon buttons meet the 40 px floor on a coarse pointer, same as any `IconButton`.
48
- - Motion: rows cross-fade rather than re-stagger when the page changes, matching the system's rule for search results
49
- replacing a list (`10-patterns.md`, "Search, filters and sorting").
49
+ - Keyboard: the chevrons are real `<button>`s; the select is a native `<select>`.
50
+ - Pointer: a chevron moves one page; the rows select changes the page size and returns to page 1.
51
+ - Motion: rows cross-fade when the page changes, never re-stagger.
50
52
 
51
53
  ## Content
52
54
 
53
- - The meta line always states both the visible range and the total: "1 to 25 of 212", never a bare page number like
54
- "Page 1 of 9" alone, so a person always sees the scale of the whole list.
55
- - No em dashes; "to" joins the range, not a dash.
55
+ - The range always states the visible rows and the total ("1 to 25 of 212"), never "Page 1 of 9" alone.
56
+ - "to" joins the range; no dashes.
56
57
 
57
58
  ## Props
58
59
 
59
60
  | Name | Type | Meaning |
60
61
  | --- | --- | --- |
61
- | `page` | `number` | The current page, 1-based |
62
+ | `page` | `number` | The current page, from 1 |
62
63
  | `pageSize` | `number` | Rows per page |
63
- | `total` | `number` | Total rows across every page |
64
- | `pageSizeOptions` | `number[]` | Choices for the rows select, default `[25, 50, 100]` |
65
- | `onPageChange` | `(page: number) => void` | Called on a chevron press |
66
- | `onPageSizeChange` | `(size: number) => void` | Called when the rows select changes |
64
+ | `total` | `number` | Rows across every page |
65
+ | `pageSizeOptions` | `number[]` | The rows select's choices, default `[25, 50, 100]` |
66
+ | `onPageChange` | `(page: number) => void` | A chevron press |
67
+ | `onPageSizeChange` | `(size: number) => void` | The rows select changed |
67
68
 
68
69
  ## Rules
69
70
 
70
- - **Lives in a card's foot, never the band**: the band is the card's one primary act; pagination is
71
- a second, quieter kind of foot content, so it sits in a plain footer of its own below the band or in place of it when
72
- the card has no primary act.
73
- - **Ghost, not boxed, chevrons**: matching the row-act convention (`Button` secondary or ghost, small, for a row's quiet
74
- acts), since paging is a frequent, low-weight act, not the page's one thing to do.
75
- - **The total is always shown**, honouring the system's "honest data" principle: a person is never left guessing how
76
- much more there is.
77
- - **A page-at-a-time control for long collections**: a lead list, a report of calls, needs paging that a chat-first
78
- card never required. Derived from the card's foot pattern, the meta text size, and `IconButton`'s ghost default.
71
+ - **A card's foot, never its band**: the band holds the card's one act.
72
+ - **Ghost chevrons**: paging is frequent and quiet.
73
+ - **The total is always shown**.
79
74
 
80
75
  ## Source
81
76
 
82
- - **Derived from**: the card foot pattern (the card band's foot placement, `ws-band`, restyled as a plain hairline-topped strip
83
- rather than the tinted band), `--ws-text-meta` for the range line, and `Select`'s small size for rows per page.
84
- - **Precedent**: an intentional addition decided from the system, 26 Oct 2026, since no screen in the first product
85
- built on the system paginates a list (its lists are short enough for one card, or scroll inside it).
77
+ **Derived from**: the card foot pattern, Seth's 0.5 px divider (D5), `--ws-text-meta` and `Select`'s small size, and
78
+ the geometry check (4 Nov 2026: at 320 the right half ran past the card; the select was 28 tall on touch).
79
+ **Precedent**: an intentional addition decided from the system, 26 Oct 2026.
80
+
81
+ ## Markup
82
+
83
+ ```html
84
+ <footer class="ws-pagination">
85
+ <span class="ws-pagination__range">1 to 25 of 212</span>
86
+ <div class="ws-pagination__end">
87
+ <div class="ws-pagination__rows">
88
+ <span class="ws-muted">Rows</span>
89
+ <span class="ws-select-wrap">
90
+ <select class="ws-select ws-select--sm" aria-label="Rows per page"><option>25</option><option>50</option><option>100</option></select>
91
+ <svg viewBox="0 0 12 12" fill="none" stroke="currentColor" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M3 4.5l3 3 3-3"/></svg>
92
+ </span>
93
+ </div>
94
+ <div class="ws-pagination__nav">
95
+ <button type="button" class="ws-icon-btn" disabled aria-label="Previous page"><!-- 16 px chevron --></button>
96
+ <button type="button" class="ws-icon-btn" aria-label="Next page"><!-- 16 px chevron --></button>
97
+ </div>
98
+ </div>
99
+ </footer>
100
+ ```
101
+
102
+ ## Styles
103
+
104
+ `Pagination/style.css`; the chevrons are `IconButton`'s, the rows select is `Select`'s. Tokens: `--ws-divider`, `--ws-card-inset`,
105
+ `--ws-text-meta`, `--ws-text-dense`, `--ws-control-h-sm`, `--ws-radius-control`, `--ws-field`, `--ws-field-ink`,
106
+ `--ws-edge-card`, `--ws-hairline`, `--color-text-muted`.
@@ -1,4 +1,4 @@
1
- <!-- @dsCard group="Navigation" height=503 -->
1
+ <!-- @dsCard group="Navigation" height=463 -->
2
2
  <!doctype html>
3
3
  <html>
4
4
  <head>
@@ -19,11 +19,14 @@
19
19
  <div class="ws-pagination__end">
20
20
  <div class="ws-pagination__rows">
21
21
  <span class="ws-muted">Rows</span>
22
- <select aria-label="Rows per page">
23
- <option>25</option>
24
- <option>50</option>
25
- <option>100</option>
26
- </select>
22
+ <span class="ws-select-wrap">
23
+ <select class="ws-select ws-select--sm" aria-label="Rows per page">
24
+ <option>25</option>
25
+ <option>50</option>
26
+ <option>100</option>
27
+ </select>
28
+ <svg viewBox="0 0 12 12" fill="none" stroke="currentColor" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M3 4.5l3 3 3-3"/></svg>
29
+ </span>
27
30
  </div>
28
31
  <div class="ws-pagination__nav">
29
32
  <button type="button" class="ws-icon-btn" disabled aria-label="Previous page">
@@ -47,11 +50,14 @@
47
50
  <div class="ws-pagination__end">
48
51
  <div class="ws-pagination__rows">
49
52
  <span class="ws-muted">Rows</span>
50
- <select aria-label="Rows per page">
51
- <option selected>25</option>
52
- <option>50</option>
53
- <option>100</option>
54
- </select>
53
+ <span class="ws-select-wrap">
54
+ <select class="ws-select ws-select--sm" aria-label="Rows per page">
55
+ <option selected>25</option>
56
+ <option>50</option>
57
+ <option>100</option>
58
+ </select>
59
+ <svg viewBox="0 0 12 12" fill="none" stroke="currentColor" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M3 4.5l3 3 3-3"/></svg>
60
+ </span>
55
61
  </div>
56
62
  <div class="ws-pagination__nav">
57
63
  <button type="button" class="ws-icon-btn" aria-label="Previous page">
@@ -75,10 +81,13 @@
75
81
  <div class="ws-pagination__end">
76
82
  <div class="ws-pagination__rows">
77
83
  <span class="ws-muted">Rows</span>
78
- <select aria-label="Rows per page">
79
- <option>25</option>
80
- <option selected>100</option>
81
- </select>
84
+ <span class="ws-select-wrap">
85
+ <select class="ws-select ws-select--sm" aria-label="Rows per page">
86
+ <option>25</option>
87
+ <option selected>100</option>
88
+ </select>
89
+ <svg viewBox="0 0 12 12" fill="none" stroke="currentColor" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M3 4.5l3 3 3-3"/></svg>
90
+ </span>
82
91
  </div>
83
92
  <div class="ws-pagination__nav">
84
93
  <button type="button" class="ws-icon-btn" aria-label="Previous page">
@@ -0,0 +1,12 @@
1
+ /* ---- Pagination: a card's foot for a long list, the range at the left, rows per page and the chevrons at the right, on
2
+ the card's 20 edge under Seth's 0.5 px divider. On a narrow card the right half wraps under the range. ---- */
3
+ .ws-pagination { display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: var(--space-xs) var(--space-sm); padding: var(--space-xs) var(--ws-card-inset); border-top: var(--ws-divider); }
4
+ .ws-pagination__range { font-size: var(--ws-text-meta); line-height: var(--space-md); color: var(--color-text-muted); font-variant-numeric: tabular-nums; white-space: nowrap; }
5
+ .ws-pagination__end { display: flex; align-items: center; gap: var(--space-sm); margin-inline-start: auto; }
6
+ .ws-pagination__nav { display: flex; align-items: center; gap: var(--space-xxs); }
7
+ .ws-pagination__rows { display: flex; align-items: center; gap: var(--space-xs); }
8
+ /* The rows select is Select's small one (ws-select ws-select--sm in its wrap). A bare <select> (0.4 markup) keeps its old
9
+ look, and on touch its words go to 16 so a phone does not zoom into it on focus. */
10
+ .ws-pagination__rows .ws-select { font-variant-numeric: tabular-nums; }
11
+ .ws-pagination__rows select:not(.ws-select) { height: var(--ws-control-h-sm); padding: 0 var(--space-xxs); border: 0; border-radius: var(--ws-radius-control); background: var(--ws-field); box-shadow: inset 0 0 0 var(--ws-hairline) var(--ws-edge-card); color: var(--ws-field-ink); font-size: var(--ws-text-dense); font-variant-numeric: tabular-nums; cursor: pointer; }
12
+ @media (pointer: coarse) { .ws-pagination__rows select:not(.ws-select) { font-size: var(--ws-text-value); } }
@@ -1,90 +1,148 @@
1
- The thing opened beside the chat: one panel, holding one thing at a time, docked to the canvas's edge.
1
+ The thing opened beside the page or the chat: one pane, holding one thing at a time, as Seth draws the check drawer.
2
2
 
3
3
  ## Use it when
4
4
 
5
- - The person opens a specific thing from the chat (a lead, a draft, an issue, a chart) and should keep the chat or the page beside it.
6
- - A page's own side detail (an area, an issue) needs to sit beside the list without covering it, on a wide enough screen.
7
- - The content is one thing's full detail, not a set of unrelated choices (which would be a `Menu`) or a short modal task (which would be a `Dialog`).
5
+ - The person opens one thing (a check, a lead, a draft, a chart) and should keep the page or the chat beside it.
6
+ - A list's row opens its detail beside the list, on a wide enough screen.
7
+ - The content is one thing's full detail, not a set of choices (`Menu`) or a short blocking task (`Dialog`).
8
8
 
9
9
  ## Not for
10
10
 
11
- - A task that should block the rest of the screen until it is done: use `Dialog`.
11
+ - A task that must block the rest of the screen until it is done: use `Dialog`.
12
12
  - A list of short actions near a button: use `Menu`.
13
- - A page shown full screen in place of the chat: that is an app page, not a panel.
14
- - Repeating something the chat or the page already shows: a panel never duplicates a fact already on screen (the system's rule).
13
+ - A page shown full screen in place of the chat: that is an app page.
14
+ - Repeating something already on screen: a panel never says again what the page or the chat shows.
15
15
 
16
16
  ## Anatomy
17
17
 
18
- - Docks beside the canvas from a wide enough area (so nothing is covered); below that width it slides in over the page instead, full height (full width on a phone).
19
- - Width: `--ws-thing-width` (440 px), at most half the stage; resizable by drag or by keyboard on the handle, remembered per browser.
20
- - A header line across its top: the thing's kind on the left (an eyebrow, such as "Lead"), its own small actions and "Close" (never a close icon, always the word) on the right.
21
- - Its content below, scrolling on its own when it is tall.
22
- - Round only where it floats: flush to a phone's edge it rounds just its left side; docked on a wide screen it is a rounded surface with the hairline edge and a small gap from the frame's edges.
18
+ - The pane: 440 wide (`--ws-thing-width`), never wider than its row. A 1 px `--ws-tray` rim, 12 px corners
19
+ (`--ws-radius-drawer`, 11 inside), the `--ws-raised` ground. No shadow and no edge of its own: it sits in the page,
20
+ not over it. It fills its row's height; the page puts it 24 from what it sits beside (Seth: report 886, gap 24,
21
+ panel 440).
22
+ - Head (`ws-panel__head`): 20 above, 28 at the sides. The title row (`ws-panel__title-row`): the 22 / 28 title and an
23
+ optional tag (a `Chip`; "Needs work" is `ws-chip--needs-work`, the pink tint with its AA word), 10 apart; one 14 / 20 line under it, 4 apart. The close (`ws-panel__close`): a 32 px tray
24
+ square with 6 px corners and a navy 16 px x, centred on the title's first line, 12 from the title block.
25
+ - Body (`ws-panel__body`): scrolls on its own. It holds sections (`ws-panel__section`): 20 above and below, 28 at the
26
+ sides, their parts 16 apart, each after the first opening with a full-width 0.5 px hairline (`--ws-divider`). The
27
+ first section follows the head at 16 (Seth's figure row: a 44 / 48 figure and its strip, 20 apart,
28
+ `ws-panel__figure-row`). The strip takes the rest of the line and must shrink with it: ticks that flex (Seth's 40
29
+ ticks, 32 tall, 2 apart), never a row of fixed ticks, which runs past the pane on a phone.
30
+ - Foot (`ws-panel__foot`): sections pinned under the body, the first opening with the hairline. Seth's next fix
31
+ (`ws-panel__next`): a 13 / 18 medium muted label ("Next fix · 1 of 2", `ws-control-words`) 6 above the 15 / 22 fix
32
+ (`ws-section`), one part of the section, so the 16 between parts never comes between them. Its acts
33
+ (`ws-panel__acts`, Seth's grey `ws-btn--well` then the navy primary, both `lg`) share the width in equal halves,
34
+ 8 apart, the one primary last; where a half would be under 160 or a label would break, they stack full width, the
35
+ primary at the bottom. `ws-panel__section--tight` (12 above and below) holds a one-line ask field.
23
36
 
24
37
  ## Variants and sizes
25
38
 
26
39
  | Context | Behaviour |
27
40
  | --- | --- |
28
- | Wide area (desktop) | Docks beside the canvas, which narrows to make room; resizable, width remembered |
29
- | Narrower than the docking threshold | Slides in over the page, full height, inside the area |
30
- | Phone | Fills the screen |
31
- | Widened | Takes the whole stage, the chat stepping aside |
41
+ | Wide screen | Beside the page or the chat, 440 wide; the page beside it narrows |
42
+ | Under 40rem | The whole screen (`position: fixed; inset: 0`), no rim, no corners (K5) |
43
+ | Busy | The chrome stays; the body shows `.ws-shimmer` ghosts in the shapes of what is coming |
32
44
 
33
45
  ## States
34
46
 
35
- - **Entering**: slides in (`ws-slide-in`, opacity and a small `translateX` from `--space-lg`, over `--ws-duration-settle` on `--ws-ease-soft`).
36
- - **Open**: docked beside the canvas or floating over the page, scrollable content.
37
- - **Leaving**: it slides back towards its edge and fades (`ws-slide-out`, `--ws-duration-gentle` on `--ws-ease-exit`), then gives its room back to the canvas at once, before the next page finishes loading; with reduced motion it simply goes.
38
- - **Busy** (its content loading): the content area shows its own loading state (a skeleton); the panel chrome itself does not change.
39
- - **Narrow**: below the docking width it stops narrowing the canvas and instead overlays it.
40
- - **Touch**: the resize handle shows only from the `lg` area upward; on a phone there is nothing to resize, since the panel is the screen.
47
+ - **Entering** (North's docked panel, js@647700, "Opens / moves / docks"): it grows out of .97 (`--ws-open-scale`)
48
+ from the edge it docks to on the panel spring (`--ws-spring-panel`, .42 / .12), fading in over
49
+ `--ws-duration-hover` (.2 s) and out of an 8 px blur (`--ws-blur-panel`) over .24 s, each on its own clock.
50
+ - **Open**: the head and the foot stay; the body scrolls. Focused as a keyboard scroller, the body draws its ring inside.
51
+ - **Leaving** (`ws-panel--leaving` or `data-leaving`): it goes back to .97 into a 6 px blur, fading, over .16 s
52
+ (North's chat exit, js@674822; `--ws-panel-out`), faster than it came, taking no presses; remove it 160 ms later,
53
+ before the page without it renders. With reduced motion it simply goes.
54
+ - **Busy** (`aria-busy="true"`): the body holds `.ws-shimmer` ghosts; the line under the title says what is being
55
+ fetched ("Checking 9 searches near you.").
56
+ - **Long title**: wraps beside the close; the close stays on the first line.
57
+ - **Phone**: it is the screen; its acts stack when they do not fit side by side. While it is open the app makes the
58
+ page behind it `inert`, so Tab and a screen reader stay in the panel.
41
59
 
42
60
  ## Behaviour
43
61
 
44
- - Keyboard: drag handle aside, the panel's own content takes normal tab order; Escape and the "Close" word both close it.
45
- - Pointer: its left edge is a drag handle (`role="separator"`) to resize it; double-click resets it to its default width.
46
- - Touch: on a touch screen smaller than the docking width, the panel takes the whole area; nothing to drag.
47
- - Motion: entrance `ws-slide-in`, exit `ws-slide-out`, both opacity plus a small horizontal shift, never a scale or bounce.
48
- - Reduced motion: it appears and disappears in place, without the slide.
62
+ - Keyboard: the close comes after the title in tab order; Escape and the close both close it. Focus moves into it when
63
+ it opens and back to the row that opened it when it closes.
64
+ - Pointer: the close, or the row that opened it pressed again.
65
+ - Touch: the close and the acts are 40 tall.
66
+ - Reduced motion: it appears and goes in place.
67
+ - The preview's last stack is live: press Website, then its close.
49
68
 
50
69
  ## Content
51
70
 
52
- - One thing at a time: opening a second thing from the same chat replaces what the panel shows, it never stacks.
53
- - The header never names more than the thing's kind; the thing's own name or title lives in the panel's content, said once.
54
- - Nothing the chat or the page already shows is repeated inside the panel.
71
+ - One thing at a time: opening another thing replaces what the panel shows; it never stacks.
72
+ - The title is the thing's own name ("Local search"), said once; the tag says its state ("Needs work").
73
+ - The line under the title says what the thing is, in one sentence.
74
+ - The foot says what to do next and holds at most two acts.
55
75
 
56
76
  ## Props
57
77
 
58
- **`DockedPane`**
78
+ **`DockedPane`** (the reference implementation)
59
79
 
60
80
  | Name | Type | Meaning |
61
81
  | --- | --- | --- |
62
82
  | `storageKey` | string | Where its width is remembered (per browser). |
63
83
  | `bounds` | `{ min, max, fallback }` | The widths it can be dragged between, and its default. |
64
84
  | `label` | string | What the pane is, for its resize handle ("Resize the lead"). |
65
- | `leaving` | boolean | The pane is on its way out: it slides back to its edge and fades, then gives its room back before the page answers. |
66
- | `children` | `ReactNode` | The pane's content, including its own header. |
67
-
68
- **`useRoutePane`**
69
-
70
- | Name | Type | Meaning |
71
- | --- | --- | --- |
72
- | `node` | `HTMLElement \| null` | The pane's root, so focus can move into it when it opens. |
73
- | `closeHref` | string | Where Escape or the scrim sends the page. |
74
- | `openSelector` | string | What reopens focus to, matching the link that opened this pane. |
75
- | `close` | `() => void` | Optional: called instead of navigating straight away, so a close can animate first. |
85
+ | `leaving` | boolean | On its way out: adds `ws-panel--leaving`, then gives its room back. |
86
+ | `children` | `ReactNode` | The pane's head, body and foot. |
76
87
 
77
88
  ## Rules
78
89
 
79
- - Never an "x": the panel's close control is always the word "Close" (the system's rule, the side workspace).
80
- - "A thing or a rich card opened from the chat takes the same place; the home screen steps aside" (the system's
81
- rule): only one panel's worth of content shows at a time.
82
- - An unmount is too late to animate a close: `leaving` lets the pane finish its own exit motion before the page without it renders.
83
- - What the chat already shows is never repeated in the panel (the system's rule: "the home screen has no 'From this chat' list").
90
+ - The close is the tray square with an x (Seth, 301:2021). It replaces the word "Close" (logged in 17-decisions.md).
91
+ - One thing at a time; nothing repeated that the page or the chat already shows.
92
+ - No shadow while it sits in the page: the rim is its edge (D5).
93
+ - Dividers run the full width; the parts inside sit 28 in.
94
+ - A plate inside (`ws-plate`) sits half a step above the pane's ground, so it still shows in dark.
84
95
 
85
96
  ## Source
86
97
 
87
- - **Derived from**: the system's docked-pane rules (the word "Close", never an icon; one thing shown at a time;
88
- nothing repeated that the chat already shows) and its topbar height token.
89
- - **Precedent**: the first product built on the system; its own panes use a 48 px header line, not the 56 px line
90
- used for the chat's own header, and this README and preview follow the 48 px the code actually builds.
98
+ **Derived from**: Seth's check drawer (Figma 301:2011 to 301:2108: 12 / 11 rim, sections 20 / 28 with 16 inside,
99
+ 0.5 px #e8e8e8 rules, the foot pinned by a spacer, the 32 px square close, the 44 / 48 figure row), North's docked
100
+ panel motion (js@648139), Revenue OS K5 and K6 and the geometry check (440 on a 390 phone). **Precedent**: the first
101
+ product built on the system.
102
+
103
+ ## Markup
104
+
105
+ ```html
106
+ <aside class="ws-panel" aria-labelledby="check-title">
107
+ <header class="ws-panel__head">
108
+ <div class="ws-panel__heading">
109
+ <div class="ws-panel__title-row">
110
+ <h2 id="check-title" class="ws-title">Local search</h2>
111
+ <span class="ws-chip ws-chip--needs-work">Needs work</span>
112
+ </div>
113
+ <p class="ws-body">How often you show up on Google Maps when buyers search near you.</p>
114
+ </div>
115
+ <button type="button" class="ws-icon-btn ws-panel__close" aria-label="Close Local search">
116
+ <svg viewBox="0 0 16 16" fill="none"><path d="M4 4l8 8M12 4l-8 8" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"/></svg>
117
+ </button>
118
+ </header>
119
+ <div class="ws-panel__body">
120
+ <section class="ws-panel__section">
121
+ <div class="ws-panel__figure-row">
122
+ <span class="ws-figure ws-figure--pane">39</span>
123
+ <!-- the strip it reads from: ticks that flex, so it shrinks with the line -->
124
+ </div>
125
+ </section>
126
+ <section class="ws-panel__section">
127
+ <p class="ws-section">Buyers near you see you in 5 of 9 spots, never in the top three.</p>
128
+ </section>
129
+ </div>
130
+ <footer class="ws-panel__foot">
131
+ <section class="ws-panel__section">
132
+ <div class="ws-panel__next">
133
+ <span class="ws-control-words">Next fix · 1 of 2</span>
134
+ <p class="ws-section">Name the towns you serve in your Google Business Profile.</p>
135
+ </div>
136
+ <div class="ws-panel__acts">
137
+ <button type="button" class="ws-btn ws-btn--well ws-btn--lg">Send to my web person</button>
138
+ <button type="button" class="ws-btn ws-btn--primary ws-btn--lg">Review Grow's rewrite</button>
139
+ </div>
140
+ </section>
141
+ </footer>
142
+ </aside>
143
+ ```
144
+
145
+ ## Styles
146
+
147
+ `Panel/style.css`, built into `bundle.css` and `fello.css`. Tokens only, so it turns dark with the page. The body is
148
+ one of the house's K1 and K2 scrollers: its sections never shrink and nothing inside it stretches the window.