/* ==========================================================================
   SAMI Sistemas — Base
   Reset, tipografia global e componentes compartilhados entre as páginas
   (header, footer, botões, container).
   ========================================================================== */

*,
*::before,
*::after {
  box-sizing: border-box;
  margin: 0;
  padding: 0;
}

html {
  font-size: 16px;
  scroll-behavior: smooth;
  /* Compensa o header fixo ao navegar por âncoras (#contato, #fintech...) */
  scroll-padding-top: var(--altura-header-compacta);
  /* clip, não hidden (mesmo motivo do body abaixo): sem isso aqui, o
     <html> — não o <body> — é o elemento de rolagem real do documento em
     modo padrão, e elementos position:fixed (ex.: .header) se posicionam
     relativos à viewport, ignorando qualquer overflow definido só no
     body. Bastava 1px de estouro horizontal em algo assim pra mobile
     mostrar aquele "elástico" de arrastar a página pro lado e voltar. */
  overflow-x: clip;
}

body {
  font-family: var(--fonte-principal);
  font-size: var(--texto-base);
  font-weight: var(--peso-regular);
  line-height: var(--altura-linha-texto);
  color: var(--cor-texto);
  background-color: var(--cor-fundo);
  -webkit-font-smoothing: antialiased;
  /* clip, não hidden: hidden faz o body virar um scroll container (via
     propagação pro root) e isso quebra position:sticky em qualquer
     descendente da página inteira — é o caso do carrossel do Payhub
     (payhub.css), que sem isso nunca "gruda" no topo. clip corta a
     mesma coisa sem criar esse contexto de scroll. */
  overflow-x: clip;
}

img {
  max-width: 100%;
  display: block;
}

a {
  color: inherit;
  text-decoration: none;
}

ul,
ol {
  list-style: none;
}

button,
input {
  font: inherit;
  border: none;
  background: none;
}

button {
  cursor: pointer;
}

/* --------------------------------------------------------------------------
   Preloader
   -------------------------------------------------------------------------- */

/* Trava o scroll enquanto o preloader está ativo (classe adicionada pelo
   script inline no <head>, antes de qualquer pintura na tela) */
html.aguardando-preloader,
html.aguardando-preloader body {
  overflow: hidden;
}

/* Escondido por padrão: só some da tela via classe, então quem não tem
   JS (ou já viu nesta sessão, ou pediu menos movimento) nunca chega a
   ver o preloader — sem "flash" nenhum. */
[data-preloader] {
  display: none;
}

html.aguardando-preloader [data-preloader] {
  position: fixed;
  inset: 0;
  z-index: 999;
  display: flex;
  align-items: center;
  justify-content: center;
  overflow: hidden;
  /* O fundo próprio (.preloader__fundo) cobre o .hero atrás dele — não
     precisa mais depender da bg-overlay.jpg carregar a tempo. O header
     e o conteúdo do hero ficam escondidos (opacity:0 via
     [data-reveal-hero]/[data-reveal]) até a hora certa de aparecer. */
}


.preloader__logo {
  position: relative;
  z-index: 2;
  width: min(26rem, 60vw);
}

.preloader__logo svg {
  display: block;
  width: 100%;
  height: auto;
  overflow: visible;
}

/* transform-box:fill-box faz a escala/translação crescer a partir do
   centro de cada faceta/letra (não do canto 0,0 do viewBox) */
.preloader__logo .fil0,
.preloader__logo .fil1 {
  opacity: 0;
  transform-box: fill-box;
  transform-origin: center;
  will-change: transform, filter, opacity;
}

/* Fundo do preloader: gradiente animado (mesmas cores da bg-overlay.jpg
   do .hero — dá continuidade visual quando o preloader some), com dois
   "blobs" que derivam (posição/escala/opacity), pra nunca ficar idêntico
   de um instante pro outro. Ciclo curto de propósito (~3s) — o preloader
   inteiro dura uns 2,5s, então um ciclo "respirando devagar" de hero
   persistente (20-30s) ficaria parecendo congelado aqui; precisa de
   menos de um giro completo pra já dar pra notar o movimento. Fica
   sempre visível (não precisa de fade de entrada) e só some junto com
   os glows/meteoros na saída — ver js/preloader.js. Puro CSS, sem custo
   de JS por quadro. */
.preloader__fundo {
  position: absolute;
  inset: 0;
  z-index: 0;
  overflow: hidden;
  background: var(--cor-fundo-escuro);
  pointer-events: none;
}

.preloader__blob {
  position: absolute;
  border-radius: 50%;
  filter: blur(60px);
  will-change: transform, opacity;
}

