Progress Ring

PreviousNext

A circular progress indicator whose arc and centre value spring from one motion source, with a check that pops in on completion.

0%
0%
Storage
0%
Coverage
Onboarding

Installation

pnpm dlx shadcn@latest add https://matos-ui.com/r/progress-ring.json

Usage

import { ProgressRing } from '@/components/matos-ui/progress-ring'
<ProgressRing value={64} aria-label="Monthly usage" />

The arc and the centered percentage are driven by a single motion value, so they never fall out of sync no matter how fast value changes. The spring character comes from the shared motion tokens — pick a tier rather than tuning stiffness by hand.

<ProgressRing value={progress} tier="slow" size="lg" />

Put your own content in the middle by passing children — the animated value and the completion check step aside:

<ProgressRing value={82} size="lg">
  <span className="text-sm font-semibold">4.2k</span>
</ProgressRing>

Motion is gated on prefers-reduced-motion: the ring snaps to its value and the count-up and pop are skipped.

Reference

ProgressRing Props

PropTypeDefaultDescription
valuenumber-Progress from 0 to 100. Values outside the range are clamped.
size"sm" | "md" | "lg""md"Ring diameter and centre type scale.
thicknessnumber6 / 8 / 10Stroke width in viewBox units (the ring is a 100-unit square).
tier"fast" | "moderate" | "slow" | "playful""moderate"Spring character for the fill and count-up.
gradientbooleantrueDraw the arc as a primarychart-2 gradient.
showValuebooleantrueRender the animated percentage in the centre.
checkOnCompletebooleantrueSwap the centre for a check once value reaches 100.
childrenReactNode-Replaces the centre entirely.
aria-labelstring"Progress"Accessible name for the progressbar.