Menu
Overview
General
ButtonBadgePillsAvatarBrand lockupLayout
ContainerGrid & RowSurface & text utilitiesApp shellPage headerData Display
CardTableChartsCalendarStatsBulletsLeadersLogo wallCollapse & DisclosureTimelineValue chainDescriptionsFeedback
AlertProgressModalSlide-overSkeletonEmpty stateForms
Field & InputDropdownLead form & CTA rowDate pickerFilter barNavigation
NavSide navigationTop navigationApp switcherUser menuStepperTabsBreadcrumbPaginationTemplates
Sign-in pageSigned-out pageSettings layoutTheming
Browser tabProduct themesFeedback
Skeleton
Calm loading placeholder from neutral tokens: static blocks shaped like the content, no shimmer.
neutral token blocks · aria-busy
<div class="card" style="max-width:24rem">
<div style="display:flex;gap:var(--space-3);align-items:center;margin-bottom:var(--space-4)">
<span style="width:2.75rem;height:2.75rem;border-radius:var(--radius-pill);background:var(--bg-muted)"></span>
<span style="flex:1;display:flex;flex-direction:column;gap:var(--space-2)">
<span style="height:var(--space-3);width:60%;border-radius:var(--radius-sm);background:var(--bg-muted)"></span>
<span style="height:var(--space-3);width:35%;border-radius:var(--radius-sm);background:var(--bg-subtle)"></span>
</span>
</div>
<span style="display:block;height:var(--space-3);border-radius:var(--radius-sm);background:var(--bg-muted);margin-bottom:var(--space-2)"></span>
<span style="display:block;height:var(--space-3);width:85%;border-radius:var(--radius-sm);background:var(--bg-muted);margin-bottom:var(--space-2)"></span>
<span style="display:block;height:var(--space-3);width:70%;border-radius:var(--radius-sm);background:var(--bg-subtle)"></span>
</div>
Usage
- Skeletons are static grey blocks from the neutral tokens: no shimmer, no pulse. Decorative animation is banned; a calm placeholder is the Novus loading state.
- Match the skeleton's shape to the content that will replace it (rows for a table, a card for a card), so nothing jumps on arrival.
- Show a skeleton only for loads long enough to notice; flashing one for a fast response is worse than nothing.
- Mark the loading region with
aria-busy="true"until the real content lands.