/* ===================== JOURNEY (scroll-driven tiers) ===================== */ function Journey() { const ref = React.useRef(null); const [active, setActive] = React.useState(0); const [progress, setProgress] = React.useState(0); React.useEffect(() => { const onScroll = () => { if (!ref.current) return; const rect = ref.current.getBoundingClientRect(); const vh = window.innerHeight; const total = rect.height - vh; const p = Math.max(0, Math.min(1, -rect.top / total)); setProgress(p); const idx = Math.min(TIERS.length - 1, Math.floor(p * TIERS.length * 0.999)); setActive(idx); }; onScroll(); window.addEventListener("scroll", onScroll, { passive: true }); return () => window.removeEventListener("scroll", onScroll); }, []); return (
The journey

Four tiers, one direction: up.

Wherever you are, there's a clear next step. We help businesses move through these four tiers — starting wherever makes sense for you.

{TIERS.map((t, i) => (
{t.num}
{t.img ? {t.label} : React.createElement(Icon[t.icon])}
Tier {t.num} · {t.label}

{t.headline}

{t.blurb}

    {t.bullets.map((b, j) => (
  • {b}
  • ))}
))}
); } function JourneyDiagram({ active, progress }) { // A curve that grows as we scroll. 4 stops along it. const w = 540, h = 540; const path = "M 60 480 Q 140 460 200 380 T 320 220 T 480 60"; // approximate length const totalLen = 700; const drawn = totalLen * Math.min(1, progress * 1.15); // node positions (manual approx along curve) const nodes = [ { x: 100, y: 470, label: "01" }, { x: 220, y: 360, label: "02" }, { x: 340, y: 220, label: "03" }, { x: 470, y: 80, label: "04" }, ]; return (
Your trajectory Tier {TIERS[active]?.num}
{/* faint full path */} {/* drawn portion */} {/* nodes */} {nodes.map((n, i) => { const isActive = i === active; const isDone = i < active; const reached = i <= active; return ( {isActive && } {n.label} {isDone && } ); })}
{TIERS[active].num}
Currently exploring
{TIERS[active].label}
{Math.round(progress * 100)}%
); } window.Journey = Journey;