Icons
Lumen uses inline SVG — no icon font, no library dependency. All icons live at apps/web/components/icons/index.tsx.
Rules
- Stroke-based,
strokeWidth={1.6}or1.8for default,1.3for tight contexts - 16×16 default, 14×14 for sm buttons, 12×12 for inline labels
stroke="currentColor"— color inherits from parent textfill="none"unless it's a filled icon (badges, solid nav indicators)
Available icons (not exhaustive)
| Name | Usage |
|---|---|
| IconHome | Home nav |
| IconFolder | Projects, library, departments |
| IconDocument | Files, docs |
| IconChat | Chat / threads |
| IconUsers | Members, users table |
| IconShield | Admin, security |
| IconShare | Share button |
| IconPlus | Add, new |
| IconSearch | Search input |
| IconChevronRight / IconChevronDown | Disclosure |
| IconClose | Modal close |
| IconClipboard | Audit log |
| IconSpark | AI config |
When you need a new icon, add it to the same file. Follow the existing pattern:
export function IconMyNewIcon({ width = 16, height = 16, className }: IconProps) {
return (
<svg width={width} height={height} viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="1.8" strokeLinecap="round" strokeLinejoin="round" className={className}>
<path d="..." />
</svg>
);
}
Styling
// Inherited color
<IconFolder className="text-text-muted" />
// Sized
<IconShare width={14} height={14} />
// As button icon
<Button variant="icon-only" size="sm">
<IconShare />
</Button>
Don't
- Don't import
lucide-reactorheroicons— adds a dep for content already inlined - Don't use emoji as UI icons — renders differently per OS
- Don't scale icons via
transform: scale()— usewidth/heightprops or wrapper sizing
Project color indicators
When indicating a project (folder icon, sidebar dot), use the project's color field as background tint:
<div
className="w-12 h-12 rounded-[var(--radius)] flex items-center justify-center"
style={{ backgroundColor: `${project.color}18`, color: project.color }}
>
<IconFolder />
</div>
The 18 suffix is hex for ~10% opacity — the tint is subtle, the icon is the project color at full strength.