Item

Examples

Default

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

Basic Item

A simple item with title and description.

Your profile has been verified.
<div class="flex w-full max-w-md flex-col gap-6">
  <%= render "ui/item", variant: "outline" do %>
    <%= render "ui/item/content" do %>
      <%= render "ui/item/title" do %>Basic Item<% end %>
      <%= render "ui/item/description" do %>A simple item with title and description.<% end %>
    <% end %>
    <%= render "ui/item/actions" do %>
      <%= render "ui/button", variant: "outline", size: "sm", content: "Action" %>
    <% end %>
  <% end %>

  <%= render "ui/item", variant: "outline", size: "sm" do %>
    <%= render "ui/item/media" do %>
      <svg class="size-5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
        <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z" />
      </svg>
    <% end %>
    <%= render "ui/item/content" do %>
      <%= render "ui/item/title" do %>Your profile has been verified.<% end %>
    <% end %>
    <%= render "ui/item/actions" do %>
      <svg class="size-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
        <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 5l7 7-7 7" />
      </svg>
    <% end %>
  <% end %>
</div>

Variants

Different visual variants: default, outline, and muted.

Default Variant

Standard styling with subtle background and borders.

Outline Variant

Outlined style with clear borders and transparent background.

Muted Variant

Subdued appearance with muted colors for secondary content.

<div class="flex flex-col gap-6">
  <%= render "ui/item" do %>
    <%= render "ui/item/content" do %>
      <%= render "ui/item/title" do %>Default Variant<% end %>
      <%= render "ui/item/description" do %>Standard styling with subtle background and borders.<% end %>
    <% end %>
    <%= render "ui/item/actions" do %>
      <%= render "ui/button", variant: "outline", size: "sm", content: "Open" %>
    <% end %>
  <% end %>

  <%= render "ui/item", variant: "outline" do %>
    <%= render "ui/item/content" do %>
      <%= render "ui/item/title" do %>Outline Variant<% end %>
      <%= render "ui/item/description" do %>Outlined style with clear borders and transparent background.<% end %>
    <% end %>
    <%= render "ui/item/actions" do %>
      <%= render "ui/button", variant: "outline", size: "sm", content: "Open" %>
    <% end %>
  <% end %>

  <%= render "ui/item", variant: "muted" do %>
    <%= render "ui/item/content" do %>
      <%= render "ui/item/title" do %>Muted Variant<% end %>
      <%= render "ui/item/description" do %>Subdued appearance with muted colors for secondary content.<% end %>
    <% end %>
    <%= render "ui/item/actions" do %>
      <%= render "ui/button", variant: "outline", size: "sm", content: "Open" %>
    <% end %>
  <% end %>
</div>

Size

Items with different sizes for varying content density.

Default Size

Standard padding for comfortable content spacing.

Compact Size
<div class="flex w-full max-w-md flex-col gap-6">
  <%= render "ui/item", variant: "outline" do %>
    <%= render "ui/item/content" do %>
      <%= render "ui/item/title" do %>Default Size<% end %>
      <%= render "ui/item/description" do %>Standard padding for comfortable content spacing.<% end %>
    <% end %>
    <%= render "ui/item/actions" do %>
      <%= render "ui/button", variant: "outline", size: "sm", content: "Action" %>
    <% end %>
  <% end %>

  <%= render "ui/item", variant: "outline", size: "sm" do %>
    <%= render "ui/item/media" do %>
      <svg class="size-5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
        <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z" />
      </svg>
    <% end %>
    <%= render "ui/item/content" do %>
      <%= render "ui/item/title" do %>Compact Size<% end %>
    <% end %>
    <%= render "ui/item/actions" do %>
      <svg class="size-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
        <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 5l7 7-7 7" />
      </svg>
    <% end %>
  <% end %>
</div>

With Icon

Item with an icon indicator for status or category.

Security Alert

New login detected from unknown device.

<div class="flex w-full max-w-lg flex-col gap-6">
  <%= render "ui/item", variant: "outline" do %>
    <%= render "ui/item/media", variant: "icon" do %>
      <svg fill="none" stroke="currentColor" viewBox="0 0 24 24">
        <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z" />
      </svg>
    <% end %>
    <%= render "ui/item/content" do %>
      <%= render "ui/item/title" do %>Security Alert<% end %>
      <%= render "ui/item/description" do %>New login detected from unknown device.<% end %>
    <% end %>
    <%= render "ui/item/actions" do %>
      <%= render "ui/button", size: "sm", variant: "outline", content: "Review" %>
    <% end %>
  <% end %>
</div>

With Avatar

Items with avatars for user-related content.

