atom · stable · extension · since 2026-09
ProgressBar
Purpose
A progression that can be measured, on the native element: the browser says “barre de progression, 40 %” without an ARIA attribute, and a label names it. Without a value the bar is indeterminate, the honest state for a wait whose length is unknown.
When to use, when not
Use it for a task with a measurable advance: an export, an analysis over pages, criteria decided out of 106. For a wait with no measure inside a zone, BusyRegion; for a button waiting on the server, Button with busy.
Anatomy
- The label.
- The bar, hollow, filled with the action ink.
- The percentage, written.
Props
| Name | Type | Default | What it does |
|---|---|---|---|
id | string | The element's id; the label's `for` is the same value. | |
label | string | The visible label: what is progressing, as a noun phrase. Read only by assistive technology on a strip. | |
value? | number | undefined | The progress, from 0 to `max`. Absent, the bar is indeterminate. | |
max? | number | 100 | The value that means done. |
showValue? | boolean | true | Writes the percentage next to the bar. Never on a strip. |
strip? | boolean | false | A thin line across a shell's edge, the label hidden and the value unwritten: for a progress the screen says in words elsewhere. |
class? | string | '' | Layout classes only. |
States
Measured and running, indeterminate, done, and the strip across a shell’s edge.
done
Light
Dark
320 px, light
320 px, dark
216 px, light
Forced colours, captured

indeterminate
No value: a wait whose length is unknown, said as such.
Light
Dark
320 px, light
320 px, dark
216 px, light
Forced colours, captured
measured
The native element with its label; the value is read from the bar, the milestones from the region.
Light
Dark
320 px, light
320 px, dark
216 px, light
Forced colours, captured

strip
The thin line across the top of the extension’s panel: the label is read, not shown, and the sentence under it says the progress in words.
Light
38 % des critères évalués
Dark
38 % des critères évalués
320 px, light
38 % des critères évalués
320 px, dark
38 % des critères évalués
216 px, light
38 % des critères évalués
Forced colours, captured
Accessibility contract
- Role and name:
progressbar, named by the label, the value the element’s own. - Keyboard, focus: none.
- Live regions: none here. The bar carries the value continuously; announcing every percent would be chatter. Milestones are the page’s through LiveRegion: started, half, done, and done matters most, since without it the user who does not see the screen waits for a result already there.
Content rules
French. The label is what progresses, as a noun phrase: “Export du rapport”.
Do and don’t
- Do announce the end through a live region.
- Do not draw the bar with a div and
aria-valuenow; the element exists. - Do not hide the percentage unless the label already says it.
- Do use
striponly where the screen says the progress in words next to it, as the panel’s sentence “38 % des critères évalués” does; the strip alone would leave the figure to colour.
Examples
<ProgressBar id="export" label="Export du rapport" value={percent} />
<LiveRegion message={milestone} /> Surfaces
- Extension: the strip of the audit’s progress over the panel’s header; the page analysis, when the panel is on Svelte.
- App: the bulk export; not ported yet.
Related
BusyRegion, LiveRegion.
Decisions
- 2026-09-24: the native element, styled through its pseudo-elements, since a remade bar would need three ARIA attributes for what the browser already says.
- 2026-09-27:
stripdraws the same element as the thin line across the extension panel’s top, which was adivwithrole="progressbar"and three ARIA attributes; the label is hidden rather than dropped, so the bar keeps its name.
Criteria held by construction
- 7.1, Chaque script est-il, si nécessaire, compatible avec les technologies d'assistance ?
The native progress element carries its role and its value; nothing is declared by hand, and an absent value is the indeterminate state. - 11.1, Chaque champ de formulaire a-t-il une étiquette ?
The label's for and the element's id come from one prop, so the bar is named like a field. - 3.1, Dans chaque page web, l'information ne doit pas être donnée uniquement par la couleur. Cette règle est-elle respectée ?
The value is written as a number next to the bar; the fill only draws it.
Tokens it reads
- Colour:
--rl-action,--rl-ink,--rl-ink-soft,--rl-line,--rl-sunken - Typography:
--rl-font-mono,--rl-weight-bold,--rl-text-sm - Spacing:
--rl-space-1,--rl-space-1-5,--rl-space-3 - Layout:
--rl-border