/* Ready Aviator V21 "A · Quiet" interface for the IGI explorer (ported 20 Sep 2026).
   Tokens and sizes come from the approved mockups; treat the values as fixed. */
:root{
  font-family:Inter,system-ui,sans-serif;
  color-scheme:light;
  --ink:#173146;
  --navy:#183349;
  --muted:#60798b;
  --line:#d8e2e9;
  --paper:rgba(248,250,251,0.95);
  --white:#ffffff;
  --tint:#e5edf3;
  --tint-line:#b7cad9;
  --accent:#f19b47;
  --arriving:#3e745e;
  --departing:#2f6fa3;
  --parked:#a8741f;
  --stack:96px;
  color:var(--ink);
  background:#f8fafb;
  font-synthesis:none;
}
*{box-sizing:border-box}
body{margin:0}
button,select,input{font:inherit}
button,a,select{-webkit-tap-highlight-color:transparent}
button{cursor:pointer;color:inherit;border:0;background:none}
button:focus-visible,select:focus-visible,a:focus-visible,input:focus-visible{outline:2px solid var(--accent);outline-offset:2px}
[hidden]{display:none!important}
.offscreen{position:absolute!important;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip-path:inset(50%);white-space:nowrap;border:0}
.devonly{display:none}
#airport.dev .devonly{display:revert}

#airport{position:relative;width:100%;height:100svh;min-height:420px;overflow:hidden;background:#f8fafb}
#scene{position:absolute;inset:0;outline-offset:-4px}
#scene canvas{display:block;width:100%;height:100%;touch-action:none}
.vignette{display:none}

/* Every floating surface is the same flat paper card. */
#status-panel,#mode-switch,.sheet,#replay-bar,.dock,#focus-card,#rtr-panel{
  background:var(--paper);border:1px solid var(--line);color:var(--ink);
}

/* ---- top row: identity + status, and the mode switch ---- */
#topbar{position:absolute;left:24px;right:24px;top:20px;display:flex;justify-content:space-between;align-items:flex-start;gap:12px;pointer-events:none;z-index:6}
#topbar>*{pointer-events:auto}
#status-panel{padding:12px 16px;border-radius:11px;display:flex;flex-direction:column;gap:5px}
.status-id{display:flex;align-items:baseline;gap:9px}
.airport-code{font-size:21px;font-weight:700;letter-spacing:-0.5px}
.status-id h1{font-size:12px;font-weight:400;color:var(--muted);margin:0}
.status-line{display:flex;align-items:center;gap:8px;font-size:12px;color:var(--muted);margin:0}
.status-line strong{color:var(--ink);font-weight:600}
#status-dot{width:8px;height:8px;border-radius:50%;background:var(--accent);display:inline-block;flex-shrink:0}
#airport[data-mode="ws-live"] #status-dot{background:var(--arriving)}
#airport[data-mode="replay"] #status-dot{background:var(--departing)}

.seg,#mode-switch{background:var(--paper);border:1px solid var(--line);color:var(--ink);padding:3px;border-radius:9px;display:flex;gap:2px}
.seg button,#mode-switch button{min-height:44px;padding:0 16px;border:0;border-radius:6px;font-size:13px;font-weight:550;font-family:inherit;background:transparent;color:var(--ink);white-space:nowrap}
.seg button[aria-pressed="true"],.seg button.selected,#mode-switch button[aria-pressed="true"]{background:var(--navy);color:var(--white)}
#mode-phone{display:none;background:var(--navy);color:var(--white);border:1px solid var(--navy);padding:0 14px;min-height:44px;border-radius:7px;font-size:13px;font-weight:550}
#mode-area{position:relative}

/* ---- panels (Flights, Places, View, Demo traffic) ---- */
.sheet{position:absolute;left:24px;bottom:var(--stack);width:344px;max-width:calc(100% - 48px);max-height:calc(100svh - var(--stack) - 120px);overflow:auto;overscroll-behavior:contain;padding:16px;border-radius:14px;display:flex;flex-direction:column;gap:12px;z-index:5;scrollbar-width:thin}
#settings-panel,#demo-panel{width:360px}
#info{width:360px}
.sheet-heading{display:flex;align-items:center;justify-content:space-between;gap:12px}
.sheet-heading h2{font-size:15px;font-weight:650;margin:0}
.sheet-heading h2:focus{outline:none}
.sheet-heading [data-close-panel]{display:none}
.panel-hint{font-size:11px;line-height:1.6;color:var(--muted);margin:0}

