Figma can export an SVG in two clicks. The hard part is getting an SVG that developers can paste into React, theme with CSS, optimize safely, and ship without broken gradients, clipped artwork, random IDs, or a 40 KB icon component.
The fast rule:
Export the smallest correct Figma selection, keep the viewBox, decide whether text should stay editable or become paths, preserve only IDs your code needs, then run a conservative cleanup pass before using the SVG in production.
If you already know how to click Export SVG in Figma, this guide is the next step: how to turn that export into clean code.

What makes a Figma SVG export "clean" for code?
A clean Figma SVG export is an SVG that renders correctly, scales through its viewBox, keeps only necessary definitions, uses predictable colors, and can be edited or optimized without breaking the design. It should not depend on accidental frame bounds, duplicate IDs, hidden layers, or generated markup your app does not need.
Clean SVG code is SVG markup that preserves the visible artwork while removing unnecessary editor output and keeping the attributes required for scaling, accessibility, styling, gradients, masks, and browser rendering.
Use this quick checklist before a Figma SVG goes into a repo:
- The exported selection is the actual icon, logo, or illustration, not the whole page frame.
- The
<svg>has a correctviewBox. - Decorative backgrounds and hidden layers are not included.
- Text is intentionally either outlined or left as text.
- IDs are kept only when gradients, masks, clip paths, CSS, or JavaScript need them.
- Fill and stroke colors match the way the asset will be themed.
- The SVG still works after optimization.
- The final file is tested in the real page, not only in Figma.
Useful references while checking output:
Which Figma SVG export settings should developers use?
For most developer handoffs, export SVG at 1x, keep a tight selection, use "Include id attribute" only when code needs stable hooks, and use "Outline text" only when exact appearance matters more than editable text. Then inspect the exported code before importing it into a web app.
Here is the practical decision table:
| Setting | Use It When | Avoid It When | Developer Risk |
|---|---|---|---|
| SVG format | The asset is a vector icon, logo, shape, or illustration | The asset is photo-like or effect-heavy | None; this is the correct format for vectors |
| Include bounding box | The frame size is part of the intended canvas | You only need the visible icon or mark | Extra whitespace and awkward alignment |
Include id attribute | CSS, JS, gradients, masks, or animation hooks need stable references | You are exporting standalone static icons | Duplicate or invalid IDs after combining files |
| Outline text | Logo text or display text must look identical everywhere | Text must remain selectable, accessible, or translatable | Larger files and non-editable text |
| Simplify stroke | Simple strokes can safely become simpler output | Brand marks, detailed icons, or precision geometry are involved | Corners, joins, and alignment can shift |
Figma's own export settings include SVG-specific options such as IDs, outline text, and stroke simplification. The mistake is treating those as universal "clean code" switches. They are tradeoffs.
For a web icon library, start with:
Selection: icon frame or vector group only
Format: SVG
Scale: 1x
Include bounding box: only if alignment needs it
Include id attribute: off unless needed
Outline text: on for logos, off for real text
Simplify stroke: test visually before keeping
If the source asset was made from a raster image, use Image to SVG or PNG to SVG after design cleanup. If the source is already vector, use SVG Minify or SVG Optimizer after export.
How do I clean a Figma SVG before adding it to React?
To clean a Figma SVG for React, keep the viewBox, remove fixed dimensions when the component should be responsive, convert SVG attributes to JSX names, replace hardcoded colors with props or currentColor when needed, and preserve any referenced defs such as gradients, clip paths, masks, and filters.
Start with a typical Figma export:
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_42_10)">
<path d="M4 12L10 18L20 6" stroke="#111827" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
</g>
<defs>
<clipPath id="clip0_42_10">
<rect width="24" height="24" fill="white"/>
</clipPath>
</defs>
</svg>
Then turn it into a component your app can control:
type CheckIconProps = {
title?: string;
className?: string;
size?: number;
};
export function CheckIcon({ title = "Check", className, size = 24 }: CheckIconProps) {
return (
<svg
width={size}
height={size}
viewBox="0 0 24 24"
fill="none"
xmlns="http://www.w3.org/2000/svg"
className={className}
role="img"
aria-label={title}
>
<path
d="M4 12L10 18L20 6"
stroke="currentColor"
strokeWidth={2}
strokeLinecap="round"
strokeLinejoin="round"
/>
</svg>
);
}
What changed:
clip-pathbecameclipPathonly if the clip path is still needed.stroke-width,stroke-linecap, andstroke-linejoinbecame JSX camelCase.- Hardcoded black became
currentColor. - The
viewBoxstayed. - The component accepts
size,className, and accessible title text. - Unnecessary clipping markup was removed after confirming it did not change the icon.
For one-off marketing SVGs, inline JSX may be overkill. A clean .svg file in public/ can be simpler. For reusable UI icons, a component is usually worth it.
Why does Figma SVG code include strange IDs and clip paths?
Figma exports IDs, clip paths, groups, masks, and definitions because they preserve the design structure. Some are necessary for gradients, masks, clipping, and effects. Others are only artifacts of frames, layer names, boolean operations, or the way Figma serializes the selected object.
The rule is simple: delete structure only after proving it is unused.
Common Figma export patterns:
| Export Pattern | Why It Appears | Keep It? |
|---|---|---|
clipPath id="clip0_..." | Frame clipping, masks, or bounded groups | Keep if content is intentionally clipped |
linearGradient id="paint0_..." | Gradient fills | Keep and avoid duplicate IDs |
Nested <g> groups | Layer grouping or transforms | Remove only if transforms/styles are not needed |
Fixed width and height | Exported frame dimensions | Keep for fixed assets; remove or override for responsive components |
fill="none" on root | Figma default for stroke icons | Usually harmless |
| Long decimal path data | Precise vector coordinates | Reduce cautiously with an optimizer |
| Layer-name IDs | "Include id attribute" was enabled | Keep only if code targets them |
The most expensive cleanup mistake is deleting a <defs> block because the visible shape still appears in one test. A gradient, mask, filter, or clip path may only fail on a different asset state, theme, or browser size.
If you want a quick safety pass, open the file in SVG Validator, then compare the cleaned version in SVG Editor.
How do I make a Figma SVG responsive without breaking the viewBox?
To make a Figma SVG responsive, keep the original viewBox and control display size with CSS, component props, or container rules. Do not delete or rewrite the viewBox unless you understand the coordinate system. The viewBox is what lets the graphic scale without losing its internal proportions.
Bad cleanup:
<!-- The SVG may no longer scale correctly if viewBox is removed. -->
<svg width="24" height="24">
<path d="..." />
</svg>
Better cleanup:
<svg viewBox="0 0 24 24" width="1em" height="1em" aria-hidden="true">
<path d="..." />
</svg>
For CSS-controlled assets:
.brand-icon {
width: clamp(32px, 6vw, 72px);
height: auto;
display: block;
}
For inline icons:
<LogoMark className="h-8 w-auto text-slate-950" />
If the exported artwork has unexpected whitespace, the problem is usually the selected frame or bounding box, not the viewBox itself. Go back to Figma, select the tighter asset, and export again. Manual viewBox surgery should be the backup plan, not the first move.
Should Figma SVG colors be hardcoded or themeable?
Hardcode SVG colors for brand marks, illustrations, and assets that must keep exact colors. Use currentColor, CSS variables, or component props for UI icons, themed assets, hover states, dark mode, and design-system icons. The best choice depends on whether the asset is brand-controlled or interface-controlled.
Use this color decision guide:
| Asset Type | Best Color Strategy | Example |
|---|---|---|
| Brand logo | Hardcoded brand fills | fill="#00A884" |
| UI icon | currentColor | stroke="currentColor" |
| Multi-color illustration | Hardcoded fills or CSS variables | fill="var(--accent)" |
| Dark-mode icon | currentColor or CSS variables | .dark .icon { color: white; } |
| Animated SVG | Classes or CSS variables | .spark { stroke: var(--spark); } |
For a single-color Figma icon, replace hardcoded strokes and fills with currentColor:
<svg viewBox="0 0 24 24" aria-hidden="true">
<path d="M5 12h14" stroke="currentColor" stroke-width="2" />
</svg>
Then your UI can control it:
<button class="text-emerald-600">
<!-- icon inherits the button color -->
</button>
For a logo, do not casually convert brand colors to currentColor. A brand mark should usually stay locked unless the design system explicitly defines a one-color version.
What is the safest Figma-to-production SVG workflow?
The safest workflow is export, inspect, clean, optimize, compare, and test in context. Do not optimize blindly and do not paste raw Figma SVG into every component without deciding whether the asset needs accessibility, theming, responsive sizing, or stable IDs.
Use this 12-minute workflow:
- In Figma, duplicate the asset into an export-ready frame.
- Remove hidden layers, temporary notes, and accidental backgrounds.
- Select the tightest useful frame or group.
- Export SVG at 1x.
- Open the SVG and check
viewBox, dimensions, text, colors, anddefs. - Decide whether it belongs as a file asset or inline component.
- Convert attributes to JSX if using React.
- Replace colors with
currentColoronly when the asset should inherit color. - Run conservative optimization in SVG Optimizer.
- Validate syntax in SVG Validator.
- Compare original and final at 16px, 24px, 48px, and full size.
- Test inside the real page, app, email, or CMS where users see it.
For assets generated from prompts or raster input, SVG Genie can be the faster source. Use AI SVG Generator for new vector concepts, SVG Editor for cleanup, and SVG Minify for the final pass.
When should I use SVG Genie instead of cleaning a Figma export?
Use SVG Genie when the Figma file is only a rough concept, the source is a PNG/JPG, the SVG export is full of trace noise, or you need several vector directions quickly. Use Figma cleanup when the design is already final and precision matters more than generating a new vector.
Good candidates for SVG Genie:
- A PNG logo that needs to become SVG.
- A rough icon concept that needs cleaner paths.
- A decorative illustration where speed matters.
- A marketing asset that needs multiple visual directions.
- A Figma export with thousands of noisy fragments from a pasted raster image.
Good candidates for Figma cleanup:
- Final brand marks.
- Design-system icons.
- Product UI components.
- Assets that must match exact spacing and component rules.
- SVGs with intentional masks, gradients, and animation hooks.
The cleanest production pipeline is often hybrid: generate or convert with SVG Genie, refine layout in Figma, then optimize the final SVG before shipping.
FAQ
How do I export clean SVG code from Figma?
Export the smallest selected frame or icon, use SVG at 1x, keep the viewBox, outline text only when exact visual rendering matters, include IDs only when CSS or scripts need them, then remove editor noise and test the SVG in the page where it will ship.
Should I outline text when exporting SVG from Figma?
Outline text when the SVG must look identical everywhere, such as a logo lockup or static illustration. Keep text as text when the words need to stay selectable, translatable, accessible, or indexable, but make sure the font is available where the SVG renders.
Why does a Figma SVG look messy in React?
Figma SVG exports often include hyphenated attributes, inline dimensions, clip paths, generated IDs, and hardcoded fills. React expects camelCase attributes such as clipPath and strokeWidth, and production components usually need props for size, title, className, and color.
Can I use Figma SVG export directly in production?
Yes for simple icons and static assets, but inspect it first. Keep the viewBox, remove unnecessary width and height when responsive sizing matters, preserve referenced defs, and run a conservative SVG optimizer before adding it to a website or app.
What is the safest way to optimize a Figma SVG?
Use conservative optimization: remove metadata and whitespace, lower numeric precision carefully, keep viewBox, keep accessibility labels, and preserve IDs used by gradients, masks, clip paths, CSS, or JavaScript.
Next step
If your Figma export is already correct but too large, run it through SVG Optimizer. If the source file is a PNG, screenshot, or messy raster trace, start with Image to SVG and clean the vector in SVG Editor before minifying it.
Create your own SVG graphics with AI
Describe what you need, get a production-ready vector in seconds. No design skills required.
About This Article
This article was written by SVG Genie Team based on hands-on testing with SVG Genie's tools and years of experience in vector design and web graphics. All recommendations reflect real-world usage and are reviewed by the SVG Genie editorial team for accuracy.
About the Author
SVG Genie Team
SVG Design Expert & Technical Writer at SVG Genie
SVG Genie Team is a vector design specialist and technical writer at SVG Genie with years of hands-on experience in SVG tooling, AI-assisted design workflows, and web graphics optimization. Their work focuses on making professional vector design accessible to everyone.
More articles by SVG Genie Teamarrow_forward