diff --git a/reports-app/frontend/src/assets/css/components/cards.css b/reports-app/frontend/src/assets/css/components/cards.css index 2a96baf..8c4dfed 100644 --- a/reports-app/frontend/src/assets/css/components/cards.css +++ b/reports-app/frontend/src/assets/css/components/cards.css @@ -349,12 +349,83 @@ .action-card { padding: var(--space-sm); } - + .mini-card { padding: var(--space-xs); } - + .mini-card-value { font-size: var(--text-base); } +} + +/* ===== Dashboard Metric Cards ===== */ + +.metric-card { + background: var(--color-bg); + border: 1px solid var(--color-border); + border-radius: var(--card-radius); + padding: var(--card-padding, 1.5rem); + transition: all var(--transition-fast); + min-height: var(--card-min-height, 200px); + display: flex; + flex-direction: column; + gap: var(--card-gap, 1rem); +} + +.metric-card:hover { + box-shadow: var(--shadow-md); + transform: translateY(var(--hover-lift, -2px)); + 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, 2rem); + 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, 2.5rem); +} + +.metric-label { + font-size: var(--label-size, 0.875rem); + 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, 200px) - 40px); + padding: var(--card-padding-sm, 1rem); + } + + .metric-value { + font-size: 1.25rem; + } } \ No newline at end of file diff --git a/reports-app/frontend/src/assets/css/main.css b/reports-app/frontend/src/assets/css/main.css index 3e0252d..0d1d762 100644 --- a/reports-app/frontend/src/assets/css/main.css +++ b/reports-app/frontend/src/assets/css/main.css @@ -30,6 +30,7 @@ @import './utilities/display.css'; @import './utilities/text.css'; @import './utilities/flex.css'; +@import './utilities/colors.css'; /* 6. Vendor Overrides - NEW */ @import './vendor/primevue-overrides.css'; /* Centralized PrimeVue customization */ diff --git a/reports-app/frontend/src/assets/css/patterns/dashboard.css b/reports-app/frontend/src/assets/css/patterns/dashboard.css index 39c02f0..b010628 100644 --- a/reports-app/frontend/src/assets/css/patterns/dashboard.css +++ b/reports-app/frontend/src/assets/css/patterns/dashboard.css @@ -111,3 +111,80 @@ font-family: var(--font-mono, monospace); font-size: var(--text-sm); } + +/* ===== Enhanced Sparkline Patterns ===== */ + +.metric-sparkline { + margin: var(--space-md) 0; +} + +.sparkline-container { + width: 100%; + height: 60px; + position: relative; +} + +.sparkline-canvas { + width: 100%; + height: 100%; +} + +.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); +} + +/* ===== 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; +} diff --git a/reports-app/frontend/src/assets/css/utilities/colors.css b/reports-app/frontend/src/assets/css/utilities/colors.css new file mode 100644 index 0000000..94bb57e --- /dev/null +++ b/reports-app/frontend/src/assets/css/utilities/colors.css @@ -0,0 +1,102 @@ +/* Color Utilities - ROA2WEB */ + +/* ===== Background Colors ===== */ +.bg-primary { + background-color: var(--color-primary); + color: var(--color-text-inverse); +} + +.bg-success { + background-color: var(--color-success); + color: var(--color-text-inverse); +} + +.bg-warning { + background-color: var(--color-warning); + color: var(--color-text-inverse); +} + +.bg-error { + background-color: var(--color-error); + color: var(--color-text-inverse); +} + +.bg-info { + background-color: var(--color-info); + color: var(--color-text-inverse); +} + +/* ===== Light Background Colors (10% opacity) ===== */ +.bg-primary-light { + background-color: rgba(37, 99, 235, 0.1); + color: var(--color-primary); +} + +.bg-success-light { + background-color: rgba(5, 150, 105, 0.1); + color: var(--color-success); +} + +.bg-warning-light { + background-color: rgba(217, 119, 6, 0.1); + color: var(--color-warning); +} + +.bg-error-light { + background-color: rgba(220, 38, 38, 0.1); + color: var(--color-error); +} + +.bg-info-light { + background-color: rgba(8, 145, 178, 0.1); + color: var(--color-info); +} + +/* ===== 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-info { + color: var(--color-info); +} + +.text-muted { + color: var(--color-text-muted); +} + +.text-secondary { + color: var(--color-text-secondary); +} + +/* ===== Icon Background Utilities ===== */ +.icon-bg { + width: 40px; + height: 40px; + display: flex; + align-items: center; + justify-content: center; + border-radius: var(--radius-md); +} + +.icon-bg-sm { + width: 32px; + height: 32px; +} + +.icon-bg-lg { + width: 48px; + height: 48px; +} diff --git a/reports-app/frontend/src/components/dashboard/cards/MetricCard.vue b/reports-app/frontend/src/components/dashboard/cards/MetricCard.vue index d470b84..3a4b245 100644 --- a/reports-app/frontend/src/components/dashboard/cards/MetricCard.vue +++ b/reports-app/frontend/src/components/dashboard/cards/MetricCard.vue @@ -2,8 +2,8 @@