// hero.jsx — Two hero variants // Variant A: editorial clássico (light, headline + colossal 17) // Variant B: cinematográfico arrojado (dark, image background, asymmetric) const { useState, useEffect, useRef } = React; function useRotator(items, intervalMs = 3500) { const [i, setI] = useState(0); useEffect(() => { if (!items || items.length < 2) return; const id = setInterval(() => setI((x) => (x + 1) % items.length), intervalMs); return () => clearInterval(id); }, [items, intervalMs]); return [i, items ? items[i] : '']; } function CountUp({ to = 17, duration = 1500, trigger = true }) { const [n, setN] = useState(0); const startedRef = useRef(false); useEffect(() => { if (!trigger || startedRef.current) return; startedRef.current = true; const start = performance.now(); const tgt = Number(to); if (!Number.isFinite(tgt)) { setN(to); return; } let raf; const step = (t) => { const p = Math.min(1, (t - start) / duration); const eased = 1 - Math.pow(1 - p, 3); setN(Math.round(tgt * eased)); if (p < 1) raf = requestAnimationFrame(step); }; raf = requestAnimationFrame(step); return () => cancelAnimationFrame(raf); }, [to, duration, trigger]); return <>{n}; } function HeroA({ t }) { const h = t.hero; return (

{h.first_name} {h.last_name_a} {h.last_name_b}

Ramón Ángel Díaz
Una vida ganando.
{h.stat_titles_n} {h.stat_titles}
{h.stat_clubs_n} {h.stat_clubs}
{h.stat_years_n} {h.stat_years}
); } function HeroB({ t }) { const h = t.hero; const [, tagline] = useRotator(h.taglines, 3600); const [animTrigger, setAnimTrigger] = useState(false); useEffect(() => { const id = setTimeout(() => setAnimTrigger(true), 200); return () => clearTimeout(id); }, []); return (
{h.meta_left}

RAMÓN DÍAZ {h.headline_b}

{h.side_caption}
{tagline}
{h.stat_titles_n} {h.stat_titles}
{h.stat_clubs_n} {h.stat_clubs}
{h.stat_years_n} {h.stat_years}
); } Object.assign(window, { HeroA, HeroB, useRotator, CountUp });