Progress Card
roi-ui/card-progressFreeItem
A file upload progress card with multiple file tracking.
Install it
npx shadcn@latest add https://roiui.com/r/card-progress.jsonSource
1"use client";23import { AlertCircle, Check } from "lucide-react";4import { Card, CardContent } from "@/registry/brook/ui/card/card";5import styles from "./progress-card.module.css";67export type StepStatus = "pending" | "in_progress" | "complete" | "error" | "warning";89export type Step = {10 id: string;11 title: string;12 description?: string;13 status: StepStatus;14};1516type StepIndicatorProps = {17 status: StepStatus;18 isFinal?: boolean;19};2021function AnimatedClock({ className }: { className?: string }) {22 return (23 <svg24 className={className}25 fill="none"26 height="12"27 stroke="currentColor"28 strokeLinecap="round"29 strokeLinejoin="round"30 strokeWidth="2.5"31 viewBox="0 0 24 24"32 width="12"33 >34 <circle cx="12" cy="12" r="10" />35 <line x1="12" x2="12" y1="12" y2="7" />36 <line className={styles.clockHand} x1="12" x2="15" y1="12" y2="13" />37 </svg>38 );39}4041function getIndicatorConfig(status: StepStatus, isFinal: boolean) {42 switch (status) {43 case "complete":44 return {45 className: `${styles.spinnerToCheck} ${isFinal ? styles.finalCheck : ""}`,46 icon: "check",47 } as const;48 case "in_progress":49 return { className: styles.spinnerCircle, icon: null } as const;50 case "error":51 return { className: styles.errorCircle, icon: "error" } as const;52 case "warning":53 return { className: styles.clockCircle, icon: "clock" } as const;54 default:55 return { className: styles.pendingCircle, icon: null } as const;56 }57}5859function StepIndicator({ status, isFinal = false }: StepIndicatorProps) {60 const { className, icon } = getIndicatorConfig(status, isFinal);61 const showSpinner = status === "in_progress" || status === "complete";62 const isComplete = status === "complete";6364 return (65 <div className={styles.indicatorWrapper}>66 {showSpinner && <div className={`${styles.spinnerCircleOverlay} ${isComplete ? styles.spinnerFading : ""}`} />}67 <div className={className}>68 {icon === "clock" && <AnimatedClock className={styles.clockIcon} />}69 {icon === "check" && <Check className={styles.checkIcon} size={14} strokeWidth={3} />}70 {icon === "error" && <AlertCircle className={styles.errorIcon} size={14} strokeWidth={2.5} />}71 </div>72 </div>73 );74}7576type ProgressCardProps = {77 steps: Step[];78};7980export function ProgressCard({ steps = [] }: ProgressCardProps) {81// … truncated
What it pulls in
npm packages
Other registry items
Files it writes
More from Roi UI
All 123 items| Component | Registry | Kind | Access | Installs | Command |
|---|---|---|---|---|---|
| Accordionaccordion | Roi UI | Other | Free | no deps · 2 files | |
| Accordion (Tailwind)accordion-tailwind | Roi UI | Other | Free | no deps | |
| AI Chatai-chat | Roi UI | Other | Free | no deps · 2 files | |
| AI Chat (Tailwind)ai-chat-tailwind | Roi UI | Other | Free | no deps | |
| Alertalert | Roi UI | Other | Free | 1 dep · 2 files | |
| Alert Dialogalert-dialog | Roi UI | Other | Free | no deps · 2 files | |
| Alert Dialog (Tailwind)alert-dialog-tailwind | Roi UI | Other | Free | no deps | |
| Alert (Tailwind)alert-tailwind | Roi UI | Other | Free | 1 dep |
