/* ============================================================
 * dashboard-target.css
 * Source: CityScape Dashboard - Standalone (2).html (Claude Design bundle)
 * Extracted verbatim from the bundled <style> block. This stylesheet
 * supersedes dashboard-v7.css and dashboard-v8.css and is the single
 * source of truth for the in-game dashboard visual layer.
 * ============================================================ */

/* ─── TOKENS ──────────────────────────────────────────────────────────────── */
:root {
  --blue:      #0071BC;
  --hull:      #0D1C2C;
  --paper:     #FFFFFF;
  --parch:     #FFFFFF;  /* T-white-bg: was #F5F0E8 beige — page + panels now white */
  --bid:       #3FB6FF;
  --graphite:  #2A2F36;
  --seawall:   #4A6B5C;
  --rule:      #C9D4DF;
  --biz:       #A8362D;
  --cul:       #6B4E8A;
  --park:      #3B6A47;
  --lmk:       #1A3050;
  /* Player roster */
  --ph: #0071BC;   /* Haruki = You */
  --pt: #B05B7A;   /* Trevor */
  --pb: #4A6B5C;   /* Bill */
  --pm: #C68A4E;   /* Mei */
  /* Animation timing tokens */
  --anim-fly-short:    350ms;
  --anim-fly:          450ms;
  --anim-fly-emphatic: 600ms;
  --anim-flip:         280ms;
  --anim-settle:       150ms;
  --anim-zoom-open:    280ms;
  --anim-zoom-close:   220ms;
  --anim-hover:        150ms;
  --anim-hover-return: 180ms;
  --anim-flash:        400ms;
  --anim-stagger:      120ms;
  --anim-event-hold:   1200ms;
  --anim-pulse-slow:   2000ms;
}
*,*::before,*::after { box-sizing: border-box; margin: 0; padding: 0; }
html, body {
  width: 100%; height: 100%; overflow: hidden;
  background: var(--parch);
  font-family: 'Barlow', sans-serif;
  color: var(--graphite);
  -webkit-font-smoothing: antialiased;
}

/* ─── SHELL ───────────────────────────────────────────────────────────────── */
.app { width: 100%; height: 100%; min-width: 1340px; display: flex; flex-direction: column; overflow: hidden; }
.body { flex: 1; min-height: 0; display: grid; grid-template-columns: 240px 1fr 272px; overflow: hidden; }
.center { overflow-y: auto; overflow-x: hidden; display: flex; flex-direction: column; scrollbar-width: thin; scrollbar-color: var(--rule) transparent; }

/* ─── TOPBAR ──────────────────────────────────────────────────────────────── */
.topbar {
  height: 56px; flex-shrink: 0;
  background: var(--hull); color: var(--paper);
  display: grid;
  grid-template-columns: 239px 1px 1fr 1px minmax(272px, auto);
  align-items: stretch;
  overflow: visible;
}
.tb-div { background: rgba(201,212,223,0.16); }
.tb-group { padding: 0 20px; display: flex; align-items: center; gap: 12px; overflow: visible; }
/* Logo */
.tb-mark .name {
  font-family: 'Barlow Condensed', sans-serif; font-weight: 600;
  font-size: 18px; letter-spacing: 0.14em; line-height: 1;
}
.tb-mark .city {
  font-family: 'Barlow Condensed', sans-serif;
  font-size: 10px; letter-spacing: 0.32em; opacity: 0.55; margin-top: 2px;
}
/* Stats */
.tb-stat { display: flex; flex-direction: column; gap: 2px; }
.tb-stat .lbl {
  font-family: 'Barlow Condensed', sans-serif;
  font-size: 9px; letter-spacing: 0.22em; text-transform: uppercase; opacity: 0.5;
}
.tb-stat .val {
  font-family: 'Barlow', sans-serif; font-weight: 500;
  font-variant-numeric: tabular-nums; font-size: 17px; line-height: 1;
}
/* Phase route-bar */
.phase {
  display: grid; grid-template-columns: 1fr 1fr;
  border: 1px solid rgba(255,255,255,0.16);
  width: 100%;
}
.phase-seg {
  padding: 9px 16px; text-align: center;
  font-family: 'Barlow Condensed', sans-serif;
  font-size: 12px; letter-spacing: 0.22em; text-transform: uppercase;
  color: rgba(255,255,255,0.38);
}
.phase-seg.active {
  background: rgba(63,182,255,0.14); color: var(--bid);
  border-top: 2px solid var(--bid); margin-top: -1px;
}
.phase-seg + .phase-seg { border-left: 1px solid rgba(255,255,255,0.16); }
/* Roster */
.roster { display: flex; gap: 10px; }
.roster-tile { display: flex; flex-direction: column; align-items: center; gap: 5px; }
.r-dot {
  width: 20px; height: 20px; border-radius: 50%;
  display: flex; align-items: center; justify-content: center;
  color: #fff; font-family: 'Barlow Condensed', sans-serif;
  font-weight: 600; font-size: 10px;
}
.r-bar { width: 20px; height: 2px; background: rgba(255,255,255,0.16); border-radius: 1px; }
.roster-tile.locked .r-bar { background: var(--bid); }
.roster-tile.you .r-dot { box-shadow: 0 0 0 2px var(--bid); }
/* Ledger */
.ledger {
  font-family: 'Barlow Condensed', sans-serif;
  font-size: 9px; letter-spacing: 0.22em; text-transform: uppercase;
  opacity: 0.6; line-height: 1.4; text-align: right;
}
.ledger .v {
  display: block; font-family: 'Barlow', sans-serif;
  font-variant-numeric: tabular-nums; font-size: 14px; opacity: 1;
}
/* Buttons */
.tb-btn {
  background: transparent; color: var(--paper);
  border: 1px solid rgba(255,255,255,0.28);
  padding: 7px 14px;
  font-family: 'Barlow Condensed', sans-serif;
  font-size: 11px; letter-spacing: 0.22em; text-transform: uppercase;
  cursor: pointer; white-space: nowrap;
}
.tb-btn.primary { border-color: var(--bid); color: var(--bid); }
.tb-gear {
  background: none; border: none; cursor: pointer;
  color: rgba(255,255,255,0.45); font-size: 16px; padding: 0 6px;
}

/* ─── SIDEBAR ─────────────────────────────────────────────────────────────── */
.sidebar {
  background: var(--hull); color: var(--paper);
  border-left: 2px solid var(--bid);
  display: flex; flex-direction: column;
  height: 100%; overflow: hidden;
}
.sb-sec { padding: 13px 16px; }
/* Soft hairline between sections (was a harsh 3px solid blue bar) — matches the
   subtle rgba dividers of the mobile HUD. */
.sb-sec + .sb-sec { border-top: 1px solid rgba(120,160,200,0.12); }
.sb-cap {
  font-family: 'Barlow Condensed', sans-serif;
  font-size: 9px; letter-spacing: 0.22em; text-transform: uppercase;
  opacity: 0.5; margin-bottom: 8px;
}
/* Identity */
.sb-id { display: flex; align-items: center; gap: 10px; }
.sb-dot {
  width: 30px; height: 30px; border-radius: 50%;
  display: flex; align-items: center; justify-content: center;
  color: #fff; font-family: 'Barlow Condensed', sans-serif;
  font-weight: 600; font-size: 14px; flex-shrink: 0;
}
.sb-name {
  font-family: 'Barlow Condensed', sans-serif; font-weight: 600;
  font-size: 20px; letter-spacing: 0.12em; text-transform: uppercase; line-height: 1;
}
.sb-sub {
  font-family: 'Barlow Condensed', sans-serif;
  font-size: 10px; letter-spacing: 0.22em; opacity: 0.55; margin-top: 2px;
}
.sb-rule { height: 1px; background: rgba(120,160,200,0.18); margin-top: 11px; }
/* LCD readout — rounded tile with a soft edge (was a light-grey hairline that
   read harsh on the navy), matching the mobile VP/cash tiles. */
