Skip to main content

Overview

Skeleton replaces real content during loading to reduce perceived wait time and prevent layout shift. It animates with a shimmer effect and can be composed into any layout using predefined shape variants.

Installation


Usage


Variants

Text Lines

Avatar Placeholder

Card Placeholder

Image Placeholder

Table Row Placeholder


API Reference

string
default:"rounded"
Shape of the skeleton. Values: text · circular · rectangular · rounded
string | number
default:"100%"
Width as a CSS value ("60%") or pixel number (240).
string | number
Height as a CSS value or pixel number. Required for non-text variants.
number
For text variant: number of text line skeletons to render.
boolean
default:"true"
Enables the shimmer animation.
string
Additional Tailwind classes for custom overrides.

Accessibility

  • Skeleton containers use aria-busy="true" and aria-label="Loading" to announce loading state
  • When content loads, aria-busy is removed so screen readers announce the real content
  • Do not use Skeleton for content that loads instantly (under 300ms) — it adds unnecessary visual noise
  • Provide a text fallback for screen readers that cannot convey the loading state visually

Do’s & Don’ts

Do

  • Mirror the exact shape and size of the real content
  • Use Skeleton for content that takes longer than 300ms to load
  • Compose multiple Skeleton elements to build realistic loading screens
  • Disable animation (animate={false}) in reduced motion environments

Don't

  • Don’t use Skeleton for content that loads instantly — use a spinner instead
  • Don’t add Skeleton for every element — focus on primary content
  • Don’t mix Skeleton with real content in the same card
  • Don’t display Skeleton indefinitely — show an error state if loading fails