:root{
  --ink:#0d1519;
  --panel:rgba(13,21,25,.80);
  --line:rgba(232,237,239,.14);
  --fg:#e8edef;
  --fg-dim:#8ea0a8;
  --climb:#e8a33d;
  --sink:#4fa3d9;
  --neutral:#f2f4f4;
}

*{box-sizing:border-box}
html,body{margin:0;height:100%;background:var(--ink);overflow:hidden;
  font-family:"IBM Plex Sans",system-ui,sans-serif;color:var(--fg)}

#stage{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;background:#000}
#stage.vertical #frame{width:min(100vw, calc(100vh * 9 / 16));height:100vh}
#frame{position:relative;width:100%;height:100%;overflow:hidden}
#cesium{width:100%;height:100%}
.cesium-widget-credits{font-size:10px !important;opacity:.75}

/* ---- HUD -------------------------------------------------------- */
/* Panel může být vysoký až po spodní okraj okna; HUD (posuvník, statistiky,
   atribuce) proto začíná až za ním, ne pod ním — jinak nebyl vidět levý
   konec posuvníku. V 9:16 je rám uprostřed: buď je vedle panelu místo,
   nebo se panel schová (syncPanelForFormat), takže se nepřekrývají. */
#hud{position:absolute;left:0;right:0;bottom:0;padding:12px 16px 16px;
  background:linear-gradient(to top, rgba(13,21,25,.88), rgba(13,21,25,0));
  pointer-events:none;display:flex;flex-direction:column;gap:11px}
#scrubRow{display:flex;align-items:center;gap:10px;pointer-events:auto}
#tinyPlay{width:26px;height:26px;flex:none;padding:0;font-size:10px;line-height:1;
  color:var(--fg);background:rgba(13,21,25,.6);border:1px solid var(--line);
  border-radius:2px;cursor:pointer}
#tinyPlay:hover{background:rgba(232,237,239,.16)}
#scrubWrap{flex:1;position:relative;display:flex;align-items:center;min-width:0;height:26px}
#scrub{width:100%;accent-color:var(--climb);cursor:pointer;margin:0;position:relative;z-index:1}
/* úsek: ztlumení mimo (dimL/dimR), zvýraznění uvnitř (rangeSel), táhla */
.rangeDim,#rangeSel{position:absolute;top:50%;height:8px;margin-top:-4px;pointer-events:none;border-radius:4px;z-index:2}
.rangeDim{background:rgba(13,21,25,.62)}
#rangeSel{background:rgba(232,163,61,.22);box-shadow:inset 0 0 0 1px rgba(232,163,61,.45)}
.rangeHandle{position:absolute;top:50%;width:12px;height:22px;margin:-11px 0 0 -6px;z-index:3;
  background:var(--climb);border:1px solid var(--ink);border-radius:3px;cursor:ew-resize;touch-action:none;
  box-shadow:0 1px 3px rgba(0,0,0,.5)}
.rangeHandle::before{content:"";position:absolute;inset:-8px -10px}     /* větší úchop */
.rangeHandle::after{content:"";position:absolute;left:4px;top:5px;width:2px;height:10px;background:rgba(13,21,25,.55)}
.rangeHandle:focus-visible{outline:2px solid var(--fg);outline-offset:1px}
#rangeAll{flex:none;padding:4px 8px;font-family:inherit;font-size:10.5px;color:var(--fg);
  background:rgba(13,21,25,.6);border:1px solid var(--line);border-radius:2px;cursor:pointer}
/* skryté tlačítko drží místo (visibility), jinak by se při prvním tažení
   táhla osa pod prstem zúžila a táhlo uskočilo (změřeno: konec 2088 s
   místo 2000 s) */
#rangeAll[hidden]{visibility:hidden}
#timeLabel{font-family:"IBM Plex Mono",monospace;font-size:11.5px;
  color:var(--fg-dim);font-variant-numeric:tabular-nums;flex:none}
#metrics{display:flex;gap:22px;align-items:flex-end;flex-wrap:wrap;justify-content:flex-end}
.metric{min-width:74px;text-align:right}
.metric .label{font-size:10.5px;letter-spacing:.04em;color:var(--fg-dim);margin-bottom:1px}
.metric .value{font-family:"IBM Plex Mono",monospace;font-weight:600;
  font-size:26px;line-height:1;font-variant-numeric:tabular-nums}
.metric .unit{font-size:12px;font-weight:400;color:var(--fg-dim);margin-left:3px}
#vsValue.up{color:var(--climb)} #vsValue.down{color:var(--sink)}
/* Atribuce za „i": malá, málo kontrastní, ale vždy dostupná (licence).
   Rozbalí ji hover na celém #attrib nebo klik (třída .open). */
#attrib{display:flex;justify-content:flex-end;align-items:center;gap:8px;pointer-events:auto}
#mark{display:block;font-size:9.5px;color:var(--fg-dim);opacity:.7;text-align:right;line-height:1.4;
  max-width:0;overflow:hidden;white-space:nowrap;transition:max-width .18s ease}
#attrib:hover #mark,#attrib.open #mark{max-width:900px}
#attribToggle{flex:none;width:16px;height:16px;padding:0;border-radius:50%;cursor:pointer;
  font-family:"IBM Plex Serif",Georgia,serif;font-style:italic;font-size:10px;line-height:1;
  color:var(--fg-dim);opacity:.55;background:transparent;border:1px solid var(--line)}
#attrib:hover #attribToggle,#attrib.open #attribToggle{opacity:1;color:var(--fg)}

/* ---- ovládání --------------------------------------------------- */
/* Panel je sloupec: hlavička, scrollovatelné tělo se sekcemi, a patička
   s exportem, která se nescrolluje. Panel dřív přerostl výšku okna
   a tlačítka exportu vyjela mimo obraz. */
/* Panel podle wireframu (sada 3): 340 px vlevo přes celou výšku, scéna
   vedle něj (#stage dostane left:340px), ne za ním — jinak by při exportu
   zmenšené plátno leželo pod panelem. Barvy jako průvodce (.wizCard). */
:root{--panel-w:340px}
/* Plovoucí karta (build 78): odstup 12 px od okrajů, oblé rohy, scéna za
   ním. Nesahá ke spodnímu okraji — max. výška nechává místo HUD (posuvník
   videa začíná úplně vlevo), v admin režimu tělo scrolluje. */
/* Svislá poloha (build 79): dokud se panel vejde, sedí uprostřed výšky
   okna (stejně místa nad ním i pod ním). Když by střed zasáhl HUD
   (spodních 144 px), přilepí se nad HUD a s rostoucí výškou jede nahoru;
   ve 12 px od horního okraje ho zastaví max-height a tělo scrolluje
   (admin). Obě větve dávají v přechodech stejnou hodnotu, takže se nic
   neskokne — top = min(střed, nad HUD). Výšku panelu dodává ResizeObserver
   v ui.initPanelPosition jako --ph, CSS ji jinak nezná. */
/* Rezerva dole 96 px (build 128; do buildu 127 156 px): panel musí zůstat
   NAD ČASOVOU OSOU, která jde přes celou šířku okna, ale ne nad celým
   HUD — statistiky nad osou jsou zarovnané vpravo a atribuce pod osou
   taky, vlevo je pod osou jen přechod pozadí. Osa začíná 67 px od
   spodního okraje (16 + atribuce 14 + mezera 11 + řádek 26), 12 px mezera
   → 96 px; ve vzorci pro střed o 12 px míň, obě větve dávají v přechodu
   tutéž hodnotu (viz build 79). */
#panel{position:absolute;left:12px;width:var(--panel-w);max-height:calc(100% - 96px);
  top:max(12px, min(calc(50% - var(--ph,0px) / 2), calc(100% - 84px - var(--ph,0px))));
  transition:top .2s ease;
  display:flex;flex-direction:column;background:rgba(17,26,31,.92);backdrop-filter:blur(9px);
  border:1px solid var(--line);border-radius:5px;overflow:hidden;z-index:20;
  box-shadow:0 12px 40px rgba(0,0,0,.35)}
