/* Marim motion kit: shared by tour sites and proposals. Rules taken from the code-built motion-design prompts
   in awesome-opus5-5-videos: springs without bounce, content swaps with a 12px blur and fade, one idea per move,
   motion is a pure function of time (?mo=end shows the finished state for QA). Gated on .mo-on so no-JS shows everything.
   Variants (data-mo): rise · blur · mask · draw · count. Parent data-mo-stagger="rise|blur" staggers its children. */
:root{--mo-ease:cubic-bezier(.22,1,.36,1);--mo-step:.08s}
.mo-on [data-mo]{opacity:0;transition:opacity .6s var(--mo-ease) var(--mo-d,0s),transform .9s var(--mo-ease) var(--mo-d,0s),filter .6s var(--mo-ease) var(--mo-d,0s),clip-path 1.1s var(--mo-ease) var(--mo-d,0s)}
.mo-on [data-mo=rise]{transform:translateY(22px)}
.mo-on [data-mo=blur]{filter:blur(12px);transform:translateY(8px)}
.mo-on [data-mo=mask]{opacity:1}
.mo-on [data-mo=mask] img{clip-path:inset(0 0 100% 0);transform:scale(1.08);transition:clip-path 1.1s var(--mo-ease) var(--mo-d,0s),transform 1.4s var(--mo-ease) var(--mo-d,0s)}
.mo-on [data-mo=count]{opacity:1;font-variant-numeric:tabular-nums}
.mo-on [data-mo].mo-in{opacity:1;transform:none;filter:none;clip-path:inset(0 0 0 0)}
.mo-on [data-mo=mask].mo-in img{clip-path:inset(0 0 0 0);transform:none}
/* draw: SVG paths trace themselves (pathLength is normalised to 1 by the script) */
.mo-on [data-mo=draw]{opacity:1}
.mo-on [data-mo=draw] .mo-p{stroke-dasharray:1;stroke-dashoffset:1;transition:stroke-dashoffset 1s var(--mo-ease) calc(var(--mo-d,0s) + .15s)}
.mo-on [data-mo=draw].mo-in .mo-p{stroke-dashoffset:0}
@media(prefers-reduced-motion:reduce){
  .mo-on [data-mo],.mo-on [data-mo] img,.mo-on [data-mo] .mo-p{opacity:1!important;transform:none!important;filter:none!important;clip-path:none!important;stroke-dashoffset:0!important;transition:none!important}
}
