Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Brad Frost's atomic design methodology (atoms → molecules → organisms → templates → pages) for architecting scalable, multi-platform design systems — use when structuring a component library, mapping tokens to components, organizing Figma/code component trees, or deciding the right level of abstraction for a UI element.
| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-05 | ✗→✓ | ▲ Improved | 184% | 0% |
| case-11 | ✗→✓ | ▲ Improved | 183% | 0% |
| case-16 | ✗→✓ | ▲ Improved | 204% | 0% |
| case-18 | ✗→✓ | ▲ Improved | 200% | 0% |
| case-01 | ✓→✓ | = Same ✓ | 218% | 0% |
Atomic design is a mental model for decomposing interfaces into reusable, composable parts and reassembling them into screens. It is not a folder structure you copy blindly; it is a vocabulary for talking about granularity and composition so designers and engineers agree on what a "component" is and where it lives. Use it to make a design system legible, not to satisfy a taxonomy.
The core insight: interfaces are not pages, they are systems of components. Build the system, and pages fall out of it. The five stages give you a shared language for the spectrum from raw style primitive to fully-composed screen.
| Stage | Definition | Composable? | UI examples (cross-platform) | |-------|-----------|-------------|------------------------------| | Atoms | Smallest functional UI units; can't be broken down without losing meaning. | Building blocks | Button, input, label, icon, checkbox, avatar, badge, spinner, switch, a single Text style | | Molecules | A small group of atoms bonded into a unit with one job. | Atoms → 1 unit | Search field (input + button + label), form field (label + input + error), list row (avatar + title + chevron), tag chip with remove icon | | Organisms | Relatively complex, self-contained sections made of molecules/atoms. | Molecules → section | Nav bar, card, comment thread, product tile, data table, bottom tab bar, settings group | | Templates | Page-level layout: organisms arranged into a structure, placeholder content only. | Layout skeleton | Article layout, dashboard grid, checkout scaffold, master-detail split | | Pages | A template filled with real, representative content — the highest-fidelity artifact. | Instance | The actual article, a populated dashboard, a real product page |
The irreducible primitives. An atom has a single responsibility and no internal layout decisions about other components. A Button is an atom; a button with an icon and a dropdown is not. Atoms are where your design tokens become visible — an atom is the smallest place a color, font size, radius, or spacing token gets applied.
> Litmus test: if removing a child element changes what the thing fundamentally is, you've gone below the atom. A label without its text is still a label; a search field without its input is no longer a search field.
Atoms doing one job together. The classic example is a search form: a label atom + input atom + button atom become a SearchField molecule. Molecules are the "do one thing well" layer — they encapsulate a small interaction (enter a query, toggle a setting, pick a date) and become genuinely reusable. Most of your useful reusable components live here and at the organism level.
Distinct, recognizable sections of an interface. A Header organism might contain a logo atom, a SearchField molecule, and a NavList molecule. Organisms can contain other organisms. They are where layout, responsive behavior, and meaningful state (loading, empty, error) tend to concentrate. On native platforms, a BottomTabBar or a NavigationStack header is an organism.
Templates strip out real content and show structure: where the header goes, how the grid flows, what stacks on mobile. They are the design-system equivalent of a wireframe made of real organisms. Templates answer "how is this page laid out and how does it reflow?" without committing to copy or data. In code, a template is often a layout component or a route's skeleton (e.g. a Next.js layout.tsx, an ArticleLayout with named slots).
Templates with real, representative content plugged in — including the edge cases that break naive designs: the 40-character name, the empty list, the 3,000-comment thread, the right-to-left locale. Pages are where you validate the system against reality. If a page looks wrong, you fix the template or the organisms, not the page. Pages are instances, not new components.
The atoms/molecules/organisms metaphor is a teaching device, not a law. Its value: it conveys hierarchy and composition at a glance and gives non-overloaded names (unlike "component," "module," "widget," which mean ten things). Its limits, which you must hold honestly:
Treat the five stages as a spectrum of granularity, and the names as shorthand for points on it. Don't force every component to declare a stage on its birth certificate.
Tokens and atomic design are complementary layers, not competitors. Tokens are the sub-atomic layer — the values atoms consume.
Button reads color.action.primary, space.inset.md, radius.button, font.label. The atom is the contract between the token system and the rendered pixel.$value / $type, JSON) so tokens are tool-agnostic and transformable (Style Dictionary, Tokens Studio). Three semantic tiers:color.blue.600 = #2563EB, space.4 = 16px. Never referenced directly by components.color.action.primary → {color.blue.600}, color.text.error. Components reference these.button.background.default → {color.action.primary}. Use only when a component needs to diverge; over-using this tier explodes the token count.json{ "color": { "blue": { "600": { "$value": "#2563EB", "$type": "color" } }, "action": { "primary": { "$value": "{color.blue.600}", "$type": "color" } } }, "space": { "4": { "$value": "16px", "$type": "dimension" } } }
Cross-platform payoff: one token source → Style Dictionary emits CSS custom properties for web, Swift/Compose constants for iOS/Android, and JSON for desktop (Tauri/Electron). Atoms on every platform read the same semantic tokens, so a brand-color change is one edit, not N.
The metaphor maps to composition over inheritance. You don't subclass a Button into a SearchButton; you compose a Button atom inside a SearchField molecule. Modern component patterns enforce this:
Card exposes Card.Header, Card.Body, Card.Footer; a Dialog uses Trigger/Content/Title. This is composition made literal.tsx// Atom — single concern, consumes tokens, no layout of others export function Button({ variant = "primary", ...props }: ButtonProps) { /* ... */ } // Molecule — composes atoms for one job export function SearchField({ onSearch }: SearchFieldProps) { return ( <form role="search" onSubmit={/* ... */}> <Label htmlFor="q">Search</Label> <Input id="q" name="q" /> <Button type="submit"><Icon name="search" /></Button> </form> ); } // Organism — composes molecules + atoms into a section export function Header() { return <header><Logo /><SearchField onSearch={/* ... */} /><NavList /></header>; }
Name by what it is, not where it sits (SearchField, not Molecule_03). Keep the atomic stage out of the import path if you can — consumers should write import { SearchField } from "@/ui/search-field", not care that it's a molecule. Two viable layouts:
# Strict atomic (good for teaching, design-eng handoff parity with Figma)
ui/
atoms/ button/ input/ icon/
molecules/ search-field/ form-field/
organisms/ header/ data-table/
templates/ article-layout/
# Tiered + feature (scales better past ~100 components)
ui/
primitives/ # atoms: button, input, icon
components/ # molecules + simple organisms
patterns/ # complex organisms + templates
features/
checkout/ # screen-specific compositions live with the featureFiles kebab-case, components PascalCase. Co-locate component.tsx, component.stories.tsx, component.test.tsx, and tokens/styles. Mirror this structure in Figma (see below) so a designer and an engineer point at the same node.
This distinction is the most-skipped and most-valuable part. Templates verify structure; pages verify reality.
If you only build pages, you can't reuse layout. If you only build templates, you ship designs that shatter on real data. Build both; let page failures drive fixes upstream into templates and organisms.
The failure mode is taxonomy worship — spending energy on "is this a molecule or organism?" instead of shipping. Watch for:
Button atom inside a ButtonGroup molecule inside a Toolbar organism inside a Header organism inside a Page… five layers of indirection to change a padding value. Flatten.When the metaphor causes more meetings than it saves, drop to three tiers (primitives / components / patterns) and keep the composition discipline. The discipline is the value; the five Greek-derived nouns are not.
A design system is a product with users (your other teams). Wire in:
A mobile/desktop Account Settings screen:
Text (heading/body styles), Switch, Input, Button, Avatar, Icon, Divider.SettingRow (label + description + Switch), FormField (label + Input + helper/error), AvatarUpload (Avatar + Button).ProfileSection (AvatarUpload + two FormFields), NotificationsGroup (header + N SettingRows), DangerZone (warning text + destructive Button).SettingsLayout — a master-detail split on desktop/tablet (nav rail + scrollable panel), single scroll column on mobile, organisms slotted in order, placeholder labels.SettingRow (truncation) or SettingsLayout (reflow), never into the page itself.Button set: variant × size × state). Nested instances = composition (a SearchField component places Input + Button instances) — the literal Figma analog of molecules composing atoms.color.action.primary exists in design and code.Header / NavList / SearchField resolves to the same thing in both tools — this is what makes handoff frictionless and keeps the system from forking into a "design version" and a "code version."The through-line: tokens → atoms → molecules → organisms → templates → pages is one continuous composition chain, expressed identically in your token files, your Figma tree, and your component code. Keep those three in sync and the methodology pays for itself; let them drift and the metaphor becomes decoration.
Other measured skills in the registry, with their headline benchmark lift.