design: replace onboarding audience step with starting-point progress status cards
This commit is contained in:
@@ -5,12 +5,11 @@ import {
|
||||
WizardQ,
|
||||
WizardFooter,
|
||||
LANE_LABELS,
|
||||
ChipGroup,
|
||||
Field,
|
||||
PresetGroup,
|
||||
} from "./onboarding-primitives";
|
||||
|
||||
const ENTREP_TOTAL = 3;
|
||||
const ENTREP_STEP_NAMES = ["Idea", "Audience", "Look"];
|
||||
const ENTREP_STEP_NAMES = ["Idea", "Status", "Look"];
|
||||
|
||||
const IDEA_PROMPTS = [
|
||||
"A community for indie game devs to swap playtesters, with weekly demo nights",
|
||||
@@ -102,36 +101,43 @@ export function EntrepIdea({ value, onChange }) {
|
||||
);
|
||||
}
|
||||
|
||||
const AUDIENCE_PRESETS = [
|
||||
"Me and people like me",
|
||||
"A small community I'm part of",
|
||||
"Local people in my city",
|
||||
"Anyone searching for this",
|
||||
"Other small businesses",
|
||||
"Hobbyists in a niche I love",
|
||||
const STATUS_OPTIONS = [
|
||||
{
|
||||
id: "scratch",
|
||||
label: "We are starting from scratch",
|
||||
desc: "No code, no wireframes, no assets. Just a clean slate and a fresh vision.",
|
||||
},
|
||||
{
|
||||
id: "research",
|
||||
label: "I've done some research I can share",
|
||||
desc: "I have PDFs, wireframes, landing copy, or user interviews to help guide the build.",
|
||||
},
|
||||
{
|
||||
id: "existing",
|
||||
label: "I've already built some of the project",
|
||||
desc: "I have an existing repo, database schema, or mockups to import.",
|
||||
},
|
||||
];
|
||||
|
||||
function EntrepAudience({ value, onChange }) {
|
||||
const isPreset = AUDIENCE_PRESETS.includes(value);
|
||||
function EntrepStatus({ value, onChange }) {
|
||||
return (
|
||||
<>
|
||||
<WizardQ
|
||||
title="Who is it for?"
|
||||
sub="The clearer your audience, the better the copy Vibn writes for it."
|
||||
title="Where are you starting from?"
|
||||
sub="Helps Vibn set up the right repository, data pipelines, and workspace scope."
|
||||
/>
|
||||
<ChipGroup
|
||||
options={AUDIENCE_PRESETS}
|
||||
values={value ? [value] : []}
|
||||
onChange={(arr) => onChange(arr[arr.length - 1] || "")}
|
||||
<PresetGroup
|
||||
options={STATUS_OPTIONS.map((o) => ({
|
||||
id: o.id,
|
||||
label: o.label,
|
||||
desc: o.desc,
|
||||
icon: undefined,
|
||||
}))}
|
||||
value={value}
|
||||
onChange={onChange}
|
||||
columns={3}
|
||||
minimal={false}
|
||||
/>
|
||||
<Field label="Or describe them in your own words" optional>
|
||||
<input
|
||||
className="wiz-input"
|
||||
placeholder="e.g. dog owners in Brooklyn who walk before work"
|
||||
value={!isPreset ? value : ""}
|
||||
onChange={(e) => onChange(e.target.value)}
|
||||
/>
|
||||
</Field>
|
||||
</>
|
||||
);
|
||||
}
|
||||
@@ -282,12 +288,12 @@ export function EntrepreneurPath({
|
||||
canNext = (data.idea || "").trim().length >= 8;
|
||||
} else if (step === 1) {
|
||||
body = (
|
||||
<EntrepAudience
|
||||
value={data.audience || ""}
|
||||
onChange={(v) => onUpdate({ audience: v })}
|
||||
<EntrepStatus
|
||||
value={data.projectStatus || ""}
|
||||
onChange={(v) => onUpdate({ projectStatus: v })}
|
||||
/>
|
||||
);
|
||||
canNext = (data.audience || "").trim().length >= 3;
|
||||
canNext = !!data.projectStatus;
|
||||
} else {
|
||||
body = (
|
||||
<EntrepVibe value={data.vibe} onChange={(v) => onUpdate({ vibe: v })} />
|
||||
|
||||
Reference in New Issue
Block a user