.grain{position:fixed;inset:0;z-index:9990;pointer-events:none;opacity:.12;mix-blend-mode:multiply;
  background-image:url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='220' height='220'><filter id='n'><feTurbulence type='fractalNoise' baseFrequency='1.1' numOctaves='2' stitchTiles='stitch'/><feColorMatrix values='0 0 0 0 0  0 0 0 0 0  0 0 0 0 0  0 0 0 1.6 -.55'/></filter><rect width='100%' height='100%' filter='url(%23n)'/></svg>");
  animation:grain 1.2s steps(6) infinite}
@keyframes grain{0%{background-position:0 0}20%{background-position:-60px 40px}40%{background-position:40px -60px}60%{background-position:-40px -20px}80%{background-position:60px 60px}100%{background-position:0 0}}

.glow{position:fixed;width:340px;height:340px;border-radius:50%;pointer-events:none;z-index:1;left:0;top:0;margin:-170px 0 0 -170px;
  background:radial-gradient(circle,rgba(255,95,168,.28),rgba(255,210,63,.14) 45%,transparent 70%);mix-blend-mode:multiply;filter:blur(10px);opacity:0;transition:opacity .6s}

.toast{position:fixed;left:50%;bottom:34px;z-index:9999;transform:translate(-50%,40px);opacity:0;padding:12px 22px;border-radius:999px;background:rgba(20,18,40,.85);color:#fff;font-size:14px;backdrop-filter:blur(14px);box-shadow:0 10px 40px rgba(0,0,0,.35),0 0 30px rgba(255,95,168,.5);transition:.6s cubic-bezier(.2,.9,.3,1);max-width:90vw;text-align:center}
.toast.show{opacity:1;transform:translate(-50%,0)}

body.dusk{animation:dusk 12s linear infinite}
@keyframes dusk{to{filter:hue-rotate(360deg)}}

.bub{position:fixed;z-index:9999;pointer-events:none;padding:8px 14px;border-radius:16px 16px 16px 4px;background:rgba(255,255,255,.92);color:var(--ink);font-size:14px;box-shadow:0 10px 30px rgba(80,60,140,.3);transform:translate(-20%,-120%) scale(.6);opacity:0;transition:.45s cubic-bezier(.2,1.5,.4,1);white-space:nowrap}
.bub.show{opacity:1;transform:translate(-20%,-120%) scale(1)}

.shoot{position:fixed;z-index:9998;pointer-events:none;width:180px;height:2px;border-radius:2px;background:linear-gradient(90deg,transparent,rgba(255,255,255,.95));box-shadow:0 0 14px #fff,0 0 30px var(--pink);transform:rotate(var(--a));animation:shoot 1.3s ease-in forwards}
.shoot::after{content:"";position:absolute;right:-3px;top:-3px;width:8px;height:8px;border-radius:50%;background:#fff;box-shadow:0 0 16px 4px #fff}
@keyframes shoot{from{opacity:1;translate:0 0}to{opacity:0;translate:var(--tx) var(--ty)}}

.trail{position:fixed;z-index:9990;pointer-events:none;width:46px;height:46px;margin:-23px 0 0 -23px;border-radius:50%;filter:blur(12px);animation:tfade 1.1s forwards}
@keyframes tfade{to{opacity:0;transform:scale(.2) translateY(30px)}}
