/* Multi-step partner application — BioReveal-style. * 5 steps: archetype → business → motivation → contact → confirm. * No real backend; submission stays client-side and shows a confirmation * with a Calendly stub for discovery call booking. */ const ARCHETYPES = [ { slug: "hair-salons", label: "Hair Salon", icon: "✂" }, { slug: "yoga-studios", label: "Yoga / Pilates", icon: "❀" }, { slug: "chiropractors", label: "Chiropractor", icon: "✦" }, { slug: "gyms", label: "Gym / PT Studio", icon: "✷" }, { slug: "boutique-fitness", label: "Boutique Fitness Chain (HQ)", icon: "✪" }, { slug: "med-spa", label: "Med Spa / IV Bar (wholesale tier)", icon: "★" }, { slug: "other", label: "Other wellness venue", icon: "✿" }, ]; const SIZE_BUCKETS = [ "1-50 active members/clients", "51-200", "201-500", "501-1,500", "1,501-5,000", "5,000+", ]; const MOTIVATIONS = [ "Add a recurring revenue stream", "Improve member retention", "Members are already asking", "Differentiate from competitors", "Layer on existing supplement/retail line", "All of the above", ]; const ApplyPage = () => { const Header = window.Header; const Footer = window.Footer; const [step, setStep] = React.useState(0); const [data, setData] = React.useState({ archetype: "", businessName: "", yearsInBusiness: "", size: "", state: "", city: "", decisionMaker: "", role: "", motivations: [], timeline: "", name: "", email: "", phone: "", note: "", }); const [errors, setErrors] = React.useState({}); const update = (k, v) => setData((d) => ({ ...d, [k]: v })); const toggleMotivation = (m) => { setData((d) => ({ ...d, motivations: d.motivations.includes(m) ? d.motivations.filter((x) => x !== m) : [...d.motivations, m], })); }; function validate() { const e = {}; if (step === 0 && !data.archetype) e.archetype = "Pick your archetype"; if (step === 1) { if (!data.businessName.trim()) e.businessName = "Required"; if (!data.size) e.size = "Required"; if (!data.state.trim()) e.state = "Required"; } if (step === 2) { if (data.motivations.length === 0) e.motivations = "Pick at least one"; if (!data.timeline) e.timeline = "Required"; } if (step === 3) { if (!data.name.trim()) e.name = "Required"; if (!/^[^@\s]+@[^@\s]+\.[^@\s]+$/.test(data.email)) e.email = "Valid email required"; if (!data.phone.trim() || data.phone.replace(/\D/g, "").length < 10) e.phone = "10-digit phone"; } setErrors(e); return Object.keys(e).length === 0; } function next() { if (validate()) { setStep((s) => s + 1); window.scrollTo({ top: 0, behavior: "smooth" }); } } function back() { setStep((s) => Math.max(0, s - 1)); window.scrollTo({ top: 0, behavior: "smooth" }); } function submit() { if (!validate()) return; // Stub — future: POST to backend try { sessionStorage.setItem("partner_application", JSON.stringify({ ...data, ts: Date.now() })); } catch (e) {} setStep(4); window.scrollTo({ top: 0, behavior: "smooth" }); } const stepLabels = ["Archetype", "Business", "Goals", "Contact", "Booked"]; return (
{/* Progress */} {step < 4 && ( <>
★ CERTIFIED PARTNER APPLICATION

Tell us about your venue.

Five quick steps. We use this to qualify your archetype, set your per-patient fee, and prep your discovery call. No commitment — only confirmed Certified Partners proceed past the discovery call.

{stepLabels.slice(0, 4).map((label, i) => (
{i < step ? "✓" : i + 1}
{label}
))}
)} {/* STEP 0: Archetype */} {step === 0 && (
Step 1 of 4

What kind of venue do you run?

{ARCHETYPES.map((a) => ( ))}
{errors.archetype &&
{errors.archetype}
}
)} {/* STEP 1: Business */} {step === 1 && (
Step 2 of 4

Your business.

update("businessName", e.target.value)} placeholder="Aurora Yoga Studio" /> {errors.businessName &&
{errors.businessName}
}
update("yearsInBusiness", e.target.value)} placeholder="6" />
{SIZE_BUCKETS.map((s) => ( ))}
{errors.size &&
{errors.size}
}
update("state", e.target.value)} placeholder="TX" /> {errors.state &&
{errors.state}
}
update("city", e.target.value)} placeholder="Austin" />
update("decisionMaker", e.target.value)} placeholder="(or leave blank if it's you)" />
update("role", e.target.value)} placeholder="Owner / GM / VP Partnerships" />
)} {/* STEP 2: Motivation */} {step === 2 && (
Step 3 of 4

Why are you exploring this?

{MOTIVATIONS.map((m) => ( ))}
{errors.motivations &&
{errors.motivations}
}
{["This month", "30-60 days", "60-90 days", "Just exploring"].map((t) => ( ))}
{errors.timeline &&
{errors.timeline}
}
)} {/* STEP 3: Contact */} {step === 3 && (
Step 4 of 4

How do we reach you?

update("name", e.target.value)} placeholder="Your name" /> {errors.name &&
{errors.name}
}
update("email", e.target.value)} placeholder="you@business.com" /> {errors.email &&
{errors.email}
}
update("phone", e.target.value)} placeholder="555-555-5555" /> {errors.phone &&
{errors.phone}
}