@thewhatmatters/wmds 0.4.30 → 0.4.32

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 (235) hide show
  1. package/CHANGELOG.md +45 -0
  2. package/bin/wmds-check.mjs +38 -0
  3. package/dist/components/atoms/Checkbox/Checkbox.d.ts.map +1 -1
  4. package/dist/components/atoms/Checkbox/Checkbox.js +73 -72
  5. package/dist/components/atoms/Input/Input.d.ts.map +1 -1
  6. package/dist/components/atoms/Input/Input.js +44 -49
  7. package/dist/components/atoms/Input/inputShellStyles.js +2 -2
  8. package/dist/components/atoms/Radio/Radio.d.ts.map +1 -1
  9. package/dist/components/atoms/Radio/Radio.js +61 -60
  10. package/dist/components/atoms/Switch/Switch.d.ts.map +1 -1
  11. package/dist/components/atoms/Switch/Switch.js +31 -30
  12. package/dist/components/atoms/TextArea/TextArea.d.ts.map +1 -1
  13. package/dist/components/atoms/TextArea/TextArea.js +56 -55
  14. package/dist/components/atoms/TextArea/textareaShellStyles.js +2 -2
  15. package/dist/components/atoms/inputShared/InputStatusBanner.d.ts +5 -0
  16. package/dist/components/atoms/inputShared/InputStatusBanner.d.ts.map +1 -1
  17. package/dist/components/atoms/inputShared/InputStatusBanner.js +15 -4
  18. package/dist/components/molecules/Breadcrumb/breadcrumbStyles.d.ts +1 -1
  19. package/dist/components/molecules/Breadcrumb/breadcrumbStyles.js +2 -2
  20. package/dist/components/molecules/CheckboxGroup/CheckboxGroup.d.ts.map +1 -1
  21. package/dist/components/molecules/CheckboxGroup/CheckboxGroup.js +53 -53
  22. package/dist/components/molecules/CopyField/copyFieldStyles.d.ts.map +1 -1
  23. package/dist/components/molecules/CopyField/copyFieldStyles.js +1 -1
  24. package/dist/components/molecules/ErrorSummary/ErrorSummary.d.ts +32 -0
  25. package/dist/components/molecules/ErrorSummary/ErrorSummary.d.ts.map +1 -0
  26. package/dist/components/molecules/ErrorSummary/ErrorSummary.js +37 -0
  27. package/dist/components/molecules/ErrorSummary/errorSummaryStyles.d.ts +12 -0
  28. package/dist/components/molecules/ErrorSummary/errorSummaryStyles.d.ts.map +1 -0
  29. package/dist/components/molecules/ErrorSummary/errorSummaryStyles.js +5 -0
  30. package/dist/components/molecules/Field/fieldStyles.d.ts +1 -1
  31. package/dist/components/molecules/Field/fieldStyles.js +1 -1
  32. package/dist/components/molecules/HeroIntro/HeroIntro.d.ts +8 -2
  33. package/dist/components/molecules/HeroIntro/HeroIntro.d.ts.map +1 -1
  34. package/dist/components/molecules/HeroIntro/HeroIntro.js +30 -22
  35. package/dist/components/molecules/HeroIntro/heroIntroStyles.d.ts +9 -2
  36. package/dist/components/molecules/HeroIntro/heroIntroStyles.d.ts.map +1 -1
  37. package/dist/components/molecules/HeroIntro/heroIntroStyles.js +2 -2
  38. package/dist/components/molecules/IntakeForm/IntakeForm.d.ts.map +1 -1
  39. package/dist/components/molecules/IntakeForm/IntakeForm.js +4 -6
  40. package/dist/components/molecules/PromptBar/promptBarStyles.d.ts +3 -2
  41. package/dist/components/molecules/PromptBar/promptBarStyles.d.ts.map +1 -1
  42. package/dist/components/molecules/PromptBar/promptBarStyles.js +2 -2
  43. package/dist/components/molecules/RadioGroup/RadioGroup.d.ts.map +1 -1
  44. package/dist/components/molecules/RadioGroup/RadioGroup.js +53 -53
  45. package/dist/components/molecules/Search/Search.d.ts +5 -0
  46. package/dist/components/molecules/Search/Search.d.ts.map +1 -1
  47. package/dist/components/molecules/Search/Search.js +14 -13
  48. package/dist/components/molecules/Search/searchStyles.d.ts +2 -1
  49. package/dist/components/molecules/Search/searchStyles.d.ts.map +1 -1
  50. package/dist/components/molecules/Search/searchStyles.js +4 -4
  51. package/dist/components/molecules/TileGrid/tileGridStyles.js +1 -1
  52. package/dist/components/organisms/Carousel/carouselStyles.js +3 -3
  53. package/dist/components/organisms/ChatDock/chatDockStyles.d.ts +4 -0
  54. package/dist/components/organisms/ChatDock/chatDockStyles.d.ts.map +1 -1
  55. package/dist/components/organisms/FooterReveal/footerRevealStyles.js +1 -1
  56. package/dist/components/organisms/SiteNav/SiteNav.d.ts +13 -6
  57. package/dist/components/organisms/SiteNav/SiteNav.d.ts.map +1 -1
  58. package/dist/components/organisms/SiteNav/SiteNav.js +305 -252
  59. package/dist/components/organisms/SiteNav/siteNavStyles.d.ts +33 -5
  60. package/dist/components/organisms/SiteNav/siteNavStyles.d.ts.map +1 -1
  61. package/dist/components/organisms/SiteNav/siteNavStyles.js +3 -3
  62. package/dist/components/organisms/SiteNav/useSiteNavMobileMenu.d.ts +17 -0
  63. package/dist/components/organisms/SiteNav/useSiteNavMobileMenu.d.ts.map +1 -0
  64. package/dist/components/organisms/SiteNav/useSiteNavMobileMenu.js +47 -0
  65. package/dist/index.d.ts +1 -0
  66. package/dist/index.d.ts.map +1 -1
  67. package/dist/index.js +3 -1
  68. package/dist/lib/dialogOverlay.d.ts +8 -0
  69. package/dist/lib/dialogOverlay.d.ts.map +1 -1
  70. package/dist/lib/dialogOverlay.js +45 -26
  71. package/dist/styles.css +1 -1
  72. package/docs/components.md +3 -2
  73. package/docs/exports.json +16 -2
  74. package/docs/patterns/components-accordion--flush.tsx +1 -1
  75. package/docs/patterns/components-appshell--portal-dashboard-pattern.tsx +1 -1
  76. package/docs/patterns/components-avatar--dropdown-row.tsx +1 -1
  77. package/docs/patterns/components-badge--outline-tags.tsx +1 -1
  78. package/docs/patterns/components-badge--status-pill.tsx +1 -1
  79. package/docs/patterns/components-badge--with-avatar.tsx +1 -1
  80. package/docs/patterns/components-band--page-in-bands.tsx +1 -1
  81. package/docs/patterns/components-breadcrumb--editorial.tsx +1 -1
  82. package/docs/patterns/components-breadcrumb--long-path.tsx +1 -1
  83. package/docs/patterns/components-breadcrumb--path.tsx +1 -1
  84. package/docs/patterns/components-breadcrumb--router-links.tsx +1 -1
  85. package/docs/patterns/components-button-button--copy-button.tsx +1 -1
  86. package/docs/patterns/components-button-button--destructive-action.tsx +1 -1
  87. package/docs/patterns/components-button-button--external-link.tsx +1 -1
  88. package/docs/patterns/components-button-button--ghost-action.tsx +1 -1
  89. package/docs/patterns/components-button-button--inverse-action.tsx +1 -1
  90. package/docs/patterns/components-button-button--link-render.tsx +1 -1
  91. package/docs/patterns/components-button-button--multi-state-badge.tsx +1 -1
  92. package/docs/patterns/components-button-button--outline-mono.tsx +1 -1
  93. package/docs/patterns/components-button-button--primary-action.tsx +1 -1
  94. package/docs/patterns/components-button-button--row-hug.tsx +1 -1
  95. package/docs/patterns/components-button-button--row-layout.tsx +1 -1
  96. package/docs/patterns/components-button-button--secondary-action.tsx +1 -1
  97. package/docs/patterns/components-button-button--suggestion-pills.tsx +1 -1
  98. package/docs/patterns/components-button-button--with-count.tsx +1 -1
  99. package/docs/patterns/components-button-button--with-icon.tsx +1 -1
  100. package/docs/patterns/components-button-floatingactionbutton--vertical-actions.tsx +1 -1
  101. package/docs/patterns/components-calembed--pattern-skip-in-footer.tsx +1 -1
  102. package/docs/patterns/components-card-card--body-slot-occupancy-history.tsx +1 -1
  103. package/docs/patterns/components-card-card--headerless-media.tsx +1 -1
  104. package/docs/patterns/components-card-card--outlined-layout.tsx +1 -1
  105. package/docs/patterns/components-card-card--pinned-height.tsx +1 -1
  106. package/docs/patterns/components-card-card--terminal-frame.tsx +1 -1
  107. package/docs/patterns/components-card-selectablecard--selectable-cards-pattern.tsx +1 -1
  108. package/docs/patterns/components-carousel--image-carousel.tsx +1 -1
  109. package/docs/patterns/components-chart--audience-activity-heatmap.tsx +1 -1
  110. package/docs/patterns/components-chart--cartesian-no-data-gaps.tsx +1 -1
  111. package/docs/patterns/components-chart--occupancy-history-in-card.tsx +1 -1
  112. package/docs/patterns/components-chart--occupancy-in-card.tsx +1 -1
  113. package/docs/patterns/components-chart--post-reach-distribution.tsx +1 -1
  114. package/docs/patterns/components-chart--ranked-audience-breakdown.tsx +1 -1
  115. package/docs/patterns/components-chart--revenue-by-line.tsx +1 -1
  116. package/docs/patterns/components-chart--segmented-ring-pattern.tsx +1 -1
  117. package/docs/patterns/components-chart--unit-grid-composition.tsx +1 -1
  118. package/docs/patterns/components-chatdock--pattern-chat-dock.tsx +1 -1
  119. package/docs/patterns/components-chatdock--pattern-start-project-gate.tsx +1 -1
  120. package/docs/patterns/components-chatqa--pattern-qa-with-reply.tsx +1 -1
  121. package/docs/patterns/components-checkbox-checkbox--default.tsx +1 -1
  122. package/docs/patterns/components-checkbox-checkbox--with-count.tsx +1 -1
  123. package/docs/patterns/components-checkbox-checkbox--with-description.tsx +1 -1
  124. package/docs/patterns/components-checkbox-checkboxgroup--default.tsx +1 -1
  125. package/docs/patterns/components-checkbox-checkboxgroup--option-counts.tsx +1 -1
  126. package/docs/patterns/components-copyfield--clipboard-blocked.tsx +1 -1
  127. package/docs/patterns/components-copyfield--copied.tsx +1 -1
  128. package/docs/patterns/components-copyfield--copy-key.tsx +1 -1
  129. package/docs/patterns/components-copyfield--on-navy.tsx +1 -1
  130. package/docs/patterns/components-descriptionlist--details.tsx +1 -1
  131. package/docs/patterns/components-descriptionlist--post-metadata.tsx +1 -1
  132. package/docs/patterns/components-dialog--alert-dialog-destructive.tsx +1 -1
  133. package/docs/patterns/components-dialog--alert-dialog-typed-confirmation.tsx +1 -1
  134. package/docs/patterns/components-dialog--default-dialog.tsx +1 -1
  135. package/docs/patterns/components-dialog--form-dialog.tsx +3 -3
  136. package/docs/patterns/components-displaycontrols--page-utilities.tsx +1 -1
  137. package/docs/patterns/components-displaycontrols--theme-switch.tsx +1 -1
  138. package/docs/patterns/components-errorsummary--contact-form.tsx +35 -0
  139. package/docs/patterns/components-field--horizontal-input.tsx +2 -2
  140. package/docs/patterns/components-field--horizontal-text-area.tsx +2 -2
  141. package/docs/patterns/components-field--multi-control.tsx +2 -2
  142. package/docs/patterns/components-filterpanel--panel.tsx +1 -1
  143. package/docs/patterns/components-footerreveal--marketing-hero-pattern.tsx +2 -2
  144. package/docs/patterns/components-footerreveal--marketing-hero-ruled-pattern.tsx +1 -1
  145. package/docs/patterns/components-footerreveal--marketing-hero-with-gallery-intro.tsx +2 -2
  146. package/docs/patterns/components-footerreveal--marketing-page-pattern.tsx +1 -1
  147. package/docs/patterns/components-footerreveal--ruled-grid-footer-pattern.tsx +2 -2
  148. package/docs/patterns/components-footerreveal--sequenced-marketing-hero.tsx +1 -1
  149. package/docs/patterns/components-herointro--two-line-intro.tsx +2 -2
  150. package/docs/patterns/components-herointro--with-actions.tsx +22 -0
  151. package/docs/patterns/components-herotilestack--marketing-hero-pattern.tsx +2 -2
  152. package/docs/patterns/components-herotilestack--marketing-hero-text-sequence.tsx +1 -1
  153. package/docs/patterns/components-herotilestack--marketing-hero-with-gallery-intro.tsx +2 -2
  154. package/docs/patterns/components-indexlist--post-index.tsx +1 -1
  155. package/docs/patterns/components-intakeconfirmation--booked-pattern.tsx +1 -1
  156. package/docs/patterns/components-intakeconfirmation--emailed-pattern.tsx +1 -1
  157. package/docs/patterns/components-intakeform--about-you-pattern.tsx +1 -1
  158. package/docs/patterns/components-intakeform--short-form-pattern.tsx +1 -1
  159. package/docs/patterns/components-intakemodal--intake-modal-pattern.tsx +1 -1
  160. package/docs/patterns/components-kbd--command-row.tsx +1 -1
  161. package/docs/patterns/components-kbd--numbered-choices.tsx +1 -1
  162. package/docs/patterns/components-kbd--shortcut.tsx +1 -1
  163. package/docs/patterns/components-linktile--resource-tile.tsx +1 -1
  164. package/docs/patterns/components-linktile--router-link.tsx +1 -1
  165. package/docs/patterns/components-logview--detail-pane.tsx +1 -1
  166. package/docs/patterns/components-logview--log-viewer.tsx +1 -1
  167. package/docs/patterns/components-moremenu--action-menu.tsx +1 -1
  168. package/docs/patterns/components-moremenu--in-card-header.tsx +1 -1
  169. package/docs/patterns/components-navlist--app-sidebar.tsx +1 -1
  170. package/docs/patterns/components-navlist--side-nav-settings.tsx +1 -1
  171. package/docs/patterns/components-pageheader--app-header-pattern.tsx +1 -1
  172. package/docs/patterns/components-pageheader--page-section-header.tsx +1 -1
  173. package/docs/patterns/components-pageheader--toolbar-header.tsx +1 -1
  174. package/docs/patterns/components-panel--end-detail-rail.tsx +1 -1
  175. package/docs/patterns/components-pillgroup--pill-group-pattern.tsx +1 -1
  176. package/docs/patterns/components-promptbar--pattern-prompt-bar.tsx +1 -1
  177. package/docs/patterns/components-prose--article-body.tsx +1 -1
  178. package/docs/patterns/components-radio-radiogroup--default.tsx +1 -1
  179. package/docs/patterns/components-scrollhorizontal--project-gallery-pattern.tsx +1 -1
  180. package/docs/patterns/components-scrollhorizontal--with-intro.tsx +1 -1
  181. package/docs/patterns/components-sectioncaption--column-caption.tsx +1 -1
  182. package/docs/patterns/components-sectioncaption--with-action.tsx +1 -1
  183. package/docs/patterns/components-sheet--bottom-sheet.tsx +3 -3
  184. package/docs/patterns/components-sheet--end-sheet.tsx +1 -1
  185. package/docs/patterns/components-sheet--side-sheet-header-actions.tsx +1 -1
  186. package/docs/patterns/components-sheet--side-sheet-url-deep-link.tsx +1 -1
  187. package/docs/patterns/components-sheet--side-sheet.tsx +1 -1
  188. package/docs/patterns/components-sitenav--brand-and-cta.tsx +1 -1
  189. package/docs/patterns/components-sitenav--centered-links.tsx +1 -1
  190. package/docs/patterns/components-sitenav--compact.tsx +1 -1
  191. package/docs/patterns/components-sitenav--marketing-header.tsx +2 -1
  192. package/docs/patterns/components-sitenav--mega-menu.tsx +1 -1
  193. package/docs/patterns/components-stat--hero-stat.tsx +1 -1
  194. package/docs/patterns/components-stat--insights-row.tsx +1 -1
  195. package/docs/patterns/components-stepprogress--step-progress-pattern.tsx +1 -1
  196. package/docs/patterns/components-switch--default.tsx +1 -1
  197. package/docs/patterns/components-switch--settings-row.tsx +1 -1
  198. package/docs/patterns/components-tab--settings-pages.tsx +1 -1
  199. package/docs/patterns/components-table--approvals-with-sheet.tsx +1 -1
  200. package/docs/patterns/components-table--approvals.tsx +3 -3
  201. package/docs/patterns/components-table--basic.tsx +1 -1
  202. package/docs/patterns/components-taskrows--action-details.tsx +1 -1
  203. package/docs/patterns/components-taskrows--capsules.tsx +1 -1
  204. package/docs/patterns/components-taskrows--card-with-status-rows.tsx +1 -1
  205. package/docs/patterns/components-taskrows--controlled-expand.tsx +1 -1
  206. package/docs/patterns/components-taskrows--custom-slots.tsx +1 -1
  207. package/docs/patterns/components-taskrows--needs-you-table.tsx +1 -1
  208. package/docs/patterns/components-taskrows--status-list.tsx +1 -1
  209. package/docs/patterns/components-taskrows--tag-chips.tsx +1 -1
  210. package/docs/patterns/components-textarea--save-status.tsx +1 -1
  211. package/docs/patterns/components-textlink--external-destination.tsx +1 -1
  212. package/docs/patterns/components-textlink--inline-prose.tsx +1 -1
  213. package/docs/patterns/components-textlink--quiet-title.tsx +1 -1
  214. package/docs/patterns/components-textlink--supporting-copy.tsx +1 -1
  215. package/docs/patterns/components-textsequence--default.tsx +1 -1
  216. package/docs/patterns/components-textsequence--reduced-motion.tsx +1 -1
  217. package/docs/patterns/components-textsequence--shapes.tsx +2 -2
  218. package/docs/patterns/components-tilegrid--masonry.tsx +1 -1
  219. package/docs/patterns/components-toast--stacked-notifications.tsx +1 -1
  220. package/docs/patterns/components-tooltip--controlled.tsx +1 -1
  221. package/docs/patterns/components-tooltip--disabled-control.tsx +1 -1
  222. package/docs/patterns/components-tooltip--icon-action.tsx +1 -1
  223. package/docs/patterns/components-tooltip--keyboard-shortcut.tsx +1 -1
  224. package/docs/patterns/components-tooltip--placement.tsx +1 -1
  225. package/docs/patterns/foundations-scroll-fade--horizontal-rail.tsx +1 -1
  226. package/docs/patterns/foundations-scroll-fade--overflowing-list.tsx +1 -1
  227. package/docs/patterns/guides-chart-explorations--comparison-gallery.tsx +1 -1
  228. package/docs/patterns/guides-filter-panel--filtered-grid.tsx +3 -3
  229. package/docs/patterns/guides-filter-panel--filtered-index.tsx +3 -3
  230. package/docs/patterns/guides-overlay-flows--notification-preferences.tsx +3 -3
  231. package/docs/patterns/guides-post-page--post-page.tsx +3 -3
  232. package/docs/patterns/guides-profile-typography--editorial-profile.tsx +6 -6
  233. package/docs/patterns/guides-resource-detail--detail.tsx +2 -2
  234. package/docs/patterns/index.json +17 -1
  235. package/package.json +1 -1
