Progress
<Progress /> bar for the visual fill, the optional <ProgressField /> wrapper which handles the layout for labels and percentage text, <MultiProgress /> with <ProgressSegment /> children for several values sharing one track, and <CircularProgress /> for the same value drawn as a ring.stages changes the fill as thresholds are crossed — neutral while an operation starts, your brand colour once it is under way, green at 100 — and status overrides everything with the conventional success, warning and error hues so a failed job never looks like it is still running. The field's readout follows: a check on success, an alert on error, and an optional hint line that says what happened.Progress
The bare bar. Drag the slider above to move it; hover the bar for the readout.
value- and
maxare all it needs — the percentage is derived from the two. tooltip- shows the percentage in a bubble at the fill's edge on hover; pass a function to format it.
animate- is on by default: the fill sweeps in from zero when the bar first appears and every later change tweens instead of jumping.
durationsets the mount run in milliseconds.
Circular progress
The same value, drawn as a ring.
circleSize{140}- sets the outer diameter in pixels;
barSizestill controls the ring thickness. variant"glow"- lights the filled arc with the theme color instead of leaving it flat.
Circular with a custom center
- Pass
children - to replace the centred percentage with anything — a count, an icon, a caption. As a function,
(value, max) => node, it receives the value while it counts up so the centre animates with the arc.
Installation
New project? Follow the installation guide to set up Tailwind CSS, shadcn, the cn helper and lucide-react, register the @algorize-ui registry once, then copy your styles from the Themes page.
Install Progress
components/ is written into your project. Copy any snippet from a Usage tab above and it runs.
Install dependencies
Nothing beyond the shared setup — Progress needs only the cn helper and lucide-react, which the installation guide already put in place.
Examples
Statuses
The four states side by side.
status"active"- is the default and draws the theme colour; the other three use the conventional semantic hues on every brand.
Indeterminate
- Set
indeterminate - when the duration is unknown. A short bar slides along the track;
valueis ignored and reduced-motion users get a still, full bar.
Step indicator
- Set
showValue{false} - and give
maxa small number for wizard-style step progress.
Stage colours
Run it: neutral while starting, the brand colour from 10%, green at 100 — or red the moment it fails. The ring and the bar share one value, so they always agree.
stages- is a list of
{ from, color }— each colour takes over from itsfrompercent until the next threshold. Works onProgressandCircularProgressalike. status- on both
ProgressandProgressField:"success","warning"or"error"override every colour and turn the readout green, amber or red with a glyph. hint- is one line under the bar — what happened, or what to do next — in the status colour.
Features
Customizable
Easily adapt the component's styling and behavior to fit your application's unique design system.
Accessible
Built with accessibility in mind, ensuring all users can interact with your application effectively.
Responsive
Fully responsive design that looks and works great across desktop, tablet, and mobile devices.
Counts up
Bars, segments and rings fill from zero on first paint and every readout counts up in step, on one shared easing. Respects prefers-reduced-motion; turn it off with animate=.
Best Practices & Guidelines
Usage Guidelines
Follow standard design principles when implementing this component. Ensure proper contrast, spacing, and context within your layout.
Props Reference
| Component | Prop | Type | Default | Description |
|---|---|---|---|---|
Progress | value | number | 0 | The current progress value to display. |
Progress | max | number | 100 | The maximum possible value. Used internally to calculate the percentage fill. |
Progress | variant | "default" | "glass" | "glow" | "minimal" | "default" | Determines the visual styling of the track background and the active indicator fill. |
Progress | color | "indigo" | "rose" | "emerald" | "zinc" | string | "indigo" | Applies the active color theme to the progress indicator. Fully supports custom hex codes. |
Progress | barSize | "sm" | "md" | "lg" | "md" | Adjusts the vertical thickness (height) of the progress bar track and indicator. |
Progress | indicatorClassName | string | undefined | Optional Tailwind classes to append directly to the moving inner fill element. |
Progress | stages | { from: number; color: ProgressColor }[] | undefined | Colour by threshold. from is a percentage; each stage's
colour applies from that point until the next stage. Also on
CircularProgress. |
Progress | status | "active" | "success" | "warning" | "error" | "active" | Semantic override: emerald, amber or red replace the theme colour and
any stage. Exposed as data-status on the element. Also
on CircularProgress, where it colours the centre readout. |
Progress | indeterminate | boolean | false | Unknown duration: a short bar slides along the track and
aria-busy is set. Honours
prefers-reduced-motion. |
Progress | tooltip | boolean | (value, max) => ReactNode | false | Hover readout in a bubble — at the fill's leading edge on the bar,
above the ring on CircularProgress. true
shows the percentage; a function formats it. Not shown while
indeterminate. |
Progress | animate | boolean | true | Fill from zero on mount and tween every later change of
value; stage colours are crossed on the way. Also on
ProgressField, MultiProgress and
CircularProgress. Off under
prefers-reduced-motion. |
Progress | duration | number | 1200 | Length of the mount fill in milliseconds. Later changes take a slice
proportional to how far they travel, so a 1% tick stays snappy. Set
the same value on a ProgressField and its bar so the
readout keeps step. Also on MultiProgress and
CircularProgress. |
ProgressField | status | "active" | "success" | "warning" | "error" | "active" | Colours the readout and adds a glyph — a check on success, an alert
on warning or error. |
ProgressField | hint | ReactNode | undefined | One line under the bar, in the status colour when a status is set. |
ProgressField | label | ReactNode | undefined | The text or React element to display on the top-left above the progress bar. |
ProgressField | value | number | 0 | The current numerical value passed down to handle display formatting. |
ProgressField | max | number | 100 | The maximum numerical value passed down to handle display formatting. |
ProgressField | showValue | boolean | true | If true, displays the current value/percentage on the top-right above the progress bar. |
ProgressField | valueFormat | (value: number, max: number) => ReactNode | undefined | A custom formatter function. If not provided, it defaults to calculating and displaying [percentage]%. |
MultiProgress | max | number | 100 | The shared denominator every child segment measures its value against. |
MultiProgress | gap | number | 0 | Pixels between segments. Any value above 0 also rounds each segment's ends; 0 fuses them into one continuous bar. |
MultiProgress | variant | "default" | "glass" | "glow" | "minimal" | "default" | Styles the shared track behind the segments. Segment fills are colored individually. |
MultiProgress | barSize | "sm" | "md" | "lg" | "md" | Height of the shared track. Thicker tracks make multi-segment breakdowns easier to read. |
ProgressSegment | value | number | 0 | This slice's portion of the parent's max. Must be rendered inside a MultiProgress. |
ProgressSegment | color | "indigo" | "rose" | "emerald" | "zinc" | string | "primary" | Color for this slice alone, so one track can carry several themes. Supports custom hex codes. |
ProgressSegment | label | string | undefined | Accessible name for the slice, also used as its native hover tooltip. |
CircularProgress | value | number | 0 | The current progress value, drawn as a filled arc starting at twelve o'clock. |
CircularProgress | circleSize | number | 120 | Outer diameter of the ring in pixels; the centred readout scales with it. The glow variant's halo fades out past this edge, the way a box-shadow does. |
CircularProgress | barSize | "sm" | "md" | "lg" | "md" | Ring thickness, on the same scale as the bar — 5, 9 and 14 pixels of stroke. |
CircularProgress | showValue | boolean | true | Draws the percentage in the middle of the ring. Ignored when children are supplied. |
CircularProgress | children | ReactNode | (value, max) => ReactNode | undefined | Replaces the centred readout entirely — use it for a count, an icon, or a caption. As a function it receives (value, max) with the value counting up, so a custom centre animates with the arc. |
CircularProgress | trackClassName | string | undefined | Optional classes for the unfilled ring underneath the arc. |