/* ==========================================================================
   CLÍNICA MÉDICA VITA — kit do tema
   Base: reset, grelha, cabeçalho/navegação e rodapé.
   As secções da homepage (herói, pilares, galeria, notícias…) entram aqui à
   medida que forem implementadas a partir do Figma.
   As variáveis de cor vêm de themes/clinicamedicavita/partials/design-tokens.blade.php
   (injectado no <head>), para poderem ser lidas/alteradas por Blade.
   ========================================================================== */

/* ── Fontes do tema ──────────────────────────────────────────────────────
   Todas servidas do PRÓPRIO domínio — nada de fonts.googleapis.com: esse pedido
   entrega o IP do visitante a um terceiro e já rendeu coimas de RGPD.
   Ficheiros e instruções em fonts/LEIA-ME.md.

   TÍTULOS: a Canela manda, a Playfair Display é a segunda escolha.
   A pilha é `'Canela','Playfair Display','Georgia',serif`
   (ver design-tokens.blade.php).

   ⚠️ A CANELA NÃO SE DECLARA AQUI. O `@font-face` dela é emitido pelo
   design-tokens.blade.php e SÓ SE OS FICHEIROS EXISTIREM. Um `@font-face` fixo a
   apontar para ficheiros em falta fazia o browser pedir dois ficheiros e receber
   dois 404 em cada página carregada — pedidos desperdiçados e dois erros
   permanentes na consola, que alguém acabaria por vir investigar. Sendo Blade,
   dá para perguntar se o ficheiro lá está; num .css estático não dá.

   Consequência prática: assim que a Canela for licenciada e os dois .woff2 forem
   colocados na pasta, ela entra sozinha. Não há uma linha de código a mudar. */

/* Playfair Display — a alternativa livre (SIL Open Font License 1.1, ver
   PLAYFAIRDISPLAY-LICENSE.txt na pasta das fontes). Fica sempre declarada: é o
   que se vê enquanto não houver Canela, e é a rede se um dia a licença dela
   caducar.

   ⚠️ UM SÓ FICHEIRO, E O INTERVALO É 200–450 DE PROPÓSITO.

   A Playfair Display começa no peso 400 — não tem 250 nem 300, que é o que o
   desenho pede em 19 das 20 regras de título. Foi escolhida assim, com essa
   consequência conhecida: os títulos saem mais pesados do que no Figma.

   Declarar o ficheiro de 400 a cobrir 200–450 faz o browser usá-lo tal e qual
   para os três pesos. SEM esse intervalo, um pedido de peso 250 contra uma face
   declarada só a 400 leva alguns browsers a SINTETIZAR — a desenhar um traço
   mais fino por conta própria —, e o resultado é irregular de browser para
   browser. É o mesmo motivo por que a Canela está declarada a 200–350.

   Se um dia for preciso um título mais forte, a Medium (500) é uma linha a mais;
   os ficheiros que não são pedidos não chegam a ser descarregados. */
@font-face{font-family:'Playfair Display';font-weight:200 450;font-style:normal;font-display:swap;
           src:url('/themes/clinicamedicavita/fonts/PlayfairDisplay-Regular.woff2') format('woff2')}
@font-face{font-family:'Poppins';font-weight:300;font-style:normal;font-display:swap;
           src:url('/themes/clinicamedicavita/fonts/Poppins-Light.woff2') format('woff2')}
@font-face{font-family:'Poppins';font-weight:400;font-style:normal;font-display:swap;
           src:url('/themes/clinicamedicavita/fonts/Poppins-Regular.woff2') format('woff2')}
@font-face{font-family:'Poppins';font-weight:500;font-style:normal;font-display:swap;
           src:url('/themes/clinicamedicavita/fonts/Poppins-Medium.woff2') format('woff2')}
@font-face{font-family:'Poppins';font-weight:700;font-style:normal;font-display:swap;
           src:url('/themes/clinicamedicavita/fonts/Poppins-Bold.woff2') format('woff2')}

*,*::before,*::after{box-sizing:border-box}
html{-webkit-text-size-adjust:100%}
body{margin:0;background:var(--branco);color:var(--tinta);
     font-family:var(--f-corpo);font-size:1rem;line-height:1.6;
     -webkit-font-smoothing:antialiased}
img,svg{max-width:100%;height:auto;display:block}
a{color:inherit}
h1,h2,h3{font-family:var(--f-titulo);font-weight:400;line-height:1.15;letter-spacing:-.01em;margin:0}
p{margin:0 0 1rem}
ul{margin:0;padding:0;list-style:none}

/* A goteira vive numa VARIÁVEL e não escrita à mão no `min()`: o `.wrap` é a
   coluna de todo o site, e o valor tem agora dois estados. Uma variável deixa
   a media query trocar só o número, sem repetir a fórmula — e sem correr o
   risco de as duas cópias divergirem.

   O valor é o TOTAL das duas goteiras: 3rem = 1.5rem de cada lado. */
.wrap{--goteira:3rem;width:min(100% - var(--goteira),var(--wrap));margin-inline:auto}
/* Entre os 640px e os 1360px a goteira DUPLICA (3rem de cada lado).

   É a faixa onde a janela já não tem largura para as margens generosas do
   desenho mas ainda é larga de mais para o conteúdo colar às bordas. Abaixo
   dos 640px volta ao valor pequeno: num telemóvel, 3rem de cada lado comiam
   quase um quinto do ecrã.

   `1359.98px` e não `1359px` para apanhar as janelas de largura fraccionária
   (ecrãs com zoom do browser) sem deixar um vão entre as duas regras. */
@media (min-width:640px) and (max-width:1359.98px){
  .wrap{--goteira:6rem}
}
.sec{padding:clamp(3.5rem,8vw,6.5rem) 0}
.sec--alt{background:var(--areia)}

/* Acessibilidade: saltar para o conteúdo (visível só com teclado) */
.skip{position:absolute;left:-9999px;top:0;z-index:100;
      background:var(--branco);color:var(--verde);padding:.75rem 1.25rem}
.skip:focus{left:1rem;top:1rem}
:focus-visible{outline:2px solid var(--verde-claro);outline-offset:3px}

/* ── Botões ─────────────────────────────────────────────────────────────── */
/* Medidas do Figma (node 1032:539): 243×38, fundo #5E7975, Canela 300 16px/30px
   em branco, espaçamento interno 4px 16px. A altura de 38px sai das contas —
   4 + 30 + 4 — por isso não é preciso fixá-la.

   Duas diferenças propositadas em relação ao que o Figma exporta:
   · `inline-flex` e não `flex`: em bloco, o botão ocupava a linha toda e deixava
     de acompanhar o alinhamento à direita das etapas pares da cronologia.
   · `min-width` e não `width`: 243px é a largura do botão «ver mais». Fixa, um
     rótulo mais comprido (ou traduzido) transbordava a caixa. Assim o desenho
     mantém-se e o texto maior empurra. */
.btn{display:inline-flex;flex-direction:row;justify-content:center;align-items:center;
     gap:10px;min-width:243px;padding:4px 16px;
     /* Sem borda: no desenho o botão é só fundo. Com 1px, os 4+30+4 = 38px
        passavam a 40 — a borda soma-se por fora quando a altura é automática. */
     /* CANTOS VIVOS. Era `var(--raio)` (4px), e todas as secções que foram sendo
        desenhadas pediram 0 uma a uma — cronologia, especialidades, pilares. Ao
        terceiro pedido a excepção passou a ser a regra: quem quer cantos redondos
        é só o `.btn--pilula`, e esse traz o seu próprio raio. */
     background:var(--verde);border:0;border-radius:0;
     /* POPPINS, não a fonte de título. O rótulo de um botão é interface, não
        título: lê-se de relance e a serifada da Playfair fica arrastada nos
        16px. Medido: a caixa não muda — o `min-width:243px` continua a mandar
        mesmo no rótulo mais comprido do site, e a altura mantém-se nos 38px.
        Herda para o `.btn--pilula`; o peso 250 dele cai nos 300 da Poppins,
        que é o único peso leve declarado. */
     font-family:var(--f-corpo);font-weight:300;font-size:16px;line-height:30px;
     color:var(--branco);text-decoration:none;
     transition:background .2s,border-color .2s,color .2s}
.btn:hover{background:var(--verde-escuro);color:var(--branco)}

/* Alias retido: as views já criadas usam-no e agora é o mesmo que `.btn`. */
.btn--cheio{background:var(--verde);color:var(--branco)}

/* Pílula — o botão do formulário de contacto (Figma node 177:39). Difere do botão
   base em tudo menos na cor: 290×52 em vez de 243×38, cantos completamente
   redondos, e o rótulo a 22px em vez de 16px. É maior de propósito:
   é o único botão da página que submete dados, e o alvo tem de o dizer. */
.btn--pilula{min-width:290px;min-height:52px;padding:10px;gap:15px;
             border-radius:100px;font-weight:250;font-size:22px;line-height:22px}

/* Contorno, para fundos onde o verde cheio não se distingue. */
.btn--linha{background:transparent;border:1px solid currentColor;color:var(--verde);padding:3px 15px}
.btn--linha:hover{background:var(--verde);border-color:var(--verde);color:var(--branco)}

/* ── Cabeçalho ──────────────────────────────────────────────────────────────
   Duas versões, como no desenho:
     .cab--sobre   HOME — dentro do herói, transparente, texto branco
     .cab--branca  RESTANTES — barra branca, logótipo a cores, menu verde
                   (Figma node 1046:732)
   .cab--solida (verde compacto) fica como recurso para páginas sem nenhuma das duas.

   Medidas do desenho: barra de 140px, logótipo de 296×90, menu em Canela 20px.
   ------------------------------------------------------------------------- */
.cab{z-index:50}
.cab-in{display:flex;align-items:flex-start;justify-content:space-between;gap:2rem}
.marca{display:inline-block;text-decoration:none}
.marca img{width:auto;max-height:80px}
.marca-txt{display:block;font-family:var(--f-titulo);color:currentColor;line-height:1.1}
.marca-txt strong{display:block;font-weight:300;font-size:1.9rem;letter-spacing:.3em}
.marca-txt em{display:block;font-style:normal;font-size:.6rem;letter-spacing:.34em;
              text-transform:uppercase;opacity:.85;margin-top:.35rem;padding-left:.3em}

/* HOME — sobre o herói */
.cab--sobre{position:absolute;inset:0 0 auto;color:var(--branco);pointer-events:none}
/* A MESMA medida do slider — é ela que pousa a navegação no fundo do herói. */
.cab--sobre .cab-in{min-height:var(--heroi-altura);padding:1.5rem 0 0;align-items:flex-start}
.cab--sobre .marca,.cab--sobre .cab-nav,.cab--sobre .cab-abrir{pointer-events:auto}
.cab--sobre .cab-nav{align-self:flex-end;padding-bottom:0}

/* Recurso: barra verde compacta */
.cab--solida{position:sticky;top:0;background:var(--verde);color:var(--branco)}
.cab--solida .cab-in{align-items:center;min-height:96px;padding-block:.75rem}
.cab--solida .marca img{max-height:56px}

/* RESTANTES PÁGINAS — barra branca */
.cab--branca{position:sticky;top:0;background:var(--branco);color:var(--verde);
             box-shadow:0 4px 10px 0 rgba(0,0,0,.10)}
.cab--branca .cab-in{align-items:center;min-height:140px;padding-block:1rem}
.cab--branca .marca img{max-height:80px}
/* Só a cor e a opacidade: a Canela a 20px já vem da regra base.
   O VERDE tem de ficar — a barra desta variante é branca, e o #FFF do Figma
   (que é a cor do menu sobre o herói) daria texto branco sobre fundo branco. */
.cab--branca .cab-nav a{opacity:1;color:var(--verde)}
/* Fundos (hover e item activo) desenhados no <li> e não no <a>: sem padding no
   <a>, o fundo ficava colado às letras. O <li> é que tem os 10px à volta.

   SEM raio: no Figma (node 104:263) o item activo é um rectângulo de cantos
   vivos, e não a pílula que o resto do tema usa nos botões. Confirmado no
   desenho — não é esquecimento. */
/* ── Rectângulo do item: desce até ao fundo da barra ─────────────────────────
   Figma node 1046:719. O item destacado (activo OU apontado) mede 90px contra
   os 40px dos restantes: mesmo topo, a 50,45px, e limite inferior coincidente
   com o do cabeçalho.

   Desenhado num ::before e NÃO no fundo do <li>: o <li> continua a medir os
   40px do token. Dar-lhe 90px de altura fazia-o re-centrar no flex do <ul> e o
   topo deixava de bater certo com os outros itens — o desenho quer o mesmo topo
   e mais altura só para baixo, que é o que a conta do `bottom` faz.

   A descida é (barra − item) ÷ 2, ou seja a folga que sobra por baixo de um
   item centrado: 140−40 = 100, metade = 50px. `--cab-presa` é a altura da barra
   branca e já existe no `:root`, com os degraus por ecrã (140/120/96/80) — o
   rectângulo acompanha-a sozinho, sem token novo. */
.cab--branca .cab-nav>ul>li{background:none}
.cab--branca .cab-nav>ul>li::before{
  content:"";position:absolute;z-index:0;
  inset:0 0 calc((var(--cab-presa) - var(--cab-altura)) / -2) 0;
  background:transparent;transition:background .2s}
/* Apontado: o mesmo rectângulo, no verde a 8% que a variante já usava. */
.cab--branca .cab-nav>ul>li:hover::before{background:rgba(var(--verde-rgb),.08)}
/* Activo: verde cheio. No herói a mesma informação é dada por um sublinhado —
   aqui por preenchimento, porque sobre branco lê-se melhor.

   SEM raio: no Figma (node 104:263) é um rectângulo de cantos vivos, e não a
   pílula que o resto do tema usa nos botões. Confirmado no desenho. */
.cab--branca .cab-nav>ul>li:has(>a[aria-current])::before{background:var(--verde)}
/* O rótulo tem de ficar À FRENTE do rectângulo — o ::before é pintado depois do
   fundo do <li> e, sem isto, tapava o texto. Vale para TODOS os itens, porque
   agora todos têm rectângulo (transparente em repouso). */
.cab--branca .cab-nav>ul>li>a{position:relative;z-index:1}
/* `>ul>li>a` e não `.cab-nav a`: este branco é para o item de TOPO, que assenta
   sobre o rectângulo verde. Escrito de forma larga, alcançava também os links do
   SUBMENU — e aí a caixa é branca, ou seja texto branco sobre branco. */
.cab--branca .cab-nav>ul>li>a[aria-current]{background:none;color:var(--branco);box-shadow:none}
/* A variante branca aumenta os itens de topo, mas o submenu fica nos 14px
   pedidos — sem esta linha alinhada com a regra base, o 1rem daqui ganhava por
   especificidade e o tamanho novo só valia na home. */
.cab--branca .cab-nav .sub a{font-size:14px}
/* O submenu abre por baixo do PAI, e o pai vai agora até ao fundo da barra —
   sem esta linha o painel arrancava a meio do rectângulo e ficava por cima dele.
   Mesma conta do ::before, com o sinal trocado. Vale para todos os itens: o
   submenu só se vê ao apontar, e apontar já acende o rectângulo alto. */
.cab--branca .cab-nav>ul>li>.sub{
  top:calc(100% + (var(--cab-presa) - var(--cab-altura)) / 2)}

/* Navegação */
.cab-nav>ul{display:flex;align-items:center;gap:40px}
/* Item do menu, com o CSS do Figma.
   `position:relative` NÃO vem do Figma mas tem de ficar: é contra este `li` que o
   submenu se posiciona (`.sub{position:absolute}`). Sem ele, a caixa passava a
   ancorar-se no cabeçalho e aparecia no sítio errado.
   O `gap` não tem efeito visível no desktop — o submenu está fora do fluxo — mas
   fica porque no telemóvel ele volta ao fluxo e passa a valer. */
.cab-nav>ul>li{position:relative;display:inline-flex;height:var(--cab-altura);padding:10px;
               justify-content:center;align-items:center;gap:10px}

/* NA HOMEPAGE os itens não têm folga entre si: o afastamento vem todo do padding
   de 16px de cada lado. O selector é mais específico do que o `.cab-nav>ul` de
   cima E do que o de dentro do @media dos 1280px, por isso ganha nos dois. */
.cab--sobre .cab-nav>ul{gap:0}

/* NA HOMEPAGE o item é maior — 24px/16px de padding, do Figma, o que dá os 68px
   de altura que lá estão medidos. A `height` do token TEM de sair: 40px com 24px
   de padding em cima e em baixo era uma caixa mais pequena do que o seu conteúdo,
   e o texto transbordava. Aqui é o padding que manda. */
.cab--sobre .cab-nav>ul>li{height:auto;padding:24px 16px}

/* Tipografia dos itens de topo — Canela 250 a 20px, do Figma.
   A COR fica de fora de propósito: é `currentColor`, herdada do cabeçalho, que
   já é branca sobre o herói e sobre a barra verde. Fixar #FFF aqui apagava o
   menu nas páginas interiores, onde a barra é branca — ver `.cab--branca`. */
/* A altura é agora do <li> (40px, do Figma) e o <a> preenche-a — antes eram os
   68px do token aplicados ao <a>, que somados aos 10px de padding do <li> davam
   um item de 88px. Só `height:100%` deixava o link a 40px mas com o texto de 20px
   a transbordar a caixa em ~3px; `overflow:visible` e o alinhamento ao centro
   mantêm as maiúsculas e os descendentes visíveis, que é o que se vê no desenho. */
.cab-nav a{display:flex;align-items:center;justify-content:center;height:100%;padding:0;
           text-decoration:none;
           font-family:var(--f-titulo);font-size:20px;font-style:normal;
           font-weight:250;line-height:normal;letter-spacing:.01em;
           white-space:nowrap;opacity:.9;transition:opacity .2s,background .2s}
.cab-nav a:hover,.cab-nav a[aria-current]{opacity:1}
/* Sobre o herói o item activo NÃO leva marca nenhuma — tinha um sublinhado
   (`box-shadow:inset 0 -1px 0`), retirado por pedido. Preso no topo volta a
   distinguir-se, aí pelo rectângulo verde de `.cab--presa`. */

/* Submenu (um item pode ganhar filhos no CMS sem tocar no tema).

   A caixa tem EXACTAMENTE a largura do item pai — o `li` é `position:relative`,
   por isso `width:100%` mede-o a ele. Era `min-width:230px`, que a fazia sair
   para fora do item.

   Consequência a ter em conta: um rótulo mais largo do que o pai passa a partir
   em duas linhas (é o caso de «Medicina Dentária» debaixo de «Especialidades»).
   Daí o `white-space:normal` a seguir — sem ele, com a largura travada, o texto
   transbordava a caixa em vez de quebrar. */
.cab-nav .sub{position:absolute;left:0;top:100%;width:100%;min-width:0;padding:0;
              background:var(--branco);color:var(--tinta);border-radius:var(--raio);
              box-shadow:0 12px 32px rgba(31,42,40,.16);
              opacity:0;visibility:hidden;transform:translateY(6px);
              transition:opacity .18s,transform .18s,visibility .18s}
.cab-nav .tem-sub:hover .sub,.cab-nav .tem-sub:focus-within .sub{opacity:1;visibility:visible;transform:none}
/* Espaçamento lateral mais curto do que o dos itens de topo: com a largura
   presa à do pai, cada pixel de padding é um pixel a menos para o rótulo.

   `justify-content:center` e não só `text-align`: o `.cab-nav a` é `display:flex`,
   e num flex o alinhamento do texto não chega — sem isto o rótulo ficava colado à
   esquerda apesar do text-align. Os dois estão cá porque o text-align é o que
   centra a SEGUNDA linha de um rótulo que quebre. */
/* Poppins no submenu — a Canela é a tipografia dos itens de TOPO. A família tem
   de ser dita aqui: a regra base `.cab-nav a` põe `var(--f-titulo)` e os links do
   submenu herdavam-na. */
.cab-nav .sub a{height:auto;padding:.6rem .9rem;opacity:1;
                font-family:var(--f-corpo);font-size:14px;
                white-space:normal;line-height:1.35;
                justify-content:center;text-align:center}
/* Aceso: verde a 8%, um realce leve. `focus-visible` ao lado do hover porque
   quem chega ao submenu com Tab tem de ver onde está. */
/* A seta de abrir submenu existe SÓ na gaveta: no menu horizontal o submenu
   abre por hover e o desenho não tem seta nenhuma. */
.cab-sub-abrir{display:none}

.cab-nav .sub a:hover,
.cab-nav .sub a:focus-visible{background:rgba(var(--verde-rgb),.08)}

/* Página actual: verde cheio com texto branco — o estado mais forte dos dois.

   ⚠️ A ORDEM importa. Esta regra e a do hover têm a MESMA especificidade
   ((0,3,1) as duas), por isso quem vem depois ganha. O activo fica em ÚLTIMO de
   propósito: passar o rato sobre a página actual não a deve rebaixar ao realce
   leve. */
.cab-nav .sub a[aria-current="page"]{background:var(--verde);color:var(--branco)}
/* SEM seta no item com submenu — por pedido, o «Especialidades» fica igual aos
   restantes itens do menu. O submenu continua a abrir por hover e por :focus-within.
   Nota para quem voltar aqui: sem a seta, nada indica que o item tem filhos até
   se lhe passar por cima. Se um dia se quiser a pista de volta, é reactivar este
   bloco. */

/* Botão de menu. z-index acima da gaveta: sem isto a gaveta (position:fixed)
   tapava o próprio botão e não havia como fechá-la. */
.cab-abrir{display:none;position:relative;z-index:2;
           flex-direction:column;justify-content:center;gap:5px;
           width:44px;height:44px;padding:0;border:0;background:none;color:inherit;cursor:pointer}
.cab-abrir span{display:block;height:1.5px;background:currentColor;transition:transform .2s,opacity .2s}
.cab-abrir[aria-expanded="true"] span:nth-child(1){transform:translateY(6.5px) rotate(45deg)}
.cab-abrir[aria-expanded="true"] span:nth-child(2){opacity:0}
.cab-abrir[aria-expanded="true"] span:nth-child(3){transform:translateY(-6.5px) rotate(-45deg)}

/* ── Portátil pequeno: encolher antes de esconder ────────────────────────
   Cinco itens em Canela 20px mais um logótipo de ~224px dão ~1076px. Abaixo
   disso deixam de caber na grelha — em vez de deixar o menu transbordar (ou
   cair para uma segunda linha por cima do logótipo), aperta-se primeiro. */
@media (max-width:1280px){
  .cab--branca .cab-in{--cab-barra:120px;min-height:120px}
  .cab--branca .marca img{max-height:76px}
  .cab--branca .cab-nav a{font-size:1.05rem}
  /* Aperta o INTERVALO entre itens, não o padding: com `gap:40px` é o intervalo
     que manda na largura do menu, e é ele que tem de ceder quando o ecrã aperta. */
  .cab-nav>ul{gap:24px}
}

/* ── Tablet e telemóvel: gaveta ──────────────────────────────────────────
   1080px é onde o menu deixa mesmo de caber. Antes esta regra só cobria
   .cab--sobre e .cab--solida: na barra branca a navegação ficava inline, os
   cinco itens transbordavam e o cabeçalho parecia partido. */
@media (max-width:1080px){
  .cab-abrir{display:flex}
  .cab--sobre .cab-in{min-height:60vh}
  .cab--branca .cab-in{min-height:96px}
  .cab--branca .marca img{max-height:64px}

  .cab-nav{position:fixed;inset:0;z-index:1;align-self:stretch;
           padding:6rem 1.5rem 2rem;overflow:auto;
           transform:translateX(100%);transition:transform .25s ease}
  .cab--sobre .cab-nav,.cab--solida .cab-nav{background:var(--verde);color:var(--branco)}
  .cab--branca .cab-nav{background:var(--branco);color:var(--verde)}
  .cab-nav.aberto{transform:none}

  .cab-nav>ul{flex-direction:column;align-items:stretch;gap:0}
  /* Na gaveta o submenu é `position:static`, ou seja, volta a ser filho no fluxo
     do `li`. Com a direcção `row` do Figma ficaria ao LADO do link em vez de por
     baixo — aqui empilha-se e ocupa a largura toda. */
  /* Na gaveta os itens crescem com o conteúdo — a altura de 40px é do menu
     horizontal e aqui deixaria os toques com metade da área. */
  /* GRELHA de TRÊS colunas: `1fr auto 1fr`.
     O link vive na coluna do meio, e como as duas laterais são iguais ela fica
     exactamente ao centro do <li> — o rótulo centra-se sozinho, sem contar com a
     seta. A seta vai para a terceira coluna encostada ao início, ou seja logo a
     seguir ao link, sem o empurrar.
     Com duas colunas o par centrava-se em conjunto e o rótulo ficava meia seta
     fora do centro. Num item sem submenu a terceira coluna fica vazia e nada
     muda. O submenu ocupa a linha seguinte, de lado a lado. */
  .cab-nav>ul>li{display:grid;grid-template-columns:1fr auto 1fr;
                 align-items:center;gap:0;padding:0;height:auto}
  /* O rectângulo que desce até ao fundo da barra é do menu HORIZONTAL — o reset
     para a gaveta está no FIM do ficheiro, a seguir ao bloco `.cab--presa`.
     Aqui não podia ficar: `.cab--sobre.cab--presa …::before` é declarado depois
     e com a mesma especificidade, por isso ganhava a este apesar do @media. */
  .cab-nav>ul>li>a{grid-column:2}
  .cab-sub-abrir{grid-column:3;justify-self:start}
  .cab-nav>ul>li>.sub{grid-column:1 / -1}
  /* Na gaveta o <li> fica sem padding (regra acima), por isso é o <a> que volta
     a ter o seu — senão os itens ficavam colados uns aos outros. */
  .cab-nav a{height:auto;padding:.9rem 10px;font-size:1.15rem;border-radius:var(--raio)}
  .cab--branca .cab-nav a{font-size:1.15rem}
  /* Sem avanço à esquerda: ele marcava a hierarquia quando os itens do submenu
     encostavam à esquerda. Agora estão centrados, e o avanço só os puxava para
     fora do eixo do item pai. */
  .cab-nav .sub{position:static;opacity:1;visibility:visible;transform:none;
                background:transparent;color:inherit;box-shadow:none;padding-left:0}
  /* ── Submenus recolhidos, abertos pela seta ──────────────────────────────
     A classe `subs-recolhidos` é posta pelo JAVASCRIPT. Sem ele os submenus
     ficam abertos, como estavam — esconder por CSS e depender do JS para abrir
     deixava as páginas de especialidade inalcançáveis se o script falhasse. */
  .cab-nav.subs-recolhidos .tem-sub .sub{display:none}
  .cab-nav.subs-recolhidos .tem-sub.e-aberto .sub{display:block}

  .cab-sub-abrir{display:flex;align-items:center;justify-content:center;
                 padding:.9rem 6px;
                 border:0;background:none;color:inherit;cursor:pointer}
  .cab-sub-abrir svg{transition:transform .2s ease}
  .tem-sub.e-aberto>.cab-sub-abrir svg{transform:rotate(180deg)}
  .cab-sub-abrir:focus-visible{outline:2px solid currentColor;outline-offset:-4px}

  /* Mesmo tratamento dos itens de topo: o fundo envolve o RÓTULO e não a largura
     da gaveta. `width:fit-content` e não `align-self` porque aqui o pai é um <li>
     em bloco, não um flex. */
  /* Mesma ideia no submenu, mas aqui o pai é um <li> em bloco: quem centra é a
     margem automática, não o `align-self`. */
  .cab-nav .sub a{width:fit-content;margin-inline:auto;padding:.6rem 10px;
                  justify-content:center;text-align:center}

  /* O submenu segue as MESMAS regras do menu horizontal — verde a 8% ao apontar,
     verde cheio na página actual. Não há override nenhum aqui: as regras base
     (`.cab-nav .sub a…`) já não estão presas a nenhuma media query. */
}

