/* A quiet network, clipped to the photograph rather than the floating labels. */
.hero-network{position:absolute;inset:0;z-index:1;border-radius:inherit;overflow:hidden;pointer-events:none}
.hero-network svg{display:block;width:100%;height:100%}
.network-lines{fill:none;stroke:#d8ebac;stroke-width:1;opacity:.34}
.network-signals{fill:none;stroke:#e9f7cb;stroke-width:1.4;stroke-linecap:round;opacity:.58}
.network-signal{stroke-dasharray:.06 .94;stroke-dashoffset:1;animation:neysa-connection 14s linear infinite;animation-play-state:paused}
.network-signal:nth-child(2){animation-duration:19s;animation-delay:-7s;opacity:.65}
.network-nodes{fill:#e9f7cb;opacity:.62}
.network-nodes circle:nth-child(4n+2){animation:neysa-node 7s ease-in-out infinite;animation-play-state:paused}
.network-nodes circle:nth-child(8){animation-delay:-3.5s}
.network-packets{fill:#f5ffdd;stroke:#708b54;stroke-width:1;opacity:0;transition:opacity .25s ease}
.hero-network.is-running .network-packets{opacity:.9}
.hero-network.is-running .network-signal,.hero-network.is-running .network-nodes circle{animation-play-state:running}
@keyframes neysa-connection{from{stroke-dashoffset:1}to{stroke-dashoffset:-1}}
@keyframes neysa-node{0%,100%{opacity:.45}50%{opacity:1}}

/* Short entrance, once per element. Form controls remain reachable by keyboard. */
.reveal{opacity:0;transform:translateY(18px);transition:none}
.reveal.is-revealed{opacity:1;transform:translateY(0);transition:opacity .8s ease,transform .8s cubic-bezier(.2,.65,.3,1);transition-delay:var(--reveal-delay,0ms)}
.reveal:focus-within{opacity:1;transform:translateY(0);transition:none!important}

/* Precise feedback, with movement reserved for devices that have a pointer. */
.button{transition:background .2s ease,box-shadow .2s ease}
.button span{display:inline-block;transition:transform .2s ease}
.button:hover{transform:none}
.service-grid article{transition:border-color .2s ease,box-shadow .2s ease}
.service-grid article.reveal{transition:none}
.service-grid article.reveal.is-revealed{transition:opacity .8s ease,transform .8s cubic-bezier(.2,.65,.3,1),border-color .2s ease,box-shadow .2s ease;transition-delay:var(--reveal-delay,0ms),var(--reveal-delay,0ms),0s,0s}
.service-grid article:focus-within{border-color:#91a47a}
@media(hover:hover) and (pointer:fine){
 .button:hover:not(:disabled) span{transform:translate(2px,-2px)}
 .button:hover:not(:disabled){box-shadow:0 4px 12px #173d3210}
 .service-grid article:hover{border-color:#91a47a;box-shadow:0 6px 20px #173d3208}
}
@media(max-width:760px){
 .network-lines{opacity:.28}
 .network-signals{opacity:.45}
 .network-nodes{opacity:.5}
 .reveal{transform:translateY(12px)}
 .reveal.is-revealed,.reveal:focus-within{transform:translateY(0)}
}
@media(prefers-reduced-motion:reduce){
 .network-signal,.network-nodes circle{animation:none!important}
 .network-signals{display:none}
 .network-packets{display:none}
 .reveal,.reveal.is-revealed{opacity:1;transform:none;transition:none!important}
 .button:hover:not(:disabled) span{transform:none}
}
