/* ===========================================================
   Chessroom — live classroom
   Layout follows the teacher's sketch: master board + tools +
   PGN + roster on top, student games tiled underneath.
   =========================================================== */

.room{
  --board:min(55vh, 520px);     /* 20% wider than before */
  --tools:106px;                /* 2 × 44px icons + gap + padding */
  --pgnw:132px;
  --rosw:304px;                 /* doubled from 152px */
  padding:14px;max-width:1140px;margin:0 auto;
}
.room-top{
  display:grid;
  grid-template-columns: var(--board) var(--tools) var(--pgnw) var(--rosw);
  gap:12px;margin-bottom:14px;justify-content:center;
  align-items:stretch;          /* every column runs the full height of the row */
}

/* ── Chess board — ported from board2.js (ChessBoard) ── */
.cb{
  position:relative;width:100%;aspect-ratio:1;
  border:3px solid #5a3e20;border-radius:4px;overflow:hidden;
  box-shadow:0 4px 20px rgba(0,0,0,.5);user-select:none;line-height:0;
}
.cb-sm{border-width:2px;border-radius:3px;box-shadow:0 2px 10px rgba(0,0,0,.35)}
.cb-grid{
  display:grid;grid-template-columns:repeat(8,1fr);grid-template-rows:repeat(8,1fr);
  width:100%;height:100%;
}
.cb-sq{aspect-ratio:1;min-height:0;min-width:0}
.cb-grid.flip{transform:rotate(180deg)}
.cb-grid.flip .cb-sq{transform:rotate(180deg)}
.cb-sq{
  position:relative;display:flex;align-items:center;justify-content:center;
  box-sizing:border-box;line-height:1;
}
.cb-sq.lt{background:#F0D9B5}
.cb-sq.dk{background:#B58863}

/* Highlights replace the square colour outright */
.cb-sq.mfrom{background:#CDD26A}
.cb-sq.mto{background:#AABB44}
.cb-sq.sel{background:#F6F669}
.cb-live .cb-sq{cursor:pointer}
.cb-sq.drag-over{box-shadow:inset 0 0 0 3px rgba(246,246,105,.95)}

/* Coordinates — real spans, 10px bold, 70% opacity */
.cb-co{
  position:absolute;font-size:10px;font-family:'DM Sans',sans-serif;font-weight:700;
  line-height:1;pointer-events:none;opacity:.7;z-index:1;
}
.cb-co-r{top:1px;left:2px}
.cb-co-f{bottom:1px;right:2px}
.cb-sm .cb-co{display:none}

/* Pieces — 74% of the square, dark with a white halo for the light side */
.cb-pc{
  display:block;position:relative;z-index:3;line-height:1;color:#1a0800;
  font-size:calc(var(--sq, 60px) * .74);
  font-family:"Segoe UI Symbol","Apple Color Emoji","Noto Chess","FreeSerif","DejaVu Sans",serif;
  pointer-events:none;
}
.cb-pc.w{text-shadow:0 0 3px #ffffff, 0 0 6px #ffffff, 0 1px 0 #ffffff}
.cb-pc.b{text-shadow:none}

/* Legal-move markers */
.cb-dot{
  position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);
  width:30%;height:30%;border-radius:50%;background:rgba(0,0,0,.20);
  pointer-events:none;z-index:2;
}
.cb-ring{
  position:absolute;inset:0;box-sizing:border-box;
  border:max(3px, calc(var(--sq, 60px) * .07)) solid rgba(0,0,0,.3);
  pointer-events:none;z-index:2;
}
.cb-hl{position:absolute;inset:0;opacity:.42;pointer-events:none;z-index:2}
.cb-draw .cb-sq{cursor:crosshair}
.cb-ann{position:absolute;inset:0;width:100%;height:100%;pointer-events:none;z-index:4}
.cb-ann.flip{transform:rotate(180deg)}

/* Piece following the cursor while dragging */
.cb-ghost{
  position:fixed;z-index:300;pointer-events:none;transform:translate(-50%,-50%);
  color:#1a0800;line-height:1;
  font-family:"Segoe UI Symbol","Apple Color Emoji","Noto Chess","FreeSerif","DejaVu Sans",serif;
  filter:drop-shadow(0 4px 8px rgba(0,0,0,.5));
}
.cb-ghost.w{text-shadow:0 0 3px #fff, 0 0 6px #fff, 0 1px 0 #fff}

.board-wrap{background:var(--panel);border:1px solid var(--line);border-radius:var(--radius);
  padding:10px;box-shadow:var(--shadow)}
.board-cap{display:flex;align-items:center;gap:8px;margin-bottom:8px;font-size:12.5px}
.board-cap .who{font-weight:700}
.turn-dot{width:11px;height:11px;border-radius:50%;border:1.5px solid var(--ink);display:inline-block}
.turn-dot.w{background:#FFFDF6}
.turn-dot.b{background:#241A0C}

/* ── Tools rail (the vertical strip in the sketch) ─ */
.tools{
  background:var(--ink);border-radius:var(--radius);padding:10px 6px;
  display:grid;grid-template-columns:repeat(2,44px);gap:5px;
  justify-content:center;
  align-content:space-between;  /* fills the same height as the board */
  height:100%;
}
.tools .tool{height:100%;min-height:32px}
.tools .tl-head{display:none}
.tool{
  width:44px;height:36px;border:none;border-radius:7px;background:rgba(240,217,181,.1);
  color:#E8DFC9;font-size:15px;cursor:pointer;display:grid;place-items:center;
  font-family:inherit;position:relative;
}
.tool:hover{background:var(--board-l);color:#2A1D0B}
.tool.on{background:var(--brass);color:#fff}
.tool:disabled{opacity:.32;cursor:not-allowed}
.tool-sep{grid-column:1/-1;height:1px;background:rgba(232,223,201,.16);margin:3px 4px}
.swatches{grid-column:1/-1;display:grid;grid-template-columns:repeat(4,1fr);gap:4px;padding:1px 0}
.sw{width:100%;height:20px;border-radius:5px;border:2px solid transparent;cursor:pointer;padding:0}
.sw.on{border-color:#F5EDD8;box-shadow:0 0 0 1px rgba(0,0,0,.35) inset}

/* ── PGN column ───────────────────────────────── */
.pgn-box{background:var(--panel);border:1px solid var(--line);border-radius:var(--radius);
  box-shadow:var(--shadow);display:flex;flex-direction:column;height:calc(var(--board) + 42px)}
.pgn-head{padding:9px 12px;border-bottom:1px solid var(--line);display:flex;align-items:center;gap:8px}
.pgn-head h3{font-family:'Playfair Display',serif;font-size:14.5px}
.pgn-body{padding:8px 7px;overflow-y:auto;flex:1;font-family:'JetBrains Mono',monospace;font-size:11.5px;line-height:1.85}
.pgn-body b{margin-right:3px;padding:1px 3px}
.pgn-head{padding:8px 9px}
.pgn-head h3{font-size:13.5px}
.pgn-foot{padding:7px;flex-direction:column;gap:5px}
.pgn-foot .btn{width:100%;justify-content:center}
.pgn-body i{color:var(--muted);font-style:normal;margin-right:3px}
.pgn-body b{display:inline-block;padding:1px 5px;border-radius:4px;margin-right:4px;cursor:pointer;font-weight:500}
.pgn-body b:hover{background:var(--brass-soft)}
.pgn-body b.on{background:var(--ink);color:#F5EDD8;font-weight:700}
.pgn-foot{padding:8px 12px;border-top:1px solid var(--line);display:flex;gap:6px}

/* ── Roster column ────────────────────────────── */
.roster{background:var(--panel);border:1px solid var(--line);border-radius:var(--radius);
  box-shadow:var(--shadow);display:flex;flex-direction:column;height:calc(var(--board) + 42px)}
.roster-head{padding:9px 12px;border-bottom:1px solid var(--line);display:flex;align-items:center;gap:8px}
.roster-head h3{font-family:'Playfair Display',serif;font-size:14.5px}
.roster-body{overflow-y:auto;flex:1}
.pr{display:flex;align-items:center;gap:6px;padding:7px 10px;border-bottom:1px solid #F3ECDD;font-size:13px}
.pr .tag{display:inline-block;font-size:10px;letter-spacing:.05em;text-transform:uppercase;
  color:var(--muted);margin-left:5px}
.pr .rt{font-family:'JetBrains Mono',monospace;font-size:11px;font-weight:700;color:#5A4A2E;
  background:var(--brass-soft);border-radius:4px;padding:1px 4px;flex:0 0 auto}
.roster-head{padding:8px 9px}
.roster-head h3{font-size:13.5px}
.pr:last-child{border-bottom:none}
/* Attendance dot: gray = added but not signed in, green = signed in,
   dark blue = currently paired in a game. Sized up so it reads at a glance. */
.pr .dot{width:14px;height:14px;border-radius:50%;background:#B8B09C;flex:0 0 14px;
  border:1px solid rgba(0,0,0,.12)}
.pr .dot.on{background:#3FA23A;border-color:#2E7D28;box-shadow:0 0 0 3px rgba(63,162,58,.20)}
.pr .dot.paired{background:#1E40AF;border-color:#152C7A;box-shadow:0 0 0 3px rgba(30,64,175,.22)}

/* Raised hand */
.pr.raised{background:#FCF3D3}
.mini.hand-up{background:#F6C445;border-color:#E0A800;color:#3A2E00}
.mini.hand-up:hover{background:#E9B72E}
.hand-badge{color:#8A5A00;font-weight:700}

/* Student-board move navigation row */
.gc-nav{display:flex;align-items:center;gap:4px;margin-top:5px}
.gc-nav .btn{padding:3px 7px;font-size:12px;line-height:1}
.gcard.rewound{outline:2px solid #1E40AF;outline-offset:1px}
.pr .nm{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.pr .nm b{font-weight:700}
.pr .tag{font-size:10px;letter-spacing:.05em;text-transform:uppercase;color:var(--muted)}
.pr.ctrl{background:var(--brass-soft)}
.pr .mini{border:1px solid var(--line);background:#fff;border-radius:6px;width:25px;height:24px;flex:0 0 25px;
  cursor:pointer;font-size:12px;display:grid;place-items:center;padding:0}
.pr .mini:hover{background:var(--brass-soft)}
.roster-foot{padding:9px;border-top:1px solid var(--line);display:grid;
  grid-template-columns:1fr 1fr;gap:6px;align-items:center}
.roster-foot select{font-size:12.5px;padding:7px 8px;width:100%}
.roster-foot .btn{width:100%;justify-content:center;font-size:12.5px}
.roster-foot > label{grid-column:1/-1;margin-bottom:-2px}
.roster-foot #joinPolicy,.roster-foot .colpick,.roster-foot #btnMasterPair{grid-column:1/-1}
.colpick{display:grid;grid-template-columns:repeat(3,1fr);gap:3px;width:100%}
.colpick label{
  border:1px solid var(--line);border-radius:5px;background:#FFFDF8;cursor:pointer;
  font-size:11px;font-weight:700;text-align:center;padding:4px 0;color:var(--muted);
}
.colpick label:has(input:checked){background:var(--ink);color:#F5EDD8;border-color:var(--ink)}
.colpick input{position:absolute;opacity:0;pointer-events:none}
.master-pair{
  background:#2F6690;color:#fff;padding:7px 13px;border-radius:8px;font-size:13px;
  margin-bottom:10px;display:flex;align-items:center;gap:9px;flex-wrap:wrap;
}
.master-pair .spacer{flex:1}
.master-pair button{background:rgba(255,255,255,.2);border:1px solid rgba(255,255,255,.45);
  color:#fff;border-radius:6px;padding:3px 10px;font-family:inherit;font-weight:700;cursor:pointer;font-size:12px}

/* ── Student games strip ──────────────────────── */
.games-head{display:flex;align-items:center;gap:10px;margin:4px 0 9px}
.games-head h2{font-family:'Playfair Display',serif;font-size:16px}
.games{display:grid;grid-template-columns:repeat(auto-fill,minmax(270px,1fr));gap:11px}

/* ── Live-class button states ─────────────────── */
/* Leave / exit — clearly a way out, not an inactive control. */
.btn-leave{background:#C0392B;border-color:#C0392B;color:#fff}
.btn-leave:hover{background:#A93226;border-color:#A93226;color:#fff}
/* Join video — green once a link has been shared, greyed and inert until then. */
.btn-go{background:#2E9E5B;border-color:#2E9E5B;color:#fff}
.btn-go:hover{background:#268A4E;border-color:#268A4E;color:#fff}
.btn.is-disabled{opacity:.45;pointer-events:none;cursor:default}
/* Countdown to the class time limit. */
.class-timer{font-family:ui-monospace,monospace;font-size:12.5px;padding:4px 9px;border-radius:6px;
  border:1px solid var(--line);color:var(--muted);white-space:nowrap}
.class-timer.warn{color:#fff;background:#C0392B;border-color:#C0392B}
.gcard{background:var(--panel);border:1px solid var(--line);border-radius:var(--radius);
  box-shadow:var(--shadow);padding:9px;display:flex;flex-direction:column;gap:7px}
.gcard.mine{border-color:var(--brass);box-shadow:0 0 0 2px rgba(184,134,11,.18)}
.gcard.frozen{border-color:#2F6690}
.gcard.frozen .bd{position:relative}
.gcard.frozen .bd::after{
  content:'\2744';position:absolute;inset:0;display:grid;place-items:center;
  background:rgba(47,102,144,.28);color:#fff;font-size:26px;z-index:9;
  text-shadow:0 1px 4px rgba(0,0,0,.5);pointer-events:none;
}
.gc-col{display:inline-block;width:9px;height:9px;border-radius:2px;border:1px solid var(--ink);flex:0 0 9px}
.gc-col.w{background:#FFFDF6}
.gc-col.b{background:#241A0C}
.freeze-bar{display:flex;align-items:center;gap:8px;margin-left:auto}
.gc-top,.gc-bot{display:flex;align-items:center;gap:6px;font-size:12px}
.gc-top .nm,.gc-bot .nm{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-weight:700}
.gc-foot{display:flex;gap:5px;align-items:center;font-size:11.5px;color:var(--muted)}
.gc-foot .spacer{flex:1}
.gc-empty{padding:26px 10px;text-align:center;color:var(--muted);font-size:13px}

/* ── Chat ─────────────────────────────────────── */
.chat{display:flex;flex-direction:column;gap:6px;max-height:170px;overflow-y:auto;padding:9px 11px}
.ch{display:flex;gap:7px;font-size:12.5px;line-height:1.4}
.ch .av{width:22px;height:22px;border-radius:50%;display:grid;place-items:center;color:#fff;
  font-size:9.5px;font-weight:700;flex:0 0 22px}
.chat-form{display:flex;gap:6px;padding:8px 11px;border-top:1px solid var(--line)}
.chat-form input{flex:1}

/* ── Link status & toast ──────────────────────── */
.linkchip{display:inline-flex;align-items:center;gap:6px;font-size:12px;color:var(--muted)}
#linkdot{width:8px;height:8px;border-radius:50%;background:#4E9A3E}
#linkdot.off{background:#B33}
#toast{
  position:fixed;left:50%;bottom:26px;transform:translate(-50%,18px);
  background:var(--ink);color:#F5EDD8;padding:10px 18px;border-radius:9px;font-size:13.5px;
  box-shadow:0 10px 30px rgba(0,0,0,.3);opacity:0;pointer-events:none;transition:.2s;z-index:200;
  max-width:min(90vw,460px);text-align:center;
}
#toast.on{opacity:1;transform:translate(-50%,0)}

/* ── Control banner (student has the chalk) ───── */
.control-banner{
  background:var(--brass);color:#fff;padding:8px 14px;border-radius:8px;
  font-size:13.5px;font-weight:700;margin-bottom:11px;display:flex;align-items:center;gap:10px;
}
.control-banner .spacer{flex:1}
.control-banner button{background:rgba(255,255,255,.2);border:1px solid rgba(255,255,255,.45);
  color:#fff;border-radius:7px;padding:4px 11px;font-family:inherit;font-weight:700;cursor:pointer;font-size:12.5px}

/* ── Student view ─────────────────────────────── */
.stu-wrap{max-width:1240px;margin:0 auto;padding:14px;display:grid;
  grid-template-columns:minmax(0,1fr) 290px;gap:14px;align-items:start}

/* Every board the same size, two across. A simul just adds more of them. */
.stu-boards{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:14px;align-items:start}
.stu-boards .board-wrap{min-width:0}
.stu-side{min-width:0}

/* The board it is your turn on is picked out, so a simul is easy to scan. */
.board-wrap.my-turn{border-color:var(--brass);box-shadow:0 0 0 2px rgba(184,134,11,.22)}
.board-wrap.frozen-note{opacity:.72}

@media (max-width:1080px){
  .stu-wrap{grid-template-columns:1fr}
}
@media (max-width:620px){
  .stu-boards{grid-template-columns:1fr}
}
.stu-head{background:var(--ink);color:#EFE6CE;padding:11px 18px;display:flex;align-items:center;gap:14px;flex-wrap:wrap}
.stu-head h1{font-family:'Playfair Display',serif;font-size:18px;color:#F5EDD8}
.stu-head .spacer{flex:1}
.stu-head a{color:#D8C79A}

/* ── Responsive ───────────────────────────────── */
@media (max-width:1140px){
  .room-top{grid-template-columns:var(--board) var(--tools) var(--pgnw);grid-template-rows:auto auto}
  .roster{grid-column:1/-1;height:auto;max-height:300px}
}
@media (max-width:960px){
  .room{--board:min(52vh,440px)}
}
@media (max-width:860px){
  .room{--board:min(68vw,430px)}
  .room-top{grid-template-columns:1fr;gap:10px}
  .tools{grid-template-columns:repeat(8,44px);overflow-x:auto}
  .tools .tl-head{display:none}
  .pgn-box,.roster{height:auto;max-height:250px}
  .stu-wrap{grid-template-columns:1fr}
}
@media print{ .tools,.roster-foot,.chat-form,.pgn-foot{display:none} }

/* ===========================================================
   Student portal
   =========================================================== */
.snav{display:flex;gap:2px;flex-wrap:wrap;align-items:center}
.snav a{color:#C7B78F;font-size:13px;font-weight:500;padding:6px 10px;border-radius:7px;
  text-decoration:none;white-space:nowrap;display:block}
.snav a:hover{background:rgba(240,217,181,.12);color:#F5EDD8;text-decoration:none}
.snav a.on{background:var(--board-l);color:#2A1D0B;font-weight:700}

/* ── My Games dropdown ── */
.snav-drop{position:relative}
.snav-drop-btn{
  color:#C7B78F;font-size:13px;font-weight:500;padding:6px 10px;border-radius:7px;
  background:none;border:none;cursor:pointer;font-family:inherit;white-space:nowrap;
  display:flex;align-items:center;gap:5px;
}
.snav-drop-btn:hover{background:rgba(240,217,181,.12);color:#F5EDD8}
.snav-drop-btn i{font-style:normal;font-size:10px;transition:transform .15s}
.snav-drop.on .snav-drop-btn{background:var(--board-l);color:#2A1D0B;font-weight:700}
.snav-drop.open .snav-drop-btn i{transform:rotate(180deg)}
.snav-menu{
  display:none;position:absolute;top:calc(100% + 5px);left:0;z-index:80;min-width:186px;
  background:var(--panel);border:1px solid var(--line);border-radius:9px;padding:5px;
  box-shadow:0 10px 30px rgba(0,0,0,.28);
}
.snav-drop.open .snav-menu{display:block}
.snav-menu a{color:var(--ink);font-size:13.5px;padding:8px 11px;border-radius:6px}
.snav-menu a:hover{background:var(--brass-soft);color:var(--ink)}
.snav-menu a.on{background:var(--ink);color:#F5EDD8}

/* ── the header on small screens ── */
.snav-toggle{
  display:none;background:none;border:1px solid rgba(240,217,181,.3);color:#EFE6CE;
  border-radius:8px;padding:5px 11px;font-size:17px;cursor:pointer;font-family:inherit;line-height:1.2;
}
@media (max-width:900px){
  .stu-head{flex-wrap:wrap;gap:9px 12px;padding:10px 14px}
  .stu-head h1{font-size:16px}
  .snav-toggle{display:block;order:2;margin-left:auto}
  .stu-head .spacer{display:none}
  .snav{
    display:none;order:5;width:100%;flex-direction:column;align-items:stretch;gap:1px;
    border-top:1px solid rgba(240,217,181,.16);padding-top:8px;margin-top:2px;
  }
  .snav.open{display:flex}
  .snav a,.snav-drop-btn{padding:10px 11px;font-size:14.5px;width:100%}
  .snav-drop-btn{justify-content:space-between}
  /* Sub-items sit inline on mobile — no floating panel to chase with a thumb. */
  .snav-menu{
    position:static;display:none;box-shadow:none;border:none;background:transparent;
    padding:0 0 4px 14px;min-width:0;border-left:2px solid rgba(240,217,181,.25);margin:2px 0 2px 11px;
  }
  .snav-drop.open .snav-menu{display:block}
  .snav-menu a{color:#C7B78F}
  .snav-menu a:hover{background:rgba(240,217,181,.12);color:#F5EDD8}
  .snav-menu a.on{background:var(--board-l);color:#2A1D0B}
  .rate-chip{order:3}
  .stu-head .btn{order:4}
}
@media (max-width:520px){
  .stu-head h1{font-size:15px;max-width:58%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
  .stu-head > span:not(.rate-chip){display:none}   /* the student's name, on a narrow screen */
  .swrap{padding:14px 11px 40px}
  .tiles{grid-template-columns:repeat(2,1fr);gap:9px}
  .tile .v{font-size:21px}
}
.rate-chip{background:var(--brass);color:#fff;font-weight:700;font-size:12.5px;
  border-radius:999px;padding:3px 11px;font-family:'JetBrains Mono',monospace}
.swrap{max-width:1080px;margin:0 auto;padding:18px 14px 44px}

.tiles{display:grid;grid-template-columns:repeat(auto-fit,minmax(210px,1fr));gap:13px;margin-bottom:18px}
.tile{background:var(--panel);border:1px solid var(--line);border-radius:var(--radius);
  padding:15px 16px;box-shadow:var(--shadow);text-decoration:none;color:inherit;display:block}
a.tile:hover{border-color:var(--brass);text-decoration:none}
.tile .k{font-size:10.5px;letter-spacing:.1em;text-transform:uppercase;color:var(--muted);font-weight:700}
.tile .v{font-family:'Playfair Display',serif;font-size:26px;margin-top:3px;line-height:1.1}
.tile .n{font-size:12px;color:var(--muted);margin-top:2px}

.glist{display:grid;grid-template-columns:repeat(auto-fill,minmax(250px,1fr));gap:12px}
.gitem{background:var(--panel);border:1px solid var(--line);border-radius:var(--radius);
  box-shadow:var(--shadow);padding:11px;display:flex;flex-direction:column;gap:8px}
.gitem .hd{display:flex;align-items:center;gap:7px;font-size:13px}
.gitem .hd .nm{flex:1;font-weight:700;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.res{font-family:'JetBrains Mono',monospace;font-size:12px;font-weight:700;padding:2px 7px;border-radius:5px}
.res.win{background:#E9F2E0;color:#3E5C24}
.res.loss{background:#FAE7E2;color:#8C331C}
.res.draw{background:#EFEADD;color:#6E6249}
.res.live{background:#FBF0D3;color:#7A5A08}
.share{display:flex;gap:5px;flex-wrap:wrap}
.share a,.share button{border:1px solid var(--line);background:#fff;border-radius:6px;padding:4px 9px;
  font-size:12px;font-weight:700;font-family:inherit;cursor:pointer;color:var(--ink);text-decoration:none}
.share a:hover,.share button:hover{background:var(--brass-soft);text-decoration:none}

.viewer{display:grid;grid-template-columns:minmax(280px,440px) 1fr;gap:16px;align-items:start}
@media (max-width:800px){.viewer{grid-template-columns:1fr}}

.movelist{font-family:'JetBrains Mono',monospace;font-size:12.5px;line-height:2;max-height:260px;overflow-y:auto}
.movelist i{color:var(--muted);font-style:normal;margin-right:3px}
.movelist b{display:inline-block;padding:1px 5px;border-radius:4px;margin-right:4px;cursor:pointer;font-weight:500}
.movelist b:hover{background:var(--brass-soft)}
.movelist b.on{background:var(--ink);color:#F5EDD8;font-weight:700}

.lrow{display:flex;align-items:center;gap:10px;padding:9px 12px;border-bottom:1px solid #F3ECDD}
.lrow:last-child{border-bottom:none}
.lrow .ic{width:26px;text-align:center;font-size:15px;color:var(--muted)}
.lrow .tx{flex:1;min-width:0}
.lrow .tx b{display:block;font-size:13.5px}
.lrow .tx span{font-size:12px;color:var(--muted)}
.lesson-body{line-height:1.65;font-size:14.5px}
.lesson-body p{margin-bottom:10px}

.qopt{display:block;border:1px solid var(--line);border-radius:8px;padding:10px 12px;margin-bottom:7px;
  cursor:pointer;background:#FFFDF8;font-size:14px}
.qopt:hover{border-color:var(--brass)}
.qopt input{margin-right:8px;accent-color:var(--brass)}
.qopt.right{background:#EDF5E5;border-color:#8FBF6A}
.qopt.wrong{background:#FBEDE9;border-color:#DDA898}
.medal{font-family:'JetBrains Mono',monospace;font-weight:700}
.rank1{color:#B8860B}.rank2{color:#7A7A7A}.rank3{color:#A0522D}

/* ── waiting room ── */
.waitbox{background:#FBF0D3;border-bottom:1px solid var(--line)}
.wb-head{display:flex;align-items:center;gap:6px;padding:6px 9px;font-size:11px;font-weight:700;
  text-transform:uppercase;letter-spacing:.07em;color:#7A5A08}
.waitbox .pr{border-bottom:1px solid rgba(122,90,8,.14);background:transparent}
.waitbox .mini.ok{color:#3E5C24;border-color:#BBD3A4}
.waitbox .mini.no{color:#8C331C;border-color:#E9CFC7}

/* ── report & analysis ── */
.bar{height:9px;border-radius:5px;background:#EDE4D2;overflow:hidden;display:block}
.bar span{display:block;height:100%;background:var(--brass)}
.spark{width:100%;height:64px;display:block;margin-bottom:8px;
  background:#FFFDF8;border:1px solid var(--line);border-radius:8px}
.evalrow{display:flex;gap:12px;align-items:stretch}
.evalbar{width:16px;border-radius:8px;background:#241A0C;overflow:hidden;
  display:flex;flex-direction:column-reverse;min-height:60px;border:1px solid var(--ink)}
.evalbar span{display:block;background:#FFFDF6;width:100%}
.evalnum{font-family:'JetBrains Mono',monospace;font-size:22px;font-weight:700}
.prog{height:6px;background:#EDE4D2;border-radius:4px;overflow:hidden;margin-top:9px}
.prog span{display:block;height:100%;width:0;background:var(--brass);transition:width .2s}
.movelist b.g-inaccuracy{box-shadow:inset 0 -2px 0 #E8A800}
.movelist b.g-mistake{box-shadow:inset 0 -2px 0 #D2691E}
.movelist b.g-blunder{box-shadow:inset 0 -2px 0 #C62828}
@media print{
  .stu-head,.filters,.snav,button,.share{display:none!important}
  .card{break-inside:avoid;box-shadow:none}
  body{background:#fff}
}

/* ── bot picker ── */
.botlist{display:grid;grid-template-columns:repeat(auto-fill,minmax(140px,1fr));gap:7px}
.bot{border:1px solid var(--line);background:#FFFDF8;border-radius:9px;padding:9px 10px;cursor:pointer;
  text-align:left;font-family:inherit;display:flex;flex-direction:column;gap:2px}
.bot:hover{border-color:var(--brass)}
.bot.on{background:var(--ink);border-color:var(--ink);color:#F5EDD8}
.bot b{font-size:13.5px}
.bot span{font-size:11.5px;color:var(--muted)}
.bot.on span{color:#C7B78F}
.bot i{font-family:'JetBrains Mono',monospace;font-size:11px;font-style:normal;color:var(--brass)}
.bot.on i{color:var(--board-l)}

/* ── every-square names, for beginners ── */
.cb-name{position:absolute;top:2px;right:3px;
  font-size:calc(var(--sq,60px) * .19);font-family:'DM Sans',sans-serif;
  font-weight:700;color:rgba(26,8,0,.42);pointer-events:none;z-index:1;display:none;line-height:1}
/* On dark squares the ink needs to lift, not sink. */
.cb-sq.dk .cb-name{color:rgba(255,247,232,.62)}
.cb-names .cb-name{display:block}
.cb-names .cb-pc{opacity:.92}
.cb-sm .cb-name{display:none!important}

/* ── position set-up ── */
.cb-setup .cb-sq{cursor:copy}
.setup-panel{margin-bottom:14px}
.setup-grid{display:grid;grid-template-columns:minmax(260px,1fr) minmax(220px,.8fr);gap:18px}
@media (max-width:760px){.setup-grid{grid-template-columns:1fr}}
.palette{display:grid;grid-template-columns:repeat(6,1fr);gap:5px}
.pc-btn{border:1px solid var(--line);background:#FFFDF8;border-radius:7px;cursor:pointer;
  font-size:26px;line-height:1;padding:5px 0;color:#1a0800;font-family:"Segoe UI Symbol","Noto Chess","FreeSerif",serif}
.pc-btn.w{text-shadow:0 0 3px #fff,0 0 6px #fff,0 1px 0 #fff}
.pc-btn:hover{border-color:var(--brass)}
.pc-btn.on{background:var(--ink);border-color:var(--ink)}
.pc-btn.on.w{text-shadow:0 0 3px #fff,0 0 7px #fff}
.pc-btn.on.b{color:#F0D9B5}
.pc-btn.erase{font-size:17px;color:var(--clay)}
.imgbox img{max-width:100%;border:1px solid var(--line);border-radius:8px;display:block;background:#fff}

/* ── class call ── */
.callbox{width:100%;height:380px;background:#1E1608;border-radius:10px;overflow:hidden}
.stu-side .callbox{height:250px}
@media (max-width:760px){ .callbox{height:260px} }

/* ═══════════════  CLASS NOTES  ═══════════════
   The teacher writes on the left and sees the result on the right, so what
   the class will read is never a surprise. A green rail down the side of the
   card is the only signal that the notes are currently visible to students —
   it has to be readable at a glance from across a room. */
.notes-card{border-left:3px solid var(--line)}
.notes-card.is-shared{border-left-color:var(--olive)}
.notes-card .card-head h2{white-space:nowrap}

.notes-body{display:grid;grid-template-columns:1fr 1fr;gap:0}
.notes-edit{display:flex;flex-direction:column;border-right:1px solid var(--line)}
.notes-tools{display:flex;flex-wrap:wrap;gap:4px;padding:8px 10px;border-bottom:1px solid var(--line);
  background:var(--canvas)}
.notes-tools button{
  min-width:30px;height:28px;padding:0 7px;border:1px solid var(--line);border-radius:6px;
  background:var(--panel);color:var(--ink-2);font-family:inherit;font-size:12.5px;cursor:pointer}
.notes-tools button:hover{background:var(--brass-soft);border-color:var(--brass)}
#noteBody{
  border:0;border-radius:0;min-height:230px;resize:vertical;background:var(--panel);
  font-family:'DM Sans',system-ui,sans-serif;font-size:14px;line-height:1.55;padding:12px 14px}
#noteBody:focus{box-shadow:none;background:var(--panel)}

.notes-prev,.notes-read{padding:12px 16px;overflow-y:auto;max-height:340px;font-size:14px;line-height:1.6}
.notes-prev{background:var(--canvas)}
.notes-prev h3,.notes-prev h4,.notes-prev h5,.notes-prev h6,
.notes-read h3,.notes-read h4,.notes-read h5,.notes-read h6{
  font-family:'Playfair Display',serif;font-size:15.5px;font-weight:600;margin:12px 0 5px}
.notes-prev p,.notes-read p{margin:0 0 8px}
.notes-prev ul,.notes-prev ol,.notes-read ul,.notes-read ol{margin:0 0 9px 20px}
.notes-prev li,.notes-read li{margin-bottom:3px}
.notes-prev code,.notes-read code{
  font-family:'JetBrains Mono',monospace;font-size:12px;background:var(--brass-soft);
  border-radius:4px;padding:1px 5px;word-break:break-all}
.notes-prev .dim{font-style:italic}

.notes-lib{display:flex;flex-direction:column;max-height:360px}
.notes-lib-head{display:flex;gap:8px;align-items:center;padding:10px 14px;border-bottom:1px solid var(--line)}
.notes-lib-head input{max-width:280px}
#nList{overflow-y:auto}
.note-row{display:flex;align-items:center;gap:8px;padding:9px 14px;border-bottom:1px solid var(--line)}
.note-row:last-child{border-bottom:0}
.note-row:hover{background:var(--canvas)}

/* The student's copy sits in the side column, so it stacks rather than splits. */
.stu-side .notes-card .notes-read{max-height:300px}

@media (max-width:900px){
  .notes-body{grid-template-columns:1fr}
  .notes-edit{border-right:0;border-bottom:1px solid var(--line)}
  .notes-prev{max-height:200px}
  .notes-card .card-head{flex-wrap:wrap}
  .notes-card .card-head input{max-width:100%;margin-left:0}
}

/* ═══════════════  LESSON MEDIA  ═══════════════
   Video and board sit inside the lesson. A child who leaves the page to
   watch something rarely comes back to finish it. */
.video-frame{position:relative;width:100%;padding-top:56.25%;border-radius:8px;overflow:hidden;
  background:#000;border:1px solid var(--line);margin-bottom:14px}
.video-frame iframe{position:absolute;inset:0;width:100%;height:100%;border:0}

.lesson-board{display:grid;grid-template-columns:minmax(0,1fr) 210px;gap:16px;align-items:start}
.lesson-board .board-wrap{max-width:420px}
.lesson-board .movelist{max-height:340px;overflow-y:auto}
.lesson-body{font-size:14.5px;line-height:1.7}

@media (max-width:820px){
  .lesson-board{grid-template-columns:1fr}
  .lesson-board .board-wrap{max-width:none}
  .lesson-board .movelist{max-height:150px}
}

/* ═══════════════  POSITION SETUP  ═══════════════ */
.setup-wrap{display:grid;grid-template-columns:150px minmax(0,1fr) minmax(0,1fr);gap:16px;align-items:start;
  border:1px solid var(--line);border-radius:9px;padding:13px;background:var(--canvas)}
.setup-palette{display:grid;grid-template-columns:repeat(3,1fr);gap:5px}
.setup-palette .pc{
  height:38px;border:1px solid var(--line);border-radius:7px;background:var(--panel);
  font-size:23px;line-height:1;cursor:pointer;padding:0;display:flex;align-items:center;justify-content:center}
.setup-palette .pc.w{color:#4A3A1E}
.setup-palette .pc.b{color:#1E1608}
.setup-palette .pc.erase{grid-column:span 3;font-size:16px;color:var(--ink-2)}
.setup-palette .pc:hover{border-color:var(--brass);background:var(--brass-soft)}
.setup-palette .pc.on{border-color:var(--brass);background:var(--brass-soft);box-shadow:inset 0 0 0 1px var(--brass)}
.setup-controls{display:flex;gap:8px;align-items:center;flex-wrap:wrap;margin-top:10px}
#setupBoard{max-width:360px}

@media (max-width:760px){
  .setup-wrap{grid-template-columns:1fr !important}
  .setup-palette{grid-template-columns:repeat(6,1fr)}
  .setup-palette .pc.erase{grid-column:span 6}
}

/* ═══════════════  RICH LESSON TEXT  ═══════════════
   What the editor produces, styled to match the rest of the portal. */
.lesson-body h3,.lesson-body h4{font-family:'Playfair Display',serif;margin:18px 0 7px;font-size:17px}
.lesson-body h4{font-size:15px}
.lesson-body p{margin:0 0 11px}
.lesson-body ul,.lesson-body ol{margin:0 0 12px 22px}
.lesson-body li{margin-bottom:4px}
.lesson-body blockquote{margin:12px 0;padding:9px 15px;border-left:3px solid var(--brass);
  background:var(--canvas);border-radius:0 7px 7px 0}
.lesson-body pre{background:var(--canvas);border:1px solid var(--line);border-radius:7px;
  padding:11px 13px;overflow-x:auto;font-size:13px}
.lesson-body code{font-family:'JetBrains Mono',monospace;font-size:12.5px;
  background:var(--brass-soft);border-radius:4px;padding:1px 5px}
.lesson-body pre code{background:none;padding:0}
.lesson-body a{color:var(--brass);text-decoration:underline}
.lesson-body hr{border:0;border-top:1px solid var(--line);margin:16px 0}

.lesson-body img{max-width:100%;height:auto;border-radius:8px;border:1px solid var(--line)}
.lesson-body figure{margin:14px 0;max-width:100%}
.lesson-body figure.image-style-side{float:right;max-width:46%;margin:4px 0 12px 16px}
.lesson-body figcaption{font-size:12px;color:var(--muted);margin-top:5px;text-align:center}

.lesson-body table{border-collapse:collapse;width:100%;margin:14px 0;font-size:13.5px}
.lesson-body th,.lesson-body td{border:1px solid var(--line);padding:7px 10px;text-align:left;vertical-align:top}
.lesson-body th{background:var(--canvas);font-weight:600}
.lesson-body tr:nth-child(even) td{background:rgba(0,0,0,.014)}

@media (max-width:640px){
  .lesson-body figure.image-style-side{float:none;max-width:100%;margin:14px 0}
  .lesson-body table{display:block;overflow-x:auto}
}

/* A picture of the position, beside the board, to copy from. */
.setup-ref{min-width:0}
.ref-drop{border:1px dashed var(--line);border-radius:8px;background:var(--panel);min-height:190px;
  display:flex;align-items:center;justify-content:center;padding:9px;margin-top:9px;text-align:center}
.ref-drop.over{border-color:var(--brass);background:var(--brass-soft)}
.ref-drop img{max-width:100%;max-height:340px;border-radius:6px;display:block}
.ref-empty{font-size:12px;color:var(--muted);line-height:1.6;padding:14px 8px}

@media (max-width:1100px){
  .setup-wrap{grid-template-columns:150px minmax(0,1fr)}
  .setup-ref{grid-column:1/-1}
}

/* A level tag, coloured from the level's own tint. */
.lvl{display:inline-block;font-size:11px;line-height:1;padding:3px 8px;border-radius:99px;
  background:color-mix(in srgb, var(--lvl) 14%, transparent);
  color:var(--lvl);border:1px solid color-mix(in srgb, var(--lvl) 34%, transparent);
  white-space:nowrap;vertical-align:middle;margin-left:5px}
@supports not (color: color-mix(in srgb, red 10%, transparent)){
  .lvl{background:var(--canvas);border-color:var(--line)}
}

/* Pictures in a quiz — on the question and on the options. */
.qpic{max-width:100%;max-height:300px;border-radius:8px;border:1px solid var(--line);
  display:block;margin:0 0 12px}
.qopt-pic{max-width:190px;max-height:150px;border-radius:6px;border:1px solid var(--line);
  display:block;margin-top:7px}
.qopt{align-items:flex-start}
.qimg-row{display:flex;gap:7px;align-items:center;margin-top:6px}
.qimg-row input[type=text]{flex:1;min-width:0}
.qimg-row .qimg-prev{height:38px;width:auto;border-radius:5px;border:1px solid var(--line)}

/* ═══════════════  AWARDS  ═══════════════
   Certificates four across on a desktop, two on a phone — as asked, and
   because a certificate card needs to stay wide enough to read its title. */
.cert-grid{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:12px}
.cert-card{display:block;text-decoration:none;color:inherit;text-align:center;
  border:1px solid var(--line);border-radius:11px;padding:16px 11px;background:var(--panel);
  transition:border-color .15s, transform .15s}
.cert-card:hover{border-color:var(--brass);transform:translateY(-2px)}
.cert-ribbon{font-size:30px;line-height:1}
.cert-name{font-weight:500;font-size:13.5px;margin-top:8px;line-height:1.35;
  display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
.cert-meta{font-size:11.5px;color:var(--muted);margin-top:5px}
.cert-no{font-size:10.5px;color:var(--muted);margin-top:2px;word-break:break-all}

/* Badges: a fixed square whether the design is a picture or a character. */
.badge-grid{display:flex;gap:16px;flex-wrap:wrap}
.badge-cell{text-align:center;width:92px}
.badge-img{width:64px;height:64px;object-fit:contain;border-radius:10px;display:block;margin:0 auto}
.badge-char{line-height:1;display:block}
.badge-inline .badge-img{width:18px;height:18px;border-radius:4px;display:inline-block;vertical-align:middle}
.badge-inline .badge-char{display:inline}

@media (max-width:820px){ .cert-grid{grid-template-columns:repeat(2,minmax(0,1fr))} }
@media (max-width:420px){ .badge-cell{width:78px} .badge-img{width:56px;height:56px} }

/* A tile that is a button, not a link — same shape, no default chrome. */
button.tile{font:inherit;text-align:left;cursor:pointer;width:100%}
.tile-off{opacity:.62;cursor:default}
.tile-off .v{color:var(--muted)}

/* Refer a friend. */
.refer-back{position:fixed;inset:0;background:rgba(30,22,8,.45);z-index:90;
  display:flex;align-items:center;justify-content:center;padding:18px}
.refer-back[hidden]{display:none}
.refer-box{background:var(--panel);border:1px solid var(--line);border-radius:var(--radius);
  width:100%;max-width:430px;box-shadow:0 14px 44px rgba(30,22,8,.22);max-height:90vh;overflow-y:auto}
.refer-box textarea{width:100%;resize:vertical}
