/* Source: custom — Exvisios (hero surface treatment)
   NOT an animation. The Ken-Burns drift that used to live here was removed: a
   slow zoom on a hero photo is the most recognisable template move there is,
   and with assets/video/hero.mp4 now in place it would be a second layer of
   motion on the same element. The clip carries the hero; the two UI motions
   that carry meaning are elsewhere — section reveal, and the schedule rule
   filling as you read the four phases.

   What remains is static film grain: texture, not movement. It also keeps the
   large flat scrim from banding across a wide gradient. Self-contained
   data-URI SVG, so it needs no request and no CSP exception. */

/* Fine grain — sits above the media, below the content. */
.hero::after {
  content: "";
  position: absolute;
  inset: 0;
  z-index: -1;
  pointer-events: none;
  opacity: 0.05;
  mix-blend-mode: overlay;
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='140' height='140'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='2' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)'/%3E%3C/svg%3E");
}

/* Slightly more presence than a 1:1 crop — but it holds still. Applies to the
   <video> as well, so the poster and the clip sit at exactly the same scale and
   nothing shifts when the clip attaches. This transform itself never animates,
   so there is nothing here to gate behind prefers-reduced-motion; the clip is
   gated in assets/animations/hero-video.js instead. */
.hero__media img,
.hero__media video { transform: scale(1.03); transform-origin: 60% 40%; }
