Spinner
Spinner visually indicates an indeterminate loading state. Four variants — Ring, Dots, Bars, and Orbit — cover data fetching, page transitions, and other async operations where completion time is unknown.
4
Variants
3
Sizes
3
Colors
Pure
React
Playground
Preview
ringdefaultdefault
Variant
Size
Color
Speed
<Spinner />Variants
Ring
Rotating ring — the most standard loading indicator
Dots
Three dots that sequentially fade in and out
Bars
Four bars that animate with a wave scale effect
Orbit
Y-axis 3D rotation — five sub-styles (Ring, Dots, Cube, Flip, Morph)
Sizes
smRing16px
Orbit22px
defaultRing24px
Orbit32px
lgRing32px
Orbit44px
| Size | Ring | Orbit | Preview | |||
|---|---|---|---|---|---|---|
sm | 16px | 22px | ||||
default | 24px | 32px | ||||
lg | 32px | 44px | ||||
Features
Color
Three color options — current inherits the parent text color, blending naturally inside buttons and colored containers
default
primary
current
<Spinner color="default" />
<Spinner color="primary" />
<Spinner color="current" />Speed
Adjust animation speed in three steps.
slow
default
fast
<Spinner speed="slow" />
<Spinner speed="default" />
<Spinner speed="fast" />3D Orbit Styles
Compare all five 3D orbit sub-styles side by side.
API
Component Structure
Spinner— Pure ReactStandalone component — no sub-components
Props
variant"ring""ring" | "dots" | "bars" | "orbit"Visual variant of the spinner
orbitStyle"ring""ring" | "dots" | "cube" | "flip" | "morph"Orbit sub-style (orbit variant only)
size"default""sm" | "default" | "lg"Size
color"default""default" | "primary" | "current"Color — default: dark, primary: brand, current: inherits parent text color
speed"default""slow" | "default" | "fast"Animation speed
label"Loading"stringAccessibility label (aria-label)
classNameundefinedstringAdditional CSS classes
| Name | Type | Default | Description |
|---|---|---|---|
variant | "ring" | "dots" | "bars" | "orbit" | "ring" | Visual variant of the spinner |
orbitStyle | "ring" | "dots" | "cube" | "flip" | "morph" | "ring" | Orbit sub-style (orbit variant only) |
size | "sm" | "default" | "lg" | "default" | Size |
color | "default" | "primary" | "current" | "default" | Color — default: dark, primary: brand, current: inherits parent text color |
speed | "slow" | "default" | "fast" | "default" | Animation speed |
label | string | "Loading" | Accessibility label (aria-label) |
className | string | undefined | Additional CSS classes |
Anatomy
Ring
1
2
Dots
1
2
3
Bars
1
2
3
4
Orbit (Default: Dual Ring)
1
2
1
Track
Background ring
2
Indicator
Active arc
D
Dots
Sequential fade
O
Orbit
3D rotation
Best Practices
✓
Do
- ✓Use Spinner for indeterminate waiting times
- ✓Use size="sm" and color="current" inside buttons
- ✓Use the dots variant for inline display next to text
✕
Don't
- ✕Don't use Spinner when progress is measurable — use Progress instead
- ✕Don't show many Spinners simultaneously on one page
- ✕Don't use Spinner for post-action feedback — use Toast instead
Accessibility
ARIA / WCAG
role="status"applied automaticallyaria-label="Loading"by defaultlabelprop for custom label- Screen reader accessible