About this set
The three states a data table shows before it has rows to display, in one set. Loading keeps the real header row and fills three body rows with skeleton bars for the avatar, client name, status and amount, so the columns are already the right width when the data arrives. Empty replaces the table with an icon, a heading, a short explanation and two next steps, Create an invoice and Import from CSV. Error uses the same layout in red with Try again and Contact support, and is marked role=”alert” so assistive technology announces it when it appears. Each state sits in the same white card with a small uppercase label, and on wide screens the loading card spans the full width with the two message cards side by side. Use loading while a request is in flight, empty when the request succeeds with no rows, and error when it fails. The skeleton is a grey bar with a white gradient sliding across it; the Bootstrap version uses the stock .placeholder and .placeholder-wave classes instead, and the Tailwind version defines a shimmer animation in its theme.
What’s included
- Loading table keeps the real header so column widths do not jump
- Skeleton shimmer that stops under prefers-reduced-motion
- Empty state with a primary and a secondary action
- Error state announced with role="alert"
- Bootstrap version built on .placeholder-wave, .card and .btn
Accessibility
The loading table has a caption, header cells with scope="col" and aria-busy="true" while it waits for data. The error message uses role="alert", the decorative icons are aria-hidden, and the state labels are hidden from screen readers because the headings already say what happened. Buttons show a 2px focus ring, and the shimmer is switched off when reduced motion is requested.
Customise it
Skeleton colour is #eceff4 on .sk (plain CSS), .placeholder (Bootstrap) or the bg- utility on each bar (Tailwind), and the shimmer speed is the 1.4s in the animation. The blue and red icon tiles are set by the .blue and .red rules, and the primary button colour by #4f46e5.




















