/* Tang Xu motion v1 - site-wide; transform/opacity only */
.tx-rv{opacity:0;translate:0 28px;transition:opacity .7s cubic-bezier(.2,.7,.2,1),translate .7s cubic-bezier(.2,.7,.2,1);transition-delay:var(--tx-d,0ms)}
.tx-rv.tx-in{opacity:1;translate:0 0}
.tx-tilt{transform:perspective(900px) rotateX(var(--rx,0deg)) rotateY(var(--ry,0deg));transition:transform .5s cubic-bezier(.2,.7,.2,1);will-change:auto}
.tx-tilt.tx-hov{transition:transform .12s linear;will-change:transform}
.tx-spot{position:absolute;inset:0;border-radius:inherit;pointer-events:none;z-index:3;opacity:0;transition:opacity .35s ease;background:radial-gradient(420px circle at var(--mx,50%) var(--my,50%),rgba(190,255,60,.16),rgba(190,255,60,.05) 35%,transparent 65%)}
.tx-spot::after{content:"";position:absolute;inset:0;border-radius:inherit;padding:1px;background:radial-gradient(300px circle at var(--mx,50%) var(--my,50%),rgba(200,255,80,.75),transparent 60%);-webkit-mask:linear-gradient(#000 0 0) content-box,linear-gradient(#000 0 0);-webkit-mask-composite:xor;mask-composite:exclude}
.tx-hov>.tx-spot{opacity:1}
@media (hover:none),(pointer:coarse){.tx-spot{opacity:1;background:none}.tx-spot::after{background:linear-gradient(135deg,rgba(200,255,80,.55),rgba(200,255,80,0) 40%,rgba(200,255,80,0) 60%,rgba(200,255,80,.35))}}
.tx-cur,.tx-ring{position:fixed;left:0;top:0;pointer-events:none;z-index:2147482000;border-radius:50%;opacity:0;transition:opacity .3s,width .25s,height .25s,margin .25s,background-color .25s,border-color .25s}
.tx-cur{width:6px;height:6px;margin:-3px 0 0 -3px;background:#c6ff3d}
.tx-ring{width:34px;height:34px;margin:-17px 0 0 -17px;border:1.5px solid rgba(198,255,61,.7)}
html.tx-cur-on .tx-cur,html.tx-cur-on .tx-ring{opacity:1}
html.tx-cur-link .tx-ring{width:58px;height:58px;margin:-29px 0 0 -29px;background:rgba(198,255,61,.12);border-color:rgba(198,255,61,.9)}
html.tx-cur-link .tx-cur{opacity:0}
html.tx-cur-text .tx-cur,html.tx-cur-text .tx-ring{opacity:0!important}
html.tx-cur-hide,html.tx-cur-hide body,html.tx-cur-hide a,html.tx-cur-hide button{cursor:none}
html.tx-cur-hide input,html.tx-cur-hide textarea,html.tx-cur-hide select,html.tx-cur-hide [contenteditable],html.tx-cur-hide iframe{cursor:auto}
.tx-mag{transition:translate .45s cubic-bezier(.2,.7,.2,1)}
.tx-mag.tx-mag-on{transition:translate .15s linear}
@media (prefers-reduced-motion:reduce){.tx-rv{opacity:1!important;translate:none!important;transition:none!important}.tx-tilt{transform:none!important}.tx-mag{translate:none!important}}
/* batch 2: hero neural net */
.tx-net{position:absolute;inset:0;width:100%;height:100%;pointer-events:none;z-index:0;opacity:0;transition:opacity 1.2s ease;mix-blend-mode:screen}
.tx-net.tx-net-on{opacity:.9}
/* batch 2: service cards flip/stack (desktop+tablet fine pointer); individual transform props so card tilt (transform) keeps working */
.tx-flipwrap{perspective:1400px}
.tx-flip{--fp:0;transform-origin:50% 0%;opacity:calc(.15 + var(--fp)*.85);
 translate:0 calc((1 - var(--fp))*(70px + var(--fi,0)*26px));rotate:x calc((1 - var(--fp))*-62deg);scale:calc(.9 + var(--fp)*.1)}
.tx-flip-done{transition:opacity .4s,translate .4s,rotate .4s,scale .4s}
@media (prefers-reduced-motion:reduce){.tx-net{display:none}.tx-flip{opacity:1!important;translate:none!important;rotate:none!important;scale:none!important}}
