mirror of
https://github.com/lucide-icons/lucide.git
synced 2026-11-12 13:38:32 +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>
113 lines
2.6 KiB
Markdown
113 lines
2.6 KiB
Markdown
---
|
|
title: Combining icons - React
|
|
description: Learn how to combine multiple icons into a single icon nested SVG elements in your React application.
|
|
---
|
|
<script setup>
|
|
import Sandpack from '~/.vitepress/theme/components/editors/Sandpack.vue'
|
|
</script>
|
|
|
|
# Combining icons
|
|
|
|
You can combine multiple icons into a single icon by nesting SVG elements.
|
|
This is useful if you want to create custom icons by combining existing ones.
|
|
|
|
::: sandpack {template=react showTabs=false editorHeight=400 editorWidthPercentage=60 dependencies="lucide-react"}
|
|
|
|
```jsx App.js [active]
|
|
import { Scan, User } from "lucide-react";
|
|
|
|
function App() {
|
|
return (
|
|
<div className="app">
|
|
<Scan size={48} nonScalingStroke>
|
|
<User
|
|
size={12}
|
|
x={6}
|
|
y={6}
|
|
nonScalingStroke
|
|
/>
|
|
</Scan>
|
|
</div>
|
|
);
|
|
}
|
|
|
|
export default App;
|
|
```
|
|
:::
|
|
|
|
This is valid, since [SVGs can be nested](https://developer.mozilla.org/en-US/docs/Web/SVG/Reference/Element/svg#nested_svg_element), and all SVG properties are supported on the icons.
|
|
The `x` and `y` coordinates can be adjusted to position the icons as you like.
|
|
|
|
::: info Limitation
|
|
When combining icons, you need to make sure that the `x` and `y` coordinates are within the `viewBox` of the outer icon (24x24).
|
|
:::
|
|
|
|
## With native SVG elements
|
|
|
|
You can also combine Lucide icons with native SVG elements to build custom icon variations.
|
|
|
|
### Example with notification badge
|
|
|
|
For example, you can add a notification badge to an icon by using the `circle` SVG element.
|
|
|
|
|
|
::: sandpack {template=react showTabs=false editorHeight=580 editorWidthPercentage=60 dependencies="lucide-react"}
|
|
|
|
```jsx App.js [active]
|
|
import { Mail } from "lucide-react";
|
|
|
|
function App() {
|
|
const hasUnreadMessages = true;
|
|
|
|
return (
|
|
<div className="app">
|
|
<Mail size={48}>
|
|
{hasUnreadMessages && (
|
|
<circle
|
|
r="3"
|
|
cx="21"
|
|
cy="5"
|
|
stroke="none"
|
|
fill="#F56565"
|
|
/>
|
|
)}
|
|
</Mail>
|
|
</div>
|
|
);
|
|
}
|
|
|
|
export default App;
|
|
```
|
|
:::
|
|
|
|
### Example with text element
|
|
|
|
You can also use the `text` SVG element to add text to your icon.
|
|
|
|
::: sandpack {template=react showTabs=false editorHeight=400 editorWidthPercentage=60 dependencies="lucide-react"}
|
|
|
|
```jsx App.js [active]
|
|
import { File } from "lucide-react";
|
|
|
|
function App() {
|
|
return (
|
|
<div className="app">
|
|
<File size={48}>
|
|
<text
|
|
x={7.5}
|
|
y={19}
|
|
fontSize={8}
|
|
fontFamily="Verdana,sans-serif"
|
|
strokeWidth={1}
|
|
>
|
|
JS
|
|
</text>
|
|
</File>
|
|
</div>
|
|
);
|
|
}
|
|
|
|
export default App;
|
|
```
|
|
:::
|