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.
Bell01BellSettings01SettingsSearchLgSearchMail01MailUser01UserCalendarCalendarHeartHeartZapZapLine 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.
Choosing a set
Both sets are supported. Which one to reach for depends on what you are editing.
- Editing a file that came from nx-ui (
components/ui/*,components/blocks/*)? Use@untitledui/icons. It keeps the file diffable against the registry andnx-ui-doctor checkclean. - 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/Lgvariant families and matches the design language the rest of nx-ui came from. - 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.
- Never mix by accident. If a file already imports
SearchLgfrom untitledui, do not addSearchfrom lucide to it — consolidate. - Passing an icon into an nx-ui
iconprop? Both sets work. Pass the component itself, not an element:icon={Activity}, noticon={<Activity />}— both render, but only the component form receives the component'sdata-iconand 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.
Home01SearchLgSettings01Bell01User01Users01Mail01CalendarClockFile01FolderImage01Download01UploadCloud01Trash01Edit01Copy01PlusCheckXCloseChevronDownArrowRightEyeHeartStar01BookmarkFilterLinesShare01Link01Lock01AlertCircleAlertTriangleInfoCircleCheckCircleHelpCircleZapLightbulb02Rocket01Globe01MessageChatCircleSend01CreditCard01BarChart01RefreshCw01