https://framer.com/m/Spinner-R85ncS.js

Io / UI Basics / Spinner

Spinner

Spinner is the lightest loading loop the system has: one SVG, one CSS keyframe, no motion library, no hooks. It is SSR-safe and it stops for readers who ask for reduced motion.

UI Basics5 controlsone SVGreduced-motion aware

Examples

Live specimens for every control the component exposes. The arc colour is never a panel setting — it inherits the current text colour, so a spinner is the right colour wherever it lands.

Default

24px across, a 2.5px stroke, a quarter-turn arc and one rotation every 0.8 seconds. The arc takes the current text colour, so it needs no colour control.

Size and thickness

Size is the diameter in px; thickness is the stroke, 0.5 to 20. Keep the stroke proportional or a large spinner reads as a ring and a small one closes up.

16 / 2

24 / 2.5

40 / 4

Arc and track

Arc is how much of the circle turns; track is the ring underneath it. A short arc reads as urgent, a long one as steady, and dropping the track to 0 leaves a bare stroke.

arc 10%

arc 75%

track 0, 1.6s

Props

The controls exposed on the instance panel. There is no colour control by design — the arc uses currentColor.

PropTypeBehaviour
sizenumberDiameter in px, 8–200. Default 24.
thicknessnumberStroke width in px, 0.5–20. Default 2.5.
arcnumberHow much of the circle the moving arc covers, 5–95%. Default 25.
speednumberSeconds per rotation, 0.2–5. Default 0.8. Shown in the panel as Duration.
trackOpacitynumberOpacity of the background ring, 0–1. Default 0.12; 0 hides it. Shown in the panel as Track.
PropTypeBehaviour
sizenumberDiameter in px, 8–200. Default 24.
thicknessnumberStroke width in px, 0.5–20. Default 2.5.
arcnumberHow much of the circle the moving arc covers, 5–95%. Default 25.
speednumberSeconds per rotation, 0.2–5. Default 0.8. Shown in the panel as Duration.
trackOpacitynumberOpacity of the background ring, 0–1. Default 0.12; 0 hides it. Shown in the panel as Track.

Usage

Guidance carried over from the component definition.

Reach for Spinner

Any wait short enough that a progress number would be noise — a button in flight, a panel loading.

Places where weight matters: one SVG and one keyframe, no motion library, no hooks, no effects.

Server-rendered pages — it touches no window API and renders identically on the server.

Inside coloured surfaces: the arc inherits the current text colour instead of carrying its own.

Reach for something else

A wait with a known length. Show real progress instead of an endless loop.

A button’s own pending state. Button has a loading control that handles it in place.

Skeleton loading of a whole layout. That is a placeholder pattern, not a spinner.

Io — UI Basics

Every spinner above is a live Spinner instance. The arc takes the current text colour and the animation stops when the reader asks for reduced motion.

io

An experiment in what a design system becomes when AI can consume it.

© 2026 io

Contact me

Create a free website with Framer, the website builder loved by startups, designers and agencies.