/* แล็บเคมี — เวทีบน / แผงล่าง บนจอเล็ก, เวทีซ้าย / แผงขวา บนจอกว้าง
   ใช้ 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;
  --accent-soft:#d6f5f6;
  --accent-ink:#0b7d82;
  --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;
}

/* ---------- เวที 3D ---------- */
#stage{position:relative;flex:1;min-height:0;background:#fff}
#webgl-canvas{width:100%;height:100%;display:block;touch-action:none;cursor:grab}
#webgl-canvas.dragging{cursor:grabbing}

.status{
  /* right เว้นช่องไว้ให้ปุ่มสลับภาษา (pin-tr) มุมขวาบน ไม่ให้ทับกัน */
  position:absolute;left:14px;top:14px;right:96px;
  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(560px,calc(100% - 110px));line-height:1.55;
}
.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 b{font-weight:700}
.status .eq{
  display:block;margin-top:5px;font-family:ui-monospace,monospace;
  font-size:.92em;color:var(--brand-ink);
}

.beaker-tag{
  position:absolute;right:14px;bottom:14px;
  background:var(--ink);color:#fff;border-radius:999px;
  padding:5px 14px;font-size:.78rem;font-weight:600;pointer-events:none;
  max-width:calc(100% - 28px);
}

/* ---------- กล่องทำนายผล ---------- */
.predict{
  position:absolute;inset:0;display:grid;place-items:center;
  background:rgba(25,26,36,.45);backdrop-filter:blur(3px);padding:20px;z-index:5;
}
.predict[hidden]{display:none}
.predict-q{
  background:var(--surface);border-radius:16px 16px 0 0;padding:18px 22px 12px;
  font-weight:700;font-size:.95rem;max-width:460px;width:100%;text-align:center;
}
.predict-q small{display:block;font-weight:500;color:var(--muted);font-size:.8rem;margin-top:3px}
.predict-opts{
  background:var(--surface);border-radius:0 0 16px 16px;padding:0 22px 20px;
  display:flex;flex-direction:column;gap:8px;max-width:460px;width:100%;
  box-shadow:0 30px 60px -25px rgba(25,26,36,.4);
}
.predict-opts button{
  padding:12px 16px;border-radius:12px;border:1px solid var(--line);
  background:var(--bg);font-family:inherit;font-size:.88rem;text-align:left;
  cursor:pointer;transition:all .15s;
}
.predict-opts button:hover{border-color:var(--brand);background:var(--brand-soft);color:var(--brand-ink)}

/* ---------- แผงข้าง ---------- */
#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:44vh;
}
.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)}

/* ---------- สมุดบันทึก ---------- */
.notebook{flex:1;min-height:70px;display:flex;flex-direction:column;gap:6px}
.nb-head{font-size:.78rem;font-weight:600;color:var(--muted)}
.nb-head span{
  background:var(--brand-soft);color:var(--brand-ink);
  padding:1px 8px;border-radius:999px;font-size:.72rem;
}
.nb-list{
  flex:1;overflow-y:auto;border:1.5px dashed var(--line);border-radius:12px;
  padding:8px;display:flex;flex-direction:column;gap:5px;
}
.nb-empty{margin:auto;color:#a0a1b0;font-size:.8rem}
.nb-item{
  background:var(--bg);border-left:3px solid var(--brand);border-radius:8px;
  padding:6px 9px;font-size:.78rem;line-height:1.5;
}
.nb-item.miss{border-left-color:var(--warn)}
.nb-eq{font-family:ui-monospace,monospace;font-size:.76rem;color:var(--brand-ink)}
.nb-note{color:var(--muted);font-size:.73rem}

/* ---------- ปุ่ม ---------- */
.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;flex:1.4}
.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;
  }
}

/* ---------- รายการสารในแผงข้าง (ทางเลือกแทนการลากใน 3D) ---------- */
.shelf-list{
  display:grid;grid-template-columns:repeat(auto-fill,minmax(148px,1fr));
  gap:6px;flex:none;
}
.reagent{
  display:flex;align-items:center;gap:7px;
  padding:8px 10px;border:1px solid var(--line);border-radius:10px;
  background:var(--bg);font-family:inherit;cursor:pointer;text-align:left;
  transition:all .15s;min-height:44px;
}
.reagent:hover{border-color:var(--brand);background:var(--brand-soft)}
.reagent:active{transform:translateY(1px)}
.reagent-dot{
  width:14px;height:14px;border-radius:50%;flex:none;
  border:1px solid rgba(0,0,0,.12);
}
.reagent-formula{font-weight:700;font-size:.8rem;white-space:nowrap}
.reagent-name{
  font-size:.68rem;color:var(--muted);overflow:hidden;
  text-overflow:ellipsis;white-space:nowrap;
}

