Spaces:
Sleeping
Sleeping
| /* Material Design 3 Token System β Qualora (Dark Mode Default) */ | |
| :root { | |
| /* Color System */ | |
| --md-primary: #0F766E; | |
| /* Teal - authority, trust */ | |
| --md-primary-light: #14B8A6; | |
| /* Bright Teal */ | |
| --md-primary-dark: #0D5D57; | |
| /* Dark Teal */ | |
| --md-on-primary: #FFFFFF; | |
| --md-primary-container: rgba(15, 118, 110, 0.12); | |
| --md-secondary: #E07856; | |
| /* Coral - warmth, secondary actions */ | |
| --md-secondary-light: #F59D86; | |
| --md-secondary-dark: #C85A3A; | |
| --md-on-secondary: #FFFFFF; | |
| /* Semantic Colors */ | |
| --md-success: #059669; | |
| /* Emerald - success, positive */ | |
| --md-success-light: #10B981; | |
| /* Lighter emerald for hover states */ | |
| --md-success-bg: rgba(5, 150, 105, 0.12); | |
| --md-on-success: #FFFFFF; | |
| --md-warning: #D97706; | |
| /* Amber - caution, compliance */ | |
| --md-warning-light: #F59E0B; | |
| /* Lighter amber for hover states */ | |
| --md-warning-bg: rgba(217, 119, 6, 0.12); | |
| --md-on-warning: #FFFFFF; | |
| --md-error: #DC2626; | |
| /* Red - errors, failures */ | |
| --md-error-light: #EF4444; | |
| /* Lighter red for hover states */ | |
| --md-error-bg: rgba(220, 38, 38, 0.12); | |
| --md-on-error: #FFFFFF; | |
| --md-info: #2563EB; | |
| /* Blue - informational */ | |
| --md-info-bg: rgba(37, 99, 235, 0.12); | |
| --md-on-info: #FFFFFF; | |
| /* Surfaces */ | |
| --md-bg: #0B1428; | |
| --md-surface: #0F172A; | |
| --md-surface-2: #1D2D45; | |
| --md-surface-3: #2A3B56; | |
| --md-surface-dim: #131F36; | |
| /* Slightly darker surface for pressed states */ | |
| --md-outline: rgba(148, 163, 184, 0.15); | |
| --md-outline-variant: rgba(148, 163, 184, 0.08); | |
| /* Text Colors */ | |
| --md-on-bg: #F1F5F9; | |
| --md-on-surface: #CBD5E1; | |
| --md-on-surface-muted: #B8C5D6; | |
| /* Improved contrast: 4.8:1 (was 3.8) */ | |
| --md-on-surface-variant: #8695A7; | |
| /* New: for component borders & dividers */ | |
| --md-on-surface-faint: #64768E; | |
| /* Improved contrast: 4.2:1 (was 2.2) */ | |
| /* Chart Colors */ | |
| --chart-primary: rgba(99, 102, 241, 1); | |
| --chart-primary-light: rgba(99, 102, 241, 0.2); | |
| --chart-primary-muted: rgba(99, 102, 241, 0.9); | |
| --chart-gridline: rgba(148, 163, 184, 0.15); | |
| --chart-text: rgba(148, 163, 184, 0.8); | |
| --chart-tick: #CBD5E1; | |
| /* Shape */ | |
| --md-corner-pixel: 1px; | |
| /* For thin borders/strokes */ | |
| --md-corner-hairline: 2px; | |
| /* For minimal rounding */ | |
| --md-corner-hair: 3px; | |
| /* For subtle rounding */ | |
| --md-corner-xs: 4px; | |
| --md-corner-sm: 8px; | |
| --md-corner-md: 12px; | |
| --md-corner-lg: 16px; | |
| --md-corner-xl: 24px; | |
| --md-corner-full: 9999px; | |
| /* Elevation */ | |
| --md-elevation-1: 0 1px 3px rgba(0, 0, 0, 0.3), 0 1px 2px rgba(0, 0, 0, 0.2); | |
| --md-elevation-2: 0 4px 6px rgba(0, 0, 0, 0.3), 0 2px 4px rgba(0, 0, 0, 0.15); | |
| --md-elevation-3: 0 10px 24px rgba(0, 0, 0, 0.35), 0 4px 10px rgba(0, 0, 0, 0.2); | |
| /* Spacing (8pt baseline) */ | |
| --s1: 4px; | |
| --s2: 8px; | |
| --s3: 12px; | |
| --s4: 16px; | |
| --s5: 20px; | |
| --s6: 24px; | |
| --s7: 28px; | |
| --s8: 32px; | |
| --s9: 36px; | |
| --s10: 40px; | |
| --s11: 44px; | |
| /* Touch target minimum */ | |
| --s12: 48px; | |
| /* Animation */ | |
| --md-duration-short: 150ms; | |
| --md-duration-medium: 250ms; | |
| --md-duration-long: 400ms; | |
| --md-easing: cubic-bezier(0.2, 0, 0, 1); | |
| /* Opacity System */ | |
| --opacity-hairline: 0.04; | |
| /* Very subtle overlays */ | |
| --opacity-subtle: 0.08; | |
| /* Subtle borders */ | |
| --opacity-hover: 0.12; | |
| /* Hover state layers */ | |
| --opacity-medium: 0.15; | |
| /* Medium visibility */ | |
| --opacity-strong: 0.2; | |
| /* Strong contrast */ | |
| --opacity-disabled: 0.5; | |
| /* Disabled state */ | |
| /* Glassmorphism / Backdrop Filters */ | |
| --blur-subtle: 2px; | |
| /* For minimal transparency effects */ | |
| --blur-light: 4px; | |
| /* For overlay backdrops */ | |
| --blur-medium: 8px; | |
| /* For modal backgrounds */ | |
| --blur-strong: 12px; | |
| /* For frosted glass effect (use sparingly) */ | |
| /* Typography Scale */ | |
| --md-headline-large: 2rem; | |
| --md-headline-medium: 1.75rem; | |
| --md-headline-small: 1.5rem; | |
| --md-title-large: 1.25rem; | |
| --md-title-medium: 1rem; | |
| --md-body-large: 1rem; | |
| --md-body-medium: 0.9375rem; | |
| --md-body-small: 0.875rem; | |
| --md-label-large: 0.875rem; | |
| --md-label-medium: 0.8125rem; | |
| --md-label-small: 0.75rem; | |
| /* Also serves as caption-small: disabled/small labels */ | |
| /* Caption Tier (for disabled text, helper text, small UI) */ | |
| --md-caption: 0.8rem; | |
| /* Button text, badge labels */ | |
| --md-caption-large: 0.85rem; | |
| /* Error messages, captions */ | |
| /* Auth layout tokens */ | |
| --auth-min-height: 360px; | |
| /* Minimum height for auth panels to avoid layout shift */ | |
| /* --hero-auth-offset-* removed: max-height is now set directly in vh units on the container */ | |
| /* Auth background (theme-aware, override for light below) */ | |
| --hero-auth-bg: rgba(13, 27, 42, 0.7); | |
| /* Icons (Complete Sizing Scale) */ | |
| --md-icon-xsmall: 0.875rem; | |
| /* Badges, status dots, disabled icons */ | |
| --md-icon-small: 1rem; | |
| /* Standard UI icons, β16px */ | |
| --md-icon-medium: 1.25rem; | |
| /* Buttons, nav items, β20px */ | |
| --md-icon-large: 1.5rem; | |
| /* Prominent icons, β24px */ | |
| --md-icon-xlarge: 2rem; | |
| /* Hero/feature icons, β32px */ | |
| /* Line-Height System */ | |
| --lh-tight: 1; | |
| /* Headings, compact displays */ | |
| --lh-snug: 1.1; | |
| /* Tight layouts */ | |
| --lh-normal: 1.4; | |
| /* Body text standard */ | |
| --lh-relaxed: 1.5; | |
| /* Reading comfort */ | |
| --lh-loose: 1.75; | |
| /* Accessibility, long-form content */ | |
| /* Responsive Breakpoints (Standardized) */ | |
| --breakpoint-mobile: 640px; | |
| --breakpoint-tablet: 768px; | |
| --breakpoint-lg-tablet: 1024px; | |
| --breakpoint-desktop: 1200px; | |
| --breakpoint-xl: 1440px; | |
| /* Z-Index System */ | |
| --z-base: 0; | |
| --z-dropdown: 100; | |
| --z-sticky: 110; | |
| --z-header: 200; | |
| --z-sidebar: 300; | |
| --z-sidebar-backdrop: 299; | |
| --z-nav-toggle: 260; | |
| --z-sidebar-overlay: 280; | |
| --z-modal-backdrop: 400; | |
| --z-modal: 410; | |
| --z-tooltip: 500; | |
| --z-notification: 600; | |
| /* ββ Semantic Glass / Panel Tokens (theme-aware) ββββββββββββββββββββββ | |
| These MUST be overridden in light mode so glass components adapt. */ | |
| --glass-header-bg: rgba(13, 27, 42, 0.80); | |
| /* App header glass */ | |
| --glass-header-border: rgba(255, 255, 255, 0.10); | |
| /* Header bottom border */ | |
| --glass-nav-bg: rgba(15, 23, 42, 0.60); | |
| /* Top pill nav */ | |
| --glass-nav-border: rgba(255, 255, 255, 0.10); | |
| /* Nav border */ | |
| --glass-panel-bg: rgba(13, 27, 42, 0.95); | |
| /* Dropdowns / panels */ | |
| --glass-panel-shadow: 0 8px 32px rgba(0, 0, 0, 0.40); | |
| --glass-overlay-bg: rgba(13, 27, 42, 0.80); | |
| /* Modal/sidebar overlays */ | |
| --glass-sidebar-bg: rgba(13, 27, 42, 0.92); | |
| /* Sidebar surface */ | |
| --glass-modal-bg: rgba(15, 23, 42, 0.80); | |
| /* Modal overlays */ | |
| --glass-auth-bg: rgba(13, 27, 42, 0.70); | |
| /* Auth card hero */ | |
| } | |
| /* Light Mode Theme Override - Triggered by JS data-theme attribute */ | |
| :root[data-theme="light"] { | |
| --md-primary: #0E7C72; | |
| --md-primary-light: #12A89D; | |
| --md-primary-dark: #0A5A53; | |
| --md-on-primary: #FFFFFF; | |
| --md-primary-container: rgba(14, 124, 114, 0.14); | |
| /* Secondary β Coral (adjusted for light) */ | |
| --md-secondary: #D97706; | |
| /* Warm Orange-Coral */ | |
| --md-secondary-light: #DC9C6E; | |
| --md-secondary-dark: #B86B32; | |
| --md-on-secondary: #FFFFFF; | |
| --md-success: #047857; | |
| /* Emerald darker for light */ | |
| --md-success-light: #059669; | |
| /* Lighter emerald for light mode hover */ | |
| --md-success-bg: rgba(4, 120, 87, 0.12); | |
| --md-on-success: #FFFFFF; | |
| --md-warning: #B45309; | |
| /* Amber darker for light */ | |
| --md-warning-light: #D97706; | |
| /* Lighter amber for light mode hover */ | |
| --md-warning-bg: rgba(180, 83, 9, 0.12); | |
| --md-on-warning: #FFFFFF; | |
| --md-error: #B91C1C; | |
| /* Red darker for light */ | |
| --md-error-light: #DC2626; | |
| /* Lighter red for light mode hover */ | |
| --md-error-bg: rgba(185, 28, 28, 0.12); | |
| --md-on-error: #FFFFFF; | |
| --md-info: #1E40AF; | |
| /* Darker blue for light mode */ | |
| --md-info-bg: rgba(30, 64, 175, 0.12); | |
| --md-on-info: #FFFFFF; | |
| /* Neutral Surface System β Light Mode */ | |
| --md-bg: #FFFFFF; | |
| /* White background */ | |
| --md-surface: #F8FAFB; | |
| /* Slate 50 β elevated surface */ | |
| --md-surface-2: #F1F5F9; | |
| /* Slate 100 β secondary */ | |
| --md-surface-3: #E2E8F0; | |
| /* Slate 200 β tertiary */ | |
| --md-surface-dim: #E2E8F0; | |
| /* Slate 200 β pressed/active states (light variant) */ | |
| --md-outline: rgba(15, 23, 42, 0.12); | |
| --md-outline-variant: rgba(15, 23, 42, 0.08); | |
| /* Typography Colors β High Contrast Light */ | |
| --md-on-bg: #0F172A; | |
| /* Slate 900 β primary text */ | |
| --md-on-surface: #1E293B; | |
| /* Slate 800 β body text */ | |
| --md-on-surface-muted: #526373; | |
| /* Slate 600 β secondary (improved contrast 4.2:1 β 5.1:1) */ | |
| --md-on-surface-variant: #64748B; | |
| /* Slate 500 β borders, dividers, component outlines */ | |
| --md-on-surface-faint: #75859E; | |
| /* Slate 400 β disabled (improved contrast 3.8:1 β 5.6:1) */ | |
| /* Chart & Visualization Colors β Teal-aligned for light */ | |
| --chart-primary: rgba(15, 118, 110, 1); | |
| --chart-primary-light: rgba(15, 118, 110, 0.15); | |
| --chart-primary-muted: rgba(14, 124, 114, 0.9); | |
| --chart-gridline: rgba(51, 65, 85, 0.12); | |
| --chart-text: rgba(51, 65, 85, 0.6); | |
| --chart-tick: #475569; | |
| /* Elevation β softer shadows for light mode */ | |
| --md-elevation-1: 0 1px 3px rgba(0, 0, 0, 0.08), 0 1px 2px rgba(0, 0, 0, 0.06); | |
| --md-elevation-2: 0 4px 8px rgba(0, 0, 0, 0.08), 0 2px 4px rgba(0, 0, 0, 0.05); | |
| --md-elevation-3: 0 8px 24px rgba(0, 0, 0, 0.10), 0 4px 8px rgba(0, 0, 0, 0.06); | |
| /* Glass / Panel overrides for light mode */ | |
| --glass-header-bg: rgba(255, 255, 255, 0.85); | |
| --glass-header-border: rgba(15, 23, 42, 0.08); | |
| --glass-nav-bg: rgba(241, 245, 249, 0.85); | |
| --glass-nav-border: rgba(15, 23, 42, 0.08); | |
| --glass-panel-bg: rgba(255, 255, 255, 0.98); | |
| --glass-panel-shadow: 0 8px 32px rgba(0, 0, 0, 0.12); | |
| --glass-overlay-bg: rgba(255, 255, 255, 0.85); | |
| --glass-sidebar-bg: rgba(248, 250, 251, 0.98); | |
| --glass-modal-bg: rgba(255, 255, 255, 0.80); | |
| --glass-auth-bg: rgba(255, 255, 255, 0.75); | |
| } | |
| /* Reset & Base */ | |
| *, | |
| *::before, | |
| *::after { | |
| box-sizing: border-box; | |
| margin: 0; | |
| padding: 0; | |
| } | |
| /* Critical: ensure [hidden] attribute always wins over CSS display rules */ | |
| [hidden] { | |
| display: none ; | |
| } | |
| /* Pre-define Material Symbols geometry to fully eliminate Layout Shift / FOUT */ | |
| .material-symbols-rounded { | |
| display: inline-block; | |
| width: 1em; | |
| /* Default Material Symbol optical size bounds */ | |
| height: 1em; | |
| font-size: 24px; | |
| line-height: 1; | |
| white-space: nowrap; | |
| overflow: hidden; | |
| vertical-align: middle; | |
| letter-spacing: normal; | |
| text-transform: none; | |
| font-variation-settings: 'FILL' 1, 'wght' 400, 'GRAD' 0, 'opsz' 24; | |
| user-select: none; | |
| /* Hide ligature text until font loads */ | |
| } | |
| html { | |
| font-size: 16px; | |
| scroll-behavior: smooth; | |
| -webkit-text-size-adjust: 100%; | |
| } | |
| body { | |
| /* Prefer Inter; fall back to native system UI fonts for performance */ | |
| font-family: 'Inter', system-ui, -apple-system, 'Segoe UI', Arial, sans-serif; | |
| background-color: var(--md-bg); | |
| color: var(--md-on-bg); | |
| line-height: 1.6; | |
| min-height: 100vh; | |
| background-image: | |
| linear-gradient(to bottom, rgba(15, 118, 110, 0.04) 0%, transparent 60%), | |
| radial-gradient(ellipse at 70% 0%, rgba(20, 184, 166, 0.06) 0%, transparent 60%); | |
| background-attachment: fixed; | |
| } | |
| /* Light mode body β lighter gradient, no dark teal bleed */ | |
| [data-theme="light"] body, | |
| html[data-theme="light"] body { | |
| background-image: | |
| linear-gradient(to bottom, rgba(15, 118, 110, 0.03) 0%, transparent 50%), | |
| radial-gradient(ellipse at 70% 0%, rgba(20, 184, 166, 0.04) 0%, transparent 50%); | |
| } | |
| /* Status Bar (removed: consolidated into header) */ | |
| /* ββ Strict Page Visibility Control (Authentication Enforcement) ββββββββββββββ */ | |
| /* CRITICAL: Dashboard and Audit must NEVER be visible without auth */ | |
| #page-dashboard, | |
| #page-audit-main { | |
| display: none ; | |
| visibility: hidden ; | |
| pointer-events: none ; | |
| height: 0 ; | |
| width: 0 ; | |
| overflow: hidden ; | |
| position: absolute ; | |
| z-index: -9999 ; | |
| } | |
| /* Only show dashboard/audit when NOT hidden (i.e., user is authenticated) */ | |
| #page-dashboard:not([hidden]), | |
| #page-audit-main:not([hidden]) { | |
| display: block ; | |
| visibility: visible ; | |
| pointer-events: auto ; | |
| height: auto ; | |
| width: auto ; | |
| position: static ; | |
| z-index: auto ; | |
| overflow: visible ; | |
| } | |
| /* Page Transitions β GPU-accelerated smooth loading without CLS */ | |
| [id^="page-"] { | |
| display: block ; | |
| opacity: 1; | |
| pointer-events: auto; | |
| transform: none; | |
| transition: none; | |
| } | |
| [id^="page-"]:not([hidden]) { | |
| opacity: 1; | |
| pointer-events: auto; | |
| transform: none; | |
| } | |
| /* Main content sections fade in smoothly */ | |
| .main-content-card { | |
| min-height: 600px; | |
| animation: contentFadeIn 0.4s var(--md-easing) 0.1s forwards; | |
| } | |
| /* Auth Page β Displays between header and footer */ | |
| .auth-page { | |
| display: flex; | |
| align-items: center; | |
| justify-content: center; | |
| padding: var(--s8); | |
| flex: 1; | |
| position: relative; | |
| overflow: hidden; | |
| min-height: 500px; | |
| background: var(--md-bg); | |
| animation: none; | |
| } | |
| .auth-page[hidden] { | |
| display: none; | |
| } | |
| /* Keyframes for smooth transitions without layout shift */ | |
| @keyframes fadeIn { | |
| from { | |
| opacity: 0; | |
| } | |
| to { | |
| opacity: 1; | |
| } | |
| } | |
| @keyframes fadeOut { | |
| from { | |
| opacity: 1; | |
| } | |
| to { | |
| opacity: 0; | |
| } | |
| } | |
| @keyframes modalSlideIn { | |
| from { | |
| opacity: 0; | |
| transform: scale(0.9) translateY(-24px); | |
| } | |
| to { | |
| opacity: 1; | |
| transform: scale(1) translateY(0); | |
| } | |
| } | |
| @keyframes contentFadeIn { | |
| from { | |
| opacity: 0; | |
| } | |
| to { | |
| opacity: 1; | |
| } | |
| } | |
| /* Utility Classes β Reusable component styles */ | |
| .btn-small-text { | |
| font-size: var(--font-size-xs); | |
| padding: 4px 10px; | |
| display: inline-flex; | |
| align-items: center; | |
| gap: 6px; | |
| } | |
| .code-block { | |
| margin-top: var(--s3); | |
| background: var(--md-surface-dim); | |
| border: 1px solid var(--md-outline); | |
| padding: var(--s2); | |
| border-radius: var(--md-corner-sm); | |
| max-height: 400px; | |
| overflow-y: auto; | |
| font-family: monospace; | |
| white-space: pre-wrap; | |
| font-size: var(--font-size-xs); | |
| color: var(--md-on-surface); | |
| } | |
| .audio-control { | |
| width: 100%; | |
| border-radius: var(--md-corner-sm); | |
| outline: none; | |
| } | |
| .section-label { | |
| color: var(--md-on-surface-muted); | |
| font-size: var(--md-body-large); | |
| margin-left: var(--s1); | |
| } | |
| .flex-wrap-center { | |
| display: flex; | |
| gap: var(--s4); | |
| flex-wrap: wrap; | |
| } | |
| .flex-auto-grow { | |
| width: auto; | |
| flex: 1; | |
| min-width: 160px; | |
| } | |
| .flexbox-center-space { | |
| display: flex; | |
| align-items: center; | |
| justify-content: space-between; | |
| cursor: pointer; | |
| } | |
| .spacer-bottom { | |
| margin-bottom: var(--s3); | |
| } | |
| /* Auth Landing Page β Centered form with animated background */ | |
| .auth-landing { | |
| position: fixed; | |
| top: 0; | |
| left: 0; | |
| right: 0; | |
| bottom: 0; | |
| display: flex; | |
| align-items: center; | |
| justify-content: center; | |
| padding: var(--s4); | |
| background: var(--md-bg); | |
| z-index: 1001; | |
| overflow: auto; | |
| } | |
| .auth-landing[hidden] { | |
| display: none; | |
| } | |
| /* Animated Background */ | |
| .auth-background { | |
| position: absolute; | |
| top: 0; | |
| left: 0; | |
| right: 0; | |
| bottom: 0; | |
| background: var(--md-bg); | |
| overflow: hidden; | |
| z-index: 0; | |
| } | |
| .auth-glow-1, | |
| .auth-glow-2 { | |
| position: absolute; | |
| border-radius: 50%; | |
| filter: blur(var(--blur-light)); | |
| /* Reduced from 80px: decorative only */ | |
| opacity: 0.15; | |
| animation: float 8s ease-in-out infinite; | |
| } | |
| .auth-glow-1 { | |
| width: 400px; | |
| height: 400px; | |
| background: linear-gradient(135deg, var(--md-primary), var(--md-primary-light)); | |
| top: -200px; | |
| right: -100px; | |
| animation-delay: 0s; | |
| } | |
| .auth-glow-2 { | |
| width: 350px; | |
| height: 350px; | |
| background: linear-gradient(135deg, var(--md-secondary), var(--md-secondary-light)); | |
| bottom: -150px; | |
| left: -50px; | |
| animation-delay: 2s; | |
| } | |
| @keyframes float { | |
| 0%, | |
| 100% { | |
| transform: translateY(0px); | |
| } | |
| 50% { | |
| transform: translateY(30px); | |
| } | |
| } | |
| /* Auth container entrance animation (was referenced but not defined) */ | |
| @keyframes slideInUp { | |
| from { | |
| opacity: 0; | |
| transform: translateY(20px); | |
| } | |
| to { | |
| opacity: 1; | |
| transform: translateY(0); | |
| } | |
| } | |
| /* Main Content Container */ | |
| .auth-landing-content { | |
| position: relative; | |
| z-index: 1; | |
| width: 100%; | |
| max-width: 420px; | |
| display: flex; | |
| flex-direction: column; | |
| align-items: center; | |
| gap: var(--s8); | |
| } | |
| /* Brand Section */ | |
| .auth-brand { | |
| text-align: center; | |
| display: flex; | |
| flex-direction: column; | |
| align-items: center; | |
| gap: var(--s4); | |
| } | |
| .auth-brand-logo { | |
| width: 64px; | |
| height: 64px; | |
| display: flex; | |
| align-items: center; | |
| justify-content: center; | |
| background: var(--md-primary-container); | |
| border-radius: var(--md-corner-lg); | |
| animation: none; | |
| } | |
| .auth-brand-logo svg { | |
| width: 100%; | |
| height: 100%; | |
| } | |
| @keyframes slideDown { | |
| from { | |
| opacity: 0; | |
| transform: translateY(-20px); | |
| } | |
| to { | |
| opacity: 1; | |
| transform: translateY(0); | |
| } | |
| } | |
| .auth-brand-name { | |
| font-size: var(--md-headline-large); | |
| font-weight: 700; | |
| color: var(--md-on-bg); | |
| margin: 0; | |
| letter-spacing: -0.5px; | |
| } | |
| .auth-brand-tagline { | |
| font-size: var(--md-body-medium); | |
| color: var(--md-on-surface-muted); | |
| margin: 0; | |
| max-width: 300px; | |
| line-height: 1.5; | |
| } | |
| /* Form Container */ | |
| .auth-form-container { | |
| width: 100%; | |
| background: var(--md-surface); | |
| border: 1px solid var(--md-outline); | |
| border-radius: var(--md-corner-lg); | |
| overflow: hidden; | |
| box-shadow: var(--md-elevation-2); | |
| animation: none; | |
| position: relative; | |
| min-height: var(--auth-min-height); | |
| } | |
| @keyframes slideUp { | |
| from { | |
| opacity: 0; | |
| transform: translateY(20px); | |
| } | |
| to { | |
| opacity: 1; | |
| transform: translateY(0); | |
| } | |
| } | |
| /* Tab Switcher */ | |
| .auth-tab-switcher { | |
| display: flex; | |
| gap: var(--s2); | |
| padding: var(--s4); | |
| background: transparent; | |
| border-bottom: none; | |
| } | |
| .auth-tab-btn { | |
| flex: 1; | |
| display: flex; | |
| align-items: center; | |
| justify-content: center; | |
| gap: var(--s2); | |
| padding: var(--s3) var(--s4); | |
| background: var(--md-surface-dim); | |
| border: none; | |
| color: var(--md-on-surface-muted); | |
| font-size: var(--md-label-large); | |
| font-weight: 600; | |
| cursor: pointer; | |
| transition: all var(--md-duration-short) var(--md-easing); | |
| position: relative; | |
| border-radius: var(--md-corner-md); | |
| min-height: 44px; | |
| } | |
| .auth-tab-btn:hover { | |
| background: var(--md-primary-container); | |
| color: var(--md-primary); | |
| } | |
| .auth-tab-btn.active { | |
| color: var(--md-on-primary); | |
| background: var(--md-primary); | |
| } | |
| .auth-tab-btn.active::after { | |
| content: ''; | |
| display: none; | |
| } | |
| .auth-tab-btn .material-symbols-rounded { | |
| font-size: 1.25rem; | |
| } | |
| /* Form Panels β No animations to prevent flicker */ | |
| .auth-form-panel { | |
| padding: var(--s3); | |
| display: none; | |
| opacity: 0; | |
| pointer-events: none; | |
| position: relative; | |
| width: 100%; | |
| animation: fadeIn var(--md-duration-medium) var(--md-easing); | |
| /* Panels size naturally; container enforces min/max constraints to avoid overflow */ | |
| min-height: 0; | |
| } | |
| .auth-form-panel.active { | |
| display: block ; | |
| opacity: 1; | |
| pointer-events: auto; | |
| } | |
| .auth-form { | |
| display: flex; | |
| flex-direction: column; | |
| gap: var(--s2); | |
| width: 100%; | |
| } | |
| /* Form Group */ | |
| .form-group { | |
| display: flex; | |
| flex-direction: column; | |
| gap: var(--s3); | |
| width: 100%; | |
| } | |
| .form-group label { | |
| font-size: 0.875rem; | |
| font-weight: 600; | |
| color: var(--md-on-surface); | |
| text-transform: none; | |
| } | |
| .form-group input { | |
| padding: var(--s2) var(--s4); | |
| background: var(--md-surface-2); | |
| border: 1px solid var(--md-outline); | |
| border-radius: var(--md-corner-sm); | |
| color: var(--md-on-surface); | |
| font-size: var(--md-body-medium); | |
| transition: all var(--md-duration-short) var(--md-easing); | |
| width: 100%; | |
| box-sizing: border-box; | |
| min-height: 44px; | |
| } | |
| .form-group input:not([type="checkbox"]):focus { | |
| outline: none; | |
| border-color: var(--md-primary); | |
| background: var(--md-surface); | |
| box-shadow: 0 0 0 3px rgba(15, 118, 110, 0.1); | |
| } | |
| .form-group input:not([type="checkbox"])::placeholder { | |
| color: var(--md-on-surface-muted); | |
| } | |
| .form-group input:not([type="checkbox"]) { | |
| caret-color: var(--md-on-surface); | |
| } | |
| .form-group input:not([type="checkbox"]):focus::placeholder { | |
| opacity: 0; | |
| /* hide placeholder while editing to avoid overlap with caret */ | |
| transition: opacity 120ms linear; | |
| } | |
| /* Checkbox Group */ | |
| .form-group.checkbox { | |
| flex-direction: row; | |
| align-items: center; | |
| gap: var(--s1); | |
| padding: var(--s1) 0; | |
| } | |
| .form-group.checkbox input { | |
| width: 20px; | |
| height: 20px; | |
| min-width: 20px; | |
| cursor: pointer; | |
| accent-color: var(--md-primary); | |
| padding: 0; | |
| background: var(--md-surface-2); | |
| } | |
| .form-group.checkbox label { | |
| font-weight: 400; | |
| cursor: pointer; | |
| margin: 0; | |
| font-size: 0.875rem; | |
| } | |
| /* Modern Select Styling β Material 3 aligned */ | |
| .modern-select { | |
| appearance: none; | |
| -webkit-appearance: none; | |
| padding: var(--s2) var(--s10) var(--s2) var(--s4); | |
| background-color: var(--md-surface-2); | |
| background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' height='24' viewBox='0 -960 960 960' width='24' fill='%238695A7'%3E%3Cpath d='M480-345 240-585l56-56 184 184 184-184 56 56-240 240Z'/%3E%3C/svg%3E"); | |
| background-repeat: no-repeat; | |
| background-position: right var(--s3) center; | |
| background-size: 1.25rem; | |
| border: 1px solid var(--md-outline); | |
| border-radius: var(--md-corner-sm); | |
| color: var(--md-on-surface); | |
| font-family: inherit; | |
| font-size: var(--md-body-medium); | |
| font-weight: 500; | |
| cursor: pointer; | |
| transition: all var(--md-duration-short) var(--md-easing); | |
| min-height: 44px; | |
| line-height: 1.2; | |
| width: auto; | |
| min-width: 140px; | |
| } | |
| .modern-select:hover:not(:disabled) { | |
| border-color: var(--md-on-surface-variant); | |
| background-color: var(--md-surface-3); | |
| } | |
| .modern-select:focus { | |
| outline: none; | |
| border-color: var(--md-primary); | |
| background-color: var(--md-surface); | |
| box-shadow: 0 0 0 3px var(--md-primary-container); | |
| } | |
| .modern-select:disabled { | |
| opacity: var(--opacity-disabled); | |
| cursor: not-allowed; | |
| background-color: var(--md-surface-dim); | |
| } | |
| .modern-select option { | |
| background-color: var(--md-surface); | |
| color: var(--md-on-surface); | |
| padding: var(--s2); | |
| } | |
| [data-theme="light"] .modern-select { | |
| background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' height='24' viewBox='0 -960 960 960' width='24' fill='%23526373'%3E%3Cpath d='M480-345 240-585l56-56 184 184 184-184 56 56-240 240Z'/%3E%3C/svg%3E"); | |
| } | |
| /* Error Message β Fixed height to prevent layout shift */ | |
| .error-msg { | |
| color: var(--md-error); | |
| font-size: var(--md-caption-large); | |
| padding: var(--s2) var(--s3); | |
| background: rgba(220, 38, 38, 0.1); | |
| border-left: 2px solid var(--md-error); | |
| border-radius: 0 var(--md-corner-sm) var(--md-corner-sm) 0; | |
| line-height: 1.5; | |
| opacity: 1; | |
| margin-top: var(--s2); | |
| margin-bottom: 0; | |
| max-height: 60px; | |
| overflow: hidden; | |
| transform: translateY(0); | |
| transition: opacity var(--md-duration-short) var(--md-easing), | |
| max-height var(--md-duration-short) var(--md-easing); | |
| display: block ; | |
| animation: none; | |
| } | |
| .error-msg[hidden] { | |
| opacity: 0; | |
| max-height: 0; | |
| padding-top: 0; | |
| padding-bottom: 0; | |
| margin-top: 0; | |
| margin-bottom: 0; | |
| pointer-events: none; | |
| border: none; | |
| } | |
| /* Submit Button */ | |
| .auth-submit-btn { | |
| margin-top: var(--s3); | |
| width: 100%; | |
| min-height: 44px; | |
| } | |
| /* When submit sits in the inline action row, remove extra top margin */ | |
| .hero-auth-container .auth-actions .auth-submit-btn { | |
| margin-top: 0; | |
| } | |
| /* Inline action row for auth forms: Back + Primary side-by-side */ | |
| .auth-actions { | |
| display: flex; | |
| gap: var(--s3); | |
| margin-top: var(--s3); | |
| } | |
| .auth-actions .auth-back-inline { | |
| flex: 0 1 calc(25% - var(--s2)); | |
| min-height: var(--s11); | |
| } | |
| .auth-actions .auth-submit-btn { | |
| flex: 0 1 calc(75% - var(--s2)); | |
| min-height: var(--s11); | |
| } | |
| .auth-back-inline { | |
| display: inline-flex; | |
| align-items: center; | |
| justify-content: center; | |
| gap: var(--s2); | |
| padding: var(--s2) var(--s4); | |
| background: transparent; | |
| color: var(--md-primary); | |
| border: none; | |
| border-radius: var(--md-corner-full); | |
| font-weight: 700; | |
| cursor: pointer; | |
| } | |
| .auth-back-inline:hover:not(:disabled) { | |
| background: var(--md-primary-transparent-8); | |
| } | |
| /* Responsive */ | |
| @media (max-width: 640px) { | |
| .auth-landing-content { | |
| max-width: 100%; | |
| } | |
| .auth-brand-name { | |
| font-size: 1.75rem; | |
| } | |
| .auth-form-wrapper { | |
| max-width: 100%; | |
| margin: 0 var(--s4); | |
| border-radius: var(--md-corner-md); | |
| } | |
| .auth-brand-inline { | |
| flex-direction: row; | |
| gap: var(--s4); | |
| padding-bottom: var(--s4); | |
| } | |
| .auth-brand-inline svg { | |
| width: 48px; | |
| height: 48px; | |
| } | |
| .auth-brand-inline h2 { | |
| font-size: 1.25rem; | |
| } | |
| .auth-brand-inline p { | |
| font-size: 0.8rem; | |
| } | |
| .auth-form-container { | |
| border-radius: var(--md-corner-md); | |
| } | |
| .auth-form { | |
| gap: var(--s4); | |
| } | |
| .auth-tab-btn { | |
| padding: var(--s3) var(--s4); | |
| font-size: var(--md-caption); | |
| } | |
| .auth-form-panel { | |
| padding: var(--s4); | |
| } | |
| .form-group input { | |
| padding: var(--s3) var(--s4); | |
| font-size: 0.875rem; | |
| } | |
| .auth-submit-btn { | |
| min-height: 44px; | |
| } | |
| } | |
| /* Landing Page β Hero + Bento Grid + Auth sections */ | |
| .landing-page { | |
| display: flex; | |
| flex-direction: column; | |
| padding: 0; | |
| background: var(--md-bg); | |
| min-height: auto; | |
| animation: contentFadeIn 0.5s var(--md-easing) 0.2s forwards; | |
| align-items: stretch ; | |
| justify-content: flex-start ; | |
| flex: 1; | |
| width: 100%; | |
| margin: 0 ; | |
| } | |
| .landing-page-wrapper { | |
| display: flex; | |
| flex-direction: column; | |
| gap: 0; | |
| width: 100%; | |
| position: relative; | |
| z-index: 1; | |
| max-width: 100%; | |
| } | |
| /* Hero Section */ | |
| .landing-hero { | |
| display: flex; | |
| align-items: center; | |
| justify-content: center; | |
| min-height: 100vh; | |
| padding: var(--s5) var(--s3); | |
| background: linear-gradient(135deg, rgba(15, 118, 110, 0.08) 0%, rgba(139, 92, 246, 0.06) 100%); | |
| position: relative; | |
| /* overflow:visible on desktop so auth container is never clipped by the hero boundary; | |
| background glows are absolutely positioned and contained by .auth-background */ | |
| overflow: visible; | |
| width: 100%; | |
| box-sizing: border-box; | |
| } | |
| .hero-content { | |
| display: grid; | |
| grid-template-columns: 1fr 1fr; | |
| gap: var(--s8); | |
| /* center: both columns (logo left, auth/cta right) sit at middle of their track */ | |
| align-items: center; | |
| width: 100%; | |
| max-width: 1200px; | |
| animation: slideUp 0.8s var(--md-easing) 0.3s forwards; | |
| opacity: 0; | |
| } | |
| /* Left Column: Logo & Title */ | |
| .hero-left { | |
| display: flex; | |
| flex-direction: column; | |
| align-items: center; | |
| justify-content: center; | |
| min-height: 100%; | |
| } | |
| .hero-brand { | |
| display: flex; | |
| align-items: center; | |
| justify-content: center; | |
| width: 100%; | |
| height: 100%; | |
| } | |
| .hero-brand svg { | |
| filter: drop-shadow(0 16px 32px rgba(15, 118, 110, 0.2)); | |
| width: 100%; | |
| height: 100%; | |
| max-width: 450px; | |
| max-height: 450px; | |
| object-fit: contain; | |
| } | |
| .hero-title { | |
| font-size: 3.5rem; | |
| font-weight: 700; | |
| line-height: 1.1; | |
| color: var(--md-on-bg); | |
| margin: 0 0 var(--s4) 0; | |
| background: linear-gradient(90deg, var(--md-primary) 0%, var(--md-primary-container) 100%); | |
| -webkit-background-clip: text; | |
| -webkit-text-fill-color: transparent; | |
| background-clip: text; | |
| } | |
| /* Right Column: Title, Description & CTA */ | |
| .hero-right { | |
| display: flex; | |
| flex-direction: column; | |
| /* center so auth card sits vertically aligned with logo on desktop */ | |
| justify-content: center; | |
| gap: var(--s5); | |
| text-align: left; | |
| padding-top: 0; | |
| } | |
| .hero-subtitle { | |
| font-size: 1.75rem; | |
| font-weight: 600; | |
| color: var(--md-on-surface-variant); | |
| margin: 0; | |
| letter-spacing: -0.5px; | |
| line-height: 1.2; | |
| } | |
| .hero-description { | |
| font-size: 1.125rem; | |
| line-height: 1.7; | |
| color: var(--md-on-surface-variant); | |
| margin: 0; | |
| } | |
| .hero-cta { | |
| display: flex; | |
| flex-direction: row; | |
| gap: var(--s3); | |
| margin-top: var(--s2); | |
| flex-wrap: wrap; | |
| align-items: center; | |
| width: 100%; | |
| box-sizing: border-box; | |
| } | |
| /* Hero buttons: Sign In, Create Account (50% width each), Learn More (full width) */ | |
| .hero-btn { | |
| display: inline-flex; | |
| align-items: center; | |
| justify-content: center; | |
| gap: var(--s2); | |
| padding: var(--s3) var(--s5); | |
| font-size: var(--md-label-large); | |
| font-weight: 700; | |
| letter-spacing: 0.5px; | |
| border-radius: var(--md-corner-full); | |
| transition: all var(--md-duration-short) var(--md-easing); | |
| text-decoration: none; | |
| cursor: pointer; | |
| border: none; | |
| flex: 0 1 calc(50% - var(--s2)); | |
| min-height: 44px; | |
| min-width: 140px; | |
| } | |
| /* First two buttons (Sign In, Create Account) β responsive 50% width */ | |
| .hero-btn:nth-child(1), | |
| .hero-btn:nth-child(2) { | |
| flex: 0 1 calc(50% - var(--s2)); | |
| } | |
| /* Third button (Learn More) β full width */ | |
| .hero-btn:nth-child(3) { | |
| flex: 0 1 100%; | |
| } | |
| /* Consistent button color variants across all contexts */ | |
| .hero-btn.btn-primary { | |
| background: var(--md-primary); | |
| color: var(--md-on-primary); | |
| } | |
| .hero-btn.btn-primary:hover:not(:disabled) { | |
| background: var(--md-primary-light); | |
| } | |
| .hero-btn.btn-primary:active:not(:disabled) { | |
| background: var(--md-primary-dark); | |
| } | |
| .hero-btn.btn-secondary { | |
| background: var(--md-secondary); | |
| color: var(--md-on-secondary); | |
| } | |
| .hero-btn.btn-secondary:hover:not(:disabled) { | |
| background: var(--md-secondary-light); | |
| } | |
| .hero-btn.btn-secondary:active:not(:disabled) { | |
| background: var(--md-secondary-dark); | |
| } | |
| .hero-btn.btn-outline { | |
| background: transparent; | |
| color: var(--md-primary); | |
| border: 2px solid var(--md-primary); | |
| } | |
| .hero-btn.btn-outline:hover:not(:disabled) { | |
| background: var(--md-primary-transparent-5); | |
| } | |
| .hero-btn.btn-outline:active:not(:disabled) { | |
| background: var(--md-primary-transparent-10); | |
| } | |
| .hero-btn:disabled { | |
| opacity: 0.38; | |
| cursor: not-allowed; | |
| } | |
| .hero-btn .material-symbols-rounded { | |
| font-size: 24px; | |
| width: 24px; | |
| height: 24px; | |
| } | |
| /* Hero Auth Container β Auth forms rendered in right column on "Get Started" */ | |
| .hero-auth-container { | |
| display: flex; | |
| flex-direction: column; | |
| gap: var(--s3); | |
| padding: var(--s5) var(--s6) var(--s4) var(--s6); | |
| background: var(--hero-auth-bg); | |
| backdrop-filter: blur(12px); | |
| -webkit-backdrop-filter: blur(12px); | |
| border: 1px solid rgba(255, 255, 255, 0.1); | |
| border-radius: var(--md-corner-xl); | |
| box-shadow: var(--md-elevation-2); | |
| animation: slideInUp 0.4s var(--md-easing); | |
| /* | |
| * Single scroll zone β ONLY this container scrolls, never inner panels. | |
| * max-height: 82vh β self-adapts to any viewport: | |
| * Sign In (~380px content) β fits without scroll on β₯465px viewport | |
| * Create Account (~600px) β scrollable with button always ~1 scroll away | |
| * overflow-y: auto β scrollbar only appears when content actually overflows | |
| */ | |
| max-height: 82vh; | |
| min-height: min(var(--auth-min-height), 82vh); | |
| overflow-y: auto; | |
| overflow-x: hidden; | |
| scroll-behavior: smooth; | |
| /* ββ Smooth scrollbar styling (Firefox) ββ */ | |
| scrollbar-width: thin; | |
| scrollbar-color: var(--md-primary-light) transparent; | |
| } | |
| /* ββ Webkit scrollbar styling (Chrome, Safari) ββ */ | |
| .hero-auth-container::-webkit-scrollbar { | |
| width: 6px; | |
| } | |
| .hero-auth-container::-webkit-scrollbar-track { | |
| background: transparent; | |
| } | |
| .hero-auth-container::-webkit-scrollbar-thumb { | |
| background-color: var(--md-primary-light); | |
| border-radius: 3px; | |
| border: 2px solid transparent; | |
| background-clip: content-box; | |
| } | |
| /* Remove redundant bottom spacing inside the auth container */ | |
| .hero-auth-container>*:last-child { | |
| margin-bottom: 0; | |
| padding-bottom: 0; | |
| } | |
| .hero-auth-container .auth-form-panel { | |
| padding-bottom: var(--s2); | |
| } | |
| /* Auth panels: NO internal scroll β the outer .hero-auth-container handles all scrolling. | |
| This eliminates the double-scrollbar problem (nested scroll zones). */ | |
| .hero-auth-container .auth-form-panel { | |
| min-height: 0; | |
| max-height: none; | |
| overflow-y: visible; | |
| overflow-x: visible; | |
| } | |
| /* ------------------------------------------------------------------ | |
| Auth: authoritative tokenized overrides | |
| Purpose: ensure auth form spacing, inputs and action rows are | |
| consistent and cannot be inadvertently overridden by other | |
| duplicated/form-specific rules elsewhere in the file. | |
| High specificity scoped to `.hero-auth-container` so it only | |
| affects the landing auth UI. | |
| ------------------------------------------------------------------ */ | |
| .hero-auth-container .form-group { | |
| display: flex; | |
| flex-direction: column; | |
| gap: var(--s2); | |
| margin: 0 0 var(--s2) 0; | |
| } | |
| .hero-auth-container .form-group input:not([type="checkbox"]), | |
| .hero-auth-container .form-group textarea { | |
| padding: var(--s2) var(--s4); | |
| min-height: var(--s11); | |
| box-sizing: border-box; | |
| } | |
| .hero-auth-container .form-group.checkbox { | |
| flex-direction: row; | |
| align-items: center; | |
| gap: var(--s1); | |
| margin: var(--s1) 0; | |
| padding: 0; | |
| } | |
| .hero-auth-container .auth-actions { | |
| display: flex; | |
| gap: var(--s3); | |
| margin-top: var(--s3); | |
| } | |
| .hero-auth-container .auth-actions .auth-back-inline { | |
| flex: 0 1 calc(25% - var(--s2)); | |
| min-height: var(--s11); | |
| } | |
| .hero-auth-container .auth-actions .auth-submit-btn { | |
| flex: 0 1 calc(75% - var(--s2)); | |
| min-height: var(--s11); | |
| } | |
| .hero-auth-container .auth-actions .auth-back-inline, | |
| .hero-auth-container .auth-actions .auth-submit-btn { | |
| width: auto; | |
| } | |
| #hero-content-wrapper { | |
| display: flex; | |
| flex-direction: column; | |
| gap: var(--s5); | |
| transition: all 0.3s var(--md-easing); | |
| } | |
| /* ββ Text Button (Ghost/Minimal Style) ββ */ | |
| .btn-text { | |
| display: inline-flex; | |
| align-items: center; | |
| justify-content: center; | |
| gap: var(--s2); | |
| width: 100%; | |
| padding: var(--s3) var(--s5); | |
| background: transparent; | |
| color: var(--md-primary); | |
| border: none; | |
| border-radius: var(--md-corner-full); | |
| font-size: var(--md-label-large); | |
| font-weight: 700; | |
| letter-spacing: 0.5px; | |
| cursor: pointer; | |
| transition: all var(--md-duration-short) var(--md-easing); | |
| min-height: 44px; | |
| } | |
| .btn-text:hover:not(:disabled) { | |
| background: var(--md-primary-transparent-8); | |
| color: var(--md-primary); | |
| } | |
| .btn-text:active:not(:disabled) { | |
| background: var(--md-primary-transparent-12); | |
| color: var(--md-primary-dark); | |
| } | |
| .btn-text:focus-visible { | |
| outline: 2px solid var(--md-primary); | |
| outline-offset: 2px; | |
| } | |
| .btn-text:disabled { | |
| opacity: 0.38; | |
| cursor: not-allowed; | |
| } | |
| .btn-text .material-symbols-rounded { | |
| font-size: 24px; | |
| width: 24px; | |
| height: 24px; | |
| } | |
| /* ββ Tonal Button (Light background with color) ββ */ | |
| .btn-tonal { | |
| display: inline-flex; | |
| align-items: center; | |
| justify-content: center; | |
| gap: var(--s2); | |
| width: 100%; | |
| padding: var(--s3) var(--s5); | |
| background: var(--md-primary-transparent-12); | |
| color: var(--md-primary); | |
| border: none; | |
| border-radius: var(--md-corner-full); | |
| font-size: var(--md-label-large); | |
| font-weight: 700; | |
| letter-spacing: 0.5px; | |
| cursor: pointer; | |
| transition: all var(--md-duration-short) var(--md-easing); | |
| min-height: 44px; | |
| box-shadow: var(--md-elevation-1); | |
| } | |
| .btn-tonal:hover:not(:disabled) { | |
| background: var(--md-primary-transparent-16); | |
| color: var(--md-primary); | |
| } | |
| .btn-tonal:active:not(:disabled) { | |
| background: var(--md-primary-transparent-20); | |
| color: var(--md-primary-dark); | |
| } | |
| .btn-tonal:focus-visible { | |
| outline: 2px solid var(--md-primary); | |
| outline-offset: 2px; | |
| } | |
| .btn-tonal:disabled { | |
| opacity: 0.38; | |
| cursor: not-allowed; | |
| } | |
| .btn-tonal .material-symbols-rounded { | |
| font-size: 24px; | |
| width: 24px; | |
| height: 24px; | |
| } | |
| /* Tablet Responsive (768px - 1024px) */ | |
| @media (max-width: 1024px) { | |
| .hero-content { | |
| grid-template-columns: 1fr; | |
| gap: var(--s6); | |
| } | |
| .hero-left { | |
| display: flex; | |
| align-items: center; | |
| justify-content: center; | |
| min-height: 300px; | |
| padding-bottom: 0; | |
| border-bottom: none; | |
| } | |
| .hero-brand svg { | |
| max-width: 320px; | |
| max-height: 320px; | |
| } | |
| .hero-title { | |
| font-size: 3rem; | |
| margin-bottom: var(--s3); | |
| } | |
| .hero-subtitle { | |
| font-size: 1.5rem; | |
| } | |
| .hero-description { | |
| font-size: 1rem; | |
| } | |
| .hero-right { | |
| padding-top: 0; | |
| justify-content: flex-start; | |
| text-align: center; | |
| align-items: center; | |
| gap: var(--s5); | |
| } | |
| .hero-cta { | |
| width: 100%; | |
| flex-wrap: wrap; | |
| align-items: center; | |
| } | |
| .hero-btn { | |
| justify-content: center; | |
| flex-basis: calc(50% - var(--s2)); | |
| } | |
| .hero-btn:nth-child(3) { | |
| flex-basis: 100%; | |
| } | |
| /* Tablet: Adjust auth container height for medium screens */ | |
| .hero-auth-container .form-group { | |
| display: flex; | |
| flex-direction: column; | |
| gap: var(--s2); | |
| margin: 0 0 var(--s2) 0; | |
| } | |
| .hero-auth-container .form-group input:not([type="checkbox"]), | |
| .hero-auth-container .form-group textarea { | |
| padding: var(--s2) var(--s4); | |
| min-height: var(--s11); | |
| box-sizing: border-box; | |
| } | |
| .hero-auth-container .form-group.checkbox { | |
| flex-direction: row; | |
| align-items: center; | |
| gap: var(--s1); | |
| margin: var(--s1) 0; | |
| padding: 0; | |
| } | |
| .hero-auth-container .auth-actions { | |
| display: flex; | |
| gap: var(--s3); | |
| margin-top: var(--s3); | |
| } | |
| .hero-auth-container .auth-actions .auth-back-inline { | |
| flex: 0 1 calc(25% - var(--s2)); | |
| min-height: var(--s11); | |
| } | |
| .hero-auth-container .auth-actions .auth-submit-btn { | |
| flex: 0 1 calc(75% - var(--s2)); | |
| min-height: var(--s11); | |
| } | |
| .hero-auth-container .auth-actions .auth-back-inline, | |
| .hero-auth-container .auth-actions .auth-submit-btn { | |
| width: auto; | |
| } | |
| /* Create Account panel: no separate height constraints β outer container handles scroll */ | |
| .hero-auth-container #auth-form-signup { | |
| min-height: 0; | |
| max-height: none; | |
| overflow: visible; | |
| } | |
| .hero-auth-container #auth-form-signup .auth-actions { | |
| display: flex; | |
| gap: var(--s3); | |
| padding-top: var(--s2); | |
| align-items: center; | |
| justify-content: flex-start; | |
| } | |
| .hero-auth-container #auth-form-signup .auth-submit-btn { | |
| padding: var(--s3) var(--s5); | |
| } | |
| .hero-auth-container #auth-form-signup .auth-back-inline { | |
| padding: var(--s2) var(--s4); | |
| } | |
| .hero-title { | |
| font-size: 2.25rem; | |
| line-height: 1.15; | |
| margin-bottom: var(--s2); | |
| } | |
| .hero-subtitle { | |
| font-size: 1.25rem; | |
| line-height: 1.3; | |
| } | |
| .hero-description { | |
| font-size: 1rem; | |
| line-height: 1.6; | |
| } | |
| .hero-right { | |
| padding-top: 0; | |
| text-align: center; | |
| align-items: center; | |
| gap: var(--s4); | |
| } | |
| .hero-cta { | |
| width: 100%; | |
| flex-direction: row; | |
| flex-wrap: wrap; | |
| align-items: stretch; | |
| } | |
| .hero-btn { | |
| justify-content: center; | |
| flex-basis: calc(50% - var(--s2)); | |
| padding: var(--s3) var(--s4); | |
| font-size: var(--md-label-medium); | |
| } | |
| .hero-btn:nth-child(3) { | |
| flex-basis: 100%; | |
| } | |
| /* Mobile: tighter viewport β pull back slightly so URL bar doesn't hide the submit button */ | |
| .hero-auth-container { | |
| max-height: 78vh; | |
| } | |
| /* Mobile: stack inline auth actions to full width */ | |
| .auth-actions { | |
| flex-direction: column; | |
| } | |
| .auth-actions .auth-back-inline, | |
| .auth-actions .auth-submit-btn { | |
| flex: 1 1 100%; | |
| } | |
| } | |
| /* Light theme overrides */ | |
| [data-theme="light"] { | |
| --md-bg: #FAFBFF; | |
| --md-surface: #FFFFFF; | |
| --md-surface-2: #F4F6FB; | |
| --md-surface-dim: rgba(0, 0, 0, 0.04); | |
| --md-on-surface: #0B1428; | |
| --md-on-surface-muted: #475569; | |
| --hero-auth-bg: rgba(255, 255, 255, 0.92); | |
| } | |
| /* Ensure hero auth inputs and placeholders are readable in light mode */ | |
| [data-theme="light"] .hero-auth-container .form-group input:not([type="checkbox"]), | |
| [data-theme="light"] .hero-auth-container .form-group textarea { | |
| background: var(--md-surface-2); | |
| color: var(--md-on-surface); | |
| border-color: var(--md-outline); | |
| } | |
| [data-theme="light"] .hero-auth-container .form-group input:not([type="checkbox"])::placeholder, | |
| [data-theme="light"] .hero-auth-container .form-group textarea::placeholder { | |
| color: var(--md-on-surface-muted); | |
| opacity: 1; | |
| } | |
| /* Bento Grid Sections */ | |
| .landing-bento { | |
| display: flex; | |
| flex-direction: column; | |
| gap: var(--s5); | |
| padding: var(--s5); | |
| background: var(--md-bg); | |
| width: 100%; | |
| box-sizing: border-box; | |
| } | |
| .bento-section { | |
| display: flex; | |
| flex-direction: column; | |
| gap: var(--s6); | |
| animation: fadeInUp 0.6s var(--md-easing) forwards; | |
| } | |
| .bento-section:nth-child(1) { | |
| animation-delay: 0.1s; | |
| } | |
| .bento-section:nth-child(2) { | |
| animation-delay: 0.2s; | |
| } | |
| .bento-section:nth-child(3) { | |
| animation-delay: 0.3s; | |
| } | |
| .bento-section:nth-child(4) { | |
| animation-delay: 0.4s; | |
| } | |
| .bento-section-title { | |
| font-size: 1.75rem; | |
| font-weight: 700; | |
| color: var(--md-on-bg); | |
| margin: 0; | |
| display: flex; | |
| align-items: center; | |
| gap: var(--s3); | |
| } | |
| .bento-section-title .material-symbols-rounded { | |
| font-size: var(--md-icon-xlarge); | |
| color: var(--md-primary); | |
| } | |
| .bento-grid { | |
| display: grid; | |
| /* collage layout: responsive auto-fill with dense packing */ | |
| grid-template-columns: repeat(auto-fill, minmax(220px, 1fr)); | |
| /* allow rows to grow to fit card content to prevent overlap */ | |
| grid-auto-rows: minmax(120px, auto); | |
| grid-auto-flow: dense; | |
| gap: calc(var(--s3) / 1.2); | |
| width: 100%; | |
| } | |
| /* ββ Bento Cards βββββββββββββββββββββββββββββββββββββββββββββββββββββββββ */ | |
| .bento-card { | |
| display: flex; | |
| flex-direction: column; | |
| padding: var(--s4); | |
| background: var(--md-surface); | |
| border: 0; | |
| border-radius: var(--md-corner-md); | |
| gap: var(--s3); | |
| text-decoration: none; | |
| color: inherit; | |
| transition: transform 0.28s var(--md-easing), box-shadow 0.28s var(--md-easing); | |
| cursor: pointer; | |
| position: relative; | |
| overflow: hidden; | |
| min-height: 120px; | |
| display: block; | |
| align-self: stretch; | |
| box-shadow: var(--md-elevation-1); | |
| } | |
| .bento-card::before { | |
| content: ''; | |
| position: absolute; | |
| top: 0; | |
| left: 0; | |
| right: 0; | |
| bottom: 0; | |
| background: linear-gradient(135deg, rgba(0, 0, 0, 0.04) 0%, transparent 100%); | |
| opacity: 0; | |
| transition: opacity 0.25s var(--md-easing); | |
| pointer-events: none; | |
| } | |
| .bento-card:hover { | |
| transform: translateY(-6px) scale(1.01); | |
| box-shadow: var(--md-elevation-3); | |
| } | |
| .bento-card:hover::before { | |
| opacity: 1; | |
| } | |
| .bento-card.bento-large { | |
| grid-column: span 2; | |
| grid-row: span 2; | |
| min-height: auto; | |
| } | |
| .bento-icon { | |
| font-size: var(--md-icon-large); | |
| color: rgba(255, 255, 255, 0.95); | |
| align-self: flex-start; | |
| } | |
| .bento-card h3 { | |
| font-size: 1.25rem; | |
| font-weight: 700; | |
| color: var(--md-on-surface); | |
| margin: 0; | |
| line-height: 1.2; | |
| } | |
| .bento-card p { | |
| font-size: 0.95rem; | |
| line-height: 1.5; | |
| color: rgba(255, 255, 255, 0.9); | |
| margin: 0; | |
| flex-grow: 1; | |
| } | |
| /* Bento color variants (use color schemes to differentiate sections) */ | |
| .bento-card.variant-product { | |
| background: linear-gradient(135deg, #0f766e 0%, #0ea5a3 100%); | |
| color: var(--md-on-primary); | |
| } | |
| .bento-card.variant-company { | |
| background: linear-gradient(135deg, #7c3aed 0%, #a78bfa 100%); | |
| color: var(--md-on-primary); | |
| } | |
| .bento-card.variant-resources { | |
| background: linear-gradient(135deg, #0ea5e9 0%, #7dd3fc 100%); | |
| color: var(--md-on-primary); | |
| } | |
| .bento-card.variant-support { | |
| background: linear-gradient(135deg, #f97316 0%, #fb923c 100%); | |
| color: var(--md-on-secondary); | |
| } | |
| .bento-card.variant-product .bento-icon, | |
| .bento-card.variant-company .bento-icon, | |
| .bento-card.variant-resources .bento-icon, | |
| .bento-card.variant-support .bento-icon { | |
| color: rgba(255, 255, 255, 0.95); | |
| } | |
| /* Slight stagger/rotation for collage feel */ | |
| .bento-card { | |
| transform: none; | |
| } | |
| /* Size variants for bento layout */ | |
| .bento-card.bento-medium { | |
| grid-column: span 2; | |
| grid-row: span 1; | |
| min-height: 160px; | |
| } | |
| .bento-card.bento-small { | |
| grid-column: span 1; | |
| grid-row: span 1; | |
| min-height: 120px; | |
| box-shadow: var(--md-elevation-1); | |
| } | |
| .data-card:hover { | |
| box-shadow: var(--md-elevation-2); | |
| } | |
| .main-content-card { | |
| box-shadow: var(--md-elevation-2); | |
| } | |
| /* Make resource cards (Guides, Blog) taller on desktop for better space fill */ | |
| @media (min-width: 1025px) { | |
| .bento-card.bento-small.variant-resources { | |
| grid-row: span 2; | |
| min-height: auto; | |
| } | |
| } | |
| /* MD3-like elevation and softer surfaces */ | |
| .bento-card { | |
| box-shadow: 0 1px 2px rgba(2, 6, 23, 0.06), 0 4px 8px rgba(2, 6, 23, 0.04); | |
| border-radius: var(--md-corner-md); | |
| background-clip: padding-box; | |
| } | |
| /* Tilt only on hover for a refined, professional effect */ | |
| .bento-card:hover { | |
| transform: translateY(-6px) rotate(-0.6deg) scale(1.02); | |
| box-shadow: 0 22px 44px rgba(2, 6, 23, 0.14); | |
| } | |
| .bento-card:focus-visible { | |
| transform: translateY(-6px) scale(1.02); | |
| box-shadow: 0 22px 44px rgba(2, 6, 23, 0.16); | |
| outline: 3px solid rgba(15, 118, 110, 0.12); | |
| } | |
| /* ββ Landing Auth Section ββββββββββββββββββββββββββββββββββββββββββββββββ */ | |
| .landing-auth-section { | |
| padding: var(--s5); | |
| background: linear-gradient(135deg, rgba(15, 118, 110, 0.06) 0%, rgba(139, 92, 246, 0.04) 100%); | |
| border-top: 1px solid var(--md-outline); | |
| flex-shrink: 1; | |
| /* Fixed overflow */ | |
| width: 100%; | |
| box-sizing: border-box; | |
| } | |
| .auth-form-wrapper { | |
| display: flex; | |
| flex-direction: column; | |
| max-width: 480px; | |
| width: 100%; | |
| margin: 0 auto; | |
| gap: 0; | |
| animation: fadeInUp 0.6s var(--md-easing) 0.5s forwards; | |
| opacity: 0; | |
| padding: 0; | |
| box-sizing: border-box; | |
| background: var(--md-surface); | |
| border: 1px solid var(--md-outline); | |
| border-radius: var(--md-corner-lg); | |
| box-shadow: var(--md-elevation-2); | |
| overflow: hidden; | |
| } | |
| .auth-brand-inline { | |
| display: flex; | |
| flex-direction: row; | |
| gap: var(--s5); | |
| align-items: flex-start; | |
| padding-bottom: var(--s4); | |
| border-bottom: 1px solid var(--md-outline); | |
| } | |
| .auth-brand-inline svg { | |
| width: 56px; | |
| height: 56px; | |
| flex-shrink: 1; | |
| /* Fixed overflow */ | |
| filter: drop-shadow(0 4px 8px rgba(15, 118, 110, 0.1)); | |
| } | |
| .auth-brand-inline>div { | |
| display: flex; | |
| flex-direction: column; | |
| gap: var(--s2); | |
| text-align: left; | |
| flex: 1; | |
| } | |
| .auth-brand-inline h2 { | |
| font-size: 1.5rem; | |
| font-weight: 700; | |
| color: var(--md-on-surface); | |
| margin: 0; | |
| line-height: 1.2; | |
| } | |
| .auth-brand-inline p { | |
| color: var(--md-on-surface-muted); | |
| margin: 0; | |
| font-size: 0.875rem; | |
| line-height: 1.4; | |
| } | |
| /* ββ Responsive Landing Page ββββββββββββββββββββββββββββββββββββββββββββ */ | |
| @media (max-width: 1024px) { | |
| .landing-hero { | |
| min-height: 80vh; | |
| padding: var(--s4) var(--s3); | |
| overflow: hidden; | |
| /* single-col on tablet: clip glows */ | |
| } | |
| .hero-title { | |
| font-size: 2.2rem; | |
| } | |
| .hero-subtitle { | |
| font-size: 1.35rem; | |
| } | |
| .bento-card.bento-large { | |
| grid-column: span 1; | |
| } | |
| .landing-bento { | |
| padding: var(--s4); | |
| gap: var(--s5); | |
| } | |
| .landing-auth-section { | |
| padding: var(--s4); | |
| } | |
| } | |
| @media (max-width: 768px) { | |
| .landing-hero { | |
| min-height: 70vh; | |
| padding: var(--s3) var(--s2); | |
| /* Clip decorative glows on mobile β desktop keeps overflow:visible for auth card growth */ | |
| overflow: hidden; | |
| } | |
| .hero-content { | |
| gap: var(--s3); | |
| } | |
| .hero-title { | |
| font-size: 1.65rem; | |
| } | |
| .hero-subtitle { | |
| font-size: 1.1rem; | |
| } | |
| .hero-description { | |
| font-size: 0.9rem; | |
| } | |
| .hero-cta { | |
| gap: var(--s2); | |
| } | |
| .hero-btn { | |
| padding: var(--s2) var(--s3); | |
| font-size: var(--md-label-small); | |
| } | |
| .bento-grid { | |
| grid-template-columns: 1fr; | |
| gap: var(--s3); | |
| } | |
| .bento-section-title { | |
| font-size: 1.2rem; | |
| } | |
| .bento-section { | |
| gap: var(--s4); | |
| } | |
| .landing-bento { | |
| padding: var(--s3); | |
| gap: var(--s4); | |
| } | |
| .landing-auth-section { | |
| padding: var(--s3); | |
| } | |
| .auth-form-wrapper { | |
| max-width: 100%; | |
| } | |
| } | |
| @media (max-width: 640px) { | |
| .landing-hero { | |
| min-height: 65vh; | |
| padding: var(--s2) var(--s2); | |
| } | |
| .hero-content { | |
| gap: var(--s2); | |
| } | |
| .hero-brand svg { | |
| width: 40px; | |
| height: 40px; | |
| } | |
| .hero-title { | |
| font-size: 1.35rem; | |
| line-height: 1.3; | |
| } | |
| .hero-subtitle { | |
| font-size: 0.95rem; | |
| } | |
| .hero-description { | |
| font-size: 0.85rem; | |
| line-height: 1.4; | |
| } | |
| .hero-cta { | |
| flex-direction: column; | |
| width: 100%; | |
| gap: var(--s1); | |
| } | |
| .hero-btn { | |
| width: 100%; | |
| padding: var(--s2) var(--s2); | |
| font-size: 0.875rem; | |
| } | |
| .hero-btn .material-symbols-rounded { | |
| font-size: var(--md-body-large); | |
| } | |
| .bento-card { | |
| min-height: 150px; | |
| padding: var(--s2); | |
| } | |
| .bento-icon { | |
| font-size: 1.75rem; | |
| } | |
| .bento-card h3 { | |
| font-size: 0.95rem; | |
| } | |
| .bento-card p { | |
| font-size: 0.8rem; | |
| } | |
| .bento-section { | |
| gap: var(--s3); | |
| } | |
| .bento-section-title { | |
| font-size: 1.1rem; | |
| } | |
| .landing-bento { | |
| padding: var(--s2); | |
| gap: var(--s3); | |
| } | |
| .landing-auth-section { | |
| padding: var(--s2); | |
| } | |
| .auth-brand-inline svg { | |
| width: 40px; | |
| height: 40px; | |
| } | |
| .auth-brand-inline h2 { | |
| font-size: 1.25rem; | |
| } | |
| .auth-brand-inline p { | |
| font-size: 0.8rem; | |
| } | |
| .auth-form-wrapper { | |
| gap: var(--s2); | |
| } | |
| .form-group input { | |
| padding: var(--s2) var(--s3); | |
| font-size: 0.875rem; | |
| } | |
| .auth-tab-btn { | |
| padding: var(--s3) var(--s4); | |
| font-size: 0.875rem; | |
| } | |
| } | |
| @keyframes pulse { | |
| 0%, | |
| 100% { | |
| opacity: 1; | |
| } | |
| 50% { | |
| opacity: 0.45; | |
| } | |
| } | |
| /* Responsive Navigation β Sidebar visible (desktop) or collapsible (mobile) */ | |
| /* Hamburger Toggle Button (Mobile Only) */ | |
| .nav-toggle-btn { | |
| display: none; | |
| position: fixed; | |
| top: 50%; | |
| left: var(--s4); | |
| transform: translateY(-50%); | |
| width: 48px; | |
| height: 48px; | |
| background: var(--md-primary); | |
| color: var(--md-on-primary); | |
| border: none; | |
| border-radius: var(--md-corner-md); | |
| cursor: pointer; | |
| z-index: calc(var(--z-sidebar) - 20); | |
| align-items: center; | |
| justify-content: center; | |
| transition: all var(--md-duration-short) var(--md-easing); | |
| } | |
| .nav-toggle-btn:hover { | |
| background: var(--md-primary-light); | |
| } | |
| .hamburger { | |
| display: flex; | |
| flex-direction: column; | |
| gap: 6px; | |
| width: 24px; | |
| height: 24px; | |
| } | |
| .hamburger span { | |
| width: 100%; | |
| height: 2px; | |
| background: var(--md-on-surface); | |
| border-radius: var(--md-corner-pixel); | |
| transition: all var(--md-duration-short) var(--md-easing); | |
| } | |
| /* ββ Header Menu Button (Mobile Only) ββββββββββββββββββββββββββββββββ */ | |
| .header-menu-btn { | |
| display: none; | |
| background: none; | |
| border: none; | |
| color: var(--md-primary); | |
| font-size: 1.5rem; | |
| cursor: pointer; | |
| padding: 0; | |
| min-width: 44px; | |
| min-height: 44px; | |
| align-items: center; | |
| justify-content: center; | |
| transition: color var(--md-duration-short) var(--md-easing); | |
| } | |
| .header-menu-btn:hover { | |
| color: var(--md-primary-light); | |
| } | |
| /* ββ Sidebar Navigation (Left Panel) β Smooth slide without layout shift ββββββββββββββββββββββββββ */ | |
| .app-sidebar { | |
| position: fixed; | |
| left: 0; | |
| top: 0; | |
| width: 280px; | |
| height: 100vh; | |
| background: var(--md-surface); | |
| border-right: 1px solid var(--md-outline); | |
| display: flex; | |
| flex-direction: column; | |
| z-index: var(--z-sidebar); | |
| overflow-y: auto; | |
| overflow-x: hidden; | |
| transform: translateX(-280px); | |
| transition: transform var(--md-duration-medium) var(--md-easing), | |
| opacity var(--md-duration-medium) var(--md-easing); | |
| opacity: 0; | |
| pointer-events: none; | |
| padding: 0; | |
| box-shadow: 2px 0 8px rgba(0, 0, 0, 0.1); | |
| } | |
| .app-sidebar:not([hidden]) { | |
| transform: translateX(0); | |
| opacity: 1; | |
| pointer-events: auto; | |
| } | |
| .sidebar-header { | |
| padding: var(--s4); | |
| display: flex; | |
| align-items: center; | |
| justify-content: space-between; | |
| border-bottom: 1px solid var(--md-outline); | |
| min-height: 60px; | |
| position: sticky; | |
| top: 0; | |
| background: var(--md-surface); | |
| z-index: 10; | |
| } | |
| .sidebar-logo { | |
| width: 40px; | |
| height: 40px; | |
| border-radius: var(--md-corner-md); | |
| background: var(--md-primary-container); | |
| display: flex; | |
| align-items: center; | |
| justify-content: center; | |
| font-size: 1.5rem; | |
| color: var(--md-primary-light); | |
| } | |
| .sidebar-close { | |
| display: none; | |
| background: none; | |
| border: none; | |
| color: var(--md-on-surface); | |
| font-size: 1.5rem; | |
| cursor: pointer; | |
| padding: 0; | |
| min-width: 44px; | |
| min-height: 44px; | |
| align-items: center; | |
| justify-content: center; | |
| } | |
| .sidebar-content { | |
| flex: 1; | |
| overflow-y: auto; | |
| padding: var(--s4) 0; | |
| } | |
| /* ββ Navigation Sections ββββββββββββββββββββββββββββββββββββββββββββββ */ | |
| .nav-section { | |
| padding: 0 0 var(--s4) 0; | |
| } | |
| .nav-section-title { | |
| font-size: var(--md-label-small); | |
| font-weight: 700; | |
| color: var(--md-on-surface-muted); | |
| text-transform: uppercase; | |
| letter-spacing: 0.08em; | |
| padding: var(--s2) var(--s4); | |
| margin: 0; | |
| } | |
| .nav-list { | |
| list-style: none; | |
| margin: 0; | |
| padding: 0; | |
| } | |
| .nav-link { | |
| display: flex; | |
| align-items: center; | |
| gap: var(--s3); | |
| width: 100%; | |
| padding: var(--s3) var(--s4); | |
| background: transparent; | |
| border: none; | |
| border-radius: var(--md-corner-sm); | |
| color: var(--md-on-surface-muted); | |
| font-size: var(--md-body-large); | |
| font-weight: 500; | |
| cursor: pointer; | |
| transition: | |
| color var(--md-duration-short) var(--md-easing), | |
| background var(--md-duration-short) var(--md-easing); | |
| position: relative; | |
| margin: 0; | |
| /* MD3 state-layer via ::after */ | |
| } | |
| /* MD3 state-layer: subtle ripple on hover without harsh bg change */ | |
| .nav-link::after { | |
| content: ''; | |
| position: absolute; | |
| inset: 0; | |
| border-radius: var(--md-corner-sm); | |
| background: var(--md-primary); | |
| opacity: 0; | |
| transition: opacity var(--md-duration-short) var(--md-easing); | |
| pointer-events: none; | |
| } | |
| .nav-link:hover { | |
| color: var(--md-on-surface); | |
| } | |
| .nav-link:hover::after { | |
| opacity: 0.06; | |
| } | |
| .nav-link:focus-visible { | |
| outline: 2px solid var(--md-primary); | |
| outline-offset: -2px; | |
| } | |
| .nav-link.active { | |
| color: var(--md-primary-light); | |
| background: var(--md-primary-container); | |
| font-weight: 600; | |
| } | |
| .nav-link.active::before { | |
| content: ''; | |
| position: absolute; | |
| left: 0; | |
| top: 0; | |
| bottom: 0; | |
| width: 3px; | |
| background: var(--md-primary); | |
| border-radius: 0 var(--md-corner-sm) var(--md-corner-sm) 0; | |
| } | |
| .nav-link .material-symbols-rounded { | |
| font-size: 1.25rem; | |
| flex-shrink: 1; | |
| } | |
| .nav-label { | |
| flex: 1; | |
| text-align: left; | |
| } | |
| .nav-badge { | |
| background: var(--md-error); | |
| color: var(--md-on-error); | |
| font-size: var(--md-label-small); | |
| font-weight: 700; | |
| padding: 2px 6px; | |
| border-radius: var(--md-corner-full); | |
| min-width: 20px; | |
| text-align: center; | |
| } | |
| .nav-link.danger { | |
| color: var(--md-error); | |
| } | |
| .nav-link.danger:hover { | |
| background: rgba(220, 38, 38, 0.08); | |
| } | |
| /* ββ Section Dividers βββββββββββββββββββββββββββββββββββββββββββββββββ */ | |
| /* All dividers follow Material Design 3 outline standard @ 1px height */ | |
| /* ββ Navigation Divider βββββββββββββββββββββββββββββββββββββββββββββββ */ | |
| .nav-divider { | |
| height: 1px; | |
| background: var(--md-outline); | |
| margin: var(--s3) 0; | |
| /* Navigation rhythm: mid-tier spacing */ | |
| } | |
| /* ββ Sidebar Footer βββββββββββββββββββββββββββββββββββββββββββββββββββ */ | |
| .sidebar-footer { | |
| padding: var(--s4); | |
| border-top: 1px solid var(--md-outline); | |
| display: flex; | |
| flex-direction: column; | |
| gap: var(--s2); | |
| } | |
| /* ββ Sidebar Backdrop (Mobile Overlay) β Smooth fade without layout shift βββββββββββββββββββββββββββββββ */ | |
| .sidebar-backdrop { | |
| position: fixed; | |
| inset: 0; | |
| background: rgba(0, 0, 0, 0.5); | |
| z-index: var(--z-sidebar-backdrop); | |
| opacity: 0; | |
| pointer-events: none; | |
| transition: opacity var(--md-duration-short) var(--md-easing), | |
| pointer-events var(--md-duration-short) var(--md-easing); | |
| backdrop-filter: blur(var(--blur-light)); | |
| -webkit-backdrop-filter: blur(var(--blur-light)); | |
| } | |
| .sidebar-backdrop:not([hidden]) { | |
| opacity: 1; | |
| pointer-events: auto; | |
| } | |
| @keyframes fadeIn { | |
| from { | |
| opacity: 0; | |
| } | |
| to { | |
| opacity: 1; | |
| } | |
| } | |
| /* ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ */ | |
| /* ββ Layout Shell β Adaptive for Sidebar βββββββββββββββββββββββββββββ */ | |
| .app-container { | |
| display: flex; | |
| flex-direction: column; | |
| min-height: 100vh; | |
| background: var(--md-bg); | |
| position: relative; | |
| padding-top: 140px; | |
| margin-left: 0 ; | |
| width: 100% ; | |
| transition: margin-left var(--md-duration-medium) ease, width var(--md-duration-medium) ease; | |
| } | |
| /* Remove header padding when header is hidden */ | |
| body:has(header.app-header[hidden]) .app-container { | |
| padding-top: 0; | |
| } | |
| /* When sidebar is hidden, remove the margin from app-container */ | |
| body:has(#app-sidebar[hidden]) .app-container { | |
| margin-left: 0; | |
| width: 100%; | |
| } | |
| /* Auth page: Always full width, no sidebar */ | |
| .auth-page { | |
| margin-left: 0 ; | |
| width: 100% ; | |
| padding-top: 0 ; | |
| } | |
| /* Landing page (unauthenticated): Full width spanning */ | |
| .app-container .landing-page { | |
| padding-top: 0; | |
| } | |
| /* ββ Header β Fixed & Responsive (Always Visible) βββββββββββββββββββββββββββββββββββ */ | |
| .app-header { | |
| display: flex; | |
| flex-direction: column; | |
| gap: var(--s3); | |
| padding: var(--s4) var(--s6); | |
| background: var(--glass-header-bg); | |
| backdrop-filter: blur(12px); | |
| -webkit-backdrop-filter: blur(12px); | |
| border-bottom: 1px solid var(--glass-header-border); | |
| box-shadow: var(--md-elevation-1); | |
| position: fixed; | |
| top: 0; | |
| left: 0; | |
| right: 0; | |
| z-index: var(--z-header); | |
| height: auto; | |
| } | |
| /* When header is hidden, ensure no layout space is reserved */ | |
| .app-header[hidden] { | |
| display: none ; | |
| pointer-events: none; | |
| } | |
| /* Header Components β Breadcrumbs, search, notifications, user menu */ | |
| /* Header Layout Structure */ | |
| .header-top { | |
| display: flex; | |
| align-items: center; | |
| justify-content: space-between; | |
| gap: var(--s4); | |
| } | |
| .header-left { | |
| order: 1; | |
| } | |
| .header-center { | |
| order: 2; | |
| } | |
| .header-search { | |
| order: 3; | |
| } | |
| .header-right { | |
| order: 4; | |
| } | |
| .header-left { | |
| display: flex; | |
| align-items: center; | |
| gap: var(--s4); | |
| min-width: 0; | |
| } | |
| .header-center { | |
| display: flex; | |
| align-items: center; | |
| gap: var(--s6); | |
| min-width: 0; | |
| flex: 1; | |
| } | |
| /* Global search positioned right-aligned before buttons */ | |
| .header-top .header-search { | |
| position: relative; | |
| width: 100%; | |
| max-width: 320px; | |
| flex-shrink: 1; | |
| /* Fixed overflow */ | |
| order: 3; | |
| } | |
| .header-right { | |
| display: flex; | |
| align-items: center; | |
| gap: var(--s3); | |
| flex-shrink: 1; | |
| /* Fixed overflow */ | |
| } | |
| /* Branding Section */ | |
| .header-brand { | |
| display: flex; | |
| align-items: center; | |
| gap: var(--s3); | |
| min-width: 0; | |
| } | |
| .header-logo { | |
| width: 36px; | |
| height: 36px; | |
| border-radius: var(--md-corner-md); | |
| background: var(--md-primary-container); | |
| display: flex; | |
| align-items: center; | |
| justify-content: center; | |
| flex-shrink: 1; | |
| /* Fixed overflow */ | |
| } | |
| .header-logo svg { | |
| width: 100%; | |
| height: 100%; | |
| } | |
| .header-brand-text { | |
| display: flex; | |
| flex-direction: column; | |
| gap: 2px; | |
| min-width: 0; | |
| } | |
| .header-brand-name { | |
| font-size: var(--md-title-large); | |
| font-weight: 700; | |
| color: var(--md-on-surface); | |
| margin: 0; | |
| white-space: nowrap; | |
| } | |
| .header-product-tag { | |
| font-size: var(--md-label-small); | |
| color: var(--md-on-surface-muted); | |
| font-weight: 500; | |
| } | |
| /* Navigation Toggle Button */ | |
| .nav-toggle-icon { | |
| display: flex; | |
| align-items: center; | |
| justify-content: center; | |
| width: 40px; | |
| height: 40px; | |
| background: transparent; | |
| border: none; | |
| border-radius: 50%; | |
| color: var(--md-on-surface); | |
| cursor: pointer; | |
| transition: all var(--md-duration-short) var(--md-easing); | |
| } | |
| .nav-toggle-icon:hover { | |
| background: var(--md-primary-container); | |
| color: var(--md-primary); | |
| } | |
| /* Breadcrumb Navigation */ | |
| .breadcrumb { | |
| display: flex; | |
| align-items: center; | |
| height: 40px; | |
| } | |
| .breadcrumb-list { | |
| list-style: none; | |
| padding: 0; | |
| margin: 0; | |
| display: flex; | |
| align-items: center; | |
| gap: var(--s2); | |
| } | |
| .breadcrumb-link { | |
| color: var(--md-on-surface-muted); | |
| text-decoration: none; | |
| font-size: var(--md-label-medium); | |
| padding: var(--s1) var(--s2); | |
| border-radius: var(--md-corner-sm); | |
| transition: all var(--md-duration-short) var(--md-easing); | |
| } | |
| .breadcrumb-link:hover { | |
| background: var(--md-primary-container); | |
| color: var(--md-primary); | |
| } | |
| .breadcrumb-link.active { | |
| color: var(--md-primary); | |
| font-weight: 600; | |
| } | |
| .breadcrumb-separator { | |
| color: var(--md-on-surface-variant); | |
| /* Text separators use variant token */ | |
| font-weight: 500; | |
| margin: 0 var(--s1); | |
| /* Consistent slash spacing */ | |
| } | |
| /* Search Bar */ | |
| .header-search { | |
| position: relative; | |
| width: 100%; | |
| max-width: 400px; | |
| } | |
| .search-input { | |
| width: 100%; | |
| padding: var(--s3) var(--s4); | |
| padding-right: 40px; | |
| background: var(--md-surface-2); | |
| border: 1px solid var(--md-outline); | |
| border-radius: var(--md-corner-full); | |
| color: var(--md-on-surface); | |
| font-size: var(--md-body-small); | |
| min-height: 44px; | |
| transition: all var(--md-duration-short) var(--md-easing); | |
| } | |
| .search-input:focus { | |
| outline: none; | |
| border-color: var(--md-primary); | |
| box-shadow: 0 0 0 3px var(--md-primary-container); | |
| } | |
| .search-input::placeholder { | |
| color: var(--md-on-surface-faint); | |
| } | |
| .search-submit { | |
| position: absolute; | |
| right: 8px; | |
| top: 50%; | |
| transform: translateY(-50%); | |
| width: 32px; | |
| height: 32px; | |
| background: transparent; | |
| border: none; | |
| color: var(--md-on-surface-muted); | |
| cursor: pointer; | |
| border-radius: 50%; | |
| transition: all var(--md-duration-short) var(--md-easing); | |
| } | |
| .search-submit:hover { | |
| background: var(--md-primary-container); | |
| color: var(--md-primary); | |
| } | |
| .search-results { | |
| position: absolute; | |
| top: calc(100% + 8px); | |
| left: 0; | |
| right: 0; | |
| background: var(--md-surface); | |
| border: 1px solid var(--md-outline); | |
| border-radius: var(--md-corner-md); | |
| box-shadow: var(--md-elevation-2); | |
| z-index: 200; | |
| opacity: 0; | |
| pointer-events: none; | |
| transform: translateY(-12px) scaleY(0.9); | |
| transform-origin: top center; | |
| transition: opacity var(--md-duration-short) var(--md-easing), | |
| transform var(--md-duration-short) var(--md-easing), | |
| pointer-events var(--md-duration-short) var(--md-easing); | |
| } | |
| .search-results:not([hidden]) { | |
| opacity: 1; | |
| pointer-events: auto; | |
| transform: translateY(0) scaleY(1); | |
| } | |
| /* Header Icon Buttons β Unified styling */ | |
| .header-icon-btn { | |
| display: flex; | |
| align-items: center; | |
| justify-content: center; | |
| width: 40px; | |
| height: 40px; | |
| background: transparent; | |
| border: none; | |
| border-radius: 50%; | |
| color: var(--md-on-surface); | |
| cursor: pointer; | |
| transition: all var(--md-duration-short) var(--md-easing); | |
| position: relative; | |
| } | |
| .header-icon-btn:hover { | |
| background: var(--md-primary-container); | |
| color: var(--md-primary); | |
| } | |
| .header-icon-btn:active { | |
| background: rgba(15, 118, 110, 0.2); | |
| } | |
| .header-icon-btn[aria-expanded="true"] { | |
| background: var(--md-primary-container); | |
| color: var(--md-primary); | |
| } | |
| .header-icon-btn .material-symbols-rounded { | |
| font-size: 1.5rem; | |
| } | |
| /* Notifications Container */ | |
| .notifications-container { | |
| position: relative; | |
| } | |
| .notification-badge { | |
| position: absolute; | |
| top: 8px; | |
| right: 8px; | |
| width: 20px; | |
| height: 20px; | |
| background: var(--md-error); | |
| color: var(--md-on-error); | |
| border-radius: 50%; | |
| display: flex; | |
| align-items: center; | |
| justify-content: center; | |
| font-size: var(--md-label-small); | |
| font-weight: 700; | |
| animation: pulse 2s ease-in-out infinite; | |
| } | |
| /* Notifications Panel β Smooth dropdown with no layout shift */ | |
| .notifications-panel { | |
| position: absolute; | |
| top: calc(100% + 8px); | |
| right: 0; | |
| width: 380px; | |
| max-height: 500px; | |
| background: var(--md-surface); | |
| border: 1px solid var(--md-outline); | |
| border-radius: var(--md-corner-md); | |
| box-shadow: var(--md-elevation-3); | |
| z-index: 200; | |
| display: flex ; | |
| flex-direction: column; | |
| overflow: hidden; | |
| opacity: 0; | |
| pointer-events: none; | |
| transform: translateY(-12px) scaleY(0.92); | |
| transform-origin: top right; | |
| transition: opacity var(--md-duration-short) var(--md-easing), | |
| transform var(--md-duration-short) var(--md-easing), | |
| pointer-events var(--md-duration-short) var(--md-easing); | |
| } | |
| .notifications-panel:not([hidden]) { | |
| opacity: 1; | |
| pointer-events: auto; | |
| transform: translateY(0) scaleY(1); | |
| } | |
| .panel-header { | |
| display: flex; | |
| align-items: center; | |
| justify-content: space-between; | |
| padding: var(--s4); | |
| border-bottom: 1px solid var(--md-outline); | |
| } | |
| .panel-header h3 { | |
| margin: 0; | |
| font-size: var(--md-title-medium); | |
| color: var(--md-on-surface); | |
| } | |
| .panel-close-btn { | |
| display: flex; | |
| align-items: center; | |
| justify-content: center; | |
| width: 32px; | |
| height: 32px; | |
| background: transparent; | |
| border: none; | |
| color: var(--md-on-surface); | |
| cursor: pointer; | |
| padding: 0; | |
| font-size: 20px; | |
| } | |
| .notifications-list { | |
| flex: 1; | |
| overflow-y: auto; | |
| padding: var(--s3) 0; | |
| } | |
| .notification-item { | |
| display: flex; | |
| gap: var(--s3); | |
| padding: var(--s3) var(--s4); | |
| border-bottom: 1px solid var(--md-outline); | |
| transition: background var(--md-duration-short) var(--md-easing); | |
| } | |
| .notification-item:hover { | |
| background: var(--md-surface-2); | |
| } | |
| .notification-icon { | |
| display: flex; | |
| align-items: center; | |
| justify-content: center; | |
| width: 32px; | |
| height: 32px; | |
| border-radius: 50%; | |
| flex-shrink: 1; | |
| /* Fixed overflow */ | |
| font-weight: bold; | |
| } | |
| .notification-icon.alert { | |
| background: rgba(217, 119, 6, 0.12); | |
| color: var(--md-warning); | |
| } | |
| .notification-icon.success { | |
| background: rgba(5, 150, 105, 0.12); | |
| color: var(--md-success); | |
| } | |
| .notification-icon.info { | |
| background: var(--md-primary-container); | |
| color: var(--md-primary); | |
| } | |
| .notification-content { | |
| flex: 1; | |
| min-width: 0; | |
| } | |
| .notification-title { | |
| margin: 0 0 var(--s1) 0; | |
| font-size: var(--md-body-small); | |
| color: var(--md-on-surface); | |
| font-weight: 500; | |
| } | |
| .notification-time { | |
| margin: 0; | |
| font-size: var(--md-label-small); | |
| color: var(--md-on-surface-muted); | |
| } | |
| .panel-footer { | |
| padding: var(--s4); | |
| border-top: 1px solid var(--md-outline); | |
| text-align: center; | |
| } | |
| .view-all-link { | |
| color: var(--md-primary); | |
| text-decoration: none; | |
| font-size: var(--md-label-medium); | |
| font-weight: 600; | |
| transition: color var(--md-duration-short) var(--md-easing); | |
| } | |
| .view-all-link:hover { | |
| text-decoration: underline; | |
| } | |
| /* User Menu */ | |
| .user-menu-container { | |
| position: relative; | |
| } | |
| .user-menu-btn { | |
| display: flex; | |
| align-items: center; | |
| gap: var(--s2); | |
| padding: var(--s1) var(--s3); | |
| background: var(--md-surface-2); | |
| border: 1px solid var(--md-outline); | |
| border-radius: var(--md-corner-full); | |
| color: var(--md-on-surface); | |
| cursor: pointer; | |
| transition: all var(--md-duration-short) var(--md-easing); | |
| font-size: var(--md-label-medium); | |
| font-weight: 500; | |
| } | |
| .user-menu-btn:hover { | |
| background: var(--md-primary-container); | |
| border-color: var(--md-primary); | |
| color: var(--md-primary); | |
| } | |
| .user-avatar { | |
| display: flex; | |
| align-items: center; | |
| justify-content: center; | |
| width: 32px; | |
| height: 32px; | |
| border-radius: 50%; | |
| background: var(--md-primary-container); | |
| color: var(--md-primary); | |
| } | |
| .user-display-name { | |
| max-width: 120px; | |
| overflow: hidden; | |
| text-overflow: ellipsis; | |
| white-space: nowrap; | |
| } | |
| .dropdown-chevron { | |
| font-size: 1.25rem; | |
| } | |
| /* User Menu Dropdown */ | |
| .user-menu-dropdown { | |
| position: absolute; | |
| top: calc(100% + 8px); | |
| right: 0; | |
| width: 320px; | |
| background: var(--md-surface); | |
| border: 1px solid var(--md-outline); | |
| border-radius: var(--md-corner-md); | |
| box-shadow: var(--md-elevation-3); | |
| z-index: 200; | |
| overflow: hidden; | |
| } | |
| .user-menu-header { | |
| padding: var(--s4); | |
| background: var(--md-surface-2); | |
| border-bottom: 1px solid var(--md-outline); | |
| } | |
| .user-info { | |
| display: flex; | |
| flex-direction: column; | |
| gap: var(--s1); | |
| } | |
| .user-name { | |
| margin: 0; | |
| font-size: var(--md-body-medium); | |
| font-weight: 600; | |
| color: var(--md-on-surface); | |
| } | |
| .user-email { | |
| margin: 0; | |
| font-size: var(--md-label-small); | |
| color: var(--md-on-surface-muted); | |
| } | |
| .user-status { | |
| display: flex; | |
| align-items: center; | |
| gap: var(--s2); | |
| margin-top: var(--s2); | |
| font-size: var(--md-label-small); | |
| color: var(--md-success); | |
| } | |
| .status-dot { | |
| width: 8px; | |
| height: 8px; | |
| border-radius: 50%; | |
| background: var(--md-success); | |
| } | |
| .menu-divider { | |
| height: 1px; | |
| background: var(--md-outline); | |
| margin: var(--s2) 0; | |
| /* Menu spacing: compact dropdowns */ | |
| } | |
| .user-menu-list { | |
| list-style: none; | |
| padding: var(--s2) 0; | |
| margin: 0; | |
| } | |
| .user-menu-link { | |
| display: block; | |
| width: 100%; | |
| padding: var(--s3) var(--s4); | |
| background: transparent; | |
| border: none; | |
| color: var(--md-on-surface-muted); | |
| text-decoration: none; | |
| font-size: var(--md-body-small); | |
| cursor: pointer; | |
| transition: all var(--md-duration-short) var(--md-easing); | |
| text-align: left; | |
| } | |
| .user-menu-link:hover { | |
| background: var(--md-primary-container); | |
| color: var(--md-primary); | |
| } | |
| .user-menu-link.logout-link { | |
| color: var(--md-error); | |
| } | |
| .user-menu-link.logout-link:hover { | |
| background: rgba(220, 38, 38, 0.12); | |
| } | |
| /* Header Bottom Row: Removed (consolidated into footer system status) */ | |
| /* Responsive: Tablet */ | |
| @media (max-width: 1200px) { | |
| .header-top { | |
| gap: var(--s3); | |
| } | |
| .header-center { | |
| gap: var(--s3); | |
| } | |
| .header-search { | |
| max-width: 260px; | |
| flex: 1; | |
| } | |
| .header-brand-text { | |
| display: flex; | |
| flex-direction: column; | |
| gap: 0; | |
| } | |
| .header-brand-name { | |
| font-size: var(--md-label-large); | |
| } | |
| .header-product-tag { | |
| display: none; | |
| } | |
| .header-logo { | |
| width: 32px; | |
| height: 32px; | |
| } | |
| .breadcrumb-link { | |
| font-size: var(--md-label-small); | |
| } | |
| .user-display-name { | |
| display: none; | |
| } | |
| .header-right { | |
| gap: var(--s2); | |
| } | |
| } | |
| /* Responsive: Mobile */ | |
| @media (max-width: 768px) { | |
| .header-top { | |
| flex-wrap: wrap; | |
| gap: var(--s3); | |
| align-items: center; | |
| justify-content: space-between; | |
| } | |
| .header-left { | |
| order: 1; | |
| min-width: auto; | |
| } | |
| .header-center { | |
| order: 5; | |
| width: 100%; | |
| flex-direction: row; | |
| gap: var(--s3); | |
| } | |
| .header-search { | |
| order: 3; | |
| width: auto; | |
| flex: 1; | |
| max-width: none; | |
| min-width: 0; | |
| } | |
| .search-input { | |
| font-size: var(--md-label-small); | |
| } | |
| .header-right { | |
| order: 4; | |
| width: auto; | |
| gap: var(--s2); | |
| flex-shrink: 1; | |
| /* Fixed overflow */ | |
| } | |
| .breadcrumb { | |
| width: 100%; | |
| } | |
| .nav-toggle-icon { | |
| display: flex; | |
| } | |
| .notifications-panel { | |
| width: 100vw; | |
| max-width: none; | |
| left: 0; | |
| right: auto; | |
| } | |
| .user-menu-dropdown { | |
| width: 100vw; | |
| max-width: none; | |
| left: 0; | |
| right: auto; | |
| } | |
| .header-brand-name { | |
| font-size: var(--md-title-medium); | |
| } | |
| } | |
| /* Accessibility: Focus Visible States */ | |
| .header-icon-btn:focus-visible, | |
| .nav-toggle-icon:focus-visible, | |
| .breadcrumb-link:focus-visible { | |
| outline: 2px solid var(--md-primary); | |
| outline-offset: 2px; | |
| border-radius: var(--md-corner-hairline); | |
| } | |
| /* Accessibility: Reduced Motion */ | |
| @media (prefers-reduced-motion: reduce) { | |
| .header-icon-btn, | |
| .user-menu-btn, | |
| .breadcrumb-link, | |
| .notification-badge, | |
| .status-indicator .status-dot { | |
| transition: none; | |
| animation: none; | |
| } | |
| } | |
| .app-tagline { | |
| font-size: var(--md-label-medium); | |
| color: var(--md-on-surface-muted); | |
| margin: var(--s1) 0 0 0; | |
| } | |
| /* ββ Main Content Area β Psychological Spacing βββββββββββββββββββββββ */ | |
| .app-content-wrapper { | |
| flex: 1; | |
| display: flex; | |
| flex-direction: column; | |
| max-width: 1600px; | |
| margin: 0 auto; | |
| width: 100%; | |
| padding: var(--s8) var(--s6); | |
| gap: var(--s8); | |
| } | |
| .main-content-card { | |
| background: var(--md-surface); | |
| border-radius: var(--md-corner-xl); | |
| border: 1px solid var(--md-outline); | |
| box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08); | |
| overflow: hidden; | |
| position: relative; | |
| min-height: calc(100vh - 240px); | |
| flex: 1; | |
| } | |
| /* ββ Tab Navigation β Unified KB Pill Style βββββββββββββββββββββββββββ */ | |
| .tab-navigation { | |
| display: flex; | |
| border-bottom: 1px solid var(--md-outline); | |
| background: var(--md-surface-1); | |
| padding: var(--s3) var(--s6); | |
| gap: var(--s2); | |
| overflow-x: auto; | |
| -webkit-overflow-scrolling: touch; | |
| scrollbar-width: none; | |
| } | |
| .tab-navigation::-webkit-scrollbar { | |
| display: none; | |
| } | |
| .nav-tab { | |
| display: flex; | |
| align-items: center; | |
| gap: var(--s2); | |
| padding: var(--s2) var(--s4); | |
| font-size: 0.875rem; | |
| font-weight: 600; | |
| color: var(--md-on-surface-muted); | |
| background: transparent; | |
| border: none; | |
| border-radius: var(--md-corner-md); | |
| cursor: pointer; | |
| transition: | |
| color var(--md-duration-short) var(--md-easing), | |
| background var(--md-duration-short) var(--md-easing); | |
| -webkit-tap-highlight-color: transparent; | |
| position: relative; | |
| white-space: nowrap; | |
| flex-shrink: 0; | |
| } | |
| .nav-tab:hover { | |
| background: var(--md-surface-2); | |
| color: var(--md-on-surface); | |
| } | |
| .nav-tab:focus-visible { | |
| outline: 2px solid var(--md-primary); | |
| outline-offset: 2px; | |
| } | |
| .nav-tab.active { | |
| background: var(--md-primary-container); | |
| color: var(--md-primary-light); | |
| } | |
| .nav-tab .material-symbols-rounded { | |
| font-size: 1.1rem; | |
| } | |
| /* ββ Content Panels β Smooth transitions without layout shift ββββββββββββββββββββββββββββββββ */ | |
| .content-panel { | |
| display: none; | |
| padding: var(--s6); | |
| opacity: 0; | |
| animation: fadeSlideIn var(--md-duration-medium) var(--md-easing) forwards; | |
| } | |
| .content-panel.active { | |
| display: block; | |
| opacity: 1; | |
| } | |
| @keyframes fadeSlideIn { | |
| from { | |
| opacity: 0; | |
| transform: translateY(8px); | |
| } | |
| to { | |
| opacity: 1; | |
| transform: translateY(0); | |
| } | |
| } | |
| /* ββ Input Groups ββββββββββββββββββββββββββββββββββββββββββββββββββββββ */ | |
| .input-field-group { | |
| margin-bottom: var(--s4); | |
| } | |
| .field-label { | |
| display: flex; | |
| align-items: center; | |
| gap: var(--s2); | |
| font-size: 0.78rem; | |
| font-weight: 600; | |
| color: var(--md-on-surface-muted); | |
| margin-bottom: var(--s2); | |
| letter-spacing: 0.04em; | |
| text-transform: uppercase; | |
| } | |
| .field-label .material-symbols-rounded { | |
| font-size: var(--md-body-large); | |
| } | |
| /* ββ Dropzone ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ */ | |
| .upload-dropzone { | |
| border: 1.5px dashed var(--md-outline); | |
| border-radius: var(--md-corner-lg); | |
| padding: var(--s8) var(--s6); | |
| text-align: center; | |
| cursor: pointer; | |
| transition: | |
| border-color var(--md-duration-short) var(--md-easing), | |
| background var(--md-duration-short) var(--md-easing); | |
| display: flex; | |
| flex-direction: column; | |
| align-items: center; | |
| gap: var(--s2); | |
| } | |
| .upload-dropzone:hover, | |
| .upload-dropzone:focus-visible, | |
| .upload-dropzone.drag-over { | |
| border-color: var(--md-primary); | |
| background: var(--md-primary-container); | |
| outline: none; | |
| } | |
| .dropzone-icon { | |
| font-size: 2.5rem ; | |
| color: var(--md-primary-light); | |
| opacity: 0.7; | |
| } | |
| .dropzone-text { | |
| font-size: 0.9rem; | |
| color: var(--md-on-surface-muted); | |
| } | |
| .dropzone-hint { | |
| font-size: 0.75rem; | |
| color: var(--md-on-surface-variant); | |
| margin-top: -4px; | |
| } | |
| /* ββ KB File Chips βββββββββββββββββββββββββββββββββββββββββββββββββββ */ | |
| .file-chip { | |
| padding: var(--s2) var(--s4); | |
| background: var(--md-surface-2); | |
| border: 1px solid var(--md-outline); | |
| border-radius: var(--md-corner-md); | |
| display: flex; | |
| align-items: center; | |
| gap: var(--s2); | |
| transition: all var(--md-duration-short) var(--md-easing); | |
| animation: slideInUp 0.3s var(--md-easing); | |
| } | |
| .file-chip:hover { | |
| background: var(--md-surface-3); | |
| border-color: var(--md-primary-light); | |
| } | |
| .file-chip .material-symbols-rounded { | |
| color: var(--md-primary-light); | |
| font-size: 1.25rem; | |
| } | |
| .file-chip .chip-name { | |
| font-size: 0.9rem; | |
| color: var(--md-on-surface); | |
| flex: 1; | |
| overflow: hidden; | |
| text-overflow: ellipsis; | |
| white-space: nowrap; | |
| } | |
| .chip-remove { | |
| background: none; | |
| border: none; | |
| color: var(--md-on-surface-variant); | |
| cursor: pointer; | |
| display: flex; | |
| align-items: center; | |
| justify-content: center; | |
| padding: 4px; | |
| border-radius: var(--md-corner-full); | |
| transition: all var(--md-duration-short) var(--md-easing); | |
| } | |
| .chip-remove:hover { | |
| background: var(--md-error-bg); | |
| color: var(--md-error); | |
| } | |
| .dropzone-hint { | |
| font-size: 0.72rem; | |
| color: var(--md-on-surface-faint); | |
| } | |
| .highlight { | |
| color: var(--md-primary-light); | |
| font-weight: 600; | |
| } | |
| /* ββ File Chip βββββββββββββββββββββββββββββββββββββββββββββββββββββββββ */ | |
| .file-chip { | |
| display: inline-flex; | |
| align-items: center; | |
| gap: var(--s2); | |
| background: var(--md-primary-container); | |
| border: 1px solid rgba(15, 118, 110, 0.3); | |
| border-radius: var(--md-corner-full); | |
| padding: var(--s2) var(--s3); | |
| font-size: 0.82rem; | |
| color: var(--md-primary-light); | |
| max-width: 100%; | |
| margin-bottom: var(--s3); | |
| } | |
| .file-chip .material-symbols-rounded { | |
| font-size: var(--md-body-large); | |
| } | |
| .file-name { | |
| overflow: hidden; | |
| text-overflow: ellipsis; | |
| white-space: nowrap; | |
| max-width: none ; | |
| } | |
| .chip-remove { | |
| background: none; | |
| border: none; | |
| color: var(--md-on-surface-muted); | |
| cursor: pointer; | |
| font-size: 1.2rem; | |
| line-height: 1; | |
| padding: 0 var(--s1); | |
| border-radius: var(--md-corner-full); | |
| transition: color var(--md-duration-short); | |
| } | |
| .chip-remove:hover { | |
| color: var(--md-error); | |
| } | |
| /* ββ Textarea ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ */ | |
| .modern-textarea { | |
| width: 100%; | |
| background: var(--md-surface-2); | |
| border: 1.5px solid var(--md-outline); | |
| border-radius: var(--md-corner-lg); | |
| color: var(--md-on-surface); | |
| font-family: inherit; | |
| font-size: 0.875rem; | |
| font-weight: 500; | |
| padding: var(--s3) var(--s4); | |
| resize: none; | |
| overflow: hidden; | |
| min-height: 80px; | |
| transition: border-color var(--md-duration-short) var(--md-easing), | |
| background var(--md-duration-short) var(--md-easing), | |
| color var(--md-duration-short) var(--md-easing); | |
| } | |
| .modern-textarea:hover { | |
| background: var(--md-surface); | |
| border-color: var(--md-primary); | |
| color: var(--md-on-surface); | |
| } | |
| .modern-textarea:focus { | |
| outline: none; | |
| border-color: var(--md-primary); | |
| background: var(--md-surface); | |
| color: var(--md-on-surface); | |
| box-shadow: 0 0 0 3px var(--md-primary-container); | |
| } | |
| .modern-textarea::placeholder { | |
| color: var(--md-on-surface-muted); | |
| font-weight: 400; | |
| } | |
| .modern-textarea:disabled { | |
| opacity: 0.38; | |
| cursor: not-allowed; | |
| pointer-events: none; | |
| border-color: var(--md-outline); | |
| background: var(--md-surface-2); | |
| color: var(--md-on-surface-faint); | |
| } | |
| /* ββ Buttons (MD3) βββββββββββββββββββββββββββββββββββββββββββββββββββββ */ | |
| /* | |
| * ENTERPRISE BUTTON SYSTEM (Material Design 3 Compliant) | |
| * | |
| * Base Properties (All variants): | |
| * β’ display: inline-flex (centered content) | |
| * β’ width: 100% (full container width, unless overridden) | |
| * β’ padding: var(--s3) var(--s5) (12px vertical, 20px horizontal) | |
| * β’ border-radius: var(--md-corner-full) (28px, fully rounded) | |
| * β’ font-size: var(--md-label-large) (500 weight) | |
| * β’ font-weight: 700; letter-spacing: 0.5px (prominence & readability) | |
| * β’ min-height: 44px (WCAG touch target minimum) | |
| * β’ transition: all var(--md-duration-short) (100ms smooth state changes) | |
| * β’ icon size: 24px uniform (-- consistent with MD3) | |
| * | |
| * State Handlers (All variants): | |
| * β’ :hover:not(:disabled) - Interactive feedback with color/shade change | |
| * β’ :active:not(:disabled) - Pressed state with darker shade | |
| * β’ :focus-visible - Keyboard accessibility (2px outline + 2px offset) | |
| * β’ :disabled - Reduced visibility (38% opacity, cursor: not-allowed) | |
| * | |
| * Button Variants: | |
| * 1. .btn-primary - Filled primary action (filled background, elevation-1) | |
| * 2. .btn-secondary - Filled secondary action (filled background, elevation-1) | |
| * 3. .btn-outline - Outlined action (transparent background, outline border) | |
| * 4. .btn-text - Text/ghost button (transparent background, no border) | |
| * 5. .btn-tonal - Tonal button (light background, elevation-1) | |
| * | |
| * NO !important flags used in button styling (pure CSS cascade). | |
| * All colors use MD3 token system (primary, secondary, error, success variants). | |
| */ | |
| .btn-primary { | |
| display: inline-flex; | |
| align-items: center; | |
| justify-content: center; | |
| gap: var(--s2); | |
| width: auto; | |
| padding: var(--s3) var(--s5); | |
| background: var(--md-primary); | |
| color: var(--md-on-primary); | |
| border: none; | |
| border-radius: var(--md-corner-full); | |
| font-size: var(--md-label-large); | |
| font-weight: 700; | |
| letter-spacing: 0.5px; | |
| cursor: pointer; | |
| transition: | |
| background var(--md-duration-short) var(--md-easing), | |
| transform var(--md-duration-short) var(--md-easing), | |
| box-shadow var(--md-duration-short) var(--md-easing); | |
| min-height: 44px; | |
| box-shadow: var(--md-elevation-1); | |
| } | |
| .btn-primary:hover:not(:disabled) { | |
| background: var(--md-primary-light); | |
| box-shadow: var(--md-elevation-2); | |
| transform: translateY(-1px); | |
| } | |
| .btn-primary:active:not(:disabled) { | |
| background: var(--md-primary-dark); | |
| transform: translateY(0); | |
| } | |
| .btn-primary:focus-visible { | |
| outline: 2px solid var(--md-primary-dark); | |
| outline-offset: 2px; | |
| } | |
| .btn-primary:disabled { | |
| opacity: 0.38; | |
| cursor: not-allowed; | |
| box-shadow: none; | |
| } | |
| .btn-primary .material-symbols-rounded { | |
| font-size: 1.15rem; | |
| } | |
| .btn-secondary .material-symbols-rounded { | |
| font-size: 24px; | |
| width: 24px; | |
| height: 24px; | |
| } | |
| .btn-outline .material-symbols-rounded { | |
| font-size: 24px; | |
| width: 24px; | |
| height: 24px; | |
| } | |
| .btn-secondary { | |
| display: inline-flex; | |
| align-items: center; | |
| justify-content: center; | |
| gap: var(--s2); | |
| width: auto; | |
| padding: var(--s3) var(--s5); | |
| background: var(--md-surface-2); | |
| color: var(--md-on-surface); | |
| border: 1.5px solid var(--md-outline); | |
| border-radius: var(--md-corner-full); | |
| font-size: var(--md-label-large); | |
| font-weight: 600; | |
| cursor: pointer; | |
| transition: all var(--md-duration-short) var(--md-easing); | |
| min-height: 44px; | |
| } | |
| .btn-secondary:hover:not(:disabled) { | |
| background: var(--md-surface-3); | |
| border-color: var(--md-primary); | |
| color: var(--md-primary-light); | |
| } | |
| .btn-secondary:active:not(:disabled) { | |
| background: var(--md-surface-2); | |
| transform: translateY(0); | |
| } | |
| .btn-secondary:focus-visible { | |
| outline: 2px solid var(--md-primary); | |
| outline-offset: 2px; | |
| } | |
| .btn-secondary:disabled { | |
| opacity: 0.38; | |
| cursor: not-allowed; | |
| } | |
| /* Button Loading State (Shneiderman Principle 3: Informative Feedback) */ | |
| .btn-loading { | |
| opacity: 0.8; | |
| cursor: progress; | |
| } | |
| .btn-spinner { | |
| display: inline-block; | |
| width: 1em; | |
| height: 1em; | |
| border: 2px solid rgba(255, 255, 255, 0.3); | |
| border-top-color: currentColor; | |
| border-radius: 50%; | |
| animation: spin 0.8s linear infinite; | |
| margin-right: var(--s2); | |
| } | |
| .btn-outline { | |
| display: inline-flex; | |
| align-items: center; | |
| justify-content: center; | |
| gap: var(--s2); | |
| width: 100%; | |
| padding: var(--s3) var(--s5); | |
| background: transparent; | |
| color: var(--md-primary-light); | |
| border: 1.5px solid rgba(15, 118, 110, 0.4); | |
| border-radius: var(--md-corner-full); | |
| font-size: var(--md-label-large); | |
| font-weight: 600; | |
| cursor: pointer; | |
| transition: all var(--md-duration-short) var(--md-easing); | |
| min-height: 44px; | |
| } | |
| .btn-outline:hover:not(:disabled) { | |
| background: var(--md-primary-container); | |
| border-color: var(--md-primary); | |
| } | |
| .btn-outline:active:not(:disabled) { | |
| background: var(--md-primary-container); | |
| transform: translateY(0); | |
| } | |
| .btn-outline:focus-visible { | |
| outline: 2px solid var(--md-primary); | |
| outline-offset: 2px; | |
| } | |
| .btn-outline:disabled { | |
| opacity: 0.38; | |
| cursor: not-allowed; | |
| } | |
| .btn-outline.recording { | |
| color: var(--md-error); | |
| border-color: var(--md-error); | |
| background: var(--md-error-container); | |
| animation: recordPulse 1.2s ease-in-out infinite; | |
| } | |
| @keyframes recordPulse { | |
| 0%, | |
| 100% { | |
| box-shadow: 0 0 0 0 rgba(239, 68, 68, 0); | |
| } | |
| 50% { | |
| box-shadow: 0 0 0 6px rgba(239, 68, 68, 0.2); | |
| } | |
| } | |
| /* Confirm & Error Dialogs β Unified modal styling */ | |
| /* Confirm Dialog */ | |
| .confirm-dialog-backdrop { | |
| position: fixed; | |
| inset: 0; | |
| background: rgba(0, 0, 0, 0.6); | |
| display: flex; | |
| align-items: center; | |
| justify-content: center; | |
| z-index: var(--z-modal-backdrop); | |
| animation: fadeIn 300ms ease-out; | |
| backdrop-filter: blur(var(--blur-subtle)); | |
| -webkit-backdrop-filter: blur(var(--blur-subtle)); | |
| } | |
| .confirm-dialog { | |
| background: var(--md-surface); | |
| padding: var(--s6); | |
| border-radius: var(--md-corner-lg); | |
| box-shadow: var(--md-elevation-3); | |
| max-width: 500px; | |
| z-index: var(--z-modal); | |
| animation: modalSlideIn 250ms cubic-bezier(0.2, 0, 0, 1); | |
| border: 1px solid var(--md-outline); | |
| } | |
| .confirm-dialog h2 { | |
| margin: 0 0 var(--s4) 0; | |
| color: var(--md-on-surface); | |
| font-size: var(--md-title-large); | |
| font-weight: 700; | |
| } | |
| .confirm-dialog p { | |
| margin: 0 0 var(--s6) 0; | |
| color: var(--md-on-surface-muted); | |
| line-height: 1.6; | |
| font-size: var(--md-body-medium); | |
| } | |
| .confirm-dialog-actions { | |
| display: flex; | |
| gap: var(--s4); | |
| justify-content: flex-end; | |
| } | |
| /* ββ Error Dialog βββββββββββββββββββββββββββββββββββββββββββββββββββββββββ */ | |
| .error-dialog-backdrop { | |
| position: fixed; | |
| inset: 0; | |
| background: rgba(0, 0, 0, 0.6); | |
| display: flex; | |
| align-items: center; | |
| justify-content: center; | |
| z-index: var(--z-modal-backdrop); | |
| animation: fadeIn 300ms ease-out; | |
| backdrop-filter: blur(var(--blur-subtle)); | |
| -webkit-backdrop-filter: blur(var(--blur-subtle)); | |
| } | |
| .error-dialog { | |
| background: var(--md-surface); | |
| padding: var(--s6); | |
| border-radius: var(--md-corner-lg); | |
| box-shadow: var(--md-elevation-3); | |
| max-width: 500px; | |
| border-left: 4px solid var(--md-error); | |
| z-index: var(--z-modal); | |
| animation: modalSlideIn 250ms cubic-bezier(0.2, 0, 0, 1); | |
| border: 1px solid var(--md-outline); | |
| } | |
| .error-dialog h2 { | |
| margin: 0 0 var(--s3) 0; | |
| color: var(--md-on-surface); | |
| font-size: var(--md-title-large); | |
| font-weight: 700; | |
| } | |
| .error-dialog-content { | |
| display: flex; | |
| align-items: flex-start; | |
| gap: var(--s4); | |
| margin-bottom: var(--s4); | |
| } | |
| .error-dialog-icon { | |
| font-size: 24px; | |
| flex-shrink: 1; | |
| /* Fixed overflow */ | |
| line-height: 1; | |
| } | |
| .error-dialog-body { | |
| flex: 1; | |
| } | |
| .error-dialog-body p { | |
| margin: 0 0 var(--s4) 0; | |
| color: var(--md-on-surface-muted); | |
| line-height: 1.6; | |
| font-size: var(--md-body-medium); | |
| } | |
| .error-dialog-body p:last-child { | |
| margin-bottom: 0; | |
| } | |
| .error-dialog-recovery { | |
| background: var(--md-surface-dim); | |
| padding: var(--s4); | |
| border-radius: var(--md-corner-md); | |
| border-left: 3px solid var(--md-warning); | |
| } | |
| .error-dialog-recovery p { | |
| margin: 0; | |
| color: var(--md-on-surface); | |
| font-size: var(--md-body-small); | |
| line-height: 1.5; | |
| } | |
| .error-dialog-actions { | |
| display: flex; | |
| justify-content: flex-end; | |
| } | |
| /* Responsive: Mobile */ | |
| @media (max-width: 640px) { | |
| .confirm-dialog, | |
| .error-dialog { | |
| max-width: 90vw; | |
| padding: var(--s5); | |
| margin: var(--s4); | |
| } | |
| .confirm-dialog-actions, | |
| .error-dialog-actions { | |
| flex-direction: column-reverse; | |
| gap: var(--s3); | |
| } | |
| .confirm-dialog-actions button, | |
| .error-dialog-actions button { | |
| width: 100%; | |
| } | |
| } | |
| /* Audit Dashboard Components */ | |
| /* Result Container */ | |
| .result-container { | |
| display: flex; | |
| flex-direction: column; | |
| gap: var(--s4); | |
| } | |
| /* ββ KPI Row: At-a-Glance Scores βββββββββββββββββββββββββββββββββββββββ */ | |
| .kpi-row { | |
| display: grid; | |
| grid-template-columns: repeat(3, 1fr); | |
| gap: var(--s3); | |
| } | |
| .kpi-card { | |
| background: var(--md-surface-2); | |
| border: 1px solid var(--md-outline); | |
| border-radius: var(--md-corner-lg); | |
| padding: var(--s4) var(--s3); | |
| display: flex; | |
| flex-direction: column; | |
| align-items: center; | |
| text-align: center; | |
| gap: var(--s2); | |
| transition: border-color var(--md-duration-short) var(--md-easing), | |
| box-shadow var(--md-duration-short) var(--md-easing); | |
| position: relative; | |
| overflow: hidden; | |
| box-shadow: var(--md-elevation-1); | |
| } | |
| .kpi-card::before { | |
| /* Colored tonal top-bar β encodes meaning spatially before reading */ | |
| content: ''; | |
| position: absolute; | |
| inset: 0 0 auto 0; | |
| height: 3px; | |
| background: var(--md-outline); | |
| transition: background var(--md-duration-medium) var(--md-easing); | |
| } | |
| .kpi-card.kpi-green::before { | |
| background: var(--md-success); | |
| } | |
| .kpi-card.kpi-amber::before { | |
| background: var(--md-warning); | |
| } | |
| .kpi-card.kpi-red::before { | |
| background: var(--md-error); | |
| } | |
| .kpi-card.kpi-green { | |
| border-color: rgba(16, 185, 129, 0.25); | |
| box-shadow: 0 0 20px rgba(16, 185, 129, 0.06); | |
| } | |
| .kpi-card.kpi-amber { | |
| border-color: rgba(245, 158, 11, 0.25); | |
| box-shadow: 0 0 20px rgba(245, 158, 11, 0.06); | |
| } | |
| .kpi-card.kpi-red { | |
| border-color: rgba(239, 68, 68, 0.3); | |
| box-shadow: 0 0 20px rgba(239, 68, 68, 0.08); | |
| } | |
| .kpi-icon .material-symbols-rounded { | |
| font-size: 1.5rem; | |
| color: var(--md-primary-light); | |
| } | |
| .kpi-label { | |
| font-size: var(--md-label-small); | |
| font-weight: 600; | |
| color: var(--md-on-surface-muted); | |
| text-transform: uppercase; | |
| letter-spacing: 0.06em; | |
| } | |
| .kpi-value { | |
| font-size: var(--md-headline-medium); | |
| font-weight: 700; | |
| color: var(--md-on-bg); | |
| line-height: 1.1; | |
| } | |
| .kpi-green .kpi-value { | |
| color: var(--md-success); | |
| } | |
| .kpi-amber .kpi-value { | |
| color: var(--md-warning); | |
| } | |
| .kpi-red .kpi-value { | |
| color: var(--md-error); | |
| } | |
| /* KPI card icon tints to match semantic state β icon + value + top-bar all consistent */ | |
| .kpi-card.kpi-green .kpi-icon .material-symbols-rounded { | |
| color: var(--md-success); | |
| } | |
| .kpi-card.kpi-amber .kpi-icon .material-symbols-rounded { | |
| color: var(--md-warning); | |
| } | |
| .kpi-card.kpi-red .kpi-icon .material-symbols-rounded { | |
| color: var(--md-error); | |
| } | |
| /* ββ Summary Card βββββββββββββββββββββββββββββββββββββββββββββββββββββββ */ | |
| .summary-card { | |
| background: var(--md-surface-2); | |
| border: 1px solid var(--md-outline); | |
| border-radius: var(--md-corner-lg); | |
| padding: var(--s4) var(--s5); | |
| } | |
| .summary-text { | |
| font-size: 0.9rem; | |
| color: var(--md-on-surface); | |
| line-height: 1.7; | |
| margin-top: var(--s2); | |
| } | |
| /* ββ Detail Label (reused) ββββββββββββββββββββββββββββββββββββββββββββββ */ | |
| .detail-label { | |
| display: flex; | |
| align-items: center; | |
| gap: var(--s2); | |
| font-size: 0.72rem; | |
| font-weight: 700; | |
| text-transform: uppercase; | |
| letter-spacing: 0.08em; | |
| color: var(--md-on-surface-muted); | |
| margin-bottom: var(--s2); | |
| } | |
| .detail-label .material-symbols-rounded { | |
| font-size: var(--md-body-large); | |
| color: var(--md-primary-light); | |
| } | |
| /* ββ Visualization Grid ββββββββββββββββββββββββββββββββββββββββββββββββββ */ | |
| .viz-grid { | |
| display: grid; | |
| grid-template-columns: 1fr 1fr; | |
| gap: var(--s4); | |
| } | |
| .viz-card { | |
| background: var(--md-surface-2); | |
| border: 1px solid var(--md-outline); | |
| border-radius: var(--md-corner-lg); | |
| padding: var(--s4); | |
| display: flex; | |
| flex-direction: column; | |
| min-height: 280px; | |
| } | |
| .viz-card-header { | |
| display: flex; | |
| align-items: center; | |
| gap: var(--s2); | |
| font-size: 0.75rem; | |
| font-weight: 700; | |
| text-transform: uppercase; | |
| letter-spacing: 0.07em; | |
| color: var(--md-on-surface-muted); | |
| margin-bottom: var(--s3); | |
| padding-bottom: var(--s3); | |
| border-bottom: 1px solid var(--md-outline-variant); | |
| } | |
| .viz-card-header .material-symbols-rounded { | |
| font-size: var(--md-body-large); | |
| color: var(--md-primary-light); | |
| } | |
| .chart-wrapper { | |
| flex: 1; | |
| position: relative; | |
| min-height: 220px; | |
| } | |
| .echarts-container { | |
| flex: 1; | |
| width: 100%; | |
| min-height: 220px; | |
| } | |
| .chart-empty { | |
| display: flex; | |
| align-items: center; | |
| justify-content: center; | |
| height: 100%; | |
| color: var(--md-on-surface-faint); | |
| font-size: 0.8rem; | |
| font-style: italic; | |
| } | |
| /* ββ Audit Detail Cards: Flags & Nudges ββββββββββββββββββββββββββββββββ */ | |
| .audit-details-grid { | |
| display: grid; | |
| grid-template-columns: 1fr 1fr; | |
| gap: var(--s4); | |
| } | |
| .audit-detail-card { | |
| background: var(--md-surface-2); | |
| border: 1px solid var(--md-outline); | |
| border-radius: var(--md-corner-lg); | |
| padding: var(--s4); | |
| transition: | |
| border-color var(--md-duration-medium) var(--md-easing), | |
| box-shadow var(--md-duration-medium) var(--md-easing); | |
| } | |
| .flags-card.kpi-green { | |
| border-color: rgba(16, 185, 129, 0.22); | |
| } | |
| .flags-card.kpi-amber { | |
| border-color: rgba(245, 158, 11, 0.22); | |
| } | |
| .flags-card.kpi-red { | |
| border-color: rgba(239, 68, 68, 0.28); | |
| box-shadow: 0 0 14px rgba(239, 68, 68, 0.06); | |
| } | |
| /* Flags card header icon tints with live compliance_risk β MD3 adaptive */ | |
| .flags-card.kpi-green .detail-label .material-symbols-rounded { | |
| color: var(--md-success); | |
| } | |
| .flags-card.kpi-amber .detail-label .material-symbols-rounded { | |
| color: var(--md-warning); | |
| } | |
| .flags-card.kpi-red .detail-label .material-symbols-rounded { | |
| color: var(--md-error); | |
| } | |
| /* Nudges card header icon β constructive amber (coaching, not threat) */ | |
| .nudges-card .detail-label .material-symbols-rounded { | |
| color: var(--md-warning); | |
| } | |
| /* ββ Section Heading (transcript + audio block headers) βββββββββββββββββ */ | |
| .section-heading { | |
| display: flex; | |
| align-items: center; | |
| gap: var(--s2); | |
| font-size: 0.9rem; | |
| font-weight: 600; | |
| color: var(--md-on-bg); | |
| letter-spacing: 0; | |
| text-transform: none; | |
| } | |
| .section-heading .material-symbols-rounded { | |
| font-size: 1.15rem; | |
| color: var(--md-primary-light); | |
| flex-shrink: 1; | |
| /* Fixed overflow */ | |
| } | |
| /* ββ Transcript container + Audio playback block ββββββββββββββββββββββββ */ | |
| .transcription-container, | |
| .audio-playback-block { | |
| padding: var(--s4); | |
| background: rgba(30, 41, 59, 0.4); | |
| border-radius: var(--md-corner-lg); | |
| border: 1px solid var(--md-outline); | |
| } | |
| .detail-list { | |
| list-style: none; | |
| display: flex; | |
| flex-direction: column; | |
| gap: var(--s2); | |
| margin-top: var(--s2); | |
| } | |
| .detail-item { | |
| display: flex; | |
| align-items: flex-start; | |
| gap: var(--s2); | |
| font-size: 0.82rem; | |
| color: var(--md-on-surface); | |
| line-height: 1.5; | |
| } | |
| .detail-item .material-symbols-rounded { | |
| font-size: var(--md-body-large); | |
| flex-shrink: 0; | |
| /* ensure icon isn't shrunk/cut off */ | |
| margin-top: 1px; | |
| } | |
| /* Ensure audit detail cards don't clip children */ | |
| .audit-detail-card { | |
| overflow: visible; | |
| } | |
| /* ββ Save button + dropdown (Transcript / Summary) βββββββββββββββββββββ */ | |
| .save-group { | |
| display: inline-block; | |
| } | |
| .save-btn { | |
| display: inline-flex; | |
| align-items: center; | |
| gap: 0.5rem; | |
| padding: 8px 12px; | |
| border-radius: 10px; | |
| border: 1px solid transparent; | |
| background: var(--md-secondary); | |
| color: var(--md-on-secondary); | |
| cursor: pointer; | |
| font-weight: 600; | |
| } | |
| .save-btn .material-symbols-rounded { | |
| font-size: 1rem; | |
| color: currentColor; | |
| display: inline-flex; | |
| align-items: center; | |
| justify-content: center; | |
| width: 1.2em; | |
| height: 1.2em; | |
| } | |
| .save-btn .save-chevron { | |
| font-size: 1rem; | |
| color: currentColor; | |
| opacity: 0.9; | |
| display: inline-flex; | |
| align-items: center; | |
| justify-content: center; | |
| transition: transform 180ms ease; | |
| } | |
| .save-btn[aria-expanded="true"] .save-chevron { | |
| transform: rotate(180deg); | |
| } | |
| .save-btn:hover { | |
| background: var(--md-secondary-light); | |
| transform: translateY(-1px); | |
| } | |
| .save-btn:active { | |
| transform: translateY(0); | |
| } | |
| .save-menu { | |
| position: absolute; | |
| right: 0; | |
| top: calc(100% + 8px); | |
| min-width: 160px; | |
| background: var(--md-surface-2); | |
| border: 1px solid var(--md-outline); | |
| border-radius: 8px; | |
| box-shadow: 0 12px 30px rgba(2, 6, 23, 0.6); | |
| padding: 6px; | |
| z-index: 1300; | |
| } | |
| .save-menu .save-menu-item { | |
| width: 100%; | |
| display: flex; | |
| align-items: center; | |
| gap: 0.6rem; | |
| padding: 8px 10px; | |
| background: transparent; | |
| border: none; | |
| text-align: left; | |
| color: var(--md-on-surface); | |
| cursor: pointer; | |
| border-radius: 6px; | |
| } | |
| .save-menu .save-menu-item:hover { | |
| background: rgba(255, 255, 255, 0.02); | |
| } | |
| .save-menu .save-menu-item .material-symbols-rounded { | |
| color: var(--md-primary-light); | |
| } | |
| /* Keep summary menu above the trigger so footer never overlaps it */ | |
| #save-summary-menu { | |
| top: auto; | |
| bottom: calc(100% + 8px); | |
| } | |
| .flag-item { | |
| color: #FCA5A5; | |
| } | |
| .flag-item .material-symbols-rounded { | |
| color: var(--md-error); | |
| } | |
| .no-issue { | |
| color: var(--md-success); | |
| } | |
| .no-issue .material-symbols-rounded { | |
| color: var(--md-success); | |
| } | |
| .nudge-item .material-symbols-rounded { | |
| color: var(--md-warning); | |
| } | |
| /* All-clear state when no nudges returned β mirrors .no-issue */ | |
| .no-nudges { | |
| color: var(--md-success); | |
| font-style: italic; | |
| opacity: 0.85; | |
| } | |
| .no-nudges .material-symbols-rounded { | |
| color: var(--md-success); | |
| } | |
| /* Context Details: Flag/Nudge Explanations (Shneiderman Principle 8) */ | |
| .flag-details, | |
| .nudge-details { | |
| margin-top: var(--s2); | |
| margin-left: var(--s4); | |
| padding: 0; | |
| } | |
| .flag-details summary, | |
| .nudge-details summary { | |
| display: inline-flex; | |
| align-items: center; | |
| gap: var(--s1); | |
| padding: var(--s2) 0; | |
| font-size: 0.75rem; | |
| font-weight: 600; | |
| color: var(--md-on-surface-muted); | |
| cursor: pointer; | |
| user-select: none; | |
| transition: color var(--md-duration-short) ease; | |
| } | |
| .flag-details summary::marker { | |
| color: var(--md-on-surface-muted); | |
| } | |
| .flag-details summary:hover, | |
| .nudge-details summary:hover { | |
| color: var(--md-primary-light); | |
| } | |
| .flag-details[open] summary, | |
| .nudge-details[open] summary { | |
| color: var(--md-primary-light); | |
| } | |
| .flag-details p, | |
| .nudge-details p { | |
| margin: var(--s2) 0 0 0; | |
| padding: var(--s3); | |
| background: rgba(15, 118, 110, 0.08); | |
| border-left: 2px solid var(--md-primary); | |
| border-radius: 0 var(--md-corner-md) var(--md-corner-md) 0; | |
| font-size: 0.78rem; | |
| color: var(--md-on-surface); | |
| line-height: 1.6; | |
| } | |
| /* ββ Transcript Accordion βββββββββββββββββββββββββββββββββββββββββββββββ */ | |
| .detail-accordion { | |
| background: var(--md-surface-2); | |
| border: 1px solid var(--md-outline); | |
| border-radius: var(--md-corner-lg); | |
| overflow: hidden; | |
| } | |
| .accordion-summary { | |
| display: flex; | |
| align-items: center; | |
| gap: var(--s2); | |
| padding: var(--s3) var(--s4); | |
| font-size: 0.78rem; | |
| font-weight: 700; | |
| text-transform: uppercase; | |
| letter-spacing: 0.08em; | |
| color: var(--md-on-surface-muted); | |
| cursor: pointer; | |
| user-select: none; | |
| border-radius: var(--md-corner-lg); | |
| transition: background var(--md-duration-short); | |
| list-style: none; | |
| } | |
| .accordion-summary::-webkit-details-marker { | |
| display: none; | |
| } | |
| .accordion-summary::before { | |
| content: 'expand_more'; | |
| font-family: 'Material Symbols Rounded'; | |
| font-size: 1.2rem; | |
| color: var(--md-primary-light); | |
| transition: transform var(--md-duration-medium) var(--md-easing); | |
| font-variation-settings: 'FILL' 1, 'wght' 400, 'GRAD' 0, 'opsz' 24; | |
| } | |
| details[open] .accordion-summary::before { | |
| transform: rotate(180deg); | |
| } | |
| .accordion-summary:hover { | |
| background: var(--md-primary-container); | |
| } | |
| .detail-accordion .detail-content { | |
| padding: var(--s1) var(--s5) var(--s4); | |
| font-size: 0.85rem; | |
| color: var(--md-on-surface); | |
| line-height: 1.75; | |
| white-space: pre-wrap; | |
| word-break: break-word; | |
| max-height: 360px; | |
| overflow-y: auto; | |
| } | |
| .detail-content p { | |
| margin-bottom: var(--s2); | |
| } | |
| /* ββ HITL Panel (Human-in-the-Loop) βββββββββββββββββββββββββββββββββββ */ | |
| .hitl-panel { | |
| background: var(--md-surface-2); | |
| border: 1px solid var(--md-primary-container); | |
| border-radius: var(--md-corner-lg); | |
| padding: var(--s4) var(--s5); | |
| /* Glass accent on top β original audit design signature */ | |
| border-top: 2px solid var(--md-primary); | |
| } | |
| .hitl-header { | |
| display: flex; | |
| align-items: center; | |
| gap: var(--s2); | |
| margin-bottom: var(--s1); | |
| } | |
| .hitl-header .material-symbols-rounded { | |
| color: var(--md-primary-light); | |
| } | |
| .hitl-header strong { | |
| font-size: 0.9rem; | |
| color: var(--md-on-bg); | |
| } | |
| .hitl-badge { | |
| margin-left: auto; | |
| font-size: 0.68rem; | |
| font-weight: 700; | |
| letter-spacing: 0.08em; | |
| text-transform: uppercase; | |
| padding: 3px 10px; | |
| border-radius: var(--md-corner-full); | |
| background: var(--md-surface-3); | |
| color: var(--md-on-surface-muted); | |
| border: 1px solid var(--md-outline); | |
| } | |
| .hitl-badge.badge-green { | |
| background: var(--md-success-bg); | |
| color: var(--md-success); | |
| border-color: rgba(16, 185, 129, 0.3); | |
| } | |
| .hitl-badge.badge-warn { | |
| background: var(--md-warning-bg); | |
| color: var(--md-warning); | |
| border-color: rgba(245, 158, 11, 0.3); | |
| } | |
| .hitl-badge.badge-red { | |
| background: var(--md-error-bg); | |
| color: var(--md-error); | |
| border-color: rgba(239, 68, 68, 0.3); | |
| } | |
| .hitl-badge.badge-gray { | |
| background: rgba(100, 116, 139, 0.12); | |
| color: var(--md-on-surface-muted); | |
| border-color: rgba(148, 163, 184, 0.3); | |
| } | |
| .hitl-subtitle { | |
| font-size: 0.78rem; | |
| color: var(--md-on-surface-muted); | |
| margin-bottom: var(--s3); | |
| } | |
| .hitl-actions { | |
| display: flex; | |
| gap: var(--s2); | |
| flex-wrap: wrap; | |
| } | |
| .hitl-btn { | |
| display: inline-flex; | |
| align-items: center; | |
| gap: var(--s1); | |
| padding: var(--s2) var(--s4); | |
| border-radius: var(--md-corner-full); | |
| font-family: inherit; | |
| font-size: 0.8rem; | |
| font-weight: 600; | |
| cursor: pointer; | |
| border: 1.5px solid; | |
| transition: all var(--md-duration-short) var(--md-easing); | |
| } | |
| .hitl-approve { | |
| color: var(--md-success); | |
| border-color: rgba(16, 185, 129, 0.4); | |
| background: var(--md-success-bg); | |
| } | |
| .hitl-approve:hover:not(:disabled) { | |
| background: rgba(16, 185, 129, 0.2); | |
| } | |
| .hitl-flag { | |
| color: var(--md-warning); | |
| border-color: rgba(245, 158, 11, 0.4); | |
| background: var(--md-warning-bg); | |
| } | |
| .hitl-flag:hover:not(:disabled) { | |
| background: rgba(245, 158, 11, 0.2); | |
| } | |
| .hitl-reject { | |
| color: var(--md-error); | |
| border-color: rgba(239, 68, 68, 0.4); | |
| background: var(--md-error-bg); | |
| } | |
| .hitl-reject:hover:not(:disabled) { | |
| background: rgba(239, 68, 68, 0.2); | |
| } | |
| .hitl-btn:disabled { | |
| opacity: 0.38; | |
| cursor: not-allowed; | |
| } | |
| .hitl-btn .material-symbols-rounded { | |
| font-size: var(--md-body-large); | |
| } | |
| .hitl-status { | |
| margin-top: var(--s3); | |
| font-size: 0.8rem; | |
| padding: var(--s2) var(--s3); | |
| border-radius: var(--md-corner-md); | |
| font-weight: 500; | |
| } | |
| .hitl-status.success { | |
| background: var(--md-success-bg); | |
| color: var(--md-success); | |
| } | |
| .hitl-status.warning { | |
| background: var(--md-warning-bg); | |
| color: var(--md-warning); | |
| } | |
| .hitl-status.error { | |
| background: var(--md-error-bg); | |
| color: var(--md-error); | |
| } | |
| /* ββ Action Grid ββββββββββββββββββββββββββββββββββββββββββββββββββββββββ */ | |
| .action-grid { | |
| display: grid; | |
| grid-template-columns: auto 1fr; | |
| gap: var(--s3); | |
| align-items: center; | |
| } | |
| /* ββ History Archive ββββββββββββββββββββββββββββββββββββββββββββββββββββ */ | |
| .history-controls { | |
| display: flex; | |
| justify-content: space-between; | |
| align-items: center; | |
| margin-bottom: var(--s3); | |
| padding: var(--s2) var(--s3); | |
| background: var(--md-surface-2); | |
| border-radius: var(--md-corner-md); | |
| border: 1px solid var(--md-outline); | |
| } | |
| .history-filters { | |
| display: flex; | |
| gap: var(--s3); | |
| flex: 1; | |
| } | |
| .history-filter-select { | |
| background: var(--md-surface-1); | |
| color: var(--md-on-surface); | |
| border: 1px solid var(--md-outline); | |
| padding: var(--s2) var(--s4) var(--s2) var(--s3); | |
| border-radius: var(--md-corner-full); | |
| font-size: 0.85rem; | |
| font-weight: 500; | |
| cursor: pointer; | |
| outline: none; | |
| transition: all 0.2s ease; | |
| appearance: none; | |
| background-image: url("data:image/svg+xml;charset=US-ASCII,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%20viewBox%3D%220%200%2024%2024%22%3E%3Cpath%20d%3D%22M7%2010l5%205%205-5z%22%20fill%3D%22%237a8c99%22%2F%3E%3C%2Fsvg%3E"); | |
| background-repeat: no-repeat; | |
| background-position: right 8px center; | |
| } | |
| .history-filter-select:hover, | |
| .history-filter-select:focus { | |
| border-color: var(--md-primary); | |
| background-color: var(--md-surface-3); | |
| } | |
| .history-pagination { | |
| display: flex; | |
| align-items: center; | |
| gap: var(--s3); | |
| font-size: 0.85rem; | |
| font-weight: 500; | |
| color: var(--md-on-surface-muted); | |
| } | |
| .pagination-btn { | |
| display: inline-flex; | |
| align-items: center; | |
| justify-content: center; | |
| background: none; | |
| border: none; | |
| color: var(--md-on-surface); | |
| cursor: pointer; | |
| padding: 4px; | |
| border-radius: 50%; | |
| transition: background 0.2s ease, transform 0.2s ease; | |
| } | |
| .pagination-btn:hover:not(:disabled) { | |
| background: var(--md-surface-3); | |
| color: var(--md-primary); | |
| transform: scale(1.1); | |
| } | |
| .pagination-btn:disabled { | |
| opacity: 0.3; | |
| cursor: not-allowed; | |
| } | |
| .history-scroll { | |
| display: flex; | |
| flex-direction: column; | |
| gap: var(--s3); | |
| max-height: 500px; | |
| overflow-y: auto; | |
| padding-right: var(--s1); | |
| } | |
| .history-card { | |
| background: var(--md-surface-2); | |
| border: 1px solid var(--md-outline); | |
| border-radius: var(--md-corner-lg); | |
| padding: var(--s3) var(--s4); | |
| cursor: pointer; | |
| transition: | |
| border-color var(--md-duration-short) var(--md-easing), | |
| background var(--md-duration-short) var(--md-easing), | |
| transform var(--md-duration-short) var(--md-easing); | |
| } | |
| .history-card:hover { | |
| border-color: var(--md-primary); | |
| background: var(--md-primary-container); | |
| transform: translateX(3px); | |
| } | |
| .history-card-header { | |
| display: flex; | |
| justify-content: space-between; | |
| align-items: center; | |
| margin-bottom: var(--s2); | |
| } | |
| /* Backwards-compatible aliases for history card markup (JS -> CSS mismatch fixes) */ | |
| .history-header { | |
| display: flex; | |
| align-items: center; | |
| gap: var(--s3); | |
| flex-wrap: wrap; | |
| margin-bottom: var(--s2); | |
| } | |
| /* Date/time alias used by JS-rendered cards */ | |
| .item-time { | |
| font-size: var(--md-label-small); | |
| color: var(--md-on-surface-muted); | |
| font-weight: 500; | |
| } | |
| /* Compact type badge (voice/text) used by JS markup */ | |
| .item-type { | |
| display: inline-flex; | |
| align-items: center; | |
| gap: var(--s1); | |
| padding: 2px 8px; | |
| border-radius: var(--md-corner-full); | |
| font-weight: 700; | |
| text-transform: uppercase; | |
| font-size: 0.75rem; | |
| color: var(--md-on-surface-muted); | |
| background: transparent; | |
| } | |
| .item-type { margin-right: auto; } | |
| .item-f1 { | |
| font-weight: 700; | |
| color: var(--md-primary); | |
| font-size: var(--md-label-medium); | |
| } | |
| .type-voice { /* subtle visual cue for voice audits */ | |
| background: var(--md-surface-3); | |
| color: var(--md-on-surface); | |
| } | |
| .type-text { /* subtle visual cue for text audits */ | |
| background: var(--md-surface-3); | |
| color: var(--md-on-surface); | |
| } | |
| .history-date { | |
| font-size: var(--md-label-small); | |
| color: var(--md-on-surface-muted); | |
| font-weight: 500; | |
| } | |
| .hitl-badge { | |
| padding: 2px 8px; | |
| border-radius: var(--md-corner-full); | |
| font-size: 10px; | |
| font-weight: 700; | |
| text-transform: uppercase; | |
| letter-spacing: 0.05em; | |
| } | |
| .hitl-badge.hitl-approved { | |
| background: var(--md-success-bg); | |
| color: var(--md-success); | |
| } | |
| .hitl-badge.hitl-rejected { | |
| background: var(--md-error-bg); | |
| color: var(--md-error); | |
| } | |
| /* Missing flagged state for HITL badges (JS may render 'Flagged') */ | |
| .hitl-badge.hitl-flagged { | |
| background: var(--md-warning-bg); | |
| color: var(--md-warning); | |
| } | |
| .history-transcript { | |
| font-size: var(--md-body-small); | |
| color: var(--md-on-surface); | |
| margin-bottom: var(--s3); | |
| line-height: 1.5; | |
| display: -webkit-box; | |
| -webkit-line-clamp: 3; | |
| line-clamp: 3; | |
| -webkit-box-orient: vertical; | |
| overflow: hidden; | |
| } | |
| .history-card-footer { | |
| display: flex; | |
| align-items: center; | |
| gap: var(--s3); | |
| padding-top: var(--s3); | |
| border-top: 1px solid var(--md-outline-variant); | |
| } | |
| .f1-score { | |
| font-weight: 700; | |
| color: var(--md-primary); | |
| font-size: var(--md-label-medium); | |
| } | |
| .risk-badge { | |
| padding: 2px 8px; | |
| border-radius: var(--md-corner-full); | |
| font-size: 11px; | |
| font-weight: 700; | |
| } | |
| .risk-badge.risk-green { | |
| background: var(--md-success-bg); | |
| color: var(--md-success); | |
| } | |
| .risk-badge.risk-red { | |
| background: var(--md-error-bg); | |
| color: var(--md-error); | |
| } | |
| .risk-badge.risk-amber { | |
| background: var(--md-warning-bg); | |
| color: var(--md-warning); | |
| } | |
| .llm-tier { | |
| margin-left: auto; | |
| font-size: var(--md-label-small); | |
| color: var(--md-on-surface-faint); | |
| } | |
| .item-f1 { | |
| color: var(--md-on-surface-muted); | |
| font-weight: 600; | |
| } | |
| .item-risk { | |
| display: inline-flex; | |
| align-items: center; | |
| gap: var(--s1); | |
| font-weight: 700; | |
| letter-spacing: 0.04em; | |
| padding: 1px 8px; | |
| border-radius: var(--md-corner-full); | |
| } | |
| .item-risk .material-symbols-rounded { | |
| font-size: 0.85rem; | |
| } | |
| .item-risk.risk-green { | |
| background: var(--md-success-bg); | |
| color: var(--md-success); | |
| } | |
| .item-risk.risk-amber { | |
| background: var(--md-warning-bg); | |
| color: var(--md-warning); | |
| } | |
| .item-risk.risk-red { | |
| background: var(--md-error-bg); | |
| color: var(--md-error); | |
| } | |
| .item-risk.risk-unknown { | |
| background: var(--md-surface-3); | |
| color: var(--md-on-surface-muted); | |
| } | |
| .item-preview { | |
| font-size: 0.82rem; | |
| color: var(--md-on-surface-muted); | |
| overflow: hidden; | |
| text-overflow: ellipsis; | |
| white-space: nowrap; | |
| margin-bottom: var(--s3); | |
| } | |
| /* Archive Action Buttons (Shneiderman Principle 7: User Control) */ | |
| .history-actions { | |
| display: flex; | |
| gap: var(--s2); | |
| opacity: 0; | |
| transition: opacity var(--md-duration-short) ease; | |
| } | |
| .history-card:hover .history-actions { | |
| opacity: 1; | |
| } | |
| .archive-export-btn, | |
| .archive-delete-btn { | |
| display: inline-flex; | |
| align-items: center; | |
| gap: var(--s1); | |
| padding: var(--s2) var(--s3); | |
| border-radius: var(--md-corner-md); | |
| border: none; | |
| font-size: 0.75rem; | |
| font-weight: 600; | |
| cursor: pointer; | |
| transition: all var(--md-duration-short) ease; | |
| } | |
| .archive-export-btn { | |
| background: var(--md-primary-container); | |
| color: var(--md-primary-light); | |
| } | |
| .archive-export-btn:hover { | |
| background: var(--md-primary-light); | |
| color: var(--md-on-primary); | |
| } | |
| .archive-delete-btn { | |
| background: var(--md-error-bg); | |
| color: var(--md-error); | |
| } | |
| .archive-delete-btn:hover { | |
| background: var(--md-error); | |
| color: var(--md-on-error); | |
| } | |
| .archive-export-btn .material-symbols-rounded, | |
| .archive-delete-btn .material-symbols-rounded { | |
| font-size: 0.9rem; | |
| } | |
| .btn-danger { | |
| background: var(--md-error-bg) ; | |
| color: var(--md-error) ; | |
| } | |
| .btn-danger:hover { | |
| background: var(--md-error) ; | |
| color: var(--md-on-error) ; | |
| } | |
| .empty-state { | |
| display: flex; | |
| flex-direction: column; | |
| align-items: center; | |
| gap: var(--s2); | |
| padding: var(--s10) var(--s4); | |
| color: var(--md-on-surface-muted); | |
| font-size: 0.85rem; | |
| text-align: center; | |
| opacity: 0.6; | |
| } | |
| /* ββ Archive List In-Place Loading States ββββββββββββββββββββββββββββββββ */ | |
| /* Shown on first/empty load β a centred spinner inside the scroll area */ | |
| .history-loading-state { | |
| display: flex; | |
| align-items: center; | |
| justify-content: center; | |
| padding: var(--s10) 0; | |
| } | |
| /* During filter re-fetches: dim cards in-place, no jarring wipe or text-flash */ | |
| .history-scroll.is-loading { | |
| opacity: 0.45; | |
| pointer-events: none; | |
| transition: opacity 0.18s ease; | |
| } | |
| .history-scroll:not(.is-loading) { | |
| opacity: 1; | |
| transition: opacity 0.22s ease; | |
| } | |
| /* ββ Loading Overlay (Shared full-panel loader) ββββββββββββββββββββββββ */ | |
| .app-overlay-loader { | |
| position: absolute; | |
| inset: 0; | |
| background: var(--glass-modal-bg); | |
| backdrop-filter: blur(var(--blur-medium)); | |
| -webkit-backdrop-filter: blur(var(--blur-medium)); | |
| display: flex; | |
| flex-direction: column; | |
| align-items: center; | |
| justify-content: center; | |
| gap: var(--s4); | |
| border-radius: var(--md-corner-xl); | |
| z-index: 100; | |
| /* Offset so spinner centres in visible content area below the tab nav (overridable) */ | |
| padding-top: var(--loader-offset, clamp(40px, 6vh, 80px)); | |
| } | |
| /* Modifier: center the spinner exactly (no top offset) */ | |
| .app-overlay-loader.center { | |
| padding-top: 0; | |
| align-items: center; | |
| justify-content: center; | |
| } | |
| /* Modifier for overlays that should inherit the container's radius and sit inset */ | |
| .app-overlay-loader.inset { | |
| border-radius: inherit; | |
| padding-top: 0; | |
| background: rgba(15, 23, 42, 0.6); | |
| z-index: 10; | |
| } | |
| .spinner-wrap { | |
| position: relative; | |
| width: 44px; | |
| height: 44px; | |
| } | |
| .m3-spinner { | |
| width: 44px; | |
| height: 44px; | |
| border: 3px solid var(--md-primary-container); | |
| border-top-color: var(--md-primary); | |
| border-radius: 50%; | |
| animation: spin 0.9s linear infinite; | |
| transition: border-top-color 0.3s ease, border-color 0.3s ease; | |
| } | |
| .ft-badge { | |
| position: absolute; | |
| bottom: -6px; | |
| right: -6px; | |
| width: 22px; | |
| height: 22px; | |
| border-radius: 50%; | |
| background: #22c55e; | |
| display: flex; | |
| align-items: center; | |
| justify-content: center; | |
| box-shadow: 0 0 0 3px var(--md-surface-2), 0 0 12px rgba(34, 197, 94, 0.5); | |
| animation: ftBadgePop 0.4s cubic-bezier(0.34, 1.56, 0.64, 1) forwards; | |
| } | |
| .ft-badge .material-symbols-rounded { | |
| font-size: 14px; | |
| color: #fff; | |
| font-variation-settings: 'FILL' 1; | |
| } | |
| @keyframes ftBadgePop { | |
| from { | |
| opacity: 0; | |
| transform: scale(0); | |
| } | |
| to { | |
| opacity: 1; | |
| transform: scale(1); | |
| } | |
| } | |
| /* Spinner turns green when fast-tracked */ | |
| .fast-tracked .m3-spinner { | |
| border-color: rgba(34, 197, 94, 0.2); | |
| border-top-color: #22c55e; | |
| } | |
| /* Loader text mirrors fast-track green */ | |
| .fast-tracked #loader-text { | |
| color: #22c55e; | |
| font-weight: 600; | |
| text-shadow: 0 0 12px rgba(34, 197, 94, 0.35); | |
| animation: ftTextPulse 1.4s ease-in-out infinite; | |
| } | |
| #loader-text { | |
| color: var(--md-on-surface); | |
| font-size: var(--md-body-medium); | |
| text-align: center; | |
| max-width: 80%; | |
| word-wrap: break-word; | |
| margin: 0 auto; | |
| } | |
| @keyframes ftTextPulse { | |
| 0%, | |
| 100% { | |
| opacity: 1; | |
| } | |
| 50% { | |
| opacity: 0.6; | |
| } | |
| } | |
| /* History Pending/Failed States */ | |
| .history-item.pending { | |
| border-left: 3px solid var(--md-primary) ; | |
| background: var(--md-primary-container) ; | |
| cursor: default ; | |
| } | |
| .history-item.failed { | |
| border-left: 3px solid var(--md-error) ; | |
| background: var(--md-error-bg) ; | |
| } | |
| .audit-status { | |
| font-size: 11px; | |
| font-weight: 700; | |
| text-transform: uppercase; | |
| padding: 2px 6px; | |
| border-radius: 4px; | |
| letter-spacing: 0.5px; | |
| } | |
| .audit-status.processing { | |
| color: var(--md-primary-light); | |
| background: rgba(20, 184, 166, 0.1); | |
| } | |
| .audit-status.failed { | |
| color: var(--md-error-light); | |
| background: rgba(239, 68, 68, 0.1); | |
| } | |
| .spinner-small { | |
| width: 16px; | |
| height: 16px; | |
| border: 2px solid rgba(255, 255, 255, 0.1); | |
| border-top-color: var(--md-primary-light); | |
| border-radius: 50%; | |
| animation: spin 0.8s linear infinite; | |
| } | |
| .history-item-body { | |
| display: flex; | |
| justify-content: space-between; | |
| align-items: center; | |
| margin-top: 8px; | |
| } | |
| .history-item-body .filename { | |
| font-size: 13px; | |
| color: var(--md-on-surface); | |
| white-space: nowrap; | |
| overflow: hidden; | |
| text-overflow: ellipsis; | |
| max-width: 80%; | |
| } | |
| .history-item-body .error-msg { | |
| font-size: 11px; | |
| color: var(--md-error-light); | |
| } | |
| @keyframes spin { | |
| from { | |
| transform: rotate(0deg); | |
| } | |
| to { | |
| transform: rotate(360deg); | |
| } | |
| } | |
| @keyframes fadeOut { | |
| from { | |
| opacity: 1; | |
| } | |
| to { | |
| opacity: 0; | |
| } | |
| } | |
| .loader-msg { | |
| font-size: 0.85rem; | |
| color: var(--md-on-surface-muted); | |
| animation: loadPulse 1.5s ease-in-out infinite; | |
| } | |
| @keyframes loadPulse { | |
| 0%, | |
| 100% { | |
| opacity: 0.6; | |
| } | |
| 50% { | |
| opacity: 1; | |
| } | |
| } | |
| /* ββ Transcribe Now panel (inside loader overlay) βββββββββββββββββββ */ | |
| /* ββ Transcribe Now panel (inside loader overlay) βββββββββββββββββββ */ | |
| .tnp-minimal-wrapper { | |
| margin-top: var(--s4); | |
| display: flex; | |
| flex-direction: column; | |
| align-items: center; | |
| gap: var(--s3); | |
| animation: fadeUp 0.35s ease; | |
| } | |
| @keyframes fadeUp { | |
| from { | |
| opacity: 0; | |
| transform: translateY(12px); | |
| } | |
| to { | |
| opacity: 1; | |
| transform: translateY(0); | |
| } | |
| } | |
| .btn-fast-track { | |
| display: inline-flex; | |
| align-items: center; | |
| gap: var(--s2); | |
| padding: var(--s2) var(--s4); | |
| border-radius: var(--md-corner-full); | |
| border: 1px solid var(--md-outline); | |
| background: transparent; | |
| color: var(--md-on-surface-muted); | |
| font-family: inherit; | |
| font-size: 0.82rem; | |
| font-weight: 500; | |
| cursor: pointer; | |
| transition: all var(--md-duration-short) ease; | |
| } | |
| .btn-fast-track:hover:not(:disabled) { | |
| background: var(--md-surface-3); | |
| color: var(--md-on-bg); | |
| border-color: var(--md-primary-light); | |
| } | |
| .btn-fast-track:disabled { | |
| opacity: 0.38; | |
| cursor: not-allowed; | |
| } | |
| .btn-fast-track .material-symbols-rounded { | |
| font-size: var(--md-body-large); | |
| } | |
| .tnp-status { | |
| font-size: 0.8rem; | |
| color: var(--md-success); | |
| font-weight: 600; | |
| margin: 0; | |
| } | |
| /* ββ Toast Notifications (MD3 Snackbar) βββββββββββββββββββββββββββββββ */ | |
| .toast-outlet { | |
| position: fixed; | |
| bottom: var(--s6); | |
| right: var(--s6); | |
| display: flex; | |
| flex-direction: column; | |
| gap: var(--s2); | |
| z-index: var(--z-notification); | |
| pointer-events: none; | |
| } | |
| .modern-toast { | |
| padding: var(--s3) var(--s5); | |
| border-radius: var(--md-corner-md); | |
| font-size: 0.82rem; | |
| font-weight: 500; | |
| color: var(--md-on-surface); | |
| background: var(--md-surface-3); | |
| border: 1px solid var(--md-outline); | |
| box-shadow: var(--md-elevation-3); | |
| animation: toastIn var(--md-duration-medium) var(--md-easing); | |
| transition: opacity var(--md-duration-short), transform var(--md-duration-short); | |
| max-width: 320px; | |
| backdrop-filter: blur(var(--blur-medium)); | |
| } | |
| .modern-toast.success { | |
| background: rgba(16, 185, 129, 0.9); | |
| border-color: var(--md-success); | |
| } | |
| .modern-toast.error { | |
| background: rgba(239, 68, 68, 0.88); | |
| border-color: var(--md-error); | |
| } | |
| .modern-toast.warning { | |
| background: rgba(245, 158, 11, 0.9); | |
| border-color: var(--md-warning); | |
| color: #1C1917; | |
| } | |
| @keyframes toastIn { | |
| from { | |
| opacity: 0; | |
| transform: translateX(20px); | |
| } | |
| to { | |
| opacity: 1; | |
| transform: translateX(0); | |
| } | |
| } | |
| /* Error Dialog: User-Friendly Error Messages (Shneiderman Principle 5) */ | |
| .error-dialog-backdrop { | |
| animation: fadeIn var(--md-duration-short) ease-out; | |
| } | |
| .error-dialog { | |
| animation: slideUp var(--md-duration-medium) var(--md-easing); | |
| max-width: 500px; | |
| } | |
| @keyframes slideUp { | |
| from { | |
| opacity: 0; | |
| transform: translateY(20px); | |
| } | |
| to { | |
| opacity: 1; | |
| transform: translateY(0); | |
| } | |
| } | |
| /* HITL Undo Toast: 10-second grace period with countdown (Shneiderman Principle 6) */ | |
| .hitl-undo-toast { | |
| background: linear-gradient(135deg, var(--md-surface-2) 0%, var(--md-surface-dim) 100%) ; | |
| border-color: var(--md-on-surface-muted) ; | |
| box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3), inset 0 1px 0 rgba(148, 163, 184, 0.1) ; | |
| animation: slideUpIfMobile var(--md-duration-medium) var(--md-easing) ; | |
| } | |
| .hitl-undo-toast .btn-small { | |
| background: var(--md-primary); | |
| color: var(--md-on-primary); | |
| border: none; | |
| transition: all var(--md-duration-short) ease; | |
| } | |
| .hitl-undo-toast .btn-small:hover { | |
| background: var(--md-primary-light); | |
| box-shadow: var(--md-elevation-1); | |
| } | |
| .hitl-undo-toast .btn-small:disabled { | |
| opacity: 0.5; | |
| cursor: not-allowed; | |
| } | |
| @keyframes slideUpIfMobile { | |
| from { | |
| opacity: 0; | |
| transform: translateY(12px); | |
| } | |
| to { | |
| opacity: 1; | |
| transform: translateY(0); | |
| } | |
| } | |
| /* Footer β Comprehensive sitemap, accessibility controls, legal/compliance links */ | |
| .app-footer { | |
| background: var(--md-surface); | |
| border-top: 1px solid var(--md-outline); | |
| color: var(--md-on-surface); | |
| margin-top: var(--s12); | |
| box-sizing: border-box; | |
| /* accommodate safe-area insets and maintain consistent horizontal padding */ | |
| padding: calc(var(--s12) + env(safe-area-inset-top, 0px)) calc(var(--s6) + env(safe-area-inset-right, 0px)) calc(var(--s2) + env(safe-area-inset-bottom, 0px)) calc(var(--s6) + env(safe-area-inset-left, 0px)); | |
| font-size: var(--md-body-small); | |
| } | |
| /* Footer Top: Branding + Controls */ | |
| .footer-top { | |
| display: flex; | |
| align-items: center; | |
| justify-content: space-between; | |
| margin-bottom: var(--s8); | |
| gap: var(--s6); | |
| } | |
| .footer-brand { | |
| display: flex; | |
| align-items: center; | |
| gap: var(--s4); | |
| min-width: 0; | |
| } | |
| .footer-logo { | |
| width: 40px; | |
| height: 40px; | |
| border-radius: var(--md-corner-md); | |
| background: var(--md-primary-container); | |
| display: flex; | |
| align-items: center; | |
| justify-content: center; | |
| flex-shrink: 1; | |
| /* Fixed overflow */ | |
| color: var(--md-primary); | |
| font-size: 1.5rem; | |
| } | |
| .footer-brand-info { | |
| display: flex; | |
| flex-direction: column; | |
| gap: 2px; | |
| } | |
| .footer-brand-name { | |
| font-size: var(--md-label-large); | |
| font-weight: 700; | |
| margin: 0; | |
| color: var(--md-on-surface); | |
| line-height: 1.2; | |
| } | |
| .footer-brand-desc { | |
| font-size: var(--md-label-small); | |
| color: var(--md-on-surface-muted); | |
| margin: 0; | |
| } | |
| /* Footer Controls (Right-Aligned) */ | |
| .footer-controls { | |
| display: flex; | |
| align-items: center; | |
| gap: var(--s4); | |
| margin-left: auto; | |
| flex-wrap: wrap; | |
| justify-content: flex-end; | |
| } | |
| .footer-control-link { | |
| display: flex; | |
| align-items: center; | |
| gap: var(--s2); | |
| padding: var(--s2) var(--s3); | |
| background: transparent; | |
| border: 1px solid var(--md-outline); | |
| border-radius: var(--md-corner-full); | |
| color: var(--md-on-surface-muted); | |
| font-size: var(--md-label-medium); | |
| font-weight: 500; | |
| cursor: pointer; | |
| text-decoration: none; | |
| transition: all var(--md-duration-short) var(--md-easing); | |
| } | |
| .footer-control-link:hover { | |
| background: var(--md-primary-container); | |
| color: var(--md-primary); | |
| border-color: var(--md-primary); | |
| } | |
| .footer-control-link .material-symbols-rounded { | |
| font-size: var(--md-body-large); | |
| } | |
| /* Footer Divider */ | |
| .footer-divider { | |
| height: 1px; | |
| background: var(--md-outline); | |
| margin: var(--s4) 0; | |
| /* Footer spacing: visual separation without excess */ | |
| } | |
| /* Footer Content: Sitemap Grid */ | |
| .footer-content { | |
| display: grid; | |
| grid-template-columns: repeat(auto-fit, minmax(160px, 1fr)); | |
| gap: var(--s3); | |
| margin-bottom: var(--s6); | |
| } | |
| /* Footer Section */ | |
| .footer-section { | |
| display: flex; | |
| flex-direction: column; | |
| gap: var(--s2); | |
| } | |
| .footer-section-title { | |
| font-size: var(--md-label-large); | |
| font-weight: 700; | |
| color: var(--md-on-surface); | |
| margin: 0 0 var(--s1) 0; | |
| text-transform: uppercase; | |
| letter-spacing: 0.5px; | |
| } | |
| /* Footer Link List */ | |
| .footer-link-list { | |
| list-style: none; | |
| padding: 0; | |
| margin: 0; | |
| display: flex; | |
| flex-direction: column; | |
| gap: var(--s1); | |
| } | |
| .footer-link { | |
| color: var(--md-on-surface-muted); | |
| text-decoration: none; | |
| font-size: var(--md-body-medium); | |
| /* Improved: upgraded from body-small for better visibility */ | |
| transition: all var(--md-duration-short) var(--md-easing); | |
| position: relative; | |
| display: inline-block; | |
| width: fit-content; | |
| font-weight: 500; | |
| /* Subtle emphasis for scanability */ | |
| } | |
| .footer-link:hover { | |
| color: var(--md-primary); | |
| } | |
| .footer-link::after { | |
| content: ''; | |
| position: absolute; | |
| bottom: -2px; | |
| left: 0; | |
| right: 0; | |
| height: 2px; | |
| background: var(--md-primary); | |
| border-radius: var(--md-corner-pixel); | |
| transform: scaleX(0); | |
| transform-origin: right; | |
| transition: transform var(--md-duration-short) var(--md-easing); | |
| } | |
| .footer-link:hover::after { | |
| transform: scaleX(1); | |
| transform-origin: left; | |
| } | |
| .footer-link:focus-visible { | |
| outline: 2px solid var(--md-primary); | |
| outline-offset: 4px; | |
| border-radius: var(--md-corner-hairline); | |
| } | |
| /* Footer Bottom: Copyright & Meta */ | |
| .footer-bottom { | |
| display: flex; | |
| align-items: center; | |
| justify-content: space-between; | |
| gap: var(--s6); | |
| flex-wrap: wrap; | |
| margin-top: var(--s6); | |
| padding-top: var(--s6); | |
| border-top: 1px solid var(--md-outline); | |
| /* ensure bottom spacing on devices with notch / safe areas */ | |
| padding-bottom: calc(var(--s4) + env(safe-area-inset-bottom, 0px)); | |
| } | |
| /* Ensure footer sits above accidental layout overlays and is clickable */ | |
| .app-footer { | |
| position: relative; | |
| z-index: 5; | |
| } | |
| .footer-content, | |
| .footer-bottom, | |
| .footer-bottom-links, | |
| .footer-link, | |
| .footer-bottom-link { | |
| pointer-events: auto; | |
| } | |
| .footer-copyright { | |
| flex: 1; | |
| min-width: 0; | |
| } | |
| .footer-copyright p { | |
| margin: 0; | |
| color: var(--md-on-surface-muted); | |
| font-size: var(--md-body-medium); | |
| /* Consistency: body-medium for all footer text */ | |
| line-height: 1.5; | |
| font-weight: 500; | |
| } | |
| /* Footer Bottom Links */ | |
| .footer-bottom-links { | |
| display: flex; | |
| gap: var(--s2); | |
| align-items: center; | |
| flex-wrap: wrap; | |
| } | |
| .footer-bottom-link { | |
| color: var(--md-on-surface-muted); | |
| text-decoration: none; | |
| font-size: var(--md-body-medium); | |
| /* Upgraded: from body-small to match footer section visibility */ | |
| transition: color var(--md-duration-short) var(--md-easing); | |
| border: none; | |
| background: transparent; | |
| cursor: pointer; | |
| padding: 0; | |
| font-family: inherit; | |
| margin: 0; | |
| line-height: inherit; | |
| font-weight: 500; | |
| /* Consistent with footer links for visual hierarchy */ | |
| } | |
| .footer-bottom-link:hover { | |
| color: var(--md-primary); | |
| text-decoration: underline; | |
| } | |
| .footer-bottom-link:focus-visible { | |
| outline: 2px solid var(--md-primary); | |
| outline-offset: 4px; | |
| border-radius: var(--md-corner-hairline); | |
| } | |
| /* Footer Version/Status Badge */ | |
| .footer-version { | |
| display: flex; | |
| align-items: center; | |
| gap: var(--s2); | |
| color: var(--md-on-surface-muted); | |
| font-size: var(--md-label-small); | |
| } | |
| .footer-version p { | |
| margin: 0; | |
| } | |
| .status-badge { | |
| display: inline-flex; | |
| align-items: center; | |
| gap: var(--s1); | |
| padding: 4px 8px; | |
| background: var(--md-success-bg); | |
| color: var(--md-success); | |
| border-radius: var(--md-corner-xs); | |
| font-weight: 600; | |
| white-space: nowrap; | |
| } | |
| .status-badge::before { | |
| content: 'β'; | |
| font-size: 0.75rem; | |
| animation: pulse 2s ease-in-out infinite; | |
| } | |
| /* ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |
| ENTERPRISE FOOTER SYSTEM STATUS | |
| Real-time system health, metrics, and service indicators for customers | |
| ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ */ | |
| .footer-system-status { | |
| display: grid; | |
| grid-template-columns: repeat(3, 1fr); | |
| gap: var(--s4); | |
| padding: var(--s4); | |
| background: var(--md-surface-2); | |
| border: 1px solid var(--md-outline); | |
| border-radius: var(--md-corner-md); | |
| margin-bottom: var(--s4); | |
| } | |
| .status-section { | |
| display: flex; | |
| flex-direction: column; | |
| gap: var(--s2); | |
| } | |
| .status-item { | |
| display: flex; | |
| justify-content: space-between; | |
| align-items: center; | |
| padding: var(--s2); | |
| background: var(--md-surface); | |
| border: 1px solid var(--md-outline); | |
| border-radius: var(--md-corner-sm); | |
| transition: all var(--md-duration-short) var(--md-easing); | |
| } | |
| .status-item:hover { | |
| background: rgba(15, 118, 110, 0.04); | |
| border-color: var(--md-primary); | |
| } | |
| .status-label { | |
| font-size: var(--md-label-small); | |
| font-weight: 600; | |
| color: var(--md-on-surface-muted); | |
| text-transform: uppercase; | |
| letter-spacing: 0.05em; | |
| } | |
| .status-value { | |
| display: flex; | |
| align-items: center; | |
| gap: var(--s1); | |
| font-size: var(--md-body-small); | |
| font-weight: 600; | |
| color: var(--md-on-surface); | |
| font-family: 'Monaco', 'Courier New', monospace; | |
| } | |
| /* Status value colors based on health */ | |
| .status-value.success { | |
| color: var(--md-success); | |
| } | |
| .status-value.warning { | |
| color: var(--md-warning); | |
| } | |
| .status-value.error { | |
| color: var(--md-error); | |
| } | |
| .status-value.prod { | |
| display: inline-block; | |
| padding: 2px 6px; | |
| background: var(--md-success-bg); | |
| color: var(--md-success); | |
| border-radius: var(--md-corner-hair); | |
| font-size: var(--md-label-small); | |
| } | |
| .status-value.dev { | |
| display: inline-block; | |
| padding: 2px 6px; | |
| background: rgba(59, 130, 246, 0.12); | |
| color: #3b82f6; | |
| border-radius: var(--md-corner-hair); | |
| font-size: var(--md-label-small); | |
| } | |
| /* Status indicator dot */ | |
| .status-value::before { | |
| content: 'β'; | |
| display: inline-block; | |
| width: 0.5rem; | |
| } | |
| .status-value.success::before { | |
| color: var(--md-success); | |
| animation: pulse 2s ease-in-out infinite; | |
| } | |
| .status-value.warning::before { | |
| color: var(--md-warning); | |
| animation: pulse-warning 1.5s ease-in-out infinite; | |
| } | |
| .status-value.error::before { | |
| color: var(--md-error); | |
| animation: none; | |
| } | |
| @keyframes pulse-warning { | |
| 0%, | |
| 100% { | |
| opacity: 1; | |
| } | |
| 50% { | |
| opacity: 0.5; | |
| } | |
| } | |
| /* Light Theme Adjustments */ | |
| html[data-theme="light"] .footer-system-status { | |
| background: rgba(15, 118, 110, 0.04); | |
| } | |
| html[data-theme="light"] .status-item { | |
| background: rgba(255, 255, 255, 0.8); | |
| } | |
| /* Responsive: Tablet */ | |
| @media (max-width: 1024px) { | |
| .footer-system-status { | |
| grid-template-columns: repeat(2, 1fr); | |
| } | |
| } | |
| /* Responsive: Mobile */ | |
| @media (max-width: 768px) { | |
| .footer-system-status { | |
| grid-template-columns: 1fr; | |
| gap: var(--s2); | |
| } | |
| .status-item { | |
| flex-direction: column; | |
| align-items: flex-start; | |
| gap: var(--s1); | |
| } | |
| .status-value { | |
| width: 100%; | |
| justify-content: space-between; | |
| } | |
| } | |
| /* Light Theme Footer */ | |
| html[data-theme="light"] .footer-section-title { | |
| color: var(--md-on-surface); | |
| } | |
| html[data-theme="light"] .footer-control-link { | |
| border-color: var(--md-outline); | |
| } | |
| /* Responsive: Tablet */ | |
| @media (max-width: 1024px) { | |
| .footer-content { | |
| grid-template-columns: repeat(auto-fit, minmax(140px, 1fr)); | |
| } | |
| .footer-top { | |
| flex-direction: column; | |
| align-items: flex-start; | |
| } | |
| .footer-controls { | |
| width: 100%; | |
| justify-content: flex-start; | |
| margin-left: 0; | |
| } | |
| } | |
| /* Responsive: Mobile */ | |
| @media (max-width: 640px) { | |
| .app-footer { | |
| padding: var(--s8) var(--s4); | |
| } | |
| .footer-top { | |
| gap: var(--s4); | |
| } | |
| .footer-content { | |
| grid-template-columns: repeat(auto-fit, minmax(120px, 1fr)); | |
| gap: var(--s6); | |
| } | |
| .footer-section-title { | |
| font-size: var(--md-label-medium); | |
| margin-bottom: var(--s1); | |
| } | |
| .footer-bottom { | |
| flex-direction: column; | |
| align-items: flex-start; | |
| gap: var(--s4); | |
| } | |
| .footer-bottom-links { | |
| width: 100%; | |
| } | |
| .footer-controls { | |
| width: 100%; | |
| } | |
| .footer-brand-info { | |
| display: flex; | |
| flex-direction: column; | |
| gap: var(--s2); | |
| } | |
| .footer-brand-name { | |
| font-size: var(--md-title-small); | |
| } | |
| .footer-brand-desc { | |
| font-size: var(--md-label-small); | |
| } | |
| .footer-logo { | |
| width: 32px; | |
| height: 32px; | |
| } | |
| } | |
| /* Accessibility: High Contrast Mode */ | |
| @media (prefers-contrast: more) { | |
| .footer-control-link { | |
| border: 1.5px solid var(--md-outline); | |
| } | |
| .footer-link { | |
| text-decoration: none; | |
| } | |
| .footer-link:hover { | |
| text-decoration: underline; | |
| } | |
| } | |
| /* Accessibility: Reduced Motion */ | |
| @media (prefers-reduced-motion: reduce) { | |
| .footer-control-link, | |
| .footer-link, | |
| .status-badge::before { | |
| transition: none; | |
| animation: none; | |
| } | |
| } | |
| /* ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |
| ADVANCED FOOTER ENHANCEMENTS | |
| Hover states, transitions, and visual polish for enterprise appearance | |
| ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ */ | |
| /* Footer link styling uses ::after animation defined in main section */ | |
| /* Stagger animation for footer sections on load */ | |
| .footer-section { | |
| animation: fadeInUp 0.6s ease-out; | |
| } | |
| .footer-section:nth-child(1) { | |
| animation-delay: 0.1s; | |
| } | |
| .footer-section:nth-child(2) { | |
| animation-delay: 0.2s; | |
| } | |
| .footer-section:nth-child(3) { | |
| animation-delay: 0.3s; | |
| } | |
| .footer-section:nth-child(4) { | |
| animation-delay: 0.4s; | |
| } | |
| .footer-section:nth-child(5) { | |
| animation-delay: 0.5s; | |
| } | |
| .footer-section:nth-child(6) { | |
| animation-delay: 0.6s; | |
| } | |
| @keyframes fadeInUp { | |
| from { | |
| opacity: 0; | |
| transform: translateY(20px); | |
| } | |
| to { | |
| opacity: 1; | |
| transform: translateY(0); | |
| } | |
| } | |
| /* Footer Link List Items with Staggered Animation */ | |
| .footer-link-list li { | |
| /* disable per-link entrance animations to avoid duplicated flicker; keep section-level animation */ | |
| animation: none ; | |
| } | |
| @keyframes fadeInLeft { | |
| from { | |
| opacity: 0; | |
| transform: translateX(-10px); | |
| } | |
| to { | |
| opacity: 1; | |
| transform: translateX(0); | |
| } | |
| } | |
| /* Footer Section Hover Enhancement */ | |
| .footer-section:hover .footer-section-title { | |
| color: var(--md-primary); | |
| transition: color var(--md-duration-medium) var(--md-easing); | |
| } | |
| /* Enhanced Control Button Styling */ | |
| .footer-control-link { | |
| position: relative; | |
| overflow: hidden; | |
| } | |
| .footer-control-link::before { | |
| content: ''; | |
| position: absolute; | |
| top: 0; | |
| left: -100%; | |
| width: 100%; | |
| height: 100%; | |
| background: var(--md-primary-container); | |
| transition: left var(--md-duration-medium) var(--md-easing); | |
| z-index: -1; | |
| } | |
| .footer-control-link:hover::before { | |
| left: 0; | |
| } | |
| /* Footer Bottom Links Styling */ | |
| .footer-bottom-link { | |
| position: relative; | |
| padding: 0 var(--s2); | |
| /* Spacing consistency */ | |
| display: inline; | |
| } | |
| /* Standalone separator elements β NOT hyperlinked, clearly visible */ | |
| .footer-separator { | |
| color: var(--md-on-surface-variant); | |
| /* Dark, visible bullet */ | |
| margin: 0 var(--s2); | |
| /* Consistent spacing */ | |
| font-weight: 500; | |
| /* Slightly bolder for clarity */ | |
| pointer-events: none; | |
| /* Prevent any interaction */ | |
| user-select: none; | |
| /* Prevent selection */ | |
| display: inline; | |
| /* Flow with links */ | |
| } | |
| /* Footer Socials - compact, accessible icon buttons */ | |
| .footer-socials { | |
| display: flex; | |
| gap: var(--s3); | |
| align-items: center; | |
| justify-content: flex-end; | |
| } | |
| .footer-social { | |
| display: inline-flex; | |
| align-items: center; | |
| justify-content: center; | |
| width: 36px; | |
| height: 36px; | |
| border-radius: var(--md-corner-sm); | |
| background: transparent; | |
| color: var(--md-on-surface-muted); | |
| text-decoration: none; | |
| transition: background-color 180ms var(--md-easing), color 180ms var(--md-easing); | |
| } | |
| /* Inline SVG icon sizing and color inherit */ | |
| .footer-social-icon { | |
| width: 18px; | |
| height: 18px; | |
| display: block; | |
| flex: 0 0 18px; | |
| } | |
| .footer-social-icon path { | |
| fill: currentColor; | |
| } | |
| /* System status button placed with footer items, avoid fixed/sticky behavior */ | |
| .system-status-btn { | |
| display: inline-flex; | |
| align-items: center; | |
| gap: var(--s2); | |
| padding: 8px 10px; | |
| border: 1px solid var(--md-outline); | |
| background: var(--md-surface-2); | |
| color: var(--md-on-surface); | |
| border-radius: var(--md-corner-sm); | |
| cursor: pointer; | |
| margin-left: 8px; | |
| flex-shrink: 1; | |
| /* Fixed overflow */ | |
| } | |
| .system-status-btn .status-indicator-dots { | |
| display: inline-flex; | |
| gap: 6px; | |
| align-items: center; | |
| } | |
| .system-status-btn .status-dot { | |
| width: 8px; | |
| height: 8px; | |
| border-radius: 50%; | |
| display: inline-block; | |
| } | |
| .system-status-btn .api-dot { | |
| background: var(--md-success); | |
| } | |
| .system-status-btn .db-dot { | |
| background: var(--md-warning); | |
| } | |
| .system-status-btn .rt-dot { | |
| background: var(--md-error); | |
| } | |
| /* Ensure page content doesn't get overlapped by footer on small viewports */ | |
| .app-content-wrapper, | |
| .main-content-card, | |
| .app-container { | |
| padding-bottom: calc(var(--s10, 48px) + env(safe-area-inset-bottom, 0px)); | |
| } | |
| .footer-social:hover, | |
| .footer-social:focus { | |
| background: rgba(15, 118, 110, 0.08); | |
| color: var(--md-primary); | |
| outline: none; | |
| } | |
| .footer-social:focus-visible { | |
| box-shadow: 0 0 0 3px var(--md-primary-container); | |
| border-radius: var(--md-corner-sm); | |
| } | |
| /* Improve footer link contrast and keyboard visibility */ | |
| .footer-link { | |
| color: var(--md-on-surface-muted); | |
| } | |
| .footer-link:focus-visible { | |
| outline: 2px solid var(--md-primary); | |
| outline-offset: 3px; | |
| } | |
| /* Focus Visible States for Keyboard Navigation */ | |
| .footer-link:focus-visible::after { | |
| display: block; | |
| } | |
| .footer-control-link:focus-visible { | |
| box-shadow: 0 0 0 3px var(--md-primary-container); | |
| } | |
| .footer-bottom-link:focus-visible { | |
| text-decoration: underline; | |
| text-decoration-thickness: 2px; | |
| text-underline-offset: 4px; | |
| } | |
| /* Status Badge Pulse Animation */ | |
| @keyframes statusPulse { | |
| 0%, | |
| 100% { | |
| box-shadow: 0 0 0 0 var(--md-success); | |
| } | |
| 50% { | |
| box-shadow: 0 0 0 4px rgba(5, 150, 105, 0.3); | |
| } | |
| } | |
| .status-badge { | |
| animation: statusPulse 3s ease-in-out infinite; | |
| } | |
| /* Footer Hover State Enhancement */ | |
| .app-footer { | |
| transition: border-color var(--md-duration-medium) var(--md-easing), | |
| background-color var(--md-duration-medium) var(--md-easing); | |
| } | |
| .app-footer:hover { | |
| border-top-color: var(--md-primary-container); | |
| } | |
| /* ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |
| SITEMAP MODAL | |
| Comprehensive site navigation overlay with smooth transitions | |
| βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ */ | |
| .sitemap-modal { | |
| position: fixed; | |
| top: 0; | |
| left: 0; | |
| right: 0; | |
| bottom: 0; | |
| background: rgba(0, 0, 0, 0.5); | |
| display: flex ; | |
| align-items: center; | |
| justify-content: center; | |
| z-index: 2000; | |
| padding: var(--s6); | |
| opacity: 1; | |
| pointer-events: auto; | |
| transition: opacity 0.3s ease-out, | |
| pointer-events 0.3s ease-out; | |
| animation: fadeIn 0.3s ease-out; | |
| } | |
| .sitemap-content { | |
| background: var(--md-surface); | |
| border-radius: var(--md-corner-lg); | |
| box-shadow: 0 20px 60px rgba(0, 0, 0, 0.4); | |
| width: 100%; | |
| max-width: 900px; | |
| max-height: 90vh; | |
| overflow-y: auto; | |
| display: flex; | |
| flex-direction: column; | |
| } | |
| .sitemap-header { | |
| display: flex; | |
| align-items: center; | |
| justify-content: space-between; | |
| padding: var(--s5); | |
| border-bottom: 1px solid var(--md-outline); | |
| position: sticky; | |
| top: 0; | |
| background: var(--md-surface); | |
| z-index: 1; | |
| gap: var(--s3); | |
| } | |
| .sitemap-header h2 { | |
| margin: 0; | |
| font-size: var(--md-headline-small); | |
| color: var(--md-on-surface); | |
| flex: 1; | |
| } | |
| .sitemap-header-actions { | |
| display: flex; | |
| align-items: center; | |
| gap: var(--s2); | |
| } | |
| .sitemap-download, | |
| .policy-download { | |
| width: 40px; | |
| height: 40px; | |
| border-radius: 50%; | |
| background: transparent; | |
| border: none; | |
| color: var(--md-on-surface); | |
| cursor: pointer; | |
| padding: 0; | |
| font-size: 24px; | |
| transition: all var(--md-duration-short) var(--md-easing); | |
| display: flex; | |
| align-items: center; | |
| justify-content: center; | |
| } | |
| .sitemap-download:hover, | |
| .policy-download:hover { | |
| background: var(--md-surface-container); | |
| color: var(--md-primary); | |
| } | |
| .sitemap-close { | |
| display: flex; | |
| align-items: center; | |
| justify-content: center; | |
| width: 40px; | |
| height: 40px; | |
| background: transparent; | |
| border: none; | |
| border-radius: 50%; | |
| color: var(--md-on-surface); | |
| cursor: pointer; | |
| padding: 0; | |
| font-size: 24px; | |
| transition: all var(--md-duration-short) var(--md-easing); | |
| } | |
| .sitemap-close:hover { | |
| background: var(--md-surface-container); | |
| color: var(--md-primary); | |
| } | |
| .sitemap-grid { | |
| display: grid; | |
| grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); | |
| gap: var(--s5); | |
| padding: var(--s5); | |
| } | |
| /* ββ SITEMAP TREE STRUCTURE βββββββββββββββββββββββββββββββββββββββ */ | |
| .sitemap-tree { | |
| padding: var(--s5); | |
| overflow-y: auto; | |
| max-height: calc(90vh - 120px); | |
| } | |
| .tree-root, | |
| .tree-children { | |
| list-style: none; | |
| padding: 0; | |
| margin: 0; | |
| } | |
| .tree-children { | |
| margin-left: var(--s4); | |
| padding-left: 0; | |
| } | |
| .tree-branch, | |
| .tree-leaf { | |
| margin: 0; | |
| padding: 0; | |
| } | |
| .tree-branch { | |
| margin-bottom: var(--s2); | |
| } | |
| .tree-node-label { | |
| display: flex; | |
| align-items: center; | |
| gap: var(--s2); | |
| padding: var(--s2) var(--s3); | |
| border-radius: var(--md-corner-sm); | |
| cursor: pointer; | |
| transition: all var(--md-duration-short) var(--md-easing); | |
| user-select: none; | |
| color: var(--md-on-surface); | |
| font-weight: 500; | |
| } | |
| .tree-branch>.tree-node-label:hover { | |
| background: var(--md-surface-container); | |
| color: var(--md-primary); | |
| } | |
| .tree-toggle { | |
| display: inline-flex; | |
| width: 18px; | |
| font-size: 12px; | |
| font-weight: bold; | |
| cursor: pointer; | |
| color: var(--md-on-surface-muted); | |
| transition: transform var(--md-duration-short) var(--md-easing); | |
| user-select: none; | |
| } | |
| .tree-branch>.tree-node-label:hover .tree-toggle { | |
| color: var(--md-primary); | |
| } | |
| .tree-leaf { | |
| padding: var(--s1) 0; | |
| margin-left: var(--s8); | |
| } | |
| .tree-leaf a { | |
| display: flex; | |
| align-items: center; | |
| gap: var(--s2); | |
| padding: var(--s2) var(--s3); | |
| color: var(--md-on-surface-muted); | |
| text-decoration: none; | |
| border-radius: var(--md-corner-sm); | |
| transition: all var(--md-duration-short) var(--md-easing); | |
| font-size: var(--md-body-medium); | |
| } | |
| .tree-leaf a:hover { | |
| background: var(--md-surface-container); | |
| color: var(--md-primary); | |
| padding-left: var(--s4); | |
| } | |
| .sitemap-section h3 { | |
| font-size: var(--md-title-medium); | |
| color: var(--md-on-surface); | |
| margin: 0 0 var(--s3) 0; | |
| } | |
| .sitemap-section h4 { | |
| font-size: var(--md-title-small); | |
| font-weight: 600; | |
| color: var(--md-on-surface); | |
| margin: var(--s4) 0 var(--s2) 0; | |
| padding: 0; | |
| line-height: 1.4; | |
| } | |
| .sitemap-section h4:first-child { | |
| margin-top: 0; | |
| } | |
| .sitemap-section p { | |
| font-size: var(--md-body-medium); | |
| color: var(--md-on-surface); | |
| margin: 0 0 var(--s3) 0; | |
| line-height: 1.6; | |
| padding: 0; | |
| } | |
| .sitemap-section p:last-child { | |
| margin-bottom: 0; | |
| } | |
| .sitemap-section { | |
| display: flex; | |
| flex-direction: column; | |
| gap: var(--s1); | |
| } | |
| .sitemap-section a { | |
| color: var(--md-on-surface-muted); | |
| text-decoration: none; | |
| transition: color var(--md-duration-short) var(--md-easing); | |
| } | |
| .sitemap-section a:hover { | |
| color: var(--md-primary); | |
| } | |
| @media (max-width: 768px) { | |
| .sitemap-content { | |
| max-height: 95vh; | |
| } | |
| .sitemap-grid { | |
| grid-template-columns: 1fr; | |
| } | |
| .sitemap-tree { | |
| max-height: calc(95vh - 120px); | |
| padding: var(--s4); | |
| } | |
| .sitemap-header { | |
| padding: var(--s4); | |
| flex-wrap: wrap; | |
| } | |
| .sitemap-header h2 { | |
| width: 100%; | |
| } | |
| .sitemap-header-actions { | |
| width: 100%; | |
| gap: var(--s1); | |
| } | |
| .sitemap-grid { | |
| padding: var(--s4); | |
| gap: var(--s4); | |
| } | |
| .tree-children { | |
| margin-left: var(--s3); | |
| } | |
| .tree-leaf { | |
| margin-left: var(--s6); | |
| } | |
| } | |
| /* ββ Scrollbar (Custom) βββββββββββββββββββββββββββββββββββββββββββββββ */ | |
| ::-webkit-scrollbar { | |
| width: 4px; | |
| } | |
| ::-webkit-scrollbar-track { | |
| background: transparent; | |
| } | |
| ::-webkit-scrollbar-thumb { | |
| background: var(--md-outline); | |
| border-radius: var(--md-corner-full); | |
| } | |
| ::-webkit-scrollbar-thumb:hover { | |
| background: var(--md-primary); | |
| } | |
| /* ββ Responsive βββββββββββββββββββββββββββββββββββββββββββββββββββββββ */ | |
| /* Tablet / mid viewport: 641β860px β 2-col KPIs, tighter panel gap */ | |
| @media (max-width: 860px) { | |
| .kpi-row { | |
| grid-template-columns: repeat(2, 1fr); | |
| } | |
| .kpi-row .kpi-card:nth-child(3):last-child { | |
| grid-column: 1 / -1; | |
| max-width: calc(50% - var(--s3) / 2); | |
| justify-self: start; | |
| } | |
| .result-container { | |
| gap: var(--s3); | |
| } | |
| } | |
| /* Mobile: β€640px */ | |
| @media (max-width: 640px) { | |
| .kpi-row { | |
| grid-template-columns: 1fr; | |
| } | |
| .kpi-row .kpi-card:nth-child(3):last-child { | |
| grid-column: unset; | |
| max-width: unset; | |
| justify-self: unset; | |
| } | |
| .viz-grid { | |
| grid-template-columns: 1fr; | |
| } | |
| .audit-details-grid { | |
| grid-template-columns: 1fr; | |
| } | |
| .action-grid { | |
| grid-template-columns: 1fr 1fr; | |
| } | |
| .hitl-actions { | |
| flex-direction: column; | |
| } | |
| .tab-navigation { | |
| padding: 0 var(--s2); | |
| } | |
| .nav-tab span:not(.material-symbols-rounded) { | |
| display: none; | |
| } | |
| .content-panel { | |
| padding: var(--s4); | |
| } | |
| .app-header { | |
| gap: var(--s3); | |
| margin-bottom: var(--s4); | |
| } | |
| .app-logo { | |
| width: 42px; | |
| height: 42px; | |
| } | |
| .app-title-group h1 { | |
| font-size: 1.3rem; | |
| } | |
| .file-name { | |
| max-width: min(200px, 40vw); | |
| } | |
| .toast-outlet { | |
| right: var(--s3); | |
| left: var(--s3); | |
| bottom: var(--s4); | |
| } | |
| .modern-toast { | |
| max-width: 100%; | |
| } | |
| .history-scroll { | |
| max-height: 420px; | |
| } | |
| } | |
| /* Small phone: β€400px */ | |
| @media (max-width: 400px) { | |
| .app-container { | |
| padding-top: calc(36px + var(--s5)); | |
| padding-inline: var(--s3); | |
| } | |
| .kpi-value { | |
| font-size: 1.2rem; | |
| } | |
| .content-panel { | |
| padding: var(--s3); | |
| } | |
| .app-title-group h1 { | |
| font-size: 1.15rem; | |
| } | |
| .app-tagline { | |
| font-size: 0.72rem; | |
| } | |
| } | |
| /* ββ Authentication Pages ββββββββββββββββββββββββββββββββββββββββββββββ */ | |
| .auth-page { | |
| display: flex; | |
| align-items: center; | |
| justify-content: center; | |
| min-height: 100vh; | |
| padding: var(--s4); | |
| background: linear-gradient(135deg, rgba(15, 118, 110, 0.05), rgba(20, 184, 166, 0.05)); | |
| backdrop-filter: blur(var(--blur-medium)) saturate(80%); | |
| -webkit-backdrop-filter: blur(var(--blur-medium)) saturate(80%); | |
| } | |
| .auth-container { | |
| background: var(--glass-overlay-bg); | |
| backdrop-filter: blur(var(--blur-medium)) saturate(130%); | |
| -webkit-backdrop-filter: blur(var(--blur-medium)) saturate(130%); | |
| border: 1px solid var(--md-outline); | |
| border-radius: var(--md-corner-lg); | |
| padding: var(--s6); | |
| max-width: 420px; | |
| width: 100%; | |
| box-shadow: var(--glass-panel-shadow); | |
| animation: contentFadeIn 0.5s ease-out; | |
| } | |
| @media (max-width: 640px) { | |
| .auth-container { | |
| padding: var(--s5); | |
| margin: var(--s4) 0; | |
| } | |
| .auth-container h2 { | |
| font-size: 1.25rem; | |
| } | |
| } | |
| @media (max-width: 480px) { | |
| .auth-page { | |
| padding: var(--s3); | |
| } | |
| .auth-container { | |
| padding: var(--s4); | |
| border-radius: var(--md-corner-md); | |
| } | |
| } | |
| .auth-container h2 { | |
| margin-bottom: var(--s5); | |
| color: var(--md-on-bg); | |
| font-size: 1.5rem; | |
| } | |
| .form-group { | |
| margin-bottom: var(--s4); | |
| display: flex; | |
| flex-direction: column; | |
| gap: var(--s2); | |
| } | |
| .form-group label { | |
| margin-bottom: 0; | |
| color: var(--md-on-surface); | |
| font-size: 0.9rem; | |
| font-weight: 500; | |
| line-height: 1.4; | |
| } | |
| .form-group input[type="text"], | |
| .form-group input[type="email"], | |
| .form-group input[type="password"], | |
| .form-group textarea { | |
| padding: var(--s3); | |
| background: rgba(30, 47, 72, 0.7); | |
| border: 1.5px solid rgba(15, 118, 110, 0.2); | |
| border-radius: var(--md-corner-md); | |
| color: var(--md-on-surface); | |
| font-size: var(--md-body-large); | |
| line-height: 1.6; | |
| transition: all var(--md-duration-short) var(--md-easing); | |
| font-family: inherit; | |
| min-height: 44px; | |
| } | |
| .form-group input:not([type="checkbox"])::placeholder { | |
| color: var(--md-on-surface-muted); | |
| opacity: 1; | |
| } | |
| .hero-auth-container .form-group input:not([type="checkbox"]):focus::placeholder { | |
| opacity: 0; | |
| } | |
| .form-group textarea::placeholder { | |
| color: var(--md-on-surface-muted); | |
| opacity: 1; | |
| } | |
| .form-group input:not([type="checkbox"]):focus { | |
| outline: none; | |
| border-color: var(--md-primary); | |
| background: rgba(38, 53, 72, 0.8); | |
| box-shadow: 0 0 0 2px var(--md-primary); | |
| } | |
| .form-group.checkbox { | |
| flex-direction: row; | |
| align-items: center; | |
| margin: var(--s4) 0; | |
| } | |
| .form-group.checkbox input { | |
| margin-right: var(--s3); | |
| width: 20px; | |
| height: 20px; | |
| cursor: pointer; | |
| } | |
| /* Keep checkbox focus subtle and distinct from text inputs */ | |
| .form-group.checkbox input:focus { | |
| outline: none; | |
| box-shadow: none; | |
| } | |
| .form-group.checkbox input:focus-visible { | |
| outline: 2px solid rgba(15, 118, 110, 0.12); | |
| outline-offset: 2px; | |
| } | |
| .form-group.checkbox label { | |
| margin-bottom: 0; | |
| cursor: pointer; | |
| } | |
| /* ββ Dashboard Pages βββββββββββββββββββββββββββββββββββββββββββββββββββ */ | |
| .dash-page { | |
| padding: var(--s6); | |
| max-width: 1200px; | |
| margin: 0 auto; | |
| } | |
| .dashboard-header { | |
| display: flex; | |
| justify-content: space-between; | |
| align-items: flex-start; | |
| margin-bottom: var(--s6); | |
| padding-bottom: var(--s4); | |
| border-bottom: 1px solid var(--md-outline); | |
| flex-wrap: wrap; | |
| gap: var(--s4); | |
| } | |
| .dashboard-header h2 { | |
| color: var(--md-on-bg); | |
| margin: 0; | |
| } | |
| .dashboard { | |
| padding: var(--s6); | |
| } | |
| .dashboard h2 { | |
| margin-bottom: var(--s5); | |
| color: var(--md-on-bg); | |
| } | |
| .stats-grid { | |
| display: grid; | |
| grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); | |
| gap: var(--s5); | |
| margin-bottom: var(--s8); | |
| } | |
| .stat-card { | |
| background: var(--md-surface); | |
| border: 1px solid var(--md-outline); | |
| border-radius: var(--md-corner-lg); | |
| padding: var(--s5); | |
| display: flex; | |
| flex-direction: row; | |
| align-items: center; | |
| gap: var(--s5); | |
| transition: | |
| border-color var(--md-duration-short) var(--md-easing), | |
| box-shadow var(--md-duration-short) var(--md-easing), | |
| transform var(--md-duration-short) var(--md-easing), | |
| background var(--md-duration-short) var(--md-easing); | |
| box-shadow: var(--md-elevation-1); | |
| min-height: 120px; | |
| position: relative; | |
| overflow: hidden; | |
| } | |
| /* Original audit design: 3px colored top-bar accent β encodes meaning spatially */ | |
| .stat-card::before { | |
| content: ''; | |
| position: absolute; | |
| inset: 0 0 auto 0; | |
| height: 3px; | |
| background: var(--md-outline); | |
| transition: background var(--md-duration-medium) var(--md-easing); | |
| } | |
| .stat-card.stat-success::before { | |
| background: var(--md-success); | |
| } | |
| .stat-card.stat-warning::before { | |
| background: var(--md-warning); | |
| } | |
| .stat-card.stat-error::before { | |
| background: var(--md-error); | |
| } | |
| .stat-card.stat-primary::before { | |
| background: var(--md-primary); | |
| } | |
| .stat-card:hover { | |
| background: var(--md-surface-2); | |
| border-color: var(--md-primary); | |
| transform: translateY(-2px); | |
| box-shadow: var(--md-elevation-2); | |
| } | |
| .stat-card:hover::before { | |
| background: var(--md-primary); | |
| } | |
| .stat-card-icon { | |
| display: flex; | |
| align-items: center; | |
| justify-content: center; | |
| width: 64px; | |
| height: 64px; | |
| min-width: 64px; | |
| border-radius: var(--md-corner-md); | |
| background: var(--md-primary-container); | |
| border: 1px solid var(--md-outline); | |
| transition: all var(--md-duration-short) var(--md-easing); | |
| } | |
| .stat-card:hover .stat-card-icon { | |
| background: var(--md-primary); | |
| border-color: var(--md-primary-light); | |
| } | |
| .stat-card:hover .stat-card-icon .material-symbols-rounded { | |
| color: var(--md-on-primary); | |
| } | |
| .stat-card-icon .material-symbols-rounded { | |
| font-size: 2rem; | |
| color: var(--md-primary-light); | |
| transition: color var(--md-duration-short) var(--md-easing); | |
| } | |
| .stat-card-body { | |
| display: flex; | |
| flex-direction: column; | |
| gap: var(--s1); | |
| flex: 1; | |
| min-width: 0; | |
| } | |
| .stat-label { | |
| margin: 0; | |
| color: var(--md-on-surface-muted); | |
| font-size: var(--md-label-medium); | |
| font-weight: 500; | |
| letter-spacing: 0.02em; | |
| } | |
| .stat-value { | |
| margin: 0; | |
| color: var(--md-on-surface); | |
| font-size: var(--md-headline-small); | |
| font-weight: 700; | |
| line-height: 1.2; | |
| } | |
| /* ββ Activity Feed & Cards ββ */ | |
| .activity-feed { | |
| display: flex; | |
| flex-direction: column; | |
| gap: var(--s3); | |
| } | |
| /* ββ Dashboard Content ββ */ | |
| /* ββ Dashboard Page Header ββ */ | |
| .dashboard-title-group { | |
| display: flex; | |
| align-items: center; | |
| gap: var(--s3); | |
| } | |
| .dashboard-subtitle { | |
| margin: var(--s1) 0 0 0; | |
| font-size: var(--md-body-medium); | |
| color: var(--md-on-surface-muted); | |
| font-weight: 400; | |
| } | |
| .dashboard-header-actions { | |
| display: flex; | |
| align-items: center; | |
| gap: var(--s3); | |
| flex-wrap: wrap; | |
| } | |
| /* ββ Tonal Button (MD3 secondary action) ββ */ | |
| .btn-tonal { | |
| display: inline-flex; | |
| align-items: center; | |
| gap: var(--s2); | |
| padding: var(--s2) var(--s5); | |
| border-radius: var(--md-corner-full); | |
| font-size: var(--md-label-large); | |
| font-weight: 500; | |
| cursor: pointer; | |
| border: none; | |
| transition: all var(--md-duration-short) var(--md-easing); | |
| background: rgba(15, 118, 110, 0.12); | |
| color: var(--md-primary); | |
| min-height: 40px; | |
| } | |
| .btn-tonal:hover { | |
| background: rgba(15, 118, 110, 0.20); | |
| box-shadow: var(--md-elevation-1); | |
| } | |
| .btn-tonal:active { | |
| background: rgba(15, 118, 110, 0.28); | |
| transform: scale(0.98); | |
| } | |
| .btn-tonal .material-symbols-rounded { | |
| font-size: 20px; | |
| } | |
| /* ββ Notifications Panel ββ */ | |
| .notifications-panel { | |
| position: fixed ; | |
| top: 65px ; | |
| right: 60px ; | |
| width: 320px; | |
| background: var(--glass-panel-bg); | |
| backdrop-filter: blur(16px); | |
| -webkit-backdrop-filter: blur(16px); | |
| border: 1px solid var(--md-outline); | |
| border-radius: var(--md-corner-lg); | |
| box-shadow: var(--glass-panel-shadow); | |
| z-index: 9999 ; | |
| display: flex; | |
| flex-direction: column; | |
| } | |
| /* ββ Sidebar Structural Subcomponents ββ */ | |
| .sidebar-header { | |
| display: flex; | |
| align-items: center; | |
| justify-content: space-between; | |
| padding: var(--s4) var(--s4) var(--s3) var(--s4); | |
| border-bottom: 1px solid var(--md-outline); | |
| } | |
| .sidebar-logo { | |
| display: flex; | |
| align-items: center; | |
| } | |
| .sidebar-content { | |
| flex: 1; | |
| overflow-y: auto; | |
| overflow-x: hidden; | |
| padding: var(--s3) 0; | |
| scrollbar-width: thin; | |
| scrollbar-color: var(--md-outline) transparent; | |
| } | |
| .nav-section { | |
| margin-bottom: var(--s4); | |
| } | |
| .nav-section-title { | |
| font-size: 0.65rem; | |
| font-weight: 700; | |
| text-transform: uppercase; | |
| letter-spacing: 0.1em; | |
| color: var(--md-on-surface-muted); | |
| padding: 0 var(--s4) var(--s1) var(--s4); | |
| margin: 0; | |
| } | |
| .nav-label { | |
| flex: 1; | |
| text-align: left; | |
| font-size: var(--md-label-large); | |
| font-weight: 500; | |
| color: inherit; | |
| } | |
| /* ββ Header Structural Layout ββ */ | |
| .header-top { | |
| display: flex; | |
| align-items: center; | |
| gap: var(--s4); | |
| width: 100%; | |
| height: 100%; | |
| } | |
| .header-left { | |
| display: flex; | |
| align-items: center; | |
| gap: var(--s3); | |
| flex-shrink: 1; | |
| /* Fixed overflow */ | |
| } | |
| .header-center { | |
| flex: 1; | |
| display: flex; | |
| align-items: center; | |
| justify-content: flex-start; | |
| min-width: 0; | |
| } | |
| .header-right { | |
| display: flex; | |
| align-items: center; | |
| gap: var(--s2); | |
| flex-shrink: 1; | |
| /* Fixed overflow */ | |
| } | |
| .header-brand-name { | |
| font-size: 1.1rem; | |
| font-weight: 700; | |
| color: var(--md-primary); | |
| margin: 0; | |
| line-height: 1.2; | |
| } | |
| .header-product-tag { | |
| font-size: 0.65rem; | |
| font-weight: 500; | |
| text-transform: uppercase; | |
| letter-spacing: 0.08em; | |
| color: var(--md-on-surface-muted); | |
| } | |
| .nav-toggle-icon { | |
| display: none; | |
| align-items: center; | |
| justify-content: center; | |
| width: 40px; | |
| height: 40px; | |
| border-radius: var(--md-corner-sm); | |
| border: none; | |
| background: transparent; | |
| color: var(--md-on-surface-muted); | |
| cursor: pointer; | |
| transition: background var(--md-duration-short) var(--md-easing); | |
| } | |
| .nav-toggle-icon:hover { | |
| background: var(--md-surface-dim); | |
| } | |
| /* Show toggle on mobile */ | |
| @media (max-width: 860px) { | |
| .nav-toggle-icon { | |
| display: flex; | |
| } | |
| } | |
| /* ββ Breadcrumb ββ */ | |
| .breadcrumb-list { | |
| display: flex; | |
| align-items: center; | |
| gap: var(--s1); | |
| list-style: none; | |
| margin: 0; | |
| padding: 0; | |
| } | |
| .breadcrumb-link { | |
| font-size: var(--md-label-medium); | |
| color: var(--md-on-surface-muted); | |
| text-decoration: none; | |
| transition: color var(--md-duration-short) var(--md-easing); | |
| } | |
| .breadcrumb-link:hover { | |
| color: var(--md-primary); | |
| } | |
| .breadcrumb-link.active { | |
| color: var(--md-on-bg); | |
| font-weight: 600; | |
| pointer-events: none; | |
| } | |
| .breadcrumb-separator { | |
| font-size: 0.75rem; | |
| color: var(--md-outline); | |
| user-select: none; | |
| } | |
| /* ββ Header Icon Buttons ββ */ | |
| .header-icon-btn { | |
| display: flex; | |
| align-items: center; | |
| justify-content: center; | |
| width: 36px; | |
| height: 36px; | |
| border-radius: var(--md-corner-sm); | |
| border: none; | |
| background: transparent; | |
| color: var(--md-on-surface-muted); | |
| cursor: pointer; | |
| transition: background var(--md-duration-short) var(--md-easing), | |
| color var(--md-duration-short) var(--md-easing); | |
| flex-shrink: 1; | |
| /* Fixed overflow */ | |
| } | |
| .header-icon-btn:hover { | |
| background: var(--md-surface-dim); | |
| color: var(--md-on-bg); | |
| } | |
| /* ββ User Menu Button ββ */ | |
| .user-menu-btn { | |
| display: flex; | |
| align-items: center; | |
| gap: var(--s2); | |
| padding: var(--s1) var(--s2); | |
| border-radius: var(--md-corner-full); | |
| border: 1px solid var(--md-outline); | |
| background: var(--md-surface-2); | |
| color: var(--md-on-bg); | |
| cursor: pointer; | |
| font-size: var(--md-label-medium); | |
| transition: all var(--md-duration-short) var(--md-easing); | |
| } | |
| .user-menu-btn:hover { | |
| background: var(--md-surface-dim); | |
| border-color: var(--md-primary-light); | |
| } | |
| .user-display-name { | |
| font-weight: 500; | |
| max-width: 100px; | |
| overflow: hidden; | |
| text-overflow: ellipsis; | |
| white-space: nowrap; | |
| } | |
| @media (max-width: 640px) { | |
| .user-display-name { | |
| display: none; | |
| } | |
| } | |
| .dropdown-chevron { | |
| font-size: 18px ; | |
| color: var(--md-on-surface-muted); | |
| transition: transform var(--md-duration-short) var(--md-easing); | |
| } | |
| [aria-expanded="true"] .dropdown-chevron { | |
| transform: rotate(180deg); | |
| } | |
| /* ββ User Menu Dropdown ββ */ | |
| .user-menu-dropdown { | |
| position: fixed ; | |
| top: 65px ; | |
| right: 20px ; | |
| min-width: 240px; | |
| background: var(--glass-panel-bg); | |
| backdrop-filter: blur(16px); | |
| -webkit-backdrop-filter: blur(16px); | |
| border: 1px solid var(--md-outline); | |
| border-radius: var(--md-corner-lg); | |
| box-shadow: var(--glass-panel-shadow); | |
| z-index: 9999 ; | |
| overflow: hidden; | |
| } | |
| .user-menu-header { | |
| display: flex; | |
| align-items: flex-start; | |
| justify-content: space-between; | |
| padding: var(--s4); | |
| gap: var(--s3); | |
| } | |
| .user-menu-header .user-name { | |
| font-size: var(--md-body-medium); | |
| font-weight: 600; | |
| color: var(--md-on-bg); | |
| margin: 0; | |
| } | |
| .user-menu-header .user-email { | |
| font-size: var(--md-label-small); | |
| color: var(--md-on-surface-muted); | |
| margin: 0; | |
| } | |
| .user-status { | |
| display: flex; | |
| align-items: center; | |
| gap: var(--s1); | |
| font-size: var(--md-label-small); | |
| color: var(--md-success, #4ade80); | |
| background: rgba(74, 222, 128, 0.1); | |
| padding: var(--s1) var(--s2); | |
| border-radius: var(--md-corner-full); | |
| white-space: nowrap; | |
| } | |
| .user-menu-list { | |
| list-style: none; | |
| margin: 0; | |
| padding: var(--s1) 0; | |
| } | |
| .user-menu-link { | |
| display: flex; | |
| align-items: center; | |
| gap: var(--s3); | |
| padding: var(--s2) var(--s4); | |
| font-size: var(--md-body-medium); | |
| color: var(--md-on-bg); | |
| text-decoration: none; | |
| cursor: pointer; | |
| width: 100%; | |
| border: none; | |
| background: transparent; | |
| text-align: left; | |
| transition: background var(--md-duration-short) var(--md-easing); | |
| } | |
| .user-menu-link:hover { | |
| background: var(--md-surface-dim); | |
| } | |
| .user-menu-link.logout-link { | |
| color: var(--md-error); | |
| padding: var(--s3) var(--s4); | |
| } | |
| .user-menu-link.logout-link:hover { | |
| background: rgba(239, 68, 68, 0.08); | |
| } | |
| .user-menu-container { | |
| position: relative; | |
| } | |
| /* ββ Notification Badge ββ */ | |
| .notification-badge { | |
| position: absolute; | |
| top: 4px; | |
| right: 4px; | |
| width: 16px; | |
| height: 16px; | |
| border-radius: 50%; | |
| background: var(--md-error); | |
| color: #fff; | |
| font-size: 0.6rem; | |
| font-weight: 700; | |
| display: flex; | |
| align-items: center; | |
| justify-content: center; | |
| pointer-events: none; | |
| } | |
| .notifications-container { | |
| position: relative; | |
| } | |
| .notifications-panel { | |
| position: absolute; | |
| top: calc(100% + var(--s2)); | |
| right: 0; | |
| width: 320px; | |
| background: var(--glass-panel-bg); | |
| backdrop-filter: blur(16px); | |
| -webkit-backdrop-filter: blur(16px); | |
| border: 1px solid var(--md-outline); | |
| border-radius: var(--md-corner-lg); | |
| box-shadow: var(--glass-panel-shadow); | |
| z-index: var(--z-dropdown); | |
| overflow: hidden; | |
| animation: dropdownSlideIn var(--md-duration-medium) var(--md-easing); | |
| } | |
| .panel-header { | |
| display: flex; | |
| align-items: center; | |
| justify-content: space-between; | |
| padding: var(--s3) var(--s4); | |
| border-bottom: 1px solid var(--md-outline); | |
| } | |
| .panel-header h3 { | |
| font-size: var(--md-title-small); | |
| font-weight: 600; | |
| color: var(--md-on-bg); | |
| margin: 0; | |
| } | |
| .panel-close-btn { | |
| display: flex; | |
| align-items: center; | |
| justify-content: center; | |
| width: 28px; | |
| height: 28px; | |
| border: none; | |
| border-radius: var(--md-corner-sm); | |
| background: transparent; | |
| color: var(--md-on-surface-muted); | |
| cursor: pointer; | |
| transition: background var(--md-duration-short) var(--md-easing); | |
| } | |
| .panel-close-btn:hover { | |
| background: var(--md-surface-dim); | |
| } | |
| .notification-item { | |
| display: flex; | |
| align-items: flex-start; | |
| gap: var(--s3); | |
| padding: var(--s3) var(--s4); | |
| border-bottom: 1px solid var(--md-outline); | |
| transition: background var(--md-duration-short) var(--md-easing); | |
| } | |
| .notification-item:hover { | |
| background: var(--md-surface-dim); | |
| } | |
| .notification-item:last-child { | |
| border-bottom: none; | |
| } | |
| .notification-icon { | |
| font-size: 1rem; | |
| width: 28px; | |
| height: 28px; | |
| border-radius: 50%; | |
| display: flex; | |
| align-items: center; | |
| justify-content: center; | |
| flex-shrink: 1; | |
| /* Fixed overflow */ | |
| } | |
| .notification-icon.alert { | |
| background: rgba(245, 158, 11, 0.15); | |
| color: #f59e0b; | |
| } | |
| .notification-icon.success { | |
| background: rgba(74, 222, 128, 0.15); | |
| color: #4ade80; | |
| } | |
| .notification-title { | |
| font-size: var(--md-body-medium); | |
| font-weight: 500; | |
| color: var(--md-on-bg); | |
| margin: 0 0 var(--s1) 0; | |
| } | |
| .notification-time { | |
| font-size: var(--md-label-small); | |
| color: var(--md-on-surface-muted); | |
| margin: 0; | |
| } | |
| .panel-footer { | |
| padding: var(--s3) var(--s4); | |
| text-align: center; | |
| border-top: 1px solid var(--md-outline); | |
| } | |
| .view-all-link { | |
| font-size: var(--md-label-medium); | |
| color: var(--md-primary); | |
| text-decoration: none; | |
| font-weight: 500; | |
| } | |
| .view-all-link:hover { | |
| text-decoration: underline; | |
| } | |
| /* ββ Nav Link Danger (Logout in sidebar) ββ */ | |
| .nav-link.danger { | |
| color: var(--md-error) ; | |
| } | |
| .nav-link.danger:hover { | |
| background: rgba(239, 68, 68, 0.08) ; | |
| } | |
| /* ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |
| RESPONSIVE NAVIGATION & LAYOUT | |
| Psychology: Adapt navigation to device while maintaining mental model | |
| Desktop: Sidebar always visible = minimal context switching | |
| Mobile: Hamburger menu = space-efficient, gesture-friendly | |
| ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ */ | |
| /* ββ Tablet & Medium Viewport: 641px β 860px βββββββββββββββββββββββββββ */ | |
| @media (max-width: 860px) { | |
| /* Hide desktop sidebar, show hamburger toggle */ | |
| .app-sidebar { | |
| transform: translateX(-100%); | |
| z-index: var(--z-sidebar-overlay); | |
| } | |
| .nav-toggle-btn { | |
| display: flex; | |
| z-index: var(--z-nav-toggle); | |
| } | |
| .header-menu-btn { | |
| display: flex; | |
| z-index: var(--z-nav-toggle); | |
| } | |
| .sidebar-close { | |
| display: flex; | |
| z-index: var(--z-nav-toggle); | |
| } | |
| /* Container minus sidebar when not visible */ | |
| .app-container { | |
| margin-left: 0 ; | |
| width: 100% ; | |
| padding-top: 110px; | |
| } | |
| /* Hide breadcrumbs on mobile for space efficiency */ | |
| .breadcrumb { | |
| display: none; | |
| } | |
| /* Reduce header padding on smaller screens */ | |
| .app-header { | |
| gap: var(--s3); | |
| padding: var(--s3) var(--s4); | |
| min-height: 60px; | |
| } | |
| .app-title-group h1 { | |
| font-size: 1.25rem; | |
| } | |
| .app-logo { | |
| width: 40px; | |
| height: 40px; | |
| } | |
| /* Content wrapper adaptive padding */ | |
| .app-content-wrapper { | |
| padding: var(--s6) var(--s4); | |
| } | |
| } | |
| /* Mobile: β€ 640px β Single Column, Hamburger Menu βββββββββββββββββββββ */ | |
| @media (max-width: 640px) { | |
| /* Sidebar mobile behavior */ | |
| .app-sidebar { | |
| width: 100%; | |
| max-width: none ; | |
| } | |
| .sidebar-backdrop[aria-hidden="false"], | |
| .sidebar-backdrop:not([hidden]) { | |
| display: block; | |
| } | |
| /* Header compact on mobile */ | |
| .app-header { | |
| gap: var(--s2); | |
| padding: var(--s2) var(--s3); | |
| min-height: 56px; | |
| } | |
| .app-title-group h1 { | |
| font-size: 1.125rem; | |
| gap: var(--s1); | |
| } | |
| .app-title-group { | |
| overflow: hidden; | |
| white-space: nowrap; | |
| text-overflow: ellipsis; | |
| } | |
| .app-tagline { | |
| display: none; | |
| } | |
| .header-badge { | |
| padding: 1px 4px; | |
| font-size: 0.6rem; | |
| } | |
| .app-logo { | |
| width: 36px; | |
| height: 36px; | |
| } | |
| .app-logo .material-symbols-rounded { | |
| font-size: 1.25rem; | |
| } | |
| /* Content wrapper on mobile */ | |
| .app-content-wrapper { | |
| padding: var(--s5) var(--s3); | |
| gap: var(--s6); | |
| max-width: 100%; | |
| } | |
| /* Reduce gaps on mobile */ | |
| .main-content-card { | |
| border-radius: var(--md-corner-lg); | |
| } | |
| /* Mobile-friendly tab navigation */ | |
| .tab-navigation { | |
| padding: 0 var(--s2); | |
| gap: 0; | |
| overflow-x: auto; | |
| -webkit-overflow-scrolling: touch; | |
| } | |
| .nav-tab { | |
| padding: var(--s2) var(--s3); | |
| font-size: var(--md-label-medium); | |
| white-space: nowrap; | |
| flex-shrink: 1; | |
| /* Fixed overflow */ | |
| } | |
| /* Mobile button sizing */ | |
| .btn-primary, | |
| .btn-secondary { | |
| min-height: 40px; | |
| padding: var(--s2) var(--s4); | |
| font-size: var(--md-label-large); | |
| } | |
| .dashboard-actions { | |
| flex-direction: column ; | |
| gap: var(--s3) ; | |
| } | |
| .dashboard-actions button { | |
| width: 100% ; | |
| } | |
| /* Stats grid mobile optimization */ | |
| .stats-grid { | |
| grid-template-columns: 1fr; | |
| gap: var(--s3); | |
| } | |
| .stat-card { | |
| min-height: 110px; | |
| padding: var(--s4) var(--s3); | |
| } | |
| .stat-value { | |
| font-size: 1.75rem; | |
| } | |
| /* Form optimization */ | |
| .form-group { | |
| margin-bottom: var(--s3); | |
| } | |
| .form-group input, | |
| .form-group textarea { | |
| font-size: 16px; | |
| /* Prevents zoom on iOS focus */ | |
| min-height: 40px; | |
| padding: var(--s2) var(--s3); | |
| } | |
| .auth-container { | |
| max-width: 100%; | |
| padding: var(--s5) var(--s4); | |
| border-radius: var(--md-corner-lg); | |
| } | |
| .auth-container h2 { | |
| font-size: var(--md-title-large); | |
| } | |
| /* Dropzone mobile */ | |
| .upload-dropzone { | |
| padding: var(--s6) var(--s4); | |
| } | |
| .dropzone-text, | |
| .dropzone-hint { | |
| font-size: var(--md-label-medium); | |
| } | |
| /* KPI row mobile */ | |
| .kpi-row { | |
| grid-template-columns: 1fr; | |
| gap: var(--s3); | |
| } | |
| .kpi-card { | |
| padding: var(--s4) var(--s3); | |
| } | |
| /* Visualization grid mobile */ | |
| .viz-grid { | |
| grid-template-columns: 1fr; | |
| gap: var(--s3); | |
| } | |
| .viz-card { | |
| border-radius: var(--md-corner-lg); | |
| } | |
| } | |
| /* ββ Small Phones: < 400px β Compressed Layout ββββββββββββββββββββββββββ */ | |
| @media (max-width: 400px) { | |
| .app-header { | |
| gap: var(--s1); | |
| padding: var(--s2) var(--s2); | |
| min-height: 52px; | |
| } | |
| .app-title-group h1 { | |
| font-size: var(--md-body-large); | |
| } | |
| .app-logo { | |
| width: 32px; | |
| height: 32px; | |
| } | |
| .app-content-wrapper { | |
| padding: var(--s4) var(--s2); | |
| gap: var(--s4); | |
| } | |
| .main-content-card { | |
| border-radius: var(--md-corner-md); | |
| } | |
| /* Reduce all spacing on tiny screens */ | |
| .auth-container { | |
| padding: var(--s4) var(--s3); | |
| } | |
| .auth-container h2 { | |
| font-size: 1.125rem; | |
| margin-bottom: var(--s3); | |
| } | |
| .form-group { | |
| margin-bottom: var(--s2); | |
| } | |
| .stat-card { | |
| min-height: 100px; | |
| padding: var(--s3) var(--s2); | |
| } | |
| .stat-value { | |
| font-size: 1.5rem; | |
| } | |
| .stat-card h3 { | |
| font-size: 0.75rem; | |
| } | |
| .nav-tab { | |
| padding: var(--s1) var(--s2); | |
| font-size: 0.7rem; | |
| } | |
| .nav-tab .material-symbols-rounded { | |
| font-size: var(--md-body-large); | |
| } | |
| .tab-navigation { | |
| padding: 0 var(--s1); | |
| } | |
| } | |
| /* ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |
| RESPONSIVE DESIGN β MD3 Adaptive Breakpoints | |
| Desktop (>860px) β Tablet (641-860px) β Mobile (β€640px) β Small <400px | |
| ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ */ | |
| /* Tablet / Medium Viewport: 641β860px */ | |
| @media (max-width: 860px) { | |
| .auth-page { | |
| padding: var(--s5); | |
| } | |
| .auth-container { | |
| max-width: 100%; | |
| padding: var(--s6) var(--s5); | |
| } | |
| .dashboard-header { | |
| flex-direction: column; | |
| align-items: flex-start; | |
| gap: var(--s3); | |
| } | |
| .stats-grid { | |
| grid-template-columns: repeat(2, 1fr); | |
| } | |
| } | |
| /* Mobile: β€640px β Optimized single column */ | |
| @media (max-width: 640px) { | |
| .auth-page { | |
| padding: var(--s4); | |
| min-height: auto; | |
| } | |
| .auth-container { | |
| padding: var(--s6) var(--s4); | |
| max-width: 100%; | |
| border-radius: var(--md-corner-lg); | |
| } | |
| .auth-container h2 { | |
| font-size: 1.25rem; | |
| margin-bottom: var(--s3); | |
| } | |
| .auth-container .form-subtitle { | |
| font-size: 0.8125rem; | |
| margin-bottom: var(--s5); | |
| } | |
| .form-group { | |
| margin-bottom: var(--s4); | |
| gap: var(--s2); | |
| } | |
| .form-group label { | |
| font-size: 0.8125rem; | |
| font-weight: 700; | |
| } | |
| .form-group input[type="text"], | |
| .form-group input[type="email"], | |
| .form-group input[type="password"], | |
| .form-group textarea { | |
| font-size: 16px; | |
| padding: var(--s4) var(--s4); | |
| min-height: 44px; | |
| } | |
| .form-group.checkbox { | |
| gap: var(--s3); | |
| margin: var(--s4) 0; | |
| } | |
| .form-group.checkbox input[type="checkbox"] { | |
| width: 20px; | |
| height: 20px; | |
| min-width: 20px; | |
| } | |
| .error-msg { | |
| font-size: 0.75rem; | |
| padding: var(--s3) var(--s4); | |
| } | |
| .auth-container input[type="submit"], | |
| .auth-container .btn-primary { | |
| min-height: 44px; | |
| } | |
| .auth-footer { | |
| margin-top: var(--s6); | |
| font-size: 0.8125rem; | |
| } | |
| .dash-page { | |
| padding: var(--s4); | |
| } | |
| .dashboard { | |
| padding: var(--s4); | |
| } | |
| .dashboard-header { | |
| margin-bottom: var(--s6); | |
| padding-bottom: var(--s4); | |
| gap: var(--s3); | |
| } | |
| .dashboard-header h2 { | |
| font-size: 1.25rem; | |
| } | |
| .stats-grid { | |
| grid-template-columns: 1fr; | |
| gap: var(--s4); | |
| } | |
| .stat-card { | |
| padding: var(--s5) var(--s4); | |
| min-height: 130px; | |
| } | |
| .stat-card h3 { | |
| font-size: 0.75rem; | |
| margin-bottom: var(--s3); | |
| letter-spacing: 0.12em; | |
| } | |
| .stat-value { | |
| font-size: 2rem; | |
| } | |
| } | |
| /* Small Phone: <400px β Compressed responsive layout */ | |
| @media (max-width: 400px) { | |
| .auth-page { | |
| padding: var(--s3); | |
| } | |
| .auth-container { | |
| padding: var(--s5) var(--s3); | |
| border-radius: var(--md-corner-md); | |
| } | |
| .auth-container h2 { | |
| font-size: 1.125rem; | |
| margin-bottom: var(--s2); | |
| } | |
| .auth-container .form-subtitle { | |
| font-size: 0.75rem; | |
| margin-bottom: var(--s4); | |
| } | |
| .form-group { | |
| margin-bottom: var(--s3); | |
| } | |
| .form-group label { | |
| font-size: 0.75rem; | |
| font-weight: 700; | |
| } | |
| .form-group input[type="text"], | |
| .form-group input[type="email"], | |
| .form-group input[type="password"] { | |
| font-size: 16px; | |
| padding: var(--s3) var(--s3); | |
| } | |
| .form-group.checkbox input[type="checkbox"] { | |
| width: 18px; | |
| height: 18px; | |
| } | |
| .form-group.checkbox label { | |
| font-size: 0.8125rem; | |
| } | |
| .error-msg { | |
| font-size: 0.75rem; | |
| padding: var(--s2) var(--s3); | |
| } | |
| .auth-footer { | |
| margin-top: var(--s5); | |
| font-size: 0.75rem; | |
| } | |
| .dash-page { | |
| padding: var(--s3); | |
| } | |
| .dashboard { | |
| padding: var(--s3); | |
| } | |
| .dashboard-header { | |
| margin-bottom: var(--s5); | |
| padding-bottom: var(--s3); | |
| } | |
| .dashboard-header h2 { | |
| font-size: 1.125rem; | |
| } | |
| .stat-card { | |
| padding: var(--s4) var(--s3); | |
| min-height: 120px; | |
| } | |
| .stat-card h3 { | |
| font-size: 0.7rem; | |
| margin-bottom: var(--s2); | |
| } | |
| .stat-value { | |
| font-size: 1.5rem; | |
| } | |
| } | |
| /* ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |
| ACCESSIBILITY & THEME SETTINGS | |
| Follows ARIA 1.2 authoring practices & Material Design 3 patterns | |
| ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ */ | |
| .header-actions { | |
| display: flex; | |
| align-items: center; | |
| gap: var(--s3); | |
| margin-left: auto; | |
| } | |
| /* Accessibility Menu Container */ | |
| .accessibility-menu { | |
| position: relative; | |
| } | |
| /* Theme Dropdown Container */ | |
| .theme-dropdown { | |
| position: absolute; | |
| top: calc(100% + 8px); | |
| right: 0; | |
| width: 240px; | |
| background: var(--md-surface); | |
| border: 1px solid var(--md-outline); | |
| border-radius: var(--md-corner-md); | |
| box-shadow: 0 8px 24px rgba(0, 0, 0, 0.4); | |
| z-index: 1000; | |
| overflow: hidden; | |
| display: flex; | |
| flex-direction: column; | |
| animation: dropdownSlideIn var(--md-duration-medium) var(--md-easing); | |
| } | |
| .theme-dropdown[hidden] { | |
| display: none; | |
| } | |
| @keyframes dropdownSlideIn { | |
| from { | |
| opacity: 0; | |
| transform: translateY(-8px); | |
| } | |
| to { | |
| opacity: 1; | |
| transform: translateY(0); | |
| } | |
| } | |
| /* Dropdown Header */ | |
| .dropdown-header { | |
| display: flex; | |
| align-items: center; | |
| gap: var(--s3); | |
| padding: var(--s4); | |
| color: var(--md-on-surface); | |
| } | |
| .dropdown-header .material-symbols-rounded { | |
| font-size: 1.25rem; | |
| color: var(--md-primary); | |
| } | |
| .dropdown-title { | |
| font-size: 0.875rem; | |
| font-weight: 600; | |
| margin: 0; | |
| text-transform: uppercase; | |
| letter-spacing: 0.5px; | |
| color: var(--md-on-surface-muted); | |
| } | |
| /* Dropdown Divider */ | |
| .dropdown-divider { | |
| height: 1px; | |
| background: var(--md-outline); | |
| margin: var(--s2) 0; | |
| /* Dropdown spacing: consistent with menus */ | |
| } | |
| /* Dropdown Content */ | |
| .dropdown-content { | |
| display: flex; | |
| flex-direction: column; | |
| padding: var(--s2) 0; | |
| } | |
| /* Theme Option Buttons */ | |
| .theme-option { | |
| display: flex; | |
| align-items: center; | |
| gap: var(--s3); | |
| width: 100%; | |
| padding: var(--s3) var(--s4); | |
| background: transparent; | |
| border: none; | |
| color: var(--md-on-surface); | |
| cursor: pointer; | |
| transition: all var(--md-duration-short) var(--md-easing); | |
| text-align: left; | |
| position: relative; | |
| } | |
| .theme-option:hover { | |
| background: var(--md-primary-container); | |
| color: var(--md-primary); | |
| } | |
| .theme-option:focus { | |
| outline: 2px solid var(--md-primary); | |
| outline-offset: -2px; | |
| } | |
| .theme-option.active { | |
| background: var(--md-primary-container); | |
| color: var(--md-primary); | |
| font-weight: 600; | |
| } | |
| .theme-option .material-symbols-rounded { | |
| font-size: 1.25rem; | |
| flex-shrink: 1; | |
| /* Fixed overflow */ | |
| } | |
| .option-label { | |
| flex: 1; | |
| font-size: 0.875rem; | |
| font-weight: 500; | |
| } | |
| .option-checkmark { | |
| color: var(--md-primary); | |
| font-weight: bold; | |
| font-size: var(--md-body-large); | |
| opacity: 0; | |
| transition: opacity var(--md-duration-short) var(--md-easing); | |
| } | |
| .theme-option.active .option-checkmark { | |
| opacity: 1; | |
| } | |
| /* Dropdown Footer */ | |
| .dropdown-footer { | |
| padding: var(--s3) var(--s4); | |
| border-top: 1px solid var(--md-outline); | |
| background: rgba(15, 118, 110, 0.05); | |
| } | |
| .accessibility-info { | |
| font-size: 0.75rem; | |
| color: var(--md-on-surface-muted); | |
| margin: 0; | |
| line-height: 1.4; | |
| } | |
| .accessibility-info kbd { | |
| background: var(--md-primary-container); | |
| color: var(--md-primary); | |
| padding: 2px 6px; | |
| border-radius: var(--md-corner-xs); | |
| font-family: 'Monaco', 'Courier New', monospace; | |
| font-size: 0.65rem; | |
| font-weight: 600; | |
| display: inline-block; | |
| margin: 0 2px; | |
| } | |
| /* Light Theme Styles */ | |
| html[data-theme="light"] { | |
| --md-bg: #F8FAFC; | |
| --md-surface: #FFFFFF; | |
| --md-surface-2: #F1F5F9; | |
| --md-surface-3: #E2E8F0; | |
| --md-surface-dim: #E2E8F0; | |
| --md-outline: rgba(51, 65, 85, 0.12); | |
| --md-outline-variant: rgba(51, 65, 85, 0.08); | |
| --md-on-bg: #0F172A; | |
| --md-on-surface: #1E293B; | |
| --md-on-surface-muted: #526373; | |
| --md-on-surface-faint: #75859E; | |
| --md-on-surface-variant: #64748B; | |
| /* Elevation β light mode softer shadows */ | |
| --md-elevation-1: 0 1px 3px rgba(0, 0, 0, 0.08), 0 1px 2px rgba(0, 0, 0, 0.06); | |
| --md-elevation-2: 0 4px 8px rgba(0, 0, 0, 0.08), 0 2px 4px rgba(0, 0, 0, 0.05); | |
| --md-elevation-3: 0 8px 24px rgba(0, 0, 0, 0.10), 0 4px 8px rgba(0, 0, 0, 0.06); | |
| /* Glass / Panel tokens for light mode */ | |
| --glass-header-bg: rgba(255, 255, 255, 0.85); | |
| --glass-header-border: rgba(15, 23, 42, 0.08); | |
| --glass-nav-bg: rgba(241, 245, 249, 0.90); | |
| --glass-nav-border: rgba(15, 23, 42, 0.10); | |
| --glass-panel-bg: rgba(255, 255, 255, 0.98); | |
| --glass-panel-shadow: 0 8px 32px rgba(0, 0, 0, 0.12); | |
| --glass-overlay-bg: rgba(255, 255, 255, 0.85); | |
| --glass-sidebar-bg: rgba(248, 250, 251, 0.98); | |
| --glass-modal-bg: rgba(255, 255, 255, 0.80); | |
| --glass-auth-bg: rgba(255, 255, 255, 0.75); | |
| } | |
| /* Dropdown elevation in light theme */ | |
| html[data-theme="light"] .theme-dropdown { | |
| box-shadow: 0 8px 24px rgba(0, 0, 0, 0.12); | |
| } | |
| /* Accessibility - High Contrast Enhancements */ | |
| @media (prefers-contrast: more) { | |
| .header-icon-btn { | |
| border: 1px solid var(--md-outline); | |
| } | |
| .header-icon-btn:hover { | |
| border-color: var(--md-primary); | |
| } | |
| .theme-option { | |
| border: 1px solid transparent; | |
| } | |
| .theme-option.active { | |
| border: 1px solid var(--md-primary); | |
| } | |
| .theme-dropdown { | |
| border: 1.5px solid var(--md-outline); | |
| } | |
| } | |
| /* Accessibility - Reduced Motion */ | |
| @media (prefers-reduced-motion: reduce) { | |
| .theme-dropdown, | |
| .header-icon-btn, | |
| .theme-option { | |
| animation: none ; | |
| transition: none ; | |
| } | |
| @keyframes dropdownSlideIn { | |
| from { | |
| opacity: 1; | |
| transform: translateY(0); | |
| } | |
| to { | |
| opacity: 1; | |
| transform: translateY(0); | |
| } | |
| } | |
| } | |
| /* Responsive - Mobile adjustments */ | |
| @media (max-width: 640px) { | |
| .theme-dropdown { | |
| position: fixed; | |
| top: 50%; | |
| left: 50%; | |
| right: auto; | |
| width: 280px; | |
| transform: translate(-50%, -50%); | |
| max-height: 80vh; | |
| overflow-y: auto; | |
| } | |
| .header-actions { | |
| gap: var(--s2); | |
| } | |
| } | |
| /* ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |
| MODALS & STATUS INDICATORS | |
| System Status Modal, Auth Page, Status Indicators with Dynamic Content | |
| ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ */ | |
| /* Auth Page - Integrated with header/footer */ | |
| .auth-page { | |
| display: flex; | |
| align-items: center; | |
| justify-content: center; | |
| padding: var(--s8); | |
| min-height: calc(100vh - 280px); | |
| position: relative; | |
| overflow: hidden; | |
| } | |
| .auth-page[hidden] { | |
| display: none; | |
| } | |
| .auth-page-content { | |
| position: relative; | |
| z-index: 10; | |
| } | |
| /* System Status Indicator Button - Footer */ | |
| .system-status-btn { | |
| display: flex; | |
| align-items: center; | |
| gap: var(--s2); | |
| padding: var(--s2) var(--s3); | |
| background: var(--md-surface-2); | |
| border: 1px solid var(--md-outline); | |
| border-radius: var(--md-corner-md); | |
| color: var(--md-on-surface); | |
| cursor: pointer; | |
| transition: all var(--md-duration-short) var(--md-easing); | |
| font-size: var(--md-label-small); | |
| font-weight: 600; | |
| } | |
| .system-status-btn:hover { | |
| background: var(--md-primary-container); | |
| border-color: var(--md-primary); | |
| color: var(--md-primary); | |
| } | |
| .system-status-btn:focus-visible { | |
| outline: 2px solid var(--md-primary); | |
| outline-offset: 2px; | |
| } | |
| /* Three Status Indicator Dots (Newbie-Friendly) */ | |
| .status-indicator-dots { | |
| display: flex; | |
| gap: var(--s1); | |
| align-items: center; | |
| } | |
| .status-dot { | |
| width: 12px; | |
| height: 12px; | |
| border-radius: 50%; | |
| transition: all var(--md-duration-short) var(--md-easing); | |
| box-shadow: 0 0 4px currentColor; | |
| background: var(--md-outline); | |
| animation: none; | |
| } | |
| .status-dot.success { | |
| background: var(--md-success); | |
| box-shadow: none; | |
| animation: none; | |
| } | |
| .status-dot.warning { | |
| background: var(--md-warning); | |
| box-shadow: none; | |
| animation: pulse-warning 1.5s ease-in-out infinite; | |
| } | |
| .status-dot.error { | |
| background: var(--md-error); | |
| box-shadow: none; | |
| animation: none; | |
| } | |
| /* System Status Modal β Smooth fade-in/out with no layout shift */ | |
| .system-status-modal { | |
| position: fixed; | |
| top: 0; | |
| left: 0; | |
| right: 0; | |
| bottom: 0; | |
| display: flex ; | |
| align-items: center; | |
| justify-content: center; | |
| z-index: 2000; | |
| padding: var(--s4); | |
| opacity: 0; | |
| pointer-events: none; | |
| transition: opacity 0.3s ease-out, | |
| pointer-events 0.3s ease-out; | |
| } | |
| .system-status-modal[hidden] { | |
| opacity: 0; | |
| pointer-events: none; | |
| } | |
| .system-status-modal:not([hidden]) { | |
| opacity: 1; | |
| pointer-events: auto; | |
| } | |
| .status-modal-overlay { | |
| position: absolute; | |
| top: 0; | |
| left: 0; | |
| right: 0; | |
| bottom: 0; | |
| background: rgba(0, 0, 0, 0.6); | |
| backdrop-filter: blur(var(--blur-light)); | |
| -webkit-backdrop-filter: blur(var(--blur-light)); | |
| cursor: pointer; | |
| } | |
| .status-modal-content { | |
| position: relative; | |
| background: var(--md-surface); | |
| border: 1px solid var(--md-outline); | |
| border-radius: var(--md-corner-xl); | |
| box-shadow: var(--md-elevation-5); | |
| max-width: 600px; | |
| width: 100%; | |
| max-height: 90vh; | |
| overflow: auto; | |
| animation: modalSlideIn var(--md-duration-medium) var(--md-easing); | |
| } | |
| @keyframes modalSlideIn { | |
| from { | |
| opacity: 0; | |
| transform: translateY(-40px) scale(0.95); | |
| } | |
| to { | |
| opacity: 1; | |
| transform: translateY(0) scale(1); | |
| } | |
| } | |
| .status-modal-header { | |
| display: flex; | |
| align-items: center; | |
| justify-content: space-between; | |
| padding: var(--s6); | |
| border-bottom: 1px solid var(--md-outline); | |
| } | |
| .status-modal-header h2 { | |
| margin: 0; | |
| font-size: var(--md-title-large); | |
| color: var(--md-on-surface); | |
| } | |
| .status-modal-close { | |
| display: flex; | |
| align-items: center; | |
| justify-content: center; | |
| width: 40px; | |
| height: 40px; | |
| background: transparent; | |
| border: none; | |
| color: var(--md-on-surface); | |
| cursor: pointer; | |
| border-radius: 50%; | |
| transition: all var(--md-duration-short) var(--md-easing); | |
| padding: 0; | |
| font-size: 24px; | |
| } | |
| .status-modal-close:hover { | |
| background: var(--md-surface-container); | |
| color: var(--md-primary); | |
| } | |
| .status-modal-body { | |
| padding: var(--s6); | |
| } | |
| .status-grid { | |
| display: grid; | |
| grid-template-columns: 1fr 1fr; | |
| gap: var(--s5); | |
| } | |
| .status-item-full-width { | |
| grid-column: 1 / -1; | |
| } | |
| .status-item { | |
| display: flex; | |
| flex-direction: column; | |
| gap: var(--s2); | |
| padding: var(--s4); | |
| background: var(--md-surface-2); | |
| border: 1px solid var(--md-outline); | |
| border-radius: var(--md-corner-md); | |
| transition: all var(--md-duration-short) var(--md-easing); | |
| min-height: 80px; | |
| justify-content: space-between; | |
| } | |
| .status-item:hover { | |
| background: var(--md-surface-container); | |
| border-color: var(--md-primary); | |
| } | |
| .status-item-label { | |
| font-size: var(--md-label-small); | |
| font-weight: 600; | |
| color: var(--md-on-surface-muted); | |
| text-transform: uppercase; | |
| letter-spacing: 0.5px; | |
| } | |
| .status-item-value { | |
| font-size: var(--md-body-medium); | |
| font-weight: 600; | |
| color: var(--md-on-surface-muted); | |
| font-family: 'Monaco', 'Courier New', monospace; | |
| display: flex; | |
| align-items: center; | |
| gap: var(--s1); | |
| } | |
| .status-item-value.success { | |
| color: var(--md-success); | |
| } | |
| .status-item-value.warning { | |
| color: var(--md-warning); | |
| } | |
| .status-item-value.error { | |
| color: var(--md-error); | |
| } | |
| .status-item-value.prod { | |
| display: inline-block; | |
| padding: 2px 6px; | |
| background: var(--md-success-bg); | |
| color: var(--md-success); | |
| border-radius: var(--md-corner-hair); | |
| font-size: var(--md-label-small); | |
| font-family: inherit; | |
| } | |
| /* Responsive: Tablet */ | |
| @media (max-width: 768px) { | |
| .status-grid { | |
| grid-template-columns: 1fr; | |
| } | |
| .status-modal-content { | |
| max-width: 100%; | |
| border-radius: var(--md-corner-lg); | |
| } | |
| .status-item { | |
| flex-direction: row; | |
| align-items: center; | |
| justify-content: space-between; | |
| padding: var(--s3); | |
| min-height: auto; | |
| } | |
| .status-item-label { | |
| flex: 0 0 45%; | |
| } | |
| .status-item-value { | |
| flex: 0 0 55%; | |
| text-align: right; | |
| } | |
| .status-item-full-width { | |
| grid-column: 1 / -1; | |
| flex-direction: column; | |
| align-items: flex-start; | |
| justify-content: flex-start; | |
| } | |
| .status-item-full-width .status-item-label { | |
| flex: 1 0 auto; | |
| } | |
| .status-item-full-width .status-item-value { | |
| flex: 1 0 auto; | |
| text-align: left; | |
| margin-top: var(--s2); | |
| } | |
| } | |
| /* Responsive: Mobile */ | |
| @media (max-width: 480px) { | |
| .status-modal-header { | |
| padding: var(--s4); | |
| } | |
| .status-modal-body { | |
| padding: var(--s4); | |
| } | |
| .status-grid { | |
| gap: var(--s3); | |
| } | |
| .status-item { | |
| padding: var(--s3); | |
| } | |
| .status-item-label { | |
| font-size: 11px; | |
| } | |
| .status-item-value { | |
| font-size: 13px; | |
| } | |
| .status-item-full-width { | |
| flex-direction: column; | |
| align-items: flex-start; | |
| padding: var(--s4); | |
| } | |
| } | |
| /* Accessibility: Reduced Motion */ | |
| @media (prefers-reduced-motion: reduce) { | |
| .status-dot, | |
| .system-status-btn, | |
| .status-item { | |
| animation: none ; | |
| transition: none ; | |
| } | |
| } | |
| /* POLICY CONTENT (Privacy/Terms modals) */ | |
| .policy-content { | |
| padding: var(--s8); | |
| overflow-y: auto; | |
| max-height: calc(90vh - 120px); | |
| } | |
| .policy-content p { | |
| font-size: var(--md-body-medium); | |
| color: var(--md-on-surface); | |
| margin: 0 0 var(--s4) 0; | |
| line-height: 1.6; | |
| padding: 0; | |
| } | |
| .policy-content p:last-child { | |
| margin-bottom: 0; | |
| } | |
| .policy-content h4 { | |
| font-size: var(--md-title-small); | |
| font-weight: 600; | |
| color: var(--md-on-surface); | |
| margin: var(--s6) 0 var(--s3) 0; | |
| padding: 0; | |
| line-height: 1.4; | |
| } | |
| .policy-content h4:first-child { | |
| margin-top: 0; | |
| } | |
| @media (max-width: 768px) { | |
| .policy-content { | |
| padding: var(--s6); | |
| max-height: calc(95vh - 100px); | |
| } | |
| .policy-content h4 { | |
| margin: var(--s5) 0 var(--s2) 0; | |
| } | |
| .policy-content p { | |
| margin: 0 0 var(--s3) 0; | |
| } | |
| } | |
| @media (max-width: 480px) { | |
| .policy-content { | |
| padding: var(--s4); | |
| } | |
| .policy-content h4 { | |
| font-size: var(--md-body-large); | |
| margin: var(--s4) 0 var(--s2) 0; | |
| } | |
| } | |
| .main-content-card { | |
| margin: 0 auto ; | |
| width: 100% ; | |
| max-width: 1400px ; | |
| } | |
| /* Hard disable Sidebar */ | |
| .app-sidebar, | |
| #app-sidebar, | |
| #nav-toggle-btn, | |
| .sidebar-backdrop { | |
| display: none ; | |
| } | |
| /* Tab & Panel Fix (Stop Unmounting) */ | |
| .content-panel { | |
| display: none; | |
| margin-top: 10px; | |
| animation: fadeIn 0.3s ease; | |
| } | |
| .content-panel.active { | |
| display: block ; | |
| } | |
| /* Master Notification overriding */ | |
| [hidden], | |
| .notifications-panel[hidden] { | |
| display: none ; | |
| } | |
| /* ββ Elite glassmorphism MD3 Top Navbar ββ */ | |
| .glass-nav { | |
| display: flex; | |
| justify-content: center; | |
| align-items: center; | |
| } | |
| .glass-nav.top-nav { | |
| display: flex; | |
| gap: var(--s2); | |
| background: var(--glass-nav-bg); | |
| backdrop-filter: blur(12px); | |
| -webkit-backdrop-filter: blur(12px); | |
| border: 1px solid var(--glass-nav-border); | |
| box-shadow: var(--md-elevation-2); | |
| border-radius: var(--md-corner-full); | |
| padding: 6px; | |
| position: sticky; | |
| top: 10px; | |
| z-index: 1000; | |
| } | |
| /* .top-nav-link canonical definition below β see PHASE 3 block */ | |
| @media (max-width: 768px) { | |
| .glass-nav.top-nav { | |
| display: none; | |
| flex-direction: column; | |
| position: absolute; | |
| top: 60px; | |
| left: 10px; | |
| right: 10px; | |
| border-radius: 12px; | |
| padding: 10px; | |
| } | |
| .glass-nav.top-nav.mobile-active { | |
| display: flex ; | |
| } | |
| } | |
| /* βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |
| PHASE 3: ENTERPRISE UI/UX STRUCTURAL HARMONIZATION | |
| βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ */ | |
| /* 1. Global Viewport Scaling (Fixing Mobile Compression on Desktop) */ | |
| .app-container, | |
| body:has([hidden]) .app-container { | |
| margin-left: 0 ; | |
| padding-left: 0 ; | |
| width: 100% ; | |
| max-width: none ; | |
| } | |
| .main-content-card { | |
| margin: 0 auto ; | |
| width: 100% ; | |
| max-width: 1400px ; | |
| } | |
| /* 2. Top-Nav ONLY Constraints */ | |
| .app-sidebar, | |
| #app-sidebar, | |
| #nav-toggle-btn, | |
| .sidebar-backdrop { | |
| display: none ; | |
| visibility: hidden ; | |
| width: 0 ; | |
| } | |
| /* 4. Glassmorphism Aesthetics & Typography */ | |
| .glass-nav { | |
| display: flex; | |
| justify-content: center; | |
| align-items: center; | |
| } | |
| .glass-nav.top-nav { | |
| display: flex; | |
| gap: var(--s2); | |
| background: var(--glass-nav-bg); | |
| backdrop-filter: blur(16px); | |
| -webkit-backdrop-filter: blur(16px); | |
| border: 1px solid var(--glass-nav-border); | |
| box-shadow: var(--md-elevation-2); | |
| border-radius: var(--md-corner-full); | |
| padding: 6px; | |
| position: sticky; | |
| top: 10px; | |
| z-index: 1000; | |
| } | |
| /* ββ Top Nav Link β MD3 design methodology (canonical) ββ */ | |
| .top-nav-link { | |
| display: flex; | |
| align-items: center; | |
| gap: var(--s2); | |
| padding: var(--s2) var(--s4); | |
| border-radius: var(--md-corner-full); | |
| color: var(--md-on-surface-muted); | |
| font-family: inherit; | |
| font-weight: 500; | |
| font-size: 0.875rem; | |
| text-decoration: none; | |
| transition: | |
| color var(--md-duration-short) var(--md-easing), | |
| background var(--md-duration-short) var(--md-easing), | |
| box-shadow var(--md-duration-short) var(--md-easing); | |
| position: relative; | |
| white-space: nowrap; | |
| } | |
| /* MD3 state-layer ripple */ | |
| .top-nav-link::after { | |
| content: ''; | |
| position: absolute; | |
| inset: 0; | |
| border-radius: var(--md-corner-full); | |
| background: var(--md-primary); | |
| opacity: 0; | |
| transition: opacity var(--md-duration-short) var(--md-easing); | |
| pointer-events: none; | |
| } | |
| .top-nav-link .material-symbols-rounded { | |
| font-size: 1.1rem; | |
| } | |
| .top-nav-link:hover { | |
| color: var(--md-on-surface); | |
| } | |
| .top-nav-link:hover::after { | |
| opacity: 0.06; | |
| } | |
| /* Active page: primary-container bg + primary-light text β no glow, matches .nav-tab.active pattern */ | |
| .top-nav-link.active { | |
| color: var(--md-primary-light); | |
| background: var(--md-primary-container); | |
| font-weight: 600; | |
| } | |
| /* Notification & Toast Silencer */ | |
| [hidden], | |
| .notifications-panel[hidden] { | |
| display: none ; | |
| } | |
| @media (max-width: 768px) { | |
| .glass-nav.top-nav { | |
| display: none; | |
| flex-direction: column; | |
| position: absolute; | |
| top: 60px; | |
| left: 10px; | |
| right: 10px; | |
| border-radius: 12px; | |
| padding: 10px; | |
| } | |
| .glass-nav.top-nav.mobile-active { | |
| display: flex ; | |
| } | |
| } | |
| /* 5. Hyper-Specific Desktop Layout Overrides */ | |
| #page-audit-main:not([hidden]), | |
| #page-dashboard:not([hidden]) { | |
| width: 100% ; | |
| max-width: 1400px ; | |
| margin: 0 auto ; | |
| } | |
| /* Ensure parents of the main card scale fully out */ | |
| .app-container, | |
| body:has([hidden]) .app-container { | |
| align-items: stretch ; | |
| } | |
| /* 6. Tablet Overflow Prevention */ | |
| .header-top .header-search { | |
| flex-shrink: 1 ; | |
| min-width: 0 ; | |
| width: 100% ; | |
| } | |
| .header-top { | |
| flex-wrap: wrap ; | |
| overflow: hidden ; | |
| } | |
| /* 7. Audit Dashboard Responsive Layout */ | |
| .audit-container { | |
| width: 100%; | |
| max-width: 1200px; | |
| margin: 0 auto; | |
| padding: 24px; | |
| display: flex; | |
| flex-direction: column; | |
| } | |
| @media (min-width: 768px) { | |
| .audit-container { | |
| flex-direction: row; | |
| gap: 32px; | |
| } | |
| } | |
| /* ββ CSP Compliance: Inline-style replacements ββββββββββββββββββββββββββββββ */ | |
| /* These replace JS .style.* assignments in script.js to satisfy strict CSP. */ | |
| /* HITL undo toast internal elements */ | |
| .hitl-toast-msg { | |
| flex: 1; | |
| } | |
| .hitl-toast-timer { | |
| font-size: 0.75rem; | |
| color: var(--md-on-surface-muted); | |
| font-weight: 600; | |
| min-width: 40px; | |
| text-align: right; | |
| } | |
| .hitl-toast-undo-btn { | |
| padding: var(--s2) var(--s3); | |
| font-size: 0.75rem; | |
| white-space: nowrap; | |
| margin-left: var(--s2); | |
| } | |
| /* Global search result panel */ | |
| .search-results-loading { | |
| padding: var(--s4); | |
| text-align: center; | |
| color: var(--md-on-surface-variant); | |
| } | |
| .search-suggest-wrapper { | |
| padding: var(--s3); | |
| } | |
| .search-suggest-label { | |
| font-size: var(--font-size-xs); | |
| color: var(--md-on-surface-variant); | |
| margin: 0 0 var(--s2) 0; | |
| } | |
| .search-suggest-item { | |
| cursor: pointer; | |
| padding: var(--s2); | |
| border-radius: 8px; | |
| background: var(--md-surface-2); | |
| margin-bottom: var(--s1); | |
| color: var(--md-on-surface); | |
| transition: background var(--md-duration-short) ease; | |
| } | |
| .search-suggest-item:hover { | |
| background: var(--md-surface-3); | |
| } | |
| /* JS-toggled opacity states (replaces .style.opacity assignments) */ | |
| .opacity-50 { | |
| opacity: 0.5; | |
| } | |
| .opacity-70 { | |
| opacity: 0.7; | |
| } | |
| /* ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |
| GLOBAL PAGE LAYOUT β Extracted from Knowledge Base Reference | |
| ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ */ | |
| .page-header-content { | |
| padding: var(--s6) var(--s8); | |
| border-bottom: 1px solid var(--md-outline); | |
| display: flex; | |
| align-items: center; | |
| gap: var(--s6); | |
| background: var(--md-surface-1); | |
| } | |
| .page-title { | |
| margin: 0; | |
| font-size: 1.75rem; | |
| font-weight: 800; | |
| color: var(--md-on-bg); | |
| letter-spacing: -0.02em; | |
| } | |
| /* Tab-navigation and nav-tab unified β see primary definition above */ | |
| /* ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |
| KNOWLEDGE BASE PAGE | |
| ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ */ | |
| .kb-page-icon { | |
| font-size: 2rem; | |
| color: var(--md-primary); | |
| } | |
| .kb-header { | |
| display: flex; | |
| justify-content: space-between; | |
| align-items: center; | |
| margin-bottom: 2rem; | |
| flex-wrap: wrap; | |
| gap: var(--s4); | |
| } | |
| .kb-title-group { | |
| display: flex; | |
| align-items: center; | |
| gap: var(--s4); | |
| } | |
| .kb-subtitle { | |
| color: var(--md-on-surface-muted); | |
| font-size: 0.9rem; | |
| margin-top: 0.25rem; | |
| } | |
| .kb-upload-section { | |
| margin-bottom: 2rem; | |
| } | |
| .upload-card { | |
| background: var(--md-surface-2); | |
| border: 1px solid var(--md-outline); | |
| border-radius: var(--md-corner-xl); | |
| padding: var(--s6); | |
| } | |
| .upload-card-header { | |
| display: flex; | |
| justify-content: space-between; | |
| align-items: center; | |
| margin-bottom: var(--s4); | |
| } | |
| .upload-card-header h3 { | |
| margin: 0; | |
| font-size: 1.1rem; | |
| } | |
| .close-btn { | |
| background: var(--md-surface-3); | |
| border: none; | |
| border-radius: 50%; | |
| width: 32px; | |
| height: 32px; | |
| display: flex; | |
| align-items: center; | |
| justify-content: center; | |
| cursor: pointer; | |
| color: var(--md-on-surface-muted); | |
| transition: all var(--md-duration-short) var(--md-easing); | |
| } | |
| .close-btn:hover { | |
| background: var(--md-outline); | |
| color: var(--md-on-surface); | |
| } | |
| .documents-header { | |
| display: flex; | |
| justify-content: space-between; | |
| align-items: center; | |
| margin-bottom: var(--s6); | |
| } | |
| .documents-header h3 { | |
| margin: 0; | |
| font-size: 1.2rem; | |
| } | |
| .documents-stats { | |
| color: var(--md-on-surface-muted); | |
| font-size: 0.9rem; | |
| } | |
| .documents-grid { | |
| display: grid; | |
| grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); | |
| gap: var(--s6); | |
| } | |
| .doc-card { | |
| background: var(--md-surface-2); | |
| border: 1px solid var(--md-outline); | |
| border-radius: var(--md-corner-lg); | |
| padding: var(--s6); | |
| transition: | |
| border-color var(--md-duration-short) var(--md-easing), | |
| box-shadow var(--md-duration-short) var(--md-easing), | |
| transform var(--md-duration-short) var(--md-easing); | |
| cursor: pointer; | |
| position: relative; | |
| overflow: hidden; | |
| } | |
| /* Doc card 3px top-bar accent β matching audit kpi-card pattern */ | |
| .doc-card::before { | |
| content: ''; | |
| position: absolute; | |
| inset: 0 0 auto 0; | |
| height: 3px; | |
| background: var(--md-outline); | |
| transition: background var(--md-duration-medium) var(--md-easing); | |
| } | |
| .doc-card:hover { | |
| border-color: var(--md-primary); | |
| transform: translateY(-2px); | |
| box-shadow: var(--md-elevation-2); | |
| } | |
| .doc-card:hover::before { | |
| background: var(--md-primary); | |
| } | |
| .doc-card-header { | |
| display: flex; | |
| align-items: flex-start; | |
| gap: var(--s4); | |
| margin-bottom: var(--s4); | |
| } | |
| .doc-icon { | |
| font-size: 2.5rem; | |
| color: var(--md-primary); | |
| } | |
| .doc-info { | |
| flex: 1; | |
| } | |
| .doc-name { | |
| font-weight: 600; | |
| margin: 0 0 0.25rem 0; | |
| word-break: break-word; | |
| } | |
| .doc-meta { | |
| display: flex; | |
| flex-direction: column; | |
| gap: 0.25rem; | |
| font-size: 0.85rem; | |
| color: var(--md-on-surface-muted); | |
| } | |
| .doc-status { | |
| display: inline-flex; | |
| align-items: center; | |
| gap: 0.25rem; | |
| padding: 0.25rem 0.75rem; | |
| border-radius: var(--md-corner-full); | |
| font-size: 0.75rem; | |
| font-weight: 600; | |
| text-transform: uppercase; | |
| letter-spacing: 0.05em; | |
| } | |
| .doc-status.indexed { | |
| background: var(--md-success-bg); | |
| color: var(--md-success); | |
| } | |
| .doc-status.indexing { | |
| background: rgba(59, 130, 246, 0.15); | |
| color: #93c5fd; | |
| } | |
| .doc-status.failed { | |
| background: var(--md-error-bg); | |
| color: var(--md-error); | |
| } | |
| .doc-actions { | |
| display: flex; | |
| gap: var(--s2); | |
| margin-top: var(--s4); | |
| padding-top: var(--s4); | |
| border-top: 1px solid var(--md-outline); | |
| } | |
| .doc-action-btn { | |
| flex: 1; | |
| display: flex; | |
| align-items: center; | |
| justify-content: center; | |
| gap: var(--s2); | |
| padding: var(--s2); | |
| background: var(--md-surface-3); | |
| border: 1px solid var(--md-outline); | |
| border-radius: var(--md-corner-md); | |
| color: var(--md-on-surface-muted); | |
| cursor: pointer; | |
| transition: all var(--md-duration-short) var(--md-easing); | |
| font-size: 0.85rem; | |
| } | |
| .doc-action-btn:hover { | |
| background: var(--md-surface-2); | |
| border-color: var(--md-primary); | |
| color: var(--md-primary-light); | |
| } | |
| /* Knowledge Base Specific Styles */ | |
| /* nav-tab.active unified β see primary definition above */ | |
| .upload-dropzone.drag-over { | |
| border-color: var(--md-primary-light); | |
| background: var(--md-primary-container); | |
| transform: scale(1.02); | |
| } | |
| .file-chip { | |
| background: var(--md-surface-3); | |
| border: 1px solid var(--md-outline); | |
| border-radius: var(--md-corner-sm); | |
| padding: 8px 12px; | |
| display: flex; | |
| align-items: center; | |
| gap: 8px; | |
| animation: slideInUp 0.3s var(--md-easing); | |
| } | |
| .file-name { | |
| flex: 1; | |
| font-size: 0.9rem; | |
| color: var(--md-on-surface); | |
| white-space: nowrap; | |
| overflow: hidden; | |
| text-overflow: ellipsis; | |
| } | |
| .chip-remove { | |
| background: none; | |
| border: none; | |
| color: var(--md-on-surface-faint); | |
| cursor: pointer; | |
| font-size: 1.2rem; | |
| line-height: 1; | |
| padding: 0 4px; | |
| } | |
| .chip-remove:hover { | |
| color: var(--md-error); | |
| } | |
| .doc-card { | |
| background: var(--md-surface); | |
| border: 1px solid var(--md-outline); | |
| border-radius: var(--md-corner-lg); | |
| padding: 16px; | |
| transition: | |
| border-color var(--md-duration-short) var(--md-easing), | |
| box-shadow var(--md-duration-short) var(--md-easing), | |
| transform var(--md-duration-short) var(--md-easing); | |
| display: flex; | |
| flex-direction: column; | |
| gap: 12px; | |
| position: relative; | |
| overflow: hidden; | |
| } | |
| .doc-card:hover { | |
| transform: translateY(-2px); | |
| border-color: var(--md-primary); | |
| box-shadow: var(--md-elevation-2); | |
| } | |
| .doc-card.indexing { | |
| border-color: var(--md-primary-light); | |
| } | |
| .doc-card.failed { | |
| border-color: var(--md-error-light); | |
| } | |
| .doc-card-header { | |
| display: flex; | |
| gap: 12px; | |
| align-items: center; | |
| } | |
| .doc-icon { | |
| color: var(--md-primary-light); | |
| font-size: 1.5rem; | |
| width: 1.5rem; | |
| height: 1.5rem; | |
| line-height: 1; | |
| display: inline-flex; | |
| align-items: center; | |
| justify-content: center; | |
| flex-shrink: 0; | |
| } | |
| .doc-info { | |
| flex: 1; | |
| } | |
| .doc-name { | |
| font-size: 1rem; | |
| font-weight: 600; | |
| margin: 0; | |
| color: var(--md-on-surface); | |
| } | |
| .doc-meta { | |
| font-size: 0.8rem; | |
| color: var(--md-on-surface-faint); | |
| display: flex; | |
| gap: 12px; | |
| margin-top: 4px; | |
| } | |
| .doc-status { | |
| display: flex; | |
| align-items: center; | |
| gap: 6px; | |
| font-size: 0.85rem; | |
| padding: 4px 10px; | |
| border-radius: var(--md-corner-full); | |
| width: fit-content; | |
| } | |
| .doc-status.indexed { | |
| background: var(--md-success-bg); | |
| color: var(--md-success-light); | |
| } | |
| .doc-status.indexing, | |
| .doc-status.pending { | |
| background: var(--md-primary-container); | |
| color: var(--md-primary-light); | |
| } | |
| .doc-status.failed { | |
| background: var(--md-error-bg); | |
| color: var(--md-error-light); | |
| } | |
| .doc-status-details { | |
| margin-top: 4px; | |
| padding: 10px 12px; | |
| border-radius: var(--md-corner-sm); | |
| border: 1px solid var(--md-outline); | |
| background: color-mix(in srgb, var(--md-surface-2) 86%, transparent); | |
| display: flex; | |
| flex-direction: column; | |
| gap: 6px; | |
| } | |
| .doc-status-details p { | |
| margin: 0; | |
| font-size: 0.82rem; | |
| color: var(--md-on-surface-muted); | |
| line-height: 1.35; | |
| } | |
| .doc-status-details strong { | |
| color: var(--md-on-surface); | |
| font-weight: 600; | |
| } | |
| .rotate { | |
| animation: rotate 2s linear infinite; | |
| } | |
| @keyframes rotate { | |
| from { | |
| transform: rotate(0deg); | |
| } | |
| to { | |
| transform: rotate(360deg); | |
| } | |
| } | |
| .doc-actions { | |
| display: flex; | |
| gap: 8px; | |
| margin-top: auto; | |
| } | |
| .doc-action-btn { | |
| padding: 6px 12px; | |
| border-radius: var(--md-corner-sm); | |
| font-size: 0.8rem; | |
| font-weight: 600; | |
| cursor: pointer; | |
| transition: all 0.2s; | |
| background: var(--md-surface-2); | |
| border: 1px solid var(--md-outline); | |
| color: var(--md-on-surface); | |
| } | |
| .doc-action-btn:hover { | |
| background: var(--md-surface-3); | |
| } | |
| .doc-action-btn.delete-btn { | |
| margin-left: auto; | |
| color: var(--md-error-light); | |
| border-color: rgba(220, 38, 38, 0.2); | |
| } | |
| .doc-action-btn.delete-btn:hover { | |
| background: var(--md-error-bg); | |
| } | |
| /* ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |
| AGENT PROFILES MODULE β Modern, Performant, MD3-Compliant | |
| ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ */ | |
| .agents-header { | |
| display: flex; | |
| justify-content: space-between; | |
| align-items: center; | |
| margin-bottom: var(--s6); | |
| flex-wrap: wrap; | |
| gap: var(--s4); | |
| } | |
| .agents-title-group { | |
| display: flex; | |
| align-items: center; | |
| gap: var(--s4); | |
| } | |
| .agents-controls { | |
| display: flex; | |
| align-items: center; | |
| gap: var(--s3); | |
| flex-wrap: wrap; | |
| } | |
| .agents-search-wrapper { | |
| position: relative; | |
| max-width: 300px; | |
| } | |
| .agents-search-wrapper .material-symbols-rounded { | |
| position: absolute; | |
| left: var(--s3); | |
| top: 50%; | |
| transform: translateY(-50%); | |
| color: var(--md-on-surface-muted); | |
| } | |
| .agent-search-input { | |
| padding: var(--s2) var(--s4) var(--s2) var(--s10); | |
| background: var(--md-surface-2); | |
| border: 1px solid var(--md-outline); | |
| border-radius: var(--md-corner-full); | |
| color: var(--md-on-surface); | |
| font-size: 0.875rem; | |
| width: 100%; | |
| transition: all var(--md-duration-short) var(--md-easing); | |
| } | |
| .agent-search-input:focus { | |
| outline: none; | |
| border-color: var(--md-primary); | |
| background: var(--md-surface); | |
| box-shadow: 0 0 0 3px var(--md-primary-container); | |
| } | |
| .agents-stats-bar { | |
| display: flex; | |
| gap: var(--s4); | |
| flex-wrap: wrap; | |
| } | |
| .stat-pill { | |
| background: var(--md-surface-dim); | |
| border: 1px solid var(--md-outline-variant); | |
| border-radius: var(--md-corner-full); | |
| padding: var(--s2) var(--s4); | |
| display: flex; | |
| align-items: center; | |
| gap: var(--s2); | |
| font-size: 0.85rem; | |
| } | |
| .stat-pill-label { | |
| color: var(--md-on-surface-muted); | |
| font-weight: 500; | |
| } | |
| .stat-pill-value { | |
| color: var(--md-on-surface); | |
| font-weight: 700; | |
| } | |
| .stat-improving { | |
| color: var(--md-success-light) ; | |
| } | |
| .stat-declining { | |
| color: var(--md-error-light) ; | |
| } | |
| /* ββ Agents Grid ββ */ | |
| .agents-grid { | |
| display: grid; | |
| grid-template-columns: repeat(auto-fill, minmax(280px, 1fr)); | |
| gap: var(--s6); | |
| } | |
| .agent-card { | |
| background: var(--md-surface); | |
| border: 1px solid var(--md-outline); | |
| border-radius: var(--md-corner-lg); | |
| padding: var(--s6); | |
| transition: all var(--md-duration-short) var(--md-easing); | |
| cursor: pointer; | |
| position: relative; | |
| overflow: hidden; | |
| } | |
| .agent-card:hover { | |
| transform: translateY(-2px); | |
| border-color: var(--md-primary); | |
| box-shadow: var(--md-elevation-2); | |
| } | |
| .agent-card-header { | |
| display: flex; | |
| align-items: center; | |
| gap: var(--s4); | |
| margin-bottom: var(--s4); | |
| } | |
| .agent-avatar { | |
| width: 48px; | |
| height: 48px; | |
| border-radius: var(--md-corner-md); | |
| background: var(--md-primary-container); | |
| display: flex; | |
| align-items: center; | |
| justify-content: center; | |
| font-size: 1.5rem; | |
| color: var(--md-primary-light); | |
| } | |
| .agent-name { | |
| font-size: 1.1rem; | |
| font-weight: 700; | |
| color: var(--md-on-surface); | |
| margin: 0; | |
| } | |
| .agent-meta { | |
| font-size: 0.8rem; | |
| color: var(--md-on-surface-faint); | |
| } | |
| .agent-stats { | |
| display: flex; | |
| flex-direction: column; | |
| gap: var(--s3); | |
| margin-top: var(--s4); | |
| } | |
| .agent-stat-row { | |
| display: flex; | |
| justify-content: space-between; | |
| align-items: center; | |
| } | |
| .agent-stat-label { | |
| font-size: 0.8rem; | |
| color: var(--md-on-surface-muted); | |
| } | |
| .agent-stat-value { | |
| font-size: 0.9rem; | |
| font-weight: 600; | |
| } | |
| /* ββ Detail View ββ */ | |
| .detail-header { | |
| display: flex; | |
| flex-direction: column; | |
| align-items: stretch; | |
| margin-bottom: var(--s8); | |
| gap: var(--s4); | |
| width: 100%; | |
| } | |
| /* Keep agent info flexible and allow text truncation when space is limited */ | |
| .detail-agent-info { | |
| display: flex; | |
| align-items: center; | |
| gap: var(--s6); | |
| min-width: 0; /* allow this block to shrink */ | |
| } | |
| .detail-agent-info > div { | |
| min-width: 0; | |
| overflow: hidden; | |
| } | |
| .detail-agent-name { | |
| white-space: nowrap; | |
| overflow: hidden; | |
| text-overflow: ellipsis; | |
| margin: 0; | |
| } | |
| /* Actions row below the agent info: keep buttons inline on one line */ | |
| .detail-actions { | |
| display: flex; | |
| gap: var(--s3); | |
| justify-content: flex-end; | |
| align-items: center; | |
| } | |
| .detail-actions .btn-primary, | |
| .detail-actions .btn-secondary { | |
| width: auto; | |
| min-width: 96px; | |
| padding: var(--s2) var(--s4); | |
| } | |
| .back-to-list-btn { | |
| padding: var(--s2) var(--s4); | |
| display: inline-flex; | |
| align-items: center; | |
| gap: var(--s2); | |
| font-size: 0.875rem; | |
| } | |
| /* Mobile fallback: allow wrapping and stack the actions on narrow screens */ | |
| @media (max-width: 640px) { | |
| .detail-header { | |
| gap: var(--s3); | |
| } | |
| .detail-actions { | |
| justify-content: flex-start; | |
| flex-wrap: wrap; | |
| } | |
| .detail-actions .btn-primary, | |
| .detail-actions .btn-secondary { | |
| flex: 0 1 48%; | |
| } | |
| } | |
| .detail-agent-avatar { | |
| width: 80px; | |
| height: 80px; | |
| font-size: 2.5rem; | |
| } | |
| /* Mobile fallback: allow wrapping on narrow screens so layout doesn't overflow */ | |
| @media (max-width: 640px) { | |
| .detail-header { | |
| flex-wrap: wrap; | |
| align-items: flex-start; | |
| gap: var(--s3); | |
| } | |
| .detail-agent-info { | |
| width: 100%; | |
| order: 1; | |
| } | |
| .detail-header .back-to-list-btn, | |
| .detail-header #reindex-agent-btn { | |
| order: 2; | |
| width: auto; | |
| } | |
| .detail-agent-name { | |
| white-space: normal; | |
| text-overflow: initial; | |
| } | |
| } | |
| .detail-agent-name { | |
| font-size: 2rem; | |
| font-weight: 800; | |
| margin: 0; | |
| color: var(--md-on-bg); | |
| } | |
| .agent-stats-grid { | |
| display: grid; | |
| grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); | |
| gap: var(--s4); | |
| margin-bottom: var(--s8); | |
| } | |
| .detail-stat-card { | |
| background: var(--md-surface-2); | |
| border: 1px solid var(--md-outline); | |
| border-radius: var(--md-corner-lg); | |
| padding: var(--s5); | |
| display: flex; | |
| align-items: center; | |
| gap: var(--s4); | |
| position: relative; | |
| overflow: hidden; | |
| transition: | |
| border-color var(--md-duration-short) var(--md-easing), | |
| box-shadow var(--md-duration-short) var(--md-easing), | |
| transform var(--md-duration-short) var(--md-easing); | |
| } | |
| /* Detail stat card 3px top-bar accent β same pattern as kpi-card */ | |
| .detail-stat-card::before { | |
| content: ''; | |
| position: absolute; | |
| inset: 0 0 auto 0; | |
| height: 3px; | |
| background: var(--md-primary); | |
| opacity: 0.4; | |
| transition: opacity var(--md-duration-medium) var(--md-easing); | |
| } | |
| .detail-stat-card:hover::before { | |
| opacity: 1; | |
| } | |
| /* Alias: HTML uses detail-stats-grid, CSS defines agent-stats-grid */ | |
| .detail-stats-grid { | |
| display: grid; | |
| grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); | |
| gap: var(--s4); | |
| margin-bottom: var(--s8); | |
| } | |
| .detail-stat-icon { | |
| width: 42px; | |
| height: 42px; | |
| border-radius: var(--md-corner-md); | |
| background: var(--md-primary-container); | |
| display: flex; | |
| align-items: center; | |
| justify-content: center; | |
| color: var(--md-primary-light); | |
| flex-shrink: 0; | |
| transition: all var(--md-duration-short) var(--md-easing); | |
| } | |
| /* Alias: HTML uses agent-avatar-large, CSS only had detail-agent-avatar */ | |
| .agent-avatar-large { | |
| width: 72px; | |
| height: 72px; | |
| border-radius: var(--md-corner-lg); | |
| background: var(--md-primary-container); | |
| border: 2px solid rgba(15, 118, 110, 0.3); | |
| display: flex; | |
| align-items: center; | |
| justify-content: center; | |
| color: var(--md-primary-light); | |
| flex-shrink: 0; | |
| } | |
| .agent-avatar-large .material-symbols-rounded { | |
| font-size: 2.5rem; | |
| } | |
| .detail-stat-label { | |
| font-size: 0.75rem; | |
| font-weight: 700; | |
| text-transform: uppercase; | |
| color: var(--md-on-surface-muted); | |
| } | |
| .detail-stat-value { | |
| font-size: 1.5rem; | |
| font-weight: 800; | |
| color: var(--md-on-bg); | |
| } | |
| .detail-charts-grid { | |
| display: grid; | |
| grid-template-columns: 3fr 2fr; | |
| gap: var(--s6); | |
| margin-bottom: var(--s8); | |
| } | |
| .chart-card { | |
| background: var(--md-surface); | |
| border: 1px solid var(--md-outline); | |
| border-radius: var(--md-corner-lg); | |
| padding: var(--s6); | |
| min-height: 400px; | |
| position: relative; | |
| overflow: hidden; | |
| transition: | |
| border-color var(--md-duration-short) var(--md-easing), | |
| box-shadow var(--md-duration-short) var(--md-easing), | |
| transform var(--md-duration-short) var(--md-easing); | |
| } | |
| /* chart-card h3 uses viz-card-header design pattern */ | |
| .chart-card h3 { | |
| font-size: 0.75rem; | |
| font-weight: 700; | |
| color: var(--md-on-surface-muted); | |
| text-transform: uppercase; | |
| letter-spacing: 0.07em; | |
| margin: 0 0 var(--s4) 0; | |
| padding-bottom: var(--s3); | |
| border-bottom: 1px solid var(--md-outline-variant); | |
| display: flex; | |
| align-items: center; | |
| gap: var(--s2); | |
| } | |
| .score-history-table { | |
| background: var(--md-surface); | |
| border: 1px solid var(--md-outline); | |
| border-radius: var(--md-corner-lg); | |
| overflow: hidden; | |
| } | |
| .audit-history-table { | |
| width: 100%; | |
| border-collapse: collapse; | |
| } | |
| .audit-history-table th { | |
| text-align: left; | |
| padding: var(--s4); | |
| background: var(--md-surface-2); | |
| font-size: 0.75rem; | |
| text-transform: uppercase; | |
| color: var(--md-on-surface-muted); | |
| font-weight: 700; | |
| } | |
| .audit-history-table td { | |
| padding: var(--s4); | |
| border-bottom: 1px solid var(--md-outline-variant); | |
| font-size: 0.875rem; | |
| } | |
| .audit-history-table tr:last-child td { | |
| border-bottom: none; | |
| } | |
| .audit-history-table tr:hover { | |
| background: rgba(15, 118, 110, 0.04); | |
| } | |
| @media (max-width: 1024px) { | |
| .detail-charts-grid { | |
| grid-template-columns: 1fr; | |
| } | |
| } | |
| /* ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |
| DESIGN ALIGNMENT β KB Design Language Applied Globally | |
| Hover lift, border-color shift, shadow elevation β consistent with KB | |
| ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ */ | |
| /* ββ Dashboard: Activity Feed Items ββ */ | |
| .activity-item, | |
| .activity-item, | |
| .audit-activity-item { | |
| background: var(--md-surface-2); | |
| border: 1px solid var(--md-outline); | |
| border-radius: var(--md-corner-lg); | |
| padding: var(--s4) var(--s5); | |
| display: flex; | |
| align-items: center; | |
| gap: var(--s4); | |
| transition: all var(--md-duration-short) var(--md-easing); | |
| cursor: default; | |
| position: relative; | |
| overflow: hidden; | |
| width: 100%; | |
| } | |
| .activity-item:hover, | |
| .audit-activity-item:hover { | |
| transform: translateY(-2px); | |
| border-color: var(--md-primary); | |
| box-shadow: var(--md-elevation-2); | |
| background: var(--md-surface-3); | |
| } | |
| .activity-item .activity-icon, | |
| .audit-activity-item .activity-icon { | |
| width: 36px; | |
| height: 36px; | |
| min-width: 36px; | |
| border-radius: var(--md-corner-md); | |
| background: var(--md-primary-container); | |
| display: flex; | |
| align-items: center; | |
| justify-content: center; | |
| color: var(--md-primary-light); | |
| font-size: 1.1rem; | |
| transition: background var(--md-duration-short) var(--md-easing); | |
| } | |
| .activity-item:hover .activity-icon, | |
| .audit-activity-item:hover .activity-icon { | |
| background: var(--md-primary); | |
| color: var(--md-on-primary); | |
| } | |
| .activity-item .activity-title, | |
| .audit-activity-item .activity-label { | |
| font-size: var(--md-body-medium); | |
| font-weight: 600; | |
| color: var(--md-on-surface); | |
| margin: 0 0 var(--s1) 0; | |
| } | |
| .activity-item .activity-meta, | |
| .audit-activity-item .activity-time, | |
| .audit-activity-item .activity-score { | |
| font-size: var(--md-label-small); | |
| color: var(--md-on-surface-muted); | |
| } | |
| /* ββ Notification Panel: Item Hover ββ */ | |
| .notification-item { | |
| display: flex; | |
| align-items: center; | |
| gap: var(--s3); | |
| padding: var(--s3) var(--s4); | |
| transition: background var(--md-duration-short) var(--md-easing), | |
| border-left-color var(--md-duration-short) var(--md-easing); | |
| border-left: 2px solid transparent; | |
| cursor: default; | |
| } | |
| .notification-item:hover { | |
| background: var(--md-surface-dim); | |
| border-left-color: var(--md-primary); | |
| } | |
| .notification-item.acknowledged { | |
| opacity: 0.45; | |
| } | |
| /* Notification Acknowledge Button β CSS class instead of inline styles */ | |
| .notification-ack-btn { | |
| flex-shrink: 0; | |
| width: 28px; | |
| height: 28px; | |
| display: flex; | |
| align-items: center; | |
| justify-content: center; | |
| background: var(--md-surface-dim); | |
| border: 1px solid var(--md-outline); | |
| border-radius: 50%; | |
| color: var(--md-on-surface-muted); | |
| cursor: pointer; | |
| transition: all var(--md-duration-short) var(--md-easing); | |
| } | |
| .notification-ack-btn:hover { | |
| background: var(--md-primary-container); | |
| border-color: var(--md-primary); | |
| color: var(--md-primary-light); | |
| transform: scale(1.1); | |
| } | |
| .notification-ack-btn .material-symbols-rounded { | |
| font-size: 16px; | |
| } | |
| /* ββ Agent Detail Stat Cards: Hover Lift ββ */ | |
| .detail-stat-card { | |
| transition: all var(--md-duration-short) var(--md-easing); | |
| cursor: default; | |
| } | |
| .detail-stat-card:hover { | |
| transform: translateY(-2px); | |
| border-color: var(--md-primary); | |
| box-shadow: var(--md-elevation-2); | |
| background: var(--md-surface-3); | |
| } | |
| .detail-stat-card:hover .detail-stat-icon { | |
| background: var(--md-primary); | |
| color: var(--md-on-primary); | |
| } | |
| .detail-stat-icon { | |
| transition: all var(--md-duration-short) var(--md-easing); | |
| } | |
| /* ββ Stat Pills: Hover State ββ */ | |
| .stat-pill { | |
| transition: all var(--md-duration-short) var(--md-easing); | |
| cursor: default; | |
| } | |
| .stat-pill:hover { | |
| background: var(--md-surface-2); | |
| border-color: var(--md-primary); | |
| transform: translateY(-1px); | |
| } | |
| /* ββ Chart Cards: Hover Polish ββ */ | |
| .chart-card { | |
| transition: all var(--md-duration-short) var(--md-easing); | |
| } | |
| .chart-card:hover { | |
| border-color: var(--md-primary); | |
| transform: translateY(-1px); | |
| box-shadow: var(--md-elevation-2); | |
| } | |
| .chart-card h3 { | |
| font-size: 0.875rem; | |
| font-weight: 700; | |
| color: var(--md-on-surface-muted); | |
| text-transform: uppercase; | |
| letter-spacing: 0.06em; | |
| margin: 0 0 var(--s4) 0; | |
| padding-bottom: var(--s3); | |
| border-bottom: 1px solid var(--md-outline-variant); | |
| } | |
| /* ββ Audit History Table: Row Hover Polish ββ */ | |
| .audit-history-table tr:hover { | |
| background: rgba(15, 118, 110, 0.04); | |
| } | |
| .audit-history-table th { | |
| font-size: 0.72rem; | |
| font-weight: 700; | |
| letter-spacing: 0.07em; | |
| color: var(--md-on-surface-muted); | |
| text-transform: uppercase; | |
| } | |
| /* ββ Agent Card: Left Accent on Hover ββ */ | |
| .agent-card::before { | |
| content: ''; | |
| position: absolute; | |
| top: 0; | |
| left: 0; | |
| width: 3px; | |
| height: 100%; | |
| background: var(--md-primary); | |
| transform: scaleY(0); | |
| transform-origin: bottom; | |
| transition: transform var(--md-duration-short) var(--md-easing); | |
| } | |
| .agent-card:hover::before { | |
| transform: scaleY(1); | |
| } | |
| .agent-card:hover .agent-avatar { | |
| background: var(--md-primary); | |
| color: var(--md-on-primary); | |
| } | |
| .agent-avatar { | |
| transition: all var(--md-duration-short) var(--md-easing); | |
| } | |
| /* ββ Dashboard Header: KB-aligned section divider ββ */ | |
| .dashboard-header { | |
| padding-bottom: var(--s5); | |
| margin-bottom: var(--s6); | |
| } | |
| .dashboard-header h2 { | |
| font-size: 1.4rem; | |
| font-weight: 800; | |
| letter-spacing: -0.02em; | |
| color: var(--md-on-bg); | |
| margin: 0; | |
| } | |
| /* ββ Consistent body font size normalization ββ */ | |
| .kb-subtitle, | |
| .dashboard-subtitle, | |
| .activity-meta { | |
| font-size: 0.875rem; | |
| color: var(--md-on-surface-muted); | |
| margin: var(--s1) 0 0 0; | |
| } | |
| /* ββ btn-primary in content panels: not full-width by default ββ */ | |
| .content-panel .btn-primary, | |
| .content-panel .btn-secondary { | |
| width: 100%; | |
| } | |
| /* Exception: KB upload button stays full-width */ | |
| #process-upload-btn { | |
| width: 100%; | |
| } | |
| /* ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |
| ORIGINAL AUDIT DESIGN METHODOLOGY β Applied Globally | |
| Patterns extracted from original audit CSS (commit e639c26): | |
| detail-label, field-label, viz-card-header, section-heading, card accents | |
| ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ */ | |
| /* ββ detail-label: Reusable uppercase section header with icon tint ββ */ | |
| /* Used in audit results, agents, dashboard sections */ | |
| .detail-label { | |
| display: flex; | |
| align-items: center; | |
| gap: var(--s2); | |
| font-size: 0.72rem; | |
| font-weight: 700; | |
| text-transform: uppercase; | |
| letter-spacing: 0.08em; | |
| color: var(--md-on-surface-muted); | |
| margin-bottom: var(--s2); | |
| } | |
| .detail-label .material-symbols-rounded { | |
| font-size: 1rem; | |
| color: var(--md-primary-light); | |
| } | |
| /* ββ field-label: Form section uppercase label ββ */ | |
| .field-label { | |
| display: flex; | |
| align-items: center; | |
| gap: var(--s2); | |
| font-size: 0.78rem; | |
| font-weight: 600; | |
| color: var(--md-on-surface-muted); | |
| margin-bottom: var(--s2); | |
| letter-spacing: 0.04em; | |
| text-transform: uppercase; | |
| } | |
| .field-label .material-symbols-rounded { | |
| font-size: 1rem; | |
| } | |
| /* ββ section-heading: Card interior heading with icon ββ */ | |
| .section-heading { | |
| display: flex; | |
| align-items: center; | |
| gap: var(--s2); | |
| font-size: 0.8rem; | |
| font-weight: 700; | |
| text-transform: uppercase; | |
| letter-spacing: 0.07em; | |
| color: var(--md-on-surface-muted); | |
| } | |
| .section-heading .material-symbols-rounded { | |
| font-size: 1rem; | |
| color: var(--md-primary-light); | |
| } | |
| /* ββ viz-card-header: Card top divider bar for chart/viz sections ββ */ | |
| .viz-card-header, | |
| .chart-card-header { | |
| display: flex; | |
| align-items: center; | |
| gap: var(--s2); | |
| font-size: 0.75rem; | |
| font-weight: 700; | |
| text-transform: uppercase; | |
| letter-spacing: 0.07em; | |
| color: var(--md-on-surface-muted); | |
| margin-bottom: var(--s3); | |
| padding-bottom: var(--s3); | |
| border-bottom: 1px solid var(--md-outline-variant); | |
| } | |
| .viz-card-header .material-symbols-rounded, | |
| .chart-card-header .material-symbols-rounded { | |
| font-size: 1rem; | |
| color: var(--md-primary-light); | |
| } | |
| /* ββ highlight: inline text accent (from original dropzone/label) ββ */ | |
| .highlight { | |
| color: var(--md-primary-light); | |
| font-weight: 600; | |
| } | |
| /* [Glow values defined inline above in dedicated hover blocks] */ | |
| /* ββ Score History Table: section heading alignment ββ */ | |
| .score-history-section h3 { | |
| font-size: 0.875rem; | |
| font-weight: 700; | |
| color: var(--md-on-surface-muted); | |
| text-transform: uppercase; | |
| letter-spacing: 0.06em; | |
| margin: 0 0 var(--s4) 0; | |
| } | |
| /* ββ Responsive: Mobile tab adjustments ββ */ | |
| @media (max-width: 640px) { | |
| .tab-navigation { | |
| padding: var(--s2) var(--s3); | |
| gap: var(--s1); | |
| } | |
| .nav-tab { | |
| padding: var(--s2) var(--s3); | |
| font-size: 0.8rem; | |
| } | |
| .nav-tab span:not(.material-symbols-rounded) { | |
| display: none; | |
| } | |
| } |