/* Shared decorative login animation; contains no authentication or form styles. */
/* One 6.4s clock: input, package-edge processing, then output. */
.login-scene{--compute-delay:-.8s}
.login-flow{--flow-offset:0px;opacity:0;animation:login-flow-in 6.4s linear infinite;animation-delay:var(--compute-delay);animation-play-state:var(--login-play)}
.login-flow-two .login-flow{animation-name:login-flow-out}
.login-flow-tail{stroke:#69aff6;stroke-opacity:.35;stroke-width:1.4;stroke-dasharray:18 182}
.login-flow-trace{--flow-offset:-9px;stroke:#83cfff;stroke-opacity:.8;stroke-width:1.3;stroke-dasharray:3 2 2 193}
.login-flow-glow{--flow-offset:-14px;stroke:#68caff;stroke-opacity:.18;stroke-width:6;stroke-dasharray:4 196}
.login-flow-tip{--flow-offset:-17px;stroke:#e1f6ff;stroke-width:2;stroke-dasharray:1 199}
.login-node-core{fill:#c0e9ff;opacity:.35;animation:login-node-receive 6.4s ease-in-out infinite;animation-delay:var(--compute-delay);animation-play-state:var(--login-play)}
.login-node-ring{stroke:#78c9fa;stroke-width:1;opacity:0;transform-box:fill-box;transform-origin:center;animation:login-node-response 6.4s ease-out infinite;animation-delay:var(--compute-delay);animation-play-state:var(--login-play)}
.login-flow-two .login-node-core{animation-name:login-output-receive}
.login-flow-two .login-node-ring{animation-name:login-output-response}
.login-ai-mark{stroke:#b9e7ff;stroke-width:.8;stroke-linecap:round;opacity:.16;animation:login-ai-confirm 6.4s ease-in-out infinite;animation-delay:var(--compute-delay);animation-play-state:var(--login-play)}
.login-chip-current{stroke:#b1e7ff;stroke-width:1.2;stroke-dasharray:18 182;opacity:0;animation:login-chip-cycle 6.4s linear infinite;animation-delay:var(--compute-delay);animation-play-state:var(--login-play)}
.login-plane-current{stroke:#72c9fa;stroke-width:1.2;stroke-dasharray:12 188;opacity:0;animation:login-plane-cycle 6.4s linear infinite;animation-delay:var(--compute-delay);animation-play-state:var(--login-play)}
@keyframes login-flow-in{0%{stroke-dashoffset:calc(18px + var(--flow-offset));opacity:0}4%,29%{opacity:1}38%,100%{stroke-dashoffset:calc(-100px + var(--flow-offset));opacity:0}}
@keyframes login-flow-out{0%,54%{stroke-dashoffset:calc(18px + var(--flow-offset));opacity:0}58%,84%{opacity:1}94%,100%{stroke-dashoffset:calc(-100px + var(--flow-offset));opacity:0}}
/* Input arrives at ~33%, output at ~89%; no receive pulse precedes its packet. */
@keyframes login-node-receive{0%,33%,50%,100%{opacity:.35}36%,42%{opacity:1}}
@keyframes login-node-response{0%,33%{opacity:0;transform:scale(.6)}37%{opacity:.6}52%,100%{opacity:0;transform:scale(1.9)}}
@keyframes login-output-receive{0%,89%,100%{opacity:.35}92%,96%{opacity:1}}
@keyframes login-output-response{0%,89%{opacity:0;transform:scale(.6)}93%{opacity:.6}100%{opacity:0;transform:scale(1.9)}}
@keyframes login-ai-confirm{0%,49%,60%,100%{opacity:.16}52%,54%{opacity:.5}}
@keyframes login-chip-cycle{0%,34%{stroke-dashoffset:18px;opacity:0}37%,51%{opacity:.8}55%,100%{stroke-dashoffset:-100px;opacity:0}}
@keyframes login-plane-cycle{0%,48%{stroke-dashoffset:12px;opacity:0}52%,67%{opacity:.5}78%,100%{stroke-dashoffset:-100px;opacity:0}}
@media(prefers-reduced-motion:reduce){.login-scene *{animation:none!important}}