@media (max-width:640px){
  /* 243px de largura mínima não cabem num ecrã de 360px com as margens da grelha. */
  /* Sem tecto de 243px: no desktop o botão CRESCE com o rótulo (o 243 é
     `min-width`), e um tecto aqui obrigava «Conheça melhor o nosso espaço» a
     partir em linhas dentro de uma caixa mais estreita do que precisa. Agora
     comporta-se como em ecrã largo, limitado só pela largura disponível. */
  .btn{min-width:0;width:100%;max-width:100%}
  .btn--pilula{max-width:290px}
  .cab--branca .cab-in{min-height:80px}
  .cab--branca .marca img{max-height:52px}
  .cab--sobre .marca img{max-height:64px}
  .cab-nav{padding:5rem 1.25rem 2rem}
}

/* ── Banner de página (Figma node 291:345) ──────────────────────────────── */
/* O verde por baixo da imagem não é redundância: se a imagem falhar ou ainda
   estiver a carregar, o título continua legível em vez de branco sobre branco. */
.banner{min-height:198px;display:flex;align-items:center;
        background:var(--verde) center/cover no-repeat}
.banner-titulo{font-family:var(--f-titulo);font-weight:300;color:var(--branco);
               font-size:clamp(1.75rem,4vw,2.5rem);line-height:1.2;text-align:center;margin:0}
.banner-sub{color:rgba(255,255,255,.88);text-align:center;margin:.5rem 0 0;font-size:1rem}
@media (max-width:640px){.banner{min-height:140px}}

/* ── Migalhas (Figma node 515:187) ──────────────────────────────────────── */
.migalhas{background:rgba(var(--verde-rgb),.1);font-size:.75rem;line-height:1.5}
.migalhas ol{display:flex;flex-wrap:wrap;align-items:center;gap:.35rem;
             min-height:40px;padding:.5rem 0;margin:0;list-style:none}
.migalhas a{color:var(--tinta);text-decoration:none}
.migalhas a:hover{text-decoration:underline}
.migalhas [aria-current="page"]{color:var(--verde)}
/* Separador em CSS: um «>» no marcado seria lido em voz alta a cada item. */
.migalhas li + li::before{content:">";margin-right:.35rem;color:var(--tinta);opacity:.7}

/* ── Filtros de categoria (Figma nodes 1114:361/363/365) ─────────────────────
   Fila de pílulas alinhada à direita, 38px de altura e 24px entre elas — as
   medidas do desenho. A do estado activo é verde cheio; as outras, contorno.

   Largura por ESPAÇAMENTO INTERNO e não fixa: no Figma medem 89/78/80px, mas
   isso é o tamanho de «Ver todos», «Eventos» e «Notícias». Os nomes das
   categorias vêm do CMS e podem ser muito maiores — com largura fixa, o rótulo
   transbordava. Assim o desenho mantém-se e um nome comprido empurra a pílula.

   A altura de 38 sai das contas (4 + 30 + 4), como no botão base — por isso é
   `min-height`, para uma pílula com o rótulo em duas linhas crescer em vez de
   cortar o texto. */
/* 80px acima, medida pedida. Margem e não padding: a secção não tem fundo
   próprio, e assim o espaço não conta para a área clicável das pílulas. */
.filtros{margin-top:80px}
.filtros-lista{display:flex;flex-wrap:wrap;justify-content:flex-end;align-items:center;
               gap:24px;margin:0;padding:0;list-style:none}
.filtro{display:inline-flex;align-items:center;justify-content:center;
        min-height:38px;padding:4px 14px;
        border:1px solid var(--linha);border-radius:100px;background:transparent;
        font-family:var(--f-corpo);font-size:14px;line-height:30px;
        color:var(--cinza);text-decoration:none;
        transition:background .2s,border-color .2s,color .2s}
.filtro:hover{border-color:var(--verde-claro);color:var(--verde)}
.filtro.e-activo{background:var(--verde);border-color:var(--verde);color:var(--branco)}
.filtro.e-activo:hover{background:var(--verde-escuro);border-color:var(--verde-escuro);
                       color:var(--branco)}

@media (max-width:640px){
  /* Alinhadas à esquerda no telemóvel: à direita, uma fila que passa para a
     segunda linha deixa a última pílula sozinha e desencostada de tudo. */
  .filtros-lista{justify-content:flex-start;gap:.75rem}
}

/* ── Listagem de Notícias (Figma node 104:293, cartões a partir de y=506) ────
   Grelha de 3 colunas de 404px com 30px entre colunas e 78px entre linhas — as
   contas do desenho (imagem 296 + bloco de texto 129 = 425; as linhas distam 503).

   O cartão é uma coluna flex e o link ocupa-o todo: a área clicável é o cartão
   inteiro, não só o título. `align-items:stretch` (o valor de fábrica da grelha)
   mantém os cartões da mesma linha com a mesma altura mesmo com títulos de
   comprimentos diferentes.

   O título fica em DUAS linhas com reticências. Sem o corte, um título comprido
   empurrava o cartão para baixo e desalinhava a linha toda — no desenho todos
   ocupam exactamente duas linhas de 30px. */
/* 50px acima (a separar dos filtros) e 160px abaixo (a fechar a página antes
   do rodapé) — medidas pedidas, fixas de propósito e não em clamp. */
/* Os 160px de baixo eram FIXOS — a medida do desenho a 1512px, aplicada tal e
   qual a um telemóvel, onde sobravam 125px de vazio até à barra do rodapé.
   Passa a `clamp`, com o mesmo mínimo de 100px das outras páginas que encostam
   ao rodapé. Os 10.6vw dão os 160px a 1512px; abaixo dos 943px vale o mínimo.
   É MARGEM e não espaçamento interno, ao contrário das outras — fica assim, que
   o resultado é o mesmo e mudar arriscava mexer no fundo da secção. */
.lista-noticias{margin:50px 0 clamp(6.25rem,10.6vw,160px)}
.lista-noticias-vazio{margin:0;text-align:center;color:var(--cinza)}

.noticias-grelha{display:grid;grid-template-columns:repeat(3,1fr);
                 gap:clamp(2.5rem,5vw,78px) 30px;margin:0;padding:0;list-style:none}
.noticia-cartao{display:flex}
.noticia-cartao-liga{display:flex;flex-direction:column;width:100%;
                     text-decoration:none;color:inherit}
/* A foto vive dentro de uma MOLDURA que a corta. Sem ela, o `transform:scale`
   do hover não tinha caixa que o contivesse e a imagem crescia por cima da data
   e do titulo — `transform` não ocupa espaço no fluxo, mas desenha-se na mesma. */
.noticia-cartao-moldura{display:block;overflow:hidden;border-radius:var(--raio)}
.noticia-cartao-foto{display:block;width:100%;aspect-ratio:404/296;object-fit:cover;
                     border-radius:var(--raio);transition:transform .5s ease}
/* `:focus-visible` a par do `:hover`: quem chega ao cartão pelo teclado recebe a
   mesma resposta de quem lá chega com o rato. */
.noticia-cartao-liga:hover .noticia-cartao-foto,
.noticia-cartao-liga:focus-visible .noticia-cartao-foto{transform:scale(1.06)}
@media (prefers-reduced-motion:reduce){
  .noticia-cartao-foto{transition:none}
  .noticia-cartao-liga:hover .noticia-cartao-foto,
  .noticia-cartao-liga:focus-visible .noticia-cartao-foto{transform:none}
}
.noticia-cartao-texto{flex:1;padding:19px 0 0}
/* Tipografia do cartão, do Figma. Vale para a listagem E para «Outras notícias»:
   é o mesmo cartão nos dois sítios, e classes separadas garantiam que um retoque
   num lado não chegava ao outro. As cores são os tokens da marca — a data é
   `--texto` a 50%, o título é o verde cheio.

   A cor fica ANTES das regras de `.e-pintado`, que a substituem nos cartões de
   evento (texto invertido sobre a cor da categoria). */
.noticia-cartao-meta{display:flex;flex-wrap:wrap;align-items:center;gap:16px;
                     margin:0 0 6px;color:rgba(var(--texto-rgb),.5);
                     font-family:var(--f-corpo);font-size:12px;font-style:normal;
                     font-weight:300;line-height:30px}
.noticia-cartao-titulo{margin:0;color:var(--verde);
                       font-family:var(--f-titulo);font-size:20px;font-style:normal;
                       font-weight:300;line-height:30px;
                       display:-webkit-box;-webkit-line-clamp:2;line-clamp:2;
                       -webkit-box-orient:vertical;overflow:hidden}

/* Variante PINTADA — a cor vem da categoria (Notícias → Categorias, no CMS) e
   entra por variável no próprio elemento, calculada na view. A cor do texto e o
   véu do crachá são derivados da luminância: um editor pode escolher um tom
   claro, e texto branco por cima seria ilegível. */
.noticia-cartao.e-pintado .noticia-cartao-moldura,
.noticia-cartao.e-pintado .noticia-cartao-foto{border-radius:var(--raio) var(--raio) 0 0}
.noticia-cartao.e-pintado .noticia-cartao-texto{padding:16px;
    background:var(--cor-cartao);border-radius:0 0 var(--raio) var(--raio)}
.noticia-cartao.e-pintado .noticia-cartao-meta,
.noticia-cartao.e-pintado .noticia-cartao-titulo{color:var(--cor-cartao-texto)}
.noticia-cartao-tag{display:inline-flex;align-items:center;justify-content:center;
                    min-width:56px;min-height:28px;padding:2px 10px;
                    border-radius:var(--raio);background:var(--cor-cartao-veu);
                    font-size:.75rem;line-height:1.2}

/* Paginação — o Figma não desenhou nenhuma (mostra 9 cartões e acaba). Fica
   sóbria e alinhada com o resto: anterior / posição / seguinte. */
.paginacao{display:flex;flex-wrap:wrap;align-items:center;justify-content:center;
           gap:1.5rem;margin-top:clamp(2.5rem,5vw,4rem);
           font-family:var(--f-corpo);font-size:.875rem}
.paginacao-passo{color:var(--verde);text-decoration:none;
                 border-bottom:1px solid transparent;padding-bottom:0px}
.paginacao-passo:hover{border-bottom-color:var(--verde)}
.paginacao-passo.e-inerte{color:var(--cinza);opacity:.5}
.paginacao-posicao{color:var(--cinza)}

@media (max-width:980px){.noticias-grelha{grid-template-columns:repeat(2,1fr)}}
@media (max-width:640px){.noticias-grelha{grid-template-columns:1fr}}

/* ── Notícia: página de detalhe (Figma node 612:337) ─────────────────────────
   Metade texto, metade imagem, com a imagem alinhada pelo TOPO do texto
   (`align-items:start`): esticada à altura do artigo ficaria deformada, e um
   texto longo deixava a foto pendurada no meio do nada.

   As três medidas de tipografia são as do desenho, tal como vieram. As cores
   coincidem com o token `--texto` (#465756) — a data é o mesmo tom a 50%, daí o
   `--texto-rgb`, para não haver um segundo sítio a guardar a mesma cor. */
/* 80px a separar do que vem antes (as migalhas), os mesmos que a cronologia
   da /a-clinica usa. Aqui o artigo não tem faixa de cor, por isso podia ser
   `padding` — fica em `margin` para a regra se ler igual à da secção de
   Contactos, que só podia ser margem. */
.artigo{margin-top:80px;padding:0 0 clamp(4rem,8vw,120px)}
.artigo-grelha{display:grid;grid-template-columns:1fr 1fr;gap:40px;align-items:start}

/* `justify-content:flex-start` é o valor de fábrica de um flex, mas fica escrito:
   esta linha ora tem etiqueta + data, ora só data, e é o tipo de sítio onde um
   `center` entra sem se dar por isso ao mexer no caso com etiqueta. */
.artigo-data{display:flex;flex-wrap:wrap;align-items:center;justify-content:flex-start;
             gap:12px;margin:0 0 .5rem;text-align:left;
             font-family:var(--f-corpo);font-size:12px;font-style:normal;font-weight:300;
             line-height:30px;color:rgba(var(--texto-rgb),.5)}
/* Etiqueta da categoria. Só é desenhada quando a categoria tem COR no CMS — a
   mesma regra do cartão pintado da listagem —, por isso «Notícias» não a leva e
   «Eventos» leva. A cor entra por variável, definida na view.

   Sobre branco usa-se a cor cheia (fundo) com texto branco, e não o véu
   translúcido dos cartões: lá o crachá assenta sobre o cartão já pintado, aqui
   assenta na página. */
.artigo-tag{display:inline-flex;align-items:center;padding:2px 10px;border-radius:var(--raio);
            background:var(--cor-tag,var(--verde));color:var(--branco);
            font-size:12px;line-height:20px}

.artigo-titulo{margin:0 0 1.5rem;font-family:var(--f-titulo);font-size:40px;font-style:normal;
               font-weight:250;line-height:normal;color:var(--texto)}

.artigo-corpo{font-family:var(--f-corpo);font-size:16px;font-style:normal;font-weight:300;
              line-height:30px;color:var(--texto)}
/* Parágrafos SEM espaçamento, por decisão editorial (11-08). Eram 30px — a mesma
   entrelinha do corpo, para o ritmo vertical fechar.
   ⚠️ Consequência a saber: com margem zero, separar duas ideias passa a exigir um
   parágrafo VAZIO escrito no editor. Não há aviso nenhum quando falta: o texto
   sai corrido e só se vê depois de publicado.
   A regra `p:last-child{margin-bottom:0}` que aqui estava deixou de fazer falta —
   servia para o último parágrafo não deixar um vazio no fim do artigo.
   As listas mantêm os 30px (regra abaixo); se também as quiser juntas, é aí. */
.artigo-corpo p{margin:0}
.artigo-corpo ul,.artigo-corpo ol{margin:0 0 30px;padding-left:1.25rem}
.artigo-corpo h2,.artigo-corpo h3{font-family:var(--f-titulo);font-weight:300;color:var(--verde);
                                  margin:2rem 0 .75rem;line-height:1.2}
.artigo-corpo h2{font-size:1.75rem}
.artigo-corpo h3{font-size:1.35rem}
.artigo-corpo a{color:var(--verde);text-decoration:underline;text-underline-offset:.2em}
.artigo-corpo img{max-width:100%;height:auto;border-radius:var(--raio)}
.artigo-lead{font-size:18px;line-height:32px}

.artigo-media{margin:0}
.artigo-foto{display:block;width:100%;height:auto;border-radius:var(--raio)}

.artigo-galeria{display:grid;grid-template-columns:repeat(auto-fit,minmax(280px,1fr));
                gap:1.5rem;margin-top:3rem}
.artigo-galeria img{width:100%;aspect-ratio:404/296;object-fit:cover;border-radius:var(--raio)}

/* ── «Outras notícias» ───────────────────────────────────────────────────────
   Reaproveita a grelha e o cartão da listagem — é o mesmo desenho, e duplicar as
   classes garantia que um retoque num sítio não chegava ao outro. Só acrescenta
   a linha de resumo, que a listagem não tem. */
/* Traço a separar o artigo (Figma: 0.5px, #5E7975 = o verde da marca). Vai no
   `.wrap` e não na secção para acompanhar a largura do conteúdo em vez de
   atravessar o ecrã de ponta a ponta.

   0.5px é sub-pixel: num ecrã 2x dá um fio de 1 pixel de dispositivo, que é o
   que o desenho quer; num 1x o browser arredonda para 1px e fica um cabelo mais
   grosso. Fica assim porque foi a medida pedida — a alternativa seria 1px com
   transparência, que engana melhor em 1x mas afasta-se do valor do Figma. */
/* O MÍNIMO é 100px e não os 64px de antes (4rem). Não é gosto — é a barra
   «Pedido de consulta» do rodapé, que sobe 34,5px por cima desta secção. Esses
   34,5px saem do espaço em baixo, e com 64px sobravam 29,5px entre o último
   cartão e a barra, contra 86,5px em ecrã largo. Media aqui, em cada largura:

     antes:  390px → 29,5px de folga    ·  1512px → 86,5px
     agora:  390px → 65,5px de folga    ·  1512px → 86,5px  (não mexeu)

   Subir o mínimo do `clamp` e não acrescentar uma media query: assim o valor
   cresce sem degraus e nada muda acima dos 1250px, que é onde o `8vw` já passa
   os 100px. Uma media query aos 900px dava um salto de 28px ao contrário — mais
   espaço no ecrã pequeno do que no médio. */
.mais-noticias{padding:0 0 clamp(6.25rem,8vw,160px)}
.mais-noticias>.wrap{border-top:.5px solid var(--verde);
                     padding-top:clamp(2.5rem,5vw,60px)}
.mais-noticias-topo{display:flex;flex-wrap:wrap;align-items:baseline;justify-content:space-between;
                    gap:1rem;margin-bottom:30px}
/* Tipografia do Figma. A cor é o verde da marca (PANTONE 5487 C = #5E7975), que
   é o token `--verde` — não se repete o hexadecimal aqui.

   `line-height:30px` num corpo de 40px é 75%: a caixa de linha fica MENOR do que
   as letras. É o valor do desenho e fica assim, mas é a razão de o título já não
   levar margem inferior própria — o espaço vem do `margin-bottom` do cabeçalho
   da secção. Se aparecerem descendentes cortados (o «ç» de «notícias» não tem,
   mas um título editado pode ter), o suspeito é este.

   `text-align:center` também vem do desenho. Não tem efeito visível: o título é
   item de um flex `space-between`, portanto encolhe ao conteúdo e fica à
   esquerda, com o link à direita — que é o que o Figma mostra. */
.mais-noticias-topo h2{margin:0;color:var(--verde);text-align:center;
                       font-family:var(--f-titulo);font-size:40px;font-style:normal;
                       font-weight:300;line-height:30px}
.mais-noticias-ver{color:var(--verde);text-decoration:none;
                   font-family:var(--f-titulo);font-size:20px;font-style:normal;
                   font-weight:300;line-height:normal}
.mais-noticias-ver:hover{text-decoration:underline}
/* Resumo: repare-se que o Figma pede aqui o VERDE a 50% (94,121,117), e não o
   `--texto` da data — são dois cinzentos-esverdeados parecidos, mas diferentes.
   Daí usar `--verde-rgb` e não `--texto-rgb`. */
.noticia-cartao-resumo{margin:.35rem 0 0;color:rgba(var(--verde-rgb),.5);
                       font-family:var(--f-corpo);font-size:16px;font-style:normal;
                       font-weight:300;line-height:30px;
                       display:-webkit-box;-webkit-line-clamp:2;line-clamp:2;
                       -webkit-box-orient:vertical;overflow:hidden}

@media (max-width:900px){
  /* Em coluna estreita, 50% para cada lado dava duas colunas ilegíveis: o texto
     passa para cima e a fotografia para baixo. */
  .artigo-grelha{grid-template-columns:1fr;gap:2rem}
  .artigo-titulo,.mais-noticias-topo h2{font-size:clamp(1.75rem,5vw,40px)}
}

/* ── Lista de colaboradores (Figma node 1165:309) ────────────────────────────
   Quatro colunas: o cabeçalho (ícone + título) ocupa a primeira célula e os
   cartões fluem a seguir, incluindo por baixo dele. É o que o desenho mostra, e
   sai de graça com `display:grid` — um cabeçalho em coluna própria obrigaria a
   dizer quantos cartões cabem por linha, que é exactamente o que não se sabe
   quando as pessoas vêm do CMS. */
/* 80px a abrir. Era um clamp que só chegava aos 80px em ecrã largo e encolhia
   para 48px no telemóvel; passa a ser a medida pedida em qualquer largura.

   NOTA sobre «a primeira»: nesta página a ordem é banner → migalhas → intro →
   colaboradores → colaboradores, por isso uma lista NUNCA é a primeira secção da
   página. O que a regra garante é que a primeira LISTA abre com 80px — e como o
   valor está na regra base, a segunda abre com os mesmos 80px. Se a segunda
   dever ficar encostada à primeira, é `.colaboradores + .colaboradores
   {padding-top:0}`. */
.colaboradores{padding:80px 0;
               /* Altura da fotografia, PARTILHADA com o cabeçalho: escrita duas
                  vezes, mais cedo ou mais tarde uma delas mudava sozinha e o
                  cabeçalho deixava de alinhar com a primeira linha de cartões.
                  433px é a medida do Figma; encolhe com a largura do ecrã. */
               --foto-altura:clamp(260px,32.5vw,433px)}
/* Última secção da página: 180px a fechar, antes do rodapé. Enquanto tem secções
   por baixo, o espaçamento normal chega — é o intervalo ENTRE secções. A seguir
   não vem nada, e sem isto o conteúdo ficava colado à faixa do rodapé.

   `:last-child` e não uma classe posta na view: quem decide a ordem das secções é
   o CMS, e uma classe obrigaria a recalculá-la a cada arrastar de secção. As
   secções são filhas directas de `#cms-page` (ver show.blade.php), por isso o
   selector é fiável — e o `#` dá-lhe especificidade que sobra sobre a regra base. */
/* Os 180px eram FIXOS — a medida do desenho a 1512px, aplicada tal e qual a um
   telemóvel, onde sobravam 145px de vazio até à barra do rodapé. Passa a `clamp`,
   com os mesmos 100px de mínimo do `.mais-noticias`, do `.home-noticias` e do
   `.esp-faixa:last-child`, para todas as páginas fecharem com a mesma folga.
   Os 11.9vw dão os 180px a 1512px; abaixo dos 840px vale o mínimo. */
#cms-page > .colaboradores:last-child{padding-bottom:clamp(6.25rem,11.9vw,180px)}
.colaboradores-grelha{display:grid;grid-template-columns:repeat(4,1fr);
                      gap:clamp(1.5rem,3vw,40px) 24px;align-items:start}

/* O cabeçalho é a 1.ª das quatro colunas. Tem a MESMA altura da fotografia dos
   cartões (433px), com o ícone e o título centrados nos dois eixos — assim o
   bloco alinha com a primeira linha de fotografias em vez de flutuar no topo.

   Sem `min-width:0` numa grelha de `1fr`, um título comprido alargava a coluna e
   roubava largura aos cartões: as colunas de `1fr` cedem ao conteúdo. */
.colaboradores-cabeca{display:flex;flex-direction:column;justify-content:center;
                      align-items:center;gap:16px;min-width:0;text-align:center;
                      height:var(--foto-altura)}
/* 64px, o corpo que o Figma dá ao ícone (lá é um glifo da Font Awesome Pro;
   aqui é um SVG do tema — ver assets/estetoscopio.svg). */
.colaboradores-icone{width:clamp(44px,4.8vw,64px);height:auto;display:block}
/* Tipografia do Figma nos MÁXIMOS (40/48, 20/30, 16/30) e a encolher com o ecrã.
   As entrelinhas passaram de px para rácio — 48/40 = 1.2, 30/20 = 1.5,
   30/16 = 1.875 — para a proporção se manter enquanto o corpo desce. No desktop
   os valores computados são exactamente os do desenho. */
.colaboradores-titulo{margin:0 auto;color:var(--verde);text-align:center;
                      font-family:var(--f-titulo);font-size:clamp(1.75rem,3vw,40px);
                      font-style:normal;font-weight:300;line-height:1.2}
/* O título parte em DUAS linhas — pelo CSS, sem `<br>` no marcado.
   
   `5.25em` e não pixéis: a medida acompanha o `clamp()` do tamanho de letra, por
   isso a quebra aguenta-se em qualquer largura de ecrã em vez de se desfazer
   quando a letra encolhe. O valor foi medido, não adivinhado — a janela que dá
   duas linhas aos dois títulos («Corpo Clínico» e «Auxiliares e Enfermeiros») vai
   de 5 a 5.5em, e 5.25 fica ao centro dela.

   `text-wrap:balance` reparte as linhas de forma equilibrada em vez de encher a
   primeira e deixar uma palavra sozinha na segunda.

   ⚠️ Isto depende do comprimento dos títulos actuais. Uma palavra bem mais longa
   passa dos 5.25em e desce a uma terceira linha.

   Só a partir dos 1081px — a mesma fronteira em que a grelha passa de 3 para 4
   colunas. Em tablet e telemóvel não se força quebra nenhuma: a coluna é
   proporcionalmente mais larga e o título assenta numa linha só. */
@media (min-width:1081px){
  .colaboradores-titulo{max-width:5.25em;text-wrap:balance}
}

.colaborador{margin:0;min-width:0;text-align:center}
/* Altura FIXA de 433px, do desenho — a largura é que varia com a coluna.
   `object-fit:cover` porque as fotografias vêm do CMS e raramente chegam todas
   com o mesmo recorte; sem isto, uma foto quadrada esticava e partia o
   alinhamento da linha inteira. O enquadramento pelo topo mantém as caras
   dentro do corte quando a foto é mais alta do que a caixa. */
.colaborador-foto{display:block;width:100%;height:var(--foto-altura);object-fit:cover;
                  object-position:center top;border-radius:var(--raio)}
.colaborador-nome{margin:12px 0 0;color:var(--texto);text-align:center;
                  font-family:var(--f-titulo);font-size:clamp(1rem,1.5vw,20px);
                  font-style:normal;font-weight:300;line-height:1.5}
.colaborador-cargo{margin:0;color:var(--texto);text-align:center;
                   font-family:var(--f-corpo);font-size:clamp(.875rem,1.2vw,16px);
                   font-style:normal;font-weight:300;line-height:1.875}

/* Fundos da palete do tema — mesmas chaves da cronologia, incluindo as antigas
   ('green', 'black') para secções criadas antes de a palete mudar. */
.colaboradores--branco{background:var(--branco)}
.colaboradores--areia,.colaboradores--blue{background:var(--areia)}
.colaboradores--verde,.colaboradores--green{background:var(--verde)}
.colaboradores--verde-escuro,.colaboradores--black{background:var(--verde-escuro)}

/* Sobre fundo escuro inverte-se tudo o que é texto. A lista de cores «escuras»
   está na view e é a mesma da cronologia, para as duas nunca discordarem. */
.colaboradores.e-escura .colaboradores-titulo,
.colaboradores.e-escura .colaborador-nome{color:var(--branco)}
.colaboradores.e-escura .colaborador-cargo{color:var(--branco)}

/* ── A ALTURA DA FOTOGRAFIA ACOMPANHA A COLUNA ────────────────────────────
   A regra base é `--foto-altura:clamp(260px,32.5vw,433px)`, e esse `32.5vw` foi
   afinado para QUATRO colunas: a 1332px de ecrã dá exactamente os 433px do
   Figma. O problema é que a coluna cresce muito mais depressa do que 32.5vw
   quando há menos colunas — e a altura ficava presa a um número de colunas que
   já não existia.

   Media-se assim, com as fotografias reais da equipa (592×868, rácio 0.68):

       820px · 2 colunas · foto 350×267 → rácio 1.31
       700px · 2 colunas · foto 290×260 → rácio 1.12
       500px · 2 colunas · foto 214×260 → rácio 0.82

   A 820px o quadro tinha o rácio quase invertido: o `object-fit:cover` deitava
   fora perto de METADE da altura de uma fotografia tirada de pé, e o que sobrava
   era uma tira horizontal.

   A correcção é dar a cada banda o seu `vw`, calculado a partir da largura real
   da coluna nessa banda — que depende do número de colunas E da goteira do
   `.wrap` (3rem abaixo de 640px, 6rem acima). Verificado em 20 larguras, dos 320
   aos 1440: o rácio fica entre 0.65 e 0.72, contra os 0.682 do ficheiro
   original. Desvio máximo 0.038 — corte praticamente nulo em qualquer ecrã. */
@media (max-width:1080px){
  .colaboradores-grelha{grid-template-columns:repeat(3,1fr)}
  .colaboradores{--foto-altura:clamp(200px,calc(49vw - 70px),433px)}
}
/* TABLET: TRÊS colunas, e não duas.

   Eram duas até aos 820px, e é aí que estava o pior corte de todos. Com três, a
   820px o cartão fica com 225px de largura — os cartões do desktop têm 300, por
   isso há folga de sobra — e a secção fica MAIS CURTA do que estava:
   1117px contra 1340px. Melhor enquadramento e menos deslocamento ao mesmo
   tempo, o que não é o costume.

   A fronteira é 640px por não ser inventada: é a mesma em que a goteira do
   `.wrap` muda de 3rem para 6rem. Abaixo dela estão os telemóveis, e esses ficam
   com duas colunas. */
