| UI or UX | UI + UX - Bounded content loading placeholder | UI + UX - Resolved no-data content surface | UI + UX - Recoverable failure surface |
| UI guidance | Keep skeleton dimensions stable, mark the affected region busy, and use subtle or reduced-motion-respecting animation only while loading is unresolved. | Keep surrounding context such as table title, filters, or workspace name visible so users know exactly what is empty. | Render a persistent error region near the affected content with a specific failure heading, plain-language cause, preserved context, and recovery actions. |
| UX guidance | Reduce uncertainty and layout shift while predictable content loads, then resolve clearly to real content, empty state, or error state. | Move users toward the first useful object or prerequisite, and replace unavailable actions with permission or configuration guidance. | Match the next action to the failure cause: retry transient failures, edit correctable input, use cached fallback for read-only continuity, or provide support reference when recovery is outside the UI. |
| Good UI | The interface shows a clear action and state. | Permission variant explains that projects exist only after an admin grants access and offers Request access instead of Create. | A failed save state keeps the draft visible and labels the support reference separately from the user-facing explanation. |
| Bad UI | Skeleton rows look like clickable report cards and receive focus before content exists. | Oversized decorative art and vague welcome copy that hides the task. | Tiny transient toast for a blocking failure. |
| Good UX | Users see that reports are pending, then can switch the demo to loaded, empty, or error outcomes on a bounded path. | Users can create the first project, import existing work, or request access depending on the actual cause. | User input and filter context are preserved after failure, and retry returns to recovered content or a clear still-failed state. |
| Bad UX | Large layout shift after content arrives. | A primary Create button is shown to a read-only user and fails after activation. | Clearing work after save failure. |
| Best fit | The content shape is predictable. | A next setup, creation, import, sample, or access-request action is available or explainable. | A system or task failure blocks expected content or action. |
| Avoid when | A specific progress indicator or blocking message is required. | The absence was caused by filters or search. | Nothing exists yet and the state is expected. |
| Required state | Initial skeleton placeholder state with region marked busy. | First-use empty state before any objects exist. | Normal expected state before failure. |
| Accessibility burden | Mark the loading region busy or provide concise status text. | Keep the message in normal reading order near the empty region it explains. | Use appropriate alert or status semantics for newly appearing critical errors. |
| Common misuse | Showing skeletons forever. | Using marketing copy instead of a task-specific next step. | Using a transient toast for critical errors. |