Allows you to generate usable React components from SVG files. These React components take in any arbitrary props that you pass into them, such as
style
,className
,onHover
, etc.
For example,
// path/to/icons/add-new.svg
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 17.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
width="32px" height="32px" viewBox="0 0 32 32" enable-background="new 0 0 32 32" xml:space="preserve">
<g>
<polygon points="17,9 15,9 15,15 9,15 9,17 15,17 15,23 17,23 17,17 23,17 23,15 17,15 "/>
<path d="M16,2C8.269,2,2,8.269,2,16s6.269,14,14,14s14-6.269,14-14S23.731,2,16,2z M16,28C9.383,28,4,22.617,4,16S9.383,4,16,4
s12,5.383,12,12S22.617,28,16,28z"/>
</g>
</svg>
becomes:
export default class AddNewIcon extends Component {
render() {
return (
<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 32 32" {...this.props}><path d="M17 9h-2v6H9v2h6v6h2v-6h6v-2h-6"/><path d="M16 2C8.27 2 2 8.27 2 16s6.27 14 14 14 14-6.27 14-14S23.73 2 16 2zm0 26C9.383 28 4 22.617 4 16S9.383 4 16 4s12 5.383 12 12-5.383 12-12 12z"/></svg>;
);
}
}
You can interface with this package in two ways,
index.js
in the projectYou can use the CLI by specifying an input glob pattern with -i
, an output for the files to go to with -o
, and the template you want to use to transform the SVG files with -t
;
Reference:
cli
.version('0.0.1')
.option('-i, --input <path>', 'input path to your SVG files')
.option('-o, --output <path>', 'output path for your generated React components')
.option('-t, --template [value]', 'template that you want to generate [reactDefault, reactFunction]')
If you choose to use the project itself, it exposes a single function that you can require that takes in an input glob, an output directory, a template function, and a boolean corresponding to whether or not you're generating a component.
import path from 'path';
import convert from 'react-svg-converter';
import { reactDefault, reactFunction } from 'templates';
const input = __dirname + 'path/to/icons/**/*.svg';
const output = path.resolve(__dirname, 'path/to/output');
convert(input, output, reactDefault, true);
Templates are defined in templates
and take in a name
parameter that corresopnds to the name of the component and a svg
parameter that corresponds to optimized svg with added prop values.
Example:
// templates/react.default.js
export default (name, svg) =>
`import { Component } from 'react';
export default class ${name}Icon extends Component {
render() {
return (
${svg};
);
}
}`