/* ═══════════════════════════════════════════════════
   TransOpt — Layout & Components  (Senior-level UI)
   ═══════════════════════════════════════════════════ */

/* ── RESET ── */
*{box-sizing:border-box;margin:0;padding:0}
html,body{height:100%}

/* ── Chart.js wrapper ── */
.chart-wrap{position:relative;width:100%;min-width:0}
.chart-wrap>canvas{display:block}

/* ── Base body ── */
body{
  font-family:var(--ff);
  background:var(--bg);
  background-image:var(--bg-grad);
  background-attachment:fixed;
  color:var(--text);
  font-size:var(--fs-md);
  line-height:var(--lh);
  -webkit-font-smoothing:antialiased;
  letter-spacing:.1px;
}

/* ── Smooth transitions for theme switch ── */
body,.side,.topbar,.card,.kpi,.nav-item,.ctrl select,.field select,.ritem,.tbl th,.tbl tbody tr{
  transition:background-color var(--anim-med),color var(--anim-med),border-color var(--anim-med),box-shadow var(--anim-med);
}

a{color:inherit;text-decoration:none}
button,input,select{font-family:inherit}
:focus-visible{outline:2px solid var(--primary);outline-offset:2px;border-radius:4px}

/* ── Custom scrollbar ── */
::-webkit-scrollbar{width:7px;height:7px}
::-webkit-scrollbar-thumb{background:var(--border-2);border-radius:var(--r-full)}
::-webkit-scrollbar-thumb:hover{background:var(--text-mut)}
::-webkit-scrollbar-track{background:transparent}

/* ══════════════════════════════════════════
   DASHBOARD GRID LAYOUT
══════════════════════════════════════════ */
.app{
  display:grid;
  grid-template-columns:var(--sidebar) 1fr;
  grid-template-rows:var(--topbar) 1fr;
  grid-template-areas:"side top" "side main";
  height:100vh;
  overflow:hidden;
}

/* ══════════════════════════════════════════
   SIDEBAR
══════════════════════════════════════════ */
.side{
  grid-area:side;
  background:var(--side-grad);
  border-right:1px solid var(--border);
  display:flex;flex-direction:column;
  overflow-y:auto;z-index:7;
}

.side-brand{
  display:flex;align-items:center;gap:var(--s3);flex:none;
  padding:0 var(--s5);height:var(--topbar);
  border-bottom:1px solid var(--border);
}
.side-brand .logo{
  width:34px;height:34px;border-radius:var(--r1);
  overflow:hidden;flex:none;
  box-shadow:0 4px 14px -4px var(--primary-glow);
}
.side-brand .logo img{width:100%;height:100%;display:block}
.side-brand b{font-size:var(--fs-md);letter-spacing:.3px;font-weight:var(--fw-bold)}
.side-brand span{display:block;font-size:var(--fs-xs);color:var(--text-mut);margin-top:1px}

.side-nav{display:flex;flex-direction:column;gap:2px;padding:var(--s4) var(--s3)}

.nav-item{
  position:relative;display:flex;align-items:center;gap:11px;
  padding:10px 12px;border-radius:var(--r1);
  color:var(--text-dim);cursor:pointer;
  transition:background var(--anim-fast),color var(--anim-fast),transform var(--anim-fast);
  font-size:var(--fs-sm);white-space:nowrap;
}
.nav-item .ic-svg{flex:none;opacity:.75;transition:opacity var(--anim-fast)}
.nav-item:hover{color:var(--text);background:var(--surface);transform:translateX(2px)}
.nav-item:hover .ic-svg{opacity:1}
.nav-item.active{color:var(--primary);font-weight:var(--fw-semi);background:var(--primary-soft)}
.nav-item.active .ic-svg{opacity:1}
.nav-item.active::before{
  content:'';position:absolute;left:0;top:6px;bottom:6px;
  width:3px;border-radius:0 2px 2px 0;background:var(--primary);
}
/* Admin nav special */
.nav-item[data-v="admin"]{color:var(--accent)}
.nav-item[data-v="admin"]:hover{background:var(--accent-soft)}
.nav-item[data-v="admin"].active{background:var(--accent-soft);color:var(--accent)}
.nav-item[data-v="admin"].active::before{background:var(--accent)}

