Progress

A horizontal bar that fills as work completes.

Basic

Place a .progress__track with a single .progress__bar inside .progress. The wrapper carries role="progressbar" and the aria value attributes; the bar paints the fill via inline width. Add .progress__label and .progress__value to caption it.

Intents

Recolor the fill with an intent modifier on .progress__bar. The track stays neutral so contrast holds in both themes.

Sizes

Default is a thin strip; --sm compresses to a hairline; --lg grows to a label-friendly height.

Animated

Add .progress__bar--animated for a soft sheen that sweeps across the fill every few seconds — a quiet "still working" signal. Dropped under reduced-motion.

Indeterminate

Add data-indeterminate on .progress when the duration is unknown. A partial bar slides across the track on loop; drop the inline width (the CSS owns it) and skip aria-valuenow so assistive tech announces it as indeterminate.

Customization

These variables retune .progress. Override on the element, a parent scope, or :root. The track is pilled by default; set --progress-radius to flatten.

VariableUse
--progress-heightTrack height; size modifiers reassign this
--progress-radiusTrack corner radius; pilled by default
--progress-header-gapSpace between the caption row and the track
--progress-bgTrack background (unfilled portion)
--progress-bar-bgBar fill (intent modifiers retune)
--progress-bar-transition-durationWidth tween when the value changes
--progress-label-font-sizeCaption font size
--progress-label-font-weightLabel weight
--progress-label-colorLabel text color
--progress-value-colorValue text color
--progress-shimmer-colorAnimated sheen color
--progress-shimmer-durationAnimated cycle length
--progress-indeterminate-durationIndeterminate sweep cycle length