/* Scroll-in motion. Active only when motion.js adds .mo to <html> (never on calm pages or with reduced motion). */
.mo [data-rv]{opacity:0;will-change:transform,opacity;
  transition:opacity .8s cubic-bezier(.2,.7,.2,1) var(--d,0ms),transform .9s cubic-bezier(.2,.7,.2,1) var(--d,0ms),clip-path 1.2s cubic-bezier(.7,0,.2,1) var(--d,0ms);}
.mo [data-rv="up"]{transform:translateY(40px);}
.mo [data-rv="left"]{transform:translateX(-70px);}
.mo [data-rv="right"]{transform:translateX(56px);}
.mo [data-rv="zoom"]{transform:scale(.95);}
.mo [data-rv="wipe"]{opacity:1;clip-path:inset(0 0 100% 0);}
.mo [data-rv="wipe"] img,.mo [data-rv="wipe"] video{transform:scale(1.15);transition:transform 1.6s cubic-bezier(.2,.7,.2,1) var(--d,0ms);}
/* end state: no clip-path here. inset(0) clips to the element box and cut off descenders (the g in "Recognised")
   on tight-leading headings. Only the image wipe needs a clip. */
.mo [data-rv].in{opacity:1;transform:none;}
.mo [data-rv="wipe"].in{clip-path:inset(0 0 0 0);}
.mo [data-rv="wipe"].in img,.mo [data-rv="wipe"].in video{transform:scale(1);}
.mo .tile[data-rv] img{transform:scale(1.1);transition:transform 1.3s cubic-bezier(.2,.7,.2,1) var(--d,0ms);}
.mo .tile[data-rv].in img{transform:scale(1);}
.mo .tile[data-rv].in:hover img{transform:scale(1.04);transition-duration:.5s;transition-delay:0ms;}
.mo [data-plx]{will-change:transform;}
@media print{.mo [data-rv]{opacity:1!important;transform:none!important;clip-path:none!important;}}
