/* Scan lights travel in side rails outside the QR image and its quiet zone. */
.qr-scan-window{display:none;position:absolute;inset:10px;z-index:7;overflow:hidden;pointer-events:none;border-radius:8px}
.qr-scan-enabled .qr-scan-window{display:block}
.qr-effect-scan::before{display:none!important}
.qr-scan-enabled .qr-scan-line{display:block;position:absolute;inset:0;width:100%;height:100%;border-radius:0;opacity:1;background:none;box-shadow:none;animation:wedding-qr-sweep 2.4s cubic-bezier(.45,0,.55,1) infinite alternate}
.qr-scan-line::before,.qr-scan-line::after{content:"";position:absolute;bottom:0;width:8px;height:16px;border-radius:5px;background:linear-gradient(0deg,var(--qr-red,#bc1c34),#ffe2a3 25%,transparent);box-shadow:none}
.qr-scan-line::before{left:0;right:auto}
.qr-scan-line::after{right:0;left:auto}
/* Keep shimmer behind the opaque image, and pulse only the decorative frame. */
.clone-qr-visual.qr-effect-shimmer::after{z-index:2}
.clone-qr-visual.qr-effect-pulse{animation:none}
.qr-effect-pulse .clone-qr-card{animation:qr-card-pulse 2.35s ease-in-out infinite}
.clone-qr-visual .clone-gift-qr{border-radius:0!important;animation:none!important;transform:none!important;filter:none!important;opacity:1!important}
@keyframes wedding-qr-sweep{0%,5%{transform:translate3d(0,-98%,0);opacity:.45}30%,70%{opacity:1}95%,100%{transform:translate3d(0,-2%,0);opacity:.45}}
/* CSS-only decorations with a bounded particle count controlled by admin. */
.ambient-fireflies i{top:var(--y);width:5px;height:5px;background:#f6d483;border-radius:50%;box-shadow:0 0 8px 2px #e6b34f77;animation:wedding-firefly var(--speed) ease-in-out infinite alternate;animation-delay:var(--delay)}
@keyframes wedding-firefly{0%{transform:translate3d(0,12px,0);opacity:0}30%{opacity:.65}70%{opacity:.25}100%{transform:translate3d(var(--drift),-60px,0);opacity:.8}}
.ambient-bokeh i{top:var(--y);width:calc(var(--size)*3);height:calc(var(--size)*3);border:1px solid #e4c98f4d;background:radial-gradient(circle at 35% 30%,#fff4ce38,#e4b85f0d);border-radius:50%;animation:wedding-bokeh var(--speed) ease-in-out infinite alternate;animation-delay:var(--delay)}
@keyframes wedding-bokeh{0%{opacity:0;transform:translate3d(0,28px,0) scale(.65)}45%{opacity:.55}100%{opacity:.1;transform:translate3d(var(--drift),-100px,0) scale(1.25)}}
.ambient-gold-dust i{width:3px;height:3px;border-radius:50%;background:#e3be65;box-shadow:0 0 5px #e9c67d66;animation:wedding-dust var(--speed) linear infinite;animation-delay:var(--delay)}
@keyframes wedding-dust{0%{opacity:0;transform:translate3d(0,110vh,0)}25%,60%{opacity:.7}100%{opacity:0;transform:translate3d(var(--drift),-4vh,0)}}
.ambient-lanterns i{width:calc(var(--size)*1.1);height:calc(var(--size)*1.4);background:radial-gradient(ellipse at 50% 30%,#f3ce81,#bc35448c);border:1px solid #e5ba6166;border-radius:35%;box-shadow:0 0 8px #edab4c30;animation:wedding-lantern var(--speed) ease-in-out infinite;animation-delay:var(--delay)}
.ambient-lanterns i::before{content:"";position:absolute;top:-3px;left:22%;right:22%;height:3px;background:#d4b065;border-radius:2px}
.ambient-lanterns i::after{content:"";position:absolute;top:100%;left:50%;height:8px;border-left:1px solid #c39a53}
@keyframes wedding-lantern{0%{opacity:0;transform:translate3d(0,110vh,0) rotate(-10deg)}15%,75%{opacity:.6}50%{transform:translate3d(var(--drift),50vh,0) rotate(8deg)}100%{opacity:0;transform:translate3d(0,-5vh,0) rotate(-10deg)}}
html.wedding-tab-hidden .qr-scan-line,html.wedding-tab-hidden .qr-scan-line::before,html.wedding-tab-hidden #wedding-effects i{animation-play-state:paused!important}
@media(prefers-reduced-motion:reduce){#wedding-effects{display:none!important}.qr-scan-enabled .qr-scan-window{display:none}.qr-scan-enabled .qr-scan-line{animation:none!important}.motdoi-opening-seal::after{animation:none!important}}