/* Nav separator */
.nav-separator{height:1px;background:var(--border);margin:8px 12px}
.admin-nav-hint{
  font-size:10px;font-weight:var(--fw-bold);text-transform:uppercase;
  letter-spacing:.8px;color:var(--text-mut);
  padding:2px 20px 6px;
}

/* ══════════════════════════════════════════
   TOPBAR
══════════════════════════════════════════ */
.topbar{
  grid-area:top;
  background:var(--bg-2);
  border-bottom:1px solid var(--border);
  display:flex;align-items:center;
  justify-content:space-between;
  padding:0 var(--s5);z-index:6;
}

/* Topbar control groups */
.topbar-controls{display:flex;align-items:center;gap:0;flex-wrap:nowrap}
.ctrl-group{
  display:flex;align-items:center;gap:6px;
  padding:0 14px;border-right:1px solid var(--border);
  font-size:12px;color:var(--text-mut);font-weight:var(--fw-medium);
  white-space:nowrap;
}
.ctrl-group:first-child{padding-left:0}
.ctrl-group:last-child{border-right:none}
.ctrl-group select{
  background:var(--surface-2);border:1px solid var(--border-2);
  color:var(--text);border-radius:6px;padding:5px 8px;
  font-size:12px;cursor:pointer;outline:none;
  transition:border-color var(--anim-fast);
}
.ctrl-group select:hover,
.ctrl-group select:focus{border-color:var(--primary)}
.ctrl-group input[type="range"]{
  width:70px;accent-color:var(--primary);cursor:pointer;
}
.ctrl-val{
  font-weight:var(--fw-bold);color:var(--primary);
  min-width:26px;text-align:right;font-size:13px;
  font-variant-numeric:tabular-nums;
}
.ctrl-sync-label{
  display:flex;align-items:center;gap:5px;
  font-size:12px;font-weight:var(--fw-bold);
  color:var(--primary);cursor:pointer;
}
.ctrl-sync-label input{accent-color:var(--primary);cursor:pointer;width:14px;height:14px}

/* Theme toggle */
.theme-toggle{
  position:relative;width:52px;height:29px;
  border-radius:var(--r-full);border:1px solid var(--border-2);
  background:var(--surface-2);cursor:pointer;flex:none;padding:0;
}
.theme-toggle .knob{
  position:absolute;top:2px;left:2px;
  width:23px;height:23px;border-radius:50%;
  background:linear-gradient(135deg,var(--primary),var(--info));
  display:grid;place-items:center;font-size:12px;
  transition:transform .25s cubic-bezier(.4,0,.2,1);
  box-shadow:0 2px 6px -1px rgba(0,0,0,.35);
}
[data-theme="light"] .theme-toggle .knob{transform:translateX(23px)}

/* User box */
.user-box2{
  display:flex;align-items:center;gap:10px;
  padding:6px 14px;border-radius:var(--r1);
  background:var(--surface);border:1px solid var(--border);
  transition:background var(--anim-fast),border-color var(--anim-fast);
}
.user-box2:hover{background:var(--surface-2);border-color:var(--border-2)}
.user-avatar2{
  width:32px;height:32px;border-radius:50%;flex:none;
  background:linear-gradient(135deg,var(--primary),var(--info));
  color:#fff;display:grid;place-items:center;
  font-weight:var(--fw-black);font-size:14px;
}
.user-details{display:flex;flex-direction:column;line-height:1.25}
.user-details b{font-size:13px;font-weight:var(--fw-bold);color:var(--text)}
.user-role-badge{
  font-size:9px;font-weight:var(--fw-black);letter-spacing:.6px;
  text-transform:uppercase;padding:1px 6px;border-radius:3px;
  display:inline-block;margin-top:2px;
}
.user-role-badge.admin{background:var(--accent-soft);color:var(--accent)}
.user-role-badge.user-badge{background:var(--primary-soft);color:var(--primary)}
.logout-btn2{
  width:30px;height:30px;border-radius:50%;border:none;
  background:transparent;color:var(--text-mut);cursor:pointer;
  display:grid;place-items:center;
  transition:background var(--anim-fast),color var(--anim-fast);
}
.logout-btn2:hover{background:var(--danger-soft);color:var(--danger)}

