import { Loader2, CheckCircle2, Circle } from "lucide-react"; import { motion } from "framer-motion"; interface Props { isInferring: boolean; modelIds: string[]; completedIds: Set; } /** Per-detector progress chips. Smoothly animates from queued → running → done. */ export default function InferenceProgress({ isInferring, modelIds, completedIds, }: Props) { if (!isInferring && completedIds.size === 0) { return null; } const totalDone = completedIds.size; const totalActive = modelIds.length; const progressPct = totalActive > 0 ? (totalDone / totalActive) * 100 : 0; return (
{isInferring ? ( ) : ( )} {isInferring ? `running ${totalDone}/${totalActive} detectors…` : `complete · ${totalActive}/${totalActive}`}
{progressPct.toFixed(0)}%
{/* Overall progress bar */}
{/* Per-detector chips */}
{modelIds.map((id) => { const done = completedIds.has(id); return (
{id} {done ? ( ) : isInferring ? ( ) : ( )}
); })}
); }