/* =======================================================================
   SDN TRIP — SEI DE NADA EXCURSÕES
   Bio link cósmico · mobile first · CSS puro (sem frameworks)
   ======================================================================= */

/* ---------------------------------------------------------- 1. RESET */
*,*::before,*::after{box-sizing:border-box}
*{margin:0;padding:0}
html{
  -webkit-text-size-adjust:100%;
  scroll-behavior:smooth;
  /* NÃO colocar overflow-x aqui: isso faz o <html> parar de propagar o
     scroll para o viewport — window.scrollY congela em 0, o evento
     'scroll' não dispara e o parallaxe/entrada dos elementos morre.
     O corte horizontal fica só no <body>, logo abaixo.                   */
}
body{
  min-height:100%;
  /* 'hidden' é o fallback; 'clip' vence onde existe e corta o excesso
     horizontal SEM transformar o body em container de scroll             */
  overflow-x:hidden;
  overflow-x:clip;
  background:var(--bg-0);
  color:var(--ink);
  font-family:var(--font-ui);
  font-size:1rem;
  line-height:1.5;
  text-rendering:optimizeLegibility;
  -webkit-font-smoothing:antialiased;
  -moz-osx-font-smoothing:grayscale;
  -webkit-tap-highlight-color:transparent;
  overscroll-behavior-y:none;
}
img,svg,video,picture{display:block;max-width:100%}
a{color:inherit;text-decoration:none;-webkit-touch-callout:none}
button,a{font:inherit}
.sr-svg{position:absolute;width:0;height:0;overflow:hidden}

/* ---------------------------------------------------------- 2. TOKENS */
:root{
  /* profundidade do cosmos */
  --bg-0:#05050A;
  --bg-1:#080612;
  --bg-2:#0B0714;

  /* tinta */
  --ink:#F4EFFF;
  --ink-dim:#AEA3CE;
  --ink-mute:#948AB4;

  /* néon */
  --violet:#8B5CF6;   --violet-rgb:139,92,246;
  --magenta:#FF2FD0;  --magenta-rgb:255,47,208;
  --cyan:#22E0FF;     --cyan-rgb:34,224,255;
  --blue:#3B6BFF;     --blue-rgb:59,107,255;
  --green:#4DFF9F;    --green-rgb:77,255,159;
  --gold:#FFC94D;     --gold-rgb:255,201,77;
  --orange:#FF7A2F;   --orange-rgb:255,122,47;

  /* tipografia */
  --font-display:"Unbounded","Trebuchet MS","Helvetica Neue",Arial,sans-serif;
  --font-ui:"Chakra Petch","Avenir Next","Segoe UI",Roboto,Helvetica,Arial,sans-serif;

  /* ritmo */
  --pad:clamp(18px,5vw,28px);
  --wrap:min(100% - var(--pad) * 2, 560px);
  --r-card:26px;
  --ease:cubic-bezier(.16,.84,.3,1);
}

