:root{--bg:#0f172a;--bg-elevated:#1e293b;--bg-input:#334155;--border:#475569;--text:#f1f5f9;--text-muted:#94a3b8;--primary:#22d3ee;--primary-hover:#06b6d4;--danger:#ef4444;--success:#10b981;font-family:system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial,sans-serif}*{box-sizing:border-box;margin:0;padding:0}body,html{height:100%}body{background:var(--bg);color:var(--text);-webkit-font-smoothing:antialiased;overscroll-behavior:none}a{color:var(--primary);text-decoration:none}button{cursor:pointer;font:inherit;background:var(--primary);color:#0f172a;border:none;border-radius:6px;padding:.6rem 1.2rem;font-weight:600}button:hover:not(:disabled){background:var(--primary-hover)}button:disabled{opacity:.5;cursor:not-allowed}input,select{font:inherit;background:var(--bg-input);color:var(--text);border:1px solid var(--border);border-radius:6px;padding:.6rem .8rem;width:100%}input:focus,select:focus{outline:2px solid var(--primary);outline-offset:-1px}.login-screen{display:grid;place-items:center;min-height:100vh;min-height:100dvh;padding:1rem}.login-card{width:100%;max-width:360px;background:var(--bg-elevated);padding:2rem;border-radius:12px;box-shadow:0 10px 25px rgba(0,0,0,.3)}.login-card h1{font-size:1.5rem;margin-bottom:1.5rem}.login-card .field{margin-bottom:1rem}.login-card label{display:block;margin-bottom:.4rem;font-size:.85rem;color:var(--text-muted)}.login-card .error{color:var(--danger);font-size:.85rem;margin-bottom:.8rem}.login-card button{width:100%;margin-top:.5rem}.dashboard{display:grid;grid-template-columns:320px 1fr;height:100vh;height:100dvh;overflow:hidden;position:relative}.sidebar{border-right:1px solid var(--border);display:flex;flex-direction:column;overflow:hidden}.sidebar,.sidebar-toggle{background:var(--bg-elevated)}.sidebar-toggle{display:none;position:absolute;top:.75rem;left:.75rem;z-index:15;width:40px;height:40px;padding:0;border-radius:8px;color:var(--text);border:1px solid var(--border);box-shadow:0 4px 12px rgba(0,0,0,.25);align-items:center;justify-content:center}.sidebar-backdrop{display:none}.sidebar header{padding:1rem 1.2rem;border-bottom:1px solid var(--border);display:flex;justify-content:space-between;align-items:center}.sidebar header h1{font-size:1.1rem;color:var(--primary)}.sidebar .meta{margin-top:.2rem}.sidebar .logout,.sidebar .meta{font-size:.75rem;color:var(--text-muted)}.sidebar .logout{background:transparent;padding:.3rem .6rem;border:1px solid var(--border)}.sidebar .logout:hover{color:var(--text);border-color:var(--text-muted)}.device-list{flex:1 1;overflow-y:auto}.device-list .empty{padding:1.5rem;color:var(--text-muted);font-size:.9rem;text-align:center}.device-item{position:relative;padding:.9rem 1.2rem;border-bottom:1px solid var(--border);cursor:pointer;display:flex;gap:.7rem;align-items:flex-start}.device-item:hover{background:hsla(0,0%,100%,.03)}.device-item.active{background:rgba(34,211,238,.08);border-left:3px solid var(--primary);padding-left:calc(1.2rem - 3px)}.device-item .color-swatch{width:10px;height:10px;border-radius:50%;margin-top:.35rem;flex-shrink:0;box-shadow:0 0 0 2px rgba(0,0,0,.4)}.device-item .device-body{flex:1 1;display:flex;flex-direction:column;gap:.2rem;min-width:0;padding-right:6rem}.device-item .name{font-weight:600;font-size:.95rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.device-item .imei{font-family:ui-monospace,monospace}.device-item .imei,.device-item .last{font-size:.75rem;color:var(--text-muted)}.device-item .last{display:flex;gap:.4rem;align-items:center}.device-item .dot{width:8px;height:8px;border-radius:50%;background:var(--text-muted)}.device-item .dot.online{background:var(--success)}.device-item .status-chips{display:flex;gap:.35rem;flex-wrap:wrap;margin-top:.15rem}.device-item .status-chips .chip{display:inline-flex;align-items:center;gap:.2rem;font-size:.7rem;line-height:1;padding:.18rem .4rem;background:hsla(0,0%,100%,.04);border-radius:4px;color:var(--text-muted)}.device-item .status-chips .chip.ign-on{color:var(--success);background:rgba(34,197,94,.1)}.device-item .status-chips .chip.ign-off{color:var(--text-muted)}.device-item .status-chips .chip.gps-lost{color:#f59e0b;background:rgba(245,158,11,.12)}.device-item .actions{position:absolute;top:.6rem;right:.7rem;display:flex;gap:.3rem;opacity:0;transition:opacity .15s}.device-item.active .actions,.device-item:focus-within .actions,.device-item:hover .actions{opacity:1}.device-item .icon-btn{position:relative;background:transparent;color:var(--text-muted);border:1px solid var(--border);border-radius:6px;padding:.3rem;display:inline-flex;align-items:center;justify-content:center;width:28px;height:28px;transition:color .12s,border-color .12s,background .12s}.device-item .icon-btn:hover{color:var(--text);border-color:var(--text-muted);background:hsla(0,0%,100%,.04)}.device-item .icon-btn.active{background:var(--primary);color:#0f172a;border-color:var(--primary)}.device-item .icon-btn.active:hover{background:var(--primary-hover);border-color:var(--primary-hover);color:#0f172a}.device-item .icon-btn:disabled{opacity:.35;cursor:not-allowed;background:transparent;color:var(--text-muted);border-color:var(--border)}.device-item .icon-btn:disabled:after{display:none}[data-tooltip]{position:relative}[data-tooltip]:after{content:attr(data-tooltip);position:absolute;top:calc(100% + 6px);right:0;background:#0b1220;color:var(--text);font-size:.72rem;font-weight:500;padding:.25rem .5rem;border-radius:4px;white-space:nowrap;pointer-events:none;opacity:0;transition:opacity .12s;border:1px solid var(--border);z-index:20}[data-tooltip]:focus-visible:after,[data-tooltip]:hover:after{opacity:1}.map-wrap{position:relative;height:100%}.map{width:100%;height:100%}.status-pill{position:absolute;bottom:1rem;left:1rem;background:var(--bg-elevated);padding:.4rem .8rem;border-radius:999px;font-size:.8rem;display:flex;gap:.5rem;align-items:center;z-index:10;border:1px solid var(--border)}.status-pill .dot{width:8px;height:8px;border-radius:50%;background:var(--text-muted)}.status-pill .dot.online{background:var(--success);animation:pulse 2s infinite}.status-pill .dot.error{background:var(--danger)}@keyframes pulse{0%,to{opacity:1}50%{opacity:.4}}.map-controls{position:absolute;top:1rem;left:1rem;z-index:10;display:flex;flex-direction:column;gap:.5rem;width:clamp(220px,28vw,320px)}.map-controls form{display:flex;gap:.4rem;background:var(--bg-elevated);padding:.3rem;border-radius:8px;border:1px solid var(--border);box-shadow:0 4px 12px rgba(0,0,0,.25)}.map-controls form input{flex:1 1;background:transparent;border:none;padding:.4rem .6rem;font-size:.85rem}.map-controls form input:focus{outline:none}.map-controls form button{padding:.4rem .7rem;font-size:.9rem;border-radius:6px}.map-controls-error{background:rgba(239,68,68,.15);color:#fca5a5;font-size:.78rem;padding:.4rem .7rem;border-radius:6px;border:1px solid rgba(239,68,68,.3)}.style-switcher{display:flex;background:var(--bg-elevated);padding:.25rem;border-radius:8px;border:1px solid var(--border);box-shadow:0 4px 12px rgba(0,0,0,.25);gap:.2rem}.style-switcher button{flex:1 1;background:transparent;color:var(--text-muted);padding:.4rem .5rem;border-radius:5px;font-size:.78rem;font-weight:500}.style-switcher button:hover{color:var(--text);background:hsla(0,0%,100%,.05)}.style-switcher button.active{background:var(--primary);color:#0f172a}.style-switcher button.active:hover{background:var(--primary-hover)}.tracker-marker{--marker-color:var(--primary);width:18px;height:18px;border-radius:50%;background:var(--marker-color);border:3px solid #0f172a;box-shadow:0 0 0 2px var(--marker-color),0 0 10px color-mix(in srgb,var(--marker-color) 60%,transparent)}.replay-panel{position:absolute;bottom:1rem;left:50%;transform:translateX(-50%);z-index:12;background:var(--bg-elevated);border:1px solid var(--border);border-radius:12px;padding:.8rem 1rem;box-shadow:0 6px 20px rgba(0,0,0,.35);width:clamp(360px,60vw,720px);display:flex;flex-direction:column;gap:.6rem}.replay-panel .replay-top{display:flex;align-items:center;gap:.7rem}.replay-panel .play-btn{width:38px;height:38px;border-radius:50%;font-size:1rem;padding:0;display:flex;align-items:center;justify-content:center}.replay-panel .replay-info{flex:1 1;display:flex;flex-direction:column;min-width:0}.replay-panel .replay-info .stamp{font-size:.9rem;font-weight:500}.replay-panel .replay-info .meta{font-size:.75rem;color:var(--text-muted)}.replay-panel .speed{width:auto;padding:.35rem .5rem;font-size:.8rem}.replay-panel .close{background:transparent;color:var(--text-muted);border:1px solid var(--border);padding:.25rem .55rem;font-size:1rem;border-radius:6px;line-height:1}.replay-panel .scrubber{-webkit-appearance:none;-moz-appearance:none;appearance:none;width:100%;height:6px;border-radius:3px;outline:none;cursor:pointer}.replay-panel .scrubber::-webkit-slider-thumb{-webkit-appearance:none;width:16px;height:16px;border-radius:50%;background:var(--primary);cursor:pointer;border:2px solid var(--bg-elevated)}.replay-panel .scrubber::-moz-range-thumb{width:16px;height:16px;border-radius:50%;background:var(--primary);cursor:pointer;border:2px solid var(--bg-elevated)}.replay-panel .replay-empty{color:var(--text-muted);font-size:.9rem;text-align:center;padding:.5rem 0}.stop-marker{--stop-color:var(--primary);width:26px;height:26px;border-radius:50%;background:var(--bg-elevated);border:2px solid var(--stop-color);color:var(--stop-color);font-size:.78rem;font-weight:700;display:flex;align-items:center;justify-content:center;cursor:pointer;box-shadow:0 2px 6px rgba(0,0,0,.4)}.stop-popup{font-size:.78rem;color:#0f172a;line-height:1.4}.maplibregl-popup-content{padding:.5rem .7rem}.map-wrap.replaying .map-controls{display:none}.replay-bar{position:absolute;top:1rem;left:50%;transform:translateX(-50%);z-index:11;display:flex;align-items:flex-start;gap:.8rem;max-width:min(760px,calc(100% - 4rem));background:var(--bg-elevated);border:1px solid var(--border);border-radius:12px;padding:.6rem .8rem;box-shadow:0 6px 20px rgba(0,0,0,.35)}.replay-bar .close{background:transparent;border:1px solid var(--border);color:var(--text-muted);border-radius:6px;padding:.4rem .7rem;font-size:.8rem;line-height:1}.replay-bar .close:hover{color:var(--text);border-color:var(--text-muted);background:hsla(0,0%,100%,.04)}.replay-bar .title-block{display:flex;flex-direction:column;gap:.15rem;min-width:0}.replay-bar .name{font-size:.95rem;font-weight:600;color:var(--text);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.replay-bar .stats{font-size:.75rem;color:var(--text-muted);white-space:nowrap}.period-picker{display:flex;flex-direction:column;gap:.5rem}.period-picker .preset-row{display:flex;gap:.3rem;flex-wrap:wrap}.period-picker .preset-row button{background:transparent;color:var(--text-muted);border:1px solid var(--border);padding:.35rem .7rem;font-size:.78rem;border-radius:6px}.period-picker .preset-row button:hover{color:var(--text);border-color:var(--text-muted)}.period-picker .preset-row button.active{background:var(--primary);color:#0f172a;border-color:var(--primary)}.period-picker .custom-row{display:flex;gap:.8rem;flex-wrap:wrap}.period-picker .custom-row label{display:flex;flex-direction:column;gap:.2rem;font-size:.72rem;color:var(--text-muted);min-width:180px}.period-picker .custom-row input{width:auto;padding:.35rem .5rem;font-size:.82rem}@media (min-width:769px){.replay-bar .period-picker{flex:1 1 auto;min-width:0}.replay-bar .custom-row{flex-wrap:nowrap;gap:.6rem}.replay-bar .custom-row label{min-width:0;flex:1 1}.replay-bar .custom-row input{width:100%}}.replay-empty-overlay{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);background:var(--bg-elevated);padding:1rem 1.5rem;border-radius:8px;border:1px solid var(--border);color:var(--text-muted);font-size:.9rem;z-index:11}.replay-error{top:1rem;right:1rem;background:rgba(239,68,68,.15);color:#fca5a5;padding:.5rem .8rem;border-radius:6px;border:1px solid rgba(239,68,68,.3);font-size:.82rem}.day-summary,.replay-error{position:absolute;z-index:11}.day-summary{top:10.5rem;left:1rem;width:244px;max-width:calc(100% - 2rem);background:var(--bg-elevated);border:1px solid var(--border);border-radius:10px;box-shadow:0 6px 20px rgba(0,0,0,.35);overflow:hidden}.day-summary-toggle{width:100%;display:flex;align-items:center;justify-content:space-between;gap:.5rem;background:transparent;color:var(--text);border:none;padding:.6rem .8rem;font-size:.85rem;font-weight:600;cursor:pointer}.day-summary-toggle .chev{color:var(--text-muted)}.day-summary-body{padding:0 .8rem .8rem;display:flex;flex-direction:column;gap:.7rem}.day-summary .metrics{display:grid;grid-template-columns:1fr 1fr;grid-gap:.5rem;gap:.5rem}.day-summary .metric{background:var(--bg);border:1px solid var(--border);border-radius:8px;padding:.45rem .5rem}.day-summary .metric-value{font-size:.95rem;font-weight:600;color:var(--text)}.day-summary .metric-label{font-size:.68rem;color:var(--text-muted);margin-top:.1rem}.day-summary .stops-section{display:flex;flex-direction:column;gap:.4rem}.day-summary .stops-head{font-size:.7rem;color:var(--text-muted);text-transform:uppercase;letter-spacing:.04em}.day-summary .stops-list{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:.35rem;max-height:220px;overflow-y:auto}.day-summary .stops-list li{display:flex;align-items:center;gap:.5rem;font-size:.76rem;color:var(--text)}.day-summary .stops-list .idx{flex-shrink:0;width:18px;height:18px;display:grid;place-items:center;background:var(--primary);color:#0f172a;border-radius:50%;font-size:.68rem;font-weight:700}.day-summary .stops-list .when{flex:1 1}.day-summary .stops-list .dur,.day-summary .stops-list .when{font-feature-settings:"tnum";font-variant-numeric:tabular-nums}.day-summary .stops-list .dur{color:var(--text-muted)}.sheet-backdrop{position:fixed;inset:0;background:rgba(0,0,0,.45);z-index:50;animation:sheetFade .18s ease-out}@keyframes sheetFade{0%{background:transparent}to{background:rgba(0,0,0,.45)}}.sheet{position:absolute;top:0;right:0;bottom:0;width:clamp(320px,30vw,440px);background:var(--bg-elevated);border-left:1px solid var(--border);display:flex;flex-direction:column;box-shadow:-10px 0 30px rgba(0,0,0,.4);animation:sheetSlide .22s cubic-bezier(.16,1,.3,1)}@keyframes sheetSlide{0%{transform:translateX(100%)}to{transform:translateX(0)}}.sheet header{display:flex;align-items:center;justify-content:space-between;padding:1rem 1.2rem;border-bottom:1px solid var(--border);flex-shrink:0}.sheet header h2{font-size:1.05rem}.sheet .icon-btn{background:transparent;color:var(--text-muted);border:none;font-size:1.5rem;line-height:1;padding:.2rem .5rem}.sheet .icon-btn:hover{color:var(--text)}.sheet form{padding:1.2rem;display:flex;flex-direction:column;gap:1rem;overflow-y:auto;flex:1 1}.sheet .field label{display:block;margin-bottom:.4rem;font-size:.8rem;color:var(--text-muted)}.sheet .field-row{display:grid;grid-template-columns:1fr 1fr;grid-gap:.8rem;gap:.8rem}.sheet .field input:disabled{opacity:.6;cursor:not-allowed}.sheet .error{background:rgba(239,68,68,.15);color:#fca5a5;font-size:.85rem;padding:.5rem .7rem;border-radius:6px;border:1px solid rgba(239,68,68,.3)}.sheet .actions{display:flex;justify-content:flex-end;gap:.6rem;margin-top:auto;border-top:1px solid var(--border);padding-top:1rem}.sheet .secondary{background:transparent;color:var(--text);border:1px solid var(--border)}.sheet .secondary:hover:not(:disabled){background:hsla(0,0%,100%,.05);border-color:var(--text-muted)}.color-picker{display:grid;grid-template-columns:repeat(10,1fr);grid-gap:.4rem;gap:.4rem}.color-picker .swatch{aspect-ratio:1;border-radius:50%;border:2px solid transparent;padding:0;cursor:pointer;transition:transform .1s}.color-picker .swatch:hover{transform:scale(1.1)}.color-picker .swatch.active{border-color:var(--text);box-shadow:0 0 0 2px var(--bg-elevated),0 0 0 4px var(--text)}@media (max-width:768px){.dashboard{grid-template-columns:1fr}.sidebar-toggle{display:inline-flex}.sidebar{position:absolute;top:0;left:0;bottom:0;width:min(85vw,320px);z-index:40;transform:translateX(-100%);transition:transform .22s cubic-bezier(.16,1,.3,1);box-shadow:8px 0 24px rgba(0,0,0,.4)}.sidebar.open{transform:translateX(0)}.sidebar-backdrop{display:block;position:absolute;inset:0;background:rgba(0,0,0,.45);z-index:35;animation:sheetFade .18s ease-out}.map-wrap{grid-column:1}.map-controls{top:.75rem;left:.75rem;right:.75rem;width:auto;max-width:none}.dashboard .map-controls{left:calc(40px + .75rem + .5rem)}.map-controls form input{font-size:16px}.maplibregl-ctrl-top-right{top:auto;bottom:7rem}.status-pill{bottom:.75rem;left:.75rem;font-size:.72rem;padding:.3rem .6rem}.replay-panel{width:calc(100% - 1rem);left:.5rem;right:.5rem;bottom:.5rem;transform:none;padding:.6rem .7rem;gap:.5rem}.replay-panel .replay-top{gap:.5rem}.replay-panel .play-btn{width:34px;height:34px;flex-shrink:0}.replay-panel .replay-info .stamp{font-size:.82rem}.replay-panel .speed{font-size:.75rem;padding:.3rem .4rem}.sheet{width:100%;max-width:none}.sheet form{padding:1rem;gap:.8rem}.sheet .field-row{grid-template-columns:1fr;gap:.8rem}.sheet input,.sheet select{font-size:16px}.color-picker{grid-template-columns:repeat(8,1fr)}.dashboard.replaying .sidebar-toggle,.map-wrap.replaying .status-pill{display:none}.replay-bar{left:.5rem;right:.5rem;top:.75rem;transform:none;max-width:none;flex-wrap:wrap;gap:.5rem}.replay-bar .title-block{flex:1 1;min-width:0}.replay-bar .period-picker{flex:1 1 100%;min-width:0}.map-wrap.replaying .day-summary{top:8rem}.map-wrap.replaying.custom-range .day-summary{top:14rem}.day-summary .stops-list{max-height:30vh}.period-picker .preset-row{flex-wrap:nowrap;overflow-x:auto;-webkit-overflow-scrolling:touch;padding-bottom:.2rem}.period-picker .preset-row button{flex-shrink:0}.period-picker .custom-row{gap:.5rem}.period-picker .custom-row label{min-width:0;flex:1 1 100%}.period-picker .custom-row input{width:100%;min-width:0;font-size:16px}.login-card{padding:1.5rem}.device-item{padding:1rem}.device-item .device-body{padding-right:0}.device-item .actions{position:static;opacity:1;margin-top:.5rem}.device-item .icon-btn{width:34px;height:34px}[data-tooltip]:after{display:none}}@supports (padding:max(0px)){@media (max-width:768px){.map-controls,.sidebar-toggle{top:max(.75rem,env(safe-area-inset-top))}.status-pill{bottom:max(.75rem,env(safe-area-inset-bottom))}.replay-panel{bottom:max(.5rem,env(safe-area-inset-bottom))}.maplibregl-ctrl-top-right{bottom:calc(7rem + env(safe-area-inset-bottom))}}}