← Back to Writing
  • atomic design
  • front-end
  • design
  • design systems
  • design tokens
  • brad frost
  • component composition
  • react
  • storybook
  • figma

Do you know what is atomic design?

Matheus Mota
Matheus Mota13 min readJuly 9, 2026
Do you know what is atomic design?

Let me start with a question that sounds trivial and isn't.

What is a button?

Is it a blue rectangle with some text? A React component? An HTML <button> tag? An interaction pattern? A reusable element? The honest answer is that it's all of those at once — and the moment you take that seriously, you stop "building screens" and start building systems. That shift in mentality is exactly where Atomic Design comes from.

The problem it was built to solve

Picture a real product: login, sign-up, dashboard, billing, reports, settings, profile, notifications. Each screen was built by a different person, at a different time, under a different deadline. The result:

  • One screen has a blue button, another green, another with a border, another without, another larger, another smaller.
  • The codebase accumulates Button, PrimaryButton, BlueButton, ActionButton, ConfirmButton, LargeButton, MainButton — seven components that all do essentially the same thing.

Now try to change the brand color. You'd have to hunt down hundreds of buttons scattered across the code. It's practically impossible. This duplication breeds inconsistency, painful maintenance, and bugs — and it was precisely this scenario that Brad Frost was staring at in 2013 when he introduced Atomic Design, first on his blog and later in a book you can still read for free.

What Atomic Design actually is

Here's the distinction that matters: Atomic Design is not a framework, not a library, and not a mandatory architecture. It's a methodology for organizing interfaces — a way of thinking.

It answers the question *"how should we think about building interfaces?"* It does not answer *"how do I write React code?"* Keep that separation in mind and everything else falls into place.

The chemistry metaphor

Frost borrowed his structure from nature, where atoms bond into molecules, molecules assemble into organisms, and organisms make up living things. Interfaces are composed the same way — a whole screen is really a pile of small elements stacked into bigger ones — so he defined five levels:

The metaphor, animated: electrons orbit a nucleus — the smallest unit from which everything else is composed.

Each level contains and depends on the previous one. You can't build a molecule without atoms, or assemble a template without organisms. That containment gives the system its most valuable property — predictability: change an atom and you know exactly where the impact will ripple.

Atom Molecule Organism Button indivisible Search… one job: search a recognizable section
An atom (a button), a molecule (a search field), and an organism (a header) — each level composed from the one before.

The one principle that matters most

Before the five levels, internalize this, because most people get it backwards:

Atomic Design is not about creating *many* components. It's about creating components with clear responsibility.

If you remember nothing else from this whole guide, remember that sentence. The levels are a tool for reasoning about responsibility and reuse — not a quota of files to produce.

The five levels

Atoms

Atoms are the smallest possible elements, and they usually carry no business meaning: button, label, input, icon, checkbox, avatar, badge, spinner, text, heading. Plus the truly primitive ones — color, typography, and spacing tokens.

The defining trait is independence. A button doesn't know that "login" exists, or that there's a dashboard. It just receives properties and renders:

<Button variant="primary" size="large" disabled={false} />

The button has no idea where it will be used, and that ignorance is a feature. A good atom is small, reusable, predictable, independent, and easy to test. They're also the most important thing to get right — because everything depends on them.

Two mistakes beginners make with atoms:

  • Naming an atom LoginButton. That's not an atom — it already knows a context. The atom is Button; the context comes from whoever uses it: <Button>Sign in</Button>.
  • Creating BlueButton, GreenButton, RedButton. Color is not a component — it's a variant: <Button variant="success" />.

The most modern expression of an atom is the design token — a variable that stores a single design decision:

/* Design tokens — the most primitive atoms */
--color-primary: #0066ff;
--color-danger: #ff3333;
--font-size-base: 16px;
--spacing-sm: 8px;
--border-radius-md: 4px;

Change --color-primary and every primary button, link, and accent updates at once. That is the whole payoff of well-defined atoms.

Molecules

Now we start combining atoms into something with a job. Take an input + label + error message and you get a form field. Take an icon + input + clear button and you get a search field. Each is a small functional unit.

The governing rule is the single responsibility principle: a molecule does one thing, not ten. A search field knows how to search — it doesn't know about products or users. It's completely context-independent, which is why it works anywhere:

// Internally: Icon + Input + Button
<SearchField />

If a molecule starts trying to do many things at once, it's outgrowing itself and wants to become an organism.

Organisms

Organisms are several molecules (and atoms) working together as a distinct, recognizable section of the interface. A header combines a logo, menu, search, notifications, avatar, and profile. A sidebar gathers icons, links, menus, badges, and an avatar. You can point at one and say *"that's the header."*

