/* ==========================================================================
   Fire Watch Live - route.css
   The corridor strip-map (route view). KPI strip, legend, vertical spine,
   town nodes, clear-stretch segments, fire cards, live "you are here"
   marker, sources, disclaimer. Owned by Stream B.
   ========================================================================== */

/* ---------- KPI strip ---------- */
.kpis{display:grid;grid-template-columns:repeat(5,1fr);gap:14px;margin:34px 0 8px}
.kpi{
  background:linear-gradient(160deg,var(--panel),var(--bg2));border:1px solid var(--line);
  border-radius:14px;padding:20px 18px;position:relative;overflow:hidden;
  opacity:0;transform:translateY(16px);animation:rise-in .6s cubic-bezier(.2,.7,.2,1) forwards;
}
.kpi::before{content:"";position:absolute;left:0;top:0;bottom:0;width:3px;background:var(--ember)}
.kpi.k-crit::before{background:var(--crit)} .kpi.k-ok::before{background:var(--ok)}
.kpi .num{font-family:"Anton",sans-serif;font-size:clamp(28px,3.4vw,44px);line-height:1;letter-spacing:.01em}
.kpi .num small{font-size:.46em;color:var(--muted);font-family:"Barlow Condensed";letter-spacing:.04em;margin-left:3px}
.kpi .lbl{font-family:"IBM Plex Mono",monospace;font-size:10.5px;letter-spacing:.16em;text-transform:uppercase;color:var(--muted);margin-top:9px}

/* ---------- section heads ---------- */
.shead{display:flex;align-items:baseline;gap:16px;margin:54px 0 8px}
.shead h2{font-family:"Barlow Condensed";font-weight:700;text-transform:uppercase;letter-spacing:.06em;
  font-size:clamp(20px,2.4vw,28px);margin:0}
.shead .rule{flex:1;height:1px;background:linear-gradient(90deg,var(--line2),transparent)}
.shead .idx{font-family:"IBM Plex Mono";color:var(--ember);font-size:13px}

