/* Motion timing and compositing: opacity + transform, one reveal layer per item. */
:root { --gate-fade:2.8s; --language-fade:1.3s; --reveal-time:2.2s; --motion-ease:cubic-bezier(.22,.61,.36,1); }
.language-gate { transition:opacity var(--gate-fade) ease,visibility 0s var(--gate-fade); }
.language-gate.is-closing .gate-card { transition:opacity 2.1s ease,transform 2.5s var(--motion-ease);transform:translate3d(0,-12px,0); }
.gate-backdrop { filter:none;animation:gateStill 18s ease-out both; }
@keyframes gateStill { from{transform:scale(1.055)} to{transform:scale(1)} }
.language-gate::before,.language-gate::after { animation-duration:15s; }
.gate-card { animation-duration:2.5s; }
.hero-title .written-letter,.written-letter { animation:quietInk 1.65s var(--letter-delay,0ms) ease both;clip-path:none;filter:none; }
@keyframes quietInk { from{opacity:0;transform:translate3d(0,.1em,0)} to{opacity:1;transform:translate3d(0,0,0)} }
.hero-content { animation:none!important; }
.hero-content.intro-playing>.hero-kicker { animation:quietEntrance 2.3s .1s both; }
.hero-content.intro-playing>.hero-date { animation:quietEntrance 2.3s 1.9s both; }
.hero-content.intro-playing>.hero-countdown { animation:quietEntrance 2.3s 2.1s both; }
.hero-content.intro-playing>.hero-rsvp-note { animation:quietEntrance 2.3s 2.7s both; }
@keyframes quietEntrance { from{opacity:0;transform:translate3d(0,18px,0)} to{opacity:1;transform:translate3d(0,0,0)} }
.hero-picture img { animation-duration:30s;will-change:transform; }
.hero-offscreen .hero-picture img { animation-play-state:paused; }
main { transition:opacity var(--language-fade) ease; }
.site-header { backdrop-filter:none;-webkit-backdrop-filter:none;background:rgba(245,240,232,.96); }
.language-choice,.slide-arrow { backdrop-filter:none;-webkit-backdrop-filter:none; }
body::after { backdrop-filter:none;-webkit-backdrop-filter:none;background:rgba(23,32,25,.5);transition:opacity 1.2s ease,visibility 1.2s; }
.site-nav { backdrop-filter:none;transform:translate3d(0,-18px,0);transition:opacity 1.2s ease,transform 1.5s var(--motion-ease),visibility 1.2s; }
.site-nav.is-open { transform:translate3d(0,0,0); }
.site-nav a,.site-nav.is-open a { transition:opacity 1.1s ease,transform 1.25s var(--motion-ease),color .4s; }
.site-nav.is-open a { transition-delay:.2s; }
.site-nav.is-open a:nth-child(2){transition-delay:.3s}.site-nav.is-open a:nth-child(3){transition-delay:.4s}.site-nav.is-open a:nth-child(4){transition-delay:.5s}.site-nav.is-open a:nth-child(5){transition-delay:.6s}.site-nav.is-open a:nth-child(6){transition-delay:.7s}
.site-nav:not(.is-open) a { transition-delay:0s; }
.menu-toggle span { transition:transform .85s ease,top .85s ease; }
/* One entrance per page visit avoids restarting fades on direction changes. */
.reveal,.location-content > .reveal { filter:none!important;animation:none!important;transition:opacity var(--reveal-time) var(--motion-ease),transform var(--reveal-time) var(--motion-ease);transition-delay:var(--reveal-delay,0ms); }
.reveal:not(.is-visible) { opacity:0;transform:translate3d(0,36px,0);filter:none!important; }
.reveal.is-visible { opacity:1;transform:translate3d(0,0,0); }

