// Compact animated stat pill for the hero trust row — reuses the same // real counters data + useCountUp hook as About's counter cards, just in // a smaller inline form that fits the dark hero background. function HeroStat({ item }) { const ref = React.useRef(null); const [active, setActive] = React.useState(false); React.useEffect(() => { const el = ref.current; if (!el) return; const io = new IntersectionObserver((entries) => { entries.forEach((e) => { if (e.isIntersecting) { setActive(true); io.disconnect(); } }); }, { threshold: 0.4 }); io.observe(el); return () => io.disconnect(); }, []); const value = window.useCountUp(item.value, active); return (
{value}{item.suffix} {item.label}
); } function Hero({ onNavigate, imageSide = 'Right' }) { const { Button } = window.ArnelBiscarraDesignSystem_2766cb; const roles = window.SITE_DATA.roles; // Reordered (not mutated — About's counters grid uses the original // order) so a 2-column grid stacks "Happy Clients" directly under // "Projects Completed": [Years, Projects, Coffee, Clients]. const counters = [ window.SITE_DATA.counters[0], window.SITE_DATA.counters[1], window.SITE_DATA.counters[3], window.SITE_DATA.counters[2], ]; const reversed = imageSide === 'Left'; const heroRef = React.useRef(null); const canvasRef = React.useRef(null); React.useEffect(() => { if (!window.initFluidHero || !canvasRef.current) return; const cleanup = window.initFluidHero(canvasRef.current, heroRef.current); return cleanup; }, []); return (
{reversed && (
Arnel Biscarra portrait
)}
/ PORTFOLIO

I create modern websites, powerful branding, creative marketing materials, and professional apparel designs that help businesses grow and stand out.

{counters.map((c) => )}
{!reversed && (
Arnel Biscarra portrait
)}
); } window.Hero = Hero;