Documentation
Icon Sets
Choose the right @kamod-ch/icons subpath export for each project.
@kamod-ch/icons groups every upstream family behind explicit subpath exports. This keeps imports readable, avoids name collisions, and makes upgrades easier to review.
Available imports#
@kamod-ch/icons
@kamod-ch/icons/shadcn
@kamod-ch/icons/lucide
@kamod-ch/icons/heroicons/outline
@kamod-ch/icons/heroicons/solid
@kamod-ch/icons/tabler/outline
@kamod-ch/icons/tabler/filled
@kamod-ch/icons/iconoir/regular
@kamod-ch/icons/iconoir/solid
@kamod-ch/icons/reicon/outline
@kamod-ch/icons/reicon/filled
The root import currently maps to the preferred shadcn set. For long-lived app code, prefer explicit subpaths.
Choosing a set#
| Set | Best for |
|---|---|
shadcn |
App UI based on shadcn-style icon names |
lucide |
Lightweight line icons and broad UI coverage |
heroicons |
Friendly dashboard, marketing, and app icons |
tabler |
Large product surfaces, admin tools, and dense UIs |
iconoir |
Distinctive geometric product moments |
reicon |
Broad outline/filled coverage from the Reicon open-source library |
Why subpath exports?#
- Clear origin for every imported icon.
- No hidden name conflicts between sets.
- Stable imports for long-lived apps and libraries.
- Variant support for outline/solid or regular/solid families.
- Smaller generated entry points that are easier to maintain.
Example#
import { CheckIcon } from "@kamod-ch/icons/shadcn";
export function SavedLabel() {
return (
<span class="inline-flex items-center gap-2 text-primary">
<CheckIcon class="h-4 w-4" />
Saved
</span>
);
}
Root import vs set import#
import { SearchIcon } from "@kamod-ch/icons";
Use the root import when you intentionally accept the package default. Use explicit subpaths when API stability matters:
import { SearchIcon } from "@kamod-ch/icons/shadcn";
Upstream versions#
Each set vendors SVGs from an upstream npm package or repository. Versions, icon counts, and sync dates are tracked in icon-sources.json and exposed through @kamod-ch/icons/meta.
| Set | Upstream | Version | Icons | Last sync |
|---|---|---|---|---|
@kamod-ch/icons/shadcn |
shadcn/ui | lucide-static (lucide@1.23.0) |
877 | 2026-07-03 |
@kamod-ch/icons/lucide |
Lucide | lucide-static (lucide@1.23.0) |
1,994 | 2026-07-03 |
@kamod-ch/icons/heroicons/… |
Heroicons | heroicons (@heroicons/react@2.2.0) |
648 | 2026-07-03 |
@kamod-ch/icons/tabler/… |
Tabler Icons | @tabler/icons@3.44.0 |
6,146 | 2026-07-03 |
@kamod-ch/icons/iconoir/… |
Iconoir | iconoir@7.11.1 |
1,671 | 2026-07-03 |
@kamod-ch/icons/reicon/… |
Reicon | dqev/reicon@1.1.1 |
5,360 | 2026-07-08 |
Sync from upstream#
npm run icons:sync
npm run icons:generate
npm run build
Sync one set only:
npm run icons:sync -- --set lucide
The shadcn set is a Lucide subset with legacy icon names used by shadcn/ui. During the latest sync, 860 of 877 existing SVGs were refreshed from lucide-static; 17 legacy brand icons were not present upstream and were left unchanged.