@thewhatmatters/wmds 0.4.29 → 0.4.31

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 (249) hide show
  1. package/CHANGELOG.md +65 -0
  2. package/CONSUMING.md +2 -1
  3. package/dist/components/atoms/Badge/Badge.js +1 -1
  4. package/dist/components/atoms/Badge/badgeStyles.d.ts +1 -1
  5. package/dist/components/atoms/Badge/badgeStyles.js +1 -1
  6. package/dist/components/atoms/Band/Band.d.ts +1 -1
  7. package/dist/components/atoms/Band/Band.d.ts.map +1 -1
  8. package/dist/components/atoms/Band/bandStyles.d.ts +4 -1
  9. package/dist/components/atoms/Band/bandStyles.d.ts.map +1 -1
  10. package/dist/components/atoms/Band/bandStyles.js +1 -1
  11. package/dist/components/atoms/Button/Button.d.ts +22 -4
  12. package/dist/components/atoms/Button/Button.d.ts.map +1 -1
  13. package/dist/components/atoms/Button/Button.js +132 -124
  14. package/dist/components/atoms/Button/buttonStyles.d.ts +3 -1
  15. package/dist/components/atoms/Button/buttonStyles.d.ts.map +1 -1
  16. package/dist/components/atoms/Button/buttonStyles.js +5 -4
  17. package/dist/components/atoms/IconButton/IconButton.d.ts +5 -0
  18. package/dist/components/atoms/IconButton/IconButton.d.ts.map +1 -1
  19. package/dist/components/atoms/IconButton/IconButton.js +4 -3
  20. package/dist/components/atoms/SectionCaption/SectionCaption.d.ts +5 -1
  21. package/dist/components/atoms/SectionCaption/SectionCaption.d.ts.map +1 -1
  22. package/dist/components/atoms/SectionCaption/SectionCaption.js +1 -1
  23. package/dist/components/atoms/TextLink/TextLink.d.ts +10 -2
  24. package/dist/components/atoms/TextLink/TextLink.d.ts.map +1 -1
  25. package/dist/components/atoms/TextLink/TextLink.js +18 -14
  26. package/dist/components/molecules/Accordion/Accordion.d.ts +9 -4
  27. package/dist/components/molecules/Accordion/Accordion.d.ts.map +1 -1
  28. package/dist/components/molecules/Accordion/Accordion.js +58 -51
  29. package/dist/components/molecules/Accordion/accordionStyles.d.ts +5 -0
  30. package/dist/components/molecules/Accordion/accordionStyles.d.ts.map +1 -1
  31. package/dist/components/molecules/Accordion/accordionStyles.js +5 -2
  32. package/dist/components/molecules/Breadcrumb/breadcrumbStyles.d.ts +5 -2
  33. package/dist/components/molecules/Breadcrumb/breadcrumbStyles.d.ts.map +1 -1
  34. package/dist/components/molecules/Breadcrumb/breadcrumbStyles.js +2 -2
  35. package/dist/components/molecules/Field/fieldStyles.d.ts +1 -1
  36. package/dist/components/molecules/Field/fieldStyles.js +1 -1
  37. package/dist/components/molecules/HeroIntro/HeroIntro.d.ts +22 -8
  38. package/dist/components/molecules/HeroIntro/HeroIntro.d.ts.map +1 -1
  39. package/dist/components/molecules/HeroIntro/HeroIntro.js +30 -18
  40. package/dist/components/molecules/HeroIntro/heroIntroStyles.d.ts +19 -3
  41. package/dist/components/molecules/HeroIntro/heroIntroStyles.d.ts.map +1 -1
  42. package/dist/components/molecules/HeroIntro/heroIntroStyles.js +2 -2
  43. package/dist/components/molecules/LinkTile/LinkTile.d.ts +6 -4
  44. package/dist/components/molecules/LinkTile/LinkTile.d.ts.map +1 -1
  45. package/dist/components/molecules/LinkTile/LinkTile.js +29 -29
  46. package/dist/components/molecules/PageHeader/PageHeader.d.ts +8 -1
  47. package/dist/components/molecules/PageHeader/PageHeader.d.ts.map +1 -1
  48. package/dist/components/molecules/PageHeader/PageHeader.js +19 -15
  49. package/dist/components/molecules/TileGrid/tileGridStyles.js +1 -1
  50. package/dist/components/organisms/Carousel/carouselStyles.js +3 -3
  51. package/dist/components/organisms/ChatDock/chatDockStyles.d.ts +4 -0
  52. package/dist/components/organisms/ChatDock/chatDockStyles.d.ts.map +1 -1
  53. package/dist/components/organisms/FooterReveal/FooterReveal.d.ts +4 -2
  54. package/dist/components/organisms/FooterReveal/FooterReveal.d.ts.map +1 -1
  55. package/dist/components/organisms/FooterReveal/FooterReveal.js +85 -85
  56. package/dist/components/organisms/FooterReveal/FooterRevealRuled.d.ts.map +1 -1
  57. package/dist/components/organisms/FooterReveal/FooterRevealRuled.js +49 -50
  58. package/dist/components/organisms/FooterReveal/footerRevealStyles.d.ts +9 -7
  59. package/dist/components/organisms/FooterReveal/footerRevealStyles.d.ts.map +1 -1
  60. package/dist/components/organisms/FooterReveal/footerRevealStyles.js +2 -9
  61. package/dist/components/organisms/IntakeConfirmation/intakeConfirmationStyles.d.ts +2 -1
  62. package/dist/components/organisms/IntakeConfirmation/intakeConfirmationStyles.d.ts.map +1 -1
  63. package/dist/components/organisms/IntakeConfirmation/intakeConfirmationStyles.js +1 -1
  64. package/dist/components/organisms/SiteNav/SiteNav.d.ts +17 -8
  65. package/dist/components/organisms/SiteNav/SiteNav.d.ts.map +1 -1
  66. package/dist/components/organisms/SiteNav/SiteNav.js +310 -256
  67. package/dist/components/organisms/SiteNav/siteNavStyles.d.ts +34 -6
  68. package/dist/components/organisms/SiteNav/siteNavStyles.d.ts.map +1 -1
  69. package/dist/components/organisms/SiteNav/siteNavStyles.js +3 -3
  70. package/dist/components/organisms/SiteNav/useSiteNavMobileMenu.d.ts +17 -0
  71. package/dist/components/organisms/SiteNav/useSiteNavMobileMenu.d.ts.map +1 -0
  72. package/dist/components/organisms/SiteNav/useSiteNavMobileMenu.js +47 -0
  73. package/dist/index.d.ts +2 -2
  74. package/dist/index.d.ts.map +1 -1
  75. package/dist/index.js +107 -107
  76. package/dist/lib/dialogOverlay.d.ts +8 -0
  77. package/dist/lib/dialogOverlay.d.ts.map +1 -1
  78. package/dist/lib/dialogOverlay.js +45 -26
  79. package/dist/lib/motion.d.ts +2 -1
  80. package/dist/lib/motion.d.ts.map +1 -1
  81. package/dist/lib/motion.js +1 -1
  82. package/dist/lib/typography.d.ts +2 -2
  83. package/dist/lib/typography.d.ts.map +1 -1
  84. package/dist/lib/typography.js +14 -3
  85. package/dist/styles.css +1 -1
  86. package/dist/typography.css +46 -11
  87. package/docs/components.md +6 -6
  88. package/docs/exports.json +3 -2
  89. package/docs/patterns/components-accordion--flush.tsx +1 -1
  90. package/docs/patterns/components-appshell--portal-dashboard-pattern.tsx +1 -1
  91. package/docs/patterns/components-avatar--dropdown-row.tsx +1 -1
  92. package/docs/patterns/components-badge--outline-tags.tsx +1 -1
  93. package/docs/patterns/components-badge--status-pill.tsx +1 -1
  94. package/docs/patterns/components-badge--with-avatar.tsx +1 -1
  95. package/docs/patterns/components-band--page-in-bands.tsx +1 -1
  96. package/docs/patterns/components-breadcrumb--editorial.tsx +1 -1
  97. package/docs/patterns/components-breadcrumb--long-path.tsx +1 -1
  98. package/docs/patterns/components-breadcrumb--path.tsx +1 -1
  99. package/docs/patterns/components-breadcrumb--router-links.tsx +1 -1
  100. package/docs/patterns/components-button-button--copy-button.tsx +1 -1
  101. package/docs/patterns/components-button-button--destructive-action.tsx +1 -1
  102. package/docs/patterns/components-button-button--external-link.tsx +1 -1
  103. package/docs/patterns/components-button-button--ghost-action.tsx +1 -1
  104. package/docs/patterns/components-button-button--inverse-action.tsx +1 -1
  105. package/docs/patterns/components-button-button--link-render.tsx +1 -1
  106. package/docs/patterns/components-button-button--multi-state-badge.tsx +1 -1
  107. package/docs/patterns/components-button-button--outline-mono.tsx +1 -1
  108. package/docs/patterns/components-button-button--primary-action.tsx +1 -1
  109. package/docs/patterns/components-button-button--row-hug.tsx +1 -1
  110. package/docs/patterns/components-button-button--row-layout.tsx +1 -1
  111. package/docs/patterns/components-button-button--secondary-action.tsx +1 -1
  112. package/docs/patterns/components-button-button--suggestion-pills.tsx +1 -1
  113. package/docs/patterns/components-button-button--with-count.tsx +1 -1
  114. package/docs/patterns/components-button-button--with-icon.tsx +1 -1
  115. package/docs/patterns/components-button-floatingactionbutton--vertical-actions.tsx +1 -1
  116. package/docs/patterns/components-calembed--pattern-skip-in-footer.tsx +1 -1
  117. package/docs/patterns/components-card-card--body-slot-occupancy-history.tsx +1 -1
  118. package/docs/patterns/components-card-card--headerless-media.tsx +1 -1
  119. package/docs/patterns/components-card-card--outlined-layout.tsx +1 -1
  120. package/docs/patterns/components-card-card--pinned-height.tsx +1 -1
  121. package/docs/patterns/components-card-card--terminal-frame.tsx +1 -1
  122. package/docs/patterns/components-card-selectablecard--selectable-cards-pattern.tsx +1 -1
  123. package/docs/patterns/components-carousel--image-carousel.tsx +1 -1
  124. package/docs/patterns/components-chart--audience-activity-heatmap.tsx +1 -1
  125. package/docs/patterns/components-chart--cartesian-no-data-gaps.tsx +1 -1
  126. package/docs/patterns/components-chart--occupancy-history-in-card.tsx +1 -1
  127. package/docs/patterns/components-chart--occupancy-in-card.tsx +1 -1
  128. package/docs/patterns/components-chart--post-reach-distribution.tsx +1 -1
  129. package/docs/patterns/components-chart--ranked-audience-breakdown.tsx +1 -1
  130. package/docs/patterns/components-chart--revenue-by-line.tsx +1 -1
  131. package/docs/patterns/components-chart--segmented-ring-pattern.tsx +1 -1
  132. package/docs/patterns/components-chart--unit-grid-composition.tsx +1 -1
  133. package/docs/patterns/components-chatdock--pattern-chat-dock.tsx +1 -1
  134. package/docs/patterns/components-chatdock--pattern-start-project-gate.tsx +1 -1
  135. package/docs/patterns/components-chatqa--pattern-qa-with-reply.tsx +1 -1
  136. package/docs/patterns/components-checkbox-checkbox--default.tsx +1 -1
  137. package/docs/patterns/components-checkbox-checkbox--with-count.tsx +1 -1
  138. package/docs/patterns/components-checkbox-checkbox--with-description.tsx +1 -1
  139. package/docs/patterns/components-checkbox-checkboxgroup--default.tsx +1 -1
  140. package/docs/patterns/components-checkbox-checkboxgroup--option-counts.tsx +1 -1
  141. package/docs/patterns/components-copyfield--clipboard-blocked.tsx +1 -1
  142. package/docs/patterns/components-copyfield--copied.tsx +1 -1
  143. package/docs/patterns/components-copyfield--copy-key.tsx +1 -1
  144. package/docs/patterns/components-copyfield--on-navy.tsx +1 -1
  145. package/docs/patterns/components-descriptionlist--details.tsx +1 -1
  146. package/docs/patterns/components-descriptionlist--post-metadata.tsx +1 -1
  147. package/docs/patterns/components-dialog--alert-dialog-destructive.tsx +1 -1
  148. package/docs/patterns/components-dialog--alert-dialog-typed-confirmation.tsx +1 -1
  149. package/docs/patterns/components-dialog--default-dialog.tsx +1 -1
  150. package/docs/patterns/components-dialog--form-dialog.tsx +1 -1
  151. package/docs/patterns/components-displaycontrols--page-utilities.tsx +1 -1
  152. package/docs/patterns/components-displaycontrols--theme-switch.tsx +1 -1
  153. package/docs/patterns/components-field--horizontal-input.tsx +1 -1
  154. package/docs/patterns/components-field--horizontal-text-area.tsx +1 -1
  155. package/docs/patterns/components-field--multi-control.tsx +1 -1
  156. package/docs/patterns/components-filterpanel--panel.tsx +1 -1
  157. package/docs/patterns/components-footerreveal--marketing-hero-pattern.tsx +6 -6
  158. package/docs/patterns/components-footerreveal--marketing-hero-ruled-pattern.tsx +2 -2
  159. package/docs/patterns/components-footerreveal--marketing-hero-with-gallery-intro.tsx +6 -6
  160. package/docs/patterns/components-footerreveal--marketing-page-pattern.tsx +5 -5
  161. package/docs/patterns/components-footerreveal--ruled-grid-footer-pattern.tsx +2 -2
  162. package/docs/patterns/components-footerreveal--sequenced-marketing-hero.tsx +5 -5
  163. package/docs/patterns/components-herointro--two-line-intro.tsx +3 -3
  164. package/docs/patterns/components-herointro--with-actions.tsx +22 -0
  165. package/docs/patterns/components-herotilestack--marketing-hero-pattern.tsx +3 -3
  166. package/docs/patterns/components-herotilestack--marketing-hero-text-sequence.tsx +2 -2
  167. package/docs/patterns/components-herotilestack--marketing-hero-with-gallery-intro.tsx +3 -3
  168. package/docs/patterns/components-indexlist--post-index.tsx +1 -1
  169. package/docs/patterns/components-intakeconfirmation--booked-pattern.tsx +1 -1
  170. package/docs/patterns/components-intakeconfirmation--emailed-pattern.tsx +1 -1
  171. package/docs/patterns/components-intakeform--about-you-pattern.tsx +1 -1
  172. package/docs/patterns/components-intakeform--short-form-pattern.tsx +1 -1
  173. package/docs/patterns/components-intakemodal--intake-modal-pattern.tsx +1 -1
  174. package/docs/patterns/components-kbd--command-row.tsx +1 -1
  175. package/docs/patterns/components-kbd--numbered-choices.tsx +1 -1
  176. package/docs/patterns/components-kbd--shortcut.tsx +1 -1
  177. package/docs/patterns/components-linktile--resource-tile.tsx +2 -2
  178. package/docs/patterns/components-linktile--router-link.tsx +1 -1
  179. package/docs/patterns/components-logview--detail-pane.tsx +1 -1
  180. package/docs/patterns/components-logview--log-viewer.tsx +1 -1
  181. package/docs/patterns/components-moremenu--action-menu.tsx +1 -1
  182. package/docs/patterns/components-moremenu--in-card-header.tsx +1 -1
  183. package/docs/patterns/components-navlist--app-sidebar.tsx +1 -1
  184. package/docs/patterns/components-navlist--side-nav-settings.tsx +1 -1
  185. package/docs/patterns/components-pageheader--app-header-pattern.tsx +1 -1
  186. package/docs/patterns/components-pageheader--page-section-header.tsx +1 -1
  187. package/docs/patterns/components-pageheader--toolbar-header.tsx +1 -1
  188. package/docs/patterns/components-panel--end-detail-rail.tsx +1 -1
  189. package/docs/patterns/components-pillgroup--pill-group-pattern.tsx +1 -1
  190. package/docs/patterns/components-promptbar--pattern-prompt-bar.tsx +1 -1
  191. package/docs/patterns/components-prose--article-body.tsx +1 -1
  192. package/docs/patterns/components-radio-radiogroup--default.tsx +1 -1
  193. package/docs/patterns/components-scrollhorizontal--project-gallery-pattern.tsx +1 -1
  194. package/docs/patterns/components-scrollhorizontal--with-intro.tsx +1 -1
  195. package/docs/patterns/components-sectioncaption--column-caption.tsx +1 -1
  196. package/docs/patterns/components-sectioncaption--with-action.tsx +1 -1
  197. package/docs/patterns/components-sheet--bottom-sheet.tsx +1 -1
  198. package/docs/patterns/components-sheet--end-sheet.tsx +1 -1
  199. package/docs/patterns/components-sheet--side-sheet-header-actions.tsx +1 -1
  200. package/docs/patterns/components-sheet--side-sheet-url-deep-link.tsx +1 -1
  201. package/docs/patterns/components-sheet--side-sheet.tsx +1 -1
  202. package/docs/patterns/components-sitenav--brand-and-cta.tsx +1 -1
  203. package/docs/patterns/components-sitenav--centered-links.tsx +1 -1
  204. package/docs/patterns/components-sitenav--compact.tsx +1 -1
  205. package/docs/patterns/components-sitenav--marketing-header.tsx +2 -1
  206. package/docs/patterns/components-sitenav--mega-menu.tsx +1 -1
  207. package/docs/patterns/components-stat--hero-stat.tsx +1 -1
  208. package/docs/patterns/components-stat--insights-row.tsx +1 -1
  209. package/docs/patterns/components-stepprogress--step-progress-pattern.tsx +1 -1
  210. package/docs/patterns/components-switch--default.tsx +1 -1
  211. package/docs/patterns/components-switch--settings-row.tsx +1 -1
  212. package/docs/patterns/components-tab--settings-pages.tsx +1 -1
  213. package/docs/patterns/components-table--approvals-with-sheet.tsx +1 -1
  214. package/docs/patterns/components-table--approvals.tsx +3 -3
  215. package/docs/patterns/components-table--basic.tsx +1 -1
  216. package/docs/patterns/components-taskrows--action-details.tsx +1 -1
  217. package/docs/patterns/components-taskrows--capsules.tsx +1 -1
  218. package/docs/patterns/components-taskrows--card-with-status-rows.tsx +1 -1
  219. package/docs/patterns/components-taskrows--controlled-expand.tsx +1 -1
  220. package/docs/patterns/components-taskrows--custom-slots.tsx +1 -1
  221. package/docs/patterns/components-taskrows--needs-you-table.tsx +1 -1
  222. package/docs/patterns/components-taskrows--status-list.tsx +1 -1
  223. package/docs/patterns/components-taskrows--tag-chips.tsx +1 -1
  224. package/docs/patterns/components-textarea--save-status.tsx +1 -1
  225. package/docs/patterns/components-textlink--external-destination.tsx +1 -1
  226. package/docs/patterns/components-textlink--inline-prose.tsx +1 -1
  227. package/docs/patterns/components-textlink--quiet-title.tsx +1 -1
  228. package/docs/patterns/components-textlink--supporting-copy.tsx +1 -1
  229. package/docs/patterns/components-textsequence--default.tsx +1 -1
  230. package/docs/patterns/components-textsequence--reduced-motion.tsx +1 -1
  231. package/docs/patterns/components-textsequence--shapes.tsx +2 -2
  232. package/docs/patterns/components-tilegrid--masonry.tsx +2 -2
  233. package/docs/patterns/components-toast--stacked-notifications.tsx +1 -1
  234. package/docs/patterns/components-tooltip--controlled.tsx +1 -1
  235. package/docs/patterns/components-tooltip--disabled-control.tsx +1 -1
  236. package/docs/patterns/components-tooltip--icon-action.tsx +1 -1
  237. package/docs/patterns/components-tooltip--keyboard-shortcut.tsx +1 -1
  238. package/docs/patterns/components-tooltip--placement.tsx +1 -1
  239. package/docs/patterns/foundations-scroll-fade--horizontal-rail.tsx +1 -1
  240. package/docs/patterns/foundations-scroll-fade--overflowing-list.tsx +1 -1
  241. package/docs/patterns/guides-chart-explorations--comparison-gallery.tsx +1 -1
  242. package/docs/patterns/guides-filter-panel--filtered-grid.tsx +4 -4
  243. package/docs/patterns/guides-filter-panel--filtered-index.tsx +3 -3
  244. package/docs/patterns/guides-overlay-flows--notification-preferences.tsx +1 -1
  245. package/docs/patterns/guides-post-page--post-page.tsx +3 -3
  246. package/docs/patterns/guides-profile-typography--editorial-profile.tsx +6 -6
  247. package/docs/patterns/guides-resource-detail--detail.tsx +2 -2
  248. package/docs/patterns/index.json +9 -1
  249. package/package.json +1 -1
