Empty State
Centered placeholder for empty lists or zero-result views: optional icon, required title, optional description, and slotted actions.
Preview
No results
Try adjusting your filters.
<EmptyState title="No results" description="Try adjusting your filters." /> Sizes
No results
Try adjusting your filters.
No results
Try adjusting your filters.
No results
Try adjusting your filters.
No results
Try adjusting your filters.
<EmptyState size="xs" title="No results" description="Try adjusting your filters." />
<EmptyState size="sm" title="No results" description="Try adjusting your filters." />
<EmptyState size="md" title="No results" description="Try adjusting your filters." />
<EmptyState size="lg" title="No results" description="Try adjusting your filters." /> Icon & actions
Pass an icon via the icon slot and action buttons via the default slot. The title alone is enough for a minimal state.
No documents yet
Upload your first document to get started.
<EmptyState title="No documents yet" description="Upload your first document to get started.">
<svg slot="icon">…</svg>
<button type="button">Upload document</button>
</EmptyState> API
| Prop | Type | Default | Description |
|---|---|---|---|
title | string | — | Required. The primary heading of the empty state. |
description | string | — | Optional supporting line below the title. |
size | 'xs' | 'sm' | 'md' | 'lg' | 'md' | Scales icon, text, and padding. |
Slots
| Prop | Type | Default | Description |
|---|---|---|---|
icon | slot | — | Inline SVG, scaled to the size variant. |
default | slot | — | Action buttons rendered below the description. |
Accessibility
- The title renders as an
<h3>— keep heading order coherent within the page. - The icon is decorative (
aria-hidden); meaning comes from the title and description. - Action buttons in the default slot keep native button semantics and focus order.
Theming surface
Every public token this component reads, extracted from its source at build time.
The Resolves to column walks each token's real lineage —
component → semantic → primitive → raw value — so you
can see exactly where re-pointing it lands. A spoke re-skins by overriding these in
its theme-<slug>.css; component internals are never edited. No
hook for what you need? File it with /request-lego.
| Token | Tier | Resolves to |
|---|---|---|
--empty-state-description-color | component | #646464 via --color-text-secondary → --color-gray-11 |
--empty-state-gap | component | 0.5rem via --spacing-200 |
--empty-state-icon-color | component | #838383 via --color-text-muted → --color-gray-10 |
--empty-state-icon-size-lg | component | 64px |
--empty-state-icon-size-md | component | 48px |
--empty-state-icon-size-sm | component | 32px |
--empty-state-icon-size-xs | component | 24px |
--empty-state-title-color | component | #202020 via --color-text-primary → --color-gray-12 |
--spacing-100 | primitive | 0.25rem |
--spacing-200 | primitive | 0.5rem |
--spacing-300 | primitive | 0.75rem |
--spacing-400 | primitive | 1rem |
--spacing-600 | primitive | 2rem |
--spacing-800 | primitive | 4rem |