/* v29 · site motion, restrained (Apple / design-engineering standards): transform + opacity only, strong ease-out,
   entrances ≤ 700 ms with 50 ms stagger, press feedback on pointer-down, no infinite loops on UI (the only loops are the
   narrative ones inside the illustrations: bridge lights, map planes). Gated by html.m-js (set by motion.js, never under
   prefers-reduced-motion) — without JS the page is complete and still. */
:root{--m-out:cubic-bezier(.23,1,.32,1);--m-io:cubic-bezier(.77,0,.175,1)}

/* chrome: progress line (linear by nature) + header material once scrolled */
.m-js #m-progress{position:fixed;z-index:60;left:0;top:0;height:2px;width:100%;transform-origin:0 50%;transform:scaleX(0);background:var(--s9-grad,linear-gradient(90deg,#ef427f,#f28b4a 45%,#2277e6));pointer-events:none}
.m-js .header{transition:box-shadow .3s var(--m-out),background-color .3s var(--m-out)}
.m-js.m-scrolled .header{box-shadow:0 8px 24px -18px rgba(16,24,40,.35);background-color:rgba(245,245,247,.86)!important;backdrop-filter:saturate(1.6) blur(16px);-webkit-backdrop-filter:saturate(1.6) blur(16px)}
@media (prefers-reduced-transparency:reduce){.m-js.m-scrolled .header{background-color:#f5f5f7!important;backdrop-filter:none;-webkit-backdrop-filter:none}}

/* entrances: panels rise 16 px, items stagger 50 ms — once, then static */
.m-js .m-panel{opacity:0;transform:translate3d(0,12px,0);transition:opacity .45s var(--m-out),transform .5s var(--m-out)}
.m-js .m-panel.m-in{opacity:1;transform:none}
.m-js .m-rise{opacity:0;transform:translate3d(0,10px,0);transition:opacity .4s var(--m-out) .04s,transform .45s var(--m-out) .04s}
.m-js .m-rise.m-in{opacity:1;transform:none}
.m-js .m-item{opacity:0;transform:translate3d(0,12px,0) scale(.985);transition:opacity .4s var(--m-out),transform .45s var(--m-out);transition-delay:calc(var(--m-i,0) * 50ms)}
.m-js .m-item.m-in{opacity:1;transform:none}
/* the hero title: one entrance on load, from a visible state (never from nothing) */
.m-js #hero-title{animation:m-title .5s var(--m-out) both}
@keyframes m-title{from{opacity:0;transform:translate3d(0,14px,0)}to{opacity:1;transform:none}}

/* illustrations and the bridge play only while on screen */
.m-js .v28-art:not(.m-live) *,.m-js .bridge:not(.m-live) *{animation-play-state:paused!important}

/* press feedback: instant, on pointer-down, 120 ms */
.m-js :is(.button,.v8-whatsapp,.v17-header-instagram,.v16-lang-trigger,.v9-price-text-link,.s9-link,.s9-row,[data-v13-next],[data-v13-prev],[data-v9-next],[data-v9-prev]){transition:transform .12s var(--m-out),box-shadow .2s var(--m-out)}
.m-js :is(.button,.v8-whatsapp,.v17-header-instagram,.v16-lang-trigger,[data-v13-next],[data-v13-prev],[data-v9-next],[data-v9-prev]):active{transform:scale(.97)}
@media (hover:hover) and (pointer:fine){
  .m-js :is(.button,.v8-whatsapp,.v17-header-instagram):hover{transform:translateY(-1px);box-shadow:0 10px 22px -14px rgba(16,24,40,.4)}
}

/* v29.5 · the «117» block is a div.button but not a control: it must not lift or press */
.m-js .v9-hero-price,.m-js .v9-hero-price:hover,.m-js .v9-hero-price:active{transform:none!important}


/* v33 · card reveal (port of the brazilpasport.com home «v14 reveal», hub.css): set up by motion.js (.rv-card/.rv-art/.rv-txt,
   --rd stagger by position, --ci order inside the card). The rules apply only until .is-settled, so the cards' own hover and
   press transitions come back after the entrance. Without JS / with reduced motion nothing here applies (no html.m-js). */
.m-js .rv-card:not(.is-settled){transition:opacity .7s var(--m-out) var(--rd,0s),transform 1s cubic-bezier(.2,.85,.25,1) var(--rd,0s),filter .8s var(--m-out) var(--rd,0s)}
.m-js .rv-card:not(.is-in){opacity:0;transform:perspective(900px) translate3d(0,54px,0) rotateX(12deg) scale(.95);filter:blur(8px)}
.m-js .rv-card:not(.is-settled) .rv-art{transition:transform 1.1s cubic-bezier(.34,1.56,.64,1) calc(var(--rd,0s) + .22s),opacity .5s var(--m-out) calc(var(--rd,0s) + .22s)}
.m-js .rv-card:not(.is-in) .rv-art{opacity:0;transform:scale(.62) translate3d(0,26px,0) rotate(-4deg)}
.m-js .rv-card:not(.is-settled)>.rv-txt{transition:opacity .55s var(--m-out) calc(var(--rd,0s) + .2s + var(--ci,0) * 80ms),transform .7s cubic-bezier(.2,.85,.25,1) calc(var(--rd,0s) + .2s + var(--ci,0) * 80ms)}
.m-js .rv-card:not(.is-in)>.rv-txt{opacity:0;transform:translate3d(0,14px,0)}
@media (max-width:700px){.m-js .rv-card:not(.is-in){filter:blur(5px)}}

@media (prefers-reduced-motion:reduce){
  .m-js .rv-card,.m-js .rv-art,.m-js .rv-txt{opacity:1;transform:none;filter:none;transition:none}
  .m-js .m-panel,.m-js .m-rise,.m-js .m-item{opacity:1;transform:none;transition:none}
  .m-js #hero-title{animation:none}
  .m-js .v28-art *,.m-js .bridge *{animation:none!important}
}
