/* ---------- base ---------- */
:root{
  --bg:#0b1220;
  --bg2:#101a2e;
  --fg:#e8eefc;
  --muted:#9aa6c1;
  --accent:#5aa9ff;
  --good:#3ddc97;
  --warn:#f6b93b;
  --danger:#ff6b6b;
  --card:#162238;
  --line:#26314c;
}
*{box-sizing:border-box;}
html,body{margin:0;padding:0;background:var(--bg);color:var(--fg);
  font-family:-apple-system,BlinkMacSystemFont,"SF Pro",Inter,Helvetica,Arial,sans-serif;
  -webkit-font-smoothing:antialiased;
  font-size:16px;
  line-height:1.45;
}
body{min-height:100svh;}

.top{
  display:flex;align-items:center;justify-content:space-between;
  padding:14px 20px;border-bottom:1px solid var(--line);
  position:sticky;top:0;background:var(--bg);z-index:50;
  padding-top:max(14px, env(safe-area-inset-top));
}
.brand{font-weight:600;letter-spacing:.2px;}
.textBtn{background:transparent;border:0;color:var(--accent);font:inherit;padding:6px 8px;cursor:pointer;}

.screen{
  padding:20px max(20px, env(safe-area-inset-left)) 40px max(20px, env(safe-area-inset-right));
  max-width:720px;margin:0 auto;
}
h1{font-size:1.6rem;margin:.2rem 0 .6rem;}
h2{font-size:1.1rem;margin:1.5rem 0 .5rem;color:var(--fg);}
.lede{color:var(--muted);margin-top:0;}
.fine{color:var(--muted);font-size:.85rem;margin-top:1rem;}

