Item
A flexible list row with media, content, and action areas. Supports three variants (default, outline, muted), three sizes (default, sm, xs), and icon or image media. Use ItemGroup to stack multiple items with consistent spacing.
Anatomy
<Item> is the row — accepts variant and size and a render prop to swap the underlying element (e.g. <a> or a router link). ItemMedia holds an icon or image (pass variant="icon" or variant="image"). ItemContent stacks title and description. ItemActions floats controls to the right. ItemHeader and ItemFooter span the full width for metadata rows.
Supporting description text.
Variants
default
No border, transparent background.
outline
Visible border around the row.
muted
Subtle background fill.
Sizes
default / sm / xs
Standard padding and text size.
Reduced padding for dense lists.
Examples
Notification list
Commented on your post.
Mentioned you in a thread.
Navigable list with actions
With image media
PDF · 2.4 MB · Updated yesterday
PDF · 2.4 MB · Updated yesterday
PDF · 2.4 MB · Updated yesterday
Design Guidelines
Do
- Use ItemGroup for lists. Wrapping Items in
ItemGroupapplies consistent gap androle="list"semantics automatically. - Pick one media variant per list. Mixing icon and image variants in the same list creates misaligned columns — pick one and stick with it throughout the group.
- Use the render prop for navigation. Pass
render=<a href="..." />or a router link to make the entire row clickable without extra wrapper elements.
Don't
- Don't put too many actions per item. More than two action buttons per row creates visual noise. Use a
DropdownMenufor secondary actions. - Don't truncate critical information.
ItemTitleis single-line clamped — if the label can be long and important, allow wrapping or show a tooltip. - Don't mix sizes within a list. Items in the same
ItemGroupshould share a size — inconsistent row heights look unpolished.
Developer Reference
Accessibility & Behavior
ItemGrouprenders withrole="list". IndividualItemelements are<div>s by default — if they must be list items, passrender=<li />.- The
renderprop onItemuses Base UI'suseRender— it merges all props and class names correctly onto the provided element. ItemMedia variant="image"applies a fixed size (size-10) that scales with the item'ssizeprop viadata-sizeselectors.ItemSeparatorrenders a horizontalSeparatorwith vertical margin — use it inside anItemGroupto create visual sections.
Usage
import {
Item,
ItemMedia,
ItemContent,
ItemTitle,
ItemDescription,
ItemActions,
ItemGroup,
ItemSeparator,
ItemHeader,
} from "@/components/ui/item"
// Basic item
<Item>
<ItemMedia variant="icon">
<Package className="size-4" />
</ItemMedia>
<ItemContent>
<ItemTitle>Packages</ItemTitle>
<ItemDescription>Manage your packages.</ItemDescription>
</ItemContent>
<ItemActions>
<Button size="sm" variant="ghost">Edit</Button>
</ItemActions>
</Item>
// As a link
<Item render={<a href="/packages" />}>
<ItemContent>
<ItemTitle>Packages</ItemTitle>
</ItemContent>
</Item>
// Grouped list with separator
<ItemGroup>
<Item variant="outline">...</Item>
<ItemSeparator />
<Item variant="outline">...</Item>
</ItemGroup>
// Variants: "default" | "outline" | "muted"
// Sizes: "default" | "sm" | "xs"
// Media: variant="icon" | variant="image"