/* V3: a wordless botanical opening, built from the supplied invitation's flowers. */
.envelope-stage{--look-x:0px;--look-y:0px}
.envelope-mist{position:absolute;inset:-12%;pointer-events:none;background:radial-gradient(ellipse at 20% 25%,#fff6e6a6,transparent 47%),radial-gradient(ellipse at 85% 78%,#e5c1c744,transparent 44%);mix-blend-mode:soft-light;animation:ambient-tide 14s ease-in-out infinite alternate;transition:opacity 1.6s ease .25s}
.paper-light{position:absolute;inset:0;pointer-events:none;overflow:hidden;z-index:2;mix-blend-mode:soft-light;transition:opacity .9s ease}
.paper-light:before{content:'';position:absolute;width:70%;height:140%;top:-20%;left:-80%;background:linear-gradient(90deg,transparent,#fff7e5bb,transparent);transform:skewX(-24deg);animation:paper-gleam 13s cubic-bezier(.45,0,.55,1) infinite}
.bouquet-shell{position:absolute;left:50%;top:50%;width:91%;aspect-ratio:3/4;z-index:4;transform:translate(-50%,-50%) translate3d(var(--look-x),var(--look-y),0);transition:transform 1.1s cubic-bezier(.19,1,.22,1);pointer-events:none;filter:drop-shadow(0 7px 6px #6b49321e)}
.bouquet-breath{position:absolute;inset:0;animation:bouquet-sway 10s ease-in-out infinite alternate;transform-origin:50% 56%}
.bloom-quarter{position:absolute;inset:0;opacity:0;transform-origin:50% 50%;will-change:transform,opacity}
.bloom-quarter img{display:block;width:100%;height:100%;object-fit:contain}
.bloom-tl{clip-path:inset(0 50% 50% 0);--bloom-x:-20px;--bloom-y:-20px;--bloom-r:-5deg;--bloom-delay:.1s}
.bloom-tr{clip-path:inset(0 0 50% 50%);--bloom-x:20px;--bloom-y:-20px;--bloom-r:5deg;--bloom-delay:.3s}
.bloom-bl{clip-path:inset(50% 50% 0 0);--bloom-x:-20px;--bloom-y:20px;--bloom-r:5deg;--bloom-delay:.5s}
.bloom-br{clip-path:inset(50% 0 0 50%);--bloom-x:20px;--bloom-y:20px;--bloom-r:-5deg;--bloom-delay:.7s}
.floral-ready .bloom-quarter{animation:flower-assemble 1.8s cubic-bezier(.16,1,.3,1) var(--bloom-delay) both}
.seal-orbit{position:absolute;left:50%;top:50%;width:43%;height:29%;border:1px solid #b89b7b30;border-radius:50%;transform:translate(-50%,-50%) rotate(-8deg);z-index:3;pointer-events:none;animation:orbit-breathe 7s ease-in-out infinite;transition:opacity 1s ease,filter 1s ease}
.seal-orbit:before{content:'';position:absolute;inset:6%;border:1px solid #fff9e1a3;border-radius:50%;transform:rotate(16deg);box-shadow:0 0 24px #fff4da4a}
.seal-orbit:after{content:'';position:absolute;inset:-20%;background:radial-gradient(ellipse,#fff5d894,transparent 65%);border-radius:50%}
.seal-button{position:absolute;left:50%;top:50%;width:28%;aspect-ratio:1;border:0;padding:0;margin:0;background:transparent;box-shadow:none;transform:translate(-50%,-50%);z-index:7;isolation:isolate;cursor:pointer;-webkit-tap-highlight-color:transparent;filter:drop-shadow(0 5px 7px #6f465332);transition:filter .5s ease}
.seal-button .wax-seal{display:block;width:100%;height:100%;object-fit:contain;animation:seal-float 5s ease-in-out infinite;transition:filter .5s ease}
.seal-button:before,.seal-button:after{content:'';position:absolute;inset:8%;border:1px solid #b98b7d6b;border-radius:50%;z-index:-1;animation:seal-invitation 4.8s ease-out infinite}
.seal-button:after{animation-delay:2.4s}
.seal-button:hover .wax-seal{filter:brightness(1.06)}
.seal-button:focus-visible{outline:2px solid #9b6774;outline-offset:9px;border-radius:50%}
.seal-aura{position:absolute;inset:-35%;z-index:-2;border-radius:50%;background:radial-gradient(circle,#fff7de80,transparent 66%);animation:aura-drift 6s ease-in-out infinite}
.front-petals,.front-motes{position:absolute;inset:0;z-index:8;pointer-events:none;overflow:hidden;transition:opacity 1.5s ease}
.front-petals i{position:absolute;top:-12%;width:clamp(6px,calc(24px * var(--envelope-scale)),15px);height:clamp(11px,calc(40px * var(--envelope-scale)),24px);border-radius:80% 12% 70% 18%;opacity:0;background:linear-gradient(135deg,#fce6db,#ce939e 72%,#b4858a);box-shadow:inset 1px 1px 2px #fff6e9b3,0 1px 3px #8e5e6633;animation:front-petal-fall 17s linear infinite}
.front-petals i:nth-child(3n){background:linear-gradient(135deg,#fff9e9,#ead6ba);width:clamp(5px,calc(18px * var(--envelope-scale)),12px);height:clamp(8px,calc(31px * var(--envelope-scale)),20px);filter:blur(.3px)}
.front-petals i:nth-child(4n){filter:blur(.6px);opacity:.35}
.front-motes i{position:absolute;width:3px;height:3px;border-radius:50%;background:#fff7e2;box-shadow:0 0 6px 2px #fff2ce55;opacity:0;animation:mote-glow 6s ease-in-out infinite}
.front-motes i:nth-child(4n){width:2px;height:2px;background:#dab2a2;box-shadow:0 0 6px #fae4be}
.envelope .gate{transition-delay:.55s}
.envelope .gate-right{transition-delay:.65s}
.envelope.opening .bouquet-breath{animation-play-state:paused}
.envelope.opening .bloom-quarter{animation:flower-unfold 1.6s cubic-bezier(.3,.1,.2,1) both}
.envelope.opening .bloom-tl{animation-delay:.03s}.envelope.opening .bloom-tr{animation-delay:.09s}.envelope.opening .bloom-bl{animation-delay:.15s}.envelope.opening .bloom-br{animation-delay:.21s}
.envelope.opening .seal-button{animation:seal-release 1.2s cubic-bezier(.22,.68,.15,1) both;pointer-events:none}
.envelope.opening .seal-button .wax-seal{animation:none}
.envelope.opening .seal-button:before,.envelope.opening .seal-button:after{animation:none;opacity:0}
.envelope.opening .seal-orbit,.envelope.opening .paper-light{opacity:0;filter:blur(3px)}
.envelope.opening .front-petals,.envelope.opening .front-motes,.envelope.opening .envelope-mist{opacity:0}
.envelope.is-gone *{animation-play-state:paused!important}
.canvas{overflow:hidden}
.card-illumination{position:absolute;inset:0;pointer-events:none;z-index:2;overflow:hidden;mask-image:radial-gradient(ellipse at center,transparent 45%,#000 75%);-webkit-mask-image:radial-gradient(ellipse at center,transparent 45%,#000 75%)}
.card-illumination:before{content:'';position:absolute;top:-15%;left:-75%;width:60%;height:130%;background:linear-gradient(90deg,transparent,#fff5d930,transparent);transform:skewX(-18deg);animation:paper-gleam 11s ease-in-out infinite;animation-play-state:paused}
.frame-petals{position:absolute;inset:0;pointer-events:none;overflow:hidden;z-index:2}
.frame-petals i{position:absolute;top:-10%;width:24px;height:37px;border-radius:80% 15% 75% 12%;background:linear-gradient(135deg,#fff0e4,#bd8d9780);box-shadow:inset 1px 1px 3px #fff9;opacity:0;animation:frame-petal-fall 18s linear infinite;animation-play-state:paused}
.page.is-active .card-illumination:before,.page.is-active .frame-petals i{animation-play-state:running}
.page:not(.is-active) .frame-petals{visibility:hidden}
@keyframes flower-assemble{from{opacity:0;transform:translate3d(var(--bloom-x),var(--bloom-y),0) rotate(var(--bloom-r)) scale(.88)}to{opacity:1;transform:none}}
@keyframes flower-unfold{0%{opacity:1;transform:none}35%{opacity:1}100%{opacity:0;transform:translate3d(calc(var(--bloom-x) * 2.3),calc(var(--bloom-y) * 2.2),0) rotate(var(--bloom-r)) scale(1.12)}}
@keyframes bouquet-sway{0%{transform:rotate(-.5deg) scale(1)}100%{transform:rotate(.5deg) scale(1.008)}}
@keyframes ambient-tide{0%{transform:translate3d(-2%,-1%,0) scale(1.02);opacity:.6}100%{transform:translate3d(2%,1%,0) scale(1.06);opacity:.95}}
@keyframes paper-gleam{0%,15%{left:-80%;opacity:0}25%{opacity:.55}65%{left:130%;opacity:.2}75%,100%{left:130%;opacity:0}}
@keyframes orbit-breathe{0%,100%{opacity:.45;transform:translate(-50%,-50%) rotate(-8deg) scale(.98)}50%{opacity:1;transform:translate(-50%,-50%) rotate(-4deg) scale(1.02)}}
@keyframes seal-float{0%,100%{transform:translateY(0) rotate(-1deg)}50%{transform:translateY(-3px) rotate(1deg)}}
@keyframes seal-invitation{0%{transform:scale(.96);opacity:0}18%{opacity:.38}90%,100%{transform:scale(1.62);opacity:0}}
@keyframes aura-drift{0%,100%{opacity:.3;transform:scale(.92)}50%{opacity:.8;transform:scale(1.08)}}
@keyframes seal-release{0%{opacity:1;transform:translate(-50%,-50%) scale(1) rotate(0)}30%{opacity:1;transform:translate(-50%,-70%) scale(1.1) rotate(-7deg)}100%{opacity:0;transform:translate(-50%,8%) scale(.86) rotate(12deg)}}
@keyframes front-petal-fall{0%{opacity:0;transform:translate3d(0,-3vh,0) rotate(0deg)}8%{opacity:.62}45%{transform:translate3d(20px,43vh,0) rotate(150deg)}90%{opacity:.45}100%{opacity:0;transform:translate3d(-12px,112vh,0) rotate(330deg)}}
@keyframes frame-petal-fall{0%{opacity:0;transform:translate3d(0,-60px,0) rotate(0deg)}12%{opacity:.42}55%{transform:translate3d(25px,850px,0) rotate(170deg)}90%{opacity:.3}100%{opacity:0;transform:translate3d(-10px,1800px,0) rotate(335deg)}}
@keyframes mote-glow{0%,100%{opacity:0;transform:translateY(5px) scale(.6)}45%{opacity:.62;transform:translateY(-5px) scale(1.1)}}
@media(prefers-reduced-motion:reduce){.front-petals,.front-motes,.envelope-mist,.paper-light,.frame-petals,.card-illumination{display:none}.bouquet-breath,.seal-orbit,.seal-button,.seal-button *{animation:none!important}.bloom-quarter{opacity:1;transform:none;animation:none!important}.seal-button:before,.seal-button:after{display:none}.envelope.opening .bouquet-shell,.envelope.opening .seal-button{opacity:0}.bouquet-shell{transition:none!important}}
.bloom-image{display:block;width:100%;height:100%;object-fit:contain;opacity:0;transform:translateY(14px) scale(.93)}
.floral-ready .bloom-image{animation:garland-arrive 2.2s cubic-bezier(.16,1,.3,1) both}
.envelope.opening .bloom-image{animation:garland-depart 1.65s cubic-bezier(.35,0,.2,1) both}
@keyframes garland-arrive{from{opacity:0;transform:translateY(14px) scale(.93);filter:blur(2px)}to{opacity:1;transform:none;filter:blur(0)}}
@keyframes garland-depart{0%{opacity:1;transform:none;filter:blur(0)}22%{opacity:.92}100%{opacity:0;transform:scale(1.13) translateY(-7px);filter:blur(2px)}}
@media(prefers-reduced-motion:reduce){.bloom-image{opacity:1;transform:none;filter:none;animation:none!important}}
