mirror of
https://github.com/lucide-icons/lucide.git
synced 2026-11-14 13:58:21 +00:00
* feat(packages): extract build logic to @lucide/shared, still wip * feat(): unify icon build logic some more, add nonScalingStroke option, marking absoluteStrokeWidth as deprecated * feat(): unify icon build logic some more, add nonScalingStroke option, marking absoluteStrokeWidth as deprecated * feat(packages): extract build logic to @lucide/shared, still wip * feat(): unify icon build logic some more, add nonScalingStroke option, marking absoluteStrokeWidth as deprecated * feat(): unify icon build logic some more, add nonScalingStroke option, marking absoluteStrokeWidth as deprecated * chore(icons): revert git hook changes made to icons * fix(packages/astro,react-native,vue): fix iconNode type fix(packages/vue): fix hasA11yProp * fix(packages/solid): make component reactive & add unit tests for checking prop changes * test(packages/vue): add reactivity tests to @lucide/vue * fix(packages): replace cpy-cli, accidentally removed during main merge * docs(packages): upgrade react documentation with nonScalingStroke * fix(tests): update snapshots for lucide-react * feat(docs): upgraded package guides with nonScalingStroke, dropping absoluteStrokeWidth * fix(vue,react-native): fix linting issues * fix(icons): add proper fallback for icon width in calculatedStrokeWidth * fix(packages/svelte): add globalProps.class to icons * fix(packages/shared): wrap width, height & size in isDefined * Update types.ts * fix(packages/svelte): do not pass propsClass to mergeClasses --------- Co-authored-by: Eric Fennis <eric.fennis@gmail.com>
174 lines
6.7 KiB
Markdown
174 lines
6.7 KiB
Markdown
# @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** — but you can 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). |
|
|
| `nonScalingStroke` | `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<string, string>` | Add or override any generated SVG attributes (including `class`, `viewBox`, and so on). |
|
|
|
|
::: 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:
|
|
|
|
- `<img src="...">`
|
|
- 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)
|
|
}
|
|
```
|