Minimal
Set --wf-progress-value inline. The default bar color is the primary brand color.
<div class="wf-progress" style="--wf-progress-value: 55%">
<div class="wf-progress-bar"></div>
</div>
Linear progress bars and circular ring indicators. Bars are pure CSS - set --wf-progress-value to control fill. Rings use a conic-gradient driven by --wf-progress-percent (0–100, no unit).
Set --wf-progress-value inline. The default bar color is the primary brand color.
<div class="wf-progress" style="--wf-progress-value: 55%">
<div class="wf-progress-bar"></div>
</div>
wf-progress-wrap stacks a label row above the bar. wf-progress-value-label right-aligns the numeric value.
<div class="wf-progress-wrap">
<div class="wf-progress-label">
<span>Storage</span>
<span class="wf-progress-value-label">72%</span>
</div>
<div class="wf-progress" style="--wf-progress-value: 72%">
<div class="wf-progress-bar wf-progress-info"></div>
</div>
</div>
A standard set of colors can be applied to each progress bar.
<!-- Color on the bar -->
<div class="wf-progress" style="--wf-progress-value: 65%">
<div class="wf-progress-bar wf-progress-primary"></div>
</div>
Applies sm, lg, and xl sizes.
<div class="wf-progress wf-progress-sm" style="--wf-progress-value: 70%">
<div class="wf-progress-bar"></div>
</div>
<div class="wf-progress wf-progress-lg" style="--wf-progress-value: 70%">
<div class="wf-progress-bar"></div>
</div>
<!-- XL: text fits inside the bar -->
<div class="wf-progress wf-progress-xl" style="--wf-progress-value: 70%">
<div class="wf-progress-bar wf-progress-primary">70%</div>
</div>
Applies border-radius: 999rem to both the track and fill.
<div class="wf-progress wf-progress-rounded" style="--wf-progress-value: 65%">
<div class="wf-progress-bar wf-progress-primary"></div>
</div>
Diagonal stripe overlay on the fill. Works with any color or size.
<div class="wf-progress wf-progress-striped wf-progress-lg"
style="--wf-progress-value: 60%">
<div class="wf-progress-bar wf-progress-primary"></div>
</div>
Scrolls the stripes. Always combine with wf-progress-striped .
<div class="wf-progress wf-progress-striped wf-progress-animated wf-progress-lg"
style="--wf-progress-value: 70%">
<div class="wf-progress-bar wf-progress-primary"></div>
</div>
A looping shuttle animation. No --wf-progress-value is needed – the bar width and position are driven entirely by the animation.
<div class="wf-progress wf-progress-indeterminate">
<div class="wf-progress-bar wf-progress-primary"></div>
</div>
Place multiple wf-progress-bar children inside the container. Set --wf-progress-value on each bar individually. The first and last children receive the appropriate border-radius from the track.
<div class="wf-progress wf-progress-multi wf-progress-lg">
<div class="wf-progress-bar wf-progress-primary" style="--wf-progress-value: 35%"></div>
<div class="wf-progress-bar wf-progress-info" style="--wf-progress-value: 25%"></div>
<div class="wf-progress-bar wf-progress-alert" style="--wf-progress-value: 15%"></div>
<div class="wf-progress-bar wf-progress-secondary" style="--wf-progress-value: 5%"></div>
</div>
Absolute overlay pinned to the top edge of a position: relative parent. No border, no radius.
Loading content…
<div class="wf-relative">
<div class="wf-progress wf-progress-attached-top"
style="--wf-progress-value: 100%">
<div class="wf-progress-bar wf-progress-primary"></div>
</div>
<p>Loading content…</p>
</div>
Removes margin, border, and radius for embedding inside an existing bordered element.
Processing upload…
<div class="wf-overflow-hidden">
<div class="wd-card-pad-sm"><p>Processing upload…</p></div>
<div class="wf-progress wf-progress-attached wf-progress-lg"
style="--wf-progress-value: 100%">
<div class="wf-progress-bar wf-progress-positive"></div>
</div>
</div>
Applies 50% opacity and removes pointer events. Works with any bar variant.
<div class="wf-progress wf-progress-disabled wf-progress-lg"
style="--wf-progress-value: 60%">
<div class="wf-progress-bar wf-progress-primary"></div>
</div>
A pure-CSS circular indicator using conic-gradient . Set --wf-progress-percent to an integer 0–100 (no unit). Text inside uses wf-progress-ring-value ; a caption below uses wf-progress-ring-label .
Basic rings revert to the default dark color.
Empty
Quarter
Progress
Complete
<div class="wf-progress-ring" style="--wf-progress-percent: 60">
<span class="wf-progress-ring-value">60%</span>
</div>
<p class="wf-progress-ring-label">Progress</p>
Rings can use standard colors.
primary
secondary
positive
negative
alert
info
sage
indigo
<div class="wf-progress-ring wf-progress-primary" style="--wf-progress-percent: 70">
<span class="wf-progress-ring-value">70%</span>
</div>
Ring sizes vary from xs to 2xl.
xs - 3rem
small - 4.5rem
default - 6rem
lg - 8rem
xl - 10rem
2xl - 12rem
<div class="wf-progress-ring wf-progress-ring-xs" style="--wf-progress-percent: 60"></div>
<div class="wf-progress-ring wf-progress-ring-sm" style="--wf-progress-percent: 60">...</div>
<div class="wf-progress-ring" style="--wf-progress-percent: 60">...</div>
<div class="wf-progress-ring wf-progress-ring-lg" style="--wf-progress-percent: 60">...</div>
<div class="wf-progress-ring wf-progress-ring-xl" style="--wf-progress-percent: 60">...</div>
<div class="wf-progress-ring wf-progress-ring-2xl" style="--wf-progress-percent: 60">...</div>
Spinning ring for unknown-duration loading states. No percent value is needed.
<div class="wf-progress-ring wf-progress-ring-indeterminate"></div>
<!-- With color -->
<div class="wf-progress-ring wf-progress-ring-indeterminate wf-progress-primary"></div>
<!-- With size -->
<div class="wf-progress-ring wf-progress-ring-indeterminate wf-progress-ring-lg wf-progress-positive"></div>
| Property | Default |
|---|---|
| --wf-progress-value | 0% |
| --wf-progress-bar-color | var(--primary-color) |
| --wf-progress-track-color | var(--wf-surface-subtle) |
| --wf-progress-height | 0.625rem |
| --wf-progress-radius | var(--wf-radius-2) |
| --wf-progress-stripe-color | rgba(255,255,255,.2) |
| Property | Default |
|---|---|
| --wf-progress-percent | 0 |
| --wf-progress-size | 4.5rem |
| --wf-progress-ring-width | 0.25rem |
| --wf-progress-ring-fill-color | var(--dark-color) |
| --wf-progress-ring-track-color | var(--wf-surface-subtle) |
All modifier classes available on .wf-progress
| Class | Type | Description |
|---|---|---|
| wf-progress | Base | Track container. Set --wf-progress-value: 75% to control fill width. |
| wf-progress-bar | Child | Fill bar. Must be a direct child of wf-progress . Inherits width from --wf-progress-value . |
| wf-progress-wrap / -label / -value-label | Layout | Wrapper with label row. wf-progress-label holds the text; wf-progress-value-label right-aligns the numeric value. |
| wf-progress-sm / -lg / -xl | Size | Track height: sm (0.375rem), default (0.625rem), lg (1rem), xl (1.5rem). |
| wf-progress-rounded | Shape | Full pill radius on the track and bar. |
| wf-progress-* | Color | Color variants. Applied to wf-progress-bar . primary · secondary · alert · positive · negative · info · sage · indigo |
| wf-progress-success / -warning / -error | Semantic | Semantic state colors. Applied to the wf-progress container, not the bar. |
| wf-progress-striped | Modifier | Diagonal stripe overlay on the fill bar. |
| wf-progress-animated | Modifier | Animates the stripes. Use with wf-progress-striped . |
| wf-progress-indeterminate | Modifier | Looping bar of unknown length. No --wf-progress-value needed. |
| wf-progress-multi | Modifier | Multi-segment bar. Multiple wf-progress-bar children, each with its own --wf-progress-value . |
| wf-progress-attached | Position | Inline flush fit – removes margin, border, and radius. Use inside existing bordered containers. |
| wf-progress-attached-top / -bottom | Position | Absolute overlay pinned to the top or bottom edge of a position: relative parent. |
| wf-progress-disabled | State | 50% opacity, pointer-events off. |
| wf-progress-ring | Ring base | Circular indicator. Set --wf-progress-percent: 75 (integer 0–100, no unit). |
| wf-progress-ring-xs / -sm / -lg / -xl / -2xl | Ring size | Ring diameter: xs (3rem), sm (6rem), default (4.5rem), lg (8rem), xl (10rem), 2xl (12rem). |
| wf-progress-ring-value / -label | Ring child | ring-value renders text inside the ring (z-index: 1). ring-label goes below the ring element. |
| wf-progress-ring-indeterminate | Ring state | Spinning indeterminate ring. No percent value is needed. |