# Multi-step progress indicator

> Multi-step progress indicator

A shadcn/ui block from the [@reui](https://reui.io) registry, listed on [shadcn.exchange](https://shadcn.exchange/r/reui/c-progress-7).

- Page, with a live preview: https://shadcn.exchange/r/reui/c-progress-7
- Screenshot: https://abzjhwgwpdpz7ua5.public.blob.vercel-storage.com/shots/reui/c-progress-7-light-26f795663d2c3ff0.png
- Registry item: https://reui.io/r/new-york-v4/c-progress-7.json
- Listed: 2026-10-13, source last changed 2026-10-13

## Install

```bash
npx shadcn@latest add https://reui.io/r/new-york-v4/c-progress-7.json
```

Run it in a project that has shadcn/ui set up. It adds the files below and installs what they depend on.

## Dependencies

- Registry items: `progress`

## Files

### `c-progress-7.tsx`

```tsx
import { Progress } from "@/components/ui/progress"
import { IconPlaceholder } from "@/app/(create)/components/icon-placeholder"

const steps = [
  { label: "Account", completed: true },
  { label: "Profile", completed: true },
  { label: "Preferences", completed: false },
  { label: "Review", completed: false },
]

export function Pattern() {
  const completedSteps = steps.filter((s) => s.completed).length
  const progressValue = (completedSteps / steps.length) * 100

  return (
    <div className="mx-auto w-full max-w-xs space-y-4">
      <div className="flex items-center justify-between">
        <span className="text-sm font-medium">Setup Progress</span>
        <span className="text-muted-foreground text-xs">
          {completedSteps} of {steps.length} steps
        </span>
      </div>
      <Progress value={progressValue} />
      <div className="flex flex-col gap-2">
        {steps.map((step) => (
          <div key={step.label} className="flex items-center gap-2 text-sm">
            {step.completed ? (
              <IconPlaceholder
                lucide="CircleCheckIcon"
                tabler="IconCircleCheck"
                hugeicons="CheckmarkCircle01Icon"
                phosphor="CheckCircleIcon"
                remixicon="RiCheckboxCircleLine"
                className="text-success size-4"
                aria-hidden="true"
              />
            ) : (
              <IconPlaceholder
                lucide="CircleIcon"
                tabler="IconCircle"
                hugeicons="CircleIcon"
                phosphor="CircleIcon"
                remixicon="RiCircleLine"
                className="text-muted-foreground size-4"
                aria-hidden="true"
              />
            )}
            <span
              className={
                step.completed ? "text-foreground" : "text-muted-foreground"
              }
            >
              {step.label}
            </span>
          </div>
        ))}
      </div>
    </div>
  )
}
```
