/* Âmago — página inicial: hero, esfera de serviços e secções seguintes. */

/* ---------- Hero ---------- */
/* O hero é uma camada OPACA acima da secção seguinte: é assim que as peças do puzzle,
   quando estão afastadas e transbordam para cima, passam por baixo dele em vez de lhe
   ficarem por cima. Daí o fundo próprio e o z-index maior. */
.hero{position:relative;z-index:2;background:var(--fundo);overflow:hidden}
.essencia{position:relative;z-index:1}
/* Pontos de fundo: preenchem o hero, por baixo do conteúdo dele. */
#ambiente{position:absolute;inset:0;width:100%;height:100%;display:block;z-index:0;pointer-events:none}
.hero .interior{position:relative;z-index:1}
/* Duas colunas: texto à esquerda, esfera à direita. */
.hero .interior{display:grid;grid-template-columns:1fr auto;align-items:center;align-content:center;
  gap:clamp(24px,5vw,72px);max-width:1280px;margin:0 auto;
  min-height:calc(100svh - var(--altura-nav));
  padding:clamp(24px,4vh,48px) clamp(16px,4vw,40px)}
/* O texto fica por cima da esfera: os balões dos serviços não lhe podem passar à frente. */
.texto{max-width:100%;position:relative;z-index:600}

/* O VÉU por trás do texto do hero (2026-09-23, pedido do cliente ao mesmo tempo que as
   linhas do fundo ganharam brilho): um clarão da COR DO FUNDO que apaga a teia de pontos
   onde a frase e os botões vivem. Mesma ideia do véu do convite, com a cor trocada — ali
   o fundo é branco, aqui é o verde da marca —, e é por isso que não se vê: o que se nota
   é a teia a desvanecer-se ao aproximar-se das letras.

   Vive DENTRO do `.texto`, que já tem `z-index:600`, com `z-index:-1`: fica atrás das
   letras e à frente do canvas (que é 0), sem mais um elemento no HTML.

   O inset é MENOR do lado direito (-3%) do que do esquerdo (-9%): é desse lado que está a
   esfera, e o véu, estando acima dela no empilhamento, escurecia-lhe a borda. Do lado de
   fora não há nada que ele possa estragar. */
.texto::before{content:"";position:absolute;z-index:-1;pointer-events:none;
  inset:-13% -3% -16% -9%;
  background:radial-gradient(ellipse 60% 56% at 50% 50%,
    rgba(var(--fundo-rgb),.97) 0%,rgba(var(--fundo-rgb),.94) 44%,
    rgba(var(--fundo-rgb),.6) 70%,rgba(var(--fundo-rgb),0) 100%)}

/* A esfera nunca pode ser mais alta do que o hero: o ultimo termo limita-a a altura
   util do ecra (viewport menos a navbar e o padding do hero). */
/* O z-index aqui fecha um contexto de empilhamento: assim os z-index altos dos nós
   (até 500 no nó ativo) ficam contidos e não competem com o texto do hero. */
.esfera-wrap{position:relative;z-index:1;
  width:min(94vw,58vw,760px,calc(100svh - var(--altura-nav) - 2*clamp(24px,4vh,48px)));
  aspect-ratio:1;user-select:none;container-type:inline-size;
  cursor:grab;touch-action:pan-y}
.esfera-wrap.a-arrastar{cursor:grabbing}
/* Empilhamento em .esfera-wrap:
   1 metade de trás da esfera · 2 marca · 3 metade da frente · 10-107 nós · 500 nó ativo */
.esfera-wrap canvas{position:absolute;inset:0;width:100%;height:100%;display:block;pointer-events:none}
#esfera-tras{z-index:1}
#esfera-frente{z-index:3}
#nos{position:absolute;inset:0;z-index:auto}

/* Marca ao centro da esfera: fica atrás dos pontos da frente e à frente dos de trás. */
.marca{position:absolute;left:50%;top:50%;width:19%;z-index:2;
  transform:translate(-49.87%,-58.44%);pointer-events:none}

/* A marca em NUVEM DE PONTOS (2026-09-23, pedido do cliente): o `marca-pontos.js` lê o
   próprio PNG, amostra-o numa grelha e desenha-o em pontos que se desfazem por onde o
   cursor passa. O canvas ocupa exatamente o lugar da imagem — a proporção é a do ficheiro
   (563x556), sem a qual um canvas não sabe que altura ter a partir de uma largura em
   percentagem. Não intercepta o rato: o arrasto da esfera continua a ser do `.esfera-wrap`.
   A imagem só sai de cena quando a nuvem está pronta (classe posta pelo script), por isso
   sem JavaScript — ou se a leitura do PNG falhar — fica o render, como antes. */
/* O seletor tem de incluir o `canvas`: a regra `.esfera-wrap canvas` (as duas telas da
   esfera) é mais específica do que uma classe sozinha e punha esta tela a ocupar o wrap
   todo — a nuvem saía do tamanho da esfera. O `inset:auto` desfaz o `inset:0` de lá.

   A tela é 34% MAIOR do que a imagem era (19% x 1,34 = 25,5%) e o `marca-pontos.js`
   desenha a nuvem ao meio dela, com a folga à volta: é essa folga que o PULSO usa para
   crescer sem bater nos limites do canvas — e ele precisa de toda, porque chega a medir
   165px quando em repouso tem 145. O `translate` acompanha a folga, para o centro da
   marca ficar exatamente onde estava: o vertical sai de 0,5 + 0,0844/1,34 = 56,30% e o
   horizontal de 0,5 - 0,0013/1,34 = 49,90%. Quem mexer na folga do JS refaz os três. */
/* 40,8% = 25,5% x 1,6: o cliente escolheu a nuvem a "80%" num painel em que 50% era o
   tamanho de então (2026-09-28). A folga e o `translate` são frações da própria tela, por
   isso não mudam com a largura. */
.esfera-wrap canvas.marca-nuvem{position:absolute;inset:auto;left:50%;top:50%;
  width:40.8%;height:auto;aspect-ratio:563/556;z-index:2;
  transform:translate(-49.90%,-56.30%);pointer-events:none;display:block}
.esfera-wrap.nuvem-viva .marca{display:none}

/* Cada linha num <span> que nunca quebra, para o título manter sempre a forma. */
.frase{margin:0;text-align:left;
  font-weight:200;font-size:var(--tipo-h1);letter-spacing:.01em;line-height:1.12}
.frase span{display:block;white-space:nowrap;width:fit-content}
.frase em{font-style:normal;font-weight:500}
/* A entrada da frase, em corpo pequeno. Justificada nas duas pontas, fica exatamente
   com a largura da linha do título que a contém. Medidas em `em` para acompanhar o
   título; `white-space:normal` porque o justificado não funciona com nowrap. */
/* A entrada é dimensionada para acabar onde acaba a linha do título que a contém.
   O `font-size` em `em` é o único número a afinar: como tudo escala com o título, a
   proporção mantém-se em qualquer ecrã. O seletor tem de ser mais específico do que
   `.frase span`, senão herda dele o `fit-content`. */
.frase span.frase-antes{display:block;width:auto;
  font-size:.327em;font-weight:400;letter-spacing:.1em;
  text-transform:uppercase;line-height:1.4;margin-bottom:1em;opacity:.6}
.sub{margin:20px 0 0;max-width:44ch;font-size:clamp(15px,1.4vw,18px);font-weight:300;line-height:1.6;color:var(--ink-2);opacity:.8}
.botoes{display:flex;flex-wrap:wrap;gap:12px;margin-top:clamp(20px,3.5vh,32px)}
/* NOTA: os botões (`.btn`) mudaram-se para o `base.css` a 2026-09-22 — deixaram
   de ser só do hero e são usados também nas páginas interiores, que não carregam
   esta folha. */

/* ---------- Nós dos serviços (HTML por cima do canvas) ---------- */
.no{position:absolute;left:0;top:0;width:0;height:0;outline:none}
.no.atras{pointer-events:none}
.disco{position:absolute;left:0;top:0;width:16px;height:16px;border-radius:50%;background:var(--ink);cursor:pointer;
  transform:translate(-50%,-50%) scale(var(--p,1));opacity:var(--o,1);
  display:flex;align-items:center;justify-content:center;overflow:hidden;
  box-shadow:0 0 0 3px rgba(252, 252, 252, 0.989);
  transition:width .35s cubic-bezier(.2,.8,.2,1),height .35s cubic-bezier(.2,.8,.2,1),background .3s,box-shadow .3s,opacity .3s,transform .3s}