.editorial-copy > * { transition:opacity var(--reveal-time) var(--motion-ease),transform var(--reveal-time) var(--motion-ease); }
.location-photo.reveal:not(.is-visible) { transform:translate3d(0,46px,0); }
.location-slides img { filter:none;transition:transform 8s ease; }
.location-slides figure { transition:opacity 2.8s ease; }
.signature,.menu-art,.footer-monogram { filter:none;animation:gentleBreath 8s ease-in-out infinite; }
@keyframes gentleBreath { 0%,100%{opacity:.8} 50%{opacity:1} }
.section-number { animation:none; }
.timeline-item.is-current .timeline-index { animation:none;box-shadow:none; }
.timeline-index { transition:background 1.2s ease,color 1.2s ease,transform 1.2s ease; }
.ambient-rings i { animation-duration:36s;will-change:transform; }
.rice-field i { animation-duration:calc(28s + var(--n)*.8s);box-shadow:none;will-change:transform,opacity; }
.hero-rsvp-note span:last-child { animation-duration:3.4s; }
.faq-list details[open] p { animation:answerIn 1.2s ease both; }
.sound-bars i { height:17px;transform:scaleY(.3); }
.sound-toggle.is-playing .sound-bars i { animation:soundQuiet 1.3s ease-in-out infinite alternate; }
@keyframes soundQuiet { to{transform:scaleY(1)} }
.motion-sleeping *, .motion-sleeping *::before, .motion-sleeping *::after { animation-play-state:paused!important; }
@media(max-width:700px){ .rice-field i:nth-child(n+19){display:none} .rice-field i{left:calc(var(--n)*5.5%)} }
@media(prefers-reduced-motion:reduce){
 .language-gate,main,.site-nav,.site-nav a,.reveal,.editorial-copy > *,.location-slides figure,.location-slides img { transition:none!important; }
 .reveal:not(.is-visible),.reveal.is-visible { opacity:1;transform:none; }
 .written-letter,.hero-title .written-letter,.hero-content.intro-playing>*,.gate-backdrop,.signature,.menu-art,.footer-monogram,.sound-toggle.is-playing .sound-bars i { animation:none!important;opacity:1;transform:none; }
 .rice-field,.ambient-rings { display:none; }
}
/* Start the continuous portrait movement when the language curtain opens. */
.hero-picture img { animation:portraitAlive 16s ease-in-out infinite alternate; }
@keyframes portraitAlive { from{transform:scale(1.015)} to{transform:scale(1.17)} }
body.lang-pending .hero-picture img,.hero-offscreen .hero-picture img { animation-play-state:paused; }
@media(prefers-reduced-motion:reduce){.hero-picture img{animation:none!important;transform:none}}

