FilterEmptyState

Empty and filtered-empty states with an optional reset action.

Usage

svelte
<script lang="ts">
  import { FilterEmptyState } from "@milandekruijf/ui/svelte";

  const items = ["Static i18n plumbing", "Prerendered sitemap"];

  let selected = $state<string[]>([]);
  const visible = $derived(
    selected.length === 0 ? items : items.filter((i) => selected.every((t) => i.includes(t))),
  );
</script>

<FilterEmptyState
  totalCount={items.length}
  filteredCount={visible.length}
  hasActiveFilters={selected.length > 0}
  emptyLabel="No items yet."
  emptyFilteredLabel="No items match these tags."
  resetLabel="Reset filters"
  onReset={() => (selected = [])}
/>

Examples

Filtered empty
  • Static i18n plumbing
  • Prerendered sitemap
<script lang="ts">
  import { css } from "@milandekruijf/pandacss/css";
  import { Button, FilterEmptyState } from "@milandekruijf/ui/svelte";

  const items = ["Static i18n plumbing", "Prerendered sitemap"];

  let selected = $state<string[]>([]);
  const visible = $derived(
    selected.length === 0
      ? items
      : items.filter((item) =>
          selected.every((tag) => item.toLowerCase().includes(tag)),
        ),
  );

  function reset() {
    selected = [];
  }
</script>

<div class={css({ display: "flex", flexDirection: "column", gap: 4, minW: 0 })}>
  <div class={css({ display: "flex", gap: 2 })}>
    <Button
      size="sm"
      color={selected.length > 0 ? "slate" : "ghost"}
      onclick={() => (selected = ["missing"])}
    >
      Filter to nothing
    </Button>
    <Button size="sm" color="ghost" onclick={reset}>Show all</Button>
  </div>
  <FilterEmptyState
    totalCount={items.length}
    filteredCount={visible.length}
    hasActiveFilters={selected.length > 0}
    emptyLabel="No items yet."
    emptyFilteredLabel="No items match these tags."
    resetLabel="Reset filters"
    onReset={reset}
  />
  {#if visible.length > 0}
    <ul class={css({ m: 0, p: 0, listStyle: "none" })}>
      {#each visible as item (item)}
        <li class={css({ color: "slate.12", py: 1 })}>{item}</li>
      {/each}
    </ul>
  {/if}
</div>

Props

PropTypeDefaultDescription
totalCountnumber—
Items before filtering; `0` renders the plain empty state.
filteredCountnumber—
Items after filtering.
hasActiveFiltersboolean—
Whether any filter differs from its default.
emptyLabelstring—
Shown when there is nothing to list at all.
emptyFilteredLabelstring—
Shown when filters hide every item.
resetLabelstring—
Reset button label.
onReset() => void—
Clears every filter back to its default.
class?string—
Extra classes merged on the block.

Renders nothing while `filteredCount` is non-zero; place it below the panel, above the result grid.