@keyframes fadeIn { from { opacity: 0; } to { opacity: 1; } }
@keyframes slideUp { from { opacity: 0; transform: translate3d(0, 24px, 0); } to { opacity: 1; transform: translate3d(0, 0, 0); } }
@keyframes shimmer { 0% { background-position: -200% 0; } 100% { background-position: 200% 0; } }
@keyframes ripple { to { transform: scale(4); opacity: 0; } }
@keyframes botanicalFloat { 0% { opacity: 0; transform: translate3d(0, 0, 0) rotate(0deg); } 15% { opacity: 0.75; } 85% { opacity: 0.75; } 100% { opacity: 0; transform: translate3d(-120px, -450px, 0) rotate(180deg); } }
@keyframes pulseSoft { 0%, 100% { transform: scale(1); opacity: 1; } 50% { transform: scale(1.03); opacity: 0.85; } }
.animate-fade-in { animation: fadeIn var(--duration-std) var(--ease-luxury) forwards; }
.animate-slide-up { animation: slideUp var(--duration-slow) var(--ease-luxury) forwards; }
.animate-pulse { animation: pulseSoft 3s infinite var(--ease-organic); }
.reveal-on-scroll { opacity: 0; transform: translate3d(0, 28px, 0); transition: opacity var(--duration-slow) var(--ease-luxury), transform var(--duration-slow) var(--ease-luxury); will-change: opacity, transform; }
.reveal-on-scroll.is-revealed { opacity: 1; transform: translate3d(0, 0, 0); }