/* Číslo buildu: pravý dolní roh okna, jen s otevřeným průvodcem (leží
   v #wizard, ne na kartě; build 102). Drobné a ztlumené, do buildu 101
   bylo v patičce panelu a jen v adminu. */
/* Odkaz Admin je ve scéně vidět VŽDY (build 155, rozhodnutí autora; v buildech
   132–154 jen s #admin v adrese nebo po přihlášení). Ztlumený, při exportu
   a nahrávání schovaný (#adminLink níž), do videa se nekreslí. Číslo buildu
   je od buildu 133 pro všechny — leží v #wizard, takže je vidět jen
   s otevřeným průvodcem a do scény ani do videa se nedostane. */
#build{position:fixed;right:10px;bottom:8px;z-index:61;font-family:"IBM Plex Mono",monospace;font-size:10px;
  letter-spacing:.06em;color:var(--fg-dim);opacity:.55;pointer-events:none;user-select:none}
#panelBody{flex:1 1 auto;min-height:0;overflow-y:auto;padding:0 16px 2px}
#panelFoot{flex:none;padding:8px 16px 8px;border-top:1px solid var(--line);background:rgba(13,21,25,.35)}
.mono{font-family:"IBM Plex Mono",monospace;font-variant-numeric:tabular-nums}
.dim{color:var(--fg-dim)}

/* Sekce jsou vždy rozbalené a scrolluje se v těle panelu (build 69,
   dřív akordeon s jednou otevřenou). Nadpis je oddělovač, který při
   scrollování drží nahoře, ať je poznat, ve které sekci jsi; podklad
   má proto vlastní barvu, aby pod ním neprosvítal obsah. */
/* Sekce jsou KARTY (build 105, wireframe sada 5): světlejší pozadí,
   zaoblení, mezera mezi nimi; hlavička na tmavším podkladu s kapitálkami
   a stavem vpravo. Do buildu 104 to byly jen nadpisy oddělené linkou. */
/* Odstupy stažené (build 128; poprvé v buildu 125, vráceno v 127, znovu
   na pokyn autora): veřejný panel má být vidět celý NAD časovou osou,
   která zůstává přes celou šířku okna — panel proto nesmí přes
   max-height 100 % − 156 px a obsah se musí vejít do něj. V okně
   1568×755 (autorův Chrome) to znamená tělo ≤ 503 px; veřejné tělo
   má 496 px. Sekce 6 px, hlavička 7/7, skupiny 6, tlačítka 5. */
.sec{margin:0 0 6px;background:#0f1318;border:1px solid #1f252d;border-radius:5px;overflow:hidden;padding-bottom:0}
.sec>*:not(.secHead){margin-left:12px;margin-right:12px}
/* Hlavička karty: kapitálky s prostrkáním na tmavším podkladu, linka
   od obsahu; vpravo stav sekce (.secState) — akcentní, když je to
   aktivní stav (režim kamery, Zapnuto), jinak šedý. Build 103 měl
   běžné písmo bez hlavičky; pokyn „bez kapitálek" autor vzal zpět. */
.secHead{margin:0 0 7px;padding:7px 12px;background:#141a20;border-bottom:1px solid #1f252d;
  font-family:inherit;font-size:11px;font-weight:600;letter-spacing:.12em;text-transform:uppercase;color:#a8b2be;
  display:flex;align-items:center;justify-content:space-between;gap:10px}
.secState{font-size:12px;font-weight:400;letter-spacing:0;text-transform:none;color:#7d8795;white-space:nowrap;
  font-variant-numeric:tabular-nums}
.secState.on{color:var(--climb)}
/* konce rozsahu pod posuvníkem (rychlost přehrávání): posuvník na kraji
   je vidět jako „na konci rozsahu", ne jako zaseknutý */
.rangeEnds{display:flex;justify-content:space-between;margin-top:-2px;font-family:"IBM Plex Mono",monospace;font-size:9.5px;color:var(--fg-dim);opacity:.8}
/* popisek vlevo, hodnota vpravo tučně (vzdálenost od letadla) */
.grp>span.labelRow{display:flex;align-items:baseline;justify-content:space-between;gap:10px}   /* přebíjí .grp>span{display:block} */
.labelRow .val{font-family:inherit;font-size:13px;font-weight:600;color:#e6eaef}
.camNote{margin:0 0 8px;font-size:11px;line-height:1.45;color:var(--fg-dim)}
.camNote[hidden]{display:none}
.camHintTouch{display:none}
@media (hover:none) and (pointer:coarse){ .camHintDesk{display:none} .camHintTouch{display:inline} }
/* Volný úhel: tažení po scéně otáčí kamerou (build 156) */
body.freeCam #cesium canvas{cursor:grab}
body.freeCam.camDrag #cesium canvas{cursor:grabbing}
/* Nápověda k volnému úhlu (build 158, free-hint.js): DOM nad plátnem,
   bez podkladu, jen stíny pro čitelnost. Do videa se nekreslí a při
   exportu a nahrávání je navíc schovaná. */
.freeHint{position:absolute;inset:0;pointer-events:none;z-index:2;opacity:0}
body.exporting .freeHint,body.recording .freeHint{display:none}
.freeHint .fhArc{position:absolute;inset:0;width:100%;height:100%;overflow:visible}
.freeHint .fhPath{fill:none;stroke:rgba(255,255,255,.75);stroke-width:1.6;stroke-dasharray:3 6;stroke-linecap:round;
  filter:drop-shadow(0 1px 2px rgba(0,0,0,.45))}
.fhCursor{position:absolute;left:0;top:0;width:26px;height:30px;filter:drop-shadow(0 2px 4px rgba(0,0,0,.45))}
.fhCursor svg{width:100%;height:100%;display:block}
.fhFinger{position:absolute;left:0;top:0;width:34px;height:34px;margin:-17px 0 0 -17px;border-radius:50%;
  border:2px solid #fff;background:rgba(255,255,255,.16);box-shadow:0 2px 8px rgba(0,0,0,.35)}
.fhRing{position:absolute;left:0;top:0;width:34px;height:34px;margin:-17px 0 0 -17px;border-radius:50%;
  border:2px solid var(--climb);opacity:0}
.fhDot{position:absolute;left:0;top:0;width:8px;height:8px;margin:-4px 0 0 -4px;border-radius:50%;
  background:var(--climb);opacity:0;box-shadow:0 0 0 3px rgba(232,163,61,.25)}
.fhTxt{position:absolute;left:0;right:0;text-align:center;font-size:14.5px;font-weight:500;color:#fff;
  text-shadow:0 1px 3px rgba(0,0,0,.7),0 0 12px rgba(0,0,0,.35);letter-spacing:.005em}
.freeHint.narrow .fhTxt{font-size:14px}
/* Nový let nahoře v těle panelu jako odkaz, ne tlačítko v patičce (build 103) */
.panelLink{flex:none;padding:6px 0;border:0;background:transparent;text-align:left;font-family:inherit;font-size:11px;
  color:var(--fg-dim);text-decoration:underline;text-underline-offset:2px;cursor:pointer;white-space:nowrap}
.panelLink:hover{color:var(--climb)}
.sec>.grp:last-of-type{margin-bottom:8px}
.grp{margin-bottom:6px}
.grp>span{display:block;font-size:10.5px;color:var(--fg-dim);margin-bottom:3px}
.row{display:flex;gap:5px;flex-wrap:wrap}
button,select,input[type=file]{font-family:inherit}
.seg{flex:1;min-width:0;padding:5px 6px;font-size:11.5px;color:var(--fg-dim);
  background:transparent;border:1px solid var(--line);border-radius:3px;cursor:pointer;
  transition:background .12s,color .12s,border-color .12s}
.seg small{font-size:10px;color:var(--fg-dim);margin-left:3px}
.row.grid2{display:grid;grid-template-columns:1fr 1fr}
/* přepínač (vzdušné prostory) — stejný jazyk jako segmenty, jen tvar */
#camDistGrp[hidden]{display:none}
.switchRow{display:flex;align-items:center;justify-content:space-between;gap:12px}
.switchText{font-size:11.5px;color:var(--fg-dim);line-height:1.45}
.switch{flex:none;width:36px;height:20px;padding:0;border-radius:10px;border:1px solid var(--line);
  background:rgba(232,237,239,.08);cursor:pointer;position:relative;transition:background .15s,border-color .15s}
.switch i{position:absolute;top:2px;left:2px;width:14px;height:14px;border-radius:50%;background:var(--fg-dim);transition:left .15s,background .15s}
/* zapnutý celý akcentní (sada 5). Pozor při měření ve skrytém tabu:
   přechod .15 s tam nedoběhne a getComputedStyle vrací výchozí barvu —
   vypadá to jako nefunkční pravidlo (stálo to jeden pokus; s vypnutým
   přechodem je pozadí #e8a33d a knoflík vpravo). */
.switch[aria-pressed=true]{background:var(--climb);border-color:var(--climb)}
.switch[aria-pressed=true] i{left:18px;background:#0a0c0f}
.seg:hover{color:var(--fg)}
.seg[aria-pressed=true]{background:rgba(232,163,61,.14);color:var(--fg);border-color:var(--climb);font-weight:600}
.seg[aria-pressed=true] small{color:var(--fg)}
.seg:focus-visible{outline:2px solid var(--climb);outline-offset:1px}
input[type=range]{width:100%;accent-color:var(--climb)}
.val{font-family:"IBM Plex Mono",monospace;font-size:11px;color:var(--fg)}
#drop{border:1px dashed var(--line);border-radius:2px;padding:11px;text-align:center;
  font-size:11px;color:var(--fg-dim);cursor:pointer;line-height:1.5}
#drop:hover,#drop.over{border-color:var(--climb);color:var(--fg)}
#modelName{margin-top:6px;font-size:11px;color:var(--fg)}
#modelDrop{margin-top:6px;border:1px dashed var(--line);border-radius:2px;padding:7px;
  text-align:center;font-size:10.5px;color:var(--fg-dim);cursor:pointer;line-height:1.4}
#modelDrop:hover{border-color:var(--climb);color:var(--fg)}
#rec{width:100%;padding:8px;font-size:11.5px;font-weight:500;background:transparent;
  color:var(--fg);border:1px solid var(--line);border-radius:2px;cursor:pointer}
#rec.on{background:#c0392b;border-color:#c0392b}
#note{font-size:10.5px;color:var(--fg-dim);line-height:1.5;margin:0 0 10px}
#status{font-size:10.5px;line-height:1.5;margin:6px 0 0;color:var(--climb)}
#status:empty{display:none}

#boot{position:absolute;inset:0;display:grid;place-content:center;gap:8px;
  background:var(--ink);z-index:50;text-align:center}
