Skip to main content
BEEQ Progress component overview
Progress bars communicate the status of ongoing tasks such as downloads, uploads, installations, or any operation with measurable completion. They reduce uncertainty by showing how much work is done and how much remains.
Use a determinate progress bar when completion can be calculated against a known total. Use indeterminate only when the duration or completion cannot be determined.

When to use

Use progress bars when
  • The task has a measurable duration and a defined completion point
  • Real-time feedback helps users understand how long they need to wait
  • You need to communicate progress, completion, or error state visually
  • A spinner would feel too vague because the work can be quantified

Do not use progress bars when
  • The task completes instantly and no waiting feedback is needed
  • Progress cannot be tracked reliably and a determinate bar would be misleading
  • A spinner or loading skeleton is a better fit for the context
  • The bar would compete with the main content instead of supporting it

Patterns

With percentage

Show the progress value when users need a clear percentage in addition to the visual bar.

With tooltip

Use a tooltip when you want the progress value attached to the indicator instead of displayed beside the bar.

Determinate

Use a determinate progress bar when the task can be measured against a known completion point.

Indeterminate

Use an indeterminate progress bar when work is in progress but the exact completion point cannot be determined.

Top page progress bar

A progress bar can also appear at the top of the page to communicate loading or update status without interrupting the main content.

Anatomy

BEEQ Progress component anatomy
The progress component is made up of the track, the filled indicator, and the progress value when it is displayed.
PartElementDescription
1Bar indicatorThe filled portion showing the current progress value
2TrackThe background rail representing the full available range
3ValueThe percentage detail shown when the progress value is exposed to the user

Design guidelines

Choose the progress treatment that matches how precise the feedback needs to be.
1

Choose the feedback type

Start with a determinate bar whenever progress can be measured. Switch to indeterminate only when the task is active but cannot be quantified.
2

Choose the emphasis

Use medium thickness by default. Use large only when the progress bar needs stronger visual emphasis in a prominent area.
3

Choose the detail level

Add label for persistent percentage text or enable-tooltip when you want the value attached to the indicator instead.
When indeterminate is enabled, label and enable-tooltip do not render a percentage, because the component cannot represent a specific completion value.

Usage

Default

Use the default progress bar for general task tracking when the process has a measurable completion point.

Options

Large thickness

Use thickness="large" to increase the visual weight of the progress bar in more prominent layouts.

Error

Use type="error" to communicate that a process failed or needs attention.
Always pair a color change with a contextual message. Color alone is not enough to communicate an error state clearly to all users.

Border shape

Use border-shape="square" when you want a straighter edge treatment. The default is rounded.

With label

Add label to display a persistent numeric percentage beside the bar.

With tooltip

Add enable-tooltip to show the current percentage at the indicator. In the current component implementation, the tooltip stays visible while the option is enabled.
Choose enable-tooltip when you want the percentage anchored to the indicator instead of rendered as a separate inline label.

Indeterminate

Use indeterminate when the task is active but the exact completion point cannot be measured.

Best practices

DoPlace descriptive text close to the progress bar so people immediately understand what is being tracked.

Don’tDo not embed text inside the bar itself. It becomes unreadable at low progress values and is harder to interpret accessibly.

DoUse label or enable-tooltip when users need a precise sense of how much work remains.

Don’tDo not use a determinate progress bar when progress cannot actually be measured. That creates false certainty.

DoPair type="error" with a visible message so users who cannot perceive color still understand the failure.

Don’tDo not rely on color alone to communicate error state. Not all users perceive color distinctions.

DoUse indeterminate only when the duration genuinely cannot be measured. Switch to a determinate bar as soon as progress can be tracked.

Don’tDo not use an indeterminate bar as a substitute when a determinate bar is technically possible. It creates unnecessary uncertainty.

Accessibility

  • Built-in progress semantics — the component renders a native <progress> element inside its shadow DOM, which browsers expose as role="progressbar" with aria-valuenow, aria-valuemin="0", and aria-valuemax="100" automatically. Assistive technology reads the current value without additional markup.
  • Indeterminate state — when indeterminate is true, the native element has no value attribute, and assistive technology announces it as an indeterminate progress bar.
  • Provide task context: add a visible label or nearby text that explains what operation the progress bar is tracking.
  • Do not rely on color alone: pair type="error" with a visible message so the failure state is understandable without color perception.
  • Use percentage only when it helps: label or enable-tooltip improves clarity when precise status matters, but it is not required for every short or self-explanatory task.
  • Be careful with motion: if indeterminate animation is distracting in your application, respect prefers-reduced-motion at the app level.

API reference

Properties

PropertyAttributeDescriptionTypeDefault
borderShapeborder-shapeSets the border style of the progress bar"rounded" | "square""rounded"
enableTooltipenable-tooltipIf true, a tooltip showing the current value is rendered at the indicatorbooleanfalse
indeterminateindeterminateIf true, the indeterminate animation is shown and value is ignoredbooleanfalse
labellabelIf true, a percentage label is rendered beside the barbooleanfalse
thicknessthicknessControls the height of the bar"medium" | "large""medium"
typetypeSets the visual type of the progress bar"default" | "error""default"
valuevalueThe current progress value, clamped between 0 and 100number0

Shadow parts

PartDescription
baseThe base container for the internal bq-tooltip component
indeterminateThe <div> container that holds the animated indeterminate indicator
labelThe <div> container that holds the label value in percentage
panelThe container holding the tooltip content
progressThe <div> container that holds the native <progress> element
progress-barThe native <progress> element
triggerThe element that triggers the internal tooltip placement
wrapperThe component wrapper container inside the shadow DOM

CSS custom properties

VariableDescriptionDefault
--bq-progress-bar--heightThe progress bar height0.25rem
--bq-progress-bar--indeterminateWidthThe width of the moving indicator when indeterminate25%
--bq-progress-bar--indicatorColorThe filled indicator colorvar(--bq-ui--brand)
--bq-progress-bar--trackColorThe track colorvar(--bq-ui--secondary)

Resources

Interactive playground

Explore progress bar examples and states in Storybook.

Source code

Browse the component implementation, styles, and tests on GitHub.