// Insurance enrollment wizard // Steps: 1) Plan -> 2) Dependents -> 3) Beneficiaries -> 4) Review const STEPS = [ { id: 1, label: "Coverage", sub: "Choose plans" }, { id: 2, label: "Dependents", sub: "Add family" }, { id: 3, label: "Beneficiaries", sub: "Designate" }, { id: 4, label: "Review", sub: "Confirm & sign" }, ]; function InsurancePage({ persona }) { const [step, setStep] = React.useState(1); const [submitted, setSubmitted] = React.useState(false); // form state const [coverage, setCoverage] = React.useState({ medical: "blue-pref", dental: "delta-ppo", vision: "vsp", medicalCoverage: "self+spouse+children", }); const [dependents, setDependents] = React.useState([ { id: 1, type: "spouse", first: "Avery", last: "Park", dob: "1995-03-22", gender: "F", ssn: "•••-••-3104", relation: "Spouse", coverage: { med: true, den: true, vis: true } }, { id: 2, type: "child", first: "Mira", last: "Park", dob: "2021-09-08", gender: "F", ssn: "•••-••-7782", relation: "Daughter", coverage: { med: true, den: true, vis: false } }, { id: 3, type: "child", first: "Theo", last: "Park", dob: "2024-02-14", gender: "M", ssn: "Pending", relation: "Son", coverage: { med: true, den: false, vis: false } }, ]); const [beneficiaries, setBeneficiaries] = React.useState([ { id: 1, first: "Avery", last: "Park", relation: "Spouse", percentage: 80, type: "primary", ssn: "•••-••-3104" }, { id: 2, first: "Mira", last: "Park", relation: "Daughter", percentage: 10, type: "primary", ssn: "•••-••-7782" }, { id: 3, first: "Theo", last: "Park", relation: "Son", percentage: 10, type: "primary", ssn: "Pending" }, { id: 4, first: "Jordan", last: "Park", relation: "Sibling", percentage: 100, type: "contingent", ssn: "Not provided" }, ]); if (submitted) return { setSubmitted(false); setStep(1); }}/>; return (
Benefits enrollment

Healthcare & insurance

Convoso covers up to 88% of your premiums and offers HSA contributions on high-deductible plans. Enrollment closes Jun 11, 2026.

{step === 1 && } {step === 2 && } {step === 3 && } {step === 4 && }
Your monthly cost
${calculatePremium(coverage)}/mo
{step < 4 ? ( ) : ( )}
); } function calculatePremium(coverage) { const m = PLANS.find(p => p.id === coverage.medical)?.premium || 0; const d = DENTAL_PLANS.find(p => p.id === coverage.dental)?.premium || 0; const v = VISION_PLANS.find(p => p.id === coverage.vision)?.premium || 0; const mult = coverage.medicalCoverage === "self" ? 1 : coverage.medicalCoverage === "self+spouse" ? 2.1 : coverage.medicalCoverage === "self+children" ? 1.8 : 2.6; return Math.round((m * mult) + d + v); } function Stepper({ step }) { return (
{STEPS.map((s, i) => (
s.id ? "done" : step === s.id ? "active" : "")}>
{step > s.id ? : s.id}
{s.label}
{s.sub}
{i < STEPS.length - 1 &&
s.id ? "done" : "")}/>} ))}
); } // ──────────────── Step 1: Coverage ──────────────── function StepCoverage({ coverage, setCoverage }) { return (

Choose your medical, dental, and vision plans

Select coverage type first — your plan options and prices update accordingly.

{[ { id: "self", label: "Just me", desc: "Self only" }, { id: "self+spouse", label: "Me + spouse", desc: "2 people" }, { id: "self+children", label: "Me + children", desc: "Self + kids" }, { id: "self+spouse+children", label: "Family", desc: "Self + spouse + kids" }, ].map(opt => ( ))}

Medical

3 plans available
{PLANS.map(p => ( setCoverage(c => ({ ...c, medical: p.id }))} multiplier={ coverage.medicalCoverage === "self" ? 1 : coverage.medicalCoverage === "self+spouse" ? 2.1 : coverage.medicalCoverage === "self+children" ? 1.8 : 2.6 }/> ))}

Dental

{DENTAL_PLANS.map(p => ( setCoverage(c => ({ ...c, dental: p.id }))}/> ))}

Vision

{VISION_PLANS.map(p => ( setCoverage(c => ({ ...c, vision: p.id }))}/> ))}
); } function PlanCard({ plan, selected, onSelect, multiplier }) { const yourCost = Math.round(plan.premium * multiplier); return (
{plan.badge &&
{plan.badge}
}
{selected &&
}
{plan.type} · {plan.network}
{plan.name}
{plan.carrier}
${yourCost} /mo
Convoso pays ${Math.round(plan.employer * multiplier)}/mo
Deductible
${plan.deductible}
Out-of-pocket max
${plan.oop.toLocaleString()}
Office visit
{plan.copay ? "$" + plan.copay : "Ded then 10%"}
Specialist
{plan.specialist ? "$" + plan.specialist : "Ded then 10%"}
    {plan.perks.map((p, i) => (
  • {p}
  • ))}
); } function SmallPlanCard({ plan, selected, onSelect }) { const declined = plan.id.startsWith("decline"); return (
{selected &&
}
{plan.name}
{!declined && (
${plan.premium} /mo · Convoso adds ${plan.employer}
)}
{!declined && (
    {plan.perks.map((p, i) => (
  • {p}
  • ))}
)}
); } // ──────────────── Step 2: Dependents ──────────────── function StepDependents({ dependents, setDependents }) { const [editing, setEditing] = React.useState(null); // dep id or 'new' return (

