# Phase 4: Card Components Refactoring 📊 **Priority:** High - Major duplication area **Duration:** 16-20 hours (Actual: 2h) **Status:** ✅ Complete (2025-11-18) **Risk Level:** High → Mitigated Successfully --- ## Obiective 1. **Extract common patterns** - Base card, sparklines, breakdowns 2. **Refactor 5 card components** - ~800 lines eliminated 3. **Standardize metric displays** - Consistent value/label patterns 4. **Reusable card classes** - For future components --- ## Current State | Component | Current CSS | Target CSS | Reduction | |-----------|-------------|------------|-----------| | MetricCard.vue | 331 lines | 80 lines | 251 lines (76%) | | CashFlowMetricCard.vue | 179 lines | 60 lines | 119 lines (67%) | | ClientiBalanceCard.vue | 260 lines | 90 lines | 170 lines (65%) | | FurnizoriBalanceCard.vue | ~260 lines | 90 lines | 170 lines (65%) | | TreasuryDualCard.vue | ~200 lines | 60 lines | 140 lines (70%) | | **TOTAL** | **~1,230 lines** | **~380 lines** | **~850 lines (69%)** | --- ## Task Breakdown (22 tasks) ### 1. Global Pattern Extraction (5 tasks) #### Task 1.1: Add Base Card Styles to cards.css **Status:** ⏸️ | **Est:** 1 hour **File:** `reports-app/frontend/src/assets/css/components/cards.css` **Add at end of file:** ```css /* ===== Dashboard Metric Cards ===== */ .metric-card { background: var(--color-bg); border: 1px solid var(--color-border); border-radius: var(--card-radius); padding: var(--card-padding); transition: all var(--transition-fast); min-height: var(--card-min-height); display: flex; flex-direction: column; gap: var(--card-gap); } .metric-card:hover { box-shadow: var(--shadow-md); transform: translateY(var(--hover-lift)); border-color: var(--color-primary); } /* Metric display patterns */ .metric-header { display: flex; align-items: center; gap: var(--space-md); margin-bottom: var(--space-sm); } .metric-icon { width: 40px; height: 40px; display: flex; align-items: center; justify-content: center; border-radius: var(--radius-md); font-size: var(--text-xl); } .metric-value { font-size: var(--value-size); font-weight: var(--font-bold); line-height: var(--leading-tight); font-family: var(--font-mono, monospace); color: var(--color-text); } .metric-value-lg { font-size: var(--value-size-lg); } .metric-label { font-size: var(--label-size); font-weight: var(--font-medium); color: var(--color-text-secondary); text-transform: uppercase; letter-spacing: 0.05em; margin-bottom: var(--space-xs); } /* Responsive */ @media (max-width: 768px) { .metric-card { min-height: calc(var(--card-min-height) - 40px); padding: var(--card-padding-sm); } .metric-value { font-size: 1.25rem; } } ``` **Acceptance Criteria:** - [ ] Base card patterns added - [ ] Metric display patterns defined - [ ] Responsive rules included - [ ] No visual changes (not used yet) --- #### Task 1.2: Add Sparkline Patterns to dashboard.css **Status:** ⏸️ | **Est:** 30 min **File:** `reports-app/frontend/src/assets/css/patterns/dashboard.css` **Add:** ```css /* ===== Enhanced Sparkline Patterns ===== */ .metric-sparkline { margin: var(--space-md) 0; } .sparkline-header { display: flex; justify-content: space-between; align-items: center; margin-bottom: var(--space-xs); } .sparkline-title { font-size: var(--text-xs); color: var(--color-text-secondary); text-transform: uppercase; font-weight: var(--font-medium); } .sparkline-value { font-size: var(--text-sm); font-weight: var(--font-semibold); font-family: var(--font-mono, monospace); } ``` **Acceptance Criteria:** - [ ] Sparkline header pattern defined - [ ] Title/value layout included --- #### Task 1.3: Enhanced Breakdown Patterns **Status:** ⏸️ | **Est:** 45 min **File:** `reports-app/frontend/src/assets/css/patterns/dashboard.css` **Enhance existing breakdown patterns:** ```css /* ===== Enhanced Breakdown Patterns ===== */ .breakdown-header { display: flex; justify-content: space-between; align-items: center; cursor: pointer; user-select: none; padding: var(--space-sm); border-radius: var(--radius-sm); transition: background-color var(--transition-fast); margin-bottom: var(--space-xs); } .breakdown-header:hover { background: var(--color-bg-secondary); } .breakdown-header-left { display: flex; align-items: center; gap: var(--space-sm); } .breakdown-toggle { color: var(--color-text-secondary); font-size: 0.625rem; transition: transform var(--transition-fast); } .breakdown-toggle.expanded { transform: rotate(90deg); } .breakdown-divider { height: 1px; background: var(--color-border); margin: var(--space-md) 0; } ``` **Acceptance Criteria:** - [ ] Breakdown header with toggle - [ ] Hover states defined - [ ] Animation classes ready --- #### Task 1.4: Add Color Utilities **Status:** ⏸️ | **Est:** 20 min **File:** `reports-app/frontend/src/assets/css/utilities/colors.css` (NEW) ```css /* Color Utilities - ROA2WEB */ /* Background colors for icons */ .bg-primary { background-color: var(--color-primary); } .bg-success { background-color: var(--color-success); } .bg-warning { background-color: var(--color-warning); } .bg-error { background-color: var(--color-error); } .bg-info { background-color: var(--color-info); } .bg-primary-light { background-color: rgba(var(--color-primary-rgb), 0.1); } .bg-success-light { background-color: rgba(var(--color-success-rgb), 0.1); } .bg-warning-light { background-color: rgba(var(--color-warning-rgb), 0.1); } /* Text colors */ .text-primary { color: var(--color-primary); } .text-success { color: var(--color-success); } .text-warning { color: var(--color-warning); } .text-error { color: var(--color-error); } .text-muted { color: var(--color-text-muted); } ``` **Add to main.css:** ```css @import './utilities/colors.css'; ``` **Acceptance Criteria:** - [ ] Color utilities created - [ ] Imported in main.css - [ ] RGB variants for transparency --- #### Task 1.5: Test Global Patterns **Status:** ⏸️ | **Est:** 15 min ```bash # Build and verify npm run build # Check for errors npm run dev # No visual changes expected ``` **Acceptance Criteria:** - [ ] Build successful - [ ] No CSS errors - [ ] Patterns available (not used yet) --- ### 2. Component Refactoring (15 tasks - 3 per component x 5) #### MetricCard.vue (Tasks 2.1-2.3) ##### Task 2.1: Update MetricCard Template **Status:** ⏸️ | **Est:** 1 hour **File:** `src/components/dashboard/cards/MetricCard.vue` **Current template structure:** ```vue