/* gotiva.css — a camada da casa POR CIMA do CSS da origem.
   Aqui vive o que a origem fazia por JavaScript (variantes por ecrã, texto a
   rolar, física dos ciclos) e o «mais dinamismo» que o dono pediu. Nada aqui
   esconde conteúdo por omissão: o estado de entrada é posto pelo script. */

/* ─────────── acessibilidade ─────────── */
.gv-skip {
  position: absolute; left: -9999px; top: 0; z-index: 999;
  background: var(--token-829b62bd-4ba9-4a4c-9b21-14ad134a2426, #1a4bed);
  color: #fff; padding: 12px 20px; border-radius: 0 0 12px 0;
  font: 500 16px/1.4 "Inter", sans-serif; text-decoration: none;
}
.gv-skip:focus { left: 0; }

:where(a, button, [tabindex]):focus-visible {
  outline: 3px solid var(--token-829b62bd-4ba9-4a4c-9b21-14ad134a2426, #1a4bed);
  outline-offset: 3px; border-radius: 6px;
}

/* Alvos de toque de 44px SEM tocar na caixa: a área cresce por um pseudo-elemento,
   o desenho fica exactamente onde estava. */
nav[data-framer-name="Links"] a { position: relative; }
nav[data-framer-name="Links"] a::after {
  content: ''; position: absolute; left: -12px; right: -12px; top: 50%;
  height: 44px; transform: translateY(-50%);
}

/* A BARRA DO TOPO. A origem guarda o logótipo e a pílula ACIMA da barra
   (top:-118px / -108px) e fá-los descer com o scroll — o espelho foi capturado
   com eles já descidos, e é essa a régua. Ficam no sítio desde o primeiro pixel. */
.framer-R7Tcl.framer-v-1d8rrkb .framer-f4ppp0,
.framer-R7Tcl.framer-v-1d8rrkb .framer-1ilmyqa {
  position: relative; top: auto; left: auto; right: auto;
}

/* ─────────── variantes por ecrã (o que o runtime do Framer fazia) ───────────
   Peças com mais do que uma versão (o rodapé, por exemplo) trazem `data-kb-bp`:
   d = secretária, b = tablete, a = telemóvel. Mostra-se UMA. Abaixo de 810px
   não há versão de telemóvel na origem — usa-se a de tablete, que já é em
   coluna, com o empilhamento afinado mais abaixo. */
@media (max-width: 809px) {
  [data-kb-bp="d"] { display: none !important; }
  [data-kb-bp="a"] ~ [data-kb-bp="b"] { display: none !important; }
}
@media (min-width: 810px) and (max-width: 1199px) {
  [data-kb-bp="d"], [data-kb-bp="a"] { display: none !important; }
}
@media (min-width: 1200px) {
  [data-kb-bp="a"], [data-kb-bp="b"] { display: none !important; }
}

/* ─────────── menu de ecrãs pequenos ───────────
   Acima de 810px não existe: a pílula da origem chega. Abaixo, a pílula sai e
   entra um botão de 48px com um painel na mesma linguagem (vidro, hairline,
   raio grande). Sem JS o painel não abre, mas as ligações continuam no rodapé. */
.gv-menu-botao { display: none; }
.gv-menu { display: none; }

@media (max-width: 809px) {
  .framer-R7Tcl .framer-1ilmyqa { display: none !important; }
  .gv-menu-botao {
    display: grid; place-items: center;
    width: 48px; height: 48px; flex: none; cursor: pointer;
    border-radius: 999px; border: 2px solid var(--token-a0ba8a14-548b-41a2-ba86-b47d8bcfc7ff, #fff);
    background: var(--token-e487da2e-1702-49a1-95eb-e7e728c62f4c, rgba(255, 255, 255, .5));
    backdrop-filter: blur(10px);
    box-shadow: rgba(0, 0, 0, .18) 0 .6px .6px -1.25px, rgba(0, 0, 0, .16) 0 2.3px 2.3px -2.5px,
                rgba(0, 0, 0, .06) 0 10px 10px -3.75px;
    color: var(--token-251f39c5-6e24-4f71-944a-36c2aa1dd073, #2a2a2a);
  }
  .gv-menu-botao svg { width: 24px; height: 24px; }

  .gv-menu[data-aberto="1"] {
    display: flex; flex-direction: column; gap: 6px;
    position: absolute; top: 84px; left: 20px; right: 20px; z-index: 20;
    padding: 14px; border-radius: 28px;
    border: 2px solid var(--token-a0ba8a14-548b-41a2-ba86-b47d8bcfc7ff, #fff);
    background: rgba(255, 255, 255, .88); backdrop-filter: blur(16px);
    box-shadow: rgba(0, 0, 0, .12) 0 18px 40px -12px;
  }
  .gv-menu nav { display: flex; flex-direction: column; }
  .gv-menu a {
    display: flex; align-items: center; min-height: 48px; padding: 0 14px;
    border-radius: 16px; text-decoration: none; font: 500 17px/1.4 "Inter", sans-serif;
    color: var(--token-251f39c5-6e24-4f71-944a-36c2aa1dd073, #2a2a2a);
  }
  .gv-menu a:hover, .gv-menu a:focus-visible {
    background: var(--token-d88f38a5-5347-4378-ab48-7dfe36759eff, rgba(43, 128, 255, .13));
  }
  .gv-menu .gv-menu-cta {
    justify-content: center; margin-top: 4px; font-weight: 600;
    background: var(--token-829b62bd-4ba9-4a4c-9b21-14ad134a2426, #1a4bed);
    color: var(--token-a0ba8a14-548b-41a2-ba86-b47d8bcfc7ff, #fff);
  }

  /* Os pop-outs 2 e 3 são só imagem: neste tamanho tapavam o telemóvel. */
  [data-framer-name="Pop-out 2"], [data-framer-name="Pop-out 3"] { display: none !important; }

  /* ── FILAS QUE TÊM DE EMPILHAR ──
     A origem trocava estas filas por variantes de telemóvel no cliente; o
     espelho só trouxe a versão de secretária. Aqui empilham-se, mantendo as
     medidas e o espaçamento do template. */

  /* planos: a bancada de três colunas */
  .framer-2rce9f { flex-direction: column !important; align-items: stretch !important; }
  .framer-2rce9f > * { width: 100% !important; flex: none !important; }

  /* testemunhos: a fotografia por cima da citação */
  .framer-1dhd7of { flex-direction: column !important; align-items: flex-start !important; }
  .framer-1dhd7of > * { width: 100% !important; flex: none !important; }
  .framer-pooddb { flex-direction: row !important; align-items: center !important; }

  /* chamada final: telemóvel em cima, cartão em baixo, QR sob o texto */
  .framer-EnNYW.framer-1k7348c { flex-direction: column !important; align-items: center !important; }
  .framer-EnNYW.framer-1k7348c > * { width: 100% !important; flex: none !important; }
  .framer-1xn5ycg { flex-direction: column !important; align-items: flex-start !important; gap: 24px; }
  .framer-1xn5ycg > * { width: 100% !important; flex: none !important; }
  .framer-63bjyb { max-width: 220px; }

  /* rodapé: as quatro colunas em duas, e a barra de baixo em coluna */
  .framer-18rtr5c { flex-wrap: wrap !important; gap: 28px 20px !important; }
  .framer-18rtr5c > * { flex: 1 1 calc(50% - 20px) !important; width: auto !important; min-width: 0; }
  /* Abaixo dos 430px as duas colunas ficam com 109px e as etiquetas partem-se
     mal («Documentaçã/o», «Quadro / de / Honra»). Uma coluna só: o rodapé fica
     mais alto e cada rótulo cabe numa linha. */
  @media (max-width: 430px) {
    .framer-18rtr5c > * { flex: 1 1 100% !important; }
  }
  .framer-cwl5v9 { flex-direction: column !important; align-items: flex-start !important; gap: 10px; }
  .framer-cwl5v9 > * { width: 100% !important; flex: none !important; }
  footer .framer-34wh23, footer .framer-1rwiudr { white-space: normal; }
  /* O texto a rolar precisa de `overflow:hidden` para esconder o duplicado —
     numa coluna estreita isso cortava as palavras. Aqui o efeito sai e fica
     texto normal, que quebra à vontade. */
  footer .gv-roll {
    display: block; width: auto; max-width: 100%; height: auto;
    overflow: visible; white-space: normal; text-shadow: none;
  }
  footer .gv-roll span { display: inline; white-space: normal; transform: none !important; }
}

@media (min-width: 810px) and (max-width: 1199px) {
  /* Na largura de tablete a bancada de planos cabe em duas colunas. */
  .framer-2rce9f { flex-wrap: wrap; justify-content: center; }
  .framer-2rce9f > * { flex: 1 1 300px; }
}

/* ─────────── texto a rolar (nav e rodapé) ─────────── */
.gv-roll {
  --line: 1.5em;
  box-sizing: border-box; margin: 0; padding: 0; vertical-align: top;
  display: flex; overflow: hidden; width: max-content; height: 1.5em;
  font-family: "Inter", sans-serif; font-size: 16px; font-weight: 500;
  letter-spacing: 0; user-select: none;
  color: var(--token-251f39c5-6e24-4f71-944a-36c2aa1dd073, #2a2a2a);
  text-shadow: 0 var(--line) 0 currentColor;
}
/* no rodapé (fundo escuro) a mesma peça pede o cinzento claro da paleta */
footer .gv-roll { color: var(--token-54162613-ea2b-402f-8b58-294584ec5be7, #a1a1a1); }
footer a:hover .gv-roll { color: var(--token-a0ba8a14-548b-41a2-ba86-b47d8bcfc7ff, #fff); }
.gv-roll span {
  display: block; backface-visibility: hidden; white-space: pre; flex-shrink: 0;
  font: inherit; line-height: 1.5em; color: currentColor;
  transition: transform .32s cubic-bezier(.44, 0, .56, 1);
  transition-delay: calc(var(--i) * 18ms);
}
a:hover .gv-roll span, a:focus-visible .gv-roll span { transform: translateY(calc(var(--line) * -1)); }

/* ─────────── entradas (a física medida na origem) ─────────── */
/* A regra: só transform e opacidade animam; o estado escondido chega por JS. */
[data-gv-in] {
  transition: transform .4s cubic-bezier(.44, 0, .56, 1), opacity .4s cubic-bezier(.44, 0, .56, 1);
}

/* ─────────── ciclos contínuos ─────────── */
@keyframes gv-bob { 0%, 100% { transform: translateY(0); } 50% { transform: translateY(var(--amp, 34px)); } }
@keyframes gv-pulse { 0%, 100% { transform: scale(1); opacity: .85; } 50% { transform: scale(1.12); opacity: 1; } }
@keyframes gv-drift-r { 0%, 100% { transform: translateX(0); } 50% { transform: translateX(var(--amp, 26px)); } }
@keyframes gv-drift-l { 0%, 100% { transform: translateX(0); } 50% { transform: translateX(calc(var(--amp, 26px) * -1)); } }
@keyframes gv-float {
  0%   { transform: translate3d(0, 0, 0) rotate(0deg) scale(1); }
  25%  { transform: translate3d(var(--fx, 5px), calc(var(--fy, 9px) * -1), 0) rotate(var(--fr, 0deg)) scale(.985); }
  50%  { transform: translate3d(0, var(--fy, 9px), 0) rotate(0deg) scale(.97); }
  75%  { transform: translate3d(calc(var(--fx, 5px) * -1), calc(var(--fy, 9px) * -.6), 0) rotate(calc(var(--fr, 0deg) * -1)) scale(.99); }
  100% { transform: translate3d(0, 0, 0) rotate(0deg) scale(1); }
}

.gv-loop { animation-duration: var(--dur, 6s); animation-delay: var(--delay, 0s);
  animation-iteration-count: infinite; animation-timing-function: cubic-bezier(.42, 0, .58, 1); }
.gv-bob    { animation-name: gv-bob; }
.gv-pulse  { animation-name: gv-pulse; }
.gv-drift-r { animation-name: gv-drift-r; }
.gv-drift-l { animation-name: gv-drift-l; }
.gv-float  { animation-name: gv-float; }

/* Os globos são estáticos a 0,8. Os CÍRCULOS do «Globe» RODAM — medido na origem
   a 2026-09-04 com os símbolos SVG visíveis (a medição anterior foi feita com os
   anéis por desenhar, use de largura 0): 36°/s, o do meio ao contrário. */
[data-framer-name="Globe"] { animation: none !important; }

/* ─────────── a órbita da prova social ───────────
   Na origem estas oito fotografias são espalhadas por um componente de scroll
   do Framer; o espelho congelou-as todas no centro, empilhadas por cima do
   título. Aqui ficam distribuídas pela órbita — que é o que a secção quer
   dizer — com uma flutuação lenta e fase própria em cada uma. */
/* `--gv-p` (0→1) é o avanço da secção, posto pelo script. O raio cresce com
   ele: as fotografias abrem a partir do centro à medida que a secção passa.
   É só `translate` — propriedade de composição, sem custo de layout. */
.framer-2ymfu6 { --gv-p: 1; }
.framer-2ymfu6 > * > * {
  --k: calc(1 + .13 * var(--gv-p));
  translate: calc(var(--x, 0px) * var(--k)) calc(var(--y, 0px) * var(--k));
  transition: translate .18s linear;
}
.framer-2ymfu6 > * > * > * {
  animation: gv-orbita var(--dur, 9s) var(--delay, 0s) infinite cubic-bezier(.42, 0, .58, 1);
}
@keyframes gv-orbita {
  0%, 100% { transform: translateY(0); }
  50% { transform: translateY(-14px); }
}
.framer-2ymfu6 > *:nth-child(1) > * { --x: 0px;     --y: -300px; }
.framer-2ymfu6 > *:nth-child(2) > * { --x: 332px;   --y: -212px; }
.framer-2ymfu6 > *:nth-child(3) > * { --x: 470px;   --y: 0px; }
.framer-2ymfu6 > *:nth-child(4) > * { --x: 332px;   --y: 212px; }
.framer-2ymfu6 > *:nth-child(5) > * { --x: 0px;     --y: 300px; }
.framer-2ymfu6 > *:nth-child(6) > * { --x: -332px;  --y: 212px; }
.framer-2ymfu6 > *:nth-child(7) > * { --x: -470px;  --y: 0px; }
.framer-2ymfu6 > *:nth-child(8) > * { --x: -332px;  --y: -212px; }
.framer-2ymfu6 > *:nth-child(1) > * > * { --dur: 8.2s;  --delay: 0s; }
.framer-2ymfu6 > *:nth-child(2) > * > * { --dur: 9.4s;  --delay: -1.1s; }
.framer-2ymfu6 > *:nth-child(3) > * > * { --dur: 8.8s;  --delay: -2.3s; }
.framer-2ymfu6 > *:nth-child(4) > * > * { --dur: 10.1s; --delay: -3.4s; }
.framer-2ymfu6 > *:nth-child(5) > * > * { --dur: 9.1s;  --delay: -4.6s; }
.framer-2ymfu6 > *:nth-child(6) > * > * { --dur: 8.5s;  --delay: -5.7s; }
.framer-2ymfu6 > *:nth-child(7) > * > * { --dur: 9.8s;  --delay: -6.9s; }
.framer-2ymfu6 > *:nth-child(8) > * > * { --dur: 8.9s;  --delay: -8s; }

@media (max-width: 1199px) {
  .framer-2ymfu6 > *:nth-child(1) > * { --x: 0px;    --y: -250px; }
  .framer-2ymfu6 > *:nth-child(2) > * { --x: 236px;  --y: -176px; }
  .framer-2ymfu6 > *:nth-child(3) > * { --x: 320px;  --y: 0px; }
  .framer-2ymfu6 > *:nth-child(4) > * { --x: 236px;  --y: 176px; }
  .framer-2ymfu6 > *:nth-child(5) > * { --x: 0px;    --y: 250px; }
  .framer-2ymfu6 > *:nth-child(6) > * { --x: -236px; --y: 176px; }
  .framer-2ymfu6 > *:nth-child(7) > * { --x: -320px; --y: 0px; }
  .framer-2ymfu6 > *:nth-child(8) > * { --x: -236px; --y: -176px; }
}
@media (max-width: 809px) {
  /* em coluna estreita a órbita vira duas filas acima e duas abaixo do título */
  .framer-2ymfu6 > * > * { --k: 1; }
  .framer-2ymfu6 > *:nth-child(1) > * { --x: -88px;  --y: -270px; }
  .framer-2ymfu6 > *:nth-child(2) > * { --x: 88px;   --y: -270px; }
  .framer-2ymfu6 > *:nth-child(3) > * { --x: -112px; --y: -145px; }
  .framer-2ymfu6 > *:nth-child(4) > * { --x: 112px;  --y: -145px; }
  .framer-2ymfu6 > *:nth-child(5) > * { --x: -112px; --y: 160px; }
  .framer-2ymfu6 > *:nth-child(6) > * { --x: 112px;  --y: 160px; }
  .framer-2ymfu6 > *:nth-child(7) > * { --x: -88px;  --y: 290px; }
  .framer-2ymfu6 > *:nth-child(8) > * { --x: 88px;   --y: 290px; }
}

/* ─────────── acordeão das perguntas ───────────
   Fechada, a origem tira a resposta do fluxo (position:absolute). Abrir é
   devolvê-la ao fluxo. Sem JS nenhuma resposta fica escondida por omissão:
   o estado fechado é posto pelo componente, e o botão é operável por teclado. */
[data-gv-faq] [data-gv-faq-botao] { cursor: pointer; }
/* FECHADA, a resposta não pode deixar rasto. Tirá-la do fluxo
   (`position:absolute`, como faz a origem) não chega: a caixa continua
   desenhada na posição estática, e quando a PERGUNTA ocupa duas linhas essa
   posição cai dentro do cartão — via-se a primeira linha da resposta cortada
   por baixo da pergunta («A campanha do estabelecimento fica aberta até…»).
   Com uma pergunta de uma linha caía fora e não se dava por isso; daí parecer
   um defeito só das páginas novas, onde as perguntas são mais longas.
   Fecha-se a sério: sem altura, sem tinta e fora da árvore de acessibilidade. */
[data-gv-faq][data-aberto="0"] [data-gv-faq-corpo] {
  visibility: hidden; height: 0; overflow: hidden; pointer-events: none;
}
[data-gv-faq][data-aberto="1"] [data-gv-faq-corpo] {
  position: relative; inset: auto; width: 100%;
  visibility: visible; height: auto; overflow: visible; pointer-events: auto;
}
[data-gv-faq] [data-framer-name="Vertical Line"] {
  transition: transform .3s cubic-bezier(.44, 0, .56, 1);
}
[data-gv-faq][data-aberto="1"] [data-framer-name="Vertical Line"] { transform: rotate(90deg); }

/* ─────────── alternador dos planos ───────────
   Os rótulos da Gotiva são mais longos que os do template: a pílula deixa de
   ter largura fixa e passa a acompanhar o texto. */
.framer-16julpl { width: max-content; }
[data-gv-planos] [data-gv-ciclo] { cursor: pointer; white-space: nowrap; }
[data-gv-planos] [data-gv-ciclo][aria-pressed="false"] { opacity: .62; }
/* Os dois pacotes são desenhados no servidor; mostra-se um. Sem JS fica o
   primeiro, completo — nunca uma tabela vazia.
   Sem `[data-gv-planos]` à frente de propósito: a matriz da /planos é uma
   SECÇÃO à parte dos cartões e obedece ao mesmo interruptor. Só os cartões e
   as linhas da matriz usam `data-pacote`. */
[data-pacote][data-activo="0"] { display: none; }

/* ─────────── mais dinamismo: o hover dos cartões ───────────
   O «por cima» que o dono pediu, acrescentado à física da origem e não a
   substituí-la. Só transform — o compositor trata, os FPS não sofrem. */
[data-gv-hover] { transition: transform .35s cubic-bezier(.44, 0, .56, 1); }
@media (hover: hover) and (prefers-reduced-motion: no-preference) {
  [data-gv-hover]:hover { transform: translateY(-6px) scale(1.02); }
  [data-gv-faq]:hover [data-framer-name="Icon Container"] { transform: scale(1.12); }
  [data-framer-name="Icon Container"] { transition: transform .3s cubic-bezier(.44, 0, .56, 1); }
}

/* ─────────── formulário de contacto: consentimento e avisos ───────────
   O componente do formulário foi acabado à mão (consentimento RGPD, avisos e
   erro por campo) mas as classes dessas peças nunca chegaram a ter folha: o
   visitante via uma caixa de selecção colada ao texto e mensagens de erro em
   estilo de browser. A marcação não se toca — só se veste. */
.gv-consent {
  display: flex; align-items: flex-start; gap: 10px;
  margin: 4px 0 4px; cursor: pointer;
  color: var(--token-33dd8bbf-28f6-4335-9fe1-a101f8afe904, #6a6a6a);
}
.gv-consent input[type="checkbox"] {
  flex: 0 0 auto; width: 18px; height: 18px; margin: 2px 0 0;
  accent-color: var(--token-829b62bd-4ba9-4a4c-9b21-14ad134a2426, #1a4bed);
  cursor: pointer;
}
/* alvo de toque sem mexer na caixa desenhada */
.gv-consent { position: relative; min-height: 44px; align-content: center; }
.gv-consent a { color: var(--token-829b62bd-4ba9-4a4c-9b21-14ad134a2426, #1a4bed); }

.gv-form-erro {
  margin: 6px 0 0; font-size: 13px; line-height: 1.4;
  color: #b3261e;   /* 6,4:1 sobre o branco do cartão */
}
.gv-form-aviso {
  border-radius: 14px; padding: 12px 16px; margin: 0 0 4px;
  border: 1px solid transparent;
}
.gv-form-aviso p { margin: 0; }
.gv-form-aviso--ok {
  background: rgba(26, 75, 237, .07);
  border-color: rgba(26, 75, 237, .22);
  color: var(--token-251f39c5-6e24-4f71-944a-36c2aa1dd073, #2a2a2a);
}
.gv-form-aviso--erro {
  background: rgba(179, 38, 30, .07);
  border-color: rgba(179, 38, 30, .25);
  color: #8c1d18;
}

/* ─────────── alvos de toque de 44px ───────────
   Sem mexer na caixa: a área cresce por um pseudo-elemento. */
[data-gv-ciclo], [data-gv-faq-botao] { position: relative; }
[data-gv-ciclo]::after, [data-gv-faq-botao]::after {
  content: ''; position: absolute; left: 0; right: 0; top: 50%;
  height: 44px; transform: translateY(-50%);
}

/* As doze ligações do rodapé: a caixa tem a altura da letra (24px) e as ligações
   seguem-se de 32 em 32px. No telemóvel é pouco para o polegar.
   O truque do pseudo-elemento NÃO serve aqui: 44px em caixas a 32px de
   distância faz as áreas SOBREPOREM-SE, e o dedo acerta sempre na vizinha —
   medido, dava 0/12. Como a coluna é nossa (é o `gotiva.css` que empilha o
   rodapé abaixo dos 810px), cresce-se a própria caixa: a coluna fica mais alta
   e cada ligação passa a ter 44px SÓ seus. */
@media (max-width: 810px) {
  .framer-zBkCR.framer-2qutug {
    min-height: 44px; display: inline-flex; align-items: center;
    /* `max-content` de propósito: com os pontos de quebra que o <wbr> abriu, um
       item flex encolhe até à palavra mais larga («Estadias», 68px) e o rótulo
       parte-se em três linhas mesmo tendo a coluna inteira disponível. Assim
       fica numa linha quando cabe, e só quebra quando não cabe mesmo. */
    width: max-content; max-width: 100%;
  }
}

/* ─────────── travão geral ─────────── */
@media (prefers-reduced-motion: reduce) {
  *, *::before, *::after {
    animation-duration: .001ms !important; animation-iteration-count: 1 !important;
    transition-duration: .001ms !important; scroll-behavior: auto !important;
  }
  [data-gv-in] { opacity: 1 !important; transform: none !important; }
}

/* ─────────── nunca uma barra horizontal ─────────── */
html, body { max-width: 100%; overflow-x: hidden; }

/* ─────────── interruptor dos pacotes: o rótulo INACTIVO ───────────
   A origem pinta os dois rótulos de branco: o activo assenta numa pílula
   escura e lê-se; o inactivo fica branco sobre branco — contraste medido de
   1,05:1, ou seja, texto invisível. O estado já vem no `aria-pressed`, por
   isso basta pintar o inactivo com o cinzento de texto apagado da casa
   (4,7:1). Não se toca no componente gerado: isto é camada da casa. */
[data-gv-ciclo][aria-pressed="false"] p.framer-text {
  --framer-text-color: #6a6a6a;
  color: #6a6a6a;
}

/* ─────────── a nuvem da abertura não pode esticar-se ───────────
   A abertura é UM componente para as 8 páginas. Em páginas altas (o Quadro de
   Honra tem 5710px) o bloco da nuvem não tinha altura travada e a imagem —
   1440×639 de origem — era desenhada a 1440×4815, DUAS vezes. O browser
   reescalava essa área a cada fotograma: media-se 9,8 fps a fazer scroll.
   Travar a altura e cortar o que sobra devolve o scroll a 60 fps sem mexer
   no desenho (a nuvem é decorativa e só se vê no topo). */
header.framer-t3upjo .framer-132o8yp {
  max-height: 100%;
  overflow: hidden;
}
header.framer-t3upjo figure.framer-o427iu {
  max-height: 640px;
}

/* ─────────── os anéis do «Globe» rodam ───────────
   Medido na origem: 36°/s (10 s por volta), o do meio no sentido contrário.
   A animação sobrepõe-se ao transform inline (translate -50%) — por isso o
   translate repete-se nos keyframes. */
@keyframes gv-roda { from { transform: translate(-50%, -50%) rotate(0deg); } to { transform: translate(-50%, -50%) rotate(360deg); } }
@keyframes gv-roda-inv { from { transform: translate(-50%, -50%) rotate(0deg); } to { transform: translate(-50%, -50%) rotate(-360deg); } }
[data-framer-name="Outer Circle"], [data-framer-name="Inner Circle"] { animation: gv-roda 10s linear infinite; will-change: transform; }
[data-framer-name="Middle Circle"] { animation: gv-roda-inv 10s linear infinite; will-change: transform; }
@media (prefers-reduced-motion: reduce) { [data-framer-name="Outer Circle"], [data-framer-name="Middle Circle"], [data-framer-name="Inner Circle"] { animation: none; } }

/* ─────────── /planos: os cartões colam à abertura ───────────
   A secção dos cartões é a mesma da home («Pricing», padding-top 160px porque lá
   vem depois dos testemunhos). Na página de preços a origem usa 48px — medido:
   «Pricing Cards» 48/80. A raiz .framer-ewjo3w é a da página pricing. */
main.framer-ewjo3w section[data-framer-name="Pricing "] { padding-top: 48px; }
