Acrylic
Components

Item

A versatile component for displaying content with media, title, description, and actions.

A versatile component for displaying content with media, title, description, and actions.

Basic Item

A simple item with title and description.

Your profile has been verified.

The Item component is a straightforward flex container that can house nearly any type of content. Use it to display a title, description, and actions. Group it with the ItemGroup component to create a list of items.

Installation

npx shadcn add https://acrylic-ui.vercel.app/r/item.json

Usage

import {
  Item,
  ItemActions,
  ItemContent,
  ItemDescription,
  ItemMedia,
  ItemTitle,
} from "@/components/acrylic/item"
import { Button } from "@/components/acrylic/button"

<Item>
  <ItemMedia variant="icon">
    <Icon />
  </ItemMedia>
  <ItemContent>
    <ItemTitle>Title</ItemTitle>
    <ItemDescription>Description</ItemDescription>
  </ItemContent>
  <ItemActions>
    <Button>Action</Button>
  </ItemActions>
</Item>

Composition

Use the following components to compose an item.

ItemGroup
└── Item
    ├── ItemHeader
    ├── ItemMedia
    ├── ItemContent
    │   ├── ItemTitle
    │   └── ItemDescription
    ├── ItemActions
    └── ItemFooter

Item vs Field

Use Field if you need to display a form input such as a checkbox, input, radio, or select.

If you only need to display content such as a title, description, and actions, use Item.

Variant

Use the variant prop to change the visual style of the item.

default

Rendered with the default item variant.

outline

Rendered with the outline item variant.

muted

Rendered with the muted item variant.

Size

Use the size prop to change the size of the item.

default

Compact row geometry for default items.

sm

Compact row geometry for sm items.

xs

Compact row geometry for xs items.

Examples

Icon

Use ItemMedia with variant="icon" to display an icon.

Security Alert

New login detected from unknown device.

Avatar

Use ItemMedia with variant="avatar" to display an avatar.

ER
Evil Rabbit

Last seen 5 months ago

CNLRER
No Team Members

Invite your team to collaborate on this project.

Image

Use ItemMedia with variant="image" to display an image.

Midnight City Lights

Electric Nights · Neon Dreams

3:45
Coffee Shop Conversations

Urban Stories · The Morning Brew

4:05
Digital Rain

Binary Beats · Cyber Symphony

3:30

Post

Use Item to compose compact post rows with source metadata, a thumbnail, and post actions.

AD
Acrylic Design

@acrylic-ui · 12m

Video
A landscape media post in the stream

Landscape media fills the content column and keeps a wide preview, matching the compact thumb treatment used for video and article covers.

CA
Casey @casey

This layout keeps the media readable without turning the row into a full card.

15m · CA
NO
Nora @nora

The inline expand is the right behavior for long text in a dense stream.

11m · NY
MI
Mia @mia

The gallery state feels close to the real stream. The comment rail should stay quiet like this.

8m · WA
JO
Jordan @jordan

Default Item works here as long as the nested surface does not add another panel.

6m · OR
LE
Lee @lee

Moving the metadata under the comment helps the text keep its full measure.

3m · TX

Text

Use ItemRow inside ItemContent to compose dense text previews with aligned metadata and status actions.

Group

Use ItemGroup to group items together.

s
shadcn

shadcn@vercel.com

m
maxleiter

maxleiter@vercel.com

e
evilrabbit

evilrabbit@vercel.com

Use ItemHeader to add a header to an item.

v0-1.5-sm

Everyday tasks and UI generation.

v0-1.5-lg

Advanced thinking or reasoning.

v0-2.0-mini

Open Source model for everyone.

Use the asChild prop to render the item as a link. The focus state will be applied to the anchor element.

<Item asChild>
  <a href="/dashboard">
    <ItemMedia variant="icon">
      <HomeIcon />
    </ItemMedia>
    <ItemContent>
      <ItemTitle>Dashboard</ItemTitle>
      <ItemDescription>Overview of your account and activity.</ItemDescription>
    </ItemContent>
  </a>
</Item>

