368 lines
9.1 KiB
SCSS
368 lines
9.1 KiB
SCSS
|
|
// ========================================
|
||
|
|
// DYNAMIC THEME VARIABLES
|
||
|
|
// ========================================
|
||
|
|
@import './design-tokens';
|
||
|
|
// CSS Custom Properties for Dynamic Theming
|
||
|
|
// These variables will be set by the ThemeService at runtime
|
||
|
|
|
||
|
|
:root {
|
||
|
|
// Default theme variables (fallback values)
|
||
|
|
--theme-primary: #0ea5e9;
|
||
|
|
--theme-secondary: #64748b;
|
||
|
|
--theme-accent: #8b5cf6;
|
||
|
|
--theme-background: #f8fafc;
|
||
|
|
--theme-surface: #ffffff;
|
||
|
|
--theme-text: #111827;
|
||
|
|
--theme-text-secondary: #6b7280;
|
||
|
|
|
||
|
|
// Font variables
|
||
|
|
--theme-font-primary: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
|
||
|
|
--theme-font-secondary: 'Poppins', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
|
||
|
|
--theme-font-mono: 'JetBrains Mono', 'Fira Code', Consolas, monospace;
|
||
|
|
|
||
|
|
// Other theme properties
|
||
|
|
--theme-border-radius: 0.75rem;
|
||
|
|
--theme-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1);
|
||
|
|
|
||
|
|
// Derived colors for better theme integration
|
||
|
|
--theme-primary-50: #{rgba(#0ea5e9, 0.05)};
|
||
|
|
--theme-primary-100: #{rgba(#0ea5e9, 0.1)};
|
||
|
|
--theme-primary-200: #{rgba(#0ea5e9, 0.2)};
|
||
|
|
--theme-primary-300: #{rgba(#0ea5e9, 0.3)};
|
||
|
|
--theme-primary-500: #0ea5e9;
|
||
|
|
--theme-primary-600: #{darken(#0ea5e9, 10%)};
|
||
|
|
--theme-primary-700: #{darken(#0ea5e9, 20%)};
|
||
|
|
--theme-primary-800: #{darken(#0ea5e9, 30%)};
|
||
|
|
--theme-primary-900: #{darken(#0ea5e9, 40%)};
|
||
|
|
|
||
|
|
// Gradient definitions using theme colors
|
||
|
|
--theme-gradient-primary: linear-gradient(135deg, var(--theme-primary) 0%, var(--theme-primary-700) 100%);
|
||
|
|
--theme-gradient-secondary: linear-gradient(135deg, var(--theme-secondary) 0%, #{darken(#64748b, 20%)} 100%);
|
||
|
|
--theme-gradient-accent: linear-gradient(135deg, var(--theme-accent) 0%, #{darken(#8b5cf6, 20%)} 100%);
|
||
|
|
|
||
|
|
// Glassmorphism effects
|
||
|
|
--theme-glass-bg: rgba(255, 255, 255, 0.1);
|
||
|
|
--theme-glass-border: rgba(255, 255, 255, 0.2);
|
||
|
|
--theme-glass-shadow: 0 8px 32px 0 rgba(31, 38, 135, 0.37);
|
||
|
|
}
|
||
|
|
|
||
|
|
// Dark theme overrides
|
||
|
|
[data-theme="dark"] {
|
||
|
|
--theme-background: #111827;
|
||
|
|
--theme-surface: #1f2937;
|
||
|
|
--theme-text: #f9fafb;
|
||
|
|
--theme-text-secondary: #d1d5db;
|
||
|
|
--theme-glass-bg: rgba(0, 0, 0, 0.1);
|
||
|
|
--theme-glass-border: rgba(255, 255, 255, 0.1);
|
||
|
|
--theme-glass-shadow: 0 8px 32px 0 rgba(0, 0, 0, 0.5);
|
||
|
|
}
|
||
|
|
|
||
|
|
// Theme-aware utility classes
|
||
|
|
// ========================================
|
||
|
|
|
||
|
|
// Background colors
|
||
|
|
.bg-theme-primary { background-color: var(--theme-primary) !important; }
|
||
|
|
.bg-theme-secondary { background-color: var(--theme-secondary) !important; }
|
||
|
|
.bg-theme-accent { background-color: var(--theme-accent) !important; }
|
||
|
|
.bg-theme-background { background-color: var(--theme-background) !important; }
|
||
|
|
.bg-theme-surface { background-color: var(--theme-surface) !important; }
|
||
|
|
|
||
|
|
// Text colors
|
||
|
|
.text-theme-primary { color: var(--theme-primary) !important; }
|
||
|
|
.text-theme-secondary { color: var(--theme-secondary) !important; }
|
||
|
|
.text-theme-accent { color: var(--theme-accent) !important; }
|
||
|
|
.text-theme-text { color: var(--theme-text) !important; }
|
||
|
|
.text-theme-text-secondary { color: var(--theme-text-secondary) !important; }
|
||
|
|
|
||
|
|
// Border colors
|
||
|
|
.border-theme-primary { border-color: var(--theme-primary) !important; }
|
||
|
|
.border-theme-secondary { border-color: var(--theme-secondary) !important; }
|
||
|
|
.border-theme-accent { border-color: var(--theme-accent) !important; }
|
||
|
|
|
||
|
|
// Gradients
|
||
|
|
.bg-gradient-theme-primary { background: var(--theme-gradient-primary) !important; }
|
||
|
|
.bg-gradient-theme-secondary { background: var(--theme-gradient-secondary) !important; }
|
||
|
|
.bg-gradient-theme-accent { background: var(--theme-gradient-accent) !important; }
|
||
|
|
|
||
|
|
// Font families
|
||
|
|
.font-theme-primary { font-family: var(--theme-font-primary) !important; }
|
||
|
|
.font-theme-secondary { font-family: var(--theme-font-secondary) !important; }
|
||
|
|
.font-theme-mono { font-family: var(--theme-font-mono) !important; }
|
||
|
|
|
||
|
|
// Border radius
|
||
|
|
.rounded-theme { border-radius: var(--theme-border-radius) !important; }
|
||
|
|
|
||
|
|
// Shadows
|
||
|
|
.shadow-theme { box-shadow: var(--theme-shadow) !important; }
|
||
|
|
|
||
|
|
// Glassmorphism effects
|
||
|
|
.glass-theme {
|
||
|
|
background: var(--theme-glass-bg) !important;
|
||
|
|
backdrop-filter: blur(16px) !important;
|
||
|
|
border: 1px solid var(--theme-glass-border) !important;
|
||
|
|
box-shadow: var(--theme-glass-shadow) !important;
|
||
|
|
}
|
||
|
|
|
||
|
|
// Theme-aware component overrides
|
||
|
|
// ========================================
|
||
|
|
|
||
|
|
// Update existing component styles to use theme variables
|
||
|
|
.modern-card {
|
||
|
|
background: var(--theme-surface);
|
||
|
|
color: var(--theme-text);
|
||
|
|
border: 1px solid rgba(var(--theme-text-secondary), 0.1);
|
||
|
|
box-shadow: var(--theme-shadow);
|
||
|
|
}
|
||
|
|
|
||
|
|
.modern-btn {
|
||
|
|
&.btn-primary {
|
||
|
|
background: var(--theme-gradient-primary);
|
||
|
|
color: white;
|
||
|
|
border-color: var(--theme-primary-600);
|
||
|
|
}
|
||
|
|
|
||
|
|
&.btn-secondary {
|
||
|
|
background: var(--theme-surface);
|
||
|
|
color: var(--theme-text);
|
||
|
|
border-color: rgba(var(--theme-text-secondary), 0.2);
|
||
|
|
}
|
||
|
|
|
||
|
|
&.btn-outline {
|
||
|
|
background: transparent;
|
||
|
|
color: var(--theme-primary);
|
||
|
|
border-color: var(--theme-primary);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
.modern-form-group {
|
||
|
|
.form-label {
|
||
|
|
color: var(--theme-text);
|
||
|
|
}
|
||
|
|
|
||
|
|
.form-input {
|
||
|
|
background: var(--theme-surface);
|
||
|
|
color: var(--theme-text);
|
||
|
|
border-color: rgba(var(--theme-text-secondary), 0.2);
|
||
|
|
|
||
|
|
&:focus {
|
||
|
|
border-color: var(--theme-primary);
|
||
|
|
box-shadow: 0 0 0 3px var(--theme-primary-100);
|
||
|
|
}
|
||
|
|
|
||
|
|
&::placeholder {
|
||
|
|
color: var(--theme-text-secondary);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
.modern-table {
|
||
|
|
background: var(--theme-surface);
|
||
|
|
color: var(--theme-text);
|
||
|
|
|
||
|
|
thead {
|
||
|
|
background: var(--theme-background);
|
||
|
|
|
||
|
|
th {
|
||
|
|
color: var(--theme-text-secondary);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
tbody {
|
||
|
|
tr {
|
||
|
|
&:hover {
|
||
|
|
background: var(--theme-background);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
td {
|
||
|
|
color: var(--theme-text);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
.modern-alert {
|
||
|
|
&.alert-info {
|
||
|
|
background: var(--theme-primary-100);
|
||
|
|
border-color: var(--theme-primary-200);
|
||
|
|
color: var(--theme-primary-800);
|
||
|
|
}
|
||
|
|
|
||
|
|
&.alert-success {
|
||
|
|
background: rgba(16, 185, 129, 0.1);
|
||
|
|
border-color: rgba(16, 185, 129, 0.2);
|
||
|
|
color: #065f46;
|
||
|
|
}
|
||
|
|
|
||
|
|
&.alert-warning {
|
||
|
|
background: rgba(245, 158, 11, 0.1);
|
||
|
|
border-color: rgba(245, 158, 11, 0.2);
|
||
|
|
color: #92400e;
|
||
|
|
}
|
||
|
|
|
||
|
|
&.alert-error {
|
||
|
|
background: rgba(239, 68, 68, 0.1);
|
||
|
|
border-color: rgba(239, 68, 68, 0.2);
|
||
|
|
color: #991b1b;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
// Layout component theme integration
|
||
|
|
// ========================================
|
||
|
|
|
||
|
|
.modern-layout {
|
||
|
|
background: var(--theme-background);
|
||
|
|
}
|
||
|
|
|
||
|
|
.modern-header {
|
||
|
|
background: rgba(var(--theme-surface), 0.95);
|
||
|
|
border-bottom: 1px solid rgba(var(--theme-text-secondary), 0.1);
|
||
|
|
color: var(--theme-text);
|
||
|
|
}
|
||
|
|
|
||
|
|
.modern-branding {
|
||
|
|
.company-title {
|
||
|
|
color: var(--theme-text);
|
||
|
|
}
|
||
|
|
|
||
|
|
.company-subtitle {
|
||
|
|
color: var(--theme-text-secondary);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
.modern-sidebar {
|
||
|
|
background: rgba(var(--theme-surface), 0.98);
|
||
|
|
border-right: 1px solid rgba(var(--theme-text-secondary), 0.05);
|
||
|
|
color: var(--theme-text);
|
||
|
|
}
|
||
|
|
|
||
|
|
.modern-nav-link,
|
||
|
|
.modern-nav-link-single {
|
||
|
|
color: var(--theme-text-secondary);
|
||
|
|
|
||
|
|
&:hover {
|
||
|
|
background: var(--theme-primary-100);
|
||
|
|
color: var(--theme-primary-700);
|
||
|
|
}
|
||
|
|
|
||
|
|
&.active {
|
||
|
|
background: var(--theme-primary-100);
|
||
|
|
color: var(--theme-primary-800);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
.modern-user-button {
|
||
|
|
background: transparent;
|
||
|
|
color: var(--theme-text);
|
||
|
|
border-color: rgba(var(--theme-text-secondary), 0.2);
|
||
|
|
|
||
|
|
&:hover {
|
||
|
|
background: var(--theme-background);
|
||
|
|
border-color: rgba(var(--theme-text-secondary), 0.3);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
.modern-dropdown-menu {
|
||
|
|
background: var(--theme-surface);
|
||
|
|
border-color: rgba(var(--theme-text-secondary), 0.2);
|
||
|
|
color: var(--theme-text);
|
||
|
|
}
|
||
|
|
|
||
|
|
.modern-dropdown-item {
|
||
|
|
color: var(--theme-text);
|
||
|
|
|
||
|
|
&:hover {
|
||
|
|
background: var(--theme-background);
|
||
|
|
color: var(--theme-text);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
// Dashboard theme integration
|
||
|
|
// ========================================
|
||
|
|
|
||
|
|
.modern-dashboard {
|
||
|
|
background: var(--theme-background);
|
||
|
|
}
|
||
|
|
|
||
|
|
.welcome-section {
|
||
|
|
background: var(--theme-gradient-primary);
|
||
|
|
color: white;
|
||
|
|
}
|
||
|
|
|
||
|
|
.stats-card {
|
||
|
|
background: var(--theme-surface);
|
||
|
|
color: var(--theme-text);
|
||
|
|
border: 1px solid rgba(var(--theme-text-secondary), 0.1);
|
||
|
|
|
||
|
|
.stats-value {
|
||
|
|
color: var(--theme-text);
|
||
|
|
}
|
||
|
|
|
||
|
|
.stats-label {
|
||
|
|
color: var(--theme-text-secondary);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
.action-card {
|
||
|
|
background: var(--theme-surface);
|
||
|
|
color: var(--theme-text);
|
||
|
|
border-color: rgba(var(--theme-text-secondary), 0.2);
|
||
|
|
|
||
|
|
&:hover {
|
||
|
|
border-color: var(--theme-primary-300);
|
||
|
|
}
|
||
|
|
|
||
|
|
h3 {
|
||
|
|
color: var(--theme-text);
|
||
|
|
}
|
||
|
|
|
||
|
|
p {
|
||
|
|
color: var(--theme-text-secondary);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
.activity-card {
|
||
|
|
background: var(--theme-surface);
|
||
|
|
color: var(--theme-text);
|
||
|
|
|
||
|
|
.activity-item {
|
||
|
|
border-bottom-color: rgba(var(--theme-text-secondary), 0.1);
|
||
|
|
|
||
|
|
&:hover {
|
||
|
|
background: var(--theme-background);
|
||
|
|
}
|
||
|
|
|
||
|
|
.activity-title {
|
||
|
|
color: var(--theme-text);
|
||
|
|
}
|
||
|
|
|
||
|
|
.activity-time {
|
||
|
|
color: var(--theme-text-secondary);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
// Responsive theme adjustments
|
||
|
|
// ========================================
|
||
|
|
|
||
|
|
@media (prefers-color-scheme: dark) {
|
||
|
|
:root:not([data-theme]) {
|
||
|
|
--theme-background: #111827;
|
||
|
|
--theme-surface: #1f2937;
|
||
|
|
--theme-text: #f9fafb;
|
||
|
|
--theme-text-secondary: #d1d5db;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
// Print styles
|
||
|
|
// ========================================
|
||
|
|
|
||
|
|
@media print {
|
||
|
|
:root {
|
||
|
|
--theme-background: white;
|
||
|
|
--theme-surface: white;
|
||
|
|
--theme-text: black;
|
||
|
|
--theme-text-secondary: #666;
|
||
|
|
--theme-shadow: none;
|
||
|
|
}
|
||
|
|
}
|