.site-footer .footer-heart { color:#111; font-family:Georgia,serif; font-size:48px; line-height:1; text-align:center; margin:42px auto 0; padding-bottom:12px; }

/* Child motion keeps the section reveal independent of the heartbeat. */
.footer-monogram > .heartbeat { display:inline-block; color:inherit; font:inherit; }
.heartbeat { display:inline-block; animation:weddingHeartbeat 2.6s ease-in-out infinite; transform-origin:center; }
@keyframes weddingHeartbeat { 0%,36%,100%{transform:scale(1)} 12%{transform:scale(1.1)} 22%{transform:scale(1.02)} 29%{transform:scale(1.065)} }
.menu-handwriting { white-space:nowrap; }
.menu-art:not(.is-visible) .written-letter { animation:none; opacity:0; transform:translate3d(0,.1em,0); }
.menu-art.is-visible .written-letter { animation:quietInk 1.8s var(--letter-delay) ease both; }
.rice-field i { left:calc(var(--n)*4.15%); animation-delay:calc(var(--n)*-3.7s); }
@media(max-width:700px){.rice-field i{left:calc(var(--n)*5.5%)}}
@media(prefers-reduced-motion:reduce){
 .heartbeat {animation:none!important;}
 .menu-art .written-letter {animation:none!important;opacity:1;transform:none;}
}

/* Reveal the footer as a whole: the last heart cannot reach the inset trigger
   on short mobile viewports. Leave room for script swashes and pulse layers. */
.site-footer { padding-bottom:calc(72px + env(safe-area-inset-bottom, 0px)); overflow:visible; }
.footer-monogram { overflow:visible; font-size:clamp(3.8rem,18vw,5rem); }
.footer-monogram > .heartbeat { padding:.12em .4em; line-height:1.5; overflow:visible; }
.site-footer .footer-heart { overflow:visible; }
/* Keep the outgoing image opaque under the incoming one: no dark dip. */
.location-slides figure { opacity:0; z-index:0; transition:none; }
.location-slides figure.is-previous { opacity:1; z-index:1; }
.location-slides figure.is-active { opacity:1; z-index:2; transition:opacity 2.8s ease-in-out; }
.location-slides figure.is-previous img { transform:scale(1); }
.timeline::after { height:calc(100% - 76px); transform:scaleY(var(--progress,0)); transform-origin:top; transition:none; }
.hero-offscreen .hero-picture img { will-change:auto; }
@media(prefers-reduced-motion:reduce){.location-slides figure.is-active{transition:none}}

/* A single pen line is progressively uncovered; no visible pen or letter fade. */
.hero-mr-mrs { display:block; position:relative; width:clamp(220px,28vw,300px); height:auto; margin:8px auto 30px; overflow:visible; color:#111; transform:translateX(-10px) rotate(-16deg); }
.hero-mr-mrs path { stroke-width:5.2; stroke-dasharray:1; stroke-dashoffset:1; }
.signature-interlude.is-visible .hero-mr-mrs path { animation:handwrittenStroke var(--ink-time) var(--ink-delay) linear forwards; }
@keyframes handwrittenStroke { to{stroke-dashoffset:0} }
@media(prefers-reduced-motion:reduce){.hero-mr-mrs path{animation:none!important;stroke-dashoffset:0}}

.hero-mr-mrs path:nth-child(1) {--ink-delay:0.25s;--ink-time:1.45s;}
.hero-mr-mrs path:nth-child(2) {--ink-delay:1.65s;--ink-time:.8s;}
.hero-mr-mrs path:nth-child(3) {--ink-delay:2.4s;--ink-time:.95s;}
.hero-mr-mrs path:nth-child(4) {--ink-delay:3.3s;--ink-time:1.45s;}
.hero-mr-mrs path:nth-child(5) {--ink-delay:4.7s;--ink-time:.75s;}
.hero-mr-mrs path:nth-child(6) {--ink-delay:5.4s;--ink-time:1s;}
.rice-field i:nth-child(17) {--n:16;}
.rice-field i:nth-child(18) {--n:17;}
.rice-field i:nth-child(19) {--n:18;}
.rice-field i:nth-child(20) {--n:19;}
.rice-field i:nth-child(21) {--n:20;}
.rice-field i:nth-child(22) {--n:21;}
.rice-field i:nth-child(23) {--n:22;}
.rice-field i:nth-child(24) {--n:23;}

.signature-interlude { padding:44px 24px 30px; background:#f5f0e8; }
.signature-interlude .hero-mr-mrs { margin:0 auto; }
.signature-interlude + .love-note { padding-top:40px; }

/* Distinct entrances, using only opacity and transform. No blur or nested fades. */
.reveal,.location-content > .reveal,.editorial-copy > .reveal { transition:opacity var(--entrance-duration,1.9s) ease,transform var(--entrance-duration,1.9s) cubic-bezier(.22,.61,.36,1); transition-delay:var(--reveal-delay,0ms); }
.reveal:not(.is-visible) { opacity:0; transform:translate3d(0,22px,0); }
.reveal.motion-title { --entrance-duration:2.5s; }
.reveal.motion-title:not(.is-visible) { transform:translate3d(0,44px,0); }
.reveal.motion-caption { --entrance-duration:1.8s; }
.reveal.motion-caption:not(.is-visible) { transform:translate3d(-14px,0,0); }
.reveal.motion-copy { --entrance-duration:2.1s; }
.location-photo.reveal:not(.is-visible) { transform:translate3d(0,28px,0); }
.reveal.is-visible { opacity:1;transform:translate3d(0,0,0); }
.signature-interlude.reveal,.site-footer.reveal { transform:none; }
@media(prefers-reduced-motion:reduce){.reveal,.location-content > .reveal,.editorial-copy > .reveal{transition:none!important;transform:none!important;opacity:1}}
