/* ── Motion system: shared easing + duration tokens (cohesion across the site) ── */
:root{
  --ease-standard:cubic-bezier(0.4,0,0.2,1);
  --ease-out:cubic-bezier(0.22,1,0.36,1);
  --ease-in-out:cubic-bezier(0.65,0,0.35,1);
  --ease-spring:cubic-bezier(0.34,1.4,0.64,1);
  --dur-fast:0.15s;
  --dur-base:0.3s;
  --dur-slow:0.6s;
}

/* ── Micro-interaction: wipe-in underline on text links (content areas only) ── */
.about-prose a,.svc-section p a,.post-body a,.res-body-rich a,.gloss-def a,.cmp-body a{
  background-image:linear-gradient(currentColor,currentColor);
  background-size:0% 1px;background-repeat:no-repeat;background-position:0 100%;
  text-decoration:none;transition:background-size var(--dur-base) var(--ease-out);
  padding-bottom:1px;
}
.about-prose a:hover,.svc-section p a:hover,.post-body a:hover,.res-body-rich a:hover,.gloss-def a:hover,.cmp-body a:hover{background-size:100% 1px;}

/* ── Buttons: clean invert on hover (visible in both themes) + press-scale ── */
.btn,.nav-cta,.svc-cta .btn,.final .btn{border:1px solid var(--c-black);transition:background var(--dur-base) var(--ease-standard),color var(--dur-base) var(--ease-standard),border-color var(--dur-base) var(--ease-standard),transform var(--dur-fast) var(--ease-standard);}
.btn:hover,.nav-cta:hover{background:var(--c-white);color:var(--c-black);border-color:var(--c-black);}
.btn:active,.nav-cta:active{transform:scale(0.97);}

/* ── Magnetic CTA (JS sets --mx/--my; falls back to no movement) ── */
.magnetic{transform:translate(var(--mx,0),var(--my,0));transition:transform var(--dur-base) var(--ease-spring);}

/* ── Reading-progress bar (added by JS on article pages) ── */
#read-progress{position:fixed;top:0;left:0;height:2px;width:0;background:var(--c-black);z-index:200;transition:width 0.05s linear;pointer-events:none;}

/* ── Page cross-fade transition ── */
@media(prefers-reduced-motion:no-preference){
  body{animation:pageIn var(--dur-base) var(--ease-out);}
  body.is-leaving{opacity:0;transition:opacity 0.18s var(--ease-standard);}
  @keyframes pageIn{from{opacity:0;}to{opacity:1;}}
}

/* ── Parallax layer (JS drives --py) ── */
.parallax{transform:translate3d(0,var(--py,0),0);will-change:transform;}

@media(prefers-reduced-motion:reduce){
  .magnetic,.parallax{transform:none!important;}
  #read-progress{display:none;}
}

/* Links inside svc-list (trade/location/hub/related lists) — theme color, not browser blue */
.svc-list a{color:var(--c-black);text-decoration:none;background-image:linear-gradient(currentColor,currentColor);background-size:0% 1px;background-repeat:no-repeat;background-position:0 100%;transition:background-size var(--dur-base) var(--ease-out);padding-bottom:1px;}
.svc-list a:hover{background-size:100% 1px;}

/* Footer links — same wipe-in underline as content links (self-width, no layout shift) */
.ft-col a,.ft-legal a{background-image:linear-gradient(currentColor,currentColor);background-size:0% 1px;background-repeat:no-repeat;background-position:0 100%;transition:color var(--dur-fast) var(--ease-standard),background-size var(--dur-base) var(--ease-out);padding-bottom:2px;}
.ft-col a:hover,.ft-legal a:hover{background-size:100% 1px;}

/* All remaining non-button text links get the same wipe-in underline.
   Buttons (.btn*/.nav-cta/.tier-btn/.res-dl-btn/.cookie-btn), icon links
   (.sh-m/.share-sidebar-link/.profile-linkedin/.ft-social), card links
   (.blog-card/.author-card) and wordmarks (.nav-firm/.ft-firm) are excluded
   by not being listed. .call-bar is a bar, also excluded. */
.nav-links a,.nav-more-menu a,.nav-drawer a:not(.nav-cta),.svc-back,.post-back,.location-phone,.final-row a,.faq-a a,.legal-content a,.legal-toc a{
  background-image:linear-gradient(currentColor,currentColor);
  background-size:0% 1px;background-repeat:no-repeat;background-position:0 100%;
  transition:color var(--dur-fast) var(--ease-standard),opacity var(--dur-fast) var(--ease-standard),background-size var(--dur-base) var(--ease-out);
  padding-bottom:2px;text-decoration:none;
}
.nav-links a:hover,.nav-more-menu a:hover,.nav-drawer a:not(.nav-cta):hover,.svc-back:hover,.post-back:hover,.location-phone:hover,.final-row a:hover,.faq-a a:hover,.legal-content a:hover,.legal-toc a:hover{background-size:100% 1px;}

/* Text links that used a static border-bottom underline — drop the border and
   use the same wipe-in animation (no double underline, no rest underline). */
.fcta-secondary,.founder-link,.service-link,.svc-blog-more{
  border-bottom:none;
  background-image:linear-gradient(currentColor,currentColor);
  background-size:0% 1px;background-repeat:no-repeat;background-position:0 100%;
  transition:color var(--dur-fast) var(--ease-standard),background-size var(--dur-base) var(--ease-out);
  padding-bottom:2px;text-decoration:none;
}
.fcta-secondary:hover,.founder-link:hover,.service-link:hover,.svc-blog-more:hover{background-size:100% 1px;opacity:1;}

/* Solid theme-colored backdrop so page-transition fades go through white (light)
   / black (dark) instead of flashing browser-white. */
html{background:var(--c-bg);}

/* Focus: no outline on mouse-click (was rendering a stray line beside the hamburger);
   clean theme-aware ring on keyboard focus. */
.nav-more-toggle:focus:not(:focus-visible),.nav-burger:focus:not(:focus-visible),.nav-cta:focus:not(:focus-visible),.theme-toggle:focus:not(:focus-visible){outline:none;}
.nav-more-toggle:focus-visible,.nav-burger:focus-visible,.nav-cta:focus-visible,.theme-toggle:focus-visible{outline:2px solid var(--c-black);outline-offset:3px;border-radius:2px;}
