/* JetStream Live - shared stylesheet. Cached by the browser across every page. */
:root{
  --bg:#0a0420;--bg2:#1a0b3a;--card:rgba(40,20,80,0.72);
  --blue:#3B82F6;--cyan:#22D3EE;--gold:#FBBF24;
  --green:#34D399;--pink:#F472B6;--purple:#A855F7;--orange:#FB923C;
  --text:#F5F0FF;--text2:#B8A5D8;
  --border:rgba(168,85,247,0.28);--border2:rgba(34,211,238,0.38);

  /* ===== DESIGN SYSTEM TOKENS ===== */
  /* Type scale (1.250 major-third, fluid) */
  --fs-xs:clamp(11px,0.7vw,12px);
  --fs-sm:clamp(12px,0.85vw,13px);
  --fs-base:clamp(14px,1vw,15px);
  --fs-md:clamp(16px,1.2vw,18px);
  --fs-lg:clamp(20px,1.6vw,24px);
  --fs-xl:clamp(26px,2.4vw,34px);
  --fs-2xl:clamp(32px,4vw,48px);
  --fs-3xl:clamp(40px,6vw,68px);
  --lh-tight:1.15;--lh-snug:1.35;--lh-normal:1.6;
  /* Spacing scale (8px base) */
  --sp-1:4px;--sp-2:8px;--sp-3:12px;--sp-4:16px;--sp-5:24px;--sp-6:32px;--sp-7:48px;--sp-8:64px;--sp-9:96px;
  /* Radii */
  --r-sm:8px;--r-md:12px;--r-lg:16px;--r-xl:22px;--r-pill:999px;
  /* Elevation / shadows */
  --sh-1:0 2px 10px rgba(0,0,0,0.25);
  --sh-2:0 8px 28px rgba(0,0,0,0.35);
  --sh-3:0 18px 50px rgba(0,0,0,0.45);
  --glow:0 0 22px rgba(0,229,255,0.28);
  /* Motion */
  --ease:cubic-bezier(.2,.7,.3,1);
  --t-fast:.16s;--t-med:.28s;--t-slow:.55s;
  /* Layout */
  --container:1240px;--gutter:clamp(16px,3vw,28px);
}
*{margin:0;padding:0;box-sizing:border-box}
html{scroll-behavior:smooth}
body{background:var(--bg);color:var(--text);font-family:'Exo 2',sans-serif;overflow-x:hidden}
::-webkit-scrollbar{width:4px;background:var(--bg)}
::-webkit-scrollbar-thumb{background:var(--blue);border-radius:2px}
body::before{content:'';position:fixed;inset:0;
  background:radial-gradient(ellipse at 20% 20%,rgba(30,144,255,0.05) 0%,transparent 50%),
             radial-gradient(ellipse at 80% 80%,rgba(0,229,255,0.04) 0%,transparent 50%);
  pointer-events:none;z-index:0}

/* PASSPORT ANIMATION */
@keyframes gspin{
  0%{filter:drop-shadow(0 0 16px rgba(255,215,0,0.5)) hue-rotate(0deg)}
  100%{filter:drop-shadow(0 0 16px rgba(255,215,0,0.5)) hue-rotate(360deg)}
}
@keyframes pulse{0%,100%{opacity:1;transform:scale(1)}50%{opacity:.5;transform:scale(1.4)}}
@keyframes ringA{0%{opacity:0;transform:translate(-50%,-50%) scale(.85)}40%{opacity:1}100%{opacity:0;transform:translate(-50%,-50%) scale(1.1)}}
@keyframes spin{to{transform:rotate(360deg)}}
@keyframes tick{0%{transform:translateX(100vw)}100%{transform:translateX(-100%)}}
@keyframes hscroll{0%,100%{transform:translateX(-50%) translateY(0)}50%{transform:translateX(-50%) translateY(8px)}}
@keyframes stampIn{0%{opacity:0;transform:rotate(-15deg) scale(0.3)}60%{transform:rotate(3deg) scale(1.1)}100%{opacity:1;transform:rotate(-5deg) scale(1)}}
@keyframes stampIn2{0%{opacity:0;transform:rotate(20deg) scale(0.3)}60%{transform:rotate(-3deg) scale(1.1)}100%{opacity:1;transform:rotate(8deg) scale(1)}}

/* ===== NAV ===== */
nav{position:fixed;top:0;left:0;right:0;z-index:1000;height:58px;
  background:rgba(1,11,26,0.96);backdrop-filter:blur(20px);
  border-bottom:1px solid var(--border);
  display:flex;align-items:center;padding:0 16px;gap:8px}
.nav-logo{display:flex;align-items:center;gap:9px;font-family:'Orbitron',monospace;font-weight:900;font-size:15px;
  color:var(--text);
  letter-spacing:2px;white-space:nowrap;text-decoration:none;flex-shrink:0}
