/* Mahjong Wallfall — Tileborne physics prototype
   Premium dark + champagne-gold + ivory. No external fonts (avoids first-paint block).
   The outer framed border now comes from the shared shell (.mj-stage). This file only
   styles the canvas play box, the HUD and the modal panels that sit on top of it. */

:root{
  --bg-0:#0a0b0f;
  --bg-1:#111319;
  --ink:#ECE7DA;
  --ink-dim:#9a958a;
  --gold:#C9A24B;
  --gold-soft:#E2C77E;
  --gold-deep:#8a6d2c;
  --ivory:#F3ECD8;
  --teal:#2E7D8A;
  --green:#3F8F4F;
  --red:#B23A2E;
  --glass:rgba(18,20,27,.62);
  --glass-line:rgba(201,162,75,.32);
  --serif:"Iowan Old Style","Palatino Linotype",Palatino,"Times New Roman",Georgia,serif;
  --sans:"Segoe UI",Roboto,Helvetica,Arial,system-ui,sans-serif;
}

*{box-sizing:border-box;-webkit-tap-highlight-color:transparent;}
html,body{margin:0;height:100%;background:var(--bg-0);color:var(--ink);
  font-family:var(--sans);overflow:hidden;}

/* The shell claims the viewport; the play box lives inside .mj-stage and is centred
   by .ms-wrap. .ms-wrap overrides the shell's default "max-width:760" child rule. */
.mj-stage > .ms-wrap{
  position:absolute; inset:0; max-width:none; width:auto; height:auto;
  display:flex; align-items:center; justify-content:center;
}
/* JS sizes the box to fill .ms-wrap exactly and derives the logical world from its
   aspect — the canvas is never stretched, and the frame has no letterbox gaps, on
   any phone or desktop window. */
.ms-canvas-box{
  position:relative; width:100%; height:100%;
  border-radius:14px; overflow:hidden; background:#0b0c10;
}
canvas{position:absolute;inset:0;width:100%;height:100%;display:block;touch-action:none;}

/* ---------- HUD ---------- */
/* Side padding clears the in-canvas wood rails, which are WALL world units thick and
   therefore a share of the box rather than a constant (18px on a phone, 33px on a
   portrait tablet). resizeStage publishes that thickness as --ms-rail so the overlay
   tracks it instead of guessing; the extra 8px is felt between rail and text. */
.hud{
  position:absolute;left:0;right:0;top:0;padding:12px calc(var(--ms-rail, 18px) + 8px) 10px;
  display:flex;align-items:flex-start;justify-content:space-between;gap:10px;
  pointer-events:none;z-index:5;
  background:linear-gradient(180deg, rgba(8,9,13,.72) 0%, rgba(8,9,13,0) 100%);
}
.hud .brand{
  font-family:var(--serif);letter-spacing:.34em;font-size:10px;color:var(--gold);
  text-transform:uppercase;opacity:.85;margin-bottom:6px;
}
.hud .stage-no{font-family:var(--serif);font-size:17px;color:var(--ink);line-height:1;}
.hud .stage-sub{font-size:10.5px;color:var(--ink-dim);letter-spacing:.12em;margin-top:3px;text-transform:uppercase;}

.hud .score-wrap{text-align:center;flex:1;}
.hud .score-label{font-size:9.5px;letter-spacing:.3em;color:var(--ink-dim);text-transform:uppercase;}
.hud .score{font-family:var(--serif);font-size:30px;color:var(--gold-soft);line-height:1.05;
  text-shadow:0 0 18px rgba(201,162,75,.35);transition:transform .12s ease;}
.hud .score.bump{transform:scale(1.12);}
.hud .score-clock{font-size:11px;color:var(--ink-dim);letter-spacing:.08em;margin-top:2px;
  font-variant-numeric:tabular-nums;}

