/* =========================================================== Halvorsen — About + Procedures (tabs) + Outcomes (counters) =========================================================== */ /* ---------- ABOUT / PHILOSOPHY ---------- */ const About = () => (
Fig. 02 · Tibiofemoral, posterior view

Surgery is the last quiet conversation between a body and the person who will carry it forward.

For seventeen years, my practice has been built on a stubborn idea: that orthopaedic surgery is not a transaction, and that a knee is not a knee. It belongs to the violinist who needs to crouch, the parent on the floor with their child, the runner whose Sunday is a pilgrimage.

I will not operate on a patient whose problem can be answered by movement, time, or honesty. When surgery is the right answer, it is approached the way a luthier approaches a violin — with patience, planning and a respect for what was working before.

); const Tenet = ({ n, t, d }) => (
— {n}
{t}
{d}
); /* ---------- PROCEDURES (tabs) ---------- */ const PROCEDURES = [ { id: "knee", label: "Knee", motif: "knee", count: "1,820 procedures", items: [ { name: "ACL reconstruction", note: "Quad tendon · BPTB · hamstring", time: "60–90 min", stay: "Day case" }, { name: "Meniscal repair / preservation", note: "All-inside, inside-out", time: "45–75 min", stay: "Day case" }, { name: "Cartilage restoration (MACI / OATS)", note: "Single & two-stage", time: "60–120 min", stay: "1 night" }, { name: "Robotic partial knee replacement", note: "Mako / image-matched", time: "75 min", stay: "1–2 nights" }, { name: "Osteotomy (HTO / DFO)", note: "Joint preservation", time: "90 min", stay: "1 night" }, ], }, { id: "shoulder", label: "Shoulder", motif: "shoulder", count: "640 procedures", items: [ { name: "Rotator cuff repair", note: "Arthroscopic, double-row", time: "60–90 min", stay: "Day case" }, { name: "Stabilisation (Bankart / Latarjet)", note: "Recurrent dislocation", time: "75–120 min", stay: "1 night" }, { name: "Subacromial decompression", note: "Selective indication", time: "30 min", stay: "Day case" }, { name: "Reverse shoulder arthroplasty", note: "Cuff-deficient arthritis", time: "90–120 min", stay: "1–2 nights" }, ], }, { id: "hip", label: "Hip", motif: "hip", count: "560 procedures", items: [ { name: "Hip arthroscopy (FAI, labral repair)", note: "Camshape / pincer", time: "75 min", stay: "Day case" }, { name: "Anterior approach total hip", note: "Muscle-sparing", time: "90 min", stay: "1 night" }, { name: "Periacetabular osteotomy referral", note: "Co-management", time: "—", stay: "—" }, ], }, { id: "ankle", label: "Foot & Ankle", motif: "ankle", count: "240 procedures", items: [ { name: "Ankle ligament reconstruction", note: "Brostrom-Gould", time: "45 min", stay: "Day case" }, { name: "Achilles tendon repair", note: "Mini-open / percutaneous", time: "45 min", stay: "Day case" }, { name: "Cartilage repair (talus)", note: "OATS / BMAC", time: "60 min", stay: "Day case" }, ], }, { id: "spine", label: "Sports Spine", motif: "spine", count: "160 procedures", items: [ { name: "Microdiscectomy", note: "Lumbar radiculopathy", time: "45 min", stay: "Day case" }, { name: "Pars repair (athletes)", note: "Direct screw fixation", time: "75 min", stay: "1 night" }, ], }, ]; const Procedures = () => { const [active, setActive] = React.useState("knee"); const cur = PROCEDURES.find((p) => p.id === active); const Motif = { knee: KneeMotif, shoulder: ShoulderMotif, hip: HipMotif, ankle: AnkleMotif, spine: SpineMotif }[cur.motif]; return (

A practice narrowed with intention.

High volume in a small set of operations is, in our view, the fastest path to good outcomes. Tap a region.
{/* Tab bar */}
{PROCEDURES.map((p) => ( ))}
{/* Content */}
Region · {cur.label} {cur.count}
    {cur.items.map((it, i) => (
  • {String(i + 1).padStart(2, "0")}
    {it.name}
    {it.note}
    {it.time}
    {it.stay}
  • ))}
); }; /* ---------- OUTCOMES — animated counters ---------- */ const useCountUp = (target, duration = 1600, run = false) => { const [val, setVal] = React.useState(0); React.useEffect(() => { if (!run) return; let raf, start; const step = (t) => { if (!start) start = t; const p = Math.min(1, (t - start) / duration); const eased = 1 - Math.pow(1 - p, 3); setVal(target * eased); if (p < 1) raf = requestAnimationFrame(step); }; raf = requestAnimationFrame(step); return () => cancelAnimationFrame(raf); }, [target, duration, run]); return val; }; const Counter = ({ value, suffix = "", decimals = 0, run, label, sub }) => { const v = useCountUp(value, 1700, run); const formatted = decimals > 0 ? v.toFixed(decimals) : Math.round(v).toLocaleString(); return (
{formatted}{suffix}
{label}
{sub}
); }; const Outcomes = () => { const [run, setRun] = React.useState(false); const ref = React.useRef(null); React.useEffect(() => { const el = ref.current; if (!el) return; const io = new IntersectionObserver((entries) => { entries.forEach((e) => { if (e.isIntersecting) { setRun(true); io.disconnect(); } }); }, { threshold: 0.3 }); io.observe(el); return () => io.disconnect(); }, []); return (

Numbers we publish, even when they're inconvenient.

DATA SOURCE · NJR + INTERNAL REGISTRY · 2009–2025
0.4%
30-day complication rate
Below national avg. of 1.6%
{/* mini chart */}
Patient-reported function · KOOS, 24mo post-op
n = 1,240 · published in JBJS, 2024
"If your surgeon won't show you their full data — including the bad weeks — find another surgeon."
— M.H., from a 2024 lecture
); }; const KOOSChart = () => { /* simple line chart — pre vs post over 24mo */ const data = [42, 48, 56, 64, 72, 80, 86, 90, 92, 93, 94, 94, 94]; const w = 520, h = 180, pad = 16; const max = 100, min = 0; const stepX = (w - pad * 2) / (data.length - 1); const points = data.map((v, i) => [pad + i * stepX, h - pad - ((v - min) / (max - min)) * (h - pad * 2)]); const path = points.map(([x, y], i) => (i === 0 ? `M${x},${y}` : `L${x},${y}`)).join(" "); const areaPath = `${path} L${pad + (data.length - 1) * stepX},${h - pad} L${pad},${h - pad} Z`; return ( {[0.25, 0.5, 0.75].map((p) => ( ))} {points.map(([x, y], i) => ( ))} pre · 42 24mo · 94 ); }; Object.assign(window, { About, Procedures, Outcomes, KOOSChart });