The most consequential thing about browser-based design tools is not any feature. It is that the design, the comments on it, the prototype, the specification and the shared component library are all the same artefact at the same URL. Before that, a design was a file that someone exported, and every export was stale the moment it was sent. Removing that one source of friction changed how product teams work more than any individual capability did.
This guide covers using Figma the way effective product teams use it: how components and variables actually work, what makes a design system maintainable rather than aspirational, how prototyping earns its time, and how to hand off work that engineers can build from without a translation meeting.
What you will learn- The structural concepts — frames, auto layout, constraints — and why they matter
- Components, variants and properties, and how to avoid a library nobody uses
- Variables and modes: theming, density and localisation without duplication
- Prototyping at the fidelity a given question deserves
- Hand-off that answers the questions engineers actually ask
- File organisation, permissions and collaboration at team scale
- Why the browser changed the workflow
- The structural concepts
- Auto layout
- Components
- Variants and properties
- Variables and modes
- Styles and tokens
- Building a design system that survives
- Prototyping
- Hand-off
- Collaboration and feedback
- File organisation
- Accessibility in the design phase
- Working with engineering
- Twelve mistakes
- A worked example: one feature, end to end
- Frequently asked questions
1. Why the browser changed the workflow
Four consequences follow from design living at a URL rather than in a file, and together they account for most of the workflow change.
Everyone sees the current version. There is no exported image to go stale, no question about whether a screenshot is current, and no version number in a filename. This single property eliminates an entire category of miscommunication.
Comments attach to the work. Feedback lives on the artefact rather than in an email thread, which means it survives, has context, and can be resolved.
Multiple people can be present. Not merely editing simultaneously, but reviewing together while remote — which turns out to matter more than co-editing for most teams.
Non-designers participate. A product manager, an engineer or a support lead can open a link and see the actual design at any point, rather than at scheduled review moments. Most of the value of these tools accrues to the people who do not use them to design.
2. The structural concepts
Three ideas underpin everything, and getting them right early prevents most later pain.
Frames are containers. They clip their contents, can have layout applied, and are what a prototype navigates between. Almost everything should live inside a frame rather than floating on the canvas, because frames are what give structure to a file.
Constraints define how a layer behaves when its parent resizes — pinned to an edge, centred, or scaling. This is what makes a design responsive rather than a fixed picture, and it is the concept most often skipped by people coming from static tools.
Groups versus frames is a distinction worth internalising: a group is a convenience for moving things together and has no layout behaviour; a frame is a real container. Using groups where frames belong produces designs that fall apart the moment content changes length.
3. Auto layout
Auto layout applies rules — direction, spacing, padding, alignment — so children arrange themselves and the container resizes to fit. It is the feature that most closely mirrors how interfaces are actually built, and using it well is the difference between a design that survives real content and one that only works with the placeholder text.
Why it matters practically:
- Content changes do not break the layout. A longer product name pushes things apart correctly rather than overlapping.
- Spacing becomes systematic. Values come from a scale rather than from dragging things until they look right.
- It maps to how engineers build. The concepts correspond closely to modern layout systems, which makes hand-off conversations shorter.
- Components become genuinely reusable, because they adapt to their content rather than assuming a fixed width.
The habit that pays off: nest auto layout deliberately rather than incidentally. A card containing a header row, a content area and an action row — each its own auto layout frame — behaves predictably at any size. A card built as absolutely positioned elements looks identical in the mockup and breaks in every real scenario.
4. Components
A component is a reusable element with one definition and many instances. Change the definition and every instance updates.
The rules that determine whether a component library is used or abandoned:
Make components from things you have already repeated. Extracting from real usage produces components that fit; designing them in advance produces components that solve imagined problems and get overridden constantly.
Name them by purpose, not appearance. A component called "primary action" survives a rebrand; one called "blue button" is wrong the moment the brand colour changes.
Design for the content you will actually receive. Test every component with the longest realistic label, an empty state and a missing image. Components built around ideal content are the most common source of layouts that break in production.
Keep the nesting shallow. Components inside components inside components become impossible to override sensibly, and instance swapping several levels down is where designers give up and detach.
The signal that a library is failing is detached instances. When designers routinely detach a component to modify it, the component does not fit the real need — that is information about the library, not carelessness by the designer. Track it and treat it as feedback.
5. Variants and properties
Variants group related states of a component — a button's sizes, its emphasis levels, its disabled and loading states — so an instance switches between them through a control rather than by swapping components.
Properties extend this: text properties for labels, boolean properties for optional elements such as an icon, and instance swap properties for exchangeable sub-components.
The design decision that matters is which dimensions deserve to be variants. Every additional dimension multiplies the combinations: three sizes, four emphasis levels and two states produce twenty-four variants to maintain. The useful test is whether a dimension genuinely changes the component or merely changes its content — content belongs in properties, structural difference belongs in variants.
Name variant dimensions consistently across the library. When a size property is called one thing on buttons and another on inputs, the library becomes harder to use than not having one, and consistency here is cheap to establish and expensive to retrofit.
6. Variables and modes
Variables are named values — colours, numbers, strings, booleans — referenced rather than hardcoded. Modes let the same variable resolve differently in different contexts.
This is what makes several previously painful things straightforward:
| Use | How modes apply |
|---|---|
| Theming | Light and dark modes on the same colour variables; a frame switches theme without duplication |
| Density | Comfortable and compact spacing modes for the same layout |
| Localisation | String variables per language, revealing where longer translations break the layout |
| Brand variation | Multiple brands from one set of designs |
The structural practice that makes this work is a two-layer variable scheme. Primitive variables hold raw values — a specific grey, a specific spacing step. Semantic variables reference primitives by role: surface background, primary text, border subtle. Designs reference semantic variables only.
The payoff is that changing a theme means repointing semantic variables rather than editing designs, and the semantic names correspond to what engineers implement — which makes the design tokens and the code tokens the same vocabulary rather than a translation exercise.
7. Styles and tokens
Styles predate variables and still apply where a bundle of properties is reused: text styles combining family, size, weight and line height; effect styles for shadows; grid styles for layout structure.
The practical division: variables for single values that may change by mode, styles for compositions of properties. A text style referencing colour and size variables gets the benefit of both.
The naming convention matters more than the specific choice, because these names become shared vocabulary. A hierarchy of category, role and variant — text primary, text secondary, surface raised, border subtle — is readable, sortable and maps directly onto what a codebase calls the same things. Names describing appearance rather than role guarantee a rename at the first design change.
8. Building a design system that survives
Most design systems fail for organisational reasons rather than technical ones. Four things distinguish those that last.
Extract from real usage. A system built before anyone uses it solves imagined problems. Start from the components already repeated across existing designs.
Name an owner. Without one, the library accumulates variants nobody removes, and quality drifts until people stop trusting it.
Publish deliberately with release notes. Consumers of a shared library need to know what changed and whether they must act. Silent breaking changes destroy trust faster than any missing component.
Make it easier to follow than to ignore. This is the real test. If finding and using the right component takes longer than drawing something similar, the system will be bypassed under deadline pressure, regardless of policy.
Start small. Ten well-made components used everywhere are worth considerably more than sixty nobody adopts, and the discipline of keeping it small is what keeps it navigable.
9. Prototyping
Prototypes exist to answer questions, and the right fidelity is determined by which question you are asking. Building more than the question requires is the most common waste in design work.
| Question | Fidelity needed |
|---|---|
| Does the flow make sense? | Linked static frames — the cheapest useful prototype |
| Is the layout right? | Static frames with realistic content and no interaction |
| Does this interaction feel right? | Smart animation between states, with real timing |
| Can users complete the task? | Enough branching that plausible wrong turns are handled |
| How does it behave with real data? | Usually not a prototype — build it |
The techniques worth knowing: smart animation, which interpolates between matching layer names across frames and produces convincing motion from two static states; and interactive components, which build hover, press and toggle behaviour into the component itself so every instance behaves correctly without wiring each one.
The discipline that matters is knowing when to stop. A prototype elaborate enough to be mistaken for the product invites feedback on details that are not yet decided, and takes longer to build than the answer justifies.
10. Hand-off
Hand-off fails not because engineers cannot read a design but because the design does not answer the questions they need answered. Those questions are predictable:
- What happens when there is no data? Empty states are the most commonly missing screen and the first thing a new user sees.
- What happens while loading? Including how long before something is shown.
- What happens on error? Which errors, what the message says, and how to recover.
- What is the longest realistic content? A name of sixty characters, a list of two hundred items.
- What is interactive, and what happens on hover, focus and press?
- What are the breakpoints, and what changes at each?
- Which component is this, and does it already exist in code?
- Which token is this value, rather than which hex code?
A design answering those eight questions can be built without a meeting. One that does not will generate the meeting regardless of how polished it looks.
The mechanical part — measurements, colours, spacing — is generated automatically, and it is the least valuable part of hand-off. What engineers need is the semantic name, not the value: knowing a colour is the primary text token is actionable, while knowing it is a particular grey is a number to hardcode.
Two practices that help disproportionately: annotate the intent, especially where behaviour is not visible in a static frame; and mark what is not yet decided, so engineers know which gaps to raise rather than inventing an answer.
11. Collaboration and feedback
Comments attached to the work are a genuine improvement over feedback in messages, and they need light discipline to stay useful.
Be specific about what you want. "This feels off" generates a conversation; "the spacing between these two groups reads as though they are unrelated" generates a change.
Resolve comments when addressed, so the open ones represent actual outstanding work rather than history.
Distinguish review from exploration. Feedback on an early exploration should address direction; feedback on a final design should address detail. Mixing them wastes everyone's time, which is why marking a file's state explicitly is worth the effort.
Use branching for significant changes to a shared file, so work in progress does not disturb people referencing the main version, and the change is reviewed before it lands.
12. File organisation
Files decay quickly without structure, and the recovery cost is high.
The arrangement that works: separate the design system library from product files, and within product files use pages to separate work in progress from designs that are ready to build and from an archive. Cover pages describing what a file contains and its status remove a category of "which of these is current" questions entirely.
Name pages and frames for what they are — the screen name and its state — because those names appear in prototype navigation, in comments and in hand-off. Frames called "Frame 47" make every subsequent conversation harder.
Archive rather than delete. Old explorations contain the reasoning behind rejected directions, and that reasoning is asked about surprisingly often.
Set permissions deliberately. Most people need to view and comment, not edit. Broad edit access is how shared libraries acquire changes nobody intended.
13. Accessibility in the design phase
Several accessibility properties are decided in design and expensive to fix afterwards.
- Contrast. Check text against its background and interface elements against theirs. This is measurable, takes seconds, and low-contrast text is one of the most common failures.
- Colour is never the only signal. An error indicated only by a red border is invisible to a meaningful share of users. Pair it with an icon and text.
- Touch target size. Interactive elements need enough physical size to hit reliably.
- Focus states. Design them explicitly. If they are not in the design, they are frequently removed in implementation for aesthetic reasons, which leaves keyboard users unable to see where they are.
- Text size and scaling. Design at realistic sizes, and check what happens when a user increases their system text size.
- Reading order. The visual order should match the logical order, because assistive technology follows the latter.
Building these checks into the design review is far cheaper than discovering them in an audit, and in many jurisdictions they are a legal requirement rather than a quality preference.
14. Working with engineering
The practices that reduce friction most:
Involve engineers early, during exploration rather than at hand-off. An engineer looking at a direction for ten minutes will identify what is expensive, what is nearly free, and what conflicts with something that already exists. That conversation is worth more than any specification.
Share vocabulary. When the design system and the code use the same component and token names, conversations become precise. When they diverge, every discussion includes a translation step and eventually a mistake.
Design at real breakpoints the implementation actually uses, rather than at arbitrary widths.
Accept implementation constraints as information. When something is expensive to build, the useful response is understanding why and finding an equivalent that is cheaper — not treating the constraint as resistance.
Review the built result against the design, and treat differences as a conversation rather than a defect list. Some will be implementation shortcuts worth fixing; others will be reasonable adaptations to constraints the design did not know about.
15. Twelve mistakes
- Groups where frames belong. Layouts that fall apart with real content.
- No auto layout. Every content change requires manual repositioning.
- Components named by appearance. Wrong at the first rebrand.
- Designing only with ideal content. Breaks on the first sixty-character name.
- Deep component nesting. Impossible to override, so designers detach.
- Ignoring detachment rates. The clearest signal a library does not fit.
- Hardcoded values instead of variables. Theming becomes a rebuild.
- No empty, loading or error states. The most common hand-off gap.
- Prototypes more elaborate than the question. Feedback on undecided details.
- Unnamed frames. Every subsequent conversation is harder.
- Broad edit permissions on shared libraries. Changes nobody intended.
- Engineers involved only at hand-off. Constraints discovered when they are most expensive.
16. A worked example: one feature, end to end
Consider adding a saved-searches feature to an existing product: users save a filter combination, name it, and return to it later.
Exploration is deliberately rough and shared early. Three low-fidelity directions, linked as static frames, shown to two engineers and a support lead within the first day. The engineers immediately identify that one direction requires a change to how filters are represented in the URL, which is a week of work the design would otherwise have committed to unknowingly. That conversation costs ten minutes and saves the week.
The chosen direction is built with auto layout throughout, and tested with the content that will actually occur: a saved search named with sixty characters, a list containing one item, a list containing forty, and a user with none at all. The forty-item case reveals that the panel needs its own scroll region; the empty case becomes a designed screen rather than a blank space, explaining what saved searches are and offering the action that creates one.
Existing components are reused rather than redrawn. The list rows, the menu and the input all come from the library. One genuinely new component is needed — a row with an inline rename affordance — and it is added to the library with variants for its default, hover, editing and error states rather than being drawn once inside this file.
Variables carry every value. Colours reference semantic tokens, spacing references the scale. Switching the frame to dark mode requires no additional work and immediately reveals that one border becomes invisible against the dark surface — caught in five seconds because the mode switch is free.
The prototype answers one question and stops. Can a user create, rename and delete a saved search without guidance? Five people attempt it. Three try to rename by double-clicking the name, which the design had not supported; that behaviour is added. The prototype is not extended to cover anything else, because no other question was open.
Hand-off answers the eight questions. Empty, loading and error states are designed. The longest realistic content is shown. Hover, focus and press states exist for every interactive element. Breakpoints are marked. Each element is annotated with its component name and its token names rather than its measurements. One open decision — whether saved searches are shared across a team — is explicitly marked as undecided, so engineering raises it rather than assuming.
Review after implementation finds two differences. One is a spacing shortcut worth correcting; the other is a scroll behaviour the engineer changed because the designed version performed badly with many items. The second is accepted and the design updated to match, so the file stays true to what exists — which is what keeps designers and engineers referring to the same reality six months later.
17. Frequently asked questions
When should we build a design system?
When inconsistency starts costing real time — the same component built three ways, or a colour change requiring edits in forty places. Extract it from what you already repeat rather than designing one in advance. Below that threshold, a shared component file and a documented spacing and type scale deliver most of the benefit for a fraction of the effort.
How detailed should hand-off be?
Detailed enough to answer the eight questions engineers actually ask — empty, loading, error, longest content, interactive states, breakpoints, component names and token names. Beyond that, additional annotation has diminishing value. Measurements matter far less than semantic names, because a token name is actionable and a hex code is something to hardcode.
Should designers write code?
Not necessarily, but understanding how the interface is built makes designs more feasible and hand-off conversations shorter. Knowing what layout systems can do naturally, what is expensive to animate, and how components compose in code prevents designs that are technically possible and disproportionately costly. The reverse is equally valuable: engineers who understand the design system make better decisions when the design is ambiguous.
How do we keep design and code in sync?
Shared vocabulary is most of it: the same component and token names in both. Some teams generate code tokens from design variables, which removes a translation step entirely. What always helps is reviewing the built result against the design and updating whichever is wrong — a design file that diverges from the shipped product stops being a reference and starts being fiction.
How many variants should a component have?
As few as express genuine structural differences. Content differences belong in properties, not variants. Every dimension multiplies the combinations to maintain, and a component with forty variants is one nobody can navigate. If a variant exists to handle content length, auto layout should be handling that instead.
Is prototyping worth the time?
When it answers a question you actually have. A linked flow of static frames costs minutes and reliably reveals navigation problems. A high-fidelity interactive prototype costs days and is worth it for a genuinely novel interaction. The waste is building fidelity nobody asked for, which also invites feedback on details that are not yet decided.
How do we manage files across many teams?
Separate libraries from product files, one file per feature area rather than one enormous file, explicit status on every file, and permissions that default to view and comment. Publish library changes deliberately with notes. The failure mode is a shared file everyone can edit, which accumulates changes nobody intended and eventually nobody trusts.
What is the highest-value habit to adopt?
Designing the empty, loading and error states alongside the populated one. Those are the states real users spend meaningful time in, they are the most common hand-off gap, and designing them costs a fraction of what discovering them during implementation does. Second is testing every component with the longest realistic content.
Glossary
| Term | What it means |
|---|---|
| Frame | A real container that clips content and can carry layout. Almost everything belongs inside one. |
| Group | A convenience for moving things together, with no layout behaviour. Frequently used where a frame belongs. |
| Auto layout | Rules for direction, spacing and padding so children arrange themselves and the container resizes. |
| Constraint | How a layer behaves when its parent resizes. What makes a design responsive rather than a picture. |
| Component | One definition, many instances. Change the definition and every instance updates. |
| Variant | A grouped state of a component — size, emphasis, disabled. For structural difference, not content difference. |
| Property | A per-instance value: a label, an optional icon, a swappable sub-component. Where content differences belong. |
| Primitive variable | A raw value — a specific grey, a specific spacing step. Never referenced directly by designs. |
| Semantic variable | A value referenced by role — surface background, primary text. What designs should use. |
| Mode | A context in which variables resolve differently: light and dark, comfortable and compact, per language. |
| Smart animation | Interpolation between matching layer names across frames, producing motion from two static states. |
| Detachment | Breaking an instance's link to its component. A high rate is feedback that the library does not fit. |
Two entries carry disproportionate weight. The primitive and semantic split is what makes theming a repoint rather than a rebuild, and it gives designers and engineers the same vocabulary for the same values. And detachment is the most honest metric a design system has — when people routinely break the link to modify a component, the component is wrong, and treating that as carelessness rather than as information is how libraries quietly stop being used.
Key takeaways
- Auto layout is the foundation. It makes designs survive real content and maps to how interfaces are built.
- Extract components from real repetition. Designing a library in advance solves imagined problems.
- Two variable layers — primitive and semantic. Designs reference roles, which makes theming a repoint rather than a rebuild.
- Detachment rate is library feedback. Designers detaching components are telling you something.
- Hand-off answers eight questions. Empty, loading, error, longest content, states, breakpoints, components, tokens.
- Involve engineers during exploration. Ten minutes then is worth more than any specification later.
The tool is not the point. What matters is that design decisions become visible to everyone who needs them, early enough to be cheap to change — and that the artefact people are looking at is the same one that gets built, rather than a picture of something that was true two weeks ago.
Enjoyed this article?
Get more engineering insights from ELIVTECH — or talk to us about your project.
Get in touch