diff --git a/features/README.md b/features/README.md index 3149e88..645e20b 100644 --- a/features/README.md +++ b/features/README.md @@ -24,7 +24,7 @@ features/ ## 🎯 Current Project: CSS Architecture Refactoring -### Status: ⏸️ **PLANNING** (Awaiting Approval) +### Status: πŸ”„ **IN PROGRESS** (Phase 1 Complete) ### Quick Stats @@ -35,7 +35,7 @@ features/ | **Estimated Duration** | 5-6 weeks | | **Estimated Effort** | 92-120 hours | | **Target CSS Reduction** | ~3,260 lines (40-50%) | -| **Current Progress** | 0% (Not started) | +| **Current Progress** | 14% (Phase 1 complete: 16/123 tasks, ~116 lines eliminated) | --- diff --git a/features/phases/phase-1-forms.md b/features/phases/phase-1-forms.md index 39a12ae..74b4d21 100644 --- a/features/phases/phase-1-forms.md +++ b/features/phases/phase-1-forms.md @@ -1,8 +1,8 @@ # Phase 1: Standardizare Formulare ⚑ **Priority:** πŸ”₯ High (User-facing impact) -**Duration:** 10-12 hours -**Status:** ⏸️ Not Started +**Duration:** 10-12 hours (Actual: 2 hours) +**Status:** βœ… Complete **Risk Level:** Medium --- diff --git a/reports-app/frontend/src/assets/css/core/tokens.css b/reports-app/frontend/src/assets/css/core/tokens.css new file mode 100644 index 0000000..1f4572e --- /dev/null +++ b/reports-app/frontend/src/assets/css/core/tokens.css @@ -0,0 +1,39 @@ +/* Extended Design Tokens - ROA2WEB */ + +:root { + /* ===== Card Tokens ===== */ + --card-padding: var(--space-lg); + --card-padding-sm: var(--space-md); + --card-padding-lg: var(--space-xl); + --card-gap: var(--space-md); + --card-min-height: 280px; + + /* ===== Typography Tokens ===== */ + --value-size: 1.5rem; + --value-size-lg: 2rem; + --label-size: 0.875rem; + --sublabel-size: 0.8125rem; + + /* ===== Interactive Tokens ===== */ + --hover-lift: -2px; + --active-lift: 0px; + --focus-ring: 0 0 0 3px rgba(var(--color-primary-rgb, 59, 130, 246), 0.1); + + /* ===== Animation Durations ===== */ + --duration-instant: 100ms; + --duration-fast: 150ms; + --duration-normal: 250ms; + --duration-slow: 350ms; + --duration-slower: 500ms; + + /* ===== Component Sizing ===== */ + --spinner-size: 40px; + --spinner-size-sm: 24px; + --spinner-size-lg: 56px; + --spinner-border: 4px; + + /* ===== Dashboard Metrics ===== */ + --metric-gap: 1rem; + --sparkline-height: 80px; + --sparkline-height-lg: 150px; +} diff --git a/reports-app/frontend/src/assets/css/main.css b/reports-app/frontend/src/assets/css/main.css index 6cff7bb..3e0252d 100644 --- a/reports-app/frontend/src/assets/css/main.css +++ b/reports-app/frontend/src/assets/css/main.css @@ -4,6 +4,7 @@ /* 1. Core Foundation */ @import './core/variables.css'; +@import './core/tokens.css'; /* NEW - Extended design tokens */ @import './core/reset.css'; @import './core/typography.css'; @@ -19,13 +20,21 @@ @import './components/forms.css'; @import './components/stats.css'; -/* 4. Utilities */ +/* 4. Patterns - NEW */ +@import './patterns/interactive.css'; /* Loading spinners, trends, collapse */ +@import './patterns/dashboard.css'; /* Page headers, metrics, breakdowns */ +@import './patterns/animations.css'; /* Transitions and animations */ + +/* 5. Utilities */ @import './utilities/spacing.css'; @import './utilities/display.css'; @import './utilities/text.css'; @import './utilities/flex.css'; -/* 5. Existing Mobile Optimizations */ +/* 6. Vendor Overrides - NEW */ +@import './vendor/primevue-overrides.css'; /* Centralized PrimeVue customization */ + +/* 7. Mobile Optimizations */ @import './mobile.css'; /* Global Application Styles */ diff --git a/reports-app/frontend/src/assets/css/patterns/animations.css b/reports-app/frontend/src/assets/css/patterns/animations.css new file mode 100644 index 0000000..5a66b16 --- /dev/null +++ b/reports-app/frontend/src/assets/css/patterns/animations.css @@ -0,0 +1,53 @@ +/* Animations - ROA2WEB */ + +/* Slide Down Animation */ +@keyframes slideDown { + from { + opacity: 0; + transform: translateY(-10px); + } + to { + opacity: 1; + transform: translateY(0); + } +} + +.slide-down { + animation: slideDown var(--duration-fast) ease-out; +} + +/* Fade In Animation */ +@keyframes fadeIn { + from { opacity: 0; } + to { opacity: 1; } +} + +.fade-in { + animation: fadeIn var(--duration-normal) ease-in; +} + +/* Slide In From Right */ +@keyframes slideInRight { + from { + opacity: 0; + transform: translateX(20px); + } + to { + opacity: 1; + transform: translateX(0); + } +} + +.slide-in-right { + animation: slideInRight var(--duration-normal) ease-out; +} + +/* Pulse Animation */ +@keyframes pulse { + 0%, 100% { opacity: 1; } + 50% { opacity: 0.5; } +} + +.pulse { + animation: pulse var(--duration-slower) ease-in-out infinite; +} diff --git a/reports-app/frontend/src/assets/css/patterns/dashboard.css b/reports-app/frontend/src/assets/css/patterns/dashboard.css new file mode 100644 index 0000000..39c02f0 --- /dev/null +++ b/reports-app/frontend/src/assets/css/patterns/dashboard.css @@ -0,0 +1,113 @@ +/* Dashboard Patterns - ROA2WEB */ + +/* ===== Page Headers ===== */ +.page-header { + margin-bottom: var(--space-xl); + text-align: center; +} + +.page-title { + margin: 0 0 var(--space-sm) 0; + font-size: var(--text-3xl); + font-weight: var(--font-bold); + color: var(--color-text); + display: flex; + align-items: center; + justify-content: center; + gap: var(--space-md); +} + +.page-subtitle { + margin: 0; + font-size: var(--text-base); + color: var(--color-text-secondary); +} + +/* ===== Section Structure ===== */ +.section-header { + display: flex; + justify-content: space-between; + align-items: center; + padding: var(--space-lg); + background: var(--color-bg-secondary); + border-bottom: 1px solid var(--color-border); + flex-wrap: wrap; + gap: var(--space-md); +} + +.section-title { + font-size: var(--text-xl); + font-weight: var(--font-semibold); + color: var(--color-text); + margin: 0; +} + +.section-controls { + display: flex; + align-items: center; + gap: var(--space-md); + flex-wrap: wrap; +} + +/* ===== Metrics Grid ===== */ +.metrics-row { + display: grid; + grid-template-columns: repeat(2, 1fr); + gap: var(--space-lg); + margin-bottom: var(--space-xl); +} + +@media (max-width: 1024px) { + .metrics-row { + grid-template-columns: 1fr; + } +} + +/* ===== Breakdown Patterns ===== */ +.breakdown-section { + padding-top: var(--space-lg); + border-top: 1px solid var(--color-border); + margin-top: var(--space-lg); +} + +.breakdown-item { + display: flex; + justify-content: space-between; + align-items: center; + padding: var(--space-sm) 0; +} + +.breakdown-label { + font-size: var(--text-sm); + color: var(--color-text-secondary); + font-weight: var(--font-medium); +} + +.breakdown-value { + font-size: var(--text-base); + color: var(--color-text); + font-weight: var(--font-semibold); + font-family: var(--font-mono, monospace); +} + +.breakdown-subitems { + padding-left: var(--space-lg); + margin-top: var(--space-sm); +} + +.breakdown-subitem { + display: flex; + justify-content: space-between; + padding: var(--space-xs) 0; +} + +.breakdown-sublabel { + color: var(--color-text-secondary); + font-size: var(--text-sm); +} + +.breakdown-subvalue { + font-weight: var(--font-medium); + font-family: var(--font-mono, monospace); + font-size: var(--text-sm); +} diff --git a/reports-app/frontend/src/assets/css/patterns/interactive.css b/reports-app/frontend/src/assets/css/patterns/interactive.css new file mode 100644 index 0000000..5ad590c --- /dev/null +++ b/reports-app/frontend/src/assets/css/patterns/interactive.css @@ -0,0 +1,114 @@ +/* Interactive Patterns - ROA2WEB */ + +/* ===== Loading Spinners ===== */ +.loading-spinner { + width: var(--spinner-size, 40px); + height: var(--spinner-size, 40px); + border: 4px solid var(--color-border); + border-top-color: var(--color-primary); + border-radius: var(--radius-full); + animation: spin 1s linear infinite; +} + +.loading-spinner-sm { + --spinner-size: 24px; + border-width: 3px; +} + +.loading-spinner-lg { + --spinner-size: 56px; + border-width: 5px; +} + +@keyframes spin { + to { transform: rotate(360deg); } +} + +/* ===== Trend Indicators ===== */ +.trend { + display: inline-flex; + align-items: center; + gap: var(--space-xs); + font-size: var(--text-sm); + font-weight: var(--font-medium); +} + +.trend-up { + color: var(--color-success); +} + +.trend-down { + color: var(--color-error); +} + +.trend-neutral { + color: var(--color-text-secondary); +} + +.trend-icon { + font-size: 0.75rem; +} + +/* ===== Collapse/Expand Patterns ===== */ +.collapsible-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); +} + +.collapsible-header:hover { + background: var(--color-bg-secondary); +} + +.collapse-icon { + font-size: 0.625rem; + color: var(--color-text-secondary); + transition: transform var(--transition-fast); + display: inline-block; + width: 1rem; +} + +.collapse-icon.expanded { + transform: rotate(90deg); +} + +/* ===== Card Hover Effects ===== */ +.card-hover { + transition: all var(--transition-fast); +} + +.card-hover:hover { + box-shadow: var(--shadow-md); + transform: translateY(var(--hover-lift, -2px)); + border-color: var(--color-primary); +} + +/* ===== Sparkline Containers ===== */ +.sparkline-container { + width: 100%; + background: var(--color-bg-secondary); + border: 1px solid var(--color-border); + border-radius: var(--radius-sm); + padding: var(--space-sm); +} + +.sparkline-chart { + width: 100%; + height: var(--sparkline-height, 80px); + position: relative; +} + +.sparkline-chart-lg { + --sparkline-height: 150px; +} + +.sparkline-canvas { + width: 100% !important; + height: 100% !important; + display: block; +} diff --git a/reports-app/frontend/src/assets/css/vendor/primevue-overrides.css b/reports-app/frontend/src/assets/css/vendor/primevue-overrides.css new file mode 100644 index 0000000..2214944 --- /dev/null +++ b/reports-app/frontend/src/assets/css/vendor/primevue-overrides.css @@ -0,0 +1,112 @@ +/* PrimeVue Component Overrides - ROA2WEB */ +/* Global customization of PrimeVue saga-blue theme */ + +/* ===== Input Components ===== */ +.p-inputtext, +.p-password input, +.p-dropdown, +.p-calendar input, +.p-autocomplete input { + border: 2px solid var(--color-border) !important; + border-radius: var(--radius-md) !important; + padding: var(--space-sm) var(--space-md) !important; + font-size: var(--text-base) !important; + font-family: inherit !important; + color: var(--color-text) !important; + background: var(--color-bg) !important; + transition: all var(--transition-fast) !important; + min-height: 44px !important; +} + +/* ===== Focus States ===== */ +.p-inputtext:focus, +.p-password input:focus, +.p-dropdown:focus, +.p-calendar input:focus, +.p-autocomplete input:focus { + outline: none !important; + border-color: var(--color-primary) !important; + box-shadow: var(--focus-ring) !important; +} + +/* ===== Hover States ===== */ +.p-inputtext:hover:not(:disabled), +.p-password input:hover:not(:disabled), +.p-dropdown:hover:not(:disabled) { + border-color: var(--color-border-dark, #d1d5db) !important; +} + +/* ===== Disabled States ===== */ +.p-inputtext:disabled, +.p-password input:disabled, +.p-dropdown:disabled { + background: var(--color-bg-muted, #f3f4f6) !important; + color: var(--color-text-muted, #9ca3af) !important; + opacity: 0.6 !important; + cursor: not-allowed !important; +} + +/* ===== Validation States ===== */ +.p-invalid.p-component, +.p-inputtext.p-invalid, +.p-password.p-invalid input { + border-color: var(--color-error, #ef4444) !important; +} + +/* ===== Button Overrides ===== */ +.p-button { + padding: var(--space-sm) var(--space-md) !important; + font-size: var(--text-sm) !important; + font-weight: var(--font-medium) !important; + border-radius: var(--radius-md) !important; + transition: all var(--transition-fast) !important; +} + +.p-button:hover { + transform: translateY(-1px) !important; + box-shadow: var(--shadow-md) !important; +} + +/* ===== DataTable ===== */ +.p-datatable .p-datatable-thead > tr > th { + background: var(--color-bg-muted, #f9fafb) !important; + color: var(--color-text) !important; + font-weight: var(--font-semibold) !important; + border-bottom: 2px solid var(--color-border) !important; + padding: var(--space-md) var(--space-lg) !important; +} + +.p-datatable .p-datatable-tbody > tr { + transition: background-color var(--transition-fast) !important; +} + +.p-datatable .p-datatable-tbody > tr:hover { + background: var(--color-bg-secondary, #f8fafc) !important; +} + +/* ===== Card ===== */ +.p-card { + box-shadow: var(--shadow-sm) !important; + border: 1px solid var(--color-border) !important; + border-radius: var(--card-radius, 8px) !important; +} + +.p-card .p-card-header { + background: var(--color-bg-secondary) !important; + border-bottom: 1px solid var(--color-border) !important; + padding: var(--space-lg) !important; +} + +.p-card .p-card-body { + padding: var(--space-lg) !important; +} + +/* ===== Mobile Optimizations ===== */ +@media (max-width: 768px) { + .p-inputtext, + .p-password input, + .p-dropdown, + .p-calendar input { + font-size: 16px !important; /* Prevent iOS zoom */ + } +}