Progress

How far a task has got — an import, a sync, an onboarding checklist. The linear bar takes its label above or beside it with the value in mono; ProgressCircle is the same measure as a ring where a bar would not fit. Pass null while the total is unknown and the bar slides instead. For a share of a whole that is not a task, use Meter; for loading content, Skeleton.

import { Progress, ProgressCircle } from "@puckoops/camelot";
Importing transactions
NameDescriptionDefaultControl
value*
null for unknown
number | null
-
010064
max
number
100
label
ReactNode
-
labelPosition
top puts the label and value above the bar; side puts them in one row with it.
"top""side"
"top"
labelPosition
showValue
boolean
true
format
(value: number, max: number) => string
defaultFormat-
size
"thin""default"
"default"
size
className
string
-
aria-label
string
-

When to use

Use Progress for work that finishes: an import, a sync, an onboarding checklist. Label it with the task and let the value read in mono. ProgressCircle fits where a bar would not, such as a card corner. Pass null while the total is unknown. Never use either for content that is loading; that is Skeleton.

  • Use Meter instead for a share of a whole that is not a task, such as capacity.
  • Use Skeleton instead while content loads.
  • Use Stepper instead when the steps have names.

Examples

Label Beside

One row, with a count instead of a percentage.

Profile

Indeterminate

While the total is unknown the bar slides; with reduced motion it rests as a quiet full bar.

Preparing the export

Thin

4px without a label, inside a row; the value stays at the end.

Running

The fill moves by transform as the value changes.

Importing transactions

Circle

Small beside text, medium alone, large with the value inside, and indeterminate.

Syncing
Onboarding

All Variants

Top and side labels, unknown, thin and complete, and the three ring sizes.

Importing transactions
Profile
Preparing the export
Upload complete
Syncing
Onboarding