// Main sections: Nav, Hero, Programs rotator, Process, Science, Team, Testimonials, FAQ, Final CTA, Footer const { useState, useEffect, useRef } = React; // Parallax band — full-bleed image panel with pull-quote, sits between sections const ParallaxBand = ({ src, eyebrow, children, speed = 0.35, height = '65vh' }) => (
{eyebrow &&
{eyebrow}
}
{children}
); // ───────────────────── Nav ───────────────────── // `home` prefix: empty string when on homepage, "index.html" when on Resources or other top-level pages. // This lets hash links work both as in-page scroll AND cross-page navigation. const Nav = ({ ctaLabel, onQuiz, home = '' }) => { const [menuOpen, setMenuOpen] = useState(false); // Lock body scroll when menu open + escape key to close useEffect(() => { if (menuOpen) { document.body.classList.add('nav-menu-open'); const onKey = (e) => { if (e.key === 'Escape') setMenuOpen(false); }; window.addEventListener('keydown', onKey); return () => { document.body.classList.remove('nav-menu-open'); window.removeEventListener('keydown', onKey); }; } else { document.body.classList.remove('nav-menu-open'); } }, [menuOpen]); const closeMenu = () => setMenuOpen(false); const navLink = (label, hash, isResources) => ( {label} ); return ( ); }; // ───────────────────── Hero ───────────────────── const Hero = ({ variant, ctaLabel, onQuiz, season = 'summer' }) => { const seasonData = (window.SEASONS && window.SEASONS[season]) || null; const heroVisualRef = React.useRef(null); // Variant: 'split' | 'centered' | 'editorial' if (variant === 'centered') { return (
NATIONWIDE · VIRTUAL · ROOTED IN NH

Where medicine
meets the wild.

Six precision programs. Thirty-plus specialty labs. An intentionally limited practice built around you — not a billing code.

{ e.preventDefault(); onQuiz(); }}> {ctaLabel}
); } if (variant === 'editorial') { return (
VOL. VII · SPRING 2026 EDITION
NATIONWIDE TELEHEALTH · LITTLETON, NH

Healthcare,
reimagined.

Precision cellular medicine, peptide therapy, and longevity science — delivered virtually with personalized plans and continuous support.

{ e.preventDefault(); onQuiz(); }}> {ctaLabel}
); } // Default: split — now full-bleed cinematic video, no right photo card return (
{seasonData && seasonData.heroVideo && window.HeroVideo ? ( ) : seasonData && seasonData.heroPoster ? ( ) : ( )}
{seasonData ? seasonData.heroEyebrow : 'LITTLETON, NH · VIRTUAL FIRST'}

Healthcare,
reimagined.

Precision cellular medicine, peptide therapy, and longevity science — delivered with personalized plans and continuous support.

{ e.preventDefault(); onQuiz(); }}> {ctaLabel}
3-minute assessment, right on this page
Virtual visits, currently licensed in NH VT MA CT NE NY MD
); }; // ───────────────────── Programs rotator ───────────────────── const Programs = () => { const [active, setActive] = useState(0); const [isMobile, setIsMobile] = useState(() => typeof window !== 'undefined' && window.matchMedia('(max-width: 768px)').matches ); useEffect(() => { const mq = window.matchMedia('(max-width: 768px)'); const onChange = (e) => setIsMobile(e.matches); mq.addEventListener ? mq.addEventListener('change', onChange) : mq.addListener(onChange); return () => mq.removeEventListener ? mq.removeEventListener('change', onChange) : mq.removeListener(onChange); }, []); const program = PROGRAMS[active]; if (isMobile) { return (
/ 01 · PROGRAMS

Six paths, one biology.

Every program is grounded in the same methodology: measure deeply, intervene precisely, support continuously.

{PROGRAMS.map((p, i) => { const isOpen = i === active; return (
{isOpen && (
)}
); })}
); } return (
/ 01 · PROGRAMS

Six paths, one biology.

Every program is grounded in the same methodology: measure deeply, intervene precisely, support continuously.

{PROGRAMS.map((p, i) => ( ))}
{program.tag}

{program.title}

{program.desc}

    {program.pillars.map((p, i) =>
  • {p}
  • )}
{`PROGRAM · ${program.short.toUpperCase()}`}
); }; // ───────────────────── Process ───────────────────── const Process = () => (
/ 02 · OUR WORK

