# 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/`