.preloader__blob--1 {
  width: 62%;
  height: 130%;
  top: -35%;
  right: -18%;
  background: radial-gradient(circle, rgba(87, 169, 224, .30) 0%, rgba(30, 90, 150, .10) 45%, rgba(30, 90, 150, 0) 72%);
  animation: preloader-derivar-1 3.2s ease-in-out infinite alternate;
}

.preloader__blob--2 {
  width: 46%;
  height: 100%;
  bottom: -30%;
  left: -14%;
  background: radial-gradient(circle, rgba(45, 95, 200, .22) 0%, rgba(20, 50, 110, .09) 50%, rgba(20, 50, 110, 0) 75%);
  animation: preloader-derivar-2 3.8s ease-in-out infinite alternate;
}

@keyframes preloader-derivar-1 {
  0% {
    transform: translate(0, 0) scale(1);
    opacity: .85;
  }

  50% {
    transform: translate(-9%, 8%) scale(1.22);
    opacity: 1;
  }

  100% {
    transform: translate(-15%, -6%) scale(.9);
    opacity: .8;
  }
}

@keyframes preloader-derivar-2 {
  0% {
    transform: translate(0, 0) scale(1);
    opacity: .75;
  }

  50% {
    transform: translate(9%, -7%) scale(1.18);
    opacity: 1;
  }

  100% {
    transform: translate(16%, 6%) scale(.88);
    opacity: .7;
  }
}

/* Céu de estrelas: pontos fixos espalhados pelo fundo inteiro,
   piscando em ciclos levemente diferentes entre si (duração/atraso por
   estrela). Decoração pura em CSS — sem JS por quadro — porque só
   existe durante o tempo de vida do preloader; ele é removido do DOM no
   final, então a animação infinita nunca sobra rodando "órfã" depois. */
.preloader__ceu {
  position: absolute;
  inset: 0;
  z-index: 0;
  pointer-events: none;
}

.preloader__estrela {
  position: absolute;
  border-radius: 50%;
  background: #ffffff;
  opacity: 0;
  transform: translate(-50%, -50%);
  animation-name: preloader-piscar;
  animation-timing-function: ease-in-out;
  animation-iteration-count: infinite;
}

@keyframes preloader-piscar {

  0%,
  100% {
    opacity: .15;
  }

  50% {
    opacity: 1;
  }
}

/* Chuva de meteoros: riscos diagonais paralelos (mesmo ângulo fixo pra
   todos — é isso que lê como "chuva", não uma explosão saindo de um
   ponto) cruzando a tela o tempo todo, cada um num "left" e velocidade
   diferentes (só JS no setup: cria os elementos e varia posição/
   duração/atraso; o movimento em si é puro CSS, infinito, sem custo de
   JS por quadro — mesmo raciocínio do céu de estrelas logo acima). A
   camada inteira (.preloader__meteoros) entra e sai em fade junto com a
   logo — ver js/preloader.js, ela é animada junto dos glows.
   z-index (0) já fica atrás da logo (2) — mas a logo é um contorno com
   bastante espaço vazio entre as facetas/letras, então um meteoro
   cruzando essa área continuava visível nos vãos, parecendo estar na
   frente mesmo estando atrás. A máscara abaixo recorta um "buraco"
   suave bem no centro (onde a logo fica) pra nenhum meteoro aparecer
   ali de jeito nenhum, nem nos vãos. */