How care actually works here.

Four steps, no 15-minute appointments, no billing-code gymnastics. Just time, precision, and a plan that evolves with you.

{PROCESS_STEPS.map((step, i) => (
{step.num}

{step.title}

{step.desc}

))}
); // ───────────────────── Quiz ───────────────────── // Native in-page quiz: scores answers, collects contact info, submits to Eden. // Submission uses FormSubmit.co (no backend needed) — change CLINIC_EMAIL below. const CLINIC_EMAIL = "hello@edenwellnessclinic.com"; // FormSubmit hashed endpoint (activated). The hash hides the email from page source // while still routing to CLINIC_EMAIL on the backend. const FORM_ENDPOINT = `https://formsubmit.co/ajax/68dad4f212a63cac6c1e6f8f409d1b51`; const Quiz = React.forwardRef((props, ref) => { // steps: 0..N-1 = questions, N = contact form, N+1 = success const [step, setStep] = useState(0); const [answers, setAnswers] = useState({}); const [contact, setContact] = useState({ name: '', email: '', phone: '', notes: '' }); const [submitting, setSubmitting] = useState(false); const [submitError, setSubmitError] = useState(null); const total = QUIZ_QUESTIONS.length; const contactStep = total; const doneStep = total + 1; const isContact = step === contactStep; const isDone = step === doneStep; // Which questions allow multi-select. Per product spec: every question except the // financial / budget question accepts up to two answers. const isMulti = (q) => q && q.field !== 'budget'; const MAX_MULTI = 2; // Normalize an answers[i] value to an array of options (legacy single-select answers // were stored as a single object; we coerce on read so the rest of the math stays uniform). const optsFor = (i) => { const a = answers[i]; if (!a) return []; return Array.isArray(a) ? a : [a]; }; // ── Compute the program match (only score-kind questions matter for ranking) const computeMatch = () => { const scores = {}; PROGRAMS.forEach(p => { scores[p.id] = 0; }); QUIZ_QUESTIONS.forEach((q, i) => { optsFor(i).forEach(opt => { if (!opt || !opt.weight) return; Object.entries(opt.weight).forEach(([k, v]) => { scores[k] = (scores[k] || 0) + v; }); }); }); const ranked = Object.entries(scores).sort((a, b) => b[1] - a[1]); const best = PROGRAMS.find(p => p.id === ranked[0][0]) || PROGRAMS[0]; const second = PROGRAMS.find(p => p.id === ranked[1][0]); return { best, second, scores: ranked }; }; // ── Compute the *outcome* of the quiz (qualified, waitlist, low-budget, consult) const computeOutcome = () => { let stateOpts = [], budgetOpt = null, expectOpts = []; QUIZ_QUESTIONS.forEach((q, i) => { const opts = optsFor(i); if (q.field === 'state') stateOpts = opts; if (q.field === 'budget') budgetOpt = opts[0]; // single-select if (q.field === 'expectations') expectOpts = opts; }); if (stateOpts.some(o => o.qualified === 'waitlist')) return 'waitlist_state'; if (budgetOpt && budgetOpt.qualified === 'low_budget') return 'low_budget'; if (budgetOpt && budgetOpt.qualified === 'consult') return 'consult'; if (expectOpts.some(o => o.commitment === 'low') && (!budgetOpt || budgetOpt.qualified !== true)) return 'consult'; return 'qualified'; }; const match = computeMatch(); const outcome = computeOutcome(); const select = (opt) => { const q = QUIZ_QUESTIONS[step]; if (!isMulti(q)) { // Single-select (budget): set + auto-advance. setAnswers({ ...answers, [step]: [opt] }); setTimeout(() => setStep(s => Math.min(s + 1, contactStep)), 220); return; } // Multi-select: toggle, cap at MAX_MULTI (drop oldest when over). const current = optsFor(step); const idx = current.findIndex(o => o.label === opt.label); let next; if (idx >= 0) { next = current.filter(o => o.label !== opt.label); } else if (current.length >= MAX_MULTI) { next = [...current.slice(1), opt]; } else { next = [...current, opt]; } setAnswers({ ...answers, [step]: next }); }; const advance = () => { if (optsFor(step).length === 0) return; setStep(s => Math.min(s + 1, contactStep)); }; const reset = () => { setStep(0); setAnswers({}); setContact({ name: '', email: '', phone: '', notes: '' }); setSubmitError(null); }; const submit = async (e) => { e.preventDefault(); if (!contact.name || !contact.email) return; setSubmitting(true); setSubmitError(null); const answersSummary = QUIZ_QUESTIONS.map((q, i) => { const opts = optsFor(i); const labels = opts.length ? opts.map(o => o.label).join(' + ') : '(no answer)'; return `Q${i + 1} [${q.section || ''}] ${q.q}\n → ${labels}`; }).join('\n\n'); const scoreSummary = match.scores .map(([id, score]) => { const prog = PROGRAMS.find(p => p.id === id); return ` ${prog?.short}: ${score}`; }).join('\n'); const outcomeLabels = { qualified: '✓ QUALIFIED — ready to book', consult: '⚠ NEEDS FIT CONVERSATION — budget or expectations gap', low_budget: '✗ UNDER-BUDGET — newsletter / library follow-up', waitlist_state: '◷ OUT-OF-STATE WAITLIST — licensure pending', }; const payload = { _subject: `Eden Lead [${outcomeLabels[outcome]}] — ${contact.name} → ${match.best.short}`, _template: "table", _captcha: "false", Outcome: outcomeLabels[outcome], Name: contact.name, Email: contact.email, Phone: contact.phone || '(not provided)', "Best-Fit Program": match.best.short, "Secondary Match": match.second?.short || '', "Program Scores": scoreSummary, "Quiz Answers": answersSummary, "Additional Notes": contact.notes || '(none)', "Submitted": new Date().toLocaleString(), }; try { const res = await fetch(FORM_ENDPOINT, { method: 'POST', headers: { 'Content-Type': 'application/json', 'Accept': 'application/json' }, body: JSON.stringify(payload), }); if (!res.ok) throw new Error(`Submission failed (${res.status})`); setStep(doneStep); } catch (err) { setSubmitError(err.message || "Something went wrong. Please try again or call us directly."); } finally { setSubmitting(false); } }; const pct = isDone ? 100 : isContact ? 92 : Math.round(((step) / (total + 1)) * 92); // Has the previous question changed section? const currentQ = !isContact && !isDone ? QUIZ_QUESTIONS[step] : null; const prevQ = step > 0 ? QUIZ_QUESTIONS[step - 1] : null; const showSectionHeader = currentQ && (!prevQ || prevQ.section !== currentQ.section); return (
/ 03 · FIND YOUR PATH

