From 2b3aed7f279137b1c177b5ec8f6a8135243b9d62 Mon Sep 17 00:00:00 2001 From: mawkone Date: Mon, 8 Jun 2026 12:13:50 -0700 Subject: [PATCH] design: strip down onboarding path to 3 high-speed steps (Idea, Audience, Look) --- .../_onboarding/onboarding-entrepreneur.tsx | 2314 +---------------- 1 file changed, 40 insertions(+), 2274 deletions(-) diff --git a/vibn-frontend/_onboarding/onboarding-entrepreneur.tsx b/vibn-frontend/_onboarding/onboarding-entrepreneur.tsx index 90f717b..ed454c8 100644 --- a/vibn-frontend/_onboarding/onboarding-entrepreneur.tsx +++ b/vibn-frontend/_onboarding/onboarding-entrepreneur.tsx @@ -1,10 +1,4 @@ -import React, { - useState, - useEffect, - useRef, - useMemo, - useCallback, -} from "react"; +import React, { useState } from "react"; import { WizardTop, WizardBody, @@ -12,13 +6,11 @@ import { WizardFooter, LANE_LABELS, ChipGroup, - PresetGroup, Field, } from "./onboarding-primitives"; -// Entrepreneur path — 4 steps. Each step is a focused question. -const ENTREP_TOTAL = 4; -const ENTREP_STEP_NAMES = ["Type", "Style", "Idea", "Look"]; +const ENTREP_TOTAL = 3; +const ENTREP_STEP_NAMES = ["Idea", "Audience", "Look"]; const IDEA_PROMPTS = [ "A community for indie game devs to swap playtesters, with weekly demo nights", @@ -29,9 +21,9 @@ const IDEA_PROMPTS = [ ]; export function EntrepIdea({ value, onChange }) { - const [phIdx, setPhIdx] = React.useState(0); - const [phChars, setPhChars] = React.useState(0); - const [deleting, setDeleting] = React.useState(false); + const [phIdx, setPhIdx] = useState(0); + const [phChars, setPhChars] = useState(0); + const [deleting, setDeleting] = useState(false); React.useEffect(() => { if (value.length > 0) return undefined; @@ -110,2251 +102,36 @@ export function EntrepIdea({ value, onChange }) { ); } -const ARCHETYPES = [ - { - id: "saas", - label: "Web App / SaaS", - desc: "Dashboards, tools, interactive portals", - }, - { - id: "marketplace", - label: "Marketplace", - desc: "Directories, bookings, listings", - }, - { - id: "marketing", - label: "Marketing Site", - desc: "Portfolios, lead capture, landing pages", - }, - { - id: "ecommerce", - label: "Online Store", - desc: "Carts, checkouts, selling physical/digital goods", - }, - { - id: "mobile", - label: "Mobile App", - desc: "iOS and Android mobile applications", - }, - { - id: "blog", - label: "Blog / Publication", - desc: "Newsletters, articles, content hubs", - }, - { - id: "not_sure", - label: "I'm not sure", - desc: "Let Vibn help you decide based on your description", - fullWidth: true, - }, +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", ]; -function EntrepType({ value, onChange }) { +function EntrepAudience({ value, onChange }) { + const isPreset = AUDIENCE_PRESETS.includes(value); return ( <> - ({ - id: a.id, - label: a.label, - desc: a.desc, - icon: undefined, - fullWidth: a.fullWidth, - }))} - value={value} - onChange={onChange} - columns={2} + onChange(arr[arr.length - 1] || "")} /> - - ); -} - -function LayoutPreview({ styleId }: { styleId: string }) { - // Ultra-high-fidelity CSS-rendered miniatures representing your actual page-dashboard.jsx designs! - const isDark = - styleId === "sidebar_dark" || - styleId === "topbar_dark" || - styleId === "rail"; - const accentColor = "var(--accent)"; - - // Theme palettes from page-dashboard.jsx - const c = isDark - ? { - bg: "#0e0f12", - panel: "#16171d", - border: "rgba(255,255,255,0.06)", - text: "#f5f4f2", - subtext: "#a09fa6", - muted: "#686972", - accent: "var(--accent)", - up: "#22c55e", - down: "#ff4d5e", - } - : { - bg: "#fafaf9", - panel: "#ffffff", - border: "#ebebe6", - text: "#1a1a1a", - subtext: "#5a5a5e", - muted: "#a09a90", - accent: "var(--accent)", - up: "#2e7d32", - down: "#d32f2f", - }; - - const wireLine = (w: string | number, opacity = 0.25) => ( -
- ); - - // High-fidelity Avatars matching your screenshots (MR, TR, DP, SK) - const MiniAvatar = ({ - text: label, - color, - }: { - text: string; - color: string; - }) => ( -
- {label} -
- ); - - // Common high-fidelity dashboard body matching page-dashboard.jsx - const renderDashboardMockup = () => ( -
- {/* Header */} -
-
- - Workspace dashboard - - - Good afternoon, Mira - - - 3 deals moved stage today · 12 unread in Inbox · 1 task overdue - -
-
-
-
-
-
-
-
-
- - {/* KPI Strip */} -
- {[ - { l: "Revenue · MTD", v: "€286,420", d: "+18.4%", up: true }, - { l: "Active deals", v: "168", d: "+12", up: true }, - { l: "Win rate · 30d", v: "34.2%", d: "−1.1%", up: false }, - { l: "Pipeline ratio", v: "4.8×", d: "healthy", up: true }, - ].map((k, i) => ( -
-
- - {k.l} - - - {k.d} - -
-
- {k.v} -
- - - -
- ))} -
- - {/* Main Grid: charts, activity and leaderboards */} -
- {/* Left column: Daily Revenue Chart + Recent Activity */} -
- {/* Revenue Daily Chart */} -
- - Revenue, daily - -
- {[10, 16, 22, 18, 25, 8, 6, 14, 20, 26, 22, 28, 12, 10].map( - (h, idx) => ( -
- ), - )} -
-
- - {/* Recent Activity Card */} -
- - Recent activity - -
- {[ - { - av: "MR", - col: "#d4b8a8", - name: "Mira Reyes", - action: "moved Q3 to ", - highlight: "Negotiation", - hlCol: c.accent, - }, - { - av: "TR", - col: "#c2d3a8", - name: "Theo Roux", - action: "logged call with ", - highlight: "Sun Kim", - hlCol: c.text, - }, - { - av: "DP", - col: "#b8d4e8", - name: "Devi Patel", - action: "closed ", - highlight: "Halcyon", - hlCol: c.text, - }, - ].map((act, i) => ( -
- -
-
- {act.name} -
-
- {act.action} - - {act.highlight} - -
-
-
- ))} -
-
-
- - {/* Right column: Pipeline Funnel + Team leaderboard */} -
- {/* Pipeline Funnel */} -
- - Pipeline funnel - -
- {[ - { s: "New", w: "100%", col: "#5e5cff" }, - { s: "Qual", w: "80%", col: "#6d5cff" }, - { s: "Prop", w: "60%", col: "#7c5cff" }, - { s: "Nego", w: "40%", col: "#8c5cff" }, - { s: "Won", w: "20%", col: "#22c55e" }, - ].map((f, i) => ( -
- - {f.s} - -
-
-
-
- ))} -
-
- - {/* Team Leaders Card */} -
- - Team · this month - -
- {[ - { av: "MR", col: "#d4b8a8", name: "Mira Reyes", val: "€124k" }, - { av: "DP", col: "#b8d4e8", name: "Devi Patel", val: "€86k" }, - { av: "TR", col: "#c2d3a8", name: "Theo Roux", val: "€62k" }, - ].map((team, i) => ( -
- -
-
- - {team.name} - - - {team.val} - -
-
-
-
-
-
- ))} -
-
-
-
-
- ); - - let content; - if (styleId === "sidebar_light") { - // Left-side menu column + main dashboard area — Light/Minimal CRM theme (Screen 3) - content = ( -
- {/* Sidebar */} -
- {/* Logo / Workspace Selector */} -
-
-
- - Lattice Studio - - - Free · 4 members - -
-
- {/* Mini Search box */} -
- {wireLine(16, 0.15)} -
- {/* Menu Sections (VIEWS, TOOLS, ADMIN) */} -
- {/* Standard Links */} -
-
-
- {wireLine(12, 0.55)} -
-
- {wireLine(14, 0.35)} -
-
- {wireLine(16, 0.35)} -
-
- - {/* Views */} -
- - VIEWS - - {["Companies", "People", "Opportunities"].map((v) => ( -
- {wireLine(24, 0.35)} -
- ))} -
- - {/* Tools */} -
- - TOOLS - - {["Insights", "Automations", "Docs"].map((v) => ( -
- {wireLine(20, 0.35)} -
- ))} -
-
-
- {/* Main Dashboard (Light) */} - {renderDashboardMockup()} -
- ); - } else if (styleId === "sidebar_dark") { - // Left-side menu column + main dashboard area — Full Dark theme (Screen 3 Dark) - content = ( -
- {/* Sidebar */} -
- {/* Logo / Workspace Selector */} -
-
-
- - Lattice Studio - - - Free · 4 members - -
-
- {/* Mini Search box */} -
- {wireLine(16, 0.15)} -
- {/* Menu Sections (VIEWS, TOOLS, ADMIN) */} -
- {/* Standard Links */} -
-
-
- {wireLine(12, 0.55)} -
-
- {wireLine(14, 0.35)} -
-
- {wireLine(16, 0.35)} -
-
- - {/* Views */} -
- - VIEWS - - {["Companies", "People", "Opportunities"].map((v) => ( -
- {wireLine(24, 0.35)} -
- ))} -
- - {/* Tools */} -
- - TOOLS - - {["Insights", "Automations", "Docs"].map((v) => ( -
- {wireLine(20, 0.35)} -
- ))} -
-
-
- {/* Main Dashboard (Dark) */} - {renderDashboardMockup()} -
- ); - } else if (styleId === "topbar_light") { - // Top Horizontal Dark Header Bar + Light Dashboard (Screen 2) - content = ( -
- {/* Top Dark Header */} -
-
-
- - Lattice - - - / - -
-
- - mira-reyes - -
- - / - - - dashboard - -
- {/* Miniature ⌘K Bar */} -
-
-
-
-
- - {/* Page tabs secondary bar */} -
- {["Overview", "Reports", "Goals", "Anomalies", "Custom"].map( - (tab, idx) => ( - - {tab} - - ), - )} -
- - {/* Light Dashboard below */} - {renderDashboardMockup()} -
- ); - } else if (styleId === "topbar_dark") { - // Top Horizontal Dark Header Bar + Dark Dashboard (Screen 2 Dark) - content = ( -
- {/* Top Dark Header */} -
-
-
- - Lattice - - - / - -
-
- - mira-reyes - -
- - / - - - dashboard - -
- {/* Miniature ⌘K Bar */} -
-
-
-
-
- - {/* Page tabs secondary bar */} -
- {["Overview", "Reports", "Goals", "Anomalies", "Custom"].map( - (tab, idx) => ( - - {tab} - - ), - )} -
- - {/* Dark Dashboard below */} - {renderDashboardMockup()} -
- ); - } else if (styleId === "rail") { - // Icon rail + secondary vertical list panel — Complete Dark-mode Dashboard (Screen 1) - content = ( -
- {/* Far-left Icon Rail (Black) */} -
-
- {[1, 2, 3, 4].map((i) => ( -
- ))} -
- {/* Secondary List Panel (Dark) */} -
- {/* Group Header */} -
- - MY DASHBOARDS - -
- {/* Active lists */} -
- {[ - { n: "Workspace overview", s: "default", active: true }, - { n: "Revenue · weekly", s: "shared by Theo" }, - { n: "Pipeline health", s: "auto-refresh" }, - { n: "Team performance", s: "private" }, - ].map((dash, idx) => ( -
- - {dash.n} - - {dash.s} -
- ))} -
-
- {/* Main Content Area (Dark) */} - {renderDashboardMockup()} -
- ); - } else if (styleId === "flux") { - // Icon rail + secondary vertical list panel — Complete Dark-mode Dashboard (Screen 1) - content = ( -
- {/* Far-left Icon Rail (Black) */} -
-
- {[1, 2, 3, 4].map((i) => ( -
- ))} -
- {/* Secondary List Panel (Dark) */} -
-
- {wireLine(28, 0.45)} -
-
- {wireLine(36, 0.35)} - {wireLine(24, 0.2)} - {wireLine(32, 0.2)} - {wireLine(28, 0.2)} -
- {/* Main Content Area (Dark) */} -
-
- {wireLine(36, 0.65)} -
-
- {/* 4 Mini Cards Grid (Dark) */} -
- {[1, 2, 3, 4].map((i) => ( -
- {wireLine("50%", 0.35)} -
-
- ))} -
- {/* Charts Row (Dark) */} -
-
-
- {[6, 12, 10, 16, 20, 14, 8].map((h, idx) => ( -
- ))} -
-
-
- {wireLine("70%", 0.45)} - {wireLine("100%", 0.2)} -
-
-
-
- ); - } else if (styleId === "flux") { - // Top horizontal header bar + multi-column page - content = ( -
- {/* Topbar */} -
-
-
- {wireLine(12, 0.3)} - {wireLine(12, 0.3)} -
- {/* Miniature ⌘K Bar */} -
- {wireLine(8, 0.15)} -
-
-
- {/* Main Grid */} -
- {[1, 2, 3].map((i) => ( -
- {wireLine("50%", 0.3)} - {wireLine("100%", 0.15)} -
- ))} -
-
- ); - } else if (styleId === "rail") { - // Icon rail + secondary vertical list panel — Dark CRM/SaaS theme - content = ( -
- {/* Far-left Icon Rail */} -
-
- {[1, 2, 3].map((i) => ( -
- ))} -
- {/* Secondary Vertical List Panel */} -
- {wireLine(36, 0.4)} -
- {wireLine(28, 0.25)} - {wireLine(32, 0.15)} - {wireLine(24, 0.25)} - {wireLine(28, 0.15)} -
- {/* Main Content Area */} -
- {wireLine(36, 0.45)} -
-
-
-
- {wireLine("40%", 0.3)} - {wireLine("20%", 0.15)} -
-
- {wireLine("100%", 0.15)} -
-
-
- ); - } else if (styleId === "flux") { - // Glass aurora: purple background with a floating card - content = ( -
- {/* Aurora Glow */} -
+ onChange(e.target.value)} /> - {/* Frosted Card */} -
-
-
- {wireLine(18, 0.5)} -
- {wireLine("80%", 0.3)} - {wireLine("40%", 0.15)} -
-
- ); - } else if (styleId === "minimal") { - // Classic Minimal: parchment background, gridded rule lines - content = ( -
-
- {wireLine(24, 0.6)} - {wireLine(12, 0.4)} -
-
-
- {wireLine("90%", 0.5)} - {wireLine("50%", 0.25)} -
-
- {wireLine("100%", 0.5)} - {wireLine("70%", 0.25)} -
-
-
- ); - } else if (styleId === "bento") { - // Dark bento grid - content = ( -
-
- {wireLine("50%", 0.4)} -
-
-
-
-
- {wireLine("80%", 0.3)} - {wireLine("40%", 0.15)} -
-
- {wireLine("100%", 0.3)} -
-
- ); - } else if (styleId === "swiss") { - // Editorial swiss: White background, bold geometric layouts - content = ( -
-
- - VIBN. - - {wireLine(16, 0.6)} -
-
-
-
-
-
-
-
- {wireLine("100%", 0.4)} - {wireLine("100%", 0.4)} - {wireLine("60%", 0.2)} -
-
-
- ); - } else if (styleId === "brutalist") { - // Neo-brutalist yellow card, thick borders, heavy offsets - content = ( -
-
-
-
-
- {wireLine(24, 0.85)} -
- {wireLine("60%", 0.6)} -
-
- ); - } else { - // I'm not sure / Undecided - content = ( -
- - - - - - Automatic - -
- ); - } - - return ( -
- {content} -
- ); -} - -interface StyleOption { - id: string; - label: string; - desc: string; - illustration: React.ReactNode; - fullWidth?: boolean; -} - -const SAAS_STYLES: StyleOption[] = [ - { - id: "sidebar_light", - label: "Vertical Sidebar — Light", - desc: "Clean light sidebar + light dashboard layouts.", - illustration: , - }, - { - id: "sidebar_dark", - label: "Vertical Sidebar — Dark", - desc: "Full dark sidebar + dark dashboard layouts.", - illustration: , - }, - { - id: "topbar_light", - label: "Top Horizontal — Light", - desc: "Sleek dark topbar + light dashboard layouts.", - illustration: , - }, - { - id: "topbar_dark", - label: "Top Horizontal — Dark", - desc: "Full dark topbar + dark dashboard layouts.", - illustration: , - }, - { - id: "not_sure", - label: "I'm not sure", - desc: "Let Vibn help you decide based on your description", - fullWidth: true, - illustration: , - }, -]; - -const MARKETPLACE_STYLES: StyleOption[] = [ - { - id: "flux", - label: "Dark Glass / Flux", - desc: "Modern dark-glass panels with glowing fuchsia aurora backdrops.", - illustration: , - }, - { - id: "minimal", - label: "Classic Minimal", - desc: "Warm parchment neutrals, high-contrast typography and clean grids.", - illustration: , - }, -]; - -const GENERAL_STYLES: StyleOption[] = [ - { - id: "bento", - label: "Dark Bento", - desc: "Modern dark UI, bento-box card clusters.", - illustration: , - }, - { - id: "swiss", - label: "Editorial Swiss", - desc: "Type-led, gridded, lots of white space — clean and academic.", - illustration: , - }, - { - id: "brutalist", - label: "Neo-Brutalist", - desc: "Bold offsets, thick hand-drawn borders, highly tactile and organic.", - illustration: , - }, -]; - -function EntrepStyle({ productType, value, onChange }) { - // Dynamically tailor the styles array based on what they picked on Page 2 - const isSaas = productType === "saas"; - const isMarketplace = productType === "marketplace"; - - const styles = isSaas - ? SAAS_STYLES - : isMarketplace - ? MARKETPLACE_STYLES - : GENERAL_STYLES; - - return ( - <> - - ({ - id: s.id, - label: s.label, - desc: s.desc, - icon: undefined, - illustration: s.illustration, - fullWidth: s.fullWidth, - }))} - value={value} - onChange={onChange} - columns={2} - minimal - /> + ); } @@ -2496,23 +273,6 @@ export function EntrepreneurPath({ canNext, onSkip = null; if (step === 0) { - body = ( - onUpdate({ productType: v })} - /> - ); - canNext = !!data.productType; - } else if (step === 1) { - body = ( - onUpdate({ designStyle: v })} - /> - ); - canNext = !!data.designStyle; - } else if (step === 2) { body = ( ); canNext = (data.idea || "").trim().length >= 8; + } else if (step === 1) { + body = ( + onUpdate({ audience: v })} + /> + ); + canNext = (data.audience || "").trim().length >= 3; } else { body = ( onUpdate({ vibe: v })} /> @@ -2531,7 +299,7 @@ export function EntrepreneurPath({ }; } - // 5 total: fork(1) + 4 path steps + // 4 total: fork(1) + 3 path steps return ( <> - + {body}