COMPONENT-FILE-STRUCTURE.md 16 KB

Component File Structure

Modular Organization for Complex Components


Problem Statement

Complex components (calendars, calculators, graphs, interactive widgets) contain three distinct types of information that should be separated:

  1. Page Context - Where/how component appears on specific pages
  2. Design System - Visual design, states, Figma specifications
  3. Feature Logic - Interactive behavior, business rules, data flow

Current Issue: All three are mixed in page specifications, making them hard to maintain and reuse.


Proposed Structure

File Organization

project-root/
├─ Pages/                          # Page-specific context
│  ├─ 01-start-page.md
│  ├─ 02-calendar-page.md
│  └─ 03-profile-page.md
│
├─ Components/                     # Design System components
│  ├─ navigation-bar.component.md
│  ├─ feature-card.component.md
│  ├─ calendar-widget.component.md
│  └─ walk-scheduler.component.md
│
└─ Features/                       # Interactive logic & business rules
   ├─ calendar-logic.feature.md
   ├─ walk-assignment.feature.md
   ├─ notification-system.feature.md
   └─ user-permissions.feature.md

File Type Definitions

1. Page Files (Pages/*.md)

Purpose: Page-specific layout, component placement, and context

Contains:

  • Page metadata (URL, scenario, purpose)
  • Layout structure (sections, grid)
  • Component instances with page-specific config
  • Content in all languages
  • Navigation flow (entry/exit points)

Does NOT contain:

  • Component visual design (→ Components/)
  • Interactive logic (→ Features/)

Example: 02-calendar-page.md

# 02-calendar-page

**Scenario:** Manage Dog Care Schedule
**URL:** `/calendar`

## Layout Structure

### Header Section

- Component: `navigation-bar` (from Components/)
- Position: Top, full-width

### Main Content

- Component: `calendar-widget` (from Components/)
- Position: Center, 80% width
- Configuration:
  - View: Month
  - Start Day: Monday
  - Show: Walk assignments only
- Feature: `calendar-logic` (from Features/)

### Sidebar

- Component: `walk-scheduler` (from Components/)
- Position: Right, 20% width
- Feature: `walk-assignment` (from Features/)

## Content

**Page Title:**

- EN: "Family Dog Care Calendar"
- SE: "Familjens Hundvårdskalender"

2. Component Files (Components/*.md)

Purpose: Visual design, states, variants, Figma specifications

Contains:

  • Component name and purpose
  • Visual specifications (colors, spacing, typography)
  • States (default, hover, active, disabled, loading, error)
  • Variants (sizes, types, themes)
  • Figma component mapping
  • Responsive behavior
  • Accessibility requirements

Does NOT contain:

  • Business logic (→ Features/)
  • Page-specific placement (→ Pages/)

Example: calendar-widget.component.md

# Calendar Widget Component

**Type:** Complex Interactive Component
**Design System ID:** `calendar-widget`
**Figma Component:** `DS/Widgets/Calendar`

## Purpose

Displays a monthly calendar view with interactive date selection and event display.

## Visual Specifications

### Layout

- Grid: 7 columns (days) × 5-6 rows (weeks)
- Cell size: 48px × 48px (desktop), 40px × 40px (mobile)
- Gap: 4px between cells
- Padding: 16px container padding

### Typography

- Month/Year header: Large Heading (24px Bold)
- Day labels: Caption (12px Medium)
- Date numbers: Body Text (16px Regular)
- Event indicators: Caption (10px Regular)

### Colors

- Background: `--color-surface`
- Cell default: `--color-surface-elevated`
- Cell hover: `--color-surface-hover`
- Cell selected: `--color-primary`
- Cell today: `--color-accent`
- Cell disabled: `--color-surface-disabled`

## States

### Default State

- All dates visible
- Current month displayed
- Today highlighted with accent color
- No date selected

### Date Selected

- Selected date: Primary color background
- Date number: White text
- Border: 2px solid primary-dark

### Date Hover

- Background: Surface-hover color
- Cursor: Pointer
- Transition: 150ms ease

### Date Disabled (Past dates)

- Background: Surface-disabled
- Text: Gray-400
- Cursor: Not-allowed
- No hover effect

### Loading State

- Skeleton animation on date cells
- Month/year header visible
- Navigation disabled

### With Events

- Small dot indicator below date number
- Dot color: Event category color
- Max 3 dots visible per cell

## Variants

### Size Variants

- **Large:** 56px cells (desktop default)
- **Medium:** 48px cells (tablet)
- **Small:** 40px cells (mobile)

### View Variants

- **Month View:** Default, shows full month
- **Week View:** Shows 7 days in row
- **Day View:** Shows single day with hourly slots

## Figma Specifications

**Component Path:** `Design System > Widgets > Calendar`

**Variants to Create:**

- Size: Large / Medium / Small
- View: Month / Week / Day
- State: Default / Selected / Disabled / Loading

**Auto-layout:** Enabled
**Constraints:** Fill container width

## Responsive Behavior

### Mobile (< 768px)

- Use Small variant (40px cells)
- Stack month navigation vertically
- Reduce padding to 12px

### Tablet (768px - 1024px)

- Use Medium variant (48px cells)
- Horizontal month navigation
- Standard padding (16px)

### Desktop (> 1024px)

- Use Large variant (56px cells)
- Full navigation controls
- Increased padding (20px)

## Accessibility

- **Keyboard Navigation:**
  - Arrow keys: Navigate between dates
  - Enter/Space: Select date
  - Tab: Move to month navigation
- **Screen Readers:**
  - ARIA label: "Calendar, {Month} {Year}"
  - Each date: "Select {Day}, {Date} {Month}"
  - Selected date: "Selected, {Day}, {Date} {Month}"
- **Focus Management:**
  - Visible focus ring on keyboard navigation
  - Focus trap within calendar when open

## Dependencies

- **Features:** Requires `calendar-logic.feature.md` for interaction behavior
- **Data:** Expects events array from API

3. Feature Files (Features/*.md)

Purpose: Interactive logic, business rules, data flow, state management

Contains:

  • Feature name and purpose
  • User interactions and system responses
  • Business rules and validation
  • State transitions
  • Data requirements (API endpoints, data models)
  • Edge cases and error handling

Does NOT contain:

  • Visual design (→ Components/)
  • Page layout (→ Pages/)

Example: calendar-logic.feature.md

# Calendar Logic Feature

**Feature ID:** `calendar-logic`
**Type:** Interactive Widget Logic
**Complexity:** High

## Purpose

Manages calendar interactions, date selection, event display, and navigation between months/weeks/days.

## User Interactions

### Interaction 1: Select Date

**Trigger:** User clicks on a date cell

**Flow:**

1. User clicks date cell
2. System validates date is not disabled
3. System updates selected date state
4. System triggers `onDateSelect` callback with date
5. System highlights selected date
6. System updates related components (e.g., event list for that date)

**Business Rules:**

- Cannot select dates in the past (configurable)
- Cannot select dates beyond 1 year in future (configurable)
- Can only select one date at a time (single-select mode)
- Can select date range (range-select mode, if enabled)

**Edge Cases:**

- Clicking already selected date: Deselects it
- Clicking disabled date: No action, show tooltip
- Rapid clicking: Debounce to prevent multiple selections

### Interaction 2: Navigate to Next Month

**Trigger:** User clicks "Next Month" button

**Flow:**

1. User clicks next month button
2. System increments month by 1
3. System fetches events for new month (if needed)
4. System re-renders calendar with new month
5. System clears selected date (optional, configurable)
6. System updates month/year header

**Business Rules:**

- Cannot navigate beyond max date (1 year from today)
- Loading state shown while fetching events
- Previous selections cleared on month change

### Interaction 3: View Events for Date

**Trigger:** User hovers over date with event indicators

**Flow:**

1. User hovers over date cell with events
2. System shows tooltip with event summary
3. Tooltip displays: Event count, first 2 event titles
4. User can click to see full event list

**Business Rules:**

- Tooltip appears after 300ms hover
- Max 2 events shown in tooltip
- "And X more" shown if > 2 events

## State Management

### Component State

```javascript
{
  currentMonth: Date,           // Currently displayed month
  selectedDate: Date | null,    // User-selected date
  viewMode: 'month' | 'week' | 'day',
  events: Event[],              // Events for current view
  loading: boolean,             // Loading state
  error: string | null          // Error message
}
```

State Transitions

Initial State:

  • currentMonth: Current month
  • selectedDate: null
  • viewMode: 'month'
  • events: []
  • loading: false
  • error: null

On Date Select:

  • selectedDate: clicked date
  • Trigger callback: onDateSelect(date)

On Month Change:

  • currentMonth: new month
  • selectedDate: null (if clearOnMonthChange = true)
  • loading: true
  • Fetch events for new month
  • loading: false

On Error:

  • error: error message
  • loading: false
  • Show error state in UI

Data Requirements

API Endpoints

Get Events for Month

  • Method: GET
  • Path: /api/calendar/events?month={YYYY-MM}
  • Purpose: Fetch all events for specified month
  • Response:

    {
    "events": [
      {
        "id": "evt_123",
        "date": "2024-12-15",
        "title": "Morning Walk - Max",
        "category": "walk",
        "assignedTo": "user_456"
      }
    ]
    }
    

Create Event

  • Method: POST
  • Path: /api/calendar/events
  • Purpose: Create new calendar event
  • Request:

    {
    "date": "2024-12-15",
    "title": "Morning Walk",
    "category": "walk",
    "assignedTo": "user_456"
    }
    

Data Models

Event Model:

interface Event {
  id: string;
  date: string; // ISO date format
  title: string;
  category: 'walk' | 'feeding' | 'vet' | 'grooming';
  assignedTo: string; // User ID
  completed: boolean;
  notes?: string;
}

Validation Rules

Rule Validation Error Message
Date in past date < today "Cannot select past dates"
Date too far date > today + 365 days "Cannot select dates beyond 1 year"
Event title title.length > 0 && title.length <= 100 "Event title required (max 100 chars)"

Error Handling

Network Error (Failed to fetch events)

  • Trigger: API request fails
  • Action: Show error state in calendar
  • Message: "Unable to load events. Please try again."
  • Recovery: Retry button

Invalid Date Selection

  • Trigger: User attempts to select disabled date
  • Action: Show tooltip
  • Message: "This date is not available"
  • Recovery: Select different date

Configuration Options

{
  minDate: Date | null,          // Earliest selectable date
  maxDate: Date | null,          // Latest selectable date
  disablePastDates: boolean,     // Disable dates before today
  clearOnMonthChange: boolean,   // Clear selection on month change
  selectionMode: 'single' | 'range',
  showEventIndicators: boolean,  // Show dots for events
  fetchEventsOnMount: boolean,   // Auto-fetch on load
  onDateSelect: (date: Date) => void,
  onMonthChange: (month: Date) => void,
  onEventClick: (event: Event) => void
}

Dependencies

  • Component: calendar-widget.component.md (visual design)
  • Feature: walk-assignment.feature.md (for creating walk events)
  • API: Calendar Events API

    
    ---
    
    ## Benefits of This Structure
    
    ### 1. Separation of Concerns
    
    | Concern | File Type | Example |
    |---------|-----------|---------|
    | **Where** component appears | Page | `02-calendar-page.md` |
    | **How** component looks | Component | `calendar-widget.component.md` |
    | **What** component does | Feature | `calendar-logic.feature.md` |
    
    ### 2. Reusability
    
    **Component used on multiple pages:**
    

Pages/02-calendar-page.md → Components/calendar-widget.component.md Pages/05-dashboard.md → Components/calendar-widget.component.md ↓ Features/calendar-logic.feature.md


**Same component, different configurations:**
- Calendar Page: Month view, full-width
- Dashboard: Week view, sidebar widget

### 3. Team Collaboration

| Role | Primary Files | Secondary Files |
|------|---------------|-----------------|
| **UX Designer** | Components/ | Pages/ (layout) |
| **Developer** | Features/ | Components/ (implementation) |
| **Content Writer** | Pages/ | - |
| **Product Manager** | Features/ (rules) | Pages/ (flow) |

### 4. Maintainability

**Change visual design:**
- Edit: `Components/calendar-widget.component.md`
- Impact: All pages using calendar automatically updated

**Change business logic:**
- Edit: `Features/calendar-logic.feature.md`
- Impact: All instances of calendar use new logic

**Change page layout:**
- Edit: `Pages/02-calendar-page.md`
- Impact: Only that specific page

---

## File Naming Conventions

### Pages

{number}-{page-name}.md

Examples: 01-start-page.md 02-calendar-page.md 03-profile-settings.md


### Components

{component-name}.component.md

Examples: navigation-bar.component.md feature-card.component.md calendar-widget.component.md walk-scheduler.component.md


### Features

{feature-name}.feature.md

Examples: calendar-logic.feature.md walk-assignment.feature.md user-authentication.feature.md notification-system.feature.md


---

## Cross-Reference System

### In Page Files

Reference components and features:

```markdown
### Main Content Section

**Component:** `calendar-widget` (→ Components/calendar-widget.component.md)
**Feature:** `calendar-logic` (→ Features/calendar-logic.feature.md)
**Configuration:**
- View: Month
- Disable past dates: true

In Component Files

Reference required features:

## Dependencies

- **Feature:** `calendar-logic.feature.md` (interaction behavior)
- **Feature:** `walk-assignment.feature.md` (event creation)

In Feature Files

Reference related components:

## Dependencies

- **Component:** `calendar-widget.component.md` (visual implementation)
- **API:** Calendar Events API

Migration Strategy

Phase 1: Create Structure

  1. Create Components/ folder
  2. Create Features/ folder
  3. Keep existing Pages/ (or create if needed)

Phase 2: Extract Components

  1. Identify reusable components in page specs
  2. Create component files with visual design only
  3. Update page files to reference components

Phase 3: Extract Features

  1. Identify complex interactive logic
  2. Create feature files with business rules
  3. Update page and component files to reference features

Phase 4: Refactor Existing Pages

  1. Move visual specs → Components/
  2. Move logic → Features/
  3. Keep layout & content in Pages/

Example: Dog Week Calendar

Before (Monolithic)

Pages/02-calendar-page.md (500 lines)
├─ Page layout
├─ Calendar visual design
├─ Calendar interaction logic
├─ Walk scheduler visual design
├─ Walk assignment logic
├─ Navigation bar design
└─ All content in all languages

After (Modular)

Pages/02-calendar-page.md (100 lines)
├─ Page layout
├─ Component references
├─ Feature references
└─ Content in all languages

Components/calendar-widget.component.md (150 lines)
├─ Visual specifications
├─ States & variants
└─ Figma mapping

Components/walk-scheduler.component.md (100 lines)
├─ Visual specifications
└─ States & variants

Features/calendar-logic.feature.md (200 lines)
├─ Interaction flows
├─ Business rules
├─ Data requirements
└─ Error handling

Features/walk-assignment.feature.md (150 lines)
├─ Assignment logic
├─ Validation rules
└─ API integration

Result: Easier to maintain, reuse, and collaborate!


Summary

Three-tier architecture:

  1. Pages/ - Layout, placement, content (WHERE)
  2. Components/ - Visual design, states, Figma (HOW IT LOOKS)
  3. Features/ - Logic, rules, data (WHAT IT DOES)

Benefits:

  • ✅ Clear separation of concerns
  • ✅ Reusable components across pages
  • ✅ Maintainable business logic
  • ✅ Better team collaboration
  • ✅ Aligns with BMad v6 modular philosophy