:root{--bg: #0a0a0a;--surface: #111;--surface-2: #1a1a1a;--border: #222;--border-strong: #333;--text: #e5e5e5;--muted: #888;--dim: #666;--primary: #1f6feb;--accent: #4ea1ff;--success: #4ade80;--warn: #fbbf24;--danger: #ef4444;--danger-bg: #7a1f1f}*{box-sizing:border-box;margin:0;padding:0}html,body{height:100%}body{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif;background:var(--bg);color:var(--text);-webkit-font-smoothing:antialiased}a{color:var(--accent);text-decoration:none}a:hover{text-decoration:underline}code{font-family:ui-monospace,monospace;font-size:.9em;color:#aaa;background:var(--surface-2);padding:1px 5px;border-radius:3px}button{background:var(--primary);color:#fff;border:none;padding:8px 14px;border-radius:6px;font-size:13px;font-weight:500;cursor:pointer;display:inline-flex;align-items:center;gap:6px;font-family:inherit;transition:background .1s,opacity .1s}button:hover:not(:disabled){filter:brightness(1.1)}button:disabled{background:#333;color:#666;cursor:not-allowed}button.secondary{background:#2a2a2a}button.danger{background:var(--danger-bg)}button.success{background:#16a34a}button.ghost{background:transparent;color:var(--muted);padding:4px 8px}button.ghost:hover:not(:disabled){color:var(--text);background:var(--surface-2)}button.tiny{padding:4px 10px;font-size:11px;gap:4px}button.tiny svg{width:13px;height:13px}button svg{width:14px;height:14px;flex-shrink:0}input[type=text],input[type=number],input[type=file]{background:var(--surface-2);border:1px solid var(--border-strong);color:var(--text);padding:8px 12px;border-radius:6px;font-size:13px;font-family:inherit}input:focus{outline:none;border-color:var(--accent)}input[type=number]{width:60px;padding:6px 8px}.row{display:flex;gap:8px;align-items:center;flex-wrap:wrap}.container{max-width:960px;margin:0 auto;padding:16px}header{padding:16px 0;border-bottom:1px solid var(--border);margin-bottom:20px;display:flex;align-items:center;justify-content:space-between;gap:12px}header h1{font-size:20px;font-weight:600;display:flex;align-items:center;gap:8px}header h1 svg{color:var(--accent)}header .sub{font-size:12px;color:var(--muted);margin-top:2px}section{background:var(--surface);border:1px solid var(--border);border-radius:12px;padding:16px;margin-bottom:16px}section h2{font-size:14px;font-weight:600;margin-bottom:12px;color:#ccc;display:flex;align-items:center;gap:6px}section h2 svg{width:16px;height:16px;color:var(--accent)}section .hint{font-size:11px;color:#777;margin-top:8px;line-height:1.5}.empty{color:var(--dim);font-size:12px;padding:4px 0}.models-list{display:flex;flex-direction:column;gap:6px;margin-bottom:12px}.model-row{display:flex;align-items:center;gap:8px;background:var(--surface-2);border:1px solid #2a2a2a;border-radius:8px;padding:10px 12px}.model-row>:first-child{flex:1;min-width:0}.model-row.is-active{background:#0e2a1a;border-color:#1f4f33}.model-row .name{font-size:13px;font-weight:500;display:flex;align-items:center;gap:6px}.model-row .name svg{color:var(--warn);fill:var(--warn);width:14px;height:14px}.model-row .id{font-size:11px;color:var(--muted);font-family:ui-monospace,monospace;margin-top:2px}.model-row .meta{font-size:11px;color:#777;margin-top:2px}.new-model-form{display:flex;flex-direction:column;gap:14px}.new-model-form .name-row{display:flex;gap:8px;align-items:center}.new-model-form .name-row input{flex:1}.video-slots{display:grid;grid-template-columns:1fr 1fr;gap:12px}@media(max-width:600px){.video-slots{grid-template-columns:1fr}}.video-slot{background:var(--surface-2);border:1px dashed var(--border-strong);border-radius:10px;padding:14px;display:flex;flex-direction:column;gap:8px}.video-slot.has-file{border-style:solid;border-color:var(--accent)}.video-slot .label{display:flex;align-items:center;gap:6px;font-size:13px;font-weight:500}.video-slot .label svg{width:14px;height:14px;color:var(--accent)}.video-slot .hint-small{font-size:11px;color:var(--muted)}.video-slot video{width:100%;border-radius:6px;background:#000;max-height:200px}.video-slot .picker{display:flex;align-items:center;gap:8px;flex-wrap:wrap}.video-slot .meta{font-size:11px;color:var(--muted)}.extract-opts{display:flex;gap:14px;align-items:center;flex-wrap:wrap;font-size:12px;color:var(--muted);padding-top:4px}.extract-opts label{display:inline-flex;align-items:center;gap:4px}.extract-opts input[type=number]{padding:4px 8px}.job-bar{background:linear-gradient(90deg,#0e1b3a,#16213a);border:1px solid #2563eb;border-radius:8px;padding:10px 12px;margin-bottom:16px;display:flex;flex-direction:column;gap:8px}.job-bar .head{display:flex;justify-content:space-between;align-items:center;font-size:12px;color:#93c5fd}.job-bar .head .stage{display:flex;align-items:center;gap:6px}.job-bar .head .stage svg{width:13px;height:13px;animation:spin 1.4s linear infinite}.progress-bar{height:6px;background:#0006;border-radius:3px;overflow:hidden}.progress-bar .fill{height:100%;background:var(--success);transition:width .2s}@keyframes spin{to{transform:rotate(360deg)}}.log{font-family:ui-monospace,monospace;font-size:12px;background:#050505;color:#9aa;padding:10px;border-radius:6px;max-height:220px;overflow-y:auto;white-space:pre-wrap;border:1px solid var(--border);display:flex;flex-direction:column-reverse}.log .entry{padding:1px 0}.log .entry.ok{color:var(--success)}.log .entry.err{color:var(--danger)}.log .entry.warn{color:var(--warn)}.log .entry .t{color:var(--dim);margin-right:6px}.scanner{min-height:100vh;display:flex;flex-direction:column;align-items:center}.scanner .topbar{width:100%;padding:8px 12px;background:var(--surface);border-bottom:1px solid var(--border);display:flex;align-items:center;justify-content:space-between;gap:8px;margin-bottom:0}.scanner .topbar .title{display:flex;align-items:center;gap:6px;font-size:14px;font-weight:600;color:var(--text)}.scanner .topbar .title svg{color:var(--accent)}.scanner .topbar-controls{display:flex;align-items:center;gap:6px}.scanner .topbar-controls .tiny{padding:5px 10px;font-size:12px}.scanner .topbar-controls .ghost-link{color:var(--muted);padding:4px;display:inline-flex;align-items:center;border-radius:4px}.scanner .topbar-controls .ghost-link:hover{color:var(--text);background:var(--surface-2)}.model-picker{background:var(--surface-2);border:1px solid var(--border-strong);color:var(--text);font-size:12px;padding:4px 8px;border-radius:5px;font-family:inherit;max-width:140px}.model-picker:focus{outline:none;border-color:var(--accent)}.scanner .status{font-size:12px;padding:4px 12px;color:var(--warn);text-align:center}.scanner .status.ok{color:var(--success)}.scanner .status.err{color:var(--danger)}.banner{display:inline-flex;align-items:center;gap:8px;font-size:12px;padding:8px 14px;margin:0 12px 8px;border-radius:6px;max-width:calc(100% - 24px);word-break:break-word}.banner.err{background:#ef44441f;color:#fca5a5;border:1px solid rgba(239,68,68,.35)}.banner.err svg{color:var(--danger)}.banner>button{margin-left:auto}.camera-wrap{position:relative;width:100%;max-width:480px;aspect-ratio:3 / 4;max-height:65vh;background:#000;overflow:hidden}.camera-wrap video{width:100%;height:100%;object-fit:cover}.overlay{position:absolute;top:0;right:0;bottom:0;left:0;pointer-events:none;display:flex;flex-direction:column;justify-content:space-between;padding:12px}.live-debug{align-self:flex-start;background:#0009;-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px);padding:8px 12px;border-radius:8px;font-size:12px;font-family:ui-monospace,monospace;line-height:1.5;min-width:200px}.live-debug .row{display:flex;justify-content:space-between;gap:8px}.live-debug .bar{height:4px;background:#333;border-radius:2px;margin-top:2px;overflow:hidden}.live-debug .bar-fill{height:100%;background:var(--success);transition:width .2s}.live-debug .bar-fill.dim{background:#666}.scan-target{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);width:65%;aspect-ratio:1;border:3px dashed rgba(255,255,255,.6);border-radius:16px;box-shadow:0 0 0 9999px #00000059;transition:border-color .2s}.scan-target.matching{border-color:var(--success);border-style:solid}.scan-target .hint{position:absolute;bottom:-28px;left:50%;transform:translate(-50%);font-size:11px;color:#fffc;white-space:nowrap;background:#00000080;padding:2px 8px;border-radius:4px}.locks-bar{width:100%;max-width:480px;padding:10px 12px;display:flex;gap:10px;justify-content:center;flex-wrap:wrap}.lock{flex:1;max-width:110px;min-width:70px;aspect-ratio:1;max-height:90px;background:var(--surface-2);border:2px solid var(--border-strong);border-radius:12px;display:flex;flex-direction:column;align-items:center;justify-content:center;transition:all .3s;padding:8px;text-align:center}.lock.unlocked{background:#0d3b1f;border-color:var(--success)}.lock svg{width:28px;height:28px;color:var(--muted)}.lock.unlocked svg{color:var(--success)}.lock .label{font-size:11px;color:var(--muted);margin-top:6px;text-transform:uppercase;letter-spacing:.5px}.lock.unlocked .label{color:var(--success)}.controls{display:flex;gap:8px;padding:12px;width:100%;max-width:480px;justify-content:center}.controls button{padding:10px 20px;font-size:14px}.modal{position:fixed;top:0;right:0;bottom:0;left:0;background:#000000d9;display:flex;align-items:center;justify-content:center;flex-direction:column;gap:16px;padding:32px;text-align:center;z-index:100}.modal svg.hero{width:72px;height:72px;color:var(--success)}.modal h2{font-size:24px}.modal p{color:var(--muted);max-width:320px}