Begin with the assessment.

Every Eden patient starts here. This is how we make sure we're the right fit before either of us spends a dollar — and how we get a real picture of what you actually need.

  • 01Three sections, about 3 minutes
  • 02Reviewed personally by the Eden Wellness team
  • 03Personal follow-up within 1 business day
  • 04Booking only opens after we confirm fit
{isDone ? 'COMPLETE' : isContact ? 'YOUR DETAILS' : `Question ${step + 1} / ${total}`}
{pct}%
{/* Questions */} {!isContact && !isDone && ( {currentQ.section && (
SECTION {['WHAT BRINGS YOU HERE','A LITTLE ABOUT YOU','INVESTMENT & FIT'].indexOf(currentQ.section) + 1} / 3 {currentQ.section}
)}

{currentQ.q}

{currentQ.sub} {isMulti(currentQ) && ( Pick up to two. )}

{currentQ.options.map((opt, i) => { const selected = optsFor(step).some(o => o.label === opt.label); return ( ); })}
{isMulti(currentQ) ? ( ) : (
Choose an option to continue
)}
)} {/* Contact form */} {isContact && (
FINAL STEP · YOUR DETAILS

Where should we send your match?

Our team personally reviews every assessment. We'll be in touch within one business day with your match summary and the right next step.

setContact({ ...contact, name: e.target.value })} /> setContact({ ...contact, email: e.target.value })} /> setContact({ ...contact, phone: e.target.value })} />