/* Motion pass: measured client reveal and project hover, independently implemented. */
html.lenis,html.lenis body{height:auto}.lenis.lenis-smooth{scroll-behavior:auto!important}.lenis.lenis-stopped{overflow:hidden}.lenis [data-lenis-prevent]{overscroll-behavior:contain}body:has(dialog[open]){overflow:hidden}
.motion-ready .reveal{opacity:1!important;filter:none!important;transform:none!important}
/* Only frame-driven elements bypass CSS interpolation. Observer-driven project
   cards own their opacity transition and must not inherit this reset. */
.motion-ready .scroll-reveal,.motion-ready .motion-card{transition:none!important}
.scroll-reveal{will-change:transform,filter,opacity;transform:translate3d(0,var(--reveal-y,0px),0) scale(var(--reveal-scale,1));opacity:var(--reveal-alpha,1);filter:blur(var(--reveal-blur,0px))}
.project.motion-card{will-change:transform,filter,opacity;transform:translate3d(0,var(--reveal-y,0px),0) scale(var(--reveal-scale,1))!important;opacity:var(--reveal-alpha,1)!important;filter:blur(var(--reveal-blur,0px))!important;transform-origin:center top}
.project.motion-card:focus-visible,.scroll-reveal:focus-within{opacity:1!important;filter:none!important;transform:none!important}
.project-image img{transform:scale(1);filter:none;transition:transform .8s cubic-bezier(.22,1,.36,1),filter .8s cubic-bezier(.22,1,.36,1)}
@media(hover:hover) and (pointer:fine){.project:hover .project-image img{transform:scale(1.13);filter:blur(7px)}.project:hover .project-image:after{background:#0003}.project:hover .project-label{transform:translateY(-50%) scale(1.025)}.client-logos>div:hover img{transform:scale(1.07)}}
.project-label{transition:transform .7s cubic-bezier(.22,1,.36,1)}.client-logos img{transition:filter .5s,transform .7s cubic-bezier(.22,1,.36,1)}
.registration span{display:inline-block;transform-origin:8px 8px;transform:rotate(var(--cross-turn,0deg));transition:none}
.menu:not([hidden]){animation:menu-in .65s cubic-bezier(.22,1,.36,1) both}.menu:not([hidden])>*{animation:menu-item-in .65s cubic-bezier(.22,1,.36,1) both}.menu:not([hidden])>*:nth-child(2){animation-delay:.05s}.menu:not([hidden])>*:nth-child(3){animation-delay:.1s}.menu:not([hidden])>*:nth-child(4){animation-delay:.15s}
.nav-roll{height:1.15em;display:block;overflow:hidden}.nav-roll>span{display:block;line-height:1.15em;transition:transform .5s cubic-bezier(.22,1,.36,1)}.navigation a:hover .nav-roll>span,.navigation button:hover .nav-roll>span{transform:translateY(-100%)}
dialog[open]{animation:dialog-in .45s cubic-bezier(.22,1,.36,1) both}dialog[open]::backdrop{animation:backdrop-in .4s ease both}
.contact-button>span:last-child{transition:transform .45s cubic-bezier(.22,1,.36,1)}.contact-button:hover>span:last-child{transform:translate(3px,-3px)}
@keyframes menu-in{from{clip-path:inset(0 0 100%)}to{clip-path:inset(0)}}@keyframes menu-item-in{from{transform:translateY(32px);opacity:0;filter:blur(4px)}to{transform:none;opacity:1;filter:blur(0)}}@keyframes dialog-in{from{transform:translateY(24px) scale(.97);opacity:0}to{transform:none;opacity:1}}@keyframes backdrop-in{from{background:#0000;backdrop-filter:blur(0)}to{background:#000c;backdrop-filter:blur(8px)}}
@media(prefers-reduced-motion:reduce){.scroll-reveal,.project.motion-card{transform:none!important;filter:none!important;opacity:1!important}.registration span{transform:none!important}.project:hover .project-image img{filter:none!important;transform:none!important}.nav-roll>span{transform:none!important}}
