Icon System Builder
Paste any set of SVG icons and the tool normalizes them — standardizes the viewBox, strips width/height, and recolors hard-coded fills to currentColor — then ships a complete icon system from one source. A live grid previews every icon with adjustable size and colour, a built-in lint flags missing viewBoxes, stuck colours, and duplicate names, and you can export an SVG <symbol> sprite, React or Vue components, a CSS background sprite, a barrel index, a TypeScript name union, or a JSON manifest.
About this ToolHow it works, benefits & use casesTap to collapse
Most icon tools just repackage a fixed set of glyphs. This one starts by normalizing whatever SVGs you give it: it extracts and standardizes each viewBox, strips baked-in width/height so icons scale to context, and optionally rewrites hard-coded fill/stroke values to currentColor so every icon inherits text colour. Paste your own markup (a full <svg> or just the inner geometry), add as many icons as you like, and the tool parses each one into a safe element tree — using string and regex only, never the DOM — so the live grid can render real previews with adjustable size and colour. A built-in lint flags icons missing a viewBox, stuck colours that will not recolor, duplicate names, and empty geometry. From that single normalized source you can export seven targets: an inline SVG <symbol> sprite referenced by <use>, typed React components, a Vue single-file component, a CSS background sprite that embeds each icon as a data URI, a barrel index of named exports, a TypeScript icon-name union with a names array, or a JSON manifest with categories, tags, and viewBoxes. The full icon set and your options live in a shareable URL.
How to Use
- 1Start from the built-in set, add the Starter pack, or paste your own SVG markup with a name to add icons.
- 2Set the prefix (used in sprite IDs and CSS class names) and the default component size.
- 3Keep "Recolor to currentColor" on so hard-coded fills follow text colour, or turn it off to preserve original colours.
- 4Use the live grid to preview every icon, adjusting the preview size and colour, and toggle the decorative-vs-titled a11y note.
- 5Read the lint card — it flags missing viewBoxes, stuck colours, duplicate names, and empty icons.
- 6Pick an output target and copy or download it; share the URL to hand the exact icon system to a teammate.
Key Benefits
- Normalizes any SVG: standardizes the viewBox, strips width/height, optionally recolors to currentColor
- Parses SVGs with pure string/regex into a safe element tree — no DOMParser, no innerHTML
- Live grid preview with adjustable size and colour, plus a per-icon decorative/titled a11y note
- Built-in lint flags missing viewBoxes, hard-coded colours, duplicate names, and empty geometry
- Seven export targets from one source: SVG symbol sprite, React, Vue, CSS sprite, index barrel, TS union, JSON manifest
- React components are typed (extend React.SVGProps) and tree-shakeable; the TS union powers a typed icon picker
- Configurable prefix and component size; the whole set + options live in a shareable URL
Common Use Cases
- Cleaning up a pile of inconsistent SVGs into one normalized, theme-aware icon system
- Producing an SVG <symbol> sprite you reference by ID across an app as a single request
- Generating typed React or Vue icon components from your own glyphs
- Emitting a CSS background sprite when you cannot change component markup
- Building a typed, searchable icon picker from the TypeScript name union and JSON manifest
Live preview
5 iconsSVG <symbol> sprite · 5 icons
<svg xmlns="http://www.w3.org/2000/svg" style="display: none;">
<symbol id="icon-home" viewBox="0 0 24 24">
<path d="M3 9l9-7 9 7v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z" />
<polyline points="9 22 9 12 15 12 15 22" />
</symbol>
<symbol id="icon-user" viewBox="0 0 24 24">
<path d="M20 21v-2a4 4 0 0 0-4-4H8a4 4 0 0 0-4 4v2" />
<circle cx="12" cy="7" r="4" />
</symbol>
<symbol id="icon-settings" viewBox="0 0 24 24">
<circle cx="12" cy="12" r="3" />
<path d="M12 1v6m0 6v6m9-9h-6m-6 0H3" />
</symbol>
<symbol id="icon-search" viewBox="0 0 24 24">
<circle cx="11" cy="11" r="8" />
<path d="m21 21-4.35-4.35" />
</symbol>
<symbol id="icon-heart" viewBox="0 0 24 24">
<path d="M20.84 4.61a5.5 5.5 0 0 0-7.78 0L12 5.67l-1.06-1.06a5.5 5.5 0 0 0-7.78 7.78l1.06 1.06L12 21.23l7.78-7.78 1.06-1.06a5.5 5.5 0 0 0 0-7.78z" />
</symbol>
</svg>
Usage
<svg class="icon" aria-hidden="true"> <use href="#icon-home" /> </svg>
Icons
- homeHome · 0 0 24 24
- userUser · 0 0 24 24
- settingsSettings · 0 0 24 24
- searchSearch · 0 0 24 24
- heartHeart · 0 0 24 24
kebab-case; becomes a PascalCase component name.
System options
Used in sprite IDs and CSS classes.
Rewrites stuck fill/stroke values so icons inherit text colour.
Output target
One source, every delivery format
Inconsistent icons are the usual cause of a ragged UI — different viewBoxes, baked-in widths, and hard-coded colours that ignore your theme. This tool normalizes every icon to a common viewBox, strips fixed dimensions, and rewrites stuck fills to currentColor so a single icon inherits text colour everywhere it appears.
Pick the delivery that fits
An SVG <symbol> sprite is referenced by ID and stays a single request; React/Vue components give you typed, tree-shakeable imports; a CSS background sprite needs no markup changes; and the TypeScript name union plus JSON manifest power a typed, searchable icon picker.
Was this tool helpful?
Share Your Experience
Help others discover this tool!
Related tools
- SVG OptimizerOptimize and compress SVG files
- SVG to React ComponentConvert SVG to a clean TSX/JSX/React Native component — currentColor, prop spread, forwardRef, memo, live preview
- Skeleton Screen GeneratorBuild layout-matched skeleton loaders (card/list/article/table) with shimmer/pulse/wave and a live preview
- App Icon GeneratorTurn one image into complete icon sets for iOS, Android, Web/PWA & macOS — Contents.json, adaptive icons, maskable, manifest & favicon.ico — in one ZIP
- Favicon GeneratorGenerate favicons from images
- Framer Motion GeneratorBuild Framer Motion variants, gestures, springs, and staggered lists with a live preview and copy-ready JSX
Yes — that is the core of the rebuilt tool. Paste a full <svg>…</svg> or just inner geometry (a <path>, <circle>, <polyline>, and so on) along with a name, and it is normalized and added to the system. You can add as many as you want, remove any, and the live preview, lint, and every export update instantly. The starter set and a one-click Starter pack are there to get you going.
For each icon it reads the original <svg> open tag to extract the viewBox (defaulting to 0 0 24 24 and flagging it if absent), strips any fixed width/height so the icon scales to its container, and — when recolor is enabled — rewrites hard-coded fill and stroke colours to currentColor while leaving none, transparent, and existing currentColor values alone. The geometry itself is parsed into an element tree and re-serialised deterministically, so every export starts from the same clean source.

