/* ───────────────────────────────────────────────────────────────
   GAFR chrome — industrial mission-control aesthetic.
   Wraps tar1090 engine. Hides tar1090's native UI, provides own.
   Loaded AFTER tar1090's style.css so we win cascade conflicts.
   ─────────────────────────────────────────────────────────────── */

:root{
  --bg-0:#060d1c;  --bg-1:#0a1628;  --bg-2:#0f1e38;  --bg-3:#152642;  --bg-4:#1b3054;
  --border:#1e3a5f;  --border-br:#2b4f7e;  --hair:rgba(56,189,248,.08);
  --text-0:#eaf1fb;  --text-1:#b9c5d6;  --text-2:#7889a3;  --text-3:#4c5d78;  --text-4:#2f4062;
  --cy:#38bdf8;  --cy-dim:#22d3ee;  --cy-glow:rgba(56,189,248,.22);  --cy-soft:rgba(56,189,248,.08);
  --ok:#2fd47a;  --ok-glow:rgba(47,212,122,.35);
  --warn:#f5a524;  --crit:#ef4444;  --magenta:#c084fc;
  --topbar-h:56px;  --status-h:26px;
  --sans:"IBM Plex Sans","Helvetica Neue",Arial,sans-serif;
  --mono:"IBM Plex Mono",ui-monospace,SFMono-Regular,Menlo,monospace;
  --cond:"IBM Plex Sans Condensed","IBM Plex Sans",sans-serif;
}

/* ── RESET / BASE ── */
html,body{height:100%;margin:0;padding:0;overflow:hidden}
body{
  font-family:var(--sans) !important;
  font-size:13px;line-height:1.4;
  color:var(--text-1);
  background:var(--bg-0);
  -webkit-font-smoothing:antialiased;
  text-rendering:geometricPrecision;
}

/* grain overlay — kept low in stacking order (below UI chrome) so the
   mix-blend-mode overlay doesn't noisify small text in attributions and
   popups. Reduced opacity too — 0.4+overlay on 8px text = illegible. */
body::before{
  content:"";position:fixed;inset:0;pointer-events:none;z-index:1;
  background-image:url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='160' height='160'><filter id='n'><feTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='2' stitchTiles='stitch'/><feColorMatrix values='0 0 0 0 0.2  0 0 0 0 0.4  0 0 0 0 0.6  0 0 0 0.06 0'/></filter><rect width='100%' height='100%' filter='url(%23n)'/></svg>");
  opacity:.18;mix-blend-mode:soft-light;
}

::-webkit-scrollbar{width:8px;height:8px}
::-webkit-scrollbar-track{background:transparent}
::-webkit-scrollbar-thumb{background:var(--bg-4);border-radius:0}
::-webkit-scrollbar-thumb:hover{background:var(--border-br)}

/* ── HIDE TAR1090 NATIVE CHROME ── */
/* #loader is tar1090's centered progress bar shown during history/chunks
   fetches. We surface load state through the topbar STATUS pill instead,
   so the floating bar over the map is pure noise. */
#highlighted_infoblock,
#selected_infoblock,
#header_top,
#header_side,
#sidebar_container,
#altitude_chart,
#replayBar,
#credits,
#iconTestCanvas,
#container_splitter,
#loader{
  display:none !important;
}

/* tar1090 settings panel — shown via SETTINGS button as styled modal */
#settings_infoblock{
  position:fixed !important;
  top:50% !important; left:50% !important;
  transform:translate(-50%,-50%) !important;
  width:520px !important; max-width:92vw !important;
  max-height:80vh !important; overflow-y:auto !important;
  background:var(--bg-2) !important;
  border:1px solid var(--border-br) !important;
  box-shadow:0 20px 60px rgba(0,0,0,.6), 0 0 0 1px var(--cy-soft) !important;
  padding:24px !important;
  z-index:200 !important;
  color:var(--text-1) !important;
  font-family:var(--sans) !important;
}
#settings_infoblock .settingsText,
#settings_infoblock .settingsOptionContainer,
#settings_infoblock label,
#settings_infoblock .infoBlockTitleText{
  color:var(--text-1) !important;
  font-family:var(--sans) !important;
  font-size:12.5px !important;
}
#settings_infoblock .settingsColumn{padding:8px 0 !important}
#settings_infoblock select,
#settings_infoblock input,
#settings_infoblock .formButton{
  background:var(--bg-0) !important;
  color:var(--text-0) !important;
  border:1px solid var(--border) !important;
  font-family:var(--mono) !important;
  padding:4px 8px !important;
}
#settings_infoblock .formButton{cursor:pointer}
#settings_infoblock .formButton:hover{border-color:var(--cy);color:var(--cy) !important}
#settings_infoblock .settingsCloseBox{
  position:absolute !important; top:12px !important; right:14px !important;
  width:24px !important; height:24px !important; cursor:pointer;
  background:transparent !important; border:1px solid var(--border) !important;
  color:var(--text-2) !important;
}
#settings_infoblock .settingsCloseBox::before{
  content:"×"; position:absolute; inset:0; display:grid; place-items:center;
  font-size:20px; line-height:1; color:var(--text-1);
}
#settings_infoblock .settingsCloseBox:hover{border-color:var(--crit);color:var(--crit) !important}

/* jQuery-UI slider look in settings */
#settings_infoblock .ui-slider{
  height:4px !important; background:var(--bg-4) !important; border:1px solid var(--border) !important;
  margin:10px 0 18px !important;
}
#settings_infoblock .ui-slider-handle{
  width:14px !important; height:14px !important; background:var(--cy) !important;
  border:1px solid #fff !important; top:-6px !important; cursor:pointer !important;
}
#settings_infoblock .settingsCheckbox{
  width:16px; height:16px; border:1px solid var(--border-br);
  background:var(--bg-0); display:inline-block; margin-right:8px; cursor:pointer;
}
#settings_infoblock .settingsCheckbox.settingsCheckboxChecked{
  background:var(--cy); border-color:var(--cy);
}

/* error boxes — allow tar1090 to show them if needed */
.error_box{ position:fixed; z-index:10000; top:12px; left:50%; transform:translateX(-50%); }

/* ── LAYOUT SHELL ──
 *
 * Vec1 (v1.2): the sidebar (.side) is now a position:absolute overlay
 * INSIDE this grid, layered above the map cell. The grid columns are
 * therefore CONSTANT (`0 1fr 260px`) regardless of selection state, so
 * opening/closing the sidebar does NOT change the map's width. This
 * eliminates the perceived "horizontal shift" of map content that the
 * old behaviour caused (grid-template-columns animated 0→320px → map
 * width shrank → OL kept content centered → looked like a shift).
 * `.app` needs `position:relative` so .side's `position:absolute` lands
 * against the app shell (and not the viewport, which would skip the
 * topbar / status row). */
.app{
  display:grid;
  grid-template-rows: var(--topbar-h) 1fr var(--status-h);
  grid-template-columns: 0 1fr 260px;
  grid-template-areas:
    "top  top  top"
    "side map  right"
    "stat stat stat";
  height:100vh;
  background:var(--bg-1);
  position:relative;
}

