:root{
  --black:#05060a;--panel:#090c14;--panel2:#0d1220;--cyan:#38f5ff;
  --green:#5cff73;--purple:#9e71ff;--pink:#ff4bd8;--yellow:#f8df67;
  --red:#ff5b72;--text:#e9f8ff;--muted:#8293ad;--border:#27344e
}
*{box-sizing:border-box}
html,body{margin:0;background:#05060a;color:var(--text);font-family:"Exo 2","Segoe UI",Arial,sans-serif}
body{
  min-height:100vh;
  background:
    radial-gradient(circle at 15% -10%,rgba(158,113,255,.18),transparent 34rem),
    radial-gradient(circle at 100% 0,rgba(255,75,216,.10),transparent 30rem),
    linear-gradient(#05060a,#070912 70%,#030407)
}
body:before{
  content:"";position:fixed;inset:0;pointer-events:none;opacity:.14;z-index:9999;
  background:repeating-linear-gradient(to bottom,rgba(255,255,255,.035) 0,rgba(255,255,255,.035) 1px,transparent 1px,transparent 4px)
}
.wrap{width:min(980px,100%);margin:auto;padding:12px 12px 46px}
.game-wrap{width:min(760px,100%)}
.topbar{display:flex;justify-content:space-between;gap:10px;padding:8px 2px;color:var(--cyan);font-size:12px;text-transform:uppercase;letter-spacing:.08em}
.panel{border:1px solid rgba(56,245,255,.55);background:linear-gradient(180deg,rgba(13,18,32,.96),rgba(7,10,18,.97));border-radius:14px;padding:14px;margin:10px 0}
.panel.purple{border-color:rgba(158,113,255,.7)}
.panel.pink{border-color:rgba(255,75,216,.7)}
.eyebrow,.label{font-size:11px;text-transform:uppercase;letter-spacing:.12em;font-weight:800}
.eyebrow{color:var(--purple)} .label{color:var(--cyan);margin-bottom:6px}
h1{font-size:clamp(27px,8vw,50px);line-height:.95;text-transform:uppercase;margin:7px 0 9px}
h2,h3{margin:7px 0 10px}.muted{color:var(--muted)}.small{font-size:12px;line-height:1.4}
.bigcode{font-size:clamp(28px,8vw,52px);line-height:.95;color:var(--cyan);font-weight:900}
.pink{color:var(--pink)}.green{color:var(--green)}.yellow{color:var(--yellow)}
button,.button{
  min-height:44px;border-radius:10px;border:1px solid transparent;padding:10px 13px;
  font:900 14px/1 "Exo 2","Segoe UI",Arial,sans-serif;text-transform:uppercase;letter-spacing:.035em;cursor:pointer
}
button:disabled{opacity:.45;cursor:not-allowed}
.primary{background:var(--green);color:#061008}
.secondary{background:#0b1020;color:var(--cyan);border-color:rgba(56,245,255,.55)}
.pinkbtn{background:var(--pink);color:#160314}
.danger{background:#281019;color:#ff98aa;border-color:#743043}
.actions{display:flex;gap:8px;flex-wrap:wrap}.actions>*{flex:1 1 150px}
input,textarea,select{
  width:100%;border-radius:9px;border:1px solid #32425f;background:#060a13;color:#fff;
  padding:11px;font:16px/1.3 "Exo 2","Segoe UI",Arial,sans-serif;outline:none
}
input:focus,textarea:focus,select:focus{border-color:var(--cyan);box-shadow:0 0 0 2px rgba(56,245,255,.12)}
.hidden{display:none!important}.center{text-align:center}
.header-art{position:relative;overflow:hidden;border:1px solid rgba(158,113,255,.6);border-radius:14px;background:#080a10;margin-bottom:6px;max-height:600px;opacity:1;transition:max-height .24s ease,opacity .18s ease,border-width .18s ease,margin .18s ease}
.header-art img{display:block;width:100%;height:auto}.header-art.collapsed{max-height:0;opacity:0;border-width:0;margin:0}
.header-toggle{width:100%;min-height:34px;margin:0 0 8px;padding:7px 10px;font-size:11px;color:var(--muted);background:#080b13;border:1px solid #25314a}
.status-grid{display:grid;grid-template-columns:1fr 1fr;gap:8px}.statusbox{border:1px solid rgba(158,113,255,.55);border-radius:11px;padding:9px 10px;background:#070a12}
.value{font-size:clamp(28px,9vw,52px);color:var(--green);font-weight:900;line-height:1}
.direction-wrap{display:flex;align-items:center;gap:8px;margin-top:5px}.direction-arrow{width:46px;height:46px;display:grid;place-items:center;font-size:39px;line-height:1;color:var(--pink);transform:rotate(0deg);transition:transform .18s linear}
.bearing{font-weight:900;color:var(--cyan);font-size:17px}
.signalbar{display:grid;grid-template-columns:repeat(4,1fr);gap:5px;margin-top:9px}.signalbar i{height:8px;border-radius:2px;background:#22283a}.signalbar i.on:nth-child(1){background:var(--cyan)}.signalbar i.on:nth-child(2){background:var(--purple)}.signalbar i.on:nth-child(3){background:var(--pink)}.signalbar i.on:nth-child(4){background:var(--green)}
.gps-quality{display:inline-flex;padding:5px 8px;border-radius:999px;border:1px solid #35425c;background:#080c15;font-size:10px;font-weight:900;text-transform:uppercase;margin-top:6px}
.gps-quality.good{color:var(--green)}.gps-quality.ok{color:var(--yellow)}.gps-quality.bad{color:var(--red)}
.message{border-left:4px solid var(--purple);padding-left:12px;font-size:18px;line-height:1.45}
.clue-image{display:block;width:100%;max-height:330px;object-fit:contain;border-radius:10px;margin-top:12px;border:1px solid #283754;background:#05070b}
.locked-hint{filter:blur(6px);user-select:none;opacity:.55;background:#15202a;padding:12px;border-radius:8px;color:#d9f9ff;text-align:center}.hint-open{filter:none;opacity:1}
.cache-dots{display:flex;gap:6px;flex-wrap:wrap}.cache-dots span{width:23px;height:23px;border:1px solid #34405c;border-radius:4px;display:grid;place-items:center;font-size:10px;color:#64718a}.cache-dots span.done{background:var(--green);color:#051008;border-color:var(--green)}.cache-dots span.now{border-color:var(--pink);color:var(--pink)}
.flash{animation:flash 1s steps(2,end) infinite}@keyframes flash{50%{opacity:.35}}@media(prefers-reduced-motion:reduce){.flash{animation:none}}
.footer{text-align:center;color:#4e5d77;font-size:10px;text-transform:uppercase;letter-spacing:.1em;margin-top:20px}

/* map */
.map{width:100%;height:350px;position:relative;overflow:hidden;touch-action:none;overscroll-behavior:contain;isolation:isolate;border-radius:10px;background:#0a0d13;border:1px solid rgba(56,245,255,.5)}
.admin-map{height:540px}
@media(max-width:700px){.map,.admin-map{height:320px}}

.user-icon{width:24px;height:24px;border-radius:50%;background:#378cff;border:3px solid white;box-shadow:0 0 0 7px rgba(55,140,255,.18)}
.target-icon{width:44px;height:44px;border-radius:50%;display:grid;place-items:center;font-size:27px;background:rgba(255,75,216,.23);border:2px solid var(--pink);box-shadow:0 0 0 7px rgba(255,75,216,.10),0 0 20px rgba(255,75,216,.7)}
.admin-stop-icon{width:32px;height:32px;border-radius:50%;display:grid;place-items:center;font-weight:900;background:#0b1020;border:2px solid var(--cyan);color:var(--cyan);box-shadow:0 0 14px rgba(56,245,255,.3)}
.admin-stop-icon.selected{border-color:var(--pink);color:var(--pink);box-shadow:0 0 18px rgba(255,75,216,.55)}
.draft-icon{width:36px;height:36px;border-radius:50%;display:grid;place-items:center;font-weight:900;background:rgba(92,255,115,.2);border:2px solid var(--green);color:var(--green);box-shadow:0 0 18px rgba(92,255,115,.45)}

/* admin */
.admin-grid{display:grid;grid-template-columns:minmax(270px,340px) 1fr;gap:12px}
@media(max-width:820px){.admin-grid{grid-template-columns:1fr}}
.mission-row,.stop-row{border:1px solid #26334e;border-radius:10px;padding:9px;margin:7px 0;background:#080c15;cursor:pointer}
.mission-row.active,.stop-row.active{border-color:var(--pink);box-shadow:0 0 0 1px rgba(255,75,216,.2)}
.stop-row-top{display:flex;justify-content:space-between;gap:8px;align-items:center}
.stop-num{display:inline-grid;place-items:center;width:25px;height:25px;border-radius:5px;background:#151d31;color:var(--cyan);font-weight:900}
.preview{width:100%;max-height:220px;object-fit:contain;border:1px solid #26334e;border-radius:8px;background:#05070b;margin-top:8px}
.linkbox{word-break:break-all;color:var(--green);font-size:12px;border:1px dashed #355245;padding:8px;border-radius:8px}
.coords{font-size:11px;color:#7dffae;word-break:break-all}
.notice{padding:9px;border-radius:9px;border:1px solid #35425c;background:#080c15;font-size:12px}


/* ================================================================
   v12 // Field audio, success transmission and finale
   ================================================================ */

.player-box{
  margin-top:14px;
  padding:11px;
  border:1px dashed rgba(56,245,255,.45);
  border-radius:10px;
  background:#070b13
}

.distance-readout{
  display:flex;
  align-items:baseline;
  gap:.18em;
  white-space:nowrap
}
.distance-unit{
  color:var(--green);
  font-size:clamp(28px,9vw,52px)
}

.success-shell,.finale-shell{
  position:relative;
  overflow:hidden
}
.success-art{
  position:relative;
  min-height:220px;
  border:1px solid rgba(255,75,216,.65);
  border-radius:15px;
  overflow:hidden;
  background:#05060a;
  box-shadow:0 0 32px rgba(255,75,216,.18)
}
.success-art img{
  width:100%;
  height:260px;
  object-fit:cover;
  display:block;
  filter:saturate(1.25) contrast(1.08) brightness(.72)
}
.success-overlay{
  position:absolute;
  inset:0;
  background:
    linear-gradient(180deg,transparent 30%,rgba(5,6,10,.88)),
    radial-gradient(circle at 50% 45%,rgba(56,245,255,.08),transparent 38%);
  pointer-events:none
}
.success-ghost{
  position:absolute;
  left:50%;
  top:48%;
  transform:translate(-50%,-50%);
  font-size:82px;
  filter:drop-shadow(0 0 18px rgba(255,75,216,.95));
  animation:successPulse 1.15s ease-in-out infinite alternate
}
.success-scan{
  position:absolute;
  left:0;right:0;bottom:13px;
  text-align:center;
  color:var(--green);
  font-weight:900;
  font-size:clamp(20px,7vw,42px);
  letter-spacing:.08em;
  text-shadow:0 0 15px rgba(92,255,115,.8)
}
.success-card{
  margin-top:8px;
  box-shadow:0 0 32px rgba(158,113,255,.15)
}
.success-copy{
  font-size:18px;
  line-height:1.4;
  color:var(--text);
  margin-top:6px
}
@keyframes successPulse{
  from{transform:translate(-50%,-50%) scale(.92) rotate(-3deg)}
  to{transform:translate(-50%,-50%) scale(1.08) rotate(3deg)}
}

.finale-shell{
  padding-top:10px
}
.finale-card{
  position:relative;
  overflow:hidden;
  border-color:rgba(248,223,103,.85);
  box-shadow:
    0 0 0 1px rgba(248,223,103,.16) inset,
    0 0 42px rgba(248,223,103,.18),
    0 0 80px rgba(255,75,216,.10)
}
.finale-card:before{
  content:"";
  position:absolute;
  inset:-40%;
  background:conic-gradient(
    from 0deg,
    transparent,
    rgba(248,223,103,.08),
    transparent,
    rgba(56,245,255,.08),
    transparent,
    rgba(255,75,216,.08),
    transparent
  );
  animation:finaleSpin 8s linear infinite;
  pointer-events:none
}
.finale-card>*{position:relative}
.finale-burst{
  display:flex;
  justify-content:center;
  align-items:center;
  gap:8px;
  font-size:clamp(26px,8vw,54px);
  min-height:72px;
  color:var(--yellow);
  text-shadow:0 0 16px rgba(248,223,103,.65)
}
.finale-burst span:nth-child(2n){animation:finaleBob .7s ease-in-out infinite alternate}
.finale-burst span:nth-child(2n+1){animation:finaleBob .95s ease-in-out infinite alternate-reverse}
.finale-message{
  margin-top:12px;
  padding:12px;
  border:1px solid rgba(92,255,115,.65);
  border-radius:10px;
  background:rgba(4,18,9,.62);
  color:var(--green);
  font-weight:900;
  font-size:clamp(18px,5vw,28px);
  line-height:1.3;
  letter-spacing:.04em
}
.reward-message{
  margin-top:10px;
  padding:12px 8px;
  border-radius:10px;
  color:var(--yellow);
  font-weight:900;
  font-size:clamp(17px,5vw,25px);
  background:rgba(248,223,103,.06);
  border:1px dashed rgba(248,223,103,.55)
}
@keyframes finaleSpin{to{transform:rotate(360deg)}}
@keyframes finaleBob{to{transform:translateY(-8px) scale(1.08)}}

@media(prefers-reduced-motion:reduce){
  .success-ghost,.finale-card:before,.finale-burst span{animation:none}
}


/* ================================================================
   v13 // EleLab voice personalities
   ================================================================ */
.voice-settings{
  margin-top:10px;
  border:1px solid rgba(158,113,255,.45);
  border-radius:10px;
  background:#070a12;
  overflow:hidden
}
.voice-settings summary{
  cursor:pointer;
  padding:10px 11px;
  color:var(--purple);
  font-weight:900;
  text-transform:uppercase;
  letter-spacing:.04em;
  font-size:12px;
  user-select:none
}
.voice-settings[open] summary{
  border-bottom:1px dashed #34405c
}
.voice-settings > :not(summary){
  margin-left:10px;
  margin-right:10px
}
.voice-settings > :last-child{
  margin-bottom:10px
}
.voice-grid{
  display:grid;
  grid-template-columns:1fr 1fr;
  gap:9px;
  margin-top:10px
}
.voice-rate-row{
  display:grid;
  grid-template-columns:1fr auto;
  gap:10px;
  align-items:end;
  margin-top:10px
}
.voice-rate-value{
  min-width:58px;
  padding:10px 7px;
  border:1px solid #34405c;
  border-radius:8px;
  color:var(--green);
  font-weight:900;
  text-align:center;
  background:#050810
}
#voiceRate{
  padding:0;
  min-height:34px;
  accent-color:var(--green)
}
@media(max-width:620px){
  .voice-grid{grid-template-columns:1fr}
}

/* ================================================================
   v14.1 // one-screen player, MapLibre heading-up, compact locator
   ================================================================ */
body.playing{overflow:hidden;overscroll-behavior:none}
body.playing .game-wrap{
  width:100%;max-width:none;height:100dvh;min-height:100dvh;
  padding:env(safe-area-inset-top,0) 8px env(safe-area-inset-bottom,0);
  display:flex;flex-direction:column;overflow:hidden
}
body.playing .header-art,
body.playing .header-toggle,
body.playing .footer{display:none!important}
body.playing .topbar{
  flex:0 0 auto;min-height:29px;padding:6px 2px 5px;font-size:10px
}
.game-screen{
  flex:1 1 auto;min-height:0;height:calc(100dvh - 32px);
  display:grid;grid-template-rows:auto auto minmax(150px,1fr) auto;
  gap:6px;overflow:hidden
}
.mission-strip{
  position:relative;display:grid;grid-template-columns:auto minmax(0,1fr) 40px;
  align-items:center;gap:9px;min-height:48px;padding:6px 8px;
  border:1px solid rgba(158,113,255,.58);border-radius:11px;
  background:linear-gradient(180deg,rgba(13,18,32,.98),rgba(7,10,18,.98))
}
.mission-strip .eyebrow{display:block;font-size:8px;margin-bottom:2px}
.mission-strip strong{display:block;line-height:1;color:var(--cyan)}
.mission-strip-count strong{font-size:16px;white-space:nowrap}
.mission-strip-target{min-width:0}
.mission-strip-target strong{
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap;
  color:var(--pink);font-size:clamp(17px,5.2vw,26px)
}
.icon-btn{
  min-height:38px;width:38px;padding:0;display:grid;place-items:center;
  background:#0b1020;color:var(--cyan);border:1px solid rgba(56,245,255,.45);
  border-radius:9px;font-size:20px
}
.compact-dots{position:absolute;left:8px;right:54px;bottom:3px;gap:3px;pointer-events:none;opacity:.72}
.compact-dots span{width:4px;height:3px;border:0;border-radius:2px;font-size:0;background:#30394d}
.compact-dots span.done{background:var(--green)}.compact-dots span.now{background:var(--pink)}

.locator-card{
  display:grid;grid-template-columns:72px minmax(105px,1fr) minmax(112px,.9fr);
  grid-template-rows:auto auto;column-gap:8px;row-gap:3px;align-items:center;
  min-height:111px;padding:7px 9px 6px;
  border:1px solid rgba(158,113,255,.62);border-radius:12px;background:#070a12
}
.locator-arrow-wrap{display:grid;place-items:center;height:73px}
.direction-arrow.locator-arrow{
  width:68px;height:68px;font-size:64px;line-height:1;
  transform-origin:50% 50%;transition:transform .15s linear;
  filter:drop-shadow(0 0 8px rgba(255,75,216,.45))
}
.locator-center{min-width:0}
.locator-distance{gap:.12em}
.locator-distance .value{font-size:clamp(35px,10vw,58px)}
.locator-distance .distance-unit{font-size:clamp(26px,7.2vw,42px)}
.locator-status{
  margin-top:1px;color:var(--green);font-weight:900;font-size:clamp(12px,3.4vw,17px);
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis
}
.locator-card .signalbar{margin-top:5px;gap:4px}.locator-card .signalbar i{height:5px}
.locator-meta{min-width:0;text-align:right;align-self:stretch;display:flex;flex-direction:column;align-items:flex-end;justify-content:center}
.locator-meta .gps-quality{margin-top:0;padding:4px 6px;font-size:8px;max-width:100%;white-space:nowrap}
.locator-meta .bearing{font-size:14px;margin-top:6px}
.locator-meta .small{font-size:9px;max-width:100%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.locator-line{
  grid-column:1/-1;color:var(--green);font-size:9px;text-transform:uppercase;
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis;padding-top:1px
}

.map-shell{position:relative;min-height:0;overflow:hidden;border-radius:11px}
.map.player-map{height:100%!important;min-height:150px;border-radius:11px}
.maplibregl-map{font-family:"Exo 2","Segoe UI",Arial,sans-serif}
.maplibregl-canvas{outline:none}
.maplibregl-ctrl-attrib{
  font-size:8px!important;background:rgba(5,6,10,.70)!important;color:#a9b5c8!important
}
.maplibregl-ctrl-attrib a{color:#9dc9e0!important}
.map-float{position:absolute;top:8px;z-index:5}.map-float-left{left:8px}.map-float-right{right:8px}
.map-mini-btn{
  width:42px;height:42px;min-height:42px;padding:0;border-radius:50%;
  display:grid;place-items:center;font-size:22px;background:rgba(6,10,19,.90);
  color:var(--cyan);border:1px solid rgba(56,245,255,.62);box-shadow:0 2px 12px rgba(0,0,0,.35)
}
.map-mini-btn.attention{color:var(--pink);border-color:var(--pink);box-shadow:0 0 14px rgba(255,75,216,.52)}
.map-status-chip{
  position:absolute;left:50%;bottom:7px;z-index:5;transform:translateX(-50%);
  max-width:calc(100% - 92px);padding:4px 8px;border-radius:999px;
  background:rgba(5,6,10,.82);border:1px solid rgba(56,245,255,.26);
  color:#b6c6d9;font-size:8px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;
  pointer-events:none
}
.game-actions{display:grid;grid-template-columns:.9fr 1.25fr;gap:7px;padding-bottom:2px}
.game-actions button{min-height:48px;font-size:14px}

/* fullscreen-ish overlays, without navigating away from the hunt */
.game-modal{
  position:fixed;inset:0;z-index:12000;display:flex;align-items:center;justify-content:center;
  padding:max(14px,env(safe-area-inset-top)) 12px max(14px,env(safe-area-inset-bottom));
  background:rgba(2,4,8,.88);backdrop-filter:blur(5px)
}
.game-modal-card{
  width:min(620px,100%);max-height:calc(100dvh - 28px);overflow:auto;
  padding:14px;border:1px solid rgba(158,113,255,.72);border-radius:14px;
  background:linear-gradient(180deg,#0d1220,#060910);box-shadow:0 18px 70px rgba(0,0,0,.55)
}
.modal-head{display:flex;align-items:flex-start;justify-content:space-between;gap:12px;margin-bottom:12px}
.modal-head h2{margin:3px 0 0;font-size:25px}.modal-head .icon-btn{flex:0 0 38px}
.clue-message{font-size:clamp(18px,5vw,25px);line-height:1.45}
.emergency-zone{margin-top:13px;padding-top:12px;border-top:1px dashed #33405a}
.emergency-confirm{margin-top:8px;padding:11px;border:1px solid rgba(255,204,70,.42);border-radius:9px;background:#12100a}
.emergency-confirm-text{color:var(--yellow);font-size:13px;line-height:1.4;text-align:center}
.emergency-confirm-actions{display:grid;grid-template-columns:.7fr 1.3fr;gap:8px;margin-top:9px}
.emergency-confirm-actions button{min-height:42px;padding:9px 10px}
.settings-card{width:min(430px,100%)}
.diagnostics-box{margin-top:12px;border:1px solid #26334e;border-radius:9px;background:#050810}
.diagnostics-box summary{padding:9px 10px;cursor:pointer;color:var(--muted);font-size:11px;text-transform:uppercase}
.diagnostics-box pre{margin:0;padding:10px;border-top:1px dashed #26334e;color:#8cefac;font:11px/1.5 "Exo 2","Segoe UI",Arial,sans-serif;white-space:pre-wrap}

/* MapLibre markers reuse the existing visual language. */
.maplibregl-marker.user-icon{width:24px;height:24px}
.maplibregl-marker.target-icon{width:44px;height:44px}

@media(max-width:420px){
  .locator-card{grid-template-columns:62px minmax(96px,1fr) minmax(94px,.8fr);padding-left:6px;padding-right:6px;column-gap:5px}
  .direction-arrow.locator-arrow{width:58px;height:58px;font-size:55px}
  .locator-arrow-wrap{height:65px}
  .locator-meta .bearing{font-size:12px}.locator-meta .small{font-size:8px}
}
@media(max-height:620px){
  body.playing .topbar{min-height:24px;padding:4px 2px;font-size:9px}
  .game-screen{height:calc(100dvh - 27px);gap:4px;grid-template-rows:auto auto minmax(120px,1fr) auto}
  .mission-strip{min-height:42px;padding-top:4px;padding-bottom:4px}
  .locator-card{min-height:92px;padding-top:4px;padding-bottom:4px}
  .locator-arrow-wrap{height:56px}.direction-arrow.locator-arrow{width:52px;height:52px;font-size:50px}
  .locator-distance .value{font-size:34px}.locator-distance .distance-unit{font-size:26px}
  .game-actions button{min-height:42px}
}


/* ================================================================
   v14.2 // auto-framing, calmer heading, compact GPS, reward screens
   ================================================================ */
body.immersive{overflow:hidden;overscroll-behavior:none}
body.immersive .game-wrap{
  width:100%;max-width:none;height:100dvh;min-height:100dvh;
  padding:env(safe-area-inset-top,0) 8px env(safe-area-inset-bottom,0);
  display:flex;flex-direction:column;overflow:hidden
}
body.immersive .header-art,
body.immersive .header-toggle,
body.immersive .footer{display:none!important}
body.immersive .topbar{
  flex:0 0 auto;min-height:29px;padding:6px 2px 5px;font-size:10px
}
.locator-meta .gps-quality{
  white-space:normal;line-height:1.25;text-align:right;max-width:118px
}
.map-status-chip.hidden{display:none!important}

/* The target itself becomes a subtle proximity signal. */
.maplibregl-marker.target-icon{
  animation:targetMarkerPulse 1.8s ease-in-out infinite alternate;
  will-change:transform,filter
}
.maplibregl-marker.target-icon.near{animation-duration:.95s;filter:drop-shadow(0 0 8px rgba(255,75,216,.72))}
.maplibregl-marker.target-icon.target-zone{animation-duration:.48s;filter:drop-shadow(0 0 12px rgba(92,255,115,.9))}
@keyframes targetMarkerPulse{
  from{scale:.94}
  to{scale:1.06}
}

/* Success + finale are also one-screen views; the global fold-out artwork is
   hidden by body.immersive, so the success artwork appears only once. */
body.reward-screen #cacheSuccess,
body.reward-screen #finish{
  flex:1 1 auto;min-height:0;overflow:hidden;display:flex;align-items:stretch;justify-content:center
}
body.reward-screen .success-shell{
  width:min(760px,100%);height:100%;min-height:0;
  display:grid;grid-template-rows:minmax(145px,48%) minmax(0,1fr);gap:6px;overflow:hidden
}
body.reward-screen .success-art{min-height:0;height:100%;border-radius:12px}
body.reward-screen .success-art img{height:100%;min-height:0;object-fit:cover}
body.reward-screen .success-card{
  min-height:0;margin:0;padding:10px 12px;overflow:hidden;
  display:flex;flex-direction:column;justify-content:center
}
body.reward-screen .success-card h1{font-size:clamp(24px,7vw,42px);margin:5px 0 6px}
body.reward-screen .success-copy{font-size:clamp(13px,3.8vw,18px);line-height:1.3;margin-top:2px}
body.reward-screen .success-card .bigcode{margin-top:7px!important}
body.reward-screen #nextSignalBtn{margin-top:8px!important;min-height:44px}

body.reward-screen .finale-shell{
  width:min(760px,100%);height:100%;min-height:0;padding:4px 0;
  display:flex;flex-direction:column;justify-content:center;overflow:hidden
}
body.reward-screen .finale-burst{min-height:46px;font-size:clamp(22px,7vw,44px);gap:6px}
body.reward-screen .finale-card{margin:0;padding:11px 12px;max-height:calc(100% - 50px);overflow:hidden}
body.reward-screen .finale-card h1{font-size:clamp(24px,7vw,43px);margin:5px 0 6px}
body.reward-screen .finale-message{margin-top:7px;padding:8px;font-size:clamp(15px,4.5vw,23px)}
body.reward-screen .reward-message{margin-top:7px;padding:8px 6px;font-size:clamp(14px,4.1vw,21px)}
body.reward-screen .finale-card p{margin-top:7px!important;font-size:11px;line-height:1.3}
body.reward-screen #finishReset{margin-top:8px!important;min-height:43px}

@media(max-height:650px){
  body.reward-screen .success-shell{grid-template-rows:minmax(115px,43%) minmax(0,1fr)}
  body.reward-screen .success-ghost{font-size:60px}
  body.reward-screen .success-scan{font-size:clamp(17px,5.5vw,30px);bottom:8px}
  body.reward-screen .success-card{padding:7px 10px}
  body.reward-screen .success-card .eyebrow{font-size:8px}
  body.reward-screen .success-card h1{font-size:clamp(21px,6vw,34px)}
  body.reward-screen .success-copy{font-size:12px}
  body.reward-screen .finale-burst{min-height:34px;font-size:27px}
  body.reward-screen .finale-card{max-height:calc(100% - 36px);padding:8px 9px}
  body.reward-screen .finale-card .eyebrow{font-size:8px}
  body.reward-screen .finale-card h1{font-size:clamp(20px,6vw,32px)}
  body.reward-screen .finale-message{font-size:14px;padding:6px}
  body.reward-screen .reward-message{font-size:13px;padding:6px 4px}
  body.reward-screen .finale-card p{font-size:9px}
}
@media(prefers-reduced-motion:reduce){
  .maplibregl-marker.target-icon{animation:none}
}

/* ------------------------------------------------------------------
   v14.3 // quieter LTC palette + mini field-unit logo + night map
   Player only: Mission Control keeps its existing functional colours.
   ------------------------------------------------------------------ */
.player-app{
  --cyan:#49e7f2;
  --green:#49e7f2; /* success/primary now shares the main cyan accent */
  --purple:#70c8da;
  --pink:#ff55b7;
  --yellow:#d9c878;
  --red:#ff6f83;
  --text:#e8f4f7;
  --muted:#788996;
  --border:#23333d;
  background:
    radial-gradient(circle at 12% -12%,rgba(73,231,242,.09),transparent 32rem),
    radial-gradient(circle at 100% 0,rgba(255,85,183,.055),transparent 28rem),
    linear-gradient(#040608,#070b0e 70%,#030405)
}
.player-app .player-topbar{
  min-height:38px;align-items:center;padding:3px 2px 4px;
  color:var(--cyan);border-bottom:1px solid rgba(73,231,242,.12)
}
.player-app .brand-mini{display:flex;align-items:center;gap:7px;min-width:0}
.player-app .brand-mini img{
  display:block;width:31px;height:31px;object-fit:contain;flex:0 0 auto;
  filter:drop-shadow(0 0 5px rgba(73,231,242,.22))
}
.player-app .brand-mini span{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.player-app .gps-mini{white-space:nowrap;color:#8ca2ad}
.player-app #gpsDot{color:var(--cyan)}

/* Two-accent rule: cyan does the work; magenta only marks target/special state. */
.player-app .panel{border-color:rgba(73,231,242,.34);background:linear-gradient(180deg,rgba(10,15,18,.97),rgba(5,9,12,.98))}
.player-app .panel.purple{border-color:rgba(73,231,242,.38)}
.player-app .panel.pink{border-color:rgba(255,85,183,.48)}
.player-app .eyebrow{color:#79bdc9}
.player-app .label{color:var(--cyan)}
.player-app .primary{background:var(--cyan);color:#031012;border-color:rgba(73,231,242,.9)}
.player-app .secondary{background:#091116;color:var(--cyan);border-color:rgba(73,231,242,.34)}
.player-app .bigcode,.player-app .value,.player-app .locator-status,.player-app .locator-line{color:var(--cyan)}
.player-app .direction-arrow{color:var(--cyan)}
.player-app .message{border-left-color:var(--cyan)}
.player-app .cache-dots span.done,.player-app .compact-dots span.done{background:var(--cyan);border-color:var(--cyan);color:#031012}
.player-app .cache-dots span.now,.player-app .compact-dots span.now{border-color:var(--pink);color:var(--pink);background:rgba(255,85,183,.10)}
.player-app .signalbar i.on:nth-child(1),
.player-app .signalbar i.on:nth-child(2),
.player-app .signalbar i.on:nth-child(3){background:var(--cyan)}
.player-app .signalbar i.on:nth-child(4){background:var(--pink)}
.player-app .gps-quality.good{color:var(--cyan)}
.player-app .gps-quality.ok{color:var(--yellow)}
.player-app .gps-quality.bad{color:var(--red)}
.player-app .mission-strip-target strong{color:var(--pink)}
.player-app .success-scan,.player-app .finale-message{color:var(--cyan)}
.player-app .reward-message{color:#e8dca0}

/* Night-map frame and controls: keep provider attribution visible but themed. */
.player-app .map{background:#070b0e;border-color:rgba(73,231,242,.30)}
.player-app .map-shell{box-shadow:0 0 0 1px rgba(73,231,242,.05),0 10px 32px rgba(0,0,0,.28)}
.player-app .map-mini-btn{background:rgba(5,10,13,.86);color:var(--cyan);border-color:rgba(73,231,242,.38);backdrop-filter:blur(5px)}
.player-app .map-mini-btn.attention{color:var(--pink);border-color:var(--pink);box-shadow:0 0 13px rgba(255,85,183,.34)}
.player-app .maplibregl-ctrl-attrib,
.player-app .maplibregl-ctrl-attrib.maplibregl-compact-show{
  background:rgba(4,7,9,.78)!important;color:#8b9aa2!important
}
.player-app .maplibregl-ctrl-attrib a{color:#a4cbd2!important}
.player-app .maplibregl-ctrl-logo{opacity:.58;filter:grayscale(1)}
.player-app .target-icon{
  background:rgba(255,85,183,.17);border-color:var(--pink);
  box-shadow:0 0 0 6px rgba(255,85,183,.08),0 0 19px rgba(255,85,183,.48)
}
.player-app .user-icon{background:#2caeca;border-color:#dffbff;box-shadow:0 0 0 6px rgba(73,231,242,.13)}

@media(max-width:430px){
  .player-app .player-topbar{font-size:9px}
  .player-app .brand-mini{gap:5px}
  .player-app .brand-mini img{width:27px;height:27px}
  .player-app .gps-mini{font-size:8px}
}


/* ================================================================
   v14.3.2 // floating ghost overlay, zero layout impact
   ================================================================ */
.player-app .player-topbar{
  position:relative;
  overflow:visible;
  z-index:20;
}
.player-app .floating-ghost{
  display:none;
  position:absolute;
  left:-5px;
  top:2px;
  width:64px;
  height:64px;
  pointer-events:none;
  z-index:50;
  opacity:.98;
  animation:ltcGhostHover 3.2s ease-in-out infinite;
}
.player-app .floating-ghost img{
  display:block;
  width:100%;
  height:100%;
  object-fit:contain;
  filter:drop-shadow(0 0 9px rgba(73,231,242,.26)) drop-shadow(0 8px 10px rgba(0,0,0,.34));
  transform:rotate(-4deg);
}

/* Keep the original topbar geometry exactly as in v14.3. The small
   logo still occupies its old space, but is visually replaced by the
   absolutely-positioned floating ghost during play/reward screens. */
.player-app.playing .brand-mini > img,
.player-app.reward-screen .brand-mini > img{
  visibility:hidden;
}
.player-app.playing .floating-ghost,
.player-app.reward-screen .floating-ghost{
  display:block;
}

@media(max-width:430px){
  .player-app .floating-ghost{
    left:-4px;
    top:1px;
    width:58px;
    height:58px;
  }
}


/* ================================================================
   v14.3.3 // ghost hover + MapLibre admin renderer
   ================================================================ */
@keyframes ltcGhostHover{
  0%,100%{transform:translateY(0)}
  50%{transform:translateY(-5px)}
}
@media(prefers-reduced-motion:reduce){
  .player-app .floating-ghost{animation:none}
}

.admin-app .map{
  background:#070b0e;
  border-color:rgba(56,245,255,.34)
}
.admin-app .maplibregl-ctrl-group{
  background:rgba(5,10,13,.90)!important;
  box-shadow:0 0 0 1px rgba(56,245,255,.30),0 5px 16px rgba(0,0,0,.30)!important
}
.admin-app .maplibregl-ctrl-group button{background-color:transparent!important}
.admin-app .maplibregl-ctrl-group button+button{border-top-color:rgba(56,245,255,.18)!important}
.admin-app .maplibregl-ctrl-icon{filter:invert(1) sepia(.2) saturate(1.4) hue-rotate(130deg)}
.admin-app .maplibregl-ctrl-attrib,
.admin-app .maplibregl-ctrl-attrib.maplibregl-compact-show{
  background:rgba(4,7,9,.78)!important;color:#8b9aa2!important
}
.admin-app .maplibregl-ctrl-attrib a{color:#a4cbd2!important}
.admin-app .maplibregl-ctrl-logo{opacity:.58;filter:grayscale(1)}
.admin-app .admin-stop-icon,
.admin-app .draft-icon{cursor:pointer;user-select:none}
.admin-app .draft-icon{cursor:grab}
.admin-app .maplibregl-marker:active .draft-icon{cursor:grabbing}


/* ================================================================
   v14.4 // MapLibre creator map + placement / hide workflow
   ================================================================ */
.admin-app .editor-map-head{
  display:flex;align-items:center;justify-content:space-between;gap:10px;margin-bottom:7px
}
.admin-app .hide-mode-toggle{min-height:36px;padding:7px 10px;font-size:12px;flex:0 0 auto}
.admin-app .hide-mode-toggle.active{
  color:#061008;background:var(--green);border-color:var(--green);box-shadow:0 0 14px rgba(92,255,115,.24)
}
.admin-map-shell{position:relative}
.admin-map-tools{display:flex;gap:6px;align-items:flex-start}
.admin-map-tools .map-mini-btn{position:relative;inset:auto}
.admin-app .map-mini-btn.active{
  color:var(--pink);border-color:var(--pink);box-shadow:0 0 13px rgba(255,75,216,.28)
}
.admin-app .map-layer-btn{font-size:16px}
.admin-app .maplibregl-ctrl-compass{display:block!important}
.admin-app .maplibregl-ctrl-compass .maplibregl-ctrl-icon{filter:invert(1) sepia(.2) saturate(1.4) hue-rotate(130deg)}

.hide-mode-banner{
  display:grid;grid-template-columns:auto auto minmax(0,1fr);align-items:center;gap:8px;
  margin:0 0 8px;padding:8px 10px;border:1px solid rgba(92,255,115,.48);border-radius:9px;
  background:rgba(10,35,22,.65);font-size:11px;color:#b9ffc5
}
.hide-mode-banner strong{color:var(--green);letter-spacing:.08em}.hide-mode-banner span:last-child{color:#82a88a;text-align:right}
.placement-meta{
  margin-top:7px;padding:7px 9px;border-radius:8px;border:1px dashed rgba(92,255,115,.34);
  background:#07110c;color:#8ff3a0;font-size:11px
}
.placement-doc{
  margin-top:14px;padding:11px;border:1px solid rgba(158,113,255,.40);border-radius:10px;
  background:linear-gradient(180deg,rgba(14,12,25,.88),rgba(7,9,14,.94))
}
.placement-doc-title{display:flex;justify-content:space-between;align-items:flex-start;gap:10px;margin-bottom:9px}
.private-badge{
  display:inline-flex;padding:4px 7px;border-radius:999px;border:1px solid rgba(255,75,216,.44);
  color:var(--pink);font-size:9px;font-weight:900;letter-spacing:.08em
}
.camera-btn{width:100%;margin-top:8px}.hide-preview{max-height:300px}

body.modal-open{overflow:hidden}
.placement-overlay{
  position:fixed;inset:0;z-index:12000;display:grid;place-items:end center;padding:12px;
  background:rgba(1,3,5,.78);backdrop-filter:blur(8px)
}
.placement-sheet{
  width:min(560px,100%);max-height:calc(100dvh - 24px);overflow:auto;
  border:1px solid rgba(56,245,255,.55);border-radius:16px;padding:16px;
  background:linear-gradient(180deg,#0b1117,#05080c);box-shadow:0 -18px 60px rgba(0,0,0,.58)
}
.placement-sheet h2{font-size:clamp(23px,7vw,36px);text-transform:uppercase;margin:5px 0 8px}
.placement-lock{
  display:inline-flex;padding:6px 9px;border-radius:999px;border:1px solid rgba(92,255,115,.45);
  color:var(--green);background:#07110b;font-size:11px;font-weight:900
}
.placement-photo-btn{width:100%;min-height:58px;margin-top:7px;font-size:16px}
.placement-photo-preview{max-height:36dvh}
.placement-overlay-actions{display:grid;gap:7px;margin-top:12px}
.placement-text-btn{
  min-height:34px;background:transparent;border:0;color:var(--muted);text-decoration:underline;text-transform:none;font-weight:700
}

@media(max-width:650px){
  .hide-mode-banner{grid-template-columns:auto 1fr}.hide-mode-banner span:last-child{grid-column:1/-1;text-align:left}
  .admin-app .admin-map{height:52dvh;min-height:330px;max-height:560px}
}


/* ================================================================
   v14.4.1 // restore ghost position + stronger locator arrow
   ================================================================ */
/* v14.4 accidentally moved the floating ghost another 14px upward.
   Restore the v14.3.3 placement; layout geometry remains untouched. */
.player-app .floating-ghost{top:2px}
@media(max-width:430px){.player-app .floating-ghost{top:1px}}

/* A CSS-drawn arrow stays crisp and visibly thicker than the text glyph.
   The parent is still the element that rotates, so all heading logic is unchanged. */
.direction-arrow.locator-arrow{
  width:72px;height:72px;font-size:0;line-height:1;
  display:grid;place-items:center;
  overflow:visible;
  filter:drop-shadow(0 0 9px rgba(73,231,242,.34))
}
.direction-arrow.locator-arrow::before{
  content:"";display:block;width:52px;height:64px;background:currentColor;
  clip-path:polygon(50% 0,100% 38%,68% 38%,68% 100%,32% 100%,32% 38%,0 38%)
}
@media(max-width:420px){
  .direction-arrow.locator-arrow{width:64px;height:64px}
  .direction-arrow.locator-arrow::before{width:46px;height:57px}
}
@media(max-height:620px){
  .direction-arrow.locator-arrow{width:58px;height:58px}
  .direction-arrow.locator-arrow::before{width:42px;height:51px}
}

/* ================================================================
   v14.5 // Outdoor high-contrast map + Mobile Capture Wizard
   ================================================================ */
.admin-app .capture-launch-btn{
  width:100%;margin-top:12px;min-height:50px;font-size:14px
}
.admin-app .map-layer-btn,
.capture-wizard .capture-layer-btn{
  min-width:48px;width:auto;padding:0 8px;font-size:10px;letter-spacing:.04em
}

body.capture-open{overflow:hidden}
.capture-wizard{
  position:fixed;inset:0;z-index:14000;width:100vw;height:100dvh;
  background:
    radial-gradient(circle at 10% -8%,rgba(56,245,255,.10),transparent 28rem),
    linear-gradient(#04070a,#070c10 70%,#030506);
  padding:max(8px,env(safe-area-inset-top)) max(8px,env(safe-area-inset-right)) max(8px,env(safe-area-inset-bottom)) max(8px,env(safe-area-inset-left));
  overflow:hidden
}
.capture-shell{
  width:min(680px,100%);height:100%;margin:auto;min-height:0;
  display:grid;grid-template-rows:auto auto minmax(0,1fr);gap:7px
}
.capture-head{
  min-height:48px;display:flex;align-items:center;justify-content:space-between;gap:10px;
  padding:5px 8px;border:1px solid rgba(56,245,255,.28);border-radius:11px;background:rgba(5,11,15,.92)
}
.capture-head strong{display:block;color:var(--cyan);font-size:16px;line-height:1}
.capture-close-btn{
  min-height:34px;padding:6px 9px;background:#091116;color:#9eb0b8;border:1px solid #2b3940;
  font-size:9px;white-space:nowrap
}
.capture-progress{
  height:25px;display:grid;grid-template-columns:repeat(4,1fr) auto;align-items:center;gap:4px;padding:0 3px
}
.capture-progress i{height:4px;border-radius:999px;background:#223039;transition:.16s ease}
.capture-progress i.active{background:var(--cyan);box-shadow:0 0 8px rgba(56,245,255,.38)}
.capture-progress i.done{background:#72d7df}
.capture-progress span{min-width:86px;text-align:right;font-size:9px;color:#7f949d;text-transform:uppercase;letter-spacing:.05em}
.capture-step{
  min-height:0;overflow:hidden;border:1px solid rgba(56,245,255,.30);border-radius:14px;
  background:linear-gradient(180deg,rgba(9,15,19,.98),rgba(4,8,11,.98));padding:10px;
  display:grid;grid-template-rows:auto minmax(0,1fr) auto;gap:9px
}
.capture-center-card{
  min-height:0;display:flex;flex-direction:column;align-items:center;justify-content:center;text-align:center;
  padding:12px 12px 18px
}
.capture-center-card h2{font-size:clamp(24px,8vw,42px);text-transform:uppercase;margin:6px 0 9px}
.capture-center-card p{max-width:470px;margin:0 0 16px}
.capture-icon{font-size:52px;line-height:1;margin-bottom:9px;filter:drop-shadow(0 0 12px rgba(56,245,255,.25))}
.capture-main-btn{width:100%;min-height:56px;font-size:15px;align-self:end}
.capture-center-card .capture-main-btn{max-width:460px;margin-top:8px}
.capture-step-head{display:flex;align-items:flex-start;justify-content:space-between;gap:10px}
.capture-step-head h2{font-size:clamp(22px,7vw,34px);text-transform:uppercase;margin:3px 0 0;line-height:1}
.capture-badge{
  flex:0 0 auto;display:inline-flex;align-items:center;min-height:28px;padding:5px 8px;border-radius:999px;
  border:1px solid #394952;color:#91a4ad;background:#071014;font-size:9px;font-weight:900;letter-spacing:.05em
}
.capture-badge.good{border-color:rgba(92,255,115,.42);color:#a4ffb2;background:#07140b}
.capture-map-shell{position:relative;min-height:0;height:100%;border-radius:11px;overflow:hidden}
.capture-map{position:absolute;inset:0;background:#071015;border:1px solid rgba(56,245,255,.32);border-radius:11px}
.capture-map-controls{position:absolute;z-index:10;top:8px;display:flex;gap:6px}.capture-map-controls.left{left:8px}
.capture-wizard .map-mini-btn{position:relative;inset:auto;background:rgba(5,10,13,.88);color:var(--cyan);border-color:rgba(56,245,255,.38);backdrop-filter:blur(4px)}
.capture-wizard .map-mini-btn.active{color:var(--pink);border-color:var(--pink);box-shadow:0 0 12px rgba(255,75,216,.28)}
.capture-recenter{position:absolute!important;right:8px!important;bottom:8px!important;z-index:10}
.capture-status{
  min-height:34px;display:flex;align-items:center;padding:7px 9px;border-radius:8px;
  border:1px dashed rgba(56,245,255,.26);background:#071015;color:#9bc8cf;font-size:10px;font-weight:900
}
.capture-fields{min-height:0;display:flex;flex-direction:column;justify-content:center;gap:6px;padding:0 2px}
.capture-fields textarea{resize:none;min-height:84px}
.capture-photo-stage{
  min-height:0;display:grid;place-items:center;align-content:center;gap:9px;border:1px dashed rgba(255,75,216,.30);
  border-radius:11px;background:#070b10;padding:9px;overflow:hidden
}
.capture-photo-preview{display:block;max-width:100%;max-height:30dvh;object-fit:contain;border-radius:9px;border:1px solid #2b3a43}
.capture-camera-btn{width:100%;min-height:58px;font-size:15px}
.capture-save-grid{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:7px}
.capture-save-grid button{min-height:50px}
.capture-wizard textarea{resize:none}
.capture-position-icon{
  width:28px;height:28px;border-radius:50%;background:var(--cyan);border:4px solid #efffff;
  box-shadow:0 0 0 9px rgba(56,245,255,.15),0 0 20px rgba(56,245,255,.45)
}

@media(max-width:650px){
  .capture-wizard{padding:env(safe-area-inset-top) 5px max(5px,env(safe-area-inset-bottom)) 5px}
  .capture-shell{gap:5px}
  .capture-head{border-radius:9px;min-height:44px}
  .capture-step{border-radius:11px;padding:8px;gap:7px}
  .capture-progress{height:21px}
}
@media(max-height:650px){
  .capture-head{min-height:40px}.capture-progress{height:18px}
  .capture-step{padding:7px}.capture-icon{font-size:38px;margin-bottom:5px}
  .capture-center-card{padding:5px 10px 8px}.capture-center-card p{margin-bottom:8px}
  .capture-main-btn{min-height:48px}.capture-photo-preview{max-height:23dvh}
  .capture-fields textarea{min-height:62px}
}


/* ================================================================
   v14.5.3 // roomier top instruments + square map + unified frames
   ================================================================ */
.player-app{
  --player-frame:rgba(73,231,242,.34);
}

/* Keep the same one-screen structure, but make the two information
   instruments more readable and let the action buttons sit at the
   physical bottom edge of the available game area. */
.player-app .game-screen{
  display:flex;
  flex-direction:column;
  gap:7px;
  overflow:hidden;
}

.player-app .mission-strip{
  flex:0 0 auto;
  min-height:62px;
  padding:9px 10px 10px;
  grid-template-columns:auto minmax(0,1fr) 44px;
  gap:11px;
  border-color:var(--player-frame);
}
.player-app .mission-strip .eyebrow{font-size:9px}
.player-app .mission-strip-count strong{font-size:18px}
.player-app .mission-strip-target strong{font-size:clamp(20px,5.8vw,29px)}
.player-app .mission-strip .icon-btn{
  width:42px;
  min-height:42px;
  font-size:21px;
  border-color:var(--player-frame);
}

/* Slightly larger locator field: more room for the direction instrument
   and distance without changing the overall visual hierarchy. */
.player-app .locator-card{
  flex:0 0 auto;
  min-height:136px;
  grid-template-columns:88px minmax(112px,1fr) minmax(112px,.86fr);
  column-gap:10px;
  padding:10px 11px 8px;
  border-color:var(--player-frame);
}
.player-app .locator-arrow-wrap{height:92px}
.player-app .direction-arrow.locator-arrow{
  width:84px;
  height:84px;
}
.player-app .direction-arrow.locator-arrow::before{
  width:60px;
  height:74px;
}
.player-app .locator-distance .value{font-size:clamp(39px,11vw,63px)}
.player-app .locator-distance .distance-unit{font-size:clamp(29px,7.8vw,45px)}
.player-app .locator-meta .bearing{font-size:15px}
.player-app .locator-line{font-size:10px}

/* Full-width square map. On tall phones the freed vertical space stays
   below the map, while the two action buttons remain anchored at bottom. */
.player-app .map-shell{
  flex:0 0 auto;
  width:100%;
  aspect-ratio:1 / 1;
  min-height:0;
  overflow:hidden;
  border-radius:11px;
}
.player-app .map.player-map{
  width:100%;
  height:100%!important;
  min-height:0;
  border-color:var(--player-frame);
}

/* Action row always hugs the bottom of the game screen. */
.player-app .game-actions{
  flex:0 0 auto;
  margin-top:auto;
  padding-bottom:max(2px,env(safe-area-inset-bottom,0px));
}
.player-app .game-actions .secondary,
.player-app .game-actions .primary{
  min-height:50px;
}
.player-app .game-actions .secondary{
  border-color:var(--player-frame);
}

/* One frame colour for the player instruments and controls. */
.player-app .mission-strip,
.player-app .locator-card,
.player-app .map,
.player-app .secondary,
.player-app .icon-btn,
.player-app .map-mini-btn{
  border-color:var(--player-frame);
}

/* Compact fallback for shorter screens so the square map still fits
   without reintroducing scrolling. */
@media(max-height:650px){
  .player-app .game-screen{gap:5px}
  .player-app .mission-strip{
    min-height:52px;
    padding:6px 8px 7px;
    grid-template-columns:auto minmax(0,1fr) 40px;
  }
  .player-app .mission-strip-count strong{font-size:16px}
  .player-app .mission-strip-target strong{font-size:clamp(18px,5.2vw,25px)}
  .player-app .mission-strip .icon-btn{width:38px;min-height:38px;font-size:19px}

  .player-app .locator-card{
    min-height:112px;
    grid-template-columns:70px minmax(102px,1fr) minmax(96px,.8fr);
    column-gap:6px;
    padding:6px 7px 6px;
  }
  .player-app .locator-arrow-wrap{height:72px}
  .player-app .direction-arrow.locator-arrow{width:68px;height:68px}
  .player-app .direction-arrow.locator-arrow::before{width:49px;height:60px}
  .player-app .locator-distance .value{font-size:36px}
  .player-app .locator-distance .distance-unit{font-size:27px}
  .player-app .game-actions .secondary,
  .player-app .game-actions .primary{min-height:44px}
}

@media(max-width:360px){
  .player-app .locator-card{
    grid-template-columns:72px minmax(96px,1fr) minmax(88px,.76fr);
    column-gap:5px;
    padding-left:6px;
    padding-right:6px;
  }
  .player-app .direction-arrow.locator-arrow{width:70px;height:70px}
  .player-app .direction-arrow.locator-arrow::before{width:50px;height:62px}
}


/* ================================================================
   v14.5.4 // slightly larger top instruments + player satellite toggle
   ================================================================ */

/* Use some of the spare vertical room visible on tall phones. */
.player-app .mission-strip{
  min-height:72px;
  padding:11px 11px 12px;
  grid-template-columns:auto minmax(0,1fr) 46px;
  gap:12px;
}
.player-app .mission-strip .eyebrow{font-size:10px}
.player-app .mission-strip-count strong{font-size:20px}
.player-app .mission-strip-target strong{font-size:clamp(23px,6.2vw,32px)}
.player-app .mission-strip .icon-btn{
  width:44px;
  min-height:44px;
  font-size:22px;
}

/* More breathing room for arrow, distance and diagnostics. */
.player-app .locator-card{
  min-height:154px;
  grid-template-columns:98px minmax(120px,1fr) minmax(116px,.86fr);
  column-gap:12px;
  padding:12px 12px 10px;
}
.player-app .locator-arrow-wrap{height:104px}
.player-app .direction-arrow.locator-arrow{
  width:94px;
  height:94px;
}
.player-app .direction-arrow.locator-arrow::before{
  width:67px;
  height:82px;
}
.player-app .locator-distance .value{font-size:clamp(42px,11.6vw,67px)}
.player-app .locator-distance .distance-unit{font-size:clamp(31px,8.2vw,47px)}
.player-app .locator-status{font-size:15px}
.player-app .locator-meta .bearing{font-size:16px}

/* Map controls can now hold orientation + imagery side by side. */
.player-app .map-float-left{
  display:flex;
  gap:6px;
}
.player-app .map-layer-btn{
  font-size:10px;
  font-weight:900;
  letter-spacing:.03em;
}
.player-app .map-mini-btn.active{
  color:var(--pink);
  border-color:var(--pink);
  box-shadow:0 0 13px rgba(255,85,183,.32);
}

/* Preserve the compact one-screen version on short displays. */
@media(max-height:650px){
  .player-app .mission-strip{
    min-height:54px;
    padding:6px 8px 7px;
    grid-template-columns:auto minmax(0,1fr) 40px;
    gap:8px;
  }
  .player-app .mission-strip .eyebrow{font-size:8px}
  .player-app .mission-strip-count strong{font-size:16px}
  .player-app .mission-strip-target strong{font-size:clamp(18px,5.2vw,25px)}
  .player-app .mission-strip .icon-btn{width:38px;min-height:38px;font-size:19px}

  .player-app .locator-card{
    min-height:116px;
    grid-template-columns:72px minmax(102px,1fr) minmax(96px,.8fr);
    column-gap:7px;
    padding:6px 7px 6px;
  }
  .player-app .locator-arrow-wrap{height:74px}
  .player-app .direction-arrow.locator-arrow{width:70px;height:70px}
  .player-app .direction-arrow.locator-arrow::before{width:50px;height:62px}
  .player-app .locator-distance .value{font-size:36px}
  .player-app .locator-distance .distance-unit{font-size:27px}
  .player-app .locator-status{font-size:12px}
}


/* ================================================================
   v14.5.5 // 60fps camera damper tuning
   ================================================================ */
.camera-filter-box{
  margin-top:10px;border:1px solid rgba(73,231,242,.24);border-radius:10px;
  background:#071015;padding:9px
}
.camera-filter-box>summary{
  cursor:pointer;color:var(--cyan);font-weight:900;text-transform:uppercase;
  letter-spacing:.055em;font-size:11px
}
.camera-filter-group{
  margin-top:10px;padding-top:8px;border-top:1px solid rgba(73,231,242,.13)
}
.camera-filter-title{
  color:var(--pink);font-size:10px;font-weight:900;letter-spacing:.1em;margin-bottom:4px
}
.camera-filter-group label{
  display:grid;grid-template-columns:1fr auto;gap:5px 8px;align-items:center;
  color:#a9c4cc;font-size:10px;text-transform:uppercase;letter-spacing:.04em;margin:7px 0
}
.camera-filter-group label span{color:var(--cyan);font-weight:900}
.camera-filter-group input[type=range]{
  grid-column:1 / -1;padding:0;height:20px;accent-color:var(--cyan)
}
.camera-filter-reset{width:100%;min-height:36px;margin-top:9px;font-size:10px}


/* ================================================================
   v14.5.6 // true heading calibration against the current cache
   ================================================================ */
.heading-calibration-box{
  margin-top:8px;padding:11px;border:1px solid rgba(73,231,242,.34);border-radius:10px;
  background:linear-gradient(180deg,rgba(6,22,28,.96),rgba(4,10,16,.96));
}
.heading-calibration-title{
  color:var(--cyan);font-size:12px;font-weight:900;letter-spacing:.11em;text-transform:uppercase
}
.heading-calibration-box p{margin:7px 0 9px;color:#dceaf0;font-size:12px;line-height:1.45}
.heading-calibration-readout{
  min-height:38px;display:flex;align-items:center;padding:8px 9px;border:1px solid #2c4250;border-radius:8px;
  background:#04090d;color:#aebdc8;font:11px/1.35 "Exo 2","Segoe UI",Arial,sans-serif
}
.heading-calibration-readout[data-state="ready"]{color:#8cf5b0;border-color:rgba(95,239,154,.45)}
.heading-calibration-readout[data-state="measuring"]{color:var(--yellow);border-color:rgba(255,204,70,.52)}
.heading-calibration-readout[data-state="success"]{color:var(--cyan);border-color:rgba(73,231,242,.55)}
.heading-calibration-readout[data-state="bad"]{color:#ff9b9b;border-color:rgba(255,92,92,.5)}
.heading-calibration-actions{display:grid;grid-template-columns:.8fr 1.2fr;gap:8px;margin-top:9px}
.heading-calibration-actions button{min-height:44px}
.heading-calibration-reset{width:100%;margin-top:8px;min-height:38px;font-size:11px}
.heading-calibration-note{margin-top:8px;color:var(--muted);font-size:10px;line-height:1.4}

/* ================================================================
   v14.5.7 // mission search modes + signal lifecycle markers
   ================================================================ */
.admin-app .mission-mode-selector{
  display:grid;grid-template-columns:1fr;gap:7px;margin-top:6px;margin-bottom:12px
}
.admin-app .mission-mode-option{
  position:relative;display:flex;align-items:flex-start;gap:9px;padding:10px 11px;
  border:1px solid rgba(73,231,242,.22);border-radius:9px;background:#071015;cursor:pointer
}
.admin-app .mission-mode-option:has(input:checked){
  border-color:rgba(73,231,242,.72);background:rgba(73,231,242,.075);box-shadow:0 0 0 1px rgba(73,231,242,.08) inset
}
.admin-app .mission-mode-option input{width:auto;margin:3px 0 0;accent-color:var(--cyan)}
.admin-app .mission-mode-option span{display:grid;gap:2px}
.admin-app .mission-mode-option strong{color:#dffcff;font-size:12px}
.admin-app .mission-mode-option small{color:var(--muted);font-size:10px;line-height:1.35}
.admin-app .stop-num.free{color:var(--cyan);border-color:rgba(73,231,242,.35);background:rgba(73,231,242,.06)}

/* Free-search signal states. The marker itself stays lightweight; MapLibre
   continues to own its positioning transform while CSS animates scale/filter. */
.player-app .ectoplasm-marker{
  width:29px;height:24px;cursor:pointer;position:relative;border-radius:48% 52% 55% 45% / 55% 45% 58% 42%;
  background:
    radial-gradient(circle at 34% 34%,rgba(224,255,246,.92) 0 8%,transparent 10%),
    radial-gradient(circle at 63% 57%,rgba(82,255,202,.86) 0 18%,rgba(73,231,242,.48) 34%,rgba(73,231,242,.10) 66%,transparent 72%);
  border:1px solid rgba(128,255,222,.58);
  box-shadow:0 0 7px rgba(72,255,200,.45),0 0 18px rgba(73,231,242,.22);
  opacity:.78;scale:.96;animation:ectoplasmBreath 3.2s ease-in-out infinite alternate
}
.player-app .ectoplasm-marker::before,
.player-app .ectoplasm-marker::after{
  content:"";position:absolute;border-radius:50%;background:rgba(80,255,203,.36);filter:blur(.4px)
}
.player-app .ectoplasm-marker::before{width:9px;height:8px;left:-4px;bottom:2px}
.player-app .ectoplasm-marker::after{width:7px;height:10px;right:-3px;top:2px}
@keyframes ectoplasmBreath{
  from{scale:.92;filter:drop-shadow(0 0 2px rgba(72,255,200,.20));opacity:.66}
  to{scale:1.06;filter:drop-shadow(0 0 7px rgba(72,255,200,.55));opacity:.90}
}

.player-app .tape-archive-marker{
  width:34px;height:24px;cursor:pointer;position:relative;border-radius:4px;
  background:linear-gradient(180deg,#141c22,#070b0e);border:1px solid rgba(73,231,242,.58);
  box-shadow:0 0 10px rgba(73,231,242,.19),0 3px 8px rgba(0,0,0,.45);opacity:.82
}
.player-app .tape-archive-marker::before{
  content:"";position:absolute;left:6px;right:6px;top:6px;height:9px;border-radius:5px;
  background:
    radial-gradient(circle at 22% 50%,#071014 0 2px,#8bc5cb 2.2px 3.1px,transparent 3.3px),
    radial-gradient(circle at 78% 50%,#071014 0 2px,#8bc5cb 2.2px 3.1px,transparent 3.3px),
    linear-gradient(180deg,#253740,#16252c);
  border:1px solid rgba(170,224,230,.30)
}
.player-app .tape-archive-marker::after{
  content:"ARCH";position:absolute;left:5px;right:5px;bottom:2px;text-align:center;
  color:#88cbd2;font:5px/1 "Exo 2","Segoe UI",Arial,sans-serif;letter-spacing:.9px
}
.player-app .maplibregl-marker.ectoplasm-marker{width:29px;height:24px}
.player-app .maplibregl-marker.tape-archive-marker{width:34px;height:24px}

.player-app .direction-arrow.inactive{opacity:.22;filter:none}
.player-app .game-actions button:disabled{opacity:.36;filter:saturate(.4);cursor:not-allowed}
.player-app .compact-dots span.open{
  width:9px;height:9px;border-radius:50%;align-self:center;margin:7px 5px;
  border-color:rgba(90,255,211,.42);background:rgba(90,255,211,.10);box-shadow:0 0 5px rgba(90,255,211,.18)
}
.player-app .compact-dots span.now{box-shadow:0 0 7px rgba(255,85,183,.35)}

.player-app .target-info-card{width:min(520px,100%)}
.player-app .target-info-card .modal-head{margin-bottom:9px}
.player-app .target-info-card .modal-head h2{color:var(--pink);font-size:clamp(23px,6vw,31px)}
.player-app .target-info-image{margin:0 0 10px;max-height:245px;border-color:rgba(73,231,242,.28)}
.player-app .target-info-distance{
  display:inline-block;margin:1px 0 10px;padding:5px 8px;border:1px solid rgba(73,231,242,.35);border-radius:6px;
  background:rgba(73,231,242,.055);color:var(--cyan);font:700 11px/1.15 "Exo 2","Segoe UI",Arial,sans-serif;letter-spacing:.055em
}
.player-app .target-info-card .clue-message{margin-top:0}

@media(prefers-reduced-motion:reduce){
  .player-app .ectoplasm-marker{animation:none}
}

/* v14.5.8 // mission mode persistence feedback */
.mission-mode-save-state{margin-top:6px;min-height:16px;color:var(--muted)}
.mission-mode-save-state.saving{color:#ffe287}
.mission-mode-save-state.saved{color:#79f3df}
.mission-mode-save-state.error{color:#ff98aa}


/* v14.5.9 // explicit frontend/backend compatibility warning */
.backend-compat-banner{
  margin:8px 0 12px;
  padding:11px 13px;
  border:2px solid #ff647f;
  border-radius:10px;
  background:rgba(92,9,28,.78);
  box-shadow:0 0 20px rgba(255,68,111,.18);
  color:#ffd8df;
  display:flex;
  gap:9px;
  align-items:flex-start;
  flex-wrap:wrap;
}
.backend-compat-banner strong{
  color:#fff;
  font-family:"Exo 2","Segoe UI",Arial,sans-serif;
  letter-spacing:.08em;
}
.backend-compat-banner span{color:#ffd8df}

/* ================================================================
   v14.6.0 // polish round: player map modes + calm mobile admin
   ================================================================ */

/* Player: the upper-right control is now a real AUTO/FREE toggle. */
.player-app .map-follow-btn{
  width:52px;
  min-width:52px;
  padding-inline:5px;
  font-size:9px;
  letter-spacing:.045em;
}
.player-app .map-follow-btn.active{
  color:var(--cyan);
  border-color:rgba(56,245,255,.72);
  box-shadow:0 0 12px rgba(56,245,255,.18);
}
.player-app .map-follow-btn.attention{
  color:var(--pink);
  border-color:rgba(255,75,216,.75);
  box-shadow:0 0 13px rgba(255,75,216,.25);
}

/* Admin visual system: same restrained field-unit language as the player. */
.admin-app{
  background:
    radial-gradient(circle at 50% -20%,rgba(56,245,255,.08),transparent 34rem),
    linear-gradient(#05070b,#060910 72%,#030407);
}
.admin-app .admin-wrap{width:min(880px,100%);padding-bottom:96px}
.admin-app .admin-topbar{justify-content:flex-start;border-bottom:1px solid rgba(56,245,255,.18);margin-bottom:10px}
.admin-app .eyebrow{color:var(--cyan)}
.admin-app .panel,
.admin-app .admin-panel{
  border-color:rgba(56,245,255,.34);
  background:linear-gradient(180deg,rgba(10,15,24,.97),rgba(6,10,17,.98));
  box-shadow:none;
}
.admin-app .primary{background:var(--cyan);color:#031114;border-color:var(--cyan)}
.admin-app .secondary{background:#09111b;color:#bffaff;border-color:rgba(73,231,242,.36)}
.admin-app .secondary:hover{border-color:rgba(73,231,242,.75)}
.admin-app .danger{background:#170b11;color:#ff98aa;border-color:rgba(255,91,114,.42)}
.admin-app input,.admin-app textarea,.admin-app select{
  border-color:rgba(73,231,242,.25);
  background:#050a11;
}
.admin-app .label{color:#9edee5}
.admin-app .muted{color:#8293a6}
.admin-app .footer{color:#45566d}

.admin-screen{animation:adminScreenIn .14s ease-out}
@keyframes adminScreenIn{from{opacity:.25;transform:translateY(3px)}to{opacity:1;transform:none}}
.admin-screen-head{display:flex;justify-content:space-between;align-items:flex-end;gap:12px;padding:8px 2px 3px}
.admin-screen-head h1,.admin-panel h1{font-size:clamp(27px,7vw,42px);margin:5px 0 8px}
.admin-breadcrumb{display:flex;align-items:center;justify-content:space-between;gap:10px;margin:4px 0 8px}
.admin-back-btn{min-height:38px;padding:8px 11px}
.admin-field-gap{display:block;margin-top:13px}
.admin-wide-action{width:100%;margin-top:10px}
.admin-section-title-row{display:flex;justify-content:space-between;align-items:flex-start;gap:10px}
.admin-section-title-row h2{margin:4px 0 8px}
.admin-status-line{min-height:18px;margin-top:7px}
.admin-check{display:block;margin-top:7px}
.admin-check input{width:auto}

/* Mission overview */
.mission-list-clean,.stop-list-clean{display:grid;gap:8px}
.mission-card-clean{
  display:grid;
  grid-template-columns:minmax(0,1fr) auto;
  align-items:stretch;
  border:1px solid rgba(73,231,242,.26);
  border-radius:11px;
  overflow:hidden;
  background:#070c13;
}
.mission-card-main{
  border:0;border-radius:0;background:transparent;color:var(--text);
  text-align:left;text-transform:none;letter-spacing:0;padding:12px 13px;min-width:0
}
.mission-card-title{display:block;font-size:16px;font-weight:900;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.mission-card-meta{display:block;margin-top:4px;color:var(--muted);font-size:11px;text-transform:uppercase;letter-spacing:.05em}
.mission-card-actions{display:flex;align-items:stretch;border-left:1px solid rgba(73,231,242,.18)}
.admin-icon-action{
  width:44px;min-height:100%;border:0;border-left:1px solid rgba(73,231,242,.12);border-radius:0;
  display:grid;place-items:center;background:#08101a;color:#c9fbff;text-decoration:none;font:900 14px/1 "Exo 2","Segoe UI",Arial,sans-serif;cursor:pointer
}
.admin-icon-action:first-child{border-left:0}
.admin-icon-action.play{color:var(--cyan)}
.admin-icon-action.capture{color:#d2f7e0}
.admin-icon-action.danger-icon{color:#ff8499;background:#10090e}
.admin-empty-state{display:flex;flex-direction:column;gap:5px;text-align:center;padding:28px 12px;color:var(--muted)}
.admin-empty-state strong{color:var(--text)}
.admin-empty-state.compact{padding:18px 10px}

/* Mission page */
.admin-game-link{
  display:block;text-decoration:none;color:var(--cyan);border-color:rgba(73,231,242,.32);background:#050b12;
  transition:border-color .15s ease,background .15s ease
}
.admin-game-link:hover{border-color:var(--cyan);background:#07131b}
.admin-game-link[aria-disabled="true"]{color:var(--muted);pointer-events:none}
.admin-mission-meta-actions{margin-top:12px}
.admin-sticky-actions{
  position:sticky;bottom:max(8px,env(safe-area-inset-bottom,0px));z-index:30;
  display:grid;grid-template-columns:1.45fr 1fr;gap:8px;
  padding:8px;background:rgba(4,8,13,.94);backdrop-filter:blur(8px);
  border:1px solid rgba(73,231,242,.32);border-radius:12px;box-shadow:0 -8px 30px rgba(0,0,0,.3)
}
.admin-sticky-actions .button{display:grid;place-items:center;text-decoration:none}
.disabled-link{opacity:.45;pointer-events:none}

/* Cache list */
.stop-card-clean{
  display:grid;grid-template-columns:minmax(0,1fr) auto;align-items:stretch;
  border:1px solid rgba(73,231,242,.22);border-radius:10px;overflow:hidden;background:#070c13
}
.stop-card-main{
  display:flex;align-items:center;gap:10px;min-width:0;text-align:left;text-transform:none;letter-spacing:0;
  border:0;border-radius:0;background:transparent;color:var(--text);padding:10px 11px
}
.stop-card-copy{display:flex;flex-direction:column;min-width:0;gap:3px}
.stop-card-copy strong{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.stop-card-copy small{color:var(--muted);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.stop-order{display:grid;place-items:center;flex:0 0 26px;height:26px;border:1px solid rgba(73,231,242,.35);border-radius:6px;color:var(--cyan);font-weight:900}
.stop-order-actions{display:flex;align-items:stretch;border-left:1px solid rgba(73,231,242,.14)}
.admin-mini-action{width:38px;min-height:100%;padding:0;border:0;border-radius:0;background:#08101a;color:var(--cyan)}
.admin-mini-action+ .admin-mini-action{border-left:1px solid rgba(73,231,242,.12)}

/* Cache editor */
.admin-editor-section{padding:2px 0 16px;margin-bottom:16px;border-bottom:1px solid rgba(73,231,242,.16)}
.admin-editor-section:last-of-type{border-bottom:0}
.admin-map-help{margin:8px 0}
.admin-editor-actions{margin-top:4px}
.admin-app .admin-map{height:min(52vh,520px);min-height:300px}

/* Mission mode is quiet, not a color explosion. */
.admin-app .mission-mode-selector{display:grid;gap:7px}
.admin-app .mission-mode-option{
  border-color:rgba(73,231,242,.22)!important;background:#070c13!important
}
.admin-app .mission-mode-option:has(input:checked){border-color:rgba(255,75,216,.72)!important;box-shadow:0 0 0 1px rgba(255,75,216,.12)}
.admin-app .mission-mode-option input{accent-color:var(--pink)}

/* Outdoor capture: existing planned caches become first-class choices. */
.capture-existing-group{margin-top:16px;width:100%;text-align:left}
.capture-existing-list{display:grid;gap:7px;margin-top:7px;max-height:34vh;overflow:auto}
.capture-existing-item{
  display:flex;justify-content:space-between;align-items:center;gap:10px;width:100%;
  text-align:left;text-transform:none;letter-spacing:0;background:#071019;color:var(--text);
  border:1px solid rgba(73,231,242,.28);padding:10px 11px
}
.capture-existing-item strong{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.capture-existing-item small{color:var(--muted);font-size:10px;white-space:nowrap}

@media(max-width:620px){
  .admin-app .admin-wrap{padding:8px 9px 90px}
  .admin-app .panel,.admin-app .admin-panel{padding:12px;margin:8px 0;border-radius:11px}
  .mission-card-actions{flex-direction:column;width:44px}
  .admin-icon-action{width:44px;min-height:38px;border-left:0;border-top:1px solid rgba(73,231,242,.12)}
  .admin-icon-action:first-child{border-top:0}
  .admin-sticky-actions{grid-template-columns:1fr 1fr}
  .admin-app .admin-map{height:45vh;min-height:285px}
}
.admin-sticky-actions{grid-template-columns:repeat(3,minmax(0,1fr))}
.admin-sticky-actions>*{min-width:0;padding-inline:8px;font-size:12px}
@media(max-width:390px){.admin-sticky-actions>*{font-size:11px;padding-inline:5px}}


/* ================================================================
   v14.6.1 // autosave detail views + list-only deletion
   ================================================================ */
.admin-app .autosave-state{
  min-height:17px;
  margin-top:6px;
  color:var(--muted);
  font:700 10px/1.35 "Exo 2","Segoe UI",Arial,sans-serif;
  letter-spacing:.055em;
  text-transform:uppercase;
}
.admin-app .autosave-state.saving{color:#ffe287}
.admin-app .autosave-state.saved{color:#79f3df}
.admin-app .autosave-state.error{color:#ff98aa}
.admin-app .autosave-state.waiting{color:#8395a9}

.stop-card-actions{
  display:flex;
  align-items:stretch;
  border-left:1px solid rgba(73,231,242,.14);
}
.stop-card-actions .admin-mini-action:first-child{border-left:0}
.stop-card-actions .admin-mini-action + .admin-mini-action{border-left:1px solid rgba(73,231,242,.12)}
.stop-delete-action{
  color:#ff8499!important;
  background:#10090e!important;
}
.stop-delete-action:hover{
  color:#ffd7de!important;
  background:#211018!important;
}


/* ================================================================
   v14.6.2 // admin density + mobile/desktop cleanup
   ================================================================ */
.admin-app .admin-wrap{
  width:min(780px,100%);
  padding-bottom:104px;
}
.admin-app .panel,
.admin-app .admin-panel{
  padding:11px 12px;
  margin:7px 0;
}
.admin-screen-head{
  padding:4px 2px 1px;
}
.admin-screen-head h1,
.admin-panel h1{
  margin:2px 0 7px;
}
.admin-field-gap{margin-top:10px}
.admin-breadcrumb-compact{
  justify-content:flex-start;
  margin:2px 0 5px;
}
.admin-breadcrumb-compact .admin-back-btn{
  min-height:34px;
  padding:6px 9px;
  font-size:11px;
}
.admin-section-title-row h2{
  margin:1px 0 6px;
}

/* Mission overview: short cards, title first, text actions underneath. */
.admin-mission-list-panel{padding:7px!important}
.mission-list-clean{gap:7px}
.mission-card-clean{
  display:block;
  border-radius:10px;
}
.mission-card-main{
  display:block;
  width:100%;
  padding:8px 10px 7px;
}
.mission-card-title{font-size:15px}
.mission-card-meta{margin-top:2px;font-size:10px}
.mission-card-actions{
  display:grid;
  grid-template-columns:repeat(3,minmax(0,1fr));
  border-left:0;
  border-top:1px solid rgba(73,231,242,.16);
}
.mission-text-action{
  min-height:34px;
  display:grid;
  place-items:center;
  border:0;
  border-left:1px solid rgba(73,231,242,.12);
  border-radius:0;
  background:#08101a;
  color:#bffaff;
  text-decoration:none;
  text-transform:uppercase;
  letter-spacing:.045em;
  font:800 10px/1 "Exo 2","Segoe UI",Arial,sans-serif;
  cursor:pointer;
}
.mission-text-action:first-child{border-left:0}
.mission-text-action.play{color:var(--cyan)}
.mission-text-action.caches{color:#bffaff}
.mission-text-action.danger-text{color:#ff98aa;background:#10090e}
.mission-text-action:hover{background:#0b1722}
.mission-text-action.danger-text:hover{background:#211018;color:#ffd7de}

/* Always-visible create action, constrained to the same column on desktop. */
.admin-list-sticky-action{
  position:fixed;
  left:50%;
  transform:translateX(-50%);
  bottom:max(8px,env(safe-area-inset-bottom,0px));
  z-index:45;
  width:min(756px,calc(100% - 18px));
  padding:7px;
  border:1px solid rgba(73,231,242,.30);
  border-radius:12px;
  background:rgba(4,8,13,.94);
  backdrop-filter:blur(9px);
  box-shadow:0 -8px 30px rgba(0,0,0,.30);
}
.admin-list-sticky-action button{width:100%;min-height:42px}

/* Search mode: two compact cards, no visible radio circles. */
.admin-app .mission-mode-selector{
  grid-template-columns:repeat(2,minmax(0,1fr));
  gap:7px;
}
.admin-app .mission-mode-option{
  position:relative;
  min-height:68px;
  padding:9px 10px!important;
  display:flex;
  align-items:center;
  cursor:pointer;
}
.admin-app .mission-mode-option input{
  position:absolute;
  opacity:0;
  pointer-events:none;
}
.admin-app .mission-mode-option span{margin:0!important}
.admin-app .mission-mode-option strong{
  display:block;
  font-size:12px;
}
.admin-app .mission-mode-option small{
  display:block;
  margin-top:3px;
  color:var(--muted);
  font-size:10px;
  line-height:1.25;
}
.admin-app .mission-mode-option:has(input:checked){
  border-color:rgba(255,75,216,.92)!important;
  box-shadow:0 0 0 1px rgba(255,75,216,.22),0 0 14px rgba(255,75,216,.10);
}

/* The full URL is no longer a visual field. */
.admin-game-actions{
  display:grid;
  grid-template-columns:1fr auto;
  gap:7px;
}
.admin-game-actions .button,
.admin-game-actions button{
  min-height:39px;
  display:grid;
  place-items:center;
}
.admin-open-game{text-decoration:none}
.admin-copy-state{min-height:14px;margin-top:3px}

/* Cache list: no riddle preview; just operational state. */
.stop-card-main{padding:8px 9px}
.stop-card-copy{gap:2px}
.stop-card-copy small{
  font-size:9px;
  letter-spacing:.045em;
  text-transform:uppercase;
}
.stop-order{
  flex-basis:24px;
  height:24px;
}
.admin-mini-action{width:36px}

/* Tighter editor rhythm. */
.admin-editor-section{
  padding:1px 0 11px;
  margin-bottom:11px;
}
.admin-map-help{margin:6px 0}
.admin-status-line{min-height:15px;margin-top:5px}
.admin-app .autosave-state{margin-top:4px;min-height:15px}
.placement-doc-title{margin-bottom:6px}

/* GPS summary stays small; diagnostics are opt-in. */
.placement-details{
  margin-top:6px;
  padding:0;
  border:0!important;
  background:transparent!important;
}
.placement-details summary{
  width:max-content;
  max-width:100%;
  cursor:pointer;
  list-style:none;
  color:#8cebf2;
  font:800 10px/1.4 "Exo 2","Segoe UI",Arial,sans-serif;
  letter-spacing:.045em;
  text-transform:uppercase;
}
.placement-details summary::-webkit-details-marker{display:none}
.placement-details summary::after{content:"  · Messdetails ▾";color:#667b91;font-weight:700}
.placement-details[open] summary::after{content:"  · Messdetails ▴"}
#placementMetaDetails{
  margin-top:5px;
  padding:6px 8px;
  border-left:1px solid rgba(73,231,242,.22);
}

/* Compact image UI. */
.compact-image-control{
  display:flex;
  align-items:center;
  gap:9px;
  margin-top:5px;
}
.compact-image-preview{
  width:76px!important;
  height:58px!important;
  min-width:76px;
  object-fit:cover;
  margin:0!important;
  border-radius:7px;
  border:1px solid rgba(73,231,242,.28);
}
.compact-image-actions{
  display:flex;
  gap:6px;
  flex-wrap:wrap;
}
.compact-image-actions button{
  min-height:35px;
  padding:7px 10px;
  font-size:10px;
}
.private-image-control{margin-top:7px}

/* Clear hierarchy: normal operations cyan; selected mode pink; deletion red. */
.admin-app .primary{
  background:var(--cyan);
  border-color:var(--cyan);
  color:#031114;
}
.admin-app .danger{
  background:#170b11;
  border-color:rgba(255,91,114,.55);
  color:#ff98aa;
}

/* Keep forms pleasant on desktop instead of stretching them. */
#missionPanel > input,
#missionPanel > textarea,
#missionPanel > .mission-mode-selector,
#missionPanel > .autosave-state,
#missionPanel > .admin-game-actions,
#missionPanel > .admin-copy-state,
#editorPanel .admin-editor-section > input,
#editorPanel .admin-editor-section > textarea,
#editorPanel .admin-editor-section > .compact-image-control{
  max-width:700px;
}

@media(max-width:620px){
  .admin-app .admin-wrap{padding:6px 8px 102px}
  .admin-app .panel,.admin-app .admin-panel{padding:10px;margin:6px 0}
  .admin-screen-head p{margin:3px 0 5px}
  .admin-list-sticky-action{width:calc(100% - 16px)}
  .mission-card-actions{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));width:auto}
  .mission-text-action{min-height:36px}
  .admin-app .mission-mode-option{min-height:64px;padding:8px!important}
  .admin-app .mission-mode-option strong{font-size:11px}
  .admin-app .mission-mode-option small{font-size:9px}
  .admin-game-actions{grid-template-columns:1fr auto}
}
@media(max-width:360px){
  .admin-app .mission-mode-selector{gap:5px}
  .admin-app .mission-mode-option{padding:7px!important}
  .admin-game-actions{grid-template-columns:1fr}
  .admin-game-actions button{width:100%}
}


/* ================================================================
   v14.6.3 // quieter admin typography + cache-editor map polish
   ================================================================ */

/* Calm sci-fi sans throughout admin. Exo 2 is used throughout the interface. */
.admin-app,
.admin-app button,
.admin-app .button,
.admin-app input,
.admin-app textarea,
.admin-app select,
.admin-app .maplibregl-map{
  font-family:"Exo 2","Segoe UI",Arial,sans-serif;
}
.admin-app button,
.admin-app .button{
  font-weight:700;
  letter-spacing:.025em;
}
.admin-app input,
.admin-app textarea,
.admin-app select{
  font-weight:500;
}
.admin-app h1,
.admin-app h2,
.admin-app h3{
  letter-spacing:.01em;
}
.admin-app .topbar,
.admin-app .coords,
.admin-app .placement-details summary,
.admin-app #placementMetaDetails,
.admin-app .admin-cache-map-label-coords,
.admin-app .admin-copy-state{
  font-family:"Exo 2","Segoe UI",Arial,sans-serif;
}

/* No routine autosave chatter. Only actionable warning/error states appear. */
.admin-app .autosave-state{
  display:none;
  min-height:0;
  margin:4px 0 0;
}
.admin-app .autosave-state.error,
.admin-app .autosave-state.waiting{
  display:block;
}

/* Image thumbnails: about 2x the v14.6.2 size. */
.admin-app .compact-image-preview{
  width:152px!important;
  height:116px!important;
  min-width:152px;
}

/* Private documentation is a real padded panel even though it is also an editor section. */
.admin-app .admin-editor-section.placement-doc{
  padding:12px 12px 13px;
  margin-top:9px;
  margin-bottom:4px;
}
.admin-app .placement-doc-title{
  margin-bottom:9px;
}

/* Coordinates now belong visually to the map. */
.admin-app .admin-map-coords{
  margin:6px 2px 0;
  padding:0;
  color:#8fe7c6;
  font-size:10px;
  letter-spacing:.025em;
}
.admin-app .admin-map-actions{
  margin-top:6px;
}
.admin-app .admin-map-actions > *{
  flex:0 1 auto;
  min-width:170px;
}
.admin-app .admin-status-line:empty{
  display:none;
}

/* Labelled cache markers. Alternating sides keep dense plans more readable. */
.admin-cache-map-marker{
  position:relative;
  width:32px;
  height:32px;
  overflow:visible;
  z-index:4;
}
.admin-cache-map-marker.selected{
  z-index:12;
}
.admin-cache-map-marker .admin-stop-icon{
  position:absolute;
  inset:0;
}
.admin-draft-marker-wrap{
  position:relative;
  width:36px;
  height:36px;
  overflow:visible;
  z-index:14;
}
.admin-draft-marker-wrap .draft-icon{
  position:absolute;
  inset:0;
}
.admin-app .draft-icon.selected{
  background:rgba(255,75,216,.18);
  border-color:var(--pink);
  color:var(--pink);
  box-shadow:0 0 18px rgba(255,75,216,.55);
}
.admin-cache-map-label{
  position:absolute;
  top:50%;
  transform:translateY(-50%);
  min-width:max-content;
  max-width:190px;
  padding:4px 6px 4px;
  border:1px solid rgba(73,231,242,.28);
  border-radius:6px;
  background:rgba(4,9,15,.88);
  box-shadow:0 2px 10px rgba(0,0,0,.34);
  color:#d9f9fc;
  pointer-events:none;
  backdrop-filter:blur(3px);
}
.admin-cache-map-label.side-right{
  left:42px;
  text-align:left;
}
.admin-cache-map-label.side-left{
  right:42px;
  text-align:right;
}
.admin-draft-marker-wrap .admin-cache-map-label.side-right{
  left:46px;
}
.admin-cache-map-label.selected{
  border-color:rgba(255,75,216,.72);
  background:rgba(18,7,19,.91);
  box-shadow:0 0 0 1px rgba(255,75,216,.12),0 3px 14px rgba(0,0,0,.42);
}
.admin-cache-map-label-name{
  max-width:176px;
  overflow:hidden;
  text-overflow:ellipsis;
  white-space:nowrap;
  font-family:"Exo 2","Segoe UI",Arial,sans-serif;
  font-size:11px;
  line-height:1.15;
  font-weight:700;
  color:#eafcff;
}
.admin-cache-map-label.selected .admin-cache-map-label-name{
  color:#ffb5ef;
}
.admin-cache-map-label-coords{
  margin-top:2px;
  font-size:8px;
  line-height:1.1;
  color:#76bac3;
  white-space:nowrap;
}
.admin-cache-map-label.selected .admin-cache-map-label-coords{
  color:#d48bc8;
}

/* Old map helper is intentionally gone in v14.6.3. */
.admin-app .admin-map-help{display:none!important}

@media(max-width:620px){
  .admin-app .compact-image-preview{
    width:144px!important;
    height:110px!important;
    min-width:144px;
  }
  .admin-cache-map-label{
    max-width:150px;
    padding:3px 5px;
  }
  .admin-cache-map-label-name{
    max-width:138px;
    font-size:10px;
  }
  .admin-cache-map-label-coords{
    font-size:7px;
  }
}
@media(max-width:390px){
  .admin-app .compact-image-control{
    align-items:flex-start;
  }
  .admin-app .compact-image-preview{
    width:136px!important;
    height:104px!important;
    min-width:136px;
  }
  .admin-cache-map-label{
    max-width:126px;
  }
  .admin-cache-map-label-name{
    max-width:114px;
  }
}


/* ================================================================
   v14.6.4 // map-pin anchoring fix + mission-list cleanup
   ================================================================ */

/* The mission cards are already individually framed. */
.admin-app .admin-mission-list-panel{
  padding:0;
  margin:6px 0;
  border:0;
  border-radius:0;
  background:transparent;
  box-shadow:none;
}

/*
   Inactive cache pins are now native MapLibre circle layers, not DOM
   wrappers. Their geography is rendered in the same pipeline as the map,
   so pinch-zoom cannot move them relative to roads/buildings.
*/
.admin-app .admin-cache-map-label{
  top:0;
  left:0;
  min-width:max-content;
  max-width:190px;
  padding:4px 6px;
  border:1px solid rgba(73,231,242,.28);
  border-radius:6px;
  background:rgba(4,9,15,.88);
  box-shadow:0 2px 10px rgba(0,0,0,.34);
  color:#d9f9fc;
  pointer-events:none;
  backdrop-filter:blur(3px);
  transition:opacity .08s linear;
}

/* Remove v14.6.3 child-positioning rules: labels are their own Marker now. */
.admin-app .admin-cache-map-label.side-right,
.admin-app .admin-cache-map-label.side-left{
  left:0;
  right:auto;
  text-align:left;
}

/*
   During an active pan/pinch gesture, hide the HTML labels for a moment.
   The actual cache pins stay visible because they are native map layers.
   This prevents compositor lag in labels from looking like bad GPS points.
*/
.admin-app .admin-map.map-gesture-active .admin-cache-map-label{
  opacity:0;
}

/* Current draggable cache: keep the pin element minimal and map-anchored. */
.admin-app .maplibregl-marker.draft-icon{
  position:absolute;
  margin:0;
  padding:0;
}

@media(max-width:620px){
  .admin-app .admin-mission-list-panel{margin:4px 0}
}


/* ================================================================
   v14.6.5 // unified Exo 2 game typography + capture navigation
   ================================================================ */

/* Player/game: same calm sci-fi typography as the admin. */
.player-app,
.player-app button,
.player-app .button,
.player-app input,
.player-app textarea,
.player-app select,
.player-app .maplibregl-map{
  font-family:"Exo 2","Segoe UI",Arial,sans-serif;
}
.player-app button,
.player-app .button{
  font-weight:700;
  letter-spacing:.025em;
}
.player-app input,
.player-app textarea,
.player-app select{
  font-weight:500;
}
.player-app h1,
.player-app h2,
.player-app h3{
  letter-spacing:.01em;
}

/* Diagnostics use the same Exo 2 typography. */
.player-app .diagnostics-box pre{
  font-family:"Exo 2","Segoe UI",Arial,sans-serif;
}

/*
  Outdoor capture belongs visually to the same admin navigation now:
  no title card, no surrounding header rectangle, just the normal back button.
*/
.capture-head{
  min-height:34px;
  justify-content:flex-start;
  padding:0;
  border:0;
  border-radius:0;
  background:transparent;
}
.capture-close-btn{
  min-height:34px;
  padding:6px 9px;
  margin:0;
  white-space:nowrap;
  font-size:11px;
}
.capture-head strong,
.capture-head .eyebrow{
  display:none!important;
}

@media(max-width:650px){
  .capture-head{
    min-height:34px;
    border-radius:0;
  }
}
@media(max-height:650px){
  .capture-head{
    min-height:34px;
  }
}


/* ================================================================
   v14.6.7 // player visual cleanup + Android Firefox viewport fix
   ================================================================ */

/* Exo 2 everywhere — no monospace exception remains. */
html,body,
button,.button,input,textarea,select,
.maplibregl-map,
.player-app,
.player-app *,
.admin-app,
.admin-app *{
  font-family:"Exo 2","Segoe UI",Arial,sans-serif;
}

/* Startscreen: Field Art stays visible and uses the same cyan frame language. */
.player-app .header-art{
  border-color:rgba(73,231,242,.54);
}
.player-app .header-toggle{
  display:none!important;
}

/* One consistent cyan frame system throughout the non-map game UI. */
.player-app .panel,
.player-app .panel.purple,
.player-app .panel.pink,
.player-app .player-box,
.player-app .voice-settings,
.player-app .mission-strip,
.player-app .locator-card,
.player-app .game-modal-card,
.player-app .emergency-confirm,
.player-app .diagnostics-box,
.player-app .heading-calibration-box,
.player-app .heading-calibration-readout,
.player-app input,
.player-app textarea,
.player-app select,
.player-app .clue-image,
.player-app .target-info-distance,
.player-app .gps-quality,
.player-app .success-art{
  border-color:rgba(73,231,242,.50)!important;
}

/* Agent / Team: no dashed container anymore. */
.player-app .player-box{
  border-style:solid;
}

/* EleLab Funk configuration: calm cyan frame, no decorative icon. */
.player-app .voice-settings{
  border-style:solid;
}

/* Settings control is text rather than an emoji. */
.player-app .settings-text-btn{
  width:40px;
  padding:0 4px;
  font-size:9px!important;
  letter-spacing:.04em;
}

/* Runtime help/status panels must also remain cyan-framed. */
.player-app .emergency-confirm{
  background:#0a0f12;
}
.player-app .diagnostics-box pre{
  border-top-color:rgba(73,231,242,.22);
}

/*
   Android Firefox only:
   visualViewport.height tracks the part of the screen not covered by
   Firefox's dynamic browser toolbar. Chrome keeps the existing 100dvh path.
*/
html.android-firefox body.playing,
html.android-firefox body.immersive{
  height:var(--ff-visible-height);
  min-height:0;
  max-height:var(--ff-visible-height);
  overflow:hidden;
}
html.android-firefox body.playing .game-wrap,
html.android-firefox body.immersive .game-wrap{
  height:var(--ff-visible-height);
  min-height:var(--ff-visible-height);
  max-height:var(--ff-visible-height);
}
html.android-firefox body.playing .game-screen,
html.android-firefox body.immersive .game-screen{
  height:auto;
  min-height:0;
  flex:1 1 auto;
}


/* ================================================================
   v14.6.8 // remove unnecessary nested/double frames
   ================================================================ */

/*
  Large outer section frames stay.
  Small inner wrappers should not repeat the same border when the actual
  control already has its own clear outline.
*/

/* Start screen: Agent / Team uses the input itself as the only inner frame. */
.player-app .player-box{
  border:0!important;
  border-radius:0;
  background:transparent;
  padding:0;
  margin-top:14px;
}

/*
  Missions overview: the floating create action needs only the button outline.
  Remove the second rounded frame around it while keeping its fixed position.
*/
.admin-app .admin-list-sticky-action{
  padding:0;
  border:0;
  border-radius:0;
  background:transparent;
  backdrop-filter:none;
  box-shadow:none;
}


/* ================================================================
   v14.6.10 // Android Firefox navigation-screen height-only reserve
   ================================================================ */

/*
  Keep the map full-width like the other boxes.
  Firefox Android only gets ~24 px less map HEIGHT so the HINWEIS /
  GEFUNDEN row remains fully visible above the dynamic browser toolbar.
  Chrome and all other browsers keep the previous geometry unchanged.
*/
html.android-firefox body.player-app.playing .game-screen .map-shell{
  width:100%;
  aspect-ratio:auto;
  height:calc(min(100vw, 100%) - 24px);
  align-self:stretch;
}
