/* 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 !important; } /* 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 !important; visibility: hidden !important; pointer-events: none !important; height: 0 !important; width: 0 !important; overflow: hidden !important; position: absolute !important; z-index: -9999 !important; } /* Only show dashboard/audit when NOT hidden (i.e., user is authenticated) */ #page-dashboard:not([hidden]), #page-audit-main:not([hidden]) { display: block !important; visibility: visible !important; pointer-events: auto !important; height: auto !important; width: auto !important; position: static !important; z-index: auto !important; overflow: visible !important; } /* Page Transitions — GPU-accelerated smooth loading without CLS */ [id^="page-"] { display: block !important; 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 !important; 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 !important; 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 !important; justify-content: flex-start !important; flex: 1; width: 100%; margin: 0 !important; } .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 !important; width: 100% !important; 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 !important; width: 100% !important; padding-top: 0 !important; } /* 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 !important; 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 !important; 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 !important; 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 !important; } .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) !important; color: var(--md-error) !important; } .btn-danger:hover { background: var(--md-error) !important; color: var(--md-on-error) !important; } .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) !important; background: var(--md-primary-container) !important; cursor: default !important; } .history-item.failed { border-left: 3px solid var(--md-error) !important; background: var(--md-error-bg) !important; } .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%) !important; border-color: var(--md-on-surface-muted) !important; box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3), inset 0 1px 0 rgba(148, 163, 184, 0.1) !important; animation: slideUpIfMobile var(--md-duration-medium) var(--md-easing) !important; } .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 !important; } @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 !important; 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 !important; top: 65px !important; right: 60px !important; 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 !important; 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 !important; 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 !important; top: 65px !important; right: 20px !important; 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 !important; 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) !important; } .nav-link.danger:hover { background: rgba(239, 68, 68, 0.08) !important; } /* ════════════════════════════════════════════════════════════════════════ 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 !important; width: 100% !important; 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 !important; } .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 !important; gap: var(--s3) !important; } .dashboard-actions button { width: 100% !important; } /* 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 !important; transition: none !important; } @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 !important; 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 !important; transition: none !important; } } /* 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 !important; width: 100% !important; max-width: 1400px !important; } /* Hard disable Sidebar */ .app-sidebar, #app-sidebar, #nav-toggle-btn, .sidebar-backdrop { display: none !important; } /* Tab & Panel Fix (Stop Unmounting) */ .content-panel { display: none; margin-top: 10px; animation: fadeIn 0.3s ease; } .content-panel.active { display: block !important; } /* Master Notification overriding */ [hidden], .notifications-panel[hidden] { display: none !important; } /* ── 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 !important; } } /* ───────────────────────────────────────────────────────────────── 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 !important; padding-left: 0 !important; width: 100% !important; max-width: none !important; } .main-content-card { margin: 0 auto !important; width: 100% !important; max-width: 1400px !important; } /* 2. Top-Nav ONLY Constraints */ .app-sidebar, #app-sidebar, #nav-toggle-btn, .sidebar-backdrop { display: none !important; visibility: hidden !important; width: 0 !important; } /* 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 !important; } @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 !important; } } /* 5. Hyper-Specific Desktop Layout Overrides */ #page-audit-main:not([hidden]), #page-dashboard:not([hidden]) { width: 100% !important; max-width: 1400px !important; margin: 0 auto !important; } /* Ensure parents of the main card scale fully out */ .app-container, body:has([hidden]) .app-container { align-items: stretch !important; } /* 6. Tablet Overflow Prevention */ .header-top .header-search { flex-shrink: 1 !important; min-width: 0 !important; width: 100% !important; } .header-top { flex-wrap: wrap !important; overflow: hidden !important; } /* 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) !important; } .stat-declining { color: var(--md-error-light) !important; } /* ── 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; } }