:root { font-family: "Space Grotesk", "Avenir Next", "Segoe UI", sans-serif; color: #f3f6fb; background: radial-gradient(circle at top left, rgba(47, 109, 186, 0.26), transparent 28%), radial-gradient(circle at 80% 10%, rgba(21, 191, 156, 0.16), transparent 24%), linear-gradient(180deg, #06111f 0%, #08192c 44%, #040b14 100%); color-scheme: dark; } * { box-sizing: border-box; } body { margin: 0; min-height: 100vh; background: transparent; } button, progress { font: inherit; } #root { min-height: 100vh; } .app-shell { position: relative; min-height: 100vh; overflow: hidden; padding: 32px; } .ambient { position: absolute; border-radius: 999px; filter: blur(60px); pointer-events: none; } .ambient-a { top: 6%; left: -4%; width: 340px; height: 340px; background: rgba(34, 144, 255, 0.18); } .ambient-b { right: -3%; bottom: 12%; width: 320px; height: 320px; background: rgba(70, 255, 188, 0.13); } .topbar, .layout { position: relative; z-index: 1; } .topbar { display: flex; align-items: center; justify-content: space-between; gap: 24px; margin-bottom: 24px; } .brand { display: flex; align-items: center; gap: 16px; } .brand-mark { display: grid; place-items: center; width: 44px; height: 44px; border-radius: 14px; background: linear-gradient(145deg, rgba(50, 118, 201, 0.9), rgba(18, 188, 160, 0.8)); box-shadow: 0 18px 50px rgba(17, 91, 165, 0.25); } .eyebrow { margin: 0 0 6px; font-size: 0.72rem; letter-spacing: 0.18em; text-transform: uppercase; color: rgba(173, 211, 255, 0.72); } .brand h2, .card h3, .globe-overlay h1 { margin: 0; font-weight: 600; } .task-switcher { display: flex; flex-wrap: wrap; gap: 10px; } .task-pill { border: 1px solid rgba(163, 188, 224, 0.2); border-radius: 999px; background: rgba(8, 19, 34, 0.8); color: #dbe9ff; padding: 10px 16px; text-transform: capitalize; cursor: pointer; } .task-pill.active { background: linear-gradient(135deg, #184f77, #1ca594); border-color: transparent; } .layout { display: grid; grid-template-columns: minmax(0, 1.45fr) minmax(340px, 0.8fr); gap: 24px; } .panel { min-width: 0; } .panel-main { display: flex; } .globe-shell, .card, .metric-card { border: 1px solid rgba(164, 194, 231, 0.12); background: linear-gradient(180deg, rgba(8, 21, 37, 0.94), rgba(5, 14, 24, 0.92)); box-shadow: 0 20px 60px rgba(0, 0, 0, 0.24); } .globe-shell { position: relative; flex: 1; min-height: 760px; border-radius: 30px; overflow: hidden; } .globe-frame { position: relative; display: grid; place-items: center; min-height: 760px; background: radial-gradient(circle at 50% 44%, rgba(88, 160, 255, 0.12), transparent 32%), radial-gradient(circle at 50% 50%, rgba(9, 23, 40, 0.22), transparent 58%); } .globe-backdrop { position: absolute; inset: 0; background: radial-gradient(circle at 20% 20%, rgba(82, 153, 255, 0.18), transparent 22%), radial-gradient(circle at 70% 78%, rgba(42, 198, 164, 0.14), transparent 24%), linear-gradient(180deg, rgba(8, 18, 32, 0.7), rgba(4, 10, 18, 0.9)); } .globe-frame canvas { cursor: grab; border-radius: 50%; } .globe-frame canvas:active { cursor: grabbing; } .transfer { fill: none; stroke-width: 2.2; stroke-linecap: round; stroke-dasharray: 8 10; opacity: 0.95; } .transfer-capture { stroke-dasharray: 5 14; } .station-ring { fill: rgba(22, 244, 208, 0.12); stroke: rgba(144, 255, 238, 0.36); } .station-node { fill: #8cffef; } .satellite-orbit-glow { fill: rgba(126, 193, 255, 0.14); } .satellite-node { stroke: rgba(255, 255, 255, 0.7); stroke-width: 1; } .satellite-node.action-capture { fill: #ffb86b; } .satellite-node.action-downlink { fill: #7cf7c9; } .satellite-node.action-maintain { fill: #9caaff; } .satellite-node.action-idle { fill: #95a2bb; } .globe-marker { display: grid; place-items: center; pointer-events: none; } .globe-marker span { display: block; width: var(--marker-size); height: var(--marker-size); border-radius: 999px; background: var(--marker-color); border: 2px solid rgba(255, 255, 255, 0.72); box-shadow: 0 0 0 4px rgba(128, 196, 255, 0.12), 0 0 22px var(--marker-color); } .globe-marker.station span { width: calc(var(--marker-size) * 0.88); height: calc(var(--marker-size) * 0.88); border-color: rgba(187, 255, 245, 0.84); box-shadow: 0 0 0 5px rgba(94, 255, 228, 0.12), 0 0 16px rgba(94, 255, 228, 0.28); } .globe-marker.region span { width: calc(var(--marker-size) * 0.84); height: calc(var(--marker-size) * 0.84); border-color: rgba(255, 231, 205, 0.9); box-shadow: 0 0 0 4px rgba(255, 195, 121, 0.14), 0 0 14px rgba(255, 195, 121, 0.24); } .globe-overlay { position: absolute; inset: auto 24px 24px 24px; display: flex; align-items: end; justify-content: space-between; gap: 20px; } .globe-overlay h1 { max-width: 520px; font-size: clamp(2.1rem, 4vw, 3.6rem); line-height: 0.98; } .overlay-metrics { display: grid; grid-template-columns: repeat(3, minmax(92px, 1fr)); gap: 12px; } .overlay-metrics div, .weather-card, .metric-card { border-radius: 18px; background: rgba(6, 14, 24, 0.78); border: 1px solid rgba(172, 197, 227, 0.12); } .overlay-metrics div { padding: 14px 16px; } .overlay-metrics span, .metric-card span, .weather-card small, .meter-row label, .compact-row span, .task-item span:last-child, .meta-row span { color: rgba(206, 222, 246, 0.72); } .overlay-metrics strong, .metric-card strong, .weather-card strong { display: block; margin-top: 8px; font-size: 1.25rem; } .panel-side { display: grid; gap: 18px; } .card { border-radius: 24px; padding: 20px; } .card-head { display: flex; align-items: start; justify-content: space-between; gap: 12px; margin-bottom: 16px; } .controls-row { display: flex; gap: 12px; margin-bottom: 12px; } .action-button, .ghost-button { display: inline-flex; align-items: center; justify-content: center; gap: 8px; border-radius: 14px; border: 1px solid rgba(158, 193, 235, 0.14); background: rgba(12, 24, 40, 0.92); color: #eff5ff; padding: 12px 16px; cursor: pointer; } .action-button:disabled, .ghost-button:disabled, .task-pill:disabled { opacity: 0.58; cursor: not-allowed; } .action-button.primary { background: linear-gradient(135deg, #155b95, #1fa491); border-color: transparent; } .ghost-button { width: 100%; } .stats-grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 14px; } .metric-card { padding: 16px; } .metric-icon { margin-bottom: 12px; color: #8fd8ff; } .list { display: grid; gap: 12px; } .list.condensed { gap: 10px; } .list-item, .compact-row, .task-item { border-radius: 18px; background: rgba(9, 18, 31, 0.82); border: 1px solid rgba(169, 191, 223, 0.08); } .list-item { padding: 14px; } .list-title, .compact-row, .task-item, .meta-row, .meter-row { display: flex; align-items: center; justify-content: space-between; gap: 10px; } .meter-row { margin-top: 10px; grid-template-columns: auto 1fr auto; } .meter-row progress { flex: 1; height: 8px; border-radius: 999px; overflow: hidden; appearance: none; } .meter-row progress::-webkit-progress-bar { background: rgba(90, 108, 133, 0.25); } .meter-row progress::-webkit-progress-value { background: linear-gradient(90deg, #59b8ff, #7cf7c9); } .status-badge { border-radius: 999px; padding: 6px 10px; text-transform: capitalize; font-size: 0.78rem; background: rgba(140, 161, 194, 0.14); } .status-badge.capture { background: rgba(255, 184, 107, 0.16); color: #ffcf99; } .status-badge.downlink { background: rgba(124, 247, 201, 0.14); color: #9bf7d6; } .status-badge.maintain { background: rgba(157, 170, 255, 0.14); color: #b5bfff; } .compact-row, .task-item { padding: 12px 14px; } .compact-row div, .task-item { display: flex; flex-direction: column; } .active-transfer { border-color: rgba(124, 247, 201, 0.22); } .weather-grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 12px; margin-bottom: 14px; } .weather-card { padding: 14px; } .weather-card span { display: block; color: rgba(212, 225, 248, 0.72); text-transform: capitalize; } .task-list { display: grid; gap: 10px; } .loading-state, .error-text { color: #ffe5d2; } .loading-state { display: grid; place-items: center; min-height: 420px; font-size: 1.1rem; } @media (max-width: 1180px) { .layout { grid-template-columns: 1fr; } .globe-shell { min-height: auto; } } @media (max-width: 720px) { .app-shell { padding: 18px; } .topbar, .controls-row, .globe-overlay { flex-direction: column; align-items: stretch; } .overlay-metrics, .stats-grid, .weather-grid { grid-template-columns: 1fr; } .globe-overlay { position: static; padding: 0 18px 18px; } }