AhaSlides Design
v0.52.0React · Vue · Lit

Components · Feedback

Spin

A brand-coloured spinner for an indeterminate wait — loading a page, a panel, or results.

Examples

Size
Tip
Indeterminate wait · small · default · large + tip · wrapper overlay
Live results
Votes are being tallied for the current poll.

API

PropTypeDefaultNotes
sizesmall | default | largedefaultSpinner diameter
tipstringOptional caption shown under the ring
spinningbooleanfalseWrapper mode only (with slotted children): show/hide the overlay scrim + centred ring. Toggling it flips a class on a persistent node — the child subtree is never rebuilt.

Install

# .npmrc — once: point the @ahaslides-product scope at GitHub Packages
@ahaslides-product:registry=https://npm.pkg.github.com
//npm.pkg.github.com/:_authToken=${GITHUB_TOKEN}   # a GitHub token with read:packages

npm i @ahaslides-product/design
import '@ahaslides-product/design/tokens.css';   // once, at the app root
import '@ahaslides-product/design/aha-spin';   // registers <aha-spin>

Agent feed for this component (absolute, fetchable anywhere): spin.agent.json · spin.md · spin.llms.txt

When to use

When to use
  • Spin — an indeterminate wait with no measurable percentage
  • Progress — you can measure completion (a percentage)
  • Skeleton — you want to hold the shape of the content that is loading
Reach for Spin only when you cannot show a percentage or hold the layout. Keep one spinner per waiting region; pair it with a short tip for waits over ~1s. To block a region while it loads, wrap the content and toggle `spinning` rather than swapping it for a bare centred spinner — the layout holds and the child stays mounted.
Surfaces
editor dashboard audience

Spec

Ring 20×20 · 2px · track purple-20, head primary #6A1EBB · Sizes small 14 · default 20 · large 32 · Motion rotate 0.9s linear infinite (respects reduced-motion); scrim fade + blur via motion-mid · Tip optional caption below (standalone) or under the centred ring (wrapper), text-secondary · Wrapper slot children; when spinning, scrim = bg-container @60% over blurred child, ring centred