/* PAST: bez tohohle pravidla atribut hidden nezabere — display:grid
   z pravidla na #boot má vyšší specificitu než [hidden]{display:none}
   a scéna zůstane pod černým překryvem (stálo to jeden pokus). */
#boot[hidden]{display:none}
#bootMsg{display:grid;gap:12px;justify-items:center}
#bootMsg[hidden]{display:none}
/* Fáze přípravy scény: co je hotové, co běží a co teprve přijde.
   Ukáže se jen když uživatel klikne na Zobrazit let dřív, než je
   příprava hotová — jinak se přejde rovnou (build 98). */
#bootPhases{list-style:none;margin:0;padding:0;display:grid;gap:7px;width:320px;text-align:left}
#bootPhases li{display:grid;grid-template-columns:14px 1fr auto;align-items:center;gap:8px;
  font-size:12.5px;color:var(--fg-dim)}
#bootPhases li[data-stav=run]{color:var(--fg)}
#bootPhases li[data-stav=done]{color:var(--fg-dim);opacity:.65}
#bootPhases .znak{font-family:"IBM Plex Mono",monospace;font-size:11px;text-align:center}
#bootPhases li[data-stav=run] .znak{color:var(--climb)}
#bootPhases .pct{font-family:"IBM Plex Mono",monospace;font-size:10px}
#bootNote{font-size:10px;color:var(--fg-dim);opacity:.7}
#bootCancel{margin-top:4px;min-width:120px}
#boot p{margin:0;font-size:12px;color:var(--fg-dim)}
#boot .big{font-size:14px;color:var(--fg)}

/* ---- nahrávání a sbalený panel ------------------------------------ */
/* Během nahrávání zmizí z obrazu všechno kromě statistik a atribuce.
   Do videa to sice nevstupuje (nahrává se plátno, ne DOM), ale co je
   na obrazovce, má odpovídat tomu, co se nahrává. */
body.recording #panel,
body.recording #panelOpen,
body.recording #scrubRow{display:none}
/* Během exportu leží přes celé okno #exportOverlay (build 100); panel
   pod ním se jen zhasne, aby se nic nepřepínalo, kdyby překryv chyběl. */
body.exporting #panelBody{opacity:.45;pointer-events:none}
body.exporting #newFlight{display:none}

#recStop{position:absolute;top:12px;right:12px;z-index:40;display:none;
  padding:7px 12px;font-family:inherit;font-size:11.5px;font-weight:500;
  color:#fff;background:#c0392b;border:none;border-radius:2px;cursor:pointer}
body.recording #recStop{display:block}

/* Sbalený panel. V 9:16 se panel vejde jen když je po stranách dost
   černého okraje; když není, překryl by půlku obrazu. */
#panelOpen{position:absolute;top:12px;left:12px;z-index:30;display:none;
  width:30px;height:30px;padding:0;font-family:inherit;font-size:13px;
  color:var(--fg);background:var(--panel);backdrop-filter:blur(9px);
  border:1px solid var(--line);border-radius:2px;cursor:pointer}
body.panelHidden #panel{display:none}
body.panelHidden #panelOpen{display:block}

#panelClose{position:static;flex:none;width:22px;height:22px;padding:0;
  font-family:inherit;font-size:13px;line-height:1;color:var(--fg-dim);
  background:transparent;border:1px solid var(--line);border-radius:2px;cursor:pointer}
#panelClose:hover{color:var(--fg)}

/* Přepínače exportu (sada 5): popisek vlevo, dvojice úzkých tlačítek
   vpravo v tmavém rámečku, vybrané má hnědý podklad s akcentní linkou. */