@@ -66,8 +66,8 @@
66
66
  var(--text-display-1-size-max)
67
67
  );
68
68
  --text-display-1-weight: var(--font-weight-bold);
69
- --text-display-1-leading: 1.15;
70
- --text-display-1-tracking: -0.04em;
69
+ --text-display-1-leading: 1.05;
70
+ --text-display-1-tracking: -0.03em;
71
71
 
72
72
  --text-display-2-size-min: 2rem;
73
73
  --text-display-2-size-max: 3.15rem;
@@ -77,7 +77,8 @@
77
77
  var(--text-display-2-size-max)
78
78
  );
79
79
  --text-display-2-weight: var(--font-weight-semibold);
80
- --text-display-2-leading: 1.2;
80
+ --text-display-2-leading: 1.1;
81
+ --text-display-2-tracking: -0.02em;
81
82
 
82
83
  --text-display-3-size-min: 1.5rem;
83
84
  --text-display-3-size-max: 2.1875rem;
@@ -87,7 +88,8 @@
87
88
  var(--text-display-3-size-max)
88
89
  );
89
90
  --text-display-3-weight: var(--font-weight-semibold);
90
- --text-display-3-leading: 1.24;
91
+ --text-display-3-leading: 1.15;
92
+ --text-display-3-tracking: -0.01em;
91
93
 
