Skip to content

Atomic Design - A Methodology for Creating Design Systems

Atomic Design is a methodology for creating design systems by breaking down interfaces into fundamental building blocks. Created by Brad Frost, it provides a clear hierarchy that helps teams build consistent, scalable, and maintainable user interfaces.

Atomic Design is inspired by chemistry, organizing UI components into five distinct levels that build upon each other, from smallest to largest:

Atoms

The basic building blocks of matter. In interfaces, these are HTML elements like buttons, inputs, and labels that can’t be broken down further without losing functionality.

Molecules

Groups of atoms bonded together. Simple UI components made of multiple atoms working as a unit, like a search form combining an input and button.

Organisms

Complex UI components composed of molecules and atoms. Relatively complex sections like headers, navigation bars, or product cards.

Templates

Page-level layouts that place organisms in a structure. They show the design’s underlying content structure without real content.

Pages

Specific instances of templates with real content. What users actually see and interact with in the final product.

Atoms are the foundational elements that cannot be broken down further without losing their purpose.

Examples:

  • HTML tags: <button>, <input>, <label>, <h1>
  • Color palettes
  • Fonts
  • Animations
  • Icons
atoms/button.css
.button {
padding: 0.75rem 1.5rem;
border-radius: 0.375rem;
font-weight: 600;
border: none;
cursor: pointer;
transition: all 0.2s;
}
.button--primary {
background-color: #3b82f6;
color: white;
}
.button--secondary {
background-color: #64748b;
color: white;
}

Molecules are simple groups of atoms functioning together as a unit.

Examples:

  • Search form (input + button)
  • Form field (label + input + error message)
  • Social media icon group
molecules/SearchForm.jsx
import Button from '../atoms/Button';
import Input from '../atoms/Input';
export default function SearchForm() {
return (
<form className="search-form">
<Input
type="search"
placeholder="Search..."
aria-label="Search"
/>
<Button variant="primary">Search</Button>
</form>
);
}
molecules/search-form.css
.search-form {
display: flex;
gap: 0.5rem;
max-width: 500px;
}

Organisms are relatively complex components composed of groups of molecules and/or atoms.

Examples:

  • Header with logo, navigation, and search
  • Product card with image, title, price, and button
  • Comment section with user info, text, and actions
organisms/Header.jsx
import Logo from '../atoms/Logo';
import Navigation from '../molecules/Navigation';
import SearchForm from '../molecules/SearchForm';
export default function Header() {
return (
<header className="header">
<div className="header__container">
<Logo />
<Navigation />
<SearchForm />
</div>
</header>
);
}
organisms/header.css
.header {
background-color: white;
border-bottom: 1px solid #e5e7eb;
padding: 1rem 0;
}
.header__container {
max-width: 1280px;
margin: 0 auto;
display: flex;
align-items: center;
justify-content: space-between;
gap: 2rem;
padding: 0 1rem;
}

Templates are page-level objects that place components into a layout, showing the design’s content structure.

templates/ProductListTemplate.jsx
import Header from '../organisms/Header';
import Footer from '../organisms/Footer';
import ProductGrid from '../organisms/ProductGrid';
import Sidebar from '../organisms/Sidebar';
export default function ProductListTemplate() {
return (
<div className="template">
<Header />
<main className="template__main">
<Sidebar />
<ProductGrid />
</main>
<Footer />
</div>
);
}

Pages are specific instances of templates with real representative content plugged in.

pages/ElectronicsPage.jsx
import ProductListTemplate from '../templates/ProductListTemplate';
export default function ElectronicsPage({ products }) {
return (
<ProductListTemplate
products={products}
category="Electronics"
filters={['Brand', 'Price', 'Rating']}
/>
);
}

Here’s how to organize your project using Atomic Design:

  • Directorysrc/
    • Directorycomponents/
      • Directoryatoms/
        • Button.jsx
        • Input.jsx
        • Label.jsx
        • Icon.jsx
        • Text.jsx
      • Directorymolecules/
        • SearchForm.jsx
        • FormField.jsx
        • IconButton.jsx
        • CardHeader.jsx
      • Directoryorganisms/
        • Header.jsx
        • Footer.jsx
        • ProductCard.jsx
        • Navigation.jsx
      • Directorytemplates/
        • HomeTemplate.jsx
        • ProductListTemplate.jsx
        • ProductDetailTemplate.jsx
      • Directorypages/
        • HomePage.jsx
        • ElectronicsPage.jsx
        • ProductDetailPage.jsx
    • Directorystyles/
      • Directoryatoms/
      • Directorymolecules/
      • Directoryorganisms/
      • base.css
  1. Audit Your Interface

    Start by conducting an interface inventory. Screenshot and list all the different UI components in your current project or design.

  2. Identify Atoms

    Extract the most basic elements: buttons, inputs, labels, headings, icons, colors, and typography. These should be completely reusable across your entire project.

  3. Build Molecules

    Combine your atoms into simple, functional groups. A form field might combine a label and input. A search bar might combine an input and button.

  4. Create Organisms

    Combine molecules and atoms into more complex components. A header might include a logo (atom), navigation (molecule), and search form (molecule).

  5. Design Templates

    Arrange your organisms into page layouts. Focus on structure and layout rather than content at this stage.

  6. Populate Pages

    Add real content to your templates to create actual pages. This is where you test how your system works with real data.

Keep Atoms Pure

Atoms should be as generic and reusable as possible. Avoid coupling them to specific use cases or business logic.

Name Consistently

Use clear, consistent naming conventions. Consider using BEM (Block Element Modifier) or similar methodologies.

Document Everything

Create a living style guide or component library. Tools like Storybook are perfect for this.

Start Small

Begin with a few key components and expand gradually. Don’t try to build your entire system at once.

Let’s build a complete login form using Atomic Design principles:

atoms/Button.jsx
export default function Button({ children, variant = 'primary', ...props }) {
return (
<button className={`button button--${variant}`} {...props}>
{children}
</button>
);
}
atoms/Input.jsx
export default function Input({ ...props }) {
return <input className="input" {...props} />;
}
atoms/Label.jsx
export default function Label({ children, ...props }) {
return <label className="label" {...props}>{children}</label>;
}
  • Consistency: Reusing components ensures a consistent look and feel across your application
  • Scalability: Building from small to large makes it easier to manage growing projects
  • Maintainability: Changes to atoms automatically propagate to all components using them
  • Communication: Provides a shared vocabulary for designers and developers
  • Efficiency: Speeds up development by reusing tested, reliable components

Pattern Lab

A static site generator for building atomic design systems. Created by Brad Frost, it’s the original tool for implementing this methodology.

Storybook

Build and document your components in isolation. Perfect for showcasing your atomic design system to your team.

Figma

Design your atomic components and maintain consistency between design and development with shared component libraries.