Skip to main content

Placeholders

Empty state components displayed when no content is available in a view. Use to guide users toward a relevant action when a list, table, or page has no data. Don't leave empty states blank.

Figma Storybook Docs

Description

What it does

Displays a structured empty state when a list, table, or content region has no data to show. Combines an icon or illustration, a heading, supporting text, and an optional action to help users understand the situation and take a next step.

Where it appears

Inside empty list views, data tables with no rows, search results with no matches, filtered views that return zero items, and dashboard widgets awaiting data. Common in Open Point stakeholder lists, consultation participant tables, and Social Point activity feeds.

Why it exists

An empty view with no explanation causes confusion and erodes trust — especially in government software used by non-technical staff. Placeholders make the system feel responsive and intentional, and reduce support requests by directing users toward the correct action.

Dependencies

Button, Icons

Anatomy

PartRequired?Notes
Container Required Full-width block centred within its parent region. Sets padding and vertical rhythm for all child elements.
Icon or illustration Recommended A single wa-icon or a decorative illustration that represents the empty category (e.g. a person outline for an empty stakeholder list). Sized at 48px by default.
Heading Required One short sentence naming what is empty. Uses --op-text-lg, --op-font-headline, --op-color-text-primary. Example: 'No stakeholders added yet'.
Supporting text Recommended One or two sentences explaining why the state exists or what to do next. Uses --op-text-sm, --op-font-body, --op-color-text-secondary.
Primary action Optional A single wa-button (variant='primary') pointing to the most likely next step. Only include when a direct action resolves the empty state.
Secondary action Optional A text link or ghost button for a secondary path, such as 'Learn more' or 'Import from CSV'. Appears below the primary action.

Variants

Default

Generic empty state with icon, heading, body text, and optional action.

Use for most empty lists and tables where the user may or may not be able to take action immediately.

No results

Communicates that a search or filter returned zero matches, not that data is absent.

Use when a search query or active filter is responsible for the empty state. Include a suggestion to clear filters or adjust the search term.

No access

Communicates that content exists but the user does not have permission to view it.

Use when authorisation is the reason for the empty view. Do not use the default variant — the messaging and action differ.

Error

Communicates that data failed to load due to a system error.

Use when a fetch or load operation fails. Pair with a retry action. Uses --op-color-status-error-bg for the container background.

First use

Communicates a genuinely empty dataset that the user will populate over time.

Use for brand-new accounts or empty modules. Can include a more instructional tone and a prominent primary action.

States

State Behaviour
Static Default render — icon, heading, text, and optional action are visible. No interactive states on the container itself.
Loading (transitional) Before the empty state is confirmed, show a wa-spinner or skeleton. Only replace with the placeholder once the data fetch has resolved with an empty result.
Action hover The embedded wa-button follows its own hover state using --op-color-interactive-hover. The placeholder container itself does not change.

Usage guidelines

When to use

  • A list, table, or feed has zero items to display.
  • A search or filter returns no matching results.
  • A dashboard widget has no data for the selected date range.
  • A new account or module has not yet been populated.

When not to use

  • When content is still loading — show a spinner or skeleton loader instead, then transition to the placeholder only once the empty result is confirmed.
  • When the empty state is a transient error that will resolve automatically — use a toast or inline alert instead.
  • As a full-page error state for 404 or 500 errors — use a dedicated error page layout instead.

Do / Don't

Do

Write heading text that names the specific thing that is empty: 'No consultations found' rather than 'Nothing here'.

Don't

Use vague headings like 'No data' or 'Empty' that give the user no context.

Do

Include a primary action only when it directly resolves the empty state (e.g. 'Add stakeholder', 'Create consultation').

Don't

Add a primary action that navigates away to an unrelated part of the product — this increases cognitive load.

Do

For no-results states, show what filters or search terms are active and offer a 'Clear filters' action.

Don't

Show the same generic placeholder for both a genuinely empty list and a filtered-empty list — users need different guidance.

Do

Keep supporting text to one or two sentences. Write in plain language accessible to non-technical government staff.

Don't

Include technical error codes or jargon in the visible placeholder text.

Was this page helpful?

Updated 9 September 2026