@thewhatmatters/wmds 0.4.1 → 0.4.3

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 (174) hide show
  1. package/CHANGELOG.md +38 -0
  2. package/CONSUMING.md +3 -2
  3. package/bin/wmds-check.mjs +108 -10
  4. package/dist/components/molecules/Breadcrumb/Breadcrumb.d.ts +59 -0
  5. package/dist/components/molecules/Breadcrumb/Breadcrumb.d.ts.map +1 -0
  6. package/dist/components/molecules/Breadcrumb/Breadcrumb.js +188 -0
  7. package/dist/components/molecules/Breadcrumb/breadcrumbStyles.d.ts +21 -0
  8. package/dist/components/molecules/Breadcrumb/breadcrumbStyles.d.ts.map +1 -0
  9. package/dist/components/molecules/Breadcrumb/breadcrumbStyles.js +11 -0
  10. package/dist/components/molecules/Dropdown/DropdownItem.d.ts +7 -2
  11. package/dist/components/molecules/Dropdown/DropdownItem.d.ts.map +1 -1
  12. package/dist/components/molecules/Dropdown/DropdownItem.js +40 -24
  13. package/dist/components/organisms/ChatDock/ChatDock.d.ts +9 -18
  14. package/dist/components/organisms/ChatDock/ChatDock.d.ts.map +1 -1
  15. package/dist/components/organisms/ChatDock/ChatDock.js +411 -411
  16. package/dist/components/organisms/ChatDock/ChatDockGate.d.ts +19 -9
  17. package/dist/components/organisms/ChatDock/ChatDockGate.d.ts.map +1 -1
  18. package/dist/components/organisms/ChatDock/ChatDockGate.js +152 -123
  19. package/dist/components/organisms/ChatDock/chatDockGateContext.d.ts +11 -0
  20. package/dist/components/organisms/ChatDock/chatDockGateContext.d.ts.map +1 -0
  21. package/dist/components/organisms/ChatDock/chatDockGateContext.js +9 -0
  22. package/dist/components/organisms/ChatDock/chatDockGateStyles.d.ts +15 -10
  23. package/dist/components/organisms/ChatDock/chatDockGateStyles.d.ts.map +1 -1
  24. package/dist/components/organisms/ChatDock/chatDockGateStyles.js +3 -3
  25. package/dist/components/organisms/ChatDock/chatDockStyles.d.ts +10 -4
  26. package/dist/components/organisms/ChatDock/chatDockStyles.d.ts.map +1 -1
  27. package/dist/components/organisms/ChatDock/chatDockStyles.js +9 -6
  28. package/dist/components/organisms/ChatDock/chatDockViewport.d.ts +6 -0
  29. package/dist/components/organisms/ChatDock/chatDockViewport.d.ts.map +1 -1
  30. package/dist/components/organisms/ChatDock/chatDockViewport.js +14 -1
  31. package/dist/components/organisms/Dialog/Dialog.js +34 -34
  32. package/dist/components/organisms/Sheet/Sheet.js +38 -38
  33. package/dist/components/organisms/SiteNav/SiteNav.js +86 -86
  34. package/dist/components/organisms/Toast/Toast.d.ts.map +1 -1
  35. package/dist/components/organisms/Toast/Toast.js +11 -5
  36. package/dist/index.d.ts +1 -0
  37. package/dist/index.d.ts.map +1 -1
  38. package/dist/index.js +90 -88
  39. package/dist/lib/compositionAudit.d.ts.map +1 -1
  40. package/dist/lib/dialogOverlay.d.ts +5 -0
  41. package/dist/lib/dialogOverlay.d.ts.map +1 -1
  42. package/dist/lib/dialogOverlay.js +29 -15
  43. package/dist/styles.css +1 -1
  44. package/docs/component-contracts.md +4 -2
  45. package/docs/components.md +7 -6
  46. package/docs/exports.json +17 -1
  47. package/docs/patterns/components-accordion--flush.tsx +1 -1
  48. package/docs/patterns/components-avatar--dropdown-row.tsx +1 -1
  49. package/docs/patterns/components-badge--outline-tags.tsx +1 -1
  50. package/docs/patterns/components-badge--with-avatar.tsx +1 -1
  51. package/docs/patterns/components-breadcrumb--editorial.tsx +9 -0
  52. package/docs/patterns/components-breadcrumb--long-path.tsx +9 -0
  53. package/docs/patterns/components-breadcrumb--path.tsx +9 -0
  54. package/docs/patterns/components-breadcrumb--router-links.tsx +10 -0
  55. package/docs/patterns/components-button-button--copy-button.tsx +1 -1
  56. package/docs/patterns/components-button-button--destructive-action.tsx +1 -1
  57. package/docs/patterns/components-button-button--external-link.tsx +1 -1
  58. package/docs/patterns/components-button-button--ghost-action.tsx +1 -1
  59. package/docs/patterns/components-button-button--inverse-action.tsx +1 -1
  60. package/docs/patterns/components-button-button--link-render.tsx +1 -1
  61. package/docs/patterns/components-button-button--multi-state-badge.tsx +1 -1
  62. package/docs/patterns/components-button-button--outline-mono.tsx +1 -1
  63. package/docs/patterns/components-button-button--primary-action.tsx +1 -1
  64. package/docs/patterns/components-button-button--row-hug.tsx +1 -1
  65. package/docs/patterns/components-button-button--row-layout.tsx +1 -1
  66. package/docs/patterns/components-button-button--secondary-action.tsx +1 -1
  67. package/docs/patterns/components-button-button--suggestion-pills.tsx +1 -1
  68. package/docs/patterns/components-button-button--with-count.tsx +1 -1
  69. package/docs/patterns/components-button-button--with-icon.tsx +1 -1
  70. package/docs/patterns/components-button-floatingactionbutton--vertical-actions.tsx +1 -1
  71. package/docs/patterns/components-calembed--pattern-skip-in-footer.tsx +1 -1
  72. package/docs/patterns/components-card-card--body-slot-occupancy-history.tsx +1 -1
  73. package/docs/patterns/components-card-card--headerless-media.tsx +1 -1
  74. package/docs/patterns/components-card-card--outlined-layout.tsx +1 -1
  75. package/docs/patterns/components-card-card--pinned-height.tsx +1 -1
  76. package/docs/patterns/components-card-selectablecard--selectable-cards-pattern.tsx +1 -1
  77. package/docs/patterns/components-chart--audience-activity-heatmap.tsx +1 -1
  78. package/docs/patterns/components-chart--cartesian-no-data-gaps.tsx +1 -1
  79. package/docs/patterns/components-chart--occupancy-history-in-card.tsx +1 -1
  80. package/docs/patterns/components-chart--occupancy-in-card.tsx +1 -1
  81. package/docs/patterns/components-chart--post-reach-distribution.tsx +1 -1
  82. package/docs/patterns/components-chart--ranked-audience-breakdown.tsx +1 -1
  83. package/docs/patterns/components-chart--unit-grid-composition.tsx +1 -1
  84. package/docs/patterns/components-chatdock--pattern-chat-dock.tsx +1 -1
  85. package/docs/patterns/components-chatdock--pattern-start-project-gate.tsx +54 -11
  86. package/docs/patterns/components-chatqa--pattern-qa-with-reply.tsx +1 -1
  87. package/docs/patterns/components-checkbox-checkbox--default.tsx +1 -1
  88. package/docs/patterns/components-checkbox-checkbox--with-count.tsx +1 -1
  89. package/docs/patterns/components-checkbox-checkbox--with-description.tsx +1 -1
  90. package/docs/patterns/components-checkbox-checkboxgroup--default.tsx +1 -1
  91. package/docs/patterns/components-checkbox-checkboxgroup--option-counts.tsx +1 -1
  92. package/docs/patterns/components-descriptionlist--details.tsx +1 -1
  93. package/docs/patterns/components-descriptionlist--post-metadata.tsx +1 -1
  94. package/docs/patterns/components-dialog--alert-dialog-destructive.tsx +1 -1
  95. package/docs/patterns/components-dialog--default-dialog.tsx +1 -1
  96. package/docs/patterns/components-dialog--form-dialog.tsx +1 -1
  97. package/docs/patterns/components-displaycontrols--page-utilities.tsx +1 -1
  98. package/docs/patterns/components-field--horizontal-input.tsx +1 -1
  99. package/docs/patterns/components-field--horizontal-text-area.tsx +1 -1
  100. package/docs/patterns/components-field--multi-control.tsx +1 -1
  101. package/docs/patterns/components-footerreveal--marketing-hero-pattern.tsx +1 -1
  102. package/docs/patterns/components-footerreveal--marketing-hero-ruled-pattern.tsx +1 -1
  103. package/docs/patterns/components-footerreveal--marketing-hero-with-gallery-intro.tsx +1 -1
  104. package/docs/patterns/components-footerreveal--marketing-page-pattern.tsx +1 -1
  105. package/docs/patterns/components-footerreveal--ruled-grid-footer-pattern.tsx +1 -1
  106. package/docs/patterns/components-footerreveal--sequenced-marketing-hero.tsx +1 -1
  107. package/docs/patterns/components-herointro--two-line-intro.tsx +1 -1
  108. package/docs/patterns/components-herotilestack--marketing-hero-pattern.tsx +1 -1
  109. package/docs/patterns/components-herotilestack--marketing-hero-text-sequence.tsx +1 -1
  110. package/docs/patterns/components-herotilestack--marketing-hero-with-gallery-intro.tsx +1 -1
  111. package/docs/patterns/components-indexlist--post-index.tsx +1 -1
  112. package/docs/patterns/components-intakeconfirmation--booked-pattern.tsx +1 -1
  113. package/docs/patterns/components-intakeconfirmation--emailed-pattern.tsx +1 -1
  114. package/docs/patterns/components-intakeform--about-you-pattern.tsx +1 -1
  115. package/docs/patterns/components-intakemodal--intake-modal-pattern.tsx +1 -1
  116. package/docs/patterns/components-kbd--command-row.tsx +1 -1
  117. package/docs/patterns/components-kbd--numbered-choices.tsx +1 -1
  118. package/docs/patterns/components-kbd--shortcut.tsx +1 -1
  119. package/docs/patterns/components-moremenu--action-menu.tsx +1 -1
  120. package/docs/patterns/components-moremenu--in-card-header.tsx +1 -1
  121. package/docs/patterns/components-navlist--side-nav-settings.tsx +1 -1
  122. package/docs/patterns/components-pageheader--app-header-pattern.tsx +1 -1
  123. package/docs/patterns/components-pageheader--page-section-header.tsx +1 -1
  124. package/docs/patterns/components-pageheader--toolbar-header.tsx +1 -1
  125. package/docs/patterns/components-panel--end-detail-rail.tsx +1 -1
  126. package/docs/patterns/components-pillgroup--pill-group-pattern.tsx +1 -1
  127. package/docs/patterns/components-promptbar--pattern-prompt-bar.tsx +1 -1
  128. package/docs/patterns/components-prose--article-body.tsx +1 -1
  129. package/docs/patterns/components-radio-radiogroup--default.tsx +1 -1
  130. package/docs/patterns/components-scrollhorizontal--project-gallery-pattern.tsx +1 -1
  131. package/docs/patterns/components-scrollhorizontal--with-intro.tsx +1 -1
  132. package/docs/patterns/components-sectioncaption--column-caption.tsx +1 -1
  133. package/docs/patterns/components-sectioncaption--with-action.tsx +1 -1
  134. package/docs/patterns/components-sheet--bottom-sheet.tsx +1 -1
  135. package/docs/patterns/components-sheet--end-sheet.tsx +1 -1
  136. package/docs/patterns/components-sitenav--brand-and-cta.tsx +1 -1
  137. package/docs/patterns/components-sitenav--centered-links.tsx +1 -1
  138. package/docs/patterns/components-sitenav--compact.tsx +1 -1
  139. package/docs/patterns/components-sitenav--marketing-header.tsx +1 -1
  140. package/docs/patterns/components-sitenav--mega-menu.tsx +1 -1
  141. package/docs/patterns/components-stat--insights-row.tsx +1 -1
  142. package/docs/patterns/components-stepprogress--step-progress-pattern.tsx +1 -1
  143. package/docs/patterns/components-switch--default.tsx +1 -1
  144. package/docs/patterns/components-switch--settings-row.tsx +1 -1
  145. package/docs/patterns/components-tab--settings-pages.tsx +1 -1
  146. package/docs/patterns/components-taskrows--action-details.tsx +1 -1
  147. package/docs/patterns/components-taskrows--capsules.tsx +1 -1
  148. package/docs/patterns/components-taskrows--card-with-status-rows.tsx +1 -1
  149. package/docs/patterns/components-taskrows--controlled-expand.tsx +1 -1
  150. package/docs/patterns/components-taskrows--custom-slots.tsx +1 -1
  151. package/docs/patterns/components-taskrows--status-list.tsx +1 -1
  152. package/docs/patterns/components-taskrows--tag-chips.tsx +1 -1
  153. package/docs/patterns/components-textlink--external-destination.tsx +1 -1
  154. package/docs/patterns/components-textlink--inline-prose.tsx +1 -1
  155. package/docs/patterns/components-textlink--quiet-title.tsx +1 -1
  156. package/docs/patterns/components-textlink--supporting-copy.tsx +1 -1
  157. package/docs/patterns/components-textsequence--default.tsx +1 -1
  158. package/docs/patterns/components-textsequence--reduced-motion.tsx +1 -1
  159. package/docs/patterns/components-textsequence--shapes.tsx +1 -1
  160. package/docs/patterns/components-toast--stacked-notifications.tsx +1 -1
  161. package/docs/patterns/components-tooltip--controlled.tsx +1 -1
  162. package/docs/patterns/components-tooltip--disabled-control.tsx +1 -1
  163. package/docs/patterns/components-tooltip--icon-action.tsx +1 -1
  164. package/docs/patterns/components-tooltip--keyboard-shortcut.tsx +1 -1
  165. package/docs/patterns/components-tooltip--placement.tsx +1 -1
  166. package/docs/patterns/foundations-scroll-fade--horizontal-rail.tsx +1 -1
  167. package/docs/patterns/foundations-scroll-fade--overflowing-list.tsx +1 -1
  168. package/docs/patterns/guides-chart-explorations--comparison-gallery.tsx +1 -1
  169. package/docs/patterns/guides-filter-panel--filtered-index.tsx +41 -17
  170. package/docs/patterns/guides-overlay-flows--notification-preferences.tsx +1 -1
  171. package/docs/patterns/guides-post-page--post-page.tsx +39 -4
  172. package/docs/patterns/guides-profile-typography--editorial-profile.tsx +1 -1
  173. package/docs/patterns/index.json +33 -1
  174. package/package.json +1 -1
