#game-screen.campaign-tide {
  --biome-bg: #063a5a;
  --biome-bg2: #071a33;
  --biome-accent: #38bdf8;
  --biome-board: rgba(56, 189, 248, 0.1);
}
#game-screen.campaign-tide .grid {
  box-shadow:
    0 0 0 1px rgba(56, 189, 248, 0.28),
    0 10px 35px rgba(2, 132, 199, 0.2);
}
#game-screen.campaign-currents .cell.current-row {
  border-color: rgba(125, 211, 252, 0.52);
  background: linear-gradient(90deg, rgba(14, 165, 233, 0.16), rgba(125, 211, 252, 0.06));
}
#game-screen.campaign-currents .cell.current-shift {
  animation: current-shift 0.42s ease-out;
}
#current-pill {
  display: none;
  color: #bae6fd;
  border-color: rgba(56, 189, 248, 0.45);
}
#game-screen.campaign-currents #current-pill {
  display: inline-flex;
}
@keyframes current-shift {
  0% {
    filter: brightness(1);
    transform: translateX(0);
  }
  45% {
    filter: brightness(1.7);
    transform: translateX(var(--current-nudge, 4px));
  }
  100% {
    filter: brightness(1);
    transform: translateX(0);
  }
}
@media (prefers-reduced-motion: reduce) {
  #game-screen.campaign-currents .cell.current-shift {
    animation: none;
    outline: 2px solid #7dd3fc;
    outline-offset: -2px;
  }
}

/* Frost (c4_frost, P6 Track S): a permafrosted tile reads frozen at a
   glance: icy border and a cool wash over the block. The class is only
   toggled from live freeze state (GS._frozenCells), so it appears on freeze
   levels alone; no chapter scoping needed to keep it honest. */
.cell.frozen {
  border-color: rgba(103, 232, 249, 0.6);
  background: linear-gradient(180deg, rgba(103, 232, 249, 0.18), rgba(14, 116, 144, 0.1));
  box-shadow: inset 0 0 10px rgba(103, 232, 249, 0.12);
}
/* The next-strike telegraph row (currents, P6 c1a hookup): brighter than
   the band, so the band says "in this range" and this says "HERE next". */
.cell.current-next {
  border-color: rgba(125, 211, 252, 0.85);
  box-shadow: inset 0 0 12px rgba(56, 189, 248, 0.18);
}
/* Dusk (c7_dusk, P6 C batch 1 hookup): a shadowed cell keeps its block
   shape but renders as an unlabelled silhouette. */
.cell.shadowed .block {
  color: transparent;
  text-shadow: none;
  background: linear-gradient(180deg, rgba(129, 140, 248, 0.22), rgba(49, 46, 129, 0.25));
}
/* Heat vent telegraph (c3_ember, P7 close-out): the next-eruption column
   glows ember-hot, the Ember season accent #fb923c (ten-season program S2
   identity table). Column-wide, the column form of the currents band, so
   the player sees WHERE the slump lands before it fires. */
.cell.vent-next {
  border-color: rgba(251, 146, 60, 0.65);
  box-shadow: inset 0 0 12px rgba(251, 146, 60, 0.22);
}
#heat-pill {
  color: #fed7aa;
  border-color: rgba(251, 146, 60, 0.65);
}
#heat-pill[hidden] {
  display: none;
}
.cell.vent-erupt {
  animation: vent-erupt 0.42s ease-out;
}
@keyframes vent-erupt {
  45% {
    filter: brightness(1.7);
    transform: translateY(-6px);
  }
}
@media (prefers-reduced-motion: reduce) {
  .cell.vent-erupt {
    animation: none;
    outline: 2px solid #fb923c;
    outline-offset: -2px;
  }
}
/* Treasure gild (c8_golden, P7 close-out): the cell about to seal glows
   gold, the Golden season accent #eab308 (ten-season program S2 identity
   table), the single-cell form of the same telegraph, gone the moment the
   seal drops. */
.cell.gilded {
  border-color: rgba(234, 179, 8, 0.7);
  box-shadow: inset 0 0 12px rgba(234, 179, 8, 0.25);
}

/* Bloom vines (c5_bloom, P6 Track S): the -3 overgrowth sentinel renders
   as a leafy mass, greener and denser than the tar boulder so the two
   obstacles never read as one. The border/inset glow traces the Bloom
   season accent #f472b6 (ten-season program S2 identity table); the body
   is foliage green. Keyed on the sentinel value via Tiers.valueClass
   (block-vine), so it appears exactly where a vine is. */
.block-vine {
  background: radial-gradient(ellipse at 50% 20%, #4ade80, #15803d 55%, #14532d);
  border: 1px solid rgba(244, 114, 182, 0.55);
  box-shadow:
    0 2px 8px rgba(0, 0, 0, 0.5),
    inset 0 2px 6px rgba(134, 239, 172, 0.45),
    inset 0 -3px 7px rgba(0, 0, 0, 0.6);
  font-size: 1rem;
}

/* Ashfall (S3.1): the -4 sentinel settled by Engine.applyAshfall reads as a
   grey ash drift with a faint ember glow, distinct from the tar boulder's
   purple rock. Intentionally season-neutral: no shipped decade authors
   ashfall yet, so no S2 accent is traced; when a season does, its accent
   can be traced here per the identity table. Keyed on the sentinel value
   via Tiers.valueClass (block-ash), so it appears exactly where ash is. */
.block-ash {
  background: radial-gradient(ellipse at 50% 20%, #cbd5e1, #64748b 55%, #334155);
  border: 1px solid rgba(251, 146, 60, 0.45);
  box-shadow:
    0 2px 8px rgba(0, 0, 0, 0.5),
    inset 0 2px 6px rgba(251, 146, 60, 0.35),
    inset 0 -3px 7px rgba(0, 0, 0, 0.6);
  font-size: 1rem;
}
