Skip to content

Empty State

Empty states are used to communicate that a page, section, or data set has no content to display. They combine an illustration, a title, a subtext, and optional action buttons to guide users on what to do next — whether that’s creating their first item, adjusting filters, or trying again later.

Loading Code Block...

The default empty state displays a built-in illustration, a title, a descriptive subtitle, and action buttons via the integrated ButtonGroup.

No Data Available

There is no data available at the moment.

Loading Code Block...

Four sizes are available — sm, md, lg, and xl — which scale the illustration, typography, and action button sizes proportionally. The button size is automatically mapped to a smaller ButtonGroup size for visual balance.

EmptyState sizeIllustrationTitle styleButton size
sm96 × 96Small boldxs
md184 × 184Medium boldsm
lg280 × 280Header boldmd
xl384 × 384Header boldlg

No Data Available

There is no data available at the moment.

Loading Code Block...

The lets you replace the default illustration. Pass a URL string for a simple <img> tag, or pass a for full control over the graphic.

When image is omitted, a built-in SVG illustration is rendered automatically, scaled to the current size.

Empty State

No Orders Yet

Your order history will appear here once you make a purchase.

Loading Code Block...

The buttonGroup prop accepts a ButtonGroupProps object to render action buttons below the subtext. The button size is automatically derived from the size prop — you do not need to set it manually.

No Transactions Found

There are no transactions matching your current filters.

Loading Code Block...

When the buttonGroup prop is omitted, only the illustration, title, and subtext are shown — useful for informational empty states where no user action is required.

All Caught Up!

You have no new notifications at the moment.

Loading Code Block...

The buttonGroup prop accepts the following shape in both frameworks:

PropsDefaultTypeDescription
type'default''default' | 'link' | 'stretch'Layout type. 'default' right-aligns buttons, 'link' spaces them with a tertiary link on the left, 'stretch' makes buttons full-width.
layout'horizontal''horizontal' | 'vertical'Stacking direction of the buttons.
primaryButton-{ text: string; onClick?: () => void; [key: string]: any }Required. The main call-to-action button. Rendered with the default button variant.
secondaryButton-{ text: string; onClick?: () => void; [key: string]: any }Optional. A secondary action button rendered with the outline variant.
tertiaryButton-{ text: string; onClick?: () => void; [key: string]: any }Optional. A tertiary link-style action. Only rendered when type is 'link'. Note: Vue's EmptyState forces type to 'default', so `tertiaryButton` is never rendered when passed via EmptyState's `buttonGroup` prop in Vue.
  • The title is rendered as a heading element — if the empty state is used inside a page that already has a primary heading, consider wrapping it in a <section> with an appropriate aria-label to maintain heading hierarchy.
  • When using a custom image, provide meaningful alt text if it conveys information. Decorative illustrations should use alt="" or role="presentation".
  • Ensure action buttons have clear, descriptive labels — avoid generic text like “Click Here”.
  • The default illustration is purely decorative and does not convey critical information.