/* CSS Variables for Dark Cyber-Eco Gaming HUD Theming */ :root { --bg-void: #070C08; /* Deep rich forest black */ --bg-panel: rgba(14, 22, 16, 0.82); /* Glassmorphic dark green-charcoal */ --border-color: rgba(112, 173, 71, 0.18); /* Glowing forest green border */ --border-hover: rgba(112, 173, 71, 0.4); /* Brighter glowing green on hover */ --text-main: #F1F8F0; /* Soft mint off-white (highly readable on dark backgrounds) */ --text-muted: #88A385; /* Soft sage green (for label metadata) */ /* Vibrant Eco Game Accent Tones from User Palette */ --cyan: #70AD47; /* Meadow Green (Primary Accent) */ --cyan-glow: rgba(112, 173, 71, 0.35); --green: #70AD47; /* Meadow Green */ --green-glow: rgba(112, 173, 71, 0.25); --yellow: #F59E0B; /* Vibrant Gold Amber */ --yellow-glow: rgba(245, 158, 11, 0.2); --red: #EF4444; /* Crimson Red */ --red-glow: rgba(239, 68, 68, 0.2); /* Fonts */ --font-display: 'Outfit', 'Space Grotesk', system-ui, sans-serif; --font-body: 'Space Grotesk', system-ui, sans-serif; --font-mono: 'JetBrains Mono', monospace; } /* Base resets */ * { box-sizing: border-box; margin: 0; padding: 0; } body { background-color: var(--bg-void); color: var(--text-main); font-family: var(--font-body); overflow-x: hidden; min-height: 100vh; display: flex; flex-direction: column; } /* Background Rain Canvas - subtle overlay */ #rain-canvas { position: fixed; top: 0; left: 0; width: 100%; height: 100%; z-index: 0; pointer-events: none; opacity: 0.12; } /* ========================================== APP LAYOUT & GLOBAL HAMBURGER SIDEBAR ========================================== */ .app-layout { display: flex; flex-direction: column; min-height: 100vh; width: 100%; position: relative; } /* Global Top Header Bar (With Hamburger Menu) */ .app-top-bar { display: flex; justify-content: space-between; align-items: center; height: 58px; min-height: 58px; padding: 0 1.4rem; background: rgba(6, 10, 7, 0.95); backdrop-filter: blur(20px); -webkit-backdrop-filter: blur(20px); border-bottom: 1px solid var(--border-subtle); position: sticky; top: 0; z-index: 1000; box-shadow: 0 4px 20px rgba(0, 0, 0, 0.6); flex-wrap: nowrap; box-sizing: border-box; width: 100%; } .top-bar-left { display: flex; align-items: center; gap: 12px; flex-shrink: 0; } .top-bar-brand { display: flex; align-items: center; gap: 8px; cursor: pointer; user-select: none; } .top-bar-brand .logo-text { font-size: 1.3rem; line-height: 1; font-weight: 800; } .top-bar-brand .version-tag { font-size: 0.65rem; } .menu-toggle-btn { display: flex; flex-direction: column; justify-content: center; align-items: center; gap: 4px; width: 36px; height: 36px; background: rgba(255, 255, 255, 0.04); border: 1px solid var(--border-subtle); border-radius: 8px; cursor: pointer; padding: 0; transition: all 0.2s ease; flex-shrink: 0; } .menu-toggle-btn span { display: block; width: 18px; height: 2px; background: var(--text-primary); border-radius: 2px; transition: all 0.2s ease; } .menu-toggle-btn:hover { background: rgba(112, 173, 71, 0.15); border-color: var(--accent-primary); } .menu-toggle-btn:hover span { background: var(--accent-primary); } .top-bar-center { display: flex; align-items: center; justify-content: center; flex: 1; padding: 0 12px; min-width: 0; } .active-page-pill { font-family: var(--font-mono); font-size: 0.72rem; font-weight: 700; letter-spacing: 1px; color: var(--accent-primary); background: rgba(112, 173, 71, 0.1); border: 1px solid rgba(112, 173, 71, 0.3); padding: 3px 12px; border-radius: 20px; text-transform: uppercase; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } .top-bar-right { display: flex; align-items: center; gap: 10px; flex-shrink: 0; } .top-nav-quick-btn { display: inline-flex; align-items: center; gap: 6px; padding: 6px 12px; background: rgba(112, 173, 71, 0.12); border: 1px solid rgba(112, 173, 71, 0.4); border-radius: 7px; color: var(--accent-primary); font-family: var(--font-mono); font-size: 0.72rem; font-weight: 700; cursor: pointer; transition: all 0.2s ease; white-space: nowrap; } .top-nav-quick-btn:hover { background: var(--accent-primary); color: #050B08; box-shadow: 0 0 14px rgba(112, 173, 71, 0.4); } /* Responsive Top Bar Breakpoints */ @media (max-width: 768px) { .app-top-bar { height: 52px; min-height: 52px; padding: 0 0.85rem; } .top-bar-brand .version-tag { display: none; } .top-bar-brand .logo-text { font-size: 1.15rem; } .top-bar-right .system-status { display: none; } .top-nav-quick-btn { padding: 5px 8px; font-size: 0.68rem; } .active-page-pill { font-size: 0.62rem; padding: 2px 8px; } } @media (max-width: 480px) { .top-bar-center { display: none; } } /* Off-Canvas Sidebar Drawer (All Devices) */ .app-sidebar { width: 285px; min-width: 285px; height: 100vh; position: fixed; top: 0; left: 0; background: rgba(7, 12, 8, 0.98); backdrop-filter: blur(28px); -webkit-backdrop-filter: blur(28px); border-right: 1px solid var(--border-color); display: flex; flex-direction: column; z-index: 10001; box-shadow: 10px 0 45px rgba(0, 0, 0, 0.85); padding: 1.5rem 1.1rem; overflow-y: auto; scrollbar-width: thin; scrollbar-color: rgba(255, 255, 255, 0.1) transparent; transform: translateX(-100%); transition: transform 0.3s cubic-bezier(0.16, 1, 0.3, 1); } .app-sidebar.open { transform: translateX(0); } .app-sidebar::-webkit-scrollbar { width: 4px; } .app-sidebar::-webkit-scrollbar-thumb { background: rgba(255, 255, 255, 0.1); border-radius: 4px; } /* Sidebar Header */ .sidebar-header { display: flex; align-items: center; justify-content: space-between; margin-bottom: 1.5rem; padding-bottom: 1.2rem; border-bottom: 1px solid rgba(255, 255, 255, 0.07); } .sidebar-close-btn { display: flex; align-items: center; justify-content: center; width: 34px; height: 34px; background: rgba(255, 255, 255, 0.05); border: 1px solid rgba(255, 255, 255, 0.1); border-radius: 8px; color: var(--text-muted); cursor: pointer; transition: all 0.2s ease; } .sidebar-close-btn:hover { color: #fff; background: rgba(255, 255, 255, 0.12); border-color: rgba(255, 255, 255, 0.2); } .logo-container { display: flex; flex-direction: column; gap: 4px; } .logo-text { font-family: var(--font-display); font-size: 1.65rem; font-weight: 800; letter-spacing: 1.5px; background: linear-gradient(135deg, #FFFFFF 40%, var(--cyan) 100%); -webkit-background-clip: text; -webkit-text-fill-color: transparent; cursor: pointer; line-height: 1; } .logo-text .highlight { font-weight: 300; letter-spacing: 0px; color: var(--cyan); margin-left: 2px; } .version-tag { font-family: var(--font-mono); font-size: 0.68rem; color: var(--text-muted); background: rgba(255, 255, 255, 0.04); padding: 2px 6px; border-radius: 4px; border: 1px solid rgba(255, 255, 255, 0.06); display: inline-block; width: fit-content; } /* Sidebar Menu */ .sidebar-menu-label { font-family: var(--font-mono); font-size: 0.65rem; font-weight: 700; letter-spacing: 1.5px; color: var(--text-muted); text-transform: uppercase; margin-bottom: 0.65rem; padding-left: 0.6rem; opacity: 0.65; } .sidebar-nav { display: flex; flex-direction: column; gap: 6px; flex: 1; } .sidebar-nav .nav-btn { display: flex; align-items: center; gap: 12px; width: 100%; padding: 11px 14px; background: transparent; border: 1px solid transparent; border-radius: 10px; color: var(--text-muted); font-family: var(--font-mono); font-size: 0.78rem; font-weight: 600; text-align: left; cursor: pointer; transition: all 0.22s cubic-bezier(0.16, 1, 0.3, 1); letter-spacing: 0.5px; text-transform: uppercase; } .sidebar-nav .nav-btn .nav-icon { width: 18px; height: 18px; stroke: currentColor; flex-shrink: 0; transition: transform 0.2s, stroke 0.2s; } .sidebar-nav .nav-btn:hover { color: var(--text-main); background: rgba(255, 255, 255, 0.05); border-color: rgba(255, 255, 255, 0.08); transform: translateX(4px); } .sidebar-nav .nav-btn:hover .nav-icon { stroke: var(--cyan); } .sidebar-nav .nav-btn.active { color: #050B08; background: var(--cyan); border-color: var(--cyan); font-weight: 700; box-shadow: 0 0 20px rgba(0, 242, 254, 0.35); } .sidebar-nav .nav-btn.active .nav-icon { stroke: #050B08; } /* Sidebar Footer */ .sidebar-footer { margin-top: auto; padding-top: 1.2rem; border-top: 1px solid rgba(255, 255, 255, 0.07); } .sidebar-status-card { display: flex; align-items: center; gap: 10px; background: rgba(255, 255, 255, 0.03); border: 1px solid rgba(255, 255, 255, 0.06); border-radius: 8px; padding: 10px 12px; } .sidebar-status-text { display: flex; flex-direction: column; } .sidebar-status-title { font-family: var(--font-mono); font-size: 0.7rem; font-weight: 700; color: #f59e0b; letter-spacing: 0.5px; } .sidebar-status-sub { font-family: var(--font-mono); font-size: 0.65rem; color: var(--text-muted); } /* Main Content Wrapper */ .app-main-content { flex: 1; width: 100%; min-width: 0; display: flex; flex-direction: column; position: relative; z-index: 5; } /* Global Backdrop Overlay */ .sidebar-backdrop { display: block; position: fixed; top: 0; left: 0; width: 100vw; height: 100vh; background: rgba(0, 0, 0, 0.75); backdrop-filter: blur(6px); -webkit-backdrop-filter: blur(6px); z-index: 10000; opacity: 0; pointer-events: none; transition: opacity 0.28s ease; } .sidebar-backdrop.active { opacity: 1; pointer-events: auto; } /* Control Group Label Row and Value Badges */ .control-label-row { display: flex; justify-content: space-between; align-items: center; margin-bottom: 0.45rem; } .control-label-row label { margin-bottom: 0; font-size: 0.8rem; font-family: var(--font-mono); color: var(--text-muted); text-transform: uppercase; letter-spacing: 0.5px; } .control-val-badge { font-family: var(--font-mono); font-size: 0.78rem; color: var(--cyan); background: rgba(0, 242, 254, 0.08); border: 1px solid rgba(0, 242, 254, 0.22); padding: 2px 8px; border-radius: 4px; white-space: nowrap; } /* ========================================== SMART CITY DECISION INTELLIGENCE HUD (12-COL) ========================================== */ /* Design Tokens & CSS Variables */ :root { --bg-primary: #060A07; --bg-surface: rgba(13, 20, 15, 0.88); --bg-elevated: rgba(20, 30, 23, 0.95); --border-subtle: rgba(255, 255, 255, 0.08); --border-hover: rgba(112, 173, 71, 0.35); --border-focus: rgba(112, 173, 71, 0.6); --text-primary: #F8FAF9; --text-secondary: #94A398; --text-muted: #64746B; --accent-primary: #70AD47; --accent-hover: #5d9239; --status-live: #00F0FF; --status-estimated: #F59E0B; --status-forecast: #22C55E; --status-simulation: #38BDF8; --status-derived: #A855F7; --status-warning: #F59E0B; --status-danger: #EF4444; } /* 12-Column Responsive Grid System */ .dashboard-grid-12 { display: grid; grid-template-columns: repeat(12, 1fr); gap: 1rem; width: 100%; margin-bottom: 1rem; } .col-12 { grid-column: span 12; } .col-8 { grid-column: span 8; } .col-7 { grid-column: span 7; } .col-6 { grid-column: span 6; } .col-5 { grid-column: span 5; } .col-4 { grid-column: span 4; } .col-3 { grid-column: span 3; } /* Page Header HUD */ .page-header-hud { display: flex; justify-content: space-between; align-items: center; margin-bottom: 1.1rem; padding-bottom: 0.85rem; border-bottom: 1px solid var(--border-subtle); flex-wrap: wrap; gap: 12px; } .page-title-hud { font-family: var(--font-display); font-size: 1.55rem; font-weight: 700; letter-spacing: 0.5px; color: var(--text-primary); margin: 0; line-height: 1.2; } .page-subtitle-hud { font-size: 0.82rem; color: var(--text-secondary); margin: 3px 0 0 0; } .header-context-badge { display: inline-flex; align-items: center; gap: 8px; background: rgba(112, 173, 71, 0.08); border: 1px solid rgba(112, 173, 71, 0.25); padding: 6px 14px; border-radius: 20px; font-family: var(--font-mono); font-size: 0.75rem; color: var(--text-primary); } .context-dot { width: 6px; height: 6px; border-radius: 50%; background: var(--accent-primary); box-shadow: 0 0 8px var(--accent-primary); } .context-divider { color: var(--text-muted); opacity: 0.5; } /* Control Panel HUD */ .control-panel-hud { margin-bottom: 1rem; background: var(--bg-surface); border: 1px solid var(--border-subtle); border-radius: 10px; padding: 1.1rem 1.3rem; } .control-grid-top { display: grid; grid-template-columns: 1fr 1.2fr 1.1fr; gap: 1.2rem; align-items: flex-start; } .hud-label { display: inline-flex; align-items: center; gap: 6px; font-family: var(--font-mono); font-size: 0.74rem; font-weight: 600; color: var(--text-secondary); text-transform: uppercase; letter-spacing: 0.5px; margin-bottom: 6px; } .hud-label svg { color: var(--accent-primary); } .form-control-hud { width: 100%; background: rgba(0, 0, 0, 0.45); border: 1px solid var(--border-subtle); color: var(--text-primary); padding: 8px 12px; border-radius: 7px; outline: none; font-family: var(--font-body); font-size: 0.84rem; transition: all 0.2s ease; box-sizing: border-box; } .form-control-hud:focus { border-color: var(--accent-primary); box-shadow: 0 0 0 2px rgba(112, 173, 71, 0.2); } /* Horizon Quick Pills */ .horizon-pill-group { display: flex; gap: 6px; width: 100%; } .horizon-pill { flex: 1; padding: 7px 4px; background: rgba(255, 255, 255, 0.04); border: 1px solid var(--border-subtle); border-radius: 6px; color: var(--text-secondary); font-family: var(--font-mono); font-size: 0.76rem; font-weight: 600; cursor: pointer; text-align: center; transition: all 0.2s ease; } .horizon-pill:hover { background: rgba(255, 255, 255, 0.08); color: var(--text-primary); border-color: rgba(255, 255, 255, 0.15); } .horizon-pill.active { background: var(--accent-primary); border-color: var(--accent-primary); color: #050B08; font-weight: 700; box-shadow: 0 0 12px rgba(112, 173, 71, 0.4); } /* Collapsible Advanced Scenario Settings */ .advanced-scenario-wrapper { margin-top: 1rem; padding-top: 0.85rem; border-top: 1px solid rgba(255, 255, 255, 0.06); } .advanced-toggle-btn { display: inline-flex; align-items: center; gap: 6px; background: transparent; border: none; color: var(--text-secondary); font-family: var(--font-mono); font-size: 0.75rem; cursor: pointer; padding: 0; transition: color 0.2s; } .advanced-toggle-btn:hover { color: var(--text-primary); } .advanced-toggle-btn .toggle-icon { font-size: 0.7rem; transition: transform 0.2s ease; } .advanced-toggle-btn.open .toggle-icon { transform: rotate(90deg); } .advanced-toggle-btn .toggle-hint { color: var(--text-muted); font-size: 0.7rem; } .advanced-scenario-drawer { margin-top: 0.85rem; padding: 1rem; background: rgba(0, 0, 0, 0.35); border: 1px solid var(--border-subtle); border-radius: 8px; } .scenario-grid-hud { display: grid; grid-template-columns: 1fr 1fr; gap: 1.2rem; } .scenario-card { display: flex; flex-direction: column; gap: 6px; } .scenario-card-header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 2px; } .scenario-label { font-family: var(--font-mono); font-size: 0.72rem; color: var(--text-secondary); text-transform: uppercase; } .toggle-pill-wrap { display: inline-flex; background: rgba(0, 0, 0, 0.4); border: 1px solid var(--border-subtle); border-radius: 4px; padding: 2px; gap: 2px; } .mode-toggle-btn { background: transparent; border: none; color: var(--text-muted); font-family: var(--font-mono); font-size: 0.65rem; padding: 2px 6px; border-radius: 3px; cursor: pointer; transition: all 0.15s ease; } .mode-toggle-btn.active { background: rgba(112, 173, 71, 0.2); color: var(--accent-primary); font-weight: 700; } .slider-with-val { display: flex; align-items: center; gap: 12px; } .slider-with-val input[type="range"] { flex: 1; } .scenario-val-display { font-family: var(--font-mono); font-size: 0.72rem; color: var(--text-secondary); white-space: nowrap; min-width: 110px; text-align: right; } /* Control Actions Bar */ .control-actions-bar { display: flex; justify-content: space-between; align-items: center; margin-top: 1.1rem; padding-top: 0.85rem; border-top: 1px solid rgba(255, 255, 255, 0.06); flex-wrap: wrap; gap: 10px; } .model-info-link { display: inline-flex; align-items: center; gap: 6px; background: transparent; border: none; color: var(--text-muted); font-family: var(--font-mono); font-size: 0.72rem; cursor: pointer; transition: color 0.2s ease; } .model-info-link:hover { color: var(--accent-primary); } .right-actions { display: flex; align-items: center; gap: 8px; } .btn-hud-primary { display: inline-flex; align-items: center; justify-content: center; gap: 8px; padding: 9px 20px; background: var(--accent-primary); border: 1px solid var(--accent-primary); color: #050B08; font-family: var(--font-display); font-size: 0.85rem; font-weight: 700; letter-spacing: 0.5px; border-radius: 7px; cursor: pointer; transition: all 0.2s ease; box-shadow: 0 0 16px rgba(112, 173, 71, 0.35); } .btn-hud-primary:hover { background: var(--accent-hover); box-shadow: 0 0 22px rgba(112, 173, 71, 0.55); transform: translateY(-1px); } .btn-hud-primary:disabled { opacity: 0.6; cursor: not-allowed; transform: none; } .btn-hud-secondary { display: inline-flex; align-items: center; gap: 6px; padding: 8px 14px; background: rgba(255, 255, 255, 0.04); border: 1px solid var(--border-subtle); color: var(--text-secondary); font-family: var(--font-mono); font-size: 0.76rem; font-weight: 600; border-radius: 7px; cursor: pointer; transition: all 0.2s ease; } .btn-hud-secondary:hover { background: rgba(255, 255, 255, 0.08); border-color: rgba(255, 255, 255, 0.2); color: var(--text-primary); } /* 2. Decision KPI Grid (4 Cards) */ .decision-kpi-grid { display: grid; grid-template-columns: repeat(4, 1fr); gap: 0.9rem; margin-bottom: 1rem; } .kpi-card-hud { padding: 0.9rem 1.1rem; background: var(--bg-surface); border: 1px solid var(--border-subtle); border-radius: 8px; display: flex; flex-direction: column; justify-content: space-between; min-height: 88px; transition: border-color 0.2s, box-shadow 0.2s; } .kpi-card-hud:hover { border-color: var(--border-hover); } .kpi-header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 4px; } .kpi-label { font-family: var(--font-mono); font-size: 0.7rem; font-weight: 600; color: var(--text-secondary); text-transform: uppercase; letter-spacing: 0.5px; } .kpi-body { display: flex; flex-direction: column; } .kpi-value { font-family: var(--font-display); font-size: 1.55rem; font-weight: 800; color: var(--text-primary); line-height: 1.15; } .kpi-value .unit { font-size: 0.8rem; font-weight: 400; color: var(--text-muted); } .kpi-value.highlight-cyan { color: var(--status-live); } .kpi-status-badge { display: inline-block; padding: 3px 10px; border-radius: 5px; font-size: 0.88rem; font-weight: 700; font-family: var(--font-mono); width: fit-content; } .kpi-status-badge.safe { background: rgba(34, 197, 94, 0.15); border: 1px solid rgba(34, 197, 94, 0.4); color: #4ade80; } .kpi-status-badge.warning { background: rgba(245, 158, 11, 0.15); border: 1px solid rgba(245, 158, 11, 0.4); color: #fbbf24; } .kpi-status-badge.critical { background: rgba(239, 68, 68, 0.15); border: 1px solid rgba(239, 68, 68, 0.4); color: #f87171; } .kpi-subtext { font-family: var(--font-mono); font-size: 0.66rem; color: var(--text-muted); margin-top: 3px; } /* Panel Common Headings */ .panel-header-hud { display: flex; justify-content: space-between; align-items: center; margin-bottom: 0.85rem; flex-wrap: wrap; gap: 6px; } .panel-heading { font-family: var(--font-display); font-size: 0.88rem; font-weight: 700; letter-spacing: 1px; color: var(--text-primary); margin: 0; border-left: 3px solid var(--accent-primary); padding-left: 7px; text-transform: uppercase; line-height: 1.2; } .panel-caption { display: block; font-size: 0.74rem; color: var(--text-muted); margin-top: 2px; } /* Map Panel HUD */ .map-panel-hud { display: flex; flex-direction: column; } .map-container-hud { position: relative; width: 100%; height: 420px; background: #111; border-radius: 8px; overflow: hidden; border: 1px solid var(--border-subtle); } #map { width: 100%; height: 100%; background: #111 !important; } .map-overlay-status { position: absolute; bottom: 12px; left: 12px; right: 12px; background: rgba(7, 12, 8, 0.9); backdrop-filter: blur(14px); -webkit-backdrop-filter: blur(14px); border: 1px solid var(--border-subtle); border-radius: 6px; padding: 8px 14px; display: flex; align-items: center; justify-content: space-between; z-index: 1000; box-shadow: 0 4px 15px rgba(0, 0, 0, 0.6); } .overlay-item { display: flex; flex-direction: column; } .overlay-label { font-family: var(--font-mono); font-size: 0.62rem; color: var(--text-muted); text-transform: uppercase; letter-spacing: 0.4px; } .overlay-val { font-family: var(--font-mono); font-size: 0.78rem; font-weight: 700; color: var(--text-primary); } .overlay-val.highlight { color: var(--status-live); } .overlay-divider { width: 1px; height: 24px; background: rgba(255, 255, 255, 0.1); } /* Context Intelligence Panel HUD */ .context-panel-hud { display: flex; flex-direction: column; gap: 0.85rem; } .context-card-hud { background: rgba(0, 0, 0, 0.3); border: 1px solid var(--border-subtle); border-radius: 8px; padding: 0.9rem 1rem; display: flex; flex-direction: column; gap: 8px; } .context-card-header { display: flex; justify-content: space-between; align-items: center; } .context-card-title { font-family: var(--font-mono); font-size: 0.68rem; font-weight: 700; color: var(--text-secondary); letter-spacing: 0.6px; text-transform: uppercase; } .weather-display-row { display: flex; justify-content: space-between; align-items: center; gap: 10px; } .weather-temp-hud { font-family: var(--font-display); font-size: 1.15rem; font-weight: 700; color: var(--text-primary); display: block; } .weather-sub-hud { font-size: 0.72rem; color: var(--text-muted); } .weather-metrics { display: flex; flex-direction: column; gap: 3px; text-align: right; } .metric-row { font-family: var(--font-mono); font-size: 0.72rem; color: var(--text-muted); } .metric-val { color: var(--status-live); font-weight: 600; } .event-desc-hud { font-size: 0.78rem; color: var(--text-primary); margin: 0; line-height: 1.4; } .context-source-tag { font-family: var(--font-mono); font-size: 0.62rem; color: var(--text-muted); border-top: 1px solid rgba(255, 255, 255, 0.05); padding-top: 6px; } /* 4. Forecast Timeline Chart Panel HUD */ .timeline-chart-panel-hud { margin-bottom: 1rem; } .chart-wrapper-hud { width: 100%; position: relative; height: 200px; margin: 0.5rem 0; } .chart-summary-bar { display: grid; grid-template-columns: repeat(4, 1fr); gap: 0.8rem; margin-top: 0.85rem; padding-top: 0.85rem; border-top: 1px solid rgba(255, 255, 255, 0.06); } .chart-summary-item { display: flex; flex-direction: column; } .summary-label { font-family: var(--font-mono); font-size: 0.65rem; color: var(--text-muted); text-transform: uppercase; letter-spacing: 0.4px; } .summary-val { font-family: var(--font-mono); font-size: 0.85rem; font-weight: 700; color: var(--text-primary); margin-top: 2px; } .summary-val.highlight-amber { color: var(--status-warning); } .summary-val.highlight-green { color: var(--status-forecast); } /* 5. Operational Scenario Panel HUD */ .operational-panel-hud { display: flex; flex-direction: column; } .operational-grid-hud { display: grid; grid-template-columns: repeat(3, 1fr); gap: 0.7rem; margin-top: 0.5rem; } .op-card { background: rgba(0, 0, 0, 0.3); border: 1px solid var(--border-subtle); border-radius: 7px; padding: 0.75rem 0.85rem; display: flex; flex-direction: column; } .op-label { font-family: var(--font-mono); font-size: 0.66rem; color: var(--text-muted); text-transform: uppercase; letter-spacing: 0.4px; margin-bottom: 2px; } .op-val { font-family: var(--font-display); font-size: 1.15rem; font-weight: 800; color: var(--text-primary); line-height: 1.2; } .op-val.highlight { color: var(--accent-primary); } .op-sub { font-family: var(--font-mono); font-size: 0.62rem; color: var(--text-muted); margin-top: 2px; } .operational-assumptions-strip { margin-top: 0.85rem; padding-top: 0.75rem; border-top: 1px solid rgba(255, 255, 255, 0.05); display: flex; flex-direction: column; gap: 3px; } .assumptions-tag { font-family: var(--font-mono); font-size: 0.65rem; color: var(--text-muted); } .disclaimer-micro { font-family: var(--font-mono); font-size: 0.62rem; color: var(--status-warning); font-weight: 600; } .btn-formula-toggle { display: inline-flex; align-items: center; gap: 4px; background: rgba(255, 255, 255, 0.04); border: 1px solid var(--border-subtle); color: var(--text-secondary); font-family: var(--font-mono); font-size: 0.7rem; padding: 3px 8px; border-radius: 5px; cursor: pointer; transition: all 0.2s ease; } .btn-formula-toggle:hover { background: rgba(255, 255, 255, 0.08); color: var(--text-primary); border-color: var(--accent-primary); } /* 5. Waste Composition Panel HUD */ .composition-panel-hud { display: flex; flex-direction: column; } .composition-stacked-bar { width: 100%; height: 12px; background: rgba(0, 0, 0, 0.3); border-radius: 6px; overflow: hidden; display: flex; margin: 0.6rem 0 1rem 0; border: 1px solid var(--border-subtle); } .segment { height: 100%; transition: width 0.6s ease; } .segment.organic { background: #22C55E; } .segment.plastic { background: #00F0FF; } .segment.paper { background: #F59E0B; } .segment.glass { background: #EC4899; } .segment.textile { background: #A855F7; } .segment.metal { background: #94A3B8; } .composition-rows-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 0.65rem 1.2rem; } .comp-row { display: flex; flex-direction: column; gap: 3px; } .comp-header { display: flex; justify-content: space-between; align-items: center; font-size: 0.72rem; } .comp-name { font-family: var(--font-mono); color: var(--text-secondary); display: inline-flex; align-items: center; gap: 6px; } .comp-ton { font-family: var(--font-mono); color: var(--text-primary); font-weight: 700; } .dot-organic { background: #22C55E; } .dot-plastic { background: #00F0FF; } .dot-paper { background: #F59E0B; } .dot-glass { background: #EC4899; } .dot-textile { background: #A855F7; } .dot-metal { background: #94A3B8; } .comp-bar-bg { width: 100%; height: 5px; background: rgba(255, 255, 255, 0.06); border-radius: 3px; overflow: hidden; } .comp-bar-fill { height: 100%; border-radius: 3px; width: 0%; transition: width 0.8s cubic-bezier(0.16, 1, 0.3, 1); } .comp-bar-fill.organic { background: #22C55E; } .comp-bar-fill.plastic { background: #00F0FF; } .comp-bar-fill.paper { background: #F59E0B; } .comp-bar-fill.glass { background: #EC4899; } .comp-bar-fill.textile { background: #A855F7; } .comp-bar-fill.metal { background: #94A3B8; } /* 6. Hourly Dispatch Risk Panel HUD */ .hourly-panel-hud { display: flex; flex-direction: column; } .hourly-footer-hud { display: flex; justify-content: space-between; align-items: center; margin-top: 0.75rem; padding-top: 0.65rem; border-top: 1px solid rgba(255, 255, 255, 0.05); flex-wrap: wrap; gap: 8px; } .hourly-legend { display: flex; align-items: center; gap: 12px; } .legend-item { display: inline-flex; align-items: center; gap: 5px; font-family: var(--font-mono); font-size: 0.65rem; color: var(--text-secondary); } .legend-swatch { width: 8px; height: 8px; border-radius: 2px; } .legend-swatch.low { background: #22C55E; } .legend-swatch.medium { background: #F59E0B; } .legend-swatch.high { background: #EF4444; } .hourly-factors-note { font-family: var(--font-mono); font-size: 0.62rem; color: var(--text-muted); } /* 6. Data Provenance Panel HUD */ .provenance-panel-hud { display: flex; flex-direction: column; } .btn-methodology-link { background: transparent; border: none; color: var(--status-live); font-family: var(--font-mono); font-size: 0.72rem; cursor: pointer; padding: 0; transition: all 0.2s ease; } .btn-methodology-link:hover { text-decoration: underline; } .provenance-status-table { display: flex; flex-direction: column; gap: 6px; margin: 0.5rem 0; } .prov-row { display: flex; justify-content: space-between; align-items: center; background: rgba(0, 0, 0, 0.25); border: 1px solid var(--border-subtle); border-radius: 6px; padding: 6px 10px; } .prov-source { font-family: var(--font-mono); font-size: 0.7rem; color: var(--text-secondary); display: inline-flex; align-items: center; gap: 6px; } .dot { width: 6px; height: 6px; border-radius: 50%; } .dot-live { background: var(--status-live); box-shadow: 0 0 6px var(--status-live); } .dot-ref { background: #94A3B8; } .dot-est { background: var(--status-estimated); } .dot-model { background: var(--status-forecast); } .dot-pending { background: #64748B; } .research-disclaimer-box { display: flex; gap: 8px; background: rgba(245, 158, 11, 0.06); border: 1px solid rgba(245, 158, 11, 0.2); border-radius: 6px; padding: 8px 10px; margin-top: 0.6rem; } .disclaimer-icon { font-size: 0.85rem; line-height: 1; } .disclaimer-text { font-size: 0.72rem; color: var(--text-secondary); margin: 0; line-height: 1.35; } .disclaimer-text strong { color: var(--status-warning); } /* Badges System */ .badge { font-family: var(--font-mono); font-size: 0.62rem; font-weight: 700; padding: 2px 6px; border-radius: 4px; text-transform: uppercase; letter-spacing: 0.4px; display: inline-block; width: fit-content; } .badge-live { background: rgba(0, 240, 255, 0.12); color: var(--status-live); border: 1px solid rgba(0, 240, 255, 0.3); } .badge-forecast { background: rgba(34, 197, 94, 0.12); color: var(--status-forecast); border: 1px solid rgba(34, 197, 94, 0.3); } .badge-derived { background: rgba(168, 85, 247, 0.12); color: var(--status-derived); border: 1px solid rgba(168, 85, 247, 0.3); } .badge-simulation { background: rgba(56, 189, 248, 0.12); color: var(--status-simulation); border: 1px solid rgba(56, 189, 248, 0.3); } .badge-unverified { background: rgba(148, 163, 184, 0.12); color: #94A3B8; border: 1px solid rgba(148, 163, 184, 0.3); } .badge-estimated { background: rgba(245, 158, 11, 0.12); color: var(--status-estimated); border: 1px solid rgba(245, 158, 11, 0.3); } .badge-pending { background: rgba(100, 116, 139, 0.12); color: #64748B; border: 1px solid rgba(100, 116, 139, 0.3); } .badge-observed { background: rgba(0, 240, 255, 0.12); color: var(--status-live); border: 1px solid rgba(0, 240, 255, 0.3); } /* Responsive Grid Breakpoints */ @media (max-width: 1200px) { .col-8, .col-7, .col-6, .col-5, .col-4, .col-3 { grid-column: span 12; } .control-grid-top { grid-template-columns: 1fr 1fr; } .control-item:last-child { grid-column: span 2; } .decision-kpi-grid { grid-template-columns: repeat(2, 1fr); } .chart-summary-bar { grid-template-columns: repeat(2, 1fr); } } @media (max-width: 768px) { .control-grid-top { grid-template-columns: 1fr; } .control-item:last-child { grid-column: span 1; } .scenario-grid-hud { grid-template-columns: 1fr; } .decision-kpi-grid { grid-template-columns: 1fr; } .operational-grid-hud { grid-template-columns: 1fr 1fr; } .composition-rows-grid { grid-template-columns: 1fr; } .map-container-hud { height: 300px; } .map-overlay-status { flex-direction: column; align-items: flex-start; gap: 6px; } .overlay-divider { display: none; } .chart-summary-bar { grid-template-columns: 1fr; } } /* Route Popup */ .route-popup { font-family: var(--font-body); font-size: 0.8rem; color: var(--text-main); background: rgba(14, 22, 16, 0.95); padding: 8px 10px; border-radius: 6px; border: 1px solid var(--border-color); box-shadow: 0 4px 15px rgba(0, 0, 0, 0.6); } .route-popup h3 { font-family: var(--font-display); font-size: 0.85rem; color: var(--cyan); margin-bottom: 4px; } .route-popup .highlight { color: var(--cyan); font-weight: 700; } /* Timeline Cards */ .timeline-cards-row { display: grid; grid-template-columns: repeat(auto-fit, minmax(115px, 1fr)); gap: 0.6rem; width: 100%; } .timeline-card { background: rgba(0, 0, 0, 0.35); border: 1px solid rgba(255, 255, 255, 0.08); border-radius: 7px; padding: 0.65rem 0.75rem; display: flex; flex-direction: column; align-items: center; text-align: center; gap: 2px; transition: all 0.2s ease; } .timeline-card:hover { border-color: var(--cyan); transform: translateY(-2px); background: rgba(0, 242, 254, 0.05); } .timeline-date { font-family: var(--font-mono); font-size: 0.68rem; color: var(--text-muted); } .timeline-vol { font-family: var(--font-display); font-size: 1.15rem; font-weight: 800; color: var(--text-main); } .timeline-status { font-family: var(--font-mono); font-size: 0.62rem; font-weight: 700; padding: 2px 7px; border-radius: 4px; text-transform: uppercase; } .timeline-status.safe { background: rgba(34, 197, 94, 0.15); color: #4ade80; } .timeline-status.warning { background: rgba(245, 158, 11, 0.15); color: #fbbf24; } .timeline-status.critical { background: rgba(239, 68, 68, 0.15); color: #f87171; } .empty-timeline { width: 100%; text-align: center; padding: 1.5rem; color: var(--text-muted); font-family: var(--font-mono); font-size: 0.8rem; } /* Hourly Grid */ .hourly-cells-grid { display: grid; grid-template-columns: repeat(24, 1fr); gap: 3px; min-width: 580px; padding: 6px 0; } .hourly-cell { display: flex; flex-direction: column; align-items: center; gap: 3px; } .cell-block { width: 100%; height: 22px; border-radius: 3px; transition: transform 0.15s; cursor: pointer; } .cell-block:hover { transform: scaleY(1.3); } .cell-block.low { background-color: rgba(34, 197, 94, 0.4); border: 1px solid #22c55e; } .cell-block.medium { background-color: rgba(245, 158, 11, 0.4); border: 1px solid #f59e0b; } .cell-block.high { background-color: rgba(239, 68, 68, 0.4); border: 1px solid #ef4444; } .cell-time { font-family: var(--font-mono); font-size: 0.58rem; color: var(--text-muted); } /* SPA Multi-Page Styling */ .page-container { display: none; opacity: 0; transition: opacity 0.4s cubic-bezier(0.4, 0, 0.2, 1); animation: fade-in 0.4s forwards; padding: 0.75rem 1rem; flex: 1; z-index: 5; position: relative; } .page-container.active { display: block; opacity: 1; } @keyframes fade-in { from { opacity: 0; transform: translateY(8px); } to { opacity: 1; transform: translateY(0); } } /* Nav Links in Header */ .nav-links { display: flex; gap: 1.25rem; background: rgba(255, 255, 255, 0.03); border: 1px solid rgba(255, 255, 255, 0.06); padding: 4px; border-radius: 8px; } .nav-btn { background: transparent; border: none; color: var(--text-muted); font-family: var(--font-display); font-size: 0.85rem; font-weight: 600; letter-spacing: 1px; padding: 8px 16px; cursor: pointer; border-radius: 6px; transition: color 0.3s, background 0.3s, box-shadow 0.3s; } .nav-btn:hover { color: var(--cyan); background: rgba(255, 255, 255, 0.02); } .nav-btn.active { color: var(--bg-void); background: var(--cyan); box-shadow: 0 0 15px var(--cyan-glow); } /* Hero Section */ .hero-section { display: grid; grid-template-columns: 1.2fr 0.8fr; gap: 2rem; align-items: center; padding: 3rem 0; } @media (max-width: 900px) { .hero-section { grid-template-columns: 1fr; } } .hero-content { display: flex; flex-direction: column; gap: 1.5rem; } .hero-title { font-family: var(--font-display); font-size: 3rem; font-weight: 800; letter-spacing: 2px; line-height: 1.1; background: linear-gradient(135deg, #FFF 40%, var(--cyan) 100%); -webkit-background-clip: text; -webkit-text-fill-color: transparent; text-shadow: 0 0 30px rgba(0, 240, 255, 0.15); } .hero-subtitle { font-size: 1.1rem; color: var(--text-muted); line-height: 1.6; } .hero-actions { display: flex; gap: 1rem; max-width: 400px; } .hero-stats-panel { display: flex; flex-direction: column; gap: 1rem; } .hero-stat-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 1rem; } .hero-stat-card { background: rgba(0, 0, 0, 0.02); border: 1px solid var(--border-color); padding: 1.2rem; border-radius: 8px; display: flex; flex-direction: column; gap: 4px; } .h-stat-label { font-size: 0.75rem; font-family: var(--font-mono); color: var(--text-muted); text-transform: uppercase; } .h-stat-value { font-size: 1.8rem; font-family: var(--font-display); font-weight: 800; color: var(--text-main); } /* Features Grid */ .features-section { padding: 2rem 0; } .section-title { font-family: var(--font-display); font-size: 1.4rem; font-weight: 700; letter-spacing: 1.5px; margin-bottom: 2rem; color: var(--text-main); border-left: 3px solid var(--cyan); padding-left: 10px; } .features-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(240px, 1fr)); gap: 1.5rem; } .feature-card { display: flex; flex-direction: column; gap: 1rem; transition: transform 0.3s; } .feature-card:hover { transform: translateY(-4px); } .feature-icon { font-size: 2rem; font-weight: 800; color: rgba(0, 240, 255, 0.25); text-shadow: 0 0 10px rgba(0, 240, 255, 0.05); } .feature-name { font-family: var(--font-display); font-size: 1.05rem; font-weight: 600; color: var(--cyan); } .feature-desc { font-size: 0.85rem; color: var(--text-muted); line-height: 1.6; } /* Page Headers */ .page-header-section { padding: 2rem 0 1rem 0; } .section-subtitle { font-size: 0.95rem; color: var(--text-muted); margin-top: 6px; } /* News Page Styling */ .news-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(320px, 1fr)); gap: 1.5rem; padding: 1.5rem 0; } .news-card { background: var(--bg-panel); border: 1px solid var(--border-color); border-radius: 12px; padding: 1.5rem; backdrop-filter: blur(16px); display: flex; flex-direction: column; gap: 1rem; transition: transform 0.3s, border-color 0.3s, box-shadow 0.3s; } .news-card:hover { transform: translateY(-3px); border-color: var(--border-hover); box-shadow: 0 8px 32px 0 rgba(0, 240, 255, 0.05); } .news-card-header { display: flex; justify-content: space-between; align-items: center; } .news-source { font-family: var(--font-mono); font-size: 0.75rem; background: rgba(0, 240, 255, 0.08); color: var(--cyan); padding: 2px 8px; border-radius: 4px; border: 1px solid rgba(0, 240, 255, 0.2); } .news-date { font-family: var(--font-mono); font-size: 0.75rem; color: var(--text-muted); } .news-title { font-family: var(--font-display); font-size: 1.1rem; font-weight: 600; color: #FFF; line-height: 1.4; } .news-summary { font-size: 0.85rem; color: var(--text-muted); line-height: 1.6; } .news-link { margin-top: auto; display: inline-flex; align-items: center; color: var(--cyan); text-decoration: none; font-family: var(--font-mono); font-size: 0.8rem; font-weight: bold; gap: 6px; transition: gap 0.2s; } .news-link:hover { gap: 10px; } .loading-news, .loading-alerts { grid-column: 1 / -1; text-align: center; padding: 3rem; color: var(--text-muted); font-family: var(--font-mono); font-size: 0.9rem; } /* Alerts Page Styling */ .alerts-summary { margin-top: 1.5rem; } .alerts-list-group { display: flex; flex-direction: column; gap: 1rem; } .alert-row { display: grid; grid-template-columns: 120px 180px 100px 1fr; gap: 1rem; align-items: center; background: rgba(0, 0, 0, 0.2); border: 1px solid rgba(255, 255, 255, 0.04); padding: 1rem 1.5rem; border-radius: 8px; transition: all 0.25s cubic-bezier(0.25, 0.8, 0.25, 1); cursor: pointer; } .autopilot-row { grid-template-columns: 60px 180px 100px 1fr !important; } .alert-row:hover { background: rgba(0, 240, 255, 0.04) !important; border-color: var(--cyan) !important; box-shadow: 0 0 15px rgba(0, 240, 255, 0.1) !important; transform: translateX(6px); } .alert-date { font-family: var(--font-mono); font-size: 0.85rem; color: var(--text-muted); } .alert-location { font-family: var(--font-display); font-weight: 600; color: #FFF; } .alert-badge { font-family: var(--font-mono); font-size: 0.75rem; font-weight: bold; padding: 3px 8px; border-radius: 4px; text-align: center; } .alert-badge.critical { background: rgba(255, 0, 85, 0.12); color: var(--red); border: 1px solid var(--red); box-shadow: 0 0 10px rgba(255, 0, 85, 0.1); } .alert-badge.warning { background: rgba(255, 230, 0, 0.12); color: var(--yellow); border: 1px solid var(--yellow); box-shadow: 0 0 10px rgba(255, 230, 0, 0.1); } .alert-desc { font-size: 0.85rem; color: var(--text-muted); } /* ========================================== CUSTOM CYBER HUD CURSOR & INTERACTIVITY ========================================== */ #cursor-dot, #cursor-ring { position: fixed; top: 0; left: 0; pointer-events: none; z-index: 10000; border-radius: 50%; display: none; backface-visibility: hidden; } #cursor-dot { width: 6px; height: 6px; background: var(--cyan); box-shadow: 0 0 10px var(--cyan); } #cursor-ring { width: 40px; height: 40px; border: 1px solid var(--border-hover); transition: width 0.25s cubic-bezier(0.25, 1, 0.5, 1), height 0.25s cubic-bezier(0.25, 1, 0.5, 1), border-color 0.25s ease, background 0.25s ease; } /* Hover state on buttons/interactive elements */ #cursor-ring.hover-state { width: 55px; height: 55px; border-color: var(--cyan); background: rgba(0, 240, 255, 0.04); box-shadow: 0 0 15px rgba(0, 240, 255, 0.15); } @media (pointer: coarse) { #cursor-dot, #cursor-ring { display: none !important; } * { cursor: auto !important; } } /* Hide default cursor on desktops for the custom cursor feel */ @media (pointer: fine) { body, a, button, select, input, [role="button"], .leaflet-interactive { cursor: none !important; } } /* ========================================== RADAR SWEEP EFFECT (ON MAP OVERLAY) ========================================== */ .map-container { position: relative; } .map-container::after { content: ''; position: absolute; inset: 0; pointer-events: none; z-index: 1000; background: conic-gradient(from 0deg at 50% 50%, rgba(0, 240, 255, 0.08) 0deg, transparent 90deg, transparent 360deg); animation: radar-sweep 8s linear infinite; opacity: 0.7; border-radius: 8px; mix-blend-mode: screen; } @keyframes radar-sweep { from { transform: rotate(0deg); } to { transform: rotate(360deg); } } /* ========================================== AMBIENT GLOWS & GLASSMORPHISM UPGRADES ========================================== */ body::before { content: ''; position: fixed; top: -10%; left: -10%; width: 50%; height: 50%; background: radial-gradient(circle, rgba(0, 240, 255, 0.05) 0%, transparent 70%); z-index: 0; pointer-events: none; } body::after { content: ''; position: fixed; bottom: -10%; right: -10%; width: 60%; height: 60%; background: radial-gradient(circle, rgba(0, 102, 255, 0.04) 0%, transparent 70%); z-index: 0; pointer-events: none; } /* Neon glow for progress bars */ .progress-bar-fill.organic { box-shadow: 0 0 8px var(--green-glow); } .progress-bar-fill.plastic { box-shadow: 0 0 8px var(--cyan-glow); } .progress-bar-fill.paper { box-shadow: 0 0 8px var(--yellow-glow); } .progress-bar-fill.glass { box-shadow: 0 0 8px rgba(0, 240, 255, 0.25); } .progress-bar-fill.textile { box-shadow: 0 0 8px rgba(255, 0, 85, 0.25); } .progress-bar-fill.metal { box-shadow: 0 0 8px rgba(255, 255, 255, 0.25); } /* Logo Reflective Polish */ .logo-text { position: relative; -webkit-box-reflect: below -4px linear-gradient(transparent, rgba(255, 255, 255, 0.08)); } /* ========================================== DEVELOPMENT TEAM STYLING ========================================== */ .developers-section { padding: 2.5rem 0; margin-top: 3.5rem; border-top: 1px solid var(--border-color); } .developers-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); gap: 1.5rem; margin-top: 1.5rem; } .developer-card { position: relative; background: var(--bg-panel) !important; border: 1px solid var(--border-color) !important; border-radius: 12px; padding: 2.2rem; text-align: center; transition: all 0.3s cubic-bezier(0.25, 0.8, 0.25, 1); overflow: hidden; box-shadow: 0 4px 20px rgba(0, 0, 0, 0.02); } .developer-card::before { content: ''; position: absolute; top: 0; left: 0; right: 0; height: 3px; background: linear-gradient(90deg, transparent, var(--cyan), transparent); opacity: 0.7; } .developer-card:hover { transform: translateY(-6px); border-color: var(--cyan) !important; box-shadow: 0 10px 25px rgba(5, 150, 105, 0.1) !important; } .dev-role { font-size: 0.75rem; text-transform: uppercase; letter-spacing: 2px; color: var(--cyan); font-weight: 700; margin-bottom: 0.6rem; font-family: var(--font-mono); } .dev-name { font-size: 1.25rem; color: var(--text-main); font-weight: 800; margin-bottom: 0.8rem; font-family: var(--font-display); } .dev-desc { font-size: 0.82rem; color: var(--text-muted); line-height: 1.6; } /* Interactive Eco-Sorter Game Styling */ .bin-btn { transition: all 0.2s cubic-bezier(0.25, 0.8, 0.25, 1) !important; } .organic-bin:hover { background: rgba(74, 222, 128, 0.15) !important; box-shadow: 0 0 15px rgba(74, 222, 128, 0.3) !important; transform: translateY(-2px); } .inorganic-bin:hover { background: rgba(56, 189, 248, 0.15) !important; box-shadow: 0 0 15px rgba(56, 189, 248, 0.3) !important; transform: translateY(-2px); } .hazard-bin:hover { background: rgba(251, 113, 133, 0.15) !important; box-shadow: 0 0 15px rgba(251, 113, 133, 0.3) !important; transform: translateY(-2px); } .bin-btn:active { transform: scale(0.95) !important; } /* Decomposition Facts Styles */ .fact-item { background: rgba(0, 0, 0, 0.01); border: 1px solid var(--border-color); border-radius: 10px; padding: 0.8rem 1rem; transition: border-color 0.3s, background 0.3s; } .fact-item:hover { background: rgba(0, 0, 0, 0.02); border-color: var(--cyan); } /* Media Query overrides for the education hub */ @media (max-width: 992px) { .education-grid { grid-template-columns: 1fr !important; gap: 1.5rem !important; } } /* ========================================== COMPREHENSIVE LAYOUT RESPONSIVENESS ========================================== */ @media (max-width: 1200px) { .dashboard-grid { display: flex !important; flex-direction: column !important; height: auto !important; overflow: visible !important; gap: 1.5rem !important; } /* Smart re-ordering for mobile: Show Map & Stats first, then Config Panel, then Charts */ .map-and-stats { order: -1 !important; } .control-panel { order: 0 !important; } .analysis-panel { order: 1 !important; } .page-container { height: auto !important; overflow: visible !important; } } @media (max-width: 992px) { .autopilot-grid { grid-template-columns: 1fr !important; gap: 1.5rem !important; } .hero-section { grid-template-columns: 1fr !important; text-align: center; } .hero-actions { justify-content: center; margin: 0 auto; } } @media (max-width: 768px) { header { flex-direction: column !important; gap: 1.2rem !important; padding: 1.2rem 1.5rem !important; text-align: center; } .logo-container { justify-content: center; flex-wrap: wrap; } /* Sleek Equal-width Segmented Tab-bar on Mobile */ .nav-links { display: grid !important; grid-template-columns: repeat(3, 1fr) !important; gap: 0.5rem !important; width: 100% !important; background: rgba(0, 0, 0, 0.04); padding: 4px; border-radius: 8px; border: 1px solid var(--border-color); } .nav-btn { width: 100% !important; padding: 8px 4px !important; font-size: 0.72rem !important; text-align: center !important; justify-content: center !important; margin: 0 !important; } .system-status { justify-content: center; width: 100%; margin-top: 0.2rem; } .page-container { padding: 1rem 1.2rem !important; } .stats-row { grid-template-columns: 1fr !important; gap: 1rem !important; } .hero-stat-grid { grid-template-columns: 1fr !important; } .hero-title { font-size: 2.2rem !important; } .hero-subtitle { font-size: 0.95rem !important; } .map-panel { height: 350px !important; } .logistics-grid { grid-template-columns: 1fr !important; } /* Stack progress bars in 1 column to prevent text clipping */ .progress-container { grid-template-columns: 1fr !important; gap: 1rem !important; } /* Flex stack alerts to fit narrow viewports beautifully */ .alert-row, .autopilot-row { display: flex !important; flex-direction: column !important; align-items: flex-start !important; gap: 0.5rem !important; padding: 1rem 1.2rem !important; } .alert-row > *, .autopilot-row > * { width: auto !important; margin: 0 !important; text-align: left !important; } .alert-desc, .alert-location { font-size: 0.8rem !important; word-break: break-word !important; line-height: 1.4 !important; } .alert-badge { align-self: flex-start !important; } } @media (max-width: 480px) { .logo-text { font-size: 1.5rem !important; } .nav-btn { font-size: 0.68rem !important; padding: 6px 2px !important; } .section-title { font-size: 1.2rem !important; } .developer-card { padding: 1.5rem !important; } } @keyframes steam-pulse { 0% { opacity: 0.3; transform: scaleY(0.9); } 100% { opacity: 0.75; transform: scaleY(1.1); } } @media (max-width: 992px) { .crisis-story-section { grid-template-columns: 1fr !important; gap: 2rem !important; } .sticky-visualizer-panel { position: relative !important; top: 0 !important; height: auto !important; padding: 1.5rem !important; } .story-scroll-cards { gap: 3rem !important; padding-bottom: 2rem !important; } } /* ========================================== AETERNA AI v4.1.0 — DATA PROVENANCE & GOVTECH ENHANCEMENTS ========================================== */ /* 1. Data Provenance Badges */ .badge { display: inline-flex; align-items: center; gap: 4px; padding: 3px 8px; border-radius: 4px; font-family: var(--font-mono); font-size: 0.68rem; font-weight: 700; letter-spacing: 0.5px; text-transform: uppercase; white-space: nowrap; } .badge-observed { background: rgba(56, 189, 248, 0.12); color: #38bdf8; border: 1px solid rgba(56, 189, 248, 0.4); } .badge-derived { background: rgba(168, 85, 247, 0.12); color: #c084fc; border: 1px solid rgba(168, 85, 247, 0.4); } .badge-estimated { background: rgba(245, 158, 11, 0.12); color: #fbbf24; border: 1px solid rgba(245, 158, 11, 0.4); } .badge-forecast { background: rgba(112, 173, 71, 0.15); color: #70AD47; border: 1px solid rgba(112, 173, 71, 0.4); } .badge-simulation { background: rgba(20, 184, 166, 0.12); color: #2dd4bf; border: 1px solid rgba(20, 184, 166, 0.4); } .badge-unverified { background: rgba(239, 68, 68, 0.12); color: #f87171; border: 1px solid rgba(239, 68, 68, 0.4); } .badge-pending { background: rgba(148, 163, 184, 0.12); color: #94a3b8; border: 1px solid rgba(148, 163, 184, 0.3); } .badge-prototype { background: rgba(245, 158, 11, 0.15); color: #f59e0b; border: 1px solid rgba(245, 158, 11, 0.5); } /* 2. Header Prototype Indicator */ .status-indicator.prototype { background-color: #f59e0b; box-shadow: 0 0 8px #f59e0b; } /* 3. Hero Badge Container */ .hero-badge-container { display: flex; gap: 8px; margin-bottom: 1.2rem; flex-wrap: wrap; } .feature-badge { margin-top: 1rem; } /* 4. Stat Card Header Row */ .stat-card-header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 0.4rem; width: 100%; } .log-header-row { display: flex; justify-content: space-between; align-items: center; margin-bottom: 0.3rem; width: 100%; } /* 5. Data Status & Provenance Banner */ .data-status-banner { background: rgba(245, 158, 11, 0.06); border: 1px solid rgba(245, 158, 11, 0.35); border-radius: 10px; padding: 1.2rem 1.5rem; margin-bottom: 1.5rem; box-shadow: 0 4px 20px rgba(0, 0, 0, 0.2); } .status-banner-content { display: flex; gap: 14px; align-items: flex-start; } .status-banner-icon { font-size: 1.5rem; line-height: 1; } .status-banner-title { font-family: var(--font-mono); font-size: 0.85rem; color: #fbbf24; margin-bottom: 0.4rem; } .status-highlight { color: #fef08a; font-weight: 700; margin-left: 6px; } .status-banner-disclaimer { font-size: 0.8rem; color: rgba(241, 248, 240, 0.82); line-height: 1.5; margin: 0; } /* 6. Active Sources Quick Strip */ .sources-strip { border-radius: 8px; } .source-tag { display: inline-flex; align-items: center; gap: 6px; font-family: var(--font-mono); font-size: 0.74rem; color: var(--text-muted); padding: 4px 8px; border-radius: 4px; background: rgba(255, 255, 255, 0.02); border: 1px solid rgba(255, 255, 255, 0.06); } .source-tag .dot { width: 6px; height: 6px; border-radius: 50%; background: #64748b; } .source-tag.active .dot { background: #38bdf8; box-shadow: 0 0 6px #38bdf8; } /* 7. Info Pill Button */ .info-pill-btn { background: rgba(112, 173, 71, 0.08); border: 1px solid rgba(112, 173, 71, 0.35); color: var(--cyan); border-radius: 6px; padding: 4px 10px; cursor: pointer; display: inline-flex; align-items: center; gap: 5px; font-family: var(--font-mono); font-size: 0.75rem; font-weight: 600; transition: all 0.2s; } .info-pill-btn:hover { background: rgba(112, 173, 71, 0.2); border-color: var(--cyan); } /* 8. Model Info Modal */ .modal-overlay { position: fixed; top: 0; left: 0; width: 100vw; height: 100vh; background: rgba(0, 0, 0, 0.78); backdrop-filter: blur(8px); -webkit-backdrop-filter: blur(8px); display: flex; justify-content: center; align-items: center; z-index: 9999; padding: 1.5rem; } .modal-card { width: 100%; max-width: 680px; max-height: 90vh; overflow-y: auto; padding: 2.2rem; border-radius: 16px; background: #0B130E; border: 1px solid var(--border-color); box-shadow: 0 20px 50px rgba(0, 0, 0, 0.6); } .modal-header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 1.5rem; } .modal-title { font-family: var(--font-display); font-size: 1.15rem; color: var(--text-main); letter-spacing: 1px; } .modal-close-btn { background: none; border: none; font-size: 1.8rem; color: var(--text-muted); cursor: pointer; line-height: 1; transition: color 0.2s; } .modal-close-btn:hover { color: #fff; } .modal-meta-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 1.2rem; } .meta-item { display: flex; flex-direction: column; gap: 4px; } .meta-label { font-family: var(--font-mono); font-size: 0.72rem; color: var(--text-muted); text-transform: uppercase; } .meta-val { font-size: 0.9rem; color: var(--text-main); font-weight: 600; } /* 9. Methodology Pipeline Flow */ .pipeline-steps-grid { display: flex; align-items: center; justify-content: space-between; gap: 8px; flex-wrap: wrap; } .pipeline-step-card { flex: 1; min-width: 140px; background: rgba(255, 255, 255, 0.02); border: 1px solid var(--border-color); border-radius: 8px; padding: 1.2rem 1rem; text-align: center; display: flex; flex-direction: column; align-items: center; gap: 8px; transition: transform 0.2s, border-color 0.2s; } .pipeline-step-card:hover { transform: translateY(-2px); border-color: rgba(112, 173, 71, 0.4); } .pipeline-step-card.highlight-card { background: rgba(112, 173, 71, 0.06); border-color: rgba(112, 173, 71, 0.4); } .step-num { font-family: var(--font-mono); font-size: 0.75rem; color: var(--cyan); font-weight: 700; } .pipeline-step-card h4 { font-family: var(--font-display); font-size: 0.82rem; color: var(--text-main); margin: 0; text-transform: uppercase; letter-spacing: 0.5px; } .pipeline-step-card p { font-size: 0.72rem; color: var(--text-muted); line-height: 1.4; margin: 0; } .pipeline-arrow { color: var(--cyan); font-size: 1.2rem; font-weight: 700; opacity: 0.7; } /* 10. Data Provenance Cards & Tables */ .provenance-cards-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 1rem; } .prov-card { background: rgba(255, 255, 255, 0.02); border: 1px solid var(--border-color); border-radius: 8px; padding: 1.2rem; display: flex; flex-direction: column; gap: 8px; align-items: flex-start; } .prov-card h4 { font-family: var(--font-display); font-size: 0.95rem; color: var(--text-main); margin: 0; } .prov-card p { font-size: 0.8rem; color: var(--text-muted); line-height: 1.5; margin: 0; } .table-responsive { width: 100%; overflow-x: auto; } .prov-table { width: 100%; border-collapse: collapse; font-size: 0.85rem; } .prov-table th, .prov-table td { padding: 10px 14px; text-align: left; border-bottom: 1px solid rgba(255, 255, 255, 0.06); } .prov-table th { font-family: var(--font-mono); font-size: 0.75rem; color: var(--text-muted); text-transform: uppercase; background: rgba(0, 0, 0, 0.25); } .prov-table td { color: var(--text-main); } .status-tag { display: inline-block; padding: 2px 6px; border-radius: 4px; font-family: var(--font-mono); font-size: 0.7rem; font-weight: 600; } .status-tag.active { background: rgba(34, 197, 94, 0.15); color: #22c55e; } .status-tag.pending { background: rgba(245, 158, 11, 0.15); color: #f59e0b; } @media (max-width: 768px) { .pipeline-arrow { display: none; } .modal-meta-grid { grid-template-columns: 1fr; } } /* ========================================== PAGE-HOME / SMART CITY OVERVIEW STYLING ========================================== */ /* Hero Section */ .hero-section-hud { display: grid; grid-template-columns: 1.25fr 0.85fr; gap: 1.4rem; margin-bottom: 2rem; align-items: stretch; } .hero-content-hud { display: flex; flex-direction: column; justify-content: center; } .hero-badge-container { display: flex; gap: 6px; flex-wrap: wrap; align-items: center; margin-bottom: 0.6rem; } .hero-title-hud { font-family: var(--font-display); font-size: 2.1rem; font-weight: 800; line-height: 1.2; color: #FFFFFF; background: linear-gradient(135deg, #FFFFFF 40%, var(--accent-primary) 100%); -webkit-background-clip: text; -webkit-text-fill-color: transparent; margin: 0.4rem 0 0.8rem 0; letter-spacing: 0.5px; } .hero-subtitle-hud { font-size: 0.88rem; color: var(--text-secondary); line-height: 1.6; margin-bottom: 1.2rem; max-width: 640px; } .hero-actions-hud { display: flex; gap: 10px; align-items: center; flex-wrap: wrap; } /* Hero Context Panel */ .hero-context-panel { display: flex; flex-direction: column; justify-content: space-between; padding: 1.2rem 1.3rem; } .hero-stat-grid-hud { display: grid; grid-template-columns: 1fr 1fr; gap: 0.9rem; margin: 0.85rem 0; } .hero-stat-card-hud { background: rgba(0, 0, 0, 0.3); border: 1px solid var(--border-subtle); border-radius: 8px; padding: 0.9rem 1rem; display: flex; flex-direction: column; gap: 2px; } .h-stat-label { font-family: var(--font-mono); font-size: 0.66rem; color: var(--text-muted); text-transform: uppercase; letter-spacing: 0.4px; } .h-stat-value { font-family: var(--font-display); font-size: 1.5rem; font-weight: 800; color: var(--text-primary); line-height: 1.2; } .h-stat-value .unit { font-size: 0.78rem; font-weight: 400; color: var(--text-muted); } .h-stat-meta { margin-top: 4px; } .hero-context-footer { display: flex; flex-direction: column; gap: 4px; border-top: 1px solid rgba(255, 255, 255, 0.06); padding-top: 0.75rem; } .ctx-tag { font-family: var(--font-mono); font-size: 0.68rem; color: var(--text-muted); } /* Features / 4 Pillars Section */ .features-section-hud { margin-bottom: 2.2rem; } .section-header-hud { margin-bottom: 1rem; } .section-title-hud { font-family: var(--font-display); font-size: 1.15rem; font-weight: 800; color: var(--text-primary); text-transform: uppercase; letter-spacing: 1px; border-left: 3px solid var(--accent-primary); padding-left: 8px; margin: 0; line-height: 1.2; } .section-subtitle-hud { font-size: 0.78rem; color: var(--text-muted); margin: 3px 0 0 0; } .features-grid-hud { display: grid; grid-template-columns: repeat(4, 1fr); gap: 0.9rem; margin-top: 0.85rem; } .feature-card-hud { background: var(--bg-surface); border: 1px solid var(--border-subtle); border-radius: 8px; padding: 1.1rem; display: flex; flex-direction: column; transition: all 0.22s ease; } .feature-card-hud:hover { border-color: var(--border-hover); transform: translateY(-2px); } .feature-header-hud { display: flex; justify-content: space-between; align-items: center; margin-bottom: 0.5rem; } .feature-num-hud { font-family: var(--font-display); font-size: 1.35rem; font-weight: 800; color: var(--accent-primary); } .feature-name-hud { font-family: var(--font-display); font-size: 0.92rem; font-weight: 700; color: var(--text-primary); margin: 0.3rem 0; } .feature-desc-hud { font-size: 0.78rem; color: var(--text-secondary); line-height: 1.5; margin: 0; } /* Accumulation Tower & Crisis Story Section */ .crisis-story-section-hud { display: grid; grid-template-columns: 1fr 1.3fr; gap: 1.4rem; margin-bottom: 2.2rem; align-items: flex-start; } .sticky-visualizer-panel-hud { position: sticky; top: 80px; padding: 1.2rem 1.4rem; display: flex; flex-direction: column; align-items: center; } .threejs-container-hud { width: 100%; max-width: 240px; height: 240px; position: relative; background: rgba(0, 0, 0, 0.35); border-radius: 8px; border: 1px solid var(--border-subtle); display: flex; justify-content: center; align-items: center; overflow: hidden; } .tower-label { position: absolute; right: 8px; font-family: var(--font-mono); font-size: 8px; font-weight: 700; padding: 2px 5px; border-radius: 3px; pointer-events: none; z-index: 2; } .tower-label.critical { top: 10px; color: var(--status-danger); background: rgba(239, 68, 68, 0.15); border: 1px solid rgba(239, 68, 68, 0.3); } .tower-label.warning { top: 50%; transform: translateY(-50%); color: var(--status-warning); background: rgba(245, 158, 11, 0.15); border: 1px solid rgba(245, 158, 11, 0.3); } .tower-label.normal { bottom: 10px; color: var(--status-forecast); background: rgba(34, 197, 94, 0.15); border: 1px solid rgba(34, 197, 94, 0.3); } .tower-status-hud { margin-top: 1rem; text-align: center; } .tower-status-label { display: block; font-family: var(--font-mono); font-size: 0.68rem; color: var(--text-muted); text-transform: uppercase; letter-spacing: 0.4px; } .tower-status-val { font-family: var(--font-display); font-size: 1.6rem; font-weight: 800; color: var(--status-warning); } .story-scroll-cards-hud { display: flex; flex-direction: column; gap: 0.9rem; } .story-card-hud { padding: 1.2rem 1.4rem; background: var(--bg-surface); border: 1px solid var(--border-subtle); border-radius: 8px; border-left: 4px solid var(--border-subtle); transition: all 0.22s ease; } .story-card-hud:hover { border-color: var(--border-hover); transform: translateX(3px); } .story-card-hud.stage-morning { border-left-color: #22C55E; } .story-card-hud.stage-midday { border-left-color: #F59E0B; } .story-card-hud.stage-eod { border-left-color: #EF4444; } .story-card-header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 0.3rem; } .stage-tag { font-family: var(--font-mono); font-size: 0.7rem; font-weight: 700; letter-spacing: 0.5px; text-transform: uppercase; } .stage-tag.morning { color: #22C55E; } .stage-tag.midday { color: #F59E0B; } .stage-tag.eod { color: #EF4444; } .stage-volume { font-family: var(--font-mono); font-size: 0.76rem; font-weight: 700; color: var(--text-primary); } .story-title { font-family: var(--font-display); font-size: 1.05rem; font-weight: 700; color: var(--text-primary); margin: 0.2rem 0 0.35rem 0; } .story-desc { font-size: 0.8rem; color: var(--text-secondary); line-height: 1.55; margin: 0; } /* Developer Section HUD */ .developers-section-hud { margin-bottom: 2rem; display: flex; justify-content: center; } .developer-card-hud { max-width: 640px; width: 100%; text-align: center; padding: 1.8rem 2rem; background: var(--bg-surface); border: 1px solid var(--border-subtle); border-radius: 10px; } .dev-role-hud { font-family: var(--font-mono); font-size: 0.72rem; color: var(--accent-primary); letter-spacing: 1px; text-transform: uppercase; font-weight: 600; display: block; margin-bottom: 4px; } .dev-name-hud { font-family: var(--font-display); font-size: 1.35rem; font-weight: 800; color: var(--text-primary); margin-bottom: 0.5rem; } .dev-desc-hud { font-size: 0.82rem; color: var(--text-secondary); line-height: 1.6; margin-bottom: 1.1rem; } .dev-links-hud { display: flex; gap: 10px; justify-content: center; align-items: center; flex-wrap: wrap; } /* Chart Summary Mini-Cards */ .chart-summary-bar { display: grid; grid-template-columns: repeat(4, 1fr); gap: 0.75rem; margin-top: 0.85rem; padding-top: 0.85rem; border-top: 1px solid rgba(255, 255, 255, 0.06); } .chart-summary-item { background: rgba(0, 0, 0, 0.3); border: 1px solid var(--border-subtle); border-radius: 7px; padding: 8px 12px; display: flex; flex-direction: column; } .visually-hidden { display: none !important; } /* Responsive Rules for Home & Predictor */ @media (max-width: 1100px) { .hero-section-hud { grid-template-columns: 1fr; } .features-grid-hud { grid-template-columns: repeat(2, 1fr); } .crisis-story-section-hud { grid-template-columns: 1fr; } .sticky-visualizer-panel-hud { position: relative; top: 0; } } @media (max-width: 640px) { .features-grid-hud { grid-template-columns: 1fr; } .hero-stat-grid-hud { grid-template-columns: 1fr; } .hero-title-hud { font-size: 1.6rem; } }