/* Popex v130 — Battery-first animation budget. No gameplay changes. */
/* At most 8 Bloopkins actively animate while all others keep their faces,
   colors, lighting and hit targets. Actual reactions/pops always run normally. */
#gameStage #board > .cell.filled.pw130-static:not(.pop-now):not(.line-primed)::before{
  animation:none!important;
  will-change:auto!important;
  transform:none;
}
#gameStage #board > .cell.filled.pw130-static:not(.pop-now):not(.line-primed) .face,
#gameStage #board > .cell.filled.pw130-static:not(.pop-now):not(.line-primed) .face .eye,
#gameStage #board > .cell.filled.pw130-static:not(.pop-now):not(.line-primed) .face .eye::after,
#gameStage #board > .cell.filled.pw130-static:not(.pop-now):not(.line-primed) .face .eye .pupil{
  animation:none!important;
  will-change:auto!important;
}
/* Even when alive, don't permanently promote every tiny pupil to a separate
   composited GPU layer. The browser can promote on demand. */
#gameStage #board > .cell.filled .face .eye .pupil{will-change:auto!important}
/* Only one rack pocket needs to breathe at a time. Keep the BUTTON stationary
   (stable iPhone hit target) and animate its membrane pseudo-element instead. */
#gameStage > #rack > .piece:not([aria-pressed="true"]),
#gameStage > #rack > .piece:not([aria-pressed="true"])::before{
  animation:none!important;
  filter:none!important;
}
#gameStage > #rack > .piece[aria-pressed="true"]{
  animation:none!important;
}
#gameStage > #rack > .piece[aria-pressed="true"]::before{
  animation:pw130PocketFloat 8s ease-in-out infinite!important;
}
@keyframes pw130PocketFloat{
  0%,100%{transform:translate3d(0,0,0) scale(1)}
  50%{transform:translate3d(0,-1px,0) scale(1.012,.994)}
}
#gameStage > #rack .piece:not([aria-pressed="true"]) .minicell.on{animation:none!important}
#gameStage > #rack .piece[aria-pressed="true"] .minicell.on{
  animation:rackAlive 7.1s ease-in-out infinite!important;
}
/* Glass stays glass; skip continuously animating border-radius + brightness
   on controls and the mission pane. Static gradient/shadow is preserved. */
.moonlit-app .bloop-header .top-bubble::before{animation:none!important}
#gameStage>.queue-title .challenge-hud:not([hidden])::before{animation:none!important}
/* Never have off-screen compositor work while the PWA/browser is hidden. */
body.pw130-background *,body.pw130-background *::before,body.pw130-background *::after{
  animation-play-state:paused!important;
}
@media(prefers-reduced-motion:reduce){
  #gameStage > #rack > .piece[aria-pressed="true"]::before,
  #gameStage > #rack .piece[aria-pressed="true"] .minicell.on{animation:none!important}
}
