@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.
- package/CHANGELOG.md +10 -0
- package/CONSUMING.md +4 -4
- package/README.md +3 -3
- package/dist/styles.css +1 -1
- package/docs/component-contracts.md +1 -1
- package/docs/components.md +6 -6
- package/docs/exports.json +1 -13
- package/docs/patterns/components-avatar--dropdown-row.tsx +1 -1
- package/docs/patterns/components-badge--with-avatar.tsx +1 -1
- package/docs/patterns/components-button-button--destructive-action.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-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-description.tsx +1 -1
- package/docs/patterns/components-checkbox-checkboxgroup--default.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-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-marketing-composer.tsx +3 -3
- package/docs/patterns/components-promptbar--pattern-prompt-bar.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-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--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-overlay-flows--notification-preferences.tsx +1 -1
- package/docs/patterns/guides-profile-typography--editorial-profile.tsx +1 -1
- package/docs/patterns/index.json +1 -153
- package/package.json +1 -1
- package/docs/patterns/sites-pitchkit-account-settings--account-settings-owner.tsx +0 -265
- package/docs/patterns/sites-pitchkit-creator-identity--creator-identity-owner-settings.tsx +0 -154
- package/docs/patterns/sites-pitchkit-creator-identity--creator-identity-public.tsx +0 -96
- package/docs/patterns/sites-pitchkit-insights-and-kit--creator-insights-loading.tsx +0 -1006
- package/docs/patterns/sites-pitchkit-insights-and-kit--creator-insights.tsx +0 -1031
- package/docs/patterns/sites-pitchkit-insights-and-kit--insufficient-audience-data.tsx +0 -1015
- package/docs/patterns/sites-pitchkit-insights-and-kit--insufficient-reach-and-audience-data.tsx +0 -1017
- package/docs/patterns/sites-pitchkit-insights-and-kit--insufficient-reach-data.tsx +0 -1033
- package/docs/patterns/sites-pitchkit-insights-and-kit--owner-pitch-kit.tsx +0 -838
- package/docs/patterns/sites-pitchkit-insights-and-kit--shareable-pitch-kit.tsx +0 -608
- package/docs/patterns/sites-pitchkit-intro--intro-owner.tsx +0 -161
- package/docs/patterns/sites-pitchkit-intro--intro-public.tsx +0 -111
- package/docs/patterns/sites-pitchkit-past-brands--past-brands-owner.tsx +0 -611
- package/docs/patterns/sites-pitchkit-past-brands--past-brands-public.tsx +0 -299
- package/docs/patterns/sites-pitchkit-theme-picker--theme-picker-owner.tsx +0 -832
- package/docs/patterns/sites-whatmatters-intake--start-a-project-pattern.tsx +0 -234
- package/docs/patterns/sites-whatmatters-marketing-landing--marketing-landing.tsx +0 -87
- package/docs/patterns/sites-whatmatters-prompt-chat--landing-to-chat.tsx +0 -899
- 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
|
-
}
|