/* ============================================================
 * เลือกประเภทการทดลอง
 * ============================================================ */
.chooser{
  position:absolute;inset:0;z-index:8;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(210px,1fr));gap:10px;
}
.exp-card{
  display:flex;flex-direction:column;gap:4px;text-align:left;
  padding:14px;border:1px solid var(--line);border-radius:14px;background:var(--bg);
  font-family:inherit;cursor:pointer;transition:all .15s;
}
.exp-card:hover{border-color:var(--brand);background:var(--brand-soft)}
.exp-card.on{border-color:var(--brand);box-shadow:0 0 0 2px var(--brand-soft)}
.exp-icon{font-size:1.6rem;line-height:1}
.exp-name{font-weight:700;font-size:.92rem}
.exp-goal{font-size:.75rem;color:var(--muted);line-height:1.5}
.exp-meter{
  margin-top:4px;font-size:.7rem;font-weight:600;
  color:var(--brand-ink);background:var(--brand-soft);
  padding:2px 9px;border-radius:999px;align-self:flex-start;
}

/* ============================================================
 * แผงควบคุมของแต่ละโต๊ะ
 * ============================================================ */
/* แผงกลางต้องเลื่อนได้เอง ไม่งั้นโต๊ะที่มีตัวเลือกเยอะจะดันสมุดบันทึกตกจอ */
#panel-body{flex:1 1 auto;min-height:0;overflow-y:auto;display:flex;flex-direction:column;gap:8px}
.btn-switch{flex:none;padding:8px;font-size:.8rem}

.sec-head{
  font-size:.74rem;font-weight:700;color:var(--muted);
  text-transform:none;letter-spacing:.02em;margin-top:4px;
}
.sec-body{display:flex;flex-direction:column;gap:7px}

.choices{display:flex;flex-wrap:wrap;gap:6px}
.choice{
  padding:8px 14px;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:.45;pointer-events:none}

.var-label{font-size:.76rem;font-weight:600;margin-top:4px}

/* ค่าที่อ่านได้จากเครื่องมือ — ตัวใหญ่พอให้เห็นจากระยะห่างจอโปรเจกเตอร์ */
.meter{
  background:var(--bg);border:1px solid var(--line);border-radius:12px;
  padding:9px 12px;text-align:center;
}
.meter-big{font-size:1.4rem;font-weight:700;font-family:ui-monospace,monospace}
.meter-sub{font-size:.75rem;color:var(--muted)}

.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:92px}
.kv-v{font-weight:600}

.calc{display:flex;flex-direction:column;gap:7px;margin-top:6px}
.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)}

.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)}

.run-row{
  display:flex;justify-content:space-between;gap:8px;font-size:.75rem;
  padding:5px 9px;background:var(--bg);border-radius:8px;
}
.run-time{font-family:ui-monospace,monospace;font-weight:700;color:var(--brand-ink)}

/* สมุดบันทึกไม่ต้องยืดกินพื้นที่ทั้งแผงอีกต่อไป */
.notebook{flex:none}
.nb-list{max-height:170px}

/* ---------- โต๊ะอัตราการเกิดปฏิกิริยา: ลูกบิด + กล่องสรุปค่า ---------- */
/* ปุ่มค่าที่ใช้บ่อยใต้ลูกบิด — เล็กกว่าปุ่มเลือกปกติ เพราะเป็นแค่ทางลัด */
.choices.quick{gap:4px;margin-top:-2px}
.choices.quick .choice{padding:3px 9px;font-size:.72rem;font-weight:600}

.rt-row{display:flex;align-items:baseline;justify-content:space-between;gap:4px 10px;
  font-size:.78rem;padding:3px 0;border-bottom:1px dashed var(--line)}
.rt-row:last-of-type{border-bottom:0}
.rt-k{color:var(--muted);flex:1 1 auto;min-width:0}
.rt-v{font-family:ui-monospace,monospace;font-weight:700;color:var(--ink);
  font-variant-numeric:tabular-nums;text-align:right}
.rt-v.good{color:#2e7d4f}
.rt-v.warn{color:#c0392b}
.hint.warn{color:#c0392b}
/* ลูกบิดถูกล็อกระหว่างเดินการทดลอง — ค่าที่บันทึกจะได้ตรงกับที่ตั้งไว้ตอนกดเริ่ม */
.pgknob.is-busy{opacity:.5}
