/* Scroll motion — shared by artsculture.com.sg and mathculture.com.sg.
   Hidden states apply only after motion.js adds .mo to <html> (never without JS,
   never with reduced motion), so content is always readable. */
.mo .m-up,.mo .m-card,.mo .m-panel,.mo .m-wipe,.mo .m-fill{
  transition-property:opacity,transform;
  transition-duration:.9s;
  transition-timing-function:cubic-bezier(.16,1,.3,1);
  transition-delay:calc(var(--d,0) * 90ms);
}
/* text: rise and fade */
.mo .m-up:not(.in){opacity:0;transform:translateY(28px)}
/* boxes: slide up like a deck of slides, slightly scaled */
.mo .m-card:not(.in){opacity:0;transform:translateY(64px) scale(.94)}
/* big panels: grow from a slightly smaller slide to full size */
.mo .m-panel{transition-duration:1.1s}
.mo .m-panel:not(.in){opacity:0;transform:translateY(48px) scale(.92)}
/* photos: fade up with a gentle zoom-out on the image */
.mo .m-wipe:not(.in){opacity:0;transform:translateY(36px)}
.mo .m-wipe img{transition:transform 1.6s cubic-bezier(.16,1,.3,1);transition-delay:calc(var(--d,0) * 90ms)}
.mo .m-wipe:not(.in) img{transform:scale(1.15)}
/* fills: bars grow from the left */
.mo .m-fill{transform-origin:left center}
.mo .m-fill:not(.in){transform:scaleX(0)}