/* ── TOPBAR ── */
.topbar{
  grid-area:top;
  display:flex;align-items:stretch;
  background:linear-gradient(180deg,#0d1b33 0%,#0a1628 100%);
  border-bottom:1px solid var(--border);
  position:relative;z-index:40;
}
.topbar::after{
  content:"";position:absolute;left:0;right:0;bottom:-1px;height:1px;
  background:linear-gradient(90deg,transparent, var(--cy-soft) 20%, var(--cy-soft) 80%, transparent);
}
/* Brand: veľký lowercase "gafr" zaberá takmer celú výšku topbaru, vedľa neho
   dvojriadkový mini-caption s monospace borderom hore/dole — ATC-formulárový
   look. Výška topbaru = 56px, brand-big má font-size 40px aby vyplnil vertikál. */
.brand{display:flex;align-items:center;gap:14px;padding:0 18px;min-width:0}
.brand-big{
  font-family:"Saira Condensed","IBM Plex Sans Condensed","Arial Narrow",sans-serif;
  font-weight:700;font-size:42px;line-height:.85;letter-spacing:.01em;
  color:var(--cy);text-transform:uppercase;
  text-shadow:0 0 12px var(--cy-glow), 0 0 24px rgba(56,189,248,.25);
  -webkit-font-smoothing:antialiased;
}

.nav{display:flex;align-items:center;gap:2px;padding:0 8px;border-right:1px solid var(--border)}
.nav a{font-family:var(--cond);font-weight:600;font-size:11.5px;letter-spacing:.18em;color:var(--text-2);text-transform:uppercase;padding:8px 14px;border:1px solid transparent;text-decoration:none;position:relative;display:flex;align-items:center;gap:6px}
.nav a:hover{color:var(--text-0);background:var(--cy-soft)}
.nav a.is-active{color:var(--cy);background:linear-gradient(180deg,rgba(56,189,248,.08),rgba(56,189,248,.02));border-color:var(--border);box-shadow:inset 0 -1px 0 var(--cy)}
.nav a .badge{font-family:var(--mono);font-size:9px;padding:1px 5px;background:var(--crit);color:#fff;border-radius:2px;letter-spacing:.05em}

.top-search{flex:1 1 0;display:flex;align-items:center;padding:0 12px;gap:10px;border-right:1px solid var(--border);min-width:0}
.search-wrap{flex:1 1 0;min-width:0;max-width:380px;position:relative;display:flex;align-items:center;gap:8px;padding:7px 10px;background:var(--bg-0);border:1px solid var(--border)}
.search-wrap:focus-within{border-color:var(--border-br);box-shadow:0 0 0 3px var(--cy-soft)}
.search-wrap > svg{color:var(--text-3);flex-shrink:0}
.search-wrap input{flex:1;min-width:0;background:transparent;border:0;outline:0;color:var(--text-0);font-family:var(--mono);font-size:12px;letter-spacing:.02em}
.search-wrap input::placeholder{color:var(--text-3)}
.kbd{font-family:var(--mono);font-size:10px;color:var(--text-2);padding:2px 5px;border:1px solid var(--border);background:var(--bg-2);flex-shrink:0}

/* Search suggestions dropdown — absolute, no layout shift */
.top-search-suggest{
  position:absolute; top:calc(100% + 4px); left:-1px; right:-1px;
  display:none; flex-direction:column;
  background:var(--bg-2); border:1px solid var(--border-br);
  box-shadow:0 12px 32px rgba(0,0,0,.5), 0 0 0 1px var(--cy-soft);
  z-index:120; max-height:360px; overflow-y:auto;
}
.top-search-suggest.is-open{display:flex}
.top-search-suggest .ss-row{
  display:grid; grid-template-columns: 3px minmax(0,1fr) 44px minmax(0,72px) 56px 52px;
  column-gap:8px; align-items:center;
  padding:8px 12px 8px 0; height:32px;
  cursor:pointer; border-bottom:1px solid rgba(30,58,95,.4);
  font-family:var(--mono); font-size:11.5px; color:var(--text-1);
  font-variant-numeric:tabular-nums;
}
.top-search-suggest .ss-row:hover,
.top-search-suggest .ss-row.is-hl{background:rgba(56,189,248,.08)}
.top-search-suggest .ss-row > span{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.top-search-suggest .ss-row .bar{align-self:stretch;background:var(--text-4)}
.top-search-suggest .ss-row.ss-row-fix .bar{background:#a78bfa}
.top-search-suggest .ss-row.ss-row-fix .type{color:#a78bfa;font-weight:600}
.top-search-suggest .ss-row.ss-row-place .bar{background:#34d399}
.top-search-suggest .ss-row[data-type="commercial"] .bar{background:var(--cy-dim)}
.top-search-suggest .ss-row[data-type="ga"] .bar{background:#a7f3d0}
.top-search-suggest .ss-row[data-type="heli"] .bar{background:#fbbf24}
.top-search-suggest .ss-row[data-type="mil"] .bar{background:var(--magenta)}
.top-search-suggest .ss-row .cs{color:var(--text-0);font-weight:600;letter-spacing:.03em}
.top-search-suggest .ss-row .type{color:var(--cy-dim);font-size:10.5px}
.top-search-suggest .ss-row .reg{color:var(--text-2);font-size:10.5px}
.top-search-suggest .ss-row .alt{text-align:right;color:var(--text-0);font-weight:600}
.top-search-suggest .ss-row .src{font-size:10px;color:var(--text-3);letter-spacing:.05em;text-transform:uppercase;text-align:right}
.top-search-suggest .ss-head{padding:6px 12px;font-family:var(--cond);font-size:9.5px;letter-spacing:.22em;color:var(--text-3);text-transform:uppercase;background:var(--bg-1);border-bottom:1px solid var(--border)}
.top-search-suggest .ss-empty{padding:14px 12px;font-family:var(--mono);font-size:11px;color:var(--text-3);text-align:center;letter-spacing:.03em}
.top-search-suggest .ss-archive{padding:8px 12px;display:flex;align-items:center;gap:8px;font-family:var(--mono);font-size:10.5px;color:var(--text-3);background:var(--bg-1);border-top:1px solid var(--border)}
.top-search-suggest .ss-archive .tag{font-family:var(--cond);font-size:9.5px;letter-spacing:.18em;color:var(--warn);text-transform:uppercase;padding:2px 5px;border:1px solid rgba(245,165,36,.4);background:rgba(245,165,36,.08)}

/* Country flag badge inside place rows: short 2-letter pill that visually
 * distinguishes "Košice (SK)" from "Košice nad Labem (CZ)". Per-country
 * background keeps it fast-readable without resorting to emoji flags. */
.ss-flag{
  display:inline-block; box-sizing:border-box;
  min-width:22px; padding:1px 5px; margin-right:7px;
  font-family:var(--cond); font-size:9.5px; font-weight:700;
  letter-spacing:.08em; text-align:center; vertical-align:1px;
  border-radius:2px;
  background:var(--bg-1); color:var(--text-1); border:1px solid var(--border);
}
.ss-flag-sk{background:#0b4ea2;color:#fff;border-color:#0b4ea2}
.ss-flag-cz{background:#11457e;color:#fff;border-color:#11457e}
.ss-flag-hu{background:#436f4d;color:#fff;border-color:#436f4d}
.ss-flag-pl{background:#dc143c;color:#fff;border-color:#dc143c}
.ss-flag-at{background:#ed2939;color:#fff;border-color:#ed2939}
.ss-flag-ua{background:#005bbb;color:#ffd500;border-color:#005bbb}

/* Search pin marker — drawn as an OL Overlay at the picked fix/place coords.
 * Animated pulse ring draws the eye without obscuring the underlying map. */
.gafr-search-pin{
  position:relative; width:18px; height:18px;
  pointer-events:none;
}
.gafr-search-pin::before{
  content:''; position:absolute; inset:0;
  border-radius:50%;
  background:#d64200; /* GAFR orange */
  border:2px solid #fff;
  box-shadow:0 2px 8px rgba(0,0,0,.55);
  z-index:2;
}
.gafr-search-pin::after{
  content:''; position:absolute; inset:-10px;
  border-radius:50%;
  border:2px solid #d64200;
  animation:gafr-pin-pulse 1.6s ease-out infinite;
  opacity:0;
  z-index:1;
}
@keyframes gafr-pin-pulse{
  0%   {transform:scale(.4); opacity:.85}
  100% {transform:scale(1.6); opacity:0}
}

.top-tools{display:flex;align-items:stretch}
.tool{display:flex;align-items:center;gap:10px;padding:0 14px;border-left:1px solid var(--border);min-width:0}
.tool:first-child{border-left:0}
.tool .lbl{font-family:var(--cond);font-size:10px;letter-spacing:.2em;color:var(--text-3);text-transform:uppercase}
.tool .val{font-family:var(--mono);font-size:12.5px;font-weight:500;color:var(--text-0);letter-spacing:.04em;font-variant-numeric:tabular-nums}

/* Tool button (clickable tool item — e.g. SOURCES, SETTINGS) */
.tool-btn{
  display:flex;flex-direction:column;justify-content:center;gap:2px;
  padding:0 14px;border:0;border-left:1px solid var(--border);
  background:transparent;cursor:pointer;min-width:0;
  color:var(--text-1);height:100%;
}
.tool-btn:hover{background:var(--cy-soft)}
.tool-btn .lbl{font-family:var(--cond);font-size:10px;letter-spacing:.2em;color:var(--text-3);text-transform:uppercase;text-align:left}
.tool-btn .val{font-family:var(--mono);font-size:12.5px;color:var(--text-0);display:flex;align-items:center;gap:6px;letter-spacing:.04em;font-variant-numeric:tabular-nums}
.tool-btn.is-active{background:var(--cy-soft);box-shadow:inset 0 -2px 0 var(--cy)}
.tool-btn .dot{width:8px;height:8px;border-radius:50%;background:var(--text-4);flex:0 0 auto}
.tool-btn[data-st="ok"] .dot{background:var(--ok);box-shadow:0 0 8px var(--ok-glow)}
.tool-btn[data-st="warn"] .dot{background:var(--warn)}
.tool-btn[data-st="crit"] .dot{background:var(--crit)}

/* Icon-only tool button — used by the settings gear pinned far-right. */
.tool-btn-icon{
  padding:0 16px;min-width:52px;align-items:center;justify-content:center;
}
.tool-btn-icon .val{font-size:18px;line-height:1;color:var(--text-1)}
.tool-btn-icon:hover .val{color:var(--cy)}
.tool-btn-icon.is-active .val{color:var(--cy)}

.status-pill{display:flex;align-items:center;gap:8px;padding:5px 10px;background:rgba(47,212,122,.08);border:1px solid rgba(47,212,122,.3)}
.status-pill .dot{width:7px;height:7px;border-radius:50%;background:var(--ok);box-shadow:0 0 0 0 var(--ok-glow);animation:pulseOK 2s infinite}
.status-pill .txt{font-family:var(--cond);font-size:11px;font-weight:600;letter-spacing:.16em;color:var(--ok);text-transform:uppercase}
.status-pill.warn{background:rgba(245,165,36,.08);border-color:rgba(245,165,36,.3)}
.status-pill.warn .dot{background:var(--warn);box-shadow:none;animation:none}
.status-pill.warn .txt{color:var(--warn)}
.status-pill.crit{background:rgba(239,68,68,.08);border-color:rgba(239,68,68,.3)}
.status-pill.crit .dot{background:var(--crit);box-shadow:none;animation:none}
.status-pill.crit .txt{color:var(--crit)}

@keyframes pulseOK{0%{box-shadow:0 0 0 0 var(--ok-glow)}70%{box-shadow:0 0 0 7px rgba(47,212,122,0)}100%{box-shadow:0 0 0 0 rgba(47,212,122,0)}}

.user{display:flex;align-items:center;gap:10px;padding:0 16px;border-left:1px solid var(--border);cursor:pointer}
.user:hover{background:var(--cy-soft)}
.avatar{width:28px;height:28px;border:1px solid var(--border-br);background:linear-gradient(135deg,#162e52,#0e1d38);display:grid;place-items:center;font-family:var(--mono);font-size:11px;font-weight:600;color:var(--cy);letter-spacing:.04em}
.user .meta{display:flex;flex-direction:column}
.user .name{font-size:12px;font-weight:500;color:var(--text-0);letter-spacing:.02em}
.user .role{font-family:var(--mono);font-size:10px;color:var(--text-3);letter-spacing:.06em}

/* ───────────────────────────────────────────────────────────────
   ATC STRIP (topbar v3) — radar-mission-control look.
   Predloha: obrazky/topbar-builder.html → EXP.TXT export.
   Default = dark theme. Light theme = html.is-light override (na konci súboru).
   ─────────────────────────────────────────────────────────────── */

/* Saira Condensed je už v <link> v index.html — fallback chain pre lokálne
   aliasy ak font ešte nie je načítaný. */
.atc-strip{
  --atc-font:"Saira Condensed","IBM Plex Sans Condensed","Arial Narrow",sans-serif;
  display:flex;align-items:stretch;flex:1;min-width:0;
  border-left:1px solid var(--border);
  background:var(--bg-1);
  font-family:var(--atc-font);
}

/* Sekcia: label nad value-boxom (MODE / DATA / SYNC / SPD / HIST / AC / atď.) */
.atc-sec{
  display:flex;flex-direction:column;align-items:center;justify-content:flex-start;
  padding:7px 12px 6px;min-width:62px;
  border-right:1px solid var(--border);
}
/* "Tight" varianta keď value je krátky text (OK, FL — < 4 znaky) */
.atc-sec--tight{padding:7px 8px 6px;min-width:0}

/* Row sekcia: stack label+button vľavo, číselné inputy vpravo (RANGE / FILTER) */
.atc-sec-row{
  display:flex;align-items:stretch;
  padding:7px 12px 6px;
  border-right:1px solid var(--border);
}
.atc-row{display:flex;gap:5px;align-items:stretch}
.atc-stack{display:flex;flex-direction:column;align-items:center}
.atc-stack .atc-label{margin-bottom:4px}

.atc-label{
  font-family:var(--atc-font);
  font-size:10px;font-weight:500;letter-spacing:.1em;
  color:var(--text-2);text-transform:uppercase;
  line-height:1;margin-bottom:4px;white-space:nowrap;
}

/* Default value box — text/štítok (LIVE, OK, ERROR, 47, FL120…) */
.atc-val{
  display:inline-flex;align-items:center;justify-content:center;
  height:22px;min-width:54px;padding:0 10px;
  font-family:var(--atc-font);
  font-size:13px;font-weight:500;letter-spacing:.04em;
  color:var(--text-0);background:var(--bg-0);
  border:1px solid var(--border-br);
  line-height:1;font-variant-numeric:tabular-nums;
}
/* "Tight" — keď value je len OK / 2-4 znaky, šetrí miesto. */
.atc-val--tight{min-width:0;padding:0 8px}

.atc-val--ok{
  color:var(--ok);background:rgba(47,212,122,.06);
  border-color:rgba(47,212,122,.45);
  text-shadow:0 0 8px rgba(47,212,122,.35);
}
.atc-val--warn{
  color:#000;background:var(--warn);border-color:var(--warn);font-weight:600;
}
.atc-val--crit{
  color:#fff;background:var(--crit);border-color:var(--crit);font-weight:600;
  animation:atc-blink 1.4s ease-in-out infinite;
}
@keyframes atc-blink{
  0%,100%{box-shadow:0 0 0 0 rgba(239,68,68,0)}
  50%{box-shadow:0 0 0 4px rgba(239,68,68,.18)}
}

/* Number-input look — vysoký, cyan glow (RANGE 165 / FILTER min-max) */
.atc-val--num{
  width:62px;min-width:0;flex:0 0 62px;
  height:auto;align-self:stretch;
  justify-content:center;padding:0 6px;
  font-size:24px;font-weight:400;letter-spacing:.02em;
  color:var(--cy);background:var(--bg-0);
  border:1px solid var(--border-br);
  text-shadow:0 0 6px var(--cy-glow);
}

/* FL filter input — rovnaký vizuál ako .atc-val--num span, ale ako <input>.
   Užívateľ zadáva FL formát: 170 = FL170 = 17000 ft, 0 = GND, 025 = 2500 ft.
   .atc-range-input zdieľa identický look (number-input editovateľný),
   len bez is-bypassed semantiky — RANGE nemá QL stav. */
.atc-fl-input,
.atc-range-input{
  font-family:var(--atc-font);
  text-align:center;outline:0;
  -moz-appearance:textfield;
}
.atc-fl-input::-webkit-outer-spin-button,
.atc-fl-input::-webkit-inner-spin-button,
.atc-range-input::-webkit-outer-spin-button,
.atc-range-input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}
.atc-fl-input::placeholder,
.atc-range-input::placeholder{color:var(--text-3);opacity:.45;text-shadow:none}
.atc-fl-input:focus,
.atc-range-input:focus{
  border-color:var(--cy);
  box-shadow:0 0 0 2px var(--cy-soft), 0 0 8px var(--cy-glow);
}
/* QL active = filter bypassed → input v stlmenom režime (vizuálna nápoveda
   že hodnoty sú v sile, ale momentálne neaktívne kvôli quick-looku). */
.atc-fl-input.is-bypassed{
  color:var(--text-3);text-shadow:none;opacity:.55;
}

/* QL button — keď je filter "bypassed" (klik na QL), button svieti oranžovo.
   Font na QL podfarbenom musí byť ČIERNY (čitateľnosť na svetlom oranžovom),
   bez bold lookolu — ladí sa s atc-btn font-weight. */
.atc-btn.is-quicklook{
  color:#000;background:var(--warn);border-color:var(--warn);
  text-shadow:none;font-weight:600;
  box-shadow:inset 0 1px 0 rgba(255,255,255,.22),
             inset 0 -1px 0 rgba(0,0,0,.18),
             0 0 8px rgba(245,165,36,.4);
}
.atc-btn.is-quicklook:hover{
  background:#fbbf24;border-color:#fbbf24;color:#000;
}

/* Picker — kompaktný "kocka" box, content-driven šírka (žiadne min-width
   bloating), zladený s DATA/SYNC OK pillami. Klik otvorí floating dropdown
   menu s povolenými hodnotami (OFF/1/2/3/10 pre SPD, OFF/5/7/9 pre HIST). */
.atc-val--pick{
  display:inline-flex;align-items:center;justify-content:center;
  padding:0 8px;min-width:0;
  cursor:pointer;
  font-weight:500;
}
.atc-val--pick:hover{ border-color:var(--cy); color:var(--cy); }
.atc-val--pick.is-open{ border-color:var(--cy); color:var(--cy); }

/* OFF state — vizuálny hint že picker neaktívny, ale stále otvoriteľný. */
.atc-val--pick.is-off{ color:var(--text-3); }

/* Floating pick menu — anchored pod triggerom cez position:fixed (JS nastaví
   top/left z getBoundingClientRect). Single shared element pre všetky pickery
   v topbare; zobrazený keď má .is-open. */
.atc-pick-menu{
  position:fixed; display:none; flex-direction:column;
  background:var(--bg-2); border:1px solid var(--border-br);
  box-shadow:0 12px 32px rgba(0,0,0,.5), 0 0 0 1px var(--cy-soft);
  z-index:140; min-width:48px;
  font-family:var(--atc-font);
}
.atc-pick-menu.is-open{ display:flex }
.atc-pick-menu .pm-row{
  padding:6px 12px; height:26px;
  display:flex;align-items:center;justify-content:center;
  cursor:pointer;
  font-size:12.5px; font-weight:500; letter-spacing:.06em;
  color:var(--text-1); border-bottom:1px solid rgba(30,58,95,.4);
  font-variant-numeric:tabular-nums;
}
.atc-pick-menu .pm-row:last-child{ border-bottom:0 }
.atc-pick-menu .pm-row:hover{ background:rgba(56,189,248,.08); color:var(--cy) }
.atc-pick-menu .pm-row.is-on{ color:var(--cy); background:rgba(56,189,248,.12) }

/* Pick-group — SPD + HIST vedľa seba bez separátora medzi nimi.
   Nahrádza dva samostatné .atc-sec-y. Border-right je len na koncu skupiny. */
.atc-pickgrp{
  display:flex;align-items:stretch;
  border-right:1px solid var(--border);
}
.atc-pickgrp .atc-sec{
  border-right:0;                        /* žiadny predel medzi pickermi */
  padding:7px 8px 6px;min-width:0;       /* zúženie */
}

/* Twoval — pôvodný 2× small (TRAIL 1/6) — ponechané pre kompatibilitu */
.atc-twoval{display:flex;gap:4px}
.atc-val--small{min-width:24px;padding:0 6px}

/* RESET / akčný button (RANGE / FILTER / Custom button).
   Font: zväčšené z 11px na 12.5px, weight 500 (predtým 600/700) — užívateľ
   chcel menej "hrubý" font ale o čosi väčší pre lepšiu čitateľnosť. */
.atc-btn{
  display:inline-flex;align-items:center;justify-content:center;
  height:22px;min-width:54px;padding:0 10px;
  font-family:var(--atc-font);
  font-size:12.5px;font-weight:500;letter-spacing:.06em;
  text-transform:uppercase;color:var(--text-1);
  background:linear-gradient(180deg,var(--bg-3) 0%,var(--bg-1) 100%);
  border:1px solid var(--border-br);
  box-shadow:inset 0 1px 0 rgba(56,189,248,.18),
             inset 0 -1px 0 rgba(0,0,0,.4),
             0 1px 0 rgba(0,0,0,.2);
  cursor:pointer;line-height:1;
}
.atc-btn:hover{
  color:var(--cy);border-color:var(--cy);
  background:linear-gradient(180deg,#1c3a66 0%,#142a4d 100%);
}

/* MODE button — vždy podfarbený oranžovo keď je playback aktívne.
   Default RADAR je neutrálny (rovnaký look ako .atc-btn). */
.atc-mode-btn.is-playback{
  color:#000;background:var(--warn);border-color:var(--warn);
  text-shadow:none;
  box-shadow:inset 0 1px 0 rgba(255,255,255,.45),
             inset 0 -1px 0 rgba(0,0,0,.18),
             0 1px 0 rgba(0,0,0,.2);
  font-weight:700;
}
.atc-mode-btn.is-playback:hover{
  background:#fbbf24;border-color:#fbbf24;color:#000;
}

/* Icon row — rad plochých flat button-ikoniek (MV/SEP, predloha MOZNOST.png).
   align-items:flex-end zarovná buttony k spodnému okraju, takže sedia
   v rovine s RESET / atc-btn (ktoré majú label nad sebou). */
.atc-iconrow{
  display:flex;align-items:flex-end;gap:5px;
  padding:7px 12px 6px;
  border-right:1px solid var(--border);
}
.atc-iconbtn{
  display:inline-flex;align-items:center;justify-content:center;
  height:22px;min-width:32px;padding:0 8px;
  font-family:var(--atc-font);
  font-size:12.5px;font-weight:500;letter-spacing:.05em;
  text-transform:uppercase;color:var(--text-0);
  background:linear-gradient(180deg,var(--bg-3) 0%,var(--bg-1) 100%);
  border:1px solid var(--border-br);
  box-shadow:inset 0 1px 0 rgba(56,189,248,.18),
             inset 0 -1px 0 rgba(0,0,0,.4),
             0 1px 0 rgba(0,0,0,.2);
  cursor:pointer;line-height:1;
}
.atc-iconbtn:hover{
  color:var(--cy);border-color:var(--cy);
  background:linear-gradient(180deg,#1c3a66 0%,#142a4d 100%);
}
/* Active state pre MV/SPT — keď je tool aktívny (zelený glow ako pri DATA OK
   indikátore aby bolo jasné že nástroj beží). Vizuálne odlíšené od QL ktoré
   používa oranžovú = bypass/inhibition; aktívny tool používa zelenú = on/live. */
.atc-iconbtn.is-on{
  color:#000;background:var(--ok);border-color:var(--ok);
  font-weight:700;text-shadow:none;
  box-shadow:inset 0 1px 0 rgba(255,255,255,.35),
             inset 0 -1px 0 rgba(0,0,0,.18),
             0 0 8px var(--ok-glow);
}
.atc-iconbtn.is-on:hover{
  background:#5ce58d;border-color:#5ce58d;color:#000;
}
/* AGC flash — krátky pulz pri kliknutí (oranžový blesk) ako vizuálna
   spätná väzba že akcia prebehla aj keď nič nebolo na vyčistenie. */
.atc-iconbtn.is-flashing{
  background:var(--warn);border-color:var(--warn);color:#000;
  box-shadow:0 0 12px rgba(245,165,36,.6);
  transition:background .08s, border-color .08s, box-shadow .08s;
}

/* UTC clock — single-line, center-aligned. IBM Plex Sans Semibold s
   tabular-nums + tight letter-spacing (-.02em) → digity sú blizko seba ale
   stále stabilná šírka pri sekundovom ticku. Žiadny "UTC" label — čas je
   self-evident vo výhradne UTC kontexte. */
.atc-clock{
  display:flex;align-items:center;justify-content:center;
  padding:0 20px;
  border-right:1px solid var(--border);
  flex:0 0 auto;                         /* nech sa nestlačí pri preplnenom topbare */
}
.atc-clock .atc-time{
  display:inline-block;min-width:115px;text-align:center;
  font-family:"IBM Plex Sans",system-ui,sans-serif;
  font-size:21px;font-weight:400;letter-spacing:-.01em;
  color:var(--cy);text-shadow:0 0 8px var(--cy-glow);
  font-variant-numeric:tabular-nums;line-height:1;
  white-space:nowrap;
}
.atc-clock--big{ height:100%; }
.atc-clock--big .atc-time{ font-size:23px; min-width:125px }
.atc-clock--big .atc-utc{ font-size:23px; }
/* UTC suffix — rovnaký font/veľkosť ako čas, ale tlmená farba bez glow
   aby digity ostali primary focus a UTC slúžil len ako label za časom. */
.atc-clock .atc-utc{
  font-family:"IBM Plex Sans",system-ui,sans-serif;
  font-size:21px;font-weight:400;letter-spacing:.06em;
  color:var(--text-2);line-height:1;
  margin-left:8px;
  text-transform:uppercase;
}

/* Settings ⚙ button — bez bordera, len icon */
.atc-settings{
  display:flex;align-items:center;justify-content:center;
  padding:0 14px;border:0;
  background:transparent;color:var(--text-1);
  cursor:pointer;font-size:18px;height:100%;
}
.atc-settings:hover{color:var(--cy)}
.atc-settings.is-active{color:var(--cy);background:var(--cy-soft)}

/* ── SIDEBAR ── */
/* Overlay above the map (Vec1, v1.2). 200px wide (~half of the prior 320px
 * spec). Slides in from left when body has .has-sel; mapa pod ňou drží
 * plnú šírku, takže sa horizontálne neposúva pri otvorení/zatvorení.
 * Full window height (top:0 → bottom:0) — prekrýva topbar (z-index:40) aj
 * status bar v ľavom 200px páse, aby pôsobil ako klasický slide-out drawer. */
.side{
  grid-area:side;     /* harmless fallback if absolute positioning ever fails */
  position:absolute;
  top:0; left:0; bottom:0;
  width:200px;
  z-index:50;
  background:var(--bg-1);
  border-right:1px solid var(--border);
  box-shadow:6px 0 18px rgba(0,0,0,.45);
  display:flex;flex-direction:column;
  min-height:0;
  overflow-y:auto;overflow-x:hidden;
  transform:translateX(-100%);
  transition:transform .22s ease;
  will-change:transform;
}
body.has-sel .side{transform:translateX(0)}
.side-head{display:flex;align-items:center;justify-content:space-between;padding:14px 16px 10px}
.side-title{display:flex;align-items:baseline;gap:10px}
.side-title h2{font-family:var(--cond);font-weight:600;font-size:12px;letter-spacing:.24em;color:var(--text-0);text-transform:uppercase;margin:0}
.side-title .count{font-family:var(--mono);font-size:11px;color:var(--cy);letter-spacing:.05em;padding:1px 6px;background:var(--cy-soft);border:1px solid rgba(56,189,248,.2)}
.side-head .sort{display:flex;align-items:center;gap:6px;font-family:var(--mono);font-size:10.5px;color:var(--text-2);letter-spacing:.04em;cursor:pointer}
.side-head .sort:hover{color:var(--text-0)}
.side-head .sort svg{width:10px;height:10px}

.filter-row{display:flex;gap:4px;padding:0 12px 10px;overflow-x:auto;scrollbar-width:none}
.filter-row::-webkit-scrollbar{display:none}
.chip{font-family:var(--cond);font-weight:500;font-size:10.5px;letter-spacing:.16em;color:var(--text-2);text-transform:uppercase;padding:5px 10px;border:1px solid var(--border);background:var(--bg-2);white-space:nowrap;cursor:pointer;display:flex;align-items:center;gap:6px}
.chip:hover{color:var(--text-0);border-color:var(--border-br)}
.chip.is-on{color:var(--cy);border-color:rgba(56,189,248,.45);background:var(--cy-soft);box-shadow:inset 0 0 0 1px rgba(56,189,248,.12)}
.chip .n{font-family:var(--mono);font-size:10px;color:var(--text-3);letter-spacing:.04em}
.chip.is-on .n{color:var(--cy-dim)}

.side-search{margin:0 12px 10px;display:flex;align-items:center;gap:8px;padding:8px 10px;background:var(--bg-0);border:1px solid var(--border)}
.side-search:focus-within{border-color:var(--border-br);box-shadow:0 0 0 3px var(--cy-soft)}
.side-search svg{color:var(--text-3);flex-shrink:0}
.side-search input{flex:1;background:transparent;border:0;outline:0;font-family:var(--mono);font-size:12px;color:var(--text-0);letter-spacing:.02em}
.side-search input::placeholder{color:var(--text-3)}

/* Detail card — full-height sidebar (Phase II variant B: list moved to topbar popup) */
.detail{
  flex:1 1 auto; min-height:0;
  background:
    radial-gradient(800px 200px at 0% 0%, rgba(56,189,248,.07), transparent 60%),
    var(--bg-2);
  padding:14px 16px; display:flex; flex-direction:column; gap:12px; position:relative;
}
.empty-detail{
  margin:auto; padding:40px 20px; text-align:center;
  font-family:var(--mono); font-size:11.5px; color:var(--text-3); letter-spacing:.04em;
  display:flex; flex-direction:column; align-items:center; gap:10px;
}
.empty-detail svg{width:48px;height:48px;color:var(--text-4)}
.empty-detail h4{margin:0;font-family:var(--cond);font-size:13px;letter-spacing:.2em;color:var(--text-2);text-transform:uppercase}
.detail::before{content:"";position:absolute;top:-1px;left:0;right:0;height:1px;background:linear-gradient(90deg, transparent, var(--cy) 30%, var(--cy) 70%, transparent);opacity:.55}
.detail-head{display:flex;justify-content:space-between;align-items:flex-start;gap:10px}
.detail-ids{display:flex;flex-direction:column;gap:4px;min-width:0;flex:1}
.detail-cs{display:flex;align-items:baseline;gap:10px;flex-wrap:wrap}
.detail-cs .cs{font-family:var(--mono);font-weight:600;font-size:19px;color:var(--text-0);letter-spacing:.04em}
.detail-cs .type{font-family:var(--mono);font-size:11.5px;color:var(--cy);letter-spacing:.08em;padding:2px 6px;border:1px solid rgba(56,189,248,.3);background:var(--cy-soft)}
.detail-reg{font-family:var(--mono);font-size:11px;color:var(--text-2);letter-spacing:.04em;word-break:break-word}
.detail-reg .pipe{color:var(--text-4);margin:0 6px}
.detail-tag{display:flex;align-items:center;gap:6px;font-family:var(--cond);font-weight:600;font-size:10px;letter-spacing:.22em;color:var(--text-0);text-transform:uppercase;padding:3px 8px;background:var(--bg-4);border:1px solid var(--border-br);flex:0 0 auto}
.detail-tag .dot{width:6px;height:6px;border-radius:50%;background:var(--ok)}
.detail-close{position:absolute;top:10px;right:12px;width:22px;height:22px;display:grid;place-items:center;border:1px solid var(--border);background:var(--bg-0);color:var(--text-2);cursor:pointer;font-family:var(--mono);font-size:14px;line-height:1;z-index:2}
.detail-close:hover{border-color:var(--crit);color:var(--crit)}

.route{display:grid;grid-template-columns:1fr auto 1fr;align-items:center;gap:12px;padding:10px 0;border-top:1px dashed var(--border);border-bottom:1px dashed var(--border)}
.route .airport{display:flex;flex-direction:column;gap:2px;min-width:0}
.route .airport.to{text-align:right}
.route .iata{font-family:var(--mono);font-weight:600;font-size:17px;color:var(--text-0);letter-spacing:.06em}
.route .icao{font-family:var(--mono);font-size:10px;color:var(--text-2);letter-spacing:.08em}
.route .arrow{position:relative;display:flex;flex-direction:column;align-items:center;gap:3px}
.route .arrow .bar{width:90px;height:1px;background:var(--text-4);position:relative}
.route .arrow .bar::before{content:"";position:absolute;right:-1px;top:-3px;width:0;height:0;border-left:6px solid var(--text-4);border-top:3.5px solid transparent;border-bottom:3.5px solid transparent}
.route .arrow .eta{font-family:var(--mono);font-size:10px;color:var(--text-2);letter-spacing:.04em}

.detail-section{display:flex;flex-direction:column;gap:6px}
.detail-section-title{font-family:var(--cond);font-size:9.5px;letter-spacing:.22em;color:var(--text-3);text-transform:uppercase;padding-bottom:4px;border-bottom:1px dashed var(--border)}

.fields{display:grid;grid-template-columns:repeat(2,1fr);gap:10px 12px}
.fields.cols-1{grid-template-columns:1fr}
.fields.cols-2{grid-template-columns:repeat(2,1fr)}
.fields.cols-3{grid-template-columns:repeat(3,1fr)}
.f{display:flex;flex-direction:column;gap:2px;min-width:0}
.f .k{font-family:var(--cond);font-size:9.5px;letter-spacing:.2em;color:var(--text-3);text-transform:uppercase}
.f .v{font-family:var(--mono);font-size:12.5px;color:var(--text-0);font-variant-numeric:tabular-nums;letter-spacing:.03em;display:flex;align-items:center;gap:5px;overflow-wrap:anywhere}
.f .v.vr-down{color:#fca5a5}
.f .v.dim{color:var(--text-2)}
.f .v small{font-family:var(--mono);font-size:10px;color:var(--text-3);font-weight:400}
.f .v .sqk-em{color:var(--crit);font-weight:600;animation:pulseCrit 1.5s infinite}

@keyframes pulseCrit{0%,100%{text-shadow:0 0 0 transparent}50%{text-shadow:0 0 8px rgba(239,68,68,.6)}}

/* ── Sidebar detail — single-line rows (Vec1, v1.2) ──
 * Replaces the old 2-column .fields grid. Each .fr row puts the label on
 * the left and the value on the right (space-between). Designed for the
 * narrower 200px sidebar where the prior 2-col layout wrapped awkwardly. */
.fields-rows{display:flex;flex-direction:column;gap:0}
.fields-rows .fr{
  display:flex;flex-direction:column;align-items:flex-start;gap:2px;
  padding:6px 0;
  border-bottom:1px dashed rgba(30,58,95,.32);
}
.fields-rows .fr:last-child{border-bottom:0}
.fields-rows .fr .k{
  font-family:var(--cond);font-size:9.5px;letter-spacing:.18em;
  color:var(--text-3);text-transform:uppercase;
  flex:0 0 auto;
}
.fields-rows .fr .v{
  font-family:var(--mono);font-size:12px;color:var(--text-0);
  font-variant-numeric:tabular-nums;letter-spacing:.03em;
  text-align:left;
  width:100%;min-width:0;
  overflow-wrap:anywhere;
  display:inline-flex;align-items:center;justify-content:flex-start;gap:4px;
}
.fields-rows .fr .v small{font-family:var(--mono);font-size:10px;color:var(--text-3);font-weight:400}
.fields-rows .fr .v.vr-down{color:#fca5a5}
.fields-rows .fr .v .sqk-em{color:var(--crit);font-weight:600;animation:pulseCrit 1.5s infinite}
/* fr-wrap je teraz redundantné — všetky riadky sú stacked column. Ponechané
 * kvôli HTML kompatibilite (Súradnice riadok ho má v markup). */
.fields-rows .fr.fr-wrap .v{white-space:normal}

/* POLOHA / SIGNAL combined row — visually separated section */
.fields-rows.poloha-signal{
  margin-top:6px;padding-top:8px;
  border-top:1px solid var(--border);
}

/* Collapsible "Ostatné údaje" section — default closed, low-emphasis */
.detail-collapse{
  margin-top:10px;padding-top:8px;
  border-top:1px solid var(--border);
}
.detail-collapse > summary{
  font-family:var(--cond);font-size:9.5px;letter-spacing:.22em;
  color:var(--text-3);text-transform:uppercase;
  cursor:pointer;padding:4px 0;list-style:none;user-select:none;
  display:flex;align-items:center;gap:6px;
}
.detail-collapse > summary::-webkit-details-marker{display:none}
.detail-collapse > summary::before{
  content:"▸";display:inline-block;font-size:9px;color:var(--text-4);
  transition:transform .15s ease;
}
.detail-collapse[open] > summary::before{transform:rotate(90deg);color:var(--text-3)}
.detail-collapse > summary:hover{color:var(--text-1)}
.detail-collapse > summary:hover::before{color:var(--text-2)}
.detail-collapse > .fields-rows{margin-top:6px}

/* Aircraft photo in detail header */
.detail-photo{margin:10px 0 4px;border:1px solid var(--border);background:var(--bg-0);position:relative;overflow:hidden;min-height:96px;display:flex;align-items:center;justify-content:center}
.detail-photo img{width:100%;height:auto;display:block;max-height:180px;object-fit:cover}
.detail-photo .ph-empty{font-family:var(--mono);font-size:10.5px;color:var(--text-3);letter-spacing:.05em;padding:18px 12px;text-align:center}
.detail-photo .ph-credit{position:absolute;bottom:0;right:0;font-family:var(--mono);font-size:9px;color:var(--text-1);background:rgba(0,0,0,.55);padding:2px 6px;letter-spacing:.04em}
.detail-photo .ph-badge{position:absolute;top:6px;left:6px;font-family:var(--cond);font-size:9px;letter-spacing:.18em;color:var(--warn);text-transform:uppercase;padding:2px 6px;background:rgba(245,165,36,.12);border:1px solid rgba(245,165,36,.45)}

/* Side list — compact table layout */
.side-list{flex:1 1 auto;min-height:120px;overflow-y:auto;overflow-x:hidden;border-top:1px solid var(--border);background:var(--bg-1)}
.side-empty{padding:24px 16px;font-family:var(--mono);font-size:11px;color:var(--text-3);text-align:center;letter-spacing:.04em}

/* Shared column template: bar · cs · type · reg · alt · spd · trk · src */
.ac, .ac-head{
  display:grid;
  grid-template-columns: 3px minmax(0,1fr) 44px minmax(0,72px) 56px 44px 40px 52px;
  column-gap:8px;
  align-items:center;
  padding:0 10px 0 0;
  position:relative;
}

/* Sticky header row */
.ac-head{
  position:sticky; top:0; z-index:2;
  height:26px;
  background:linear-gradient(180deg,#0d1c34,#0a1628);
  border-bottom:1px solid var(--border-br);
  font-family:var(--cond); font-size:9.5px; letter-spacing:.2em;
  color:var(--text-3); text-transform:uppercase;
}
.ac-head > span{padding:0 2px;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.ac-head .h-alt, .ac-head .h-spd, .ac-head .h-trk{text-align:right}
.ac-head .h-bar{grid-column:1;padding:0}

/* Data row */
.ac{
  height:28px;
  border-bottom:1px solid rgba(30,58,95,.4);
  cursor:pointer;
  font-family:var(--mono); font-size:11.5px;
  color:var(--text-1);
  font-variant-numeric:tabular-nums;
}
.ac:hover{background:rgba(56,189,248,.05)}
.ac > span{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.ac .bar{grid-column:1;align-self:stretch;background:transparent}
.ac[data-type="commercial"] .bar{background:var(--cy-dim)}
.ac[data-type="ga"] .bar{background:#a7f3d0}
.ac[data-type="heli"] .bar{background:#fbbf24}
.ac[data-type="mil"] .bar{background:var(--magenta)}

.ac .cs{font-weight:600;font-size:12px;color:var(--text-0);letter-spacing:.03em}
.ac .type{color:var(--cy-dim);font-size:10.5px;letter-spacing:.04em}
.ac .reg{color:var(--text-2);font-size:10.5px;letter-spacing:.03em}
.ac .alt{text-align:right;font-weight:600;color:var(--text-0)}
.ac .spd{text-align:right;color:var(--text-2);font-size:10.5px}
.ac .trk{text-align:right;color:var(--text-2);font-size:10.5px}
.ac .src{color:var(--text-3);font-size:10px;letter-spacing:.05em;text-transform:uppercase}

.ac.is-em .cs, .ac.is-em .src{color:var(--crit)}

.ac.is-sel{background:linear-gradient(90deg, rgba(56,189,248,.14), rgba(56,189,248,.03));box-shadow:inset 2px 0 0 var(--cy), inset 0 0 0 1px rgba(56,189,248,.1)}
.ac.is-sel .cs{color:var(--cy)}
.ac.is-sel .alt{color:var(--cy)}

/* ── MAP area — hosts tar1090 engine ── */
.map{grid-area:map;position:relative;overflow:hidden;background:#060f22}
#layout_container{position:absolute !important;inset:0 !important;width:100% !important;height:100% !important}
#map_container{position:absolute !important;inset:0 !important;width:100% !important;height:100% !important;background:#060f22 !important}
#map_canvas{position:absolute !important;inset:0 !important;width:100% !important;height:100% !important;background:#060f22 !important}

/* Map HUD overlays */
.map-hud{position:absolute;inset:0;pointer-events:none;z-index:30}
.map-hud > *{pointer-events:auto}
.coords{position:absolute;top:14px;left:16px;display:flex;flex-direction:column;gap:4px;font-family:var(--mono);font-size:10.5px;color:var(--text-1);letter-spacing:.05em;padding:6px 10px;background:rgba(10,22,40,.6);backdrop-filter:blur(6px);border:1px solid var(--border)}
.coords .k{color:var(--text-3);font-family:var(--cond);font-size:9.5px;letter-spacing:.2em;text-transform:uppercase}
.coords .grp{display:flex;gap:10px;align-items:baseline}
.coords .v{font-variant-numeric:tabular-nums}

.map-modes{position:absolute;top:14px;left:50%;transform:translateX(-50%);display:flex;gap:0;border:1px solid var(--border);background:rgba(10,22,40,.72);backdrop-filter:blur(8px)}
.map-modes button{font-family:var(--cond);font-weight:600;font-size:10.5px;letter-spacing:.18em;color:var(--text-2);text-transform:uppercase;padding:7px 14px;background:transparent;border:0;border-left:1px solid var(--border);cursor:pointer}
.map-modes button:first-child{border-left:0}
.map-modes button:hover{color:var(--text-0)}
.map-modes button.is-on{color:var(--cy);background:var(--cy-soft);box-shadow:inset 0 -2px 0 var(--cy)}

/* Zoom controls — stacked vertically, bottom-right */
.zoom-ctrl{position:absolute;right:14px;bottom:18px;display:flex;flex-direction:column;border:1px solid var(--border);background:rgba(10,22,40,.72);backdrop-filter:blur(8px)}
.zoom-ctrl button{
  width:38px;height:38px;border:0;border-bottom:1px solid var(--border);background:transparent;
  font-family:var(--mono);font-size:18px;color:var(--text-0);cursor:pointer;
  display:grid;place-items:center;line-height:1;
}
.zoom-ctrl button:last-child{border-bottom:0}
.zoom-ctrl button:hover{background:var(--cy-soft);color:var(--cy)}
.zoom-ctrl button:active{background:rgba(56,189,248,.18)}

/* ── RIGHT PANEL ── */
.right{grid-area:right;background:var(--bg-1);border-left:1px solid var(--border);overflow-y:auto;display:flex;flex-direction:column}
.card{border-bottom:1px solid var(--border);padding:14px 16px}
.card-head{display:flex;align-items:center;justify-content:space-between;margin-bottom:10px}
.card-head h3{font-family:var(--cond);font-weight:600;font-size:11px;letter-spacing:.24em;color:var(--text-0);text-transform:uppercase;margin:0}
.card-head .sub{font-family:var(--mono);font-size:10px;color:var(--text-3);letter-spacing:.05em}

.layers{display:flex;flex-direction:column;gap:4px}
.layer{display:grid;grid-template-columns:auto 1fr auto;column-gap:10px;align-items:center;padding:7px 10px;border:1px solid var(--border);background:var(--bg-2);cursor:pointer}
.layer:hover{border-color:var(--border-br)}
.layer.is-on{border-color:rgba(56,189,248,.3);background:var(--cy-soft)}
.layer .sw{position:relative;width:26px;height:14px;background:var(--bg-4);border:1px solid var(--border-br);border-radius:999px;transition:all .18s ease}
.layer .sw::after{content:"";position:absolute;top:1px;left:1px;width:10px;height:10px;background:var(--text-3);border-radius:50%;transition:all .18s ease}
.layer.is-on .sw{background:var(--cy);border-color:var(--cy-dim)}
.layer.is-on .sw::after{left:13px;background:#fff;box-shadow:0 0 6px var(--cy-glow)}
.layer .nm{font-family:var(--mono);font-size:12px;color:var(--text-0);letter-spacing:.03em}
.layer .nm small{display:block;font-family:var(--cond);font-size:9.5px;color:var(--text-3);letter-spacing:.14em;text-transform:uppercase;margin-top:1px}
.layer .op{font-family:var(--mono);font-size:10px;color:var(--text-2);font-variant-numeric:tabular-nums}

/* Overlay group — header row + variant strip directly under it.
   Visually one connected card so .ovl-row + .ovl-variants share the same
   1px border (variant strip has top:0 to fold into the row). */
.ovl-grp{display:flex;flex-direction:column;border:1px solid var(--border);background:var(--bg-2)}
.ovl-grp:hover{border-color:var(--border-br)}
.ovl-grp.is-on{border-color:rgba(56,189,248,.35);background:var(--cy-soft)}

.ovl-row{display:grid;grid-template-columns:18px 1fr 26px;column-gap:10px;align-items:center;padding:7px 10px;cursor:pointer;outline:0}
.ovl-row:focus-visible{box-shadow:inset 0 0 0 1px var(--cy)}
.ovl-ico{width:18px;height:18px;color:var(--text-2);display:flex;align-items:center;justify-content:center}
.ovl-ico svg{width:16px;height:16px;display:block}
.ovl-grp.is-on .ovl-ico{color:var(--cy)}
.ovl-nm{font-family:var(--mono);font-size:12px;color:var(--text-0);letter-spacing:.04em;text-transform:uppercase}
/* Switch — same look as .layer .sw */
.ovl-sw{position:relative;width:26px;height:14px;background:var(--bg-4);border:1px solid var(--border-br);border-radius:999px;transition:all .18s ease}
.ovl-sw::after{content:"";position:absolute;top:1px;left:1px;width:10px;height:10px;background:var(--text-3);border-radius:50%;transition:all .18s ease}
.ovl-grp.is-on .ovl-sw{background:var(--cy);border-color:var(--cy-dim)}
.ovl-grp.is-on .ovl-sw::after{left:13px;background:#fff;box-shadow:0 0 6px var(--cy-glow)}

/* Variant strip — segmented selector. Border-top rolls into the row's bottom
   border (no double border). Disabled until the group is active. */
.ovl-variants{display:grid;grid-template-columns:repeat(3,1fr);border-top:1px solid var(--border)}
.ovl-grp.is-on .ovl-variants{border-top-color:rgba(56,189,248,.22)}
.ovl-variants button{font-family:var(--cond);font-weight:600;font-size:9.5px;letter-spacing:.18em;text-transform:uppercase;color:var(--text-3);background:transparent;border:0;border-left:1px solid var(--border);padding:5px 0;cursor:pointer;transition:color .15s ease,background .15s ease}
.ovl-variants button:first-child{border-left:0}
.ovl-grp.is-on .ovl-variants button{color:var(--text-2);cursor:pointer}
.ovl-grp.is-on .ovl-variants button:hover{color:var(--text-0);background:rgba(56,189,248,.06)}
.ovl-variants button.is-on{color:var(--cy);background:rgba(56,189,248,.12);box-shadow:inset 0 -2px 0 var(--cy)}
.ovl-variants button[disabled]{opacity:.4;cursor:not-allowed;color:var(--text-3)}
.ovl-variants button[disabled]:hover{background:transparent;color:var(--text-3)}

/* PRIESTORY — 6 nezávislých toggleov pre kategórie LPS VFR vector airspace.
   Pattern po vzore .lt-row (label toggles) — switch vľavo, názov vpravo. */
.ovl-priestory{margin-top:10px;display:flex;flex-direction:column;gap:4px}
.ovl-priestory .priestory-head{font-family:var(--cond);font-size:9.5px;letter-spacing:.22em;color:var(--text-3);text-transform:uppercase;padding-bottom:6px;border-bottom:1px dashed var(--border);margin-bottom:4px}
.prst-row{display:grid;grid-template-columns:auto 1fr;column-gap:10px;align-items:center;padding:6px 10px;border:1px solid var(--border);background:var(--bg-2);cursor:pointer;outline:0}
.prst-row:hover{border-color:var(--border-br)}
.prst-row:focus-visible{box-shadow:inset 0 0 0 1px var(--cy)}
.prst-row.is-on{border-color:rgba(56,189,248,.3);background:var(--cy-soft)}
.prst-row .sw{position:relative;width:26px;height:14px;background:var(--bg-4);border:1px solid var(--border-br);border-radius:999px;transition:all .18s ease}
.prst-row .sw::after{content:"";position:absolute;top:1px;left:1px;width:10px;height:10px;background:var(--text-3);border-radius:50%;transition:all .18s ease}
.prst-row.is-on .sw{background:var(--cy);border-color:var(--cy-dim)}
.prst-row.is-on .sw::after{left:13px;background:#fff;box-shadow:0 0 6px var(--cy-glow)}
.prst-row .nm{font-family:var(--mono);font-size:11.5px;color:var(--text-0);letter-spacing:.04em;text-transform:uppercase}

.slider{display:flex;flex-direction:column;gap:8px;margin-top:12px}
.slider .lbl-row{display:flex;justify-content:space-between;align-items:baseline;font-family:var(--cond);font-size:10px;letter-spacing:.2em;color:var(--text-2);text-transform:uppercase}
.slider .lbl-row .v{font-family:var(--mono);font-size:11px;color:var(--cy);letter-spacing:.04em;font-variant-numeric:tabular-nums}
.slider input[type=range]{-webkit-appearance:none;appearance:none;width:100%;height:4px;background:var(--bg-4);border:1px solid var(--border);outline:0}
.slider input[type=range]::-webkit-slider-thumb{-webkit-appearance:none;appearance:none;width:14px;height:14px;background:var(--cy);border:1px solid #fff;cursor:pointer;box-shadow:0 0 0 3px var(--cy-soft)}
.slider input[type=range]::-moz-range-thumb{width:14px;height:14px;background:var(--cy);border:1px solid #fff;cursor:pointer}
.slider .ticks{display:flex;justify-content:space-between;font-family:var(--mono);font-size:9.5px;color:var(--text-3)}

/* Aircraft label toggles (Display card) */
.label-toggles{margin-top:14px;display:flex;flex-direction:column;gap:4px}
.label-toggles .lt-head{font-family:var(--cond);font-size:9.5px;letter-spacing:.22em;color:var(--text-3);text-transform:uppercase;padding-bottom:6px;border-bottom:1px dashed var(--border);margin-bottom:4px}
.lt-row{display:grid;grid-template-columns:auto 1fr;column-gap:10px;align-items:center;padding:6px 10px;border:1px solid var(--border);background:var(--bg-2);cursor:pointer}
.lt-row:hover{border-color:var(--border-br)}
.lt-row.is-on{border-color:rgba(56,189,248,.3);background:var(--cy-soft)}
.lt-row .sw{position:relative;width:26px;height:14px;background:var(--bg-4);border:1px solid var(--border-br);border-radius:999px;transition:all .18s ease}
.lt-row .sw::after{content:"";position:absolute;top:1px;left:1px;width:10px;height:10px;background:var(--text-3);border-radius:50%;transition:all .18s ease}
.lt-row.is-on .sw{background:var(--cy);border-color:var(--cy-dim)}
.lt-row.is-on .sw::after{left:13px;background:#fff;box-shadow:0 0 6px var(--cy-glow)}
.lt-row .nm{font-family:var(--mono);font-size:11.5px;color:var(--text-0);letter-spacing:.03em}
.label-toggles .lt-sep{height:1px;background:var(--border);margin:10px 0 4px;opacity:.55}
.label-toggles .lt-sep + .lt-head{margin-top:2px}

/* Data source row (reused inside popup) */
.src{display:grid;grid-template-columns:10px 1fr auto auto;column-gap:12px;align-items:center;padding:10px 12px;border-bottom:1px dashed rgba(30,58,95,.6)}
.src:last-child{border-bottom:0}
.src .d{width:10px;height:10px;border-radius:50%;position:relative}
.src[data-st="ok"] .d{background:var(--ok);box-shadow:0 0 8px var(--ok-glow)}
.src[data-st="warn"] .d{background:var(--warn)}
.src[data-st="crit"] .d{background:var(--crit)}
.src[data-st="idle"] .d{background:var(--text-4)}
.src .nm{font-family:var(--mono);font-size:12px;color:var(--text-0);letter-spacing:.03em}
.src .nm small{display:block;font-family:var(--cond);font-size:9.5px;letter-spacing:.16em;color:var(--text-3);text-transform:uppercase}
.src .rate{font-family:var(--mono);font-size:11px;color:var(--text-2);font-variant-numeric:tabular-nums;letter-spacing:.04em;white-space:nowrap}
.src .rate b{color:var(--text-0);font-weight:500}

/* In-View Contacts card — right-rail list of currently visible aircraft */
.card.inview-card{padding:0;display:flex;flex-direction:column;flex:1 1 auto;min-height:200px}
.card.inview-card .card-head{margin-bottom:0;padding:14px 16px 10px}
.card.inview-card .side-list.inview-list{flex:1 1 auto;max-height:none;min-height:120px}
/* ACFT LIST grid: bar | CS (flex, ≥7ch) | TYPE | ALT — drops the unused
 * trailing track and gives CS the room it needs to render full callsigns
 * (e.g. "WZZ4837A") without ellipsis truncation. */
.card.inview-card .ac, .card.inview-card .ac-head{
  grid-template-columns: 3px minmax(7ch,1fr) 50px 64px;
  column-gap:6px;
}
.card.inview-card .ac .cs, .card.inview-card .ac-head .h-cs{font-size:12.5px}
.card.inview-card .ac .reg, .card.inview-card .ac-head .h-reg,
.card.inview-card .ac .spd, .card.inview-card .ac-head .h-spd,
.card.inview-card .ac .trk, .card.inview-card .ac-head .h-trk,
.card.inview-card .ac .src, .card.inview-card .ac-head .h-src{display:none}

/* Active Airspaces — sidebar trigger card. The full list lives in
 * #gafr-airspaces-popup; this stub just opens it. */
.card.airspaces-trigger{
  padding:0;
  cursor:pointer;
  user-select:none;
  transition:background .15s ease, border-color .15s ease;
}
.card.airspaces-trigger:hover{background:var(--bg-2)}
.card.airspaces-trigger:focus-visible{outline:2px solid var(--cy);outline-offset:-2px}
.card.airspaces-trigger .card-head{margin-bottom:0;padding:14px 16px}
.card.airspaces-trigger .card-head h3{position:relative;padding-right:20px}
.card.airspaces-trigger .card-head h3::after{
  content:'›';
  position:absolute; right:0; top:50%; transform:translateY(-55%);
  color:var(--text-3); font-weight:300; font-size:18px;
  transition:transform .15s ease, color .15s ease;
}
.card.airspaces-trigger:hover .card-head h3::after{transform:translateY(-55%) translateX(2px);color:var(--cy)}

/* Airspace list lives inside #gafr-airspaces-popup now — keep base styling */
#gafr-airspaces-popup .airspace-list{
  max-height:60vh; overflow-y:auto; background:var(--bg-1);
  border-radius:6px;
}

.airspace-row{
  display:grid;
  grid-template-columns: 3px 38px minmax(0,1fr) 56px;
  column-gap:8px;
  align-items:center;
  padding:7px 10px 7px 0;
  border-bottom:1px solid var(--border);
  cursor:pointer;
  position:relative;
  font-family:var(--mono);
}
.airspace-row:hover{background:var(--bg-2)}
.airspace-row .as-bar{align-self:stretch;background:var(--text-4)}
.airspace-row.t-R   .as-bar{background:#ff3030}
.airspace-row.t-D   .as-bar{background:#ff8c00}
.airspace-row.t-P   .as-bar{background:#a00000}
.airspace-row.t-TRA .as-bar{background:#f9e50b}
.airspace-row.t-TSA .as-bar{background:#ff00ff}
.airspace-row.t-A   .as-bar{background:#fcfcfc}
.airspace-row.t-RAS .as-bar{background:#52a0ff}

.airspace-row .as-type{
  font-family:var(--cond);font-weight:700;font-size:10px;
  letter-spacing:.16em;text-align:center;color:var(--text-0);
  padding:2px 4px;background:var(--bg-3);border:1px solid var(--border-br);
  text-transform:uppercase;
}
.airspace-row.t-R   .as-type{color:#ff7070;border-color:rgba(255,48,48,.45);background:rgba(255,48,48,.08)}
.airspace-row.t-D   .as-type{color:#ffb060;border-color:rgba(255,140,0,.45);background:rgba(255,140,0,.08)}
.airspace-row.t-P   .as-type{color:#ff5050;border-color:rgba(160,0,0,.6);background:rgba(160,0,0,.18)}
.airspace-row.t-TRA .as-type{color:#f9e50b;border-color:rgba(249,229,11,.45);background:rgba(249,229,11,.08)}
.airspace-row.t-TSA .as-type{color:#ff7eff;border-color:rgba(255,0,255,.45);background:rgba(255,0,255,.08)}
.airspace-row.t-A   .as-type{color:#fff;border-color:rgba(255,255,255,.45)}
.airspace-row.t-RAS .as-type{color:#52a0ff;border-color:rgba(82,160,255,.45);background:rgba(82,160,255,.08)}

.airspace-row .as-name{display:flex;flex-direction:column;gap:2px;min-width:0}
.airspace-row .as-name .as-id{
  font-weight:600;font-size:12.5px;color:var(--text-0);
  letter-spacing:.03em;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap;
}
.airspace-row .as-name .as-alt{
  font-size:10px;color:var(--text-2);letter-spacing:.04em;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap;
}
.airspace-row .as-time{
  text-align:right;display:flex;flex-direction:column;gap:2px;
  font-variant-numeric:tabular-nums;letter-spacing:.04em;
}
.airspace-row .as-time .as-tend{font-size:11px;color:var(--text-0)}
.airspace-row .as-time .as-trem{font-size:9.5px;color:var(--cy);letter-spacing:.06em}
.airspace-row .as-time .as-trem.warn{color:var(--warn)}
.airspace-row.is-stale{opacity:.55}

/* AUP/UUP hover popup (mapa) — quick tooltip with name only (follows cursor) */
#aup-hover-popup{
  position:absolute; pointer-events:none; z-index:120;
  min-width:140px; max-width:320px;
  background:linear-gradient(180deg,#0d1c34,#0a1628);
  border:1px solid var(--border-br);
  box-shadow:0 4px 18px rgba(0,0,0,.55);
  font-family:var(--mono);
  opacity:0; transform:translateY(2px);
  transition:opacity .18s ease, transform .18s ease;
}
#aup-hover-popup::before{content:"";position:absolute;top:-1px;left:0;right:0;height:1px;background:linear-gradient(90deg, transparent, var(--cy) 30%, var(--cy) 70%, transparent);opacity:.55}
#aup-hover-popup.is-quick{opacity:1;transform:translateY(0)}
#aup-hover-popup .ahp-quick{padding:7px 11px;font-size:12.5px;color:var(--text-0);font-weight:600;letter-spacing:.03em;white-space:nowrap}
#aup-hover-popup .ahp-quick .ahp-q-type{
  display:inline-block;font-family:var(--cond);font-weight:700;font-size:9.5px;
  letter-spacing:.18em;padding:2px 4px;margin-right:6px;border:1px solid var(--border-br);
  text-transform:uppercase;vertical-align:middle;
}
#aup-hover-popup .ahp-quick .ahp-q-type.t-R   {color:#ff7070;border-color:rgba(255,48,48,.45);background:rgba(255,48,48,.08)}
#aup-hover-popup .ahp-quick .ahp-q-type.t-D   {color:#ffb060;border-color:rgba(255,140,0,.45);background:rgba(255,140,0,.08)}
#aup-hover-popup .ahp-quick .ahp-q-type.t-P   {color:#ff5050;border-color:rgba(160,0,0,.6); background:rgba(160,0,0,.18)}
#aup-hover-popup .ahp-quick .ahp-q-type.t-TRA {color:#f9e50b;border-color:rgba(249,229,11,.45);background:rgba(249,229,11,.08)}
#aup-hover-popup .ahp-quick .ahp-q-type.t-TSA {color:#ff7eff;border-color:rgba(255,0,255,.45);background:rgba(255,0,255,.08)}
#aup-hover-popup .ahp-quick .ahp-q-type.t-A   {color:#fff;   border-color:rgba(255,255,255,.45)}
#aup-hover-popup .ahp-quick .ahp-q-type.t-RAS {color:#52a0ff;border-color:rgba(82,160,255,.45);background:rgba(82,160,255,.08)}

/* Stack layout — multiple priestory pod kurzorom (overlap zoznam) */
#aup-hover-popup .ahp-stack{min-width:200px;max-width:320px}
#aup-hover-popup .ahp-s-head{
  padding:4px 9px;font-family:var(--cond);font-size:9.5px;letter-spacing:.18em;color:var(--text-3);
  text-transform:uppercase;border-bottom:1px solid var(--border);background:rgba(0,0,0,.25);
}
#aup-hover-popup .ahp-s-row{
  display:flex;align-items:center;gap:8px;
  padding:6px 9px;font-size:12px;color:var(--text-0);font-weight:600;
  letter-spacing:.03em;border-bottom:1px solid rgba(255,255,255,.05);
}
#aup-hover-popup .ahp-s-row:last-child{border-bottom:none}
#aup-hover-popup .ahp-s-type{
  display:inline-block;font-family:var(--cond);font-weight:700;font-size:9.5px;
  letter-spacing:.18em;padding:2px 4px;border:1px solid var(--border-br);
  text-transform:uppercase;text-align:center;min-width:28px;flex:0 0 auto;
}
#aup-hover-popup .ahp-s-id{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
#aup-hover-popup .ahp-s-alt{font-family:var(--mono);font-size:10.5px;color:var(--text-3);font-variant-numeric:tabular-nums;flex:0 0 auto}
#aup-hover-popup .ahp-s-type.t-R   {color:#ff7070;border-color:rgba(255,48,48,.45);background:rgba(255,48,48,.08)}
#aup-hover-popup .ahp-s-type.t-D   {color:#ffb060;border-color:rgba(255,140,0,.45);background:rgba(255,140,0,.08)}
#aup-hover-popup .ahp-s-type.t-P   {color:#ff5050;border-color:rgba(160,0,0,.6); background:rgba(160,0,0,.18)}
#aup-hover-popup .ahp-s-type.t-TRA {color:#f9e50b;border-color:rgba(249,229,11,.45);background:rgba(249,229,11,.08)}
#aup-hover-popup .ahp-s-type.t-TSA {color:#ff7eff;border-color:rgba(255,0,255,.45);background:rgba(255,0,255,.08)}
#aup-hover-popup .ahp-s-type.t-A   {color:#fff;   border-color:rgba(255,255,255,.45)}
#aup-hover-popup .ahp-s-type.t-RAS {color:#52a0ff;border-color:rgba(82,160,255,.45);background:rgba(82,160,255,.08)}

/* AUP/UUP click detail popup (mapa) — sticky card opened on single-click */
#aup-detail-popup{
  position:absolute; pointer-events:auto; z-index:130;
  min-width:240px; max-width:320px;
  background:linear-gradient(180deg,#0d1c34,#0a1628);
  border:1px solid var(--border-br);
  box-shadow:0 6px 22px rgba(0,0,0,.65);
  font-family:var(--mono);
  display:none; opacity:0; transform:translateY(2px);
  transition:opacity .22s ease, transform .22s ease;
}
#aup-detail-popup::before{content:"";position:absolute;top:-1px;left:0;right:0;height:1px;background:linear-gradient(90deg, transparent, var(--cy) 30%, var(--cy) 70%, transparent);opacity:.7}
#aup-detail-popup.is-open{display:block;opacity:1;transform:translateY(0)}
#aup-detail-popup .adp-close{
  position:absolute;top:4px;right:4px;width:22px;height:22px;
  background:transparent;border:1px solid transparent;color:var(--text-2);
  font-family:var(--mono);font-size:18px;line-height:18px;cursor:pointer;
  padding:0;display:flex;align-items:center;justify-content:center;
  transition:color .15s, border-color .15s, background .15s;
}
#aup-detail-popup .adp-close:hover{color:var(--text-0);border-color:var(--border-br);background:rgba(255,255,255,.04)}
#aup-detail-popup .adp-body{padding:10px 12px}
#aup-detail-popup .adp-head{display:flex;align-items:baseline;justify-content:space-between;gap:8px;margin-bottom:8px;padding-right:24px;padding-bottom:6px;border-bottom:1px dashed var(--border)}
#aup-detail-popup .adp-head-l{display:flex;align-items:baseline;gap:8px;min-width:0}
#aup-detail-popup .adp-id{font-size:14px;font-weight:600;color:var(--text-0);letter-spacing:.03em;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
#aup-detail-popup .adp-type{
  font-family:var(--cond);font-weight:700;font-size:10px;letter-spacing:.18em;
  text-align:center;padding:2px 5px;border:1px solid var(--border-br);
  text-transform:uppercase;flex:0 0 auto;
}
#aup-detail-popup .adp-status{
  font-family:var(--cond);font-weight:600;font-size:9.5px;letter-spacing:.18em;
  color:var(--ok);padding:2px 5px;background:rgba(47,212,122,.1);
  border:1px solid rgba(47,212,122,.4);text-transform:uppercase;flex:0 0 auto;
}
#aup-detail-popup .adp-fields{display:grid;grid-template-columns:repeat(2,1fr);gap:8px 10px}
#aup-detail-popup .adp-fields .f{display:flex;flex-direction:column;gap:2px;min-width:0}
#aup-detail-popup .adp-fields .f.full{grid-column:1 / -1}
#aup-detail-popup .adp-fields .k{font-family:var(--cond);font-size:9.5px;letter-spacing:.2em;color:var(--text-3);text-transform:uppercase}
#aup-detail-popup .adp-fields .v{font-family:var(--mono);font-size:11.5px;color:var(--text-0);font-variant-numeric:tabular-nums;letter-spacing:.03em;overflow-wrap:anywhere}
#aup-detail-popup .adp-type.t-R   {color:#ff7070;border-color:rgba(255,48,48,.45);background:rgba(255,48,48,.08)}
#aup-detail-popup .adp-type.t-D   {color:#ffb060;border-color:rgba(255,140,0,.45);background:rgba(255,140,0,.08)}
#aup-detail-popup .adp-type.t-P   {color:#ff5050;border-color:rgba(160,0,0,.6); background:rgba(160,0,0,.18)}
#aup-detail-popup .adp-type.t-TRA {color:#f9e50b;border-color:rgba(249,229,11,.45);background:rgba(249,229,11,.08)}
#aup-detail-popup .adp-type.t-TSA {color:#ff7eff;border-color:rgba(255,0,255,.45);background:rgba(255,0,255,.08)}
#aup-detail-popup .adp-type.t-A   {color:#fff;   border-color:rgba(255,255,255,.45)}
#aup-detail-popup .adp-type.t-RAS {color:#52a0ff;border-color:rgba(82,160,255,.45);background:rgba(82,160,255,.08)}

/* Detail nav widget — prepínanie medzi prekrytými priestormi (overlap) */
#aup-detail-popup .adp-nav{
  display:flex;align-items:center;gap:4px;margin-right:8px;
  background:rgba(255,255,255,.04);border:1px solid var(--border);
  border-radius:4px;padding:1px 2px;flex:0 0 auto;
}
#aup-detail-popup .adp-nav button{
  background:transparent;border:none;color:var(--text-1);
  font-family:var(--mono);font-size:14px;line-height:1;
  padding:1px 6px;cursor:pointer;border-radius:3px;
  transition:color .15s, background .15s;
}
#aup-detail-popup .adp-nav button:hover:not(:disabled){color:var(--cy);background:rgba(0,212,255,.12)}
#aup-detail-popup .adp-nav button:disabled{color:var(--text-3);cursor:default}
#aup-detail-popup .adp-nav-pos{
  font-family:var(--mono);font-size:10.5px;color:var(--text-2);
  font-variant-numeric:tabular-nums;min-width:28px;text-align:center;
}

/* Advanced button inside config popup */
.tool-btn-inline{
  width:100%;padding:9px 14px;background:var(--bg-0);border:1px solid var(--border);
  color:var(--text-1);cursor:pointer;font-family:var(--cond);font-size:11px;letter-spacing:.18em;
  text-transform:uppercase;text-align:left;
}
.tool-btn-inline:hover{border-color:var(--cy);color:var(--cy)}

/* ── POPUP OVERLAYS ── */
.popup-backdrop{position:fixed;inset:0;background:rgba(3,8,19,.55);backdrop-filter:blur(3px);z-index:150;display:none;opacity:0;transition:opacity .14s ease}
.popup-backdrop.is-open{display:block;opacity:1}

.popup{
  position:fixed;z-index:180;
  background:var(--bg-2);
  border:1px solid var(--border-br);
  box-shadow:0 20px 60px rgba(0,0,0,.6), 0 0 0 1px var(--cy-soft);
  display:none;flex-direction:column;
  width:420px; max-width:92vw;
  max-height:70vh;
  min-height:0;
}
.popup.is-open{display:flex}
.popup-head{display:flex;align-items:center;justify-content:space-between;padding:14px 18px;border-bottom:1px solid var(--border);background:linear-gradient(180deg, rgba(56,189,248,.06), transparent)}
.popup-head h3{margin:0;font-family:var(--cond);font-weight:600;font-size:12px;letter-spacing:.24em;color:var(--text-0);text-transform:uppercase}
.popup-head .sub{font-family:var(--mono);font-size:10px;color:var(--text-3);letter-spacing:.04em}
.popup-close{width:26px;height:26px;border:1px solid var(--border);background:var(--bg-0);color:var(--text-2);cursor:pointer;font-family:var(--mono);font-size:16px;line-height:1;display:grid;place-items:center}
.popup-close:hover{border-color:var(--crit);color:var(--crit)}
.popup-body{padding:10px 0;overflow-y:auto}

/* Position-anchored variants: topbar popups drop down from topbar button */
.popup.anchor-top{top:calc(var(--topbar-h) + 4px);right:12px}

/* Contacts popup (variant B) — wider, holds list+filters+search */
.popup.ct-popup{width:520px;max-width:92vw;max-height:70vh}
.popup.ct-popup .popup-body{padding:0;overflow:hidden;display:flex;flex-direction:column;min-height:0}
.ct-body-wrap{display:flex;flex-direction:column;min-height:0;flex:1 1 auto}
.ct-body-wrap .filter-row{padding:10px 12px 6px}
.ct-body-wrap .side-search{margin:0 12px 8px}
.ct-body-wrap .side-list{flex:1 1 auto;min-height:120px;overflow-y:auto;border-top:1px solid var(--border)}

/* ── STATUS BAR ── */
.status{grid-area:stat;display:flex;align-items:center;background:var(--bg-0);border-top:1px solid var(--border);font-family:var(--mono);font-size:10.5px;color:var(--text-2);letter-spacing:.04em}
.status > *{padding:0 12px;height:100%;display:flex;align-items:center;gap:8px;border-right:1px solid var(--border)}
.status > *:last-child{border-right:0}
.status .k{font-family:var(--cond);font-size:9.5px;letter-spacing:.2em;color:var(--text-3);text-transform:uppercase}
.status .v{color:var(--text-0);font-variant-numeric:tabular-nums}
.status .v.ok{color:var(--ok)}
.status .v.warn{color:var(--warn)}
.status .v.crit{color:var(--crit)}
/* Warning strip — legal disclaimer, must be obvious. Sits between the data
   blocks and the copyright pill on the right. Pulsing border draws the eye
   without the whole bar feeling alarmed. */
.status .status-warn{
  margin-left:auto;
  font-family:var(--cond);font-weight:700;font-size:11px;letter-spacing:.14em;
  color:var(--crit);text-transform:uppercase;
  background:rgba(239,68,68,.08);
  border-left:1px solid rgba(239,68,68,.35) !important;
  border-right:1px solid rgba(239,68,68,.35) !important;
  box-shadow:inset 0 -1px 0 rgba(239,68,68,.55), inset 0 1px 0 rgba(239,68,68,.55);
  padding:0 16px;
  animation:warnPulse 2.2s ease-in-out infinite;
}
.status .status-copy{
  font-family:var(--mono);font-size:10.5px;color:var(--text-3);letter-spacing:.05em;
}
@keyframes warnPulse{
  0%,100%{background:rgba(239,68,68,.08);color:var(--crit)}
  50%   {background:rgba(239,68,68,.16);color:#ff6e6e}
}

/* ── Aircraft HTML label overlay (Phase B + collision avoidance) ── */
#gafr-label-layer{position:absolute;inset:0;pointer-events:none;z-index:20;overflow:hidden}
.plane{position:absolute;transform-origin:0 0;pointer-events:auto;cursor:grab;will-change:transform;width:0;height:0;touch-action:none}
.plane.is-dragging{cursor:grabbing}
.plane.is-dragging .tag{user-select:none}
/* Custom (user-dragged) anchor — labels.js writes left/top inline; we still
 * need to neutralise the data-anchor based align-items so the tag flows
 * uniformly regardless of which side the leader exits. */
.plane[data-anchor="custom"] .tag{align-items:flex-start}
.plane.is-dragged .leader line{stroke-dasharray:3 3}

/* Segmented selector used in the config popup (vector minutes / mode). */
.iv-segctl{display:flex;gap:4px}
.iv-segctl button{
  flex:1;padding:6px 8px;font-size:11px;letter-spacing:.04em;
  background:var(--bg-1);border:1px solid var(--border);color:var(--text-2);
  cursor:pointer;border-radius:3px;font-family:var(--mono);
  transition:background .15s ease, color .15s ease, border-color .15s ease;
}
.iv-segctl button:hover:not(.is-on){background:var(--bg-2);color:var(--text-0)}
.iv-segctl button.is-on{background:var(--cy,#3bc);color:#0a1628;border-color:var(--cy,#3bc);font-weight:600}
#gafr-iv-section.is-disabled .iv-segctl,
#gafr-iv-section.is-disabled .iv-segctl button{opacity:.45;pointer-events:none}

/* Tag: callsign + altitude stacked. Base anchor = NE (default). Variants
   are driven by data-anchor attribute set by labels.js. */
.plane .tag{
  position:absolute;display:inline-flex;flex-direction:column;align-items:flex-start;line-height:1.1;
  font-family:var(--mono);letter-spacing:.04em;white-space:nowrap;
  background:rgba(10,22,40,.86);border:1px solid var(--border);
  padding:2px 6px;min-width:0;
  transition:left .18s ease, top .18s ease;
  /* default NE anchor — overridden per data-anchor below */
  left:14px; top:-30px;
}
.plane .tag .cs{font-size:10.5px;color:var(--text-0);font-weight:600}
.plane .tag .alt{font-size:9.5px;color:var(--cy-dim);font-weight:400;margin-top:1px;font-variant-numeric:tabular-nums}
.plane .tag .spd{font-size:9.5px;color:var(--text-2);font-weight:400;margin-top:1px;font-variant-numeric:tabular-nums}

/* Label part toggles — apply only to NON-selected planes.
 * Selected plane always shows all info (cs + alt + spd + sqk) regardless of toggles. */
body.lbl-cs-off .plane:not(.is-sel) .tag .cs{display:none}
body.lbl-alt-off .plane:not(.is-sel) .tag .alt{display:none}
body.lbl-spd-off .plane:not(.is-sel) .tag .spd{display:none}
/* If all three parts are hidden, hide the tag box entirely (non-selected only) */
body.lbl-cs-off.lbl-alt-off.lbl-spd-off .plane:not(.is-sel) .tag{display:none}

.plane[data-anchor="ne"] .tag{ left:14px;  top:-30px }
.plane[data-anchor="se"] .tag{ left:14px;  top:14px  }
.plane[data-anchor="nw"] .tag{ left:-84px; top:-30px; align-items:flex-end }
.plane[data-anchor="sw"] .tag{ left:-84px; top:14px;  align-items:flex-end }
.plane[data-anchor="e"]  .tag{ left:20px;  top:-8px  }
.plane[data-anchor="w"]  .tag{ left:-90px; top:-8px;  align-items:flex-end }
.plane[data-anchor="n"]  .tag{ left:-35px; top:-36px }
.plane[data-anchor="s"]  .tag{ left:-35px; top:18px  }

.plane.is-sel .tag{
  border-color:var(--cy);
  background:rgba(15,30,56,.96);
  box-shadow:0 0 0 1px var(--cy-soft), 0 0 18px rgba(56,189,248,.35);
  padding:5px 9px;
  min-width:86px;
  z-index:5;
}
.plane.is-sel .tag .cs{color:#fff;font-size:13.5px;font-weight:700;letter-spacing:.05em}
.plane.is-sel .tag .alt{color:var(--cy);font-size:11.5px;font-weight:500;margin-top:3px}
.plane.is-sel .tag .spd{color:#bde6ff;font-size:11px;font-weight:500;margin-top:2px;display:inline-flex}
.plane.is-sel .tag .sqk{font-size:10.5px;color:var(--warn);font-weight:600;letter-spacing:.06em;margin-top:3px;padding:1px 5px;border:1px solid rgba(245,165,36,.35);background:rgba(245,165,36,.08);align-self:flex-start;font-variant-numeric:tabular-nums}
.plane.is-sel .tag .sqk.is-em{color:var(--crit);border-color:rgba(239,68,68,.4);background:rgba(239,68,68,.1)}

/* Focus mode — dim non-selected aircraft when a plane is selected.
 * Transitions apply even when entering/leaving focus mode for smooth fade. */
.plane .tag,
.plane .leader,
.plane .dot-anchor{transition:opacity .35s ease, filter .35s ease}
.plane .leader line{transition:stroke-opacity .35s ease, stroke .35s ease}

body.has-sel .plane:not(.is-sel) .tag{opacity:.08;filter:saturate(.15) brightness(.55)}
body.has-sel .plane:not(.is-sel) .leader{opacity:.08}
body.has-sel .plane:not(.is-sel) .dot-anchor{opacity:.12;filter:saturate(.15) brightness(.55)}
body.has-sel .plane:not(.is-sel):hover .tag,
body.has-sel .plane:not(.is-sel):hover .leader{opacity:.75;filter:none}
body.has-sel .plane:not(.is-sel):hover .dot-anchor{opacity:.9;filter:none}

/* Stacked (couldn't find clear slot) — hide label entirely to cut visual clutter.
   User still sees the plane icon + anchor dot; hovering the dot reveals the label.
   Controlled by "Hide crowded" toggle — body.lbl-crowd-off brings stacked labels
   back (dimmed) for users who prefer the old behaviour. */
.plane.is-stacked .tag{display:none}
.plane.is-stacked .leader{display:none}
.plane.is-stacked:hover .tag{display:inline-flex}
.plane.is-stacked:hover .leader{display:block}
body.lbl-crowd-off .plane.is-stacked .tag{display:inline-flex;opacity:.75}
body.lbl-crowd-off .plane.is-stacked .leader{display:block;opacity:.55}

/* Filtered (gliders/UL or low altitude turned OFF via toggles) — hard hide,
   but hover still reveals the label so the user can identify it on demand.
   Selected plane is never filtered (handled in JS). */
.plane.is-filtered .tag{display:none}
.plane.is-filtered .leader{display:none}
.plane.is-filtered:hover .tag{display:inline-flex}
.plane.is-filtered:hover .leader{display:block}

/* Make stacked dot a proper hover target (bigger + clickable). */
.plane.is-stacked .dot-anchor,.plane.is-filtered .dot-anchor{pointer-events:auto;width:4px;height:4px;left:-2px;top:-2px;cursor:pointer}

/* Invisible hitbox around the plane's center so hovering over the (canvas-
   rendered) aircraft icon triggers the label highlight — without needing a
   tar1090 JS hook. Small enough not to overlap neighbours in clusters. */
.plane::before{
  content:'';position:absolute;left:-11px;top:-11px;width:22px;height:22px;
  pointer-events:auto;cursor:pointer;border-radius:50%;z-index:1;
}

/* Hover = same visual treatment as selected (minus the actual selection). */
.plane:hover:not(.is-sel) .tag{
  border-color:var(--cy);
  background:rgba(21,38,66,.94);
  box-shadow:0 0 0 1px var(--cy-soft), 0 0 14px rgba(56,189,248,.25);
  opacity:1;
}
.plane:hover:not(.is-sel) .tag .cs{color:#fff}
.plane:hover:not(.is-sel) .tag .alt{color:var(--cy)}
.plane:hover:not(.is-sel) .leader line{stroke:var(--cy);stroke-width:1.4}
.plane:hover:not(.is-sel) .leader{opacity:1}
.plane:hover:not(.is-sel) .dot-anchor{
  width:5px;height:5px;left:-2.5px;top:-2.5px;background:#fff;
  box-shadow:0 0 0 1px var(--cy), 0 0 8px var(--cy-glow);
}

/* Leader line + anchor dot — make it unambiguous which label belongs to which plane */
.plane .leader{position:absolute;left:0;top:0;pointer-events:none;overflow:visible;width:1px;height:1px;z-index:0}
.plane .leader line{
  stroke:rgba(56,189,248,.55);
  stroke-width:1;
  stroke-linecap:round;
  transition:x2 .18s ease, y2 .18s ease;
}
.plane.is-sel .leader line{stroke:var(--cy);stroke-width:1.4}
.plane.is-stacked .leader line{stroke:rgba(56,189,248,.32)}

/* Centre dot on the icon — Vec3b (v1.2): shrunk from 4/7/7/6px to 2/5/5/4px
 * (default/selected/hover/stacked) so the dot is less visually intrusive on
 * dense traffic. Glow radii reduced proportionally. Atomic single-block edit
 * so a `git revert <SHA>` cleanly restores the prior look. */
.plane .dot-anchor{
  position:absolute;left:-1px;top:-1px;width:2px;height:2px;
  background:var(--cy);border-radius:50%;
  box-shadow:0 0 2px var(--cy-glow);
  pointer-events:none;z-index:1;
}
.plane.is-sel .dot-anchor{
  width:5px;height:5px;left:-2.5px;top:-2.5px;background:#fff;
  box-shadow:0 0 0 1px var(--cy), 0 0 8px var(--cy-glow);
}
/* Selected plane always keeps its label, even if stacked. */
.plane.is-stacked.is-sel .tag{display:inline-flex;opacity:1}
.plane.is-stacked.is-sel .leader{display:block}

/* ── TAR1090 STYLE OVERRIDES for elements we keep ── */
/* Layer switcher — dočasne zviditeľnené pre testovanie mapových podkladov.
   Pozícia: pod topbarom vpravo. Farby zladené s dark theme. */
.ol-layerswitcher{position:absolute !important;top:64px !important;right:12px !important;z-index:1100 !important}
.ol-layerswitcher button{background:var(--bg-2) !important;border:1px solid var(--border) !important;color:var(--text-0) !important}
.ol-layerswitcher .panel{background:var(--bg-1) !important;border:1px solid var(--border) !important;color:var(--text-1) !important;font-family:var(--cond) !important;font-size:12px !important;max-height:70vh !important;overflow-y:auto !important}
.ol-layerswitcher .panel ul{background:transparent !important}
.ol-layerswitcher .panel li.group>label{color:var(--text-0) !important;font-weight:600 !important;letter-spacing:.08em !important;text-transform:uppercase !important;font-size:10.5px !important}
.ol-layerswitcher .panel li label{color:var(--text-1) !important}
.ol-layerswitcher .panel li input[type="radio"],.ol-layerswitcher .panel li input[type="checkbox"]{accent-color:var(--cy,#3bc)}
/* Map attribution — solid background + explicit position so the z-index
   actually kicks in and the element sits above the grain overlay. */
.ol-attribution{
  position:absolute !important;
  bottom:2px !important;right:2px !important;
  z-index:50 !important;
  background:#0a1628 !important;
  color:var(--text-2) !important;
  font-family:var(--mono) !important;
  font-size:8px !important;
  line-height:1.3 !important;
  letter-spacing:.01em !important;
  border:1px solid var(--border) !important;
  padding:2px 5px !important;
}
.ol-attribution ul{color:var(--text-2) !important;font-size:8px !important;line-height:1.3 !important}
.ol-attribution a{color:var(--text-1) !important;font-size:8px !important}
.ol-attribution button{background:var(--bg-3) !important;color:var(--text-1) !important;font-size:9px !important;padding:0 4px !important;border:1px solid var(--border) !important}
.ol-zoom{display:none !important}

/* Responsive: below 1280px collapse right panel */
@media (max-width: 1279px){
  .app{grid-template-columns:300px 1fr 0}
  .right{display:none}
}
@media (max-width: 900px){
  .app{grid-template-columns:260px 1fr 0}
}

/* ─── Measure tool ─────────────────────────────────────────────────── */
#gafr-mctx{
  position:fixed;z-index:99999;display:none;min-width:240px;
  background:rgba(8,18,32,.96);
  border:1px solid rgba(250,204,21,.32);
  border-radius:7px;padding:5px;
  box-shadow:0 12px 40px rgba(0,0,0,.65), 0 0 0 1px rgba(0,0,0,.35);
  backdrop-filter:blur(10px) saturate(1.1);
  font-family:'IBM Plex Sans',sans-serif;
}
#gafr-mctx.show{display:block;animation:fvMctxIn .12s ease-out}
@keyframes fvMctxIn{from{opacity:0;transform:translateY(-3px)}to{opacity:1;transform:none}}
#gafr-mctx button{
  display:flex;align-items:center;gap:9px;width:100%;
  background:none;border:0;color:#cde7ff;
  padding:9px 11px;border-radius:5px;
  font:500 12px/1 'IBM Plex Sans',sans-serif;letter-spacing:.01em;
  cursor:pointer;text-align:left;
}
#gafr-mctx button svg{flex:0 0 14px;color:rgba(250,204,21,.8);transition:color .15s}
#gafr-mctx button:hover{background:rgba(250,204,21,.1);color:#fff}
#gafr-mctx button:hover svg{color:#fde047}
#gafr-mctx button + button{margin-top:1px}

/* ─── SEPTOOL right-click menu (white accent vs measure's yellow). ─── */
#gafr-septool-ctx{
  position:fixed;z-index:99999;display:none;min-width:280px;max-width:420px;
  background:rgba(8,18,32,.96);
  border:1px solid rgba(255,255,255,.32);
  border-radius:7px;padding:5px;
  box-shadow:0 12px 40px rgba(0,0,0,.65), 0 0 0 1px rgba(0,0,0,.35);
  backdrop-filter:blur(10px) saturate(1.1);
  font-family:'IBM Plex Sans',sans-serif;
}
#gafr-septool-ctx.show{display:block;animation:fvMctxIn .12s ease-out}
#gafr-septool-ctx button{
  display:block;width:100%;
  background:none;border:0;color:#cde7ff;
  padding:9px 11px;border-radius:5px;
  font:500 12px/1.3 'IBM Plex Sans',sans-serif;letter-spacing:.01em;
  cursor:pointer;text-align:left;
}
#gafr-septool-ctx button:hover{background:rgba(255,255,255,.1);color:#fff}
#gafr-septool-ctx button + button{margin-top:1px}
#gafr-septool-ctx .ctx-sep{
  height:1px;margin:6px 8px;
  background:linear-gradient(90deg,transparent,rgba(255,255,255,.22),transparent);
}
#gafr-septool-ctx .ctx-sep + button[data-act^="measure-"]{color:#fde047}
#gafr-septool-ctx button[data-act^="measure-"]:hover{
  background:rgba(250,204,21,.12);color:#fff
}

#gafr-measure-tip{
  position:fixed;z-index:9998;display:none;pointer-events:none;
  background:rgba(8,18,32,.94);
  border:1px solid rgba(250,204,21,.5);
  border-radius:5px;padding:5px 9px;
  font:500 11px/1.35 'IBM Plex Mono',ui-monospace,monospace;
  color:#fde047;
  box-shadow:0 4px 14px rgba(0,0,0,.5);
  font-variant-numeric:tabular-nums;
  white-space:nowrap;
}
#gafr-measure-tip.show{display:block}
#gafr-measure-tip .d{color:#fde047;font-weight:600}
#gafr-measure-tip .b{color:#cde7ff;margin-top:2px;font-weight:500}

body.gafr-measuring,
body.gafr-measuring .map,
body.gafr-measuring #map_canvas,
body.gafr-measuring .ol-viewport,
body.gafr-measuring canvas{cursor:crosshair !important}

body.gafr-septool,
body.gafr-septool .map,
body.gafr-septool #map_canvas,
body.gafr-septool .ol-viewport,
body.gafr-septool canvas{cursor:crosshair !important}

#gafr-measure-tip .snap{
  margin-top:2px;color:#39de39;font-weight:600;
  border-top:1px dashed rgba(57,222,57,.4);padding-top:2px;
}

/* ─── Time Replay (FR24-style traffic playback) ────────────────────── */
.gafr-replay-toggle.is-active,
body.gafr-replay-mode .gafr-replay-toggle{
  background:rgba(245,158,11,.16);
  border-color:rgba(245,158,11,.55);
  color:#fde047;
}

/* In replay mode, dim only the top-search (it talks to /playback for live
 * trace fetches; not relevant for archive playback). The ACFT LIST card is
 * deliberately KEPT interactive — it gets re-bound to replay state in
 * gafr-chrome.js#renderInViewList so it shows replay aircraft and clicks
 * select via window.gafr.replay.select(). */
body.gafr-replay-mode .top-search{opacity:.45;pointer-events:none}
body.gafr-replay-mode .map-modes{opacity:.6}

/* gafr-labels overlay paints DOM <div class="plane"> badges on top of the
 * map for live traffic. In replay mode we hide the whole label layer so the
 * basemap reads clean before a window is loaded, and the only labels visible
 * during playback come from the replay layer itself. */
body.gafr-replay-mode #gafr-label-layer{display:none}

/* Right-rail card visibility per mode:
 *   LIVE   → display-card + priestory-card + inview-card + airspaces-trigger
 *   REPLAY → playback-settings-card + priestory-card + inview-card
 * AUP-related context (display-card has WX + AUP toggle, airspaces-trigger
 * shows current rezervácie) is irrelevant for archive playback — user wants
 * playback purely tied to the replay window, no live AUP overlap. */
.playback-settings-card{display:none}
body.gafr-replay-mode .playback-settings-card{display:flex}
body.gafr-replay-mode .display-card{display:none}
body.gafr-replay-mode .airspaces-trigger{display:none}

/* Priestory card — same visual rhythm as Zobrazenie but its own card head
 * (replaced the previous inline "PRIESTORY" header dashed strip). The
 * .ovl-priestory inside no longer needs its own margin/border since the
 * card-head separates it visually. */
.priestory-card .ovl-priestory{margin-top:0}
.priestory-card .ovl-priestory .priestory-head{display:none}

/* Playback Nastavenia card — uses the same .label-toggles layout as the
 * settings popup, so this just re-uses styles defined earlier in the file
 * (.lt-row, .lt-row .sw, .lt-row .nm). */
.playback-settings-card{flex-direction:column}
.playback-settings-card .label-toggles{padding:6px 16px 14px}

/* ─── Time Replay controller — clean 4-row layout ─────────────────── */
/* Layout summary:
 *   Row 1: header   (tag + window summary + edit/close icons)
 *   Row 2: picker   (date/time/duration/load — fold-able)
 *   Row 3: status   (single-line status text, hidden when empty)
 *   Row 4: scrub    (play + slider + time readout)
 *   Row 5: controls (speed selector + action buttons)
 *
 * Each row is its own flex line so nothing overlaps regardless of width.
 * Width is content-driven inside a min/max range so the controller never
 * forces a horizontal scrollbar on small screens.
 */
#gafr-replay-controller{
  position:fixed;left:50%;bottom:24px;transform:translateX(-50%);
  z-index:8500;
  width:min(720px, calc(100vw - 32px));
  background:linear-gradient(180deg, rgba(10,22,40,.97), rgba(7,17,30,.98));
  border:1px solid rgba(245,158,11,.42);
  border-radius:12px;
  box-shadow:0 18px 50px rgba(0,0,0,.62), 0 0 0 1px rgba(0,0,0,.45);
  backdrop-filter:blur(14px) saturate(1.15);
  color:#dceaf6;
  font-family:'IBM Plex Sans',ui-sans-serif,system-ui,sans-serif;
  padding:10px 14px 12px;
  display:flex;flex-direction:column;gap:9px;
  pointer-events:auto;
}
#gafr-replay-controller[hidden]{display:none}

/* ── Row 1: header ───────────────────────────────────────────────── */
#gafr-replay-controller .grc-header{
  display:flex;align-items:center;gap:10px;
  padding-bottom:8px;
  border-bottom:1px solid rgba(85,123,165,.22);
}
#gafr-replay-controller .grc-title{
  flex:1 1 auto;min-width:0;
  display:flex;align-items:center;gap:9px;
  overflow:hidden;
}
#gafr-replay-controller .grc-clockico{
  flex:0 0 auto;color:#fde047;
}
#gafr-replay-controller .grc-title-tag{
  flex:0 0 auto;
  font:700 10.5px/1 'IBM Plex Sans Condensed','IBM Plex Sans',sans-serif;
  letter-spacing:.18em;text-transform:uppercase;
  color:#fde047;
  padding:4px 9px;border-radius:4px;
  background:rgba(245,158,11,.14);
  border:1px solid rgba(245,158,11,.4);
}
#gafr-replay-controller .grc-summary{
  flex:1 1 auto;min-width:0;
  font:600 12.5px/1.2 'IBM Plex Sans',sans-serif;
  color:rgba(220,234,246,.85);
  letter-spacing:.02em;
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis;
}
#gafr-replay-controller .grc-header-actions{
  display:inline-flex;gap:4px;flex:0 0 auto;
}
#gafr-replay-controller .grc-icon-btn{
  background:rgba(7,16,28,.65);
  border:1px solid rgba(85,123,165,.35);
  color:rgba(220,234,246,.75);
  width:30px;height:30px;
  border-radius:6px;
  display:inline-flex;align-items:center;justify-content:center;
  cursor:pointer;
  transition:background .15s, color .15s, border-color .15s;
}
#gafr-replay-controller .grc-icon-btn:hover{
  background:rgba(245,158,11,.2);
  color:#fde047;
  border-color:rgba(245,158,11,.55);
}
#gafr-replay-controller .grc-close-btn:hover{
  background:rgba(239,68,68,.22);
  color:#fca5a5;
  border-color:rgba(239,68,68,.5);
}

/* ── Row 2: picker ───────────────────────────────────────────────── */
#gafr-replay-controller .grc-picker{
  display:flex;align-items:flex-end;gap:10px;flex-wrap:wrap;
}
#gafr-replay-controller .grc-picker[hidden]{display:none}
#gafr-replay-controller .grc-fld{
  display:flex;flex-direction:column;gap:3px;
  flex:0 0 auto;
}
#gafr-replay-controller .grc-fld>span{
  font:600 9.5px/1 'IBM Plex Sans Condensed','IBM Plex Sans',sans-serif;
  letter-spacing:.12em;text-transform:uppercase;
  color:rgba(220,234,246,.55);
}
#gafr-replay-controller .grc-fld input,
#gafr-replay-controller .grc-fld select{
  background:rgba(7,16,28,.8);
  color:#e7f1fb;
  border:1px solid rgba(85,123,165,.4);
  border-radius:6px;
  padding:7px 10px;
  font:600 13px/1 'IBM Plex Mono',ui-monospace,monospace;
  font-variant-numeric:tabular-nums;
  min-width:0;
  height:34px;
  box-sizing:border-box;
}
#gafr-replay-controller .grc-fld input:focus,
#gafr-replay-controller .grc-fld select:focus{
  outline:none;border-color:rgba(245,158,11,.7);
  box-shadow:0 0 0 2px rgba(245,158,11,.18);
}
#gafr-replay-controller .grc-btn{
  background:rgba(7,16,28,.85);
  color:#e7f1fb;
  border:1px solid rgba(85,123,165,.45);
  border-radius:6px;
  padding:0 16px;
  height:34px;
  font:700 12.5px/1 'IBM Plex Sans',sans-serif;
  letter-spacing:.04em;
  cursor:pointer;
  transition:background .15s, border-color .15s, color .15s;
  flex:0 0 auto;
}
#gafr-replay-controller .grc-btn:hover{
  background:rgba(245,158,11,.18);
  color:#fde047;
  border-color:rgba(245,158,11,.55);
}
#gafr-replay-controller .grc-btn[disabled]{opacity:.5;cursor:not-allowed}
#gafr-replay-controller .grc-btn.grc-load{
  background:linear-gradient(180deg, rgba(245,158,11,.36), rgba(217,119,6,.32));
  border-color:rgba(245,158,11,.7);
  color:#fde047;
  margin-left:auto;
}

/* ── Row 3: status ───────────────────────────────────────────────── */
#gafr-replay-controller .grc-status{
  font:500 12px/1.4 'IBM Plex Sans',sans-serif;
  color:rgba(220,234,246,.78);
  padding:7px 10px;
  background:rgba(7,16,28,.55);
  border-radius:6px;
  border:1px dashed rgba(85,123,165,.32);
}
#gafr-replay-controller .grc-status.is-empty{display:none}

/* ── Row 4: scrub ────────────────────────────────────────────────── */
#gafr-replay-controller .grc-scrub{
  display:flex;align-items:center;gap:13px;
  padding-top:5px;
}
#gafr-replay-controller .grc-scrub[hidden]{display:none}
#gafr-replay-controller .grc-play{
  background:rgba(245,158,11,.2);
  border:1px solid rgba(245,158,11,.55);
  color:#fde047;
  width:42px;height:42px;border-radius:50%;
  display:inline-flex;align-items:center;justify-content:center;
  cursor:pointer;
  flex:0 0 auto;
  transition:background .15s, transform .1s;
}
#gafr-replay-controller .grc-play:hover{background:rgba(245,158,11,.3)}
#gafr-replay-controller .grc-play:active{transform:scale(.94)}
#gafr-replay-controller .grc-play.is-playing{
  background:rgba(34,197,94,.22);
  border-color:rgba(34,197,94,.55);
  color:#86efac;
}
#gafr-replay-controller .grc-track-wrap{
  flex:1 1 auto;min-width:140px;
  display:flex;flex-direction:column;gap:3px;
}
#gafr-replay-controller #grc-scrub{
  width:100%;height:8px;margin:0;
  -webkit-appearance:none;appearance:none;
  background:linear-gradient(90deg,
              rgba(245,158,11,.6) var(--p,0%),
              rgba(85,123,165,.3) var(--p,0%));
  border-radius:4px;
  outline:none;cursor:pointer;
}
#gafr-replay-controller #grc-scrub::-webkit-slider-thumb{
  -webkit-appearance:none;appearance:none;
  width:18px;height:18px;border-radius:50%;
  background:#fde047;
  border:2px solid #d97706;
  cursor:grab;
  box-shadow:0 2px 6px rgba(0,0,0,.5);
}
#gafr-replay-controller #grc-scrub:active::-webkit-slider-thumb{cursor:grabbing}
#gafr-replay-controller #grc-scrub::-moz-range-thumb{
  width:18px;height:18px;border-radius:50%;
  background:#fde047;border:2px solid #d97706;cursor:grab;
}
#gafr-replay-controller .grc-track-axis{
  display:flex;justify-content:space-between;
  font:600 9.5px/1 'IBM Plex Mono',ui-monospace,monospace;
  letter-spacing:.04em;
  color:rgba(220,234,246,.45);
  font-variant-numeric:tabular-nums;
}
#gafr-replay-controller .grc-readout{
  flex:0 0 auto;
  display:flex;flex-direction:column;align-items:flex-end;
  min-width:90px;
  padding:5px 9px;border-radius:6px;
  background:rgba(7,16,28,.7);
  border:1px solid rgba(85,123,165,.32);
}
#gafr-replay-controller .grc-readout strong{
  font:700 16px/1 'IBM Plex Mono',ui-monospace,monospace;
  letter-spacing:.04em;color:#fde047;
  font-variant-numeric:tabular-nums;
}
#gafr-replay-controller .grc-readout span{
  font:600 10px/1.2 'IBM Plex Mono',ui-monospace,monospace;
  letter-spacing:.05em;color:rgba(220,234,246,.55);
  font-variant-numeric:tabular-nums;
  margin-top:2px;
}

/* ── Row 5: controls (speed + actions) ───────────────────────────── */
#gafr-replay-controller .grc-controls{
  display:flex;align-items:center;gap:12px;
  padding-top:7px;border-top:1px solid rgba(85,123,165,.18);
  flex-wrap:wrap;
}
#gafr-replay-controller .grc-controls[hidden]{display:none}
#gafr-replay-controller .grc-spd-group{
  display:inline-flex;align-items:center;gap:7px;
}
#gafr-replay-controller .grc-ctl-label{
  font:600 9.5px/1 'IBM Plex Sans Condensed','IBM Plex Sans',sans-serif;
  letter-spacing:.14em;text-transform:uppercase;
  color:rgba(220,234,246,.5);
}
#gafr-replay-controller .grc-spd{
  display:inline-flex;
  border-radius:6px;overflow:hidden;
  border:1px solid rgba(85,123,165,.32);
}
#gafr-replay-controller .grc-spd-btn{
  background:rgba(7,16,28,.75);
  border:0;
  border-right:1px solid rgba(85,123,165,.32);
  color:rgba(220,234,246,.65);
  padding:6px 11px;
  font:700 11.5px/1 'IBM Plex Mono',ui-monospace,monospace;
  font-variant-numeric:tabular-nums;
  cursor:pointer;
  transition:background .12s, color .12s;
}
#gafr-replay-controller .grc-spd-btn:last-child{border-right:0}
#gafr-replay-controller .grc-spd-btn:hover{
  color:#fde047;background:rgba(245,158,11,.12);
}
#gafr-replay-controller .grc-spd-btn.is-active{
  background:rgba(245,158,11,.28);
  color:#fde047;
}
#gafr-replay-controller .grc-actions{
  display:inline-flex;gap:6px;margin-left:auto;flex-wrap:wrap;
}
#gafr-replay-controller .grc-act-btn{
  display:inline-flex;align-items:center;gap:7px;
  background:rgba(7,16,28,.75);
  border:1px solid rgba(85,123,165,.4);
  color:rgba(220,234,246,.78);
  border-radius:6px;
  padding:6px 12px;
  font:700 11.5px/1 'IBM Plex Sans',sans-serif;
  letter-spacing:.03em;
  cursor:pointer;
  transition:background .15s, color .15s, border-color .15s;
}
#gafr-replay-controller .grc-act-btn:hover:not([disabled]){
  background:rgba(245,158,11,.18);
  border-color:rgba(245,158,11,.55);
  color:#fde047;
}
#gafr-replay-controller .grc-act-btn[disabled]{
  opacity:.35;cursor:not-allowed;
}
#gafr-replay-controller .grc-act-btn.is-active{
  background:rgba(245,158,11,.3);
  border-color:rgba(245,158,11,.7);
  color:#fde047;
}
#gafr-replay-controller .grc-act-btn .grc-eyestrike{display:none}
#gafr-replay-controller .grc-act-btn.is-active .grc-eyestrike{display:inline}

