@keyframes twinkle { 0%,100%{opacity:.25;transform:scale(.65)} 50%{opacity:1;transform:scale(1.25)} }
@keyframes roomArrive { from{opacity:0;transform:scale(.9)} to{opacity:1;transform:scale(1)} }
@keyframes fourthWallPulse { 0%{transform:scale(1);opacity:1} 34%{transform:scale(1.18);opacity:.98} 68%{transform:scale(1.62);opacity:.76} 100%{transform:scale(2.45);opacity:0} }
.world-stage.is-leaving { animation:fourthWallPulse .34s cubic-bezier(.42,0,.76,.25) forwards; transform-origin:center; }
@keyframes windowStar { from{left:-45px;top:58%} to{left:105%;top:12%} }
@keyframes portalPulse { 0%,100%{filter:saturate(.8) brightness(.9)} 50%{filter:saturate(1.4) brightness(1.25)} }
@keyframes keyFloat { 0%,100%{transform:translateY(0) rotate(-5deg)} 50%{transform:translateY(-12px) rotate(7deg)} }
@keyframes parchmentFly { 0%{transform:translateY(42vh) scale(.12) rotate(18deg);opacity:0} 46%{transform:translateY(-7vh) scale(.5) rotate(-8deg);opacity:1} 72%{transform:translateY(0) scale(.82) rotate(2deg)} 100%{transform:none;opacity:1} }
@keyframes albumAppear { to{transform:scale(1);opacity:1} }
@keyframes openCover { 0%{transform:rotateY(0)} 100%{transform:rotateY(-165deg);opacity:.72} }
@keyframes jumpFade { 0%{opacity:0} 18%{opacity:.78} 54%{opacity:1} 100%{opacity:0} }
@keyframes jumpLayer { 0%{transform:translate(-50%,-50%) scale(.15);opacity:0} 24%{opacity:.72} 100%{transform:translate(-50%,-50%) scale(2.3);opacity:0} }
@keyframes jumpStreak { 0%{transform:scale(.4);opacity:0} 35%{opacity:.55} 100%{transform:scale(2.2);opacity:0} }
.dimension-jump.is-active { animation:jumpFade .65s ease-out both; }
.dimension-jump.is-active .jump-layer { animation:jumpLayer .48s cubic-bezier(.3,0,.8,.35) both; }
.dimension-jump.is-active .l2{animation-delay:.06s}.dimension-jump.is-active .l3{animation-delay:.12s}.dimension-jump.is-active .l4{animation-delay:.18s}
.jump-streaks { animation:none; transform:scale(.4); }
.dimension-jump.is-active .jump-streaks { animation:jumpStreak .55s ease-out both; }
@keyframes cosmicFiveSeconds { 0%{opacity:0} 12%,82%{opacity:1} 100%{opacity:0} }
@keyframes desireText { 0%,16%{opacity:0;transform:scale(.85)} 30%,72%{opacity:1;transform:scale(1)} 92%,100%{opacity:0;transform:scale(1.08)} }
@keyframes cosmicStarTravel { 0%{left:-45vw;top:74%;opacity:0} 12%{opacity:1} 65%{left:120vw;top:10%;opacity:1} 100%{left:150vw;top:-10%;opacity:0} }
@media (prefers-reduced-motion: reduce) {
  *,*::before,*::after { animation-duration:.01ms !important; animation-iteration-count:1 !important; scroll-behavior:auto !important; }
  .world-stage.is-leaving { opacity:0; }
}


/* v3.1 · transición y evento cósmico optimizados */
@keyframes fourthWallPulseV31 { 0%{transform:translateZ(0) scale(1);opacity:1}45%{transform:translateZ(0) scale(1.12);opacity:.96}100%{transform:translateZ(0) scale(1.48);opacity:0} }
.world-stage.is-leaving { animation:fourthWallPulseV31 .23s cubic-bezier(.45,0,.8,.3) forwards; }
@keyframes jumpFadeV31 { 0%{opacity:0}22%,62%{opacity:.88}100%{opacity:0} }
@keyframes jumpLayerV31 { 0%{transform:translate(-50%,-50%) scale(.18);opacity:0}28%{opacity:.5}100%{transform:translate(-50%,-50%) scale(1.55);opacity:0} }
.dimension-jump.is-active { animation:jumpFadeV31 .44s ease-out both; }
.dimension-jump.is-active .jump-layer { animation:jumpLayerV31 .34s cubic-bezier(.3,0,.8,.35) both; }
.dimension-jump.is-active .l2{animation-delay:.035s}.dimension-jump.is-active .l3{animation-delay:.07s}.dimension-jump.is-active .l4{animation-delay:.105s}
.dimension-jump.is-active .jump-streaks { animation:jumpStreak .38s ease-out both; }
@keyframes desireTextV31 { 0%,18%{opacity:0;transform:scale(.86)}32%,72%{opacity:1;transform:scale(1)}92%,100%{opacity:0;transform:scale(1.06)} }
@keyframes cosmicStarTravelV31 { 0%{left:-58vw;top:78%;opacity:0;transform:rotate(-17deg) scale(.55)}10%{opacity:1}48%{left:24vw;top:43%;opacity:1;transform:rotate(-17deg) scale(1.14)}78%{left:112vw;top:8%;opacity:1;transform:rotate(-17deg) scale(.78)}100%{left:150vw;top:-8%;opacity:0;transform:rotate(-17deg) scale(.5)} }


@media (prefers-reduced-motion: reduce) {
  .app-shell,.google-departure,.google-departure-glow,.google-departure-message { transition-duration:.18s !important; }
  .map-cell.is-current { animation:none; }
}

/* v4.2 · animaciones livianas */
@keyframes noteGentleFloat {
  0%,100% { transform:translate3d(0,0,0) rotate(var(--note-tilt,-2deg)); }
  50% { transform:translate3d(0,-4px,0) rotate(calc(var(--note-tilt,-2deg) + .35deg)); }
}
.world-stage.is-leaving { animation:fourthWallPulseV31 .2s cubic-bezier(.45,0,.8,.3) forwards; }
.dimension-jump.is-active { animation:jumpFadeV31 .48s ease-out both; }
.dimension-jump.is-active .jump-layer { animation-duration:.32s; }


/* v4.2.2 · el salto permanece como pantalla de carga hasta que la sala esté lista */
@keyframes jumpFadeLoading {
  0% { opacity:0; }
  34% { opacity:1; }
  100% { opacity:1; }
}
.dimension-jump { transition:opacity .16s ease; }
.dimension-jump.is-active { animation:jumpFadeLoading .48s ease-out both; }
