# 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` ```markdown # 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` ```markdown # 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` ````markdown # 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:** ```json { "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:** ```json { "date": "2024-12-15", "title": "Morning Walk", "category": "walk", "assignedTo": "user_456" } ``` ### Data Models **Event Model:** ```typescript 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 ```javascript { 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: ```markdown ## Dependencies - **Feature:** `calendar-logic.feature.md` (interaction behavior) - **Feature:** `walk-assignment.feature.md` (event creation) ``` ### In Feature Files Reference related components: ```markdown ## 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