/* Shared match zones, identity, notice and timer. Existing responsive
   refinements in the following polish stylesheet retain their cascade. */
body[data-playing="true"] .site-header {
  display: none;
}
body[data-playing="true"] .shell {
  height: 100dvh;
  padding: 8px;
  max-width: none;
}
/* Mesa match composition: dedicated map area, translucent but legible rails. */
.game-viewport.canvas-table {
  --dock-height: 164px;
  --left-rail: 190px;
  --right-rail: 294px;
  grid-template-rows: 30px 38px minmax(0, 1fr) var(--dock-height);
  gap: 6px;
  padding: 10px 14px;
  overflow: hidden;
}
.canvas-table .game-topbar {
  padding: 0 190px 0 0;
  gap: 12px;
}
.canvas-table .game-topbar h1 {
  font-size: 18px;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}
.canvas-table .game-goal {
  display: flex;
  align-items: center;
  gap: 4px;
  font-size: 12px;
  flex-shrink: 0;
}
.canvas-table .game-goal .icon {
  width: 19px;
  height: 22px;
}
.canvas-table .game-extras {
  margin-left: auto;
  font-size: 12px;
}
.game-viewport.canvas-table > .table-play-area {
  position: absolute;
  inset: 0;
}
.game-viewport.canvas-table .game-map {
  position: absolute;
  inset: 86px var(--right-rail) calc(var(--dock-height) + 16px) var(--left-rail);
  width: auto;
  height: auto;
  padding: 0;
  min-height: 0;
}
.game-viewport.canvas-table .board-container {
  height: 100%;
  width: 100%;
  padding: 0;
  overflow: hidden;
}
.canvas-table .board-svg {
  width: 100%;
  height: 100%;
  max-width: none;
  max-height: none;
}
.canvas-table .game-players {
  left: 14px;
  top: 86px;
  width: calc(var(--left-rail) - 22px);
  max-height: calc(100% - var(--dock-height) - 104px);
  overflow-x: visible;
  padding: 3px;
}
.canvas-table .game-player,
.canvas-table .game-player.current-player {
  border-radius: 16px;
  padding: 10px;
  background: #fffaf0d9;
  border: 1px solid #dfcba7;
  box-shadow: 0 3px 10px #39342b0a;
  backdrop-filter: blur(6px);
  text-shadow: none;
  overflow: visible;
}
.canvas-table .game-player.current-player {
  border-left: 4px solid var(--player);
  background: #fffaf0ed;
}
.canvas-table .player-identity {
  gap: 8px;
}
.canvas-table .player-identity strong {
  font-size: 13px;
  color: var(--player-ink, #39342b);
}
.canvas-table .player-identity strong small {
  color: #625744;
  font-size: 10px;
}
.player-expand {
  position: relative;
  display: grid;
  place-items: center;
  width: 40px;
  height: 40px;
  padding: 3px;
  border: 0;
  border-radius: 50%;
  background: transparent;
  flex-shrink: 0;
  cursor: pointer;
}
.current-player .player-expand {
  /* Colored arc from 12 o'clock clockwise; its end retreats counter-clockwise. */
  background: conic-gradient(
    var(--player) calc(var(--turn-remaining, 1) * 360deg),
    #dfd3ba 0
  );
}
.canvas-table .player-avatar {
  display: grid;
  place-items: center;
  width: 32px;
  height: 32px;
  border-radius: 50%;
  flex-shrink: 0;
}
.canvas-table .player-avatar .avatar-initial {
  display: grid;
  place-items: center;
  position: absolute;
  inset: 0;
  color: #39342b;
  font:
    800 18px/1 Bricolage,
    sans-serif;
  width: 100%;
  height: 100%;
}
.compact-score {
  display: none;
}
.canvas-table .player-metrics {
  display: flex;
  flex-wrap: wrap;
  gap: 8px 12px;
  margin-top: 8px;
}
.canvas-table .player-stat {
  position: relative;
  display: flex;
  align-items: center;
  gap: 4px;
  font-size: 12px;
  color: #39342b;
  min-height: 28px;
}
.canvas-table .player-stat .icon {
  width: 24px;
  height: 27px;
  filter: drop-shadow(0 1px 1px #39342b25);
}
.player-stat:focus-visible,
.player-expand:focus-visible {
  outline: 2px solid #2446ed;
  outline-offset: 2px;
}
.canvas-table .turn-progress {
  display: none;
}
.canvas-table .player-countdown {
  font-size: 11px;
  color: #625744;
}
.canvas-table .player-turn-label {
  font-size: 10px;
  color: #625744;
}
.canvas-table > .turn-notice,
.canvas-table > .turn-notice.your-turn {
  display: flex;
  align-items: center;
  gap: 10px;
  min-height: 36px;
  padding: 6px 12px;
  border-radius: 12px;
  background: #fffaf0d9;
  backdrop-filter: blur(6px);
  width: fit-content;
  max-width: calc(100% - 310px);
  color: #39342b;
  text-shadow: none;
}
.canvas-table .turn-notice strong {
  white-space: nowrap;
  color: var(--player-ink);
  font-size: 14px;
}
.canvas-table .turn-notice.your-turn strong {
  border-left: 5px solid var(--player);
  padding-left: 8px;
}
.canvas-table .turn-notice p {
  margin: 0;
  font-size: 12px;
  line-height: 1.35;
}
.canvas-table .game-dock {
  height: var(--dock-height);
  display: grid;
  grid-template-rows: 50px 108px;
  gap: 6px;
  align-self: end;
  min-width: 0;
}

/* --- 5. Timer ring, driven per frame by JS (--turn-elapsed/--turn-remaining).
   The player-coloured arc is anchored at 12 o'clock and laid out
   counter-clockwise (track = 0..elapsed·360° clockwise, colour after it).
   Never transition these properties: values arrive every animation frame. */
.canvas-table .current-player .player-expand,
.canvas-table .player-expand[data-ring-direction="ccw"] {
  --ring-color: var(--player, #2446ed);
  padding: 3px;
  background: conic-gradient(
    var(--ring-color) calc(var(--turn-remaining, 1) * 360deg),
    #dfd3ba 0
  );
  transition: none;
}
.canvas-table .game-player:not(.current-player) .player-expand {
  background: transparent;
}
.canvas-table .current-player:has(.player-countdown.urgent) .player-expand {
  --ring-color: #dc4436;
}
.turn-progress::after {
  width: calc(100% * var(--turn-remaining, 1));
  transition: none;
}