.preloader__meteoros {
  position: absolute;
  inset: 0;
  z-index: 0;
  overflow: hidden;
  pointer-events: none;
  opacity: 0;
  -webkit-mask-image: radial-gradient(ellipse 26% 32% at 50% 50%, transparent 55%, #000 100%);
  mask-image: radial-gradient(ellipse 26% 32% at 50% 50%, transparent 55%, #000 100%);
}

.preloader__meteoro {
  position: absolute;
  top: -12%;
  left: 0;
  width: 2px;
  background: linear-gradient(to bottom, rgba(255, 255, 255, 0), rgba(165, 212, 255, .95) 65%, rgba(165, 212, 255, 0));
  opacity: 0;
  animation-name: preloader-meteoro;
  animation-timing-function: linear;
  animation-iteration-count: infinite;
}

/* rotate(35deg) antes de translateY: o navegador aplica o translateY
   primeiro (no espaço ainda sem rotação) e só depois gira o resultado
   inteiro em torno do centro — então o ângulo aqui não é "a inclinação
   do risco", é o que decide pra ONDE o translateY (que seria só "descer
   reto") efetivamente aponta depois de girado. Com 35°, "descer" vira
   "descer e derivar pra esquerda" (35° da vertical) — o valor errado
   (usado antes) mandava os meteoros pra CIMA, saindo da tela por trás
   do topo, então nunca apareciam. */
@keyframes preloader-meteoro {
  0% {
    opacity: 0;
    transform: rotate(35deg) translateY(0);
  }

  8% {
    opacity: 1;
  }

  82% {
    opacity: 1;
  }

  100% {
    opacity: 0;
    transform: rotate(35deg) translateY(145vh);
  }
}

/* --------------------------------------------------------------------------
   Decoração ambiente das seções escuras — estrelas e meteoros
   Mesma técnica visual do preloader logo acima (.preloader__estrela/meteoro
   — reaproveita até a @keyframes preloader-piscar), só que permanente e
   mais discreta. Cada seção usa uma combinação diferente de propósito (nem
   todas têm estrela ou meteoro). Compartilhado por qualquer página que
   carregue js/decoracao-secoes.js (gera os elementos internos).
   -------------------------------------------------------------------------- */

.secao-estrelas,
.secao-meteoros {
  position: absolute;
  inset: 0;
  z-index: 0;
  pointer-events: none;
}

.secao-estrela {
  position: absolute;
  border-radius: 50%;
  background: #ffffff;
  opacity: 0;
  transform: translate(-50%, -50%);
  animation-name: preloader-piscar;
  animation-timing-function: ease-in-out;
  animation-iteration-count: infinite;
}

.secao-meteoro {
  position: absolute;
  top: -12%;
  left: 0;
  width: 2px;
  background: linear-gradient(to bottom, rgba(255, 255, 255, 0), rgba(165, 212, 255, .85) 65%, rgba(165, 212, 255, 0));
  opacity: 0;
  animation-name: secao-meteoro-cair;
  animation-timing-function: linear;
  animation-iteration-count: infinite;
}

/* Percurso próprio, bem mais curto que o do preloader (que cai 145vh, feito
   pra uma tela cheia). Sem overflow:hidden segurando mais nada, um meteoro
   de seção precisa de um percurso do tamanho de uma seção normal — senão
   ele atravessa as seções seguintes inteiras (inclusive o rodapé). */
@keyframes secao-meteoro-cair {
  0% {
    opacity: 0;
    transform: rotate(35deg) translateY(0);
  }

  8% {
    opacity: 1;
  }

  82% {
    opacity: 1;
  }

  100% {
    opacity: 0;
    transform: rotate(35deg) translateY(40vh);
  }
}

@media (prefers-reduced-motion: reduce) {

  .secao-estrela,
  .secao-meteoro {
    animation: none !important;
  }
}

/* --------------------------------------------------------------------------
   Glow ambiente das seções escuras — dois blobs radiais que derivam bem
   lentamente, mesma família visual do .preloader__blob e do
   .samibank__glow-interativo (ver home.css), só que estático via puro CSS
   (sem JS de mouse): dá profundidade mesmo em seções sem interação nenhuma.
   Fica sempre atrás de estrelas/meteoros/conteúdo (ver z-index abaixo).
   Uso: <div class="secao-glow" aria-hidden="true"></div> logo no início da
   seção — os blobs em si são gerados via ::before/::after, sem markup extra.
   -------------------------------------------------------------------------- */

.secao-glow {
  position: absolute;
  inset: 0;
  z-index: 0;
  pointer-events: none;
  /* Sem overflow:hidden de propósito: os blobs (::before/::after) nascem
     parcialmente fora da caixa (top/bottom negativos) para o degradê
     desbotar até a transparência antes de qualquer borda — com
     overflow:hidden aqui, a seção cortava o blob seco bem no limite dela,
     criando uma linha reta visível na quebra entre seções. */
}

.secao-glow::before,
.secao-glow::after {
  content: '';
  position: absolute;
  border-radius: 50%;
  opacity: .6;
  /* Mesmo blur do .preloader__blob (ver acima): sem ele, os stops do
     radial-gradient aparecem como um anel com borda dura (banding) em vez
     de um degradê contínuo — é o blur que funde tudo numa mancha suave. */
  filter: blur(60px);
  animation: secao-glow-flutuar 22s ease-in-out infinite;
}

.secao-glow::before {
  /* Offset pequeno de propósito: o degradê já desbota pra transparente
     dentro da própria caixa (stop de 72%, bem antes da borda dela) — um
     offset grande (como era antes) empurrava boa parte da área AINDA
     colorida do gradiente pra fora da seção, que a seção vizinha (opaca)
     cobre sem dar tempo do fade terminar, criando a linha dura na quebra.
     Aqui é só o suficiente pra arredondar o canto. */
  width: min(34vw, 480px);
  height: min(34vw, 480px);
  top: -4%;
  left: -6%;
  background: radial-gradient(circle, rgba(45, 95, 200, .30) 0%, rgba(30, 90, 150, .11) 45%, rgba(30, 90, 150, 0) 72%);
}

.secao-glow::after {
  width: min(30vw, 420px);
  height: min(30vw, 420px);
  bottom: -2%;
  right: -4%;
  background: radial-gradient(circle, rgba(87, 169, 224, .24) 0%, rgba(20, 50, 110, .08) 50%, rgba(20, 50, 110, 0) 75%);
  animation-delay: -11s;
  animation-direction: reverse;
}

@keyframes secao-glow-flutuar {

  0%,
  100% {
    transform: translate(0, 0) scale(1);
  }

  50% {
    transform: translate(3%, 4%) scale(1.08);
  }
}

@media (prefers-reduced-motion: reduce) {

  .secao-glow::before,
  .secao-glow::after {
    animation: none !important;
  }
}

/* --------------------------------------------------------------------------
   Glow interativo (segue o mouse) — base compartilhada
   Mesma família visual do .secao-glow acima, só que reage ao ponteiro em
   vez de derivar sozinho: dá vida extra a uma seção com um elemento focal
   (uma imagem, um card) atrás do qual o brilho "respira". Cada seção que
   usa isso define seu próprio tamanho/posição/cor (ver ex. em home.css,
   .samibank__glow-interativo); aqui só o que é comum a todas. O
   movimento em si é feito por js/glow-interativo.js, que procura por
   [data-glow-interativo] dentro da seção mais próxima.
   Uso: <span class="minha-secao__glow" data-glow-interativo aria-hidden="true"></span>
   -------------------------------------------------------------------------- */
.secao-glow-interativo {
  position: absolute;
  z-index: 0;
  border-radius: 50%;
  filter: blur(75px);
  pointer-events: none;
  will-change: transform;
}

@media (prefers-reduced-motion: reduce) {
  .secao-glow-interativo {
    display: none;
  }
}

/* --------------------------------------------------------------------------
   "Bolhas de vidro" de hero — base compartilhada
   Movida de home.css pra cá pra ficar disponível em qualquer hero do site
   (payhub, condomínios, locação), não só na home onde nasceu. Nada de
   imagem: um círculo com gradiente radial pro volume (mais claro onde a
   "luz" bate, escurecendo pras bordas) mais um traço com gradiente pro
   brilho fino na borda, só de um lado (onde a luz bateria de raspão).
   Cada hero usa duas (grande + pequena), com <defs>/gradientes próprios
   (ids diferentes) — ver markup em qualquer .hero*/
.hero__esfera {
  position: absolute;
  pointer-events: none;
}

.hero__esfera--grande {
  bottom: -22%;
  left: -12%;
  width: 34rem;
  height: 34rem;
  opacity: .55;
  z-index: 9;
}

.hero__esfera--pequena {
  /* Fixo a partir do topo (não %): um % aqui é relativo à altura TOTAL
     do .hero, que varia muito de página pra página (a home é bem mais
     alta que as outras por causa da fileira de cards no fim) — com %, a
     bolha "escorregava" pra baixo em heroes mais altos, bem mais longe
     do topo do que devia (dava a impressão de empurrar o resto do
     conteúdo, apesar de ela ser position:absolute e não empurrar nada de
     verdade). calc() a partir do header garante a mesma distância do
     topo em qualquer altura de hero. */
  top: calc(var(--altura-header) + 2rem);
  left: 4%;
  width: 12rem;
  height: 12rem;
  opacity: .4;
}

.hero__esfera-fill-inicio {
  stop-color: rgb(var(--glow-azul));
  stop-opacity: .55;
}

.hero__esfera-fill-meio {
  stop-color: rgb(var(--glow-royal));
  stop-opacity: .28;
}

.hero__esfera-fill-fim {
  stop-color: var(--cor-fundo-escuro);
  stop-opacity: .1;
}

.hero__esfera-rim-inicio {
  stop-color: #ffffff;
  stop-opacity: .9;
}

.hero__esfera-rim-meio {
  stop-color: #ffffff;
  stop-opacity: .2;
}

.hero__esfera-rim-fim {
  stop-color: #ffffff;
  stop-opacity: 0;
}

.hero__esfera-rim {
  stroke-width: 2.5;
}

/* Glows azuis atrás da logo — nas mesmas posições dos pontos claros reais
   do bg-overlay.jpg (canto superior direito, mais forte; inferior
   esquerdo, mais sutil), pra continuar batendo quando o hero aparecer.
   Ficam parados no lugar — só entram e saem com fade, sem crescer nem
   se mover. */
.preloader__glow {
  position: absolute;
  z-index: 1;
  border-radius: 50%;
  opacity: 0;
  pointer-events: none;
}

.preloader__glow--1 {
  top: -12%;
  right: -14%;
  width: 28rem;
  height: 28rem;
  background: radial-gradient(circle, rgba(87, 169, 224, 0.22) 0%, rgba(30, 90, 150, 0.1) 45%, rgba(30, 90, 150, 0) 72%);
  filter: blur(14px);
}

.preloader__glow--2 {
  bottom: -18%;
  left: -12%;
  width: 20rem;
  height: 20rem;
  background: radial-gradient(circle, rgba(45, 95, 200, 0.16) 0%, rgba(20, 50, 110, 0.07) 50%, rgba(20, 50, 110, 0) 75%);
  filter: blur(16px);
}

/* --------------------------------------------------------------------------
   Container
   -------------------------------------------------------------------------- */

.container {
  width: 100%;
  max-width: var(--largura-conteudo);
  margin-inline: auto;
}

/* --------------------------------------------------------------------------
   Botões
   -------------------------------------------------------------------------- */

/* Padrão de botão do site: pill compacto, com espaço pra ícone/seta (gap),
   peso médio e transições suaves. É só a FORMA/estrutura — a cor vem das
   variantes (--primario, --branco, --vidro). */
.botao {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: var(--espaco-8);
  padding: 0.85rem 1.75rem;
  border-radius: var(--raio-pilula);
  font-size: var(--texto-base);
  font-weight: var(--peso-medio);
  line-height: var(--altura-linha-texto);
  text-align: center;
  transition: background-color var(--transicao-padrao), border-color var(--transicao-padrao), box-shadow var(--transicao-padrao), transform var(--transicao-rapida);
}

.botao--primario {
  background-color: var(--cor-primaria);
  color: var(--cor-texto-invertido);
  box-shadow: var(--sombra-botao);
}

.botao--primario:hover {
  background-color: var(--cor-primaria-hover);
}

.botao--branco {
  background-color: var(--cor-fundo);
  color: var(--cor-primaria);
  font-size: var(--texto-subtitulo);
  font-weight: var(--peso-semibold);
  padding: 1.1rem var(--espaco-40);
  box-shadow: var(--sombra-botao-grande);
}

.botao--branco:hover {
  background-color: var(--cor-fundo-suave);
}

/* Variante "vidro" (a que virou referência): translúcida com borda clara
   fininha e texto branco. Pra usar sobre fundos escuros. */
.botao--vidro {
  border: 1px solid rgba(255, 255, 255, .16);
  background: rgba(255, 255, 255, .05);
  box-shadow: inset 0 1px 0 rgba(255, 255, 255, .08);
  color: var(--cor-texto-invertido-suave);
}

.botao--vidro:hover {
  background: rgba(255, 255, 255, .1);
  border-color: rgba(255, 255, 255, .32);
}

/* --------------------------------------------------------------------------
   Select personalizado (substitui o <select> nativo nos formulários do
   site) — movido pra cá (era só de solucao.css) pra ficar disponível em
   qualquer página com formulário, sem precisar carregar solucao.css
   inteiro. Variantes de cor por página (ex.: dark do payhub, "vidro
   preto" do cta-form) continuam no CSS de cada página, sobrepondo só as
   cores.
   -------------------------------------------------------------------------- */

.select-personalizado {
  position: relative;
}

/* O <select> real fica invisível mas presente: é ele quem vai no submit
   do form. Sem display:none, senão perde-se o foco/tab e a validação
   "required" nativa do navegador. */
.select-personalizado__nativo {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  opacity: 0;
  pointer-events: none;
}

.select-personalizado__botao {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--espaco-8);
  width: 100%;
  padding: 0.65rem 0.75rem;
  background-color: var(--cor-fundo);
  border: 1px solid var(--cor-borda);
  border-radius: var(--raio-4);
  font-family: inherit;
  font-size: var(--texto-medio);
  color: var(--cor-texto);
  cursor: pointer;
  transition: border-color var(--transicao-rapida);
}

.select-personalizado__valor {
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  /* min-width:0 é o que deixa esse span (filho de flex) encolher e
     elidir o texto em vez de forçar a quebra pra segunda linha. */
  min-width: 0;
}

.select-personalizado__botao:focus-visible,
.select-personalizado--aberto .select-personalizado__botao {
  outline: none;
  border-color: var(--cor-primaria);
}

.select-personalizado__valor--vazio {
  color: var(--cor-texto-placeholder);
}

.select-personalizado__seta {
  flex-shrink: 0;
  width: 0.875rem;
  height: 0.875rem;
  transition: transform var(--transicao-rapida);
}

.select-personalizado--aberto .select-personalizado__seta {
  transform: rotate(180deg);
}

.select-personalizado__lista {
  position: absolute;
  z-index: 20;
  top: calc(100% + 0.375rem);
  left: 0;
  right: 0;
  max-height: 14rem;
  overflow-y: auto;
  margin: 0;
  padding: var(--espaco-4, 0.25rem);
  list-style: none;
  background-color: var(--cor-fundo);
  border: 1px solid var(--cor-borda);
  border-radius: var(--raio-8);
  box-shadow: var(--sombra-card);
}

.select-personalizado__opcao {
  padding: 0.6rem 0.7rem;
  border-radius: var(--raio-4);
  font-size: var(--texto-medio);
  color: var(--cor-texto);
  cursor: pointer;
}

.select-personalizado__opcao:hover,
.select-personalizado__opcao--foco {
  background-color: var(--cor-fundo-suave);
}

.select-personalizado__opcao--selecionada {
  background-color: var(--cor-primaria);
  color: var(--cor-texto-invertido);
}

/* --------------------------------------------------------------------------
   Feedback de envio de formulário (ver public/js/form-rd.js e
   public/api/rd-enviar.php) — usado por todo <form data-form-rd> do site,
   independente da página ter tema claro ou escuro (só cor de texto, sem
   fundo, então funciona nos dois).
   -------------------------------------------------------------------------- */

.form-rd__feedback {
  min-height: 1.25rem;
  margin: 0;
  font-size: var(--texto-medio);
  font-weight: var(--peso-semibold);
  text-align: center;
}

.form-rd__feedback--sucesso {
  color: var(--cor-sucesso);
}

.form-rd__feedback--erro {
  color: var(--cor-erro);
}

/* --------------------------------------------------------------------------
   Header / TopBar
   -------------------------------------------------------------------------- */

/* Fora do fluxo (position:absolute, sem afetar layout nenhum) — só existe
   pra main.js observar via IntersectionObserver. 24px = mesmo LIMITE que
   antes vivia como número mágico no JS lendo window.scrollY. */
.header__sentinela {
  position: absolute;
  top: 1.5rem;
  width: 1px;
  height: 1px;
  pointer-events: none;
}

.header {
  position: fixed;
  top: 0;
  left: 0;
  right: 0;
  z-index: 100;
  height: var(--altura-header);
  background-color: transparent;
  transition:
    height var(--transicao-suave),
    background-color var(--transicao-suave),
    box-shadow var(--transicao-suave),
    transform var(--transicao-suave);
}

/* Estado após o início do scroll: fundo sólido translúcido e altura reduzida */
.header--rolando {
  height: var(--altura-header-compacta);
  background-color: rgba(4, 6, 19, 0.85);
  -webkit-backdrop-filter: blur(0.625rem);
  backdrop-filter: blur(0.625rem);
  box-shadow: 0 0.25rem 1.25rem rgba(0, 0, 0, 0.35);
}

.header__conteudo {
  max-width: 71rem;
  height: 100%;
  margin-inline: auto;
  padding-inline: var(--espaco-24);
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--espaco-24);
}

