
@keyframes pulse{0%,100%{opacity:.5;transform:scale(.95)}50%{opacity:1;transform:scale(1.05)}}
@keyframes float{0%,100%{transform:translateY(0)}50%{transform:translateY(-7px)}}
@keyframes shimmer{0%{background-position:-220% 0}100%{background-position:220% 0}}
@keyframes load{from{transform:scaleX(0)}to{transform:scaleX(1)}}
@keyframes scan{0%{transform:translateY(-120%)}100%{transform:translateY(120%)}}
@keyframes enter{from{opacity:0;transform:translateY(18px)}to{opacity:1;transform:none}}
@keyframes glow{0%,100%{box-shadow:0 0 16px rgba(32,167,255,.15)}50%{box-shadow:0 0 38px rgba(32,167,255,.32)}}
.reveal{opacity:0;transform:translateY(24px);transition:opacity .7s ease,transform .7s ease}
.reveal.revealed{opacity:1;transform:none}
.hero-content>*{animation:enter .8s both}
.hero-content .hero-kicker{animation-delay:.05s}.hero-content h1{animation-delay:.12s}.hero-content .hero-sub{animation-delay:.2s}.hero-content .hero-actions{animation-delay:.28s}.hero-content .ip-row{animation-delay:.36s}
.status-dot{animation:pulse 1.7s ease-in-out infinite}
.status-card{animation:glow 4s ease-in-out infinite}
.loading-bar span{animation:load 1.6s cubic-bezier(.2,.8,.2,1) forwards}
.loading-screen .loading-logo{animation:float 2s ease-in-out infinite}
.hero-grid:after{animation:scan 8s linear infinite}
@media(prefers-reduced-motion:reduce){
  *,*:before,*:after{animation-duration:.001ms!important;animation-iteration-count:1!important;scroll-behavior:auto!important;transition-duration:.001ms!important}
}
