Kanzo UI
Data display

Item

The row counterpart to Card — a media · content · actions strip for lists.

Something is eating the bell-ropes

16 gold · due 1312-10-15

Usage

import {
  Item,
  ItemActions,
  ItemContent,
  ItemDescription,
  ItemMedia,
  ItemTitle,
} from "@kanzo-tech/ui";
<Item variant="outline">
  <ItemMedia>
    <ScrollTextIcon />
  </ItemMedia>
  <ItemContent>
    <ItemTitle>Something is eating the bell-ropes</ItemTitle>
    <ItemDescription>Thornmarch · Nuisance</ItemDescription>
  </ItemContent>
  <ItemActions>
    <Button size="sm" variant="outline">Claim</Button>
  </ItemActions>
</Item>

Where a Card is a self-contained block, an Item is a horizontal row — the shape a list of records wants. Everything is a child, so a region can be wrapped, reordered or dropped, and every part carries a data-slot for restyling.

Grouped

ItemGroup is a role="list" and each Item a role="listitem"; ItemSeparator divides them.

Ravenna Sarkis

Warden · Amber Hall

Oyelaran Bell

Cantor · Amber Hall

Piet Marrow

Sapper · Amber Hall

Variants

variant (default · outline · muted) is mirrored to data-variant.

default

The default row surface.

outline

The outline row surface.

muted

The muted row surface.

Anatomy

ItemGroup
└── Item
    ├── ItemHeader        (full-width row above the main line)
    ├── ItemMedia
    ├── ItemContent
    │   ├── ItemTitle
    │   └── ItemDescription
    ├── ItemActions
    └── ItemFooter        (full-width row below the main line)

ItemHeader and ItemFooter break to their own line (basis-full), so a row can carry a heading or a footer strip above/below its media · content · actions line.

API Reference

Item

Renders a div with role="listitem".

PropTypeDefault
variant"default" | "outline" | "muted""default"

Owns the --space padding variable, so a consumer can retune the row's rhythm in one place.

ItemMedia

PropTypeDefault
variant"default" | "icon" | "image""default"

image gives a 10×10 rounded, clipped frame for a thumbnail; default and icon size a child svg to 4×4. Mirrored to data-variant.

ItemTitle

A flex row, so a title can carry a badge or a code span beside its text and they will be spaced. It does not clamp: line-clamp sets display: -webkit-box, which would replace that row. Where the title is a single unbounded string — something a user named — clamp it at the call site:

<ItemTitle className="line-clamp-1">{schedule.name}</ItemTitle>

That trades the row for the clamp, which is the right trade for a title that is only text.

Other parts

ItemGroup renders a role="list" container; ItemSeparator wraps Separator; ItemDescription renders a <p> and clamps at two lines (line-clamp-none to undo it). The remaining parts render a div and take that element's props.

Every part's props are exported as an interface — ItemMediaProps and ItemProps — so a wrapper can take the same props without restating them.

An empty state

A zero-state placeholder is not an Item. Item is a role="listitem", and an empty state is not inside a list; centring one also meant overriding a selector keyed on ItemMedia's internal slot. It is Empty.

On this page