92
94
  /**
93
95
  * Hero — the one oversized moment on a marketing page (a poster headline). Fluid to 16vw:
@@ -97,7 +99,7 @@
97
99
  --text-display-hero-size: clamp(3.5rem, 16vw, 16rem);
98
100
  --text-display-hero-weight: var(--font-weight-bold);
99
101
  --text-display-hero-leading: 0.92;
100
- --text-display-hero-tracking: -0.04em;
102
+ --text-display-hero-tracking: -0.03em;
101
103
 
102
104
  /** XL — big statement rows under a hero (section titles, price rows): 44px → 136px. */
103
105
  --text-display-xl-size: clamp(2.75rem, 9vw, 8.5rem);
@@ -105,9 +107,19 @@
105
107
  --text-display-xl-leading: 0.9;
106
108
  --text-display-xl-tracking: -0.03em;
107
109
 
110
+ /**
111
+ * Lead — the one paragraph under a page's H1 that sums the page up (Lead paragraph rule L7):
112
+ * about 1.2–1.3× the 17px reading body, regular weight. 18px on phones → 21px from about 1000px.
113
+ * Pair it with the 42rem measure (about 62 characters a line at 21px).
114
+ */
115
+ --text-lead-size: clamp(1.125rem, calc(1rem + 0.5vw), 1.3125rem);
116
+ --text-lead-weight: var(--font-weight-normal);
117
+ --text-lead-leading: 1.45;
118
+
108
119
  /* Body & UI */
109
120
  --text-large-size: var(--font-size-lg);
110
- --text-large-weight: var(--font-weight-semibold);
121
+ /* Subtext at 1.5rem and below is regular, not bold (Randy, 2026-10-26). A knob: apps may set it. */
122
+ --text-large-weight: var(--font-weight-normal);
111
123
  --text-large-leading: 1.4118;
112
124
 
113
125
  --text-body-size: var(--font-size-base);
@@ -151,7 +163,7 @@
151
163
  --text-eyebrow-size: var(--font-size-sm);
152
164
  --text-eyebrow-weight: var(--font-weight-normal);
153
165
  --text-eyebrow-leading: 1.3333;
154
- --text-eyebrow-tracking: 0.05em;
166
+ --text-eyebrow-tracking: 0.08em; /* Capitals take 0.08–0.12em (Eyebrow rule E3). */
155
167
 
156
168
  /** WMDS extension — fixed-height control shells (Button, Chip, Input). Phase 4 migrates atoms here. */
157
169
  --text-control-size: var(--font-size-base);
@@ -165,28 +177,32 @@
165
177
  * With no fallback (display-2/3 tracking, case), an unset knob leaves the inherited value alone.
166
178
  */
167
179
  @utility type-display-hero {
180
+ /* A long word breaks rather than widen its flex or grid track (Display rule D5, WCAG 1.4.10). */
181
+ overflow-wrap: anywhere;
168
182
  font-family: var(--font-display, var(--font-family-heading));
169
183
  font-size: var(--text-display-hero-size);
170
184
  font-weight: var(--font-display-weight, var(--text-display-hero-weight));
171
185
  line-height: var(--text-display-hero-leading);
172
186
  letter-spacing: var(--font-display-tracking, var(--text-display-hero-tracking));
173
187
  text-transform: var(--font-display-case);
174
- overflow-wrap: break-word;
175
188
  text-wrap: balance;
176
189
  }
177
190
 
178
191
  @utility type-display-xl {
192
+ /* A long word breaks rather than widen its flex or grid track (Display rule D5, WCAG 1.4.10). */
193
+ overflow-wrap: anywhere;
179
194
  font-family: var(--font-display, var(--font-family-heading));
180
195
  font-size: var(--text-display-xl-size);
181
196
  font-weight: var(--font-display-weight, var(--text-display-xl-weight));
182
197
  line-height: var(--text-display-xl-leading);
183
198
  letter-spacing: var(--font-display-tracking, var(--text-display-xl-tracking));
184
199
  text-transform: var(--font-display-case);
185
- overflow-wrap: break-word;
186
200
  text-wrap: balance;
187
201
  }
188
202
 
189
203
  @utility type-display-1 {
204
+ /* A long word breaks rather than widen its flex or grid track (Display rule D5, WCAG 1.4.10). */
205
+ overflow-wrap: anywhere;
190
206
  font-family: var(--font-display, var(--font-family-heading));
191
207
  font-size: var(--text-display-1-size);
192
208
  font-weight: var(--font-display-weight, var(--text-display-1-weight));
@@ -196,20 +212,24 @@
196
212
  }
197
213
 
198
214
  @utility type-display-2 {
215
+ /* A long word breaks rather than widen its flex or grid track (Display rule D5, WCAG 1.4.10). */
216
+ overflow-wrap: anywhere;
199
217
  font-family: var(--font-display, var(--font-family-heading));
200
218
  font-size: var(--text-display-2-size);
201
219
  font-weight: var(--font-display-weight, var(--text-display-2-weight));
202
220
  line-height: var(--text-display-2-leading);
203
- letter-spacing: var(--font-display-tracking);
221
+ letter-spacing: var(--font-display-tracking, var(--text-display-2-tracking));
204
222
  text-transform: var(--font-display-case);
205
223
  }
206
224
 
207
225
  @utility type-display-3 {
226
+ /* A long word breaks rather than widen its flex or grid track (Display rule D5, WCAG 1.4.10). */
227
+ overflow-wrap: anywhere;
208
228
  font-family: var(--font-display, var(--font-family-heading));
209
229
  font-size: var(--text-display-3-size);
210
230
  font-weight: var(--font-display-weight, var(--text-display-3-weight));
211
231
  line-height: var(--text-display-3-leading);
212
- letter-spacing: var(--font-display-tracking);
232
+ letter-spacing: var(--font-display-tracking, var(--text-display-3-tracking));
213
233
  text-transform: var(--font-display-case);
214
234
  }
215
235
 
@@ -255,11 +275,22 @@
255
275
  line-height: var(--text-heading-6-leading);
256
276
  }
257
277
 
278
+ @utility type-lead {
279
+ font-family: var(--font-family-body);
280
+ font-size: var(--text-lead-size);
281
+ font-weight: var(--text-lead-weight);
282
+ line-height: var(--text-lead-leading);
283
+ /* No lone word on the last line (orphans); an explicit text-balance or text-wrap utility still wins. */
284
+ text-wrap: pretty;
285
+ }
286
+
258
287
  @utility type-large {
259
288
  font-family: var(--font-family-body);
260
289
  font-size: var(--text-large-size);
261
290
  font-weight: var(--text-large-weight);
262
291
  line-height: var(--text-large-leading);
292
+ /* No lone word on the last line (orphans); an explicit text-balance or text-wrap utility still wins. */
293
+ text-wrap: pretty;
263
294
  }
