// preview in
saved for every page

Progress

Shows how far a task has gone, like an upload, an export or a setup flow. For a measurement that just sits in a range, such as storage used, use Meter.

Built on Base UIPattern WAI-ARIA progressbarClient componentSource ↗
minimal · light · #3fa34d
Exporting report
x
showValue

Installation

Set up Camaleo once (Installation), then import what you need. The skin you load styles it.

import { Progress } from "@camaleo/react";

Anatomy

A root with a header (label and value) and a track with the fill. Every part has a data-slot you can target from CSS.

trackindicatorUploading invoice-march.pdf 65%
[data-slot="progress"][data-slot="progress-track"] · [data-slot="progress-indicator"]label · value

Examples

Every example is a real file you can copy. They all wear the skin, mode and brand from the bar above.

minimal · light · #3fa34d
Uploading invoice-march.pdf
x
Preparing your backup
x

Unknown duration

When you can't measure the work yet, pass value={null}. The number disappears, a segment slides along the track (it pulses in place with reduced motion), and screen readers hear that the bar is busy, not stuck at 0%.

Exporting project25% · Compressing files
x

Stage by stage

Click through it. Naming the current stage in valueLabel tells people what is happening, not just how much is left.

Copying photos16 of 20 photos
x

Count instead of percent

Set max to the real total and show "16 of 20 photos". People understand items better than a percentage.

Account setupStep 3 of 5
x

Steps in a setup flow

For a short wizard, value={3} with max={5} reads as "Step 3 of 5", which says how much is left.

Uploading vacation.mp41.2 of 3 GB
x

What screen readers hear

valueLabel only changes the visible text. Pass getAriaValueText too, so "1.2 of 3 GB" is read as words and not as "40 percent".

  • contract-signed.pdfDone
    x
  • site-photos.zip18 of 40 MB
    x
  • budget-2026.xlsxWaiting
    x

A list of uploads

One bar per file, each labelled with the file name, so people can tell which one is done, which is running and which is waiting.

Uploading catalog-2026.pdf
x

With a cancel action

Click it. Long tasks need a way out. After canceling, say what happened in a status message and offer to try again.

In context

Progress bars sit next to the task they track. These are whole pieces of UI you can copy, in the skin you picked.

Upload queue

sales-deck-q3.pdf14.2 of 20 MB
Uploading sales-deck-q3.pdf
x
Upload queueCard · Progress · Button

Complete your profile

Add your phone number and confirm your company details to unlock invoicing.

Profile3 of 5 steps
x
Profile setupCard · Progress · Button

Import contacts

contacts-crm.csv · 3,000 rows

Importing contacts1,240 of 3,000
x
Contact importCard · Progress · Button

Guidelines

Downloading update 4.2
x
DoSay what is running.

"Downloading update 4.2" tells people what they are waiting for, and gives the bar its accessible name.

Downloading
x
Don’tA bare verb and no number.

"Downloading" what? Without a name and a value, people can't decide whether to wait.

Building your site
x
DoNo estimate? Say it's busy.

If you can't measure the work, use value={null} instead of guessing a number.

Processing
x
Don’tDon't invent a percentage.

A timer that races to 99% and then waits breaks trust. People give up on a bar they don't believe.

Props

PropTypeDefaultDescription
labelReactNode—Visible label; also names the progress bar for assistive tech.
showValuebooleantrueShow the formatted value next to the label.
valueLabelReactNode—Replaces the visible value text, for example "16 of 20 photos". It only changes what is shown: pass getAriaValueText so screen readers hear the same thing.
formatIntl.NumberFormatOptions—Options to format the value.
getAriaValueText(formattedValue, value) => string—The text screen readers hear for the value. Defaults to the percentage.
localeIntl.LocalesArgument—The locale used by Intl.NumberFormat when formatting the value. Defaults to the user's runtime locale.
maxnumber100The maximum value.
minnumber0The minimum value.
value*number | null—How far the task has gone, between min and max. null means the duration is unknown.

Other Base UI progress root props and native <div> attributes pass through.

Styling hooks

Attributes

data-progressingpresent while the task runs
data-completepresent when value reaches max
data-indeterminatepresent when value is null
data-slot"progress" · "progress-track" · "progress-indicator"

Tokens it reads

Color

--cml-accent--cml-fg--cml-fg-muted--cml-field-shadow--cml-surface

Shape & size

--cml-font-size-label--cml-gap--cml-radius-pill

Type & motion

--cml-duration-base--cml-ease-standard--cml-font-weight-label

This component only

--cml-slider-fill-image

Accessibility

—Not focusable. It reports status; the controls around it take the focus.
Was this page helpful? · Edit this page on GitHub