# Component Styling Guidelines - ROA2WEB **Last Updated:** 2025-11-18 **Phase:** 3 - PrimeVue Centralization --- ## 🎯 Core Principles ### 1. **NEVER Use `:deep()` in Components** ❌ **NEVER Do This:** ```vue ``` ✅ **Always Do This:** PrimeVue components are styled globally in `assets/css/vendor/primevue-overrides.css`. Use classes, not deep overrides: ```vue ``` --- ### 2. **Use Design Tokens, Not Hardcoded Values** ❌ **NEVER Do This:** ```vue ``` ✅ **Always Do This:** ```vue ``` **Available Design Tokens:** See `assets/css/core/variables.css` --- ### 3. **Minimize `!important` Usage** #### ✅ **Acceptable Use Cases:** 1. **Global PrimeVue Overrides** (`primevue-overrides.css`): ```css .p-inputtext { border: 2px solid var(--color-border) !important; } ``` 2. **Print Styles** (`@media print`): ```css @media print { .dashboard-table th { background: var(--color-bg-muted) !important; color: #000 !important; } } ``` 3. **Critical PrimeVue Component Overrides** (rare): ```vue ``` #### ❌ **NEVER Do This:** ```vue ``` --- ## 📁 File Organization ### Where to Put Styles 1. **Component-Specific Styles** → ` ``` --- ## 🔄 DataTable Row Styling ### Global Row Classes (App.vue) Custom row classes for DataTables are defined globally in `App.vue`: ```css /* src/App.vue - unscoped styles */ .p-datatable .p-datatable-tbody > tr.invoice-paid { background-color: var(--green-50); color: var(--green-900); } .p-datatable .p-datatable-tbody > tr.invoice-overdue { background-color: var(--red-50); color: var(--red-900); } .p-datatable .p-datatable-tbody > tr.bank-row { background-color: var(--blue-50); } .p-datatable .p-datatable-tbody > tr.cash-row { background-color: var(--yellow-50); } ``` ### Component Usage ```vue ``` --- ## 📐 Design Tokens Reference ### Colors ```css /* Primary */ --color-primary: #2563eb --color-primary-light: #3b82f6 --color-primary-dark: #1d4ed8 /* Semantic */ --color-success: #059669 --color-warning: #d97706 --color-error: #dc2626 --color-info: #0891b2 /* Text */ --color-text: #111827 --color-text-secondary: #6b7280 --color-text-muted: #9ca3af --color-text-inverse: #ffffff /* Backgrounds */ --color-bg: #ffffff --color-bg-secondary: #f9fafb --color-bg-muted: #f3f4f6 /* Borders */ --color-border: #e5e7eb --color-border-light: #f3f4f6 --color-border-dark: #d1d5db ``` ### Spacing ```css --space-xs: 0.25rem /* 4px */ --space-sm: 0.5rem /* 8px */ --space-md: 1rem /* 16px */ --space-lg: 1.5rem /* 24px */ --space-xl: 2rem /* 32px */ --space-2xl: 3rem /* 48px */ ``` ### Border Radius ```css --radius-sm: 0.25rem /* 4px */ --radius-md: 0.5rem /* 8px */ --radius-lg: 0.75rem /* 12px */ --radius-xl: 1rem /* 16px */ --radius-full: 9999px ``` ### Transitions ```css --transition-fast: 150ms ease --transition-normal: 250ms ease --transition-slow: 350ms ease ``` **Full Reference:** `src/assets/css/core/variables.css` --- ## ✅ Phase 3 Achievements - ✅ **Zero `:deep()` in Components** - All migrated to global CSS - ✅ **Zero Hardcoded CSS Colors** - All use design tokens - ✅ **Centralized PrimeVue Styling** - Single source in `primevue-overrides.css` - ✅ **Documented `!important` Usage** - Clear acceptable use cases - ✅ **Build Successful** - Zero breaking changes --- ## 🚫 Common Mistakes to Avoid ### 1. Duplicating Global Styles ❌ **Wrong:** ```vue ``` ✅ **Correct:** ```vue ``` ### 2. Overriding PrimeVue in Components ❌ **Wrong:** ```vue ``` ✅ **Correct:** Add to `assets/css/vendor/primevue-overrides.css` instead. ### 3. Using Hardcoded Colors ❌ **Wrong:** ```vue ``` ✅ **Correct:** ```vue ``` --- ## 📚 Related Documentation - **Form Patterns:** `docs/FORM_TEMPLATE.md` - **Design Tokens:** `src/assets/css/core/variables.css` - **PrimeVue Overrides:** `src/assets/css/vendor/primevue-overrides.css` - **Phase 3 Plan:** `features/phases/phase-3-primevue.md` --- **Questions?** Check the CSS Refactoring documentation in `features/`