SPINNER: Rotating busy indicator
VARIANTS: Default | Small | Large | Button loading

Inherits currentColor, so it matches any text or button ink. Always pair with visible text or an aria-label — the spinner itself is aria-hidden. Under reduced motion it slows rather than stops (busy state is meaning).

Sizes

Sizes: .spinner-border-sm for inline/button use, default for standalone, .spinner-border-lg for page-level loading.

<span class="spinner-border" aria-hidden="true"></span>

Button loading state

Contract: add .btn-loading + disabled + aria-busy="true", swap the label text. Blocks double-submit (rubric C05).

<button class="btn btn-primary btn-loading" disabled aria-busy="true"><span class="spinner-border spinner-border-sm" aria-hidden="true"></span> Saving…</button>