import { useEffect, useRef } from 'react'; import CountUp from 'react-countup'; interface CounterCardProps { icon: React.ReactNode; title: string; value: number; suffix?: string; trend?: number; color?: string; } const CounterCard: React.FC = ({ icon, title, value, suffix = '', trend, color = '#F84525' }) => { const cardRef = useRef(null); useEffect(() => { if (!('IntersectionObserver' in window)) return; const observer = new IntersectionObserver( (entries) => { entries.forEach((entry) => { if (entry.isIntersecting) { (entry.target as Element).classList.add('animate-fade-in-up'); } }); }, { threshold: 0.1 } ); try { if (cardRef.current && cardRef.current instanceof Element) { observer.observe(cardRef.current); } } catch (e) { console.warn('IntersectionObserver.observe failed:', e); } return () => observer.disconnect(); }, []); return (
{icon}
{title}

{trend && ( 0 ? 'bg-success' : 'bg-danger'} d-flex align-items-center`} style={{ fontSize: '10px' }} > 0 ? 'up' : 'down'} me-1`}> {Math.abs(trend)}% )}
{icon}
{/* Animated background element */}
); }; export default CounterCard;