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: .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>
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>