Lucide, used sparingly.
Leadjr uses the lucide-react icon set with a curated subset. Add nothing decorative. If a needed icon is missing from the approved list, propose it before reaching past the list.
lucide-react
Lucide is the source library: tree-shaken, line-style, weight matches the editorial chrome. Override with a custom SVG only when no Lucide icon fits the meaning.
20px stroke 1.75. Inherits currentColor.
16px for inline-with-text. Use when adjacent to body type.
24px for standalone affordances or empty-state hero glyphs.
The icons cleared for use.
If you need a Lucide icon not on this list, add it to the ICONS array in app/(app)/design-system/_components/data.ts and update the usage column.
Forward route action, "open" affordances.
Back navigation, parent route.
External or off-page link.
Verified claim, completed step.
Close drawer, dismiss, reject claim.
New capture, add entry.
Search bar, filter open.
Filter set toggle.
Date anchor, journal entry.
Time of day, recency indicator.
Document source type.
Excerpt callout.
Source link, attached reference.
Off-domain reference.
Preview, peek at entry.
Edit, capture entry.
Generated draft, AI-touched surface.
Verified source, defensible claim.
Needs evidence, conflict.
Mobile nav trigger (today: inline bars).
Disclosure, inline forward.
Disclosure, dropdown.
Three sizes, one stroke.
Stroke stays at 1.75 so icons sit alongside Geist without competing with serif headlines.
When Lucide is not enough.
The drawn logo, the footer signature, and a handful of inline marks are custom SVGs that live in web/public or as inline JSX (see AnimatedFooterLogo, the bars-icon in SiteHeader). Treat these as one-offs, not a competing icon system.
public/logo.svg, rendered as a CSS mask in SiteHeader so it inherits ink color.
components/AnimatedFooterLogo.tsx, drawn with motion for the SVG stroke animation.