@thewhatmatters/wmds 0.4.8 → 0.4.9

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 (158) hide show
  1. package/CHANGELOG.md +31 -2
  2. package/CONSUMING.md +1 -1
  3. package/bin/wmds-check.mjs +8 -4
  4. package/dist/components/atoms/TextLink/TextLink.d.ts +9 -3
  5. package/dist/components/atoms/TextLink/TextLink.d.ts.map +1 -1
  6. package/dist/components/atoms/TextLink/TextLink.js +22 -17
  7. package/dist/components/molecules/IndexList/IndexList.d.ts +6 -3
  8. package/dist/components/molecules/IndexList/IndexList.d.ts.map +1 -1
  9. package/dist/components/molecules/IndexList/IndexList.js +22 -21
  10. package/dist/components/molecules/LinkTile/LinkTile.d.ts.map +1 -1
  11. package/dist/components/molecules/LinkTile/LinkTile.js +74 -68
  12. package/dist/components/molecules/LinkTile/linkTileStyles.d.ts +7 -1
  13. package/dist/components/molecules/LinkTile/linkTileStyles.d.ts.map +1 -1
  14. package/dist/components/molecules/LinkTile/linkTileStyles.js +2 -2
  15. package/dist/components/molecules/TileGrid/tileGridStyles.d.ts +2 -2
  16. package/dist/lib/typography.d.ts +2 -2
  17. package/dist/lib/typography.d.ts.map +1 -1
  18. package/dist/lib/typography.js +11 -0
  19. package/dist/styles.css +1 -1
  20. package/dist/typography.css +16 -0
  21. package/docs/components.md +7 -7
  22. package/docs/exports.json +1 -1
  23. package/docs/patterns/components-accordion--flush.tsx +1 -1
  24. package/docs/patterns/components-avatar--dropdown-row.tsx +1 -1
  25. package/docs/patterns/components-badge--outline-tags.tsx +1 -1
  26. package/docs/patterns/components-badge--with-avatar.tsx +1 -1
  27. package/docs/patterns/components-breadcrumb--editorial.tsx +1 -1
  28. package/docs/patterns/components-breadcrumb--long-path.tsx +1 -1
  29. package/docs/patterns/components-breadcrumb--path.tsx +1 -1
  30. package/docs/patterns/components-breadcrumb--router-links.tsx +1 -1
  31. package/docs/patterns/components-button-button--copy-button.tsx +1 -1
  32. package/docs/patterns/components-button-button--destructive-action.tsx +1 -1
  33. package/docs/patterns/components-button-button--external-link.tsx +1 -1
  34. package/docs/patterns/components-button-button--ghost-action.tsx +1 -1
  35. package/docs/patterns/components-button-button--inverse-action.tsx +1 -1
  36. package/docs/patterns/components-button-button--link-render.tsx +1 -1
  37. package/docs/patterns/components-button-button--multi-state-badge.tsx +1 -1
  38. package/docs/patterns/components-button-button--outline-mono.tsx +1 -1
  39. package/docs/patterns/components-button-button--primary-action.tsx +1 -1
  40. package/docs/patterns/components-button-button--row-hug.tsx +1 -1
  41. package/docs/patterns/components-button-button--row-layout.tsx +1 -1
  42. package/docs/patterns/components-button-button--secondary-action.tsx +1 -1
  43. package/docs/patterns/components-button-button--suggestion-pills.tsx +1 -1
  44. package/docs/patterns/components-button-button--with-count.tsx +1 -1
  45. package/docs/patterns/components-button-button--with-icon.tsx +1 -1
  46. package/docs/patterns/components-button-floatingactionbutton--vertical-actions.tsx +1 -1
  47. package/docs/patterns/components-calembed--pattern-skip-in-footer.tsx +1 -1
  48. package/docs/patterns/components-card-card--body-slot-occupancy-history.tsx +1 -1
  49. package/docs/patterns/components-card-card--headerless-media.tsx +1 -1
  50. package/docs/patterns/components-card-card--outlined-layout.tsx +1 -1
  51. package/docs/patterns/components-card-card--pinned-height.tsx +1 -1
  52. package/docs/patterns/components-card-selectablecard--selectable-cards-pattern.tsx +1 -1
  53. package/docs/patterns/components-carousel--image-carousel.tsx +1 -1
  54. package/docs/patterns/components-chart--audience-activity-heatmap.tsx +1 -1
  55. package/docs/patterns/components-chart--cartesian-no-data-gaps.tsx +1 -1
  56. package/docs/patterns/components-chart--occupancy-history-in-card.tsx +1 -1
  57. package/docs/patterns/components-chart--occupancy-in-card.tsx +1 -1
  58. package/docs/patterns/components-chart--post-reach-distribution.tsx +1 -1
  59. package/docs/patterns/components-chart--ranked-audience-breakdown.tsx +1 -1
  60. package/docs/patterns/components-chart--unit-grid-composition.tsx +1 -1
  61. package/docs/patterns/components-chatdock--pattern-chat-dock.tsx +1 -1
  62. package/docs/patterns/components-chatdock--pattern-start-project-gate.tsx +1 -1
  63. package/docs/patterns/components-chatqa--pattern-qa-with-reply.tsx +1 -1
  64. package/docs/patterns/components-checkbox-checkbox--default.tsx +1 -1
  65. package/docs/patterns/components-checkbox-checkbox--with-count.tsx +1 -1
  66. package/docs/patterns/components-checkbox-checkbox--with-description.tsx +1 -1
  67. package/docs/patterns/components-checkbox-checkboxgroup--default.tsx +1 -1
  68. package/docs/patterns/components-checkbox-checkboxgroup--option-counts.tsx +1 -1
  69. package/docs/patterns/components-descriptionlist--details.tsx +1 -1
  70. package/docs/patterns/components-descriptionlist--post-metadata.tsx +1 -1
  71. package/docs/patterns/components-dialog--alert-dialog-destructive.tsx +1 -1
  72. package/docs/patterns/components-dialog--default-dialog.tsx +1 -1
  73. package/docs/patterns/components-dialog--form-dialog.tsx +1 -1
  74. package/docs/patterns/components-displaycontrols--page-utilities.tsx +1 -1
  75. package/docs/patterns/components-field--horizontal-input.tsx +1 -1
  76. package/docs/patterns/components-field--horizontal-text-area.tsx +1 -1
  77. package/docs/patterns/components-field--multi-control.tsx +1 -1
  78. package/docs/patterns/components-filterpanel--panel.tsx +1 -1
  79. package/docs/patterns/components-footerreveal--marketing-hero-pattern.tsx +1 -1
  80. package/docs/patterns/components-footerreveal--marketing-hero-ruled-pattern.tsx +1 -1
  81. package/docs/patterns/components-footerreveal--marketing-hero-with-gallery-intro.tsx +1 -1
  82. package/docs/patterns/components-footerreveal--marketing-page-pattern.tsx +1 -1
  83. package/docs/patterns/components-footerreveal--ruled-grid-footer-pattern.tsx +1 -1
  84. package/docs/patterns/components-footerreveal--sequenced-marketing-hero.tsx +1 -1
  85. package/docs/patterns/components-herointro--two-line-intro.tsx +1 -1
  86. package/docs/patterns/components-herotilestack--marketing-hero-pattern.tsx +1 -1
  87. package/docs/patterns/components-herotilestack--marketing-hero-text-sequence.tsx +1 -1
  88. package/docs/patterns/components-herotilestack--marketing-hero-with-gallery-intro.tsx +1 -1
  89. package/docs/patterns/components-indexlist--post-index.tsx +1 -1
  90. package/docs/patterns/components-intakeconfirmation--booked-pattern.tsx +1 -1
  91. package/docs/patterns/components-intakeconfirmation--emailed-pattern.tsx +1 -1
  92. package/docs/patterns/components-intakeform--about-you-pattern.tsx +1 -1
  93. package/docs/patterns/components-intakeform--short-form-pattern.tsx +1 -1
  94. package/docs/patterns/components-intakemodal--intake-modal-pattern.tsx +1 -1
  95. package/docs/patterns/components-kbd--command-row.tsx +1 -1
  96. package/docs/patterns/components-kbd--numbered-choices.tsx +1 -1
  97. package/docs/patterns/components-kbd--shortcut.tsx +1 -1
  98. package/docs/patterns/components-linktile--resource-tile.tsx +1 -1
  99. package/docs/patterns/components-linktile--router-link.tsx +1 -1
  100. package/docs/patterns/components-moremenu--action-menu.tsx +1 -1
  101. package/docs/patterns/components-moremenu--in-card-header.tsx +1 -1
  102. package/docs/patterns/components-navlist--side-nav-settings.tsx +1 -1
  103. package/docs/patterns/components-pageheader--app-header-pattern.tsx +1 -1
  104. package/docs/patterns/components-pageheader--page-section-header.tsx +1 -1
  105. package/docs/patterns/components-pageheader--toolbar-header.tsx +1 -1
  106. package/docs/patterns/components-panel--end-detail-rail.tsx +1 -1
  107. package/docs/patterns/components-pillgroup--pill-group-pattern.tsx +1 -1
  108. package/docs/patterns/components-promptbar--pattern-prompt-bar.tsx +1 -1
  109. package/docs/patterns/components-prose--article-body.tsx +1 -1
  110. package/docs/patterns/components-radio-radiogroup--default.tsx +1 -1
  111. package/docs/patterns/components-scrollhorizontal--project-gallery-pattern.tsx +1 -1
  112. package/docs/patterns/components-scrollhorizontal--with-intro.tsx +1 -1
  113. package/docs/patterns/components-sectioncaption--column-caption.tsx +1 -1
  114. package/docs/patterns/components-sectioncaption--with-action.tsx +1 -1
  115. package/docs/patterns/components-sheet--bottom-sheet.tsx +1 -1
  116. package/docs/patterns/components-sheet--end-sheet.tsx +1 -1
  117. package/docs/patterns/components-sitenav--brand-and-cta.tsx +1 -1
  118. package/docs/patterns/components-sitenav--centered-links.tsx +1 -1
  119. package/docs/patterns/components-sitenav--compact.tsx +1 -1
  120. package/docs/patterns/components-sitenav--marketing-header.tsx +1 -1
  121. package/docs/patterns/components-sitenav--mega-menu.tsx +1 -1
  122. package/docs/patterns/components-stat--insights-row.tsx +1 -1
  123. package/docs/patterns/components-stepprogress--step-progress-pattern.tsx +1 -1
  124. package/docs/patterns/components-switch--default.tsx +1 -1
  125. package/docs/patterns/components-switch--settings-row.tsx +1 -1
  126. package/docs/patterns/components-tab--settings-pages.tsx +1 -1
  127. package/docs/patterns/components-taskrows--action-details.tsx +1 -1
  128. package/docs/patterns/components-taskrows--capsules.tsx +1 -1
  129. package/docs/patterns/components-taskrows--card-with-status-rows.tsx +1 -1
  130. package/docs/patterns/components-taskrows--controlled-expand.tsx +1 -1
  131. package/docs/patterns/components-taskrows--custom-slots.tsx +1 -1
  132. package/docs/patterns/components-taskrows--status-list.tsx +1 -1
  133. package/docs/patterns/components-taskrows--tag-chips.tsx +1 -1
  134. package/docs/patterns/components-textlink--external-destination.tsx +1 -1
  135. package/docs/patterns/components-textlink--inline-prose.tsx +1 -1
  136. package/docs/patterns/components-textlink--quiet-title.tsx +1 -1
  137. package/docs/patterns/components-textlink--supporting-copy.tsx +1 -1
  138. package/docs/patterns/components-textsequence--default.tsx +1 -1
  139. package/docs/patterns/components-textsequence--reduced-motion.tsx +1 -1
  140. package/docs/patterns/components-textsequence--shapes.tsx +1 -1
  141. package/docs/patterns/components-tilegrid--masonry.tsx +1 -1
  142. package/docs/patterns/components-toast--stacked-notifications.tsx +1 -1
  143. package/docs/patterns/components-tooltip--controlled.tsx +1 -1
  144. package/docs/patterns/components-tooltip--disabled-control.tsx +1 -1
  145. package/docs/patterns/components-tooltip--icon-action.tsx +1 -1
  146. package/docs/patterns/components-tooltip--keyboard-shortcut.tsx +1 -1
  147. package/docs/patterns/components-tooltip--placement.tsx +1 -1
  148. package/docs/patterns/foundations-scroll-fade--horizontal-rail.tsx +1 -1
  149. package/docs/patterns/foundations-scroll-fade--overflowing-list.tsx +1 -1
  150. package/docs/patterns/guides-chart-explorations--comparison-gallery.tsx +1 -1
  151. package/docs/patterns/guides-filter-panel--filtered-grid.tsx +1 -1
  152. package/docs/patterns/guides-filter-panel--filtered-index.tsx +7 -3
  153. package/docs/patterns/guides-overlay-flows--notification-preferences.tsx +1 -1
  154. package/docs/patterns/guides-post-page--post-page.tsx +21 -4
  155. package/docs/patterns/guides-profile-typography--editorial-profile.tsx +1 -1
  156. package/docs/patterns/guides-resource-detail--detail.tsx +13 -4
  157. package/docs/patterns/index.json +1 -1
  158. package/package.json +1 -1
