LayerwiseLayerwise
  • Features
  • Pricing
  • Templates
  • Docs
DownloadDownload
FeaturesPricingTemplatesDocsAI Website BuilderVibe CodingPersonal Software
DownloadDownload
  1. Glossary
  2. /
  3. Components

Spinner

Also called loading spinner, loading indicator, or throbber

A small looping animation, usually a rotating ring, that shows the app is busy with a short task of unknown length.

import { useState } from 'react';

const SPINNER_DELAY_MS = 300; // quick saves never flash a spinner
const SAVED_FOR_MS = 1500;

type Status = 'idle' | 'pending' | 'saving' | 'saved';
const LABELS: Record<Status, string> = {
  idle: 'Save changes',
  pending: 'Save changes',
  saving: 'Saving…',
  saved: 'Saved'
};

export function SaveButton({ onSave }: { onSave: () => Promise<void> }) {
  const [status, setStatus] = useState<Status>('idle');

  async function save() {
    setStatus('pending');
    const timer = setTimeout(() => setStatus('saving'), SPINNER_DELAY_MS);
    try {
      await onSave();
      setStatus('saved');
      setTimeout(() => setStatus('idle'), SAVED_FOR_MS);
    } catch {
      setStatus('idle'); // onSave reports its own error
    } finally {
      clearTimeout(timer);
    }
  }

  return (
    <>
      {/* min-w keeps the width steady as the label changes. */}
      <button
        type='button'
        onClick={save}
        disabled={status !== 'idle'}
        className='inline-flex h-10 min-w-36 items-center justify-center gap-2 rounded-lg bg-primary px-4 text-sm font-medium text-primary-foreground disabled:opacity-80'
      >
        {status === 'saving' && (
          // One quarter of the ring in the text color, the rest at 20%, one turn per 700ms.
          <span className='size-4 animate-spin rounded-full border-2 border-current/20 border-t-current [animation-duration:700ms] motion-reduce:[animation-duration:2s]' />
        )}
        {status === 'saved' && '✓'}
        {LABELS[status]}
      </button>
      <span role='status' className='sr-only'>
        {status === 'saving' ? 'Saving' : status === 'saved' ? 'Saved' : ''}
      </span>
    </>
  );
}
When the user clicks Save changes, disable the button, keep its width, and show a 16px spinning ring with the label "Saving…". The ring is a circle with a 2px stroke, one quarter of it in the text color and the rest at 20% opacity, rotating once every 700ms with linear easing. Only show the spinner if saving takes longer than 300ms, then show "Saved" with a checkmark for 1.5s.

Paste into Layerwise or any AI coding tool.

What is Spinner?

A spinner is the simplest loading indicator: a ring, a set of dots, or a few bars that animate in a loop. It tells people the app heard them and is working, without saying how long the wait will be.

Use it for short waits of about one to a few seconds where the layout won’t change much: saving a form, sending a message, refreshing a small panel. Inside a button, show the spinner next to a label like “Saving…”, keep the button the same width, and disable it so people don’t submit twice.

For a page or panel of content that is loading, a skeleton screen previews the layout instead. For long tasks you can measure, such as an upload, a progress bar shows how far along it is. Wait about 300ms before showing a spinner so quick actions don’t flash, and give it an accessible label, for example role="status" with the text “Saving”.

Often confused with

Skeleton screen
A skeleton screen previews the layout of content that is loading. A spinner only says the app is busy, so it suits short actions like saving.
Progress bar
A progress bar shows how much of a task is done. A spinner suits short waits whose length the app cannot measure.

Related terms

All terms

Progress bar

A horizontal bar that fills from left to right to show how much of a task is done, or slides in a loop while the total is still unknown.

Skeleton screen

A loading placeholder made of gray blocks shaped like the content on its way, often with a soft shimmer, that the real content replaces.

Loading state

The view a screen shows while its data is on the way, designed together with the outcomes that follow: loaded, empty, or error.

Looping animation

An animation that plays more than once, either a set number of times or forever, set in CSS with animation-iteration-count.

Build it with Layerwise

Describe your app, watch it run in a live preview, and publish it with a database, storage, and sign-in built in.

DownloadDownloadRead the docs
LayerwiseLayerwise

Build full-stack web apps in minutes with AI.

Product

  • Features
  • Pricing
  • Download
  • Templates

Solutions

  • AI Website Builder
  • Vibe Coding
  • Personal Software

Resources

  • Documentation
  • Changelog
  • Blog
  • Vibe Coding Glossary
  • llms.txt
  • llms-full.txt

Company

  • About
  • Contact

Legal

  • Privacy
  • Analytics Privacy
  • Terms
  • Security
  • Abuse

