/* =========================================================== Halvorsen — Journey + Press + Testimonials =========================================================== */ const JOURNEY = [ { n: "01", t: "Initial conversation", d: "A 45-minute consultation. We listen, we examine, and — most importantly — we ask what you want your life to look like in six months.", time: "45 min", price: "£280" }, { n: "02", t: "Imaging & second look", d: "Where indicated: in-house MRI, weight-bearing CT, dynamic ultrasound. Reviewed alongside you, in plain language.", time: "Same day", price: "Included" }, { n: "03", t: "A written plan", d: "Every patient leaves with a written plan, three options, and a clearly named recommendation. No surprises in a corridor.", time: "Within 48 hrs", price: "—" }, { n: "04", t: "Surgery, if surgery", d: "Performed at Cleveland Clinic London or Volvat Oslo. You meet your full team — anaesthetist, theatre lead, physiotherapist — the day before.", time: "Day case to 2 nights", price: "Quoted in plan" }, { n: "05", t: "Rehabilitation", d: "Your physiotherapist is part of our team from day one. We do not hand you a leaflet and a phone number.", time: "6 wks – 9 mos", price: "Tiered" }, { n: "06", t: "The handshake", d: "We discharge you on the day you return to your sport, your stage, your child's birthday party — whatever you came in to recover.", time: "Variable", price: "—" }, ]; const Journey = () => { const [hover, setHover] = React.useState(0); return (

Six steps. None of them are surprises.

    {JOURNEY.map((s, i) => (
  • setHover(i)} onFocus={() => setHover(i)} tabIndex={0} style={{ display: "grid", gridTemplateColumns: "60px 1fr 100px", alignItems: "baseline", padding: "26px 0", borderTop: "1px solid var(--line)", borderBottom: i === JOURNEY.length - 1 ? "1px solid var(--line)" : "none", cursor: "pointer", transition: "padding 320ms var(--ease)", paddingLeft: hover === i ? 18 : 0, background: hover === i ? "var(--bone)" : "transparent", }} > {s.n} {s.t} {s.time}
  • ))}
Step · {JOURNEY[hover].n}
{JOURNEY[hover].t}
{JOURNEY[hover].d}
Time
{JOURNEY[hover].time}
Indicative cost
{JOURNEY[hover].price}
); }; /* ---------- PRESS & PUBLICATIONS ---------- */ const PRESS = [ { src: "JBJS · 2024", t: "Quadriceps tendon ACL: a 5-year cohort", k: "Lead author" }, { src: "BBC Radio 4 · 2024", t: "On the over-medicalisation of healthy knees", k: "Interview" }, { src: "The Times · 2023", t: "Britain's quietest orthopaedic surgeon", k: "Profile" }, { src: "ESSKA · 2023", t: "Keynote: meniscus preservation in athletes", k: "Keynote" }, { src: "AJSM · 2022", t: "Return-to-sport criteria, revisited", k: "Co-author" }, { src: "Monocle · 2022", t: "Designing a clinic that doesn't feel like one", k: "Feature" }, ]; const Press = () => (

Selected writing & talks.

); /* ---------- TESTIMONIALS — "case ledger" horizontal ---------- */ const TESTIMONIALS = [ { id: "C-2391", who: "Eliza M., 34", role: "Marathon runner, London", proc: "ACL · QT autograft", quote: "Mira was the third surgeon I saw. She was the first who told me what she wouldn't do. I ran Berlin nine months later.", tone: "sand", src: "https://images.unsplash.com/photo-1571008887538-b36bb32f4571?w=900&q=85" }, { id: "C-1864", who: "Tobias R., 58", role: "Carpenter, Bergen", proc: "Robotic partial knee", quote: "I was promised the operation would be small and the recovery quiet. Both turned out to be true. I am back on the workshop floor.", tone: "sage", src: "https://images.unsplash.com/photo-1581595220892-b0739db3ba8c?w=900&q=85" }, { id: "C-2105", who: "Aïcha L., 41", role: "Choreographer, Paris", proc: "Hip arthroscopy, FAI", quote: "She watched a video of me dancing before she touched my hip. That, to me, is the whole thing.", tone: "bone", src: "https://images.unsplash.com/photo-1518611012118-696072aa579a?w=900&q=85" }, { id: "C-2702", who: "Rohan K., 22", role: "Rugby academy", proc: "Shoulder stabilisation", quote: "Honest about my odds, plain about my work. Out of the sling at week four, back in contact at month five.", tone: "ink", src: "https://images.unsplash.com/photo-1551655510-555dc3be8633?w=900&q=85" }, ]; const Testimonials = () => { const [idx, setIdx] = React.useState(0); return (

Patients, in their own words.

{TESTIMONIALS.map((t) => (
{t.role} {t.proc}
"{t.quote}"
))}
{TESTIMONIALS.map((_, i) => (
); }; Object.assign(window, { Journey, Press, Testimonials });