
@keyframes typing { from { opacity: 0; transform: translateY(8px); } to { opacity: 1; transform: translateY(0); } }
.type-char { display: inline-block; animation: typing 0.09s forwards; opacity: 0; }

@keyframes floatUp { 0% { transform: translateY(0) scale(1); opacity: 1; } 100% { transform: translateY(-190px) scale(0.4); opacity: 0; } }

@keyframes shake { 0%, 100% { transform: translateX(0) rotate(0); } 25% { transform: translateX(-6px) rotate(-6deg); } 75% { transform: translateX(6px) rotate(6deg); } }
.shaking { animation: shake 2.2s ease-in-out infinite; }

.heart-grow { transform: scale(1.4); transition: transform 0.5s cubic-bezier(0.175, 0.885, 0.32, 1.275); }
.lid-open { transform: translateY(-40px) rotate(12deg); opacity: 0; transition: all 0.8s ease; }

@keyframes fadeRiseIn {
  from { opacity: 0; transform: translateY(18px); }
  to { opacity: 1; transform: translateY(0); }
}

@keyframes glowPulse {
  0%, 100% { text-shadow: 0 0 18px rgba(232,194,122,0.55), 0 0 4px rgba(255,255,255,0.4); transform: scale(1); }
  50% { text-shadow: 0 0 34px rgba(232,194,122,0.9), 0 0 10px rgba(255,255,255,0.6); transform: scale(1.06); }
}

@keyframes softDrift {
  0% { transform: translate3d(0,0,0); opacity: 0; }
  10% { opacity: var(--particle-opacity, 0.55); }
  90% { opacity: var(--particle-opacity, 0.55); }
  100% { transform: translate3d(var(--drift-x, 6px), var(--drift-y, -60px), 0); opacity: 0; }
}

@keyframes gentleBreath {
  0%, 100% { transform: scale(1); }
  50% { transform: scale(1.035); }
}

@keyframes envelopeInvite {
  0%, 100% { transform: translateY(0); }
  50% { transform: translateY(-6px); }
}

@keyframes sealGlow {
  0%, 100% { box-shadow: inset 0 0 6px rgba(0,0,0,0.6), 0 0 0 rgba(232,194,122,0); }
  50% { box-shadow: inset 0 0 6px rgba(0,0,0,0.6), 0 0 16px rgba(232,194,122,0.55); }
}

@keyframes heartsFadeParticle {
  0% { transform: translateY(0) rotate(0deg) scale(0.7); opacity: 0; }
  15% { opacity: 1; }
  100% { transform: translateY(-40vh) rotate(20deg) scale(1.1); opacity: 0; }
}
