Skip to content

Empty states

An empty state tells you why a list or a board has nothing to show and what to do about it. It is one calm sentence and, when there is one, the action that fills it.

Example

Add the first project to start this board.

What it holds

The sentence says what goes here or why nothing is here. The action is the one that fills the list, and it opens the same form as the Add button in the toolbar.

Leave out icons and illustrations. They push the action down and say nothing the sentence does not.

Notifications

You are all caught up.

Sentence on a page
20 px, 26 px from 640 px wide, weight 700
--text
Sentence in a panel or card
14 px on 20 px
--text-muted
Sentence width
34 rem at most, in balanced lines
Action on a page
Primary button, 44 px
Space above the action
24 px
--space-6
Space above and below
48 px, 64 px from 640 px wide
--space-12, --space-16

Why it is empty

Nothing yet

Say what goes here and offer the create action.

Add the first candidate to this project.

Nothing matches

A search or a filter hid everything, so say so and offer the way back.

No candidates match these filters.

All done

You have dealt with everything. Say it plainly and offer nothing.

You are all caught up.

Filled by you

A list such as Saved candidates fills only when you add to it. Say how.

Candidates you save appear here.

No access

Leave out the action and say who can act.

Only the owners of this board can add items.

Where it sits

On a page, the empty state takes the place of the content, and the toolbar stays so search and filters remain in reach. In a table, the header row stays and the sentence fills a body at least three rows high. In a panel, a card or the notification center, the sentence is small and muted.

Status is Offer sent

NameStatusOwnerCountry

No items match these filters.

Before it is empty

A list is empty only after its content has loaded. While it loads, it shows its skeleton. If the load fails, it shows the error and Try again, not a sentence saying there is nothing here.

When a search you just ran finds nothing, a screen reader hears it once: “No candidates match.”

Loading candidates

While it loads

Add the first candidate to this project.

Loaded, with nothing in it

The candidate list did not load.

Did not load

Permitted and not permitted

Permitted

  • Add the first project to start this board.

    Says what goes here, and the button does it.

  • You are all caught up.

    Nothing to do, so nothing to press.

Not permitted

  • No data

    Gives the reader nothing to act on.

  • A large icon above the sentence

    It repeats the sentence as a picture and pushes the action out of view.

  • Oops, nothing here yet!

    Cheer does not help. Say what goes here.

NextLoading

Empty states

Tells the reader why a loaded surface has nothing to show and offers the action that fills it: one sentence, at most one action, no icon.

  • Kind: pattern
  • Page: https://design.werklist.com/patterns/empty-states
  • Version: 2.1.2

When to use it

  • A surface has loaded and has no items
  • A search or a filter returned nothing
  • The reader has dealt with everything and is all caught up
  • A list that only the reader's own action fills is empty
  • A reader who cannot add sees an empty surface

When not to use it

  • Before the content has loaded: show the skeleton
  • When the load failed: show the error in place
  • Icons, illustrations, a second paragraph

Rules

  • One sentence and at most one action. No icon, illustration or second paragraph.
  • The toolbar, the search field and the filters stay above the empty state.
  • In a table the header row stays, and the small sentence fills a body at least three rows high.
  • A surface is empty only after it has loaded. While it loads it shows its skeleton, and a failed load shows the error.
  • The action opens the same form as the Add button in the toolbar.
  • A search that finds nothing is announced once: 'No candidates match.'

Anatomy

  • Sentence on a page: 20 px, 26 px from 640 px wide, line height 1.25, weight 700, in balanced lines at most 34 rem wide (--text)
  • Sentence in a panel or a card: 14 px on 20 px, weight 400 (--text-muted)
  • Action on a page: Primary button, 44 px, 24 px under the sentence. It opens the same form as the Add button in the toolbar. (--space-6)
  • Action in a panel or a card: Quiet small button or a link, 8 px under the sentence, or none (--space-2)
  • Space above and below: On a page 48 px, 64 px from 640 px wide. In a panel or a card 48 px. (--space-12, --space-16)

