DS0
Components

IconButton

A button containing only an icon, with a required accessible label.

Overview

IconButton renders a button with only an icon and no visible text. An aria-label is required to ensure screen reader accessibility. Use it for compact actions in toolbars, table rows, and card headers.

Usage

<IconButton icon={<SearchIcon />} aria-label="Search" />
<IconButton icon={<XIcon />} aria-label="Close" variant="outline" />

Variants

<IconButton icon={<EditIcon />} aria-label="Edit" variant="ghost" />
<IconButton icon={<TrashIcon />} aria-label="Delete" variant="destructive" />
<IconButton icon={<PlusIcon />} aria-label="Add" variant="primary" />

Sizes

<IconButton icon={<SettingsIcon />} aria-label="Settings" size="sm" />
<IconButton icon={<SettingsIcon />} aria-label="Settings" size="md" />
<IconButton icon={<SettingsIcon />} aria-label="Settings" size="lg" />

With Tooltip

Always pair icon buttons with a tooltip to provide visual context:

<Tooltip>
  <Tooltip.Trigger>
    <IconButton icon={<TrashIcon />} aria-label="Delete" />
  </Tooltip.Trigger>
  <Tooltip.Content>Delete</Tooltip.Content>
</Tooltip>

Accessibility

Keyboard Interactions

KeyAction
TabMoves focus to the button
EnterActivates the button
SpaceActivates the button

ARIA

  • aria-label is required (enforced at runtime via invariant)
  • aria-disabled is set when isDisabled is true
  • aria-busy is set when isLoading is true

API Reference

PropTypeDefaultDescription
iconReactNodeThe icon element (required)
aria-labelstringAccessible name (required)
variant'primary' | 'secondary' | 'destructive' | 'ghost' | 'outline''ghost'Visual style
size'sm' | 'md' | 'lg''md'Button size
isLoadingbooleanfalseShows spinner
isDisabledbooleanfalseDisables the button
classNamestringAdditional CSS classes

AI Decision Guide

Use IconButton when:

  • Space is limited (toolbars, table rows, card actions)
  • The icon's meaning is universally understood (✕ for close, 🗑 for delete)
  • Always pair with a Tooltip for discoverability

Don't use IconButton when:

  • The action needs a visible text label → use Button with leftIcon
  • The meaning of the icon is ambiguous → use Button with text
ComponentWhen to Use Instead
ButtonActions that need visible text labels
TooltipAlways pair with IconButton for visual labels
ToggleFor on/off state toggling with an icon

On this page