@thewhatmatters/wmds 0.4.2 → 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.
- package/CHANGELOG.md +24 -0
- package/CONSUMING.md +2 -2
- package/bin/wmds-check.mjs +108 -10
- package/dist/components/organisms/ChatDock/ChatDock.d.ts +9 -18
- package/dist/components/organisms/ChatDock/ChatDock.d.ts.map +1 -1
- package/dist/components/organisms/ChatDock/ChatDock.js +411 -411
- package/dist/components/organisms/ChatDock/ChatDockGate.d.ts +19 -9
- package/dist/components/organisms/ChatDock/ChatDockGate.d.ts.map +1 -1
- package/dist/components/organisms/ChatDock/ChatDockGate.js +152 -123
- package/dist/components/organisms/ChatDock/chatDockGateContext.d.ts +11 -0
- package/dist/components/organisms/ChatDock/chatDockGateContext.d.ts.map +1 -0
- package/dist/components/organisms/ChatDock/chatDockGateContext.js +9 -0
- package/dist/components/organisms/ChatDock/chatDockGateStyles.d.ts +15 -10
- package/dist/components/organisms/ChatDock/chatDockGateStyles.d.ts.map +1 -1
- package/dist/components/organisms/ChatDock/chatDockGateStyles.js +3 -3
- package/dist/components/organisms/ChatDock/chatDockStyles.d.ts +10 -4
- package/dist/components/organisms/ChatDock/chatDockStyles.d.ts.map +1 -1
- package/dist/components/organisms/ChatDock/chatDockStyles.js +9 -6
- package/dist/components/organisms/ChatDock/chatDockViewport.d.ts +6 -0
- package/dist/components/organisms/ChatDock/chatDockViewport.d.ts.map +1 -1
- package/dist/components/organisms/ChatDock/chatDockViewport.js +14 -1
- package/dist/components/organisms/Dialog/Dialog.js +34 -34
- package/dist/components/organisms/Sheet/Sheet.js +38 -38
- package/dist/components/organisms/Toast/Toast.d.ts.map +1 -1
- package/dist/components/organisms/Toast/Toast.js +11 -5
- package/dist/lib/dialogOverlay.d.ts +5 -0
- package/dist/lib/dialogOverlay.d.ts.map +1 -1
- package/dist/lib/dialogOverlay.js +29 -15
- package/dist/styles.css +1 -1
- package/docs/component-contracts.md +4 -2
- package/docs/components.md +5 -5
- package/docs/exports.json +1 -1
- package/docs/patterns/components-accordion--flush.tsx +1 -1
- package/docs/patterns/components-avatar--dropdown-row.tsx +1 -1
- package/docs/patterns/components-badge--outline-tags.tsx +1 -1
- package/docs/patterns/components-badge--with-avatar.tsx +1 -1
- package/docs/patterns/components-breadcrumb--editorial.tsx +1 -1
- package/docs/patterns/components-breadcrumb--long-path.tsx +1 -1
- package/docs/patterns/components-breadcrumb--path.tsx +1 -1
- package/docs/patterns/components-breadcrumb--router-links.tsx +1 -1
- package/docs/patterns/components-button-button--copy-button.tsx +1 -1
- package/docs/patterns/components-button-button--destructive-action.tsx +1 -1
- package/docs/patterns/components-button-button--external-link.tsx +1 -1
- package/docs/patterns/components-button-button--ghost-action.tsx +1 -1
- package/docs/patterns/components-button-button--inverse-action.tsx +1 -1
- package/docs/patterns/components-button-button--link-render.tsx +1 -1
- package/docs/patterns/components-button-button--multi-state-badge.tsx +1 -1
- package/docs/patterns/components-button-button--outline-mono.tsx +1 -1
- package/docs/patterns/components-button-button--primary-action.tsx +1 -1
- package/docs/patterns/components-button-button--row-hug.tsx +1 -1
- package/docs/patterns/components-button-button--row-layout.tsx +1 -1
- package/docs/patterns/components-button-button--secondary-action.tsx +1 -1
- package/docs/patterns/components-button-button--suggestion-pills.tsx +1 -1
- package/docs/patterns/components-button-button--with-count.tsx +1 -1
- package/docs/patterns/components-button-button--with-icon.tsx +1 -1
- package/docs/patterns/components-button-floatingactionbutton--vertical-actions.tsx +1 -1
- package/docs/patterns/components-calembed--pattern-skip-in-footer.tsx +1 -1
- package/docs/patterns/components-card-card--body-slot-occupancy-history.tsx +1 -1
- package/docs/patterns/components-card-card--headerless-media.tsx +1 -1
- package/docs/patterns/components-card-card--outlined-layout.tsx +1 -1
- package/docs/patterns/components-card-card--pinned-height.tsx +1 -1
- package/docs/patterns/components-card-selectablecard--selectable-cards-pattern.tsx +1 -1
- package/docs/patterns/components-chart--audience-activity-heatmap.tsx +1 -1
- package/docs/patterns/components-chart--cartesian-no-data-gaps.tsx +1 -1
- package/docs/patterns/components-chart--occupancy-history-in-card.tsx +1 -1
- package/docs/patterns/components-chart--occupancy-in-card.tsx +1 -1
- package/docs/patterns/components-chart--post-reach-distribution.tsx +1 -1
- package/docs/patterns/components-chart--ranked-audience-breakdown.tsx +1 -1
- package/docs/patterns/components-chart--unit-grid-composition.tsx +1 -1
- package/docs/patterns/components-chatdock--pattern-chat-dock.tsx +1 -1
- package/docs/patterns/components-chatdock--pattern-start-project-gate.tsx +54 -11
- package/docs/patterns/components-chatqa--pattern-qa-with-reply.tsx +1 -1
- package/docs/patterns/components-checkbox-checkbox--default.tsx +1 -1
- package/docs/patterns/components-checkbox-checkbox--with-count.tsx +1 -1
- package/docs/patterns/components-checkbox-checkbox--with-description.tsx +1 -1
- package/docs/patterns/components-checkbox-checkboxgroup--default.tsx +1 -1
- package/docs/patterns/components-checkbox-checkboxgroup--option-counts.tsx +1 -1
- package/docs/patterns/components-descriptionlist--details.tsx +1 -1
- package/docs/patterns/components-descriptionlist--post-metadata.tsx +1 -1
- package/docs/patterns/components-dialog--alert-dialog-destructive.tsx +1 -1
- package/docs/patterns/components-dialog--default-dialog.tsx +1 -1
- package/docs/patterns/components-dialog--form-dialog.tsx +1 -1
- package/docs/patterns/components-displaycontrols--page-utilities.tsx +1 -1
- package/docs/patterns/components-field--horizontal-input.tsx +1 -1
- package/docs/patterns/components-field--horizontal-text-area.tsx +1 -1
- package/docs/patterns/components-field--multi-control.tsx +1 -1
- package/docs/patterns/components-footerreveal--marketing-hero-pattern.tsx +1 -1
- package/docs/patterns/components-footerreveal--marketing-hero-ruled-pattern.tsx +1 -1
- package/docs/patterns/components-footerreveal--marketing-hero-with-gallery-intro.tsx +1 -1
- package/docs/patterns/components-footerreveal--marketing-page-pattern.tsx +1 -1
- package/docs/patterns/components-footerreveal--ruled-grid-footer-pattern.tsx +1 -1
- package/docs/patterns/components-footerreveal--sequenced-marketing-hero.tsx +1 -1
- package/docs/patterns/components-herointro--two-line-intro.tsx +1 -1
- package/docs/patterns/components-herotilestack--marketing-hero-pattern.tsx +1 -1
- package/docs/patterns/components-herotilestack--marketing-hero-text-sequence.tsx +1 -1
- package/docs/patterns/components-herotilestack--marketing-hero-with-gallery-intro.tsx +1 -1
- package/docs/patterns/components-indexlist--post-index.tsx +1 -1
- package/docs/patterns/components-intakeconfirmation--booked-pattern.tsx +1 -1
- package/docs/patterns/components-intakeconfirmation--emailed-pattern.tsx +1 -1
- package/docs/patterns/components-intakeform--about-you-pattern.tsx +1 -1
- package/docs/patterns/components-intakemodal--intake-modal-pattern.tsx +1 -1
- package/docs/patterns/components-kbd--command-row.tsx +1 -1
- package/docs/patterns/components-kbd--numbered-choices.tsx +1 -1
- package/docs/patterns/components-kbd--shortcut.tsx +1 -1
- package/docs/patterns/components-moremenu--action-menu.tsx +1 -1
- package/docs/patterns/components-moremenu--in-card-header.tsx +1 -1
- package/docs/patterns/components-navlist--side-nav-settings.tsx +1 -1
- package/docs/patterns/components-pageheader--app-header-pattern.tsx +1 -1
- package/docs/patterns/components-pageheader--page-section-header.tsx +1 -1
- package/docs/patterns/components-pageheader--toolbar-header.tsx +1 -1
- package/docs/patterns/components-panel--end-detail-rail.tsx +1 -1
- package/docs/patterns/components-pillgroup--pill-group-pattern.tsx +1 -1
- package/docs/patterns/components-promptbar--pattern-prompt-bar.tsx +1 -1
- package/docs/patterns/components-prose--article-body.tsx +1 -1
- package/docs/patterns/components-radio-radiogroup--default.tsx +1 -1
- package/docs/patterns/components-scrollhorizontal--project-gallery-pattern.tsx +1 -1
- package/docs/patterns/components-scrollhorizontal--with-intro.tsx +1 -1
- package/docs/patterns/components-sectioncaption--column-caption.tsx +1 -1
- package/docs/patterns/components-sectioncaption--with-action.tsx +1 -1
- package/docs/patterns/components-sheet--bottom-sheet.tsx +1 -1
- package/docs/patterns/components-sheet--end-sheet.tsx +1 -1
- package/docs/patterns/components-sitenav--brand-and-cta.tsx +1 -1
- package/docs/patterns/components-sitenav--centered-links.tsx +1 -1
- package/docs/patterns/components-sitenav--compact.tsx +1 -1
- package/docs/patterns/components-sitenav--marketing-header.tsx +1 -1
- package/docs/patterns/components-sitenav--mega-menu.tsx +1 -1
- package/docs/patterns/components-stat--insights-row.tsx +1 -1
- package/docs/patterns/components-stepprogress--step-progress-pattern.tsx +1 -1
- package/docs/patterns/components-switch--default.tsx +1 -1
- package/docs/patterns/components-switch--settings-row.tsx +1 -1
- package/docs/patterns/components-tab--settings-pages.tsx +1 -1
- package/docs/patterns/components-taskrows--action-details.tsx +1 -1
- package/docs/patterns/components-taskrows--capsules.tsx +1 -1
- package/docs/patterns/components-taskrows--card-with-status-rows.tsx +1 -1
- package/docs/patterns/components-taskrows--controlled-expand.tsx +1 -1
- package/docs/patterns/components-taskrows--custom-slots.tsx +1 -1
- package/docs/patterns/components-taskrows--status-list.tsx +1 -1
- package/docs/patterns/components-taskrows--tag-chips.tsx +1 -1
- package/docs/patterns/components-textlink--external-destination.tsx +1 -1
- package/docs/patterns/components-textlink--inline-prose.tsx +1 -1
- package/docs/patterns/components-textlink--quiet-title.tsx +1 -1
- package/docs/patterns/components-textlink--supporting-copy.tsx +1 -1
- package/docs/patterns/components-textsequence--default.tsx +1 -1
- package/docs/patterns/components-textsequence--reduced-motion.tsx +1 -1
- package/docs/patterns/components-textsequence--shapes.tsx +1 -1
- package/docs/patterns/components-toast--stacked-notifications.tsx +1 -1
- package/docs/patterns/components-tooltip--controlled.tsx +1 -1
- package/docs/patterns/components-tooltip--disabled-control.tsx +1 -1
- package/docs/patterns/components-tooltip--icon-action.tsx +1 -1
- package/docs/patterns/components-tooltip--keyboard-shortcut.tsx +1 -1
- package/docs/patterns/components-tooltip--placement.tsx +1 -1
- package/docs/patterns/foundations-scroll-fade--horizontal-rail.tsx +1 -1
- package/docs/patterns/foundations-scroll-fade--overflowing-list.tsx +1 -1
- package/docs/patterns/guides-chart-explorations--comparison-gallery.tsx +1 -1
- package/docs/patterns/guides-filter-panel--filtered-index.tsx +41 -17
- package/docs/patterns/guides-overlay-flows--notification-preferences.tsx +1 -1
- package/docs/patterns/guides-post-page--post-page.tsx +34 -4
- package/docs/patterns/guides-profile-typography--editorial-profile.tsx +1 -1
- package/docs/patterns/index.json +1 -1
- package/package.json +1 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
// @thewhatmatters/wmds@0.4.
|
|
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
|
|
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
|
-
|
|
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
|
|
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 ||
|
|
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:
|
|
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
|
|
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
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
}) {
|
|
105
|
+
defaultSelection,
|
|
106
|
+
selection: selectionProp,
|
|
107
|
+
onSelectionChange,
|
|
108
|
+
}: FilteredIndexProps) {
|
|
91
109
|
const filtersHeadingId = useId();
|
|
92
|
-
const [
|
|
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
|
-
|
|
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={() =>
|
|
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={() =>
|
|
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
|
+
// @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
|
+
// @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
|
|
|
@@ -74,8 +74,34 @@ function CopyButton({ text, label }: { text: string; label: string }) {
|
|
|
74
74
|
);
|
|
75
75
|
}
|
|
76
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
|
+
|
|
77
103
|
/** A blog post: the title, a metadata panel, and the article, which is the rendered markdown. */
|
|
78
|
-
export function PostPage({ post, children
|
|
104
|
+
export function PostPage({ post, children, metadataSide = "start", metadataColumns = 4 }: PostPageProps) {
|
|
79
105
|
const metadataHeadingId = useId();
|
|
80
106
|
const encodedUrl = encodeURIComponent(post.url);
|
|
81
107
|
const encodedTitle = encodeURIComponent(post.title);
|
|
@@ -91,7 +117,11 @@ export function PostPage({ post, children }: { post: PostPageData; children: Rea
|
|
|
91
117
|
|
|
92
118
|
<aside
|
|
93
119
|
aria-labelledby={metadataHeadingId}
|
|
94
|
-
className=
|
|
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
|
+
}
|
|
95
125
|
>
|
|
96
126
|
<SectionCaption id={metadataHeadingId}>Metadata</SectionCaption>
|
|
97
127
|
<DescriptionList variant="mono" rule="dotted">
|
|
@@ -138,7 +168,7 @@ export function PostPage({ post, children }: { post: PostPageData; children: Rea
|
|
|
138
168
|
</DescriptionList>
|
|
139
169
|
</aside>
|
|
140
170
|
|
|
141
|
-
<div className="col-span-full mt-6 lg:
|
|
171
|
+
<div className={"col-span-full mt-6 lg:mt-0 " + articleColumnClasses[metadataColumns]}>
|
|
142
172
|
<SectionCaption as="p">Article</SectionCaption>
|
|
143
173
|
<Prose className="mt-6">{children}</Prose>
|
|
144
174
|
</div>
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
// @thewhatmatters/wmds@0.4.
|
|
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
|
|
package/docs/patterns/index.json
CHANGED
package/package.json
CHANGED