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.