Skip to content

Item

Shared start content, label, description, and end content row primitive.

Item labelSupporting text
<Item description="Supporting text" label="Item label" />
Item labelSupporting textAdmin
<Item
{...args}
endContent={<Badge label="Admin" />}
startContent={<Icon color="secondary" icon={User} size="sm" />}
/>
Beta featuresNewSupporting text
<Item
description="Supporting text"
label="Beta features"
endContent={<Badge color="blue" label="New" />}
endContentPosition="inline"
/>
<Item
description="Supporting text"
label="Item label"
onClick={() => {}}
endContent={<Icon icon={ChevronRight} size="sm" />}
/>
Static disabled
<div style={{display: 'flex', flexDirection: 'column', gap: 8}}>
<Item isDisabled label="Static disabled" />
<Item isDisabled label="Button disabled" onClick={() => {}} />
<Item href="/disabled" isDisabled label="Link disabled" />
</div>
Selected itemSupporting text
<Item
description="Supporting text"
label="Selected item"
isSelected
startContent={<Icon color="primary" icon={Check} size="sm" />}
/>
Highlighted itemSupporting text
<Item description="Supporting text" label="Highlighted item" isHighlighted />
<Item
description="Supporting text"
label="Account settings"
endContent={<Icon icon={ChevronRight} size="sm" />}
href="/settings"
/>
NEWMulti-line item with start alignmentA longer description wraps across multiple lines so the icon remains aligned to the start of the text block.
<Item
description="A longer description wraps across multiple lines so the icon remains aligned to the start of the text block."
label="Multi-line item with start alignment"
align="start"
startContent={<Badge label="NEW" />}
/>
This is a very long item label that is intentionally constrained to one lineThis description is intentionally long enough to wrap across several lines, but the story limits it to two lines so consumers can see the truncation behavior.
<Item
description="This description is intentionally long enough to wrap across several lines, but the story limits it to two lines so consumers can see the truncation behavior."
label="This is a very long item label that is intentionally constrained to one line"
descriptionLines={2}
labelLines={1}
style={{maxWidth: 360}}
/>
  • List itemRendered as an li for list composition.
  • Second list itemAnother list row using the same primitive.
<ul style={{listStyle: 'none', margin: 0, padding: 0}}>
<Item
as="li"
description="Rendered as an li for list composition."
label="List item"
/>
<Item
as="li"
description="Another list row using the same primitive."
label="Second list item"
/>
</ul>
Item with external markerSupporting text
<Item
description="Supporting text"
label="Item with external marker"
leadingContent={<Icon color="secondary" icon={Circle} size="sm" />}
startContent={<Icon color="secondary" icon={GripVertical} size="sm" />}
/>
Disabled and selected
Highlighted and selected
<div style={{display: 'flex', flexDirection: 'column', gap: 8}}>
<Item isDisabled isSelected label="Disabled and selected" />
<Item isHighlighted isSelected label="Highlighted and selected" />
<Item
isHighlighted
label="Highlighted interactive"
onClick={() => {}}
startContent={<Icon color="secondary" icon={Bell} size="sm" />}
/>
</div>
Ada Lovelace
Grace Hopper
<div aria-label="People" role="listbox">
<Item
isSelected
label="Ada Lovelace"
onClick={() => {}}
role="option"
startContent={<Icon color="secondary" icon={User} size="sm" />}
/>
<Item
label="Grace Hopper"
onClick={() => {}}
role="option"
startContent={<Icon color="secondary" icon={User} size="sm" />}
/>
</div>

Shared start content, label, description, and end content row primitive.

PropTypeDefaultDescription
align"center" | "start"'center'Vertical alignment of the start and end content slots.
aria-currentAriaAttributes['aria-current']ARIA current indicator forwarded to the interactive element.
as"div" | "li" | "span"'div'HTML element used for the root.
classNamestringAdditional CSS class names applied to the root element.
data-testidstringTest ID applied to the root element.
descriptionReactNodeSupporting text shown below the label.
descriptionLinesnumberMaximum number of description lines before truncation.
endContentReactNodeContent rendered after the label and description. Position controlled by endContentPosition.
endContentPosition'end' | 'inline''end'Where to place endContent within the item. 'end' pushes it to the trailing edge; 'inline' keeps it next to the label.
hrefstringLink URL. When set, the content area renders as a link.
isDisabledbooleanfalseWhether the item is disabled.
isHighlightedbooleanfalseWhether the item should show highlighted styling.
isSelectedbooleanfalseWhether the item is selected.
label*ReactNodePrimary item label.
labelLinesnumberMaximum number of label lines before truncation.
leadingContentReactNodeContent rendered outside the interactive area, before it.
linkComponentLinkComponentTypeCustom link component used when href is set.
onClickMouseEventHandler<HTMLElement>Click handler. When set without href, the content area renders as a button. When set with href, also fires on link clicks.
refRef<HTMLElement>Ref forwarded to the root element.
relstringLink relationship. noopener noreferrer are added for _blank targets.
rolestringARIA role applied to the root element. When set, click handling is attached to the root so parent composite widgets can own keyboard behavior.
startContentReactNodeLeading visual content, such as an icon, avatar, or image.
styleCSSPropertiesInline styles applied to the root element.
targetstringLink target.
trailingContentReactNodeContent rendered outside the interactive area, after it.
width'full' | 'auto''full'Width of the root element.