diff --git a/.firebase/hosting.Lm5leHQvc3RhdGlj.cache b/.firebase/hosting.Lm5leHQvc3RhdGlj.cache deleted file mode 100644 index 2c8b0813..00000000 --- a/.firebase/hosting.Lm5leHQvc3RhdGlj.cache +++ /dev/null @@ -1,86 +0,0 @@ -media/8a480f0b521d4e75-s.8e0177b5.woff2,1764292945234,cccaf7bf72117d313a9afc3a475289a19b9fcd0f735c9b2e4ded6cba08a517a0 -media/7178b3e590c64307-s.b97b3418.woff2,1764292945325,2b719e95831c9d92a31ebbe512bbd87cc76501765edb9b6ca4734cc5a2becb94 -media/4fa387ec64143e14-s.c1fdd6c2.woff2,1764292945447,7cdf2599fa32a0a3edc7d4126b5c8f5233d62799ddb46552ca6890389ba7d9c1 -debHSXN92soAOPU1HZgYF/_ssgManifest.js,1764292948075,02dbc1aeab6ef0a6ff2ff9a1643158cf9bb38929945eaa343a3627dee9ba6778 -debHSXN92soAOPU1HZgYF/_clientMiddlewareManifest.json,1764292945829,6731668a37f6a3ed10d77860e21c7ba693c377a061571ffa58564d1d699c1798 -debHSXN92soAOPU1HZgYF/_buildManifest.js,1764292945829,615bff88115b95e28f767491701e61ecffa7e94106127d229aa17a5905c320ed -chunks/f9cb1844dfa45255.js,1764292945340,01c00f2411e0e3e097e7018d72b70b2b51875d8d225caaf29640ce25a2a544f6 -chunks/f7f1f72136b370ca.js,1764292945327,01a104bc08fcc0604c0ec1a806fca89dcf30e910b371b53deef33ca6265eecde -chunks/ebe72e5be9ee5ad9.js,1764292945628,daae931739a356f539b4ad0ca419f1eb5b4bb3778cbb61dd7caf61a1d9865f2a -chunks/f5e1eb514e39cc88.js,1764292944956,e4565dc0670c37ec0f447d2b5b70d452743abe10a95fed3845c1cce4abb48b4c -chunks/f2800e0af697fdd0.js,1764292945328,6ce375e87966595708eadaf758ada294509c58dfac5ed8c59f70f616721c00c3 -chunks/e4262adb08a1c2bf.js,1764292945289,d4460e79d3dc59fc127276a44923f64f9a58a4265dabfec5271f2558d9fd2bc6 -chunks/turbopack-9ca93d673567d695.js,1764292945039,8192a0d1a0740e6d887b97a7403a2a7f247ef214e8920cab730ff87fed58437b -chunks/ddebd270303d8e52.js,1764292945615,8c3623313303c5d58f40c3d5a8507a7f26b878129e1a322a4c49cc1abeb27a22 -chunks/e3204003115c48b3.js,1764292945452,4f1d81d5502dc30584b94916d1192cca4ad31abc0c9ec90a41b8a086d2ad36d8 -chunks/f44a1b0e13fe130e.js,1764292945521,bab4ad594f82e40e230885b71ad2e66bbdcc9adf0a06e5dabbb9881b3f090bfd -chunks/d8fb8fcccb9ed575.js,1764292945641,88dc104238c97d623ed03c0457896bf0e5576f0e555b0521429514968254db72 -chunks/d53fe979bca22d91.js,1764292945292,7e0b70993217191be5b9c1cbcb8eae8e93f77d2ffc8b8c47260dddf45531b0bf -chunks/e9d7f43cc4a2ffde.js,1764292944977,f3b75db76ea5f0e0897a6643c7eac52ef942c66e06c9e923d8adf0842b6102df -chunks/c8f249a29afd3371.js,1764292945174,cf90afbb172a0e61b4bb1eba8b903cdf008a5b5dcbb22fbeaad4bdf99a1aa1a7 -chunks/d37715a4848800df.js,1764292945614,3c838423e38372ac0fbf00a2d2a665bd128b7b3bb282fcc3faddbf119821529c -chunks/cc3b7acd0b8a8ed0.js,1764292945378,63c43444cf37250c0265200f90da944fe7cb30cbf4712ca78320313cc28ae2c0 -chunks/e930ad9e05eaf62d.js,1764292944935,59ebe62acad73a7571001179dfdb02a87205e2b822ca22262e97b8a6582fe5cb -media/favicon.0b3bf435.ico,1764292945309,04614fc32690cb60b39e472119b7f7aa91d88eaeb8511a7489f8cbe1552e6e59 -chunks/b7d3d522b141a153.js,1764292945341,2f7e530895f432df1e996fe86ed3299a10f7ba8585e1b0d9d206f93cc228bb18 -chunks/b2d11888d122e656.js,1764292945620,f318502788773401c1f1f95699d1d3b62a6e021a53f7e2bff8fdd9a2c6cee3b7 -chunks/b297c493e9d2a547.js,1764292945333,562b883b63a596c2de501948be11263522bf0ba4c16cf2e779c6cd74cad7dcf9 -chunks/b678db9b7a6233a6.js,1764292945451,5930f7e3b147761c765cf03570bf989a4376adc16294f8e7f63041b910145c21 -chunks/aee0a3aab75c6656.js,1764292945645,74ef1a854f40fccfc42849f0eff252e9a9a099dac0fb4afa98b17e3aa773d361 -chunks/a65fa752112154b2.js,1764292945316,695a77ee322b9e0e9597b24b6efd71d653f3651aa579b479f73bf36b93c4211d -chunks/9c2f2a94801db6cd.js,1764292945267,6bde7c92d8ae55b0bdb2f9cc508671a69314ff01c824d16ffae15b41203123a3 -chunks/8f12ba4a400d0818.js,1764292945640,9d69d3faa9752f8dcc197c2e62ea5c9a843e2431de85570ec152260f0606a64e -chunks/9d593509176d2bdc.js,1764292945182,58f2e77ebd69f17e0e850f3dff502266bac2f51f6a66e067459ee2344c4c1823 -chunks/8f647170168e8688.js,1764292945436,6d91c1f674b325e03565f00bb0ee8f017c247a836b170067b7271c4184a76368 -chunks/8269db69d7104eaf.js,1764292945289,46b9e7e465ed39ef4b9030e292173ca01e4141f67d7290d9a8df5cb8cfdb94a4 -chunks/a3751053cf95bf66.js,1764292944936,a1864f7575f28ae1495943736f439149ff7ca641c48f352a27b8241e1c5b1895 -chunks/7f6ce89234677f07.js,1764292945596,d028183aa6747e759e6e2e2f94012efeb3c01edd9eab81cffa463ca884daa9fb -chunks/7a5de61b06aada33.js,1764292945448,4de9756e37dc8195f5d3ab68b7d70a1228b3ef0c14fa376f7d4a41bdfdde1a4b -chunks/7e6878fd487d3e54.js,1764292945013,f13804b8190486b356af32ba87000b503316d82c8dce6a5bca9e65e39189605d -chunks/b72884fc3dd51b08.js,1764292944972,83adbd329c23f79df34e0bd3d9d52f2f8f888c6d6a3ff45698a67e90a3b1e485 -media/bbc41e54d2fcbd21-s.799d8ef8.woff2,1764292945043,396955195c54144bce504511dd89d0c74a3f6b453d73823073be1a2cbe00e6de -chunks/c4e22d55290821bf.js,1764292945037,27669ee06cf5e963c5a0e12977384e4c2894b9befa9bc0d13ccc4ecc3dc2d43b -media/caa3a2e1cccd8315-s.p.853070df.woff2,1764292945300,d38dd3d36107934ef290b2449c29728caa7bcceeb4750b0a2bec2042fac4c601 -media/797e433ab948586e-s.p.dbea232f.woff2,1764292945245,d4a2afa79a272709433753cffe4f64c13e37ae2fdfa1ded22b38c83f978b78a4 -chunks/8decf5edbe5dd12a.js,1764292945026,a9150cd9cf27455e4190ae18a8db7fca07bc34a3a8b689d1d5cb3524b13c0880 -chunks/ef5b2d67ab809f64.css,1764292945059,90165d549a46ffb7036763cb03adfd897952fc93c25201d746605436ef5ea46b -chunks/d0f2cbc50b9d061e.js,1764292945736,3c74944275ad985170b8011410d2a5ccc6c6026cf0d4c96951b128dfb8661833 -chunks/767a4a5f6aabf6e2.js,1764292945172,bbbb2624994ac119eb5bc7a692eb7b97d3ffba0d4d8160a406aee89a81c212a8 -chunks/74c6d21fb44e33e9.js,1764292945162,7a886154420672f0f8395bdf535bd17f52063a455ede9987e3b6ea7d5bc91479 -chunks/78680bef0dd9c8e5.js,1764292945077,ec8a5a1356c00f3dbb68f2a7655a6e7ba711212a4f5ced7994a82331eb94c32a -chunks/67c396666365a0f8.js,1764292945315,63772f51138d6a11e29d5f270f1c2c7de60f1cb1218c0d5a51488272d01f265e -chunks/6c4b3aa006ad826c.js,1764292945616,523294bac6d6a537fc1dbfe5287ae46897908edc7e56b0fbac214b9ac3d4d6cc -chunks/6eca49992d798c82.js,1764292944887,12d6b568615b35975b20c73435dcdc7c11a27c92ca224cae23ddd1d5461c3544 -chunks/74e1fd68a7e0896e.js,1764292944962,05e56d1e6e1fca0c5ed8e0957cf019f861c764e7221f33d0ef52116238f814bc -chunks/5e558e7e27d2aa84.js,1764292945458,5f105cc0e1577cc8ebb66e71f6c5b8e564dd34db3a3542ada5f302e8a23e3b58 -chunks/58f8c6398723d54a.js,1764292945344,8673d8f45265a904abbae8551f71c5a5521c0725b93da73661b93af6a6583991 -chunks/5d0b6a3739039b40.js,1764292944980,bd68dfe5373212a24cb45220c93568159d5341b3198997a613fb6fd193880f98 -chunks/5db6f063644758f9.js,1764292944959,c80f1a857f8d76e5634e745e8bd7d8994e78eb33961668431cb366851cb16d5e -chunks/523ae041bd709184.js,1764292945042,ef06a0e01cf2cc8cf4883811ef022a392f335d1d38e9a989cf62bae079deea60 -chunks/424c4036add0df26.js,1764292945340,b3e7b7f805682f0b0436474ecded19ccce5b30dcb76a8495d8bee88eede11be0 -chunks/3d3465d604d848a9.js,1764292945339,92abaf6ffd0e336dee0fdfcf6fb6243aac311a212e834594b3e7de146e5d3f6e -chunks/334c0b45eeee04d3.js,1764292945574,874d6b35af5399e08a2cb7cc1b45cec6a7929205ae6371ef800dd924c20bc293 -chunks/3cf25d104286385c.js,1764292944988,7529dca0fda4234018cdbe2a24db01affdbf5bbe7ca6f97da46d3c1fa97ea8d4 -chunks/3e4ff1ad25a3aee4.js,1764292945339,234650a4582a73748c2f6e6d0ddc8a9aa3eb664cae80464126a35aa95f295615 -chunks/2fd974473265b3b8.js,1764292945207,fc5a8fab93123a055f6f1ca470cbb2ef213e4f075658f13038f265533887cdb8 -chunks/36fc507596e706a4.js,1764292944943,0f382cd8c81102e98bd414ca12d0e1951449a8dcaf734435e973e4e030b6a920 -chunks/211e6519dff5166f.js,1764292945000,388888d4e8a2df019664930f161a592dd7c676134ae9a2760abab30f10a1c12c -chunks/1f21d91f935fa2f4.js,1764292945414,3bcfd338aac600b69f6c50d060739432e3c8de64fb22ef7db4e2fbc88d35199f -chunks/483a049d7197220c.js,1764292944995,8f6f500d3b55f867e389a55ffc2a5808a01f75422e2bae4bc07e231d9f70d6f5 -chunks/1f6d845154a92f55.js,1764292945060,b9ac0f84700799143de73d09457b4973bb43f4ee0bf57ff742ef83491eef2aa5 -chunks/1f3d32af4b7e9fce.js,1764292944988,b589322566402033b3b58dd2ddba216b1819f82a8643a08877c4402c89de8cb7 -chunks/1ad9158bace97ad1.js,1764292945642,9ea54650308e293190ed8a7d7ef942e1029cc2cda2d2b03c1759fcd9b175c4e4 -chunks/0924dac1a36a5d4f.js,1764292945341,a823c1c585aea754343d4947d1c35350eec6544b9772486515756ec252992cb8 -chunks/22798aa879c2d479.js,1764292945062,a84d48fd0cb3fa97a0689f059806866fc2fe685e4c13b61b936bb13b7b729dc2 -chunks/01de74e34c8191ad.js,1764292945439,0f86a0b77fcffaa64a1869842351812295bca22dcdccf7a89616a0fe4a812848 -chunks/13c76ac4c576ebea.js,1764292945064,864fb695e806c8fd95eab7ff98fdf24c7fcab284d2eec9a2b030edea5ccd04a1 -chunks/a6dad97d9634a72d.js,1764292945738,bea630d9824beca22855271c757404b58bb7b410c52a5e7d58d69ff26d9ddd0b -chunks/055808b7b4395593.js,1764292945729,5a06bd47cb2c83a7b4363f3d7b02796224575ffce0dc51fb66157df312ea6239 -chunks/051191fc7c032fe7.js,1764292945459,5d675199d64b330bc32091e0d807a5d807c559ebbeb535d3b81e46d9ac0beba4 -chunks/5ba52f526366ce3d.js,1764292945252,94e2ba60b4d2d276adc47cc684fe3b41b7130b438a22f13fb03240cd3079b9c1 -chunks/0839f6c03dd07402.js,1764292945458,9b607c0411e2db92fea878d5d9450aceae119f0bb4f86eef757b7f012e353ba7 -chunks/02cfabe42ac75354.js,1764292945726,edd9cc50162ed881e6f63569e677d1f330cf09a782c74dd2af3183ac20cf23ed -chunks/770045fdeaa29947.js,1764292945315,fbff4e91fe383eb226ec79f5d7e557d3f1f798d724a8cd0da9e2606ecab997d5 -chunks/da99455a9bebb11a.js,1764292945437,96396c6b5792f967eb51bfdb0a59b2c10ef6c9cac6bab6ec346832219504f8c5 -chunks/667df385421d23bd.js,1764292945329,0f4ba7a21ad0772c31d49384e853c4f5cde23a277a76e93e14c6ffa8a4b00f1d -media/icon.69668ad2.png,1764292945757,a9312b012897c18eb945ecc474445181c063a6ff2363fefdd295bca3e7f17a70 diff --git a/.firebase/hosting.cHVibGlj.cache b/.firebase/hosting.cHVibGlj.cache deleted file mode 100644 index 40698028..00000000 --- a/.firebase/hosting.cHVibGlj.cache +++ /dev/null @@ -1,10 +0,0 @@ -window.svg,1762902124964,11deaca6eadbb148caace8a5fe4a67353112de0afc5da83005d4797e403ab4f1 -vobn-favicon.png,1763082657981,9051755f781b64be5155a8ef6b1846afae7ed12a942ce1fca217cde1fe0a4f09 -vibn-sqaure-black-logo.png,1763083818226,2cd39bf33b13110575f3a2b02b4558c5dd157d96506783526d11988a01dbe249 -vibn-logo-circle.png,1763083818571,b24c20ee6505547a3cd03a492681b281bf49c8e95eed78872e87581b5218eee2 -vibn-black-circle-logo.png,1763083818322,a9312b012897c18eb945ecc474445181c063a6ff2363fefdd295bca3e7f17a70 -vibn-2-logo.png,1763081817627,475fcbd3e4fa36dc5c63191220b5090ae90ae36d74d968240af25464829286fa -vercel.svg,1762902124964,9a61e768442ba3450026d0d69421315044931cbffaf8f6019f856ea82dd91e4e -next.svg,1762902124964,33c5c6ad1d08bb69d8026289530e377b4d6e2a96f24562e209fd1e1e9ccee64a -globe.svg,1762902124964,ffe166407c928caa4d1640e2786d3385468043b3b9e6ea2282d4a3e370b3bc23 -file.svg,1762902124964,154a8c2948836a88c695a789045bc44cc74c3d8958d5785a531d26324bc42cb1 diff --git a/.firebaserc b/.firebaserc deleted file mode 100644 index a0cc1bbc..00000000 --- a/.firebaserc +++ /dev/null @@ -1,6 +0,0 @@ -{ - "projects": { - "default": "gen-lang-client-0980079410" - } -} - diff --git a/app/(onboarding)/onboarding/onboarding-build.tsx b/app/(onboarding)/onboarding/onboarding-build.tsx new file mode 100644 index 00000000..dfba2982 --- /dev/null +++ b/app/(onboarding)/onboarding/onboarding-build.tsx @@ -0,0 +1,447 @@ +import React, { useState, useEffect, useRef, useMemo, useCallback } from "react"; +import { WizardTop, WizardBody, WizardQ, LANE_LABELS } from "./onboarding-primitives"; +// Build + Ready screens. The build screen shows the terminal stream + a live +// preview stencil; ready is a quiet confirmation page with the workspace URL. + +// ── Per-path build plans ─────────────────────────────────────────────────── +function buildPlanFor(path, data) { + const common = [ + { line: "vibn init — reading brief", ms: 600 }, + { line: "↳ provisioning workspace", ms: 700 }, + { line: "↳ wiring auth (email + Google)", ms: 800 }, + { line: "↳ minting database & seed schema", ms: 700 }, + ]; + + if (path === "entrepreneur") { + return [ + ...common, + { line: `↳ generating landing page · vibe "${data.vibe || "warm"}"`, ms: 900 }, + { line: `↳ writing copy aimed at "${(data.audience || "your audience").slice(0, 40)}"`, ms: 800 }, + { line: "↳ wiring email capture + Stripe payment link", ms: 700 }, + { line: "↳ scaffolding admin: subscribers, sales, comments", ms: 800 }, + { line: `↳ tuning launch plan for goal: ${data.goal || "first_customer"}`, ms: 700 }, + { line: "↳ publishing preview → " + workspaceUrlFor(path, data), ms: 900 }, + { line: "ready.", ms: 400, ok: true }, + ]; + } + if (path === "owner") { + return [ + ...common, + { line: `↳ modelling ${data.biz || "small business"} for "${data.bizName || "your business"}"`, ms: 800 }, + { line: `↳ importing your stack (${(data.tools || []).length} tools)`, ms: 800 }, + { line: `↳ building module: ${labelFor(data.firstThing)}`, ms: 1000 }, + { line: "↳ generating customer + job records (10 sample)", ms: 700 }, + { line: "↳ scheduling daily ops view + weekly report", ms: 700 }, + { line: `↳ wiring savings tracker · est. $${(data.spend || 0)}/mo replaced`, ms: 800 }, + { line: "↳ publishing preview → " + workspaceUrlFor(path, data), ms: 900 }, + { line: "ready.", ms: 400, ok: true }, + ]; + } + return [ + ...common, + { line: `↳ branding workspace for "${data.clientName || "client"}"`, ms: 800 }, + { line: `↳ scaffolding scope (${(data.scope || []).length} modules)`, ms: 1000 }, + ...(data.scope || []).slice(0, 4).map((s) => ({ line: ` • ${s}`, ms: 350 })), + { line: "↳ generating handoff document + invoice template", ms: 700 }, + { line: `↳ setting deploy target: ${data.handoff || "subdomain"}`, ms: 700 }, + { line: "↳ publishing preview → " + workspaceUrlFor(path, data), ms: 900 }, + { line: "ready.", ms: 400, ok: true }, + ]; +} + +function labelFor(id) { + const map = { + booking: "Bookings & scheduling", + invoicing: "Quotes & invoices", + customers: "Customer portal", + inventory: "Inventory & orders", + team: "Team & dispatch", + marketing: "Marketing site", + }; + return map[id] || "your first workflow"; +} + +function workspaceUrlFor(path, data) { + const seed = + (path === "owner" && data.bizName) || + (path === "consultant" && data.clientName) || + (path === "entrepreneur" && (data.audience || data.idea)) || + "your-workspace"; + const slug = String(seed).toLowerCase() + .replace(/[^a-z0-9\s-]/g, "") + .trim() + .split(/\s+/) + .slice(0, 3) + .join("-") + .slice(0, 28) || "your-workspace"; + return `${slug}.vibn.app`; +} + +const BUILD_BIZ_LABEL = { + service: "Trades / services", + retail: "Retail", + food: "Food & drink", + appointments: "Appointments", + events: "Events / hospitality", + other: "Small business", +}; + +// ── Build screen ─────────────────────────────────────────────────────────── +export function BuildScreen({ path, data, onBack, onClose, onOpen }) { + const plan = React.useMemo(() => buildPlanFor(path, data), [path, data]); + const [lineIdx, setLineIdx] = React.useState(0); + const [done, setDone] = React.useState(false); + const logRef = React.useRef(null); + + React.useEffect(() => { + if (lineIdx >= plan.length) { setDone(true); return undefined; } + const t = setTimeout(() => setLineIdx(lineIdx + 1), plan[lineIdx].ms); + return () => clearTimeout(t); + }, [lineIdx, plan]); + + React.useEffect(() => { + if (logRef.current) logRef.current.scrollTop = logRef.current.scrollHeight; + }, [lineIdx]); + + const url = workspaceUrlFor(path, data); + const lane = LANE_LABELS[path]; + const previewTitle = + path === "owner" ? (data.bizName || "Your business") : + path === "consultant" ? (data.clientName || "Your client") : + "Your launch page"; + const previewSub = + path === "owner" ? `${BUILD_BIZ_LABEL[data.biz] || "Small business"} · ${labelFor(data.firstThing)}` : + path === "consultant" ? (data.industry || "Project") : + (data.audience || "An idea worth building").slice(0, 64); + + const pct = done ? 1 : lineIdx / plan.length; + + return ( + <> + +
+
+ + + + +
+ {/* terminal */} +
+
+ + + + vibn build — {url} + {!done && live} +
+
+ {plan.slice(0, lineIdx + 1).map((p, i) => { + const isCurrent = i === lineIdx && !done; + const isOk = p.ok && i <= lineIdx; + const cls = isOk ? "l-ok" : isCurrent ? "l-current" : "l-done"; + return
{p.line}
; + })} + {!done &&
+
+ + {/* preview */} +
+
+ + + + + + https://{url} +
+
+
+
+ {previewTitle} +
+
+ {previewSub} +
+
+
+
+
+
+
+
+
+
+
+ +
+ + {done ? "build complete" : <>Building {Math.min(lineIdx, plan.length)}/{plan.length}} + + {done && ( + + )} +
+
+
+ + ); +} + +// ── Ready screen ─────────────────────────────────────────────────────────── +export function ReadyScreen({ path, data, onClose, onOpenChat }) { + const url = workspaceUrlFor(path, data); + const summary = summaryFor(path, data); + + return ( + <> + + +
+ + + +
+ + + +
+
+ + Workspace URL + + + {url} + +
+
+ {summary.map((row, i) => ( +
+ + {row.label} + + {row.value} +
+ ))} +
+
+ +
+ Back to home + +
+
+ + ); +} + +function summaryFor(path, data) { + if (path === "owner") { + return [ + { label: "Business", value: `${data.bizName || "Untitled"} · ${BUILD_BIZ_LABEL[data.biz] || "Small business"}` }, + { label: "Replacing", value: `${(data.tools || []).length} tools · ~$${data.spend || 0}/mo` }, + { label: "First fix", value: labelFor(data.firstThing) }, + { label: "Team", value: `${data.team || 1} · ${(data.customers || 0).toLocaleString()} cust/mo` }, + ]; + } + if (path === "consultant") { + return [ + { label: "Client", value: `${data.clientName || "Untitled"} · ${data.industry || ""}` }, + { label: "Scope", value: `${(data.scope || []).length} modules` }, + { label: "Brief", value: (data.brief || "").slice(0, 60) + ((data.brief || "").length > 60 ? "…" : "") }, + { label: "Handoff", value: data.handoff || "subdomain" }, + ]; + } + return [ + { label: "Building", value: (data.idea || "").slice(0, 64) + ((data.idea || "").length > 64 ? "…" : "") }, + { label: "Audience", value: (data.audience || "").slice(0, 64) }, + { label: "Goal", value: data.goal || "first_customer" }, + { label: "Vibe", value: data.vibe || "warm" }, + ]; +} + + diff --git a/app/(onboarding)/onboarding/onboarding-consultant.tsx b/app/(onboarding)/onboarding/onboarding-consultant.tsx new file mode 100644 index 00000000..43546f71 --- /dev/null +++ b/app/(onboarding)/onboarding/onboarding-consultant.tsx @@ -0,0 +1,296 @@ +import React, { useState, useEffect, useRef, useMemo, useCallback } from "react"; +import { WizardTop, WizardBody, WizardQ, WizardFooter, Label, LANE_LABELS, PresetGroup, Field } from "./onboarding-primitives"; +// Consultant path — 4 steps for freelancers building for a client. + +const CONS_TOTAL = 4; +const CONS_STEP_NAMES = ["Client", "Brief", "Scope", "Handoff"]; + +export function ConsClient({ clientName, industry, contact, onChange }) { + return ( + <> + + + onChange({ clientName: e.target.value })} + autoFocus + /> + + + onChange({ industry: e.target.value })} + /> + + + onChange({ contact: e.target.value })} + /> + + + ); +} + +const BRIEF_TEMPLATES = [ + { id: "quote_tool", label: "Quote tool", + body: "Customers request a quote with a few photos and a project description. The team reviews, sends a polished PDF, customer signs and pays a deposit online." }, + { id: "booking", label: "Booking system", + body: "Customers see real availability, book a service window, and get reminders. The team has a daily view of jobs with addresses and contact info." }, + { id: "portal", label: "Customer portal", + body: "Logged-in customers see past jobs, invoices, documents, and can message the business. The business sees a single page per customer." }, + { id: "internal", label: "Internal ops", + body: "Replace the spreadsheets the team is currently using. CRUD on jobs/customers, simple reports, role-based access, export to accounting." }, +]; + +function ConsBrief({ brief, onChange }) { + return ( + <> + + +
+ {BRIEF_TEMPLATES.map((t) => ( + + ))} +
+
+ +