/* While the controller is in the empty (pre-load) state we hide the
 * scrub + controls rows entirely — picker only. */
#gafr-replay-controller.is-empty .grc-scrub,
#gafr-replay-controller.is-empty .grc-controls{display:none}

/* Mobile / narrow widths — stack actions row, lighter padding. */
@media (max-width: 720px){
  #gafr-replay-controller{
    width:calc(100vw - 16px);bottom:14px;padding:8px 10px 10px;gap:7px;
  }
  #gafr-replay-controller .grc-readout strong{font-size:14px}
  #gafr-replay-controller .grc-act-btn span{display:none}
  #gafr-replay-controller .grc-act-btn{padding:6px 9px}
  #gafr-replay-controller .grc-title-tag{display:none}
}

/* ─── Detail sidebar for selected replay aircraft ───────────────────────
 * Mirrors the radar mode pattern: full-height card pinned to the LEFT edge
 * of the viewport (radar uses tar1090's #selected_infoblock at left:0).
 * Width 320 px keeps room for the vertical profile + meta grid; max-height
 * leaves the bottom controller (`#gafr-replay-controller`) untouched. */
#gafr-replay-detail{
  position:fixed;
  left:0;
  top:64px;                                       /* clear the topbar */
  bottom:160px;                                   /* clear the bottom controller */
  z-index:8400;
  width:320px;
  max-width:calc(100vw - 36px);
  background:linear-gradient(180deg, rgba(10,22,40,.97), rgba(7,17,30,.98));
  border:1px solid rgba(245,158,11,.42);
  border-left:0;
  border-radius:0 10px 10px 0;
  box-shadow:0 14px 44px rgba(0,0,0,.6), 0 0 0 1px rgba(0,0,0,.4);
  backdrop-filter:blur(12px) saturate(1.1);
  color:#dceaf6;
  font-family:'IBM Plex Sans',ui-sans-serif,system-ui,sans-serif;
  padding:12px 13px 13px;
  display:flex;flex-direction:column;gap:10px;
  pointer-events:auto;
  overflow-y:auto;
}
#gafr-replay-detail[hidden]{display:none}

