@import "https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:wght@400;500&family=Instrument+Sans:wght@400;500;600;700&display=swap";:root{--bg:#101214;--bg-2:#171b1f;--surface:#1c2228;--surface-2:#252c34;--line:#e8d6b41f;--text:#f3eee4;--muted:#9aa19a;--brass:#d7a45a;--brass-2:#f0c27a;--rust:#c45c3a;--ok:#8fba6e;--danger:#d36b5c;--shadow:0 24px 60px #00000073;--sans:"Instrument Sans", system-ui, sans-serif;--mono:"IBM Plex Mono", ui-monospace, monospace;--tab:calc(72px + env(safe-area-inset-bottom));--radius:18px}*{box-sizing:border-box}html{scrollbar-width:thin;scrollbar-color:#d7a45a59 transparent}::-webkit-scrollbar{width:6px;height:6px}::-webkit-scrollbar-track{background:0 0}::-webkit-scrollbar-thumb{background:#d7a45a52;border-radius:99px}::-webkit-scrollbar-thumb:hover{background:#f0c27a8c}html,body,#root{height:100%;min-height:100vh;overflow:hidden}body{font-family:var(--sans);color:var(--text);background:radial-gradient(1200px 500px at 50% -10%, #2a2418 0%, transparent 55%), var(--bg);margin:0}button,input,textarea{font:inherit;color:inherit}button{cursor:pointer}img{max-width:100%;display:block}.sr-only{clip:rect(0 0 0 0);width:1px;height:1px;position:absolute;overflow:hidden}.shell{background:linear-gradient(#161a1e 0%,#101214 120px);flex-direction:column;height:100%;min-height:100vh;display:flex;overflow:hidden}@supports (height:100svh){html,body,#root,.shell{min-height:100svh}}.topbar{padding:calc(16px + env(safe-area-inset-top)) 20px 12px;border-bottom:1px solid var(--line);flex-shrink:0;justify-content:space-between;align-items:center;display:flex}.brand{letter-spacing:.34em;color:var(--brass);margin:0;font-size:13px;font-weight:600}.brand-sub{color:var(--muted);margin:4px 0 0;font-size:13px}.status-pill{font-family:var(--mono);letter-spacing:.08em;text-transform:uppercase;border:1px solid var(--line);color:var(--muted);background:0 0;border-radius:8px;padding:6px 10px;font-size:11px;font-weight:500}.status-pill.loading{color:var(--brass-2);background:#d7a45a1a;border-color:#d7a45a59}.status-pill.on{color:#d7e8c8;background:#8fba6e29;border-color:#8fba6e73}.topbar-actions{align-items:center;gap:10px;display:flex}.logout-btn{border:1px solid var(--line);color:var(--muted);letter-spacing:.04em;background:0 0;border-radius:8px;align-items:center;gap:6px;padding:6px 12px;font-size:12px;display:inline-flex}.logout-btn svg{flex-shrink:0;width:15px;height:15px}.logout-btn:hover{color:var(--text);border-color:#e8d6b447}.login-shell{background:radial-gradient(900px 420px at 50% -10%,#2a2418 0%,#0000 55%),linear-gradient(#161a1e 0%,#101214 55%);place-items:center;height:100%;min-height:100vh;padding:24px;display:grid}.login-loading{color:var(--muted);letter-spacing:.08em;text-transform:uppercase;font-family:var(--mono);margin:0;font-size:12px}.login-panel{width:min(100%,400px)}.login-brand{text-align:center;margin-bottom:28px}.login-brand .brand{font-size:18px}.login-brand .brand-sub{margin-top:8px}.login-form{border:1px solid var(--line);border-radius:var(--radius);box-shadow:var(--shadow);background:linear-gradient(#1c2228f5,#171b1ffa);gap:10px;padding:28px 24px;display:grid}.login-form h1{margin:0 0 8px;font-size:22px;font-weight:600}.login-form label{color:var(--muted);margin-top:6px;font-size:13px}.login-form input{border:1px solid var(--line);background:#101214b3;border-radius:12px;outline:none;width:100%;padding:12px 14px}.login-form input:focus{border-color:#d7a45a8c;box-shadow:0 0 0 3px #d7a45a1f}.login-password{position:relative}.login-password input{padding-right:44px}.login-eye{width:42px;color:var(--muted);background:0 0;border:0;place-items:center;padding:0;display:grid;position:absolute;top:0;bottom:0;right:0}.login-eye svg{width:18px;height:18px}.login-submit{background:linear-gradient(180deg, var(--brass-2), var(--brass));color:#1a140c;border:0;border-radius:12px;margin-top:12px;padding:12px 16px;font-weight:600}.login-submit:disabled{opacity:.7;cursor:default}.login-error{color:#f0c2ba;background:#d36b5c1f;border:1px solid #d36b5c59;border-radius:10px;margin:0;padding:10px 12px;font-size:13px}main{scrollbar-width:thin;scrollbar-color:#d7a45a59 transparent;flex:1;min-height:0;padding:8px 16px 16px;overflow-y:auto}.panel-head{padding:12px 4px 18px}.kicker{color:var(--brass);letter-spacing:.18em;text-transform:uppercase;margin:0 0 6px;font-size:11px}h2,h3{letter-spacing:-.03em;margin:0;font-weight:600}h2{font-size:28px}h3{font-size:22px}.lede,.muted,.hint,.description{color:var(--muted)}.lede{margin:10px 0 0;font-size:15px;line-height:1.45}.status-card{border:1px solid var(--line);background:var(--surface);border-radius:16px;grid-template-columns:12px 1fr;align-items:start;gap:8px 12px;margin:4px 0 16px;padding:14px 14px 12px;display:grid;position:relative}.status-card strong{font-size:15px;display:block}.status-card p{color:var(--muted);margin:4px 0 0;font-size:13px;line-height:1.4}.status-dot{background:var(--muted);border-radius:99px;width:10px;height:10px;margin-top:5px}.status-card.uploading .status-dot,.status-card.recognizing .status-dot{background:var(--brass);animation:1.2s ease-in-out infinite pulse;box-shadow:0 0 0 4px #d7a45a2e}.status-card.done .status-dot{background:var(--ok)}.status-card.has-error .status-dot{background:var(--danger)}.upload-bar{background:#2b333b;border-radius:99px;grid-column:1/-1;height:5px;overflow:hidden}.upload-bar i{background:linear-gradient(90deg, var(--brass), var(--brass-2));height:100%;transition:width .2s;display:block}.status-card.recognizing .upload-bar i{animation:1.1s ease-in-out infinite indeterminate;width:40%!important}@keyframes pulse{50%{opacity:.45}}@keyframes indeterminate{0%{transform:translate(-120%)}to{transform:translate(280%)}}.photo-slot.add:disabled{opacity:.45;cursor:not-allowed}.hint{margin:10px 0 0;font-size:13px}.hint.tight{margin:8px 4px 12px}.error{color:var(--danger);margin:10px 0 0;font-size:14px}.photo-grid{grid-template-columns:repeat(3,1fr);gap:10px;display:grid}.photo-grid.compact{margin:8px 0 4px}.photo-slot{aspect-ratio:1;background:var(--surface);border-radius:14px;margin:0;position:relative;overflow:hidden}.photo-slot.filled img,.catalog-thumb{object-fit:cover;aspect-ratio:1;border-radius:14px;width:100%;height:100%}.photo-slot figcaption{font-family:var(--mono);background:#101214b3;border-radius:6px;padding:2px 6px;font-size:11px;position:absolute;bottom:8px;left:8px}.file-chip{text-align:center;background:var(--surface-2);flex-direction:column;justify-content:center;align-items:center;gap:6px;width:100%;height:100%;padding:12px;display:flex}.file-chip strong{color:var(--brass);letter-spacing:.04em;font-size:12px}.file-chip span{color:var(--muted);word-break:break-all;font-size:11px}.photo-slot.add{color:var(--muted);background:0 0;border:1px dashed #d7a45a66;flex-direction:column;justify-content:center;align-items:center;gap:4px;font-size:12px;display:flex}.photo-slot.add .plus{color:var(--brass);font-size:22px;line-height:1}.icon-btn{width:26px;height:26px;color:var(--text);background:#101214c7;border:0;border-radius:999px;position:absolute;top:6px;right:6px}.icon-btn.danger:hover{background:var(--rust)}.btn-row{gap:8px;margin-top:12px;display:flex}.btn-row.identify-actions{margin-top:14px}.btn-row.identify-actions .btn.primary{flex:1.4}.btn-row.identify-actions .btn.primary:only-child,.btn-row.identify-actions .btn.ghost{flex:1}.results-head{padding-top:4px}.btn.ghost.back-btn{background:#d7a45a29;border-color:#d7a45a66;flex:none;width:fit-content;margin-bottom:14px;padding:8px 12px;font-size:13px}.btn.ghost.back-btn:hover{background:#d7a45a3d;border-color:#d7a45a8c}.results{flex-direction:column;gap:8px;margin-top:4px;display:flex}.btn{background:var(--surface-2);border:0;border-radius:12px;padding:12px 14px}.btn.block{width:100%;margin-top:14px}.btn.primary{background:var(--brass);color:#1a140c;font-weight:600}.btn.primary:disabled{opacity:.45}.btn:disabled,.icon-btn:disabled{cursor:not-allowed;opacity:.45}.btn.ghost{border:1px solid var(--line);background:0 0;flex:1}.btn.ghost.compact{flex:none;padding:8px 12px;font-size:13px}.upload-section{border-top:1px solid var(--line);margin-top:16px;padding:14px 0 4px;position:relative}.drop-zone{border-radius:14px;transition:background .18s,box-shadow .18s,border-color .18s;position:relative}.drop-zone.upload-section{border:1px dashed #0000;border-top:1px solid var(--line);margin-top:16px;padding:14px 10px 10px}.drop-zone.identify-drop{margin:0 -4px;padding:4px}.drop-zone.is-active{background:#d7a45a14;border-color:#d7a45a8c;box-shadow:inset 0 0 0 1px #d7a45a40}.drop-zone.upload-section.is-active{border-style:dashed;border-top-color:#d7a45a8c}.drop-zone-overlay{z-index:5;border-radius:inherit;pointer-events:none;background:#101214b8;place-items:center;display:grid;position:absolute;inset:0}.drop-zone-overlay span{color:var(--brass-2);letter-spacing:.02em;background:#1c2228eb;border:1px solid #d7a45a73;border-radius:999px;padding:10px 14px;font-size:13px;font-weight:500}.drop-hint{text-align:center;color:var(--muted)}.upload-section-head{justify-content:space-between;align-items:center;gap:12px;margin-bottom:6px;display:flex}.upload-section-head h4,.detail-section h4{letter-spacing:.02em;margin:0;font-size:14px;font-weight:600}.detail-section{margin:16px 0}.detail-section-3d{margin-top:24px}.detail-section-3d h4{margin-bottom:10px}.detail-line{color:var(--text);margin:0 4px 10px;font-size:15px}.stl-viewer{background:var(--bg-2);border:1px solid var(--line);touch-action:none;cursor:grab;border-radius:14px;width:100%;height:min(42vh,320px);overflow:hidden}.stl-viewer:active{cursor:grabbing}.stl-viewer.stl-viewer-clickable{cursor:pointer;touch-action:manipulation}.stl-viewer.stl-viewer-clickable:active{cursor:pointer}.stl-viewer canvas{touch-action:none;width:100%;height:100%;display:block}.sheet-footer{flex-direction:column;gap:8px;margin-top:8px;display:flex}.file-links{flex-direction:column;gap:6px;margin:0 0 10px;padding:0;list-style:none;display:flex}.file-links a,.file-link-btn{color:var(--brass-2);text-align:left;cursor:pointer;font-size:14px;font:inherit;background:0 0;border:0;padding:0;text-decoration:none}.file-links a:hover,.file-link-btn:hover{text-decoration:underline}.media-thumb{cursor:zoom-in;background:0 0;border:0;border-radius:12px;padding:0;display:block;overflow:hidden}.media-thumb.bare{border-radius:inherit;width:100%;height:100%}.media-thumb .catalog-thumb,.media-thumb img{object-fit:cover;width:100%;height:100%;display:block}.file-chip.clickable{cursor:zoom-in;text-align:left;width:100%;font:inherit;border:0}.lightbox-backdrop{z-index:40;padding:12px;padding-top:calc(12px + env(safe-area-inset-top));padding-bottom:calc(12px + env(safe-area-inset-bottom));background:#040608eb;flex-direction:column;justify-content:stretch;align-items:stretch;display:flex;position:fixed;inset:0}.lightbox-close{top:calc(10px + env(safe-area-inset-top));z-index:2;border:1px solid var(--line);width:44px;height:44px;color:var(--text);cursor:pointer;background:#161a1eeb;border-radius:12px;font-size:28px;line-height:1;position:absolute;right:12px}.lightbox-download{top:calc(10px + env(safe-area-inset-top));z-index:2;border:1px solid var(--line);min-height:44px;color:var(--brass-2);background:#161a1eeb;border-radius:12px;align-items:center;padding:0 12px;font-size:13px;font-weight:500;text-decoration:none;display:inline-flex;position:absolute;left:12px}.lightbox-download:hover{text-decoration:underline}.lightbox-title{color:var(--muted);text-overflow:ellipsis;white-space:nowrap;margin:0 56px 8px 8px;font-size:13px;overflow:hidden}.lightbox-stage{touch-action:none;cursor:grab;background:#0c0f12;border-radius:16px;flex:1;justify-content:center;align-items:center;min-height:0;display:flex;overflow:hidden}.lightbox-stage:active{cursor:grabbing}.lightbox-stage img{object-fit:contain;transform-origin:50%;-webkit-user-select:none;user-select:none;-webkit-user-drag:none;pointer-events:none;max-width:100%;max-height:100%}.lightbox-pdf{background:#111;border:0;border-radius:16px;flex:1;width:100%;min-height:0}.lightbox-hint{text-align:center;color:var(--muted);margin:10px 8px 0;font-size:12px}.tag{font-family:var(--mono);letter-spacing:.04em;color:#1a140c;background:var(--brass);border-radius:8px;align-items:center;margin-top:4px;padding:3px 8px;font-size:11px;display:inline-flex}.tag.subtle{color:var(--brass-2);background:#d7a45a33;margin-top:2px}.btn.danger{color:var(--danger);background:0 0;border:1px solid #d36b5c73;flex:1}.results-meta{color:var(--muted);font-family:var(--mono);justify-content:flex-end;padding:8px 4px 6px;font-size:12px;display:flex}.timing-breakdown{border:1px solid var(--line);background:var(--surface);border-radius:16px;flex-direction:column;gap:8px;margin:0 0 10px;padding:12px 14px;list-style:none;display:flex}.timing-breakdown li{justify-content:space-between;align-items:baseline;gap:12px;font-size:13px;display:flex}.timing-breakdown span{color:var(--muted)}.timing-breakdown strong{font-family:var(--mono);text-align:right;color:var(--text);font-size:12px;font-weight:600}.winner{text-align:center;background:var(--surface);border:1px solid #d7a45a8c;border-radius:20px;flex-direction:column;align-items:center;gap:6px;width:100%;padding:18px 16px 16px;display:flex}.winner-stl{width:100%}.stl-viewer.winner-stl-viewer{height:min(38vh,280px)}.winner-info{width:100%;color:inherit;text-align:center;cursor:pointer;background:0 0;border:0;flex-direction:column;align-items:center;gap:6px;margin-top:4px;padding:8px 4px 0;display:flex}.not-found-card{text-align:center;background:var(--surface);border:1px solid #d36b5c73;border-radius:20px;flex-direction:column;align-items:center;gap:6px;width:100%;padding:18px 16px 16px;display:flex}.not-found-card h3{color:var(--danger);margin:4px 0 0}.not-found-card p:last-child{color:var(--muted);max-width:32ch;margin:8px 0 0;font-size:14px;line-height:1.45}.winner img,.thumb-fallback.large{object-fit:cover;border-radius:16px;width:96px;height:96px}.winner h3{margin:4px 0 0}.confirm-feedback{border-top:1px solid var(--line);width:100%;margin-top:14px;padding-top:14px}.confirm-question{margin:0 0 6px;font-size:17px;font-weight:600}.confirm-actions{grid-template-columns:1fr 1fr;gap:10px;margin-top:14px;display:grid}.btn.confirm-yes,.btn.confirm-no{min-height:52px;font-size:16px;font-weight:600}.btn.confirm-yes{background:var(--brass);color:#1a140c}.btn.confirm-no{border:1px solid var(--line);color:var(--text);background:0 0}.confirm-feedback.confirmed{border-top-color:#d7a45a73}.confirm-feedback.confirmed .confirm-question{color:var(--brass-2)}.confirm-feedback.confirming .confirm-question{color:var(--muted)}.training-confirm{flex-direction:column;gap:8px;display:flex}.training-confirm p{margin:0;font-size:14px;line-height:1.45}.training-confirm.compact p{font-size:12px}.training-thanks{color:var(--brass-2);font-weight:600}.training-confirm-actions{grid-template-columns:1fr 1fr;gap:8px;margin-top:4px;display:grid}.training-confirm.compact .training-confirm-actions{grid-template-columns:1fr auto}.training-confirm.compact .btn.confirm-yes{min-height:36px;padding:8px 10px;font-size:12px}.training-confirm.compact .btn.confirm-no{min-height:36px;padding:8px 12px;font-size:12px}.winner-percent{color:var(--text);margin:10px 0 0;font-size:15px;line-height:1.4}.winner-percent strong{color:var(--brass-2);font-variant-numeric:tabular-nums;letter-spacing:-.03em;font-size:28px}.match-row{position:relative}.match-row .match{padding-top:28px}.match-row:has(.match-confirm-panel) .match{padding-top:118px}.match-confirm-panel{z-index:3;background:#0f1216f0;border:1px solid #d7a45a73;border-radius:12px;padding:10px;position:absolute;top:8px;left:8px;right:8px}.match-actions{z-index:2;align-items:center;gap:6px;display:flex;position:absolute;top:8px;right:8px}.match-action-label{color:var(--muted);white-space:nowrap;font-size:11px;font-weight:600}.btn.match-action-yes,.btn.match-action-no{border-radius:8px;min-height:0;padding:4px 10px;font-size:11px;font-weight:600;line-height:1.2}.btn.match-action-yes{background:var(--brass);color:#1a140c}.btn.match-action-no{border:1px solid var(--line);color:var(--text);background:#0f1216d1}.match-status{z-index:2;border-radius:8px;padding:4px 8px;font-size:11px;font-weight:600;line-height:1.2;position:absolute;top:8px;right:8px}.match-status.confirming{color:var(--muted);border:1px solid var(--line);background:#0f1216d1}.match-status.confirmed{color:#1a140c;background:var(--brass)}.match{text-align:left;border:1px solid var(--line);background:var(--surface);border-radius:16px;grid-template-columns:56px 1fr auto;align-items:center;gap:12px;width:100%;padding:10px;display:grid}.match img,.thumb-fallback,.part-row img{object-fit:cover;background:var(--surface-2);border-radius:10px;width:56px;height:56px}.thumb-fallback{background:repeating-linear-gradient(45deg,#252c34,#252c34 6px,#1c2228 6px 12px)}.match-body{flex-direction:column;gap:4px;min-width:0;display:flex}.match-body strong,.part-row strong{font-size:15px}.ref{font-family:var(--mono);color:var(--brass-2);font-size:12px}.score-debug{color:var(--muted);opacity:.6;font-family:monospace;font-size:10px}.score-bar{background:#2b333b;border-radius:99px;height:4px;overflow:hidden}.score-bar i{background:linear-gradient(90deg, var(--brass), var(--brass-2));height:100%;display:block}.match-score{text-align:right}.match-score b{font-variant-numeric:tabular-nums;font-size:20px;display:block}.match-score small{color:var(--muted);text-transform:uppercase;letter-spacing:.08em;font-size:10px}.toolbar{gap:8px;display:flex}.search{background:var(--surface);border:1px solid var(--line);border-radius:12px;flex:1;padding:12px}.part-list{flex-direction:column;gap:8px;margin:0;padding:0;list-style:none;display:flex}.part-row{text-align:left;background:var(--surface);border:1px solid var(--line);border-radius:16px;grid-template-columns:56px 1fr auto;align-items:center;gap:12px;width:100%;padding:10px;display:grid}.part-row div{flex-direction:column;gap:2px;min-width:0;display:flex}.count{font-family:var(--mono);color:var(--muted);font-size:11px}.empty{border:1px dashed var(--line);border-radius:var(--radius);text-align:center;margin-top:28px;padding:24px 16px}.empty p{color:var(--muted);margin:8px 0 0}.sheet-backdrop{z-index:20;background:#080a0cb8;justify-content:center;align-items:flex-end;padding:12px;display:flex;position:fixed;inset:0}.sheet{background:var(--bg-2);border:1px solid var(--line);width:100%;max-width:430px;max-height:88dvh;padding:20px 18px calc(18px + env(safe-area-inset-bottom));box-shadow:var(--shadow);scrollbar-width:thin;scrollbar-color:#d7a45a59 transparent;border-radius:24px 24px 18px 18px;overflow:auto}.sheet.tall header,.sheet header{margin-bottom:16px}.sheet label,.notes-field{color:var(--muted);flex-direction:column;gap:6px;margin-bottom:12px;font-size:13px;display:flex}.notes-field{margin-top:14px}.sheet input,.sheet textarea,.notes-field textarea{background:var(--surface);border:1px solid var(--line);resize:vertical;border-radius:12px;padding:11px 12px}.tabbar{-webkit-backdrop-filter:blur(16px);backdrop-filter:blur(16px);border-top:1px solid var(--line);padding:8px 12px calc(8px + env(safe-area-inset-bottom));background:#101214eb;flex-shrink:0;grid-template-columns:1fr 1fr;display:grid}.tabbar button{color:var(--muted);background:0 0;border:0;flex-direction:column;align-items:center;gap:4px;padding:6px 0;font-size:12px;display:flex}.tabbar button.active{color:var(--brass-2)}.tabbar svg{width:22px;height:22px}@media (width>=760px){body{justify-content:center;align-items:center;display:flex}#root{justify-content:center;align-items:center;width:100%;height:100%;display:flex}.shell{border:1px solid var(--line);width:430px;height:min(900px,100dvh);box-shadow:var(--shadow);border-radius:28px}.tabbar{border-radius:0 0 28px 28px}.sheet-backdrop{align-items:center;padding:24px}.sheet{border-radius:22px;max-width:560px;max-height:86dvh}}.pagination{justify-content:center;align-items:center;gap:12px;padding:0;display:flex}.pagination button{color:var(--gold);cursor:pointer;background:#d7a45a26;border:1px solid #d7a45a4d;border-radius:8px;padding:6px 14px;font-size:.85rem;transition:background .15s}.pagination button:hover:not(:disabled){background:#d7a45a4d}.pagination button:disabled{opacity:.35;cursor:default}.pagination span{color:var(--muted);font-size:.85rem}
