/* Motion stays inside the project previews. */
.project-cover .preview-scene{transform-origin:180px 125px}
.project-cover > svg{transform-origin:50% 50%;transition:transform .35s ease-out}
@media(hover:hover) and (pointer:fine){
  .project-cover:hover > svg{transform:perspective(650px) rotateX(var(--preview-rx,0deg)) rotateY(var(--preview-ry,0deg)) scale(1.045)}
  .project-cover:hover .preview-scene{animation:preview-float 3s ease-in-out infinite}
  .project-cover[data-visual="vectors"]:hover .preview-scene circle,
  .project-cover[data-visual="regression"]:hover .preview-scene circle{animation:point-shimmer 2s ease-in-out infinite alternate}
  .project-cover:hover .preview-scene circle:nth-of-type(3n){animation-delay:-.7s}
  .project-cover:hover .preview-scene circle:nth-of-type(3n+1){animation-delay:-1.3s}
  .project-cover[data-visual="rice"]:hover .preview-scene>g{animation:grain-float 2s ease-in-out infinite alternate}
  .project-cover[data-visual="rice"]:hover .preview-scene>g:nth-child(even){animation-delay:-1s}
  .project-cover[data-visual="ocr"]:hover rect[stroke-dasharray],
  .project-cover[data-visual="inspection"]:hover rect[stroke-dasharray],
  .project-cover[data-visual="orders"]:hover rect[stroke-dasharray],
  .project-cover[data-visual="satellite"]:hover path[stroke-dasharray],
  .project-cover[data-visual="map"]:hover path[stroke-dasharray]{animation:scan-trace 2s linear infinite}
}
.project-cover:focus-visible > svg{transform:scale(1.035)}
@keyframes preview-float{0%,100%{translate:0 0}50%{translate:0 -5px}}
@keyframes point-shimmer{from{opacity:.35}to{opacity:1}}
@keyframes grain-float{from{translate:0 2px}to{translate:0 -3px}}
@keyframes scan-trace{to{stroke-dashoffset:-24}}
@media(prefers-reduced-motion:reduce){
 .solution-art *,.project-cover *{animation:none!important;transition:none!important}
 .project-cover:hover > svg,.project-cover:focus-visible > svg{transform:none}
}
