698 lines
11 KiB
Markdown
698 lines
11 KiB
Markdown
# Figma Component Structure for WDS
|
|
|
|
**Purpose:** Guidelines for organizing and structuring components in Figma for seamless WDS integration.
|
|
|
|
**Referenced by:** Mode B (Custom Design System) workflows
|
|
|
|
---
|
|
|
|
## Core Principle
|
|
|
|
**Figma components should mirror WDS component structure** to enable seamless synchronization and specification generation.
|
|
|
|
```
|
|
Figma Component → WDS Component Specification → React Implementation
|
|
```
|
|
|
|
---
|
|
|
|
## Component Organization in Figma
|
|
|
|
### File Structure
|
|
|
|
**Recommended Figma file organization:**
|
|
|
|
```
|
|
Design System File (Figma)
|
|
├── 📄 Cover (project info)
|
|
├── 🎨 Foundation
|
|
│ ├── Colors
|
|
│ ├── Typography
|
|
│ ├── Spacing
|
|
│ └── Effects
|
|
├── ⚛️ Components
|
|
│ ├── Buttons
|
|
│ ├── Inputs
|
|
│ ├── Cards
|
|
│ └── [other component types]
|
|
└── 📱 Examples
|
|
└── Component usage examples
|
|
```
|
|
|
|
**Benefits:**
|
|
|
|
- Clear organization
|
|
- Easy navigation
|
|
- Matches WDS structure
|
|
- Facilitates MCP integration
|
|
|
|
---
|
|
|
|
## Component Naming Convention
|
|
|
|
### Format
|
|
|
|
**Pattern:** `[ComponentType]/[ComponentName]`
|
|
|
|
**Examples:**
|
|
|
|
```
|
|
Button/Primary
|
|
Button/Secondary
|
|
Button/Ghost
|
|
Input/Text
|
|
Input/Email
|
|
Card/Profile
|
|
Card/Content
|
|
```
|
|
|
|
**Rules:**
|
|
|
|
- Use forward slash for hierarchy
|
|
- Title case for names
|
|
- Match WDS component names
|
|
- Consistent across all components
|
|
|
|
---
|
|
|
|
## Component Properties
|
|
|
|
### Required Properties
|
|
|
|
**Every component must have:**
|
|
|
|
1. **Description**
|
|
- Component purpose
|
|
- When to use
|
|
- WDS component ID (e.g., "btn-001")
|
|
|
|
2. **Variants**
|
|
- Organized by property
|
|
- Clear naming
|
|
- All states included
|
|
|
|
3. **Auto Layout**
|
|
- Proper spacing
|
|
- Responsive behavior
|
|
- Padding/gap values
|
|
|
|
**Example Description:**
|
|
|
|
```
|
|
Button Primary [btn-001]
|
|
|
|
Primary action button for main user actions.
|
|
Use for: Submit forms, confirm actions, proceed to next step.
|
|
|
|
WDS Component: Button.primary [btn-001]
|
|
```
|
|
|
|
---
|
|
|
|
## Variant Structure
|
|
|
|
### Organizing Variants
|
|
|
|
**Use Figma's variant properties:**
|
|
|
|
**Property 1: Type** (variant)
|
|
|
|
- Primary
|
|
- Secondary
|
|
- Ghost
|
|
- Outline
|
|
|
|
**Property 2: Size**
|
|
|
|
- Small
|
|
- Medium
|
|
- Large
|
|
|
|
**Property 3: State**
|
|
|
|
- Default
|
|
- Hover
|
|
- Active
|
|
- Disabled
|
|
- Loading
|
|
|
|
**Property 4: Icon** (optional)
|
|
|
|
- None
|
|
- Left
|
|
- Right
|
|
- Only
|
|
|
|
**Result:** Figma generates all combinations automatically
|
|
|
|
---
|
|
|
|
### Variant Naming
|
|
|
|
**Format:** `Property=Value`
|
|
|
|
**Examples:**
|
|
|
|
```
|
|
Type=Primary, Size=Medium, State=Default
|
|
Type=Primary, Size=Medium, State=Hover
|
|
Type=Secondary, Size=Large, State=Disabled
|
|
```
|
|
|
|
**Benefits:**
|
|
|
|
- Clear property structure
|
|
- Easy to find specific variants
|
|
- MCP can parse programmatically
|
|
- Matches WDS variant system
|
|
|
|
---
|
|
|
|
## State Documentation
|
|
|
|
### Required States
|
|
|
|
**Interactive Components (Buttons, Links):**
|
|
|
|
- Default
|
|
- Hover
|
|
- Active (pressed)
|
|
- Disabled
|
|
- Focus (optional)
|
|
- Loading (optional)
|
|
|
|
**Form Components (Inputs, Selects):**
|
|
|
|
- Default (empty)
|
|
- Focus (active)
|
|
- Filled (has content)
|
|
- Disabled
|
|
- Error
|
|
- Success (optional)
|
|
|
|
**Feedback Components (Alerts, Toasts):**
|
|
|
|
- Default
|
|
- Success
|
|
- Error
|
|
- Warning
|
|
- Info
|
|
|
|
---
|
|
|
|
### State Visual Indicators
|
|
|
|
**Document state changes:**
|
|
|
|
**Hover:**
|
|
|
|
- Background color change
|
|
- Border change
|
|
- Shadow change
|
|
- Scale change
|
|
- Cursor change
|
|
|
|
**Active:**
|
|
|
|
- Background color (darker)
|
|
- Scale (slightly smaller)
|
|
- Shadow (reduced)
|
|
|
|
**Disabled:**
|
|
|
|
- Opacity (0.5-0.6)
|
|
- Cursor (not-allowed)
|
|
- Grayscale (optional)
|
|
|
|
**Loading:**
|
|
|
|
- Spinner/progress indicator
|
|
- Disabled interaction
|
|
- Loading text
|
|
|
|
---
|
|
|
|
## Design Tokens in Figma
|
|
|
|
### Using Figma Variables
|
|
|
|
**Map Figma variables to WDS tokens:**
|
|
|
|
**Colors:**
|
|
|
|
```
|
|
Figma Variable → WDS Token
|
|
primary/500 → color-primary-500
|
|
gray/900 → color-gray-900
|
|
success/600 → color-success-600
|
|
```
|
|
|
|
**Typography:**
|
|
|
|
```
|
|
Figma Style → WDS Token
|
|
Text/Display → text-display
|
|
Text/Heading-1 → text-heading-1
|
|
Text/Body → text-body
|
|
```
|
|
|
|
**Spacing:**
|
|
|
|
```
|
|
Figma Variable → WDS Token
|
|
spacing/2 → spacing-2
|
|
spacing/4 → spacing-4
|
|
spacing/8 → spacing-8
|
|
```
|
|
|
|
**Effects:**
|
|
|
|
```
|
|
Figma Effect → WDS Token
|
|
shadow/sm → shadow-sm
|
|
shadow/md → shadow-md
|
|
radius/md → radius-md
|
|
```
|
|
|
|
---
|
|
|
|
## Component Documentation
|
|
|
|
### Component Description Template
|
|
|
|
```
|
|
[Component Name] [component-id]
|
|
|
|
**Purpose:** [Brief description]
|
|
|
|
**When to use:**
|
|
- [Use case 1]
|
|
- [Use case 2]
|
|
|
|
**When not to use:**
|
|
- [Anti-pattern 1]
|
|
- [Anti-pattern 2]
|
|
|
|
**WDS Component:** [ComponentType].[variant] [component-id]
|
|
|
|
**Variants:** [List of variants]
|
|
**States:** [List of states]
|
|
**Size:** [Available sizes]
|
|
|
|
**Accessibility:**
|
|
- [ARIA attributes]
|
|
- [Keyboard support]
|
|
- [Screen reader behavior]
|
|
```
|
|
|
|
**Example:**
|
|
|
|
```
|
|
Button Primary [btn-001]
|
|
|
|
**Purpose:** Trigger primary actions in the interface
|
|
|
|
**When to use:**
|
|
- Submit forms
|
|
- Confirm important actions
|
|
- Proceed to next step
|
|
- Primary call-to-action
|
|
|
|
**When not to use:**
|
|
- Secondary actions (use Button Secondary)
|
|
- Destructive actions (use Button Destructive)
|
|
- Navigation (use Link component)
|
|
|
|
**WDS Component:** Button.primary [btn-001]
|
|
|
|
**Variants:** primary, secondary, ghost, outline
|
|
**States:** default, hover, active, disabled, loading
|
|
**Size:** small, medium, large
|
|
|
|
**Accessibility:**
|
|
- role="button"
|
|
- aria-disabled when disabled
|
|
- aria-busy when loading
|
|
- Keyboard: Enter/Space to activate
|
|
```
|
|
|
|
---
|
|
|
|
## Auto Layout Best Practices
|
|
|
|
### Spacing
|
|
|
|
**Use consistent spacing values:**
|
|
|
|
- Padding: 8px, 12px, 16px, 24px
|
|
- Gap: 4px, 8px, 12px, 16px
|
|
- Match WDS spacing tokens
|
|
|
|
**Auto Layout Settings:**
|
|
|
|
- Horizontal/Vertical alignment
|
|
- Padding (all sides or specific)
|
|
- Gap between items
|
|
- Resizing behavior
|
|
|
|
---
|
|
|
|
### Resizing Behavior
|
|
|
|
**Set appropriate constraints:**
|
|
|
|
**Buttons:**
|
|
|
|
- Hug contents (width)
|
|
- Fixed height
|
|
- Min width for touch targets (44px)
|
|
|
|
**Inputs:**
|
|
|
|
- Fill container (width)
|
|
- Fixed height (40-48px)
|
|
- Responsive to content
|
|
|
|
**Cards:**
|
|
|
|
- Fill container or fixed width
|
|
- Hug contents (height)
|
|
- Responsive to content
|
|
|
|
---
|
|
|
|
## Component Instances
|
|
|
|
### Creating Instances
|
|
|
|
**Best practices:**
|
|
|
|
- Always use component instances (not detached)
|
|
- Override only necessary properties
|
|
- Maintain connection to main component
|
|
- Document overrides if needed
|
|
|
|
**Overridable Properties:**
|
|
|
|
- Text content
|
|
- Icons
|
|
- Colors (if using variables)
|
|
- Spacing (if needed)
|
|
|
|
**Non-Overridable:**
|
|
|
|
- Structure
|
|
- Layout
|
|
- Core styling
|
|
- States
|
|
|
|
---
|
|
|
|
## Figma to WDS Mapping
|
|
|
|
### Component ID System
|
|
|
|
**Add WDS component ID to Figma:**
|
|
|
|
**In component description:**
|
|
|
|
```
|
|
Button Primary [btn-001]
|
|
```
|
|
|
|
**In component name:**
|
|
|
|
```
|
|
Button/Primary [btn-001]
|
|
```
|
|
|
|
**Benefits:**
|
|
|
|
- Easy to find components
|
|
- Clear WDS mapping
|
|
- MCP can extract ID
|
|
- Bidirectional sync
|
|
|
|
---
|
|
|
|
### Node ID Tracking
|
|
|
|
**Figma generates unique node IDs:**
|
|
|
|
**Format:**
|
|
|
|
```
|
|
figma://file/[file-id]/node/[node-id]
|
|
```
|
|
|
|
**How to get node ID:**
|
|
|
|
1. Select component in Figma
|
|
2. Right-click → "Copy link to selection"
|
|
3. Extract node ID from URL
|
|
|
|
**Store in WDS:**
|
|
|
|
```yaml
|
|
# D-Design-System/figma-mappings.md
|
|
Button [btn-001] → figma://file/abc123/node/456:789
|
|
Input [inp-001] → figma://file/abc123/node/456:790
|
|
```
|
|
|
|
---
|
|
|
|
## Sync Workflow
|
|
|
|
### Figma → WDS
|
|
|
|
**When component is created/updated in Figma:**
|
|
|
|
1. Designer creates/updates component
|
|
2. Designer adds WDS component ID to description
|
|
3. MCP reads component via Figma API
|
|
4. MCP extracts:
|
|
- Component structure
|
|
- Variants
|
|
- States
|
|
- Properties
|
|
- Design tokens used
|
|
5. MCP generates/updates WDS specification
|
|
6. Designer reviews and confirms
|
|
|
|
---
|
|
|
|
### WDS → Figma
|
|
|
|
**When specification is updated in WDS:**
|
|
|
|
1. Specification updated in WDS
|
|
2. Designer notified of changes
|
|
3. Designer updates Figma component
|
|
4. Designer confirms sync
|
|
5. Node ID verified/updated
|
|
|
|
**Note:** This is semi-automated. Full automation requires Figma API write access.
|
|
|
|
---
|
|
|
|
## Quality Checklist
|
|
|
|
### Component Creation
|
|
|
|
- [ ] Component name follows convention
|
|
- [ ] WDS component ID in description
|
|
- [ ] All variants defined
|
|
- [ ] All states documented
|
|
- [ ] Auto layout properly configured
|
|
- [ ] Design tokens used (not hardcoded values)
|
|
- [ ] Accessibility notes included
|
|
- [ ] Usage guidelines documented
|
|
|
|
### Variant Structure
|
|
|
|
- [ ] Variants organized by properties
|
|
- [ ] Property names clear and consistent
|
|
- [ ] All combinations make sense
|
|
- [ ] No redundant variants
|
|
- [ ] States properly differentiated
|
|
|
|
### Documentation
|
|
|
|
- [ ] Purpose clearly stated
|
|
- [ ] When to use documented
|
|
- [ ] When not to use documented
|
|
- [ ] Accessibility requirements noted
|
|
- [ ] Examples provided
|
|
|
|
---
|
|
|
|
## Common Mistakes to Avoid
|
|
|
|
### ❌ Mistake 1: Hardcoded Values
|
|
|
|
**Wrong:**
|
|
|
|
```
|
|
Background: #2563eb (hardcoded hex)
|
|
Padding: 16px (hardcoded value)
|
|
```
|
|
|
|
**Right:**
|
|
|
|
```
|
|
Background: primary/600 (variable)
|
|
Padding: spacing/4 (variable)
|
|
```
|
|
|
|
### ❌ Mistake 2: Detached Instances
|
|
|
|
**Wrong:**
|
|
|
|
- Detaching component instances
|
|
- Losing connection to main component
|
|
- Manual updates required
|
|
|
|
**Right:**
|
|
|
|
- Always use instances
|
|
- Override only necessary properties
|
|
- Maintain component connection
|
|
|
|
### ❌ Mistake 3: Inconsistent Naming
|
|
|
|
**Wrong:**
|
|
|
|
```
|
|
btn-primary
|
|
ButtonSecondary
|
|
button_ghost
|
|
```
|
|
|
|
**Right:**
|
|
|
|
```
|
|
Button/Primary
|
|
Button/Secondary
|
|
Button/Ghost
|
|
```
|
|
|
|
### ❌ Mistake 4: Missing States
|
|
|
|
**Wrong:**
|
|
|
|
- Only default state
|
|
- No hover/active states
|
|
- No disabled state
|
|
|
|
**Right:**
|
|
|
|
- All required states
|
|
- Visual differentiation
|
|
- State transitions documented
|
|
|
|
### ❌ Mistake 5: No WDS Component ID
|
|
|
|
**Wrong:**
|
|
|
|
```
|
|
Button Primary
|
|
(no component ID)
|
|
```
|
|
|
|
**Right:**
|
|
|
|
```
|
|
Button Primary [btn-001]
|
|
(clear WDS mapping)
|
|
```
|
|
|
|
---
|
|
|
|
## Examples
|
|
|
|
### Button Component in Figma
|
|
|
|
**Component Name:** `Button/Primary [btn-001]`
|
|
|
|
**Description:**
|
|
|
|
```
|
|
Button Primary [btn-001]
|
|
|
|
Primary action button for main user actions.
|
|
|
|
WDS Component: Button.primary [btn-001]
|
|
Variants: primary, secondary, ghost, outline
|
|
States: default, hover, active, disabled, loading
|
|
Sizes: small, medium, large
|
|
```
|
|
|
|
**Variants:**
|
|
|
|
```
|
|
Type=Primary, Size=Medium, State=Default
|
|
Type=Primary, Size=Medium, State=Hover
|
|
Type=Primary, Size=Medium, State=Active
|
|
Type=Primary, Size=Medium, State=Disabled
|
|
Type=Primary, Size=Large, State=Default
|
|
[... all combinations]
|
|
```
|
|
|
|
**Properties:**
|
|
|
|
- Auto Layout: Horizontal
|
|
- Padding: 16px (horizontal), 12px (vertical)
|
|
- Gap: 8px (if icon)
|
|
- Border Radius: 8px
|
|
- Background: primary/600 (variable)
|
|
|
|
---
|
|
|
|
### Input Component in Figma
|
|
|
|
**Component Name:** `Input/Text [inp-001]`
|
|
|
|
**Description:**
|
|
|
|
```
|
|
Input Text [inp-001]
|
|
|
|
Text input field for user data entry.
|
|
|
|
WDS Component: Input.text [inp-001]
|
|
States: default, focus, filled, disabled, error, success
|
|
```
|
|
|
|
**Variants:**
|
|
|
|
```
|
|
State=Default
|
|
State=Focus
|
|
State=Filled
|
|
State=Disabled
|
|
State=Error
|
|
State=Success
|
|
```
|
|
|
|
**Properties:**
|
|
|
|
- Auto Layout: Horizontal
|
|
- Padding: 12px
|
|
- Height: 44px (fixed)
|
|
- Border: 1px solid gray/300
|
|
- Border Radius: 8px
|
|
- Background: white
|
|
|
|
---
|
|
|
|
## Further Reading
|
|
|
|
- **Figma MCP Integration:** `figma-mcp-integration.md`
|
|
- **Designer Guide:** `figma-designer-guide.md`
|
|
- **Token Architecture:** `token-architecture.md`
|
|
- **Component Boundaries:** `component-boundaries.md`
|
|
|
|
---
|
|
|
|
**This structure enables seamless Figma ↔ WDS integration and maintains design system consistency across tools.**
|