- {g.items.map((it) => {
- const active = scope.includes(it);
+
+ {g.items.map((item) => {
+ const active = scope.includes(item);
return (
);
})}
@@ -258,95 +220,45 @@ function ConsScope({ scope, onChange }) {
);
}
+const DEPLOYS = [
+ {
+ id: "subdomain",
+ icon: "π",
+ label: "A free Vibn subdomain",
+ desc: "Deploy immediately to client-name.vibn.app. Fully secured with SSL.",
+ },
+ {
+ id: "custom",
+ icon: "π",
+ label: "Deploy to a custom domain",
+ desc: "CNAME to our proxy. SSL certificates provision automatically on DNS point.",
+ },
+ {
+ id: "handover",
+ icon: "π¦",
+ label: "Handover Gitea repo",
+ desc: "We push to their Gitea/GitHub. They own their container fleet outright.",
+ },
+];
+
function ConsHandoff({ data, onChange }) {
return (
<>
+
({
+ id: d.id,
+ label: d.label,
+ desc: d.desc,
+ icon: {d.icon},
+ }))}
+ value={data.handoff}
+ onChange={(v) => onChange({ handoff: v })}
+ columns={1}
/>
-
- onChange({ brand: e.target.value })}
- />
-
-
- onChange({ handoff: v })}
- columns={1}
- />
-
-
-
-
- $
-
- onChange({ rate: e.target.value })}
- style={{ paddingLeft: 26, paddingRight: 58 }}
- />
-
- / hour
-
-
-
>
);
}
@@ -372,26 +284,14 @@ export function ConsultantPath({
let body, canNext;
if (step === 0) {
- body = (
-
- );
- canNext =
- (data.clientName || "").trim().length >= 2 &&
- (data.industry || "").trim().length >= 3;
- } else if (step === 1) {
body = (
onUpdate({ brief: v })}
/>
);
- canNext = (data.brief || "").trim().length >= 30;
- } else if (step === 2) {
+ canNext = (data.brief || "").trim().length >= 8;
+ } else if (step === 1) {
body = (
-
+
{body}