.header__logo img {
  width: 6.563rem;
  /* 105px */
  height: auto;
  transition: width var(--transicao-suave);
}

.header--rolando .header__logo img {
  width: 5.5rem;
}

.header__navegacao {
  display: flex;
  align-items: center;
  gap: var(--espaco-24);
  margin-left: auto;
}

.header__menu {
  display: flex;
  align-items: center;
  gap: var(--espaco-40);
}

.header__link {
  font-size: var(--texto-nav);
  letter-spacing: var(--espacamento-letra-caps);
  text-transform: uppercase;
  color: var(--cor-texto-invertido);
  text-shadow: 0 0.125rem 1.25rem #000000;
  transition: color var(--transicao-rapida);
}

.header__link:hover {
  color: var(--cor-azul-claro);
}

/* Dropdown "Soluções": abre no hover (desktop) sem JS — só CSS, mesmo
   critério dos outros efeitos "passivos" do header. No mobile (ver
   @media 48rem mais abaixo) o hover não existe, então a lista já
   aparece sempre expandida embaixo do link, em vez de depender de toque. */
.header__item--dropdown {
  position: relative;
}

.header__submenu {
  position: absolute;
  top: 100%;
  left: 50%;
  transform: translate(-50%, 0.5rem);
  min-width: 12rem;
  padding: var(--espaco-8);
  border-radius: var(--raio-12);
  background-color: var(--cor-fundo-escuro);
  border: 1px solid rgba(255, 255, 255, 0.1);
  box-shadow: var(--sombra-card);
  opacity: 0;
  visibility: hidden;
  pointer-events: none;
  transition: opacity var(--transicao-rapida), transform var(--transicao-rapida), visibility var(--transicao-rapida);
}

