Icons
Aether UI ships Lucide React as its default icon library — a community-maintained set of beautifully consistent, MIT-licensed SVG icons. Over 1,500 icons, all tree-shakeable.
Installation
Lucide React is included automatically when you use the CLI to add any Aether UI component. To install it manually:
npm install lucide-react
# or
pnpm add lucide-react
# or
yarn add lucide-reactBasic usage
Import any icon by name from lucide-react. Icons are React components that render a 24×24 SVG by default.
import { Search, Settings, ArrowRight } from "lucide-react"
export function Example() {
return (
<div className="flex items-center gap-2">
<Search className="h-4 w-4" />
<Settings className="h-5 w-5 text-muted-foreground" />
<ArrowRight className="h-4 w-4 text-primary" />
</div>
)
}Icon sizing
Use Tailwind's h-* and w-* classes — or the shorthand size-* — to control icon dimensions. Common sizes: size-3.5 (14px), size-4 (16px), size-5 (20px).
Icons in buttons
The Button component includes built-in SVG handling — icons are automatically sized to 16px and never intercept pointer events. No extra classes needed.
Button with leading icon
import { Plus, Download, Loader2 } from "lucide-react"
import { Button } from "@/components/ui/button"
// Leading icon — just place it before the label
<Button>
<Plus />
New item
</Button>
// Trailing icon — place after the label
<Button variant="outline">
Export
<Download />
</Button>
// Loading state
<Button disabled>
<Loader2 className="animate-spin" />
Saving…
</Button>Icon-only button
Use size="icon" for a square button. Always include aria-label for accessibility.
import { Search, Settings, Bell, X } from "lucide-react"
import { Button } from "@/components/ui/button"
<Button size="icon" aria-label="Search">
<Search />
</Button>
<Button size="icon" variant="ghost" aria-label="Notifications">
<Bell />
</Button>
<Button size="icon" variant="outline" aria-label="Settings">
<Settings />
</Button>
<Button size="icon" variant="destructive" aria-label="Remove">
<X />
</Button>Icons in other components
Input with icon
import { Search } from "lucide-react"
// Wrap input in a relative container, position icon absolutely
<div className="relative">
<Search className="absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-muted-foreground" />
<Input className="pl-9" placeholder="Search…" />
</div>Badge with icon
import { CheckCircle2, Clock, XCircle } from "lucide-react"
import { Badge } from "@/components/ui/badge"
<Badge className="gap-1">
<CheckCircle2 className="h-3 w-3" />
Approved
</Badge>
<Badge variant="secondary" className="gap-1">
<Clock className="h-3 w-3" />
Pending
</Badge>
<Badge variant="destructive" className="gap-1">
<XCircle className="h-3 w-3" />
Failed
</Badge>Select trigger with icon
import { Globe } from "lucide-react"
// Custom SelectTrigger with a leading icon
<SelectTrigger className="w-[180px]">
<Globe className="h-4 w-4 text-muted-foreground" />
<SelectValue placeholder="Language" />
</SelectTrigger>Common icons reference
A curated set of frequently used icons. All available from lucide-react. Browse the complete set at lucide.dev/icons.
Navigation & actions
ArrowLeftArrowRightArrowUpArrowDownChevronLeftChevronRightChevronUpChevronDownChevronsUpDownMenuXPlusMinusMoreHorizontalMoreVerticalExternalLinkStatus & feedback
CheckCheckCircleCheckCircle2AlertCircleAlertTriangleInfoXCircleLoader2RefreshCwRotateCcwClockTimerHourglassObjects & UI
SearchSettingsSettings2FilterSlidersHorizontalBellBellOffStarBookmarkHeartShare2LinkCopyClipboardDownloadUploadFiles & data
FileFileTextFilePlusFileXFolderFolderOpenDatabaseTable2BarChartBarChart2LineChartPieChartUsers & auth
UserUsersUserPlusUserXUserCheckLockUnlockKeyShieldShieldCheckLogInLogOutCommunication
MailMessageSquareMessageCirclePhoneSendInboxArchiveTrashTrash2EditEdit2Edit3Customization
All Lucide icons accept size, strokeWidth, and color props, plus all standard SVG attributes.
import { Star } from "lucide-react"
// Default (size=24, strokeWidth=2)
<Star />
// Smaller, thinner
<Star size={16} strokeWidth={1.5} />
// Using Tailwind for colour
<Star className="text-yellow-500" />
// Filled (set fill to currentColor)
<Star className="fill-yellow-400 text-yellow-400" />Accessibility
- →Decorative icons (next to visible text) should be hidden from screen readers with aria-hidden="true".
- →Icon-only interactive elements (buttons, links) must have an aria-label describing the action.
- →Avoid using icons as the sole means of conveying status — pair with visible text or a tooltip.
- →Lucide icons render aria-hidden="true" by default when used inside a labelled element.