@thewhatmatters/wmds 0.2.0 → 0.3.0

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 (134) hide show
  1. package/CHANGELOG.md +10 -0
  2. package/CONSUMING.md +4 -4
  3. package/README.md +3 -3
  4. package/dist/styles.css +1 -1
  5. package/docs/component-contracts.md +1 -1
  6. package/docs/components.md +6 -6
  7. package/docs/exports.json +1 -13
  8. package/docs/patterns/components-avatar--dropdown-row.tsx +1 -1
  9. package/docs/patterns/components-badge--with-avatar.tsx +1 -1
  10. package/docs/patterns/components-button-button--destructive-action.tsx +1 -1
  11. package/docs/patterns/components-button-button--ghost-action.tsx +1 -1
  12. package/docs/patterns/components-button-button--inverse-action.tsx +1 -1
  13. package/docs/patterns/components-button-button--link-render.tsx +1 -1
  14. package/docs/patterns/components-button-button--multi-state-badge.tsx +1 -1
  15. package/docs/patterns/components-button-button--outline-mono.tsx +1 -1
  16. package/docs/patterns/components-button-button--primary-action.tsx +1 -1
  17. package/docs/patterns/components-button-button--row-hug.tsx +1 -1
  18. package/docs/patterns/components-button-button--row-layout.tsx +1 -1
  19. package/docs/patterns/components-button-button--secondary-action.tsx +1 -1
  20. package/docs/patterns/components-button-button--suggestion-pills.tsx +1 -1
  21. package/docs/patterns/components-button-button--with-count.tsx +1 -1
  22. package/docs/patterns/components-button-button--with-icon.tsx +1 -1
  23. package/docs/patterns/components-button-floatingactionbutton--vertical-actions.tsx +1 -1
  24. package/docs/patterns/components-calembed--pattern-skip-in-footer.tsx +1 -1
  25. package/docs/patterns/components-card-card--body-slot-occupancy-history.tsx +1 -1
  26. package/docs/patterns/components-card-card--headerless-media.tsx +1 -1
  27. package/docs/patterns/components-card-card--outlined-layout.tsx +1 -1
  28. package/docs/patterns/components-card-card--pinned-height.tsx +1 -1
  29. package/docs/patterns/components-card-selectablecard--selectable-cards-pattern.tsx +1 -1
  30. package/docs/patterns/components-chart--audience-activity-heatmap.tsx +1 -1
  31. package/docs/patterns/components-chart--cartesian-no-data-gaps.tsx +1 -1
  32. package/docs/patterns/components-chart--occupancy-history-in-card.tsx +1 -1
  33. package/docs/patterns/components-chart--occupancy-in-card.tsx +1 -1
  34. package/docs/patterns/components-chart--post-reach-distribution.tsx +1 -1
  35. package/docs/patterns/components-chart--ranked-audience-breakdown.tsx +1 -1
  36. package/docs/patterns/components-chart--unit-grid-composition.tsx +1 -1
  37. package/docs/patterns/components-chatqa--pattern-qa-with-reply.tsx +1 -1
  38. package/docs/patterns/components-checkbox-checkbox--default.tsx +1 -1
  39. package/docs/patterns/components-checkbox-checkbox--with-description.tsx +1 -1
  40. package/docs/patterns/components-checkbox-checkboxgroup--default.tsx +1 -1
  41. package/docs/patterns/components-dialog--alert-dialog-destructive.tsx +1 -1
  42. package/docs/patterns/components-dialog--default-dialog.tsx +1 -1
  43. package/docs/patterns/components-dialog--form-dialog.tsx +1 -1
  44. package/docs/patterns/components-displaycontrols--page-utilities.tsx +1 -1
  45. package/docs/patterns/components-field--horizontal-input.tsx +1 -1
  46. package/docs/patterns/components-field--horizontal-text-area.tsx +1 -1
  47. package/docs/patterns/components-field--multi-control.tsx +1 -1
  48. package/docs/patterns/components-footerreveal--marketing-hero-pattern.tsx +1 -1
  49. package/docs/patterns/components-footerreveal--marketing-hero-ruled-pattern.tsx +1 -1
  50. package/docs/patterns/components-footerreveal--marketing-hero-with-gallery-intro.tsx +1 -1
  51. package/docs/patterns/components-footerreveal--marketing-page-pattern.tsx +1 -1
  52. package/docs/patterns/components-footerreveal--ruled-grid-footer-pattern.tsx +1 -1
  53. package/docs/patterns/components-footerreveal--sequenced-marketing-hero.tsx +1 -1
  54. package/docs/patterns/components-herointro--two-line-intro.tsx +1 -1
  55. package/docs/patterns/components-herotilestack--marketing-hero-pattern.tsx +1 -1
  56. package/docs/patterns/components-herotilestack--marketing-hero-text-sequence.tsx +1 -1
  57. package/docs/patterns/components-herotilestack--marketing-hero-with-gallery-intro.tsx +1 -1
  58. package/docs/patterns/components-intakeconfirmation--booked-pattern.tsx +1 -1
  59. package/docs/patterns/components-intakeconfirmation--emailed-pattern.tsx +1 -1
  60. package/docs/patterns/components-intakeform--about-you-pattern.tsx +1 -1
  61. package/docs/patterns/components-intakemodal--intake-modal-pattern.tsx +1 -1
  62. package/docs/patterns/components-kbd--command-row.tsx +1 -1
  63. package/docs/patterns/components-kbd--numbered-choices.tsx +1 -1
  64. package/docs/patterns/components-kbd--shortcut.tsx +1 -1
  65. package/docs/patterns/components-moremenu--action-menu.tsx +1 -1
  66. package/docs/patterns/components-moremenu--in-card-header.tsx +1 -1
  67. package/docs/patterns/components-navlist--side-nav-settings.tsx +1 -1
  68. package/docs/patterns/components-pageheader--app-header-pattern.tsx +1 -1
  69. package/docs/patterns/components-pageheader--page-section-header.tsx +1 -1
  70. package/docs/patterns/components-pageheader--toolbar-header.tsx +1 -1
  71. package/docs/patterns/components-panel--end-detail-rail.tsx +1 -1
  72. package/docs/patterns/components-pillgroup--pill-group-pattern.tsx +1 -1
  73. package/docs/patterns/components-promptbar--pattern-marketing-composer.tsx +3 -3
  74. package/docs/patterns/components-promptbar--pattern-prompt-bar.tsx +1 -1
  75. package/docs/patterns/components-radio-radiogroup--default.tsx +1 -1
  76. package/docs/patterns/components-scrollhorizontal--project-gallery-pattern.tsx +1 -1
  77. package/docs/patterns/components-scrollhorizontal--with-intro.tsx +1 -1
  78. package/docs/patterns/components-sheet--bottom-sheet.tsx +1 -1
  79. package/docs/patterns/components-sheet--end-sheet.tsx +1 -1
  80. package/docs/patterns/components-sitenav--brand-and-cta.tsx +1 -1
  81. package/docs/patterns/components-sitenav--centered-links.tsx +1 -1
  82. package/docs/patterns/components-sitenav--compact.tsx +1 -1
  83. package/docs/patterns/components-sitenav--marketing-header.tsx +1 -1
  84. package/docs/patterns/components-sitenav--mega-menu.tsx +1 -1
  85. package/docs/patterns/components-stat--insights-row.tsx +1 -1
  86. package/docs/patterns/components-stepprogress--step-progress-pattern.tsx +1 -1
  87. package/docs/patterns/components-switch--default.tsx +1 -1
  88. package/docs/patterns/components-switch--settings-row.tsx +1 -1
  89. package/docs/patterns/components-tab--settings-pages.tsx +1 -1
  90. package/docs/patterns/components-taskrows--action-details.tsx +1 -1
  91. package/docs/patterns/components-taskrows--capsules.tsx +1 -1
  92. package/docs/patterns/components-taskrows--card-with-status-rows.tsx +1 -1
  93. package/docs/patterns/components-taskrows--controlled-expand.tsx +1 -1
  94. package/docs/patterns/components-taskrows--custom-slots.tsx +1 -1
  95. package/docs/patterns/components-taskrows--status-list.tsx +1 -1
  96. package/docs/patterns/components-taskrows--tag-chips.tsx +1 -1
  97. package/docs/patterns/components-textlink--external-destination.tsx +1 -1
  98. package/docs/patterns/components-textlink--inline-prose.tsx +1 -1
  99. package/docs/patterns/components-textlink--supporting-copy.tsx +1 -1
  100. package/docs/patterns/components-textsequence--default.tsx +1 -1
  101. package/docs/patterns/components-textsequence--reduced-motion.tsx +1 -1
  102. package/docs/patterns/components-textsequence--shapes.tsx +1 -1
  103. package/docs/patterns/components-toast--stacked-notifications.tsx +1 -1
  104. package/docs/patterns/components-tooltip--controlled.tsx +1 -1
  105. package/docs/patterns/components-tooltip--disabled-control.tsx +1 -1
  106. package/docs/patterns/components-tooltip--icon-action.tsx +1 -1
  107. package/docs/patterns/components-tooltip--keyboard-shortcut.tsx +1 -1
  108. package/docs/patterns/components-tooltip--placement.tsx +1 -1
  109. package/docs/patterns/foundations-scroll-fade--horizontal-rail.tsx +1 -1
  110. package/docs/patterns/foundations-scroll-fade--overflowing-list.tsx +1 -1
  111. package/docs/patterns/guides-chart-explorations--comparison-gallery.tsx +1 -1
  112. package/docs/patterns/guides-overlay-flows--notification-preferences.tsx +1 -1
  113. package/docs/patterns/guides-profile-typography--editorial-profile.tsx +1 -1
  114. package/docs/patterns/index.json +1 -153
  115. package/package.json +1 -1
  116. package/docs/patterns/sites-pitchkit-account-settings--account-settings-owner.tsx +0 -265
  117. package/docs/patterns/sites-pitchkit-creator-identity--creator-identity-owner-settings.tsx +0 -154
  118. package/docs/patterns/sites-pitchkit-creator-identity--creator-identity-public.tsx +0 -96
  119. package/docs/patterns/sites-pitchkit-insights-and-kit--creator-insights-loading.tsx +0 -1006
  120. package/docs/patterns/sites-pitchkit-insights-and-kit--creator-insights.tsx +0 -1031
  121. package/docs/patterns/sites-pitchkit-insights-and-kit--insufficient-audience-data.tsx +0 -1015
  122. package/docs/patterns/sites-pitchkit-insights-and-kit--insufficient-reach-and-audience-data.tsx +0 -1017
  123. package/docs/patterns/sites-pitchkit-insights-and-kit--insufficient-reach-data.tsx +0 -1033
  124. package/docs/patterns/sites-pitchkit-insights-and-kit--owner-pitch-kit.tsx +0 -838
  125. package/docs/patterns/sites-pitchkit-insights-and-kit--shareable-pitch-kit.tsx +0 -608
  126. package/docs/patterns/sites-pitchkit-intro--intro-owner.tsx +0 -161
  127. package/docs/patterns/sites-pitchkit-intro--intro-public.tsx +0 -111
  128. package/docs/patterns/sites-pitchkit-past-brands--past-brands-owner.tsx +0 -611
  129. package/docs/patterns/sites-pitchkit-past-brands--past-brands-public.tsx +0 -299
  130. package/docs/patterns/sites-pitchkit-theme-picker--theme-picker-owner.tsx +0 -832
  131. package/docs/patterns/sites-whatmatters-intake--start-a-project-pattern.tsx +0 -234
  132. package/docs/patterns/sites-whatmatters-marketing-landing--marketing-landing.tsx +0 -87
  133. package/docs/patterns/sites-whatmatters-prompt-chat--landing-to-chat.tsx +0 -899
  134. package/docs/patterns/sites-whatmatters-rfp-submitted--rfp-submitted.tsx +0 -302