.header__item--dropdown:hover .header__submenu,
.header__item--dropdown:focus-within .header__submenu {
  opacity: 1;
  visibility: visible;
  pointer-events: auto;
  transform: translate(-50%, 0);
}

.header__submenu-link {
  display: block;
  padding: var(--espaco-8) var(--espaco-12);
  border-radius: var(--raio-8);
  font-size: var(--texto-pequeno);
  letter-spacing: normal;
  text-transform: none;
  white-space: nowrap;
  color: var(--cor-texto-invertido-suave);
  transition: color var(--transicao-rapida), background-color var(--transicao-rapida);
}

.header__submenu-link:hover {
  color: var(--cor-texto-invertido);
  background-color: rgba(255, 255, 255, 0.08);
}

.header__cta {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  min-width: 8.698rem;
  /* 139px */
  height: 2.188rem;
  /* 35px */
  padding-inline: var(--espaco-16);
  border-radius: var(--raio-6);
  background: linear-gradient(90deg, var(--cor-gradiente-inicio), var(--cor-gradiente-fim));
  color: var(--cor-texto-invertido);
  font-size: 0.85rem;
  letter-spacing: 0.01em;
  transition: opacity var(--transicao-rapida);
}

.header__cta:hover {
  opacity: 0.9;
}

.header__hamburguer {
  display: none;
  flex-direction: column;
  justify-content: center;
  gap: 0.313rem;
  width: 2.5rem;
  height: 2.5rem;
  padding: 0.5rem;
}

