Item
A composable layout primitive for list rows, settings rows, and notification rows.
Denser than Card — reach for Item whenever you render a
repeated row with a leading media slot, a title/description column, and trailing actions.
Basic
Compose a row from ItemMedia (icon / avatar), ItemContent
(with ItemTitle and ItemDescription), and
ItemActions (pinned to the right via margin-left: auto).
Every slot is optional except ItemContent.
Receive an email when someone mentions you.
import { Item, ItemMedia, ItemContent, ItemTitle, ItemDescription, ItemActions, Switch } from "@usevyre/react";
<Item>
<ItemMedia><GearIcon /></ItemMedia>
<ItemContent>
<ItemTitle>Notifications</ItemTitle>
<ItemDescription>Receive an email when someone mentions you.</ItemDescription>
</ItemContent>
<ItemActions>
<Switch defaultChecked />
</ItemActions>
</Item> <script setup>
import { Item, ItemMedia, ItemContent, ItemTitle, ItemDescription, ItemActions, Switch } from "@usevyre/vue";
</script>
<template>
<Item>
<ItemMedia><GearIcon /></ItemMedia>
<ItemContent>
<ItemTitle>Notifications</ItemTitle>
<ItemDescription>Receive an email when someone mentions you.</ItemDescription>
</ItemContent>
<ItemActions>
<Switch :model-value="true" />
</ItemActions>
</Item>
</template> Grouped list
Wrap rows in ItemGroup with separated to render a bordered
list with dividers between rows. Add clickable to each
Item for keyboard-focusable, hoverable rows (role="button").
olivia@usevyre.com
jackson@usevyre.com
bella@usevyre.com
import { ItemGroup, Item, ItemMedia, ItemContent, ItemTitle, ItemDescription, ItemActions, Avatar, Tag } from "@usevyre/react";
<ItemGroup separated>
{members.map((m) => (
<Item key={m.email} clickable>
<ItemMedia><Avatar fallback={m.initials} size="sm" /></ItemMedia>
<ItemContent>
<ItemTitle>{m.name}</ItemTitle>
<ItemDescription>{m.email}</ItemDescription>
</ItemContent>
<ItemActions><Tag>{m.role}</Tag></ItemActions>
</Item>
))}
</ItemGroup> <ItemGroup separated>
<Item v-for="m in members" :key="m.email" clickable>
<ItemMedia><Avatar :fallback="m.initials" size="sm" /></ItemMedia>
<ItemContent>
<ItemTitle>{{ m.name }}</ItemTitle>
<ItemDescription>{{ m.email }}</ItemDescription>
</ItemContent>
<ItemActions><Tag>{{ m.role }}</Tag></ItemActions>
</Item>
</ItemGroup> Variants
default sits on the surface, outlined adds a subtle border,
muted uses a raised background to de-emphasise the row, and
plain is transparent with no border — use it when composing
Item inside another surface (a Card,
a Kanban card, a list) so you
don't get a double background.
Plain surface row.
Bordered row.
Raised muted background.
Transparent — no double background.
<Item variant="default">…</Item>
<Item variant="outlined">…</Item>
<Item variant="muted">…</Item>
<Item variant="plain">…</Item> {/* transparent — compose inside Card etc. */} <Item variant="default">…</Item>
<Item variant="outlined">…</Item>
<Item variant="muted">…</Item>
<Item variant="plain">…</Item> <!-- transparent — compose inside Card etc. --> Item props
Props
| Prop | Type | Default | Description |
|---|---|---|---|
variant | "default" | "outlined" | "muted" | "plain" | "default" | Visual style of the row. plain = transparent + no border — use when composing Item inside another surface (Card, Kanban card) to avoid a double background. |
size | "sm" | "md" | "lg" | "md" | Vertical density and text size of the row. |
clickable | boolean | false | Adds pointer cursor, hover background, focus ring, and role="button". |
className | string | — | Additional CSS class. |
ItemGroup props
Props
| Prop | Type | Default | Description |
|---|---|---|---|
separated | boolean | false | Adds dividers between items and rounds the outer corners — turns loose rows into a bordered list. |
className | string | — | Additional CSS class. |
Valid props
| Prop | Values | Default |
|---|---|---|
variant | "default"|"outlined"|"muted"|"plain" | default |
size | "sm"|"md"|"lg" | md |
clickable | true|false | false |
Common AI mistakes
- Card used for repeated list rows→ Use <Item> (optionally inside <ItemGroup separated>) for list/settings rows
- Item variant="primary"→ Use variant="default" | "outlined" | "muted"
- raw text directly inside Item→ Wrap text in <ItemContent><ItemTitle>…</ItemTitle></ItemContent>
Quick examples
<Item>
<ItemMedia><BellIcon /></ItemMedia>
<ItemContent>
<ItemTitle>Notifications</ItemTitle>
<ItemDescription>Receive an email when someone mentions you.</ItemDescription>
</ItemContent>
<ItemActions>
<Switch defaultChecked />
</ItemActions>
</Item><ItemGroup separated>
<Item clickable>
<ItemContent><ItemTitle>Profile</ItemTitle></ItemContent>
</Item>
<Item clickable>
<ItemContent><ItemTitle>Billing</ItemTitle></ItemContent>
</Item>
</ItemGroup>