Files
lucide/docs/guide/react/advanced/combining-icons.md
KarsaandEric Fennis 99d25bdee2 feat(packages): extract icon build logic into @lucide/shared (#4409)
* 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>
2026-09-04 16:38:01 +02:00

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;
```
:::