UI + UX Feedback, Status, And System State standard

Progress bar

Show a scoped, accessible progress bar only when progress can be measured against a known operation, keep label and value near the bar, update it monotonically, expose useful units and recovery actions, and transition to success, error, cancellation, or background status when the operation changes state.

Decision first

Choose this pattern when the problem matches

Use when

  • A system operation has a measurable total or bounded progress value.
  • Users benefit from knowing how much work has completed or remains.
  • The operation may take long enough that waiting, cancelling, retrying, or leaving safely matters.
  • The product can report honest active, success, error, cancelled, paused, or background states.

Avoid when

  • Progress cannot be measured or would be guessed.
  • The wait is short and only needs scoped activity feedback.
  • Users are waiting for predictable content structure to load.
  • Progress is based on user journey steps rather than system work.
  • The operation has already failed or needs recovery rather than more progress.

Problem it prevents

Users waiting for uploads, downloads, exports, imports, scans, saves, or batch processing need trustworthy progress, but dishonest or poorly scoped bars can overpromise completion, hide failure, or make users abandon work too early.

Pattern anatomy

What a strong implementation has to make clear

User need

The operation has a known total such as file bytes, records, items, stages, or server-reported completion percentage.

Pattern promise

Show a scoped, accessible progress bar only when progress can be measured against a known operation, keep label and value near the bar, update it monotonically, expose useful units and recovery actions, and transition to success, error, cancellation, or background status when the operation changes state.

Required state

Idle state before the operation starts.

Recovery path

Users leave after 100% transfer even though server processing later rejects the file.

Access contract

Provide an accessible name that identifies the operation and affected object.

Quality bar

The difference between expert and weak execution

Strong implementation

Specific, visible, recoverable

  • A document upload card says Uploading evidence.zip, shows 64%, 32 of 50 MB, a Cancel action, and keeps the rest of the form usable.
  • A CSV import job shows Validating rows, 840 of 1200 records checked, a progress bar at 70%, and a View issues action when warnings appear.
  • A user uploads evidence.zip, sees progress move from 12% to 64%, cancels before commit, retries after a network error, and gets a completed receipt only after server processing succeeds.
  • A long report export reaches 42%, offers Move to background, then sends users to job history while preserving the current dashboard.
Weak implementation

Vague, hidden, hard to recover from

  • A blue bar fills across the top of the page with no label, no percent, and no affected object.
  • A progress bar reads 100% complete while virus scanning and server acceptance are still pending.
  • A fake progress bar inches to 99% for minutes with no elapsed time, cancel, retry, or background option.
  • A download bar jumps to 100%, disappears, and then shows Download failed in a toast with no retry or saved context.
UI guidance
  • Show a labeled bar with a track, filled value, and nearby helper text that reports the measurable unit such as percent, bytes, rows, files, records, or stages.
  • Keep the label close to the bar, keep the value outside the fill for readability, and use distinct active, success, paused, cancelled, and error states without relying on color alone.
UX guidance
  • Use a progress bar when the system can honestly report movement toward a known finish and users need to decide whether to wait, cancel, retry, continue elsewhere, or return later.
  • Advance the bar monotonically for one operation, resolve it to success or failure, and switch to a spinner, background job, or error state when progress cannot be measured anymore.
Implementation contract

What the implementation must handle

States

  • Idle state before the operation starts.
  • Active determinate state with label, value, and helper text.
  • Indeterminate handoff state only while measurement is not yet available.
  • Paused or waiting state when the system needs network, permission, queue, or user action.

Interaction

  • The progress bar appears only after the operation starts and is scoped to the affected file, job, card, dialog, or page region.
  • The label identifies the operation and affected object, such as Uploading evidence.zip or Validating 1200 rows.
  • The value advances monotonically during one operation unless a new operation clearly starts with a new label or reset explanation.
  • The bar does not reach 100% until the user-facing operation is actually complete, including server-side processing when that matters.

Accessibility

  • Provide an accessible name that identifies the operation and affected object.
  • Expose current, minimum, and maximum values for determinate progress.
  • Use useful value text when percent alone is not meaningful, such as 840 of 1200 rows checked.
  • Use aria-busy on the affected region only while the operation is active, and clear it when success, error, cancellation, or background state appears.

Review

  • What exact operation owns this bar, and what unit is being measured?
  • Can the backend or client honestly report the value, or is the bar pretending?
  • What does 100% mean: transfer finished, processing finished, scan passed, data committed, or user-visible result ready?
  • What should users do if the bar stalls, fails, or takes longer than expected?
Interactive lab

Inspect the states before you copy the pattern

Track measurable system progress

Move an upload through partial, complete, error, cancel, and background states; compare honest values with fake 100%, reset, unlabeled, wrong-scope, and stuck progress.

Progress bar
Interactive demo is ready

Launch the live UI/UX lab when you want to inspect states, keyboard behavior, and common failure modes.

State To Inspect

Idle state before the operation starts.

Keyboard / Access

The progress bar itself is usually read-only and should not receive focus unless the platform component requires it.

Avoid Generating

Fabricating progress values just to make users feel movement.

Evidence trail

Source-backed claims behind this guidance

Carbon Progress bar

IBM Carbon Design System - checked

Carbon supports progress bars for measurable system operations, labels, helper values, determinate and indeterminate modes, active/success/error states, region busy semantics, and alternatives.

Material Design Progress indicators

Google Material Design - checked

Material supports linear progress indicators, determinate mode when completion is detectable, and indeterminate-to-determinate transitions.

MDN ARIA Progressbar Role

MDN Web Docs - checked

