/*
 * Sweet Shift Saga — Proprietary Source Code
 * Copyright © 2026 Alex Brow / Mob Productions. All rights reserved.
 * Property of Alex Brow / Mob Productions.
 * Developed using the SOI Engine.
 * Unauthorized copying, redistribution, or commercial use of this source code is prohibited without permission.
 */

/* v4.0.4.14 — authoritative gameplay performance layer.
   This file deliberately loads AFTER board-v2.css so old art-polish rules
   cannot silently restore expensive filters/continuous animations. */

#board.saga-board {
  contain: layout paint style !important;
  isolation: isolate !important;
}

#board.saga-board .cell-layer,
#board.saga-board .hole-layer,
#board.saga-board .blocker,
#board.saga-board .blocker .blocker-art,
#board.saga-board .licorice-lock,
#board.saga-board .cannon-shooter,
#board.saga-board .cannon-special-icon,
#board.saga-board .piece .candy {
  filter: none !important;
}

/* Supplied PNGs already contain depth. A live CSS drop-shadow on dozens of
   blockers is pure repaint cost. */
#board.saga-board .blocker .blocker-art,
#board.saga-board .blocker-prism .blocker-art::after,
#board.saga-board .blocker-candyCane .blocker-art::after,
#board.saga-board .licorice-lock {
  box-shadow: none !important;
}

/* Never run decorative infinite animation on active board pieces. State-change
   animations (new/removing/hint) remain available. */
#board.saga-board .piece.bomb .candy,
#board.saga-board .piece.bomb .candy::before,
#board.saga-board .piece.bomb .candy::after,
#board.saga-board .cannon-shooter,
#board.saga-board .cannon-shooter *,
#board.saga-board .blocker .blocker-art,
#board.saga-board .blocker .blocker-art::before,
#board.saga-board .blocker .blocker-art::after {
  animation: none !important;
}

#board.saga-board .fx-layer {
  contain: layout paint style !important;
}

/* Normal board surface: one gradient, not a radial+linear+multi-shadow stack
   on every one of the 81 slots. */
#board.saga-board .board-slot,
#board.saga-board .board-cell:nth-child(even) .board-slot,
#board.saga-board .board-cell:nth-child(2n) .board-slot {
  background: linear-gradient(180deg,#1179b9 0%,#0b6cac 55%,#08609d 100%) !important;
  box-shadow: inset 0 1px 0 rgba(162,224,255,.18) !important;
}

/* Dense boards are the real worst-case: lots of Jelly + blockers + moving
   candy. Automatically simplify only those boards. */
#board.saga-board.dense-performance-board .board-slot,
#board.saga-board.dense-performance-board .board-cell:nth-child(even) .board-slot,
#board.saga-board.dense-performance-board .board-cell:nth-child(2n) .board-slot {
  background: #0b6cab !important;
  box-shadow: none !important;
}

#board.saga-board.dense-performance-board .jelly-mark,
#board.saga-board.dense-performance-board .jelly-mark.layer2 {
  box-shadow: none !important;
}

#board.saga-board.dense-performance-board .piece .candy,
#board.saga-board.dense-performance-board .blocker,
#board.saga-board.dense-performance-board .blocker .blocker-art,
#board.saga-board.dense-performance-board .licorice-lock,
#board.saga-board.dense-performance-board .cannon-shooter,
#board.saga-board.dense-performance-board .cannon-special-icon {
  filter: none !important;
  text-shadow: none !important;
}

#board.saga-board.dense-performance-board .blocker-prism .blocker-art::after,
#board.saga-board.dense-performance-board .blocker-candyCane .blocker-art::after {
  box-shadow: none !important;
}

/* During a large resolution, make the board a no-decoration paint path. */
#board.saga-board.big-move-fast .board-slot,
#board.saga-board.big-move-fast .jelly-mark,
#board.saga-board.big-move-fast .blocker,
#board.saga-board.big-move-fast .blocker .blocker-art,
#board.saga-board.big-move-fast .piece .candy {
  filter: none !important;
  box-shadow: none !important;
  animation: none !important;
}

/* The HUD must never cause backdrop-filter recomposition while the board is
   moving underneath it. */
body.playing-level .glass-console,
body.playing-level .game-mobile-header,
body.playing-level .future-booster-tray,
body.playing-level .modal-card {
  backdrop-filter: none !important;
  -webkit-backdrop-filter: none !important;
}

/* =====================================================================
   v4.1.0.0 — CLASSIC MULTI-HIT VISUALS + WORLD 5/6 BLOCKERS
   Multi-hit state is communicated by artwork, never small hit-count numbers.
   ===================================================================== */