/* Action bar inside the detail sidebar — replaces the duplicate buttons that
 * used to live in the bottom controller. Toggle "skryť ostatné" + "posledná
 * pozícia" only make sense while an aircraft is selected, so they belong
 * with the detail; closing the sidebar via × auto-resets hide-others. */
#gafr-replay-detail .grd-actions{
  display:flex;flex-direction:column;gap:6px;
}
#gafr-replay-detail .grd-act-btn{
  display:flex;align-items:center;gap:8px;
  padding:8px 10px;
  background:rgba(7,16,28,.55);
  border:1px solid rgba(85,123,165,.32);
  border-radius:6px;
  color:#dceaf6;
  font:600 11.5px/1 'IBM Plex Sans Condensed',sans-serif;
  letter-spacing:.06em;text-transform:uppercase;
  cursor:pointer;
  transition:background .14s ease, border-color .14s ease, color .14s ease;
}
#gafr-replay-detail .grd-act-btn:hover{
  background:rgba(245,158,11,.14);
  border-color:rgba(245,158,11,.45);
  color:#fde047;
}
#gafr-replay-detail .grd-act-btn.is-active{
  background:rgba(245,158,11,.22);
  border-color:rgba(245,158,11,.55);
  color:#fde047;
}
#gafr-replay-detail .grd-act-btn svg{flex:0 0 auto}
#gafr-replay-detail .grd-act-btn .grd-eyestrike{display:none}
#gafr-replay-detail .grd-act-btn.is-active .grd-eyestrike{display:inline}
#gafr-replay-detail .grd-head{
  display:flex;align-items:center;gap:11px;
}
#gafr-replay-detail .grd-icon{
  width:38px;height:38px;flex:0 0 38px;
  background:rgba(7,16,28,.55);border:1px solid rgba(85,123,165,.32);
  border-radius:7px;display:flex;align-items:center;justify-content:center;
}
#gafr-replay-detail .grd-icon svg{display:block}
#gafr-replay-detail .grd-title{
  flex:1 1 auto;min-width:0;
  display:flex;flex-direction:column;gap:1px;
  overflow:hidden;
}
#gafr-replay-detail .grd-cs{
  font:700 17px/1.1 'IBM Plex Mono',ui-monospace,monospace;
  color:#fde047;letter-spacing:.04em;
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis;
}
#gafr-replay-detail .grd-reg{
  font:500 11.5px/1.2 'IBM Plex Sans',sans-serif;
  color:rgba(220,234,246,.65);letter-spacing:.06em;
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis;
}
#gafr-replay-detail .grd-close{
  background:transparent;border:0;color:rgba(220,234,246,.6);
  width:26px;height:26px;cursor:pointer;font:400 18px/1 sans-serif;
  border-radius:5px;flex:0 0 auto;
}
#gafr-replay-detail .grd-close:hover{
  background:rgba(245,158,11,.18);color:#fde047;
}
#gafr-replay-detail .grd-meta{
  display:grid;grid-template-columns:1fr 1fr;gap:6px 10px;
  background:rgba(7,16,28,.55);
  border:1px solid rgba(85,123,165,.22);
  border-radius:6px;
  padding:7px 9px;
}
#gafr-replay-detail .grd-meta-cell{
  display:flex;flex-direction:column;gap:1px;min-width:0;
}
#gafr-replay-detail .grd-meta-cell span{
  font:500 9.5px/1.1 'IBM Plex Sans Condensed',sans-serif;
  letter-spacing:.12em;text-transform:uppercase;
  color:rgba(220,234,246,.5);
}
#gafr-replay-detail .grd-meta-cell b{
  font:600 12px/1.2 'IBM Plex Mono',ui-monospace,monospace;
  color:#e7f1fb;
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis;
}
#gafr-replay-detail .grd-live{
  display:grid;grid-template-columns:repeat(4, 1fr);gap:4px;
}
#gafr-replay-detail .grd-live-cell{
  background:rgba(7,16,28,.6);
  border:1px solid rgba(85,123,165,.22);
  border-radius:6px;
  padding:6px 8px;
  display:flex;flex-direction:column;align-items:flex-start;gap:1px;
  min-width:0;
}
#gafr-replay-detail .grd-live-cell span{
  font:500 9.5px/1.1 'IBM Plex Sans Condensed',sans-serif;
  letter-spacing:.1em;text-transform:uppercase;
  color:rgba(220,234,246,.55);
}
#gafr-replay-detail .grd-live-cell b{
  font:700 14px/1 'IBM Plex Mono',ui-monospace,monospace;
  color:#fde047;
}
#gafr-replay-detail .grd-live-cell i{
  font:600 10px/1 'IBM Plex Sans',sans-serif;font-style:normal;
  color:rgba(220,234,246,.6);
}
#gafr-replay-detail #grd-trend[data-dir="up"]{color:#86efac}
#gafr-replay-detail #grd-trend[data-dir="down"]{color:#fca5a5}
#gafr-replay-detail #grd-trend[data-dir="level"]{color:rgba(220,234,246,.6)}