@@ -1,6 +1,6 @@
1
1
  # @thewhatmatters/wmds — component contracts
2
2
 
3
- Version 0.4.30. Generated from the WMDS repository's AGENTS.md (Storybook-first) by `scripts/generate-package-docs.mjs` — do not edit here.
3
+ Version 0.4.32. 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
 
@@ -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**.
@@ -53,6 +53,7 @@ Storybook paths such as **Components/Button/Button → Pattern — …** name a
53
53
  - **PromptBar:** wide prompt pill — inline **TextArea** (one line when empty, grows through 3 lines, then scrolls) and an inset **IconButton** `sm` send control. Enter sends; Shift+Enter inserts a newline; send stays disabled until the draft has text. Optional `start` (brand mark — **Avatar** `size="md"`) and `end` (extra inset **IconButton** `sm`) slots. No new Button role. Copy **Components/PromptBar → Pattern — prompt bar**. The site assistant on the marketing pages is **ChatDock**, not a hand-pinned PromptBar. Do not restyle **SiteNav**. Full contract: **docs/component-contracts.md → PromptBar**.
54
54
  - **ChatDock:** the site assistant — a **PromptBar** pinned to the bottom of the page grid (`--grid-max: 40rem`, under **SiteNav**) with the brand `mark`; hovering shows `suggestions` that carry a `prompt` as **Button** `secondary` pills above it; focusing, clicking, or typing opens a non-modal chat window around the same composer (shared overlay header with `title` / `subtitle` / close, `greeting`, `messages` (visitor turns on `bg-brand-tint`, replies as plain text), `thinking` row, suggestion rows — **Button** `layout="row"` — until the first message (a row that sends hands focus to the composer as the rows leave), `disclaimer` under the composer). One **PromptBar** serves both states: the window grows up out of the bar and Escape or close folds it back; either reverses the other midway. Below `md` it fills the screen, rising from the bottom edge. Reduced motion crossfades. `followUps` (same items as `suggestions`; `icon` not shown — inline rows lead with **CornerDownRight**, composer pills are text only) show under the latest reply only — hidden while `thinking`, gone the moment the visitor sends; `followUpsPlacement` is `inline` (default, rows in the thread, 44px on phones) or `composer` (pills above the composer). Under each finished reply, a row: **Copy** (`copyText`), thumbs (`onMessageFeedback`, on replies that carry `feedback` — `null` until the visitor votes; **IconButton** `pressed`), and a muted score (`meta: { label, description? }`, e.g. "Match 99%") — each part on its own; shown on hover or focus where the pointer can hover, always on touch; it keeps its place so the thread never moves, and stays empty while the latest reply is still arriving. Never put actions inside `content`. `gate` puts a multi-step form in the conversation — **ChatDock.Gate**, under the latest message where a reply would go, set in as a well (hairline border at the card body radius, `bg-body`, `shadow-inset-well` — embedded, not raised): step title, subtitle, previous · "2 of 4" · next (no close of its own), the step, `pending` ("Sending…") / `error` lines, and a footer (start slot, Cancel, Next). Setting it opens the window and takes focus; the window keeps its header (`gateSubtitle` replaces the subtitle) and its close; the composer stays in place but is off (`labels.gatePlaceholder`); suggestion rows, follow-ups, and reply rows step aside. The window grows to fit the step, up to the viewport less 7rem; past that the conversation scrolls, and each step is brought into view. The window stays non-modal. Its close and Escape fold it and keep the gate with its progress; Cancel leaves the gate and the composer comes back with focus. Phones keep the window inside the area a keyboard leaves visible. Start a project runs as a gate, not a dialog — paste **Pattern — start a project gate** (its `onSubmit` returns a promise; a rejection keeps the answers and offers Try again) and return it from **Pattern — chat dock**'s `renderStartProject`. Never put a form inside `content`. The app owns `messages`, `followUps`, votes, the gate's open state, and `onSend`; suggestions without a `prompt` (for example **Start a project**) only call `onSuggestionSelect`. No full-page chat, no header send/expand arrow, no voice. `placement="inline"` is for previews only. Copy **Components/ChatDock → Pattern — chat dock** (it holds the follow-up state, the votes, and Start a project). See **ADR-0039**. Full contract: **docs/component-contracts.md → ChatDock**.