.view-tabs{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:6px}
.view-tabs button{min-height:44px;border-radius:7px;border:1px solid var(--line);background:var(--white);color:var(--ink);font-size:13px;font-weight:550;text-align:left;padding:0 12px}
.view-tabs button.selected{background:var(--tint);border-color:var(--tint-line)}
.field-label{display:flex;flex-direction:column;gap:6px;font-size:11px;color:var(--muted)}
.field-label select,#replay-speed,#replay-day,#replay-clock{min-height:44px;border-radius:7px;border:1px solid var(--line);background:var(--white);color:var(--ink);padding:0 10px;font-size:13px;font-family:inherit}
.panel-link{display:flex;justify-content:space-between;align-items:center;gap:8px;min-height:44px;padding:0 12px;border:1px solid var(--line);background:var(--white);border-radius:7px;font-size:13px;font-weight:550;text-align:left}
.panel-link span{font-size:11px;color:var(--muted);font-weight:400}

.setting-note{margin:-4px 0 6px;font-size:11px;color:var(--muted)}
.setting-row{display:flex;justify-content:space-between;align-items:center;gap:12px;min-height:44px;font-size:13px}
.switch{width:46px;height:26px;border-radius:999px;border:1px solid var(--line);background:var(--white);position:relative;padding:0;flex-shrink:0}
.switch span{position:absolute;top:2px;left:2px;width:20px;height:20px;border-radius:50%;background:var(--tint-line);display:block;transition:left .15s}
.switch[aria-pressed="true"]{border-color:var(--navy);background:var(--navy)}
.switch[aria-pressed="true"] span{left:22px;background:var(--white)}
.switch:disabled{opacity:.45;cursor:default}

/* ---- flight and activity lists ---- */
.chiprow{display:flex;gap:6px;flex-wrap:wrap}
.chiprow button{min-height:36px;padding:0 12px;border:1px solid var(--line);background:var(--white);border-radius:7px;font-size:12px;font-weight:550;color:var(--muted)}
.chiprow button[aria-pressed="true"]{background:var(--tint);border-color:var(--tint-line);color:var(--ink)}
#flight-list,#activity-list{display:flex;flex-direction:column;gap:6px;max-height:min(300px,40svh);overflow-y:auto;overscroll-behavior:contain;scrollbar-width:thin}
.flight-row{display:grid;grid-template-columns:8px minmax(0,1fr);gap:10px;align-items:center;width:100%;min-height:44px;padding:8px 12px;border:1px solid var(--line);background:var(--white);border-radius:7px;text-align:left;color:var(--ink)}
.activity-row{display:grid;grid-template-columns:18px minmax(0,1fr) 12px;gap:10px;align-items:center;width:100%;min-height:44px;padding:8px 12px;border:1px solid var(--line);background:var(--white);border-radius:7px;text-align:left;color:var(--ink)}
.flight-row:hover,.activity-row:hover{background:var(--tint)}
.flight-row[aria-pressed="true"],.activity-row[aria-pressed="true"]{background:var(--tint);border-color:var(--tint-line)}
.flight-row i{width:8px;height:8px;border-radius:50%;background:var(--tint-line);display:block}
.flight-row.arriving i{background:var(--arriving)}
.flight-row.departing i{background:var(--departing)}
.flight-row.parked i{background:var(--parked)}
.activity-symbol{color:var(--muted);font-size:15px;text-align:center}
.activity-go{font-size:12px;color:var(--muted);text-align:right}
.flight-row strong,.activity-row strong{display:block;font-size:13px;font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.flight-row small,.activity-row small{display:block;margin-top:2px;font-size:11px;color:var(--muted);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}

/* ---- the selected flight card ---- */
#bottombar{display:contents}
.grabber{display:none}
#focus-card{position:absolute;left:24px;bottom:24px;width:372px;max-width:calc(100% - 48px);padding:18px;border-radius:14px;z-index:4;
  display:grid;grid-template-columns:minmax(0,1fr) auto;gap:14px;align-items:start;
  grid-template-areas:"head close" "route route" "steps steps" "facts facts" "actions actions" "note note"}
