UTILS.
100% ブラウザ内で完結
🎨

SVG から JSX コンポーネントへ

生の SVG マークアップを、camelCase 化した属性、props のスプレッド、任意の currentColor と forwardRef を備えた、すぐ使える React コンポーネントに変換します。

— ここに結果が表示されます —

このツールについて

SVG から JSX コンポーネントへのツールは、生の SVG マークアップを SVGR のようにクリーンな React コンポーネントに変換しますが、完全にブラウザ内で行い、何もアップロードしません。デザインツールからエクスポートしたアイコンを貼り付けると、インポートしてスタイルできるコンポーネントが得られます。SVG を DOMParser で解析し、マークアップが不正なら明確なエラーを報告します。

ハイフン付きや名前空間付きのすべての SVG 属性は React 名に camelCase 化されます(stroke-width は strokeWidth、fill-rule は fillRule、clip-path は clipPath、stop-color は stopColor、xlink:href は xlinkHref、xmlns:xlink は xmlnsXlink)。一方で data-* と aria-* 属性はそのままです。インラインの style 文字列は style オブジェクトになり、path や circle のような空要素は自己終了され、props はルートの <svg {...props}> にスプレッドされるため、コンポーネントは設定可能なまま保たれます。任意のトグルにより、ハードコードされた fill と stroke の値を currentColor に置き換え(アイコンがテキストの色を継承)、width と height を取り除いてコンテナに合わせてスケールさせ、コンポーネントを forwardRef でラップして下層の <svg> ノードを公開できます。

JavaScript か TypeScript の出力を選べます。TypeScript 版は props を React.SVGProps<SVGSVGElement> として型付けし、forwardRef を有効にすると forwardRef<SVGSVGElement, React.SVGProps<SVGSVGElement>> を使います。コンポーネントはエクスポートされたアロー関数(export const Icon = (props) => (...))として、選んだ名前とインデントで出力され、アイコンモジュールに貼り付ける準備が整います。

よくある質問

SVG 属性はどう変換されますか?
ハイフン付きやコロン名前空間付きの属性は React 相当に camelCase 化されます(stroke-width は strokeWidth、fill-rule は fillRule、xlink:href は xlinkHref)。data-* と aria-* 属性は保持されます。インラインスタイルは style オブジェクトになります。
currentColor オプションは何をしますか?
ハードコードされた fill と stroke の色の値(none 以外のすべて)を "currentColor" に置き換えるため、SVG は周囲のテキストの色を継承し、親でのプレーンな CSS の color で再着色できます。
なぜ props を svg にスプレッドするのですか?
ルートの <svg> に {...props} をスプレッドすると、呼び出し側が className、width、onClick、aria ラベルなどあらゆる SVG props をコンポーネントに渡せます。forwardRef を有効にすると、ref も下層の要素へ転送されます。
JS 出力と TS 出力の違いは何ですか?
TypeScript 出力は props を React.SVGProps<SVGSVGElement> として型付けし、forwardRef では forwardRef<SVGSVGElement, React.SVGProps<SVGSVGElement>> を使います。JavaScript 出力は型注釈を省きますが、それ以外は同一です。

その他のツール