Introducing Vector Networks

Evan Wallace
Feb 9, 2016 · 5 min read

Before I co-founded Figma my background was in game development, not in design. I remember being very surprised when I first encountered modern vector editing tools. Many of the interactions felt broken. Why couldn’t you just manipulate things directly? Why did connecting and disconnecting stuff only sometimes work? Is this the best we can do?

The pen tool as we know it today was originally introduced in 1987 and has remained largely unchanged since then. We decided to try something new when we set out to build the vector editing toolset for Figma. Instead of using paths like other tools, Figma is built on something we’re calling vector networks which are backwards-compatible with paths but which offer much more flexibility and control:

A vector network in action

After our first implementation of vector networks, we did a series of user studies to refine the concept. We were surprised to discover that many people didn’t even notice a difference between vector networks and paths. The tool just worked how people expected it to work. They did notice the difference when they went back and tried to use other tools, however. That was especially painful to watch and confirmed to us we had found something special.

Strokes

Think of a pen plotter when thinking of paths (Photograph by Tomasz Sienicki)

A vector network improves on the path model by allowing lines and curves between any two points instead of requiring that they all join up to form a single chain. This helps provide the best of both worlds; it combines the ease with which points can be connected on paper and the ease with which geometry can be manipulated once it’s drawn. Splitting and recombining geometry is much more natural with vector networks. Delete anything, anywhere. Connect anything to anything else. Stroke cap and join styles just work naturally in vector networks, even for points with three or more lines coming off of them. This isn’t the case for paths because it’s impossible to use paths to represent attaching three lines together at a single point.

Vector networks support standard stroke cap and join styles

Bending

We initially experimented with some powerful curve types that can provide greater control and shaping power, but in the end it made the most sense to remain backwards-compatible with existing vector data. That’s why both paths and vector networks use the same type of curves. In addition to dragging the control handles, Figma’s bend tool (the command key on OS X) lets you drag the curve around directly. The editor will automatically figure out where to place the control handles for you:

The bend tool drags curves around

Fills

The non-zero winding rule means fill depends on curve orientation

Instead of using this confusing concept, fills in Figma start off by automatically filling all enclosed space:

Enclosed space is filled automatically

If you later want to add holes, just punch the holes out directly without needing to worry about curve orientation:

The paint bucket tool can toggle the fill for any enclosed region

Getting fills to work well was the hardest part. We tried a few different ways of representing fills but kept running into the problem of requiring the user to explicitly manipulate negative space to create holes, which was hard to wrap your head around. The tool to toggle regions on and off was the trick that finally made it work.

Vector Editing, Revisited

Figma Design

The collaborative interface design tool.

Figma Design

The collaborative interface design tool.

Evan Wallace

Written by

CTO of Figma

Figma Design

The collaborative interface design tool.