/* Spirit effects are decorative: no layout, hit areas, or game timing. */
.spirit-ambience,
.spirit-bursts {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  pointer-events: none;
  user-select: none;
}
.spirit-ambience {
  --spirit-light: 133, 223, 177;
  z-index: 0;
  overflow: hidden;
  contain: strict;
}
.env-1 .spirit-ambience { --spirit-light: 241, 195, 116; }
.env-3 .spirit-ambience { --spirit-light: 169, 190, 255; }
.spirit-ambience::before,
.spirit-ambience::after {
  content: '';
  position: absolute;
  inset: 12% -20% 21%;
  background: radial-gradient(ellipse at 25% 35%, rgba(var(--spirit-light), .19), transparent 48%),
    radial-gradient(ellipse at 78% 74%, rgba(var(--spirit-light), .12), transparent 38%);
  animation: spirit-breath 12s ease-in-out infinite alternate;
}
.spirit-ambience::after {
  inset: 17% 15% 30%;
  background: conic-gradient(from 155deg at 58% 0%, transparent 0deg, rgba(var(--spirit-light), .07) 12deg, transparent 28deg);
  animation-duration: 19s;
  animation-delay: -7s;
}
.spirit-mote {
  position: absolute;
  left: var(--mote-x);
  top: var(--mote-y);
  width: 3px;
  height: 3px;
  border-radius: 50%;
  color: rgb(var(--spirit-light));
  background: currentColor;
  box-shadow: 0 0 7px 2px currentColor;
  opacity: .15;
  animation: spirit-drift var(--mote-time) ease-in-out var(--mote-delay) infinite alternate;
}
.spirit-mote:nth-child(3n) { width: 2px; height: 2px; }
.game-shell.has-modal > .spirit-ambience { display: none; }
.spirit-bursts { z-index: 44; contain: strict; }
.casino-vfx-host > .spirit-bursts { z-index: 9; }
.modal > .spirit-bursts { z-index: 20; }
/* The image particles replace the prototype's plain yellow dots. */
.game-shell.spirit-effects > .particle { display: none; }
.casino-vfx-host > .spirit-ambience {
  --spirit-light: 222, 101, 120;
  z-index: 1;
  mix-blend-mode: screen;
}
.casino-vfx-host > .spirit-ambience::before { inset: 8% -10% 7%; opacity: .8; }
.casino-vfx-host > .spirit-ambience::after { display: none; }
.casino-vfx-host.spirit-spinning > .spirit-ambience::before {
  background: radial-gradient(ellipse at 50% 43%, rgba(239, 102, 105, .28), transparent 62%);
  animation: spirit-casino-breath 1.8s ease-in-out infinite alternate;
}
.spirit-casting { animation: spirit-cast-light .38s ease-out; }
.spirit-critical { animation: spirit-critical-light .55s ease-out; }
.spirit-feedback { animation: spirit-control-light .22s ease-out; }
.spirit-effects.spirit-paused .spirit-ambience::before,
.spirit-effects.spirit-paused .spirit-ambience::after,
.spirit-paused .spirit-mote { animation-play-state: paused; }
@keyframes spirit-breath {
  from { opacity: .45; transform: translate(-2%, 1%) scale(.97); }
  to { opacity: 1; transform: translate(3%, -2%) scale(1.04); }
}
@keyframes spirit-drift {
  0% { opacity: .12; transform: translate3d(-7px, 11px, 0); }
  55% { opacity: .65; }
  100% { opacity: .2; transform: translate3d(12px, -24px, 0); }
}
@keyframes spirit-casino-breath { from { opacity: .45; } to { opacity: 1; } }
@keyframes spirit-cast-light {
  25% { filter: drop-shadow(0 0 9px #b6f0be99); }
}
@keyframes spirit-critical-light {
  25% { filter: drop-shadow(0 0 17px #ffe2a8bb); }
}
@keyframes spirit-control-light {
  30% { filter: brightness(1.15) drop-shadow(0 0 4px #ebd69b66); }
}
@media (prefers-reduced-motion: reduce) {
  .game-shell.spirit-effects .spirit-ambience::before,
  .game-shell.spirit-effects .spirit-ambience::after { animation: none; opacity: .45; }
  .spirit-mote,
  .spirit-bursts { display: none; }
  .spirit-casting,
  .spirit-critical,
  .spirit-feedback { animation: spirit-control-light .16s ease-out; }
  .spirit-effects .hero-art.impact { animation: none; }
  .spirit-effects .floating-number { animation: spirit-number-still .65s ease-out both; }
  .spirit-effects .floater { animation: none; opacity: .2; }
}
@keyframes spirit-number-still {
  0%, 65% { opacity: 1; transform: translateX(-50%); }
  100% { opacity: 0; transform: translateX(-50%); }
}
