function StatsRow() { const ref = useReveal(); const [active, setActive] = useState(false); useEffect(() => { const node = ref.current; if (!node) return; const io = new IntersectionObserver(([e]) => { if (e.isIntersecting) { setActive(true); io.disconnect(); } }, { threshold: 0.4 }); io.observe(node); return () => io.disconnect(); }, []); const stats = [ { num: 61, label: 'Años de\ntrayectoria', icon: 'assets/icons/maestria.svg', color: 'blue' }, { num: 1472, label: 'Estudiantes', icon: 'assets/icons/estudiantes.svg', color: 'red' }, { num: 30, label: 'Docentes', icon: 'assets/icons/profesor.svg', color: 'orange' }, { num: 25000, label: 'Egresados', icon: 'assets/icons/graduado.svg', color: 'green' }, { num: 4, label: 'Niveles\nacadémicos', icon: 'assets/icons/documentos.svg', color: 'blue' }, ]; return (
{stats.map((s, i) => )}
); } function Stat({ num, label, icon, color, trigger }) { const v = useCounter(num, 1600, trigger); const formatted = num >= 1000 ? formatNumber(v).replace(/,/g, '.') : v; return (
{formatted}
{label.split('\n').map((l,i) =>
{l}
)}
); } Object.assign(window, { StatsRow, Stat });