Spinner

Loading indicator supporting circular spin, pulsing wave dots, Claude-style cycling glyphs, and animated typing ellipsis.

// Plain markup
import { Spinner } from "@shavin/ui";

All Spinner Variants

✻

Loading.

Component Source
// Circular dual-layer track ring
<Spinner variant="spin" />

// Pulsing wave dots
<Spinner variant="dots" />

// Claude-style star & flower glyphs
<Spinner variant="glyph" />

// Typography 3-dot typing ellipsis
<Spinner variant="ellipsis" />

Circular Ring (variant="spin")

Component Source
// High-contrast dual-layer track ring (25% track + 90% spinning arc)
<Spinner variant="spin" size="sm" />
<Spinner variant="spin" size="md" />
<Spinner variant="spin" size="lg" />

Wave Dots (variant="dots")

Assistant is typing

Component Source
// Pulsing wave dots for AI chat typing indicators & inline messages
<Spinner variant="dots" size="sm" />
<Spinner variant="dots" size="md" />
<Spinner variant="dots" size="lg" />

<Card className="p-3">
  <Flex gap="2" align="center">
    <Text size="xs" color="muted">Assistant is typing</Text>
    <Spinner variant="dots" size="sm" className="text-accent-contrast" />
  </Flex>
</Card>

Glyphs (variant="glyph")

✻✻✻
✻

Claude thinking

✦

Custom array ( ✦ , ✧, ★, ☆)

Spelunking
Component Source
// Default cycling glyphs: ["✻", "✽", "✶", "✳", "✢"]
<Spinner variant="glyph" size="sm" />
<Spinner variant="glyph" size="md" />
<Spinner variant="glyph" size="lg" />

// Custom array of glyphs & interval
<Spinner variant="glyph" glyphs={["✦", "✧", "★", "☆"]} intervalMs={150} className="text-accent-contrast" />
<Spinner variant="glyph" glyphs={["Spelunking", "Discombobulating", "Marinating", "Concocting", "Percolating", "Schlepping"]} intervalMs={400} className="text-accent-contrast" />

Typography Ellipsis (variant="ellipsis")

Generating response.

Loading workspace.

Component Source
// Pure text 3-dot typing animation that inherits parent/sibling typography styling
<Text size="sm" weight="medium">
  Generating response<Spinner variant="ellipsis" />
</Text>

<Heading size="lg" className="text-accent-contrast">
  Loading workspace<Spinner variant="ellipsis" />
</Heading>

Sizes

Component Source
<Spinner size="sm" />
<Spinner size="md" />
<Spinner size="lg" />

Colors & Contexts

text-fg-subtle (default)

text-danger

Component Source
<Text color="subtle" className="flex items-center gap-2">
  <Spinner size="sm" />
  text-fg-subtle (default)
</Text>

<Text color="danger" className="flex items-center gap-2">
  <Spinner size="sm" />
  text-danger
</Text>

<Button size="sm">
  <Spinner size="sm" />
  Saving…
</Button>

Props

PropTypeDefaultDescription
glyphsstring[][Custom array of glyphs for variant="glyph". Default ["✻", "✽", "✶", "✳", "✢"]
intervalMsnumber200Animation cycle interval in ms for variant="glyph" or variant="ellipsis". Default 200
variant"spin" | "dots" | "glyph" | "ellipsis""spin"—
size"sm" | "md" | "lg""md"—
Configure Theme
Theme
Accent Color
Custom
Gray Family
Appearance
Radius
Scaling
Panel Style
Heading Font
Body Font