/* ─────────────────────────────────────────────────────────────────────────
   Floating page controls (site-wide, public pages only — see floating-controls.js
   for the matching behaviour): the "buy" FAB button, its modal-open "genie"
   animation, the global "scroll to top" button repositioned out of its way, and
   the Google reCAPTCHA badge docked out of its way too.
   ───────────────────────────────────────────────────────────────────────── */

/* ─── Floating "buy" button ─── */
@keyframes fabShine { 0%{transform:translateX(-130%);} 60%,100%{transform:translateX(130%);} }
@keyframes fabPulseRing {
    0%   { box-shadow: 0 0 0 0 rgba(131,88,255,.55); }
    70%  { box-shadow: 0 0 0 14px rgba(131,88,255,0); }
    100% { box-shadow: 0 0 0 0 rgba(131,88,255,0); }
}
@keyframes fabBob { 0%,100%{transform:translateX(-50%) translateY(0);} 50%{transform:translateX(-50%) translateY(-7px);} }
@keyframes fabPing { 0%{transform:scale(1);opacity:.55;} 100%{transform:scale(2.4);opacity:0;} }
.buy-fab-wrap {
    position: fixed; left: 50%; bottom: 1.1rem; z-index: 220;
    display: flex; align-items: center;
    transform: translateX(-50%) translateY(0);
    animation: fabBob 4.5s ease-in-out infinite;
    transition: opacity .3s ease, transform .3s ease;
}
.buy-fab-wrap.buy-fab-hide { opacity: 0; transform: translateX(-50%) scale(.5) translateY(16px); pointer-events: none; }
.buy-fab {
    position: relative; display: inline-flex; align-items: center; gap: .55rem;
    border: none; cursor: pointer; color: #fff; font-weight: 700;
    padding: .85rem 1.25rem .85rem 1rem; border-radius: 999px; overflow: visible;
    background: linear-gradient(135deg, #8358FF 0%, #6C3CE9 100%);
    box-shadow: 0 10px 30px -8px rgba(131,88,255,.6), 0 4px 14px -4px rgba(30,41,59,.35);
    animation: fabPulseRing 2.6s ease-out infinite;
    transition: transform .22s cubic-bezier(.2,.8,.2,1), box-shadow .22s ease, padding .25s ease;
}
.buy-fab .buy-fab-shine { position:absolute; inset:0; border-radius:inherit; pointer-events:none; overflow:hidden; }
.buy-fab .buy-fab-shine::after {
    content:""; position:absolute; inset:0; transform:translateX(-130%);
    background:linear-gradient(120deg,transparent 20%,rgba(255,255,255,.55) 45%,transparent 65%);
    animation: fabShine 3.4s ease-in-out infinite;
}
.buy-fab:hover { transform: translateY(-3px) scale(1.04); box-shadow: 0 16px 40px -8px rgba(131,88,255,.7), 0 6px 18px -4px rgba(30,41,59,.4); }
.buy-fab:active { transform: translateY(-1px) scale(.94); transition-duration: .1s; }
.buy-fab-icon { position:relative; z-index:1; flex-shrink:0; width:1.4rem; height:1.4rem; display:flex; align-items:center; justify-content:center; }
.buy-fab-icon svg { width:100%; height:100%; }
.buy-fab-label {
    position:relative; z-index:1; white-space:nowrap; font-size:.85rem;
}
.buy-fab-ping { position:absolute; inset:0; border-radius:999px; pointer-events:none; background:rgba(255,255,255,.9); opacity:0; }
.buy-fab.is-pressed .buy-fab-ping { animation: fabPing .55s ease-out; }
@media (min-width:640px) {
    .buy-fab-wrap { bottom:1.75rem; }
    .buy-fab { padding:1rem 1.4rem 1rem 1.1rem; }
    .buy-fab-icon { width:1.5rem; height:1.5rem; }
    .buy-fab-label { font-size:.95rem; }
}
@media (prefers-reduced-motion: reduce) {
    .buy-fab-wrap { animation:none; }
    .buy-fab { animation:none; }
}

/* Modal "genie" open/close — a modal's content appears to fly out of / back into the FAB */
@keyframes fabGenieIn {
    0%   { transform: scale(.04) rotate(-6deg); opacity: 0; filter: saturate(60%); }
    55%  { transform: scale(1.035) rotate(.5deg); opacity: 1; }
    100% { transform: scale(1) rotate(0deg); opacity: 1; filter: saturate(100%); }
}
@keyframes fabGenieOut {
    0%   { transform: scale(1) rotate(0deg); opacity: 1; }
    100% { transform: scale(.05) rotate(-6deg); opacity: 0; }
}

/* ─── Site's global "scroll to top" button (.ufive_uptop, from FooterPartial/_Layout) ───
   Normally sits bottom-center; moved to bottom-right so the buy button (bottom-center)
   never overlaps it. */
.ufive_uptop {
    left: auto !important;
    right: 0.1rem !important;
}
@media (min-width: 640px) {
    .ufive_uptop { right: 0.1rem !important; }
}

/* ─── Google reCAPTCHA badge: docked bottom-left, collapsed to a peek, full on hover ───
   See floating-controls.js for how the live badge gets moved into this dock. */
.grecaptcha-badge-dock {
    position: fixed;
    left: 0;
    bottom: 0.1rem;
    width: 70px;
    height: 60px;
    overflow: hidden;
    transform: translateZ(0);
    z-index: 2000000000;
    border-radius: 0 .6rem .6rem 0;
    box-shadow: 0 8px 24px -10px rgba(0,0,0,.45);
    transition: width .32s cubic-bezier(.2,.8,.2,1), box-shadow .32s ease;
}
.grecaptcha-badge-dock:hover,
.grecaptcha-badge-dock:focus-within {
    width: 256px;
    box-shadow: 0 14px 34px -10px rgba(0,0,0,.5);
}
@media (min-width: 640px) {
    .grecaptcha-badge-dock { bottom: 0.1rem; }
}