#gafr-replay-detail .grd-section{display:flex;flex-direction:column;gap:5px}
#gafr-replay-detail .grd-section-head{
  display:flex;justify-content:space-between;align-items:baseline;
  font:600 10.5px/1.1 'IBM Plex Sans Condensed',sans-serif;
  letter-spacing:.12em;text-transform:uppercase;
  color:rgba(220,234,246,.55);
}
#gafr-replay-detail .grd-section-head em{
  font-style:normal;
  font:500 10.5px/1.1 'IBM Plex Mono',ui-monospace,monospace;
  letter-spacing:.04em;text-transform:none;
  color:rgba(253,224,71,.85);
}
#gafr-replay-detail .grd-profile{
  background:linear-gradient(180deg, rgba(7,16,28,.65), rgba(7,16,28,.78));
  border:1px solid rgba(85,123,165,.28);
  border-radius:7px;
  padding:0;
  height:120px;
  overflow:hidden;
}
#gafr-replay-detail .grd-profile svg{
  width:100%;height:100%;display:block;cursor:crosshair;
}
#gafr-replay-detail .grd-prof-past{
  fill:none;
  stroke:#5fb6e0;
  stroke-width:1.7;
  stroke-linecap:round;
  stroke-linejoin:round;
  filter:drop-shadow(0 0 4px rgba(95,182,224,0.4));
}
#gafr-replay-detail .grd-prof-future{
  fill:none;
  stroke:rgba(220,234,246,0.45);
  stroke-width:1.3;
  stroke-dasharray:3 4;
  stroke-linecap:round;
  stroke-linejoin:round;
}
#gafr-replay-detail .grd-prof-cursor{
  stroke:#fde047;stroke-width:1.4;stroke-dasharray:2 2;
  pointer-events:none;
}
#gafr-replay-detail .grd-prof-dot{
  fill:#fde047;stroke:#0c0a04;stroke-width:0.8;
  filter:drop-shadow(0 0 4px rgba(253,224,71,0.5));
}
#gafr-replay-detail .grd-prof-labels text{
  font:600 9.5px/1 'IBM Plex Mono',ui-monospace,monospace;
  fill:rgba(220,234,246,.65);
}

