.reveal{opacity:0;transform:translateY(2rem);transition:opacity var(--duration-slow) var(--ease),transform var(--duration-slow) var(--ease)}.reveal.is-visible{opacity:1;transform:none}@keyframes pulse{50%{box-shadow:0 0 0 1rem transparent}}.map-node{animation:pulse 2.8s infinite}

/* Progressive image reveal and interactive optical depth */
.image-motion{--image-shift-x:0px;--image-shift-y:0px;--image-shine-x:50%;--image-shine-y:50%;isolation:isolate;background:linear-gradient(110deg,var(--color-surface-muted) 20%,color-mix(in srgb,var(--color-brand-primary) 9%,var(--color-surface-muted)) 42%,var(--color-surface-muted) 64%);background-size:220% 100%}
.image-motion>img{opacity:0;filter:blur(16px) saturate(.72) contrast(.92);transform:scale(1.09);transform-origin:center;transition:opacity .8s cubic-bezier(.22,1,.36,1),filter 1.15s cubic-bezier(.22,1,.36,1),transform 1.35s cubic-bezier(.16,1,.3,1)}
.image-motion.is-image-ready.is-image-visible>img{opacity:1;filter:blur(0) saturate(1) contrast(1);transform:scale(1.001)}
.image-motion__fx{position:absolute;z-index:1;inset:0;display:block;pointer-events:none;background:linear-gradient(105deg,transparent 22%,color-mix(in srgb,white 34%,transparent) 46%,transparent 68%);opacity:.68;transform:translateX(-115%);animation:image-loading-sweep 1.35s ease-in-out infinite;transition:opacity .65s ease,transform .85s cubic-bezier(.16,1,.3,1)}
.image-motion.is-image-ready.is-image-visible>.image-motion__fx{opacity:0;animation:none;transform:translateX(115%)}
@media(hover:hover) and (pointer:fine){.image-motion:hover>img{will-change:transform,filter}.image-motion.is-image-ready.is-image-visible:hover>img,.project-card:hover .image-motion.is-image-ready.is-image-visible>img{transform:scale(1.065) translate3d(var(--image-shift-x),var(--image-shift-y),0);filter:saturate(1.06) contrast(1.025)}.image-motion.is-image-ready.is-image-visible:hover>.image-motion__fx,.project-card:hover .image-motion.is-image-ready.is-image-visible>.image-motion__fx{opacity:.28;transform:none;background:radial-gradient(circle at var(--image-shine-x) var(--image-shine-y),color-mix(in srgb,white 52%,transparent),transparent 28%),linear-gradient(115deg,transparent 35%,color-mix(in srgb,white 18%,transparent) 49%,transparent 63%)}}
@keyframes image-loading-sweep{0%{transform:translateX(-115%)}55%,100%{transform:translateX(115%)}}

@media(prefers-reduced-motion:reduce){html{scroll-behavior:auto}*,*::before,*::after{animation-duration:.01ms!important;animation-iteration-count:1!important;transition-duration:.01ms!important}.reveal{opacity:1;transform:none}.image-motion>img,.image-motion.is-image-ready.is-image-visible>img,.image-motion.is-image-ready.is-image-visible:hover>img,.project-card:hover .image-motion.is-image-ready.is-image-visible>img{opacity:1;filter:none;transform:none}.image-motion__fx{display:none}}
@media(prefers-reduced-motion:reduce){.button:hover,.button:active,.filter-button:hover,.filter-button:active,.theme-toggle:hover,.menu-toggle:hover,.back-to-top:hover,.text-link:hover::after{transform:none}.button::before,.filter-button::before{display:none}.button--ghost:hover,.button--ghost:focus-visible,.cta-panel>.button:hover,.cta-panel>.button:focus-visible{color:var(--button-ink)}}