.header__hamburguer span {
  display: block;
  height: 0.125rem;
  width: 100%;
  background-color: var(--cor-texto-invertido);
  border-radius: var(--raio-pilula);
  transition: transform var(--transicao-padrao), opacity var(--transicao-padrao);
}

.header__hamburguer[aria-expanded="true"] span:nth-child(1) {
  transform: translateY(0.438rem) rotate(45deg);
}

.header__hamburguer[aria-expanded="true"] span:nth-child(2) {
  opacity: 0;
}

.header__hamburguer[aria-expanded="true"] span:nth-child(3) {
  transform: translateY(-0.438rem) rotate(-45deg);
}

/* --------------------------------------------------------------------------
   Rodapé
   -------------------------------------------------------------------------- */

.rodape {
  background-color: var(--cor-fundo-rodape);
  color: var(--cor-texto-invertido);
  padding-block: var(--espaco-64) var(--espaco-24);
}

.rodape__grade {
  display: grid;
  grid-template-columns: 1.2fr 1fr 1fr 1.2fr;
  gap: var(--espaco-40);
}

.rodape__marca {
  display: flex;
  flex-direction: column;
  gap: var(--espaco-24);
}

.rodape__logo {
  width: 7.25rem;
  /* 116px */
  height: auto;
}

.rodape__redes {
  display: flex;
  gap: var(--espaco-16);
  margin-top: auto;
}

