// Include theming for Angular Material with `mat.theme()`. // This Sass mixin will define CSS variables that are used for styling Angular Material // components according to the Material 3 design spec. // Learn more about theming and how to use it for your application's // custom components at https://material.angular.dev/guide/theming @use '@angular/material' as mat; html { @include mat.theme(( color: ( primary: mat.$azure-palette, tertiary: mat.$blue-palette, ), typography: Roboto, density: 0, )); } body { // Default the application to a light color theme. This can be changed to // `dark` to enable the dark color theme, or to `light dark` to defer to the // user's system settings. color-scheme: light; // Set a default background, font and text colors for the application using // Angular Material's system-level CSS variables. Learn more about these // variables at https://material.angular.dev/guide/system-variables background-color: var(--mat-sys-surface); color: var(--mat-sys-on-surface); font: var(--mat-sys-body-medium); // Reset the user agent margin. margin: 0; } /* You can add global styles to this file, and also import other style files */ html, body { height: 100%; } body { margin: 0; font-family: Roboto, "Helvetica Neue", sans-serif; } /* ======================================== CSS Custom Properties (Theme Variables) ======================================== */ :root { /* Primary Colors */ --color-primary: #0078d4; --color-primary-dark: #005a9e; --color-primary-light: #50a0e6; --color-primary-lighter: #e6f2fa; /* Secondary Colors */ --color-secondary: #2c3e50; --color-secondary-dark: #1a252f; --color-secondary-light: #415769; /* Accent Colors */ --color-accent: #00c853; --color-accent-dark: #009624; --color-accent-light: #5efc82; /* Semantic Colors */ --color-success: #4caf50; --color-success-light: #81c784; --color-success-dark: #388e3c; --color-error: #f44336; --color-error-light: #e57373; --color-error-dark: #d32f2f; --color-warning: #ff9800; --color-warning-light: #ffb74d; --color-warning-dark: #f57c00; --color-info: #2196f3; --color-info-light: #64b5f6; --color-info-dark: #1976d2; /* Neutral Colors - Light Theme */ --color-background: #ffffff; --color-surface: #f5f5f5; --color-surface-elevated: #ffffff; --color-text-primary: #212121; --color-text-secondary: #757575; --color-text-disabled: #bdbdbd; --color-border: #e0e0e0; --color-divider: #eeeeee; --color-shadow: rgba(0, 0, 0, 0.1); /* Spacing Scale */ --spacing-xs: 0.25rem; /* 4px */ --spacing-sm: 0.5rem; /* 8px */ --spacing-md: 1rem; /* 16px */ --spacing-lg: 1.5rem; /* 24px */ --spacing-xl: 2rem; /* 32px */ --spacing-2xl: 3rem; /* 48px */ --spacing-3xl: 4rem; /* 64px */ /* Border Radius */ --radius-sm: 4px; --radius-md: 8px; --radius-lg: 12px; --radius-xl: 16px; --radius-full: 9999px; /* Typography */ --font-family-base: 'Roboto', 'Helvetica Neue', sans-serif; --font-family-heading: 'Roboto', 'Helvetica Neue', sans-serif; --font-family-mono: 'Courier New', monospace; --font-size-xs: 0.75rem; /* 12px */ --font-size-sm: 0.875rem; /* 14px */ --font-size-base: 1rem; /* 16px */ --font-size-lg: 1.125rem; /* 18px */ --font-size-xl: 1.25rem; /* 20px */ --font-size-2xl: 1.5rem; /* 24px */ --font-size-3xl: 1.875rem; /* 30px */ --font-size-4xl: 2.25rem; /* 36px */ --font-weight-light: 300; --font-weight-normal: 400; --font-weight-medium: 500; --font-weight-semibold: 600; --font-weight-bold: 700; --line-height-tight: 1.25; --line-height-normal: 1.5; --line-height-relaxed: 1.75; /* Shadows */ --shadow-sm: 0 1px 2px 0 rgba(0, 0, 0, 0.05); --shadow-md: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06); --shadow-lg: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05); --shadow-xl: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04); /* Z-index Scale */ --z-dropdown: 1000; --z-sticky: 1020; --z-fixed: 1030; --z-modal-backdrop: 1040; --z-modal: 1050; --z-popover: 1060; --z-tooltip: 1070; --z-toast: 10000; /* Transitions */ --transition-fast: 150ms ease-in-out; --transition-base: 250ms ease-in-out; --transition-slow: 350ms ease-in-out; /* Layout */ --header-height: 64px; --sidebar-width: 260px; --sidebar-collapsed-width: 64px; --footer-height: 60px; --container-max-width: 1200px; } /* Dark Theme Variables */ body.dark-theme { --color-background: #121212; --color-surface: #1e1e1e; --color-surface-elevated: #2d2d2d; --color-text-primary: #ffffff; --color-text-secondary: #b0b0b0; --color-text-disabled: #6f6f6f; --color-border: #3f3f3f; --color-divider: #2d2d2d; --color-shadow: rgba(0, 0, 0, 0.3); /* Adjust primary colors for dark mode */ --color-primary: #50a0e6; --color-primary-light: #7bb8ed; --color-primary-lighter: #1a3a52; } /* ======================================== Responsive Breakpoints ======================================== */ /* Mobile: 320px - 767px (default, no media query needed) */ /* Tablet: 768px - 1023px */ /* Desktop: 1024px+ */ /* Utility classes for responsive visibility */ .mobile-only { @media (min-width: 768px) { display: none !important; } } .tablet-up { @media (max-width: 767px) { display: none !important; } } .desktop-only { @media (max-width: 1023px) { display: none !important; } } /* ======================================== Global Utility Classes ======================================== */ /* Container */ .container { width: 100%; max-width: var(--container-max-width); margin: 0 auto; padding: 0 var(--spacing-md); @media (min-width: 768px) { padding: 0 var(--spacing-lg); } } /* Flexbox Utilities */ .flex { display: flex; } .flex-col { flex-direction: column; } .flex-wrap { flex-wrap: wrap; } .items-center { align-items: center; } .items-start { align-items: flex-start; } .items-end { align-items: flex-end; } .justify-center { justify-content: center; } .justify-between { justify-content: space-between; } .justify-around { justify-content: space-around; } .justify-end { justify-content: flex-end; } .gap-xs { gap: var(--spacing-xs); } .gap-sm { gap: var(--spacing-sm); } .gap-md { gap: var(--spacing-md); } .gap-lg { gap: var(--spacing-lg); } .gap-xl { gap: var(--spacing-xl); } /* Spacing Utilities */ .m-0 { margin: 0; } .mt-sm { margin-top: var(--spacing-sm); } .mt-md { margin-top: var(--spacing-md); } .mt-lg { margin-top: var(--spacing-lg); } .mb-sm { margin-bottom: var(--spacing-sm); } .mb-md { margin-bottom: var(--spacing-md); } .mb-lg { margin-bottom: var(--spacing-lg); } .p-sm { padding: var(--spacing-sm); } .p-md { padding: var(--spacing-md); } .p-lg { padding: var(--spacing-lg); } /* Text Utilities */ .text-center { text-align: center; } .text-left { text-align: left; } .text-right { text-align: right; } .text-primary { color: var(--color-primary); } .text-secondary { color: var(--color-text-secondary); } .text-success { color: var(--color-success); } .text-error { color: var(--color-error); } .text-warning { color: var(--color-warning); } .font-bold { font-weight: var(--font-weight-bold); } .font-medium { font-weight: var(--font-weight-medium); } /* Border Utilities */ .rounded-sm { border-radius: var(--radius-sm); } .rounded-md { border-radius: var(--radius-md); } .rounded-lg { border-radius: var(--radius-lg); } .rounded-full { border-radius: var(--radius-full); } /* Shadow Utilities */ .shadow-sm { box-shadow: var(--shadow-sm); } .shadow-md { box-shadow: var(--shadow-md); } .shadow-lg { box-shadow: var(--shadow-lg); } /* ======================================== Global Component Resets ======================================== */ *, *::before, *::after { box-sizing: border-box; } button { font-family: inherit; cursor: pointer; &:disabled { cursor: not-allowed; opacity: 0.6; } } a { color: var(--color-primary); text-decoration: none; transition: color var(--transition-fast); &:hover { color: var(--color-primary-dark); } &:focus-visible { outline: 2px solid var(--color-primary); outline-offset: 2px; } } /* Focus styles for accessibility */ *:focus-visible { outline: 2px solid var(--color-primary); outline-offset: 2px; }