.no.atras .disco{box-shadow:none;cursor:default}
.no.ativo .disco{width:84px;height:84px;background:#fff;border:2px solid var(--ink);transform:translate(-50%,-50%) scale(1);opacity:1;box-shadow:0 10px 28px rgba(255, 255, 255, 0.985)}
.no:focus-visible .disco{box-shadow:0 0 0 3px #fff,0 0 0 5px var(--ink)}
/* Ícones: traço da cor do fundo sobre o disco branco. A espessura e os remates estão
   aqui e não em cada SVG, para todos combinarem entre si. */
.icone{width:38px;height:38px;display:block;color:var(--fundo);
  fill:none;stroke:currentColor;stroke-width:1.7;stroke-linecap:round;stroke-linejoin:round;
  opacity:0;transform:scale(.6);transition:opacity .25s .1s,transform .3s .1s}
.no.ativo .icone{opacity:1;transform:scale(1)}
.no.ativo{z-index:500 !important}

.balao{position:absolute;top:0;left:44px;transform:translateY(-50%);display:flex;align-items:center;opacity:0;pointer-events:none;white-space:nowrap;transition:opacity .25s .12s}
.no.esq .balao{left:auto;right:44px;flex-direction:row-reverse}
.no.ativo .balao{opacity:1}
.linha{position:relative;width:40px;height:2px;background:var(--ink)}
.linha::before{content:"";position:absolute;top:50%;width:7px;height:7px;border-radius:50%;background:var(--ink);transform:translateY(-50%)}
.no:not(.esq) .linha::before{left:-3px}
.no.esq .linha::before{right:-3px}
/* Um rótulo comprido de mais deixava de caber na janela de um lado e na coluna do
   texto do outro, e o balão saía cortado: acima de 260px parte em duas linhas. */
.rotulo{background:var(--ink);color:var(--fundo);font-size:14px;font-weight:500;letter-spacing:.02em;padding:7px 14px;border-radius:999px;
  max-width:260px;white-space:normal;text-align:center;line-height:1.3}

/* ---------- Secção "A Âmago": puzzle montado pelo scroll ---------- */
/* A secção é um percurso alto; o palco fica preso ao topo e o scroll dentro dele
   comanda a montagem. A altura do percurso define quanto se rola por peça. */
/* A altura do percurso é o scroll que a montagem inteira ocupa. Com as peças mais
   sobrepostas (ver `puzzle.js`) já não são precisos 340svh. */
/* `--consumido` é escrito pelo `puzzle.js`: é o percurso já gasto a montar, que é
   retirado da página para não se voltar a atravessar ao subir (ver lá o porquê). */
.essencia{background:#fff;color:var(--fundo);
  height:calc(250svh - var(--consumido, 0px))}
/* O browser compensa sozinho o scroll quando um elemento muda de altura (scroll
   anchoring). Aqui a compensação é feita pelo JS, no mesmo frame e à medida certa;
   as duas juntas davam o dobro do recuo e a página saltava. */
:root{overflow-anchor:none}
.essencia-palco{position:sticky;top:var(--altura-nav);
  height:calc(100svh - var(--altura-nav));
  display:grid;place-items:center;
  padding:clamp(14px,3vh,40px) clamp(12px,3vw,40px)}

/* ---------- Fitas de imagens em ciclo, atrás do puzzle ---------- */
/* Ocupam o palco todo; o véu branco por cima mantém a secção clara e deixa as peças
   brancas destacarem-se. As imagens levam o mesmo acerto de tom das peças. */
.essencia{--fita-gap:clamp(8px,1.4vh,18px)}
.essencia-fundo{position:absolute;inset:0;z-index:0;overflow:hidden;
  display:grid;grid-template-rows:repeat(3,1fr);gap:var(--fita-gap)}
.essencia-fundo::after{content:"";position:absolute;inset:0;background:#fff;opacity:.45}

.fita{overflow:hidden}
/* A tira tem de ter altura DEFINIDA (100% da linha): sem isso, o `height:90%` das
   imagens não tem contra o que resolver, elas ficam ao tamanho natural do ficheiro e
   a linha mostra só uma faixa delas.
   Sem `gap` de propósito: com margem em cada imagem, metade da tira é exatamente
   metade da largura, e o translateX(-50%) fecha o ciclo sem saltos. */
.fita-tira{display:flex;align-items:center;height:100%;width:max-content;
  will-change:transform;animation:fita-correr linear infinite}
/* As imagens são 16:9 e aparecem inteiras. O `aspect-ratio` é obrigatório: dentro de
   um flex, `width:auto` numa imagem usa a largura intrínseca do ficheiro (880px) em vez
   de a deduzir da altura, e o conteúdo sai esticado. O `flex:none` impede que encolham
   e o `object-fit` garante que, havendo desvio, cortam em vez de deformar. */
.fita-tira img{display:block;flex:none;height:90%;width:auto;aspect-ratio:16/9;
  object-fit:cover;margin-right:var(--fita-gap)}
.fita--1 .fita-tira{animation-duration:140s}
.fita--2 .fita-tira{animation-duration:170s;animation-direction:reverse}
.fita--3 .fita-tira{animation-duration:155s}
@keyframes fita-correr{from{transform:translateX(0)}to{transform:translateX(-50%)}}


/* O viewBox é EXATAMENTE o puzzle montado (260x200), por isso ele enche o palco todo.
   As peças afastadas pintam para fora do SVG (overflow:visible) e vão parar por baixo
   do hero, que é opaco. A largura é limitada por três coisas: a caixa, um teto absoluto
   e a altura que sobra no ecrã convertida pela razão 260/200. Sem o terceiro termo o SVG
   não resolve `height:100%` numa grelha centrada e cresce para fora do ecrã. */
/* O TETO (`--teto`) é o que trava o puzzle nos ecrãs grandes. Sem ele quem mandava era
   sempre a altura, e num ecrã de 2560x1290 o puzzle media 1485px de largura com o título
   das peças a 35px — o cliente chamou-lhe "ENORME" (2026-09-22). O texto vive dentro do
   SVG e escala com ele, por isso travar a largura é travar a letra: a 1100px o título fica
   em 26px, entre os 24px de uma janela de 1600x900 (que ele aprova) e os 29px de 1080.
   Só morde a partir de ~1000px de altura de janela; abaixo disso continua a mandar a
   altura, e o que sobra do palco em volta é ocupado pelas fitas do fundo. */
/* Esta cor fica por baixo da fotografia: só se vê se a imagem não carregar. */
.puzzle{position:relative;z-index:1;--p-peca:#0d4441;
  --teto:1100px;
  --altura-util:calc(100svh - var(--altura-nav) - 2*clamp(14px,3vh,40px));
  width:min(100%,var(--teto),calc(var(--altura-util) * 260 / 200));
  height:auto;overflow:visible}

/* O JS escreve `transform` e `opacity` a cada frame; a transição fica só na sombra,
   para o encaixe da peça se notar sem competir com o movimento do scroll. */
/* Sem sombra nas peças: como elas encaixam umas nas outras, a sombra de cada uma
   caía sobre a vizinha e aparecia como manchas escuras dentro do puzzle. O que marca
   as juntas é um traço fino no contorno de cada peça. */
.peca{transform-box:fill-box;transform-origin:center;will-change:transform}

/* Todas as peças no mesmo tom: o verde escuro `--p-peca`, o da peça "O que fazemos"
   no protótipo. Opacas, é o que as destaca das imagens que passam atrás. */
/* O traço que marca as JUNTAS entre as peças. Subiu de .16/.5 para .45/.7 a pedido do
   cliente (2026-09-24: "mete um pequeno destaque nas linhas interiores do puzzle, porque
   mal se nota que estão encaixadas"). Cada peça traz o seu contorno completo, por isso nas
   juntas há DOIS traços encostados e no perímetro de fora há só um — é isso que faz o
   reforço marcar as juntas ao dobro sem transformar o puzzle num bloco com moldura. A cor
   é o verde escuro do fundo, não o preto: a junta lê-se como uma sombra entre peças. */
.peca-forma{fill:var(--p-peca);stroke:rgba(2,36,37,.45);stroke-width:.7}



.peca-icone{fill:none;stroke:#fff;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round}
.peca-titulo{fill:#fff;font-size:6.2px;font-weight:500;letter-spacing:.13em;text-anchor:middle}
.peca-corpo{fill:#fff;fill-opacity:.72;font-size:4.4px;font-weight:300;text-anchor:middle}

/* Montado e com o percurso todo cortado: a altura passa a vir do conteúdo, para não
   ficar pendurada num `calc` cujas duas parcelas já se anulam a menos de um pixel, e
   as peças largam o `will-change` — não voltam a mexer-se e não precisam de ter uma
   camada de composição reservada para elas enquanto se rola por cima. */
.essencia.montado{height:auto}
.essencia.montado .peca{will-change:auto}

/* Sem percurso (movimento reduzido): o puzzle aparece montado e a secção encolhe. */
.essencia.sem-percurso{height:auto;padding:clamp(48px,8vh,96px) 0}
.essencia.sem-percurso .essencia-palco{position:static;height:auto}

/* O bloco HTML de cada peça para ecrãs estreitos (`foreignObject`): escondido por
   omissão, aparece abaixo dos 560px no lugar do texto SVG — ver lá. */
.peca-movel{display:none}

/* ---------- Secção "Em números": contadores ---------- */
/* Volta ao verde do hero. É opaca e fica acima da secção do puzzle pelo mesmo motivo
   que o hero: uma peça que transborde do palco passa por baixo dela, não por cima. */
/* Vale um ecrã MENOS a navbar, a mesma conta do hero e do palco do puzzle. Com um
   ecrã inteiro sobravam no fim do scroll exatamente os pixels da barra: a secção
   ficava a passar por baixo dela e era preciso mais um bocadinho de scroll para
   chegar ao fundo. Assim, na última posição do scroll, a secção encosta por baixo
   da barra e acaba no fundo do ecrã. `min-height` e não `height`: em ecrãs baixos o
   conteúdo cresce para fora em vez de se cortar. */
.numeros{position:relative;z-index:2;background:var(--fundo);color:var(--ink);
  /* O TETO do conteúdo: o interior nunca passa desta altura (ver `.numeros .interior`).
     E a SECÇÃO pára de crescer no mesmo ponto: mede um ecrã menos a navbar, como as
     outras secções grandes, MAS nunca mais do que o interior travado e os dois respiros.
     Sem esta segunda parte, num ecrã de 2560x1290 ficavam 382px de verde vazio por baixo
     da segunda fila (532 numa de 1440) — o cliente apanhou-o logo: "entre os Resultados e
     os Projetos de Sucesso fica um espaçamento enorme" (2026-09-23). Como as duas secções
     são verdes, a fronteira entre elas não se vê, por isso a secção deixar de encher o
     ecrã não custa nada à vista; um vão de meio ecrã custava. Até ~900px de altura de
     janela quem manda continua a ser o ecrã e nada muda. */
  --teto:760px;
  min-height:min(calc(100svh - var(--altura-nav)),calc(var(--teto) + 2 * var(--respiro)));
  display:grid;
  padding:var(--respiro) clamp(16px,4vw,40px)}
/* Duas linhas: o título em cima, com a altura que precisar, e as métricas a ficar
   com todo o resto (`1fr`). É essa segunda linha que depois reparte o espaço. */
/* O `row-gap` é o MESMO respiro do padding: o título fica à mesma distância do topo da
   secção e da primeira fila de métricas. */
/* O `max-height` é o que trava o vão entre as duas filas nos ecrãs grandes. A secção
   continua a medir um ecrã inteiro (é o `min-height` da `.numeros`), mas o CONTEÚDO pára
   de crescer: 760px é, arredondado, o que uma janela de 900 de altura dá ao interior, e
   dá um vão de ~300px entre as filas — o que o cliente vê no ecrã pequeno e aprova. Num
   ecrã de 2560x1290 o vão ia aos 612px (2026-09-22: "um espaçamento enorme"). Como o
   interior é um item de grelha com o `stretch` travado pelo máximo, alinha-se ao início
   e o que sobra do ecrã fica no FIM da secção, como manda a regra de 2026-09-21 e como
   já acontece na Atualidade. NÃO é o mesmo que a experiência revertida de hoje (ver a
   nota da `.metricas`): aquela cortava a SECÇÃO a 900px e juntava as filas; esta mantém o
   vão que o ecrã pequeno tem — e a secção acompanha o teto (ver `--teto` na `.numeros`),
   para não sobrar verde vazio por baixo da segunda fila. */
.numeros .interior{max-width:1280px;width:100%;margin:0 auto;max-height:var(--teto);
  display:grid;grid-template-rows:auto 1fr;row-gap:var(--respiro)}

/* Título da secção. Mesmo corpo e mesmo peso dos outros (`--tipo-titulo`, em base.css);
   o que o afasta das métricas é o `row-gap` do `.interior` e não uma margem própria,
   senão as duas somavam-se. Está aqui no lugar da antiga frase do "#1" (a afirmação de
   ser a empresa com mais Contratos de Desempenho Energético em hotéis), que o cliente
   mandou retirar — se ela voltar, volta como conteúdo e não como título. */
.numeros-titulo{margin:0 auto;text-align:center;
  font-weight:200;font-size:var(--tipo-titulo);line-height:1.06;letter-spacing:-.01em}

/* Grelha de três colunas; cada métrica começa num traço fino, como uma tabela sem
   linhas verticais. Tudo alinhado à esquerda de propósito: o número muda de largura
   enquanto conta e, centrado, andaria de um lado para o outro. */
/* `space-between` (era `space-evenly`): a primeira fila cola ao respiro do título e a
   última ao respiro do fim, e o que sobra da altura do ecrã fica ENTRE as duas filas.
   Com `space-evenly` um terço da sobra ia parar por cima da primeira fila e o título
   ficava mais longe das métricas do que do topo — era isso que o cliente não queria.
   O `gap` fica a valer como distância mínima.
   REVERTIDO a 2026-09-22: experimentou-se `start` (filas juntas, sobra no fim) mais um
   teto de 900px na altura da secção, para fechar o vão que num ecrã de 1242 passa dos
   600px e para os Projetos subirem. O cliente viu e recusou — "ficou muito mau". Fica
   registado que o vão grande em ecrãs altos é o preço desta escolha, e que ele o
   prefere ao alinhamento no topo. */
.metricas{list-style:none;margin:0;padding:0;display:grid;grid-template-columns:repeat(3,1fr);
  align-content:space-between;gap:clamp(36px,6vh,72px) clamp(24px,4vw,64px)}
.metrica{border-top:1px solid rgba(255,255,255,.14);padding-top:clamp(16px,2.5vh,28px)}
/* O número grande, no peso fino do título do hero. Algarismos de largura fixa para a
   contagem não tremer; o "+" um pouco mais pequeno e subido, para não pesar tanto
   como um algarismo. */
.metrica-valor{margin:0;font-weight:200;font-size:clamp(48px,6vw,88px);line-height:1;
  letter-spacing:-.01em;font-variant-numeric:tabular-nums;white-space:nowrap}
.prefixo{font-size:.72em;vertical-align:.14em;margin-right:.02em;opacity:.85}
.metrica-rotulo{margin:14px 0 0;max-width:26ch;font-size:clamp(14px,1.2vw,16px);
  font-weight:300;line-height:1.5;opacity:.72}
.metrica-rotulo strong{font-weight:500}
.metrica-rotulo sub{font-size:.7em;line-height:0}


/* Entrada: cada métrica sobe e revela-se ao começar a contar. Só quando o JS marca a
   secção como preparada — sem ele, isto escondia tudo para sempre. A transição está
   só no estado visível: assim o esconder inicial é imediato e não se vê um fade-out. */
.numeros.preparada .metrica{opacity:0;transform:translateY(14px)}
.numeros.preparada .metrica.visivel{opacity:1;transform:none;
  transition:opacity .7s,transform .7s cubic-bezier(.2,.8,.2,1)}

/* ---------- Serviços: grelha de cartões ---------- */
/* Volta ao branco depois dos números, com o título centrado por cima da grelha. */
/* Secção de ecrã inteiro, como o hero, o palco do puzzle e os números: cabe toda em
   `100svh - navbar`, com a navbar já descontada.
   Doze cartões em 6 colunas x 2 filas, que é o arranjo pedido. O que distingue esta
   versão da primeira (que também era 6x2) é o TETO DA LARGURA: antes a grelha usava a
   janela toda e esticava-se até 1723px numa janela de 1900 — 91% dela, uma faixa. Agora
   pára nos 76% (1444px na mesma janela), deixando 228px de margem de cada lado do ecrã,
   e o quadrado fica em 229px.
   A consequência a conhecer: com duas filas, quem manda é SEMPRE a largura, nunca a
   altura. "Caber num ecrã" deixa de ser uma restrição que aperte — vem de graça — mas em
   troca sobra altura, e sobra muita: 362px numa janela de 1900x950. Não é afinação a
   menos, é geometria — para não sobrar nada, cada quadrado teria de ter 327px de lado, o
   que dá um bloco de 2093px, mais largo do que a própria janela. Só se escolhe QUANTO
   sobra, mexendo em `--banda`: subi-la dá quadrados maiores e menos vazio, baixá-la dá
   mais margem lateral e mais vazio.
   Esse vazio é repartido em TRÊS partes iguais pelo `justify-content:space-evenly` — por
   cima do título, entre o título e a grelha, e por baixo da grelha (121px cada numa
   janela de 1900x950). Foi pedido assim: a distância do título aos cartões igual à
   distância do título ao topo do ecrã.
   Dois números comandam tudo o que vem a seguir — a banda e o número de colunas (com as
   filas a acompanhá-lo, porque colunas × filas = 12). Estão isolados aqui em cima para
   se afinarem sem mexer nas contas, como o ATRASO e a JANELA do `puzzle.js`. */
.servicos{position:relative;z-index:2;background:#fff;color:var(--fundo);
  /* As duas cores da rede que corre por trás desta secção — as mesmas do convite; o
     `js/rede.js` lê-as daqui. Ver o porquê de serem componentes RGB na regra `.convite`. */
  --rede-tinta:2,36,37;
  --rede-pulso:15,143,122;
  /* Teto da largura do bloco. É uma percentagem da janela com um limite absoluto, e não
     uma medida fixa como os 1280px do resto do site: uma medida fixa que não estica em
     1900 (79%) fica esticada em 1600 (94%), porque o que faz a grelha parecer uma faixa
     é a fração da janela que ocupa, não o número de pixéis. */
  --banda:min(1600px,84vw);
  /* 4x3 desde 2026-09-22. Com 6x2 quem mandava era sempre a LARGURA e sobravam 267px de
     branco no fim da secção — geometria, não afinação: um quadrado que enchesse a altura
     precisaria de 344px de lado, o que dá um bloco mais largo do que a janela. Com três
     filas passa a mandar a ALTURA, e a altura é exatamente o que sobrava: a grelha enche
     o ecrã sem sobra nenhuma e o quadrado até cresce (225px contra 212). O preço é o
     bloco ficar mais estreito — 942px de 1600, contra 1344 —, que é o caminho contrário
     ao de setembro, quando o cliente achou o 6x2 "muito estendido para o lado".
     Doze cartões dividem certo por 6, 4, 3, 2 e 1: nunca há filas incompletas. */
  --colunas:4;
  --filas:3;               /* anda sempre a par de --colunas: colunas × filas = 12 */
  /* Margem lateral igual à do hero e à dos números (era clamp(16px,5vw,80px)): a
     grelha já não vai de bordo a bordo, por isso deixou de precisar da guarda extra
     contra a janela. Com a mesma margem e a mesma banda de `.numeros .interior`, a
     grelha alinha com as métricas da secção imediatamente acima — que é a comparação
     que o olho faz ao passar de uma para a outra. */
  --margem-lado:clamp(16px,4vw,40px);
  /* Entre cartões. Apertada a pedido do cliente: chegou a estar em 26px (para gastar
     altura vazia) e os cartões liam-se como doze caixas soltas em vez de uma grelha. A
     14px voltam a ler-se como um bloco só. A folga apertada também devolve largura aos
     quadrados — são cinco folgas por fila, por isso cada 2px que se lhe tira são ~1,7px
     de lado a mais em cada cartão. */
  --folga:clamp(8px,.9vw,14px);
  /* NOTA (2026-09-22): esta secção repartia o vazio do ecrã em três partes iguais — por
     cima do título, entre o título e a grelha, e por baixo dela. Dava os dois espaços do
     título iguais ENTRE SI (119px numa janela de 1600), mas muito maiores do que os das
     outras secções, que usam o `--respiro` da raiz (45px). O cliente marcou a diferença
     numa captura e pediu tudo igual, "nem que tenhas de aumentar ou preencher mais a
     secção dos serviços". Agora o respiro é o mesmo de todas e o que sobra vai para o FIM,
     como manda a regra de 2026-09-21. Saiu daqui o `--ar`, que era o mínimo dessas três
     partes. (Experimentou-se também esticar os cartões em altura para encher esse fim, e
     o cliente recusou — ver o comentário do `--lado`.) */
  /* O corpo do título já não é desta secção: vive em `:root` (base.css) e é o mesmo dos
     títulos das outras — pedido do cliente. Continua a entrar DUAS vezes aqui, na regra
     do <h2> e na conta da altura (`--titulo`), e é por isso que tem de ser uma variável:
     um valor copiado à mão de um sítio para o outro punha a conta a mentir e a última
     fila saía do ecrã sem aviso. Quem lhe mexer na raiz mexe no tamanho dos quadrados
     desta secção — chegou a estar em 76px e ficou pesado por cima da grelha. */
  /* Só a caixa de texto do título: a sua distância à grelha já não é uma margem própria,
     vem do `space-evenly`. */
  --titulo:calc(1.06 * var(--tipo-titulo));
  /* Largura de trabalho: a banda, ou a janela quando ela é mais estreita do que a
     banda. Os 17px são a barra de scroll, que o `100vw` conta e o layout não tem. */
  --util:min(var(--banda),calc(100vw - 2 * var(--margem-lado) - 17px));
  /* O vão que fica para a grelha: o ecrã menos a navbar, o título e TRÊS respiros — o de
     cima do título, o do título à grelha e o do FIM da secção. O terceiro entrou a
     2026-09-22, depois de a grelha passar a encher o ecrã: sem ele a última fila encostava
     à fronteira com a secção seguinte, sem folga nenhuma. Enquanto sobrava branco no fim
     ninguém dava por isso; a partir do momento em que a conta fecha, cada respiro tem de
     estar lá dentro. É a mesma conta das outras secções, só que aqui é preciso sabê-la em
     CSS porque é dela que sai o tamanho dos cartões. */
  --vao:calc(100svh - var(--altura-nav) - var(--titulo) - 3 * var(--respiro));
  /* E o que isso dá a cada fila. */
  --cabe:calc((var(--vao) - (var(--filas) - 1) * var(--folga)) / var(--filas));
  /* O cartão é quadrado: o lado é ao mesmo tempo largura e altura e tem de obedecer aos
     DOIS limites ao mesmo tempo — as colunas todas cabem na largura de trabalho e as
     filas todas cabem no ecrã. `--lado` é o menor dos dois e é dele que sai a largura do
     bloco e o tamanho de tudo o que vai dentro do cartão.
     O `max(130px,...)` é o chão: abaixo disso o rótulo mais comprido ("Contratos de
     Desempenho Energético", três linhas) já não cabe dentro do quadrado. Numa janela tão
     baixa que nem 130px cabem (ex. 900x500), é a secção que passa do ecrã — mais vale ter
     de dar scroll do que ver o texto a sair do cartão. */
  /* O `--teto` trava o quadrado nos ecrãs grandes: com três filas manda a altura, e num
     ecrã de 2560x1290 o lado ia aos 322px (372 em 1440) contra os 211 de uma janela de
     1600x900 — o cliente achou que "podiam não aumentar tanto" (2026-09-22). Aos 280px
     só morde a partir de ~1130px de altura de janela: numa de 1080 o lado dá 262 e não
     muda. O que sobra vai para o FIM da secção (`justify-content:flex-start`), como nas
     outras secções de ecrã inteiro. */
  --teto:280px;
  --lado:max(130px,
             min(var(--teto),var(--cabe),
                 calc((var(--util) - (var(--colunas) - 1) * var(--folga)) / var(--colunas))));
  /* REVERTIDO no mesmo dia: o cartão volta a ser QUADRADO. Chegou a esticar em altura
     para encher o vão (`--alto`, com teto de 1,45 vezes a largura) e o cliente recusou —
     "deixaram de ser quadrados e ficaram retângulos", e numa janela mais baixa do que as
     que medi a segunda fila encostava ao fim da secção. Fica assim a consequência, que é
     conhecida desde setembro e agora é escolha dele: com 6 colunas e 2 filas SOBRA sempre
     ecrã por baixo da grelha, porque um quadrado que enchesse a altura precisaria de
     344px de lado — um bloco de 2134px, mais largo do que a própria janela. O que sobra
     fica no FIM da secção, como manda a regra dos respiros. */
  /* A largura do bloco montado sai do LADO e não da banda: quando é a altura a mandar
     (janelas baixas), os quadrados ficam mais pequenos do que a largura permitia e o
     bloco tem de encolher com eles — senão o título ficava mais largo do que a grelha
     que encima. */
  --bloco:calc(var(--colunas) * var(--lado) + (var(--colunas) - 1) * var(--folga));
  /* A mesma medida do hero, do palco do puzzle e dos números: um ecrã menos a navbar.
     Com um ecrã inteiro sobrariam no fim exatamente os pixels da barra, que ela tapa.
     `min-height` e não `height` porque o quadrado tem chão (ver `--lado`): numa janela
     baixíssima o conteúdo cresce para fora em vez de se cortar. */
  min-height:calc(100svh - var(--altura-nav));
  scroll-margin-top:var(--altura-nav);   /* se um dia o menu apontar para #servicos */
  /* O respiro em cima do título é o mesmo de todas as outras secções (`--respiro`, na
     raiz); o de baixo dele é a margem de cima da `.grelha`. O que sobrar do ecrã fica no
     FIM, por baixo da grelha — nunca por cima de um título. */
  display:flex;flex-direction:column;justify-content:flex-start;
  padding:var(--respiro) var(--margem-lado)}

/* A rede e o véu ocupam a secção toda, por trás de tudo. O `z-index:0` é preciso: sem
   ele o canvas, que é um elemento POSICIONADO, pintava por cima dos cartões, que não o
   são — e a grelha desaparecia debaixo dele. */
.servicos-rede,.servicos-veu{position:absolute;inset:0;z-index:0;pointer-events:none}
.servicos-rede{width:100%;height:100%}
/* O clarão que limpa o que está por TRÁS do conteúdo, e só isso: uma elipse alta o
   bastante para envolver o título e as três filas de cartões, deixando a rede nas margens
   laterais e nos cantos — inclusive por cima do título e por baixo da grelha, que é onde
   o cliente a quer.
   Duas voltas até aqui: a primeira elipse era baixa (60% da altura) e a rede passava POR
   CIMA do título, que fica fora dela; a seguir tentou-se um gradiente horizontal, que
   limpava a faixa central de alto a baixo — e aí a rede desaparecia justamente das zonas
   que ele tinha marcado a vermelho. A elipse grande é o meio-termo: cobre o conteúdo e
   larga tudo o resto. */
/* O raio HORIZONTAL (o primeiro número) é o que manda a rede aproximar-se ou afastar-se
   dos cartões: 44% deixa-a chegar quase à borda da grelha, 52% empurrava-a para longe.
   O vertical fica alto, que é o que impede o véu de cortar por cima do título. */
.servicos-veu{background:radial-gradient(ellipse 44% 88% at 50% 50%,
  #fff 0%,#fff 46%,rgba(255,255,255,.9) 70%,rgba(255,255,255,0) 92%)}
/* O conteúdo sobe acima da rede. */
.servicos-titulo,.grelha{position:relative;z-index:1}

/* O título tem a largura exata da grelha: passam a ser a mesma coluna e não duas
   medidas parecidas que quase batem certo. Sem margem em baixo: quem o afasta da grelha
   é o `space-evenly` da secção, e uma margem aqui somava-se a esse espaço e desigualava
   os três. */
.servicos-titulo{max-width:var(--bloco);margin:0 auto;text-align:center;
  font-weight:200;font-size:var(--tipo-titulo);line-height:1.06;letter-spacing:-.01em}

/* Doze cartões dividem certo por 4, 3, 2 e 1: nunca há filas incompletas em nenhum dos
   arranjos — e por isso a grelha pode ser `grid` (em flex, o cartão quadrado era mais
   estreito do que a coluna e cabiam mais por fila do que as colunas pedidas). */
/* `margin:auto` nos quatro lados, e cada par faz uma coisa diferente: os lados centram a
   grelha na horizontal (como antes), e o topo e a base absorvem, em partes iguais, todo o
   espaço que sobrar na vertical depois do `padding-top` da secção. São estas duas margens
   automáticas que dão o espaço título->cartões e o espaço cartões->fim, e é por serem
   ambas `auto` que esses dois ficam sempre iguais entre si. */
.grelha{width:min(100%,var(--bloco));margin:var(--respiro) auto auto;flex:0 0 auto;
  display:grid;grid-template-columns:repeat(var(--colunas),minmax(0,1fr));gap:var(--folga)}

/* Ícone em cima, nome por baixo, tudo centrado. O contorno é fino de propósito — são
   doze caixas lado a lado e um traço mais forte transformava a grelha numa rede.
   `min-width:0` porque um item da grelha não encolhe abaixo do seu conteúdo sem isso, e
   uma palavra comprida de um rótulo chegava para alargar a coluna.
   `aspect-ratio` dá o quadrado; se um rótulo comprido precisar de mais altura, a fila
   cresce e todos os cartões dela crescem juntos — nunca ficam desalinhados.
   O que está lá dentro mede-se em `--lado` (o lado do quadrado) e não em `vw`: num ecrã
   largo e baixo os cartões são pequenos mas a janela é larga, e com `vw` o ícone e o
   texto cresciam até rebentar o quadrado por baixo.
   Só os TETOS destes clamps subiram (ícone 46->58, texto 17->19): as PROPORÇÕES são as
   mesmas, por isso nos ecrãs pequenos — onde manda o valor calculado e não o teto —
   fica tudo como estava; num quadrado de 306px é que o conteúdo antigo ficava perdido
   no meio do branco. */
.cartao{aspect-ratio:1;min-width:0;
  display:flex;flex-direction:column;align-items:center;justify-content:center;
  gap:clamp(8px,calc(var(--lado) * .07),24px);
  padding:clamp(10px,calc(var(--lado) * .10),28px) clamp(8px,calc(var(--lado) * .08),22px);
  text-align:center;
  /* Os doze são links desde 2026-09-25 — onze para o seu serviço na página de Serviços e
     o último para o topo dela —, por isso a cor e o sublinhado do link são anulados AQUI e
     não só no `--mais`: o que se lê continua a ser um cartão. */
  color:inherit;text-decoration:none;
  border:1px solid rgba(var(--fundo-rgb),.14);
  /* O canto acompanha o quadrado: 14px num cartão de 160px e 14px num de 306px não são
     o mesmo canto — no segundo já se lia como reto. Era a única medida do cartão que
     tinha ficado em pixéis fixos. */
  border-radius:clamp(14px,calc(var(--lado) * .06),20px);background:#fff;
  transition:border-color .25s,box-shadow .25s,transform .25s}
.cartao h3{margin:0;font-size:clamp(12px,calc(var(--lado) * .082),19px);font-weight:500;
  line-height:1.35;letter-spacing:.01em;text-wrap:balance}
/* Mesmo desenho dos ícones da esfera (vêm do mesmo sprite), mas o traço tem de ser
   outro número: a espessura está em unidades da grelha de 24 do desenho, por isso
   engorda com o ícone. A 58px, o `1.7` da esfera dava um traço desenhado de 4,1px — o
   dobro do que se vê na esfera; com `1.5` ficam 3,6px, perto dos 3,3px que o cartão de
   hoje já tem aos 46px. Nos ecrãs pequenos, onde o ícone volta a ter medida fixa, volta
   também o 1.7. */
/* A largura e a altura TÊM de ser o mesmo clamp: o ícone é quadrado, e dois valores
   diferentes deformam-no. */
.cartao-icone{width:clamp(28px,calc(var(--lado) * .25),58px);
  height:clamp(28px,calc(var(--lado) * .25),58px);display:block;
  color:var(--fundo);fill:none;stroke:currentColor;stroke-width:1.5;
  stroke-linecap:round;stroke-linejoin:round;transition:transform .25s}
/* O último cartão leva ao TOPO da página de Serviços, onde os treze estão um a um com o
   seu texto; os outros onze levam cada um AO SEU. Mantém a forma dos outros para a grelha
   não partir; o que o distingue é o sublinhado do "aqui" e o ícone de seta para fora. A
   4x3 calha-lhe o canto inferior direito — o fim natural da leitura e o fim da secção. */
.cartao--mais h3 span{text-decoration:underline;text-decoration-thickness:1px;
  text-underline-offset:3px}
/* O foco de teclado é dos DOZE e não só do último: agora são todos links. */
.cartao:focus-visible{outline:2px solid var(--fundo);outline-offset:3px}

@media (hover:hover){
  .cartao:hover{border-color:rgba(var(--fundo-rgb),.5);transform:translateY(-3px);
    box-shadow:0 12px 30px rgba(var(--fundo-rgb),.10)}
  .cartao:hover .cartao-icone{transform:scale(1.08)}
  .cartao--mais:hover h3 span{text-decoration-thickness:2px}
}

/* ---------- Fita horizontal (parceiros) ---------- */
/* Hoje só há uma faixa a passar em ciclo (os projetos também foram fita, até passarem a
   carrossel de páginas em 2026-09-17), mas a mecânica fica agarrada aos atributos
   `data-fita` (a janela) e `data-fita-tira` (a tira que anda) — os mesmos por onde o
   `fitas.js` as encontra — e não à classe da secção: qualquer outra que venha entra sem
   código novo. Cada secção traz depois a sua pele e os seus três números: `--ritmo`,
   `--copias` e `--sentido`.

   A tira leva a lista repetida `--copias` vezes e a volta desloca exatamente UMA cópia,
   por isso a seguinte entra onde a anterior saiu e o ciclo não tem salto. O que fica a
   cobrir a janela são as cópias restantes: (copias - 1) x uma cópia tem de dar mais do
   que a janela mais larga.

   Sem `gap` de propósito: com margem à direita em cada item (a última incluída), uma
   cópia mede exatamente 1/`--copias` da tira e a conta da volta fecha certa. */
[data-fita]{overflow:hidden;
  /* `touch-action:pan-y` é o que divide os gestos num telemóvel: o horizontal é nosso
     (arrastar a fita), o vertical continua a ser do browser (rolar a página). Sem isto
     o browser ficava com os dois e o arrasto nunca chegava a acontecer. A seleção é
     desligada porque arrastar por cima de imagens selecionava tudo à volta. */
  touch-action:pan-y;-webkit-user-select:none;user-select:none}
[data-fita-tira]{display:flex;align-items:center;width:max-content;
  will-change:transform;animation:fita-passar var(--ritmo) linear infinite}
@keyframes fita-passar{from{transform:translateX(0)}
  to{transform:translateX(calc(-100% / var(--copias)))}}

/* Nada de `animation-play-state:paused` no hover: a fita não pára por o rato lhe passar
   por cima, nem com JavaScript nem sem ele. Só o arrasto a detém — e sem JavaScript não
   há arrasto, por isso aqui ela nunca pára. */

/* Com o `fitas.js` a correr, a animação CSS sai de cena: as duas escreviam o mesmo
   `transform` e a animação apagava a cada frame o que o dedo tinha acabado de fazer.
   A partir daqui é o JS que move a tira — e é ele que lhe dá o arrasto. */
[data-fita].fita-viva [data-fita-tira]{animation:none}
[data-fita].fita-viva{cursor:grab}
[data-fita].a-arrastar{cursor:grabbing}


/* ---------- Parceiros de referência ---------- */
/* Última faixa da página: os logótipos passam em ciclo, da esquerda para a direita.
   (Esteve, entre outras, numa versão de ecrã inteiro com os logótipos parados e
   espalhados, a crescerem com o rato — o cliente preferiu a fita.) */
.parceiros{position:relative;z-index:2;background:#fff;color:var(--fundo);
  /* Todos os PNG são exportados na mesma caixa (520x240, logótipo centrado e com o
     tamanho já normalizado pelo peso de tinta — ver o script que os preparou). Por isso
     basta fixar a altura: a largura sai igual para todos e a fita fica com um ritmo
     certo, sem um logótipo largo a empurrar os vizinhos. */
  /* Subiram com o fecho: os prémios encolheram um pouco e o que eles deixaram foi para
     aqui, a pedido do cliente. */
  --altura-logo:clamp(58px,7.5vw,118px);
  --folga-logo:clamp(24px,3.5vw,64px);
  /* O que tem de ser igual entre fitas não é o tempo da volta, é a VELOCIDADE: ~40px/s.
     Cada vez que os logótipos mudam de tamanho OU de número, uma cópia da lista muda de
     largura e este número tem de ser refeito — é a quinta vez que esta conta aparece.
     Agora são duas fitas com nove logótipos cada: uma cópia mede ~2800px, e 2800/40 dá os
     70s. (Eram 140s com os dezoito numa fita só, onde a cópia media 5610px; mantê-los
     punha estas fitas a 20px/s, metade do que devem andar.) */
  --ritmo:70s;
  --sentido:-1;            /* da esquerda para a direita */
  /* Uma cópia de nove logótipos mede ~2800px e ainda cobre sozinha a janela mais larga
     que se testa (2560), por isso duas continuam a chegar. Tem de bater certo com
     `COPIAS_PARCEIROS` em `core/views.py` — e o `testar_fitas.py` mede a cobertura, por
     isso um engano aqui não passa despercebido. */
  --copias:2;
  /* O mesmo respiro dos dois lados: em cima é a distância do título ao topo do fundo, em
     baixo é a do selo ao fim do fecho. */
  padding:var(--respiro) 0;
  /* A secção ocupa o fecho todo (é a única lá dentro), em coluna: título, fita e selo.
     É o que permite ao selo assentar no MEIO do que sobra do ecrã — ver a regra dele. */
  flex:1;display:flex;flex-direction:column}

/* Mesmo corpo dos outros títulos de secção (`--tipo-titulo`, em base.css). A margem
   lateral existe só para o título — a fita passa de bordo a bordo. */
.parceiros-titulo{margin:0 auto var(--respiro);text-align:center;
  padding-inline:clamp(16px,4vw,40px);
  font-weight:200;font-size:var(--tipo-titulo);line-height:1.06;letter-spacing:-.01em}

/* EXPERIÊNCIA de 2026-09-21: os selos de louro vivem agora AQUI, no MEIO da secção, em
   LINHA e entre as duas fitas de logótipos (saíram o título "Distinções" e os quatro
   selos institucionais que rodeavam o "#1 ESE"). O "#1 ESE" fica ao meio e um pouco
   maior. Estiveram numa linha por baixo da fita única e em pirâmide, nesse mesmo dia.

   Três números afinam a fila, e estão os três aqui em cima: `--banda`, que é a fração da
   janela que ela ocupa, o `1.25` do selo do meio e o `--lateral`, que encolhe só os dois
   de fora. Da banda sai a UNIDADE de medida: três selos e duas folgas enchem-na, e como o
   do meio vale 1,25 unidades é `(banda - 2 folgas) / 3,25`.

   A caixa ESTICA pelo espaço que sobra do ecrã (`flex:1 0 auto`) e os selos centram-se
   dentro dela, o que os deixa a meio caminho entre as duas fitas. */
.selos{--banda:min(1520px,94vw);
  --folga:clamp(16px,2.5vw,48px);
  /* A altura que sobra para os selos, depois de descontar tudo o que a secção tem por
     cima e por baixo deles: a navbar, os CINCO respiros (topo, título, fita de cima,
     selos, fim), o título e as DUAS fitas. Todas as parcelas são nossas, por isso a conta
     fecha — é a mesma ideia do `--livre` da grelha dos serviços. A segunda fita e o quinto
     respiro são o preço desta experiência: numa janela de 1600x900 a altura livre desceu
     de 498 para 335px. */
  --livre:calc(100svh - var(--altura-nav) - 5*var(--respiro)
               - 1.06*var(--tipo-titulo) - 2*var(--altura-logo));
  /* Teto de altura da UNIDADE: em linha só o do meio usa a altura toda, e ele vale
     1,25 unidades. */
  --alt:calc(var(--livre)/1.25);
  /* Teto de largura da UNIDADE: três lado a lado mais as duas folgas enchem a banda. */
  --lado:calc((var(--banda) - 2*var(--folga))/3.25);
  /* Quanto vale um selo LATERAL, em unidades. O do meio vale sempre 1,25 unidades, por
     isso este número encolhe só os dois de fora e não lhe toca — que é precisamente o
     que o cliente pediu. Era 1 (os laterais a cheio) até 2026-09-22. Mexer aqui não
     muda o tamanho do "#1 ESE"; o que muda é o vão entre os três, porque a fila é
     centrada e o que os selos deixam de ocupar fica repartido pelos lados. */
  --lateral:.8;
  /* A fila ocupa a LARGURA TODA da janela e reparte o vazio por `space-evenly`: os
     quatro espaços — da borda ao selo da esquerda, dele ao do meio, do meio ao da
     direita e deste à borda — ficam iguais POR CONSTRUÇÃO, sem número nenhum a afinar.
     Foi o que o cliente pediu, com quatro setas marcadas numa captura. (Antes a fila
     era `fit-content` centrada por margens automáticas, com o `--folga` entre os selos:
     os vãos internos valiam a folga e as margens valiam tudo o que sobrava, que é
     precisamente a desigualdade que ele apanhou.)
     Sem `gap`: com `space-evenly` ele SOMA-SE ao espaço repartido, e os dois vãos de
     dentro ficariam maiores do que os de fora — a desigualdade de volta, ao contrário.
     O `--folga` continua a valer na conta do `--lado`, onde reserva a largura que
     garante que a sobra existe. */
  margin-block:var(--respiro);width:100%;
  flex:1 0 auto;
  display:flex;align-items:center;justify-content:space-evenly}

/* `max-width` e `max-height`, e não medidas fixas: o selo encolhe pelo limite que morder
   primeiro e nunca deforma. Em janelas largas manda a largura (a banda repartida por
   três); nas baixas manda a altura, e é isso que impede a fila de empurrar a fita de baixo
   para fora do ecrã. As três imagens têm proporções parecidas mas não iguais (entre 2,25 e
   2,50), por isso ficam com alturas ligeiramente diferentes e o `align-items:center`
   alinha-as pelo meio.

   Os dois de fora são EXATAMENTE do mesmo tamanho porque saem do script na mesma caixa
   (ver o `PAR` em `ferramentas/preparar_premios.py`): os louros do cliente têm medidas
   diferentes e, à mesma altura, davam larguras diferentes — 431 contra 421px, que ele
   apanhou numa captura. Quem fica de que lado vem da ordem da lista `SELOS` na view. */
.selo{display:block;max-width:calc(var(--lado)*var(--lateral));
  max-height:calc(var(--alt)*var(--lateral));width:auto;height:auto}
.selo--principal{max-width:calc(var(--lado)*1.25);max-height:calc(var(--alt)*1.25)}

/* Em ecrãs estreitos três numa fila ficariam ilegíveis (114px de largura cada num
   telemóvel de 430): passam a uma coluna, com a mesma relação de tamanhos entre eles (o
   do meio a 1,25 unidades, os de fora a `--lateral`).
   A altura livre é então repartida pelos TRÊS (3,25 alturas, com o do meio a valer 1,25)
   e a folga entra duas vezes — com os laterais mais pequenos sobra altura, que é folga
   a mais e não a menos. */
@media (max-width:900px){
  /* Em coluna o `space-evenly` passaria a repartir a ALTURA (é o eixo principal) e os
     selos descolavam-se uns dos outros pelo palco todo: aqui o vão volta a ser o
     `--folga` e a fila volta a ser centrada. */
  .selos{flex-direction:column;justify-content:center;gap:var(--folga);
    --lado:min(330px,70vw);
    --folga:clamp(10px,2.4vh,26px);
    /* O chão de 96px: num telemóvel DEITADO (844x390) a altura livre é negativa — a
       navbar, os cinco respiros, o título e as duas fitas somam mais do que o ecrã — e
       os três selos saíam com 9px de altura. Aqui é a secção que passa do ecrã, que é o
       que tem de acontecer; em pé (390x844) a conta dá 148px e o chão não morde. */
    --alt:max(96px,calc((var(--livre) - 2*var(--folga))/3.25))}
}


/* A fita ocupa a largura toda da janela: cortá-la na banda de 1280px punha os logótipos
   a aparecer e a desaparecer no meio do branco, como se entrassem por uma porta. O véu
   nas pontas (`mask`) desvanece-os contra o fundo em vez de os cortar a direito. */
.parceiros-fita{
  -webkit-mask-image:linear-gradient(90deg,transparent,#000 8%,#000 92%,transparent);
  mask-image:linear-gradient(90deg,transparent,#000 8%,#000 92%,transparent)}
.parceiros-tira img{display:block;flex:none;height:var(--altura-logo);width:auto;
  margin-right:var(--folga-logo)}
/* Sem JavaScript a volta é a animação CSS, e é aqui que ela troca de sentido (da esquerda
   para a direita). Com o `fitas.js` esta linha deixa de contar: quem inverte passa a ser
   o `--sentido`. */
.parceiros-tira{animation-direction:reverse}


/* ---------- Projetos de sucesso ---------- */
/* Carrossel de páginas, logo a seguir aos serviços: três cartões de cada vez, a volta
   fecha (da última página passa-se à primeira) e as páginas passam sozinhas de dez em
   dez segundos, parando mal o rato lhes toque. Passa-se também à mão, com as setas dos
   lados, com os pontos, com o teclado ou com o dedo. (Foi fita em ciclo, como a dos
   parceiros, até 2026-09-17; o cliente preferiu mandar ele na passagem.) O verde do hero
   separa-o da grelha branca que vem antes e da faixa branca dos parceiros que vem a
   seguir. */
.projetos{position:relative;z-index:2;background:var(--fundo);color:#fff;
  /* Cartões por página. Uma página é sempre a largura da janela do carrossel: o cartão
     sai daí (largura menos as folgas, a dividir por este número), não de uma medida
     própria. Abaixo de 900px passa a um.
     ATENÇÃO: o total de cartões (nove, na lista `PROJETOS` da view) tem de ser múltiplo
     deste número, senão a última página encosta ao fim da lista e o passo até lá fica
     mais curto do que os outros — o que, numa volta que nunca acaba, se nota. Nove
     divide certo por 3 e por 1; é por isso que não há um valor 2 pelo caminho. */
  --por-pagina:3;
  --folga-projeto:clamp(14px,1.6vw,28px);
  /* As setas têm coluna própria de cada lado da janela — nunca ficam por cima das
     fotografias. Em janelas largas cabem na margem que sobra ao lado da banda de 1280px
     (ver o `max-width` do `.carrossel`); nas estreitas é a janela do carrossel que cede. */
  --seta:clamp(38px,3vw,48px);
  --folga-seta:clamp(10px,1.4vw,22px);
  /* A passagem de página: quanto tempo leva e com que curva. É aqui que se afina o
     "smooth". A curva arranca depressa e assenta devagar, como a esfera a parar. */
  --passagem:.7s;
  --curva:cubic-bezier(.22,.61,.36,1);
  /* Quanto tempo uma página fica à vista antes de a seguinte entrar sozinha. O
     `carrossel.js` lê isto a cada agendamento (e não uma vez no arranque), por isso
     afinar é mesmo aqui. A contagem pára com o rato em cima, com o dedo em baixo, com o
     foco de teclado lá dentro, fora do ecrã e com o separador escondido — e recomeça do
     princípio a cada passagem, venha ela do relógio ou do utilizador. */
  --intervalo:5s;
  /* Respiro igual em cima e em baixo, o mesmo que separa o título do carrossel. */
  padding:var(--respiro) 0}
/* Nota: esta secção já foi de ECRÃ INTEIRO duas vezes — em 2026-09-16 com duas filas de
   fotografias, e em 2026-09-17 para o selo "#1 ESE" branco assentar no verde por baixo do
   carrossel. As duas foram revertidas pelo cliente; o que fica é a faixa. */

/* A margem em baixo é que separa o título do carrossel: a faixa não tem `gap`. É o
   mesmo respiro do padding de cima da secção. */
.projetos-titulo{margin:0 auto var(--respiro);text-align:center;
  padding-inline:clamp(16px,4vw,40px);
  font-weight:200;font-size:var(--tipo-titulo);line-height:1.06;letter-spacing:-.01em}

/* Seta | janela | seta, com os pontos por baixo da janela. A banda é a dos 1280px do
   resto do site MAIS as duas colunas das setas: assim, em janelas largas, é a janela do
   carrossel que fica alinhada com as métricas e com a grelha dos serviços, e as setas
   ficam de fora, na margem. `minmax(0,1fr)` porque uma coluna `1fr` não encolhe abaixo
   do conteúdo e a tira é mais larga do que a janela. */
.carrossel{display:grid;grid-template-columns:auto minmax(0,1fr) auto;
  grid-template-areas:"antes janela depois" ". pontos .";
  align-items:center;column-gap:var(--folga-seta);
  max-width:calc(1280px + 2 * (var(--seta) + var(--folga-seta)));
  margin:0 auto;padding-inline:clamp(16px,4vw,40px)}

/* Sem JavaScript a janela é um contentor de scroll horizontal com paragens cartão a
   cartão, e as setas ficam escondidas (não há quem lhes responda) — mas guardam o lugar,
   para o layout não saltar quando o JS chega e as mostra. Com o `carrossel.js` a correr
   (`.vivo`), a janela fecha-se e é o `transform` da tira que mostra cada página. */
.carrossel-janela{grid-area:janela;min-width:0;overflow-x:auto;overflow-y:hidden;
  scroll-snap-type:x mandatory;scrollbar-width:none;
  /* Como na fita: o gesto horizontal é nosso (puxar a página), o vertical continua a
     ser do browser (rolar a página). A seleção é desligada porque arrastar por cima de
     imagens selecionava tudo à volta. */
  touch-action:pan-y;-webkit-user-select:none;user-select:none}
.carrossel-janela::-webkit-scrollbar{display:none}
.carrossel.vivo .carrossel-janela{overflow:hidden;scroll-snap-type:none;cursor:grab}
.carrossel.a-arrastar .carrossel-janela{cursor:grabbing}

/* A tira leva os cartões numa linha. O `carrossel.js` clona a lista para cada lado, por
   isso em uso são três cópias seguidas e a de repouso é a do meio — é o que dá folga
   para a passagem atravessar a fronteira e a volta fechar sem recuar. */
.carrossel-tira{display:flex;gap:var(--folga-projeto);
  will-change:transform;transition:transform var(--passagem) var(--curva)}
/* Com o dedo em baixo a tira segue-o sem atraso; ao redimensionar a janela, a página
   reposiciona-se sem deslizar. */
.carrossel.a-arrastar .carrossel-tira,
.carrossel.sem-passagem .carrossel-tira{transition:none}

.carrossel-seta{display:grid;place-items:center;width:var(--seta);height:var(--seta);
  padding:0;border:1px solid rgba(255,255,255,.4);border-radius:50%;
  background:transparent;color:#fff;cursor:pointer;visibility:hidden;
  -webkit-tap-highlight-color:transparent;
  transition:background .25s,color .25s,border-color .25s,opacity .25s}
.carrossel.vivo .carrossel-seta{visibility:visible}
[data-carrossel-antes]{grid-area:antes}
[data-carrossel-depois]{grid-area:depois}
.carrossel-seta svg{width:46%;height:46%;fill:none;stroke:currentColor;stroke-width:1.7;
  stroke-linecap:round;stroke-linejoin:round}
/* Nenhuma das setas chega a apagar-se: com a volta fechada há sempre para onde ir dos
   dois lados. */
@media (hover:hover){
  .carrossel-seta:hover{background:#fff;color:var(--fundo);border-color:#fff}
}
.carrossel-seta:focus-visible{outline:2px solid #fff;outline-offset:3px}

/* Um ponto por página. O da página à vista estica-se num TRAÇO que se vai preenchendo, e
   quando enche a página passa: é o tempo que falta, à vista. Os outros ficam círculos.
   Sem JS não há pontos nenhuns e a fila fecha-se.

   O preenchimento é um gradiente cortado pelo `background-size`, com a fração a vir do
   `--progresso` que o `carrossel.js` escreve a cada frame. Essa é a única coisa que o JS
   faz aqui — a forma, a cor e o tempo da transição são todos desta regra. */
.carrossel-pontos{grid-area:pontos;display:flex;justify-content:center;
  align-items:center;gap:10px;
  margin-top:clamp(18px,2.6vh,30px)}
.carrossel-pontos:empty{display:none}
/* `color:inherit` é obrigatório: um `<button>` não herda a cor do texto (traz a do
   sistema, que aqui saía preta sobre o verde) e é dela que sai o `currentColor` de que o
   traço e o seu leito se servem. Assim os pontos acompanham a cor da secção onde estiverem
   e não há um branco escrito à mão a assumir que o fundo é escuro. */
.carrossel-ponto{width:9px;height:9px;padding:0;border:0;border-radius:999px;
  color:inherit;cursor:pointer;-webkit-tap-highlight-color:transparent;
  background-color:rgba(255,255,255,.3);
  background-color:color-mix(in srgb,currentColor 30%,transparent);
  /* Sem transição no `background-size`: quem o anima é o JS, frame a frame. */
  transition:width .4s var(--curva),background-color .25s}
.carrossel-ponto[aria-current=true]{width:46px;
  background-image:linear-gradient(currentColor,currentColor);
  background-repeat:no-repeat;
  background-size:calc(var(--progresso,0) * 100%) 100%}
.carrossel-ponto:focus-visible{outline:2px solid currentColor;outline-offset:3px}

/* Se um dia os cartões couberem todos numa página (uma lista curta, uma janela larga),
   não há volta a dar: as cópias e os controlos saem de cena. Quem decide é o JS, que é
   quem sabe quantas páginas há. */
.carrossel.sem-voltas .copia,
.carrossel.sem-voltas .carrossel-seta,
.carrossel.sem-voltas .carrossel-pontos{display:none}

/* O cartão é a janela da fotografia: recorta-a e é a caixa onde o véu do texto assenta.
   A largura sai da página — a janela menos as folgas entre cartões, a dividir pelos que
   cabem numa — e `flex:none` para o cartão não encolher quando os nove não cabem.
   `margin:0` porque o `<figure>` traz do browser 40px de margem de cada lado (e 1em em
   cima e em baixo): sem o zero, cada cartão empurrava o vizinho 80px e a conta das
   páginas saía toda do sítio — foi o teste que o apanhou. */
/* O cartão é a fotografia MAIS a legenda por baixo (2026-09-22): quem tem proporção fixa
   é a fotografia, não o cartão, senão a legenda comia-lhe altura. */
.projeto{flex:none;margin:0;
  width:calc((100% - (var(--por-pagina) - 1) * var(--folga-projeto)) / var(--por-pagina));
  scroll-snap-align:start;
  display:flex;flex-direction:column;gap:clamp(8px,.9vw,14px)}
.projeto-foto{position:relative;aspect-ratio:16/10;overflow:hidden;
  border-radius:clamp(10px,1vw,16px);background:rgba(255,255,255,.06)}
.projeto img{display:block;width:100%;height:100%;object-fit:cover;
  transition:transform .5s ease}
.projeto:hover img{transform:scale(1.05)}

/* A legenda: o nome do sítio, SEMPRE à vista. Em maiúsculas por regra de estilo e não no
   texto — em maiúsculas no HTML, um leitor de ecrã arrisca-se a soletrar letra a letra. */
/* Peso 300, o do texto corrido do site. Esteve em 500 e o cliente achou-o negrito; a 400
   continuava a pesar mais do que o título da secção, que é 200 — e a diferença nota-se
   mais do que parece, porque a legenda tem menos de metade do corpo do título (15px
   contra 32) e a mesma espessura num corpo pequeno lê-se como mais densa. Não se desce a
   200 de propósito: a 15px, em maiúsculas e em branco sobre o verde escuro, os traços
   ficariam frágeis — texto claro sobre fundo escuro já parece mais fino do que é. */
.projeto-nome{margin:0;padding-inline:2px;font-weight:300;text-transform:uppercase;
  font-size:clamp(12px,1vw,15px);line-height:1.3;letter-spacing:.06em;
  text-wrap:balance;opacity:.94}

/* O véu e a descrição são a MESMA camada: o que escurece a fotografia é o fundo da caixa
   onde o texto vive, por isso aparecem sempre juntos e não há dois tempos a acertar. Fica
   no HTML mesmo quando não se vê (`opacity`, e não `display:none`) porque quem usa leitor
   de ecrã tem de o ouvir — passar o rato não é coisa que se consiga fazer.
   O nome saiu daqui para baixo da fotografia; o que fica é só o que se foi lá fazer. */
.projeto-feito{position:absolute;inset:0;margin:0;
  display:flex;flex-direction:column;justify-content:center;align-items:center;
  padding:clamp(16px,2vw,30px);text-align:center;
  background:rgba(var(--fundo-rgb),.86);
  font-weight:300;font-size:clamp(12px,.92vw,14.5px);line-height:1.45;
  text-wrap:pretty;
  opacity:0;transition:opacity .28s ease}
.projeto:hover .projeto-feito,
.projeto:focus-within .projeto-feito{opacity:1}

/* Num ecrã de toque não há rato para passar por cima, por isso a descrição não pode
   depender disso: fica à vista sobre um degradê em vez do véu inteiro — a fotografia
   continua a ver-se e o texto continua a ler-se. O nome já está por baixo, à vista dos
   dois modos. */
@media (hover:none){
  .projeto-feito{opacity:1;justify-content:flex-end;align-items:flex-start;text-align:left;
    background:linear-gradient(to bottom,transparent 30%,rgba(var(--fundo-rgb),.55) 58%,
                                         rgba(var(--fundo-rgb),.93))}
  .projeto:hover img{transform:none}
}

/* ---------- Prémios e distinções ---------- */
/* Última secção da página. Fundo BRANCO, ao contrário do verde das secções escuras:
   escolha do cliente, e é também o fundo em que os selos (amarelo, azul, verde) se leem
   melhor — foram feitos para papel timbrado.

   Duas colunas: os quatro selos institucionais numa grelha de 2x2 à esquerda, e o "#1
   ESE" em grande à direita, que é o destaque. O conjunto fica a meio do ecrã.

   (Antes disto, o "#1" foi um selo desenhado em SVG, com os ramos de louro gerados por
   script. O cliente fez a imagem dele e essa versão saiu.) */
/* ---------- O fecho da página: prémios + parceiros num ecrã ---------- */
/* As duas últimas secções cabem JUNTAS num ecrã, entre a navbar e o fim da janela. É por
   isso que estão dentro de um contentor: nenhuma delas tem altura própria, a altura é do
   conjunto, e o espaço que sobra reparte-se entre as duas.

   A conta é `100svh` CHEIO com a navbar somada ao padding de cima, e não `100svh` menos a
   navbar como nas secções de cima. A barra é `sticky`: quando o scroll encosta isto ao
   topo do documento, ela fica POR CIMA dos primeiros 70px. Com o desconto, sobravam 70px
   por baixo — nas secções de cima ninguém dá por isso, porque a seguir vem sempre outra
   cor, mas aqui é o fim da página. Assim, o bloco ocupa a janela toda e o conteúdo fica
   centrado no que se VÊ, não na caixa que começa escondida. */
/* O branco tem de estar AQUI e não só nas duas secções: o espaço que sobra (o padding da
   navbar e o que o `justify-content` reparte) é do contentor, e sem fundo próprio deixava
   ver o verde escuro do `body` em duas faixas, uma por baixo da barra e outra no fim. */
/* `flex-start` e não `center` (mudou a 2026-09-21, quando os prémios ganharam título): com o
   conjunto centrado, o que sobrava do ecrã ficava metade por cima e metade por baixo — e
   por cima de um selo lia-se como ar, mas por cima de um TÍTULO lê-se como um buraco (o
   cliente viu 190px de branco entre a barra e o "Distinções" numa janela de 1920).

   E já não leva a altura da navbar em padding nem mede `100svh` cheio: isso servia quando
   o fecho era o FIM da página e ficava encostado ao topo do documento, com a barra por
   cima dos primeiros 70px. Hoje vêm as notícias e o convite a seguir, o fecho só passa
   pelo topo de passagem, e esses 70px eram branco a mais por cima do título (o cliente
   marcou-o com um traço). Mede como as outras secções grandes: um ecrã menos a barra.

   O título assenta a `--respiro` do topo e o selo a `--respiro` do título; o que sobrar
   do ecrã fica no FIM, por baixo dos parceiros — nunca por cima de um título. */
.fecho{position:relative;z-index:2;background:#fff;
  min-height:calc(100svh - var(--altura-nav));
  display:flex;flex-direction:column;justify-content:flex-start}

/* NOTA: aqui viviam as regras da secção "Distinções" — `.premios`, `.premios-titulo`,
   `.premios-interior`, `.premio-destaque` e as quatro `.honra--*`, que punham o selo
   "#1 ESE" ao centro com os quatro selos institucionais nos cantos à volta dele.
   Ficaram sem uso a 2026-09-21, quando o cliente tirou a secção do fecho, e foram
   apagadas a 2026-09-22, quando os quatro selos voltaram à página noutro sítio — na
   faixa do convite (`.provas`), com outro arranjo. O arranjo em cantos e o porquê de cada
   medida estão no registo de decisões do CLAUDE.md, se um dia voltar. */


/* ---------- Últimas notícias ---------- */
/* Última secção da página: as três notícias mais recentes, uma em DESTAQUE à esquerda
   (com fotografia) e as três numa lista à direita. Quem troca o destaque é o SCROLL.

   É a mecânica do puzzle da secção "A Âmago": a secção é mais alta do que um ecrã, o
   palco fica preso ao topo e a altura a mais serve de PERCURSO — é a posição do scroll
   dentro dele que decide qual notícia está em cena (`static/js/noticias.js`).

   `--percurso` é o único número a afinar: é quanto scroll o palco fica preso, além do
   ecrã que ocupa. Com três notícias, cada uma vale um terço dele - a 144svh são 432px
   numa janela de 900, ou seja QUATRO golpes de roda no Chrome (três linhas, ~100px cada).

   Subiu em três passos, todos pedidos pelo cliente depois de ver a secção a funcionar:
   36svh (um golpe por notícia, como ele a tinha pedido de início), 72svh (dois) e agora
   144svh. É coerente com a mecânica: com a passagem presa ao scroll, o golpe que antes
   trocava a notícia de uma vez passou a ter de dar também o movimento todo, e a um golpe
   por notícia a passagem acontecia quase sem se ver.

   O preço está pago em altura de página: a secção mede agora 2,4 ecrãs para três
   notícias. É o limite que vale a pena ter presente — daí para cima lê-se como scroll
   preso, que é a queixa que o cliente já fez do puzzle.

   Fundo verde: as duas secções que vêm antes são brancas e sem a troca de cor liam-se
   como uma só. Fecha também a página no verde da marca, como o hero a abre. */
.noticias{position:relative;z-index:2;background:var(--fundo);color:#fff;
  --percurso:144svh;
  /* O verde da secção com os 4,5% de branco que o cartão tinha por cima, já misturados:
     é preciso ser opaco para a notícia que entra tapar a que sai. */
  --noticia-fundo:#0d2e2f;
  height:calc(100svh - var(--altura-nav) + var(--percurso))}

/* O palco vale um ecrã e fica preso por baixo da navbar. A altura é `100svh` MENOS a
   barra, como nas outras secções grandes: aqui o palco encosta-se-lhe por baixo (`top`),
   e não ao topo do documento, por isso a barra não lhe tapa nada. */
.noticias-palco{position:sticky;top:var(--altura-nav);
  height:calc(100svh - var(--altura-nav));
  display:grid;place-items:center;
  padding:var(--respiro) clamp(16px,4vw,40px)}

/* `flex-start` e `gap` igual ao padding do palco: o título fica à mesma distância do topo
   e do cartão. Esteve centrado (`justify-content:center`), com metade da sobra do ecrã por
   cima do título. A sobra vai agora toda para baixo do cartão. */
.noticias-interior{width:100%;max-width:1280px;height:100%;
  display:flex;flex-direction:column;justify-content:flex-start;
  gap:var(--respiro)}

/* Sem JavaScript não há percurso que valha: a secção passa a ter a altura do conteúdo, o
   palco larga o `sticky`, as três notícias ficam umas debaixo das outras e a lista sai
   de cena — sem nada a comandá-la não teria uso. */
.noticias:not(:has(.vivo)){height:auto}
.noticias-palco:not(.vivo){position:static;height:auto}
.noticias-palco:not(.vivo) .noticias-lista{display:none}
.noticias-palco:not(.vivo) .noticias-corpo{display:flex;flex-direction:column}
.noticias-palco:not(.vivo) .noticias-palcos{display:flex;flex-direction:column;
  gap:clamp(16px,3vh,32px)}

/* Centrado, como os outros títulos de secção — "Números que falam por si", "Os nossos
   serviços", "Projetos de Sucesso" e "Parceiros de Referência" — e no mesmo corpo
   (`--tipo-titulo`). Esteve à esquerda, com o "Ver todas" na outra ponta da mesma linha,
   até o cliente o pedir centrado a 2026-09-18. */
.noticias-titulo{margin:0;text-align:center;font-weight:200;font-size:var(--tipo-titulo);
  line-height:1.06;letter-spacing:-.01em}

/* O "Ver todas" vive na COLUNA DA DIREITA, encostado à direita logo por baixo da lista —
   no vazio que sobra entre a última notícia e o fundo do cartão.

   Passou por dois sítios antes deste: ao lado do título (saiu de lá quando o título ficou
   centrado, porque um link encostado a uma ponta puxava o olho para o lado errado) e numa
   linha própria no fundo da secção, onde o cliente o achou longe de mais da lista que ele
   continua. Aqui não custa altura nenhuma ao cartão: ocupa espaço que já estava vazio. */
.noticias-coluna{display:flex;flex-direction:column;min-width:0;
  gap:clamp(14px,2.2vh,26px)}
.noticias-fecho{display:flex;justify-content:flex-end}

.noticias-todas{display:inline-flex;align-items:center;gap:8px;flex:none;
  color:inherit;text-decoration:none;font-weight:300;
  font-size:clamp(14px,1.1vw,16px);letter-spacing:.02em;
  padding-bottom:2px;border-bottom:1px solid rgba(255,255,255,.35);
  transition:border-color .25s,gap .25s}
.noticias-todas svg{width:1em;height:1em;flex:none;fill:none;stroke:currentColor;
  stroke-width:1.8;stroke-linecap:round;stroke-linejoin:round}
@media (hover:hover){
  .noticias-todas:hover{border-bottom-color:#fff;gap:12px}
}
.noticias-todas:focus-visible{outline:2px solid #fff;outline-offset:4px}

/* Destaque à esquerda, lista à direita. A coluna do destaque é ligeiramente maior: leva
   a fotografia e o texto todo, a outra leva três linhas. */
/* `flex:0 0 auto` e não `flex:1`: o corpo tem a altura do cartão e cola ao respiro do
   título; com `flex:1` esticava até ao fundo e o cartão, centrado lá dentro, afastava-se
   do título. A lista continua centrada em relação ao cartão (`align-items:center`). */
.noticias-corpo{flex:0 0 auto;min-height:0;
  display:grid;grid-template-columns:minmax(0,1.12fr) minmax(0,1fr);
  align-items:center;gap:clamp(24px,3.5vw,64px)}

/* As três notícias ocupam o MESMO sítio, empilhadas em grid. Não se escondem com `hidden`
   nem com `display:none`: ficam todas no fluxo e o que muda é a opacidade, que é o que
   permite a passagem ter um fade.

   O `stretch` é o que faz os TRÊS cartões medirem o mesmo: a linha da grelha vale pela
   mais alta e todos se esticam até lá. Sem ele, um título de duas linhas com um resumo de
   três dava um cartão 25px mais alto do que os outros, e a moldura encolhia e crescia a
   cada troca — que é precisamente o que uma secção com scroll preso não pode fazer. */
.noticias-palcos{display:grid;align-items:stretch;min-height:0}
.noticias-palcos > .noticia{grid-area:1/1}

/* O deslocamento do cartão é escrito pelo `noticias.js` a cada frame, a partir da
   posição do scroll — por isso NÃO há `transition` aqui. Uma transição de tempo próprio
   era o que a secção tinha antes e o que a fazia parecer um interruptor: a passagem
   corria sozinha e não respondia ao gesto. Agora, parar a meio deixa as duas notícias a
   meio caminho, e recuar desfaz.

   O fundo é OPACO (a mesma cor que a mistura anterior dava sobre o verde, por isso nada
   muda em repouso) e a moldura corta o que sai dela. As duas coisas servem a passagem:
   a notícia que entra sobe de baixo e COBRE a anterior. À primeira as duas faziam um
   cross-fade e, a meio, os dois textos liam-se um por cima do outro — num cartão desta
   altura isso é um borrão, não uma passagem. */
.noticias-palcos{overflow:hidden}
.noticia{position:relative;display:flex;flex-direction:column;
  border:1px solid rgba(255,255,255,.14);border-radius:clamp(14px,1.4vw,22px);
  background:var(--noticia-fundo);overflow:hidden;
  opacity:0;visibility:hidden;will-change:transform}
.noticia.em-cena{opacity:1;visibility:visible}
/* Sem a classe `vivo` (sem JavaScript) aparecem as três. */
.noticias-palco:not(.vivo) .noticia{opacity:1;visibility:visible}

/* A fotografia enche o topo do cartão. O teto em altura de janela é o que a impede de
   empurrar o texto para fora do ecrã numa janela baixa — encolhe sem deformar, porque o
   `object-fit` corta em vez de esticar. */
.noticia-foto{margin:0;overflow:hidden;background:rgba(255,255,255,.06)}
.noticia-foto img{display:block;width:100%;
  aspect-ratio:16/9;max-height:clamp(150px,32svh,340px);
  height:100%;object-fit:cover}

/* O texto ocupa o resto do cartão (`flex:1`) e o "Ler notícia" cola-se ao fundo: é aí que
   fica a diferença de altura entre notas mais curtas e mais longas, em vez de a moldura
   mudar de tamanho. */
.noticia-texto{flex:1;display:flex;flex-direction:column;align-items:flex-start;
  gap:clamp(8px,1.4vh,16px);
  padding:clamp(18px,2.6vh,30px) clamp(20px,2.4vw,36px) clamp(20px,2.8vh,34px)}

.noticia-meta{margin:0;font-size:clamp(12px,.88vw,14px);letter-spacing:.04em;
  text-transform:uppercase;opacity:.62;font-weight:300}

.noticia-titulo{margin:0;font-weight:300;
  font-size:clamp(20px,1.9vw,32px);line-height:1.18;letter-spacing:-.015em;
  text-wrap:balance}
.noticia-titulo a{color:inherit;text-decoration:none}
/* O link do título estende-se por cima do cartão todo (fotografia incluída): é clicável
   por inteiro sem que haja dois links a dizer o mesmo, nem um `<div>` a fingir de botão. */
.noticia-titulo a::after{content:"";position:absolute;inset:0}

.noticia-resumo{margin:0;font-weight:300;opacity:.8;
  font-size:clamp(14px,1vw,17px);line-height:1.55;max-width:48ch;text-wrap:pretty}

.noticia-mais{display:inline-flex;align-items:center;gap:7px;margin-top:auto;
  padding-top:clamp(6px,1.2vh,14px);
  font-size:clamp(13px,.95vw,16px);font-weight:400;letter-spacing:.02em;opacity:.85;
  transition:gap .25s,opacity .25s}
.noticia-mais svg{width:1em;height:1em;flex:none;fill:none;stroke:currentColor;
  stroke-width:1.8;stroke-linecap:round;stroke-linejoin:round}
@media (hover:hover){
  .noticia:hover .noticia-mais{gap:12px;opacity:1}
}

/* A lista das três, cada uma com a sua miniatura. O que distingue a que está em destaque
   é estar A CHEIO enquanto as outras ficam esbatidas — não uma moldura à volta, que à
   primeira versão desta secção o cliente leu como uma caixa de formulário. As linhas
   separam-se por um traço fino, como num jornal. */
.noticias-lista{list-style:none;margin:0;padding:0;
  display:flex;flex-direction:column}
.noticias-lista > li + li{border-top:1px solid rgba(255,255,255,.13)}

.noticia-marca{display:grid;
  grid-template-columns:clamp(68px,7.5vw,104px) minmax(0,1fr);
  align-items:center;gap:clamp(12px,1.3vw,22px);width:100%;
  padding:clamp(12px,1.9vh,22px) 0;
  border:0;background:none;color:inherit;cursor:pointer;text-align:left;
  -webkit-tap-highlight-color:transparent;
  opacity:.5;transition:opacity .3s}

/* A miniatura é o MESMO ficheiro do destaque, por isso não custa um segundo pedido: o
   browser já o tem. O 4:3 (e não o 16:9 do destaque) é para ela ter altura suficiente
   para se ver o que é, numa largura de cem pixels. */
.noticia-marca-foto{display:block;width:100%;aspect-ratio:4/3;object-fit:cover;
  border-radius:clamp(6px,.6vw,10px);background:rgba(255,255,255,.06)}

.noticia-marca-texto{display:flex;flex-direction:column;gap:5px;min-width:0}
.noticia-marca-data{font-size:clamp(11px,.8vw,13px);letter-spacing:.06em;
  text-transform:uppercase;font-weight:300;opacity:.75}
.noticia-marca-titulo{font-size:clamp(14px,1.05vw,18px);font-weight:300;
  line-height:1.35;letter-spacing:-.005em}

/* A barra enche-se ao longo do percurso da notícia e diz quanto falta para a seguinte —
   é o que explica, sem uma palavra, porque é que a notícia muda enquanto se rola. Mesma
   ideia dos pontos do carrossel dos projetos. Só existe na linha acesa: nas outras não há
   contagem nenhuma a mostrar, e três barras a meio prometiam três passagens. */
.noticia-marca-barra{display:block;height:2px;margin-top:3px;border-radius:2px;
  background:rgba(255,255,255,.18);overflow:hidden;opacity:0;transition:opacity .3s}
.noticia-marca-barra i{display:block;height:100%;width:0;background:currentColor}
.noticia-marca[aria-current=true] .noticia-marca-barra{opacity:1}

.noticia-marca[aria-current=true]{opacity:1}
@media (hover:hover){
  .noticia-marca:hover{opacity:.78}
  .noticia-marca[aria-current=true]:hover{opacity:1}
}
.noticia-marca:focus-visible{outline:2px solid #fff;outline-offset:3px}

/* Abaixo disto o destaque e a lista não cabem lado a lado: a lista passa para baixo, em
   linha, e o destaque fica com a largura toda. */
@media (max-width:900px){
  /* `start` e não `stretch`: em coluna, cada uma das duas partes fica com a altura do
     seu conteúdo. Com `stretch` a lista esticava-se pelo que sobrava da altura do palco
     e os três botões ficavam caixas altas e vazias. */
  /* `align-content:center` junta as duas partes e centra o conjunto no palco: sem ele
     as duas linhas da grelha esticavam-se pela altura toda e a lista descolava-se do
     cartão por cem pixels de nada. */
  .noticias-corpo{grid-template-columns:1fr;align-items:start;align-content:center;
    gap:clamp(14px,2.5vh,24px)}
  /* Em linha, as três lado a lado: a miniatura por cima e a data por baixo. O traço
     separador passa a ser vertical. */
  .noticias-lista{flex-direction:row;align-items:stretch;gap:clamp(10px,3vw,20px)}
  .noticias-lista > li{flex:1;min-width:0;display:flex}
  .noticias-lista > li + li{border-top:0}
  .noticia-marca{grid-template-columns:minmax(0,1fr);gap:8px;
    align-content:start;padding:0;text-align:center}
  .noticia-marca-foto{aspect-ratio:16/10}
  /* Não há largura para três títulos: à vista fica a miniatura e a data. O título não
     sai do HTML, fica escondido como o `.so-leitor` do `base.css` — é o único rótulo
     que o botão tem, e sem ele quem ouve a página encontrava três botões a dizer só
     uma data. */
  .noticia-marca-titulo{position:absolute;width:1px;height:1px;padding:0;margin:-1px;
    overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}
  .noticia-foto img{max-height:clamp(130px,26svh,260px)}
}
/* Telemóvel DEITADO (ou qualquer janela estreita e baixa): o palco preso mede ~330px e o
   cartão com fotografia e resumo não cabe lá dentro — ficava cortado ao fundo durante o
   percurso todo. Saem a fotografia do cartão, o resumo e as miniaturas da lista; ficam a
   data, o título, o "Ler notícia" e as três datas da lista. A mecânica do scroll não
   muda: só se tira o que não cabe. */
@media (max-width:900px) and (max-height:560px){
  .noticia-foto,.noticia-resumo,.noticia-marca-foto{display:none}
  .noticia-mais{margin-top:0}
}
@media (max-width:560px){
  /* Sem o resumo (regra a seguir) não há altura a distribuir: o `auto` deixava um vão
     entre o título e o "Ler notícia". */
  .noticia-mais{margin-top:0}
  /* Num telemóvel a fotografia e o resumo não cabem os dois com o título: fica a
     fotografia, que é o que dá a cara à notícia. */
  .noticia-resumo{display:none}
}
/* ---------- Convite ao contacto ---------- */
/* Fecha a página antes do rodapé (desde 2026-09-21). Branco entre duas secções verdes — as
   notícias e o rodapé — para se ler como um momento à parte. O título é MAIOR do que os das
   secções, de propósito: não é o rótulo de um capítulo, é uma pergunta feita ao visitante,
   e segue o peso e a escala do <h1> do hero. */
/* A secção não tem padding em cima: quem dá a altura é o `.convite-interior`, que mede um
   ECRÃ INTEIRO (ver a regra dele). Em baixo leva pouco, porque a faixa das provas fecha a
   secção e o cliente quer-a junto ao rodapé.

   As duas cores do EDIFÍCIO EM ARAME que corre por trás da pergunta (ver `js/arame.js`,
   que as lê daqui): a TINTA é o traço do edifício, o PULSO desenha a entrada e o terraço
   — e é o que acende à volta do cursor. Vão em componentes RGB porque o JS lhes junta a
   transparência de cada traço. Trocar o pulso por `2,36,37` deixa o desenho todo no verde
   da marca. (A rede de pontos esteve aqui primeiro e ficou na secção dos serviços.) */
.convite{position:relative;z-index:2;background:#fff;color:var(--fundo);text-align:center;
  --arame-tinta:2,36,37;
  --arame-pulso:15,143,122;
  --pad-convite:clamp(16px,4vw,40px);
  /* Sem padding em baixo: o que separa os logótipos do rodapé é o padding da própria
     faixa, e é ele que tem de ser IGUAL ao de cima para eles ficarem a meio do espaço
     entre a linha e o rodapé. Somando-se-lhe um padding da secção, o de baixo ficava
     sempre maior — era o que o cliente via. */
  padding:0 var(--pad-convite)}

/* O palco da pergunta. Não tem altura própria: recebe-a do `.convite-interior`, que é
   quem mede um ecrã — assim a rede cobre exatamente a parte que se vê de uma vez e não
   passa por trás da faixa das provas, onde seria ruído por baixo dos logótipos.
   As margens negativas são o que o faz escapar ao padding lateral da secção, para a rede
   ir de bordo a bordo; o padding devolve o conteúdo ao sítio. */
.convite-palco{position:relative;
  margin-inline:calc(-1 * var(--pad-convite));padding-inline:var(--pad-convite)}
/* Decoração pura: não intercepta o rato (quem o segue é o palco, que está por baixo de
   tudo e apanha os eventos que sobem do texto e dos botões). */
.convite-arame{position:absolute;inset:0;width:100%;height:100%;pointer-events:none}
/* O véu: um clarão branco por trás do bloco de texto. Sem ele a rede rouba contraste ao
   título — é a primeira coisa que se nota ao pôr um fundo destes. O desenho fica a viver
   nas margens e o centro fica limpo. */
.convite-veu{position:absolute;inset:0;pointer-events:none;
  background:radial-gradient(ellipse 52% 40% at 50% 50%,
    #fff 0%,#fff 38%,rgba(255,255,255,.86) 58%,rgba(255,255,255,0) 82%)}

/* O bloco da pergunta ocupa a janela toda (2026-09-22, pedido do cliente): quando a
   secção encosta ao topo, vê-se o convite de alto a baixo e o FIO da faixa das provas fica
   exatamente no fundo do ecrã — a faixa e o rodapé ficam para quem rolar mais.

   `100svh` CHEIO e não `100svh - navbar`, ao contrário das secções de ecrã inteiro do
   princípio da página: a navbar é `sticky` e, numa secção do MEIO, tapa-lhe os primeiros
   70px quando ela está encostada ao topo. Descontá-los faria o bloco medir menos do que a
   janela e o fio subiria. É a mesma conta do `.fecho` de 2026-09-18, e a razão está
   registada aí.

   O `padding-top` da altura da navbar é o que centra o conteúdo no que se VÊ (de baixo da
   barra até ao fundo) e não na caixa inteira, que começa tapada. */
.convite-interior{position:relative;max-width:820px;margin:0 auto;
  min-height:100svh;padding-top:var(--altura-nav);
  display:flex;flex-direction:column;
  align-items:center;justify-content:center;gap:clamp(14px,2.4vh,26px)}
.convite-titulo{margin:0;font-weight:200;font-size:clamp(28px,3.6vw,50px);line-height:1.06;
  letter-spacing:-.015em;text-wrap:balance}
.convite-texto{margin:0;max-width:52ch;font-size:clamp(15px,1.25vw,18px);font-weight:300;
  line-height:1.6;opacity:.8;text-wrap:pretty}
.convite-botoes{display:flex;flex-wrap:wrap;justify-content:center;gap:12px;
  margin-top:clamp(6px,1.2vh,12px)}
/* Os mesmos dois botões do hero, com as cores trocadas para fundo branco. */
.convite .btn.primario{background:var(--fundo);color:#fff}
.convite .btn.primario:hover{background:transparent;color:var(--fundo);
  box-shadow:inset 0 0 0 1px var(--fundo)}
.convite .btn.secundario{color:var(--fundo);box-shadow:inset 0 0 0 1px rgba(2,36,37,.35)}
.convite .btn.secundario:hover{box-shadow:inset 0 0 0 1px var(--fundo)}
/* NOTA: aqui viviam as regras do "Ou escreva-nos para amago@amago.pt" (`.convite-nota`),
   a linha esbatida por baixo dos botões. Saiu a 2026-09-22, a pedido do cliente: o email
   já está no botão "Fale connosco" e no rodapé. */

/* A faixa que fecha a secção: o cofinanciamento e as quatro distinções (2026-09-22).
   Refeita três vezes no mesmo dia, sempre a pedido do cliente: primeiro com um fio
   vertical a separar os grupos, depois com rótulos por cima e os selos em 2x2 (esboço
   dele), e por fim assim — UMA LINHA só, com o rótulo ao lado do seu grupo e não por
   cima, e encostada ao rodapé.

   É o rótulo ao lado que baixa mesmo a faixa: por cima, a altura era a do rótulo MAIS a
   do conteúdo, e com os selos em duas filas dava 269px numa janela de 1600. Ao lado, a
   altura é só a do mais alto dos dois.

   Fica DENTRO da `.convite` e não numa secção própria porque partilha com ela o fundo
   branco e a margem lateral — uma secção nova só acrescentaria uma regra a dizer o mesmo.

   Dois números afinam tudo, e estão os dois aqui em cima: a altura da barra e a altura da
   caixa dos selos. Não se afinam pela largura, ao contrário de quase tudo o resto no site:
   são imagens com texto lá dentro e o que decide se o texto se lê é a ALTURA da mancha. Os
   quatro selos vêm do script já normalizados pela ÁREA e numa caixa comum (422x222), por
   isso basta fixar-lhes a altura da CAIXA para ficarem todos com o mesmo peso à vista — o
   deitado sai mais largo e mais baixo, que é o efeito da normalização e não um descuido.

   Numa linha só, os dois números têm de ser MENORES do que eram: sete imagens e dois
   rótulos a caber na banda. Medido em 1600: a linha ocupa 1194 dos 1280. */
/* DUAS LINHAS desde 2026-09-23, cada uma com o seu grupo e o seu fio por cima: as
   distinções primeiro, o cofinanciamento por baixo (pedido do cliente, depois de ver a
   linha única com as sete imagens, que só cabia com tudo encolhido). Com uma linha por
   grupo deixa de haver conta de largura a fechar: as imagens voltam aos tamanhos de 22/09
   (barra 46, selos 60), a banda volta aos 1280px do site e o que se afina é o AFASTAMENTO
   entre as imagens de cada linha (`.provas-selos` e `.provas-barras`). */
.provas{--prova-barra:clamp(26px,2.9vw,46px);
  /* Subiu de clamp(38px,3.9vw,60px) a 2026-09-23 ("aumenta ligeiramente, para não ficarem
     pequenos no espaço deles"): com os pares à largura das barras, cada selo passou a ter
     ~200px de ar de cada lado, e a 60px liam-se perdidos. */
  --prova-selo:clamp(42px,4.3vw,68px);
  /* O vão entre as duas barras E entre os dois pares de selos: é o MESMO número, senão os
     pares deixam de cair por cima das barras. */
  --vao-barras:clamp(40px,8vw,140px);
  /* Sem margem em cima: o fio TEM de ficar onde o ecrã do convite acaba. O ar acima dele
     é o que sobra dentro do `.convite-interior`, que centra o seu conteúdo. */
  max-width:1280px;margin:0 auto;
  /* A linha vive no invólucro (`.provas-faixa`), que vai de bordo a bordo; a de baixo
     saiu a pedido do cliente, que o rodapé é escuro e já faz essa separação sozinho.
     O padding é igual em cima e em baixo — é o que põe os logótipos a meio caminho entre
     a linha e o início do rodapé, sem nenhum número a afinar. */
  /* Menos do que quando era uma linha só (era clamp(28px,5vh,52px)): agora são duas
     linhas e quatro paddings seguidos, e a faixa tem de continuar a ler-se como rodapé. */
  padding-block:clamp(22px,4vh,40px);
  /* O grupo centrado na linha. */
  display:flex;flex-wrap:wrap;align-items:center;justify-content:center;
  gap:clamp(16px,2.4vh,26px) clamp(24px,3vw,48px);
  text-align:left}

/* O invólucro da faixa: existe só para a linha ir de ponta a ponta da janela. As margens
   negativas desfazem o padding lateral da secção e o padding por dentro devolve-o, como no
   palco da rede — assim a linha atravessa o ecrã todo e o conteúdo continua na banda. */
.provas-faixa{margin-inline:calc(-1 * var(--pad-convite));
  padding-inline:var(--pad-convite);
  border-top:1px solid rgba(2,36,37,.12)}

/* O mesmo desenho dos rótulos do rodapé ("EMAIL", "TELEFONE", "MORADA"): pequenos, em
   maiúsculas e com as letras abertas. Não são títulos a ler, são etiquetas. */
.provas-rotulo{margin:0;font-size:clamp(10px,.72vw,12px);font-weight:400;
  letter-spacing:.08em;text-transform:uppercase;color:rgba(2,36,37,.55);
  line-height:1.3;white-space:nowrap}

/* O rótulo AO LADO, numa COLUNA PRÓPRIA que as duas linhas partilham (2026-09-23): o
   cliente pediu a faixa "separada mas formatada" e, à segunda, "os títulos ao lado, não em
   cima". O que desformatava não era o lado — era o rótulo estar NA fila das imagens: o
   grupo centrava-se como um todo, as imagens ficavam desviadas para a direita e os dois
   rótulos caíam em sítios diferentes de linha para linha. Numa grelha de duas colunas,
   com a do rótulo de largura fixa (`--rotulo`), os dois rótulos ficam na mesma vertical e
   as imagens de cada linha centram-se no mesmo eixo, o da coluna que resta — como uma
   tabela de duas fichas. Chegou a estar por cima, centrado, durante minutos nesse dia. */
.provas-grupo{--rotulo:clamp(120px,11vw,180px);
  width:100%;display:grid;grid-template-columns:var(--rotulo) 1fr;align-items:center;
  column-gap:clamp(10px,1.2vw,20px)}
.provas-grupo .provas-rotulo{justify-self:start}
.provas-itens{justify-content:center}
.provas-itens{display:flex;align-items:center}

/* A fila dos quatro selos tem EXATAMENTE a largura das duas barras de cofinanciamento
   mais o vão entre elas, e os selos repartem-se nela com VÃOS IGUAIS (`space-between`):
   o primeiro começa no pixel em que começa a barra de 2020 e o último acaba onde acaba a
   de 2030 (2026-09-23, pedido do cliente, em duas voltas: primeiro quis os cantos presos
   às barras — dois pares, um por barra —, depois os dois do meio "centrados entre si, com
   o mesmo espaçamento entre eles e os outros"; sem os pares, a fila inteira reparte-se).
   Não há número a olho: a largura de uma barra é a sua altura vezes a proporção do
   FICHEIRO exportado (1200/127 para a de 2020 e 1200/114 para a de 2030 — ver o
   `preparar_premios.py`), e os cantos coincidem por construção porque as duas linhas se
   centram na mesma coluna com a mesma largura total. DEPENDÊNCIA: se uma das barras for
   substituída por outra com outra proporção, estes números mudam com ela. Os PNG dos
   selos continuam sem margem transparente lateral (ver o `FOLGA_CAIXA` do script), senão
   o canto do selo não era o do desenho. */
/* `justify-self:center`: com largura própria, o item deixa de esticar na coluna da grelha
   e alinha-se ao INÍCIO dela — a fila dos selos ficava 10 a 100px à esquerda da das
   barras, que continua centrada. É a mesma armadilha da pirâmide dos selos de louro a
   2026-09-21 (largura fixa cancela o `stretch` que centrava). */
.provas-selos{width:calc(var(--prova-barra) * (1200 / 127 + 1200 / 114) + var(--vao-barras));
  max-width:100%;justify-content:space-between;justify-self:center}

/* As DUAS barras (2020 e 2030) lado a lado, à mesma altura e AFASTADAS uma da outra
   (2026-09-23: "centras as duas imagens mas afastadas uma da outra"): cada quadro é o seu
   bloco de três logótipos, e o vão diz que são dois. Estiveram empilhadas durante uma
   hora nesse dia e o cliente chumbou-o à vista.
   `max-height` e não `height`: numa janela estreita manda a largura e a imagem encolhe
   por aí, sem nunca deformar. */
/* As duas barras vivem numa TIRA desde 2026-09-23, para poderem correr no telemóvel (ver
   o media dos 700px). No computador a tira é só uma linha com as duas, sem animação
   nenhuma: o vão entre elas passou da caixa para a tira, e as cópias — que só servem à
   volta da fita — ficam fora de cena. As regras genéricas `[data-fita]`/`[data-fita-tira]`
   dão-lhe `overflow:hidden` e uma animação; o `animation:none` daqui anula a segunda, e o
   `overflow` não corta nada porque a tira cabe na caixa. */
.provas-barras-tira{display:flex;align-items:center;gap:var(--vao-barras);
  width:auto;animation:none;will-change:auto}
.provas-barras .copia{display:none}
.prova-barra{display:block;max-height:var(--prova-barra);max-width:100%;
  width:auto;height:auto}
.prova-selo{display:block;max-height:var(--prova-selo);max-width:100%;
  width:auto;height:auto}

/* Abaixo disto a linha não cabe: os dois grupos passam a uma linha cada um, com o rótulo
   a continuar ao lado. A faixa cresce para duas linhas, não para quatro. */
@media (max-width:1150px){
  .provas{flex-direction:column;align-items:center}
}
/* Num telemóvel nem um grupo cabe numa linha: o rótulo volta para cima do seu conteúdo e
   os quatro selos partem-se em 2x2. Empilhada, a barra larga o teto de altura e usa a
   largura que tem — com ele, numa janela de 430 ficava em 283px quando havia 396, e a
   frase mais pequena que leva dentro ("de Desenvolvimento Regional") deixava de se ler. */
/* O convite num telemóvel: continua a ocupar um ECRÃ inteiro (pedido do cliente, 2026-09-23:
   "dá para aumentares e meter a casa de fundo a rodar?"), mas o texto e o edifício deixam
   de estar no mesmo sítio. No computador o edifício é largo e baixo e vive por trás do
   texto, atenuado pelo véu; numa janela de 390px fica com ~120px de altura exatamente
   atrás da pergunta e lê-se como riscos por cima das letras. Aqui o texto assenta na
   parte de CIMA do ecrã (a começar a 10svh da navbar) e o edifício roda na parte de
   BAIXO — o `arame.js` lê o `--arame-centro` e centra-o a 74% da altura do palco. O véu
   sobe com o texto e encolhe: só tem de proteger a pergunta, não o meio do ecrã.
   (Chegou a ser um bloco compacto sem edifício, durante uma hora deste dia; o cliente
   quis o ecrã inteiro e o edifício de volta.) */
@media (max-width:700px){
  .convite-interior{justify-content:flex-start;padding-top:calc(var(--altura-nav) + 10svh)}
  .convite-palco{--arame-centro:.74}
  .convite-veu{background:radial-gradient(ellipse 84% 24% at 50% 31%,
    #fff 0%,#fff 46%,rgba(255,255,255,.86) 66%,rgba(255,255,255,0) 88%)}
  /* Um pouco maior do que os 28px do chão do computador: a pergunta é a peça principal
     do ecrã e num telemóvel de 390 ficava do tamanho de um título de secção. */
  .convite-titulo{font-size:clamp(28px,8vw,40px)}
  .provas{--prova-selo:clamp(52px,14vw,74px)}
  .provas-grupo{grid-template-columns:1fr;row-gap:clamp(10px,1.6vh,16px)}
  .provas-itens{justify-content:start}
  .provas-rotulo{white-space:normal}
  .provas-selos{width:auto;display:grid;grid-template-columns:repeat(2,auto);
    justify-items:center;align-items:center;gap:clamp(14px,2.4vh,22px) clamp(24px,8vw,48px)}
  /* As duas barras passam a FITA (pedido do cliente, 2026-09-23): andam devagar para o
     lado, como a dos parceiros, e deixam-se arrastar. Estiveram empilhadas aqui, cada uma
     com a largura da janela.
     A altura deixa de ser a do computador (que a esta largura dava 26px e tornava
     ilegível a frase pequena de dentro, "de Desenvolvimento Regional") e passa a sair da
     LARGURA da janela: ~9,3vw dá uma barra com cerca de 90% da janela, que é o maior que
     se lhe pode dar sem a cortar. As duas continuam à mesma altura e com larguras
     diferentes, como no computador — é o efeito das proporções (1200x127 e 1200x114).
     A velocidade é a do resto do site, ~40px/s: uma cópia mede ~800px numa janela de 390,
     e 800/40 dá os 20s. Refazer a conta se as barras mudarem de tamanho — é a sexta vez
     que ela aparece no projeto. */
  /* O vão entre as barras é MUITO menor do que no computador (18px numa janela de 390,
     contra os 40 do `--vao-barras`): a pedido do cliente (2026-09-24), para as duas se
     lerem como uma tira seguida de logótipos e não como duas imagens separadas. É também
     o que faz a segunda cópia entrar sem se notar a emenda.
     `--sentido:1` desliza da direita para a ESQUERDA — o contrário das fitas dos
     parceiros, e outro pedido dele no mesmo momento. Com este sentido a animação CSS do
     caso sem JavaScript já corre para o lado certo sem `animation-direction`, porque o
     `fita-passar` anda naturalmente para a esquerda. */
  .provas-barras{--prova-barra:clamp(30px,9.3vw,44px);
    --vao-barras:clamp(12px,4.6vw,26px);
    --ritmo:20s;--copias:2;--sentido:1;
    display:block;width:100%;
    -webkit-mask-image:linear-gradient(90deg,transparent,#000 5%,#000 95%,transparent);
    mask-image:linear-gradient(90deg,transparent,#000 5%,#000 95%,transparent)}
  .provas-barras-tira{width:max-content;gap:var(--vao-barras);
    animation:fita-passar var(--ritmo) linear infinite;will-change:transform}
  .provas-barras .copia{display:block}
  /* ALTURA FIXA e não um teto, como os logótipos dos parceiros — e pela mesma razão que
     lá: com `max-height` e `width:auto`, uma imagem que ainda não carregou não tem
     dimensões intrínsecas, sai com largura ZERO e, sem área, o carregamento preguiçoso
     nunca avança. Foi exatamente o que aconteceu à primeira: as quatro barras a 0x0 e a
     tira em 120px (só os vãos). Com a altura definida, a largura sai do rácio dos
     atributos `width`/`height` do `<img>` antes de a imagem chegar.
     `max-width:none` porque na fita a barra vale a sua largura natural e pode passar a
     janela — é isso que faz a volta ter mais conteúdo do que o ecrã. */
  .prova-barra{max-height:none;max-width:none;flex:none;
    height:var(--prova-barra);width:auto}
}

/* ---------- Títulos em MAIÚSCULAS ---------- */
/* Pedido do cliente a 2026-09-21 ("mete os títulos todos em caps lock para ver como fica"):
   todos os títulos de secção, e o do convite, em maiúsculas por `text-transform`. O HTML
   continua em minúsculas, por isso voltar atrás é apagar esta regra. Em maiúsculas as
   letras precisam de mais ar do que em minúsculas: o `letter-spacing` passa de -.01em para
   .04em. Fica DEPOIS das regras de cada título para lhes ganhar, à mesma especificidade.
   (Já esteve na página nesse dia, junto com antetítulos, e saiu; volta agora sozinho.) */
.numeros-titulo,.servicos-titulo,.projetos-titulo,.parceiros-titulo,
.noticias-titulo,.convite-titulo{text-transform:uppercase;letter-spacing:.04em}

/* (Havia aqui um degrau para 4x3 abaixo de 1200px; deixou de ser preciso a 2026-09-22,
   quando 4x3 passou a ser o arranjo de todas as larguras. O degrau seguinte — 3x4 — está
   mais abaixo e continua a depender da FORMA da janela e não só da largura.) */
/* A troca para três colunas não é uma questão de largura mas de FORMA da janela: num
   ecrã ao alto sobra altura e falta largura, e aí três colunas dão quadrados maiores
   (193px contra 165px num tablet de 768) e a quarta fila cabe à mesma. Num ecrã deitado,
   mesmo estreito, o recurso escasso é a altura e as quatro colunas mantêm-se — numa
   janela de 900x800 seguram a secção dentro de um ecrã, enquanto três colunas a levariam
   a passar dele. Por isso a condição é a orientação e não só a largura. */
@media (max-width:900px) and (orientation:portrait){
  .servicos{--colunas:3;--filas:4}
}
@media (max-width:700px){
  /* A dois por fila, um quadrado ficaria com meia janela de altura: aqui o cartão volta
     a ter a altura do conteúdo e os dois limites saem de jogo. Com `--lado` enorme, os
     clamps de dentro do cartão vão todos ao teto e são substituídos a seguir por
     medidas fixas; `--bloco` passa a 100% para deixar de limitar a largura do título e
     da grelha. */
  /* Aqui os doze cartões passam MUITO do ecrã, por isso não há vazio nenhum para o
     `space-evenly` repartir — e sem sobra ele cola o título à grelha e encosta tudo às
     bordas. Nestas larguras volta-se ao modelo simples: conteúdo encostado ao topo, com
     respiro em cima e em baixo e uma margem própria a separar o título dos cartões. */
  .servicos{--colunas:2;--lado:999px;--bloco:100%;
    justify-content:flex-start;padding:var(--respiro) var(--margem-lado)}
  .servicos-titulo{margin-bottom:var(--respiro)}
  /* A margem de cima da grelha é o respiro entre o título e os cartões; aqui esse papel
     é da margem do próprio título (acima), por isso a grelha não leva nenhuma. */
  .grelha{margin-block:0}
  /* `aspect-ratio:auto` e não `height:auto`: o quadrado da regra base vem de um
     `aspect-ratio`, e uma altura automática não o desliga — com o `--lado` posto a 999px
     aqui em cima, os cartões saíam a 396x396 e a secção a 5000px de altura. */
  .cartao{aspect-ratio:auto;min-height:clamp(118px,18vw,150px);
    gap:14px;padding:16px 14px;border-radius:16px}
  .cartao-icone{width:34px;height:34px;stroke-width:1.7}
  .cartao h3{font-size:14px}
}
@media (max-width:480px){
  .servicos{--colunas:1}
  .cartao{min-height:0;flex-direction:row;justify-content:flex-start;text-align:left;gap:14px;
    padding:16px 18px}
}

@media (max-width:900px){
  /* Abaixo disto três cartões por página ficavam com menos de 250px cada. Passa a UM (e
     não a dois): nove cartões dividem certo por três e por um, e é isso que faz a volta
     fechar sempre no mesmo sítio. Em troca, a fotografia fica grande — que é o melhor
     que se lhe pode fazer num ecrã estreito. */
  .projetos{--por-pagina:1}

  /* Continua a medir um ecrã menos a navbar (a regra base): tinha aqui `min-height:0` e
     num telemóvel de 390x844 o hero fechava aos 648px, com as fitas do puzzle a espreitar
     por baixo dos botões no primeiro ecrã. Centrado no ecrã, o conjunto esfera + frase +
     botões é a primeira página inteira, como no computador (2026-09-23). */
  .hero .interior{grid-template-columns:1fr;justify-items:center;text-align:center;
    padding-block:clamp(24px,6vh,56px)}
  .texto{max-width:none}
  .frase{text-align:center}
  .sub{margin-inline:auto}
  .botoes{justify-content:center}
  /* O terceiro termo é a altura: num telemóvel DEITADO (844x390) a esfera de 560px não
     cabia no ecrã; fica com três quartos da altura útil (246px) e o texto vem por baixo,
     fora do primeiro ecrã — deitado, a página rola sempre. Em pé nunca morde (721px numa
     janela de 1024, acima do teto dos 560). Chegou a ser "o ecrã menos 200px para o
     texto" e dava uma esfera de 80px. */
  .esfera-wrap{width:min(94vw,560px,calc((100svh - var(--altura-nav)) * .75));order:-1}
  .metricas{grid-template-columns:repeat(2,1fr)}
  /* Resultados: a duas colunas são TRÊS filas, e a secção deixa de ser de ecrã inteiro.
     Com o `min-height` e o `space-between` da regra base, as três filas eram espalhadas
     por 781px de secção num telemóvel de 844 — buracos de 200px entre elas (era o que se
     via). A regra dos respiros de 2026-09-21 é para o computador; aqui a secção mede o
     que o conteúdo pedir, com as filas a uma distância certa umas das outras. */
  .numeros{min-height:0}
  .metricas{align-content:start;gap:clamp(28px,4.5vh,44px) clamp(20px,4vw,40px)}
}

@media (max-width:600px){
  .no.ativo .disco{width:68px;height:68px}
  .icone{width:30px;height:30px}
  .rotulo{font-size:13px;padding:6px 12px}
  .linha{width:26px}
  .balao{left:36px}.no.esq .balao{right:36px}
}

@media (max-width:560px){
  /* O título do hero acompanha a largura do telemóvel: a 26px fixos, "EFICIÊNCIA
     ENERGÉTICA." (que nunca quebra) já não cabia num ecrã de 360. */
  .frase{font-size:clamp(21px,6.8vw,30px)}
  /* Os dois botões (do hero e do convite) repartem a linha; quando não cabem os dois,
     o que passa para baixo ocupa a largura toda em vez de ficar sozinho e curto. */
  .botoes .btn,.convite-botoes .btn{flex:1 1 auto;text-align:center}

  /* Num telemóvel as setas do carrossel saem dos LADOS da fotografia e passam para
     baixo, uma de cada lado dos pontos: com elas ao lado, o cartão ficava com 270px
     numa janela de 390 — e no telemóvel passa-se a página com o dedo, as setas são o
     segundo caminho. A fotografia fica com a largura toda. */
  .projetos{--seta:36px;--folga-seta:14px}
  .carrossel{grid-template-areas:"janela janela janela" "antes pontos depois";
    row-gap:clamp(18px,2.6vh,30px)}
  .carrossel-pontos{margin-top:0}

  /* A secção "A Âmago" num telemóvel: o PUZZLE FICA, com a montagem pelo scroll, as fitas
     e o cliquet iguais aos do computador ("não dá para manter o sistema de puzzle?" —
     dá). O que muda é o texto dentro das peças: o texto SVG não quebra linha e a 390px
     ficava com 6px, por isso a esta largura ele sai (título, corpo e ícone) e entra em
     cada peça um bloco HTML (`foreignObject`, `.peca-movel`) com o mesmo ícone, o título e
     o texto a quebrar linha. Cada bloco é um retângulo de 104x76 unidades que foge aos
     ENTALHES da peça — é o que fez cair a 4.ª linha do "Como Fazemos" em setembro: no
     "Porque" e no "Como" acaba em y=84 (o entalhe de baixo do "Como" começa em 85), no
     "O Que" começa em y=118 (o entalhe de cima acaba em 115) e no "Quem" começa em x=148
     (o entalhe da esquerda vai até 145).
     ARMADILHA: dentro de um `foreignObject` os `px` do CSS são UNIDADES DO VIEWBOX, e o
     SVG escala-os depois com a peça (numa janela de 390, 1 unidade = 1,41px). Por isso as
     medidas aqui são pequenas e fixas — 8px de corpo dão 11px no ecrã de 390 e 9px no de
     320 — e escalam com a peça exatamente como o texto SVG escala. À primeira ficaram em
     `vw` e o texto saiu das peças: era escalado duas vezes. Pela mesma razão, quem medir
     o bloco compara `scrollHeight` com `clientHeight` (os dois em unidades), nunca com o
     `getBoundingClientRect`, que já vem em píxeis do ecrã.
     Duas versões antes desta, no mesmo dia: a lista num cartão por baixo do puzzle
     ("não ficou nada boa") e quatro cartões 2x2 sem puzzle (o cliente quis o puzzle). */
  .peca-titulo,.peca-corpo,.peca-icone{display:none}
  .peca-movel{display:block;overflow:visible}
  /* DUAS FACES por peça (pedido do cliente, 2026-09-23): a frente com o ícone, o título e
     um "Clique para ler." pequeno, e o verso com o texto. O toque troca uma pela outra
     (classe `aberta` na peça, posta pelo `puzzle.js`). Com uma face só com o título e
     outra só com o texto, cada uma tem a peça inteira para si e ambos podem ser maiores:
     o título passou de 7,2 para 9,6 unidades e o texto de 8 para 9,4 (13,5px e 13,2px
     num telemóvel de 390). As duas faces estão empilhadas na mesma célula e trocam por
     opacidade, com a que sai a ficar `visibility:hidden` — assim não há salto de altura
     e o texto escondido não é lido nem tocado. O botão é o bloco inteiro: a área de toque
     é a peça toda, não a frase pequena. */
  /* CENTRADO nos dois eixos (pedido do cliente): o ícone, o título, o "Clique para ler."
     e o texto ficam todos ao meio da sua peça. É o alinhamento que o desenho pede — cada
     peça é um quadrante fechado, não uma coluna de texto —, e é o mesmo do puzzle no
     computador, onde o texto SVG é `text-anchor:middle`. O `text-wrap:balance` reparte as
     linhas do texto em comprimentos parecidos, que centrado é o que evita uma última
     linha com uma palavra só. */
  .peca-movel-caixa{width:100%;height:100%;display:grid;padding:0;margin:0;border:0;
    background:none;color:#fff;text-align:center;cursor:pointer;
    -webkit-tap-highlight-color:transparent;font-family:var(--fonte);
    -webkit-font-smoothing:antialiased;font-weight:300;text-wrap:balance}
  .peca-movel-caixa:focus-visible{outline:1.5px solid #fff;outline-offset:3px;border-radius:3px}
  .peca-frente,.peca-verso{grid-area:1/1;display:flex;flex-direction:column;
    justify-content:center;align-items:center;gap:3px;
    transition:opacity .28s ease,visibility 0s .28s}
  .peca-verso{opacity:0;visibility:hidden;font-size:9.2px;line-height:1.3}
  .peca-verso{color:rgba(255,255,255,.82)}
  /* O corpo e o espaçamento do título são o que faz "PORQUE FAZEMOS" — o mais comprido
     dos quatro — caber numa linha nos 96 de largura do bloco. A 9.6 com .1em media 98,2 e
     quebrava em duas linhas, e um título quebrado ao lado de três inteiros lê-se como
     erro. Quem mudar os textos das peças mede isto outra vez. */
  .peca-frente b{font-size:9.2px;font-weight:500;letter-spacing:.07em;
    text-transform:uppercase;line-height:1.2;margin-top:2px}
  .peca-frente small{font-size:6.6px;letter-spacing:.03em;opacity:.6;margin-top:1px}
  .peca-movel-icone{width:20px;height:20px;display:block;flex:none;
    fill:none;stroke:#fff;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round}
  .peca.aberta .peca-frente{opacity:0;visibility:hidden}
  .peca.aberta .peca-verso{opacity:1;visibility:visible;transition:opacity .28s ease,visibility 0s}
  .essencia{height:calc(230svh - var(--consumido, 0px))}
  /* Duas colunas mantêm-se: os números cabem e a secção não fica comprida. (A secção
     já não é de ecrã inteiro nestas larguras — ver o media de 900px.) */
  .metricas{gap:28px 20px}
  .metrica-rotulo{max-width:none}
}

@media (prefers-reduced-motion:reduce){
  .fita-tira{animation:none}
  /* Parada, a tira não pode continuar numa linha só com o dobro dos logótipos: a
     segunda cópia sai (é decorativa) e a primeira passa a quebrar em linhas, centrada.
     O véu das pontas também sai — sem movimento, não há nada a entrar nem a sair. */
  [data-fita-tira]{animation:none;width:auto;flex-wrap:wrap;justify-content:center;
    row-gap:clamp(16px,3vh,32px)}
  [data-fita-tira] .copia{display:none}
  [data-fita]{-webkit-mask-image:none;mask-image:none;
    padding-inline:clamp(16px,4vw,40px)}
  .numeros.preparada .metrica{opacity:1;transform:none;transition:none}
  /* O carrossel continua a passar de página (é o utilizador que manda), mas salta em vez
     de deslizar; e a fotografia deixa de crescer com o rato. Nenhuma página passa
     sozinha: disso trata o `carrossel.js`, que nem chega a pôr o relógio a andar. */
  .carrossel-tira{transition:none}
  .projeto img{transition:none}
}
