Import
import {
Item,
ItemActions,
ItemContent,
ItemDescription,
ItemGroup,
ItemMedia,
ItemSeparator,
ItemTitle,
} from "@timelycare/helix-ui"
Props
interface ItemProps extends React.HTMLAttributes<HTMLDivElement> {
variant?: "default" | "outline"
size?: "default" | "sm"
asChild?: boolean
className?: string
children: React.ReactNode
}
interface ItemMediaProps extends React.HTMLAttributes<HTMLDivElement> {
variant?: "default" | "icon"
className?: string
children: React.ReactNode
}
interface ItemContentProps extends React.HTMLAttributes<HTMLDivElement> {
className?: string
children: React.ReactNode
}
interface ItemTitleProps extends React.HTMLAttributes<HTMLParagraphElement> {
className?: string
children: React.ReactNode
}
interface ItemDescriptionProps extends React.HTMLAttributes<HTMLParagraphElement> {
className?: string
children: React.ReactNode
}
interface ItemActionsProps extends React.HTMLAttributes<HTMLDivElement> {
className?: string
children: React.ReactNode
}
interface ItemGroupProps extends React.HTMLAttributes<HTMLDivElement> {
className?: string
children: React.ReactNode
}
interface ItemSeparatorProps extends React.HTMLAttributes<HTMLDivElement> {
className?: string
}
Styling
Container
| Property | Value | Tailwind |
|---|---|---|
| Display | Flex, horizontal | flex items-center |
| Gap | 12px | gap-3 |
| Padding (default) | 12px 16px | px-4 py-3 |
| Padding (sm) | 8px 12px | px-3 py-2 |
| Border radius | 8px | rounded-md |
Typography
| Element | Font | Size | Color |
|---|---|---|---|
| Title | Adelle Sans Medium | 14px (text-sm) | text-foreground |
| Description | Adelle Sans Regular | 14px (text-sm) | text-muted-foreground |
Media
| Variant | Behavior |
|---|---|
default | Renders children directly (avatars, images, any content) |
icon | Wraps icon in a muted background circle; icon sized at size-5 (20px) |
Variants
| Variant | Border | Background | Use For |
|---|---|---|---|
default | None | Transparent | Lists, menus, navigation items |
outline | border border-border | bg-background | Standalone cards, highlighted items |
Sizes
| Size | Padding | Use For |
|---|---|---|
default | px-4 py-3 | Standard list items, cards |
sm | px-3 py-2 | Compact lists, notification items |
Sub-Components
| Component | Purpose |
|---|---|
Item | Root container — flex row layout |
ItemMedia | Leading visual (icon, avatar, image) |
ItemContent | Title + description text block |
ItemTitle | Primary text label |
ItemDescription | Secondary descriptive text |
ItemActions | Trailing actions (buttons, icons, chevrons) |
ItemGroup | Groups multiple items with optional separators |
ItemSeparator | Horizontal divider between items |
Common Patterns
Basic Item
<Item variant="outline">
<ItemContent>
<ItemTitle>Basic Item</ItemTitle>
<ItemDescription>A simple item with title and description.</ItemDescription>
</ItemContent>
<ItemActions>
<Button variant="outline" size="sm">Action</Button>
</ItemActions>
</Item>
With Icon
<Item variant="outline">
<ItemMedia variant="icon">
<ShieldAlertIcon />
</ItemMedia>
<ItemContent>
<ItemTitle>Security Alert</ItemTitle>
<ItemDescription>New login detected from unknown device.</ItemDescription>
</ItemContent>
<ItemActions>
<Button size="sm" variant="outline">Review</Button>
</ItemActions>
</Item>
With Avatar
<Item variant="outline">
<ItemMedia>
<Avatar className="size-10">
<AvatarImage src="/user.png" />
<AvatarFallback>JD</AvatarFallback>
</Avatar>
</ItemMedia>
<ItemContent>
<ItemTitle>Jane Doe</ItemTitle>
<ItemDescription>Last seen 5 minutes ago</ItemDescription>
</ItemContent>
<ItemActions>
<Button size="icon-sm" variant="outline" className="rounded-full" aria-label="Add">
<PlusIcon />
</Button>
</ItemActions>
</Item>
As Link
<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>
Item List with Separators
<ItemGroup>
{users.map((user, index) => (
<React.Fragment key={user.id}>
<Item>
<ItemMedia>
<Avatar>
<AvatarImage src={user.avatar} />
<AvatarFallback>{user.initials}</AvatarFallback>
</Avatar>
</ItemMedia>
<ItemContent>
<ItemTitle>{user.name}</ItemTitle>
<ItemDescription>{user.email}</ItemDescription>
</ItemContent>
<ItemActions>
<Button variant="ghost" size="icon" className="rounded-full">
<PlusIcon />
</Button>
</ItemActions>
</Item>
{index !== users.length - 1 && <ItemSeparator />}
</React.Fragment>
))}
</ItemGroup>
Compact Size
<Item variant="outline" size="sm" asChild>
<a href="/verified">
<ItemMedia>
<BadgeCheckIcon className="size-5" />
</ItemMedia>
<ItemContent>
<ItemTitle>Your profile has been verified.</ItemTitle>
</ItemContent>
<ItemActions>
<ChevronRightIcon className="size-4" />
</ItemActions>
</a>
</Item>
Accessibility
- When used as a link (
asChildwith<a>), inherits link semantics automatically ItemActionsbuttons should have appropriatearia-labelfor icon-only actions- For lists, wrap in a semantic
<ul>/<li>structure or use ARIArole="list"/role="listitem" - Keyboard: Tab navigates between interactive items; Enter/Space activates links and buttons
Gotchas
| Problem | Solution |
|---|---|
| Item doesn't look clickable | Use asChild with <a> or add hover styles |
| Avatar not aligned with text | ItemMedia uses flex items-center by default |
| Actions overlap content on small screens | Use responsive padding or hide secondary actions on mobile |
| Separator full-width bleeds | ItemSeparator is scoped to the ItemGroup container width |
| Icon media too large | Use variant="icon" on ItemMedia for consistent sizing |
See Also
- Related Components: Card (richer container), Avatar (user images), Empty (no-data state for lists), Sidebar (navigation items)
- Tokens: Colors —
foreground,muted-foreground,bordertokens
Last updated: February 19, 2026