.expGrp{display:flex;align-items:center;justify-content:space-between;gap:10px;margin-bottom:6px}
.expGrp>span{margin:0;flex:1 1 auto;font-size:11.5px;color:#a8b2be}
.expGrp .row{flex:none;gap:3px;padding:3px;border-radius:5px;background:#0a0d10;flex-wrap:nowrap}
.expGrp .seg{flex:none;width:58px;padding:5px 0;font-size:12px;border:0;border-radius:3px;color:#98a2b0}
.expGrp .seg[aria-pressed=true]{background:#2e2517;box-shadow:inset 0 0 0 1px var(--climb);color:#fff;font-weight:600}

/* statistiky používání (admin) */
.stats{width:100%;border-collapse:collapse;font-size:11px;font-variant-numeric:tabular-nums;margin-bottom:6px}
.stats th,.stats td{padding:3px 0;text-align:right;color:var(--fg);border-bottom:1px solid rgba(232,237,239,.06)}
.stats th{font-weight:400;color:var(--fg-dim)}
.stats th:first-child,.stats td:first-child{text-align:left;color:var(--fg-dim)}
.statsJourneys td{vertical-align:top;padding:6px 5px 6px 0;white-space:normal;line-height:1.45}
.statsJourneys td:first-child{width:38%;min-width:150px}
.statsJourneys td:last-child{text-align:left;overflow-wrap:anywhere}

/* ---- kvalitní export --------------------------------------------- */
/* Hlavní tlačítko: jediná výrazná věc v panelu, ve veřejném režimu jediné tlačítko exportu. */
#exportBtn{width:100%;padding:10px;font-size:12.5px;font-weight:600;background:var(--climb);
  color:var(--ink);border:1px solid var(--climb);border-radius:2px;cursor:pointer;margin-bottom:6px;
  letter-spacing:.01em}
#exportBtn:hover{background:#f0b558;border-color:#f0b558}
#rec.secondary{font-weight:400;color:var(--fg-dim)}
#rec.secondary:hover{color:var(--fg)}

/* Během exportu zmizí z obrazu časová osa; průběh je na překryvu. */
body.exporting #panelOpen,
body.exporting #scrubRow{display:none}

/* ---- patička: souhrn a Exportovat (wireframe sada 3, rámec 3a) -------
   Průběh, hotovo a chyba jsou od buildu 100 na překryvu #exportOverlay,
   patička má jen klidový stav. */
/* Patička (build 129): vlevo odkaz Nový let, vpravo Exportovat na zbytek
   šířky; souhrn exportu tu od buildu 129 není. */
.footRow{display:flex;align-items:center;justify-content:space-between;gap:12px}
#panelFoot .footRow #exportBtn{margin:0;padding:9px 22px;width:auto;flex:1 1 auto}
#panelFoot .footIdle #rec{margin-top:6px}

/* ---- překryv exportu (build 100, Flighttrack-export-overlay.html) -----
   Celé okno včetně panelu. Vrstvy: zamrzlý snímek scény z doby před
   exportem (rozostřený), tmavý závoj, blok 520 px. Písmo systémové,
   žádný monospace; pruh je jen šířka výplně — bez šraf, pulzování
   a zaoblení. */
#exportOverlay{position:fixed;inset:0;z-index:65;display:flex;align-items:center;justify-content:center;
  font-family:system-ui,-apple-system,"Helvetica Neue","Segoe UI",sans-serif;color:#e6eaef;
  --exportAccent:#e0a52c;--exportErr:#d98b6a;--exportDim:#a8b2be}
#exportOverlay[hidden]{display:none}
#exportFreeze{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;
  filter:blur(18px);transform:scale(1.04)}   /* scale schová světlý lem rozostření u okrajů */
#exportOverlay .exportVeil{position:absolute;inset:0;background:rgba(7,10,13,.72)}
#exportOverlay[data-state=error] .exportVeil{background:rgba(7,10,13,.76)}
.exportBox{position:relative;width:520px;max-width:calc(100% - 40px);display:grid;gap:14px}
.exportHead{display:flex;align-items:baseline;justify-content:space-between;gap:16px}
#exportLabel{font-size:12px;font-weight:600;letter-spacing:.18em;text-transform:uppercase;color:#e6eaef}
#exportOverlay[data-state=done] #exportLabel{color:var(--exportAccent)}
#exportOverlay[data-state=error] #exportLabel{color:var(--exportErr)}
#exportPct{font-size:34px;font-weight:600;line-height:1;color:#fff;letter-spacing:-.01em;font-variant-numeric:tabular-nums}
.exportBar{position:relative;height:8px;border-radius:1px;background:#171d24;overflow:visible}
#exportBarFill{position:absolute;left:0;top:0;bottom:0;width:0;background:var(--exportAccent);border-radius:1px;
  transition:width .15s linear}
#exportOverlay[data-state=done] #exportBarFill{transition:none}
#exportOverlay[data-state=error] #exportBarFill{background:#7a5c3a;transition:none}
/* svislá linka na hraně dosažené výplně, jen u chyby */
#exportBarEdge{display:none;position:absolute;top:-3px;bottom:-3px;width:2px;background:var(--exportErr);
  transform:translateX(-1px)}
#exportOverlay[data-state=error] #exportBarEdge{display:block}
.exportScale{position:relative;height:5px;margin-top:-8px}
.exportScale i{position:absolute;top:0;width:1px;height:100%;background:#2f3843;transform:translateX(-.5px)}
.exportScale i.mid{background:#3f4a58}
.exportData{display:flex;justify-content:space-between;gap:12px;font-size:13px;color:var(--exportDim);
  font-variant-numeric:tabular-nums}
.exportNote{margin:0;font-size:13px;line-height:1.45;color:var(--exportDim)}
.exportNote:empty{display:none}
#exportOverlay[data-state=error] #exportErr{color:#e6eaef}
.exportBtns{display:flex;justify-content:center;gap:10px;margin-top:4px}
.exportBtn{padding:10px 18px;font-family:inherit;font-size:13px;font-weight:500;color:#e6eaef;
  background:rgba(255,255,255,.04);border:1px solid #333c47;border-radius:3px;cursor:pointer}
.exportBtn:hover{background:rgba(255,255,255,.08)}
.exportBtn.primary{background:var(--exportAccent);color:#0a0c0f;border-color:var(--exportAccent);font-weight:600}
.exportBtn.primary:hover{background:#f0b558;border-color:#f0b558}
/* která tlačítka jsou v kterém stavu */
#exportOverlay .exportBtn{display:none}
#exportOverlay[data-state=busy] #exportCancel,
#exportOverlay[data-state=done] #exportDownload,#exportOverlay[data-state=done] #exportAgain,
#exportOverlay[data-state=error] #exportRetry,#exportOverlay[data-state=error] #exportAgain{display:inline-block}
/* úzké okno: procenta nad pruh vlevo, údaje pod sebe, Zrušit na plnou šířku */
@media (max-width:720px){
  #exportFreeze{filter:blur(16px)}
  .exportHead{flex-direction:column;align-items:flex-start;gap:6px}
  #exportPct{font-size:44px}
  .exportData{flex-direction:column;gap:4px}
  #exportOverlay[data-state=busy] .exportBtns{display:grid}
  #exportOverlay[data-state=busy] #exportCancel{width:100%}
}
.footTitle.err{color:#e8705a}

/* ---- hláška o vletu/výstupu z prostoru (airspace.js → ui.setCrossing) -- */
#crossing{position:absolute;top:26px;left:50%;transform:translateX(-50%);z-index:34;
  padding:7px 14px;font-family:"IBM Plex Sans",system-ui,sans-serif;font-size:15px;font-weight:600;
  letter-spacing:.02em;color:var(--fg);background:rgba(13,21,25,.78);border:1px solid var(--line);
  border-radius:3px;pointer-events:none;white-space:nowrap}
#crossing[hidden]{display:none}

/* ---- ukazatel snímkové frekvence ----------------------------------- */
/* Je to DOM nad plátnem, takže se do videa nedostane — skládané plátno
   kreslí jen statistiky a atribuci. Proto smí zůstat vidět i během
   nahrávání, což je celý smysl: ukázat, kolik nahrávání stojí. */
#fps{position:absolute;top:12px;right:12px;z-index:35;display:none;
  padding:5px 8px;font-family:"IBM Plex Mono",monospace;font-size:11px;
  color:var(--fg);background:var(--panel);backdrop-filter:blur(9px);
  border:1px solid var(--line);border-radius:2px;
  font-variant-numeric:tabular-nums;white-space:nowrap}
body.fpsOn #fps{display:block}
body.recording #fps{top:52px}   /* uhnout tlačítku Zastavit */

/* ---- veřejný a admin režim ------------------------------------------
   Veřejný režim (výchozí) schová všechno s data-admin; body.admin to
   vrátí. Je to úklid rozhraní, ne zabezpečení — kdokoli si třídu
   nastaví z konzole (CLAUDE.md). */
body:not(.admin) [data-admin]{display:none !important}
body.admin .pubOnly{display:none !important}
#adminLink{position:absolute;top:14px;right:14px;z-index:36;font-family:"IBM Plex Mono",monospace;
  font-size:10px;letter-spacing:.06em;text-transform:uppercase;color:var(--fg-dim);opacity:.4;
  text-decoration:none;padding:3px 6px;border-radius:2px}
#adminLink:hover{opacity:1;color:var(--fg);background:var(--panel)}
body.fpsOn #fps{right:84px}   /* uhnout odkazu Admin */
/* NESMÍ do videa: export i rychlý náhled kreslí jen plátno a overlay.js,
   tohle je pojistka i pro zmenšené plátno pod překryvem exportu */
body.recording #adminLink,body.exporting #adminLink{display:none}
#adminDialog,#exportAsk{background:var(--ink);color:var(--fg);border:1px solid var(--line);border-radius:3px;
  padding:18px 20px;width:300px;max-width:calc(100vw - 32px)}
#adminDialog::backdrop,#exportAsk::backdrop{background:rgba(0,0,0,.55);backdrop-filter:blur(3px)}
#adminDialog h2,#exportAsk h2{margin:0 0 4px;font-size:14px;font-weight:600}
#adminDialog .dim,#exportAsk .dim{margin:0 0 12px;font-size:11px;color:var(--fg-dim)}
#adminDialog label{display:block;font-size:11px;color:var(--fg-dim);margin-bottom:9px}
#adminDialog input{display:block;width:100%;margin-top:4px;padding:6px 8px;font:inherit;font-size:12px;
  color:var(--fg);background:rgba(255,255,255,.04);border:1px solid var(--line);border-radius:2px}
#adminDialog input:focus{outline:none;border-color:var(--climb)}
#adminMsg{min-height:14px;margin:0 0 10px;font-size:11px;color:var(--climb)}
#adminDialog .seg,#exportAsk .seg{padding:7px 4px}

/* Nízké okno (rámec 3f): hlavička na jeden řádek, popisky exportu vlevo
   od tlačítek, souhrn ve dvou řádcích. Hlavička a patička drží, střed
   se stlačí. */
/* Do buildu 127 tu panel od 640 px směl až ke spodnímu okraji (100 % − 24 px)
   a překryl levý konec časové osy; od buildu 128 drží rezervu 96 px vždy —
   osa přes celou šířku má přednost, v nízkém okně panel raději scrolluje. */
@media (max-height:640px){
  .grp{margin-bottom:6px}
  .switchRow .switchText{font-size:11px}
  #panelFoot{padding:10px 18px}
}

/* ---- mobil: do 720 px šířky OKNA (ne zařízení) ------------------------
   Desktopová pravidla výš platí dál; tady se přepisuje jen rozvržení:
   panel ukotvený dole jako proužek (úchyt + patička s Exportovat),
   po rozbalení nejvýš 2/3 výšky a tělo scrolluje; HUD (statistiky,
   posuvník, atribuce) jde NAHORU, aby ho rozbalený panel nepřekrýval.
   Hláška o prostoru pod HUD, odkaz Admin nad ním. */
#panelHandle{display:none}
@media (max-width:720px){
  /* 72vh (build 128): rozbalený veřejný panel bez posuvníku v rámu 390×844 */
  #panel{top:auto;bottom:8px;left:8px;right:8px;width:auto;max-height:72vh;
    transition:none;border-radius:8px 8px 6px 6px}
  #panelHandle{display:block;flex:none;width:100%;height:36px;padding:0;border:0;background:transparent;cursor:pointer;
    touch-action:none}
  #panelHandle i{display:block;width:40px;height:4px;margin:7px auto 0;border-radius:2px;background:var(--fg-dim);opacity:.7}
  #panelHandle[aria-expanded=true] i{background:var(--climb);opacity:1}
  /* popisek úchytu (build 140): co je pod ním, a že se dá vytáhnout */
  #panelHandle span{display:block;margin-top:5px;font-family:"IBM Plex Mono",monospace;font-size:10.5px;letter-spacing:.1em;
    text-transform:uppercase;color:var(--climb);line-height:1}
  #panelHandle .hOpen,#panelHandle[aria-expanded=true] .hClosed{display:none}
  #panelHandle[aria-expanded=true] .hOpen{display:block;color:var(--fg-dim)}
  /* pořadí: úchyt, patička (Exportovat vidět i sbalené), tělo */
  #panelFoot{order:1;border-top:0;border-bottom:1px solid var(--line);padding:6px 14px 8px}
  #panelBody{order:2;padding:0 14px 8px}
  #panel:not(.open) #panelBody{display:none}
  #panel.open #panelBody{display:block}
  #panelFoot .footRow #exportBtn{padding:9px 18px}
  #panelOpen{display:none !important}
  /* HUD nahoru */
  #hud{top:0;bottom:auto;padding:22px 12px 8px;gap:6px;
    background:linear-gradient(to bottom, rgba(13,21,25,.88), rgba(13,21,25,0))}
  #metrics{gap:6px;justify-content:space-between;flex-wrap:nowrap}
  .metric{min-width:0;flex:1;text-align:left}
  .metric .label{font-size:9px;letter-spacing:.02em;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
  .metric .value{font-size:17px}
  .metric .unit{font-size:10px;margin-left:2px}
  #scrubRow{gap:8px}
  #timeLabel{font-size:10.5px}
  .rangeHandle{width:16px;height:28px;margin:-14px 0 0 -8px}
  .rangeHandle::before{inset:-10px -14px}
  .rangeHandle::after{left:6px;top:7px;height:14px}
  #attrib{justify-content:flex-start}
  #crossing{top:112px;font-size:13px;padding:6px 10px;max-width:calc(100% - 24px);white-space:normal;text-align:center}
  #adminLink{top:4px;right:8px;font-size:9px;padding:2px 5px}
  #fps{top:auto;bottom:calc(66vh + 14px);right:8px}
}

