Part
5
  |  
Tools & Systems
  |  
Chapter
17

Figma for People Who'd Rather Be in VS Code

The 20% of Figma you'll actually use
Reading Time
13
mins
BACK TO DESIGN FOR DEVELOPERS

There is a particular kind of developer who treats Figma the way a cat treats a bath. You know the feeling. The whole environment is wrong: floating panels, no keyboard-driven command palette that does what you expect, properties that live in a sidebar instead of a config file, and a canvas that invites you to drag things around with a mouse like it's 2009. You close the tab and do what you actually know how to do, which is open the editor, start a component, and shape the design by changing CSS and refreshing the browser until it stops looking wrong.

Plenty of capable developers live here permanently, and they tell themselves it's efficient because they're "designing in the medium." What they're actually doing is using the slowest possible tool to answer the cheapest possible questions.

The trap: designing by recompiling

Here is the trap, and it has two doors. Most developers walk through one or the other, and both lead to the same bad room.

The first door is designing in the browser. You skip the design step entirely and treat the running app as your canvas. Want to see if the card looks better with more padding? Change the value, save, wait for the dev server, look. Want to compare two button styles? Comment one out, save, look, uncomment, save, look. Want to see the empty state next to the loaded state? You can't, really, because the app is only ever in one state at a time. So you fake the data, save, look, then fake different data, save, look again. Every question costs a round trip through a compiler.

The second door is the opposite refusal: avoiding Figma because it's "not my job." Design is what designers do. You wait for a mockup, or you ship whatever the framework's defaults give you, and you treat the visual layer as somebody else's department. This feels humble. It is actually just a way of never building the muscle, which guarantees that when there's no designer in the room — and on most small teams, most of the time, there isn't — you have no faster move than door number one.

Both doors share a hidden assumption: that to design in Figma you'd have to learn Figma, the whole sprawling thing, the plugins and the prototyping and the variants and the dev mode and the FigJam and the team libraries. That assumption is wrong, and it's the most expensive wrong belief in this chapter. You do not need to learn Figma. You need to learn a tiny, load-bearing sliver of it — enough to think in screens and move boxes around faster than your compiler can blink.

Designing by recompiling is using the slowest possible tool to answer the cheapest possible questions.

Why iterate in Figma: moving boxes beats moving code

The reason to design in Figma has nothing to do with art and everything to do with the cost of being wrong.

When you design by editing code, every iteration is expensive. You're not just changing a number; you're changing a number inside a system that has to parse, compile, hot-reload, re-render, and re-fetch before it shows you anything. And the thing it shows you is one arrangement, in one state, at one breakpoint. To compare alternatives you have to destroy the previous one. There's no holding two ideas side by side. The medium punishes exploration.

Figma inverts that. A frame is just a box. Padding is a number you scrub with your mouse and watch update in real time, no save, no reload. You can duplicate a screen ten times and try ten variations in the time it takes your dev server to restart once. You can lay the empty state, the loading state, the error state, and the happy path next to each other and actually look at them as a set, which is the only way to notice that your error state is an afterthought and your empty state is hostile to a brand-new user.

This is the whole argument, and it's worth saying plainly: the value of Figma is not the output, it's the iteration. You are not making Figma your source of truth. The code is still the source of truth — we covered that in spirit when we talked about Tokens as Constants, and it stays true here. Figma is a thinking space. It's a place to be wrong quickly and cheaply, before you commit any of that wrongness to a file someone has to maintain.

Key takeaway

Code is where you commit decisions. Figma is where you make them. Confusing the two is what makes design feel slow.

I think of it as cheap wrongness versus expensive wrongness. In code, every wrong idea costs you a compile and leaves a trace in git. On a canvas, a wrong idea costs you a drag and a delete. When the cost of being wrong drops, you explore more, and exploring more is the entire reason designs get good. Nobody arrives at the right layout on the first try. They arrive at it on the fifteenth, and the question is only whether those fifteen tries took an afternoon or a fortnight.

Framework · The Figma Floor · FF

You do not need to master Figma. Learn the small floor of features that lets you think in screens and iterate faster than you can in code — frames, auto-layout, components, and styles or variables — and ignore everything else. The floor is the point where the tool stops fighting you. You don't need the ceiling.

The floor: five things and nothing more

Here is the entire floor. Five concepts. If you learn these and refuse to learn anything else until you've shipped something, you'll be ahead of most developers and a fair number of junior designers.