© 2026 Layerwise. All rights reserved.

Entrances & exits

  • Fade in
  • Slide in
  • Scale in
  • Pop in
  • Blur in
  • Reveal animation
  • Enter and exit animations

Timing & sequencing

  • Duration
  • Delay
  • Keyframes
  • Tweening
  • Stagger
  • Orchestration
  • Fill mode
  • Stepped animation
  • Looping animation
  • Yoyo animation

Easing

  • Easing
  • Linear easing
  • Ease-in
  • Ease-out
  • Ease-in-out
  • Cubic-bezier
  • Asymmetric easing
  • Overshoot easing

Springs & physics

  • Spring animation
  • Stiffness
  • Damping
  • Mass
  • Bounce
  • Velocity
  • Momentum
  • Interruptible animation
  • Rubber-banding

Transforms

  • Translate
  • Scale
  • Rotate
  • Skew
  • 3D flip
  • Perspective
  • Transform origin
  • Origin-aware animation

State transitions

  • Crossfade
  • Morph
  • Shared element transition
  • Layout animation
  • Height auto animation
  • Direction-aware transition
  • Continuity transition
  • Page transition
  • View Transitions API

Scroll effects

  • Scroll reveal
  • Scroll-driven animation
  • Parallax scrolling
  • Scrollytelling
  • Scroll pinning
  • Horizontal scroll section
  • Scroll progress bar
  • Scroll snap
  • Smooth scrolling

Interaction feedback

  • Hover effect
  • Press feedback
  • Ripple effect
  • Shake animation
  • Hold to confirm
  • Drag gesture
  • Drag to reorder
  • Swipe to dismiss
  • Pull to refresh
  • Magnetic button
  • Custom cursor
  • 3D tilt card
  • Spotlight card

Text effects

  • Typewriter effect
  • Text scramble
  • Split text animation
  • Text morph
  • Rotating words
  • Gradient text
  • Shimmer text
  • Number ticker
  • Tabular numbers
  • Underline animation

Loops & ambient motion

  • Marquee
  • Pulse animation
  • Float animation
  • Orbit animation
  • Idle animation
  • Particle background
  • Border beam
  • Confetti
  • Animated gradient

Visual effects

  • Blur
  • Clip-path
  • Mask
  • Before/after slider
  • SVG line drawing
  • Lottie animation

Motion principles

  • Purposeful animation
  • Anticipation
  • Follow-through
  • Squash and stretch
  • Perceived performance
  • Frequency of use
  • Spatial consistency
  • Reduced motion

Animation performance

  • Frame rate (FPS)
  • Jank
  • GPU acceleration
  • will-change
  • Layout thrashing

Layout

  • Hero section
  • Above the fold
  • Sticky header
  • Sidebar
  • Bento grid
  • Card
  • Flexbox
  • CSS Grid
  • Padding vs margin
  • Responsive design
  • Container
  • Masonry layout
  • Split screen
  • Z-index
  • Overflow

Components

  • Button variants
  • Modal
  • Drawer
  • Popover
  • Tooltip
  • Dropdown menu
  • Context menu
  • Toast notification
  • Tabs
  • Segmented control
  • Accordion
  • Carousel
  • Command palette
  • Combobox
  • Toggle switch
  • Checkbox
  • Radio button
  • Date picker
  • Breadcrumb
  • Pagination
  • Infinite scroll
  • Badge
  • Avatar stack
  • Empty state
  • Skeleton screen
  • Spinner
  • Progress bar
  • Data table
  • Stepper
  • Floating label
  • Inline validation
  • Alert banner
  • Tag input

States & patterns

  • Interaction states
  • Focus ring
  • Loading state
  • Optimistic UI
  • Debounce
  • Lazy loading
  • Dark mode
  • Micro-interaction
  • Affordance
  • Undo
  • Drag and drop
  • Keyboard shortcut

Visual styles

  • Glassmorphism
  • Liquid glass
  • Neumorphism
  • Claymorphism
  • Neo-brutalism
  • Skeuomorphism
  • Flat design
  • Mesh gradient
  • Aurora background
  • Grain texture
  • Glow effect
  • Drop shadow
  • Border radius
  • Grid background
  • Typographic hierarchy
  • Accent color
  • Color contrast

Vibe coding & AI

  • Vibe coding
  • Prompt
  • Context window
  • Token
  • AI agent
  • Tool call
  • Hallucination
  • Diff
  • Live preview
  • Checkpoint
  • Git commit
  • Deploy
  • Frontend and backend
  • API
  • Database
  • Rules file
  • MCP
  • Plan mode
  • Visual edit
Ring
Dots
Bars