/* fx.css - shared animation layer (login + admin). Transform/opacity first, reduced-motion safe. */
html.fx-loading body>:not(#fxLoader) *{animation-play-state:paused!important}
#fxLoader{position:fixed;inset:0;z-index:10000;display:grid;place-content:center;justify-items:center;gap:14px;color:#fff;cursor:pointer;background:radial-gradient(700px 420px at 50% 55%,#12335f,#071a33)}
#fxLoader svg{width:92px;fill:none;stroke:#d9a441;stroke-width:3.5;stroke-linecap:round;stroke-linejoin:round;transition:filter .5s}
#fxLoader path{stroke-dasharray:1;stroke-dashoffset:1;animation:fxDraw 1.5s cubic-bezier(.22,1,.36,1) .1s forwards}
#fxLoader.fill svg{stroke:url(#fxg);filter:drop-shadow(0 0 14px rgba(217,164,65,.6))}
#fxLoader b{font:700 20px Fraunces,Georgia,serif;letter-spacing:.4px}
#fxLoader i{position:absolute;top:24px;right:30px;font:500 15px ui-monospace,Consolas,monospace;font-style:normal;color:#d9a441}
#fxLoader em{position:absolute;bottom:26px;font-size:11px;font-style:normal;opacity:.4;letter-spacing:.14em;text-transform:uppercase}
#fxLine{position:fixed;top:0;bottom:0;left:0;width:3px;z-index:10001;background:linear-gradient(#5cc489,#d9a441);box-shadow:0 0 24px 4px rgba(217,164,65,.7)}
@keyframes fxDraw{to{stroke-dashoffset:0}}
.fx-grain{position:fixed;inset:0;z-index:9990;pointer-events:none;opacity:.035;background:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='160' height='160'%3E%3Cfilter id='n'%3E%3CfeTurbulence baseFrequency='.9' numOctaves='2'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)'/%3E%3C/svg%3E")}
/* cursor */
html.fx-cur,html.fx-cur *:not(input):not(textarea){cursor:none!important}
.fx-dot,.fx-ring{position:fixed;left:0;top:0;z-index:10002;pointer-events:none;border-radius:50%;mix-blend-mode:difference;background:#fff;transition:opacity .25s}
.fx-dot{width:6px;height:6px;margin:-3px 0 0 -3px}
.fx-ring{width:34px;height:34px;margin:-17px 0 0 -17px;background:none;border:1.5px solid #fff;transition:scale .3s cubic-bezier(.22,1,.36,1),opacity .25s}
.fx-ring.h{scale:1.7;background:rgba(255,255,255,.18)}
.fx-down .fx-ring{scale:.7}
.fx-txt .fx-dot,.fx-txt .fx-ring{opacity:0}
.fx-rip{position:fixed;z-index:9995;width:20px;height:20px;margin:-10px 0 0 -10px;border-radius:50%;pointer-events:none;border:2px solid rgba(217,164,65,.8);animation:fxRip .6s ease-out forwards}
@keyframes fxRip{to{transform:scale(9);opacity:0}}
.fx-cv{position:fixed;inset:0;z-index:10003;pointer-events:none}
/* tilt + glare */
.fx-tilt{transition:transform .35s cubic-bezier(.22,1,.36,1)}
.fx-glare{position:absolute;inset:0;border-radius:inherit;pointer-events:none;opacity:0;transition:opacity .3s;background:radial-gradient(240px circle at var(--gx,50%) var(--gy,50%),rgba(60,140,200,.14),transparent 60%)}
.fx-tilt:hover>.fx-glare{opacity:1}
.fx-spot{position:absolute;left:0;top:0;width:520px;height:520px;margin:-260px 0 0 -260px;pointer-events:none;opacity:0;transition:opacity .4s;background:radial-gradient(circle,rgba(255,255,255,.11),transparent 62%)}
.fx-aur{position:fixed;inset:0;z-index:0;pointer-events:none;overflow:hidden}
.fx-aur i{position:absolute;width:60vmax;height:60vmax;border-radius:50%;background:radial-gradient(circle,rgba(46,158,91,.14),transparent 65%);animation:fxDrift 26s ease-in-out infinite alternate}
.fx-aur i+i{right:0;bottom:0;background:radial-gradient(circle,rgba(26,79,138,.16),transparent 65%);animation-duration:32s;animation-direction:alternate-reverse}
@keyframes fxDrift{to{transform:translate3d(18vw,10vh,0) scale(1.15)}}
.brand>.fx-aur,.brand>.fx-pc,.brand>.fx-spot,.sidebar>.fx-spot{position:absolute;z-index:0}
.fx-pc{inset:0;pointer-events:none}
.app{position:relative;z-index:1}
/* login */
.brand-copy h1 .line span.fx-word{display:inline-block;white-space:nowrap;transition:translate .25s,text-shadow .25s}
.brand-copy h1 .line span.fx-ch{display:inline-block;transform:translateY(115%) rotateX(-80deg);transform-origin:50% 100%;animation:fxChIn .9s var(--ease) calc(.25s + var(--i)*.035s) forwards}
.brand-copy h1 .line span.fx-ch.wv{animation:fxChIn .9s var(--ease) calc(.25s + var(--i)*.035s) forwards,fxWave 3.6s ease-in-out calc(1.8s + var(--i)*.09s) infinite}
.brand-copy h1 .line span.fx-word:hover{translate:0 -2px;text-shadow:0 0 22px rgba(92,196,137,.8);animation:fxGl .4s steps(2)}
@keyframes fxChIn{to{transform:none}}
@keyframes fxWave{0%,60%,100%{color:#fff}30%{color:#f0c36a;text-shadow:0 0 18px rgba(217,164,65,.55)}}
@keyframes fxGl{0%{text-shadow:-2px 0 #f33,2px 0 #0ff}}
.form-wrap.fx-card{width:min(450px,100%);position:relative;padding:38px 34px;border-radius:26px;background:rgba(255,255,255,.78);backdrop-filter:blur(14px);border:1px solid #fff;box-shadow:0 30px 70px rgba(11,36,71,.13)}
.fx-ringbtn{position:relative;overflow:hidden;padding:2px;border-radius:16px;background:rgba(18,51,95,.15);box-shadow:0 12px 28px rgba(18,51,95,.25)}
.fx-ringbtn::before{content:"";position:absolute;left:50%;top:50%;width:200%;aspect-ratio:1;margin:-100% 0 0 -100%;background:conic-gradient(transparent 0 55%,#d9a441 78%,#5cc489 100%);animation:fxSpin 3.5s linear infinite}
.fx-ringbtn .btn{box-shadow:none}
@keyframes fxSpin{to{transform:rotate(360deg)}}
.btn::before{opacity:1!important;transform:translateY(102%);border-radius:50% 50% 0 0/22px 22px 0 0;transition:transform .55s var(--ease)!important}
.btn:hover:not(:disabled)::before{transform:none}
.btn::after{content:"";position:absolute;top:0;left:0;width:40%;height:100%;background:linear-gradient(100deg,transparent,rgba(255,255,255,.35),transparent);transform:translateX(-130%) skewX(-18deg);animation:fxSweep 3.4s ease-in-out 2.6s infinite}
@keyframes fxSweep{40%,100%{transform:translateX(320%) skewX(-18deg)}}
.btn .fx-check{display:none;width:20px;height:20px;fill:none;stroke:#fff;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:24;animation:fxDraw2 .5s ease forwards}
.btn.success .fx-check{display:block}.btn.success .arrow{display:none}
@keyframes fxDraw2{from{stroke-dashoffset:24}to{stroke-dashoffset:0}}
/* admin */
.fx-prog{position:fixed;top:0;left:0;right:0;height:3px;z-index:9996;transform-origin:left;transform:scaleX(0);background:linear-gradient(90deg,#2e9e5b,#d9a441)}
.fx-dg{display:inline-block;height:1em;overflow:hidden;vertical-align:top}
.fx-dg span{display:block;transition:transform 1s cubic-bezier(.22,1,.36,1)}
.fx-dg i{display:block;height:1em;line-height:1;font-style:normal}
.fx-caret{display:inline-block;width:2px;height:1em;margin-left:2px;vertical-align:-2px;background:currentColor;animation:fxBlink .8s steps(2) infinite}
@keyframes fxBlink{50%{opacity:0}}
tbody tr:hover td:first-child{box-shadow:inset 3px 0 0 #2e9e5b}
@media(prefers-reduced-motion:reduce){.fx-ringbtn::before,.fx-aur i,.btn::after,.fx-ch.wv{animation:none!important}}