.hud .marbles{display:flex;flex-direction:column;align-items:flex-end;gap:5px;}
.hud .marbles .lab{font-size:9.5px;letter-spacing:.26em;color:var(--ink-dim);text-transform:uppercase;}
.hud .marble-row{display:flex;gap:3px;flex-wrap:wrap;justify-content:flex-end;max-width:132px;}
.m-dot{width:11px;height:11px;border-radius:50%;
  background:radial-gradient(circle at 35% 30%, #fff 0%, #efe2bd 38%, #c9a24b 100%);
  box-shadow:inset 0 0 2px rgba(0,0,0,.4), 0 0 5px rgba(201,162,75,.5);}
.m-dot.spent{background:#2a2c33;box-shadow:none;opacity:.5;}

/* aim hint — above the bottom sill and above the marble sitting in the launcher,
   both of which scale with the box (resizeStage publishes the offsets). */
.aim-hint{
  position:absolute;left:0;right:0;bottom:var(--ms-hint, 26px);text-align:center;z-index:5;
  font-size:11px;letter-spacing:.18em;color:var(--ink-dim);text-transform:uppercase;
  pointer-events:none;transition:opacity .3s;opacity:.9;
}
.aim-hint b{color:var(--gold-soft);font-weight:600;}

/* ---------- Modal panels ---------- */
.panel{
  position:absolute;inset:0;z-index:10;display:flex;align-items:center;justify-content:center;
  background:radial-gradient(120% 120% at 50% 30%, rgba(10,11,15,.55), rgba(6,7,10,.86));
  backdrop-filter:blur(3px);opacity:0;pointer-events:none;transition:opacity .35s ease;
}
.panel.show{opacity:1;pointer-events:auto;}
.card{
  width:82%;max-width:360px;padding:26px 24px 22px;border-radius:16px;
  background:linear-gradient(180deg, rgba(26,28,36,.92), rgba(15,16,22,.96));
  border:1px solid var(--glass-line);
  box-shadow:0 24px 70px rgba(0,0,0,.6), inset 0 1px 0 rgba(255,255,255,.05);
  text-align:center;transform:translateY(8px) scale(.98);transition:transform .35s ease;
}
.panel.show .card{transform:none;}
.card .kicker{font-size:10px;letter-spacing:.34em;color:var(--gold);text-transform:uppercase;margin-bottom:8px;}
/* One h1 per page — the modal panels carry h2 for the same look. */
.card h1, .card h2{font-family:var(--serif);font-size:28px;margin:0 0 6px;color:var(--ivory);font-weight:600;letter-spacing:.01em;}
.card p{font-size:13px;line-height:1.55;color:var(--ink-dim);margin:6px 0 16px;}
.card .stat-row{display:flex;justify-content:center;gap:18px;margin:14px 0 18px;flex-wrap:wrap;}
.card .stat{min-width:64px;}
.card .stat.slim{min-width:52px;}
.card .stat .n{font-family:var(--serif);font-size:24px;color:var(--gold-soft);line-height:1;}
.card .stat .l{font-size:9.5px;letter-spacing:.2em;color:var(--ink-dim);text-transform:uppercase;margin-top:5px;}
.stars{display:flex;justify-content:center;gap:8px;margin:4px 0 18px;font-size:30px;color:#33363f;}
.stars .on{color:var(--gold);text-shadow:0 0 14px rgba(201,162,75,.6);}

.btn{
  display:inline-block;cursor:pointer;border:none;font-family:var(--sans);
  font-size:13px;letter-spacing:.14em;text-transform:uppercase;font-weight:600;
  padding:13px 26px;border-radius:11px;color:#1a1407;
  background:linear-gradient(180deg, var(--gold-soft), var(--gold) 60%, var(--gold-deep));
  box-shadow:0 8px 22px rgba(201,162,75,.32), inset 0 1px 0 rgba(255,255,255,.4);
  transition:transform .12s ease, box-shadow .12s ease, filter .12s ease;
}
.btn:hover{transform:translateY(-2px);box-shadow:0 12px 28px rgba(201,162,75,.42);}
.btn:active{transform:translateY(0);filter:brightness(.96);}
.btn.ghost{background:transparent;color:var(--gold-soft);border:1px solid var(--glass-line);
  box-shadow:none;margin-left:8px;}
.btn.ghost:hover{background:rgba(201,162,75,.08);}
.hint-line{margin-top:14px;font-size:10.5px;letter-spacing:.12em;color:var(--ink-dim);text-transform:uppercase;}

/* player count picker on the start card */
.pcount{display:flex;justify-content:center;gap:8px;margin:2px 0 14px;}
.pchip{cursor:pointer;font-family:var(--sans);font-size:12px;font-weight:600;letter-spacing:.08em;
  padding:8px 15px;border-radius:9px;border:1px solid var(--glass-line);background:transparent;
  color:var(--ink-dim);transition:all .15s ease;}
.pchip:hover{color:var(--gold-soft);border-color:var(--gold-deep);}
.pchip.on{color:#1a1407;background:linear-gradient(180deg,var(--gold-soft),var(--gold));
  border-color:transparent;box-shadow:0 4px 14px rgba(201,162,75,.3);}

/* whose-turn badge in the HUD (multiplayer only) */
.turn-badge{display:inline-flex;align-items:center;gap:6px;margin-top:7px;padding:3px 10px;
  border-radius:999px;border:1px solid var(--glass-line);background:rgba(10,11,15,.4);
  font-size:10px;letter-spacing:.14em;text-transform:uppercase;color:var(--ink);width:max-content;}
.turn-badge .pdot{width:8px;height:8px;border-radius:50%;flex:none;}

/* match standings */
.rank-list{display:flex;flex-direction:column;gap:8px;margin:6px 0 18px;}
.rank-row{display:flex;align-items:center;gap:10px;padding:9px 12px;border-radius:10px;
  background:rgba(255,255,255,.03);border:1px solid rgba(255,255,255,.05);}
.rank-row.lead{border-color:var(--glass-line);background:rgba(201,162,75,.08);}
.rank-row .pos{font-family:var(--serif);font-size:15px;color:var(--gold-soft);width:22px;text-align:left;}
.rank-row .pdot{width:9px;height:9px;border-radius:50%;flex:none;}
.rank-row .pname{flex:1;text-align:left;font-size:13px;color:var(--ink);}
.rank-row .pscore{font-family:var(--serif);font-size:18px;color:var(--gold-soft);}

/* combo banner (canvas-drawn mostly, but DOM used for big crit) */
.crit{
  position:absolute;left:50%;top:38%;transform:translate(-50%,-50%);z-index:6;
  font-family:var(--serif);font-size:40px;color:#fff;pointer-events:none;
  text-shadow:0 0 26px rgba(255,224,150,.9),0 0 8px rgba(201,162,75,.9);
  opacity:0;letter-spacing:.04em;
}
.crit.flash{animation:critPop .7s ease forwards;}
@keyframes critPop{
  0%{opacity:0;transform:translate(-50%,-50%) scale(.6);}
  22%{opacity:1;transform:translate(-50%,-50%) scale(1.12);}
  100%{opacity:0;transform:translate(-50%,-58%) scale(1);}
}

/* ---------- Help overlay ---------- */
/* Fixed full-viewport (not confined to the play box) so it reads as a real
   document. Card is min(92vw,560px) wide and up to 86vh tall — clears the
   games-gate rule of ≥85%×85% viewport, and Esc / the button closes it. */
.panel-help{
  position:fixed; inset:0; z-index:60; display:flex; align-items:center; justify-content:center;
  background:radial-gradient(120% 120% at 50% 30%, rgba(10,11,15,.80), rgba(6,7,10,.95));
  backdrop-filter:blur(4px); opacity:0; pointer-events:none; transition:opacity .3s ease;
  padding:20px;
}
.panel-help.show{opacity:1;pointer-events:auto;}
.panel-help .card{
  width:min(92vw, 560px); max-height:86vh; overflow:auto; text-align:left;
  padding:26px 26px 22px;
}
.panel-help h2{text-align:center;margin-bottom:14px;}
.panel-help h3{font-family:var(--serif);font-size:15px;color:var(--gold-soft);margin:16px 0 6px;letter-spacing:.02em;}
.panel-help p{font-size:13px;line-height:1.6;color:var(--ink-dim);margin:0 0 4px;}
.panel-help ul{margin:6px 0 4px;padding-left:18px;}
.panel-help li{font-size:13px;line-height:1.55;color:var(--ink-dim);margin:3px 0;}
.panel-help .help-foot{text-align:center;margin-top:18px;}
