WebberUI

Circular Progress

An animated percentage ring progress / gauge, supporting gradients, gauge arcs, and a counting reveal.

Shows progress as an SVG ring, with the arc and the central number advancing on a single synchronized animation beat, supporting either a full ring or a gauge.

Loading preview…
npx shadcn@latest add https://webberui.com/r/circular-progress.json

Playground

Tune the props live — the code snippet updates as you go, so you can dial in the look you want before copying it.

72
160
12
360
<CircularProgress />

Installation

npx shadcn@latest add https://webberui.com/r/circular-progress.json

Or, once registries are configured in components.json, install it as @webberui/circular-progress.

Usage

import { CircularProgress } from "@/components/ui/circular-progress";

<CircularProgress value={72} />;

To make a gauge: set arc to less than 360, then use startAngle to align the direction of the opening.

<CircularProgress value={86} arc={270} startAngle={135} />;

Props

PropTypeDefaultDescription
valuenumberProgress percentage (0 to 100)
sizenumber160Component side length (px)
strokeWidthnumber12Ring stroke width (px)
colorstring | string[]cyan-indigo-magenta gradientA single color string, or an array for a gradient along the arc
trackColorstringlow-opacity currentColorTrack color
arcnumber360Total span of the arc (degrees); anything below 360 makes it a gauge
startAnglenumber-90Start angle (degrees); -90 is straight up
durationnumber1.2Duration of the reveal animation (seconds)
delaynumber0Delay before the reveal starts (seconds)
roundedbooleantrueWhether the end caps are rounded
showValuebooleantrueWhether to show the central percentage number
decimalsnumber0Decimal places of the number
suffixstring"%"Suffix after the number
glowbooleanfalseAdds a soft glow in the same color to the progress arc
childrenReactNodeCustom central content, replacing the default number

Accessibility

  • When the user has "reduce motion" enabled at the system level, it renders at the final value directly, without playing the counting or sweeping animation
  • The svg carries role="img" and an aria-label, announcing the current percentage

On this page