@keyframes breathe { 0%, 100% { transform: scale(1) rotate(-2deg); } 50% { transform: scale(1.05) rotate(1deg); } }
@keyframes loading-turn { to { transform: rotate(360deg); } }
@keyframes photo-arrive { from { opacity: 0; translate: 0 18px; scale: .86; filter: blur(5px); } to { opacity: 1; translate: 0 0; scale: 1; filter: blur(0); } }
@keyframes message-arrive { from { opacity: 0; translate: 0 7px; } to { opacity: .87; translate: 0 0; } }
@keyframes sway { 0%, 100% { rotate: -1deg; translate: 0 0; } 50% { rotate: 1deg; translate: 0 -2px; } }
.loading img { animation: loading-turn 10s linear infinite; }
.enter-flower img { animation: breathe 5s ease-in-out infinite; }
body:not(.photos-ready) .photo { visibility: hidden; pointer-events: none; }
body.photos-ready .photo { animation: photo-arrive 1.2s var(--delay) cubic-bezier(.2,.7,.2,1) both; }
body.messages-ready .floating-message { animation: message-arrive 2s var(--delay) both; }
body.flowers-ready .garden-flower { animation: message-arrive 2s var(--delay) both, sway 12s ease-in-out infinite; }
body.messages-ready .repositioned .floating-message { animation: none; opacity: .94; }
.floating-messages { transition: opacity .45s ease; }
.floating-messages.is-changing { opacity: 0; }
body.flowers-ready .repositioned .garden-flower { animation: sway 12s ease-in-out infinite; opacity: .94; }
body.is-hidden *, body.has-dialog .garden *, body.has-dialog .intro * { animation-play-state: paused !important; }
@media (hover: hover) and (pointer: fine) {
  .enter-flower:hover img { filter: drop-shadow(0 0 22px #f2c94c69); }
  .photo:hover { z-index: 6; }
  .photo:hover .photo-frame { transform: scale(1.065) rotate(1deg); box-shadow: 0 10px 30px #0009, 0 0 20px #edcf6a20; }
  .letter-button:hover { background: #c7ac3938; }
  .icon-button:not(:disabled):hover { background: #e5ce6720; }
}
@media (prefers-reduced-motion: reduce) {
  *, *::before, *::after { scroll-behavior: auto !important; transition-property: opacity !important; transition-duration: .2s !important; animation-duration: .2s !important; animation-delay: 0s !important; animation-iteration-count: 1 !important; }
  .enter-flower img { animation: none; }
  body.photos-ready .photo { animation: none; opacity: 1; }
  body.flowers-ready .garden-flower, body.messages-ready .floating-message { animation: none; opacity: .94; }
}
