Spinners

Canonical reference for Vanduo loading spinners: border spinner, dot bounce, growing pulse, sizes and color modifiers, plus the signature quad-grid loader (.vd-dynamic-loader*). Styles ship in framework/css/components/spinner.css, imported by the main vanduo.css bundle — copy HTML only; no extra layout CSS is required. For loading UX patterns (progress handoff, placeholders), see Preloader.

Border Spinner

Sizes

Colors

Inside buttons

<!-- Sizes -->
<div class="vd-spinner vd-spinner-xs"></div>
<div class="vd-spinner vd-spinner-sm"></div>
<div class="vd-spinner"></div>
<div class="vd-spinner vd-spinner-lg"></div>
<div class="vd-spinner vd-spinner-xl"></div>

<!-- Colors -->
<div class="vd-spinner vd-spinner-success"></div>
<div class="vd-spinner vd-spinner-warning"></div>
<div class="vd-spinner vd-spinner-error"></div>
<div class="vd-spinner vd-spinner-info"></div>
<div class="vd-spinner vd-spinner-light"></div>
<div class="vd-spinner vd-spinner-dark"></div>

<!-- Inside button -->
<button class="vd-btn vd-btn-primary" disabled>
  <span class="vd-spinner vd-spinner-sm"
        style="border-color:rgba(255,255,255,0.3);
               border-top-color:#fff;">
  </span>
  Loading...
</button>
Dots & Growing Spinner

Dot bounce

Growing pulse

Centering helper

<!-- Dot bounce spinner -->
<div class="vd-spinner-dots"><span></span></div>

<!-- Growing pulse spinner -->
<div class="vd-spinner-grow vd-spinner-sm"></div>
<div class="vd-spinner-grow"></div>
<div class="vd-spinner-grow vd-spinner-lg"
     style="--vd-spinner-color:var(--vd-color-success);"></div>

<!-- Centered loader area -->
<div class="vd-spinner-center">
  <div class="vd-spinner vd-spinner-lg"></div>
</div>
Quad Loader (Signature Vanduo Loader)

The grid applies staggered rotation via .vd-dynamic-loader-grid (nth-child delays in CSS). Optional inline animation-delay overrides are only needed if you want custom rhythm.

Loading your workspace...

Overlay on a skeleton card

Please wait...
<!-- Quad loader -->
<div class="vd-dynamic-loader">
  <div class="vd-dynamic-loader-grid">
    <div class="vd-spinner vd-spinner-sm"
         style="--vd-spinner-color:var(--vd-color-primary);"></div>
    <div class="vd-spinner vd-spinner-sm"
         style="--vd-spinner-color:var(--vd-color-secondary);"></div>
    <div class="vd-spinner vd-spinner-sm"
         style="--vd-spinner-color:var(--vd-color-success);"></div>
    <div class="vd-spinner vd-spinner-sm"
         style="--vd-spinner-color:var(--vd-color-warning);"></div>
  </div>
  <div class="vd-dynamic-loader-text">Loading...</div>
</div>

<!-- Overlay on skeleton card -->
<div class="vd-dynamic-loader-card">
  <div class="vd-dynamic-loader">...</div>
  <!-- skeleton placeholders underneath -->
  <div class="vd-skeleton vd-skeleton-text"></div>
</div>
CSS Variables
VariableDefaultDescription
--vd-spinner-size2remDefault spinner diameter
--vd-spinner-border-width3pxBorder spinner track thickness
--vd-spinner-colorvar(--vd-color-primary)Active/accent color
--vd-spinner-speed0.65sRotation duration
API Reference

Usage

<script setup lang="ts">
import { VdSpinner } from "@vanduo-oss/vd3";
</script>

<template>
  <VdSpinner />
  <VdSpinner size="lg" label="Loading…" />
</template>

CSS Classes

ClassDescription
.vd-spinnerBorder spinner — a rotating circular border. Default size 2rem.
.vd-spinner-xs1rem diameter, 2px border.
.vd-spinner-sm1.5rem diameter, 2px border.
.vd-spinner-lg3rem diameter, 4px border.
.vd-spinner-xl4rem diameter, 5px border.
.vd-spinner-successGreen accent color.
.vd-spinner-warningAmber accent color.
.vd-spinner-errorRed accent color.
.vd-spinner-infoCyan accent color.
.vd-spinner-lightWhite accent (for dark backgrounds).
.vd-spinner-darkDark text color accent.
.vd-spinner-dotsThree bouncing dots loader.
.vd-spinner-growPulsing circle that grows and fades in a loop.
.vd-spinner-centerFlex container that centers a spinner with padding.
.vd-dynamic-loaderSignature 2x2 quad spinner grid with label.
.vd-dynamic-loader-gridThe 2x2 CSS grid of spinners.
.vd-dynamic-loader-textMuted label below the quad grid.
.vd-dynamic-loader-cardRelative container that hosts a full-cover .vd-dynamic-loader overlay.

Component API (Vue 3)

PropDescription
:sizesm | md | lg (default md).
:labelAccessible label (visually-hidden text for screen readers).
Accessibility
  • Always include an aria-label or visually-hidden text describing the loading state: <div class="vd-spinner" aria-label="Loading..."></div>.
  • When used inside buttons, the button itself should have aria-disabled="true" or disabled to prevent repeated submissions.
  • For page-level loading (quad loader), wrap it in an element with role="status" and aria-live="polite" so screen readers announce the loading state.
  • Spinners are decorative for sighted users but meaningful for screen reader users — never omit the accessible name.
  • Animations slow down to 1.5s when prefers-reduced-motion: reduce is active to minimize vestibular discomfort.