// Stats.jsx — animated count-up + cursor-reactive spotlight
// Values are engagement commitments (the same ones quoted in the timeline, WhyUs and FAQ),
// not historical figures — we do not publish client statistics.
const STATS = [
{ v: 100, suffix: '%', l: 'Manual testing', s: 'every finding found, exploited, and confirmed by hand' },
{ v: 60, suffix: ' min', l: 'Critical findings disclosed', s: 'in your shared channel, while testing is still under way' },
{ v: 90, suffix: ' days', l: 'Free retest window', s: 'every High and Critical verified fixed, signed off by your tester' },
{ v: 48, suffix: ' hrs', l: 'From scoping call to fixed fee', s: 'a written scope and price, with no change orders' },
];
const Stats = () => {
const ref = React.useRef(null);
const [mx, setMx] = React.useState(50);
const [my, setMy] = React.useState(50);
const [active, setActive] = React.useState(false);
React.useEffect(() => {
const el = ref.current; if (!el) return;
const obs = new IntersectionObserver(([e]) => { if (e.isIntersecting) { setActive(true); obs.disconnect(); } }, { threshold: 0.3 });
obs.observe(el);
return () => obs.disconnect();
}, []);
const onMove = (e) => {
const r = ref.current.getBoundingClientRect();
setMx(((e.clientX - r.left) / r.width) * 100);
setMy(((e.clientY - r.top) / r.height) * 100);
};
return (
Our commitmentsWhat every engagement includes