@@ -106,6 +106,15 @@
106
106
  --text-supporting-weight: var(--font-weight-normal);
107
107
  --text-supporting-leading: 1.6667;
108
108
 
109
+ /**
110
+ * WMDS extension — a single line directly under a label: `type-supporting`'s size and weight on
111
+ * a 16px line, so the pair reads as one unit (**LinkTile**'s meta line). Not for wrapped text —
112
+ * that stays on `type-supporting`.
113
+ */
114
+ --text-caption-size: var(--text-supporting-size);
115
+ --text-caption-weight: var(--text-supporting-weight);
116
+ --text-caption-leading: 1.3333;
117
+
109
118
  --text-code-size: var(--font-size-base);
110
119
  --text-code-weight: var(--font-weight-normal);
111
120
  --text-code-leading: 1.4286;
@@ -227,6 +236,13 @@
227
236
  line-height: var(--text-supporting-leading);
228
237
  }
229
238
 
239
+ @utility type-caption {
240
+ font-family: var(--font-family-body);
241
+ font-size: var(--text-caption-size);
242
+ font-weight: var(--text-caption-weight);
243
+ line-height: var(--text-caption-leading);
244
+ }
245
+
230
246
  @utility type-code {
231
247
  font-family: var(--font-family-code);
232
248
  font-size: var(--text-code-size);
@@ -1,13 +1,13 @@
1
1
  # @thewhatmatters/wmds — component contracts
2
2
 
3
- Version 0.4.8. Generated from the WMDS repository's AGENTS.md (Storybook-first) by `scripts/generate-package-docs.mjs` — do not edit here.
3
+ Version 0.4.9. 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); 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-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); 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**.
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">`.
@@ -16,7 +16,7 @@ Storybook paths such as **Components/Button/Button → Pattern — …** name a
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**.
19
- - **TextLink:** inline anchor for navigation — `variant="prose"` (default) inside prose: canonical solid underline, stronger hover decoration, and focus ring. **`variant="quiet"`** for headline-size text and list titles: no underline at rest, an underline scaled to the text on hover and focus, the same focus ring; inherits size and weight from the heading around it — never inside running prose. `external` opens a new tab and appends Lucide **SquareArrowOutUpRight** with spoken context. Inherits surrounding type size; `className` is layout only. Use **Button** for actions. Copy **Components/TextLink → Pattern — inline prose link** or **Pattern — quiet title link**.
19
+ - **TextLink:** inline anchor for navigation — `variant="prose"` (default) inside prose: canonical solid underline, stronger hover decoration, and focus ring. **`variant="quiet"`** for headline-size text and list titles: no underline at rest, an underline scaled to the text on hover and focus, the same focus ring; inherits size and weight from the heading around it — never inside running prose. `external` opens a new tab and appends Lucide **SquareArrowOutUpRight** with spoken context. `render={<Link href />}` in place of `href` composes the link onto the app's router link. Inherits surrounding type size; `className` is layout only. Use **Button** for actions. Copy **Components/TextLink → Pattern — inline prose link** or **Pattern — quiet title link**.
20
20
  - **Tooltip:** short supplemental label — **`Tooltip.Provider`** shares hover delay; **`Tooltip.Trigger render={...}`** composes a ref/DOM-prop-forwarding control; **`Tooltip.Content`** portals with collision-aware physical or logical placement. Opens on hover/focus, closes with Escape, and does not open on touch. No essential or interactive content. Disabled native controls need the documented focusable wrapper. Copy **Components/Tooltip → Pattern — …**.
