Lumen

Icons

The health glyph set — 583 icons in three weights, themed by currentColor.

Two icon vocabularies live in Lumen, and the line between them is what each is for.

Domain glyphs — the set below. Conditions, medications, specialties, diagnostics, blood, body, family. Drawn for this product because no general-purpose library covers them: there is no lucide icon for cervical cancer or oral contraception.

UI chromelucide, used throughout the components on this site for chevrons, checks and close buttons. Reach for it when the icon is about the interface rather than the body.

Naming

Icons are category/name, not bare names. Six names collide across categories and every collision is a different drawing — body/heart is the organ, symbols/heart is the shape. A flat namespace would silently drop one of each pair.

Browse

Click any icon to copy its name.

Loading the icon catalog…

Using them

import { HealthIcon } from 'lumen-icons/react';

<HealthIcon name="body/heart" variant="outline" size={20} />

Colour comes from currentColor — the component never sets fill, so an icon takes the text colour of wherever it sits and follows Day/Night without a prop:

<span className="text-primary">
  <HealthIcon name="conditions/headache" />
</span>

Icons are decorative by default (aria-hidden), which is right whenever adjacent text already says what they mean. Pass label when the icon stands alone:

<HealthIcon name="conditions/headache" label="Headache" />

Weights

filled is solid ink, outline is stroked, and negative is an ink block with the glyph knocked out — for placing on a coloured ground.

Without React

The raw SVGs ship at lumen-icons/svg/<weight>/<category>/<name>.svg for consumers with an SVG loader. Use iconPath() rather than writing that string by hand — a typo in a path fails at runtime, where an IconName fails at compile time:

import { iconPath } from 'lumen-icons';

iconPath('body/heart', 'filled'); // "svg/filled/body/heart.svg"

Bundle size

Importing lumen-icons/react pulls the whole catalog — roughly 3.9MB of markup before compression. That is right for this gallery and wrong for an app shipping forty icons. Nothing consumes it in an app yet, so it hasn't been split; when one does, the fix is per-category modules looked up lazily.

On this page