Why I don't use icon fonts in Figma

1) Getting glyphs into text layers is cumbersome

Getting an icon into Figma takes a lot of work. Figma's own docs (which use Font Awesome as an example) describe this as a 7-step process. The worst of which involve leaving Figma to go to FA's website... browsing their collection of glyphs, selecting the right one (which opens a modal—ouch)... copying a teeny tiny inline rendering of that icon to your clipboard... and coming back to your text layer in Figma to paste it in. Woof.

It'd be great if FA's official Figma plugin let you copy the font-based glyph to your keyboard to paste into your text layer. That would reduce the context switching and feel a lot faster.

But that's not the case. When you select an icon in FA's plugin, it places it on the canvas as an SVG path inside of a frame.

FA's plugin biases toward SVG paths, and away from icon fonts. Kinda funny!

Google's official Material Icons Figma plugin behaves the same way.

If I was working with SVG paths that were stored as components, I could just pull instances directly into my designs.

2) No visual previews, and memorizing icon names

While I couldn't pull this off with FA-6's free collection, I could with Material's icon font: rendering the icon in my text layer by manually typing the glyph name:

manually typing glyph names using the Material icon font in Figma

There's something about this workflow that feels faster and more satisfying than the one above. But that doesn't mean it's great. For this to work, I'd have to memorize the exact names of glyphs. When I want a glyph I don't have memorized, I still have to use either the font-creator's plugin, or a gallery on an official website to browse my options and learn new icons' names.

If I was working with SVGs stored as main components, I'd get the visual previews and have "fuzzy search" available via keywords stored in the component descriptions. What's more, those keywords are mine (or my design system's) to control.

I mean, just look at the difference in experience for overriding icons within a component:

GIF demonstrating how easy instance swapping is compared to typing an icon name

I couldn't be bothered to figure out why typing the exact icon name failed in the example above. The risk of mis-typing something is just too great... subjecting design system consumers to memorizing icon names like this is just plain bad.

3) Comparing glyphs' artwork is tedious

A downside I see here is a creativity trap. Because the names must be exact, and because any one person can only be expected to memorize so many exact icon names, the world of possibility shrinks. Depending on your goals as a designer, this can be a big hinderance. 

If you're expected to explore, go wide, and produce lots of visual artifacts to compare against each other, this workflow... sucks! It's just as cumbersome as the first one, but you also have to contend with actively-fighting the urge to "just pick an icon you've already memorized the name of" because that's faster and has less friction than going out to source a new glyph.

To truly get two or more glyphs to sit side-by-side, you have to render them in Figma. In this example, I'm interested in comparing Material's <span class="inline-code">arrow_back_2</span> with <span class="inline-code">arrow_left</span>. Filtering their gallery by the word "arrow" still pulls up other relevant results around and between these glyphs.

Filtering Material icons by the word "arrow"

Spatially, they're too far apart to adequately compare them. To do that, I'd have to render these in Figma.

Comparing this to SVGs stored as main components, I'd say the same thing I did in the first point: I could simply pull instances directly onto the canvas to compare them.

4) Editing glyph-artwork is hard

Have you ever made a font? And I mean really making a font... like, pulling on handles and creating curves. You'd do this in software like FontLab, or FontForge.

If your icons exist as a font, you might use that software to edit your icons. And font-editing tools will absolutely have a learning curve to them.

But maybe that's overkill. 

Perhaps you'd rather edit the paths in a tool like Illustrator or Figma, export the SVGs, and then generate your icon font using something like FontCustom or Fontello. But even FontCustom's README file suggests... not using an icon font at all!

FontCustom's README warning people to use alternative solutions

And this includes adding new icons to the set. It happens! Even when you're using a popular collection with over a thousand icons, eventually the need for something custom will arise.

Adding that custom glyph is a lot easier to do when everything is managed in Figma as main components.

5) Sharing fonts is annoying

Once you've got things installed, you're fine. But it never lasts forever because... we live in a society! You're going to change jobs. You'll have to re-install the font on your new work machine. Or, a new colleague will join your team. They'll ask, "hey, can someone get me the font file?" This is assuming you're using an icon font that's not free and already available via google fonts.

If you're lucky to be on Figma's organization plan, you can install the fonts within Figma and folks don't have to fiddle with installing anything. But you might not have permissions to do that. In that case, it's up to whoever is managing your company's Figma account to do this—let's hope they do!

But when your icons are stored as main components, designers have a lot more control over how those assets get shared among teams.

6) No option for multi-color

Developers can achieve this outside of Figma, but inside Figma, it's not an option. If you're using an icon font with a duotone "weight" option, you can get duotone icon fonts in Figma, but not multi-color.

How does one achieve multi-color icon artwork in Figma? SVG paths stored as main components, of course, but how do you contend with color overrides? I've written about that in another blog post.

7) My devs don't use icon fonts

And it seems like most don't. They haven't for a while. This CSS tricks post from 2014 offers a lot of good reasons to use SVGs instead.

This post I've written is the Figma-version of that post, I suppose!

<div class="horizontal-rule"></div>

My argument is that in Figma, it is better for icons to be stored as SVG paths, within individual main component frames, rather than rendering icons in text layers using an icon font.

The one big advantage icon fonts in Figma have over component instances is the ability to be placed in-line with other font families:

A text layer using inter and Material's icon font

However, this text layer isn't very design system friendly. It's a mix of two font families on the same layer: Inter and Material icons.

Mixed font families on the same text layer.

That means you can't connect to variables, or text styles. My hope is one day Figma will introduce <span class="inline-code">span</span>, or something like it (one of my wish-list items).

Even though icons as component instances can't do that nice in-line text-wrapping behavior, I think the pros far outweigh the cons. There's still, of course, questions that come with my preferred approach: "How do I manage different icon sizes?" and "should I flatten my SVG paths into a single layer?"

Good news, I've written about both of those topics (managing icon size, and outline VS stroke artwork).