/* Nolvos — shared motion, loaded after the page-specific styles.
   Reading and native scrolling remain immediate. No repeated animation,
   animated filter, global compositor layer or JavaScript height interpolation. */
:root{
  --motion-fast:160ms;
  --motion-control:200ms;
  --motion-enter:420ms;
  --motion-ease:cubic-bezier(.22,1,.36,1);
  --motion-standard:cubic-bezier(.2,.65,.3,1);
}

/* Short, light entries stop moving once readable; no resting 3D transform. */
.nv-reveal{
  opacity:1;
  transform:none;
  transition:opacity 300ms ease-out,transform var(--motion-enter) var(--motion-ease);
  transition-delay:calc(var(--reveal-delay,0ms) * .5);
}
.nv-reveal.is-pending{transform:translateY(12px)}
.nv-reveal[data-reveal-style=card].is-pending{transform:translateY(14px)}
.method-track-v4>li.nv-reveal:after{
  transition:transform 440ms var(--motion-ease);
  transition-delay:calc(var(--reveal-delay,0ms) * .5);
}
.method-track-v4>li.nv-reveal .method-index{
  transition:opacity 240ms ease-out,transform 340ms var(--motion-ease);
  transition-delay:calc(var(--reveal-delay,0ms) * .5 + 40ms);
}
.method-track-v4>li.nv-reveal.is-pending .method-index{transform:translateY(4px)}
.cabinet-excerpt-v4.nv-reveal .excerpt-line,
.cabinet-hub-v4.nv-reveal .cabinet-hub-mission{
  transform:none;
  transition:opacity 260ms ease-out,transform 360ms var(--motion-ease);
  transition-delay:40ms;
}
.cabinet-excerpt-v4.nv-reveal .excerpt-line+.excerpt-line,
.cabinet-hub-v4.nv-reveal .cabinet-hub-mission:nth-child(3){transition-delay:80ms}
.cabinet-hub-v4.nv-reveal .cabinet-hub-mission:nth-child(4){transition-delay:120ms}
.cabinet-excerpt-v4.nv-reveal.is-pending .excerpt-line,
.cabinet-hub-v4.nv-reveal.is-pending .cabinet-hub-mission{transform:translateY(6px)}

/* Only controls repaint on interaction; layout and large images stay still. */
.button,.concept-action,.header .nav-cta,.back-top,.expertise-jump a,
.showcase-arrows button,.method-mini-flow a,.cabinet-detail-page .cabinet-detail-jump>a{
  transition:color var(--motion-fast) ease-out,
    background-color var(--motion-fast) ease-out,
    border-color var(--motion-fast) ease-out;
}
.header nav>a,.footer-main>div a,.showcase-choices button,
.text-link,.contact-address,.offer-fold-v4>summary h3,.method-route a strong{
  transition:color var(--motion-fast) ease-out,border-color var(--motion-fast) ease-out;
}
.button span,.showcase-project-link span,.join-invitation-v4 h3>span,
.faq-v4-list summary>span,.menu-lines i,.concept-agent-permissions>summary>span{
  transition:transform var(--motion-control) var(--motion-ease);
}
.offer-fold-plus{
  transition:transform var(--motion-control) var(--motion-ease),
    background-color var(--motion-fast) ease-out,
    color var(--motion-fast) ease-out,border-color var(--motion-fast) ease-out;
}
.offer-action i{
  transition:background-color var(--motion-fast) ease-out,
    color var(--motion-fast) ease-out,border-color var(--motion-fast) ease-out;
}
.contact-compose :is(input,select,textarea),
.application-section :is(input,select,textarea){transition:border-color var(--motion-fast) ease-out}

/* Deliberate native toggles may interpolate their content in capable browsers.
   Automatic service entries keep their single layout pass below the reader. */
@supports (interpolate-size:allow-keywords) and selector(details::details-content){
  .offer-fold-v4,.faq-v4-list details{interpolate-size:allow-keywords}
  .offer-fold-v4::details-content,.faq-v4-list details::details-content{
    block-size:0;
    opacity:0;
    overflow:clip;
    transition:block-size 280ms var(--motion-standard),opacity 180ms ease-out,
      content-visibility 280ms allow-discrete;
  }
  .offer-fold-v4[open]::details-content,.faq-v4-list details[open]::details-content{
    block-size:auto;
    opacity:1;
  }
  .offer-folds-v4[data-scroll-offers=progressive] .offer-fold-v4::details-content{transition:none}
}
.offer-fold-v4[data-auto-open=true] .offer-fold-content{animation:nolvos-offer-entry 180ms ease-out both}