Use ItemActions to render a dropdown menu.

Select

Choose an option from the menu.

RTL

To enable RTL support, add dir="rtl" to the item or item group.

Arabic (العربية)
عنصر أساسي

عنصر بسيط يحتوي على عنوان ووصف.

API Reference

Item

The main item component.

PropTypeDefault
variant"default" | "outline" | "muted""default"
size"default" | "sm" | "xs""default"
selectedbooleanfalse
asChildbooleanfalse
<Item>
  <ItemContent>
    <ItemTitle>Item</ItemTitle>
    <ItemDescription>Item description</ItemDescription>
  </ItemContent>
</Item>

Selected state

selected sets data-selected and paints the macOS key-window selection: a solid bg-primary fill with a white label — the same language as a selected TableRow. No className needed. Every part of the anatomy escalates itself through the group-data-[selected=true]/item: hook on Item's root: ItemTitle goes to text-primary-foreground, ItemDescription / ItemMeta / ItemFooter / ItemActions to text-primary-foreground/80, and ItemMedia (icon/image) swaps its nested wash for bg-white/15.

<Item asChild selected={active}>
  <button type="button" onClick={() => setActive(id)}>
    <ItemContent>
      <ItemTitle>Title</ItemTitle>
      <ItemDescription>Description</ItemDescription>
    </ItemContent>
  </button>
</Item>

A nested Badge escalates on its own too (see Badge). Only a child whose color you hard-coded yourself needs a rule, and it reads the same hook: group-data-[selected=true]/item:text-primary-foreground/80.

ItemGroup

Use ItemGroup to group items together.

<ItemGroup>
  <Item />
  <Item />
</ItemGroup>

ItemSeparator

Use ItemSeparator to add a separator between items.

<ItemGroup>
  <Item />
  <ItemSeparator />
  <Item />
</ItemGroup>

ItemMedia

Use ItemMedia to display media content such as icons, images, or avatars.

PropTypeDefault
variant"default" | "icon" | "image" | "avatar""default"
<ItemMedia variant="icon">
  <Icon />
</ItemMedia>
<ItemMedia variant="image">
  <img src="..." alt="..." />
</ItemMedia>

ItemContent

Use ItemContent to wrap the title and description.

<ItemContent>
  <ItemTitle>Title</ItemTitle>
  <ItemDescription>Description</ItemDescription>
</ItemContent>

ItemRow

Use ItemRow inside ItemContent to align title, metadata, or inline actions on a single row.

<ItemRow>
  <ItemTitle>Title</ItemTitle>
  <ItemMeta>9:41 AM</ItemMeta>
</ItemRow>

ItemTitle

Use ItemTitle to display the title.

<ItemTitle>Item Title</ItemTitle>

ItemDescription

Use ItemDescription to display the description.

<ItemDescription>Item description</ItemDescription>

ItemMeta

Use ItemMeta for compact secondary metadata such as timestamps, counts, or short statuses.

<ItemMeta>Yesterday</ItemMeta>

ItemActions

Use ItemActions to display actions.

<ItemActions>
  <Button>Action</Button>
</ItemActions>

ItemAction

Use ItemAction as a single-action alias for ItemActions, commonly inside ItemRow.

<ItemAction>
  <Icon />
</ItemAction>

ItemHeader

Use ItemHeader to display a header.

<Item>
  <ItemHeader>Header</ItemHeader>
  <ItemContent>...</ItemContent>
</Item>

ItemFooter

Use ItemFooter to display a footer.

<Item>
  <ItemContent>...</ItemContent>
  <ItemFooter>Footer</ItemFooter>
</Item>

Acrylic differences

  • Installation uses the Acrylic registry URL instead of pnpm dlx shadcn@latest add item.
  • Imports use @/components/acrylic/item instead of @/components/ui/item.
  • The structure, examples, and API reference follow the shadcn/ui Item docs.
  • The component is styled with Acrylic tokens: outline uses the same acr-frosted / --acr-surface surface as Card; nested, muted, and media surfaces use --acr-card-nested.

On this page