@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
@@ -0,0 +1,164 @@
1
+ A value over periods against an axis, as a line with its dots and the hatched area under it, or as columns that collapse into the line's points and back.
2
+
3
+ **Use it when**
4
+
5
+ - One number moves month to month or week to week (ending ARR, calls answered, bookings) and the reader needs its level
6
+ against an axis, not only its shape.
7
+ - The same run reads two ways: columns to compare periods, a line to see the trend. A Bars / Line switch over the card
8
+ shows both, from the same data, with no reload: the columns collapse into the line's points.
9
+ - A tile needs a small preview of that run (`--bare`, inside `MetricTile`'s `__preview`).
10
+
11
+ **Not for**
12
+
13
+ - A day-by-day trend with one moment that explains it: use `TrendBars`.
14
+ - A bill or a rate that steps against a reference, the gap hatched: use `StepLine`.
15
+ - Parts of one whole: use `ShareBar`. A goal's share: `GoalTicks` or `PaceBar`.
16
+ - Two series or more: one TrendLine draws one series (and one reference). Put the second in its own card.
17
+
18
+ **Anatomy**
19
+
20
+ - Plot: 224 tall (`--ws-trend-line-h`, the grid), 24 of head room above it for a reference's words; across, a 40 px
21
+ value gutter (`--ws-trend-line-y` for longer figures), 12, the plot. The period names sit 6 under it.
22
+ - Data is positions: `--n` (how many periods) on the figure; on each point its place `--i` (0 to n - 1) and its value
23
+ `--y`, as a percentage of the plot from the top (100% is the baseline). Point i stands at x = (i + 0.5) / n.
24
+ - Grid: value rules (`__rule`, `--y`), 0.5 px `--ws-edge-slot`; the baseline is the plot's own bottom edge, 0.5 px
25
+ `--ws-edge-card`. Value labels 11/14 muted, right-aligned, centred on their rules. Set `--ticks` on the figure to the
26
+ number of even steps (5 for 0, 10, 20, 30, 40, 50) and each column is cut by a 0.5 px line where a rule crosses it
27
+ (North's paper cuts); without it, only the top line cuts.
28
+ - A reference (`__ref`, `--y`): a 1 px salmon dotted line across the plot (`--ws-chart-under-half`), its words 4 above
29
+ it at the left, 11/14 semibold in the salmon's AA word (`--ws-word-needs`): "Plan $40.03M".
30
+ - The line and its area: one box (`__draw`) holding the hatch and the SVG. The SVG is stretched over the plot
31
+ (`viewBox="0 0 100 100"`, `preserveAspectRatio="none"`) with strokes that never scale: the line 1.5 navy, round joins;
32
+ what is still to come (`__ahead`) a dotted 1 px line. The hatch (`__hatch`) is a box clipped to the area under the
33
+ line (`clip-path: polygon(...)` in the same percentages): hairlines every 4 in the line's tone at 45% (1 px at 22% on
34
+ a 1x screen, which cannot draw half a pixel).
35
+ - A point (`__point`) is its period's slot, the slot wide, from 12 above its value to the baseline: the pointer's room.
36
+ Its column (`::before`) is 48% of the slot, 1 px corners at the top, from the value down; never under 2 px, so a zero
37
+ still shows. Its dot (`::after`) is 8 on the value, ringed 1.5 in the ground so the line parts round it.
38
+ - Tones: `--tone` on the figure (navy by default) for the line, columns and dots; the period in progress (`--now`)
39
+ takes `--tone-now` (the second navy, `--ws-chart-navy-light`, by default); a period to come (`--ahead`) is a dashed
40
+ outline column and a hollow dashed dot.
41
+ - Period names (`__x`, a `<span>` each): 11/14 muted, centred on their point, cut with an ellipsis in their slot (give
42
+ each a `title`); the current one (`__now`) 600 navy.
43
+ - Key (`__legend`, optional): centred, 16 apart, 16 above; a 12 px swatch in the mark's look (`__key--now`,
44
+ `__key--ahead`, `__key--ref` for the dotted line), 8, 14/20 medium body grey.
45
+ - The reading (`__table`): a real `<table>` of every period and its value, with a caption, hidden from the eye inside
46
+ the `__table` box. The plot is `aria-hidden`.
47
+
48
+ **Parts and modifiers**
49
+
50
+ - `.ws-trend-line--bars`: columns. Without it, the line. Toggling it is the morph.
51
+ - `.ws-trend-line--bare`: the drawing alone for a tile (no gutter, names, rules, key or band; 24 tall; a 1 px line,
52
+ 4 px dots and a 6 px current dot; columns 84% of their slot with 2 px corners). Write it in `<span>`s inside a tile's
53
+ button, with no table: the tile's own label says it.
54
+ - `__point--now`, `__point--ahead`: the period in progress; a period to come.
55
+ - `__point--on`: the point held open (a tap, or the keyboard's mark when the app moves one); it looks hovered.
56
+ - `__band`: the hover band, last in the plot. `__now`: the current period's name.
57
+
58
+ **States**
59
+
60
+ - Resting, line: the line, its hatched area, a dot a period. Resting, columns: the columns and their cuts.
61
+ - Building in (a kit default, 5 Nov 2026): on first paint the chart draws over `--ws-duration-draw` (900 ms). Each
62
+ column rises from the baseline over the last 45% of it, column i starting at i / (n - 1) of the first 55% on
63
+ `--ws-ease-settle`; the line and its area are revealed left to right as one progress (`--ws-ease-steady`) and each
64
+ dot pops on `--ws-ease-pop` as the line reaches it; the reference runs out from the left. In a `.ws-build`
65
+ card it all starts when its card lands (`--ws-build-at`, Motion's Build-in). A chart below the fold
66
+ builds as it scrolls in instead, the same moves driven by its own entry into the view (`animation-timeline`, a view
67
+ timeline: from its top at the window's foot until 80% of it is in), so it is whole by then; scrolled back out the
68
+ bottom and in again, it builds again. Without view timelines, a chart below the fold is simply whole when it arrives.
69
+ - Switching (Bars / Line, North's "Bars to line morph"): to the line, every column collapses into its top at once on
70
+ `--ws-spring-morph-chart` (.85 / .06) while the line and its area draw left to right over the draw, and the dots pop
71
+ on the columns' remains after `--ws-duration-settle`; a column to come fades instead (an outline cannot collapse).
72
+ Back to columns, the dots go over `--ws-duration-exit`, the line undraws right to left over the settle and each
73
+ column grows back down from its dot on the spring. The same elements all the way: a switch midway picks up from
74
+ where it is.
75
+ - Hover or focus (`__point--on` for a tap): the band slides to the period over `--ws-duration-settle` on
76
+ `--ws-ease-soft` (North's "Chart column highlight slide"). Columns: the band is a navy wash the slot wide and the plot
77
+ tall, the other columns step back to `--ws-dim` over the hover. Line: the band is a dashed guide from the dot to the
78
+ baseline, and the dot grows to 1.5 inside a faint halo over `--ws-duration-hover` (North's `r .2s`). The band rides
79
+ CSS anchor positioning: without it the band is left out and the rest still happens. A `HoverCard`
80
+ (`--above --follow`) reads the point.
81
+ - Narrow (the figure under 30rem): the plot is 200 tall; with more than six names, every other one and the current
82
+ one's neighbours give way and the rest take two slots.
83
+ - Zero: every column a 2 px stub on the baseline, every dot on it. One period: a dot (or a column) and no line.
84
+ - Empty (no data yet): the card is left out, as for every chart. Loading: a `ws-shimmer` block the plot's size,
85
+ `aria-busy="true"`.
86
+ - Reduced motion: nothing moves. The chart is whole at once, the switch and the band change at once.
87
+
88
+ **Behaviour**
89
+
90
+ - Pointer: pointing at a period's slot shows its band and its reading; the `HoverCard` follows from period to period
91
+ on the follow spring and goes 180 ms after the pointer leaves the plot (`--ws-hover-grace`).
92
+ - Touch: a tap on a period sets `__point--on` and shows its card; a tap elsewhere clears it.
93
+ - Keyboard: the chart is read, not operated; its table is the reading. An app that opens a period from its point makes
94
+ each point focusable (`tabindex="0"`, `role="img"` with its words) and drops `aria-hidden` from the plot: focus then
95
+ shows the band, the grown dot and the house focus ring round the slot.
96
+ - The switch is a `Segmented` (radios, or buttons with `aria-pressed`) that sets `--bars` on its chart: one line in
97
+ the app. Its thumb slides as it always does.
98
+
99
+ **Content**
100
+
101
+ - The card's title says the answer ("ARR is on pace for the $40.03M plan"); its sentence names what is to come.
102
+ - Value labels are short ($40M, 1.5K): a long figure widens the gutter (`--ws-trend-line-y`), never wraps.
103
+ - A period name is short (Jan, Oct 6, Q4); the table holds the whole words ("October, month to date").
104
+
105
+ **Rules**
106
+
107
+ - **One series, one optional reference.** Two lines are two cards.
108
+ - **Columns start at zero.** A chart with the switch, or any columns, has its baseline at 0; a line alone may start
109
+ above zero only without the hatch (an area claims a whole).
110
+ - **The same data in both modes**: the switch changes the drawing, never the numbers.
111
+ - **Marks keep the exact tone; words take the AA step** (D2): the reference is salmon, its words `--ws-word-needs`.
112
+ - **Never a value only on hover**: the axis reads every period; the card's sentence names the one that matters.
113
+ - **Source**: Seth's North, its revenue chart (the ARR card: plan line, month to date, projected, the Bars / Line
114
+ toggle, its morph and hover) and the NRR tile's line. Built for 0.5.0 on Amit's ask (5 Nov 2026): "there are four
115
+ charts, and they look really nice... I don't see any of those in our kit." Overturns 09-charts' "a free line chart:
116
+ make it thin bars" for a value over periods with an axis.
117
+
118
+ **Markup**
119
+
120
+ ```html
121
+ <figure class="ws-trend-line ws-trend-line--bars" style="--n: 4; --ticks: 3;" aria-labelledby="calls-t">
122
+ <div class="ws-trend-line__plot" aria-hidden="true">
123
+ <div class="ws-trend-line__y"><span style="--y: 0%;">30</span><span style="--y: 33.33%;">20</span><span style="--y: 66.67%;">10</span><span style="--y: 100%;">0</span></div>
124
+ <div class="ws-trend-line__area">
125
+ <span class="ws-trend-line__rule" style="--y: 0%;"></span><span class="ws-trend-line__rule" style="--y: 33.33%;"></span><span class="ws-trend-line__rule" style="--y: 66.67%;"></span>
126
+ <span class="ws-trend-line__draw">
127
+ <span class="ws-trend-line__hatch" style="clip-path: polygon(12.5% 40%, 37.5% 20%, 62.5% 50%, 87.5% 13.33%, 87.5% 100%, 12.5% 100%);"></span>
128
+ <svg class="ws-trend-line__lines" viewBox="0 0 100 100" preserveAspectRatio="none" aria-hidden="true"><path d="M12.5 40 L37.5 20 L62.5 50 L87.5 13.33"/></svg>
129
+ </span>
130
+ <span class="ws-trend-line__point" style="--i: 0; --y: 40%;"></span>
131
+ <span class="ws-trend-line__point" style="--i: 1; --y: 20%;"></span>
132
+ <span class="ws-trend-line__point" style="--i: 2; --y: 50%;"></span>
133
+ <span class="ws-trend-line__point ws-trend-line__point--now" style="--i: 3; --y: 13.33%;"></span>
134
+ <span class="ws-trend-line__band"></span>
135
+ </div>
136
+ <div class="ws-trend-line__x"><span title="Week of 29 September">29 Sep</span><span title="Week of 6 October">6 Oct</span><span title="Week of 13 October">13 Oct</span><span class="ws-trend-line__now" title="Week of 20 October">20 Oct</span></div>
137
+ </div>
138
+ <div class="ws-trend-line__table"><table>
139
+ <caption>Calls by week</caption>
140
+ <thead><tr><th scope="col">Week</th><th scope="col">Calls</th></tr></thead>
141
+ <tbody><tr><th scope="row">Week of 29 September</th><td>18 calls</td></tr><!-- a row a period --></tbody>
142
+ </table></div>
143
+ </figure>
144
+ ```
145
+
146
+ A reference goes after the rules: `<span class="ws-trend-line__ref" style="--y: 19.94%;"><span>Plan $40.03M</span></span>`.
147
+ What is to come: `__point--ahead` on its points, and a second path `<path class="ws-trend-line__ahead" d="...">` from
148
+ the last real point on. The switch, in the card's head:
149
+
150
+ ```html
151
+ <div class="ws-segmented" role="radiogroup" aria-label="Show as">
152
+ <label class="ws-segmented__item"><input type="radio" name="calls-mode" value="bars" checked>Bars</label>
153
+ <label class="ws-segmented__item"><input type="radio" name="calls-mode" value="line">Line</label>
154
+ </div>
155
+ <!-- the app: group.onchange = (e) => chart.classList.toggle('ws-trend-line--bars', e.target.value === 'bars') -->
156
+ ```
157
+
158
+ **Styles**: `TrendLine/style.css`, in `bundle.css` and `fello.css` as `.ws-trend-line`. Every value is a token or a calc
159
+ on tokens, except North's own numbers: the dotted line's 0.1 dash (a round cap's dot), the column's 48% of its slot,
160
+ the hatch at 45%, the hovered dot's 1.5 and its halo at 12%, and the build's 55 / 45 share. Tokens: `--ws-duration-draw`,
161
+ `--ws-duration-settle`, `--ws-duration-hover`, `--ws-duration-exit`, `--ws-ease-settle`, `--ws-ease-steady`,
162
+ `--ws-ease-pop`, `--ws-ease-soft`, `--ws-ease-exit`, `--ws-spring-morph-chart` and its duration, `--ws-dim`,
163
+ `--ws-hover`, `--ws-chart-line`, `--ws-chart-navy-light`, `--ws-chart-under-half`, `--ws-word-needs`, `--ws-edge-slot`,
164
+ `--ws-edge-card`.
@@ -0,0 +1,373 @@
1
+ <!-- @dsCard group="Charts" height=2320 -->
2
+ <!doctype html>
3
+ <html>
4
+ <head>
5
+ <meta charset="utf-8">
6
+ <title>TrendLine</title>
7
+ <link rel="stylesheet" href="../../tokens.css">
8
+ <link rel="stylesheet" href="../bundle.css">
9
+ </head>
10
+ <body>
11
+ <div class="ws-stage ws-stage--column">
12
+
13
+ <div class="ws-stack" style="max-width: 1194px;">
14
+ <span class="ws-muted">Columns with the switch: Line collapses each column into its point while the line draws; Bars grows them back. Point along it for the reading.</span>
15
+ <section class="ws-card ws-card--compound" aria-labelledby="tl-arr-t">
16
+ <header class="ws-head">
17
+ <div>
18
+ <h3 class="ws-title" id="tl-arr-t">ARR is on pace for the $40.03M plan</h3>
19
+ <p class="ws-body">Ending ARR by month. October is month to date; November and December are projected.</p>
20
+ </div>
21
+ <div class="ws-cluster"><button type="button" class="ws-btn ws-btn--secondary ws-btn--sm" data-replay="tl-arr" aria-label="Replay the build-in">Replay</button><div class="ws-segmented" role="radiogroup" aria-label="Show as" data-trend-mode="tl-arr"><label class="ws-segmented__item"><input type="radio" name="tl-arr-mode" value="bars" checked>Bars</label><label class="ws-segmented__item"><input type="radio" name="tl-arr-mode" value="line">Line</label></div></div>
22
+ </header>
23
+ <div class="ws-card__body">
24
+ <figure class="ws-trend-line ws-trend-line--bars" id="tl-arr" style="--n: 12; --ticks: 5;" aria-labelledby="tl-arr-t" data-trend-live>
25
+ <div class="ws-trend-line__plot" aria-hidden="true">
26
+ <div class="ws-trend-line__y"><span style="--y: 0%;">$50M</span><span style="--y: 20%;">$40M</span><span style="--y: 40%;">$30M</span><span style="--y: 60%;">$20M</span><span style="--y: 80%;">$10M</span><span style="--y: 100%;">$0M</span></div>
27
+ <div class="ws-trend-line__area">
28
+ <span class="ws-trend-line__rule" style="--y: 0%;"></span><span class="ws-trend-line__rule" style="--y: 20%;"></span><span class="ws-trend-line__rule" style="--y: 40%;"></span><span class="ws-trend-line__rule" style="--y: 60%;"></span><span class="ws-trend-line__rule" style="--y: 80%;"></span>
29
+ <span class="ws-trend-line__ref" style="--y: 19.94%;"><span>Plan $40.03M</span></span>
30
+ <span class="ws-trend-line__draw">
31
+ <span class="ws-trend-line__hatch" style="clip-path: polygon(4.17% 50%, 12.5% 48.2%, 20.83% 46.4%, 29.17% 43.8%, 37.5% 41%, 45.83% 38.8%, 54.17% 37.4%, 62.5% 35.88%, 70.83% 31.6%, 79.17% 28.5%, 79.17% 100%, 4.17% 100%);"></span>
32
+ <svg class="ws-trend-line__lines" viewBox="0 0 100 100" preserveAspectRatio="none" aria-hidden="true"><path d="M4.17 50 L12.5 48.2 L20.83 46.4 L29.17 43.8 L37.5 41 L45.83 38.8 L54.17 37.4 L62.5 35.88 L70.83 31.6 L79.17 28.5"/><path class="ws-trend-line__ahead" d="M79.17 28.5 L87.5 24.2 L95.83 19.94"/></svg>
33
+ </span>
34
+ <span class="ws-trend-line__point" style="--i: 0; --y: 50%;"></span>
35
+ <span class="ws-trend-line__point" style="--i: 1; --y: 48.2%;"></span>
36
+ <span class="ws-trend-line__point" style="--i: 2; --y: 46.4%;"></span>
37
+ <span class="ws-trend-line__point" style="--i: 3; --y: 43.8%;"></span>
38
+ <span class="ws-trend-line__point" style="--i: 4; --y: 41%;"></span>
39
+ <span class="ws-trend-line__point" style="--i: 5; --y: 38.8%;"></span>
40
+ <span class="ws-trend-line__point" style="--i: 6; --y: 37.4%;"></span>
41
+ <span class="ws-trend-line__point" style="--i: 7; --y: 35.88%;"></span>
42
+ <span class="ws-trend-line__point" style="--i: 8; --y: 31.6%;"></span>
43
+ <span class="ws-trend-line__point ws-trend-line__point--now" style="--i: 9; --y: 28.5%;"></span>
44
+ <span class="ws-trend-line__point ws-trend-line__point--ahead" style="--i: 10; --y: 24.2%;"></span>
45
+ <span class="ws-trend-line__point ws-trend-line__point--ahead" style="--i: 11; --y: 19.94%;"></span>
46
+ <span class="ws-trend-line__band"></span>
47
+ </div>
48
+ <div class="ws-trend-line__x"><span title="January">Jan</span><span title="February">Feb</span><span title="March">Mar</span><span title="April">Apr</span><span title="May">May</span><span title="June">Jun</span><span title="July">Jul</span><span title="August">Aug</span><span title="September">Sep</span><span class="ws-trend-line__now" title="October, month to date">Oct</span><span title="November, projected">Nov</span><span title="December, projected">Dec</span></div>
49
+ </div>
50
+ <ul class="ws-trend-line__legend" aria-hidden="true"><li>Ending ARR</li><li class="ws-trend-line__key--now">Month to date</li><li class="ws-trend-line__key--ahead">Projected</li><li class="ws-trend-line__key--ref">Plan</li></ul>
51
+ <div class="ws-trend-line__table"><table>
52
+ <caption>Ending ARR by month, against the $40.03M plan</caption>
53
+ <thead><tr><th scope="col">Month</th><th scope="col">Ending ARR</th></tr></thead>
54
+ <tbody><tr><th scope="row">January</th><td>$25.00M</td></tr><tr><th scope="row">February</th><td>$25.90M</td></tr><tr><th scope="row">March</th><td>$26.80M</td></tr><tr><th scope="row">April</th><td>$28.10M</td></tr><tr><th scope="row">May</th><td>$29.50M</td></tr><tr><th scope="row">June</th><td>$30.60M</td></tr><tr><th scope="row">July</th><td>$31.30M</td></tr><tr><th scope="row">August</th><td>$32.06M</td></tr><tr><th scope="row">September</th><td>$34.20M</td></tr><tr><th scope="row">October, month to date</th><td>$35.75M</td></tr><tr><th scope="row">November, projected</th><td>$37.90M</td></tr><tr><th scope="row">December, projected</th><td>$40.03M</td></tr></tbody>
55
+ </table></div>
56
+ </figure>
57
+ </div>
58
+ </section>
59
+ </div>
60
+
61
+ <div class="ws-stack" style="max-width: 1194px;">
62
+ <span class="ws-muted">A line (the default): the line and the hatched area under it, a dot a week, the current week in the second navy</span>
63
+ <section class="ws-card ws-card--compound" aria-labelledby="tl-calls-t">
64
+ <header class="ws-head">
65
+ <div>
66
+ <h3 class="ws-title" id="tl-calls-t">Calls answered doubled in eight weeks</h3>
67
+ <p class="ws-body">From 14 in the week of Sep 8 to 31 so far this week.</p>
68
+ </div>
69
+ <div class="ws-cluster"><button type="button" class="ws-btn ws-btn--secondary ws-btn--sm" data-replay="tl-calls" aria-label="Replay the draw">Replay</button></div>
70
+ </header>
71
+ <div class="ws-card__body">
72
+ <figure class="ws-trend-line" id="tl-calls" style="--n: 8; --ticks: 4;" aria-labelledby="tl-calls-t" data-trend-live>
73
+ <div class="ws-trend-line__plot" aria-hidden="true">
74
+ <div class="ws-trend-line__y"><span style="--y: 0%;">40</span><span style="--y: 25%;">30</span><span style="--y: 50%;">20</span><span style="--y: 75%;">10</span><span style="--y: 100%;">0</span></div>
75
+ <div class="ws-trend-line__area">
76
+ <span class="ws-trend-line__rule" style="--y: 0%;"></span><span class="ws-trend-line__rule" style="--y: 25%;"></span><span class="ws-trend-line__rule" style="--y: 50%;"></span><span class="ws-trend-line__rule" style="--y: 75%;"></span>
77
+ <span class="ws-trend-line__draw">
78
+ <span class="ws-trend-line__hatch" style="clip-path: polygon(6.25% 65%, 18.75% 52.5%, 31.25% 57.5%, 43.75% 45%, 56.25% 47.5%, 68.75% 32.5%, 81.25% 35%, 93.75% 22.5%, 93.75% 100%, 6.25% 100%);"></span>
79
+ <svg class="ws-trend-line__lines" viewBox="0 0 100 100" preserveAspectRatio="none" aria-hidden="true"><path d="M6.25 65 L18.75 52.5 L31.25 57.5 L43.75 45 L56.25 47.5 L68.75 32.5 L81.25 35 L93.75 22.5"/></svg>
80
+ </span>
81
+ <span class="ws-trend-line__point" style="--i: 0; --y: 65%;"></span>
82
+ <span class="ws-trend-line__point" style="--i: 1; --y: 52.5%;"></span>
83
+ <span class="ws-trend-line__point" style="--i: 2; --y: 57.5%;"></span>
84
+ <span class="ws-trend-line__point" style="--i: 3; --y: 45%;"></span>
85
+ <span class="ws-trend-line__point" style="--i: 4; --y: 47.5%;"></span>
86
+ <span class="ws-trend-line__point" style="--i: 5; --y: 32.5%;"></span>
87
+ <span class="ws-trend-line__point" style="--i: 6; --y: 35%;"></span>
88
+ <span class="ws-trend-line__point ws-trend-line__point--now" style="--i: 7; --y: 22.5%;"></span>
89
+ <span class="ws-trend-line__band"></span>
90
+ </div>
91
+ <div class="ws-trend-line__x"><span title="Week of Sep 8">Sep 8</span><span title="Week of Sep 15">Sep 15</span><span title="Week of Sep 22">Sep 22</span><span title="Week of Sep 29">Sep 29</span><span title="Week of Oct 6">Oct 6</span><span title="Week of Oct 13">Oct 13</span><span title="Week of Oct 20">Oct 20</span><span class="ws-trend-line__now" title="Week of Oct 27">Oct 27</span></div>
92
+ </div>
93
+ <div class="ws-trend-line__table"><table>
94
+ <caption>Calls answered by week</caption>
95
+ <thead><tr><th scope="col">Week</th><th scope="col">Calls answered</th></tr></thead>
96
+ <tbody><tr><th scope="row">Week of Sep 8</th><td>14 calls</td></tr><tr><th scope="row">Week of Sep 15</th><td>19 calls</td></tr><tr><th scope="row">Week of Sep 22</th><td>17 calls</td></tr><tr><th scope="row">Week of Sep 29</th><td>22 calls</td></tr><tr><th scope="row">Week of Oct 6</th><td>21 calls</td></tr><tr><th scope="row">Week of Oct 13</th><td>27 calls</td></tr><tr><th scope="row">Week of Oct 20</th><td>26 calls</td></tr><tr><th scope="row">Week of Oct 27</th><td>31 calls</td></tr></tbody>
97
+ </table></div>
98
+ </figure>
99
+ </div>
100
+ </section>
101
+ </div>
102
+
103
+ <div class="ws-stack" style="max-width: 1194px;">
104
+ <span class="ws-muted">Hover, held (__point--on): the band behind the column and the rest stepped back; on the line, the guide to the baseline and the grown dot</span>
105
+ <div class="ws-board">
106
+ <section class="ws-card ws-card--compound" aria-labelledby="tl-hb-t">
107
+ <header class="ws-head"><div><h3 class="ws-title" id="tl-hb-t">August added $760K</h3></div></header>
108
+ <div class="ws-card__body">
109
+ <figure class="ws-trend-line ws-trend-line--bars" id="tl-hb" style="--n: 12; --ticks: 5;" aria-labelledby="tl-hb-t">
110
+ <div class="ws-trend-line__plot" aria-hidden="true">
111
+ <div class="ws-trend-line__y"><span style="--y: 0%;">$50M</span><span style="--y: 20%;">$40M</span><span style="--y: 40%;">$30M</span><span style="--y: 60%;">$20M</span><span style="--y: 80%;">$10M</span><span style="--y: 100%;">$0M</span></div>
112
+ <div class="ws-trend-line__area">
113
+ <span class="ws-trend-line__rule" style="--y: 0%;"></span><span class="ws-trend-line__rule" style="--y: 20%;"></span><span class="ws-trend-line__rule" style="--y: 40%;"></span><span class="ws-trend-line__rule" style="--y: 60%;"></span><span class="ws-trend-line__rule" style="--y: 80%;"></span>
114
+ <span class="ws-trend-line__ref" style="--y: 19.94%;"><span>Plan $40.03M</span></span>
115
+ <span class="ws-trend-line__draw">
116
+ <span class="ws-trend-line__hatch" style="clip-path: polygon(4.17% 50%, 12.5% 48.2%, 20.83% 46.4%, 29.17% 43.8%, 37.5% 41%, 45.83% 38.8%, 54.17% 37.4%, 62.5% 35.88%, 70.83% 31.6%, 79.17% 28.5%, 79.17% 100%, 4.17% 100%);"></span>
117
+ <svg class="ws-trend-line__lines" viewBox="0 0 100 100" preserveAspectRatio="none" aria-hidden="true"><path d="M4.17 50 L12.5 48.2 L20.83 46.4 L29.17 43.8 L37.5 41 L45.83 38.8 L54.17 37.4 L62.5 35.88 L70.83 31.6 L79.17 28.5"/><path class="ws-trend-line__ahead" d="M79.17 28.5 L87.5 24.2 L95.83 19.94"/></svg>
118
+ </span>
119
+ <span class="ws-trend-line__point" style="--i: 0; --y: 50%;"></span>
120
+ <span class="ws-trend-line__point" style="--i: 1; --y: 48.2%;"></span>
121
+ <span class="ws-trend-line__point" style="--i: 2; --y: 46.4%;"></span>
122
+ <span class="ws-trend-line__point" style="--i: 3; --y: 43.8%;"></span>
123
+ <span class="ws-trend-line__point" style="--i: 4; --y: 41%;"></span>
124
+ <span class="ws-trend-line__point" style="--i: 5; --y: 38.8%;"></span>
125
+ <span class="ws-trend-line__point" style="--i: 6; --y: 37.4%;"></span>
126
+ <span class="ws-trend-line__point ws-trend-line__point--on" style="--i: 7; --y: 35.88%;"></span>
127
+ <span class="ws-trend-line__point" style="--i: 8; --y: 31.6%;"></span>
128
+ <span class="ws-trend-line__point ws-trend-line__point--now" style="--i: 9; --y: 28.5%;"></span>
129
+ <span class="ws-trend-line__point ws-trend-line__point--ahead" style="--i: 10; --y: 24.2%;"></span>
130
+ <span class="ws-trend-line__point ws-trend-line__point--ahead" style="--i: 11; --y: 19.94%;"></span>
131
+ <span class="ws-trend-line__band"></span>
132
+ <div class="ws-hover-card ws-hover-card--above" role="tooltip" style="left: 62.5%; top: 35.88%;"><span class="ws-hover-card__eyebrow"><span class="ws-hover-card__swatch" style="--ws-hover-card-swatch: var(--color-text-heading);"></span><span>August</span></span><span class="ws-hover-card__title">$32.06M</span><span class="ws-hover-card__row"><span class="ws-hover-card__label">Net new</span><span class="ws-hover-card__value">+$760K</span></span></div>
133
+ </div>
134
+ <div class="ws-trend-line__x"><span title="January">Jan</span><span title="February">Feb</span><span title="March">Mar</span><span title="April">Apr</span><span title="May">May</span><span title="June">Jun</span><span title="July">Jul</span><span title="August">Aug</span><span title="September">Sep</span><span class="ws-trend-line__now" title="October, month to date">Oct</span><span title="November, projected">Nov</span><span title="December, projected">Dec</span></div>
135
+ </div>
136
+ <div class="ws-trend-line__table"><table>
137
+ <caption>Ending ARR by month, against the $40.03M plan</caption>
138
+ <thead><tr><th scope="col">Month</th><th scope="col">Ending ARR</th></tr></thead>
139
+ <tbody><tr><th scope="row">January</th><td>$25.00M</td></tr><tr><th scope="row">February</th><td>$25.90M</td></tr><tr><th scope="row">March</th><td>$26.80M</td></tr><tr><th scope="row">April</th><td>$28.10M</td></tr><tr><th scope="row">May</th><td>$29.50M</td></tr><tr><th scope="row">June</th><td>$30.60M</td></tr><tr><th scope="row">July</th><td>$31.30M</td></tr><tr><th scope="row">August</th><td>$32.06M</td></tr><tr><th scope="row">September</th><td>$34.20M</td></tr><tr><th scope="row">October, month to date</th><td>$35.75M</td></tr><tr><th scope="row">November, projected</th><td>$37.90M</td></tr><tr><th scope="row">December, projected</th><td>$40.03M</td></tr></tbody>
140
+ </table></div>
141
+ </figure>
142
+ </div>
143
+ </section>
144
+ <section class="ws-card ws-card--compound" aria-labelledby="tl-hl-t">
145
+ <header class="ws-head"><div><h3 class="ws-title" id="tl-hl-t">The week of Oct 13 took 27 calls</h3></div></header>
146
+ <div class="ws-card__body">
147
+ <figure class="ws-trend-line" id="tl-hl" style="--n: 8; --ticks: 4;" aria-labelledby="tl-hl-t">
148
+ <div class="ws-trend-line__plot" aria-hidden="true">
149
+ <div class="ws-trend-line__y"><span style="--y: 0%;">40</span><span style="--y: 25%;">30</span><span style="--y: 50%;">20</span><span style="--y: 75%;">10</span><span style="--y: 100%;">0</span></div>
150
+ <div class="ws-trend-line__area">
151
+ <span class="ws-trend-line__rule" style="--y: 0%;"></span><span class="ws-trend-line__rule" style="--y: 25%;"></span><span class="ws-trend-line__rule" style="--y: 50%;"></span><span class="ws-trend-line__rule" style="--y: 75%;"></span>
152
+ <span class="ws-trend-line__draw">
153
+ <span class="ws-trend-line__hatch" style="clip-path: polygon(6.25% 65%, 18.75% 52.5%, 31.25% 57.5%, 43.75% 45%, 56.25% 47.5%, 68.75% 32.5%, 81.25% 35%, 93.75% 22.5%, 93.75% 100%, 6.25% 100%);"></span>
154
+ <svg class="ws-trend-line__lines" viewBox="0 0 100 100" preserveAspectRatio="none" aria-hidden="true"><path d="M6.25 65 L18.75 52.5 L31.25 57.5 L43.75 45 L56.25 47.5 L68.75 32.5 L81.25 35 L93.75 22.5"/></svg>
155
+ </span>
156
+ <span class="ws-trend-line__point" style="--i: 0; --y: 65%;"></span>
157
+ <span class="ws-trend-line__point" style="--i: 1; --y: 52.5%;"></span>
158
+ <span class="ws-trend-line__point" style="--i: 2; --y: 57.5%;"></span>
159
+ <span class="ws-trend-line__point" style="--i: 3; --y: 45%;"></span>
160
+ <span class="ws-trend-line__point" style="--i: 4; --y: 47.5%;"></span>
161
+ <span class="ws-trend-line__point ws-trend-line__point--on" style="--i: 5; --y: 32.5%;"></span>
162
+ <span class="ws-trend-line__point" style="--i: 6; --y: 35%;"></span>
163
+ <span class="ws-trend-line__point ws-trend-line__point--now" style="--i: 7; --y: 22.5%;"></span>
164
+ <span class="ws-trend-line__band"></span>
165
+ <div class="ws-hover-card ws-hover-card--above" role="tooltip" style="left: 68.75%; top: calc(32.5% - var(--ws-trend-line-dot));"><span class="ws-hover-card__eyebrow"><span class="ws-hover-card__swatch" style="--ws-hover-card-swatch: var(--color-text-heading);"></span><span>Week of Oct 13</span></span><span class="ws-hover-card__title">27 calls</span><span class="ws-hover-card__row"><span class="ws-hover-card__label">On the week before</span><span class="ws-hover-card__value">+6</span></span></div>
166
+ </div>
167
+ <div class="ws-trend-line__x"><span title="Week of Sep 8">Sep 8</span><span title="Week of Sep 15">Sep 15</span><span title="Week of Sep 22">Sep 22</span><span title="Week of Sep 29">Sep 29</span><span title="Week of Oct 6">Oct 6</span><span title="Week of Oct 13">Oct 13</span><span title="Week of Oct 20">Oct 20</span><span class="ws-trend-line__now" title="Week of Oct 27">Oct 27</span></div>
168
+ </div>
169
+ <div class="ws-trend-line__table"><table>
170
+ <caption>Calls answered by week</caption>
171
+ <thead><tr><th scope="col">Week</th><th scope="col">Calls answered</th></tr></thead>
172
+ <tbody><tr><th scope="row">Week of Sep 8</th><td>14 calls</td></tr><tr><th scope="row">Week of Sep 15</th><td>19 calls</td></tr><tr><th scope="row">Week of Sep 22</th><td>17 calls</td></tr><tr><th scope="row">Week of Sep 29</th><td>22 calls</td></tr><tr><th scope="row">Week of Oct 6</th><td>21 calls</td></tr><tr><th scope="row">Week of Oct 13</th><td>27 calls</td></tr><tr><th scope="row">Week of Oct 20</th><td>26 calls</td></tr><tr><th scope="row">Week of Oct 27</th><td>31 calls</td></tr></tbody>
173
+ </table></div>
174
+ </figure>
175
+ </div>
176
+ </section>
177
+ </div>
178
+ </div>
179
+
180
+ <div class="ws-stack" style="max-width: 1194px;">
181
+ <span class="ws-muted">Long labels: period names cut with an ellipsis in their slot (their whole words in the table), a wider gutter for long figures (--ws-trend-line-y)</span>
182
+ <div class="ws-board">
183
+ <section class="ws-card ws-card--compound" aria-labelledby="tl-q-t">
184
+ <header class="ws-head"><div><h3 class="ws-title" id="tl-q-t">Bookings dipped in the fourth quarter</h3></div><div class="ws-segmented" role="radiogroup" aria-label="Show as" data-trend-mode="tl-q"><label class="ws-segmented__item"><input type="radio" name="tl-q-mode" value="bars">Bars</label><label class="ws-segmented__item"><input type="radio" name="tl-q-mode" value="line" checked>Line</label></div></header>
185
+ <div class="ws-card__body">
186
+ <figure class="ws-trend-line" id="tl-q" style="--n: 4; --ticks: 3; --ws-trend-line-y: var(--space-3xl);" aria-labelledby="tl-q-t" data-trend-live>
187
+ <div class="ws-trend-line__plot" aria-hidden="true">
188
+ <div class="ws-trend-line__y"><span style="--y: 0%;">$1,500K</span><span style="--y: 33.33%;">$1,000K</span><span style="--y: 66.67%;">$500K</span><span style="--y: 100%;">$0K</span></div>
189
+ <div class="ws-trend-line__area">
190
+ <span class="ws-trend-line__rule" style="--y: 0%;"></span><span class="ws-trend-line__rule" style="--y: 33.33%;"></span><span class="ws-trend-line__rule" style="--y: 66.67%;"></span>
191
+ <span class="ws-trend-line__draw">
192
+ <span class="ws-trend-line__hatch" style="clip-path: polygon(12.5% 45.33%, 37.5% 30.67%, 62.5% 16.67%, 87.5% 21.33%, 87.5% 100%, 12.5% 100%);"></span>
193
+ <svg class="ws-trend-line__lines" viewBox="0 0 100 100" preserveAspectRatio="none" aria-hidden="true"><path d="M12.5 45.33 L37.5 30.67 L62.5 16.67 L87.5 21.33"/></svg>
194
+ </span>
195
+ <span class="ws-trend-line__point" style="--i: 0; --y: 45.33%;"></span>
196
+ <span class="ws-trend-line__point" style="--i: 1; --y: 30.67%;"></span>
197
+ <span class="ws-trend-line__point" style="--i: 2; --y: 16.67%;"></span>
198
+ <span class="ws-trend-line__point ws-trend-line__point--now" style="--i: 3; --y: 21.33%;"></span>
199
+ <span class="ws-trend-line__band"></span>
200
+ </div>
201
+ <div class="ws-trend-line__x"><span title="First quarter 2026">First quarter 2026</span><span title="Second quarter 2026">Second quarter 2026</span><span title="Third quarter 2026">Third quarter 2026</span><span class="ws-trend-line__now" title="Fourth quarter 2026">Fourth quarter 2026</span></div>
202
+ </div>
203
+ <div class="ws-trend-line__table"><table>
204
+ <caption>Bookings by quarter</caption>
205
+ <thead><tr><th scope="col">Quarter</th><th scope="col">Bookings</th></tr></thead>
206
+ <tbody><tr><th scope="row">First quarter 2026</th><td>$820K</td></tr><tr><th scope="row">Second quarter 2026</th><td>$1,040K</td></tr><tr><th scope="row">Third quarter 2026</th><td>$1,250K</td></tr><tr><th scope="row">Fourth quarter 2026</th><td>$1,180K</td></tr></tbody>
207
+ </table></div>
208
+ </figure>
209
+ </div>
210
+ </section>
211
+ <section class="ws-card ws-card--compound" aria-labelledby="tl-z-t">
212
+ <header class="ws-head"><div><h3 class="ws-title" id="tl-z-t">No replies yet this week</h3></div><div class="ws-segmented" role="radiogroup" aria-label="Show as" data-trend-mode="tl-z"><label class="ws-segmented__item"><input type="radio" name="tl-z-mode" value="bars" checked>Bars</label><label class="ws-segmented__item"><input type="radio" name="tl-z-mode" value="line">Line</label></div></header>
213
+ <div class="ws-card__body">
214
+ <figure class="ws-trend-line ws-trend-line--bars" id="tl-z" style="--n: 5; --ticks: 2;" aria-labelledby="tl-z-t" data-trend-live>
215
+ <div class="ws-trend-line__plot" aria-hidden="true">
216
+ <div class="ws-trend-line__y"><span style="--y: 0%;">10</span><span style="--y: 50%;">5</span><span style="--y: 100%;">0</span></div>
217
+ <div class="ws-trend-line__area">
218
+ <span class="ws-trend-line__rule" style="--y: 0%;"></span><span class="ws-trend-line__rule" style="--y: 50%;"></span>
219
+ <span class="ws-trend-line__draw">
220
+ <span class="ws-trend-line__hatch" style="clip-path: polygon(10% 100%, 30% 100%, 50% 100%, 70% 100%, 90% 100%, 90% 100%, 10% 100%);"></span>
221
+ <svg class="ws-trend-line__lines" viewBox="0 0 100 100" preserveAspectRatio="none" aria-hidden="true"><path d="M10 100 L30 100 L50 100 L70 100 L90 100"/></svg>
222
+ </span>
223
+ <span class="ws-trend-line__point" style="--i: 0; --y: 100%;"></span>
224
+ <span class="ws-trend-line__point" style="--i: 1; --y: 100%;"></span>
225
+ <span class="ws-trend-line__point" style="--i: 2; --y: 100%;"></span>
226
+ <span class="ws-trend-line__point" style="--i: 3; --y: 100%;"></span>
227
+ <span class="ws-trend-line__point" style="--i: 4; --y: 100%;"></span>
228
+ <span class="ws-trend-line__band"></span>
229
+ </div>
230
+ <div class="ws-trend-line__x"><span title="Mon">Mon</span><span title="Tue">Tue</span><span title="Wed">Wed</span><span title="Thu">Thu</span><span title="Fri">Fri</span></div>
231
+ </div>
232
+ <div class="ws-trend-line__table"><table>
233
+ <caption>Replies by day this week</caption>
234
+ <thead><tr><th scope="col">Day</th><th scope="col">Replies</th></tr></thead>
235
+ <tbody><tr><th scope="row">Mon</th><td>0 replies</td></tr><tr><th scope="row">Tue</th><td>0 replies</td></tr><tr><th scope="row">Wed</th><td>0 replies</td></tr><tr><th scope="row">Thu</th><td>0 replies</td></tr><tr><th scope="row">Fri</th><td>0 replies</td></tr></tbody>
236
+ </table></div>
237
+ </figure>
238
+ </div>
239
+ </section>
240
+ <section class="ws-card ws-card--compound" aria-labelledby="tl-f-t">
241
+ <header class="ws-head"><div><h3 class="ws-title" id="tl-f-t">12 sign-ups in the first week</h3></div></header>
242
+ <div class="ws-card__body">
243
+ <figure class="ws-trend-line" id="tl-f" style="--n: 1; --ticks: 2;" aria-labelledby="tl-f-t" data-trend-live>
244
+ <div class="ws-trend-line__plot" aria-hidden="true">
245
+ <div class="ws-trend-line__y"><span style="--y: 0%;">20</span><span style="--y: 50%;">10</span><span style="--y: 100%;">0</span></div>
246
+ <div class="ws-trend-line__area">
247
+ <span class="ws-trend-line__rule" style="--y: 0%;"></span><span class="ws-trend-line__rule" style="--y: 50%;"></span>
248
+ <span class="ws-trend-line__point ws-trend-line__point--now" style="--i: 0; --y: 40%;"></span>
249
+ <span class="ws-trend-line__band"></span>
250
+ </div>
251
+ <div class="ws-trend-line__x"><span class="ws-trend-line__now" title="Week 1">Week 1</span></div>
252
+ </div>
253
+ <div class="ws-trend-line__table"><table>
254
+ <caption>Sign-ups by week</caption>
255
+ <thead><tr><th scope="col">Week</th><th scope="col">Sign-ups</th></tr></thead>
256
+ <tbody><tr><th scope="row">Week 1</th><td>12 sign-ups</td></tr></tbody>
257
+ </table></div>
258
+ </figure>
259
+ </div>
260
+ </section>
261
+ </div>
262
+ </div>
263
+
264
+ <div class="ws-stack" style="max-width: 1194px;">
265
+ <span class="ws-muted">In a tile (--bare): the line or the columns alone in a MetricTile's preview, greyed until the tile wakes</span>
266
+ <div class="ws-metric-tiles">
267
+ <div class="ws-metric-tiles__grid ws-metric-tiles__grid--4">
268
+ <button type="button" class="ws-metric-tile" aria-label="Net revenue retention, 99.9%, on target. Open">
269
+ <span class="ws-metric-tile__surface">
270
+ <span class="ws-metric-tile__head"><span class="ws-metric-tile__label">Net revenue retention</span><svg class="ws-metric-tile__go" viewBox="0 0 16 16" fill="none" aria-hidden="true"><path d="M5 11L11 5M11 5H6M11 5V10" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/></svg></span>
271
+ <span class="ws-metric-tile__value">99.9%</span>
272
+ <span class="ws-metric-tile__preview" aria-hidden="true"><span class="ws-trend-line ws-trend-line--bare" style="--n: 6;" aria-hidden="true">
273
+ <span class="ws-trend-line__plot">
274
+ <span class="ws-trend-line__area">
275
+ <span class="ws-trend-line__draw">
276
+ <svg class="ws-trend-line__lines" viewBox="0 0 100 100" preserveAspectRatio="none" aria-hidden="true"><path d="M8.33 63.33 L25 53.33 L41.67 40 L58.33 60 L75 23.33 L91.67 36.67"/></svg>
277
+ </span>
278
+ <span class="ws-trend-line__point" style="--i: 0; --y: 63.33%;"></span>
279
+ <span class="ws-trend-line__point" style="--i: 1; --y: 53.33%;"></span>
280
+ <span class="ws-trend-line__point" style="--i: 2; --y: 40%;"></span>
281
+ <span class="ws-trend-line__point" style="--i: 3; --y: 60%;"></span>
282
+ <span class="ws-trend-line__point" style="--i: 4; --y: 23.33%;"></span>
283
+ <span class="ws-trend-line__point ws-trend-line__point--now" style="--i: 5; --y: 36.67%;"></span>
284
+ </span>
285
+ </span>
286
+ </span></span>
287
+ </span>
288
+ <span class="ws-metric-tile__foot"><span>Target 100.0%</span><b>100%</b></span>
289
+ </button>
290
+ <button type="button" class="ws-metric-tile" aria-label="Net new ARR, $1.55M, 87% of pace. Open">
291
+ <span class="ws-metric-tile__surface">
292
+ <span class="ws-metric-tile__head"><span class="ws-metric-tile__label">Net new ARR</span><svg class="ws-metric-tile__go" viewBox="0 0 16 16" fill="none" aria-hidden="true"><path d="M5 11L11 5M11 5H6M11 5V10" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/></svg></span>
293
+ <span class="ws-metric-tile__value">$1.55M</span>
294
+ <span class="ws-metric-tile__preview" aria-hidden="true"><span class="ws-trend-line ws-trend-line--bars ws-trend-line--bare" style="--n: 6;" aria-hidden="true">
295
+ <span class="ws-trend-line__plot">
296
+ <span class="ws-trend-line__area">
297
+ <span class="ws-trend-line__draw">
298
+ <span class="ws-trend-line__hatch" style="clip-path: polygon(8.33% 19.33%, 25% 12%, 41.67% 6.67%, 58.33% 28%, 75% 13.33%, 91.67% 40%, 91.67% 100%, 8.33% 100%);"></span>
299
+ <svg class="ws-trend-line__lines" viewBox="0 0 100 100" preserveAspectRatio="none" aria-hidden="true"><path d="M8.33 19.33 L25 12 L41.67 6.67 L58.33 28 L75 13.33 L91.67 40"/></svg>
300
+ </span>
301
+ <span class="ws-trend-line__point" style="--i: 0; --y: 19.33%;"></span>
302
+ <span class="ws-trend-line__point" style="--i: 1; --y: 12%;"></span>
303
+ <span class="ws-trend-line__point" style="--i: 2; --y: 6.67%;"></span>
304
+ <span class="ws-trend-line__point" style="--i: 3; --y: 28%;"></span>
305
+ <span class="ws-trend-line__point" style="--i: 4; --y: 13.33%;"></span>
306
+ <span class="ws-trend-line__point ws-trend-line__point--now" style="--i: 5; --y: 40%;"></span>
307
+ </span>
308
+ </span>
309
+ </span></span>
310
+ </span>
311
+ <span class="ws-metric-tile__foot"><span>Pace $1.78M of $1.87M</span><b>87%</b></span>
312
+ </button>
313
+ </div>
314
+ </div>
315
+ </div>
316
+
317
+ </div>
318
+ <script>
319
+ /* The preview's live parts. Bars / Line: the switch sets --bars on its chart. Replay: a fresh copy of the chart runs
320
+ its build-in again. The reading: pointing at a period (or a tap) places a HoverCard over its point from the
321
+ chart's own table; it pops on the pop spring, follows on the follow spring and goes 180 ms after the pointer leaves. */
322
+ const $$ = (s, el = document) => [...el.querySelectorAll(s)];
323
+ for (const group of $$('[data-trend-mode]')) group.addEventListener('change', (e) => {
324
+ document.getElementById(group.dataset.trendMode).classList.toggle('ws-trend-line--bars', e.target.value === 'bars');
325
+ });
326
+ const live = (fig) => {
327
+ const area = fig.querySelector('.ws-trend-line__area'), rows = $$('tbody tr', fig), n = rows.length;
328
+ let card = null, leave = 0;
329
+ const show = (pt) => {
330
+ clearTimeout(leave);
331
+ const i = Number(pt.style.getPropertyValue('--i')), x = ((i + 0.5) / n) * 100;
332
+ for (const p of $$('.ws-trend-line__point--on', area)) if (p !== pt) p.classList.remove('ws-trend-line__point--on');
333
+ if (!card || card.hasAttribute('data-leaving')) {
334
+ card?.remove();
335
+ card = document.createElement('div');
336
+ card.className = 'ws-hover-card ws-hover-card--above ws-hover-card--follow';
337
+ card.setAttribute('role', 'tooltip');
338
+ card.innerHTML = '<span class="ws-hover-card__eyebrow"><span class="ws-hover-card__swatch" style="--ws-hover-card-swatch: var(--color-text-heading);"></span><span></span></span><span class="ws-hover-card__title"></span>';
339
+ area.append(card);
340
+ }
341
+ card.style.left = x + '%';
342
+ card.style.top = 'calc(' + pt.style.getPropertyValue('--y') + ' - ' + (fig.classList.contains('ws-trend-line--bars') ? '0px' : 'var(--ws-trend-line-dot)') + ')';
343
+ card.classList.toggle('ws-hover-card--start', x < 25);
344
+ card.classList.toggle('ws-hover-card--end', x > 75);
345
+ card.querySelector('.ws-hover-card__eyebrow > span:last-child').textContent = rows[i].querySelector('th').textContent;
346
+ card.querySelector('.ws-hover-card__title').textContent = rows[i].querySelector('td').textContent;
347
+ };
348
+ const hide = () => {
349
+ clearTimeout(leave);
350
+ leave = setTimeout(() => {
351
+ const c = card;
352
+ card = null;
353
+ c?.setAttribute('data-leaving', '');
354
+ setTimeout(() => c?.remove(), 120);
355
+ for (const p of $$('.ws-trend-line__point--on', area)) p.classList.remove('ws-trend-line__point--on');
356
+ }, 180);
357
+ };
358
+ for (const pt of $$('.ws-trend-line__point', area)) {
359
+ pt.addEventListener('pointerenter', (e) => { if (e.pointerType === 'mouse') show(pt); });
360
+ pt.addEventListener('click', () => { pt.classList.add('ws-trend-line__point--on'); show(pt); });
361
+ }
362
+ area.addEventListener('pointerleave', (e) => { if (e.pointerType === 'mouse') hide(); });
363
+ document.addEventListener('pointerdown', (e) => { if (e.pointerType !== 'mouse' && card && !area.contains(e.target)) hide(); });
364
+ };
365
+ for (const fig of $$('[data-trend-live]')) live(fig);
366
+ for (const b of $$('[data-replay]')) b.addEventListener('click', () => {
367
+ const fig = document.getElementById(b.dataset.replay), copy = fig.cloneNode(true);
368
+ fig.replaceWith(copy);
369
+ if (copy.hasAttribute('data-trend-live')) live(copy);
370
+ });
371
+ </script>
372
+ </body>
373
+ </html>