@media (prefers-reduced-motion:reduce){*{transition:none !important}}

/* ---- průvodce novým letem (wireframe Claude Design) ---------------- */
/* Nad scénou i nad #boot (z-index 60 > 50), ať jde soubor vybrat už
   během načítání podkladů. Během exportu se neotevírá (wizard.js).
   Barvy a písmo jsou z panelu, ne modrá z wireframu. */
#wizard{position:absolute;inset:0;z-index:60;display:flex;align-items:center;justify-content:center;
  background:rgba(13,21,25,.88);backdrop-filter:blur(6px);padding:16px}
#wizard[hidden]{display:none}
/* Oba kroky mají STEJNOU výšku okna (build 101): kroky leží v jedné
   buňce mřížky přes sebe a skrytý krok se jen zneviditelní, ne vyřadí
   z rozvržení, takže výšku karty vždycky určuje ten vyšší z nich —
   v každé šířce okna, i na mobilu, bez měření a bez pevného čísla.
   Do buildu 100 byl krok 1 vyšší a okno při přechodu poskočilo. */
.wizCard{width:min(900px,100%);max-height:100%;display:flex;flex-direction:column;background:#111a1f;
  border:1px solid var(--line);border-radius:4px;box-shadow:0 20px 60px rgba(0,0,0,.5);overflow:hidden}