55
55
  - **TextArea:** element-radius multiline — same optional `label`, `description`, `status`, `message`, and `loading` as **Input**; default `resize="vertical"`. See **ADR-0006**.
56
+ - **ErrorSummary:** after a failed submit, at the top of the form: "There's a problem" (`title`), `errors` `{ field, message }[]` (one link per error, same words as the field's message; `field` is the input `id`), takes focus when its errors change (`focusOnShow`), each link focuses its field; `as` `h2` / `h3`. Fields keep their inline messages. Paste **Components/ErrorSummary → Pattern — form with an error summary**.
56
57
  - **Field:** label/layout wrapper — `orientation="vertical" | "horizontal"`; never required. Validation stays on **Input** / **TextArea**. See **ADR-0006**.
57
58
  - **CopyField:** read-only monospace value inside **PromptBar**'s pill, with **Button** `role="secondary"` `size="sm"` seated at the trailing end the way PromptBar seats send (Lucide **Copy**; the confirmation check is the status glyph). **Input** is `inline` `mono` `readOnly` (`type-code`); a long value truncates and does not run under the button. A click copies `value`. The label becomes "Copied" for `buttonStatusHoldMs` (2s), announced from the button's `aria-live="polite"` region, then returns. Enter and Space activate the button; focusing the value selects it, so Cmd/Ctrl+C copies from the field. If the Clipboard API is missing or blocked, the value is selected, `execCommand('copy')` is tried, and a polite hint reads "Press Cmd/Ctrl+C to copy." The value is never logged. The label and the blocked-clipboard hint inherit color (`type-label` / `type-supporting`, not `text-fg` or `text-muted`); the pill stays `bg-surface` so the key stays dark on white. On navy, wrap the section in `bg-brand text-on-brand` and use **Button** `role="inverse"` plus `role="inverse-outline"`. Do not set `data-theme="dark"` on that section — the dark surface is about 1:1 on `#011272`. `state` (`"copied"` | `"fallback"`) pins a specimen — omit it in the app. `className` is layout only. No new color. Paste **Components/CopyField → Pattern — copy key**, or **Pattern — on a navy field** for the unlock page. See **ADR-0045**, **ADR-0046**.
58
59
  - **LogView:** a scrolling log — `lines`, `label`, line numbers, a tabular line count, **Copy** (**Button**), and **Follow** (`aria-pressed`, keeps the scroller on the last line). `loading` is a **Skeleton**. An empty log reads "No log lines". `className` is layout only. Paste **Components/LogView → Pattern — log viewer**. The dark run detail is **Pattern — detail pane**: prev/next **IconButton**, **Badge** tags, **Stat** `detail`, and **LogView**, wrapped in `data-theme="dark"`.
package/docs/exports.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "package": "@thewhatmatters/wmds",
3
- "version": "0.4.30",
3
+ "version": "0.4.32",
4
4
  "import": "import { Button } from \"@thewhatmatters/wmds\";",
5
5
  "styles": [
6
6
  "@thewhatmatters/wmds/styles.css",
@@ -350,6 +350,19 @@
350
350
  },
351
351
  "patterns": []
352
352
  },
