  :root {
    --c-bg:#0a0e14;--c-surface:#111720;--c-card:#161d28;
    --c-border:rgba(255,255,255,0.07);--c-border-md:rgba(255,255,255,0.12);
    --c-text:#e2e8f0;--c-muted:#64748b;--c-subtle:#334155;
    --c-teal:#0ed3b4;--c-teal-dim:rgba(14,211,180,0.12);--c-teal-glow:rgba(14,211,180,0.25);
    --c-blue:#38bdf8;--c-blue-dim:rgba(56,189,248,0.12);
    --c-amber:#fbbf24;--c-amber-dim:rgba(251,191,36,0.12);
    --c-red:#f87171;--c-red-dim:rgba(248,113,113,0.12);
    --c-green:#4ade80;--c-green-dim:rgba(74,222,128,0.12);
    --c-purple:#c084fc;--c-purple-dim:rgba(192,132,252,0.12);
    --font-ui:'Inter',sans-serif;--font-mono:'JetBrains Mono',monospace;
    --radius-sm:6px;--radius:10px;--radius-lg:14px;
  }
  *,*::before,*::after{box-sizing:border-box;margin:0;padding:0;}
  html,body{height:100%;overflow:hidden;}
  body{font-family:var(--font-ui);background:var(--c-bg);color:var(--c-text);font-size:13px;line-height:1.5;}
  ::-webkit-scrollbar{width:4px;}
  ::-webkit-scrollbar-track{background:transparent;}
  ::-webkit-scrollbar-thumb{background:var(--c-subtle);border-radius:2px;}

  #app{display:grid;grid-template-columns:220px 1fr;grid-template-rows:48px 1fr;height:100vh;}

  #topbar{grid-column:1/-1;display:flex;align-items:center;gap:12px;padding:0 16px;background:var(--c-surface);border-bottom:1px solid var(--c-border);z-index:100;}
  .logo{display:flex;align-items:center;gap:8px;font-weight:600;font-size:14px;letter-spacing:-0.01em;color:var(--c-text);flex-shrink:0;}
  .logo-icon{width:28px;height:28px;background:linear-gradient(135deg,#0ed3b4,#38bdf8);border-radius:7px;display:flex;align-items:center;justify-content:center;font-size:15px;color:#0a0e14;}
  .topbar-zone{font-size:12px;color:var(--c-muted);padding:3px 10px;border:1px solid var(--c-border);border-radius:20px;display:flex;align-items:center;gap:5px;}
  .pulse-dot{width:6px;height:6px;border-radius:50%;background:var(--c-teal);animation:blink 2s ease-in-out infinite;}
  @keyframes blink{0%,100%{opacity:1}50%{opacity:0.3}}
  .topbar-right{margin-left:auto;display:flex;align-items:center;gap:10px;}
  .topbar-time{font-family:var(--font-mono);font-size:12px;color:var(--c-muted);}
  .topbar-date{font-family:var(--font-mono);font-size:11px;color:var(--c-subtle);}
  .topbar-alert-btn{position:relative;background:none;border:1px solid var(--c-border);border-radius:var(--radius-sm);padding:5px 8px;color:var(--c-muted);cursor:pointer;display:flex;align-items:center;gap:4px;font-size:12px;font-family:var(--font-ui);transition:border-color .15s,color .15s;}
  .topbar-alert-btn:hover{border-color:var(--c-border-md);color:var(--c-text);}
  .alert-badge{position:absolute;top:-4px;right:-4px;width:14px;height:14px;border-radius:50%;background:var(--c-red);color:#fff;font-size:9px;font-weight:600;display:flex;align-items:center;justify-content:center;border:2px solid var(--c-surface);}
  .avatar{width:28px;height:28px;border-radius:50%;background:linear-gradient(135deg,var(--c-teal-dim),var(--c-blue-dim));border:1px solid var(--c-border-md);display:flex;align-items:center;justify-content:center;font-size:11px;font-weight:600;color:var(--c-teal);}

  #sidebar{background:var(--c-surface);border-right:1px solid var(--c-border);padding:12px 8px;overflow-y:auto;display:flex;flex-direction:column;gap:2px;}
  .nav-label{font-size:10px;font-weight:600;letter-spacing:0.08em;color:var(--c-subtle);text-transform:uppercase;padding:10px 8px 4px;}
  .nav-item{display:flex;align-items:center;gap:9px;padding:8px 10px;border-radius:var(--radius-sm);font-size:13px;color:var(--c-muted);cursor:pointer;transition:all .15s;border:1px solid transparent;}
  .nav-item:hover{background:rgba(255,255,255,0.04);color:var(--c-text);}
  .nav-item.active{background:var(--c-teal-dim);color:var(--c-teal);border-color:rgba(14,211,180,0.2);}
  .nav-item i{font-size:16px;width:18px;flex-shrink:0;}
  .nav-badge{margin-left:auto;background:var(--c-red-dim);color:var(--c-red);border-radius:20px;padding:1px 6px;font-size:10px;font-weight:600;}
  .nav-chip{margin-left:auto;border-radius:20px;padding:1px 6px;font-size:10px;font-weight:500;}
  .chip-ok{background:var(--c-green-dim);color:var(--c-green);}
  .chip-warn{background:var(--c-amber-dim);color:var(--c-amber);}

  #main{overflow-y:auto;padding:18px;display:flex;flex-direction:column;gap:14px;}
  .page{display:none;flex-direction:column;gap:14px;}
  .page.active{display:flex;}
  .page-header{display:flex;align-items:center;gap:10px;margin-bottom:2px;flex-wrap:wrap;}
  .page-header h1{font-size:17px;font-weight:600;letter-spacing:-0.02em;}
  .page-header .sub{font-size:12px;color:var(--c-muted);margin-left:4px;}

  .card{background:var(--c-card);border:1px solid var(--c-border);border-radius:var(--radius-lg);padding:14px 16px;}
  .card-title{font-size:11px;font-weight:600;letter-spacing:0.07em;text-transform:uppercase;color:var(--c-muted);margin-bottom:10px;display:flex;align-items:center;gap:6px;}

  .metrics-row{display:grid;grid-template-columns:var(--m-tmpl,repeat(4,1fr));gap:10px;align-items:stretch;}
  .metric{background:var(--c-card);border:1px solid var(--c-border);border-radius:var(--radius);padding:12px 14px;position:relative;overflow:hidden;}
  .metric::before{content:'';position:absolute;top:0;left:0;right:0;height:2px;border-radius:var(--radius) var(--radius) 0 0;}
  .metric.teal::before{background:var(--c-teal);}
  .metric.blue::before{background:var(--c-blue);}
  .metric.amber::before{background:var(--c-amber);}
  .metric.red::before{background:var(--c-red);}
  .metric.purple::before{background:var(--c-purple);}
  .metric.green::before{background:var(--c-green);}
  .metric-label{font-size:11px;color:var(--c-muted);margin-bottom:5px;display:flex;align-items:center;gap:5px;}
  .metric-val{font-size:26px;font-weight:600;letter-spacing:-0.03em;line-height:1;}
  .metric-val span{font-size:13px;font-weight:400;color:var(--c-muted);}
  .metric-sub{font-size:11px;color:var(--c-muted);margin-top:4px;}
  /* Customisable dashboard widgets */
  .metric{transition:border-color .15s;}
  .metric[draggable=true]:hover{cursor:grab;border-color:var(--c-border-md);}
  .metric.dragging{opacity:.45;cursor:grabbing;}
  .metric.drag-over{outline:1.5px dashed var(--c-teal);outline-offset:-3px;}
  .metric-swap{position:absolute;top:7px;right:6px;width:22px;height:22px;padding:0;border:0;border-radius:6px;background:transparent;color:var(--c-subtle);display:flex;align-items:center;justify-content:center;cursor:pointer;opacity:.4;transition:opacity .15s,background .15s,color .15s;z-index:3;font-size:15px;}
  .metric:hover .metric-swap{opacity:1;}
  .metric-swap:hover{background:rgba(255,255,255,0.08);color:var(--c-text);}
  .widget-menu{position:fixed;z-index:1000;width:236px;max-height:62vh;overflow-y:auto;background:var(--c-card);border:1px solid var(--c-border-md);border-radius:10px;box-shadow:0 14px 36px rgba(0,0,0,.5);padding:6px;}
  .widget-menu-hd{font-size:10px;text-transform:uppercase;letter-spacing:.06em;color:var(--c-subtle);padding:5px 8px 4px;}
  .widget-menu-item{display:flex;align-items:center;gap:9px;width:100%;text-align:left;background:transparent;border:0;color:var(--c-text);padding:7px 8px;border-radius:7px;cursor:pointer;font-size:12.5px;font-family:inherit;}
  .widget-menu-item:hover{background:rgba(255,255,255,0.06);}
  .widget-menu-item.cur{color:var(--c-teal);}
  .widget-menu-item i:first-child{font-size:15px;width:16px;flex-shrink:0;text-align:center;}
  .widget-menu-item span{flex:1;}
  .wm-used{font-size:9px;color:var(--c-subtle);text-transform:uppercase;letter-spacing:.04em;}
  .wm-sep{height:1px;background:var(--c-border);margin:5px 4px;}
  .widget-menu-item.danger{color:var(--c-red);}
  /* Add-card tile */
  .metric-add{background:transparent;border:1.5px dashed var(--c-border-md);border-radius:var(--radius);color:var(--c-subtle);cursor:pointer;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:3px;font-family:inherit;font-size:10px;letter-spacing:.03em;padding:0 14px;min-width:52px;transition:border-color .15s,color .15s;}
  .metric-add:hover{border-color:var(--c-teal);color:var(--c-teal);}
  .metric-add i{font-size:18px;}
  /* Customisable large panels (2x2 grid) */
  .dash-panels{display:grid;grid-template-columns:repeat(2,1fr);gap:14px;}
  .dash-panel{position:relative;height:384px;display:flex;flex-direction:column;}
  .dash-panel .card-title{margin-bottom:10px;}
  .dash-panel-body{flex:1;min-height:0;position:relative;display:flex;flex-direction:column;}
  .dash-panel-body .map-wrap{flex:1;min-height:0;height:auto;}
  .dash-panel-body .node-list,.dash-panel-body .alert-list{flex:1;min-height:0;overflow-y:auto;}
  .dash-panel-body .traffic-chart{flex:1;min-height:0;}
  .dash-panel.dragging{opacity:.45;}
  .dash-panel.drag-over{outline:1.5px dashed var(--c-teal);outline-offset:-3px;}
  .panel-swap{width:24px;height:24px;padding:0;border:0;border-radius:6px;background:transparent;color:var(--c-subtle);display:flex;align-items:center;justify-content:center;cursor:pointer;opacity:.5;transition:opacity .15s,background .15s,color .15s;font-size:15px;flex-shrink:0;}
  .dash-panel:hover .panel-swap{opacity:1;}
  .panel-swap:hover{background:rgba(255,255,255,0.08);color:var(--c-text);}
  .dash-reset{margin-left:auto;font-size:11px;padding:4px 10px;text-transform:none;letter-spacing:0;align-items:center;gap:5px;}
  .trend-up{color:var(--c-green);}
  .trend-dn{color:var(--c-red);}

  .grid-2{display:grid;grid-template-columns:1fr 1fr;gap:12px;}
  .grid-3{display:grid;grid-template-columns:1fr 1fr 1fr;gap:12px;}
  .table-scroll{overflow-x:auto;-webkit-overflow-scrolling:touch;}

  .map-wrap{position:relative;height:220px;border-radius:var(--radius);overflow:hidden;border:1px solid var(--c-border);}
  .map-wrap .leaflet-container{background:#0a0e14;}
  .map-overlay{position:absolute;bottom:10px;right:10px;display:flex;gap:8px;z-index:500;}
  .map-legend-item{display:flex;align-items:center;gap:4px;font-size:10px;color:var(--c-muted);background:rgba(10,14,20,0.85);padding:3px 8px;border-radius:20px;border:1px solid var(--c-border);}
  /* Leaflet overrides for dark theme */
  .leaflet-tile-pane{filter:brightness(0.92) saturate(1.1);}
  .leaflet-control-zoom{border:1px solid var(--c-border)!important;box-shadow:none!important;}
  .leaflet-control-zoom a{background:var(--c-card)!important;color:var(--c-muted)!important;border-color:var(--c-border)!important;}
  .leaflet-control-zoom a:hover{background:var(--c-surface)!important;color:var(--c-text)!important;}
  .leaflet-control-attribution{background:rgba(10,14,20,0.7)!important;color:var(--c-subtle)!important;font-size:9px!important;}
  .leaflet-control-attribution a{color:var(--c-subtle)!important;}
  /* Node pulse ring animation */
  @keyframes pulse-ring{0%{transform:scale(1);opacity:0.8}100%{transform:scale(2.6);opacity:0}}
  .node-marker-pulse{animation:pulse-ring 2s ease-out infinite;}
  /* Leaflet tooltip dark theme */
  .sm-tooltip{background:#161d28!important;border:1px solid rgba(255,255,255,0.1)!important;border-radius:8px!important;padding:10px 12px!important;box-shadow:0 8px 24px rgba(0,0,0,0.5)!important;color:#e2e8f0!important;}
  .sm-tooltip::before{display:none!important;}
  .leg-dot{width:6px;height:6px;border-radius:50%;}

  .node-list{display:flex;flex-direction:column;gap:5px;max-height:210px;overflow-y:auto;}
  .node-row{display:flex;align-items:center;gap:8px;padding:8px 10px;border-radius:var(--radius-sm);background:rgba(255,255,255,0.02);border:1px solid var(--c-border);cursor:pointer;transition:all .15s;}
  .node-row:hover{background:rgba(255,255,255,0.05);border-color:var(--c-border-md);}
  .node-status-dot{width:7px;height:7px;border-radius:50%;flex-shrink:0;}
  .node-info{flex:1;min-width:0;}
  .node-name{font-size:12px;font-weight:500;color:var(--c-text);}
  .node-meta{font-size:10px;color:var(--c-muted);font-family:var(--font-mono);}
  .node-chips{display:flex;gap:3px;flex-shrink:0;}
  .chip{font-size:9px;font-weight:600;padding:2px 6px;border-radius:20px;letter-spacing:0.03em;}
  .chip-wifi{background:var(--c-blue-dim);color:var(--c-blue);}
  .chip-cell{background:var(--c-green-dim);color:var(--c-green);}
  .chip-cam{background:var(--c-purple-dim);color:var(--c-purple);}
  .chip-err{background:var(--c-red-dim);color:var(--c-red);}
  .chip-warn2{background:var(--c-amber-dim);color:var(--c-amber);}
  .node-bright{font-family:var(--font-mono);font-size:11px;color:var(--c-muted);min-width:32px;text-align:right;flex-shrink:0;}

  .alert-list{display:flex;flex-direction:column;gap:5px;}
  .alert-item{display:flex;align-items:flex-start;gap:10px;padding:9px 11px;border-radius:var(--radius-sm);border:1px solid;cursor:pointer;}
  .alert-item.err{background:var(--c-red-dim);border-color:rgba(248,113,113,0.25);}
  .alert-item.warn{background:var(--c-amber-dim);border-color:rgba(251,191,36,0.25);}
  .alert-item.info{background:var(--c-blue-dim);border-color:rgba(56,189,248,0.25);}
  .alert-item.ok{background:var(--c-green-dim);border-color:rgba(74,222,128,0.25);}
  .alert-icon{font-size:16px;margin-top:1px;flex-shrink:0;}
  .alert-item.err .alert-icon{color:var(--c-red);}
  .alert-item.warn .alert-icon{color:var(--c-amber);}
  .alert-item.info .alert-icon{color:var(--c-blue);}
  .alert-item.ok .alert-icon{color:var(--c-green);}
  .alert-body{flex:1;min-width:0;}
  .alert-text{font-size:12px;color:var(--c-text);line-height:1.4;}
  .alert-meta{font-size:10px;color:var(--c-muted);margin-top:2px;font-family:var(--font-mono);}
  .alert-dismiss{background:none;border:none;color:var(--c-subtle);cursor:pointer;font-size:15px;line-height:1;padding:1px 3px;flex-shrink:0;margin-top:1px;transition:color .15s;border-radius:3px;}
  .alert-dismiss:hover{color:var(--c-text);}

  .traffic-chart{padding:4px 0;}
  .traffic-row{display:flex;align-items:center;gap:8px;margin-bottom:3px;}
  .traffic-label{font-size:10px;color:var(--c-muted);font-family:var(--font-mono);min-width:26px;text-align:right;}
  .traffic-bar-bg{flex:1;height:7px;background:rgba(255,255,255,0.04);border-radius:4px;overflow:hidden;}
  .traffic-bar-fill{height:100%;border-radius:4px;background:linear-gradient(90deg,var(--c-teal),var(--c-blue));transition:width .5s ease;}
  .traffic-count{font-family:var(--font-mono);font-size:10px;color:var(--c-muted);min-width:24px;text-align:right;}
  .traffic-current .traffic-bar-fill{background:linear-gradient(90deg,var(--c-amber),var(--c-teal));}

  .ctrl-section{display:flex;flex-direction:column;gap:10px;}
  .ctrl-row{display:flex;align-items:center;gap:12px;padding:11px 14px;background:rgba(255,255,255,0.02);border:1px solid var(--c-border);border-radius:var(--radius-sm);}
  .ctrl-icon{font-size:18px;color:var(--c-teal);flex-shrink:0;}
  .ctrl-label-wrap{flex:1;}
  .ctrl-name{font-size:13px;font-weight:500;color:var(--c-text);}
  .ctrl-desc{font-size:11px;color:var(--c-muted);margin-top:1px;}
  .ctrl-right{display:flex;align-items:center;gap:10px;flex-shrink:0;}
  input[type=range]{-webkit-appearance:none;width:130px;height:4px;background:rgba(255,255,255,0.08);border-radius:2px;outline:none;}
  input[type=range]::-webkit-slider-thumb{-webkit-appearance:none;width:14px;height:14px;border-radius:50%;background:var(--c-teal);cursor:pointer;box-shadow:0 0 8px var(--c-teal-glow);}
  .range-val{font-family:var(--font-mono);font-size:12px;color:var(--c-teal);min-width:36px;text-align:right;}
  .toggle{position:relative;width:36px;height:20px;flex-shrink:0;}
  .toggle input{opacity:0;width:0;height:0;position:absolute;}
  .toggle-track{position:absolute;inset:0;background:rgba(255,255,255,0.1);border-radius:10px;cursor:pointer;transition:background .2s;border:1px solid var(--c-border);}
  .toggle-thumb{position:absolute;top:2px;left:2px;width:14px;height:14px;background:var(--c-muted);border-radius:50%;transition:transform .2s,background .2s;pointer-events:none;}
  .toggle input:checked~.toggle-track{background:var(--c-teal-dim);border-color:rgba(14,211,180,0.4);}
  .toggle input:checked~.toggle-thumb{transform:translateX(16px);background:var(--c-teal);}
  select{background:var(--c-surface);color:var(--c-text);border:1px solid var(--c-border);border-radius:var(--radius-sm);padding:5px 10px;font-size:12px;font-family:var(--font-ui);outline:none;cursor:pointer;}
  select:hover{border-color:var(--c-border-md);}
  .btn{padding:6px 14px;border-radius:var(--radius-sm);font-size:12px;font-family:var(--font-ui);font-weight:500;cursor:pointer;transition:all .15s;border:1px solid;}
  .btn-teal{background:var(--c-teal-dim);color:var(--c-teal);border-color:rgba(14,211,180,0.3);}
  .btn-teal:hover{background:rgba(14,211,180,0.2);}
  .btn-red{background:var(--c-red-dim);color:var(--c-red);border-color:rgba(248,113,113,0.3);}
  .btn-subtle{background:transparent;color:var(--c-muted);border-color:var(--c-border);}
  .btn-subtle:hover{color:var(--c-text);border-color:var(--c-border-md);}

  .net-stat{display:grid;grid-template-columns:repeat(3,1fr);gap:8px;}
  .net-stat-item{background:rgba(255,255,255,0.02);border:1px solid var(--c-border);border-radius:var(--radius-sm);padding:10px 12px;text-align:center;}
  .net-stat-val{font-family:var(--font-mono);font-size:20px;font-weight:500;color:var(--c-teal);}
  .net-stat-lbl{font-size:10px;color:var(--c-muted);margin-top:2px;}
  .topology-table{width:100%;border-collapse:collapse;font-size:12px;}
  .topology-table th{text-align:left;padding:7px 10px;font-size:10px;font-weight:600;letter-spacing:0.07em;text-transform:uppercase;color:var(--c-muted);border-bottom:1px solid var(--c-border);}
  .topology-table td{padding:7px 10px;border-bottom:1px solid rgba(255,255,255,0.03);color:var(--c-text);}
  .topology-table tr:last-child td{border-bottom:none;}
  .topology-table tr:hover td{background:rgba(255,255,255,0.02);}
  .snr-bar{display:flex;align-items:center;gap:6px;}
  .snr-fill{height:4px;border-radius:2px;background:var(--c-teal);}
  .snr-val{font-family:var(--font-mono);font-size:10px;color:var(--c-muted);}

  .sparkline-wrap{display:flex;align-items:flex-end;gap:3px;height:48px;}
  .spark-bar{flex:1;border-radius:2px 2px 0 0;background:var(--c-teal);opacity:0.7;min-height:2px;}
  .spark-bar.hi{opacity:1;background:linear-gradient(180deg,var(--c-blue),var(--c-teal));}
  .stat-table{width:100%;font-size:12px;}
  .stat-table td{padding:8px 10px;border-bottom:1px solid rgba(255,255,255,0.04);}
  .stat-table td:first-child{color:var(--c-muted);}
  .stat-table td:last-child{text-align:right;font-family:var(--font-mono);font-weight:500;color:var(--c-text);}
  .stat-table tr:last-child td{border-bottom:none;}

  .cam-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(228px,1fr));gap:8px;}
  .cam-card{background:#000;border-radius:8px;border:1px solid var(--c-border);overflow:hidden;aspect-ratio:16/9;position:relative;cursor:pointer;}
  .cam-card canvas{width:100%;height:100%;display:block;}
  .cam-overlay{position:absolute;bottom:0;left:0;right:0;padding:4px 7px;background:linear-gradient(transparent,rgba(0,0,0,0.82));display:flex;align-items:center;justify-content:space-between;gap:6px;}
  .cam-name{font-size:9.5px;font-weight:500;color:#fff;flex:1;min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
  .cam-live{font-size:8.5px;color:var(--c-red);font-weight:600;display:flex;align-items:center;gap:4px;flex-shrink:0;}
  .cam-live-dot{width:6px;height:6px;border-radius:50%;background:var(--c-red);flex-shrink:0;animation:camPulse 1.5s ease-in-out infinite;}
  @keyframes camPulse{0%,100%{opacity:1;transform:scale(1)}50%{opacity:.35;transform:scale(.65)}}
  .cam-sim{font-size:8.5px;color:#f59e0b;font-weight:600;display:flex;align-items:center;gap:3px;flex-shrink:0;letter-spacing:.05em;}
  /* Clean placeholder shown under a live tile until its first frame arrives (never a black screen) */
  .cam-ph{position:absolute;inset:0;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:5px;background:radial-gradient(circle at 50% 42%,#1b2431,#0b0e15);color:#46536a;transition:opacity .4s ease;}
  .cam-ph i{font-size:24px;opacity:.55;}
  .cam-ph-status{font-size:8.5px;letter-spacing:.04em;padding:0 8px;text-align:center;}
  .cam-ph-connecting i{animation:camPhPulse 1.6s ease-in-out infinite;}
  @keyframes camPhPulse{0%,100%{opacity:.55}50%{opacity:.16}}
  .cam-live::before{content:'';width:5px;height:5px;border-radius:50%;background:var(--c-red);animation:blink 1s infinite;}

  #toast-wrap{position:fixed;bottom:20px;right:20px;z-index:3000;display:flex;flex-direction:column;gap:6px;pointer-events:none;}
  .toast{background:var(--c-card);border:1px solid var(--c-border-md);border-radius:var(--radius);padding:10px 14px;font-size:12px;color:var(--c-text);display:flex;align-items:center;gap:8px;box-shadow:0 8px 24px rgba(0,0,0,0.4);animation:slideIn .2s ease;pointer-events:all;max-width:280px;}
  @keyframes slideIn{from{transform:translateX(20px);opacity:0}to{transform:none;opacity:1}}
  @keyframes slideOut{to{transform:translateX(20px);opacity:0}}
  .toast i{font-size:16px;}
  .toast.toast-ok i{color:var(--c-green);}
  .toast.toast-warn i{color:var(--c-amber);}
  .toast.toast-err i{color:var(--c-red);}
  .toast.toast-info i{color:var(--c-blue);}

  #modal-bg{display:none;position:fixed;inset:0;z-index:2000;background:rgba(0,0,0,0.6);backdrop-filter:blur(4px);align-items:center;justify-content:center;}
  #modal-bg.open{display:flex;}
  #modal{background:var(--c-card);border:1px solid var(--c-border-md);border-radius:var(--radius-lg);padding:20px;width:500px;max-width:95vw;max-height:90vh;overflow-y:auto;box-shadow:0 20px 60px rgba(0,0,0,0.6);animation:popIn .2s ease;}
  @keyframes popIn{from{transform:scale(.95);opacity:0}to{transform:none;opacity:1}}
  .modal-header{display:flex;align-items:center;gap:10px;margin-bottom:16px;}
  .modal-header h2{font-size:15px;font-weight:600;flex:1;}
  .modal-close{background:none;border:none;color:var(--c-muted);cursor:pointer;font-size:20px;line-height:1;padding:2px;}
  .modal-close:hover{color:var(--c-text);}
  .modal-grid{display:grid;grid-template-columns:1fr 1fr;gap:8px;margin-bottom:14px;}
  .modal-stat{background:rgba(255,255,255,0.03);border:1px solid var(--c-border);border-radius:var(--radius-sm);padding:10px 12px;}
  .modal-stat-lbl{font-size:10px;color:var(--c-muted);margin-bottom:3px;}
  .modal-stat-val{font-family:var(--font-mono);font-size:14px;font-weight:500;color:var(--c-text);}
  .modal-actions{display:flex;gap:8px;flex-wrap:wrap;}
  .modal-notes{margin-top:14px;}
  .modal-notes-lbl{font-size:10px;font-weight:600;letter-spacing:0.07em;text-transform:uppercase;color:var(--c-muted);margin-bottom:6px;}
  .modal-notes textarea{width:100%;background:rgba(255,255,255,0.03);border:1px solid var(--c-border);border-radius:var(--radius-sm);color:var(--c-text);font-size:12px;font-family:var(--font-ui);padding:8px 10px;resize:vertical;min-height:64px;outline:none;transition:border-color .15s;}
  .modal-notes textarea:focus{border-color:rgba(14,211,180,0.4);}
  .modal-notes textarea::placeholder{color:var(--c-subtle);}

  .ota-node{display:flex;align-items:center;gap:10px;padding:9px 12px;border-radius:var(--radius-sm);border:1px solid var(--c-border);background:rgba(255,255,255,0.02);margin-bottom:5px;}
  .ota-node-name{font-size:12px;font-weight:500;min-width:90px;}
  .ota-progress-wrap{flex:1;height:5px;background:rgba(255,255,255,0.06);border-radius:3px;overflow:hidden;}
  .ota-progress-fill{height:100%;border-radius:3px;background:linear-gradient(90deg,var(--c-teal),var(--c-blue));transition:width .3s ease;}
  .ota-status{font-size:10px;font-family:var(--font-mono);min-width:60px;text-align:right;}

  /* Search */
  .search-wrap{position:relative;margin-bottom:8px;}
  .search-input{width:100%;padding:7px 10px 7px 30px;background:rgba(255,255,255,0.03);border:1px solid var(--c-border);border-radius:var(--radius-sm);color:var(--c-text);font-size:12px;font-family:var(--font-ui);outline:none;transition:border-color .15s;}
  .search-input:focus{border-color:rgba(14,211,180,0.4);}
  .search-input::placeholder{color:var(--c-subtle);}
  .search-icon{position:absolute;left:9px;top:50%;transform:translateY(-50%);color:var(--c-muted);font-size:14px;pointer-events:none;}

  /* Alert filter tabs */
  .alert-tabs{display:flex;gap:4px;margin-left:auto;}
  .alert-tab{background:transparent;border:1px solid var(--c-border);border-radius:var(--radius-sm);color:var(--c-muted);padding:4px 10px;font-size:11px;font-family:var(--font-ui);cursor:pointer;transition:all .15s;}
  .alert-tab:hover{color:var(--c-text);border-color:var(--c-border-md);}
  .alert-tab.active{background:var(--c-teal-dim);color:var(--c-teal);border-color:rgba(14,211,180,0.2);}

  /* Copyable */
  .copyable{cursor:pointer;transition:color .15s;}
  .copyable:hover{color:var(--c-teal)!important;}

  /* Empty state */
  .empty-state{padding:24px;text-align:center;color:var(--c-muted);font-size:12px;}

  /* ── BOTTOM NAV (mobile) ────────────────────────────────── */
  #bottom-nav{display:none;position:fixed;bottom:0;left:0;right:0;z-index:900;background:#0d1117;border-top:1px solid rgba(255,255,255,0.08);padding:6px 0 max(6px,env(safe-area-inset-bottom));display:none;flex-direction:row;justify-content:space-around;align-items:flex-start;}
  .bnav-item{display:flex;flex-direction:column;align-items:center;gap:3px;padding:4px 8px;border-radius:8px;color:var(--c-muted);cursor:pointer;min-width:52px;transition:color .15s;}
  .bnav-item i{font-size:22px;}
  .bnav-item span{font-size:9px;letter-spacing:.02em;}
  .bnav-item.active{color:var(--c-teal);}
  .bnav-more-menu{display:none;position:fixed;bottom:70px;right:8px;background:#161d28;border:1px solid rgba(255,255,255,0.1);border-radius:12px;padding:8px;min-width:200px;z-index:1000;box-shadow:0 8px 32px rgba(0,0,0,0.6);}
  .bnav-more-menu.open{display:block;}
  .bnav-more-item{display:flex;align-items:center;gap:10px;padding:10px 12px;border-radius:8px;color:var(--c-muted);cursor:pointer;font-size:13px;}
  .bnav-more-item:hover,.bnav-more-item.active{background:var(--c-teal-dim);color:var(--c-teal);}
  .bnav-more-item i{font-size:16px;width:18px;}

  /* ── RESPONSIVE LAYOUT (class-driven so a button can force a mode) ──────────
     <html> carries exactly one of .vw-desktop / .vw-tablet / .vw-phone, set by JS
     from the viewport width (auto) or a forced view mode. .vw-forced marks a
     manually-forced mode (used to show a phone frame when previewing on a wide screen). */

  /* TABLET (iPad) — icon-only sidebar */
  html.vw-tablet #sidebar{width:56px;overflow:hidden;}
  html.vw-tablet #sidebar .nav-label{display:none;}
  html.vw-tablet #sidebar .nav-item{padding:10px;justify-content:center;font-size:0;}
  html.vw-tablet #sidebar .nav-item i{font-size:20px;width:auto;margin:0;}
  html.vw-tablet #sidebar .nav-chip, html.vw-tablet .nav-badge{display:none;}
  html.vw-tablet #app{grid-template-columns:56px 1fr;}
  html.vw-tablet #topbar-node-count{display:none;}
  html.vw-tablet .metrics-row{grid-template-columns:repeat(2,1fr);}

  /* PHONE + TABLET — stack content+sidebar splits so maps span full width */
  html.vw-phone .grid-2, html.vw-phone .grid-3, html.vw-phone .dash-panels,
  html.vw-tablet .grid-2, html.vw-tablet .grid-3, html.vw-tablet .dash-panels{grid-template-columns:1fr!important;}
  html.vw-phone [style*="grid-template-columns:1fr 3"], html.vw-tablet [style*="grid-template-columns:1fr 3"],
  html.vw-phone [style*="grid-template-columns:260px"], html.vw-tablet [style*="grid-template-columns:260px"],
  html.vw-phone [style*="grid-template-columns:1fr 1fr"], html.vw-tablet [style*="grid-template-columns:1fr 1fr"]{grid-template-columns:1fr!important;}

  /* PHONE — single-column app with bottom nav */
  html.vw-phone #app{grid-template-columns:1fr;grid-template-rows:56px 1fr;}
  html.vw-phone #sidebar{display:none!important;}
  html.vw-phone #bottom-nav{display:flex!important;}
  html.vw-phone #main{padding-bottom:calc(70px + env(safe-area-inset-bottom));}
  html.vw-phone .page{padding:12px;}
  html.vw-phone .page-header{margin-bottom:12px;}
  html.vw-phone .page-header h1{font-size:20px;}
  html.vw-phone .metrics-row{grid-template-columns:1fr 1fr;gap:8px;}
  html.vw-phone .metric{padding:12px;}
  html.vw-phone .metric-val{font-size:22px;}
  html.vw-phone .card{padding:12px;margin-bottom:12px;}
  html.vw-phone .cam-grid{grid-template-columns:1fr;}
  html.vw-phone .topology-table{font-size:11px;}
  html.vw-phone .topology-table th, html.vw-phone .topology-table td{padding:6px 8px;white-space:nowrap;}
  html.vw-phone [style*="grid-template-columns:repeat(3"]{grid-template-columns:1fr!important;}
  html.vw-phone [style*="grid-template-columns:repeat(5"]{grid-template-columns:repeat(2,1fr)!important;}
  html.vw-phone #map-full{height:300px!important;}
  html.vw-phone #map-traffic{height:300px!important;}
  html.vw-phone .map-wrap{height:300px!important;}
  html.vw-phone #topbar{padding:0 12px;}
  html.vw-phone .traffic-segment-list{grid-template-columns:1fr;}
  html.vw-phone .seg-cam-grid{grid-template-columns:1fr;}
  html.vw-phone, html.vw-phone body{overflow-x:hidden;max-width:100%;}
  html.vw-phone #main{overflow-x:hidden;}
  html.vw-phone .topbar-zone, html.vw-phone .topbar-date{display:none!important;}
  html.vw-phone .topbar-alert-btn{font-size:0;padding:6px 8px;}
  html.vw-phone .topbar-alert-btn i{font-size:16px;}
  html.vw-phone .card-title{flex-wrap:wrap;row-gap:6px;}
  html.vw-phone .dept-chip span, html.vw-phone .dept-chip i:last-child{display:none;}
  html.vw-phone .dept-chip{padding:6px 8px;}

  /* PHONE FORCED on a wide screen — render inside a centered device frame */
  html.vw-phone.vw-forced body{background:#05070b;}
  html.vw-phone.vw-forced #app{max-width:430px;margin-inline:auto;box-shadow:0 0 0 1px rgba(255,255,255,0.08),0 24px 80px rgba(0,0,0,0.6);}
  html.vw-phone.vw-forced #bottom-nav{left:calc(50% - 215px);right:calc(50% - 215px);}
  html.vw-phone.vw-forced .bnav-more-menu{right:calc(50% - 207px);}

  /* View-toggle button */
  .topbar-view-btn{display:inline-flex;align-items:center;justify-content:center;width:32px;height:32px;border-radius:8px;background:rgba(255,255,255,0.05);border:1px solid var(--c-border);color:var(--c-muted);cursor:pointer;transition:all .15s;}
  .topbar-view-btn:hover{background:rgba(255,255,255,0.09);color:var(--c-text);}
  .topbar-view-btn i{font-size:17px;}

  /* Public-safety command-center tabs */
  .ps-tabs{display:flex;gap:6px;flex-wrap:wrap;margin-bottom:16px;border-bottom:1px solid var(--c-border);padding-bottom:0;}
  .ps-tab{display:inline-flex;align-items:center;gap:6px;padding:8px 14px;font-size:12.5px;font-weight:500;color:var(--c-muted);background:none;border:none;border-bottom:2px solid transparent;cursor:pointer;transition:all .15s;white-space:nowrap;}
  .ps-tab:hover{color:var(--c-text);}
  .ps-tab.active{color:var(--c-teal);border-bottom-color:var(--c-teal);}
  .ps-tab i{font-size:15px;}
  .ps-field{width:100%;background:rgba(255,255,255,0.04);border:1px solid var(--c-border);border-radius:var(--radius-sm);color:var(--c-text);font-size:12px;font-family:var(--font-ui);padding:8px 10px;outline:none;}
  .ps-field:focus{border-color:rgba(14,211,180,0.4);}
  .ps-chip-btn{display:inline-flex;align-items:center;gap:5px;padding:5px 10px;border-radius:6px;border:1px solid var(--c-border);background:rgba(255,255,255,0.03);color:var(--c-muted);font-size:11px;cursor:pointer;transition:all .12s;}
  .ps-chip-btn.on{background:var(--c-teal-dim);border-color:rgba(14,211,180,0.4);color:var(--c-teal);}

  /* Department switcher */
  .dept-chip{display:inline-flex;align-items:center;gap:6px;padding:5px 10px;border-radius:8px;background:rgba(96,165,250,0.1);border:1px solid rgba(96,165,250,0.28);color:#60a5fa;font-size:12px;font-weight:500;cursor:pointer;transition:all .15s;white-space:nowrap;}
  .dept-chip:hover{background:rgba(96,165,250,0.18);}
  .dept-chip i:first-child{font-size:15px;}
  #dept-menu{display:none;position:fixed;top:52px;right:16px;z-index:1500;background:#161d28;border:1px solid rgba(255,255,255,0.1);border-radius:12px;padding:8px;min-width:250px;box-shadow:0 12px 40px rgba(0,0,0,0.6);}
  #dept-menu.open{display:block;}
  .dept-menu-item{display:flex;align-items:center;gap:10px;padding:9px 11px;border-radius:8px;cursor:pointer;transition:all .12s;}
  .dept-menu-item:hover{background:rgba(255,255,255,0.05);}
  .dept-menu-item.active{background:rgba(96,165,250,0.1);}
  .dept-menu-ic{width:30px;height:30px;border-radius:7px;display:flex;align-items:center;justify-content:center;flex-shrink:0;font-size:16px;}

  /* Branded login screen */
  #login-screen{display:none;position:fixed;inset:0;z-index:5000;background:radial-gradient(1200px 600px at 50% -10%,rgba(14,211,180,0.10),transparent 60%),linear-gradient(160deg,#070b11,#0a0e14 60%,#05070b);align-items:center;justify-content:center;padding:24px;}
  #login-screen.show{display:flex;}
  .login-card{width:100%;max-width:400px;background:rgba(18,24,34,0.85);border:1px solid rgba(255,255,255,0.08);border-radius:18px;padding:32px 28px;box-shadow:0 30px 90px rgba(0,0,0,0.6);backdrop-filter:blur(8px);}
  .login-brand{display:flex;align-items:center;gap:14px;margin-bottom:6px;}
  .login-seal{width:52px;height:52px;border-radius:13px;background:linear-gradient(135deg,#0ed3b4,#0891b2);display:flex;align-items:center;justify-content:center;font-size:26px;color:#04120f;box-shadow:0 8px 24px rgba(14,211,180,0.3);}
  .login-tenant{font-size:18px;font-weight:600;color:var(--c-text);}
  .login-product{font-size:12px;color:var(--c-teal);letter-spacing:.04em;}
  .login-sub{font-size:12px;color:var(--c-muted);margin:14px 0 20px;}
  .login-lbl{font-size:10px;font-weight:600;letter-spacing:.07em;text-transform:uppercase;color:var(--c-muted);margin-bottom:6px;}
  .login-btn{width:100%;justify-content:center;margin-top:12px;padding:11px;}
  .login-foot{margin-top:20px;padding-top:16px;border-top:1px solid rgba(255,255,255,0.06);font-size:10.5px;color:var(--c-subtle);text-align:center;line-height:1.6;}
  .login-demo{margin-top:14px;font-size:11px;color:var(--c-muted);text-align:center;}

  /* Printable council report (light theme, print-only) */
  #report-view{display:none;}
  @media print{
    @page{margin:14mm;size:letter;}
    body{background:#fff!important;}
    #app,#bottom-nav,#login-screen,#dept-menu,#toast-wrap,#modal-bg,#tour-overlay{display:none!important;}
    #report-view{display:block!important;}
  }

  /* Guided tour */
  #tour-overlay{display:none;position:fixed;inset:0;z-index:5500;}
  #tour-overlay.show{display:block;}
  #tour-mask{position:absolute;inset:0;background:rgba(3,6,11,0.68);}
  #tour-spot{position:absolute;border-radius:10px;border:2px solid rgba(14,211,180,0.95);background:rgba(14,211,180,0.08);box-shadow:0 0 22px rgba(14,211,180,0.55);transition:left .25s ease,top .25s ease,width .25s ease,height .25s ease;pointer-events:none;}
  #tour-pop{position:absolute;max-width:300px;background:#161d28;border:1px solid rgba(14,211,180,0.3);border-radius:12px;padding:16px 18px;box-shadow:0 16px 50px rgba(0,0,0,0.6);transition:left .25s ease,top .25s ease;}
  #tour-pop h4{font-size:14px;margin-bottom:6px;color:var(--c-text);}
  #tour-pop p{font-size:12.5px;color:var(--c-muted);line-height:1.55;}
  .tour-nav{display:flex;align-items:center;gap:8px;margin-top:14px;}
  .tour-dots{display:flex;gap:5px;margin-right:auto;}
  .tour-dot{width:6px;height:6px;border-radius:50%;background:rgba(255,255,255,0.2);}
  .tour-dot.on{background:var(--c-teal);}
