Progress
Determinate or indeterminate progress, without made-up percentages.
Base UI reference ↗Installation
Run it from the root of a project already set up with zunoui init.
npx zunoui@latest add progressDependencies
What add progress installs alongside the component. The CLI skips any you already have in a compatible version.
ZUNO registry
@zuno/utils
npm
@base-ui/[email protected]
Examples
3 examples · 1 componentLabel and value
ProgressLabel names the bar; ProgressValue formats the percentage.
Live upload
The value advances in steps and completion is announced with role="status".
Indeterminate
value={null} while the duration is unknown; no percentage is shown.
API reference
Keeps the props, events and refs of the matching Base UI primitive, plus ZUNO's styles.
| Prop | Type | Default |
|---|---|---|
valueCurrent progress; null means indeterminate. | number | null | — |
min / maxRange of value. | number | 0 / 100 |
format / localeHow ProgressValue formats and announces the value; locale defaults to en-US so SSR and the client agree. | Intl.NumberFormatOptions / string | percent / "en-US" |
getAriaValueTextCustom spoken text, e.g. "3 of 5 files". | (formatted, value) => string | — |
ProgressLabel / ProgressValueNames the progressbar and shows the formatted value. | span | — |
States
The states that apply to this component and their visual treatment.
| State | Treatment |
|---|---|
| Progressing | Primary bar grows with a short width transition. |
| Complete | Full bar; data-complete is set. |
| Indeterminate | Full bar pulsing; no value shown. |
| Reduced motion | No transition and no pulse. |
Accessibility
The root is a progressbar with aria-valuenow, min and max; ProgressLabel gives it its accessible name.
Use value={null} when the duration is unknown: it becomes indeterminate instead of inventing a percentage.
Updates are not announced on every tick; announce completion yourself (e.g. a toast or role="status" text).
The width change and the indeterminate pulse stop with prefers-reduced-motion.