Skip to main content
Urbicon UI

EmptyState

Centered placeholder block for 'no data yet' and 'no results' states, built from an optional icon, a heading, supporting text, and an optional call-to-action.

Playground

No items yet

Get started by adding the first item.

Density
<EmptyState
  description="Get started by adding the first item."
  title="No items yet"
>
  {#snippet cta()}
    <Button intent="primary">
      <PlusIcon />
      Add item
    </Button>
  {/snippet}
</EmptyState>

01 Examples

With icon and CTA

No apartments yet

Get started by adding the first apartment.

<EmptyState
  icon={BuildingIcon}
  title="No apartments yet"
  description="Get started by adding the first apartment."
>
  {#snippet cta()}
    <Button intent="primary"><PlusIcon />Add apartment</Button>
  {/snippet}
</EmptyState>

Compact — for inline empty rows

Use density='compact' inside table bodies and small cards where the full-page layout is too tall.

No matches

Try adjusting your filter.

<EmptyState
  density="compact"
  icon={FunnelIcon}
  title="No matches"
  description="Try adjusting your filter."
/>

Embedded inside a Card

Use density='compact' when the EmptyState sits inside a container like a Card or a table body, where the default density would be too tall for the parent.

Recent activity

Nothing here yet

New events will show up as they happen.

<Card variant="outlined" padding="md">
  <h3 class="text-text-primary mb-3 text-sm font-semibold">Recent activity</h3>
  <EmptyState
    density="compact"
    icon={SearchIcon}
    title="Nothing here yet"
    description="New events will show up as they happen."
  />
</Card>

02 Customization

Pair with any icon from @urbicon-ui/blocks. Its round container is filled with the neutral surface tokens, not the accent: an empty state is not the call to action — the button under it is. On the page ground that fill reads as a faint wash, and inside an elevated container — a Card, a Popover — it disappears, because surface-subtle and surface-elevated are the same colour. Override any slot with slotClasses, unstyled, or a preset.

For a fill that always reads, or for the accent back, pass slotClasses={{ iconWrapper: 'bg-primary-subtle text-primary-text' }}, or set it once for every empty state through the provider's defaults.EmptyState.slotClasses.iconWrapper.

Use the cta snippet for the primary action; render your own markup via children for richer empty states (e.g. tutorials, illustrations).

03 Accessibility

The icon is decorative

The decorative icon is hidden from screen readers via its built-in aria-hidden.

The title is an h3

The title renders as an <h3>, so it nests under your page's <h1> in the heading hierarchy.

04 API Reference

11 props
11 props 1 required
Prop
Type
Default
Description

05 Types

Local type definitions used by this component.

4 types
Name
Kind
Category
Used by
Description

06 Installation

Import

import { EmptyState, BuildingIcon } from '@urbicon-ui/blocks';