*, *::before, *::after {
  box-sizing: border-box;
  margin: 0;
  padding: 0;
}

html {
  /* NOTE: no `scroll-behavior: smooth` — it breaks ScrollTrigger.refresh(): the
     browser animates the refresh's internal scroll-to-0 instead of jumping, so
     measurement runs mid-animation and every trigger ends up offset by -scrollY
     (hero/morph stranded after a mid-scroll refresh). Smooth anchor-scrolling, if
     wanted, should be done via GSAP ScrollToPlugin, not this CSS property. */
}

body {
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  /* clip, NOT hidden: overflow-x:hidden computes overflow-y to auto, making the
     body a scroll container — which makes ScrollTrigger measure against the wrong
     scroller and offset every trigger by -scrollY whenever it refreshes mid-scroll
     (late asset load / resize). overflow-x:clip clips without a scroll container. */
  overflow-x: clip;
}

a {
  text-decoration: none;
  color: inherit;
}

ul, ol {
  list-style: none;
}

button {
  background: none;
  border: none;
  cursor: pointer;
  font: inherit;
}
