:root{--font: system-ui, -apple-system, "Segoe UI", Roboto, "Noto Sans", "PingFang SC", "Microsoft YaHei", sans-serif;--mono: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;--bg: #f4f6f8;--surface: #ffffff;--border: #d9dee5;--text: #17202b;--muted: #5b6676;--primary: #1f5fbf;--primary-hover: #194f9f;--danger: #b42318;--danger-hover: #912018;--focus: #f59e0b;--fresh: #15803d;--fresh-bg: #e7f6ec;--stale: #b45309;--stale-bg: #fdf3e2;--offline: #6b7280;--offline-bg: #eef0f3;--nodata: #475569;--warn-bg: #fff7e6;--warn-border: #f2c879;--error-bg: #fdecea;--error-border: #f0a7a0;--info-bg: #eaf2fd;--info-border: #a9c6ef;--radius: 8px;--shadow: 0 1px 2px rgb(16 24 40 / 6%), 0 1px 3px rgb(16 24 40 / 10%);--topbar-h: 56px;color-scheme:light}*{box-sizing:border-box}html,body,#root{height:100%}body{margin:0;font-family:var(--font);font-size:15px;line-height:1.45;color:var(--text);background:var(--bg);-webkit-font-smoothing:antialiased}a{color:var(--primary)}:focus-visible{outline:3px solid var(--focus);outline-offset:2px}.sr-only{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap}.skip-link{position:absolute;left:8px;top:-40px;background:var(--surface);padding:6px 10px;border-radius:var(--radius);z-index:100}.skip-link:focus{top:8px}.h1{font-size:1.5rem;margin:0 0 12px;display:flex;align-items:center;gap:10px;flex-wrap:wrap}.h2{font-size:1.2rem;margin:0 0 10px}.h3{font-size:1.05rem;margin:0 0 10px}.muted{color:var(--muted)}.small{font-size:.85rem}.mono{font-family:var(--mono);font-size:.9em}.break{word-break:break-all}.nowrap{white-space:nowrap}.warn-text{color:var(--stale);font-weight:600}.btn{display:inline-flex;align-items:center;justify-content:center;gap:6px;min-height:38px;padding:8px 14px;border-radius:var(--radius);border:1px solid transparent;font:inherit;font-weight:600;text-decoration:none;cursor:pointer;background:var(--surface);color:var(--text)}.btn:disabled{opacity:.55;cursor:not-allowed}.btn-primary{background:var(--primary);color:#fff}.btn-primary:hover:not(:disabled){background:var(--primary-hover)}.btn-danger{background:var(--danger);color:#fff}.btn-danger:hover:not(:disabled){background:var(--danger-hover)}.btn-ghost{border-color:var(--border)}.btn-ghost:hover:not(:disabled){background:var(--bg)}.btn-sm{min-height:30px;padding:4px 10px;font-size:.85rem}.btn-block{width:100%}.topbar{height:var(--topbar-h);display:flex;align-items:center;gap:24px;padding:0 16px;background:var(--surface);border-bottom:1px solid var(--border);position:sticky;top:0;z-index:20}.brand{display:flex;align-items:center;gap:8px;font-weight:700}.brand-lg{font-size:1.1rem;margin-bottom:16px}.brand-mark{width:14px;height:14px;border-radius:50%;background:var(--primary);box-shadow:0 0 0 4px #d6e4f8;flex:none}.nav{display:flex;gap:4px}.nav a{padding:6px 12px;border-radius:var(--radius);color:var(--text);text-decoration:none;font-weight:500}.nav a:hover{background:var(--bg)}.nav a.active{background:#e3ecfa;color:var(--primary)}.userbox{margin-left:auto;display:flex;align-items:center;gap:12px;font-size:.9rem}.main{min-height:calc(100% - var(--topbar-h))}.main:focus{outline:none}.page{max-width:1200px;margin:0 auto;padding:20px 16px 40px}.narrow-page{max-width:760px}.page-head{display:flex;align-items:center;justify-content:space-between;gap:12px;flex-wrap:wrap}.breadcrumbs{font-size:.9rem;margin-bottom:8px;color:var(--muted)}.card{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);box-shadow:var(--shadow);padding:18px;margin-bottom:16px}.card.narrow{width:100%;max-width:400px}.center-screen{min-height:100%;display:flex;flex-direction:column;align-items:center;justify-content:center;padding:16px;gap:8px}.loading{display:flex;align-items:center;gap:10px;padding:16px;color:var(--muted)}.spinner{width:22px;height:22px;border:3px solid var(--border);border-top-color:var(--primary);border-radius:50%;animation:spin .9s linear infinite}@keyframes spin{to{transform:rotate(360deg)}}@media (prefers-reduced-motion: reduce){.spinner{animation-duration:3s}}.empty{padding:16px;color:var(--muted)}.alert{padding:10px 12px;border-radius:var(--radius);border:1px solid;margin:0 0 12px;display:flex;flex-direction:column;gap:6px}.alert .btn{align-self:flex-start}.alert-warning{background:var(--warn-bg);border-color:var(--warn-border)}.alert-error{background:var(--error-bg);border-color:var(--error-border)}.alert-info{background:var(--info-bg);border-color:var(--info-border)}.notices{position:fixed;right:16px;bottom:16px;display:flex;flex-direction:column;gap:8px;z-index:50;max-width:min(420px,calc(100vw - 32px))}.notice{display:flex;gap:10px;align-items:flex-start;justify-content:space-between;padding:12px 14px;border-radius:var(--radius);background:var(--surface);border:1px solid var(--border);border-left:5px solid var(--primary);box-shadow:0 6px 20px #1018282e}.notice-success{border-left-color:var(--fresh)}.notice-warning{border-left-color:var(--stale)}.notice-error{border-left-color:var(--danger)}.badge{display:inline-flex;align-items:center;gap:4px;padding:2px 8px;border-radius:999px;font-size:.78rem;font-weight:600;white-space:nowrap;border:1px solid transparent}.badge-icon{font-size:.9em}.badge-fresh{background:var(--fresh-bg);color:var(--fresh);border-color:#b7e3c5}.badge-stale{background:var(--stale-bg);color:var(--stale);border-color:#f2d19c}.badge-offline{background:var(--offline-bg);color:#374151;border-color:#cfd4db}.badge-no_data{background:#fff;color:var(--nodata);border:1px dashed #94a3b8}.badge-state-active{background:#e3ecfa;color:var(--primary)}.badge-state-invited{background:#f1ecfb;color:#5b3fa8}.badge-state-stopped,.badge-state-expired{background:var(--offline-bg);color:#374151}.flags{list-style:none;margin:6px 0 0;padding:0;display:flex;flex-wrap:wrap;gap:4px}.flag{font-size:.78rem;font-weight:600;color:#8a2c0d;background:#fdeee7;border-radius:4px;padding:1px 6px}.map-page{display:grid;grid-template-columns:360px 1fr;height:calc(100vh - var(--topbar-h))}.sidebar{overflow-y:auto;border-right:1px solid var(--border);background:var(--surface);padding:14px}.sidebar-head{display:flex;justify-content:space-between;align-items:baseline}.session-list{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:6px}.session-list.is-outdated{opacity:.7}.session-item{width:100%;text-align:left;font:inherit;color:inherit;background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);padding:10px;cursor:pointer;display:flex;flex-direction:column;gap:4px}.session-item:hover{background:#f8fafc}.session-item.is-selected{border-color:var(--primary);box-shadow:0 0 0 1px var(--primary)}.session-item-top{display:flex;justify-content:space-between;gap:8px;align-items:center}.session-item-meta{font-size:.85rem;color:var(--muted)}.vehicle{font-weight:700;letter-spacing:.02em}.panel{margin-top:14px;padding-top:14px;border-top:2px solid var(--border)}.panel-head{display:flex;justify-content:space-between;align-items:center}.panel-actions{display:flex;gap:8px;flex-wrap:wrap;margin-top:10px}.kv{display:grid;grid-template-columns:minmax(120px,40%) 1fr;gap:6px 12px;margin:12px 0;font-size:.92rem}.kv dt{color:var(--muted)}.kv dd{margin:0;word-break:break-word}.map-area{position:relative;min-height:300px}.map-wrap{position:absolute;top:0;right:0;bottom:0;left:0}.map-canvas{width:100%;height:100%}.map-wrap.is-dimmed .map-canvas{filter:grayscale(.6)}.map-banner{position:absolute;top:10px;left:50%;transform:translate(-50%);background:var(--warn-bg);border:1px solid var(--warn-border);border-radius:var(--radius);padding:6px 12px;font-weight:600;z-index:5}.map-overlay-note{position:absolute;left:10px;bottom:30px;background:#ffffffeb;border-radius:var(--radius);padding:4px 8px;font-size:.8rem}.history-map{height:320px;border-radius:var(--radius);overflow:hidden;margin-bottom:12px;border:1px solid var(--border)}.map-marker{display:flex;align-items:center;gap:4px;padding:0;border:none;background:none;cursor:pointer;font:inherit}.map-marker-dot{width:18px;height:18px;border-radius:50%;border:3px solid #fff;box-shadow:0 0 0 1px #00000059,0 1px 4px #0000004d;flex:none}.map-marker-label{background:#fffffff0;border:1px solid var(--border);border-radius:4px;padding:0 5px;font-size:.75rem;font-weight:700;white-space:nowrap;color:var(--text)}.map-marker-fresh .map-marker-dot{background:var(--fresh)}.map-marker-stale .map-marker-dot{background:repeating-linear-gradient(45deg,var(--stale) 0 3px,#fff 3px 5px)}.map-marker-offline .map-marker-dot{background:#fff;border:3px dashed var(--offline)}.map-marker-offline .map-marker-label,.map-marker-stale .map-marker-label{color:var(--muted);font-style:italic}.map-marker.is-selected .map-marker-dot{box-shadow:0 0 0 3px var(--primary),0 1px 4px #0000004d}.map-marker.is-selected .map-marker-label{border-color:var(--primary)}.table-wrap{overflow-x:auto;background:var(--surface);border:1px solid var(--border);border-radius:var(--radius)}.table{width:100%;border-collapse:collapse;font-size:.9rem}.table th,.table td{padding:8px 10px;border-bottom:1px solid var(--border);text-align:left;vertical-align:top}.table th{background:#f8fafc;font-weight:600;color:var(--muted);white-space:nowrap}.table tbody tr:last-child td{border-bottom:none}.tabs{display:flex;gap:4px;border-bottom:1px solid var(--border);margin-bottom:10px;flex-wrap:wrap}.tab{font:inherit;background:none;border:none;border-bottom:3px solid transparent;padding:8px 14px;cursor:pointer;color:var(--muted);font-weight:600}.tab.is-active{color:var(--primary);border-bottom-color:var(--primary)}.pager{display:flex;align-items:center;gap:12px;margin-top:12px}.form{display:flex;flex-direction:column;gap:14px}.field{display:flex;flex-direction:column;gap:4px}.field label,.invite-main label{font-weight:600}input{font:inherit;padding:9px 11px;border:1px solid #b8c0cc;border-radius:var(--radius);background:#fff;color:var(--text);min-width:0}input:focus-visible{outline:3px solid var(--focus);outline-offset:0}.field.has-error input{border-color:var(--danger)}.field-help{font-size:.82rem;color:var(--muted)}.field-error,.form-error{color:var(--danger);font-size:.88rem;font-weight:600;margin:0}.form-actions{display:flex;gap:8px;flex-wrap:wrap}.invite-card{display:flex;gap:20px;flex-wrap:wrap}.invite-main{flex:1 1 320px;min-width:0}.copy-row{display:flex;gap:8px;margin:6px 0}.copy-row input{flex:1}.qr{margin:0;text-align:center}.qr canvas{display:block;border:1px solid var(--border);border-radius:var(--radius)}.modal{border:none;border-radius:12px;padding:0;width:min(480px,calc(100vw - 32px));box-shadow:0 20px 50px #1018284d}.modal::backdrop{background:#0f172a73}.modal-panel{padding:20px}.modal-title{margin:0 0 10px;font-size:1.15rem}.modal-footer{display:flex;justify-content:flex-end;gap:8px;margin-top:16px}.public{min-height:100%;background:var(--bg)}.public-header{display:flex;align-items:center;gap:8px;padding:14px 16px;background:var(--surface);border-bottom:1px solid var(--border);font-weight:700}.public-main{max-width:640px;margin:0 auto;padding:18px 14px 40px}.list{padding-left:20px;margin:8px 0}.list li{margin-bottom:6px}.button-stack{display:flex;flex-direction:column;gap:8px;margin:8px 0 12px}.public .btn{min-height:46px}.detail-grid{display:grid;grid-template-columns:1fr 1fr;gap:16px}@media (max-width: 900px){.topbar{height:auto;flex-wrap:wrap;gap:8px;padding:8px 12px}.userbox{margin-left:0}.map-page{grid-template-columns:1fr;grid-template-rows:50vh auto;height:auto}.map-area{order:-1;min-height:50vh}.sidebar{border-right:none}.detail-grid{grid-template-columns:1fr}.kv{grid-template-columns:1fr;gap:0 12px}.kv dd{margin-bottom:8px}.copy-row{flex-direction:column}}
