:root{
  --bg:#0e0f13; --surface:#171a21; --surface2:#1e222b; --line:#2a2f3a;
  --ink:#e7ebf0; --muted:#8b93a2; --brand:#c81e4e;
  --sans:ui-sans-serif,system-ui,-apple-system,"Segoe UI",Roboto,sans-serif;
  --mono:ui-monospace,"SF Mono",Menlo,Consolas,monospace;
}
*{box-sizing:border-box}
html,body{margin:0;height:100%}
body{background:var(--bg);color:var(--ink);font-family:var(--sans);
  -webkit-tap-highlight-color:transparent;overscroll-behavior:none}
.view{display:none;min-height:100dvh}
.view.active{display:block}
.hidden{display:none!important}
button{font-family:var(--sans);cursor:pointer}

/* login */
#view-login{display:none;place-items:center;padding:24px}
#view-login.active{display:grid}
.login-card{background:var(--surface);border:1px solid var(--line);border-radius:18px;
  padding:26px 22px;width:min(360px,92vw);display:flex;flex-direction:column;gap:12px}
.login-card h1{font-size:22px;margin:0;font-weight:700}
.login-card h1 span{color:var(--brand)}
.login-card .sub{margin:0 0 6px;color:var(--muted);font-size:14px}
.login-card input{background:var(--bg);border:1px solid var(--line);border-radius:12px;
  padding:13px 14px;color:var(--ink);font-size:16px}