/* ══════════════════════════════════════════
   MAIN CONTENT AREA
══════════════════════════════════════════ */
.main{grid-area:main;overflow:auto;padding:var(--s6)}
.view{display:none}
.view.active{display:block;animation:viewRise .28s cubic-bezier(.2,.7,.2,1)}
@keyframes viewRise{
  from{opacity:0;transform:translateY(10px)}
  to{opacity:1;transform:translateY(0)}
}
@keyframes spin{from{transform:rotate(0deg)}to{transform:rotate(360deg)}}

/* ── View header ── */
.view-head{margin-bottom:var(--s5)}
.view-head h2{
  font-size:var(--fs-2xl);font-weight:var(--fw-black);letter-spacing:-.6px;
  background:linear-gradient(100deg,var(--text) 60%,var(--text-dim));
  -webkit-background-clip:text;background-clip:text;-webkit-text-fill-color:transparent;
}
.view-head p{color:var(--text-mut);font-size:var(--fs-sm);margin-top:5px;line-height:1.6}

/* ══════════════════════════════════════════
   KPI TILES
══════════════════════════════════════════ */
.kpis{display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:var(--s4);margin-bottom:var(--s6)}
.kpi{
  position:relative;overflow:hidden;
  background:linear-gradient(160deg,var(--surface),var(--bg-2));
  border:1px solid var(--border);border-radius:var(--r2);
  padding:var(--s5);
  transition:border-color var(--anim-med),transform var(--anim-med),box-shadow var(--anim-med);
  box-shadow:var(--card-shadow);
}
.kpi::after{
  content:"";position:absolute;inset:0 0 auto auto;
  width:110px;height:110px;
  background:radial-gradient(circle,var(--primary-soft),transparent 70%);
  transform:translate(40%,-40%);pointer-events:none;
}
.kpi:hover{border-color:var(--border-2);transform:translateY(-2px);box-shadow:var(--sh2)}
.kpi-ic{
  position:relative;width:34px;height:34px;border-radius:var(--r1);
  display:grid;place-items:center;
  background:var(--primary-soft);color:var(--primary);margin-bottom:var(--s3);
}
.kpi-ic.accent{background:var(--accent-soft);color:var(--accent)}
.kpi-ic.violet{background:var(--violet-soft);color:var(--violet)}
.kpi-ic.info{background:var(--info-soft);color:var(--info)}
.kpi-ic.danger{background:var(--danger-soft);color:var(--danger)}
.kpi .v{
  font-size:var(--fs-2xl);font-weight:var(--fw-black);color:var(--primary);
  line-height:1;letter-spacing:-.5px;font-variant-numeric:tabular-nums;position:relative;
}
.kpi .v.accent{color:var(--accent)}
.kpi .v.violet{color:var(--violet)}
.kpi .v.muted{color:var(--text-dim)}
.kpi .l{
  font-size:var(--fs-xs);color:var(--text-mut);margin-top:8px;
  text-transform:uppercase;letter-spacing:.6px;font-weight:var(--fw-semi);line-height:1.4;
}

/* ══════════════════════════════════════════
   CARDS
══════════════════════════════════════════ */
.grid2{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:var(--s5)}