/* Never render HP numerals over gameplay objects. Sugar Bomb countdowns are
   intentionally excluded: a timer is a gameplay timer, not blocker HP. */
#board.saga-board .blocker::after,
#board.saga-board .blocker::before,
#board.saga-board .blocker .blocker-layers,
#board.saga-board .licorice-lock::after,
#board.saga-board .jelly-mark.layer2::after {
  content:none !important;
  display:none !important;
}

/* New classic blockers use supplied damage-state PNGs. */
#board.saga-board .blocker-cake[data-hp="4"] .blocker-art {
  background-image:url("../assets/blockers/individual/cake/cake_intact.png") !important;
}
#board.saga-board .blocker-cake[data-hp="3"] .blocker-art {
  background-image:url("../assets/blockers/individual/cake/cake_damaged_1.png") !important;
}
#board.saga-board .blocker-cake[data-hp="2"] .blocker-art {
  background-image:url("../assets/blockers/individual/cake/cake_damaged_2.png") !important;
}
#board.saga-board .blocker-cake[data-hp="1"] .blocker-art {
  background-image:url("../assets/blockers/individual/cake/cake_broken.png") !important;
}

#board.saga-board .blocker-liquoriceCage[data-hp="3"] .blocker-art {
  background-image:url("../assets/blockers/individual/liquorice_cage/liquorice_cage_layer_3.png") !important;
}
#board.saga-board .blocker-liquoriceCage[data-hp="2"] .blocker-art {
  background-image:url("../assets/blockers/individual/liquorice_cage/liquorice_cage_layer_2.png") !important;
}
#board.saga-board .blocker-liquoriceCage[data-hp="1"] .blocker-art {
  background-image:url("../assets/blockers/individual/liquorice_cage/liquorice_cage_layer_1.png") !important;
}

#board.saga-board .blocker-magicStar[data-hp="2"] .blocker-art {
  background-image:url("../assets/blockers/individual/magic_star_block/magic_star_block_intact.png") !important;
}
#board.saga-board .blocker-magicStar[data-hp="1"] .blocker-art {
  background-image:url("../assets/blockers/individual/magic_star_block/magic_star_block_cracked.png") !important;
}

/* Rope Crates are colour-keyed. Purple/Orange use the closest supplied crate
   artwork plus a simple colour core; there is still no text/number overlay. */
#board.saga-board .blocker-ropeCrate[data-color="0"] .blocker-art {
  background-image:url("../assets/blockers/individual/rope_crate/rope_crate_red.png") !important;
}
#board.saga-board .blocker-ropeCrate[data-color="1"] .blocker-art {
  background-image:url("../assets/blockers/individual/rope_crate/rope_crate_yellow.png") !important;
}
#board.saga-board .blocker-ropeCrate[data-color="2"] .blocker-art {
  background-image:url("../assets/blockers/individual/rope_crate/rope_crate_blue.png") !important;
}
#board.saga-board .blocker-ropeCrate[data-color="3"] .blocker-art {
  background-image:url("../assets/blockers/individual/rope_crate/rope_crate_green.png") !important;
}
#board.saga-board .blocker-ropeCrate[data-color="4"] .blocker-art {
  background-image:url("../assets/blockers/individual/rope_crate/rope_crate_blue.png") !important;
}
#board.saga-board .blocker-ropeCrate[data-color="5"] .blocker-art {
  background-image:url("../assets/blockers/individual/rope_crate/rope_crate_yellow.png") !important;
}
#board.saga-board .blocker-ropeCrate .blocker-art::after {
  content:"" !important;
  display:block !important;
  position:absolute !important;
  left:41% !important;
  top:41% !important;
  width:18% !important;
  height:18% !important;
  border:2px solid rgba(255,255,255,.92) !important;
  border-radius:50% !important;
  box-shadow:none !important;
}
#board.saga-board .blocker-ropeCrate[data-color="0"] .blocker-art::after { background:#ef2553 !important; }
#board.saga-board .blocker-ropeCrate[data-color="1"] .blocker-art::after { background:#f6b61b !important; }
#board.saga-board .blocker-ropeCrate[data-color="2"] .blocker-art::after { background:#147ad5 !important; }
#board.saga-board .blocker-ropeCrate[data-color="3"] .blocker-art::after { background:#20b954 !important; }
#board.saga-board .blocker-ropeCrate[data-color="4"] .blocker-art::after { background:#7a44dc !important; }
#board.saga-board .blocker-ropeCrate[data-color="5"] .blocker-art::after { background:#f56c22 !important; }