@media (max-width:820px){
  .colaboradores-grelha{grid-template-columns:repeat(3,1fr)}
  /* Fora das quatro colunas, o cabeçalho sozinho numa célula deixava a linha
     meia vazia: passa a atravessar a grelha e os cartões começam por baixo. E aí
     a altura da fotografia deixa de fazer sentido — seriam 433px de vazio à
     volta de duas linhas de texto. */
  .colaboradores-cabeca{grid-column:1/-1;height:auto}
}
/* TELEMÓVEL: continuam DUAS colunas, e não uma.

   Era uma coluna, e a razão para mudar não foi compactar — foi o enquadramento.
   As fotografias da equipa são verticais (592×868, rácio 0.68). Numa coluna, o
   cartão fica com 342px de largura num telemóvel de 390 e a foto com 342×260 —
   rácio 1.32, quase o inverso do original. O `object-fit:cover` resolve isso a
   cortar a fotografia em faixa, e o que sobra é uma tira horizontal de uma
   fotografia que foi tirada de pé.

   Em duas colunas, e com a altura a acompanhar a coluna, a foto fica em 159×234
   num telemóvel de 390 — rácio 0.68, o mesmo do ficheiro. Medido também a 320,
   360 e 420px: 0.68 nos quatro. Efeito lateral bem-vindo: a secção passa de
   2357px para 1314px de altura, menos 44% de deslocamento.

   O `73.5vw - 53px` sai da largura real da coluna nesta banda — goteira de 3rem,
   duas colunas, 24px de intervalo — multiplicada por 1/0.68. Não é um número
   escolhido à mão: é a conta que mantém a proporção da fotografia.

   A fronteira é 639.98 e não 640: aos 640 exactos entra a goteira de 6rem
   (`min-width:640px` no `.wrap`) e as duas regras aplicavam-se ao mesmo tempo,
   o que dava um rácio de 0.62 nessa largura exacta. Apanhou-se a medir.

   Os nomes passam a duas linhas, o que a 159px de coluna é o esperado — e
   continua legível até aos 320px. */
@media (max-width:639.98px){
  .colaboradores-grelha{grid-template-columns:repeat(2,1fr)}
  .colaboradores{--foto-altura:clamp(180px,calc(73.5vw - 53px),433px)}
}

/* ── Especialidades (Figma node 1165:382) ────────────────────────────────────
   Faixa: imagem de um lado, texto do outro, a alternar. As colunas saem do
   desenho — imagem 513px, texto 621px, 140px de intervalo — escritas em `fr`
   para acompanharem a largura do wrap em vez de ficarem presas a 1272px.

   O lado ALTERNA por `:nth-child(even)`, com `direction:rtl` a inverter a ordem
   visual sem tocar na ordem do marcado. Assim o leitor de ecrã e o teclado
   continuam a receber imagem → texto em todas as faixas, e reordenar blocos no
   CMS volta a alternar sozinho. O `direction:ltr` no conteúdo devolve o sentido
   normal ao texto — sem isso, a pontuação saía trocada de lado. */
.especialidades{padding:80px 0 0}
.esp-faixa{padding-bottom:clamp(4rem,10vw,155px)}
/* A ÚLTIMA faixa é a que encosta ao rodapé, e por isso leva um valor próprio.
   Era 160px FIXOS — os 160px do desenho a 1512px, aplicados também a um
   telemóvel, onde ficavam 125px de vazio entre o último texto e a barra do
   rodapé. As outras faixas já eram um `clamp`; esta ficou por converter.

   Os 10.6vw dão 160px a 1512px (a mesma inclinação das outras) e o mínimo é o
   mesmo 100px do `.mais-noticias` e do `.home-noticias`, para as três páginas
   acabarem com a mesma folga até à barra «Pedido de consulta». Abaixo dos 943px
   vale o mínimo; acima dos 1509px, os 160px do desenho. */
.esp-faixa:last-child{padding-bottom:clamp(6.25rem,10.6vw,160px)}
.esp-grelha{display:grid;grid-template-columns:513fr 621fr;
            gap:clamp(2rem,11vw,140px);align-items:center}
.esp-faixa:nth-child(even) .esp-grelha{direction:rtl}
.esp-faixa:nth-child(even) .esp-conteudo{direction:ltr}

.esp-media{margin:0;min-width:0}
/* Proporção do desenho (513×480). `cover` porque as fotografias vêm do CMS e não
   chegam todas com o mesmo recorte. */
.esp-foto{display:block;width:100%;aspect-ratio:513/480;object-fit:cover;
          border-radius:var(--raio)}

.esp-conteudo{min-width:0}
/* Tipografia do Figma, com os valores tal como vieram. Note-se que o título é
   `--texto` (#465756) e NÃO o verde da marca — ao contrário do título da secção
   de colaboradores, que é verde. São secções diferentes e o desenho distingue-as.

   Valores fixos, sem clamp: foi o que foi pedido para esta secção. Se um dia se
   quiser que encolham com o ecrã, como na secção de colaboradores, é trocar por
   clamp com estes números como máximo. */
.esp-titulo{margin:0 0 1rem;color:var(--texto);
            font-family:var(--f-titulo);font-size:48px;font-style:normal;
            font-weight:250;line-height:normal}
.esp-texto{color:var(--texto);font-family:var(--f-corpo);
           font-size:16px;font-style:normal;font-weight:300;line-height:30px}
.esp-texto p{margin:0 0 1rem}
.esp-texto p:last-child{margin-bottom:0}
.esp-texto a{color:var(--verde);text-decoration:underline;text-underline-offset:.2em}
/* Botão de canto vivo, só aqui: o `.btn` do tema tem `var(--raio)` e é usado em
   toda a parte, por isso o zero fica escopado a esta secção em vez de mudar o
   botão do site inteiro. */
.esp-accao{margin:1.5rem 0 0}

/* Fundos da palete do tema — mesmas chaves das outras secções. A faixa pinta a
   largura toda; por isso o padding vertical vive nela e não no wrap. */
.esp-faixa--branco{background:var(--branco)}
.esp-faixa--areia,.esp-faixa--blue{background:var(--areia)}
.esp-faixa--verde,.esp-faixa--green{background:var(--verde)}
.esp-faixa--verde-escuro,.esp-faixa--black{background:var(--verde-escuro)}
.esp-faixa.e-escura .esp-titulo,.esp-faixa.e-escura .esp-texto{color:var(--branco)}
.esp-faixa.e-escura .btn{background:var(--branco);color:var(--verde)}
.esp-faixa.e-escura .btn:hover{background:rgba(255,255,255,.85);color:var(--verde)}

@media (max-width:820px){
  /* Em coluna estreita as duas colunas ficavam ilegíveis: imagem em cima, texto
     por baixo — e o `direction:rtl` deixa de fazer sentido numa só coluna. */
  .esp-grelha,.esp-faixa:nth-child(even) .esp-grelha{grid-template-columns:1fr;
                                                     direction:ltr;gap:1.5rem}
}

/* ── Página em construção (Figma node 104:263) ──────────────────────────── */
.construcao{padding:clamp(4rem,10vw,7.5rem) 0;text-align:center;color:var(--verde)}
.construcao-marca{width:141px;height:141px;margin:0 auto}
.construcao-titulo{font-family:var(--f-titulo);font-weight:300;
                   font-size:clamp(1.75rem,4vw,2.5rem);line-height:1.2;margin:2.25rem 0 .75rem}
.construcao-texto{font-size:1.25rem;line-height:1.5;margin:0}
.construcao-sobretitulo{font-size:.8rem;letter-spacing:.12em;text-transform:uppercase;
                        opacity:.75;margin:1.5rem 0 0}
.construcao-accoes{margin-top:2rem}
@media (max-width:640px){
  .construcao-marca{width:110px;height:110px}
  .construcao-texto{font-size:1.05rem}
}

/* ── Cronologia (Figma nodes 553:422 e seguintes) ───────────────────────
   Linha vertical ao centro; conteúdo alternado à direita e à esquerda, com um
   ponto no eixo a marcar cada etapa. A linha é desenhada POR ETAPA e não uma só
   para a secção: cada etapa pode ter fundo próprio, e uma linha contínua por
   baixo atravessaria um bloco escuro com a cor errada. */
/* 80px a separar a cronologia do que vem antes (as migalhas, nesta página). */
.timeline{--eixo:rgba(var(--verde-rgb),.45);margin-top:80px}
.timeline-lista{list-style:none;margin:0;padding:0}

/* 180px em cima e em baixo de cada etapa: entre duas etapas ficam os 180 de uma
   mais os 180 da outra. Dá-se a cada etapa e não só aos intervalos porque o fundo
   é por etapa — uma faixa de cor sem espaçamento próprio ficaria colada ao texto.
   O `--pad` existe para o ponto do eixo acompanhar: escrito em número fixo, ficava
   fora do sítio assim que o espaçamento mudasse no telemóvel. */
.timeline-etapa{--pad:180px;--pad-topo:var(--pad);
                position:relative;padding-top:var(--pad-topo);padding-bottom:var(--pad)}
/* A primeira etapa não tem etapa acima de quem se afastar — os 180px eram só
   vazio a seguir às migalhas. 80px, que somados aos 80px de margem da secção dão
   160px até ao topo do conteúdo. O `min()` evita que no telemóvel a primeira
   etapa passe a ter MAIS espaço do que as outras (lá `--pad` desce a 64px). */
.timeline-etapa:first-child{--pad-topo:min(80px, var(--pad))}
.timeline-etapa::before{content:"";position:absolute;left:50%;top:0;bottom:0;
                        width:1px;background:var(--eixo);transform:translateX(-50%)}
/* +15px = meia entrelinha do título (30px), para o ponto ficar à altura da sua
   primeira linha. Estava em 22px, de quando a entrelinha era 1.2 do corpo. */
.timeline-etapa::after{content:"";position:absolute;left:50%;top:calc(var(--pad-topo) + 15px);
                       width:10px;height:10px;border-radius:50%;background:var(--verde);
                       transform:translate(-50%,-50%);z-index:1}

/* Alternância: ímpares à direita do eixo, pares à esquerda.
   O texto leva 1/6 de espaçamento de cada lado da sua coluna — a percentagem
   resolve contra a coluna (metade da grelha), por isso o bloco de texto fica com
   4/6 da metade e as goteiras acompanham a largura do ecrã em vez de ficarem
   presas a um número de pixéis. Sem `gap` na grelha: o afastamento ao eixo passa
   a ser esse mesmo 1/6, e não duas medidas a somar-se. */
.timeline-grelha{display:grid;grid-template-columns:1fr 1fr;gap:0}
.timeline-conteudo{grid-column:2;padding-inline:calc(100% / 6)}
.timeline-etapa:nth-child(even) .timeline-conteudo{grid-column:1;text-align:right}

/* Lado escolhido no CMS (campo «Alinhamento do texto»). Vem DEPOIS da regra da
   alternância de propósito: com a mesma especificidade, ganha quem vier a seguir
   — é assim que o valor explícito sobrepõe o automático. */
.timeline-etapa.lado-direita .timeline-conteudo{grid-column:2;text-align:left}
.timeline-etapa.lado-esquerda .timeline-conteudo{grid-column:1;text-align:right}

/* ── Etapa COM fotografia ─────────────────────────────────────────────────────
   A imagem toma uma das metades da etapa e o texto vai para a outra. O lado vem
   do campo «Posição da imagem» do bloco — o mesmo campo, com o mesmo sentido, da
   secção «Imagem e Texto».

   Estas regras vêm DEPOIS das da alternância e das do campo «Posição»: com a
   mesma especificidade (três classes) ganha a última, e é assim que havendo
   fotografia é ela a mandar no lado. Sem imagem nenhuma destas classes é posta e
   a etapa alterna como sempre alternou.

   Ficam ANTES das regras `.texto-left/.texto-right`, de propósito: o alinhamento
   do texto escolhido no CMS continua a poder contrariar o que a posição da
   imagem impõe. São duas decisões diferentes. */
.timeline-etapa.com-imagem .timeline-grelha{align-items:center}
/* ⚠️ `grid-row:1` NOS DOIS. Sem isto, a fotografia à DIREITA empurrava o texto
   para baixo: o marcado traz a imagem primeiro, ela ocupa a coluna 2 da linha 1,
   e o texto — que pede a coluna 1 — não pode recuar numa linha já ocupada à sua
   direita. A colocação automática do CSS nunca anda para trás, por isso abria uma
   linha 2 e o texto caía para lá. Com a imagem à esquerda o problema não se via,
   porque aí a ordem do marcado coincide com a das colunas.
   A alternativa seria `grid-auto-flow:dense`, que muda a colocação da grelha
   inteira para resolver um caso só. */
.timeline-etapa.com-imagem .timeline-media,
.timeline-etapa.com-imagem .timeline-conteudo{grid-row:1}
.timeline-media{align-self:center;padding-inline:calc(100% / 6)}
.timeline-foto{display:block;width:100%;height:auto;border-radius:var(--raio)}

.timeline-etapa.img-esquerda .timeline-media{grid-column:1}
.timeline-etapa.img-esquerda .timeline-conteudo{grid-column:2;text-align:left}
.timeline-etapa.img-direita .timeline-media{grid-column:2}
.timeline-etapa.img-direita .timeline-conteudo{grid-column:1;text-align:right}

/* Alinhamento do texto dentro do bloco (campo «Alinhamento do texto»). É outra
   coisa diferente da posição: um bloco à direita do eixo pode ter o texto alinhado
   à direita. Vem depois das regras de posição, que também definem `text-align`,
   para as sobrepor sem `!important`. */
.timeline-etapa.texto-left .timeline-conteudo{text-align:left}
.timeline-etapa.texto-right .timeline-conteudo{text-align:right}

/* Etapa sem marca no eixo (campo «Aparece ponto no eixo»). */
.timeline-etapa.sem-ponto::after{content:none}

/* Medidas do Figma: Canela 250, 40px, entrelinha 30px (75% da altura), #5E7975.
   A entrelinha é MENOR do que o corpo de propósito — é o desenho —, mas só se
   aguenta em títulos curtos: a partir de duas linhas as maiúsculas de uma tocam
   nas descidas da outra. Daí o alívio para 1.1 abaixo dos 1080px, onde os
   títulos passam quase todos a quebrar. */
.timeline-titulo{font-family:var(--f-titulo);font-weight:250;color:var(--verde);
                 font-size:40px;line-height:44px;margin:0 0 1.75rem}
/* Medidas do Figma: Poppins 300, 16px, entrelinha 30px, #465756.
   Sem `max-width` em ch: a largura já vem do 1/6 acima, e as duas medidas a
   competir davam colunas de larguras diferentes conforme o comprimento do texto. */
.timeline-texto{font-family:var(--f-corpo);font-weight:300;font-size:16px;
                line-height:30px;color:var(--texto)}
/* O texto vem de um editor rico: além de parágrafos pode trazer listas, negritos
   e hiperligações. Sem estas regras, uma lista aparecia sem marcadores e um link
   sem qualquer indicação de que era clicável. */
.timeline-texto p{margin:0 0 .75rem}
.timeline-texto p:last-child{margin-bottom:0}
.timeline-texto ul,.timeline-texto ol{margin:0 0 .75rem;padding-left:1.25rem}
.timeline-texto ul{list-style:disc}
.timeline-texto ol{list-style:decimal}
.timeline-texto li{margin-bottom:.25rem}
.timeline-texto a{color:inherit;text-decoration:underline;text-underline-offset:.2em}
.timeline-texto strong{font-weight:500}
.timeline-etapa:nth-child(even) .timeline-texto ul,
.timeline-etapa:nth-child(even) .timeline-texto ol{
  /* Alinhado à direita, os marcadores ficavam soltos no meio do texto. */
  list-style-position:inside;padding-left:0}
.timeline-accao{margin-top:1.75rem}

/* Fundos por bloco (palete em themes/clinicamedicavita/colours.php). As chaves
   antigas do esqueleto ficam mapeadas para não deixar blocos sem estilo. */
/* ── Aparecimento com o scroll ────────────────────────────────────────────────
   Anima-se o CONTEÚDO e o ponto do eixo, nunca a etapa. Cada etapa é uma faixa
   de largura total com fundo próprio: deslocá-la abria uma brecha entre as
   cores, e a linha do eixo (o ::before) andava com ela.

   A classe `.revela` é posta pelo JAVASCRIPT, não está no marcado. Sem JS — ou
   sem IntersectionObserver — nada disto se aplica e as etapas ficam visíveis,
   que é o comportamento que interessa preservar: o efeito é um extra, não a
   condição para se ler a página. */
.timeline-lista.revela .timeline-conteudo,
.timeline-lista.revela .timeline-media{opacity:0;transform:translateY(28px);
    transition:opacity 1.4s ease .15s,transform 1.4s ease .15s}
.timeline-lista.revela .timeline-etapa::after{opacity:0;transition:opacity 1.4s ease .15s}
.timeline-lista.revela .timeline-etapa.e-visivel .timeline-conteudo,
.timeline-lista.revela .timeline-etapa.e-visivel .timeline-media{opacity:1;transform:none}
.timeline-lista.revela .timeline-etapa.e-visivel::after{opacity:1}

/* Quem pediu menos movimento ao sistema não leva movimento nenhum: aparece tudo
   de uma vez, sem transição. */
@media (prefers-reduced-motion:reduce){
  .timeline-lista.revela .timeline-conteudo,
  .timeline-lista.revela .timeline-media,
  .timeline-lista.revela .timeline-etapa::after{opacity:1;transform:none;transition:none}
}

.timeline-etapa--branco{background:var(--branco)}
.timeline-etapa--areia,.timeline-etapa--blue{background:var(--areia)}
.timeline-etapa--verde,.timeline-etapa--green{background:var(--verde)}
.timeline-etapa--verde-escuro,.timeline-etapa--black{background:var(--verde-escuro)}

/* Sobre fundo escuro inverte-se tudo o que assume verde sobre branco. */
.timeline-etapa.e-escura{--eixo:rgba(255,255,255,.5);color:var(--branco)}
.timeline-etapa.e-escura .timeline-titulo{color:var(--branco)}
.timeline-etapa.e-escura::after{background:var(--branco)}
/* Sobre fundo verde, um botão verde desaparece: inverte-se para branco cheio. */
/* Canto vivo, como na secção de Especialidades. Escopado: o `.btn` do tema é
   usado em toda a parte e continua com `var(--raio)`. */
.timeline-etapa.e-escura .btn{background:var(--branco);color:var(--verde)}
.timeline-etapa.e-escura .btn:hover{background:rgba(255,255,255,.85);color:var(--verde)}

/* Ecrã pequeno: o eixo encosta à esquerda e tudo fica numa coluna — duas colunas
   de ~150px partiam as palavras a meio. */
/* 180+180 = 360px entre etapas é o respiro do desenho a 1512px. Em ecrãs menores
   passa a ser meia página em branco, por isso encolhe por patamares. */
@media (max-width:1080px){
  .timeline-etapa{--pad:120px}
  .timeline-titulo{font-size:clamp(1.75rem,3.4vw,2.25rem);line-height:1.1}
}
@media (max-width:820px){
  .timeline-etapa{--pad:64px}
  .timeline-etapa::before{left:12px}
  .timeline-etapa::after{left:12px}
  .timeline-grelha{grid-template-columns:1fr;padding-left:2.25rem}
  /* Numa coluna só, o 1/6 de cada lado comeria um terço da largura útil. */
  .timeline-conteudo,
  .timeline-etapa:nth-child(even) .timeline-conteudo,
  .timeline-etapa.lado-esquerda .timeline-conteudo,
  .timeline-etapa.lado-direita .timeline-conteudo,
  .timeline-etapa.img-esquerda .timeline-conteudo,
  .timeline-etapa.img-direita .timeline-conteudo{
    grid-column:1;text-align:left;padding-inline:0}
  /* Numa coluna só não há lados: a fotografia passa para cima do texto, seja qual
     for o lado escolhido. O marcado já a traz primeiro, por isso basta devolvê-la
     à coluna 1 — sem `order`, que baralharia a ordem de leitura. */
  /* `grid-row:auto` desfaz a linha única do ecrã largo: aqui a fotografia e o
     texto são duas linhas da mesma coluna, empilhados pela ordem do marcado. */
  .timeline-etapa.com-imagem .timeline-media,
  .timeline-etapa.com-imagem .timeline-conteudo{grid-row:auto}
  .timeline-etapa.img-esquerda .timeline-media,
  .timeline-etapa.img-direita .timeline-media{grid-column:1;padding-inline:0;margin-bottom:1.5rem}
  /* O alinhamento escolhido continua a valer numa coluna só — é sobre o texto,
     não sobre o lado, e esse é o único que deixa de fazer sentido no telemóvel. */
  .timeline-etapa.texto-right .timeline-conteudo{text-align:right}
}

/* ── Localização (Figma node 104:302, y≈1818) ───────────────────────────
   Título centrado e mapa de largura total com um cartão de morada por cima. */
/* Sem espaçamento no topo: a secção anterior (o formulário) já traz o seu por
   baixo, e somados davam um vazio a dobrar entre as duas. */
.localizacao{padding-top:0;padding-bottom:120px}
.localizacao-titulo{font-family:var(--f-titulo);font-weight:300;color:var(--texto);
                    font-size:40px;line-height:30px;text-align:center;
                    margin:0 0 30px}
.localizacao-mapa{position:relative;width:100%;height:632px;
                  border-radius:var(--raio);overflow:hidden;background:var(--areia)}
.localizacao-mapa img{width:100%;height:100%;object-fit:cover;object-position:center;display:block}
.localizacao-mapa iframe{position:absolute;inset:0;width:100%;height:100%;border:0;display:block;z-index:2}
/* Tela do mapa da Maps JavaScript API — mesma camada do iframe. Só existe
   quando há chave configurada (ver config/services.php). */
.localizacao-mapa-tela{position:absolute;inset:0;width:100%;height:100%;z-index:2}

/* Cinzento SÓ no iframe. O embed `?pb=` do Google não aceita ficheiro de
   estilos, por isso a dessaturação tem de ser feita aqui, no cliente.

   ⚠️ A IMAGEM ESTÁTICA JÁ NÃO LEVA FILTRO. Antes levava, e fazia sentido
   enquanto era uma captura do Google por estilizar. Deixou de fazer: a imagem
   que lá está agora foi capturada já com as cores da marca (o mesmo
   `map-style.json` do mapa interactivo), e passá-la a cinzento era deitar fora
   exactamente o trabalho que ela traz feito — e mostrar, antes do clique, um
   mapa cinzento que passava a verde depois.

   O cartão de morada continua fora do filtro; se lá entrasse, o verde da marca
   vinha cinzento também.

   O selector é de FILHO DIRECTO de propósito: a Maps JavaScript API desenha os
   mosaicos em `<img>` dentro da sua própria tela, e um `.localizacao-mapa iframe`
   solto não chegaria lá — mas a regra antiga, com `img`, punha o mapa
   estilizado a cinzento e deitava fora o JSON de cores inteiro. */
.localizacao-mapa > iframe{filter:grayscale(1)}

/* Marcador da marca por cima da imagem estática (Figma 104:302, Group 13).

   Ancorado pela PONTA, que é a parte que aponta a morada. No desenho o grupo
   começa em x 811 / y 1987 e mede 81.79×108.05, dentro de um mapa que começa em
   120/1866 e mede 1272×632 — a ponta cai a 57.5% da largura e 36.2% da altura.

   Percentagens e não pixels porque a caixa encolhe com o ecrã e a imagem encolhe
   com ela. A fotografia tem 2544×1264, exactamente o dobro do espaço e o mesmo
   rácio, por isso em ecrã largo o `object-fit:cover` não corta nada e a ponta
   fica no sítio ao pixel; abaixo dos 820px a caixa fica mais quadrada, a imagem
   é cortada de lado e a ponta desvia uns poucos pixels — é o preço de não haver
   coordenadas reais a que agarrar numa imagem achatada.

   Selector de filho directo para bater o `.localizacao-mapa img` acima: sem isso
   o marcador levava com `width:100%;height:100%;object-fit:cover` e saía esticado
   à caixa toda. (Levava também o `grayscale(1)`, enquanto esse filtro se aplicava
   às imagens; hoje só o iframe é dessaturado, mas o `filter:none` abaixo fica
   como rede.) */
.localizacao-mapa > .localizacao-marcador{position:absolute;z-index:1;
                      left:57.5%;top:36.2%;transform:translate(-50%,-100%);
                      width:82px;height:auto;object-fit:fill;
                      /* O cinzento é para o mapa; a marca é a cores. */
                      filter:none;
                      /* Decorativo. Deixar o clique passar é o que faz a imagem
                         TODA carregar o mapa, marcador incluído. */
                      pointer-events:none}
/* Mapa carregado → a Google desenha o marcador dela. Dois pins na mesma morada
   leem-se como duas moradas. */
.mapa-carregado .localizacao-marcador{display:none}

/* Substituto do mapa, até ao clique. Ocupa a área toda: é a imagem inteira que
   carrega o mapa, não um botão dentro dela.

   Nasce INVISÍVEL, por desenho — à partida vê-se a fotografia com o cartão e o
   marcador, e mais nada. O véu escuro e o texto entram ao passar o rato ou ao
   receber o foco: quem chega vê o desenho, quem hesita percebe que aquilo se
   carrega, e quem navega por teclado continua a ter um botão com nome e com o
   aviso da Google. O texto nunca sai do HTML — é ele que dá nome ao botão nos
   leitores de ecrã, e um botão sem nome não é utilizável de todo.

   z-index 2 (era 1) para ficar por cima do marcador; continua por baixo do
   cartão (3), senão engolia o link «Ver no mapa». */
.localizacao-carregar{position:absolute;inset:0;z-index:2;
                      display:flex;flex-direction:column;align-items:center;justify-content:center;
                      gap:.5rem;width:100%;padding:1.5rem;border:0;cursor:pointer;
                      background:rgba(31,42,40,0);color:var(--branco);text-align:center;
                      transition:background .25s ease}
.localizacao-carregar span{font-family:var(--f-titulo);font-weight:300;font-size:22px;line-height:1.2;
                           background:var(--verde);border-radius:100px;padding:12px 28px;
                           opacity:0;transition:opacity .25s ease}
.localizacao-carregar small{font-size:.75rem;line-height:1.4;max-width:42ch;
                            opacity:0;transition:opacity .25s ease}
.localizacao-carregar:hover,
.localizacao-carregar:focus-visible{background:rgba(31,42,40,.45)}
.localizacao-carregar:hover span,
.localizacao-carregar:hover small,
.localizacao-carregar:focus-visible span,
.localizacao-carregar:focus-visible small{opacity:1}
.localizacao-carregar:hover span{background:var(--verde-escuro)}
/* Um botão transparente sem contorno de foco é um alvo invisível para quem
   navega por teclado: era o único sinal de onde está o cursor. */
.localizacao-carregar:focus-visible{outline:3px solid var(--branco);outline-offset:-6px}

@media (prefers-reduced-motion:reduce){
  .localizacao-carregar,
  .localizacao-carregar span,
  .localizacao-carregar small{transition:none}
}

/* Mapa carregado → o cartão sai da frente. O visitante pediu o mapa; manter uma
   caixa opaca por cima dos controlos da Google seria trabalhar contra ele. */
.mapa-carregado .localizacao-cartao{display:none}

/* Cartão sobreposto: 380×150 a 24px do canto, como no desenho. */
.localizacao-cartao{position:absolute;z-index:3;left:24px;top:25px;width:380px;max-width:calc(100% - 48px);
                    background:var(--branco);border-radius:var(--raio);padding:24px;
                    box-shadow:0 12px 32px rgba(31,42,40,.14)}
.localizacao-cartao h3{font-family:var(--f-titulo);font-weight:300;color:var(--verde);
                       font-size:22px;line-height:1.2;margin:0 0 .5rem}
.localizacao-cartao p,.localizacao-morada{font-family:var(--f-corpo);font-weight:300;font-size:16px;
                      line-height:30px;color:var(--texto);margin:0}
