BMAD-METHOD/src/modules/wds/data/design-system/component-boundaries.md

6.1 KiB

Component Boundaries

Purpose: Guidelines for determining what constitutes a component.

Referenced by: Design system router, assessment flow


The Core Question

"Is this one component or multiple components?"

This is the most common design system challenge.


Guiding Principles

Principle 1: Single Responsibility

A component should do one thing well.

Good: Button component triggers actions Bad: Button component that also handles forms, navigation, and modals

Principle 2: Reusability

A component should be reusable across contexts.

Good: Input Field used in login, signup, profile forms Bad: Login-Specific Input Field that only works on login page

Principle 3: Independence

A component should work independently.

Good: Card component that can contain any content Bad: Card component that requires specific parent container


Common Boundary Questions

Q1: Icon in Button

Question: Is the icon part of the button or separate?

Answer: Depends on usage:

Part of Button (Variant):

Button Component:
  variants:
    - with-icon-left
    - with-icon-right
    - icon-only

When: Icon is always the same type (e.g., always arrow for navigation)

Separate Components:

Button Component: (text only)
Icon Component: (standalone)
Composition: Button + Icon

When: Icons vary widely, button can exist without icon

Recommendation: Start with variant, split if complexity grows.


Q2: Label with Input

Question: Is the label part of the input or separate?

Answer: Usually part of Input Field component:

Input Field Component:
  includes:
    - Label
    - Input element
    - Helper text
    - Error message

Reason: These always appear together in forms, form a semantic unit.


Q3: Card with Button

Question: Is the button part of the card?

Answer: Usually separate:

Card Component: (container)
Button Component: (action)
Composition: Card contains Button

Reason: Card is a container, button is an action. Different purposes.


Q4: Navigation Bar Items

Question: Is each nav item a component?

Answer: Depends on complexity:

Simple (Single Component):

Navigation Bar Component:
  includes: All nav items as configuration

Complex (Composition):

Navigation Bar: (container)
Navigation Item: (individual item)
Composition: Nav Bar contains Nav Items

Threshold: If nav items have complex individual behavior, split them.


Decision Framework

Step 1: Ask These Questions

  1. Can it exist independently?

    • Yes → Probably separate component
    • No → Probably part of parent
  2. Does it have its own states/behaviors?

    • Yes → Probably separate component
    • No → Probably part of parent
  3. Is it reused in different contexts?

    • Yes → Definitely separate component
    • No → Could be part of parent
  4. Does it have a clear single purpose?

    • Yes → Good component candidate
    • No → Might need to split further

Step 2: Consider Complexity

Low Complexity: Keep together

  • Icon in button
  • Label with input
  • Simple list items

High Complexity: Split apart

  • Complex nested structures
  • Independent behaviors
  • Different lifecycle

Step 3: Think About Maintenance

Together:

  • Easier to keep consistent
  • Component becomes complex

Apart:

  • Simpler components
  • More components to manage

Composition Patterns

Pattern 1: Container + Content

Container provides structure, content is flexible.

Card Component: (container)
  - Can contain: text, images, buttons, etc.
  - Provides: padding, border, shadow

Pattern 2: Compound Component

Multiple parts that work together.

Accordion Component:
  - Accordion Container
  - Accordion Item
  - Accordion Header
  - Accordion Content

Pattern 3: Atomic Component

Single, indivisible unit.

Button Component:
  - Cannot be broken down further
  - Self-contained

Red Flags

Too Many Variants

Warning: Component has 10+ variants

Problem: Probably multiple components disguised as variants

Solution: Split into separate components based on purpose

Conditional Complexity

Warning: Component has many "if this, then that" rules

Problem: Component doing too many things

Solution: Split into simpler, focused components

Context-Specific Behavior

Warning: Component behaves differently in different contexts

Problem: Not truly reusable

Solution: Create context-specific components or use composition


Examples

Example 1: Button

One Component:

Button:
  variants: primary, secondary, ghost
  states: default, hover, active, disabled, loading

Reason: All variants serve same purpose (trigger action), share behavior

Example 2: Input Types

Multiple Components:

Text Input: (text entry)
Select Dropdown: (choose from list)
Checkbox: (toggle option)
Radio: (choose one)

Reason: Different purposes, different behaviors, different HTML elements

Example 3: Modal

Compound Component:

Modal: (overlay + container)
Modal Header: (title + close button)
Modal Body: (content area)
Modal Footer: (actions)

Reason: Complex structure, but parts always used together


When in Doubt

Start simple:

  1. Create as single component
  2. Add variants as needed
  3. Split when complexity becomes painful

It's easier to split later than merge later.


Company Customization

Companies can define their own boundary rules:

# Acme Corp Component Boundaries

**Rule 1:** Icons are always separate components
**Rule 2:** Form fields include labels (never separate)
**Rule 3:** Cards never include actions (composition only)

Consistency within a company matters more than universal rules.


Use this guide when the design system router detects similarity and you need to decide: same component, variant, or new component?