:root{
  --bg:#0b0f17;--bg2:#0f1521;--card:#131b2a;--card2:#182236;--line:#223049;--txt:#e8eef9;--mut:#8b9bb5;
  --acc:#5eead4;--acc2:#38bdf8;--ok:#4ade80;--warn:#fbbf24;--bad:#f87171;--hh:#fb923c;
  --r:16px;--side:244px;--tab:64px;
  --sat:env(safe-area-inset-top);--sab:env(safe-area-inset-bottom);
}
*{box-sizing:border-box;-webkit-tap-highlight-color:transparent}
html,body{margin:0;height:100%;background:var(--bg);color:var(--txt);font:15px/1.45 -apple-system,"Segoe UI",Inter,Roboto,system-ui,sans-serif}
body{overscroll-behavior-y:contain}
.hidden{display:none!important}
button,input,select{font:inherit;color:inherit}
h1{font-size:1.5rem;margin:0;letter-spacing:-.02em}
h2{font-size:1.02rem;margin:0 0 .7rem;font-weight:650;letter-spacing:-.01em}
small,.mut{color:var(--mut)}
a{color:var(--acc2)}

/* ---- layout */
#app{display:flex;min-height:100%}
#side{width:var(--side);flex:none;background:linear-gradient(180deg,#0e1420,#0b0f17);border-right:1px solid var(--line);padding:22px 14px;display:flex;flex-direction:column;position:sticky;top:0;height:100vh}
.brand{display:flex;gap:12px;align-items:center;padding:0 8px 22px}
.brand b{display:block;font-size:1.1rem;letter-spacing:-.02em}
.brand small{display:block;max-width:150px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
#nav a,#tabbar a{display:flex;align-items:center;gap:12px;padding:11px 12px;border-radius:12px;color:var(--mut);text-decoration:none;font-weight:550;transition:.18s}
#nav a svg,#tabbar a svg{width:22px;height:22px;flex:none}
#nav a:hover{background:#ffffff08;color:var(--txt)}
#nav a.on{background:linear-gradient(90deg,#5eead41f,#38bdf812);color:var(--acc);box-shadow:inset 2px 0 0 var(--acc)}
.side-foot{margin-top:auto}
main{flex:1;min-width:0;padding:26px clamp(14px,3vw,38px) 40px;max-width:1400px}
#view{animation:fade .25s ease}
@keyframes fade{from{opacity:0;transform:translateY(6px)}to{opacity:1;transform:none}}
#tabbar{display:none}

/* ---- composants */
.pill{display:inline-flex;align-items:center;gap:8px;padding:7px 12px;border-radius:99px;background:var(--card);border:1px solid var(--line);font-size:.82rem;color:var(--mut)}
.pill i{width:8px;height:8px;border-radius:50%;background:var(--mut)}
.pill.ok i{background:var(--ok);box-shadow:0 0 0 4px #4ade8026}.pill.ok{color:var(--txt)}
.pill.bad i{background:var(--bad)}
.head{display:flex;align-items:center;gap:12px;flex-wrap:wrap;margin-bottom:20px}
.head .sp{flex:1}
.card{background:var(--card);border:1px solid var(--line);border-radius:var(--r);padding:18px;margin-bottom:16px}
.grid{display:grid;gap:14px}
.kpis{grid-template-columns:repeat(auto-fit,minmax(170px,1fr));margin-bottom:16px}
.kpi{background:linear-gradient(160deg,var(--card2),var(--card));border:1px solid var(--line);border-radius:var(--r);padding:16px 18px;position:relative;overflow:hidden}
.kpi .l{color:var(--mut);font-size:.8rem;text-transform:uppercase;letter-spacing:.06em}
.kpi .v{font-size:2.15rem;font-weight:720;letter-spacing:-.03em;margin:4px 0 2px;font-variant-numeric:tabular-nums}
.kpi .d{font-size:.82rem;color:var(--mut)}
.kpi .d.up{color:var(--ok)}.kpi .d.down{color:var(--bad)}
.kpi.hero .v{background:linear-gradient(90deg,var(--acc),var(--acc2));-webkit-background-clip:text;background-clip:text;color:transparent}
.cols{display:grid;grid-template-columns:2fr 1fr;gap:16px}
.cols2{display:grid;grid-template-columns:1fr 1fr;gap:16px}
.cols>*,.cols2>*{min-width:0}
.heat{min-width:0}
.btn{display:inline-flex;align-items:center;justify-content:center;gap:8px;padding:10px 16px;border-radius:12px;border:1px solid var(--line);background:var(--card2);cursor:pointer;font-weight:600;transition:.15s;min-height:42px}
.btn:hover{border-color:#34476a;transform:translateY(-1px)}
.btn:active{transform:none}
.btn.pri{background:linear-gradient(135deg,var(--acc),var(--acc2));color:#04141b;border:0}
.btn.bad{color:var(--bad)}
.btn.sm{padding:6px 12px;min-height:34px;font-size:.88rem}
.btn svg{width:18px;height:18px}
.btn:disabled{opacity:.5;cursor:default;transform:none}
.iconbtn{width:40px;height:40px;padding:0}
input[type=text],input[type=password],input[type=number],input[type=date],input[type=time],select,textarea{width:100%;padding:11px 13px;border-radius:12px;border:1px solid var(--line);background:var(--bg2);outline:none;min-height:44px}
input:focus,select:focus{border-color:var(--acc2);box-shadow:0 0 0 3px #38bdf826}
label.f{display:block;margin:0 0 12px}
label.f>span{display:block;font-size:.8rem;color:var(--mut);margin-bottom:5px}
.row{display:flex;gap:10px;align-items:center;flex-wrap:wrap}
.row>*{flex:1;min-width:120px}.row>.fit{flex:none;min-width:0}
.sw{position:relative;display:inline-block;width:46px;height:27px;flex:none}
.sw input{opacity:0;width:0;height:0;position:absolute}
.sw i{position:absolute;inset:0;background:#2a3850;border-radius:99px;transition:.2s;cursor:pointer}
.sw i:before{content:"";position:absolute;left:3px;top:3px;width:21px;height:21px;border-radius:50%;background:#fff;transition:.2s}
.sw input:checked+i{background:linear-gradient(135deg,var(--acc),var(--acc2))}
.sw input:checked+i:before{transform:translateX(19px)}
.trow{display:flex;align-items:center;justify-content:space-between;gap:14px;padding:11px 0;border-bottom:1px solid #1b2639}
.trow:last-child{border:0}
.chips{display:flex;gap:6px;flex-wrap:wrap}
.chip{padding:7px 12px;border-radius:99px;border:1px solid var(--line);background:var(--bg2);cursor:pointer;font-size:.86rem;color:var(--mut);user-select:none}
.chip.on{background:#5eead41f;border-color:var(--acc);color:var(--acc)}
.banner{display:flex;gap:12px;align-items:center;padding:12px 16px;border-radius:14px;margin-bottom:14px;background:#fbbf2418;border:1px solid #fbbf2455;color:#fde68a}
.banner.bad{background:#f8717118;border-color:#f8717155;color:#fecaca}
.banner .btn{margin-left:auto}
.empty{text-align:center;padding:46px 20px;color:var(--mut)}
.empty b{display:block;color:var(--txt);font-size:1.1rem;margin-bottom:6px}
.badge{font-size:.72rem;padding:3px 9px;border-radius:99px;background:#ffffff10;color:var(--mut);font-weight:600}
.badge.ok{background:#4ade8022;color:var(--ok)}.badge.bad{background:#f8717122;color:var(--bad)}.badge.hh{background:#fb923c22;color:var(--hh)}
.skel{background:linear-gradient(90deg,#182236,#1d2a42,#182236);background-size:200% 100%;animation:sk 1.2s infinite;border-radius:10px}
@keyframes sk{to{background-position:-200% 0}}

/* ---- charts */
.chart{width:100%;display:block}
.chart text{fill:var(--mut);font-size:11px}
.chart .gl{stroke:#1f2b42}
.bar{transition:.2s}.bar:hover{filter:brightness(1.25)}
.heat{display:grid;grid-template-columns:30px repeat(24,minmax(0,1fr));gap:2px;font-size:.68rem;color:var(--mut)}
.heat div{aspect-ratio:1;border-radius:3px;min-width:0}
.heat .hl{aspect-ratio:auto;display:flex;align-items:center}
.legend{display:flex;gap:14px;font-size:.8rem;color:var(--mut);margin-top:6px;flex-wrap:wrap}
.legend i{display:inline-block;width:10px;height:10px;border-radius:3px;margin-right:6px;vertical-align:-1px}
.dbar{display:flex;align-items:center;gap:10px;margin:8px 0;font-size:.88rem}
.dbar .t{flex:none;width:84px;color:var(--mut)}.dbar .b{flex:1;height:10px;background:#0f1726;border-radius:99px;overflow:hidden}
.dbar .b i{display:block;height:100%;background:linear-gradient(90deg,var(--acc),var(--acc2));border-radius:99px}
.dbar .n{width:44px;text-align:right;font-variant-numeric:tabular-nums}

/* ---- direct */
.tiles{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(100%,420px),1fr));gap:14px}
.tile{position:relative;border-radius:var(--r);overflow:hidden;background:#05080d;border:1px solid var(--line);aspect-ratio:16/9;cursor:pointer}
.tile img,.tile video{width:100%;height:100%;object-fit:cover;display:block}
.tile .ov{position:absolute;left:0;right:0;top:0;padding:10px 12px;display:flex;gap:8px;align-items:center;background:linear-gradient(#000a,#0000)}
.tile .ov b{flex:1;text-shadow:0 1px 3px #000}
.tile .off{position:absolute;inset:0;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:6px;color:var(--mut);background:#0a0f18}
.fs{position:fixed;inset:0;z-index:50;background:#000;display:flex;align-items:center;justify-content:center}
.fs img{max-width:100%;max-height:100%}
.fs .btn{position:absolute;top:calc(12px + var(--sat));right:12px}

/* ---- lecture */
.player{background:#000;border-radius:var(--r);overflow:hidden;aspect-ratio:16/9;position:relative;border:1px solid var(--line)}
.player video{width:100%;height:100%;display:block;background:#000}
.player .none{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;color:var(--mut);text-align:center;padding:20px}
.tl{position:relative;height:74px;background:#0d1420;border:1px solid var(--line);border-radius:14px;margin:14px 0 6px;overflow:hidden;cursor:pointer;touch-action:none}
.tl .seg{position:absolute;top:44px;height:22px;background:#2a3d5f;border-radius:4px;opacity:.9}
.tl .vis{position:absolute;top:8px;height:16px;background:var(--ok);border-radius:4px;opacity:.95}
.tl .vis.hh{background:var(--hh)}
.tl .mot{position:absolute;top:28px;height:10px;background:var(--acc2);border-radius:3px;opacity:.8}
.tl .cur{position:absolute;top:0;bottom:0;width:2px;background:#fff;box-shadow:0 0 8px #fff}
.tlh{display:flex;justify-content:space-between;font-size:.72rem;color:var(--mut)}
.evs{display:flex;gap:8px;overflow:auto;padding:4px 0 8px;scrollbar-width:thin}
.ev{flex:none;padding:8px 12px;border-radius:12px;background:var(--card2);border:1px solid var(--line);cursor:pointer;font-size:.86rem;white-space:nowrap}
.ev:hover{border-color:var(--acc)}.ev.hh{border-color:#fb923c55}

/* ---- caméras / proches */
.list{display:grid;gap:12px}
.item{display:flex;gap:14px;align-items:center;background:var(--card);border:1px solid var(--line);border-radius:var(--r);padding:14px}
.thumb{width:128px;aspect-ratio:16/9;border-radius:10px;background:#05080d center/cover;flex:none;border:1px solid var(--line)}
.item .grow{flex:1;min-width:0}
.item .grow b{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.item .acts{display:flex;gap:8px;flex-wrap:wrap;margin-top:8px}
.avatar{width:48px;height:48px;border-radius:50%;background:linear-gradient(135deg,var(--hh),#f43f5e);display:flex;align-items:center;justify-content:center;font-weight:700;font-size:1.2rem;color:#1a0a02;flex:none}

/* ---- modal */
.modal{position:fixed;inset:0;z-index:40;background:#02060bcc;backdrop-filter:blur(6px);display:flex;align-items:center;justify-content:center;padding:18px;animation:fade .2s}
.sheet{background:var(--card);border:1px solid var(--line);border-radius:20px;width:min(720px,100%);max-height:calc(100vh - 36px);overflow:auto;padding:22px}
.sheet .sh{display:flex;align-items:center;gap:10px;margin-bottom:14px}.sheet .sh h2{margin:0;flex:1;font-size:1.2rem}
.snap{position:relative;border-radius:12px;overflow:hidden;background:#000;margin:10px 0}
.snap img{width:100%;display:block}
.snap canvas{position:absolute;inset:0;width:100%;height:100%;touch-action:none;cursor:crosshair}

/* ---- auth */
.auth{position:fixed;inset:0;z-index:60;background:radial-gradient(1200px 600px at 50% -10%,#14304a,var(--bg));display:flex;align-items:center;justify-content:center;padding:20px}
.auth .box{width:min(380px,100%);background:var(--card);border:1px solid var(--line);border-radius:22px;padding:28px;text-align:center}
.auth h1{margin:14px 0 4px}.auth p{color:var(--mut);margin:0 0 18px}

#toasts{position:fixed;left:50%;transform:translateX(-50%);bottom:calc(24px + var(--sab));z-index:70;display:grid;gap:8px}
.toast{background:#1e2a42;border:1px solid #34476a;padding:11px 18px;border-radius:14px;box-shadow:0 10px 30px #0008;animation:fade .2s;max-width:90vw}
.toast.bad{border-color:#f8717199}.toast.ok{border-color:#4ade8099}
.spin{width:18px;height:18px;border:2px solid #ffffff40;border-top-color:#fff;border-radius:50%;animation:rot .7s linear infinite;display:inline-block}
@keyframes rot{to{transform:rotate(360deg)}}
pre.ai{white-space:pre-wrap;font:inherit;margin:0;line-height:1.55}

/* ---- mobile */
@media (max-width:860px){
  #side{display:none}
  main{padding:calc(14px + var(--sat)) 14px calc(var(--tab) + 28px + var(--sab))}
  #tabbar{display:flex;position:fixed;left:0;right:0;bottom:0;z-index:30;height:calc(var(--tab) + var(--sab));padding:0 6px var(--sab);background:#0c121dee;backdrop-filter:blur(14px);border-top:1px solid var(--line)}
  #tabbar a{flex:1;flex-direction:column;gap:3px;font-size:.68rem;padding:8px 2px;justify-content:center;border-radius:0}
  #tabbar a.on{color:var(--acc)}
  .cols,.cols2{grid-template-columns:1fr}
  .kpi .v{font-size:1.8rem}
  .item{flex-wrap:wrap}.thumb{width:100%}
  #toasts{bottom:calc(var(--tab) + 18px + var(--sab))}
  .sheet{padding:16px;border-radius:18px}
  h1{font-size:1.3rem}
}

/* ---- v2 */
.sheet.wide{width:min(980px,100%)}
.toast.warn{border-color:#fbbf2499}
.badge.warn{background:#fbbf2422;color:var(--warn)}
.bar-wrap{height:12px;background:#0f1726;border-radius:99px;overflow:hidden;margin:12px 0}
.bar-wrap i{display:block;height:100%;background:linear-gradient(90deg,var(--acc),var(--acc2));transition:width .5s}
.lvl{width:10px;height:10px;border-radius:50%;flex:none;background:var(--acc2);display:inline-block;margin-top:5px}
.lvl.warn{background:var(--warn)}.lvl.bad{background:var(--bad)}.lvl.good,.lvl.ok{background:var(--ok)}
.ins{display:flex;gap:10px;padding:8px 0;border-bottom:1px solid #1b2639;align-items:flex-start}
.ins:last-of-type{border:0}
.gs{border-color:#5eead455;background:linear-gradient(160deg,#12303a,var(--card))}
.chk{width:22px;height:22px;border-radius:50%;border:2px solid var(--line);flex:none;display:inline-flex;align-items:center;justify-content:center;font-size:.8rem;color:#04141b}
.chk.on{background:var(--ok);border-color:var(--ok)}
.list a.item.link{text-decoration:none;color:inherit;cursor:pointer}
.list a.item.link:hover{border-color:var(--acc)}
.avatar.sq{border-radius:14px;background:linear-gradient(135deg,var(--acc),var(--acc2));color:#04141b}
.avatar.sq svg{width:24px;height:24px}
.zrow{padding:12px 0;border-bottom:1px solid #1b2639}.zrow:last-child{border:0}
.zh{display:flex;gap:10px;align-items:baseline}.zh small{color:var(--mut)}
.zm{display:flex;gap:6px 16px;flex-wrap:wrap;font-size:.85rem;color:var(--mut)}
.zrow-ed{display:flex;gap:8px;align-items:center;padding:6px;border-radius:12px;margin-top:6px;border:1px solid transparent}
.zrow-ed.on{border-color:var(--acc);background:#5eead410}
.zrow-ed i{width:12px;height:12px;border-radius:4px;flex:none}
.zrow-ed input{min-height:38px}.zrow-ed select{min-height:38px;width:auto;max-width:48%}
.srow{display:grid;grid-template-columns:1.3fr 1fr 90px 100px 60px;gap:8px;align-items:center;padding:6px 0;border-bottom:1px solid #1b2639;font-size:.9rem}
.srow input{min-height:36px;padding:6px 8px}
.srow.sh{color:var(--mut);font-size:.75rem;text-transform:uppercase}
.srow .sv,.srow .sc{color:var(--mut)}
.heatbox canvas{pointer-events:none;cursor:default}
.tl .alr{position:absolute;top:0;bottom:0;width:3px;background:var(--bad)}
.fix{margin-top:6px;color:#fde68a;font-size:.88rem;white-space:normal}
.noprint{}
@media (max-width:860px){.srow{grid-template-columns:1fr 1fr 1fr;}.srow .sd{grid-column:1/-1;font-weight:600}.srow .sc{display:none}}
@media print{
  #side,#tabbar,#banners,.noprint,#toasts{display:none!important}
  html,body{background:#fff!important;color:#111!important}
  main{padding:0!important;max-width:none}
  .card,.kpi{background:#fff!important;border:1px solid #ccc!important;color:#111!important;break-inside:avoid}
  .kpi .v{color:#111!important;-webkit-text-fill-color:#111!important;background:none!important}
  .mut,small,.chart text{fill:#555!important;color:#555!important}
  .chart .gl{stroke:#ddd}
}
.cols,.cols2{align-items:start}

/* --- mur de caméras, choix, alertes flottantes */
.wall{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(100%,300px),1fr));gap:10px}
.wt img{object-fit:cover}
.wt.alert{border:2px solid var(--bad);box-shadow:0 0 0 0 #f8717166;animation:pulse 1.4s infinite;order:-1}
@keyframes pulse{70%{box-shadow:0 0 0 12px #f8717100}100%{box-shadow:0 0 0 0 #f8717100}}
.hidden{display:none!important}
.scrollx{overflow-x:auto}
.wgrid{display:grid;grid-template-columns:minmax(96px,1.5fr) repeat(5,minmax(40px,1fr));align-items:center;gap:4px;padding:8px 0}
.wgrid .sw{transform:scale(.8)}
.wgrid.wh{font-size:.72rem;color:var(--mut);border-bottom:1px solid var(--line);text-align:center}
.wgrid.wh span:first-child{text-align:left}
.wgrid.wr{border-bottom:1px solid #ffffff0a}
.wgrid .col{display:flex;justify-content:center}
.who{display:flex;gap:10px;align-items:center;min-width:0}
.thumb.xs{width:44px;height:30px;border-radius:6px;background:#0a0f18 center/cover;flex:none;display:inline-block}
.thumb.sm{width:64px;height:44px;border-radius:8px;background:#0a0f18 center/cover;flex:none}
.float{position:fixed;right:14px;bottom:calc(84px + var(--sab,0px));z-index:70;width:min(92vw,340px);background:#101826;border:2px solid var(--bad);border-radius:16px;padding:12px;box-shadow:0 12px 40px #000a}
.float.warn{border-color:var(--warn,#fbbf24)}
.float .fh{display:flex;align-items:center;justify-content:space-between;margin-bottom:8px}
.float img{width:100%;border-radius:10px;display:block;background:#05080d}
.float p{margin:8px 0}