353
+ {
354
+ "name": "ErrorSummary",
355
+ "tier": "molecule",
356
+ "category": "Form controls",
357
+ "summary": "\"There's a problem\" at the top of a form after a failed submit: one link per error that focuses its field.",
358
+ "storybook": {
359
+ "title": "Components/ErrorSummary",
360
+ "docs": "?path=/docs/components-errorsummary--docs"
361
+ },
362
+ "patterns": [
363
+ "components-errorsummary--contact-form"
364
+ ]
365
+ },
353
366
  {
354
367
  "name": "Field",
355
368
  "tier": "molecule",
@@ -419,7 +432,8 @@
419
432
  "docs": "?path=/docs/components-herointro--docs"
420
433
  },
421
434
  "patterns": [
422
- "components-herointro--two-line-intro"
435
+ "components-herointro--two-line-intro",
436
+ "components-herointro--with-actions"
423
437
  ]
424
438
  },
425
439
  {
@@ -1,4 +1,4 @@
1
- // @thewhatmatters/wmds@0.4.30 · Pattern — flush
1
+ // @thewhatmatters/wmds@0.4.32 · 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.30 · Pattern — portal dashboard
1
+ // @thewhatmatters/wmds@0.4.32 · 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.30 · Pattern — dropdown row
1
+ // @thewhatmatters/wmds@0.4.32 · 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.30 · Pattern — outline tags
1
+ // @thewhatmatters/wmds@0.4.32 · 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.30 · Pattern — status pill
1
+ // @thewhatmatters/wmds@0.4.32 · 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.30 · Pattern — with avatar
1
+ // @thewhatmatters/wmds@0.4.32 · 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.30 · Pattern — page in bands
1
+ // @thewhatmatters/wmds@0.4.32 · 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.30 · Pattern — editorial
1
+ // @thewhatmatters/wmds@0.4.32 · 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.30 · Pattern — long path
1
+ // @thewhatmatters/wmds@0.4.32 · 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.30 · Pattern — path
1
+ // @thewhatmatters/wmds@0.4.32 · 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.30 · Pattern — router links
1
+ // @thewhatmatters/wmds@0.4.32 · 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.30 · Pattern — copy button
1
+ // @thewhatmatters/wmds@0.4.32 · 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.30 · Pattern — destructive action
1
+ // @thewhatmatters/wmds@0.4.32 · 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.30 · Pattern — external link
1
+ // @thewhatmatters/wmds@0.4.32 · 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.30 · Pattern — ghost action
1
+ // @thewhatmatters/wmds@0.4.32 · 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.30 · Pattern — inverse action
1
+ // @thewhatmatters/wmds@0.4.32 · 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.30 · Pattern — link
1
+ // @thewhatmatters/wmds@0.4.32 · 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.30 · Pattern — submit / async
1
+ // @thewhatmatters/wmds@0.4.32 · 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.30 · Pattern — outline mono
1
+ // @thewhatmatters/wmds@0.4.32 · 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.30 · Pattern — primary action
1
+ // @thewhatmatters/wmds@0.4.32 · 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.30 · Pattern — row (hug)
1
+ // @thewhatmatters/wmds@0.4.32 · 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.30 · Pattern — row
1
+ // @thewhatmatters/wmds@0.4.32 · 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.30 · Pattern — secondary action
1
+ // @thewhatmatters/wmds@0.4.32 · 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.30 · Pattern — suggestion pills
1
+ // @thewhatmatters/wmds@0.4.32 · 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.30 · Pattern — with count
1
+ // @thewhatmatters/wmds@0.4.32 · 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.30 · Pattern — with icon
1
+ // @thewhatmatters/wmds@0.4.32 · 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.30 · Pattern — vertical actions
1
+ // @thewhatmatters/wmds@0.4.32 · 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.30 · Pattern — skip in footer
1
+ // @thewhatmatters/wmds@0.4.32 · 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.30 · Example — body slot (occupancy history)
1
+ // @thewhatmatters/wmds@0.4.32 · 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.30 · Pattern — headerless media
1
+ // @thewhatmatters/wmds@0.4.32 · 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.30 · Pattern — outlined layout
1
+ // @thewhatmatters/wmds@0.4.32 · 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.30 · Pattern — pinned height
1
+ // @thewhatmatters/wmds@0.4.32 · 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.30 · Pattern — terminal frame
1
+ // @thewhatmatters/wmds@0.4.32 · 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.30 · Pattern — selectable cards
1
+ // @thewhatmatters/wmds@0.4.32 · 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.30 · Pattern — image carousel
1
+ // @thewhatmatters/wmds@0.4.32 · 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.30 · Pattern — matrix heatmap
1
+ // @thewhatmatters/wmds@0.4.32 · 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.30 · Pattern — Cartesian no-data gaps
1
+ // @thewhatmatters/wmds@0.4.32 · 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.30 · Pattern — occupancy history in Card
1
+ // @thewhatmatters/wmds@0.4.32 · 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.30 · Pattern — occupancy KPI in Card
1
+ // @thewhatmatters/wmds@0.4.32 · 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.30 · Pattern — distribution strip
1
+ // @thewhatmatters/wmds@0.4.32 · 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.30 · Pattern — ranked audience breakdown
1
+ // @thewhatmatters/wmds@0.4.32 · 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.30 · Pattern — revenue by line
1
+ // @thewhatmatters/wmds@0.4.32 · 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.30 · Pattern — segmented ring
1
+ // @thewhatmatters/wmds@0.4.32 · 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.30 · Pattern — 100-unit composition
1
+ // @thewhatmatters/wmds@0.4.32 · 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
 
@@ -1,4 +1,4 @@
1
- // @thewhatmatters/wmds@0.4.30 · Pattern — chat dock
1
+ // @thewhatmatters/wmds@0.4.32 · Pattern — chat dock
2
2
  // Storybook: Components/ChatDock → Pattern — chat dock (?path=/story/components-chatdock--pattern-chat-dock)
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.30 · Pattern — start a project gate
1
+ // @thewhatmatters/wmds@0.4.32 · Pattern — start a project gate
2
2
  // Storybook: Components/ChatDock → Pattern — start a project gate (?path=/story/components-chatdock--pattern-start-project-gate)
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.30 · Pattern — Q&A with reply
1
+ // @thewhatmatters/wmds@0.4.32 · Pattern — Q&A with reply
2
2
  // Storybook: Components/ChatQa → Pattern — Q&A with reply (?path=/story/components-chatqa--pattern-qa-with-reply)
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.30 · Pattern — default
1
+ // @thewhatmatters/wmds@0.4.32 · Pattern — default
2
2
  // Storybook: Components/Checkbox/Checkbox → Pattern — default (?path=/story/components-checkbox-checkbox--default)
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.30 · Pattern — with count
1
+ // @thewhatmatters/wmds@0.4.32 · Pattern — with count
2
2
  // Storybook: Components/Checkbox/Checkbox → Pattern — with count (?path=/story/components-checkbox-checkbox--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.30 · Pattern — with description
1
+ // @thewhatmatters/wmds@0.4.32 · Pattern — with description
2
2
  // Storybook: Components/Checkbox/Checkbox → Pattern — with description (?path=/story/components-checkbox-checkbox--with-description)
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.30 · Pattern — default
1
+ // @thewhatmatters/wmds@0.4.32 · Pattern — default
2
2
  // Storybook: Components/Checkbox/CheckboxGroup → Pattern — default (?path=/story/components-checkbox-checkboxgroup--default)
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.30 · Pattern — option counts
1
+ // @thewhatmatters/wmds@0.4.32 · Pattern — option counts
2
2
  // Storybook: Components/Checkbox/CheckboxGroup → Pattern — option counts (?path=/story/components-checkbox-checkboxgroup--option-counts)
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.30 · Pattern — clipboard blocked
1
+ // @thewhatmatters/wmds@0.4.32 · Pattern — clipboard blocked
2
2
  // Storybook: Components/CopyField → Pattern — clipboard blocked (?path=/story/components-copyfield--clipboard-blocked)
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.30 · Pattern — copied
1
+ // @thewhatmatters/wmds@0.4.32 · Pattern — copied
2
2
  // Storybook: Components/CopyField → Pattern — copied (?path=/story/components-copyfield--copied)
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.30 · Pattern — copy key
1
+ // @thewhatmatters/wmds@0.4.32 · Pattern — copy key
2
2
  // Storybook: Components/CopyField → Pattern — copy key (?path=/story/components-copyfield--copy-key)
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.30 · Pattern — on a navy field
1
+ // @thewhatmatters/wmds@0.4.32 · Pattern — on a navy field
2
2
  // Storybook: Components/CopyField → Pattern — on a navy field (?path=/story/components-copyfield--on-navy)
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.30 · Pattern — details
1
+ // @thewhatmatters/wmds@0.4.32 · Pattern — details
2
2
  // Storybook: Components/DescriptionList → Pattern — details (?path=/story/components-descriptionlist--details)
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.30 · Pattern — post metadata
1
+ // @thewhatmatters/wmds@0.4.32 · Pattern — post metadata
2
2
  // Storybook: Components/DescriptionList → Pattern — post metadata (?path=/story/components-descriptionlist--post-metadata)
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.30 · Pattern — alert dialog (destructive)
1
+ // @thewhatmatters/wmds@0.4.32 · Pattern — alert dialog (destructive)
2
2
  // Storybook: Components/Dialog → Pattern — alert dialog (destructive) (?path=/story/components-dialog--alert-dialog-destructive)
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.30 · Pattern — alert dialog (typed confirmation delete)
1
+ // @thewhatmatters/wmds@0.4.32 · Pattern — alert dialog (typed confirmation delete)
2
2
  // Storybook: Components/Dialog → Pattern — alert dialog (typed confirmation delete) (?path=/story/components-dialog--alert-dialog-typed-confirmation)
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.30 · Pattern — dialog
1
+ // @thewhatmatters/wmds@0.4.32 · Pattern — dialog
2
2
  // Storybook: Components/Dialog → Pattern — dialog (?path=/story/components-dialog--default-dialog)
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.30 · Pattern — form dialog
1
+ // @thewhatmatters/wmds@0.4.32 · Pattern — form dialog
2
2
  // Storybook: Components/Dialog → Pattern — form dialog (?path=/story/components-dialog--form-dialog)
3
3
  // Show code — copy verbatim and keep this header; upgrades find pasted patterns by it.
4
4
 
@@ -31,8 +31,8 @@ export function InviteDialog() {
31
31
  }
32
32
  >
33
33
  <div className="flex flex-col gap-4 pb-2">
34
- <Input label="Email address" placeholder="name@company.com" />
35
- <Input label="Role" placeholder="Editor" />
34
+ <Input label="Email address" />
35
+ <Input label="Role" />
36
36
  </div>
37
37
  </Dialog.Content>
38
38
  </Dialog>
@@ -1,4 +1,4 @@
1
- // @thewhatmatters/wmds@0.4.30 · Pattern — page display controls
1
+ // @thewhatmatters/wmds@0.4.32 · Pattern — page display controls
2
2
  // Storybook: Components/DisplayControls → Pattern — page display controls (?path=/story/components-displaycontrols--page-utilities)
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.30 · Pattern — theme switch
1
+ // @thewhatmatters/wmds@0.4.32 · Pattern — theme switch
2
2
  // Storybook: Components/DisplayControls → Pattern — theme switch (?path=/story/components-displaycontrols--theme-switch)
3
3
  // Show code — copy verbatim and keep this header; upgrades find pasted patterns by it.
4
4