Atomic Design vs Component-Driven Design: Which Pattern Should You Use in 2025?
In 2013, Brad Frost published Atomic Design and gave the industry a shared language for component libraries. In 2025, the design systems community is more nuanced about it. Atomic Design's vocabulary is everywhere — atoms, molecules, organisms — but its strict hierarchy is increasingly ignored in favour of more pragmatic, workflow-first approaches. Component-Driven Design has emerged as a complementary methodology that answers a different question entirely. This guide compares both patterns honestly: what each does well, where each breaks down, and how modern Angular design system teams actually structure their work — so you can make an informed decision rather than defaulting to whichever pattern your previous team used.
What Is Atomic Design? (The Full Framework)
Brad Frost's Atomic Design methodology organises UI components into five hierarchical levels, using chemistry as its central metaphor — just as atoms combine into molecules, molecules into organisms, and so on.
The five levels are:
- Atoms — The smallest functional units. A single HTML element or base component that cannot be broken down further without losing its meaning. Examples:
Button,Input,Icon,Label,Badge,Divider. - Molecules — Simple combinations of atoms that form a single, cohesive UI unit. Examples:
SearchBar(Input + Button),FormField(Label + Input + Error text),AvatarWithName(Avatar + Text). - Organisms — Complex UI sections made up of molecules and/or atoms. Examples:
Header(Logo + Navigation + SearchBar),ProductCard(Image + Title + Price + Button),CommentThread(multiple Comment molecules). - Templates — Page layouts that define the structure and placement of organisms, using placeholder content. Examples:
DashboardLayout,ArticleLayout,AuthLayout. - Pages — Templates filled with real, representative content. Examples:
Dashboard,ArticleDetail,LoginPage.
Original Intent and Core Value
Atomic Design was conceived during the static HTML/CSS era of style guide thinking — a time when teams built pattern libraries in static HTML files without component frameworks. Its primary goal was to create a shared vocabulary between designers and developers: a way to talk about UI components that non-technical stakeholders could understand.
The chemistry analogy is genuinely intuitive. When you explain to a product manager that a SearchBar is a molecule made of an Input atom and a Button atom, the hierarchy clicks immediately. For teams new to design systems, Atomic Design provides an approachable mental model that prevents the alternative: a flat, unorganised pile of components with no conceptual framework.
What Is Component-Driven Design?
Component-Driven Design (CDD) emerged from the Storybook ecosystem and represents a fundamentally different orientation. Where Atomic Design asks "how do we classify components?", CDD asks "how do we build them reliably?"
The workflow flows like this: Story → Component → Composition → Page. You define what a component should look like and how it should behave (the story) before writing the implementation. The component is then built to satisfy the story, tested in isolation, and only then composed into larger UI sections.
Core Principles
Isolation — Every component is developed and tested standalone, with no dependency on application state, routing context, or sibling components. A Button should render correctly regardless of where it is placed.
Composability — Complex UIs are built by composing simpler components based on their API contracts (props, inputs, outputs, slots). There is no prescribed hierarchy — components compose freely based on what their APIs allow.
Testability — Each component is tested independently. Unit tests validate logic; Storybook stories validate visual states; Chromatic catches visual regressions between commits.
Documentation as a byproduct — Stories are not written after the component is built. They are written alongside it, which means documentation is always current and always accurate. A story file is simultaneously a development sandbox, a regression test, and a living specification.
No Strict Hierarchy
CDD deliberately avoids enforcing a classification taxonomy. Components compose based on their API contracts, not their classification level. A DataTable can contain a Button (without debating whether DataTable is an organism or a pattern). A Sidebar can contain another complex navigation component. Composition is governed by interface compatibility, not taxonomy rules.
CDD is championed by Storybook, Chromatic, and has been widely adopted across the Angular and React communities as the de facto standard for component library development.
Where Atomic Design Breaks Down
Despite its widespread adoption as vocabulary, Atomic Design's strict hierarchy creates real friction in modern component library work. Here are the five most common failure modes.
1. The Molecule/Organism Debate
Every team that adopts Atomic Design eventually hits the same wall: "Is a DatePicker a molecule or an organism?"
It contains inputs (atoms), it is somewhat complex (suggesting organism), but it functions as a single conceptual unit (suggesting molecule). There is no objectively correct answer. Teams spend hours — sometimes days — in taxonomy debates that produce zero user value.
The debate is symptomatic of a deeper problem: the molecule/organism boundary is inherently fuzzy. Frost's original definition distinguishes them by whether a component has "standalone utility" — but this is subjective and context-dependent. What one team calls an organism, another calls a complex molecule.
2. Templates and Pages Are Not Components
Templates and Pages in the Atomic Design model are actually routes and views — application-level constructs, not component-library citizens. They don't belong in a shared component library. They belong in the application that consumes the component library.
Forcing them into the five-level hierarchy conflates two different concerns: what goes in the component library (atoms, molecules, organisms) and what goes in the application (layouts, views, pages). This confusion leads teams to either bloat their component library with application-specific layouts, or abandon the full five-level model while keeping the atom/molecule/organism vocabulary.
3. Strict Hierarchy Breaks Modern Composition Patterns
Atomic Design implies a directional composition rule: atoms compose into molecules, molecules compose into organisms. Modern component patterns routinely break this:
- A
Button(atom) can contain anIcon(also an atom) — same-level composition - An organism like
Sidebarcan contain another organism likeNavigationMenu - Compound components —
Tabs/Tab/TabPanel— are peers that compose laterally, not hierarchically - Headless components like a
Comboboxcontain multiple interactive elements that don't fit neatly into any level
The hierarchy creates artificial constraints on composition patterns that Angular's template composition system has no trouble supporting.
4. Designed for HTML, Not Reactive Frameworks
Atomic Design predates Angular's standalone component model, React's hook system, and the design token era. The methodology has no vocabulary for:
- Design tokens — Which level do token-aware primitives belong to?
- Variants — Is a
PrimaryButtona different atom from aGhostButton, or the same atom with a variant prop? - Compound components — Where do
Select+Option+OptionGroupfit? - Headless components — Components that provide accessibility and interaction without any visual output
- Accessibility patterns — ARIA relationships between components that span "levels"
None of these fundamental patterns of modern component development have a clear home in the original five-level model.
5. Naming Fatigue Blocks Shipping
"Is this an atom or a molecule?" is a question that stops components from being shipped. Teams get into the bikeshedding loop, reach no consensus, and eventually either abandon the taxonomy or apply it inconsistently — which creates more confusion than no taxonomy at all.
The irony: teams adopt Atomic Design to create clarity, then spend so much time on classification that the system becomes the obstacle rather than the enabler.
Where Atomic Design Still Works
Acknowledging these limitations is not a dismissal of the methodology. Atomic Design delivers genuine value in specific contexts:
- As a communication tool with non-technical stakeholders. The chemistry metaphor lands. Product managers, marketing teams, and executives grasp the atom-to-page hierarchy intuitively.
- As a loose filing system in Figma. Separate pages for Atoms, Molecules, and Organisms give designers navigable structure without requiring code-level precision.
- For teams new to design systems. It provides a starting mental model that is better than no model. "Start here, refine later" is a valid strategy.
- When treated as approximate, not prescriptive. Teams that adopt the vocabulary loosely — "this is roughly an organism" — without debating the boundary cases get the communication benefits without the taxonomy paralysis.
The key word is "approximate." Atomic Design works when used as a rough heuristic, not a strict classification system.
Component-Driven Design: The Development Workflow
CDD is less a naming system and more a development process. Its value is in how it structures the act of building components — from the first line of code to production.
Story-First Development
The CDD workflow begins with the story, not the component:
- Write the Storybook story first — define the component's API, document its variants, describe its expected states (default, hover, disabled, loading, error)
- Build the component to satisfy the story's requirements
- The story becomes permanent documentation — a regression baseline, a visual specification, and a development sandbox
This inversion — story before implementation — forces you to think about the component's public API before you think about its internal implementation. The result is components with cleaner interfaces and more deliberate prop design.
The Component Contract
In CDD, every component has an explicit contract:
- Props/Inputs define what the component accepts and what it promises to render
- Stories document every meaningful visual state — not just the happy path, but error states, loading states, empty states, and edge cases
- Tests validate that the contract does not break as the codebase evolves
- Chromatic catches visual regressions automatically on every pull request
This contract-first thinking produces components that are genuinely reusable because their behaviour is predictable and documented.
Composition Without Hierarchy
Components compose based on their API, not their classification. There is no taxonomy debate:
// No molecule/organism debate needed — InputGroup composes whatever makes sense
<app-input-group>
<app-label>Email</app-label>
<app-input type="email" />
<app-hint>We'll never share your email</app-hint>
<app-error *ngIf="hasError">Invalid email format</app-error>
</app-input-group>
The question is not "what level is InputGroup?" — the question is "does InputGroup's API support projecting Label, Input, Hint, and Error as content children?" If yes, compose it. The API is the contract; the taxonomy is irrelevant.
For a complete guide to implementing this workflow in Angular with Storybook, see Storybook for Angular Design Systems: Complete Documentation Guide 2025.
The Modern 3-Tier Alternative for Angular (2025)
Most Angular design system teams building mature component libraries in 2025 avoid both strict Atomic Design and a completely flat component structure. Instead, they use a pragmatic three-tier model that maps cleanly to Angular's standalone component architecture.
Tier 1: Primitives
Token-aware, zero business logic, maximally composable. These are the building blocks of everything else.
Examples: Button, Input, Badge, Icon, Tooltip, Divider, Spinner, Avatar, Checkbox, Radio
// Primitive: fully token-aware, zero business logic
@Component({
selector: 'app-button',
standalone: true,
template: `
<button
[class]="buttonClasses()"
[disabled]="disabled()"
>
<ng-content />
</button>
`
})
export class ButtonComponent {
readonly variant = input<'primary' | 'secondary' | 'ghost'>('primary');
readonly size = input<'sm' | 'md' | 'lg'>('md');
readonly disabled = input(false);
protected buttonClasses = computed(() =>
`btn btn--${this.variant()} btn--${this.size()}`
);
}
Primitives consume design tokens directly. They have no awareness of application state, routing, or business rules. Their API surface is small and stable.
Tier 2: Composites
Combinations of primitives that solve a specific, repeated UI problem. Composites add composition logic and accessibility relationships that would be repetitive to reimplement at every usage site.
Examples: FormField (Label + Input + Error + Hint), SearchBar (Input + Button), AvatarGroup, TagInput, Card, Modal
// Composite: combines primitives, adds composition logic
@Component({
selector: 'app-form-field',
standalone: true,
imports: [LabelComponent, ErrorComponent, HintComponent],
template: `
<div class="form-field" [class.form-field--error]="!!error()">
<app-label [required]="required()">{{ label() }}</app-label>
<ng-content />
@if (hint() && !error()) {
<app-hint>{{ hint() }}</app-hint>
}
@if (error()) {
<app-error>{{ error() }}</app-error>
}
</div>
`
})
export class FormFieldComponent {
readonly label = input.required<string>();
readonly error = input<string | null>(null);
readonly hint = input<string | null>(null);
readonly required = input(false);
}
Composites are still free of business logic. They don't know about users, products, or API responses. They only know about UI state.
Tier 3: Patterns
Complex, domain-aware UI sections. Patterns may contain application state, business logic, or service dependencies. They live in the component library but are documented and versioned separately from primitives and composites.
Examples: DataTable (with sorting, filtering, pagination), DatePicker, NavigationMenu, CommandPalette, MultiStepForm, RichTextEditor
Patterns are where business complexity lives. They are the components that product teams contribute to and consume most directly. Their APIs are more complex, their stories more numerous, and their change velocity higher than primitives.
Angular Folder Structure: 3-Tier in Practice
The three-tier model maps to a folder structure that makes contribution guidelines obvious — a new team member can immediately tell where a new component belongs:
src/app/design-system/
components/
primitives/
button/
button.component.ts
button.component.scss
button.component.spec.ts
button.stories.ts
input/
badge/
icon/
composites/
form-field/
form-field.component.ts
form-field.component.scss
form-field.component.spec.ts
form-field.stories.ts
search-bar/
avatar-group/
patterns/
data-table/
data-table.component.ts
data-table.component.scss
data-table.component.spec.ts
data-table.stories.ts
date-picker/
command-palette/
tokens/
tokens.scss
tokens.ts ← typed token constants
index.ts ← public API barrel file
The index.ts barrel file controls the public API of the design system. Only what is exported from index.ts is considered stable and semver-versioned. Internal implementation details remain private.
For guidance on scaling this structure across multiple teams, see Design System Maturity Model: A Framework for Teams 2025.
Decision Framework: Which Approach for Your Team?
The right choice depends on what problem you are actually trying to solve. Here is a practical decision framework.
Use Atomic Design vocabulary if:
- You are establishing shared language with designers and non-technical stakeholders who need an intuitive mental model
- Your team is new to design systems and needs a starting framework — imperfect structure beats no structure
- You use Figma and want page organisation that non-designers can navigate without a guide
- You commit to treating the taxonomy as approximate and will not debate molecule/organism boundaries
Use Component-Driven Design workflow if:
- Your team builds components in isolation using Storybook
- You want documentation to emerge as a byproduct of development rather than requiring a separate effort
- You have visual regression testing (Chromatic) as part of your CI pipeline
- You want components to compose freely based on API contracts without taxonomy constraints blocking development
Use the 3-Tier model (Primitives/Composites/Patterns) if:
- You are building a mature Angular design system that will be consumed by multiple product teams
- You need clear ownership guidelines — teams should know immediately whether a proposed component is a primitive, composite, or pattern
- You are publishing the library to NPM or serving it from a monorepo
- You have experienced Atomic Design's taxonomy debates and want a structure that prevents them without abandoning all organisation
The three approaches are not mutually exclusive. Many of the teams making the best design system decisions in 2025 use elements of all three.
Mixing Both: What Most Mature Teams Actually Do
The most pragmatic mature design system teams in 2025 operate with a combination that would horrify a methodology purist — and ship excellent, well-documented component libraries because of it.
In Figma: Atomic Design vocabulary (organisational, approximate, non-prescriptive). Designers use the Atoms, Molecules, and Organisms pages as a filing system. No one debates boundaries in design review.
In code: Component-Driven workflow (Storybook, story-first development, isolation, Chromatic for visual regression). Every component has stories before it has users.
In the codebase structure: 3-tier or 2-tier classification (primitives/composites — or primitives/composites/patterns for larger systems). Folder structure communicates intent; the barrel file controls the public API.
The key insight here is that Atomic Design and CDD answer different questions. Atomic Design is "how do we talk about components?" — it is a communication and organisation tool. Component-Driven Design is "how do we build components?" — it is a development workflow. They operate at different levels of abstraction and solve different problems. Using both, selectively and without dogmatism, is not inconsistent. It is pragmatic.
The Anti-Pattern: Taxonomy Without Workflow
It is worth naming the failure mode explicitly, because it is common.
The worst outcome is a team that adopts Atomic Design naming, spends weeks debating folder structure and component classification, creates five beautifully labelled Figma pages — and then continues building components in monolithic feature modules, skips Storybook entirely, and has no visual regression testing.
The naming system has zero value without the workflow that backs it. An "atoms" folder containing components that have never been tested in isolation, have no stories, and break when used outside their original context is not Atomic Design — it is just a folder named "atoms."
The same applies to CDD without discipline: writing stories after the component is "done," treating them as checkbox documentation, and never running Chromatic is not Component-Driven Design. It is Storybook as afterthought.
Always implement the workflow before worrying about the taxonomy. A flat folder structure with story-first development and full visual regression coverage is worth more than a perfectly organised five-tier hierarchy with no documentation and no tests.
The Best System Is the One Your Team Actually Uses
Atomic Design's gift is vocabulary — a shared language that makes design system conversations possible across disciplines.
Component-Driven Design's gift is workflow — a development process that produces isolated, documented, tested components as a natural byproduct.
The 3-tier model's gift is clarity — a folder structure and contribution guideline that scales to multiple teams without taxonomy debates.
Take the vocabulary where it helps communication. Adopt the workflow as your development standard. Use the structure that maps cleanly to your codebase and team organisation. And stop bikeshedding about whether a DatePicker is a molecule or an organism. Ship the component, document it in Storybook, add it to Chromatic, and iterate based on how product teams actually use it.
The design system that ships and gets used by your teams is infinitely more valuable than the architecturally perfect system that is still being debated in a Notion doc.
