/* AirData 2.0 motion (owner, 18.09.2026: «fewer static elements, floating and animated»). Everything moves by transform
   and opacity only; the idle float runs only on what is on screen (.mo-live, set by motion.js), and a phone that asks
   for less motion gets none of it. */
@keyframes moFloat { 0%, 100% { transform:translate3d(0, 0, 0); } 50% { transform:translate3d(0, -4px, 0); } }
@keyframes moFloatS { 0%, 100% { transform:translate3d(0, 0, 0); } 50% { transform:translate3d(0, -2.5px, 0); } }
@keyframes moRise { from { opacity:0; transform:translate3d(0, 22px, 0) scale(.97); } to { opacity:1; transform:none; } }
@keyframes moGrow { from { transform:scaleY(.05); } to { transform:scaleY(1); } }
@keyframes moGlow { 0%, 100% { box-shadow:0 10px 26px rgba(0,0,0,.35), 0 0 0 0 rgba(248,218,85,.0); } 50% { box-shadow:0 12px 30px rgba(0,0,0,.4), 0 0 22px 4px rgba(248,218,85,.35); } }
@keyframes moPulse { 0%, 100% { opacity:1; } 50% { opacity:.72; } }
@keyframes moKen { from { transform:scale(1.04) translate3d(0, 0, 0); } to { transform:scale(1.14) translate3d(-2%, -1.5%, 0); } }
@keyframes moRipple { from { transform:scale(.04); opacity:.6; } to { transform:scale(1); opacity:0; } }   /* scale, not r: Safari animates transforms only */
@keyframes moTwinkle { 0%, 100% { transform:scale(1); } 50% { transform:scale(1.45); } }
@keyframes moPlane { 0%, 100% { transform:translate3d(0, 0, 0) rotate(0deg); } 50% { transform:translate3d(6px, -3px, 0) rotate(-3deg); } }
@keyframes moShine { from { background-position:-160% 0; } to { background-position:260% 0; } }

/* the city behind the glass breathes slowly; the scroll gives it depth (motion.js moves --par) */
.scene .ph.on { animation:moKen 38s ease-in-out infinite alternate; }
.scene { transform:translate3d(0, var(--par, 0px), 0); }

/* entering a screen: the cards rise one after another */
.mo-in { animation:moRise .55s cubic-bezier(.2, .85, .25, 1) both; animation-delay:calc(var(--i, 0) * 55ms); }

/* in the air: cards and chips float, each in its own phase */
.mo-live.mo-f { animation:moFloat 6.5s ease-in-out infinite; animation-delay:calc(var(--i, 0) * -.9s); }
.mo-live.mo-fs { animation:moFloatS 5s ease-in-out infinite; animation-delay:calc(var(--i, 0) * -.6s); }
.mo-in.mo-live.mo-f { animation:moRise .55s cubic-bezier(.2, .85, .25, 1) both, moFloat 6.5s ease-in-out .6s infinite; animation-delay:calc(var(--i, 0) * 55ms), calc(var(--i, 0) * -.9s); }
.mo-in.mo-live.mo-fs { animation:moRise .55s cubic-bezier(.2, .85, .25, 1) both, moFloatS 5s ease-in-out .6s infinite; animation-delay:calc(var(--i, 0) * 55ms), calc(var(--i, 0) * -.6s); }
.mo-f, .mo-fs { will-change:transform; }

/* a press gives way under the finger */
.mo-f:active, .mo-fs:active, .v2-card:active, .tcard:active, .me-tile:active, .v2-opt:active { transform:scale(.97) !important; transition:transform .12s; }

/* the «Savol» button breathes */
nav#nav button.ask .fab { animation:moGlow 3.2s ease-in-out infinite, moFloatS 4s ease-in-out infinite; }
nav#nav button.on:not(.ask) svg.i { animation:moFloatS 3s ease-in-out infinite; }

/* numbers and bars */
.v2-spark i { transform-origin:bottom; animation:moGrow .8s cubic-bezier(.2, .85, .25, 1) both; animation-delay:calc(var(--b, 0) * 45ms + .2s); }
.v2-verdict.buy, .v2-verdict.big { animation:moPulse 2.6s ease-in-out infinite; }
.radar .big, .pl-totals .tot b, .tcard .price { display:inline-block; }
.v2-ask { background-image:linear-gradient(100deg, transparent 30%, rgba(255,236,170,.14) 50%, transparent 70%); background-size:200% 100%; animation:moShine 5s ease-in-out 1s infinite; }

/* the price sky: a wave leaves home, the cheap dots twinkle */
.v2-sky .ripple { fill:none; stroke:rgba(255,255,255,.5); stroke-width:1; transform-box:fill-box; transform-origin:center; animation:moRipple 3.6s ease-out infinite; }
.v2-sky .ripple.r2 { animation-delay:1.8s; }
.v2-sky circle[data-v2dest] { transform-box:fill-box; transform-origin:center; }
.v2-sky circle.cheap { animation:moTwinkle 2.4s ease-in-out infinite; animation-delay:calc(var(--i, 0) * -.37s); }

/* the travel day: the plane sails along its path */
.live .path svg.i { animation:moPlane 3.4s ease-in-out infinite; }

@media (prefers-reduced-motion: reduce) {
  .scene .ph.on, .mo-in, .mo-live.mo-f, .mo-live.mo-fs, nav#nav button.ask .fab, nav#nav button.on svg.i, .v2-spark i, .v2-verdict, .v2-ask,
  .v2-sky .ripple, .v2-sky circle.cheap, .live .path svg.i { animation:none !important; }
  .scene { transform:none; }
}