Add your dependents

Spouse, domestic partner, and children up to age 26 are eligible. SSN is required by the IRS for tax reporting.

{dependents.map(d => ( setEditing(d.id)} onRemove={() => setDependents(ds => ds.filter(x => x.id !== d.id))} onToggle={(k) => setDependents(ds => ds.map(x => x.id === d.id ? { ...x, coverage: { ...x.coverage, [k]: !x.coverage[k] } } : x))} /> ))}
{editing && d.id === editing)} onClose={() => setEditing(null)} onSave={(data) => { if (editing === "new") { setDependents(ds => [...ds, { ...data, id: Date.now(), coverage: { med: true, den: true, vis: true } }]); } else { setDependents(ds => ds.map(x => x.id === editing ? { ...x, ...data } : x)); } setEditing(null); }} />}
); } function DependentRow({ d, onEdit, onRemove, onToggle }) { const age = (() => { const dob = new Date(d.dob); const now = new Date("2026-05-11"); return Math.floor((now - dob) / (365.25 * 24 * 60 * 60 * 1000)); })(); return (
{d.first} {d.last}
{d.relation} · age {age} · DOB {d.dob}
onToggle("med")}/> onToggle("den")}/> onToggle("vis")}/>
); } function CovToggle({ label, on, icon, color, onClick }) { const C = I[icon]; return ( ); } function DependentDialog({ dep, onClose, onSave }) { const [f, setF] = React.useState(dep || { type: "child", first: "", last: "Park", dob: "", gender: "", ssn: "", relation: "Son" }); return (
e.stopPropagation()}>

{dep ? "Edit dependent" : "Add dependent"}

setF({ ...f, first: e.target.value })} placeholder="Avery"/> setF({ ...f, last: e.target.value })}/>
setF({ ...f, dob: e.target.value })}/>
setF({ ...f, ssn: e.target.value })}/>
Why we need this
Dependent SSNs are required for IRS form 1095-C and to verify eligibility with carriers. Data is encrypted at rest.
); } function Field({ label, hint, children }) { return ( ); } // ──────────────── Step 3: Beneficiaries ──────────────── function StepBeneficiaries({ beneficiaries, setBeneficiaries }) { const primary = beneficiaries.filter(b => b.type === "primary"); const contingent = beneficiaries.filter(b => b.type === "contingent"); const primaryTotal = primary.reduce((a, b) => a + b.percentage, 0); const contingentTotal = contingent.reduce((a, b) => a + b.percentage, 0); const updatePercent = (id, val) => setBeneficiaries(bs => bs.map(b => b.id === id ? { ...b, percentage: parseInt(val) || 0 } : b)); return (

Designate your beneficiaries

For Convoso's company-paid life insurance ($300,000 coverage). Allocations must total 100% per tier.

Convoso life insurance · 1× annual salary, up to $300,000
Coverage is 100% employer-paid. You can purchase additional voluntary coverage during open enrollment.
); } function BeneficiaryGroup({ title, sub, items, total, onUpdate }) { const balanced = total === 100; return (

{title}

{sub}

{total}% {balanced ? "Allocated" : "Must equal 100%"}
{items.map(b => (
{b.first} {b.last}
{b.relation} · SSN {b.ssn}
onUpdate(b.id, e.target.value)}/> onUpdate(b.id, e.target.value)}/> %
))}
); } // ──────────────── Step 4: Review ──────────────── function StepReview({ coverage, dependents, beneficiaries }) { const med = PLANS.find(p => p.id === coverage.medical); const den = DENTAL_PLANS.find(p => p.id === coverage.dental); const vis = VISION_PLANS.find(p => p.id === coverage.vision); return (

Review your enrollment

Take a moment to confirm. You can edit any section before signing — coverage starts May 11, 2026.

{med.name} {med.type}
{med.carrier} · {med.network}
Deductible${med.deductible}
Out-of-pocket${med.oop.toLocaleString()}
Office visit{med.copay ? "$" + med.copay : "10% after ded"}
{den.name}
    {den.perks.map((p, i) =>
  • {p}
  • )}
{vis.name}
    {vis.perks.map((p, i) =>
  • {p}
  • )}
{dependents.map(d => (
{d.first} {d.last} · {d.relation} {d.coverage.med && Medical} {d.coverage.den && Dental} {d.coverage.vis && Vision}
))}
{beneficiaries.map(b => (
{b.first} {b.last} · {b.relation} {b.type === "primary" ? "Primary" : "Contingent"} {b.percentage}%
))}

Monthly cost breakdown

Your total monthly cost ${calculatePremium(coverage)}
Convoso contributes ${med.employer * 2.6 + den.employer + vis.employer}/mo on top — about 88% of total premiums.
); } function ReviewSection({ title, icon, color, wide, children }) { const C = I[icon]; return (

{title}

{children}
); } function CostRow({ label, you, convoso }) { return (
{label}
Convoso ${convoso}
${you}
); } function EnrollmentComplete({ coverage, dependents, onReset }) { return (
Enrollment complete

You're covered, {NEW_HIRE.first}.

Your benefits start May 11, 2026. Insurance cards will arrive in 7–10 business days. A confirmation has been sent to {PROFILE.email}.

{PLANS.find(p => p.id === coverage.medical).name}
{DENTAL_PLANS.find(p => p.id === coverage.dental).name}
{VISION_PLANS.find(p => p.id === coverage.vision).name}
{dependents.length} dependents covered
); } window.InsurancePage = InsurancePage;