Icons

nx-ui's own components use @untitledui/icons (1,179 icons). Consumer apps may also use lucide-react (~1,770 unique glyphs) and mix the two freely: both draw on a 24 viewBox at stroke-width 2 with round caps and joins, so they interoperate without adjustment. Import each icon by name and size it with a className (they default to 1em).

Usage

Import the named component and render it; colour and size come from the surrounding text or an explicit className.

import { SearchLg } from "@untitledui/icons"   // nx-ui's set
import { Search } from "lucide-react"            // also supported in app code

<SearchLg className="size-5 text-fg-quaternary" />
<Search className="size-5 text-fg-quaternary" />

Both icon sets

Matching glyphs from each set, @untitledui/icons above and lucide-react below. The weights match; only the names and some glyph metaphors differ.

Bell01
Bell
Settings01
Settings
SearchLg
Search
Mail01
Mail
User01
User
Calendar
Calendar
Heart
Heart
Zap
Zap

Line weight

nx-ui's line weight is 2 — a 1.5 lucide icon is the mismatch, not the fix. All 1,179 @untitledui/icons render stroke-width 2, and that is lucide's default too, so no adjustment is needed. Install @nx-ui/lucide-provider to pin the weight against a future lucide default change; individual icons can still override it.

lucide at 1.5lucide reads visibly thinner than untitledui
lucide at 2 (default)matches untitledui — this is nx-ui's weight

Choosing a set

Both sets are supported. Which one to reach for depends on what you are editing.

  1. Editing a file that came from nx-ui (components/ui/*, components/blocks/*)? Use @untitledui/icons. It keeps the file diffable against the registry and nx-ui-doctor check clean.
  2. Writing your own app code (routes, features, layouts)? Either set. Pick whichever names the glyph you actually want — lucide has ~1,770 unique icons to untitledui's 1,179 and covers brand and domain glyphs untitledui lacks; untitledui has the 01/Lg variant families and matches the design language the rest of nx-ui came from.
  3. Within one visual cluster (a button row, a nav column, a card header), stay in one set. The weight matches, but the two sets use different corner radii and glyph metaphors, so a mixed row can read as slightly inconsistent even though nothing is technically wrong.
  4. Never mix by accident. If a file already imports SearchLg from untitledui, do not add Search from lucide to it — consolidate.
  5. Passing an icon into an nx-ui icon prop? Both sets work. Pass the component itself, not an element: icon={Activity}, not icon={<Activity />}— both render, but only the component form receives the component's data-icon and sizing classes.

Common icons

A sample of frequently-used @untitledui/icons — the set nx-ui's own components import. See @untitledui/icons and lucide-react for the full sets.

Home01
SearchLg
Settings01
Bell01
User01
Users01
Mail01
Calendar
Clock
File01
Folder
Image01
Download01
UploadCloud01
Trash01
Edit01
Copy01
Plus
Check
XClose
ChevronDown
ArrowRight
Eye
Heart
Star01
Bookmark
FilterLines
Share01
Link01
Lock01
AlertCircle
AlertTriangle
InfoCircle
CheckCircle
HelpCircle
Zap
Lightbulb02
Rocket01
Globe01
MessageChatCircle
Send01
CreditCard01
BarChart01
RefreshCw01