.card-head{grid-area:head;display:flex;flex-direction:column;gap:3px;min-width:0}
#clear-selection{grid-area:close}
#flight-route{grid-area:route}
#flight-steps{grid-area:steps}
#flight-facts{grid-area:facts}
.card-actions{grid-area:actions}
#flight-note{grid-area:note}
#flight-identity-short{display:none}
#flight-state{font-size:12px;font-weight:600;color:var(--muted)}
#flight-state.arriving{color:var(--arriving)}
#flight-state.departing{color:var(--departing)}
#flight-state.parked{color:var(--parked)}
#flight-number{font-size:26px;font-weight:700;letter-spacing:-0.8px;overflow:hidden;text-overflow:ellipsis}
#flight-identity{font-size:13px;color:var(--muted)}
#clear-selection{width:44px;height:44px;border-radius:7px;background:var(--white);border:1px solid var(--line);color:var(--ink);font-size:18px;flex-shrink:0}
#flight-route{display:flex;align-items:center;gap:12px;padding:12px 14px;background:var(--tint);border-radius:8px}
.route-end{display:flex;flex-direction:column;min-width:0}
.route-end.to{align-items:flex-end;margin-left:auto}
.route-end b{font-size:22px;font-weight:700;letter-spacing:-0.5px}
.route-end span{font-size:12px;color:var(--muted);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.route-line{flex-grow:1;height:1px;background:var(--tint-line)}
#flight-steps{display:flex;gap:6px}
.step{flex-grow:1;display:flex;flex-direction:column;gap:6px;min-width:0}
.step i{height:4px;border-radius:2px;background:var(--line);display:block}
.step span{font-size:11px;color:var(--muted);font-weight:400;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.step.done i{background:var(--state,var(--navy))}
.step.done span{color:var(--ink)}
.step.now span{font-weight:600;color:var(--ink)}
#flight-facts{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:14px}
.fact{display:flex;flex-direction:column;gap:2px;min-width:0}
.fact span{font-size:11px;color:var(--muted)}
.fact b{font-size:15px;font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.card-actions{display:flex;gap:8px}
#focus-follow{background:var(--navy);color:var(--white);border:1px solid var(--navy);padding:0 14px;min-height:44px;border-radius:7px;font-size:13px;font-weight:550}
#route-toggle{background:var(--white);color:var(--ink);border:1px solid var(--line);padding:0 14px;min-height:44px;border-radius:7px;font-size:13px;font-weight:550}
#route-toggle[aria-pressed="true"]{background:var(--tint);border-color:var(--tint-line)}
#flight-note{font-size:11px;color:var(--muted)}
.panel-open #focus-card{display:none!important}

/* ---- dock ---- */
.dock{position:absolute;left:50%;bottom:24px;transform:translateX(-50%);padding:6px;border-radius:11px;display:flex;gap:6px;z-index:6}
.dock button{background:var(--white);color:var(--ink);border:1px solid var(--line);padding:0 14px;min-height:44px;border-radius:7px;font-size:13px;font-weight:550;white-space:nowrap}
.dock button[aria-expanded="true"],.dock button[aria-pressed="true"]{background:var(--tint);border-color:var(--tint-line)}
.dock button:disabled{opacity:.45;cursor:default}
#demo-trigger{display:none}
#airport[data-mode="demo"] #demo-trigger{display:revert}

/* ---- replay timeline ---- */
#replay-bar{position:absolute;left:50%;bottom:var(--stack);transform:translateX(-50%);width:520px;max-width:calc(100% - 48px);padding:12px 16px;border-radius:14px;display:flex;flex-direction:column;gap:8px;z-index:4}
#airport[data-mode="replay"]{--stack:228px}
#airport[data-mode="replay"] #replay-bar{bottom:96px}
/* Live needs no timeline: its count and clock are in the status line. */
#airport[data-mode="ws-live"] #replay-bar{display:none}
.bar-row{display:flex;align-items:center;justify-content:space-between;gap:12px;font-size:12px;color:var(--muted)}
.bar-row strong{font-size:13px;font-weight:600;color:var(--ink)}
#replay-time,#replay-count{font-variant-numeric:tabular-nums}
/* the server's days: pick a day, type a time of day (India time); the running clock stays on the right */
.bar-when{justify-content:flex-start;gap:8px}
.bar-when #replay-time{margin-left:auto;white-space:nowrap}
#replay-day{font-weight:600;min-width:0}
#replay-clock{font-variant-numeric:tabular-nums;min-width:0}
#replay-seek{width:100%;accent-color:var(--navy);height:20px;cursor:pointer;margin:0}
.bar-actions{justify-content:flex-start}
#replay-play,#replay-raw{background:var(--white);color:var(--ink);border:1px solid var(--line);padding:0 14px;min-height:44px;border-radius:7px;font-size:13px;font-weight:550}
#replay-raw[aria-pressed="true"]{background:var(--tint);border-color:var(--tint-line)}
.bar-actions #replay-count{margin-left:auto}

/* ---- aircraft info boxes and airport labels ---- */
#labels,#activity-markers,#replay-markers{position:absolute;inset:0;pointer-events:none;overflow:hidden;z-index:2}
.map-label{position:absolute;display:none;transform:translate(-50%,-50%);padding:4px 8px;border-radius:5px;background:rgba(255,255,255,0.96);border:1px solid var(--line);color:var(--ink);font-size:11px;font-weight:600;white-space:nowrap}
.replay-marker,.replay-airport-marker,.activity-marker{position:absolute;transform:translate(-50%,-140%);padding:4px 8px;border-radius:5px;background:rgba(255,255,255,0.96);border:1px solid var(--line);color:var(--ink);font-size:12px;font-weight:600;white-space:nowrap;display:flex;align-items:center;gap:6px}
.replay-marker,.activity-marker{pointer-events:auto;min-height:32px}
.replay-marker:before,.activity-marker:before{content:'';width:7px;height:7px;border-radius:50%;background:var(--state,var(--tint-line));display:inline-block;flex-shrink:0}
.replay-marker.arriving{--state:var(--arriving)}
.replay-marker.departing{--state:var(--departing)}
.replay-marker.parked{--state:var(--parked)}
/* a parked aircraft carries no label, even with Labels on: only live arrivals and departures do */
.replay-marker.parked{display:none}
.replay-marker.selected,.activity-marker.selected{box-shadow:0 0 0 2px var(--accent)}
.replay-marker.lost{border-style:dashed;color:var(--muted)}
.replay-airport-marker{color:var(--navy);font-weight:700}
.activity-marker{transform:translate(-50%,-100%)}
.activity-marker:before{background:var(--activity-color,var(--tint-line))}
/* Labels off means nothing at all over the aircraft, in every mode. */
#replay-markers.labels-off .replay-marker,#replay-markers.labels-off .replay-airport-marker,#activity-markers.labels-off .activity-marker{display:none}

#replay-message{position:absolute;top:96px;right:24px;padding:12px 14px;max-width:300px;font-size:13px;background:var(--paper);border:1px solid var(--line);border-radius:11px;color:var(--ink);z-index:8}

/* ---- guided radio practice ---- */
#rtr-panel{position:absolute;left:24px;bottom:var(--stack);z-index:7;width:min(360px,calc(100vw - 48px));max-height:calc(100svh - var(--stack) - 120px);overflow:auto;padding:16px;border-radius:14px}
#rtr-panel .eyebrow{font-size:11px;color:var(--muted);text-transform:uppercase;letter-spacing:.6px}
#rtr-panel strong{display:block;margin-top:6px;font-size:13px}
#rtr-panel p{margin:10px 0;font-size:13px;line-height:1.5}
#rtr-panel button{min-height:44px;padding:0 14px;border:1px solid var(--line);border-radius:7px;background:var(--white);color:var(--ink);font-size:13px;font-weight:550}
#rtr-panel #rtr-request{background:var(--navy);color:var(--white);border-color:var(--navy)}
#rtr-panel textarea{width:100%;background:var(--white);color:var(--ink);border:1px solid var(--line);border-radius:7px;padding:8px;font:inherit;font-size:13px;resize:vertical}
#rtr-panel label{display:block;font-size:12px;color:var(--muted);margin:8px 0}
#rtr-panel summary,#rtr-panel small{font-size:11px;color:var(--muted)}
#rtr-panel .rtr-actions{display:flex;gap:6px;margin-top:12px;flex-wrap:wrap}
#rtr-panel small{display:block;line-height:1.5;margin-top:8px}
.panel-open #rtr-panel{visibility:hidden;pointer-events:none}
.rtr-mode #focus-card{display:none}

/* ---- attribution and loading ---- */
.attribution{position:absolute;left:24px;right:24px;bottom:6px;display:flex;gap:12px;justify-content:space-between;font-size:8px;line-height:1.5;color:var(--muted);pointer-events:none;z-index:1}
.attribution a{color:inherit;text-decoration:none;pointer-events:auto}
.attribution a:hover{text-decoration:underline}

#loading{position:absolute;inset:0;background:#f8fafb;display:flex;justify-content:center;align-items:center;z-index:10;transition:opacity .7s;overflow:hidden}
.loading-map{position:absolute;width:min(1040px,96vw);height:72%;top:5%;left:50%;transform:translateX(-50%);object-fit:contain;opacity:.5}
.loading-copy{position:absolute;bottom:9%;text-align:center;padding:24px 34px;background:var(--paper);border:1px solid var(--line);border-radius:16px}
.loading-code{font-size:42px;font-weight:700;letter-spacing:-2px;color:var(--navy)}
.loading-title{font-size:16px;color:var(--ink);margin-top:8px}
.loading-stages{display:flex;gap:18px;list-style:none;padding:0;margin:20px 0 10px;color:var(--muted);font-size:11px;justify-content:center}
.loading-stages li{display:flex;align-items:center;gap:6px;white-space:nowrap}
.loading-stages li:before{content:'';display:block;width:6px;height:6px;border-radius:50%;border:1px solid var(--tint-line)}
.loading-stages .current{color:var(--ink)}
.loading-stages .current:before{background:var(--accent);border-color:var(--accent)}
.loading-stages .done{color:var(--ink)}
.loading-stages .done:before{background:var(--arriving);border-color:var(--arriving)}
#loading #loading-text{font-size:13px;color:var(--ink);margin:12px 0 0}
#loading #loading-detail{font-size:11px;color:var(--muted);margin:7px 0 0}
#loading.preview-loading{inset:auto 50% 96px auto;transform:translateX(50%);width:max-content;max-width:calc(100% - 48px);padding:0;background:var(--paper);border:1px solid var(--line);border-radius:11px;pointer-events:none;overflow:visible}
#airport[data-mode="replay"] #loading.preview-loading{bottom:calc(var(--stack) + 12px)}   /* Demo being prepared while Replay plays: sit above the replay bar */
.preview-loading .loading-map,.preview-loading .loading-title,.preview-loading .loading-code{display:none}
.preview-loading .loading-copy{position:static;padding:12px 18px;background:none;border:0}
.preview-loading .loading-stages{margin:0 0 8px;gap:14px}
.preview-loading #loading-detail{white-space:nowrap}
#loading.load-complete{opacity:0;transition:opacity 1s .1s}
#error{position:absolute;z-index:20;top:50%;left:50%;transform:translate(-50%,-50%);background:var(--white);padding:24px;width:min(90%,400px);border:1px solid var(--line);border-radius:14px}
#error h2{font-size:17px;font-weight:650;margin:0 0 8px}
#error p{font-size:13px;line-height:1.5;color:var(--muted)}
#error button{background:var(--navy);color:var(--white);padding:0 14px;min-height:44px;border-radius:7px;font-size:13px;font-weight:550}

/* ---- chart tools, kept for ?dev=1 ---- */
.chart-tools summary{cursor:pointer;padding:5px 0;font-size:13px}
.chart-toggle{display:flex;gap:9px;align-items:center;margin:12px 0;font-size:13px}
#chart-search{display:flex;gap:7px;margin-top:7px}
#chart-find{min-width:0;flex:1;background:var(--white);color:var(--ink);border:1px solid var(--line);border-radius:7px;padding:10px;font:inherit;font-size:13px}
#chart-search button{padding:0 13px;min-height:44px;border-radius:7px;background:var(--white);border:1px solid var(--line)}
.chart-reference-notes{font-size:12px;line-height:1.5}
.chart-reference-notes dl{display:grid;grid-template-columns:1fr auto;gap:4px 12px}
.chart-reference-notes dd{margin:0;font-variant-numeric:tabular-nums}
#info p{font-size:13px;line-height:1.6;color:var(--muted);margin:0}
#info a{font-size:12px;color:var(--navy)}

/* ---- phone ---- */
@media(max-width:760px){
  :root{--stack:88px}
  #airport[data-mode="replay"]{--stack:224px}
  #topbar{left:12px;right:12px;top:12px;gap:8px}
  #status-panel{padding:10px 12px;gap:4px}
  #mode-switch{display:none;position:absolute;right:0;top:52px;flex-direction:column;z-index:7}
  #mode-area.open #mode-switch{display:flex}
  #mode-phone{display:block}
  .attribution{left:12px;right:12px;top:118px;bottom:auto;display:block;font-size:7.5px;text-align:left}
  .attribution a,.attribution span{display:block}

  #bottombar{display:flex;flex-direction:column;gap:12px;position:absolute;left:0;right:0;bottom:0;background:var(--paper);border:1px solid var(--line);border-radius:16px 16px 0 0;padding:10px 14px 16px;z-index:6}
  .grabber{display:block;width:40px;height:4px;border-radius:2px;background:var(--tint-line);align-self:center}
  /* The phone card is the phone mockup: one head row with Follow, then the four steps. */
  #focus-card{position:static;width:auto;max-width:none;padding:0;border:0;background:none;border-radius:0;gap:12px;
    grid-template-columns:minmax(0,1fr) auto auto;align-items:center;
    grid-template-areas:"head follow close" "steps steps steps" "note note note"}
  #focus-card #flight-number{font-size:22px;letter-spacing:-0.6px}
  #flight-identity{display:none}
  #flight-identity-short{display:block;font-size:12px;color:var(--muted);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
  #flight-route,#flight-facts,#route-toggle{display:none!important}
  .card-actions{display:contents}
  #focus-follow{grid-area:follow}
  .dock{position:static;transform:none;padding:0;border:0;background:none;display:flex;gap:6px}
  .dock button{flex:1 1 auto;min-width:0;padding:0 8px;font-size:12px;overflow:hidden;text-overflow:ellipsis}
  .sheet{left:12px;right:12px;width:auto;max-width:none;bottom:var(--stack);max-height:calc(100svh - var(--stack) - 150px)}
  #settings-panel,#demo-panel,#info{width:auto}
  #replay-bar{left:12px;right:12px;width:auto;max-width:none;transform:none;padding:12px}
  #airport[data-mode="replay"] #replay-bar{bottom:88px}
  #rtr-panel{left:12px;right:12px;width:auto;max-height:44svh}
  .rtr-mode #bottombar{display:none}
  #replay-message{top:auto;bottom:calc(var(--stack) + 12px);left:12px;right:12px;max-width:none}
  #replay-play,#replay-raw{padding:0 12px}
  /* phone: the day and the time box fill the row; the running clock is already in the header */
  #replay-bar.server-days #replay-time{display:none}
  #replay-bar.server-days #replay-day,#replay-bar.server-days #replay-clock{flex:1}
}
@media(max-width:1180px) and (min-width:761px){
  #focus-card{bottom:var(--stack)}
}
@media(prefers-reduced-motion:reduce){*{animation:none!important;transition:none!important}}
