# @lucide/icons `@lucide/icons` is a helper library that exports Lucide **icon data** in a tree-shakable format, also providing utilities for dynamic importing icons. It intentionally ships **no real rendering logic or components** — other packages (for example [`@lucide/angular`](http://npmjs.com/package/@lucide/angular)) can consume this data to render icons in their respective frameworks. You can also use this package to build third-party integrations for frameworks we don't (yet) support. ## Installation ::: code-group ```sh [pnpm] pnpm add @lucide/icons ``` ```sh [yarn] yarn add @lucide/icons ``` ```sh [npm] npm install @lucide/icons ``` ```sh [bun] bun add @lucide/icons ``` ::: ## Icon data format Each icon is described by the following interface: ```typescript export type LucideIconData = { name: string; node: LucideIconNode[]; } & ( | { size: number } | { width: number; height: number; } ); ``` | name | type | description | |------------------------------|--------------------|--------------------------------------------------------------------| | `name` | `string` | The name of the icon. | | `node` | `LucideIconNode[]` | SVG child nodes as `[tagName, attributes]` tuples. | | `size` or `width` & `height` | `number` | The dimensions of the icon (`size` is shorthand for square icons). | ## How to use Icons can be imported individually. Only the icons you import end up referenced by your application code — the rest will be eliminated by tree-shaking. ```ts import { House } from '@lucide/icons'; // House is icon data (not a rendered component). ``` ## Building icons `@lucide/icons` ships small helpers that convert Lucide icon data into different render-ready outputs. All builders accept the same `params` object (`LucideBuildParams`) to customize the generated SVG. ### Build parameters The following parameters are supported (names reflect the current implementation): | param | type | effect | |-----------------------|--------------------------|------------------------------------------------------------------------------------| | `color` | `string` | Sets `stroke` (defaults to `currentColor`). | | `size` | `number` | Sets both `width` and `height` (defaults to 24). | | `width` | `number` | Sets `width` only. | | `height` | `number` | Sets `height` only. | | `strokeWidth` | `number` | Sets `stroke-width` (defaults to 2). | | `absoluteStrokeWidth` | `boolean` | Adds [`vector-effect="non-scaling-stroke"`](https://developer.mozilla.org/en-US/docs/Web/SVG/Reference/Attribute/vector-effect) to child elements. | | `className` | `string` | Appended to the generated `class` attribute. | | `attributes` | `Record` | Add or override any generated SVG attributes (including `class`, `viewBox`, etc.). | ::: info SVG attributes generated by the builders include a default Lucide setup (`xmlns`, `viewBox`, `fill="none"`, `stroke="currentColor"`, `stroke-width="2"`, `stroke-linecap="round"`, `stroke-linejoin="round"`), plus a class string of the form: `lucide lucide-{iconName}`. ::: ### `buildLucideIconNode` Creates a root SVG node in an svgson-like format: ```ts import { buildLucideIconNode } from '@lucide/icons/builders'; import { House } from '@lucide/icons'; const node = buildLucideIconNode(House, { size: 32, strokeWidth: 1.5, className: 'my-icon', }); // -> ['svg', attributes, children] ``` This is useful if you want to plug Lucide icons into your own renderer, templating system, or framework integration. ### `buildLucideSvg` Creates an SVG string: ```ts import { buildLucideSvg } from '@lucide/icons/builders'; import { House } from '@lucide/icons'; const svg = buildLucideSvg(House, { size: 24, color: '#111' }); ``` ### `buildLucideIconElement` Creates an actual DOM element (SVG) within the provided document: ```ts import { buildLucideIconElement } from '@lucide/icons/builders'; import { House } from '@lucide/icons'; const el = buildLucideIconElement(document, House, { size: 24 }); document.body.appendChild(el); ``` ### `buildLucideDataUri` Creates a base64-encoded SVG data URI from a Lucide icon object. This helper works in both browsers and Node.js: - In browsers it uses `btoa` (with proper UTF-8 handling) - In Node.js it falls back to `Buffer` ```ts import { buildLucideDataUri } from '@lucide/icons/builders'; import { House } from '@lucide/icons'; const uri = buildLucideDataUri(House, { size: 24 }); ``` The returned value can be used directly in places such as: - `` - CSS `background-image` - Canvas drawing - Inline data URLs in HTML or SVG ::: tip Environment notes - The SVG is encoded as UTF-8 before base64 conversion to ensure correct handling of non-ASCII characters. - No runtime configuration is required — the function automatically selects the appropriate encoding strategy. - If neither `btoa` nor `Buffer` is available, an error is thrown. ::: ## Dynamic imports Dynamic imports are useful when you only know the icon name at runtime (for example, icon names stored in a database or a CMS). For purely static use cases, prefer direct imports for the best tree-shaking results. ::: tip Validate `iconName` before indexing the map (and provide a fallback icon) to avoid runtime errors. ::: ## Dynamic imports Dynamic imports are useful when the icon name is only known at runtime (for example, icon names stored in a CMS or database). For purely static usage, prefer direct imports for maximum tree-shaking. ```ts import { lucideDynamicIconImports } from '@lucide/icons/dynamic'; const name = 'house'; const icon = await lucideDynamicIconImports[name]?.(); if (!icon) { // handle unknown icon name (fallback) } ```