About this set
A blog post card shown twice: once as a skeleton while it loads and once with its content. The skeleton copies the loaded layout block for block, with a cover, a category chip, two title bars, two shorter text bars, and an avatar with a name bar, so nothing shifts when the real content replaces it. Each grey shape has a white highlight sliding across it, and the highlight is removed entirely when the visitor asks for reduced motion. The skeleton card is marked aria-busy, its shapes are aria-hidden, and a visually hidden status element says Loading article, so a screen reader gets one short message instead of a series of empty boxes. The loaded card has a gradient cover, an Engineering tag, the title, a short excerpt and the author with the reading time, and its title is a stretched link that makes the whole card open the post. The Bootstrap version uses the stock .placeholder and .placeholder-wave classes recoloured to match; the Tailwind version defines the shimmer keyframes in its @theme and applies them with after:animate-shimmer.
What’s included
- Skeleton mirrors the loaded card so nothing shifts
- Shimmer removed under prefers-reduced-motion
- aria-busy plus one hidden Loading article status
- Loaded card clickable through a stretched link
- Bootstrap version built on .placeholder-wave
Accessibility
The skeleton's shapes are aria-hidden and a role="status" element announces Loading article; remove the skeleton and aria-busy when content arrives. The loaded card's title is an h2 with the card's only link, and keyboard focus draws a 2px indigo ring around the card. The author initials are decorative next to the written name, and the byline grey was darkened to reach 4.5:1.
Customise it
The skeleton grey is #eceff4 on .sk (on .placeholder in Bootstrap and the [&_.sk] utilities in Tailwind), and the shimmer speed is 1.4s. Bar widths are inline percentages, so match them to your own layout.




















