Skip to content

Spinner ​

A small circular loading indicator: spinning while there's no telling how long, or a ring that fills up.

Open in Storybook to try every prop.

When to use ​

  • Short waits in a small space: inside a Button while saving, next to a field's "Checking…" message, in a card while it loads.
  • lg with a value: progress you want people to watch, e.g. an upload in an empty state.

When not to use ​

  • Progress across the width of a page or panel, or steps: use Progress.
  • Waits under about a second: show nothing.

Anatomy ​

PartRequiredNotes
trackYesThe full ring, in the current text colour at 20% opacity.
arcYesSpins, or fills to the value. Current text colour.
percentageNoIn the middle, lg only, with a value.

Properties ​

PropertyTypeDefaultDescription
valuenumber | null—Progress from 0 to max. Leave out for a continuous spinner.
maxnumber100The value that means complete.
sizesm | md | lgmd16px (a button icon) · 24px · 48px.
labelstringLoadingWhat's loading, for screen readers, e.g. "Uploading report".
showValuebooleanfalseShow the percentage in the middle (lg with a value only).

Behaviour ​

  • Takes the surrounding text colour, like an icon: colour it with a text class on it or its parent, e.g. text-primary.
  • Continuous: spins once a second; with reduced motion it turns slowly, once every two seconds.

Accessibility ​

  • role="progressbar", named by label, with the value when there is one.

Platform adaptation ​

PlatformImplementationDifferences
Web / desktop (Vue)Spinner.vueSVG.
iOS (SwiftUI)—ProgressView() (circular), or with a value.
Android (Compose)—CircularProgressIndicator.

Tokens used ​

TokenUsed for
currentColorTrack and arc

Released under the PolyForm Noncommercial License 1.0.0.