/* MONASTERY web layer — shared tokens + mobile-first app frame.
 * Mobile is the primary target: the app frame uses 100svh (small viewport =
 * space left for browser controls) + safe-area insets. Desktop gets its own
 * centered composition. No dependencies. */
*{margin:0;padding:0;box-sizing:border-box;-webkit-tap-highlight-color:transparent}
:root{
  --void:#040201; --panel:rgba(16,6,3,.86); --line:rgba(255,81,43,.32);
  --ember:#ff512b; --flare:#ff8a3c; --gold:#ffc45e; --blood:#7a1206;
  --ink:#f7efe6; --mut:#d9b8a6; --dim:#a8806e;
  --sat:env(safe-area-inset-top,0px); --sab:env(safe-area-inset-bottom,0px);
  /* extra bottom clearance for browsers whose floating chrome OVERLAYS the page
   * without reporting it (Arc mobile, some in-app webviews) — set by codex.js,
   * 0 in Safari/Chrome so their layout is byte-identical */
  --chrome-clear:0px;
}
html{background:var(--void)}
body{background:var(--void);color:var(--ink);font-family:system-ui,-apple-system,'Segoe UI',sans-serif;
  overflow:hidden;overscroll-behavior:none;user-select:none;-webkit-user-select:none}
/* the app frame: fills the VISIBLE viewport, never fights browser chrome */
.app{position:fixed;inset:0;height:100svh;display:flex;flex-direction:column;
  padding:calc(var(--sat) + 10px) 14px calc(var(--sab) + 12px + var(--chrome-clear))}
.stage{position:relative;flex:1;min-height:0;border-radius:16px;overflow:hidden}
.stage>canvas{position:absolute;inset:0;width:100%;height:100%;touch-action:none}
/* header */
.top{display:flex;justify-content:space-between;align-items:baseline;padding:2px 2px 10px}
.top .cat{font-size:11px;letter-spacing:.28em;color:var(--flare);font-weight:700;text-transform:uppercase}
.top .no{font-size:11px;letter-spacing:.16em;color:var(--dim);font-weight:700}
.top .no b{color:var(--rim,var(--ember));margin-right:6px;font-weight:700}
h1.title{font-family:Georgia,'Times New Roman',serif;font-weight:900;font-size:clamp(24px,7vw,34px);
  line-height:1.08;text-shadow:0 0 22px rgba(255,81,43,.35)}
.flavor{font-size:14px;color:var(--mut);margin-top:4px;line-height:1.3}
.flavor b,.hl{color:var(--flare);font-weight:700}
/* caption bar — The Abbot speaks here (always on, reads clean on mute) */
.caption{position:absolute;left:10px;right:10px;bottom:10px;z-index:9;pointer-events:none;
  background:rgba(4,2,1,.72);border:1px solid var(--line);border-radius:12px;
  padding:10px 14px;font-size:15px;line-height:1.35;color:var(--ink);min-height:44px;
  backdrop-filter:blur(4px);opacity:0;transition:opacity .35s}
.caption.on{opacity:1}
.caption .who{display:block;font-size:9.5px;letter-spacing:.3em;color:var(--gold);
  font-weight:700;margin-bottom:3px}
/* footer bar: big touch targets, thumb-reachable */
.bar{display:flex;gap:10px;padding-top:12px}
.btn{flex:1;min-height:52px;border:1.4px solid var(--line);border-radius:14px;color:var(--ink);
  background:var(--panel);font-size:14px;font-weight:700;letter-spacing:.06em;cursor:pointer;
  display:flex;align-items:center;justify-content:center;gap:8px}
.btn:active{transform:scale(.97)}
.btn.primary{border-color:var(--rim,var(--ember));color:var(--rim,var(--gold));
  box-shadow:0 0 16px rgba(255,81,43,.22) inset}
.btn.ghost{flex:0 0 auto;padding:0 16px;color:var(--dim)}
/* HUD chips on the stage */
.hud{position:absolute;top:10px;left:10px;right:10px;z-index:4;display:flex;gap:8px;
  pointer-events:none;flex-wrap:wrap}
.chip{background:rgba(4,2,1,.7);border:1px solid var(--line);border-radius:10px;
  padding:6px 10px;font-size:11px;letter-spacing:.1em;color:var(--mut);font-weight:700}
.chip b{color:var(--ink);font-size:14px;margin-left:5px;font-variant-numeric:tabular-nums}
.chip.hot{border-color:var(--gold);color:var(--gold)}
.chip.hot b{color:var(--gold)}
/* trophy overlay */
.trophy{position:absolute;inset:0;z-index:20;display:none;flex-direction:column;align-items:center;
  justify-content:center;background:rgba(4,2,1,.9);padding:16px;text-align:center}
.trophy.on{display:flex}
.trophy img{max-width:min(72vw,300px);border-radius:14px;border:1.5px solid var(--rim,var(--ember));
  box-shadow:0 0 40px rgba(255,81,43,.35)}
.trophy .t{font-size:12px;letter-spacing:.3em;color:var(--gold);font-weight:700;margin:14px 0 4px}
.trophy .s{font-size:13px;color:var(--mut)}
.trophy .row{display:flex;gap:10px;margin-top:16px;width:100%;max-width:340px}
/* dial rail (shared by runway-dial cards) */
.rail{position:absolute;left:14px;right:14px;bottom:128px;z-index:6;height:56px;
  border-radius:28px;background:rgba(16,6,3,.8);border:1.4px solid var(--line);touch-action:none}
.rail .knob{position:absolute;top:4px;width:48px;height:48px;border-radius:50%;
  background:radial-gradient(circle at 35% 30%,var(--flare),var(--blood));
  border:2px solid var(--gold);box-shadow:0 0 18px rgba(255,138,60,.55)}
.rail .lab{position:absolute;top:-22px;left:14px;font-size:10px;letter-spacing:.24em;
  color:var(--dim);font-weight:700}
/* desktop: its own composition — ambient full-bleed, centered card column */
@media(min-width:900px){
  .app{max-width:520px;margin:0 auto;padding-top:28px}
  h1.title{font-size:40px}
}

/* ambient ember loop — decorative, behind the particle canvas */
/* Layering contract: the CODE-DRAWN layer always wins. The particle canvas
 * paints an opaque black background every frame, so it sits ON TOP with screen
 * blending — its black turns transparent, its embers/dials/games add light —
 * and the ambient video lives UNDERNEATH at full strength. The video can never
 * cover an interactive visual. Fade-in avoids a pop when playback starts. */
.stage video.ambient{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;
  z-index:1;pointer-events:none;opacity:0;transition:opacity .9s ease}
.stage video.ambient.on{opacity:1}
.stage canvas{position:relative;z-index:2;mix-blend-mode:screen}

/* The Abbot's voice toggle — VO is optional; captions always carry the card */
.vo-toggle{position:fixed;right:14px;bottom:calc(84px + var(--chrome-clear));z-index:40;width:44px;height:44px;
  border-radius:50%;background:rgba(16,6,3,.85);border:1.4px solid var(--line);
  color:var(--flare);display:flex;align-items:center;justify-content:center;
  cursor:pointer;-webkit-tap-highlight-color:transparent}
.vo-toggle svg{width:22px;height:22px}
.vo-toggle .vo-x{display:none}
.vo-toggle.muted{color:var(--dim)}
.vo-toggle.muted .vo-wave{display:none}
.vo-toggle.muted .vo-x{display:block}

/* layer 0: the printed card art, present from the first paint on every card */
.stage img.hero{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;z-index:0}
