Skip to content
Fleetline

Skeleton

Usage

Use skeletons while the first load of a content area is in flight: the vehicle list, a work order card, the service history table. Matching the final layout keeps the page from jumping when data arrives.

Anatomy

  1. Group — .skeleton-group[aria-busy="true"] around the loading area
  2. Status — one visually hidden role="status" ("Loading vehicles…")
  3. Blocks — .skeleton shapes inside an aria-hidden="true" wrapper

Examples

Skeleton

Loading work order notes…
Loading mechanics…
Loading vehicle KX-24…
Loading service history…
<div class="skeleton-group" aria-busy="true">
  <span class="sr-only" role="status">Loading vehicle KX-24…</span>
  <div class="skeleton-card" aria-hidden="true">
    <span class="skeleton skeleton--media"></span>
    <span class="skeleton skeleton--heading"></span>
    <span class="skeleton skeleton--text"></span>
    <span class="skeleton skeleton--text skeleton--w-60"></span>
  </div>
</div>
<!-- When data arrives: replace the group's content, remove aria-busy -->

API

HookValuesPurpose
.skeleton-group[aria-busy="true"]block + attributeLoading region
.skeletonblockOne placeholder shape
.skeleton--text | --heading | --avatar | --media | --cellmodifierShape
.skeleton--w-40 | -60 | -80modifierLine width (default 100%)
.skeleton-row, .skeleton-lines, .skeleton-card, .skeleton-table (+ __row, __row--head)layout helpersCommon compositions

Do and don't

Do vary line widths so the placeholder reads as text.

Each skeleton block announced as "Loading" to screen readers.

Don't expose the blocks; hide them and use one status message per region.

Accessibility

Tokens

Custom propertyPurpose
--color-bg-mutedBlock fill
--color-bg-subtleShimmer highlight
--radius-sm | -md | -lg | -fullLines, media, card, avatar
--size-control-mdAvatar size
--density-{comfortable|compact}-cell-padding-yTable row height per density
--motion-duration-slower, --motion-easing-standardShimmer timing (× 3)