Progress

Progress communicates the completion status of one task that takes time.

Overview and decision boundary

Use Progress to communicate the completion status of one task that takes time.

Invent values to make an operation appear active.

Uploading files
Uploading files68%
Importing records3 of 5
Exporting reportComplete
Publishing release
40%

Installation and imports

Install the editable registry source, or use the matching package entrypoint when the product keeps Nerio as a workspace dependency.

pnpm dlx nerio add progressimport { Progress } from '@nerio-ui/ui';

Usage

import { Progress } from '@nerio-ui/ui';<Progress label="Uploading files" value={68} /><Progress aria-label="Synchronizing workspace" value={null} valueText="Synchronizing" />

Variants

ContractDescription
No visual variantsProgress intentionally has no size, tone, status, striped, or decorative variants.

Anatomy

SlotDescription
rootSemantic progressbar root with the accessible name and normalized range values.
headerOptional row for visible label and value text.
labelOptional visible task name associated through aria-labelledby.
valueOptional visible completion text from valueLabel.
trackVisual-only neutral completion track.
indicatorVisual-only transform-scaled fill or indeterminate segment.

States

StateBehavior
indeterminateNo finite value is available. aria-valuenow is omitted.
progressingA finite normalized value is below max.
completeThe clamped value reaches max. The indicator does not change to an outcome color.

Motion

  • Determinate updates scale the indicator with transform instead of animating layout size.
  • Indeterminate motion uses tokenized duration, easing, and segment width; RTL reverses its direction.
  • Reduced motion disables transitions and animation while retaining a static partial segment.

Accessibility

  • Progress requires exactly one accessible name: a visible label, aria-label, or aria-labelledby.
  • Determinate progress exposes normalized aria-valuemin, aria-valuemax, and the clamped aria-valuenow; indeterminate progress omits aria-valuenow.
  • Use valueText for localized non-percentage completion text. Progress is read-only and does not need keyboard focus.

API

PropTypeDescription
valuenumber | nullFinite completion value. Defaults to null for indeterminate progress.
minnumberRange minimum. Defaults to 0; invalid runtime ranges normalize to 0–100.
maxnumberRange maximum. Defaults to 100; invalid runtime ranges normalize to 0–100.
labelReactNodeVisible task name and one required accessible naming path.
valueLabelReactNodeOptional visible completion text in the header.
valueTextstringOptional localized aria-valuetext for richer completion context.
aria-labelstringRequired naming alternative when label is not rendered.
aria-labelledbystringRequired external naming alternative when label is not rendered.
root DOM propsdiv propsForwards id, className, style, aria-describedby, aria-controls, events, and consumer data attributes to the progressbar root.

Implementation contract

ContractValue
Registry itemProgress installs its Tailwind-first component, merge utility, token bridge, and residual progress keyframes.
Base UINo interactive primitive required.
Server safetyProgress has no client boundary or runtime dependency.

Styling contract

ContractValue
AuthoringComplete, statically detectable Tailwind CSS v4 recipes own component visuals.
ValuesSemantic and component --n-* variables remain the canonical customization layer.
OverridesCustomizable slots merge consumer className values with tailwindCn so conflicting utilities resolve deterministically.
Residual CSSOnly shared keyframes and scoped no-Preflight compatibility rules remain; there is no parallel visual selector layer.

Design notes

  • Progress communicates task completion only. Final success, failure, cancellation, and blocked outcomes belong to Alert, Badge, or Toast.
  • Progress is not Meter: static scores, capacity, battery levels, and health values have a separate semantic responsibility.

Do / do not

Do

  • Show determinate progress only when a reliable value exists.
  • Use indeterminate Progress only while a reliable value is unavailable.
  • Keep the task label specific and use valueText for meaningful completion text.
  • Use Progress when completion feedback is useful to the person waiting.

Do not

  • Invent values to make an operation appear active.
  • Use Progress as a static score, capacity, battery, or health measurement.
  • Encode a final success or failure only through indicator color.
  • Use it as a Spinner or Skeleton replacement when those components fit better.

Tokens

GroupTokensControls
Layout--n-progress-height / radius / gap / header-gapControls track shape and spacing.
Text--n-progress-label-* / --n-progress-value-*Controls visible header text.
Surfaces--n-progress-track-background / --n-progress-indicator-backgroundKeeps the track neutral and the indicator aligned with the action accent.
Motion--n-progress-duration / easing / indeterminate-*Controls transform transition, segment movement, and the reduced-motion position.