Experience System
Components

Empty

Centered empty-state layout for missing content, errors, and long-running tasks.

No items yet
Add your first item to get started.

Installation

The components are exported from @by/experience-system. Add the package with your package manager:

pnpm add @by/experience-system

In this monorepo, depend on the workspace package (for example via workspace:* or your catalog) so imports resolve to packages/experience-system.

Composition

Use the following composition to build an Empty state:

Empty
├── EmptyHeader
│   ├── EmptyMedia (optional)
│   ├── EmptyTitle
│   └── EmptyDescription
└── EmptyContent (optional)

Use Empty when there is nothing to show yet, when an operation failed, or when a long process is in progress. Icons come from @by/icons. For product copy and layout guidance, see the Luminate UX design guidelines for Empty State.

Usage

import {
  Empty,
  EmptyContent,
  EmptyDescription,
  EmptyHeader,
  EmptyMedia,
  EmptyTitle,
} from '@by/experience-system';

Empty and its parts are client components ('use client'). Use them inside a Client Component or a dynamic import when using the Next.js App Router.

<Empty>
  <EmptyHeader>
    <EmptyMedia variant="icon">{/* icon */}</EmptyMedia>
    <EmptyTitle>No results</EmptyTitle>
    <EmptyDescription>Try adjusting filters or search.</EmptyDescription>
  </EmptyHeader>
  <EmptyContent>{/* actions */}</EmptyContent>
</Empty>

Examples

The live preview at the top of this page uses empty-usage.

Informative

The Empty component could be used in cases when the page is empty because of missing initial configuration and some actions are required from the user. In such cases describe why the screen is empty and what is expected from the user to continue. Append it with most expected actions in EmptyContent section. Read more about informative empty states on the Informative/Onboarding states guidelines page.

Welcome to planning
Let us start with defining initial filters.

Error

Use the same composition for failure states: warning icon, error message, explanation on what is happened and how users can go further. Append with recovery actions, and a troubleshooting link when it is required. In case of use as a page-level error the icon could be emphasized with appropriate color: use fill-error-alpha-8! for the nested icon component. For use in a card such visual emphasis is usually not required. More explanation could be read on Error states guidelines page.

Data could not be synced
The data sync failed due to a configuration or system issue. Contact your administrator or try one of the options below to continue.
Start troubleshooting

Loading

For loading state there is no need to use any icon. Add Progress indicator after a title for short-time loading, and list of ongoing and performed activities inside EmptyContent for long-running processes or setup flows. Read more about usage and best practices on the Loading states guidelines page.

Syncing data
This process may take several minutes. You will be notified when it is complete.
Update engine details
Update configurations
Complete setup

API Reference

Subsection titles name the exports from @by/experience-system. These parts are plain layout components (not Radix primitives).

Empty

Root container (div). Centers content; supports @container/empty for responsive tweaks.

PropTypeDefault
classNamestring

Also accepts standard div attributes.

Data attributeValues
data-slotempty

EmptyHeader

Groups media, title, and description in a column.

Data attributeValues
data-slotempty-header

Also accepts standard div attributes.

EmptyMedia

Slot for an icon or illustration.

PropTypeDefault
variantdefault | icondefault
Data attributeValues
data-slotempty-icon
data-variantmirrors variant

Also accepts standard div attributes.

EmptyTitle

Primary heading.

Data attributeValues
data-slotempty-title

Also accepts standard div attributes.

EmptyDescription

Supporting text; links pick up underline styles.

Data attributeValues
data-slotempty-description

Also accepts standard div attributes (renders a div with link-oriented typography).

EmptyContent

Optional region below the header for buttons, lists, or progress.

Data attributeValues
data-slotempty-content

Also accepts standard div attributes.

Accessibility

  • Mark decorative icons with aria-hidden when the title or description already conveys meaning.
  • Keep heading and body text in logical order (EmptyTitle before EmptyDescription).
  • For loading patterns, expose status to assistive technology (for example aria-busy on a parent region) when appropriate.

Source in the repo: packages/experience-system/src/components/Empty/Empty.tsx. Agent-oriented usage notes: packages/experience-system/src/components/Empty/Empty_instructions.md.