.nav-logo img{width:28px;height:28px;border-radius:8px;flex-shrink:0}
.nav-links{display:flex;align-items:center;gap:2px;flex:1;overflow-x:auto;scrollbar-width:none}
.nav-links::-webkit-scrollbar{display:none}
.nav-btn{background:transparent;border:none;color:var(--text2);font-family:'Exo 2',sans-serif;font-size:11px;font-weight:600;letter-spacing:.5px;text-transform:uppercase;cursor:pointer;padding:6px 9px;border-radius:6px;transition:all .2s;white-space:nowrap}
.nav-btn:hover,.nav-btn.active{color:var(--cyan);background:rgba(0,229,255,0.1)}
.nav-right{display:flex;align-items:center;gap:8px;margin-left:auto;flex-shrink:0}
.live-pill{display:flex;align-items:center;gap:6px;background:rgba(0,255,127,0.1);border:1px solid rgba(0,255,127,0.3);padding:4px 10px;border-radius:20px}
.live-dot{width:7px;height:7px;border-radius:50%;background:var(--green);box-shadow:0 0 8px var(--green);animation:pulse 1.5s infinite}
.live-text{font-family:'JetBrains Mono',monospace;font-size:10px;color:var(--green);letter-spacing:1px}
.nav-user{display:none;align-items:center;gap:8px;background:rgba(30,144,255,0.12);border:1px solid rgba(30,144,255,0.3);padding:5px 12px;border-radius:20px;cursor:pointer}
.nav-user.show{display:flex}
.btn-signin{background:linear-gradient(135deg,var(--blue),var(--cyan));border:none;color:#fff;font-family:'Exo 2',sans-serif;font-weight:700;font-size:11px;padding:7px 16px;border-radius:20px;cursor:pointer;transition:all .2s}
.btn-getapp{display:inline-flex;align-items:center;gap:6px;background:transparent;
  border:1px solid var(--border2);color:var(--cyan);font-family:'Exo 2',sans-serif;
  font-weight:700;font-size:11px;letter-spacing:.5px;padding:6px 14px;border-radius:20px;
  cursor:pointer;text-decoration:none;white-space:nowrap;transition:all .2s}
.btn-getapp:hover{background:rgba(34,211,238,0.14);border-color:var(--cyan);transform:translateY(-1px)}
.btn-getapp .ga-short{display:none}
@media(max-width:640px){
  .btn-getapp{padding:6px 10px;gap:4px}
  .btn-getapp .ga-full{display:none}
  .btn-getapp .ga-short{display:inline}
}

/* ===== LOGIN MODAL ===== */
.modal-overlay{display:none;position:fixed;inset:0;background:#040b16;z-index:2000;align-items:center;justify-content:center;padding:20px;overflow-y:auto}
.modal-overlay.open{display:flex}
.modal{background:transparent;border:none;border-radius:0;padding:32px;width:100%;max-width:460px;position:relative;margin:auto}
.modal-close{position:absolute;top:14px;right:14px;background:transparent;border:none;color:var(--text2);font-size:20px;cursor:pointer;width:32px;height:32px;border-radius:50%;display:flex;align-items:center;justify-content:center;transition:all .2s}
.modal-close:hover{background:rgba(255,255,255,0.1)}
.modal-tabs{display:flex;background:rgba(255,255,255,0.06);border-radius:10px;padding:3px;margin-bottom:22px}
.modal-tab{flex:1;padding:9px;border:none;background:transparent;color:var(--text2);font-family:'Exo 2',sans-serif;font-size:13px;font-weight:600;border-radius:8px;cursor:pointer;transition:all .2s}
.modal-tab.active{background:linear-gradient(135deg,var(--blue),var(--cyan));color:#fff}
.modal-input{background:rgba(5,20,45,0.9);border:1px solid var(--border);color:var(--text);font-family:'Exo 2',sans-serif;font-size:14px;padding:12px 15px;border-radius:10px;outline:none;transition:border .2s;width:100%;display:block;margin-bottom:11px}
.modal-input:focus{border-color:var(--cyan)}
.modal-input::placeholder{color:var(--text2)}
.modal-submit{background:linear-gradient(135deg,var(--blue),var(--cyan));border:none;color:#fff;font-family:'Exo 2',sans-serif;font-weight:700;font-size:14px;padding:14px;border-radius:10px;cursor:pointer;width:100%;transition:all .2s;margin-top:4px}
.modal-submit:hover{transform:translateY(-1px);box-shadow:0 0 20px rgba(30,144,255,0.4)}
.msg-err{color:var(--pink);font-size:12px;text-align:center;margin-bottom:8px;display:none}
.msg-err.show{display:block}
.msg-ok{color:var(--green);font-size:12px;text-align:center;margin-bottom:8px;display:none}
.msg-ok.show{display:block}

/* ===== USER DROPDOWN ===== */
.user-dropdown{display:none;position:absolute;top:65px;right:16px;background:#0a1628;border:1px solid var(--border2);border-radius:12px;padding:8px;min-width:180px;z-index:500}
.user-dropdown.open{display:block}
.ud-item{display:flex;align-items:center;gap:10px;padding:9px 12px;border-radius:8px;cursor:pointer;transition:all .2s;font-size:13px}
.ud-item:hover{background:rgba(30,144,255,0.1);color:var(--cyan)}
.ud-divider{height:1px;background:var(--border);margin:4px 0}

/* ===== LAYOUT ===== */
section{position:relative;z-index:1;padding:80px 20px 60px;scroll-margin-top:92px}
.geo-banner{position:fixed;top:58px;left:0;right:0;z-index:999;display:flex;align-items:center;justify-content:center;gap:10px;padding:6px 42px 6px 16px;font-family:'Exo 2',sans-serif;font-size:12px;letter-spacing:.4px;color:var(--text);background:linear-gradient(90deg,rgba(59,130,246,0.18),rgba(34,211,238,0.18));border-bottom:1px solid var(--border2);backdrop-filter:blur(8px);text-align:center}
.geo-banner b{color:var(--cyan);font-weight:700}
.geo-banner .gb-x{position:absolute;right:12px;top:50%;transform:translateY(-50%);cursor:pointer;color:var(--text2);font-size:14px;line-height:1;background:none;border:none;padding:4px}
.geo-banner .gb-x:hover{color:var(--text)}
.geo-banner.hide{display:none}
.wrap{max-width:1240px;margin:0 auto}
.sec-head{text-align:center;margin-bottom:36px}
.sec-tag{display:inline-block;background:rgba(30,144,255,0.12);border:1px solid rgba(30,144,255,0.4);color:var(--cyan);font-family:'Orbitron',monospace;font-size:10px;letter-spacing:3px;padding:5px 14px;border-radius:20px;margin-bottom:12px;text-transform:uppercase}
.sec-title{font-family:'Orbitron',monospace;font-size:clamp(22px,4vw,40px);font-weight:900;line-height:1.15;margin-bottom:10px}
.sec-sub{color:var(--text2);font-size:15px;max-width:580px;margin:0 auto;line-height:1.65}
.cc-bar{max-width:760px;margin:0 auto 28px}
.cc-prog{height:9px;border-radius:20px;background:rgba(255,255,255,0.07);border:1px solid rgba(255,255,255,0.1);overflow:hidden}
.cc-fill{height:100%;width:0;background:linear-gradient(90deg,var(--blue),var(--cyan));transition:width .6s ease}
.cc-meta{display:flex;align-items:center;justify-content:space-between;margin-top:10px;font-family:'Share Tech Mono',monospace;font-size:12px;letter-spacing:1px;color:var(--text2)}
.cc-open{font-family:'Orbitron',monospace;font-size:11px;letter-spacing:2px;color:var(--cyan);text-decoration:none;border:1px solid rgba(34,211,238,0.4);padding:7px 14px;border-radius:8px;transition:all .2s}
.cc-open:hover{background:rgba(34,211,238,0.1);box-shadow:0 0 14px rgba(34,211,238,0.18)}
.cc-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(150px,1fr));gap:12px}
.cc-card{position:relative;border-radius:12px;padding:14px 12px;background:var(--card);border:1px solid rgba(255,255,255,0.08);display:flex;flex-direction:column;gap:6px;min-height:118px;transition:transform .2s}
.cc-card:hover{transform:translateY(-3px)}
.cc-card.locked{opacity:.34;filter:grayscale(.7)}
.cc-card .cc-tier{font-family:'Orbitron',monospace;font-size:8px;font-weight:700;letter-spacing:2px;text-transform:uppercase}
.cc-card h4{font-family:'Orbitron',monospace;font-size:13px;font-weight:700;line-height:1.15;color:var(--text);margin:0}
.cc-card .cc-sub{font-size:10px;color:var(--text2);letter-spacing:.4px}
.cc-card .cc-pwr{margin-top:auto;font-family:'Share Tech Mono',monospace;font-size:10px;letter-spacing:1px;color:var(--text2)}
.cc-card .cc-cnt{position:absolute;top:9px;right:9px;font-family:'Orbitron',monospace;font-weight:900;font-size:11px;padding:2px 7px;border-radius:20px;background:rgba(34,211,238,0.16);color:var(--cyan);border:1px solid rgba(34,211,238,0.5)}
.grad{background:linear-gradient(90deg,var(--blue),var(--cyan),var(--gold));-webkit-background-clip:text;-webkit-text-fill-color:transparent}
.grad-gold{background:linear-gradient(90deg,var(--gold),var(--orange));-webkit-background-clip:text;-webkit-text-fill-color:transparent}
.grad-pink{background:linear-gradient(90deg,var(--pink),var(--purple));-webkit-background-clip:text;-webkit-text-fill-color:transparent}
.grad-cyan{background:linear-gradient(90deg,var(--cyan),var(--blue));-webkit-background-clip:text;-webkit-text-fill-color:transparent}

/* CARDS */
.card{background:var(--card);backdrop-filter:blur(12px);border:1px solid var(--border);border-radius:14px;padding:20px;transition:all .3s;position:relative;overflow:hidden}
.card::before{content:'';position:absolute;inset:0;background:linear-gradient(135deg,rgba(30,144,255,0.04),transparent 60%);pointer-events:none}
.card:hover{border-color:rgba(0,229,255,0.4);transform:translateY(-2px);box-shadow:0 0 20px rgba(0,229,255,0.12)}
.card-gold{border-color:rgba(255,215,0,0.2)}.card-gold:hover{border-color:rgba(255,215,0,0.5);box-shadow:0 0 20px rgba(255,215,0,0.15)}
.card-green{border-color:rgba(0,255,127,0.2)}.card-green:hover{border-color:rgba(0,255,127,0.5);box-shadow:0 0 15px rgba(0,255,127,0.12)}
.card-pink{border-color:rgba(255,45,120,0.2)}.card-pink:hover{border-color:rgba(255,45,120,0.5)}
.card-purple{border-color:rgba(170,0,255,0.2)}.card-purple:hover{border-color:rgba(170,0,255,0.5)}
.g2{display:grid;grid-template-columns:1fr 1fr;gap:16px}
.g3{display:grid;grid-template-columns:repeat(3,1fr);gap:16px}
.g4{display:grid;grid-template-columns:repeat(4,1fr);gap:14px}
@media(max-width:900px){.g4{grid-template-columns:1fr 1fr}}
@media(max-width:700px){.g2,.g3{grid-template-columns:1fr}}
@media(max-width:500px){.g4{grid-template-columns:1fr}}
.btn{display:inline-flex;align-items:center;justify-content:center;gap:8px;border:none;cursor:pointer;font-family:'Exo 2',sans-serif;font-weight:700;font-size:14px;letter-spacing:.5px;border-radius:30px;padding:13px 28px;transition:all .3s}
.btn-blue{background:linear-gradient(135deg,var(--blue),var(--cyan));color:#fff;box-shadow:0 0 24px rgba(30,144,255,0.3)}
.btn-blue:hover{transform:translateY(-2px);box-shadow:0 0 40px rgba(30,144,255,0.5)}
.btn-outline{background:transparent;border:2px solid var(--cyan);color:var(--cyan)}
.btn-outline:hover{background:rgba(0,229,255,0.1);transform:translateY(-2px)}
.btn-purple{background:linear-gradient(135deg,var(--purple),var(--blue));color:#fff;box-shadow:0 0 18px rgba(170,0,255,0.25)}
.btn-sm{padding:9px 18px;font-size:12px;border-radius:8px}
.inp{background:rgba(5,20,45,0.8);border:1px solid var(--border);color:var(--text);font-family:'Exo 2',sans-serif;font-size:14px;padding:11px 15px;border-radius:10px;outline:none;transition:border .2s;width:100%}
.inp:focus{border-color:var(--cyan)}.inp::placeholder{color:var(--text2)}
.spinner{width:30px;height:30px;border:3px solid rgba(30,144,255,0.2);border-top-color:var(--blue);border-radius:50%;animation:spin .7s linear infinite;margin:18px auto}
.fade-up{opacity:1;transform:translateY(0);transition:all .55s ease}
.fade-up.vis{opacity:1;transform:translateY(0)}
.mono{font-family:'JetBrains Mono',monospace}
.orb{font-family:'Orbitron',monospace}
.tc-blue{color:var(--blue)}.tc-cyan{color:var(--cyan)}.tc-gold{color:var(--gold)}
.tc-green{color:var(--green)}.tc-pink{color:var(--pink)}.tc-muted{color:var(--text2)}
.f11{font-size:11px}.f12{font-size:12px}.f13{font-size:13px}.f14{font-size:14px}
.fw7{font-weight:700}.lh16{line-height:1.6}
.mt8{margin-top:8px}.mt12{margin-top:12px}.mt16{margin-top:16px}
.mb8{margin-bottom:8px}.mb12{margin-bottom:12px}.mb16{margin-bottom:16px}
.flex{display:flex}.fac{align-items:center}.fjc{justify-content:center}
.gap8{gap:8px}.gap12{gap:12px}.gap16{gap:16px}.fw{flex-wrap:wrap}

/* ===== HERO ===== */
#home{min-height:100vh;display:flex;flex-direction:column;align-items:center;justify-content:center;text-align:center;padding:80px 20px 40px;overflow:hidden}
.hero-rings{position:absolute;inset:0;overflow:hidden;pointer-events:none}
.ring{position:absolute;border-radius:50%;border:1px solid;top:50%;left:50%;transform:translate(-50%,-50%);animation:ringA 5s ease-out infinite}
.ring:nth-child(1){width:280px;height:280px;border-color:rgba(30,144,255,0.18);animation-delay:0s}
.ring:nth-child(2){width:480px;height:480px;border-color:rgba(0,229,255,0.12);animation-delay:1s}
.ring:nth-child(3){width:680px;height:680px;border-color:rgba(170,0,255,0.08);animation-delay:2s}
.ring:nth-child(4){width:880px;height:880px;border-color:rgba(30,144,255,0.05);animation-delay:3s}
.hero-content{position:relative;z-index:1;max-width:880px;margin:0 auto}
.hero-badge{display:inline-flex;align-items:center;gap:8px;background:rgba(0,229,255,0.08);border:1px solid rgba(0,229,255,0.3);padding:6px 18px;border-radius:30px;margin-bottom:22px}
.hero-badge span{font-family:'JetBrains Mono',monospace;font-size:11px;color:var(--cyan);letter-spacing:2px}
.hero-title{font-family:'Orbitron',monospace;font-weight:900;font-size:clamp(34px,8vw,86px);line-height:1.0;margin-bottom:6px}
.hero-title .l1{display:block;color:#fff}
.hero-title .l2{display:block;background:linear-gradient(90deg,var(--blue),var(--cyan),var(--gold));-webkit-background-clip:text;-webkit-text-fill-color:transparent}
.hero-sub{font-size:clamp(14px,2vw,17px);color:var(--text2);line-height:1.7;margin:14px auto 28px;max-width:600px}
.hero-btns{display:flex;gap:12px;justify-content:center;flex-wrap:wrap}
.hero-stats{display:flex;justify-content:center;gap:28px;margin-top:44px;flex-wrap:wrap}
.hs{text-align:center}
.hs-num{font-family:'Orbitron',monospace;font-size:clamp(18px,3vw,30px);font-weight:900}
.hs-lbl{font-size:11px;color:var(--text2);letter-spacing:1px;text-transform:uppercase;margin-top:3px}
.hero-scroll{position:absolute;bottom:28px;left:50%;transform:translateX(-50%);display:flex;flex-direction:column;align-items:center;gap:6px;opacity:.45;animation:hscroll 2s ease-in-out infinite}
.hero-scroll span{font-size:9px;letter-spacing:2px;color:var(--text2);text-transform:uppercase}

/* ===== MAP ===== */
#tracker{padding-top:80px}

.leaflet-container{background:#020916!important}
.map-bar{display:flex;align-items:center;gap:8px;margin-bottom:12px;flex-wrap:wrap}
.map-btn{background:var(--card);border:1px solid var(--border);color:var(--text2);font-family:'Exo 2',sans-serif;font-size:11px;font-weight:600;padding:7px 13px;border-radius:8px;cursor:pointer;transition:all .2s;display:flex;align-items:center;gap:5px}
.map-btn:hover,.map-btn.on{border-color:var(--cyan);color:var(--cyan);background:rgba(0,229,255,0.1)}
.map-stats{display:flex;gap:12px;margin-top:12px;flex-wrap:wrap}
.ms{display:flex;align-items:center;gap:10px;background:var(--card);border:1px solid var(--border);padding:8px 14px;border-radius:8px}
.ms-val{font-family:'Orbitron',monospace;font-size:16px;font-weight:700}
.ms-lbl{font-size:10px;color:var(--text2);text-transform:uppercase;letter-spacing:.5px}
/* ── JETSTREAM SPLIT MAP LAYOUT ── */
#tracker{padding:58px 0 0!important}
.map-layout{display:flex;height:calc(100vh - 58px)!important;width:100%!important;min-height:500px;overflow:hidden}
.ml-panel{width:300px;flex-shrink:0;background:#07111f;border-right:1px solid var(--border);
  display:flex;flex-direction:column;overflow:hidden;position:relative;z-index:10}
.ml-header{padding:12px 14px;border-bottom:1px solid var(--border);flex-shrink:0;
  background:linear-gradient(135deg,#040d1a,#071526)}
.ml-logo{font-family:'Orbitron',monospace;font-size:13px;font-weight:900;letter-spacing:2px;
  background:linear-gradient(90deg,var(--blue),var(--cyan));-webkit-background-clip:text;
  -webkit-text-fill-color:transparent;margin-bottom:4px}
.ml-logo-sub{font-size:10px;color:var(--text2);letter-spacing:1px;text-transform:uppercase}
.ml-search{padding:10px 12px;border-bottom:1px solid var(--border);flex-shrink:0}
.ml-search input{width:100%;background:rgba(255,255,255,0.06);border:1px solid var(--border);
  color:var(--text);font-family:'Exo 2',sans-serif;font-size:13px;padding:8px 12px 8px 32px;
  border-radius:8px;outline:none;transition:border .2s}
.ml-search input:focus{border-color:var(--cyan)}
.ml-search-icon{position:absolute;left:22px;top:50%;transform:translateY(-50%);
  color:var(--text2);font-size:13px;pointer-events:none}
.ml-search-wrap{position:relative}
.ml-filters{display:flex;gap:4px;padding:8px 12px;border-bottom:1px solid var(--border);flex-shrink:0;flex-wrap:wrap}
.mlf{background:rgba(255,255,255,0.06);border:1px solid var(--border);color:var(--text2);
  font-family:'Exo 2',sans-serif;font-size:10px;font-weight:700;padding:4px 10px;
  border-radius:6px;cursor:pointer;transition:all .2s;white-space:nowrap}
.mlf:hover,.mlf.on{background:rgba(30,144,255,0.18);border-color:var(--blue);color:var(--blue)}
.ml-list{flex:1;overflow-y:auto;scrollbar-width:thin;scrollbar-color:var(--border) transparent}
.ml-list::-webkit-scrollbar{width:3px}
.ml-list::-webkit-scrollbar-thumb{background:var(--border)}
.ml-flight-row{display:flex;align-items:center;gap:10px;padding:9px 14px;cursor:pointer;
  border-bottom:1px solid rgba(255,255,255,0.04);transition:background .15s}
.ml-flight-row:hover{background:rgba(30,144,255,0.08)}
.ml-flight-row.selected{background:rgba(0,229,255,0.1);border-left:3px solid var(--cyan)}
.ml-cs{font-family:'Orbitron',monospace;font-size:12px;font-weight:700;color:var(--text);min-width:60px}
.ml-airline{font-size:10px;color:var(--text2);flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.ml-alt{font-family:'JetBrains Mono',monospace;font-size:10px;text-align:right;min-width:50px}
.ml-dot{width:7px;height:7px;border-radius:50%;flex-shrink:0}
/* Detail panel inside left sidebar */
.ml-detail{padding:14px;overflow-y:auto;flex:1;display:none}
.ml-detail.show{display:block}
.ml-back{display:flex;align-items:center;gap:7px;color:var(--text2);font-size:12px;
  cursor:pointer;margin-bottom:14px;padding:6px 9px;background:rgba(255,255,255,0.05);
  border-radius:7px;transition:all .2s}
.ml-back:hover{color:var(--cyan);background:rgba(0,229,255,0.08)}
.ml-d-cs{font-family:'Orbitron',monospace;font-size:24px;font-weight:900;color:var(--cyan);margin-bottom:2px}
.ml-d-airline{font-size:13px;color:var(--text2);margin-bottom:10px}
.ml-d-route{background:rgba(0,229,255,0.07);border:1px solid rgba(0,229,255,0.18);
  border-radius:10px;padding:12px;margin-bottom:10px}
.ml-d-apt{font-family:'Orbitron',monospace;font-size:18px;font-weight:900}
.ml-d-city{font-size:10px;color:var(--text2);margin-top:2px;text-transform:uppercase;letter-spacing:.5px}
.ml-d-stats{display:grid;grid-template-columns:1fr 1fr;gap:7px;margin-bottom:10px}
.ml-d-stat{background:rgba(255,255,255,0.04);border:1px solid var(--border);border-radius:8px;padding:9px}
.ml-d-val{font-family:'Orbitron',monospace;font-size:15px;font-weight:700}
.ml-d-lbl{font-size:9px;color:var(--text2);text-transform:uppercase;letter-spacing:.5px;margin-top:2px}
.ml-d-info{background:rgba(255,255,255,0.03);border:1px solid var(--border);
  border-radius:8px;padding:10px;margin-bottom:10px;font-size:12px;line-height:1.6}
.ml-d-btn{width:100%;padding:10px;background:linear-gradient(135deg,var(--blue),var(--cyan));
  border:none;color:#fff;font-family:'Exo 2',sans-serif;font-weight:700;font-size:13px;
  border-radius:9px;cursor:pointer;margin-bottom:7px;transition:all .2s}
.ml-d-btn:hover{filter:brightness(1.15)}
.ml-d-btn2{width:100%;padding:10px;background:rgba(170,0,255,0.15);
  border:1px solid rgba(170,0,255,0.3);color:var(--purple);font-family:'Exo 2',sans-serif;
  font-weight:700;font-size:13px;border-radius:9px;cursor:pointer;transition:all .2s}
.ml-d-btn2:hover{background:rgba(170,0,255,0.25)}
/* Map wrap */

.ml-map-topbar{display:flex;align-items:center;gap:6px;padding:7px 12px;
  background:#07111f;border-bottom:1px solid var(--border);flex-shrink:0;flex-wrap:wrap}
.ml-map-btn{background:rgba(255,255,255,0.07);border:1px solid var(--border);color:var(--text2);
  font-family:'Exo 2',sans-serif;font-size:11px;font-weight:600;padding:5px 12px;
  border-radius:7px;cursor:pointer;transition:all .2s;white-space:nowrap}
.ml-map-btn:hover{border-color:var(--cyan);color:var(--cyan)}
.ml-map-status{display:flex;align-items:center;gap:6px;margin-left:auto;font-size:11px}

.ml-stats-bar{display:flex;gap:10px;padding:7px 12px;background:#07111f;
  border-top:1px solid var(--border);flex-shrink:0;flex-wrap:wrap}
.ml-stat-pill{display:flex;align-items:center;gap:7px;font-size:11px}
.ml-stat-val{font-family:'Orbitron',monospace;font-size:14px;font-weight:700}
.ml-color-legend{display:flex;gap:12px;margin-left:auto;font-size:10px;flex-wrap:wrap;align-items:center}
/* Data status bar */
.ml-data-status{padding:5px 14px;background:rgba(0,0,0,0.4);border-top:1px solid var(--border);
  font-family:'JetBrains Mono',monospace;font-size:11px;flex-shrink:0}
/* Responsive */
@media(max-width:750px){
  .ml-panel{position:absolute;left:0;top:0;bottom:0;z-index:200;transform:translateX(-100%);transition:transform .25s}
  .ml-panel.mobile-open{transform:translateX(0)}
  .ml-mobile-toggle{display:flex!important}
}
.ml-mobile-toggle{display:none;position:absolute;top:10px;left:10px;z-index:300;
  background:rgba(7,17,31,0.95);border:1px solid var(--border2);border-radius:10px;
  padding:8px 14px;cursor:pointer;font-family:'Exo 2',sans-serif;font-size:13px;
  font-weight:700;color:var(--cyan)}
/* keep sp-* used in old showFlightPanel calls */
.sp-apt{font-family:'Orbitron',monospace;font-size:18px;font-weight:900}
.sp-apt-name{font-size:11px;color:var(--text2);margin-top:2px}

/* ===== AIRPORTS ===== */
.apt-filters{display:flex;gap:8px;margin-bottom:20px;flex-wrap:wrap}
.apt-filter{background:var(--card);border:1px solid var(--border);color:var(--text2);font-size:11px;font-weight:600;padding:6px 14px;border-radius:20px;cursor:pointer;transition:all .2s}
.apt-filter:hover,.apt-filter.on{background:rgba(30,144,255,0.15);border-color:var(--blue);color:var(--blue)}
.apt-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(265px,1fr));gap:14px}
.apt-card{background:var(--card);border:1px solid var(--border);border-radius:14px;padding:16px;cursor:pointer;transition:all .3s}
.apt-card:hover{border-color:rgba(0,229,255,0.4);transform:translateY(-2px);box-shadow:0 0 16px rgba(0,229,255,0.1)}
.apt-code{font-family:'Orbitron',monospace;font-size:20px;font-weight:900;color:var(--blue)}
.apt-name{font-size:12px;color:var(--text2);margin:3px 0 8px}
.apt-badge{display:inline-flex;align-items:center;gap:5px;padding:3px 9px;border-radius:14px;font-size:10px;font-weight:700}
.bg-green{background:rgba(0,255,127,0.12);border:1px solid rgba(0,255,127,0.35);color:var(--green)}
.bg-yellow{background:rgba(255,215,0,0.12);border:1px solid rgba(255,215,0,0.35);color:var(--gold)}
.bg-red{background:rgba(255,45,120,0.12);border:1px solid rgba(255,45,120,0.35);color:var(--pink)}
.apt-metrics{display:grid;grid-template-columns:1fr 1fr;gap:7px;margin-top:10px}
.apt-m{background:rgba(255,255,255,0.04);border-radius:7px;padding:7px}
.apt-m-val{font-family:'Orbitron',monospace;font-size:14px;font-weight:700}
.apt-m-lbl{font-size:9px;color:var(--text2);margin-top:1px;text-transform:uppercase}
.apt-summary{margin-top:10px;font-size:11px;color:var(--text2);line-height:1.55;background:rgba(0,229,255,0.05);border:1px solid rgba(0,229,255,0.12);border-radius:7px;padding:9px}

/* ===== DELAY ===== */
.delay-top{background:linear-gradient(135deg,rgba(170,0,255,0.08),rgba(30,144,255,0.08));border:1px solid rgba(170,0,255,0.25);border-radius:20px;padding:28px;margin-bottom:28px;display:flex;align-items:center;justify-content:space-between;gap:20px;flex-wrap:wrap}
.delay-form{display:flex;gap:10px;margin-bottom:20px;flex-wrap:wrap}
.delay-form .inp{flex:1;min-width:140px;margin:0}
.delay-result{background:var(--card);border:1px solid rgba(170,0,255,0.3);border-radius:14px;padding:22px;display:none}
.delay-result.show{display:block}
.delay-bar{height:10px;background:rgba(255,255,255,0.08);border-radius:5px;overflow:hidden;margin:10px 0}
.delay-fill{height:100%;border-radius:5px;background:linear-gradient(90deg,var(--green),var(--gold),var(--pink));transition:width 1.2s cubic-bezier(.4,0,.2,1)}
.pred-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(190px,1fr));gap:10px;margin-top:14px}
.pred-c{background:rgba(255,255,255,0.04);border:1px solid var(--border);border-radius:9px;padding:13px}

/* ===== METARS ===== */
.metar-box{background:var(--card);border:1px solid var(--border);border-radius:12px;padding:20px;display:none}
.metar-box.show{display:block}
.metar-raw{font-family:'JetBrains Mono',monospace;font-size:11px;background:rgba(0,0,0,0.45);padding:12px 14px;border-radius:8px;margin-bottom:14px;color:var(--cyan);border:1px solid rgba(0,229,255,0.18);overflow-x:auto;white-space:pre-wrap;line-height:1.7}
.metar-decoded{display:grid;grid-template-columns:repeat(auto-fill,minmax(140px,1fr));gap:8px}
.md-item{background:rgba(255,255,255,0.04);border-radius:7px;padding:10px;text-align:center}
.md-val{font-family:'Orbitron',monospace;font-size:17px;font-weight:700;margin-bottom:3px}
.md-lbl{font-size:9px;color:var(--text2);text-transform:uppercase;letter-spacing:.5px}
.notam-list{display:flex;flex-direction:column;gap:9px;margin-top:14px}
.notam{background:rgba(255,107,53,0.07);border:1px solid rgba(255,107,53,0.25);border-radius:8px;padding:11px;display:flex;gap:10px;align-items:flex-start}
.notam-code{font-family:'JetBrains Mono',monospace;font-size:10px;color:var(--orange);background:rgba(255,107,53,0.15);padding:3px 8px;border-radius:4px;white-space:nowrap;flex-shrink:0}

/* ===== RADAR ===== */
.radar-grid{display:grid;grid-template-columns:1fr 1fr;gap:20px}
@media(max-width:700px){.radar-grid{grid-template-columns:1fr}}
.radar-box{background:var(--card);border:1px solid rgba(0,255,127,0.2);border-radius:16px;padding:20px}
.radar-box.blue{border-color:rgba(30,144,255,0.2)}
.radar-title{font-family:'Orbitron',monospace;font-size:13px;color:var(--green);margin-bottom:14px;display:flex;align-items:center;gap:8px}
.radar-title.blue{color:var(--blue)}
canvas.rc{display:block;width:100%;aspect-ratio:1;border-radius:50%;background:radial-gradient(circle,rgba(0,50,20,0.85),rgba(0,20,10,0.97));border:2px solid rgba(0,255,127,0.18);box-shadow:0 0 25px rgba(0,255,127,0.1)}
canvas.rc.blue-r{background:radial-gradient(circle,rgba(0,10,45,0.85),rgba(0,5,22,0.97));border-color:rgba(30,144,255,0.2);box-shadow:0 0 25px rgba(30,144,255,0.1)}
.radar-list{display:flex;flex-direction:column;gap:5px;margin-top:11px}
.rl-item{display:flex;justify-content:space-between;align-items:center;padding:6px 9px;background:rgba(0,255,127,0.05);border-radius:5px;font-size:11px}
.rl-item.blue{background:rgba(30,144,255,0.05)}

/* ===== CELEBRITY ===== */
.celeb-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(270px,1fr));gap:14px}
.celeb-card{background:var(--card);border:1px solid rgba(255,215,0,0.18);border-radius:16px;padding:18px;transition:all .3s;cursor:pointer;position:relative;overflow:hidden}
.celeb-card::before{content:'';position:absolute;top:0;left:0;right:0;height:2px;background:linear-gradient(90deg,transparent,var(--gold),transparent)}
.celeb-card:hover{border-color:rgba(255,215,0,0.5);transform:translateY(-3px);box-shadow:0 0 20px rgba(255,215,0,0.15)}
.celeb-track-hint{font-size:10px;color:var(--gold);margin-top:10px;display:flex;align-items:center;gap:5px;opacity:.7}

/* ===== MILITARY ===== */
.mil-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(285px,1fr));gap:14px}
.mil-card{background:rgba(5,18,5,0.85);border:1px solid rgba(0,255,127,0.12);border-radius:14px;padding:17px;transition:all .3s;cursor:pointer}
.mil-card:hover{border-color:rgba(0,255,127,0.35);box-shadow:0 0 18px rgba(0,255,127,0.1)}
.mil-stripe{height:2px;background:repeating-linear-gradient(90deg,var(--green) 0,var(--green) 7px,transparent 7px,transparent 14px);margin:10px 0;border-radius:1px}
.mil-data{display:grid;grid-template-columns:repeat(3,1fr);gap:5px}
.md-box{background:rgba(0,255,127,0.05);border:1px solid rgba(0,255,127,0.1);border-radius:5px;padding:6px;text-align:center}
.md-box-val{font-family:'JetBrains Mono',monospace;font-size:12px;color:var(--green)}
.md-box-lbl{font-size:9px;color:var(--text2);text-transform:uppercase}

/* ===== BRIEFINGS ===== */
.brief-layout{display:grid;grid-template-columns:280px 1fr;gap:18px}
@media(max-width:800px){.brief-layout{grid-template-columns:1fr}}
.brief-item{background:var(--card);border:1px solid var(--border);border-radius:9px;padding:13px;cursor:pointer;transition:all .2s;margin-bottom:9px}
.brief-item:hover,.brief-item.on{border-color:var(--purple);background:rgba(170,0,255,0.08)}
.brief-panel{background:var(--card);border:1px solid rgba(170,0,255,0.25);border-radius:16px;padding:22px}

/* ===== FRIENDS ===== */
.friends-layout{display:grid;grid-template-columns:1fr 1fr;gap:20px}
@media(max-width:700px){.friends-layout{grid-template-columns:1fr}}
.friend-item{background:var(--card);border:1px solid var(--border);border-radius:12px;padding:13px;display:flex;align-items:center;gap:11px;margin-bottom:9px}
.f-avatar{width:40px;height:40px;border-radius:50%;flex-shrink:0;background:linear-gradient(135deg,var(--blue),var(--purple));display:flex;align-items:center;justify-content:center;font-size:16px}

/* ===== REAL PASSPORT ===== */
.passport-outer{max-width:520px;margin:0 auto}
.passport-cover{background:linear-gradient(145deg,#0a2040,#0d1a3a);border:3px solid #1a4a8a;border-radius:12px 12px 0 0;padding:20px 28px 16px;text-align:center;position:relative;overflow:hidden}
.passport-cover::before{content:'';position:absolute;inset:0;background:repeating-linear-gradient(45deg,rgba(30,144,255,0.03) 0,rgba(30,144,255,0.03) 1px,transparent 1px,transparent 8px);pointer-events:none}
.passport-emblem{font-size:44px;margin-bottom:8px;filter:drop-shadow(0 0 12px rgba(30,144,255,0.5))}
.passport-country{font-family:'Orbitron',monospace;font-size:11px;letter-spacing:4px;color:#7aaccc;margin-bottom:4px}
.passport-title-cover{font-family:'Orbitron',monospace;font-size:18px;font-weight:900;color:#d8eeff;letter-spacing:3px}
.passport-inner{background:#f5f0e8;border:3px solid #1a4a8a;border-top:none;border-radius:0 0 12px 12px;overflow:hidden}
.passport-photo-page{background:linear-gradient(135deg,#e8e4d8,#f0ece0);padding:20px;display:grid;grid-template-columns:auto 1fr;gap:16px;border-bottom:2px solid #1a4a8a;position:relative}
.passport-photo-page::after{content:'JETSTREAM LIVE AVIATION PASSPORT';position:absolute;top:50%;left:50%;transform:translate(-50%,-50%) rotate(-35deg);font-family:'Orbitron',monospace;font-size:10px;color:rgba(30,144,255,0.08);letter-spacing:3px;white-space:nowrap;pointer-events:none;font-weight:900}
.pp-photo{width:80px;height:100px;background:linear-gradient(135deg,#0a2040,#1a4a8a);border:2px solid #1a4a8a;border-radius:4px;display:flex;align-items:center;justify-content:center;font-size:40px;flex-shrink:0}
.pp-details{display:flex;flex-direction:column;gap:6px}
.pp-field{background:transparent}
.pp-field-label{font-size:8px;color:#666;text-transform:uppercase;letter-spacing:1.5px;font-family:'Exo 2',sans-serif;font-weight:600}
.pp-field-value{font-size:14px;font-weight:700;color:#0a2040;font-family:'Exo 2',sans-serif;border-bottom:1px solid #1a4a8a;padding-bottom:2px;margin-top:1px}
.pp-field-value.name{font-size:16px;font-family:'Orbitron',monospace;color:#0a2040}
.passport-mrz{background:#e0dbd0;padding:10px 16px;font-family:'JetBrains Mono',monospace;font-size:10px;color:#333;letter-spacing:2px;border-bottom:2px solid #1a4a8a}
.passport-stats-page{background:#f5f0e8;padding:16px 20px;border-bottom:2px solid #1a4a8a}
.passport-stats-title{font-family:'Orbitron',monospace;font-size:9px;letter-spacing:3px;color:#666;text-align:center;margin-bottom:12px;text-transform:uppercase}
.pp-stats{display:grid;grid-template-columns:repeat(3,1fr);gap:8px;margin-bottom:16px}
.pp-stat{text-align:center;background:rgba(30,144,255,0.08);border:1px solid rgba(30,144,255,0.2);border-radius:6px;padding:10px 6px}
.pp-num{font-family:'Orbitron',monospace;font-size:18px;font-weight:900;color:#0a2040}
.pp-lbl{font-size:8px;color:#666;text-transform:uppercase;letter-spacing:.5px;margin-top:2px;font-family:'Exo 2',sans-serif}
.passport-stamps-page{background:#f0ece0;padding:16px 20px;min-height:140px;position:relative;border-bottom:2px solid #1a4a8a}
.stamps-title{font-family:'Orbitron',monospace;font-size:8px;letter-spacing:2px;color:#888;margin-bottom:12px}
.stamps-container{display:flex;flex-wrap:wrap;gap:10px}
.stamp{display:inline-flex;flex-direction:column;align-items:center;padding:8px 12px;border:2px solid;border-radius:3px;font-family:'JetBrains Mono',monospace;position:relative;cursor:default}
.stamp-s1{border-color:#c41e3a;color:#c41e3a;transform:rotate(-5deg);animation:stampIn .5s ease-out}
.stamp-s2{border-color:#1a4a8a;color:#1a4a8a;transform:rotate(8deg);animation:stampIn2 .6s ease-out}
.stamp-s3{border-color:#1a7a3a;color:#1a7a3a;transform:rotate(-3deg);animation:stampIn .7s ease-out}
.stamp-s4{border-color:#8a5a00;color:#8a5a00;transform:rotate(5deg);animation:stampIn2 .5s ease-out}
.stamp-s5{border-color:#5a0082;color:#5a0082;transform:rotate(-7deg);animation:stampIn .8s ease-out}
.stamp-top{font-size:8px;letter-spacing:2px;font-weight:700;text-transform:uppercase}
.stamp-code{font-size:14px;font-weight:900;letter-spacing:1px}
.stamp-date{font-size:7px;margin-top:2px;opacity:.7}
.passport-airlines{background:#f5f0e8;padding:16px 20px;border-bottom:2px solid #1a4a8a}
.chip-row{display:flex;flex-wrap:wrap;gap:6px;margin-top:8px}
.chip{background:rgba(30,144,255,0.1);border:1px solid rgba(30,144,255,0.25);color:#0a2040;font-size:10px;padding:3px 9px;border-radius:3px;font-family:'Exo 2',sans-serif;font-weight:600}
.passport-globe-page{background:linear-gradient(135deg,#e8e4d8,#f0ece0);padding:16px;text-align:center}
.pp-globe{font-size:52px;animation:gspin 20s linear infinite;display:inline-block}

/* ===== TV ===== */
.tv-wrap{max-width:1200px;margin:0 auto;background:#000;border-radius:18px;overflow:hidden;border:2px solid rgba(255,45,120,0.3);position:relative;aspect-ratio:16/9;max-height:540px}
.tv-screen{width:100%;height:100%;display:grid;grid-template-rows:58px 1fr 70px;background:#000}
.tv-hdr{background:rgba(255,45,120,0.88);display:flex;align-items:center;justify-content:space-between;padding:0 22px}
.tv-body{display:grid;grid-template-columns:repeat(4,1fr);grid-auto-rows:1fr;gap:6px;background:#111;padding:8px;overflow:hidden}
.tv-flt{background:rgba(255,255,255,0.05);border:1px solid rgba(255,255,255,0.08);border-radius:7px;padding:7px 8px;display:flex;flex-direction:column;gap:1px;min-height:0}
.tvf-route{font-size:9px;color:#9aa;margin:1px 0 3px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.tvf-row{display:flex;justify-content:space-between;align-items:center;font-size:8.5px;color:#888;line-height:1.45}
.tvf-row b{font-weight:700;font-size:9px}
.tvf-cty{margin-top:auto;font-size:8px;color:#667;letter-spacing:.5px;text-transform:uppercase;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;padding-top:3px}
.tv-ticker{background:#111;border-top:2px solid var(--pink);display:flex;align-items:center;overflow:hidden}
.tv-tick-inner{display:flex;gap:50px;animation:tick 32s linear infinite;white-space:nowrap;padding:0 20px}
.tv-tick-inner span{font-family:'Orbitron',monospace;font-size:11px;color:var(--gold);letter-spacing:1px}
.tv-overlay{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;background:rgba(0,0,0,0.45);cursor:pointer;transition:background .3s}
.tv-overlay:hover{background:rgba(0,0,0,0.25)}

/* ===== PLANS ===== */
.plans-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:14px;max-width:1200px;margin:0 auto}
@media(max-width:1000px){.plans-grid{grid-template-columns:1fr 1fr}}
@media(max-width:550px){.plans-grid{grid-template-columns:1fr}}
.plan-card{background:var(--card);border:1px solid var(--border);border-radius:18px;padding:24px;display:flex;flex-direction:column;transition:all .3s;position:relative;overflow:hidden}
.plan-card.featured{border-color:rgba(0,229,255,0.4);box-shadow:0 0 32px rgba(0,229,255,0.08)}
.plan-card.featured::before{content:'POPULAR';position:absolute;top:14px;right:-26px;background:linear-gradient(135deg,var(--blue),var(--cyan));color:#fff;font-family:'Orbitron',monospace;font-size:7px;letter-spacing:2px;padding:5px 34px;transform:rotate(45deg);font-weight:700}
.plan-feats{list-style:none;flex:1;margin-bottom:18px;display:flex;flex-direction:column;gap:7px}
.plan-feats li{display:flex;gap:7px;font-size:12px;color:var(--text2);align-items:flex-start}
.plan-feats li.y{color:var(--text)}
.plan-feats li::before{content:'✓';color:var(--green);font-weight:700;flex-shrink:0}
.plan-feats li.n::before{content:'✗';color:rgba(255,255,255,0.18)}
.plan-feats li.n{color:rgba(255,255,255,0.22)}
.plan-cta{width:100%;padding:12px;border-radius:11px;border:none;font-family:'Exo 2',sans-serif;font-weight:700;font-size:13px;cursor:pointer;transition:all .3s}
.plan-cta:hover{transform:translateY(-2px);filter:brightness(1.1)}
.tog-lbl{font-size:13px;color:var(--text2)}
.toggle{width:50px;height:26px;background:rgba(255,255,255,0.1);border-radius:13px;position:relative;cursor:pointer;border:1px solid var(--border);transition:background .3s}
.toggle.on{background:linear-gradient(90deg,var(--blue),var(--cyan))}
.tog-knob{position:absolute;width:20px;height:20px;background:#fff;border-radius:50%;top:2px;left:2px;transition:transform .3s;box-shadow:0 1px 4px rgba(0,0,0,0.3)}
.toggle.on .tog-knob{transform:translateX(24px)}
.save-tag{background:linear-gradient(135deg,var(--gold),var(--orange));color:#000;font-size:10px;font-weight:800;padding:3px 9px;border-radius:11px}

/* ===== ARCHITECT ===== */
.arch-profile{display:grid;grid-template-columns:auto 1fr;gap:28px;align-items:center;background:var(--card);border:1px solid rgba(255,215,0,0.25);border-radius:22px;padding:28px;margin-bottom:28px}
@media(max-width:600px){.arch-profile{grid-template-columns:1fr;text-align:center}}
.arch-avatar{width:110px;height:110px;border-radius:50%;flex-shrink:0;background:linear-gradient(135deg,var(--blue),var(--purple),var(--pink));display:flex;align-items:center;justify-content:center;font-size:50px;box-shadow:0 0 36px rgba(30,144,255,0.35);border:3px solid rgba(255,255,255,0.08)}
.arch-tags{display:flex;gap:7px;margin-top:13px;flex-wrap:wrap}
.arch-tag{background:rgba(30,144,255,0.1);border:1px solid rgba(30,144,255,0.28);color:var(--blue);font-size:11px;padding:4px 11px;border-radius:11px;font-weight:600}
.milestone{background:rgba(255,255,255,0.03);border:1px solid var(--border);border-radius:9px;padding:13px;border-left:3px solid var(--gold)}
.m-date{font-family:'JetBrains Mono',monospace;font-size:10px;color:var(--gold);margin-bottom:4px}

/* ===== FOOTER ===== */
footer{position:relative;z-index:2;background:rgba(1,5,14,0.97);border-top:1px solid var(--border);padding:36px 20px 22px}
.footer-grid{display:grid;grid-template-columns:2fr 1fr 1fr 1fr;gap:28px;margin-bottom:28px;max-width:1240px;margin-left:auto;margin-right:auto}
@media(max-width:800px){.footer-grid{grid-template-columns:1fr 1fr}}
@media(max-width:440px){.footer-grid{grid-template-columns:1fr}}
.ft-link{display:block;font-size:12px;color:var(--text2);margin-bottom:7px;cursor:pointer;transition:color .2s;text-decoration:none}
.ft-link:hover{color:var(--cyan)}
.footer-bottom{max-width:1240px;margin:0 auto;border-top:1px solid var(--border);padding-top:18px;display:flex;justify-content:space-between;align-items:center;flex-wrap:wrap;gap:8px;font-size:11px;color:var(--text2)}

/* ── BOARDING PASS FULL-SCREEN MODAL ── */
.bp-overlay{display:none;position:fixed;inset:0;background:rgba(0,0,0,0.88);z-index:3000;
  align-items:center;justify-content:center;padding:20px;backdrop-filter:blur(8px)}
.bp-overlay.open{display:flex}
.bp-modal{background:#0a1628;border-radius:20px;width:100%;max-width:680px;max-height:90vh;
  overflow-y:auto;position:relative;box-shadow:0 0 60px rgba(30,144,255,0.3)}
.bp-close{position:fixed;top:20px;right:20px;width:42px;height:42px;background:rgba(255,255,255,0.12);
  border:1px solid rgba(255,255,255,0.2);border-radius:50%;color:#fff;font-size:20px;
  cursor:pointer;border:none;display:flex;align-items:center;justify-content:center;
  z-index:3001;transition:all .2s}
.bp-close:hover{background:rgba(255,45,120,0.4);transform:scale(1.1)}
.bp-header{padding:24px 24px 0;display:flex;align-items:center;gap:14px}
.bp-airline-badge{width:64px;height:64px;border-radius:14px;display:flex;align-items:center;
  justify-content:center;font-size:32px;flex-shrink:0}
.bp-flight-num{font-family:'Orbitron',monospace;font-size:28px;font-weight:900;color:var(--cyan)}
.bp-airline-name{font-size:14px;color:var(--text2);margin-top:3px}
.bp-card{margin:20px;background:linear-gradient(135deg,#071e38,#0d2848);
  border-radius:16px;overflow:hidden;border:1px solid rgba(30,144,255,0.25)}
.bp-route-bar{padding:20px 24px;display:flex;align-items:center;gap:0;
  background:linear-gradient(90deg,rgba(30,144,255,0.12),rgba(0,229,255,0.08))}
.bp-apt-big{font-family:'Orbitron',monospace;font-size:36px;font-weight:900}
.bp-apt-city{font-size:11px;color:var(--text2);margin-top:4px;text-transform:uppercase;letter-spacing:1px}
.bp-route-mid{flex:1;display:flex;flex-direction:column;align-items:center;padding:0 16px}
.bp-route-line{width:100%;height:1px;background:linear-gradient(90deg,transparent,var(--cyan),transparent);
  position:relative;margin:8px 0}
.bp-route-line::after{content:'✈';position:absolute;top:-10px;left:50%;transform:translateX(-50%);
  font-size:18px;color:var(--cyan)}
.bp-duration{font-family:'JetBrains Mono',monospace;font-size:11px;color:var(--text2)}
.bp-divider{height:1px;background:repeating-linear-gradient(90deg,rgba(30,144,255,0.2) 0,
  rgba(30,144,255,0.2) 8px,transparent 8px,transparent 16px);margin:0 24px}
.bp-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:1px;
  background:rgba(30,144,255,0.1);border-top:1px solid rgba(30,144,255,0.15)}
.bp-cell{background:#071e38;padding:14px 16px}
.bp-cell-label{font-size:9px;color:var(--text2);text-transform:uppercase;letter-spacing:1.5px;margin-bottom:4px}
.bp-cell-val{font-family:'Orbitron',monospace;font-size:15px;font-weight:700}
.bp-status-bar{padding:12px 24px;display:flex;align-items:center;justify-content:space-between;flex-wrap:wrap;gap:8px}
.bp-live-badge{display:flex;align-items:center;gap:6px;background:rgba(0,255,127,0.1);
  border:1px solid rgba(0,255,127,0.3);padding:5px 14px;border-radius:20px;font-size:12px;font-weight:700;color:var(--green)}
.bp-barcode{text-align:center;padding:16px;border-top:1px dashed rgba(30,144,255,0.2)}
.bp-barcode-lines{font-family:'JetBrains Mono',monospace;font-size:6px;letter-spacing:-1px;
  color:var(--cyan);opacity:.6;line-height:1;word-break:break-all}
.bp-actions{display:flex;gap:10px;padding:0 20px 20px;flex-wrap:wrap}
.bp-action-btn{flex:1;min-width:120px;padding:11px;border-radius:10px;border:none;
  font-family:'Exo 2',sans-serif;font-weight:700;font-size:13px;cursor:pointer;transition:all .2s}
.bp-action-btn:hover{filter:brightness(1.15);transform:translateY(-1px)}

/* ── ENHANCED LEFT PANEL DETAIL ── */
.ml-bp-header{padding:14px;background:linear-gradient(135deg,#051020,#0a1e38);border-bottom:1px solid var(--border)}
.ml-bp-airline-row{display:flex;align-items:center;gap:10px;margin-bottom:8px}
.ml-bp-flag{width:44px;height:44px;border-radius:10px;display:flex;align-items:center;justify-content:center;font-size:24px;flex-shrink:0}
.ml-bp-cs{font-family:'Orbitron',monospace;font-size:20px;font-weight:900;color:var(--cyan)}
.ml-bp-airline{font-size:12px;color:var(--text2);margin-top:2px}
.ml-bp-reg{font-family:'JetBrains Mono',monospace;font-size:10px;color:var(--gold);margin-top:1px}
.ml-progress-wrap{background:rgba(0,0,0,0.3);border:1px solid var(--border);border-radius:8px;padding:12px;margin-bottom:8px}
.ml-progress-airports{display:flex;justify-content:space-between;align-items:flex-end;margin-bottom:8px}
.ml-prog-apt{font-family:'Orbitron',monospace;font-size:16px;font-weight:900}
.ml-prog-city{font-size:9px;color:var(--text2);text-transform:uppercase;letter-spacing:.5px;margin-top:2px}
.ml-prog-time{font-family:'JetBrains Mono',monospace;font-size:10px;color:var(--cyan);margin-top:3px}
.ml-prog-bar-wrap{position:relative;height:3px;background:rgba(255,255,255,0.12);border-radius:2px;margin:4px 0}
.ml-prog-bar-fill{position:absolute;left:0;top:0;height:100%;background:linear-gradient(90deg,var(--blue),var(--cyan));border-radius:2px;transition:width .8s}
.ml-prog-plane{position:absolute;top:-7px;font-size:16px;transform:translateX(-50%);transition:left .8s}
.ml-prog-distance{display:flex;justify-content:space-between;align-items:center;width:100%;font-size:10px;color:var(--text2);margin-top:10px;padding-top:8px;border-top:1px solid var(--border)}
.ml-prog-distance span{white-space:nowrap}
.ml-status-row{display:flex;align-items:center;gap:7px;margin-bottom:8px;flex-wrap:wrap}
.ml-status-pill{display:inline-flex;align-items:center;gap:5px;padding:4px 11px;border-radius:20px;font-size:10px;font-weight:700}
.ml-section{padding:10px 14px;border-bottom:1px solid rgba(255,255,255,0.05)}
.ml-section-title{font-size:9px;color:var(--text2);text-transform:uppercase;letter-spacing:1.5px;margin-bottom:8px;font-weight:700}
.ml-data-grid{display:grid;grid-template-columns:1fr 1fr;gap:6px}
.ml-data-grid3{display:grid;grid-template-columns:1fr 1fr 1fr;gap:6px}
.ml-data-cell{background:rgba(255,255,255,0.04);border-radius:6px;padding:8px}
.ml-data-val{font-family:'Orbitron',monospace;font-size:14px;font-weight:700}
.ml-data-val.sm{font-size:11px}
.ml-data-lbl{font-size:8px;color:var(--text2);text-transform:uppercase;letter-spacing:.5px;margin-top:2px}
.ml-info-row{display:flex;justify-content:space-between;align-items:center;padding:5px 0;border-bottom:1px solid rgba(255,255,255,0.04);font-size:11px}
.ml-info-row:last-child{border:none}
.ml-info-label{color:var(--text2)}
.ml-info-value{font-family:'JetBrains Mono',monospace;font-weight:600}
.ml-phase-badge{display:inline-flex;align-items:center;gap:5px;padding:5px 12px;border-radius:6px;font-size:11px;font-weight:700;margin-top:4px}
.ml-share-row{display:flex;gap:6px;padding:10px 14px}
.ml-share-btn{flex:1;padding:8px;border-radius:7px;border:none;font-family:'Exo 2',sans-serif;font-size:11px;font-weight:700;cursor:pointer;transition:all .2s}
.ml-share-btn:hover{filter:brightness(1.2);transform:translateY(-1px)}
.ml-aircraft-card{margin:8px 14px;background:linear-gradient(135deg,rgba(255,215,0,0.06),rgba(30,144,255,0.06));border:1px solid rgba(255,215,0,0.2);border-radius:9px;padding:10px}

/* ═══ MAP LAYOUT - DEFINITIVE ═══ */
#tracker{padding:0!important;margin-top:0!important}
.map-layout{display:flex;width:100%;overflow:hidden}
.ml-panel{width:300px;flex-shrink:0;background:#07111f;border-right:1px solid rgba(30,144,255,0.2);display:flex;flex-direction:column;overflow:hidden}
.ml-map-wrap{flex:1;display:flex;flex-direction:column;overflow:hidden;min-width:0}
#map{width:100%;flex:1;min-height:400px}
/* ===== Spotter's Logbook trading cards ===== */
.lb-rankbar{display:flex;align-items:center;justify-content:space-between;gap:18px;flex-wrap:wrap;background:linear-gradient(135deg,rgba(0,229,255,0.08),rgba(170,0,255,0.06));border:1px solid rgba(0,229,255,0.25);border-radius:16px;padding:16px 20px;margin-bottom:18px}
.lb-rank-left{display:flex;align-items:center;gap:14px}
.lb-rank-badge{width:54px;height:54px;border-radius:50%;display:flex;align-items:center;justify-content:center;font-size:26px;background:linear-gradient(135deg,var(--blue),var(--cyan));box-shadow:0 0 22px rgba(0,229,255,0.4)}
.lb-rank-name{font-family:'Orbitron',monospace;font-weight:800;font-size:18px;color:#fff}
.lb-rank-sub{font-size:12px;color:var(--text2);margin-top:2px}
.lb-rank-right{flex:1;min-width:180px;max-width:340px}
.lb-progress{height:9px;border-radius:6px;background:rgba(255,255,255,0.08);overflow:hidden}
.lb-progress-fill{height:100%;border-radius:6px;background:linear-gradient(90deg,var(--cyan),var(--blue));transition:width .8s ease;width:0}
.lb-progress-lbl{font-size:11px;color:var(--text2);margin-top:6px;text-align:right}
.lb-stats{display:grid;grid-template-columns:repeat(4,1fr);gap:10px;margin-bottom:18px}
.lb-stat{background:rgba(255,255,255,0.04);border:1px solid rgba(255,255,255,0.08);border-radius:13px;padding:14px 8px;text-align:center}
.lb-stat-num{font-family:'Orbitron',monospace;font-weight:800;font-size:26px;background:linear-gradient(135deg,var(--cyan),var(--blue));-webkit-background-clip:text;-webkit-text-fill-color:transparent;background-clip:text}
.lb-stat-lbl{font-size:10px;letter-spacing:1px;color:var(--text2);text-transform:uppercase;margin-top:3px}
.lb-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(150px,1fr));gap:14px}
.lb-card{position:relative;border-radius:15px;padding:16px 14px 14px;overflow:hidden;border:1px solid rgba(255,255,255,0.12);background:linear-gradient(160deg,#0c1a30,#071120);min-height:170px;display:flex;flex-direction:column;transition:transform .25s ease,box-shadow .25s ease;cursor:default}
.lb-card:hover{transform:translateY(-5px) scale(1.02)}
.lb-card::before{content:"";position:absolute;top:-40%;left:-60%;width:60%;height:200%;background:linear-gradient(115deg,transparent,rgba(255,255,255,0.18),transparent);transform:rotate(8deg);transition:left .6s ease}
.lb-card:hover::before{left:140%}
.lb-card-common{border-color:rgba(120,160,200,0.35);box-shadow:0 4px 18px rgba(0,0,0,0.3)}
.lb-card-rare{border-color:rgba(0,229,255,0.5);box-shadow:0 4px 22px rgba(0,229,255,0.22);background:linear-gradient(160deg,#08233a,#06131f)}
.lb-card-epic{border-color:rgba(170,0,255,0.55);box-shadow:0 4px 26px rgba(170,0,255,0.3);background:linear-gradient(160deg,#1a0a2e,#0a0618)}
.lb-card-legend{border-color:rgba(255,215,0,0.6);box-shadow:0 4px 30px rgba(255,215,0,0.32);background:linear-gradient(160deg,#2a2008,#140f02)}
.lb-card-rarity{position:absolute;top:9px;right:10px;font-size:8px;letter-spacing:1.5px;font-family:'Orbitron',monospace;font-weight:700;padding:2px 7px;border-radius:10px;text-transform:uppercase}
.lb-r-common{background:rgba(120,160,200,0.2);color:#9fc}
.lb-r-rare{background:rgba(0,229,255,0.2);color:var(--cyan)}
.lb-r-epic{background:rgba(170,0,255,0.25);color:#cd8bff}
.lb-r-legend{background:rgba(255,215,0,0.22);color:var(--gold)}
.lb-card-icon{font-size:34px;text-align:center;margin:6px 0 10px;filter:drop-shadow(0 2px 6px rgba(0,0,0,0.5))}
.lb-card-type{font-family:'Orbitron',monospace;font-weight:700;font-size:14px;color:#fff;text-align:center;line-height:1.25;margin-bottom:4px}
.lb-card-airline{font-size:11px;color:var(--cyan);text-align:center;margin-bottom:auto}
.lb-card-foot{margin-top:10px;padding-top:9px;border-top:1px solid rgba(255,255,255,0.1);display:flex;justify-content:space-between;align-items:center;font-size:10px;color:var(--text2)}
.lb-card-reg{font-family:'JetBrains Mono',monospace;color:#cfe}
@media(max-width:600px){.lb-stats{grid-template-columns:repeat(2,1fr)}.lb-grid{grid-template-columns:repeat(auto-fill,minmax(135px,1fr))}}
/* ===== JetStream AI assistant ===== */
#jaiBtn{position:fixed;bottom:22px;right:22px;width:60px;height:60px;border-radius:50%;background:linear-gradient(135deg,var(--blue),var(--cyan));border:none;cursor:pointer;z-index:9000;box-shadow:0 6px 26px rgba(0,229,255,0.5);display:flex;align-items:center;justify-content:center;font-size:27px;transition:transform .2s ease}
#jaiBtn:hover{transform:scale(1.08)}
#jaiBtn.open{background:linear-gradient(135deg,#555,#333)}
#jaiPanel{position:fixed;bottom:94px;right:22px;width:370px;max-width:calc(100vw - 32px);height:540px;max-height:calc(100vh - 130px);background:#08121f;border:1px solid rgba(0,229,255,0.3);border-radius:18px;z-index:9000;display:none;flex-direction:column;overflow:hidden;box-shadow:0 14px 50px rgba(0,0,0,0.6)}
#jaiPanel.show{display:flex}
.jai-head{background:linear-gradient(135deg,rgba(30,144,255,0.25),rgba(0,229,255,0.18));padding:14px 16px;display:flex;align-items:center;gap:10px;border-bottom:1px solid rgba(0,229,255,0.2)}
.jai-head-icon{width:34px;height:34px;border-radius:50%;background:linear-gradient(135deg,var(--blue),var(--cyan));display:flex;align-items:center;justify-content:center;font-size:18px}
.jai-head-t{font-family:'Orbitron',monospace;font-weight:700;font-size:14px;color:#fff}
.jai-head-s{font-size:10px;color:var(--cyan)}
.jai-body{flex:1;overflow-y:auto;padding:14px;display:flex;flex-direction:column;gap:10px}
.jai-msg{max-width:85%;padding:10px 13px;border-radius:14px;font-size:13px;line-height:1.5;white-space:pre-wrap;word-wrap:break-word}
.jai-msg-ai{align-self:flex-start;background:rgba(255,255,255,0.06);border:1px solid rgba(255,255,255,0.08);color:var(--text);border-bottom-left-radius:4px}
.jai-msg-user{align-self:flex-end;background:linear-gradient(135deg,var(--blue),var(--cyan));color:#fff;border-bottom-right-radius:4px}
.jai-dl{display:inline-block;background:linear-gradient(135deg,var(--blue),var(--cyan));color:#fff;font-weight:700;font-size:12px;text-decoration:none;padding:8px 12px;border-radius:9px}
.jai-dl:hover{filter:brightness(1.08)}
.jai-suggest{display:flex;flex-wrap:wrap;gap:6px;margin-top:4px}
.jai-chip{background:rgba(0,229,255,0.1);border:1px solid rgba(0,229,255,0.3);color:var(--cyan);padding:6px 11px;border-radius:14px;font-size:11px;cursor:pointer}
.jai-chip:hover{background:rgba(0,229,255,0.2)}
.jai-foot{padding:10px;border-top:1px solid rgba(255,255,255,0.08);display:flex;gap:8px}
.jai-input{flex:1;background:rgba(255,255,255,0.06);border:1px solid rgba(255,255,255,0.12);color:var(--text);padding:10px 13px;border-radius:11px;font-size:13px;font-family:'Exo 2',sans-serif;outline:none}
.jai-send{width:42px;border:none;border-radius:11px;background:linear-gradient(135deg,var(--blue),var(--cyan));color:#fff;font-size:17px;cursor:pointer}
.jai-typing{align-self:flex-start;color:var(--text2);font-size:12px;font-style:italic}
/* ===== Theme palettes (app themes) ===== */
:root[data-theme="purple"]{
  --bg:#0a0418;--bg2:#160a2e;--card:rgba(30,10,60,0.75);
  --blue:#7B2FFF;--cyan:#C77DFF;--gold:#FFD700;
  --text:#ECE0FF;--text2:#A98FD0;
  --border:rgba(123,47,255,0.25);--border2:rgba(199,125,255,0.3);
}
:root[data-theme="stealth"]{
  --bg:#020503;--bg2:#06120a;--card:rgba(8,28,16,0.78);
  --blue:#00C853;--cyan:#00FF7F;--gold:#B2FF59;
  --text:#D6FFE4;--text2:#6Fae85;
  --border:rgba(0,200,83,0.22);--border2:rgba(0,255,127,0.3);
}
:root[data-theme="sunset"]{
  --bg:#180a04;--bg2:#2e1408;--card:rgba(60,25,10,0.75);
  --blue:#FF6B35;--cyan:#FFB347;--gold:#FFD700;
  --text:#FFEAD8;--text2:#D0A98F;
  --border:rgba(255,107,53,0.25);--border2:rgba(255,179,71,0.3);
}
:root[data-theme="arctic"]{
  --bg:#0a1420;--bg2:#13243a;--card:rgba(20,40,65,0.7);
  --blue:#2DA8FF;--cyan:#7FE7FF;--gold:#FFD86B;
  --text:#EAF6FF;--text2:#9FC4DD;
  --border:rgba(45,168,255,0.25);--border2:rgba(127,231,255,0.3);
}
/* ===== Theme picker ===== */
#themeBtn{position:fixed;bottom:22px;right:92px;width:52px;height:52px;border-radius:50%;background:linear-gradient(135deg,var(--bg2),var(--card));border:1px solid var(--border2);cursor:pointer;z-index:8999;display:flex;align-items:center;justify-content:center;font-size:22px;box-shadow:0 4px 18px rgba(0,0,0,0.4);transition:transform .2s}
#themeBtn:hover{transform:rotate(45deg) scale(1.06)}
#themeModal{position:fixed;inset:0;background:rgba(0,0,0,0.7);backdrop-filter:blur(6px);z-index:9500;display:none;align-items:center;justify-content:center;padding:20px}
#themeModal.show{display:flex}
.theme-box{background:linear-gradient(160deg,var(--bg2),var(--bg));border:1px solid var(--border2);border-radius:20px;padding:24px;max-width:440px;width:100%;max-height:88vh;overflow-y:auto;box-shadow:0 20px 60px rgba(0,0,0,0.6)}
.theme-box h3{font-family:'Orbitron',monospace;font-size:18px;color:var(--text);margin:0 0 4px}
.theme-box .ts-sub{font-size:12px;color:var(--text2);margin-bottom:18px}
.ts-label{font-family:'Orbitron',monospace;font-size:11px;letter-spacing:2px;color:var(--cyan);text-transform:uppercase;margin:16px 0 10px}
.ts-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(110px,1fr));gap:10px}
.ts-opt{border:1px solid rgba(255,255,255,0.12);border-radius:13px;padding:12px;cursor:pointer;transition:all .2s;text-align:center;background:rgba(255,255,255,0.03)}
.ts-opt:hover{border-color:var(--cyan);transform:translateY(-2px)}
.ts-opt.active{border-color:var(--cyan);box-shadow:0 0 0 2px var(--cyan) inset}
.ts-swatch{height:34px;border-radius:8px;margin-bottom:8px;display:flex;overflow:hidden}
.ts-swatch span{flex:1}
.ts-name{font-size:12px;color:var(--text);font-weight:600}
.ts-close{margin-top:20px;width:100%;padding:12px;border:none;border-radius:12px;background:linear-gradient(135deg,var(--blue),var(--cyan));color:#fff;font-family:'Exo 2',sans-serif;font-weight:700;font-size:14px;cursor:pointer}
/* ============================================================
   PREMIUM POLISH LAYER - refined depth, glass, motion, type
   ============================================================ */
/* Smoother global type rendering */
body{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;letter-spacing:.2px}
/* Richer ambient backdrop with a slow drift */
@keyframes premDrift{0%{transform:translate3d(0,0,0)}50%{transform:translate3d(-2%,1.5%,0)}100%{transform:translate3d(0,0,0)}}
body::after{content:'';position:fixed;inset:-10%;z-index:0;pointer-events:none;opacity:.85;
  background:
    radial-gradient(40% 32% at 12% 8%,rgba(168,85,247,0.22),transparent 70%),
    radial-gradient(38% 32% at 88% 12%,rgba(34,211,238,0.18),transparent 70%),
    radial-gradient(42% 36% at 78% 88%,rgba(244,114,182,0.18),transparent 70%),
    radial-gradient(46% 40% at 18% 92%,rgba(59,130,246,0.18),transparent 70%),
    radial-gradient(50% 44% at 50% 50%,rgba(251,191,36,0.06),transparent 70%);
  animation:premDrift 22s ease-in-out infinite}
/* Subtle starfield texture on the very top hero only */
section#home{position:relative}
section#home::before{content:'';position:absolute;inset:0;pointer-events:none;z-index:0;opacity:.4;
  background-image:radial-gradient(1px 1px at 20% 30%,rgba(255,255,255,.5),transparent),radial-gradient(1px 1px at 70% 60%,rgba(255,255,255,.35),transparent),radial-gradient(1px 1px at 40% 80%,rgba(255,255,255,.4),transparent),radial-gradient(1px 1px at 85% 25%,rgba(255,255,255,.3),transparent),radial-gradient(1px 1px at 55% 15%,rgba(255,255,255,.35),transparent);
  background-size:cover}

/* Premium nav - deeper glass, hairline gradient underline */
nav{background:linear-gradient(180deg,rgba(3,12,28,0.92),rgba(1,8,20,0.82))!important;backdrop-filter:blur(22px) saturate(140%)!important;-webkit-backdrop-filter:blur(22px) saturate(140%)!important;border-bottom:1px solid transparent!important;background-clip:padding-box;box-shadow:0 1px 0 rgba(0,229,255,0.12),0 8px 30px rgba(0,0,0,0.35)}
.nav-btn{transition:color .2s ease,background .2s ease,transform .15s ease}
.nav-btn:hover{transform:translateY(-1px)}
.nav-btn.active{position:relative}
.nav-btn.active::after{content:'';position:absolute;left:9px;right:9px;bottom:1px;height:2px;border-radius:2px;background:linear-gradient(90deg,var(--blue),var(--cyan));box-shadow:0 0 8px var(--cyan)}

/* Premium section titles - soft glow */
.sec-title{text-shadow:0 0 30px rgba(0,229,255,0.12)}
.sec-tag{backdrop-filter:blur(8px);box-shadow:0 4px 16px rgba(0,0,0,0.2)}

/* Glassy premium scrollbar */
::-webkit-scrollbar{width:9px;height:9px;background:transparent}
::-webkit-scrollbar-thumb{background:linear-gradient(180deg,var(--blue),var(--cyan));border-radius:8px;border:2px solid var(--bg)}
::-webkit-scrollbar-thumb:hover{background:var(--cyan)}

/* Card & panel depth upgrade - applies to common card-ish blocks */
.orb,.feature-card,.stat-card,.card,.ml-stat-pill{transition:transform .25s cubic-bezier(.2,.7,.3,1),box-shadow .25s ease,border-color .25s ease}
.feature-card:hover,.stat-card:hover,.card:hover{transform:translateY(-4px);box-shadow:0 14px 38px rgba(0,0,0,0.4),0 0 0 1px var(--border2)}

/* Premium primary buttons - sheen sweep on hover */
button,.btn,.btn-purple,.modal-submit,.btn-signin{position:relative;overflow:hidden}
.modal-submit::after,.btn-signin::after,.btn-purple::after{content:'';position:absolute;top:0;left:-80%;width:60%;height:100%;background:linear-gradient(110deg,transparent,rgba(255,255,255,0.28),transparent);transform:skewX(-18deg);transition:left .55s ease}
.modal-submit:hover::after,.btn-signin:hover::after,.btn-purple:hover::after{left:130%}

/* Gentle fade/rise for sections as they enter */
@keyframes premRise{from{opacity:0;transform:translateY(18px)}to{opacity:1;transform:translateY(0)}}
.fade-up{animation:premRise .7s cubic-bezier(.2,.7,.3,1) both}

/* Refined inputs */
input,select,textarea{transition:border-color .2s ease,box-shadow .2s ease}
input:focus,select:focus,textarea:focus{box-shadow:0 0 0 3px rgba(0,229,255,0.12)}

/* Hairline dividers feel more refined */
hr{border:none;height:1px;background:linear-gradient(90deg,transparent,var(--border2),transparent)}

/* Premium glow on the live pill */
.live-pill,.live-b{box-shadow:0 0 20px rgba(0,255,127,0.12)}

/* Floating action buttons (AI + theme) get a premium ring */
#jaiBtn,#themeBtn{box-shadow:0 8px 30px rgba(0,229,255,0.35),0 0 0 1px rgba(255,255,255,0.06) inset}
/* ============================================================
   DESIGN SYSTEM - reusable components (opt-in, token-driven)
   ============================================================ */
.ds-card{
  background:linear-gradient(160deg,rgba(255,255,255,0.045),rgba(255,255,255,0.015));
  border:1px solid rgba(255,255,255,0.09);
  border-radius:var(--r-lg);
  padding:var(--sp-5);
  box-shadow:var(--sh-1);
  backdrop-filter:blur(10px);
  transition:transform var(--t-med) var(--ease),box-shadow var(--t-med) var(--ease),border-color var(--t-med) var(--ease);
}
.ds-card:hover{transform:translateY(-4px);box-shadow:var(--sh-2);border-color:var(--border2)}
.ds-card-glow{position:relative;overflow:hidden}
.ds-card-glow::before{content:'';position:absolute;inset:0;border-radius:inherit;padding:1px;background:linear-gradient(135deg,var(--blue),transparent 40%,transparent 60%,var(--cyan));-webkit-mask:linear-gradient(#000 0 0) content-box,linear-gradient(#000 0 0);-webkit-mask-composite:xor;mask-composite:exclude;opacity:0;transition:opacity var(--t-med) var(--ease)}
.ds-card-glow:hover::before{opacity:.6}

.ds-btn{
  display:inline-flex;align-items:center;justify-content:center;gap:8px;
  font-family:'Exo 2',sans-serif;font-weight:700;font-size:var(--fs-base);
  padding:12px 22px;border-radius:var(--r-md);border:1px solid rgba(255,255,255,0.12);
  background:rgba(255,255,255,0.05);color:var(--text);cursor:pointer;
  transition:transform var(--t-fast) var(--ease),box-shadow var(--t-med) var(--ease),background var(--t-med) var(--ease);
  position:relative;overflow:hidden;
}
.ds-btn:hover{transform:translateY(-2px);background:rgba(255,255,255,0.09)}
.ds-btn-primary{background:linear-gradient(135deg,var(--blue),var(--cyan));border:none;color:#fff;box-shadow:var(--glow)}
.ds-btn-primary:hover{box-shadow:0 0 30px rgba(0,229,255,0.45)}
.ds-btn-primary::after{content:'';position:absolute;top:0;left:-80%;width:55%;height:100%;background:linear-gradient(110deg,transparent,rgba(255,255,255,0.3),transparent);transform:skewX(-18deg);transition:left var(--t-slow) var(--ease)}
.ds-btn-primary:hover::after{left:130%}

/* Consistent eyebrow tag */
.ds-tag{display:inline-block;font-family:'Orbitron',monospace;font-size:var(--fs-xs);letter-spacing:3px;text-transform:uppercase;color:var(--cyan);background:rgba(0,229,255,0.1);border:1px solid var(--border2);padding:5px 14px;border-radius:var(--r-pill);backdrop-filter:blur(8px)}

/* Type helpers */
.ds-h1{font-family:'Orbitron',monospace;font-weight:900;font-size:var(--fs-3xl);line-height:var(--lh-tight)}
.ds-h2{font-family:'Orbitron',monospace;font-weight:800;font-size:var(--fs-2xl);line-height:var(--lh-tight)}
.ds-h3{font-family:'Orbitron',monospace;font-weight:700;font-size:var(--fs-lg);line-height:var(--lh-snug)}
.ds-body{font-size:var(--fs-base);line-height:var(--lh-normal);color:var(--text2)}
.ds-mono{font-family:'JetBrains Mono',monospace}

/* Consistent section rhythm */
.ds-section{padding:var(--sp-9) var(--gutter)}
.ds-wrap{max-width:var(--container);margin:0 auto}
.ds-stack-2>*+*{margin-top:var(--sp-2)}
.ds-stack-3>*+*{margin-top:var(--sp-3)}
.ds-stack-5>*+*{margin-top:var(--sp-5)}

/* Accessible focus ring (premium + usable) */
:focus-visible{outline:2px solid var(--cyan);outline-offset:2px;border-radius:4px}
/* ============================================================
   IDENTIFIER SHOWCASE - the award-star feature
   ============================================================ */
#ar-section.id-showcase{padding-top:var(--sp-8)}
.id-hero{max-width:760px;margin:0 auto var(--sp-6);text-align:center}
.id-hero .id-eyebrow{display:inline-flex;align-items:center;gap:7px;font-family:'Orbitron',monospace;font-size:var(--fs-xs);letter-spacing:3px;text-transform:uppercase;color:var(--cyan);background:rgba(0,229,255,0.08);border:1px solid var(--border2);padding:6px 16px;border-radius:var(--r-pill);margin-bottom:var(--sp-4);backdrop-filter:blur(8px)}
.id-hero h2{font-family:'Orbitron',monospace;font-weight:900;font-size:var(--fs-2xl);line-height:var(--lh-tight);margin-bottom:var(--sp-3)}
.id-hero h2 .grad{background:linear-gradient(100deg,var(--blue),var(--cyan) 55%,var(--gold));-webkit-background-clip:text;-webkit-text-fill-color:transparent}
.id-hero p{font-size:var(--fs-md);line-height:var(--lh-normal);color:var(--text2);max-width:560px;margin:0 auto}

.id-stage{max-width:760px;margin:0 auto;border-radius:var(--r-xl);overflow:hidden;border:1px solid rgba(255,255,255,0.1);box-shadow:var(--sh-3);background:#000;position:relative}
.id-toggle{display:flex;gap:6px;padding:8px;background:rgba(255,255,255,0.04);backdrop-filter:blur(10px)}
.id-toggle button{flex:1;padding:11px;border:none;border-radius:var(--r-md);font-family:'Orbitron',monospace;font-size:var(--fs-xs);letter-spacing:1px;cursor:pointer;transition:all var(--t-med) var(--ease);background:transparent;color:var(--text2)}
.id-toggle button.on{background:linear-gradient(135deg,var(--blue),var(--cyan));color:#fff;box-shadow:var(--glow)}

.id-cam{position:relative;aspect-ratio:16/10;background:#05080f;overflow:hidden}
.id-cam video{width:100%;height:100%;object-fit:cover;display:block}
/* cinematic scanning reticle */
.id-reticle{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;pointer-events:none}
.id-frame{width:46%;max-width:240px;aspect-ratio:3/2;position:relative}
.id-corner{position:absolute;width:26px;height:26px;border:3px solid var(--cyan);filter:drop-shadow(0 0 6px var(--cyan))}
.id-corner.tl{top:0;left:0;border-right:none;border-bottom:none;border-radius:6px 0 0 0}
.id-corner.tr{top:0;right:0;border-left:none;border-bottom:none;border-radius:0 6px 0 0}
.id-corner.bl{bottom:0;left:0;border-right:none;border-top:none;border-radius:0 0 0 6px}
.id-corner.br{bottom:0;right:0;border-left:none;border-top:none;border-radius:0 0 6px 0}
@keyframes idScan{0%{top:4%}100%{top:96%}}
.id-scanline{position:absolute;left:6%;right:6%;height:2px;background:linear-gradient(90deg,transparent,var(--cyan),transparent);box-shadow:0 0 12px var(--cyan);animation:idScan 2.4s var(--ease) infinite alternate;opacity:.85}
@keyframes idPulse{0%,100%{opacity:.4;transform:scale(1)}50%{opacity:1;transform:scale(1.04)}}
/* ===== SPOT REVEAL (rarity-scaled) ===== */
.sr-wrap{position:relative}
.sr-banner{display:flex;flex-direction:column;gap:2px;padding:12px 14px;border-radius:12px;background:rgba(255,255,255,.04);border:1px solid var(--border);animation:srBannerIn .28s cubic-bezier(.2,.9,.3,1.2) both}
@keyframes srBannerIn{from{opacity:0;transform:translateY(-10px)}to{opacity:1;transform:translateY(0)}}
.sr-card{position:relative;margin:14px auto 4px;width:210px;max-width:78%;aspect-ratio:5/7;border-radius:16px;overflow:hidden;transform-style:preserve-3d;will-change:transform,opacity}
.sr-card.flip{animation:srFlip .62s cubic-bezier(.2,.8,.25,1) both}
.sr-card.pop{animation:srPop .42s cubic-bezier(.2,.9,.3,1.3) both}
@keyframes srFlip{0%{opacity:0;transform:perspective(900px) rotateY(-92deg) scale(.9)}55%{opacity:1}100%{opacity:1;transform:perspective(900px) rotateY(0) scale(1)}}
@keyframes srPop{0%{opacity:0;transform:scale(.82)}100%{opacity:1;transform:scale(1)}}
.sr-card-inner{position:absolute;inset:0;display:flex;flex-direction:column;justify-content:space-between;padding:14px 13px;background:linear-gradient(160deg,rgba(255,255,255,.07),rgba(255,255,255,.02));overflow:hidden}
.sr-tier-chip{align-self:flex-start;font-family:'Orbitron',monospace;font-size:9px;letter-spacing:2px;padding:4px 9px;border-radius:20px;text-transform:uppercase;font-weight:700;max-width:100%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.sr-card .sr-emoji{font-size:52px;text-align:center;filter:drop-shadow(0 4px 14px rgba(0,0,0,.5));flex-shrink:0}
.sr-card .sr-name{font-family:'Orbitron',monospace;font-size:14px;font-weight:900;color:#fff;line-height:1.15;text-align:center;word-break:break-word;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
.sr-card .sr-sub{font-size:11px;color:var(--gold);text-align:center;margin-top:3px;word-break:break-word;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
.sr-card .sr-reg{font-family:'JetBrains Mono',monospace;font-size:9px;color:var(--text2);text-align:center;margin-top:4px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
/* tier finishes */
.sr-t-common{box-shadow:0 6px 22px rgba(0,0,0,.35);border:1px solid rgba(255,255,255,.14)}
.sr-t-uncommon{box-shadow:0 6px 26px rgba(52,211,153,.18);border:1px solid rgba(52,211,153,.45)}
.sr-t-rare{box-shadow:0 8px 30px rgba(34,211,238,.28);border:1px solid rgba(34,211,238,.6)}
.sr-t-epic{box-shadow:0 10px 40px rgba(168,85,247,.4);border:1px solid rgba(168,85,247,.75)}
.sr-t-legendary{box-shadow:0 12px 50px rgba(251,191,36,.5);border:1px solid rgba(251,191,36,.9)}
/* animated sheen for rare+ */
.sr-t-rare::after,.sr-t-epic::after,.sr-t-legendary::after{content:"";position:absolute;inset:0;background:linear-gradient(115deg,transparent 30%,rgba(255,255,255,.22) 48%,transparent 66%);transform:translateX(-120%);animation:srSheen 1.5s ease .35s 1}
.sr-t-epic::after{animation-iteration-count:2}
.sr-t-legendary::after{animation:srSheenLoop 2.4s ease .35s infinite}
@keyframes srSheen{to{transform:translateX(120%)}}
@keyframes srSheenLoop{0%{transform:translateX(-120%)}45%,100%{transform:translateX(120%)}}
.sr-card.shake{animation:srFlip .62s cubic-bezier(.2,.8,.25,1) both,srShake .5s ease .62s 1}
@keyframes srShake{0%,100%{transform:translateX(0)}20%{transform:translateX(-5px)}40%{transform:translateX(5px)}60%{transform:translateX(-3px)}80%{transform:translateX(3px)}}
.sr-stats{display:flex;justify-content:center;gap:16px;margin:12px 0 4px;animation:srPop .4s ease .2s both}
.sr-stat{text-align:center}
.sr-stat b{display:block;font-family:'Orbitron',monospace;font-size:18px;font-weight:900;color:#fff}
.sr-stat span{font-size:9px;text-transform:uppercase;letter-spacing:1px;color:var(--text2)}
.sr-flash{display:inline-block;font-family:'Orbitron',monospace;font-size:11px;font-weight:800;letter-spacing:1px;padding:6px 14px;border-radius:20px;margin:8px auto 0;animation:srFlashIn .45s cubic-bezier(.2,.9,.3,1.4) both}
@keyframes srFlashIn{0%{opacity:0;transform:scale(.6)}100%{opacity:1;transform:scale(1)}}
.sr-details{margin-top:14px;animation:srBannerIn .4s ease .3s both}
.id-frame.scanning .id-corner{animation:idPulse 1.4s ease-in-out infinite}

.id-badge-auto{position:absolute;top:12px;right:12px;display:none;align-items:center;gap:6px;background:rgba(0,255,127,0.14);border:1px solid rgba(0,255,127,0.45);color:var(--green);padding:5px 12px;border-radius:var(--r-pill);font-family:'JetBrains Mono',monospace;font-size:var(--fs-xs)}
.id-overlay{position:absolute;left:0;right:0;bottom:0;padding:18px 18px 16px;background:linear-gradient(transparent,rgba(0,0,0,0.92));display:none}
.id-ov-type{font-family:'Orbitron',monospace;font-size:var(--fs-md);color:#fff;font-weight:700}
.id-ov-detail{font-size:var(--fs-sm);color:var(--cyan);margin-top:3px}
.id-start{position:absolute;inset:0;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:var(--sp-3);background:radial-gradient(circle at 50% 40%,rgba(0,229,255,0.08),rgba(0,0,0,0.82))}
.id-start .id-bigicon{font-size:54px;filter:drop-shadow(0 0 20px rgba(0,229,255,0.4))}
.id-tap{position:absolute;inset:0;cursor:crosshair}
.id-controls{display:flex;gap:8px;padding:10px;background:rgba(255,255,255,0.03)}
.id-controls button{flex:1;padding:12px;border-radius:var(--r-md);font-family:'Orbitron',monospace;font-size:var(--fs-xs);letter-spacing:1px;cursor:pointer;transition:all var(--t-med) var(--ease)}

/* three little selling-point cards under the stage */
.id-points{display:grid;grid-template-columns:repeat(3,1fr);gap:var(--sp-3);max-width:760px;margin:var(--sp-5) auto 0}
.id-point{background:linear-gradient(160deg,rgba(255,255,255,0.045),rgba(255,255,255,0.015));border:1px solid rgba(255,255,255,0.08);border-radius:var(--r-md);padding:var(--sp-4);text-align:center;transition:transform var(--t-med) var(--ease),border-color var(--t-med) var(--ease)}
.id-point:hover{transform:translateY(-3px);border-color:var(--border2)}
.id-point .ic{font-size:24px;margin-bottom:8px}
.id-point .t{font-family:'Orbitron',monospace;font-size:var(--fs-sm);color:#fff;margin-bottom:4px}
.id-point .d{font-size:var(--fs-xs);color:var(--text2);line-height:1.5}
@media(max-width:560px){.id-points{grid-template-columns:1fr}}
/* ============================================================
   PREMIUM LANDING PAGE - Flighty-inspired, dark + glow
   ============================================================ */
.lp-hero{min-height:100vh;display:flex;flex-direction:column;align-items:center;justify-content:center;text-align:center;position:relative;overflow:hidden;padding:90px var(--gutter) 60px}
.lp-hero-bg{position:absolute;inset:0;z-index:0;pointer-events:none;overflow:hidden}
.lp-orb{position:absolute;border-radius:50%;filter:blur(40px)}
.lp-orb.a{width:560px;height:560px;top:-200px;left:50%;transform:translateX(-50%);background:radial-gradient(circle,rgba(0,229,255,0.14),transparent 62%)}
.lp-orb.b{width:480px;height:480px;bottom:-180px;right:-120px;background:radial-gradient(circle,rgba(46,123,255,0.12),transparent 62%)}
.lp-grid-floor{position:absolute;left:-50%;right:-50%;bottom:-10%;height:60%;
  background-image:linear-gradient(rgba(0,229,255,0.08) 1px,transparent 1px),linear-gradient(90deg,rgba(0,229,255,0.08) 1px,transparent 1px);
  background-size:50px 50px;transform:perspective(420px) rotateX(62deg);transform-origin:center bottom;animation:premDrift 26s ease-in-out infinite;opacity:.5}
.lp-hero-inner{position:relative;z-index:2;max-width:860px}
.lp-h1{font-family:'Orbitron',monospace;font-weight:900;line-height:1.05;margin:var(--sp-4) 0 var(--sp-4)}
.lp-h1-l1{display:block;font-size:clamp(13px,1.6vw,18px);letter-spacing:4px;color:var(--text2);font-weight:600;margin-bottom:var(--sp-3)}
.lp-h1-l2{display:block;font-size:clamp(34px,6.5vw,76px);letter-spacing:1px;
  background:linear-gradient(180deg,#fff 30%,var(--cyan));-webkit-background-clip:text;-webkit-text-fill-color:transparent;
  filter:drop-shadow(0 0 30px rgba(0,229,255,0.35))}
.lp-hero-sub{font-size:clamp(15px,1.7vw,19px);color:#8aa6c4;max-width:600px;margin:0 auto var(--sp-6);line-height:1.7;font-weight:400}
.lp-hero-btns{display:flex;gap:var(--sp-3);justify-content:center;flex-wrap:wrap}
.lp-btn{font-family:'Orbitron',monospace;font-weight:700;font-size:var(--fs-sm);letter-spacing:.5px;cursor:pointer;padding:15px 28px;border-radius:var(--r-md);transition:transform var(--t-fast) var(--ease),box-shadow var(--t-med) var(--ease),background var(--t-med);position:relative;overflow:hidden}
.lp-btn-primary{border:none;color:#001016;background:linear-gradient(135deg,var(--cyan),var(--blue));box-shadow:0 0 26px rgba(0,229,255,0.4)}
.lp-btn-primary:hover{transform:translateY(-3px);box-shadow:0 0 42px rgba(0,229,255,0.6)}
.lp-btn-ghost{background:rgba(255,255,255,0.04);border:1px solid var(--border2);color:var(--text)}
.lp-btn-ghost:hover{transform:translateY(-3px);background:rgba(0,229,255,0.08)}
.lp-hero-stats{display:flex;align-items:center;justify-content:center;gap:var(--sp-5);margin-top:var(--sp-7)}
.lp-hs-num{font-family:'Orbitron',monospace;font-weight:800;font-size:clamp(22px,3vw,32px);background:linear-gradient(135deg,#fff,var(--cyan));-webkit-background-clip:text;-webkit-text-fill-color:transparent}
.lp-hs-lbl{font-size:var(--fs-xs);letter-spacing:1px;color:var(--text2);text-transform:uppercase;margin-top:4px}
.lp-hs-div{width:1px;height:36px;background:linear-gradient(180deg,transparent,var(--border2),transparent)}

/* Social-proof strip */
.lp-strip{text-align:center;padding:var(--sp-9) var(--gutter);position:relative;z-index:1}
.lp-strip-quote{font-family:'Orbitron',monospace;font-weight:700;font-size:clamp(22px,3.5vw,40px);line-height:1.3;color:#eaf6ff}
.lp-strip-sub{color:var(--text2);margin-top:var(--sp-4);font-size:var(--fs-md)}

/* Feature sections */
.lp-feature{padding:var(--sp-8) var(--gutter);position:relative;z-index:1}
.lp-feature.alt{background:linear-gradient(180deg,transparent,rgba(0,229,255,0.025),transparent)}
.lp-feature-inner{max-width:var(--container);margin:0 auto}
.lp-feature-split{display:grid;grid-template-columns:1fr 1fr;gap:var(--sp-7);align-items:center}
.lp-feature-split.reverse .lp-feature-text{order:2}
.lp-eyebrow{font-family:'JetBrains Mono',monospace;font-size:var(--fs-xs);letter-spacing:3px;text-transform:uppercase;color:var(--cyan);margin-bottom:var(--sp-3)}
.lp-feature-h{font-family:'Orbitron',monospace;font-weight:900;font-size:clamp(28px,4vw,52px);line-height:1.08;margin-bottom:var(--sp-4);text-shadow:0 0 30px rgba(0,229,255,0.15)}
.lp-feature-p{color:#8aa6c4;font-size:var(--fs-md);line-height:1.7;margin-bottom:var(--sp-5);max-width:46ch}
/* scanner visual */
.lp-feature-visual{display:flex;align-items:center;justify-content:center}
.lp-scanbox{width:100%;max-width:380px;aspect-ratio:4/3;position:relative;border-radius:var(--r-xl);border:1px solid rgba(0,229,255,0.3);background:linear-gradient(160deg,rgba(0,229,255,0.06),rgba(0,18,28,0.4));box-shadow:0 0 50px rgba(0,229,255,0.16),inset 0 0 40px rgba(0,229,255,0.04);backdrop-filter:blur(6px);overflow:hidden}
.lp-cn{position:absolute;width:28px;height:28px;border:2.5px solid var(--cyan);filter:drop-shadow(0 0 7px var(--cyan))}
.lp-cn.tl{top:24px;left:24px;border-right:none;border-bottom:none}.lp-cn.tr{top:24px;right:24px;border-left:none;border-bottom:none}
.lp-cn.bl{bottom:24px;left:24px;border-right:none;border-top:none}.lp-cn.br{bottom:24px;right:24px;border-left:none;border-top:none}
.lp-scanline{position:absolute;left:10%;right:10%;height:2px;background:linear-gradient(90deg,transparent,var(--cyan),transparent);box-shadow:0 0 14px var(--cyan);animation:lpScan 2.6s cubic-bezier(.4,0,.2,1) infinite alternate}
@keyframes lpScan{from{top:14%}to{top:86%}}
.lp-scan-readout{position:absolute;bottom:16px;left:18px;right:18px;display:flex;justify-content:space-between;font-family:'JetBrains Mono',monospace;font-size:var(--fs-xs);color:var(--cyan);letter-spacing:1px}
/* map visual */
.lp-mapbox{width:100%;max-width:380px;aspect-ratio:4/3;position:relative;border-radius:var(--r-xl);border:1px solid rgba(46,123,255,0.3);background:radial-gradient(circle at 50% 50%,rgba(46,123,255,0.08),rgba(0,8,18,0.6));box-shadow:0 0 50px rgba(46,123,255,0.14);overflow:hidden}
.lp-mapdot{position:absolute;width:8px;height:8px;border-radius:50%;background:var(--cyan);box-shadow:0 0 10px var(--cyan);animation:pulse 2s ease-in-out infinite}
.lp-mapdot:nth-child(2){animation-delay:.4s}.lp-mapdot:nth-child(3){animation-delay:.8s}.lp-mapdot:nth-child(4){animation-delay:1.2s}.lp-mapdot:nth-child(5){animation-delay:1.6s}
.lp-map-label{position:absolute;bottom:16px;left:0;right:0;text-align:center;font-family:'JetBrains Mono',monospace;font-size:var(--fs-xs);color:var(--cyan);letter-spacing:1px}

/* 3-up feature cards */
.lp-grid3{max-width:var(--container);margin:0 auto;display:grid;grid-template-columns:repeat(3,1fr);gap:var(--sp-4)}
.lp-fcard{background:linear-gradient(160deg,rgba(255,255,255,0.05),rgba(255,255,255,0.015));border:1px solid rgba(255,255,255,0.09);border-radius:var(--r-lg);padding:var(--sp-6) var(--sp-5);cursor:pointer;transition:transform var(--t-med) var(--ease),border-color var(--t-med),box-shadow var(--t-med)}
.lp-fcard:hover{transform:translateY(-6px);border-color:var(--border2);box-shadow:0 18px 44px rgba(0,0,0,0.4),0 0 30px rgba(0,229,255,0.1)}
.lp-fcard-ic{font-size:34px;margin-bottom:var(--sp-3)}
.lp-fcard h3{font-family:'Orbitron',monospace;font-size:var(--fs-md);margin-bottom:var(--sp-2);color:#fff}
.lp-fcard p{color:var(--text2);font-size:var(--fs-sm);line-height:1.6}

/* Final CTA */
.lp-cta{padding:var(--sp-9) var(--gutter);text-align:center;position:relative;z-index:1}
.lp-cta-inner{max-width:680px;margin:0 auto;background:linear-gradient(160deg,rgba(0,229,255,0.06),rgba(46,123,255,0.04));border:1px solid var(--border2);border-radius:var(--r-xl);padding:var(--sp-8) var(--sp-5);box-shadow:0 0 60px rgba(0,229,255,0.1)}
.lp-cta-h{font-family:'Orbitron',monospace;font-weight:900;font-size:clamp(32px,5vw,60px);line-height:1.05;margin-bottom:var(--sp-3)}
.lp-cta-p{color:#8aa6c4;font-size:var(--fs-md);margin-bottom:var(--sp-6)}

@media(max-width:760px){
  .lp-feature-split{grid-template-columns:1fr;gap:var(--sp-5)}
  .lp-feature-split.reverse .lp-feature-text{order:0}
  .lp-grid3{grid-template-columns:1fr}
  .lp-hero-stats{gap:var(--sp-4)}
}
/* ============================================================
   SCROLL COLOR-SHIFT BACKGROUND (Flighty-style)
   ============================================================ */
#lp-colorbg{position:fixed;inset:0;z-index:0;pointer-events:none;transition:background 1.1s cubic-bezier(.4,0,.2,1);
  background:radial-gradient(120% 100% at 50% 0%,#0a0420,#070a12)}
/* stage palettes */
body[data-lpstage="0"] #lp-colorbg{background:radial-gradient(120% 100% at 50% 0%,#13082e,#070a12)}
body[data-lpstage="1"] #lp-colorbg{background:radial-gradient(120% 100% at 50% 0%,#0a1838,#07101f)}
body[data-lpstage="2"] #lp-colorbg{background:radial-gradient(120% 100% at 50% 20%,#06243a,#070f1c)}
body[data-lpstage="3"] #lp-colorbg{background:radial-gradient(120% 100% at 50% 30%,#1a0a3a,#0a0620)}
body[data-lpstage="4"] #lp-colorbg{background:radial-gradient(120% 100% at 50% 40%,#2a0e3e,#0e0622)}
body[data-lpstage="5"] #lp-colorbg{background:radial-gradient(120% 100% at 50% 60%,#3a1048,#120726)}
/* floating glow blobs that also drift */
#lp-colorbg::before{content:'';position:absolute;width:60vw;height:60vw;border-radius:50%;top:-20vw;left:-10vw;
  background:radial-gradient(circle,rgba(168,85,247,0.18),transparent 60%);filter:blur(40px);animation:premDrift 24s ease-in-out infinite}
#lp-colorbg::after{content:'';position:absolute;width:50vw;height:50vw;border-radius:50%;bottom:-15vw;right:-10vw;
  background:radial-gradient(circle,rgba(34,211,238,0.16),transparent 60%);filter:blur(40px);animation:premDrift 30s ease-in-out infinite reverse}

/* ============================================================
   PREMIUM PHONE MOCKUP - realistic glass + titanium render
   ============================================================ */
.lp-phone{position:relative;width:288px;max-width:78vw;aspect-ratio:9/19.5;margin:0 auto;
  border-radius:46px;
  /* titanium metal frame: layered gradients for brushed-metal edge */
  background:
    linear-gradient(135deg,#3a4252 0%,#1a1f2b 18%,#0c0f17 50%,#1a1f2b 82%,#3a4252 100%);
  padding:7px;
  box-shadow:
    0 40px 90px rgba(0,0,0,0.7),
    0 10px 30px rgba(0,0,0,0.5),
    0 0 0 1px rgba(255,255,255,0.10),
    0 0 70px rgba(138,227,255,0.18),
    inset 0 1px 1px rgba(255,255,255,0.25),
    inset 0 -2px 4px rgba(0,0,0,0.6);
  transform:perspective(1400px) rotateY(-14deg) rotateX(5deg);transform-style:preserve-3d;transition:transform .7s var(--ease)}
.lp-phone:hover{transform:perspective(1400px) rotateY(-5deg) rotateX(2deg)}
/* inner bezel (black rim between metal and screen) */
.lp-phone::before{content:'';position:absolute;inset:5px;border-radius:42px;background:#04060c;z-index:1}
/* glossy diagonal glass reflection sweeping across the whole device */
.lp-phone::after{content:'';position:absolute;inset:0;border-radius:46px;z-index:5;pointer-events:none;
  background:linear-gradient(125deg,rgba(255,255,255,0.18) 0%,rgba(255,255,255,0.04) 18%,transparent 38%,transparent 70%,rgba(255,255,255,0.06) 100%)}
/* Dynamic-Island notch */
.lp-phone-notch{position:absolute;top:18px;left:50%;transform:translateX(-50%);width:32%;height:24px;background:#000;border-radius:20px;z-index:6;
  box-shadow:inset 0 0 4px rgba(255,255,255,0.08)}
.lp-phone-notch::after{content:'';position:absolute;right:14px;top:50%;transform:translateY(-50%);width:7px;height:7px;border-radius:50%;
  background:radial-gradient(circle at 35% 35%,#2a3a5a,#05080f);box-shadow:0 0 3px rgba(80,140,220,0.5)}
.lp-phone-screen{position:relative;z-index:2;width:100%;height:100%;border-radius:40px;overflow:hidden;
  background:linear-gradient(180deg,#0a0e1a,#0e1322);display:flex;flex-direction:column;
  box-shadow:inset 0 0 30px rgba(0,0,0,0.5)}
/* soft screen glare highlight over the UI */
.lp-phone-screen::after{content:'';position:absolute;top:0;left:0;right:0;height:55%;z-index:4;pointer-events:none;
  background:linear-gradient(160deg,rgba(255,255,255,0.10),transparent 70%)}
.lp-ph-status{display:flex;justify-content:space-between;align-items:center;padding:16px 22px 6px;font-family:'JetBrains Mono',monospace;font-size:11px;color:#cfe;position:relative;z-index:3}
.lp-ph-body{flex:1;padding:14px;display:flex;flex-direction:column;gap:10px;overflow:hidden;position:relative;z-index:3}
.lp-ph-title{font-family:'Orbitron',monospace;font-size:15px;color:#fff;font-weight:700}
.lp-ph-card{background:linear-gradient(160deg,rgba(255,255,255,0.07),rgba(255,255,255,0.02));border:1px solid rgba(255,255,255,0.09);border-radius:12px;padding:11px;box-shadow:0 2px 8px rgba(0,0,0,0.3)}
.lp-ph-route{display:flex;justify-content:space-between;align-items:center}
.lp-ph-iata{font-family:'Orbitron',monospace;font-weight:800;font-size:18px;color:#fff}
.lp-ph-time{font-family:'Orbitron',monospace;font-size:13px}
.lp-ph-mini{font-size:10px;color:var(--text2);margin-top:3px}
.lp-ph-badge{display:inline-block;font-size:9px;font-weight:700;padding:3px 8px;border-radius:8px;background:rgba(70,229,176,0.16);color:var(--green)}
.lp-ph-map{flex:1;border-radius:12px;background:radial-gradient(circle at 40% 40%,rgba(59,130,246,0.2),rgba(10,8,30,0.6));border:1px solid rgba(255,255,255,0.06);position:relative;overflow:hidden;min-height:90px}
.lp-ph-map .d{position:absolute;width:7px;height:7px;border-radius:50%;background:var(--cyan);box-shadow:0 0 8px var(--cyan);animation:pulse 2s infinite}
@media(max-width:760px){.lp-phone{transform:none}.lp-phone:hover{transform:none}}

/* Real screenshot phone mockups */
.lp-shot{width:100%;max-width:330px;height:auto;display:block;margin:0 auto;border-radius:30px;
  filter:drop-shadow(0 30px 60px rgba(0,0,0,0.55)) drop-shadow(0 0 50px rgba(138,227,255,0.18));
  transform:perspective(1400px) rotateY(-12deg) rotateX(4deg);transition:transform .7s var(--ease)}
.lp-shot:hover{transform:perspective(1400px) rotateY(-3deg) rotateX(2deg)}
.lp-shot.flip{transform:perspective(1400px) rotateY(12deg) rotateX(4deg)}
.lp-shot.flip:hover{transform:perspective(1400px) rotateY(3deg) rotateX(2deg)}
@media(max-width:760px){.lp-shot,.lp-shot.flip{transform:none}.lp-shot:hover,.lp-shot.flip:hover{transform:none}}
/* ============================================================
   AIRCRAFT TRADING CARDS - FIFA-style rated, shareable
   ============================================================ */
.tc{position:relative;border-radius:18px;padding:18px 16px 16px;overflow:hidden;
  background:linear-gradient(165deg,#1b2233,#0c1019);border:1px solid rgba(255,255,255,0.1);
  box-shadow:0 10px 30px rgba(0,0,0,0.4);transition:transform var(--t-med) var(--ease),box-shadow var(--t-med) var(--ease);
  display:flex;flex-direction:column;align-items:center;min-height:300px}
.tc:hover{transform:translateY(-6px) scale(1.02);box-shadow:0 20px 50px rgba(0,0,0,0.5)}
/* rarity skins */
.tc-common{background:linear-gradient(165deg,#222a3a,#0e131d);border-color:rgba(150,170,200,0.25)}
.tc-rare{background:linear-gradient(165deg,#10324a,#08131f);border-color:rgba(91,141,239,0.45);box-shadow:0 10px 30px rgba(91,141,239,0.18)}
.tc-epic{background:linear-gradient(165deg,#2a1448,#120726);border-color:rgba(168,85,247,0.5);box-shadow:0 10px 34px rgba(168,85,247,0.22)}
.tc-legend{background:linear-gradient(165deg,#3a2c08,#1a1304);border-color:rgba(232,197,122,0.6);box-shadow:0 12px 40px rgba(232,197,122,0.28)}
.tc-legend::before{content:'';position:absolute;inset:0;background:linear-gradient(135deg,transparent 40%,rgba(255,215,120,0.12) 50%,transparent 60%);pointer-events:none}
.tc-top{display:flex;justify-content:space-between;align-items:flex-start;width:100%}
.tc-ovr{text-align:center;line-height:1}
.tc-ovr-num{font-family:'Orbitron',monospace;font-weight:900;font-size:34px;color:#fff;text-shadow:0 0 14px rgba(255,255,255,0.3)}
.tc-legend .tc-ovr-num{color:#FFE9A8;text-shadow:0 0 16px rgba(255,215,120,0.6)}
.tc-ovr-lbl{font-family:'Orbitron',monospace;font-size:9px;letter-spacing:2px;color:var(--text2);margin-top:-2px}
.tc-rarity{font-family:'Orbitron',monospace;font-size:9px;font-weight:700;letter-spacing:1.5px;padding:4px 9px;border-radius:8px}
.tc-r-common{background:rgba(150,170,200,0.18);color:#b8c6db}
.tc-r-rare{background:rgba(91,141,239,0.2);color:#9cc0ff}
.tc-r-epic{background:rgba(168,85,247,0.22);color:#d9b3ff}
.tc-r-legend{background:rgba(232,197,122,0.22);color:#ffe2a3}
.tc-emblem{font-size:58px;margin:8px 0 6px;filter:drop-shadow(0 6px 14px rgba(0,0,0,0.4))}
.tc-name{font-family:'Orbitron',monospace;font-weight:800;font-size:16px;color:#fff;text-align:center;line-height:1.2}
.tc-airline{font-size:12px;color:var(--text2);text-align:center;margin-top:3px;margin-bottom:12px}
.tc-stats{display:flex;gap:0;width:100%;border-top:1px solid rgba(255,255,255,0.1);border-bottom:1px solid rgba(255,255,255,0.1);padding:10px 0;margin-top:auto}
.tc-stat{flex:1;text-align:center;border-right:1px solid rgba(255,255,255,0.08)}
.tc-stat:last-child{border-right:none}
.tc-stat-v{display:block;font-family:'Orbitron',monospace;font-weight:800;font-size:18px;color:#fff}
.tc-legend .tc-stat-v{color:#FFE9A8}
.tc-stat-k{display:block;font-size:8px;letter-spacing:1.5px;color:var(--text2);margin-top:2px}
.tc-foot{display:flex;justify-content:space-between;width:100%;margin-top:10px;font-family:'JetBrains Mono',monospace;font-size:10px;color:var(--text2)}
.tc-reg{color:var(--cyan);font-weight:600}
.tc-share{margin-top:12px;width:100%;padding:9px;border:none;border-radius:10px;cursor:pointer;
  font-family:'Orbitron',monospace;font-size:10px;letter-spacing:1px;font-weight:700;
  background:linear-gradient(135deg,var(--cyan),var(--blue));color:#001016;transition:transform var(--t-fast) var(--ease),box-shadow var(--t-med)}
.tc-share:hover{transform:translateY(-2px);box-shadow:0 0 20px rgba(0,229,255,0.4)}
.tc-share:disabled{opacity:.6;cursor:wait}
#lbGrid{display:grid;grid-template-columns:repeat(auto-fill,minmax(190px,1fr));gap:16px}

#jsLine</styleUrl>');
  L.push('      <LineString>');
  L.push('        <extrude>1</extrude>');
  L.push('        <tessellate>1</tessellate>');
  L.push('        <altitudeMode>absolute</altitudeMode>');
  L.push('        <coordinates>');
  L.push('          '+coords);
  L.push('        </coordinates>');
  L.push('      </LineString>');
  L.push('    </Placemark>');
  if(first){L.push('    <Placemark><name>'+_jaiXmlEsc(cs)+' \u2014 start</name><styleUrl>#jsStart</styleUrl><Point><altitudeMode>absolute</altitudeMode><coordinates>'+first.lon+','+first.lat+','+_jaiFt2m(first.alt)+'</coordinates></Point></Placemark>');}
  if(last){L.push('    <Placemark><name>'+_jaiXmlEsc(cs)+' \u2014 latest</name><styleUrl>#jsEnd</styleUrl><description><![CDATA[Altitude: '+(last.alt!=null?last.alt.toLocaleString()+' ft':'\u2014')+'<br/>Speed: '+(last.spd!=null?last.spd+' kt':'\u2014')+'<br/>Heading: '+(last.trk!=null?last.trk+'\u00B0':'\u2014')+']]></description><Point><altitudeMode>absolute</altitudeMode><coordinates>'+last.lon+','+last.lat+','+_jaiFt2m(last.alt)+'</coordinates></Point></Placemark>');}
  L.push('  </Document>');
  L.push('</kml>');
  return L.join('\n');
}
function jaiTrailCSV(f,arr){
  const cs=((f&&f[1]||'').trim()).toUpperCase();
  const hex=((f&&f[0])||'').toString().toUpperCase();
  let out='time,callsign,icao24,latitude,longitude,altitude_ft,speed_kt,heading_deg\n';
  arr.forEach(p=>{out+=[new Date(p.t).toISOString(),cs,hex,p.lat,p.lon,(p.alt==null?'':p.alt),(p.spd==null?'':p.spd),(p.trk==null?'':p.trk)].join(',')+'\n';});
  return out;
}
function jaiSnapshotKML(list){
  var band=function(ft){return ft>=30000?'#acHigh':(ft>=10000?'#acMid':'#acLow');};
  var L=[];
  L.push('<?xml version="1.0" encoding="UTF-8"?>');
  L.push('<kml xmlns="http://www.opengis.net/kml/2.2">');
  L.push('  <Document>');
  L.push('    <name>JetStream Live \u2014 Live Aircraft Snapshot</name>');
  L.push('    <description><![CDATA[Live aircraft exported from JetStream Live \u00B7 '+list.length+' aircraft \u00B7 '+new Date().toLocaleString()+']]></description>');
  ['acHigh:ffff772d','acMid:ff22d3ee','acLow:ff66dd37'].forEach(function(s){var p=s.split(':');
    L.push('    <Style id="'+p[0]+'"><IconStyle><color>'+p[1]+'</color><scale>1.0</scale><Icon><href>http://maps.google.com/mapfiles/kml/shapes/airports.png</href></Icon></IconStyle><LabelStyle><scale>0.7</scale></LabelStyle></Style>');});
  L.push('    <Folder>');
  L.push('      <name>Live aircraft ('+list.length+')</name>');
  list.forEach(function(f){
    var cs=((f[1]||'').trim()).toUpperCase();
    if(!cs||/^0+$/.test(cs))cs=((f[0]||'').toString().toUpperCase())||'UNKNOWN';
    var altft=f[7]?Math.round(f[7]*3.281):null;
    var spd=f[9]?Math.round(f[9]*1.944):null;
    var hdg=f[10]!=null?Math.round(f[10]):null;
    var cty=(f[2]||'').toString().trim();
    L.push('      <Placemark>');
    L.push('        <name>'+_jaiXmlEsc(cs)+'</name>');
    L.push('        <description><![CDATA[Altitude: '+(altft!=null?altft.toLocaleString()+' ft':'\u2014')+'<br/>Speed: '+(spd!=null?spd+' kt':'\u2014')+'<br/>Heading: '+(hdg!=null?hdg+'\u00B0':'\u2014')+(cty?'<br/>Country: '+_jaiXmlEsc(cty):'')+']]></description>');
    L.push('        <styleUrl>'+band(altft||0)+'</styleUrl>');
    L.push('        <Point><extrude>1</extrude><altitudeMode>absolute</altitudeMode><coordinates>'+f[5]+','+f[6]+','+_jaiFt2m(altft||0)+'</coordinates></Point>');
    L.push('      </Placemark>');
  });
  L.push('    </Folder>');
  L.push('  </Document>');
  L.push('</kml>');
  return L.join('\n');
}
function jaiSnapshotCSV(list){
  let out='callsign,icao24,latitude,longitude,altitude_ft,speed_kt,heading_deg,origin_country,on_ground\n';
  list.forEach(f=>{
    const cs=((f[1]||'').trim()).toUpperCase();
    const cty='"'+((f[2]||'').toString().replace(/"/g,''))+'"';
    out+=[cs,((f[0]||'').toString().toUpperCase()),f[6],f[5],(f[7]?Math.round(f[7]*3.281):''),(f[9]?Math.round(f[9]*1.944):''),(f[10]!=null?Math.round(f[10]):''),cty,(f[8]?'yes':'no')].join(',')+'\n';
  });
  return out;
}
function jaiTryExport(q){
  const isExport=/(give|want|need|get|download|export|send|make|generate|provide|share|grab)\s+.*\b(kml|csv|gpx)\b|\b(kml|csv|gpx)\b\s*(file|export|download|of this|of that|please|now|pls)|^\s*(kml|csv|gpx)\b|\b(export|download)\b.*\b(flight|aircraft|plane|data|track|trail|map)\b/i.test(q);
  if(!isExport)return false;
  const wantKml=/kml|gpx/i.test(q), wantCsv=/csv/i.test(q), both=!wantKml&&!wantCsv;
  const f=(typeof activeFlight!=='undefined')?activeFlight:null;
  const arr=f?((typeof trailStore!=='undefined'&&trailStore[((f[0]||'').toString().toUpperCase())])||[]):[];
  const files=[];
  if(f&&arr.length){
    const cs=(((f[1]||'').trim()).toUpperCase())||'flight';
    if(wantKml||both)files.push({name:cs+'_track.kml',mime:'application/vnd.google-earth.kml+xml',text:jaiTrailKML(f,arr)});
    if(wantCsv||both)files.push({name:cs+'_track.csv',mime:'text/csv',text:jaiTrailCSV(f,arr)});
    jaiAddDownloads('Here you go \u2708 \u2014 the '+(both?'KML and CSV':(wantCsv&&!wantKml?'CSV':'KML'))+' for '+cs+' ('+arr.length+' track point'+(arr.length===1?'':'s')+'). Open the KML in Google Earth to replay the path.',files);
    jaiHistory.push({role:'ai',text:'[Provided '+files.map(x=>x.name).join(' + ')+']'});
    return true;
  }
  let list=(typeof allFlights!=='undefined')?allFlights.filter(x=>x[1]&&x[5]!=null&&x[6]!=null).slice(0,500):[];
  if(!list.length){
    jaiAddMsg('ai',"I can export KML/CSV straight from our live data \u2014 but no aircraft are loaded yet. Open the Live Map (or tap a specific flight) and ask me again, and I'll build the file from what's on screen.");
    jaiHistory.push({role:'ai',text:'[No data to export yet]'});
    return true;
  }
  if(wantKml||both)files.push({name:'jetstream_live_aircraft.kml',mime:'application/vnd.google-earth.kml+xml',text:jaiSnapshotKML(list)});
  if(wantCsv||both)files.push({name:'jetstream_live_aircraft.csv',mime:'text/csv',text:jaiSnapshotCSV(list)});
  jaiAddDownloads('Here you go \u2708 \u2014 a '+(both?'KML and CSV':(wantCsv&&!wantKml?'CSV':'KML'))+' snapshot of the '+list.length+' aircraft live on our servers right now. Tip: tap a specific flight first and I\'ll export just that flight\'s track.',files);
  jaiHistory.push({role:'ai',text:'[Provided '+files.map(x=>x.name).join(' + ')+']'});
  return true;
}

async function jaiSend(){
  const inp=document.getElementById('jaiInput');if(!inp)return;
  const q=(inp.value||'').trim();if(!q)return;
  inp.value='';
  jaiAddMsg('user',q);
  jaiHistory.push({role:'user',text:q});
  if(jaiTryExport(q))return;
  const body=document.getElementById('jaiBody');
  const typing=document.createElement('div');typing.className='jai-typing';typing.textContent='JetStream AI is typing...';
  body.appendChild(typing);body.scrollTop=body.scrollHeight;
  // Build a single prompt: system + recent history
  let convo=JAI_SYSTEM+'\n\nConversation so far:\n';
  jaiHistory.slice(-8).forEach(m=>{convo+=(m.role==='user'?'User: ':'JetStream AI: ')+m.text+'\n';});
  convo+='JetStream AI:';
  let ans=null;
  try{ans=await callGemini(convo);}catch(e){}
  typing.remove();
  if(!ans){ans="Sorry, I couldn't reach my brain just now - please try again in a moment.";}
  ans=ans.trim();
  jaiAddMsg('ai',ans);
  jaiHistory.push({role:'ai',text:ans});
}

function predictDelay(){
  const fl=(document.getElementById('d-flight').value||'').trim().toUpperCase();
  if(!fl){alert('Please enter a flight number');return;}
  const dateVal=document.getElementById('d-date').value||new Date().toISOString().split('T')[0];
  const res=document.getElementById('delayResult');
  res.style.display='block';res.classList.add('show');
  res.innerHTML='<div style="text-align:center;padding:24px"><div class="spinner" style="margin:0 auto 12px"></div><div class="orb f12 tc-muted">Analysing '+fl+' with live signals...</div></div>';

  const now=new Date();
  const hour=now.getHours();
  const min=now.getMinutes();
  const day=now.toLocaleDateString('en-US',{weekday:'long'});
  const month=now.toLocaleDateString('en-US',{month:'long'});
  const dateObj=new Date(dateVal);
  const isPeak=((hour>=6&&hour<=9)||(hour>=17&&hour<=20));
  const isWeekend=(dateObj.getDay()===0||dateObj.getDay()===6);
  const isHoliday=(dateObj.getMonth()===11||dateObj.getMonth()===0||dateObj.getMonth()===5||dateObj.getMonth()===6);
  const airlineMap={
    'EK':'Emirates','QR':'Qatar Airways','EY':'Etihad Airways','FZ':'flydubai','WY':'Oman Air','GF':'Gulf Air','SV':'Saudia','MS':'EgyptAir','AT':'Royal Air Maroc','KQ':'Kenya Airways',
    'AI':'Air India','6E':'IndiGo','SG':'SpiceJet','UK':'Vistara','IX':'Air India Express','QP':'Akasa Air','G8':'Go First','9W':'Jet Airways',
    'BA':'British Airways','VS':'Virgin Atlantic','U2':'easyJet','FR':'Ryanair','BE':'Flybe','LS':'Jet2','TOM':'TUI Airways',
    'LH':'Lufthansa','LX':'Swiss','OS':'Austrian','SN':'Brussels Airlines','SK':'SAS','AY':'Finnair','DY':'Norwegian',
    'AF':'Air France','KL':'KLM','IB':'Iberia','VY':'Vueling','TP':'TAP Portugal','A3':'Aegean','TK':'Turkish Airlines',
    'SQ':'Singapore Airlines','MH':'Malaysia Airlines','TG':'Thai Airways','GA':'Garuda Indonesia','VN':'Vietnam Airlines','PR':'Philippine Airlines','CX':'Cathay Pacific',
    'JL':'Japan Airlines','NH':'ANA','KE':'Korean Air','OZ':'Asiana','CI':'China Airlines','BR':'EVA Air','CZ':'China Southern','CA':'Air China','MU':'China Eastern',
    'QF':'Qantas','VA':'Virgin Australia','NZ':'Air New Zealand','FJ':'Fiji Airways',
    'AA':'American Airlines','UA':'United Airlines','DL':'Delta Air Lines','WN':'Southwest','B6':'JetBlue','AS':'Alaska Airlines','F9':'Frontier','NK':'Spirit',
    'AC':'Air Canada','WS':'WestJet','AM':'Aeromexico','LA':'LATAM','G3':'Gol','AD':'Azul',
    'ET':'Ethiopian Airlines','SA':'South African Airways','MS':'EgyptAir','AT':'Royal Air Maroc',
    'SU':'Aeroflot','PS':'Ukraine International','LO':'LOT Polish','OK':'Czech Airlines','RO':'Tarom',
    'AZ':'ITA Airways','FR':'Ryanair','VY':'Vueling','HV':'Transavia','PC':'Pegasus','EW':'Eurowings','W6':'Wizz Air','VZ':'Thai Vietjet','HX':'Hong Kong Airlines',
    'BI':'Royal Brunei','MF':'Xiamen Airlines','ZH':'Shenzhen Airlines','HU':'Hainan Airlines',
    'BT':'airBaltic','WF':'Wideroe','OG':'PLAY','TO':'Transavia France','BJ':'Nouvelair',
    'PK':'Pakistan International','TV':'TV Azteca','8M':'Myanmar Airways','UB':'Myanmar National',
    'KU':'Kuwait Airways','RJ':'Royal Jordanian','ME':'Middle East Airlines','WB':'RwandAir',
    'TC':'Air Tanzania','PW':'Precision Air','UT':'UTair','S7':'S7 Airlines','DP':'Pobeda',
    'U6':'Ural Airlines','FV':'Rossiya','5N':'Nordavia','FZ':'flydubai','XY':'flynas',
    '3L':'Air Arabia Abu Dhabi','G9':'Air Arabia','J9':'Jazeera Airways','UJ':'AlMasria',
    'AK':'AirAsia','QZ':'Indonesia AirAsia','D7':'AirAsia X','FD':'Thai AirAsia',
    'OD':'Batik Air Malaysia','ID':'Batik Air','IN':'Nam Air','IU':'Super Air Jet',
    'SL':'Thai Lion Air','JT':'Lion Air','YJ':'Asian Wings','VQ':'Nolinor Aviation'
  };
  const prefix=fl.replace(/[0-9]/g,'').slice(0,2);
  // Prefer the app-wide airline resolver (226-airline ICAO map + IATA fallback,
  // same one the live map uses); fall back to the local IATA map, then Unknown.
  let airline=airlineFromCS(fl);
  if(!airline||airline===fl) airline=airlineMap[prefix]||'';
  if(!airline) airline='Unknown Airline';
  const liveFlight=allFlights.find(f=>((f[1]||'').trim()).toUpperCase()===fl);
  const isLive=!!liveFlight;
  const liveAlt=liveFlight&&liveFlight[7]?Math.round(liveFlight[7]*3.281):0;
  const liveSpd=liveFlight&&liveFlight[9]?Math.round(liveFlight[9]*1.944):0;
  const livePhase=liveFlight?(liveFlight[8]?'on ground':liveAlt>20000?'cruising':liveAlt>5000?'climbing/descending':'near airport'):'not currently tracked';

  const prompt='You are a professional aviation delay prediction system. Give a SPECIFIC accurate prediction for flight '+fl+' ('+airline+') on '+dateVal+' ('+day+').\n\nREAL-TIME SIGNALS:\n- Current time: '+hour+':'+String(min).padStart(2,'0')+' | Month: '+month+'\n- Peak hour: '+(isPeak?'YES (high congestion)':'NO (off-peak)')+'\n- Weekend: '+(isWeekend?'YES':'NO')+' | Holiday season: '+(isHoliday?'YES':'NO')+'\n- Live flight status: '+(isLive?'AIRBORNE - '+livePhase+' at '+liveAlt+'ft, '+liveSpd+'kt':'Not currently airborne')+'\n- Airline OTP: '+(['Emirates','Singapore Airlines','Qatar Airways','Lufthansa'].includes(airline)?'Excellent 85%+':['IndiGo'].includes(airline)?'Good 78%':['Air India','SpiceJet'].includes(airline)?'Below average 65%':'Average 75%')+'\n\nBe realistic and specific. Not every flight is delayed. Consider actual route, airline, time, season.\n\nRespond ONLY with JSON (no markdown):\n{"risk_percent":30,"expected_delay_mins":7,"confidence":84,"status":"Low Risk","on_time_probability":70,"factors":["specific reason 1","specific reason 2","specific reason 3","specific reason 4"],"recommendation":"specific advice","gate_arrival":"X minutes before departure","best_case_delay":0,"worst_case_delay":40}';

  // Fetch real route from our servers in parallel
  let routeStr = '';
  fetch('proxy.php?action=flight&cs='+fl,{signal:AbortSignal.timeout(8000)})
    .then(r=>r.json())
    .then(d=>{
      const flights=Array.isArray(d)?d:[d];
      const flt=flights[0];
      if(flt&&flt.departure&&flt.arrival){
        const dep=flt.departure.airport;
        const arr=flt.arrival.airport;
        const depName=(dep.name||dep.iata||'').replace(' International Airport','').replace(' Airport','');
        const arrName=(arr.name||arr.iata||'').replace(' International Airport','').replace(' Airport','');
        const routeEl=document.getElementById('delay-route-'+fl);
        const depTime=flt.departure.scheduledTime?.local||flt.departure.scheduledTime?.utc||'';
        const arrTime=flt.arrival.scheduledTime?.local||flt.arrival.scheduledTime?.utc||'';
        const fmt=t=>{if(!t)return'';const d=new Date(t);return isNaN(d)?'':d.toLocaleTimeString('en-GB',{hour:'2-digit',minute:'2-digit'});};
        const depFmt=fmt(depTime);const arrFmt=fmt(arrTime);
        if(routeEl)routeEl.innerHTML=`<div style="display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-top:4px"><span style="color:var(--cyan);font-weight:700">${dep.iata||'-'}</span><span style="color:var(--text2);font-size:11px">${depName}</span>${depFmt?`<span style="background:rgba(0,229,255,0.1);border:1px solid rgba(0,229,255,0.2);color:var(--cyan);padding:2px 8px;border-radius:10px;font-size:11px;font-family:'JetBrains Mono',monospace">${depFmt}</span>`:''}<span style="color:var(--text3)">-></span><span style="color:var(--gold);font-weight:700">${arr.iata||'-'}</span><span style="color:var(--text2);font-size:11px">${arrName}</span>${arrFmt?`<span style="background:rgba(255,214,0,0.1);border:1px solid rgba(255,214,0,0.2);color:var(--gold);padding:2px 8px;border-radius:10px;font-size:11px;font-family:'JetBrains Mono',monospace">${arrFmt}</span>`:''}</div>`;
        // ── EXTRA DETAIL (all from the same response, no extra API cost) ──
        const ac=flt.aircraft||{};
        const acModel=(ac.model||'').trim();
        const acReg=(ac.reg||ac.registration||'').trim();
        const acImg=ac.image&&ac.image.url?ac.image.url:'';
        const alName=(flt.airline&&flt.airline.name)?flt.airline.name:'';
        const depT=flt.departure.terminal?('T'+flt.departure.terminal):'';
        const depG=flt.departure.gate?('Gate '+flt.departure.gate):'';
        const depDesk=flt.departure.checkInDesk?('Check-in '+flt.departure.checkInDesk):'';
        const arrT=flt.arrival.terminal?('T'+flt.arrival.terminal):'';
        const arrG=flt.arrival.gate?('Gate '+flt.arrival.gate):'';
        const belt=flt.arrival.baggageBelt?('Belt '+flt.arrival.baggageBelt):'';
        const arrRwy=flt.arrival.runway?('Runway '+flt.arrival.runway):'';
        const status=(flt.status||'').trim();
        const cargo=flt.isCargo?'Cargo':'';
        const codeshare=(flt.codeshareStatus&&/codeshare/i.test(flt.codeshareStatus))?'Codeshare':'';
        // distance (km + mi)
        let distTxt='';
        if(flt.greatCircleDistance){
          const km=flt.greatCircleDistance.km||flt.greatCircleDistance.value;
          if(km)distTxt=Math.round(km).toLocaleString()+' km / '+Math.round(km*0.621).toLocaleString()+' mi';
        }
        // duration (scheduled dep -> arr)
        let durTxt='';
        try{
          const ds=flt.departure.scheduledTime?.utc, as=flt.arrival.scheduledTime?.utc;
          if(ds&&as){const mn=Math.round((new Date(as)-new Date(ds))/60000);
            if(mn>0)durTxt=Math.floor(mn/60)+'h '+(mn%60)+'m';}
        }catch(e){}
        // delay (revised vs scheduled departure)
        let delayTxt='';
        try{
          const sd=flt.departure.scheduledTime?.utc, rd=flt.departure.revisedTime?.utc;
          if(sd&&rd){const mins=Math.round((new Date(rd)-new Date(sd))/60000);
            if(mins>2)delayTxt=mins+' min late'; else if(mins<-2)delayTxt=Math.abs(mins)+' min early'; else delayTxt='On time';}
        }catch(e){}
        const chip=(txt,col)=>txt?`<span style="background:${col}1a;border:1px solid ${col}33;color:${col};padding:2px 8px;border-radius:10px;font-size:11px;margin:2px 3px 0 0;display:inline-block">${txt}</span>`:'';
        const statusCol=/cancel/i.test(status)?'var(--pink)':/delay|late/i.test(status+delayTxt)?'var(--gold)':'var(--green)';
        let extra='';
        if(acImg)extra+=`<div style="margin-top:8px"><img src="${acImg}" style="width:100%;max-height:150px;object-fit:cover;border-radius:10px;border:1px solid var(--border)" loading="lazy" onerror="this.style.display='none'"></div>`;
        extra+='<div style="margin-top:7px;line-height:1.9">';
        extra+=chip(alName?'🏢 '+alName:'','var(--cyan)');
        extra+=chip(acModel?'✈ '+acModel:'','var(--cyan)');
        extra+=chip(acReg?'📋 '+acReg:'','var(--text2)');
        extra+=chip(status,statusCol);
        extra+=chip(delayTxt,statusCol);
        extra+=chip(distTxt?'📏 '+distTxt:'','var(--text2)');
        extra+=chip(durTxt?'⏱ '+durTxt:'','var(--text2)');
        extra+=chip(cargo,'var(--gold)');
        extra+=chip(codeshare,'var(--text2)');
        extra+=chip(depT||depG||depDesk?('Dep '+[depT,depG,depDesk].filter(Boolean).join(' ')):'','var(--cyan)');
        extra+=chip(arrT||arrG?('Arr '+[arrT,arrG].filter(Boolean).join(' ')):'','var(--gold)');
        extra+=chip(arrRwy,'var(--gold)');
        extra+=chip(belt,'var(--gold)');
        extra+='</div>';
        if(routeEl)routeEl.innerHTML+=extra;
      }
    }).catch(()=>{});

  callGemini(prompt).then(result=>{
    let data;
    try{const clean=(result||'').replace(/```json|```/g,'').trim();data=JSON.parse(clean);}
    catch(e){
      let pct=20;
      if(isPeak)pct+=18;if(isWeekend)pct+=8;if(isHoliday)pct+=12;
      if(airline==='Air India'||airline==='SpiceJet')pct+=12;
      if(airline==='IndiGo')pct+=5;
      if(['Emirates','Singapore Airlines','Qatar Airways'].includes(airline))pct-=8;
      pct=Math.min(90,Math.max(8,pct));
      data={risk_percent:pct,expected_delay_mins:Math.round(pct*0.35),confidence:70,status:pct<30?'Low Risk':pct<60?'Moderate Risk':'High Risk',on_time_probability:100-pct,factors:[isPeak?'Peak hour - increased congestion':'Off-peak period - lower delays',isWeekend?'Weekend - higher passenger volumes':'Weekday - business traffic patterns',airline+' historical on-time performance',isHoliday?'Holiday season - elevated demand':'Normal operational period'],recommendation:'Arrive at gate 45 minutes before scheduled departure',gate_arrival:'45 min before STD',best_case_delay:0,worst_case_delay:Math.round(pct*0.9)};
    }
    const col=data.risk_percent<30?'var(--green)':data.risk_percent<60?'var(--gold)':'var(--pink)';
    const icon=data.risk_percent<30?'✅':data.risk_percent<60?'⚠️':'🔴';
    res.innerHTML=`
      <div style="background:rgba(255,255,255,0.02);border:1px solid var(--border);border-radius:14px;overflow:hidden">
        <div style="background:linear-gradient(135deg,${col}22,${col}08);padding:16px 20px;border-bottom:1px solid var(--border);display:flex;justify-content:space-between;align-items:center;flex-wrap:wrap;gap:10px">
          <div>
            <div class="orb" style="font-size:22px;font-weight:900">${fl}</div>
            <div class="f12 tc-muted mt4">${airline} | ${dateVal} | ${day}</div>
            <div id="delay-route-${fl}" style="margin-top:5px;font-size:12px">Fetching route...</div>
            ${isLive?'<div style="display:inline-flex;align-items:center;gap:5px;margin-top:6px;background:rgba(0,230,118,0.1);border:1px solid rgba(0,230,118,0.3);padding:3px 10px;border-radius:20px;font-size:10px;color:var(--green);font-weight:700"><div class="live-dot"></div>LIVE: '+livePhase.toUpperCase()+'</div>':""}
          </div>
          <div style="text-align:center;background:rgba(255,255,255,0.04);border:2px solid ${col};border-radius:12px;padding:12px 20px">
            <div class="orb" style="font-size:32px;font-weight:900;color:${col}">${data.risk_percent}%</div>
            <div class="f11 tc-muted mt4">DELAY RISK</div>
          </div>
        </div>
        <div style="display:grid;grid-template-columns:repeat(4,1fr);border-bottom:1px solid var(--border)">
          <div style="padding:12px;text-align:center;border-right:1px solid var(--border)"><div class="orb" style="font-size:18px;font-weight:900;color:var(--gold)">${data.expected_delay_mins}<span style="font-size:10px">m</span></div><div class="f10 tc-muted mt4">Exp. Delay</div></div>
          <div style="padding:12px;text-align:center;border-right:1px solid var(--border)"><div class="orb" style="font-size:18px;font-weight:900;color:var(--green)">${data.on_time_probability||Math.round(100-data.risk_percent)}%</div><div class="f10 tc-muted mt4">On-Time</div></div>
          <div style="padding:12px;text-align:center;border-right:1px solid var(--border)"><div class="orb" style="font-size:18px;font-weight:900;color:var(--cyan)">${data.confidence}%</div><div class="f10 tc-muted mt4">Confidence</div></div>
          <div style="padding:12px;text-align:center"><div style="font-size:20px">${icon}</div><div class="f10 tc-muted mt4">${data.status}</div></div>
        </div>
        <div style="padding:14px 20px;border-bottom:1px solid var(--border)">
          <div class="f11 tc-muted mb10 orb" style="letter-spacing:1px">ANALYSIS FACTORS</div>
          ${(data.factors||[]).map(r=>'<div style="display:flex;align-items:flex-start;gap:8px;margin-bottom:7px;font-size:12px"><span style="color:var(--orange);flex-shrink:0">▸</span><span>'+r+'</span></div>').join('')}
        </div>
        <div style="padding:12px 20px;background:rgba(0,229,255,0.04)">
          <div style="font-size:12px;color:var(--cyan);margin-bottom:5px">💡 ${data.recommendation}</div>
          <div style="font-size:11px;color:var(--text2)">Best case: +${data.best_case_delay||0}min | Worst case: +${data.worst_case_delay||45}min | Gate: ${data.gate_arrival||'45 min before STD'}</div>
          <div style="margin-top:5px;font-size:10px;color:var(--text3)">Based on live signals | Always verify with your airline</div>
        </div>
      </div>`;
  }).catch(()=>{res.innerHTML='<div style="padding:20px;text-align:center;color:var(--text2)">Analysis unavailable. Check connection.</div>';});
}
function getBriefing(){
  const fl=(document.getElementById('briefCustomInput')?.value||'').trim().toUpperCase();
  if(!fl){alert('Enter a flight number first');return;}
  const live=allFlights.find(f=>((f[1]||'').trim()).toUpperCase()===fl);
  // Add to BRIEFS if not already there so loadBrief can find it
  if(!BRIEFS.find(b=>b.num===fl)){
    BRIEFS.unshift({num:fl,route:'-',ac:'-',dept:'-',arr:'-',from:'-',to:'-'});
  }
  const panel=document.getElementById('briefPanel');
  if(panel)panel.innerHTML='<div style="text-align:center;padding:20px"><div class="spinner" style="margin:0 auto 12px"></div><div class="orb f12 tc-muted">Generating briefing for '+fl+'...</div></div>';
  loadBrief(null, fl, live);
}


// ── SMART FLIGHT BRIEFINGS ────────────────────────────────────
const BRIEFS = [
  {num:'EK764', route:'DXB -> BOM', ac:'Boeing 777-300ER', dept:'02:20', arr:'06:45', from:'Dubai',    to:'Mumbai'},
  {num:'AI302', route:'DEL -> SYD', ac:'Boeing 787-8',     dept:'02:35', arr:'20:15', from:'Delhi',    to:'Sydney'},
  {num:'QR521', route:'DOH -> DEL', ac:'Boeing 787-8',     dept:'03:10', arr:'07:55', from:'Doha',     to:'Delhi'},
  {num:'BA138', route:'BOM -> LHR', ac:'Boeing 777-200ER', dept:'03:25', arr:'09:35', from:'Mumbai',   to:'London'},
  {num:'SQ318', route:'SIN -> LHR', ac:'Airbus A350-900',  dept:'23:59', arr:'06:00', from:'Singapore',to:'London'},
  {num:'EK501', route:'DXB -> DEL', ac:'Boeing 777-300ER', dept:'09:30', arr:'14:15', from:'Dubai',    to:'Delhi'},
  {num:'6E2341',route:'BOM -> DEL', ac:'Airbus A320neo',   dept:'06:00', arr:'08:15', from:'Mumbai',   to:'Delhi'},
  {num:'AI101', route:'DEL -> JFK', ac:'Boeing 777-200LR', dept:'14:10', arr:'17:40', from:'Delhi',    to:'New York'},
  {num:'TG338', route:'BKK -> DEL', ac:'Boeing 777-200',   dept:'00:50', arr:'04:25', from:'Bangkok',  to:'Delhi'},
  {num:'EY204', route:'AUH -> DEL', ac:'Boeing 787-9',     dept:'03:00', arr:'07:45', from:'Abu Dhabi',to:'Delhi'},
];

function renderBriefs(){
  const list=document.getElementById('briefList');
  if(!list)return;
  list.innerHTML=BRIEFS.map(b=>`
    <div class="brief-item" onclick="loadBrief(this,'${b.num}',null)">
      <div style="font-family:'Orbitron',monospace;font-size:12px;font-weight:700;color:var(--cyan);margin-bottom:3px">${b.num}</div>
      <div style="font-size:11px;color:var(--text2)">${b.route} | ${b.ac}</div>
    </div>`).join('');
}

function loadBrief(e,num,passedFlight){
  document.querySelectorAll('.brief-item').forEach(i=>i.classList.remove('on'));
  if(e&&e.currentTarget)e.currentTarget.classList.add('on');
  else if(e&&e.classList)e.classList.add('on');
  const flNum=num||'UNKNOWN';
  const p=document.getElementById('briefPanel');
  p.innerHTML='<div style="text-align:center;padding:20px"><div class="spinner" style="margin:0 auto 12px"></div><div class="orb f12 tc-muted">Fetching '+flNum+' data...</div></div>';

  const liveF=passedFlight||(allFlights||[]).find(fl=>fl[1]&&fl[1].trim().toUpperCase()===flNum);
  const liveAlt=liveF&&liveF[7]?Math.round(liveF[7]*3.281).toLocaleString()+' ft':'';
  const liveSpd=liveF&&liveF[9]?Math.round(liveF[9]*1.944)+' kt':'';
  const livePhase=liveF?(liveF[8]?'on ground':'airborne'):'';

  // Fetch real route from our servers first
  fetch('proxy.php?action=flight&cs='+encodeURIComponent(flNum),{signal:AbortSignal.timeout(8000)})
  .then(r=>r.json())
  .then(aero=>{
    const flights=Array.isArray(aero)?aero:[aero];
    const flt=flights[0];
    let fromIata='',toIata='',fromCity='',toCity='',depTime='',arrTime='',acType='',airline='';
    if(flt&&flt.departure){
      fromIata=flt.departure.airport?.iata||'';
      fromCity=(flt.departure.airport?.name||'').replace(' International Airport','').replace(' Airport','').replace(' Intl','');
      depTime=flt.departure.scheduledTime?.local||flt.departure.scheduledTime?.utc||'';
      if(depTime)depTime=new Date(depTime).toLocaleTimeString('en-GB',{hour:'2-digit',minute:'2-digit'});
    }
    if(flt&&flt.arrival){
      toIata=flt.arrival.airport?.iata||'';
      toCity=(flt.arrival.airport?.name||'').replace(' International Airport','').replace(' Airport','').replace(' Intl','');
      arrTime=flt.arrival.scheduledTime?.local||flt.arrival.scheduledTime?.utc||'';
      if(arrTime)arrTime=new Date(arrTime).toLocaleTimeString('en-GB',{hour:'2-digit',minute:'2-digit'});
    }
    acType=flt?.aircraft?.model||flt?.aircraft?.iata||'';
    airline=flt?.airline?.name||getAirlineName(flNum);
    const route=fromIata&&toIata?fromIata+' -> '+toIata:'';
    const f={num:flNum,route:route||'-',ac:acType||'Commercial Aircraft',dept:depTime||'-',arr:arrTime||'-',from:fromCity||fromIata||'Origin',to:toCity||toIata||'Destination'};
    generateBriefing(f,liveF,liveAlt,liveSpd,livePhase,p);
  })
  .catch(()=>{
    const staticF=BRIEFS.find(b=>b.num===flNum);
    const f=staticF||{num:flNum,route:'-',ac:'Commercial Aircraft',dept:'-',arr:'-',from:'Origin',to:'Destination'};
    generateBriefing(f,liveF,liveAlt,liveSpd,livePhase,p);
  });
}

function getAirlineName(cs){
  const map={'EZY':'easyJet','EK':'Emirates','AI':'Air India','6E':'IndiGo','SG':'SpiceJet','UK':'Vistara','QR':'Qatar Airways','BA':'British Airways','LH':'Lufthansa','SQ':'Singapore Airlines','TK':'Turkish Airlines','AF':'Air France','KL':'KLM','EY':'Etihad','TG':'Thai Airways','EW':'Eurowings','FR':'Ryanair','W6':'Wizz Air','DY':'Norwegian','U2':'easyJet'};
  for(const [k,v] of Object.entries(map)){if(cs.startsWith(k))return v;}
  return '';
}

function generateBriefing(f,liveF,liveAlt,liveSpd,livePhase,p){
  const prompt=`You are a professional airline flight dispatcher. Generate a realistic smart flight briefing for flight ${f.num} (${f.route}, ${f.ac}).
Live data: ${livePhase}, altitude ${liveAlt}, speed ${liveSpd}.
Scheduled departure: ${f.dept}. Scheduled arrival: ${f.arr}.

Write a professional 4-paragraph briefing covering:
1. Flight status and any delays (be realistic, mention typical issues)  
2. Weather at departure and destination (make it realistic for the region)
3. Route and airspace notes (mention realistic airways)
4. Crew advisory and recommendations

Keep it concise, professional, realistic. Do NOT say "I cannot" or "as an AI". Just write the briefing as a real dispatcher would.`;

  callGemini(prompt).then(text=>{
    if(!text){
      // Gemini failed - generate a basic offline briefing
      const hour=new Date().getHours();
      const timeStr=hour<6?'Night ops - low traffic':hour<9?'Morning peak - expect congestion':hour<12?'Morning ops':hour<17?'Afternoon ops':'Evening peak - high traffic';
      const fromStr=f.from&&f.from!=='Origin'?f.from:f.route.split('->')[0]?.trim()||'departure airport';
      const toStr=f.to&&f.to!=='Destination'?f.to:f.route.split('->')[1]?.trim()||'destination airport';
      const routeStr=f.route!=='-'?f.route:'this routing';
      p.innerHTML=`<div style="font-size:13px;line-height:1.8;color:var(--text)">
        <div style="display:flex;justify-content:space-between;align-items:flex-start;flex-wrap:wrap;gap:10px;margin-bottom:18px">
          <div><div class="orb" style="font-size:20px">${f.num}</div><div class="tc-muted f13 mt8">${routeStr} | ${f.ac}</div></div>
          <div style="background:rgba(255,214,0,0.1);border:1px solid var(--gold);padding:4px 11px;border-radius:16px;font-size:10px;color:var(--gold)">DISPATCHER BRIEFING</div>
        </div>
        <p style="margin-bottom:12px"><strong>Flight Status:</strong> ${f.num} is operational on the ${fromStr} to ${toStr} routing.${f.dept!=='-'?' Scheduled departure '+f.dept+'.':''} ${liveF?'Aircraft currently '+livePhase+(liveAlt?' at '+liveAlt:'')+(liveSpd?', '+liveSpd:'')+'.'  :'No live position at this time.'}</p>
        <p style="margin-bottom:12px"><strong>Weather:</strong> Latest METAR data for ${fromStr} and ${toStr} should be reviewed by crew prior to departure. ${timeStr}. Monitor for any convective activity along the route, particularly at cruise altitude.</p>
        <p style="margin-bottom:12px"><strong>Route & Airspace:</strong> Standard airways routing applies for ${routeStr}. Crews should review current NOTAMs for both airports and en-route airspace. No unusual restrictions at this time.</p>
        <p style="margin-bottom:12px"><strong>Crew Advisory:</strong> Standard operating procedures apply. Minimum gate arrival 45 minutes before scheduled departure. Passengers should monitor official airline channels for real-time status updates.</p>
        <div style="margin-top:12px;font-size:10px;color:var(--text2);border-top:1px solid var(--border);padding-top:10px">${f.dept!=='-'?'STD: '+f.dept+' | ':''} ${f.arr!=='-'?'STA: '+f.arr:''}</div>
      </div>`;
      return;
    }
    const paragraphs=text.split('\n').filter(l=>l.trim().length>0);
    p.innerHTML=`
      <div style="display:flex;justify-content:space-between;align-items:flex-start;flex-wrap:wrap;gap:10px;margin-bottom:18px">
        <div><div class="orb" style="font-size:20px">${f.num}</div><div class="tc-muted f13 mt8">${f.route} | ${f.ac}</div></div>
        <div style="background:rgba(170,0,255,0.12);border:1px solid var(--purple);padding:4px 11px;border-radius:16px;font-size:10px;color:var(--purple);letter-spacing:1px">⚡ SMART BRIEFING</div>
      </div>
      ${liveF?`<div style="background:rgba(0,255,127,0.07);border-left:3px solid var(--green);padding:10px 14px;border-radius:0 7px 7px 0;margin-bottom:12px;font-size:12px">🟢 Live: ${livePhase} | ${liveAlt} | ${liveSpd}</div>`:''}
      <div style="font-size:13px;line-height:1.8;color:var(--text)">
        ${paragraphs.map(para=>`<p style="margin-bottom:12px">${para}</p>`).join('')}
      </div>
      <div style="margin-top:12px;font-size:10px;color:var(--text2);border-top:1px solid var(--border);padding-top:10px">Powered by Smart Vision | STD: ${f.dept} | STA: ${f.arr}</div>`;
  });
}

let _tvStarted=false;
function initTV(){
  if(_tvStarted)return;_tvStarted=true;
  setInterval(()=>document.getElementById('tvClock').textContent=new Date().toLocaleTimeString('en-GB',{hour12:false}),1000);
  document.getElementById('tvClock').textContent=new Date().toLocaleTimeString('en-GB',{hour12:false});
  updateTVBody();setInterval(updateTVBody,8000);
}
// Independent TV starter - runs even if earlier init code throws
window.addEventListener('load',()=>{setTimeout(()=>{try{initTV();}catch(e){console.warn('TV start failed',e);}},500);});
let _tvCelebIdx=0,_tvTickN=0;
const _TV_NEWS=[
  "TAYLOR SWIFT'S JET SPOTTED AT LAX",
  "ELON MUSK JET N628TS LAST SEEN AT AUSTIN",
  "DRAKE'S 'AIR DRAKE' 767 SPOTTED AT TORONTO",
  "ROC NATION JET TRACKED OVER TETERBORO",
  "KYLIE JENNER JET SPOTTED AT VAN NUYS",
  "F1 TEAM CHARTER SPOTTED AT NICE / MONACO",
  "ROYAL RAF VOYAGER TRACKED OVER LONDON",
  "PRIVATE GULFSTREAM G700 SPOTTED AT DUBAI",
];
function updateTVBody(){
  const body=document.getElementById('tvBody');
  let live=allFlights.filter(f=>f[1]&&!f[8]).slice(0,12);
  if(live.length===0)live=allFlights.filter(f=>f[1]).slice(0,12);
  if(body){
    if(live.length>0){
      body.innerHTML=live.map(f=>{
        const cs=((f[1]||'').trim()).toUpperCase();
        const route=ROUTES[cs]||{from:'-',to:'-'};
        const alt=f[7]?Math.round(f[7]*3.281).toLocaleString()+' ft':'—';
        const spd=f[9]?Math.round(f[9]*3.6).toLocaleString()+' km/h':'—';
        const hdg=(f[10]!=null)?Math.round(f[10])+'°':'—';
        const cty=((f[2]||'').toString().trim())||'—';
        return `<div class="tv-flt">
          <div class="orb f12 fw7" style="color:#fff">${cs}</div>
          <div class="tvf-route">${route.from} -> ${route.to}</div>
          <div class="tvf-row"><span>ALT</span><b style="color:var(--green)">${alt}</b></div>
          <div class="tvf-row"><span>SPD</span><b style="color:#7fd0ff">${spd}</b></div>
          <div class="tvf-row"><span>HDG</span><b style="color:#fff">${hdg}</b></div>
          <div class="tvf-cty">${cty}</div>
        </div>`;
      }).join('');
    }else{
      body.innerHTML='<div class="tv-flt" style="grid-column:span 4;text-align:center;color:#666">Loading live flights...</div>';
    }
  }
  // ── Bottom feed: latest news + last-spotted aircraft (refreshes on the marquee loop) ──
  if(_tvTickN%4===0){
    const total=allFlights.length||'-';
    const inAir=allFlights.filter(f=>!f[8]).length||'-';
    const spotted=allFlights.filter(f=>f[1]&&ROUTES[((f[1]||'').trim()).toUpperCase()]).slice(0,4).map(f=>{
      const cs=((f[1]||'').trim()).toUpperCase();const r=ROUTES[cs];
      const alt=f[7]?Math.round(f[7]*3.281).toLocaleString()+'ft':'';
      return '🛬 LAST SPOTTED: '+cs+' '+r.from+'→'+r.to+(alt?' @ '+alt:'');
    });
    const news=_TV_NEWS[_tvCelebIdx%_TV_NEWS.length];_tvCelebIdx++;
    const items=[
      '✈ '+total.toLocaleString()+' AIRCRAFT TRACKED LIVE',
      '🛫 '+inAir.toLocaleString()+' AIRBORNE RIGHT NOW',
      '⭐ '+news+' — KML / CSV AVAILABLE · CONTACT JETSTREAM AI',
      ...spotted,
      '📊 JETSTREAM LIVE — GLOBAL AVIATION INTELLIGENCE',
    ];
    const tick=document.getElementById('tvTicker');
    if(tick)tick.innerHTML=items.map(t=>`<span>${t}</span>`).join('');
  }
  _tvTickN++;
}

function launchTV(){
  document.querySelector('.tv-overlay').style.display='none';
  const el=document.querySelector('.tv-screen');
  (el.requestFullscreen||el.webkitRequestFullscreen)?.call(el);
}

// ==================== BILLING ====================
let yearly=false;
const P={ep:{q:'₹269',y:'₹629',qs:'per quarter | €2.99 international',ys:'per year | €6.99 international'},bc:{q:'₹719',y:'₹2,199',qs:'per quarter | €7.99 international',ys:'per year | €24.49 international'},fc:{q:'₹7,899',y:'₹31,499',qs:'per quarter | €87.99 international',ys:'per year | €349.99 international'}};
function toggleBilling(){
  yearly=!yearly;
  document.getElementById('billingTog').classList.toggle('on',yearly);
  [['ep','ep-p','ep-s'],['bc','bc-p','bc-s'],['fc','fc-p','fc-s']].forEach(([k,p,s])=>{
    document.getElementById(p).textContent=yearly?P[k].y:P[k].q;
    document.getElementById(s).textContent=yearly?P[k].ys:P[k].qs;
  });
}

// ==================== INIT ====================
document.addEventListener('DOMContentLoaded',()=>{
  const t=new Date().toISOString().split('T')[0];
  const df=document.getElementById('d-date');if(df)df.value=t;
  document.getElementById('d-flight').value='AI302';
  // Allow Enter key in login forms
  document.getElementById('l-pass').addEventListener('keydown',e=>{if(e.key==='Enter')doLogin();});
  document.getElementById('r-pass').addEventListener('keydown',e=>{if(e.key==='Enter')doRegister();});
});

// ════════════════════════════════════════════════════════════
// AR AIRCRAFT IDENTIFICATION - Gemini Vision
// ════════════════════════════════════════════════════════════
let arStream=null, arAutoInterval=null, arAutoActive=false, arMode='camera';

function setARMode(mode){
  arMode=mode;
  document.getElementById('ar-camera-wrap').style.display=mode==='camera'?'block':'none';
  document.getElementById('ar-upload-wrap').style.display=mode==='upload'?'block':'none';
  document.getElementById('ar-controls').style.display=mode==='camera'?'flex':'none';
  const tc=document.getElementById('ar-tab-camera'),tu=document.getElementById('ar-tab-upload');
  if(tc)tc.classList.toggle('on',mode==='camera');
  if(tu)tu.classList.toggle('on',mode==='upload');
}

async function startCamera(){
  try{
    arStream=await navigator.mediaDevices.getUserMedia({video:{facingMode:'environment',width:{ideal:1280},height:{ideal:720}}});
    const video=document.getElementById('ar-video');
    video.srcObject=arStream;
    const overlay=document.getElementById('ar-start-overlay');
    if(overlay)overlay.style.display='none';
    const frame=document.getElementById('ar-frame');if(frame)frame.classList.add('scanning');
  }catch(e){
    alert('Camera access denied. Please allow camera permissions and try again.');
  }
}

function captureFrame(){
  const video=document.getElementById('ar-video');
  const canvas=document.getElementById('ar-canvas');
  if(!video||!video.videoWidth)return null;
  canvas.width=video.videoWidth;canvas.height=video.videoHeight;
  canvas.getContext('2d').drawImage(video,0,0);
  return canvas.toDataURL('image/jpeg',0.8).split(',')[1];
}

async function arIdentifyImage(base64img){
  try{
    const r=await fetch('proxy.php?action=gemini',{
      method:'POST',
      headers:{'Content-Type':'application/json'},
      body:JSON.stringify({model:'gemini-2.5-flash',contents:[{parts:[
        {text:'You are an expert aircraft spotter. Look carefully at this photo. Identify the aircraft. Return ONLY a JSON object, no markdown, no explanation: {"aircraft_type":"exact model e.g. Boeing 737-800","airline":"airline name from livery","registration":"tail number if visible or unknown","confidence":"high/medium/low","features":["feature1","feature2","feature3"],"notes":"key identification details"}. Be specific - identify the exact variant if possible. Even if partially visible, make your best identification.'},
        {inline_data:{mime_type:'image/jpeg',data:base64img}}
      ]}],generationConfig:{thinkingConfig:{thinkingBudget:0}}}),
      signal:AbortSignal.timeout(20000)
    });
    const d=await r.json();
    const text=d.candidates?.[0]?.content?.parts?.[0]?.text||'{}';
    const clean=text.replace(/```json|```/g,'').trim();
    return JSON.parse(clean);
  }catch(e){return null;}
}

async function arTapIdentify(){
  const img=captureFrame();
  if(!img){alert('Start the camera first, then tap to identify.');return;}
  window._lastSpotImg='data:image/jpeg;base64,'+img;
  const result=document.getElementById('ar-result');
  const body=document.getElementById('ar-result-body');
  result.style.display='block';
  body.innerHTML='<div style="text-align:center;padding:16px"><div class="spinner" style="margin:0 auto 10px"></div><div class="f12 tc-muted">Analysing aircraft...</div></div>';
  const data=await arIdentifyImage(img);
  showARResult(data);
}

async function arAnalyseUpload(input){
  const file=input.files[0];if(!file)return;
  const preview=document.getElementById('ar-preview');
  const reader=new FileReader();
  reader.onload=async e=>{
    preview.src=e.target.result;preview.style.display='block';
    window._lastSpotImg=e.target.result;
    const base64=e.target.result.split(',')[1];
    const result=document.getElementById('ar-result');
    const body=document.getElementById('ar-result-body');
    result.style.display='block';
    body.innerHTML='<div style="text-align:center;padding:16px"><div class="spinner" style="margin:0 auto 10px"></div><div class="f12 tc-muted">Analysing aircraft photo...</div></div>';
    const data=await arIdentifyImage(base64);
    showARResult(data);
  };
  reader.readAsDataURL(file);
}

// ===== RARITY ENGINE (static global tiers, client-side, no server) =====
// Order matters: first pattern that matches wins, so list rarest first.
const SR_TIERS=[
  {tier:'legendary',xp:250,emoji:'👑',label:'LEGENDARY',color:'#FBBF24',bg:'rgba(251,191,36,.16)',
   pats:[/an-?124|an-?225|antonov/i,/beluga|a300-?600st/i,/c-?5|c-?17|globemaster|galaxy/i,/concorde/i,/b-?2\b|spirit\b|b-?52|stealth/i,/747-?8/i,/vc-?25|air force one/i,/il-?76|il-?96/i,/spruce goose|h-?4/i,/sr-?71|u-?2\b/i]},
  {tier:'epic',xp:100,emoji:'💜',label:'EPIC',color:'#A855F7',bg:'rgba(168,85,247,.16)',
   pats:[/747|jumbo/i,/a380|superjumbo/i,/a350/i,/787|dreamliner/i,/a340/i,/777/i,/md-?11/i,/a330-?900|a330neo/i,/military|fighter|f-?\d{2}|c-?130|hercules|kc-?\d|awacs|p-?8|poseidon/i]},
  {tier:'rare',xp:50,emoji:'💎',label:'RARE',color:'#22D3EE',bg:'rgba(34,211,238,.16)',
   pats:[/767/i,/a330/i,/757/i,/gulfstream|global\s?\d|challenger|falcon\s?\d|citation|learjet|bombardier|embraer\s?legacy|private/i,/atr[\s-]?\d|dash\s?8|q400|dhc/i,/a310|a300/i,/md-?80|md-?90|dc-?\d/i]},
  {tier:'uncommon',xp:25,emoji:'✨',label:'UNCOMMON',color:'#34D399',bg:'rgba(52,211,153,.16)',
   pats:[/a321/i,/737-?900|737\s?max\s?9/i,/e190|e195|embraer\s?19/i,/737\s?max/i,/a220|cs\d00/i]},
  {tier:'common',xp:10,emoji:'✈️',label:'COMMON',color:'#B8A5D8',bg:'rgba(255,255,255,.06)',
   pats:[/.*/]} // fallback: everything else
];
function srEsc(s,max){s=(s==null?'':String(s));if(max&&s.length>max)s=s.slice(0,max-1).trim()+'\u2026';return s.replace(/[&<>"']/g,c=>({'&':'&amp;','<':'&lt;','>':'&gt;','"':'&quot;',"'":'&#39;'}[c]));}
function srClassify(type,airline){  const t=(type||'').toString();
  for(const g of SR_TIERS){ if(g.pats.some(p=>p.test(t))) return g; }
  return SR_TIERS[SR_TIERS.length-1];
}
// ---- local streak + xp (localStorage, instant, no network) ----
function srKey(){let u=null;try{u=getUser();}catch(e){}return 'sr_'+((u&&(u.email||u.uid))||'guest');}
function srState(){try{return JSON.parse(localStorage.getItem(srKey())||'{}');}catch(e){return {};}}
function srSave(s){try{localStorage.setItem(srKey(),JSON.stringify(s));}catch(e){}}
// ---- personality flavour text (by pattern, first match wins) ----
const SR_PERSONA=[
  [/a380|superjumbo/i,'The Gentle Giant','World\u2019s largest passenger jet \u2014 double-decker, whisper-quiet, impossible to miss.'],
  [/747-?8/i,'Queen of the Skies (Reborn)','The stretched, modern 747 \u2014 the final evolution of an icon.'],
  [/747|jumbo/i,'Queen of the Skies','The original hump-backed legend that made long-haul travel normal.'],
  [/a350/i,'The Silent Cruiser','Carbon-fibre and curved wingtips \u2014 sips fuel, glides for hours.'],
  [/787|dreamliner/i,'The Dreamliner','Big windows, low cabin altitude \u2014 built so you land less jet-lagged.'],
  [/777/i,'The Twin-Engine Titan','Two of the biggest jet engines on earth. Speed demon of the long-haul.'],
  [/a340/i,'The Four-Holer','Four engines, ultra-long range \u2014 a rarer sight every year.'],
  [/a330/i,'The Workhorse Widebody','Everywhere and reliable \u2014 the quiet backbone of long routes.'],
  [/767/i,'The Freight Favourite','Passenger classic turned cargo king \u2014 you\u2019ll spot these hauling parcels.'],
  [/757/i,'The Rocket','Overpowered and beloved by pilots \u2014 climbs like it means it.'],
  [/an-?124|an-?225|antonov/i,'The Sky Whale','Built to swallow tanks and turbines whole. Spotting one is an event.'],
  [/beluga|a300-?600st/i,'The Flying Whale','Carries aircraft parts \u2014 and looks exactly like a smiling whale.'],
  [/c-?5|c-?17|globemaster|galaxy|il-?76|hercules|c-?130/i,'The Heavy Lifter','Military muscle \u2014 hauls the impossible to anywhere on earth.'],
  [/concorde/i,'The Supersonic Legend','Mach 2 elegance. Retired, mythical, unforgettable.'],
  [/gulfstream|global\s?\d|challenger|falcon\s?\d|citation|learjet|private/i,'The Executive','Small, sleek, expensive \u2014 someone important is aboard.'],
  [/atr[\s-]?\d|dash\s?8|q400|dhc/i,'The Island Hopper','Turboprop charm \u2014 short runways, big propellers, great views.'],
  [/a321/i,'The Stretch','The longest of the A320 family \u2014 packs in the passengers.'],
  [/a320|a319|a318/i,'The Everyday Hero','The most common jet in the sky \u2014 you\u2019ve almost certainly flown one.'],
  [/737/i,'The Reliable Runner','The best-selling jetliner ever \u2014 the taxi of the skies.'],
  [/e19\d|e17\d|embraer|erj|crj/i,'The Regional Sprinter','Small, nimble, connects the cities the big jets skip.'],
  [/.*/,'The Mystery Bird','An aircraft with a story \u2014 add it to your logbook and find out more.']
];
function srPersona(type){const t=(type||'').toString();for(const p of SR_PERSONA){if(p[0].test(t))return {name:p[1],blurb:p[2]};}return {name:'The Mystery Bird',blurb:''};}

// ---- rarity surprise: small random chance a common plane "goes shiny" ----
// client-side on purpose: nothing here is competitive or tradeable, so there is
// nothing to cheat; keeping it local means zero server load and an instant reveal.
function srSurprise(baseTier){
  // only upgrade lower tiers, and never downgrade a genuine rare find
  if(baseTier==='legendary'||baseTier==='epic') return null;
  const roll=Math.random();
  if(roll<0.015) return {tier:'legendary',flash:'\u2728 SHINY LEGENDARY! \u2728',note:'A 1-in-70 lucky catch.'};      // ~1.5%
  if(roll<0.06)  return {tier:'epic',flash:'\uD83C\uDF1F LUCKY EPIC!',note:'The sky smiled on you.'};                 // ~4.5%
  return null;
}

function srBump(tier){
  const s=srState();
  const today=new Date().toISOString().slice(0,10);
  const yday=new Date(Date.now()-864e5).toISOString().slice(0,10);
  let streak=s.streak||0, newStreak=false, firstToday=false;
  if(s.lastDay===today){ /* same day, keep streak */ }
  else{ firstToday=true; streak=(s.lastDay===yday)?streak+1:1; newStreak=true; }
  const gained=SR_TIERS.find(g=>g.tier===tier)?.xp||10;
  const xp=(s.xp||0)+gained;
  srSave({xp,streak,lastDay:today});
  return {xp,gained,streak,newStreak,firstToday};
}

function spotReveal(data,body){
  const type=data.aircraft_type||'Unknown aircraft';
  const airline=data.airline||'';
  const reg=(data.registration&&data.registration!=='unknown')?data.registration:'';
  // escaped + length-clamped versions for safe display (vision model text is untrusted)
  const eType=srEsc(type,40), eAirline=srEsc(airline,34), eReg=srEsc(reg,12);
  let g=srClassify(type,airline);
  // rarity surprise: chance to upgrade a common/uncommon/rare spot into something special
  const surprise=srSurprise(g.tier);
  if(surprise){ const up=SR_TIERS.find(t=>t.tier===surprise.tier); if(up) g=up; }
  const persona=srPersona(type);
  const isBig=(g.tier==='epic'||g.tier==='legendary');
  const isRarePlus=(g.tier==='rare'||isBig);
  const st=srBump(g.tier);
  window._lastSpot={type:type,airline:airline,reg:reg,tier:g.tier,persona:persona.name,color:g.color,emoji:g.emoji,label:g.label};

  // haptic scaled to rarity (safe no-op if unsupported)
  try{ if(navigator.vibrate){ navigator.vibrate(g.tier==='legendary'?[0,40,60,90]:g.tier==='epic'?[0,30,50]:isRarePlus?35:15); } }catch(e){}

  const cardCls='sr-card '+(isBig?'shake':isRarePlus?'flip':'pop')+' sr-t-'+g.tier;
  const conf=(data.confidence||'').toLowerCase();
  const confCol=conf==='high'?'var(--green)':conf==='medium'?'var(--gold)':'var(--text2)';

  body.innerHTML=`
  <div class="sr-wrap">
    <!-- INSTANT info banner: casual user's answer, never delayed -->
    <div class="sr-banner">
      <div style="font-family:'Orbitron',monospace;font-size:9px;letter-spacing:3px;color:var(--green)">✓ IDENTIFIED</div>
      <div style="font-family:'Orbitron',monospace;font-size:17px;font-weight:900;color:#fff;line-height:1.15">${eType}</div>
      ${airline?`<div style="font-size:13px;color:var(--gold);font-weight:600">${eAirline}</div>`:''}
      ${reg?`<div style="font-family:'JetBrains Mono',monospace;font-size:11px;color:var(--text2);margin-top:2px">REG · ${eReg}</div>`:''}
    </div>

    <!-- REWARD: collectible card, intensity scales with rarity -->
    <div class="${cardCls}">
      <div class="sr-card-inner">
        <div class="sr-tier-chip" style="background:${g.bg};color:${g.color};border:1px solid ${g.color}">${g.label}</div>
        <div class="sr-emoji">${g.emoji}</div>
        <div>
          <div class="sr-name">${eType}</div>
          ${airline?`<div class="sr-sub">${eAirline}</div>`:''}
          <div class="sr-sub" style="color:${g.color};font-style:italic;margin-top:4px">${persona.name}</div>
          ${reg?`<div class="sr-reg">${eReg}</div>`:''}
        </div>
      </div>
    </div>

    ${surprise?`<div style="text-align:center"><span class="sr-flash" style="background:${g.bg};color:${g.color};border:1px solid ${g.color}">${surprise.flash}</span></div>`:isRarePlus?`<div style="text-align:center"><span class="sr-flash" style="background:${g.bg};color:${g.color};border:1px solid ${g.color}">${g.tier==='legendary'?'🏆 LEGENDARY CATCH':'🌟 RARE CATCH'}</span></div>`:''}

    <!-- local stats: instant from localStorage -->
    <div class="sr-stats">
      <div class="sr-stat"><b>+${st.gained}</b><span>XP</span></div>
      <div class="sr-stat"><b>${st.streak}🔥</b><span>Day streak</span></div>
      <div class="sr-stat"><b id="sr-global">·</b><span>Spotted worldwide</span></div>
    </div>
    ${st.newStreak&&st.streak>1?`<div style="text-align:center"><span class="sr-flash" style="background:rgba(251,146,60,.14);color:var(--orange);border:1px solid var(--orange)">🔥 ${st.streak}-DAY STREAK</span></div>`:''}

    <!-- secondary details (spotters scroll for these) -->
    <div class="sr-details">
      ${persona.blurb?`<div style="text-align:center;font-size:12px;color:var(--text2);font-style:italic;margin-bottom:12px;line-height:1.5">${persona.blurb}</div>`:''}
      <div style="display:flex;justify-content:center;margin-bottom:12px">
        <div style="display:inline-flex;align-items:center;gap:7px;background:rgba(255,255,255,.04);border:1px solid var(--border);border-radius:20px;padding:5px 14px">
          <span style="font-size:9px;text-transform:uppercase;letter-spacing:1px;color:var(--text2)">Confidence</span>
          <span class="orb f12 fw7" style="color:${confCol}">${(conf||'unknown').toUpperCase()}</span>
        </div>
      </div>
      ${data.features&&data.features.length?`<div style="margin-bottom:12px"><div class="f11 tc-muted mb8" style="text-transform:uppercase;letter-spacing:1px;text-align:center">Identifying Features</div><div style="display:flex;flex-wrap:wrap;gap:6px;justify-content:center">${data.features.map(f=>'<span style="background:rgba(0,229,255,0.1);border:1px solid rgba(0,229,255,0.28);color:var(--cyan);padding:4px 11px;border-radius:14px;font-size:11px">'+srEsc(f,40)+'</span>').join('')}</div></div>`:''}
      ${data.notes?`<div style="background:rgba(255,255,255,0.04);border-radius:10px;padding:12px 14px;font-size:12px;color:var(--text2);line-height:1.55">${srEsc(data.notes,400)}</div>`:''}
      <button onclick="shareCatchCard()" class="btn btn-blue" style="width:100%;margin-top:14px;font-family:'Orbitron',monospace;font-size:13px;padding:13px">📤 Share Your Catch</button>
      <div style="margin-top:9px;font-size:9px;color:var(--text2);text-align:center">Powered by Smart Vision · Results may vary with image quality</div>
    </div>
  </div>`;

  logSpot(data,body);

  // lazy, non-blocking global count (fills the shimmer if the endpoint exists; silent if not)
  try{
    fetch('proxy.php?action=spotcount&type='+encodeURIComponent(type),{signal:AbortSignal.timeout(6000)})
      .then(r=>r.json()).then(d=>{const el=document.getElementById('sr-global');if(el&&d&&(d.count!=null))el.textContent=(+d.count).toLocaleString();})
      .catch(()=>{const el=document.getElementById('sr-global');if(el)el.textContent='—';});
  }catch(e){}

  // update the live camera overlay (unchanged behaviour)
  const ov=document.getElementById('ar-live-overlay');
  if(ov){ov.style.display='block';
    const ovType=document.getElementById('ar-ov-type');const ovDetail=document.getElementById('ar-ov-detail');
    if(ovType)ovType.textContent=type;
    if(ovDetail)ovDetail.textContent=airline+(reg?' | '+reg:'');
  }
}

function showARResult(data){
  const body=document.getElementById('ar-result-body');
  if(!data){
    body.innerHTML='<div class="tc-muted f13" style="padding:8px">Analysis failed. Please check your internet connection and try again.</div>';
    return;
  }
  if(data.confidence==='none'||(!data.aircraft_type&&!data.airline&&!data.notes)){
    body.innerHTML='<div class="tc-muted f13" style="padding:8px">No aircraft detected in this image. Make sure the aircraft is clearly visible and try again.</div>';
    return;
  }
  // rarity-scaled reveal replaces the old static card
  return spotReveal(data,body);
}
function showARResult_OLD(data){
  const body=document.getElementById('ar-result-body');
  if(!data){
    body.innerHTML='<div class="tc-muted f13" style="padding:8px">Analysis failed. Please check your internet connection and try again.</div>';
    return;
  }
  if(data.confidence==='none'||(!data.aircraft_type&&!data.airline&&!data.notes)){
    body.innerHTML='<div class="tc-muted f13" style="padding:8px">No aircraft detected in this image. Make sure the aircraft is clearly visible and try again.</div>';
    return;
  }
  const conf=(data.confidence||'unknown').toLowerCase();
  const confCol=conf==='high'?'var(--green)':conf==='medium'?'var(--gold)':'var(--text2)';
  const type=data.aircraft_type||'Unknown aircraft';
  const airline=data.airline||'Airline not identified';
  const reg=(data.registration&&data.registration!=='unknown')?data.registration:'';
  window._lastSpot={type:type,airline:(data.airline||''),reg:reg};
  body.innerHTML=`
    <div style="text-align:center;padding:6px 0 16px">
      <div style="font-size:46px;line-height:1">✈️</div>
      <div class="orb" style="font-size:10px;letter-spacing:3px;color:var(--green);margin-top:8px">✓ IDENTIFIED</div>
      <div class="orb" style="font-size:23px;font-weight:900;color:#fff;margin-top:10px;line-height:1.15">${type}</div>
      <div style="font-size:15px;color:var(--gold);margin-top:5px;font-weight:600">${airline}</div>
      ${reg?`<div class="mono f12 tc-muted mt4">REG | ${reg}</div>`:''}
    </div>
    <div style="display:flex;justify-content:center;margin-bottom:14px">
      <div style="display:inline-flex;align-items:center;gap:7px;background:rgba(255,255,255,0.04);border:1px solid var(--border);border-radius:20px;padding:5px 14px">
        <span style="font-size:9px;text-transform:uppercase;letter-spacing:1px;color:var(--text2)">Match confidence</span>
        <span class="orb f12 fw7" style="color:${confCol}">${conf.toUpperCase()}</span>
      </div>
    </div>
    ${data.features&&data.features.length?`<div style="margin-bottom:14px"><div class="f11 tc-muted mb8" style="text-transform:uppercase;letter-spacing:1px;text-align:center">Identifying Features</div><div style="display:flex;flex-wrap:wrap;gap:6px;justify-content:center">${data.features.map(f=>'<span style="background:rgba(0,229,255,0.1);border:1px solid rgba(0,229,255,0.28);color:var(--cyan);padding:4px 11px;border-radius:14px;font-size:11px">'+f+'</span>').join('')}</div></div>`:''}
    ${data.notes?`<div style="background:rgba(255,255,255,0.04);border-radius:10px;padding:12px 14px;font-size:12px;color:var(--text2);line-height:1.55">${data.notes}</div>`:''}
    <button onclick="shareSpot()" class="btn btn-blue" style="width:100%;margin-top:16px;font-family:'Orbitron',monospace;font-size:13px;padding:13px">📤 Share This Spot</button>
    <div style="margin-top:10px;font-size:9px;color:var(--text2);text-align:center">Powered by Smart Vision | Results may vary with image quality</div>`;

  logSpot(data,body);

  // Also update live overlay
  const ov=document.getElementById('ar-live-overlay');
  if(ov){
    ov.style.display='block';
    const ovType=document.getElementById('ar-ov-type');
    const ovDetail=document.getElementById('ar-ov-detail');
    if(ovType)ovType.textContent=data.aircraft_type||'-';
    if(ovDetail)ovDetail.textContent=(data.airline||'')+(data.registration&&data.registration!=='unknown'?' | '+data.registration:'');
  }
}

function shareSpot(){
  const s=window._lastSpot||{};
  const what=s.type?(s.type+(s.airline?' ('+s.airline+')':'')):'a plane';
  const text='I just identified '+what+' with JetStream Live! ✈️ Point your phone at any plane and instantly know what it is ->';
  _nativeShare(SITE_URL, text);
}

// ===== SHARE CARD: pure-canvas poster, no library, no server =====
function srLoadImg(src){return new Promise(res=>{if(!src){res(null);return;}const im=new Image();im.crossOrigin='anonymous';im.onload=()=>res(im);im.onerror=()=>res(null);im.src=src;});}
function srRoundRect(ctx,x,y,w,h,r){ctx.beginPath();ctx.moveTo(x+r,y);ctx.arcTo(x+w,y,x+w,y+h,r);ctx.arcTo(x+w,y+h,x,y+h,r);ctx.arcTo(x,y+h,x,y,r);ctx.arcTo(x,y,x+w,y,r);ctx.closePath();}
function srDrawCover(ctx,img,x,y,w,h){const ir=img.width/img.height,tr=w/h;let sw,sh,sx,sy;if(ir>tr){sh=img.height;sw=sh*tr;sx=(img.width-sw)/2;sy=0;}else{sw=img.width;sh=sw/tr;sx=0;sy=(img.height-sh)/2;}ctx.drawImage(img,sx,sy,sw,sh,x,y,w,h);}
function srFitText(ctx,text,max,start,min){let sz=start;do{ctx.font='900 '+sz+"px 'Orbitron',sans-serif";if(ctx.measureText(text).width<=max)break;sz-=2;}while(sz>min);return sz;}

async function shareCatchCard(){
  const s=window._lastSpot||{};
  if(!s.type){shareSpot();return;}
  jsToast('🎨 Building your catch card...',1800);
  try{ if(document.fonts&&document.fonts.ready) await document.fonts.ready; }catch(e){}

  const W=1080,H=1920, col=s.color||'#22D3EE';
  const cv=document.createElement('canvas');cv.width=W;cv.height=H;
  const ctx=cv.getContext('2d');

  // background: rarity gradient into deep space
  const bg=ctx.createLinearGradient(0,0,W,H);
  bg.addColorStop(0,'#0a0420');bg.addColorStop(.5,'#0d0826');bg.addColorStop(1,'#05030f');
  ctx.fillStyle=bg;ctx.fillRect(0,0,W,H);
  // rarity glow wash top
  const gw=ctx.createRadialGradient(W/2,H*0.34,60,W/2,H*0.34,W*0.9);
  gw.addColorStop(0,col+'33');gw.addColorStop(1,'transparent');
  ctx.fillStyle=gw;ctx.fillRect(0,0,W,H);

  // photo frame
  const px=70,py=150,pw=W-140,ph=1120;
  ctx.save();srRoundRect(ctx,px,py,pw,ph,40);ctx.clip();
  const img=await srLoadImg(window._lastSpotImg);
  if(img){srDrawCover(ctx,img,px,py,pw,ph);}
  else{ctx.fillStyle='#12102a';ctx.fillRect(px,py,pw,ph);ctx.font='240px sans-serif';ctx.textAlign='center';ctx.fillText('✈️',W/2,py+ph/2+80);}
  // subtle dark gradient at photo bottom for text legibility
  const pg=ctx.createLinearGradient(0,py+ph-260,0,py+ph);pg.addColorStop(0,'transparent');pg.addColorStop(1,'rgba(5,3,15,.85)');
  ctx.fillStyle=pg;ctx.fillRect(px,py+ph-260,pw,260);
  ctx.restore();
  // frame border in rarity colour
  ctx.strokeStyle=col;ctx.lineWidth=5;srRoundRect(ctx,px,py,pw,ph,40);ctx.stroke();

  // rarity badge pill (top-left over photo)
  ctx.textAlign='left';
  const badge=(s.label||'').toUpperCase()+'  '+(s.emoji||'');
  ctx.font="700 34px 'Orbitron',sans-serif";
  const bw=ctx.measureText(badge).width+56;
  ctx.fillStyle='rgba(5,3,15,.72)';srRoundRect(ctx,px+34,py+34,bw,74,37);ctx.fill();
  ctx.strokeStyle=col;ctx.lineWidth=3;srRoundRect(ctx,px+34,py+34,bw,74,37);ctx.stroke();
  ctx.fillStyle=col;ctx.fillText(badge,px+62,py+84);

  // aircraft name (auto-fit) just below photo
  ctx.textAlign='center';
  let ty=py+ph+120;
  const nameSz=srFitText(ctx,s.type,W-160,72,34);
  ctx.font='900 '+nameSz+"px 'Orbitron',sans-serif";
  ctx.fillStyle='#ffffff';ctx.fillText(s.type,W/2,ty);
  // airline
  if(s.airline){ty+=66;ctx.font="600 40px 'Exo 2',sans-serif";ctx.fillStyle='#FBBF24';
    let al=s.airline;while(ctx.measureText(al).width>W-160&&al.length>3)al=al.slice(0,-2);ctx.fillText(al,W/2,ty);}
  // personality
  if(s.persona){ty+=58;ctx.font="italic 500 36px 'Exo 2',sans-serif";ctx.fillStyle=col;ctx.fillText('"'+s.persona+'"',W/2,ty);}

  // footer: username + brand
  let uname='';try{const u=getUser();uname=u&&(u.username||u.name||(u.email||'').split('@')[0]);}catch(e){}
  ctx.font="700 40px 'Orbitron',sans-serif";ctx.fillStyle='#F5F0FF';
  ctx.fillText(uname?('@'+uname):'A JetStream catch',W/2,H-150);
  ctx.font="500 34px 'Exo 2',sans-serif";ctx.fillStyle='#B8A5D8';
  ctx.fillText('✈  Caught on JetStream Live  ·  jetstreamlive.app',W/2,H-96);

  // export + share
  cv.toBlob(async(blob)=>{
    if(!blob){jsToast('Could not build card',3000);return;}
    const file=new File([blob],'jetstream-catch.png',{type:'image/png'});
    const text='I caught a '+s.type+(s.airline?' ('+s.airline+')':'')+' on JetStream Live! ✈️ Point your phone at any plane and instantly know what it is → '+SITE_URL;
    try{
      if(navigator.canShare&&navigator.canShare({files:[file]})){
        await navigator.share({files:[file],text:text,title:'My JetStream catch'});return;
      }
    }catch(e){ if(e&&e.name==='AbortError')return; }
    // fallback: download the PNG
    const url=URL.createObjectURL(blob);const a=document.createElement('a');a.href=url;a.download='jetstream-catch.png';document.body.appendChild(a);a.click();a.remove();
    setTimeout(()=>URL.revokeObjectURL(url),4000);
    jsToast('📸 Card saved — share it anywhere!',3500);
  },'image/png');
}

function toggleAutoScan(){
  arAutoActive=!arAutoActive;
  const btn=document.getElementById('ar-auto-btn');
  const badge=document.getElementById('ar-auto-badge');
  if(arAutoActive){
    if(!arStream){startCamera().then(()=>{arAutoInterval=setInterval(autoScanFrame,5000);});}
    else{arAutoInterval=setInterval(autoScanFrame,5000);}
    if(btn){btn.textContent='⟳ Auto Scan: ON';btn.style.color='var(--green)';btn.style.borderColor='rgba(0,255,127,0.4)';}
    if(badge)badge.style.display='block';
  }else{
    clearInterval(arAutoInterval);
    if(btn){btn.textContent='⟳ Auto Scan: OFF';btn.style.color='var(--text2)';btn.style.borderColor='var(--border)';}
    if(badge)badge.style.display='none';
  }
}

async function autoScanFrame(){
  const img=captureFrame();
  if(!img)return;
  window._lastSpotImg='data:image/jpeg;base64,'+img;
  const data=await arIdentifyImage(img);
  if(data&&data.aircraft_type){showARResult(data);}
}

window.addEventListener('resize',()=>{
  if(map)try{map.invalidateSize(true);}catch(e){}
});
// Force map to take up remaining space after layout renders
function fixMapHeight(){
  const nav=document.querySelector('nav');
  const navHeight=nav?nav.offsetHeight:58;
  const totalHeight=window.innerHeight-navHeight;
  const ml=document.querySelector('.map-layout');
  if(ml)ml.style.height=totalHeight+'px';
  if(map)try{map.invalidateSize(true);}catch(e){}
}
window.addEventListener('resize',fixMapHeight);

// Intersection Observer for fade-up animations
const _obs = new IntersectionObserver((entries) => {
  entries.forEach(e => { if(e.isIntersecting) e.target.classList.add('vis'); });
}, {threshold: 0.1});
document.querySelectorAll('.fade-up').forEach(el => _obs.observe(el));

// ── PASSPORT ─────────────────────────────────────────────────────
let ppCount = 0;
window._ppRoutes = {};

// Searchable airport/city database (city, IATA code, country)
const PP_AIRPORTS = [
  ['Mumbai','BOM','India'],['Delhi','DEL','India'],['Bengaluru','BLR','India'],['Chennai','MAA','India'],
  ['Kolkata','CCU','India'],['Hyderabad','HYD','India'],['Kochi','COK','India'],['Goa','GOI','India'],
  ['Ahmedabad','AMD','India'],['Pune','PNQ','India'],['Jaipur','JAI','India'],['Lucknow','LKO','India'],
  ['Rajkot','RAJ','India'],['Surat','STV','India'],['Jamnagar','JGA','India'],['Bhuj','BHJ','India'],
  ['Thiruvananthapuram','TRV','India'],['Srinagar','SXR','India'],['Guwahati','GAU','India'],['Patna','PAT','India'],
  ['Nagpur','NAG','India'],['Indore','IDR','India'],['Vadodara','BDQ','India'],['Coimbatore','CJB','India'],
  ['Varanasi','VNS','India'],['Amritsar','ATQ','India'],['Mangaluru','IXE','India'],['Visakhapatnam','VTZ','India'],
  ['Dubai','DXB','UAE'],['Abu Dhabi','AUH','UAE'],['Sharjah','SHJ','UAE'],['Doha','DOH','Qatar'],
  ['Muscat','MCT','Oman'],['Kuwait City','KWI','Kuwait'],['Riyadh','RUH','Saudi Arabia'],['Jeddah','JED','Saudi Arabia'],
  ['Bahrain','BAH','Bahrain'],['London','LHR','UK'],['London Gatwick','LGW','UK'],['Manchester','MAN','UK'],
  ['Paris','CDG','France'],['Amsterdam','AMS','Netherlands'],['Frankfurt','FRA','Germany'],['Munich','MUC','Germany'],
  ['Zurich','ZRH','Switzerland'],['Rome','FCO','Italy'],['Milan','MXP','Italy'],['Madrid','MAD','Spain'],
  ['Barcelona','BCN','Spain'],['Lisbon','LIS','Portugal'],['Istanbul','IST','Turkey'],['Athens','ATH','Greece'],
  ['Vienna','VIE','Austria'],['Brussels','BRU','Belgium'],['Copenhagen','CPH','Denmark'],['Stockholm','ARN','Sweden'],
  ['Oslo','OSL','Norway'],['Helsinki','HEL','Finland'],['Dublin','DUB','Ireland'],['Moscow','SVO','Russia'],
  ['New York','JFK','USA'],['New York Newark','EWR','USA'],['Los Angeles','LAX','USA'],['Chicago','ORD','USA'],
  ['San Francisco','SFO','USA'],['Boston','BOS','USA'],['Washington','IAD','USA'],['Miami','MIA','USA'],
  ['Dallas','DFW','USA'],['Atlanta','ATL','USA'],['Seattle','SEA','USA'],['Houston','IAH','USA'],
  ['Las Vegas','LAS','USA'],['Orlando','MCO','USA'],['Toronto','YYZ','Canada'],['Vancouver','YVR','Canada'],
  ['Montreal','YUL','Canada'],['Mexico City','MEX','Mexico'],['Sao Paulo','GRU','Brazil'],['Rio de Janeiro','GIG','Brazil'],
  ['Buenos Aires','EZE','Argentina'],['Lima','LIM','Peru'],['Bogota','BOG','Colombia'],['Santiago','SCL','Chile'],
  ['Singapore','SIN','Singapore'],['Bangkok','BKK','Thailand'],['Phuket','HKT','Thailand'],['Kuala Lumpur','KUL','Malaysia'],
  ['Jakarta','CGK','Indonesia'],['Bali','DPS','Indonesia'],['Manila','MNL','Philippines'],['Hanoi','HAN','Vietnam'],
  ['Ho Chi Minh City','SGN','Vietnam'],['Hong Kong','HKG','Hong Kong'],['Tokyo','HND','Japan'],['Tokyo Narita','NRT','Japan'],
  ['Osaka','KIX','Japan'],['Seoul','ICN','South Korea'],['Beijing','PEK','China'],['Shanghai','PVG','China'],
  ['Guangzhou','CAN','China'],['Shenzhen','SZX','China'],['Taipei','TPE','Taiwan'],['Colombo','CMB','Sri Lanka'],
  ['Kathmandu','KTM','Nepal'],['Dhaka','DAC','Bangladesh'],['Male','MLE','Maldives'],['Karachi','KHI','Pakistan'],
  ['Lahore','LHE','Pakistan'],['Islamabad','ISB','Pakistan'],['Sydney','SYD','Australia'],['Melbourne','MEL','Australia'],
  ['Brisbane','BNE','Australia'],['Perth','PER','Australia'],['Auckland','AKL','New Zealand'],['Cairo','CAI','Egypt'],
  ['Johannesburg','JNB','South Africa'],['Cape Town','CPT','South Africa'],['Nairobi','NBO','Kenya'],
  ['Addis Ababa','ADD','Ethiopia'],['Lagos','LOS','Nigeria'],['Casablanca','CMN','Morocco'],['Tel Aviv','TLV','Israel'],
  ['Magadan','GDX','Russia'],['Vladivostok','VVO','Russia'],['Novosibirsk','OVB','Russia'],['Yekaterinburg','SVX','Russia'],
  ['Saint Petersburg','LED','Russia'],['Sochi','AER','Russia'],['Kazan','KZN','Russia'],['Irkutsk','IKT','Russia'],
  ['Almaty','ALA','Kazakhstan'],['Tashkent','TAS','Uzbekistan'],['Baku','GYD','Azerbaijan'],['Tbilisi','TBS','Georgia'],
  ['Yerevan','EVN','Armenia'],['Tehran','IKA','Iran'],['Baghdad','BGW','Iraq'],['Amman','AMM','Jordan'],
  ['Beirut','BEY','Lebanon'],['Kabul','KBL','Afghanistan'],['Anchorage','ANC','USA'],['Honolulu','HNL','USA'],
  ['Denver','DEN','USA'],['Phoenix','PHX','USA'],['Minneapolis','MSP','USA'],['Detroit','DTW','USA'],
  ['Calgary','YYC','Canada'],['Edmonton','YEG','Canada'],['Reykjavik','KEF','Iceland'],['Warsaw','WAW','Poland'],
  ['Prague','PRG','Czechia'],['Budapest','BUD','Hungary'],['Bucharest','OTP','Romania'],['Sofia','SOF','Bulgaria'],
  ['Kyiv','KBP','Ukraine'],['Belgrade','BEG','Serbia'],['Zagreb','ZAG','Croatia'],['Cape Verde','SID','Cape Verde']
];

function ppFilter(id){
  const raw=(document.getElementById(id+'-search').value||'').trim();
  const q=raw.toLowerCase();
  const dd=document.getElementById(id+'-dd');
  if(!q){dd.style.display='none';return;}
  const matches=PP_AIRPORTS.filter(a=>a[0].toLowerCase().includes(q)||a[1].toLowerCase().includes(q)||a[2].toLowerCase().includes(q)).slice(0,8);
  let html='';
  if(matches.length){
    html=matches.map(a=>`<div onclick="ppAddStop('${id}','${a[1]}','${a[0].replace(/'/g,"")}')" style="padding:9px 12px;cursor:pointer;border-bottom:1px solid rgba(255,255,255,0.06);display:flex;align-items:center;gap:8px" onmouseover="this.style.background='rgba(0,229,255,0.1)'" onmouseout="this.style.background='transparent'"><span style="font-family:'JetBrains Mono',monospace;font-weight:700;color:var(--cyan);min-width:34px">${a[1]}</span><span style="font-size:13px;color:var(--text)">${a[0]}</span><span style="font-size:11px;color:var(--text2);margin-left:auto">${a[2]}</span></div>`).join('');
  }
  // Always offer a "use exactly what I typed" custom option, so no airport is ever rejected
  const safe=raw.replace(/'/g,'').replace(/</g,'').replace(/>/g,'');
  if(safe.length>=2){
    const code=safe.replace(/[^A-Za-z]/g,'').slice(0,3).toUpperCase()||'*';
    html+=`<div onclick="ppAddStop('${id}','${code}','${safe}')" style="padding:9px 12px;cursor:pointer;border-top:1px solid rgba(255,255,255,0.12);display:flex;align-items:center;gap:8px;background:rgba(255,215,0,0.05)" onmouseover="this.style.background='rgba(255,215,0,0.14)'" onmouseout="this.style.background='rgba(255,215,0,0.05)'"><span style="font-size:13px;color:var(--gold)">+ Add &ldquo;${safe}&rdquo;</span><span style="font-size:11px;color:var(--text2);margin-left:auto">custom</span></div>`;
  }
  if(!html){dd.style.display='none';return;}
  dd.innerHTML=html;
  dd.style.display='block';
}
function ppAddStop(id,code,city){
  if(!window._ppRoutes[id])window._ppRoutes[id]=[];
  window._ppRoutes[id].push({k:code,c:city});
  document.getElementById(id+'-search').value='';
  document.getElementById(id+'-dd').style.display='none';
  ppRenderRoute(id);
}
function ppRemoveStop(id,idx){
  if(window._ppRoutes[id])window._ppRoutes[id].splice(idx,1);
  ppRenderRoute(id);
}
function ppRenderRoute(id){
  const wrap=document.getElementById(id+'-route');
  const stops=window._ppRoutes[id]||[];
  if(!stops.length){wrap.innerHTML='<span style="font-size:12px;color:var(--text2)">No stops yet - search and tap places to build your route.</span>';return;}
  wrap.innerHTML=stops.map((s,i)=>
    (i>0?'<span style="color:var(--gold);margin:0 2px">-></span>':'')+
    `<span style="display:inline-flex;align-items:center;gap:6px;background:rgba(0,229,255,0.12);border:1px solid rgba(0,229,255,0.3);color:var(--cyan);padding:4px 6px 4px 10px;border-radius:14px;font-size:12px;margin:2px 0"><b style="font-family:'JetBrains Mono',monospace">${s.k}</b> ${s.c}<span onclick="ppRemoveStop('${id}',${i})" style="cursor:pointer;background:rgba(255,23,68,0.2);color:var(--pink);width:16px;height:16px;border-radius:50%;display:inline-flex;align-items:center;justify-content:center;font-size:11px">✕</span></span>`
  ).join('');
}

function addFlightEntry(){
  ppCount++;
  const id = 'ppe'+ppCount;
  window._ppRoutes[id]=[];
  const div = document.createElement('div');
  div.id = id;
  div.className = 'pp-entry';
  div.style.cssText = 'background:rgba(255,255,255,0.03);border:1px solid rgba(255,215,0,0.15);border-radius:10px;padding:16px;margin-bottom:12px;position:relative';
  div.innerHTML = `
    ${ppCount>1?`<button onclick="document.getElementById('${id}').remove();delete window._ppRoutes['${id}']" style="position:absolute;top:8px;right:8px;background:rgba(255,23,68,0.15);border:1px solid rgba(255,23,68,0.3);color:var(--pink);width:24px;height:24px;border-radius:50%;cursor:pointer;font-size:14px">✕</button>`:''}
    <div style="font-size:10px;color:var(--text2);text-transform:uppercase;letter-spacing:.8px;margin-bottom:5px;font-weight:600">Trip ${ppCount} | Your Route *</div>
    <div id="${id}-route" style="margin-bottom:8px;line-height:1.9">No stops yet - search and tap places to build your route.</div>
    <div style="position:relative;margin-bottom:12px">
      <input autocomplete="off" oninput="ppFilter('${id}')" onfocus="ppFilter('${id}')" style="width:100%;background:rgba(255,255,255,0.05);border:1px solid rgba(255,255,255,0.1);color:var(--text);padding:9px 12px;border-radius:7px;font-size:13px;font-family:'Exo 2',sans-serif" placeholder="🔍 Search a city or airport (e.g. Mumbai, BOM)..." id="${id}-search">
      <div id="${id}-dd" style="display:none;position:absolute;top:100%;left:0;right:0;background:#0f1a2e;border:1px solid rgba(0,229,255,0.3);border-radius:8px;margin-top:4px;max-height:280px;overflow-y:auto;z-index:50;box-shadow:0 8px 24px rgba(0,0,0,0.5)"></div>
    </div>
    <div style="display:grid;grid-template-columns:1fr 1fr 1fr;gap:10px">
      <div><div style="font-size:10px;color:var(--text2);text-transform:uppercase;letter-spacing:.8px;margin-bottom:5px;font-weight:600">Airline (optional)</div>
        <input style="width:100%;background:rgba(255,255,255,0.05);border:1px solid rgba(255,255,255,0.1);color:var(--text);padding:9px 12px;border-radius:7px;font-size:13px;font-family:'Exo 2',sans-serif" placeholder="e.g. Air India" id="${id}-airline"></div>
      <div><div style="font-size:10px;color:var(--text2);text-transform:uppercase;letter-spacing:.8px;margin-bottom:5px;font-weight:600">Date (optional)</div>
        <input type="date" style="width:100%;background:rgba(255,255,255,0.05);border:1px solid rgba(255,255,255,0.1);color:var(--text);padding:9px 12px;border-radius:7px;font-size:13px;font-family:'Exo 2',sans-serif" id="${id}-date"></div>
      <div><div style="font-size:10px;color:var(--text2);text-transform:uppercase;letter-spacing:.8px;margin-bottom:5px;font-weight:600">Class (optional)</div>
        <select style="width:100%;background:#0f1a2e;border:1px solid rgba(255,255,255,0.1);color:var(--text);padding:9px 12px;border-radius:7px;font-size:13px;font-family:'Exo 2',sans-serif" id="${id}-class">
          <option value="">Select</option><option>Economy</option><option>Economy Plus</option><option>Business Class</option><option>First Class</option>
        </select></div>
    </div>`;
  document.getElementById('ppFlightEntries').appendChild(div);
}


/* IATA -> [lat,lon] for exact great-circle passport distance */
const PP_COORDS={
BOM:[19.09,72.87],DEL:[28.56,77.10],BLR:[13.20,77.71],MAA:[12.99,80.17],CCU:[22.65,88.45],HYD:[17.24,78.43],COK:[10.15,76.40],GOI:[15.38,73.83],AMD:[23.07,72.63],PNQ:[18.58,73.92],JAI:[26.82,75.81],LKO:[26.76,80.89],RAJ:[22.31,70.78],STV:[21.11,72.74],JGA:[22.47,70.01],BHJ:[23.29,69.67],TRV:[8.48,76.92],SXR:[33.99,74.77],GAU:[26.11,91.59],PAT:[25.59,85.09],NAG:[21.09,79.05],IDR:[22.72,75.80],BDQ:[22.34,73.23],CJB:[11.03,77.04],VNS:[25.45,82.86],ATQ:[31.71,74.80],IXE:[12.96,74.89],VTZ:[17.72,83.22],
DXB:[25.25,55.36],AUH:[24.43,54.65],SHJ:[25.33,55.52],DOH:[25.27,51.61],MCT:[23.59,58.28],KWI:[29.24,47.97],RUH:[24.96,46.70],JED:[21.68,39.16],BAH:[26.27,50.63],
LHR:[51.47,-0.45],LGW:[51.15,-0.18],MAN:[53.35,-2.27],CDG:[49.01,2.55],AMS:[52.31,4.76],FRA:[50.04,8.56],MUC:[48.35,11.79],ZRH:[47.46,8.55],FCO:[41.80,12.25],MXP:[45.63,8.72],MAD:[40.49,-3.57],BCN:[41.30,2.08],LIS:[38.77,-9.13],IST:[41.26,28.74],ATH:[37.94,23.95],VIE:[48.11,16.57],BRU:[50.90,4.48],CPH:[55.62,12.66],ARN:[59.65,17.92],OSL:[60.19,11.10],HEL:[60.32,24.96],DUB:[53.42,-6.27],SVO:[55.97,37.41],KEF:[63.99,-22.61],WAW:[52.17,20.97],PRG:[50.10,14.26],BUD:[47.44,19.26],OTP:[44.57,26.10],SOF:[42.69,23.41],KBP:[50.34,30.89],BEG:[44.82,20.29],ZAG:[45.74,16.07],LED:[59.80,30.26],AER:[43.45,39.96],KZN:[55.61,49.28],
JFK:[40.64,-73.78],EWR:[40.69,-74.17],LAX:[33.94,-118.41],ORD:[41.98,-87.90],SFO:[37.62,-122.38],BOS:[42.36,-71.01],IAD:[38.95,-77.46],MIA:[25.79,-80.29],DFW:[32.90,-97.04],ATL:[33.64,-84.43],SEA:[47.45,-122.31],IAH:[29.98,-95.34],LAS:[36.08,-115.15],MCO:[28.43,-81.31],YYZ:[43.68,-79.61],YVR:[49.19,-123.18],YUL:[45.47,-73.74],MEX:[19.44,-99.07],ANC:[61.17,-149.99],HNL:[21.32,-157.92],DEN:[39.86,-104.67],PHX:[33.43,-112.01],MSP:[44.88,-93.22],DTW:[42.21,-83.35],YYC:[51.13,-114.01],YEG:[53.31,-113.58],
GRU:[-23.43,-46.47],GIG:[-22.81,-43.25],EZE:[-34.82,-58.54],LIM:[-12.02,-77.11],BOG:[4.70,-74.15],SCL:[-33.39,-70.79],
SIN:[1.36,103.99],BKK:[13.69,100.75],HKT:[8.11,98.31],KUL:[2.75,101.71],CGK:[-6.13,106.66],DPS:[-8.75,115.17],MNL:[14.51,121.02],HAN:[21.22,105.81],SGN:[10.82,106.66],HKG:[22.31,113.92],HND:[35.55,139.78],NRT:[35.77,140.39],KIX:[34.43,135.24],ICN:[37.46,126.44],PEK:[40.08,116.58],PVG:[31.14,121.81],CAN:[23.39,113.30],SZX:[22.64,113.81],TPE:[25.08,121.23],CMB:[7.18,79.88],KTM:[27.70,85.36],DAC:[23.84,90.40],MLE:[4.19,73.53],KHI:[24.91,67.16],LHE:[31.52,74.40],ISB:[33.55,72.83],
SYD:[-33.95,151.18],MEL:[-37.67,144.84],BNE:[-27.38,153.12],PER:[-31.94,115.97],AKL:[-37.01,174.79],
CAI:[30.11,31.41],JNB:[-26.13,28.24],CPT:[-33.97,18.60],NBO:[-1.32,36.93],ADD:[8.98,38.80],LOS:[6.58,3.32],CMN:[33.37,-7.59],
TLV:[32.01,34.89],AMM:[31.72,35.99],BEY:[33.82,35.49],KBL:[34.57,69.21],BGW:[33.26,44.23],
GDX:[59.91,150.72],VVO:[43.40,132.15],OVB:[55.01,82.65],SVX:[56.74,60.80],IKT:[52.27,104.39],ALA:[43.35,77.04],TAS:[41.26,69.28],GYD:[40.47,50.05],TBS:[41.67,44.95],EVN:[40.15,44.40],IKA:[35.42,51.15],
SID:[16.74,-22.95]
};

function generatePassport(){
  const entries = document.querySelectorAll('.pp-entry');
  const trips = [];
  let valid = true;
  entries.forEach(entry => {
    const id = entry.id;
    const stops = (window._ppRoutes && window._ppRoutes[id]) ? window._ppRoutes[id] : [];
    if(stops.length < 2){valid=false;return;}
    trips.push({
      stops: stops,
      airline: (document.getElementById(id+'-airline')?.value||'').trim(),
      date: document.getElementById(id+'-date')?.value||'',
      cls: document.getElementById(id+'-class')?.value||'Economy'
    });
  });
  if(!valid||!trips.length){alert('Please build at least one route with 2 or more stops (search a city and tap to add it).');return;}

  // ── Pull the user's name for the photo page ──
  let u=null;try{u=getUser();}catch(e){}
  const fullName=(u&&u.name)?u.name.trim():'Passenger';
  const parts=fullName.split(/\s+/);
  const surname=(parts.length>1?parts[parts.length-1]:fullName).toUpperCase();
  const given=(parts.length>1?parts.slice(0,-1).join(' '):fullName).toUpperCase();
  const setT=(id,v)=>{const el=document.getElementById(id);if(el)el.textContent=v;};
  setT('ppLastName',surname);
  setT('ppFirstName',given);
  setT('ppPhoto','✈');
  setT('ppSince',(u&&u.since)?u.since:new Date().getFullYear());

  // ── Machine-readable strip (looks like a real passport MRZ) ──
  const mrzName=(surname+'<<'+given.replace(/\s+/g,'<')).replace(/[^A-Z<]/g,'').padEnd(39,'<').slice(0,39);
  const serial='JSL'+String((u&&u.id?u.id:Math.floor(Math.random()*900000+100000))).slice(0,6).padStart(6,'0');
  const mrz=document.getElementById('ppMRZ');
  if(mrz)mrz.innerHTML='P&lt;IND'+mrzName.replace(/</g,'&lt;')+'<br>'+serial+'&lt;8IND'+new Date().getFullYear()+'01011M3112310&lt;&lt;&lt;&lt;&lt;&lt;0';

  // ── Flatten all stops ──
  const allStops=[]; // {k,c,date}
  let legCount=0;
  trips.forEach(t=>{
    legCount += (t.stops.length-1);
    t.stops.forEach(s=>allStops.push({k:s.k,c:s.c,date:t.date}));
  });
  const cityKeys = new Set(allStops.map(s=>s.k));
  const countries = new Set();
  allStops.forEach(s=>{const a=PP_AIRPORTS.find(x=>x[1]===s.k);if(a)countries.add(a[2]);});
  const airlines = new Set(trips.filter(t=>t.airline).map(t=>t.airline.toLowerCase()));
  // ── Exact distance (great-circle) + estimated flight time ──
  let totalKm=0,totalHrs=0;
  trips.forEach(t=>{
    for(let i=1;i<t.stops.length;i++){
      const A=PP_COORDS[t.stops[i-1].k],B=PP_COORDS[t.stops[i].k];
      const legKm=(A&&B)?gcDist(A[0],A[1],B[0],B[1]):1850; // fallback for custom airports
      totalKm+=legKm;
      totalHrs+=legKm/800+0.5; // ~800 km/h cruise + ~30 min taxi/climb/descent per leg
    }
  });
  totalKm=Math.round(totalKm);
  const totalHrsR=Math.round(totalHrs);
  const airlinesCount=airlines.size;
  setT('pp-flights',legCount);
  setT('pp-km',totalKm.toLocaleString());
  setT('pp-hrs',totalHrsR);
  setT('pp-countries',countries.size||1);
  setT('pp-apts',cityKeys.size);
  setT('pp-airlines2',airlinesCount);

  // ── Destination stamps (one per unique airport, real IATA codes) ──
  const stampWrap=document.getElementById('ppStamps');
  if(stampWrap){
    const seen=new Set();let html='';let i=0;
    allStops.forEach(({k,c,date})=>{
      if(seen.has(k))return;seen.add(k);
      const cls='stamp-s'+((i%5)+1);i++;
      const dateStr=date?new Date(date).toLocaleDateString('en-GB',{day:'2-digit',month:'short',year:'numeric'}).toUpperCase():c.toUpperCase();
      html+='<div class="stamp '+cls+'"><div class="stamp-top">✈ '+c.toUpperCase().slice(0,12)+'</div><div class="stamp-code">'+k+'</div><div class="stamp-date">'+dateStr+'</div></div>';
    });
    stampWrap.innerHTML=html;
  }

  // ── Airlines flown chips ──
  const acWrap=document.getElementById('airlineChips');
  if(acWrap){
    if(airlines.size===0){acWrap.innerHTML='<span style="color:#999;font-size:11px">No airlines added yet</span>';}
    else{const seenA=new Set();let h='';trips.forEach(t=>{const key=(t.airline||'').toLowerCase();if(!key||seenA.has(key))return;seenA.add(key);h+='<span style="display:inline-block;background:rgba(30,144,255,0.1);border:1px solid rgba(30,144,255,0.3);color:#1a4a8a;padding:4px 10px;border-radius:12px;font-size:11px;font-weight:600;margin:2px">✈ '+t.airline+'</span>';});acWrap.innerHTML=h;}
  }

  // ── Save so it persists (BEFORE refreshing panels, so they read fresh stats) ──
  try{
    if(u){u.flightLog=trips;u.stats={flights:legCount,km:totalKm,hrs:totalHrsR,countries:countries.size||1,apts:cityKeys.size,airlines:airlinesCount};
      localStorage.setItem('jsCurrentUser',JSON.stringify(u));
      const all=getUsers();if(u.email&&all[u.email]){all[u.email]=u;localStorage.setItem('jsUsers',JSON.stringify(all));}
    }
  }catch(e){}

  // ── Keep the Spotter's Logbook chips/badges in sync ──
  try{if(typeof initPassport==='function')initPassport();}catch(e){}
  try{if(typeof renderLogbookCards==='function')renderLogbookCards();}catch(e){}

  const pp=document.getElementById('ppPassport');
  pp.style.display='block';
  pp.scrollIntoView({behavior:'smooth',block:'start'});
}

window.addEventListener('load',()=>{
  // Premium scroll-reveal: gently rise sections/cards into view
  try{
    const io=new IntersectionObserver((entries)=>{
      entries.forEach(en=>{if(en.isIntersecting){en.target.classList.add('fade-up');io.unobserve(en.target);}});
    },{threshold:0.08});
    document.querySelectorAll('section .sec-head, section .orb, .feature-card, .stat-card').forEach(el=>{
      // don't re-animate things already visible at top
      io.observe(el);
    });
  }catch(e){}
  // Scroll color-shift: change body stage as landing sections enter view
  try{
    const stages=document.querySelectorAll('[data-stage]');
    if(stages.length){
      const so=new IntersectionObserver((entries)=>{
        entries.forEach(en=>{
          if(en.isIntersecting){
            const st=en.target.getAttribute('data-stage');
            document.body.setAttribute('data-lpstage',st);
          }
        });
      },{threshold:0.4});
      stages.forEach(s=>so.observe(s));
      document.body.setAttribute('data-lpstage','0');
    }
  }catch(e){}
  // Fix map height after DOM renders
  setTimeout(fixMapHeight, 100);
  setTimeout(fixMapHeight, 500);
  // Passport init - safely
  try{if(typeof addFlightEntry==='function'&&document.getElementById('ppFlightEntries'))addFlightEntry();}catch(e){}
  try{if(typeof loadSavedPassport==='function')loadSavedPassport();}catch(e){}
  try{if(typeof renderLogbookCards==='function')renderLogbookCards();}catch(e){}

  // addFlightEntry called safely abovety entry to start
  // loadSavedPassport called safely above

  try{initMap();}catch(e){console.warn('initMap',e);}
  try{if(typeof renderAirports==='function')renderAirports();}catch(e){console.warn('renderAirports',e);}
  try{if(typeof renderCelebs==='function')renderCelebs();}catch(e){console.warn('renderCelebs',e);}
  try{if(typeof renderMilitary==='function')renderMilitary();}catch(e){console.warn('renderMilitary',e);}
  
// ── MILITARY AIRCRAFT TRACKER ─────────────────────────────────
// Known military callsign prefixes (publicly broadcast only)
const MIL_PREFIXES = [
  'RCH','REACH','JAKE','MAZER','SPAR','VENUS','COBRA','EAGLE','FALCON',
  'TORCH','VIPER','KNIFE','STEEL','IRON','GHOST','BONE','SWIFT','FURY',
  'RANGER','RAPTOR','TALON','DEMON','HAVOC','PEDRO','WOLF','SHARK',
  'TIGER','MAGMA','BOXER','ROCKY','HOMER','TOPAZ','ANVIL','AZTEC',
  'BLADE','BISON','BUCK','BULLET','CAESAR','CAMBER','CAPE','CASH',
  'CHALK','CHAOS','CHESS','CHIEF','CIVIC','CLAM','COAL','COBRA',
  'COFFEE','COLA','COOL','CORE','CRAB','CRANE','CRASH','CRAZY',
  'DUKE','DUSTY','EVAC','FEVER','FLASH','FLEX','FORD','FORGE',
  'FORTE','FORUM','FOXTROT','FRAG','FRANK','FRED','FRESH','FROST',
  'FURY','GATE','GHOST','GIANT','GLOBE','GOLD','GOLF','GORE',
  'GRANT','GRAVE','GREEK','GRIM','GRIND','GRIP','GROAN','GROVE',
  'GUARD','GUIDE','GULF','GUNSHIP','HAWK','HEAVY','HERO','HIGH',
  'HOLLY','HOOK','HOSE','HOTEL','HOUND','HYDRA','INCA','JADE',
  'JAG','JAM','JAWS','JAZZ','JEWEL','JOINT','JOKER','JUDGE',
  'JUMBO','JUICE','KAGE','KARMA','KILO','KING','KNIFE','LANCE',
  'LASER','LEMON','LIMA','LINK','LION','LIPO','LIVE','LOAD',
  'LOCO','LOGIC','LONER','LOON','LORD','LOSS','LOTUS','LURE',
  'LYNCH','MAGIC','MARS','MASK','MAZE','MEDIA','MEDIC','MERCY',
  'MIKE','MINE','MIST','MOOSE','MOPE','MORGAN','MOTOR','MOUNT',
  'MOVER','MULE','MUSE','NATO','NAVY','NINJA','NOBLE','NOMAD',
  'NORM','NORTH','NOVA','NUKE','OAK','OCEAN','OLIVE','OLYMP',
  'OMEGA','ORCA','ORDER','ORION','OSCAR','OUIJA','OXIDE'
];

// Known military ICAO hex ranges
function isMilitaryHex(hex){
  const h=parseInt(hex,16);
  // US Military: ADF000-ADFFFF, AE0000-AFFFFF
  if(h>=0xADF000&&h<=0xAFFFFF)return true;
  // UK Military: 43C000-43CFFF
  if(h>=0x43C000&&h<=0x43CFFF)return true;
  // French Military: 3A8000-3AFFFF
  if(h>=0x3A8000&&h<=0x3AFFFF)return true;
  // German Military: 3DC000-3DCFFF
  if(h>=0x3DC000&&h<=0x3DCFFF)return true;
  // Indian Military: 800000-87FFFF (broad range, filter by callsign)
  return false;
}

function isMilitaryCallsign(cs){
  if(!cs)return false;
  const upper=cs.toUpperCase().trim();
  return MIL_PREFIXES.some(p=>upper.startsWith(p));
}

function renderMilitary(){
  const grid=document.getElementById('milGrid');
  if(!grid)return;

  // Find military aircraft from live data
  const milFlights=allFlights.filter(f=>{
    const cs=((f[1]||'').trim()).toUpperCase();
    const hex=(f[0]||'').toLowerCase();
    return isMilitaryCallsign(cs)||isMilitaryHex(hex);
  }).filter(f=>!f[8]) // airborne only
    .slice(0,24);

  if(!milFlights.length){
    grid.innerHTML=`
      <div style="grid-column:1/-1;text-align:center;padding:48px 20px;color:var(--text2)">
        <div style="font-size:48px;margin-bottom:12px">🛡</div>
        <div style="font-family:'Orbitron',monospace;font-size:13px;font-weight:700;color:var(--text2);margin-bottom:8px">NO MILITARY TRANSPONDERS ACTIVE</div>
        <div style="font-size:11px;color:var(--text3);max-width:400px;margin:0 auto;line-height:1.7">Military aircraft only appear when they voluntarily broadcast ADS-B transponder signals. Many military flights operate with transponders off for security reasons.</div>
      </div>`;
    return;
  }

  // Also directly fetch known military callsigns from our feed
  ['RCH','REACH','JAKE','SPAR','VENUS','COBRA','EAGLE'].forEach(cs=>{
    fetch('https://api.adsb.lol/v2/callsign/'+cs,{signal:AbortSignal.timeout(5000)})
      .then(r=>r.json())
      .then(d=>{
        const ac=(d.ac||[]).filter(a=>a.lat&&a.lon&&a.alt_baro!=='ground');
        if(ac.length){
          let updated=false;
          ac.forEach(a=>{
            const hex=(a.hex||'').toLowerCase();
            if(!allFlights.find(f=>f[0]===hex)){
              allFlights.push([hex,(a.flight||'').trim(),'',Date.now()/1000,Date.now()/1000,a.lon,a.lat,a.alt_baro*0.3048||0,false,(a.gs||0)*0.514444,a.track||0,(a.baro_rate||0)*0.00508,null,null,a.squawk||null,null,0,a.r||'',a.t||'']);
              updated=true;
            }
          });
          if(updated)renderMilitary();
        }
      }).catch(()=>{});
  });

  grid.innerHTML=milFlights.map(f=>{
    const cs=((f[1]||'').trim()).toUpperCase()||'UNKNOWN';
    const hex=(f[0]||'').toUpperCase();
    const alt=f[7]?Math.round(f[7]*3.281).toLocaleString()+' ft':'-';
    const spd=f[9]?Math.round(f[9]*1.944)+' kt':'-';
    const hdg=f[10]?Math.round(f[10])+'°':'-';
    const vspd=f[11]?(f[11]>0.5?'🟢 CLIMBING':f[11]<-0.5?'🔴 DESCENDING':'🔵 LEVEL'):'🔵 LEVEL';
    const ac=f[18]||'Unknown type';
    return `
      <div class="mil-card" onclick="location.href='flight.html?cs=${cs}&icao=${f[0]}'">
        <div style="display:flex;justify-content:space-between;align-items:flex-start;margin-bottom:10px">
          <div>
            <div style="font-family:'Orbitron',monospace;font-size:15px;font-weight:900;color:#00ff7f">${cs}</div>
            ${ac&&ac!=='Unknown type'?`<div style="font-size:10px;color:var(--text3);margin-top:2px;font-family:'JetBrains Mono',monospace">${ac}</div>`:''}
          </div>
          <div style="display:flex;flex-direction:column;align-items:flex-end;gap:4px">
            <div style="background:rgba(0,255,127,0.1);border:1px solid rgba(0,255,127,0.3);color:#00ff7f;padding:2px 8px;border-radius:10px;font-size:9px;font-weight:700;display:flex;align-items:center;gap:4px"><div class="live-dot" style="background:#00ff7f;box-shadow:0 0 6px #00ff7f"></div>TRANSPONDER ACTIVE</div>
            <div style="font-family:'JetBrains Mono',monospace;font-size:9px;color:var(--text3)">ICAO: ${hex}</div>
          </div>
        </div>
        <div style="display:grid;grid-template-columns:repeat(3,1fr);gap:6px;margin-bottom:8px">
          <div style="background:rgba(255,255,255,0.04);border-radius:7px;padding:8px;text-align:center">
            <div style="font-family:'JetBrains Mono',monospace;font-size:13px;font-weight:700;color:var(--gold)">${alt}</div>
            <div style="font-size:9px;color:var(--text3);margin-top:3px;text-transform:uppercase">Altitude</div>
          </div>
          <div style="background:rgba(255,255,255,0.04);border-radius:7px;padding:8px;text-align:center">
            <div style="font-family:'JetBrains Mono',monospace;font-size:13px;font-weight:700;color:var(--cyan)">${spd}</div>
            <div style="font-size:9px;color:var(--text3);margin-top:3px;text-transform:uppercase">Speed</div>
          </div>
          <div style="background:rgba(255,255,255,0.04);border-radius:7px;padding:8px;text-align:center">
            <div style="font-family:'JetBrains Mono',monospace;font-size:13px;font-weight:700;color:var(--text)">${hdg}</div>
            <div style="font-size:9px;color:var(--text3);margin-top:3px;text-transform:uppercase">Heading</div>
          </div>
        </div>
        <div style="display:flex;align-items:center;justify-content:space-between">
          <div style="font-size:11px">${vspd}</div>
          <div style="font-size:10px;color:var(--text3)">Click to track -></div>
        </div>
      </div>`;
  }).join('');
}

renderBriefs();
  renderFriends();
  initTV();
  updateAuthUI();
  setTimeout(()=>{
    // Wait for DOM to fully render then init radars (guarded - may not exist on every view)
    const gr=document.getElementById('groundRadar');
    if(gr){ gr.width=gr.offsetWidth||380; gr.height=gr.offsetWidth||380; }
    const pr=document.getElementById('proximityRadar');
    if(pr){ pr.width=pr.offsetWidth||380; pr.height=pr.offsetWidth||380; }
    try{initGroundRadar();}catch(e){}
    try{initProximityRadar();}catch(e){}
  },600);
  qMETAR('VABB');
});
</script>

<!-- ══ BOARDING PASS FULL-SCREEN MODAL ══ -->
<div class="bp-overlay" id="bpOverlay" onclick="if(event.target===this)closeBP()">
  <button class="bp-close" onclick="closeBP()">✕</button>
  <div class="bp-modal">
    <div class="bp-header">
      <div class="bp-airline-badge" id="bp-badge">✈</div>
      <div>
        <div class="bp-flight-num" id="bp-flightnum">-</div>
        <div class="bp-airline-name" id="bp-airlinename">-</div>
      </div>
      <div style="margin-left:auto;text-align:right">
        <div style="font-size:10px;color:var(--text2);text-transform:uppercase;letter-spacing:1px">Aircraft Type</div>
        <div class="mono" style="font-size:14px;font-weight:700;color:var(--gold)" id="bp-actype">-</div>
        <div class="mono f11 tc-muted mt8" id="bp-reg">-</div>
      </div>
    </div>
    <div class="bp-card">
      <div class="bp-route-bar">
        <div>
          <div class="bp-apt-big tc-cyan" id="bp-from">-</div>
          <div class="bp-apt-city" id="bp-fromcity">Origin</div>
        </div>
        <div class="bp-route-mid">
          <div class="bp-route-line"></div>
          <div class="bp-duration" id="bp-status">EN ROUTE</div>
        </div>
        <div style="text-align:right">
          <div class="bp-apt-big" style="color:var(--gold)" id="bp-to">-</div>
          <div class="bp-apt-city" id="bp-tocity">Destination</div>
        </div>
      </div>
      <div class="bp-divider"></div>
      <div class="bp-grid">
        <div class="bp-cell"><div class="bp-cell-label">Speed</div><div class="bp-cell-val tc-cyan" id="bp-spd">-</div></div>
        <div class="bp-cell"><div class="bp-cell-label">Altitude</div><div class="bp-cell-val tc-gold" id="bp-alt">-</div></div>
        <div class="bp-cell"><div class="bp-cell-label">Heading</div><div class="bp-cell-val tc-blue" id="bp-hdg">-</div></div>
        <div class="bp-cell"><div class="bp-cell-label">V/Speed</div><div class="bp-cell-val tc-green" id="bp-vspd">-</div></div>
        <div class="bp-cell"><div class="bp-cell-label">Longitude</div><div class="bp-cell-val" style="font-size:12px" id="bp-lon">-</div></div>
        <div class="bp-cell"><div class="bp-cell-label">Latitude</div><div class="bp-cell-val" style="font-size:12px" id="bp-lat">-</div></div>
        <div class="bp-cell"><div class="bp-cell-label">ICAO24</div><div class="bp-cell-val mono" style="font-size:12px" id="bp-icao">-</div></div>
        <div class="bp-cell"><div class="bp-cell-label">Squawk</div><div class="bp-cell-val mono" id="bp-squawk">-</div></div>
        <div class="bp-cell"><div class="bp-cell-label">On Ground</div><div class="bp-cell-val" id="bp-ground">-</div></div>
      </div>
      <div class="bp-status-bar">
        <div class="bp-live-badge"><div class="live-dot"></div>LIVE TRACKING</div>
        <div style="font-size:11px;color:var(--text2)" id="bp-lastseen">-</div>
      </div>
      <div class="bp-barcode">
        <div class="bp-barcode-lines" id="bp-barcode">||||||||| ||||| ||||||||||| ||||| ||||||||||||| ||||||||||||| |||||||||||||||||||| ||||||||||||||||||| ||||||||||||||||||||||||||||| ||||||||||||||||||||||| |||||||||||||||||||||||||||||||||</div>
        <div class="mono f11 tc-muted mt8" id="bp-icao2">JETSTREAM LIVE | LIVE FLIGHT DATA</div>
      </div>
    </div>
    <div class="bp-actions">
      <button class="bp-action-btn" style="background:linear-gradient(135deg,var(--blue),var(--cyan));color:#fff" onclick="centreOnActiveFlight()">📍 Centre Map</button>
      <button class="bp-action-btn" style="background:rgba(255,255,255,0.07);border:1px solid var(--border);color:var(--text)" onclick="closeBP()">✕ Close</button>
    </div>
  </div>
</div>

<!-- THEME PICKER -->
<button id="themeBtn" onclick="themeOpen()" title="Themes">⚙</button>
<div id="themeModal" onclick="if(event.target===this)themeClose()">
  <div class="theme-box">
    <h3>✦ Themes</h3>
    <div class="ts-sub">Personalise the look of JetStream Live.</div>
    <div class="ts-label">App Theme</div>
    <div class="ts-grid" id="tsApp">
      <div class="ts-opt" data-app="cyber" onclick="setAppTheme('cyber')"><div class="ts-swatch"><span style="background:#010b1a"></span><span style="background:#1E90FF"></span><span style="background:#00E5FF"></span></div><div class="ts-name">Cyber Blue</div></div>
      <div class="ts-opt" data-app="purple" onclick="setAppTheme('purple')"><div class="ts-swatch"><span style="background:#0a0418"></span><span style="background:#7B2FFF"></span><span style="background:#C77DFF"></span></div><div class="ts-name">Nebula Purple</div></div>
      <div class="ts-opt" data-app="stealth" onclick="setAppTheme('stealth')"><div class="ts-swatch"><span style="background:#020503"></span><span style="background:#00C853"></span><span style="background:#00FF7F"></span></div><div class="ts-name">Stealth</div></div>
      <div class="ts-opt" data-app="sunset" onclick="setAppTheme('sunset')"><div class="ts-swatch"><span style="background:#180a04"></span><span style="background:#FF6B35"></span><span style="background:#FFB347"></span></div><div class="ts-name">Afterburner</div></div>
      <div class="ts-opt" data-app="arctic" onclick="setAppTheme('arctic')"><div class="ts-swatch"><span style="background:#0a1420"></span><span style="background:#2DA8FF"></span><span style="background:#7FE7FF"></span></div><div class="ts-name">Arctic</div></div>
    </div>
    <div class="ts-label">Map Theme</div>
    <div class="ts-grid" id="tsMap">
      <div class="ts-opt" data-map="dark" onclick="setMapTheme('dark')"><div class="ts-swatch"><span style="background:#1a2535"></span></div><div class="ts-name">Dark</div></div>
      <div class="ts-opt" data-map="satellite" onclick="setMapTheme('satellite')"><div class="ts-swatch"><span style="background:#2d4a2d"></span></div><div class="ts-name">Satellite</div></div>
      <div class="ts-opt" data-map="light" onclick="setMapTheme('light')"><div class="ts-swatch"><span style="background:#e8edf2"></span></div><div class="ts-name">Smooth Light</div></div>
      <div class="ts-opt" data-map="terrain" onclick="setMapTheme('terrain')"><div class="ts-swatch"><span style="background:#c9d6b0"></span></div><div class="ts-name">Terrain</div></div>
    </div>
    <button class="ts-close" onclick="themeClose()">Done</button>
  </div>
</div>

<!-- JETSTREAM AI ASSISTANT -->
<button id="jaiBtn" onclick="jaiToggle()" title="Ask JetStream AI">🤖</button>
<div id="jaiPanel">
  <div class="jai-head">
    <div class="jai-head-icon">🤖</div>
    <div style="flex:1">
      <div class="jai-head-t">JetStream AI</div>
      <div class="jai-head-s">● Your aviation assistant</div>
    </div>
    <button onclick="jaiToggle()" style="background:none;border:none;color:#fff;font-size:18px;cursor:pointer">✕</button>
  </div>
  <div class="jai-body" id="jaiBody"></div>
  <div class="jai-foot">
    <input class="jai-input" id="jaiInput" placeholder="Ask me anything about flights or the app..." onkeydown="if(event.key==='Enter')jaiSend()">
    <button class="jai-send" onclick="jaiSend()">➤</button>
  </div>
</div>

<!-- App-only status bar (shows link/page destination, browser-style) -->
<div id="appStatusBar"></div>
<style>
#appStatusBar{position:fixed;left:0;bottom:0;z-index:2147483000;max-width:70%;
  background:#0a0420;color:#cfe8ff;font-family:'Share Tech Mono',monospace;font-size:12px;
  letter-spacing:.3px;padding:4px 12px;border-top-right-radius:6px;border:1px solid var(--border2);
  border-left:none;border-bottom:none;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;
  opacity:0;transform:translateY(6px);transition:opacity .12s,transform .12s;pointer-events:none;
  box-shadow:0 -2px 14px rgba(0,0,0,.4)}
#appStatusBar.show{opacity:1;transform:translateY(0)}
/* only takes effect when launched as the installed app */
body:not(.is-app) #appStatusBar{display:none}
/* ===== Menu drawer =========================================================
   The nav row ran out of room once the passenger pages were added, so every
   destination now lives in a drawer opened from the dots at the top left.
   Labels get their full width here instead of being clipped to three letters. */
.jsl-menu-btn{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:3px;
  width:34px;height:34px;flex-shrink:0;border:1px solid var(--border,rgba(168,85,247,.28));
  background:rgba(255,255,255,.04);border-radius:9px;cursor:pointer;margin-right:10px;transition:all .2s}
.jsl-menu-btn:hover{border-color:var(--cyan);background:rgba(34,211,238,.10)}
.jsl-menu-btn i{display:block;width:4px;height:4px;border-radius:50%;background:var(--text,#F5F0FF)}
.jsl-menu-btn:hover i{background:var(--cyan)}

.jsl-drawer{position:fixed;inset:0;z-index:9999;visibility:hidden;opacity:0;transition:opacity .22s,visibility .22s}
.jsl-drawer.open{visibility:visible;opacity:1}
.jsl-drawer-bg{position:absolute;inset:0;background:rgba(3,1,12,.72);backdrop-filter:blur(3px)}
.jsl-drawer-panel{position:absolute;top:0;left:0;bottom:0;width:290px;max-width:86vw;overflow-y:auto;
  background:#0d0526;border-right:1px solid var(--border,rgba(168,85,247,.28));
  transform:translateX(-100%);transition:transform .25s cubic-bezier(.22,.7,.3,1);padding-bottom:26px}
.jsl-drawer.open .jsl-drawer-panel{transform:translateX(0)}
.jsl-drawer-head{display:flex;align-items:center;gap:10px;padding:14px 16px;
  border-bottom:1px solid var(--border,rgba(168,85,247,.28));position:sticky;top:0;background:#0d0526;z-index:2}
.jsl-drawer-head img{width:30px;height:30px;border-radius:8px}
.jsl-drawer-head b{font-family:'Orbitron',monospace;font-size:13px;font-weight:900;letter-spacing:.5px;color:var(--text,#F5F0FF)}
.jsl-drawer-close{margin-left:auto;background:none;border:none;color:var(--text2,#B8A5D8);font-size:22px;
  cursor:pointer;line-height:1;padding:2px 6px;border-radius:6px}
.jsl-drawer-close:hover{color:var(--pink,#F472B6)}
.jsl-drawer-group{padding:14px 16px 4px;font-family:'JetBrains Mono',monospace;font-size:9.5px;
  letter-spacing:2px;text-transform:uppercase;color:#6b5a8f}
.jsl-drawer .nav-btn{display:block;width:100%;text-align:left;padding:11px 16px;font-size:13px;
  border-radius:0;letter-spacing:.3px;text-transform:none;white-space:normal}
.jsl-drawer .nav-btn:hover{background:rgba(34,211,238,.10);transform:none}
.jsl-drawer .nav-btn.active{background:rgba(34,211,238,.08);color:var(--cyan)}
.jsl-drawer .nav-btn.active::after{left:0;right:auto;top:0;bottom:0;width:3px;height:auto;border-radius:0}
body.jsl-locked{overflow:hidden}
