/* Rounded pearl heart opens its two shells before releasing the matching envelope. */
.sfh-reveal{display:none}
.ecard-player.sf-soul-reveal[data-sf-delivery=heart]{--sf-arrival:10.5s;--sf-story:18.5s}
.ecard-player.sf-soul-reveal[data-sf-delivery=heart] .sf-soul-stage{container-type:size;background:radial-gradient(ellipse at 50% 42%,#fffaf4,#f0e3ef 62%,#dce8f1)!important}
.ecard-player.sf-soul-reveal[data-sf-delivery=heart] .sfh-reveal{display:contents}
.ecard-player.sf-soul-reveal[data-sf-delivery=heart] :is(.sf-soul-halo,.sf-soul-water,.sf-soul-dust){display:none!important}
.sfh-shell,.sfh-lining{position:absolute;left:50%;top:46%;width:min(88cqw,53cqh);height:auto;overflow:visible;transform:translate(-50%,-50%);pointer-events:none}
.sfh-shell{z-index:40;filter:drop-shadow(0 5px 6px #8e6e9925);transform-origin:50% 88%}
.sfh-left{clip-path:inset(-10% 50% -10% -10%);--hx:-25cqw;--hr:-38deg;--hy:-28deg}
.sfh-right{clip-path:inset(-10% -10% -10% 50%);--hx:25cqw;--hr:38deg;--hy:28deg}
.sfh-lining{z-index:20;opacity:0}
.ecard-player[data-sf-delivery=heart] .is-running .sfh-shell{animation:sfh-open 10.5s cubic-bezier(.3,0,.2,1) both}
.ecard-player[data-sf-delivery=heart] .is-running .sfh-lining{animation:sfh-lining-open 10.5s ease both}
@keyframes sfh-open{0%,18%{transform:translate(-50%,-50%) scale(.9);opacity:1}32%{transform:translate(-50%,-50%) scale(1);opacity:1}72%,100%{transform:translate(calc(-50% + var(--hx)),calc(-50% + 17cqh)) perspective(800px) rotateY(var(--hy)) rotate(var(--hr)) scale(.8);opacity:.8}}
@keyframes sfh-lining-open{0%,28%{opacity:0;transform:translate(-50%,-50%) scale(.8)}45%{opacity:.8}75%,100%{opacity:.2;transform:translate(-50%,calc(-50% + 16cqh)) scale(.6,.35)}}
.sfh-glow{position:absolute;inset:22% 4% 20%;background:radial-gradient(ellipse,#fff7dbbb,transparent 65%);z-index:22;opacity:0;pointer-events:none}
.ecard-player[data-sf-delivery=heart] .is-running .sfh-glow{animation:sfh-light 10.5s ease both}
@keyframes sfh-light{0%,25%{opacity:0;scale:.5}50%,68%{opacity:.9;scale:1}100%{opacity:.2;scale:1.3}}
.sfh-sparks{position:absolute;inset:0;z-index:42;pointer-events:none}
.sfh-sparks i{position:absolute;left:var(--x);top:var(--y);color:#af9fc0;text-shadow:0 0 7px #fff4ce;font-size:clamp(8px,2cqw,15px);opacity:0}
.ecard-player[data-sf-delivery=heart] .is-running .sfh-sparks i{animation:sfh-spark 10.5s ease both;animation-delay:calc(var(--i)*.04s)}
@keyframes sfh-spark{0%,24%{opacity:0;translate:0 10cqh;scale:.3}48%{opacity:.85;scale:1}100%{opacity:0;translate:0 -10cqh;scale:.2}}
.ecard-player.sf-soul-reveal[data-sf-delivery=heart] .journey-object.sf-emerging-envelope:not(.is-opening){z-index:30;opacity:0;clip-path:inset(0);animation:sfh-envelope 10.5s cubic-bezier(.3,0,.22,1) both!important}
.ecard-player.sf-soul-reveal[data-sf-delivery=heart] .journey-object.is-opening{z-index:30}
@keyframes sfh-envelope{0%,51%{opacity:0;transform:translate(-50%,calc(-50% + 14cqh)) scale(.45)}52%{opacity:1;transform:translate(-50%,calc(-50% + 14cqh)) scale(.45)}75%{opacity:1;transform:translate(-50%,calc(-50% + 6cqh)) scale(.75)}94%,100%{opacity:1;transform:translate(-50%,-50%) scale(1)}}
.ecard-player[data-sf-delivery=heart] .is-revealing .sfh-reveal{opacity:1}
@keyframes sfh-rest{0%,30%{opacity:.8;translate:0 0}90%,100%{opacity:.15;translate:0 12cqh}}

/* An intact heart-shaped keepsake: one whole lid, never two separating halves. */
.ecard-player.sf-soul-reveal[data-sf-delivery=heart] .sfh-left{clip-path:none;transform-origin:50% 85%;z-index:42}
.ecard-player.sf-soul-reveal[data-sf-delivery=heart] .sfh-right{display:none!important}
.ecard-player.sf-soul-reveal[data-sf-delivery=heart] .is-running .sfh-left{animation:sfh-keepsake-lid 10.5s cubic-bezier(.3,0,.2,1) both}
.ecard-player.sf-soul-reveal[data-sf-delivery=heart] .is-running .sfh-lining{animation:sfh-keepsake-base 10.5s cubic-bezier(.3,0,.2,1) both}
.sfh-case-front{position:absolute;left:50%;top:46%;width:min(88cqw,53cqh);height:auto;z-index:40;transform:translate(-50%,-50%);clip-path:inset(55% 0 0);opacity:0;pointer-events:none}
.ecard-player[data-sf-delivery=heart] .is-running .sfh-case-front{animation:sfh-keepsake-front 10.5s cubic-bezier(.3,0,.2,1) both}
@keyframes sfh-keepsake-lid{0%,18%{opacity:1;transform:translate(-50%,-50%) scale(.9)}30%{opacity:1;transform:translate(-50%,-50%) scale(1)}66%,100%{opacity:.35;transform:translate(-50%,calc(-50% - 22cqh)) perspective(800px) rotateX(-48deg) scale(.8)}}
@keyframes sfh-keepsake-base{0%,20%{opacity:1;transform:translate(-50%,-50%) scale(.88)}68%,100%{opacity:.85;transform:translate(-50%,calc(-50% + 17cqh)) scale(.85,.4)}}
@keyframes sfh-keepsake-front{0%,30%{opacity:0;transform:translate(-50%,-50%) scale(.88)}50%{opacity:1}68%,100%{opacity:1;transform:translate(-50%,calc(-50% + 17cqh)) scale(.85,.4)}}