button{
  display:inline-block;width:100%;
  padding:14px 16px;border-radius:14px;border:0;
  font:600 1rem/1 inherit;cursor:pointer;
  margin-top:10px;
}
button.primary{background:var(--accent);color:#0a1326;}
button.ghost{background:transparent;color:var(--fg);border:1px solid var(--line);}
button.danger{background:transparent;color:var(--danger);border:1px solid var(--danger);}
button.big{padding:18px 16px;font-size:1.05rem;}

.callout{
  background:var(--card);border:1px solid var(--line);
  border-radius:14px;padding:14px 16px;margin:14px 0;
}
.callout.small{font-size:.95rem;}

.how{padding-left:1.1rem;color:var(--muted);}
.how li{margin:.4rem 0;}

/* ---------- setup ---------- */
.setupGrid{display:grid;gap:12px;margin:16px 0;}
@media (min-width:560px){ .setupGrid{grid-template-columns:1fr 1fr;} }
.setupCard{
  background:var(--card);border:1px solid var(--line);
  border-radius:14px;padding:14px;
}
.setupIcon{
  width:28px;height:28px;border-radius:50%;
  background:var(--accent);color:#0a1326;
  display:flex;align-items:center;justify-content:center;font-weight:700;
  margin-bottom:8px;
}
.setupCard h3{margin:.3rem 0;font-size:1rem;}
.setupCard p{margin:.2rem 0;color:var(--muted);font-size:.95rem;}

.row{display:flex;align-items:center;justify-content:space-between;gap:12px;
  background:var(--card);border:1px solid var(--line);
  border-radius:14px;padding:12px 14px;margin:12px 0;}
.row select{
  background:transparent;color:var(--fg);border:1px solid var(--line);
  border-radius:10px;padding:8px 10px;font:inherit;
}

/* ---------- capture ---------- */
.captureScreen{padding:0;max-width:none;}
.cameraWrap{position:relative;width:100%;background:#000;min-height:100svh;}
#cam{width:100%;height:100svh;object-fit:cover;display:block;background:#000;}
#overlay{position:absolute;inset:0;width:100%;height:100%;}

.hud{
  position:absolute;left:12px;right:12px;
  background:rgba(11,18,32,.66);
  color:#fff;
  border:1px solid rgba(255,255,255,.08);
  border-radius:12px;
  padding:10px 12px;
  backdrop-filter:blur(10px);-webkit-backdrop-filter:blur(10px);
  font-size:.92rem;
}
.hudTop{top:max(12px, env(safe-area-inset-top));display:flex;align-items:center;gap:10px;}
.hudBottom{bottom:140px;}

.statusDot{
  width:10px;height:10px;border-radius:50%;flex:0 0 auto;background:#666;
}
.statusDot.online{background:var(--good);box-shadow:0 0 0 4px rgba(61,220,151,.18);}
.statusDot.weak{background:var(--warn);box-shadow:0 0 0 4px rgba(246,185,59,.18);}
.statusDot.offline{background:#7a8295;}

/* Card-detection status chip */
.cardStatus{
  position:absolute;right:12px;
  top:max(56px, calc(env(safe-area-inset-top) + 56px));
  background:rgba(11,18,32,.78);
  border:1px solid rgba(255,255,255,.10);
  border-radius:999px;padding:5px 11px;
  color:#9aa6c1;font-size:.78rem;font-variant-numeric:tabular-nums;
  letter-spacing:.02em;
  backdrop-filter:blur(10px);-webkit-backdrop-filter:blur(10px);
  pointer-events:none;
  z-index:5;
  transition:color .2s ease, border-color .2s ease;
}
.cardStatus[data-state="on"]{
  color:#3ddc97;
  border-color:rgba(61,220,151,.45);
}

/* Photogrammetry-style RECORDING badge */
.recHud{
  position:absolute;left:50%;transform:translateX(-50%);
  top:max(56px, calc(env(safe-area-inset-top) + 56px));
  display:flex;align-items:center;gap:8px;
  background:rgba(11,18,32,.78);
  border:1px solid rgba(255,80,80,.45);
  border-radius:999px;padding:6px 14px;
  backdrop-filter:blur(10px);-webkit-backdrop-filter:blur(10px);
  color:#fff;font-size:.92rem;font-variant-numeric:tabular-nums;
  letter-spacing:.02em;
  pointer-events:none;
  z-index:5;
}
.recHud[hidden]{display:none;}
.recHud .recDot{
  width:10px;height:10px;border-radius:50%;
  background:#ff5050;
  box-shadow:0 0 0 0 rgba(255,80,80,.55);
  animation:recPulse 1.3s ease-in-out infinite;
}
.recHud .recLabel{font-weight:700;letter-spacing:.12em;color:#ff7878;}
.recHud .recSep{color:rgba(255,255,255,.4);}
.recHud .recPercent{color:#9ae0ff;font-weight:600;}
.recHud .recAngles{color:#cfd6e8;}
@keyframes recPulse{
  0%   { opacity:1;   box-shadow:0 0 0 0 rgba(255,80,80,.55); }
  70%  { opacity:.55; box-shadow:0 0 0 10px rgba(255,80,80,0); }
  100% { opacity:1;   box-shadow:0 0 0 0 rgba(255,80,80,0); }
}

/* Live angle-coverage compass shown over the camera while recording. */
.liveCompass{
  position:absolute;left:50%;transform:translateX(-50%);
  top:max(110px, calc(env(safe-area-inset-top) + 110px));
  width:160px;display:flex;flex-direction:column;align-items:center;
  pointer-events:none;
  z-index:4;
  text-align:center;
}
.liveCompass[hidden]{display:none;}
.liveCompass svg{
  width:140px;height:140px;
  filter:drop-shadow(0 4px 16px rgba(0,0,0,.45));
}
.liveCompassSeg{transition:fill .15s ease;}
.liveCompassSeg.on  { fill:rgba(61,220,151,.95); }
.liveCompassSeg.curr{ fill:rgba(90,169,255,.85); }
.liveCompassSeg.off { fill:rgba(255,255,255,.10); }
.liveCompassSeg.target{
  fill:rgba(246,185,59,.65);
  animation:targetPulse 1s ease-in-out infinite;
}
@keyframes targetPulse{
  0%,100% { fill:rgba(246,185,59,.55); }
  50%     { fill:rgba(246,185,59,.95); }
}
#liveCompassDot{
  filter:drop-shadow(0 0 6px rgba(90,169,255,.85));
}
.liveCompassHint{
  margin-top:6px;
  background:rgba(11,18,32,.78);
  border:1px solid rgba(255,255,255,.10);
  border-radius:999px;padding:4px 10px;
  color:#fff;font-size:.78rem;letter-spacing:.02em;
  backdrop-filter:blur(10px);-webkit-backdrop-filter:blur(10px);
  max-width:200px;
}

/* Multi-view progress indicator (top-right HUD card) */
.viewProgress{
  position:absolute;top:max(60px, calc(env(safe-area-inset-top) + 60px));
  left:12px;right:12px;
  background:rgba(11,18,32,.72);
  border:1px solid rgba(255,255,255,.08);
  border-radius:12px;
  padding:10px 12px;
  backdrop-filter:blur(10px);-webkit-backdrop-filter:blur(10px);
  color:#fff;
  display:flex;flex-direction:column;gap:8px;
}
.viewProgress[hidden]{display:none;}
.vp-label{font-size:.85rem;color:var(--muted);text-transform:uppercase;letter-spacing:.06em;}
.vp-dots{display:flex;gap:8px;align-items:center;}
.vp-dot{
  width:18px;height:18px;border-radius:50%;
  background:#3a4663;border:2px solid transparent;
  transition:all .2s ease;
}
.vp-dot.active{background:var(--accent);box-shadow:0 0 0 4px rgba(90,169,255,.25);border-color:var(--accent);}
.vp-dot.done{background:var(--good);border-color:var(--good);}
.vp-instruction{font-size:.95rem;line-height:1.35;}

/* Position meter (live R value vs target band) */
.vp-meter{margin-top:4px;}
.vp-meter-track{
  position:relative;width:100%;height:8px;border-radius:6px;
  background:#1a2238;overflow:hidden;
}
.vp-meter-band{
  position:absolute;top:0;bottom:0;background:rgba(246,185,59,.55);
  border-left:1px solid rgba(246,185,59,.9);
  border-right:1px solid rgba(246,185,59,.9);
}
.vp-meter-marker{
  position:absolute;top:-3px;width:2px;height:14px;background:#fff;
  border-radius:1px;box-shadow:0 0 4px rgba(255,255,255,.7);
  transition:left .08s linear;
}
.vp-meter.ok .vp-meter-band{background:rgba(61,220,151,.55);
  border-color:rgba(61,220,151,.9);}
.vp-meter-labels{display:flex;justify-content:space-between;color:var(--muted);
  font-size:.7rem;letter-spacing:.05em;text-transform:uppercase;margin-top:2px;}

.liveTable{display:grid;grid-template-columns:1.2fr 1fr 1fr 1fr;gap:0;}
.lt-head, .lt-row{display:contents;}
.lt-head span, .lt-row span{
  padding:6px 8px;border-bottom:1px solid rgba(255,255,255,.05);
}
.lt-head span{color:var(--muted);font-size:.8rem;text-transform:uppercase;letter-spacing:.06em;}
.lt-row span.v{
  font-variant-numeric:tabular-nums;text-align:right;
  transition:color .25s ease;
}
/* Negative angle = hyperextension (joint folded the wrong way past
   straight). Highlighted in warm orange so it stands out against the
   neutral white default. */
.lt-row span.v.v-hyper{color:#ffb070;font-weight:600;}
/* Strong flexion ≥30° — soft green so the eye can pick out which
   joints are bent. */
.lt-row span.v.v-flexed{color:var(--good);font-weight:600;}

/* Small legend bar under the live table explaining the colour code
   and rolling-average behaviour. */
.lt-legend{
  display:flex;align-items:center;justify-content:space-between;
  gap:10px;padding:4px 8px 2px;
  color:var(--muted);font-size:.72rem;letter-spacing:.04em;
}
.lt-legend .swatch{display:inline-flex;align-items:center;gap:4px;}
.lt-legend .swatch::before{
  content:"";width:8px;height:8px;border-radius:50%;
}
.lt-legend .swatch.flex::before{background:var(--good);}
.lt-legend .swatch.hyper::before{background:#ffb070;}

.captureActions{
  position:absolute;left:12px;right:12px;
  bottom:max(20px, env(safe-area-inset-bottom));
}

/* ---------- result ---------- */
.resultTable{width:100%;border-collapse:collapse;margin:12px 0;
  background:var(--card);border:1px solid var(--line);border-radius:14px;overflow:hidden;
}
.resultTable th,.resultTable td{
  padding:10px 12px;text-align:right;
  border-bottom:1px solid var(--line);
  font-variant-numeric:tabular-nums;
}
.resultTable th:first-child,.resultTable td:first-child{text-align:left;}
.resultTable thead th{background:var(--bg2);color:var(--muted);font-weight:600;font-size:.85rem;text-transform:uppercase;letter-spacing:.05em;}
.resultTable tr:last-child td{border-bottom:0;}

/* ---------- history ---------- */
.historyList{list-style:none;padding:0;margin:0;}
.historyList li{
  background:var(--card);border:1px solid var(--line);border-radius:12px;
  padding:12px 14px;margin:8px 0;
  display:grid;grid-template-columns:1fr auto;gap:6px;align-items:center;
}
.historyList .date{font-weight:600;}
.historyList .meta{color:var(--muted);font-size:.9rem;}
.historyList .ted{font-variant-numeric:tabular-nums;text-align:right;color:var(--accent);font-weight:600;}

/* ---------- angle coverage compass ---------- */
.coverageRow{
  display:flex;align-items:center;gap:14px;
  background:var(--card);border:1px solid var(--line);
  border-radius:14px;padding:14px;margin:14px 0;
}
.coverageWrap{flex:0 0 auto;width:90px;height:90px;}
#coverageCompass{width:100%;height:100%;display:block;}
.coverageSeg{transition:fill .25s ease;}
.coverageSeg.on{fill:rgba(61,220,151,.85);}
.coverageSeg.off{fill:rgba(255,255,255,.08);}
.coverageText{flex:1;min-width:0;}
.coverageHeading{font-weight:600;margin-bottom:4px;}
.coverageDetail{color:var(--muted);font-size:.92rem;line-height:1.4;}
.coverageRow.ok .coverageSeg.on{fill:rgba(61,220,151,.95);}
.coverageRow.warn .coverageSeg.on{fill:rgba(246,185,59,.85);}
.coverageRow.warn .coverageHeading{color:var(--warn);}

/* ---------- snapshot of the user's own hand ---------- */
.snapshotWrap{
  background:#0a0f1d;border:1px solid var(--line);
  border-radius:14px;overflow:hidden;
  width:100%;margin:8px 0 16px;
}
.snapshotWrap canvas{display:block;width:100%;height:auto;}

/* ---------- 3D hand viewer (GLB) ---------- */
.hand3dWrap{
  position:relative;background:#0a0f1d;border:1px solid var(--line);
  border-radius:14px;overflow:hidden;
  width:100%;aspect-ratio:4/3;margin:8px 0 16px;
}
.hand3d{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;
  color:var(--muted);font-size:.9rem;}
.hand3d canvas{display:block;width:100%!important;height:100%!important;}

/* ---------- modal ---------- */
.modal{position:fixed;inset:0;display:flex;align-items:center;justify-content:center;
  background:rgba(0,0,0,.55);z-index:100;padding:20px;}
.modal[hidden]{display:none;}  /* attribute overrides display:flex */
.modalBox{background:var(--card);border:1px solid var(--line);border-radius:14px;
  padding:18px;max-width:380px;width:100%;}
.modalBox p{margin:0 0 12px;}
/* same guard for any other class that sets display */
.captureScreen[hidden],.cameraWrap[hidden]{display:none;}