/* One remaining rope layer gets a simple visual cut; still no numeral. */
#board.saga-board .blocker-ropeCrate[data-hp="1"] .blocker-art::before {
  content:"" !important;
  display:block !important;
  position:absolute !important;
  left:18% !important;
  top:48% !important;
  width:64% !important;
  height:3px !important;
  border-radius:999px !important;
  background:rgba(255,255,255,.88) !important;
  transform:rotate(-31deg) !important;
}

/* Mini art for Guide and goal icons. */
.mini-blocker-cake { background-image:url("../assets/blockers/individual/cake/cake_intact.png") !important; }
.mini-blocker-liquoriceCage { background-image:url("../assets/blockers/individual/liquorice_cage/liquorice_cage_layer_3.png") !important; }
.mini-blocker-ropeCrate { background-image:url("../assets/blockers/individual/rope_crate/rope_crate_blue.png") !important; }
.mini-blocker-magicStar { background-image:url("../assets/blockers/individual/magic_star_block/magic_star_block_intact.png") !important; }

/* v4.1.0.0 — Insanely Hard is a first-class campaign difficulty. */
.stable-level-node.insanely-hard .stable-node-disc {
  filter:saturate(1.08) contrast(1.05) !important;
  background-image:repeating-linear-gradient(-45deg,rgba(255,255,255,.22) 0 8px,rgba(255,255,255,0) 8px 15px),linear-gradient(180deg,#5f327f,#321a55 68%,#1f103e) !important;
}
.game-difficulty-badge.insanely-hard,
.difficulty.insanely-hard {
  background:linear-gradient(180deg,#5f327f,#281442) !important;
  color:#fff2ff !important;
}

/* Multi-hit Locks also communicate wear without a number badge. */
#board.saga-board .licorice-lock[data-hp="3"] { opacity:1 !important; }
#board.saga-board .licorice-lock[data-hp="2"] { opacity:.88 !important; }
#board.saga-board .licorice-lock[data-hp="1"] { opacity:.74 !important; }


/* =====================================================================
   v4.1.0.3 — CLASSIC SQUARE BOARD FRAME
   The gameplay grid itself is not a rounded card. Individual candy art may
   remain rounded; the 9×9 playfield uses hard square edges.
   ===================================================================== */
#board.saga-board,
#board.saga-board::before {
  border-radius:0 !important;
}

/* =====================================================================
   v4.1.0.8 — JAM FLAT-COST RENDER PATH
   Jam is a cell state, not a per-candy effect. Its visual cost should not
   explode as coverage approaches a full 9×9 board.
   ===================================================================== */

/* Old Jam DOM and candy glow paths are retired. The runtime now toggles a
   class on the existing board-cell and uses one cheap pseudo-element. */
#board.saga-board .jam-mark {
  display:none !important;
}
#board.saga-board .piece.on-jam .candy {
  outline:none !important;
  filter:none !important;
}

#board.saga-board .board-cell.has-jam::after {
  content:"";
  position:absolute;
  inset:3px;
  z-index:2;
  pointer-events:none;
  border:2px solid rgba(255,151,205,.72);
  border-radius:10px;
  background:rgba(238,62,154,.36);
  box-shadow:inset 0 1px 0 rgba(255,255,255,.22);
  opacity:.96;
}

/* Once Jam has covered a meaningful part of the board, remove the last
   nonessential board-surface paint costs. Candy artwork stays intact. */
#board.saga-board.jam-performance-board .board-slot,
#board.saga-board.jam-performance-board .board-cell:nth-child(even) .board-slot,
#board.saga-board.jam-performance-board .board-cell:nth-child(2n) .board-slot {
  background:#0b6cab !important;
  box-shadow:none !important;
}
#board.saga-board.jam-performance-board .board-cell.has-jam::after {
  border-color:rgba(255,164,207,.62) !important;
  background:rgba(231,61,151,.31) !important;
  box-shadow:none !important;
}
#board.saga-board.jam-performance-board .burst,
#board.saga-board.jam-performance-board .jelly-wave-fx,
#board.saga-board.jam-performance-board .character-assist-fx {
  display:none !important;
}

/* Jam and Jelly objective overlays never need transitions during a large
   resolution; they update only at the settled dirty cells. */
#board.saga-board.big-move-fast .board-cell.has-jam::after {
  transition:none !important;
  animation:none !important;
  box-shadow:none !important;
}