MDN supports accessible progressbar names, current values, min/max defaults, value text, native progress preference, and aria-busy relationships.

Full agent/debug reference

Problem Context

  • The operation has a known total such as file bytes, records, items, stages, or server-reported completion percentage.
  • Users may need to keep working, cancel, retry, move the job to background, or decide whether a wait is acceptable.
  • The product must distinguish client transfer, server processing, scanning, validation, commit, and final acceptance.
  • Progress may be local, remote, batched, queued, or multi-stage, and each stage may expose different measurement quality.

Selection Rules

  • Choose progress bar when the system can report a meaningful value toward a bounded operation.
  • Use percent when the total is stable and the value maps cleanly to 0 through 100.
  • Use count helper text such as 840 of 1200 rows when counts are more useful than a bare percent.
  • Use byte helper text for upload, download, or file transfer when users recognize the file size.
  • Use stage text such as Uploading, Scanning, Processing, or Finalizing when one visible bar spans multiple system phases.
  • Use loading spinner when the operation is active but progress cannot yet be detected and the expected wait is short.
  • Use loading skeleton when users are waiting for predictable content layout rather than monitoring an operation.
  • Use step navigation when people move through task milestones and completion depends on user action or validation.
  • Use error state when the operation has failed, timed out, or cannot continue from the current value.
  • Do not use a progress bar when values are guessed, decorative, manually advanced by user steps, or likely to move backward during one operation.

Required States

  • Idle state before the operation starts.
  • Active determinate state with label, value, and helper text.
  • Indeterminate handoff state only while measurement is not yet available.
  • Paused or waiting state when the system needs network, permission, queue, or user action.
  • Cancelled state that explains what was stopped and what data remains.
  • Success state after the operation is truly complete, including server acceptance when relevant.
  • Error state with retained value, reason, retry, cancel, support, or report actions.
  • Background state for long work that continues after the current surface is closed.

Interaction Contract

  • The progress bar appears only after the operation starts and is scoped to the affected file, job, card, dialog, or page region.
  • The label identifies the operation and affected object, such as Uploading evidence.zip or Validating 1200 rows.
  • The value advances monotonically during one operation unless a new operation clearly starts with a new label or reset explanation.
  • The bar does not reach 100% until the user-facing operation is actually complete, including server-side processing when that matters.
  • Cancel, retry, pause, resume, or move-to-background actions are available when the operation duration or risk justifies them.
  • Unrelated work remains available unless the entire surface depends on the operation.
  • Assistive technology receives an accessible name, current value, min/max, useful value text when percent is insufficient, and a resolved or failed state.

Implementation Checklist

  • Define the measurable unit, total, stages, ownership of truth, update frequency, timeout threshold, cancellation policy, retry behavior, background behavior, and terminal states before rendering the bar.
  • Use native progress where practical or recreate progressbar semantics with accessible name, minimum, maximum, current value, and useful value text.
  • Keep label, bar, helper text, status, and actions visually grouped and programmatically related to the affected region.
  • Throttle announcements so assistive technology users are not interrupted on every small percentage change.
  • Keep progress monotonic within a single operation and explain any reset as a new attempt, resumed job, or new stage.
  • Separate upload transfer, server processing, scanning, validation, and final acceptance when 100% transfer is not the same as done.
  • Show success, error, cancelled, paused, or background states after progress stops instead of leaving an active bar on screen.
  • Test slow network, failed network, retry, page refresh, background job return, multiple simultaneous jobs, reduced motion, and screen reader value announcements.

Common Generated-UI Mistakes

  • Fabricating progress values just to make users feel movement.
  • Letting a bar reach 100% before server processing, virus scanning, validation, or commit is done.
  • Using one page-level bar for several unrelated operations.
  • Resetting a bar backward without explaining that a new attempt or stage began.
  • Hiding the label or placing it far away from the bar.
  • Using a progress bar for user journey steps rather than system operation progress.
  • Leaving the bar active after failure instead of showing recovery.

Critique Questions

  • What exact operation owns this bar, and what unit is being measured?
  • Can the backend or client honestly report the value, or is the bar pretending?
  • What does 100% mean: transfer finished, processing finished, scan passed, data committed, or user-visible result ready?
  • What should users do if the bar stalls, fails, or takes longer than expected?
  • Does the bar belong to the smallest affected region, and can unrelated work continue?
  • How will screen reader users hear the label, value, and terminal state without excessive announcements?
Accessibility
  • Provide an accessible name that identifies the operation and affected object.
  • Expose current, minimum, and maximum values for determinate progress.
  • Use useful value text when percent alone is not meaningful, such as 840 of 1200 rows checked.
  • Use aria-busy on the affected region only while the operation is active, and clear it when success, error, cancellation, or background state appears.
  • Do not put essential text only inside the bar fill; keep label and helper text readable outside the track.
  • Avoid excessive live announcements; announce meaningful thresholds, pauses, errors, and completion.
Keyboard Behavior
  • The progress bar itself is usually read-only and should not receive focus unless the platform component requires it.
  • Cancel, retry, pause, resume, details, report, and background actions are reachable in normal tab order.
  • When an operation completes, focus remains stable unless the task flow needs to move to a receipt, result, or error recovery.
  • When progress fails, focus remains near the affected job or moves to the persistent recovery region.
  • Keyboard users can continue unrelated work if the progress is scoped to a nonblocking region.
Variants
  • Determinate linear progress bar
  • Indeterminate-to-determinate progress bar
  • File upload progress
  • Download progress
  • Import validation progress
  • Report generation progress
  • Batch job progress
  • Inline table-row progress
  • Container-scoped progress

Verification

Last verified: