Skip to main content
The design system’s icon library is Lucide. It is also one of the three declared fork seams on the swappable strand, which changes how you import from it.

Import through the registry’s icon module

lib/icons re-exports the icon library. Importing through it rather than reaching for lucide-react directly is the whole mechanism by which an adopter can swap the icon library and inherit everything else unchanged — an import scattered across two hundred components is not a seam. Import specific icons, never the whole library, so tree-shaking works.

Sizing

Use the size-* shorthand, which sets width and height together, rather than separate h-* and w-* classes that can drift apart.

Common icons

Actions

Status

Accessibility

Icon-only controls

An icon without visible text needs an accessible name:
Remember the 48px minimum touch target applies to icon buttons too — the icon is 16px, the control is not.

Decorative icons

An icon beside visible text is decorative and should be hidden from assistive technology:
Lucide icons set aria-hidden="true" by default, so this is usually handled for you.

Colour

Icons inherit colour through currentColor. Use text colour utilities and semantic tokens:
Prefer the semantic token to the mineral — --status-success rather than --color-malachite — so the icon follows the theme rather than pinning a colour.

Right-to-left

Mark directional icons that should flip in RTL contexts:
A chevron that points at the next item should mirror; a logo should not.

Pairing icons with text