Files
lucide/docs/guide/packages/lucide-react.md

156 lines
4.2 KiB
Markdown
Raw Normal View History

# Lucide React
Implementation of the lucide icon library for react applications
## Installation
::: code-group
```sh [pnpm]
pnpm install lucide-react
```
```sh [yarn]
yarn add lucide-react
```
```sh [npm]
npm install lucide-react
```
:::
## How to use
Lucide is built with ES Modules, so it's completely tree-shakable.
Each icon can be imported as a React component, which renders an inline SVG element. This way, only the icons that are imported into your project are included in the final bundle. The rest of the icons are tree-shaken away.
### Example
Additional props can be passed to adjust the icon:
```jsx
import { Camera } from 'lucide-react';
// Usage
const App = () => {
return <Camera color="red" size={48} />;
};
export default App;
```
## Props
Introducing `absoluteStrokeWidth` option on Lucide Components (#939) * Add more music icons and another mic icon (#746) * Revert "Add more music icons and another mic icon (#746)" (#750) This reverts commit 57cba6ae0ecc5ecdf355858935e18e1eac175d69. * add scale Stroke width * Added scaleStrokeWidth prop to all packages * Add scaleStrokeWidth to types * Rename scaleStrokeWidth to absoluteStrokeWidth * Adds common API elements to the Angular package (#949) * Almost complete rewrite of the Angular package * Update tsconfig.spec.json * fixes icon build export file name * Updates Angular documentation with the new properties + provider injection * Update lucide-angular.md * refactored scaleStrokeWidth to be absoluteStrokeWidth to match other packages * removed codelyzer from devDeps + added flexible angular core dependencies * Deprecates createElement helper in favour of Renderer2 to support SSR --------- Co-authored-by: Karsa <karsa@karsa.org> * Add absoluteStrokeWidth in docs * update snapshots * Manual merge of main * Fixed incorrectly merged pnpm-lock.yaml * Fixes lucide-angular build * [lucide-angular] Global configuration for properties + bugfix for legacy icon provider (#1012) * Almost complete rewrite of the Angular package * Update tsconfig.spec.json * fixes icon build export file name * Updates Angular documentation with the new properties + provider injection * Update lucide-angular.md * refactored scaleStrokeWidth to be absoluteStrokeWidth to match other packages * removed codelyzer from devDeps + added flexible angular core dependencies * Deprecates createElement helper in favour of Renderer2 to support SSR * Added global configuration and fixed undefined bug in legacy icon provider. Also updated README.md * Replaces removed line in README.md * Fixes merge error * Updates export template to use the non-deprecated type * downgrade building to ng-cli@13 * downgrade to es2020 --------- Co-authored-by: Karsa <karsa@karsa.org> * rename scaleStrokeWidth to absoluteStrokeWidth in readme --------- Co-authored-by: it-is-not <72697755+it-is-not@users.noreply.github.com> Co-authored-by: Karsa <contact@karsa.org> Co-authored-by: Eric Fennis <eric@dreamteam.nl> Co-authored-by: Karsa <karsa@karsa.org> Co-authored-by: Eric Fennis <eric.fennis@nac41112.nedap.local>
2023-04-20 16:08:34 +02:00
| name | type | default |
| --------------------- | --------- | ------------ |
| `size` | *number* | 24 |
| `color` | *string* | currentColor |
| `strokeWidth` | *number* | 2 |
| `absoluteStrokeWidth` | *boolean* | false |
### Applying props
To customize the appearance of an icon, you can pass custom properties as props directly to the component. The component accepts all SVG attributes as props, which allows flexible styling of the SVG elements. See the list of SVG Presentation Attributes on [MDN](https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/Presentation).
```jsx
// Usage
const App = () => {
return <Camera size={48} fill="red" />;
};
```
## One generic icon component
It is possible to create one generic icon component to load icons, but it is not recommended.
::: danger
The example below imports all ES Modules, so exercise caution when using it. Importing all icons will significantly increase the build size of the application, negatively affecting its performance. This is especially important to keep in mind when using bundlers like `Webpack`, `Rollup`, or `Vite`.
This is not the case for the latest NextJS, because it uses server side rendering. The icons will be streamed to the client when needed. For NextJS with Dynamic Imports, see [dynamic imports](#nextjs-example) section for more information.
:::
### Icon Component Example
```jsx
import { icons } from 'lucide-react';
const Icon = ({ name, color, size }) => {
const LucideIcon = icons[name];
return <LucideIcon color={color} size={size} />;
};
export default Icon;
```
#### Using the Icon Component
```jsx
import Icon from './Icon';
const App = () => {
2023-06-28 21:04:37 +02:00
return <Icon name="Home" />;
};
export default App;
```
#### With Dynamic Imports
> :warning: This is experimental and only works with bundlers that support dynamic imports.
Lucide react exports a dynamic import map `dynamicIconImports`, which is useful for applications that want to show icons dynamically by icon name. For example, when using a content management system with where icon names are stored in a database.
When using client side rendering, it will fetch the icon component when it's needed. This will reduce the initial bundle size.
The keys of the dynamic import map are the lucide original icon names (kebab case).
Example with React suspense:
```tsx
import React, { lazy, Suspense } from 'react';
import { dynamicIconImports, LucideProps } from 'lucide-react';
const fallback = <div style={{ background: '#ddd', width: 24, height: 24 }}/>
interface IconProps extends Omit<LucideProps, 'ref'> {
name: keyof typeof dynamicIconImports;
}
const Icon = ({ name, ...props }: IconProps) => {
const LucideIcon = lazy(dynamicIconImports[name]);
return (
<Suspense fallback={fallback}>
<LucideIcon {...props} />
</Suspense>
);
}
export default Icon
```
##### NextJS Example
In NextJS [the dynamic function](https://nextjs.org/docs/pages/building-your-application/optimizing/lazy-loading#nextdynamic) can be used to load the icon component dynamically.
```tsx
import dynamic from 'next/dynamic'
import { LucideProps } from 'lucide-react';
import dynamicIconImports from 'lucide-react/dynamicIconImports';
interface IconProps extends LucideProps {
name: keyof typeof dynamicIconImports;
}
const Icon = ({ name, ...props }: IconProps) => {
const LucideIcon = dynamic(dynamicIconImports[name])
return <LucideIcon {...props} />;
};
export default Icon;
```