.card{
  background:var(--surface);border:1px solid var(--border);
  border-radius:var(--r2);padding:var(--s5);
  box-shadow:var(--card-shadow);min-width:0;
  transition:border-color var(--anim-fast),box-shadow var(--anim-fast);
}
.card:hover{border-color:var(--border-2)}

.card h3{
  font-size:var(--fs-md);font-weight:var(--fw-semi);
  margin-bottom:var(--s4);
  display:flex;align-items:center;gap:var(--s2);
  letter-spacing:.1px;color:var(--text);
}
.card .sub{
  color:var(--text-mut);font-size:var(--fs-xs);
  line-height:1.65;margin-top:var(--s2);
}
.card .sub b{color:var(--text-dim)}

/* ══════════════════════════════════════════
   TABLE (BM dispatcher style)
══════════════════════════════════════════ */
.tbl{width:100%;border-collapse:separate;border-spacing:0;font-size:var(--fs-sm)}
.tbl th,.tbl td{
  padding:10px 12px;text-align:right;
  border-bottom:1px solid var(--border);
  font-variant-numeric:tabular-nums;
}
.tbl th{
  color:var(--text-dim);font-weight:var(--fw-bold);
  font-size:var(--fs-xs);text-transform:uppercase;letter-spacing:.5px;
  position:sticky;top:0;z-index:2;
  background:var(--surface-2);
  border-bottom:2px solid var(--border-2);
  white-space:nowrap;
}
/* dark mode: stronger header */
:root:not([data-theme="light"]) .tbl th{
  background:#0d1620;color:#fff;
}
.tbl thead tr:first-child th:first-child{border-top-left-radius:var(--r1)}
.tbl thead tr:first-child th:last-child{border-top-right-radius:var(--r1)}
.tbl td:first-child,.tbl th:first-child,.tbl td.l,.tbl th.l{text-align:left}
.tbl td:first-child{font-weight:var(--fw-bold);color:var(--text-dim)}
.tbl tbody tr{transition:background var(--anim-fast)}
.tbl tbody tr:hover{background:var(--surface-2)}
.tbl .name{
  display:inline-block;max-width:220px;overflow:hidden;
  text-overflow:ellipsis;white-space:nowrap;
  color:var(--text-dim);vertical-align:bottom;
}

/* ── data-table (admin/routes) ── */
.data-table{width:100%;border-collapse:collapse;font-size:var(--fs-sm)}
.data-table th{
  padding:8px 12px;text-align:left;font-size:11px;font-weight:var(--fw-bold);
  text-transform:uppercase;letter-spacing:.5px;color:var(--text-mut);
  border-bottom:1px solid var(--border);white-space:nowrap;
  position:sticky;top:0;background:var(--surface);z-index:2;
}
.data-table td{padding:9px 12px;border-bottom:1px solid var(--border);vertical-align:middle}
.data-table tbody tr:last-child td{border-bottom:none}
.data-table tbody tr:hover{background:var(--surface-2)}

/* ── Scroll container ── */
.scroll{max-height:540px;overflow:auto;border-radius:var(--r1)}
.scroll::-webkit-scrollbar{width:5px;height:5px}

/* ══════════════════════════════════════════
   BADGES & PILLS
══════════════════════════════════════════ */
/* Tag (small label) */
.tag{display:inline-block;padding:3px 10px;border-radius:var(--r-full);font-size:var(--fs-xs);font-weight:var(--fw-bold)}
.tag.g{background:var(--primary-soft);color:var(--primary)}
.tag.a{background:var(--accent-soft);color:var(--accent)}
.tag.v{background:var(--violet-soft);color:var(--violet)}