.login-card input:focus{outline:2px solid var(--brand);border-color:var(--brand)}
.primary{background:var(--brand);color:#fff;border:none;border-radius:12px;padding:13px;font-size:16px;font-weight:650}
.err{color:#ff7676;font-size:13px;min-height:16px}

/* topbar */
.topbar{position:sticky;top:0;z-index:10;display:flex;align-items:center;gap:10px;
  padding:12px 14px;padding-top:max(12px,env(safe-area-inset-top));
  background:rgba(14,15,19,.94);backdrop-filter:blur(8px);border-bottom:1px solid var(--line)}
.who{font-weight:600;font-size:14px}
.prog{font-family:var(--mono);font-size:12px;color:var(--muted);font-variant-numeric:tabular-nums}
.spacer{flex:1}
.ghost{background:var(--surface);color:var(--ink);border:1px solid var(--line);border-radius:10px;padding:8px 12px;font-size:13px}
.ghost:disabled{opacity:.4}

/* labeler stage */
.stage{max-width:520px;margin:0 auto;padding:14px 14px 40px;display:flex;flex-direction:column;gap:14px}
.imgcard{position:relative;background:#000;border:1px solid var(--line);border-radius:16px;overflow:hidden;
  display:flex;align-items:center;justify-content:center;touch-action:none}
.imgcard.crop{aspect-ratio:1/1}
.imgcard img{width:100%;height:100%;object-fit:contain;display:block}
.imgcard.full img{max-height:62dvh;height:auto}
/* box overlay: sits exactly over the square crop image */
#boxlayer{position:absolute;inset:0;pointer-events:none}
#boxlayer.hidden{display:none}
#bbox{position:absolute;border:2px solid rgba(255,220,90,.95);border-radius:2px;
  box-shadow:0 0 0 1px rgba(0,0,0,.5) inset,0 0 0 1px rgba(0,0,0,.4);
  pointer-events:auto;cursor:move;touch-action:none}
#bbox .bh{position:absolute;width:26px;height:26px;border-radius:50%;
  background:rgba(255,220,90,.95);border:2px solid #1a1d22;pointer-events:auto;touch-action:none}
#bbox .bh[data-h=nw]{left:-13px;top:-13px;cursor:nwse-resize}
#bbox .bh[data-h=ne]{right:-13px;top:-13px;cursor:nesw-resize}
#bbox .bh[data-h=sw]{left:-13px;bottom:-13px;cursor:nesw-resize}
#bbox .bh[data-h=se]{right:-13px;bottom:-13px;cursor:nwse-resize}
.boxtoggle{position:absolute;bottom:10px;left:10px;z-index:3;background:rgba(0,0,0,.66);color:#fff;
  border:1px solid var(--line);border-radius:9px;padding:6px 10px;font-size:12px}
.verdict{position:absolute;top:10px;left:10px;z-index:2;font-family:var(--mono);font-size:11px;letter-spacing:.4px;
  padding:4px 9px;border-radius:8px;background:rgba(0,0,0,.72);border:1px solid var(--line)}
.verdict.tp{color:#7ee3a6}.verdict.fp{color:#f2a0a0}
.fulltoggle{position:absolute;bottom:10px;right:10px;z-index:2;background:rgba(0,0,0,.66);color:#fff;
  border:1px solid var(--line);border-radius:9px;padding:6px 10px;font-size:12px}
.labelgrid{display:grid;grid-template-columns:1fr 1fr;gap:10px}
.labelgrid button{position:relative;border:1px solid var(--line);border-radius:14px;background:var(--surface);
  color:var(--ink);font-size:16px;font-weight:600;padding:16px 12px;min-height:58px;text-align:left;
  display:flex;align-items:center;gap:10px}
.labelgrid button:active{transform:scale(.98)}
.labelgrid button .dot{width:12px;height:12px;border-radius:50%;flex:0 0 auto}
.labelgrid button .k{margin-left:auto;font-family:var(--mono);font-size:12px;color:var(--muted);
  border:1px solid var(--line);border-radius:6px;padding:1px 7px}
.labelgrid button.unsure{grid-column:1 / -1;justify-content:center}
.minor{display:flex;gap:10px;justify-content:space-between}
.tip{color:var(--muted);font-size:12px;text-align:center;margin:2px 0 0}
.tip b{color:var(--ink)}
.done{max-width:520px;margin:60px auto;text-align:center;color:var(--muted);font-size:18px;padding:0 20px}

/* ---- multi-object labeler ---- */
.stage2{max-width:640px;margin:0 auto;padding:12px 12px 40px;display:flex;flex-direction:column;gap:12px}
.canvaswrap{position:relative;line-height:0;background:#000;border:1px solid var(--line);border-radius:14px;
  overflow:hidden;touch-action:none;user-select:none}
.canvaswrap.adding{cursor:crosshair}
.canvaswrap img{width:100%;height:auto;display:block}
#boxes{position:absolute;inset:0;pointer-events:none}
.obox{position:absolute;border:2px solid #888;border-radius:3px;pointer-events:auto;cursor:move;box-sizing:border-box}
.obox .tag{position:absolute;top:-1px;left:-1px;transform:translateY(-100%);font-family:var(--mono);font-size:10px;
  font-weight:700;line-height:1.4;padding:1px 5px;border-radius:5px 5px 5px 0;color:#0b0d10;white-space:nowrap}
.obox.sel{box-shadow:0 0 0 2px rgba(255,255,255,.5),0 0 10px rgba(0,0,0,.6)}
.obox .h{position:absolute;width:24px;height:24px;border-radius:50%;background:#fff;border:2px solid #1a1d22;display:none}
.obox.sel .h{display:block}
.obox .h[data-h=nw]{left:-12px;top:-12px;cursor:nwse-resize}
.obox .h[data-h=ne]{right:-12px;top:-12px;cursor:nesw-resize}
.obox .h[data-h=sw]{left:-12px;bottom:-12px;cursor:nesw-resize}
.obox .h[data-h=se]{right:-12px;bottom:-12px;cursor:nwse-resize}
.palette{display:flex;gap:7px;overflow-x:auto;padding:2px 2px 6px;-webkit-overflow-scrolling:touch}
.pchip{flex:0 0 auto;display:flex;align-items:center;gap:6px;border:1px solid var(--line);background:var(--surface);
  color:var(--ink);border-radius:999px;padding:7px 12px;font-size:13px;font-weight:600}
.pchip .pd{width:11px;height:11px;border-radius:50%;flex:0 0 auto}
.pchip .pk{font-family:var(--mono);font-size:10px;color:var(--muted)}
.pchip.active{outline:2px solid #fff;outline-offset:1px}
.actions{display:grid;grid-template-columns:auto auto 1fr auto;gap:8px;align-items:center}
.actions .primary{padding:12px 18px;border-radius:12px;font-size:15px}
.actions .ghost{padding:10px 12px}
#saveBtn{justify-self:end}

/* admin */
.admin{max-width:820px;margin:0 auto;padding:18px 16px 60px;display:flex;flex-direction:column;gap:10px}
.admin h2{font-size:15px;margin:18px 0 4px;color:var(--muted);font-weight:600;text-transform:uppercase;letter-spacing:.5px}
.cards{display:grid;grid-template-columns:repeat(auto-fit,minmax(140px,1fr));gap:10px}
.cardbox{background:var(--surface);border:1px solid var(--line);border-radius:14px;padding:14px 16px}
.cardbox .big{font-size:26px;font-weight:700;font-variant-numeric:tabular-nums}
.cardbox .lbl{color:var(--muted);font-size:12px;margin-top:2px}
.tablewrap{overflow-x:auto;border:1px solid var(--line);border-radius:14px}
table{width:100%;border-collapse:collapse;font-size:14px}
th,td{text-align:left;padding:11px 14px;border-bottom:1px solid var(--line);white-space:nowrap}
th{color:var(--muted);font-weight:600;font-size:12px;text-transform:uppercase;letter-spacing:.4px}
td.num,th.num{text-align:right;font-family:var(--mono);font-variant-numeric:tabular-nums}
tr:last-child td{border-bottom:none}
.badge{font-size:11px;padding:2px 8px;border-radius:999px;border:1px solid var(--line);color:var(--muted)}
.badge.admin{color:#f2c14e;border-color:#5a4a1e}
.dist{display:flex;flex-direction:column;gap:7px}
.distrow{display:grid;grid-template-columns:120px 1fr 54px;align-items:center;gap:10px;font-size:13px}
.distrow .bar{height:12px;border-radius:6px;background:var(--brand);min-width:2px}
.distrow .n{font-family:var(--mono);text-align:right;color:var(--muted)}
.addrow{display:flex;flex-wrap:wrap;gap:8px;align-items:center}
.addrow input,.addrow select{background:var(--bg);border:1px solid var(--line);border-radius:10px;padding:9px 11px;color:var(--ink);font-size:14px}
.addrow .primary{padding:9px 16px;font-size:14px}
@media(prefers-reduced-motion:reduce){*{transition:none!important}}