How do you tell a molecule from an organism? A practical heuristic: *if you remove one part, does it still make sense?* A search field with its button removed stops being a search field — it's one responsibility, so it's a molecule. A header still reads as a header if you drop the search box — it holds several responsibilities, so it's an organism. Organisms also start to carry business identity: an e-commerce header is not a blog header.

Templates

A template is the structure without real data — the layout that decides where each organism sits. Header, sidebar, table, footer, all in place, but the table is still empty: no users yet, no orders yet. It's the arrangement, not the content.

The classic analogy: a template is the floor plan of a house. There's a kitchen, a bedroom, a bathroom, a living room — but no furniture yet. Templates are where you catch layout problems, because an organism that looks great in isolation can clash the moment it sits next to three others.

Pages

A page is a template filled with real data: user "Maria", 54 orders, a R$ 800 balance. In other words:

Template (Header + Sidebar + Table)  +  real data  =  Page

Pages stress-test the system. Real content surfaces edge cases — an 80-character product name, a vertical image, an empty list, a user with no avatar — and those discoveries feed back down into the templates, organisms, molecules, and atoms below.

Template real content Page
The same layout, twice: a template is the skeleton; a page is that skeleton filled with real content.

The five levels nest inside each other — this is the mental model worth memorizing:

Pages · real instances Templates · layout without content Organisms · recognizable sections Molecules · simple groups Atoms · indivisible
Every level contains the ones below it. Change something at the center and the effect radiates outward.

A complete example: composing a login screen

Watch how each layer adds context on top of the one below it. Nothing new is invented at a higher level — it's all composition.

The atoms don't know they're on a login screen. The LoginForm organism doesn't know about your API. Only the page binds real data, validation, and state to the structure.

The flow is not linear

The biggest misconception is that Atomic Design always runs bottom-up (atom → page). In practice it's bidirectional, and it never really ends.

  • Bottom-up — start from atoms, define tokens, build molecules, assemble organisms, reach the page. Best when creating a design system from scratch.
  • Top-down — start from the page layout, identify organisms, break them into molecules, land on atoms. Best when organizing an existing design.

The real engine is the feedback loop: pages reveal problems that flow back down and improve the levels beneath them.

A design system is never "done." It evolves with the product.

Atomic Design is not a folder structure

This is the most common trap. People create atoms/, molecules/, organisms/ folders, move some files around, and declare *"Atomic Design: done."*

It isn't. Folders are just organization. Atomic Design is primarily a way of thinking about responsibility and composition. You can have perfect folders and a terrible system — or excellent components in a flat structure. The mindset is the substance; the folders are a convenience.

In practice: composition, React, and design systems

Atomic Design pushes you toward composition instead of monoliths. Rather than one giant UserManagementDashboardWithFiltersAndExportButton, you build small pieces — Button, Table, Search, Pagination, Toolbar — and compose them:

// Internally: Toolbar (Search + Button) + Table + Pagination
<UserTable />

This is why it pairs so naturally with React (and Vue, Angular, or any component model): small components, props, composition, children, and hooks are exactly the primitives Atomic Design assumes. It's also technology-agnostic on styling — it works with plain CSS, SCSS, CSS Modules, Tailwind, Styled Components, Emotion, or Vanilla Extract.

A crucial distinction: Atomic Design is not the same thing as a design system. Atomic Design is a *methodology*; a design system is an *ecosystem* — tokens, components, documentation, guidelines, accessibility, and patterns. Atomic Design is one of the best ways to organize that ecosystem.

Most well-known design systems apply these ideas to some degree:

Design system Company Link
Material DesignGooglematerial.io
CarbonIBMcarbondesignsystem.com
PolarisShopifypolaris.shopify.com
Fluent UIMicrosoftfluent2.microsoft.design
LightningSalesforcelightningdesignsystem.com

Design tokens: the bridge to code

Almost every modern design system relies on tokens so that a value lives in exactly one place. Instead of color: blue; you write color: var(--primary);, and the whole visual identity becomes editable from a single source. Tokens come in tiers:

Tools like Style Dictionary, Theo, and Figma Variables sync these tiers between design and code automatically.

Figma: the same structure on both sides

Modern teams apply Atomic Design inside Figma too. Designers build the button, then the field, then the card, then the header, then the page — and developers replicate the exact same structure in code. When both sides share one vocabulary, the friction between design and development drops dramatically.

The nuances that separate a beginner from a professional

The thin line between molecule and organism

There's no mathematical rule — only heuristics.

  • It's a molecule if it has one clear responsibility, is small enough to fit anywhere, carries no business identity, and could be reused across completely different products.
  • It's an organism if it groups multiple responsibilities, reads as a section of the page, carries product identity, and would rarely be reused elsewhere without adaptation.

