@thewhatmatters/wmds 0.2.0 → 0.4.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 (153) hide show
  1. package/CHANGELOG.md +29 -0
  2. package/CONSUMING.md +5 -4
  3. package/README.md +3 -3
  4. package/dist/components/molecules/PromptBar/PromptBar.d.ts +11 -1
  5. package/dist/components/molecules/PromptBar/PromptBar.d.ts.map +1 -1
  6. package/dist/components/molecules/PromptBar/PromptBar.js +54 -43
  7. package/dist/components/molecules/PromptBar/promptBarStyles.d.ts +15 -0
  8. package/dist/components/molecules/PromptBar/promptBarStyles.d.ts.map +1 -1
  9. package/dist/components/molecules/PromptBar/promptBarStyles.js +5 -2
  10. package/dist/components/organisms/ChatDock/ChatDock.d.ts +93 -0
  11. package/dist/components/organisms/ChatDock/ChatDock.d.ts.map +1 -0
  12. package/dist/components/organisms/ChatDock/ChatDock.js +255 -0
  13. package/dist/components/organisms/ChatDock/chatDockStyles.d.ts +48 -0
  14. package/dist/components/organisms/ChatDock/chatDockStyles.d.ts.map +1 -0
  15. package/dist/components/organisms/ChatDock/chatDockStyles.js +15 -0
  16. package/dist/components/organisms/Dialog/AlertDialog.js +11 -11
  17. package/dist/components/organisms/Dialog/Dialog.js +44 -44
  18. package/dist/components/organisms/Sheet/Sheet.js +38 -38
  19. package/dist/index.d.ts +1 -0
  20. package/dist/index.d.ts.map +1 -1
  21. package/dist/index.js +30 -28
  22. package/dist/styles.css +1 -1
  23. package/docs/component-contracts.md +1 -1
  24. package/docs/components.md +7 -6
  25. package/docs/exports.json +14 -14
  26. package/docs/patterns/components-avatar--dropdown-row.tsx +1 -1
  27. package/docs/patterns/components-badge--with-avatar.tsx +1 -1
  28. package/docs/patterns/components-button-button--destructive-action.tsx +1 -1
  29. package/docs/patterns/components-button-button--ghost-action.tsx +1 -1
  30. package/docs/patterns/components-button-button--inverse-action.tsx +1 -1
  31. package/docs/patterns/components-button-button--link-render.tsx +1 -1
  32. package/docs/patterns/components-button-button--multi-state-badge.tsx +1 -1
  33. package/docs/patterns/components-button-button--outline-mono.tsx +1 -1
  34. package/docs/patterns/components-button-button--primary-action.tsx +1 -1
  35. package/docs/patterns/components-button-button--row-hug.tsx +1 -1
  36. package/docs/patterns/components-button-button--row-layout.tsx +1 -1
  37. package/docs/patterns/components-button-button--secondary-action.tsx +1 -1
  38. package/docs/patterns/components-button-button--suggestion-pills.tsx +1 -1
  39. package/docs/patterns/components-button-button--with-count.tsx +1 -1
  40. package/docs/patterns/components-button-button--with-icon.tsx +1 -1
  41. package/docs/patterns/components-button-floatingactionbutton--vertical-actions.tsx +1 -1
  42. package/docs/patterns/components-calembed--pattern-skip-in-footer.tsx +1 -1
  43. package/docs/patterns/components-card-card--body-slot-occupancy-history.tsx +1 -1
  44. package/docs/patterns/components-card-card--headerless-media.tsx +1 -1
  45. package/docs/patterns/components-card-card--outlined-layout.tsx +1 -1
  46. package/docs/patterns/components-card-card--pinned-height.tsx +1 -1
  47. package/docs/patterns/components-card-selectablecard--selectable-cards-pattern.tsx +1 -1
  48. package/docs/patterns/components-chart--audience-activity-heatmap.tsx +1 -1
  49. package/docs/patterns/components-chart--cartesian-no-data-gaps.tsx +1 -1
  50. package/docs/patterns/components-chart--occupancy-history-in-card.tsx +1 -1
  51. package/docs/patterns/components-chart--occupancy-in-card.tsx +1 -1
  52. package/docs/patterns/components-chart--post-reach-distribution.tsx +1 -1
  53. package/docs/patterns/components-chart--ranked-audience-breakdown.tsx +1 -1
  54. package/docs/patterns/components-chart--unit-grid-composition.tsx +1 -1
  55. package/docs/patterns/components-chatdock--pattern-chat-dock.tsx +68 -0
  56. package/docs/patterns/components-chatqa--pattern-qa-with-reply.tsx +1 -1
  57. package/docs/patterns/components-checkbox-checkbox--default.tsx +1 -1
  58. package/docs/patterns/components-checkbox-checkbox--with-description.tsx +1 -1
  59. package/docs/patterns/components-checkbox-checkboxgroup--default.tsx +1 -1
  60. package/docs/patterns/components-dialog--alert-dialog-destructive.tsx +1 -1
  61. package/docs/patterns/components-dialog--default-dialog.tsx +1 -1
  62. package/docs/patterns/components-dialog--form-dialog.tsx +1 -1
  63. package/docs/patterns/components-displaycontrols--page-utilities.tsx +1 -1
  64. package/docs/patterns/components-field--horizontal-input.tsx +1 -1
  65. package/docs/patterns/components-field--horizontal-text-area.tsx +1 -1
  66. package/docs/patterns/components-field--multi-control.tsx +1 -1
  67. package/docs/patterns/components-footerreveal--marketing-hero-pattern.tsx +1 -1
  68. package/docs/patterns/components-footerreveal--marketing-hero-ruled-pattern.tsx +1 -1
  69. package/docs/patterns/components-footerreveal--marketing-hero-with-gallery-intro.tsx +1 -1
  70. package/docs/patterns/components-footerreveal--marketing-page-pattern.tsx +1 -1
  71. package/docs/patterns/components-footerreveal--ruled-grid-footer-pattern.tsx +1 -1
  72. package/docs/patterns/components-footerreveal--sequenced-marketing-hero.tsx +1 -1
  73. package/docs/patterns/components-herointro--two-line-intro.tsx +1 -1
  74. package/docs/patterns/components-herotilestack--marketing-hero-pattern.tsx +1 -1
  75. package/docs/patterns/components-herotilestack--marketing-hero-text-sequence.tsx +1 -1
  76. package/docs/patterns/components-herotilestack--marketing-hero-with-gallery-intro.tsx +1 -1
  77. package/docs/patterns/components-intakeconfirmation--booked-pattern.tsx +1 -1
  78. package/docs/patterns/components-intakeconfirmation--emailed-pattern.tsx +1 -1
  79. package/docs/patterns/components-intakeform--about-you-pattern.tsx +1 -1
  80. package/docs/patterns/components-intakemodal--intake-modal-pattern.tsx +1 -1
  81. package/docs/patterns/components-kbd--command-row.tsx +1 -1
  82. package/docs/patterns/components-kbd--numbered-choices.tsx +1 -1
  83. package/docs/patterns/components-kbd--shortcut.tsx +1 -1
  84. package/docs/patterns/components-moremenu--action-menu.tsx +1 -1
  85. package/docs/patterns/components-moremenu--in-card-header.tsx +1 -1
  86. package/docs/patterns/components-navlist--side-nav-settings.tsx +1 -1
  87. package/docs/patterns/components-pageheader--app-header-pattern.tsx +1 -1
  88. package/docs/patterns/components-pageheader--page-section-header.tsx +1 -1
  89. package/docs/patterns/components-pageheader--toolbar-header.tsx +1 -1
  90. package/docs/patterns/components-panel--end-detail-rail.tsx +1 -1
  91. package/docs/patterns/components-pillgroup--pill-group-pattern.tsx +1 -1
  92. package/docs/patterns/components-promptbar--pattern-prompt-bar.tsx +1 -1
  93. package/docs/patterns/components-radio-radiogroup--default.tsx +1 -1
  94. package/docs/patterns/components-scrollhorizontal--project-gallery-pattern.tsx +1 -1
  95. package/docs/patterns/components-scrollhorizontal--with-intro.tsx +1 -1
  96. package/docs/patterns/components-sheet--bottom-sheet.tsx +1 -1
  97. package/docs/patterns/components-sheet--end-sheet.tsx +1 -1
  98. package/docs/patterns/components-sitenav--brand-and-cta.tsx +1 -1
  99. package/docs/patterns/components-sitenav--centered-links.tsx +1 -1
  100. package/docs/patterns/components-sitenav--compact.tsx +1 -1
  101. package/docs/patterns/components-sitenav--marketing-header.tsx +1 -1
  102. package/docs/patterns/components-sitenav--mega-menu.tsx +1 -1
  103. package/docs/patterns/components-stat--insights-row.tsx +1 -1
  104. package/docs/patterns/components-stepprogress--step-progress-pattern.tsx +1 -1
  105. package/docs/patterns/components-switch--default.tsx +1 -1
  106. package/docs/patterns/components-switch--settings-row.tsx +1 -1
  107. package/docs/patterns/components-tab--settings-pages.tsx +1 -1
  108. package/docs/patterns/components-taskrows--action-details.tsx +1 -1
  109. package/docs/patterns/components-taskrows--capsules.tsx +1 -1
  110. package/docs/patterns/components-taskrows--card-with-status-rows.tsx +1 -1
  111. package/docs/patterns/components-taskrows--controlled-expand.tsx +1 -1
  112. package/docs/patterns/components-taskrows--custom-slots.tsx +1 -1
  113. package/docs/patterns/components-taskrows--status-list.tsx +1 -1
  114. package/docs/patterns/components-taskrows--tag-chips.tsx +1 -1
  115. package/docs/patterns/components-textlink--external-destination.tsx +1 -1
  116. package/docs/patterns/components-textlink--inline-prose.tsx +1 -1
  117. package/docs/patterns/components-textlink--supporting-copy.tsx +1 -1
  118. package/docs/patterns/components-textsequence--default.tsx +1 -1
  119. package/docs/patterns/components-textsequence--reduced-motion.tsx +1 -1
  120. package/docs/patterns/components-textsequence--shapes.tsx +1 -1
  121. package/docs/patterns/components-toast--stacked-notifications.tsx +1 -1
  122. package/docs/patterns/components-tooltip--controlled.tsx +1 -1
  123. package/docs/patterns/components-tooltip--disabled-control.tsx +1 -1
  124. package/docs/patterns/components-tooltip--icon-action.tsx +1 -1
  125. package/docs/patterns/components-tooltip--keyboard-shortcut.tsx +1 -1
  126. package/docs/patterns/components-tooltip--placement.tsx +1 -1
  127. package/docs/patterns/foundations-scroll-fade--horizontal-rail.tsx +1 -1
  128. package/docs/patterns/foundations-scroll-fade--overflowing-list.tsx +1 -1
  129. package/docs/patterns/guides-chart-explorations--comparison-gallery.tsx +1 -1
  130. package/docs/patterns/guides-overlay-flows--notification-preferences.tsx +1 -1
  131. package/docs/patterns/guides-profile-typography--editorial-profile.tsx +1 -1
  132. package/docs/patterns/index.json +9 -161
  133. package/package.json +1 -1
  134. package/docs/patterns/components-promptbar--pattern-marketing-composer.tsx +0 -37
  135. package/docs/patterns/sites-pitchkit-account-settings--account-settings-owner.tsx +0 -265
  136. package/docs/patterns/sites-pitchkit-creator-identity--creator-identity-owner-settings.tsx +0 -154
  137. package/docs/patterns/sites-pitchkit-creator-identity--creator-identity-public.tsx +0 -96
  138. package/docs/patterns/sites-pitchkit-insights-and-kit--creator-insights-loading.tsx +0 -1006
  139. package/docs/patterns/sites-pitchkit-insights-and-kit--creator-insights.tsx +0 -1031
  140. package/docs/patterns/sites-pitchkit-insights-and-kit--insufficient-audience-data.tsx +0 -1015
  141. package/docs/patterns/sites-pitchkit-insights-and-kit--insufficient-reach-and-audience-data.tsx +0 -1017
  142. package/docs/patterns/sites-pitchkit-insights-and-kit--insufficient-reach-data.tsx +0 -1033
  143. package/docs/patterns/sites-pitchkit-insights-and-kit--owner-pitch-kit.tsx +0 -838
  144. package/docs/patterns/sites-pitchkit-insights-and-kit--shareable-pitch-kit.tsx +0 -608
  145. package/docs/patterns/sites-pitchkit-intro--intro-owner.tsx +0 -161
  146. package/docs/patterns/sites-pitchkit-intro--intro-public.tsx +0 -111
  147. package/docs/patterns/sites-pitchkit-past-brands--past-brands-owner.tsx +0 -611
  148. package/docs/patterns/sites-pitchkit-past-brands--past-brands-public.tsx +0 -299
  149. package/docs/patterns/sites-pitchkit-theme-picker--theme-picker-owner.tsx +0 -832
  150. package/docs/patterns/sites-whatmatters-intake--start-a-project-pattern.tsx +0 -234
  151. package/docs/patterns/sites-whatmatters-marketing-landing--marketing-landing.tsx +0 -87
  152. package/docs/patterns/sites-whatmatters-prompt-chat--landing-to-chat.tsx +0 -899
  153. package/docs/patterns/sites-whatmatters-rfp-submitted--rfp-submitted.tsx +0 -302
