/* Cross-document enhancement only. Unsupported/reduced-motion browsers keep
   ordinary links and native history, with no synthetic delay. */
@media (prefers-reduced-motion:no-preference) {
  @view-transition {navigation:auto;}
}
/* Nothing opts into an element snapshot at rest; names are assigned at pageswap. */
html::view-transition-group(*) {animation-duration:620ms;animation-timing-function:cubic-bezier(.2,.8,.2,1);}
html::view-transition-old(root) {animation:project-page-out 280ms ease both;}
html::view-transition-new(root) {animation:project-page-in 420ms 100ms ease both;}
html::view-transition-group(project-shell) {z-index:2;}
html::view-transition-group(project-art) {z-index:3;}
html::view-transition-group(portfolio-nav) {z-index:4;animation:none;}
html::view-transition-old(portfolio-nav) {animation:none;opacity:1;}
html::view-transition-new(portfolio-nav) {animation:none;opacity:1;}
html::view-transition-image-pair(project-shell) {
  overflow:clip;
  animation:project-shell-resolve 620ms cubic-bezier(.2,.8,.2,1) both;
}
html::view-transition-old(project-shell) {
  width:100%;height:100%;object-fit:contain;object-position:center top;
  animation:project-shell-out 260ms ease both;mix-blend-mode:normal;
}
html::view-transition-new(project-shell) {
  width:100%;height:100%;object-fit:none;object-position:left top;
  animation:project-page-in 390ms 150ms ease both;mix-blend-mode:normal;
}
html::view-transition-image-pair(project-art) {overflow:clip;border-radius:24px;}
html::view-transition-old(project-art),html::view-transition-new(project-art) {
  width:100%;height:100%;object-fit:contain;object-position:center top;mix-blend-mode:normal;
}
html::view-transition-old(project-art) {animation:project-art-out 480ms ease both;}
html::view-transition-new(project-art) {animation:project-page-in 400ms 140ms ease both;}
@keyframes project-shell-resolve {
  from {border-radius:var(--morph-radius,42px);background:rgba(var(--morph-tint,180,200,210),.08);}
  to {border-radius:0;background:transparent;}
}
@keyframes project-page-out {to {opacity:0;}}
@keyframes project-page-in {from {opacity:0;}to {opacity:1;}}
@keyframes project-shell-out {0%,20% {opacity:1;}to {opacity:0;}}
@keyframes project-art-out {0%,35% {opacity:1;}to {opacity:0;}}
/* Returning uses a short coherent dissolve, preserving native scroll restoration
   instead of forcing a reverse flight to a potentially offscreen card. */
html[data-project-transition="return"]::view-transition-group(*) {animation-duration:180ms;}
html[data-project-transition="return"]::view-transition-old(root) {animation:project-page-out 180ms ease both;}
html[data-project-transition="return"]::view-transition-new(root) {animation:project-page-in 180ms ease both;}
/* Freeze ambient painting only for the brief snapshot interval. No live filter
   is scaled to viewport size: the browser animates already-painted snapshots. */
html[data-project-transition] :is(.portfolio-ambient,.portfolio-ambient::before,.portfolio-ambient::after,.now-star,[data-now-glow]) {animation-play-state:paused !important;}
@media (max-width:900px) {
  html::view-transition-group(*) {animation-duration:480ms;}
  html::view-transition-image-pair(project-shell) {animation-duration:480ms;}
  html::view-transition-new(project-shell) {animation-duration:300ms;animation-delay:100ms;}
  html::view-transition-old(project-art) {animation-duration:350ms;}
  html::view-transition-new(project-art) {animation-duration:280ms;animation-delay:100ms;}
  html::view-transition-new(root) {animation-duration:300ms;animation-delay:80ms;}
}
@media (prefers-reduced-motion:reduce) {
  @view-transition {navigation:none;}
  html::view-transition-group(*),html::view-transition-old(*),html::view-transition-new(*) {animation:none !important;}
}