.lcd {
  background: var(--blue); border: 1px solid rgba(255,255,255,0.16);
  border-radius: 10px;
  padding: 6px 13px; display: flex; align-items: baseline;
  justify-content: center; gap: 6px; color: #fff;
}
.lcd .num {
  font-family: 'Barlow', sans-serif; font-weight: 600;
  font-variant-numeric: tabular-nums; font-size: 22px; line-height: 1;
}
.lcd .denom {
  font-family: 'Barlow Condensed', sans-serif;
  font-size: 12px; letter-spacing: 0.18em; opacity: 0.6;
}
.sb-prog { height: 3px; background: rgba(201,212,223,0.24); margin-top: 6px; }
.sb-prog-f { height: 100%; background: var(--bid); }
/* Portfolio */
.port-row {
  display: grid; grid-template-columns: 12px 36px 1fr auto;
  gap: 8px; align-items: center; padding: 4px 0;
  font-family: 'Barlow Condensed', sans-serif;
  font-size: 12px; letter-spacing: 0.14em; text-transform: uppercase;
}
.port-row + .port-row { border-top: 1px solid rgba(255,255,255,0.07); }
.port-rnd { width: 10px; height: 10px; border-radius: 50%; border: 2px solid #fff; }
.port-rule { height: 1px; background: rgba(255,255,255,0.15); }
.port-ct {
  font-family: 'Barlow', sans-serif; font-variant-numeric: tabular-nums;
  font-size: 13px; font-weight: 500;
}
/* Agenda */
.agenda-tile {
  background: var(--parch); color: var(--graphite);
  border: 1px solid var(--rule); padding: 10px 11px;
}
.agenda-tile .ag-name {
  font-family: 'Barlow Condensed', sans-serif; font-weight: 600;
  font-size: 13px; letter-spacing: 0.10em; text-transform: uppercase;
}
.agenda-tile .ag-cond {
  font-size: 11px; line-height: 1.45; margin-top: 4px; opacity: 0.8;
}
/* Hand */
.sb-hand { flex: 1; overflow: hidden; display: flex; flex-direction: column; }
.hand-lbl { display: flex; justify-content: space-between; align-items: baseline; margin-bottom: 6px; }
.hand-ct {
  font-family: 'Barlow', sans-serif; font-variant-numeric: tabular-nums;
  font-size: 13px; color: var(--bid);
}
/* Hand scrolls when cards exceed the column height. min-height: 0 lets
 * the flex item shrink properly inside .sb-hand. With the sidebar
 * top-section padding tightened (override at the bottom of this file)
 * the hand area gets enough room to show 3-4 cards before scroll. */
.hand {
  display: flex; flex-direction: column; align-items: center;
  flex: 1; min-height: 0;
  overflow-y: auto; overflow-x: hidden;
  /* iOS touch scrolling: momentum + keep the drag inside the hand (no page
   * bounce), and pan-y so a vertical drag scrolls instead of being eaten by the
   * card tap targets. Needed for iPad landscape where the hand overflows. */
  -webkit-overflow-scrolling: touch;
  overscroll-behavior: contain;
  touch-action: pan-y;
  padding-bottom: 12px; padding-top: 6px;
  scrollbar-width: thin;
  scrollbar-color: var(--rule) transparent;
}
.hc {
  width: 56%; aspect-ratio: 3/4;
  /* Real-card rounded corners + subtle drop shadow so the hand looks
   * like a stack of physical cards, not abstract panels. */
  border-radius: 10px;
  border: 1px solid rgba(255,255,255,0.08);
  box-shadow:
    0 1px 2px rgba(0,0,0,0.25),
    0 4px 10px rgba(0,0,0,0.35);
  flex-shrink: 0;
}
.hc + .hc { margin-top: -40%; }

/* Hand-card label — sits at the TOP of each card so it stays visible
 * when cards stack with -60% overlap (the top ~40% strip is what peeks
 * out of every card except the bottom-most). Soft dark gradient backs
 * the text so any card-art beneath stays readable. */
.hc {
  position: relative;
}
.hc-label {
  position: absolute; bottom: 0; left: 0; right: 0;
  padding: 14px 8px 6px;
  display: flex; align-items: flex-end; justify-content: space-between; gap: 6px;
  background: linear-gradient(to top, rgba(0,0,0,0.78) 0%, rgba(0,0,0,0.42) 70%, rgba(0,0,0,0) 100%);
  border-bottom-left-radius: 10px; border-bottom-right-radius: 10px;
  pointer-events: none;
}
.hc-name {
  color: #fff;
  font-family: 'Barlow Condensed', sans-serif;
  font-weight: 600; font-size: 11px;
  letter-spacing: 0.08em; text-transform: uppercase;
  line-height: 1.15;
  text-shadow: 0 1px 2px rgba(0,0,0,0.7);
  overflow: hidden; text-overflow: ellipsis;
  flex: 1; min-width: 0;
}
.hc-type {
  color: var(--bid);
  font-family: 'Barlow Condensed', sans-serif;
  font-weight: 600; font-size: 9px;
  letter-spacing: 0.18em; text-transform: uppercase;
  flex-shrink: 0;
  text-shadow: 0 1px 2px rgba(0,0,0,0.7);
}
.hc-biz { background: linear-gradient(160deg,#d8a99c,#6a2a25); transform: rotate(-1.1deg); }
.hc-cul { background: linear-gradient(160deg,#c9b8d6,#3d2b55); transform: rotate(0.6deg); }
.hc-park { background: linear-gradient(160deg,#c4d4b8,#2e4a35); transform: rotate(-0.4deg); }
.hc-lmk { background: linear-gradient(160deg,#aebcc9,#14202e); transform: rotate(1deg); }
.hc-ev  { background: linear-gradient(160deg,#c8cdd8,#28303e); transform: rotate(-0.7deg); }

/* ─── MARKET ──────────────────────────────────────────────────────────────── */
.market {
  background: var(--parch); border-bottom: 1px solid var(--rule);
  padding: 16px 16px 12px; flex-shrink: 0;
}
.mkt-head {
  display: flex; justify-content: space-between; align-items: baseline;
  border-bottom: 1px solid var(--graphite);
  padding-bottom: 11px; margin-bottom: 13px;
}
.mkt-title {
  font-family: 'Barlow Condensed', sans-serif; font-weight: 600;
  font-size: 15px; letter-spacing: 0.18em; text-transform: uppercase;
}
.marg {
  font-family: 'Barlow Condensed', sans-serif; font-size: 10px;
  letter-spacing: 0.22em; text-transform: uppercase; opacity: 0.5;
}
/* minmax(0,1fr): plain 1fr = minmax(auto,1fr) refuses to shrink below the focused
   column's min-content (its bid field), so on iPad/laptop widths the 5 columns
   summed wider than the panel and the lots spilled out / lot 05 got cut off.
   minmax(0,...) lets every column shrink to an equal share that always fits. */
.lots { display: grid; grid-template-columns: repeat(5, minmax(0,1fr)); }
.lot { padding: 0 13px; position: relative; }
.lot + .lot { border-left: 1px solid var(--rule); }
.lot + .lot::before, .lot + .lot::after {
  content: ''; position: absolute; left: -3px; width: 5px; height: 5px; background: var(--graphite);
}
.lot + .lot::before { top: 0; }
.lot + .lot::after { bottom: 0; }
.lot-num {
  font-family: 'Barlow Condensed', sans-serif; font-weight: 600;
  font-size: 10px; letter-spacing: 0.22em; text-transform: uppercase;
  opacity: 0.6; margin-bottom: 6px;
}
.lot.focused .lot-num { color: var(--blue); opacity: 1; }
/* Card art */
.lot-art {
  width: 56%; aspect-ratio: 3/4; position: relative;
  border: 1px solid var(--rule); overflow: hidden;
  margin: 0 auto;
}
.lot-art.biz  { background: linear-gradient(165deg,#d8a99c 0%,#b06658 45%,#6a2a25 100%); }
.lot-art.cul  { background: linear-gradient(165deg,#c9b8d6 0%,#7e6195 45%,#3d2b55 100%); }
.lot-art.park { background: linear-gradient(165deg,#c4d4b8 0%,#6b8a64 45%,#2e4a35 100%); }
.lot-art.lmk  { background: linear-gradient(165deg,#aebcc9 0%,#4a5d72 45%,#14202e 100%); }
/* Triple-layer overlay so the card photo, gradient legibility wash, and
 * text are all visible:
 *   <img>   z-index 0 (default)        — the photo
 *   ::after z-index 1                  — top-and-bottom darken gradient
 *   .lot-ov z-index 2                  — name (top) + type/reserve (bottom)
 *
 * The gradient spans the whole card with darker bands at top and bottom
 * so labels at either end stay readable against any photo. */
.lot-art::after {
  content: ''; position: absolute; inset: 0; z-index: 1; pointer-events: none;
  background: linear-gradient(
    to bottom,
    rgba(0,0,0,0.65) 0%,
    rgba(0,0,0,0.18) 22%,
    rgba(0,0,0,0.00) 45%,
    rgba(0,0,0,0.18) 60%,
    rgba(0,0,0,0.78) 92%,
    rgba(0,0,0,0.90) 100%
  );
}
.lot-ov {
  position: absolute; inset: 0;                  /* full card, distributed */
  padding: 8px 10px;
  color: #fff; z-index: 2;
  display: flex; flex-direction: column;
  justify-content: space-between;                /* name top, type/reserve bottom */
  pointer-events: none;
}
.lot-ov .ln {
  font-family: 'Barlow Condensed', sans-serif; font-weight: 600;
  font-size: 13px; letter-spacing: 0.06em; text-transform: uppercase; line-height: 1.1;
  text-shadow: 0 1px 2px rgba(0,0,0,0.7);
}
.lot-ov .lt {
  font-family: 'Barlow Condensed', sans-serif; font-size: 9px;
  letter-spacing: 0.18em; text-transform: uppercase;
  display: flex; align-items: center; gap: 5px; opacity: 0.95;
  text-shadow: 0 1px 2px rgba(0,0,0,0.7);
}
.lt-dot { width: 6px; height: 6px; border-radius: 50%; }
.lt-dot.biz  { background: var(--biz); }
.lt-dot.cul  { background: var(--cul); }
.lt-dot.park { background: var(--park); }
.lt-dot.lmk  { background: var(--lmk); }
/* Bid field */
.bid-field {
  background: var(--blue); border: 1px solid var(--rule);
  padding: 8px 10px; margin-top: 7px;
  display: flex; align-items: baseline; justify-content: space-between; gap: 10px; color: #fff;
}
.bid-field .cap {
  font-family: 'Barlow Condensed', sans-serif;
  font-size: 9px; letter-spacing: 0.22em; opacity: 0.65;
}
.bid-field .fig {
  font-family: 'Barlow', sans-serif; font-weight: 600;
  font-variant-numeric: tabular-nums; font-size: 18px; line-height: 1;
}
.lot.focused .bid-field { border-top: 2px solid var(--bid); margin-top: 6px; }
.lot.focused .bid-field .fig { color: var(--bid); }
.lot.burned .lot-art { filter: grayscale(0.55); }
.bid-field.burned { background: var(--parch); color: var(--graphite); border-color: var(--graphite); }

/* ── Auction lot emphasis rebalance (design pass 2026-07-04) ──
   The focused lot's column auto-grows (its bid field has a wide min-width),
   so its 56%-of-column card ballooned to ~2.2x the queued cards. Rebalance
   the card-art widths to soften that to ~1.4x — smaller focused card, bigger
   queued cards — then carry the focus with VISUAL weight instead of size:
   a bid-blue accent ring + glow, a filled label chip, and a soft stage wash.
   Keys off .lot.focused so it tracks whichever lot is up for bid. */
/* Columns are now equal width (minmax(0,1fr)), so the focused card must be a
   BIGGER share of its column than the queued cards to stay emphasized (plus the
   bid-blue ring/glow below). Both capped so they never balloon on wide screens. */
.lot .lot-art         { width: 70%; max-width: 150px; }  /* queued cards */
.lot.focused .lot-art { width: 92%; max-width: 200px; }  /* focused card bigger */
.lot.focused .lot-art {
  border: 2px solid var(--bid);
  box-shadow:
    0 0 0 4px rgba(63,182,255,0.16),
    0 6px 18px rgba(8,16,30,0.28),
    0 0 0 1px rgba(0,0,0,0.05);
}
.lot.focused .lot-num {
  display: inline-block;
  background: var(--bid);
  color: #05283b;
  padding: 2px 9px;
  border-radius: 4px;
  opacity: 1;
}
.lot.focused .lot-num span { color: #05283b !important; }
.lot.focused {
  background: linear-gradient(180deg, rgba(63,182,255,0.07), rgba(63,182,255,0.02));
  border-radius: 8px;
}
/* Opp rows */
.opp-rows { margin-top: 7px; padding-top: 7px; border-top: 1px dashed var(--rule); display: flex; flex-direction: column; gap: 4px; }
.opp-row {
  display: grid; grid-template-columns: 15px 1fr auto;
  align-items: center; gap: 6px;
  font-family: 'Barlow Condensed', sans-serif;
  font-size: 9px; letter-spacing: 0.18em; text-transform: uppercase;
}
.opp-init {
  width: 14px; height: 14px; border-radius: 50%;
  display: flex; align-items: center; justify-content: center;
  color: #fff; font-size: 8px; font-weight: 600;
}
.opp-state { display: flex; align-items: center; gap: 4px; }
.opp-pip { width: 7px; height: 7px; border-radius: 50%; flex-shrink: 0; }
.opp-pip.locked { background: var(--bid); }
.opp-pip.pending { border: 1px solid var(--rule); }

/* ─── BOARD ───────────────────────────────────────────────────────────────── */
.bwrap { padding: 14px 14px 24px; }
.board { background: var(--parch); border: 1px solid rgba(42,47,54,0.3); }
/* Signpost headers */
.bsigns { display: grid; grid-template-columns: 196px repeat(4,1fr); border-bottom: 2px solid var(--graphite); }
.bsigns-sp { padding: 10px 12px 8px; display: flex; align-items: flex-end; }
.bsigns-sp span { font-family: 'Barlow Condensed', sans-serif; font-size: 9px; font-weight: 600; letter-spacing: 0.22em; opacity: 0.7; text-transform: uppercase; }
/* Signpost */
.signpost { padding: 7px 10px 0; border-left: 1px solid var(--rule); }
.sp-blade {
  background: #0A0A0A; color: #fff;
  border: 1px solid #fff; outline: 1px solid #0A0A0A;
  padding: 7px 11px; display: grid; grid-template-columns: 1fr auto;
  align-items: center; position: relative;
}
.sp-blade::before { content: ''; position: absolute; top: 1px; left: 8px; right: 8px; height: 1px; background: rgba(255,255,255,0.2); }
.sp-blade .sp-name { font-family: 'Barlow Condensed', sans-serif; font-weight: 600; font-size: 15px; letter-spacing: 0.14em; text-transform: uppercase; }
.sp-blade .sp-data { text-align: right; font-family: 'Barlow Condensed', sans-serif; border-left: 1px solid rgba(255,255,255,0.28); padding-left: 9px; line-height: 1.2; }
.sp-data .sp-code { font-size: 11px; letter-spacing: 0.18em; font-weight: 600; display: block; }
.sp-data .sp-sep { display: block; height: 1px; background: rgba(255,255,255,0.38); margin: 3px 0; }
.sp-data .sp-area { font-size: 11px; font-weight: 500; font-variant-numeric: tabular-nums; display: block; }
/* (Removed .pip-mnt/.sp-pip/.sp-cross/.quota/.q-* — the neighbourhood-header
   quota legend was deleted as redundant; the per-cell counts carry that info.) */
/* Player rows */
.brow { display: grid; grid-template-columns: 196px repeat(4,1fr); border-top: 1px solid var(--rule); min-height: 128px; }
.brow.act { border-left: 2px solid var(--bid); }
/* Meta cell */
.meta-c { border-right: 1px solid var(--rule); padding: 11px 12px; display: flex; flex-direction: column; }
.mc-id { display: flex; align-items: center; gap: 8px; margin-bottom: 6px; }
.mc-dot {
  width: 20px; height: 20px; border-radius: 50%; color: #fff; flex-shrink: 0;
  display: flex; align-items: center; justify-content: center;
  font-family: 'Barlow Condensed', sans-serif; font-weight: 600; font-size: 10px;
}
.mc-name { font-family: 'Barlow Condensed', sans-serif; font-weight: 600; font-size: 15px; letter-spacing: 0.10em; text-transform: uppercase; flex: 1; min-width: 0; }
.mc-vp { font-family: 'Barlow Condensed', sans-serif; font-size: 10px; font-weight: 600; letter-spacing: 0.18em; text-transform: uppercase; opacity: 0.85; white-space: nowrap; }
.mc-vp b { font-family: 'Barlow', sans-serif; font-variant-numeric: tabular-nums; font-size: 13px; font-weight: 700; opacity: 1; margin-left: 2px; }
.mc-rule { height: 1px; background: var(--rule); margin-bottom: 6px; }
.mc-prog { height: 3px; background: var(--rule); position: relative; margin-bottom: 7px; }
.mc-prog i { display: block; height: 100%; }
/* T-clarity: each player's committed Developer's Agenda (public info) */
.mc-agenda {
  font-family: 'Barlow Condensed', sans-serif;
  font-size: 10px;
  font-weight: 600;
  letter-spacing: 0.12em;
  text-transform: uppercase;
  color: #C8A24D;
  margin: 0 0 5px;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}
.mc-agenda-undecided { color: inherit; opacity: 0.45; }
.mc-trip { display: flex; justify-content: space-between; font-family: 'Barlow Condensed', sans-serif; font-size: 10px; font-weight: 600; letter-spacing: 0.16em; text-transform: uppercase; opacity: 0.9; }
.mc-trip b { font-family: 'Barlow', sans-serif; font-variant-numeric: tabular-nums; font-size: 12px; font-weight: 600; opacity: 1; }
.mc-port { display: flex; gap: 6px; margin-top: 7px; flex-wrap: wrap; }
.mc-pg { display: flex; align-items: center; gap: 3px; font-family: 'Barlow Condensed', sans-serif; font-size: 9px; letter-spacing: 0.12em; text-transform: uppercase; }
.mc-pd { width: 5px; height: 5px; border-radius: 50%; }
.mc-pd.biz  { background: var(--biz); }
.mc-pd.cul  { background: var(--cul); }
.mc-pd.park { background: var(--park); }
.mc-pd.lmk  { background: var(--lmk); }
.mc-pd.emp  { border: 1px solid var(--rule); }
.mc-badge {
  display: inline-block; margin-top: auto; padding-top: 6px;
  font-family: 'Barlow Condensed', sans-serif; font-size: 9px; font-weight: 700; letter-spacing: 0.22em; text-transform: uppercase;
}
.mc-badge.you { color: var(--bid); }
.mc-badge.threat { color: var(--biz); }

/* Player status badges — mini card thumbnails for active event effects */
.mc-event-badges { display: flex; gap: 4px; align-items: flex-start; margin-left: 4px; }
.mc-event-badge {
  display: flex; flex-direction: column; align-items: center; gap: 2px;
  cursor: default;
}
.mc-event-badge-img {
  width: 18px; height: 26px;
  object-fit: cover; object-position: center top;
  border: 1px solid rgba(192, 57, 43, 0.45);
  border-radius: 2px; display: block;
}
.mc-event-badge-placeholder {
  width: 18px; height: 26px;
  background: rgba(192, 57, 43, 0.1);
  border: 1px solid rgba(192, 57, 43, 0.35);
  border-radius: 2px;
}
.mc-event-badge-label {
  font-family: 'Barlow Condensed', sans-serif;
  font-size: 6px; font-weight: 700; letter-spacing: 0.12em;
  text-transform: uppercase; color: #C0392B;
  text-align: center; line-height: 1;
  max-width: 26px; overflow: hidden;
  text-overflow: ellipsis; white-space: nowrap;
}

/* Neighbourhood cell */
.nhc { border-right: 1px solid var(--rule); display: flex; flex-direction: column; }
.nhc:last-child { border-right: none; }
.nhc.nhc-developed {
  border-color: color-mix(in srgb, var(--c-brand, #1B6FC8) 40%, transparent);
  box-shadow: 0 0 0 1px color-mix(in srgb, var(--c-brand, #1B6FC8) 20%, transparent),
              inset 0 0 12px color-mix(in srgb, var(--c-brand, #1B6FC8) 6%, transparent);
  background: color-mix(in srgb, var(--c-brand, #1B6FC8) 4%, var(--panel, #fff));
}
.cell {
  margin: 7px 7px 3px; flex: 1;
  background: var(--parch); border: 1px solid rgba(42,47,54,0.28);
  position: relative; overflow: hidden; min-height: 54px;
}
.cell.active { border-top: 2px solid var(--bid); }
.cc { position: absolute; inset: 0; display: flex; align-items: center; justify-content: center; padding: 4px; }
.cc-card {
  width: 24%; aspect-ratio: 3/4;
  border: 1px solid var(--rule); border-radius: 2px;
  margin: 0 -3%; box-shadow: 0 1px 3px rgba(0,0,0,0.12); flex-shrink: 0;
}
.cc-card.biz  { background: linear-gradient(165deg,#d8a99c,#6a2a25); transform: rotate(-4deg) translateY(2px); }
.cc-card.cul  { background: linear-gradient(165deg,#c9b8d6,#3d2b55); transform: rotate(-1deg); }
.cc-card.park { background: linear-gradient(165deg,#c4d4b8,#2e4a35); transform: rotate(1deg); }
.cc-card.lmk  { background: linear-gradient(165deg,#aebcc9,#14202e); transform: rotate(4deg) translateY(2px); }
/* Tally */
.tally { padding: 0 7px 5px; display: flex; gap: 6px; flex-shrink: 0; }
.ti { display: flex; align-items: center; gap: 2px; font-family: 'Barlow Condensed', sans-serif; font-size: 9px; letter-spacing: 0.10em; text-transform: uppercase; }
.ti-n { font-weight: 600; font-variant-numeric: tabular-nums; }
.ti-n.biz  { color: var(--biz); }
.ti-n.cul  { color: var(--cul); }
.ti-n.park { color: var(--park); }
.ti-n.lmk  { color: var(--lmk); }
.ti-n.dim  { opacity: 0.28; color: var(--graphite); }
.ti-d { opacity: 0.45; }
/* Done cell */
.done-c {
  margin: 7px 7px 3px; flex: 1; padding: 8px 9px;
  background: rgba(63,182,255,0.06); border: 1px solid rgba(63,182,255,0.22);
  display: flex; flex-direction: column; gap: 3px;
}
.done-badge {
  font-family: 'Barlow Condensed', sans-serif; font-size: 8px;
  letter-spacing: 0.22em; text-transform: uppercase; color: var(--bid); margin-bottom: 3px;
}
.done-row { display: flex; align-items: center; gap: 5px; font-family: 'Barlow Condensed', sans-serif; font-size: 9px; letter-spacing: 0.12em; text-transform: uppercase; }
.done-dot { width: 6px; height: 6px; border-radius: 50%; flex-shrink: 0; }
.nhc-done-cell { display: flex; align-items: center; justify-content: center; }
.nhc-done-cell .done-badge { margin-bottom: 0; }

/* ─── LOG ─────────────────────────────────────────────────────────────────── */
.log { background: var(--parch); border-left: 1px solid var(--rule); display: flex; flex-direction: column; height: 100%; overflow: hidden; }
.log-hd { padding: 13px 14px 11px; border-bottom: 3px solid var(--blue); flex-shrink: 0; }
.log-hd h4 { font-family: 'Barlow Condensed', sans-serif; font-weight: 600; font-size: 14px; letter-spacing: 0.18em; text-transform: uppercase; margin-bottom: 2px; }
.log-hd .sub { font-family: 'Barlow Condensed', sans-serif; font-size: 10px; letter-spacing: 0.22em; opacity: 0.55; text-transform: uppercase; }
.log-body { flex: 1; overflow-y: auto; min-height: 0; scrollbar-width: thin; scrollbar-color: var(--rule) transparent; }
.log-row {
  display: grid; grid-template-columns: 6px 17px 1fr auto;
  align-items: center; gap: 6px; padding: 7px 10px;
  border-bottom: 1px dashed var(--rule);
}
.lr-rule { width: 6px; border-radius: 2px; align-self: stretch; min-height: 14px; }
.lr-stamp { font-family: 'Barlow Condensed', sans-serif; font-size: 9px; letter-spacing: 0.18em; opacity: 0.5; text-transform: uppercase; }
.lr-actor {
  width: 16px; height: 16px; border-radius: 50%; color: #fff;
  font-family: 'Barlow Condensed', sans-serif; font-weight: 600; font-size: 9px;
  display: flex; align-items: center; justify-content: center; flex-shrink: 0;
}
.lr-body { font-family: 'Barlow Condensed', sans-serif; font-size: 11px; letter-spacing: 0.10em; text-transform: uppercase; line-height: 1.3; }
.lr-body b { font-weight: 600; }
.lr-body span { opacity: 0.65; }
.lr-val { font-family: 'Barlow', sans-serif; font-variant-numeric: tabular-nums; font-size: 11px; font-weight: 500; white-space: nowrap; }
/* Rule colors — scoped to .lr-rule so they never bleed onto the parent .log-row */
.lr-rule.rc-auction { background: var(--blue); }
.lr-rule.rc-biz     { background: var(--biz); }
.lr-rule.rc-cul     { background: var(--cul); }
.lr-rule.rc-park    { background: var(--park); }
.lr-rule.rc-lmk     { background: var(--lmk); }
.lr-rule.rc-develop { background: var(--bid); }
.lr-rule.rc-burn    { background: var(--graphite); }
.lr-rule.rc-agenda  { background: var(--seawall); }
.lr-rule.rc-system  { background: var(--graphite); }
.lr-rule.rc-event   { background: #C0392B; }   /* Red — city events, appeals, forfeit */
.lr-rule.rc-tax     { background: #C68A4E; }   /* Amber — revenue payments, rent hike */
/* Verb color per entry type — .log-row carries ruleCls for selector targeting */
.log-row.rc-event   .lr-body b { color: #C0392B; }
.log-row.rc-tax     .lr-body b { color: #C68A4E; }
.log-row.rc-develop .lr-body b,
.log-row.rc-biz     .lr-body b,
.log-row.rc-cul     .lr-body b,
.log-row.rc-park    .lr-body b,
.log-row.rc-lmk     .lr-body b { color: var(--blue); }
.log-row.rc-auction .lr-body b { color: var(--bid); }
.log-row.rc-agenda  .lr-body b { color: var(--seawall); }
/* Round divider */
.log-div { display: flex; align-items: center; gap: 8px; padding: 10px 10px; }
.ld-line { flex: 1; height: 1px; background: var(--rule); }
.ld-stamp { font-family: 'Barlow Condensed', sans-serif; font-size: 9px; letter-spacing: 0.22em; color: var(--bid); text-transform: uppercase; white-space: nowrap; }
.log-ft { text-align: center; padding: 9px; border-top: 1px solid var(--rule); flex-shrink: 0; font-family: 'Barlow Condensed', sans-serif; font-size: 9px; letter-spacing: 0.18em; text-transform: uppercase; opacity: 0.5; }

/* ─── POLISH-PASS ADDITIONS ──────────────────────────────────────────────── */
/* Polish items 5 + 7: interactivity affordances not present in the bundled
 * target stylesheet but implied by the renderers. */
.hc { cursor: pointer; transition: transform 120ms ease, box-shadow 120ms ease; }
/* T-buttery: static glow, no infinite box-shadow animation — the old pulse
 * repainted up to 7 stacked cards every frame for the whole game (constant
 * background paint cost = jank). Outline + fixed glow reads the same. */
.hc.playable {
  outline: 2px solid var(--bid);
  outline-offset: -2px;
  box-shadow: 0 0 0 3px rgba(63,182,255,0.28), 0 4px 12px rgba(63,182,255,0.18);
}
.bid-field.buyable { cursor: pointer; transition: background-color 120ms ease; }
.bid-field.buyable:hover { background-color: rgba(63,182,255,0.10); }

/* Per-lot Lock Bid button — sits under the bid-field on the current
 * auction lot only. Outlined bid-blue to match .tb-btn.primary visual
 * language so both the topbar and per-lot lock controls read as the
 * same affordance. */
.lot-lock-btn {
  display: block; width: 100%; margin-top: 6px;
  padding: 6px 10px;
  background: transparent;
  border: 1px solid var(--bid);
  color: var(--bid);
  font-family: 'Barlow Condensed', sans-serif;
  font-size: 11px; letter-spacing: 0.22em; text-transform: uppercase;
  text-align: center;
  cursor: pointer;
  transition: background 120ms ease;
}
.lot-lock-btn:hover { background: rgba(63,182,255,0.10); }
.lot-lock-btn.locked-state {
  border-color: rgba(63,182,255,0.35);
  color: rgba(63,182,255,0.6);
  cursor: default;
}

/* Compact opp-strip: replaces the prior 3-row stacked `.opp-rows` with
 * a single horizontal line of [initial · light] chips. Each chip's
 * light glows bid-blue when that player has locked their bid; stays
 * dim hollow when pending. Net savings ~50px per lot. */
.opp-strip {
  display: flex;
  justify-content: space-around;
  align-items: center;
  margin-top: 7px;
  padding-top: 6px;
  border-top: 1px dashed var(--rule);
}
.opp-chip {
  display: inline-flex;
  align-items: center;
  gap: 5px;
  padding: 2px 6px;
  border-radius: 12px;
  background: rgba(0,0,0,0.04);
}
.opp-chip .opp-init {
  width: 14px; height: 14px; border-radius: 50%;
  display: inline-flex; align-items: center; justify-content: center;
  color: #fff;
  font-family: 'Barlow Condensed', sans-serif;
  font-weight: 600; font-size: 8px;
  letter-spacing: 0;
}
.opp-chip .opp-light {
  width: 7px; height: 7px; border-radius: 50%;
  background: transparent;
  border: 1px solid rgba(0,0,0,0.28);
  transition: background 180ms ease, box-shadow 180ms ease, border-color 180ms ease;
}
.opp-chip.locked .opp-light {
  background: var(--bid);
  border-color: var(--bid);
  box-shadow: 0 0 6px var(--bid), 0 0 2px var(--bid);
}
/* Insider Tip: revealed opponent bid amount in place of the status light. */
.opp-chip .opp-bid-amt {
  font-family: 'Barlow Condensed', sans-serif;
  font-weight: 700; font-size: 10px; letter-spacing: 0.02em;
  color: var(--bid); min-width: 26px; text-align: right;
}
.opp-chip.revealed { background: rgba(63,182,255,0.10); }

/* ─── DEVELOPER AGENDA MODAL ─────────────────────────────────────────────── */
/* Ported from dashboard-v8.css (sections 2691–2898) without the body.v8-mode
 * scope. ui.js renders these v8-* class names in `_showAgendaModal`; without
 * these rules the modal flowed inline at the bottom of the page. */
.v8-agenda-modal-backdrop {
  position: fixed; inset: 0; z-index: 8400;
  background: rgba(8, 18, 30, 0.88);
  display: flex; align-items: center; justify-content: center;
}
.v8-agenda-modal {
  background: #0e1f30;
  border: 1px solid rgba(255, 255, 255, 0.1);
  border-radius: 10px;
  padding: 24px;
  width: min(680px, 94vw);
  max-height: 88vh;
  overflow-y: auto;
  color: #fff;
  font-family: 'Barlow', sans-serif;
}
.v8-agenda-modal-header { display: flex; align-items: center; justify-content: space-between; margin-bottom: 16px; }
.v8-agenda-modal-title { font-size: 11px; font-weight: 700; letter-spacing: 0.2em; text-transform: uppercase; color: var(--bid); }
.v8-agenda-close-btn { background: none; border: none; color: rgba(255,255,255,0.4); font-size: 18px; cursor: pointer; line-height: 1; padding: 4px 6px; border-radius: 4px; }
.v8-agenda-close-btn:hover { color: #fff; }
.v8-agenda-instructions { font-size: 12px; color: rgba(255,255,255,0.55); margin: 0 0 18px; line-height: 1.5; }
.v8-agenda-deadline { display: inline-block; margin-top: 6px; color: #f5c542; font-weight: 600; font-size: 11px; letter-spacing: 0.03em; }
.v8-agenda-empty { font-size: 13px; color: rgba(255,255,255,0.35); text-align: center; padding: 32px 0; }
.v8-agenda-tiles { display: flex; gap: 16px; flex-wrap: wrap; }
.v8-agenda-card-tile {
  flex: 1 1 260px;
  background: rgba(255, 255, 255, 0.04);
  border: 1px solid rgba(255, 255, 255, 0.09);
  border-radius: 8px;
  padding: 18px;
  display: flex; flex-direction: column; gap: 14px;
}
.v8-agenda-card-tile.is-committed { border-color: var(--bid); background: rgba(63,182,255,0.06); }
.v8-agenda-tile-name { font-size: 15px; font-weight: 700; color: #fff; letter-spacing: 0.02em; }
.v8-agenda-tile-tiers { display: flex; flex-direction: column; gap: 8px; }
.v8-agenda-tier-row { display: flex; align-items: center; gap: 10px; font-size: 11px; color: rgba(255,255,255,0.5); }
.v8-agenda-tier-row.achieved { color: var(--bid); }
.v8-agenda-tier-dot { width: 7px; height: 7px; border-radius: 50%; flex-shrink: 0; background: rgba(255,255,255,0.18); }
.v8-agenda-tier-row.achieved .v8-agenda-tier-dot { background: var(--bid); }
.v8-agenda-tier-desc { flex: 1; line-height: 1.35; }
.v8-agenda-tier-vp { font-weight: 700; white-space: nowrap; color: rgba(255,255,255,0.6); }
.v8-agenda-tier-row.achieved .v8-agenda-tier-vp { color: var(--bid); }
.v8-agenda-commit-btn {
  margin-top: auto;
  background: var(--bid); color: #0a1420;
  border: none; border-radius: 5px;
  padding: 9px 14px;
  font-size: 11px; font-weight: 700;
  letter-spacing: 0.1em; text-transform: uppercase;
  cursor: pointer; width: 100%;
}
.v8-agenda-commit-btn:hover { opacity: 0.85; }

/* ── "View the board" peek — shared across agenda / forfeit / debt modals ── */
/* Secondary (outlined) button so it never competes with the solid primary action. */
.cs-view-board-btn {
  display: block; width: 100%; margin-top: 14px;
  background: transparent;
  border: 1px solid var(--bid); color: var(--bid);
  border-radius: 5px; padding: 9px 14px;
  font-family: 'Barlow Condensed', 'Barlow', sans-serif;
  font-size: 12px; font-weight: 700; letter-spacing: 0.12em; text-transform: uppercase;
  cursor: pointer;
}
.cs-view-board-btn:hover  { background: rgba(63,182,255,0.12); }
.cs-view-board-btn:active { background: rgba(63,182,255,0.22); }
/* Transparent full-screen click-catch — board reads clearly, click-anywhere returns. */
.cs-board-peek-layer { position: fixed; inset: 0; z-index: 10050; background: transparent; cursor: pointer; }
.cs-board-peek-return {
  position: fixed; top: 18px; left: 50%; transform: translateX(-50%); z-index: 10051;
  background: var(--hull); color: var(--bid);
  border: 1px solid var(--bid); border-radius: 999px; padding: 10px 22px;
  font-family: 'Barlow Condensed', 'Barlow', sans-serif;
  font-size: 13px; font-weight: 700; letter-spacing: 0.08em; text-transform: uppercase;
  cursor: pointer; box-shadow: 0 6px 22px rgba(0,0,0,0.45);
}
.cs-board-peek-return:hover { background: #12283c; }
.v8-agenda-committed-badge {
  margin-top: auto;
  font-size: 11px; font-weight: 700; letter-spacing: 0.1em;
  color: var(--bid); text-align: center;
  padding: 8px; border: 1px solid var(--bid); border-radius: 5px; opacity: 0.7;
}

/* ─── #gameScreen viewport-fit override ──────────────────────────────────── */
/* styles.css:787 sets #gameScreen as a 3-row × 2-col grid with a reserved
 * 210px bottom row and 320px right column for the legacy hand-strip + log.
 * Those slots no longer exist under the target shell — .app is the only
 * child and needs to fill the full viewport. Reset the grid template and
 * switch .visible from `display: grid` to `display: block` so .app inherits
 * full height. Cascade-wins because dashboard-target.css loads after
 * styles.css in index.html. */
#gameScreen {
  height: 100vh;
  width: 100%;
  grid-template-rows: none;
  grid-template-columns: none;
}
#gameScreen.visible { display: block; }

/* Tighten .brow vertical footprint so 4 player rows fit alongside the
 * blade-signs row + market in a 900px viewport. Target spec has min-height
 * 128px which makes the board ~600px tall — with market 340px and topbar
 * 56px that's 996px, overflowing 900px viewports. 100px keeps the meta-c
 * column legible while reclaiming 112px (4 × 28). */
/* Vertical-fill pass: 115px is the TARGET row height (fits 4 rows in a
 * 900px viewport), but as a MINIMUM, not a fixed height — the meta column
 * gained an agenda line and a fixed height made overflowing content
 * (tallies, badge) spill into the NEXT row (the user-reported text
 * bunching). Rows now grow with content; the board column scrolls. */
.brow { min-height: 115px; height: auto; }
.meta-c { padding: 10px 12px !important; gap: 4px !important; }
.tally { padding: 2px 6px !important; }

/* nhc is the positioning context for .cc so cards can float over the
 * tally row below. overflow: visible lets cards spill out freely. */
.nhc { position: relative !important; overflow: visible !important; }

/* Fix C: cell is now just a background box — no content lives inside it.
 * .cc floats above it (and the tally) via absolute positioning on .nhc. */
.cell {
  margin: 4px !important;
  background: rgba(63,182,255,0.02);
  border: 1px dashed rgba(201,212,223,0.6);
  overflow: visible !important;
}
/* .cc is positioned relative to .nhc (not .cell) so it spans the full
 * row height including the tally strip — cards physically sit on the
 * board, not clipped inside the cell boundary. */
.cc {
  position: absolute !important;
  top: 4px; left: 4px; right: 4px; bottom: 0;
  display: flex !important;
  align-items: flex-start; justify-content: center;
  padding-top: 4px;
  gap: 0 !important;
  flex-wrap: nowrap !important;
  z-index: 2;
  overflow: visible !important;
}
/* Built location cards — full fan: no border, no crop, soft shadow,
 * -3% negative-margin overlap, per-subtype rotation from target spec.
 * Width 25% = 10% smaller than original 28%. */
.cc-card {
  width: 25%; height: auto; aspect-ratio: 3/4;
  margin: 0 -3%;
  border-radius: 4px;
  border: none !important;
  box-shadow: 0 2px 8px rgba(0,0,0,0.22) !important;
  flex-shrink: 0;
  position: relative;
  z-index: 2;
}
/* Steal targeting — valid built location cards glow bid-blue */
.cc-card.steal-valid {
  outline: 2px solid var(--bid, #3FB6FF) !important;
  outline-offset: 2px;
  box-shadow: 0 0 10px rgba(63,182,255,0.55) !important;
  z-index: 10;
  transition: outline-color 120ms, box-shadow 120ms;
}
.cc-card.steal-valid:hover {
  outline-color: #fff !important;
  box-shadow: 0 0 18px rgba(63,182,255,0.85) !important;
}
/* tally sits in normal flow beneath .cc in z-order;
 * cards may partially cover it — that's intentional. */
.tally { position: relative; z-index: 1; }
/* Ghost slot placeholders — small, evenly spaced, NO overlap.
 * Purpose is "count how many slots remain", so readability beats drama.
 * 13% wide fits 5-6 slots in a 115px cell with breathing room. */
.cc-slot {
  width: 13%; height: auto; aspect-ratio: 3/4;
  margin: 0 2px;
  border-radius: 3px;
  flex-shrink: 0;
  position: relative;
  border: 1px dashed rgba(0,0,0,0.22);
  background: rgba(0,0,0,0.02);
}
.cc-slot::after {
  content: ''; position: absolute; left: 3px; right: 3px; bottom: 3px;
  height: 2px; border-radius: 1px;
}
.cc-slot-biz::after  { background: var(--biz);  }
.cc-slot-cul::after  { background: var(--cul);  }
.cc-slot-park::after { background: var(--park); }
.cc-slot-lmk         { border-style: dotted; }
.cc-slot-lmk::after  { background: var(--lmk); }
/* T-a11y: letter glyph so empty slot types read without color vision.
   ::before is free (the color bar uses ::after). */
.cc-slot::before {
  position: absolute; inset: 0;
  display: flex; align-items: center; justify-content: center;
  font-family: 'Barlow Condensed', sans-serif;
  font-weight: 700; font-size: 11px; letter-spacing: 0.3px;
  color: rgba(0,0,0,0.30);
  pointer-events: none;
}
.cc-slot-biz::before  { content: 'B'; }
.cc-slot-cul::before  { content: 'C'; }
.cc-slot-park::before { content: 'P'; }
.cc-slot-lmk::before  { content: 'L'; }
body.dark-mode .cc-slot::before { color: rgba(255,255,255,0.35); }

/* Fix D: hover affordance — only on the active player's row so AIs
 * don't get an interactive sheen. Cell tints bid-blue + solid border. */
.brow.act .cell:hover {
  background: rgba(63,182,255,0.06);
  border-style: solid;
  border-color: rgba(63,182,255,0.4);
  cursor: pointer;
}

/* Wildcard build mode: entire nhc glows green so the target is obvious
 * even though .cc floats above the cell at z-index 2. Click is wired on
 * nhcEl so it captures events regardless of which child is hit. */
.nhc:has(.cell.wc-target) {
  background: rgba(40,200,120,0.08);
  outline: 1px solid rgba(40,200,120,0.5);
  outline-offset: -2px;
}

/* Shrink the lot-art aspect from 3/4 → 1/1 (squarer card image) and tighten
 * the bsigns row so the dashboard fits a 900px viewport without internal
 * center-column scroll. Net reclaimed: ~65px (lot-art -35, bsigns -30). */
/* Fix C: restore portrait aspect so the entire card photo is visible
 * (1/1 cropped 25% of art). Fix D: rounded corners + soft drop shadow on
 * the lot-art frame so cards look like physical pieces. */
.lot-art {
  aspect-ratio: 3/4;
  border-radius: 6px;
  overflow: hidden;
  box-shadow:
    0 1px 1px rgba(0,0,0,0.10),
    0 4px 12px rgba(0,0,0,0.18),
    0 0 0 1px rgba(0,0,0,0.05);
}
.lot-art img { border-radius: 6px; }
/* Sidebar section tightening — reclaim ~40px of vertical space above the
 * hand so more cards are visible. Each sb-sec keeps proportional inner
 * spacing; only the padding is trimmed. .hc image takes priority. */
.sb-sec { padding: 9px 16px !important; }
.sb-cap { margin-bottom: 5px !important; }
.sb-rule { margin-top: 7px !important; }
/* Agenda tile — dark-theme makeover to match the rest of the sidebar.
 * Original target stylesheet ships a parchment block that clashes with
 * the navy hull; this overrides to a hull-tinted card with bid-blue
 * accent matching the LOCK BID / phase-tab visual language. */
.agenda-tile {
  background: rgba(255, 255, 255, 0.04) !important;
  color: var(--paper) !important;
  border: 1px solid rgba(63, 182, 255, 0.32) !important;
  border-left: 2px solid var(--bid) !important;
  border-radius: 10px !important;
  padding: 9px 11px !important;
  cursor: pointer;
  transition: background 120ms ease, border-color 120ms ease;
}
.agenda-tile:hover {
  background: rgba(63, 182, 255, 0.08) !important;
  border-color: var(--bid) !important;
}
.agenda-tile .ag-name {
  color: var(--paper) !important;
  font-family: 'Barlow Condensed', sans-serif !important;
  font-weight: 600 !important;
  font-size: 14px !important;
  letter-spacing: 0.18em !important;
  text-transform: uppercase !important;
}
.agenda-tile .ag-cond {
  color: rgba(255, 255, 255, 0.55) !important;
  font-family: 'Barlow Condensed', sans-serif !important;
  font-size: 9px !important;
  letter-spacing: 0.10em !important;
  text-transform: uppercase !important;
  line-height: 1.3 !important;
  margin-top: 4px !important;
  white-space: nowrap !important;
}
.sb-prog { margin-top: 4px !important; }

/* Two-column VP + Treasury — saves one full sb-sec block of height. */
.sb-stats-2col {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 10px;
}
.sb-stats-2col .sb-stat-col { display: flex; flex-direction: column; }
.sb-stats-2col .lcd {
  padding: 5px 8px !important;
}
.sb-stats-2col .lcd .num { font-size: 18px !important; }
.sb-stats-2col .lcd .denom { font-size: 10px !important; }
.sb-stats-2col .sb-cap { margin-bottom: 4px !important; }

/* 2×2 portfolio grid — saves another row's height. Each port-cell is a
 * compact dot + label + count tabular block. */
.port-grid {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 4px 10px;
}
.port-cell {
  display: grid;
  grid-template-columns: 12px 1fr auto;
  gap: 8px;
  align-items: center;
  padding: 3px 0;
  font-family: 'Barlow Condensed', sans-serif;
  font-size: 11px;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: #fff;
}
.port-cell .port-lbl { opacity: 0.85; }
.port-cell .port-rnd { width: 10px; height: 10px; border-radius: 50%; border: 2px solid #fff; }
.port-cell .port-ct {
  font-family: 'Barlow', sans-serif;
  font-variant-numeric: tabular-nums;
  font-size: 12px; font-weight: 500;
}
.bsigns { min-height: 0; }
.bsigns-sp { padding: 5px 0 5px 40px; }   /* 40px = 12px meta-c padding + 20px dot + 8px gap → aligns with name text */
.sp-blade  { padding: 6px 12px; min-height: 38px; }
/* Wildcard build target — cell glows green when player is picking a destination */
.cell.wc-target {
  background: rgba(40, 200, 120, 0.12) !important;
  border: 1px solid rgba(40, 200, 120, 0.55) !important;
  box-shadow: inset 0 0 8px rgba(40, 200, 120, 0.15);
  cursor: pointer !important;
}
.cell.wc-target:hover {
  background: rgba(40, 200, 120, 0.24) !important;
  border-color: rgba(40, 200, 120, 0.85) !important;
}
/* Per-neighbourhood type indicators in cell tally — dot lights up when built */
.tally { display: flex !important; gap: 3px !important; padding: 3px 6px 4px !important;
         align-items: center; justify-content: space-between; }
.tally-item { display: flex; align-items: center; gap: 2px;
  font-family: 'Barlow Condensed', sans-serif;
  font-size: 9px; letter-spacing: 0.10em; text-transform: uppercase; color: var(--ink); }
.tally-dot { width: 6px; height: 6px; border-radius: 50%; border: 1px solid; flex-shrink: 0; }
.tally-dot.biz  { background: var(--biz);  border-color: var(--biz);  }
.tally-dot.cul  { background: var(--cul);  border-color: var(--cul);  }
.tally-dot.park { background: var(--park); border-color: var(--park); }
.tally-dot.lmk  { background: var(--lmk); border-color: var(--lmk); }
.tally-dot.dim  { background: transparent; border-color: rgba(0,0,0,0.18); }
.tally-lbl { opacity: 0.85; font-weight: 600; }
.tally-ct  { font-weight: 600; min-width: 10px; text-align: right; }
/* Player avatar: colored dot base with sprite layered on top */
.mc-avatar {
  position: relative;
  width: 28px; height: 28px;
  flex-shrink: 0;
}
.mc-avatar .mc-dot {
  width: 28px; height: 28px;
  border-radius: 50%;
  position: absolute; inset: 0;
}
.mc-sprite {
  position: absolute; inset: 0;
  width: 100%; height: 100%;
  object-fit: contain;
  image-rendering: pixelated;
}
/* Round / phase label next to the logo badge in .tb-mark */
.tb-phase-tag {
  font-family: 'Barlow Condensed', sans-serif;
  font-size: 9px;
  font-weight: 500;
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: rgba(255,255,255,0.55);
  white-space: nowrap;
  margin-left: 8px;
}
/* Circular white badge behind the short logo icon */
.tb-logo-badge {
  width: 44px; height: 44px; border-radius: 50%;
  background: #fff;
  display: flex; align-items: center; justify-content: center;
  flex-shrink: 0;
  box-shadow: 0 0 0 2px rgba(255,255,255,0.15);
}
/* CITYSCAPE wordmark next to the badge */
.tb-wordmark {
  font-family: 'Barlow Condensed', sans-serif;
  font-size: 18px;
  font-weight: 700;
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: #fff;
  white-space: nowrap;
}
/* ── Burn-for-money ─────────────────────────────────────────────────── */
.mkt-head { display: flex; align-items: center; justify-content: space-between; }
.mkt-head-main { display: flex; flex-direction: column; gap: 2px; }
.burn-zone { flex-shrink: 0; }
.burn-btn {
  font-family: 'Barlow Condensed', sans-serif;
  font-size: 11px; font-weight: 600; letter-spacing: 0.2em; text-transform: uppercase;
  background: transparent;
  border: 1px solid var(--cul, #6B4E8A);
  color: var(--cul, #6B4E8A);
  border-radius: 3px; padding: 5px 12px; cursor: pointer;
  transition: background 120ms;
}
.burn-btn:hover { background: rgba(107,78,138,0.14); }
.burn-done {
  font-family: 'Barlow Condensed', sans-serif;
  font-size: 10px; letter-spacing: 0.16em; text-transform: uppercase;
  color: rgba(255,255,255,0.35);
}
/* Black Market button — action-phase property market header */
.bm-zone { flex-shrink: 0; }
.bm-btn {
  font-family: 'Barlow Condensed', sans-serif;
  font-size: 11px; font-weight: 600; letter-spacing: 0.2em; text-transform: uppercase;
  background: transparent;
  border: 1px solid #1B6FC8;
  color: #1B6FC8;
  border-radius: 3px; padding: 5px 12px; cursor: pointer;
  transition: background 120ms;
}
.bm-btn:hover { background: rgba(27,111,200,0.12); }
.bm-btn-disabled {
  border-color: rgba(27,111,200,0.3);
  color: rgba(27,111,200,0.35);
  cursor: default;
}

/* Burn card picker modal */
.burn-picker-panel {
  background: var(--hull, #0D1C2C);
  border: 1px solid rgba(255,255,255,0.12);
  border-radius: 8px; padding: 20px 24px;
  min-width: 300px; max-width: 480px;
  display: flex; flex-direction: column; gap: 14px;
}
.burn-picker-hd {
  font-family: 'Barlow Condensed', sans-serif;
  font-size: 13px; font-weight: 600; letter-spacing: 0.12em;
  text-transform: uppercase; color: rgba(255,255,255,0.8);
}
.burn-picker-cards { display: flex; flex-direction: column; gap: 8px; }
.burn-pick-btn {
  display: flex; align-items: center; gap: 10px;
  background: rgba(255,255,255,0.06);
  border: 1px solid rgba(255,255,255,0.12); border-radius: 4px;
  padding: 10px 14px; cursor: pointer; text-align: left;
  transition: background 100ms;
}
.burn-pick-btn:hover { background: rgba(107,78,138,0.2); border-color: var(--cul); }
.burn-pick-type {
  font-family: 'Barlow Condensed', sans-serif;
  font-size: 9px; letter-spacing: 0.2em; text-transform: uppercase;
  color: var(--cul, #6B4E8A);
  background: rgba(107,78,138,0.18); padding: 2px 6px; border-radius: 2px;
  flex-shrink: 0;
}
.burn-pick-name {
  font-family: 'Barlow Condensed', sans-serif;
  font-size: 13px; font-weight: 600; letter-spacing: 0.06em;
  color: rgba(255,255,255,0.85);
}
.burn-picker-cancel {
  font-family: 'Barlow Condensed', sans-serif;
  font-size: 11px; letter-spacing: 0.18em; text-transform: uppercase;
  background: transparent; border: 1px solid rgba(255,255,255,0.18);
  color: rgba(255,255,255,0.5); border-radius: 3px;
  padding: 7px 0; cursor: pointer; width: 100%;
}
.burn-picker-cancel:hover { background: rgba(255,255,255,0.05); }

/* Gallery burn-picker: thumbnail strip + live detail pane so players can SEE
 * each card and read what it does before choosing which to sacrifice. */
.burn-picker-panel--gallery { max-width: 560px; min-width: 420px; gap: 12px; }
.burn-picker-sub {
  font-family: 'Barlow', sans-serif; font-size: 12px; line-height: 1.4;
  color: rgba(255,255,255,0.5); margin-top: -6px;
}
.burn-tiles { display: flex; gap: 10px; flex-wrap: wrap; }
.burn-tile {
  display: flex; flex-direction: column; align-items: center; gap: 5px;
  width: 84px; padding: 6px; cursor: pointer;
  background: rgba(255,255,255,0.04);
  border: 1px solid rgba(255,255,255,0.1); border-radius: 8px;
  transition: border-color 120ms, background 120ms, transform 120ms;
}
.burn-tile:hover { background: rgba(255,255,255,0.08); transform: translateY(-2px); }
.burn-tile.sel { border-color: var(--bid, #3FB6FF); background: color-mix(in srgb, var(--bid, #3FB6FF) 16%, transparent); box-shadow: 0 0 0 1px var(--bid, #3FB6FF); }
.burn-tile-img {
  width: 100%; aspect-ratio: 3/4; border-radius: 5px;
  background-size: cover; background-position: center top; background-color: #14212f;
  border: 1px solid rgba(0,0,0,0.25);
}
.burn-tile-name {
  font-family: 'Barlow Condensed', sans-serif; font-size: 10px; font-weight: 600;
  letter-spacing: 0.03em; line-height: 1.1; text-align: center;
  color: rgba(255,255,255,0.82);
  display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden;
}
.burn-detail {
  display: flex; gap: 14px; align-items: stretch;
  background: rgba(0,0,0,0.22); border: 1px solid rgba(255,255,255,0.08);
  border-radius: 8px; padding: 14px;
}
.burn-detail-card { flex: 0 0 auto; width: 120px; }
.burn-detail-img {
  width: 120px; aspect-ratio: 3/4; object-fit: cover; object-position: center top;
  border-radius: 7px; background: #14212f; box-shadow: 0 4px 14px rgba(0,0,0,0.4);
}
.burn-detail-body { flex: 1; min-width: 0; display: flex; flex-direction: column; }
.burn-detail-type {
  align-self: flex-start;
  font-family: 'Barlow Condensed', sans-serif; font-size: 9px; letter-spacing: 0.2em;
  text-transform: uppercase; color: var(--cul, #6B4E8A);
  background: rgba(107,78,138,0.18); padding: 2px 7px; border-radius: 3px;
}
.burn-detail-name {
  font-family: 'Barlow Condensed', sans-serif; font-size: 20px; font-weight: 700;
  letter-spacing: 0.03em; color: #fff; margin: 7px 0 5px;
}
.burn-detail-eff {
  font-family: 'Barlow', sans-serif; font-size: 12.5px; line-height: 1.45;
  color: rgba(255,255,255,0.72); margin: 0 0 12px;
}
.burn-do-btn {
  margin-top: auto; align-self: flex-start;
  font-family: 'Barlow Condensed', sans-serif; font-size: 13px; font-weight: 700;
  letter-spacing: 0.1em; text-transform: uppercase; cursor: pointer;
  background: var(--bid, #3FB6FF); color: #06121f; border: none;
  border-radius: 7px; padding: 10px 16px;
  transition: filter 120ms;
}
.burn-do-btn:hover { filter: brightness(1.08); }
.burn-do-arrow { opacity: 0.72; }
@media (max-width: 560px) {
  .burn-picker-panel--gallery { min-width: 0; max-width: 94vw; }
  .burn-detail { flex-direction: column; align-items: center; text-align: center; }
  .burn-detail-body { align-items: center; }
}

/* Opponent row highlight when player-targeting mode is active (e.g. 420 Festival) */
.brow.player-target {
  outline: 2px solid var(--bid, #3FB6FF) !important;
  outline-offset: -2px;
  background: rgba(63,182,255,0.06) !important;
  transition: background 120ms;
}
.brow.player-target:hover {
  background: rgba(63,182,255,0.16) !important;
}

/* First divider after the logo → blue accent instead of grey */
.tb-mark + .tb-div {
  background: var(--bid, #3FB6FF) !important;
  opacity: 0.7;
}

/* ── Settings Popover ───────────────────────────────────────────────────── */
.v8-popover {
  display: none;
  position: absolute;
  top: calc(100% + 8px);
  right: 0;
  width: 220px;
  background: var(--hull, #0D1C2C);
  border: 1px solid rgba(255,255,255,0.12);
  border-radius: 6px;
  box-shadow: 0 8px 32px rgba(0,0,0,0.5);
  padding: 12px;
  z-index: 200;
}
.v8-popover.open { display: flex; flex-direction: column; gap: 12px; }
.v8-pop-label {
  font-family: 'Barlow Condensed', sans-serif;
  font-size: 10px; letter-spacing: 0.16em; text-transform: uppercase;
  color: rgba(255,255,255,0.45);
  margin-bottom: 6px;
}
.v8-pop-section { display: flex; flex-direction: column; }
.v8-seg { display: flex; gap: 4px; }
.v8-seg button {
  flex: 1;
  font-family: 'Barlow Condensed', sans-serif;
  font-size: 11px; letter-spacing: 0.12em; text-transform: uppercase;
  background: rgba(255,255,255,0.08);
  border: 1px solid rgba(255,255,255,0.12);
  color: rgba(255,255,255,0.6);
  border-radius: 3px;
  padding: 5px 0;
  cursor: pointer;
  transition: background 100ms;
}
.v8-seg button.active,
.v8-seg button:hover {
  background: var(--bid, #3FB6FF);
  border-color: var(--bid, #3FB6FF);
  color: #fff;
}
.v8-pop-htp {
  width: 100%;
  font-family: 'Barlow Condensed', sans-serif;
  font-size: 11px; letter-spacing: 0.14em; text-transform: uppercase;
  background: transparent;
  border: 1px solid rgba(255,255,255,0.18);
  color: rgba(255,255,255,0.7);
  border-radius: 3px;
  padding: 7px 0;
  cursor: pointer;
}
.v8-pop-htp:hover { background: rgba(255,255,255,0.06); }
#v8VolumeBlock.collapsed { display: none; }

/* ── Card Zoom Overlay — brand guide restyle ────────────────────────────
 * Replaces old v8 panel/primary/success palette with the target dashboard's
 * parchment + ink + bid-blue system. Structure (classes) is unchanged so
 * the GSAP animation and game wiring continue to work. */
#zoomOverlay {
  /* T-buttery: no backdrop blur — 8px blur over the full board was one of the
   * biggest iPad Safari paint costs every time a card was zoomed. Darker flat
   * scrim gives the same focus. */
  background: rgba(9,12,17,0.88) !important;
  backdrop-filter: none !important;
  -webkit-backdrop-filter: none !important;
}
.zoomed-card {
  background: var(--parch, #f5f0e8) !important;
  border: 1px solid var(--rule, #c9d4df) !important;
  border-radius: 8px !important;
  max-width: 340px !important;
  box-shadow: 0 24px 64px rgba(0,0,0,0.45), 0 4px 12px rgba(0,0,0,0.2) !important;
}
.zoom-art { border-radius: 7px 7px 0 0; overflow: hidden; }
.zoom-art img { width: 100%; height: auto; display: block; }
.zoom-info {
  background: #fff;
  border-top: 1px solid var(--rule, #c9d4df);
  padding: 12px 16px 8px !important;
}
.zoom-info h2 {
  font-family: 'Barlow Condensed', sans-serif !important;
  font-size: 1.25rem !important; font-weight: 700 !important;
  letter-spacing: 0.04em !important; text-transform: uppercase !important;
  color: var(--ink, #1a1f26) !important; margin-bottom: 6px !important;
}
.zoom-badge {
  font-family: 'Barlow Condensed', sans-serif !important;
  font-size: 10px !important; font-weight: 600 !important;
  letter-spacing: 0.18em !important;
  padding: 3px 10px !important; border-radius: 2px !important;
}
.zoom-nh {
  font-family: 'Barlow Condensed', sans-serif !important;
  color: var(--bid, #3fb6ff) !important;
  font-size: 11px !important; letter-spacing: 0.08em !important;
  text-transform: uppercase !important; margin-bottom: 6px !important;
}
.zoom-effect { font-size: 0.82rem !important; color: var(--ink, #1a1f26) !important; line-height: 1.55 !important; }
.zoom-flavour { font-size: 0.75rem !important; color: rgba(26,31,38,0.45) !important; }
/* Wildcard primer callout — always shown when inspecting a wildcard so the
   "goes anywhere" rule is permanently discoverable, not just a passing tip. */
.zoom-wildcard {
  margin-top: 8px !important;
  padding: 8px 10px !important;
  background: rgba(63,182,255,0.09) !important;
  border-left: 3px solid var(--bid, #3fb6ff) !important;
  border-radius: 4px !important;
  font-size: 0.78rem !important;
  line-height: 1.5 !important;
  color: var(--ink, #1a1f26) !important;
}
.zoom-wildcard-tag {
  display: inline-block;
  font-family: 'Barlow Condensed', sans-serif;
  font-size: 9px; font-weight: 700; letter-spacing: 0.16em;
  text-transform: uppercase;
  color: #05283b; background: var(--bid, #3fb6ff);
  padding: 1px 6px; border-radius: 2px; margin-right: 7px;
  vertical-align: 1px;
}
.zoom-meta-row {
  display: flex; align-items: center;
  justify-content: space-between;
  margin-bottom: 8px;
}
.zoom-value {
  font-family: 'Barlow Condensed', sans-serif !important;
  font-size: 13px !important; font-weight: 600 !important;
  letter-spacing: 0.08em !important; color: var(--park, #4a9b6f) !important;
  margin: 0 !important;
}
.zoom-close {
  background: rgba(20,25,32,0.72) !important;
  width: 28px !important; height: 28px !important;
  font-size: 11px !important; border-radius: 50% !important;
  color: rgba(255,255,255,0.92) !important;
  top: 10px !important; right: 10px !important;
}
.zoom-actions {
  background: #fff;
  border-top: 1px solid var(--rule, #c9d4df) !important;
  padding: 10px 14px 14px !important; gap: 8px !important;
}
.zoom-action-btn {
  font-family: 'Barlow Condensed', sans-serif !important;
  font-size: 11px !important; font-weight: 600 !important;
  letter-spacing: 0.22em !important; border-radius: 3px !important;
  padding: 9px 14px !important;
}
.zoom-action-btn.build-btn { background: var(--bid, #3fb6ff) !important; color: #fff !important; }
.zoom-action-btn.build-btn:hover { background: rgba(63,182,255,0.82) !important; }
.zoom-action-btn.sell-btn {
  background: transparent !important;
  border: 1px solid var(--rule, #c9d4df) !important;
  color: var(--ink, #1a1f26) !important;
}
.zoom-action-btn.sell-btn:hover { background: rgba(0,0,0,0.04) !important; }
.zoom-action-btn.event-btn { background: var(--cul, #6b48a0) !important; color: #fff !important; }
.zoom-action-btn.revenue-btn { background: var(--park, #4a9b6f) !important; color: #fff !important; }

/* ── Splash screen redesign ─────────────────────────────────────────────── */

/* Tighten the outer container for the new layout */
.splash-compact {
  max-width: 600px !important;
  padding: 28px 32px 0 !important;
}

/* ── Fit-to-viewport (HEIGHT ONLY) ───────────────────────────────────────────
   Shrink the oversized logo and tighten the vertical rhythm so the whole splash
   fits a short (≈900px) window without a scrollbar. These rules change only
   sizes/paddings/margins — NO positioning or alignment — so they cannot shift
   the card horizontally or vertically; the splash stays centered exactly as the
   base layout places it. (Re-added after the stale-cache fix; the earlier
   "shifting" was a cached stylesheet, not this CSS.) */
#explainerScreen { padding-top: 8px !important; }
.splash-compact { padding-top: 14px !important; }
.explainer-header img { width: 264px !important; margin-bottom: 2px !important; }
.explainer-header { margin-bottom: 4px !important; }
.splash-note { padding: 8px 16px !important; margin-bottom: 8px !important; }
.splash-ks { margin-bottom: 6px !important; }
.splash-objective { margin: 6px 0 8px !important; padding: 8px 18px !important; }
.splash-vp-grid { margin-bottom: 8px !important; }
.splash-vp-section { padding: 8px 12px !important; }
.splash-vp-rows { gap: 4px !important; }
.splash-nh-ref { margin-bottom: 8px !important; }
.splash-nh-item { padding: 5px 12px !important; }
.explainer-section { padding: 8px 14px !important; margin-bottom: 2px !important; }
.splash-buttons { margin-top: 10px !important; padding-bottom: 8px !important; }

/* Playtest note — warm parchment sticky note */
.splash-note {
  background: #FFF9E6;
  border: 1.5px dashed #E2C87E;
  border-radius: 10px;
  padding: 12px 18px;
  margin-bottom: 16px;
  font-family: 'Barlow', sans-serif;
  font-size: 0.87rem;
  color: #5A4E2F;
  line-height: 1.55;
  text-align: left;
  transform: rotate(-0.3deg);
}

/* Kickstarter link row */
.splash-ks {
  text-align: center;
  font-family: 'Barlow', sans-serif;
  font-size: 0.82rem;
  color: #5A4E2F;
  margin-bottom: 14px;
  opacity: 0.85;
}
.splash-ks a {
  color: #1B6FC8;
  text-decoration: underline;
  font-weight: 600;
}

/* Win condition banner */
.splash-objective {
  text-align: center;
  font-family: 'Barlow Condensed', sans-serif;
  font-size: 1.15rem;
  font-weight: 600;
  letter-spacing: 0.04em;
  color: var(--ink, #1a1f26);
  background: rgba(63,182,255,0.07);
  border: 1px solid rgba(63,182,255,0.25);
  border-radius: 6px;
  padding: 12px 20px;
  margin: 12px 0 18px;
}
.splash-objective strong { color: var(--bid, #3FB6FF); }

/* VP reference grid — two columns side by side */
.splash-vp-grid {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 12px;
  margin-bottom: 16px;
}
.splash-vp-section {
  background: rgba(0,0,0,0.025);
  border: 1px solid rgba(201,212,223,0.7);
  border-radius: 6px;
  padding: 12px 14px;
}
.splash-vp-label {
  font-family: 'Barlow Condensed', sans-serif;
  font-size: 10px;
  font-weight: 600;
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: rgba(26,31,38,0.45);
  margin-bottom: 8px;
}
.splash-vp-rows { display: flex; flex-direction: column; gap: 5px; }
.splash-vp-row {
  display: flex;
  align-items: center;
  gap: 7px;
  font-family: 'Barlow Condensed', sans-serif;
  font-size: 12px;
  color: var(--ink, #1a1f26);
}
.splash-vp-dot {
  width: 8px; height: 8px;
  border-radius: 50%;
  flex-shrink: 0;
}
.splash-vp-type { flex: 1; }
.splash-vp-val {
  font-weight: 700;
  font-size: 12px;
  color: var(--bid, #3FB6FF);
  white-space: nowrap;
}

/* Neighbourhood slots quick reference */
.splash-nh-ref {
  margin-bottom: 16px;
  border: 1px solid rgba(201,212,223,0.7);
  border-radius: 6px;
  overflow: hidden;
}
.splash-nh-ref-label {
  font-family: 'Barlow Condensed', sans-serif;
  font-size: 10px;
  font-weight: 600;
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: rgba(26,31,38,0.45);
  background: rgba(0,0,0,0.025);
  padding: 7px 14px;
  border-bottom: 1px solid rgba(201,212,223,0.5);
}
.splash-nh-ref-grid {
  display: grid;
  grid-template-columns: 1fr 1fr;
}
.splash-nh-item {
  padding: 8px 14px;
  border-right: 1px solid rgba(201,212,223,0.4);
  border-bottom: 1px solid rgba(201,212,223,0.4);
  font-family: 'Barlow Condensed', sans-serif;
  font-size: 12px;
  color: var(--ink, #1a1f26);
  display: flex;
  flex-direction: column;
  gap: 2px;
}
.splash-nh-item:nth-child(2n) { border-right: none; }
.splash-nh-item:nth-child(3),
.splash-nh-item:nth-child(4) { border-bottom: none; }
.splash-nh-item strong {
  font-size: 11px;
  font-weight: 700;
  letter-spacing: 0.05em;
}
.splash-nh-item span {
  font-size: 10px;
  opacity: 0.65;
  letter-spacing: 0.06em;
  text-transform: uppercase;
}

/* ── How to Play modal — VP table + agenda tiers ── */
.htp-vp-table {
  display: flex;
  flex-direction: column;
  gap: 5px;
  margin: 10px 0;
  padding: 12px 16px;
  background: rgba(0,0,0,0.025);
  border: 1px solid rgba(201,212,223,0.6);
  border-radius: 6px;
}
.htp-vp-row {
  display: flex;
  align-items: center;
  gap: 8px;
  font-family: 'Barlow Condensed', sans-serif;
  font-size: 13px;
  color: var(--ink, #1a1f26);
}
.htp-vp-dot {
  width: 9px; height: 9px;
  border-radius: 50%;
  flex-shrink: 0;
}
.htp-vp-row span { flex: 1; }
.htp-vp-row strong { color: var(--bid, #3FB6FF); }

.htp-agenda-tiers {
  display: flex;
  gap: 10px;
  margin: 10px 0;
}
.htp-tier {
  flex: 1;
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 4px;
  padding: 10px;
  border: 1px solid rgba(201,212,223,0.6);
  border-radius: 6px;
  font-family: 'Barlow Condensed', sans-serif;
  font-size: 14px;
  font-weight: 600;
  color: var(--bid, #3FB6FF);
}
.htp-tier-label {
  font-size: 9px;
  font-weight: 700;
  letter-spacing: 0.2em;
  text-transform: uppercase;
  padding: 3px 8px;
  border-radius: 2px;
  color: #fff;
}
.htp-tier-label.min      { background: rgba(63,182,255,0.5); }
.htp-tier-label.target   { background: rgba(63,182,255,0.75); }
.htp-tier-label.ambitious { background: var(--bid, #3FB6FF); }

/* ── Auction tie-break: escalation re-bid modal ─────────────────────────── */
.tie-modal-overlay {
  position: fixed; inset: 0;
  background: rgba(13,28,44,0.84);
  display: flex; align-items: center; justify-content: center;
  z-index: 400;
}
.tie-modal {
  background: var(--hull, #0D1C2C);
  border: 1px solid rgba(255,255,255,0.14);
  border-radius: 8px; padding: 24px 28px;
  min-width: 320px; max-width: 440px;
  display: flex; flex-direction: column; gap: 14px;
}
.tie-modal-hd {
  font-family: 'Barlow Condensed', sans-serif;
  font-size: 16px; font-weight: 700; letter-spacing: 0.14em;
  text-transform: uppercase; color: var(--bid, #3FB6FF);
}
.tie-modal-sub {
  font-family: 'Barlow', sans-serif; font-size: 13px;
  color: rgba(255,255,255,0.75); line-height: 1.55;
}
.tie-modal-sub strong { color: #fff; }
.tie-modal-field {
  display: flex; align-items: center;
  justify-content: space-between; gap: 10px;
}
.tie-modal-label {
  font-family: 'Barlow Condensed', sans-serif;
  font-size: 10px; letter-spacing: 0.18em; text-transform: uppercase;
  color: rgba(255,255,255,0.45);
}
.tie-modal-orig {
  font-family: 'Barlow Condensed', sans-serif;
  font-size: 16px; font-weight: 700; color: rgba(255,255,255,0.55);
}
.tie-modal-input {
  width: 90px; background: rgba(255,255,255,0.07);
  border: 1px solid rgba(255,255,255,0.18); border-radius: 3px;
  padding: 6px 10px; color: #fff;
  /* 16px min: iOS Safari auto-zooms the page on focus of any input < 16px and
     never restores it (the "tie popup zooms in, have to zoom out" annoyance). */
  font-family: 'Barlow', sans-serif; font-size: 16px; font-weight: 600;
  text-align: right;
}
.tie-modal-input:focus { outline: none; border-color: var(--bid, #3FB6FF); }
.tie-modal-actions { display: flex; margin-top: 4px; }
.tie-modal-btn {
  flex: 1; font-family: 'Barlow Condensed', sans-serif;
  font-size: 11px; font-weight: 600; letter-spacing: 0.22em;
  text-transform: uppercase; border-radius: 3px; padding: 10px;
  cursor: pointer; border: none;
}
.tie-modal-btn.primary { background: var(--bid, #3FB6FF); color: #fff; }
.tie-modal-btn.primary:hover { background: rgba(63,182,255,0.82); }

/* ── Auction tie-break: dice roll overlay ────────────────────────────────── */
.dice-overlay {
  position: fixed; inset: 0;
  background: rgba(13,28,44,0.90);
  display: flex; align-items: center; justify-content: center;
  z-index: 400;
}
.dice-panel {
  background: var(--hull, #0D1C2C);
  border: 1px solid rgba(255,255,255,0.14);
  border-radius: 8px; padding: 28px 36px;
  display: flex; flex-direction: column; align-items: center; gap: 20px;
  min-width: 280px;
}
.dice-panel-hd {
  font-family: 'Barlow Condensed', sans-serif;
  font-size: 14px; font-weight: 700; letter-spacing: 0.2em;
  text-transform: uppercase; color: var(--bid, #3FB6FF);
}
.dice-row { display: flex; gap: 24px; align-items: flex-end; }
.dice-player { display: flex; flex-direction: column; align-items: center; gap: 8px; }
.dice-name {
  font-family: 'Barlow Condensed', sans-serif;
  font-size: 11px; letter-spacing: 0.14em; text-transform: uppercase;
  color: rgba(255,255,255,0.5);
}
/* T-dice-3d: real tumbling d6 — a CSS cube with pip faces. CSS transition
   (not gsap: modal contexts pause the gsap timeline). The cube's inline
   transform is set one frame after mount; this transition tumbles it onto
   the rolled face with a decelerating landing. */
.die3d-scene {
  width: 58px; height: 58px;
  perspective: 300px;
}
.die3d {
  width: 100%; height: 100%;
  position: relative;
  transform-style: preserve-3d;
  transition: transform 1.2s cubic-bezier(0.2, 0.7, 0.3, 1);
}
.die3d-face {
  position: absolute; inset: 0;
  background: #F4F1E8;
  border: 1px solid rgba(0,0,0,0.28);
  border-radius: 10px;
  display: grid;
  grid-template-rows: repeat(3, 1fr);
  grid-template-columns: repeat(3, 1fr);
  padding: 7px;
  backface-visibility: hidden;
  box-shadow: inset 0 0 10px rgba(0,0,0,0.12);
}
/* Cube assembly — opposite faces sum to 7 (1-6, 2-5, 3-4) */
.die3d-f1 { transform: translateZ(29px); }
.die3d-f6 { transform: rotateY(180deg) translateZ(29px); }
.die3d-f2 { transform: rotateX(90deg)  translateZ(29px); }
.die3d-f5 { transform: rotateX(-90deg) translateZ(29px); }
.die3d-f3 { transform: rotateY(90deg)  translateZ(29px); }
.die3d-f4 { transform: rotateY(-90deg) translateZ(29px); }

.die3d-face .pip {
  width: 9px; height: 9px; border-radius: 50%;
  background: #1A2B3C;
  align-self: center; justify-self: center;
}
/* Standard d6 pip layouts (3×3 grid: row / column) */
.die3d-f1 .pip:nth-child(1) { grid-area: 2 / 2; }
.die3d-f2 .pip:nth-child(1) { grid-area: 1 / 1; }
.die3d-f2 .pip:nth-child(2) { grid-area: 3 / 3; }
.die3d-f3 .pip:nth-child(1) { grid-area: 1 / 1; }
.die3d-f3 .pip:nth-child(2) { grid-area: 2 / 2; }
.die3d-f3 .pip:nth-child(3) { grid-area: 3 / 3; }
.die3d-f4 .pip:nth-child(1) { grid-area: 1 / 1; }
.die3d-f4 .pip:nth-child(2) { grid-area: 1 / 3; }
.die3d-f4 .pip:nth-child(3) { grid-area: 3 / 1; }
.die3d-f4 .pip:nth-child(4) { grid-area: 3 / 3; }
.die3d-f5 .pip:nth-child(1) { grid-area: 1 / 1; }
.die3d-f5 .pip:nth-child(2) { grid-area: 1 / 3; }
.die3d-f5 .pip:nth-child(3) { grid-area: 2 / 2; }
.die3d-f5 .pip:nth-child(4) { grid-area: 3 / 1; }
.die3d-f5 .pip:nth-child(5) { grid-area: 3 / 3; }
.die3d-f6 .pip:nth-child(1) { grid-area: 1 / 1; }
.die3d-f6 .pip:nth-child(2) { grid-area: 2 / 1; }
.die3d-f6 .pip:nth-child(3) { grid-area: 3 / 1; }
.die3d-f6 .pip:nth-child(4) { grid-area: 1 / 3; }
.die3d-f6 .pip:nth-child(5) { grid-area: 2 / 3; }
.die3d-f6 .pip:nth-child(6) { grid-area: 3 / 3; }

.dice-player.winner .die3d-scene {
  filter: drop-shadow(0 0 14px rgba(63,182,255,0.55));
}
.dice-player.winner .die3d-face {
  border-color: var(--bid, #3FB6FF);
}
@media (prefers-reduced-motion: reduce) {
  .die3d { transition: none !important; }
}
.dice-winner-label {
  font-family: 'Barlow Condensed', sans-serif;
  font-size: 9px; font-weight: 700; letter-spacing: 0.24em;
  text-transform: uppercase; color: var(--bid, #3FB6FF);
}
.dice-continue-btn {
  font-family: 'Barlow Condensed', sans-serif;
  font-size: 11px; font-weight: 600; letter-spacing: 0.22em;
  text-transform: uppercase; background: transparent;
  border: 1px solid rgba(255,255,255,0.22); color: rgba(255,255,255,0.65);
  border-radius: 3px; padding: 8px 28px; cursor: pointer;
}
.dice-continue-btn:hover { background: rgba(255,255,255,0.06); }

/* Bid input — white text, centered, white placeholder */
input.bid-input {
  text-align: center;
  color: #fff;
  flex: 1;
  background: transparent;
  border: none;
  outline: none;
  font-family: 'Barlow', sans-serif;
  font-weight: 600;
  font-size: 18px;
  line-height: 1;
  width: 0; /* flex: 1 handles width */
}
/* Hide number spinner so the typed value stays centred */
input.bid-input::-webkit-outer-spin-button,
input.bid-input::-webkit-inner-spin-button {
  -webkit-appearance: none;
  margin: 0;
}
input.bid-input[type=number] { -moz-appearance: textfield; }
input.bid-input::placeholder {
  color: rgba(255,255,255,0.75);
  text-align: center;
  font-size: 13px;
  font-weight: 400;
  letter-spacing: 0.02em;
}

/* T-bid-stepper: − / + buttons flanking the bid input, styled to MATCH the
   LOCK BID button (.lot-lock-btn) — cyan (--bid) outline on the navy bar, Barlow
   Condensed — so the bid controls read as one family. The native spinner stays
   hidden (above); these + the mouse-wheel on .bid-field.bidable are the controls. */
.bid-field.bidable { align-items: center; }     /* override the field's baseline */
.bid-stepper {
  display: flex;
  align-items: center;
  gap: 6px;
}
.bid-stepper input.bid-input {
  flex: 1 1 auto;
  width: auto;
  min-width: 0;
  padding: 3px 4px;
  background: transparent;
  border: 1px solid rgba(255,255,255,0.3);
  color: #fff;
  text-align: center;
  font-family: 'Barlow', sans-serif;
  font-weight: 600;
  font-variant-numeric: tabular-nums;
  font-size: 18px;
  line-height: 1;
}
.bid-step {
  flex: 0 0 auto;
  width: 30px;
  height: 28px;
  display: flex;
  align-items: center;
  justify-content: center;
  background: transparent;
  border: 1px solid var(--bid);          /* #3FB6FF — same as LOCK BID */
  color: var(--bid);
  font-family: 'Barlow Condensed', sans-serif;
  font-size: 20px;
  font-weight: 700;
  line-height: 1;
  cursor: pointer;
  user-select: none;
  -webkit-user-select: none;
  transition: background 0.12s ease;
}
.bid-step:hover { background: rgba(63,182,255,0.10); }   /* matches .lot-lock-btn:hover */
.bid-step:active { background: rgba(63,182,255,0.24); }

/* ── Deck Stacks Panel ───────────────────────────────────────────────────── */
.deck-stacks {
  display: flex;
  justify-content: space-around;
  align-items: flex-end;
  padding: 10px 8px 14px;
  background: var(--parch);
  border-bottom: 3px solid var(--blue);
  flex-shrink: 0;
}
.ds-tile {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 4px;
}
.ds-stack {
  position: relative;
  width: 34px;
  height: 46px;
}
/* Empty state — dark dashed outline on parchment */
.ds-card {
  position: absolute;
  width: 30px;
  height: 42px;
  border-radius: 3px;
  background: rgba(0,0,0,0.03);
  border: 1px dashed rgba(0,0,0,0.18);
  box-shadow: none;
}
/* Filled state — show the card back artwork */
.ds-tile.filled .ds-card {
  background: url("../assets/cards/backs/Card Back.png") center/cover no-repeat;
  border: 1px solid rgba(0,0,0,0.12);
  box-shadow: 0 2px 6px rgba(0,0,0,0.2);
}
.ds-card:nth-child(1) { bottom: 0;   left: 0;   transform: rotate(-4deg); }
.ds-card:nth-child(2) { bottom: 2px; left: 2px; transform: rotate(-1deg); }
.ds-card:nth-child(3) { bottom: 4px; left: 4px; transform: rotate(2deg);  }
.ds-label {
  font-family: 'Barlow Condensed', sans-serif;
  font-size: 7px;
  letter-spacing: 0.2em;
  text-transform: uppercase;
  color: rgba(0,0,0,0.45);
  text-align: center;
}
.ds-count {
  font-family: 'Barlow Condensed', sans-serif;
  font-size: 20px;
  font-weight: 700;
  line-height: 1;
  color: rgba(0,0,0,0.2);
}
.ds-tile.filled .ds-count { color: #1B6FC8; }
/* Pulse when a card is dealt from this stack */
@keyframes ds-pulse {
  0%   { transform: scale(1);    opacity: 1;   }
  50%  { transform: scale(1.1);  opacity: 0.7; }
  100% { transform: scale(1);    opacity: 1;   }
}
.ds-tile.dealing .ds-stack { animation: ds-pulse 320ms ease-out; }

/* ── T-event-actor-avatar ─────────────────────────────────────────────
   The acting player's avatar (their sprite on their coloured circle, mirroring
   the board .mc-avatar) shown inline before the name in an AI-event pop-up's
   "X played this event" line. Self-contained classes so it doesn't inherit the
   board-row layout. */
.cs-event-who-played-row {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 0.5rem;
  margin-bottom: 0.3rem;
}
.cs-event-who-played-row p {
  margin: 0;
}
.cs-event-avatar {
  position: relative;
  width: 44px;
  height: 44px;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  flex-shrink: 0;
}
.cs-event-avatar-dot {
  position: absolute;
  inset: 0;
  border-radius: 50%;
  box-shadow: 0 1px 4px rgba(0, 0, 0, 0.25);
}
.cs-event-avatar-sprite {
  position: relative;
  width: 38px;
  height: 38px;
  object-fit: contain;
  z-index: 1;
  image-rendering: -webkit-optimize-contrast;
}

/* ═══════════════════════════════════════════════════════════════════════════
   PURPOSE-BUILT MOBILE LAYOUT (≤900px) — Monopoly-Deal-style. Painted by
   js/ui.js _renderMobile() into #mobileGame. Dark HUD (status + opponent tiles)
   over a light play area (auction lot / compact neighbourhood cards), bottom
   hand strip + action bar. All classes are `m-`-prefixed and scoped to
   #mobileGame so nothing collides with the desktop dashboard. Desktop (>900px)
   is untouched — #mobileGame stays display:none.
   ═══════════════════════════════════════════════════════════════════════════ */
#mobileGame{display:none}
@media (max-width:900px){
  #gameScreen .app{display:none !important}
  /* Height MUST track the DYNAMIC (currently-visible) viewport, not the large one.
     #gameScreen is height:100vh and #mobileGame is position:absolute with no
     positioned ancestor, so `inset:0` sized it to the *large* iOS viewport (toolbars
     retracted). With Safari's bottom toolbar showing, the box's bottom sat BELOW the
     screen: the hand fell under the toolbar, .m-play had no scroll range (content fit
     the oversized box) so dragging down just rubber-banded back. Anchor top-only and
     use 100dvh — dvh shrinks/grows with the toolbar, so the box always == what's
     visible: hand reachable, .m-play scrolls. Plain 100vh kept only as an ancient
     fallback (== the old broken value, so no regression where dvh is unsupported). */
  #gameScreen #mobileGame{display:flex;position:absolute;top:0;left:0;right:0;
    height:100vh;height:100dvh;flex-direction:column;
    background:var(--hull);overflow:hidden;font-family:'Barlow',sans-serif;font-variant-numeric:tabular-nums}
}
/* ── dark HUD ── */
/* safe-area-inset-top resolves to 0 in Safari (non-PWA), so guarantee a minimum */
#mobileGame .m-hud{flex:0 0 auto;background:var(--hull);padding:max(env(safe-area-inset-top),14px) 11px 10px;color:#eaf1f8}
#mobileGame .m-top{display:flex;align-items:center;justify-content:space-between;gap:8px}
#mobileGame .m-cs{width:28px;height:28px;border-radius:7px;object-fit:contain;flex:0 0 auto}
#mobileGame .m-cs-txt{background:var(--bid);color:#06121f;display:flex;align-items:center;justify-content:center;font:700 12px 'Barlow Condensed',sans-serif}
/* event ticker (latest log entry; also auction win feedback) */
#mobileGame .m-ticker{flex:0 0 auto;display:flex;align-items:center;gap:7px;padding:6px 12px 8px;background:var(--hull);color:#cfe0ee;cursor:pointer;border-top:1px solid rgba(120,160,200,.10)}
#mobileGame .m-tk-dot{width:7px;height:7px;border-radius:50%;flex:0 0 auto}
#mobileGame .m-tk-msg{flex:1;min-width:0;font:600 10px/1.2 'Barlow',sans-serif;color:#cfe0ee;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
#mobileGame .m-tk-more{flex:0 0 auto;font:700 8px 'Barlow Condensed',sans-serif;letter-spacing:.1em;color:#6f8aa3}
#mobileGame .m-ticker.pulse{animation:mtkpulse .9s ease}
@keyframes mtkpulse{0%{background:color-mix(in srgb,var(--bid) 38%,var(--hull))}100%{background:var(--hull)}}
#mobileGame .m-lbl{font:600 8px 'Barlow Condensed',sans-serif;letter-spacing:.14em;color:#6f8aa3}
#mobileGame .m-val{font:700 13px 'Barlow Condensed',sans-serif;line-height:1}
#mobileGame .m-val .d{color:#5e7488}
#mobileGame .m-divv{width:1px;height:18px;background:rgba(120,160,200,.16)}
#mobileGame .m-actions{display:flex;align-items:center;gap:7px;background:#13273d;border:1px solid color-mix(in srgb,var(--bid) 40%,transparent);border-radius:9px;padding:5px 10px}
#mobileGame .m-adot{width:7px;height:7px;border-radius:50%;background:#2f4a63}
#mobileGame .m-adot.on{background:var(--bid)}
#mobileGame .m-endturn{background:var(--bid);color:#06121f;border:none;border-radius:8px;padding:6px 12px;font:700 11px 'Barlow Condensed',sans-serif;letter-spacing:.1em;cursor:pointer}
/* spectate (opponent's turn) HUD indicator + board header dot + note */
#mobileGame .m-watching{display:flex;align-items:center;gap:6px;background:#13273d;border:1px solid rgba(120,160,200,.2);border-radius:8px;padding:6px 11px;font:700 10px 'Barlow Condensed',sans-serif;letter-spacing:.08em;color:#cfe0ee}
#mobileGame .m-specdot{width:9px;height:9px;border-radius:50%;flex:0 0 auto;animation:mspecpulse 1.1s ease-in-out infinite}
@keyframes mspecpulse{0%,100%{opacity:1}50%{opacity:.45}}
#mobileGame .m-specnote{flex:0 0 auto;margin-top:2px;text-align:center;font:600 9.5px/1.4 'Barlow',sans-serif;color:#9a9181}
/* While spectating, your own dashboard + hand are visible but dimmed and inert. */
#mobileGame .m-specself{flex:0 0 auto;opacity:.4;pointer-events:none;filter:saturate(.85)}
#mobileGame .m-opps{display:flex;gap:6px;margin-top:9px}
#mobileGame .m-tile{flex:1;min-width:0;border-radius:10px;padding:7px 8px;display:flex;flex-direction:column;gap:4px;position:relative;background:#13273d;border:1px solid rgba(120,160,200,.14);cursor:pointer}
#mobileGame .m-tile:active{background:#18304a}
#mobileGame .m-tapv{position:absolute;top:6px;right:8px;font:700 7px 'Barlow Condensed',sans-serif;letter-spacing:.07em;color:#5e7488;text-transform:uppercase}
#mobileGame .m-tile.leader{background:#1c2438;border:1px solid #d98a2b99;box-shadow:0 0 0 1px #d98a2b33}
/* Active-turn ring: follows whoever is currently taking their action turn. Uses
   the mover's OWN player colour (via --turn, set inline on the active tile),
   matching the "X'S TURN" dot so the two read as the same person; a gentle pulse
   draws the eye. Distinct from the gold LEADER ring. Placed AFTER .leader so it
   wins when the mover is also leader. Falls back to cyan if --turn is unset. */
#mobileGame .m-tile.active{background:#132c3e;border:1px solid var(--turn,#38bdf8);box-shadow:0 0 0 2px color-mix(in srgb,var(--turn,#38bdf8) 33%,transparent),0 0 10px color-mix(in srgb,var(--turn,#38bdf8) 23%,transparent);animation:mTurnPulse 1.6s ease-in-out infinite}
@keyframes mTurnPulse{0%,100%{box-shadow:0 0 0 2px color-mix(in srgb,var(--turn,#38bdf8) 33%,transparent),0 0 8px color-mix(in srgb,var(--turn,#38bdf8) 18%,transparent)}50%{box-shadow:0 0 0 2px color-mix(in srgb,var(--turn,#38bdf8) 67%,transparent),0 0 14px color-mix(in srgb,var(--turn,#38bdf8) 36%,transparent)}}
#mobileGame .m-flag.turn{background:var(--turn,#38bdf8);color:#fff}
@media (prefers-reduced-motion:reduce){#mobileGame .m-tile.active{animation:none}}
/* LEADER badge sits IN the top-right corner (replacing 'board ›' on the leader
   tile) — no longer floats above the border. It's sized short enough to sit in
   the top strip ABOVE the name row, so the full name stays visible. */
#mobileGame .m-flag{position:absolute;top:5px;right:7px;background:#d98a2b;color:#1b1206;font:800 6px 'Barlow Condensed',sans-serif;letter-spacing:.05em;text-transform:uppercase;line-height:1;padding:2px 4px;border-radius:4px;z-index:1;white-space:nowrap}
#mobileGame .m-av{width:20px;height:20px;border-radius:6px;display:flex;align-items:center;justify-content:center;flex:0 0 auto;font:700 11px 'Barlow Condensed',sans-serif;color:#06121f}
/* T-mobile-sprites: real character sprites in the opponent tiles + self avatar.
   Sprite sits over the colored square (contain, feet at the base); the initial
   stays as a fallback if the sprite image fails to load (onerror removes it). */
#mobileGame .m-av{width:28px;height:28px;position:relative;overflow:hidden}
#mobileGame .m-selfav{position:relative;overflow:hidden}
#mobileGame .m-av-spr{position:absolute;left:0;right:0;bottom:0;width:100%;height:118%;object-fit:contain;object-position:center bottom;image-rendering:auto;pointer-events:none}
/* T-all-opponents: compact all-opponents board peek (every opponent's built
   locations on one scrollable sheet — no tapping between them). */
#mobileGame .m-allpeek{display:flex;flex-direction:column;gap:10px}
#mobileGame .m-allp-sec{background:#faf6ee;border:1px solid #e3dccd;border-radius:12px;padding:8px 10px}
#mobileGame .m-allp-head{display:flex;align-items:center;gap:8px;margin-bottom:8px}
#mobileGame .m-allp-name{font:700 14px 'Barlow Condensed',sans-serif;letter-spacing:.03em;color:#1c2836;flex:0 0 auto}
#mobileGame .m-allp-meta{font:600 10px 'Barlow Condensed',sans-serif;letter-spacing:.05em;color:#6b7480;margin-left:auto;text-align:right;white-space:nowrap}
#mobileGame .m-allp-hoods{display:grid;grid-template-columns:repeat(2,1fr);gap:6px}
#mobileGame .m-ahood{background:#fff;border:1px solid #e8e1d2;border-radius:8px;padding:5px 7px}
#mobileGame .m-ahood-top{display:flex;justify-content:space-between;align-items:baseline;margin-bottom:5px}
#mobileGame .m-ahcode{font:700 9px 'Barlow Condensed',sans-serif;letter-spacing:.12em;color:#8a93a0}
#mobileGame .m-ahvp{font:700 13px 'Barlow Condensed',sans-serif;color:#1c2836;line-height:1}
#mobileGame .m-ahvp .s{font-size:8px;color:#8a93a0}
#mobileGame .m-aslots{display:flex;flex-wrap:wrap;gap:3px}
#mobileGame .m-aslot{width:19px;height:25px;border-radius:3px;border:1.4px solid;background-size:cover;background-position:center top}
#mobileGame .m-aslot.empty{border-style:dashed;opacity:.55}
/* T-built-strip: cards already built in a neighbourhood, shown big-art at the top
   of the BUILD sheet (tap your own neighbourhood) so you can see them at a glance. */
#mobileGame .m-sheet-sub{font:700 9px 'Barlow Condensed',sans-serif;letter-spacing:.16em;text-transform:uppercase;color:#8a93a0;margin:12px 2px 7px}
#mobileGame .m-built-strip{display:flex;gap:8px;flex-wrap:wrap;margin-bottom:2px}
#mobileGame .m-built-card{position:relative;width:66px;height:88px;border-radius:8px;background-size:cover;background-position:center top;box-shadow:0 2px 8px rgba(8,16,30,.32);cursor:pointer;flex:0 0 auto;border:1px solid rgba(0,0,0,.08)}
#mobileGame .m-built-card:active{transform:scale(.96)}
#mobileGame .m-built-type{position:absolute;top:3px;left:3px;font:800 8px 'Barlow Condensed',sans-serif;color:#fff;padding:0 4px;border-radius:3px;line-height:14px}
/* T-wildcard-board: valid wildcard destination slots glow green + tappable */
#mobileGame .m-wild-target{border-width:2px !important;border-style:solid !important;cursor:pointer;position:relative;box-shadow:0 0 0 2px rgba(40,200,120,.35),0 0 10px rgba(40,200,120,.45);animation:mWildPulse 1.25s ease-in-out infinite}
#mobileGame .m-wild-target .m-wild-plus{position:absolute;top:0;right:3px;font:800 13px 'Barlow Condensed',sans-serif;color:#1c9c5e;line-height:1}
#mobileGame .m-hood-wildable{outline:1.5px solid rgba(40,200,120,.45);outline-offset:-1px}
#mobileGame .m-wild-dim{opacity:.4}
@keyframes mWildPulse{0%,100%{box-shadow:0 0 0 2px rgba(40,200,120,.35),0 0 8px rgba(40,200,120,.4)}50%{box-shadow:0 0 0 3px rgba(40,200,120,.6),0 0 15px rgba(40,200,120,.7)}}
#mobileGame .m-oname{font:700 12px/1 'Barlow Condensed',sans-serif;letter-spacing:.03em;color:#eaf1f8;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;flex:1}
#mobileGame .m-ovp{font:700 23px 'Barlow Condensed',sans-serif;color:#eaf1f8;line-height:.9}
#mobileGame .m-ovp .s{font-size:9px;color:#5e7488}
#mobileGame .m-obar{height:3px;background:#06101d;border-radius:2px;overflow:hidden}
#mobileGame .m-obar i{display:block;height:100%}
#mobileGame .m-ometa{display:flex;align-items:center;gap:7px;font:700 8.5px 'Barlow Condensed',sans-serif;color:#9fb6cc}
#mobileGame .m-ometa .cash{color:#cfe0ee}
#mobileGame .m-ic{display:inline-flex;align-items:center;gap:2px;font-weight:400}
#mobileGame .m-ic .b{width:8px;height:8px;border-radius:2px;background:#3f9d68}
#mobileGame .m-ic .h{width:7px;height:9px;border:1px solid #8aa3ba;border-radius:1px}
#mobileGame .m-orow{display:flex;align-items:center;justify-content:space-between;gap:4px}
#mobileGame .m-agenda{font:700 7px 'Barlow Condensed',sans-serif;letter-spacing:.09em;color:#7d93a8;text-transform:uppercase;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;flex:1}
#mobileGame .m-pill{font:700 7px 'Barlow Condensed',sans-serif;letter-spacing:.08em;padding:2px 5px;border-radius:4px;flex:0 0 auto}
#mobileGame .m-pill.locked{background:#123a2c;color:#4fd6a0;border:1px solid #1f6b4f}
#mobileGame .m-pill.bidding{background:#2b2114;color:#e6b260;border:1px solid #6b5326}
/* ── light play area ── */
#mobileGame .m-play{flex:1;min-height:0;position:relative;background:#ece5d8;border-radius:20px 20px 0 0;box-shadow:0 -10px 30px rgba(0,0,0,.34);display:flex;flex-direction:column;padding:13px 12px calc(10px + env(safe-area-inset-bottom,0px));gap:9px;overflow-y:auto;-webkit-overflow-scrolling:touch;overscroll-behavior-y:contain}
#mobileGame .m-sechead{display:flex;align-items:flex-end;justify-content:space-between;flex:0 0 auto}
#mobileGame .m-sectitle{font:700 14px 'Barlow Condensed',sans-serif;letter-spacing:.04em;color:#1c2836}
#mobileGame .m-secsub{font:600 8px 'Barlow Condensed',sans-serif;letter-spacing:.1em;color:#8a93a0;text-transform:uppercase}
#mobileGame .m-acc{color:var(--bid)}
#mobileGame .m-peek{display:flex;align-items:center;gap:4px;padding:5px 9px;border-radius:8px;font:700 8.5px 'Barlow Condensed',sans-serif;letter-spacing:.07em;cursor:pointer;background:color-mix(in srgb,var(--bid) 12%,transparent);border:1px solid color-mix(in srgb,var(--bid) 45%,transparent);color:var(--bid)}
#mobileGame .m-peek-ag{background:color-mix(in srgb,#f5c542 16%,transparent);border-color:color-mix(in srgb,#f5c542 55%,transparent);color:#d9a323}
#mobileGame .m-agbtn{cursor:pointer;border-radius:8px;padding:2px 4px;margin:-2px -4px;transition:background .12s}
#mobileGame .m-agbtn:active{background:rgba(0,0,0,.05)}
#mobileGame .m-lots{font:700 8.5px 'Barlow Condensed',sans-serif;letter-spacing:.12em;color:var(--bid)}
#mobileGame .m-queue{display:flex;align-items:flex-start;gap:6px;flex:0 0 auto}
#mobileGame .m-qitem{flex:1;min-width:0;display:flex;flex-direction:column;align-items:stretch;gap:4px;cursor:pointer}
#mobileGame .m-qcard{width:100%;aspect-ratio:3/4;border-radius:8px;position:relative;overflow:hidden;background-size:cover;background-position:center;background-color:#2a3a4a;box-shadow:0 1px 3px rgba(20,30,45,.22);opacity:.82}
#mobileGame .m-qcard.sel{opacity:1;box-shadow:0 0 0 2px var(--bid),0 6px 14px rgba(20,30,45,.3)}
#mobileGame .m-qnum{position:absolute;left:4px;top:3px;font:700 8px 'Barlow Condensed',sans-serif;letter-spacing:.06em;color:#fff;text-shadow:0 1px 2px rgba(0,0,0,.6)}
#mobileGame .m-qlabel{font:700 8px 'Barlow Condensed',sans-serif;letter-spacing:.02em;text-align:center;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
#mobileGame .m-nhchip{position:absolute;top:6px;right:6px;display:flex;align-items:center;gap:3px;background:rgba(10,18,30,.62);color:#fff;font:700 7.5px 'Barlow Condensed',sans-serif;letter-spacing:.07em;padding:2px 6px;border-radius:5px;text-transform:uppercase;white-space:nowrap}
#mobileGame .m-nhchip .pin{width:5px;height:5px;border-radius:50%;background:var(--bid);flex:0 0 auto}
#mobileGame .m-nhchip.sm{top:4px;right:4px;font-size:7px;padding:1px 4px;gap:2px}
#mobileGame .m-hoodloc{font:700 8px 'Barlow Condensed',sans-serif;letter-spacing:.08em;color:#9a9181;text-transform:uppercase;display:flex;align-items:center;gap:3px}
#mobileGame .m-hoodloc .pin{width:5px;height:5px;border-radius:50%;background:var(--bid)}
#mobileGame .m-focus{background:#fffefb;border:1px solid #e3dccd;border-radius:13px;padding:10px;box-shadow:0 2px 6px rgba(20,30,45,.07);display:flex;gap:11px;flex:0 0 auto}
#mobileGame .m-hero{width:140px;flex:0 0 auto;border-radius:10px;position:relative;overflow:hidden;box-shadow:0 3px 10px rgba(20,30,45,.3);background-size:cover;background-position:center;background-color:#2a3a4a;aspect-ratio:3/4}
#mobileGame .m-hero .lot{position:absolute;left:9px;top:8px;font:700 9px 'Barlow Condensed',sans-serif;letter-spacing:.12em;color:#fff;text-shadow:0 1px 2px rgba(0,0,0,.6)}
#mobileGame .m-hero .nm{position:absolute;left:9px;right:9px;bottom:9px;font:700 16px/1.02 'Barlow Condensed',sans-serif;color:#fff;text-shadow:0 1px 4px rgba(0,0,0,.6)}
#mobileGame .m-fcol{flex:1;min-width:0;display:flex;flex-direction:column;gap:8px}
#mobileGame .m-fname{font:700 18px/1 'Barlow Condensed',sans-serif;color:#1c2836}
#mobileGame .m-catchip{display:inline-flex;align-items:center;font:700 8.5px/1 'Barlow Condensed',sans-serif;letter-spacing:.1em;text-transform:uppercase;padding:3px 7px;border-radius:5px}
#mobileGame .m-value{font:700 17px 'Barlow Condensed',sans-serif;color:#2f9e6a}
#mobileGame .m-stepper{display:flex;gap:6px;align-items:stretch}
#mobileGame .m-stepper button{width:36px;background:#f3eee3;border:1px solid #d9d2c2;border-radius:8px;color:#1c2836;font:700 20px 'Barlow Condensed',sans-serif;cursor:pointer}
#mobileGame .m-bidbox{flex:1;background:#f3eee3;border:1px solid #d9d2c2;border-radius:8px;display:flex;align-items:center;justify-content:center;gap:6px;padding:4px}
#mobileGame .m-bidbox .k{font:600 7.5px 'Barlow Condensed',sans-serif;letter-spacing:.14em;color:#8a93a0}
#mobileGame .m-bidbox .v{font:700 19px 'Barlow Condensed',sans-serif;color:#1c2836;line-height:1}
#mobileGame .m-lockbtn{padding:11px;border-radius:9px;font:700 12px 'Barlow Condensed',sans-serif;letter-spacing:.14em;cursor:pointer;border:1px solid var(--bid);background:var(--bid);color:#fff}
#mobileGame .m-lockbtn.done{background:#e7f5ef;color:#1f8a5f;border-color:#9fd9be}
#mobileGame .m-pips{display:flex;align-items:center;justify-content:center;gap:5px}
#mobileGame .m-pip{width:15px;height:15px;border-radius:5px;display:flex;align-items:center;justify-content:center;font:700 8.5px 'Barlow Condensed',sans-serif;color:#fff}
#mobileGame .m-pip.empty{background:#f0eadd;border:1px solid #d6cdba;color:#a59c8a}
#mobileGame .m-pipnote{font:600 7px 'Barlow Condensed',sans-serif;letter-spacing:.1em;color:#8a93a0;margin-left:2px}
/* neighbourhoods grid */
/* natural-height rows so cards never overflow onto the self-strip (.m-play scrolls) */
#mobileGame .m-hoods{flex:0 0 auto;display:grid;grid-template-columns:1fr 1fr;grid-auto-rows:auto;gap:9px}
#mobileGame .m-hood{background:#fffefb;border:1px solid #e3dccd;border-radius:13px;padding:9px;display:flex;flex-direction:column;gap:7px;cursor:pointer;box-shadow:0 2px 6px rgba(20,30,45,.07)}
#mobileGame .m-hood.locked{border-color:#e0c48a;box-shadow:0 0 0 1px #e0c48a55,0 2px 6px rgba(20,30,45,.07)}
#mobileGame .m-hood-top{display:flex;align-items:flex-start;justify-content:space-between;gap:5px}
#mobileGame .m-hname{font:700 13px/1 'Barlow Condensed',sans-serif;letter-spacing:.02em;color:#1c2836;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
#mobileGame .m-hcode{font:600 8px 'Barlow Condensed',sans-serif;letter-spacing:.09em;color:#9a9181;margin-top:2px}
#mobileGame .m-hvp{font:700 15px 'Barlow Condensed',sans-serif;color:#2f9e6a;line-height:1}
#mobileGame .m-hvplbl{font:600 7px 'Barlow Condensed',sans-serif;letter-spacing:.1em;color:#9a9181}
#mobileGame .m-slots{display:flex;gap:4px}
#mobileGame .m-slot{flex:1;aspect-ratio:3/4;border-radius:5px;position:relative;overflow:hidden}
#mobileGame .m-slot.filled{box-shadow:0 1px 3px rgba(20,30,45,.25);background-size:cover;background-position:center}
#mobileGame .m-slot.filled .sl{position:absolute;left:2px;top:2px;font:700 7px 'Barlow Condensed',sans-serif;color:#fff;padding:0 3px;border-radius:3px;line-height:13px}
#mobileGame .m-slot.empty{display:flex;align-items:center;justify-content:center;background:rgba(255,255,255,.5)}
#mobileGame .m-slot.empty .sl{font:700 11px 'Barlow Condensed',sans-serif}
#mobileGame .m-hbottom{margin-top:auto;display:flex;align-items:center;justify-content:space-between}
#mobileGame .m-cats{display:flex;gap:6px}
#mobileGame .m-cat{display:flex;align-items:center;gap:2px}
#mobileGame .m-cdot{width:8px;height:8px;border-radius:2px}
#mobileGame .m-ccount{font:700 8px 'Barlow Condensed',sans-serif;color:#6b7787}
#mobileGame .m-lmkflag{font:700 7px 'Barlow Condensed',sans-serif;letter-spacing:.06em;color:#c07d1f;border:1px solid #e0c48a;border-radius:3px;padding:1px 4px;background:#f7efdc}
#mobileGame .m-plus{width:17px;height:17px;border-radius:50%;display:flex;align-items:center;justify-content:center;font-size:13px;line-height:1;background:var(--bid);color:#fff;margin-left:6px}
/* self strip */
#mobileGame .m-self{background:#fffefb;border:1px solid #e3dccd;border-radius:13px;padding:9px 11px;box-shadow:0 2px 6px rgba(20,30,45,.07);display:flex;align-items:center;gap:11px;flex:0 0 auto}
#mobileGame .m-selfav{width:28px;height:28px;border-radius:8px;display:flex;align-items:center;justify-content:center;font:700 15px 'Barlow Condensed',sans-serif;flex:0 0 auto;background:var(--bid);color:#fff}
#mobileGame .m-selfvp{font:700 25px 'Barlow Condensed',sans-serif;color:#1c2836;line-height:.95}
#mobileGame .m-selfvp .s{font-size:11px;color:#a59c8a}
#mobileGame .m-selfbar{width:78px;height:4px;background:#e7e0d2;border-radius:2px;margin-top:3px;overflow:hidden}
#mobileGame .m-selfbar i{display:block;height:100%;background:var(--bid)}
#mobileGame .m-vdiv{width:1px;height:34px;background:#e3dccd}
#mobileGame .m-agtitle{font:700 8px 'Barlow Condensed',sans-serif;letter-spacing:.1em;color:#c07d1f;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
#mobileGame .m-agnext{font:600 10px/1.15 'Barlow',sans-serif;color:#6b7787;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
/* hand */
#mobileGame .m-handwrap{flex:0 0 auto}
#mobileGame .m-hand-head{display:flex;align-items:center;justify-content:space-between;margin-bottom:5px}
#mobileGame .m-hand-title{font:700 9px 'Barlow Condensed',sans-serif;letter-spacing:.13em;color:#6b7787}
#mobileGame .m-handcount{font:700 9px 'Barlow Condensed',sans-serif;color:#a59c8a}
#mobileGame .m-handcount .s{color:#c4bba6}
#mobileGame .m-hand{display:flex;gap:7px;overflow-x:auto;-webkit-overflow-scrolling:touch;touch-action:pan-x;overscroll-behavior-x:contain;scroll-padding-right:16px;padding:3px 16px 9px 1px}
#mobileGame .m-hand::-webkit-scrollbar{height:0}
#mobileGame .m-hcard{flex:0 0 auto;width:62px;border-radius:9px;overflow:hidden;background:#fffefb;border:1px solid #e3dccd;box-shadow:0 1px 3px rgba(20,30,45,.1)}
#mobileGame .m-hcard.playable{border:1px solid var(--bid);box-shadow:0 0 0 2px color-mix(in srgb,var(--bid) 33%,transparent),0 6px 14px color-mix(in srgb,var(--bid) 20%,transparent);cursor:pointer}
#mobileGame .m-hcard.dim{background:#f3eee3;opacity:.7;cursor:pointer}
#mobileGame .m-hart{height:54px;position:relative;background-size:cover;background-position:center;background-color:#2a3a4a}
#mobileGame .m-mag{position:absolute;top:3px;right:3px;width:15px;height:15px;border-radius:50%;background:rgba(255,255,255,.92);color:#0e8fc4;font-size:10px;display:flex;align-items:center;justify-content:center}
#mobileGame .m-htext{padding:5px 6px 6px}
#mobileGame .m-hname2{font:700 8.5px/1.1 'Barlow Condensed',sans-serif;color:#1c2836;text-transform:uppercase;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
#mobileGame .m-htype{font:700 7.5px 'Barlow Condensed',sans-serif;letter-spacing:.06em;color:#9a9181;margin-top:1px}
/* secondary "Pass this lot" action under LOCK BID (replaces the old auction footer) */
#mobileGame .m-passlink{width:100%;margin-top:7px;padding:6px 0;border-radius:8px;cursor:pointer;background:transparent;border:1px solid #e0d9c9;color:#8a93a0;font:700 9px 'Barlow Condensed',sans-serif;letter-spacing:.1em;text-transform:uppercase}
#mobileGame .m-passlink:active{background:#f3eee3}
#mobileGame .m-passlink:disabled{opacity:.4;cursor:default}
/* card zoom modal on phones — show the FULL card art (art is the lead) + go bigger.
   Must be media-gated: these are body-level selectors (not #mobileGame-scoped). */
@media (max-width:900px){
  .zoomed-card{max-width:min(94vw,400px) !important}
  .zoom-art{max-height:none !important}
  .zoom-art img{height:auto !important;object-fit:contain}
  /* event/appeal modal: keep the CONTINUE button reachable. iOS Safari's `vh`
     uses the URL-bar-hidden viewport, so 90vh overflows the visible area and
     clips the button → frozen game. svh = the small (URL-bar-shown) viewport. */
  .cs-event-modal{max-height:88svh !important}
  /* show the WHOLE card (contain, no bottom crop) on a soft backdrop instead of
     cover-cropping it to fill the capped height. */
  .cs-event-modal .event-card-preview{background:#0e1f30 !important}
  .cs-event-modal .event-card-preview img{max-height:46svh !important;object-fit:contain !important;object-position:center !important}
  /* General event-card art (Revenue Collection, choice modals, etc. — anything
     NOT using the cs-event-modal hero layout). The base is a fixed 220×300 box
     with object-fit:cover that crops the card; show the full card instead. */
  .event-card-preview{width:auto !important;max-width:min(82vw,300px) !important;height:auto !important;margin:0 auto 12px !important;background:#0e1f30 !important;border-radius:12px !important}
  .event-card-preview img{width:100% !important;height:auto !important;max-height:42svh !important;object-fit:contain !important}
  /* Bring the opponent-event reveal in line with the mobile card popup
     (_mCardOverlay): cream card, no loud blue border, subtle type chip, tan
     CONTINUE button instead of a blue text-link. */
  .cs-event-modal{background:#fffefb !important;border:none !important;border-radius:16px !important;box-shadow:0 24px 60px rgba(0,0,0,.5) !important}
  /* Kill the chunky white border: the modal itself was padded (1.2rem 1rem from
     the generic .event-modal mobile rule) AND the art was capped at 300px, so the
     card floated in a white frame. Zero the modal padding (the body sections keep
     their own) and let the art sit edge-to-edge on the dark hero panel. The
     .event-modal double-class beats the single-class padding rule. */
  .cs-event-modal.event-modal{padding:0 !important}
  .cs-event-modal .event-card-preview{width:100% !important;max-width:none !important;margin:0 !important;border-radius:16px 16px 0 0 !important;background:#0a1626 !important;overflow:hidden !important}
  /* CONTAIN, not cover: the card art is 3:4 (tall) but this hero box is short and
     wide (height capped at 46svh so the CONTINUE button stays reachable). cover
     filled the width and cropped ~half the card off top+bottom — players couldn't
     see the full art. contain shows the WHOLE card, centred on the dark panel with
     slim side margins. (This overrides the earlier contain rule ~20 lines up; both
     now agree — keep them in sync if you touch either.) */
  .cs-event-modal .event-card-preview img{width:100% !important;height:46svh !important;max-height:46svh !important;object-fit:contain !important;object-position:center !important;border-radius:16px 16px 0 0 !important}
  .cs-event-modal .cs-type-pill{background:rgba(255,255,255,.93) !important;color:#33404f !important;font-size:8.5px !important;letter-spacing:.12em !important;padding:3px 9px !important;border-radius:6px !important;box-shadow:0 2px 9px rgba(0,0,0,.3) !important}
  .cs-event-modal .cs-modal-title-zone h2{color:#1c2836 !important}
  .cs-event-modal .modal-actions{margin:10px 16px 8px !important}
  .cs-event-modal .cs-btn{border:1px solid #d9d2c2 !important;border-top:1px solid #d9d2c2 !important;background:#f3eee3 !important;color:#6b7787 !important;border-radius:8px !important;padding:11px 14px !important;letter-spacing:.1em !important}
  .cs-event-modal .cs-btn:hover{background:#ece5d6 !important}
}
/* overlays */
/* position:fixed (not absolute) so bottom sheets anchor to the VISIBLE viewport,
   not #mobileGame's larger box — otherwise iOS Safari's URL bar pushes the lower
   rows below the fold (the "Property Market shows nothing" report).
   AND: height 100svh/100dvh so the sheet pins to the VISIBLE bottom — after
   iOS toolbar collapse/expand cycles mid-game, the layout-viewport bottom
   (inset:0) drifts below the screen and open sheets sank below the fold
   (the "bottom pop ups can't be viewed" report). height wins over inset's
   implied bottom; dvh tracks the toolbars live, svh is the fallback. */
#mobileGame .m-ov{position:fixed;inset:0;height:100svh;height:100dvh;display:flex;flex-direction:column;justify-content:flex-end;z-index:50;background:rgba(18,28,40,.55)}
#mobileGame .m-sheet{background:#fffefb;border-radius:20px 20px 0 0;padding:14px 13px calc(16px + env(safe-area-inset-bottom,0px));box-shadow:0 -10px 30px rgba(0,0,0,.28)}
#mobileGame .m-sheet-head{display:flex;align-items:flex-start;justify-content:space-between;margin-bottom:11px}
#mobileGame .m-sheet-kick{font:600 8.5px 'Barlow Condensed',sans-serif;letter-spacing:.13em;color:#8a93a0;text-transform:uppercase}
#mobileGame .m-sheet-title{font:700 20px/1 'Barlow Condensed',sans-serif;color:#1c2836;margin-top:3px}
#mobileGame .m-x{width:30px;height:30px;border-radius:9px;background:#f3eee3;border:1px solid #d9d2c2;color:#6b7787;font-size:14px;cursor:pointer}
#mobileGame .m-peekgrid{display:grid;grid-template-columns:1fr 1fr;gap:9px}
#mobileGame .m-sheet-note{margin-top:11px;font:600 9.5px/1.4 'Barlow',sans-serif;color:#9a9181;text-align:center}
/* market chip (replaces the old BUY action-bar button) */
#mobileGame .m-peek-mkt{background:color-mix(in srgb,#2f9e6a 14%,transparent);border-color:color-mix(in srgb,#2f9e6a 50%,transparent);color:#2f8e60}
/* burn chip (first-lot auction burn-for-money) */
#mobileGame .m-peek-burn{background:color-mix(in srgb,#d4600a 16%,transparent);border-color:color-mix(in srgb,#d4600a 55%,transparent);color:#d4600a}
#mobileGame .m-burnbtn{background:#d4600a !important;color:#fff !important;border-color:#d4600a !important}
/* pay-or-forfeit decision sheet (mandatory — no dismiss) */
#mobileGame .m-fft-pay{display:block;width:100%;padding:12px 14px;border-radius:11px;border:1px solid #2bb673;background:#eafaf1;color:#187a4c;font:700 13px 'Barlow Condensed',sans-serif;letter-spacing:.05em;text-align:left;cursor:pointer;margin:8px 0 2px}
#mobileGame .m-fft-pay .bal{display:block;font:600 10px 'Barlow',sans-serif;color:#4a8f6d;letter-spacing:0;margin-top:2px}
#mobileGame .m-fft-nopay{padding:10px 12px;border-radius:10px;background:#fbeeec;border:1px solid #e4b2ac;color:#a8362d;font:600 11px/1.4 'Barlow',sans-serif;margin:8px 0 2px}
#mobileGame .m-fft-card{display:flex;align-items:center;gap:10px;padding:8px;border-radius:11px;border:1.4px solid #e3dccd;background:#fffefb;margin-top:7px;cursor:pointer}
#mobileGame .m-fft-card.selected{border-color:var(--bid,#3FB6FF);box-shadow:0 0 0 2px color-mix(in srgb,var(--bid,#3FB6FF) 30%,transparent)}
#mobileGame .m-fft-tick{flex:0 0 22px;text-align:center;color:var(--bid,#3FB6FF);font:800 15px 'Barlow',sans-serif}
#mobileGame .m-fftconfirm{display:block;width:100%;margin-top:11px;padding:13px;border-radius:12px;border:none;background:#a8362d;color:#fff;font:700 13px 'Barlow Condensed',sans-serif;letter-spacing:.09em;cursor:pointer}
#mobileGame .m-fftconfirm:disabled{background:#d8d2c4;color:#9a9181;cursor:default}
/* board-view target picker: opponent boards with takeable locations glowing */
#mobileGame .m-tscroll{max-height:58svh;overflow-y:auto;display:flex;flex-direction:column;gap:10px;margin:2px -2px;padding:0 2px}
#mobileGame .m-tboard{background:#fffefb;border:1px solid #e3dccd;border-radius:13px;padding:9px 10px;box-shadow:0 2px 6px rgba(20,30,45,.07)}
#mobileGame .m-tboard-head{display:flex;align-items:center;gap:6px;font:700 12px 'Barlow Condensed',sans-serif;letter-spacing:.02em;color:#1c2836;margin-bottom:7px}
#mobileGame .m-tboard-meta{margin-left:auto;font:700 8.5px 'Barlow Condensed',sans-serif;letter-spacing:.06em;color:#9a9181}
#mobileGame .m-thoods{display:grid;grid-template-columns:1fr 1fr;gap:7px}
#mobileGame .m-thood{background:#f7f3ea;border-radius:8px;padding:5px 6px}
#mobileGame .m-thood-name{font:700 7.5px 'Barlow Condensed',sans-serif;letter-spacing:.1em;color:#9a9181;margin-bottom:3px}
#mobileGame .m-tslots{display:flex;gap:3px;align-items:center}
#mobileGame .m-tslot{flex:1;aspect-ratio:3/4;border-radius:4px;background-size:cover;background-position:center}
#mobileGame .m-tslot.empty{background:rgba(20,30,45,.05);border:1px dashed rgba(20,30,45,.12)}
#mobileGame .m-tslot.dim{opacity:.32;filter:grayscale(.4)}
#mobileGame .m-tslot.tgt{position:relative;transform:scale(1.18);cursor:pointer;border-radius:5px;animation:mtgtpulse 1.3s ease-in-out infinite;z-index:1}
#mobileGame .m-tslot.tgt:active{transform:scale(1.08)}
#mobileGame .m-tslot.tgt.sel{animation:none}
#mobileGame .m-tslot-tick{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;background:rgba(224,112,58,.34);border-radius:5px;color:#fff;font:800 15px 'Barlow Condensed',sans-serif;text-shadow:0 1px 3px rgba(0,0,0,.6)}
/* Revenue Collection debt sheet */
#mobileGame .m-debttotal{font:800 22px 'Barlow Condensed',sans-serif;color:#a23b2d;margin:2px 0 6px;letter-spacing:.02em}
#mobileGame .m-debttotal.ok{color:#2f7d3f}
#mobileGame .m-debttotal span{font-size:14px;color:#8a93a0;font-weight:700}
#mobileGame .m-debtrow{display:flex;gap:8px;flex-wrap:wrap;margin-bottom:4px}
#mobileGame .m-debtbill{min-width:46px;height:44px;display:flex;align-items:center;justify-content:center;border-radius:8px;background:#eef4ec;border:2px solid #cfe0d2;color:#2f7d3f;font:800 14px 'Barlow Condensed',sans-serif;cursor:pointer}
#mobileGame .m-debtbill.sel{background:#2f7d3f;border-color:#2f7d3f;color:#fff}
#mobileGame .m-debtcard{position:relative;width:44px;height:59px;border-radius:7px;background-size:cover;background-position:center;background-color:#0a1626;cursor:pointer;flex:0 0 auto;box-shadow:0 1px 4px rgba(20,30,45,.25)}
#mobileGame .m-debtcard.sel{outline:3px solid #e0703a;outline-offset:1px}
#mobileGame .m-debtval{position:absolute;bottom:0;left:0;right:0;text-align:center;color:#fff;font:800 8px 'Barlow Condensed',sans-serif;padding:1px 0;border-radius:0 0 7px 7px}
@keyframes mtgtpulse{0%,100%{filter:brightness(1)}50%{filter:brightness(1.12)}}
/* activity-log sheet */
#mobileGame .m-loglist{max-height:48vh;overflow-y:auto;display:flex;flex-direction:column}
#mobileGame .m-logrow{display:flex;align-items:center;gap:8px;padding:7px 3px;border-bottom:1px solid #efe9dc}
#mobileGame .m-logbar{width:3px;align-self:stretch;min-height:16px;border-radius:2px;flex:0 0 auto}
#mobileGame .m-logmsg{flex:1;min-width:0;font:500 11px/1.3 'Barlow',sans-serif;color:#2b3440}
#mobileGame .m-logrd{flex:0 0 auto;font:700 8px 'Barlow Condensed',sans-serif;letter-spacing:.08em;color:#a59c8a}
#mobileGame .m-soundtog{padding:6px 9px;border-radius:8px;background:#f3eee3;border:1px solid #d9d2c2;color:#6b7787;font:700 9px 'Barlow Condensed',sans-serif;letter-spacing:.05em;cursor:pointer;white-space:nowrap}
#mobileGame .m-buildrow{display:flex;align-items:center;gap:10px;background:#faf6ee;border:1px solid #e7e0d2;border-radius:11px;padding:8px 10px;margin-bottom:8px}
#mobileGame .m-buildart{width:36px;height:48px;flex:0 0 auto;border-radius:6px;background-size:cover;background-position:center;background-color:#2a3a4a;box-shadow:0 1px 3px rgba(20,30,45,.25)}
#mobileGame .m-buildname{font:700 13px 'Barlow Condensed',sans-serif;letter-spacing:.02em;color:#1c2836;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
#mobileGame .m-buildmeta{font:700 8.5px 'Barlow Condensed',sans-serif;letter-spacing:.06em;color:#8a93a0;text-transform:uppercase;display:flex;align-items:center;margin-top:2px}
#mobileGame .m-buildmeta .m-cdot{display:inline-block}
#mobileGame .m-buildbtn{flex:0 0 auto;font:700 10px 'Barlow Condensed',sans-serif;letter-spacing:.1em;padding:8px 16px;border-radius:8px;cursor:pointer;background:var(--bid);color:#fff;border:1px solid var(--bid)}
#mobileGame .m-buildbtn.dim{background:#ece5d8;color:#a59c8a;border-color:#d9d2c2;cursor:default}
#mobileGame .m-sheet{max-height:82svh;overflow-y:auto}
/* Same visible-viewport anchoring as .m-ov: fixed + svh/dvh so the centered
   location popup stays fully on screen regardless of iOS toolbar state. */
/* Anchor top-only + height:100dvh (NOT inset:0): on iOS `inset:0` sizes a fixed
   box to the LARGE viewport, so with the toolbar/URL-bar showing the overlay is
   taller than the screen and the centred card's TOP gets pushed off the top edge
   → card art clipped. dvh == the visible viewport, so the card sits fully on
   screen. Centre via margin:auto + overflow-y:auto (NOT align-items:center): a
   flex-centred child that's ever taller than the container clips its top
   UNREACHABLY; margin:auto centres when it fits and stays scrollable when it
   doesn't, so the card top is always reachable. */
#mobileGame .m-zoomov{position:fixed;top:0;left:0;right:0;height:100svh;height:100dvh;display:flex;overflow-y:auto;-webkit-overflow-scrolling:touch;z-index:60;padding:24px;background:rgba(10,18,30,.72)}
#mobileGame .m-zoomcard{position:relative;width:208px;max-height:88%;margin:auto;overflow:auto;background:#fffefb;border-radius:16px;box-shadow:0 24px 60px rgba(0,0,0,.5)}
#mobileGame .m-zoomart{width:100%;aspect-ratio:3/4;background-size:cover;background-position:center;background-color:#0a1626}
/* Close is a compact ✕ over the art corner (freed the full CLOSE pill row — the
   backdrop also closes on tap). Sits on the art so it's always at the card top. */
#mobileGame .m-zoomx{position:absolute;top:8px;right:8px;z-index:3;width:32px;height:32px;border-radius:50%;border:none;background:rgba(10,18,30,.55);color:#fff;font:400 14px/1 system-ui,sans-serif;display:flex;align-items:center;justify-content:center;cursor:pointer;backdrop-filter:blur(2px);box-shadow:0 1px 6px rgba(0,0,0,.35)}
#mobileGame .m-zoomx:active{background:rgba(10,18,30,.75)}
#mobileGame .m-zoombody{padding:12px 13px 13px}
#mobileGame .m-zoomname{font:700 19px/1.05 'Barlow Condensed',sans-serif;color:#1c2836;margin-top:7px}
#mobileGame .m-zoomeffect{font:500 12.5px/1.5 'Barlow',sans-serif;color:#374253;margin-top:8px}
#mobileGame .m-info-hint{color:var(--bid,#3fb6ff);font-weight:700}
/* Deck-count subline: dark + larger than the default section subtitle so it's legible on the cream panel */
#mobileGame .m-decksub{font:600 11px 'Barlow Condensed',sans-serif;letter-spacing:.03em;color:#33404f;text-transform:uppercase;margin-top:2px}
#mobileGame .m-decksub .m-deckn b{color:#111a24;font-weight:800}
/* "Affecting you" — active card effects on the human, so a limited turn is never a mystery */
#mobileGame .m-effbar{margin:7px 8px 0;padding:8px 9px;background:#141d2b;border:1px solid #263349;border-radius:11px}
#mobileGame .m-eff-hd{font:800 8.5px 'Barlow Condensed',sans-serif;letter-spacing:.14em;text-transform:uppercase;color:#8a93a0;margin-bottom:6px}
#mobileGame .m-eff{display:flex;align-items:center;gap:8px;padding:6px;border-radius:8px;margin-top:5px;background:#1b2636}
#mobileGame .m-eff:first-of-type{margin-top:0}
#mobileGame .m-eff.neg{border-left:3px solid #e0703a}
#mobileGame .m-eff.pos{border-left:3px solid #3fb67a}
#mobileGame .m-eff-art{width:26px;height:35px;flex:0 0 auto;border-radius:5px;background-size:cover;background-position:center;background-color:#0a1626}
#mobileGame .m-eff-ic{width:26px;height:35px;flex:0 0 auto;border-radius:5px;display:flex;align-items:center;justify-content:center;font:800 15px 'Barlow Condensed',sans-serif;background:#0a1626}
#mobileGame .m-eff.neg .m-eff-ic{color:#e0703a}
#mobileGame .m-eff.pos .m-eff-ic{color:#3fb67a}
#mobileGame .m-eff-txt{min-width:0;flex:1}
#mobileGame .m-eff-lbl{font:800 11px 'Barlow Condensed',sans-serif;letter-spacing:.08em;text-transform:uppercase;color:#eef3f8}
#mobileGame .m-eff-dur{font:500 11px/1.35 'Barlow',sans-serif;color:#aeb8c6;margin-top:1px}
#mobileGame .m-zoomdesc{font:500 11px/1.4 'Barlow',sans-serif;color:#44505f;margin-top:7px}
#mobileGame .m-zoombtns{display:flex;flex-direction:column;gap:6px;margin-top:10px}
#mobileGame .m-zoomplay{flex:1;padding:9px;border-radius:8px;font:700 11px 'Barlow Condensed',sans-serif;letter-spacing:.12em;cursor:pointer;background:var(--bid);color:#fff;border:1px solid var(--bid)}
#mobileGame .m-zoomclose{width:100%;background:#f3eee3;border:1px solid #d9d2c2;color:#6b7787;padding:10px 14px;border-radius:8px;font:700 11px 'Barlow Condensed',sans-serif;letter-spacing:.1em;cursor:pointer}
#mobileGame .m-zoomact{width:100%;background:var(--bid,#3FB6FF);border:none;color:#fff;padding:9px 14px;border-radius:8px;font:800 12px 'Barlow Condensed',sans-serif;letter-spacing:.1em;cursor:pointer}
#mobileGame .m-zoomact:disabled{background:#d8d2c4;color:#9a9181;cursor:default}
#mobileGame .m-zoomact.build{background:#3B6A47}
#mobileGame .m-zoomact.event{background:#6B4E8A}
#mobileGame .m-zoomact.revenue{background:#C8A84B;color:#1b1206}
#mobileGame .m-zoomact.sell{background:#5b6675}
#mobileGame .m-zoomtoprow{display:flex;align-items:center;gap:7px;flex-wrap:wrap}
#mobileGame .m-zoomval{font:800 12px 'Barlow Condensed',sans-serif;color:#2f7d3f}
#mobileGame .m-zoomnote{font:600 11px/1.4 'Barlow',sans-serif;color:#a23b2d;margin-top:9px}
#mobileGame .m-zoomwild{font:500 11.5px/1.45 'Barlow',sans-serif;color:#3a4b3f;margin-top:9px;background:#eef4ec;border-radius:8px;padding:8px 10px}
#mobileGame .m-zoomwild-tag{display:inline-block;font:800 9px 'Barlow Condensed',sans-serif;letter-spacing:.1em;text-transform:uppercase;color:#3B6A47;margin-right:6px}
/* T-onboarding: coaching tooltip must never exceed the viewport (phones). */
.coaching-tooltip{max-width:min(320px,calc(100vw - 24px)) !important}

/* ═══════════════════════════════════════════════════════════════════
   P1 DESIGN UNIFICATION (slice 1) — desktop adopts the mobile vocabulary:
   warm parchment center, player rows as white cards, slots as portrait
   mini-cards, hero VP stats. Desktop-gated; mobile untouched.
   All animation risk-map selectors preserved (.brow/.nhc/.cc-card/.cc-slot/
   .lot/.hc/.money-stat + data-* attrs). ═══ */
@media (min-width: 901px) {
  /* 1. Warm parchment play surface */
  .center { background: #ece5d8; padding: 12px 14px 16px; }
  .market { background: #fffefb; border: 1px solid #e3dccd; border-radius: 13px;
            box-shadow: 0 2px 6px rgba(20,30,45,.07); margin-bottom: 12px; }
  .board { background: transparent; border: none; }

  /* 2. Player rows become cards */
  .bsigns { border-bottom: none; margin: 2px 0 8px; }
  .brow { background: #fffefb; border: 1px solid #e3dccd; border-radius: 13px;
          box-shadow: 0 2px 6px rgba(20,30,45,.07); margin-bottom: 10px; }
  .brow.act { border-left: 2px solid var(--bid);
              box-shadow: 0 0 0 2px color-mix(in srgb, var(--bid) 22%, transparent),
                          0 2px 6px rgba(20,30,45,.07); }
  .meta-c { border-right: 1px solid #efe9dc; }
  .nhc { border-right: 1px solid #efe9dc; }

  /* 3. Empty slots: the mobile mini-card recipe (dashed type border + ghost letter) */
  .cc-slot { border-radius: 5px; border-width: 1.4px; background: rgba(255,255,255,.55); }
  .cc-slot::after { display: none; }
  .cc-slot-biz       { border-color: color-mix(in srgb, var(--biz)  40%, transparent); }
  .cc-slot-cul       { border-color: color-mix(in srgb, var(--cul)  40%, transparent); }
  .cc-slot-park      { border-color: color-mix(in srgb, var(--park) 40%, transparent); }
  .cc-slot-lmk       { border-color: color-mix(in srgb, var(--lmk)  40%, transparent); }
  .cc-slot-biz::before  { color: color-mix(in srgb, var(--biz)  60%, transparent); }
  .cc-slot-cul::before  { color: color-mix(in srgb, var(--cul)  60%, transparent); }
  .cc-slot-park::before { color: color-mix(in srgb, var(--park) 60%, transparent); }
  .cc-slot-lmk::before  { color: color-mix(in srgb, var(--lmk)  60%, transparent); }

  /* 4. Built cards: mobile chip + type bar */
  .cc-card { border-radius: 5px; box-shadow: 0 1px 3px rgba(20,30,45,.25) !important; }
  .cc-card.biz  { border-bottom: 2px solid var(--biz)  !important; }
  .cc-card.cul  { border-bottom: 2px solid var(--cul)  !important; }
  .cc-card.park { border-bottom: 2px solid var(--park) !important; }
  .cc-card.lmk  { border-bottom: 2px solid var(--lmk)  !important; }
  .cc-card::before { position: absolute; top: 2px; left: 2px; z-index: 3;
    font: 700 7px 'Barlow Condensed', sans-serif; color: #fff;
    padding: 0 3px; line-height: 13px; border-radius: 2px; }
  .cc-card.biz::before  { content: 'B'; background: var(--biz); }
  .cc-card.cul::before  { content: 'C'; background: var(--cul); }
  .cc-card.park::before { content: 'P'; background: var(--park); }
  .cc-card.lmk::before  { content: 'L'; background: var(--lmk); }

  /* 5. Hero stats in the meta column (m-tile language) */
  .mc-vp b { font-family: 'Barlow Condensed', sans-serif; font-size: 22px;
             line-height: .95; color: #1c2836; }
  .mc-prog { height: 4px; border-radius: 2px; background: #e8e1d2; }
  .mc-prog i { border-radius: 2px; }
  .money-stat b { color: #2f9e6a; }
  .mc-trip b { font-family: 'Barlow Condensed', sans-serif; font-size: 13px; }
}

/* ═══════════════════════════════════════════════════════════════════
   P1 DESIGN UNIFICATION (slice 2) — desktop revenue/event banner adopts
   the mobile flash pill: dark navy hull, accent border + kicker label,
   Barlow Condensed title, secondary sub line. Desktop-gated; the mobile
   path already renders via _mFlash and is untouched. Covers every banner
   variant (payment/complete/forfeit/exempt) so the sequence reads as one
   language. Positioning + GSAP + coin-fly logic left intact. ═══ */
@media (min-width: 901px) {
  .rev-seq-banner {
    background: var(--hull, #0D1C2C);
    border: 1px solid color-mix(in srgb, var(--bid, #3FB6FF) 55%, transparent);
    border-radius: 14px;
    padding: 16px 28px;
    min-width: 0;
    color: #eaf1f8;
    box-shadow: 0 18px 50px rgba(8,16,30,.6);
  }
  /* Kicker label — the small letter-spaced tag above the title */
  .rev-seq-banner::before {
    content: 'EVENT';
    display: block;
    font: 700 9px 'Barlow Condensed', sans-serif;
    letter-spacing: .18em;
    color: var(--bid, #3FB6FF);
    margin-bottom: 5px;
  }
  .rev-seq-banner h3 { color: #eaf1f8; font-size: 1.15rem; letter-spacing: .04em; }
  .rev-seq-banner .rev-amount {
    color: #cdd9e6; font-size: 1.2rem; font-weight: 700; margin-top: 4px;
  }

  /* Completed collection — celebratory green */
  .rev-seq-banner.rev-complete {
    border-color: color-mix(in srgb, #2bb673 55%, transparent);
  }
  .rev-seq-banner.rev-complete::before { content: 'RESOLVED'; color: #2bb673; }
  .rev-seq-banner.rev-complete h3 { color: #eaf1f8; }
  .rev-seq-banner.rev-complete .rev-amount { color: #6fe0a6; font-size: 1.55rem; }

  /* Can't pay — red alert */
  .rev-seq-banner.rev-forfeit {
    border-color: color-mix(in srgb, var(--biz, #A8362D) 60%, transparent);
  }
  .rev-seq-banner.rev-forfeit::before { content: 'ALERT'; color: var(--biz, #A8362D); }
  .rev-seq-banner.rev-forfeit h3 { color: #eaf1f8; }

  /* Exempt — muted grey */
  .rev-seq-banner.rev-exempt {
    border-color: color-mix(in srgb, #8fa3b8 55%, transparent);
  }
  .rev-seq-banner.rev-exempt::before { content: 'EXEMPT'; color: #8fa3b8; }
  .rev-seq-banner.rev-exempt h3 { color: #cdd9e6; }
}
/* T-trust-bundle: mobile settings row in the log sheet */
#mobileGame .m-setrow{display:flex;gap:6px;flex-wrap:wrap;margin-bottom:10px}
#mobileGame .m-setrow .m-soundtog{flex:1;min-width:0;white-space:nowrap}
/* T-trust-bundle: win-screen Kickstarter CTA (the player's most-motivated moment) */
.win-centre-ks-btn{display:block;text-align:center;padding:13px 18px;border-radius:11px;background:#05ce78;color:#0b2818 !important;font:700 14px 'Barlow Condensed',sans-serif;letter-spacing:.08em;text-decoration:none !important;box-shadow:0 6px 18px rgba(5,206,120,.35);margin-bottom:10px}
.win-centre-ks-btn:hover{filter:brightness(1.06)}
/* T-trust-bundle: win ceremony sized for phones. The desktop layout crammed a
   full 8-column leaderboard + 280px trophy into 390px. Columns kept on mobile:
   rank, player, VP, agenda (Prop/Dev/Built/Cash hidden: 4,5,7,8). */
@media (max-width: 900px) {
  .win-centre-overlay{justify-content:flex-start;gap:10px;padding:26px 14px calc(24px + env(safe-area-inset-bottom,0px));background:rgba(6,12,20,.94);backdrop-filter:blur(6px)}
  .win-centre-leaderboard{background:rgba(255,255,255,.07);border-radius:10px}
  .win-centre-leaderboard th{border-bottom-color:rgba(255,255,255,.22)}
  .win-centre-title{font-size:clamp(1.6rem,7vw,2.2rem);text-align:center}
  .win-centre-trophy{width:min(140px,18vh)}
  .win-centre-winner{font-size:1.3rem}
  .win-centre-leaderboard{font-size:11px;max-width:100%}
  .win-centre-leaderboard th,.win-centre-leaderboard td{padding:4px 7px}
  .win-centre-leaderboard th:nth-child(4),.win-centre-leaderboard td:nth-child(4),
  .win-centre-leaderboard th:nth-child(5),.win-centre-leaderboard td:nth-child(5),
  .win-centre-leaderboard th:nth-child(7),.win-centre-leaderboard td:nth-child(7),
  .win-centre-leaderboard th:nth-child(8),.win-centre-leaderboard td:nth-child(8){display:none}
  .win-centre-ks{font-size:11px;text-align:center}
  .win-centre-btn-group{display:flex;flex-direction:column;gap:8px;width:100%;max-width:340px}
  .win-centre-btn-group .win-centre-play-again,
  .win-centre-btn-group .win-centre-view-board,
  .win-centre-btn-group .win-centre-ks-btn{width:100%;margin:0}
}
/* T-playtest-r1: event target callout + targeted-player pulse */
.cs-ev-target{margin-top:10px;font:700 13px 'Barlow Condensed',sans-serif;letter-spacing:.08em;color:#5a6b7d}
.cs-ev-target.you{color:#e4574f}
.cs-targeted{animation:cstargpulse .6s ease-in-out 4}
@keyframes cstargpulse{0%,100%{box-shadow:0 0 0 2px rgba(228,87,79,.9)}50%{box-shadow:0 0 0 6px rgba(228,87,79,.3)}}
/* T-playtest-r1: card effect text inside decision options (discard/give) */
.cs-opt-effect{display:block;font:500 11px/1.35 'Barlow',sans-serif;opacity:.75;margin-top:3px;text-transform:none;letter-spacing:0}
#mobileGame .m-buildeffect{font:500 9.5px/1.3 'Barlow',sans-serif;color:#8a93a0;margin-top:2px}
/* T-playtest-r1: coaching toasts were clamped to HALF the viewport (an
   absolutely-positioned box at left:50% only shrink-to-fits the right half
   before wrapping), leaving ~190px of text on a phone. Give the container an
   explicit width so lines can breathe; the translateX keeps it centered. */
#coachingToastContainer{width:calc(100vw - 24px);max-width:560px}
.coaching-toast{max-width:100%}
/* T-playtest-r2: universal targeting modal — the whole board card is the tap
   target when picking a PLAYER (uniform with the location-steal picker). */
#mobileGame .m-tboard-pick{cursor:pointer;transition:box-shadow .12s ease}
#mobileGame .m-tboard-pick:active{box-shadow:0 0 0 2px var(--bid,#3FB6FF)}
#mobileGame .m-ttarget{flex:0 0 auto;margin-left:8px;background:var(--bid,#3FB6FF);color:#fff;font:700 8.5px 'Barlow Condensed',sans-serif;letter-spacing:.09em;padding:4px 10px;border-radius:7px}

/* ═══════════════════════════════════════════════════════════════════════════
   INTRO / SPLASH REDESIGN (2026-07-08, light)
   Matches the in-game PLAY AREA (auction/board): warm cream backdrop (#ece5d8),
   white cards (#fffefb) with soft shadows + hairline warm borders, dark-navy
   text (#1c2836), green money/values (#2f7d3f), --bid blue actions, colour-
   coded category dots. Light so the CityScape logo PNG reads cleanly. Every
   rule id-scoped to #explainerScreen so it wins over styles.css untouched.
   ═══════════════════════════════════════════════════════════════════════════ */
#explainerScreen{
  background:linear-gradient(180deg,#f3eee4 0%,#e8e0d1 100%) !important;
  color:#374253;-webkit-font-smoothing:antialiased;
  height:100vh;height:100dvh;padding:0 !important;
}
#explainerScreen .explainer-container,
#explainerScreen .splash-compact{
  max-width:452px !important;width:100%;margin:0 auto !important;background:transparent !important;
  border:none !important;box-shadow:none !important;border-radius:0 !important;
  padding:22px 16px 108px !important;box-sizing:border-box;
}

/* Welcome note + Kickstarter link */
#explainerScreen .splash-note{
  background:#fffefb;border:1px solid #e6dccb;border-left:3px solid var(--bid,#3FB6FF);border-radius:12px;
  padding:12px 14px;margin:0 0 12px;color:#45505f;font:500 12.5px/1.55 'Barlow',sans-serif;box-shadow:0 2px 10px rgba(70,55,30,.06);
}
#explainerScreen .splash-note strong{color:#1c2836;font-weight:700}
#explainerScreen .splash-ks{text-align:center;margin:0 0 20px;color:#8b8272;font:500 12px 'Barlow',sans-serif}
#explainerScreen .splash-ks a{color:#0071BC;font-weight:700;text-decoration:none;border-bottom:1px solid rgba(0,113,188,.35);padding-bottom:1px}

/* Logo + tagline */
#explainerScreen .explainer-header{text-align:center;margin:2px 0 18px}
#explainerScreen .explainer-header img{max-width:238px !important;width:auto !important;height:auto;margin:0 !important;filter:drop-shadow(0 6px 16px rgba(60,50,30,.16))}
#explainerScreen .explainer-subtitle{margin:9px 0 0;font:700 11.5px 'Barlow Condensed',sans-serif !important;letter-spacing:.3em !important;text-transform:uppercase;color:#0071BC !important}

/* Objective banner */
#explainerScreen .splash-objective{
  text-align:center;background:#fffefb;border:1px solid #e6dccb;border-left:3px solid var(--bid,#3FB6FF);
  border-radius:12px;padding:13px 16px !important;margin:0 0 16px !important;color:#374253 !important;font:500 14px/1.5 'Barlow',sans-serif !important;box-shadow:0 2px 10px rgba(70,55,30,.06);
}
#explainerScreen .splash-objective strong{color:#0071BC;font-weight:800}

/* Reference cards — VP scoring + neighbourhood slots share the white-card look */
#explainerScreen .splash-vp-grid{display:grid;grid-template-columns:1fr 1fr;gap:10px;margin:0 0 12px}
#explainerScreen .splash-vp-section,
#explainerScreen .splash-nh-ref{background:#fffefb;border:1px solid #e6dccb;border-radius:12px;padding:11px 12px;box-shadow:0 2px 10px rgba(70,55,30,.05)}
#explainerScreen .splash-nh-ref{margin:0 0 20px}
#explainerScreen .splash-vp-label,
#explainerScreen .splash-nh-ref-label{font:700 9px 'Barlow Condensed',sans-serif;letter-spacing:.16em;text-transform:uppercase;color:#9a9181;margin:0 0 8px}
#explainerScreen .splash-vp-rows{display:flex;flex-direction:column;gap:7px}
#explainerScreen .splash-vp-row{display:flex;align-items:center;gap:7px;font:600 11.5px 'Barlow',sans-serif;color:#45505f}
#explainerScreen .splash-vp-dot{width:9px;height:9px;border-radius:50%;flex:0 0 auto}
#explainerScreen .splash-vp-type{flex:1;min-width:0}
#explainerScreen .splash-vp-val{font:800 12px 'Barlow Condensed',sans-serif;letter-spacing:.02em;color:#2f7d3f;white-space:nowrap}
#explainerScreen .splash-nh-ref-sub{font:500 10px/1.4 'Barlow',sans-serif;color:#8b8272;margin:-2px 0 11px}
#explainerScreen .splash-nh-ref-grid{display:grid;grid-template-columns:1fr 1fr;gap:14px 12px}
#explainerScreen .splash-nh-item{display:flex;flex-direction:column;gap:6px}
#explainerScreen .splash-nh-name{font:700 12.5px 'Barlow Condensed',sans-serif;letter-spacing:.02em;color:#1c2836;background:none;padding:0;border-radius:0;text-transform:none;display:block}
/* Semi-built neighbourhood: each slot is a little building tile with its VP on
   top. .built = solid (constructed, darker base); plain = dashed "to build". */
#explainerScreen .nh-blocks{display:flex;flex-wrap:nowrap;align-items:flex-start;gap:3px;padding-top:2px}
#explainerScreen .nh-cell{display:flex;flex-direction:column;align-items:center;flex:1 1 0;min-width:0}
#explainerScreen .nh-ab{font:700 6px/1.1 'Barlow Condensed',sans-serif;letter-spacing:.04em;color:#9a9181}
#explainerScreen .nh-vp{font:800 8px/1.2 'Barlow Condensed',sans-serif;color:#2f7d3f;margin-bottom:3px}
/* Full mini-card per slot (real card art, whole card visible via 3:4 box);
   built = coloured type border; empty = dashed type placeholder. */
#explainerScreen .nh-b{position:relative;align-self:stretch;width:auto;aspect-ratio:3/4;border-radius:4px;box-sizing:border-box}
#explainerScreen .nh-b.built{background-size:cover;background-position:center;border:2px solid;box-shadow:0 1px 2px rgba(30,25,15,.18)}
#explainerScreen .nh-b.biz.built{border-color:#A8362D;background-color:#A8362D}
#explainerScreen .nh-b.biz:not(.built){border:1.4px dashed rgba(168,54,45,.55);background:rgba(168,54,45,.08)}
#explainerScreen .nh-b.cul.built{border-color:#6B4E8A;background-color:#6B4E8A}
#explainerScreen .nh-b.cul:not(.built){border:1.4px dashed rgba(107,78,138,.55);background:rgba(107,78,138,.08)}
#explainerScreen .nh-b.park.built{border-color:#3B6A47;background-color:#3B6A47}
#explainerScreen .nh-b.park:not(.built){border:1.4px dashed rgba(59,106,71,.55);background:rgba(59,106,71,.08)}
#explainerScreen .nh-b.lmk.built{border-color:#1A3050;background-color:#1A3050}
#explainerScreen .nh-b.lmk:not(.built){border:1.4px dashed rgba(26,48,80,.5);background:rgba(26,48,80,.08)}

/* Player-setup card */
#explainerScreen .explainer-section{
  background:#fffefb !important;border:1px solid #e6dccb !important;border-left:3px solid var(--bid,#3FB6FF) !important;
  border-radius:14px !important;padding:14px !important;margin:0 0 16px !important;box-shadow:0 2px 12px rgba(70,55,30,.07);
}
#explainerScreen .explainer-section-head{display:flex;align-items:center;gap:8px;margin:0 0 12px;border:none;padding:0}
#explainerScreen .explainer-icon{font-size:17px;line-height:1}
#explainerScreen .explainer-section-head h2{margin:0;font:700 15px 'Barlow Condensed',sans-serif !important;letter-spacing:.07em;text-transform:uppercase;color:#1c2836 !important}
#explainerScreen .setup-section{margin:0 0 7px !important}
#explainerScreen .setup-section:last-child{margin-bottom:0 !important}
#explainerScreen .explainer-section-head{margin-bottom:9px !important}
#explainerScreen .diff-hint{margin-top:7px !important}
#explainerScreen #playerCount{
  width:100% !important;padding:9px 40px 9px 13px !important;background-color:#faf6ee !important;border:1px solid #d8cfbe !important;border-radius:10px !important;
  color:#1c2836 !important;font:600 14px 'Barlow',sans-serif !important;cursor:pointer;-webkit-appearance:none;appearance:none;
  background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12' fill='none' stroke='%238a93a0' stroke-width='1.6'%3E%3Cpath d='M2 4l4 4 4-4'/%3E%3C/svg%3E");background-repeat:no-repeat;background-position:right 14px center;
}
#explainerScreen #playerCount:focus{outline:none;border-color:var(--bid,#3FB6FF) !important}
#explainerScreen #playerRows{display:flex !important;flex-direction:column;gap:5px;grid-template-columns:none !important}
#explainerScreen .player-setup-row{
  display:flex;align-items:center;gap:8px;background:#faf6ee;border:1px solid #e6dccb;
  border-radius:9px;padding:3px 6px 3px 10px;position:relative;
}
#explainerScreen .player-setup-row::before{content:'';width:9px;height:9px;border-radius:50%;flex:0 0 auto;background:var(--row-c,#3FB6FF);box-shadow:0 0 0 3px rgba(0,0,0,.06)}
#explainerScreen #playerRows .player-setup-row:nth-child(1){--row-c:var(--ph,#0071BC)}
#explainerScreen #playerRows .player-setup-row:nth-child(2){--row-c:var(--pt,#B05B7A)}
#explainerScreen #playerRows .player-setup-row:nth-child(3){--row-c:var(--pb,#4A6B5C)}
#explainerScreen #playerRows .player-setup-row:nth-child(4){--row-c:var(--pm,#C68A4E)}
#explainerScreen .player-setup-row input[type=text]{
  flex:1 !important;min-width:0 !important;width:auto !important;background:transparent !important;border:none !important;color:#1c2836 !important;
  font:600 14px 'Barlow',sans-serif !important;padding:6px 2px !important;
}
#explainerScreen .player-setup-row input[type=text]::placeholder{color:#a59c8a}
#explainerScreen .player-setup-row input[type=text]:focus{outline:none !important}
#explainerScreen .player-tag{
  width:auto !important;min-width:80px;flex:0 0 auto;padding:5px 11px !important;border-radius:20px !important;text-align:center;
  font:700 9.5px 'Barlow Condensed',sans-serif !important;letter-spacing:.09em;text-transform:uppercase;color:#fff !important;
  background:var(--ph,#0071BC) !important;white-space:nowrap;
}
#explainerScreen .player-tag.diff-easy{background:#2f9e5a !important}
#explainerScreen .player-tag.diff-medium{background:#d68a2b !important;color:#fff !important}
#explainerScreen .player-tag.diff-hard{background:#c8433a !important}
#explainerScreen .player-tag.diff-clickable{cursor:pointer}
#explainerScreen .player-tag.diff-clickable:hover{filter:brightness(1.06)}
#explainerScreen .diff-hint{grid-column:auto !important;text-align:center;margin:10px 0 0 !important;font:500 10px 'Barlow',sans-serif !important;letter-spacing:.05em;color:#9a9181 !important}

/* Resume banner (redesigned card — markup rebuilt in app.js) */
#explainerScreen #resumeBanner{margin:0 0 12px}
#explainerScreen .resume-card{display:flex;align-items:center;gap:10px;background:#fffefb;border:1px solid #cfe6d8;border-left:3px solid #2f9e5a;border-radius:12px;padding:11px 12px;box-shadow:0 2px 10px rgba(70,55,30,.06)}
#explainerScreen .resume-main{flex:1;min-width:0}
#explainerScreen .resume-title{font:800 12px 'Barlow Condensed',sans-serif;letter-spacing:.09em;text-transform:uppercase;color:#238a52}
#explainerScreen .resume-sub{margin-top:2px;font:500 11px/1.4 'Barlow',sans-serif;color:#6b7568}
#explainerScreen .resume-go{flex:0 0 auto;padding:10px 16px;border:none;border-radius:9px;background:#2f9e5a;color:#fff;font:800 11px 'Barlow Condensed',sans-serif;letter-spacing:.09em;text-transform:uppercase;cursor:pointer}
#explainerScreen .resume-discard{flex:0 0 auto;padding:10px 12px;border:1px solid #d8cfbe;border-radius:9px;background:transparent;color:#8b8272;font:700 10px 'Barlow Condensed',sans-serif;letter-spacing:.09em;text-transform:uppercase;cursor:pointer}

/* Start buttons — sticky footer that fades into the cream backdrop */
#explainerScreen .splash-buttons{
  display:grid !important;grid-template-columns:1fr 1fr;gap:10px;margin:6px 0 0 !important;
  position:sticky;bottom:0;padding:12px 0 calc(12px + env(safe-area-inset-bottom,0px)) !important;
  background:linear-gradient(to top, #e8e0d1 64%, rgba(232,224,209,0)) !important;
}
#explainerScreen .start-btn{
  width:100%;margin:0 !important;padding:14px 10px !important;border-radius:12px !important;
  font:800 13px/1.15 'Barlow Condensed',sans-serif !important;letter-spacing:.07em;text-transform:uppercase;cursor:pointer;
}
#explainerScreen .splash-btn-tutorial{background:var(--bid,#3FB6FF) !important;color:#fff !important;border:none !important;box-shadow:0 3px 10px rgba(63,182,255,.28)}
#explainerScreen .splash-btn-skip{background:#fffefb !important;color:#1c2836 !important;border:1.5px solid #d8cfbe !important}
#explainerScreen .start-btn:hover{transform:translateY(-1px)}
/* On desktop the compact splash fits without scrolling, so the sticky footer is
   unnecessary — and when a saved game exists, its bottom:0 pin floated OVER the
   "Continue your game" resume bar and clipped it. Flow the buttons normally on
   desktop so the resume bar sits fully clear above them. Mobile keeps sticky. */
@media (min-width: 901px) {
  #explainerScreen .splash-buttons {
    position: static !important;
    background: none !important;
  }
}

/* ═══════════════════════════════════════════════════════════════════════════
   DESKTOP FLUID-FIT (2026-07-08)
   The dashboard is designed for ≥1340px (.app min-width:1340). Below that it used
   to overflow the viewport and clip the right side (activity log, Grandview column)
   on iPads/laptops. This block only engages below the design width and lets the
   layout shrink to fit: drop the hard min-width, let board columns flex, and
   compact the densest bits (count row → coloured dot + number, no text label;
   smaller neighbourhood-sign headers). ≥1340 is untouched — no regression.
   ═══════════════════════════════════════════════════════════════════════════ */
@media (max-width: 1439px) {
  .app { min-width: 0; }
  /* board rows: fixed label + 4 flexible neighbourhood columns that can shrink */
  .brow, .bsigns { grid-template-columns: 188px repeat(4, minmax(0,1fr)); }
  /* auction: tighter lot padding so the 5 cards + bid field breathe a bit more */
  .lot { padding: 0 8px; }
  /* count row: hide the BIZ/CUL/PARK/LMK words — the coloured dot already says the
     type — so "● 00 ● 00 ● 00 ● 00" fits a narrow column without overlapping. */
  .tally-lbl { display: none; }
  .tally { gap: 8px; justify-content: flex-start; padding: 3px 6px 4px; }
  /* neighbourhood-sign headers: hide the small DT/04 code chip (decorative — the
     name is the info) and shrink the name so DOWNTOWN / MT PLEASANT / GRANDVIEW fit. */
  .sp-data { display: none; }
  .sp-name { font-size: 11px; letter-spacing: 0.01em; }
  .signpost { padding: 6px 6px; min-width: 0; }
  .sp-blade { min-width: 0; }
}

/* ── Intro on larger screens ──────────────────────────────────────────────────
   The splash is a 452px phone-width column — on an iPad/laptop it looks stranded
   in a sea of empty cream. Widen it to a comfortable reading width so it fills
   more of the screen; the reference grids (VP, neighbourhood slots) get roomier
   cards for free. Mobile (≤900px) keeps the narrow single column. */
@media (min-width: 901px) {
  #explainerScreen .explainer-container,
  #explainerScreen .splash-compact { max-width: 1040px !important; padding: 30px 24px 120px !important; }
  #explainerScreen .explainer-header img { max-width: 320px !important; }
  #explainerScreen .splash-objective { font-size: 15px !important; }
  /* Reference (left) + player setup (right) side by side so the page fills the
     width instead of stranding a narrow column in empty space. The hero (note,
     Kickstarter, logo, objective) and the start buttons stay full-width. */
  #explainerScreen .splash-cols { display: flex; gap: 20px; align-items: flex-start; }
  #explainerScreen .splash-cols > .splash-col { flex: 1 1 0; min-width: 0; display: flex; flex-direction: column; }
  /* neutralise the stacked-flow bottom margins inside the columns (they're peers now) */
  #explainerScreen .splash-cols .splash-vp-grid,
  #explainerScreen .splash-cols .explainer-section { margin-bottom: 16px !important; }
  #explainerScreen .splash-cols .splash-nh-ref { margin-bottom: 0 !important; }
}

/* ═══════════════════════════════════════════════════════════════════════════
   REFINED AUCTION BID SEGMENT (web ↔ mobile parity, 2026-07-09)
   The focused lot's bid area used a flat blue box with hairline-outline steppers.
   Bring it in line with the mobile controls: cream/tan rounded − / + steppers +
   a cream bid input, on the light lot card, with a filled bid-blue LOCK BID.
   Stacked (label over the − input + row) so it fits the narrow desktop column.
   ═══════════════════════════════════════════════════════════════════════════ */
.bid-field.bidable {
  background: transparent !important; border: none !important;
  flex-direction: column; align-items: stretch; gap: 7px;
  padding: 4px 0 0 !important; margin-top: 6px;
}
.bid-field.bidable .cap {
  font-family: 'Barlow Condensed', sans-serif; font-size: 8.5px; font-weight: 600;
  letter-spacing: 0.16em; text-transform: uppercase; color: #8a93a0; opacity: 1;
}
.bid-field.bidable .bid-stepper { width: 100%; gap: 6px; align-items: stretch; }
.bid-field.bidable .bid-step {
  flex: 0 0 auto; width: 40px; height: 40px;
  background: #f3eee3; border: 1px solid #d9d2c2; border-radius: 9px;
  color: #1c2836; font-size: 22px; line-height: 1;
}
.bid-field.bidable .bid-step:hover { background: #ece5d6; }
.bid-field.bidable input.bid-input {
  flex: 1 1 auto; min-width: 0; height: 40px; padding: 0 8px;
  background: #f3eee3; border: 1px solid #d9d2c2; border-radius: 9px;
  color: #1c2836; font-weight: 700; text-align: center;
}
.bid-field.bidable input.bid-input::placeholder { color: #a59c8a; font-weight: 600; }
/* LOCK BID: filled bid-blue rounded (was hairline-outline) */
.lot-lock-btn {
  background: var(--bid) !important; border: 1px solid var(--bid) !important; color: #fff !important;
  border-radius: 9px !important; padding: 11px 10px !important; margin-top: 5px !important;
  font-size: 12px !important; letter-spacing: 0.14em !important;
}
.lot-lock-btn:hover { background: var(--bid) !important; filter: brightness(1.06); }

/* ══════════════════════════════════════════════════════════════════════════
   DESKTOP DECISION MODALS — dark theme, aligned with the mobile decision sheets
   (and the burn picker / agenda / tie modals). Marker class `cs-dark-decision`
   is added by ui.js to every player-DECISION modal: debt resolution / forfeit
   money, Community Investment, Payment Deferred, AI revenue response, forfeit
   LOCATION, event TARGET picker, hand discard, CRA pick, Heritage & reversed-
   steal pickers, card give, Media-Scrutiny discard. Pure AI-event CARD REVEALS
   (`.cs-event-modal` WITHOUT this marker) keep their light card presentation.
   Desktop only (min-width:901px) so mobile's cream card popup is untouched.
   Overrides use higher specificity than the styles.css class rules; `!important`
   where those rules used it (.cs-event-modal hard-sets #FFF !important). Many
   inner components read theme tokens (--text/--muted/--border/--surface-alt),
   so redefining those on the panel flips forfeit cards, rows, dividers, etc.
   ══════════════════════════════════════════════════════════════════════════ */
@media (min-width: 901px) {
  .event-modal.cs-dark-decision {
    /* Redefine the light tokens the inner components inherit */
    --panel: #10233a; --surface: #10233a;
    --surface-alt: rgba(255,255,255,0.05); --surface-mid: rgba(255,255,255,0.04);
    --text: #eaf1f8; --muted: #9fb0c2;
    --border: rgba(120,160,200,0.22);
    --primary: var(--bid, #3FB6FF); --primary-dark: rgba(120,160,200,0.30);
    --accent: var(--bid, #3FB6FF);
    background: #10233a !important;
    border: 1px solid rgba(120,160,200,0.20) !important;
    border-radius: 16px !important;
    color: #eaf1f8 !important;
    box-shadow: 0 24px 60px rgba(0,0,0,0.55) !important;
  }
  /* Card-art modals (forfeit/CRA/choice) keep the art flush at the top */
  .event-modal.cs-dark-decision .event-card-preview { background: #0a1626 !important; }

  /* Headers — were #1B6FC8 or #1A1F2E */
  .event-modal.cs-dark-decision h2,
  .event-modal.cs-dark-decision .cs-modal-title-zone h2 { color: #eaf1f8 !important; }
  .event-modal.cs-dark-decision .forfeit-subtitle { color: #9fb0c2 !important; }

  /* Body text stays light via inherited color; the inner action box goes subtle-dark */
  .event-modal.cs-dark-decision .modal-action-box {
    background: rgba(255,255,255,0.03) !important;
    border: 1px solid rgba(120,160,200,0.14) !important;
  }
  .event-modal.cs-dark-decision p,
  .event-modal.cs-dark-decision .event-notif-message,
  .event-modal.cs-dark-decision .event-who-played,
  .event-modal.cs-dark-decision label,
  .event-modal.cs-dark-decision .forfeit-option-desc,
  .event-modal.cs-dark-decision .discard-option-label { color: #d7e2ee; }

  /* Primary confirm buttons → cyan --bid filled (match Lock Bid / burn picker) */
  .event-modal.cs-dark-decision .action-btn,
  .event-modal.cs-dark-decision .rev-confirm-btn,
  .event-modal.cs-dark-decision .forfeit-confirm-btn {
    background: var(--bid) !important;
    color: #06121f !important;
    border: none !important;
    box-shadow: 0 2px 10px rgba(63,182,255,0.28) !important;
  }
  .event-modal.cs-dark-decision .action-btn:hover,
  .event-modal.cs-dark-decision .rev-confirm-btn:hover,
  .event-modal.cs-dark-decision .forfeit-confirm-btn:hover { filter: brightness(1.08); }
  .event-modal.cs-dark-decision .action-btn:disabled,
  .event-modal.cs-dark-decision .action-btn.btn-dimmed {
    background: rgba(120,160,200,0.18) !important; color: #6f8399 !important;
    box-shadow: none !important;
  }

  /* Numeric input (cash to pay) */
  .event-modal.cs-dark-decision input[type="number"],
  .event-modal.cs-dark-decision input[type="text"] {
    background: #0a1626 !important; color: #eaf1f8 !important;
    border: 1px solid rgba(120,160,200,0.28) !important; border-radius: 6px;
  }
  .event-modal.cs-dark-decision input[type="checkbox"] { accent-color: var(--bid) !important; }

  /* Checkbox / option rows */
  .event-modal.cs-dark-decision .revenue-activation-option {
    background: rgba(255,255,255,0.05) !important;
    border: 1px solid rgba(120,160,200,0.20) !important;
  }
  .event-modal.cs-dark-decision .revenue-activation-option:hover {
    background: rgba(63,182,255,0.12) !important;
  }

  /* Close button on a dark panel */
  .event-modal.cs-dark-decision .modal-close-btn {
    background: rgba(255,255,255,0.08); color: #cfe0ee;
  }
  .event-modal.cs-dark-decision .modal-close-btn:hover { background: rgba(255,255,255,0.16); }

  /* Card-art picker tiles (CRA / reversed-steal / heritage) */
  .event-modal.cs-dark-decision .cra-pick-card {
    background: rgba(255,255,255,0.05) !important;
    border: 2px solid rgba(120,160,200,0.20) !important;
    color: #d7e2ee !important;
  }
  .event-modal.cs-dark-decision .cra-pick-card.cs-selected {
    border-color: var(--bid) !important;
    box-shadow: 0 0 0 2px rgba(63,182,255,0.4) !important;
  }

  /* Card-modal choice buttons (appeal/give/discard/continue) */
  .event-modal.cs-dark-decision .cs-btn {
    color: #eaf1f8 !important; border-top: 1px solid rgba(120,160,200,0.20) !important;
  }
  .event-modal.cs-dark-decision .cs-btn:hover { background: rgba(63,182,255,0.10) !important; }
  .event-modal.cs-dark-decision .cs-appeal-btn {
    color: #eaf1f8 !important; border: 1px solid rgba(120,160,200,0.28) !important;
  }
  .event-modal.cs-dark-decision .cs-appeal-btn:hover { border-color: var(--bid) !important; }
  .event-modal.cs-dark-decision .cs-countersuit-btn {
    background: rgba(63,182,255,0.10) !important; border: 1px solid var(--bid) !important;
    color: var(--bid) !important;
  }

  /* Target-picker option buttons */
  .event-modal.cs-dark-decision .target-options button,
  .event-modal.cs-dark-decision .target-btn {
    background: rgba(255,255,255,0.05) !important;
    border: 1px solid rgba(120,160,200,0.22) !important;
    color: #eaf1f8 !important;
  }
  .event-modal.cs-dark-decision .target-options button:hover,
  .event-modal.cs-dark-decision .target-btn:hover {
    border-color: var(--bid) !important; background: rgba(63,182,255,0.12) !important;
  }
}

/* ══════════════════════════════════════════════════════════════════════════
   DESKTOP DEBT-RESOLUTION SHEET — the SAME visual board layout as the mobile
   _mDebtSheet (cash auto-covers the gap; tap spare hand cards / built properties
   to pay with those), rendered by _renderDesktopDebtSheet() into #desktopDebtOverlay
   instead of the old checkbox modal. Light cream sheet to match mobile; sizes
   scaled up for a desktop/iPad viewport. Reuses the shared mtgtpulse keyframe.
   ══════════════════════════════════════════════════════════════════════════ */
.cs-desktop-sheet .m-ov{position:fixed;inset:0;background:rgba(13,28,44,.82);display:flex;align-items:center;justify-content:center;z-index:3000;padding:24px}
.cs-desktop-sheet .m-sheet{background:#fffefb;border-radius:18px;padding:22px 24px;box-shadow:0 24px 60px rgba(0,0,0,.5);width:580px;max-width:100%;max-height:88vh;overflow-y:auto}
.cs-desktop-sheet .m-sheet-head{display:flex;align-items:flex-start;justify-content:space-between;margin-bottom:12px}
.cs-desktop-sheet .m-sheet-kick{font:600 10px 'Barlow Condensed',sans-serif;letter-spacing:.13em;color:#8a93a0;text-transform:uppercase}
.cs-desktop-sheet .m-sheet-title{font:700 27px/1 'Barlow Condensed',sans-serif;color:#1c2836;margin-top:4px}
.cs-desktop-sheet .m-sheet-note{font:600 12.5px/1.5 'Barlow',sans-serif;color:#9a9181}
.cs-desktop-sheet .m-sheet-sub{font:700 11px 'Barlow Condensed',sans-serif;letter-spacing:.16em;text-transform:uppercase;color:#8a93a0;margin:16px 2px 9px}
.cs-desktop-sheet .m-debttotal{font:800 27px 'Barlow Condensed',sans-serif;color:#a23b2d;margin:8px 0 4px;letter-spacing:.02em}
.cs-desktop-sheet .m-debttotal.ok{color:#2f7d3f}
.cs-desktop-sheet .m-debttotal span{font-size:15px;color:#8a93a0;font-weight:700}
.cs-desktop-sheet .m-debtrow{display:flex;gap:10px;flex-wrap:wrap;margin-bottom:4px}
.cs-desktop-sheet .m-debtcard{position:relative;width:60px;height:80px;border-radius:8px;background-size:cover;background-position:center;background-color:#0a1626;cursor:pointer;flex:0 0 auto;box-shadow:0 2px 6px rgba(20,30,45,.25)}
.cs-desktop-sheet .m-debtcard.sel{outline:3px solid #e0703a;outline-offset:1px}
.cs-desktop-sheet .m-debtval{position:absolute;bottom:0;left:0;right:0;text-align:center;color:#fff;font:800 10px 'Barlow Condensed',sans-serif;padding:2px 0;border-radius:0 0 8px 8px}
.cs-desktop-sheet .m-tscroll{display:flex;flex-direction:column;gap:12px;margin:2px 0}
.cs-desktop-sheet .m-tboard{background:#fffefb;border:1px solid #e3dccd;border-radius:13px;padding:11px 12px;box-shadow:0 2px 6px rgba(20,30,45,.07)}
.cs-desktop-sheet .m-thoods{display:grid;grid-template-columns:1fr 1fr;gap:10px}
.cs-desktop-sheet .m-thood{background:#f7f3ea;border-radius:9px;padding:7px 9px}
.cs-desktop-sheet .m-thood-name{font:700 9px 'Barlow Condensed',sans-serif;letter-spacing:.1em;color:#9a9181;margin-bottom:6px}
.cs-desktop-sheet .m-tslots{display:flex;gap:5px;align-items:center}
.cs-desktop-sheet .m-tslot{flex:1;aspect-ratio:3/4;border-radius:5px;background-size:cover;background-position:center}
.cs-desktop-sheet .m-tslot.empty{background:rgba(20,30,45,.05);border:1px dashed rgba(20,30,45,.12)}
.cs-desktop-sheet .m-tslot.dim{opacity:.32;filter:grayscale(.4)}
.cs-desktop-sheet .m-tslot.tgt{position:relative;transform:scale(1.12);cursor:pointer;border-radius:6px;animation:mtgtpulse 1.3s ease-in-out infinite;z-index:1}
.cs-desktop-sheet .m-tslot.tgt:hover{transform:scale(1.2)}
.cs-desktop-sheet .m-tslot.tgt.sel{animation:none}
.cs-desktop-sheet .m-tslot-tick{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;background:rgba(224,112,58,.34);border-radius:6px;color:#fff;font:800 18px 'Barlow Condensed',sans-serif;text-shadow:0 1px 3px rgba(0,0,0,.6)}
.cs-desktop-sheet .m-fftconfirm{display:block;width:100%;margin-top:18px;padding:15px;border-radius:12px;border:none;background:#a8362d;color:#fff;font:700 15px 'Barlow Condensed',sans-serif;letter-spacing:.09em;cursor:pointer}
.cs-desktop-sheet .m-fftconfirm:hover:not(:disabled){filter:brightness(1.07)}
.cs-desktop-sheet .m-fftconfirm:disabled{background:#d8d2c4;color:#9a9181;cursor:default}
/* Pay-with-money option + can't-pay note (forfeit sheet) — desktop sizes */
.cs-desktop-sheet .m-fft-pay{display:block;width:100%;padding:14px 16px;border-radius:12px;border:1px solid #2bb673;background:#eafaf1;color:#187a4c;font:700 15px 'Barlow Condensed',sans-serif;letter-spacing:.05em;text-align:left;cursor:pointer;margin:10px 0 2px}
.cs-desktop-sheet .m-fft-pay:hover{background:#def5e8}
.cs-desktop-sheet .m-fft-pay .bal{display:block;font:600 12px 'Barlow',sans-serif;color:#4a8f6d;letter-spacing:0;margin-top:3px}
.cs-desktop-sheet .m-fft-nopay{padding:12px 14px;border-radius:11px;background:#fbeeec;border:1px solid #e4b2ac;color:#a8362d;font:600 13px/1.4 'Barlow',sans-serif;margin:10px 0 2px}
/* Card-give sheet rows (desktop) — hand cards with art + GIVE button, scaled up
   from the mobile _mCardGiveSheet. Reuses .cs-desktop-sheet panel/header. */
.cs-desktop-sheet .m-buildrow{display:flex;align-items:center;gap:12px;background:#faf6ee;border:1px solid #e7e0d2;border-radius:12px;padding:10px 12px;margin-bottom:9px}
.cs-desktop-sheet .m-buildart{width:48px;height:64px;flex:0 0 auto;border-radius:7px;background-size:cover;background-position:center;background-color:#2a3a4a;box-shadow:0 2px 5px rgba(20,30,45,.25)}
.cs-desktop-sheet .m-buildname{font:700 16px 'Barlow Condensed',sans-serif;letter-spacing:.02em;color:#1c2836;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.cs-desktop-sheet .m-buildmeta{font:700 10px 'Barlow Condensed',sans-serif;letter-spacing:.06em;color:#8a93a0;text-transform:uppercase;margin-top:3px}
.cs-desktop-sheet .m-buildeffect{font:500 12px/1.35 'Barlow',sans-serif;color:#8a93a0;margin-top:3px}
.cs-desktop-sheet .m-buildbtn{flex:0 0 auto;font:700 12px 'Barlow Condensed',sans-serif;letter-spacing:.1em;padding:11px 20px;border-radius:9px;cursor:pointer;background:var(--bid);color:#fff;border:1px solid var(--bid)}
.cs-desktop-sheet .m-buildbtn:hover{filter:brightness(1.07)}
/* Move-sheet close button (desktop) */
.cs-desktop-sheet .m-x{width:34px;height:34px;border-radius:9px;background:#f3eee3;border:1px solid #d9d2c2;color:#6b7787;font-size:15px;cursor:pointer;flex:0 0 auto}
.cs-desktop-sheet .m-x:hover{background:#ece5d6}

/* ══════════════════════════════════════════════════════════════════════════
   T-BUTTERY — animation smoothness pass (Samuel: "general lag / unpolished
   vibe"). backdrop-filter blur is the single most expensive per-frame effect
   in iPad Safari; every modal open/close was compositing a full-screen blur.
   Flat scrims read the same. (Win overlay keeps its blur — end-game only.)
   ══════════════════════════════════════════════════════════════════════════ */
#eventOverlay, #revenueOverlay, #winOverlay {
  backdrop-filter: none !important;
  -webkit-backdrop-filter: none !important;
}
/* styles.css used blur(4px) brightness(0.7) — fold the brightness into the scrim */
#eventOverlay, #winOverlay { background: rgba(9, 16, 26, 0.78) !important; }
#revenueOverlay { background: rgba(9, 16, 26, 0.78) !important; }

/* ── Pandemic: desaturate the whole city for the DURATION of the restriction
   (until every hit player has taken their next turn) — not just the 1s
   cinematic flash. Toggled by render() via body.pandemic-active from the
   engine's per-player pandemicHit flag. A static filter costs once (layer
   promotion), not per frame — unlike the old backdrop-filter overlay.
   Note: filter on .app/#mobileGame makes them containing blocks for fixed
   descendants; both are full-viewport boxes, and modals/sheets mount on
   document.body (unfiltered) so they keep full colour — the CITY greys out,
   the cards in your face stay vivid. */
body.pandemic-active .app,
body.pandemic-active #mobileGame {
  filter: saturate(0.45) contrast(0.97);
  transition: filter 0.9s ease;
}

/* ── Hand-deck anchor (.mc-deck) — a mini deck beside each player's name.
   The HOME for hand-card animations: played cards fly FROM it, drawn/stolen
   cards fly TO it (Samuel: cards need "a location to go to and come from").
   Two offset card-backs + a count chip; dims when the hand is empty. */
.mc-deck { position: relative; width: 24px; height: 31px; flex: 0 0 auto; margin-left: 2px; }
.mc-deck .mc-deck-c {
  position: absolute; width: 22px; height: 29px; object-fit: cover;
  border-radius: 3px; border: 1px solid rgba(20,30,45,0.25);
  box-shadow: 0 1px 3px rgba(20,30,45,0.3);
}
.mc-deck .mc-deck-c:nth-child(1) { left: 0; top: 2px; transform: rotate(-4deg); }
.mc-deck .mc-deck-c:nth-child(2) { left: 2px; top: 0; }
.mc-deck .mc-deck-n {
  position: absolute; right: -5px; bottom: -4px; z-index: 1;
  min-width: 14px; height: 14px; padding: 0 3px; border-radius: 7px;
  background: var(--ink, #1c2836); color: #fff; text-align: center;
  font: 700 9px/14px 'Barlow Condensed', sans-serif;
  box-shadow: 0 1px 3px rgba(20,30,45,0.35);
}
.mc-deck.empty .mc-deck-c { opacity: 0.35; filter: grayscale(0.5); }
.mc-deck.empty .mc-deck-n { background: #9a9181; }

/* ── Mobile hand-deck anchors (Samuel's mockups): a card-back stack + count
   badge beside each player, giving card animations a home to fly from/to —
   mirrors the desktop .mc-deck. The ::before offset back suggests a stack. */
#mobileGame .m-deck{position:relative;width:26px;height:35px;flex:0 0 auto}
#mobileGame .m-deck::before{content:'';position:absolute;inset:0;background:#eaf1f8;border-radius:4px;transform:rotate(-6deg) translate(-1.5px,0.5px);border:1px solid rgba(20,30,45,.18)}
#mobileGame .m-deck img{position:relative;width:100%;height:100%;object-fit:cover;border-radius:4px;border:1px solid rgba(255,255,255,.55);box-shadow:0 2px 6px rgba(8,16,30,.35)}
#mobileGame .m-deck .m-deck-n{position:absolute;right:-7px;bottom:-5px;min-width:17px;height:17px;border-radius:9px;background:#1c2836;color:#fff;font:800 9.5px/17px 'Barlow Condensed',sans-serif;text-align:center;padding:0 3px;border:1.5px solid rgba(255,255,255,.35);z-index:1}
#mobileGame .m-self .m-deck.m-deck-self{width:32px;height:43px;margin-right:2px}
/* Black Market button (turn header) — purple accent, dim when the rules refuse */
#mobileGame .m-peek-bm{border-color:#8a5cc9;color:#c9b4ec}
#mobileGame .m-peek-bm.dim{opacity:.45;pointer-events:auto;cursor:default}

/* Appeal modal (cs-choice-modal'd 2026-07-11): the appeal option list scrolls
   like the discard/give lists so the CONTINUE footer always stays reachable —
   without this, big art + several appeal options overflowed the shell's
   overflow:hidden at short viewports and clipped every clickable control. */
.cs-choice-modal .cs-appeal-options { max-height: 30vh; overflow-y: auto; }

/* ── Mobile market action bar: BUY / SELL / BLACK MKT as three equal buttons in
   their own row (they didn't fit inline in the section header). Dimmed buttons
   stay visible so the actions are discoverable even when unavailable. */
#mobileGame .m-actbar{display:grid;grid-template-columns:1fr 1fr 1.4fr;gap:7px;margin:2px 0 8px}
#mobileGame .m-actbtn{display:flex;align-items:center;justify-content:center;gap:4px;padding:9px 4px;border-radius:9px;font:700 9.5px 'Barlow Condensed',sans-serif;letter-spacing:.06em;cursor:pointer;background:color-mix(in srgb,var(--bid) 12%,transparent);border:1px solid color-mix(in srgb,var(--bid) 45%,transparent);color:var(--bid);white-space:nowrap}
#mobileGame .m-actbtn b{font-size:10.5px}
#mobileGame .m-actbtn:active{background:color-mix(in srgb,var(--bid) 22%,transparent)}
#mobileGame .m-actbtn-bm{background:rgba(138,92,201,.12);border-color:rgba(138,92,201,.5);color:#c9b4ec}
#mobileGame .m-actbtn.dim{opacity:.4;cursor:default;pointer-events:auto}

/* ── Desktop market action bar: Buy a Card / Sell to Market / Black Market as one
   button group in the Property Market header (parity with the mobile .m-actbar).
   Same blue outline language as the old lone .bm-btn; Black Market keeps a purple
   accent to stand apart. Dimmed buttons stay visible w/ the reason as tooltip. */
.mkt-actbar { display: flex; align-items: center; gap: 8px; flex-shrink: 0; }
.mkt-actbtn {
  font-family: 'Barlow Condensed', sans-serif;
  font-size: 11px; font-weight: 600; letter-spacing: 0.16em; text-transform: uppercase;
  background: transparent;
  border: 1px solid #1B6FC8; color: #1B6FC8;
  border-radius: 3px; padding: 6px 13px; cursor: pointer;
  transition: background 120ms, filter 120ms; white-space: nowrap;
}
.mkt-actbtn:hover:not(.dim) { background: rgba(27,111,200,0.12); }
.mkt-actbtn.mkt-actbtn-bm { border-color: #8a5cc9; color: #a97fe0; }
.mkt-actbtn.mkt-actbtn-bm:hover:not(.dim) { background: rgba(138,92,201,0.14); }
.mkt-actbtn.dim { border-color: rgba(120,132,148,0.3); color: rgba(120,132,148,0.4); cursor: default; }

/* Debt sheet: cash bills are now TAP-TO-SELECT (Samuel's Round-II note — the
   player chooses which bills to hand over and sees the cost, since bills are
   indivisible with no change except the $5M rule). Cursor + cost line. */
.m-debtcard.cash { cursor: pointer; }
.m-debtcost { font: 600 12px/1.4 'Barlow', sans-serif; margin: 2px 2px 6px; padding: 6px 10px; border-radius: 8px; }
.m-debtcost.lost { background: rgba(168,54,45,.09); color: #a8362d; }
.m-debtcost.lost b { font-weight: 800; }
.m-debtcost.fivem { background: rgba(47,125,63,.10); color: #2f7d3f; }
.cs-desktop-sheet .m-debtcost { font-size: 13px; }

/* Splash "Neighbourhood Slots" reference — Downtown is shown FULLY DEVELOPED
   (all base slots + Landmark filled) as the teaching example for the +5 VP
   develop payoff. Gold badge next to the name + a soft gold wash on the tile. */
#explainerScreen .splash-nh-devbadge {
  display: inline-block; margin-left: 6px; vertical-align: middle;
  font: 800 8px 'Barlow Condensed', sans-serif; letter-spacing: .07em;
  color: #7d5e12; background: rgba(200,169,81,.2); border: 1px solid rgba(200,169,81,.55);
  border-radius: 999px; padding: 2px 7px 1px; white-space: nowrap;
}
#explainerScreen .splash-nh-item.developed { background: linear-gradient(180deg, rgba(200,169,81,.08), rgba(200,169,81,.03)); border-radius: 8px; }
