12. Empty, error & loading states
The three states between "nothing here yet" and "everything's working." Most products treat them as afterthoughts. Done well, they're some of the most considerate parts of a UI — and the easiest to recognize when they're missing.
Gallery
Three canonical patterns. All follow the same shape: icon (or skeleton) + headline + supporting copy + action.
No devices yet
Add your first device to get started.
Couldn't load devices
Connection to the workcell controller failed.
When to use each
Three decisions: whether the empty state earns design, which loading affordance fits, and how much an error should explain.
Create your first workflow to start running methods.
No active alerts. The workcell is operating normally.
An error occurred. Please try again.
Last seen 4 minutes ago. The controller may be offline or unreachable on the network.
Drift to avoid
Six named anti-patterns. Empty-and-error drift is especially common because these states ship last — after the happy path is "done."
- Don't ship a feature without an empty statePrinciple 5The empty state is the user's first impression of any feature. A blank table with no copy, no icon, no CTA reads as broken UI — not as "you haven't done this yet." Cited in Tables §8c; canonical here.
- Don't write "Something went wrong"UXThe single most-common error message in software, and the least useful. Always name the failed operation, suggest the likely cause, and surface at least one path forward. "Couldn't load methods — check your connection" is ten-times the user-respect for the same character budget.
- Don't show a spinner for fast operationsUXA spinner that appears and disappears in under 300ms reads as flicker — visual noise without information. For sub-300ms operations, render the result. The user's brain interprets "instant" as faster than "fast spinner."
- Don't use a skeleton that doesn't match the final layoutUXSkeleton bars exist to hint at the shape of what's coming. A four-bar skeleton replaced by a one-line summary causes jarring layout shift; the skeleton was a lie. Match the skeleton structure to the real content's structure.
- Don't pair an empty state with a CTA that leads nowhereUX"Get started" buttons that route to a marketing page, a setup wizard that's been removed, or a generic dashboard all break the contract. If you can't ship the destination, don't ship the button. Drop the CTA; let the headline do the work.
- Don't hide the empty state below the foldUXAn empty state buried under page chrome (long header, navigation, summary bar) gets missed. Place the empty state where the data would have been — the user's eye is already there.
Composition — same view, three states
The same "Method library" panel in all three states. Considering states as siblings of the populated state — not as exceptions — produces better feature design. Build the empty, error, and loading variants alongside the happy path, not after it.
No methods yet
Create your first method to start running protocols on the workcell.
Couldn't load methods
The library service didn't respond. Last successful sync 12 minutes ago.