/* ---------- legend ---------- */
.legend{display:flex;flex-wrap:wrap;gap:10px 22px;margin:16px 0 6px;font-family:"IBM Plex Mono";font-size:11.5px;color:var(--muted)}
.legend .it{display:flex;align-items:center;gap:8px}
.swatch{width:13px;height:13px;border-radius:4px;box-shadow:0 0 10px -1px currentColor}
.s-crit{background:var(--crit);color:var(--crit)} .s-high{background:var(--high);color:var(--high)}
.s-elev{background:var(--elev);color:var(--elev)} .s-ok{background:var(--ok);color:var(--ok)}
.s-clear{background:var(--teal);color:var(--teal)}
.s-you{background:#fff3d6;color:#fff3d6;border-radius:50%}

/* ---------- the route spine ---------- */
.route{position:relative;margin:30px 0 0;padding:8px 0}
.route::before{ /* the spine */
  content:"";position:absolute;left:50%;top:0;bottom:0;width:4px;transform:translateX(-50%);
  background:linear-gradient(180deg,var(--route-a),var(--route-b) 46%,var(--route-c));
  border-radius:4px;box-shadow:0 0 24px rgba(255,120,30,.45);
}
.route::after{ /* travelling pulse (ambient, when no live position) */
  content:"";position:absolute;left:50%;top:0;width:12px;height:12px;transform:translate(-50%,-50%);
  border-radius:50%;background:#fff3d6;box-shadow:0 0 16px 4px rgba(255,200,120,.9);
  animation:travel 7s linear infinite;
}
.route.has-live::after{display:none}   /* hide ambient pulse once we have a real fix */
@keyframes travel{0%{top:0;opacity:0}6%{opacity:1}94%{opacity:1}100%{top:100%;opacity:0}}

/* live "you are here" marker, positioned by JS via --you-top (% down the spine) */
.youmark{
  position:absolute;left:50%;top:var(--you-top,0%);transform:translate(-50%,-50%);
  z-index:5;pointer-events:none;
  transition:top .8s cubic-bezier(.3,.7,.2,1);
}
.youmark .dot{
  width:16px;height:16px;border-radius:50%;background:#fff3d6;
  box-shadow:0 0 0 4px rgba(255,160,60,.35),0 0 18px 5px rgba(255,200,120,.9);
  animation:youpulse 2s ease-out infinite;
}
@keyframes youpulse{0%{box-shadow:0 0 0 4px rgba(255,160,60,.4),0 0 0 0 rgba(255,200,120,.6)}
  70%{box-shadow:0 0 0 4px rgba(255,160,60,.2),0 0 0 18px rgba(255,200,120,0)}
  100%{box-shadow:0 0 0 4px rgba(255,160,60,.4),0 0 0 0 rgba(255,200,120,0)}}
.youmark .lbl{
  position:absolute;left:24px;top:50%;transform:translateY(-50%);white-space:nowrap;
  font-family:"IBM Plex Mono";font-size:10px;letter-spacing:.12em;text-transform:uppercase;
  color:#1a1208;background:#fff3d6;padding:3px 8px;border-radius:999px;font-weight:600;
  box-shadow:0 4px 14px -4px rgba(0,0,0,.6);
}

/* inline "enable location" hint at the top of the spine (shown until we get a fix) */
.route-locate-hint{
  position:relative;z-index:4;display:flex;align-items:center;gap:10px;
  margin:0 auto 18px;width:max-content;max-width:min(92%,420px);cursor:pointer;appearance:none;
  font-family:"IBM Plex Mono",monospace;font-size:11.5px;letter-spacing:.06em;text-transform:uppercase;
  color:var(--ink);text-align:left;
  background:linear-gradient(160deg,var(--panel2),var(--panel));
  border:1px solid rgba(255,138,31,.4);border-radius:999px;padding:11px 18px;min-height:44px;
  box-shadow:0 8px 24px -12px rgba(0,0,0,.8),0 0 0 3px rgba(255,138,31,.06);
  transition:border-color .2s,transform .1s;
}
.route-locate-hint:hover{border-color:var(--ember)}
.route-locate-hint:active{transform:translateY(1px)}
.route-locate-hint:focus-visible{outline:2px solid var(--ember);outline-offset:3px}
.route-locate-hint[hidden]{display:none}
.route-locate-hint .rlh-dot{color:var(--ember);font-size:16px;line-height:1;animation:rlh-pulse 2s ease-in-out infinite}
@keyframes rlh-pulse{0%,100%{opacity:1}50%{opacity:.5}}
@media(prefers-reduced-motion:reduce){.route-locate-hint .rlh-dot{animation:none}}

.node{position:relative;display:grid;grid-template-columns:1fr 72px 1fr;align-items:center;
  padding:14px 0;opacity:0;transform:translateY(20px);animation:rise-in .6s cubic-bezier(.2,.7,.2,1) forwards}

/* marker on the spine */
.pin{grid-column:2;justify-self:center;position:relative;z-index:3}
.pin .ring{width:18px;height:18px;border-radius:50%;background:var(--bg);border:3px solid var(--ember);
  display:grid;place-items:center}
.pin .core{width:7px;height:7px;border-radius:50%;background:var(--ember)}
.node.town .pin .ring{border-color:var(--teal)} .node.town .pin .core{background:var(--teal)}
.node.origin .pin .ring,.node.dest .pin .ring{width:24px;height:24px;border-color:var(--ink)}
.node.origin .pin .core,.node.dest .pin .core{width:10px;height:10px;background:var(--ink)}

.node.fire .pin .ring{animation:firepulse 2.4s ease-out infinite}
.node.fire.sev-critical .pin .ring{border-color:var(--crit)} .node.fire.sev-critical .pin .core{background:var(--crit)}
.node.fire.sev-high .pin .ring{border-color:var(--high)} .node.fire.sev-high .pin .core{background:var(--high)}
.node.fire.sev-elevated .pin .ring{border-color:var(--elev)} .node.fire.sev-elevated .pin .core{background:var(--elev)}
.node.fire.sev-low .pin .ring{border-color:var(--ok)} .node.fire.sev-low .pin .core{background:var(--ok)}
.node.fire.sev-contained .pin .ring{border-color:var(--ok)} .node.fire.sev-contained .pin .core{background:var(--ok)}
@keyframes firepulse{0%{box-shadow:0 0 0 0 rgba(255,90,30,.5)}70%{box-shadow:0 0 0 16px rgba(255,90,30,0)}100%{box-shadow:0 0 0 0 rgba(255,90,30,0)}}

/* connector */
.node .card{position:relative}
.node.side-E .card{grid-column:3;margin-left:14px}
.node.side-W .card{grid-column:1;margin-right:14px;text-align:right}
.node .card::before{content:"";position:absolute;top:28px;width:18px;height:2px;background:var(--line2)}
.node.side-E .card::before{left:-18px}
.node.side-W .card::before{right:-18px}

/* cards */
.card{
  background:linear-gradient(165deg,var(--panel2),var(--panel));
  border:1px solid var(--line);border-radius:14px;padding:18px 18px 16px;box-shadow:var(--shadow);
}
.card .chips{display:flex;gap:8px;align-items:center;flex-wrap:wrap;margin-bottom:9px}
.node.side-W .card .chips{justify-content:flex-end}
.chip{font-family:"IBM Plex Mono";font-size:10px;letter-spacing:.12em;text-transform:uppercase;
  padding:4px 9px;border-radius:999px;border:1px solid var(--line2);color:var(--muted)}
.chip.sev{color:#1a1208;font-weight:600;border:none}
.sev-critical .chip.sev{background:var(--crit)} .sev-high .chip.sev{background:var(--high)}
.sev-elevated .chip.sev{background:var(--elev)} .sev-low .chip.sev{background:var(--ok)}
.sev-contained .chip.sev{background:var(--ok)}
.chip.dir{color:var(--ink);border-color:var(--line2)}
.chip.dir b{color:var(--ember);font-weight:600}
.chip.threat{color:#1a1208;font-weight:600;border:none}
.chip.threat.t-normal{background:var(--ok)} .chip.threat.t-watch{background:var(--elev)}
.chip.threat.t-elevated{background:var(--high)} .chip.threat.t-critical{background:var(--crit);color:#fff}
.chip.live-dist{background:#fff3d6;color:#1a1208;font-weight:600;border:none}

.fname{font-family:"Anton",sans-serif;font-weight:400;text-transform:uppercase;letter-spacing:.01em;
  font-size:clamp(22px,2.5vw,30px);line-height:1;margin:2px 0 4px}
.floc{font-family:"IBM Plex Mono";font-size:11.5px;color:var(--muted);margin-bottom:13px}

.stats{display:flex;gap:18px;flex-wrap:wrap;margin-bottom:12px}
.node.side-W .stats{justify-content:flex-end}
.stat{display:flex;flex-direction:column;gap:1px}
.stat b{font-family:"Anton";font-weight:400;font-size:21px;line-height:1}
.stat span{font-family:"IBM Plex Mono";font-size:9.5px;letter-spacing:.12em;text-transform:uppercase;color:var(--faint)}
.stat.hot b{color:var(--crit)}

.bar{height:7px;border-radius:6px;background:rgba(255,255,255,.07);overflow:hidden;margin-bottom:12px;position:relative}
.bar i{position:absolute;left:0;top:0;bottom:0;border-radius:6px;width:0;
  background:linear-gradient(90deg,var(--ok),#bfe96b);transition:width 1.2s cubic-bezier(.2,.7,.2,1) .2s}
.bar.zero i{background:var(--crit)}
.barlbl{display:flex;justify-content:space-between;font-family:"IBM Plex Mono";font-size:10px;color:var(--faint);margin:-6px 0 11px;text-transform:uppercase;letter-spacing:.1em}

.threat-reason{font-family:"IBM Plex Mono";font-size:11px;color:#e7c9b8;line-height:1.65;
  border-left:2px solid var(--high);padding-left:10px;margin:0 0 12px}
.node.side-W .threat-reason{border-left:0;border-right:2px solid var(--high);padding-left:0;padding-right:10px;text-align:right}

.note{font-size:14px;color:#cdc3b4;margin:0}
.node.side-W .note{text-align:right}

.flink{display:inline-block;margin-top:11px;font-family:"IBM Plex Mono";font-size:11px;
  letter-spacing:.08em;text-transform:uppercase;color:var(--teal);text-decoration:none}
.flink:hover{text-decoration:underline}

/* town / segment nodes */
.node.town .tcard,.node.origin .tcard,.node.dest .tcard{grid-column:1 / -1;justify-self:center;text-align:center;max-width:480px}
.tname{font-family:"Barlow Condensed";font-weight:700;text-transform:uppercase;letter-spacing:.08em;
  font-size:clamp(17px,2vw,22px);margin:0}
.tname .st{color:var(--ember);font-size:.62em;font-family:"IBM Plex Mono";letter-spacing:.1em;margin-left:8px}
.tmeta{font-family:"IBM Plex Mono";font-size:11px;color:var(--muted);margin-top:5px}
.node.dest .tname,.node.origin .tname{font-family:"Anton";font-weight:400;font-size:clamp(26px,3.4vw,40px);letter-spacing:.01em}

/* clear segment connector label */
.seg{position:relative;display:grid;grid-template-columns:1fr 72px 1fr;padding:2px 0}
.seg .lbl{grid-column:2;justify-self:center;background:var(--bg);border:1px solid var(--line);
  border-radius:999px;padding:7px 14px;width:max-content;min-width:130px;text-align:center;z-index:2;
  font-family:"IBM Plex Mono";font-size:10.5px;letter-spacing:.08em;color:var(--muted);text-transform:uppercase;white-space:nowrap}
.seg .lbl.clear{color:var(--teal);border-color:rgba(57,198,176,.3)}
.seg .lbl b{color:var(--ink)}

/* ---------- methodology / sources / footer ---------- */
.grid2{display:grid;grid-template-columns:1.3fr 1fr;gap:18px;margin-top:22px}
.box{background:linear-gradient(165deg,var(--panel2),var(--panel));border:1px solid var(--line);border-radius:14px;padding:22px}
.box h3{font-family:"Barlow Condensed";text-transform:uppercase;letter-spacing:.06em;font-size:16px;margin:0 0 12px;color:var(--ember)}
.box ul{margin:0;padding-left:18px;color:#cdc3b4;font-size:14px}
.box li{margin-bottom:8px}
.box li b{color:var(--ink)}
.src{font-family:"IBM Plex Mono";font-size:12.5px;color:var(--muted);line-height:1.6;word-break:break-word}
.src .src-row{margin-bottom:14px}
.src .src-name{display:block;color:var(--muted)}
.src a{color:var(--teal);text-decoration:none;display:inline-block;padding:6px 0;min-height:40px;line-height:1.4}
.src a:hover{text-decoration:underline}
.src .src-status{font-size:10.5px;letter-spacing:.08em;text-transform:uppercase}
.src .src-status.ok{color:var(--ok)} .src .src-status.down{color:var(--crit)}

.disclaimer{margin-top:28px;border:1px solid rgba(255,53,38,.28);background:rgba(255,53,38,.06);
  border-radius:14px;padding:18px 20px;font-size:13.5px;color:#e9cfc6;display:flex;gap:14px;align-items:flex-start}
.disclaimer .x{font-family:"Anton";color:var(--crit);font-size:26px;line-height:1}
footer{margin-top:40px;padding-top:22px;border-top:1px solid var(--line);
  font-family:"IBM Plex Mono";font-size:11.5px;color:var(--muted);display:flex;flex-wrap:wrap;gap:8px 20px;justify-content:space-between}

/* empty / fallback states */
.route-empty{font-family:"IBM Plex Mono";font-size:13px;color:var(--muted);padding:40px 0;text-align:center}

/* ==========================================================================
   Mobile (≤820px) - SPEC §9 fixes:
   - spine moves left; connector stubs + segment pills attach to it
   - source links keep ≥40px tap targets (set above, display:inline-block)
   ========================================================================== */
@media(max-width:820px){
  .kpis{grid-template-columns:repeat(2,1fr)}
  .kpi:nth-child(5){grid-column:1 / -1}

  .route::before,.route::after{left:24px}
  .youmark{left:24px}
  .youmark .lbl{left:20px}

  .node,.seg{grid-template-columns:48px 1fr;gap:0}
  .pin{grid-column:1;justify-self:center}

  .node .card,.node.side-E .card,.node.side-W .card{grid-column:2;margin:0 0 0 24px;text-align:left}
  .node.side-W .card{text-align:left}
  .node.side-W .card .chips,.node.side-W .stats{justify-content:flex-start}
  .node.side-W .note,.node.side-W .threat-reason{text-align:left}
  .node.side-W .threat-reason{border-right:0;border-left:2px solid var(--high);padding-right:0;padding-left:10px}

  /* connector stub widened to ~40px so the card visually attaches to the spine */
  .node .card::before,.node.side-E .card::before,.node.side-W .card::before{
    left:-40px;right:auto;width:40px;top:26px;background:var(--line2);height:2px}

  .node.town .tcard,.node.origin .tcard,.node.dest .tcard{grid-column:2;justify-self:start;text-align:left;margin-left:24px}

  /* spine sits at left:24px on mobile -> left-align the locate hint with the cards */
  .route-locate-hint{margin:0 0 18px 24px}

  /* segment pill: left-aligned and tethered to the spine with a connector */
  .seg{align-items:center}
  .seg .lbl{grid-column:2;justify-self:start;margin-left:24px;position:relative}
  .seg .lbl::before{content:"";position:absolute;left:-40px;top:50%;width:40px;height:2px;
    transform:translateY(-50%);background:var(--line2)}
  .seg .lbl.clear::before{background:rgba(57,198,176,.4)}

  .grid2{grid-template-columns:1fr}
}
