*,:before,:after{box-sizing:border-box;margin:0;padding:0}:root{--bg:#f0f2f5;--surface:#fff;--border:#e2e6ea;--text:#1a1d23;--text2:#6b7280;--primary:#2563eb;--red:#dc2626;--green:#16a34a;--radius:8px;color:var(--text);font-family:Inter,Segoe UI,system-ui,sans-serif;font-size:13px}body{background:var(--bg);overflow:hidden}.app{flex-direction:column;height:100vh;display:flex;overflow:hidden}.header{color:#e2e8f0;background:#1e2433;flex-shrink:0;justify-content:space-between;align-items:center;gap:12px;height:46px;padding:0 18px;display:flex}.header-left{align-items:center;gap:8px;display:flex}.header-right{flex-wrap:wrap;gap:6px;display:flex}.header-icon{font-size:18px}.header-title{font-size:14px;font-weight:600}.file-badge{white-space:nowrap;text-overflow:ellipsis;border-radius:12px;max-width:220px;padding:2px 9px;font-size:11.5px;font-weight:500;overflow:hidden}.badge-video{color:#93c5fd;background:#2563eb4d}.badge-parquet{color:#86efac;background:#16a34a4d}.toolbar{background:var(--surface);border-bottom:1px solid var(--border);flex-wrap:wrap;flex-shrink:0;align-items:center;gap:8px;padding:7px 18px;display:flex}.btn-upload{border:1.5px solid var(--border);background:var(--surface);cursor:pointer;border-radius:6px;align-items:center;gap:5px;padding:5px 13px;font-size:12.5px;font-weight:500;transition:background .12s,border-color .12s;display:inline-flex}.btn-upload:hover{background:#f3f4f6;border-color:#c0c7d0}.status-pill{border-radius:20px;padding:3px 10px;font-size:12px}.status-loading{color:var(--primary);background:#eff6ff}.status-ok{color:var(--green);background:#f0fdf4}.status-error{color:var(--red);background:#fef2f2}.controls{background:var(--surface);border-bottom:1px solid var(--border);flex-direction:column;flex-shrink:0;gap:6px;padding:8px 18px 10px;display:flex}.ctrl-row{flex-wrap:wrap;align-items:center;gap:5px;display:flex}.ctrl-lbl{color:var(--text2);text-transform:uppercase;letter-spacing:.05em;min-width:52px;font-size:11px;font-weight:700}.ctrl-sep{background:var(--border);width:1px;height:16px;margin:0 6px}.sensor-btn{border:1.5px solid var(--border);background:var(--surface);color:var(--text2);cursor:pointer;border-radius:20px;padding:4px 13px;font-size:12px;font-weight:500;transition:all .12s}.sensor-btn:hover{border-color:var(--primary);color:var(--text)}.sensor-btn.active{background:var(--primary);color:#fff;border-color:#0000;font-weight:600}.sensor-full{color:var(--text2);border:1px solid var(--border);background:#f3f4f6;border-radius:4px;padding:2px 7px;font-size:11px}.sensor-badge{border:1.5px solid var(--border);background:var(--surface);color:var(--text2);cursor:pointer;-webkit-user-select:none;user-select:none;border-radius:20px;align-items:center;padding:4px 12px;font-size:12px;font-weight:600;transition:all .12s;display:inline-flex}.sensor-badge:hover{opacity:.8}.sensor-badge-off{opacity:.5;border-color:var(--border)!important;color:var(--text2)!important;background:#f3f4f6!important}.col-chip{border:1.5px solid var(--border);background:var(--surface);color:var(--text2);cursor:pointer;border-radius:20px;padding:3px 11px;font-size:12px;font-weight:500;transition:all .12s}.col-chip:hover{color:var(--text);border-color:#adb5bd}.col-chip.active{background:var(--c,var(--primary));color:#fff;border-color:#0000;font-weight:600}.col-chip.ghost{color:var(--text2);border-style:dashed;font-style:italic}.col-chip.ghost:hover{background:#f3f4f6}.select-sm,.input-sm{border:1.5px solid var(--border);background:var(--surface);color:var(--text);border-radius:5px;outline:none;padding:4px 7px;font-size:12.5px;transition:border-color .12s}.select-sm:focus,.input-sm:focus{border-color:var(--primary)}.unit-toggle{border:1.5px solid var(--border);border-radius:6px;display:flex;overflow:hidden}.unit-btn{background:var(--surface);border:none;border-right:1.5px solid var(--border);color:var(--text2);cursor:pointer;padding:3px 10px;font-size:12px;font-weight:500;transition:background .12s}.unit-btn:last-child{border-right:none}.unit-btn:hover{color:var(--text);background:#f3f4f6}.unit-btn.active{background:var(--primary);color:#fff;font-weight:700}.btn-build{background:var(--primary);color:#fff;cursor:pointer;border:none;border-radius:6px;padding:5px 16px;font-size:13px;font-weight:600;transition:background .12s}.btn-build:hover{background:#1d4ed8}.btn-build:disabled{opacity:.4;cursor:not-allowed}.content{flex-direction:row;flex:1;min-height:0;display:flex;overflow:hidden}.video-side{border-right:1px solid var(--border);flex-direction:column;flex-shrink:0;width:42%;min-height:0;display:flex}.video-wrap{background:#0d1117;flex:1;justify-content:center;align-items:center;min-height:0;display:flex;position:relative;overflow:hidden}.video-wrap.zoomed{cursor:grab}.video-wrap.zoomed:active{cursor:grabbing}.video-transform{will-change:transform;flex-shrink:0;justify-content:center;align-items:center;width:100%;height:100%;display:flex}.video-el{object-fit:contain;width:100%;height:100%;display:block}.zoom-overlay{-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px);z-index:20;-webkit-user-select:none;user-select:none;background:#0000008c;border-radius:8px;align-items:center;gap:2px;padding:4px 6px;display:flex;position:absolute;bottom:10px;right:10px}.zoom-btn{color:#fff;cursor:pointer;background:#ffffff1f;border:1px solid #fff3;border-radius:6px;justify-content:center;align-items:center;width:26px;height:26px;font-size:16px;line-height:1;transition:background .12s;display:flex}.zoom-btn:hover{background:#ffffff40}.zoom-btn:active{background:#ffffff59}.zoom-reset{background:#dc28284d;border-color:#dc282880;font-size:13px}.zoom-reset:hover{background:#dc282880}.zoom-label{color:#e2e8f0;text-align:center;font-variant-numeric:tabular-nums;min-width:32px;font-size:12px;font-weight:600}.time-bar{background:#161b22;flex-shrink:0;align-items:center;gap:18px;height:28px;padding:4px 16px;display:flex}.time-lbl{color:#8b949e;font-variant-numeric:tabular-nums;font-family:Courier New,monospace;font-size:12px}.imu-lbl{color:#f87171}.muted{color:#4b5563}.dur{margin-left:auto}.drop-hint{color:#4b5563;flex-direction:column;flex:1;justify-content:center;align-items:center;gap:8px;display:flex}.drop-hint span{opacity:.4;font-size:36px}.drop-hint p{font-size:13px}.timeline{cursor:col-resize;-webkit-user-select:none;user-select:none;background:#1a1e2b;border-top:1px solid #2d3340;flex-shrink:0;height:52px;position:relative;overflow:hidden}.tl-played{pointer-events:none;background:#2563eb2e;position:absolute;top:0;bottom:0;left:0}.tl-tick{pointer-events:none;position:absolute;top:0;transform:translate(-50%)}.tl-tick-line{background:#4b5563;width:1px;height:10px;margin:6px auto 0}.tl-tick-lbl{color:#6b7280;text-align:center;white-space:nowrap;margin-top:3px;font-size:10px;display:block}.tl-cursor{pointer-events:none;z-index:10;position:absolute;top:0;transform:translate(-50%)}.tl-cursor-head{background:#ef4444;border-radius:50%;width:12px;height:12px;margin:4px auto 0;box-shadow:0 0 6px #ef4444b3}.tl-cursor-line{opacity:.85;background:#ef4444;width:2px;height:36px;margin:0 auto}.chart-side{flex-direction:column;flex:1;min-height:0;display:flex;overflow:hidden}.label-panel{background:var(--surface);border-bottom:1px solid var(--border);flex-wrap:wrap;flex-shrink:0;align-items:center;gap:6px;min-height:38px;padding:5px 12px;display:flex}.lab-mode-btn{border:1.5px solid var(--border);background:var(--surface);color:var(--text2);cursor:pointer;white-space:nowrap;border-radius:6px;padding:4px 12px;font-size:12px;font-weight:500;transition:all .12s}.lab-mode-btn:hover{border-color:var(--primary);color:var(--text)}.lab-mode-btn.active{color:#92400e;background:#fef3c7;border-color:#f59e0b;font-weight:600}.foot-toggle,.pattern-toggle{border:1.5px solid var(--border);border-radius:6px;display:flex;overflow:hidden}.pattern-vis-btn{background:var(--surface);color:var(--text2);cursor:pointer;opacity:.42;white-space:nowrap;border:none;align-items:center;gap:2px;padding:3px 10px;font-size:12px;font-weight:600;transition:opacity .12s,background .12s;display:flex}.pattern-vis-btn+.pattern-vis-btn{border-left:1.5px solid var(--border)}.pattern-vis-btn:hover{opacity:.7;background:#f3f4f6}.pattern-vis-btn.vis-on{color:var(--pc,var(--primary));opacity:1}.foot-btn{background:var(--surface);color:var(--text2);cursor:pointer;white-space:nowrap;border:none;align-items:center;gap:3px;padding:3px 10px;font-size:12px;font-weight:500;transition:background .12s;display:flex}.foot-btn+.foot-btn{border-left:1.5px solid var(--border)}.foot-btn:hover{color:var(--text);background:#f3f4f6}.foot-btn.active.left-active{color:#1e40af;background:#dbeafe;font-weight:700}.foot-btn.active.right-active{color:#9a3412;background:#fed7aa;font-weight:700}.foot-count{background:#00000014;border-radius:8px;justify-content:center;align-items:center;min-width:18px;height:16px;padding:0 4px;font-size:10px;font-weight:700;display:inline-flex}.lab-btn{border:1.5px solid var(--border);background:var(--surface);color:var(--text2);cursor:pointer;white-space:nowrap;border-radius:5px;padding:3px 9px;font-size:11.5px;transition:all .12s}.lab-btn:hover{color:var(--text);background:#f3f4f6}.lab-btn.danger{color:var(--red);border-color:#fca5a5}.lab-btn.danger:hover{background:#fef2f2}.lab-btn.export{color:var(--green);border-color:#86efac;font-weight:600}.lab-btn.export:hover{background:#f0fdf4}.lab-btn:disabled{opacity:.4;cursor:not-allowed}.lab-stat{color:var(--text2);margin-left:4px;font-size:11px}.lab-stat-l{color:#1d4ed8;font-weight:600}.lab-stat-r{color:#c2410c;font-weight:600}.chart-area{background:#fff;flex:1;min-height:0;position:relative;overflow:hidden}.chart-empty{color:var(--text2);pointer-events:none;flex-direction:column;justify-content:center;align-items:center;gap:10px;display:flex;position:absolute;inset:0}.chart-empty span{opacity:.35;font-size:36px}.chart-empty p{font-size:13px}.drag-overlay{z-index:1000;border:3px dashed var(--primary);-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px);pointer-events:none;background:#2563eb1a;border-radius:10px;justify-content:center;align-items:center;display:flex;position:fixed;inset:0}.drag-box{text-align:center;background:#fff;border-radius:12px;padding:28px 48px;font-size:40px;box-shadow:0 4px 24px #0000001f}.drag-box p{color:var(--primary);margin-top:10px;font-size:16px;font-weight:600}.login-backdrop{background:linear-gradient(135deg,#0f172a 0%,#1e2a45 60%,#0f172a 100%);justify-content:center;align-items:center;min-height:100vh;display:flex}.login-card{background:var(--surface);border-radius:16px;width:100%;max-width:380px;padding:40px 44px;box-shadow:0 24px 64px #00000059}.login-logo{text-align:center;margin-bottom:28px}.login-icon{margin-bottom:10px;font-size:36px;display:block}.login-title{color:var(--text);margin-bottom:4px;font-size:18px;font-weight:700}.login-sub{color:var(--text2);font-size:12.5px}.login-form{flex-direction:column;gap:16px;display:flex}.login-label{color:var(--text2);flex-direction:column;gap:5px;font-size:12.5px;font-weight:600;display:flex}.login-input{border:1.5px solid var(--border);background:var(--surface);color:var(--text);border-radius:8px;outline:none;padding:9px 12px;font-size:13.5px;transition:border-color .15s}.login-input:focus{border-color:var(--primary)}.login-error{color:var(--red);text-align:center;background:#fef2f2;border:1px solid #fca5a5;border-radius:6px;padding:7px 10px;font-size:12px}.login-btn{background:var(--primary);color:#fff;cursor:pointer;border:none;border-radius:8px;margin-top:4px;padding:10px;font-size:14px;font-weight:600;transition:background .12s}.login-btn:hover{background:#1d4ed8}.login-btn:disabled{opacity:.55;cursor:not-allowed}.session-group{align-items:center;gap:6px;display:flex}.session-lbl{color:var(--text2);white-space:nowrap;font-size:12.5px;font-weight:600}.session-input{width:90px}.logout-btn{color:#94a3b8;cursor:pointer;white-space:nowrap;background:#ffffff14;border:1px solid #fff3;border-radius:6px;padding:3px 10px;font-size:11.5px;transition:background .12s,color .12s}.logout-btn:hover{color:#e2e8f0;background:#ffffff2e}@media (width<=768px){.content{flex-direction:column}.video-side{border-right:none;border-bottom:1px solid var(--border);width:100%;max-height:38vh}.header-right{display:none}}
