/* Shared illustration motion: connected arrivals and uninterrupted signal replays. */
.prism{--motion-ease:cubic-bezier(.22,.7,.28,1)}
.prism .hero-copy>*{animation-duration:.65s;animation-timing-function:var(--motion-ease)}
.prism .service-text-link span,.prism .guide-button span{display:inline-block;transition:transform .24s var(--motion-ease)}
.prism .service-text-link,.prism .guide-button{transition:color .24s,border-color .24s,background .24s,box-shadow .24s}
@media(hover:hover) and (pointer:fine){
  .prism .service-text-link:hover span,.prism .guide-button:hover span{transform:translate(2px,-2px)}
}
.prism .service-text-link:focus-visible span,.prism .guide-button:focus-visible span{transform:translate(2px,-2px)}
/* A single isolated dash travels all the way off each route before resetting.
   A gap longer than the path prevents a second dash appearing at the inlet. */
.prism .service-flow{stroke-dasharray:.12 1.12;stroke-dashoffset:.12}
.prism .art-flow{stroke-dasharray:.12 1.12;stroke-dashoffset:.12}
.prism .engine-transit{stroke-dasharray:6 106;stroke-dashoffset:6}
@media(prefers-reduced-motion:no-preference){
  .prism .service-in-motion .service-source,
  .prism .service-in-motion .service-middle,
  .prism .service-in-motion .service-result,
  .prism .service-in-motion .service-detail,
  .prism .is-illustrating .art-source,
  .prism .is-illustrating .art-result,
  .prism .is-illustrating .art-row{animation:none}
  /* Move the entire drawing together so cards never detach from their routes. */
  .prism .service-in-motion.motion-entering>svg,
  .prism .is-illustrating.motion-entering .work-art{animation:polish-arrive .65s var(--motion-ease) both}
  .prism .service-in-motion.motion-entering .service-detail{animation:polish-detail .55s .85s ease-out both}
  .prism .service-in-motion:not(.motion-entering) .service-middle{animation:polish-pulse 1s .4s ease-in-out both}
  .prism .service-in-motion .service-flow{animation:polish-flow 1.5s .3s linear both}
  .prism .service-art-work.service-in-motion .service-flow{animation-duration:.9s}
  .prism .service-art-work.service-in-motion .service-flow-late{animation-duration:.6s;animation-delay:1.2s}
  .prism .is-illustrating.motion-entering .art-row{animation:polish-detail .45s .95s ease-out both}
  .prism .is-illustrating.motion-entering .art-row-two{animation-delay:1.07s}
  .prism .is-illustrating.motion-entering .art-row-three{animation-delay:1.19s}
  .prism .is-illustrating .art-flow{animation:polish-flow 1.4s .2s linear both}
  .prism .is-illustrating .art-flow.art-delay{animation-delay:.38s}
  .prism .is-illustrating .art-flow.art-delay-last{animation-delay:.56s}
  .prism .is-illustrating .art-stamp{animation:polish-pulse .7s 1.6s ease-in-out both}
}
@keyframes polish-arrive{from{opacity:.55;translate:0 5px}to{opacity:1;translate:0 0}}
@keyframes polish-detail{from{opacity:.4}to{opacity:1}}
@keyframes polish-pulse{0%,100%{opacity:1}45%{opacity:.65}}
@keyframes polish-flow{0%{opacity:0;stroke-dashoffset:.12}10%,88%{opacity:1}100%{opacity:0;stroke-dashoffset:-1}}
/* All hero tracks retain the same clock and wrap on identical resting frames. */
@keyframes engine-input{0%,5.5556%{stroke-dashoffset:6;opacity:0}8.8889%{opacity:1}37.7778%{stroke-dashoffset:-94;opacity:1}40%,100%{stroke-dashoffset:-100;opacity:0}}
@keyframes engine-output{0%,43.3333%{stroke-dashoffset:6;opacity:0}46.6667%{opacity:1}77.7778%{stroke-dashoffset:-94;opacity:1}80%,100%{stroke-dashoffset:-100;opacity:0}}
@keyframes engine-lift{0%,28%,74%,100%{transform:translateY(0)}43%,50%{transform:translateY(-3px)}}
@media(prefers-reduced-motion:reduce){
  .prism .hero-copy>*{opacity:1;transform:none}
  .prism .service-flow,.prism .art-flow,.prism .engine-transit{opacity:0}
  .prism .service-text-link span,.prism .guide-button span{transform:none}
}