.localizacao-accao{margin-top:.75rem !important}
.localizacao-accao a{color:var(--verde);text-decoration:underline;text-underline-offset:.2em}

@media (max-width:820px){
  .localizacao-mapa{height:420px}
  .localizacao-titulo{font-size:clamp(1.75rem,5vw,2.5rem);line-height:1.15}
  /* O CARTÃO DESCE PARA O FUNDO.

     Em ecrã largo ele ocupa 380px no canto e o marcador fica à direita, longe.
     Aqui passa a ocupar a largura toda — e a 16px do topo tapava o marcador por
     inteiro: media-se 100% da área dele coberta, a 820, 768, 390 e 360px. O
     mapa mostrava um cartão a dizer a morada e escondia justamente o sinal que
     aponta onde ela fica.

     Desce em vez de se mexer no marcador porque a posição do marcador é que tem
     significado — aponta para o edifício. A do cartão não: só não pode estorvar.
     No fundo sobram ~80px de folga até à ponta do marcador. */
  .localizacao-cartao{left:16px;right:16px;top:auto;bottom:16px;
                      width:auto;max-width:none;padding:18px}
  /* O mapa encolhe, o marcador acompanha. A 82px num mapa de 420px de altura
     passava a ler-se como um alfinete espetado em cima do cartão. */
  .localizacao-mapa > .localizacao-marcador{width:64px}
}
/* TABLET: o cartão não precisa da largura toda — 280px chegam para a morada e
   deixam o mapa respirar. No telemóvel fica a ocupar tudo, porque a 342px de
   mapa um cartão de 280 deixaria uma tira de 46px que não serve para nada.

   Continua EM BAIXO, e não no canto de cima como no desktop: aos 641px — o
   ponto mais estreito desta banda — um cartão de 280px acabaria em x=296 e o
   marcador começa em x=281. Voltava a tapá-lo, agora só de raspão, que é o
   género de defeito que passa nos testes e aparece num telemóvel qualquer. */
@media (min-width:640px) and (max-width:820px){
  .localizacao-cartao{right:auto;width:280px}
}
/* ENTRE O TABLET E OS 960px o cartão desce dos 380px do desenho para 300.

   Aqui ele ainda está no canto de cima, como no desktop, mas o mapa já encolheu
   e o marcador aproximou-se. Com os 380px medidos:

       821px → cartão acaba em 404, marcador começa em 376 → 28% tapado
       840px → 17% tapado
       860px → 6% tapado
       880px → deixa de tocar

   Ou seja, havia uma segunda janela onde o cartão comia o marcador — mais
   estreita e menos óbvia do que a do telemóvel, mas real. Com 300px o cartão
   acaba em 324 e sobram 52px de folga já a 821px, o ponto mais apertado.

   O `820.02` é o complemento exacto do `max-width:820px` da regra de tablet:
   com `821` ficava uma fresta entre os dois, onde larguras fraccionárias — as
   que aparecem com zoom do browser — não apanhavam regra nenhuma. */
@media (min-width:820.02px) and (max-width:960px){
  .localizacao-cartao{width:300px}
}

/* ── Envie-nos a sua mensagem (Figma node 104:302) ──────────────────────
   Cartão de 404×554 à esquerda, formulário à direita. */
.mensagem{padding-block:clamp(3rem,6vw,5rem)}
/* Metade para cada lado. Era 404px fixos (a medida do Figma), mas com o cartão a
   ocupar 50% a fotografia ganha espaço e o formulário deixa de ficar com uma
   coluna desproporcionada em ecrãs largos. */
/* `minmax(0,1fr)` e não `1fr`: com `1fr` a coluna nunca encolhe abaixo do
   conteúdo mais largo, e como o cartão pede 404px, num ecrã de 360px a coluna
   ficava com 404 e a secção transbordava a grelha para fora do ecrã. */
.mensagem-grelha{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);
                 gap:clamp(2rem,6vw,80px);align-items:start}

/* Cartão: a imagem leva um véu da cor do bloco. Sem véu, o texto branco fica
   refém do que a fotografia tiver por baixo — e a fotografia troca-se no CMS. */
/* O cartão tem 404×554 e fica CENTRADO na sua coluna de 50% — é isso que o
   `margin-inline:auto` faz. `max-width` e não `width`: abaixo dos 404px de coluna
   (telemóvel) uma largura fixa transbordaria a grelha. */
.mensagem-destaque{position:relative;width:404px;max-width:100%;height:554px;
                   margin-inline:auto;border-radius:var(--raio);
                   overflow:hidden;display:flex;align-items:center;
                   background:var(--verde);color:var(--branco)}
/* A fotografia é vertical e o cartão é mais largo do que alto: o recorte é na
   ALTURA. `object-position:center` mantém-no simétrico — tira o mesmo em cima e
   em baixo — e deixa o centro da cena, que é onde estão as pessoas, sempre visível. */
.mensagem-destaque img{position:absolute;inset:0;width:100%;height:100%;
                       object-fit:cover;object-position:center center}
/* Véu: #5E7975 a 85% de opacidade, sobreposição normal (o defeito do CSS —
   não é preciso declarar `mix-blend-mode`). É ele que garante o contraste do
   texto branco, seja qual for a fotografia que venha a ser escolhida no CMS. */
.mensagem-destaque::after{content:"";position:absolute;inset:0;background:var(--verde);opacity:.85}
.destaque--verde-escuro::after,.destaque--black::after{background:var(--verde-escuro)}
.destaque--areia::after,.destaque--blue::after{background:var(--areia);opacity:.8}
.destaque--branco::after{background:var(--branco);opacity:.8}
.destaque--areia,.destaque--branco{color:var(--verde)}
/* Medidas do Figma: título em Canela 250 a 40px/30px e texto em Poppins 300 a
   16px/30px, ambos centrados e a branco. A entrelinha de 30px num corpo de 40px
   (75%) é a mesma apertadela da cronologia — aguenta-se porque «Fale connosco.»
   cabe numa linha. */
.mensagem-destaque-txt{position:relative;z-index:1;padding:2.5rem;text-align:center}
.mensagem-destaque-txt h3{font-family:var(--f-titulo);font-weight:250;
                          font-size:40px;line-height:30px;margin:0 0 1.25rem;color:inherit}
.mensagem-destaque-txt div{font-family:var(--f-corpo);font-weight:300;
                           font-size:16px;line-height:30px;color:inherit}
.mensagem-destaque-txt p{margin:0 0 .5rem}
.mensagem-destaque-txt p:last-child{margin-bottom:0}

/* Coluna do formulário. O 1/6 de espaçamento à direita resolve contra a própria
   coluna, por isso acompanha a largura do ecrã em vez de ficar preso a pixéis —
   é a mesma regra da cronologia. */
.mensagem-form{padding-right:calc(100% / 6)}
.mensagem-form h2{font-family:var(--f-titulo);font-weight:250;color:var(--verde);
                  font-size:40px;line-height:30px;margin:0}
.mensagem-intro{font-family:var(--f-corpo);font-weight:300;font-size:16px;
                line-height:30px;color:var(--texto);margin-top:1.25rem}
.mensagem-intro p{margin:0}
/* Aviso de resultado do envio (sucesso ou resumo de erros). É o destino do
   scroll do kit.js depois de submeter — daí o `scroll-margin-top`, que também
   serve às ligações do resumo: sem ele o cabeçalho `position:sticky` tapava
   aquilo para onde acabámos de saltar. */
.mensagem-aviso{margin:1.5rem 0 0;padding:.75rem 1rem;border-radius:var(--raio);
                font-family:var(--f-corpo);font-weight:300;font-size:16px;line-height:26px;
                scroll-margin-top:160px}
