Components
Item
A single structured row: a leading ItemMedia, an ItemContent with a title and an optional description, and trailing ItemActions. It gives lists and rows a consistent shape.
Preview
Rendered with live Folio tokens. Hover and click the rows, no dark: classes.
Variants
<Item><ItemContent><ItemTitle>Overview</ItemTitle></ItemContent></Item><ItemMedia><Folder /></ItemMedia> … <ItemActions><ChevronRight /></ItemActions><ItemMedia><Avatar /></ItemMedia> … <ItemDescription>…</ItemDescription><ItemMedia><Checkbox /></ItemMedia><ItemActions><Badge>Pro</Badge></ItemActions><ItemActions><Button size="icon-sm">…</Button></ItemActions><ItemTitle>Billing</ItemTitle>
<ItemDescription>Invoices, payment method, and plan</ItemDescription>Leading icons, avatars, or checkboxes in ItemMedia; trailing badges or actions in ItemActions; and an optional ItemDescription all compose into the same row.
States
Default. Resting row.
Hover. The secondary surface fills in (shown statically).
Selected. Set aria-current on the row; click to toggle.
Disabled. Dimmed, inert.
Hover and focus apply only when the row is interactive (rendered as a button or link with asChild). Selected (aria-current) and disabled read on the row itself.
API
Don't and Do
Don't use an Item as a navigation link. Moving between pages or sections is the job of a Sidebar nav item or a Navigation Menu link, which carry the right semantics and active states. An Item is a row of content or actions, not a destination.
<Item asChild>
<button type="button" onClick={open}>
<ItemMedia><Avatar>…</Avatar></ItemMedia>
<ItemContent>
<ItemTitle>Derek Ho</ItemTitle>
<ItemDescription>derek@distyl.ai</ItemDescription>
</ItemContent>
<ItemActions><Badge>Owner</Badge></ItemActions>
</button>
</Item>Use Item to build lists, command palettes, settings rows, and any single-row layout that needs consistent leading and trailing composition.
import {
Item,
ItemContent,
ItemDescription,
ItemMedia,
ItemTitle,
} from "@/components/shadcn/item";
import { Folder } from "lucide-react";
export function ProjectRow() {
return (
<Item asChild>
<button type="button" onClick={openProjects}>
<ItemMedia>
<Folder />
</ItemMedia>
<ItemContent>
<ItemTitle>Projects</ItemTitle>
<ItemDescription>14 active</ItemDescription>
</ItemContent>
</button>
</Item>
);
}