Icons
A curated lucide set at 16px and 1.75–2 stroke. Search and copy the import.
Browse
194 lucide icons the product uses, in 13 categories. Size and stroke update the whole grid; clicking an icon copies its import and shows its usage below.
Sparkles
Found by: ai, magic, generate
1import { Sparkles } from "lucide-react"23// Next to text: decorative, lucide adds aria-hidden for you4<Sparkles className="size-5" strokeWidth={1.75} />56// Icon-only button: the label goes on the button7<Button variant="ghost" size="icon" aria-label="Describe the action">8 <Sparkles strokeWidth={1.75} />9</Button>Size and stroke
Lucide draws on a 24px grid, so every size scales cleanly. Stroke is where the weight comes from.
size-4 in UI
Buttons already size child icons to 16px. Reach for size-3.5 in badges and dense rows, size-5 only for section and empty-state icons.
<Button><Plus /> Add row</Button>Stroke 1.75 to 2
Match the weight of the text beside the icon. 1.75 next to regular text, 2 inside buttons and on brand fills.
<FileText className="size-4" strokeWidth={1.75} />Icon-only buttons need a name
Put aria-label on the button, not the svg, and repeat it in a tooltip for pointer users.
<Button size="icon" aria-label="Delete row"><Trash2 /></Button>Decorative icons stay silent
lucide 1.x adds aria-hidden to any icon without an aria prop, so an icon next to its label is skipped by screen readers. Keep it that way.
<span><Check /> Saved</span>
Unlabelled, oversized and hairline: no accessible name, and it outweighs the text around it.
Keyboard
- Move into the icon grid (one stop)
- Tab
- Move between icons
- ←or→or↑or↓
- First or last icon
- HomeorEnd
- Copy the import
- EnterorSpace
Semantics and ARIA
- Each tile is a
<button>named after the icon, witharia-pressedmarking the one shown in the detail strip. - The grid uses a roving
tabIndex, so the 190-odd tiles are a single tab stop; arrow keys follow the visual columns at any width. - The result count is an
aria-liveregion, so filtering announces how many icons match. - Copy confirmation arrives as a toast, which sonner announces politely without moving focus.
- Imports are named, never
import * as Icons, so only the icons a page renders are bundled.