/* The existing forest scenes, paced as arrival / recognition / time together.
   body.js owns one 1.8s event dissolve and one 2.1s projector exposure. */
#invitation-page #events-list .season-transition.is-crossing .season-outgoing {
  animation: tender-ceremony-dissolve 1800ms cubic-bezier(.28,.12,.2,1) both;
}
#invitation-page #events-list .season-transition.is-crossing .season-outgoing-copy {
  animation: tender-ceremony-depart 600ms ease both;
}
#invitation-page #events-list .season-light-veil {
  background: radial-gradient(ellipse at 48% 41%,rgb(231 205 152/.18),rgb(160 121 63/.04) 36%,transparent 65%);
}
#invitation-page #events-list .season-transition.is-crossing .season-light-veil {
  animation: tender-ceremony-daylight 1800ms ease both;
}
/* The scene changes behind a fixed reading plane. No section or text scales. */
#invitation-page #events-list .ceremony.is-season-entering .ceremony-art { animation: none; transform: none; }
#invitation-page #events-list .ceremony.is-season-entering .ceremony-copy>* {
  animation: tender-ceremony-words 800ms cubic-bezier(.22,.62,.28,1) 850ms both;
}
#invitation-page #events-list .ceremony.is-season-entering .ceremony-copy .ceremony-date { animation-delay: 450ms; }
#invitation-page #events-list .ceremony.is-season-entering .ceremony-copy h3 { animation-delay: 600ms; }
#invitation-page #events-list .ceremony.is-season-entering .ceremony-copy .ceremony-venue { animation-delay: 750ms; }
@keyframes tender-ceremony-dissolve { 0%,14% { opacity: 1; } 82%,100% { opacity: 0; } }
@keyframes tender-ceremony-depart { 0%,20% { opacity: 1; } 100% { opacity: 0; } }
@keyframes tender-ceremony-daylight { 0%,100% { opacity: 0; } 44% { opacity: .46; } }
@keyframes tender-ceremony-words { from { opacity: 0; } to { opacity: 1; } }

/* Default artwork receives one deliberate camera arrival, then rests. The
   existing matching film keeps its own motion; uploaded images are untouched. */
#invitation-page #events-list .ceremony.has-authored-scene .ceremony-art>img,
#invitation-page #events-list .ceremony.has-authored-scene[data-scene='music'] .ceremony-art>img,
#invitation-page #events-list .ceremony.has-authored-scene[data-scene='vows'] .ceremony-art>img {
  transform-origin: 50% 46%; animation: tender-ceremony-arrive 6.2s cubic-bezier(.2,.58,.3,1) both paused;
}
#invitation-page #events-list .ceremony.has-authored-scene.is-chapter-active .ceremony-art>img { animation-play-state: running; }
#invitation-page #events-list .ceremony.has-authored-scene .ceremony-art:has(.scene-film.is-ready)>img { animation-play-state: paused; }
@keyframes tender-ceremony-arrive {
  0% { transform: scale(1.022) translate3d(-.35%,.35%,0); }
  68%,100% { transform: scale(1.075) translate3d(.35%,-.3%,0); }
}
#invitation-page #events-list .chapter-foreground {
  animation-name: tender-garden-breeze; animation-duration: 8.6s; animation-delay: 0s;
}
#invitation-page #events-list .chapter-foreground--music { animation-duration: 10.2s; }
#invitation-page #events-list .chapter-bough--left { animation-name: tender-vow-left; animation-duration: 9.8s; animation-delay: -.8s; }
#invitation-page #events-list .chapter-bough--right { animation-name: tender-vow-right; animation-duration: 11.2s; animation-delay: -1.8s; }
#invitation-page #events-list .chapter-leaf-sweep { display: none; }
@keyframes tender-garden-breeze { from { transform: rotate(-22deg); } to { transform: rotate(-17deg) translate3d(-8px,5px,0); } }
@keyframes tender-vow-left { from { transform: rotate(-30deg); } to { transform: rotate(-26deg) translate3d(5px,4px,0); } }
@keyframes tender-vow-right { from { transform: scaleX(-1) rotate(-26deg); } to { transform: scaleX(-1) rotate(-31deg) translate3d(4px,5px,0); } }

/* Keep longer event names outside the brass disc without changing the original
   forest colour or ceremony stage height. The date in its centre stays steady. */
#invitation-page #events .season-dial:not(.season-dial-many) { --season-radius: clamp(116px,34vw,145px); height: 344px; }
#invitation-page #events .season-dial:not(.season-dial-many)::after {
  content: ''; position: absolute; inset: -16px -14px; z-index: -2; pointer-events: none;
  background: radial-gradient(ellipse,rgb(24 42 34/.97) 24%,rgb(24 42 34/.88) 46%,rgb(24 42 34/.4) 64%,transparent 78%);
}
#invitation-page #events .season-dial:not(.season-dial-many) .season-dial-art { width: 44%; left: 28%; }
#invitation-page #events .season-dial:not(.season-dial-many) .season-stop { width: 84px; }
#invitation-page #events .season-stop-name,
#invitation-page #events .season-dial-many .season-stop-name {
  font-size: .875rem; display: -webkit-box; -webkit-box-orient: vertical;
  -webkit-line-clamp: 3; line-clamp: 3; overflow: hidden; text-wrap: balance;
}
#invitation-page #events:not(:has(.season-dial-many)) .season-playback { margin-top: 380px; }
#invitation-page #events .season-playback,
#invitation-page #events-list .ceremony-date,
#invitation-page #events-list .season-outgoing-date,
#invitation-page #events-list .ceremony-attire,
#invitation-page #events-list .ceremony-attire .label,
#invitation-page #events-list .ceremony-map { font-size: .875rem; }