.rodape__rede img {
  width: 1.625rem;
  height: 1.625rem;
  transition: opacity var(--transicao-rapida);
}

.rodape__rede:hover img {
  opacity: 0.7;
}

.rodape__titulo {
  font-family: var(--fonte-rodape);
  font-size: 0.981rem;
  /* 15.7px */
  font-weight: var(--peso-extrabold);
  text-transform: uppercase;
  margin-bottom: var(--espaco-24);
}

.rodape__lista {
  display: flex;
  flex-direction: column;
  gap: var(--espaco-12);
}

.rodape__link {
  font-family: var(--fonte-rodape);
  font-size: var(--texto-base);
  color: var(--cor-texto-invertido-suave);
  transition: color var(--transicao-rapida);
}

a.rodape__link:hover {
  color: var(--cor-azul-claro);
}

.rodape__link--icone {
  display: inline-flex;
  align-items: center;
  gap: var(--espaco-8);
}

.rodape__link--icone img {
  width: 1.125rem;
  height: 1.125rem;
  /* Ícones nascem brancos (mesmos SVGs usados nos botões do site) — aqui
     ficam com a mesma opacidade do texto ao redor (--cor-texto-invertido-
     suave), sem precisar de uma cópia colorida só pro rodapé. */
  opacity: 0.75;
  flex-shrink: 0;
}

.rodape__divisor {
  height: 1px;
  background-color: var(--cor-divisor-rodape);
  margin-block: var(--espaco-40) var(--espaco-24);
  border: none;
}

.rodape__base {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--espaco-16);
  flex-wrap: wrap;
}

.rodape__creditos {
  font-family: var(--fonte-rodape);
  font-size: 0.981rem;
  color: rgba(255, 255, 255, 0.96);
}

.rodape__creditos strong {
  font-weight: var(--peso-bold);
}

/* --------------------------------------------------------------------------
   Utilitários
   -------------------------------------------------------------------------- */

