/* shared motion helpers (see js/fx.js) */
html.js .reveal{opacity:0;transform:translateY(22px);transition:opacity .7s cubic-bezier(.2,.7,.2,1) var(--d,0s),transform .7s cubic-bezier(.2,.7,.2,1) var(--d,0s)}
html.js .reveal.in{opacity:1;transform:none}
.card,.fcard,.rule,.step,.stat,.cta{--mx:50%;--my:0%}
.card::before,.fcard::before,.rule::before,.step::before,.stat::before{content:"";position:absolute;inset:0;border-radius:inherit;pointer-events:none;opacity:0;transition:opacity .3s;
  background:radial-gradient(260px circle at var(--mx) var(--my),#8b5cf624,transparent 65%)}
.card:hover::before,.fcard:hover::before,.rule:hover::before,.step:hover::before,.stat:hover::before{opacity:1}
.card{position:relative}
.spot{position:fixed;left:0;top:0;width:340px;height:340px;margin:-170px 0 0 -170px;border-radius:50%;pointer-events:none;z-index:0;opacity:0;transition:opacity .4s;
  background:radial-gradient(circle,#8b5cf61f,#22d3ee0f 45%,transparent 70%)}
.spot.on{opacity:1}
@media (hover:none),(prefers-reduced-motion:reduce){.spot{display:none}}
@media (prefers-reduced-motion:reduce){html.js .reveal{opacity:1;transform:none;transition:none}}

/* pointer ring (js/net.js) */
.cursor-ring{position:fixed;top:0;left:0;width:36px;height:36px;margin:-18px 0 0 -18px;z-index:400;pointer-events:none;opacity:0;transition:opacity .3s}
.cursor-ring::before{content:"";position:absolute;inset:0;border-radius:50%;border:1.5px solid #a78bfa;transition:transform .3s cubic-bezier(.16,1,.3,1),background .3s}
.cursor-ring.on{opacity:.8}
.cursor-ring.big::before{transform:scale(1.7);background:#8b5cf61a;border-color:#22d3ee}
@media (hover:none),(prefers-reduced-motion:reduce){.cursor-ring{display:none}}