@@ -1,4 +1,4 @@
1
- // @thewhatmatters/wmds@0.4.1 · Pattern — filtered index
1
+ // @thewhatmatters/wmds@0.4.3 · Pattern — filtered index
2
2
  // Storybook: Guides/Filter panel → Pattern — filtered index (?path=/story/guides-filter-panel--filtered-index)
3
3
  // Show code — copy verbatim and keep this header; upgrades find pasted patterns by it.
4
4
 
@@ -21,20 +21,27 @@ export interface FilteredPost {
21
21
  /** The date as readers see it, for example "Sep 14, 2026". */
22
22
  dateLabel: string;
23
23
  description: string;
24
- /** The post's option in each filter group, by group id — for example { topic: "guides" }. */
25
- facets: Record<string, string>;
24
+ /** The post's options in each filter group, by group id — one or several, for example { topic: ["guides", "brand"] }. */
25
+ facets: Record<string, string | string[]>;
26
26
  }
27
27
 
28
- type Selection = Record<string, string[]>;
28
+ /** The options on in each group, by group id — for example { topic: ["guides"] }. */
29
+ export type FilterSelection = Record<string, string[]>;
29
30
 
30
31
  function postsLabel(count: number) {
31
32
  return count === 1 ? "1 post" : `${count} posts`;
32
33
  }