.texto-destaque-azul {
  color: var(--cor-primaria);
}

.visualmente-oculto {
  position: absolute;
  width: 1px;
  height: 1px;
  overflow: hidden;
  clip: rect(0 0 0 0);
  white-space: nowrap;
}

/* --------------------------------------------------------------------------
   Motion — revelação ao rolar e entrada em cascata do hero
   -------------------------------------------------------------------------- */

/* Estado inicial (antes do Anime.js animar): evita o "flash" do conteúdo
   aparecendo cheio antes da animação começar — precisa bater com os
   valores "from" configurados em motion.js. A interpolação em si é
   feita via JS, não por transition CSS. */
[data-reveal] {
  opacity: 0;
  transform: translateY(2.25rem) scale(0.97);
  filter: blur(6px);
}

[data-reveal-hero] {
  opacity: 0;
  transform: translateY(3rem) scale(0.94);
  filter: blur(10px);
}

/* Header desce de cima (y negativo) — barra fixa no topo, cai no lugar
   em vez de subir de baixo como o resto do hero (js/motion.js) */
.header[data-reveal-hero] {
  transform: translateY(-3rem) scale(0.94);
}

@media (prefers-reduced-motion: reduce) {

  [data-reveal],
  [data-reveal-hero] {
    opacity: 1;
    transform: none;
    filter: none;
  }
}

/* --------------------------------------------------------------------------
   Responsivo — componentes compartilhados
   -------------------------------------------------------------------------- */

@media (max-width: 64rem) {

  /* 1024px */
  .rodape__grade {
    grid-template-columns: repeat(2, 1fr);
  }
}

@media (max-width: 48rem) {

  /* 768px */

  /* Só entra abaixo deste breakpoint de propósito: .container nunca teve
     padding-inline (só width/max-width/margin-inline:auto) — em telas
     mais largas que --largura-conteudo isso nunca importou, o max-width
     já cria respiro nas laterais. Mas assim que a tela fica mais estreita
     que ele (ou seja, a partir daqui), o conteúdo passa a encostar nas
     duas bordas. Não sobe pro .container base pra não deslocar layouts de
     desktop já calibrados com valores exatos do Figma. */
  .container {
    padding-inline: var(--espaco-24);
  }

  /* A "bolha de vidro" grande tem largura fixa (34rem) pensada pra
     desktop — numa tela estreita ela sobra bem mais que os 12% de "left"
     negativo compensam, estourando o lado direito do viewport e forçando
     um scroll horizontal na página inteira (overflow-x:clip no body não
     segura isso: o scroll nasce do documento ficar mais largo que a
     tela, não de conteúdo vazando visualmente). Limitando a largura ao
     que sobra de viewport, a esfera nunca passa da borda — mesmo motivo
     que já valia só pra home antes desta regra virar compartilhada. */
  .hero__esfera--grande {
    width: min(34rem, 78vw);
    height: min(34rem, 78vw);
  }

  .header__hamburguer {
    display: flex;
  }

  .header__navegacao {
    position: absolute;
    top: 100%;
    left: 0;
    right: 0;
    flex-direction: column;
    align-items: stretch;
    gap: 0;
    padding: var(--espaco-16) var(--espaco-24) var(--espaco-24);
    background-color: var(--cor-fundo-escuro);
    display: none;
  }

  .header__navegacao.aberta {
    display: flex;
  }

  .header__menu {
    flex-direction: column;
    align-items: stretch;
    gap: 0;
  }

  .header__link {
    display: block;
    padding-block: var(--espaco-12);
    font-size: var(--texto-pequeno);
    text-align: center;
    border-bottom: 1px solid rgba(255, 255, 255, 0.08);
  }

  /* Sem hover em telas de toque — o submenu de "Soluções" fica sempre
     expandido embaixo do link, em vez de escondido esperando um :hover
     que nunca vai acontecer. */
  .header__submenu {
    position: static;
    display: flex;
    flex-direction: column;
    opacity: 1;
    visibility: visible;
    pointer-events: auto;
    transform: none;
    min-width: 0;
    margin-top: 0;
    border: none;
    border-radius: 0;
    background-color: transparent;
    box-shadow: none;
    padding: 0 0 var(--espaco-8);
  }

  .header__submenu-link {
    text-align: center;
    padding-block: var(--espaco-8);
  }

  .header__cta {
    margin-top: var(--espaco-16);
    height: 2.75rem;
  }

  .rodape__grade {
    grid-template-columns: 1fr;
    gap: var(--espaco-32);
  }

  .rodape__redes {
    margin-top: 0;
  }

  .rodape__titulo {
    margin-bottom: var(--espaco-12);
  }

  .rodape__base {
    flex-direction: column;
    align-items: flex-start;
  }
}