/* Theme: follows the system unless the header switch picks one
   (data-theme="dark" | "light" on <html>). */
:root{--sev-critical:#dc2626;--sev-warning:#d97706;--sev-info:#3b82f6;--oc-outline:#0b0f14;--oc-lost:#9ca3af;--oc-ok:#34d399}
:root{color-scheme:light;--bg:#f6f7f9;--panel:#fff;--ink:#12151a;--muted:#6b7280;
      --line:#e3e6eb;--accent:#0091FF;--danger:#c1121f;--map-bg:#e5e3df}
@media (prefers-color-scheme:dark){:root:not([data-theme="light"]){color-scheme:dark;
      --bg:#0f1216;--panel:#161a21;--ink:#e6e9ef;--muted:#8b93a1;--line:#242a33;--map-bg:#1b1f26}}
:root[data-theme="dark"]{color-scheme:dark;--bg:#0f1216;--panel:#161a21;--ink:#e6e9ef;
      --muted:#8b93a1;--line:#242a33;--map-bg:#1b1f26}
*{box-sizing:border-box}
body{margin:0;background:var(--bg);color:var(--ink);
     font:14px/1.5 -apple-system,Segoe UI,Roboto,sans-serif;height:100vh;
     display:flex;flex-direction:column}
header{display:flex;justify-content:space-between;align-items:center;gap:12px;flex-wrap:nowrap;
       height:52px;padding:0 12px;background:var(--panel);border-bottom:1px solid var(--line);
       position:relative;z-index:1100}
h1{font-size:16px;margin:0}
.sub{color:var(--muted);font-size:12px}
.sub .ok{color:#1a9e4b;font-weight:600}
.sub .bad{color:var(--danger);font-weight:600}
.actions{display:flex;gap:8px;flex-wrap:nowrap;align-items:center;flex:0 0 auto}
.title{display:flex;gap:10px;align-items:center;min-width:0;flex:1 1 auto;white-space:nowrap}
header .title .sub{overflow:hidden;text-overflow:ellipsis;min-width:0;max-width:22ch}
header button{padding:5px 10px}
header h1{display:flex;align-items:center;gap:8px;flex:0 0 auto}
button.icon{padding:6px 10px;font-size:16px;line-height:1}
button{padding:8px 13px;border:0;border-radius:7px;background:var(--accent);color:#fff;
       font-size:13px;font-weight:600;cursor:pointer}
button.ghost{background:transparent;color:var(--ink);border:1px solid var(--line)}
button.danger{background:var(--danger)}
main{flex:1;display:flex;min-height:0}
#map{flex:1;min-width:0;background:var(--map-bg)}

/* Left panel: the fleet at a glance, the selected drone, and the tools. It
   folds away (the hamburger in the header) to give the map the whole width. */
/* The side is an icon rail (tabs, with names) and the panel beside it: a title,
   the panel's own content scrolling, and a fixed footer. The panel can be
   dragged wider; --side-panel-w is its width, --rail-w the rail's, and
   --side-w the two together (CLOUD-1784). */
:root{--rail-w:68px;--side-panel-w:300px;--side-w:calc(var(--rail-w) + var(--side-panel-w))}
#side{position:relative;width:var(--side-w);flex:0 0 var(--side-w);border-right:1px solid var(--line);
      background:var(--panel);min-height:0;display:flex;flex-direction:row;overflow:hidden}
#side[hidden]{display:none!important}
#side.rail-icons{--rail-w:48px}
.side-panel{flex:1;min-width:0;display:flex;flex-direction:column;container-type:inline-size}
.panel-head{flex:0 0 auto;padding:10px 14px;border-bottom:1px solid var(--line)}
.panel-head h2{margin:0;font-size:15px;font-weight:700}
.panel-scroll{flex:1;min-height:0;overflow-y:auto;overflow-x:hidden;display:flex;flex-direction:column}
.panel-foot{flex:0 0 auto;padding:6px 14px;border-top:1px solid var(--line);font-size:11.5px;
            color:var(--muted);min-height:16px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
#side section{padding:12px 14px;border-bottom:1px solid var(--line)}
/* Every panel is split into blocks: a title, room around it and a visible border, so it is clear what starts where (CLOUD-2138). */
#side .panel-scroll section{margin:10px 12px 0;padding:12px 14px;border:1px solid var(--line);border-radius:10px;background:var(--panel)}
#side .panel-scroll section:last-child{margin-bottom:12px}
#side .panel-scroll section>h3{margin:0 0 8px;font-size:11px;font-weight:700;letter-spacing:.06em;text-transform:uppercase;color:var(--muted)}
#side .panel-scroll section[hidden]{display:none}
.tabs{display:flex}
.rail{flex:0 0 var(--rail-w);width:var(--rail-w);flex-direction:column;align-items:stretch;gap:2px;
      padding:6px 4px;border-right:1px solid var(--line);background:var(--bg);overflow-y:auto;overflow-x:hidden}
.tab{position:relative;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:2px;
     min-height:56px;background:none;color:var(--muted);border:0;border-left:3px solid transparent;
     border-radius:8px;padding:6px 2px;font-size:11px;font-weight:650;line-height:1.1}
.tab:hover{color:var(--ink);background:color-mix(in srgb,var(--ink) 6%,transparent)}
.tab.active{color:var(--accent);border-left-color:var(--accent);
            background:color-mix(in srgb,var(--accent) 12%,transparent)}
.tab-ico{flex:0 0 auto}
.tab.has-alarm::after{content:"";position:absolute;top:6px;left:8px;width:8px;height:8px;border-radius:50%;
  background:var(--sev-warning);box-shadow:0 0 0 2px var(--bg)}
.tab.has-alarm.critical::after{background:var(--sev-critical)}
.tab-label{max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.rail-icons .tab-label{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap}
.rail-icons .tab{min-height:48px}
.tab-badge{position:absolute;top:2px;right:2px;min-width:16px;height:16px;padding:0 4px;border-radius:999px;
           box-sizing:border-box;background:var(--accent);color:#fff;font-size:10px;font-weight:700;line-height:16px;
           text-align:center}
.tab-badge.critical{background:var(--sev-critical)}
.tab-badge.warning{background:var(--sev-warning)}
.rail-collapse{margin-top:auto;min-height:44px;background:none;border:0;border-radius:8px;color:var(--muted);
               display:flex;align-items:center;justify-content:center;padding:0}
.rail-collapse:hover{color:var(--ink);background:color-mix(in srgb,var(--ink) 6%,transparent)}
.rail-collapse svg{transition:transform .15s}
.rail-icons .rail-collapse svg{transform:rotate(180deg)}
/* The drag handle on the panel's right edge: thin to look at, 14 px wide to grab (touch included). */
.side-resize{position:absolute;top:0;right:-5px;bottom:0;width:14px;z-index:3;cursor:col-resize;touch-action:none}
.side-resize::after{content:"";position:absolute;top:0;bottom:0;left:6px;width:2px;background:transparent;transition:background .12s}
.side-resize:hover::after,.side-resize:focus-visible::after,.side-resize.dragging::after{background:var(--accent)}
body.resizing-side{cursor:col-resize;user-select:none}
body.resizing-side #map{pointer-events:none}
.tab-panel[hidden]{display:none!important}
.points-panel{display:flex;flex-direction:column;flex:1;min-height:0}
.points-panel #list{overflow:auto;flex:1}
.points-panel .points-box{flex:1;min-height:0;display:flex;flex-direction:column}
.points-panel .points-search input{width:100%;box-sizing:border-box;min-height:44px}
.segmented{display:flex;border:1px solid var(--line);border-radius:8px;overflow:hidden}
.segmented button{flex:1;border-radius:0;background:none;color:var(--ink);padding:7px}
.segmented button.active{background:var(--accent);color:#fff}
.layer-head{display:flex;justify-content:space-between;align-items:center;margin-bottom:6px}
.layer-head h3{margin:0!important}
label.switch{display:flex;align-items:center;gap:5px;margin:0;font-size:12px;color:var(--muted)}
label.switch input{width:auto;margin:0}
.layer-list{display:flex;flex-direction:column}
.layer-row{display:flex;align-items:center;gap:8px;padding:5px 2px;margin:0;font-size:13px;
           color:var(--ink);cursor:pointer;border-radius:6px}
.layer-row:hover{background:var(--bg)}
.layer-row input{width:auto;margin:0}
.layer-row .nm{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.layer-row .n{color:var(--muted);font-size:11.5px;font-variant-numeric:tabular-nums}
.layer-row .zoom{background:none;color:var(--muted);border:0;padding:0 4px;font-size:14px}
.layer-row .zoom:hover{color:var(--accent)}
.layer-row .del{background:none;color:var(--muted);border:0;padding:0 4px;display:inline-flex;align-items:center}
.layer-row .del:hover,.layer-row .del:focus-visible{color:var(--danger)}
.layer-delete-text{margin:0 0 8px;font-size:13px;line-height:1.45;overflow-wrap:anywhere}
#layer-delete .error{color:var(--sev-critical);font-size:12px;min-height:0;margin:6px 0}
#layer-delete .error:empty{display:none}
.layer-row.off .nm{color:var(--muted)}
.swatch.sq{border-radius:2px}
.layer-list .empty{color:var(--muted);font-size:12px}
/* A surface model (DSM): its name, then where and when the imagery is from. */
.dsm-row{align-items:flex-start}
.dsm-row input{margin-top:2px}
.dsm-row .dsm-body{flex:1;min-width:0;display:flex;flex-direction:column}
.dsm-row .dsm-body .nm{flex:none}
.dsm-row .dsm-meta{color:var(--muted);font-size:11.5px;font-variant-numeric:tabular-nums;overflow-wrap:anywhere}
.dsm-row .dsm-meta .age{white-space:nowrap}
.dsm-row .dsm-meta .old{color:#c47f00;font-weight:600}
.dsm-row .dsm-meta .bad{color:var(--danger)}
.layer-row .del:hover{color:var(--danger)}
.dsm-hint{display:block;margin-top:3px}
.dsm-filename{margin:-6px 0 12px;overflow-wrap:anywhere}
.dsm-progress{width:100%;margin:0 0 6px}
.map-btn{width:30px;height:30px;line-height:30px;text-align:center;font-size:16px;
         background:#fff;color:#333;cursor:pointer;display:block}
.map-btn:hover{background:#f4f4f4}
#side h3{margin:0 0 8px;font-size:11px;letter-spacing:.06em;text-transform:uppercase;
         color:var(--muted)}
.tool-row{display:flex;gap:8px;align-items:center;margin-bottom:8px}
.tool-row:last-child{margin-bottom:0}
.eos-form{margin-top:10px;border-top:1px solid var(--line);padding-top:8px}
.eos-label{display:block;font-size:12px;font-weight:650;margin-bottom:6px}
.eos-form .tool-row{flex-wrap:wrap}
.eos-form .tool-row input{flex:1 1 100%;width:auto;min-width:0;text-align:left}
.eos-form .tool-row button{flex:1 1 0}
.eos-list,.eos-row{min-width:0;max-width:100%}
.eos-list{display:grid;gap:6px}
.eos-row{display:flex;gap:8px;align-items:center;padding:6px 8px;border:1px solid var(--line);border-radius:8px}
.eos-row .nm{flex:1;min-width:0}
.eos-row .nm b{display:block;font-size:12.5px}
.eos-row .nm small{display:block;color:var(--muted);font-size:11px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.eos-row button{flex:0 0 auto;padding:4px 10px;font-size:12px}
.tool-row button{flex:1}
.tool-row label.inline{margin:0;font-size:12px;color:var(--muted)}
.tool-row input{width:90px;padding:6px 8px;text-align:right}
.tool-row .unit{font-size:12px;color:var(--muted)}
.stats{display:grid;grid-template-columns:repeat(3,1fr);gap:8px}
.stat{display:flex;flex-direction:column;padding:8px;border:1px solid var(--line);
      border-radius:8px;background:var(--bg)}
.stat span{font-size:24px;font-weight:700;line-height:1.1;font-variant-numeric:tabular-nums}
.stat small{color:var(--muted);font-size:11px;line-height:1.25}
#fleet-note:empty{display:none}
#fleet-note{margin-top:6px}
.cards{display:flex;flex-direction:column;gap:6px}
.cards .empty{color:var(--muted);font-size:12px}
.card{padding:8px 10px;border:1px solid var(--line);border-radius:8px;cursor:pointer;
      font-size:13px;background:var(--panel)}
.card:hover{background:var(--bg)}
.card.sel{border-color:var(--accent);background:color-mix(in srgb,var(--accent) 10%,transparent)}
.card.static{cursor:default}
.card-top{display:flex;align-items:center;gap:6px;flex-wrap:wrap}
.card .dot{width:10px;height:10px;border-radius:50%;flex:0 0 10px}
.card .sq{width:10px;height:10px;border-radius:2px;flex:0 0 10px;border:2px solid var(--accent)}
.card .nm{font-weight:650;flex:1 1 auto;min-width:0;white-space:nowrap;overflow:hidden;
          text-overflow:ellipsis}
.card .badges{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:4px;margin-left:auto;min-width:0}
.card .meta{color:var(--muted);font-size:11.5px;margin-top:2px;font-variant-numeric:tabular-nums}
.card .meta .ok{color:#1a9e4b;font-weight:600}
.card .meta .bad{color:var(--danger);font-weight:600}
.card.stale .nm{color:var(--muted)}
.badge{font-size:10.5px;font-weight:700;padding:1px 7px;border-radius:999px;
       text-transform:uppercase;letter-spacing:.03em;white-space:nowrap}
.badge.flying{background:color-mix(in srgb,#1a9e4b 18%,transparent);color:#1a9e4b}
.badge.ground{background:color-mix(in srgb,var(--accent) 16%,transparent);color:var(--accent)}
.badge.online{background:color-mix(in srgb,#1a9e4b 18%,transparent);color:#1a9e4b}
.badge.offline{background:color-mix(in srgb,var(--muted) 18%,transparent);color:var(--muted)}
.badge.alert{background:color-mix(in srgb,var(--danger) 16%,transparent);color:var(--danger)}
.detail-head{display:flex;justify-content:space-between;align-items:center}
.detail h2{margin:0;font-size:15px}
#detail-grid{display:grid;grid-template-columns:auto 1fr;gap:5px 12px;margin:10px 0 0;font-size:13px}
#detail-grid dt{color:var(--muted)}
#detail-grid dd{margin:0;font-weight:600;font-variant-numeric:tabular-nums;text-align:right}
#detail-grid dd.warn{color:#c47f00}
#detail-grid dd.bad{color:var(--danger)}
#detail-grid dd.good{color:#1a9e4b}
aside{width:330px;border-left:1px solid var(--line);background:var(--panel);
      display:flex;flex-direction:column;min-height:0}
.filter{padding:10px;border-bottom:1px solid var(--line)}
input,select{width:100%;padding:8px 10px;border:1px solid var(--line);border-radius:7px;
             background:var(--bg);color:var(--ink);font-size:13px}
#list{overflow:auto;flex:1}
.item{padding:10px 12px;border-bottom:1px solid var(--line);cursor:pointer;
      display:flex;gap:10px;align-items:center}
.item:hover{background:var(--bg)}
.item.sel{background:color-mix(in srgb,var(--accent) 14%,transparent)}
.swatch{width:10px;height:10px;border-radius:50%;flex:0 0 10px}
.item .nm{font-weight:600}
.item .co{color:var(--muted);font-size:11.5px;font-variant-numeric:tabular-nums}
.sheet{position:fixed;inset:0;background:rgba(0,0,0,.45);display:grid;place-items:center;
       padding:16px;z-index:9999}
.sheet-inner{background:var(--panel);border-radius:12px;padding:18px;width:min(460px,100%);
             max-height:85vh;overflow:auto}
.sheet h2{margin:0 0 14px;font-size:15px}
label{display:block;margin-bottom:11px;font-size:12px;color:var(--muted)}
label input{margin-top:4px}
.row{display:flex;gap:10px}.row label{flex:1}
label.check{display:flex;align-items:center;gap:7px;margin-top:22px}
label.check input{width:auto;margin:0}
.hint{font-size:11px}
.hint.over{color:var(--danger)}
.sheet-actions{display:flex;gap:8px;margin-top:6px}
.sheet-actions button{flex:1}
#setup-steps{padding-left:20px;font-size:13px}
#setup-steps li{margin-bottom:9px}
code{background:var(--bg);padding:2px 6px;border-radius:5px;font-size:12px;word-break:break-all}
[hidden]{display:none!important}
@media(max-width:760px){main{flex-direction:column}aside{width:auto;border-left:0;
  border-top:1px solid var(--line);max-height:44vh}#map,#map3d{min-height:46vh}
  #side{width:auto;flex:0 0 auto;max-height:50vh;border-right:0;border-bottom:1px solid var(--line);flex-direction:column}
  .rail,#side.rail-icons .rail{flex:0 0 auto;width:auto;flex-direction:row;overflow-x:auto;overflow-y:hidden;
        border-right:0;border-bottom:1px solid var(--line)}
  .tab{flex:1 0 64px;border-left:0;border-bottom:3px solid transparent}
  .tab.active{border-bottom-color:var(--accent)}
  .rail-collapse,.side-resize{display:none}
  .rail-icons .tab-label{position:static;width:auto;height:auto;clip:auto}}

/* drone marker: a triangle that turns to the reported heading, with its name
   and height under it. Home points and pilots (RCs) are the same family, but
   quieter, so they never compete with a moving aircraft for attention. */
.drone-icon{background:none;border:0}
/* Manned aircraft (CLOUD-1697): a white plane on the dark outline, turned the way it flies,
   never a drone's shape or colour. */
.traffic-icon{background:none;border:0}
.traffic-marker{display:flex;flex-direction:column;align-items:center;--traffic:#fff}
.traffic-plane{width:26px;height:26px;transform:rotate(var(--rot,0deg));filter:drop-shadow(0 0 1.5px #0b0f14) drop-shadow(0 1px 2px rgba(0,0,0,.6))}
.traffic-plane svg{width:100%;height:100%;fill:var(--traffic);stroke:#0b0f14;stroke-width:1.2}
.traffic-chip{margin-top:1px;border-left:3px solid #0b0f14}
.traffic-marker.near .traffic-plane{filter:drop-shadow(0 0 3px var(--sev-warning)) drop-shadow(0 0 1.5px #0b0f14)}
.traffic-marker.near .traffic-chip{border-left-color:var(--sev-warning)}
.traffic-marker.stale{opacity:.55}
.layer-note{margin:2px 0 4px;font-size:11.5px;color:var(--muted)}

.drone-marker,.rc-marker,.home-marker{display:flex;flex-direction:column;align-items:center}
/* The aircraft (CLOUD-1675): a disc in its identity colour (--drone) with a
   dark outline, a chevron turned to its heading, a ring that empties with the
   battery and a dot for the link or an alarm. Same size at every zoom; the
   label hangs under it and steps aside (.crowded) when labels would overlap. */
.drone-marker{position:relative;width:44px;height:44px}
.drone-body{position:relative;width:44px;height:44px}
.drone-svg{display:block;width:44px;height:44px;overflow:visible;filter:drop-shadow(0 1px 2px rgba(0,0,0,.45))}
.drone-svg .ring-bg{fill:none;stroke:color-mix(in srgb,var(--oc-outline) 60%,transparent);stroke-width:4.5}
.drone-svg .ring{fill:none;stroke-width:3;stroke-linecap:round;transition:stroke-dasharray .4s}
.drone-svg .ring[data-tone="good"]{stroke:var(--oc-ok)}
.drone-svg .ring[data-tone="warn"]{stroke:var(--sev-warning)}
.drone-svg .ring[data-tone="bad"]{stroke:var(--sev-critical)}
.drone-svg .disc{fill:var(--drone);stroke:var(--oc-outline);stroke-width:1.6}
.drone-svg .chevron path{fill:var(--oc-outline);stroke:var(--oc-outline);stroke-width:1;stroke-linejoin:round}
.drone-svg .chevron{transition:transform .3s linear}
.drone-svg .status-dot{stroke:var(--oc-outline);stroke-width:1.5;fill:var(--oc-lost)}
.drone-svg .status-dot[data-state="ok"]{fill:var(--oc-ok)}
.drone-svg .status-dot[data-state="weak"],.drone-svg .status-dot[data-state="warning"]{fill:var(--sev-warning)}
.drone-svg .status-dot[data-state="critical"]{fill:var(--sev-critical)}
.drone-svg .status-dot[data-state="unknown"]{display:none}
/* An active alarm: the ring pulses red (amber for a warning) until acknowledged. */
.drone-marker.alarm-critical .ring-bg{stroke:var(--sev-critical);animation:alarm-ring 1s ease-in-out infinite alternate}
.drone-marker.alarm-warning .ring-bg{stroke:var(--sev-warning)}
.drone-marker.alarm-acked .ring-bg{animation:none}
.drone-marker.stale .disc{fill:var(--oc-lost)}
.drone-marker.stale .drone-svg{opacity:.6}
/* A ghost where it was last heard from (CLOUD-1681): faded, with a dashed grey ring. */
.drone-marker.stale:not(.lost) .drone-body::after{content:"";position:absolute;inset:-5px;border-radius:50%;
  border:2px dashed var(--oc-lost)}
.drone-marker.selected .drone-body::after{content:"";position:absolute;inset:-4px;border-radius:50%;
  border:2px dashed var(--drone)}
.drone-chip{position:absolute;top:46px;left:50%;transform:translateX(-50%);display:flex;flex-direction:column;
  align-items:center;line-height:1.25;border-left:3px solid var(--drone)!important;pointer-events:none}
.drone-chip .nm{font:650 11.5px -apple-system,Segoe UI,Roboto,sans-serif}
.drone-chip .sub{font:600 10.5px -apple-system,Segoe UI,Roboto,sans-serif;color:var(--muted);font-variant-numeric:tabular-nums}
.drone-chip .sub:empty{display:none}
.drone-chip.crowded{visibility:hidden}
.drone-marker:hover .drone-chip.crowded{visibility:visible}
/* Its path: the drone's colour lightened (set in app.js), with a dark edge so a
   pale tint still reads on a pale basemap. */
.drone-trail{filter:drop-shadow(0 0 1px rgba(0,0,0,.55))}
/* Direction arrows along a path, and what its colours mean (CLOUD-1676). */
.path-arrow{pointer-events:none}
.path-arrow svg{width:12px;height:12px;display:block}
.path-legend{display:flex;flex-wrap:wrap;gap:4px 10px;font-size:11px;color:var(--muted);margin:4px 0 6px}
.path-legend span{display:inline-flex;align-items:center;gap:4px}
.path-legend i{width:14px;height:4px;border-radius:2px;display:inline-block;box-shadow:0 0 0 1px var(--oc-outline)}
.path-legend.ramp{display:block}
.path-legend .ramp-bar{height:6px;border-radius:3px;box-shadow:0 0 0 1px var(--oc-outline)}
.path-legend .ramp-ends{display:flex;justify-content:space-between;gap:6px;margin-top:2px}
.map-label{margin-top:1px;padding:1px 6px;border-radius:4px;white-space:nowrap;
  background:color-mix(in srgb,var(--panel) 88%,transparent);color:var(--ink);
  border:1px solid var(--line);font:700 11px ui-monospace,Menlo,Consolas,monospace}
.map-label.small{font-size:10px;padding:0 4px;color:var(--muted)}
.drone-marker.stale .map-label{color:var(--muted)}
.rc-pin{width:13px;height:13px;border-radius:3px;border:2px solid var(--accent);
  background:var(--panel);box-shadow:0 0 2px rgba(0,0,0,.5)}
.rc-marker.stale .rc-pin{border-color:var(--muted)}
.home-pin{width:15px;height:15px;border-radius:50%;border:2px solid var(--home-color,#1a9e4b);
  background:var(--panel);color:var(--home-color,#1a9e4b);font:800 9px/11px sans-serif;text-align:center}
.leaflet-tooltip.home-line-tip{background:var(--panel);color:var(--ink);border:1px solid var(--line);padding:0 4px;font-size:10px;box-shadow:none}
.leaflet-tooltip .muted{color:#8b93a1;font-size:11px}

#offline{position:absolute;z-index:500;left:50%;transform:translateX(-50%);top:70px;
  background:var(--panel);color:var(--muted);border:1px solid var(--line);
  padding:7px 12px;border-radius:8px;font-size:12px;max-width:min(90vw,420px);
  text-align:center;box-shadow:0 2px 8px rgba(0,0,0,.18)}

.group{display:inline-flex;align-items:center;gap:6px;padding:3px 8px;
  border:1px solid var(--line);border-radius:8px;background:var(--bg)}
.group label.inline{margin:0;font-size:12px;color:var(--muted);white-space:nowrap}
.group input{width:64px;padding:5px 7px;text-align:right}
.group .unit{font-size:12px;color:var(--muted)}
/* Admins only: whose feeders the map shows. */
select.workspace{width:auto;max-width:260px;padding:6px 8px}
#setup-steps code{word-break:break-all}

/* Who a drone or controller belongs to: the login email, on every card. */
.card .who{display:flex;align-items:center;gap:5px;margin-top:3px;font-size:12px;
           font-weight:600;color:var(--ink);min-width:0;overflow:hidden;
           text-overflow:ellipsis;white-space:nowrap}
.card .who-icon{flex:0 0 12px;width:12px;height:12px;border-radius:50%;
                background:radial-gradient(circle at 50% 36%,var(--muted) 0 22%,transparent 23%),
                           radial-gradient(circle at 50% 108%,var(--muted) 0 45%,transparent 46%)}
.card .who .you{font-size:10px;font-weight:700;color:var(--accent);
                border:1px solid var(--accent);border-radius:999px;padding:0 5px}

/* Top right, for admins only: they see every pilot's aircraft, so say so. */
.role-badge{display:inline-flex;align-items:center;gap:5px;padding:5px 11px;border-radius:999px;
            background:color-mix(in srgb,#c47f00 16%,transparent);color:#c47f00;
            border:1px solid color-mix(in srgb,#c47f00 45%,transparent);
            font-size:11.5px;font-weight:800;letter-spacing:.06em;text-transform:uppercase}
.role-badge::before{content:"";width:7px;height:7px;border-radius:50%;background:currentColor}

/* Tablets and laptops: same quiet family as RCs and home points. */
.client-marker{display:flex;flex-direction:column;align-items:center}
.client-marker svg{filter:drop-shadow(0 0 2px rgba(0,0,0,.55))}
.card-top svg{flex:0 0 auto}
#share-note:empty{display:none}
#share-note{margin-bottom:6px}

/* Recent MQTT connection attempts, under Pilots. */
.attempts{margin-top:10px}
.attempts summary{cursor:pointer;color:var(--muted);font-size:12px;font-weight:600}
.attempt{display:grid;grid-template-columns:auto 1fr;gap:0 8px;padding:5px 0;
         border-bottom:1px solid var(--line);font-size:12px}
.attempt span{color:var(--muted);font-variant-numeric:tabular-nums}
.attempt b{font-weight:650}
.attempt.ok b{color:#1a9e4b}
.attempt.bad b{color:var(--danger)}
.attempt b .count{font-weight:500}
.attempt small{grid-column:2;color:var(--muted);word-break:break-all}

/* Telemetry topics received, under Pilots: the raw truth of what Pilot 2 sends. */
.topic{border-bottom:1px solid var(--line);padding:5px 0;font-size:12px}
.topic summary{cursor:pointer;display:flex;flex-direction:column;list-style:none}
.topic summary b{font-weight:650;word-break:break-all}
.topic summary small{color:var(--muted)}
.topic summary .ok{color:#1a9e4b;font-weight:600}
.topic summary .bad{color:var(--danger);font-weight:600}
.topic pre{margin:6px 0 0;padding:8px;background:var(--bg);border-radius:6px;max-height:260px;
           overflow:auto;font-size:11px;white-space:pre-wrap;word-break:break-all}

/* Map chrome follows the theme: zoom/fit buttons, tooltips, attribution. */
.leaflet-container{background:var(--map-bg)}
.leaflet-bar a,.leaflet-bar a:hover,.map-btn,.map-btn:hover{background:var(--panel);color:var(--ink);
  border-bottom-color:var(--line)}
.leaflet-bar a:hover,.map-btn:hover{background:var(--bg)}
.leaflet-tooltip{background:var(--panel);color:var(--ink);border-color:var(--line)}
.leaflet-tooltip-top:before{border-top-color:var(--panel)}
.leaflet-control-attribution,.leaflet-control-scale-line{background:color-mix(in srgb,var(--panel) 80%,transparent)!important;
  color:var(--muted)!important}
.leaflet-control-attribution a{color:var(--accent)!important}
#theme{min-width:42px}

/* 3D view: replaces the 2D map in the same place. */
#map3d{flex:1;min-width:0;background:var(--map-bg);position:relative}
#map3d[hidden]{display:none!important}
.map-btn.on{background:var(--accent)!important;color:#fff!important}
/* The 3D toolbar (CLOUD-1680): one button group, one style, icons and words. */
.map3d-exit{position:absolute;top:10px;left:10px;z-index:5;display:flex;flex-wrap:wrap;align-items:center;
  max-width:calc(100% - 70px);background:var(--panel);border:1px solid var(--line);border-radius:9px;
  box-shadow:0 1px 6px rgba(0,0,0,.25);overflow:hidden}
.map3d-exit button{display:inline-flex;align-items:center;gap:5px;border:0;border-radius:0;background:transparent;
  color:var(--ink);padding:7px 10px;font-size:12.5px;font-weight:600}
.map3d-exit button + button{border-left:1px solid var(--line)}
.map3d-exit button svg{width:14px;height:14px;flex:0 0 14px}
.map3d-exit button:hover:not(:disabled){background:var(--bg)}
.map3d-exit button.on{background:color-mix(in srgb,var(--accent) 16%,transparent);color:var(--accent)}
.map3d-exit button:disabled{opacity:.45;cursor:not-allowed}
.map3d-exit .tool-sep{width:1px;align-self:stretch;background:var(--line)}
/* Compass and tilt, by the coordinates and the scale bar. */
.view-ctrl{display:flex;align-items:center;gap:8px;background:var(--panel);border:1px solid var(--line);
  border-radius:8px;padding:3px 8px 3px 3px;box-shadow:0 1px 4px rgba(0,0,0,.2)}
.view-ctrl .compass{background:none;border:0;padding:2px;border-radius:50%;line-height:0}
.view-ctrl .compass svg{transition:transform .15s}
.view-ctrl .compass .n{fill:var(--sev-critical)}
.view-ctrl .compass .s{fill:var(--muted)}
.view-ctrl .tilt{display:flex;align-items:center;gap:6px;margin:0;font-size:11.5px;color:var(--muted)}
.view-ctrl .tilt input{width:90px;margin:0}
.ml-label.live{pointer-events:auto;cursor:pointer}
.ml-label.live:hover{border-color:var(--accent)}
/* Hover cards in 3D: the same card as the 2D tooltip, never in the pointer's way. */
.maplibregl-popup.card-pop{pointer-events:none;z-index:3}
.card-pop .maplibregl-popup-content{padding:0;border-radius:10px;border:1px solid var(--line);
  box-shadow:0 4px 16px rgba(0,0,0,.22);background:var(--panel)}
.card-pop.maplibregl-popup-anchor-bottom .maplibregl-popup-tip{border-top-color:var(--panel)}
.card-pop.maplibregl-popup-anchor-top .maplibregl-popup-tip{border-bottom-color:var(--panel)}
.ml-label{padding:1px 6px;border-radius:4px;white-space:nowrap;pointer-events:none;
  background:color-mix(in srgb,var(--panel) 88%,transparent);color:var(--ink);
  border:1px solid var(--line);font:700 11px ui-monospace,Menlo,Consolas,monospace;transform:translateY(-14px)}
.maplibregl-ctrl-group{background:var(--panel)!important}
.maplibregl-ctrl-group button span{filter:var(--icon-filter,none)}
:root[data-theme="dark"]{--icon-filter:invert(1)}
@media (prefers-color-scheme:dark){:root:not([data-theme="light"]){--icon-filter:invert(1)}}

/* Ruler. */
main{position:relative}
.measure-box{position:absolute;z-index:800;bottom:28px;left:50%;transform:translateX(-50%);
  display:flex;align-items:center;gap:10px;padding:8px 10px 8px 14px;border-radius:10px;
  background:var(--panel);border:1px solid var(--line);box-shadow:0 2px 10px rgba(0,0,0,.25)}
.measure-box[hidden]{display:none!important}
.measure-box b{font-size:16px;font-variant-numeric:tabular-nums}
.measure-box span{color:var(--muted);font-size:12px}
.measure-box button{padding:6px 11px}
.measure-label{background:var(--panel);color:var(--ink);border:1px solid var(--line);border-radius:4px;
  padding:1px 5px;font:700 11px ui-monospace,Menlo,Consolas,monospace;white-space:nowrap;
  box-shadow:0 1px 3px rgba(0,0,0,.25)}
.leaflet-container.measuring{cursor:crosshair}

/* Draw tools. */
#draw-color{width:44px;flex:0 0 44px;padding:2px;height:34px}
#draw-name{flex:1;width:auto;text-align:left}
.tool-row input#draw-name{width:auto}
.shape-popup label{margin:0 0 6px;font-size:11px}
.shape-popup input{margin-top:2px}
.shape-popup .row{display:flex;gap:6px;margin-top:6px}
.shape-popup button{flex:1;padding:6px 8px}
.leaflet-popup-content-wrapper,.leaflet-popup-tip{background:var(--panel);color:var(--ink)}

/* Brand: the Hummingdrone bird beside the name. The navy bird on light
   backgrounds, the white one on dark -- swapped with the theme. */
h1.brand{display:flex;align-items:center;gap:9px;font-size:17px;letter-spacing:.01em}
.logo{height:24px;width:auto;display:block;flex:0 0 auto}
.logo-on-dark{display:none}
:root[data-theme="dark"] .logo-on-light{display:none}
:root[data-theme="dark"] .logo-on-dark{display:block}
@media (prefers-color-scheme:dark){
  :root:not([data-theme="light"]) .logo-on-light{display:none}
  :root:not([data-theme="light"]) .logo-on-dark{display:block}}
h1.brand .beta{font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.06em;
  color:var(--accent);border:1px solid var(--accent);border-radius:999px;padding:1px 6px;
  margin-left:6px;vertical-align:middle}
.signin-logo{height:44px;margin:0 auto 12px}

/* Cursor coordinates, bottom left of the 2D and 3D maps. */
.coords-readout{padding:2px 6px;border-radius:4px;border:1px solid var(--line);
  background:color-mix(in srgb,var(--panel) 85%,transparent);color:var(--ink);
  font:600 11px ui-monospace,Menlo,Consolas,monospace;font-variant-numeric:tabular-nums;
  min-width:16ch;text-align:center;pointer-events:none;user-select:none}
.coords-readout.idle{opacity:.55}
/* Off unless the coordinate tool is on (CLOUD-2179). */
.leaflet-container:not(.coords-on) .coords-readout,.leaflet-container:not(.coords-on) .pick-chip,
#map3d:not(.coords-on) .coords-readout,#map3d:not(.coords-on) .pick-chip{display:none}
.maplibregl-ctrl-bottom-left .coords-readout{margin-bottom:2px}

/* The Points list: what each annotation is, its measurement, where it is. */
.item .body{flex:1;min-width:0}
.item .nm{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.item .meta{display:flex;gap:6px;font-size:11.5px;color:var(--muted);margin-top:1px}
.item .meta .kind{font-weight:650;color:var(--ink)}
.item .meta span+span::before{content:"\00b7";margin-right:6px;color:var(--muted)}
.item .co{margin-top:1px}

/* Copy buttons: beside coordinates in the list, popups, editor and pick chip. */
button.copy{flex:0 0 auto;display:inline-flex;align-items:center;justify-content:center;
  width:26px;height:26px;padding:0;border-radius:6px;border:1px solid transparent;
  background:transparent;color:var(--muted);cursor:pointer}
button.copy:hover{color:var(--ink);background:var(--bg);border-color:var(--line)}
button.copy:focus-visible{outline:2px solid var(--accent);outline-offset:1px}
button.copy.done{color:#1a9e4b}
button.copy.failed{color:var(--danger)}
button.copy.done svg rect,button.copy.done svg path{stroke:#1a9e4b}
.item button.copy{opacity:.55}
.item:hover button.copy,.item.sel button.copy,.item button.copy:focus-visible{opacity:1}
.coords-row{align-items:flex-end}
.coords-row button.copy{margin-bottom:6px}
.coords-row button.copy[hidden]{display:none}

/* The line or area popup. */
.shape-popup .facts{display:flex;gap:6px;align-items:baseline;margin:0 0 8px;font-size:13px}
.shape-popup .facts span{color:var(--muted);font-variant-numeric:tabular-nums}
.shape-popup .facts span::before{content:"\00b7";margin-right:6px}
.shape-popup .centre{border-top:1px solid var(--line);padding-top:6px;margin-top:2px}
.shape-popup .centre-head{display:flex;align-items:center;justify-content:space-between;
  font-size:11px;font-weight:650;color:var(--ink);margin-bottom:2px}
.shape-popup .centre input{width:100%;font-variant-numeric:tabular-nums}

/* The point picked by clicking the map, above the cursor readout. */
.pick-chip{display:flex;align-items:center;gap:4px;padding:2px 2px 2px 8px;border-radius:6px;
  border:1px solid var(--line);background:var(--panel);color:var(--ink);
  box-shadow:0 1px 4px rgba(0,0,0,.18);font:600 11px ui-monospace,Menlo,Consolas,monospace;
  font-variant-numeric:tabular-nums}
.pick-chip[hidden]{display:none}
.pick-chip .pin{color:var(--accent);font-size:12px}
.pick-chip button.copy{width:22px;height:22px}
.pick-chip .clear{width:22px;height:22px;padding:0;border:0;background:transparent;
  color:var(--muted);font-size:16px;line-height:1;cursor:pointer;border-radius:6px}
.pick-chip .clear:hover{color:var(--ink);background:var(--bg)}
.maplibregl-ctrl-bottom-left .pick-chip{margin-bottom:4px}
.pick-marker-3d{width:12px;height:12px;border-radius:50%;background:#111;border:2px solid #fff;
  box-shadow:0 0 0 1px rgba(0,0,0,.4)}

/* Labels on the map: line lengths and circle radii. Never take a click. */
.map-label{background:none;border:0}
.map-label>*,.map-label{pointer-events:none}
.leaflet-marker-icon.map-label{width:auto!important;height:auto!important;
  transform-origin:0 0;white-space:nowrap}
.map-label{font:650 11px system-ui,sans-serif;font-variant-numeric:tabular-nums;color:var(--ink);
  padding:1px 5px;border-radius:4px;margin:0!important;translate:-50% -50%;
  background:color-mix(in srgb,var(--panel) 88%,transparent);border:1px solid var(--line)}
/* Line lengths from street level; circle radii only up close. */
.length-label{display:none}
.zoom-mid .length-label{display:block}
.radius-label{display:none;font-size:10px;padding:0 4px;translate:-50% 3px}
.zoom-near .radius-label{display:block}
.radius-hover{display:block;box-shadow:0 1px 3px rgba(0,0,0,.25)}
.ml-label.length{transform:none;font-weight:650}
/* Hover cards for drones and controllers. */
.leaflet-tooltip.card-tip{padding:0;border-radius:10px;border:1px solid var(--line);
  box-shadow:0 4px 16px rgba(0,0,0,.22);background:var(--panel);white-space:normal}
.hover-card{min-width:210px;max-width:260px;padding:9px 11px 8px;color:var(--ink);font-size:12px}
.hc-head{display:flex;align-items:center;gap:7px}
.hc-head b{font-size:13px;flex:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.hc-dot{width:10px;height:10px;border-radius:50%;flex:0 0 10px;box-shadow:0 0 0 2px var(--panel),0 0 0 3px var(--line)}
.hc-dot.small{display:inline-block;width:8px;height:8px;flex-basis:8px;margin-right:4px;box-shadow:none;vertical-align:0}
.hc-status{font-size:10.5px;font-weight:700;padding:1px 7px;border-radius:999px;white-space:nowrap}
.hc-status.on{background:color-mix(in srgb,#1a9e4b 16%,transparent);color:#1a9e4b}
.hc-status.idle{background:color-mix(in srgb,var(--accent) 14%,transparent);color:var(--accent)}
.hc-status.off{background:color-mix(in srgb,var(--oc-lost) 18%,transparent);color:var(--oc-lost)}
.hc-sub{color:var(--muted);font:11px ui-monospace,Menlo,Consolas,monospace;margin:2px 0 7px;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.hc-tiles{display:grid;grid-template-columns:repeat(2,1fr);gap:4px;margin-bottom:6px}
.hc-tiles div{background:var(--bg);border:1px solid var(--line);border-radius:6px;padding:3px 7px}
.hc-tiles>div>span{display:block;font-size:10px;color:var(--muted)}
.hc-tiles b{font-size:12.5px;font-variant-numeric:tabular-nums;white-space:nowrap}
.hc-rows{border-top:1px solid var(--line);padding-top:5px;display:grid;gap:2px;font-size:11.5px}
.hc-key{color:var(--muted);margin-right:3px}
.hc-muted{color:var(--muted)}

/* Following: a button on each drone, controller and device card, and a pill
   on the map saying what is followed. */
.card-actions{display:flex;justify-content:flex-end;margin-top:6px}
.follow-btn{display:inline-flex;align-items:center;gap:5px;padding:3px 9px;border-radius:999px;
  border:1px solid var(--line);background:var(--panel);color:var(--muted);
  font-size:11.5px;font-weight:600;cursor:pointer}
.follow-btn:hover{color:var(--ink);border-color:var(--accent)}
.follow-btn.on{background:var(--accent);border-color:var(--accent);color:#fff}
.follow-btn:focus-visible{outline:2px solid var(--accent);outline-offset:1px}
/* "Zoom to" beside Follow (CLOUD-1987): the Layers panel's ⌖, a 44 px touch target whose glyph
   sits in the card's corner like Follow; greyed when the item has no position. */
.card-actions{align-items:center;gap:4px}
.zoom-to{display:inline-flex;align-items:center;justify-content:center;min-width:44px;min-height:44px;margin:-10px -6px -10px 0;
  padding:0;border:0;border-radius:8px;background:none;color:var(--muted);font-size:17px;line-height:1;cursor:pointer}
.zoom-to:hover{color:var(--accent)}
.zoom-to:focus-visible{outline:2px solid var(--accent);outline-offset:-4px}
.zoom-to.off{opacity:.4;cursor:not-allowed}
.zoom-to.off:hover{color:var(--muted)}
.follow-pill{position:absolute;z-index:850;top:12px;left:50%;transform:translateX(-50%);
  display:flex;align-items:center;gap:8px;padding:5px 6px 5px 12px;border-radius:999px;
  background:var(--accent);color:#fff;font-size:12.5px;font-weight:600;
  box-shadow:0 2px 10px rgba(0,0,0,.25)}
.follow-pill[hidden]{display:none}
.follow-pill small{font-weight:500;opacity:.85}
.follow-pill button{padding:3px 10px;border-radius:999px;border:0;font-size:12px;font-weight:650;
  background:rgba(255,255,255,.2);color:#fff;cursor:pointer}
.follow-pill button:hover{background:rgba(255,255,255,.32)}

/* Battery and signal indicators (fleet list, details, hover cards). */
.gauge{display:inline-flex;align-items:center;gap:5px;font-size:11.5px;font-weight:650;
  font-variant-numeric:tabular-nums;color:var(--ink);white-space:nowrap}
.gauge .battery{position:relative;width:22px;height:11px;border:1.5px solid currentColor;
  border-radius:3px;padding:1px;box-sizing:border-box;opacity:.9}
.gauge .battery::after{content:"";position:absolute;right:-4px;top:2.5px;width:2px;height:4px;
  border-radius:0 1px 1px 0;background:currentColor}
.gauge .battery i{display:block;height:100%;border-radius:1px;background:currentColor}
.gauge .bars{display:inline-flex;align-items:flex-end;gap:1.5px;height:11px}
.gauge .bars i{display:block;width:3px;border-radius:1px;background:currentColor;opacity:.22}
.gauge .bars i.on{opacity:1}
.gauge.good{color:#1a9e4b}
.gauge.warn{color:#c47f00}
.gauge.bad{color:var(--danger)}
.card-actions{align-items:center;gap:8px}
.card-actions .vitals{display:flex;gap:12px;margin-right:auto}
.card.stale .gauge{color:var(--muted)}
#detail-grid dd .gauge{justify-content:flex-end;font-size:13px}
.hc-tiles b .gauge{font-size:12.5px}

/* Alarm Center (CLOUD-1566). */
.tab-count{display:inline-block;min-width:16px;margin-left:5px;padding:0 5px;border-radius:999px;
  font-size:10.5px;font-weight:700;line-height:16px;background:var(--sev-warning);color:#fff}
.tab-count.critical{background:var(--sev-critical)}
.badge.alarm-critical{background:var(--sev-critical);color:#fff}
.badge.alarm-warning{background:var(--sev-warning);color:#fff}
.badge.alarm-info{background:color-mix(in srgb,var(--accent) 16%,transparent);color:var(--accent)}
.alarm-card{border-left:4px solid var(--line);cursor:default}
.alarm-card.alarm-critical{border-left-color:var(--sev-critical)}
.alarm-card.alarm-warning{border-left-color:var(--sev-warning)}
.alarm-card.ended{opacity:.75}
.alarm-card .card-actions{display:flex;gap:6px;flex-wrap:wrap;margin-top:5px}
.alarm-card .card-actions button{padding:3px 9px;font-size:12px}
.alarm-ack{font-size:11.5px;color:var(--muted)}
.alarm-filter{display:grid;grid-template-columns:1fr 1fr;gap:6px 8px;margin-bottom:8px;font-size:12px}
.alarm-filter label{display:flex;flex-direction:column;gap:2px;color:var(--muted)}
.alarm-filter input,.alarm-filter select{min-width:0;width:100%}
.alarm-filter button{grid-column:1 / -1}
.alarm-card .ac-grid{display:grid;grid-template-columns:auto 1fr;gap:1px 10px;margin:6px 0 0;font-size:12px}
.alarm-card .ac-grid dt{color:var(--muted)}
.alarm-card .ac-grid dd{margin:0;min-width:0;overflow:hidden;text-overflow:ellipsis}
.alarm-card .ac-grid small{color:var(--muted)}
.alarm-card.acked{opacity:.8}
.ac-state{margin-left:auto;font-size:10.5px;font-weight:700;text-transform:uppercase;letter-spacing:.04em;color:var(--muted)}
.ac-state.new{color:var(--sev-critical)}
.ac-state.acked{color:#1a9e4b}

/* The bell, top right, and the Alarm Center it opens over the map. */
.alarm-bell{display:inline-flex;align-items:center;justify-content:center;position:relative}
.alarm-bell svg{flex:0 0 auto;display:block}
/* The count sits on the bell's corner. */
.alarm-bell .tab-count{position:absolute;top:-6px;right:-7px;margin:0;box-shadow:0 0 0 2px var(--panel)}
.alarm-bell.warning{border-color:var(--sev-warning);color:var(--sev-warning)}
.alarm-bell.critical{border-color:var(--sev-critical);color:var(--sev-critical);animation:bell-pulse 1.2s ease-in-out infinite}
.alarm-bell.off{opacity:.55}
.ac-off{padding:4px 14px 14px;font-size:12.5px}
.ac-off b{display:block;font-size:13.5px;margin-bottom:4px}
.ac-off p{margin:0 0 6px;color:var(--muted)}
.ac-off .ac-off-reason{font-family:ui-monospace,Menlo,monospace;font-size:11.5px;color:var(--ink);
  background:var(--bg);border-radius:6px;padding:6px 8px;word-break:break-word}
.alarm-bell[aria-expanded="true"]{background:color-mix(in srgb,var(--accent) 12%,transparent)}
@keyframes bell-pulse{0%,100%{box-shadow:0 0 0 0 color-mix(in srgb,var(--sev-critical) 55%,transparent)}
  50%{box-shadow:0 0 0 5px color-mix(in srgb,var(--sev-critical) 0%,transparent)}}
@media (prefers-reduced-motion:reduce){.alarm-bell.critical{animation:none}}
.alarm-center{position:absolute;z-index:1100;top:10px;right:10px;width:min(440px,calc(100% - 20px));
  max-height:calc(100% - 20px);display:flex;flex-direction:column;background:var(--panel);color:var(--ink);
  border:1px solid var(--line);border-radius:12px;box-shadow:0 10px 32px rgba(0,0,0,.28);overflow:hidden}
.ac-head{display:flex;align-items:center;gap:8px;padding:10px 10px 6px 14px}
.ac-head h2{font-size:15px;margin:0 auto 0 0}
.ac-head button{padding:5px 10px;font-size:12px}
.ac-head button.icon{font-size:18px;padding:2px 9px}
.ac-summary{display:grid;grid-template-columns:repeat(4,1fr);gap:6px;padding:4px 14px 10px}
.ac-stat{border:1px solid var(--line);border-radius:8px;padding:5px 6px;text-align:center;line-height:1.15;
  background:transparent;color:var(--ink);font-weight:400;cursor:pointer}
.ac-stat:hover{background:color-mix(in srgb,var(--accent) 8%,transparent)}
.ac-stat span{display:block;font-size:18px;font-weight:700}
.ac-stat small{font-size:10.5px;color:var(--muted)}
.ac-stat.critical span{color:var(--sev-critical)}
.ac-stat.warning span{color:var(--sev-warning)}
.ac-stat.open{border-color:color-mix(in srgb,var(--sev-critical) 45%,var(--line))}
.ac-tabs{display:flex;gap:2px;padding:0 10px;border-bottom:1px solid var(--line);overflow-x:auto;scrollbar-width:thin}
.ac-tabs button{flex:0 0 auto;white-space:nowrap}
.ac-tabs button{background:transparent;color:var(--muted);border-radius:0;padding:7px 10px;
  border-bottom:2px solid transparent;font-size:12.5px}
.ac-tabs button.active{color:var(--ink);border-bottom-color:var(--accent)}
.ac-body{overflow:auto;padding:10px 14px 14px;min-height:120px}
.ac-toolbar{display:flex;justify-content:space-between;align-items:center;gap:8px;margin-bottom:8px;
  font-size:12px;color:var(--muted)}
.ac-toolbar label{display:flex;align-items:center;gap:5px;white-space:nowrap}
.ac-toolbar select{width:auto;min-width:0}
.ac-empty{text-align:center;padding:22px 0}
.ac-empty b{display:block;color:#1a9e4b;font-size:14px}
@media(max-width:760px){.alarm-center{top:6px;right:6px;width:calc(100% - 12px);max-height:calc(100% - 12px)}
  .ac-summary{grid-template-columns:repeat(2,1fr)}}
@keyframes alarm-ring{from{opacity:1}to{opacity:.35}}
@media (prefers-reduced-motion:reduce){.drone-marker.alarm-critical .ring-bg{animation:none}}
/* Banners over the top of the map: the alarm system's own state, then alarms. */
.banners{position:absolute;z-index:900;top:10px;left:50%;transform:translateX(-50%);
  display:flex;flex-direction:column;align-items:center;gap:6px;max-width:calc(100% - 32px);pointer-events:none}
.banners>*{pointer-events:auto;max-width:100%}
.system-banner{display:flex;align-items:center;gap:10px;padding:8px 10px 8px 12px;border-radius:10px;
  background:#3a3f47;color:#fff;box-shadow:0 4px 16px rgba(0,0,0,.3);font-size:13px}
.system-banner .alarm-icon{flex:0 0 22px;width:22px;height:22px;border-radius:50%;background:#f0b429;
  color:#3a3f47;font-weight:800;text-align:center;line-height:22px}
.system-banner .alarm-text{min-width:0}
.system-banner small{display:block;opacity:.8}
.system-banner button{background:transparent;color:#fff;border:1px solid rgba(255,255,255,.6);padding:5px 10px}
.sys-dot{display:inline-block;width:7px;height:7px;border-radius:50%;margin-left:5px;vertical-align:middle;background:#1a9e4b}
.sys-dot.bad{background:var(--sev-critical)}
.sys-part{display:flex;gap:10px;align-items:flex-start}
.sys-part .sys-dot{margin:6px 0 0;flex:0 0 9px;width:9px;height:9px}
.sys-part small{color:var(--muted);display:block}
.sys-part code{display:block;margin-top:4px;white-space:normal}
.ac-note{font-size:12px;color:var(--muted);margin:0 0 8px}
.alarm-bell.degraded{border-style:dashed;border-color:#f0b429}
.alarm-banner{
  display:flex;align-items:center;gap:10px;max-width:calc(100% - 32px);padding:8px 10px 8px 12px;
  border-radius:10px;background:var(--sev-critical);color:#fff;box-shadow:0 4px 16px rgba(0,0,0,.3);font-size:13px}
.alarm-banner .alarm-icon{flex:0 0 22px;width:22px;height:22px;border-radius:50%;background:#fff;
  color:var(--sev-critical);font-weight:800;text-align:center;line-height:22px}
.alarm-banner .alarm-text{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.alarm-banner button{background:#fff;color:var(--sev-critical);padding:5px 10px}
.alarm-banner button.ghost{background:transparent;color:#fff;border-color:rgba(255,255,255,.6)}

/* Incident notifications (CLOUD-1617): newest on top, bottom right of the map. */
.toasts{position:absolute;z-index:900;right:12px;bottom:28px;display:flex;flex-direction:column;
  gap:6px;width:min(320px,calc(100% - 24px));pointer-events:none}
.toast{pointer-events:auto;display:flex;align-items:center;gap:8px;padding:8px 8px 8px 12px;
  border-radius:10px;background:var(--panel);color:var(--ink);border:1px solid var(--line);
  border-left:4px solid var(--accent);box-shadow:0 4px 16px rgba(0,0,0,.22);font-size:12.5px}
.toast.alarm-critical{border-left-color:var(--sev-critical)}
.toast.alarm-warning{border-left-color:var(--sev-warning)}
.toast-text{flex:1;min-width:0;display:flex;flex-direction:column}
.toast-text small{color:var(--muted)}
.toast button{padding:4px 9px;font-size:12px}
.toast .toast-close{border:0;font-size:16px;line-height:1;padding:2px 6px}

/* Trail window (CLOUD-1619). */
.trail-window{display:flex;align-items:center;justify-content:space-between;gap:8px;
  margin:2px 0 8px;font-size:12.5px;color:var(--muted)}
.trail-window select{min-width:0}

/* History and replay (CLOUD-1563). */
.flight-card .meta{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.replay-bar{position:absolute;z-index:900;right:16px;bottom:58px;box-sizing:border-box;
  display:flex;flex-direction:column;gap:4px;left:16px;max-width:720px;margin-left:auto;
  padding:8px 10px 6px;border-radius:12px;background:var(--panel);border:1px solid var(--line);
  box-shadow:0 4px 18px rgba(0,0,0,.25)}
.replay-head,.replay-row{display:flex;align-items:center;gap:8px;min-width:0}
.replay-when{flex:1 1 auto;min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font-size:12.5px;color:var(--muted)}
.replay-when b{color:var(--ink);font:650 14px ui-monospace,Menlo,Consolas,monospace;font-variant-numeric:tabular-nums}
.replay-elapsed{flex:0 0 auto;font:600 12px ui-monospace,Menlo,Consolas,monospace;font-variant-numeric:tabular-nums;color:var(--muted)}
.replay-bar #replay-play{flex:0 0 36px;height:32px;padding:0}
/* Inset by the slider thumb's radius, so a tick sits where the thumb would. */
.replay-scale{position:relative;height:14px;margin:1px 8px 0;border-top:1px solid var(--line)}
.replay-scale span{position:absolute;top:0;transform:translateX(-50%);padding-top:3px;
  font:500 10px ui-monospace,Menlo,Consolas,monospace;color:var(--muted);white-space:nowrap}
.replay-scale span::before{content:"";position:absolute;left:50%;top:-1px;width:1px;height:4px;background:var(--muted)}
.replay-scale span[style*="translateX(-100%)"]::before{left:100%}
.replay-scale span[style*="transform:none"]::before{left:0}
.replay-bar select{flex:0 0 auto;width:auto}
.replay-track{position:relative;flex:1 1 auto;min-width:120px;padding-top:12px}
.replay-track input{width:100%;margin:0}
.replay-marks{position:absolute;left:8px;right:8px;top:0;height:10px}
.replay-mark{position:absolute;top:0;width:3px;min-width:3px;height:10px;margin-left:-1px;
  border-radius:2px;background:var(--accent);cursor:pointer}
.replay-time{flex:0 0 auto;font:600 12.5px ui-monospace,Menlo,Consolas,monospace;font-variant-numeric:tabular-nums}
.replay-state{cursor:default}
.replay-state .card-top button{margin-left:auto;padding:2px 8px;font-size:11.5px}
.replay-grid{display:grid;grid-template-columns:auto 1fr auto 1fr;gap:2px 8px;margin:6px 0 0;font-size:12px}
.replay-grid dt{color:var(--muted)}
.replay-grid dd{margin:0;font-weight:600;font-variant-numeric:tabular-nums}
/* The chart dock (CLOUD-1683): in the replay bar, on the slider's time axis --
   indented past the play button (36 px + 8 px gap) and inset by the thumb's radius. */
.replay-bar.with-charts{max-width:none}
.dock-charts{display:flex;flex-direction:column;gap:2px;max-height:45vh;overflow-y:auto;--chart-h:44px}
.dock-charts:empty{display:none}
.dock-chart{position:relative;margin-left:52px;margin-right:8px}
.dock-label{display:flex;align-items:baseline;gap:6px;font-size:11px;color:var(--muted);line-height:1.3;
  margin-left:-44px}
.dock-label b{color:var(--ink);font-weight:650;font-variant-numeric:tabular-nums}
.dock-label small{margin-left:auto}
.dock-chart svg{display:block;width:100%;height:var(--chart-h);background:var(--bg);border-radius:4px;cursor:crosshair}
.dock-chart .nodata{position:absolute;bottom:0;height:var(--chart-h);display:flex;align-items:center;
  justify-content:center;overflow:hidden;pointer-events:none;font-size:10.5px;color:var(--muted);
  background:repeating-linear-gradient(45deg,color-mix(in srgb,var(--muted) 18%,transparent) 0 4px,transparent 4px 8px)}
.dock-grip{height:8px;margin:-6px 0 0;cursor:ns-resize;display:flex;justify-content:center}
.dock-grip::before{content:"";width:40px;height:4px;margin-top:2px;border-radius:2px;background:var(--line)}
.dock-menu{position:relative}
.dock-menu > button{padding:4px 10px;font-size:12px}
.dock-menu-list{position:absolute;bottom:calc(100% + 6px);right:0;z-index:5;min-width:230px;padding:6px 8px;
  background:var(--panel);border:1px solid var(--line);border-radius:8px;box-shadow:0 4px 18px rgba(0,0,0,.25)}
.dock-menu-list label{display:flex;align-items:center;gap:6px;padding:3px 0;font-size:12.5px;white-space:nowrap}
.chart-tip{position:absolute;z-index:6;pointer-events:none;padding:2px 6px;border-radius:4px;white-space:nowrap;
  background:var(--ink);color:var(--panel);font:600 11px ui-monospace,Menlo,Consolas,monospace;transform:translate(-50%,-110%)}
.chart-hover{stroke:var(--muted);stroke-width:1;stroke-dasharray:3 3;vector-effect:non-scaling-stroke}
.chart-line{fill:none;stroke-width:1.6;vector-effect:non-scaling-stroke}
.chart-cursor{stroke:var(--ink);stroke-width:1;opacity:.6;vector-effect:non-scaling-stroke}
/* Over the map, never over the side panel beside it (CLOUD-1682). */
#side:not([hidden]) ~ .replay-bar{left:calc(var(--side-w) + 16px)}
@media(max-width:760px){.replay-bar{bottom:8px}#side:not([hidden]) ~ .replay-bar{left:16px}}
#replay-back{margin:4px 0 6px;padding:4px 10px;font-size:12px}
/* Daily statistics (CLOUD-1623). */
.stats-table{overflow-x:auto}
.stats-table table{width:100%;border-collapse:collapse;font-size:11.5px;font-variant-numeric:tabular-nums}
.stats-table th,.stats-table td{padding:3px 3px;text-align:right;white-space:nowrap}
.stats-table th:first-child{text-align:left;font-weight:600;max-width:110px;overflow:hidden;text-overflow:ellipsis}
.stats-table thead th{color:var(--muted);font-weight:600;font-size:11px;border-bottom:1px solid var(--line)}
.stats-table tr.day th{padding-top:8px;color:var(--muted);font-size:11px;text-transform:uppercase;letter-spacing:.03em}
.stats-table tr.total th,.stats-table tr.total td{font-weight:700;border-top:1px solid var(--line)}
.stats-table tbody.range{border-top:2px solid var(--line)}
.stats-table .dot{display:inline-block;width:8px;height:8px;border-radius:50%;margin-right:5px}
/* Online/offline analysis (CLOUD-1622). */
.timeline{display:block;width:100%;height:auto;cursor:pointer;margin:4px 0 2px}
.timeline .tl-track{fill:var(--bg);stroke:var(--line)}
.timeline .tl-ac{fill:#1a9e4b}
.timeline .tl-good{fill:#1a9e4b}
.timeline .tl-weak{fill:var(--sev-warning)}
.timeline .tl-lost{fill:var(--sev-critical)}
.timeline .tl-none{fill:var(--line)}
.timeline .tl-drop-text{font-size:7px;fill:#fff;text-anchor:middle;font-weight:700}
.tl-legend{display:flex;flex-wrap:wrap;gap:4px 12px;margin-top:2px}
.tl-legend i{display:inline-block;width:10px;height:10px;border-radius:2px;margin-right:4px;vertical-align:-1px}
.tl-legend .tl-good{background:#1a9e4b}.tl-legend .tl-weak{background:var(--sev-warning)}.tl-legend .tl-lost{background:var(--sev-critical)}
.an-stats{display:grid;grid-template-columns:repeat(auto-fit,minmax(110px,1fr));gap:6px 10px;margin:8px 0}
.an-stat{min-width:0;cursor:help}
.an-stat dt{font-size:11px;color:var(--muted)}
.an-stat dd{margin:0;font-size:13px;font-weight:600;overflow-wrap:anywhere}
#an-sn{width:100%;min-width:0;box-sizing:border-box;min-height:36px}
#analysis-filter{display:block}
#analysis-filter label{display:flex;flex-direction:column;gap:2px;min-width:0;width:100%}
.an-who{overflow-wrap:anywhere;margin-top:4px}
.timeline .tl-rc{fill:var(--accent)}
.timeline .tl-drop{fill:var(--sev-critical);opacity:.85}
.timeline .tl-up{fill:var(--ink)}
.timeline .tl-down{fill:var(--muted)}
.timeline .tl-hour{font-size:8px;fill:var(--muted)}
.timeline .tl-label{font-size:9px;font-weight:700;fill:var(--ink);paint-order:stroke;stroke:var(--panel);stroke-width:2px}
.analysis-grid{margin:6px 0}
.drop-list{width:100%;border-collapse:collapse;font-size:11.5px;font-variant-numeric:tabular-nums}
.drop-list th{color:var(--muted);font-weight:600;text-align:left;border-bottom:1px solid var(--line)}
.drop-list td,.drop-list th{padding:2px 3px}
.drop-list tbody tr{cursor:pointer}
.drop-list tbody tr:hover{background:var(--bg)}
/* Pilot performance (CLOUD-1576). */
.perf-pilot{cursor:default;margin-bottom:6px}
.perf-flight{margin-bottom:6px}
.perf-flags{display:flex;flex-wrap:wrap;gap:4px;margin-top:4px}
.perf-flags .badge{white-space:normal}
.perf-h{margin:10px 0 6px;font-size:12px;color:var(--muted)}
.perf-metrics{display:grid;grid-template-columns:repeat(auto-fit,minmax(110px,1fr));gap:6px 10px;margin:6px 0 0}
.perf-metrics div{min-width:0}
.perf-metrics dt{font-size:11px;color:var(--muted)}
.perf-metrics dd{margin:0;font-size:13px;font-weight:600;overflow-wrap:anywhere}
.perf-reasons{list-style:none;margin:8px 0 0;padding:0;display:flex;flex-direction:column;gap:3px;font-size:12.5px}
.perf-reasons li{border-left:3px solid var(--sev-warning);padding-left:6px}
.perf-reasons li.sev-critical{border-left-color:var(--sev-critical)}
.perf-limits-now{margin-top:10px;font-size:12px;color:var(--muted)}
.perf-limits-now ul{margin:3px 0 0;padding-left:16px}
.perf-tag{margin-top:6px}
.perf-note{margin-top:8px}
.perf-limits{margin-top:8px;font-size:12px}
.perf-limits summary{cursor:pointer;color:var(--muted)}
.perf-limit{display:flex;align-items:center;justify-content:space-between;gap:6px;margin:4px 0}
.perf-limit span{display:flex;align-items:center;gap:4px;white-space:nowrap}
.perf-limit input[type=number]{width:70px;padding:3px 6px}
.perf-limit input[type=checkbox]{width:auto}

/* Gaps in a flight's history (CLOUD-1639). */
.replay-mark.mark-gap{background:repeating-linear-gradient(45deg,var(--sev-warning) 0 3px,transparent 3px 6px);height:100%;top:0;opacity:.85}
/* The event lane (CLOUD-1684): an icon per event under the time scale, and
   bands above the slider for what lasted -- link loss, alarms, gaps. */
.replay-mark.mark-link{background:var(--sev-critical);opacity:.45}
.replay-mark.mark-rtk{background:var(--sev-warning);opacity:.45}
.replay-mark.mark-alarm-critical{background:var(--sev-critical);opacity:.3}
.replay-mark.mark-alarm-warning{background:var(--sev-warning);opacity:.3}
.replay-mark.mark-alarm-info{background:var(--sev-info);opacity:.3}
.replay-marks .replay-mark{cursor:pointer}
.replay-lane{position:relative;height:16px;margin:0 8px}
.replay-lane:empty{display:none}
.lane-ev{position:absolute;top:1px;transform:translateX(-50%);font:700 11px/14px -apple-system,Segoe UI,Roboto,sans-serif;
  cursor:pointer;text-shadow:0 0 2px var(--panel),0 0 2px var(--panel)}
.lane-ev:hover{transform:translateX(-50%) scale(1.4)}
.lane-ev.ev-takeoff{color:var(--accent)}
.lane-ev.ev-landing{color:#1a9e4b}
.lane-ev.ev-home_changed,.lane-ev.ev-rolling_home{color:var(--sev-info)}
.replay-mark.mark-rolling{background:color-mix(in srgb,var(--sev-info) 28%,transparent)}
.lane-ev.ev-rc_link_lost,.lane-ev.ev-cloud_link_lost,.lane-ev.ev-signal_drop,.lane-ev.ev-rtk_lost{color:var(--sev-critical)}
.lane-ev.ev-photo{color:var(--ink)}
.lane-ev.ev-app_message{color:var(--sev-warning)}
.lane-ev.ev-offline{color:var(--muted)}
.lane-ev.ev-alarm{font-weight:900}
.path-gap{pointer-events:none}
.badge.info{background:color-mix(in srgb,var(--sev-info) 16%,transparent);color:var(--sev-info)}
.badge.warn{background:color-mix(in srgb,var(--sev-warning) 18%,transparent);color:#b36f00}
.inline-check{grid-column:1 / -1}
.inline-check span{display:flex;align-items:center;gap:5px;color:var(--ink)}
.alarm-filter .inline-check input{width:auto;flex:0 0 auto;margin:0}

/* Fleet roster (CLOUD-1637): devices not on the map, and drones lost in flight. */
.card.roster{cursor:default}
.fleet-register{margin-top:8px;font-size:12.5px}
.fleet-register summary{cursor:pointer;color:var(--muted)}
.fleet-register form{margin-top:8px}
.drone-marker.lost .drone-body::after{content:"";position:absolute;inset:-7px;border-radius:50%;
  border:2px dashed var(--sev-critical)}

/* Alarm rule settings (CLOUD-1626). */
.rules-list{display:flex;flex-direction:column;gap:6px;margin-bottom:8px}
.rule-row{display:grid;grid-template-columns:auto 1fr auto;grid-template-areas:"on name sev" "on thr thr";
  gap:3px 8px;align-items:center;padding:7px 9px;border:1px solid var(--line);border-radius:8px;font-size:12.5px}
.rule-row.off{opacity:.6}
.rule-on{grid-area:on}
.rule-on input{width:18px;height:18px}
.rule-name{grid-area:name;font-weight:600}
.rule-row select{grid-area:sev;min-width:0}
.rule-threshold{grid-area:thr;display:flex;align-items:center;gap:5px;color:var(--muted)}
.rule-threshold input{width:80px}

/* Alarm filters (CLOUD-1627): priority chips, then drone, RC, pilot and type. */
.ac-filters{margin-bottom:10px}
.prio-chips{grid-column:1 / -1;display:flex;gap:6px}
.prio-chips button{flex:1;padding:5px 8px;font-size:12px;border-radius:999px;background:transparent;
  color:var(--muted);border:1px solid var(--line)}
.prio-chips button[aria-pressed="true"][data-prio="critical"]{background:var(--sev-critical);border-color:var(--sev-critical);color:#fff}
.prio-chips button[aria-pressed="true"][data-prio="warning"]{background:var(--sev-warning);border-color:var(--sev-warning);color:#fff}
.prio-chips button[aria-pressed="true"][data-prio="info"]{background:var(--accent);border-color:var(--accent);color:#fff}

/* Wind at the aircraft (CLOUD-1633). */
.wind-arrow{display:inline-block;font-weight:700;margin-right:2px}
#detail-grid small.muted{display:block;color:var(--muted);font-size:11px;font-weight:400}

/* A download that looks like a button (investigation packs, CLOUD-1641). */
a.button{display:inline-block;padding:8px 13px;border-radius:7px;background:var(--accent);color:#fff;
  font-size:13px;font-weight:600;text-decoration:none;cursor:pointer}
a.button.ghost{background:transparent;color:var(--ink);border:1px solid var(--line)}
.alarm-card .card-actions a.button{padding:3px 9px;font-size:12px}
#replay-pack{margin:6px 0}
/* Display names (CLOUD-1686): renamed in place by an admin. */
.detail-head h2{flex:1;min-width:0}
button.small{padding:3px 8px;font-size:11.5px}
.detail-head #detail-rename{margin-right:6px}
.rename-input{width:100%;font:inherit;font-weight:650;padding:2px 6px;border:1px solid var(--accent);
  border-radius:6px;background:var(--panel);color:var(--ink)}
/* The aircraft panel in sections (CLOUD-1685): Flight, Power, Link, Position;
   labels never wrap, values never crowd them. Two columns of sections when
   the panel is wide enough. */
#detail-grid{display:grid;grid-template-columns:1fr;gap:10px;margin:10px 0 0;font-size:13px}
@container (min-width:520px){#detail-grid{grid-template-columns:1fr 1fr}}
.detail-section h4{margin:0 0 4px;font-size:10.5px;letter-spacing:.06em;text-transform:uppercase;color:var(--muted)}
.detail-section dl{display:grid;grid-template-columns:max-content minmax(0,1fr);gap:4px 12px;margin:0}
.detail-section dt{color:var(--muted);white-space:nowrap}
.detail-section dd{margin:0;font-weight:600;font-variant-numeric:tabular-nums;text-align:right;
  min-width:0;overflow-wrap:anywhere}
.detail-section dd.warn{color:#c47f00}
.detail-section dd.bad{color:var(--danger)}
.detail-section dd.good{color:#1a9e4b}
.detail-section dd .gauge{justify-content:flex-end;font-size:13px}
/* The same detail in replay, at the replay's moment (CLOUD-1687). */
.replay-detail .detail-grid{display:grid;grid-template-columns:1fr;gap:10px;margin:8px 0 0;font-size:13px}
@container (min-width:520px){.replay-detail .detail-grid{grid-template-columns:1fr 1fr}}
.replay-detail small.muted{display:block;color:var(--muted);font-size:11px;font-weight:400}
.replay-moment{margin-top:4px;font:650 13px ui-monospace,Menlo,Consolas,monospace;font-variant-numeric:tabular-nums}
.detail-section small.muted{display:block;color:var(--muted);font-size:11px;font-weight:400}
/* About (CLOUD-1685): the facts that used to crowd the header, for admins. */
.about-panel{position:absolute;z-index:1100;top:12px;right:16px;width:min(360px,calc(100% - 32px));
  background:var(--panel);border:1px solid var(--line);border-radius:10px;padding:12px 14px;
  box-shadow:0 8px 24px rgba(0,0,0,.18)}
.about-panel h3{margin:0;font-size:14px}
.about-panel dl{display:grid;grid-template-columns:max-content minmax(0,1fr);gap:4px 12px;margin:10px 0 0;font-size:12.5px}
.about-panel dt{color:var(--muted);white-space:nowrap}
.about-panel dd{margin:0;overflow-wrap:anywhere}
/* The drone icon in 3D (CLOUD-1675): the 2D icon, lifted to its height. */
.drone-3d .drone-svg{transform-origin:22px 22px}
/* 3D: under each drone its shadow on the ground, a drop line in its colour up
   to it with a dark edge, and its height above the ground (CLOUD-1679). */
.drone-3d{width:0;height:0;overflow:visible;cursor:default}
.drone-3d .icon-lift{position:absolute;left:-22px;top:-22px;width:44px;height:44px;cursor:pointer;z-index:2}
.drone-3d .ground-shadow{position:absolute;left:-13px;top:-5px;width:26px;height:10px;border-radius:50%;
  background:radial-gradient(closest-side,rgba(0,0,0,.55),rgba(0,0,0,0));pointer-events:auto}
.drone-3d .drop-line{position:absolute;left:-1.5px;top:0;width:3px;height:0;transform-origin:1.5px 0;
  background:var(--drone);box-shadow:0 0 0 1px var(--oc-outline);border-radius:2px;pointer-events:none}
.drone-3d .drop-label{position:absolute;left:0;top:0;white-space:nowrap;pointer-events:none;
  padding:0 5px;border-radius:4px;background:color-mix(in srgb,var(--panel) 88%,transparent);
  border:1px solid var(--line);font:650 10.5px -apple-system,Segoe UI,Roboto,sans-serif;color:var(--ink)}
.drone-3d.no-drop .drop-line,.drone-3d.no-drop .ground-shadow,.drone-3d.no-drop .drop-label{display:none}

/* Flights with alarms or gaps stand out in the list (CLOUD-1688). */
.flight-card.has-alarms{box-shadow:inset 3px 0 0 var(--sev-critical)}
.flight-card.has-gaps{box-shadow:inset 3px 0 0 var(--sev-warning)}
.flight-flags{display:flex;flex-wrap:wrap;align-items:center;gap:4px 8px;white-space:normal}
.flight-flags .muted{color:var(--muted)}
/* A camera footprint (CLOUD-1671): its dark edge under the drone's colour, like the paths. */
.cam-footprint{filter:drop-shadow(0 0 1px rgba(0,0,0,.6));cursor:pointer}
.cam-view{filter:drop-shadow(0 0 1px rgba(0,0,0,.6))}

/* The Health pill and its panel (CLOUD-1693): the alarm system's own state,
   always in sight at the top right. */
.health-pill{display:inline-flex;align-items:center;gap:6px;padding:5px 10px;border-radius:999px;font-size:12.5px;
  font-weight:650;border:1px solid var(--line);background:var(--panel);color:var(--ink);white-space:nowrap}
.health-pill .sys-dot{margin:0}
.health-pill.bad{background:var(--sev-critical);border-color:var(--sev-critical);color:#fff}
.health-pill.bad .sys-dot{background:#fff}
/* An outbound service down (Energy OS): amber, not the alarm system's red. */
.health-pill.warn{background:var(--sev-warning);border-color:var(--sev-warning);color:#fff}
.health-pill.warn .sys-dot{background:#fff}
.sys-dot.warn{background:var(--sev-warning)}
.sys-dot.idle{background:var(--muted)}
.health-panel .ac-tabs{margin:4px 0 8px}
.int-form{display:grid;gap:8px;max-width:520px}
.int-form label{display:grid;gap:3px;font-size:12.5px}
.int-form h3{display:flex;gap:8px;align-items:center}
.health-panel{position:fixed;top:64px;right:16px;z-index:1200;width:min(380px,calc(100vw - 32px));max-height:calc(100vh - 90px);
  overflow:auto;padding:12px 14px;border-radius:12px;background:var(--panel);border:1px solid var(--line);
  box-shadow:0 8px 28px rgba(0,0,0,.28)}
@media(max-width:760px){.health-pill #health-text{display:none}.health-pill{padding:7px}}

/* History's switch (CLOUD-1694): alarms, or the whole incident log. */
.ac-seg{display:inline-flex;margin:0 0 8px;border:1px solid var(--line);border-radius:8px;overflow:hidden}
.ac-seg button{border:0;border-radius:0;background:transparent;padding:5px 12px;font-size:12.5px;color:var(--muted)}
.ac-seg button + button{border-left:1px solid var(--line)}
.ac-seg button[aria-pressed="true"]{background:var(--accent);color:#fff}
/* Admin settings sit on the left, so they never cover the Alarm Center. */
.admin-settings{right:auto;left:10px}
/* Head, counters and tabs keep their height; only the list scrolls -- also
   when the Alarm Center is short above the replay bar (CLOUD-1694). */
.alarm-center > .ac-head,.alarm-center > .ac-summary,.alarm-center > .ac-tabs,.alarm-center > .ac-filter-note{flex:0 0 auto}
.alarm-center > .ac-body{flex:1 1 auto;min-height:0}
/* Latched alarms (CLOUD-1692): over, but still waiting for someone. */
.ac-state.latched{color:var(--sev-warning);font-weight:650}
/* A critical alarm shown although the filter leaves it out (CLOUD-1992). */
.ac-state.outside{margin-left:6px;color:var(--sev-critical)}
/* The Alarm Center's rows (CLOUD-1994): state and severity at a glance, the detail on a click. */
.alarm-card .ac-row{display:flex;align-items:center;gap:6px;flex-wrap:wrap;cursor:pointer;border-radius:6px}
.alarm-card .ac-row:focus-visible{outline:2px solid var(--accent);outline-offset:2px}
.alarm-card .ac-row .nm{font-weight:650}
.alarm-card .ac-states{display:flex;gap:6px;margin-left:auto;align-items:center}
.alarm-card .ac-states .ac-state{margin-left:0;padding:1px 6px;border-radius:999px;border:1px solid currentColor;line-height:15px}
.ac-state.on{color:var(--sev-critical)}
.ac-state.ended{color:var(--muted)}
.ac-state.todo{color:var(--sev-warning)}
.alarm-card .ac-line{display:flex;justify-content:space-between;gap:8px;margin-top:3px;font-size:12px;color:var(--muted)}
.alarm-card .ac-line .ac-who{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--ink)}
.alarm-card .ac-line .ac-when{flex:0 0 auto;font-variant-numeric:tabular-nums}
/* An unacknowledged critical alarm still on cannot be missed: a tinted row with a strong edge. */
.alarm-card.alarm-critical:not(.acked):not(.ended){border-left-width:6px;
  background:color-mix(in srgb,var(--sev-critical) 9%,var(--panel))}
.alarm-card.alarm-warning:not(.acked):not(.ended){background:color-mix(in srgb,var(--sev-warning) 7%,var(--panel))}
.alarm-card.open{opacity:1}
.alarm-card .ac-detail{margin-top:4px;border-top:1px dashed var(--line);padding-top:2px}
.ac-note-form{display:flex;gap:6px;flex-wrap:wrap;margin-top:6px}
.ac-note-form input{flex:1 1 180px;min-width:0}
.ac-note-form button{padding:3px 9px;font-size:12px}
.ac-conn{margin:0 0 8px;padding:6px 9px;border-radius:6px;font-size:12px;
  background:color-mix(in srgb,var(--sev-warning) 15%,var(--panel));border:1px solid var(--sev-warning)}
.ac-conn b{color:var(--sev-warning)}
.ac-loading{text-align:center;padding:22px 0;color:var(--muted)}
#alarm-bell.lost{opacity:.6}
/* Tablet (CLOUD-1994): fingers, not a mouse. */
@media (pointer:coarse){
  .alarm-card .card-actions button,.ac-note-form button,#ac-ack-all{min-height:40px;padding:6px 14px;font-size:13px}
  .ac-note-form input{min-height:40px}
  .alarm-card .ac-row{min-height:36px}
}
.ac-stat.open.zero{border-color:var(--line)}
.ac-stat.open.zero span{color:var(--muted)}
.ac-filter-note{margin:2px 0 6px;font-size:11.5px;color:var(--sev-warning)}
.ac-filter-on{color:var(--sev-warning);font-weight:650}

/* The alarm filters as one bar (CLOUD-1695): priorities that plainly show on
   or off, the filters in use as chips, the rest folded away. */
.ac-filters{display:flex;flex-direction:column;gap:6px;margin-bottom:8px}
.ac-filterbar{display:flex;align-items:center;gap:8px}
.ac-filterbar .prio-chips{flex:1}
#af-more{padding:4px 10px;font-size:12px;flex:0 0 auto}
#af-more[aria-expanded="true"]{background:var(--bg)}
.prio-chips button[aria-pressed="true"]::before{content:"✓ "}
.prio-chips button[aria-pressed="false"]{text-decoration:line-through;opacity:.6}
.af-chips{display:flex;flex-wrap:wrap;gap:4px}
.af-chips:empty{display:none}
.af-chip{padding:2px 8px;font-size:11.5px;border-radius:999px;background:var(--bg);border:1px solid var(--line);color:var(--ink)}
.af-chip span{color:var(--muted);margin-left:2px}
.af-range{margin:0;grid-column:1 / -1}

/* The camera frustum over the 3D map (CLOUD-1672): under the drone icons, never in the way. */
.frustum-overlay{position:absolute;inset:0;width:100%;height:100%;pointer-events:none;
  filter:drop-shadow(0 0 1px rgba(0,0,0,.45))}

/* Where a photo was taken, in replay (CLOUD-1673). */
.photo-mark{font:700 12px/14px -apple-system,Segoe UI,Roboto,sans-serif;text-align:center;color:var(--ink);
  text-shadow:0 0 2px var(--panel),0 0 2px var(--panel);cursor:pointer}
/* ...and live (CLOUD-1635): a little larger to tap; amber when taken during a telemetry gap. */
.photo-mark.live{font-size:14px;line-height:16px}
.photo-mark.gap{color:#c98a00}
.photo-gap{color:#c98a00}
.photo-why{color:var(--muted)}
/* Every live photo mark (CLOUD-1964): a camera -- a solid dot where it was taken and a translucent fan
   the way it looked -- in the photo's colour: green / red / grey for a verdict (CLOUD-1777, CLOUD-1856),
   amber after a telemetry gap, else the ink colour. Not an arrow, so it is not taken for the path's
   chevrons or a line's direction on a pole. Its view and verdict are in its card, never written on the
   map. Leaflet places the icon (position:absolute): it must not be overridden here -- with
   position:relative each mark sat in the flow below the ones before it, and drifted off its capture
   point (CLOUD-1961). Only the dot takes a tap: the fan lets a click through to a pole under it. */
.photo-cone{color:var(--ink)}
/* Over Leaflet's own .leaflet-marker-icon.leaflet-interactive{pointer-events:auto}. */
.leaflet-marker-icon.photo-cone,.leaflet-marker-icon.photo-cone.leaflet-interactive{pointer-events:none}
.photo-cone .hit{pointer-events:auto;cursor:pointer}
.photo-cone.gap{color:#c98a00}
.photo-cone .arrow{display:block;width:48px;height:48px;filter:drop-shadow(0 0 1px var(--panel))}
.photo-cone .arrow svg{display:block;overflow:visible}
.photo-cone .fan{fill:currentColor;fill-opacity:.32;stroke:currentColor;stroke-width:1.6;stroke-linejoin:round}
.photo-cone circle.hit{fill:currentColor;stroke:var(--panel);stroke-width:2}
/* Zoomed out (below .zoom-near) a photo is a dot, as large as a fingertip can find; a judged
   photo's pole gets a chip. */
.photo-cone .dot{position:absolute;left:18px;top:18px;width:12px;height:12px;border-radius:50%;
  background:currentColor;box-shadow:0 0 0 2px var(--panel)}
.photo-cone .arrow{display:none}
.zoom-near .photo-cone .arrow{display:block}
.zoom-near .photo-cone .dot{display:none}
/* A nadir photo (CLOUD-1973) looked straight down: a ring round the capture point -- nothing like a
   fan, a path chevron or a line's ➤ -- with a small arrow at its middle to the picture's top edge.
   Only the ring takes a tap: the middle, over its pole's centre, lets a click through to the pole.
   Zoomed out, a ring rather than a dot, for the same reason. */
.photo-cone .nadir-ring{fill:none;stroke:currentColor;stroke-width:3.2}
.photo-cone circle.ring-hit{fill:none;stroke:transparent;stroke-width:9;pointer-events:stroke}
.photo-cone .nadir-arrow{fill:currentColor;stroke:var(--panel);stroke-width:1;stroke-linejoin:round;pointer-events:none}
.photo-cone .dot.ring{background:none;box-shadow:none;pointer-events:none}
.photo-cone .dot.ring svg{display:block;overflow:visible}
.photo-cone circle.far-ring{stroke:currentColor;stroke-width:3;stroke-opacity:1}
/* A photo whose direction the telemetry did not carry: the dot in a dashed ring, no fan. */
.photo-cone .unknown-ring{fill:none;stroke:currentColor;stroke-width:1.6;stroke-dasharray:3 3;pointer-events:none}
/* A pip per view of the standard, in its order; the names are in the chip's card. */
.pole-chip{display:none;white-space:nowrap;padding:2px 3px;border-radius:6px;background:var(--panel);
  border:1px solid var(--line,#c8ced8);line-height:0;cursor:pointer;box-shadow:0 1px 2px rgba(0,0,0,.25)}
.zoom-mid .pole-chip{display:block}
.zoom-near .pole-chip{display:none}
.pole-chip i{display:inline-block;width:6px;height:6px;margin:0 1px;border-radius:50%;background:currentColor}
.pole-chip i.pass{color:#1a9e4b}.pole-chip i.warn{color:#e8890c}.pole-chip i.unverified{color:#8b93a1}.pole-chip i.fail{color:#dc2626}
.pole-chip i.todo{color:var(--muted);opacity:.45}
.photo-card-tip{padding:8px 10px;width:290px;max-width:calc(100vw - 32px);white-space:normal}
.photo-card b{font-size:13px}
.photo-card .meta{color:var(--muted);font-size:11.5px;margin-top:2px}
.photo-card .verdict{margin:6px 0 4px;font-weight:600;font-size:12.5px}
.photo-card .verdict.pass,.photo-card .verdict.spare{color:#1a9e4b}
.photo-card .verdict.fail{color:#dc2626}
.photo-card .verdict.warn{color:#d97706}
.photo-card .verdict.unverified,.photo-card .verdict.other{color:var(--muted)}
.photo-card ul{list-style:none;margin:0;padding:0;font-size:12px;line-height:1.5}
.photo-card li.pass{color:#1a9e4b}.photo-card li.warn{color:#d97706}.photo-card li.fail{color:#dc2626}.photo-card li.open{color:var(--muted)}
/* Live or replay (CLOUD-1691): one switch, and a replay that cannot be
   mistaken for live -- a banner with the moment and an amber edge. */
.mode-switch{display:inline-flex;border:1px solid var(--line);border-radius:999px;overflow:hidden}
.mode-switch button{border:0;border-radius:0;background:transparent;padding:5px 12px;font-size:12.5px;font-weight:650;color:var(--muted)}
.mode-switch button[aria-pressed="true"]#mode-live{background:#1a9e4b;color:#fff}
.mode-switch button[aria-pressed="true"]#mode-replay{background:var(--sev-warning);color:#fff}
.replay-banner{position:absolute;z-index:950;top:10px;left:50%;transform:translateX(-50%);padding:6px 14px;
  border-radius:999px;background:var(--sev-warning);color:#fff;font-size:13px;box-shadow:0 4px 14px rgba(0,0,0,.25);
  white-space:nowrap;pointer-events:none}
.replay-banner .mono{font-family:ui-monospace,Menlo,Consolas,monospace;font-weight:700}
body.replaying #map,body.replaying #map3d{box-shadow:inset 0 0 0 3px var(--sev-warning)}
.replay-tag{color:var(--sev-warning)}
body.replaying .banners{top:52px}

/* The weather at a site (CLOUD-1733): the tier colours are the Weather
   API's own, so the card reads like the Weather Dashboard. */
/* The weather strip and the Weather tab (CLOUD-1739). A tier is a colour, never only a colour:
   the hour's temperature and the summary say the rest. */
:root{--wxt-flight:var(--oc-ok);--wxt-maint:var(--sev-warning);--wxt-nogo:var(--sev-critical)}
.wx-head{display:flex;align-items:center;gap:6px;width:100%;background:none;border:0;padding:0 0 6px;
         font-size:11px;letter-spacing:.06em;text-transform:uppercase;font-weight:700;color:var(--muted);text-align:left;
         min-height:28px;cursor:pointer}
.wx-head:hover{color:var(--ink)}
.wx-chev{display:inline-block;transition:transform .15s}
#weather-box.folded .wx-chev{transform:rotate(-90deg)}
#weather-box.folded #weather-body{display:none}
#weather-box.folded .wx-head{padding-bottom:0;text-transform:none;letter-spacing:0;font-size:12.5px;color:var(--ink)}
.wx-sites{display:flex;flex-direction:column;gap:8px}
.wx-site{border:1px solid var(--line);border-radius:8px;padding:4px 6px 3px;background:var(--bg)}
.wx-l1{display:flex;align-items:center;gap:6px;min-height:22px;font-size:12px;cursor:pointer;white-space:nowrap;overflow:hidden}
.wx-dot{flex:0 0 auto;width:9px;height:9px;border-radius:50%;background:var(--muted)}
.wxt-flight{--wxt:var(--wxt-flight)}.wxt-maint{--wxt:var(--wxt-maint)}.wxt-nogo{--wxt:var(--wxt-nogo)}
.wx-dot.wxt-flight,.wx-dot.wxt-maint,.wx-dot.wxt-nogo{background:var(--wxt)}
.wx-who{font-weight:650}
.wx-job{color:var(--muted);overflow:hidden;text-overflow:ellipsis;min-width:0}
.wx-t1{margin-left:auto;font-weight:650;font-variant-numeric:tabular-nums}
.wx-wind{display:inline-flex;align-items:center;gap:2px;font-variant-numeric:tabular-nums;color:var(--muted)}
.wx-wind svg{width:12px;height:12px}
.wx-l2{display:grid;grid-template-columns:repeat(8,minmax(0,1fr));gap:2px;margin-top:2px}
.wx-col{display:flex;flex-direction:column;align-items:center;gap:1px;background:none;border:0;border-radius:4px;
        padding:1px 0 0;font-size:10.5px;line-height:1.2;color:var(--ink);cursor:pointer;min-height:24px;
        font-variant-numeric:tabular-nums}
.wx-col:hover,.wx-col:focus-visible,.wx-col.pinned{background:color-mix(in srgb,var(--accent) 12%,transparent)}
.wx-col .wx-hr{color:var(--muted)}
.wx-col i{display:block;width:100%;height:3px;border-radius:2px;background:var(--wxt,var(--muted))}
.wx-sum{font-size:11.5px;color:var(--muted);min-height:15px;padding:2px 0 0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.wx-sum b{color:var(--ink);font-weight:650}
.wx-foot{font-size:11px;color:var(--muted);padding:6px 0 0}
.panel-foot.wrap{white-space:normal;overflow:visible}
.wx-site.pending .wx-l1{cursor:default}
.wx-tab{display:flex;flex-direction:column;gap:10px;padding:10px 10px}
.wx-card{border:1px solid var(--line);border-radius:10px;padding:8px 8px;background:var(--bg)}
.wx-card h4{margin:0;font-size:13px;display:flex;align-items:center;gap:6px}
.wx-card .wx-sub{font-size:11.5px;color:var(--muted);margin:2px 0 4px}
.wx-table{width:100%;border-collapse:collapse;font-size:11px;font-variant-numeric:tabular-nums}
.wx-table th{color:var(--muted);font-weight:600;text-align:right;border-bottom:1px solid var(--line);padding:2px 2px;white-space:nowrap}
.wx-table td{text-align:right;padding:2px 2px;white-space:nowrap}
.wx-table th:first-child,.wx-table td:first-child{text-align:left}
.wx-table tr.now td{font-weight:650}
.wx-table td .wx-dot{display:inline-block;margin-right:4px;vertical-align:0}
.wx-fail td{text-align:left;padding:0 2px 3px 16px;white-space:normal}
.wx-fail div{color:var(--sev-critical);font-size:11.5px;line-height:1.35}
.wx-fail div::before{content:"\2022 ";}
.wx-empty{color:var(--muted);font-size:12.5px;padding:4px 0}


/* The operational area (CLOUD-1737) */
.area-list{display:flex;flex-direction:column;gap:6px;margin:8px 0}
.area-row{display:flex;align-items:center;gap:6px;padding:6px 8px;border:1px solid var(--line,#d7dce2);
  border-radius:8px;font-size:12px}
.area-row.on{border-color:#e8590c;background:rgba(232,89,12,.08)}
.area-row{flex-wrap:wrap}
.area-row .nm{flex:1 1 100%;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.area-row .nm small{display:block;font-size:11px;color:var(--muted);white-space:normal}
.area-row .nm small.in-use{color:#e8590c;font-weight:600}
.area-row button:disabled{opacity:.5;cursor:not-allowed}
.area-owner{display:grid;gap:3px;margin:6px 0;font-size:12px}
.area-owner select{min-height:34px}
.area-row .badge{font-size:10px;font-weight:700;color:#e8590c;text-transform:uppercase}
.area-row button{padding:3px 7px;font-size:11px}
.area-counts{width:100%;border-collapse:collapse;margin:10px 0;font-size:13px}
.area-counts th,.area-counts td{padding:4px 6px;text-align:right;border-bottom:1px solid var(--line,#d7dce2)}
.area-counts th:first-child,.area-counts td:first-child{text-align:left}
.area-counts td.out{color:var(--danger)}
.area-handle{width:14px;height:14px;border-radius:50%;background:#e8590c;border:2px solid #fff;
  box-shadow:0 0 0 1px rgba(0,0,0,.35);cursor:grab}

/* Pole Discovery (CLOUD-1754): the tab's panel, its wizard, and the badge on
   the drone card that tells the dispatcher. */
.badge.discovery{background:color-mix(in srgb,#e8590c 18%,transparent);color:#e8590c}
.wizard{margin:0 0 10px;padding-left:22px;display:flex;flex-direction:column;gap:10px}
.wizard li{padding-left:4px}
.wizard li b{display:block;margin-bottom:5px}
.wizard li.todo::marker{color:var(--accent);font-weight:700}
.wizard li.done{opacity:.7}
.wizard .tool-row{margin-bottom:6px}
.wizard .tool-row input{width:80px}
.tool-row select.grow{flex:1;min-width:0}
/* The line's direction on each pole in Pole Discovery (CLOUD-1772). */
.pole-arrow{background:none;border:0;display:flex;align-items:center;justify-content:center;pointer-events:none}
.pole-arrow span{display:inline-block;font-size:22px;line-height:1;text-shadow:0 0 2px #fff,0 0 2px #fff}
/* No RTK fix in Pole Discovery (CLOUD-1774): the banner over the map. */
.system-banner.rtk{background:#b3400f}
.system-banner.rtk .alarm-icon{background:#fff;color:#b3400f}
/* A new pole centre (CLOUD-1773): mid-screen, over a map that stays usable. */
.disc-pop{position:absolute;z-index:950;left:50%;top:42%;transform:translate(-50%,-50%);
  min-width:260px;max-width:min(420px,calc(100% - 32px));padding:14px 18px;border-radius:12px;
  background:var(--panel);color:var(--ink);border:1px solid var(--line);border-top:5px solid #1a9e4b;
  box-shadow:0 10px 30px rgba(0,0,0,.35);text-align:center;cursor:pointer;font-size:14px}
.disc-pop.bad{border-top-color:var(--danger)}
.disc-pop b{display:block;font-size:15px;margin-bottom:4px}
.disc-pop .pole{font-size:13px;color:var(--muted);margin-bottom:8px}
.disc-pop .rtk{display:inline-flex;align-items:center;gap:7px;padding:4px 12px;border-radius:999px;
  font-weight:800;font-size:13px;letter-spacing:.02em}
.disc-pop .rtk.good{background:color-mix(in srgb,#1a9e4b 18%,transparent);color:#1a9e4b}
.disc-pop .rtk.bad{background:color-mix(in srgb,var(--danger) 16%,transparent);color:var(--danger)}
.disc-pop .warn{margin-top:8px;font-size:12.5px;color:var(--danger)}
.field-title{display:block;margin:2px 0 5px}
#disc-circle-row .tool-row input{width:80px}
/* The terrain check (CLOUD-1757): one take-off a row, its difference coloured. */
.terrain-list{list-style:none;margin:6px 0 0;padding:0;display:flex;flex-direction:column;gap:6px}
.terrain-list li{display:flex;align-items:center;gap:8px;padding:6px 8px;border:1px solid var(--line);border-radius:8px}
.terrain-list .what{flex:1;min-width:0;font-size:12.5px}
.terrain-list .what small{display:block;color:var(--muted)}
.terrain-list .diff{font-weight:600;font-variant-numeric:tabular-nums;white-space:nowrap}
.terrain-list .diff.good{color:#1a9e4b}.terrain-list .diff.warn{color:#c98a00}
.terrain-list .diff.bad{color:var(--danger)}.terrain-list .diff.muted{color:var(--muted)}
.terrain-list label{display:flex;align-items:center;gap:6px;font-size:12px;white-space:nowrap;min-height:32px}
.terrain-list li.elevated .what{opacity:.6}

/* One flight's RC signal and RTK quality (CLOUD-1706). */
.sig-chart{margin:8px 0}
.sig-label{font-size:12px;font-weight:650;margin-bottom:2px}
.sig-label small{color:var(--muted);font-weight:500;margin-left:6px}
.sig-chart svg{display:block;width:100%;height:60px;background:var(--bg);border:1px solid var(--line);
               border-radius:6px;cursor:crosshair}
.sig-legend{display:flex;flex-wrap:wrap;gap:4px 10px;font-size:11.5px;color:var(--muted);margin:2px 0 6px}
.sig-legend i{display:inline-block;width:10px;height:10px;border-radius:2px;margin-right:4px;vertical-align:-1px;opacity:.7}
#signal-events .drop-list tr[data-seek-signal]{cursor:pointer}
#signal-events .drop-list tr[data-seek-signal]:hover{background:color-mix(in srgb,var(--accent) 10%,transparent)}
#signal-summary{grid-template-columns:max-content minmax(0,1fr)}
#signal-summary dd{text-align:left}

/* History leads with the flights (CLOUD-1785). */
.fb-form{display:flex;flex-direction:column;gap:8px;margin-bottom:6px}
.fb-form input[type=search]{width:100%;box-sizing:border-box;min-height:36px}
.chip{flex:1;min-height:34px;border:1px solid var(--line);border-radius:999px;background:var(--panel);color:var(--ink);
      font-size:12.5px;font-weight:600;padding:0 10px;cursor:pointer}
.chip:hover{background:color-mix(in srgb,var(--ink) 6%,transparent)}
.chip.active{background:color-mix(in srgb,var(--accent) 16%,transparent);border-color:var(--accent);color:var(--accent)}
/* History sub-tabs and the one date control (CLOUD-1700). */
.hist-head{padding:0 0 6px;min-width:0}
.hist-tabs{display:flex;gap:4px;overflow-x:auto;scrollbar-width:thin;padding:2px 0 6px;border-bottom:1px solid var(--line)}
.hist-tab{flex:0 0 auto;min-height:34px;border:0;border-radius:999px;background:transparent;color:var(--muted);
          font-size:12.5px;font-weight:650;padding:0 12px;cursor:pointer;white-space:nowrap}
.hist-tab:hover{background:color-mix(in srgb,var(--ink) 6%,transparent)}
.hist-tab[aria-selected=true]{background:color-mix(in srgb,var(--accent) 16%,transparent);color:var(--accent)}
.hist-date{display:flex;flex-direction:column;gap:8px;padding:8px 0 0;min-width:0}
.hist-presets{display:flex;flex-wrap:wrap;gap:6px}
.hist-presets .chip{flex:1 1 auto;white-space:nowrap}
.hist-fields{display:flex;flex-wrap:wrap;gap:8px}
.hd-time{flex:0 1 84px}
.hd-time input{min-height:34px;box-sizing:border-box;min-width:0}
.hd-time input.invalid{border-color:var(--sev-critical)}
.hd-field{flex:1 1 110px;min-width:0;display:flex;flex-direction:column;font-size:11.5px;color:var(--muted);gap:2px}
.datefield{position:relative;display:flex;min-width:0}
.datefield input[type=text]{flex:1;min-width:0;min-height:34px;box-sizing:border-box;padding-right:34px}
.datefield .cal{position:absolute;right:1px;top:1px;bottom:1px;width:32px;border:0;background:transparent;color:var(--muted);
                cursor:pointer;display:flex;align-items:center;justify-content:center;border-radius:6px}
.datefield .cal:hover{color:var(--ink)}
.native-date{position:absolute;right:0;bottom:0;width:1px;height:1px;opacity:0;pointer-events:none;border:0;padding:0}
.datefield input.invalid{border-color:var(--sev-critical)}
#hd-note{min-height:0}
#hd-note:empty{display:none}
.fb-more summary{cursor:pointer;font-size:12px;color:var(--muted);padding:4px 0}
.fb-more label{display:flex;gap:6px;align-items:center;font-size:12.5px;padding:3px 0}
#flight-count{margin:2px 0 4px}
.fb-state{padding:14px 4px;text-align:center;color:var(--muted);font-size:13px}
.fb-state b{color:var(--ink)}
.fb-state.error b{color:var(--sev-critical)}
.fb-state button{margin-top:8px;min-height:34px}
.spinner{display:inline-block;width:12px;height:12px;border:2px solid var(--line);border-top-color:var(--accent);
         border-radius:50%;vertical-align:-2px;animation:spin .8s linear infinite}
@keyframes spin{to{transform:rotate(360deg)}}
.flight-days{display:block}
.flight-day{margin-bottom:10px}
.flight-day-head{position:sticky;top:0;z-index:1;display:flex;justify-content:space-between;align-items:baseline;
                 margin:0 0 6px;padding:6px 2px;background:var(--panel);border-bottom:1px solid var(--line);
                 font-size:12px;letter-spacing:.02em}
.flight-day-head small{color:var(--muted);font-weight:500}
/* A 30-day list is hundreds of cards: the browser skips the ones off screen. */
.flight-days .flight-card{content-visibility:auto;contain-intrinsic-size:auto 96px;margin-bottom:6px}
.back-to-flights{margin:0 0 8px;min-height:36px}
#history-flight-view{padding-top:8px}
#history-flight-view .back-to-flights{margin-left:14px}
.fs-grid{grid-template-columns:max-content minmax(0,1fr)}
.fs-grid dd{overflow-wrap:anywhere}
.fs-alarms{list-style:none;margin:4px 0 0;padding:0;display:flex;flex-direction:column;gap:3px;font-size:12px}
.fs-alarms li{cursor:pointer;padding:3px 4px;border-radius:6px}
.fs-alarms li:hover,.fs-alarms li:focus-visible{background:color-mix(in srgb,var(--accent) 10%,transparent)}
.fs-alarms small{color:var(--muted)}

/* The Share moment popover (CLOUD-1741): over the replay bar, its timeline and charts, inside the window. */
.share-pop{position:fixed;z-index:1300;width:min(360px,calc(100vw - 16px));box-sizing:border-box;padding:10px 12px;
           border-radius:12px;background:var(--panel);color:var(--ink);border:1px solid var(--line);
           box-shadow:0 8px 28px rgba(0,0,0,.35)}
.share-head{display:flex;justify-content:space-between;align-items:center;margin-bottom:2px}
.share-head .ghost{border:0;font-size:18px;line-height:1;min-width:36px;min-height:36px;padding:0}
.share-when{font-size:12.5px;color:var(--muted);margin-bottom:8px;font-variant-numeric:tabular-nums}
.share-row{display:flex;gap:6px}
.share-row input{flex:1;min-width:0;min-height:36px;box-sizing:border-box;font-size:12px}
.share-row button{min-height:36px}
.share-status{min-height:16px;margin-top:4px;font-size:12px;color:var(--oc-ok)}

/* Batteries (CLOUD-1703) */
.battery-card{margin-bottom:6px}
.battery-card .nm{overflow-wrap:anywhere}
.battery-flights{margin-top:6px}
.battery-flights tr[data-seek-flight]{cursor:pointer}

.ac-note.int-bad{color:var(--sev-critical)}

/* Manned aircraft in the replay (CLOUD-1860) */
.replay-traffic-ctl{display:inline-flex;align-items:center;gap:6px;font-size:12px}
.replay-traffic-ctl select{min-height:30px}
.replay-nearby{margin:8px 0;font-size:12.5px}
.replay-nearby h4,.fs-closest h4{margin:6px 0;font-size:12px;color:var(--muted)}
.lane-ev.ev-closest{color:var(--sev-warning)}
.fs-closest{margin-top:8px}

/* Users & Roles (CLOUD-1864) */
.roles-table-wrap{overflow-x:auto;margin-bottom:10px}
.roles-table{border-collapse:collapse;font-size:12px;width:100%}
.roles-table th,.roles-table td{border-bottom:1px solid var(--line);padding:4px 6px;text-align:center}
.roles-table thead th{white-space:nowrap}
.roles-table tbody th{text-align:left;font-weight:500;min-width:150px}
.perm-yes{color:var(--sev-ok,#1a9e4b);font-weight:700}
.perm-no{color:var(--muted)}
.role-row select{min-height:32px}
.role-row .nm{overflow-wrap:anywhere}

/* The one compact header (CLOUD-1708): fleet chips, clock and the user menu. */
.fleet-chips{display:inline-flex;gap:6px;flex:0 0 auto}
.chip{background:transparent;color:var(--ink);border:1px solid var(--line);border-radius:999px;padding:4px 10px;
  font-size:12.5px;font-weight:600;white-space:nowrap}
.chip span{font-weight:800;font-variant-numeric:tabular-nums}
.chip.warning{border-color:var(--sev-warning);color:var(--sev-warning)}
.chip.critical{border-color:var(--sev-critical);color:var(--sev-critical)}
.planner-icon{font-size:12.5px;font-weight:650;color:var(--accent);text-decoration:none;padding:4px 10px;border:1px solid var(--line,currentColor);border-radius:6px;white-space:nowrap}
.planner-icon:hover{background:color-mix(in srgb,var(--accent) 12%,transparent)}
#pl-form label.check{display:flex;gap:8px;align-items:center}
#pl-key-row{display:flex;gap:8px;align-items:end}#pl-key-row label{flex:1}#pl-key{font-family:ui-monospace,monospace}
.clock{font-size:12.5px;font-weight:650;color:var(--muted);font-variant-numeric:tabular-nums;white-space:nowrap}
.mode-switch{flex:0 0 auto}
.mode-switch button{white-space:nowrap}
.user-menu{position:relative}
.user-btn{display:inline-flex;align-items:center;gap:5px;padding:3px 8px 3px 4px}
.avatar{display:inline-flex;align-items:center;justify-content:center;width:26px;height:26px;border-radius:50%;
  background:var(--accent);color:#fff;font-size:12px;font-weight:800}
.user-pop{position:absolute;right:0;top:calc(100% + 8px);min-width:230px;display:flex;flex-direction:column;gap:6px;
  padding:10px;background:var(--panel);border:1px solid var(--line);border-radius:10px;box-shadow:0 10px 28px rgba(0,0,0,.28)}
.user-pop[hidden]{display:none}
.user-pop button{text-align:left;width:100%}
.user-pop .user-id{display:flex;flex-direction:column;gap:6px;align-items:flex-start;padding:2px 2px 8px;border-bottom:1px solid var(--line)}
.user-pop .user-id .sub{max-width:none;word-break:break-all}
.ws-chip{position:absolute;z-index:950;right:12px;top:10px;padding:3px 6px 3px 12px;border-radius:999px;font-size:12.5px;
  background:var(--panel);color:var(--ink);border:1px solid var(--accent);box-shadow:0 3px 10px rgba(0,0,0,.2);
  display:flex;align-items:center;gap:6px;max-width:min(360px,calc(100vw - 24px))}
.ws-chip[hidden]{display:none}
.ws-chip select{min-height:32px;min-width:0;max-width:240px;border:0;background:transparent;color:inherit;font:inherit;font-weight:600;text-overflow:ellipsis}
body.replaying .banners{top:52px}
@media(max-width:1000px){.clock,#app-name,header .title .sub#status{display:none}}
@media(max-width:820px){.chip{padding:4px 8px}.mode-switch button{padding:5px 8px}.health-pill #health-text{display:none}}
#annot-filter select{width:100%;max-width:none}

/* The no-access screen (CLOUD-1868). */
.no-access{position:fixed;inset:0;z-index:5000;background:var(--bg);display:flex;align-items:center;justify-content:center;padding:16px}
.no-access[hidden]{display:none}
.no-access-card{max-width:440px;text-align:center;background:var(--panel);border:1px solid var(--line);border-radius:14px;padding:28px 24px}
.no-access-card .logo{height:40px;margin-bottom:10px}
.no-access-card h1{font-size:22px;margin:0 0 12px}
.no-access-card p{margin:8px 0;word-break:break-word}
.no-access-actions{display:flex;gap:8px;justify-content:center;margin-top:18px}
.user-add{display:flex;gap:8px;flex-wrap:wrap;margin-bottom:12px}
.user-add input{flex:1 1 200px}
.role-row .badges button{margin-left:8px;padding:3px 9px;font-size:12px}
/* Which drones this screen shows (CLOUD-1865): only yours, or everyone's in
   a joint operation. One switch, top right; the active choice is filled and
   ticked, so it reads at a glance -- and the map says so too (.view-pill). */
.view-switch{display:inline-flex;border:1px solid var(--line);border-radius:999px;overflow:hidden;
  background:var(--panel)}
.view-switch button{display:inline-flex;align-items:center;gap:5px;border:0;border-radius:0;background:transparent;
  padding:5px 13px;font-size:12.5px;font-weight:650;color:var(--muted);white-space:nowrap}
.view-switch button:hover{color:var(--ink)}
.view-switch .vs-tick{display:none;font-size:12px;line-height:1}
.view-switch button[aria-pressed="true"]{color:#fff}
.view-switch button[aria-pressed="true"] .vs-tick{display:inline}
.view-switch button[aria-pressed="true"]#view-own{background:var(--accent)}
.view-switch button[aria-pressed="true"]#view-joint{background:#7c3aed}
.view-pill{position:absolute;z-index:840;top:12px;left:62px;display:inline-flex;align-items:center;gap:7px;
  padding:5px 12px;border-radius:999px;font-size:12px;font-weight:700;letter-spacing:.02em;color:#fff;
  box-shadow:0 3px 10px rgba(0,0,0,.25);pointer-events:none;white-space:nowrap}
.view-pill.own{background:var(--accent)}
.view-pill.joint{background:#7c3aed}
.view-pill small{font-weight:500;opacity:.9}
.view-pill::before{content:"";width:8px;height:8px;border-radius:50%;background:#fff;opacity:.9}
body.replaying .view-pill{display:none}
#side:not([hidden]) ~ .view-pill{left:calc(var(--side-w) + 62px)}
#view-note:empty,#grants-note:empty{display:none}
#view-note,#grants-note{margin-top:4px}
#view-note b{color:var(--ink)}
/* A drone seen in the joint view only (someone else's): its position and
   nothing more -- a plain outlined disc, no battery ring, no link dot. */
.drone-marker.joint .drone-svg{opacity:.85}
.drone-marker.joint .disc{fill:color-mix(in srgb,var(--panel) 70%,#7c3aed);stroke:#7c3aed;stroke-dasharray:3 2}
.drone-marker.joint .ring,.drone-marker.joint .ring-bg,.drone-marker.joint .status-dot{display:none}
.drone-marker.joint .chevron path{fill:#7c3aed;stroke:#7c3aed}
.drone-marker.joint .drone-chip{border-left-color:#7c3aed!important}
.drone-marker.joint.stale .disc{stroke:var(--oc-lost);fill:color-mix(in srgb,var(--panel) 70%,var(--oc-lost))}
.drone-marker.joint.stale .chevron path{fill:var(--oc-lost);stroke:var(--oc-lost)}
.card.joint{border-style:dashed}
.badge.joint{background:color-mix(in srgb,#7c3aed 16%,transparent);color:#7c3aed}
.grant-card .meta code{font-size:11px}
@media(max-width:760px){.view-switch button{padding:5px 9px;font-size:12px}
  .view-pill{top:8px;left:54px;font-size:11px;padding:4px 10px}#side:not([hidden]) ~ .view-pill{left:calc(var(--side-w) + 54px)}}

/* Mission type (CLOUD-1856): a photo judged by its type's rules, and the type's label. */
.photo-mark.rules.pass{color:#1a9e4b}
.photo-mark.rules.fail{color:#dc2626}
.photo-mark.rules.unknown{color:var(--muted)}
.mission-badge{display:inline-block;padding:1px 8px;border-radius:999px;border:1px solid var(--line);font-size:11px;font-weight:600}
.mission-badge.solar{border-color:#d97706;color:#d97706}
.mission-badge.powerline{border-color:#7c3aed;color:#7c3aed}
.val-form{display:grid;gap:10px;max-width:560px}
.val-type{border:1px solid var(--line);border-radius:10px;padding:10px 12px;margin:0 0 10px}
.val-type legend{font-weight:700;padding:0 4px}
.val-rule h4{margin:4px 0}
.val-rule label{display:grid;gap:3px;margin:8px 0;font-size:12px}
.val-rule input[aria-invalid="true"]{border-color:var(--sev-critical);outline-color:var(--sev-critical)}
.val-err{color:var(--sev-critical);font-size:12px}
.val-err:empty{display:none}
.val-info{border-left:3px solid var(--accent);padding-left:8px}
/* The PL Inspection feeder sheet (CLOUD-1857). */
.mission-pick{margin-top:10px}
.mission-pick:empty{display:none}

/* Missions (CLOUD-1870): the plan form and the list by day. Touch-sized for a tablet. */
.mission-form{display:flex;flex-direction:column;gap:8px}
.mission-field{display:flex;flex-direction:column;gap:4px;font-size:12px;font-weight:650;color:var(--ink)}
.mission-field select,.mission-field input{min-height:40px}
.mission-field textarea{width:100%;box-sizing:border-box;padding:8px 10px;border:1px solid var(--line);border-radius:7px;
                        background:var(--bg);color:var(--ink);font:inherit;font-weight:400;resize:vertical}
.mission-when{display:grid;grid-template-columns:1fr 1fr;gap:8px}
.mission-form button[type=submit]{flex:1;min-height:44px}
.mission-list{display:flex;flex-direction:column;gap:12px;margin-top:6px}
.mission-empty{color:var(--muted);font-size:12px}
.mission-day-head{font-size:12px;font-weight:700;color:var(--muted);text-transform:uppercase;letter-spacing:.04em;
                  margin-bottom:6px}
.mission-card{border:1px solid var(--line);border-radius:8px;padding:10px;background:var(--panel);
              display:flex;flex-direction:column;gap:4px;margin-bottom:6px}
.mission-top{display:flex;align-items:baseline;gap:8px}
.mission-hour{font-variant-numeric:tabular-nums;font-weight:700}
.mission-name{flex:1;min-width:0;overflow-wrap:anywhere}
.mission-status{font-size:11px;font-weight:650;padding:2px 8px;border-radius:999px;white-space:nowrap;
                background:color-mix(in srgb,var(--accent) 14%,transparent);color:var(--accent)}
.mission-card.status-in_progress .mission-status{background:color-mix(in srgb,var(--sev-warning) 18%,transparent);
                                                 color:var(--sev-warning)}
.mission-card.status-completed .mission-status{background:color-mix(in srgb,var(--oc-ok) 20%,transparent);color:#1a9e4b}
.mission-card.status-cancelled{opacity:.6}
.mission-card.deleted{opacity:.75;border-style:dashed}
.mission-status.missed{background:color-mix(in srgb,var(--danger) 14%,transparent);color:var(--danger)}
.mission-view{margin:8px 0}
.mission-view button .tab-count{position:static;margin-left:4px;font-size:11px;font-weight:600;opacity:.85;background:none;color:inherit;padding:0}
.mission-card.status-cancelled .mission-status{background:transparent;color:var(--muted);border:1px solid var(--line)}
/* Paused between work sessions (CLOUD-1999): neither flying nor done. */
.mission-card.status-paused .mission-status{background:var(--line);color:var(--ink)}
.mission-progress{display:flex;flex-wrap:wrap;gap:4px 10px;align-items:baseline;margin:4px 0;font-size:12.5px}
.mission-act-summary{margin:0 0 10px}
.mission-act-warn{margin-top:6px;padding:6px 8px;border-radius:8px;font-size:12.5px;font-weight:600;
  background:color-mix(in srgb,var(--sev-warning) 16%,transparent);color:var(--ink)}
#mission-act label{display:block;margin:0 0 10px;font-size:12.5px;font-weight:600}
#mission-act select,#mission-act textarea{display:block;width:100%;margin-top:4px;min-height:44px;box-sizing:border-box}
.mission-session-table{width:100%;border-collapse:collapse;font-size:12px}
.mission-session-table th{text-align:left;color:var(--muted);font-weight:600;padding:3px 6px 3px 0}
.mission-session-table td{padding:4px 6px 4px 0;border-top:1px solid var(--line);vertical-align:top}
.schedule-group.paused .schedule-item{border-color:var(--accent);border-left-width:6px}
.mission-notes{font-size:12px;color:var(--ink);white-space:pre-wrap;overflow-wrap:anywhere}
.mission-actions{margin-top:4px;margin-bottom:0}
.mission-actions button{min-height:44px;flex:1}

/* Planning a mission by the weather (CLOUD-1872): a followed location's hours by tier, on the Weather tab. */
.wx-plan{margin:10px 10px 0;padding:10px;border:1px solid var(--line);border-radius:10px;background:var(--panel)}
.wx-plan h3{margin:0 0 8px}
.wx-plan button.link{background:none;border:0;padding:0;min-height:0;color:var(--accent,#2563eb);text-decoration:underline;
  font:inherit;cursor:pointer}
.wx-plan-legend{display:flex;flex-wrap:wrap;gap:4px 12px;font-size:11.5px;color:var(--ink);align-items:center}
.wx-plan-legend span{display:inline-flex;align-items:center;gap:5px}
.wx-plan-legend .wx-dot{display:inline-block}
.wx-plan-grid{display:flex;flex-direction:column;gap:8px}
.wx-plan-date{font-size:12px;font-weight:700;color:var(--muted);text-transform:uppercase;letter-spacing:.04em;margin-bottom:3px}
.wx-plan-hours{display:grid;grid-template-columns:repeat(auto-fill,minmax(42px,1fr));gap:4px}
.wx-plan-cell{min-height:40px;padding:0;border-radius:6px;border:1px solid color-mix(in srgb,var(--wxt) 60%,var(--line));
  background:color-mix(in srgb,var(--wxt) 22%,var(--bg));color:var(--ink);font-variant-numeric:tabular-nums;font-weight:650;
  cursor:pointer}
.wx-plan-cell.wxt-nogo{background:color-mix(in srgb,var(--wxt) 10%,var(--bg));color:var(--muted)}
.wx-plan-cell.picked{outline:3px solid var(--ink);outline-offset:1px}
.wx-plan-cell.range-start{border-top-left-radius:6px;border-bottom-left-radius:6px}
.wx-plan-cell.picked:not(.range-end){border-right-width:0}
.wx-plan-grid{touch-action:pan-y;user-select:none;-webkit-user-select:none}
.wx-plan-help{margin:4px 0}
.wx-plan-detail{min-height:2.6em;margin-top:6px;font-size:12.5px;color:var(--ink)}
.wx-plan-cell{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:1px;min-height:44px}
.wx-plan-cell small{font-size:10px;line-height:1;font-weight:700}
.wx-plan-cell.past{opacity:.4}
.wx-past-key{background:var(--muted);opacity:.4}
.wx-loading{display:flex;align-items:center;gap:8px}
.wx-spin{width:14px;height:14px;border-radius:50%;border:2px solid var(--line);border-top-color:var(--ink);animation:wx-spin .9s linear infinite}
@keyframes wx-spin{to{transform:rotate(360deg)}}
@media (prefers-reduced-motion:reduce){.wx-spin{animation:none}}
@media (max-width:720px){.wx-plan-hours{grid-template-columns:repeat(auto-fill,minmax(38px,1fr))}.wx-plan-legend{flex-direction:column;align-items:flex-start}}
.wx-plan-pick{display:flex;flex-direction:column;gap:8px;border-top:1px solid var(--line);padding-top:8px}
.wx-plan-hour{display:flex;align-items:center;gap:6px;font-size:13px}
.wx-plan-hour .wx-dot{display:inline-block}
.wx-plan-warn{border:1px solid var(--sev-warning);border-radius:8px;padding:8px 10px;font-size:12.5px;
  background:color-mix(in srgb,var(--sev-warning) 12%,transparent);color:var(--ink)}
.wx-plan-pick button[type=submit]{flex:1;min-height:44px}
.mission-weather{font-size:12px;font-weight:600;color:var(--ink);border-left:3px solid var(--wxt,var(--sev-warning));
  padding:2px 8px;background:color-mix(in srgb,var(--wxt,var(--sev-warning)) 12%,transparent);border-radius:0 6px 6px 0}

/* The Missions section (CLOUD-1717): filters, the flight plan chip, and one mission. */
.mission-filters{display:grid;grid-template-columns:1fr 1fr;gap:6px;margin:8px 0}
.mission-filters input{grid-column:1/-1}
.mission-filters input,.mission-filters select{min-height:44px;min-width:0}
.mission-chips{display:flex;flex-wrap:wrap;gap:6px}
.mission-chip{font-size:11.5px;font-weight:600;padding:2px 8px;border-radius:999px;border:1px solid var(--line);color:var(--muted)}
.mission-chip.plan{border-color:#7c3aed;color:#7c3aed}
.mission-chip.missing{border-style:dashed}
.mission-facts{display:grid;grid-template-columns:max-content 1fr;gap:4px 12px;margin:4px 0;font-size:12.5px}
.mission-facts dt{color:var(--muted);font-weight:600}
.mission-facts dd{margin:0;overflow-wrap:anywhere}
.mission-plan{margin-top:12px}
.mission-plan h4{margin:0 0 6px}
.mission-plan-head{font-size:13px;margin-bottom:6px}
.mission-steps{display:flex;flex-wrap:wrap;gap:4px;list-style:none;padding:0;margin:0 0 6px}
.mission-steps li{font-size:11.5px;font-weight:600;padding:4px 8px;border-radius:6px;border:1px solid var(--line);color:var(--muted)}
.mission-steps li.done{color:var(--ink);background:color-mix(in srgb,var(--oc-ok) 16%,transparent);border-color:transparent}
.mission-steps li.current{color:#fff;background:#7c3aed;border-color:#7c3aed}
.mission-steps li.current.bad{background:var(--sev-critical);border-color:var(--sev-critical)}
.mission-attach{margin-top:8px}
.mission-attach select{min-height:44px}
.mission-detail button,.mission-plan button,.mission-detail select,.mission-detail input{min-height:44px}
.mission-plan .hint{margin:6px 0 0}
/* "Plan a mission" is a button under the Active / History switch, "Filters" one toggle with chips (CLOUD-2138). */
.mission-fold{margin:10px 0}
.mission-fold>summary{min-height:48px;display:flex;align-items:center;justify-content:center;font-weight:700;cursor:pointer;
  color:#fff;background:var(--accent);border-radius:10px;list-style:none}
.mission-fold>summary::-webkit-details-marker{display:none}
.mission-fold[open]>summary{margin-bottom:8px}
.filters-fold{margin:10px 0 0}
.filters-fold>summary{min-height:44px;display:flex;align-items:center;gap:6px;font-weight:600;cursor:pointer;color:var(--ink);
  border:1px solid var(--line);border-radius:8px;padding:0 12px}
.filters-fold[open]>summary{margin-bottom:6px}
.filter-chips{display:flex;flex-wrap:wrap;gap:6px;margin:8px 0}
.filter-chips:empty{display:none}
.filter-chip{min-height:32px;font-size:12px;font-weight:600;padding:0 10px;border-radius:999px;border:1px solid var(--line);
  background:color-mix(in srgb,var(--accent) 10%,transparent);color:var(--ink);cursor:pointer}
.filter-chip.clear-all{background:transparent;color:var(--muted)}
@media (pointer:coarse){.filter-chip{min-height:44px}}

/* The schedule (CLOUD-1871): today at a glance, one day by the hour, a week by day. */
.schedule{display:flex;flex-direction:column;gap:6px}
.schedule-views{display:grid;grid-template-columns:repeat(3,1fr);gap:4px}
.schedule-views button{min-height:44px}
.schedule-views button[aria-pressed="true"]{background:var(--accent);color:#fff;border-color:var(--accent)}
.schedule-nav{display:grid;grid-template-columns:44px 1fr 44px;align-items:center;gap:6px}
.schedule-nav h3{margin:0;text-align:center;grid-column:2}
.schedule-nav button{min-height:44px;font-size:20px;padding:0}
.schedule-nav button[hidden]{display:block;visibility:hidden}
.schedule-body{display:flex;flex-direction:column;gap:10px}
.schedule-day{display:flex;flex-direction:column;gap:4px}
.schedule-day.today .mission-day-head{color:var(--accent)}
.schedule-count{float:right;font-weight:600;text-transform:none;letter-spacing:0}
.schedule-free{font-size:12px;color:var(--muted);padding:4px 0 6px}
.schedule-item{display:flex;gap:10px;align-items:flex-start;width:100%;text-align:left;min-height:44px;padding:8px 10px;
  border:1px solid var(--line);border-left:4px solid var(--muted);border-radius:8px;background:var(--panel);color:var(--ink);
  font:inherit;cursor:pointer}
.schedule-item.type-powerline{border-left-color:#7c3aed}
.schedule-item.type-solar{border-left-color:#d97706}
.schedule-item.type-free{border-left-color:var(--accent)}
.schedule-item.status-cancelled{opacity:.55}
.schedule-item.status-completed .schedule-hour{text-decoration:line-through}
.schedule-hour{font-weight:700;font-variant-numeric:tabular-nums;min-width:42px}
.schedule-what{display:flex;flex-direction:column;gap:2px;min-width:0;overflow-wrap:anywhere}
.schedule-source{font-size:11px;font-weight:600;color:var(--muted)}
.schedule-line{font-size:12px;color:var(--muted)}
.schedule-warn{font-size:11.5px;font-weight:650;align-self:flex-start;padding:1px 6px;border-radius:5px;
  background:color-mix(in srgb,var(--wxt,var(--sev-warning)) 16%,transparent);color:var(--ink)}
.schedule-group{display:flex;flex-direction:column;gap:4px}
.schedule-group.flying .schedule-item{border-color:var(--sev-warning);border-left-width:6px}
.schedule-group.next .schedule-item{box-shadow:0 0 0 2px var(--accent) inset}
.schedule-group.next .schedule-item .schedule-hour{font-size:18px;min-width:56px}
.schedule-group.overdue .mission-day-head{color:var(--sev-critical)}
.schedule-hours{display:flex;flex-direction:column}
.schedule-row{display:grid;grid-template-columns:44px 1fr;gap:6px;border-top:1px solid var(--line);min-height:30px;padding:3px 0}
.schedule-row.now{border-top:2px solid var(--sev-critical)}
.schedule-tick{font-size:11px;color:var(--muted);font-variant-numeric:tabular-nums;padding-top:2px}
.schedule-slot{display:flex;flex-direction:column;gap:4px}
.schedule-error{border:1px solid var(--sev-critical);border-radius:8px;padding:10px;font-size:12.5px;color:var(--ink)}
.mission-edit{margin-top:12px;border-top:1px solid var(--line);padding-top:8px}
.mission-edit h4{margin:0}
.mission-edit button[type=submit]{flex:1;min-height:44px}
/* A mission's flights (CLOUD-1720). */
.mission-flights{margin-top:12px}
.mission-flights h4{margin:0 0 6px}
.mission-flight-list{list-style:none;padding:0;margin:0 0 8px;display:flex;flex-direction:column;gap:6px}
.mission-flight-list li{border:1px solid var(--line);border-radius:8px;padding:8px 10px;background:var(--panel);font-size:12.5px}
.mission-flight-list .tool-row{margin:4px 0 0}
.flight-card .flight-mission{color:#7c3aed;font-weight:600}
/* The photos of a mission's other flights in a replay (CLOUD-1989): faint and dashed, apart from the flight's own. */
.photo-mark.other-flight{opacity:.55;filter:grayscale(1)}
.fs-mission-photos{display:flex;align-items:center;gap:8px;min-height:44px;font-size:12.5px}
.fs-mission-photos input{width:20px;height:20px}
/* "Hide acknowledged" says how many it hides (CLOUD-1993). */
.ac-hidden-n{font-size:12px;color:var(--muted);margin-left:8px}
/* The mission's page (CLOUD-1968): its description, what was flown, each flight's figures, risk events. */
.mission-description{margin:6px 0 8px}
.mission-description-head{display:flex;align-items:center;gap:8px;font-size:12.5px}
.mission-desc-edit{margin-left:auto;min-height:32px;padding:2px 10px}
#mission-desc-text{display:block;width:100%;box-sizing:border-box;min-height:88px;margin-top:4px}
.mission-totals{display:grid;grid-template-columns:repeat(auto-fill,minmax(110px,1fr));gap:8px;margin:6px 0 10px}
.mission-totals div{border:1px solid var(--line);border-radius:8px;padding:6px 8px}
.mission-totals dt{font-size:11px;color:var(--muted);font-weight:600}
.mission-totals dd{margin:2px 0 0;font-size:15px;font-weight:700}
.mission-flight-figures{font-size:12.5px;font-weight:600}
.mission-risk-group{margin:6px 0 10px}
.mission-risk-head{display:flex;align-items:center;gap:6px;font-size:12.5px}
.mission-risk-list{list-style:none;margin:4px 0 0;padding:0}
.mission-risk-list li{display:flex;align-items:center;gap:8px;justify-content:space-between;padding:3px 0;
  border-top:1px solid var(--line);font-size:12px}
.mission-risk-list button{min-height:32px}
/* A PL Inspection's pole coverage (CLOUD-1969): totals, filter and CSV, a row per pole. */
.mission-coverage{margin:4px 0 10px}
.coverage-tools{display:flex;gap:8px;align-items:center}
.coverage-tools select{flex:1;min-height:36px}
.coverage-table{width:100%;border-collapse:collapse;font-size:12px;margin-top:6px}
.coverage-table th{text-align:left;font-size:11px;color:var(--muted);font-weight:600;padding:4px 4px;
  border-bottom:1px solid var(--line)}
.coverage-table td{padding:6px 4px;border-bottom:1px solid var(--line);vertical-align:top}
.coverage-table tbody tr{cursor:pointer}
.coverage-table tbody tr:hover,.coverage-table tbody tr.on{background:rgba(0,145,255,.08)}
.coverage-table tbody tr:focus-visible{outline:2px solid var(--accent);outline-offset:-2px}
.coverage-table .sub{font-size:11px}
.cov-yes{color:#1a9e4b;font-weight:600}
.cov-no{color:var(--muted)}
.cov-dot{display:inline-block;width:10px;height:10px;border-radius:50%;vertical-align:-1px;background:#d64545}
.cov-dot.complete{background:#1a9e4b}
.cov-dot.unverified{background:#8a8f98}

/* One pole after another (CLOUD-1778). */
.disc-next{display:flex;flex-direction:column;gap:2px;font-size:13px;margin-bottom:4px}
.disc-pole-list{list-style:none;padding:0;margin:6px 0 0;display:flex;flex-direction:column;gap:4px}
.disc-pole-list li{display:flex;align-items:center;gap:8px;justify-content:space-between;border:1px solid var(--line);
  border-radius:8px;padding:6px 8px;font-size:12px;background:var(--panel)}
.disc-pole-list li.complete{border-left:4px solid #1a9e4b}
.disc-pole-list li.skipped{border-left:4px solid #868e96}
.disc-pole-list button,#disc-poles .tool-row button{min-height:44px}
/* The live summary while a mission is flown (CLOUD-1991). */
.mission-report-head{display:flex;align-items:center;gap:6px;flex-wrap:wrap}
.mission-report-head .sub{font-weight:400}
.live-pill{display:inline-block;width:8px;height:8px;border-radius:50%;background:#e03131;
  animation:live-pulse 1.6s ease-in-out infinite}
@keyframes live-pulse{0%,100%{opacity:1}50%{opacity:.3}}
@media (prefers-reduced-motion:reduce){.live-pill{animation:none}}
.mission-totals div.alert{border-color:var(--danger)}
.mission-totals div.alert dd{color:var(--danger)}
.mission-history-day{margin:6px 0}
.mission-history ul{list-style:none;margin:2px 0 0;padding:0;font-size:12px}
.mission-history li{padding:2px 0;border-top:1px solid var(--line)}
.mission-history-time{color:var(--muted);font-variant-numeric:tabular-nums;margin-right:4px}
.mission-recalc{align-items:center;gap:8px;margin:2px 0 6px}
.cov-validation.passed{color:#1a9e4b;font-weight:600}
.cov-validation.failed{color:#d64545;font-weight:600}
.cov-validation.undecided{color:var(--muted)}
.coverage-day-lists{margin-top:8px;font-size:12px;display:grid;gap:4px}

/* Daily plans (CLOUD-2083): touch-sized for a phone or a tablet. */
.dayplans{margin:10px 0}
.dayplan-list{list-style:none;margin:4px 0;padding:0;display:grid;grid-template-columns:minmax(0,1fr);gap:6px}
.dayplan{border:1px solid var(--line);border-radius:8px;padding:8px 10px}
.dayplan.go{border-left:4px solid #1a9e4b}
.dayplan.no_go{border-left:4px solid #d64545}
.dayplan.undecided{border-left:4px solid var(--line)}
.dayplan-head{display:flex;justify-content:space-between;gap:8px;align-items:baseline;flex-wrap:wrap}
.dayplan-decision{font-size:12px;font-weight:600}
.dayplan.go .dayplan-decision{color:#1a9e4b}
.dayplan.no_go .dayplan-decision{color:#d64545}
.dayplan-actions button,.dayplan-form button,.dayplan-form input{min-height:44px}
.dayplan-add summary{cursor:pointer;min-height:44px;display:flex;align-items:center;font-weight:600}

/* The forecast in a daily plan (CLOUD-2084): a compact table, a column per value, its limit in the head. */
.dayplan{min-width:0}
.dayplan-forecast{margin-top:6px;font-size:11px;overflow-x:auto}
.forecast-table{width:100%;border-collapse:collapse;margin-top:4px;table-layout:auto}
.forecast-table th,.forecast-table td{padding:3px 2px;text-align:left;vertical-align:top}
.forecast-table thead th{font-weight:600;line-height:1.2}
.forecast-table thead .sub{display:block;font-weight:400}
.fc-limit{display:block;font-weight:400;color:var(--muted)}
.forecast-table tbody th{white-space:nowrap}
.forecast-table tbody tr{border-top:1px solid var(--line)}
.fc{white-space:nowrap}
.fc-mark{display:inline-block;width:1.1em}
.fc-ok .fc-mark{color:#1a9e4b}
.fc-maint .fc-mark{color:#b87400;font-weight:700}
.fc-nogo .fc-mark{color:#d64545;font-weight:700}
.fc-nogo b{color:#d64545}
.forecast-ok{color:#1a9e4b}
.dayplan-actions{flex-wrap:wrap}
.dayplan-actions button{flex:0 0 auto}

/* A mission's records on the map (CLOUD-2089). */
.mission-pole-icon{background:none;border:0}
.mission-pole{display:flex;align-items:center;justify-content:center;width:22px;height:22px;border-radius:50%;
  border:2px solid;font-size:12px;font-weight:700;color:#111827;line-height:1;box-sizing:border-box}
.mission-pole.hollow{background:transparent;border-width:3px}
.mission-records{margin:6px 0}
.mission-records .check{display:inline-flex;gap:4px;align-items:center;min-height:36px}
.pole-result{font-size:12px;line-height:1.5}

/* The mission's timeline (CLOUD-2090). */
.timeline-list{list-style:none;margin:6px 0;padding:0;border-left:2px solid var(--line)}
.timeline-list li{margin:0}
.tl-entry{display:flex;gap:8px;align-items:center;width:100%;text-align:left;background:none;border:0;padding:6px 8px;min-height:40px;
  cursor:pointer;color:var(--ink);font-size:12px}
.tl-entry:disabled{cursor:default;opacity:.85}
.tl-entry:not(:disabled):hover{background:rgba(0,145,255,.08)}
.timeline-list li.on .tl-entry{background:rgba(0,145,255,.14)}
.tl-time{font-variant-numeric:tabular-nums;color:var(--muted);min-width:42px}
.tl-tile{display:inline-flex;align-items:center;justify-content:center;width:28px;height:28px;border-radius:6px;background:var(--line)}
.tl-what{flex:1;min-width:0}
.tl-event .tl-what b{color:var(--accent)}
.tl-validation{font-weight:600;font-size:11px;margin-left:4px}
.tl-validation.passed{color:#1a9e4b}
.tl-validation.failed{color:#d64545}
.tl-validation.undecided{color:var(--muted)}
.mission-pole-icon.picked .mission-pole{transform:scale(1.5);transition:transform .2s}
.signal-block{margin:10px 0}
.signal-block h5{margin:0 0 4px;font-size:12.5px}
.signal-actions{display:flex;gap:4px;flex-shrink:0}
.signal-problems li,.signal-list li{display:flex;gap:8px;align-items:center;justify-content:space-between}
.tl-signal .tl-what b{color:var(--sev-critical)}
.mission-feeders .feeder-chips,.mission-feeder-list{list-style:none;margin:6px 0;padding:0;display:grid;gap:4px}
.feeder-chips li{display:flex;justify-content:space-between;align-items:center;gap:8px;padding:3px 8px;border:1px solid var(--line);border-radius:8px}
.mission-feeder-list li{font-size:13px}
.mission-feeder-add{align-items:center}
.mission-feeder-add input{flex:1;min-width:0;text-align:left}

/* CLOUD-2137: the mission's layers and the user's own are two groups in Layers. */
.layer-group-head{display:flex;justify-content:space-between;align-items:baseline;margin:10px 0 4px;font-size:11px;
  font-weight:600;letter-spacing:.04em;text-transform:uppercase;color:var(--muted,#5b6776)}
.layer-group-note{font-weight:400;letter-spacing:0;text-transform:none}
#add-layer-section .tool-row{margin-bottom:8px}

/* CLOUD-2136: the mission bar at the top of the mission page, and the slide that completes a mission. */
.mission-bar{position:sticky;top:0;z-index:5;display:flex;flex-wrap:wrap;align-items:center;gap:12px;
  padding:12px 14px;margin:-12px -14px 12px;background:var(--panel);border-bottom:1px solid var(--line)}
.mission-bar .bar-main{flex:1 1 220px;min-width:0}
.mission-bar .bar-title{display:flex;flex-wrap:wrap;gap:8px;align-items:center}
.mission-bar .bar-title b{font-size:15px}
.mission-bar .bar-chip{padding:2px 9px;border-radius:10px;font-size:11px;font-weight:600;background:var(--line);color:var(--ink)}
.mission-bar.state-in_progress .bar-chip{background:#e3f5ea;color:#13663b}
.mission-bar.state-paused .bar-chip{background:#fdf3d6;color:#5c3d00}
.mission-bar.state-completed .bar-chip{background:#16202b;color:#fff}
.mission-bar .bar-note{margin-top:2px;font-size:12px;color:var(--muted)}
.mission-bar .bar-buttons{display:flex;flex-wrap:wrap;gap:8px}
.mission-bar .bar-buttons button{min-height:44px;min-width:112px;padding:0 16px;font-size:14px;font-weight:600}
.mission-bar .bar-buttons button.quiet{background:transparent;color:var(--ink);border:1px solid var(--line)}
.mission-bar .bar-buttons button.danger{background:var(--danger);color:#fff;border:0}
.mission-bar .bar-buttons button.quiet.danger{background:transparent;color:var(--danger);border:1px solid var(--danger)}
.slide-lock{position:relative;height:56px;border-radius:28px;background:#fde8e6;border:1px solid #f1b8b2;margin-top:8px}
.slide-lock input{-webkit-appearance:none;appearance:none;width:100%;height:54px;margin:0;background:transparent;position:relative;z-index:2;cursor:grab}
.slide-lock input::-webkit-slider-runnable-track{height:54px;background:transparent}
.slide-lock input::-webkit-slider-thumb{-webkit-appearance:none;width:54px;height:54px;border-radius:50%;background:#b42318;border:3px solid #fff;box-shadow:0 1px 4px rgba(22,32,43,.35)}
.slide-lock input::-moz-range-track{height:54px;background:transparent}
.slide-lock input::-moz-range-thumb{width:48px;height:48px;border-radius:50%;background:#b42318;border:3px solid #fff}
.slide-lock input:focus-visible{outline:3px solid var(--accent);outline-offset:2px;border-radius:28px}
.slide-lock .slide-label{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;padding-left:40px;
  font-size:15px;font-weight:600;color:#8a1c12;pointer-events:none}
.layer-row .lock{flex:0 0 auto;color:var(--muted);display:inline-flex;align-items:center}
.layer-group-head .link{background:none;border:0;padding:0;color:var(--accent);font-size:11px;font-weight:600;cursor:pointer}

/* In-app dialogs and toasts (CLOUD-2178): one component, three levels, light and dark through the theme tokens. */
.dlg-overlay{position:fixed;inset:0;z-index:5000;background:rgba(11,22,33,.58);display:flex;align-items:center;
  justify-content:center;padding:16px;overflow:auto}
.dlg{width:min(540px,100%);background:var(--panel);color:var(--ink);border:1px solid var(--line);border-radius:12px;
  box-shadow:0 24px 60px rgba(0,0,0,.35);padding:24px;display:flex;flex-direction:column;gap:16px;max-height:100%;overflow:auto}
.dlg-head{display:flex;gap:14px;align-items:flex-start}
.dlg-icon{flex:none;width:40px;height:40px;border-radius:50%;display:flex;align-items:center;justify-content:center;
  background:color-mix(in srgb,var(--accent) 16%,transparent);color:var(--accent)}
.dlg-icon.l2{background:color-mix(in srgb,var(--sev-warning) 18%,transparent);color:var(--sev-warning)}
.dlg-icon.l3,.dlg-icon.error{background:color-mix(in srgb,var(--danger) 16%,transparent);color:var(--danger)}
.dlg-title{margin:0;font-size:18px;font-weight:600;line-height:1.3;overflow-wrap:anywhere}
.dlg-text{margin:0;font-size:14px;color:var(--muted);line-height:1.45;white-space:pre-line;overflow-wrap:anywhere}
.dlg-impact{list-style:none;margin:0;padding:0;border:1px solid var(--line);border-radius:8px}
.dlg-impact li{padding:12px 14px;display:flex;flex-direction:column;gap:2px;font-size:13px;color:var(--muted);line-height:1.4}
.dlg-impact li + li{border-top:1px solid var(--line)}
.dlg-impact strong{color:var(--ink);font-size:14px}
.dlg-impact li.danger strong{color:var(--danger)}
.dlg-label{font-size:14px;font-weight:500}
.dlg-label code{font-weight:600;background:var(--bg);padding:1px 6px;border-radius:4px}
.dlg-input{height:44px;box-sizing:border-box;width:100%;border:1px solid var(--muted);border-radius:6px;padding:0 14px;
  font-size:15px;color:var(--ink);background:var(--panel)}
.dlg-input[aria-invalid="true"]{border-color:var(--danger)}
.dlg-hint{font-size:13px;color:var(--muted)}
.dlg-actions{display:flex;justify-content:flex-end;gap:10px;flex-wrap:wrap}
.dlg-btn{min-height:44px;padding:0 18px;border-radius:6px;border:1px solid var(--muted);background:var(--panel);
  color:var(--ink);font-size:14px;font-weight:600;cursor:pointer}
.dlg-btn.confirm{background:var(--accent);border-color:var(--accent);color:#fff}
.dlg-btn.confirm.danger{background:var(--danger);border-color:var(--danger)}
.dlg-btn:disabled{background:var(--bg);border-color:var(--line);color:var(--muted);cursor:not-allowed}
.dlg-btn:focus-visible,.dlg-slide-knob:focus-visible,.dlg-toast-close:focus-visible{outline:3px solid var(--accent);outline-offset:2px}
.dlg-slide{position:relative;height:48px;border-radius:24px;background:color-mix(in srgb,var(--sev-warning) 18%,transparent);
  border:1px solid var(--sev-warning);touch-action:none;user-select:none}
.dlg-slide-text{position:absolute;inset:0 16px 0 56px;display:flex;align-items:center;justify-content:center;
  font-size:14px;font-weight:600;color:var(--ink);pointer-events:none}
.dlg-slide-knob{position:absolute;left:3px;top:3px;width:40px;height:40px;border-radius:50%;background:var(--sev-warning);
  color:#fff;display:flex;align-items:center;justify-content:center;cursor:grab}
.dlg-toasts{position:fixed;right:16px;bottom:16px;z-index:5100;display:flex;flex-direction:column;gap:8px;
  width:min(400px,calc(100vw - 32px))}
.dlg-toast{display:flex;align-items:center;gap:12px;padding:12px 14px;border-radius:10px;background:#14212e;color:#fff;
  box-shadow:0 12px 32px rgba(0,0,0,.35);border:1px solid transparent}
.dlg-toast.ok{background:var(--panel);color:var(--ink);border-color:#1b6b3a}
.dlg-toast.error{background:var(--panel);color:var(--ink);border-color:var(--danger)}
.dlg-toast-icon{flex:none;display:flex;color:#8fb4e8}
.dlg-toast.ok .dlg-toast-icon{color:#1b6b3a}
.dlg-toast.error .dlg-toast-icon{color:var(--danger)}
.dlg-toast-body{flex:1;min-width:0;display:flex;flex-direction:column;gap:2px}
.dlg-toast-title{font-size:14px;font-weight:600}
.dlg-toast-text{font-size:13px;opacity:.85;overflow-wrap:anywhere;white-space:pre-line}
.dlg-btn.small{min-height:44px;padding:0 14px;background:transparent;border-color:#8fb4e8;color:#cfe1fa}
.dlg-toast.ok .dlg-btn.small,.dlg-toast.error .dlg-btn.small{border-color:var(--accent);color:var(--accent)}
.dlg-btn.small.primary{background:var(--accent);border-color:var(--accent);color:#fff}
.dlg-toast-close{flex:none;width:44px;height:44px;border:0;background:transparent;color:inherit;font-size:20px;cursor:pointer;opacity:.7}
@media (max-width:560px){.dlg{padding:18px}.dlg-actions .dlg-btn{flex:1}}

/* Focus areas on the mission page (CLOUD-2134). */
.mission-focus-one{display:grid;gap:8px;margin:10px 0}
.focus-log{list-style:none;margin:0;padding:0;display:grid;gap:4px;font-size:13px}
.focus-log li.now b{color:var(--accent)}
.focus-time{font-family:ui-monospace,monospace;color:var(--muted)}
.focus-picks{display:grid;gap:6px}
.focus-pick{display:flex;align-items:center;gap:10px;padding:8px 10px;border:1px solid var(--line);border-radius:8px;min-height:44px;cursor:pointer}
.focus-pick.on{border:2px solid var(--accent);background:color-mix(in srgb,var(--accent) 8%,transparent)}
.focus-pick input{flex:0 0 18px;width:18px;height:18px;min-height:0;margin:0;padding:0}
.focus-pick span{flex:1;min-width:0}
.focus-pick small{display:block;font-size:11px;color:var(--muted)}
.focus-pick em{font-style:normal;font-size:12px;font-weight:600;color:var(--accent)}
.focus-pick input:disabled ~ span{opacity:.7}

/* Joint operation (CLOUD-2144). */
.joint-chip{position:absolute;z-index:840;top:44px;left:62px;padding:3px 10px;border-radius:999px;font-size:11px;font-weight:700;
  border:1px solid var(--line);background:var(--panel);color:var(--muted)}
.joint-chip.on{background:#7c3aed;border-color:#7c3aed;color:#fff}
body.replaying .joint-chip{display:none}
#side:not([hidden]) ~ .joint-chip{left:calc(var(--side-w) + 62px)}
.joint-pilot .nm small{display:block;font-size:11px}
.joint-pilot .eye{flex:0 0 auto;width:34px;height:34px;border:1px solid var(--line);border-radius:8px;background:var(--panel);
  color:var(--muted);display:inline-flex;align-items:center;justify-content:center;padding:0}
.joint-pilot .eye.on{background:color-mix(in srgb,var(--accent) 14%,transparent);color:var(--accent)}
@media (max-width:760px){.joint-chip{top:36px;left:54px}#side:not([hidden]) ~ .joint-chip{left:calc(var(--side-w) + 54px)}}

/* Retake tasks from Energy OS (CLOUD-2323). */
#retake-box h3{display:flex;align-items:center;justify-content:space-between;gap:8px}
.retake-list{display:grid;gap:8px;margin:8px 0}
.retake-card{border:1px solid var(--line);border-radius:8px;padding:10px 12px;background:var(--panel);display:grid;gap:4px}
.retake-card.done,.retake-card.cancelled{opacity:.65}
.retake-head{display:flex;justify-content:space-between;gap:8px;align-items:flex-start}
.retake-status{font-size:11px;font-weight:600;padding:2px 8px;border-radius:10px;background:color-mix(in srgb,var(--accent) 16%,transparent);color:var(--accent);white-space:nowrap}
.retake-card.in_progress .retake-status{background:color-mix(in srgb,var(--sev-warning) 18%,transparent);color:var(--sev-warning)}
.retake-card.done .retake-status{background:color-mix(in srgb,#1a9e4b 16%,transparent);color:#1a9e4b}
.retake-warn{font-size:12.5px;color:var(--danger);font-weight:600}
.retake-actions{display:flex;gap:8px;flex-wrap:wrap;margin-top:4px}
.retake-actions button{min-height:44px}
.retake-mark span{display:inline-block;padding:3px 8px;border-radius:12px;background:var(--panel);color:var(--ink);border:2px solid var(--sev-warning);font:600 11px system-ui;white-space:nowrap;box-shadow:0 1px 4px rgba(0,0,0,.3)}
.retake-mark.mine span{border-color:var(--accent)}
.retake-pop .retake-card{border:0;padding:0}

/* The map's bottom-right corner (CLOUD-2460): the sync control above the one pole status legend (CLOUD-1863, CLOUD-2401).
   Neither covers the timeline or the scale bar: the corner sits above them and the legend collapses to an icon. */
.pole-corner{position:absolute;z-index:840;right:12px;bottom:34px;display:flex;flex-direction:column;align-items:flex-end;gap:8px;
  max-width:min(300px,calc(100vw - 24px));pointer-events:none}
.pole-corner>*{pointer-events:auto}
#side:not([hidden]) ~ .pole-corner{max-width:min(300px,calc(100vw - var(--side-w) - 24px))}
body.replaying .pole-corner{display:none}
.pole-legend{position:relative;padding:10px 12px;border-radius:10px;border:1px solid var(--line);background:var(--panel);color:var(--ink);
  box-shadow:0 1px 6px rgba(0,0,0,.25);display:grid;gap:8px}
.pole-legend[hidden]{display:none}
.pole-legend-body{display:grid;gap:8px}
/* CLOUD-2401: the control and the collapsed state: the icon alone. */
.pole-legend-toggle{position:absolute;top:4px;right:4px;width:28px;height:28px;min-width:0;padding:0;display:grid;place-items:center;
  border-radius:50%;border:1px solid var(--line);background:var(--panel);color:var(--ink)}
.pole-legend-toggle .pl-ico-show{display:none}
.pole-legend-body .pole-legend-list{padding-right:30px}
.pole-legend.collapsed{padding:0;gap:0;width:32px;height:32px;border-radius:50%}
.pole-legend.collapsed .pole-legend-body{display:none}
.pole-legend.collapsed .pole-legend-toggle{position:static;width:30px;height:30px;border:0}
.pole-legend.collapsed .pl-ico-hide{display:none}
.pole-legend.collapsed .pl-ico-show{display:block}
.pole-legend-list{display:grid;gap:3px;font-size:12px;line-height:1.4}
.pole-legend-list .pl-row{display:flex;align-items:center;gap:6px}
.pole-legend-list .pl-foot{font-size:11px}
.rl-swatch{display:inline-block;flex:none;width:12px;height:12px;border-radius:50%;border:2px solid #1f2937;box-sizing:border-box}
.rl-swatch.hollow{background:transparent;border-width:3px}
.rl-ring{background:#FACC15;margin:0 2px}
/* The sync control: Update, when it last ran, the controllers' state (CLOUD-2435, CLOUD-2436). */
.pole-sync{position:relative;display:flex;align-items:center;gap:8px;flex-wrap:wrap;justify-content:flex-end;padding:6px 8px;border-radius:10px;
  border:1px solid var(--line);background:var(--panel);color:var(--ink);box-shadow:0 1px 6px rgba(0,0,0,.25)}
.pole-sync[hidden]{display:none}
.pole-sync .sub{font-size:11.5px}
.pole-sync button{position:relative;min-height:44px;min-width:88px}
.pole-sync .pl-dot{position:absolute;top:-2px;right:-2px;width:10px;height:10px;border-radius:50%;background:var(--accent);border:2px solid var(--panel)}
.pole-sync .pl-dot.bad{background:var(--danger)}
.pole-sync .pl-dot[hidden]{display:none}
.pole-sync .pl-update-ico,.pole-sync .pl-short{display:none}
/* Open on a small screen: compact, never more than the lower corner (CLOUD-2401). */
@media (max-width:1023px){
  .pole-corner{bottom:28px}
  .pole-legend:not(.collapsed){padding:6px 8px;gap:4px;max-width:min(210px,calc(100vw - 24px))}
  .pole-legend:not(.collapsed) .pole-legend-list{font-size:11px;gap:2px}
  .pole-sync{padding:4px 6px;flex-wrap:nowrap}
  .pole-sync .pl-full,.pole-sync .pl-update-text{display:none}
  .pole-sync .pl-short{display:inline}
  .pole-sync .pl-update-ico{display:block}
  .pole-sync button{min-width:44px;padding:0 8px}
}
.pole-legend-error{font-size:12px;font-weight:600;color:var(--danger)}
.pole-legend-sync{list-style:none;margin:0;padding:0;display:grid;gap:2px;font-size:11.5px}
.pole-legend-sync[hidden]{display:none}
.pole-legend-sync li{display:flex;align-items:center;gap:6px}
.pole-legend-sync li::before{content:"";flex:none;width:8px;height:8px;border-radius:50%;background:var(--muted,#6b7280)}
.pole-legend-sync li.synced::before{background:#1b6b3a}
.pole-legend-sync li.syncing::before,.pole-legend-sync li.pending::before{background:#d97706}
.pole-legend-sync li.failed{color:var(--danger);font-weight:600}
.pole-legend-sync li.failed::before{background:var(--danger)}
.pole-sync .pole-legend-sync,.pole-sync .pole-legend-error{flex-basis:100%}

/* Pilot mode (CLOUD-2400): the pilot-side pieces (.pm-pilot) leave the admin view, the admin-only ones (.pm-admin) leave Pilot mode. View only. */
body.pm-admin-view .pm-pilot,body.pm-pilot-view .pm-admin{display:none!important}
.pilot-mode{display:inline-flex;align-items:center;gap:6px}
.pilot-mode svg{flex:0 0 auto;display:block}
.pilot-mode .pm-label{font-size:12px}
.pilot-mode[aria-pressed="true"]{border-color:var(--accent,currentColor);color:var(--accent,inherit);font-weight:600}

/* A layer's points (CLOUD-2433), opened from its count in Layers, and what the map shows per layer. */
.layer-row button.n{background:none;border:0;padding:2px 6px;border-radius:999px;cursor:pointer;color:var(--accent);text-decoration:underline dotted}
.layer-row button.n:hover{background:var(--bg)}
.layer-points{border:1px solid var(--line);border-radius:8px;padding:8px;margin:8px 0;display:grid;gap:6px}
.layer-points-head{display:flex;align-items:center;justify-content:space-between;gap:8px}
.layer-points-list{max-height:320px;overflow:auto;border-top:1px solid var(--line)}
.layer-points-list .item{display:flex;align-items:center;gap:8px;padding:6px 4px}
.layer-points-list .item .zoomto{background:none;border:0;color:var(--muted);padding:0 6px;font-size:15px;cursor:pointer}
.layer-points-list .item .zoomto:hover{color:var(--accent)}
.map-counts{position:absolute;z-index:830;left:12px;bottom:34px;max-width:min(260px,calc(100vw - 24px));padding:4px 10px;border-radius:10px;
  border:1px solid var(--line);background:var(--panel);color:var(--ink);box-shadow:0 1px 6px rgba(0,0,0,.25);font-size:12px}
.map-counts[hidden]{display:none}
.map-counts summary{cursor:pointer;font-weight:600;min-height:28px;display:flex;align-items:center}
.map-counts ul{list-style:none;margin:4px 0 2px;padding:0;display:grid;gap:2px;max-height:200px;overflow:auto}
.map-counts li{display:flex;justify-content:space-between;gap:12px}
.map-counts li span:last-child{font-variant-numeric:tabular-nums;color:var(--muted)}
#side:not([hidden]) ~ .map-counts{left:calc(var(--side-w) + 12px)}
body.replaying .map-counts{display:none}

/* The points under one click (CLOUD-2434). */
.overlap-pop .leaflet-popup-content{margin:8px 10px}
.overlap-list{display:grid;gap:4px;max-height:260px;overflow:auto}
.overlap-head{font-weight:700;font-size:12.5px;padding:2px 2px 4px}
.overlap-item{display:grid;grid-template-columns:1fr;gap:1px;text-align:left;min-height:44px;padding:6px 8px;border:1px solid var(--line);border-radius:8px;background:var(--panel);color:var(--ink);cursor:pointer}
.overlap-item:hover,.overlap-item:focus-visible{border-color:var(--accent);background:var(--bg)}
.overlap-item .layer{font-size:11.5px;color:var(--muted)}
.overlap-item .co{font-size:11.5px;color:var(--muted);font-variant-numeric:tabular-nums}

/* The Mission Planner is not answering (CLOUD-1726): a plain message, not a broken screen. */
.planner-down-note{margin:0 0 10px;padding:8px 10px;border:1px solid var(--warn,#b7791f);border-radius:6px;font-size:13px}
.planner-icon.down{opacity:.65;border-style:dashed}
.pl-health-list{display:grid;grid-template-columns:max-content 1fr;gap:4px 14px;margin:0 0 8px;font-size:13px}
.pl-health-list dt{color:var(--muted)}
.pl-health-list dd{margin:0}

/* A pilot's mission beside them in Fleet (CLOUD-2138): its own block inside the RC card. */
.fleet-mission{margin-top:8px;padding:10px;border:1px solid var(--line);border-radius:8px;background:color-mix(in srgb,var(--accent) 5%,transparent);
  display:flex;flex-direction:column;gap:4px}
.fleet-mission-head{display:flex;justify-content:space-between;align-items:center;gap:8px;font-size:11px;letter-spacing:.04em;text-transform:uppercase;color:var(--muted)}
.fleet-mission-name{font-weight:600}
.fleet-mission .card-actions{margin-top:6px;gap:8px;flex-wrap:wrap}
.fleet-mission .card-actions button{min-height:44px;flex:1 1 auto}

/* Plan a mission in four steps, all in view (CLOUD-2138): 1 Type, 2 Where, 3 Who, 4 When, and a bar that fills as each is done. */
.plan-progress-row{display:flex;align-items:center;gap:10px;margin-bottom:8px}
.plan-progress{flex:1;display:flex;gap:6px;list-style:none;margin:0;padding:0}
.plan-progress li{flex:1;height:4px;border-radius:2px;background:var(--line)}
.plan-progress li.done{background:var(--accent)}
.plan-step{border:1px solid var(--line);border-radius:8px;margin:0 0 10px;padding:8px 10px 10px;min-width:0}
.plan-step>legend{padding:0 6px;font-size:11px;font-weight:700;letter-spacing:.06em;text-transform:uppercase;color:var(--muted)}

/* The plan form must not run past the panel at a tablet width (CLOUD-2138): a time input has a width of its own, so the grid's
   columns and the fields may shrink below it. */
.mission-field,.mission-when>*{min-width:0}
.mission-field select,.mission-field input{width:100%;min-width:0;box-sizing:border-box}
.mission-feeders .tool-row button{max-width:100%}
.mission-actions{flex-wrap:wrap}
.mission-actions button{flex:1 1 auto}
