10 KiB
Atomic Design Classification Guide
This guide provides criteria for classifying React components according to Atomic Design principles when extracting from Figma designs.
Atomic Design Overview
Atomic Design is a methodology for creating design systems with five distinct levels:
- Atoms - Basic building blocks
- Molecules - Simple combinations of atoms
- Organisms - Complex combinations of molecules and atoms
- Templates - Page-level layouts (wireframes)
- Pages - Specific instances of templates with real content
For component libraries, focus primarily on Atoms, Molecules, and Organisms.
Classification Criteria
Atoms
Definition: The smallest, indivisible UI components that cannot be broken down further without losing meaning.
Characteristics:
- Single responsibility
- No internal state (usually)
- Highly reusable
- Self-contained
- Cannot be broken down further
Examples:
- Button
- Input field
- Label
- Icon
- Image
- Heading (h1, h2, etc.)
- Paragraph
- Link
- Checkbox
- Radio button
- Badge
- Avatar
- Spinner/Loader
Figma Indicators:
- Figma components with no nested components
- Simple, single-purpose elements
- Elements that appear repeatedly across designs
- Base design tokens (colors, typography, spacing)
React Example:
// Button Atom
export const Button = ({ children, onClick, variant = 'primary' }: Props) => (
<button
onClick={onClick}
className={`px-4 py-2 rounded ${variant === 'primary' ? 'bg-blue-500 text-white' : 'bg-gray-200'}`}
>
{children}
</button>
);
Molecules
Definition: Simple combinations of atoms that work together as a unit.
Characteristics:
- Composed of 2-5 atoms
- Has a single, clear purpose
- Still relatively simple
- Reusable across contexts
- May have simple internal logic
Examples:
- Search bar (Input + Button)
- Form field (Label + Input + Error message)
- Card header (Heading + Badge)
- Social share buttons (Multiple icon buttons)
- Breadcrumb navigation (Multiple links + separators)
- Input with icon
- Select dropdown with label
- Toast notification (Icon + Text + Close button)
Figma Indicators:
- Figma components containing 2-5 child components
- Grouped elements that always appear together
- Repeated patterns across different pages
React Example:
// SearchBar Molecule
export const SearchBar = ({ onSearch, placeholder }: Props) => (
<div className="flex gap-2">
<Input placeholder={placeholder} onChange={handleChange} />
<Button onClick={onSearch}>Search</Button>
</div>
);
Organisms
Definition: Complex UI components composed of molecules and atoms, forming distinct sections of an interface.
Characteristics:
- Composed of multiple molecules and/or atoms
- Complex structure
- May have significant internal logic and state
- Represents a distinct section of the UI
- Often context-specific
Examples:
- Header (Logo + Navigation + Search bar + User menu)
- Footer (Multiple link groups + Social icons + Copyright)
- Product card (Image + Title + Description + Price + Button)
- Comment section (Avatar + Name + Timestamp + Text + Action buttons)
- Navigation menu (Multiple links + dropdown menus)
- Form (Multiple form fields + Submit button)
- Modal dialog (Header + Content + Footer with buttons)
- Table with pagination (Table + Pagination controls)
- Sidebar (Logo + Navigation links + User profile)
Figma Indicators:
- Figma components with multiple nested components
- Large, complex frames
- Represents a complete UI section
- Contains both structure and content
React Example:
// ProductCard Organism
export const ProductCard = ({ product }: Props) => (
<div className="flex flex-col gap-4 p-6 border rounded">
<Image src={product.image} alt={product.name} />
<Heading level={3}>{product.name}</Heading>
<Paragraph>{product.description}</Paragraph>
<div className="flex items-center justify-between">
<Badge>{product.price}</Badge>
<Button onClick={() => addToCart(product)}>Add to Cart</Button>
</div>
</div>
);
Templates (Optional)
Definition: Page-level layouts that define content structure without actual content.
Characteristics:
- Arranges organisms into page layouts
- Uses placeholder content
- Defines grid and spacing
- Reusable across multiple pages
Examples:
- Blog post layout template
- Dashboard layout template
- Product page layout template
Figma Indicators:
- Full-page frames
- Uses placeholder content (Lorem ipsum, sample images)
- Defines overall page structure
React Example:
// BlogPostTemplate
export const BlogPostTemplate = ({ header, content, sidebar }: Props) => (
<div className="grid grid-cols-12 gap-6">
<header className="col-span-12">{header}</header>
<main className="col-span-8">{content}</main>
<aside className="col-span-4">{sidebar}</aside>
</div>
);
Pages (Optional)
Definition: Specific instances of templates with real content.
Characteristics:
- Uses actual content
- Represents a specific page in the application
- May include page-specific logic (data fetching, etc.)
Note: Pages are typically not part of a component library. They are application-specific implementations.
Classification Decision Tree
When analyzing a Figma component, ask these questions:
Is it an Atom?
-
✅ Can it be broken down further?
- NO → It's an Atom
- YES → Continue
-
✅ Does it have a single, indivisible purpose?
- YES → It's an Atom
- NO → Continue
Is it a Molecule?
-
✅ Is it composed of 2-5 atoms?
- YES → Likely a Molecule
- NO → Continue
-
✅ Does it serve a single, simple purpose?
- YES → It's a Molecule
- NO → Continue
Is it an Organism?
-
✅ Is it composed of multiple molecules and/or atoms?
- YES → It's an Organism
-
✅ Does it represent a distinct section of the interface?
- YES → It's an Organism
Special Cases
Ambiguous cases:
- If a component could be either an Atom or Molecule, prefer Atom if it's highly reusable
- If a component could be either a Molecule or Organism, prefer Molecule if it's simple
Context matters:
- Classification can vary based on project scope
- What's an Organism in one project might be a Molecule in another (with larger scale)
Naming Conventions
Follow consistent naming patterns for each category:
Atoms
Button
Input
Label
Icon
Badge
Avatar
Heading
Paragraph
Molecules
SearchBar
FormField
InputWithIcon
SocialShareButtons
Breadcrumb
Organisms
Header
Footer
ProductCard
CommentSection
NavigationMenu
Sidebar
Directory Structure
Organize components by Atomic Design category:
src/
components/
atoms/
Button/
Button.tsx
Button.test.tsx
Button.stories.tsx
molecules/
SearchBar/
SearchBar.tsx
SearchBar.test.tsx
SearchBar.stories.tsx
organisms/
Header/
Header.tsx
Header.test.tsx
Header.stories.tsx
Analysis Workflow
When extracting components from Figma:
-
Identify component boundaries
- Look for logical groupings
- Check Figma component instances
- Identify repeated patterns
-
Count the atoms
- How many basic elements does it contain?
- 1 atom → Atom
- 2-5 atoms → Molecule candidate
- 6+ atoms → Organism candidate
-
Assess complexity
- Simple structure → Atom or Molecule
- Complex structure → Organism
-
Check purpose
- Single, simple purpose → Atom or Molecule
- Multiple purposes or section of UI → Organism
-
Verify reusability
- Highly reusable across contexts → Atom or Molecule
- Context-specific → Organism
-
Make classification decision
- Use the decision tree above
- Document reasoning if ambiguous
Common Patterns and Classifications
Forms
- Atoms: Input, Label, Checkbox, Radio, Button
- Molecules: FormField (Label + Input + Error)
- Organisms: LoginForm (Multiple FormFields + Button)
Navigation
- Atoms: Link, Icon
- Molecules: NavItem (Link + Icon)
- Organisms: NavigationMenu (Multiple NavItems + Dropdown)
Cards
- Atoms: Image, Heading, Paragraph, Button, Badge
- Molecules: CardHeader (Image + Badge), CardFooter (Button)
- Organisms: ProductCard (CardHeader + Content + CardFooter)
Lists
- Atoms: ListItem (single item)
- Molecules: ListItemWithIcon (Icon + ListItem)
- Organisms: UserList (Multiple ListItemWithIcon + Header + Pagination)
Edge Cases and Guidelines
When a component feels too simple for Molecule
If a "Molecule" only combines 2 atoms without adding meaningful functionality:
- Consider if it should be an Atom
- Or, accept it as a simple Molecule for consistency
Example:
// This might feel too simple for a Molecule, but it's valid
const IconButton = ({ icon, onClick }: Props) => (
<Button onClick={onClick}>
<Icon name={icon} />
</Button>
);
When a component feels too complex for Organism
If an "Organism" is extremely complex with many nested components:
- Consider breaking it down into smaller Organisms
- Or, accept it as a complex Organism if it represents a single, cohesive UI section
Reusing components across categories
It's normal for:
- Organisms to use Molecules
- Molecules to use Atoms
- Organisms to use Atoms directly (skip Molecules if simpler)
Don't force categorization - the goal is organization and reusability, not rigid adherence.
Benefits of Proper Classification
- Better organization: Easy to find components
- Improved reusability: Atoms and Molecules are highly reusable
- Easier testing: Smaller components are easier to test
- Consistent design: Enforces design system patterns
- Team communication: Shared vocabulary for discussing components
- Scalability: Easier to maintain as the system grows
Tips
- Start small: Begin with Atoms, then build up to Molecules and Organisms
- Be consistent: Once you classify a pattern, stick with it
- Document decisions: If classification is ambiguous, document why you chose a category
- Iterate: It's okay to reclassify components as you learn more about the system
- Prioritize reusability: When in doubt, prefer smaller, more reusable components
- Don't over-engineer: Not every UI element needs to be a separate Atom
- Use Figma components as hints: Figma component structure often maps to Atomic Design