@inline-svg-unique-id/react
Advanced tools
{ | ||
"name": "@inline-svg-unique-id/react", | ||
"version": "1.2.0", | ||
"version": "1.2.1", | ||
"description": "React API unique inline SVG components ID generator", | ||
@@ -40,3 +40,3 @@ "author": "Laurynas Aleksiūnas <laurynas.aleksiunas@gmail.com>", | ||
}, | ||
"gitHead": "c17da3a4b250324a558889b722b018273d714eca" | ||
"gitHead": "2595b212162ef09f2056ee916f65dad1e403ad62" | ||
} |
@@ -1,10 +0,56 @@ | ||
# `@inline-svg-unique-id/react` | ||
# inline-svg-unique-id | ||
### Installation | ||
Efficient and SSR friendly ID generator at the runtime for inline SVG components definitions. | ||
_npm install @inline-svg-unique-id/react_\ | ||
_npm install --save-dev babel-plugin-react-inline-svg-unique-id_ | ||
## Installation | ||
### Usage | ||
```shell | ||
$ npm install @inline-svg-unique-id/react | ||
$ npm install --save-dev babel-plugin-react-inline-svg-unique-id | ||
``` | ||
## Why? | ||
Inline SVG components have a duplicated definitions issue. Let's say you want to import such an icon twice in your page: | ||
```jsx | ||
const Icon = () => ( | ||
<svg height="150" width="400"> | ||
<defs> | ||
<linearGradient id="grad1" x1="0%" y1="0%" x2="100%" y2="0%"> | ||
<stop offset="0%" style="stop-color:rgb(255,255,0);stop-opacity:1" /> | ||
<stop offset="100%" style="stop-color:rgb(255,0,0);stop-opacity:1" /> | ||
</linearGradient> | ||
</defs> | ||
<ellipse cx="200" cy="70" rx="85" ry="55" fill="url(#grad1)" /> | ||
</svg> | ||
); | ||
``` | ||
The ellipse element gets linear gradient fill which is referenced by id. Inlining two or more such icons in the same page | ||
will cause id duplications issues, and the browser might fail to paint the gradient. This library will transform inline SVG components at | ||
the build-time and add code that generates ids at the runtime. For example, the previous icon is transformed to: | ||
```jsx | ||
import { useUniqueInlineId } from '@inline-svg-unique-id/react'; | ||
const Icon = () => { | ||
const gradientId = useUniqueInlineId(); | ||
return ( | ||
<svg height="150" width="400"> | ||
<defs> | ||
<linearGradient id={gradientId} x1="0%" y1="0%" x2="100%" y2="0%"> | ||
<stop offset="0%" style="stop-color:rgb(255,255,0);stop-opacity:1" /> | ||
<stop offset="100%" style="stop-color:rgb(255,0,0);stop-opacity:1" /> | ||
</linearGradient> | ||
</defs> | ||
<ellipse cx="200" cy="70" rx="85" ry="55" fill={`url(#${gradientId})`}/> | ||
</svg> | ||
); | ||
}; | ||
``` | ||
## Usage | ||
**With SVGR:** | ||
@@ -11,0 +57,0 @@ |
10630
17.64%113
68.66%