/* A memory resolves in the light of the real projector, then remains clear.
   The guest's complete image and its outer plane never shrink, pan or crop. */
#invitation-page #gallery { --tender-photo-height: clamp(370px,121vw,600px); }
#invitation-page #gallery .memory-projection .memory img,
#invitation-page #gallery .memory-projection .memory.is-current img,
#invitation-page #gallery .memory-projection.is-projecting .memory.is-current img {
  height: var(--tender-photo-height); object-fit: contain; transform: none!important;
  animation: none; filter: none; opacity: 1;
}
#invitation-page #gallery .memory-projection.is-projecting .memory.is-current img {
  animation: tender-memory-focus 2100ms cubic-bezier(.22,.6,.3,1) both paused;
}
#invitation-page #gallery .memory-projection .memory::after {
  inset: 0 0 auto; width: auto; height: var(--tender-photo-height); border: 0; filter: none;
  transform: none; opacity: 0; pointer-events: none;
  background: radial-gradient(ellipse at 13% 92%,rgb(243 219 155/.17),rgb(244 228 184/.1) 38%,transparent 76%);
}
#invitation-page #gallery .memory-projection.is-projecting .memory.is-current::after {
  animation: tender-memory-exposure 2100ms ease both paused;
}
#invitation-page #gallery .memory-projection.is-projection-living.is-projecting .memory.is-current img,
#invitation-page #gallery .memory-projection.is-projection-living.is-projecting .memory.is-current::after { animation-play-state: running; }
#invitation-page #gallery .memory-projection .projection-beam,
#invitation-page #gallery .memory-projection.is-projecting .projection-beam {
  animation: tender-projector-beam 7.6s ease-in-out infinite paused; transform: none;
}
#invitation-page #gallery .memory-projection .projection-lamp::after {
  animation: tender-projector-lens 7.6s ease-in-out infinite paused;
}
#invitation-page #gallery .memory-projection.is-projection-living .projection-beam,
#invitation-page #gallery .memory-projection.is-projection-living .projection-lamp::after { animation-play-state: running; }
#invitation-page #gallery .memory-caption,
#invitation-page #gallery #gallery-count,
#invitation-page #gallery .gallery-controls .projection-playback,
#invitation-page #gallery .album-help { font-size: .875rem; }
@keyframes tender-memory-focus {
  0% { opacity: .46; filter: blur(1.3px) sepia(.2) contrast(.88) brightness(.9); }
  30% { opacity: .82; filter: blur(.45px) sepia(.08) contrast(.96) brightness(.97); }
  76%,100% { opacity: 1; filter: none; }
}
@keyframes tender-memory-exposure { 0%,100% { opacity: 0; } 32% { opacity: .65; } 68% { opacity: .22; } }
@keyframes tender-projector-beam { 0%,100% { opacity: .31; } 50% { opacity: .48; } }
@keyframes tender-projector-lens { 0%,100% { opacity: .37; } 50% { opacity: .59; } }

@media(min-width:760px) { #invitation-page #gallery { --tender-photo-height: 650px; } }
@media(max-width:374px) { #invitation-page #events .season-dial:not(.season-dial-many) .season-dial-art { width: 42%; left: 29%; } }
@media(max-width:359px) { #invitation-page #gallery { --tender-photo-height: 378px; } }
#invitation-page #events:not(.cinema-running) #events-list .season-transition *,
#invitation-page #events:not(.cinema-running) #events-list .ceremony.is-season-entering .ceremony-copy>* { animation-play-state: paused; }
#invitation-page #gallery .memory-projection:not(.is-projection-living) .memory.is-current img,
#invitation-page #gallery .memory-projection:not(.is-projection-living) .memory.is-current::after { animation-play-state: paused; }
.is-backgrounded #invitation-page #events-list .season-transition *,
.is-backgrounded #invitation-page #gallery .memory-projection *,
.is-backgrounded #invitation-page #gallery .memory-projection *::after { animation-play-state: paused!important; }
.card-preview #invitation-page #gallery .memory-projection .memory img { animation: none!important; opacity: 1; filter: none; }
@media(prefers-reduced-motion:reduce) {
  #invitation-page #events-list .ceremony-art>img,
  #invitation-page #events-list .ceremony.is-season-entering .ceremony-copy>*,
  #invitation-page #gallery .memory-projection .memory img { animation: none!important; transform: none!important; opacity: 1; filter: none; }
  #invitation-page #gallery .memory-projection .memory::after { animation: none!important; opacity: 0; }
}