/* Status pill (with dot) */
.pill{
  display:inline-flex;align-items:center;gap:5px;
  padding:3px 10px 3px 7px;border-radius:var(--r-full);
  font-size:var(--fs-xs);font-weight:var(--fw-bold);
}
.pill::before{content:"";width:6px;height:6px;border-radius:50%;flex:none}
.pill.on{background:#16a34a22;color:#16a34a}
.pill.on::before{background:#16a34a}
.pill.off{background:#64748b1a;color:#64748b}
.pill.off::before{background:#64748b}
.pill.warn{background:#f9731622;color:#f97316}
.pill.warn::before{background:#f97316}
.pill.crit{background:#ef444422;color:#ef4444}
.pill.crit::before{background:#ef4444}

/* Wait time pill (kutish) */
.wait-good{display:inline-flex;align-items:center;gap:4px;padding:2px 8px;border-radius:var(--r-full);font-size:12px;font-weight:var(--fw-bold);background:var(--primary-soft);color:var(--primary)}
.wait-mid{display:inline-flex;align-items:center;gap:4px;padding:2px 8px;border-radius:var(--r-full);font-size:12px;font-weight:var(--fw-bold);background:rgba(242,193,78,.15);color:var(--warn)}
.wait-bad{display:inline-flex;align-items:center;gap:4px;padding:2px 8px;border-radius:var(--r-full);font-size:12px;font-weight:var(--fw-bold);background:var(--danger-soft);color:var(--danger)}

/* Chip (compact label) */
.chip{display:inline-block;padding:2px 8px;border-radius:6px;font-size:11px;font-weight:var(--fw-black);color:#fff}
.chip.blue{background:#2563eb} .chip.green{background:#16a34a} .chip.gray{background:#64748b} .chip.amber{background:#d97706}

/* Rank medals */
.rank-badge{display:inline-flex;align-items:center;justify-content:center;width:22px;height:22px;border-radius:50%;font-size:11px;font-weight:var(--fw-black)}
.rank-badge.r1{background:linear-gradient(160deg,#ffe27a,#f0b429);color:#5c3d00}
.rank-badge.r2{background:linear-gradient(160deg,#e6ecf2,#b9c4cf);color:#334155}
.rank-badge.r3{background:linear-gradient(160deg,#e8b98a,#c17a3f);color:#4a2000}

/* ══════════════════════════════════════════
   BAR (allocation visual)
══════════════════════════════════════════ */
.bar-cell{
  display:inline-block;height:8px;border-radius:var(--r-full);
  background:linear-gradient(90deg,var(--primary-d),var(--primary));
  vertical-align:middle;box-shadow:0 0 6px -2px var(--primary-glow);
  transition:width var(--anim-slow);
}

/* ══════════════════════════════════════════
   MATH FORMULA
══════════════════════════════════════════ */
.math-formula{
  font-family:var(--ff-mono);font-size:14px;
  color:var(--primary);
  padding:10px 16px;
  background:var(--primary-soft);
  border-radius:var(--r1);
  border-left:3px solid var(--primary);
  margin:10px 0;display:block;line-height:1.8;
  letter-spacing:.2px;
}
.math-formula-block{
  background:var(--surface-2);border:1px solid var(--border);
  border-radius:var(--r2);padding:20px 24px;margin:12px 0;
}
.math-formula-block .formula-title{
  font-size:11px;font-weight:var(--fw-bold);letter-spacing:.6px;
  text-transform:uppercase;color:var(--text-mut);margin-bottom:10px;
}
.math-formula-block .formula-body{
  font-family:var(--ff-mono);font-size:15px;color:var(--primary);
  line-height:2;background:transparent;border:none;padding:0;
}

/* ══════════════════════════════════════════
   SKELETON LOADER
══════════════════════════════════════════ */
@keyframes shimmer{
  0%{background-position:-600px 0}
  100%{background-position:600px 0}
}
.skeleton{
  background:linear-gradient(90deg,
    var(--skeleton-base) 25%,
    var(--skeleton-shine) 50%,
    var(--skeleton-base) 75%);
  background-size:1200px 100%;
  animation:shimmer 1.6s ease-in-out infinite;
  border-radius:var(--r2);
  min-height:120px;
  display:flex;align-items:center;justify-content:center;
  color:var(--text-mut);font-size:var(--fs-sm);
}
.skeleton-line{
  height:14px;border-radius:var(--r-full);
  background:linear-gradient(90deg,var(--skeleton-base) 25%,var(--skeleton-shine) 50%,var(--skeleton-base) 75%);
  background-size:800px 100%;
  animation:shimmer 1.5s ease-in-out infinite;
}

/* ══════════════════════════════════════════
   FORM INPUTS
══════════════════════════════════════════ */
.form-input{
  width:100%;padding:10px 14px;border-radius:var(--r1);font-size:14px;
  background:var(--surface);border:1.5px solid var(--border-2);color:var(--text);
  outline:none;font-family:var(--ff);
  transition:border-color var(--anim-fast),box-shadow var(--anim-fast);
}
.form-input:focus{border-color:var(--primary);box-shadow:0 0 0 3px var(--primary-soft)}
.form-input::placeholder{color:var(--text-mut)}
.form-input.mono{font-family:var(--ff-mono);font-size:12px}

/* Range field */
.field{margin-bottom:var(--s5)}
.field label{
  display:flex;justify-content:space-between;
  font-size:var(--fs-sm);color:var(--text-dim);
  margin-bottom:8px;font-weight:var(--fw-medium);
}
.field label b{color:var(--primary);font-variant-numeric:tabular-nums}
.field input[type=range]{
  width:100%;accent-color:var(--primary);cursor:pointer;
  height:4px;border-radius:2px;
}
.field select{
  width:100%;background:var(--bg-2);border:1.5px solid var(--border-2);
  color:var(--text);border-radius:var(--r1);padding:10px;
  outline:none;transition:border-color var(--anim-fast);
}
.field select:hover,.field select:focus{border-color:var(--primary)}

/* ══════════════════════════════════════════
   BUTTONS
══════════════════════════════════════════ */
.btn-primary{
  padding:10px 20px;border-radius:var(--r1);font-size:14px;font-weight:var(--fw-bold);
  background:var(--primary);color:#fff;border:none;cursor:pointer;
  transition:background var(--anim-fast),transform var(--anim-fast),box-shadow var(--anim-fast);
  display:inline-flex;align-items:center;gap:6px;
}
.btn-primary:hover:not(:disabled){
  background:var(--primary-d);transform:translateY(-1px);
  box-shadow:0 6px 20px -6px var(--primary-glow);
}
.btn-primary:active:not(:disabled){transform:scale(0.97) translateY(0);box-shadow:none}
.btn-primary:disabled{opacity:.55;cursor:not-allowed;transform:none}

/* ══════════════════════════════════════════
   STATUS DOT
══════════════════════════════════════════ */
.status-dot{display:inline-block;width:8px;height:8px;border-radius:50%;flex:none}
.status-dot.ok{background:#22c55e;box-shadow:0 0 0 3px rgba(34,197,94,.25)}
.status-dot.warn{background:#f97316;box-shadow:0 0 0 3px rgba(249,115,22,.25)}
.status-dot.crit{background:#ef4444;box-shadow:0 0 0 3px rgba(239,68,68,.25)}
.status-dot.off{background:var(--text-mut)}

/* ══════════════════════════════════════════
   MAP / FLEET OPS
══════════════════════════════════════════ */
.opsgrid{display:grid;grid-template-columns:280px 1fr 260px;gap:var(--s5);align-items:start}
.ops-col{padding:var(--s4)}
.ops-map{padding:var(--s4)}
#map{height:620px;border-radius:var(--r2);border:1px solid var(--border);overflow:hidden;background:var(--bg-2)}
.map-toolbar{display:flex;align-items:center;gap:10px;margin-bottom:10px}
.map-badge{
  display:inline-flex;align-items:center;gap:7px;
  font-size:var(--fs-xs);font-weight:var(--fw-bold);
  color:var(--primary);background:var(--primary-soft);
  padding:5px 12px;border-radius:var(--r-full);
  text-transform:uppercase;letter-spacing:.3px;
}
.ops-search input{
  width:100%;background:var(--surface-2);border:1px solid var(--border-2);
  color:var(--text);border-radius:var(--r1);padding:9px 12px;
  font-size:var(--fs-sm);margin-bottom:var(--s3);outline:none;
  transition:border-color var(--anim-fast);
}
.ops-search input:focus{border-color:var(--primary)}
.rlist{max-height:500px;overflow:auto;display:flex;flex-direction:column;gap:3px}
.ritem{
  padding:9px 12px;border-radius:var(--r1);cursor:pointer;
  font-size:var(--fs-sm);color:var(--text-dim);
  transition:background var(--anim-fast),transform var(--anim-fast);
  display:flex;align-items:center;gap:8px;
}
.ritem:hover{background:var(--surface-2);transform:translateX(2px)}
.ritem.on{background:var(--primary-soft);color:var(--primary);font-weight:var(--fw-semi)}
.chk{display:flex;align-items:center;gap:var(--s2);font-size:var(--fs-sm);color:var(--text-dim);margin:var(--s2) 0;cursor:pointer}
.chk input{accent-color:var(--primary)}

/* Bus markers */
.veh-marker{background:none;border:none}
.bus-badge{
  display:flex;align-items:center;gap:3px;height:24px;padding:0 8px 0 6px;
  border-radius:13px;background:#16a34a;color:#fff;font-weight:var(--fw-bold);
  font-size:12px;line-height:1;border:2px solid #fff;
  box-shadow:0 2px 6px rgba(0,0,0,.35);position:relative;white-space:nowrap;
}
.bus-badge .bus-caret{
  position:absolute;bottom:-6px;left:50%;transform:translateX(-50%);
  width:0;height:0;border-left:5px solid transparent;border-right:5px solid transparent;border-top:6px solid #fff;
}
.bus-badge.dir-up{background:#16a34a}
.bus-badge.dir-down{background:#2563eb}
.bus-badge.stale{background:#8a97a6;opacity:.7}
.bus-badge:not(.stale)::after{
  content:"";position:absolute;inset:-2px;border-radius:14px;
  animation:vehPulse 1.8s infinite;
}
.bus-badge.dir-down:not(.stale)::after{animation:vehPulseBlue 1.8s infinite}
@keyframes vehPulse{
  0%{box-shadow:0 0 0 0 rgba(34,197,94,.55)}
  70%{box-shadow:0 0 0 8px rgba(34,197,94,0)}
  100%{box-shadow:0 0 0 0 rgba(34,197,94,0)}
}
@keyframes vehPulseBlue{
  0%{box-shadow:0 0 0 0 rgba(37,99,235,.5)}
  70%{box-shadow:0 0 0 8px rgba(37,99,235,0)}
  100%{box-shadow:0 0 0 0 rgba(37,99,235,0)}
}

/* Fleet panel */
.fleet-list{max-height:520px;overflow:auto;display:flex;flex-direction:column;gap:5px;margin-top:10px}
.fleet-row{
  display:flex;align-items:center;gap:8px;padding:9px 10px;
  border-radius:var(--r1);background:var(--bg-2);
  border:1px solid var(--border);font-size:var(--fs-xs);
  transition:background var(--anim-fast);
}
.fleet-row:hover{background:var(--surface-2)}
.fleet-row.stale{opacity:.5}
.fleet-row-main{display:flex;flex-direction:column;flex:1;min-width:0}
.fleet-row-main b{font-size:var(--fs-sm);font-family:var(--ff-mono)}
.fleet-row-main span{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;color:var(--text-mut)}
.fleet-row-meta{display:flex;flex-direction:column;align-items:flex-end;color:var(--text-mut);white-space:nowrap}

/* Dispatcher KPI mini */
.disp-kpis{display:grid;grid-template-columns:1fr 1fr;gap:6px;margin:10px 0}
.disp-kpis>div{
  background:var(--bg-2);border:1px solid var(--border);border-radius:var(--r1);
  padding:8px 10px;display:flex;flex-direction:column;
}
.disp-kpis b{font-size:var(--fs-lg);font-variant-numeric:tabular-nums;line-height:1.1}
.disp-kpis span{font-size:10px;color:var(--text-mut);margin-top:2px}

/* Stop/Route markers */
.stop-marker{background:none;border:none}
.stop-badge{
  display:grid;place-items:center;width:16px;height:16px;border-radius:50%;
  background:var(--surface);border:2px solid var(--primary);color:var(--text);
  font-size:9px;font-weight:var(--fw-bold);box-shadow:0 1px 3px rgba(0,0,0,.4);
}
.stop-badge.up{border-color:#16a34a}
.stop-badge.down{border-color:#2563eb}

.bus-dot{width:10px;height:10px;border-radius:50%;flex:none}
.bus-dot.up{background:#16a34a;box-shadow:0 0 0 3px rgba(22,163,74,.22)}
.bus-dot.down{background:#2563eb;box-shadow:0 0 0 3px rgba(37,99,235,.22)}
.bus-dot.off{background:var(--text-mut)}

/* ══════════════════════════════════════════
   HELPERS
══════════════════════════════════════════ */
.muted{color:var(--text-mut)}
.add{color:var(--accent);font-weight:var(--fw-bold)}
.gold{color:var(--gold)}

/* ══════════════════════════════════════════
   RESPONSIVE
══════════════════════════════════════════ */
@media(max-width:1300px){
  .opsgrid{grid-template-columns:240px 1fr 220px}
}
@media(max-width:1100px){
  .opsgrid{grid-template-columns:220px 1fr}
  .opsgrid .ops-col:last-child{grid-column:1/-1}
}
@media(max-width:980px){
  .grid2{grid-template-columns:1fr}
  .opsgrid{grid-template-columns:1fr}
  .topbar{padding:0 var(--s3)}
  .app{grid-template-columns:64px 1fr}
  .side-brand{padding:0 var(--s3);justify-content:center}
  .side-brand span,.side-brand b{display:none}
  .side-nav{padding:var(--s3) 6px}
  .nav-item{justify-content:center;padding:12px;gap:0}
  .nav-item span:not(.ic-svg){display:none}
  .nav-item.active::before{top:auto;bottom:0;left:6px;right:6px;width:auto;height:3px;border-radius:2px 2px 0 0}
}

/* ══════════════════════════════════════════
   INPUT RANGE SLIDER
══════════════════════════════════════════ */
input[type=range] {
  -webkit-appearance: none;
  width: 100%;
  background: transparent;
  margin: 10px 0;
}
input[type=range]:focus { outline: none; }
input[type=range]::-webkit-slider-runnable-track {
  width: 100%;
  height: 6px;
  cursor: pointer;
  background: var(--surface-2);
  border-radius: 3px;
  border: 1px solid var(--border);
}
input[type=range]::-webkit-slider-thumb {
  height: 18px;
  width: 18px;
  border-radius: 50%;
  background: var(--primary);
  cursor: pointer;
  -webkit-appearance: none;
  margin-top: -7px;
  box-shadow: 0 2px 4px rgba(0,0,0,0.2);
  transition: transform 0.1s;
}
input[type=range]::-webkit-slider-thumb:hover {
  transform: scale(1.15);
}
input[type=range]::-moz-range-track {
  width: 100%;
  height: 6px;
  cursor: pointer;
  background: var(--surface-2);
  border-radius: 3px;
  border: 1px solid var(--border);
}
input[type=range]::-moz-range-thumb {
  height: 18px;
  width: 18px;
  border-radius: 50%;
  background: var(--primary);
  cursor: pointer;
  border: none;
  box-shadow: 0 2px 4px rgba(0,0,0,0.2);
  transition: transform 0.1s;
}
input[type=range]::-moz-range-thumb:hover {
  transform: scale(1.15);
}
