// products.jsx — Product detail + Checkout pages. Content from CMS. const html = (s) => ({ __html: s || '' }); const ProductDetail = ({ id }) => { const p = PRODUCTS[id]; if (!p) return ; const longCopy = window.PRODUCT_DETAILS || {}; const detail = longCopy[id] || {}; const sidebarImg = longCopy.sidebarImage || 'assets/retreat-moment.jpg'; return ( <>
goTo('home')}>Home {p.icp && <> goTo(p.icp)}>The {p.icp[0].toUpperCase() + p.icp.slice(1)} } {p.name}
{p.phase && {p.phase}}

{p.name}

{p.tagline}

{detail.youBuild && (

You build

    {detail.youBuild.map((b,i)=>
  • {b}
  • )}
)} {detail.youExperience && (

You experience

    {detail.youExperience.map((b,i)=>
  • {b}
  • )}
)} {detail.youLeaveWith && (

You leave with

    {detail.youLeaveWith.map((b,i)=>
  • {b}
  • )}
)}
{p.leaveWith && (
{p.leaveWith}
)}
You may also need
{Object.values(PRODUCTS) .filter(o => o.id !== id && o.kind === 'program') .slice(0, 3) .map(o => ( ))}
); }; const CheckoutPage = ({ id }) => { const p = PRODUCTS[id]; if (!p) return ; // Redirect happens in the router (index.html) before React renders. // If we land here, the product has no external checkout URL configured. const C = window.CHECKOUT || {}; return (
{C.fallbackEyebrow || 'Coming soon'}

{p.name}

{C.fallbackBody || 'The checkout page for this product is being set up. Please check back shortly.'}

); }; const VaultPage = () => { const H = window.HOME || {}; const frontDoor = (H.frontDoor || [])[1] || {}; return ( <>
{frontDoor.eyebrow}

The Vault.

DATEThursday, June 5
TIME12:00pm PT · 60 minutes
WHERELive on Zoom · replay included

An open hour with Joanna to feel the work before you commit. Get a window into the course, ask anything, and watch a live story-share. No upsell during the room — just the work.

  • See exactly what happens inside Tell Your Story
  • Hear a live 3–5 minute story share — see how it lands
  • Live Q&A with Joanna
  • Replay sent to everyone who registers
What women say after the Vault I came expecting a sales pitch. I left with a sentence I still use about my company.
); }; const DollarMessagePage = () => { const H = window.HOME || {}; const fd = (H.frontDoor || [])[0] || {}; return ( <>
$29 · Self-paced

Your Dollar Message.

The fastest way to find the one sentence that actually sells you — the message you can repeat in 30 seconds and have people remember when you leave the room.

You get

  • A 60-minute self-paced training with Joanna
  • The Dollar Message worksheet (PDF + Notion)
  • Joanna's 3-question clarity prompt
  • Lifetime access — revisit any time

You leave with

  • One sentence that defines you in plain English
  • A repeatable answer to "so what do you do?"
  • The first piece of the Tell Your Story program — keep going if you want
Already inside the room

Your $29 credits toward Phase 1 (Tell Your Story) if you decide to keep going.

); }; const AssessmentPage = () => { const [step, setStep] = React.useState(0); const [answers, setAnswers] = React.useState([]); const questions = [ { q: 'When someone asks what you do, you usually…', a: ['…start explaining and tweak it depending on who I\'m talking to.', '…can say it — but it loses energy as I keep going.', '…have a sentence I repeat. The market just doesn\'t.'], }, { q: 'Roughly, how long have you been leading or building?', a: ['3–8 years', '10–20 years', '20+ years'], }, { q: 'Revenue or scale of impact:', a: ['$100K – $500K', '$500K – $5M+', '$5M – $25M+'], }, { q: 'The next 12 months are about…', a: ['Finding the message — saying what defines me.', 'Sharpening the message I have — making it land on stage.', 'Building something that outlives me.'], }, ]; if (step >= questions.length) { const counts = [0, 0, 0]; answers.forEach((i) => counts[i]++); const winner = counts.indexOf(Math.max(...counts)); const result = [ { tag: 'The Speaker', route: 'speaker', body: 'Start by finding your message. Phase 1 is built for you.' }, { tag: 'The Authority', route: 'authority', body: 'Sharpen what you already have. Phase 2 is calling.' }, { tag: 'The Legacy', route: 'legacy', body: 'Define the system that outlives you.' }, ][winner]; return (
Your phase

You are
{result.tag}.

{result.body}

); } const q = questions[step]; return (
Step {step + 1} of {questions.length}

{q.q}

{q.a.map((opt, i) => ( ))}
{step > 0 && ( )}
); }; const NotFound = () => (
404

Not here.

); Object.assign(window, { ProductDetail, CheckoutPage, VaultPage, DollarMessagePage, AssessmentPage, NotFound, });