/* Motion is a layer over the layout; it never determines the page geometry. */
:root{--motion-ease:cubic-bezier(.22,1,.36,1)}
.js .reveal.motion-layout,.js .reveal.motion-layout.is-visible{opacity:1;transform:none;transition:none}
.motion-ready .motion-item{transition:opacity .85s var(--motion-ease),translate 1s var(--motion-ease);transition-delay:var(--entrance-delay,0ms)}
.motion-ready .motion-item:not(.motion-shown){opacity:0;translate:0 22px}
.motion-ready .motion-item.motion-shown{opacity:1;translate:0 0}
.motion-ready .plan-card.reveal{transition:opacity .85s var(--motion-ease),transform 1s var(--motion-ease),border-color .3s ease,box-shadow .3s ease;transition-delay:var(--entrance-delay,0ms),var(--entrance-delay,0ms),0ms,0ms}

/* The imagery stays fixed: movement lives only in its existing points of light. */
.motion-ready .justice-image,.motion-ready .audience-map,.motion-ready .network-photo,.motion-ready .scene-signal{translate:none;scale:1;will-change:auto}
.motion-ready .audience-map{animation:none}
.motion-ready .network-art{display:none}

/* These paths align with the pictured hubs; the text stays on a higher layer. */
.scene-signal{position:absolute;z-index:1;overflow:hidden;pointer-events:none;mix-blend-mode:screen;opacity:.6}
.scene-signal--network{opacity:.55}
.scene-signal path{fill:none;stroke-linecap:round;stroke-linejoin:round}
.signal-travel{stroke:#f4a9b2;stroke-width:1.6;stroke-dasharray:.012 .988;filter:drop-shadow(0 0 1.5px #e07280);animation:signal-travel var(--signal-duration,9s) linear infinite;animation-delay:var(--signal-delay,0s)}
.signal-core{fill:#f4c6cc;filter:drop-shadow(0 0 2px #dc8993);animation:signal-core var(--signal-duration,8s) ease-in-out infinite;animation-delay:var(--signal-delay,0s)}

/* Existing buttons already lift on hover; add only a soft travelling light. */
.motion-ready .button{position:relative;isolation:isolate;overflow:hidden;transition:background .25s ease,border-color .25s ease,box-shadow .35s ease,transform .35s var(--motion-ease)}
.motion-ready .button:after{content:"";position:absolute;inset:-30% auto -30% -55%;width:34%;background:linear-gradient(100deg,transparent,#fdebed18,transparent);transform:skewX(-18deg);opacity:0;pointer-events:none;z-index:0}
.motion-ready .button>*{position:relative;z-index:1}
.motion-ready .service-buttons>a,.motion-ready .audience-grid>div{transition:opacity .85s var(--motion-ease),translate 1s var(--motion-ease),background .3s ease,border-color .3s ease,transform .4s var(--motion-ease);transition-delay:var(--entrance-delay,0ms),var(--entrance-delay,0ms),0ms,0ms,0ms}
.motion-ready .service-buttons .icon,.motion-ready .audience-grid .icon,.motion-ready .expertise .icon{transition:color .3s ease,filter .3s ease,translate .4s var(--motion-ease)}
.motion-ready .footer a,.motion-ready .footer button{transition:color .25s ease}
.motion-ready .footer a .icon,.motion-ready .footer button .icon{transition:translate .3s var(--motion-ease)}
.motion-ready .button:focus-visible:after{animation:button-light .7s ease-out}
.motion-ready .button:focus-visible,.motion-ready .service-buttons>a:focus-visible{box-shadow:0 0 0 3px #f4738430}
.motion-ready .contact-dialog[open]{animation:dialog-arrive .32s var(--motion-ease)}
.motion-ready .contact-dialog[open]::backdrop{animation:dialog-backdrop .25s ease-out}

@media(hover:hover) and (pointer:fine){
  .motion-ready .button:hover:after{animation:button-light .7s ease-out}
  .motion-ready .plan-card.is-visible:hover{transform:translateY(-5px);box-shadow:0 14px 35px #0004}
  .motion-ready .service-buttons>a:hover .icon,.motion-ready .audience-grid>div:hover .icon{translate:0 -2px;filter:drop-shadow(0 0 7px #ec75844d)}
  .motion-ready .footer a:hover .icon,.motion-ready .footer button:hover .icon{translate:2px 0}
}

/* CSS ambient loops are paused as soon as their section leaves the viewport. */
.motion-ready .motion-section:not(.motion-active) *,
.motion-ready .motion-section:not(.motion-active) *:before,
.motion-ready .motion-section:not(.motion-active) *:after,
.motion-ready.motion-paused *,
.motion-ready.motion-paused *:before,
.motion-ready.motion-paused *:after{animation-play-state:paused!important}

@keyframes button-light{0%{left:-55%;opacity:0}20%{opacity:1}100%{left:130%;opacity:0}}
@keyframes dialog-arrive{from{opacity:0;translate:0 12px}to{opacity:1;translate:0 0}}
@keyframes dialog-backdrop{from{opacity:0}to{opacity:1}}
@keyframes signal-travel{from{stroke-dashoffset:1}to{stroke-dashoffset:0}}
@keyframes signal-core{0%,100%{opacity:.25}50%{opacity:.8}}
@media(max-width:760px){
  .motion-ready .motion-item:not(.motion-shown){translate:0 14px}
  .motion-ready .justice-image,.motion-ready .audience-map,.motion-ready .network-photo,.motion-ready .scene-signal{translate:none;scale:1;will-change:auto}
  .motion-ready .motion-item{transition-duration:.65s,.8s}
  .scene-signal .signal-detail{display:none}
  .scene-signal--map,.scene-signal--network{opacity:.4}
  .signal-travel{stroke-width:1.8;filter:none}
  .signal-core{filter:none}
}
@media(prefers-reduced-motion:reduce){
  .motion-ready .motion-item,.motion-ready .motion-item:not(.motion-shown),.motion-ready .plan-card.reveal{opacity:1;translate:none;transform:none;transition:none}
  .motion-ready .justice-image,.motion-ready .audience-map,.motion-ready .network-photo,.motion-ready .scene-signal{translate:none;scale:1;will-change:auto}
  .scene-signal{display:none}
  .motion-ready *,.motion-ready *:before,.motion-ready *:after{animation:none!important;transition:none!important}
}
