/* v17.70 — performance pass. Visual composition stays intact and all copy is
   static: no entrance motion, replay, or scroll-linked text transform. */

/* A 7.6 KB tile replaces the former 185 KB grain. Normal compositing avoids
   repainting the full viewport through a fixed multiply-blend layer. */
body::after {
  background-image:url("assets/print-grain-v17.66.webp");
  opacity:.22;
  mix-blend-mode:normal;
}

/* Work belonging to another slide is paused until that slide is active. */
.slide:not(.is-visible) :is(
  .scroll-cue i,
  .dishwasher-cat-stage img,
  .heater-flake,
  .founding-year > span
),
.slide:not(.is-visible) .dishwasher-cat-stage::before {
  animation-play-state:paused!important;
}

/* Snow keeps the approved look but moves with a compositor transform instead
   of changing `top` fifteen times per animation frame. */
.heater-flake { top:-5%!important; will-change:transform,opacity; }
@keyframes heater-snow {
  0% { transform:translate3d(0,-5vh,0); opacity:0; }
  12% { opacity:.78; }
  84% { opacity:.66; }
  100% { transform:translate3d(var(--flake-drift),110vh,0); opacity:0; }
}

/* On short desktop windows the floating finish control occupied y=82–124,
   while left-side copy could begin around y=108. Keep those rows apart. */
@media (min-width:1025px) and (max-height:760px) {
  #slide-2 .dishwasher-copy,
  #slide-5 .oven-copy {
    top:calc(var(--header-height) + 56px)!important;
  }
}

