/* Shared motion + interaction layer — JIPSI concepts
   Everything degrades to "already visible" if JS never runs, and everything
   switches off under prefers-reduced-motion. */

/* Only hide content once JS has confirmed it will reveal it. */
html.m-ready [data-reveal]{opacity:0;will-change:opacity,transform}
html.m-ready [data-reveal="up"]{transform:translate3d(0,22px,0)}
html.m-ready [data-reveal="fade"]{transform:none}
html.m-ready [data-reveal="left"]{transform:translate3d(-26px,0,0)}
html.m-ready [data-reveal="right"]{transform:translate3d(26px,0,0)}
html.m-ready [data-reveal="scale"]{transform:scale(.965)}

html.m-ready [data-reveal].m-in{
  opacity:1;transform:none;
  transition:opacity .72s cubic-bezier(.22,.61,.24,1),transform .82s cubic-bezier(.22,.61,.24,1);
  transition-delay:var(--m-d,0ms)}

/* Image reveal: the frame wipes open, the picture settles from a slight push-in. */
.m-frame{overflow:hidden}
html.m-ready .m-frame>img{transform:scale(1.07);transition:transform 1.25s cubic-bezier(.22,.61,.24,1)}
html.m-ready .m-frame.m-in>img{transform:scale(1)}

/* Headline: lines rise behind a mask. */
/* padding+negative margin keeps descenders out of the mask without moving the line */
.m-line{display:block;overflow:hidden;padding-bottom:.14em;margin-bottom:-.14em}
.m-line>span{display:block}
html.m-ready .m-line>span{transform:translate3d(0,102%,0);
  transition:transform .95s cubic-bezier(.19,.66,.21,1);transition-delay:var(--m-d,0ms)}
html.m-ready .m-line.m-in>span,html.m-ready .m-in>.m-line>span{transform:none}

/* Sticky header state */
[data-header]{transition:background-color .34s ease,box-shadow .34s ease,transform .34s ease,border-color .34s ease}

/* Marquee */
.m-marquee{overflow:hidden;position:relative;display:flex}
.m-marquee__t{display:flex;flex:0 0 auto;align-items:center;
  animation:m-scroll var(--m-speed,42s) linear infinite}
.m-marquee:hover .m-marquee__t{animation-play-state:paused}
@keyframes m-scroll{from{transform:translate3d(0,0,0)}to{transform:translate3d(-100%,0,0)}}

/* Accordion */
[data-acc-panel]{overflow:hidden;height:0;transition:height .42s cubic-bezier(.22,.61,.24,1)}
[data-acc-btn] [data-acc-ico]{transition:transform .34s cubic-bezier(.22,.61,.24,1)}
[data-acc-btn][aria-expanded="true"] [data-acc-ico]{transform:rotate(45deg)}

/* Generic pressable feedback */
.m-press{transition:transform .16s ease}
.m-press:active{transform:scale(.975)}

/* Link underline sweep */
.m-ul{background-image:linear-gradient(currentColor,currentColor);
  background-size:0 1px;background-repeat:no-repeat;background-position:0 100%;
  transition:background-size .38s cubic-bezier(.22,.61,.24,1)}
.m-ul:hover{background-size:100% 1px}

/* Drag-scroll affordance */
.m-drag{cursor:grab}
.m-drag.is-drag{cursor:grabbing;scroll-snap-type:none}
.m-drag.is-drag *{pointer-events:none}

@media(prefers-reduced-motion:reduce){
  html.m-ready [data-reveal],
  html.m-ready [data-reveal].m-in{opacity:1!important;transform:none!important;transition:none!important}
  html.m-ready .m-frame>img,html.m-ready .m-line>span{transform:none!important;transition:none!important}
  .m-marquee__t{animation:none!important}
  [data-acc-panel]{transition:none!important}
}
