Spinners communicate background activity (loading, syncing, saving). Aggarly Platform spinners are token-driven, theme-safe, reduced-motion safe, and include accessible status labeling. Brand spinners use the Aggarly icon for premium enterprise experiences.
Classic ring spinner for general loading states.
import { Spinner } from "@/design-system/components/Spinner";
export function Example() {
return <Spinner variant="border" tone="primary" size="md" />;
}
Conic ring with a subtle drop-shadow. Recommended default for enterprise surfaces.
import { Spinner } from "@/design-system/components/Spinner";
export function Example() {
return <Spinner variant="ring" tone="primary" size="md" />;
}
Enterprise “equalizer” spinner for background processing and inline toolbars.
import { Spinner } from "@/design-system/components/Spinner";
export function Example() {
return <Spinner variant="bars" tone="neutral" size="md" />;
}
Use speed to tune motion density across surfaces (slow for dashboards, fast for micro-loaders).
import { Spinner } from "@/design-system/components/Spinner";
export function Example() {
return (
<>
<Spinner variant="ring" speed="slow" />
<Spinner variant="ring" speed="normal" />
<Spinner variant="ring" speed="fast" />
</>
);
}
Pulse / grow spinner for saving or background processing.
import { Spinner } from "@/design-system/components/Spinner";
export function Example() {
return <Spinner variant="grow" tone="success" size="md" label="Saving..." />;
}
Compact dots spinner for dense UIs (tables, toolbars, inline loaders).
import { Spinner } from "@/design-system/components/Spinner";
export function Example() {
return <Spinner variant="dots" tone="neutral" size="sm" />;
}
When the UI already shows visible text like “Saving…”, set a11y="decorative" so screen readers are not double-announced.
import { Spinner } from "@/design-system/components/Spinner";
export function Example() {
return (
<div className="spinners-row">
<span className="spinner-sample">
<Spinner variant="dots" size="sm" tone="primary" a11y="decorative" />
<span className="spinner-sample__label">Saving…</span>
</span>
</div>
);
}
Tone controls spinner color using token RGB channels.
import { Spinner } from "@/design-system/components/Spinner";
export function Example() {
return (
<>
<Spinner tone="primary" />
<Spinner tone="secondary" />
<Spinner tone="success" />
<Spinner tone="warning" />
<Spinner tone="danger" />
<Spinner tone="neutral" />
</>
);
}
Premium spinners using /assets/icons/thera-icon.svg (CSS mask for tone control). Includes scan variant.
import { BrandSpinner } from "@/design-system/components/Spinner";
export function Example() {
return (
<>
<BrandSpinner variant="rotate" tone="primary" iconUrl="/assets/icons/thera-icon.svg" />
<BrandSpinner variant="orbit" tone="secondary" iconUrl="/assets/icons/thera-icon.svg" />
<BrandSpinner variant="pulse" tone="success" iconUrl="/assets/icons/thera-icon.svg" />
<BrandSpinner variant="conic" tone="primary" iconUrl="/assets/icons/thera-icon.svg" />
<BrandSpinner variant="scan" tone="primary" iconUrl="/assets/icons/thera-icon.svg" />
</>
);
}
Enterprise overlay pattern for blocking sections during long operations (exports, sync, migrations).
import { SpinnerOverlay } from "@/design-system/components/Spinner";
export function Example() {
return (
<div className="spinner-overlay-surface">
<div className="spinner-overlay-surface__content">
<p className="spinner-overlay-surface__title">Reports</p>
<p className="spinner-overlay-surface__desc">Generating export…</p>
</div>
<SpinnerOverlay
variant="ring"
tone="primary"
label="Exporting report"
description="This can take up to a minute"
scrim="soft"
blur
/>
</div>
);
}