21
21
  - **Badge:** solid, **muted**, and **outline** (hairline, transparent fill) semantic fills. Patterns: label, **`emphasis="muted"`**, **`emphasis="outline"`** + **`mono`** (mono caps, as **Button** `mono` — author and category tags), **`render={<a href />}`** (a tag that navigates: hover underline, focus ring, 44px-tall hit area — **Pattern — outline tags**), `count`, `icon`, **`avatar`**, **`iconOnly`** — mutually exclusive where documented. Actions stay on **Button**. **`avatar={{ src, alt }}`** renders **Avatar** at the badge size (`badgeAvatarSize`: sm → 20px, md → 24px). **`BadgeSegmentCount`** for filter/tab segment totals (Chip trailing count). No **Status** dot inside Badge. See **ADR-0033**.
22
22
  - **Chip:** filter/toggle molecule — composes **`BadgeIcon`** / **`ButtonIcon`**, **`IconButton inset`** (remove), **`BadgeSegmentCount`** (count). Patterns: **multi-select filter** (`ChipFilterGroup` + `value`), single-select group, standalone `selected`, **removable** (`onRemove`), **read-only**. Sizes `sm` | `md` | `lg`. Optional `icon`, `count` — not with `onRemove`. No slots.
@@ -40,10 +40,10 @@ Storybook paths such as **Components/Button/Button → Pattern — …** name a
40
40
  - **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**.
