:root{--font-display:"Space Grotesk","Work Sans",sans-serif;--font-body:"Work Sans","Space Grotesk",sans-serif;--ink:#0f1a24;--muted:#5b6670;--panel:#ffffffe0;--panel-solid:#fff;--line:#d6dde2;--shadow:0 18px 38px #0f172a24;--shadow-soft:0 10px 20px #0f172a14;--accent:#0f6f5c;--accent-strong:#0ea5e9;--warning:#b45309;--danger:#b91c1c;--ok:#047857;--chip:#eef2f6;--radius-lg:18px;--radius-md:12px;--radius-sm:9px}*{box-sizing:border-box}body{min-height:100vh;font:400 14px/1.5 var(--font-body);color:var(--ink);letter-spacing:.1px;background:radial-gradient(circle at 12% 10%,#d9f3ff 0%,#0000 50%),radial-gradient(circle at 80% 12%,#fbe9c9 0%,#0000 48%),linear-gradient(#f8f5ee 0%,#eef3f7 100%);margin:0}body:before{content:"";pointer-events:none;opacity:.4;background-image:linear-gradient(#0f172a0a 1px,#0000 1px),linear-gradient(90deg,#0f172a0a 1px,#0000 1px);background-size:36px 36px;position:fixed;inset:0}#root{z-index:1;min-height:100vh;padding:28px 32px 36px;position:relative}button,input{font:inherit}@keyframes rise{0%{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}.app-shell{flex-direction:column;gap:20px;animation:.4s rise;display:flex}.topbar{flex-wrap:wrap;justify-content:space-between;align-items:center;gap:16px;display:flex}.brand{align-items:center;gap:14px;display:flex}.brand-mark{border:1px solid var(--line);width:52px;height:52px;box-shadow:var(--shadow-soft);background:#fff;border-radius:14px;place-items:center;padding:4px;display:grid;overflow:hidden}.brand-logo{object-fit:contain;width:100%;height:100%;display:block}.brand-title{font-family:var(--font-display);font-size:24px;font-weight:600}.brand-subtitle{color:var(--muted);font-size:13px}.topbar-stats{flex-wrap:wrap;gap:10px;display:flex}.stat-card{background:var(--panel);border:1px solid var(--line);border-radius:var(--radius-md);box-shadow:var(--shadow-soft);gap:4px;min-width:120px;padding:10px 14px;display:grid}.stat-label{color:var(--muted);text-transform:uppercase;letter-spacing:1px;font-size:11px}.stat-value{font-size:16px;font-weight:600}.main-grid{grid-template-columns:minmax(240px,300px) minmax(0,1fr) minmax(280px,360px);align-items:stretch;gap:20px;display:grid}.panel{background:var(--panel);border:1px solid var(--line);border-radius:var(--radius-lg);box-shadow:var(--shadow);backdrop-filter:blur(8px);flex-direction:column;gap:12px;padding:16px;animation:.45s rise;display:flex}.panel-header{flex-direction:column;gap:6px;display:flex}.panel-title{font-family:var(--font-display);font-size:18px;font-weight:600}.panel-subtitle{color:var(--muted);font-size:13px}.panel-controls{align-items:center;gap:10px;display:flex}.search-input{border-radius:var(--radius-sm);border:1px solid var(--line);background:var(--panel-solid);flex:1;padding:10px 12px}.search-input:focus{border-color:#0ea5e980;outline:2px solid #0ea5e94d}.device-list{flex-direction:column;gap:10px;min-height:200px;padding-right:4px;display:flex;overflow-y:auto}.device-card{border-radius:var(--radius-md);background:var(--panel-solid);box-shadow:var(--shadow-soft);text-align:left;cursor:pointer;border:1px solid #0000;gap:8px;padding:12px;transition:border .2s,transform .2s;display:grid}.device-card:hover{border-color:#0ea5e980;transform:translateY(-1px)}.device-card.is-selected{border-color:var(--accent-strong);box-shadow:0 14px 26px #0ea5e926}.device-top{justify-content:space-between;align-items:center;gap:8px;display:flex}.device-id{font-size:13px;font-weight:600}.device-meta{color:var(--muted);justify-content:space-between;font-size:12px;display:flex}.device-model{text-transform:capitalize}.chip{background:var(--chip);border-radius:999px;align-items:center;gap:6px;padding:4px 10px;font-size:11px;font-weight:600;display:inline-flex}.status{border:1px solid #0000}.status--live{color:#0f5132;background:#d1fae5;border-color:#a7f3d0}.status--recent{color:#0c4a6e;background:#e0f2fe;border-color:#bae6fd}.status--idle{color:#7c2d12;background:#ffedd5;border-color:#fed7aa}.status--stale{color:#6b7280;background:#f3f4f6;border-color:#e5e7eb}.status--unknown{color:#475569;background:#e2e8f0;border-color:#cbd5f5}.map-panel{min-height:520px}.map-actions{flex-wrap:wrap;gap:8px;display:flex}.action-button{border:1px solid var(--line);background:var(--panel-solid);cursor:pointer;border-radius:999px;padding:6px 12px;font-size:12px;transition:border .2s,background .2s}.action-button.is-active{border-color:var(--accent-strong);background:#0ea5e91f}.map-wrap{border-radius:var(--radius-lg);border:1px solid var(--line);flex:1;min-height:420px;position:relative;overflow:hidden}#leaflet-map{width:100%;height:100%}.map-overlay{color:#fff;border-radius:var(--radius-md);max-width:260px;box-shadow:var(--shadow-soft);background:#0f172acc;padding:10px 12px;font-size:12px;position:absolute;bottom:16px;left:16px}.overlay-title{margin-bottom:4px;font-weight:600}.overlay-sub{color:#fffc}.detail-panel{min-height:520px}.tabs{flex-wrap:wrap;gap:8px;display:flex}.tab-button{border:1px solid var(--line);cursor:pointer;background:0 0;border-radius:999px;padding:6px 12px;font-size:12px;transition:background .2s,border .2s}.tab-button.is-active{background:var(--accent);border-color:var(--accent);color:#fff}.panel-body{flex-direction:column;flex:1;gap:12px;display:flex;overflow:auto}.summary-grid{grid-template-columns:repeat(2,minmax(0,1fr));gap:12px;display:grid}.summary-card{background:var(--panel-solid);border-radius:var(--radius-md);border:1px solid var(--line);gap:6px;padding:12px;display:grid}.summary-label{color:var(--muted);text-transform:uppercase;letter-spacing:1px;font-size:10px}.summary-value{font-size:15px;font-weight:600}.summary-meta{color:var(--muted);font-size:12px}.overview-block{border-radius:var(--radius-md);border:1px dashed var(--line);background:#ffffffb3;padding:12px}.block-title{margin-bottom:10px;font-weight:600}.activity{gap:8px;display:grid}.activity-item{color:var(--muted);justify-content:space-between;font-size:12px;display:flex}.activity-value{color:var(--ink);font-weight:600}.timeline{gap:10px;display:grid}.timeline-item{border-radius:var(--radius-md);border:1px solid var(--line);background:var(--panel-solid);gap:6px;padding:12px;display:grid}.timeline-item.is-offroad{border-color:#b91c1c66;box-shadow:0 10px 18px #b91c1c14}.clickable{cursor:pointer;transition:transform .15s,box-shadow .15s,border-color .15s}.clickable:hover{border-color:#7c3aed66;transform:translateY(-2px);box-shadow:0 12px 24px #7c3aed26}.clickable:active{transform:translateY(0)}.timeline-top{color:var(--muted);justify-content:space-between;align-items:center;gap:8px;font-size:12px;display:flex}.timeline-main{justify-content:space-between;align-items:center;gap:12px;font-size:13px;display:flex}.timeline-speed{font-weight:600}.timeline-road{color:var(--muted)}.timeline-coords{color:var(--muted);font-size:12px}.offroad-list,.packet-list{gap:10px;display:grid}.event-card,.packet-card{border-radius:var(--radius-md);border:1px solid var(--line);background:var(--panel-solid);gap:8px;padding:12px;display:grid}.event-top{justify-content:space-between;align-items:center;display:flex}.event-title{font-weight:600}.event-meta,.packet-meta{color:var(--muted);gap:6px;font-size:12px;display:grid}.event-card.severity-high{border-color:#b91c1c66}.event-card.severity-medium{border-color:#ca8a0466}.event-card.severity-low{border-color:#04785766}.chip--high{color:#b91c1c;background:#fee2e2}.chip--medium{color:#92400e;background:#fef3c7}.chip--low{color:#065f46;background:#d1fae5}.chip--danger{color:#b91c1c;background:#fee2e2}.packet-title{font-weight:600}.empty-state{border-radius:var(--radius-md);border:1px dashed var(--line);text-align:center;color:var(--muted);background:#fff9;padding:18px}.empty-title{color:var(--ink);margin-bottom:6px;font-weight:600}@media (width<=1200px){.main-grid{grid-template-columns:1fr}.map-panel,.detail-panel{min-height:auto}.summary-grid{grid-template-columns:1fr}}@media (width<=720px){#root{padding:20px}.topbar{flex-direction:column;align-items:flex-start}.panel-controls{flex-direction:column;align-items:stretch}.device-meta{flex-direction:column;align-items:flex-start;gap:4px}}.login-wrapper{background:radial-gradient(circle at 12% 10%,#d9f3ff 0%,#0000 50%),radial-gradient(circle at 80% 12%,#fbe9c9 0%,#0000 48%),linear-gradient(#f8f5ee 0%,#eef3f7 100%);justify-content:center;align-items:center;min-height:100vh;padding:20px;display:flex}.login-card{background:var(--panel-solid);border-radius:var(--radius-lg);box-shadow:var(--shadow);width:100%;max-width:400px;padding:40px}.login-title{text-align:center;color:var(--ink);margin-bottom:32px;font-size:24px;font-weight:700}.form-group{margin-bottom:20px}.form-group label{color:var(--muted);margin-bottom:8px;font-size:13px;font-weight:500;display:block}.form-group input{border:1px solid var(--line);border-radius:var(--radius-md);width:100%;padding:12px 14px;font-family:inherit;font-size:14px;transition:border-color .15s,box-shadow .15s}.form-group input:focus{border-color:var(--accent);outline:none;box-shadow:0 0 0 3px #0f6f5c26}.form-actions{margin-top:8px}.login-button{background:var(--accent);color:#fff;border-radius:var(--radius-md);cursor:pointer;border:none;width:100%;padding:12px;font-size:14px;font-weight:600;transition:background .15s,opacity .15s}.login-button:hover:not(:disabled){background:var(--accent-strong)}.login-button:disabled{opacity:.6;cursor:not-allowed}.login-error{border-radius:var(--radius-md);color:var(--danger);text-align:center;background:#fef2f2;border:1px solid #fecaca;margin-top:16px;padding:12px;font-size:13px}.app-loading{min-height:100vh;color:var(--muted);justify-content:center;align-items:center;font-size:18px;display:flex}.user-info{align-items:center;gap:12px;padding:6px 0;display:flex}.logout-button{border:1px solid var(--line);border-radius:var(--radius-sm);color:var(--muted);cursor:pointer;background:0 0;padding:6px 14px;font-size:12px;transition:all .15s}.logout-button:hover{background:var(--chip);color:var(--ink);border-color:var(--muted)}.date-filter{border-radius:var(--radius-md);background:var(--chip);border:1px solid var(--line);margin-bottom:16px;padding:16px}.date-filter-row{grid-template-columns:1fr 1fr;gap:12px;display:grid}.date-filter label{color:var(--muted);margin-bottom:6px;font-size:12px;font-weight:500;display:block}.date-filter input[type=datetime-local]{border:1px solid var(--line);border-radius:var(--radius-sm);width:100%;padding:8px 10px;font-family:inherit;font-size:13px}.date-filter input[type=datetime-local]:focus{border-color:var(--accent);outline:none}