/* Folha partilhada pelas duas páginas de público: agentes.html e
   imobiliarias.html.

   Partilhada de propósito, e não copiada uma para cada: as duas contam a
   mesma história a públicos diferentes, e se cada uma tivesse o seu CSS
   começavam a afastar-se à primeira alteração. O que muda entre elas é o
   texto e mais nada.

   Não usam o runtime x-dc da landing. Não têm estado nenhum para gerir, e
   carregar React e um compilador de JSX para mostrar texto seria pagar duas
   vezes. O fundo, o topo e o rodapé são os mesmos das páginas legais. */

* { margin: 0; padding: 0; box-sizing: border-box; }
/* Sem color-scheme, o dark mode forçado do browser inverte o branco para preto. */
html { color-scheme: dark; }
/* 2026-09-13: o scroll suave so liga depois do load (classe posta pelo nav.js).
   Desde o inicio, a chegada por ancora (#cookies, /#clientes) virava um scroll
   suave que ficava a meio. */
html.suave { scroll-behavior: smooth; }
body {
  background: #0A0A0B;
  color: #F2F3F5;
  font-family: 'Plus Jakarta Sans', system-ui, sans-serif;
  line-height: 1.65;
  overflow-x: hidden;
  -webkit-font-smoothing: antialiased;
}
:root {
  --e-saida: cubic-bezier(.22,1,.36,1);
  --gutter: 22px;
}

/* ── O mesmo fundo animado do site ──────────────────────────────────────
   CSS puro, com os mesmos blobs, cores e tempos do aurora-background.jsx.
   Igual ao da legal.css: se um dia mudar, muda nos dois sítios. */
#fundo { position: fixed; inset: 0; z-index: 0; overflow: hidden; background: #0A0A0B; pointer-events: none; }
#fundo .pulso {
  position: absolute; inset: 0; opacity: .5;
  background-image:
    radial-gradient(circle at 30% 25%, rgba(255,255,255,.10) 0%, transparent 80%),
    radial-gradient(circle at 72% 70%, rgba(180,186,196,.08) 0%, transparent 80%);
  animation: auroraPulse 8s ease-in-out infinite;
}
#fundo .bolha { position: absolute; border-radius: 50%; filter: blur(64px); will-change: transform; }
#fundo .b1 { top: -25%; left: -25%; width: 50%; height: 50%; background: #3A3A3F; opacity: .4; animation: auroraBlobA 30s ease-in-out infinite alternate; }
#fundo .b2 { bottom: -25%; right: -25%; width: 50%; height: 50%; background: #26262A; opacity: .4; animation: auroraBlobB 40s ease-in-out infinite alternate; }
#fundo .b3 { top: 33%; left: 33%; width: 34%; height: 34%; background: #4A4A52; opacity: .3; animation: auroraBlobC 50s ease-in-out infinite alternate; }
#fundo .estrela { position: absolute; width: 2px; height: 2px; border-radius: 50%; background: #fff; opacity: 0; animation-name: auroraTwinkle; animation-iteration-count: infinite; animation-timing-function: ease-in-out; }

@keyframes auroraPulse { 0%, 100% { opacity: .5 } 50% { opacity: .28 } }
@keyframes auroraBlobA { from { transform: translate(-50px,-20px) scale(1) } to { transform: translate(50px,20px) scale(1.2) } }
@keyframes auroraBlobB { from { transform: translate(50px,20px) scale(1) } to { transform: translate(-50px,-20px) scale(1.3) } }
@keyframes auroraBlobC { from { transform: translate(20px,-30px) rotate(0) } to { transform: translate(-20px,30px) rotate(360deg) } }
@keyframes auroraTwinkle { 0%, 100% { opacity: 0 } 50% { opacity: var(--peak, .8) } }

