Skeleton

A placeholder that preserves layout while content loads.

Text

One 16px bar per line of text. Vary the widths so the block reads as a paragraph, and end on a shorter line.

Shapes

Skeleton is a neutral-150 block with an 8px radius. Size and round it with className to match what loads: an avatar, a pill, a button, a card.

Entity

A 40px circle with title and description bars, matching a double-line Entity.

In a list

Render placeholder rows inside the real List so row heights, dividers and padding match the loaded state.

Best practices

When to use

  • Use while a known layout loads so the content doesn't shift the page when it arrives.
  • Use Spinner for a short action wait, and Toast only after the action completes.

Behavior

  • Match the shape and size of the content: 16px bars per text line, rounded-full for avatars and pills, rounded-[10px] for controls.
  • Render skeleton rows inside the real List or Table so row heights, dividers and padding match the loaded state.
  • Vary text bar widths and end on a shorter line. The pulse stops under prefers-reduced-motion.

Accessibility

  • Wrap a loading region in role="status" with a label ("Loading agents") so it's announced once, not per bar.