Avara UI

Progress

A flexible, smoothly animated progress indicator built to handle loading states, storage meters, or step-by-step wizards. Every form fills from zero when it first appears, and any number it shows counts up alongside the fill.
This block is split into composable pieces: the core <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.
Colour carries state. 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.
Each example shows a live preview with the exact code to copy.

Progress

The bare bar. Drag the slider above to move it; hover the bar for the readout.

value
and max are 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. duration sets the mount run in milliseconds.
Percentage45%

Circular progress

The same value, drawn as a ring.

circleSize{140}
sets the outer diameter in pixels; barSize still controls the ring thickness.
variant"glow"
lights the filled arc with the theme color instead of leaving it flat.

Circular with a custom center

Passchildren
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

npx shadcn@latest add @algorize-ui/progress

components/custom/blocks/ProgressBlock.tsx 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

Setindeterminate
when the duration is unknown. A short bar slides along the track; value is ignored and reduced-motion users get a still, full bar.

Step indicator

SetshowValue{false}
and give max a 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 its from percent until the next threshold. Works on Progress and CircularProgress alike.
status
on both Progress and ProgressField: "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

Explore the Progress bar's features, including smooth value interpolation, indeterminate animations, and accessibility labels.

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

ComponentPropTypeDefaultDescription
Progressvaluenumber0The current progress value to display.
Progressmaxnumber100The maximum possible value. Used internally to calculate the percentage fill.
Progressvariant"default" | "glass" | "glow" | "minimal""default"Determines the visual styling of the track background and the active indicator fill.
Progresscolor"indigo" | "rose" | "emerald" | "zinc" | string"indigo"Applies the active color theme to the progress indicator. Fully supports custom hex codes.
ProgressbarSize"sm" | "md" | "lg""md"Adjusts the vertical thickness (height) of the progress bar track and indicator.
ProgressindicatorClassNamestringundefinedOptional Tailwind classes to append directly to the moving inner fill element.
Progressstages{ 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.
Progressstatus"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.
Progressindeterminatebooleanfalse
Unknown duration: a short bar slides along the track and aria-busy is set. Honours prefers-reduced-motion.
Progresstooltipboolean | (value, max) => ReactNodefalse
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.
Progressanimatebooleantrue
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.
Progressdurationnumber1200
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.
ProgressFieldstatus"active" | "success" | "warning" | "error""active"
Colours the readout and adds a glyph — a check on success, an alert on warning or error.
ProgressFieldhintReactNodeundefined
One line under the bar, in the status colour when a status is set.
ProgressFieldlabelReactNodeundefinedThe text or React element to display on the top-left above the progress bar.
ProgressFieldvaluenumber0The current numerical value passed down to handle display formatting.
ProgressFieldmaxnumber100The maximum numerical value passed down to handle display formatting.
ProgressFieldshowValuebooleantrueIf true, displays the current value/percentage on the top-right above the progress bar.
ProgressFieldvalueFormat(value: number, max: number) => ReactNodeundefinedA custom formatter function. If not provided, it defaults to calculating and displaying [percentage]%.
MultiProgressmaxnumber100The shared denominator every child segment measures its value against.
MultiProgressgapnumber0Pixels between segments. Any value above 0 also rounds each segment's ends; 0 fuses them into one continuous bar.
MultiProgressvariant"default" | "glass" | "glow" | "minimal""default"Styles the shared track behind the segments. Segment fills are colored individually.
MultiProgressbarSize"sm" | "md" | "lg""md"Height of the shared track. Thicker tracks make multi-segment breakdowns easier to read.
ProgressSegmentvaluenumber0This slice's portion of the parent's max. Must be rendered inside a MultiProgress.
ProgressSegmentcolor"indigo" | "rose" | "emerald" | "zinc" | string"primary"Color for this slice alone, so one track can carry several themes. Supports custom hex codes.
ProgressSegmentlabelstringundefinedAccessible name for the slice, also used as its native hover tooltip.
CircularProgressvaluenumber0The current progress value, drawn as a filled arc starting at twelve o'clock.
CircularProgresscircleSizenumber120Outer 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.
CircularProgressbarSize"sm" | "md" | "lg""md"Ring thickness, on the same scale as the bar — 5, 9 and 14 pixels of stroke.
CircularProgressshowValuebooleantrueDraws the percentage in the middle of the ring. Ignored when children are supplied.
CircularProgresschildrenReactNode | (value, max) => ReactNodeundefinedReplaces 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.
CircularProgresstrackClassNamestringundefinedOptional classes for the unfilled ring underneath the arc.