Guidelines for every state a screen can be across Customer.io interfaces.
Use SkeletonShape and SkeletonText as the default loading pattern. Use Spinner for inline actions. Use PageLoader for full-page transitions.
The person has never used this feature and has no data yet. Use EmptyState with a single primary CTA.
| Variant | When to use |
|---|---|
default | Basic functionality. Lead with the noun ("No segments yet") and an action-oriented CTA ("Create your first segment"). |
promotion | Feature discovery. Designed for highlighting features or capabilities, featuring a more prominent layout with the graphic at the bottom. The title can include an eyebrow badge for additional emphasis. |
The person had data, but a search or filter returned nothing. Use EmptyState.
Some data loaded successfully, some didn't. Or a bulk operation partially completed.
caution variant to surface partial failures alongside the successfully loaded content.Something failed. The approach depends on where the failure happened. Always provide a recovery path when one exists. For copy guidance, see Content — Errors and system feedback.
| Scope | Component | Example |
|---|---|---|
| Page failed to load | Banner | Full-page error with retry action |
| Action failed | Snackbar with the error variant | "Campaign couldn't be saved" with recovery path |
| Field validation | Inline error on the form control | "Enter a valid email address" |
Confirm what happened, then get out of the way. For copy guidance, see Content — Success messages.
| Pattern | When to use |
|---|---|
Snackbar with the success variant | Ephemeral confirmations (3s auto-dismiss) |
| Inline checkmark | In-place edits |
An action exists but can't be taken right now.
isDisabled prop on the component (Button, TextField, Select, etc.).The feature exists but the person's role doesn't allow access.
The network connection is unavailable or unreliable.
The first item has been added. The screen is no longer empty but may look sparse.
More data than the screen can show at once.