Progress
canonThe one canonical progress bar: work that takes minutes — the step in words, an optional number, time left, optional steps; running, done or failed.
Product owner 25 Sep 2026 (FA202): approved as THE one progress bar, 6 px (--sp-2) like .tl-prog instead of the 4 px candidate; the product-extraction bar (.pr-ex) was migrated onto it in acrm !3883, the other scattered bars were inventoried on 26 Sep 2026 (wave B): static ratios moved to Meter (acrm !3898, !3900), .tf-progress/.tf-subs-bar were dead CSS and removed (acrm !3901), .tl-prog in Task list turned out to be dead API and was deleted (acrm !3947). Estimates are written in words ("asi 23 %").
Used in 5 files · 4 areas · 5× — components/mail, components/meetings, components/running, pages/ProduktDetailPage
Default
export const Default = () => (
<div style={{ width: 360 }}>
<Progress
label="Oprava jmen"
value={61}
valueText="61 %"
meta="zbývá asi 7 min"
ariaLabel="Zpracování přepisu"
/>
</div>
);Variants
- Přepis řeči a řečníci
- Oprava jmen6 z 15
- Zápis
export const Variants = () => (
<div style={{ display: 'grid', gap: 'var(--sp-6)' }}>
<Labeled text="bare — step and number only (a row, a toast, a dialog)">
<Progress label="Nahrávám audio" value={84} valueText="84 %" ariaLabel="Nahrávání" />
</Labeled>
<Labeled text="estimate — the step does not report progress; the share comes from time × input length, written in words">
<Progress
label="Přepis řeči a řečníci"
value={23}
valueText="asi 23 %"
meta="zbývá asi 15 min"
ariaLabel="Zpracování přepisu"
/>
</Labeled>
<Labeled text="with steps — done (green check) · running (Loader) · waiting (dashed circle)">
<Progress
label="Oprava jmen"
value={61}
valueText="61 %"
meta="zbývá asi 7 min"
ariaLabel="Zpracování přepisu"
steps={[
{ label: 'Přepis řeči a řečníci', state: 'done' },
{ label: 'Oprava jmen', state: 'run', detail: '6 z 15' },
{ label: 'Zápis', state: 'todo' },
]}
/>
</Labeled>
</div>
);States
export const States = () => (
<div style={{ display: 'grid', gap: 'var(--sp-6)' }}>
<Labeled text="indeterminate — value unknown (queue): a segment runs along the track, no number">
<Progress label="Čeká ve frontě" meta="zbývá asi 19 min" ariaLabel="Zpracování přepisu" />
</Labeled>
<Labeled text="running — measured value, accent fill">
<Progress label="Čtu podklady" value={45} meta="3 z 7 dokumentů" ariaLabel="Čtení podkladů" />
</Labeled>
<Labeled text="done — positive fill">
<Progress
label="Hotovo"
value={100}
tone="done"
meta="Navrženo 12 hodnot"
ariaLabel="Čtení podkladů"
/>
</Labeled>
<Labeled text="failed — critical fill, the reason in meta">
<Progress
label="Čtení podkladů selhalo"
value={100}
tone="failed"
meta="Dokument se nepodařilo otevřít"
ariaLabel="Čtení podkladů"
/>
</Labeled>
</div>
);Composition
- Přepis řeči a řečníci
- Oprava jmen
- Zápis
export const Composition = () => (
<div
style={{
width: 420,
display: 'grid',
gap: 'var(--sp-4)',
padding: 'var(--sp-5)',
border: '1px solid var(--border)',
borderRadius: 'var(--radius-md)',
background: 'var(--bg-canvas)',
}}
>
<span style={{ font: 'var(--h3)', color: 'var(--fg)' }}>Přepis</span>
<Progress
label="Přepis řeči a řečníci"
value={23}
valueText="asi 23 %"
meta="zbývá asi 15 min"
ariaLabel="Zpracování přepisu"
steps={[
{ label: 'Přepis řeči a řečníci', state: 'run' },
{ label: 'Oprava jmen', state: 'todo' },
{ label: 'Zápis', state: 'todo' },
]}
/>
</div>
);