Variants

  • Nothing yet: Says what goes here and offers the create action: 'Add the first candidate to this project.'
  • Nothing matches: Says the search or the filters hid everything and offers Clear filters or Clear search
  • All done: Says the reader is finished and offers nothing: 'You are all caught up.'
  • Filled by you: Says how the list fills and offers nothing: 'Candidates you save appear here.'
  • No access: Says who can add and offers nothing: 'Only the owners of this board can add items.'
  • Error in place: The failure sentence in full ink and Try again, as the Errors pattern sets it

Accessibility

  • The sentence is plain text in reading order. It is a heading only when the surface has no other.
  • The action follows the sentence in reading order.

Content

  • Say what goes here or why nothing is here.
  • No 'Oops', no exclamation mark, no 'No data'.

Tokens

  • --text
  • --text-muted
  • --space-2
  • --space-6
  • --space-12
  • --space-16

JSON

{
  "title": "Empty states",
  "path": "/patterns/empty-states",
  "url": "https://design.werklist.com/patterns/empty-states",
  "text": "https://design.werklist.com/agent/patterns/empty-states",
  "summary": "One calm sentence and the next action, for a list or a board with nothing to show.",
  "version": "2.1.2",
  "kind": "pattern",
  "name": "Empty states",
  "purpose": "Tells the reader why a loaded surface has nothing to show and offers the action that fills it: one sentence, at most one action, no icon.",
  "use": [
    "A surface has loaded and has no items",
    "A search or a filter returned nothing",
    "The reader has dealt with everything and is all caught up",
    "A list that only the reader's own action fills is empty",
    "A reader who cannot add sees an empty surface"
  ],
  "avoid": [
    "Before the content has loaded: show the skeleton",
    "When the load failed: show the error in place",
    "Icons, illustrations, a second paragraph"
  ],
  "anatomy": [
    {
      "part": "Sentence on a page",
      "measure": "20 px, 26 px from 640 px wide, line height 1.25, weight 700, in balanced lines at most 34 rem wide",
      "token": "--text"
    },
    {
      "part": "Sentence in a panel or a card",
      "measure": "14 px on 20 px, weight 400",
      "token": "--text-muted"
    },
    {
      "part": "Action on a page",
      "measure": "Primary button, 44 px, 24 px under the sentence. It opens the same form as the Add button in the toolbar.",
      "token": "--space-6"
    },
    {
      "part": "Action in a panel or a card",
      "measure": "Quiet small button or a link, 8 px under the sentence, or none",
      "token": "--space-2"
    },
    {
      "part": "Space above and below",
      "measure": "On a page 48 px, 64 px from 640 px wide. In a panel or a card 48 px.",
      "token": "--space-12, --space-16"
    }
  ],
  "variants": [
    {
      "name": "Nothing yet",
      "use": "Says what goes here and offers the create action: 'Add the first candidate to this project.'"
    },
    {
      "name": "Nothing matches",
      "use": "Says the search or the filters hid everything and offers Clear filters or Clear search"
    },
    {
      "name": "All done",
      "use": "Says the reader is finished and offers nothing: 'You are all caught up.'"
    },
    {
      "name": "Filled by you",
      "use": "Says how the list fills and offers nothing: 'Candidates you save appear here.'"
    },
    {
      "name": "No access",
      "use": "Says who can add and offers nothing: 'Only the owners of this board can add items.'"
    },
    {
      "name": "Error in place",
      "use": "The failure sentence in full ink and Try again, as the Errors pattern sets it"
    }
  ],
  "rules": [
    "One sentence and at most one action. No icon, illustration or second paragraph.",
    "The toolbar, the search field and the filters stay above the empty state.",
    "In a table the header row stays, and the small sentence fills a body at least three rows high.",
    "A surface is empty only after it has loaded. While it loads it shows its skeleton, and a failed load shows the error.",
    "The action opens the same form as the Add button in the toolbar.",
    "A search that finds nothing is announced once: 'No candidates match.'"
  ],
  "accessibility": [
    "The sentence is plain text in reading order. It is a heading only when the surface has no other.",
    "The action follows the sentence in reading order."
  ],
  "content": [
    "Say what goes here or why nothing is here.",
    "No 'Oops', no exclamation mark, no 'No data'."
  ],
  "tokens": [
    "--text",
    "--text-muted",
    "--space-2",
    "--space-6",
    "--space-12",
    "--space-16"
  ]
}

Raw file: https://design.werklist.com/agent/patterns/empty-states