Frames. A frame is a container. That's it. It's a div with a defined size. A screen is a frame. A card is a frame. A button is a frame. Frames nest inside frames, exactly like the element tree you already think in. The only mental shift is that a frame has an explicit width and height on the canvas, where in code your boxes usually size themselves from content and constraints. Make your top-level frame the size of the surface you're designing for — a phone, a sidebar, a full page — and build inside it.

Auto-layout. This is the one that converts developers, because auto-layout is just flexbox with a friendlier face. You add auto-layout to a frame and suddenly it has a direction (horizontal or vertical), a gap between children, and padding on the inside. The whole panel is the box model you already write every day:

/* An auto-layout frame, in the language you know */
.card {
  display: flex;          /* "auto-layout" */
  flex-direction: column; /* the vertical/horizontal toggle */
  gap: 16px;              /* "spacing between items" */
  padding: 24px;          /* the four padding fields */
  align-items: stretch;   /* the alignment grid */
}

Direction is flex-direction. Gap is gap. Padding is padding. The alignment controls are justify-content and align-items wearing a costume. Once you see that mapping, the panic drains out of the right sidebar, because you already know this model cold. The payoff is that an auto-layout frame behaves: add a child and everything reflows; delete one and the gaps close; type a longer label and the button grows to fit. You're not nudging pixels anymore. You're declaring intent, the same way you do in CSS, except you see the result the instant you change it.

Components and instances. A component is a reusable element you define once. An instance is a copy that stays linked to the original, so when you change the source — the "main component" — every instance updates. If you've internalized Decide Once, Reuse Forever, you already have the mental model; this is that idea made visual. Define your button once. Drop forty instances across twelve screens. Decide the button's corners should be a little softer, change the main component, and all forty update at once. This is the difference between a mockup you can maintain and a pile of disconnected rectangles that drift out of sync the moment the design changes.

Styles and variables. These are your design tokens, living in the design tool. A color style is a named color you apply instead of picking a raw hex every time. A text style bundles a font, size, weight, and line height under one name. Variables go further and let you store values — colors, numbers, strings — that you can reference and even swap in bulk, which is how light and dark modes get built without duplicating every screen. The point is the same point we keep coming back to: name your values, reference the names, change them in one place. A canvas full of named styles is a canvas you can re-theme in minutes. A canvas full of hardcoded hexes is a liability, exactly like a stylesheet full of hardcoded hexes.

Constraints. This is the smallest of the five and the one people skip, then regret. Constraints tell a child how to behave when its parent resizes — pin to the left, stretch to fill, stay centered, hug the bottom. It's the resize logic you'd otherwise express with widths and position rules. You won't need constraints for everything, because auto-layout handles most reflow for you, but the moment you want to see how a layout holds up at a wider size, constraints are what let you grab a frame edge, drag it, and watch the design respond instead of shattering.

That's the floor. Five things. Notice what's not on the list: prototyping, interactive components, plugins, dev mode handoff, branching, team libraries, the whole prototyping-animation rabbit hole. All of it is real and some of it is genuinely useful later. None of it is required to get the value, and reaching for it early is how you talk yourself back out of the tool.

Resist the plugin spiral

The fastest way to never learn Figma is to spend your first session installing plugins. Plugins are a productivity tax disguised as productivity. Learn the five native concepts first. You will know you're ready for a plugin when you can name the exact repetitive task it removes — and not one minute before.

Thinking in screens

Once the floor is under you, the real payoff arrives, and it's not a feature. It's a habit: laying out states and flows side by side.

In code you experience your interface one moment at a time. The app is logged out, or it's logged in. The list is empty, or it's full. The form is pristine, or it's mid-error. You can only ever look at one of these, because the running app is a single point in state space. This is why so many apps have a polished happy path and a neglected everything-else: the developer simply never saw the other states next to the good one.

On a canvas you can see them all at once. Duplicate the screen. Make one version empty, one loading, one full, one in its error state, one with the longest plausible content you can imagine, one with the shortest. Put them in a row. Now step back and look. The defects announce themselves. The empty state that just says "No data" reveals itself as a wasted opportunity to onboard. The error state reveals itself as a red banner nobody designed. The long-content version reveals the truncation bug you would otherwise have shipped and discovered from a user's screenshot three weeks later.

Most apps have a polished happy path and a neglected everything-else because the developer never saw the other states next to the good one.

Flows work the same way. Lay the steps of a sign-up left to right and you can read the whole journey as a strip of film. You'll catch the screen that asks for too much at once, the step that should have been two, the back button that has nowhere good to go. None of this requires interactivity. You're not building a clickable prototype. You're just arranging frames so your eye can do the thing eyes are good at, which is comparing things that sit next to each other.