/* ---------------------------------------------------------- 3. COSMOS */
.cosmos{
  position:fixed;
  inset:0;
  z-index:-1;
  overflow:hidden;
  pointer-events:none;
  background:
    radial-gradient(130% 70% at 50% -10%, #120A24 0%, transparent 62%),
    radial-gradient(100% 60% at 50% 108%, #0C0620 0%, transparent 60%),
    linear-gradient(180deg, var(--bg-0) 0%, var(--bg-1) 38%, var(--bg-2) 72%, var(--bg-0) 100%);
}

/* --- estrelas: 3 camadas em parallaxe lenta (tiles que repetem) --- */
.cosmos__stars{
  position:absolute;
  inset:-30% -20%;
  background-repeat:repeat;
  will-change:transform;
  transform:translate3d(0,0,0);
}
.cosmos__stars--far{
  opacity:.55;
  background-size:230px 230px;
  background-image:
    radial-gradient(1px 1px at 18px 34px,  rgba(255,255,255,.75), transparent),
    radial-gradient(1px 1px at 96px 12px,  rgba(200,225,255,.55), transparent),
    radial-gradient(1px 1px at 150px 80px, rgba(255,255,255,.6),  transparent),
    radial-gradient(1px 1px at 52px 140px, rgba(255,215,255,.5),  transparent),
    radial-gradient(1px 1px at 200px 178px,rgba(255,255,255,.55), transparent),
    radial-gradient(1px 1px at 124px 205px,rgba(190,235,255,.5),  transparent),
    radial-gradient(1px 1px at 8px 195px,  rgba(255,255,255,.4),  transparent);
  animation:drift-far 210s linear infinite;
}
.cosmos__stars--mid{
  opacity:.7;
  background-size:310px 310px;
  background-image:
    radial-gradient(1.4px 1.4px at 40px 60px,   rgba(255,255,255,.95), transparent),
    radial-gradient(1.4px 1.4px at 230px 40px,  rgba(160,230,255,.8),  transparent),
    radial-gradient(1.4px 1.4px at 140px 175px, rgba(255,175,240,.75), transparent),
    radial-gradient(1.4px 1.4px at 285px 250px, rgba(255,255,255,.85), transparent),
    radial-gradient(1.4px 1.4px at 70px 268px,  rgba(200,255,225,.7),  transparent),
    radial-gradient(1.4px 1.4px at 190px 110px, rgba(255,255,255,.6),  transparent);
  animation:drift-mid 140s linear infinite;
}
.cosmos__stars--near{
  opacity:.9;
  background-size:460px 460px;
  background-image:
    radial-gradient(2px 2px at 80px 100px,  rgba(255,255,255,1),    transparent),
    radial-gradient(2px 2px at 360px 70px,  rgba(120,220,255,.9),   transparent),
    radial-gradient(2px 2px at 250px 330px, rgba(255,140,235,.85),  transparent),
    radial-gradient(2px 2px at 425px 410px, rgba(255,255,255,.9),   transparent),
    radial-gradient(1.6px 1.6px at 30px 400px, rgba(180,255,215,.8), transparent);
  animation:drift-near 95s linear infinite;
}
@keyframes drift-far  {to{transform:translate3d(-230px,-230px,0)}}
@keyframes drift-mid  {to{transform:translate3d(310px,-310px,0)}}
@keyframes drift-near {to{transform:translate3d(-460px,230px,0)}}

/* --- nebulosas: gradientes suaves respirando (sem filter → leve) --- */
.cosmos__nebula{
  position:absolute;
  border-radius:50%;
  will-change:transform,opacity;
  mix-blend-mode:screen;
}
.cosmos__nebula--violet{
  width:150vw;max-width:820px;aspect-ratio:1;
  top:-24vh;left:-38vw;
  background:radial-gradient(closest-side, rgba(var(--violet-rgb),.36), rgba(var(--violet-rgb),.1) 48%, transparent 72%);
  animation:breathe 26s ease-in-out infinite;
}
.cosmos__nebula--magenta{
  width:120vw;max-width:680px;aspect-ratio:1;
  top:16vh;right:-40vw;
  background:radial-gradient(closest-side, rgba(var(--magenta-rgb),.26), rgba(var(--magenta-rgb),.07) 46%, transparent 70%);
  animation:breathe 34s ease-in-out -8s infinite;
}
.cosmos__nebula--cyan{
  width:130vw;max-width:720px;aspect-ratio:1;
  top:58vh;left:-34vw;
  background:radial-gradient(closest-side, rgba(var(--cyan-rgb),.2), rgba(var(--cyan-rgb),.05) 45%, transparent 70%);
  animation:breathe 30s ease-in-out -16s infinite;
}
.cosmos__nebula--green{
  width:110vw;max-width:600px;aspect-ratio:1;
  bottom:-16vh;right:-28vw;
  background:radial-gradient(closest-side, rgba(var(--green-rgb),.16), rgba(var(--green-rgb),.04) 44%, transparent 70%);
  animation:breathe 40s ease-in-out -24s infinite;
}
@keyframes breathe{
  0%,100%{transform:translate3d(0,0,0) scale(1);opacity:.85}
  50%    {transform:translate3d(3%,-4%,0) scale(1.14);opacity:1}
}

.cosmos__vignette{
  position:absolute;inset:0;
  background:
    radial-gradient(110% 80% at 50% 34%, transparent 40%, rgba(0,0,0,.55) 82%, rgba(0,0,0,.82) 100%),
    linear-gradient(180deg, rgba(0,0,0,.42) 0%, transparent 18%, transparent 84%, rgba(0,0,0,.55) 100%);
}

/* ---------------------------------------------------------- 4. SHELL */
.shell{
  position:relative;
  width:100%;
  max-width:100%;
}

/* ---------------------------------------------------------- 5. HERO
   Vídeo em tela cheia. Sem card, sem moldura, sem border-radius:
   o vídeo É o fundo do hero.                                            */
.hero{
  position:relative;
  width:100%;
  min-height:100vh;
  min-height:100svh;
  overflow:hidden;
  isolation:isolate;
  display:flex;
  flex-direction:column;
  justify-content:flex-end;     /* conteúdo na região inferior */
  align-items:center;
  text-align:center;
  padding-bottom:calc(30px + env(safe-area-inset-bottom,0px));
}

.hero__bg{
  position:absolute;
  z-index:-2;
  left:0;
  /* Sem zoom aqui de propósito. O arquivo já é um recorte do original
     (860x1380 de 1288x1608): tirou a largura que o cover jogava fora e
     o rodapé "Established 2022". Ampliar de novo por CSS era o que
     borrava o vídeo — passava de 3,7x no iPhone. Agora fica em 2,3x.   */
  inset:0;
  width:100%;
  height:100%;
  object-fit:cover;
  /* 32% no eixo Y só age no desktop (onde sobra altura) e sobe o
     enquadramento para o rosto do mascote. No celular o vídeo encosta
     em cima e embaixo, então o eixo Y não tem efeito.                   */
  object-position:center 32%;
  pointer-events:none;
  background:#05050A;
}

/* overlay: quase nada em cima, escurece só na descida — o vídeo
   precisa continuar psicodélico no topo e legível embaixo            */
.hero__veil{
  position:absolute;
  inset:0;
  z-index:-1;
  pointer-events:none;
  background:linear-gradient(180deg,
    rgba(5,2,15,.05)  0%,
    rgba(5,2,15,.10) 28%,
    rgba(5,2,15,.20) 44%,
    rgba(5,2,15,.48) 58%,
    rgba(5,2,15,.78) 70%,
    rgba(7,3,15,.95) 82%,
    #07030F         92%,
    #07030F        100%);
}

.hero__content{
  width:var(--wrap);
  margin-inline:auto;
  display:flex;
  flex-direction:column;
  align-items:center;
}

.hero__title{
  font-family:var(--font-display);
  font-weight:800;
  font-size:clamp(2.6rem,13vw,4rem);
  line-height:.95;
  letter-spacing:-.01em;
  margin-bottom:12px;
}
.hero__title-text{
  position:relative;
  display:inline-block;
  background:linear-gradient(174deg,#FFFFFF 12%,#EFE5FF 50%,#C4ADFF 100%);
  -webkit-background-clip:text;
  background-clip:text;
  color:transparent;
  -webkit-text-fill-color:transparent;
  filter:
    drop-shadow(0 2px 10px rgba(0,0,0,.95))
    drop-shadow(0 4px 30px rgba(var(--violet-rgb),.6));
}
.hero__title-text::before,
.hero__title-text::after{   /* aberração cromática néon */
  content:attr(data-text);
  position:absolute;
  inset:0;
  z-index:-1;
  -webkit-text-fill-color:currentColor;
  mix-blend-mode:screen;
  pointer-events:none;
}
.hero__title-text::before{color:rgba(var(--magenta-rgb),.85);animation:ab-a 7s ease-in-out infinite}
.hero__title-text::after {color:rgba(var(--cyan-rgb),.8);animation:ab-b 7s ease-in-out infinite}
@keyframes ab-a{0%,100%{transform:translate(-2px,1px)}50%{transform:translate(-4px,-1px)}}
@keyframes ab-b{0%,100%{transform:translate(2px,-1px)}50%{transform:translate(4px,1px)}}

.hero__tagline{
  font-size:clamp(1rem,4.2vw,1.15rem);
  font-weight:600;
  color:#F4EEFF;
  letter-spacing:.012em;
  text-shadow:0 2px 14px rgba(0,0,0,.9), 0 0 26px rgba(var(--cyan-rgb),.35);
}

/* --- indicação de scroll: PRÓXIMA TRIP ↓ --- */
.scrollcue{
  margin-top:clamp(24px,6vw,34px);
  display:flex;
  flex-direction:column;
  align-items:center;
  gap:9px;
  padding:6px 18px 4px;
  opacity:.9;
  transition:opacity .3s var(--ease);
}
.scrollcue__label{
  font-size:.64rem;font-weight:700;
  letter-spacing:.34em;text-transform:uppercase;
  color:#CFC4EC;
  text-shadow:0 2px 10px rgba(0,0,0,.9);
}
.scrollcue__line{
  position:relative;
  width:1px;height:34px;
  background:linear-gradient(180deg,transparent,rgba(var(--cyan-rgb),.6),transparent);
  overflow:hidden;
}
.scrollcue__line i{
  position:absolute;
  left:-1.5px;
  width:4px;height:4px;
  border-radius:50%;
  background:var(--cyan);
  box-shadow:0 0 10px 2px rgba(var(--cyan-rgb),.9);
  animation:fall 2.4s cubic-bezier(.5,0,.5,1) infinite;
}
@keyframes fall{
  0%  {transform:translateY(-8px);opacity:0}
  25% {opacity:1}
  80% {opacity:1}
  100%{transform:translateY(36px);opacity:0}
}
.scrollcue__chev{
  width:9px;height:9px;
  border-right:1.6px solid rgba(var(--cyan-rgb),.85);
  border-bottom:1.6px solid rgba(var(--cyan-rgb),.85);
  transform:rotate(45deg);
  animation:nudge 2.4s ease-in-out infinite;
}
@keyframes nudge{0%,100%{transform:rotate(45deg) translate(0,0)}50%{transform:rotate(45deg) translate(3px,3px)}}

/* ------------------------------------- 5a. A VIAGEM COMEÇA (só o texto)
   Respiro narrativo entre o portal e os destinos. O ônibus não mora
   mais aqui: ele virou uma camada fixa que cruza o site inteiro (13).
   O topo continua o #07030F em que o hero termina e dissolve no cosmos,
   para não existir linha separando vídeo e site.                        */
/* A faixa ocupa a largura toda e o texto é que fica contido. Antes o
   degradê vinha de um ::before com width:100vw — e 100vw INCLUI a barra
   de rolagem, o que gerava ~8px de overflow horizontal no desktop.     */
.busway{
  position:relative;
  width:100%;
  text-align:center;
  padding:clamp(96px,26vw,170px) 0 clamp(80px,22vw,140px);
  background:linear-gradient(180deg,
    #07030F 0%, rgba(7,3,15,.72) 26%, rgba(7,3,15,.26) 56%, transparent 80%);
}
.busway__title,
.busway__sub{
  width:var(--wrap);
  margin-inline:auto;
}
.busway__title{
  font-family:var(--font-display);
  font-weight:800;
  font-size:clamp(1.02rem,4.6vw,1.5rem);
  line-height:1.25;
  letter-spacing:-.005em;
  text-transform:uppercase;
  color:#fff;
  text-shadow:0 0 30px rgba(var(--cyan-rgb),.45);
}
.busway__sub{
  margin-top:11px;
  font-size:.7rem;
  font-weight:600;
  letter-spacing:.3em;
  text-transform:uppercase;
  color:var(--ink-mute);
}

/* -------------------------------------------- 5b. GRUPO GERAL (COMUNIDADE)
   Deliberadamente diferente dos 4 portais de excursão: card horizontal,
   borda néon girando, halo pulsante e paleta da própria marca
   (violeta + ciano) em vez de uma cor por evento.                        */
.community{
  position:relative;
  isolation:isolate;
  width:var(--wrap);
  margin-inline:auto;
  padding:clamp(10px,3vw,18px) 0 clamp(2px,1vw,6px);
}
/* halo externo respirando — o que chama o olho para a comunidade */
.community::before{
  content:"";
  position:absolute;
  /* inset horizontal em px (não em %): em % ele cresce junto com a
     largura da seção e estoura a margem lateral em ~1024px, onde a
     margem é fixa em 24px. A pulsação também fica só no eixo Y.        */
  inset:-14% -10px;
  z-index:-1;
  pointer-events:none;
  background:
    radial-gradient(58% 62% at 30% 45%, rgba(var(--violet-rgb),.3), transparent 70%),
    radial-gradient(52% 58% at 78% 60%, rgba(var(--cyan-rgb),.17), transparent 72%);
  animation:hub-aura 8s ease-in-out infinite;
}
@keyframes hub-aura{
  0%,100%{opacity:.58;transform:scaleY(.96)}
  50%    {opacity:1;transform:scaleY(1.05)}
}

.hub{
  position:relative;
  display:block;
  border-radius:27px;
  border:1px solid rgba(var(--violet-rgb),.34);
  box-shadow:
    inset 0 1px 0 rgba(255,255,255,.1),
    0 24px 50px -24px rgba(0,0,0,.95),
    0 0 34px -12px rgba(var(--violet-rgb),.6);
  transform:translate3d(0,var(--ty,0px),0);
  transition:
    opacity .8s var(--ease),
    transform .45s var(--ease),
    box-shadow .45s var(--ease),
    border-color .45s var(--ease);
}

/* painel de vidro */
.hub__body{
  position:relative;
  z-index:1;
  overflow:hidden;
  border-radius:inherit;
  padding:17px 17px 19px;
  background:
    radial-gradient(120% 130% at 8% -10%, rgba(var(--violet-rgb),.26), transparent 62%),
    radial-gradient(95% 120% at 100% 110%, rgba(var(--cyan-rgb),.16), transparent 64%),
    linear-gradient(168deg, rgba(255,255,255,.1) 0%, rgba(255,255,255,.035) 55%, rgba(255,255,255,.065) 100%),
    rgba(10,7,22,.55);
}

/* partículas discretas dentro do card (tile que repete + translate: barato) */
.hub__dust{
  position:absolute;
  inset:-40% -20%;
  pointer-events:none;
  opacity:.5;
  background-size:190px 190px;
  background-image:
    radial-gradient(1.4px 1.4px at 24px 40px,   rgba(190,235,255,.9), transparent),
    radial-gradient(1.2px 1.2px at 140px 22px,  rgba(215,180,255,.8), transparent),
    radial-gradient(1.6px 1.6px at 92px 128px,  rgba(255,255,255,.75),transparent),
    radial-gradient(1.2px 1.2px at 168px 160px, rgba(150,225,255,.7), transparent),
    radial-gradient(1.3px 1.3px at 40px 172px,  rgba(230,200,255,.65),transparent);
  animation:hub-dust 46s linear infinite;
}
@keyframes hub-dust{to{transform:translate3d(190px,-190px,0)}}

/* borda néon girando — só onde o mask-composite existe; sem ele fica
   a borda estática + o glow, sem nenhum artefato visual */
.hub__ring{display:none}
@supports ((mask-composite:exclude) or (-webkit-mask-composite:xor)){
  .hub__ring{
    display:block;
    position:absolute;
    inset:0;
    z-index:2;
    border-radius:inherit;
    padding:1.6px;
    overflow:hidden;
    pointer-events:none;
    -webkit-mask:linear-gradient(#000,#000) content-box, linear-gradient(#000,#000);
            mask:linear-gradient(#000,#000) content-box, linear-gradient(#000,#000);
    -webkit-mask-composite:xor;
            mask-composite:exclude;
  }
  .hub__ring::before{
    content:"";
    position:absolute;
    top:50%;left:50%;
    width:170%;aspect-ratio:1;
    transform:translate(-50%,-50%);
    background:conic-gradient(from 0deg,
      rgba(var(--violet-rgb),.1), var(--violet), var(--cyan),
      rgba(var(--cyan-rgb),.12), var(--magenta), rgba(var(--violet-rgb),.1));
    animation:spin 14s linear infinite;
  }
}

/* badge */
.hub__badge{
  position:relative;
  display:inline-flex;
  align-items:center;
  gap:7px;
  padding:6px 12px 6px 10px;
  border-radius:999px;
  border:1px solid rgba(var(--cyan-rgb),.4);
  background:linear-gradient(135deg, rgba(var(--cyan-rgb),.18), rgba(var(--violet-rgb),.16));
  box-shadow:inset 0 1px 0 rgba(255,255,255,.14), 0 0 16px -6px rgba(var(--cyan-rgb),.7);
  font-size:.68rem;
  font-weight:700;
  letter-spacing:.18em;
  text-transform:uppercase;
  color:#EAF9FF;
}
.hub__badge i{
  width:6px;height:6px;
  border-radius:50%;
  background:var(--cyan);
  box-shadow:0 0 9px 2px rgba(var(--cyan-rgb),.9);
  animation:blip 2.6s ease-in-out infinite;
}
@keyframes blip{0%,100%{opacity:.45;transform:scale(.8)}50%{opacity:1;transform:scale(1.15)}}

/* ícone + títulos */
.hub__top{
  position:relative;
  display:flex;
  align-items:center;
  gap:14px;
  margin-top:15px;
}
.hub__icon{
  flex:0 0 auto;
  display:grid;
  place-items:center;
  width:58px;height:58px;
  border-radius:19px;
  color:#EAF2FF;
  border:1px solid rgba(255,255,255,.16);
  background:
    radial-gradient(closest-side at 50% 120%, rgba(var(--cyan-rgb),.4), transparent 72%),
    linear-gradient(150deg, rgba(var(--violet-rgb),.5), rgba(var(--blue-rgb),.28));
  box-shadow:
    inset 0 1px 0 rgba(255,255,255,.2),
    0 0 24px -8px rgba(var(--cyan-rgb),.85);
  animation:hub-ico 6s ease-in-out infinite;
}
@keyframes hub-ico{
  0%,100%{box-shadow:inset 0 1px 0 rgba(255,255,255,.2), 0 0 20px -10px rgba(var(--cyan-rgb),.7)}
  50%    {box-shadow:inset 0 1px 0 rgba(255,255,255,.2), 0 0 30px -6px rgba(var(--cyan-rgb),.95)}
}
.hub__head{display:flex;flex-direction:column;gap:5px;min-width:0}
.hub__eyebrow{
  font-size:.705rem;
  font-weight:600;
  letter-spacing:.2em;
  text-transform:uppercase;
  color:#A9E8FF;
}
.hub__title{
  font-family:var(--font-display);
  font-weight:800;
  font-size:clamp(1.3rem,6vw,1.62rem);
  line-height:1.05;
  letter-spacing:-.01em;
  text-transform:uppercase;
  color:#fff;
  text-shadow:0 0 26px rgba(var(--violet-rgb),.7);
}

.hub__desc{
  position:relative;
  margin-top:14px;
  font-size:.875rem;
  line-height:1.6;
  color:#C4BADF;
}

/* CTA */
.hub__cta{
  position:relative;
  display:flex;
  align-items:center;
  justify-content:center;
  gap:10px;
  margin-top:18px;
  min-height:58px;
  padding:0 16px;
  border-radius:16px;
  border:1px solid rgba(var(--cyan-rgb),.5);
  background:
    linear-gradient(135deg, rgba(var(--violet-rgb),.42) 0%, rgba(var(--cyan-rgb),.26) 100%),
    rgba(255,255,255,.03);
  box-shadow:
    inset 0 1px 0 rgba(255,255,255,.2),
    0 0 26px -8px rgba(var(--cyan-rgb),.75);
  color:#fff;
  font-size:.8rem;
  font-weight:700;
  letter-spacing:.17em;
  text-transform:uppercase;
  transition:background .4s var(--ease),box-shadow .4s var(--ease),border-color .4s var(--ease);
}
.hub__cta-ico{font-size:1.05rem;line-height:1;filter:drop-shadow(0 0 9px rgba(var(--cyan-rgb),.95))}
.hub__cta-txt{white-space:nowrap}
.hub__cta-arrow{
  width:7px;height:7px;
  border-top:1.6px solid currentColor;
  border-right:1.6px solid currentColor;
  transform:rotate(45deg);
  opacity:.85;
  transition:transform .4s var(--ease),opacity .4s var(--ease);
}

/* estados */
@media (hover:hover) and (pointer:fine){
  .hub:hover{
    --ty:-6px;
    border-color:rgba(var(--cyan-rgb),.55);
    box-shadow:
      inset 0 1px 0 rgba(255,255,255,.16),
      0 36px 64px -26px rgba(0,0,0,.95),
      0 0 70px -14px rgba(var(--violet-rgb),.85);
  }
  .hub:hover .hub__cta{
    border-color:rgba(var(--cyan-rgb),.9);
    background:linear-gradient(135deg, rgba(var(--violet-rgb),.68) 0%, rgba(var(--cyan-rgb),.45) 100%);
    box-shadow:inset 0 1px 0 rgba(255,255,255,.3), 0 0 40px -6px rgba(var(--cyan-rgb),.95);
  }
  .hub:hover .hub__cta-arrow{transform:rotate(45deg) translate(3px,-3px);opacity:1}
}
.hub:active{
  transform:translate3d(0,-2px,0) scale(.986);
  border-color:rgba(var(--cyan-rgb),.7);
  box-shadow:
    inset 0 1px 0 rgba(255,255,255,.16),
    0 12px 30px -18px rgba(0,0,0,.95),
    0 0 54px -12px rgba(var(--violet-rgb),.95);
}
.hub:active .hub__cta{
  background:linear-gradient(135deg, rgba(var(--violet-rgb),.64) 0%, rgba(var(--cyan-rgb),.42) 100%);
  border-color:rgba(var(--cyan-rgb),.85);
}
.hub:focus-visible{outline:2px solid var(--cyan);outline-offset:4px;border-radius:27px}

/* ------------------------------------------- 5c. TRAVESSIA DO ÔNIBUS
   Camada fixa por cima do site inteiro. O ônibus entra pelo topo à
   direita, cruza na diagonal e some na virada do hero para as viagens.
   Não é seção, não tem caixa, não ocupa espaço no layout.              */
/* O contêiner é um bloco ESTÁTICO de propósito, e quem é fixed são os
   filhos. Motivo: position:fixed sempre cria contexto de empilhamento, e
   contexto isola o mix-blend-mode — o preto do arquivo para de sumir e
   aparece um retângulo preto em volta do ônibus. Com o fixed no próprio
   vídeo, ele mistura com a página inteira, que é o que queremos.
   z-index e contain têm o mesmo efeito colateral: não usar aqui.
   A camada fica por cima de tudo por ser o último elemento posicionado
   do documento, depois do </main>.                                      */
.busride{
  display:block;
  height:0;
}

.busride__video{
  position:fixed;
  top:0;
  left:0;
  pointer-events:none;
  width:min(94vw,820px);
  aspect-ratio:3/2;
  object-fit:contain;
  /* o arquivo é MP4 (sem alpha) com fundo preto puro #000000:
     'screen' apaga o preto e deixa as cores do ônibus intactas          */
  mix-blend-mode:screen;
  /* Nos primeiros quadros o ônibus preenche o vídeo de ponta a ponta, e
     aí a borda do <video> aparece como um retângulo duro. A máscara
     dissolve as bordas, então o ônibus entra e sai sem contorno.        */
  -webkit-mask-image:radial-gradient(closest-side ellipse at 50% 50%, #000 84%, transparent 100%);
          mask-image:radial-gradient(closest-side ellipse at 50% 50%, #000 84%, transparent 100%);
  opacity:0;
  transform:translate3d(92vw,-85vh,0) scale(.85);
}
.busride.is-crossing .busride__video{
  will-change:transform,opacity;
  animation:bus-cross 4.8s cubic-bezier(.4,.05,.6,.98) forwards;
}
/* A tela do celular é alta e estreita, então a diagonal é bem mais
   vertical que horizontal: com um percurso horizontal longo o ônibus
   passa quase todo o tempo cortado pelas laterais. Assim ele fica
   INTEIRO na tela no miolo do trajeto.                                 */
@keyframes bus-cross{
  0%   {opacity:0; transform:translate3d(56vw,-40vh,0) scale(.92)}
  7%   {opacity:1}
  92%  {opacity:1}
  100% {opacity:0; transform:translate3d(-44vw,104vh,0) scale(1.06)}
}

/* poeira psicodélica só durante a passagem */
.busride__dust{
  position:fixed;
  inset:-12%;
  pointer-events:none;
  opacity:0;
  transition:opacity 1s var(--ease);
  background-size:200px 200px;
  background-image:
    radial-gradient(1.6px 1.6px at 28px 44px,   rgba(var(--cyan-rgb),.9),    transparent),
    radial-gradient(1.4px 1.4px at 150px 26px,  rgba(var(--magenta-rgb),.8), transparent),
    radial-gradient(1.8px 1.8px at 96px 132px,  rgba(var(--green-rgb),.75),  transparent),
    radial-gradient(1.4px 1.4px at 176px 168px, rgba(var(--gold-rgb),.75),   transparent),
    radial-gradient(1.5px 1.5px at 44px 182px,  rgba(255,255,255,.7),        transparent);
  animation:dust 30s linear infinite;
  animation-play-state:paused;
}
@keyframes dust{to{transform:translate3d(-200px,-100px,0)}}
.busride.is-crossing .busride__dust{opacity:.55;animation-play-state:running}

/* ---------------------------------------------------------- 6. SEÇÃO VIAGENS */
.trips{
  position:relative;
  width:var(--wrap);
  margin-inline:auto;
  padding:clamp(18px,6vw,40px) 0 clamp(52px,13vw,84px);
  scroll-margin-top:0;
}
.trips__head{
  text-align:center;
  padding-bottom:clamp(26px,8vw,40px);
}
.trips__kicker{
  display:inline-flex;align-items:center;gap:12px;
  font-size:.6rem;font-weight:600;
  letter-spacing:.34em;text-transform:uppercase;
  color:var(--ink-mute);
  margin-bottom:16px;
}
.trips__kicker i{
  width:26px;height:1px;
  background:linear-gradient(90deg,transparent,rgba(var(--magenta-rgb),.8));
}
.trips__kicker i:last-child{transform:scaleX(-1)}

.trips__title{
  font-family:var(--font-display);
  font-weight:800;
  font-size:clamp(1.65rem,8.2vw,2.5rem);
  line-height:1.02;
  letter-spacing:-.01em;
  text-transform:uppercase;
  background:linear-gradient(100deg,#FFFFFF 0%,#FFD9F6 30%,#BFA6FF 60%,#8FE9FF 100%);
  -webkit-background-clip:text;background-clip:text;
  color:transparent;-webkit-text-fill-color:transparent;
  filter:drop-shadow(0 3px 20px rgba(var(--magenta-rgb),.3));
  margin-bottom:12px;
}
.trips__sub{
  font-size:.93rem;
  font-weight:500;
  color:var(--ink-dim);
}

/* ---------------------------------------------------------- 7. PORTAIS */
.portals{
  display:grid;
  gap:clamp(16px,4.5vw,22px);
}

.portal{
  --a:var(--violet);   --a-rgb:var(--violet-rgb);
  --b:var(--cyan);     --b-rgb:var(--cyan-rgb);
  position:relative;
  display:block;
  isolation:isolate;
  padding:15px 15px 17px;
  border-radius:var(--r-card);
  border:1px solid rgba(255,255,255,.085);
  background:
    radial-gradient(125% 85% at 50% -12%, rgba(var(--a-rgb),.17), transparent 68%),
    linear-gradient(178deg, rgba(255,255,255,.085) 0%, rgba(255,255,255,.035) 46%, rgba(255,255,255,.055) 100%),
    rgba(10,7,22,.55);
  box-shadow:
    inset 0 1px 0 rgba(255,255,255,.075),
    0 22px 46px -24px rgba(0,0,0,.95),
    0 0 26px -14px rgba(var(--a-rgb),.42);
  transition:
    opacity .8s var(--ease),
    transform .45s var(--ease),
    box-shadow .45s var(--ease),
    border-color .45s var(--ease);
  transform:translate3d(0,var(--ty,0px),0);
}
.portal[data-accent="aura"]     {--a:var(--magenta);--a-rgb:var(--magenta-rgb);--b:var(--cyan);  --b-rgb:var(--cyan-rgb)}
.portal[data-accent="arvore"]   {--a:var(--green);  --a-rgb:var(--green-rgb);  --b:var(--gold);  --b-rgb:var(--gold-rgb)}
.portal[data-accent="lock"]     {--a:var(--cyan);   --a-rgb:var(--cyan-rgb);   --b:var(--violet);--b-rgb:var(--violet-rgb)}
.portal[data-accent="reveillon"]{--a:var(--orange); --a-rgb:var(--orange-rgb); --b:var(--gold);  --b-rgb:var(--gold-rgb)}

/* filete de luz no topo do card */
.portal__edge{
  position:absolute;
  top:-1px;left:14%;right:14%;
  height:1px;
  background:linear-gradient(90deg,transparent,rgba(var(--a-rgb),.95),transparent);
  opacity:.6;
  transition:opacity .45s var(--ease),left .45s var(--ease),right .45s var(--ease);
}
.portal__num{
  position:absolute;
  top:13px;right:15px;
  z-index:3;
  font-size:.62rem;font-weight:700;
  letter-spacing:.16em;
  font-variant-numeric:tabular-nums;
  color:rgba(var(--a-rgb),.55);
  text-shadow:0 0 12px rgba(var(--a-rgb),.5);
}

/* --- janela do portal --- */
.portal__window{
  position:relative;
  aspect-ratio:3/2;             /* casa exatamente com a arte do Aura */
  border-radius:17px;
  overflow:hidden;
  display:grid;
  place-items:center;
  background:
    radial-gradient(85% 120% at 50% 118%, rgba(var(--a-rgb),.24), transparent 66%),
    radial-gradient(70% 100% at 50% -18%, rgba(var(--b-rgb),.16), transparent 62%),
    linear-gradient(180deg,#07060D,#050409);
  box-shadow:inset 0 0 0 1px rgba(255,255,255,.06), inset 0 -18px 40px -22px rgba(var(--a-rgb),.7);
}
.portal__geo{
  position:absolute;
  top:50%;left:50%;
  width:132%;aspect-ratio:1;
  transform:translate(-50%,-50%);
  color:rgba(255,255,255,.9);
  opacity:.055;
  animation:turn 260s linear infinite reverse;
}
.portal__glow{                   /* halo luminoso atrás da logo */
  position:absolute;
  top:50%;left:50%;
  width:78%;aspect-ratio:1;
  transform:translate(-50%,-50%);
  border-radius:50%;
  background:radial-gradient(closest-side, rgba(var(--a-rgb),.34), rgba(var(--b-rgb),.12) 55%, transparent 76%);
  animation:pulse 6.5s ease-in-out infinite;
  transition:opacity .45s var(--ease);
}
@keyframes pulse{
  0%,100%{opacity:.62;transform:translate(-50%,-50%) scale(.94)}
  50%    {opacity:1;transform:translate(-50%,-50%) scale(1.05)}
}

.portal__art{
  position:relative;
  z-index:2;
  transition:transform .55s var(--ease),filter .45s var(--ease);
}
/* arte panorâmica (Aura): preenche a janela inteira */
.portal__art--wide{
  width:100%;height:100%;
  object-fit:contain;
  filter:drop-shadow(0 6px 24px rgba(0,0,0,.8));
}
/* sigilo quadrado: medalhão sem nenhum corte da arte original */
.portal__art--sigil{
  width:clamp(116px,33vw,138px);
  height:clamp(116px,33vw,138px);
  border-radius:24px;
  object-fit:cover;
  box-shadow:
    0 0 0 1px rgba(255,255,255,.14),
    0 0 0 5px rgba(var(--a-rgb),.13),
    0 14px 34px -14px rgba(0,0,0,.95),
    0 0 30px -6px rgba(var(--a-rgb),.55);
}

/* --- textos do card --- */
.portal__name{
  font-family:var(--font-display);
  font-weight:600;
  font-size:clamp(1.02rem,4.6vw,1.22rem);
  line-height:1.15;
  letter-spacing:-.005em;
  text-transform:uppercase;
  color:#FFFFFF;
  margin:16px 4px 5px;
  text-shadow:0 0 24px rgba(var(--a-rgb),.42);
}
.portal__meta{
  margin:0 4px 15px;
  font-size:.68rem;
  font-weight:600;
  letter-spacing:.19em;
  text-transform:uppercase;
  color:var(--ink-mute);
}

/* --- CTA --- */
.portal__cta{
  display:flex;
  align-items:center;
  justify-content:center;
  gap:10px;
  min-height:54px;
  padding:0 16px;
  border-radius:15px;
  border:1px solid rgba(var(--a-rgb),.45);
  background:
    linear-gradient(135deg, rgba(var(--a-rgb),.26) 0%, rgba(var(--b-rgb),.15) 100%),
    rgba(255,255,255,.02);
  box-shadow:
    inset 0 1px 0 rgba(255,255,255,.16),
    0 0 22px -8px rgba(var(--a-rgb),.65);
  color:#FFFFFF;
  font-size:.775rem;
  font-weight:700;
  letter-spacing:.17em;
  text-transform:uppercase;
  transition:background .4s var(--ease),box-shadow .4s var(--ease),border-color .4s var(--ease);
}
.portal__cta-ico{font-size:1rem;line-height:1;filter:drop-shadow(0 0 8px rgba(var(--a-rgb),.9))}
.portal__cta-txt{white-space:nowrap}
.portal__cta-arrow{
  width:7px;height:7px;
  border-top:1.6px solid currentColor;
  border-right:1.6px solid currentColor;
  transform:rotate(45deg);
  opacity:.8;
  transition:transform .4s var(--ease),opacity .4s var(--ease);
}

/* --- estados: desktop --- */
@media (hover:hover) and (pointer:fine){
  .portal{
    transform:
      perspective(900px)
      rotateX(calc(var(--ry,0) * 1deg))
      rotateY(calc(var(--rx,0) * 1deg))
      translateY(var(--ty,0px));
  }
  .portal:hover{
    --ty:-7px;
    border-color:rgba(var(--a-rgb),.42);
    box-shadow:
      inset 0 1px 0 rgba(255,255,255,.14),
      0 34px 60px -26px rgba(0,0,0,.95),
      0 0 60px -14px rgba(var(--a-rgb),.72);
  }
  .portal:hover .portal__edge{opacity:1;left:4%;right:4%}
  .portal:hover .portal__glow{opacity:1}
  .portal:hover .portal__art--sigil{transform:scale(1.045)}
  .portal:hover .portal__art--wide{transform:scale(1.035)}
  .portal:hover .portal__cta{
    border-color:rgba(var(--a-rgb),.85);
    background:linear-gradient(135deg, rgba(var(--a-rgb),.5) 0%, rgba(var(--b-rgb),.32) 100%);
    box-shadow:inset 0 1px 0 rgba(255,255,255,.26), 0 0 34px -6px rgba(var(--a-rgb),.85);
  }
  .portal:hover .portal__cta-arrow{transform:rotate(45deg) translate(3px,-3px);opacity:1}
  .scrollcue:hover{opacity:1}
}

/* --- estados: toque --- */
.portal:active{
  --ty:-2px;
  transform:translate3d(0,-2px,0) scale(.984);
  border-color:rgba(var(--a-rgb),.55);
  box-shadow:
    inset 0 1px 0 rgba(255,255,255,.14),
    0 12px 28px -18px rgba(0,0,0,.95),
    0 0 46px -12px rgba(var(--a-rgb),.8);
}
.portal:active .portal__cta{
  background:linear-gradient(135deg, rgba(var(--a-rgb),.48) 0%, rgba(var(--b-rgb),.3) 100%);
  border-color:rgba(var(--a-rgb),.8);
}
.portal:active .portal__glow{opacity:1}

/* --- acessibilidade de foco --- */
.portal:focus-visible,
.foot__ig:focus-visible,
.scrollcue:focus-visible{
  outline:2px solid var(--cyan);
  outline-offset:4px;
  border-radius:var(--r-card);
}

/* ---------------------------------------------------------- 8. RODAPÉ */
.foot{
  position:relative;
  width:var(--wrap);
  margin-inline:auto;
  padding:clamp(34px,9vw,52px) 0 calc(38px + env(safe-area-inset-bottom,0px));
  text-align:center;
}
.foot__rule{
  position:absolute;
  top:0;left:8%;right:8%;
  height:1px;
  background:linear-gradient(90deg,transparent,rgba(var(--violet-rgb),.7) 35%,rgba(var(--cyan-rgb),.7) 65%,transparent);
  opacity:.55;
}
.foot__brand{
  font-family:var(--font-display);
  font-weight:800;
  font-size:1.32rem;
  letter-spacing:.02em;
  text-transform:uppercase;
  color:#fff;
  text-shadow:0 0 26px rgba(var(--violet-rgb),.6);
}
.foot__sub{
  margin-top:6px;
  font-size:.63rem;font-weight:600;
  letter-spacing:.3em;text-transform:uppercase;
  color:var(--ink-mute);
}
.foot__tag{
  margin-top:16px;
  font-size:.85rem;font-weight:500;
  color:var(--ink-dim);
}
.foot__ig{
  display:inline-flex;align-items:center;gap:9px;
  margin-top:22px;
  padding:12px 20px;
  min-height:46px;
  border-radius:999px;
  border:1px solid rgba(255,255,255,.12);
  background:linear-gradient(135deg,rgba(var(--magenta-rgb),.18),rgba(var(--violet-rgb),.14));
  box-shadow:inset 0 1px 0 rgba(255,255,255,.12),0 0 22px -10px rgba(var(--magenta-rgb),.7);
  font-size:.8rem;font-weight:600;letter-spacing:.06em;
  color:#fff;
  transition:transform .4s var(--ease),box-shadow .4s var(--ease),border-color .4s var(--ease);
}
.foot__ig:hover,.foot__ig:active{
  border-color:rgba(var(--magenta-rgb),.6);
  box-shadow:inset 0 1px 0 rgba(255,255,255,.2),0 0 34px -8px rgba(var(--magenta-rgb),.9);
  transform:translateY(-2px);
}
.foot__copy{
  margin-top:26px;
  font-size:.68rem;
  letter-spacing:.14em;
  color:#7B73A0;
}

/* ---------------------------------------------------------- 9. REVEAL */
.js .reveal{
  opacity:0;
  transform:translate3d(0,24px,0);
  transition:opacity .8s var(--ease),transform .8s var(--ease);
  transition-delay:var(--d,0ms);
}
.js .reveal.is-in{opacity:1;transform:none}


/* Cards (os 4 portais + a comunidade).
   Aqui o transform pertence ao hover / tilt / :active, NÃO à entrada:
   a regra genérica .reveal.is-in{transform:none} tem especificidade maior
   que .portal:hover e, se vencesse, deixaria o hover e o toque sem efeito.
   Por isso a entrada desses cards é só opacidade, e o deslocamento passa
   pela variável --ty, que hover e :active reescrevem.                    */
.js .portal.reveal,
.js .hub.reveal{
  opacity:0;
  transform:translate3d(0,var(--ty,0px),0);
  transition:
    opacity .8s var(--ease),
    transform .45s var(--ease),
    box-shadow .45s var(--ease),
    border-color .45s var(--ease);
  transition-delay:var(--d,0ms);
}
.js .portal.reveal.is-in,
.js .hub.reveal.is-in{
  opacity:1;
  transform:translate3d(0,var(--ty,0px),0);
}

/* tilt do mouse precisa vencer as duas regras acima */
@media (hover:hover) and (pointer:fine){
  .js .portal.reveal,
  .js .portal.reveal.is-in{
    transform:
      perspective(900px)
      rotateX(calc(var(--ry,0) * 1deg))
      rotateY(calc(var(--rx,0) * 1deg))
      translateY(var(--ty,0px));
  }
}

/* e o toque precisa vencer o tilt */
.js .portal.reveal:active,
.js .hub.reveal:active{transform:translate3d(0,-2px,0) scale(.986)}

.js .foot__ig.reveal{
  transition:
    opacity .8s var(--ease),
    transform .4s var(--ease),
    box-shadow .4s var(--ease),
    border-color .4s var(--ease);
  transition-delay:var(--d,0ms);
}

/* ---------------------------------------------------------- 10. TABLET */
@media (min-width:600px){
  :root{--wrap:min(100% - var(--pad) * 2, 620px)}
}
/* ainda em coluna única: limita a largura do card para a janela 3:2
   não virar um retângulo gigante com o medalhão perdido no meio */
@media (min-width:600px) and (max-width:859px){
  .portals{max-width:470px;margin-inline:auto}
  .hub{max-width:560px;margin-inline:auto}
}

/* ---------------------------------------------------------- 11. DESKTOP */
@media (min-width:860px){
  :root{--wrap:min(100% - 48px, 1020px);--r-card:28px}

  .hero__title{font-size:clamp(3.6rem,6vw,5.2rem)}
  .hero__tagline{font-size:1.25rem}
  /* desktop: a faixa fica mais horizontal e o ônibus atravessa a largura */
  .busway__title{font-size:1.6rem}
  .busway__sub{font-size:.76rem}

  .trips{padding-top:20px}
  .trips__title{font-size:clamp(2.4rem,3.6vw,3.2rem)}
  .trips__sub{font-size:1.05rem}

  /* Grupo Geral vira uma faixa horizontal: identidade à esquerda,
     CTA à direita — silhueta oposta à grade 2x2 das excursões.        */
  .hub__body{
    display:grid;
    grid-template-columns:minmax(0,1fr) minmax(268px,320px);
    grid-template-areas:
      "badge cta"
      "top   cta"
      "desc  cta";
    align-items:center;
    column-gap:clamp(28px,4vw,56px);
    padding:28px clamp(28px,3vw,38px) 30px;
  }
  .hub__badge{grid-area:badge;justify-self:start}
  .hub__top  {grid-area:top;margin-top:18px;gap:18px}
  .hub__desc {grid-area:desc;max-width:none;margin-top:14px}
  .hub__cta  {grid-area:cta;margin-top:0;min-height:66px;font-size:.84rem}
  .hub__icon {width:72px;height:72px;border-radius:23px}
  .hub__icon svg{width:33px;height:33px}
  .hub__eyebrow{font-size:.775rem}
  .hub__title{font-size:2.05rem}
  .hub__desc {font-size:1rem;line-height:1.55}

  .portals{
    grid-template-columns:repeat(2,minmax(0,1fr));
    gap:28px;
  }
  .portal{padding:18px 18px 20px}
  .portal__art--sigil{width:176px;height:176px;border-radius:34px}
  .portal__name{font-size:1.3rem;margin-top:20px}
  .portal__cta{min-height:56px;font-size:.8rem}

  .foot__brand{font-size:1.6rem}
}

@media (min-width:1280px){
  :root{--wrap:min(100% - 64px, 1120px)}
  .portals{gap:32px}
}

/* --------------------------------------------- 12. MOVIMENTO REDUZIDO */
@media (prefers-reduced-motion:reduce){
  html{scroll-behavior:auto}
  *,*::before,*::after{
    animation-duration:.001ms !important;
    animation-iteration-count:1 !important;
    transition-duration:.001ms !important;
  }
  .js .reveal{opacity:1 !important;transform:none !important;filter:none !important}
  .scrollcue__line i{display:none}
  .busride{display:none}
  .cosmos__nebula{opacity:.9}
}

/* --------------------------------------------- 13. AJUSTES FINOS */
/* telas curtas (ex.: 360x640) — o hero não pode cortar o CTA de scroll */
@media (max-height:700px) and (max-width:600px){
  .hero__title{font-size:2.5rem}
  .scrollcue{margin-top:16px}
  .scrollcue__line{height:24px}
}

