Skip to content
Site volume
Colourway

Components

Skeleton

Flat blocks shaped like the content that is coming. No shimmer: it holds still.

  • Experimental
  • Reading layer
  • Server component
  • Since 0.9.0
  • Press check
Import from@maxgrits/overprint-react/skeleton
On this page

Skeleton holds the place of content that is still loading: flat blocks on the sunken face in the content's shape (a 60 % title bar, a 40 % meta bar, body lines). It never shimmers or loops; it waits like a proof waiting for its ink. Shapes: text, card and row.

Example#

Look of this example
Loading the Fernlight case study
Loading
Live render of examples/skeleton/basic.tsx

Usage#

Use a skeleton to hold the place of content that is still loading, in its shape: a card, a row, lines of text. It is flat and still: no shimmer, no loop, a proof waiting for its ink.

  • Shapes. text (lines), card (media, title and meta) and row (thumb, title and meta).
  • Short waits need nothing; a skeleton that flashes for 100 ms is worse than none.
  • Unknown waits with no shape to hold are a Loader.

Anatomy#

Loading the Fernlight case study
Loading
The parts of examples/skeleton/basic.tsx, numbered:
  1. Mediadata-mk-part="media"
  2. Titledata-mk-part="title"
  3. Metadata-mk-part="meta"
  4. Linedata-mk-part="line"

Volume#

Reading layer: identical at every volume.

  • Quiet

    Loading the Fernlight case study
    Loading

    Docs, forms, legal and long reads. Flat inks, no art in motion.

  • Studio

    Loading the Fernlight case study
    Loading

    The site default. Art on its own plates, one display moment per view.

  • Press

    Loading the Fernlight case study
    Loading

    Hero moments, covers and campaigns. Halftone fields and the second ink.

  • Rave

    Loading the Fernlight case study
    Loading

    Launches, posters and the 404. Every ink, and the words still win.

Content#

  • Skeletons carry no words. If the wait runs long, a visible line under it says what is loading.

Do and don't#

Do

Loading

Still, in the content's shape.

Don't

A skeleton with a shimmer sweeping across it forever.

A loop that never settles.

Loops pull the eye from the content that has loaded. A still placeholder says the same thing quietly (D-E3).

Accessibility#

  • It is a polite status that says its label ("Loading") once; the blocks are hidden from assistive tech.
  • No motion of any kind, so nothing changes under reduced motion.
  • Under more contrast every block gets a rule, so the shapes stay visible.

The colour pairs it prints, with their contrast on both papers:

It prints no text of its own (art layer or layout only), so it has no pair to check.

Props#

PropTypeDefaultDescription
shapeSkeletonShapenone
linesnumber3Body lines under the title and meta bars (`text` and `card`, default 3).
labelstring"Loading"Announced once (default "Loading").

Plus 279 React and DOM attributes passed through to the root element (className, ref, aria-*, event handlers and the rest). Generated from SkeletonProps in packages/overprint-react/src/reading/skeleton/skeleton.tsx.

Tokens#

System tokens (7)

Its own properties (3)

  • --mk-skeleton-line
  • --mk-skeleton-title-after
  • --mk-skeleton-title-before

Scanned from its CSS at build and checked against its registry entry.

Changelog#

Arrived in 0.9.0.

0.9.024 October 2026

  • MinorreactBreadcrumbs, Pagination (with paginationRange), Count, ProgressBar (bar, segments, indeterminate), Avatar and AvatarGroup, Tick, EmptyState, Kbd, Skeleton and Loader. Read the whole entry