Progress

Displays an indicator showing the completion progress of a task.

Upload progress66%
x
Review completion33%
x
Installation
$Terminal
npx shadcn@latest add https://sdk-components.thesqd.com/r/progress.json
Usage
Pass `value` (0–100) to drive the indicator. Use `null` for indeterminate.
TSImport
import { Progress, CircularProgress } from "@/components/ui/progress";
TSExample
import { Progress } from "@/components/ui/progress";

export function Example() {
  return <Progress value={66} label="Upload progress" valueLabel="66%" />;
}
Composition
Anatomy of the Progress primitive.
Progress                          (horizontal bar — pass everything as props)
├── value={0..100 | null}        (null → indeterminate)
├── label={<ReactNode>}          (auto-emits ProgressLabel above the track)
├── valueLabel={<ReactNode>}     (right-aligned percentage / status text)
└── className                    (wraps Progress.Root — typically max-w-sm)

CircularProgress                 (SVG ring sibling — same value semantics)
├── value={0..100 | null}        (null → indeterminate, ring spins)
├── size={number}                (diameter in px, default 40)
├── strokeWidth={number}          (default 4)
├── label={<ReactNode>}          (caption beneath the ring)
├── showValue                    (renders the percent text inside the ring)
└── trackClassName / indicatorClassName

ProgressSteps                    (segmented milestone bar with tooltips)
├── steps={[{ label?, description?, status?, icon?, completed?, current? }, …]}
├── value={number}               (fills the first N segments in brand primary)
├── label={<ReactNode>}          (header — renders "{label}: {value} / {total}")
├── showCount={boolean}          (default true — hide the "4 / 9" count)
└── segmentClassName             (override segment size/rounding)

Need a custom header (icons, multiple values, status pill)? The slot
exports — ProgressLabel, ProgressValue, ProgressTrack, ProgressIndicator —
are still exported as the escape hatch.
Static values
Plain progress bars at common completion checkpoints.
0%
x
33%
x
66%
x
100%
x
Labeled
Pass `label` + `valueLabel` and the header strip auto-emits above the track.
Upload progress66%
x
Review completion33%
x
Animated
A live example that increments on an interval and loops back to zero.
Processing assets12%
x

Simulates an in-flight upload or generation task.

Range label (animated swap)
Drive the `label` from an array of `{ from, to, label }` bands, falling back to a required base `label`. As the value crosses a band boundary, the label text-swaps with a blurred up-and-in animation.
Starting up8%
x

The label is driven by an array of { from, to, label } bands and falls back to the required label; the text swap animates on every band change.

Circular
An SVG ring driven by the same `value` semantics as the bar. Set `size`/`strokeWidth` to scale it, `showValue` to render the percent inside the ring, and `label` to drop a caption beneath it.
25%
50%
75%
Uploading
Done
Circular (indeterminate)
Pass `value={null}` to spin the ring as an indeterminate loader — handy as an inline spinner with an optional `label`.
Loading…
Loading
Auto-animates from 0 toward ~90% on an ease-out curve, then snaps to 100 when `done` flips true. Drop-in replacement for NProgress-style loaders.
Uploading...0%
Progress Steps
A segmented milestone bar — one chunky segment per step, completed segments filled in brand primary, the `current` step highlighted in squad peach. Hovering a segment opens a rich tooltip with the step's `label`, `description` (e.g. a date), and a `status` row with an icon. Header renders as `Your Progress: 4 / 9`.
Your Progress: 4 / 9
API Reference
Props exposed by the Progress primitive.

Progress

PropTypeDefaultDescription
valuenumber | null0Current value 0–100. Pass `null` for an indeterminate progress.
labelReactNodeHeading rendered above the track. Auto-emits a `<ProgressLabel>`.
valueLabelReactNodeRight-aligned label rendered alongside `label` (e.g. `"66%"`).
classNamestringOverride the wrapper layout.

CircularProgress

PropTypeDefaultDescription
valuenumber | nullCurrent value 0–100. Pass `null` for an indeterminate spinner.
sizenumber40Diameter of the ring in pixels.
strokeWidthnumber4Stroke width for both the track and the indicator.
showValuebooleanfalseRender the percent text inside the ring (ignored for indeterminate).
labelReactNodeCaption rendered beneath the ring.
trackClassNamestringClass names applied to the empty track segment.
indicatorClassNamestringClass names applied to the filled indicator segment.

LoadingProgress

PropTypeDefaultDescription
minDurationnumber3000Minimum milliseconds the bar takes to reach 100. While waiting, the bar asymptotes toward ~90%.
donebooleanfalseWhen `true`, animates to 100 (respecting `minDuration`) and fires `onComplete`.
labelReactNodeDefault heading. Used as the fallback when `uploadingLabel`/`completeLabel` are not provided.
uploadingLabelReactNodeHeading shown while value < 100. Falls back to `label` if omitted.
completeLabelReactNodeHeading shown once value reaches 100. Falls back to `label` if omitted.
valueLabelReactNode | booleanRight-aligned status text. Pass `true` to auto-render the rounded percentage.
onComplete() => voidFires once after the bar reaches 100.
easeStartnumber0Starting percentage of the ease-out curve.
easeEndnumber90Ceiling percentage the curve asymptotes toward while waiting.
classNamestringOverride the wrapper layout.

ProgressSteps

PropTypeDefaultDescription
stepsProgressStep[]One segment per entry. Steps with a `label`/`description`/`status` get a hover tooltip.
valuenumberNumber of completed steps — fills the first `value` segments in brand primary. Omit to derive from each step's `completed` flag.
labelReactNodeHeader rendered above the bar as `"{label}: {value} / {total}"`. Omit to hide the header entirely — including the count.
showCountbooleantrueHide the `4 / 9` count after the label.
segmentClassNamestringPer-segment override (height, rounding, colors).

ProgressStep

PropTypeDefaultDescription
labelReactNodeTooltip title (bold first line).
descriptionReactNodeTooltip second line — e.g. a date ("Wed, Jan 16").
statusReactNodeTooltip status row — e.g. "Scheduled". Rendered beside `icon`.
iconReactNodeIcon for the status row. Defaults to a clock when `status` is set.
completedbooleanForce the completed fill (defaults to index < `value`).
currentbooleanHighlight this segment as the current/upcoming step (peach fill).