Shadcn Progress Components

Displays an indicator showing the completion progress of a task, typically displayed as a progress bar. Every progress variant renders consistently with Radix UI and Base UI. Browse our collection of 10 Shadcn Progress variants.

75%

CPU Usage45%
Memory Usage62%
Disk Usage38%

Setup Progress2/4
Account
Profile
Settings
Review

Project Status
Design Phase85%
Development60%
Testing30%

Storage UsageMedium
7.5 GB of 10 GB used75%

File Upload0%

75%
Unlock premium components
Get full control of shadcn/ui components, blocks and instances, including future additions.

Explore Shadcn Blocks

Ready-made page sections built with the same components.

View all blocks

Shadcn Progress Component

The Shadcn Progress is a horizontal bar that shows how much of a task is complete. Uploads, onboarding steps, storage quotas and project milestones all use it, because a filling bar tells users at a glance how far along they are and how much is left.

Stacked CPU, memory and disk bars, a setup checklist that computes its value from completed steps and an upload button that fills the bar in stages show the range of this React progress bar component. It is built with shadcn/ui and Tailwind CSS on the Progress primitive from Radix UI, which renders the track with the progressbar role.

What is the Shadcn Progress Component?

A progress bar has two layers: a muted track that spans the full width, and an indicator inside it that slides in from the left based on the value prop, a number from 0 to 100. The shadcn/ui version moves the indicator with a CSS transform and a transition, so the bar animates smoothly whenever the value changes.

Use a progress bar when you know how much of a task is complete. When the duration is unknown, show a Spinner instead, and while page content is loading, a Skeleton gives a better preview of the layout. If users should set the value themselves, use a Slider.

Anatomy of the Shadcn Progress

PartDescription
ProgressThe only exported part. It renders the Radix UI root as the track and an indicator inside it (data-slot="progress-indicator"). Pass the percentage to value, and style the track with className and the indicator with a [&>div] selector.

10 Shadcn Progress Variants

Each progress variant listed here is previewed live at the top of this page, together with its source code and install command.

  • Basic animated: A bar that animates from 13% to 66% after mount, showing the built-in transition.
  • Custom colors and height: Yellow and green bars with a tinted track, and a thicker bar using a height class.
  • With label and percentage: An Upload Progress label above the bar with the value on the right, or the percentage next to the bar.
  • Multiple metrics: CPU, memory and disk usage bars stacked with their own labels, like a system monitor.
  • Step progress: A setup checklist where the bar is calculated from completed steps and each step shows a check mark.
  • Card with milestones: A Project Status card with design, development and testing phases.
  • Status and interactive upload: Storage usage with a Low, Medium or High badge, and a Start Upload button that fills the bar in steps.

How to Install the Shadcn Progress Component

Set up shadcn/ui in your project if you have not already, then add the Shadcn UI Kit registry to your components.json once:

{
  "registries": {
    "@shadcnuikit": "https://shadcnuikit.com/r/{name}.json"
  }
}

Then install a progress variant by its name:

npx shadcn@latest add @shadcnuikit/progress1

The same command works with pnpm dlx, yarn dlx and bunx --bun. Each variant has a copy button for every package manager, and the code is added to your project as plain React and Tailwind CSS that you can edit freely.

How to Use the Shadcn Progress Component

Import Progress from components/ui/progress and pass a number between 0 and 100 to value. Update the value from state to animate the bar, and mirror it in aria-valuenow so screen readers hear the current value.

"use client"

import * as React from "react"

import { Progress } from "@/components/ui/progress"

export function UploadProgress() {
  const [progress, setProgress] = React.useState(13)

  React.useEffect(() => {
    const timer = setTimeout(() => setProgress(66), 500)
    return () => clearTimeout(timer)
  }, [])

  return (
    <div className="w-full max-w-sm space-y-2">
      <div className="flex justify-between text-sm">
        <span>Uploading report.pdf</span>
        <span className="text-muted-foreground">{progress}%</span>
      </div>
      <Progress
        value={progress}
        aria-valuenow={progress}
        aria-label="Upload progress"
      />
    </div>
  )
}

