@keyframes breathe{0%,100%{opacity:.65;filter:brightness(.9)}50%{opacity:1;filter:brightness(1.25)}}
@keyframes float{0%,100%{transform:translateY(0) scaleX(var(--facing,1))}50%{transform:translateY(-5px) scaleX(var(--facing,1))}}
@keyframes walk{from{transform:translateY(0) scaleX(var(--facing,1)) rotate(-2deg)}to{transform:translateY(-5px) scaleX(var(--facing,1)) rotate(2deg)}}
@keyframes forestStep{from{transform:translateY(0) scaleX(var(--facing,1)) scale(.98) rotate(-2deg)}to{transform:translateY(-4px) scaleX(var(--facing,1)) scale(1.025) rotate(2deg)}}
@keyframes heartbeat{0%,72%,100%{transform:rotate(-45deg) scale(1)}78%{transform:rotate(-45deg) scale(1.08)}84%{transform:rotate(-45deg) scale(1)}}
@keyframes nebulaDrift{from{transform:translate3d(-2%,1%,0) rotate(-24deg) scale(1)}to{transform:translate3d(3%,-2%,0) rotate(-21deg) scale(1.08)}}
@keyframes nebulaFloat{from{transform:translate3d(-2%,1%,0)}to{transform:translate3d(3%,-2%,0)}}
@keyframes plantGlow{0%,100%{opacity:.35}50%{opacity:.85}}
@keyframes lightLeak{0%{opacity:0;transform:translateX(-90%) rotate(-8deg)}25%{opacity:.7}65%{opacity:.48}100%{opacity:0;transform:translateX(90%) rotate(-8deg)}}
@keyframes flashLeak{0%{opacity:0}18%{opacity:.8}42%{opacity:.45}100%{opacity:0}}
@keyframes tinyPulse{0%,70%,100%{transform:scale(1)}78%{transform:scale(1.08)}86%{transform:scale(1)}}
@keyframes birthdayFlare{0%{opacity:0;transform:scaleX(.55)}24%{opacity:.5}100%{opacity:0;transform:scaleX(1.1)}}
@keyframes storyTravel{0%{transform:translateX(-50%) translateY(0) rotateX(7deg) scale(1)}89%,96%{transform:translateX(-50%) translateY(calc(var(--travel) + 68vh)) rotateX(16deg) scale(.7)}100%{transform:translateX(-50%) translateY(var(--travel)) rotateX(18deg) scale(.66)}}
@media(prefers-reduced-motion:reduce){.sky:before,.sky:after,.maze-world:after,.character img,.gift-orb{animation:none}.scene{transition-duration:.45s}.photo-main{transition-duration:2s}.heart-shape{animation-duration:5s}}