@@ -1,234 +0,0 @@
1
- // @thewhatmatters/wmds@0.2.0 · Pattern — start a project
2
- // Storybook: Sites/WhatMatters/Intake → Pattern — start a project (?path=/story/sites-whatmatters-intake--start-a-project-pattern)
3
- // Show code — copy verbatim and keep this header; upgrades find pasted patterns by it.
4
-
5
- import { useState } from "react";
6
- import {
7
- Button,
8
- CalEmbed,
9
- ConfettiProvider,
10
- IntakeConfirmation,
11
- IntakeForm,
12
- IntakeModal,
13
- PillGroup,
14
- SegmentedControl,
15
- SelectableCard,
16
- intakeAboutEmpty,
17
- intakeDetailsMax,
18
- isIntakeAboutValid,
19
- type IntakeAboutValues,
20
- } from "@thewhatmatters/wmds";
21
-
22
- export const intakeNeeds = [
23
- {
24
- value: "brand",
25
- title: "Brand identity",
26
- description: "Name, mark, and a system you can actually use.",
27
- },
28
- {
29
- value: "website",
30
- title: "Website",
31
- description: "A site that explains the work and earns the next conversation.",
32
- },
33
- {
34
- value: "product",
35
- title: "Product design",
36
- description: "Flows, screens, and the details in between.",
37
- },
38
- {
39
- value: "marketing",
40
- title: "Marketing site",
41
- description: "A campaign page with one clear ask.",
42
- },
43
- {
44
- value: "system",
45
- title: "Design system",
46
- description: "Components, tokens, and the rules that keep them honest.",
47
- },
48
- {
49
- value: "other",
50
- title: "Other",
51
- description: "Something that does not fit the list yet.",
52
- },
53
- ] as const;
54
-
55
- export const intakeBudgets = [
56
- { value: "under-10", label: "<$10k", emphasis: "solid" },
57
- { value: "10-25", label: "$10–25k", emphasis: "solid" },
58
- { value: "25-50", label: "$25–50k", emphasis: "solid" },
59
- { value: "50-plus", label: "$50k+", emphasis: "solid" },
60
- { value: "unsure", label: "Not sure yet", emphasis: "muted" },
61
- ] as const;
62
-
63
- export type IntakeStep = 1 | 2 | 3 | 4;
64
-
65
- export type IntakePhase =
66
- | { kind: "step"; step: IntakeStep }
67
- | { kind: "done"; variant: "booked" | "emailed" };
68
-
69
- export function canContinueIntake(input: {
70
- step: IntakeStep;
71
- needs: readonly string[];
72
- budget: string | null;
73
- about: IntakeAboutValues;
74
- }): boolean {
75
- if (input.step === 1) {
76
- return input.needs.length > 0;
77
- }
78
- if (input.step === 2) {
79
- return input.budget != null;
80
- }
81
- if (input.step === 3) {
82
- return isIntakeAboutValid(input.about, intakeDetailsMax);
83
- }
84
- return false;
85
- }
86
-
87
- export function StartAProject({ initialOpen = true }: { initialOpen?: boolean }) {
88
- const [open, setOpen] = useState(initialOpen);
89
- const [phase, setPhase] = useState<IntakePhase>({ kind: "step", step: 1 });
90
- const [mode, setMode] = useState("fresh");
91
- const [needs, setNeeds] = useState<string[]>([]);
92
- const [budget, setBudget] = useState<string | null>(null);
93
- const [about, setAbout] = useState<IntakeAboutValues>(intakeAboutEmpty);
94
-
95
- function openIntake() {
96
- setPhase({ kind: "step", step: 1 });
97
- setMode("fresh");
98
- setNeeds([]);
99
- setBudget(null);
100
- setAbout(intakeAboutEmpty);
101
- setOpen(true);
102
- }
103
-
104
- const step = phase.kind === "step" ? phase.step : 4;
105
- const continueDisabled =
106
- phase.kind !== "step" ||
107
- !canContinueIntake({ step: phase.step, needs, budget, about });
108
-
109
- function goBack() {
110
- if (phase.kind !== "step" || phase.step === 1) {
111
- return;
112
- }
113
- const previous = (phase.step - 1) as IntakeStep;
114
- setPhase({ kind: "step", step: previous });
115
- }
116
-
117
- function goContinue() {
118
- if (phase.kind !== "step" || !canContinueIntake({ step: phase.step, needs, budget, about })) {
119
- return;
120
- }
121
- if (phase.step === 4) {
122
- return;
123
- }
124
- const next = (phase.step + 1) as IntakeStep;
125
- setPhase({ kind: "step", step: next });
126
- }
127
-
128
- return (
129
- <ConfettiProvider>
130
- <Button role="primary" type="button" onClick={openIntake}>
131
- Start a project
132
- </Button>
133
- <IntakeModal
134
- open={open}
135
- onOpenChange={setOpen}
136
- step={step}
137
- steps={4}
138
- showProgress={phase.kind === "step"}
139
- hideFooter={phase.kind === "done"}
140
- hideContinue={phase.kind === "step" && phase.step === 4}
141
- backDisabled={phase.kind !== "step" || phase.step === 1}
142
- continueDisabled={continueDisabled}
143
- onBack={goBack}
144
- onContinue={goContinue}
145
- >
146
- {phase.kind === "done" ? (
147
- <IntakeConfirmation variant={phase.variant} onDone={() => setOpen(false)} />
148
- ) : null}
149
- {phase.kind === "step" && phase.step === 1 ? (
150
- <>
151
- <div className="flex flex-col gap-3">
152
- <h2 className="type-heading-1 text-fg tracking-tight">What do you need?</h2>
153
- <p className="type-body text-fg">
154
- Pick everything that fits. We&apos;ll shape the work around it.
155
- </p>
156
- </div>
157
- <SelectableCard.Group
158
- label="What do you need?"
159
- values={needs}
160
- onValuesChange={setNeeds}
161
- toggle={
162
- <SegmentedControl
163
- aria-label="Project starting point"
164
- layout="hug"
165
- value={mode}
166
- onValueChange={setMode}
167
- >
168
- <SegmentedControl.Item value="fresh">Starting fresh</SegmentedControl.Item>
169
- <SegmentedControl.Item value="refresh">Refreshing what I have</SegmentedControl.Item>
170
- </SegmentedControl>
171
- }
172
- >
173
- {intakeNeeds.map((option) => (
174
- <SelectableCard
175
- key={option.value}
176
- value={option.value}
177
- title={option.title}
178
- description={option.description}
179
- />
180
- ))}
181
- </SelectableCard.Group>
182
- </>
183
- ) : null}
184
- {phase.kind === "step" && phase.step === 2 ? (
185
- <>
186
- <div className="flex flex-col gap-3">
187
- <h2 className="type-heading-1 text-fg tracking-tight">What&apos;s the budget?</h2>
188
- <p className="type-body text-fg">
189
- A range is enough. We can tighten it after the first conversation.
190
- </p>
191
- </div>
192
- <PillGroup aria-label="Budget" value={budget} onValueChange={setBudget}>
193
- {intakeBudgets.map((option) => (
194
- <PillGroup.Item key={option.value} value={option.value} emphasis={option.emphasis}>
195
- {option.label}
196
- </PillGroup.Item>
197
- ))}
198
- </PillGroup>
199
- </>
200
- ) : null}
201
- {phase.kind === "step" && phase.step === 3 ? (
202
- <>
203
- <div className="flex flex-col gap-3">
204
- <h2 className="type-heading-1 text-fg tracking-tight">About you</h2>
205
- <p className="type-body text-fg">
206
- A few sentences is enough. We&apos;ll reply to the email you leave here.
207
- </p>
208
- </div>
209
- <IntakeForm values={about} onChange={setAbout} />
210
- </>
211
- ) : null}
212
- {phase.kind === "step" && phase.step === 4 ? (
213
- <>
214
- <div className="flex flex-col gap-3">
215
- <h2 className="type-heading-1 text-fg tracking-tight">Book a call</h2>
216
- <p className="type-body text-fg">
217
- Pick a time, or skip this and we&apos;ll write to you instead.
218
- </p>
219
- </div>
220
- <CalEmbed onSkip={() => setPhase({ kind: "done", variant: "emailed" })}>
221
- <Button
222
- role="primary"
223
- type="button"
224
- onClick={() => setPhase({ kind: "done", variant: "booked" })}
225
- >
226
- Confirm this time
227
- </Button>
228
- </CalEmbed>
229
- </>
230
- ) : null}
231
- </IntakeModal>
232
- </ConfettiProvider>
233
- );
234
- }
@@ -1,87 +0,0 @@
1
- // @thewhatmatters/wmds@0.2.0 · Pattern — marketing landing
2
- // Storybook: Sites/WhatMatters/Marketing landing → Pattern — marketing landing (?path=/story/sites-whatmatters-marketing-landing--marketing-landing)
3
- // Show code — copy verbatim and keep this header; upgrades find pasted patterns by it.
4
-
5
- import { Button, SiteNav } from "@thewhatmatters/wmds";
6
- import { BookOpen, FileText, History, Mic, Sparkles, Target, Video } from "lucide-react";
7
-
8
- export function MarketingLanding() {
9
- return (
10
- <main className="grid-page min-h-screen bg-body [--grid-column-gap:24px] [--grid-max:80rem]">
11
- <SiteNav
12
- start={
13
- <SiteNav.Brand href="/" aria-label="WhatMatters" icon={<Sparkles />} />
14
- }
15
- middle={
16
- <SiteNav.Links>
17
- <SiteNav.Link href="/product" current>Product</SiteNav.Link>
18
- <SiteNav.Link href="/pricing">Pricing</SiteNav.Link>
19
- <SiteNav.Link href="/customers">Customers</SiteNav.Link>
20
- <SiteNav.Menu label="Resources">
21
- <SiteNav.MenuSection label="Featured">
22
- <SiteNav.Featured
23
- media={<SiteNav.MenuMedia variant="featured" label="Featured story imagery" />}
24
- title="WhatMatters named a Best Software Award winner"
25
- description="How teams cut meeting load without losing alignment — and what we shipped next."
26
- href="/featured"
27
- />
28
- </SiteNav.MenuSection>
29
- <SiteNav.MenuSection label="Read">
30
- <ul className="m-0 flex list-none flex-col p-0">
31
- <li className="-mx-6 border-b border-border px-6 pb-5">
32
- <SiteNav.ReadRow
33
- media={<SiteNav.MenuMedia label="Docs imagery" />}
34
- title="Docs"
35
- description="Patterns and APIs for building calm product surfaces."
36
- href="/docs"
37
- />
38
- </li>
39
- <li className="px-0 pt-5">
40
- <SiteNav.ReadRow
41
- media={<SiteNav.MenuMedia label="Opinion imagery" />}
42
- title="Opinion articles"
43
- description="Notes on focus, backlog shape, and shipping what matters."
44
- href="/opinion"
45
- />
46
- </li>
47
- </ul>
48
- </SiteNav.MenuSection>
49
- <SiteNav.MenuSection label="Links">
50
- <SiteNav.MenuLinkGrid>
51
- <SiteNav.MenuLink href="/podcast" icon={<Mic />}>Podcast</SiteNav.MenuLink>
52
- <SiteNav.MenuLink href="https://youtube.com" icon={<Video />} external>YouTube</SiteNav.MenuLink>
53
- <SiteNav.MenuLink href="/webinars" icon={<Target />}>Webinars</SiteNav.MenuLink>
54
- <SiteNav.MenuLink href="/changelog" icon={<History />}>Changelog</SiteNav.MenuLink>
55
- <SiteNav.MenuLink href="/blog" icon={<FileText />}>Blog</SiteNav.MenuLink>
56
- <SiteNav.MenuLink href="/docs" icon={<BookOpen />}>Docs</SiteNav.MenuLink>
57
- </SiteNav.MenuLinkGrid>
58
- </SiteNav.MenuSection>
59
- </SiteNav.Menu>
60
- </SiteNav.Links>
61
- }
62
- end={
63
- <>
64
- <Button role="ghost" size="sm" render={<a href="/signin" />} className="whitespace-nowrap">Sign in</Button>
65
- <Button role="primary" size="sm" render={<a href="/start" />} className="whitespace-nowrap">Get started</Button>
66
- </>
67
- }
68
- mobile={
69
- <>
70
- <SiteNav.MobileLink href="/product" current>Product</SiteNav.MobileLink>
71
- <SiteNav.MobileLink href="/pricing">Pricing</SiteNav.MobileLink>
72
- <SiteNav.MobileLink href="/customers">Customers</SiteNav.MobileLink>
73
- <SiteNav.MobileLink href="/blog">Blog</SiteNav.MobileLink>
74
- </>
75
- }
76
- />
77
- <div className="band pt-10">
78
- <div className="col-span-full flex flex-col gap-6 lg:col-span-8 lg:col-start-3">
79
- <h1 className="type-display-2 text-fg">Plan the week around what matters.</h1>
80
- <p className="type-body max-w-prose text-muted">
81
- WhatMatters turns a noisy backlog into one calm list.
82
- </p>
83
- </div>
84
- </div>
85
- </main>
86
- );
87
- }