// preview in
saved for every page

Empty state

Fills a page, card or list that has nothing to show yet. It says what is empty, why, and what to do next.

Pattern Heading + text + actionsServer componentSource ↗

Installation

Set up Camaleo once (Installation), then import what you need. It renders on the server.

import { EmptyState, EmptyStateIcon, EmptyStateTitle, EmptyStateDescription, EmptyStateActions } from "@camaleo/react";

Anatomy

A centered column with up to four parts. Pass icon, title, description and actions, or build it from the parts as children. Every part has a data-slot you can target from CSS.

Examples

Every example is a real file you can copy. They all wear the skin, mode and brand from the bar above.

minimal · light · #3fa34d

No invoices yet

Create your first invoice, or import the ones you already sent from a CSV file.

0 of 4 products

No products match “headphones”

Check the spelling, or search by brand or model.

No search results

Type a product name, then clear the search. Repeat the query in the title so people see what to change, and announce the count in a role="status", since the empty state itself is not read out when it appears.

Couldn’t load your orders

The connection dropped before the list arrived. Your orders are safe; try again in a moment.

Email support

Loading failed

When data fails to load, say what failed and that nothing was lost, then offer a retry. A way to reach support is a link, because it goes somewhere.

You’re all caught up

No unread notifications. New ones show up here.

Nothing left to do

When empty is the good outcome, a short confirmation is enough: pass icon={null} to drop the default folder icon, and leave out actions.

Recent payments

October 2026

No payments this month

Payments received from Oct 1 appear here.

Inside a card

Keep the card's own title, so people know which section is empty, and say when it will fill up.

Import your contacts

Upload a spreadsheet and we’ll create one contact per row.

  • CSV or XLSX, up to 5 MB
  • One contact per row
  • Columns for name and email

Built from parts

Compose the parts as children when you need more than a title and a sentence, like the rules for an import. With children, no default icon is drawn.

No projects yet

Projects group the tasks, files and people of one piece of work.

First item

Create a project, then delete them all. The button you clicked disappears with the view, so focus moves to the button that replaces it and a status message says what happened.

In context

An empty state usually sits where the content will be: in a card, under a search, in place of a list. These are whole pieces of UI you can copy, in the skin you picked.

Support inbox

0 open

Inbox zero

All 18 tickets from today are resolved. New tickets from the help center arrive here.

Support inbox at zeroCard · Badge · EmptyState · Link

Catalog

No products match “standing desk”

This product isn’t in the catalog yet. Add it, or try another name.

Catalog searchCard · SearchInput · EmptyState · Button

Team

Acme Studio · Free plan, up to 5 people

Only you so far

Invite people by email. They see your projects as soon as they accept.

Team with only youCard · EmptyState · Button

Guidelines

No invoices yet

Create your first invoice, or import the ones you already sent from a CSV file.

DoGive the next step.

Say why the space is empty and put the action that fills it right there.

Empty

No data.

Don’tJust "Empty".

People can't tell if something broke or what to do, so they leave.

No invoices yet

Your first invoice takes about two minutes.

DoKeep a new account calm.

Nothing is wrong yet, so use a neutral icon and say how quick the first step is.

Error: 0 invoices found

No records exist. Contact your administrator.

Don’tError colors for a normal empty state.

Red icons and the word "Error" make people think data was lost.

Props

PropTypeDefaultDescription
iconReactNodefolder iconIcon above the title, hidden from screen readers. Without it a folder icon is drawn, unless you pass children; null removes it.
titleReactNode—What is empty, rendered as an <h3>. For another level, pass an <EmptyStateTitle as="h4"> as a child instead.
descriptionReactNode—Why it is empty and what to do next.
actionsReactNode—Buttons or links for the next step, placed last in a centered row.
childrenReactNode—Your own content, placed after the description. Use it to compose the parts.

EmptyStateIcon, EmptyStateTitle, EmptyStateDescription and EmptyStateActions take the attributes of their HTML element (span, h3, p, div). EmptyStateTitle also takes as (h2 to h6, or p; default h3) to set the heading level. EmptyState takes the attributes of a div.

Styling hooks

Restyle it without forking: target the slots, or set the tokens on a parent, a skin or the empty state itself.

Tokens it reads

Color

--cml-border-control--cml-fg--cml-fg-secondary--cml-surface-raised

Shape & size

--cml-border-width--cml-radius-control--cml-radius-popover

Type & motion

--cml-font-display--cml-font-weight-display

This component only

--cml-corner-shape

Accessibility

TabMoves to the buttons and links in the actions. The empty state itself is not a Tab stop.
Was this page helpful? · Edit this page on GitHub