ER
Evil Rabbit

Last seen 5 months ago

CN LR ER
No Team Members

Invite your team to collaborate on this project.

<div class="flex w-full max-w-lg flex-col gap-6">
  <%= render "ui/item", variant: "outline" do %>
    <%= render "ui/item/media" do %>
      <%= render "ui/avatar", classes: "size-10" do %>
        <%= render "ui/avatar/fallback" do %>ER<% end %>
      <% end %>
    <% end %>
    <%= render "ui/item/content" do %>
      <%= render "ui/item/title" do %>Evil Rabbit<% end %>
      <%= render "ui/item/description" do %>Last seen 5 months ago<% end %>
    <% end %>
    <%= render "ui/item/actions" do %>
      <%= render "ui/button", size: "sm", variant: "outline", classes: "rounded-full", content: "+" %>
    <% end %>
  <% end %>

  <%= render "ui/item", variant: "outline" do %>
    <%= render "ui/item/media" do %>
      <div class="flex -space-x-2">
        <%= render "ui/avatar", classes: "ring-2 ring-background grayscale" do %>
          <%= render "ui/avatar/fallback" do %>CN<% end %>
        <% end %>
        <%= render "ui/avatar", classes: "ring-2 ring-background grayscale" do %>
          <%= render "ui/avatar/fallback" do %>LR<% end %>
        <% end %>
        <%= render "ui/avatar", classes: "ring-2 ring-background grayscale" do %>
          <%= render "ui/avatar/fallback" do %>ER<% end %>
        <% end %>
      </div>
    <% end %>
    <%= render "ui/item/content" do %>
      <%= render "ui/item/title" do %>No Team Members<% end %>
      <%= render "ui/item/description" do %>Invite your team to collaborate on this project.<% end %>
    <% end %>
    <%= render "ui/item/actions" do %>
      <%= render "ui/button", size: "sm", variant: "outline", content: "Invite" %>
    <% end %>
  <% end %>
</div>

Group

Multiple items grouped together with separators.

S
shadcn

shadcn@vercel.com


M
maxleiter

maxleiter@vercel.com


E
evilrabbit

evilrabbit@vercel.com

<div class="flex w-full max-w-md flex-col gap-6">
  <%= render "ui/item/group" do %>
    <% ["shadcn@vercel.com", "maxleiter@vercel.com", "evilrabbit@vercel.com"].each_with_index do |email, index| %>
      <% username = email.split("@").first %>
      <%= render "ui/item" do %>
        <%= render "ui/item/media" do %>
          <%= render "ui/avatar" do %>
            <%= render "ui/avatar/fallback", classes: "grayscale" do %><%= username[0].upcase %><% end %>
          <% end %>
        <% end %>
        <%= render "ui/item/content", classes: "gap-1" do %>
          <%= render "ui/item/title" do %><%= username %><% end %>
          <%= render "ui/item/description" do %><%= email %><% end %>
        <% end %>
        <%= render "ui/item/actions" do %>
          <%= render "ui/button", variant: "ghost", size: "sm", classes: "rounded-full", content: "+" %>
        <% end %>
      <% end %>
      <% unless index == 2 %>
        <%= render "ui/item/separator" %>
      <% end %>
    <% end %>
  <% end %>
</div>

With Header

Items with a header section for media or featured content.

v0-1.5-sm

Everyday tasks.

v0-1.5-lg

Advanced thinking.

v0-2.0-mini

Open Source model.

<div class="flex w-full max-w-xl flex-col gap-6">
  <%= render "ui/item/group", classes: "grid grid-cols-3 gap-4" do %>
    <% [
      { name: "v0-1.5-sm", description: "Everyday tasks." },
      { name: "v0-1.5-lg", description: "Advanced thinking." },
      { name: "v0-2.0-mini", description: "Open Source model." }
    ].each do |model| %>
      <%= render "ui/item", variant: "outline" do %>
        <%= render "ui/item/header" do %>
          <div class="aspect-square w-full rounded-sm bg-muted"></div>
        <% end %>
        <%= render "ui/item/content" do %>
          <%= render "ui/item/title" do %><%= model[:name] %><% end %>
          <%= render "ui/item/description" do %><%= model[:description] %><% end %>
        <% end %>
      <% end %>
    <% end %>

Features

  • Custom styling with Tailwind classes

API Reference

Item

Parameters

NameTypeDefaultDescription
variantStringdefaultVisual style variant
sizeStringdefaultSize of the element
as_childBooleanfalseWhen true, yields attributes to block instead of rendering wrapper

Content

Description

Footer

Group

Header

Separator

Title