41
41
  - **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**.
42
42
  - **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**.
43
- - **IndexList:** editorial index for list pages (blog, case studies) — **IndexList.Item** rows with `meta` (a `<time>`), a linked `title` (`href`; 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** is planned. 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**.
44
- - **LinkTile:** a resource tile that is one link — `title`, `href` (or `render={<Link href />}` for a router link), `media` (an `<img>` or `next/image` with its `width` and `height`; one image, not a video), `meta` (one line, for example the domain), optional `tag` (a **Badge**, over the image's top-start corner) and `source` (**Avatar** `size="xsm"` or a 20px favicon, before the title). The whole tile is the anchor: one hit area, one focus ring; never put a link or a button inside it. `external` opens a new tab with a safe `rel`, the trailing mark **TextLink** uses, and spoken "(opens in a new tab)" — never hand-write `target`. Screen readers hear the title, the meta, the tag, then the new-tab hint; the image's `alt` is not in the link's name. The image keeps its own ratio by default, so tiles vary in height and hold their space before the image loads; `ratio` (width / height, `4 / 3`) fixes the frame and crops the image. A hairline inside the frame keeps an edge on a light image in light mode and a dark image in dark mode; hover and focus darken it and underline the title. `loading` is a **Skeleton** placeholder, not a link. `className` is layout only. Not a **Card** (a surface with slots that can hold several controls). Paste **Components/LinkTile → Pattern — resource tile** or **Pattern — router link**. See **ADR-0044**.
45
- - **TileGrid:** a grid of tiles on the grid gutter — **TileGrid.Item** children, each with a stable `key`, and `aria-label` or `aria-labelledby`. `layout` `masonry` (default — tiles keep their heights and pack; each next item goes to the shortest column) or `uniform` (rows of equal height; give the tiles a `ratio`). `columns` — one number or `{ base, sm, md, lg, xl }` (default `{ base: 1, sm: 2, lg: 3 }`). Reading order and tab order are the order of the items in both layouts — across the top row, then down the page; never use CSS columns or `order`. `empty` replaces the tiles when there are none; `busy` marks a grid of placeholders. Masonry packs after it measures: the server and the first paint show aligned rows, then the tiles close up (one column needs no packing); the space under a tile is the 2rem row gap, within 3px. On a server-rendered page that is one instant move at hydration — nothing slides or fades — on grids of two or more columns; `uniform` is CSS alone and does not move at all, so use it where that move is not acceptable. When the items change, the ones that stay move and the others fade; reduced motion changes at once. `className` is layout only. Not dated rows (**IndexList**) or a row to drag (**Carousel**). Paste **Components/TileGrid → Pattern — tile grid**; with filters, **Guides/Filter panel → Pattern — filtered grid**. See **ADR-0044**.
46
- - **FilterPanel:** checkbox filters for an index page — **FilterPanel** (no element; holds `groups`, `selection` + `onSelectionChange`, `resultsLabel` such as "3 posts", optional `labels`) around the page, with **FilterPanel.Rail** (`aside`: **SectionCaption** "Filters" with Clear all, flush **Accordion** groups of **CheckboxGroup** with counts), **FilterPanel.Trigger** (**Button** `secondary` with the number of options on), and **FilterPanel.Sheet** (the same groups in a bottom **Sheet**; Clear all · Show N). Show the rail and the trigger at opposite breakpoints with `className` (`hidden md:col-span-3 md:block` / `md:hidden`). Helpers: `useFilterSelection({ defaultSelection, selection, onSelectionChange })`, `matchesFilterSelection(facets, selection)` (alternatives within a group, combined across groups), `countFilterOptions(groups, items, label)`, `filterSelectionCount(selection)`. Never write a count into an option label. Not a single choice (**Select**, **SegmentedControl**). Paste **Components/FilterPanel → Pattern — filter panel**; the full pages are **Guides/Filter panel → Pattern — filtered index** and **Pattern — filtered grid** (the grid also takes `renderLink` — the router's link for a tile — and `renderImage` — the app's image component; both take `overlay` for page-level layers such as **GridOverlay**, as does **Guides/Post page → Pattern — post page** — never add elements to a pasted pattern's markup). See **ADR-0044**.
43
+ - **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** is planned. 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**.
44
+ - **LinkTile:** a resource tile that is one link — `title`, `href` (or `render={<Link href />}` for a router link), `media` (an `<img>` or `next/image` with its `width` and `height`; one image, not a video), `meta` (one line, for example the domain), optional `tag` (a **Badge**, over the image's top-start corner) and `source` (**Avatar** `size="xsm"` or a 20px favicon, before the title). The whole tile is the anchor: one hit area, one focus ring; never put a link or a button inside it. `external` opens a new tab with a safe `rel`, the trailing mark **TextLink** uses, and spoken "(opens in a new tab)" — never hand-write `target`. Screen readers hear the title, the meta, the tag, then the new-tab hint; the image's `alt` is not in the link's name. The image keeps its own ratio by default, so tiles vary in height and hold their space before the image loads; `ratio` (width / height, `4 / 3`) fixes the frame and crops the image. A hairline inside the frame keeps an edge on a light image in light mode and a dark image in dark mode; hover and focus darken it and underline the title. The caption is 12px under the image; the title (two lines at most) and the meta line (`type-caption`, 16px) have no gap between them. `loading` is a **Skeleton** placeholder of the same height, not a link. `className` is layout only. Not a **Card** (a surface with slots that can hold several controls). Paste **Components/LinkTile → Pattern — resource tile** or **Pattern — router link**. See **ADR-0044**.
45
+ - **TileGrid:** a grid of tiles on the grid gutter — **TileGrid.Item** children, each with a stable `key`, and `aria-label` or `aria-labelledby`. `layout` `masonry` (default — tiles keep their heights and pack; each next item goes to the shortest column) or `uniform` (rows of equal height; give the tiles a `ratio`). `columns` — one number or `{ base, sm, md, lg, xl }` (default `{ base: 1, sm: 2, lg: 3 }`). Reading order and tab order are the order of the items in both layouts — across the top row, then down the page; never use CSS columns or `order`. `empty` replaces the tiles when there are none; `busy` marks a grid of placeholders. Masonry packs after it measures: the server and the first paint show aligned rows, then the tiles close up (one column needs no packing); the space under a tile is the 2rem row gap plus less than 4px (32px to just under 36px — heights round up to a 4px track). On a server-rendered page that is one instant move at hydration — nothing slides or fades — on grids of two or more columns; `uniform` is CSS alone and does not move at all, so use it where that move is not acceptable. When the items change, the ones that stay move and the others fade; reduced motion changes at once. `className` is layout only. Not dated rows (**IndexList**) or a row to drag (**Carousel**). Paste **Components/TileGrid → Pattern — tile grid**; with filters, **Guides/Filter panel → Pattern — filtered grid**. See **ADR-0044**.
46
+ - **FilterPanel:** checkbox filters for an index page — **FilterPanel** (no element; holds `groups`, `selection` + `onSelectionChange`, `resultsLabel` such as "3 posts", optional `labels`) around the page, with **FilterPanel.Rail** (`aside`: **SectionCaption** "Filters" with Clear all, flush **Accordion** groups of **CheckboxGroup** with counts), **FilterPanel.Trigger** (**Button** `secondary` with the number of options on), and **FilterPanel.Sheet** (the same groups in a bottom **Sheet**; Clear all · Show N). Show the rail and the trigger at opposite breakpoints with `className` (`hidden md:col-span-3 md:block` / `md:hidden`). Helpers: `useFilterSelection({ defaultSelection, selection, onSelectionChange })`, `matchesFilterSelection(facets, selection)` (alternatives within a group, combined across groups), `countFilterOptions(groups, items, label)`, `filterSelectionCount(selection)`. Never write a count into an option label. Not a single choice (**Select**, **SegmentedControl**). Paste **Components/FilterPanel → Pattern — filter panel**; the full pages are **Guides/Filter panel → Pattern — filtered index** and **Pattern — filtered grid** (both take `renderLink` — the router's link for a post title or a tile; the grid also takes `renderImage` — the app's image component; both take `overlay` for page-level layers such as **GridOverlay**, as does **Guides/Post page → Pattern — post page**, which also takes `renderLink` for its breadcrumb and category tags — never add elements to a pasted pattern's markup). See **ADR-0044**.
47
47
  - **Card:** `Card.Header`, `Card.Body`, `Card.Footer`. Layout cards (`padding="none"`): header/footer on the shell; **`Card.Header`** is two horizontal slots (`start` | `end`) at **16px** (`px-4`). **`end` is always trailing** (`ml-auto`) — overflow / **MoreMenu** stays on the right even when `start` is omitted. **`Card.Body` is a square composition slot** with a **2px** horizontal gutter — no inner pad, no radius, **no default fill**. The **occupant** dictates how the body region looks; use **`cardLayoutBodyOccupantInsetXClasses`** (`px-3.5` / 14px) + **`cardLayoutBodyOccupantPadYClasses`** (`py-[16px]` / literal 16px vertical) when body content should align with header/footer (2px + 14px = 16px horizontal). Shape config lives in **`src/theme/shape.css`**: shell **`--radius-card-shell: 16px`**, body occupant **`--radius-card-body: 14px`**. Radius-only media → **`cardLayoutBodyOccupantRadiusClasses`**; inset gray/chart wells → **`cardLayoutBodyOccupantWellClasses`** or **`cardLayoutBodyOccupantDotGridWellClasses`**. A headerless layout **Card.Body** densifies the shell top to 2px (`pt-[2px]`) — same density as footerless / `bodyTerminal` bottom; **`headerless`** is only an override for wrapped slot composition. A direct terminal **`Card.Body`** automatically fills stretched cards and gets the 2px bottom shell inset; **`bodyTerminal`** is only an override for wrapped slot composition. Pin a layout height on the root (`className`) with Header + Body + Footer — Header/Footer stay put; **Card.Body** scrolls (2px gutter unchanged; no new variant). See **Components/Card/Card → Pattern — pinned height**. `variant="surface"` is elevated; **`variant="outlined"`** uses **`shadow-soft-card`** with no stroke (same elevation as layout `surface`). Radius stays **`--radius-card-shell`**. Default **`shape="rounded"`**. **`shape="flush"`** only when a parent owns outer chrome. Simple cards: `padding="md"`.
48
48
  - **Input:** pill-only. Optional leading `icon`; trailing `endBadge` or status / `loading`. Hero search with inset button → **Search** molecule. See **ADR-0006**.
49
49
  - **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**.
package/docs/exports.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "package": "@thewhatmatters/wmds",
3
- "version": "0.4.8",
3
+ "version": "0.4.9",
4
4
  "import": "import { Button } from \"@thewhatmatters/wmds\";",
5
5
  "styles": [
6
6
  "@thewhatmatters/wmds/styles.css",
@@ -1,4 +1,4 @@
1
- // @thewhatmatters/wmds@0.4.8 · Pattern — flush
1
+ // @thewhatmatters/wmds@0.4.9 · 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.8 · Pattern — dropdown row
1
+ // @thewhatmatters/wmds@0.4.9 · 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.8 · Pattern — outline tags
1
+ // @thewhatmatters/wmds@0.4.9 · 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.8 · Pattern — with avatar
1
+ // @thewhatmatters/wmds@0.4.9 · 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.8 · Pattern — editorial
1
+ // @thewhatmatters/wmds@0.4.9 · 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.8 · Pattern — long path
1
+ // @thewhatmatters/wmds@0.4.9 · 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.8 · Pattern — path
1
+ // @thewhatmatters/wmds@0.4.9 · 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.8 · Pattern — router links
1
+ // @thewhatmatters/wmds@0.4.9 · 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.8 · Pattern — copy button
1
+ // @thewhatmatters/wmds@0.4.9 · 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.8 · Pattern — destructive action
1
+ // @thewhatmatters/wmds@0.4.9 · 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.8 · Pattern — external link
1
+ // @thewhatmatters/wmds@0.4.9 · 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.8 · Pattern — ghost action
1
+ // @thewhatmatters/wmds@0.4.9 · 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.8 · Pattern — inverse action
1
+ // @thewhatmatters/wmds@0.4.9 · 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.8 · Pattern — link
1
+ // @thewhatmatters/wmds@0.4.9 · 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.8 · Pattern — submit / async
1
+ // @thewhatmatters/wmds@0.4.9 · 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.8 · Pattern — outline mono
1
+ // @thewhatmatters/wmds@0.4.9 · 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.8 · Pattern — primary action
1
+ // @thewhatmatters/wmds@0.4.9 · 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.8 · Pattern — row (hug)
1
+ // @thewhatmatters/wmds@0.4.9 · 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.8 · Pattern — row
1
+ // @thewhatmatters/wmds@0.4.9 · 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.8 · Pattern — secondary action
1
+ // @thewhatmatters/wmds@0.4.9 · 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.8 · Pattern — suggestion pills
1
+ // @thewhatmatters/wmds@0.4.9 · 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.8 · Pattern — with count
1
+ // @thewhatmatters/wmds@0.4.9 · 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.8 · Pattern — with icon
1
+ // @thewhatmatters/wmds@0.4.9 · 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.8 · Pattern — vertical actions
1
+ // @thewhatmatters/wmds@0.4.9 · 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.8 · Pattern — skip in footer
1
+ // @thewhatmatters/wmds@0.4.9 · 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.8 · Example — body slot (occupancy history)
1
+ // @thewhatmatters/wmds@0.4.9 · 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.8 · Pattern — headerless media
1
+ // @thewhatmatters/wmds@0.4.9 · 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.8 · Pattern — outlined layout
1
+ // @thewhatmatters/wmds@0.4.9 · 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.8 · Pattern — pinned height
1
+ // @thewhatmatters/wmds@0.4.9 · 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.8 · Pattern — selectable cards
1
+ // @thewhatmatters/wmds@0.4.9 · 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.8 · Pattern — image carousel
1
+ // @thewhatmatters/wmds@0.4.9 · 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.8 · Pattern — matrix heatmap
1
+ // @thewhatmatters/wmds@0.4.9 · 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.8 · Pattern — Cartesian no-data gaps
1
+ // @thewhatmatters/wmds@0.4.9 · 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.8 · Pattern — occupancy history in Card
1
+ // @thewhatmatters/wmds@0.4.9 · 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.8 · Pattern — occupancy KPI in Card
1
+ // @thewhatmatters/wmds@0.4.9 · 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.8 · Pattern — distribution strip
1
+ // @thewhatmatters/wmds@0.4.9 · 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.8 · Pattern — ranked audience breakdown
1
+ // @thewhatmatters/wmds@0.4.9 · 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.8 · Pattern — 100-unit composition
1
+ // @thewhatmatters/wmds@0.4.9 · 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.8 · Pattern — chat dock
1
+ // @thewhatmatters/wmds@0.4.9 · 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.8 · Pattern — start a project gate
1
+ // @thewhatmatters/wmds@0.4.9 · 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.8 · Pattern — Q&A with reply
1
+ // @thewhatmatters/wmds@0.4.9 · 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.8 · Pattern — default
1
+ // @thewhatmatters/wmds@0.4.9 · 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.8 · Pattern — with count
1
+ // @thewhatmatters/wmds@0.4.9 · 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.8 · Pattern — with description
1
+ // @thewhatmatters/wmds@0.4.9 · 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.8 · Pattern — default
1
+ // @thewhatmatters/wmds@0.4.9 · 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.8 · Pattern — option counts
1
+ // @thewhatmatters/wmds@0.4.9 · 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.8 · Pattern — details
1
+ // @thewhatmatters/wmds@0.4.9 · 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.8 · Pattern — post metadata
1
+ // @thewhatmatters/wmds@0.4.9 · 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.8 · Pattern — alert dialog (destructive)
1
+ // @thewhatmatters/wmds@0.4.9 · 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.8 · Pattern — dialog
1
+ // @thewhatmatters/wmds@0.4.9 · 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.8 · Pattern — form dialog
1
+ // @thewhatmatters/wmds@0.4.9 · 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
 
@@ -1,4 +1,4 @@
1
- // @thewhatmatters/wmds@0.4.8 · Pattern — page display controls
1
+ // @thewhatmatters/wmds@0.4.9 · 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.8 · Pattern — horizontal input
1
+ // @thewhatmatters/wmds@0.4.9 · Pattern — horizontal input
2
2
  // Storybook: Components/Field → Pattern — horizontal input (?path=/story/components-field--horizontal-input)
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.8 · Pattern — horizontal textarea
1
+ // @thewhatmatters/wmds@0.4.9 · Pattern — horizontal textarea
2
2
  // Storybook: Components/Field → Pattern — horizontal textarea (?path=/story/components-field--horizontal-text-area)
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.8 · Pattern — multi-control
1
+ // @thewhatmatters/wmds@0.4.9 · Pattern — multi-control
2
2
  // Storybook: Components/Field → Pattern — multi-control (?path=/story/components-field--multi-control)
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.8 · Pattern — filter panel
1
+ // @thewhatmatters/wmds@0.4.9 · Pattern — filter panel
2
2
  // Storybook: Components/FilterPanel → Pattern — filter panel (?path=/story/components-filterpanel--panel)
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.8 · Pattern — marketing hero
1
+ // @thewhatmatters/wmds@0.4.9 · Pattern — marketing hero
2
2
  // Storybook: Components/FooterReveal → Pattern — marketing hero (?path=/story/components-footerreveal--marketing-hero-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.8 · Pattern — marketing hero ruled grid
1
+ // @thewhatmatters/wmds@0.4.9 · Pattern — marketing hero ruled grid
2
2
  // Storybook: Components/FooterReveal → Pattern — marketing hero ruled grid (?path=/story/components-footerreveal--marketing-hero-ruled-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.8 · Marketing hero with gallery intro
1
+ // @thewhatmatters/wmds@0.4.9 · Marketing hero with gallery intro
2
2
  // Storybook: Components/FooterReveal → Marketing hero with gallery intro (?path=/story/components-footerreveal--marketing-hero-with-gallery-intro)
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.8 · Pattern — marketing page
1
+ // @thewhatmatters/wmds@0.4.9 · Pattern — marketing page
2
2
  // Storybook: Components/FooterReveal → Pattern — marketing page (?path=/story/components-footerreveal--marketing-page-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.8 · Pattern — ruled grid footer
1
+ // @thewhatmatters/wmds@0.4.9 · Pattern — ruled grid footer
2
2
  // Storybook: Components/FooterReveal → Pattern — ruled grid footer (?path=/story/components-footerreveal--ruled-grid-footer-pattern)
3
3
  // Show code — copy verbatim and keep this header; upgrades find pasted patterns by it.
4
4