@@ -1,302 +0,0 @@
1
- // @thewhatmatters/wmds@0.2.0 · Pattern — RFP submitted
2
- // Storybook: Sites/WhatMatters/RFP submitted → Pattern — RFP submitted (?path=/story/sites-whatmatters-rfp-submitted--rfp-submitted)
3
- // Show code — copy verbatim and keep this header; upgrades find pasted patterns by it.
4
-
5
- import { useState, type FormEvent } from "react";
6
- import { Check } from "lucide-react";
7
- import {
8
- Badge,
9
- Button,
10
- Card,
11
- ConfettiProvider,
12
- Input,
13
- Select,
14
- TextArea,
15
- cardLayoutBodyOccupantInsetXClasses,
16
- cardLayoutBodyOccupantPadYClasses,
17
- cardSubtitleClasses,
18
- cardTitleClasses,
19
- cn,
20
- useConfettiOnMount,
21
- } from "@thewhatmatters/wmds";
22
-
23
- const projectOptions = [
24
- { value: "product", label: "Product" },
25
- { value: "brand", label: "Brand" },
26
- { value: "engineering", label: "Engineering" },
27
- ] as const;
28
-
29
- const budgetOptions = [
30
- { value: "25", label: "$25k–$50k" },
31
- { value: "50", label: "$50k–$100k" },
32
- { value: "100", label: "$100k+" },
33
- ] as const;
34
-
35
- const initialBrief =
36
- "We need a calm way for clients to request a proposal and see that it landed.";
37
-
38
- interface RfpDraft {
39
- company: string;
40
- email: string;
41
- project: string;
42
- budget: string;
43
- brief: string;
44
- }
45
-
46
- function optionLabel(
47
- options: readonly { value: string; label: string }[],
48
- value: string,
49
- ): string {
50
- return options.find((option) => option.value === value)?.label ?? value;
51
- }
52
-
53
- function RfpConfirmation({
54
- submission,
55
- onStartAnother,
56
- }: {
57
- submission: RfpDraft;
58
- onStartAnother: () => void;
59
- }) {
60
- useConfettiOnMount({
61
- particleCount: 90,
62
- spread: 180,
63
- startVelocity: 28,
64
- origin: {
65
- x: typeof window === "undefined" ? 0 : window.innerWidth / 2,
66
- y: 0,
67
- },
68
- });
69
-
70
- const summary = [
71
- { label: "Company", value: submission.company },
72
- { label: "Work email", value: submission.email },
73
- { label: "Project", value: optionLabel(projectOptions, submission.project) },
74
- { label: "Budget", value: optionLabel(budgetOptions, submission.budget) },
75
- { label: "Brief", value: submission.brief },
76
- ];
77
-
78
- return (
79
- <div className="band py-10">
80
- <div className="col-span-full lg:col-span-6 lg:col-start-4">
81
- <Card padding="none">
82
- <Card.Header
83
- start={
84
- <div className="flex flex-col items-start gap-2">
85
- <Badge variant="success" emphasis="muted" icon={<Check strokeWidth={2} />}>
86
- Request received
87
- </Badge>
88
- <h1 className="type-heading-2 text-fg">Your proposal request is in</h1>
89
- <p className={cardSubtitleClasses}>
90
- We will reply to {submission.email} within two business days.
91
- </p>
92
- </div>
93
- }
94
- />
95
- <Card.Body>
96
- <div
97
- className={cn(
98
- cardLayoutBodyOccupantInsetXClasses,
99
- cardLayoutBodyOccupantPadYClasses,
100
- "flex flex-col gap-6",
101
- )}
102
- >
103
- <section className="flex flex-col gap-3">
104
- <h2 className="type-label text-fg">What you sent</h2>
105
- <dl className="flex flex-col gap-3">
106
- {summary.map((row) => (
107
- <div key={row.label} className="flex flex-col gap-0.5">
108
- <dt className="type-supporting text-muted">{row.label}</dt>
109
- <dd className="type-body text-fg">{row.value}</dd>
110
- </div>
111
- ))}
112
- </dl>
113
- </section>
114
- <section className="flex flex-col gap-3">
115
- <h2 className="type-label text-fg">What happens next</h2>
116
- <ol className="flex list-decimal flex-col gap-2 ps-5">
117
- <li className="type-body text-fg">
118
- We read the brief and match it to the right team.
119
- </li>
120
- <li className="type-body text-fg">You get a reply at the work email above.</li>
121
- <li className="type-body text-fg">If it is a fit, we schedule a short call.</li>
122
- </ol>
123
- </section>
124
- <div>
125
- <Button type="button" role="secondary" onClick={onStartAnother}>
126
- Submit another request
127
- </Button>
128
- </div>
129
- </div>
130
- </Card.Body>
131
- </Card>
132
- </div>
133
- </div>
134
- );
135
- }
136
-
137
- function RfpForm({
138
- company,
139
- email,
140
- project,
141
- budget,
142
- brief,
143
- submitting,
144
- onCompanyChange,
145
- onEmailChange,
146
- onProjectChange,
147
- onBudgetChange,
148
- onBriefChange,
149
- onSubmit,
150
- }: {
151
- company: string;
152
- email: string;
153
- project: string;
154
- budget: string;
155
- brief: string;
156
- submitting: boolean;
157
- onCompanyChange: (value: string) => void;
158
- onEmailChange: (value: string) => void;
159
- onProjectChange: (value: string) => void;
160
- onBudgetChange: (value: string) => void;
161
- onBriefChange: (value: string) => void;
162
- onSubmit: (event: FormEvent<HTMLFormElement>) => void;
163
- }) {
164
- return (
165
- <div className="band py-10">
166
- <div className="col-span-full lg:col-span-6 lg:col-start-4">
167
- <Card padding="none">
168
- <Card.Header
169
- start={
170
- <div className="flex flex-col gap-1">
171
- <h1 className={cardTitleClasses}>Request a proposal</h1>
172
- <p className={cardSubtitleClasses}>
173
- Tell us what you want to build. We reply within two business days.
174
- </p>
175
- </div>
176
- }
177
- />
178
- <Card.Body>
179
- <form
180
- className={cn(
181
- cardLayoutBodyOccupantInsetXClasses,
182
- cardLayoutBodyOccupantPadYClasses,
183
- "flex flex-col gap-4",
184
- )}
185
- onSubmit={onSubmit}
186
- >
187
- <Input
188
- label="Company"
189
- name="company"
190
- value={company}
191
- autoComplete="organization"
192
- onChange={(event) => onCompanyChange(event.target.value)}
193
- required
194
- />
195
- <Input
196
- label="Work email"
197
- name="email"
198
- type="email"
199
- value={email}
200
- autoComplete="email"
201
- onChange={(event) => onEmailChange(event.target.value)}
202
- required
203
- />
204
- <Select
205
- label="Project"
206
- options={[...projectOptions]}
207
- value={project}
208
- onValueChange={onProjectChange}
209
- />
210
- <Select
211
- label="Budget"
212
- options={[...budgetOptions]}
213
- value={budget}
214
- onValueChange={onBudgetChange}
215
- />
216
- <TextArea
217
- label="What should we build?"
218
- name="brief"
219
- value={brief}
220
- rows={5}
221
- onChange={(event) => onBriefChange(event.target.value)}
222
- required
223
- />
224
- <div className="flex justify-end pt-2">
225
- <Button
226
- type="submit"
227
- status={submitting ? "loading" : "idle"}
228
- statusLabels={{
229
- idle: "Submit request",
230
- loading: "Sending",
231
- }}
232
- >
233
- Submit request
234
- </Button>
235
- </div>
236
- </form>
237
- </Card.Body>
238
- </Card>
239
- </div>
240
- </div>
241
- );
242
- }
243
-
244
- function RfpFlow({ onSubmit }: { onSubmit: (draft: RfpDraft) => Promise<void> }) {
245
- const [phase, setPhase] = useState<"editing" | "submitting" | "confirmed">("editing");
246
- const [company, setCompany] = useState("Northwind");
247
- const [email, setEmail] = useState("ava@northwind.example");
248
- const [project, setProject] = useState("product");
249
- const [budget, setBudget] = useState("50");
250
- const [brief, setBrief] = useState(initialBrief);
251
- const [submission, setSubmission] = useState<RfpDraft | null>(null);
252
-
253
- async function handleSubmit(event: FormEvent<HTMLFormElement>) {
254
- event.preventDefault();
255
- if (phase !== "editing") return;
256
- setPhase("submitting");
257
- const draft = { company, email, project, budget, brief };
258
- await onSubmit(draft);
259
- setSubmission(draft);
260
- setPhase("confirmed");
261
- }
262
-
263
- if (phase === "confirmed" && submission) {
264
- return (
265
- <RfpConfirmation
266
- submission={submission}
267
- onStartAnother={() => {
268
- setSubmission(null);
269
- setPhase("editing");
270
- }}
271
- />
272
- );
273
- }
274
-
275
- return (
276
- <RfpForm
277
- company={company}
278
- email={email}
279
- project={project}
280
- budget={budget}
281
- brief={brief}
282
- submitting={phase === "submitting"}
283
- onCompanyChange={setCompany}
284
- onEmailChange={setEmail}
285
- onProjectChange={setProject}
286
- onBudgetChange={setBudget}
287
- onBriefChange={setBrief}
288
- onSubmit={handleSubmit}
289
- />
290
- );
291
- }
292
-
293
- /** `onSubmit` sends the request (your API or form action); the confirmation shows once it resolves. */
294
- export function RfpSubmitted({ onSubmit }: { onSubmit: (draft: RfpDraft) => Promise<void> }) {
295
- return (
296
- <ConfettiProvider>
297
- <main className="grid-page min-h-dvh bg-body [--grid-column-gap:24px] [--grid-max:80rem]">
298
- <RfpFlow onSubmit={onSubmit} />
299
- </main>
300
- </ConfettiProvider>
301
- );
302
- }