"use client"; import { useRef, useState } from "react"; /** * Interactive "before / after" revenue slider — the visual proof-of-value * pattern. A draggable divider wipes a muted "before" chart to reveal a * surging acid "after" chart. Fully keyboard operable via a real range * input (arrow keys). The headline result is always visible as text, so * meaning never depends on the interaction. */ export default function BeforeAfter({ before, after, caption, }: { before: string; after: string; caption: string; }) { const [pos, setPos] = useState(38); const wrap = useRef(null); const id = `ba-${caption.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-|-$/g, "")}`; const drag = (clientX: number) => { const r = wrap.current?.getBoundingClientRect(); if (!r) return; const p = ((clientX - r.left) / r.width) * 100; setPos(Math.max(2, Math.min(98, p))); }; return (
e.buttons === 1 && drag(e.clientX)} onPointerDown={(e) => drag(e.clientX)} > {/* AFTER (full) — surging line */} {/* BEFORE (clipped to slider) — flat, muted */} {/* divider + accessible control */} setPos(Number(e.target.value))} />
{caption}
); } /** SVG sparkline. "before" = flat/jagged & muted, "after" = steep climb + acid. */ function Chart({ variant }: { variant: "before" | "after" }) { const after = variant === "after"; const path = after ? "M0 86 C 40 84, 70 80, 110 70 S 190 30, 240 10" : "M0 70 C 40 72, 70 66, 110 70 S 190 64, 240 62"; return ( ); }