/* แล็บกล้องจุลทรรศน์ — เวทีบน / แผงล่าง บนจอเล็ก, เวทีซ้าย / แผงขวา บนจอกว้าง
   ใช้ token ชุดเดียวกับ hub เพื่อให้ทุก app หน้าตาเป็นตระกูลเดียวกัน */

:root{
  --sans:'IBM Plex Sans Thai','Noto Sans Thai',system-ui,-apple-system,'Segoe UI',sans-serif;
  --ink:#191a24;
  --muted:#6b6c7e;
  --line:#e6e3dc;
  --surface:#fff;
  --bg:#f5f4ef;
  --brand:#2e7d88;
  --brand-ink:#1f5f68;
  --brand-soft:#dcecee;
  --ok:#129a72;
  --warn:#d68a17;
  --danger:#e2564a;
}

*{box-sizing:border-box}
html,body{margin:0;height:100%;overflow:hidden}
body{
  font-family:var(--sans);color:var(--ink);background:var(--bg);
  display:flex;flex-direction:column;-webkit-font-smoothing:antialiased;
}

/* ---------- เวที ---------- */
#stage{position:relative;flex:1;min-height:0;background:#f2f4f6}
#webgl-canvas{width:100%;height:100%;display:block;touch-action:none}

/* ปุ่ม ? เปิด/ปิดคำอธิบาย — อยู่ใต้ปุ่มสลับภาษา (.pg-lang.pin-tl) */
.status-toggle{
  position:absolute;left:14px;top:56px;z-index:6;
  width:38px;height:38px;border-radius:50%;border:1px solid var(--line);
  background:rgba(255,255,255,.94);color:var(--brand-ink);font-size:1rem;
  display:grid;place-items:center;cursor:pointer;
  box-shadow:0 4px 14px rgba(25,26,36,.12);
}
.status-toggle:hover{border-color:var(--brand)}
.status-toggle.is-open{background:var(--brand);border-color:var(--brand);color:#fff}
/* จุดแดงบอกว่ามีคำอธิบายใหม่ที่ยังไม่ได้เปิดอ่าน */
.status-toggle.has-new::after{
  content:'';position:absolute;top:2px;right:2px;width:9px;height:9px;
  border-radius:50%;background:var(--danger);border:2px solid #fff;
}
.status{
  position:absolute;left:14px;top:102px;
  background:rgba(255,255,255,.94);border:1px solid var(--line);
  border-radius:12px;padding:9px 14px;font-size:.85rem;
  box-shadow:0 4px 14px rgba(25,26,36,.08);pointer-events:none;
  max-width:min(420px,calc(100% - 28px));line-height:1.55;
}
.status[hidden]{display:none}
.status.ok{border-color:#bfe9da;color:#0a6b50;background:#f0fbf7}
.status.bad{border-color:#f6cdc9;color:#8f2018;background:#fdf3f2}
.status.warn{border-color:#f7e2bd;color:#7d5209;background:#fffaf0}
.status .eq{display:block;margin-top:5px;font-size:.92em;color:var(--brand-ink)}

.coach{
  position:absolute;left:14px;bottom:14px;
  background:var(--ink);color:#fff;border-radius:999px;
  padding:6px 15px;font-size:.78rem;max-width:min(420px,calc(100% - 28px));
  pointer-events:none;line-height:1.5;
}

/* ---------- ภาพในเลนส์ใกล้ตา ---------- */
/* วงกลมดำล้อมภาพ = สิ่งที่ตาเห็นจริงเวลาส่องกล้อง ไม่ใช่ภาพสี่เหลี่ยม */
.eyepiece{
  position:absolute;right:16px;top:16px;
  width:min(46%,420px);aspect-ratio:1;
  border-radius:50%;overflow:hidden;background:#0d1014;
  box-shadow:0 24px 60px -18px rgba(13,16,20,.6), 0 0 0 10px #22262d, 0 0 0 12px #0d1014;
  cursor:crosshair;
}
.eyepiece canvas{
  width:100%;height:100%;display:block;
  /* บังคับให้ canvas มีเลเยอร์ของตัวเอง — บางเบราว์เซอร์อัปเดตแค่บางแถบถ้าไม่ทำ
     ใช้ translate3d เพื่อให้เป็นเมทริกซ์ 3 มิติจริง ๆ (translateZ(0) ถูกยุบเป็น 2 มิติในบางเบราว์เซอร์) */
  transform:translate3d(0,0,0);backface-visibility:hidden;
}
.ep-ring{
  position:absolute;inset:0;border-radius:50%;pointer-events:none;
  box-shadow:inset 0 0 26px 6px rgba(0,0,0,.35);
}
.ep-hud{
  position:absolute;left:0;right:0;bottom:12%;display:flex;
  flex-direction:column;align-items:center;gap:5px;
  color:#fff;font-size:.72rem;pointer-events:none;text-shadow:0 1px 3px rgba(0,0,0,.7);
}
.ep-scale{display:flex;flex-direction:column;align-items:center;gap:3px}
.ep-scale i{display:block;height:3px;background:#fff;border-radius:2px;width:60px}
.ep-ask{
  position:absolute;left:8%;right:8%;top:12%;padding:7px 12px;border-radius:12px;
  background:rgba(255,255,255,.94);font-size:.78rem;text-align:center;line-height:1.5;
}
.ep-ask[hidden]{display:none}
.ep-ask b{color:var(--brand-ink)}

/* ---------- เลือกสไลด์ ---------- */
.chooser{
  position:fixed;inset:0;z-index:20;display:grid;place-items:center;
  background:rgba(25,26,36,.5);backdrop-filter:blur(4px);padding:18px;overflow-y:auto;
}
.chooser[hidden]{display:none}
.chooser-box{
  background:var(--surface);border-radius:18px;padding:22px;width:100%;max-width:760px;
  box-shadow:0 30px 60px -25px rgba(25,26,36,.45);
}
.chooser-title{margin:0;font-size:1.15rem}
.chooser-sub{margin:4px 0 16px;font-size:.82rem;color:var(--muted)}
.chooser-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(220px,1fr));gap:10px}
.sp-card{
  display:flex;flex-direction:column;gap:5px;text-align:left;
  padding:14px;border:1px solid var(--line);border-radius:14px;background:var(--bg);
  font-family:inherit;cursor:pointer;transition:all .15s;
}
.sp-card:hover{border-color:var(--brand);background:var(--brand-soft)}
.sp-card.on{border-color:var(--brand);box-shadow:0 0 0 2px var(--brand-soft)}
.sp-card canvas{width:100%;height:74px;border-radius:10px;background:#0d1014}
.sp-name{font-weight:700;font-size:.92rem}
.sp-about{font-size:.74rem;color:var(--muted);line-height:1.5}
.sp-meta{font-size:.7rem;color:var(--brand-ink);background:var(--brand-soft);
  padding:2px 9px;border-radius:999px;align-self:flex-start}

/* ---------- แผงข้าง ---------- */
#panel{
  flex:none;background:var(--surface);border-top:1px solid var(--line);
  padding:12px 14px 14px;display:flex;flex-direction:column;gap:9px;max-height:46vh;
}
.panel-head{display:flex;align-items:baseline;gap:10px}
.panel-title{font-weight:700;font-size:.92rem}
.goal{font-size:.78rem;color:var(--muted);margin-left:auto;text-align:right}
.hint{margin:0;font-size:.76rem;color:var(--muted);line-height:1.55}
#panel-body{flex:1 1 auto;min-height:0;overflow-y:auto;display:flex;flex-direction:column;gap:8px}
#panel #panel-body .btn,#panel .btn-switch{flex:none}

.sec-head{font-size:.74rem;font-weight:700;color:var(--muted);margin-top:4px}

.choices{display:flex;flex-wrap:wrap;gap:6px}
.choice{
  padding:8px 13px;border:1px solid var(--line);border-radius:999px;
  background:var(--bg);font-family:inherit;font-size:.82rem;cursor:pointer;
  transition:all .15s;min-height:38px;
}
.choice:hover{border-color:var(--brand);background:var(--brand-soft);color:var(--brand-ink)}
.choice.on{background:var(--brand);border-color:var(--brand);color:#fff}
.choice[disabled]{opacity:.4;pointer-events:none}

/* ปุ่มปรับโฟกัส — หยาบกับละเอียดแยกกันเหมือนกล้องจริง */
.knob{display:flex;align-items:center;gap:8px}
.knob label{font-size:.74rem;color:var(--muted);width:52px;flex:none}
.knob input[type=range]{flex:1;accent-color:var(--brand)}
.knob b{font-family:ui-monospace,monospace;font-size:.76rem;width:56px;text-align:right}

.focus-meter{height:8px;border-radius:999px;background:#e2dfd6;overflow:hidden;margin-top:2px}
.focus-fill{height:100%;background:linear-gradient(90deg,#d68a17,#129a72);transition:width .1s}

.kv{display:flex;flex-direction:column;gap:4px}
.kv-row{display:flex;gap:8px;font-size:.76rem;line-height:1.5}
.kv-k{color:var(--muted);flex:none;min-width:78px}
.kv-v{font-weight:600}

.task{display:flex;gap:7px;align-items:flex-start;font-size:.78rem;line-height:1.5}
.task-mark{color:var(--muted);flex:none;width:14px}
.task.done{color:var(--ok)}
.task.done .task-mark{color:var(--ok)}

.calc{display:flex;flex-direction:column;gap:7px}
.num{
  padding:10px 12px;border:1px solid var(--line);border-radius:10px;
  font-family:ui-monospace,monospace;font-size:.95rem;width:100%;
}
.num:focus{outline:2px solid var(--brand-soft);border-color:var(--brand)}

.struct{
  display:flex;gap:8px;align-items:flex-start;padding:7px 10px;
  background:var(--bg);border-radius:10px;font-size:.76rem;line-height:1.5;
}
.struct b{display:block;font-size:.8rem}
.struct.locked{opacity:.5}

/* ---------- ปุ่ม ---------- */
.actions{display:flex;gap:8px;flex:none}
.btn{
  flex:1;padding:11px;border-radius:999px;border:1px solid transparent;
  font-family:inherit;font-size:.88rem;font-weight:600;cursor:pointer;transition:filter .15s;
}
.btn:active{transform:translateY(1px)}
.btn[disabled]{opacity:.45;pointer-events:none}
.btn-ghost{background:var(--surface);border-color:var(--line);color:var(--ink)}
.btn-ghost:hover{background:var(--bg)}
.btn-submit{background:var(--ok);color:#fff}
.btn-submit:hover{filter:brightness(1.06)}

/* ---------- จอกว้าง ---------- */
@media (min-width:820px){
  body{flex-direction:row}
  #panel{
    width:340px;max-height:none;height:100%;
    border-top:none;border-left:1px solid var(--line);padding:16px;
  }
}

/* ---------- จอเล็ก ---------- */
@media (max-width:640px){
  /* จอแคบ ๆ ภาพในเลนส์สำคัญกว่าตัวกล้อง จึงให้ภาพกินพื้นที่เกือบเต็ม */
  .eyepiece{width:min(72%,320px);right:50%;transform:translateX(50%);top:12px}
  .status{max-width:calc(100% - 28px);font-size:.8rem}
  .coach{font-size:.74rem}
}

/* ---------- หน้าโหลด ---------- */
.booting{
  position:fixed;inset:0;z-index:60;display:grid;place-items:center;
  background:var(--bg);transition:opacity .35s ease;
}
.booting.gone{opacity:0;pointer-events:none}
.booting-box{display:flex;flex-direction:column;align-items:center;gap:10px;text-align:center;padding:20px}
.booting-ring{
  width:46px;height:46px;border-radius:50%;
  border:4px solid var(--line);border-top-color:var(--brand);
  animation:pgspin .9s linear infinite;
}
@keyframes pgspin{to{transform:rotate(360deg)}}
.booting-title{font-weight:700;font-size:.95rem}
.booting-sub{font-size:.8rem;color:var(--muted)}

.readbox2{background:rgba(255,255,255,.06);border:1px solid var(--line,#2a3145);border-radius:12px;
  padding:8px 12px;font-size:.74rem;line-height:1.6;font-variant-numeric:tabular-nums;margin:6px 0}
.readbox2 b{color:var(--brand,#7fd6e8)}