This is the part that pays for the whole exercise. Not the pixels — the seeing. Designing in screens forces you to confront the states you'd otherwise discover in production.

Back to code: where Figma stops

Figma is a thinking space, not a destination, so the last skill on the floor is knowing how to leave.

When a layout is right on the canvas, you go read the values off it. Select an element and the sidebar tells you everything: the exact padding, the gap, the font size, the color, the corner radius, the dimensions. You don't eyeball these and you don't guess. You read the real numbers and you carry them into your code — but you carry them in as tokens, not as magic numbers sprinkled through your styles. This is the direct bridge to Tokens as Constants. The hex you read off the canvas becomes a named color token. The spacing value becomes a named spacing token. The canvas told you what the value should be; the token is where it lives once you commit to it.

Components cross the same bridge. A component you built and refined in Figma maps to a component you build in code, and the cleaner you were about its boundaries on the canvas — what's inside it, what gets passed in, what stays fixed — the cleaner the translation. This is exactly the discipline from The Component Contract: a component is a promise about its inputs and its edges. Figma is where you can sketch that contract visually and notice, before you write a line, that your card secretly needs a variant for the no-image case.

But be honest about where the tool stops, because pretending it doesn't is its own trap.

✕ What Figma is good at
  • Trying ten layouts in a minute
  • Seeing every state side by side
  • Naming colors, type, and spacing
  • Sketching a component's shape
  • Being wrong cheaply, before you commit
✓ What only code can do
  • Real data and real edge cases
  • Actual interaction and motion
  • Accessibility and focus behavior
  • Performance and load reality
  • The single source of truth

Figma will happily show you a screen full of perfectly aligned fake data. It will not tell you what happens when the user's name is forty characters, when the API is slow, when the screen reader hits your custom control, or when the list has ten thousand rows. Those answers live in code and only in code. The mistake is to over-trust the mockup — to treat a pretty canvas as proof the thing works. It isn't. It's proof the thing could look like that. Earning the "works" is still your job, back in the editor, with real data and real constraints.

So the loop is: think in Figma, decide in Figma, then commit in code. Read the values, turn them into tokens, build the components against their contracts, and let the running app be the final judge it was always going to be. The canvas got you to the right idea faster than the compiler ever could. Now the compiler tells you whether the idea survives contact with reality.

Key takeaway

Figma answers "what should this look like" cheaply. Code answers "does this actually work" truthfully. Use each for the question it's good at.

What to do Monday morning

You can be useful in Figma by lunch. Not fluent — useful. Here is the smallest path that gets you there, and none of it requires you to like the tool.

Learn auto-layout in twenty minutes

Open a blank file, draw a frame, add three small boxes inside it, and turn on auto-layout. Spend twenty minutes — set a timer — changing only the direction, the gap, the padding, and the alignment. Say the CSS property out loud each time: "this is flex-direction, this is gap, this is padding." When the mapping feels automatic, you've crossed the threshold that scares everyone off. Stop there.

Rebuild one real screen you've already shipped

Pick a screen that already exists in your app so you're not also inventing the design. Rebuild it in Figma using nested auto-layout frames and nothing else. The goal isn't a pixel-perfect copy; it's the muscle of structuring a real interface as boxes inside boxes. You'll feel how much faster the structure comes together when a compiler isn't between you and the result.

Lay that screen out in all its states

Duplicate the screen four times and make one empty, one loading, one in an error state, and one stuffed with the longest content you can plausibly imagine. Put them in a row and look. Write down every defect the comparison reveals — the states you'd never designed because you'd never seen them together. That list is the highest-value thing you'll produce all week.

Make one component

Take the most repeated element on your screen — a button, a card, a list row — and turn it into a component. Drop a handful of instances. Change the main component once and watch them all update. This is Decide Once, Reuse Forever made visible, and once you've felt it you won't want to design any other way.

Extract its values into tokens

Select your component, read the real numbers off the sidebar — the padding, the colors, the radius, the type — and define them as styles or variables in Figma and as named tokens in your code. Don't paste raw hexes into either place. When the same name points to the same value on the canvas and in the codebase, you've closed the loop, and the bridge between the two will stay standing every time the design changes.

The point was never to become a designer. The point was to stop using your compiler as a sketchbook.

Learn the floor, ignore the ceiling, and let the canvas be the cheap place where you're allowed to be wrong.