33
34
 
34
- function matches(post: FilteredPost, groups: FilterGroupDef[], selection: Selection) {
35
+ function facetValues(post: FilteredPost, groupId: string): string[] {
36
+ const value = post.facets[groupId];
37
+ return value == null ? [] : Array.isArray(value) ? value : [value];
38
+ }
39
+
40
+ /** A post shows when, in every group with options on, it has at least one of them. */
41
+ function matches(post: FilteredPost, groups: FilterGroupDef[], selection: FilterSelection) {
35
42
  return groups.every((group) => {
36
43
  const values = selection[group.id] ?? [];
37
- return values.length === 0 || values.includes(post.facets[group.id] ?? "");
44
+ return values.length === 0 || facetValues(post, group.id).some((value) => values.includes(value));
38
45
  });
39
46
  }
40
47
 
@@ -46,7 +53,7 @@ function FilterGroups({
46
53
  }: {
47
54
  groups: FilterGroupDef[];
48
55
  posts: FilteredPost[];
49
- selection: Selection;
56
+ selection: FilterSelection;
50
57
  onGroupChange: (groupId: string, values: string[]) => void;
51
58
  }) {
52
59
  return (
@@ -61,7 +68,7 @@ function FilterGroups({
61
68
  onValuesChange={(values) => onGroupChange(group.id, values)}
62
69
  >
63
70
  {group.options.map((option) => {
64
- const count = posts.filter((post) => post.facets[group.id] === option.value).length;
71
+ const count = posts.filter((post) => facetValues(post, group.id).includes(option.value)).length;
65
72
  return (
66
73
  <CheckboxGroup.Item
67
74
  key={option.value}
@@ -79,23 +86,40 @@ function FilterGroups({
79
86
  );
80
87
  }
81
88
 
89
+ export interface FilteredIndexProps {
90
+ title: string;
91
+ posts: FilteredPost[];
92
+ groups: FilterGroupDef[];
93
+ /** The filters on when the page opens — for example { topic: ["guides"] } from /blog?topic=guides. */
94
+ defaultSelection?: FilterSelection;
95
+ /** The filters on, when the app holds them — for example in the URL. Pass with onSelectionChange. */
96
+ selection?: FilterSelection;
97
+ /** Every change: an option on or off, or Clear all. */
98
+ onSelectionChange?: (selection: FilterSelection) => void;
99
+ }
100
+
82
101
  export function FilteredIndex({
83
102
  title,
84
103
  posts,
85
104
  groups,
86
- }: {
87
- title: string;
88
- posts: FilteredPost[];
89
- groups: FilterGroupDef[];
90
- }) {
105
+ defaultSelection,
106
+ selection: selectionProp,
107
+ onSelectionChange,
108
+ }: FilteredIndexProps) {
91
109
  const filtersHeadingId = useId();
92
- const [selection, setSelection] = useState<Selection>({});
110
+ const [ownSelection, setOwnSelection] = useState<FilterSelection>(defaultSelection ?? {});
111
+ const selection = selectionProp ?? ownSelection;
93
112
  const [sheetOpen, setSheetOpen] = useState(false);
94
113
  const activeCount = Object.values(selection).reduce((total, values) => total + values.length, 0);
95
114
  const shown = posts.filter((post) => matches(post, groups, selection));
96
115
 
116
+ function changeSelection(next: FilterSelection) {
117
+ if (selectionProp == null) setOwnSelection(next);
118
+ onSelectionChange?.(next);
119
+ }
120
+
97
121
  function setGroup(groupId: string, values: string[]) {
98
- setSelection((current) => ({ ...current, [groupId]: values }));
122
+ changeSelection({ ...selection, [groupId]: values });
99
123
  }
100
124
 
101
125
  return (
@@ -123,7 +147,7 @@ export function FilteredIndex({
123
147
  <SectionCaption
124
148
  id={filtersHeadingId}
125
149
  end={
126
- <Button role="ghost" size="xs" disabled={activeCount === 0} onClick={() => setSelection({})}>
150
+ <Button role="ghost" size="xs" disabled={activeCount === 0} onClick={() => changeSelection({})}>
127
151
  Clear all
128
152
  </Button>
129
153
  }
@@ -157,7 +181,7 @@ export function FilteredIndex({
157
181
  title="Filters"
158
182
  footer={
159
183
  <div className="flex items-center justify-end gap-2">
160
- <Button role="secondary" size="sm" disabled={activeCount === 0} onClick={() => setSelection({})}>
184
+ <Button role="secondary" size="sm" disabled={activeCount === 0} onClick={() => changeSelection({})}>
161
185
  Clear all
162
186
  </Button>
163
187
  <Button role="primary" size="sm" onClick={() => setSheetOpen(false)}>
@@ -1,4 +1,4 @@
1
- // @thewhatmatters/wmds@0.4.1 · Pattern — notification preferences
1
+ // @thewhatmatters/wmds@0.4.3 · Pattern — notification preferences
2
2
  // Storybook: Guides/Overlay flows → Pattern — notification preferences (?path=/story/guides-overlay-flows--notification-preferences)
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.1 · Pattern — post page
1
+ // @thewhatmatters/wmds@0.4.3 · Pattern — post page
2
2
  // Storybook: Guides/Post page → Pattern — post page (?path=/story/guides-post-page--post-page)
3
3
  // Show code — copy verbatim and keep this header; upgrades find pasted patterns by it.
4
4
 
@@ -6,11 +6,13 @@ import { useEffect, useId, useState, type ReactNode } from "react";
6
6
  import { Copy, FileText } from "lucide-react";
7
7
  import {
8
8
  Badge,
9
+ Breadcrumb,
9
10
  Button,
10
11
  DescriptionList,
11
12
  Prose,
12
13
  SectionCaption,
13
14
  buttonStatusHoldMs,
15
+ type BreadcrumbItemDef,
14
16
  type ButtonStatus,
15
17
  } from "@thewhatmatters/wmds";
16
18
 
@@ -20,6 +22,8 @@ export interface PostCategory {
20
22
  }
21
23
 
22
24
  export interface PostPageData {
25
+ /** The path to this post, ending with it — for example Home, Blog, Guides, this post. */
26
+ breadcrumb: BreadcrumbItemDef[];
23
27
  title: string;
24
28
  description: string;
25
29
  /** ISO date, for the time element. */
@@ -70,8 +74,34 @@ function CopyButton({ text, label }: { text: string; label: string }) {
70
74
  );
71
75
  }
72
76
 
77
+ /** Where the metadata panel sits from lg: before the article (start) or after it (end). */
78
+ export type PostMetadataSide = "start" | "end";
79
+
80
+ /** How many of the page's 12 columns the panel takes from lg; the article takes the rest. */
81
+ export type PostMetadataColumns = 3 | 4;
82
+
83
+ const metadataColumnClasses: Record<PostMetadataColumns, string> = {
84
+ 3: "lg:col-span-3",
85
+ 4: "lg:col-span-4",
86
+ };
87
+
88
+ const articleColumnClasses: Record<PostMetadataColumns, string> = {
89
+ 3: "lg:col-span-9",
90
+ 4: "lg:col-span-8",
91
+ };
92
+
93
+ export interface PostPageProps {
94
+ post: PostPageData;
95
+ /** The post's rendered markdown. */
96
+ children: ReactNode;
97
+ /** Where the panel sits from lg. Below lg it stacks above the article either way. Default: "start". */
98
+ metadataSide?: PostMetadataSide;
99
+ /** The panel's width from lg, in columns. Default: 4. */
100
+ metadataColumns?: PostMetadataColumns;
101
+ }
102
+
73
103
  /** A blog post: the title, a metadata panel, and the article, which is the rendered markdown. */
74
- export function PostPage({ post, children }: { post: PostPageData; children: ReactNode }) {
104
+ export function PostPage({ post, children, metadataSide = "start", metadataColumns = 4 }: PostPageProps) {
75
105
  const metadataHeadingId = useId();
76
106
  const encodedUrl = encodeURIComponent(post.url);
77
107
  const encodedTitle = encodeURIComponent(post.title);
@@ -80,13 +110,18 @@ export function PostPage({ post, children }: { post: PostPageData; children: Rea
80
110
  <main className="grid-page bg-body">
81
111
  <article className="band py-6 sm:py-10 lg:py-14">
82
112
  <header className="col-span-full mb-4 flex flex-col gap-3 sm:mb-8 lg:col-span-10">
113
+ <Breadcrumb items={post.breadcrumb} variant="mono" separator="slash" className="mb-3" />
83
114
  <h1 className="type-display-2 text-balance text-fg">{post.title}</h1>
84
115
  <p className="type-reading max-w-[40rem] text-muted">{post.description}</p>
85
116
  </header>
86
117
 
87
118
  <aside
88
119
  aria-labelledby={metadataHeadingId}
89
- className="col-span-full lg:sticky lg:top-[calc(var(--site-nav-height)+1rem)] lg:col-span-4"
120
+ className={
121
+ "col-span-full lg:sticky lg:top-[calc(var(--site-nav-height)+1rem)] " +
122
+ metadataColumnClasses[metadataColumns] +
123
+ (metadataSide === "end" ? " lg:order-last" : "")
124
+ }
90
125
  >
91
126
  <SectionCaption id={metadataHeadingId}>Metadata</SectionCaption>
92
127
  <DescriptionList variant="mono" rule="dotted">
@@ -133,7 +168,7 @@ export function PostPage({ post, children }: { post: PostPageData; children: Rea
133
168
  </DescriptionList>
134
169
  </aside>
135
170
 
136
- <div className="col-span-full mt-6 lg:col-span-8 lg:mt-0">
171
+ <div className={"col-span-full mt-6 lg:mt-0 " + articleColumnClasses[metadataColumns]}>
137
172
  <SectionCaption as="p">Article</SectionCaption>
138
173
  <Prose className="mt-6">{children}</Prose>
139
174
  </div>
@@ -1,4 +1,4 @@
1
- // @thewhatmatters/wmds@0.4.1 · Pattern — editorial profile
1
+ // @thewhatmatters/wmds@0.4.3 · Pattern — editorial profile
2
2
  // Storybook: Guides/Profile typography → Pattern — editorial profile (?path=/story/guides-profile-typography--editorial-profile)
3
3
  // Show code — copy verbatim and keep this header; upgrades find pasted patterns by it.
4
4
 
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "package": "@thewhatmatters/wmds",
3
- "version": "0.4.1",
3
+ "version": "0.4.3",
4
4
  "patterns": [
5
5
  {
6
6
  "id": "components-accordion--flush",
@@ -34,6 +34,38 @@
34
34
  "storybook": "?path=/story/components-badge--with-avatar",
35
35
  "source": "src/components/atoms/Badge/Badge.stories.tsx"
36
36
  },
37
+ {
38
+ "id": "components-breadcrumb--editorial",
39
+ "title": "Components/Breadcrumb",
40
+ "name": "Pattern — editorial",
41
+ "file": "patterns/components-breadcrumb--editorial.tsx",
42
+ "storybook": "?path=/story/components-breadcrumb--editorial",
43
+ "source": "src/components/molecules/Breadcrumb/Breadcrumb.stories.tsx"
44
+ },
45
+ {
46
+ "id": "components-breadcrumb--long-path",
47
+ "title": "Components/Breadcrumb",
48
+ "name": "Pattern — long path",
49
+ "file": "patterns/components-breadcrumb--long-path.tsx",
50
+ "storybook": "?path=/story/components-breadcrumb--long-path",
51
+ "source": "src/components/molecules/Breadcrumb/Breadcrumb.stories.tsx"
52
+ },
53
+ {
54
+ "id": "components-breadcrumb--path",
55
+ "title": "Components/Breadcrumb",
56
+ "name": "Pattern — path",
57
+ "file": "patterns/components-breadcrumb--path.tsx",
58
+ "storybook": "?path=/story/components-breadcrumb--path",
59
+ "source": "src/components/molecules/Breadcrumb/Breadcrumb.stories.tsx"
60
+ },
61
+ {
62
+ "id": "components-breadcrumb--router-links",
63
+ "title": "Components/Breadcrumb",
64
+ "name": "Pattern — router links",
65
+ "file": "patterns/components-breadcrumb--router-links.tsx",
66
+ "storybook": "?path=/story/components-breadcrumb--router-links",
67
+ "source": "src/components/molecules/Breadcrumb/Breadcrumb.stories.tsx"
68
+ },
37
69
  {
38
70
  "id": "components-button-button--copy-button",
39
71
  "title": "Components/Button/Button",
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@thewhatmatters/wmds",
3
3
  "description": "WhatMatters Design System — React components, Tailwind v4 theme, and Storybook patterns",
4
- "version": "0.4.1",
4
+ "version": "0.4.3",
5
5
  "type": "module",
6
6
  "license": "MIT",
7
7
  "repository": {