/* The scene's opacity/transform follow the scroll frame directly, without
   another CSS transition chasing it. Layers exist only near the presentation. */
.showcase.is-scroll{overflow-anchor:none}
.showcase.is-scroll .showcase-slide{will-change:auto;transition:none}
.showcase.is-scroll .showcase-slide.is-entering{animation:none}
.showcase.is-near-scene .showcase-slide.is-compositing{will-change:opacity,transform}
.showcase-progress:before{display:none;will-change:auto}
.showcase-progress-fill{
  display:block;
  width:100%;height:100%;
  background:var(--sc-blue);
  transform:scaleX(0);
  transform-origin:left;
}
.showcase.is-near-scene .showcase-progress-fill{will-change:transform}

/* Entry-only enhancement: closing still removes the navigation immediately,
   including from keyboard navigation. Browsers without @starting-style use
   the existing instant native menu; no hidden links remain focusable. */
@media(max-width:900px) and (prefers-reduced-motion:no-preference){
  .js-enabled .header nav.is-open{
    opacity:1;transform:none;
    transition:opacity var(--motion-fast) ease-out,
      transform 220ms var(--motion-ease);
  }
  @starting-style{
    .js-enabled .header nav.is-open{opacity:0;transform:translateY(-5px)}
  }
}

/* Hover motion belongs to an accurate pointing device. These overrides also
   neutralise the older unconditional :hover styles on touchscreens. Pressed,
   expanded, selected and keyboard-focus states remain meaningful. */
@media(hover:none),(pointer:coarse){
  .button:hover span,.showcase-project-link:hover span,
  .join-invitation-v4:hover h3>span{transform:none}
  .join-invitation-v4.nv-reveal.is-revealed:hover{transform:none}
  .button-blue:hover{background:var(--blue)}
  .button-dark:hover{background:var(--ink)}
  .closing-v4 .button:hover{background:var(--paper)}
  .header nav>a:hover:not([aria-current]):not(.nav-cta){color:inherit}
  .header .nav-cta:hover:not([aria-current]){background:var(--blue);color:#fff}
  .footer-main>div a:hover{color:inherit}
  .footer .back-top:hover{background:transparent}
  .expertise-jump a:hover{background:transparent;color:inherit;border-color:#c2c6cb}
  .showcase-choices button:hover:not([aria-pressed=true]){color:var(--sc-muted)}
  .showcase-arrows button:hover{background:transparent;color:var(--sc-ink);border-color:#bec4cb}
  .concept-action:hover{background:var(--sc-blue)}
  .field-mission .concept-action:hover{background:#335f4e}
  .offer-fold-v4>summary:hover h3{color:inherit}
  .offer-action:hover:not(:focus-visible) i{background:transparent;color:var(--blue);border-color:var(--line)}
  .method-route a:hover strong{color:inherit}
  .method-mini-flow a:hover{color:inherit;border-color:#cbd5ef}
  .cabinet-detail-page .cabinet-detail-jump>a:hover{color:inherit;border-bottom-color:transparent}
}

/* Focus never waits for a cosmetic transition or a delayed parent entry. */
:focus-visible{transition-duration:0s!important;transition-delay:0s!important}
.contact-compose :is(input,select,textarea):focus,
.application-section :is(input,select,textarea):focus{transition:none}
.nv-reveal:focus-within,.nv-reveal:focus-within *{
  transition-delay:0s!important;
}
.nv-reveal:focus-within{opacity:1;transform:none;transition:none}

@media(prefers-reduced-motion:reduce){
  html{scroll-behavior:auto!important}
  *,*::before,*::after{animation:none!important;transition:none!important;scroll-behavior:auto!important}
  .nv-reveal,.nv-reveal.is-pending,.nv-reveal[data-reveal-style=card].is-pending,
  .method-track-v4>li.nv-reveal .method-index,
  .cabinet-excerpt-v4.nv-reveal .excerpt-line,
  .cabinet-hub-v4.nv-reveal .cabinet-hub-mission{
    opacity:1!important;transform:none!important;
  }
  .showcase.is-scroll .showcase-slide,
  .showcase.is-near-scene .showcase-slide.is-compositing,
  .showcase.is-near-scene .showcase-progress-fill{will-change:auto}
}
