GitHub

Empty State

Centered placeholder for empty lists or zero-result views: optional icon, required title, optional description, and slotted actions.

Stable .astro import EsaEmptyState from '@esa/ecology/esa-empty-state.astro';

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

PropTypeDefaultDescription
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

PropTypeDefaultDescription
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.

TokenTierResolves 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