Take a "comment card" (avatar + name + text + date + actions). Molecule or organism? In a simple system, a molecule; in a complex one with many interactions, an organism. There's no wrong answer — only a documented decision. And in most day-to-day cases the label matters far less than consistency.

Variants and states

Every atom and molecule needs its states and variants defined up front: default, hover, focus, active, disabled, loading, error, success. A button spans primary / secondary / ghost / danger, small / medium / large, and with-icon / icon-only. Define these at the atom level and the entire interface stays consistent in its interactions.

Composition over inheritance

Atomic Design favors composition (a component made of others) over inheritance (a component that extends another).

// Avoid — inheritance
class PrimaryButton extends Button {}

// Prefer — composition
const PrimaryButton = ({ children }) => (
  <Button variant="primary" size="md">
    {children}
  </Button>
);

Composition is more flexible, more testable, and more aligned with the methodology.

The "fat organism" problem

A frequent mistake is letting organisms grow until they become "pages inside pages." Warning signs: more than ~200 lines of code, more than ~10 props, complex business logic baked in, or an organism impossible to reuse anywhere else. The fix is to refactor — extract molecules and separate responsibilities.

Accessibility and responsiveness become systemic

Define ARIA attributes and focus/error states once on the atoms and they propagate everywhere — the golden rule being if the atom isn't accessible, nothing above it will be. Responsiveness works in layers too: atoms set base sizes, molecules adapt their internal layout, organisms reorganize (a horizontal nav becomes a hamburger), templates define the grid and breakpoints, and pages validate the experience per device.

When to use it — and when not to

Not every project needs the full apparatus. For a simple landing page, an institutional site, an event page, or a single screen, the five-level structure is usually overkill — more ceremony than benefit.

It earns its keep on large, long-lived products: ERPs, marketplaces, banking, healthcare, e-commerce, dashboards, SaaS platforms, design systems, and anything built by many developers at once. The bigger the surface and the team, the more the consistency and reuse pay off.

Advantages and trade-offs

What you gain:

  • High reuse and far less duplication
  • Consistent visual language across the product
  • Easier testing (components tested in isolation)
  • Scalability and incremental evolution of the system
  • Better communication between designers and developers
  • Easier maintenance — fix an atom, fix it everywhere

What it costs:

  • It's slower at the start — it demands planning, documentation, and discipline
  • There's a real learning curve and an onboarding cost for new members
  • It can spark endless "is this a molecule or an organism?" debates — which usually don't matter as long as the system stays consistent

Fair criticisms

A mature professional knows the limits of their tools. Common, legitimate critiques:

  • The chemistry analogy doesn't map perfectly onto complex interfaces.
  • In very large projects, some components don't fit cleanly into a single level.
  • Teams sometimes fall into over-componentization — components so tiny they add complexity without real gain.
  • Modern frameworks like React already encourage composition, so rigidly following all five layers doesn't always add value.
  • In some contexts a feature-first (business-domain) organization beats organizing purely by component type.

None of this invalidates the methodology — it just means you apply it with judgment.

Best practices

  • Give every component a clear responsibility.
  • Prefer composition over inheritance.
  • Keep generic components generic — don't let them learn business rules they shouldn't know.
  • Document components (Storybook is the standard tool).
  • Keep component APIs simple and consistent.
  • Define naming conventions and write them down.
  • Use design tokens for color, typography, and spacing.
  • Periodically review duplicated or rarely-reused components and consolidate them.

Case study: a banking dashboard

Suppose you're asked to build a dashboard showing account balance, a transaction list, a spending chart, PIX shortcuts, the user profile, and notifications. A reasonable decomposition:

Notice that TransactionRow is a molecule (one responsibility — render a transaction), while TransactionList is an organism (a recognizable section with its own logic). That single distinction is the kind of decision you'll defend over and over in real work.

Your turn

The fastest way to make this stick is to reverse-engineer a product you already use. Pick one — Netflix, Spotify, Nubank, GitHub, Amazon, WhatsApp, iFood — and work through it:

  1. Introduction — briefly present the system and its context.
  2. Atoms — list and justify the basic elements of the interface.
  3. Molecules — show how atoms combine into functional units.
  4. Organisms — identify the recognizable sections and explain why.
  5. Templates — describe the layout structure and what stays fixed.
  6. Pages — show how real data fills the template and changes the interface.
  7. Critical analysis — does the system seem to follow Atomic Design? Note its strengths, inconsistencies, and possible improvements.
  8. Evolution proposal — pick one component and design a more reusable version, justifying your decisions.

The goal isn't just to *recognize* the five levels. It's to prove you can decompose an interface into components, understand their responsibilities, and argue about the architectural decisions involved — exactly the reasoning expected on teams that build design systems and large-scale front-ends.

"A good design system isn't about creating components. It's about creating a shared language that lets teams build better products, faster, and with more consistency." — Brad Frost