Skeleton shapes must correspond to the content they stand in for
Aliases: skeleton as content stand-in · handoff skeleton contract · shape correspondence
What it is
A skeleton in the package is not a decorative “loading” drawing. It is a stand-in for the final content. Content-matched skeleton means the waiting frame can be claimed, block by block, by the content frame: circle to avatar, bar to title, primary to primary, in count, relative position, and rough height. Ship a generic grid of gray bars and implementation will build a generic grid; when content arrives and cannot claim it, the stand-in was never drawn as that content.
This answers who the waiting picture is standing in for as a shipped artifact — not whether to use a skeleton or a spinner, and not how a mismatch jumps at arrival. Those are selection and perception problems. The demand here is only: if a skeleton is being shipped, it must point back at the same content frame.
Why it happens
Implementation translates skeleton layers into placeholder nodes. Three equal gray bars on the layer become three equal gray bars in the tree, even when the final content is an avatar on the left, two metadata columns, and an action. Once waiting geometry is in code, the first frame of arrival can only accommodate it or overthrow it; both are expensive, and both happen after handoff. Matching writes “it will look like this” into the waiting frame, so placeholder nodes grow as the content’s bones from the first pass, and arrival swaps material, not structure.
Matching is not tracing every type size. It pins the anchors people use to orient: vertical position of the first line, landing spot of the primary, presence or absence of a side pane. When anchors claim, a slightly wrong gray radius can still be owned. When anchors were never shipped, implementation will stretch the library’s “list skeleton” over a dashboard, and even a careful arrival frame has to fight it first. If the package never places the content frame beside the skeleton frame, correspondence cannot be checked and falls to a feeling at integration.
Where it stops holding
When structure is unknown until the response returns (results are sometimes a masonry wall, sometimes a table), do not ship a skeleton that pretends to know. Waiting for that slot should be an indeterminate indicator; forced matching is a fake contract. The skeleton covers only blocks this wait can honor: a side pane that vanishes with permission should not be in the default skeleton. If the product chooses to draw no waiting frame for a very short wait, there is no skeleton to match; do not add one that will never appear. Ads and third-party embeds whose size the product does not own can be matched only at the product’s own shell, not inside the embed. Print and export have no waiting frame; this does not apply.
Applying it
- Place the arrival frame and the skeleton frame on the same page of the package, and number or overlay each block’s correspondence. Delete gray blocks that have no number.
- Draw only anchor blocks: title band, first row, primary, fixed side pane. Do not pre-draw rows that will grow and shrink with data just to make the wait look full.
- When structure forks (image or none, side pane or none), either wait until the fork is known and ship the matching skeleton, or ship no skeleton before the fork.
- Overlay the two frames at half opacity. A shifted title band, a primary that does not share coordinates between wait and arrival, or a skeleton column the content does not have, is a failed match. Edit the skeleton frame to follow the content frame; do not hide the misalignment with a transition on the gray bars.
Related
- Same group: R2.09.1 An empty state must guide the next step, not only announce absence · R2.09.2 First-use empty and emptied-after-use empty are different meanings · R2.09.3 Partial failure and total failure need separate expressions
- Adjacent: I2.01 Choosing skeleton versus spinner · R1.03 Completeness of component states
- Search terms:
content-matched skeleton·skeleton as stand-in·handoff skeleton contract