Loading dots

The text-like wait state — three currentColor dots sweeping like an ellipsis being typed; where Spinner marks a region waiting for content, dots say something is being composed: generation, chat, an async row filling in. Each dot is a quarter of the box at radius.full, spaced by space.1; the sweep runs at 6× motion.duration.slow on motion.easing.standard.

Sizes

One sm/md/lg dialect on the shared icon scale, same as Spinner; the default is medium.

ExampleSizeModifierBoxUsage
Small--smsize.icon.smInline with text, dense rows
Mediumds-loading-dotssize.icon.mdThe default — chat and generation surfaces
Large--lgsize.icon.lgFeature areas, empty states

Contexts

The color contract is Spinner's: currentColor, so the dots take the text color of wherever they sit. The wiring differs by whether visible text accompanies them.

ExampleContextWiringInheritsUsage
Standalonerole="status"aria-labeltext.primaryA typing indicator or generation placeholder announces itself
ThinkingAfter textaria-hiddentext.primaryThe dots are the sentence's ellipsis — the text carries the announcement

Usage notes

Dots and Spinner split one job: dots for composition, Spinner for waiting.

VerdictRule
DoReach for dots when something is being written or generated — chat replies, streaming text, an async cell filling in; a region simply waiting for content gets a Spinner.
DoAnnounce standalone dots with role="status" plus aria-label; beside visible text they go aria-hidden — the text carries the update.
Don’tShip more or fewer than exactly three ds-loading-dots__dot spans — the sweep is choreographed for three.
Don’tColor the dots directly — recolor their context and currentColor follows.