/* reveal (from apps/lash-room/public/assets/site.css, 24.10.2026). Tune a site by overriding these tokens in its
   own CSS, not by editing the rules. */
:root {
  --m-ease: cubic-bezier(.165, .84, .44, 1);   /* a long, soft landing */
  --m-mask: cubic-bezier(.77, 0, .175, 1);     /* mask frames: slow start and end */
  --m-y: clamp(44px, 6vw, 90px);               /* how far data-m="up" rises */
  --m-dur: 1.4s;                               /* reveal length */
}

/* Hidden states only under html.js (boot) and never under html.m-off (reveal.js started late). Until reveal.js has
   started (html.m-on), a failsafe shows everything after 3s, so a script that never runs can't leave the page blank.
   Transitions live on .m-in only, so a replayed section jumps back to its start state instead of animating backwards.
   The @media wrapper keeps these rules out of very old browsers. */
@media (min-width: 0px) {
  .js:not(.m-off) [data-m]:not([data-m="mask"]):not(.m-in) { opacity: 0; }
  .js:not(.m-off) [data-m="up"]:not(.m-in) { transform: translate3d(0, var(--m-y), 0); }
  .js:not(.m-off) [data-m="scale"]:not(.m-in) :is(img, video, .ph) { transform: scale(1.2); }
  .js:not(.m-off) [data-m="mask"]:not(.m-in) .mk__a { transform: translate3d(0, 100%, 0); }
  .js:not(.m-off) [data-m="mask"]:not(.m-in) .mk__b { transform: translate3d(0, -100%, 0); }
  .js:not(.m-off) [data-m="mask"]:not(.m-in) .mk__b :is(img, video, .ph) { transform: scale(1.6); }
  .js:not(.m-on):not(.m-off) :is([data-m], [data-m] img, [data-m] video, [data-m] .ph, .mk__a, .mk__b) {
    animation: m-show 0s 3s forwards;
  }

  [data-m].m-in { transition: opacity var(--m-dur) var(--m-ease), transform var(--m-dur) var(--m-ease); transition-delay: calc(var(--d, 0) * 1s); }
  [data-m="fade"].m-in { transition-duration: 1s; }
  [data-m="scale"].m-in :is(img, video, .ph) { transition: transform var(--m-dur) var(--m-ease) calc(var(--d, 0) * 1s); }
  [data-m="mask"].m-in :is(.mk__a, .mk__b, .mk__b img, .mk__b video, .mk__b .ph) { transition: transform 1.6s var(--m-mask) calc(var(--d, 0) * 1s); }
  [data-m="lines"].m-in { transition: none; }
  [data-m="lines"].m-in .ln > span { animation: m-rise var(--m-dur) var(--m-ease) both; animation-delay: calc((var(--d, 0) + var(--i, 0) * .1) * 1s); }
}
@keyframes m-show { to { opacity: 1; transform: none; } }
@keyframes m-rise { from { transform: translate3d(0, 105%, 0); } to { transform: none; } }
/* data-m="scale" zooms the image inside a frame that doesn't move. */
[data-m="scale"] { overflow: hidden; }
/* Lines of a split heading: each clips its own rise (descender room so nothing is cut). */
.ln { display: block; overflow: hidden; padding-bottom: .14em; margin-bottom: -.14em; }
.ln > span { display: block; }
/* Mask frames: [data-m="mask"] > .mk__a > .mk__b > image. The frame slides in while the image stays put. The frame
   needs a size of its own (aspect-ratio or a height). */
[data-m="mask"] { position: relative; overflow: hidden; }
.mk__a, .mk__b { position: absolute; inset: 0; overflow: hidden; }
.mk__b > :is(img, video, .ph) { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; }
/* Loops (marquees, a spinning stamp) pause off screen. */
[data-m-loop].is-off, [data-m-loop].is-off * { animation-play-state: paused !important; }
