:root{--bg:#07090c;--panel:#0d1117;--panel2:#11161d;--line:#222a34;--line2:#303a46;--text:#f3f5f7;--muted:#87919e;--dim:#59636f;--white:#fff;--cyan:#78d9f5;--blue:#4ca3ff;--good:#4fd1a1;--warn:#ffbd4a;--bad:#ff5c66;--shadow:0 16px 50px #0009}*{box-sizing:border-box}html,body{margin:0;width:100%;height:100%;overflow:hidden;background:var(--bg);color:var(--text);font-family:Inter,"SF Pro Display","Helvetica Neue",Arial,"Noto Sans JP",sans-serif;font-variant-numeric:tabular-nums}.app{height:100vh;display:grid;grid-template-columns:290px minmax(450px,1fr) 285px 330px;grid-template-rows:70px minmax(310px,1.55fr) minmax(190px,.8fr) minmax(145px,.65fr);gap:1px;background:#1a2028}.header{grid-column:1/-1;background:#090c10;display:grid;grid-template-columns:minmax(410px,1fr) 210px 220px auto;align-items:center;padding:0 16px;border-bottom:1px solid #252c34}.brand{display:flex;align-items:center;gap:12px}.brand-mark{width:40px;height:40px;border:1px solid #56616e;border-radius:50%;display:grid;place-items:center;position:relative}.brand-mark:before{content:"";position:absolute;width:28px;height:1px;background:#56616e;transform:rotate(-40deg)}.brand-mark span{font-size:10px;font-weight:800;background:#090c10;padding:3px;z-index:1}.brand h1{font-size:13px;letter-spacing:2.3px;margin:0 0 5px;font-weight:650}.brand p,.panel-head p{margin:0;color:var(--muted);font-size:9px;letter-spacing:.5px}.service{justify-self:center;border:1px solid #254d42;background:#0e211c;color:var(--good);height:34px;display:flex;align-items:center;padding:0 14px;gap:8px;font-size:10px;font-weight:800;letter-spacing:1px}.service i{width:7px;height:7px;background:var(--good);border-radius:50%;box-shadow:0 0 10px var(--good)}.service.alarm{border-color:#653038;background:#261317;color:var(--bad)}.service.alarm i{background:var(--bad);box-shadow:0 0 10px var(--bad)}.clock{text-align:right;padding-right:18px}.clock strong{font-size:22px;letter-spacing:2px;display:block}.clock span{font-size:8px;color:var(--muted);letter-spacing:.8px}.controls{display:flex;align-items:center;gap:7px}.segment{display:flex;border:1px solid #313945;background:#11161c}.segment button,.incident{height:30px;border:0;border-right:1px solid #313945;background:transparent;color:#7e8996;font-size:8px;font-weight:800;letter-spacing:.8px;padding:0 9px;cursor:pointer}.segment button:last-child{border:0}.segment button.active{background:#e9edf1;color:#0a0c0f}.incident{background:#211418;border:1px solid #67303a;color:#ff747c;padding:0 12px}.incident:hover{background:#321920}.left{grid-row:2/-1;background:#0a0e13;padding:15px 14px;overflow:hidden}.section-title{font-size:8px;letter-spacing:1.7px;color:#7c8794;font-weight:800;border-bottom:1px solid #202731;padding-bottom:8px}.section-title.gap{margin-top:16px}.hero{padding:15px 2px 8px}.hero label{font-size:9px;color:var(--muted);display:block}.hero strong{font-size:35px;line-height:1.2;display:block;letter-spacing:-1px}.hero svg{width:100%;height:36px;margin:4px 0}.hero small{font-size:9px;color:var(--muted)}.kpis{display:grid;grid-template-columns:1fr 1fr;gap:5px}.kpi{background:#10151b;border:1px solid #202731;padding:9px 10px;min-height:63px}.kpi label{font-size:8px;color:var(--muted);display:block}.kpi strong{display:block;font-size:20px;margin-top:5px}.kpi small{font-size:8px;color:var(--dim)}.kpi.warn{border-left:2px solid var(--warn)}.fleet-row{display:grid;grid-template-columns:70px 1fr 25px;align-items:center;gap:8px;margin:9px 0;font-size:9px;color:var(--muted)}.bar{height:4px;background:#222a33}.bar i{display:block;height:100%;background:var(--good)}.fleet-row.warn .bar i{background:var(--warn)}.resilience .rrow{display:flex;justify-content:space-between;padding:7px 0;border-bottom:1px solid #1b222b;font-size:9px}.rrow span{color:var(--muted)}.alerts{margin-top:4px}.alert{position:relative;padding:8px 7px 8px 16px;border-bottom:1px solid #202731}.alert:before{content:"";position:absolute;left:4px;top:12px;width:5px;height:5px;border-radius:50%;background:var(--good)}.alert.warn:before{background:var(--warn)}.alert.bad:before{background:var(--bad)}.alert b{font-size:9px;display:block;font-weight:650}.alert p{font-size:8px;color:var(--muted);margin:3px 0 0;line-height:1.35}.panel{background:var(--panel);min-width:0;min-height:0;overflow:hidden}.map-panel{grid-column:2/4;grid-row:2}.airport-panel{grid-column:4;grid-row:2}.movement-panel{grid-column:2;grid-row:3}.rotation-panel{grid-column:2;grid-row:4}.detail{grid-column:3/5;grid-row:3/5;background:#0a0e13;overflow:auto}.panel-head{height:43px;border-bottom:1px solid #202731;padding:10px 13px;display:flex;align-items:center;justify-content:space-between}.panel-head h2{font-size:10px;letter-spacing:.8px;margin:0 0 4px;text-transform:uppercase}.legend{display:flex;gap:13px;font-size:7px;color:var(--muted)}.legend span{display:flex;align-items:center;gap:5px}.dot{display:inline-block;width:6px;height:6px;border-radius:50%}.dot.live{background:var(--cyan);box-shadow:0 0 6px var(--cyan)}.dot.ground{border:1px solid #8993a0}.legend .line{width:15px;height:1px;background:#3d4855}.map-wrap{height:calc(100% - 43px);position:relative;background:radial-gradient(circle at 68% 45%,#14202b 0,#0c1219 39%,#090d12 75%)}#map{width:100%;height:100%}.map-note{position:absolute;bottom:10px;left:12px;color:#68727f;font-size:7px;line-height:1.5;letter-spacing:.7px}.land{fill:#151c24;stroke:#2d3742;stroke-width:1}.route{fill:none;stroke:#3b4652;stroke-width:1;stroke-dasharray:3 3}.route.future{stroke:var(--warn);opacity:.7}.airport-node{cursor:pointer}.airport-node circle{fill:#0d1218;stroke:#aab4bf;stroke-width:1.2}.airport-node.hub circle{stroke:var(--cyan);stroke-width:2}.airport-node text{fill:#d6dce2;font-size:9px;font-weight:700}.airport-node .city{fill:#687481;font-size:7px;font-weight:400}.plane{cursor:pointer}.plane .pulse{fill:none;stroke:var(--cyan);opacity:.5;animation:pulse 2s infinite}.plane .body{fill:var(--cyan);filter:drop-shadow(0 0 5px #5bdcff)}.plane.delayed .body{fill:var(--warn);filter:drop-shadow(0 0 5px #ffbd4a)}.plane text{fill:#fff;font-size:8px;font-weight:800;paint-order:stroke;stroke:#080b0f;stroke-width:3px}.ground-plane{fill:#8c96a2}.airport-list{height:calc(100% - 43px);overflow:hidden}.airport-card{padding:11px 12px;border-bottom:1px solid #202731;cursor:pointer}.airport-card:hover{background:#121820}.airport-top{display:flex;align-items:baseline;justify-content:space-between}.airport-code{font-size:17px;font-weight:750;letter-spacing:1px}.airport-name{font-size:8px;color:var(--muted);margin-left:6px}.airport-status{font-size:7px;color:var(--good)}.airport-metrics{display:grid;grid-template-columns:repeat(3,1fr);gap:6px;margin-top:8px}.airport-metrics label{font-size:7px;color:var(--dim);display:block}.airport-metrics b{font-size:11px;font-weight:600}.density{height:3px;background:#252d36;margin-top:8px}.density i{display:block;height:100%;background:var(--cyan)}.movement{height:calc(100% - 43px);overflow:hidden}.flight-row{height:34px;display:grid;grid-template-columns:57px 44px 1fr 52px 55px 60px;align-items:center;padding:0 10px;border-bottom:1px solid #1e252e;font-size:8px;cursor:pointer}.flight-row:hover{background:#131922}.flight-row b{font-size:10px}.flight-row .route-name{color:#cbd1d7}.flight-row span{color:var(--muted)}.flight-row .status{color:var(--good);font-weight:700}.flight-row.delay .status{color:var(--warn)}.load-mini{height:3px;background:#272f38;width:45px}.load-mini i{display:block;height:100%;background:var(--cyan)}#rotation{width:100%;height:calc(100% - 43px)}.rot-label{fill:#7d8793;font-size:9px}.rot-grid{stroke:#27303a;stroke-width:1}.rot-line{stroke:#62707e;stroke-width:2}.rot-live{stroke:var(--cyan);stroke-width:3}.rot-delay{stroke:var(--warn);stroke-width:3}.rot-now{stroke:#fff;stroke-width:1;stroke-dasharray:2 3}.empty{height:100%;display:grid;place-content:center;text-align:center;color:#6d7783}.empty .aircraft-icon{font-size:36px;transform:rotate(45deg);margin-bottom:12px}.empty p{font-size:11px;margin:0 0 5px;color:#9da6b0}.empty span{font-size:8px}.detail-content{padding:15px}.detail-head{display:flex;justify-content:space-between;align-items:flex-start;border-bottom:1px solid #26303a;padding-bottom:12px}.detail-head .flight-no{font-size:26px;font-weight:800;letter-spacing:1px}.detail-head .state{font-size:8px;border:1px solid #376657;color:var(--good);padding:5px 8px}.detail-head .state.delay{border-color:#765926;color:var(--warn)}.city-pair{display:grid;grid-template-columns:1fr 30px 1fr;margin:15px 0;align-items:center}.city-pair .ap:last-child{text-align:right}.ap b{font-size:22px}.ap span{display:block;font-size:8px;color:var(--muted);margin-top:3px}.arrow{text-align:center;color:var(--muted)}.detail-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:5px}.detail-cell{background:#11171e;padding:9px}.detail-cell label{font-size:7px;color:var(--muted);display:block}.detail-cell b{font-size:11px;display:block;margin-top:5px}.detail-section{font-size:8px;letter-spacing:1.4px;color:#7c8794;margin:15px 0 7px}.progress-line{display:grid;grid-template-columns:85px 1fr 40px;gap:8px;align-items:center;margin:8px 0;font-size:8px}.progress-line span{color:var(--muted)}.progress-line .bar{height:5px}.progress-line b{text-align:right}.timeline{border-left:1px solid #37424e;margin-left:4px}.timeline div{position:relative;padding:0 0 10px 14px;font-size:8px;color:var(--muted)}.timeline div:before{content:"";position:absolute;left:-3px;top:2px;width:5px;height:5px;border-radius:50%;background:var(--good)}.timeline div.warn:before{background:var(--warn)}.timeline b{color:#dfe4e8;margin-right:8px}.toasts{position:fixed;right:14px;top:82px;z-index:20;width:330px}.toast{background:#161c24;border:1px solid #3a4652;border-left:3px solid var(--warn);padding:12px;box-shadow:var(--shadow);margin-bottom:8px;animation:toastIn .25s ease}.toast b{font-size:10px;display:block}.toast p{font-size:8px;color:var(--muted);margin:5px 0 0;line-height:1.5}@keyframes pulse{0%{r:8;opacity:.7}100%{r:20;opacity:0}}@keyframes toastIn{from{transform:translateX(20px);opacity:0}}@media(max-width:1300px){.app{grid-template-columns:250px minmax(420px,1fr) 250px 285px}.header{grid-template-columns:minmax(360px,1fr) 180px 180px auto}.segment button{padding:0 6px}.brand p{display:none}}