.mensagem-aviso:focus{outline:none}
.mensagem-aviso:focus-visible{outline:2px solid var(--verde-claro);outline-offset:2px}
.mensagem-aviso--ok{background:rgba(var(--verde-rgb),.12);color:var(--verde)}
.mensagem-aviso--erro{background:rgba(179,38,30,.08);color:#B3261E;border-left:3px solid #B3261E}
.mensagem-aviso--erro p{margin:0}
.mensagem-aviso--erro ul{margin:.4rem 0 0;padding-left:1.15rem}
.mensagem-aviso--erro a{color:inherit}

/* Campos: linha simples por baixo, como no desenho. */
/* `scroll-margin-top` também nos CONTROLOS, não só no `.campo`: as ligações do
   resumo de erros apontam ao `id` do input, e é sobre o ALVO do salto que o
   browser aplica a margem. Nos controlos a folga é maior (140 da barra + a
   etiqueta que fica por cima), senão saltava-se para o campo com o «Nome» a
   desaparecer debaixo do cabeçalho. */
.mensagem-form .campo{scroll-margin-top:160px}
.mensagem-form input,.mensagem-form textarea{scroll-margin-top:200px}
.mensagem-form .campo{margin:1.75rem 0 0}
.mensagem-form label{display:block;font-family:var(--f-corpo);font-weight:300;
                     font-size:16px;line-height:30px;color:var(--texto)}
.mensagem-form input[type="text"],.mensagem-form input[type="email"],
.mensagem-form input[type="tel"],.mensagem-form textarea{
  width:100%;margin-top:.35rem;padding:.5rem 0;border:0;border-bottom:1px solid var(--linha);
  background:transparent;font:inherit;color:var(--texto)}
.mensagem-form textarea{border:1px solid var(--linha);border-radius:var(--raio);
                        padding:.75rem;resize:vertical;min-height:180px}
.mensagem-form input:focus-visible,.mensagem-form textarea:focus-visible{
  outline:2px solid var(--verde-claro);outline-offset:2px}
.mensagem-form .erro{display:block;margin-top:.35rem;font-size:.8rem;color:#B3261E}

.campo--consentimento label{display:flex;align-items:center;gap:20px;
                            font-size:.85rem;line-height:1.5}
/* A caixa em si é a mesma do popup — está definida uma só vez, junto ao
   `.pedido-aceite input`. Duas cópias divergiam ao primeiro retoque. */
.campo--consentimento a{color:var(--verde)}

.mensagem-accao{margin-top:2rem;text-align:right}

@media (max-width:1080px){
  .mensagem-grelha{grid-template-columns:minmax(0,1fr);gap:2.5rem}
  .mensagem-destaque{height:440px}
  /* Em coluna estreita o título quebra e 30px de entrelinha colidiriam. */
  .mensagem-destaque-txt h3{font-size:clamp(1.75rem,4vw,2.5rem);line-height:1.15}
  /* Em coluna estreita o título quebra e a entrelinha de 30px colidiria. E o 1/6
     à direita, com a coluna já a ocupar a largura toda, era espaço morto. */
  .mensagem-form{padding-right:0}
  /* Cabeçalho mais baixo em ecrã pequeno — menos folga a reservar. */
  .mensagem-aviso,.mensagem-form .campo{scroll-margin-top:110px}
  .mensagem-form input,.mensagem-form textarea{scroll-margin-top:150px}
  .mensagem-form h2{font-size:clamp(1.75rem,4vw,2.5rem);line-height:1.15}
  .mensagem-accao{text-align:left}
}

/* ── Contactos (Figma node 1051:812) ────────────────────────────────────
   Faixa clara de 506px com o título centrado e quatro colunas por baixo, na
   mesma grelha de 1272px do resto do site. */
/* Espaçamento assimétrico: 30px a menos em cima. O `--pad` existe para os dois
   lados continuarem ligados — mexer no valor base ajusta os dois de uma vez, e a
   diferença de 30px mantém-se seja qual for a largura do ecrã. */
.contactos-info{--pad:clamp(3rem,6vw,5rem);
                background:var(--areia);min-height:506px;
                display:flex;flex-direction:column;justify-content:center;
                /* 80px de topo, os mesmos que a cronologia da /a-clinica usa —
                   mas em `padding`, por decisão: a faixa areia sobe até às
                   migalhas e o espaço fica DENTRO dela, em vez de haver um vão
                   branco por cima. Substitui o `calc(var(--pad) - 30px)` que
                   aqui estava; o `--pad` continua a mandar no espaçamento de
                   baixo. */
                padding-top:80px;padding-bottom:var(--pad)}
/* Medidas do Figma. Reparar na inversão de cores em relação ao resto do site:
   aqui o TÍTULO é #465756 (a cor de corpo) e os textos das colunas é que são o
   verde da marca — ao contrário da cronologia, onde é o título que leva o verde. */
.contactos-titulo{font-family:var(--f-titulo);font-weight:300;color:var(--texto);
                  font-size:40px;line-height:30px;text-align:center;margin:0}
.contactos-apoio{text-align:center;color:var(--texto);margin:1rem 0 0;
                 font-size:1rem;line-height:30px}
.contactos-colunas{display:grid;grid-template-columns:repeat(4,1fr);gap:2rem;
                   margin-top:clamp(2.5rem,5vw,4.5rem)}
.contactos-colunas h3{font-family:var(--f-titulo);font-weight:300;color:var(--verde);
                      font-size:24px;line-height:normal;margin:0}
/* 30px entre o rótulo e o valor, e SÓ quando há rótulo — o selector de irmão
   adjacente garante que uma coluna sem título não começa com um vazio de 30px.
   A margem fica no valor e o `h3` fica a zero: com margens dos dois lados, o
   resultado dependia do colapso entre elas e mudava sem se perceber porquê. */
.contactos-colunas h3 + .contactos-valor,
.contactos-colunas h3 + p{margin-top:30px}
.contactos-colunas p,.contactos-valor{font-family:var(--f-corpo);font-weight:300;
                                      font-size:16px;line-height:normal;color:var(--verde);margin:0}
/* O texto pode vir de um editor rico: parágrafos, listas e ligações. */
.contactos-valor p{margin:0 0 .5rem}
.contactos-valor p:last-child{margin-bottom:0}
.contactos-valor ul,.contactos-valor ol{margin:0 0 .5rem;padding-left:1.15rem}
.contactos-valor ul{list-style:disc}
.contactos-valor a{color:inherit;text-decoration:underline;text-underline-offset:.2em}
/* Os telefones e o e-mail são ligações (`tel:` / `mailto:`) mas NÃO se sublinham
   em repouso: no desenho são texto corrido, e sublinhar três linhas seguidas de
   contactos enche a coluna de riscos. O sublinhado aparece no rato e no foco,
   que é onde serve para alguma coisa.

   A regra é por `href` e não por classe de propósito: apanha o que a secção gera
   a partir das Definições e deixa em paz as ligações que alguém escreva à mão no
   editor — essas continuam sublinhadas, como qualquer ligação num texto. */
.contactos-valor a[href^="tel:"],
.contactos-valor a[href^="mailto:"]{text-decoration:none}
.contactos-valor a[href^="tel:"]:hover,
.contactos-valor a[href^="mailto:"]:hover,
.contactos-valor a[href^="tel:"]:focus-visible,
.contactos-valor a[href^="mailto:"]:focus-visible{text-decoration:underline}
.contactos-valor strong{font-weight:500}
/* Nota de tarifário por baixo de cada número. É um BLOCO de propósito: em texto
   corrido separado por `<br>` não há elemento a que dar margem, e era esse o
   pedido. A quebra de linha passa a vir do próprio bloco, o que dispensa o `<br>`
   que ali estava. */
.contactos-valor .contactos-nota{display:block;margin-top:10px}

@media (max-width:900px){
  .contactos-info{min-height:0}
  .contactos-colunas{grid-template-columns:repeat(2,1fr);gap:2.5rem 2rem}
  /* A entrelinha de 30px num corpo de 40px (75%) só se aguenta em título de uma
     linha. Abaixo dos 900px este quebra quase sempre, e as linhas colidiriam. */
  .contactos-titulo{font-size:clamp(1.75rem,4vw,2.5rem);line-height:1.15}
}
@media (max-width:560px){
  .contactos-colunas{grid-template-columns:1fr}
  /* Num ecrã estreito o título quebra em três ou quatro linhas, e centrado fica
     com as pontas a dançar. À esquerda alinha com as colunas por baixo, que aqui
     passam a uma só.

     Vai NESTE bloco e não num novo: uma media query a 560px escrita antes da de
     900px perdia para ela — as duas aplicam-se abaixo dos 560, a especificidade
     é igual e ganha a última do ficheiro. */
  .contactos-titulo,
  .contactos-apoio{text-align:left}
}

/* ── Imagem e Texto (Figma: Component 14, node 1032:627) ────────────────
   Dois painéis lado a lado, cada um com metade da faixa: a fotografia num, um
   bloco de cor sólida com o texto no outro. NÃO é texto por cima da foto — o
   corte do desenho está exactamente a meio.

   O texto vai de 58.27% a 84.94% da largura TOTAL; dentro do painel (que começa
   aos 50%) isso são 16.54% de espaçamento à esquerda e 30.12% à direita. Ficam
   escritos em percentagem para acompanharem a largura do ecrã. */
/* 585px de altura, fixos (mínimo e máximo). ⚠️ Com tecto, um título mais comprido
   — ou traduzido para uma língua mais extensa — deixa de empurrar a caixa: passa a
   transbordar. Daí o `overflow:hidden`, para o texto a mais ser cortado em vez de
   ir por cima da secção seguinte. O tecto só vale no ecrã grande; abaixo dos
   1080px a faixa volta a crescer, senão em ecrãs estreitos cortava sempre. */
.imgtxt-faixa{display:grid;grid-template-columns:1fr 1fr;grid-template-rows:585px;
              min-height:585px;max-height:585px;overflow:hidden;
              color:var(--branco)}
/* A fotografia ocupa a metade toda — largura e altura. O que sobra da proporção
   é recortado, e o `object-position:center` faz esse recorte simétrico: tira o
   mesmo de cima e de baixo (ou de cada lado), que é o que mantém a cena centrada.

   ⚠️ O `grid-template-rows:585px` lá em cima é o que faz este `height:100%`
   significar alguma coisa. Sem ele a linha da grelha não tinha altura definida:
   pegava na altura NATURAL da fotografia — num ecrã de 2560px a metade tem
   1280px de largura, o que dá 955px de altura — o `height:100%` resolvia para
   esses 955, o `object-fit:cover` ficava sem nada para recortar, e o
   `max-height` da faixa cortava os 370px que sobravam PELO FUNDO. Num retrato
   isso queria dizer ver a cabeça e mais nada. O `min/max-height` não chegava:
   limita a caixa, não a linha; a linha tem de ser dita. */
.imgtxt-foto{width:100%;height:100%;object-fit:cover;object-position:center center;
             align-self:stretch;display:block;grid-column:1;grid-row:1}
/* 20px em cima e em baixo, e mais nada: o texto é centrado na vertical pelo
   `justify-content:center`. O espaçamento serve só de folga mínima para quando o
   texto for comprido ao ponto de encostar aos bordos — não é ele que posiciona. */
.imgtxt-conteudo{grid-column:2;grid-row:1;
                 /* Altura da faixa, com o mesmo tecto dela (585px). O
                    `justify-content:center` abaixo é que centra o texto lá dentro —
                    o painel enche a altura, o texto fica a meio.
                    O tecto aqui é o que impede o painel de ser o responsável por
                    esticar a faixa: sem ele, um texto muito comprido empurrava-o
                    para lá dos 585px e o `overflow:hidden` da faixa cortava-o. */
                 align-self:stretch;height:100%;max-height:585px;overflow:hidden;
                 display:flex;flex-direction:column;justify-content:center;
                 padding:20px 30.12% 20px 16.54%}

/* Imagem à direita: troca as colunas e espelha o espaçamento do texto. */
.imagem-direita .imgtxt-foto{grid-column:2}
.imagem-direita .imgtxt-conteudo{grid-column:1;padding:20px 16.54% 20px 30.12%}

/* Sem fotografia o painel de texto ocupa a faixa toda, em vez de deixar meia
   faixa vazia — a faixa não desaparece só por lhe faltar a imagem. */
.imgtxt-faixa.sem-imagem{grid-template-columns:1fr}
.imgtxt-faixa.sem-imagem .imgtxt-conteudo{grid-column:1;padding-inline:16.54%}

.imgtxt-titulo{font-family:var(--f-titulo);font-weight:250;color:var(--branco);
               font-size:40px;line-height:44px;margin:0}
.imgtxt-texto{font-family:var(--f-corpo);font-weight:300;font-size:16px;
              line-height:30px;color:var(--branco);margin-top:1.25rem}
.imgtxt-texto p{margin:0 0 .75rem}
.imgtxt-texto p:last-child{margin-bottom:0}
.imgtxt-texto ul,.imgtxt-texto ol{margin:0 0 .75rem;padding-left:1.25rem}
.imgtxt-texto ul{list-style:disc}
.imgtxt-texto ol{list-style:decimal}
.imgtxt-texto a{color:inherit;text-decoration:underline;text-underline-offset:.2em}
.imgtxt-texto strong{font-weight:500}

/* Cor do painel de texto. Branco sobre o verde da marca dá 4.70:1 — acima dos
   4.5:1 que a WCAG pede mesmo para texto normal, por isso não é preciso véu
   nenhum. Nas cores claras o texto passa a verde, senão desaparecia. */
/* A cor vai à FAIXA e não só ao painel de texto: como a foto é centrada e não
   preenche a altura toda, a folga que sobra de cada lado dela tem de ter a cor da
   secção. Sem isto apareciam duas tiras brancas a cortá-la. */
.imgtxt-faixa,.imgtxt-conteudo{background:var(--verde)}
.imgtxt-faixa--verde-escuro,.imgtxt-faixa--verde-escuro .imgtxt-conteudo,
.imgtxt-faixa--black,.imgtxt-faixa--black .imgtxt-conteudo{background:var(--verde-escuro)}
.imgtxt-faixa--branco,.imgtxt-faixa--branco .imgtxt-conteudo{background:var(--branco)}
.imgtxt-faixa--areia,.imgtxt-faixa--areia .imgtxt-conteudo,
.imgtxt-faixa--blue,.imgtxt-faixa--blue .imgtxt-conteudo{background:var(--areia)}
.imgtxt-faixa--branco .imgtxt-titulo,.imgtxt-faixa--branco .imgtxt-texto,
.imgtxt-faixa--areia .imgtxt-titulo,.imgtxt-faixa--areia .imgtxt-texto{color:var(--verde)}

@media (max-width:1080px){
  /* A altura da secção passa a ser a da FOTOGRAFIA: sem `min-height`, a linha da
     grelha fica com a altura do conteúdo mais alto, e como o texto é curto quem
     manda é a imagem à sua proporção natural. Um valor fixo (tinha 420px) ou
     sobrava por baixo da foto ou cortava-a, conforme a largura do ecrã. */
  .imgtxt-faixa{min-height:0;max-height:none;overflow:visible;grid-template-rows:auto}
  /* À proporção natural, a fotografia é mais baixa do que o painel de texto.
     `align-self:center` reparte a folga pelos dois lados — sem ele o resultado
     dependia do motor: o Chromium esticava a imagem (e recortava-a sem ninguém
     pedir), outros encostavam-na ao topo e deixavam o vazio todo em baixo. */
  .imgtxt-foto{height:auto;align-self:center}
  /* 30px em cima, 90px em baixo, a partir daqui e para baixo. Sem tecto de
     altura, tal como a faixa: aí ela cresce com o conteúdo. Nota: enquanto o
     painel ainda está esticado e o texto centrado (1080–821px), um espaçamento
     assimétrico desloca esse centro — o texto sobe 30px. */
  .imgtxt-conteudo,.imagem-direita .imgtxt-conteudo{
    padding:30px clamp(1.5rem,5vw,3rem) 90px;max-height:none;overflow:visible}
  .imgtxt-titulo{font-size:clamp(1.6rem,3.2vw,2.5rem);line-height:1.15}
}

@media (max-width:820px){
  /* Empilha: metade da largura num telemóvel não chega nem para a foto nem para
     o texto. A foto vai sempre para cima, seja qual for o lado escolhido. */
  .imgtxt-faixa,.imgtxt-faixa.sem-imagem{grid-template-columns:1fr;min-height:0;max-height:none}
  /* Empilhado, a foto fica à sua proporção natural — sem `aspect-ratio` imposto,
     que recortava a imagem sem necessidade nenhuma. */
  .imgtxt-foto,.imagem-direita .imgtxt-foto{grid-column:1;grid-row:1;height:auto}
  /* 30px em cima, 60px em baixo. Empilhado, o painel deixa de ter altura sobrando
     para centrar o texto — passa a ser o espaçamento a dar-lhe o ar. O dobro em
     baixo separa a secção do que vem a seguir; em cima chega menos, porque a
     fotografia já está logo acima. */
  .imgtxt-conteudo,.imagem-direita .imgtxt-conteudo,
  .imgtxt-faixa.sem-imagem .imgtxt-conteudo{
    grid-column:1;grid-row:2;padding:30px 1.5rem 90px;
    /* Altura pelo conteúdo: empilhado não há altura de referência para esticar,
       e é o espaçamento que dá a medida da caixa. */
    height:auto;align-self:start}
}

/* Abaixo dos 640px o espaçamento inferior volta aos 30px, igual ao de cima: num
   ecrã destes, 90px são um vazio grande de mais entre o texto e o que vem a
   seguir — a escala do ecrã muda, a proporção do respiro tem de mudar com ela. */
@media (max-width:640px){
  .imgtxt-conteudo,.imagem-direita .imgtxt-conteudo,
  .imgtxt-faixa.sem-imagem .imgtxt-conteudo{padding-bottom:30px}
}


/* ── Secção genérica do tema (recurso p/ tipos sem view própria) ────────── */
.sec--generica h2{font-family:var(--f-titulo);font-weight:300;color:var(--verde);
                  font-size:clamp(1.6rem,3vw,2.25rem);margin:0 0 1rem}
.sec--generica h3{font-family:var(--f-titulo);font-weight:300;color:var(--verde);
                  font-size:clamp(1.15rem,2vw,1.35rem);margin:0 0 .75rem}
.sec--generica .sobretitulo{font-size:.8rem;letter-spacing:.12em;text-transform:uppercase;
                            color:var(--verde-claro);margin:0 0 .75rem}
/* Largura toda: o limite de 70ch é bom para prosa curta, mas esta é a secção
   onde entram os textos legais e o do PRR, que vêm com listas e parágrafos
   longos — cortá-los a meio da caixa deixava metade da página vazia. */
.sec--generica .corpo{max-width:none;width:100%;margin-top:40px;margin-bottom:1.5rem}
/* Primeiro elemento da secção: sem espaço em cima. O espaçamento da própria .sec
   já afasta do que vem antes; somar-lhe os 40px abria uma folga a mais no topo. */
.sec--generica .corpo:first-child{margin-top:0}
/* Tipografia do texto rico do CMS. Escala com a janela pela mesma regra do resto
   do tema (clamp mínimo/vw/máximo) — 16px/30px em ecrã largo, a descer até 14px
   sem saltos de breakpoint. Os títulos escritos DENTRO do editor apanham aqui a
   família e a cor: um h4 ou h5 saía fora da marca, porque só h2 e h3 tinham regra. */
.sec--generica .corpo{font-size:clamp(.875rem,1.2vw,1rem);line-height:1.875}
.sec--generica .corpo :where(h2,h3,h4,h5){font-family:var(--f-titulo);font-weight:300;
                                          color:var(--verde);line-height:1.2}
.sec--generica .corpo h4{font-size:clamp(1rem,1.6vw,1.15rem);margin:0 0 .6rem}
.sec--generica .corpo h5{font-size:clamp(.95rem,1.4vw,1.05rem);margin:0 0 .5rem}
.sec--generica figure{margin:1.5rem 0}
.sec--generica figure img{border-radius:var(--raio)}
.cartoes{display:grid;gap:1.5rem;grid-template-columns:repeat(auto-fit,minmax(280px,1fr));
         margin-top:2rem}
.cartoes img{width:100%;aspect-ratio:404/296;object-fit:cover;border-radius:var(--raio);
             margin-bottom:1rem}
.cartoes h3{font-family:var(--f-titulo);font-weight:300;color:var(--verde);
            font-size:1.25rem;margin:0 0 .5rem}
.cartoes p{margin:0;color:var(--cinza)}

/* Peças do cartão que faltavam. A view lia campos que o CMS não escreve, por isso
   o rótulo, o texto rico e o botão nunca chegaram a existir no marcado — e sem
   marcado ninguém dá pela falta do estilo. */
.cartoes .cartao-rotulo{margin:0 0 .25rem;color:var(--verde);font-family:var(--f-corpo);
                        font-size:.75rem;font-weight:500;letter-spacing:.08em;text-transform:uppercase}
.cartoes .cartao-texto{color:var(--texto);font-family:var(--f-corpo);font-weight:300;
                       font-size:16px;line-height:30px}
.cartoes .cartao-texto p{margin:0 0 .75rem;color:inherit}
.cartoes .cartao-texto p:last-child{margin-bottom:0}
.cartoes .cartao-accao{margin:1rem 0 0}

/* ── Vídeo da secção livre ────────────────────────────────────────────────
   `aspect-ratio` e não altura fixa: o 16:9 mantém-se em qualquer largura e não
   há o salto de layout que aparece quando o vídeo carrega e traz a sua altura. */
.video-caixa{position:relative;margin:1.5rem 0 0;aspect-ratio:16/9;
             background:rgba(var(--verde-rgb),.08);border-radius:var(--raio);overflow:hidden}
.video-caixa iframe,.video-caixa video{position:absolute;inset:0;
                                       width:100%;height:100%;border:0;display:block}
.video-caixa video{object-fit:cover;background:#000}

/* ── Estatística ──────────────────────────────────────────────────────────
   Valor grande na fonte de título, legenda por baixo. `display:block` no valor
   para a legenda cair para a linha seguinte sem precisar de um <br> no marcado. */
.estatistica{margin:1.5rem 0 0;color:var(--verde)}
.estatistica-valor{display:block;font-family:var(--f-titulo);font-weight:250;
                   font-size:clamp(2.5rem,6vw,64px);line-height:1.05}
.estatistica-texto{display:block;margin-top:.35rem;color:var(--texto);
                   font-family:var(--f-corpo);font-weight:300;font-size:16px;line-height:30px}
.sec--generica.e-escura .estatistica,
.sec--generica.e-escura .estatistica-texto{color:var(--branco)}

/* ── Página sem conteúdo (variante mínima, sem banner) ─────────────────── */
.sec--vazia{min-height:60vh;display:flex;align-items:center;text-align:center}
.sec--vazia h1{font-size:clamp(2rem,5vw,3.25rem)}
.sec--vazia p{color:var(--cinza);margin-top:1rem}

/* ── Rodapé (Figma node 1019:222 — 1520×594) ────────────────────────────
   A barra «Pedido de consulta» sobrepõe o topo do bloco verde: metade fica
   acima dele. Daí a margem negativa e o respiro equivalente no <footer>. */
/* A barra fica a cavalo no topo do rodapé: metade acima do verde, metade dentro.
   O `padding-top` não é decorativo — sem ele a margem negativa da barra COLAPSA
   através do <footer> (que não teria padding nem borda no topo) e, em vez de
   subir a barra, subia o rodapé inteiro: o resultado era a barra encostada ao
   topo do verde, sem sobreposição nenhuma. Com padding, a margem fica contida. */
.rodape{--barra:69px;
        position:relative;background:var(--verde);color:var(--branco);
        /* Sem margem no topo: a metade de fora da barra «Pedido de consulta»
           passa a assentar na secção ANTERIOR, em vez de numa tira branca entre
           as duas. Era essa tira que se via por baixo da faixa de imagem. */
        margin-top:0;padding-top:calc(var(--barra) / 2);
        font-family:var(--f-corpo);font-weight:300}
.consulta-faixa{margin-top:calc(var(--barra) * -1)}
.rodape a{color:inherit;text-decoration:none}
.rodape a:hover{text-decoration:underline}
.rodape h3{font-family:var(--f-titulo);font-weight:300;font-size:1.5rem;line-height:30px;
           margin-bottom:.35rem}

/* 1. Barra «Pedido de consulta» */
.consulta{display:flex;align-items:center;justify-content:center;gap:1rem;
          min-height:var(--barra);padding:.75rem 1.5rem;
          background:#D9D9D9;border-radius:45px}
.consulta-txt{margin:0;font-family:var(--f-titulo);font-weight:300;
              font-size:1.25rem;line-height:30px;color:var(--verde)}
.consulta-accoes{display:flex;align-items:center;gap:.5rem}
.consulta-accoes a{display:grid;place-items:center;width:44px;height:44px;
                   background:var(--verde);color:var(--branco);border-radius:50%;
                   transition:background .2s}
.consulta-accoes a:hover{background:var(--verde-escuro);text-decoration:none}

/* 2. Logótipo + redes, com o traço por baixo */
/* 30px de espaçamento interno em cima e em baixo. Como o traço é o `border-bottom`
   deste elemento, os 30px de baixo ficam ENTRE o logótipo e o traço; do traço até
   às colunas o ar vem do `padding-top` do .rodape-cols. */
.rodape-topo{display:flex;align-items:center;justify-content:space-between;gap:2rem;
             margin:0;padding:30px 0;border-bottom:1px solid rgba(255,255,255,.35)}
/* O ficheiro do logótipo já vem recortado (sem a folga transparente que trazia do
   Figma), por isso a caixa da imagem É a marca e alinha sozinha com a grelha —
   sem margem negativa a compensar. 68px é a altura da marca dentro da caixa de
   119px do desenho (node 980:593). */
.rodape-topo .marca img{max-height:68px}
/* Sem intervalo entre os <li>: o espaço vem da própria caixa de cada ícone.
   A caixa de 44px não é decorativa — é o mínimo tocável recomendado, e o ícone
   tem 32px, que sozinho fica abaixo desse limite. Com gap 0 sobram 12px entre as
   formas dos ícones e as áreas de toque ficam encostadas, sem folga morta. */
.redes{display:flex;gap:0}
.redes a{display:grid;place-items:center;width:44px;height:44px}
.redes a:hover{opacity:.75}

/* 3. Colunas de contacto */
/* `margin` e não `padding`: o espaçamento é entre a grelha e o que está à volta
   (o traço por cima, a faixa dos selos por baixo), não folga interior. Com
   `padding` o fundo da secção continuava a pintar por baixo dele — aqui não se
   nota, mas é a diferença que faz a regra ser previsível se um dia a faixa
   ganhar cor própria. */
.rodape-cols{display:grid;grid-template-columns:repeat(4,1fr);gap:2rem;
             margin:40px 0 10px;padding:0}
.rodape-cols p{margin:0;font-size:1rem;line-height:30px}
.rodape-cols .nota{font-size:.75rem;line-height:1.4;opacity:.85}
/* Nome PRÓPRIO e não `.espaco`: essa classe passou a ser a secção «Um espaço
   pensado para si» da homepage, com 120px de padding e texto centrado — e como
   o selector é só um espaçador, apanhava-a aqui dentro sem ninguém dar por isso. */
.rodape-cols .espacofooter{margin-top:1.25rem}
/* Números de telefone em destaque — no rodapé e na secção Contactos.

   `500` e não `700`: do Poppins só estão instalados os pesos 300, 400 e
   500 (ver fonts/). Pedir 700 não traz um ficheiro mais pesado — faz o
   browser desenhar um falso negrito por cima do 500, que sai borratado.
   Sobre o corpo a 300, o 500 já é um salto bem visível.

   Só o PRIMEIRO número: é o contacto principal, e destacar os dois é não
   destacar nenhum.

   No rodapé, o 2.º número vive num `<p class="espacofooter">` — a negação por
   essa classe chega para o distinguir, sem precisar de marcar o primeiro com
   uma classe nova só para isto. Apanha-se pelo `href` e não por uma classe de
   ligação: os números são os únicos `tel:` da coluna, e o email ao lado fica de
   fora sem excepção nenhuma.

   Nos Contactos não é preciso regra: o `.contactos-valor strong` já existia no
   tema, e o que faltava era o <strong> no marcado — está na view, e só envolve
   o primeiro número. */
.rodape-cols p:not(.espacofooter) > a[href^="tel:"]{font-weight:500}

/* 4. Faixa legal — largura total, fundo ligeiramente mais claro que o verde */
/* ── Selos institucionais (Figma 1165:315) ───────────────────────────────────
   Livro de Reclamações e barra PRR na MESMA linha, dentro do verde e logo acima
   da faixa legal: um encostado ao início do wrap, o outro ao fim. No desenho
   estão os dois a y=436, e a barra termina em 1393 — o fim exacto do wrap.

   Faixa própria e não uma quinta coluna da grelha de contactos: são de outra
   natureza, e presos à grelha mudavam de sítio sempre que uma coluna ficasse
   vazia. `space-between` com um só selo encosta-o à esquerda, que é o que se
   quer quando o outro não existe. */
/* GRELHA de três colunas `1fr auto 1fr`, e não `space-between` como antes.
   Os links legais entraram no meio desta faixa (Figma node 1317:451, x=629,
   largura 254 — centro em 756, que é o centro exacto da página). Com
   `space-between`, o item do meio fica a meio do ESPAÇO QUE SOBRA, e como os
   selos têm larguras diferentes (107 contra 296) isso punha-o em 541 — 95px à
   esquerda de onde devia estar. Com `1fr auto 1fr` as duas colunas laterais são
   iguais por construção e o meio cai no centro, haja ou não selos. */
.rodape-selos{display:grid;grid-template-columns:1fr auto 1fr;align-items:center;
              gap:1.5rem 2rem;margin:10px 0 25px;padding:0}
/* Coluna FIXA para cada um: sem isto, um selo em falta promovia o seguinte à
   coluna vazia — com só o Livro e os links, os links saltavam para a direita. */
.rodape-selos > .selo-livro{grid-column:1;justify-self:start}
.rodape-selos > .legais    {grid-column:2;justify-self:center}
.rodape-selos > .selo-prr  {grid-column:3;justify-self:end}
.rodape-selos p{margin:0}
/* Escopado aos SELOS. Era `.rodape-selos a`, que agora apanhava também os links
   legais e lhes tirava o sublinhado do hover — a única pista de que são links. */
.selo-livro,.selo-prr a{display:inline-block}
.selo-livro:hover,.selo-prr a:hover{opacity:.8;text-decoration:none}
.selo-livro img{width:107px;height:auto}
/* 296px é a medida do desenho; o TECTO de 300px é o limite pedido. O
   `min(100%,300px)` faz as duas coisas ao mesmo tempo: nunca passa dos 300px
   e nunca transborda uma coluna mais estreita do que isso. */
.selo-prr img{width:296px;max-width:min(100%,300px);height:auto}

/* Links legais — vieram da faixa legal para aqui. 12px do desenho. */
.rodape-selos .legais{display:flex;flex-wrap:wrap;align-items:center;
                      justify-content:center;gap:.25rem .75rem;
                      list-style:none;margin:0;padding:0;
                      font-size:.75rem;line-height:1.5}
.rodape-selos .legais li + li::before{content:"|";opacity:.5;margin-right:.75rem}

/* ── Faixa legal ─────────────────────────────────────────────────────────────
   Três grupos numa linha: direitos à esquerda, dados de registo a seguir e os
   links legais à direita. Larguras `auto 1fr auto` e não colunas iguais — a
   linha do meio é a mais longa e tem de ser ela a levar o espaço que sobra. */
.rodape-legal{background:rgba(217,217,217,.1)}
.rodape-legal-in{display:grid;grid-template-columns:auto 1fr auto;
                 gap:1.5rem 50px;align-items:center;padding:1.75rem 0;
                 font-size:.75rem;line-height:1.5}
.rodape-legal-in p{margin:0;text-wrap:pretty}   /* evita a última linha com uma só palavra */

/* Assinatura da agência, à direita (Figma node 1019:220, alinhado a 1391 — o fim
   do wrap). Ocupa a coluna que os links legais deixaram.
   O sublinhado do «LKCOM» não se escreve aqui: `.rodape a` já lhe dá
   `text-decoration:none` e o sublinhado no hover. */
.rodape-assinatura{justify-self:end;text-align:right;white-space:nowrap}

@media (max-width:1100px){
  .rodape-cols{grid-template-columns:repeat(2,1fr);gap:2.5rem 2rem}
  /* Os três grupos não cabem lado a lado: empilham, todos à esquerda. */
  .rodape-legal-in{grid-template-columns:1fr;gap:1.25rem}
  .rodape-assinatura{justify-self:start;text-align:left}

  /* Os selos e os links legais também não cabem em três colunas: empilham, todos
     encostados ao início. Uma coluna só — as regras `grid-column` de cima ficam
     sem efeito porque a grelha passa a ter uma coluna. */
  .rodape-selos{grid-template-columns:1fr;justify-items:start;gap:15px}
  .rodape-selos > .selo-livro,
  .rodape-selos > .legais,
  .rodape-selos > .selo-prr{grid-column:1;justify-self:start}
  .rodape-selos .legais{justify-content:flex-start;gap:.25rem}
  /* Intervalo apertado à volta do «|»: de .75rem para .25rem de cada lado.
     Os dois rótulos medem 136,3 + 120,3 = 256,6px a 12px; num ecrã de 320px a
     coluna tem 272px, e os 24px de intervalo mais o traço punham a lista em
     283,8px — partia em duas linhas. Com .25rem fica em 267,8px e cabe.
     A folga é de 4px: um rótulo mais comprido vindo do CMS volta a partir. */
  .rodape-selos .legais li + li::before{margin-right:.25rem}
}
/* A barra PRR já NÃO estica com o ecrã. Tinha uma regra a pô-la a `width:100%`
   abaixo dos 500px — vinha de quando ela dividia a linha com o Livro de
   Reclamações e ficava espremida. Desde que os selos passaram a empilhar (ver o
   @media dos 1100px), cada um tem a sua linha e esticar só a fazia crescer acima
   dos 296px do desenho: a 390px chegava aos 342px. O tecto está agora na regra
   base, com `max-width:min(100%,300px)`. */
@media (max-width:640px){
  /* A barra fica MEIA FORA do rodapé, como em todas as outras larguras, e EM
     LINHA — sem empilhar. Duas excepções que existiam aqui saíram as duas.

     A que a punha inteira dentro do rodapé justificava-se com «empilhada passa
     dos 140px». Medida, dava 126px — não era o número escrito, e era esse número
     que sustentava a excepção.

     Em linha, o que não cabe abaixo dos ~430px é o RÓTULO a 20px: precisa de
     169px e sobram-lhe 130. Em vez de empilhar a barra inteira, encolhe-se o
     rótulo para 16px e apertam-se o espaçamento interno e o intervalo. Assim a
     barra mantém a altura de 69px do desenho e a sobreposição continua a sair
     do `--barra`, sem valor novo nenhum.

     Medido dos 320px aos 1512px: nenhuma largura provoca barra horizontal.
     Dos 390px para cima o rótulo cabe numa linha e a divisão é 34,5/34,5 exacta;
     abaixo disso passa a duas linhas, a barra vai aos 72px e a divisão fica
     34,5/37,5 — 1,5px de desvio, que não se vê.

     `border-radius:34px` e não os 45px do desktop: 34 é metade da altura, ou
     seja o valor a partir do qual a caixa deixa de ser mais redonda do que alta. */
  .consulta{gap:.75rem;padding:.75rem 1rem;border-radius:34px}
  .consulta-txt{font-size:1rem;line-height:24px;text-align:center}
  /* Mantém as duas colunas no telemóvel: logótipo à esquerda, redes à direita.
     Empilhados, ocupavam duas linhas para pouco conteúdo e afastavam o rodapé.
     A 360px a conta fecha — logótipo ~130px + dois ícones de 44px = ~218px numa
     grelha de 312px — mas o `flex-wrap` fica como rede: se um logótipo mais largo
     for carregado no CMS, as redes passam para baixo em vez de transbordarem. */
  .rodape-topo{flex-direction:row;align-items:center;flex-wrap:wrap;gap:1rem}
  .rodape-cols,.rodape-legal-in{grid-template-columns:1fr}
}

/* ── Slider da homepage (Figma 322:404) ─────────────────────────────────────
   740px de altura, como no desenho. A MESMA medida está em `.cab--sobre
   .cab-in`, que é o que pousa a navegação no fundo do herói: mexer numa sem a
   outra desalinha o menu. O mesmo vale para os 60vh do telemóvel. */
/* Altura do herói — UM valor, usado em três sítios.
   Antes o 740px estava escrito à mão no slider e outra vez em `.cab--sobre
   .cab-in` (que é o que pousa a navegação no fundo do herói). Duas cópias da
   mesma medida é uma delas por actualizar mais cedo ou mais tarde, e o sintoma
   seria o menu a flutuar a meio da fotografia.

   `min(740px, …)`: o desenho pede 740, mas o botão de descer tem de caber no
   primeiro ecrã. Num portátil de 800px de altura, 740 + 130 do botão passavam
   da dobra e o botão que convida a descer só se via… descendo.

   `svh` e não `vh`: no telemóvel o `vh` conta com a barra do browser que
   desaparece ao rolar, e o cálculo dava sempre a mais. A linha com `vh` fica por
   baixo como recurso para quem ainda não saiba `svh`. */
:root{
  /* 40px é a medida do desenho em ecrã largo; encolhe com a janela, como o resto
     do tema. Num telemóvel 80px só de folga à volta de um botão de 50px era um
     terço do primeiro ecrã gasto em espaço vazio. */
  --descer-pad: clamp(16px, 3vw, 40px);
  --descer-altura: calc(var(--descer-pad) * 2 + 50px);

  /* Altura da BARRA BRANCA do cabeçalho — a das páginas interiores, e a que a
     home ganha quando prende no topo. Serve duas contas diferentes:
       `--cab-presa`  quanto é que ela tapa (é fixa/sticky, fica POR CIMA);
       `--cab-barra`  quanto é que ela ROUBA ao primeiro ecrã (só quando está no
                      fluxo, ou seja abaixo dos 1080px — em ecrã largo a home
                      tem-na por cima do herói e não lhe rouba nada). */
  --cab-presa: 140px;
  --cab-barra: 0px;

  /* Três limites, por esta ordem de leitura:
       máximo 740px          — a medida do desenho;
       100svh − botão − barra — para o botão de descer caber no primeiro ecrã;
       mínimo 460px          — o herói nunca encolhe abaixo disto.

     O mínimo GANHA aos outros dois: numa janela baixa (um telemóvel deitado, uma
     janela de portátil encolhida) o botão passa a ficar abaixo da dobra. É uma
     troca deliberada — mais vale pedir um scroll do que servir um herói onde o
     título não cabe. */
  --heroi-altura: max(460px, min(740px, calc(100vh - var(--descer-altura) - var(--cab-barra))));
  --heroi-altura: max(460px, min(740px, calc(100svh - var(--descer-altura) - var(--cab-barra))));
}

.slider{position:relative;display:grid;height:var(--heroi-altura);max-height:740px;
        overflow:hidden;background:var(--verde) center/cover no-repeat;color:var(--branco)}
/* Empilhamento em grelha e não por posição absoluta: a secção fica com a altura
   do slide mais alto em vez de depender só de uma altura fixa. */
.slider-palco{grid-area:1/1;display:grid}
.slider-slide{grid-area:1/1;position:relative;display:flex;align-items:center;isolation:isolate;
              opacity:0;visibility:hidden;transition:opacity .8s ease,visibility .8s}
.slider-slide.e-activo{opacity:1;visibility:visible}
.slider-media{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;z-index:0}

/* TRÊS véus, pela ordem do desenho — de baixo para cima:
     1) verde em `hue`  — rouba a cor à fotografia e deixa-lhe só a luz;
     2) verde a 80%     — é o que dá a chapa da marca;
     3) gradiente a 50% — aclara a direita.
   São três camadas e só há dois pseudo-elementos, por isso a terceira é um
   elemento (`.slider-veu`) no marcado.

   `isolation:isolate` no slide é o que prende o `mix-blend-mode` à fotografia:
   sem isso o modo `hue` ia buscar o que estivesse por baixo da secção, e o
   resultado mudava conforme o que viesse a seguir na página.

   A opacidade fica FORA do gradiente (e não em rgba nas paradas) para os valores
   virem do desenho tal e qual. */
.slider-slide::before,.slider-slide::after{content:""}
.slider-slide::before,.slider-slide::after,.slider-veu{position:absolute;inset:0;pointer-events:none}

.slider-slide::before{z-index:1;background:var(--verde,#5E7975);mix-blend-mode:hue}
.slider-slide::after {z-index:2;background:var(--verde,#5E7975);opacity:.8}
.slider-veu          {z-index:3;opacity:.5;
                      background:linear-gradient(270deg,var(--verde,#5E7975) 5.94%,#98BDBB 91.34%)}

/* O `.wrap` é que está centrado (é ele que dá a coluna e as goteiras); o TEXTO
   encosta à esquerda dessa coluna, como no desenho.
   Sem `width` aqui de propósito: a largura vem do `.wrap`, e um `width:100%`
   nesta regra anulava-a — mesma especificidade e vem depois no ficheiro. */
.slider-texto{position:relative;z-index:4}
.slider-titulo{color:#FFF;font-family:var(--f-titulo);font-size:clamp(2rem,3.6vw,48px);
               font-style:normal;font-weight:300;line-height:normal;
               margin:0;max-width:25ch}
.slider-lead{color:#FFF;font-family:var(--f-corpo);font-size:clamp(1rem,1.6vw,20px);
             font-style:normal;font-weight:300;line-height:normal;
             margin-top:1.25rem;max-width:52ch}

/* Pontos alinhados com o texto, dentro da mesma coluna. Ficam ~120px acima do
   fundo, e a navegação do cabeçalho ocupa só os últimos ~68px do herói — por
   isso não se cruzam. */
.slider-controlo{grid-area:1/1;align-self:end;z-index:5;width:100%;
                 padding-bottom:clamp(5rem,9vw,7.5rem);pointer-events:none}
.slider-pontos{display:flex;justify-content:flex-start;gap:12px;pointer-events:auto}
.slider-ponto{width:10px;height:10px;padding:0;border:1px solid currentColor;
              border-radius:50%;background:transparent;color:var(--branco);
              cursor:pointer;transition:background .3s ease}
.slider-ponto.e-activo{background:currentColor}
.slider-ponto:focus-visible{outline:2px solid currentColor;outline-offset:3px}

@media (prefers-reduced-motion:reduce){
  .slider-slide{transition:none}
}

@media (max-width:980px){
  /* A ALTURA não se fixa aqui. Vem do `--heroi-altura`, que já desconta o botão
     de descer e a barra do cabeçalho — um `60vh` escrito à mão deixava de
     acompanhar o encolhimento dos dois e voltava a empurrar o botão para fora. */
  .slider-controlo{padding-bottom:1.5rem}
}

/* ── HOME: o cabeçalho prende no topo ao rolar ───────────────────────────────
   Quando a navegação chegaria ao topo da janela, o cabeçalho passa à barra
   branca das restantes páginas e fixa-se lá.

   A classe `.cab--presa` é posta pelo JAVASCRIPT. Sem ele — ou com o JS a
   falhar — o cabeçalho fica o do desenho, transparente dentro do herói: o
   comportamento correcto, e não uma versão a meio.

   `.cab--sobre.cab--presa` é mais específico do que `.cab--sobre` sozinho, por
   isso ganha também dentro das media queries que vêm antes no ficheiro. */
.cab--sobre.cab--presa{position:fixed;top:0;left:0;right:0;bottom:auto;
                       pointer-events:auto;
                       background:var(--branco);color:var(--verde);
                       box-shadow:0 4px 10px 0 rgba(0,0,0,.10);
                       animation:cab-desce .28s ease}
.cab--sobre.cab--presa .cab-in{min-height:140px;padding-block:1rem;align-items:center}
/* 80px, iguais aos do cabeçalho solto (`.marca img`): é este par que não pode
   saltar, porque a passagem de um para o outro acontece à frente de quem rola. */
.cab--sobre.cab--presa .marca img{max-height:80px}
.cab--sobre.cab--presa .cab-nav{align-self:center;padding-bottom:0}
/* Volta às medidas do menu das páginas interiores: os itens da home são de
   24px/16px e sem intervalo, o que numa barra de 140px ficava desproporcionado. */
.cab--sobre.cab--presa .cab-nav>ul{gap:40px}
.cab--sobre.cab--presa .cab-nav>ul>li{height:var(--cab-altura);padding:10px}
.cab--sobre.cab--presa .cab-nav a{opacity:1;color:var(--verde)}
/* Mesmo rectângulo alto do `.cab--branca` — esta barra É a barra branca, e o
   item destacado tem de se comportar da mesma maneira nas duas. Ver lá o
   porquê do ::before e da conta do `bottom`. */
.cab--sobre.cab--presa .cab-nav>ul>li{background:none}
.cab--sobre.cab--presa .cab-nav>ul>li::before{
  content:"";position:absolute;z-index:0;
  inset:0 0 calc((var(--cab-presa) - var(--cab-altura)) / -2) 0;
  background:transparent;transition:background .2s}
.cab--sobre.cab--presa .cab-nav>ul>li:hover::before{background:rgba(var(--verde-rgb),.08)}
.cab--sobre.cab--presa .cab-nav>ul>li:has(>a[aria-current])::before{background:var(--verde)}
.cab--sobre.cab--presa .cab-nav>ul>li>.sub{
  top:calc(100% + (var(--cab-presa) - var(--cab-altura)) / 2)}
.cab--sobre.cab--presa .cab-nav>ul>li>a{position:relative;z-index:1}
/* Mesma razão do `.cab--branca`: só o item de topo. */
.cab--sobre.cab--presa .cab-nav>ul>li>a[aria-current]{background:none;color:var(--branco);
                                                       box-shadow:none}

/* Troca do logótipo. As DUAS versões estão no marcado (ver partials/logo.blade.php):
   ir buscar a versão a cores só no momento da troca dava um piscar com o logótipo
   em falta, logo no elemento mais visível do site. */
.marca--dupla .marca-img--alt{display:none}
.cab--presa .marca--dupla .marca-img{display:none}
.cab--presa .marca--dupla .marca-img--alt{display:block}

@keyframes cab-desce{from{transform:translateY(-100%)}to{transform:none}}
@media (prefers-reduced-motion:reduce){.cab--sobre.cab--presa{animation:none}}

@media (max-width:1280px){
  .cab--sobre.cab--presa .cab-in{min-height:120px}
  .cab--sobre.cab--presa .marca img{max-height:76px}
  .cab--sobre.cab--presa .cab-nav a{font-size:1.05rem}
  .cab--sobre.cab--presa .cab-nav>ul{gap:24px}
}
@media (max-width:1080px){
  .cab--sobre.cab--presa .cab-in{min-height:96px}
  .cab--sobre.cab--presa .marca img{max-height:64px}
  /* Na gaveta o painel acompanha a barra: branco com texto verde. */
  .cab--sobre.cab--presa .cab-nav{background:var(--branco);color:var(--verde)}
}
@media (max-width:640px){
  .cab--sobre.cab--presa .cab-in{min-height:80px}
  .cab--sobre.cab--presa .marca img{max-height:52px}
}

/* ── HOME: o submenu abre PARA CIMA ──────────────────────────────────────────
   No herói a navegação está encostada ao fundo da secção: um submenu a abrir
   para baixo saía do herói e caía por cima do conteúdo seguinte. Preso no topo
   já há espaço em baixo, e volta ao normal — daí o `:not(.cab--presa)`.

   Só no menu horizontal: na gaveta (≤1080px) o submenu é `position:static` e
   empilha-se no fluxo, onde «para cima» não quer dizer nada. */
@media (min-width:1081px){
  /* Sobre o herói a caixa é lisa: sem cantos e sem sombra. A sombra e o raio da
     regra base servem uma caixa que cai sobre o conteúdo da página — aqui ela
     assenta sobre a fotografia, e o desenho pede um rectângulo limpo.

     `bottom:75%` e não 100%: a caixa encosta-se ao item e sobrepõe-lhe o último
     quarto, em vez de ficar pousada em cima dele. */
  .cab--sobre:not(.cab--presa) .cab-nav .sub{top:auto;bottom:75%;transform:translateY(-6px);
                                             padding:0 0 10px;border-radius:0;box-shadow:none;
                                             background:var(--branco);color:var(--verde)}
  .cab--sobre:not(.cab--presa) .cab-nav .tem-sub:hover .sub,
  .cab--sobre:not(.cab--presa) .cab-nav .tem-sub:focus-within .sub{transform:none}
}

/* ── HOME: em ecra estreito o cabeçalho é o das outras páginas ───────────────
   Barra branca no topo, logótipo a cores, ícone verde. O herói a 60vh com a
   navegação encostada ao fundo é desenho de ecrã largo: num telemóvel punha o
   botão do menu a meio da página, longe de onde toda a gente o procura.

   Vem DEPOIS do bloco dos 1080px lá em cima de propósito — as regras têm a mesma
   especificidade e é a ordem que decide qual vence. */
@media (max-width:1080px){
  .cab--sobre{position:sticky;top:0;pointer-events:auto;
              background:var(--branco);color:var(--verde);
              box-shadow:0 1px 0 rgba(31,42,40,.06)}
  .cab--sobre .cab-in{min-height:96px;padding-block:1rem;align-items:center}
  .cab--sobre .marca img{max-height:64px}
  /* A gaveta acompanha a barra: branca com texto verde, como em `.cab--branca`. */
  .cab--sobre .cab-nav{align-self:stretch;padding-bottom:0;
                       background:var(--branco);color:var(--verde)}
  /* Barra branca pede o logótipo a cores — a mesma troca que o `.cab--presa` faz
     no desktop, aqui sem depender do scroll nem do JavaScript. */
  .cab--sobre .marca--dupla .marca-img{display:none}
  .cab--sobre .marca--dupla .marca-img--alt{display:block}
}
@media (max-width:640px){
  .cab--sobre .cab-in{min-height:80px}
  .cab--sobre .marca img{max-height:52px}
}

/* ── HOME (sobre o herói): item aceso ────────────────────────────────────────
   Branco cheio com texto verde — o negativo da barra, que é o que se destaca
   sobre a fotografia. Nas páginas interiores o aceso é um verde a 8%, porque lá
   o fundo já é branco e um branco sobre branco não se via.

   `:not(.cab--presa)`: preso no topo a barra já é branca, e aí vale o realce
   discreto das interiores. Só no menu horizontal — na gaveta o painel já é
   branco e isto não se notaria. */
@media (min-width:1081px){
  .cab--sobre:not(.cab--presa) .cab-nav a{transition:opacity .2s,background .2s,color .2s}
  .cab--sobre:not(.cab--presa) .cab-nav>ul>li{transition:background .2s}
  .cab--sobre:not(.cab--presa) .cab-nav>ul>li:hover{background:var(--branco)}
  .cab--sobre:not(.cab--presa) .cab-nav>ul>li:hover>a{color:var(--verde);opacity:1}
}

/* «Início»: existe só na gaveta. No menu horizontal a home chega-se pelo
   logótipo, e um item a mais empurrava os cinco restantes para fora.

   O selector tem de repetir `.cab-nav>ul>li`: um `.so-gaveta` sozinho vale
   (0,1,0) e a regra base do item vale (0,1,2), por isso o `display:inline-flex`
   dela ganhava e o item aparecia na mesma no desktop. */
.cab-nav>ul>li.so-gaveta{display:none}

@media (max-width:1080px){
  /* `grid` e não `inline-flex`: com o <li> a ser grelha, o «Início» era o único
     item fora dela — o link não caía na coluna do meio e ficava desalinhado dos
     restantes. */
  .cab-nav>ul>li.so-gaveta{display:grid}

  /* Na gaveta os itens não levam padding — o espaço entre eles vem do próprio
     link. Esta linha existe porque a regra da home (`padding:24px 16px`) é mais
     específica do que a da gaveta e vencia-a também aqui, deixando os itens do
     menu do telemóvel com uma folga de ecrã largo. */
  .cab--sobre .cab-nav>ul>li{padding:0}

  /* A partir daqui a gaveta da home é IGUAL à das restantes páginas. Três
     regras da home estavam a escapar-se para o telemóvel por não estarem dentro
     de nenhuma media query — e o resultado era um menu sem intervalo entre
     itens, sem realce ao tocar e sem indicação da página onde se está. */
  .cab--sobre .cab-nav>ul{gap:0}
  .cab--sobre .cab-nav a{opacity:1}

  /* Aceso e activo iguais aos do menu horizontal: verde a 8% ao apontar, verde
     cheio com texto branco na página actual. SEM negrito — a cor já faz a
     distinção, e o peso a mais só desalinhava o texto.

     O fundo vai no <a> e NÃO no <li>: no <li> ele atravessava a gaveta de lado a
     lado, e o que se quer é uma marca à volta do rótulo. O `align-self` é o que
     impede o link de esticar (o <li> é `align-items:stretch`), e os 10px de
     padding lateral são a folga do fundo à volta do texto.

     A `.cab--sobre` precisa de regra própria: as do menu horizontal estão dentro
     do `@media (min-width:1081px)` e não chegam aqui. */
  /* Continua a NÃO esticar, para o fundo do hover envolver só o rótulo — quem
     centra agora é a grelha do <li>. */
  .cab-nav>ul>li>a{justify-self:center;grid-column:2}

  /* Os fundos ao nível do <li> das páginas interiores NÃO estão dentro de nenhuma
     media query, por isso escapavam para cá e pintavam a largura toda da gaveta —
     enquanto a home, cujas regras equivalentes vivem no `@media (min-width:1081px)`,
     não tinha esse fundo. Era esta a diferença entre as duas. Aqui o realce vive
     só no <a>, nas duas variantes. */
  .cab--sobre .cab-nav>ul>li:hover,
  .cab--branca .cab-nav>ul>li:hover,
  .cab--sobre .cab-nav>ul>li:has(>a[aria-current]),
  .cab--branca .cab-nav>ul>li:has(>a[aria-current]){background:none}

  .cab--sobre .cab-nav>ul>li>a:hover,
  .cab--branca .cab-nav>ul>li>a:hover{background:rgba(var(--verde-rgb),.08)}

  .cab--sobre .cab-nav>ul>li>a[aria-current],
  .cab--branca .cab-nav>ul>li>a[aria-current]{background:var(--verde);
                                              color:var(--branco);font-weight:inherit}
}

/* ── Botão de descer (Figma, Rectangle 78) ───────────────────────────────────
   Pílula de 30×50 com contorno fino e um chevron ao centro. Os 40px de topo são
   a distância do desenho entre o fim do herói (740) e o topo da pílula (780).

   A COR é `currentColor`, herdada da secção — a mesma escolha do `.btn--linha`.
   Fixar o verde aqui obrigava a uma segunda regra no dia em que o botão aparecer
   sobre um fundo escuro. */
.descer{padding:var(--descer-pad) 0;display:flex;justify-content:center}
.descer-btn{display:flex;align-items:center;justify-content:center;
            width:30px;height:50px;padding:0;line-height:0;
            border:1px solid currentColor;border-radius:25px;
            background:none;color:var(--verde);cursor:pointer;
            transition:background .2s,color .2s}
.descer-btn:hover{background:var(--verde);color:var(--branco)}
.descer-btn:focus-visible{outline:2px solid var(--verde);outline-offset:3px}
/* Medidas em CSS e não só nos atributos do <svg>: o reset lá em cima
   (`img,svg{max-width:100%;height:auto}`) sobrepõe-se ao atributo `height`, e um
   SVG a redimensionar-se sozinho dentro de uma caixa de 28px de conteúdo deixava
   de assentar no meio. As margens automáticas centram-no mesmo que um dia esta
   caixa deixe de ser flex. */
.descer-seta{display:block;width:100%;height:20px;margin:auto;flex:0 0 auto;
             animation:descer-acena 1.8s ease-in-out infinite}

/* O chevron desce e volta, como o ponto de um rato de scroll: diz que há mais
   página para baixo sem precisar de uma palavra. */
@keyframes descer-acena{
  0%,100%{transform:translateY(-3px)}
  50%    {transform:translateY(3px)}
}
@media (prefers-reduced-motion:reduce){
  .descer-seta{animation:none}
}

/* A barra encolhe com a janela. Abaixo dos 1080px ela está no FLUXO, por isso
   passa a roubar altura ao primeiro ecrã — daí `--cab-barra` acompanhar. */
@media (max-width:1280px){:root{--cab-presa:120px}}
@media (max-width:1080px){:root{--cab-presa:96px;--cab-barra:var(--cab-presa)}}
@media (max-width:640px){:root{--cab-presa:80px}}

/* ── Destino do scroll por baixo do cabeçalho ────────────────────────────────
   O cabeçalho preso flutua POR CIMA do conteúdo. Sem isto, uma secção levada ao
   topo da janela — pelo botão de descer ou por qualquer âncora — encostava lá em
   cima e ficava com o título tapado pela barra.

   `scroll-margin-top` é a propriedade feita para isto: não desloca nada na
   página, só diz ao browser onde é que o elemento se considera «no topo». Assim
   o JavaScript continua a chamar um `scrollIntoView` simples. */
#cms-page > *{scroll-margin-top:calc(var(--cab-presa) + 16px)}

/* ── Secção «Pilares» — Cuidados que transformam vidas ───────────────────────
   Título e abertura centrados, colunas com ícone, e um botão ao centro.
   Medidas do Figma (322:404): ícone a 64px, colunas de 404px numa grelha de
   1272px com 30px de intervalo, botão a 155px do fim das colunas. */
/* Menos 20px em cima do que o espaçamento normal de secção: por baixo desta
   vem o botão de descer, que já traz folga própria. Subtrai-se ao `clamp` em vez
   de se escrever um valor fixo, para o topo continuar a encolher com a janela
   como o resto. */
/* Topo: menos 20px do que o espaçamento normal de secção, subtraídos ao
   `clamp` para continuar a encolher com a janela.
   Fundo: 80px fixos, do desenho — mas com `clamp` para não ficarem 80px inteiros
   num telemóvel, onde valem por um terço do ecrã. */
.pilares{padding:calc(clamp(3.5rem,8vw,6.5rem) - 20px) 0 clamp(2.5rem,6vw,80px);
         text-align:center}
/* O `text-align:center` não se repete: vem da `.pilares`, que já centra tudo.
   Os tamanhos ficam em `clamp` com o valor do desenho no topo — 40px e 16px em
   ecrã largo, a encolher com a janela como o resto do tema. */
.pilares-titulo{color:var(--verde);font-family:var(--f-titulo);
                font-size:clamp(1.75rem,3vw,40px);font-style:normal;
                font-weight:300;line-height:normal;margin:0}
.pilares-abertura{max-width:1055px;margin:clamp(1rem,2vw,1.5rem) auto 0;
                  color:var(--verde);font-family:var(--f-corpo);
                  font-size:clamp(.875rem,1.2vw,16px);font-style:normal;
                  font-weight:300;line-height:1.5}

/* `auto-fit` e não três colunas fixas: o desenho tem três, mas o CMS deixa
   acrescentar mais — e uma grelha travada em 3 partia a partir da quarta.

   Os 30px em cima e em baixo são PADDING e não margem, e a diferença não é de
   gosto: a `<ul>` e o `<p class="pilares-accao">` que vem a seguir são irmãos em
   fluxo normal, por isso as margens verticais deles COLAPSAM. Um
   `margin-bottom:30px` aqui perdia contra o `margin-top` de 80px do botão e o
   espaçamento ficava exactamente na mesma — medido: +0px. O mesmo acontecia
   contra o padding de fundo da secção quando não há botão.

   Com padding, os 30px entram por dentro da caixa da grelha e ninguém os
   engole. Medido a 1440, 900 e 390px, com e sem botão: +30 em cima e +30 em
   baixo nos seis casos.

   O `padding` continua a zerar a esquerda, que era para o que lá estava — a
   `<ul>` traz um recuo por defeito do browser. */
.pilares-grelha{display:grid;grid-template-columns:repeat(auto-fit,minmax(240px,1fr));
                gap:clamp(2.5rem,5vw,80px) 30px;
                margin:clamp(3rem,6vw,80px) 0 0;padding:30px 0;list-style:none}
.pilares-item{display:flex;flex-direction:column;align-items:center}
.pilares-icone{width:auto;height:clamp(44px,4.8vw,64px);margin-inline:auto}
/* Dentro da coluna a cor MUDA: o título é o verde da marca, o texto é o cinzento
   de leitura (#465756). Não é descuido — é o mesmo par que a secção de
   Colaboradores usa, e o contraste entre os dois é o que separa a etiqueta do
   corpo dentro de uma coluna estreita. */
.pilares-item-titulo{color:var(--verde);font-family:var(--f-titulo);
                     font-size:clamp(1rem,1.5vw,24px);font-style:normal;
                     font-weight:300;line-height:normal;
                     margin:clamp(1.5rem,3vw,40px) 0 0}
.pilares-item-texto{color:#465756;font-family:var(--f-corpo);
                    font-size:clamp(.875rem,1.2vw,16px);font-style:normal;
                    font-weight:300;line-height:1.875;
                    margin-top:clamp(.75rem,1.5vw,1rem)}

.pilares-accao{margin:clamp(2.5rem,6vw,80px) 0 0}

/* ── Secção «Testemunhos» (Figma 322:404, 1029:485-489) ──────────────────────
   Faixa de 600px com fotografia ao fundo, véu verde por cima e a citação ao
   centro. Empilhamento em grelha, como no slider: a faixa fica com a altura do
   testemunho mais alto em vez de depender de uma altura fixa que corta o texto
   num telemóvel. */
.testemunhos{position:relative;display:grid;isolation:isolate;
             min-height:clamp(420px,50vw,600px);overflow:hidden;
             background:var(--verde);color:var(--branco)}
.testemunhos-palco{grid-area:1/1;display:grid}
.testemunho{grid-area:1/1;position:relative;display:flex;align-items:center;
            margin:0;opacity:0;visibility:hidden;
            transition:opacity .5s ease,visibility .5s}
.testemunho.e-activo{opacity:1;visibility:visible}
.testemunho-fundo{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;z-index:0}
/* Véu do desenho: o verde da marca a 85%. */
.testemunho::after{content:"";position:absolute;inset:0;z-index:1;
                   background:rgba(94,121,117,.85)}

.testemunho-conteudo{position:relative;z-index:2;text-align:center;
                     padding-block:clamp(3rem,7vw,5.5rem)}
/* O `text-align:center` não se repete: vem do `.testemunho-conteudo`.
   Tamanhos em `clamp` com o valor do desenho no topo, como no resto do tema. */
.testemunho-texto{margin:0 auto;max-width:1054px;color:#FFF;
                  font-family:var(--f-titulo);font-size:clamp(1.25rem,2.4vw,32px);
                  font-style:italic;font-weight:300;line-height:1.25}
.testemunho-assinatura{display:block;margin-top:clamp(2rem,4vw,40px)}
.testemunho-autor{display:block;color:#FFF;font-family:var(--f-titulo);
                  font-size:clamp(1.125rem,1.6vw,24px);font-style:normal;
                  font-weight:300;line-height:normal}
.testemunho-funcao{display:block;color:#FFF;font-family:var(--f-corpo);
                   font-size:clamp(.875rem,1.2vw,16px);font-style:normal;
                   font-weight:300;line-height:1.875}

/* Setas nas margens laterais, fora do texto. Escondem-se no telemóvel, onde não
   há goteira para elas — lá ficam só os pontos, que não roubam largura. */
.testemunhos-seta{position:absolute;top:50%;transform:translateY(-50%);z-index:3;
                  display:flex;align-items:center;justify-content:center;
                  width:44px;height:44px;padding:0;border:0;border-radius:50%;
                  background:none;color:#FFF;cursor:pointer;opacity:.7;
                  transition:opacity .2s}
.testemunhos-seta:hover{opacity:1}
.testemunhos-seta:focus-visible{outline:2px solid #FFF;outline-offset:2px;opacity:1}
.testemunhos-seta--ant{left:clamp(4px,2vw,32px)}
.testemunhos-seta--seg{right:clamp(4px,2vw,32px)}

.testemunhos-pontos{grid-area:1/1;align-self:end;justify-self:center;z-index:3;
                    display:flex;gap:12px;padding-bottom:clamp(1.25rem,3vw,32px)}
.testemunhos-ponto{width:10px;height:10px;padding:0;border:1px solid #FFF;
                   border-radius:50%;background:transparent;cursor:pointer;
                   transition:background .3s ease}
.testemunhos-ponto.e-activo{background:#FFF}
.testemunhos-ponto:focus-visible{outline:2px solid #FFF;outline-offset:3px}

@media (prefers-reduced-motion:reduce){.testemunho{transition:none}}
@media (max-width:640px){.testemunhos-seta{display:none}}

/* ── Secção «Um espaço pensado para si» (Figma 322:404) ──────────────────────
   Título centrado, fila de fotografias verticais e botão por baixo.
   Medidas do desenho: 404×523 cada foto, 30px de intervalo, botão a 80px. */
/* Os 120px do desenho encolhem com a janela, pela MESMA inclinação das outras
   secções (a `.sec` é clamp(3.5rem,8vw,6.5rem)): a 1512px, 8vw dá 121px, ou seja
   o valor do desenho. Assim estas secções acompanham o resto, em vez de ficarem
   com uma folga de ecrã largo dentro de um telemóvel. */
.espaco{padding:clamp(3.5rem,8vw,120px) 0;text-align:center}
.espaco-titulo{color:var(--verde);font-family:var(--f-titulo);
               font-size:clamp(1.75rem,3vw,40px);font-style:normal;
               font-weight:300;line-height:normal;margin:0}
.espaco-texto{max-width:1055px;margin:clamp(1rem,2vw,1.5rem) auto 0;
              color:var(--verde);font-family:var(--f-corpo);
              font-size:clamp(.875rem,1.2vw,16px);font-weight:300;line-height:1.5}

/* `auto-fit` e não três colunas: o desenho tem três fotografias, mas o CMS deixa
   acrescentar mais — e uma grelha travada em 3 partia a partir da quarta. */
.espaco-grelha{display:grid;grid-template-columns:repeat(auto-fit,minmax(240px,1fr));
               gap:30px;margin:clamp(1.5rem,3vw,40px) 0 0;padding:0;list-style:none}
.espaco-grelha li{margin:0}
/* O texto da secção pode ter vários parágrafos; sem isto ficavam colados. */
.espaco-texto p{margin:0 0 1rem}
.espaco-texto p:last-child{margin-bottom:0}
/* `aspect-ratio` e não altura fixa: 404/523 mantém o recorte do desenho em
   qualquer largura, em vez de esticar as fotografias quando a coluna encolhe.
   O enquadramento vem do ponto focal escolhido no CMS. */
.espaco-grelha img{width:100%;height:auto;aspect-ratio:404/523;object-fit:cover;
                   display:block}

/* 80px a 1512px, a encolher com a janela pela mesma inclinação do resto da
   secção (5.3vw dá 80px nessa largura). */
.espaco-accao{margin:clamp(2.5rem,5.3vw,80px) 0 0}

/* ── Destaque de Notícias na homepage (Figma 322:404) ────────────────────────
   Faixa com título centrado, os MESMOS cartões da página /noticias e um botão.
   A grelha e os cartões vêm de `.noticias-grelha` / `.noticia-cartao` — aqui só
   se acrescenta a moldura da faixa. */
/* 120px em cima e 155px em baixo, do desenho, pela mesma regra da `.espaco`.
   Os 10.3vw do fundo dão 155px a 1512px — a inclinação equivalente para um valor
   maior, para os dois lados encolherem na mesma proporção. */
/* O MÍNIMO de baixo é 100px (6.25rem) e não os 72px de antes, pela mesma razão
   do `.mais-noticias` no detalhe: esta é a última secção antes do rodapé, e a
   barra «Pedido de consulta» sobe 34,5px por cima dela. Esses 34,5px saem daqui.
   Com 72px sobravam 37,5px de folga até à barra, contra 120,5px em ecrã largo.
   Com 100px passam a 65,5px — o mesmo valor do detalhe, para as duas páginas se
   comportarem igual.

   Só o mínimo sobe: os 10.3vw ultrapassam os 100px a partir dos 971px, por isso
   nada muda daí para cima e não há degrau nenhum. */
.home-noticias{padding:clamp(3.5rem,8vw,120px) 0 clamp(6.25rem,10.3vw,155px);
               text-align:center}
.home-noticias--branco{background:var(--branco)}
.home-noticias--areia,.home-noticias--blue{background:var(--areia)}
.home-noticias--verde,.home-noticias--green{background:var(--verde)}
.home-noticias--verde-escuro,.home-noticias--black{background:var(--verde-escuro)}

.home-noticias-titulo{color:var(--verde);font-family:var(--f-titulo);
                      font-size:clamp(1.75rem,3vw,40px);font-style:normal;
                      font-weight:300;line-height:normal;margin:0}
.home-noticias-texto{max-width:1055px;margin:clamp(1rem,2vw,1.5rem) auto 0;
                     color:var(--verde);font-family:var(--f-corpo);
                     font-size:clamp(.875rem,1.2vw,16px);font-weight:300;line-height:1.5}

/* A grelha da listagem é de 3 colunas e alinhada à esquerda; aqui a faixa é
   centrada, por isso repõe-se o alinhamento dentro dos cartões. */
.home-noticias-grelha{margin-top:40px;text-align:left}
.home-noticias-accao{margin:80px 0 0}

/* Sobre fundo verde o título tem de inverter — senão fica verde sobre verde. */
.home-noticias--verde .home-noticias-titulo,
.home-noticias--verde .home-noticias-texto,
.home-noticias--verde-escuro .home-noticias-titulo,
.home-noticias--verde-escuro .home-noticias-texto{color:var(--branco)}

/* ── Botão flutuante «Pedido de Consulta» (Figma, Frame 43 / 621:315) ────────
   Duas variantes no desenho: 48,59×49,35 só com o ícone, e 214,59×49,35 com o
   rótulo. Aqui é o mesmo elemento a abrir no hover.

   Medidas exactas do desenho: 12px de padding, 11px entre ícone e texto, ícone
   24,59×25,347, texto Canela a 20px, borda de 1px sobre branco.

   Quem abre é o TEXTO (max-width 0 → 180px) e não o contentor: encolher a caixa
   com `overflow:hidden` deixava passar uma fatia de letra pela beira do ecrã,
   porque o intervalo do flex continua a ocupar espaço mesmo com o texto a zero.
   Aqui o afastamento vem do padding do próprio rótulo, que desaparece com ele. */
.pedido{position:fixed;right:0;top:var(--pedido-topo,33vh);
        transform:translateY(-50%);z-index:60;
        display:flex;align-items:center;height:48px;min-width:48px;padding:0 11px;
        background:#FFF;border:1px solid #5E7975;
        box-shadow:0 4px 4px 0 rgba(0,0,0,.25);
        /* `cursor:pointer` porque isto deixou de ser um <a>: passou a <button>
           para abrir o popup, e o <button> nasce com a seta normal. */
        color:var(--verde);text-decoration:none;cursor:pointer}
/* 48×48 fechado, exactos. Com `box-sizing:border-box` a borda conta para dentro,
   por isso a conta é 1 + 11 + 24 + 11 + 1 = 48 — daí o padding lateral de 11px
   (e não os 12 do Figma, que davam 50 com a borda) e o ícone a 24px redondos.
   Na vertical o padding sai: a altura é fixa e o `align-items:center` centra. */
.pedido-icone{flex:0 0 auto;width:24px;height:24px}
.pedido-icone img{width:100%;height:100%;display:block}
.pedido-texto{max-width:0;overflow:hidden;white-space:nowrap;
              transition:max-width .35s ease}
.pedido-texto span{display:block;padding-left:11px;
                   font-family:var(--f-titulo);font-size:20px;font-style:normal;
                   font-weight:200;line-height:normal;color:var(--verde)}
/* O rótulo abre no rato e no teclado — e SÓ neles.

   `@media (hover:hover)` no `:hover`: num ecrã táctil o browser deixa o
   `:hover` «colado» depois do toque, e o rótulo ficava aberto para sempre. Era
   o que se via em telemóvel — tocar no botão abria o popup e o botão ficava
   aberto por trás dele, e continuava aberto depois de fechar. Em ecrã táctil
   não há nada a pairar; a regra não faz lá falta nenhuma.

   `:focus-visible` e já NÃO `:focus-within`: como não há nada focável dentro do
   botão, o `:focus-within` era na prática um `:focus` — abria a cada clique e a
   cada toque, e ficava aberto quando o popup devolve o foco ao botão ao fechar.
   O `:focus-visible` continua a servir quem chega com Tab, que era a razão de
   ser da regra; o browser é que decide, e depois de um clique de rato não o
   aplica. */
@media (hover:hover) and (pointer:fine){
  .pedido:hover .pedido-texto{max-width:185px}
}
.pedido:focus-visible .pedido-texto{max-width:185px}
.pedido:focus-visible{outline:2px solid var(--verde);outline-offset:2px}

@media (prefers-reduced-motion:reduce){.pedido-texto{transition:none}}

/* Em ecrã estreito o pedido fica POR BAIXO do menu. A gaveta é `position:fixed`
   com o ecrã todo; com o botão a z-index 60 (acima do cabeçalho, que é 50), ele
   ficava a flutuar por cima do painel aberto, sobre os itens de navegação.
   Abaixo do cabeçalho, desaparece enquanto o menu está aberto e volta ao fechar.

   E DESCE: de meia altura do herói para junto ao FUNDO dele — o topo do botão
   fica 30px acima do fim do slider.

   Duas coisas mudam para isso funcionar:
   · `transform:none` — em ecrã largo o botão está CENTRADO no valor de `top`
     (por causa do `translateY(-50%)`), e aqui o que se quer posicionar é a
     borda de cima. Sem tirar a transformação, os 30px pedidos saíam 54.
   · `top` passa a ler `--pedido-topo-tablet`, que a view calcula. Tem de ser a
     view a fazê-lo porque só ela sabe se a página TEM slider: numa página
     interior não há fundo de herói nenhum a que encostar, e aí o valor que ela
     manda é o mesmo `33vh` de sempre.

   O fundo do slider está a `--heroi-altura` do topo da janela — a `.cab--sobre`
   é `position:absolute`, portanto o slider começa em 0 e o cabeçalho flutua por
   cima dele. */
@media (max-width:1080px){
  .pedido{z-index:40;
          top:var(--pedido-topo-tablet,var(--pedido-topo,33vh));
          transform:none}
}

/* ── Popup «Pedido de Consulta» (Figma 160:117 desktop · 160:147 telemóvel) ───
   Elemento <dialog> nativo: traz o modo modal, o fecho por Esc, o foco preso
   dentro da caixa e o fundo inerte — tudo isso teria de ser escrito à mão com
   um <div>, e é onde os modais caseiros costumam falhar. */
/* COLUNA FLEXÍVEL, e não um bloco: é o que permite escolher QUEM cede quando a
   caixa não cabe no ecrã. O formulário fica fixo (`flex-shrink:0`) e a capa é a
   única peça elástica — a imagem encolhe, os campos nunca.

   Sem isto, com 1034px de conteúdo, a caixa punha barra de deslocamento em
   qualquer ecrã com menos de 1066px de altura: num portátil de 768px o botão
   «Enviar Pedido» ficava fora da vista logo ao abrir, e o formulário parecia
   não ter fim. */
.pedido-popup{width:min(804px,calc(100vw - 2rem));max-width:none;
              max-height:calc(100dvh - 2rem);
              display:flex;flex-direction:column;overflow:auto;
              padding:0;border:0;border-radius:16px;
              background:var(--areia);color:var(--verde)}
.pedido-popup-caixa,
.pedido-form{flex-shrink:0}
.pedido-popup:not([open]){display:none}
.pedido-popup::backdrop{background:rgba(31,42,40,.55)}

/* Capa: duas imagens, escolhidas no CMS. A media query decide qual carrega —
   assim o browser não descarrega a que não vai mostrar. Sem a de telemóvel,
   herda a de desktop.

   O `aspect-ratio` dá a altura DE DESENHO (478px a 804 de largura). É um ponto
   de partida, não uma imposição: como item flexível, a altura real é a que
   sobrar depois do formulário, travada em baixo pelos 250px de `min-height`.

   250px é um piso pedido, não calculado: abaixo disso a fotografia deixa de ser
   uma imagem e passa a ser uma tira. É o MESMO piso em telemóvel, mais abaixo.
   Quando 250 já não chegam, quem cede a seguir é o campo de observações — ver
   `.pedido-campo textarea`.

   O `center/cover` faz o resto: a imagem não se deforma, RECORTA-SE. */
.pedido-capa{position:relative;display:flex;flex-direction:column;
             justify-content:flex-end;align-items:flex-start;
             aspect-ratio:804/478;min-height:250px;padding:30px;
             background:var(--verde) var(--capa,none) center/cover no-repeat;
             color:var(--branco);text-align:left}
/* A marca está centrada na capa INTEIRA, mas o título vive no fundo dela: numa
   capa encolhida os dois encontravam-se. O tecto tira do meio o espaço que o
   título ocupa em baixo (30px de padding + ~38px de linha) a dobrar, porque o
   que cresce a partir do centro cresce para os dois lados. Em capa inteira não
   tem efeito nenhum — 478px dão 326px de tecto para uma marca de 122px. */
.pedido-capa-marca{position:absolute;top:50%;left:50%;
                   transform:translate(-50%,-50%);
                   width:clamp(140px,28%,230px);height:auto;display:block;
                   max-height:calc(100% - 152px);object-fit:contain}
.pedido-capa-titulo{margin:0;color:#FFF;font-family:var(--f-titulo);
                    font-size:clamp(1.5rem,3vw,32px);font-weight:300;
                    line-height:normal}

.pedido-fechar{position:absolute;top:12px;right:12px;z-index:2;
               display:flex;align-items:center;justify-content:center;
               width:36px;height:36px;padding:0;border:0;border-radius:50%;
               background:rgba(31,42,40,.35);color:#FFF;cursor:pointer;
               transition:background .2s}
.pedido-fechar:hover{background:rgba(31,42,40,.6)}
.pedido-fechar:focus-visible{outline:2px solid #FFF;outline-offset:2px}
.pedido-popup-caixa{margin:0}

/* ── Formulário ─────────────────────────────────────────────────────────────
   Desktop (160:117): duas colunas — nome/especialidade, email/telefone,
   observações a toda a largura, e por fim consentimento à esquerda e botão à
   direita. É exactamente o que a colocação automática da grelha faz com esta
   ordem de marcado, sem uma única coordenada escrita à mão. */
.pedido-form{display:grid;grid-template-columns:1fr 1fr;gap:10px;padding:30px 38px 40px}
.pedido-form-intro{grid-column:1 / -1;margin:0 0 .5rem;
                   font-family:var(--f-corpo);font-size:14px;font-weight:300;line-height:1.6}

.pedido-campo{display:block;margin:0}
.pedido-campo--obs{grid-column:1 / -1}

/* O rótulo existe para os leitores de ecrã; à vista o campo mostra o
   `placeholder`, como no desenho. Não se usou `display:none` — isso retirava-o
   também da árvore de acessibilidade, que é precisamente o que ele serve. */
.pedido-campo-rotulo{position:absolute;width:1px;height:1px;margin:-1px;padding:0;
                     overflow:hidden;clip-path:inset(50%);white-space:nowrap;border:0}

.pedido-campo input,
.pedido-campo select,
.pedido-campo textarea{width:100%;height:46px;padding:0 20px;
                       border:1px solid rgba(94,121,117,.45);border-radius:23px;
                       background:#FFF;color:var(--verde);
                       font-family:var(--f-corpo);font-size:14px;font-weight:300;
                       line-height:44px}
/* A ALTURA DAS OBSERVAÇÕES É QUEM CEDE A SEGUIR À IMAGEM.
   266px são os do desenho e é o que se vê em qualquer ecrã com altura para
   isso. Quando a capa já bateu no piso dos 270px e a caixa continua a não
   caber, é este campo que encolhe — e não os campos de uma linha, que a essa
   altura já não teriam nada para dar.

   A conta do meio, `100dvh - 572px`, é a altura que sobra:
       32   margem do <dialog> (`max-height:calc(100dvh - 2rem)`)
     + 250  piso da capa
     + 290  o resto do formulário (padding, intro, 4 campos, consentimento/botão)
   Resultado: dos ~838px de ecrã para cima nada encolhe; abaixo disso a capa
   fica nos 250 e as observações vão dando o que falta, até ao piso de 120px
   (cinco linhas escritas). Só abaixo de ~692px é que volta a haver barra de
   deslocamento.

   ⚠️ Os 290 são os do formulário de hoje. Com o Turnstile ligado ou com o
   resumo de erros aberto, o formulário cresce e a caixa passa a deslocar-se um
   pouco mais cedo — degrada, não parte. Se o Turnstile passar a ser permanente,
   é este número que se acerta. */
.pedido-campo textarea{height:auto;min-height:clamp(120px,calc(100dvh - 572px),266px);
                       padding:15px 20px;
                       border-radius:23px;line-height:1.6;
                       /* Sem pega de redimensionar: arrastá-la desalinhava a
                          coluna e empurrava o botão de enviar para fora da
                          caixa. A altura já é a do desenho e chega. */
                       resize:none}
.pedido-campo select{appearance:none;
                     /* Seta desenhada em fundo: um `background-image` evita um
                        elemento a mais só para um chevron. */
                     background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 17 9' fill='none'%3E%3Cpath d='M1 1l7.5 7L16 1' stroke='%235E7975' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");
                     background-repeat:no-repeat;background-position:right 20px center;
                     background-size:17px 9px;padding-right:50px;cursor:pointer}
.pedido-campo input::placeholder,
.pedido-campo textarea::placeholder{color:rgba(94,121,117,.7);opacity:1}
.pedido-campo input:focus-visible,
.pedido-campo select:focus-visible,
.pedido-campo textarea:focus-visible{outline:2px solid var(--verde);outline-offset:1px}
/* Campo recusado pelo servidor: um traço mais forte. Nunca SÓ a cor — quem não
   distingue vermelho de cinzento ficava sem saber qual falhou; por isso o
   resumo no topo continua a nomear os campos. */
.pedido-campo [aria-invalid="true"]{border-color:#B3261E;border-width:2px}

.pedido-aceite{display:flex;align-items:center;align-self:center;gap:20px;margin:0;
               font-family:var(--f-corpo);font-size:12px;font-weight:300;
               line-height:1.4;color:var(--verde)}
/* A caixa do desenho: 30×30, cantos a 10px, traço verde sobre branco. Exige
   `appearance:none` — a caixa nativa não aceita raio nem cor de fundo — e isso
   apaga também o VISTO do sistema, por isso ele é redesenhado a seguir. Sem
   esse cuidado ficava uma caixa que nunca mostra que está marcada, logo num
   campo obrigatório. */
.pedido-aceite input,
.campo--consentimento input{flex:0 0 auto;width:30px;height:30px;margin:0;
                     appearance:none;-webkit-appearance:none;
                     border-radius:10px;border:1px solid var(--verde);
                     background:#FFF center/16px 12px no-repeat;cursor:pointer}
.pedido-aceite input:checked,
.campo--consentimento input:checked{background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 12' fill='none'%3E%3Cpath d='M1 6.2l4.6 4.6L15 1.2' stroke='%235E7975' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E")}
.pedido-aceite input:focus-visible,
.campo--consentimento input:focus-visible{outline:2px solid var(--verde);outline-offset:2px}
.pedido-aceite a{color:inherit}

.pedido-enviar{margin:0}
.pedido-enviar .btn{width:100%;min-width:0;height:50px;border-radius:25px}

/* O Turnstile só aparece se estiver ligado nas definições; quando aparece, ocupa
   a linha toda para não desalinhar as duas colunas. */
.pedido-form .cf-turnstile{grid-column:1 / -1}

/* ── Avisos ──────────────────────────────────────────────────────────────── */
.pedido-aviso{grid-column:1 / -1;margin:0 0 .5rem;padding:.85rem 1.1rem;
              border-radius:12px;font-family:var(--f-corpo);font-size:14px;
              font-weight:300;line-height:1.5}
.pedido-aviso:focus{outline:none}
.pedido-aviso--ok{background:rgba(var(--verde-rgb),.12);color:var(--verde)}
.pedido-aviso--erro{background:rgba(179,38,30,.08);color:#8C1D18}
.pedido-aviso p{margin:0}
.pedido-aviso ul{margin:.4rem 0 0;padding-left:1.1rem}

/* ── Telemóvel (160:147) ─────────────────────────────────────────────────── */
@media (max-width:720px){
  /* A capa também encolhe em telemóvel, e com O MESMO piso do desktop: 250px.
     A fotografia daqui é a vertical (160:147) e o rácio dá-lhe 337px num
     telemóvel de 390 de largura — encolhe até 250 e pára. A partir daí a caixa
     desloca-se, que num telemóvel é gesto natural; com o rato é que não era.

     As observações NÃO encolhem aqui: ficam nos 150px do desenho de telemóvel.
     Encolher as duas coisas espremia o formulário todo num ecrã que já é
     pequeno, e nesse caso a barra de deslocamento resolve melhor. */
  .pedido-capa{background-image:var(--capa-movel,var(--capa,none));
               aspect-ratio:513/483;min-height:250px;padding:20px}
  /* A marca não está no desenho de telemóvel — a fotografia ocupa o espaço. */
  .pedido-capa-marca{display:none}
  .pedido-popup{border-radius:12px}
  .pedido-form{grid-template-columns:1fr;padding:30px}
  .pedido-campo textarea{min-height:150px}
  /* O CONSENTIMENTO VEM ANTES DO BOTÃO, como no desktop.

     O desenho de telemóvel (160:147) punha o botão por cima, e durante algum
     tempo foi isso que aqui esteve — duas regras de `order` a inverter a ordem
     do marcado. Foi revertido por decisão do cliente, e a ordem visual passa a
     ser a mesma do marcado: aceitar, depois enviar.

     Não é só arrumação: pedir a autorização DEPOIS de mostrar o botão de enviar
     convida a carregar primeiro e ler depois, e num formulário de saúde o
     consentimento é o passo que não deve ser encontrado por acaso. Sem `order`
     nenhum, a grelha segue o marcado e o intervalo de 10px trata do resto. */
}

/* TELEMÓVEL A SÉRIO (< 640px): a capa pode descer aos 160px.

   Os 250 da regra acima são o piso de tablet, e num telemóvel eram altos de
   mais: com eles a caixa não cabia num ecrã de 844 de altura e voltava a haver
   barra de deslocamento, com o botão «Enviar Pedido» fora da vista ao abrir —
   que é o defeito que todo este arranjo existe para evitar.

   Aqui não há marca por cima da fotografia (fica `display:none` acima dos
   720px), por isso o único conteúdo da capa é o título, encostado ao fundo com
   20px de padding. Cabe à vontade em 160.

   A fronteira é 639.98 e não 640 pela mesma razão da grelha dos colaboradores:
   aos 640 exactos entram as regras de `min-width:640px` e as duas valiam ao
   mesmo tempo. */
@media (max-width:639.98px){
  /* Sem o título, a capa é só a fotografia — e 100px chegam para ela se ler
     como imagem. É o que liberta a altura de que o formulário precisava.
     É um PISO, não uma medida: a capa só desce até aqui quando o formulário
     não cabe de outra maneira. Num telemóvel de 844 de altura fica nos 182. */
  .pedido-capa{min-height:100px}

  /* O título sai — a capa passa a ser só imagem.

     `display:none` e não um recorte fora do ecrã: o `<dialog>` tem
     `aria-labelledby` a apontar directamente para este parágrafo, e um nó
     escondido que seja DIRECTAMENTE referenciado por `aria-labelledby` continua
     a contar para o nome acessível — é o que a especificação do accname manda e
     foi confirmado a ler a árvore de acessibilidade do browser: com o título a
     `display:none`, o popup continua a anunciar-se como «Pedido de Consulta».

     (Escrevi primeiro o contrário, convencido de que `display:none` matava o
     nome. Mata quando o texto é apanhado por herança; não mata quando é
     apontado à mão. Fica a nota para poupar a dúvida a quem vier a seguir.) */
  .pedido-capa-titulo{display:none}
}

@media (prefers-reduced-motion:no-preference){
  .pedido-popup[open]{animation:pedido-entra .25s ease}
}
@keyframes pedido-entra{from{opacity:0;transform:translateY(12px)}to{opacity:1;transform:none}}

/* Recurso sem JavaScript: a ligação existe no marcado mas não se vê; o JS
   remove-a de vez quando consegue abrir o popup. Fora do ecrã e não
   `display:none`, para continuar alcançável pelo teclado. */
.pedido-recurso{position:absolute;width:1px;height:1px;margin:-1px;padding:0;
                overflow:hidden;clip-path:inset(50%);white-space:nowrap}
.pedido-recurso:focus{position:fixed;top:1rem;right:1rem;z-index:70;
                      width:auto;height:auto;margin:0;padding:.6rem 1rem;
                      clip-path:none;background:var(--verde);color:#FFF}

/* ── Galeria da página /espaco (tipo `galeria-tres`) ─────────────────────────
   Cópia ASSUMIDA das regras `.espaco*` da homepage, com nome próprio. As duas
   secções desenham o mesmo hoje, mas são páginas diferentes com donos
   diferentes: partilhar as classes queria dizer que um retoque no herói da
   homepage mudava esta página sem ninguém pedir.

   A diferença que já existe: aqui a grelha é de TRÊS colunas fixas, porque o
   número vem do desenho e não do conteúdo. Com seis ou nove fotografias, o
   `auto-fit` da homepage dava quatro ou cinco por linha conforme a janela.
   Desdobra para 2 e para 1 antes de ficarem tiras verticais estreitas de mais. */
/* O espaçamento vive numa variável porque três regras mexem nele — a normal,
   a das galerias seguidas e a da última. Repetir o `clamp` nas três garantia
   que mais cedo ou mais tarde uma delas ficava para trás. */
.espaco-seccao{--espaco-pad:clamp(3.5rem,8vw,120px);
               padding:var(--espaco-pad) 0;text-align:center}
/* Duas galerias seguidas: a de baixo perde o espaçamento de topo, senão os
   120px dela somavam-se aos 120px de baixo da de cima e ficava um vão do
   tamanho de meio ecrã entre as duas.

   Selector de IRMÃO ADJACENTE (`+`) e não `:not(:first-child)`: o que
   interessa é ter uma galeria imediatamente antes, não ser a primeira da
   página. Com um banner ou uma introdução pelo meio, o espaçamento volta —
   que é o que se quer, porque aí há mesmo uma mudança de assunto. */
.espaco-seccao + .espaco-seccao{padding-top:0}
/* A ÚLTIMA leva mais 30px em baixo, para o rodapé não vir colado à última
   fila de fotografias. `:last-child` e não `:last-of-type`: o que interessa
   é não ter nada a seguir na página, e a seguir pode vir uma secção de
   qualquer outro tipo. */
.espaco-seccao:last-child{padding-bottom:calc(var(--espaco-pad) + 30px)}
.espaco-seccao-titulo{color:var(--verde);font-family:var(--f-titulo);
                      font-size:clamp(1.75rem,3vw,40px);font-style:normal;
                      font-weight:300;line-height:normal;margin:0}
.espaco-seccao-texto{max-width:1055px;margin:clamp(1rem,2vw,1.5rem) auto 0;
                     color:var(--verde);font-family:var(--f-corpo);
                     font-size:clamp(.875rem,1.2vw,16px);font-weight:300;line-height:1.5}
.espaco-seccao-texto p{margin:0 0 1rem}
.espaco-seccao-texto p:last-child{margin-bottom:0}

.espaco-seccao-grelha{display:grid;grid-template-columns:repeat(3,1fr);
                      gap:30px;margin:clamp(1.5rem,3vw,40px) 0 0;padding:0;list-style:none}
.espaco-seccao-grelha li{margin:0}
/* `aspect-ratio` e não altura fixa: 404/523 mantém o recorte do desenho em
   qualquer largura. O enquadramento vem do ponto focal escolhido no CMS. */
.espaco-seccao-grelha img{width:100%;height:auto;aspect-ratio:404/523;object-fit:cover;
                          display:block}
@media (max-width:820px){.espaco-seccao-grelha{grid-template-columns:repeat(2,1fr)}}
@media (max-width:520px){.espaco-seccao-grelha{grid-template-columns:1fr}}

.espaco-seccao-accao{margin:clamp(2.5rem,5.3vw,80px) 0 0}

/* ── Lupa: fotografia em grande (só na página /espaco) ───────────────────────
   Cada fotografia da grelha é uma LIGAÇÃO para o ficheiro. Sem JavaScript abre a
   imagem à mesma; com JavaScript, o clique é intercetado e abre este <dialog>.
   Nativo, pelas mesmas razões do popup do pedido de consulta: foco preso lá
   dentro, fecho por Esc, fundo inerte e `::backdrop` de fábrica. */
.espaco-seccao-lupa{display:block;cursor:zoom-in;overflow:hidden}
.espaco-seccao-lupa img{transition:transform .5s ease}
.espaco-seccao-lupa:hover img,
.espaco-seccao-lupa:focus-visible img{transform:scale(1.04)}
.espaco-seccao-lupa:focus-visible{outline:2px solid var(--verde);outline-offset:3px}
@media (prefers-reduced-motion:reduce){
  .espaco-seccao-lupa img{transition:none}
  .espaco-seccao-lupa:hover img,
  .espaco-seccao-lupa:focus-visible img{transform:none}
}

/* A caixa não tem fundo próprio: o que se vê é a fotografia sobre o `::backdrop`.
   `max-width/height:none` desfaz o limite que o browser põe por omissão nos
   `<dialog>` (calc(100% - 6px - 2em)), que aqui cortava a imagem. */
/* ⚠️ `width:fit-content` e NÃO `width:auto`.
   O browser dá ao <dialog> modal `inset:0` + `margin:auto` + `fit-content`, e é
   assim que ele fica encolhido à volta do conteúdo e centrado. Pôr `width:auto`
   num elemento posicionado com `left:0` E `right:0` manda-o esticar até às duas
   pontas — a caixa passava a ocupar o ecrã todo, e os botões, que estavam
   encostados às bordas dela por fora, iam parar fora da janela. Daí não se verem
   no desktop e verem-se no telemóvel, onde ficam por dentro.

   A GOTEIRA dos botões é agora `padding` da própria caixa, e não deslocamentos
   negativos. Assim entra no `fit-content` e os botões ficam sempre dentro do
   elemento, aconteça o que acontecer à largura da fotografia. */
.lupa{width:fit-content;max-width:none;height:fit-content;max-height:none;
      inset:0;margin:auto;padding:60px;border:0;background:none;
      overflow:visible;color:#FFF}
.lupa::backdrop{background:rgba(31,42,40,.9)}

/* A fotografia manda no tamanho, até onde a janela deixar. Os limites descontam
   os 60px de goteira de cada lado — 120px na horizontal e outros tantos na
   vertical — para a caixa inteira, botões incluídos, caber no ecrã. */
.lupa-foto{display:block;width:auto;height:auto;
           max-width:calc(100vw - 120px);max-height:calc(100dvh - 120px);
           border-radius:4px;background:var(--verde)}

.lupa-botao{position:absolute;z-index:2;display:flex;align-items:center;
            justify-content:center;width:44px;height:44px;padding:0;border:0;
            border-radius:50%;background:rgba(255,255,255,.14);color:#FFF;
            cursor:pointer;transition:background .2s}
.lupa-botao:hover{background:rgba(255,255,255,.28)}
.lupa-botao:focus-visible{outline:2px solid #FFF;outline-offset:2px}

/* Dentro da goteira de 60px: 8px de folga até à borda da caixa. */
.lupa-fechar{top:8px;right:8px}
.lupa-anterior{top:50%;left:8px;transform:translateY(-50%)}
.lupa-seguinte{top:50%;right:8px;transform:translateY(-50%)}

.lupa-conta{position:absolute;left:50%;bottom:18px;transform:translateX(-50%);
            margin:0;font-family:var(--f-corpo);font-size:14px;font-weight:300;
            color:rgba(255,255,255,.85);white-space:nowrap}

/* Em ecrã estreito não sobra largura para goteira: a caixa cola-se à fotografia
   e os botões passam a assentar por cima dela, com fundo para se lerem. */
@media (max-width:900px){
  .lupa{padding:0}
  .lupa-foto{max-width:calc(100vw - 2rem);max-height:calc(100dvh - 2rem)}
  .lupa-botao{background:rgba(31,42,40,.55)}
  .lupa-botao:hover{background:rgba(31,42,40,.8)}
  .lupa-conta{bottom:12px;padding:2px 12px;border-radius:12px;
              background:rgba(31,42,40,.55)}
}

/* Uma só fotografia não precisa de setas nem de contador. */
.lupa[data-unica] .lupa-anterior,
.lupa[data-unica] .lupa-seguinte,
.lupa[data-unica] .lupa-conta{display:none}

@media (prefers-reduced-motion:no-preference){
  .lupa[open]{animation:lupa-entra .2s ease}
}
@keyframes lupa-entra{from{opacity:0;transform:scale(.98)}to{opacity:1;transform:none}}

/* ── Aviso de cookies (11.º bloco do kit.js) ─────────────────────────────────
   Faixa encostada ao fundo, não uma janela modal: o aviso não pode prender quem
   está a ler a página — prendê-lo seria obrigar a decidir para poder ver o site,
   que é o que o RGPD não permite.

   `z-index:70` fica acima do cabeçalho preso (50) e do botão de pedido de
   consulta (60), que é o único conteúdo que lhe poderia passar por cima. */
.cookies{position:fixed;left:0;right:0;bottom:0;z-index:70;
         display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;
         gap:clamp(1rem,2vw,2rem);
         width:min(100% - 2rem, var(--wrap));margin:0 auto 1rem;
         padding:clamp(1rem,2vw,1.5rem) clamp(1.25rem,2.5vw,2rem);
         background:var(--branco);color:var(--verde);
         border:1px solid rgba(94,121,117,.35);border-radius:12px;
         box-shadow:0 8px 32px rgba(31,42,40,.18);
         /* Nasce fora do ecrã e entra com a classe `e-visivel` posta pelo JS. */
         transform:translateY(calc(100% + 1rem));opacity:0;
         transition:transform .35s ease, opacity .35s ease}
.cookies.e-visivel{transform:none;opacity:1}

.cookies-texto{flex:1 1 22rem;min-width:0}
.cookies-titulo{margin:0 0 .35rem;color:var(--verde);
                font-family:var(--f-titulo);font-size:clamp(1.125rem,1.6vw,20px);
                font-weight:300;line-height:1.2}
.cookies-texto p{margin:0;font-family:var(--f-corpo);
                 font-size:clamp(.8125rem,1.1vw,14px);font-weight:300;line-height:1.5}
.cookies-texto a{color:inherit;text-decoration:underline;text-underline-offset:.2em}

.cookies-accoes{display:flex;flex-wrap:wrap;gap:.75rem;flex:0 0 auto}
/* Os dois botões com o MESMO peso visual: um «recusar» apagado ao lado de um
   «aceitar» cheio é um empurrão, e o consentimento tem de ser livre. */
.cookies-accoes .btn{min-width:0;padding:.7rem 1.4rem;font-size:14px}
.btn--linha{background:none;border:1px solid var(--verde);color:var(--verde)}
.btn--linha:hover{background:rgba(var(--verde-rgb),.08)}

@media (max-width:640px){
  .cookies{margin-bottom:.5rem;width:calc(100% - 1rem)}
  .cookies-accoes{width:100%}
  .cookies-accoes .btn{flex:1 1 0}
}

@media (prefers-reduced-motion:reduce){
  .cookies{transition:none;transform:none;opacity:1}
}

/* A ligação do rodapé que reabre o aviso. Herda o resto do `.rodape a`. */
.rodape-cookies{background:none;border:0;padding:0;font:inherit;color:inherit;
                cursor:pointer;text-decoration:none}
.rodape-cookies:hover{text-decoration:underline}


/* ══ BOTÃO DE DESTAQUE DO CABEÇALHO ═════════════════════════════════════
   Acrescentado em 2026-08-10. O <li> é escrito pelo header.blade.php e só
   existe quando as duas Definições estiverem preenchidas. */
/*
   ONDE APARECE, e porquê (tudo medido, não estimado):
     · gaveta (≤1080px) ...... sempre, em todas as variantes
     · ≥1280px ............... sempre, em todas as variantes
     · 1081–1280px ........... não: falta até 182px de largura

   ⚠️ Este número depende da ALTURA do logótipo, e já mudou uma vez por isso.
   Com o `.marca img` a 90px o logótipo passa a 224px de largura e o limite tem
   de subir para 1360 — medido, aos 1290 faltavam 77px na home presa. A 80px, que
   é como está, 1280 chega. Mexer na altura da marca obriga a remedir isto.

   ⚠️ A primeira versão desta regra excluía a home «porque não cabia, faltavam
   15px mesmo a 1920px». Era falso: a maqueta onde isso foi medido tinha uma
   altura do logótipo escrita à mão no marcado, o que o fazia maior do que é.
   Corrigida a maqueta, a home cabe. Fica escrito porque o número parecia
   sólido e não era. */

/* O <li> não é item de navegação: não leva a altura nem o padding dos outros,
   senão o botão herdava a caixa deles e ficava colado ao topo. */
.cab-nav > ul > li.cab-cta { height: auto; padding: 0; align-self: center; }

.cab-cta > a {
  display: inline-flex; align-items: center; justify-content: center;
  height: auto; padding: 10px 22px; border-radius: var(--raio);
  border: 1px solid currentColor;
  font-family: var(--f-corpo); font-size: .95rem; font-weight: 400;
  line-height: 1.2; white-space: nowrap; opacity: 1;
  transition: background-color .2s ease, color .2s ease, border-color .2s ease;
}

/* Barra branca: verde cheio — o contraste maior possível sobre branco, e
   lê-se como botão à primeira. */
.cab--branca .cab-cta > a {
  background: var(--verde); border-color: var(--verde); color: var(--branco);
}
.cab--branca .cab-cta > a:hover,
.cab--branca .cab-cta > a:focus-visible {
  background: var(--verde-escuro); border-color: var(--verde-escuro);
}

/* Fundo verde ou fotografia: contorno claro. Um botão verde cheio
   desaparecia dentro da própria fotografia esverdeada. */
.cab--sobre .cab-cta > a,
.cab--solida .cab-cta > a {
  background: transparent; border-color: var(--branco); color: var(--branco);
}
.cab--sobre .cab-cta > a:hover,   .cab--sobre .cab-cta > a:focus-visible,
.cab--solida .cab-cta > a:hover,  .cab--solida .cab-cta > a:focus-visible {
  background: var(--branco); color: var(--verde);
}

/* O hover dos itens de menu põe fundo verde a 8%; este <li> não é item de
   menu e não o deve apanhar. */
.cab--branca .cab-nav > ul > li.cab-cta:hover { background: none; }

/* ── Acima da gaveta: só onde cabe ───────────────────────────────────────
   Regra base a esconder, e uma excepção estreita a mostrar. É ao contrário
   do instinto, mas é o que garante que nunca há transbordo: o que não foi
   medido fica de fora. */
@media (min-width: 1080.02px) {
  .cab-nav > ul > li.cab-cta { display: none; }
}
@media (min-width: 1280px) {
  .cab-nav > ul > li.cab-cta { display: inline-flex; }

  /* A marca NÃO encolhe. Sem isto o `.cab-in` (flex) espreme-a para dar lugar
     ao sexto elemento — e não transborda, engole a marca. Medido: na barra
     branca 224×90 passava a 164×66; na home era pior, 199×80 caía para 17×7.
     `:has(.cab-cta)` é o que garante que nada disto existe com os campos
     vazios. É também esta regra que faz o transbordo APARECER nas medições,
     em vez de ficar escondido atrás de um logótipo esmagado. */
  .cab-in:has(.cab-cta) > .marca { flex-shrink: 0; }

  /* Com o sexto elemento, o intervalo entre itens aperta: é ele que manda na
     largura do menu. Não se aplica à home solta, onde o intervalo já é 0 e o
     espaço vem do padding dos itens. */
  .cab--branca .cab-in:has(.cab-cta) .cab-nav > ul,
  .cab--sobre.cab--presa .cab-in:has(.cab-cta) .cab-nav > ul { gap: 24px; }

  /* Presa no topo, a home passa a barra BRANCA com texto verde (regra do kit).
     O contorno claro do estado solto ficaria branco sobre branco — o mesmo
     erro que a maqueta já tinha apanhado na gaveta. */
  .cab--sobre.cab--presa .cab-cta > a {
    background: var(--verde); border-color: var(--verde); color: var(--branco);
  }
  .cab--sobre.cab--presa .cab-cta > a:hover,
  .cab--sobre.cab--presa .cab-cta > a:focus-visible {
    background: var(--verde-escuro); border-color: var(--verde-escuro);
  }
}

/* ── Gaveta (≤1080px) ────────────────────────────────────────────────────
   O <li> é uma grelha de três colunas com o link ao centro. O botão segue a
   mesma coluna, para ficar no eixo dos outros itens, e ganha afastamento em
   cima que o separa da lista — é uma acção, não mais um item. */
@media (max-width: 1080px) {
  .cab-nav > ul > li.cab-cta {
    display: grid; grid-template-columns: 1fr auto 1fr; margin-top: 1.5rem;
  }
  .cab-cta > a { grid-column: 2; padding: .9rem 28px; font-size: 1.05rem; }

  /* ⚠️ Na gaveta o botão é VERDE CHEIO por omissão, incluindo na home — e não
     o contorno claro do desktop. Motivo: abaixo dos 1080px o `.cab--sobre`
     deixa de ser transparente e passa a barra BRANCA com texto verde (regra
     do kit, «a gaveta acompanha a barra»). O contorno branco desenhava um
     botão branco sobre fundo branco: invisível. Apanhado na maqueta.
     A `.cab--solida` é a excepção — essa mantém a gaveta verde. */
  .cab-nav .cab-cta > a {
    background: var(--verde); border-color: var(--verde); color: var(--branco);
  }
  .cab--solida .cab-nav .cab-cta > a {
    background: transparent; border-color: var(--branco); color: var(--branco);
  }
}

/* ── «Um espaço pensado para si» em CARROSSEL ───────────────────────────────
   Liga-se pelo bloco «Opções do carrossel» no CMS. Sem ele, a `.espaco-grelha`
   continua a grelha de sempre — a página /espaco não é tocada por nada disto.

   Três fotografias à vista, avanço de UMA de cada vez. A largura de cada uma sai
   de `--esp-vis` (quantas cabem) e do intervalo de 30px que a grelha já usava;
   mudar quantas se veem é mudar um número no media query, e o passo no kit.js
   acompanha sozinho porque lê a largura real do item.

   A pista é um `overflow-x` com `scroll-snap`, não um `transform`: dá de borla o
   arrastar com o dedo, a roda do rato e — o que interessa mesmo — continua a
   funcionar sem JavaScript, como uma tira que se arrasta. Um carrossel por
   `transform` sem JS é uma pilha de fotografias empilhadas umas em cima das
   outras. */
.espaco-carrossel{--esp-vis:3;--esp-gap:30px;position:relative;
                  margin:clamp(1.5rem,3vw,40px) 0 0}

.espaco-carrossel .espaco-grelha{display:flex;gap:var(--esp-gap);margin:0;
  overflow-x:auto;overscroll-behavior-x:contain;
  scroll-snap-type:x mandatory;scroll-behavior:smooth;
  scrollbar-width:none;-ms-overflow-style:none}
.espaco-carrossel .espaco-grelha::-webkit-scrollbar{display:none}
.espaco-carrossel .espaco-grelha:focus-visible{outline:2px solid var(--verde);outline-offset:4px}
.espaco-carrossel .espaco-grelha li{
  flex:0 0 calc((100% - (var(--esp-vis) - 1) * var(--esp-gap)) / var(--esp-vis));
  scroll-snap-align:start}

/* Setas sobre as fotografias das pontas, e não fora da grelha: a `.wrap` já está
   encostada aos 1272px, e setas por fora empurravam o conteúdo para dentro. */
.espaco-seta{position:absolute;top:50%;transform:translateY(-50%);z-index:2;
             display:flex;align-items:center;justify-content:center;
             width:52px;height:52px;padding:0;border:0;border-radius:100px;
             background:var(--branco);color:var(--verde);cursor:pointer;
             box-shadow:0 8px 24px rgba(31,42,40,.18);
             transition:background .2s,color .2s}
.espaco-seta svg{width:24px;height:24px}
.espaco-seta--ant{left:16px}
.espaco-seta--seg{right:16px}
.espaco-seta:hover{background:var(--verde);color:var(--branco)}
.espaco-seta:focus-visible{outline:2px solid var(--verde);outline-offset:3px}
.espaco-seta[hidden]{display:none}

/* Bolas: `button` a sério, não `span` com clique — assim o teclado e os leitores
   de ecrã chegam-lhes sem trabalho extra. */
.espaco-bolas{display:flex;justify-content:center;gap:12px;margin-top:32px}
.espaco-bolas[hidden]{display:none}
.espaco-bola{width:10px;height:10px;padding:0;border:0;border-radius:100px;cursor:pointer;
             background:rgba(var(--verde-rgb),.28);transition:background .2s,width .2s}
.espaco-bola[aria-selected="true"]{background:var(--verde);width:28px}
.espaco-bola:focus-visible{outline:2px solid var(--verde);outline-offset:3px}

@media (prefers-reduced-motion:reduce){
  .espaco-carrossel .espaco-grelha{scroll-behavior:auto}
  .espaco-seta,.espaco-bola{transition:none}
}

@media (max-width:1080px){
  .espaco-carrossel{--esp-vis:2;--esp-gap:20px}
}
@media (max-width:640px){
  /* Três de cada vez não cabe a 390px: cada fotografia ficava com ~110px. Uma. */
  .espaco-carrossel{--esp-vis:1;--esp-gap:16px}
  .espaco-seta{width:44px;height:44px}
  .espaco-seta--ant{left:8px}
  .espaco-seta--seg{right:8px}
}

/* ══ LISTAS VINDAS DO EDITOR ══════════════════════════════════════════════
   O Quill não usa `<ul>` para os pontos. Grava SEMPRE `<ol>` e distingue o
   tipo num atributo do item:

       <ol><li data-list="bullet">…</li></ol>      pontos
       <ol><li data-list="ordered">…</li></ol>     números

   No editor quem desenha o marcador é o CSS do Quill, a partir do
   `<span class="ql-ui">` que também vai gravado no conteúdo. No site esse CSS
   não existe — o span fica vazio, não desenha nada, e sobra o `<ol>` a numerar
   por omissão. Resultado: uma lista de pontos saía numerada.

   A regra vai no `li` e não no container de propósito. O `data-list` é
   exclusivo do Quill, por isso não apanha mais nada; e sendo declarada no
   próprio item, ganha ao `list-style` que o pai lhe passaria por herança —
   seja qual for a secção onde o texto rico caia. São treze sítios diferentes
   no tema; uma regra global evita treze cópias e o sítio que alguém esquecia. */
li[data-list="bullet"]  { list-style-type: disc; }
li[data-list="ordered"] { list-style-type: decimal; }

/* Níveis de indentação do editor. A escala é a do próprio Quill (1,5em por
   nível); sem isto uma lista encadeada saía toda ao mesmo nível. */
li[data-list].ql-indent-1 { margin-left: 1.5em; }
li[data-list].ql-indent-2 { margin-left: 3em; }
li[data-list].ql-indent-3 { margin-left: 4.5em; }

/* ══ TELEFONE NO TOPO DO HERÓI ═════════════════════════════════════════════
   Secção `telefone-topo` (Figma node 1309:406). Só existe quando a secção está
   na página E há número — ver a view.

   ANCORADA AO DOCUMENTO, não à secção. `position:absolute` sem antepassado
   posicionado (`#cms-page` não tem `position`) prende-a ao topo do documento,
   exactamente como a `.cab--sobre` faz com o cabeçalho. É isso que permite que a
   secção esteja em QUALQUER lugar da lista do CMS sem mudar nada à vista — a
   mesma escolha que já estava feita no «Pedido de Consulta».

   z-index 49, e não 51: abaixo do cabeçalho (z-50). Com 51, a pílula ficava POR
   CIMA da gaveta aberta no telemóvel, a pairar sobre o menu. */
.fone-topo{position:absolute;top:0;left:0;right:0;z-index:49;pointer-events:none}
/* Os 60px do desenho, medidos a partir do topo da página. O `.wrap` é a mesma
   coluna do cabeçalho, por isso a pílula alinha pela direita com o menu. */
.fone-topo-in{display:flex;justify-content:flex-end;padding-top:60px}
.fone-topo a{pointer-events:auto;
             display:inline-flex;align-items:center;gap:8px;
             padding:8px 16px;border-radius:25px;
             background:rgba(255,255,255,.1);
             color:var(--branco);text-decoration:none;
             /* POPPINS, e não a fonte de título: um número de telefone é para se
                ler de relance, e os algarismos da Playfair têm alturas diferentes
                umas das outras (é uma serifada com algarismos antigos) — «969 20
                20 20» sai ondulado. A mesma razão que passou o `.btn` para cá. */
             font-family:var(--f-corpo);font-weight:700;font-size:16px;line-height:1;
             white-space:nowrap;transition:background .2s}
.fone-topo a:hover,.fone-topo a:focus-visible{background:rgba(255,255,255,.22)}
/* O ícone é traçado, não preenchido: engrossa-se pelo `stroke-width`, não pelo
   tamanho. O partial `icone.blade.php` traz 1.5 como ATRIBUTO de apresentação, e
   qualquer regra CSS ganha a um atributo desses — por isso basta esta linha aqui,
   e o mesmo ícone continua fino no rodapé e nos contactos.
   3 no viewBox de 24, desenhado a 16px, dá 2px à vista — a par da haste da Poppins
   Bold ao lado. Com 1.5 dava 1px, que combinava com a Light de antes. */
.fone-topo svg{flex:0 0 auto;stroke-width:3}

/* ── Telemóvel ─────────────────────────────────────────────────────────────
   Abaixo dos 1080px o canto superior direito é do botão do menu. A pílula passa
   para BAIXO DO LOGÓTIPO, à esquerda: 24px de padding do cabeçalho + 80px de
   logótipo = 104px, mais 20px de folga. Continua à vista e continua a ligar ao
   toque — que é onde um número de telefone vale mais. */
@media (max-width:1080px){
  /* `justify-content` TEM de estar aqui: a regra base põe `flex-end`, e sem o
     trocar a pílula continuava encostada à direita — por baixo do botão do menu. */
  .fone-topo-in{justify-content:flex-start;padding-top:124px}
}

/* ── Recurso: página SEM herói ─────────────────────────────────────────────
   A secção foi desenhada para a home. Se alguém a acrescentar a uma página
   interior, a barra é BRANCA e o texto branco desaparecia. Aqui a pílula desce
   para baixo da barra (140px) e veste-se de verde. Não é desenho do Figma — é
   uma rede para não sair uma pílula invisível. */
body:has(.cab--branca) .fone-topo-in{padding-top:156px}
body:has(.cab--branca) .fone-topo a{background:rgba(var(--verde-rgb),.08);color:var(--verde)}
body:has(.cab--branca) .fone-topo a:hover,
body:has(.cab--branca) .fone-topo a:focus-visible{background:rgba(var(--verde-rgb),.16)}

/* ══ FICHA DO COLABORADOR ══════════════════════════════════════════════════
   Popup do Corpo Clínico (Figma node 1333:487 e vizinhos). Medidas do desenho:
   painel 896×1169, faixa de cabeçalho a rgba(94,121,117,.1) — que é o `--verde`
   a 10%, o mesmo token das migalhas —, fotografia 324×258 encostada ao canto,
   corpo com 137px de margem e o botão «Fechar» centrado ao fundo.

   `<dialog>` nativo: traz o fundo escurecido, o foco preso, o Esc e o
   `inert` no resto da página sem uma linha de JavaScript. É a mesma escolha
   que já estava feita no pedido de consulta. */
.colaborador-abrir{display:block;width:100%;padding:0;border:0;background:none;
                   color:inherit;font:inherit;text-align:inherit;cursor:pointer}
.colaborador-abrir:hover .colaborador-foto{opacity:.9}
.colaborador-abrir:hover .colaborador-nome{text-decoration:underline}
.colaborador-abrir .colaborador-foto{transition:opacity .2s}

/* A ficha tem a ALTURA DO SEU CONTEÚDO. Só rola quando não couber no ecrã — é
   o que o `overflow:auto` faz, mas só se o tecto não for artificial: estava
   `max-height:min(100% - 2rem, 1169px)`, e esse 1169px (a altura do painel no
   Figma) obrigava a rolar uma ficha comprida mesmo num ecrã com espaço de sobra.
   Fica só o limite da janela.

   `dvh` e não `vh`: no telemóvel a barra do browser aparece e desaparece, e com
   `vh` a ficha ficava mais alta do que a área visível justamente quando a barra
   estava à vista. A linha com `vh` fica por baixo como recurso para browsers
   antigos — a que eles não entendem é simplesmente ignorada. */
.ficha{position:relative;width:min(100% - 2rem,896px);
       height:auto;max-height:calc(100vh - 2rem);max-height:calc(100dvh - 2rem);
       padding:0;border:0;background:var(--branco);color:var(--texto);
       font-family:var(--f-corpo);font-weight:300;
       overflow:auto;overscroll-behavior:contain}
.ficha::backdrop{background:rgba(31,42,40,.55)}
/* O formulário do botão de fechar NÃO ocupa espaço: `sticky` com altura zero.
   Estava `float:right` no botão, e um flutuante antes da grelha do cabeçalho
   estreitava-lhe o conteúdo — a faixa deixava de ocupar a ficha toda. Assim o
   botão paira por cima e o `.ficha-topo` corre de ponta a ponta.
   `sticky` e não `absolute`: com biografia longa a ficha ganha barra de rolagem,
   e com `absolute` o botão de fechar subia para fora da vista. */
.ficha-fechar-form{position:sticky;top:0;z-index:2;height:0;margin:0}
/* 63×64 no desenho, a 29px da direita e 48px do topo. */
.ficha-fechar{position:absolute;top:48px;right:29px;
              display:grid;place-items:center;width:63px;height:64px;
              border:0;background:var(--branco);color:var(--verde);cursor:pointer}
.ficha-fechar:hover{background:var(--areia)}

.ficha-topo{display:grid;grid-template-columns:324px minmax(0,1fr);min-height:258px;
            width:100%;background:rgba(var(--verde-rgb),.1)}
.ficha-foto{width:324px;height:258px;object-fit:cover;display:block}
/* Tudo alinhado à ESQUERDA, e os três na cor da marca (PANTONE 5487 C = o token
   `--verde`). As medidas são as do Figma; a `line-height` de 48px é a mesma nos
   três — é ela que dá a escada regular do cabeçalho, e por isso é 120% no nome,
   200% na especialidade e 300% na cédula. */
.ficha-id{align-self:center;padding:0 92px 0 30px;text-align:left}
.ficha-nome{margin:0;color:var(--verde);font-family:var(--f-titulo);
            font-size:40px;font-style:normal;font-weight:300;line-height:48px}
.ficha-cargo{margin:0;color:var(--verde);font-family:var(--f-corpo);
             font-size:24px;font-style:normal;font-weight:300;line-height:48px}
.ficha-cedula{margin:0;color:var(--verde);font-family:var(--f-corpo);
              font-size:16px;font-style:normal;font-weight:300;line-height:48px}

/* À ESQUERDA, e dito aqui de propósito: a secção dos colaboradores tem
   `text-align:center` no `.colaborador`, e a ficha vive lá dentro — sem esta
   linha herdava o centrado e a biografia saía ao meio. */
.ficha-corpo{padding:31px 137px 0;text-align:left}
/* Peso 400 e não 300 como o resto dos títulos da ficha — é o que o desenho pede
   para este. A Playfair está declarada de 200 a 450, por isso o 400 tem face
   própria e não é sintetizado pelo browser. */
.ficha-h{margin:0 0 10px;color:var(--verde);font-family:var(--f-titulo);
         font-size:24px;font-style:normal;font-weight:400;line-height:48px}
/* Escrito por extenso, e não deixado à herança da `.ficha`: é o corpo de texto
   da ficha e o valor tem de estar visível junto de quem o vai ler. #465756 é o
   token `--texto`. */
.ficha-bio{max-width:621px;color:var(--texto);font-family:var(--f-corpo);
           font-size:16px;font-style:normal;font-weight:300;line-height:30px}
/* Listas vindas do editor: encostadas à esquerda, sem o avanço de origem.
   `list-style-position:inside` vai com o `padding-left:0` e não é opcional — a
   marca desenha-se por FORA da caixa do item, e sem avanço ficava fora do texto,
   por cima da margem da ficha (ou cortada, se houvesse `overflow`). Com `inside`
   passa a ocupar a primeira linha do próprio item. */
.ficha-bio ul,.ficha-bio ol{margin:0 0 1rem;padding-left:0;
                            text-align:left;list-style-position:inside}
.ficha-bio li{margin:0}
.ficha-bio p{margin:0 0 1rem}
.ficha-bio p:last-child{margin-bottom:0}
.ficha-bio a{color:var(--verde);text-decoration:underline;text-underline-offset:.2em}
/* Mesmas medidas da cédula (Poppins 16/48, `--verde`): está por baixo dela e
   pertence ao mesmo bloco de identificação, por isso segue a mesma escada. */
.ficha-redes{margin:0;color:var(--verde);font-family:var(--f-corpo);
             font-size:16px;font-style:normal;font-weight:300;line-height:48px}
.ficha-redes a{display:inline-flex;align-items:center;gap:8px;
               color:inherit;font:inherit;text-decoration:none}
.ficha-redes a:hover,.ficha-redes a:focus-visible{text-decoration:underline}
.ficha-accao{margin:0;padding:42px 0;text-align:center}
/* O botão do desenho tem 87px — o `.btn` do tema tem `min-width:243px`. */
.btn--curto{min-width:0}

@media (max-width:760px){
  .ficha-topo{grid-template-columns:1fr}
  .ficha-foto{width:100%;height:220px}
  .ficha-id{padding:20px 24px}
  /* A escada de 48px de entrelinha ocupa 144px só no cabeçalho — num ecrã
     estreito empurrava a biografia toda para fora da vista. Os tamanhos descem
     na mesma proporção do desenho (40/24/16 → 26/18/14). */
  .ficha-nome{font-size:26px;line-height:34px}
  .ficha-h{font-size:20px;line-height:32px}
  .ficha-cargo{font-size:18px;line-height:28px}
  .ficha-cedula,.ficha-redes{font-size:14px;line-height:26px}
  .ficha-corpo{padding:24px 24px 0}
  .ficha-accao{padding:24px 0 32px}
  /* Redondo e mais pequeno, por cima da fotografia: aqui a faixa passa a ocupar
     a largura toda e um quadrado branco de 63px no meio dela lia-se como falha. */
  .ficha-fechar{top:8px;right:8px;width:44px;height:44px;border-radius:50%}
}

/* ══ LISTAGEM DE DOCUMENTOS ════════════════════════════════════════════════
   Secção `documentos` (Figma node 104:248, fim de «A Clínica»).

   GRELHA de quatro colunas, com as medidas do desenho lidas nas posições dos
   nós: ícone a x=120 (início do wrap), nome a 229, descrição a 554, «Download»
   a 1205. Daí 109 + 325 + 651 + 187 = 1272, que é o `--wrap` exacto. Escritas
   em `fr` para acompanharem a coluna quando a janela aperta, em vez de ficarem
   presas aos 1272px. */
.documentos{padding:clamp(3.5rem,8vw,120px) 0 clamp(6.25rem,9.5vw,143px)}
.documentos--branco{background:var(--branco)}
.documentos--areia,.documentos--blue{background:var(--areia)}
.documentos--verde,.documentos--green{background:var(--verde)}
.documentos--verde-escuro,.documentos--black{background:var(--verde-escuro)}

/* À ESQUERDA. O nó do Figma traz `text-align:center`, mas centrado é dentro de
   uma caixa de 621px que lá está encostada ao início da coluna — no site, com
   o título a ocupar a `--wrap` inteira, isso punha-o a meio dos 1272px e
   desalinhado do texto que vem por baixo. */
.documentos-titulo{margin:0;color:var(--texto);text-align:left;font-family:var(--f-titulo);
                   font-size:40px;font-style:normal;font-weight:250;line-height:normal}
.documentos-texto{max-width:621px;margin:22px 0 0;color:var(--texto);
                  font-family:var(--f-corpo);font-size:16px;font-weight:300;line-height:30px}

.documentos-lista{list-style:none;margin:40px 0 0;padding:0}
/* A última coluna é `auto` — tem a largura do «Download» e mais nada —, e a
   descrição leva o `1fr`, ou seja todo o espaço que sobra. É isso que encosta o
   «Download» ao fim do wrap em qualquer largura, em vez de o deixar a flutuar
   nos 1205px do desenho com 107px de vazio à direita.

   As duas primeiras em PIXÉIS e já não em `fr`: assim o ícone e o nome ficam
   sempre nos 120 e 229 do desenho, em vez de encolherem proporcionalmente. */
.documentos-item{display:grid;grid-template-columns:109px 325px 1fr auto;
                 align-items:center;min-height:56px}
.documentos-item + .documentos-item{margin-top:24px}

/* Caixa de 50×58 com o verde a 10% por trás, e 16px de espaçamento interno —
   o que sobra para o glifo é 18×26. As duas medidas são dadas em separado de
   propósito: um `width:100%` no SVG esticava o traçado e a folha de papel ficava
   quadrada. `flex-shrink:0` porque a caixa é fixa e não deve ceder quando a
   descrição aperta a linha. */
.documentos-icone{display:inline-flex;justify-content:center;align-items:center;gap:10px;
                  width:50px;height:58px;padding:16px;flex-shrink:0;
                  background:rgba(var(--verde-rgb),.10);color:var(--texto)}
.documentos-icone svg{display:block;width:18px;height:24px}

.documentos-id{min-width:0}
/* ⚠️ Pesos 600 (nome) e 700 («Download»), como pedido no desenho. A Poppins só
   está declarada a 300, 400 e 500 nesta pasta — não há ficheiro para o 600 nem
   para o 700, por isso o browser ENGROSSA o 500 por conta própria e o traço sai
   diferente em cada browser. Resolve-se juntando Poppins-SemiBold.woff2 e
   Poppins-Bold.woff2 a themes/clinicamedicavita/fonts/ e declarando-as no topo
   deste ficheiro (a licença SIL OFL permite-o, e já está na pasta). */
.documentos-nome{margin:0;color:var(--texto);font-family:var(--f-corpo);
                 font-size:16px;font-style:normal;font-weight:600;line-height:normal}
.documentos-meta{margin:0;color:var(--texto);font-family:var(--f-corpo);
                 font-size:16px;font-weight:300;line-height:normal}
.documentos-desc{margin:0;color:var(--texto);font-family:var(--f-corpo);
                 font-size:16px;font-weight:300;line-height:normal;padding-right:24px}

/* `padding-right` e não `margin`: a caixa continua encostada ao fim do wrap — é
   o TEXTO que recua 20px. Assim o alvo de clique mantém a largura toda até à
   margem, e o sublinhado não fica colado à beira da coluna. */
.documentos-baixar{justify-self:end;padding-right:10px;
                   color:var(--texto);font-family:var(--f-corpo);
                   font-size:16px;font-style:normal;font-weight:700;line-height:normal;
                   text-decoration-line:underline;text-decoration-style:solid;
                   text-decoration-thickness:auto;text-decoration-skip-ink:auto;
                   text-underline-offset:auto;text-underline-position:from-font}
.documentos-baixar:hover,.documentos-baixar:focus-visible{text-decoration:none}

/* Fundo escuro: tudo inverte, senão fica texto escuro sobre verde. */
.documentos.e-escura .documentos-titulo,
.documentos.e-escura .documentos-texto,
.documentos.e-escura .documentos-icone,
.documentos.e-escura .documentos-nome,
.documentos.e-escura .documentos-meta,
.documentos.e-escura .documentos-desc,
.documentos.e-escura .documentos-baixar{color:var(--branco)}

/* ── Tablet ───────────────────────────────────────────────────────────────
   A descrição é a primeira a ceder: passa para baixo do nome, na largura toda
   da linha, e o «Download» sobe para junto do nome. Quatro colunas a 900px
   davam uma descrição de 40 caracteres partida em seis linhas. */
@media (max-width:1100px){
  .documentos-item{grid-template-columns:74px 1fr auto;
                   align-items:start;row-gap:6px;padding-bottom:24px;
                   border-bottom:1px solid rgba(var(--verde-rgb),.15)}
  /* Colocação EXPLÍCITA das quatro peças. Sem isto o «Download» não tinha lugar
     marcado, e a colocação automática mandava-o para uma terceira linha na
     coluna do ícone — medido: x=48 em vez de encostado à direita. */
  .documentos-icone{grid-column:1;grid-row:1/3}
  .documentos-id{grid-column:2;grid-row:1}
  /* Sem o recuo do desktop: abaixo dos 1100px a coluna é `auto` e o espaço à
     direita é a goteira do wrap, que já chega. */
  .documentos-baixar{grid-column:3;grid-row:1;align-self:center;justify-self:end;padding-right:0}
  .documentos-desc{grid-column:2/4;grid-row:2;padding-right:0}
  .documentos.e-escura .documentos-item{border-bottom-color:rgba(255,255,255,.25)}
}
/* ── Telemóvel ────────────────────────────────────────────────────────────
   O «Download» passa para linha própria: ao lado do nome sobravam-lhe ~90px, e
   um alvo de toque espremido contra a margem falha-se mais vezes do que se
   acerta. */
@media (max-width:640px){
  .documentos-titulo{font-size:clamp(1.75rem,7vw,40px)}
  /* `column-gap` explícito: a coluna do ícone passa a ter a largura EXACTA da
     caixa (50px), por isso não sobra nada entre ela e o nome — ao contrário das
     larguras maiores, onde a coluna é 109px ou 74px e o intervalo vem da folga
     que sobra dentro dela. Sem isto, o ícone ficava colado ao texto. */
  .documentos-item{grid-template-columns:50px 1fr;column-gap:16px}
  /* As três posições do tablet TÊM de ser repostas — a media query dos 1100px
     continua a valer aqui, e sem isto o «Download» ficava na linha do nome,
     encostado à direita (medido: x=325 numa coluna de 332px, colado ao título). */
  .documentos-icone{grid-column:1;grid-row:1;width:50px}
  .documentos-id{grid-column:2;grid-row:1}
  .documentos-desc{grid-column:2;grid-row:2}
  .documentos-baixar{grid-column:2;grid-row:3;justify-self:start;margin-top:6px}
}

/* ── Gaveta: o rectângulo alto não se aplica ─────────────────────────────────
   O rectângulo que desce até ao fundo da barra é do menu HORIZONTAL. Abaixo dos
   1080px os itens estão EMPILHADOS: descer 50px punha o fundo de um item por
   cima do seguinte.

   Este bloco tem de vir no FIM do ficheiro. Dentro do `@media (max-width:1080px)`
   lá de cima perdia para `.cab--sobre.cab--presa …::before`, que é declarado
   depois e com a mesma especificidade — uma media query não acrescenta peso.

   O realce em si já vive no <a> na gaveta (ver o bloco dos 1080px); aqui só se
   desliga o pseudo-elemento e a compensação do submenu. */
@media (max-width:1080px){
  .cab--branca .cab-nav>ul>li::before,
  .cab--sobre.cab--presa .cab-nav>ul>li::before{content:none}
  .cab--branca .cab-nav>ul>li>.sub,
  .cab--sobre.cab--presa .cab-nav>ul>li>.sub{top:auto}
}
