# 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: 1. **Atoms** - Basic building blocks 2. **Molecules** - Simple combinations of atoms 3. **Organisms** - Complex combinations of molecules and atoms 4. **Templates** - Page-level layouts (wireframes) 5. **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:** ```tsx // Button Atom export const Button = ({ children, onClick, variant = 'primary' }: Props) => ( ); ``` ### 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:** ```tsx // SearchBar Molecule export const SearchBar = ({ onSearch, placeholder }: Props) => (
); ``` ### 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:** ```tsx // ProductCard Organism export const ProductCard = ({ product }: Props) => (
{product.name} {product.name} {product.description}
{product.price}
); ``` ### 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:** ```tsx // BlogPostTemplate export const BlogPostTemplate = ({ header, content, sidebar }: Props) => (
{header}
{content}
); ``` ### 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? 1. ✅ Can it be broken down further? - **NO** → It's an Atom - **YES** → Continue 2. ✅ Does it have a single, indivisible purpose? - **YES** → It's an Atom - **NO** → Continue ### Is it a Molecule? 3. ✅ Is it composed of 2-5 atoms? - **YES** → Likely a Molecule - **NO** → Continue 4. ✅ Does it serve a single, simple purpose? - **YES** → It's a Molecule - **NO** → Continue ### Is it an Organism? 5. ✅ Is it composed of multiple molecules and/or atoms? - **YES** → It's an Organism 6. ✅ 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: 1. **Identify component boundaries** - Look for logical groupings - Check Figma component instances - Identify repeated patterns 2. **Count the atoms** - How many basic elements does it contain? - 1 atom → Atom - 2-5 atoms → Molecule candidate - 6+ atoms → Organism candidate 3. **Assess complexity** - Simple structure → Atom or Molecule - Complex structure → Organism 4. **Check purpose** - Single, simple purpose → Atom or Molecule - Multiple purposes or section of UI → Organism 5. **Verify reusability** - Highly reusable across contexts → Atom or Molecule - Context-specific → Organism 6. **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:** ```tsx // This might feel too simple for a Molecule, but it's valid const IconButton = ({ icon, onClick }: Props) => ( ); ``` ### 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 1. **Better organization**: Easy to find components 2. **Improved reusability**: Atoms and Molecules are highly reusable 3. **Easier testing**: Smaller components are easier to test 4. **Consistent design**: Enforces design system patterns 5. **Team communication**: Shared vocabulary for discussing components 6. **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