264
295
 
265
296
  @utility type-body {
@@ -267,6 +298,8 @@
267
298
  font-size: var(--text-body-size);
268
299
  font-weight: var(--text-body-weight);
269
300
  line-height: var(--text-body-leading);
301
+ /* No lone word on the last line (orphans); an explicit text-balance or text-wrap utility still wins. */
302
+ text-wrap: pretty;
270
303
  }
271
304
 
272
305
  @utility type-label {
@@ -302,6 +335,8 @@
302
335
  font-size: var(--text-reading-size);
303
336
  font-weight: var(--text-reading-weight);
304
337
  line-height: var(--text-reading-leading);
338
+ /* No lone word on the last line (orphans); an explicit text-balance or text-wrap utility still wins. */
339
+ text-wrap: pretty;
305
340
  }
306
341
 
307
342
  @utility type-eyebrow {
@@ -1,18 +1,18 @@
1
1
  # @thewhatmatters/wmds — component contracts
2
2
 
3
- Version 0.4.29. Generated from the WMDS repository's AGENTS.md (Storybook-first) by `scripts/generate-package-docs.mjs` — do not edit here.
3
+ Version 0.4.31. Generated from the WMDS repository's AGENTS.md (Storybook-first) by `scripts/generate-package-docs.mjs` — do not edit here.
4
4
 
5
5
  Storybook paths such as **Components/Button/Button → Pattern — …** name a story; its Show code is in `patterns/` (see `patterns/index.json`). Longer contracts for FooterReveal, HeroTileStack, TextSequence, ScrollHorizontal, RiveHand, and PromptBar are in `component-contracts.md`. ADR numbers refer to decision records in the WMDS repository.
6
6
 
7
7
  - **Theme** lives in `src/theme/` — `colors.css` (semantic roles) + `theme.css` (Tailwind `@theme` bridge). Storybook is the source of truth, not Paper.
8
8
  - **Dark mode:** `[data-theme="dark"]` on `<html>` or any ancestor — same token names, swapped values in `colors.css`.
9
9
  - **Consuming apps:** use exported components and typed props; `className` for layout only — not re-theming. Page layout utilities (`gap`, `grid`, `max-w`) are fine between components.
10
- - **Theme tokens:** Semantic roles in **`src/theme/colors.css`**; typography in **`src/theme/typography.css`** (`type-*` utilities, geometric scale; **display-1/2/3** are fluid via `clamp` — display-1 hits **5rem** on desktop and scales down to **2.5rem** on mobile; above them **`type-display-hero`** (the one oversized moment, to 16vw) and **`type-display-xl`** (statement rows); every display step reads the brand-kit knobs `--font-display*`, CONSUMING.md → Brand kit); motion in **`src/theme/motion.css`**; page spine in **`src/theme/grid.css`** (`--grid-*`, `grid-page` / `band`, `--leading-base`). **`--spacing` stays 4px** — do not re-scale; baseline is 8px. See **ADR-0007**, **ADR-0008**, **ADR-0009**, **ADR-0010**, **DESIGN.md → Grid**. Use **`typographyClass()`** — not raw `text-sm` in document copy. **`type-eyebrow`** (`typographyClass("eyebrow")`) is the small uppercase mono caption for editorial labels — **SectionCaption**, **IndexList** captions, **DescriptionList** `variant="mono"` names; write the text in sentence case — the "/" marker comes from the component, `aria-hidden`. Not for app UI section labels (`overline`) or secondary text (`caption`). **`type-caption`** (`typographyClass("caption-tight")`, 12px on a 16px line) is a single line directly under a label — **LinkTile**'s meta line only, for now; never wrapped text, which stays on `caption` (`type-supporting`, 12px on 20px). **`type-reading`** (`typographyClass("reading")`, 17px at a 28px line) is long-form article text — **Prose** sets it; UI copy stays on `type-body`. A dotted hairline is **DescriptionList** `rule="dotted"`. See **ADR-0040**, **ADR-0041**.
10
+ - **Theme tokens:** Semantic roles in **`src/theme/colors.css`**; typography in **`src/theme/typography.css`** (`type-*` utilities, geometric scale; **display-1/2/3** are fluid via `clamp` — display-1 hits **5rem** on desktop and scales down to **2.5rem** on mobile; above them **`type-display-hero`** (the one oversized moment, to 16vw) and **`type-display-xl`** (statement rows); every display step reads the brand-kit knobs `--font-display*`, CONSUMING.md → Brand kit); motion in **`src/theme/motion.css`**; page spine in **`src/theme/grid.css`** (`--grid-*`, `grid-page` / `band`, `--leading-base`). **`--spacing` stays 4px** — do not re-scale; baseline is 8px. See **ADR-0007**, **ADR-0008**, **ADR-0009**, **ADR-0010**, **DESIGN.md → Grid**. Use **`typographyClass()`** — not raw `text-sm` in document copy. **`type-eyebrow`** (`typographyClass("eyebrow")`) is the small uppercase mono caption for editorial labels — **SectionCaption**, **IndexList** captions, **DescriptionList** `variant="mono"` names; write the text in sentence case — the "/" marker comes from the component, `aria-hidden`. Not for app UI section labels (`overline`) or secondary text (`caption`). **`type-caption`** (`typographyClass("caption-tight")`, 12px on a 16px line) is a single line directly under a label — **LinkTile**'s meta line only, for now; never wrapped text, which stays on `caption` (`type-supporting`, 12px on 20px). **`type-lead`** (`typographyClass("lead")`, 18px → 21px, regular) is the one lead paragraph under a page H1, `text-fg`, 42rem measure — never on every section (section intros stay body size). **`type-reading`** (`typographyClass("reading")`, 17px at a 28px line) is long-form article text — **Prose** sets it; UI copy stays on `type-body`. A dotted hairline is **DescriptionList** `rule="dotted"`. See **ADR-0040**, **ADR-0041**.
11
11
  - **Page layout:** Every Storybook **Guides** page and consuming product page starts on **`grid-page`**; use **`band`** + responsive column spans for content alignment. Constrain a specific experience by overriding **`--grid-max`** on that wrapper (for example, `960px`) rather than replacing the grid with an arbitrary centered container.
12
12
  - **Scroll fade:** use **`scroll-fade-y`** / **`scroll-fade-x`** on the element that owns overflow to hint at clipped list or rail content. The mask is scroll-aware, disappears when no overflow exists in supporting browsers, and follows inline direction for RTL. Keep the surface fill/border on a wrapper; customize with `--scroll-fade-size` only when the default 12% / 40px cap does not fit. Copy **Foundations → Scroll fade → Pattern — …**.
13
13
  - **Motion:** Duration tiers in **`src/theme/motion.css`** — **fast** (hover/focus), **medium** (panels/layout), **slow** (rare). Single **`--ease-standard`**. CSS via `motionTransition()`; Motion via `motionTransitionProp()`. Choreography tokens `--motion-stagger`, `--motion-beat`, `--motion-blur-reveal` through `motionStaggerSeconds()`, `motionBeatSeconds(n)`, `motionBlurReveal(reduce)`, and `readMotionDurationSeconds(tier)` — Show code never hard-codes a blur, stagger, or duration. See **ADR-0008**. Storybook wraps `<MotionConfig reducedMotion="user">`.
14
14
  - **Icons:** **[Lucide](https://lucide.dev/icons/) only** until further notice — import from **`lucide-react`** in components, stories, and examples. Peer dependency, not bundled; use `stroke-current` / `ButtonIcon` for sizing. See **Foundations → Icons**.
15
- - **Button:** pill by default; **`layout="row"`** for flat full-width detail/settings lines (**`width="hug"`** sizes a row to its content with a tight gap — inline disclosure triggers); **`align="start"`** left-aligns a pill label and **`emphasis="quiet"`** puts `role="outline"` on the `border-border` hairline (full-width suggestion pills — **Pattern — suggestion pills**); **`layout="nav"`** for **NavList** rows (`selected`; `render` makes the row a link, the same as a pill). Seven **roles** (`primary`, `secondary`, `ghost`, `destructive`, **`inverse`** — surface fill and brand text, for a brand-blue field, **`outline`** — hairline border and transparent fill, **`inverse-outline`** — on-brand hairline and transparent fill, for that same navy field). Patterns: action, **`row`**, **`nav`**, `icon`, `count`, `status` morph, **`mono`** + **`endIcon`** (accent arrow square) — mutually exclusive where documented. **`status` with `icon`**: the icon morphs into the status glyph — **Pattern — copy button** (`icon={<Copy />}`, `statusLabels`, hold with **`buttonStatusHoldMs`**; the pill's live region announces the result). **`external`** with `render={<a href />}`: new tab, safe `rel`, spoken "(opens in a new tab)", **TextLink**'s trailing icon (`externalIcon={false}` drops it) — **Pattern — external link**; never hand-write `target` or the new-tab text. The shell sets its own case, so a caps-styled parent does not capitalize a label. No slots. [Motion reference](https://motion.dev/examples/react-multi-state-badge).
15
+ - **Button:** pill by default; **`layout="row"`** for flat full-width detail/settings lines (**`width="hug"`** sizes a row to its content with a tight gap — inline disclosure triggers); **`align="start"`** left-aligns a pill label and **`emphasis="quiet"`** puts `role="outline"` on the `border-border` hairline (full-width suggestion pills — **Pattern — suggestion pills**); **`layout="nav"`** for **NavList** rows (`selected`; `render` makes the row a link, the same as a pill). Seven **roles** (`primary`, `secondary`, `ghost`, `destructive`, **`inverse`** — surface fill and brand text, for a brand-blue field, **`outline`** — hairline border and transparent fill, **`inverse-outline`** — on-brand hairline and transparent fill, for that same navy field). Patterns: action, **`row`**, **`nav`**, `icon`, `count`, `status` morph, **`mono`** + **`endIcon`** (accent arrow square) — mutually exclusive where documented. **`status` with `icon`**: the icon morphs into the status glyph — **Pattern — copy button** (`icon={<Copy />}`, `statusLabels`, hold with **`buttonStatusHoldMs`**; the pill's live region announces the result). **`external`** with `render={<a href />}`: new tab, safe `rel`, spoken "(opens in a new tab)", **TextLink**'s trailing icon (`externalIcon={false}` drops it) — **Pattern — external link**; never hand-write `target` or the new-tab text. The shell sets its own case, so a caps-styled parent does not capitalize a label. No slots. [Motion reference](https://motion.dev/examples/react-multi-state-badge). **`disabled`** is `aria-disabled` (stays in the tab order, ignores presses, 70% dim, no hover or press feedback); pass **`disabledReason`** to show why beside it. Prefer an enabled button plus an error on submit (Buttons rule U6).
16
16
  - **Avatar:** circular identity — required `name`, optional `src`, initials → **User** fallback; sizes `xsm` / `sm` / `md` (default) / `lg` / `xl` (20–128px). Optional `presence={{ tone, label, pulsing? }}` — rim dot via **Status** dot tokens (not the **Status** component). **`avatarSizeForCluster()`** for header rows; **`size="sm"`** in **Dropdown.Item** `start`. Not clickable — wrap at call site. Agents: copy **Components/Avatar → Pattern — …**; see **ADR-0017**.
17
17
  - **IconButton:** circular icon-only control. Patterns: toolbar (ghost), `fab`, `loading`, native `title`, **`inset`** (compact dismiss inside Chip), **`render={<a/>}`** (circular brand / icon links), **`pressed`** (toggle — `aria-pressed`, pressed fill and a filled glyph while on; votes, stars). Compose **Tooltip** for tokenized hover/focus labels and pass `title=""` to avoid duplicate native UI. **`aria-label` required** — use `Button` when text is needed.
18
18
  - **Kbd:** semantic keyboard keycap — one physical key per **Kbd**; compose multiple keycaps for shortcuts. Sizes `sm` | `md`; add `aria-label` when symbolic labels need spoken expansion. Display-only — never interactive on the keycap itself. Numbered choice rows pair trailing **Kbd** digits with **`useKbdChoiceKeys`** so `1`–`9` select the same way a click does while focus is not in text entry (a focused checkbox or radio still takes digits); pass `scope` (a ref) to act only while focus is inside that element, as in a chat gate (see **Pattern — numbered choice keys**). Copy **Components/Kbd → Pattern — keyboard shortcut**.
@@ -29,7 +29,7 @@ Storybook paths such as **Components/Button/Button → Pattern — …** name a
29
29
  - **ScrollHorizontal:** marketing gallery directly under the hero — `items`, optional `heading`, `intro` (**`ScrollHorizontal.Intro`**), `expandLast`, `expanded`; `className` on the root only. A sticky window translates the row from the first card to the last; `expandLast` then grows the last tile to full bleed. Reduced motion is a native horizontal scroller. Paste **Components/ScrollHorizontal → Pattern — project gallery**. See **ADR-0036**. Full contract: **docs/component-contracts.md → ScrollHorizontal**.
30
30
  - **Carousel:** a row of items to drag, scroll, or step through, with a progress scrubber under it — **Carousel.Item** children (any content; direct children, one per item) and a required `aria-label` or `aria-labelledby` (do not give a wrapping `section` the same name). The row is a native scroller: touch, trackpad, and shift-wheel move it; a mouse drags it, with a glide and a soft stop at each end; it does not loop. `itemWidth` is a percentage of the row — one number or `{ base, sm, md, lg }` (default `{ base: 80, sm: 55, lg: 40 }`; keep it under 100 so the next item shows); the gap is the grid gutter. `snap` (default on) rests on an item's leading edge. `bleed` runs the row to the page edges while items still start on the grid. `fade` (default on) fades clipped items the way `scroll-fade-x` does. `progress` is `center` (default) / `start` (a shorter track, full width on phones) / `full` / `none`: the filled part's place is the row's progress and its width the share of the row in view; drag it, or press the track; 44px hit area; it hides itself, keeping its space, while every item fits. Keyboard: the row is the tab stop — Left and Right move one item, Home and End go to the ends (arrows swap in RTL); Tab reaches links inside items and scrolls them into view. The scrubber is `aria-hidden` and not a tab stop. Each item is a group named by its place ("2 of 4"; `labels.item`). A drag never clicks a link inside an item. Reduced motion: no glide; moves are immediate. Server render: the row at its start, the scrubber at zero. No previous / next buttons. **`counter`** (default off) adds a visible "1 of 6" (`labels.counter`; polite live region; hidden while every item fits); **`onIndexChange(index, count)`** (0-based, the resting item) feeds a count shown elsewhere; **`activeIndex`** moves the row to an item. `className` is layout only. Not a gallery driven by page scroll (**ScrollHorizontal**). Paste **Components/Carousel → Pattern — image carousel**. See **ADR-0043**.
31
31
  - **RiveHand:** decorative hand on the marketing headline (`@rive-app/react-canvas`) — `hand` (`point` \| `rock`), `size`, `inline`, `active`, `idle`, `entrance`; `aria-hidden` by default. Apps serve two files beside each other: `/rive/interactive-icon-set.riv` and `/rive/rive.wasm` (`riveHandWasmSrc`, copied from `node_modules/@rive-app/canvas/rive.wasm`). Reduced motion draws one static frame. Paste **Components/HeroTileStack → Pattern — marketing hero**. See **ADR-0034**. Full contract: **docs/component-contracts.md → RiveHand**.
32
- - **SiteNav:** marketing site header — `start` | `middle` | `end` slots; **page chrome** (`placement="fixed"`, optional `scrollContainer`) vs **specimen** (`placement="inline"`); expanded is **in flow** (scrolls away); after scroll past `collapseAt` (default **50% of scrollport**) a **narrower hug pill pins 1rem from the top** (`compactLayout="grid"` optional); mega panel stays **grid-wide** above a light dim; mega body: **SiteNav.Featured** / **ReadRow** / **MenuMedia** / **MenuLinkGrid** (paste **Pattern — mega menu**); below `md` mega sections stack; **SiteNav.Links** / **Link** / **Menu** / **MenuSection** / **MenuLink** (Base UI NavigationMenu) with Tab-style **More** overflow when the middle track is tight; `mobile` → **Sheet** `side="end"`. Compose **Button** `render={<a/>}` for anchors. Brand: circular **IconButton** via `icon` + `aria-label` (or wordmark **Button**). Not app chrome. See **ADR-0028**.
32
+ - **SiteNav:** marketing site header — `start` | `middle` | `end` slots; **page chrome** (`placement="fixed"`, optional `scrollContainer`) vs **specimen** (`placement="inline"`); expanded is **in flow** (scrolls away); after scroll past `collapseAt` (default **50% of scrollport**) a **narrower hug pill pins 1rem from the top** (`compactLayout="grid"` optional); mega panel stays **grid-wide** above a light dim; mega body: **SiteNav.Featured** / **ReadRow** / **MenuMedia** / **MenuLinkGrid** (paste **Pattern — mega menu**); below `md` mega sections stack; **SiteNav.Links** / **Link** / **Menu** / **MenuSection** / **MenuLink** (Base UI NavigationMenu) with Tab-style **More** overflow when the middle track is tight; `mobile` (below `md`) → a "☰ Menu" **Button** that becomes "✕ Close" in place, opening a full-height panel under the bar (Header rule N5–N8): 56px **SiteNav.MobileLink** rows (current page in weight + fill + `aria-current`), `mobileAction` pinned at the bottom; it's a dialog that keeps the bar live (focus to the first link, Tab cycles bar + panel, page inert and not scrolling, Escape / Close / any link tap closes, focus back to Menu). The bar's `end` actions give way (measured) when they don't fit beside Menu, so Menu keeps its word. Compose **Button** `render={<a/>}` for anchors. Brand: circular **IconButton** via `icon` + `aria-label` (or wordmark **Button**). Not app chrome. See **ADR-0028**.
33
33
  - **Breadcrumb:** the path to the current page — `items` (`{ label, href }` from the root; the last, without `href`, is the current page, `aria-current="page"`). Above `maxItems` (default 4, min 3) the first item and the last `maxItems - 2` stay and the middle folds into a "…" **IconButton** that opens a **Dropdown.Menu** of links — a disclosure (focus to the first link, arrows move, Tab leaves, Escape returns focus), not an ARIA menu; the same on phones. Long labels truncate (full label in the name and `title`). `separator` `chevron` (default) / `slash`; `variant` `sans` (body) / `mono` (eyebrow caps — editorial pages, beside **SectionCaption**). `renderLink={(item) => <Link href={item.href} />}` routes every crumb and menu link. `className` is layout only. Not main navigation (**SiteNav**) or tabs (**Tab**). Paste **Components/Breadcrumb → Pattern — path**, **Pattern — long path**, **Pattern — router links**, or **Pattern — editorial**. See **ADR-0042**.
34
34
  - **NavList:** sectioned secondary nav — **`sections`** + **`activeId`** / **`onSelect`**, or **NavList.Section** + **NavList.Item**. Inset pills via **Button** `layout="nav"` + **ButtonIcon**; optional counts (tabular); **`labelAlign="brand"`** reserves a 56px first-section band. Item **`href`** or **`render={<Link href />}`** makes the row an anchor (`render` wins if both are set) so a server-rendered app navigates without an `onSelect` island. **`trailing`** is a **Status** dot or a **Badge** `status` pill. Section **`action`** is an **IconButton** (filter or more). Paste **Components/NavList → Pattern — app sidebar** for the brand row, **Search**, sections, footer slot, and the phone form (**PageHeader** `variant="app"` menu **IconButton** + **Sheet** `side="start"`). Not primary navigation. See **ADR-0019**.
35
35
  - **AppShell:** signed-in page chrome — sidebar on `bg-body`, the page as an inset raised surface with a title bar. `sidebar` scrolls; **`sidebarFooter`** / **AppShell.SidebarFooter** is pinned under it in the column and the phone **Sheet** (a **DisplayControls** `controls="theme"` switch). The phone toggle's accessible name is **"Menu"** (`labels.menu`) — keep it. Render it from a `"use client"` module; it server-renders in full, the **Sheet** and **Panel** wait for open, and `displayThemeNoFlashScript` goes in `<head>` from a client module. Paste **Components/AppShell → Pattern — portal dashboard**. See **ADR-0047**. Full contract: **docs/component-contracts.md → AppShell**.
@@ -40,8 +40,8 @@ Storybook paths such as **Components/Button/Button → Pattern — …** name a
40
40
  - **TaskRows:** expandable task rows — composes **Accordion** for disclosure; adds status (**Badge**, **Status**), **meta**, detail rails, and **TaskRows.Detail**. Patterns: **status rows**; **capsules**; **action details** (`detailsLayout="actions"` + `TaskRows.Detail variant="button"` → **Button** `size="xs"`); **tag chips** (`detailsLayout="chips"` + read-only **Chip** `size="sm"`); **detail lines** (`TaskRows.Detail` + `onPress` → **Button** `layout="row"`). **`variant="table"`** is the needs-you table: `columns` (`id` `title` | `waiting` | `metric`, `header`, `align`, `width`), **`TaskRows.Row`** (`title`, `href` or `render`, `status` dot + label, `waiting` pill + detail, `metric` tabular value). `source` `loading` | `error` | `unwired` (footer `note`). No rows shows `empty` ("Nothing waiting"). Below `md` a row is two lines. Optional **Card.Body**.
41
41
  - **Accordion:** generic expand/collapse — **leading**, **label**, **trailing**, built-in chevron, `motion-collapse` panel. Variants: `list`, `capsule`, `plain`; **`flush`** (plain only) drops the inset so labels line up with surrounding text — filter side panels. A closed panel turns `visibility: hidden` once it folds, so Tab skips its controls. **TaskRows** is the task-status pattern on top.
42
42
  - **DescriptionList:** a list of facts — `dl` > **DescriptionList.Item** (`div` > `dt` `name` + `dd` value). `layout` `inline` (value beside the name, 2 : 3 tracks, default) or `stacked` (value under it — tags, actions), per list or per item. `rule` `solid` (default) / `dotted` (quieter — beside caption rules) / `none`. `variant` `sans` (caption name, body value) or `mono` (eyebrow name, mono caps value, tabular figures — post metadata). Values take text, `<time>`, **Badge** tags, or **Button** actions; several wrap in a row. Not form fields (**Field**), metrics (**Stat**), or status rows (**TaskRows**). Paste **Components/DescriptionList → Pattern — post metadata** or **Pattern — details**. See **ADR-0041**.
43
- - **SectionCaption:** the small uppercase mono caption over a page column ("/ Metadata", "/ Article", "/ Filters") — `type-eyebrow` on a `border-border-emphasized` rule; the "/" `marker` is `aria-hidden`. `as` `h2` (default — pair `id` with the region's `aria-labelledby`) or `p` (labels a column that has its own heading); `end` holds a **Button** `size="xs"` (Clear all) without growing the row; `rule` / `marker` can be turned off. Write `children` in sentence case. Copy **Components/SectionCaption → Pattern — column caption**. See **ADR-0041**.
44
- - **Band:** a full-bleed page section in a brand-kit tone. `tone` `default` / `inverse` (the brand surface, `--color-brand-surface`; also `data-theme="dark"`) / `field` (the saturated section colour, `--color-field`) sets `data-tone`, which remaps the surface, text, border and fill roles so every component inside re-skins; never re-colour what's inside with `className`. It holds its own `grid-page` on the shared `--grid-*` tokens: standing alone it's a full-width section; inside a `grid-page` it spans every column, paints to the viewport edges (border-image outset, no scrollbar) and its page becomes a subgrid, so its columns stay the page's. `spacing` `md` (48px, default) / `lg` (96px) / `none`; `as` `section` (default) / `div` / `header` / `footer` / `aside`. Status colours aren't remapped on `field`. Paste **Components/Band → Pattern — page in bands**; the brand kit and its contrast check are **Foundations/Brand kit → Theme a client**.
43
+ - **SectionCaption:** the small uppercase mono caption over a page column ("/ Metadata", "/ Article", "/ Filters") — `type-eyebrow` on a `border-border-emphasized` rule; the "/" `marker` is `aria-hidden`. `as` `p` (default — an eyebrow in capitals is never a heading; pair `id` with the region's `aria-labelledby` to name it) or `h2`–`h4` (only when the region has no sentence-case heading and people jump to it); `end` holds a **Button** `size="xs"` (Clear all) without growing the row; `rule` / `marker` can be turned off. Write `children` in sentence case. Copy **Components/SectionCaption → Pattern — column caption**. See **ADR-0041**.
44
+ - **Band:** a full-bleed page section in a brand-kit tone. `tone` `default` / `inverse` (the brand surface, `--color-brand-surface`; also `data-theme="dark"`) / `field` (the saturated section colour, `--color-field`) sets `data-tone`, which remaps the surface, text, border and fill roles so every component inside re-skins; never re-colour what's inside with `className`. It holds its own `grid-page` on the shared `--grid-*` tokens: standing alone it's a full-width section; inside a `grid-page` it spans every column, paints to the viewport edges (border-image outset, no scrollbar) and its page becomes a subgrid, so its columns stay the page's. `spacing` `md` (48px, default) / `lg` (64px on phones, 96px from `md`: the hero and the closing section) / `none` (Spacing rule S8: sections use these, never hand-set padding); `as` `section` (default) / `div` / `header` / `footer` / `aside`. Status colours aren't remapped on `field`. Paste **Components/Band → Pattern — page in bands**; the brand kit and its contrast check are **Foundations/Brand kit → Theme a client**.
45
45
  - **InlinePill:** a key word inside running text (a display headline, a lead line) in a soft pill that scales with the text (em-sized), with an optional decorative `media` picture on its left. Pop the pictures in with `useInlinePillsPopIn()` spread on the heading. Not a control: use `Chip` for filters and tokens, `Badge` for status. Keep 2–3 pills of one or two words per sentence.
46
46
  - **Prose:** long-form content set from plain HTML elements (rendered markdown) — headings, paragraphs, lists, quotes, inline code, code blocks, rules, images, figures, and tables, with the spacing between them. `size` `lg` (default — `type-reading`, headings a step up) or `md` (`type-body`, denser notes); `measure` `reading` (40rem, default) or `none`; `as` `div` / `article` / `section`. Wide tables scroll in their own box. Map markdown `#` to `h2` under a page `h1`, and links to **TextLink** (`external` for other sites). Never add classes to the elements inside. Paste **Components/Prose → Pattern — article body**; the full page is **Guides/Post page → Pattern — post page** (`metadataSide` `start` / `end` and `metadataColumns` 4 / 3 place the panel from `lg`; `metadataStack` `after` (default) / `before` places it below `lg`, where it stacks, and in the markup — `after` adds a date and reading-time line under the title below `lg`; pair `end` with `after` or `start` with `before` so tab order matches the layout at every width — never edit its classes). See **ADR-0041**.
47
47
  - **IndexList:** editorial index for list pages (blog, case studies) — **IndexList.Item** rows with `meta` (a `<time>`), a linked `title` (`href`, or `render={<Link href />}` for the app's router; a quiet **TextLink** in an `h2` by default — `titleAs`), and an optional `preview` an **IconButton** disclosure expands under the title. Optional `captions={{ meta, title }}` in sentence case (`type-eyebrow`, the "/" marker and the **SectionCaption** rule, `aria-hidden`) share the rows' tracks. Two tracks (7.5rem meta, title) once the list is 32rem wide (container query); one column below, captions hidden. `size` `lg` (type-display-3, default) / `md` / `sm`. `empty` replaces the rows when there are none. `className` is layout only. Not tabular data — **Table**. Paste **Components/IndexList → Pattern — post index**; with filters, **Guides/Filter panel → Pattern — filtered index** (a post's `facets` take one option or several per group; `defaultSelection` opens the page filtered, `selection` + `onSelectionChange` hold it in the URL). See **ADR-0040**.
package/docs/exports.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "package": "@thewhatmatters/wmds",
3
- "version": "0.4.29",
3
+ "version": "0.4.31",
4
4
  "import": "import { Button } from \"@thewhatmatters/wmds\";",
5
5
  "styles": [
6
6
  "@thewhatmatters/wmds/styles.css",
@@ -419,7 +419,8 @@
419
419
  "docs": "?path=/docs/components-herointro--docs"
420
420
  },
421
421
  "patterns": [
422
- "components-herointro--two-line-intro"
422
+ "components-herointro--two-line-intro",
423
+ "components-herointro--with-actions"
423
424
  ]
424
425
  },
425
426
  {
@@ -1,4 +1,4 @@
1
- // @thewhatmatters/wmds@0.4.29 · Pattern — flush
1
+ // @thewhatmatters/wmds@0.4.31 · Pattern — flush
2
2
  // Storybook: Components/Accordion → Pattern — flush (?path=/story/components-accordion--flush)
3
3
  // Show code — copy verbatim and keep this header; upgrades find pasted patterns by it.
4
4
 
@@ -1,4 +1,4 @@
1
- // @thewhatmatters/wmds@0.4.29 · Pattern — portal dashboard
1
+ // @thewhatmatters/wmds@0.4.31 · Pattern — portal dashboard
2
2
  // Storybook: Components/AppShell → Pattern — portal dashboard (?path=/story/components-appshell--portal-dashboard-pattern)
3
3
  // Show code — copy verbatim and keep this header; upgrades find pasted patterns by it.
4
4
 
@@ -1,4 +1,4 @@
1
- // @thewhatmatters/wmds@0.4.29 · Pattern — dropdown row
1
+ // @thewhatmatters/wmds@0.4.31 · Pattern — dropdown row
2
2
  // Storybook: Components/Avatar → Pattern — dropdown row (?path=/story/components-avatar--dropdown-row)
3
3
  // Show code — copy verbatim and keep this header; upgrades find pasted patterns by it.
4
4
 
@@ -1,4 +1,4 @@
1
- // @thewhatmatters/wmds@0.4.29 · Pattern — outline tags
1
+ // @thewhatmatters/wmds@0.4.31 · Pattern — outline tags
2
2
  // Storybook: Components/Badge → Pattern — outline tags (?path=/story/components-badge--outline-tags)
3
3
  // Show code — copy verbatim and keep this header; upgrades find pasted patterns by it.
4
4
 
@@ -1,4 +1,4 @@
1
- // @thewhatmatters/wmds@0.4.29 · Pattern — status pill
1
+ // @thewhatmatters/wmds@0.4.31 · Pattern — status pill
2
2
  // Storybook: Components/Badge → Pattern — status pill (?path=/story/components-badge--status-pill)
3
3
  // Show code — copy verbatim and keep this header; upgrades find pasted patterns by it.
4
4
 
@@ -1,4 +1,4 @@
1
- // @thewhatmatters/wmds@0.4.29 · Pattern — with avatar
1
+ // @thewhatmatters/wmds@0.4.31 · Pattern — with avatar
2
2
  // Storybook: Components/Badge → Pattern — with avatar (?path=/story/components-badge--with-avatar)
3
3
  // Show code — copy verbatim and keep this header; upgrades find pasted patterns by it.
4
4
 
@@ -1,4 +1,4 @@
1
- // @thewhatmatters/wmds@0.4.29 · Pattern — page in bands
1
+ // @thewhatmatters/wmds@0.4.31 · Pattern — page in bands
2
2
  // Storybook: Components/Band → Pattern — page in bands (?path=/story/components-band--page-in-bands)
3
3
  // Show code — copy verbatim and keep this header; upgrades find pasted patterns by it.
4
4
 
@@ -1,4 +1,4 @@
1
- // @thewhatmatters/wmds@0.4.29 · Pattern — editorial
1
+ // @thewhatmatters/wmds@0.4.31 · Pattern — editorial
2
2
  // Storybook: Components/Breadcrumb → Pattern — editorial (?path=/story/components-breadcrumb--editorial)
3
3
  // Show code — copy verbatim and keep this header; upgrades find pasted patterns by it.
4
4
 
@@ -1,4 +1,4 @@
1
- // @thewhatmatters/wmds@0.4.29 · Pattern — long path
1
+ // @thewhatmatters/wmds@0.4.31 · Pattern — long path
2
2
  // Storybook: Components/Breadcrumb → Pattern — long path (?path=/story/components-breadcrumb--long-path)
3
3
  // Show code — copy verbatim and keep this header; upgrades find pasted patterns by it.
4
4
 
@@ -1,4 +1,4 @@
1
- // @thewhatmatters/wmds@0.4.29 · Pattern — path
1
+ // @thewhatmatters/wmds@0.4.31 · Pattern — path
2
2
  // Storybook: Components/Breadcrumb → Pattern — path (?path=/story/components-breadcrumb--path)
3
3
  // Show code — copy verbatim and keep this header; upgrades find pasted patterns by it.
4
4
 
@@ -1,4 +1,4 @@
1
- // @thewhatmatters/wmds@0.4.29 · Pattern — router links
1
+ // @thewhatmatters/wmds@0.4.31 · Pattern — router links
2
2
  // Storybook: Components/Breadcrumb → Pattern — router links (?path=/story/components-breadcrumb--router-links)
3
3
  // Show code — copy verbatim and keep this header; upgrades find pasted patterns by it.
4
4
 
@@ -1,4 +1,4 @@
1
- // @thewhatmatters/wmds@0.4.29 · Pattern — copy button
1
+ // @thewhatmatters/wmds@0.4.31 · Pattern — copy button
2
2
  // Storybook: Components/Button/Button → Pattern — copy button (?path=/story/components-button-button--copy-button)
3
3
  // Show code — copy verbatim and keep this header; upgrades find pasted patterns by it.
4
4
 
@@ -1,4 +1,4 @@
1
- // @thewhatmatters/wmds@0.4.29 · Pattern — destructive action
1
+ // @thewhatmatters/wmds@0.4.31 · Pattern — destructive action
2
2
  // Storybook: Components/Button/Button → Pattern — destructive action (?path=/story/components-button-button--destructive-action)
3
3
  // Show code — copy verbatim and keep this header; upgrades find pasted patterns by it.
4
4
 
@@ -1,4 +1,4 @@
1
- // @thewhatmatters/wmds@0.4.29 · Pattern — external link
1
+ // @thewhatmatters/wmds@0.4.31 · Pattern — external link
2
2
  // Storybook: Components/Button/Button → Pattern — external link (?path=/story/components-button-button--external-link)
3
3
  // Show code — copy verbatim and keep this header; upgrades find pasted patterns by it.
4
4
 
@@ -1,4 +1,4 @@
1
- // @thewhatmatters/wmds@0.4.29 · Pattern — ghost action
1
+ // @thewhatmatters/wmds@0.4.31 · Pattern — ghost action
2
2
  // Storybook: Components/Button/Button → Pattern — ghost action (?path=/story/components-button-button--ghost-action)
3
3
  // Show code — copy verbatim and keep this header; upgrades find pasted patterns by it.
4
4
 
@@ -1,4 +1,4 @@
1
- // @thewhatmatters/wmds@0.4.29 · Pattern — inverse action
1
+ // @thewhatmatters/wmds@0.4.31 · Pattern — inverse action
2
2
  // Storybook: Components/Button/Button → Pattern — inverse action (?path=/story/components-button-button--inverse-action)
3
3
  // Show code — copy verbatim and keep this header; upgrades find pasted patterns by it.
4
4
 
@@ -1,4 +1,4 @@
1
- // @thewhatmatters/wmds@0.4.29 · Pattern — link
1
+ // @thewhatmatters/wmds@0.4.31 · Pattern — link
2
2
  // Storybook: Components/Button/Button → Pattern — link (?path=/story/components-button-button--link-render)
3
3
  // Show code — copy verbatim and keep this header; upgrades find pasted patterns by it.
4
4
 
@@ -1,4 +1,4 @@
1
- // @thewhatmatters/wmds@0.4.29 · Pattern — submit / async
1
+ // @thewhatmatters/wmds@0.4.31 · Pattern — submit / async
2
2
  // Storybook: Components/Button/Button → Pattern — submit / async (?path=/story/components-button-button--multi-state-badge)
3
3
  // Show code — copy verbatim and keep this header; upgrades find pasted patterns by it.
4
4
 
@@ -1,4 +1,4 @@
1
- // @thewhatmatters/wmds@0.4.29 · Pattern — outline mono
1
+ // @thewhatmatters/wmds@0.4.31 · Pattern — outline mono
2
2
  // Storybook: Components/Button/Button → Pattern — outline mono (?path=/story/components-button-button--outline-mono)
3
3
  // Show code — copy verbatim and keep this header; upgrades find pasted patterns by it.
4
4
 
@@ -1,4 +1,4 @@
1
- // @thewhatmatters/wmds@0.4.29 · Pattern — primary action
1
+ // @thewhatmatters/wmds@0.4.31 · Pattern — primary action
2
2
  // Storybook: Components/Button/Button → Pattern — primary action (?path=/story/components-button-button--primary-action)
3
3
  // Show code — copy verbatim and keep this header; upgrades find pasted patterns by it.
4
4
 
@@ -1,4 +1,4 @@
1
- // @thewhatmatters/wmds@0.4.29 · Pattern — row (hug)
1
+ // @thewhatmatters/wmds@0.4.31 · Pattern — row (hug)
2
2
  // Storybook: Components/Button/Button → Pattern — row (hug) (?path=/story/components-button-button--row-hug)
3
3
  // Show code — copy verbatim and keep this header; upgrades find pasted patterns by it.
4
4
 
@@ -1,4 +1,4 @@
1
- // @thewhatmatters/wmds@0.4.29 · Pattern — row
1
+ // @thewhatmatters/wmds@0.4.31 · Pattern — row
2
2
  // Storybook: Components/Button/Button → Pattern — row (?path=/story/components-button-button--row-layout)
3
3
  // Show code — copy verbatim and keep this header; upgrades find pasted patterns by it.
4
4
 
@@ -1,4 +1,4 @@
1
- // @thewhatmatters/wmds@0.4.29 · Pattern — secondary action
1
+ // @thewhatmatters/wmds@0.4.31 · Pattern — secondary action
2
2
  // Storybook: Components/Button/Button → Pattern — secondary action (?path=/story/components-button-button--secondary-action)
3
3
  // Show code — copy verbatim and keep this header; upgrades find pasted patterns by it.
4
4
 
@@ -1,4 +1,4 @@
1
- // @thewhatmatters/wmds@0.4.29 · Pattern — suggestion pills
1
+ // @thewhatmatters/wmds@0.4.31 · Pattern — suggestion pills
2
2
  // Storybook: Components/Button/Button → Pattern — suggestion pills (?path=/story/components-button-button--suggestion-pills)
3
3
  // Show code — copy verbatim and keep this header; upgrades find pasted patterns by it.
4
4
 
@@ -1,4 +1,4 @@
1
- // @thewhatmatters/wmds@0.4.29 · Pattern — with count
1
+ // @thewhatmatters/wmds@0.4.31 · Pattern — with count
2
2
  // Storybook: Components/Button/Button → Pattern — with count (?path=/story/components-button-button--with-count)
3
3
  // Show code — copy verbatim and keep this header; upgrades find pasted patterns by it.
4
4
 
@@ -1,4 +1,4 @@
1
- // @thewhatmatters/wmds@0.4.29 · Pattern — with icon
1
+ // @thewhatmatters/wmds@0.4.31 · Pattern — with icon
2
2
  // Storybook: Components/Button/Button → Pattern — with icon (?path=/story/components-button-button--with-icon)
3
3
  // Show code — copy verbatim and keep this header; upgrades find pasted patterns by it.
4
4
 
@@ -1,4 +1,4 @@
1
- // @thewhatmatters/wmds@0.4.29 · Pattern — vertical actions
1
+ // @thewhatmatters/wmds@0.4.31 · Pattern — vertical actions
2
2
  // Storybook: Components/Button/FloatingActionButton → Pattern — vertical actions (?path=/story/components-button-floatingactionbutton--vertical-actions)
3
3
  // Show code — copy verbatim and keep this header; upgrades find pasted patterns by it.
4
4
 
@@ -1,4 +1,4 @@
1
- // @thewhatmatters/wmds@0.4.29 · Pattern — skip in footer
1
+ // @thewhatmatters/wmds@0.4.31 · Pattern — skip in footer
2
2
  // Storybook: Components/CalEmbed → Pattern — skip in footer (?path=/story/components-calembed--pattern-skip-in-footer)
3
3
  // Show code — copy verbatim and keep this header; upgrades find pasted patterns by it.
4
4
 
@@ -1,4 +1,4 @@
1
- // @thewhatmatters/wmds@0.4.29 · Example — body slot (occupancy history)
1
+ // @thewhatmatters/wmds@0.4.31 · Example — body slot (occupancy history)
2
2
  // Storybook: Components/Card/Card → Example — body slot (occupancy history) (?path=/story/components-card-card--body-slot-occupancy-history)
3
3
  // Show code — copy verbatim and keep this header; upgrades find pasted patterns by it.
4
4
 
@@ -1,4 +1,4 @@
1
- // @thewhatmatters/wmds@0.4.29 · Pattern — headerless media
1
+ // @thewhatmatters/wmds@0.4.31 · Pattern — headerless media
2
2
  // Storybook: Components/Card/Card → Pattern — headerless media (?path=/story/components-card-card--headerless-media)
3
3
  // Show code — copy verbatim and keep this header; upgrades find pasted patterns by it.
4
4
 
@@ -1,4 +1,4 @@
1
- // @thewhatmatters/wmds@0.4.29 · Pattern — outlined layout
1
+ // @thewhatmatters/wmds@0.4.31 · Pattern — outlined layout
2
2
  // Storybook: Components/Card/Card → Pattern — outlined layout (?path=/story/components-card-card--outlined-layout)
3
3
  // Show code — copy verbatim and keep this header; upgrades find pasted patterns by it.
4
4
 
@@ -1,4 +1,4 @@
1
- // @thewhatmatters/wmds@0.4.29 · Pattern — pinned height
1
+ // @thewhatmatters/wmds@0.4.31 · Pattern — pinned height
2
2
  // Storybook: Components/Card/Card → Pattern — pinned height (?path=/story/components-card-card--pinned-height)
3
3
  // Show code — copy verbatim and keep this header; upgrades find pasted patterns by it.
4
4
 
@@ -1,4 +1,4 @@
1
- // @thewhatmatters/wmds@0.4.29 · Pattern — terminal frame
1
+ // @thewhatmatters/wmds@0.4.31 · Pattern — terminal frame
2
2
  // Storybook: Components/Card/Card → Pattern — terminal frame (?path=/story/components-card-card--terminal-frame)
3
3
  // Show code — copy verbatim and keep this header; upgrades find pasted patterns by it.
4
4
 
@@ -1,4 +1,4 @@
1
- // @thewhatmatters/wmds@0.4.29 · Pattern — selectable cards
1
+ // @thewhatmatters/wmds@0.4.31 · Pattern — selectable cards
2
2
  // Storybook: Components/Card/SelectableCard → Pattern — selectable cards (?path=/story/components-card-selectablecard--selectable-cards-pattern)
3
3
  // Show code — copy verbatim and keep this header; upgrades find pasted patterns by it.
4
4
 
@@ -1,4 +1,4 @@
1
- // @thewhatmatters/wmds@0.4.29 · Pattern — image carousel
1
+ // @thewhatmatters/wmds@0.4.31 · Pattern — image carousel
2
2
  // Storybook: Components/Carousel → Pattern — image carousel (?path=/story/components-carousel--image-carousel)
3
3
  // Show code — copy verbatim and keep this header; upgrades find pasted patterns by it.
4
4
 
@@ -1,4 +1,4 @@
1
- // @thewhatmatters/wmds@0.4.29 · Pattern — matrix heatmap
1
+ // @thewhatmatters/wmds@0.4.31 · Pattern — matrix heatmap
2
2
  // Storybook: Components/Chart → Pattern — matrix heatmap (?path=/story/components-chart--audience-activity-heatmap)
3
3
  // Show code — copy verbatim and keep this header; upgrades find pasted patterns by it.
4
4
 
@@ -1,4 +1,4 @@
1
- // @thewhatmatters/wmds@0.4.29 · Pattern — Cartesian no-data gaps
1
+ // @thewhatmatters/wmds@0.4.31 · Pattern — Cartesian no-data gaps
2
2
  // Storybook: Components/Chart → Pattern — Cartesian no-data gaps (?path=/story/components-chart--cartesian-no-data-gaps)
3
3
  // Show code — copy verbatim and keep this header; upgrades find pasted patterns by it.
4
4
 
@@ -1,4 +1,4 @@
1
- // @thewhatmatters/wmds@0.4.29 · Pattern — occupancy history in Card
1
+ // @thewhatmatters/wmds@0.4.31 · Pattern — occupancy history in Card
2
2
  // Storybook: Components/Chart → Pattern — occupancy history in Card (?path=/story/components-chart--occupancy-history-in-card)
3
3
  // Show code — copy verbatim and keep this header; upgrades find pasted patterns by it.
4
4
 
@@ -1,4 +1,4 @@
1
- // @thewhatmatters/wmds@0.4.29 · Pattern — occupancy KPI in Card
1
+ // @thewhatmatters/wmds@0.4.31 · Pattern — occupancy KPI in Card
2
2
  // Storybook: Components/Chart → Pattern — occupancy KPI in Card (?path=/story/components-chart--occupancy-in-card)
3
3
  // Show code — copy verbatim and keep this header; upgrades find pasted patterns by it.
4
4
 
@@ -1,4 +1,4 @@
1
- // @thewhatmatters/wmds@0.4.29 · Pattern — distribution strip
1
+ // @thewhatmatters/wmds@0.4.31 · Pattern — distribution strip
2
2
  // Storybook: Components/Chart → Pattern — distribution strip (?path=/story/components-chart--post-reach-distribution)
3
3
  // Show code — copy verbatim and keep this header; upgrades find pasted patterns by it.
4
4
 
@@ -1,4 +1,4 @@
1
- // @thewhatmatters/wmds@0.4.29 · Pattern — ranked audience breakdown
1
+ // @thewhatmatters/wmds@0.4.31 · Pattern — ranked audience breakdown
2
2
  // Storybook: Components/Chart → Pattern — ranked audience breakdown (?path=/story/components-chart--ranked-audience-breakdown)
3
3
  // Show code — copy verbatim and keep this header; upgrades find pasted patterns by it.
4
4
 
@@ -1,4 +1,4 @@
1
- // @thewhatmatters/wmds@0.4.29 · Pattern — revenue by line
1
+ // @thewhatmatters/wmds@0.4.31 · Pattern — revenue by line
2
2
  // Storybook: Components/Chart → Pattern — revenue by line (?path=/story/components-chart--revenue-by-line)
3
3
  // Show code — copy verbatim and keep this header; upgrades find pasted patterns by it.
4
4
 
@@ -1,4 +1,4 @@
1
- // @thewhatmatters/wmds@0.4.29 · Pattern — segmented ring
1
+ // @thewhatmatters/wmds@0.4.31 · Pattern — segmented ring
2
2
  // Storybook: Components/Chart → Pattern — segmented ring (?path=/story/components-chart--segmented-ring-pattern)
3
3
  // Show code — copy verbatim and keep this header; upgrades find pasted patterns by it.
4
4
 
@@ -1,4 +1,4 @@
1
- // @thewhatmatters/wmds@0.4.29 · Pattern — 100-unit composition
1
+ // @thewhatmatters/wmds@0.4.31 · Pattern — 100-unit composition
2
2
  // Storybook: Components/Chart → Pattern — 100-unit composition (?path=/story/components-chart--unit-grid-composition)
3
3
  // Show code — copy verbatim and keep this header; upgrades find pasted patterns by it.
4
4