Glin UI
Primitive / Moleculebeta

Empty

Empty state with media, title, description, and action slots.

Edit on GitHub
Inbox zero

You have answered every conversation. New messages will show up here.

Installation

Install from
pnpm dlx @glinui/cli@latest add empty

Prefer the package?

Usage

Variants

Every vocabulary variant on the default tone. Omit variant to follow the ambient design style.

glinr

No items yet.

solid

No items yet.

plain

No items yet.

soft

No items yet.

outline

No items yet.

ghost

No items yet.

gradient

No items yet.

import { Empty, EmptyDescription, EmptyHeader, EmptyTitle } from "@glinui/ui"
export function EmptyVariantsDemo() {
return (
<div className="grid gap-4 md:grid-cols-2">
<Empty variant="glinr"><EmptyHeader><EmptyTitle>glinr</EmptyTitle><EmptyDescription>No items yet.</EmptyDescription></EmptyHeader></Empty>
<Empty variant="solid"><EmptyHeader><EmptyTitle>solid</EmptyTitle><EmptyDescription>No items yet.</EmptyDescription></EmptyHeader></Empty>
<Empty variant="plain"><EmptyHeader><EmptyTitle>plain</EmptyTitle><EmptyDescription>No items yet.</EmptyDescription></EmptyHeader></Empty>
<Empty variant="soft"><EmptyHeader><EmptyTitle>soft</EmptyTitle><EmptyDescription>No items yet.</EmptyDescription></EmptyHeader></Empty>
<Empty variant="outline"><EmptyHeader><EmptyTitle>outline</EmptyTitle><EmptyDescription>No items yet.</EmptyDescription></EmptyHeader></Empty>
<Empty variant="ghost"><EmptyHeader><EmptyTitle>ghost</EmptyTitle><EmptyDescription>No items yet.</EmptyDescription></EmptyHeader></Empty>
<Empty variant="gradient"><EmptyHeader><EmptyTitle>gradient</EmptyTitle><EmptyDescription>No items yet.</EmptyDescription></EmptyHeader></Empty>
</div>
)
}

No results

A dashed empty state that offers a way back.

No results for "quarterly report"

Check the spelling, remove a filter, or search by project name instead.

import { MagnifyingGlass, Plus, X } from "@phosphor-icons/react"
import {
Button,
Empty,
EmptyContent,
EmptyDescription,
EmptyHeader,
EmptyMedia,
EmptyTitle
} from "@glinui/ui"
export function Demo() {
return (
<Empty variant="dashed" className="w-full max-w-lg">
<EmptyHeader>
<EmptyMedia variant="icon"><MagnifyingGlass aria-hidden /></EmptyMedia>
<EmptyTitle>No results for "quarterly report"</EmptyTitle>
<EmptyDescription>Check the spelling, remove a filter, or search by project name instead.</EmptyDescription>
</EmptyHeader>
<EmptyContent>
<div className="flex flex-wrap justify-center gap-2">
<Button variant="outline" size="sm">
<X aria-hidden className="size-4" />
Clear filters
</Button>
<Button size="sm">
<Plus aria-hidden className="size-4" />
New document
</Button>
</div>
</EmptyContent>
</Empty>
)
}

In a layout

An empty state inside a card, below its header actions.

Exports

Download reports as CSV or PDF.

No exports yet

Exports you create stay available for 30 days.

import { FileArchive } from "@phosphor-icons/react"
import {
Button,
Card,
CardContent,
CardDescription,
CardHeader,
CardTitle,
Empty,
EmptyContent,
EmptyDescription,
EmptyHeader,
EmptyMedia,
EmptyTitle
} from "@glinui/ui"
export function Demo() {
return (
<Card className="w-full max-w-2xl">
<CardHeader>
<div className="flex items-center justify-between gap-3">
<CardTitle>Exports</CardTitle>
<Button size="sm" variant="outline">Schedule export</Button>
</div>
<CardDescription>Download reports as CSV or PDF.</CardDescription>
</CardHeader>
<CardContent>
<Empty variant="plain">
<EmptyHeader>
<EmptyMedia variant="icon"><FileArchive aria-hidden /></EmptyMedia>
<EmptyTitle>No exports yet</EmptyTitle>
<EmptyDescription>Exports you create stay available for 30 days.</EmptyDescription>
</EmptyHeader>
<EmptyContent>
<Button size="sm">Create first export</Button>
</EmptyContent>
</Empty>
</CardContent>
</Card>
)
}

Accessibility

  • Plain content container; headings and links inside keep their native semantics.
  • Decorative icons should be `aria-hidden`.
  • Use an actual heading element via `EmptyTitle` content when the empty state needs to appear in the document outline.

Keyboard Interactions

KeyAction
TabMoves through actions placed in EmptyContent.

Reduced Motion

Static component with no motion.

API Reference

Empty

PropTypeRequiredDefaultDescription
variant"default" | "icon"Noambient (glinr)Surface variant. Omit to follow the ambient design style (glinr by default, plain for minimal, glass for glass).
tone"neutral" | "accent" | "success" | "warning" | "danger" | "info"-neutralColour tone for the vocabulary variants.

EmptyMedia

PropTypeRequiredDefaultDescription
variant"default" | "icon"Nodefault`icon` wraps the child icon in a tonal tile.

EmptyHeader / EmptyTitle / EmptyDescription / EmptyContent

PropTypeRequiredDefaultDescription
classNamestring--Merged onto each slot.
variant"default" | "icon"No"default"Variant option from emptyMediaVariants.

Source

Import directly from the package or browse the source on GitHub. Click any file to view it.

Import

import { Empty } from "@glinui/ui"

Source Files

Dependencies

@glinui/uiclass-variance-authority

Generated API Snapshot

Beta

Auto-extracted from TypeScript source in packages/ui/src/components/empty.tsx. This section is in beta and may lag behind hand-curated docs. Regenerate with pnpm --filter @glinui/docs api:generate.

Generated: 2026-10-08T01:41:21.546Z · Full index: /docs/api-metadata

Primary Props Type

EmptyProps

EmptyMediaProps

PropTypeRequiredDefaultDescription
variant"default" | "icon"No"default"Variant option from emptyMediaVariants.

EmptyProps

PropTypeRequiredDefaultDescription
toneSurfaceToneNo--
variantSurfaceVariant | "dashed" | "default" | "raised" | "frosted"No-Visual variant. Omit for the ambient design style (glinr: lift shell; plain: shadcn dashed block). Vocabulary: glinr, solid, plain, soft, outline, ghost, gradient, glass. `dashed` is kept as an alias look.