'use client'; import React, { useEffect, useRef, useState } from 'react'; interface MetricBarProps { label: string; value: number; max?: number; unit?: string; /** "red" | "green" | "blue" | "slate" */ color?: 'red' | 'green' | 'blue' | 'slate'; className?: string; } const colorMap = { red: 'bg-red-400', green: 'bg-emerald-500', blue: 'bg-blue-500', slate: 'bg-slate-700', }; export const MetricBar: React.FC = ({ label, value, max = 100, unit = '%', color = 'slate', className = '', }) => { const [animated, setAnimated] = useState(false); const ref = useRef(null); const pct = Math.min(100, Math.round((value / max) * 100)); useEffect(() => { if (!ref.current) return; const observer = new IntersectionObserver( (entries) => { entries.forEach((entry) => { if (entry.isIntersecting) { setAnimated(true); observer.disconnect(); } }); }, { rootMargin: '50px' } ); observer.observe(ref.current); return () => observer.disconnect(); }, []); return (
{label} {value}{unit}
); };