Loaders
Source codeA set of 5×5 dot matrix loaders, each a self-contained SVG.
import { Bloom, Helix, Orbit, Ripple } from "@/ui/dot-matrix";
export default function LoadersDemo() {
return (
<div className="flex flex-wrap items-center justify-center gap-12">
<Orbit />
<Ripple />
<Bloom />
<Helix />
</div>
);
}Every loader is one inline SVG with a single embedded keyframe and a per-dot delay map, no shared stylesheet and no JavaScript runtime.
Gallery
Thirty-four named patterns, each exported as its own component.
attention
auth-handshake
backprop
beacon
bloom
cache-warm
cluster-sync
compile
constellation
cron
deploy
diffusion
drift
embedding
flower-bloom
gradient-descent
hash
heart-pulse
helix
index-build
lattice
orbit
plus-pulse
quantize
rate-limit
ripple
snowflake
sound-bars
star-burst
sync
token-stream
twin-helix
vector-index
webhook
import {
Attention,
AuthHandshake,
Backprop,
Beacon,
Bloom,
CacheWarm,
ClusterSync,
Compile,
Constellation,
Cron,
Deploy,
Diffusion,
Drift,
Embedding,
FlowerBloom,
GradientDescent,
Hash,
HeartPulse,
Helix,
IndexBuild,
Lattice,
Orbit,
PlusPulse,
Quantize,
RateLimit,
Ripple,
Snowflake,
SoundBars,
StarBurst,
Sync,
TokenStream,
TwinHelix,
VectorIndex,
Webhook,
} from "@/ui/dot-matrix";
const LOADERS = [
{ name: "attention", Loader: Attention },
{ name: "auth-handshake", Loader: AuthHandshake },
{ name: "backprop", Loader: Backprop },
{ name: "beacon", Loader: Beacon },
{ name: "bloom", Loader: Bloom },
{ name: "cache-warm", Loader: CacheWarm },
{ name: "cluster-sync", Loader: ClusterSync },
{ name: "compile", Loader: Compile },
{ name: "constellation", Loader: Constellation },
{ name: "cron", Loader: Cron },
{ name: "deploy", Loader: Deploy },
{ name: "diffusion", Loader: Diffusion },
{ name: "drift", Loader: Drift },
{ name: "embedding", Loader: Embedding },
{ name: "flower-bloom", Loader: FlowerBloom },
{ name: "gradient-descent", Loader: GradientDescent },
{ name: "hash", Loader: Hash },
{ name: "heart-pulse", Loader: HeartPulse },
{ name: "helix", Loader: Helix },
{ name: "index-build", Loader: IndexBuild },
{ name: "lattice", Loader: Lattice },
{ name: "orbit", Loader: Orbit },
{ name: "plus-pulse", Loader: PlusPulse },
{ name: "quantize", Loader: Quantize },
{ name: "rate-limit", Loader: RateLimit },
{ name: "ripple", Loader: Ripple },
{ name: "snowflake", Loader: Snowflake },
{ name: "sound-bars", Loader: SoundBars },
{ name: "star-burst", Loader: StarBurst },
{ name: "sync", Loader: Sync },
{ name: "token-stream", Loader: TokenStream },
{ name: "twin-helix", Loader: TwinHelix },
{ name: "vector-index", Loader: VectorIndex },
{ name: "webhook", Loader: Webhook },
];
export default function LoadersGalleryDemo() {
return (
<div className="grid w-full grid-cols-2 gap-x-6 gap-y-10 sm:grid-cols-3 md:grid-cols-4">
{LOADERS.map(({ name, Loader }) => (
<div key={name} className="flex flex-col items-center gap-4">
<div className="flex h-8 items-center justify-center">
<Loader aria-label={name} />
</div>
<span className="font-mono text-xs text-neutral-500 dark:text-neutral-400">{name}</span>
</div>
))}
</div>
);
}Color
Pass any CSS color to color. It defaults to the current theme's foreground — black on light, white on dark.
import { Ripple } from "@/ui/dot-matrix";
export default function LoadersColorDemo() {
return (
<div className="flex flex-wrap items-center justify-center gap-12">
<Ripple color="var(--color-accent-500)" />
<Ripple color="var(--color-success-500)" />
<Ripple color="var(--color-danger-500)" />
</div>
);
}Sizing
Set size to scale a loader. Drop it down for an inline or chat-sized loader, or push it up for emphasis. Every other example here uses the default.
import { CacheWarm } from "@/ui/dot-matrix";
export default function LoadersSizesDemo() {
return (
<div className="flex flex-wrap items-center justify-center gap-12">
<CacheWarm size={16} />
<CacheWarm />
<CacheWarm size={40} />
<CacheWarm size={64} />
</div>
);
}API
Every loader accepts the same props.
| Prop | Type | Default |
|---|---|---|
| size | number | 24 |
| speed | number | 1 |
| color | string | currentColor |
| className | string | - |
| aria-label | string | "Loading" |