Why Use the Shadcn Progress Component

  • Instant feedback: Users see that a task is running and how much is left, which reduces uncertainty and abandoned actions.
  • Accessible foundation: Radix UI renders role="progressbar" with aria-valuemin and aria-valuemax, and you add a label and the current value.
  • Smooth animation: The indicator moves with a transform and a CSS transition, which is cheap for the browser to animate.
  • One prop API: Pass a value and you are done; everything else is regular Tailwind CSS classes.
  • Theme aware: The track uses bg-muted and the indicator bg-primary, so the bar follows your palette and dark mode.

Common Progress Use Cases

  • File uploads: Show upload or download progress with the percentage next to the file name.
  • Onboarding and setup: Track how many steps of a signup or profile setup are complete.
  • Usage and quotas: Storage, bandwidth or plan limits in billing and account pages.
  • Project tracking: Milestones and phase completion in dashboards and project cards.
  • System monitoring: CPU, memory and disk usage in admin panels.
  • Courses and goals: Lesson completion, reading progress or fundraising goals.

Customizing the Shadcn Progress

Change the height with a class such as h-3, the track color with a background class on Progress, and the indicator color with [&>div]:bg-green-500. To keep colors consistent across themes, prefer theme tokens like bg-primary/20 and bg-primary, or generate a palette with the free Theme Generator.

For status colors, pick the indicator class from the value with cn():

<Progress
  value={usage}
  className={cn(
    "h-2.5",
    usage >= 80 && "[&>div]:bg-destructive"
  )}
/>

Progress Accessibility

The Radix UI primitive renders the bar with role="progressbar" with aria-valuemin and aria-valuemax. The shadcn/ui Progress uses value only to position the indicator and does not forward it to the Radix root, so the root has no aria-valuenow and its data-state stays indeterminate. Pass aria-valuenow yourself, or forward value to ProgressPrimitive.Root in your copy of the component. Give every bar an accessible name, either with aria-label or with a visible label linked through aria-labelledby.

The bar is not interactive, so it has no keyboard behavior. Show the percentage as text next to it, because color and width alone are not enough for every user, and do not rely only on red, yellow and green to communicate a status.

Progress Best Practices

  • Always pair the bar with a label that says what is progressing.
  • Show the percentage or a count such as 2/4 when the exact number matters.
  • Use a Spinner when you cannot measure progress, instead of a bar that jumps or stalls.
  • Update the value in reasonable steps; very frequent updates add re-renders without visible benefit.
  • Keep the track visible so users can see the remaining part of the task.
  • Combine the bar with a status badge or text for usage limits, not color alone.

Components Related to Progress

Shadcn Progress FAQ

Style the track with a background class on Progress and the indicator with an arbitrary child selector, for example className="bg-green-500/20 [&>div]:bg-green-500". Theme tokens such as bg-primary keep the colors consistent in dark mode.

Pass a height class to Progress, such as className="h-3" or h-1 for a thin line. The indicator fills the full height automatically.

Keep the value in state and update it with setState, setTimeout or setInterval, or from an upload event. The indicator already has a transition, so every new value animates smoothly.

Place the value in a span next to the bar with a flex container, or above it in a row with the label. Rendering it as text also helps users who cannot rely on the bar width.

Progress only displays a value that your code sets, and users cannot change it. Slider is an input that users drag to choose a value. All progress variants on this page are free to use.

The shadcn/ui Progress component uses value to move the indicator but does not pass it to the Radix UI root, so aria-valuenow is missing. Add aria-valuenow to Progress, or forward value to ProgressPrimitive.Root in components/ui/progress.tsx, and give the bar an aria-label.

Looking for something else? Browse all shadcn/ui components or ready-made UI blocks built with them.