Progress

Determinate movement toward a visible end.

v1.0.0·Updated Jul 8, 2026 · 10:45
Live Demo — Fully Interactive
Determinate movement toward a visible end
Uploading files38%
Sizes — S · M · L
Configuration
Shape
Mode
Size
Label
Value
Progress62%
<Progress variant="bar" value={62} showValue />
Behavior — The Engineering Contract
PropTypeNotes
valuenumber (0–100)Determinate fill; omit for indeterminate
variantbar · circular · topLinear track, SVG ring, or a page-load top bar
top (page load)Thin bar pinned to the top edge; trickles up, then completes
sizeS · M · LBar height 4 / 6 / 9px
showValue / labelboolean / stringPercent readout and a leading label
indeterminatebooleanSliding fill when progress is unknown

Use Progress when you can measure how far along a task is. For an unmeasurable wait use a Loader; for multi-step flows use a Stepper.

Anatomy
Uploading62%
1LabelWhat is progressing, on the left.
2ValueThe exact percent, on the right.
3FillWarm track to the current value; green at 100.
Do's and Don'ts
✓ Do
Step 2 of 366%

Show the number when you can. A percent is a promise kept.

✕ Don't

Don't sit at 100% while still working. Snap to full only when done.

✓ Do

Use the indeterminate slide only when you truly can't measure.

✕ Don't
jumps: 4% → 90% → 30%

Don't let the bar jump backward. Progress moves one way.

In context: Examples
A · Upload
video.mp448%

File and media uploads with a live percent.

B · Usage meter
Storage82%

Quota and usage meters toward a limit.

C · Ring
75%

Compact ring for cards and dashboards.

Measurements & Tokens
TokenValueRole
--prog-h4 / 6 / 9pxBar heights S / M / L
--prog-track#242428Unfilled track
--prog-fill#FF7A00Progress fill
--prog-done#1FA35CCompleted at 100%
--prog-radius999pxFully rounded track and fill
--prog-ease0.35sFill width transition
Code
<div class="o-prog">
  <div class="o-prog__head"><span>Uploading</span><b>62%</b></div>
  <div class="o-prog__bar">
    <div class="o-prog__fill" style="width:62%"
         role="progressbar" aria-valuenow="62" aria-valuemin="0" aria-valuemax="100"></div>
  </div>
</div>