/* Glam Run motion core — screen audit complete; bind verified DOM targets.
   One transform owner per node. Use existing nested layers for combined effects.
   No base typography, colors, dimensions, positioning or layout is changed. */
:root { --m-ease: cubic-bezier(.22,.61,.36,1); }
.m-breathe { animation: m-breathe 3.6s ease-in-out infinite; transform-origin: 50% 95%; }
.m-pulse { animation: m-pulse 2.4s ease-in-out infinite; }
/* Apply these to dedicated, already-positioned decorative layers, never text. */
.m-glow { opacity: .18; animation: m-glow 3.8s ease-in-out infinite; pointer-events: none; }
.m-sparkle { animation: m-sparkle 4.8s ease-in-out infinite; animation-delay: var(--m-delay, 0s); pointer-events: none; }
.m-shine { animation: m-shine 6s ease-in-out infinite; pointer-events: none; }
.m-page-enter { animation: m-page-enter 280ms var(--m-ease) both; }
.m-sheet-up { animation: m-sheet-up 320ms var(--m-ease) both; }
.m-fade { animation: m-fade 220ms ease-out both; }
.m-tap { -webkit-tap-highlight-color: transparent; }
/* Opt-in only on an EXISTING horizontal scroller. Keep its sizing/layout intact.
   Both pan axes and pinch zoom stay native; no forced touch-action: pan-x. */
.m-swipe { scroll-snap-type: x proximity; scroll-behavior: auto; touch-action: auto; }
.m-swipe > [data-m-snap] { scroll-snap-align: center; }
/* Vertical lists keep their native scroll behavior; no vertical snap imposed. */
@keyframes m-breathe { 0%,100% { transform: translateY(0) rotate(0) scaleY(1); } 50% { transform: translateY(-1px) rotate(.12deg) scaleY(1.003); } }
@keyframes m-pulse { 0%,100% { transform: scale(1); } 50% { transform: scale(1.012); } }
@keyframes m-glow { 0%,100% { opacity: .16; transform: scale(.99); } 50% { opacity: .3; transform: scale(1.025); } }
@keyframes m-sparkle { 0%,20%,60%,100% { opacity: 0; transform: scale(.75); } 38% { opacity: .58; transform: scale(1); } }
@keyframes m-shine { 0%,65% { opacity: 0; transform: translateX(-105%); } 70% { opacity: .2; } 88%,100% { opacity: 0; transform: translateX(105%); } }
@keyframes m-page-enter { from { opacity: 0; transform: translateY(5px); } to { opacity: 1; transform: translateY(0); } }
@keyframes m-sheet-up { from { opacity: 0; transform: translateY(12px); } to { opacity: 1; transform: translateY(0); } }
@keyframes m-fade { from { opacity: 0; } to { opacity: 1; } }
/* Scope only this package's animations. Existing game animations untouched. */
:is(.hidden,[hidden],[data-m-paused="true"]) :is(.m-breathe,.m-pulse,.m-glow,.m-sparkle,.m-shine,.m-page-enter,.m-sheet-up,.m-fade),
:is(.hidden,[hidden],[data-m-paused="true"]):is(.m-breathe,.m-pulse,.m-glow,.m-sparkle,.m-shine,.m-page-enter,.m-sheet-up,.m-fade),
[data-m-document-hidden="true"] :is(.m-breathe,.m-pulse,.m-glow,.m-sparkle,.m-shine,.m-page-enter,.m-sheet-up,.m-fade) { animation-play-state: paused; }
/* During a run, decorative loops are off globally. HUD one-shots remain JS-only. */
[data-m-running="true"] :is(.m-breathe,.m-pulse,.m-glow,.m-sparkle,.m-shine) { animation-play-state: paused; }
@media (prefers-reduced-motion: reduce) {
  .m-breathe,.m-pulse,.m-glow,.m-sparkle,.m-shine { animation: none; }
  .m-sparkle,.m-shine { opacity: 0; }
  .m-page-enter,.m-sheet-up { animation: m-fade 180ms ease-out both; }
  .m-swipe { scroll-snap-type: none; scroll-behavior: auto; }
}

/* A disabled CTA never asks for attention. */
.m-pulse:disabled,.m-pulse[aria-disabled="true"] { animation: none; }

/* Event celebrations run once; do not re-add on scroll or focus. */
.m-once { animation-iteration-count: 1; }
