Loading indicators

Marks an unmeasurable wait in a region: one spinning ring with an optional label, three ring styles, four sizes. The live region around it is yours.

Demo

Three real props: ring style, size, and label. Clear the label and the prop disappears from the snippet.

Loading
type
size
import { LoadingIndicator } from "@/components/application/loading-indicator/loading-indicator"; <LoadingIndicator label="Loading" />

The snippet drops size at md

The component falls back to md, so the demo omits size while the picker sits there and emits it at sm, lg, and xl, the same way an empty label drops the prop. The copied code reproduces what you see either way.

Contextual demo

A spinner holds a place, and its right size is decided by the hole it sits in — which needs a whole screen to show.

Every well in the preview is application markup

The kit ships the ring and the label. The box the ring is centered in, its height, and the decision to hold that height until content arrives are all yours.

The family

One component, three ring styles, four sizes. There is nothing else in the directory.

The components in this family, with their descriptions and import paths
ComponentDescriptionImport from
LoadingIndicatorA spinning ring and an optional label under it. Three ring styles, four sizes, and nothing else: no states, no children, no controls.@/​components/​application/​loading-indicator/​loading-indicator

The variant space

All 12 combinations the Figma sheet draws: three ring styles across four sizes. Every cell is live and spinning.

type line-simple
size sm
size md
size lg
size xl
type line-spinner
size sm
size md
size lg
size xl
type dot-circle
size sm
size md
size lg
size xl

Size scales two things and leaves the rest alone

Measured in the browser: the ring box goes 32, 48, 56, 64px, and the label goes 14px at sm and md to 18px at lg and xl. The gap between them is 16px everywhere except xl, where it is 20px. That puts a labelled indicator at 68, 84, 100, and 112px tall, which is what the sheet’s four symbols measure on the Figma canvas. The size axis matches to the pixel. Inside the box, the ring is drawn per size since 2026-08-22 rather than scaled from one: r 14, 21, 25, and 29 with a 4, 6, 6, and 8px stroke (8px on dot-circle at lg), as the sheet’s symbols step it, so at xl the stroke paints 1px past the 64px box.

With and without a label

The label is one optional string, and leaving it out removes it completely rather than collapsing it.

Loading
size sm, labelled
Loading
size md, labelled
Loading
size lg, labelled
Loading
size xl, labelled
size sm, no label
size md, no label
size lg, no label
size xl, no label

No label means no element

Measured in the browser at md: 84px tall with a label and 48px without, so the label costs its own line plus the gap and nothing is reserved for it when it is absent. Center the indicator in a well you control if you need the two to line up.

States

There are none: nothing focuses, hovers, or reports. What changes is the surface beneath — only one ring paints a track.

line-simple
line-spinner
dot-circle
On bg-primary
line-simple
line-spinner
dot-circle
On bg-secondary