/* ─── SAR-style "posledná pozícia" popup ───────────────────────── */
.grl-overlay{
  position:fixed;inset:0;z-index:9200;
  background:rgba(4,9,18,.55);
  backdrop-filter:blur(2px);
  display:flex;align-items:center;justify-content:center;
  padding:24px;
  font-family:'IBM Plex Sans',ui-sans-serif,system-ui,sans-serif;
}
.grl-card{
  width:520px;max-width:100%;
  background:linear-gradient(180deg, rgba(10,22,40,.97), rgba(7,17,30,.99));
  border:1px solid rgba(245,158,11,.55);
  border-radius:10px;
  box-shadow:0 16px 50px rgba(0,0,0,.7), 0 0 0 1px rgba(245,158,11,.25);
  color:#dceaf6;
  display:flex;flex-direction:column;
  overflow:hidden;
}
.grl-head{
  display:flex;align-items:center;justify-content:space-between;
  padding:9px 14px;
  background:rgba(245,158,11,.18);
  border-bottom:1px solid rgba(245,158,11,.45);
}
.grl-tag{
  font:700 11px/1 'IBM Plex Sans Condensed',sans-serif;
  letter-spacing:.16em;
  color:#fde047;
}
.grl-close{
  background:transparent;border:0;color:#fde047;font:400 18px/1 sans-serif;
  width:26px;height:26px;border-radius:5px;cursor:pointer;
}
.grl-close:hover{background:rgba(0,0,0,.3)}
.grl-title{
  display:flex;flex-direction:column;gap:2px;
  padding:11px 16px 0;
}
.grl-title strong{
  font:700 19px/1 'IBM Plex Mono',ui-monospace,monospace;
  color:#fde047;letter-spacing:.05em;
}
.grl-title span{
  font:500 11.5px/1.4 'IBM Plex Sans',sans-serif;
  color:rgba(220,234,246,.65);
}
.grl-body{
  padding:8px 16px 14px;
  display:flex;flex-direction:column;gap:5px;
}
.grl-row{
  display:grid;grid-template-columns:130px 1fr;column-gap:10px;
  align-items:baseline;
  padding:5px 0;
  border-bottom:1px dashed rgba(85,123,165,.25);
}
.grl-row:last-child{border-bottom:0}
.grl-row span{
  font:500 10.5px/1.2 'IBM Plex Sans Condensed',sans-serif;
  letter-spacing:.1em;text-transform:uppercase;
  color:rgba(220,234,246,.55);
}
.grl-row b{
  font:700 13.5px/1.3 'IBM Plex Mono',ui-monospace,monospace;
  color:#e7f1fb;
}
.grl-row i{
  display:block;grid-column:2;
  font:500 11px/1.3 'IBM Plex Sans',sans-serif;font-style:normal;
  color:rgba(220,234,246,.6);
  margin-top:1px;
}
.grl-trend-up{color:#86efac !important}
.grl-trend-down{color:#fca5a5 !important}
.grl-trend-level{color:rgba(220,234,246,.6) !important}
.grl-foot{
  display:flex;align-items:center;justify-content:space-between;gap:14px;
  padding:9px 14px;
  background:rgba(7,16,28,.55);
  border-top:1px solid rgba(85,123,165,.25);
}
.grl-copy{
  background:linear-gradient(180deg, rgba(245,158,11,.32), rgba(217,119,6,.28));
  border:1px solid rgba(245,158,11,.65);
  color:#fde047;
  border-radius:5px;
  padding:7px 13px;
  font:600 12px/1 'IBM Plex Sans',sans-serif;
  cursor:pointer;
}
.grl-copy:hover{background:rgba(245,158,11,.42)}
.grl-hint{
  font:500 10.5px/1.3 'IBM Plex Sans',sans-serif;
  color:rgba(220,234,246,.55);
  flex:1;text-align:right;
}

/* ═══ Emergency squawk overlay (7700/7600/7500) ════════════════════════
   - Pulsing ring centred on the plane icon (origin of .plane transform)
   - Top banner with the offending callsign + dismiss × button
   Colour palette per ICAO doc 4444 squawk semantics:
     7700 EMERGENCY     red    #ef4444
     7600 RADIO FAILURE amber  #f59e0b
     7500 HIJACK        violet #a855f7
   The pulse ring uses the .plane element's translate3d origin so it
   tracks marker movement automatically — no separate per-frame layout.
*/
@keyframes gafrEmPulse {
  0%   { transform:translate(-50%,-50%) scale(0.55); opacity:0.95; }
  70%  { opacity:0.10; }
  100% { transform:translate(-50%,-50%) scale(2.2);  opacity:0; }
}
.plane .em-pulse{
  position:absolute;
  left:0; top:0;
  width:34px; height:34px;
  border-radius:50%;
  border:2.5px solid var(--em-color, #ef4444);
  box-shadow:0 0 0 1px rgba(0,0,0,.55) inset, 0 0 14px var(--em-color, #ef4444);
  pointer-events:none;
  display:none;
  transform:translate(-50%,-50%) scale(1);
  z-index:2;
}
.plane.is-em .em-pulse{
  display:block;
  animation:gafrEmPulse 1.35s ease-out infinite;
}
.plane.is-em-7700{ --em-color:#ef4444; }
.plane.is-em-7600{ --em-color:#f59e0b; }
.plane.is-em-7500{ --em-color:#a855f7; }
.plane.is-em .tag{
  border-color:var(--em-color, #ef4444) !important;
  color:#fff;
  text-shadow:0 0 8px var(--em-color, #ef4444);
}

#gafr-em-banner{
  position:fixed;
  top:0; left:0; right:0;
  z-index:9000;
  display:flex; align-items:center; gap:12px;
  padding:10px 18px;
  background:#ef4444;
  color:#fff;
  font:700 14px/1.2 'IBM Plex Sans',system-ui,sans-serif;
  letter-spacing:0.04em;
  box-shadow:0 2px 14px rgba(0,0,0,.4);
  text-transform:uppercase;
  transform:translateY(-100%);
  transition:transform .25s ease-out;
}
#gafr-em-banner.is-visible{ transform:translateY(0); }
#gafr-em-banner.sq-7700{ background:#ef4444; }
#gafr-em-banner.sq-7600{ background:#f59e0b; color:#1a1a1a; }
#gafr-em-banner.sq-7500{ background:#a855f7; }
#gafr-em-banner .gem-icon{
  width:20px; height:20px;
  border-radius:50%;
  border:2px solid currentColor;
  display:inline-flex; align-items:center; justify-content:center;
  font-size:13px; font-weight:900;
}
#gafr-em-banner .gem-text{ flex:1; }
#gafr-em-banner .gem-cs{ font-weight:800; }
#gafr-em-banner .gem-zoom{
  background:rgba(255,255,255,.18);
  border:1px solid rgba(255,255,255,.45);
  color:inherit;
  font:600 11px/1 'IBM Plex Mono',monospace;
  padding:5px 9px;
  border-radius:3px;
  cursor:pointer;
}
#gafr-em-banner .gem-zoom:hover{ background:rgba(255,255,255,.28); }
#gafr-em-banner .gem-x{
  background:transparent;
  border:none;
  color:inherit;
  font:700 18px/1 'IBM Plex Sans',system-ui,sans-serif;
  cursor:pointer;
  padding:2px 6px;
  opacity:.85;
}
#gafr-em-banner .gem-x:hover{ opacity:1; }

/* ── STALE DATA INDICATOR ─────────────────────────────────────────
   When the live aircraft poll has not produced fresh data for > ~12 s
   (OS sleep, browser throttle, network glitch) the map markers are
   showing positions that are no longer current. We surface that two
   ways: a topbar badge (always visible if stale, never blocking) and
   a subtle filter on #map_canvas so the user can read at a glance
   that "what's on screen is not now". The filter is lightweight —
   grayscale + slight opacity drop — readable but visibly off-spec.
   The activity-trigger force-refetch in script.js will normally clear
   the state within ~1 fetch cycle once the user touches the page. */
/* Synchronization indicator — visually identical to .status-pill family so
 * the topbar reads as one consistent row of subtle pills. Two states:
 *   .is-ok    → mirrors .status-pill (green, soft, dot pulses)
 *   .is-stale → mirrors .status-pill.crit (red, soft, dot calm)
 * No full-background pulse — the changing "· N s" counter and the red dot
 * are enough signal without making the topbar shout. */
.gafr-stale-badge{
  display:flex; align-items:center; gap:8px;
  padding:5px 10px;
  border:1px solid;
  transition: background .25s ease, border-color .25s ease, color .25s ease;
}
.gafr-stale-badge .dot{
  width:7px; height:7px; border-radius:50%;
  flex:0 0 auto;
}
.gafr-stale-badge .txt{
  font-family:var(--cond);
  font-size:11px; font-weight:600;
  letter-spacing:.16em;
  text-transform:uppercase;
}
.gafr-stale-badge.is-ok{
  background:rgba(47,212,122,.08);
  border-color:rgba(47,212,122,.3);
}
.gafr-stale-badge.is-ok .dot{
  background:var(--ok);
  box-shadow:0 0 0 0 var(--ok-glow);
  animation:pulseOK 2s infinite;
}
.gafr-stale-badge.is-ok .txt{ color:var(--ok); }
.gafr-stale-badge.is-stale{
  background:rgba(239,68,68,.08);
  border-color:rgba(239,68,68,.3);
}
.gafr-stale-badge.is-stale .dot{
  background:var(--crit);
  box-shadow:none;
  animation:none;
}
.gafr-stale-badge.is-stale .txt{ color:var(--crit); }


/* ═══════════════════════════════════════════════════════════════
   LIGHT THEME — html.is-light override (revamp v3 = "moderný")
   Aktivuje sa cez settings popup → Vzhľad → "Svetlý". Persist v
   localStorage('gafr.theme').

   PALETA — slate + cyan accent (modern aviation control room):
     canvas       #f1f4f8   (off-white background, jemný studený nádych)
     surface      #ffffff   (cards, panels, buttons base)
     surface dim  #f7f8fb   (popup head, hover states)
     border       #dadfe6   (hairline jemný studený sivý — slate-200)
     accent       #0891b2   (cyan-600, deep professional teal)
     accent hover #06b6d4   (cyan-500)
     ok           #10b981   (emerald-500)
     warn         #f59e0b   (amber-500)
     crit         #dc2626   (red-600)
     play         #ea580c   (orange-600 PLAYBACK)
     text         #0f172a   (slate-900 — sytá, vysoký kontrast)
     text dim     #475569   (slate-600)
     text muted   #94a3b8   (slate-400)

   Princípy:
     • Flat surfaces — žiadne sivé metalic gradienty (predtým "MOZNOST.png" look)
     • Hairline borders + soft shadows pre depth (Linear/FlightAware estetika)
     • Status pills: tinted bg + saturated foreground (clean, čitateľné)
     • Konzistentný 4px radius na controls, 8px na cards/popups
   ═══════════════════════════════════════════════════════════════ */

html.is-light{
  --lt-bg:#f1f4f8;       --lt-bg-hi:#ffffff;   --lt-bg-lo:#e7eaf0;
  --lt-panel:#ffffff;    --lt-panel-2:#f7f8fb; --lt-side:#f1f4f8;
  --lt-border:#dadfe6;   --lt-border-soft:rgba(15,23,42,.06);
  --lt-border-strong:#b9c0cc;
  --lt-text:#0f172a;     --lt-text-2:#475569;  --lt-text-3:#94a3b8;
  --lt-accent:#0891b2;   --lt-accent-2:#06b6d4; --lt-accent-soft:rgba(8,145,178,.10);
  --lt-ok:#10b981;       --lt-warn:#f59e0b;    --lt-crit:#dc2626;
  --lt-play:#ea580c;
  --lt-shadow-1:0 1px 2px rgba(15,23,42,.04), 0 1px 3px rgba(15,23,42,.06);
  --lt-shadow-2:0 4px 12px rgba(15,23,42,.08), 0 2px 4px rgba(15,23,42,.04);
}

/* shared button base — flat white surface s hairline borderom + jemný
   shadow. Hover = subtle accent tint, žiadne výrazné gradient prepínanie.
   Font-weight 500 (predtým 600) — modernejší clean look. */
html.is-light .atc-btn,
html.is-light .atc-iconbtn,
html.is-light .atc-mode-btn{
  color:var(--lt-text);
  background:var(--lt-panel);
  border:1px solid var(--lt-border);
  box-shadow:var(--lt-shadow-1);
  border-radius:4px;
  font-weight:500;
  text-shadow:none;
  transition:background .12s, border-color .12s, color .12s;
}
html.is-light .atc-btn:hover,
html.is-light .atc-iconbtn:hover,
html.is-light .atc-mode-btn:hover{
  background:var(--lt-accent-soft);
  border-color:var(--lt-accent);
  color:var(--lt-accent);
}

/* ── TOPBAR ────────────────────────────────────────────────── */
html.is-light .topbar{
  background:var(--lt-panel) !important;
  border-bottom:1px solid var(--lt-border);
  box-shadow:0 1px 3px rgba(15,23,42,.06);
}
html.is-light .topbar::after{display:none}

html.is-light .brand-big{color:var(--lt-text);text-shadow:none}

html.is-light .top-search{border-right-color:var(--lt-border)}
html.is-light .search-wrap{
  background:var(--lt-bg);border:1px solid var(--lt-border);
  border-radius:6px;
  box-shadow:none;
}
html.is-light .search-wrap:focus-within{
  background:var(--lt-panel);
  border-color:var(--lt-accent);
  box-shadow:0 0 0 3px var(--lt-accent-soft);
}
html.is-light .search-wrap > svg{color:var(--lt-text-3)}
html.is-light .search-wrap input{color:var(--lt-text)}
html.is-light .search-wrap input::placeholder{color:var(--lt-text-3)}

/* ATC strip */
html.is-light .atc-strip{
  background:transparent;
  border-left-color:var(--lt-border);
}
html.is-light .atc-sec,
html.is-light .atc-sec-row,
html.is-light .atc-pickgrp,
html.is-light .atc-iconrow,
html.is-light .atc-clock{
  border-right-color:var(--lt-border);
}
html.is-light .atc-label{
  color:var(--lt-text-2);font-weight:500;
  letter-spacing:.18em;font-size:9.5px;
}

/* value boxy — soft tinted bg + saturated foreground (modern pill look).
   atc-val base = neutral surface; špecifické statusy prepnu na color tint. */
html.is-light .atc-val{
  color:var(--lt-text);background:var(--lt-bg);
  border:1px solid var(--lt-border);
  border-radius:4px;
  text-shadow:none;
  box-shadow:none;
}
html.is-light .atc-val--ok{                 /* OK — emerald soft tint */
  color:#047857;background:rgba(16,185,129,.12);
  border-color:rgba(16,185,129,.28);font-weight:600;
  text-shadow:none;box-shadow:none;
}
html.is-light .atc-val--warn{               /* WARN — amber soft tint */
  color:#b45309;background:rgba(245,158,11,.14);
  border-color:rgba(245,158,11,.32);font-weight:600;
}
html.is-light .atc-val--crit{               /* CRIT — red soft tint */
  color:#b91c1c;background:rgba(220,38,38,.10);
  border-color:rgba(220,38,38,.30);font-weight:600;
}
html.is-light .atc-val--num{                /* RANGE/FILTER — saturated cyan na bielom */
  color:var(--lt-accent);background:var(--lt-panel);
  border-color:var(--lt-border);text-shadow:none;font-weight:500;
  box-shadow:inset 0 1px 2px rgba(15,23,42,.04);
}
html.is-light .atc-val--num:focus,
html.is-light .atc-fl-input:focus,
html.is-light .atc-range-input:focus{
  border-color:var(--lt-accent);
  box-shadow:0 0 0 3px var(--lt-accent-soft);
}
html.is-light .atc-val--pick{               /* SPD/HIST picker */
  color:var(--lt-text);background:var(--lt-panel);
  border-color:var(--lt-border);font-weight:500;
  box-shadow:none;
}
html.is-light .atc-val--pick:hover,
html.is-light .atc-val--pick.is-open{
  border-color:var(--lt-accent); color:var(--lt-accent);
  background:var(--lt-accent-soft);
}
html.is-light .atc-val--pick.is-off{ color:var(--lt-text-3) }

/* Floating pick menu — clean white card */
html.is-light .atc-pick-menu{
  background:var(--lt-panel); border:1px solid var(--lt-border);
  border-radius:6px;
  box-shadow:var(--lt-shadow-2);
}
html.is-light .atc-pick-menu .pm-row{
  color:var(--lt-text); border-bottom-color:var(--lt-border-soft);
}
html.is-light .atc-pick-menu .pm-row:hover{
  background:var(--lt-accent-soft); color:var(--lt-accent);
}
html.is-light .atc-pick-menu .pm-row.is-on{
  background:var(--lt-accent-soft); color:var(--lt-accent);
  font-weight:600;
}

/* MODE button → PLAYBACK = oranžová (single saturated fill) */
html.is-light .atc-mode-btn.is-playback{
  color:#fff;
  background:var(--lt-play);
  border:1px solid var(--lt-play);
  box-shadow:0 1px 3px rgba(234,88,12,.32);
  font-weight:600;
}
html.is-light .atc-mode-btn.is-playback:hover{
  background:#c2410c;border-color:#c2410c;color:#fff;
}

/* QL active — amber tint na bielom */
html.is-light .atc-btn.is-quicklook{
  color:#b45309;
  background:rgba(245,158,11,.14);
  border-color:rgba(245,158,11,.40);font-weight:600;
  box-shadow:none;
}
html.is-light .atc-btn.is-quicklook:hover{
  background:rgba(245,158,11,.22);
  border-color:var(--lt-warn);color:#92400e;
}

/* clock — clean cyan na svetlom, žiadny tmavý box */
html.is-light .atc-time{
  color:var(--lt-accent);text-shadow:none;
  background:transparent;
  padding:0;border:0;border-radius:0;
  box-shadow:none;
}
html.is-light .atc-utc{ color:var(--lt-text-3) }
html.is-light .atc-clock{padding:0 20px}
html.is-light .atc-settings{color:var(--lt-text-2)}
html.is-light .atc-settings:hover{color:var(--lt-accent);background:var(--lt-accent-soft)}
html.is-light .atc-settings.is-active{color:var(--lt-accent);background:var(--lt-accent-soft)}

html.is-light .nav a{color:var(--lt-text-2)}
html.is-light .nav a.is-active{
  color:var(--lt-accent);background:var(--lt-accent-soft);
  border-color:transparent;box-shadow:inset 0 -2px 0 var(--lt-accent);
}

/* ── SIDEBAR (drawer) ──────────────────────────────────────── */
html.is-light .side{
  background:var(--lt-panel);
  border-right-color:var(--lt-border);
  box-shadow:1px 0 3px rgba(15,23,42,.04);
}
html.is-light .side-head .side-title h2{color:var(--lt-text)}
html.is-light .side-title .count{
  color:var(--lt-text-2);background:var(--lt-bg);
  border:1px solid var(--lt-border);
}
html.is-light .side-head .sort{color:var(--lt-text-2)}
html.is-light .side-head .sort:hover{color:var(--lt-accent)}
html.is-light .side-search{
  background:var(--lt-bg);border:1px solid var(--lt-border);
  border-radius:6px;
  box-shadow:none;
}
html.is-light .side-search:focus-within{
  background:var(--lt-panel);border-color:var(--lt-accent);
  box-shadow:0 0 0 3px var(--lt-accent-soft);
}
html.is-light .side-search svg{color:var(--lt-text-3)}
html.is-light .side-search input{color:var(--lt-text)}
html.is-light .side-search input::placeholder{color:var(--lt-text-3)}

/* detail card */
html.is-light .detail{background:var(--lt-panel);color:var(--lt-text)}
html.is-light .detail::before{display:none}
html.is-light .detail-cs .cs{color:var(--lt-text)}
html.is-light .detail-cs .type{
  color:#fff;background:var(--lt-accent);border-color:var(--lt-accent);font-weight:600;
  box-shadow:none;
}
html.is-light .detail-reg{color:var(--lt-text-2)}
html.is-light .detail-reg .pipe{color:var(--lt-text-3)}
html.is-light .detail-tag{
  color:var(--lt-text);background:var(--lt-bg);border-color:var(--lt-border);
  box-shadow:none;
}
html.is-light .detail-tag .dot{background:var(--lt-ok)}
html.is-light .detail-close{
  background:var(--lt-panel);color:var(--lt-text-2);border-color:var(--lt-border);
}
html.is-light .detail-close:hover{
  border-color:var(--lt-crit);color:var(--lt-crit);
  background:rgba(220,38,38,.06);
}
html.is-light .detail-section-title{color:var(--lt-text);border-bottom-color:var(--lt-border)}

html.is-light .fields-rows .fr{border-bottom-color:var(--lt-border-soft)}
html.is-light .fields-rows .fr .k{color:var(--lt-text-2)}
html.is-light .fields-rows .fr .v{color:var(--lt-text)}
html.is-light .fields-rows .fr .v small{color:var(--lt-text-3)}
html.is-light .fields-rows .fr .v.vr-down{color:var(--lt-crit)}
html.is-light .fields-rows .fr .v .sqk-em{color:var(--lt-crit)}

html.is-light .empty-detail{color:var(--lt-text-2)}
html.is-light .empty-detail svg{color:var(--lt-text-3)}
html.is-light .empty-detail h4{color:var(--lt-text)}

/* ── STATUS BAR (footer) ──────────────────────────────────── */
html.is-light .status{
  background:var(--lt-panel);
  border-top:1px solid var(--lt-border);
  color:var(--lt-text);
  box-shadow:0 -1px 3px rgba(15,23,42,.04);
}
html.is-light .status .k{color:var(--lt-text-2)}
html.is-light .status .v{color:var(--lt-text)}
html.is-light .status .v.ok{color:#047857}
html.is-light .status .v.warn{color:#b45309}
html.is-light .status .v.crit{color:var(--lt-crit)}
html.is-light .status-warn{
  color:#b45309;
  background:rgba(245,158,11,.14);
  border-color:rgba(245,158,11,.32);
}
html.is-light .status-copy{color:var(--lt-text-2)}

/* ── MAP HUD ──────────────────── */
html.is-light .map-modes button,
html.is-light .zoom-ctrl button{
  color:var(--lt-text);
  background:var(--lt-panel);
  border:1px solid var(--lt-border);
  border-radius:4px;
  box-shadow:var(--lt-shadow-1);
  font-weight:500;
}
html.is-light .map-modes button.is-on{
  background:var(--lt-accent);
  border-color:var(--lt-accent);color:#fff;
  box-shadow:0 1px 3px rgba(8,145,178,.32);
}
html.is-light .map-modes button:hover,
html.is-light .zoom-ctrl button:hover{
  background:var(--lt-accent-soft);
  border-color:var(--lt-accent);color:var(--lt-accent);
}
html.is-light .map-modes button.is-on:hover{
  background:var(--lt-accent-2);border-color:var(--lt-accent-2);color:#fff;
}

/* ── POPUPS ──────────────────────────────── */
html.is-light .popup{
  background:var(--lt-panel);
  border:1px solid var(--lt-border);
  color:var(--lt-text);
  box-shadow:var(--lt-shadow-2);
  border-radius:8px;
}
html.is-light .popup-head{
  background:var(--lt-panel-2);
  border-bottom-color:var(--lt-border);
}
html.is-light .popup-head h3{color:var(--lt-text)}
html.is-light .popup-head .sub{color:var(--lt-text-2)}
html.is-light .popup-close{
  background:var(--lt-panel);color:var(--lt-text-2);border-color:var(--lt-border);
  box-shadow:none;
}
html.is-light .popup-close:hover{
  border-color:var(--lt-crit);color:var(--lt-crit);
  background:rgba(220,38,38,.06);
}
html.is-light .popup-backdrop{background:rgba(15,23,42,.30);backdrop-filter:blur(3px)}

html.is-light .slider .lbl-row{color:var(--lt-text)}
html.is-light .slider .lbl-row .v{color:var(--lt-text-2)}
html.is-light .slider input[type=range]{accent-color:var(--lt-accent)}
html.is-light .slider .ticks{color:var(--lt-text-3)}

html.is-light .label-toggles .lt-head{color:var(--lt-text)}
html.is-light .label-toggles .lt-row{color:var(--lt-text)}
html.is-light .label-toggles .lt-row .sw{
  background:var(--lt-bg);border-color:var(--lt-border);
  box-shadow:inset 0 1px 1px rgba(15,23,42,.04);
}
html.is-light .label-toggles .lt-row.is-on .sw{
  background:var(--lt-ok);border-color:var(--lt-ok);
  box-shadow:0 1px 3px rgba(16,185,129,.32);
}
html.is-light .label-toggles .lt-sep{border-color:var(--lt-border)}

html.is-light .tool-btn-inline{
  color:var(--lt-text);
  background:var(--lt-panel);
  border:1px solid var(--lt-border);
  border-radius:4px;
  box-shadow:var(--lt-shadow-1);
  font-weight:500;
}
html.is-light .tool-btn-inline:hover{
  background:var(--lt-accent-soft);
  border-color:var(--lt-accent);color:var(--lt-accent);
}

html.is-light .iv-segctl button{
  color:var(--lt-text);
  background:var(--lt-panel);
  border:1px solid var(--lt-border);
  font-weight:500;
}
html.is-light .iv-segctl button:hover{
  background:var(--lt-accent-soft);
  border-color:var(--lt-accent);color:var(--lt-accent);
}
html.is-light .iv-segctl button.is-on{
  background:var(--lt-accent);
  color:#fff;border-color:var(--lt-accent);
  box-shadow:0 1px 3px rgba(8,145,178,.32);
}

html.is-light input[type=checkbox]{accent-color:var(--lt-accent)}

/* ── RIGHT PANEL ─── */
html.is-light .right{
  background:var(--lt-panel);
  border-left-color:var(--lt-border);color:var(--lt-text);
}
html.is-light .card{
  background:var(--lt-panel);
  border:1px solid var(--lt-border);
  border-radius:8px;
  box-shadow:var(--lt-shadow-1);
}
html.is-light .card h3{color:var(--lt-text)}
html.is-light .card .sub{color:var(--lt-text-2)}
html.is-light .airspace-row{border-bottom-color:var(--lt-border-soft);color:var(--lt-text)}
html.is-light .airspace-row:hover{background:var(--lt-accent-soft)}
html.is-light .inview-row{color:var(--lt-text);border-bottom-color:var(--lt-border-soft)}
html.is-light .inview-row:hover{background:var(--lt-accent-soft)}

/* ── EM banner — saturated red s bielym textom */
html.is-light #gafr-em-banner{
  background:var(--lt-crit);
  color:#fff;border-color:var(--lt-crit);
  box-shadow:0 4px 14px rgba(220,38,38,.32);
}
html.is-light .gem-zoom,
html.is-light .gem-x{
  color:var(--lt-crit);background:#fff;
  border:1px solid #fff;font-weight:600;
  box-shadow:var(--lt-shadow-1);
}

/* body / app canvas */
html.is-light body{background:var(--lt-bg)}
html.is-light .app{background:var(--lt-bg)}

/* ── gafr-timeline.js — FR24-style tick timeline ── */
.gafr-timeline { position: relative; width: 100%; height: 56px; user-select: none; }
.gafr-timeline-ticks { position: absolute; inset: 0 0 24px 0; pointer-events: none; }
.gafr-tick { position: absolute; bottom: 0; width: 1px; height: 6px; background: #555; }
.gafr-tick.major { height: 12px; background: #aaa; }
.gafr-tick-label {
  position: absolute; bottom: 14px; left: 50%; transform: translateX(-50%);
  font: 11px ui-monospace,Menlo,Consolas; color: #ccc; white-space: nowrap;
}
.gafr-timeline-range {
  position: absolute; bottom: 0; left: 0; right: 0; height: 24px;
  appearance: none; background: transparent; margin: 0;
}
.gafr-timeline-range::-webkit-slider-runnable-track {
  height: 4px; background: linear-gradient(to right, #e7a500 var(--p, 0%), #333 var(--p, 0%));
  border-radius: 2px;
}
.gafr-timeline-range::-webkit-slider-thumb {
  appearance: none; width: 14px; height: 14px; border-radius: 50%; background: #e7a500;
  border: 2px solid #fff; margin-top: -5px; cursor: grab;
}
.gafr-timeline-tooltip {
  position: absolute; bottom: 28px; transform: translateX(-50%);
  background: #000d; color: #fff; padding: 2px 6px; border-radius: 3px;
  font: 11px ui-monospace,Menlo,Consolas; pointer-events: none;
}

/* ── Edge notification banner (Task 9.2) ── */
.grc-edge-notice {
  display: flex; gap: 10px; align-items: center;
  background: #2a2a2dcc; color: #f8d68a;
  padding: 8px 14px; margin: 6px 0; border-radius: 4px;
  border: 1px solid #f8d68a44; font-size: 12px;
}
.grc-edge-notice[hidden] { display: none; }
.grc-edge-icon { font-size: 14px; }
.grc-edge-msg { flex: 1; }
.grc-edge-open { background: #e7a500; color:#000; border:0; padding: 4px 10px; border-radius:3px; cursor:pointer; font: 11px ui-monospace; }
.grc-edge-x { background: transparent; border:0; color: #f8d68a; cursor: pointer; font-size: 14px; }

/* ── Preset buttons row (Task 9.4) ── */
.grc-presets { display: flex; gap: 6px; flex-wrap: wrap; margin-bottom: 8px; }
.grc-presets button {
  background: #2a2a2d; color: #ccc; border: 1px solid #444;
  padding: 4px 10px; border-radius: 3px; cursor: pointer;
  font: 11px ui-monospace,Menlo,Consolas;
}
.grc-presets button:hover { border-color: #e7a500; color: #fff; }

/* ── Continuous speed slider (Task 10.2) ── */
.play-speed { display: inline-flex; align-items: center; gap: 6px; }
.play-speed-range { width: 100px; height: 18px; }
.play-speed-val { font: 11px ui-monospace; color: #ccc; min-width: 36px; text-align: right; }
