Loader

For the moments honesty requires a wait.

v1.0.0·Updated Jul 8, 2026 · 10:45
Live Demo — Fully Interactive
A warm-tipped ring — three sizes
With a label
Loading your workspace…
Configuration
Variant
Size
Label
Text
<Loader variant="spinner" />
Behavior — The Engineering Contract
PropTypeNotes
variantspinner · dotsRing, or three bouncing dots
sizeS · M · L16 / 22 / 34px (spinner)
labelstringTrailing text; also the accessible name
rolestatusAnnounced politely to assistive tech
reduced-motionSlows the animation right down

Use a Loader for an indeterminate wait. When you know how far along it is, show Progress; when the shape of the result is known, prefer a Skeleton.

Anatomy
Loading…
1SpinnerTrack ring with one warm rotating arc.
2LabelOptional text, doubling as the accessible name.
Do's and Don'ts
✓ Do
Loading results…

Say what is loading. A labelled spinner reassures.

✕ Don't

Don't scatter spinners across a page. One wait, one loader.

✓ Do

Put the loader inside the action that's working, and disable it.

✕ Don't

Don't block a whole screen for a tiny fetch. Prefer a Skeleton.

In context: Examples
A · Button

Inline in a button during an async submit.

B · Panel
Loading…

Centered in a panel while its content loads.

C · Typing

Dots for a chat "typing" or streaming response.

Measurements & Tokens
TokenValueRole
--ldr-size16 / 22 / 34pxSpinner diameters
--ldr-track#2A2A30Ring track
--ldr-arc#FF7A00Rotating warm arc
--ldr-speed0.7s linearRotation period
--ldr-label#9AA0A8Trailing label
--ldr-reduced2sSlowed period under reduced-motion
Code
<span class="o-loader" role="status" aria-label="Loading"></span>

<span class="o-loader-row" role="status">
  <span class="o-loader"></span> Loading your workspace…
</span>

<span class="o-loader-dots" role="status"><span></span><span></span><span></span></span>