@media (hover: none) { #fundo .bolha { filter: blur(36px); } }

/* Tudo o que é conteúdo fica por cima do fundo. */
main, .rodape { position: relative; z-index: 1; }

/* O topo destas páginas passou a ser a pílula da home, em /nav.css. A barra
   escura que aqui vivia — logótipo + "Voltar ao site" — saiu a 2026-09-06:
   eram duas navbars no mesmo site. */

main { max-width: 820px; margin: 0 auto; padding: 0 var(--gutter); }

/* ── Aparecimento por scroll ─────────────────────────────────────────────
   O mesmo gesto da landing, sem o runtime: um IntersectionObserver no fim do
   documento acrescenta .visivel. O estado inicial só é aplicado quando o JS
   arranca (.js-anima no <html>), para quem tiver o JS bloqueado ver a página
   inteira em vez de uma folha em branco. */
.js-anima [data-entra] { opacity: 0; transform: translateY(20px); }
[data-entra] { transition: opacity .7s var(--e-saida), transform .8s var(--e-saida); }
[data-entra].visivel { opacity: 1; transform: none; }
/* Os pontos, os passos e as perguntas nascem um a um, e nao a secao toda de
   uma vez: cada um tem o seu observador e entra quando chega ao ecra. O
   atraso curto e para os que ja estao dentro do ecra quando a seccao chega
   nao aparecerem colados. */
.js-anima .recebes > div, .js-anima .passos li, .js-anima .perguntas details { transform: translateY(14px); }
.recebes > div:nth-child(2), .passos li:nth-child(2), .perguntas details:nth-child(2) { transition-delay: .06s; }
.recebes > div:nth-child(3), .passos li:nth-child(3), .perguntas details:nth-child(3) { transition-delay: .12s; }
.recebes > div:nth-child(4), .passos li:nth-child(4) { transition-delay: .18s; }
.recebes > div:nth-child(5) { transition-delay: .24s; }

/* ── Abertura ────────────────────────────────────────────────────────────
   Sem etiqueta em cápsula por cima do título: quem é o público diz-se na
   própria frase, que é onde as pessoas leem. */
.abertura { padding: 64px 0 0; }
.abertura h1 {
  font-size: clamp(36px, 6vw, 62px); font-weight: 700;
  line-height: 1.02; letter-spacing: -0.04em; text-wrap: balance;
  max-width: 15ch;
}
.abertura .lead {
  margin-top: 20px; max-width: 54ch;
  font-size: 18px; line-height: 1.6; color: rgba(242,243,245,0.76); text-wrap: pretty;
}
/* O orcamento logo na abertura (2026-09-11). No telemovel ocupa a largura
   toda, como o do hero da home. */
.abertura .botao-primario { margin-top: 28px; }
@media (max-width: 560px) { .abertura .botao-primario { width: 100%; } }

/* ── Botão de WhatsApp ───────────────────────────────────────────────────
   O mesmo da landing: face clara sobre fundo escuro. É a única acção destas
   páginas, e por isso é sempre esta forma. */
.zap {
  margin-top: 28px;
  display: inline-flex; align-items: center; justify-content: center; gap: 12px;
  padding: 18px 36px; border-radius: 100px; text-decoration: none;
  border: 1px solid rgba(255,255,255,0.5);
  background: linear-gradient(180deg, #FFFFFF 0%, #C3C8CF 55%, #9AA0A8 100%);
  box-shadow: 0 22px 50px -24px rgba(0,0,0,0.95), inset 0 1px 0 rgba(255,255,255,0.9);
  font-size: 14px; font-weight: 700; letter-spacing: 0.13em; text-transform: uppercase;
  color: #0A0A0A;
  transition: transform .3s ease, filter .3s ease;
  -webkit-tap-highlight-color: transparent;
}
.zap:hover { transform: scale(1.04); filter: brightness(1.1); color: #0A0A0A; }
.zap:active { transform: scale(.97); }
.zap svg { flex: none; }

/* ── Secções ─────────────────────────────────────────────────────────────
   Todas partem do mesmo espaçamento vertical. O que muda de secção para
   secção é a FORMA do conteúdo: lista com fios, passos numerados, cartão.
   Duas secções seguidas nunca têm o mesmo desenho. */
section { padding-top: 78px; }
.titulo {
  font-size: clamp(26px, 3.4vw, 38px); font-weight: 700;
  line-height: 1.1; letter-spacing: -0.03em; text-wrap: balance;
  margin-bottom: 26px;
}

/* Forma 1: o que recebes. Frase forte e a linha que a explica, separadas por
   um fio. Sem ícones e sem caixas. */
.recebes { display: flex; flex-direction: column; }
.recebes > div { padding: 20px 0; border-top: 1px solid rgba(242,243,245,0.10); }
.recebes > div:first-child { border-top: none; padding-top: 0; }
.recebes dt { font-size: 19px; font-weight: 600; letter-spacing: -0.018em; color: #F7F8FA; }
.recebes dd { margin: 7px 0 0; font-size: 16.5px; line-height: 1.6; color: rgba(242,243,245,0.68); text-wrap: pretty; max-width: 62ch; }

/* Forma 2: como funciona. Aqui os números são legítimos, porque é mesmo uma
   sequência: um acontece antes do outro.

   O número não vive dentro de uma bola. A bola obrigava-o a ser pequeno para
   caber, e um algarismo a 14px não é um número, é uma etiqueta. Fora dela
   pode ser grande, e a mesma chapa clara do botão principal passa a
   preenchê-lo por dentro, com background-clip: text. */
.passos { list-style: none; display: flex; flex-direction: column; gap: 34px; counter-reset: passo; }
.passos li { position: relative; padding-left: 68px; }
.passos li::before {
  counter-increment: passo;
  /* decimal-leading-zero: "01" tem peso de série, "1" tem peso de item solto. */
  content: counter(passo, decimal-leading-zero);
  position: absolute; left: 0; top: -8px;
  font-size: 40px; font-weight: 700; line-height: 1;
  letter-spacing: -0.055em; font-variant-numeric: tabular-nums;
  background: linear-gradient(180deg, #FFFFFF 0%, #C3C8CF 46%, rgba(154,160,168,0.45) 100%);
  -webkit-background-clip: text; background-clip: text;
  color: transparent;
}
/* O fio desce do número até ao passo seguinte. No último não há para onde ir.
   Cresce de cima para baixo quando o passo entra, como se estivesse a ser
   desenhado: é o gesto que liga um passo ao que vem a seguir. */
.passos li::after {
  content: ""; position: absolute; left: 21px; top: 42px; bottom: -34px;
  width: 1px; background: linear-gradient(180deg, rgba(255,255,255,0.26), rgba(255,255,255,0.04));
  transform-origin: top; transform: scaleY(1);
  transition: transform .8s var(--e-saida) .15s;
}
.js-anima .passos li[data-entra]::after { transform: scaleY(0); }
.js-anima .passos li[data-entra].visivel::after { transform: scaleY(1); }
.passos li:last-child::after { display: none; }
.passos b { display: block; font-size: 18px; font-weight: 600; letter-spacing: -0.015em; color: #F7F8FA; }
.passos p { margin-top: 6px; font-size: 16.5px; line-height: 1.6; color: rgba(242,243,245,0.68); text-wrap: pretty; max-width: 58ch; }

/* Forma 3: o cartão do pacote. Um só, e por isso pode ser largo e calmo. */
/* ── Dois pacotes lado a lado ────────────────────────────────────────────
   A pagina das imobiliarias vende o site da agencia, e o cartao dos agentes
   e o que vai la dentro ("Inclui tudo do Portfolio para Agentes") — mas nao
   estava a lado nenhum, e quem lia tinha de acreditar. Passa a estar,
   deitado ao lado do primeiro.

   O que se ve primeiro continua a ser o da agencia: o segundo cartao fica
   cortado no bordo, que e o que convida a arrastar. Um carrossel com setas
   escondia-o por completo e obrigava a descobrir que existia.

   scroll-snap para o arrasto parar em cima de um cartao e nao a meio dos
   dois. A barra de deslocacao sai porque a pista ja tem a borda do segundo
   cartao a dizer que ha mais. */
.pacotes-fila {
  display: flex; gap: 16px;
  overflow-x: auto; overscroll-behavior-x: contain;
  scroll-snap-type: x mandatory;
  /* O padding e o margin negativo deixam a sombra dos cartoes respirar sem
     encolher a pista: sem eles, o overflow cortava-a rente a borda. */
  padding: 6px 2px 14px; margin: -6px -2px -14px;
  scrollbar-width: none;
}
.pacotes-fila::-webkit-scrollbar { display: none; }
.pacotes-fila > .pacote {
  flex: 0 0 min(88%, 540px);
  scroll-snap-align: start;
}
/* A partir dos 1160px cabem os dois inteiros: deixa de haver pista. */
@media (min-width: 1160px) {
  .pacotes-fila { overflow-x: visible; }
  .pacotes-fila > .pacote { flex: 1 1 0; }
}
.pacotes-palco{ position:relative; }
/* A seta e a affordance do deslize: pousada sobre o bordo direito, em cima
   da espreitadela do segundo cartao. Some quando os dois cabem inteiros e
   quando ja se chegou ao fim — uma seta para lado nenhum e pior que nenhuma. */
.pacotes-seta{
  position:absolute; right:-4px; top:50%; transform:translateY(-50%); z-index:2;
  width:46px; height:46px; border-radius:50%; cursor:pointer; padding:0;
  display:flex; align-items:center; justify-content:center;
  color:#F2F3F5; background:rgba(20,20,23,.78); border:1px solid rgba(255,255,255,.22);
  backdrop-filter:blur(10px); -webkit-backdrop-filter:blur(10px);
  box-shadow:0 14px 30px -12px rgba(0,0,0,.8);
  transition:background .3s ease, border-color .3s ease, transform .3s ease;
}
.pacotes-seta:hover{ background:rgba(30,30,34,.9); border-color:rgba(255,255,255,.4); transform:translateY(-50%) scale(1.06); }
@media (min-width: 1160px){ .pacotes-seta{ display:none !important; } }

/* Uma linha a dizer o que ha para o lado. Some quando os dois ja cabem. */
.pacotes-pista {
  margin-top: 14px; font-size: 13.5px; letter-spacing: .02em;
  color: rgba(242,243,245,0.55);
}
@media (min-width: 1160px) { .pacotes-pista { display: none; } }

.pacote {
  border-radius: 24px; padding: 34px 32px;
  background: linear-gradient(155deg, #202023 0%, #141416 58%, #0A0A0B 100%);
  border: 1px solid rgba(255,255,255,0.16);
  box-shadow: inset 0 1px 0 rgba(255,255,255,0.14), 0 30px 60px -28px rgba(0,0,0,0.95);
}
.pacote h3 { font-size: clamp(22px, 2.6vw, 28px); font-weight: 700; letter-spacing: -0.03em; line-height: 1.14; }
.pacote > p { margin-top: 10px; font-size: 16px; line-height: 1.55; color: rgba(242,243,245,0.66); text-wrap: pretty; max-width: 52ch; }
.pacote ul { list-style: none; margin-top: 22px; display: flex; flex-direction: column; gap: 12px; }
.pacote li { display: flex; gap: 11px; font-size: 16px; line-height: 1.5; color: rgba(242,243,245,0.82); }
.pacote li::before { content: "✓"; color: #E8EAED; flex: none; }
.pacote .valores { margin-top: 24px; font-size: 15px; color: rgba(242,243,245,0.6); }

/* Forma 4: as perguntas. Gaveta nativa, como no cartão do cliente da
   landing: a resposta só ocupa espaço a quem a quer. */
.perguntas { display: flex; flex-direction: column; }
.perguntas details { border-top: 1px solid rgba(242,243,245,0.10); }
.perguntas details:last-child { border-bottom: 1px solid rgba(242,243,245,0.10); }
.perguntas summary {
  list-style: none; cursor: pointer;
  display: flex; align-items: center; justify-content: space-between; gap: 16px;
  padding: 20px 2px; font-size: 17px; font-weight: 600; letter-spacing: -0.015em;
  color: #F7F8FA; -webkit-tap-highlight-color: transparent;
  transition: color .25s ease;
}
.perguntas summary::-webkit-details-marker { display: none; }
.perguntas summary:hover { color: #FFFFFF; }
.perguntas summary:focus-visible { outline: 2px solid #F2F3F5; outline-offset: 2px; border-radius: 6px; }
.perguntas summary::after {
  content: ""; flex: none; width: 8px; height: 8px; margin-top: -4px;
  border-right: 1.8px solid rgba(242,243,245,0.6); border-bottom: 1.8px solid rgba(242,243,245,0.6);
  transform: rotate(45deg); transition: transform .3s var(--e-saida);
}
.perguntas details[open] summary::after { transform: rotate(-135deg); margin-top: 3px; }
.perguntas details p { padding: 0 2px 22px; font-size: 16.5px; line-height: 1.6; color: rgba(242,243,245,0.68); text-wrap: pretty; max-width: 62ch; }
/* A altura de um <details> não interpola: o que entra é o conteúdo. */
.perguntas details[open] p { animation: abre .3s var(--e-saida) both; }
@keyframes abre { from { opacity: 0; transform: translateY(-6px) } to { opacity: 1; transform: none } }

/* ── Perguntas em duas colunas ───────────────────────────────────────────
   O convite de um lado, as perguntas do outro. Numa coluna só, o convite
   ficava perdido no fim de uma lista de gavetas, e ninguém o lia.

   Sem a etiqueta "FAQ" em cápsula por cima do título: é o tique de template
   que a lista de banidos manda fora, e o título da secção já diz o que ali
   está. */
.faq { display: grid; grid-template-columns: minmax(0, 0.85fr) minmax(0, 1fr); gap: 34px 40px; align-items: start; }
/* Sem a coluna do convite, a das perguntas ocupa a largura toda: uma grelha
   de duas colunas com um filho só deixava metade da secção vazia. */
.faq:not(:has(.faq-lado)) { grid-template-columns: 1fr; }
.faq-lado { position: sticky; top: 90px; }
.faq-lado .texto { font-size: 16.5px; }
.faq-contacto {
  margin-top: 18px; display: inline-flex; align-items: center; gap: 10px;
  padding: 13px 20px; border-radius: 100px; text-decoration: none;
  font-size: 14.5px; font-weight: 600; color: rgba(242,243,245,0.86);
  background: rgba(255,255,255,0.05); border: 1px solid rgba(255,255,255,0.14);
  transition: background .3s ease, border-color .3s ease, color .3s ease, transform .3s var(--e-saida);
}
.faq-contacto:hover { background: rgba(255,255,255,0.095); border-color: rgba(255,255,255,0.3); color: #FFFFFF; transform: translateY(-2px); }
.faq-contacto:focus-visible { outline: 2px solid #F2F3F5; outline-offset: 3px; }
.faq .perguntas details:first-child { border-top: none; }

@media (max-width: 760px) {
  /* Numa coluna, o convite passa para DEPOIS das perguntas: ali é o remate
     de quem leu e não encontrou a sua, que é quando faz sentido perguntar. */
  .faq { grid-template-columns: 1fr; gap: 22px; }
  .faq-lado { position: static; order: 2; }
  .faq .perguntas { order: 1; }
  .faq-contacto { width: 100%; justify-content: center; }
}

/* ── Prova: o cliente ────────────────────────────────────────────────────
   Versão compacta do cartão da landing. Só entra onde é verdade: na página
   dos agentes. */
.cliente {
  display: flex; gap: 22px; align-items: flex-start;
  border-radius: 24px; padding: 28px 30px;
  background: linear-gradient(155deg, rgba(28,100,242,.10) 0%, rgba(20,20,22,.86) 46%, rgba(10,10,11,.95) 100%);
  border: 1px solid rgba(157,194,255,.20);
}
.cliente img {
  width: 62px; height: 62px; border-radius: 50%; object-fit: cover; flex: none;
  border: 1px solid rgba(157,194,255,.34);
  box-shadow: 0 0 0 4px rgba(28,100,242,.09);
}
.cliente blockquote { font-size: 18px; line-height: 1.45; font-weight: 600; letter-spacing: -0.02em; color: #F7F9FC; text-wrap: pretty; }
/* A frase de um caso sem testemunho: a mesma forma, sem aspas nem <blockquote>. */
.cliente .frase { margin: 0; font-size: 18px; line-height: 1.45; font-weight: 600; letter-spacing: -0.02em; color: #F7F9FC; text-wrap: pretty; }
/* O Tomas Marques leva a paleta do site dele (castanho quente), como na home. */
.cliente--tm { background: linear-gradient(155deg, rgba(196,92,58,.14) 0%, rgba(20,20,22,.86) 46%, rgba(10,10,11,.95) 100%); border-color: rgba(230,150,110,.22); }
.cliente--tm .sitio:hover { border-color: rgba(230,150,110,.6); }
.cliente--tm img { object-position: top; }
.cliente .quem { margin-top: 14px; font-size: 15px; font-weight: 700; color: #FFFFFF; }
.cliente .papel { font-size: 14px; color: rgba(242,243,245,.6); }
.cliente .sitio {
  margin-top: 14px; display: inline-flex; align-items: center; gap: 8px;
  font-size: 15px; font-weight: 600; text-decoration: none;
  color: rgba(157,194,255,.85); border-bottom: 1px solid rgba(157,194,255,.24); padding-bottom: 3px;
  transition: color .3s ease, border-color .3s ease;
}
.cliente .sitio:hover { color: #FFFFFF; border-color: rgba(157,194,255,.6); }
.cliente .sitio svg { transition: transform .3s var(--e-saida); }
.cliente .sitio:hover svg { transform: translate(2px,-2px); }

/* ── A porta para a página de detalhe ────────────────────────────────────
   Dentro do cartão, por baixo da lista. Não é um segundo botão a competir
   com o WhatsApp: é uma linha com um fio por baixo, que é como se lê um
   "continua". */
.ver-mais {
  align-self: flex-start; margin-top: 22px;
  display: inline-flex; align-items: center; gap: 9px;
  font-size: 15px; font-weight: 600; letter-spacing: -0.012em;
  color: rgba(242,243,245,0.86); text-decoration: none;
  border-bottom: 1px solid rgba(255,255,255,0.26); padding-bottom: 4px;
  transition: color .3s ease, border-color .3s ease;
}
.ver-mais:hover { color: #FFFFFF; border-color: rgba(255,255,255,0.6); }
.ver-mais:focus-visible { outline: 2px solid #F2F3F5; outline-offset: 4px; }
.ver-mais svg { transition: transform .3s var(--e-saida); }
.ver-mais:hover svg { transform: translateX(3px); }
.pacote { align-items: flex-start; display: flex; flex-direction: column; }
.pacote > * { width: 100%; }
.pacote .ver-mais { width: auto; }

/* ── Lista com gota de luz (2026-09-13) ──────────────────────────────────
   Substitui o cartão do pacote na página de agentes. Não são cards: é uma
   linha com pontos por onde uma luz branca desce. A luz acumula no ponto e
   CAI para o seguinte, e a queda é mais rápida do que a acumulação: é essa
   diferença que a faz ler como gota. Os keyframes são gerados no script da
   página (dependem do número de tópicos); aqui fica só a aparência.
   ⚠️ Cada tópico tem altura FIXA (--passo): com uma linha de texto ou duas,
   a gota aterra sempre no centro do ponto seguinte. */
.lista-luz {
  --passo: 3.5rem;
  --centro: 5px;
  position: relative; display: grid; list-style: none;
  margin: 26px 0 0; padding: 0 0 0 1.9rem; max-width: 56ch;
}
/* a linha que liga tópico a tópico, do centro do primeiro ao centro do último */
.lista-luz::before {
  content: ""; position: absolute; left: calc(var(--centro) - 0.5px); top: calc(var(--passo) / 2);
  height: calc(100% - var(--passo)); width: 1px; background: rgba(255,255,255,0.18);
}
.lista-luz__item {
  position: relative; display: flex; align-items: center;
  min-height: var(--passo); height: var(--passo);
}
.lista-luz__marca {
  position: absolute; left: calc(-1.9rem + var(--centro) - 4.5px); top: calc(50% - 4.5px);
  width: 9px; height: 9px; border-radius: 50%; background-color: rgba(255,255,255,0.35);
}
.lista-luz__titulo {
  margin: 0; font-size: 16px; font-weight: 600; line-height: 1.4; letter-spacing: -0.01em;
  color: rgba(242,243,245,0.88); text-wrap: pretty;
}
/* A gota. Arranca no centro do primeiro ponto; o trajeto vem do script. */
.lista-luz__gota {
  position: absolute; z-index: 1; left: calc(var(--centro) - 4.5px); top: calc(var(--passo) / 2 - 4.5px);
  width: 9px; height: 9px; border-radius: 50%;
  background: radial-gradient(circle, #F2F3F5 0%, rgba(242,243,245,0.45) 55%, transparent 74%);
  box-shadow: 0 0 10px 2px rgba(242,243,245,0.45);
  transform-origin: 50% 20%; opacity: 0; pointer-events: none; will-change: transform;
  animation-timing-function: cubic-bezier(.55, 0, .35, 1); animation-iteration-count: infinite;
}
/* Os tópicos entram um a um, como os passos, mas SEM deslocação: a gota é
   absoluta ao <ul> e os pontos vivem nos <li>; se os <li> descessem ao
   entrar, a gota pousava acima do ponto. Só opacidade. */
.js-anima .lista-luz__item { transform: none; }
.lista-luz__item { transition: opacity .7s var(--e-saida); }
.lista-luz__item:nth-child(3) { transition-delay: .05s; }
.lista-luz__item:nth-child(4) { transition-delay: .10s; }
.lista-luz__item:nth-child(5) { transition-delay: .15s; }
.lista-luz__item:nth-child(6) { transition-delay: .20s; }
.lista-luz__item:nth-child(7) { transition-delay: .25s; }
.lista-luz__item:nth-child(8) { transition-delay: .30s; }
.lista-luz + .ver-exemplos { margin-top: 30px; }
.lista-luz ~ .valores { margin-top: 18px; font-size: 15px; color: rgba(242,243,245,0.6); }

/* ── O botão dos exemplos ────────────────────────────────────────────────
   Uma pílula do tamanho do WhatsApp, mas em contorno: notória sem competir
   com a acção principal. */
.ver-exemplos {
  display: inline-flex; align-items: center; justify-content: center; gap: 10px;
  padding: 18px 36px; border-radius: 100px;
  border: 1.5px solid rgba(255,255,255,0.55); background: rgba(255,255,255,0.04);
  font-size: 14px; font-weight: 700; letter-spacing: .13em; text-transform: uppercase;
  color: #F2F3F5; text-decoration: none;
  transition: border-color .3s ease, background-color .3s ease, transform .3s var(--e-saida);
}
.ver-exemplos:hover { border-color: #FFFFFF; background: rgba(255,255,255,0.10); transform: translateY(-1px); }
.ver-exemplos:focus-visible { outline: 2px solid #F2F3F5; outline-offset: 4px; }
.ver-exemplos svg { transition: transform .3s var(--e-saida); }
.ver-exemplos:hover svg { transform: translateX(3px); }
@media (max-width: 720px) {
  .ver-exemplos { width: 100%; padding: 19px 20px; }
  .lista-luz { max-width: none; }
}

/* ── Voltar, no topo de uma página de detalhe ────────────────────────────*/
.voltar-pagina {
  display: inline-flex; align-items: center; gap: 8px;
  margin-top: 30px; min-height: 44px;
  font-size: 14.5px; color: rgba(242,243,245,0.6); text-decoration: none;
  transition: color .25s ease;
}
.voltar-pagina:hover { color: #F2F3F5; }
.voltar-pagina svg { transition: transform .3s var(--e-saida); }
.voltar-pagina:hover svg { transform: translateX(-3px); }

/* Parágrafo corrido das páginas de detalhe. */
.texto { max-width: 64ch; font-size: 17px; line-height: 1.65; color: rgba(242,243,245,0.74); text-wrap: pretty; }
.texto + .texto { margin-top: 16px; }
/* CONVERSAO-5: o `* { margin: 0 }` colava a linha ao que vem a seguir. */
.titulo + .texto { margin-bottom: 22px; }
.conversa + .texto { margin-top: 30px; }
.texto + .conversa, .texto + .passos { margin-top: 30px; }

/* ── A conversa ──────────────────────────────────────────────────────────
   A pré-visualização de um link não é uma coisa que se veja num site: é uma
   coisa que se vê na conversa de quem a recebe. Mostrá-la fora de uma
   conversa era mostrar metade do assunto, e por isso a moldura faz parte do
   exemplo.

   As imagens são os cartões VERDADEIROS dos sites que entregámos, servidos
   daqui. Não são maquetas: é o mesmo ficheiro que o WhatsApp vai buscar. */
.conversa {
  margin-top: 26px; max-width: 460px;
  display: flex; flex-direction: column; align-items: flex-start; gap: 12px;
  padding: 20px 18px; border-radius: 22px;
  background: rgba(255,255,255,0.028);
  border: 1px solid rgba(255,255,255,0.08);
}
.balao { max-width: 92%; }
/* A mensagem escrita antes do link. Encostada à direita, como a de quem
   envia, para se perceber de que lado da conversa está cada coisa. */
.balao--dito {
  align-self: flex-end; margin-left: auto;
  padding: 11px 16px; border-radius: 18px 18px 5px 18px;
  background: rgba(255,255,255,0.10);
  font-size: 15px; line-height: 1.4; color: #F2F3F5;
}
/* O cartão do link. Fundo claro de propósito: é assim que ele aparece na
   maioria das aplicações de mensagens, e é o contraste com o escuro à volta
   que o faz ler-se como uma coisa recebida e não como parte do site. */
.balao--link {
  align-self: flex-start; width: 100%; max-width: 340px;
  display: block; overflow: hidden; text-decoration: none;
  border-radius: 16px 16px 16px 5px;
  background: #EDEEF0;
  box-shadow: 0 12px 30px -18px rgba(0,0,0,0.9);
  transition: transform .3s var(--e-saida), box-shadow .3s ease;
}
.balao--link:hover { transform: translateY(-2px); box-shadow: 0 18px 38px -18px rgba(0,0,0,0.95); }
.balao--link:focus-visible { outline: 2px solid #F2F3F5; outline-offset: 3px; }
.balao--link img { display: block; width: 100%; height: auto; aspect-ratio: 1200 / 630; object-fit: cover; }
.balao-corpo {
  display: block; padding: 11px 14px 13px;
  background: linear-gradient(180deg, #EDEFF3 0%, #DFE4EC 100%);
}

/* No comparador, a tira da legenda é UMA só, partilhada pelos dois lados: o
   texto não se corta, senão lia-se metade de um título e metade do outro.
   O que se corta é a COR, que é fundo e não texto: a metade do lado tratado
   leva o véu azulado, e a do lado por tratar fica em branco liso, que é o
   que sai de um portal. */
.balao--comparado .balao-corpo { position: relative; background: #FFFFFF; }
.balao--comparado .balao-corpo::before {
  content: ""; position: absolute; inset: 0; pointer-events: none;
  background: linear-gradient(180deg, #E4EAF4 0%, #D2DBE9 100%);
  clip-path: inset(0 0 0 var(--pos, 50%));
}
.balao--comparado .balao-titulo, .balao--comparado .balao-sitio { position: relative; z-index: 1; }
.balao-titulo {
  display: block; font-size: 14.5px; font-weight: 700; line-height: 1.3;
  letter-spacing: -0.012em; color: #16181C;
  /* Duas linhas, como nas aplicações de mensagens: a terceira é cortada lá
     também, e um exemplo que mostrasse o título inteiro estaria a mentir. */
  display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden;
}
.balao-sitio { display: block; margin-top: 3px; font-size: 13px; color: #6B7078; }

@media (max-width: 720px) {
  .texto { font-size: 16.5px; }
  .conversa { padding: 16px 14px; border-radius: 18px; }
  .balao--link { max-width: none; }
}

/* ── Frase em destaque ───────────────────────────────────────────────────
   Um parágrafo a seguir ao outro, todos do mesmo tamanho, lê-se como um
   muro. De vez em quando uma frase sai da fila: maior, mais clara, e com um
   fio à esquerda que diz onde ela começa. É o descanso do olho, e é sempre a
   frase que interessa se a pessoa só ler uma. */
.destaque {
  margin-top: 26px; max-width: 34ch;
  padding-left: 20px; border-left: 2px solid rgba(255,255,255,0.34);
  font-size: clamp(20px, 2.4vw, 27px); font-weight: 600;
  line-height: 1.28; letter-spacing: -0.028em; color: #F7F9FC; text-wrap: balance;
}
.destaque + .texto, .destaque + .conversa, .destaque + .previas { margin-top: 26px; }

/* ── Títulos que nascem palavra a palavra ────────────────────────────────
   O mesmo gesto dos títulos da landing. Cada palavra é um bloco próprio para
   poder ter o seu atraso; o espaço entre elas fica no markup e não em
   margens, senão partia a entrelinha em ecrãs estreitos. */
[data-palavras] span { display: inline-block; }
.js-anima [data-palavras] span { opacity: 0; transform: translateY(18px); }
[data-palavras] span { transition: opacity .5s var(--e-saida), transform .66s cubic-bezier(.22,1.2,.36,1); }
[data-palavras].visivel span { opacity: 1; transform: none; }
[data-palavras].visivel span:nth-child(1) { transition-delay: .02s }
[data-palavras].visivel span:nth-child(2) { transition-delay: .06s }
[data-palavras].visivel span:nth-child(3) { transition-delay: .10s }
[data-palavras].visivel span:nth-child(4) { transition-delay: .14s }
[data-palavras].visivel span:nth-child(5) { transition-delay: .18s }
[data-palavras].visivel span:nth-child(6) { transition-delay: .22s }
[data-palavras].visivel span:nth-child(7) { transition-delay: .26s }
[data-palavras].visivel span:nth-child(8) { transition-delay: .30s }
[data-palavras].visivel span:nth-child(n+9) { transition-delay: .34s }

/* ── O título a ser escrito ──────────────────────────────────────────────
   Cada letra é uma caixa própria, agrupada por palavra com nowrap: sem esse
   agrupamento a linha partia a meio de uma palavra, porque o browser deixa
   de saber onde uma acaba.

   O que anima é uma transição com atraso por letra, e não um temporizador
   por letra: quarenta despertadores a disputar a mesma linha de execução com
   o scroll dão exactamente o contrário de fluido.

   O desfoque é o que faz a letra "assentar" em vez de piscar. É curto e sobre
   texto pequeno em número, por isso não se paga a rasterização repetida. */
.letra-palavra { display: inline-block; white-space: nowrap; }
.letra { display: inline-block; white-space: pre; }
[data-escrever] .letra {
  opacity: 0; transform: translateY(0.14em);
  filter: blur(4px);
  transition: opacity .34s ease, transform .38s var(--e-saida), filter .34s ease;
}
[data-escrever].a-escrever .letra { opacity: 1; transform: none; filter: blur(0); }
/* Sem cursor. O espaço das letras é reservado desde o início (senão o texto
   por baixo dava saltos a cada letra), e por isso um cursor no fim do bloco
   ficava pendurado longe de onde a escrita vai, o que se lê como um erro. As
   letras a nascer já dizem sozinhas que aquilo está a ser escrito. */

/* Os parágrafos de uma secção nascem um a seguir ao outro, e não todos ao
   mesmo tempo: é o que dá a leitura em vez do bloco. */
.texto[data-entra], .destaque[data-entra] { transition-delay: .04s; }
.texto[data-entra] + .texto[data-entra] { transition-delay: .12s; }
.texto[data-entra] + .texto[data-entra] + .texto[data-entra] { transition-delay: .2s; }

/* ── Exemplo, com legenda e seta ─────────────────────────────────────────
   Cada exemplo diz o que é antes de se ver. A seta é desenhada à mão, em
   traço, e refaz-se em ciclo: o traço nasce, fica um momento, e recomeça.
   Serve de passo a passo, e é o único sítio destas páginas onde há uma seta. */
.exemplo { margin: 30px 0 0; }
.exemplo-legenda {
  display: flex; align-items: flex-end; gap: 10px;
  margin-bottom: 12px; max-width: 40ch;
  font-size: 15.5px; line-height: 1.35; font-weight: 600;
  letter-spacing: -0.012em; color: rgba(242,243,245,0.8);
}
.seta-mao { flex: none; width: 52px; color: rgba(242,243,245,0.5); }
.seta-mao svg { display: block; width: 100%; height: auto; overflow: visible; }
.seta-mao--dir svg { transform: scaleX(-1); }
/* O traço nasce: o tracejado é do tamanho do próprio traço, e o que anima é
   o deslocamento dele. Sem filtros e sem repintar nada.

   O pathLength="100" no SVG é o que permite um só valor aqui: normaliza o
   comprimento dos dois caminhos, que na realidade são muito diferentes. Sem
   ele, a curva e a ponta desenhavam-se a velocidades diferentes. */
.seta-mao path {
  stroke-dasharray: 100; stroke-dashoffset: 100;
  animation: desenhaSeta 3.4s linear infinite;
}
/* A ponta só começa quando a curva já lá chegou. */
.seta-mao path:nth-child(2) { animation-delay: .62s }
@keyframes desenhaSeta {
  0%   { stroke-dashoffset: 100; opacity: 1 }
  18%  { stroke-dashoffset: 0;   opacity: 1 }
  78%  { stroke-dashoffset: 0;   opacity: 1 }
  90%  { stroke-dashoffset: 0;   opacity: 0 }
  91%  { stroke-dashoffset: 100; opacity: 0 }
  100% { stroke-dashoffset: 100; opacity: 1 }
}

/* ── Antes e depois do mesmo link ────────────────────────────────────────
   Duas camadas, cada uma com o seu corte e com a SUA etiqueta lá dentro. As
   etiquetas estavam por cima das duas, e com o cursor encostado a um lado
   continuava a anunciar-se a metade que já tinha desaparecido do ecrã.

   O texto não é cortado: um título fatiado a meio dava "Sem título ques —
   Moradia T3", que se lê como um erro. O título troca inteiro.

   O gesto vem de Pointer Events no palco, não do input (ver o JS): no iOS um
   range só reage a quem lhe toca no cursor, e o cursor aqui não se vê. */
.comparar { position: relative; width: 100%; max-width: 340px; }
.comparar-palco { position: relative; cursor: ew-resize; touch-action: pan-y; -webkit-user-select: none; user-select: none; }
.balao--comparado { max-width: none; border-radius: 16px 16px 16px 5px; }

.comparar-imagens { position: relative; aspect-ratio: 1200 / 630; overflow: hidden; }
.camada { position: absolute; inset: 0; }
.camada--depois { clip-path: inset(0 0 0 var(--pos, 50%)); }
.camada--antes  { clip-path: inset(0 calc(100% - var(--pos, 50%)) 0 0); }
.camada img { width: 100%; height: 100%; object-fit: cover; display: block; -webkit-user-drag: none; pointer-events: none; }
/* O lado por tratar é a MESMA fotografia, em bruto: sem o véu, sem a
   tipologia, sem o valor e sem assinatura. O rectângulo cinzento desenhado
   que aqui esteve era uma caricatura; o que se vê mesmo por aí é isto, uma
   fotografia solta com um título em bruto por baixo. A comparação passa a
   ser entre duas coisas verdadeiras. */

/* O cartão do imóvel deixou de ser composto aqui.

   Vivia neste bloco um cartão inteiro em HTML e CSS — véu, tipologia, valor e
   assinatura por cima de uma fotografia — porque o exemplo era o de um consultor, e o
   og:image que o site dele serve é a fotografia em bruto: não havia cartão
   verdadeiro para mostrar, e desenhava-se aqui o molde que entregamos.

   Desde que o exemplo passou a ser o do Tomás Marques, há: o lado "como
   entregamos" é o ficheiro que o site dele serve mesmo, e o que aqui estava
   passou a ser uma segunda versão da mesma coisa, a divergir em silêncio da
   verdadeira. Sai, e com ele saem .ci-veu, .ci-linha, .ci-preco e .ci-marca.
   Se um dia voltar a ser preciso compor um cartão à mão, está no histórico. */
.comparar-imagens { container-type: inline-size; }

/* A barra atravessa o cartão inteiro, imagem e legenda: é uma só peça a
   cortar uma só coisa. */
.comparar-fio {
  position: absolute; top: 0; bottom: 0; left: var(--pos, 50%);
  width: 2px; margin-left: -1px; background: rgba(255,255,255,0.92);
  box-shadow: 0 0 0 1px rgba(0,0,0,0.25); pointer-events: none; z-index: 6;
}
.comparar-pega {
  position: absolute; top: 34%; left: 50%; transform: translate(-50%,-50%);
  width: 38px; height: 38px; border-radius: 50%;
  background: #FFFFFF; box-shadow: 0 6px 18px -6px rgba(0,0,0,0.8);
  display: block;
}
.comparar-pega::before, .comparar-pega::after {
  content: ""; position: absolute; top: 50%; width: 7px; height: 7px;
  border-right: 2px solid #16181C; border-bottom: 2px solid #16181C;
}
.comparar-pega::before { left: 9px; transform: translateY(-50%) rotate(135deg); }
.comparar-pega::after  { right: 9px; transform: translateY(-50%) rotate(-45deg); }

.comparar-etiqueta {
  position: absolute; top: 10px; z-index: 4;
  padding: 5px 10px; border-radius: 100px; white-space: nowrap;
  font-size: 11px; font-weight: 600; letter-spacing: .06em; text-transform: uppercase;
  background: rgba(10,10,11,0.72); color: rgba(255,255,255,0.9);
  backdrop-filter: blur(6px); -webkit-backdrop-filter: blur(6px);
  pointer-events: none;
}
.comparar-etiqueta--esq { left: 10px; }
.comparar-etiqueta--dir { right: 10px; }

/* A legenda mostra sempre o lado que está a ocupar mais cartão. A altura das
   duas linhas fica reservada para o cartão não saltar na troca. */
.comparar .balao-titulo { min-height: 2.6em; }
.t-antes, .t-depois { display: block; }
.t-depois { display: none; }
.balao--comparado .t-antes { color: #6B7078; font-weight: 600; }
.comparar.mostra-depois .t-antes { display: none; }
.comparar.mostra-depois .t-depois { display: block; }

/* O input deixa de apanhar o gesto e fica só para o teclado e para os
   leitores de ecrã, que era a razão de ele existir. */
.comparar-comando {
  position: absolute; inset: 0; width: 100%; height: 100%; margin: 0;
  opacity: 0; z-index: 5; pointer-events: none;
  -webkit-appearance: none; appearance: none; background: transparent;
}
.comparar:focus-within .comparar-fio { box-shadow: 0 0 0 2px #F2F3F5; }
.comparar-pista {
  margin-top: 10px; font-size: 13px; letter-spacing: .02em;
  color: rgba(242,243,245,0.5);
}
.comparar-pista a { color: rgba(242,243,245,0.72); text-underline-offset: 3px; }
.comparar-pista a:hover { color: #FFFFFF; }

/* ── Os cartões sozinhos, sem conversa à volta ───────────────────────────
   Aqui o exemplo é o cartão. Uma frase de conversa por cima só acrescentava
   ruído, e além disso punha na nossa boca palavras que não são nossas. */
.previas {
  margin-top: 26px; display: grid; gap: 16px;
  grid-template-columns: repeat(auto-fit, minmax(240px, 1fr)); max-width: 720px;
}
.previas .balao--link { max-width: none; border-radius: 16px; }

/* ── Capturas de um site que já está no ar ───────────────────────────────
   Diferente do .balao: ali o exemplo é o cartão de partilha, com moldura de
   conversa. Aqui o exemplo é a própria página, fotografada como está. Por
   isso não leva moldura branca nem título por baixo — leva a legenda do que
   se está a ver, que é o que falta a uma captura para se perceber. */
.capturas {
  margin-top: 26px; display: grid; gap: 16px;
  grid-template-columns: repeat(2, 1fr); max-width: 900px;
}
.capturas figure { margin: 0; }
.capturas img {
  display: block; width: 100%; height: auto; border-radius: 14px;
  border: 1px solid rgba(157,194,255,0.18);
  box-shadow: 0 22px 46px -28px rgba(0,0,0,0.95);
}
.capturas figcaption { margin-top: 9px; font-size: 13.5px; line-height: 1.45; color: rgba(242,243,245,0.6); }
/* A primeira captura é a página de entrada: ocupa a linha toda, porque é um
   vídeo de ecrã inteiro e cortado ao meio não se lê como tal. */
.capturas--abre figure:first-child { grid-column: 1 / -1; }

@media (max-width: 720px) {
  .capturas { grid-template-columns: 1fr; }
}

@media (max-width: 720px) {
  .destaque { padding-left: 16px; max-width: none; }
  .comparar, .comparar-palco { max-width: none; }
  .previas { grid-template-columns: 1fr; }
}

/* ── Fecho ───────────────────────────────────────────────────────────────
   A mesma acção da abertura, para quem leu tudo não ter de subir. */
.fecho { padding: 84px 0 96px; text-align: center; }
.fecho h2 { font-size: clamp(26px, 3.6vw, 40px); font-weight: 700; letter-spacing: -0.035em; line-height: 1.08; text-wrap: balance; }
.fecho p { margin: 16px auto 0; max-width: 46ch; font-size: 16.5px; line-height: 1.6; color: rgba(242,243,245,0.74); }
.fecho .botao-primario { margin-top: 26px; }
.fecho .nota { margin-top: 16px; font-size: 14.5px; color: rgba(242,243,245,0.6); }

/* ── Rodapé ──────────────────────────────────────────────────────────────*/
.rodape {
  border-top: 1px solid rgba(255,255,255,0.09);
  padding: 30px var(--gutter) calc(40px + env(safe-area-inset-bottom, 0px));
  display: flex; flex-wrap: wrap; gap: 8px 26px;
  justify-content: center; font-size: 14.5px;
}
.rodape a { display: inline-flex; align-items: center; min-height: 44px; text-decoration: none; color: rgba(242,243,245,0.66); transition: color .25s ease; }
.rodape a:hover { color: #F2F3F5; }


/* ── Abertura com prova (2026-09-12) ─────────────────────────────────────
   Para quem vem de um anúncio: o que é, uma prova a mexer, um botão. O reel
   do site de um cliente ao lado do texto em ecrã largo; no telemóvel por
   baixo do botão, mais pequeno, para o botão ficar acima da dobra. */
.abertura-prova { display: grid; grid-template-columns: minmax(0, 1fr) 300px; gap: 40px 56px; align-items: center; }
/* 2026-09-14: em ecra largo a frase e os botoes alinham pelo topo do
   telemovel, em vez de ficarem centrados a meio dele. */
@media (min-width: 721px) { .abertura-prova { align-items: start; } .abertura-prova .abertura-texto { padding-top: 6px; } }
.abertura-prova .zap { margin-top: 30px; }
/* 2026-09-14: a frase e os dois botoes gratis no lugar do WhatsApp. */
.abertura h1.abertura-cta { margin: 0; font-size: clamp(30px, 3.4vw, 40px); font-weight: 700; letter-spacing: -0.03em; line-height: 1.1; color: #F7F8FA; max-width: 16ch; text-wrap: balance; }
.abertura-prova .lead { margin-top: 26px; font-size: 17px; }
.abertura-prova .abertura-nota { margin-top: 12px; }
.abertura-botoes { display: flex; flex-direction: column; align-items: flex-start; gap: 12px; margin-top: 26px; }
/* A coluna do texto tem ~460px ao lado do telemóvel: os dois não cabem lado a
   lado, por isso empilham com a mesma largura. */
.abertura-botoes > a { width: min(100%, 330px); }
.abertura-prova .botao-primario { margin-top: 0; }
.botao-contorno {
  display: inline-flex; align-items: center; justify-content: center; gap: 10px;
  min-height: 56px; padding: 0 30px; border-radius: 100px;
  border: 1.5px solid rgba(255,255,255,0.55); background: rgba(255,255,255,0.04);
  font-size: 15px; font-weight: 700; letter-spacing: .12em; text-transform: uppercase;
  color: #F2F3F5; text-decoration: none; touch-action: manipulation;
  transition: border-color .3s ease, background-color .3s ease, transform .3s var(--e-saida);
}
.botao-contorno:hover { border-color: #FFFFFF; background: rgba(255,255,255,0.10); transform: translateY(-1px); }
.botao-contorno:focus-visible { outline: 2px solid #F2F3F5; outline-offset: 4px; }
.botao-contorno svg { transition: transform .3s var(--e-saida); }
.botao-contorno:hover svg { transform: translateY(2px); }
/* A auditoria vinha colada a ultima pergunta: o auditoria.css tira o padding
   de cima da seccao, e aqui devolve-se o respiro. */
main > section.auditoria { padding-top: 64px; }
.abertura-nota { margin-top: 16px; font-size: 14.5px; line-height: 1.5; color: rgba(242,243,245,0.6); }
.abertura-nota a { color: rgba(242,243,245,0.86); text-decoration: underline; text-underline-offset: 3px; }
.prova { position: relative; margin: 0; justify-self: end; width: 100%; max-width: 300px; }
/* O brilho atrás do telemóvel: a luz do ecrã a bater no fundo. */
.prova-brilho {
  position: absolute; inset: -12% -30% 6%; z-index: 0; pointer-events: none;
  background: radial-gradient(60% 55% at 50% 42%, rgba(255,255,255,0.10) 0%, rgba(255,255,255,0.03) 45%, transparent 75%);
  filter: blur(8px);
}
/* A moldura: bezel escuro com o rebordo a apanhar luz, ecrã dentro. */
.prova-ecra {
  position: relative; z-index: 1; aspect-ratio: 9 / 16; border-radius: 40px; overflow: hidden;
  background: #08090A; border: 7px solid #141517;
  box-shadow:
    0 0 0 1px rgba(242,243,245,0.14),
    0 40px 80px -30px rgba(0,0,0,0.95),
    0 18px 40px -20px rgba(0,0,0,0.8),
    inset 0 0 0 1px rgba(255,255,255,0.05);
  transform: translateZ(0); /* o Safari não recorta <video> só com overflow */
}
.prova-ecra::before {
  /* o reflexo no vidro: uma faixa diagonal muito leve */
  content: ""; position: absolute; inset: 0; z-index: 3; pointer-events: none; border-radius: inherit;
  background: linear-gradient(115deg, rgba(255,255,255,0.10) 0%, rgba(255,255,255,0.02) 28%, transparent 46%);
}
.prova-ilha {
  position: absolute; top: 10px; left: 50%; transform: translateX(-50%); z-index: 4;
  width: 32%; height: 22px; border-radius: 999px; background: #050506;
  box-shadow: inset 0 0 0 1px rgba(255,255,255,0.06);
}
.prova-ecra video { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; display: block; border-radius: 33px; }
/* O telemóvel inteiro é um link para o site do cliente. */
.prova-link { display: block; color: inherit; text-decoration: none; border-radius: 40px; -webkit-tap-highlight-color: transparent; }
.prova-link .prova-ecra { transition: transform .5s var(--e-saida), box-shadow .5s ease; }
.prova-link:hover .prova-ecra { transform: translateZ(0) scale(1.02); }
.prova-link:focus-visible { outline: 2px solid #F2F3F5; outline-offset: 6px; }
.prova-toca {
  display: inline-flex; align-items: center; justify-content: center; gap: 5px;
  margin-top: 8px; font-size: 13px; font-weight: 600; letter-spacing: 0; color: rgba(242,243,245,0.86);
}
.prova figcaption { position: relative; z-index: 1; margin-top: 14px; font-size: 12.5px; letter-spacing: .02em; line-height: 1.5; color: rgba(242,243,245,0.5); text-align: center; }

/* ── Três razões (2026-09-12) ────────────────────────────────────────────
   Logo a seguir à abertura: três frases curtas em fio, sem caixas. Em ecrã
   largo lado a lado; no telemóvel uma por linha. */
.razoes { padding-top: 44px; }
.razoes-lista { list-style: none; margin: 0; padding: 0; display: grid; grid-template-columns: repeat(3, 1fr); gap: 0 32px; border-top: 1px solid rgba(242,243,245,0.12); }
.razoes-lista li { padding: 22px 0 6px; }
.razoes-lista b { display: block; font-size: 17px; font-weight: 600; letter-spacing: -0.015em; color: #F7F8FA; }
.razoes-lista span { display: block; margin-top: 6px; font-size: 15px; line-height: 1.55; color: rgba(242,243,245,0.64); text-wrap: pretty; }

/* ── Contacto (2026-09-12) ───────────────────────────────────────────────
   Três cartões que são acções: o cartão inteiro é a ligação, o ícone diz
   qual, o valor é grande, e o botão em baixo diz o que acontece ao tocar. O
   WhatsApp é o principal (botão prateado, o mesmo da abertura); os outros
   levam botão de contorno. Vidro sobre o fundo, como o resto do site. */
.contactos { display: grid; grid-template-columns: repeat(3, 1fr); gap: 16px; }
.contacto-cartao {
  position: relative; display: flex; flex-direction: column; gap: 0;
  padding: 26px 24px 24px; border-radius: 24px; text-decoration: none; color: #F2F3F5;
  border: 1px solid rgba(242,243,245,0.12);
  background: linear-gradient(180deg, rgba(255,255,255,0.055) 0%, rgba(255,255,255,0.025) 100%);
  box-shadow: 0 24px 60px -34px rgba(0,0,0,0.9), inset 0 1px 0 rgba(255,255,255,0.06);
  transition: transform .35s var(--e-saida), border-color .35s ease, background .35s ease;
  -webkit-tap-highlight-color: transparent;
}
.contacto-cartao:hover { transform: translateY(-3px); border-color: rgba(242,243,245,0.3); background: linear-gradient(180deg, rgba(255,255,255,0.08) 0%, rgba(255,255,255,0.035) 100%); }
.contacto-cartao:active { transform: translateY(0) scale(.99); }
.contacto-cartao:focus-visible { outline: 2px solid #F2F3F5; outline-offset: 3px; }
.contacto-cartao--principal { border-color: rgba(242,243,245,0.22); }
.contacto-icone {
  display: inline-flex; align-items: center; justify-content: center; width: 46px; height: 46px; border-radius: 50%;
  background: rgba(242,243,245,0.07); border: 1px solid rgba(242,243,245,0.14); color: #F2F3F5; margin-bottom: 18px;
}
.contacto-cartao small { display: block; font-size: 12px; letter-spacing: .14em; text-transform: uppercase; color: rgba(242,243,245,0.5); }
.contacto-cartao b { display: block; margin-top: 6px; font-size: clamp(19px, 1.9vw, 23px); letter-spacing: -0.02em; font-weight: 700; overflow-wrap: anywhere; }
.contacto-cartao p { margin: 10px 0 0; font-size: 15px; line-height: 1.55; color: rgba(242,243,245,0.66); text-wrap: pretty; flex: 1 1 auto; }
.contacto-accao {
  display: inline-flex; align-items: center; justify-content: center; gap: 10px; align-self: flex-start;
  margin-top: 22px; min-height: 46px; padding: 0 20px; border-radius: 100px;
  border: 1px solid rgba(242,243,245,0.28); color: #F2F3F5; background: rgba(242,243,245,0.05);
  font-size: 13px; font-weight: 700; letter-spacing: .12em; text-transform: uppercase;
  transition: background .3s ease, border-color .3s ease;
}
.contacto-cartao:hover .contacto-accao { background: rgba(242,243,245,0.12); border-color: rgba(242,243,245,0.5); }
.contacto-accao svg { transition: transform .3s var(--e-saida); }
.contacto-cartao:hover .contacto-accao svg { transform: translateX(3px); }
.contacto-accao--zap {
  border: 1px solid rgba(255,255,255,0.5); color: #0A0A0A;
  background: linear-gradient(180deg, #FFFFFF 0%, #C3C8CF 55%, #9AA0A8 100%);
  box-shadow: 0 18px 40px -20px rgba(0,0,0,0.95), inset 0 1px 0 rgba(255,255,255,0.9);
}
.contacto-cartao:hover .contacto-accao--zap { background: linear-gradient(180deg, #FFFFFF 0%, #D2D6DC 55%, #A8AEB6 100%); border-color: rgba(255,255,255,0.7); }
@media (max-width: 960px) { .contactos { grid-template-columns: 1fr; } }
@media (max-width: 720px) {
  .contacto-cartao { padding: 22px 20px 20px; border-radius: 22px; }
  .contacto-icone { width: 42px; height: 42px; margin-bottom: 14px; }
  .contacto-accao { width: 100%; align-self: stretch; }
}

/* ── Telemóvel ───────────────────────────────────────────────────────────
   Desenhado a 390 primeiro. O que muda aqui é ritmo e alvos tocáveis, não a
   estrutura: a página é uma coluna em qualquer largura. */
@media (max-width: 720px) {
  .abertura { padding-top: 44px; }
  .abertura h1 { max-width: none; }
  .abertura .lead { font-size: 17px; }
  /* ── A abertura no telemóvel: «espreitar» (2026-09-12) ─────────────────
     Ganhou um painel de três lentes (estética, conversão, robustez) contra
     duas alternativas: o telemóvel a sair pelo bordo direito, e o site num
     cartão de vidro sem moldura.

     A ordem do primeiro ecrã é título, linha, botão à largura toda, nota. Só
     depois vem o telemóvel, grande e direito, cortado pelo fundo do ecrã: vê-se
     o site do Tomás Marques a correr de verdade, e é isso que convida a descer.
     O botão nunca lhe toca porque o telemóvel vem DEPOIS dele, em fluxo.

     O bloco de texto tem uma altura mínima calculada para que o telemóvel
     comece sempre a --espreita do fundo do primeiro ecrã, fique o texto na
     altura que ficar. Se o texto crescer (letra grande, ecrã estreito), o
     telemóvel desce e nada se sobrepõe.

     Sem rotação: os 4 graus da primeira tentativa liam-se como desalinhamento.
     Um aparelho grande, direito e centrado lê-se como fotografia de produto. */
  .abertura-prova {
    /* quanto do telemóvel entra no primeiro ecrã */
    --espreita: max(min(95vw, 380px), 44svh);
    /* do topo do ecrã ao título: 80px do main (a navbar) + 44px da abertura.
       Se a navbar mudar de altura, a linha de corte desloca-se uns pixels e
       mais nada: o botão está antes do telemóvel, em fluxo. */
    --topo: 124px;
    display: flex; flex-direction: column; gap: 0;
    overflow-x: clip; /* cinto e suspensórios: nada desta secção alarga a página */
  }
  .abertura-prova .abertura-texto {
    display: flex; flex-direction: column; align-items: stretch;
    box-sizing: border-box;
    min-height: calc(100svh - var(--topo) - var(--espreita));
  }
  .abertura-prova h1 { font-size: clamp(31px, 9.2vw, 38px); }
  .abertura-prova .lead { margin-top: 16px; font-size: 16px; line-height: 1.5; }
  .abertura-prova .abertura-cta { font-size: clamp(29px, 8.4vw, 34px); max-width: none; }
  .abertura-prova .lead { margin-top: 22px; font-size: 16px; }
  .abertura-prova .abertura-botoes { flex-direction: column; gap: 10px; margin-top: 22px; }
  .abertura-prova .botao-primario, .abertura-prova .botao-contorno { width: 100%; min-height: 54px; font-size: 13px; letter-spacing: .1em; }
  .abertura-prova .abertura-nota { margin-top: 10px; text-align: left; font-size: 14px; }

  .abertura-prova .prova {
    /* margem mínima: a nota e o telemóvel nunca se tocam, nem no ponto mais
       alto da respiração */
    align-self: center; margin-top: 22px;
    width: min(80vw, 320px); max-width: none;
  }
  .prova-brilho {
    /* NUNCA passar da largura do ecrã: um absoluto que transborde na
       horizontal faz o Chromium alargar o viewport de layout e desenhar a
       página encolhida, e atira o banner de consentimento para fora do ecrã.
       -12% da maqueta cabe sempre na margem que ela deixa. */
    inset: -40% -12% 12%;
    background: radial-gradient(64% 56% at 50% 46%, rgba(255,255,255,0.15) 0%, rgba(255,255,255,0.05) 40%, transparent 72%);
    filter: blur(12px);
  }
  .prova-ecra {
    border-radius: 44px; border-width: 7px;
    transform: translateZ(0);
    box-shadow:
      0 0 0 1px rgba(242,243,245,0.16),
      0 44px 90px -30px rgba(0,0,0,0.95),
      0 18px 40px -20px rgba(0,0,0,0.8),
      inset 0 0 0 1px rgba(255,255,255,0.05);
    animation: prova-espreita 6.5s ease-in-out infinite;
  }
  .prova-ecra video { border-radius: 37px; }
  .prova-link { border-radius: 44px; }
  /* o degradê no fundo do ecrã existia para o botão pousar lá; já não pousa */
  .prova-ecra::after { display: none; }
  .prova figcaption { display: block; margin-top: 26px; font-size: 12.5px; }
  /* Respira devagar, a convidar a descer. */
  @keyframes prova-espreita { 0%, 100% { transform: translateZ(0) translateY(0); } 50% { transform: translateZ(0) translateY(-6px); } }

  .razoes { padding-top: 40px; }
  .razoes-lista { grid-template-columns: 1fr; }
  .razoes-lista li { padding: 16px 0; border-bottom: 1px solid rgba(242,243,245,0.10); }
  .razoes-lista li:last-child { border-bottom: none; }
  /* O botão do WhatsApp ocupa a largura toda: é a única acção do ecrã. */
  .zap { width: 100%; padding: 18px 20px; font-size: 13px; letter-spacing: 0.1em; }
  section { padding-top: 58px; }
  .recebes dt { font-size: 18px; }
  .recebes dd, .passos p, .perguntas details p { font-size: 16px; }
  .passos li { padding-left: 56px; }
  .passos li::before { font-size: 34px; top: -6px; }
  .passos li::after { left: 18px; top: 36px; }
  .pacote { padding: 26px 22px; border-radius: 20px; }
  /* Numa coluna só, o retrato por cima e o texto por baixo. */
  .cliente { flex-direction: column; gap: 16px; padding: 24px 22px; }
  .cliente blockquote { font-size: 17px; }
  .cliente .frase { font-size: 17px; }
  .fecho { padding: 66px 0 76px; }
}

@media (prefers-reduced-motion: reduce) {
  .prova-ecra { animation: none !important; }
  .lista-luz__gota { display: none; }
  .lista-luz__marca { animation: none !important; background-color: #F2F3F5; }
  .prova-link .prova-ecra, .ver-exemplos, .ver-exemplos svg { transition: none; }
  #fundo .bolha, #fundo .estrela, #fundo .pulso { animation: none !important; }
  [data-entra], .perguntas details[open] p, .passos li::after,
  [data-palavras] span, .seta-mao path, [data-escrever] .letra { transition: none !important; animation: none !important; }
  /* O título aparece feito, e o cursor não chega a existir. */
  [data-escrever] .letra { opacity: 1 !important; transform: none !important; filter: none !important; }
  /* A seta fica desenhada por inteiro em vez de nunca chegar a existir. */
  .seta-mao path { stroke-dashoffset: 0 !important; }
  .js-anima [data-palavras] span { opacity: 1; transform: none; }
  .js-anima .passos li[data-entra]::after { transform: scaleY(1); }
  .js-anima [data-entra] { opacity: 1; transform: none; }
  .perguntas summary::after, .zap, .cliente .sitio svg { transition: none !important; }
}

/* As perguntas da FAQ passaram a h3 (pares pergunta/resposta legiveis
   pelo Google); o h3 nao pode trazer o estilo de heading para dentro da
   gaveta. */
.perguntas summary h3 { margin: 0; font: inherit; display: inline; color: inherit; }

/* ── Antes e depois de uma FOTOGRAFIA, sem cartão à volta ────────────────
   Mesma peça do comparador do link (mesmas camadas, mesmo fio, mesmo gesto,
   mesmo JS), noutra moldura. A da /imobiliarias/detalhe vive dentro de um
   balão de conversa porque o assunto lá é o cartão que sai no WhatsApp; aqui
   o assunto é a imagem, e um balão à volta punha uma conversa que ninguém
   teve.

   Só três coisas mudam: a largura deixa de ser a de um cartão de telemóvel, o
   formato passa a 3:2 (é o das fotografias, e o 1200/630 do cartão cortava o
   céu e a rua ao mesmo tempo), e o palco ganha o canto arredondado que antes
   vinha do balão. */
.comparar--foto { max-width: 760px; }
.comparar--foto .comparar-palco {
  border-radius: 18px; overflow: hidden;
  border: 1px solid rgba(255,255,255,0.09);
  box-shadow: 0 30px 60px -30px rgba(0,0,0,0.95);
}
.comparar--foto .comparar-imagens { aspect-ratio: 3 / 2; }

/* A legenda passou para BAIXO do palco e é texto normal, não a linha branca
   do cartão: aqui não há título de link para trocar, há uma frase a dizer que
   lado se está a ver. Troca inteira, pela mesma classe .mostra-depois. */
.comparar-legenda {
  margin-top: 12px; min-height: 3em;
  font-size: 15.5px; line-height: 1.5; color: rgba(242,243,245,0.72);
}
.comparar-legenda b { color: #F2F3F5; font-weight: 600; }

/* ── A página do orçamento ───────────────────────────────────────────────
   Uma página, um formulário, e mais nada: sem menu, sem secções e sem outra
   saída que não seja enviar o pedido ou voltar. É para onde vai quem já
   decidiu pedir, e tudo o que se acrescentasse aqui era mais uma coisa entre
   a pessoa e o pedido. */
.orc-cabeca { padding: 46px 0 0; text-align: center; }
.orc-marca { display: inline-flex; align-items: center; gap: 12px; }
.orc-marca img { width: 46px; height: auto; display: block; }
.orc-marca span { font-size: 24px; font-weight: 700; letter-spacing: -0.02em; }
.orc-cabeca h1 {
  margin-top: 26px;
  font-size: clamp(30px, 4.6vw, 46px); font-weight: 700;
  letter-spacing: -0.038em; line-height: 1.06; text-wrap: balance;
}
.orc-cabeca .lead {
  margin: 16px auto 0; max-width: 46ch;
  font-size: 16.5px; line-height: 1.6; color: rgba(242,243,245,0.72);
}

/* O painel. Vidro sobre o fundo animado, como o resto do género. */
.orc-painel {
  margin: 34px 0 90px; padding: clamp(24px, 3.4vw, 38px);
  border-radius: 22px;
  background: rgba(255,255,255,0.035);
  border: 1px solid rgba(255,255,255,0.09);
  box-shadow: inset 0 1px 0 rgba(255,255,255,0.07), 0 40px 80px -44px rgba(0,0,0,0.98);
}

/* ---- a barra de progresso: três segmentos, um por secção ----
   Sem números na barra: a proporção lê-se de relance. A contagem em texto
   existe logo abaixo e é para quem ouve a página, porque a barra diz
   aria-hidden. */
.orc-barra { display: flex; gap: 6px; align-items: center; }
.orc-barra span {
  flex: 1; height: 3px; border-radius: 3px;
  background: #F2F3F5; opacity: .18;
  transition: opacity .42s var(--e-saida), background-color .42s var(--e-saida);
}
.orc-barra span[data-feito] { opacity: 1; }
.orc-conta { margin-top: 10px; font-size: 13px; letter-spacing: .06em; text-transform: uppercase; color: rgba(242,243,245,0.5); }

/* ---- os ecrãs ----
   A direcção da passagem é o que a faz ler-se: avançar traz o ecrã novo da
   direita, recuar traz-o da esquerda. Sem isso "voltar" e "continuar" eram o
   mesmo gesto. Quem remonta o ecrã é o JS, ao trocar o conteúdo; o data-dir
   no pai diz de que lado. */
.orc-ecra { margin-top: 26px; animation: orcFrente .42s var(--e-saida) backwards; }
[data-dir="tras"] .orc-ecra { animation-name: orcTras; }
@keyframes orcFrente { from { opacity: 0; transform: translate3d(1.6rem,0,0) } }
@keyframes orcTras   { from { opacity: 0; transform: translate3d(-1.6rem,0,0) } }

/* Os campos entram escalonados por cima da passagem do ecrã: é o que separa
   "um bloco a deslizar" de "as perguntas a chegarem". */
.orc-ecra .orc-campo { animation: orcCampo .42s var(--e-saida) backwards; }
.orc-ecra .orc-campo:nth-child(1) { animation-delay: 90ms }
.orc-ecra .orc-campo:nth-child(2) { animation-delay: 150ms }
.orc-ecra .orc-campo:nth-child(3) { animation-delay: 210ms }
.orc-ecra .orc-campo:nth-child(n+4) { animation-delay: 270ms }
@keyframes orcCampo { from { opacity: 0; transform: translate3d(0,.7rem,0) } }

.orc-ecra fieldset { border: 0; min-width: 0; }
.orc-ecra legend { font-size: 19px; font-weight: 700; letter-spacing: -0.02em; color: #F2F3F5; }
.orc-grelha { margin-top: 22px; display: grid; gap: 20px; }
.orc-grelha--par { grid-template-columns: 1fr 1fr; }
.orc-grelha > * { min-width: 0; }
.orc-largo { grid-column: 1 / -1; }

.orc-campo label { display: block; font-size: 14px; font-weight: 600; letter-spacing: .01em; color: rgba(242,243,245,0.86); }
.orc-campo label i { font-style: normal; font-weight: 400; color: rgba(242,243,245,0.48); }

/* O campo é uma linha e não uma caixa: um campo de uma resposta precisa de um
   sítio onde escrever, não de um rectângulo à volta. A única caixa é a da
   nota livre, e é onde se escreve um parágrafo. */
.orc-campo input, .orc-campo select, .orc-campo textarea {
  /* Mesma historia dos botoes: no iOS um campo com aparencia nativa traz
     cantos e sombra interior proprios, e ignora parte do que aqui se pede. */
  -webkit-appearance: none; appearance: none;
  margin-top: 8px; width: 100%; display: block;
  font: inherit; font-size: 16px; color: #F2F3F5;
  background: transparent; border: 0; border-bottom: 1px solid rgba(255,255,255,0.18);
  padding: 11px 0; border-radius: 0;
  transition: border-color .3s ease;
}
.orc-campo textarea {
  padding: 14px 16px; border: 1px solid rgba(255,255,255,0.14); border-radius: 14px;
  background: rgba(0,0,0,0.22); resize: vertical; line-height: 1.6; min-height: 120px;
}
.orc-campo select {
  padding-right: 28px;
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 24 24' fill='none'%3E%3Cpath d='m6 9 6 6 6-6' stroke='%23F2F3F5' stroke-opacity='.55' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");
  background-repeat: no-repeat; background-position: right 2px center;
}
/* A lista aberta é desenhada pelo sistema e não herda nada daqui: sem estas
   duas linhas as opções saíam texto branco sobre branco no Windows. */
.orc-campo select option { background: #16181C; color: #F2F3F5; }
.orc-campo input::placeholder, .orc-campo textarea::placeholder { color: rgba(242,243,245,0.34); }
.orc-campo input:focus, .orc-campo select:focus, .orc-campo textarea:focus {
  outline: none; border-color: #F2F3F5;
}
.orc-campo select:invalid, .orc-campo select.vazio { color: rgba(242,243,245,0.4); }
/* O campo por corrigir não é marcado só pela cor: a mensagem por baixo é
   texto, e é ela que cumpre a WCAG 1.4.1. */
.orc-campo [aria-invalid="true"] { border-color: #F0857A; }
.orc-erro { margin-top: 8px; font-size: 13.5px; line-height: 1.45; color: #F0857A; }

.orc-consente { display: flex; align-items: flex-start; gap: 12px; }
.orc-consente input { margin: 3px 0 0; width: 20px; height: 20px; flex: none; accent-color: #F2F3F5; }
.orc-consente label { font-size: 14.5px; font-weight: 400; line-height: 1.6; color: rgba(242,243,245,0.72); }
.orc-consente label a { color: #F2F3F5; text-underline-offset: 3px; }
.orc-nota-dados { margin-top: 14px; font-size: 13.5px; line-height: 1.55; color: rgba(242,243,245,0.5); }

/* ---- a navegação ----
   "Continuar" nos dois primeiros ecrãs, "Pedir orçamento" no último: o botão
   que envia só aparece quando enviar é mesmo a acção seguinte. */
.orc-nav { margin-top: 34px; display: flex; align-items: center; gap: 18px; flex-wrap: wrap; }
/* O botao primario do genero: prata, pilula, maiusculas. Nasceu na pagina
   do orcamento e passou a ser o fecho de todas as paginas de venda quando o
   caminho deixou de ser a conversa e passou a ser o formulario. */
.botao-primario {
  display: inline-flex; align-items: center; justify-content: center; gap: 10px;
  text-decoration: none;
  /* O SAFARI DO IPHONE IGNORA O `background` DE UM <button> enquanto a
     aparencia nativa estiver ligada. O resultado era o pior possivel: a
     pilula, o tamanho e a tipografia eram os nossos, e por baixo ficava o
     azul de sistema com o degrade prateado descartado em silencio. No
     Chromium nunca se via, porque la o `background` ganha na mesma.
     Vale para o <a> tambem, que nao custa nada, e para o `orc-voltar` logo
     abaixo, que sem isto era outro botao azul. */
  -webkit-appearance: none; appearance: none;
  /* Sem isto o toque no telemovel espera pelo duplo toque antes de disparar. */
  touch-action: manipulation;
  min-height: 56px; padding: 0 34px; border: 0; border-radius: 100px; cursor: pointer;
  font: inherit; font-size: 15px; font-weight: 700; letter-spacing: .12em; text-transform: uppercase;
  color: #0A0A0A; background: linear-gradient(180deg, #FFFFFF 0%, #C3C8CF 55%, #9AA0A8 100%);
  box-shadow: 0 22px 50px -22px rgba(0,0,0,0.95), inset 0 1px 0 rgba(255,255,255,0.9);
  transition: transform .3s ease, filter .3s ease;
}
.botao-primario:hover { transform: scale(1.03); filter: brightness(1.06); }
.botao-primario:active { transform: scale(.975); }
.botao-primario svg { flex: none; transition: transform .3s var(--e-saida); }
.botao-primario:hover svg { transform: translateX(3px); }
.orc-voltar {
  -webkit-appearance: none; appearance: none; touch-action: manipulation;
  background: none; border: 0; cursor: pointer; font: inherit; font-size: 14.5px;
  min-height: 44px; padding: 0 4px; color: rgba(242,243,245,0.6);
  transition: color .24s ease;
}
.orc-voltar:hover { color: #F2F3F5; }

/* ---- o ecrã de confirmação ---- */
/* O topo e sticky: sem esta margem, o scrollIntoView punha o selo por baixo
   da barra e a confirmacao comecava cortada. */
.orc-feito { text-align: center; scroll-margin-top: 96px; }
.orc-selo {
  width: 84px; height: 84px; margin: 0 auto; border-radius: 50%;
  display: grid; place-items: center;
  background: rgba(255,255,255,0.08); border: 1px solid rgba(255,255,255,0.2);
  animation: orcSelo .62s var(--e-saida) backwards;
}
.orc-selo path {
  stroke: #F2F3F5; stroke-width: 2.4; stroke-linecap: round; stroke-linejoin: round; fill: none;
  stroke-dasharray: 30; stroke-dashoffset: 30;
  animation: orcVisto .5s var(--e-saida) .38s forwards;
}
@keyframes orcSelo { from { opacity: 0; transform: scale(.72) } }
@keyframes orcVisto { to { stroke-dashoffset: 0 } }
.orc-feito h2 { margin-top: 22px; font-size: clamp(24px, 3.2vw, 32px); font-weight: 700; letter-spacing: -0.03em; }
.orc-feito p { margin: 14px auto 0; max-width: 46ch; font-size: 16px; line-height: 1.6; color: rgba(242,243,245,0.72); }
.orc-copia {
  margin: 26px 0 0; padding: 20px; text-align: left;
  border-radius: 14px; background: rgba(0,0,0,0.3); border: 1px solid rgba(255,255,255,0.09);
  font: inherit; font-size: 14px; line-height: 1.65; white-space: pre-wrap;
  color: rgba(242,243,245,0.72); overflow-x: auto;
}
.orc-feito .orc-nav { justify-content: center; }

@media (max-width: 640px) {
  .orc-grelha--par { grid-template-columns: 1fr; }
  .orc-painel { padding: 24px 18px; border-radius: 18px; }
  .botao-primario { width: 100%; }
  .orc-nav { flex-direction: column-reverse; align-items: stretch; gap: 10px; }
  /* Na confirmacao a ordem natural e a certa: primeiro abrir a conversa,
     depois copiar. O column-reverse la de cima existe para o par
     voltar/continuar, onde o secundario e que vem em baixo. */
  .orc-feito .orc-nav { flex-direction: column; align-items: stretch; }
}

@media (prefers-reduced-motion: reduce) {
  .orc-ecra, .orc-ecra .orc-campo, .orc-selo { animation: none; }
  /* O visto tem de ficar com o dashoffset a ZERO à mão: sem isto o estado
     inicial do desenho ficava aplicado e o visto desaparecia. */
  .orc-selo path { animation: none; stroke-dashoffset: 0; }
  .botao-primario, .botao-primario svg, .orc-voltar, .orc-barra span { transition: none; }
}