.wizSteps{display:grid;grid-template-columns:100%;min-height:0;flex:1 1 auto}
.wizSteps>.wizStep{grid-area:1/1;min-height:0}
.wizHead{display:flex;align-items:center;gap:16px;padding:12px 18px;border-bottom:1px solid var(--line);flex:none}
.wizBrand{font-family:"IBM Plex Mono",monospace;font-size:11px;letter-spacing:.14em;color:var(--fg);display:flex;align-items:center;gap:12px;min-width:0}
.wizCrumb{letter-spacing:0;color:var(--fg-dim);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.wizCrumb:not(:empty)::before{content:"|";margin-right:12px;color:var(--line)}
.wizProgress{margin-left:auto;display:flex;align-items:center;gap:10px;font-family:"IBM Plex Mono",monospace;font-size:10px;
  letter-spacing:.1em;color:var(--fg-dim);flex:none}
.wizBar{width:56px;height:2px;background:rgba(232,237,239,.14);border-radius:1px;overflow:hidden}
.wizBar i{display:block;height:100%;width:50%;background:var(--climb)}
.wizStep{padding:18px 18px 16px;overflow:auto;display:flex;flex-direction:column;gap:12px}
/* Skrytý krok zůstává v rozvržení (viz .wizSteps), jen se zneviditelní.
   PAST: visibility se dědí, ale potomek s vlastním visibility:visible
   ji přebije — štítek VYBRÁNO ✓ vybrané karty modelu (.wizModel .wizTag)
   tak prosvítal z kroku 2 do kroku 1, na mobilu přes podtitul (build 101).
   Proto pravidlo i pro všechny potomky, s vyšší specificitou. */
.wizStep[hidden],.wizStep[hidden] *{visibility:hidden !important}
.wizStep[hidden]{pointer-events:none;overflow:hidden}
.wizTitle{font-size:17px;font-weight:600;margin:0}
.wizSub{font-size:11.5px;color:var(--fg-dim);margin:2px 0 0}
.wizTitleRow{display:flex;align-items:flex-start;justify-content:space-between;gap:12px}
.wizTag{font-family:"IBM Plex Mono",monospace;font-size:10px;letter-spacing:.1em;text-transform:uppercase;color:var(--fg-dim);white-space:nowrap}
.wizTag.on{color:var(--climb)}
.wizDim{color:var(--fg-dim);font-size:11px;line-height:1.5}
.wizMono{font-family:"IBM Plex Mono",monospace;font-size:11px}
.wizError{color:var(--climb)}
.wizError:empty{display:none}
.wizWarn{color:#e0c07a;margin-top:6px;line-height:1.45}
.wizWarn:empty{display:none}
/* ---- krok 1 (build 153, wireframe skyvento-krok1-v2) -----------------
   Hledání FR24 nahoře, soubor jako pruh pod ním. Roletka (.wizFold) animuje
   VÝŠKU přes grid-template-rows 0fr ↔ 1fr, ne přes max-height: obsah má
   přirozenou výšku a přechod sedí na ni, bez odhadovaného stropu a bez
   zpoždění na konci. Zavřená roletka navíc zprůhlední a sjede o 22 px dolů. */
.wizFold{display:grid;grid-template-rows:1fr;opacity:1;transform:none;
  transition:grid-template-rows .45s cubic-bezier(.4,0,.2,1),opacity .3s ease,transform .45s cubic-bezier(.4,0,.2,1)}
.wizFold>div{overflow:hidden;min-height:0}
.wizFold.closed{grid-template-rows:0fr;opacity:0;transform:translateY(22px);pointer-events:none}
.wizFold.closed>div{visibility:hidden;transition:visibility 0s .45s}   /* zavřené prvky nejdou tabulátorem */
#wizResults{transition:grid-template-rows .5s cubic-bezier(.2,.7,.2,1),opacity .3s ease}
#wizResults.closed{transform:none}
#wizAlertFold{transition:grid-template-rows .35s ease,opacity .25s ease}
#wizAlertFold.closed{transform:none}
.wizAlert{border-left:2px solid #d98b6a;padding:3px 0 3px 12px;margin-bottom:14px}
.wizAlert b{display:block;font-size:13px;font-weight:600;color:#d98b6a;margin-bottom:3px}
.wizAlert p{margin:0;font-size:12px;color:var(--fg-dim);line-height:1.55}
.wizSearch{transition:opacity .2s}
.wizForm{display:grid;grid-template-columns:1.7fr 1fr auto;gap:8px;align-items:end}
.wizForm label{display:flex;flex-direction:column;gap:5px;font-size:11.5px;color:var(--fg-dim)}
.wizForm input{font-family:"IBM Plex Mono",monospace;font-size:13px;color:var(--fg);background:rgba(13,21,25,.6);
  border:1px solid var(--line);border-radius:2px;padding:0 10px;height:36px;color-scheme:dark;min-width:0;width:100%}
.wizForm input::placeholder{color:#5f6b75}
.wizForm input:focus{outline:none;border-color:var(--climb)}
.wizForm .wizBtn{height:36px;padding:0 16px;font-size:12.5px}
.wizStep1[data-fr24=zero] .wizForm input{border-color:var(--climb)}
.wizShort{display:none}
.wizHintLine{display:flex;gap:10px;align-items:baseline;margin-top:8px;font-size:11.5px;color:var(--fg-dim);line-height:1.5}
.wizHintLine .wizTag{margin-left:auto}
.wizStep1[data-fr24=off] .wizForm{opacity:.45;pointer-events:none}
.wizStep1[data-fr24=off] #wizFr24Hint{color:var(--climb)}
/* soubor načtený nebo přetahovaný: hledání se ztlumí, ale zůstane použitelné
   (najitý let soubor nahradí) — při najetí nebo fokusu se vrátí */
.wizStep1[data-file=loaded] .wizSearch:not(:focus-within):not(:hover),.wizStep1[data-drag] .wizSearch{opacity:.4}
.wizOr{display:flex;align-items:center;gap:12px;color:var(--fg-dim);font-size:11.5px;margin:16px 0}
.wizOr::before,.wizOr::after{content:"";height:1px;flex:1;background:var(--line)}
.wizStep1[data-drag] .wizOr{opacity:.4}
/* pruh se souborem: prázdný / přetahovaný (data-drag) / načtený (karta) */
.wizStrip{display:flex;align-items:center;gap:14px;padding:13px 14px;border:1px dashed rgba(232,237,239,.2);border-radius:3px;cursor:pointer;
  transition:padding .2s,border-color .2s,background .2s}
.wizStrip:hover{border-color:var(--fg-dim)}
.wizStripIcon{width:36px;height:36px;flex:none;display:grid;place-items:center;border:1px solid var(--line);border-radius:3px;color:var(--fg-dim)}
.wizStripIcon svg{width:17px;height:17px}
.wizStripIcon .down,.wizOver{display:none}
.wizStripText{display:flex;flex-direction:column;gap:2px;min-width:0}
.wizStripText b{font-size:13px;font-weight:600}
.wizStripText small{font-size:11.5px;color:var(--fg-dim)}
.wizStrip .wizBtn{margin-left:auto}
.wizStep1[data-drag] .wizStrip{border-style:solid;border-color:var(--climb);background:rgba(232,163,61,.06);padding:26px 14px}
.wizStep1[data-drag] .wizStripIcon{border-color:var(--climb);color:var(--climb)}
.wizStep1[data-drag] .wizStripIcon .up,.wizStep1[data-drag] .wizIdle,.wizStep1[data-drag] .wizStrip .wizBtn{display:none}
.wizStep1[data-drag] .wizStripIcon .down,.wizStep1[data-drag] .wizOver{display:block}
.wizFileIcon{width:34px;height:34px;flex:none;display:grid;place-items:center;border:1px solid var(--line);border-radius:3px;
  font-family:"IBM Plex Mono",monospace;font-size:9px;letter-spacing:.06em;color:var(--fg-dim)}
.wizFileCard{display:none;border:1px solid var(--climb);background:rgba(232,163,61,.06);border-radius:3px;padding:12px 14px;flex-direction:column;gap:10px}
#wizPanelFile[data-state=loaded] .wizStrip{display:none}
#wizPanelFile[data-state=loaded] .wizFileCard{display:flex}
.wizStep1[data-drag] #wizPanelFile .wizStrip{display:flex}
.wizStep1[data-drag] #wizPanelFile .wizFileCard{display:none}
.wizFileRow{display:flex;align-items:center;gap:10px}
.wizFileRow>div:nth-child(2){flex:1;min-width:0}
.wizFileName{font-size:12.5px;font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.wizLink{text-decoration:underline;text-underline-offset:3px;min-height:0;align-self:center;flex:none}
.wizStats{display:grid;grid-template-columns:repeat(3,1fr);gap:10px;padding-top:10px;border-top:1px solid var(--line)}
.wizStatLabel{font-size:9.5px;letter-spacing:.08em;text-transform:uppercase;color:var(--fg-dim);margin-bottom:3px}
.wizStatValue{font-family:"IBM Plex Mono",monospace;font-size:15px;font-weight:600;font-variant-numeric:tabular-nums}
.wizStatValue small{font-size:10px;font-weight:400;color:var(--fg-dim);margin-left:3px}
#wizFileError{margin-top:8px}
/* výsledky hledání: lety jeden po druhém (zástupné řádky od buildu 154 nejsou,
   blok se otevírá až s odpovědí) */
.wizRes{margin-top:14px;border:1px solid var(--climb);border-radius:3px;padding:12px 14px}
.wizResHead{display:flex;align-items:baseline;gap:10px;font-size:13px;margin-bottom:10px}
.wizResHead b{font-family:"IBM Plex Mono",monospace;font-weight:600}
.wizResHead .wizDim{font-size:12px}
.wizResHead .wizLink{margin-left:auto}
.wizStep1[data-fr24=busy] .wizFlights{opacity:.4;pointer-events:none}
.wizFlights{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:6px;max-height:212px;overflow-y:auto}
.wizFlights button{width:100%;display:grid;grid-template-columns:52px 1fr auto;gap:10px;align-items:center;text-align:left;
  font-family:inherit;font-size:12.5px;color:var(--fg);background:transparent;border:1px solid var(--line);border-radius:2px;padding:0 10px;height:35px;cursor:pointer}
.wizFlights button:hover{border-color:var(--fg-dim)}
.wizFlights button span:first-child{font-family:"IBM Plex Mono",monospace;color:var(--fg-dim)}
.wizFlights button .dur{color:var(--fg-dim);font-size:11.5px}
.wizFlights button[aria-pressed=true]{border-color:var(--climb);background:rgba(232,163,61,.06)}
.wizFlights button[aria-pressed=true] span:first-child{color:var(--climb)}
.wizFlights li.in{animation:wizRowIn .34s cubic-bezier(.2,.7,.2,1) both}
@keyframes wizRowIn{from{opacity:0;transform:translateY(-8px)}to{opacity:1;transform:none}}
.wizSelected{display:flex;gap:10px;align-items:baseline;margin-top:10px;padding-top:10px;border-top:1px solid var(--line)}
.wizSelected[hidden]{display:none}
.wizSelected .wizTag{color:var(--climb)}
.wizSelected .wizMono{color:var(--fg-dim);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}
.wizUsage{margin-top:4px}
.wizUsage:empty{display:none}
/* bez pohybu: jen přepnutí stavů */
@media (prefers-reduced-motion:reduce){
  .wizFold,#wizResults,#wizAlertFold,.wizStrip,.wizSearch{transition:none}
  .wizFold.closed>div{transition:none}
  .wizFlights li.in{animation:none}
}
/* patička */
.wizFoot{display:flex;align-items:center;justify-content:space-between;gap:12px;margin-top:auto;padding-top:12px;border-top:1px solid var(--line)}
.wizFoot>.wizBtn.primary{margin-left:auto}
.wizHint{text-align:center;flex:1 1 auto}
.wizHint:empty{display:none}
.wizBtn{padding:7px 12px;font-family:inherit;font-size:11.5px;font-weight:500;color:var(--fg);
  background:transparent;border:1px solid var(--line);border-radius:2px;cursor:pointer;white-space:nowrap}
.wizBtn:hover{border-color:var(--fg)}
.wizBtn.small{padding:5px 9px;font-size:11px}
.wizBtn.primary{background:var(--fg);color:var(--ink);border-color:var(--fg)}
.wizBtn.primary:hover{background:var(--neutral)}
.wizBtn:disabled{opacity:.4;cursor:default;border-color:var(--line)}
.wizBtn[hidden]{display:none}
/* krok 2: galerie — VŽDY BEZ POSUVNÍKU a bez vlivu na výšku karty (build 121).
   Výšku karty průvodce určuje krok 1 (.wizSteps, build 101); galerie
   má flex-basis 0, takže krok 2 do výšky nic nepřidá, a zabere jen to,
   co v kroku zbývá. Čtyři sloupce; do čtyř modelů jeden řádek s kartami
   v přirozené výšce (obrázek 4:3), od pěti dva řádky, od devíti tři —
   řádky se dělí rovným dílem a obrázek se ZKRÁTÍ (flex-shrink, min-height
   0, object-fit: cover ořízne shora a zdola), zatímco název a kolečka
   drží svou výšku. Počet řádků řeší :has() podle počtu dětí, bez JS
   a bez měření. Rendery náhledů mají model v y 175–607 ze 750 (23–81 %),
   takže ořez na 5:3 u dvou řádků nic z letadla neuřízne. */
.wizGallery{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));grid-auto-rows:max-content;align-content:start;
  gap:12px;flex:1 1 0px;min-height:0}
.wizGallery:has(> :nth-child(5)){grid-auto-rows:minmax(0,1fr);align-content:stretch}
.wizModel{position:relative;border:1px solid var(--line);border-radius:3px;padding:10px;cursor:pointer;background:transparent;
  color:var(--fg);text-align:left;font-family:inherit;display:flex;flex-direction:column;gap:2px;min-height:0;overflow:hidden}
.wizModel:hover{border-color:var(--fg)}
.wizModel[aria-pressed=true]{border-color:var(--climb);box-shadow:0 0 0 1px var(--climb)}
.wizModel .wizTag{position:absolute;left:10px;top:10px;z-index:2;visibility:hidden}
.wizModel[aria-pressed=true] .wizTag{visibility:visible;color:var(--climb)}
.wizModel .name{font-size:12.5px;font-weight:600;margin-top:6px;flex:none;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.wizView{position:relative;width:100%;aspect-ratio:4/3;flex:0 1 auto;min-height:0;border-radius:2px;overflow:hidden;background:#0d1519}
.wizView img{position:absolute;inset:0;z-index:1;width:100%;height:100%;object-fit:cover;margin:0}
.wizView img[hidden]{display:none}
/* barva livery: kolečka uvnitř dlaždice pod názvem (wireframe sada 3).
   Vybraná barva má prstenec — u vybraného modelu akcentní, u nevybraného
   šedý, aby bylo poznat „barva nastavená, ale letadlo jiné".
   Od buildu 121 je popisek BARVA vlevo od koleček v jednom řádku (užší
   karty ve čtyřech sloupcích, ušetřený řádek jde obrázku). */
.wizLivery{margin-top:6px;display:flex;align-items:center;gap:8px;flex:none}
.wizLiveryLabel{font-family:"IBM Plex Mono",monospace;font-size:9px;letter-spacing:.12em;
  text-transform:uppercase;color:var(--fg-dim);flex:none}
.wizLiveryRow{display:flex;gap:6px}
.wizDot{width:20px;height:20px;border-radius:50%;cursor:pointer;flex:none;
  border:1px solid rgba(13,21,25,.55);box-shadow:0 1px 2px rgba(0,0,0,.35);
  outline:2px solid transparent;outline-offset:2px;transition:outline-color .12s}
.wizDot.on{outline-color:#4a5563}
.wizModel[aria-pressed=true] .wizDot.on{outline-color:var(--climb)}
.wizDot:focus-visible{outline-color:var(--fg)}
@media (max-width:720px){
  .wizDot{width:20px;height:20px}
  .wizLiveryRow{gap:6px}
  .wizLiveryLabel{display:none}   /* na 2 sloupce po ~140 px se popisek ke kolečkům nevejde */
}

  overflow:hidden;background:rgba(232,237,239,.10)}
  animation:wizBar 1.1s ease-in-out infinite}
  letter-spacing:.1em;color:var(--fg-dim)}
body.exporting #wizard{display:none}
/* úzké okno: přepínač místo dvou panelů, galerie v jednom sloupci, tlačítka na šířku */
@media (max-width:720px){
  /* mobil: dva sloupce, řádky přibývají po dvou. Tady galerie VÁŽÍ
     (flex-basis auto): krok 1 na mobilu mění výšku podle stavu (prázdný
     562 px, s vybraným souborem 480 px v rámu 390×844) a bez váhy kroku 2
     by karta při výběru souboru poskočila. Krok 2 s galerií v přirozené
     výšce je vyšší než obě polohy kroku 1, takže výšku karty určuje on
     a je stálá; strop je okno (.wizCard max-height) — když se řádky
     nevejdou (šest až osm modelů), dělí se rovným dílem a obrázky se
     krátí stejně jako na desktopu, posuvník nevznikne. */
  .wizGallery{grid-template-columns:repeat(2,minmax(0,1fr));flex:1 1 auto}
  .wizGallery:has(> :nth-child(3)){grid-auto-rows:minmax(0,1fr);align-content:stretch}
  .wizFoot{flex-direction:column-reverse;align-items:stretch}
  .wizHint{margin-left:0;text-align:center}
  .wizFoot .wizBtn{width:100%}
  .wizCrumb{display:none}
}

/* Kokpit: plátno s přístroji přes scénu, tentýž renderer jako export.
   HUD zůstává, kde je (na mobilu nahoře, build 85); statistiky se
   schovají, nahrazují je přístroje. Build 108 posouval HUD dolů a schovával
   panel — na mobilu to překrylo časovou osu, proto pryč (build 109). */
#cockpit{position:absolute;inset:0;width:100%;height:100%;pointer-events:none;z-index:2}
#cockpit[hidden]{display:none}
body.cockpitMode #metrics{display:none}
body.cockpitMode #hud{background:transparent;z-index:3}
#cesium{position:relative}

#exportAsk{width:340px}
#exportAsk .row{display:flex;gap:6px}
#exportAsk .row .seg{flex:1}
#exportAsk #exportAskGo{background:rgba(232,163,61,.14);border-color:var(--climb);color:var(--fg);font-weight:600}

/* Úvod: nejdřív výsledek a cesta bez vlastních dat. */
#wizard[data-step="0"] .wizCard{width:min(1100px,100%)}
#wizard[data-step="0"] .wizProgress{display:none}
#wizard[data-step="0"] .wizStep[hidden]{display:none}
.wizWelcome[hidden]{display:none}
.wizWelcome{display:grid;grid-template-columns:1fr 1fr;gap:32px;padding:38px}
.welcomeCopy{align-self:center}
.welcomeCopy h1{font-size:clamp(30px,4vw,46px);line-height:1.12;letter-spacing:-.035em;margin:0 0 16px}
.welcomeCopy p{font-size:15px;line-height:1.6;color:#b2c0c6;margin:0 0 22px;max-width:420px}
.welcomeActions{display:flex;flex-direction:column;align-items:stretch;gap:10px;max-width:320px}
.welcomeActions .wizBtn{min-height:48px;font-size:14px;text-align:center}
.welcomeCopy .wizError{color:var(--climb);margin-top:12px}
.welcomeCopy .wizError:empty{display:none}
.welcomePreview{margin:0;align-self:center;min-width:0}
.welcomePreview img{display:block;width:100%;height:auto;border:1px solid var(--line);border-radius:8px}
.welcomePreview figcaption{font-size:11px;color:var(--fg-dim);line-height:1.5;margin-top:10px}
.welcomeHow{grid-column:1/-1;display:grid;grid-template-columns:repeat(3,1fr);gap:24px;list-style:none;padding:24px 0 0;margin:0;border-top:1px solid var(--line)}
.welcomeHow b{display:block;font-size:13px;font-weight:500;margin-bottom:6px}
.welcomeHow span{font-size:12px;line-height:1.5;color:var(--fg-dim)}
.wizTextBtn{background:none;border:0;padding:0;color:var(--fg-dim);font:inherit;font-size:12px;cursor:pointer;align-self:flex-start;min-height:28px}
.wizTextBtn:hover{color:var(--fg)}
.wizSub{font-size:13px;line-height:1.5}
.wizBtn:focus-visible,.wizTextBtn:focus-visible{outline:2px solid var(--climb);outline-offset:4px}
#demoNotice{padding:14px 16px;border-bottom:1px solid var(--line);background:rgba(232,163,61,.08)}
#demoNotice b{display:block;font-size:12px;margin-bottom:10px;color:var(--climb)}
#demoNotice .wizBtn{width:100%}
@media(max-width:720px){
  .wizWelcome{grid-template-columns:1fr;gap:22px;padding:24px}
  .welcomeCopy h1{font-size:34px}
  .welcomeCopy p{font-size:14px}
  .welcomeActions{max-width:none}
  .welcomePreview{grid-row:2}
  .welcomeHow{grid-template-columns:1fr;gap:16px;padding-top:20px}
  .welcomePreview img{max-height:210px;object-fit:cover}
}

.welcomeCopy h1:focus,.wizTitle:focus{outline:none}
.welcomeActions .wizBtn.primary{background:var(--climb);border-color:var(--climb);color:var(--ink)}
.welcomeActions .wizBtn.primary:hover{background:#f4b654}

/* Krok 1: v patičce jen Pokračovat (neaktivní, dokud není let), padding karty.
   Krok 2 v kroku 1 NEZMIZÍ z rozvržení (build 153 vrátil build 101): oba
   kroky leží v jedné buňce a karta má výšku toho vyššího, takže při
   přechodu mezi nimi neposkočí. Mizí jen úvod (.wizWelcome[hidden]). */
/* PAST: bez podmínky na #wizard[data-step]. Krok 1 leží v kroku 2 pod
   ním v téže buňce a s výchozím .wizStep (padding 18, gap 12) by tam byl
   o 64 px vyšší — karta v kroku 2 poskočila (změřeno 465 → 529 px). */
.wizStep.wizStep1{padding:24px 26px 18px;gap:0}
.wizStep1>.wizTitle{margin:10px 0 18px}
.wizStep1>.wizFoot{margin-top:auto;padding-top:14px}
/* odstup obsahu od patičky nese obsah roletky, ne roletka: zavřená tak měří 0 */
#wizPanelFile{padding-bottom:18px}
.wizRes{margin-bottom:18px}
@media(max-width:720px){
  .wizStep.wizStep1{padding:18px 18px 14px}
  .wizForm{grid-template-columns:1fr 1fr}
  .wizForm .wizBtn{grid-column:1/-1}
  .wizLong{display:none}
  .wizShort{display:inline}
  .wizStrip{flex-wrap:wrap}
  .wizStrip .wizBtn{margin-left:0;width:100%;height:36px}
  .wizResHead{flex-wrap:wrap}
  .wizSelected .wizMono{white-space:normal}
}

/* Návrh letadla: dialog nemění velikost galerie ani zvolený model. */
#aircraftRequest{box-sizing:border-box;width:min(440px,calc(100vw - 32px));max-height:calc(100dvh - 32px);overflow:auto;padding:24px;border:1px solid var(--line);border-radius:8px;background:#111b20;color:var(--fg)}
#aircraftRequest::backdrop{background:rgba(0,0,0,.72)}
#aircraftRequest form{display:flex;flex-direction:column;gap:16px}
#aircraftRequest h2,#aircraftRequest p{margin:0}
#aircraftRequest h2{font-size:21px}
#aircraftRequest label{display:flex;flex-direction:column;gap:6px;font-size:13px}
#aircraftRequest input{box-sizing:border-box;width:100%;padding:12px;border:1px solid var(--line);border-radius:3px;background:#0d1519;color:var(--fg);font:inherit}
#aircraftRequest input:focus-visible{outline:2px solid var(--climb);outline-offset:2px}
.requestActions{display:flex;justify-content:flex-end;gap:8px;flex-wrap:wrap}
.requestTrap{position:absolute;left:-10000px;width:1px;height:1px;overflow:hidden}
#aircraftRequestStatus{font-size:13px;line-height:1.5}
