html, body, #cesiumContainer { width: 100%; height: 100%; margin: 0; overflow: hidden; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif; background: #d9e0e2; } #cesiumContainer { opacity: 0; transition: opacity 180ms ease-out; } body.scene-ready #cesiumContainer { opacity: 1; } #controls, #diagnostics, #status, #vehicleInfoCard { position: absolute; z-index: 1; border-radius: 4px; background: rgba(20, 24, 28, 0.82); color: #fff; font-size: 12px; line-height: 1.45; box-shadow: 0 8px 24px rgba(0, 0, 0, 0.22); } #loadingOverlay { position: absolute; inset: 0; z-index: 3; display: grid; place-items: center; background: #d9e0e2; color: #1b2528; font-size: 13px; letter-spacing: 0; transition: opacity 220ms ease-out, visibility 220ms ease-out; } .loading-card { display: grid; grid-template-columns: 32px minmax(180px, 260px); gap: 12px; align-items: center; padding: 14px 16px; border: 1px solid rgba(70, 86, 90, 0.16); border-radius: 6px; background: rgba(244, 248, 248, 0.88); box-shadow: 0 12px 34px rgba(54, 68, 72, 0.20); } .loading-spinner { width: 28px; height: 28px; border: 3px solid rgba(42, 67, 72, 0.18); border-top-color: #147d8a; border-radius: 50%; animation: loading-spin 840ms linear infinite; } .loading-copy { display: grid; gap: 3px; } .loading-copy strong { font-size: 13px; font-weight: 650; } #loadingOverlay span { color: #526064; } .loading-bar { grid-column: 1 / -1; position: relative; height: 3px; overflow: hidden; border-radius: 999px; background: rgba(42, 67, 72, 0.12); } .loading-bar span { position: absolute; inset: 0 auto 0 0; width: 42%; border-radius: inherit; background: #147d8a; animation: loading-bar 1.2s ease-in-out infinite; } @keyframes loading-spin { to { transform: rotate(360deg); } } @keyframes loading-bar { 0% { transform: translateX(-110%); } 55% { transform: translateX(70%); } 100% { transform: translateX(250%); } } body.scene-ready #loadingOverlay { visibility: hidden; opacity: 0; } body.scene-error #loadingOverlay { color: #5b1414; } body.scene-error .loading-spinner { border-color: rgba(120, 30, 30, 0.18); border-top-color: #9f2f2f; animation-play-state: paused; } body.scene-error .loading-bar span { background: #9f2f2f; animation-play-state: paused; } #controls { top: 12px; left: 12px; display: flex; flex-direction: column; gap: 6px; padding: 8px; } #status { left: 12px; bottom: 12px; max-width: 560px; padding: 8px 10px; } #diagnostics { right: 12px; top: 12px; min-width: 280px; max-width: 360px; padding: 10px 12px; white-space: pre-line; } #vehicleInfoCard { left: 0; top: 0; width: min(300px, calc(100vw - 24px)); padding: 10px 12px; transform: translate(-50%, calc(-100% - 18px)); transform-origin: bottom center; pointer-events: auto; } #vehicleInfoCard::after { position: absolute; left: 50%; bottom: -7px; width: 12px; height: 12px; content: ""; transform: translateX(-50%) rotate(45deg); background: rgba(20, 24, 28, 0.82); } .vehicle-card-heading, .vehicle-card-actions { display: flex; align-items: center; justify-content: space-between; gap: 8px; } .vehicle-card-heading strong { font-size: 13px; } #vehicleInfoCard button { height: 27px; border: 0; border-radius: 4px; padding: 0 8px; background: #f2f5f7; color: #111; cursor: pointer; } #vehicleInfoDetails { display: grid; grid-template-columns: 88px 1fr; gap: 4px 8px; margin: 10px 0; } #vehicleInfoDetails dt { color: rgba(255, 255, 255, 0.62); } #vehicleInfoDetails dd { margin: 0; overflow-wrap: anywhere; } .vehicle-card-field { display: grid; gap: 4px; color: rgba(255, 255, 255, 0.78); } #vehicleIncidentNote { box-sizing: border-box; width: 100%; resize: vertical; border: 1px solid rgba(255, 255, 255, 0.30); border-radius: 4px; padding: 6px; background: rgba(255, 255, 255, 0.12); color: #fff; font: inherit; } .vehicle-card-actions { justify-content: flex-start; margin-top: 10px; } .vehicle-card-actions button[data-vehicle-status="breakdown"] { background: #f3c84b; } .vehicle-card-actions button[data-vehicle-status="accident"] { background: #e95950; } #controls button, #controls select { height: 28px; border: 0; border-radius: 4px; } #controls button { padding: 0 10px; background: #f2f5f7; color: #111; cursor: pointer; } #controls button:active:not(:disabled) { transform: translateY(1px); } #controls :disabled { opacity: 0.45; cursor: default; } #controls label:has(:disabled) { opacity: 0.45; } #controls input[type="range"] { width: 120px; } #controls label { display: inline-flex; gap: 5px; align-items: center; white-space: nowrap; } .control-label { color: rgba(255, 255, 255, 0.68); font-size: 11px; text-transform: uppercase; } .segmented-control { display: inline-flex; overflow: hidden; border: 1px solid rgba(255, 255, 255, 0.24); border-radius: 4px; } .segmented-control button { min-width: 58px; border-radius: 0 !important; background: transparent !important; color: rgba(255, 255, 255, 0.78) !important; } .segmented-control button + button { border-left: 1px solid rgba(255, 255, 255, 0.20) !important; } .segmented-control button[aria-pressed="true"] { background: #e7f2f2 !important; color: #143337 !important; } /* Playback / layers / camera each read as their own row of the panel. */ .control-group { display: flex; flex-wrap: wrap; gap: 8px 12px; align-items: center; } .control-group + .control-group { padding-top: 6px; border-top: 1px solid rgba(255, 255, 255, 0.16); } /* Per-asset checkboxes hang off the master "Scene" toggle. */ .control-subgroup { display: inline-flex; flex-wrap: wrap; gap: 8px 10px; align-items: center; padding-left: 10px; border-left: 1px solid rgba(255, 255, 255, 0.16); } .control-subgroup:empty { display: none; } .hidden { display: none; } /* This must outrank `#controls label { display: inline-flex }` above. */ #controls .hidden { display: none; } @media (max-width: 700px) { #controls { right: 10px; left: 10px; top: 10px; } #diagnostics { top: auto; right: 10px; bottom: 56px; left: 10px; min-width: 0; max-width: none; } #status { right: 10px; left: 10px; bottom: 10px; max-width: none; } }