/* ── CANTOS ────────────────────────────────────────────────────────────────
   Este desenho NÃO tem cantos redondos. As únicas excepções são os BOTÕES e
   os RÓTULOS/pastilhas (que levam `999px`, e são redondos de propósito porque
   a forma é que os distingue do texto à volta) e os RETRATOS (`50%`, que são
   círculos).

   Tudo o resto — cartões, painéis, caixas de diálogo, menus, campos de
   formulário, chamadas — fecha em canto vivo. Onze `border-radius` foram
   retirados a 26/08/2026 por terem entrado um a um sem ninguém decidir que o
   desenho mudara: cartão de opinião, campo da newsletter, caixa de parceiros
   vazia, painel ECO FAST, campo da conta, diálogo da conta, painel e lista do
   menu da conta, mensagens do RCP, chamada Premium e item da fila de opinião.

   Antes de acrescentar um `border-radius` novo: é botão ou rótulo? Se não é,
   não leva.
   ────────────────────────────────────────────────────────────────────────── */

/* ──────────────────────────────────────────────────────────────────────────
   Camada de componentes do ECO
   ──────────────────────────────────────────────────────────────────────────

   Onde é que o CSS vive, agora que há uma regra:

     theme.json            tokens (paleta, tipografia, espaçamento) e estilos
                           de blocos do core. Nada de componentes.
     assets/css/components.css   ESTE ficheiro — cartões, etiquetas, botões,
                           títulos de secção, miniaturas. Carregado no site e
                           também no editor (add_editor_style), por isso o que
                           se vê no editor é o que sai no ecrã.
     style.css             cromo do site: barra SAPO, cabeçalho, rodapé.
     inc/*.php             só o que precisa de resolver um URL em PHP
                           (brand-decor.php e a marca de água da faixa verde).

   Convenção: prefixo `eco-`, `__elemento`, `--modificador`.

   ── Porquê os `:is(.eco-x, .is-style-eco-x)` ───────────────────────────────

   Há duas maneiras de um componente chegar ao ecrã e as duas têm de dar o
   mesmo resultado:

     1. um padrão do tema escreve `"className":"eco-card eco-card--vertical"`;
     2. alguém escolhe "Cartão vertical" no painel Estilos do editor, e aí
        quem manda é o core — gera `is-style-eco-card--vertical` e não nos
        pergunta nada (ver inc/block-styles.php).

   Daí o par. Cada variante é autónoma de propósito: não depende da classe
   base `.eco-card`, porque no caminho 2 essa classe não existe.

   ── Ausências ─────────────────────────────────────────────────────────────

   Tudo é tolerante à falta de partes. Uma categoria, um título ou um
   subtítulo podem não existir (cartões de citação sem título, cartões do
   Radar de Preços sem antetítulo). Por isso os espaçamentos saem de `* + *`
   e de adjacências, nunca de `:first-child`/`:nth-child` — um filho que
   falte não deixa buraco.

   Os elementos internos dos cartões não levam classe: são apanhados pelas
   classes do core (`.wp-block-post-title`, `.wp-block-post-terms`, …). Assim
   um padrão só precisa de uma classe no contentor e larga os atributos
   inline que tinha a repetir doze vezes.
   ────────────────────────────────────────────────────────────────────────── */


/* ──────────────────────────────────────────────────────────────────────────
   0. Alisamento de tipos
   ──────────────────────────────────────────────────────────────────────────
   Por omissão o macOS engorda o texto claro sobre fundo escuro e o texto
   pequeno em negrito, e é isso que faz as etiquetas e os botões lerem-se mais
   pesados aqui do que no desenho — que foi feito no Figma, que já alisa.
   Sem isto, baixar o peso de 700 para 600 corrige o Mac e deixa o Windows
   leve de mais; com isto, o mesmo valor serve os dois.
   ────────────────────────────────────────────────────────────────────────── */

body {
	-webkit-font-smoothing: antialiased;
	-moz-osx-font-smoothing: grayscale;
}


/* ──────────────────────────────────────────────────────────────────────────
   1. Antetítulos (kicker)
   ──────────────────────────────────────────────────────────────────────────
   O texto de categoria em maiúsculas que abre quase todos os cartões. Estava
   escrito à mão como atributos inline em doze sítios; agora é uma classe.
   ────────────────────────────────────────────────────────────────────────── */

/* Caixa de frase e não maiúsculas: no desenho lê-se "Categoria X" em todos os
   cartões da homepage (medido em pages-desktop/ECO homepage.png — #00672C,
   14px, sem transformação). Em maiúsculas o antetítulo passava a ler-se como
   um rótulo de secção e competia com o título do cartão. */
:is(.eco-kicker, .is-style-eco-kicker) {
	color: var(--eco-accent-text);
	font-size: var(--wp--preset--font-size--small);
	font-weight: 600;
	line-height: 1.2;
}

:is(.eco-kicker, .is-style-eco-kicker) a {
	color: inherit;
	text-decoration: none;
}

:is(.eco-kicker, .is-style-eco-kicker) a:hover {
	text-decoration: underline;
}

/* Sobre imagem escura (cartão destaque) o verde não se lê: passa a branco. */
.eco-kicker--inverse,
.eco-kicker--inverse a {
	color: var(--wp--preset--color--base);
}

/* A etiqueta de categoria aparece sublinhada por herdar o estilo de link;
   no desenho é texto limpo. (Vinha de style.css.) */
.eco-eyebrow a,
.wp-block-post-terms a {
	text-decoration: none;
}

.eco-eyebrow a:hover,
.wp-block-post-terms a:hover {
	text-decoration: underline;
}


/* ──────────────────────────────────────────────────────────────────────────
   2. Etiquetas
   ──────────────────────────────────────────────────────────────────────────
   Pílula. As variantes pintam o próprio elemento (serve para parágrafos,
   como o chip de tema); `--brand` é a excepção e pinta cada link lá dentro,
   porque um bloco post-terms com dois termos tem de dar duas pílulas e não
   uma só à volta das duas.
   ────────────────────────────────────────────────────────────────────────── */

.eco-label,
:is(.eco-label--topic, .is-style-eco-label--topic),
:is(.eco-label--exclusive, .is-style-eco-label--exclusive),
.eco-topic-chip {
	display: inline-block;
	width: fit-content;
	max-width: 100%;
	margin: 0;
	border-radius: 999px;
	/* 22px de altura no desenho, contra os 29px que isto tinha: a pastilha
	   media 100×22 (pages-desktop/ECO homepage.png).

	   10px de cada lado e não 12: a pastilha "Empresas" do artigo mede 83×22
	   para um texto de ~62px, o que dá 10,5 de folga por lado. Com 12 a pílula
	   ficava com uma coroa de fundo à volta da palavra em vez de a vestir. */
	padding: 2px 10px;
	background: var(--wp--preset--color--surface);
	color: var(--wp--preset--color--ink);
	font-size: var(--wp--preset--font-size--small);
	font-weight: 600;
	line-height: 1.3;
	/* Nenhuma etiqueta do desenho está em maiúsculas — nem a de categoria,
	   nem a de tema, nem "Em Direto". Em versaletes a etiqueta gritava mais
	   do que o título que devia estar a servir. */
	letter-spacing: 0;
}

.eco-label a,
:is(.eco-label--topic, .is-style-eco-label--topic) a,
.eco-topic-chip a {
	color: inherit;
	text-decoration: none;
}

/* Exclusivo — o selo do desenho: verde escuro da marca, letra branca.
   Amostrado nas referências (`report screens/Group 39/40/41/42/12/38.png`) a
   28/08/2026, isolando a coluna da pastilha da coluna da categoria ao lado,
   que também é verde e confundia a medição:

       pastilha ......... rgb(0, 103, 44) = `primary-dark`
       letra dela ....... rgb(255, 255, 255)
       categoria ao lado  rgb(0, 103, 44) em texto, sem caixa

   ── Isto era PRETO, e a razão de o ser não se confirmou ───────────────────
   O comentário anterior dizia «invertido, para saltar à vista por cima de uma
   imagem». A intenção era boa, mas as referências mostram a pastilha verde
   TAMBÉM por cima de fotografia — no `Group 12` ela está sobre a imagem, a
   y=438 de 564, e é verde na mesma. Ou seja, o preto resolvia um problema que
   o desenho resolve de outra maneira.

   Usa `--eco-accent-text` e não o verde escrito à mão, para o selo seguir a
   marca: numa home de canal o "Exclusivo" sai na cor dessa marca, como todas
   as outras pastilhas cheias já saem. */
:is(.eco-label--exclusive, .is-style-eco-label--exclusive) {
	background: var(--eco-accent-text);
	color: var(--wp--preset--color--base);
	padding: 2px 10px;
}

/* ── Categoria ────────────────────────────────────────────────────────────
   A pastilha que abre quase todos os cartões do desenho. Veste a cor da
   marca do termo: eRadar azul, Local Online amarelo, Advocatus preto.

   A cor não está aqui — chega em `--eco-label-bg`/`--eco-label-text`, que
   inc/brands.php declara por slug a partir do registo de marcas, e que um
   filtro no post-terms pendura em cada termo. Assim um artigo com duas
   categorias dá duas pastilhas de cores diferentes, e acrescentar uma marca
   é uma linha no registo e mais nada.

   O recuo é a cor neutra para categorias sem marca (Política, Empresas). */
:is(.eco-label--categoria, .is-style-eco-label--categoria) {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	gap: 6px;
	background: none;
	padding: 0;
	text-transform: none;
	letter-spacing: 0;
}

/* Um artigo com duas categorias dá duas pastilhas, e o core mete-lhes uma
   vírgula pelo meio. Entre duas pastilhas a vírgula fica a pairar no meio do
   nada — quem separa agora é o espaço. */
:is(.eco-label--categoria, .is-style-eco-label--categoria) .wp-block-post-terms__separator {
	display: none;
}

:is(.eco-label--categoria, .is-style-eco-label--categoria) a {
	display: inline-block;
	border-radius: 999px;
	padding: 2px 10px;
	background: var(--eco-label-bg, var(--wp--preset--color--surface));
	color: var(--eco-label-text, var(--wp--preset--color--ink));
	font-size: var(--wp--preset--font-size--small);
	font-weight: 600;
	line-height: 1.3;
	text-decoration: none;
}

:is(.eco-label--categoria, .is-style-eco-label--categoria) a:hover {
	text-decoration: none;
	opacity: .85;
}

/* ── A pastilha do artigo ─────────────────────────────────────────────────
   O antetítulo da peça é a mesma pastilha de categoria, mas vestida com a cor
   do tema em vez do recuo neutro: verde-escuro com letra clara, medido no
   desenho (pages-desktop/ECO artigo.png — fundo #00672C, que é o
   `--eco-accent-text`). Era texto verde solto e lia-se como um antetítulo de
   cartão, quando ali é a etiqueta que diz de que secção é a peça.

   As cores entram como valores por omissão no contentor e não no `<a>`: assim
   uma categoria com marca própria continua a mandar — a regra que
   inc/brands.php gera está no próprio link e ganha à herança. Uma peça de
   Capital Verde mantém o azul da marca; uma de Empresas fica verde-escura.

   O tema de secção também passa por aqui sem nada mais: `--eco-accent-text`
   muda com a vertical e a pastilha muda com ele. */
:is(.eco-label--cheia, .is-style-eco-label--cheia) {
	--eco-label-bg: var(--eco-accent-text);
	--eco-label-text: var(--wp--preset--color--base);
}

/* A mesma caixa da pastilha comum — o que a distingue é a cor e o peso, não o
   tamanho. Medida no desenho: 22px de altura e ~10px de folga lateral, tanto a
   do artigo ("Empresas", 79×22 para 65px de texto) como a das colunas de temas
   ("Categoria X", 96×22 para 76). A 4px/14px saía com 26 de altura — quase um
   botão. */
:is(.eco-label--cheia, .is-style-eco-label--cheia) a {
	padding: 2px 10px;
	font-weight: 700;
}

/* A mesma pastilha sem link por baixo — é o caso das colunas de "Temas em
   Destaque", onde o rótulo é texto e não um termo. As variáveis acima só
   chegam ao `<a>`; aqui a cor é posta na própria caixa.

   O selector exclui a de categoria de propósito: nessa, a caixa é só o
   contentor dos termos e pintá-la dava um retângulo verde à volta das
   pastilhas. */
:is(.eco-label--cheia, .is-style-eco-label--cheia):not(.eco-label--categoria):not(.is-style-eco-label--categoria) {
	background: var(--eco-label-bg);
	color: var(--eco-label-text);
	padding: 2px 10px;
	font-weight: 700;
}

/* Marca (Nossas Marcas): contorno em vez de fundo cheio, e caixa normal —
   são nomes próprios ("ECOseguros"), não categorias em maiúsculas. */
:is(.eco-label--brand, .is-style-eco-label--brand),
.eco-brand-pill {
	background: none;
	padding: 0;
	text-transform: none;
	letter-spacing: 0;
}

:is(.eco-label--brand, .is-style-eco-label--brand) a,
.eco-brand-pill a {
	display: inline-block;
	background: var(--wp--preset--color--surface);
	border: 1px solid var(--wp--preset--color--border);
	border-radius: 999px;
	padding: 2px 10px;
	text-decoration: none;
	color: var(--wp--preset--color--ink);
	font-weight: 700;
}

/* ── "Em Direto" ───────────────────────────────────────────────────────────
   Pílula vermelha de 22px com texto branco. Medido no sprite: 98×22, fundo
   #E05E5E (preset `negative`), ponto de 8px a 8px da esquerda, 8px de
   intervalo até ao texto.

   `width:fit-content` e não `display:inline-flex`: o core aplica
   `display:flex` com dois níveis de classe e ganharia à regra do tema — a
   pílula esticava-se aos 1360px da coluna. (Vinha de style.css.) */
.eco-label--live,
.eco-live-badge {
	/* A folga lateral é aqui e não no markup do padrão: é a mesma medida que
	   posiciona as ondas do sonar, e escrita nos dois sítios saía do sítio
	   quando um deles mudasse. */
	--eco-live-pad: 18px;
	position: relative;
	width: fit-content;
	max-width: 100%;
	align-items: center;
	/* Mais larga e menos alta: no desenho a pílula mede 127×32 e o texto lá
	   dentro é maior do que o de uma etiqueta comum. A altura vem da folga
	   lateral e do corpo do texto, não de uma altura mínima que sobrava por
	   cima e por baixo das letras. */
	min-height: 30px;
	padding: 0 var(--eco-live-pad);
	border-radius: 999px;
	font-size: var(--wp--preset--font-size--medium);
	/* Herdava as maiúsculas de `.eco-label` e saía "EM DIRETO"; no desenho é
	   "Em Direto" em caixa de frase. */
	text-transform: none;
	letter-spacing: 0;
}

.eco-label--live p,
.eco-live-badge p {
	display: inline-flex;
	align-items: center;
	margin: 0;
	line-height: 1;
	white-space: nowrap;
}

/* O núcleo do ponto tem 8px e não se mexe; o que anima são os anéis à volta. */
.eco-label--live p::before,
.eco-live-badge p::before {
	content: "";
	display: inline-block;
	flex: none;
	width: 8px;
	height: 8px;
	margin-right: 8px;
	border-radius: 50%;
	background: currentColor;
}

/* ── O sonar ──────────────────────────────────────────────────────────────
   Réplica do efeito de referência (codepen.io/xmalinov/pen/VKrYox): não é um
   anel a expandir-se, é um comboio de ondas cheias — discos da cor do
   emissor, a partir da opacidade 0,4, a crescer até 3× e a apagar-se, com uma
   onda nova de meio em meio segundo e andamento linear. É a cadência que faz
   o gesto ler-se como sonar; uma onda sozinha lê-se como um clique.

   São duas e não as quatro da referência, e mais devagar do que lá: aquilo é
   um emissor de 160px numa página vazia, isto é um ponto de 8px ao lado de
   duas palavras. À escala do distintivo, quatro ondas de meio em meio segundo
   davam uma mancha em movimento constante a competir com a manchete que a
   pílula está a anunciar. Uma onda de 1,8 em 1,8 segundos deixa cada uma
   completar o seu percurso antes de a seguinte sair.

   O andamento também não é o linear da referência: `ease-out` abre depressa e
   trava no fim, que é como uma onda se propaga — a linear, a 3,6s, via-se o
   disco a arrastar-se a velocidade constante.

   Ficam presas ao ponto pela mesma medida que dá a folga da pílula
   (`--eco-live-pad`), mais os 4px do raio do ponto. Absolutas, não entram na
   caixa flex nem empurram o texto.

   Não podem ir para trás do emissor como na referência (lá, `z-index:-1`):
   aqui o "emissor" está por cima do fundo vermelho da própria pílula, e uma
   onda atrás dele desaparecia debaixo desse fundo. Ficam à frente, e como são
   da cor do ponto e translúcidas dá no mesmo.

   A cor sai de `currentColor`: trocar a cor do bloco no editor troca também
   as ondas. */
.eco-label--live::before,
.eco-label--live::after,
.eco-live-badge::before,
.eco-live-badge::after {
	content: "";
	position: absolute;
	left: var(--eco-live-pad);
	top: 50%;
	width: 8px;
	height: 8px;
	margin-top: -4px;
	border-radius: 50%;
	background: currentColor;
	opacity: 0;
	pointer-events: none;
	animation: eco-live-sonar 3.6s cubic-bezier(.16, .7, .3, 1) infinite;
}

/* Meio ciclo de atraso: é o que mantém o intervalo constante entre ondas. */
.eco-label--live::after,
.eco-live-badge::after {
	animation-delay: 1.8s;
}

/* A opacidade apaga-se antes do fim do percurso: uma onda que ainda se vê
   quando pára de crescer termina de repente. Assim chega ao fim já apagada e
   o recomeço não tem costura. */
@keyframes eco-live-sonar {
	0%   { transform: scale(1); opacity: .34; }
	75%  { opacity: .04; }
	100% { transform: scale(3); opacity: 0; }
}

/* Um sinal que pisca sem parar é desconfortável para quem pediu menos
   movimento; o ponto fica, as ondas saem. */
@media (prefers-reduced-motion: reduce) {
	.eco-label--live::before,
	.eco-label--live::after,
	.eco-live-badge::before,
	.eco-live-badge::after {
		display: none;
	}
}


/* ──────────────────────────────────────────────────────────────────────────
   3. Títulos de secção
   ──────────────────────────────────────────────────────────────────────────
   O filete e o espaço por cima passam a viver no próprio título e não no
   grupo da secção — era o que obrigava a repetir as mesmas linhas de
   `border` e `padding` inline em cada padrão.

   A seta "→" também deixa de ser um caractere escrito à mão: aparece
   sozinha quando o título é um link e desaparece quando não é. Nunca mais
   há um "→" pendurado num título que não vai a lado nenhum.
   ────────────────────────────────────────────────────────────────────────── */

/* Medido em docs/reference-snapshots/pages-desktop/ECO homepage.png: filete
   verde da marca (#00C353) por cima, rótulo pequeno em verde-texto (#00672C)
   em caixa de frase, e um "+" numa pastilha redonda cinzenta.

   Não é um título grande em ink com uma seta — era o que o tema tinha e não
   está em lado nenhum do desenho. O peso da secção vem do filete verde, não
   do corpo de letra. */
:is(.eco-section-title, .is-style-eco-section-title) {
	display: flex;
	align-items: center;
	gap: .5rem;
	margin-top: 0;
	/* 2px: no desenho as linhas y2028 e y2029 são ambas #00C353. */
	border-top: 2px solid var(--eco-accent);
	/* 8px e não 12: nos dez títulos de secção da homepage o desenho põe 9-10px
	   entre o filete e o primeiro pixel de letra. Com 12 de folga mais a
	   entrelinha do rótulo iam 16, e o filete deixava de se ler como a linha
	   daquela secção para passar a linha a fechar a anterior. */
	padding-top: var(--wp--preset--spacing--20);
	font-family: var(--wp--preset--font-family--sans);
	font-size: var(--wp--preset--font-size--small);
	font-weight: 700;
	line-height: 1.2;
	color: var(--eco-section-title-color, var(--eco-accent-text));
	/* Folga por baixo, por omissão. Não estava declarada e o que se via era o
	   que cada contentor desse: medido a 26/08/2026, a homepage e o /ultimas/
	   davam 24px pelo blockGap e as homes de canal davam **12** — onze títulos
	   em doze. O padrão do site já era 24; o que faltava era estar escrito.

	   As margens de irmãos colapsam em fluxo normal, por isso onde já havia 24
	   continua 24 e não passa a 48. */
	margin-bottom: var(--wp--preset--spacing--50);
}

:is(.eco-section-title, .is-style-eco-section-title) a {
	display: inline-flex;
	align-items: center;
	gap: .5rem;
	color: inherit;
	text-decoration: none;
}

:is(.eco-section-title, .is-style-eco-section-title) a:hover {
	text-decoration: underline;
}

/* A pastilha do "+" é desenhada e não escrita: um "+" no texto ia parar aos
   leitores de ecrã e ao resumo do motor de busca como parte do nome da
   secção ("Mercados +"). */
/* Pastilha de 16px com o "+" a ocupar metade dela — medido no desenho:
   círculo de 16px, glifo de 8px (rácio 0,50). Estava a 20px de círculo para
   5px de glifo (0,25) e o sinal perdia-se lá dentro. */
:is(.eco-section-title, .is-style-eco-section-title) a::after {
	content: "+";
	flex: none;
	display: inline-flex;
	align-items: center;
	justify-content: center;
	width: 1rem;
	height: 1rem;
	border-radius: 999px;
	background: var(--wp--preset--color--surface);
	color: var(--eco-accent-text);
	font-size: 1.3em;
	font-weight: 400;
	line-height: 1;
	text-decoration: none;
}

/* ──────────────────────────────────────────────────────────────────────────
   As secções de uma GRELHA — o ritmo, e só o ritmo
   ──────────────────────────────────────────────────────────────────────────

   Aqui esteve, durante algumas horas de 26/08/2026, um título de secção a
   `xx-large` (40px) na cor do canal. Foi retirado, e vale a pena dizer porquê
   para não voltar.

   A queixa que o originou era real — "não vejo os títulos" numa home de
   canal. O diagnóstico é que estava errado. Mediu-se a PRODUÇÃO
   (`.grid-block__section-title` em eco.sapo.pt/advocatus/ = 41px) e tratou-se
   isso como especificação. A produção é o site que estamos a substituir, não
   a fonte de desenho. No Figma os rótulos de secção medem **14px**, sem uma
   única excepção — `Opinião` 53×14, `Mercados` 67×14, `Política` 52×14,
   `Especiais` 65×14, `Temas em Destaque` 136×14. O único texto de secção
   maior no ficheiro é o `Política` a 44px do cabeçalho de arquivo de
   categoria, que tem 1360 de largura e um resumo por baixo: é título de
   página, não rótulo de fila.

   O que estava partido era o ESPAÇO, não a letra. Uma `.eco-bloco` é um
   `wp-block-group` e mais nada, por isso o único espaço entre secções era o
   `blockGap` da raiz: 16px. Vinte e quatro secções a 16px são uma coluna
   contínua sem juntas, e um rótulo de 14px a meio disso não se lê como o
   título da fila de baixo — lê-se como a última linha da fila de cima.

   Portanto: se os títulos voltarem a parecer pouco visíveis, o que se mexe é
   o espaço à volta deles, ou o filete, ou a cor — nunca o corpo de letra. O
   peso de uma secção vem do filete verde, não do tamanho da letra, e isso já
   estava escrito no tema antes de alguém lhe passar por cima.

   ── 27/08/2026: 64px fixos passaram a 80→144 fluidos ─────────────────────

   Os 64px (`spacing|80`) foram postos aqui a olho, por serem o que o rodapé
   já usava. Mediu-se agora, com o `npm run espacos` (visual-tests), o espaço
   REAL entre secções — da última coisa desenhada de uma à primeira da
   seguinte — nas dez homes de canal, dos dois lados:

                        produção        nós (64px)     falta
     desktop 1440px     147.6px         64.8px         −83px
     mobile   390px      98.3px         64.8px         −34px

   459 vãos medidos na produção, 264 nos nossos. No desktop as DEZ homes
   estavam curtas, entre 56 e 93px cada. A queixa era real e não era pequena:
   tínhamos 44% do respiro da produção.

   Duas coisas que a medição mostrou e que valem mais do que os números:

   1. NA PRODUÇÃO O ESPAÇO VIVE DENTRO DA SECÇÃO, não entre secções. As
      caixas estão encostadas (vão de caixa = 0) e o respiro é `padding`:
      73px por baixo do conteúdo, 47px por cima do título seguinte. Do nosso
      lado é tudo `margin` e o interior é rente (0.8px / 0px). Para o olho dá
      o mesmo enquanto o fundo for branco — deixa de dar no dia em que uma
      secção levar cor de fundo, e nesse dia o que se acrescenta é `padding`
      à secção, não mais margem a esta regra.

   2. A PRODUÇÃO ENCOLHE O RITMO NO TELEMÓVEL, e de propósito: 147.6 → 98.3,
      dois terços. Um valor fixo não podia servir os dois. Daí o `clamp()`:
      ancorado em 80px a 390 e 144px a 1440, a subir em linha recta pelo meio
      (80 = 3.5rem + 6.1vw a 390; 144 = 3.5rem + 6.1vw a 1440).

   Porquê 80 no telemóvel e não os 98.3 da produção: ali a produção anda muito
   espalhada (p25 = 67, p75 = 144) e em três das dez homes já estava mais
   apertada do que nós. 80px tira dois terços da falta sem passar à frente da
   metade mais justa da produção. No desktop não há esse cuidado a ter — a
   produção é consistente (p25 = 130) e as dez páginas estavam curtas.
   ────────────────────────────────────────────────────────────────────────── */

.eco-bloco + .eco-bloco {
	margin-top: clamp(5rem, 3.5rem + 6.1vw, 9rem);
}

/* ── A fila da Opinião arranca toda da mesma linha ────────────────────────
   A fila é uma grelha desenhada com estilo inline pelo eco-core
   (`display:grid;grid-template-columns:repeat(auto-fit,minmax(280px,1fr));
   gap:40px`) e sem `align-items`. Medido no Advocatus a 1440px: os quatro
   cartões acabavam todos em y=671 e começavam em y diferentes — o de título a
   duas linhas em 529, os outros três em 553. Alinhados pelo fundo, portanto,
   e o que se lê numa fila de quatro não é o fundo, são os títulos: pareciam
   três cartões descaídos ao lado de um.

   `start` e não `stretch`: esticar dava a todos a altura do mais alto e o
   espaço sobrava por baixo do texto, que é o mesmo desalinhamento com outro
   nome. O inline não declara `align-items`, por isso esta regra ganha sem
   precisar de tocar no PHP que o escreve.

   O `align-items` sozinho não chegou, e a segunda metade é a que interessa —
   e não é do core, é nossa. Os cartões traziam `margin-top: 24px`, todos menos
   o primeiro, e quem lho dava era esta regra, mais abaixo nesta folha:

     :is(.eco-card--opiniao, …) + :is(.eco-card--opiniao, …) { margin-top: … }

   Está certa para o que foi escrita: a fita de Opinião da homepage empilha os
   cartões numa COLUNA e ali a margem é o que os separa. Numa `__fila` os
   mesmos cartões são irmãos na horizontal, o `+` continua a casar, e a margem
   que devia separar linhas passa a empurrar para baixo três dos quatro
   cartões. Quem separa numa grelha é o `gap`, que já lá está a 40px.

   O selector abaixo leva as duas classes de cartão de propósito: com
   `> *` ficava em 0,2,0, empatado com o `:is() + :is()`, e um empate
   resolve-se pela ordem no ficheiro — que aqui é a errada, porque a regra da
   fita vem depois. Com a lista de cartões sobe a 0,3,0 e ganha onde quer que
   esteja escrita.

   Vale para qualquer `__fila` e não só para a da Opinião: são todas grelhas
   com `gap` próprio. */
[class*="eco-bloco--"] .eco-bloco__fila {
	align-items: start;
}

.eco-bloco .eco-bloco__fila > :is(.eco-card, [class*="eco-card--"]) {
	margin-top: 0;
}

/* Duas variantes de título de secção sairam daqui a 26/08/2026, e o motivo
   fica escrito para não voltarem por engano:

   `--display` (ink, x-large, filete cinzento) — zero utilizações vivas. Só
   existia no padrão de demonstração; nenhuma página do staging a servia.
   `--green` — punha a cor por omissão outra vez, em voz alta. Uma variante
   que repete o estado por omissão é uma escolha a mais para quem edita e
   nenhuma diferença para quem lê.

   Foram medidas antes de sair: `grep` no tema e contagem no HTML servido de
   `/`, `/ultimas/`, `/ficha-tecnica/`, `/manifesto-editorial/` e `/premium/`.
   Zero ocorrências das duas em todas. As outras quatro variantes ficaram
   precisamente por NÃO serem zero — a `--pagina`, por exemplo, está treze
   vezes no conteúdo guardado da Ficha Técnica e do Estatuto Editorial. */

/* A coluna Últimas é a excepção: abre a coluna do herói, e ali o filete
   verde duplicava a linha que a própria coluna já tem ao lado. */
:is(.eco-section-title--sem-filete, .is-style-eco-section-title--sem-filete) {
	border-top: 0;
	padding-top: 0;
}

/* Título de bloco de uma página institucional — Ficha Técnica, Estatuto
   Editorial. Mantém o filete verde e o verde-texto do título de secção, mas
   com o corpo do intertítulo do artigo (32px) em vez dos 14px do rótulo.

   Existe porque a combinação estava a acontecer por acidente: dentro de
   `.eco-article-body` a regra do intertítulo (`h2.wp-block-heading`, duas
   classes) ganha à do título de secção (uma), e o que saía era um híbrido que
   ninguém tinha decidido. Ou se impedia, ou se assumia — assume-se, porque num
   documento longo de leitura corrida o filete é o que dá a ver onde é que um
   bloco acaba e o seguinte começa.

   O `padding-top` sobe para acompanhar o corpo maior: a 8px, que é a medida
   do rótulo pequeno, um título de 32px ficava colado à linha.

   O ritmo à volta dele foi medido a 26/08/2026 e estava desequilibrado: 48px
   por cima e **12px** por baixo, contra os 24px que o corpo do artigo põe
   entre parágrafos. Um título ficava mais perto do texto que introduz do que
   do que lhe convinha — e como o `.eco-section-title` põe `margin-bottom: 0`
   para os rótulos pequenos, era esse zero que aqui sobrava. Fica com os
   mesmos 24px do corpo, e a folga por baixo do filete sobe de 16 para 24,
   que é o que dá ar a uma letra de 32px. */
:is(.eco-section-title--pagina, .is-style-eco-section-title--pagina) {
	display: block;
	font-family: var(--wp--preset--font-family--headline);
	font-size: var(--wp--preset--font-size--x-large);
	line-height: 1.15;
	padding-top: var(--wp--preset--spacing--50);
	margin-bottom: var(--wp--preset--spacing--50);
}

/* Antetítulo de secção — maiúsculas, para "NOSSAS MARCAS" e para a coluna
   Últimas. Mantém o filete verde por cima. */
/* O espacejamento desceu duas vezes: 0.06em desmanchava um rótulo curto
   — "ÚLTIMAS", "FILTRAR POR CATEGORIA" — em letras soltas, e a 0.04em ainda
   se lia mais aberto do que o desenho. Fica em 0.02em, o mínimo que separa as
   maiúsculas sem as colar. */
:is(.eco-section-title--eyebrow, .is-style-eco-section-title--eyebrow) {
	text-transform: uppercase;
	letter-spacing: 0.02em;
}

/* Filete em baixo e cinzento, para os rótulos da coluna da direita. No desenho
   de /ultimas/ o "FILTRAR POR CATEGORIA" tem a linha por baixo do texto (y=714,
   2px em #E0E0E0) e não o filete verde por cima — ali a coluna já é estreita e
   o verde por cima punha duas marcas verdes coladas, o rótulo e a linha.
   Medido em docs/reference-snapshots/pages-desktop/ECO ultimas.png. */
:is(.eco-section-title--filete-baixo, .is-style-eco-section-title--filete-baixo) {
	border-top: 0;
	padding-top: 0;
	padding-bottom: var(--wp--preset--spacing--30);
	border-bottom: 2px solid var(--wp--preset--color--border);
	/* Um degrau acima do `small` dos outros rótulos: aqui o título é a única
	   coisa que abre a coluna da direita, e a 14px ficava mais pequeno do que
	   as próprias pastilhas que anuncia. */
	font-size: var(--wp--preset--font-size--medium);
}

/* `.eco-ultimas-head` deixou de ter regras próprias: o "+" que a distinguia
   passou a fazer parte do título de secção, e a coluna Últimas usa agora a
   variante `--eyebrow` como qualquer outra. A classe fica só como âncora
   para conteúdo já gravado na base de dados. */


/* ──────────────────────────────────────────────────────────────────────────
   4. Ligações e botões
   ──────────────────────────────────────────────────────────────────────────
   As variantes servem num link solto e no bloco Botão do core. No bloco a
   classe cai no contentor (`div.wp-block-button`) e quem se vê é o `<a>` lá
   dentro — por isso o contentor NÃO pode levar geometria.

   Era esse o erro que fazia os botões do painel Para Si terem duas bordas e
   63px de altura em vez de 48: o contentor e a âncora recebiam ambos a
   moldura e a folga, e somavam-se. O `:not(.wp-block-button)` mantém a
   variante utilizável solta sem a duplicar dentro do bloco.
   ────────────────────────────────────────────────────────────────────────── */

.eco-btn:not(.wp-block-button),
.eco-btn .wp-block-button__link,
:is(.eco-btn--dark, .is-style-eco-btn--dark):not(.wp-block-button),
:is(.eco-btn--dark, .is-style-eco-btn--dark) .wp-block-button__link,
:is(.eco-btn--outline, .is-style-eco-btn--outline):not(.wp-block-button),
:is(.eco-btn--outline, .is-style-eco-btn--outline) .wp-block-button__link,
:is(.eco-btn--ghost, .is-style-eco-btn--ghost):not(.wp-block-button),
:is(.eco-btn--ghost, .is-style-eco-btn--ghost) .wp-block-button__link,
.eco-load-more a {
	display: inline-block;
	/* Um botão a 100% da coluna (painel Para Si) somava a folga à largura e
	   transbordava 6px no telemóvel. */
	box-sizing: border-box;
	border: 1px solid transparent;
	border-radius: 999px;
	/* 48px de altura, como o "Entrar" do cabeçalho e os dois botões do painel
	   Para Si no desenho (medidos em components/themed-panel-with-login.png:
	   bandas y131-178 e y203-250, ambas de 48px). */
	padding: 12px 22px;
	/* 700 lia-se pesado de mais ao lado do texto do painel. O Manrope é
	   variável, por isso 600 existe sem pedir outro ficheiro. */
	font-weight: 600;
	line-height: 1.2;
	text-decoration: none;
}

/* Escuro — o botão principal do desenho. É esta a chamada à ação em todo o
   lado: "Registar" no painel Para Si, "Ver todas as newsletters" na faixa,
   "Assinatura Premium" no cabeçalho.

   Verde-escuro com letras claras, e não preto com letras verdes: o botão da
   faixa das newsletters foi medido pixel a pixel no desenho — fundo #002410
   (preset `inverse`) e texto #EDEFEC (preset `surface`). Preto com texto verde
   era leitura nossa e não do desenho; sobre o painel cinzento dava um bloco
   muito mais duro do que o desenho pede.

   O botão verde-cheio existe mas quase não se usa: sobre o painel verde
   desaparecia, e sobre branco a ECO reserva o verde para os filetes e para o
   texto de secção. */
:is(.eco-btn--dark, .is-style-eco-btn--dark):not(.wp-block-button),
:is(.eco-btn--dark, .is-style-eco-btn--dark) .wp-block-button__link {
	background: var(--wp--preset--color--inverse);
	border-color: var(--wp--preset--color--inverse);
	color: var(--wp--preset--color--surface);
}

:is(.eco-btn--dark, .is-style-eco-btn--dark):not(.wp-block-button):hover,
:is(.eco-btn--dark, .is-style-eco-btn--dark) .wp-block-button__link:hover {
	background: var(--eco-accent);
	border-color: var(--eco-accent);
	color: var(--wp--preset--color--inverse);
}

/* Cheio a verde. Igual ao `styles.elements.button` do theme.json, aqui para
   poder ser usado fora do bloco Botão. */
.eco-btn--primary:not(.wp-block-button),
.eco-btn--primary .wp-block-button__link {
	background: var(--eco-accent);
	color: var(--wp--preset--color--ink);
}

.eco-btn--primary:not(.wp-block-button):hover,
.eco-btn--primary .wp-block-button__link:hover {
	background: var(--wp--preset--color--ink);
	color: var(--eco-accent);
}

/* Contorno — a acção secundária ("Iniciar sessão" ao lado de "Registar"). */
:is(.eco-btn--outline, .is-style-eco-btn--outline):not(.wp-block-button),
:is(.eco-btn--outline, .is-style-eco-btn--outline) .wp-block-button__link {
	border-color: var(--wp--preset--color--ink);
	color: var(--wp--preset--color--ink);
	background: none;
}

:is(.eco-btn--outline, .is-style-eco-btn--outline):not(.wp-block-button):hover,
:is(.eco-btn--outline, .is-style-eco-btn--outline) .wp-block-button__link:hover {
	background: var(--wp--preset--color--ink);
	border-color: var(--wp--preset--color--ink);
	color: var(--eco-accent);
}

/* ── "Carregar mais artigos" ──────────────────────────────────────────────
   O paginador das listagens (/ultimas/ e arquivos de categoria) não é uma
   acção secundária, e estava a herdar o contorno: caixa vazia com letra
   preta. No desenho é o botão escuro do sistema, com texto claro e um disco
   branco com um "+" à direita (ECO ultimas.png, y≈3028–3072: #002410, 248×44,
   disco de 20px).

   O "+" é desenhado e não escrito, como na pastilha dos títulos de secção:
   escrito, ia parar ao leitor de ecrã e ao resumo do motor de busca colado ao
   rótulo — "Carregar mais artigos +". */
.eco-load-more a {
	display: inline-flex;
	align-items: center;
	gap: 14px;
	background: var(--wp--preset--color--inverse);
	border-color: var(--wp--preset--color--inverse);
	color: var(--wp--preset--color--base);
}

.eco-load-more a::after {
	content: "+";
	flex: none;
	display: inline-flex;
	align-items: center;
	justify-content: center;
	width: 20px;
	height: 20px;
	border-radius: 999px;
	background: var(--wp--preset--color--base);
	color: var(--wp--preset--color--inverse);
	font-size: 1.15em;
	font-weight: 700;
	line-height: 1;
}

.eco-load-more a:hover {
	background: var(--eco-accent);
	border-color: var(--eco-accent);
	color: var(--wp--preset--color--inverse);
}

.eco-load-more a:hover::after {
	background: var(--wp--preset--color--inverse);
	color: var(--eco-accent);
}

/* Sem caixa — acções secundárias dentro de um cartão ou painel. */
:is(.eco-btn--ghost, .is-style-eco-btn--ghost):not(.wp-block-button),
:is(.eco-btn--ghost, .is-style-eco-btn--ghost) .wp-block-button__link {
	background: none;
	border-color: transparent;
	padding-left: 0;
	padding-right: 0;
	color: var(--eco-accent-text);
}

:is(.eco-btn--ghost, .is-style-eco-btn--ghost):not(.wp-block-button):hover,
:is(.eco-btn--ghost, .is-style-eco-btn--ghost) .wp-block-button__link:hover {
	background: none;
	text-decoration: underline;
}

/* Nuvem de etiquetas ligáveis (arquivo, artigo). */
/* Medido na coluna da direita de docs/reference-snapshots/pages-desktop/ECO
   ultimas.png: pastilhas de 30px de altura, contorno #002410 (`inverse`) e não
   o cinzento da moldura, e 24px entre elas nos dois sentidos — o cinzento a
   12px dava uma nuvem apertada e quase sem contraste com o fundo branco.

   O `core/categories` sai numa `<ul>`, e é essa `<ul>` que leva a classe; o
   selector apanha os dois casos porque um `wp:group` à volta empurra a classe
   para o contentor. */
/* As duas folgas deixaram de ser a mesma. Na vertical as pastilhas são linhas
   de uma lista e ganham em ficar juntas; na horizontal precisam de ar para não
   se lerem como uma frase só. 24px nos dois sentidos dava uma nuvem esparsa e
   alta de mais numa coluna de 310px, e 16px na vertical ainda deixava a nuvem
   a crescer mais do que a coluna que a serve. */
.eco-chip-cloud ul,
ul.eco-chip-cloud {
	display: flex;
	flex-wrap: wrap;
	/* 6px entre linhas e 20px entre pastilhas na mesma linha. A vertical desceu
	   três vezes por revisão e a horizontal uma: numa nuvem, a distância entre
	   linhas lê-se somada à altura da pastilha, por isso o mesmo valor nos dois
	   eixos abre muito mais na vertical do que na horizontal. */
	row-gap: 6px;
	column-gap: 20px;
	margin: 0;
	padding-left: 0;
	list-style: none;
}

.eco-chip-cloud li {
	margin: 0;
}

.eco-chip-cloud a {
	display: inline-block;
	box-sizing: border-box;
	border: 1px solid var(--wp--preset--color--inverse);
	border-radius: 999px;
	padding: 5px 15px;
	font-size: var(--wp--preset--font-size--small);
	font-weight: 600;
	line-height: 1.3;
	text-decoration: none;
	white-space: nowrap;
	color: var(--wp--preset--color--inverse);
}

.eco-chip-cloud a:hover,
.eco-chip-cloud a:focus-visible {
	background: var(--wp--preset--color--inverse);
	color: var(--wp--preset--color--base);
}

/* O `margin:0` acima existe para o `core/categories` não trazer a margem que
   o navegador dá a uma `<ul>` — mas levava à frente o espaço que o `blockGap`
   do grupo punha entre o rótulo e as pastilhas, e a nuvem ficava colada ao
   filete do título. Aqui volta, só onde o filtro vive. */
.eco-filtro-categorias .eco-chip-cloud {
	margin-top: var(--wp--preset--spacing--50);
}

/* Um `core/categories` sem categorias nenhumas escreve "Sem categorias" num
   `<li>` sem link; sem isto ficava um item nu ao lado das pastilhas. */
.eco-chip-cloud li:not(:has(a)) {
	color: var(--wp--preset--color--muted);
	font-size: var(--wp--preset--font-size--small);
}


/* ──────────────────────────────────────────────────────────────────────────
   4b. Assinatura com retrato
   ──────────────────────────────────────────────────────────────────────────
   Retrato redondo sobre disco verde, e o nome ao lado. É o que assina cada
   cartão da secção Opinião — sem o retrato, aqueles cartões são só título e
   um nome cinzento, e o desenho perde a cara que os faz reconhecíveis.

   O disco verde está atrás do retrato de propósito: as fotografias vêm
   recortadas com fundo transparente, e o verde é o que as une.
   ────────────────────────────────────────────────────────────────────────── */

.eco-byline {
	display: flex;
	align-items: center;
	gap: .75rem;
}

.eco-byline > * {
	margin-block: 0;
}

.eco-byline__foto,
.eco-byline .wp-block-post-featured-image,
.eco-byline .wp-block-image {
	display: block;
	flex: none;
	width: var(--eco-byline-size, 48px);
	height: var(--eco-byline-size, 48px);
	margin: 0;
	border-radius: 999px;
	overflow: hidden;
	background: var(--eco-accent);
}

.eco-byline__foto svg {
	display: block;
	width: 100%;
	height: 100%;
}

.eco-byline__foto img,
.eco-byline .wp-block-post-featured-image img,
.eco-byline .wp-block-image img {
	width: 100%;
	height: 100%;
	object-fit: cover;
	border-radius: 999px;
}

.eco-byline__nome,
.eco-byline .wp-block-post-author-name {
	color: var(--wp--preset--color--ink);
	font-size: var(--wp--preset--font-size--medium);
	font-weight: 400;
}

/* Grande, para o destaque de opinião que abre o painel. */
.eco-byline--grande {
	--eco-byline-size: 64px;
}


/* ──────────────────────────────────────────────────────────────────────────
   4c. Painéis
   ──────────────────────────────────────────────────────────────────────────
   Caixas de cor que embrulham uma chamada à ação ou um destaque editorial.
   No desenho são verdes com texto escuro — o painel Para Si e o cartão
   Editorial da faixa Opinião.
   ────────────────────────────────────────────────────────────────────────── */

.eco-panel {
	padding: var(--wp--preset--spacing--50);
	background: var(--wp--preset--color--surface);
	color: var(--wp--preset--color--ink);
}

/* O painel cheio: fundo da marca, letra que CONTRASTA com ele.

   ── Isto dizia `ink`, e o `ink` é #000000 ────────────────────────────────
   O fundo é `--eco-accent`, que é o primário da marca e muda de canal para
   canal (`style.css:104`). A letra estava fixa em preto, e medido marca a
   marca dava: Local Online 1.24 (texto invisível), ECO Avenida 1.55, +M 1.88,
   Fundos Europeus 1.93, ECOseguros 3.70 — quatro abaixo de 3:1. O ECO base dá
   8.93, e é só por isso que nunca se viu: a homepage não leva classe de marca.
   O painel vive no `patterns/para-si.php` e no `patterns/opiniao-strip.php`,
   que aparecem nas homes de canal, e é estilo de bloco registado ("Painel
   verde"), portanto um editor pode pô-lo em qualquer lado.

   É a terceira vez que esta falha sai daqui — a chamada Premium e o rodapé já
   tinham enviado texto invisível pela mesma razão, a 1.01. A ferramenta certa
   já existia: o `--eco-on-primary`, que o `eco_brand_contrast_color()`
   (`inc/brands.php`) calcula por marca com a fórmula da WCAG e devolve
   `#FFFFFF` ou `#002410`, o que ganhar. Com ele, o pior caso passa a 4.39
   (Capital Verde) e todos os outros ficam acima de 5.

   O recurso do `var()` é o `inverse` (#002410) e não o `ink`: sem classe de
   marca — o ECO base — dá 7.09 sobre o verde da casa. */
:is(.eco-panel--green, .is-style-eco-panel--green) {
	background: var(--eco-accent);
	color: var(--eco-on-primary, var(--wp--preset--color--inverse));
}

/* Dentro do painel tudo herda essa cor: o antetítulo verde desaparecia. */
:is(.eco-panel--green, .is-style-eco-panel--green) :is(.eco-kicker, .wp-block-heading, .wp-block-post-title, p),
:is(.eco-panel--green, .is-style-eco-panel--green) :is(.eco-kicker, .wp-block-post-title) a {
	color: inherit;
}


/* ──────────────────────────────────────────────────────────────────────────
   5. Miniaturas e ícones de formato
   ──────────────────────────────────────────────────────────────────────────
   Disco verde de 48px no canto inferior esquerdo da imagem, a dizer que o
   artigo é vídeo, podcast, galeria ou citação.

   Antes eram caracteres tipográficos (▶ ♪ ⧉ “) dentro de `content`: cada
   sistema desenhava o seu e no Android o ▶ saía a cores. Agora é um SVG
   embutido usado como máscara, por isso herda a cor do tema e fica igual em
   todo o lado — e continua sem pedir nenhum ficheiro ao servidor.

   `::before` é o disco, `::after` é o ícone por cima. A classe pode estar no
   próprio bloco de imagem em destaque ou no cartão à volta.
   ────────────────────────────────────────────────────────────────────────── */

.eco-thumb,
[class*="eco-thumb--"],
[class*="eco-thumb--"] .wp-block-post-featured-image,
.eco-podcast-card .wp-block-post-featured-image {
	position: relative;
}

/* ── O distintivo de formato, vindo do backoffice ─────────────────────────
   Até aqui os distintivos de miniatura só se punham à mão, escolhendo a
   variante de bloco (`.eco-thumb--video` e companhia) ao montar um padrão. A
   produção não faz assim: quem decide é a redação, no rádio "Formato a
   destacar" do artigo, e o distintivo aparece nos CARTÕES — nunca na página
   do artigo — a partir do `post_highlighted_content`
   (`eco_get_media_badge()`, inc/template-tags.php da produção).

   Todo o caminho já existia deste lado e não estava ligado ao fim: o
   `eco-core` lê o `featured_format`, mapeia-o para o nome de produção, e o
   filtro de `post_class` põe `eco-format-galeria` (ou `--video`, `--citacao`)
   na `<li>` de cada cartão. Faltava esta folha reagir a essa classe — eram
   zero ocorrências de `eco-format-` em todo o CSS.

   Reaproveita-se o mecanismo que já cá está: o mesmo disco branco e a mesma
   máscara das variantes de bloco, agora accionados pela classe do cartão em
   vez da escolha manual. Quem monta um padrão continua a poder forçar a
   variante; quem escreve o artigo passa a decidir sozinho.

   Nota: a produção usa o mesmo ícone para Galeria e para Imagem — não os
   distingue. Aqui há máscara para galeria e não para imagem, por isso
   `phc_image` fica sem distintivo em vez de emprestar o da galeria. Se se
   quiser a paridade exacta, acrescenta-se `.eco-format-imagem` à primeira
   lista de cada par. */
.eco-format-galeria .wp-block-post-featured-image,
.eco-format-video .wp-block-post-featured-image,
.eco-format-citacao .wp-block-post-featured-image,
.eco-format-audio .wp-block-post-featured-image {
	position: relative;
}

.eco-format-galeria .wp-block-post-featured-image::before,
.eco-format-video .wp-block-post-featured-image::before,
.eco-format-citacao .wp-block-post-featured-image::before,
.eco-format-audio .wp-block-post-featured-image::before,
[class*="eco-thumb--"]::before,
.eco-podcast-card .wp-block-post-featured-image::before {
	content: "";
	position: absolute;
	left: 16px;
	bottom: 16px;
	width: 48px;
	height: 48px;
	border-radius: 999px;
	/* Disco branco com a marca em verde, como na fila de Podcasts do desenho.
	   Estava ao contrário — disco verde com o sinal escuro — e sobre uma foto
	   clara o sinal desaparecia. */
	background: var(--wp--preset--color--base);
	pointer-events: none;
}

.eco-format-galeria .wp-block-post-featured-image::after,
.eco-format-video .wp-block-post-featured-image::after,
.eco-format-citacao .wp-block-post-featured-image::after,
.eco-format-audio .wp-block-post-featured-image::after,
[class*="eco-thumb--"]::after,
.eco-podcast-card .wp-block-post-featured-image::after {
	content: "";
	position: absolute;
	left: 28px;
	bottom: 28px;
	width: 24px;
	height: 24px;
	background: var(--wp--preset--color--inverse);
	pointer-events: none;
	-webkit-mask-position: center;
	mask-position: center;
	-webkit-mask-repeat: no-repeat;
	mask-repeat: no-repeat;
	-webkit-mask-size: contain;
	mask-size: contain;
	-webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M8 5v14l11-7z'/%3E%3C/svg%3E");
	mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M8 5v14l11-7z'/%3E%3C/svg%3E");
}

/* ── Os dois ícones entregues pelo desenho ────────────────────────────────
   O vídeo e o podcast passaram a ter ficheiro próprio
   (assets/images/card-icon-play.svg e card-icon-podcast.svg). Cada um traz o
   disco branco e o glifo já desenhados — não é só a forma —, por isso entram
   como imagem no `::before` e o `::after` deixa de fazer falta.

   As cores ficam presas ao ficheiro, ao contrário da máscara que herdava a do
   tema. É o preço de usar o desenho tal como veio, e vale a pena nestes dois:
   o microfone tem detalhe a mais para uma máscara escrita à mão — a anterior
   era uma aproximação com arcos e cápsulas.

   Os outros dois formatos (galeria e citação) continuam em máscara: são
   formas simples e assim acompanham a cor do tema. */
:is(.eco-thumb--video, .is-style-eco-thumb--video)::before,
:is(.eco-thumb--podcast, .is-style-eco-thumb--podcast)::before,
.eco-podcast-card .wp-block-post-featured-image::before {
	background: url("../images/card-icon-play.svg") center / contain no-repeat;
	border-radius: 0;
}

:is(.eco-thumb--podcast, .is-style-eco-thumb--podcast)::before,
.eco-podcast-card .wp-block-post-featured-image::before {
	background-image: url("../images/card-icon-podcast.svg");
}

:is(.eco-thumb--video, .is-style-eco-thumb--video)::after,
:is(.eco-thumb--podcast, .is-style-eco-thumb--podcast)::after,
.eco-podcast-card .wp-block-post-featured-image::after {
	content: none;
}

.eco-format-galeria .wp-block-post-featured-image::after,
:is(.eco-thumb--galeria, .is-style-eco-thumb--galeria)::after {
	-webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M8 2h14v14h-2V4H8zM2 8h14v14H2zm2 2v10h10V10z'/%3E%3C/svg%3E");
	mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M8 2h14v14h-2V4H8zM2 8h14v14H2zm2 2v10h10V10z'/%3E%3C/svg%3E");
}

.eco-format-citacao .wp-block-post-featured-image::after,
:is(.eco-thumb--citacao, .is-style-eco-thumb--citacao)::after {
	-webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M7 18H3l3-7H3V6h7v5.5zm11 0h-4l3-7h-3V6h7v5.5z'/%3E%3C/svg%3E");
	mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M7 18H3l3-7H3V6h7v5.5zm11 0h-4l3-7h-3V6h7v5.5z'/%3E%3C/svg%3E");
}


/* ── Miniaturas: a proporção manda ────────────────────────────────────────
   Quando o bloco pede `aspectRatio`, o WordPress escreve-o na `<figure>` mas
   a imagem lá dentro continua a poder ser mais alta — e nas imagens de
   demonstração, que vêm em formatos variados, era isso que fazia as filas de
   cartões desalinharem umas das outras.

   A figura corta o que sobra e a imagem preenche-a. Vale para qualquer
   miniatura dentro de um cartão, e não só para as que pediram proporção,
   porque uma fila só alinha se todas as imagens obedecerem à mesma regra. */
:is(.eco-card, [class*="eco-card--"]) .wp-block-post-featured-image,
.wp-block-post-featured-image[style*="aspect-ratio"] {
	overflow: hidden;
}

:is(.eco-card, [class*="eco-card--"]) .wp-block-post-featured-image img,
.wp-block-post-featured-image[style*="aspect-ratio"] img {
	display: block;
	width: 100%;
	height: 100%;
	object-fit: cover;
}


/* ── Nenhum título parte a página ─────────────────────────────────────────
   Um título com uma palavra que não cabe empurra a página inteira: o
   `overflow-wrap: normal` do costume só quebra em espaços, e sem espaço
   nenhum a caixa cresce até à largura da palavra.

   Não é hipótese: a home do +M tem uma peça cujo título é
   `…#textoincrívelquediscorresobreabonecadaeafins!!!` — 48 caracteres
   seguidos —, que a 375px media 477px e levava o `scrollWidth` da página
   para 493. Foi o maior transbordo horizontal medido no site.

   O conteúdo é lixo e há-de ser corrigido, mas a folha não pode depender
   disso: um jornal acaba sempre por publicar um endereço ou uma etiqueta
   sem espaços. `anywhere` e não `break-word` de propósito — só o primeiro
   conta para o tamanho mínimo da caixa, que é o que impede um flex ou uma
   grelha de rebentar antes de a quebra sequer acontecer. */
.wp-block-heading,
.wp-block-post-title {
	overflow-wrap: anywhere;
}

/* ──────────────────────────────────────────────────────────────────────────
   6. Cartões
   ──────────────────────────────────────────────────────────────────────────
   Uma base e oito variantes. Os tamanhos de título ficam de fora de
   propósito: o mesmo cartão vertical aparece a `large` numa coluna de 320px
   e a `x-large` numa de 427px, por isso o tamanho é decisão do sítio onde o
   cartão está e continua a ser um atributo do bloco.
   ────────────────────────────────────────────────────────────────────────── */

/* O título de um cartão é preto e não o verde dos links do corpo, que é o
   que o `elements.link` do theme.json lhe daria. Estava escrito à mão em
   catorze sítios como `elements.link.color.text`.

   O `[class*="eco-card--"]` apanha de uma vez as duas escritas da classe
   (`eco-card--vertical` e `is-style-eco-card--vertical`) sem repetir a lista
   toda das variantes. As regras do destaque, que pintam de branco, vêm mais
   abaixo com a mesma especificidade e ganham pela ordem. */
/* Peso e entrelinha dos títulos de cartão.
   O `elements.heading` do theme.json põe 700/1.05, que serve a um título de
   página e é pesado e apertado de mais num cartão: a 20px as linhas quase se
   tocavam, e nos cartões pequenos era onde mais se via. O desenho mede um
   passo de linha de 28,5px a ~24px de corpo — 1,2, não 1,05.

   600 existe sem pedir outro ficheiro: o Barlow Semi Condensed já é servido
   nos dois pesos (ver `fontFace` em theme.json). */
:is(.eco-card, [class*="eco-card--"]) .wp-block-post-title,
:is(.eco-card, [class*="eco-card--"]) .wp-block-post-title a,
:is(.eco-card, [class*="eco-card--"]) > .wp-block-heading,
.eco-card__body > .wp-block-heading {
	font-weight: 600;
	line-height: 1.2;
}

:is(.eco-card, [class*="eco-card--"]) .wp-block-post-title a {
	color: var(--wp--preset--color--ink);
}

/* ── Um cartão não sublinha ───────────────────────────────────────────────
   O sublinhado é do texto corrido: num artigo distingue uma ligação do resto
   da frase. Num cartão o título INTEIRO é a ligação, e sublinhá-lo não
   distingue nada — só suja.

   Não vinha de cá; vem do `theme.json`, pelo `elements.link`, que o núcleo
   emite assim:

     :root :where(.wp-block-post-content a:where(:not(.wp-element-button)))
       { text-decoration: underline }

   Repare-se no `.wp-block-post-content`: a regra só apanha o conteúdo de um
   post. Enquanto as homes de canal foram `single-grid.html`, o markup não
   passava por lá e ninguém dava por isto. Passaram a ser páginas a 26/08/2026
   e todo o bloco caiu dentro do contentor — **110 ligações sublinhadas** numa
   só home de canal, incluindo o título branco por cima da capa do destaque,
   que ficava com um risco branco sobre a fotografia.

   Fica antes da regra de `:hover`, que é o único sítio onde o sublinhado num
   cartão diz alguma coisa: ali é o sinal de que aquilo se pode clicar. */
:is(.eco-card, [class*="eco-card--"]) a {
	text-decoration: none;
}

:is(.eco-card, [class*="eco-card--"]) .wp-block-post-title a:hover {
	text-decoration: underline;
}

/* ── Alinhamento da fotografia numa capa ──────────────────────────────────
   O campo "Alinhamento da imagem" do formulário das manchetes, escolhido peça
   a peça por quem a monta. Estava a ser recolhido e ignorado até 28/08/2026 —
   o editor escolhia, gravava, e a página não mudava.

   Sem isto quem recorta é o `object-fit: cover`, que centra. Numa fotografia
   em que a pessoa está encostada a um lado, centrar é exactamente o corte que
   o editor escolheu evitar — e sai a cabeça cortada que ninguém pediu.

   `center` na vertical e não `top`: o campo só oferece esquerda e direita, e
   mexer no eixo que ele não oferece seria decidir por quem escolheu. */
.eco-card--foco-esquerda .wp-block-cover__image-background,
.eco-card--foco-esquerda img {
	object-position: left center;
}

.eco-card--foco-direita .wp-block-cover__image-background,
.eco-card--foco-direita img {
	object-position: right center;
}

/* ── E a faixa do "em direto", que não é feita de cartões ─────────────────
   O selector de cima resolveu 110 ligações e deixou quatro: a faixa do directo
   não usa `.eco-card`, põe as manchetes em `.eco-live-strip-feature` e
   `.eco-live-strip-related`, e por isso ficou de fora e continuou sublinhada.

   Apanhado a 28/08/2026 pelo utilizador, a olhar para a home nova. Confirmado
   a percorrer TODAS as ligações dos blocos de grelha e a ler o
   `textDecorationLine` calculado de cada uma: quatro sublinhadas, as quatro
   deste bloco, e mais nenhuma na página. Ou seja, isto fecha o assunto em vez
   de tapar um caso.

   A lição para a próxima: quando o remédio é «não sublinhar títulos», o
   selector tem de ser o do TÍTULO e não o do invólucro que calha estar à
   volta. Um bloco novo que não use cartões volta a cair no mesmo buraco. */
:is(.eco-live-strip-feature, .eco-live-strip-related) a {
	text-decoration: none;
}

:is(.eco-live-strip-feature, .eco-live-strip-related) .wp-block-post-title a:hover {
	text-decoration: underline;
}

/* Subtítulo — o autor da notícia, ou quem responde e quem conduziu numa
   entrevista. */
:is(.eco-card, [class*="eco-card--"]) .wp-block-post-author-name {
	color: var(--wp--preset--color--muted);
	font-size: var(--wp--preset--font-size--small);
}

/* O core dá margens de fluxo aos filhos via blockGap; o ritmo do cartão é
   nosso. O selector tem uma classe, o do core está dentro de `:where()` e
   pesa zero — esta ganha sem `!important`. */
.eco-card > *,
:is(.eco-card--vertical, .is-style-eco-card--vertical) > *,
:is(.eco-card--vertical-label, .is-style-eco-card--vertical-label) > *,
:is(.eco-card--horizontal, .is-style-eco-card--horizontal) > *,
:is(.eco-card--topic, .is-style-eco-card--topic) > *,
:is(.eco-card--entrevista, .is-style-eco-card--entrevista) > *,
:is(.eco-card--sub, .is-style-eco-card--sub) > *,
:is(.eco-card--latest, .is-style-eco-card--latest) > * {
	margin-block: 0;
}

/* ── Vertical ─────────────────────────────────────────────────────────────
   Miniatura, antetítulo (ou etiqueta), título e subtítulo opcional.
   Qualquer uma das partes de texto pode não existir. */
:is(.eco-card--vertical, .is-style-eco-card--vertical),
:is(.eco-card--vertical-label, .is-style-eco-card--vertical-label) {
	display: flex;
	flex-direction: column;
}

:is(.eco-card--vertical, .is-style-eco-card--vertical) > * + *,
:is(.eco-card--vertical-label, .is-style-eco-card--vertical-label) > * + * {
	margin-top: var(--wp--preset--spacing--20);
}

/* O que vier logo a seguir à imagem respira mais — seja o antetítulo, o
   título ou o subtítulo. É isto que aguenta o cartão sem categoria. */
:is(.eco-card--vertical, .is-style-eco-card--vertical) > .wp-block-post-featured-image + *,
:is(.eco-card--vertical-label, .is-style-eco-card--vertical-label) > .wp-block-post-featured-image + * {
	margin-top: var(--wp--preset--spacing--30);
}

:is(.eco-card--vertical, .is-style-eco-card--vertical) > .wp-block-post-featured-image,
:is(.eco-card--vertical-label, .is-style-eco-card--vertical-label) > .wp-block-post-featured-image {
	margin-bottom: 0;
}

/* ── Horizontal ───────────────────────────────────────────────────────────
   Miniatura à esquerda (234px), texto à direita. `--eco-card-thumb` troca a
   largura sem escrever outra variante.

   Com mais do que um bloco de texto, envolve-os num grupo `eco-card__body`,
   senão o flex põe-nos lado a lado. Com um só (imagem + título, como em
   Política e Mercados) o grupo é dispensável. */
:is(.eco-card--horizontal, .is-style-eco-card--horizontal),
:is(.eco-card--topic, .is-style-eco-card--topic),
:is(.eco-card--entrevista, .is-style-eco-card--entrevista) {
	display: flex;
	flex-wrap: wrap;
	align-items: flex-start;
	gap: var(--wp--preset--spacing--30);
}

/* O texto centra-se com a miniatura e não encosta ao topo dela. Medido nos
   cartões de Mercados: miniatura de 236×132 centrada em y=2142, bloco de
   título centrado em y=2146. O `--topic` fica de fora — leva filete em baixo e
   alinha pelo topo. */
:is(.eco-card--horizontal, .is-style-eco-card--horizontal) {
	align-items: center;
}

:is(.eco-card--horizontal, .is-style-eco-card--horizontal) > .wp-block-post-featured-image,
:is(.eco-card--topic, .is-style-eco-card--topic) > .wp-block-post-featured-image {
	flex: 0 0 var(--eco-card-thumb, 234px);
	width: var(--eco-card-thumb, 234px);
	max-width: 100%;
	margin-bottom: 0;
}

:is(.eco-card--horizontal, .is-style-eco-card--horizontal) > :not(.wp-block-post-featured-image),
:is(.eco-card--topic, .is-style-eco-card--topic) > :not(.wp-block-post-featured-image),
:is(.eco-card--entrevista, .is-style-eco-card--entrevista) > :not(.wp-block-post-featured-image) {
	flex: 1 1 var(--eco-card-body, 8rem);
	min-width: 0;
}

.eco-card__body {
	display: flex;
	flex-direction: column;
}

.eco-card__body > * {
	margin-block: 0;
}

.eco-card__body > * + * {
	margin-top: var(--wp--preset--spacing--20);
}

/* ── Categoria horizontal ─────────────────────────────────────────────────
   O cartão pequeno de "Temas em Destaque" e dos destaques menores de
   Política: miniatura de 142px e filete em baixo. */
:is(.eco-card--topic, .is-style-eco-card--topic) {
	--eco-card-thumb: 142px;
	--eco-card-body: 8rem;
	padding-bottom: var(--wp--preset--spacing--40);
	border-bottom: 1px solid var(--wp--preset--color--border);
}

/* ── Destaque de entrevista ───────────────────────────────────────────────
   Invertido em relação ao horizontal: manda a imagem e é o texto que tem
   largura fixa (294px no desenho). Vem depois das regras genéricas de
   propósito — mesma especificidade, ganha pela ordem. */
:is(.eco-card--entrevista, .is-style-eco-card--entrevista) {
	align-items: center;
	gap: 40px;
}

:is(.eco-card--entrevista, .is-style-eco-card--entrevista) > .wp-block-post-featured-image {
	flex: 1 1 20rem;
	min-width: 0;
	margin-bottom: 0;
}

:is(.eco-card--entrevista, .is-style-eco-card--entrevista) > :not(.wp-block-post-featured-image) {
	flex: 0 0 var(--eco-card-body, 294px);
	max-width: 100%;
}

/* O antetítulo da entrevista é o nome de quem responde e o cargo — "Miguel
   Maya, CEO - Millennium bcp". Em caixa de frase e não em maiúsculas: é um
   nome próprio, não uma categoria, e em maiúsculas passava a ler-se como um
   rótulo de secção. Medido em
   docs/reference-snapshots/components/card--highlight-entrevista.png. */
:is(.eco-card--entrevista, .is-style-eco-card--entrevista) :is(.wp-block-post-terms, .eco-card__pretitulo) {
	color: var(--eco-accent-text);
	font-size: var(--wp--preset--font-size--small);
	font-weight: 700;
	text-transform: none;
	letter-spacing: 0;
}

:is(.eco-card--entrevista, .is-style-eco-card--entrevista) .wp-block-post-author-name {
	color: var(--wp--preset--color--muted);
	font-size: var(--wp--preset--font-size--small);
}

/* ── Miniatura em falta ───────────────────────────────────────────────────
   O `core/post-featured-image` não desenha uma caixa vazia quando o artigo
   não tem imagem: devolve string vazia e desaparece do HTML. Num cartão
   vertical isso tira a imagem e sobe o texto; numa fila de três, cada cartão
   fica com a altura do seu texto e a fila deixa de alinhar. Medido no staging
   a 26 de agosto: 49 cartões com miniatura na página inicial, zero `<figure>`
   — os artigos mais recentes vêm de uma importação sem imagem, e são
   precisamente os que as consultas põem em cima.

   A produção não tem recuo nenhum para isto (o `get_item_featured_image()`
   devolve `null` e o template escreve `background-image: url()` vazio), e o
   desenho também não o prevê. Este painel é invenção nossa, e é de propósito
   que se lê como um lugar por encher e não como uma imagem: `surface` com a
   marca ECO em `border` por cima, sem contraste para competir com o título.

   Desenha-se num `::before` do cartão em vez de uma `<figure>` a sério
   porque a decisão é do lado do CSS — o `:has()` pergunta ao cartão se lhe
   falta a figura, e só nesse caso é que o painel aparece. Nada em PHP muda,
   e um artigo que ganhe imagem amanhã volta ao normal sozinho.

   Fica de fora o que não é uma fila de cartões: `--latest`, `--sub` e as
   duas variantes de opinião não levam miniatura nenhuma no desenho, e o
   `--destaque` (a manchete) é editorial e escolhe sempre a sua imagem — um
   painel cinzento do tamanho da manchete faria mais estrago do que o que
   corrige. `--ultimas` leva o painel no `::after` porque é a única em que a
   miniatura vem depois do texto. */
:is(.eco-card--vertical, .is-style-eco-card--vertical,
	.eco-card--vertical-label, .is-style-eco-card--vertical-label,
	.eco-card--horizontal, .is-style-eco-card--horizontal,
	.eco-card--topic, .is-style-eco-card--topic,
	.eco-card--entrevista, .is-style-eco-card--entrevista
):not(:has(> .wp-block-post-featured-image))::before,
:is(.eco-card--ultimas, .is-style-eco-card--ultimas):not(:has(> .wp-block-post-featured-image))::after {
	content: "";
	display: block;
	aspect-ratio: 16 / 9;
	background-color: var(--wp--preset--color--surface);
	background-image: url("../images/card-thumb-vazia.svg");
	background-repeat: no-repeat;
	background-position: center;
	/* O filete é o que faz o painel existir quando o chão já é `surface` — no
	   painel de Temas em Destaque o cartão de tema ficava sem caixa nenhuma e
	   a marca de água aparecia a flutuar ao lado do título. Inset e não
	   `border`, para não roubar largura à miniatura de 142px. */
	box-shadow: inset 0 0 0 1px var(--wp--preset--color--border);
	/* A marca ocupa pouco mais de um terço da altura do painel — o suficiente
	   para se ler à largura de 142px do cartão de tema e para não virar
	   assinatura à largura de 427px do vertical. */
	background-size: auto 36%;
}

/* As larguras são as mesmas que a `<figure>` teria, para o painel ocupar o
   lugar exacto da imagem que falta. O vertical enche a coluna e não precisa
   de regra; os outros herdam o `--eco-card-thumb` que a variante já define. */
:is(.eco-card--horizontal, .is-style-eco-card--horizontal,
	.eco-card--topic, .is-style-eco-card--topic
):not(:has(> .wp-block-post-featured-image))::before,
:is(.eco-card--ultimas, .is-style-eco-card--ultimas):not(:has(> .wp-block-post-featured-image))::after {
	flex: 0 0 var(--eco-card-thumb, 234px);
	width: var(--eco-card-thumb, 234px);
	max-width: 100%;
}

:is(.eco-card--entrevista, .is-style-eco-card--entrevista):not(:has(> .wp-block-post-featured-image))::before {
	flex: 1 1 20rem;
	min-width: 0;
}

/* O vertical não usa `gap` — espaça com `margin-top` no irmão seguinte, e um
   `::before` não é irmão de ninguém para o combinador `+`. A folga tem de vir
   deste lado, e é a mesma que a figura dá ao que vem a seguir. */
:is(.eco-card--vertical, .is-style-eco-card--vertical,
	.eco-card--vertical-label, .is-style-eco-card--vertical-label
):not(:has(> .wp-block-post-featured-image))::before {
	margin-bottom: var(--wp--preset--spacing--30);
}

/* ── Sub-destaque e Últimas ───────────────────────────────────────────────
   Sem imagem. Um leva categoria, o outro leva a hora. `--flush` tira o
   filete quando o contentor já separa as colunas (a fita de texto). */
:is(.eco-card--sub, .is-style-eco-card--sub),
:is(.eco-card--latest, .is-style-eco-card--latest) {
	display: flex;
	flex-direction: column;
	padding-bottom: var(--wp--preset--spacing--40);
	border-bottom: 1px solid var(--wp--preset--color--border);
}

:is(.eco-card--sub, .is-style-eco-card--sub) > * + *,
:is(.eco-card--latest, .is-style-eco-card--latest) > * + * {
	margin-top: var(--wp--preset--spacing--20);
}

:is(.eco-card--latest, .is-style-eco-card--latest) > .wp-block-post-date {
	color: var(--wp--preset--color--muted);
	font-size: var(--wp--preset--font-size--small);
	font-weight: 700;
}

.eco-card--flush {
	border-bottom: 0;
	padding-bottom: 0;
}

/* O filete separa dois cartões; debaixo do último não há nada a separar, e a
   linha ficava a fechar a coluna como se fosse moldura.

   Quem tem de ser o último é o `<li>` da consulta e não o cartão: cada cartão
   é filho único do seu item, por isso `:last-child` no próprio cartão dava
   verdadeiro em todos e a coluna ficava sem filete nenhum. */
.wp-block-post:last-child > :is(.eco-card--latest, .is-style-eco-card--latest),
.wp-block-post:last-child > :is(.eco-card--sub, .is-style-eco-card--sub),
:is(.eco-card--latest, .is-style-eco-card--latest):last-child:not(.wp-block-post > *),
:is(.eco-card--sub, .is-style-eco-card--sub):last-child:not(.wp-block-post > *) {
	border-bottom: 0;
	padding-bottom: 0;
}

/* ── Entrada de /ultimas/ ─────────────────────────────────────────────────
   Hora, título e assinatura à esquerda; miniatura à direita. É o inverso do
   `--horizontal` (que põe a imagem primeiro) e não uma variante dele: aqui o
   texto é o que manda a leitura e a miniatura é o remate da linha.

   Tudo medido em docs/reference-snapshots/pages-desktop/ECO ultimas.png, na
   coluna de 894px: miniatura de 234×132 encostada à direita (x 740-973, o
   mesmo `--eco-card-thumb` que os outros cartões já usam), 24px entre o texto
   e a imagem, 24px de folga em baixo e filete a separar — os separadores caem
   de 180 em 180 pixels, y=838, 1018, 1198…

   Encosta ao topo e não centra: a hora do primeiro artigo começa em y=690 e a
   miniatura em y=683, ou seja alinhadas em cima. Centrar dava certo com dois
   títulos de duas linhas e torto em todos os outros. */
:is(.eco-card--ultimas, .is-style-eco-card--ultimas) {
	display: flex;
	flex-wrap: wrap;
	align-items: flex-start;
	gap: var(--wp--preset--spacing--50);
	padding-bottom: var(--wp--preset--spacing--50);
	/* 2px: a 1px o filete quase desaparecia entre dois títulos de 30px, e o
	   que separa uma notícia da seguinte deixava de se ver a meio da lista. */
	border-bottom: 2px solid var(--wp--preset--color--border);
}

:is(.eco-card--ultimas, .is-style-eco-card--ultimas) > * {
	margin-block: 0;
}

:is(.eco-card--ultimas, .is-style-eco-card--ultimas) > .wp-block-post-featured-image {
	flex: 0 0 var(--eco-card-thumb, 234px);
	width: var(--eco-card-thumb, 234px);
	max-width: 100%;
	margin-bottom: 0;
	/* A ordem visual é imagem à direita; no markup vem depois do texto, por isso
	   não é preciso mexer na ordem — fica dito para quem vier trocar o padrão. */
	order: 2;
}

:is(.eco-card--ultimas, .is-style-eco-card--ultimas) > :not(.wp-block-post-featured-image) {
	flex: 1 1 var(--eco-card-body, 16rem);
	min-width: 0;
}

/* A hora: 14px, cinzento, e não o preto do título. O peso é 600 e não o 400
   do corpo — a 14px em cinzento, o normal desaparecia por cima de um título
   de 30px a negro, e no desenho a hora lê-se como uma etiqueta e não como
   texto corrido. É o mesmo peso que a data leva nos outros cartões do tema. */
:is(.eco-card--ultimas, .is-style-eco-card--ultimas) .wp-block-post-date {
	color: var(--wp--preset--color--muted);
	font-size: var(--wp--preset--font-size--small);
	font-weight: 600;
}

/* O título é maior do que num cartão de fila e mais apertado: 30px com passo de
   linha de 35px (medido nas duas linhas de "Preços do petróleo sobem com troca
   de ataques EUA-Irão" — alturas de maiúscula de 22px em y=718 e y=753).

   Está aqui e não no atributo do bloco pela mesma razão que o `--titulo-forte`:
   o `core/post-title` escreve o tamanho que lhe passam e deita fora o peso. */
:is(.eco-card--ultimas, .is-style-eco-card--ultimas) .wp-block-post-title,
:is(.eco-card--ultimas, .is-style-eco-card--ultimas) .wp-block-post-title a {
	font-size: 30px;
	font-weight: 700;
	line-height: 1.17;
}

/* ── Título forte ─────────────────────────────────────────────────────────
   Algumas secções pedem o título um pouco maior e mais pesado do que o resto
   — a Política é a que o desenho mostra assim (corpo de 24px, passo de linha
   29px, peso cheio).

   Está aqui e não no atributo do bloco porque o `core/post-title` ignora o
   `fontWeight` que lhe passem por `style.typography`: escreve o tamanho e
   deita fora o peso, e o cartão ficava a 600 sem nada que o explicasse. */
:is(.eco-card--titulo-forte, .is-style-eco-card--titulo-forte) .wp-block-post-title,
:is(.eco-card--titulo-forte, .is-style-eco-card--titulo-forte) .wp-block-post-title a {
	font-size: 24px;
	font-weight: 700;
	line-height: 1.2;
}

/* ── Opinião ──────────────────────────────────────────────────────────────
   Título e assinatura, sem imagem e sem antetítulo. O título é ink como
   qualquer outro cartão — estava a herdar o verde do painel.

   É o único cartão com tamanhos próprios em vez de os receber do sítio onde
   está: no desenho o destaque mede ~50px de corpo (passo de linha 61px) e as
   restantes ~24px (passo 28px), e essa relação é o que dá forma ao painel. */
:is(.eco-card--opiniao, .is-style-eco-card--opiniao) {
	display: flex;
	flex-direction: column;
	gap: var(--wp--preset--spacing--30);
	/* Cada peça ocupa o lugar todo e assenta em painel próprio, em vez de ser
	   texto solto encostado ao vizinho. O `height: 100%` é o que faz três
	   opiniões de comprimentos diferentes fecharem à mesma altura na fila; sem
	   ele cada painel media o seu texto e a fila ficava serrilhada. O padding é
	   o que separa o painel do texto — sem ele o filete do painel encostava ao
	   título e lia-se como moldura apertada. */
	height: 100%;
	padding: var(--wp--preset--spacing--40);
	background-color: var(--wp--preset--color--surface);
	/* Sem contorno e sem sombra: neste desenho o cartão de opinião distingue-se
	   do fundo da página pelo painel, não por uma linha à volta. */
	transition: background-color .15s ease, color .15s ease;
}

/* O cartão responde ao rato acendendo na cor do canal — e SÓ isso: fundo e
   texto, mais nada.

   Chegou a subir dois pixels e a ganhar sombra, e a subida foi retirada a
   pedido do utilizador. O argumento é bom: um deslocamento assinala a peça
   movendo-a, e numa fila de cartões encostados isso empurra a leitura para o
   que está debaixo do cursor. A cor assinala sem mexer em nada. */
:is(.eco-card--opiniao, .is-style-eco-card--opiniao):hover,
:is(.eco-card--opiniao, .is-style-eco-card--opiniao):focus-within {
	background-color: var(--eco-accent, var(--wp--preset--color--primary));
	color: var(--eco-on-primary, var(--wp--preset--color--inverse));
}

/* O título e a assinatura têm cor própria; sem isto ficavam com a do estado
   normal por cima do fundo aceso. É a mesma regra que a fila já tinha. */
:is(.eco-card--opiniao, .is-style-eco-card--opiniao):hover :is(.wp-block-heading, .wp-block-heading a, .eco-byline__nome),
:is(.eco-card--opiniao, .is-style-eco-card--opiniao):focus-within :is(.wp-block-heading, .wp-block-heading a, .eco-byline__nome) {
	color: inherit;
}

/* Sem deslocamento nenhum, só fica a transição de cor a desligar para quem
   pediu menos movimento. */
@media (prefers-reduced-motion: reduce) {
	:is(.eco-card--opiniao, .is-style-eco-card--opiniao) { transition: none; }
}

:is(.eco-card--opiniao, .is-style-eco-card--opiniao) > * {
	margin-block: 0;
}

:is(.eco-card--opiniao, .is-style-eco-card--opiniao) .wp-block-heading,
:is(.eco-card--opiniao, .is-style-eco-card--opiniao) .wp-block-heading a {
	color: var(--wp--preset--color--ink);
	font-size: 24px;
	font-weight: 700;
	line-height: 1.2;
	text-decoration: none;
}

/* O destaque do painel. */
:is(.eco-card--opiniao, .is-style-eco-card--opiniao).eco-card--opiniao-destaque .wp-block-heading,
:is(.eco-card--opiniao, .is-style-eco-card--opiniao).eco-card--opiniao-destaque .wp-block-heading a {
	font-size: clamp(2rem, 3.4vw, 3rem);
}

/* As opiniões da direita empilham dentro da coluna, com folga entre elas. */
:is(.eco-card--opiniao, .is-style-eco-card--opiniao) + :is(.eco-card--opiniao, .is-style-eco-card--opiniao) {
	margin-top: var(--wp--preset--spacing--50);
}

/* ── Excepto dentro do painel de cinco ────────────────────────────────────
   O painel de opinião com cinco peças (uma em destaque à esquerda, quatro numa
   grelha à direita) já separa os cartões com `gap: 40px` na própria grelha. A
   margem de irmão vinha por cima disso e somava-se ao vão: dois cartões que
   caiam na mesma coluna ficavam com 40px MAIS o espaçamento 50.

   A regra de cima continua a fazer falta onde as opiniões empilham de verdade
   numa coluna em fluxo — é o caso dos blocos de manchete 7 e 8, onde os dois
   cartões de opinião são irmãos directos sem grelha nenhuma a separá-los.

   Só acima dos 781px, que é o ponto em que o resto do tema separa telemóvel de
   desktop (é a medida do próprio WordPress, e a que as outras sete media
   queries deste ficheiro usam). Abaixo disso a grelha do painel colapsa numa
   coluna só e a margem deixa de ser dobrada — mas o utilizador pediu a
   excepção para desktop, e mudar também o telemóvel era decidir por ele. */
@media (min-width: 782px) {
	.eco-opiniao__lista :is(.eco-card--opiniao, .is-style-eco-card--opiniao) + :is(.eco-card--opiniao, .is-style-eco-card--opiniao) {
		margin-top: 0;
	}
}

/* ── Temas em Destaque ────────────────────────────────────────────────────
   Três colunas, cada uma no seu painel. Medido no Figma (nó `756:389`):
   secção de 1360×590, colunas de 426.667 e 40px de intervalo.

   As larguras NÃO se escrevem. (1360 − 2×40) ÷ 3 = 426.667, portanto
   `repeat(3,1fr)` com `gap:40px` dá o número do desenho sozinho e continua a
   dá-lo quando o contentor mudar de largura. Escrever 426.667 era fixar o
   desenho a um único ecrã. */
.eco-temas-destaque {
	display: grid;
	grid-template-columns: repeat(3, 1fr);
	gap: 40px;
}

/* Abaixo dos 1024 as três colunas não cabem: a peça fica com ~250px e o título
   parte-se em cinco linhas. Passam a duas, e a uma no telemóvel. */
@media (max-width: 1024px) {
	.eco-temas-destaque {
		grid-template-columns: repeat(2, 1fr);
		gap: var(--wp--preset--spacing--50);
	}
}

@media (max-width: 600px) {
	.eco-temas-destaque {
		grid-template-columns: 1fr;
	}
}

/* ── Coluna de tema ───────────────────────────────────────────────────────
   Cada coluna de "Temas em Destaque" assenta no seu painel, e os cartões lá
   dentro centram o texto (ver
   layouts-news/category news column with card-layout-variation.png).

   A altura do desenho fecha sozinha com estes números: 24 de folga + 22 da
   pastilha + 24 + 5×80 de peça + 4×24 de intervalo + 24 de folga = 590, que é
   a altura do nó. Por isso o intervalo é 24 (`spacing--50`) e não outro. */
.eco-tema-coluna {
	display: flex;
	flex-direction: column;
	gap: var(--wp--preset--spacing--50);
}

.eco-tema-coluna :is(.eco-card--topic, .is-style-eco-card--topic) {
	align-items: center;
	/* O intervalo entre miniatura e título é 16 no desenho (a miniatura acaba
	   em 142, o texto começa em 158) e o `--topic` traz 12. */
	gap: var(--wp--preset--spacing--40);
}

.eco-tema-coluna :is(.eco-card--topic, .is-style-eco-card--topic) .wp-block-post-title {
	align-self: center;
	/* 25px por linha, três linhas no máximo: é o que o Figma desenha (frames de
	   texto de 75 para três linhas e 50 para duas, dentro de peças de 80).

	   O corte a três não é decoração, é o que mantém a peça nos 80 e a coluna
	   nos 590. Sem ele um título real do ECO — 65 a 79 caracteres, contra os 51
	   a 56 dos exemplos do desenho — dava 5 e 6 linhas, e a secção fechava em
	   881. O título inteiro continua no `title` do artigo e a peça toda é
	   ligação, portanto não se perde nada a não ser o excesso. */
	line-height: 25px;
}

/* O corte vai no `<a>` e NÃO no `<h3>`, e isso não é gosto — é o que funciona.
   O `<h3>` é filho de um cartão em `display:flex`, ou seja um item de flex, e
   os itens de flex são "blockificados": o `display:-webkit-box` que o
   `-webkit-line-clamp` exige passa a `flow-root` e o corte deixa de existir.
   Medido no Chrome a 27/08/2026 — a regra estava a ser servida, aplicava-se, e
   a altura continuava em 87. O `<a>` não é item de flex e aceita a caixa. */
.eco-tema-coluna :is(.eco-card--topic, .is-style-eco-card--topic) .wp-block-post-title a {
	display: -webkit-box;
	-webkit-box-orient: vertical;
	-webkit-line-clamp: 3;
	line-clamp: 3;
	overflow: hidden;
}

/* Sem filete e sem folga em baixo: o `--topic` traz os dois, e nesta secção o
   Figma não desenha separador nenhum entre as peças — só frames de 80. Com
   eles, o passo dava 121 em vez dos 104 medidos e a coluna passava dos 590. */
.eco-tema-coluna :is(.eco-card--topic, .is-style-eco-card--topic) {
	padding-bottom: 0;
	border-bottom: 0;
}

/* ── A coluna dos Exclusivos ──────────────────────────────────────────────
   Ela não é uma categoria: é a caixa "Artigo exclusivo" do backoffice, e o
   desenho distingue-a. O contraste sai do `--eco-on-primary`, calculado por
   marca em `inc/brands.php` — ver a nota do `.eco-panel--green`, que ficou
   corrigido no mesmo dia e pela mesma razão. Nunca `ink` sobre `--eco-accent`.

   Sem canto redondo, pela regra CANTOS do topo do ficheiro: não é botão nem
   pastilha. */
/* A primeira coluna destaca-se por um TINTA da cor da marca, não pela cor cheia.
   Medido na referência (`report screens/Frame 234.png`, 28/08/2026) amostrando
   os pixels em vez de olhar:

       coluna 1 .............. rgb(235, 250, 241)   ← tinta de primary sobre branco
       colunas 2 e 3 ......... rgb(237, 239, 236)   = `surface`, o que já tínhamos
       pastilha "Exclusivos" . rgb(0, 195, 83)      = `primary`, letra rgb(0,36,16)
       pastilha "Categoria" .. rgb(0, 103, 44)      = `primary-dark`, letra branca

   Os 8% saem da própria amostra e batem certo nos três canais: 20/255 no
   vermelho, 5/60 no verde, 14/172 no azul — todos ~0,08. Não é um número
   escolhido a olho.

   ── Isto estava ao contrário, e vale a pena dizer porquê ──────────────────
   A versão anterior pintava a coluna com `--eco-accent` CHEIO e invertia a
   letra, e invertia também a pastilha. O desenho faz o oposto: a coluna é
   pálida, a letra fica normal, e quem leva a cor cheia é a pastilha. O erro
   veio de ler a referência em miniatura — em pequeno, uma coluna com tinta
   clara e uma pastilha saturada lê-se como uma coluna saturada. Só amostrando
   as cores é que a ordem apareceu.

   O `color-mix` usa `--eco-accent` e não o verde escrito à mão, para a tinta
   seguir a marca: a home do Advocatus tinta-se de Advocatus. A declaração de
   cima é a rede para quem não suporte `color-mix` — fica branca contra o
   cinzento das outras duas, que continua a distinguir a coluna.

   ── O QUE OS 8% NÃO AGUENTAM, se isto sair da home do ECO ─────────────────
   Hoje **só a home do ECO desenha esta secção** — confirmado a 28/08/2026
   percorrendo as doze páginas de canal e contando a classe no HTML: `eco-tema-
   coluna` aparece só em `/home-grelha/`. Portanto o que se segue não é defeito
   nenhum ainda; é o aviso para quem a puser numa marca.

   Os 8% saem do verde do ECO, que é claro (#00C353), e é isso que faz a coluna
   destacar-se do `surface` cinzento ao lado. Com um primário ESCURO a tinta cai
   quase na mesma luminância do cinzento e a coluna deixa de se ver — contraste
   contra `surface`, calculado: ECO 1.073, mas Fundos Europeus 1.003, ECO
   Avenida 1.002, +M 1.005, Local Online 1.012. E com um primário muito CLARO dá
   ao contrário: o Trabalho (#CCE8F6) tinta a #FBFDFE, a quatro passos do branco.

   Ou seja, a percentagem é da REFERÊNCIA e não uma constante do desenho. Quem
   levar esta secção a uma marca tem de a medir contra o `surface` dessa marca,
   e provavelmente de a ligar à luminância do primário em vez de a fixar. */
.eco-tema-coluna--exclusivos {
	background: var(--wp--preset--color--base);
	background: color-mix(in srgb, var(--eco-accent) 8%, var(--wp--preset--color--base));
}

/* A pastilha é a peça cheia desta coluna: cor da marca, e por cima a letra que
   contrasta com ela. O `--eco-on-primary` é calculado por marca — no ECO dá o
   #002410 escuro que a referência mostra, e numa marca escura dá branco, sem
   um segundo cálculo aqui a poder discordar do resto do tema.

   As colunas 2 e 3 não levam regra nenhuma: a pastilha por omissão já é
   `--eco-accent-text` com letra `base`, que é exactamente o verde escuro com
   letra branca que a referência desenha. */
.eco-tema-coluna--exclusivos :is(.eco-label--cheia, .is-style-eco-label--cheia):not(.eco-label--categoria):not(.is-style-eco-label--categoria) {
	background: var(--eco-accent);
	color: var(--eco-on-primary, var(--wp--preset--color--inverse));
}

/* ── Evento ───────────────────────────────────────────────────────────────
   O cartão da secção "Eventos" que fecha o artigo: o vertical com uma linha a
   mais entre a imagem e o título — categoria à esquerda, data de realização à
   direita, com um calendário ao lado.

   A data alinha à direita e não fica ao lado da categoria porque as duas
   coisas não são do mesmo tipo: uma classifica, a outra marca o dia, e no
   desenho é essa separação que deixa varrer a coluna das datas sem ler as
   categorias.

   `--evento` herda tudo o resto do `--vertical` — é o mesmo cartão com mais
   uma linha, e não uma variante nova de raiz. Ver o padrão eco/eventos.
   ───────────────────────────────────────────────────────────────────────── */

:is(.eco-card--evento, .is-style-eco-card--evento) {
	display: flex;
	flex-direction: column;
}

:is(.eco-card--evento, .is-style-eco-card--evento) > * + * {
	margin-top: var(--wp--preset--spacing--20);
}

:is(.eco-card--evento, .is-style-eco-card--evento) > .wp-block-post-featured-image + * {
	margin-top: var(--wp--preset--spacing--30);
}

.eco-card__meta {
	align-items: center;
	gap: var(--wp--preset--spacing--30);
}

/* ── Lista de newsletters ─────────────────────────────────────────────────
   A página /newsletters/ (pages-desktop/ECO newsletters opt2 - 1.png e - 2).
   Substituiu a grelha de três cartões do `opt1`: uma lista de uma coluna,
   agrupada pela hora a que a newsletter chega, com um interruptor por linha e
   uma barra que conta as escolhidas e pede o email.

   Reaproveita o que já existe em vez de trazer peças novas: o retrato é o
   `.eco-byline__foto` das assinaturas de Opinião (mesmo disco verde, mesmo
   SVG, aqui a 40px pela variável que ele já lê), a descrição é texto de corpo
   pequeno e o "Ver exemplo" é uma ligação em verde-texto como as outras
   ligações de serviço do tema.

   O nome não é um título de secção nem uma etiqueta: é o nome próprio da
   newsletter, em Barlow e no verde-texto — a mesma cor que o antetítulo usa,
   por ser a cor com que a marca fala em corpo pequeno.

   A largura é a do poço do artigo (894px). No desenho a lista mede 908px
   dentro de uma janela de 1440; 894 é a medida que o tema já tem para uma
   coluna de leitura, e catorze pixels não justificam um número novo.
   ───────────────────────────────────────────────────────────────────────── */

.eco-nl {
	max-width: 894px;
	margin-inline: auto;
}

/* ── Os grupos ────────────────────────────────────────────────────────────
   O título do grupo é a única coisa que ordena a página: diz a que horas
   chega o que está por baixo. Leva o filete por baixo, como as etiquetas de
   secção da homepage, e o respiro maior por cima — é ele que separa um grupo
   do anterior, não uma margem entre listas. */
.eco-nl__grupo + .eco-nl__grupo {
	margin-top: var(--wp--preset--spacing--70);
}

.eco-nl__grupo-titulo {
	margin: 0 0 var(--wp--preset--spacing--30);
	padding-bottom: var(--wp--preset--spacing--30);
	border-bottom: 1px solid var(--wp--preset--color--border);
	font-family: var(--wp--preset--font-family--headline);
	font-size: var(--wp--preset--font-size--x-large);
	font-weight: 700;
	line-height: 1.2;
}

.eco-nl__lista {
	margin: 0;
	padding: 0;
	list-style: none;
}

/* Cada newsletter é uma linha com um filete por baixo. A última não o leva:
   o filete separa itens, e por baixo do último não há nada para separar —
   ficava a fazer de fundo do grupo seguinte. */
.eco-nl__item {
	padding-block: var(--wp--preset--spacing--40);
	border-bottom: 1px solid var(--wp--preset--color--border);
}

.eco-nl__grupo .eco-nl__item:last-child {
	border-bottom: 0;
}

/* ── A linha ──────────────────────────────────────────────────────────────
   É um `<label>`: o alvo do clique é a linha inteira e não um quadrado de
   24px no canto. O `for` está escrito no HTML e não implícito, para o alvo
   continuar a valer quando o leitor de ecrã percorre a página por rótulos. */
.eco-nl__linha {
	--eco-byline-size: 40px;
	display: flex;
	align-items: center;
	gap: var(--wp--preset--spacing--30);
	cursor: pointer;
}

.eco-nl__nomes {
	display: flex;
	flex-direction: column;
	gap: 1px;
	min-width: 0;
}

.eco-nl__nome {
	color: var(--eco-accent-text);
	font-family: var(--wp--preset--font-family--headline);
	font-size: var(--wp--preset--font-size--large);
	font-weight: 700;
	line-height: 1.15;
}

.eco-nl__autor {
	color: var(--wp--preset--color--muted);
	font-size: var(--wp--preset--font-size--small);
}

/* ── O interruptor ────────────────────────────────────────────────────────
   Um `<input type="checkbox">` pintado, e não um botão: é o formulário que
   leva a escolha para o servidor, e o teclado, o `:focus-visible` e o estado
   lido em voz alta vêm todos do elemento. O `appearance: none` tira-lhe o
   desenho do sistema e deixa ficar tudo o resto.

   Desligado é cinzento com o disco à esquerda; ligado é verde com o disco à
   direita e o visto desenhado por cima — o mesmo visto do desenho, feito com
   duas arestas de uma caixa em `::after` para não trazer um SVG por causa de
   doze pixels. */
.eco-nl__interruptor {
	flex: none;
	margin-left: auto;
	position: relative;
	appearance: none;
	-webkit-appearance: none;
	width: 44px;
	height: 24px;
	border: 0;
	border-radius: 999px;
	background: var(--wp--preset--color--border);
	cursor: pointer;
	transition: background-color .18s ease;
}

.eco-nl__interruptor::before {
	content: "";
	position: absolute;
	top: 3px;
	left: 3px;
	width: 18px;
	height: 18px;
	border-radius: 999px;
	background: var(--wp--preset--color--base);
	box-shadow: 0 1px 3px rgba(0, 0, 0, .25);
	transition: transform .18s ease;
}

.eco-nl__interruptor:checked {
	background: var(--eco-accent);
}

.eco-nl__interruptor:checked::before {
	transform: translateX(20px);
}

/* O visto, desenhado dentro do disco quando está ligado. */
.eco-nl__interruptor::after {
	content: "";
	position: absolute;
	top: 8px;
	left: 11px;
	width: 4px;
	height: 8px;
	border: solid var(--eco-accent);
	border-width: 0 2px 2px 0;
	transform: rotate(45deg) scale(0);
	transform-origin: center;
	transition: transform .18s ease;
}

.eco-nl__interruptor:checked::after {
	transform: translateX(20px) rotate(45deg) scale(1);
}

.eco-nl__interruptor:focus-visible {
	outline: 2px solid var(--eco-accent-text);
	outline-offset: 2px;
}

/* ── O pé da linha ────────────────────────────────────────────────────────
   Descrição à esquerda, "Ver exemplo" à direita. O dia da semana vai a
   negrito à cabeça da descrição nas semanais e nas quinzenais, que é como o
   desenho as distingue das que chegam todos os dias. */
.eco-nl__pe {
	display: flex;
	align-items: baseline;
	justify-content: space-between;
	gap: var(--wp--preset--spacing--40);
	margin: var(--wp--preset--spacing--30) 0 0;
	font-size: var(--wp--preset--font-size--small);
}

.eco-nl__exemplo {
	flex: none;
	color: var(--eco-accent-text);
}

/* ── A barra de subscrição ────────────────────────────────────────────────
   Faixa escura de lado a lado com a contagem por cima e o email por baixo.
   Sangra para fora do poço de 894px porque no desenho ela atravessa a página
   inteira — é o único elemento desta página que o faz, e é o que a faz ler
   como uma barra e não como mais um cartão da lista.

   Cola-se ao ecrã só depois de o script pegar (`is-colada`): colada e a
   contar zero seria pior do que quieta no fim da lista, que é onde ela fica
   sem JavaScript. O `top` vem de `--eco-nl-topo`, que o script mede a partir
   do cabeçalho verde — este também é colado, e uma barra a `top: 0` ficava
   escondida por baixo dele. */
.eco-nl__barra {
	margin-top: var(--wp--preset--spacing--70);
	padding: var(--wp--preset--spacing--40) var(--wp--preset--spacing--50);
	background: var(--wp--preset--color--inverse);
	color: var(--wp--preset--color--base);
	text-align: center;
}

.eco-nl__barra.is-colada {
	position: sticky;
	top: var(--eco-nl-topo, 0px);
	z-index: 10;
	margin-inline: calc(50% - 50vw);
	padding-inline: calc(50vw - 50% + var(--wp--preset--spacing--50));
}

/* Nada escolhido, nada a subscrever: a barra sai do caminho. Sem JavaScript
   esta classe nunca é posta e a barra fica visível — que é o comportamento
   certo, porque aí é ela o único caminho para subscrever. */
.eco-nl__barra.is-vazio {
	display: none;
}

.eco-nl__contagem {
	margin: 0 0 var(--wp--preset--spacing--30);
}

.eco-nl__contagem-numero {
	color: var(--eco-accent);
	font-weight: 700;
}

.eco-nl__envio {
	display: flex;
	align-items: center;
	justify-content: center;
	flex-wrap: wrap;
	gap: var(--wp--preset--spacing--30);
}

.eco-nl__envio-rotulo {
	font-size: var(--wp--preset--font-size--small);
}

.eco-nl__email {
	width: min(280px, 100%);
	padding: var(--wp--preset--spacing--30) var(--wp--preset--spacing--40);
	border: 0;
	background: var(--wp--preset--color--base);
	color: var(--wp--preset--color--ink);
	font-family: inherit;
	font-size: var(--wp--preset--font-size--small);
}

.eco-nl__subscrever {
	padding: var(--wp--preset--spacing--30) var(--wp--preset--spacing--50);
	border: 0;
	border-radius: 4px;
	background: var(--eco-accent);
	color: var(--wp--preset--color--inverse);
	font-family: inherit;
	font-size: var(--wp--preset--font-size--small);
	font-weight: 700;
	cursor: pointer;
}

.eco-nl__subscrever:hover {
	background: var(--eco-accent-text);
	color: var(--wp--preset--color--base);
}

/* Em ecrãs estreitos o pé da linha empilha: a descrição ocupa a largura toda e
   o "Ver exemplo" passa para baixo, alinhado à direita como no desenho de
   telemóvel. Manter os dois na mesma linha dava uma descrição de duas palavras
   por linha. */
@media (max-width: 600px) {
	.eco-nl__pe {
		flex-wrap: wrap;
	}

	.eco-nl__exemplo {
		margin-left: auto;
	}
}

/* ── Campo de ficha técnica ───────────────────────────────────────────────
   A linha "cargo → nome" das páginas institucionais. Duas colunas quando há
   espaço, uma quando não há; o rótulo em cinzento pequeno e o valor com o
   corpo do texto.

   Não é uma tabela de propósito: a ficha técnica é uma lista de pessoas e de
   números, e uma grelha com traços dava-lhe um aspecto de relatório que o
   desenho não tem em lado nenhum. É o mesmo par rótulo/valor das fichas do
   guia de estilo, com as cores do site.
   ───────────────────────────────────────────────────────────────────────── */

/* O corpo é o do artigo e não o do site. Aqui esteve
   `font-size: medium` — 1rem, que é o tamanho global do texto — e isso
   fazia a ficha descer para 16px dentro de um corpo que corre a 20 (o
   `.eco-article-body` sobe para `large`). Numa página que é sobretudo
   fichas, o resultado era a página inteira a ler-se mais pequena do que o
   resto do site e a saltar 4px sempre que aparecia um parágrafo ou uma
   lista: 43 linhas a 16 contra 8 a 20, na Ficha Técnica.

   Sem declaração nenhuma herda os 20 do corpo, e passa a haver um tamanho
   só. A ficha continua a distinguir-se do texto corrido pelo que sempre a
   distinguiu — as duas colunas, o filete por baixo e o rótulo em `muted` —
   e não por ser mais pequena. */
.eco-article-body .eco-ficha-campo {
	display: grid;
	grid-template-columns: minmax(0, 15rem) minmax(0, 1fr);
	gap: .2rem 1.5rem;
	align-items: baseline;
	padding-bottom: var(--wp--preset--spacing--30);
	border-bottom: 1px solid var(--wp--preset--color--border);
}

.eco-article-body .eco-ficha-campo strong {
	color: var(--wp--preset--color--muted);
	font-weight: 600;
}

/* Linhas seguidas do mesmo bloco encostam-se: são uma lista, e os 24px que o
   corpo do artigo põe entre parágrafos partiam-na em fichas soltas. */
.eco-article-body .eco-ficha-campo + .eco-ficha-campo {
	margin-top: var(--wp--preset--spacing--30);
}

@media (max-width: 600px) {
	.eco-article-body .eco-ficha-campo {
		grid-template-columns: 1fr;
	}
}

/* A data e o seu calendário. O ícone é escrito pelo eco-core ao lado do
   `<time>` (inc/event-date.php) e não existe quando o evento não tem data. */
.eco-data-evento,
.eco-card__meta > .eco-data-evento {
	display: inline-flex;
	align-items: center;
	gap: 6px;
	margin: 0;
	font-weight: 600;
	white-space: nowrap;
}

.eco-data-evento__icone {
	flex: none;
	width: 15px;
	height: 15px;
	fill: currentColor;
	opacity: .85;
}

/* O ícone sai como irmão do `<time>` e não como filho: o filtro do eco-core
   junta-os antes do bloco, e é o `eco-card__meta` que os aproxima. */
.eco-card__meta > svg.eco-data-evento__icone {
	margin-left: auto;
	margin-right: -2px;
	color: var(--wp--preset--color--muted);
}


/* ── Destaque ─────────────────────────────────────────────────────────────
   Imagem como fundo, categoria e título em branco por cima. A proporção é um
   eixo à parte porque muda com a coluna onde o cartão cai: 16/9 nos
   Especiais, mais alto nos blocos de uma coluna. */
:is(.eco-card--destaque, .is-style-eco-card--destaque).wp-block-cover {
	min-height: 0;
	aspect-ratio: 16 / 9;
}

:is(.eco-card--destaque, .is-style-eco-card--destaque) .wp-block-cover__inner-container > *,
:is(.eco-card--destaque, .is-style-eco-card--destaque) .wp-block-post-title,
:is(.eco-card--destaque, .is-style-eco-card--destaque) .wp-block-post-title a,
:is(.eco-card--destaque, .is-style-eco-card--destaque) .wp-block-post-terms,
:is(.eco-card--destaque, .is-style-eco-card--destaque) .wp-block-post-terms a {
	color: var(--wp--preset--color--base);
}

:is(.eco-card--ratio-16x9, .is-style-eco-card--ratio-16x9).wp-block-cover { aspect-ratio: 16 / 9; }
:is(.eco-card--ratio-3x2,  .is-style-eco-card--ratio-3x2).wp-block-cover  { aspect-ratio: 3 / 2; }
:is(.eco-card--ratio-4x5,  .is-style-eco-card--ratio-4x5).wp-block-cover  { aspect-ratio: 4 / 5; }
:is(.eco-card--ratio-1x1,  .is-style-eco-card--ratio-1x1).wp-block-cover  { aspect-ratio: 1 / 1; }


/* ──────────────────────────────────────────────────────────────────────────
   7. Contentores de cartões
   ────────────────────────────────────────────────────────────────────────── */

/* ── Destaques de categoria ───────────────────────────────────────────────
   O painel cinzento que abre uma página de secção (padrão
   `eco/destaques-categoria`; medido em Group 35 de "ECO categoria": faixa de
   1440×451, folga de 40 em toda a volta, imagem de 660×371 à esquerda e
   texto à direita).

   Uma regra serve as duas variantes. A lista é `auto-fit`: com um artigo há
   uma coluna e o cartão ocupa os 1360; com dois há duas colunas de 660. A
   miniatura é uma percentagem e não um valor fixo, por isso encolhe com o
   cartão — 660 dentro de 1360, 310 dentro de 660 — sem uma segunda variante
   a dizer o mesmo por outras palavras. */
.eco-destaques__lista {
	display: grid;
	grid-template-columns: repeat(auto-fit, minmax(min(100%, 640px), 1fr));
	gap: 40px;
	margin: 0;
	padding: 0;
	list-style: none;
}

.eco-destaques .eco-card--horizontal {
	--eco-card-thumb: calc(50% - 20px);
	gap: 40px;
}

/* O título desce um degrau quando o cartão passa a meia largura. É consulta
   de contentor e não de ecrã porque o que manda é a largura do cartão: o
   mesmo painel tem um cartão de 1360 ou dois de 660 na mesma janela.

   Aqui o corpo do título é do CSS e não um atributo do bloco, ao contrário do
   resto dos cartões (ver a nota no cabeçalho da secção 6). Duas razões: um
   atributo não sabe em que largura vai calhar, e a classe que ele geraria
   (`has-xx-large-font-size`) sai do core com `!important` — a consulta de
   contentor nunca lhe ganharia sem levar outro `!important` atrás. */
/* `margin-block: 0` porque a lista do core continua a ser `is-layout-flow` e
   põe margem entre irmãos: dentro da grelha isso não junta nada, só empurrava
   o segundo cartão 16px para baixo do primeiro. */
.eco-destaques__lista > .wp-block-post {
	container-type: inline-size;
	margin-block: 0;
}

/* 700 e não o 600 que os cartões usam: o destaque abre a página e fica logo
   por cima da grelha, que já vem a 700 — a 600 lia-se mais leve do que as
   notícias que vêm a seguir, que é o contrário do que um destaque faz. */
.eco-destaques .wp-block-post-title {
	font-size: var(--wp--preset--font-size--xx-large);
	font-weight: 700;
}

@container (max-width: 800px) {
	.eco-destaques .wp-block-post-title {
		font-size: var(--wp--preset--font-size--x-large);
	}
}

/* Fita de texto: colunas separadas por filete à esquerda. */
.eco-text-strip-row > .wp-block-post,
/* Os filetes que separam as colunas: 2px e mais escuros do que a linha de
   contorno normal. No desenho medem 2px em #BBBDBA — sobre o painel cinzento
   da faixa, o cinzento-claro do `border` quase não se via. */
.eco-live-strip-related > .wp-block-post {
	border-left: 2px solid color-mix(in srgb, var(--wp--preset--color--border) 70%, var(--wp--preset--color--muted));
	padding-left: var(--wp--preset--spacing--50);
}

.eco-text-strip-row > .wp-block-post:first-child {
	border-left: 0;
	padding-left: 0;
}

/* ── As opiniões pequenas do painel ───────────────────────────────────────
   Duas colunas com filete à esquerda — nas duas, e não só na segunda: o
   primeiro filete é o que separa a lista do destaque que fica à sua esquerda.
   No desenho (opinion-highlights) são duas linhas verticais a toda a altura
   do painel, uma antes de cada coluna.

   Não reaproveita o `.eco-text-strip-row` porque esse existe para filhos que
   são artigos de uma consulta e tira o filete ao primeiro; aqui os filhos são
   colunas e o primeiro filete é o que faz falta. */
.eco-opiniao-lista > .wp-block-column {
	border-left: 2px solid color-mix(in srgb, var(--wp--preset--color--border) 70%, var(--wp--preset--color--muted));
	padding-left: var(--wp--preset--spacing--50);
	/* Centrado na vertical, e com as duas opiniões afastadas uma da outra. No
	   desenho a lista tem 55px entre a assinatura de uma e o título da
	   seguinte, e o conjunto assenta a meio do filete — sobrando 8px em cima e
	   13 em baixo. O que estava cá era uma coluna em fluxo com 24px de
	   intervalo: as quatro opiniões enchiam o painel de ponta a ponta e a
	   lista lia-se como uma tabela encostada ao topo. */
	display: flex;
	flex-direction: column;
	justify-content: center;
	gap: var(--wp--preset--spacing--70);
}

/* O intervalo passa a ser o do flex; sem isto somava-se-lhe a margem que o
   fluxo do core põe entre irmãos e os 48px viravam 72. */
.eco-opiniao-lista > .wp-block-column > * {
	margin-block: 0;
}

/* E o destaque acompanha: se a lista centra e ele não, o painel fica com o
   título grande encostado ao topo e a lista a flutuar ao lado. */
.eco-opiniao > .wp-block-columns > .wp-block-column {
	display: flex;
	flex-direction: column;
	justify-content: center;
}

/* O primeiro artigo da grelha já não é promovido a painel cinzento com fundo
   e duas colunas: quem abre a página de secção é agora o painel de destaques
   (`.eco-destaques`, mais acima), que é o que o desenho mostra — de margem a
   margem e não à largura do poço — e que sai da grelha para não aparecer duas
   vezes na mesma página. Com "sem destaques" a grelha abre direta, uniforme
   da primeira à última. */

/* Lista de /ultimas/: a última entrada antes do paginador não leva filete — já
   há o botão a fechar a coluna, e o desenho mostra a lista a acabar no ar. */
.eco-ultimas-lista > .wp-block-post:last-child > :is(.eco-card--ultimas, .is-style-eco-card--ultimas),
.eco-ultimas-lista > .wp-block-post:last-child:is(.eco-card--ultimas, .is-style-eco-card--ultimas) {
	border-bottom: 0;
}

/* A faixa de publicidade que inc/ad-manager.php enfia a meio da lista. É um
   `<li>` para a `<ul>` continuar válida, mas não é uma notícia: sem marcador de
   lista.

   O desenho desenha o criativo à largura da coluna (894×111). Aqui fica com a
   largura real do formato — 728×90, centrado pelo `.eco-ad` — porque esticar um
   728×90 até 894 é ampliar o criativo de outra pessoa e sai desfocado. A
   proporção do desenho (8,05) é a do 728×90 (8,09): o que o desenho mostra é
   este formato, à escala. */
.eco-lista-anuncio {
	list-style: none;
}


/* ──────────────────────────────────────────────────────────────────────────
   7b. Fita de cotações
   ──────────────────────────────────────────────────────────────────────────
   Cada cotação são quatro partes — símbolo, seta, variação e um gráfico
   minúsculo — dentro de uma barra verde-escura.

   Medido em pages-desktop/ECO homepage.png: barra de 48px, símbolo e valor a
   16px, seta de 12×10, gráfico de 77×18, 16px entre as partes e 48px entre
   cotações. O que lá estava tinha a seta e o valor no mesmo `<strong>`, o que
   dava uma seta do tamanho do texto e colada ao número.

   O gráfico é um SVG embutido e não um ficheiro: são cinco por página e
   nenhum vale um pedido ao servidor. A linha vem em duas partes — o passado
   em cinzento e o troço recente na cor da variação —, que é o que o desenho
   mostra.
   ────────────────────────────────────────────────────────────────────────── */

.eco-ticker-quote {
	display: flex;
	align-items: center;
	gap: 14px;
}

/* ── A fita em ecrãs estreitos ────────────────────────────────────────────
   Uma fila só, arrastável, a sangrar pelas duas margens: no desenho de
   telemóvel a barra mede 48px e mostra duas cotações, com a segunda cortada
   pela direita — é uma fita, e uma fita corre.

   Com o `flex-wrap: wrap` que o bloco traz, as cinco cotações empilhavam-se em
   cinco linhas e a barra passava dos 48px para 304 — dois terços de um ecrã de
   844px gastos numa fita de cotações que ninguém pediu para ler toda de uma
   vez. */
@media (max-width: 781px) {
	.eco-ticker-row {
		flex-wrap: nowrap;
		justify-content: flex-start;
		gap: var(--wp--preset--spacing--60);
		overflow-x: auto;
		scrollbar-width: none;
		/* Desfaz a folga lateral do painel para a fita começar no bordo, e
		   repõe-na como padding do que rola — a primeira cotação continua
		   alinhada com o texto da página, a última sai pela direita. */
		padding-inline: var(--wp--preset--spacing--60);
		margin-inline: calc(var(--wp--preset--spacing--60) * -1);
	}

	.eco-ticker-row::-webkit-scrollbar {
		display: none;
	}

	.eco-ticker-quote {
		flex: none;
	}
}

.eco-ticker-quote > * {
	margin-block: 0;
}

/* A seta desce para 12px e deixa de acompanhar o corpo do valor. */
.eco-ticker__seta {
	font-size: 12px;
	line-height: 1;
}

/* Fina: no desenho a variação não é um `<strong>`. */
.eco-ticker__valor {
	font-weight: 500;
}

.eco-ticker__grafico {
	display: block;
	flex: none;
	width: 77px;
	height: 18px;
	overflow: visible;
}


/* ──────────────────────────────────────────────────────────────────────────
   7c. Faixa "Em Direto"
   ──────────────────────────────────────────────────────────────────────────
   Painel cinzento com filete verde por cima, o distintivo em cima à esquerda
   e quatro colunas da mesma altura: a primeira é um painel verde, as outras
   três separadas por filete.

   Medido no desenho: painel de 1360×259 com 24px de folga, filete de 2px em
   #00C353, painel verde de 368×153 e o texto de todas as colunas centrado na
   vertical. Antes era uma faixa branca com um filete cinzento por cima e as
   colunas encostadas ao topo — cada uma com a altura do seu próprio título.
   ────────────────────────────────────────────────────────────────────────── */

/* As colunas esticam à altura da mais alta (é o que o core já faz) e o texto
   centra-se dentro de cada uma. */
.eco-live-strip-feature,
.eco-live-strip-related > .wp-block-post {
	display: flex;
	flex-direction: column;
	justify-content: center;
}

.eco-live-strip-feature > * {
	margin-block: 0;
}

/* As manchetes traziam as margens de `<h3>`/`<h4>` — 32px acima e abaixo de
   cada uma —, e como as colunas centram o texto isso engordava a faixa em 64px
   sem separar nada de ninguém.

   O destaque também: `.eco-live-strip-feature > *` só chega ao bloco de
   consulta, e a manchete vive dois níveis abaixo dele. Era ela que fazia a
   fila — o painel verde media 179px de altura para 67px de manchete e 48 de
   folga. Sem as margens fica nos 115, e as três colunas ao lado passam a ter
   ~32px acima e abaixo do texto, a par dos 24 que têm de cada lado. */
.eco-live-strip-related .wp-block-post-title,
.eco-live-strip-feature .wp-block-post-title {
	margin-block: 0;
}

/* A grelha dos três destaques não estica sozinha à altura da coluna — sem
   isto as células ficam com a altura do texto e o `justify-content` acima não
   tem folga nenhuma para centrar. */
.eco-live-strip .wp-block-column > .wp-block-query,
.eco-live-strip .eco-live-strip-related {
	height: 100%;
}

/* O painel verde é a própria coluna, para acompanhar a altura da fila; se
   fosse um grupo lá dentro parava na altura do seu texto.

   `border-box` porque a largura do desenho (368px) é a da caixa toda: sem
   isto os 24px de folga somavam-se e a coluna saía a 416px. */
.eco-live-strip-feature {
	box-sizing: border-box;
	background: var(--eco-accent);
	padding: var(--wp--preset--spacing--50);
}

.eco-live-strip-feature .wp-block-post-title,
.eco-live-strip-feature .wp-block-post-title a {
	color: var(--wp--preset--color--ink);
}


/* ──────────────────────────────────────────────────────────────────────────
   7d. Faixa das newsletters
   ──────────────────────────────────────────────────────────────────────────
   Painel cinzento com o texto à esquerda e um leque de cartões inclinados à
   direita, cortados em baixo pelo painel.

   Medido em components/gray-panel--newsletter-dark-button.png e na homepage
   (y≈2633-2879): título verde #00672C a 32px, subtítulo #002410 a 16px, botão
   escuro de 48px e quatro cartões brancos sobrepostos.

   O leque é decoração: `aria-hidden` no padrão e `pointer-events:none` aqui,
   para não entrar na ordem de leitura nem apanhar cliques.
   ────────────────────────────────────────────────────────────────────────── */

.eco-newsletter {
	position: relative;
	/* Os cartões saem por baixo do painel de propósito; é o painel que os
	   corta, como no desenho. */
	overflow: hidden;
}

/* ── Descarga de edição ───────────────────────────────────────────────────
   O irmão longitudinal da chamada de newsletter: mesmo painel, mesma
   repartição, e por isso quase nenhuma folha própria — o que a faixa precisa
   já vem do painel e das colunas do núcleo.

   Só a capa pede regra. Sem limite de largura a imagem enchia a coluna de
   653px e a faixa deixava de se ler como uma faixa: a capa passava a ser o
   bloco e o texto o acompanhamento, que é o contrário do que o desenho quer.
   Os 260px são a medida em que a capa ainda se percebe como capa e a coluna
   de texto continua a mandar.

   Canto vivo, como o resto — a sombra é o que a levanta do painel cinzento,
   e não um raio.

   O selector leva a faixa à cabeça (`.eco-descarga .eco-descarga__capa img`) e
   não é enfeite: mais abaixo nesta folha há `.wp-block-post-content img
   { max-width: 100% }`, com a mesma especificidade e a vir depois. Dentro do
   corpo de uma página — que é onde o guia de estilo desenha — essa ganhava, e
   a capa saía a 558×817 em vez dos 260 previstos. Medido a 28/08/2026 na
   página do guia; foi a captura que o mostrou, não o ficheiro. */
.eco-descarga .eco-descarga__capa img {
	display: block;
	width: 100%;
	max-width: 260px;
	height: auto;
	margin-inline: auto;
	box-shadow: 0 6px 18px rgb(0 0 0 / 12%);
}

/* A capa é retrato e a faixa é longitudinal — e as duas coisas não cabem uma
   na outra sem uma decisão. Medido a 28/08/2026: a 260px de largura a capa
   tem 380 de altura e punha a faixa nos 476px, contra os 245 da chamada de
   newsletter ao lado. Quase o dobro do irmão não é «longitudinal como a
   newsletter», que foi o que se pediu.

   A saída é a mesma que o irmão usa para o leque: **a faixa corta o visual**.
   A capa entra pelo topo e sai por baixo do painel, e o que se vê é a parte de
   cima da edição — que é a que a identifica. A alternativa era encolher a capa
   até caber, e a 102px de largura deixava de se ler como capa. */
.eco-descarga .eco-descarga__capa .wp-block-image {
	max-height: 150px;
	margin: 0;
	overflow: hidden;
}

/* Empilhada, a capa vem primeiro e o texto por baixo: quem chega ao fundo da
   coluna já a viu, e o botão fica a seguir ao que o explica. */
@media (max-width: 781px) {
	.eco-descarga .wp-block-columns { flex-direction: column-reverse; }
	.eco-descarga .eco-descarga__capa img { max-width: 200px; }
}

.eco-newsletter__texto > * {
	margin-block: 0;
}

.eco-newsletter__texto > * + * {
	margin-top: var(--wp--preset--spacing--50);
}

/* O leque sai da corrente: posicionado, não empurrado.

   Com `margin-bottom` negativa o leque continuava a contar para a altura da
   linha de colunas, e como o cartão mede 175,6 era ele — e não o texto — a
   decidir a altura do painel: 271,6 contra os 247 do componente
   `newsletters_cta` do Figma. (A margem nem chegava a aplicar-se: a regra do
   core para o último filho de uma coluna repunha-a a zero.)

   Absoluto, a altura passa a vir do texto: 48 + 149,2 + 48 = 245,2, a 1,8px do
   desenho. O `bottom` negativo mantém os cartões a sair por baixo, e é o
   `overflow:hidden` do painel que os corta, como no desenho. Abaixo de 782px o
   leque desaparece (ver secção responsiva), por isso não há sobreposição com o
   texto quando as colunas empilham. */
.eco-newsletter__fan {
	position: absolute;
	right: var(--wp--preset--spacing--70);
	bottom: -76px;
	display: flex;
	align-items: flex-end;
	justify-content: flex-end;
	gap: 0;
	pointer-events: none;
}

.eco-newsletter__cartao {
	box-sizing: border-box;
	flex: 0 0 150px;
	width: 150px;
	margin-left: -18px;
	padding: 18px 14px 30px;
	background: var(--wp--preset--color--base);
	box-shadow: 0 6px 18px rgb(0 0 0 / 12%);
	text-align: center;
	transform-origin: bottom center;
}

.eco-newsletter__cartao > * {
	margin-block: 0;
}

.eco-newsletter__cartao > * + * {
	margin-top: 14px;
}

/* O disco verde faz as vezes do retrato: as fotografias do desenho são de
   pessoas reais e não viajam no tema. */
.eco-newsletter__avatar {
	width: 62px;
	height: 62px;
	margin-inline: auto;
	border-radius: 999px;
	background: var(--eco-accent);
}

.eco-newsletter__titulo {
	color: var(--eco-accent-text);
	font-family: var(--wp--preset--font-family--headline);
	font-size: 1.25rem;
	font-weight: 700;
	line-height: 1.1;
}

.eco-newsletter__autor {
	color: var(--wp--preset--color--muted);
	font-size: 0.8125rem;
	line-height: 1.2;
}

/* As quatro inclinações do desenho, da esquerda para a direita. */
.eco-newsletter__fan > :nth-child(1) { transform: rotate(-11deg) translateY(20px); }
.eco-newsletter__fan > :nth-child(2) { transform: rotate(-5deg)  translateY(4px); }
.eco-newsletter__fan > :nth-child(3) { transform: rotate(2deg)   translateY(0); }
.eco-newsletter__fan > :nth-child(4) { transform: rotate(9deg)   translateY(18px); }


/* ──────────────────────────────────────────────────────────────────────────
   7e. Tabela de cotações (Mercados)
   ──────────────────────────────────────────────────────────────────────────
   A pastilha da variação tem 88×32 no desenho e o texto é #002410, não preto.
   Estava com 38px de altura e a seta do tamanho do valor. A folga da pastilha
   vive no padrão (é atributo do bloco e sai inline, onde o CSS não chega).
   ────────────────────────────────────────────────────────────────────────── */

.eco-market-table .eco-market-table__seta {
	font-size: 11px;
	line-height: 1;
}

.eco-market-table .eco-market-table__valor {
	font-weight: 500;
}


/* ──────────────────────────────────────────────────────────────────────────
   7f. Coluna da direita (barra lateral)
   ──────────────────────────────────────────────────────────────────────────
   A coluna de 310px de /ultimas/: o painel dos parceiros e o rectângulo de
   publicidade. O rótulo e as pastilhas NÃO estão aqui — são componentes que já
   existiam e ficam onde estavam: o rótulo é o `eco-section-title` da secção 3
   (variante `--filete-baixo`) e as pastilhas são o `eco-chip-cloud` da secção 4.
   ────────────────────────────────────────────────────────────────────────── */

/* ── Painel dos parceiros ─────────────────────────────────────────────────
   Cabeça azul-marinho com a marca, quatro filetes em degradê e a grelha de
   logótipos por baixo. O azul é o `label_bg` que a marca capital-verde já tem
   em inc/brands.php (#020B35); os filetes foram lidos a pixel no desenho
   (y 1175-1187 petróleo, 1188-1199 verde, 1200-1213 verde-claro, 1214-1226
   lima). */
.eco-parceiros {
	background: var(--wp--preset--color--base);
}

.eco-parceiros__marca {
	display: flex;
	align-items: center;
	justify-content: center;
	min-height: 145px;
	padding: var(--wp--preset--spacing--50);
	background: #020b35;
}

.eco-parceiros__wordmark {
	margin: 0;
	color: #fff;
	font-family: var(--wp--preset--font-family--sans);
	font-size: 2rem;
	font-weight: 300;
	letter-spacing: -0.01em;
	line-height: 1.05;
	text-align: center;
}

.eco-parceiros__filetes {
	display: flex;
	flex-direction: column;
}

.eco-parceiros__filetes > span {
	height: 13px;
}

.eco-parceiros__filetes > :nth-child(1) { background: #034757; }
.eco-parceiros__filetes > :nth-child(2) { background: #319656; }
.eco-parceiros__filetes > :nth-child(3) { background: #8ed649; }
.eco-parceiros__filetes > :nth-child(4) { background: #cbfc31; }

.eco-parceiros__corpo {
	padding: var(--wp--preset--spacing--50) var(--wp--preset--spacing--40) var(--wp--preset--spacing--60);
}

.eco-parceiros__titulo {
	margin-block: 0 var(--wp--preset--spacing--50);
	color: var(--wp--preset--color--muted);
	font-weight: 500;
	/* 0.12em abria de mais a palavra e a 12px lia-se letra a letra; 0.06em
	   ainda abria. Fica o suficiente para continuar a ler-se como rótulo e não
	   como título, no mesmo passo do antetítulo de secção. */
	letter-spacing: 0.02em;
	line-height: 1.2;
	text-align: center;
	text-transform: uppercase;
}

/* Duas colunas, como no desenho. O último logótipo de uma lista ímpar fica
   sozinho na sua linha e centrado, que é o que lá acontece com o "voltalia". */
/* Passo de linha de 72px, como no desenho (filas de logótipos em y≈1285, 1355,
   1440, 1520, 1595, 1680): 48px de altura útil e 24px entre filas. */
.eco-parceiros__grelha {
	display: grid;
	grid-template-columns: repeat(2, 1fr);
	gap: var(--wp--preset--spacing--50) var(--wp--preset--spacing--40);
	margin: 0;
	padding: 0;
	list-style: none;
}

.eco-parceiros__grelha > li {
	display: flex;
	align-items: center;
	justify-content: center;
	margin: 0;
	min-height: 48px;
}

.eco-parceiros__grelha img {
	max-width: 100%;
	max-height: 48px;
	height: auto;
	object-fit: contain;
}

/* O marcador, enquanto não há logótipos. Mesma linguagem do marcador de
   publicidade: tracejado e cinzento, para se ver que é um lugar reservado e não
   um logótipo que não carregou. */
.eco-parceiros__vazio {
	border: 1px dashed var(--wp--preset--color--border);
	color: var(--wp--preset--color--muted);
	font-size: 11px;
	line-height: 1.2;
}


/* ──────────────────────────────────────────────────────────────────────────
   8. Corpo do artigo
   ──────────────────────────────────────────────────────────────────────────
   Os intertítulos herdavam a escala global do theme.json — um `h2` dentro da
   peça saía a 48px, o mesmo corpo do título do artigo. Dentro da coluna de
   texto isso lê-se como um segundo título e não como uma divisão da peça, por
   isso descem um degrau e ganham ar por cima: a secção começa a respirar
   antes de se anunciar.

   O `h3` fica num meio degrau (24px) que a escala de tokens não tem — entre
   o `x-large` (32) e o `large` (20) não há nada, e `large` deixava-o do
   tamanho do lead.

   O selector exige `.wp-block-heading` de propósito: dentro do conteúdo há
   títulos de blocos de plugins (por exemplo `.rec-related__title`) que trazem
   a sua própria escala e não são intertítulos da peça.
   ────────────────────────────────────────────────────────────────────────── */

.eco-article-body h2.wp-block-heading {
	font-size: var(--wp--preset--font-size--x-large);
}

.eco-article-body h3.wp-block-heading {
	font-size: 1.5rem;
}

.eco-article-body h4.wp-block-heading {
	font-size: var(--wp--preset--font-size--large);
}

/* ── Corpo e ritmo da peça ────────────────────────────────────────────────
   18px com passo de linha de 28,8px. Estava a herdar os 16px/22,4 do resto do
   site, que servem um cartão de três linhas e cansam num texto de quinze
   parágrafos; no desenho a coluna do artigo mede 28px de passo de linha, que
   a 16px não dá.

   O ritmo vertical deixou de ser único. Antes eram 40px entre tudo — entre
   dois parágrafos e entre um intertítulo e o parágrafo que ele anuncia —, e
   com espaço igual dos dois lados o título flutua entre as duas secções sem
   se perceber qual delas está a abrir. Agora o espaço diz a que grupo cada
   coisa pertence: 24px entre parágrafos seguidos, 48px antes de um
   intertítulo e 12px depois dele. É a mesma quantidade de ar na página,
   distribuída de maneira a agrupar em vez de separar.

   As imagens, os painéis e as citações ficam nos 40px: são pausas na leitura
   e não fazem parte do parágrafo ao lado.
   ───────────────────────────────────────────────────────────────────────── */

.eco-article-body {
	/* 20px com o 1,4 do tema dá o passo de 28px que o desenho mede entre
	   linhas, e a mancha de traço de 20-21px que lá está — a 18px o passo
	   batia certo mas as letras ficavam mais pequenas do que o desenho. */
	font-size: 1.25rem;
	line-height: 1.4;
}

/* O `blockGap` do bloco põe 24px entre irmãos; estas regras são as excepções.
   Ganham sem `!important` — a do core vive num `:where()` com a classe do
   contentor e pesa uma classe, estas pesam duas. */
.eco-article-body > .wp-block-heading {
	margin-top: var(--wp--preset--spacing--70);
}

.eco-article-body > .wp-block-heading + * {
	margin-top: var(--wp--preset--spacing--30);
}

.eco-article-body > :is(figure, .wp-block-image, .wp-block-embed, .wp-block-gallery, .eco-ler-mais, .eco-citacao, .eco-fast),
.eco-article-body > :is(figure, .wp-block-image, .wp-block-embed, .wp-block-gallery, .eco-ler-mais, .eco-citacao, .eco-fast) + * {
	margin-top: 40px;
}


/* ── "Ler mais" ───────────────────────────────────────────────────────────
   O painel de sugestão de leitura que o desenho põe entre parágrafos
   (pages-desktop/ECO artigo.png, duas ocorrências). Painel cinzento, rótulo
   verde pequeno, filete verde e o título do artigo sugerido.

   É uma única âncora e não uma caixa com um link lá dentro: o alvo de clique
   é o painel todo, e o leitor não tem de acertar na linha do título. Por isso
   também precisa de desfazer o que o theme.json faz aos links do corpo do
   artigo (verde e sublinhado) — aqui quem manda são as duas linhas.

   Serve o bloco `eco/ler-mais` do eco-core, o shortcode `[eco_ler_mais]` e o
   padrão `eco/ler-mais`. O `div` existe porque no editor o bloco desenha-se
   como `div` (uma âncora dentro do canvas roubava o clique de seleção).
   ────────────────────────────────────────────────────────────────────────── */

a.eco-ler-mais,
div.eco-ler-mais {
	display: block;
	background: var(--wp--preset--color--surface);
	padding: var(--wp--preset--spacing--40) var(--wp--preset--spacing--50);
	text-decoration: none;
}

a.eco-ler-mais:hover .eco-ler-mais__titulo {
	text-decoration: underline;
}

/* O filete leva mais ar dos dois lados: no desenho (y2681, painel y2628-2746)
   são 18px entre o rótulo e a linha e 23 entre a linha e o título, contra os
   12 e 17 que isto dava. Com tão pouco, o rótulo, a linha e o título liam-se
   como um bloco só.

   E a linha é 2px em verde claro, não 1px no verde da marca: o desenho tem
   #77D99F — o mesmo `--eco-accent-line-suave` da barra de partilha e do ECO
   FAST. A 1px no verde cheio parecia outra coisa em cada painel. */
.eco-ler-mais__rotulo {
	display: block;
	border-bottom: 2px solid var(--eco-accent-line-suave);
	padding-bottom: var(--wp--preset--spacing--30);
	color: var(--wp--preset--color--primary-dark);
	font-size: var(--wp--preset--font-size--small);
	font-weight: 700;
	letter-spacing: 0.01em;
}

.eco-ler-mais__titulo {
	display: block;
	margin-top: var(--wp--preset--spacing--40);
	color: var(--wp--preset--color--ink);
	font-family: var(--wp--preset--font-family--headline);
	font-size: 1.125rem;
	font-weight: 700;
	line-height: 1.3;
}


/* ── Citação ──────────────────────────────────────────────────────────────
   Painel verde-cheio com as aspas em branco, o texto a preto e a assinatura
   por baixo (components/Citacao-sem-foto.png e Citacao-com-foto 1.png).

   As aspas do desenho são dois paralelogramos inclinados; o `“` do Manrope é
   uma cunha, e um `skewX` negativo aproxima-o o suficiente sem pedir um SVG.

   O retrato é opcional — foi pedido na reunião de julho de 2026 e o desenho
   do Figma tem as duas versões. Sem ele a assinatura sobe sozinha, porque os
   espaçamentos saem de adjacências e não de `:first-child`.
   ────────────────────────────────────────────────────────────────────────── */

.eco-citacao-glyph {
	transform: skewX(-10deg);
	/* A cunha do glifo deixa uma sangria ótica à esquerda que o desalinha do
	   texto por baixo. */
	margin-left: -0.06em;
}

.eco-citacao-autor .wp-block-image {
	flex: 0 0 auto;
	margin: 0;
}

.eco-citacao-autor p {
	margin: 0;
}


/* ── Citação com retrato ──────────────────────────────────────────────────
   A terceira versão do desenho (components/Citacao-com-foto 2.png): o mesmo
   painel verde, mas com o retrato encostado ao canto superior esquerdo e a
   assinatura por baixo, numa coluna à esquerda da citação.

   O retrato sangra para fora do respiro do painel — daí a margem negativa e a
   largura com o respiro somado. Medido no desenho a 894px: foto de 280px
   quadrada colada a (0,0), canto inferior direito arredondado a 32px, e a
   assinatura a começar 2rem abaixo da foto, já dentro do respiro.

   A altura do painel é dada pela citação, não pela coluna do retrato: a
   assinatura fica agarrada à foto e o resto da coluna é verde.
   ────────────────────────────────────────────────────────────────────────── */

.eco-citacao--retrato .eco-citacao-retrato__foto {
	width: calc(100% + var(--wp--preset--spacing--50));
	margin: calc(var(--wp--preset--spacing--50) * -1) 0 0 calc(var(--wp--preset--spacing--50) * -1);
}

.eco-citacao--retrato .eco-citacao-retrato__foto img {
	display: block;
	width: 100%;
	/* O corte é quadrado porque o desenho o é, e porque a coluna tem de dar a
	   mesma altura com retratos de proporções diferentes. */
	aspect-ratio: 1;
	object-fit: cover;
	border-bottom-right-radius: 2rem;
}


/* ──────────────────────────────────────────────────────────────────────────
   8.1 Assinatura da peça
   ──────────────────────────────────────────────────────────────────────────
   "ECO, 9 Junho 2026": o autor em verde-escuro e a data em cinzento, na mesma
   linha e separados por uma vírgula.

   Tinha um filete acima e outro abaixo e o nome a negrito — uma faixa que
   pesava mais do que o lead que fica por cima dela. No desenho não há filete
   nenhum e o nome tem o peso do texto corrido: quem assina identifica-se pela
   cor, não pela grossura.

   A vírgula é escrita aqui e não no markup porque é pontuação entre dois
   blocos do core: metê-la no meio pedia um terceiro bloco só para um sinal, e
   um leitor de ecrã lia-o como conteúdo à parte.
   ───────────────────────────────────────────────────────────────────────── */

/* Os corpos de letra da manchete (50px) e da assinatura (13px) não estão
   aqui: vivem nos atributos dos blocos em patterns/artigo-cabecalho.php. As
   classes de preset do core — `has-huge-font-size`, `has-small-font-size` —
   escrevem `!important`, e uma regra deste ficheiro perdia sempre para elas.
   Escritos no bloco, saem como estilo em linha e ganham sem ninguém precisar
   de `!important`. */

/* O lead. O corpo vem do preset `card` (24px, fluido até 20 em ecrã pequeno),
   que é o do desenho; o que fica aqui é o passo de linha — 34px para 24 de
   corpo, medido entre as três linhas da entrada (y830, y864, y898).

   A cor não está escrita: é o ink herdado. Estava em `muted` e a 20px, e uma
   entrada cinzenta e pequena lê-se como legenda da manchete em vez do primeiro
   parágrafo da peça, que é o que ela é. No desenho é preta, como o corpo. */
.eco-article-lead {
	line-height: 1.42;
}

.eco-article-meta {
	align-items: baseline;
}

.eco-article-meta .wp-block-post-author-name,
.eco-article-meta .wp-block-post-author-name a {
	color: var(--eco-accent-text);
	font-weight: 400;
	text-decoration: none;
}

.eco-article-meta .wp-block-post-author-name a:hover {
	text-decoration: underline;
}

.eco-article-meta .wp-block-post-author-name::after {
	content: ",";
}


/* ──────────────────────────────────────────────────────────────────────────
   8.2 Partilhar
   ──────────────────────────────────────────────────────────────────────────
   Rótulo verde, filete e uma fila de discos de 44px. Aparece duas vezes na
   peça — depois da assinatura e no fim do texto — e é o mesmo componente nas
   duas (`eco/partilhar`, servido por inc/partilhar.php).

   Os discos são contorno e não fundo cheio: são cinco alvos seguidos, e cinco
   manchas escuras a meio da coluna competiam com a fotografia que vem logo a
   seguir. O "Copiar url" é o único que traz texto, porque é o único que não
   tem glifo que se reconheça sozinho.

   Medidas do desenho (pages-desktop/ECO artigo.png, y≈600–680): disco de 44px,
   16px entre discos, filete a 12px do rótulo e a fila a 16px do filete.
   ───────────────────────────────────────────────────────────────────────── */

.eco-partilhar__rotulo {
	margin: 0 0 var(--wp--preset--spacing--30);
	padding-bottom: var(--wp--preset--spacing--30);
	/* #80E1A9 medido no desenho: o filete é claro e fica atrás do rótulo, não
	   a competir com ele. A 1px o claro quase se perdia sobre o branco — 2px
	   é o mínimo que o deixa ler-se como linha e não como sombra. */
	border-bottom: 2px solid var(--eco-accent-line-suave);
	color: var(--eco-accent-text);
	font-family: var(--wp--preset--font-family--sans);
	font-size: var(--wp--preset--font-size--small);
	font-weight: 700;
}

.eco-partilhar__lista {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	gap: var(--wp--preset--spacing--40);
	margin: 0;
	padding: 0;
	list-style: none;
}

.eco-partilhar__item {
	margin: 0;
}

.eco-partilhar__disco,
.eco-partilhar__copiar {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	gap: 8px;
	box-sizing: border-box;
	/* 48px de diâmetro e contorno de 2px, medidos no desenho (o disco mede
	   48 no equador e a linha lê-se com 2 a 3px). A 1px o contorno
	   desaparecia ao lado do glifo cheio lá dentro. */
	height: 48px;
	border: 2px solid var(--wp--preset--color--ink);
	border-radius: 999px;
	background: none;
	color: var(--wp--preset--color--ink);
	font-family: var(--wp--preset--font-family--sans);
	font-size: var(--wp--preset--font-size--small);
	font-weight: 600;
	text-decoration: none;
	cursor: pointer;
	transition: background-color .15s ease, color .15s ease;
}

.eco-partilhar__disco {
	width: 48px;
	padding: 0;
}

.eco-partilhar__copiar {
	padding: 0 20px;
}

.eco-partilhar__disco svg,
.eco-partilhar__copiar svg {
	width: 18px;
	height: 18px;
	fill: currentColor;
}

.eco-partilhar__disco:hover,
.eco-partilhar__disco:focus-visible,
.eco-partilhar__copiar:hover,
.eco-partilhar__copiar:focus-visible {
	background: var(--wp--preset--color--ink);
	color: var(--wp--preset--color--base);
	text-decoration: none;
}

/* Confirmação do "Copiar url" — verde cheio durante dois segundos. Sem ela o
   clique não tem resposta nenhuma: o endereço vai para a área de
   transferência sem nada mudar no ecrã. */
.eco-partilhar__copiar.is-copiado {
	border-color: var(--eco-accent-text);
	background: var(--eco-accent-text);
	color: var(--wp--preset--color--base);
}


/* ──────────────────────────────────────────────────────────────────────────
   8.3 ECO FAST
   ──────────────────────────────────────────────────────────────────────────
   O painel de pontos-chave que o desenho põe a seguir à fotografia: caixa
   cinzenta, raio e "ECO FAST" em verde, três pontos e a linha que diz que
   aquilo saiu de uma IA.

   O markup vem do plugin eco-resumos-ia e o aspecto fica aqui, pela mesma
   razão do "Ler mais": aquilo pode acabar dentro do `post_content` e uma troca
   de tema não pode deixar artigos publicados com o painel de outro sítio.

   É um `<details>`. O galho que fecha o painel é o marcador do `<summary>`,
   desenhado com duas linhas em vez de pedir um SVG — e como é o do browser,
   funciona com teclado e é anunciado como o que é.
   ───────────────────────────────────────────────────────────────────────── */

.eco-fast {
	background: var(--wp--preset--color--surface);
	padding: var(--wp--preset--spacing--50) var(--wp--preset--spacing--60);
}

/* O rótulo é Barlow (a família dos títulos) e não a sans do resto do painel:
   no desenho as letras de "ECO FAST" são condensadas, com a altura de
   maiúscula a medir 14px — o que dá os 20px de corpo aqui postos. Era sans a
   14px e lia-se como uma etiqueta qualquer em vez da marca que é. */
.eco-fast__cabeca {
	display: flex;
	align-items: center;
	gap: 8px;
	padding-bottom: var(--wp--preset--spacing--30);
	border-bottom: 2px solid var(--eco-accent-line-suave);
	color: var(--eco-accent-text);
	font-family: var(--wp--preset--font-family--headline);
	font-size: 20px;
	/* 600 e não 700: em Barlow Semi Condensed, a 20px e em maiúsculas, o cheio
	   fechava os contra-formas do "ECO" e o rótulo ganhava mais peso do que a
	   manchete da peça. */
	font-weight: 600;
	line-height: 1.1;
	letter-spacing: 0.02em;
	text-transform: uppercase;
	cursor: pointer;
	list-style: none;
}

/* O triângulo por omissão do `<summary>`, nos dois motores. */
.eco-fast__cabeca::-webkit-details-marker {
	display: none;
}

/* O raio é âmbar e não verde — #FDA215 medido no desenho. É a única coisa
   quente da peça toda, e é isso que faz o painel dar nas vistas sem precisar
   de fundo colorido. */
.eco-fast__raio {
	flex: none;
	width: 18px;
	height: 18px;
	fill: #FDA215;
}

/* O galho: um canto de quadrado rodado, à direita da cabeça. Aponta para cima
   com o painel aberto — o gesto que fecha — e para baixo quando está fechado.

   O deslocamento vertical é metade da diagonal do quadrado: rodado 45°, o
   canto que se vê fica abaixo do centro da caixa, e sem esta correção o galho
   assentava acima da linha do texto. */
.eco-fast__cabeca::after {
	content: "";
	flex: none;
	width: 9px;
	height: 9px;
	margin-left: auto;
	border-right: 2px solid currentColor;
	border-bottom: 2px solid currentColor;
	transform: translateY(5px) rotate(-135deg);
}

.eco-fast:not([open]) .eco-fast__cabeca::after {
	transform: translateY(-1px) rotate(45deg);
}

/* O recuo alinha o texto dos pontos com o rótulo "ECO FAST", e não com o raio
   que o antecede: no desenho o primeiro caractere de cada ponto (x129) cai em
   cima da primeira letra do rótulo (x130). Com 1,15em o texto ficava 8px à
   esquerda do rótulo e a lista parecia solta do painel.

   26px é a largura do raio (18) mais o intervalo da cabeça (8). Em px e não em
   em: quem manda aqui é a cabeça e ela não muda de corpo com a lista. */
.eco-fast__pontos {
	margin: var(--wp--preset--spacing--40) 0 0;
	padding-left: 26px;
	color: var(--wp--preset--color--ink);
	/* 16px: no desenho a linha dos pontos mede 16px de altura de traço, um
	   degrau abaixo do corpo da peça e não dois. */
	font-size: var(--wp--preset--font-size--medium);
	line-height: 1.55;
}

.eco-fast__pontos li + li {
	margin-top: var(--wp--preset--spacing--30);
}

/* O ponto da lista é do browser e nasce à altura do texto — a 16px ficava do
   tamanho de um bullet de menu. Desenhado, tem 5px e alinha com a primeira
   linha em vez de com a caixa toda. */
.eco-fast__pontos li {
	list-style: none;
	position: relative;
}

.eco-fast__pontos li::before {
	content: "";
	position: absolute;
	/* 15px do texto, que é a distância do desenho entre o ponto (x114) e a
	   primeira letra (x129). */
	left: -15px;
	top: .62em;
	width: 5px;
	height: 5px;
	border-radius: 50%;
	background: currentColor;
}

.eco-fast__nota {
	margin: var(--wp--preset--spacing--40) 0 0;
	color: var(--wp--preset--color--muted);
	font-size: 11px;
}


/* ──────────────────────────────────────────────────────────────────────────
   8b. Filtros da pesquisa
   ──────────────────────────────────────────────────────────────────────────
   `pages-desktop/ECO resultado pesquisa.png` põe os dois controlos na grelha
   que o resto do site já usa: a barra de pesquisa ocupa 894 e o período 310,
   com os 76 de intervalo entre eles — 894+76+310 = 1280, o poço do herói ao
   pixel. A ordenação vive na linha da contagem, encostada à direita da coluna
   dos resultados.

   Quem decide o que estes controlos fazem é o eco-core
   (`inc/pesquisa-filtros.php`); aqui é só a forma.
   ────────────────────────────────────────────────────────────────────────── */

.eco-search-row {
	align-items: center;
	gap: 76px;
}

.eco-search-row > .wp-block-search {
	flex: 0 0 894px;
	max-width: 894px;
}

.eco-search-row > .eco-pesquisa-periodo {
	flex: 0 0 310px;
}

/* ── Período (herói) ──────────────────────────────────────────────────────
   O rótulo fica fora da caixa, como no desenho, e é um <label> a sério: quem
   usa leitor de ecrã ouve "Período" ao chegar à selecção. */

.eco-pesquisa-periodo {
	display: flex;
	align-items: center;
	gap: var(--wp--preset--spacing--40);
}

.eco-pesquisa-periodo__rotulo {
	color: var(--wp--preset--color--inverse);
	font-weight: 600;
	white-space: nowrap;
}

/* A seta é o fundo da caixa e não um elemento: assim não apanha o clique nem
   entra na ordem de leitura, e a selecção continua a ser um <select> nativo,
   que é quem sabe abrir-se num telemóvel. */
.eco-pesquisa-periodo__caixa {
	position: relative;
	flex: 1 1 auto;
	min-width: 0;
}

.eco-pesquisa-periodo__caixa::after {
	content: "";
	position: absolute;
	right: 20px;
	top: 50%;
	width: 10px;
	height: 10px;
	transform: translateY(-70%) rotate(45deg);
	border-right: 2px solid var(--wp--preset--color--inverse);
	border-bottom: 2px solid var(--wp--preset--color--inverse);
	pointer-events: none;
}

.eco-pesquisa-periodo__seletor {
	box-sizing: border-box;
	width: 100%;
	height: 56px;
	border: 1px solid var(--wp--preset--color--border);
	border-radius: 999px;
	padding: 0 44px 0 24px;
	background: var(--wp--preset--color--base);
	color: var(--wp--preset--color--inverse);
	font-family: inherit;
	font-size: var(--wp--preset--font-size--medium);
	line-height: 1.2;
	/* A seta do sistema sairia ao lado da nossa. */
	appearance: none;
}

.eco-pesquisa-periodo__seletor:focus-visible {
	outline: 2px solid var(--wp--preset--color--primary-dark);
	outline-offset: 2px;
}

/* Existe para quem não tem JavaScript: sem ele a escolha não se submete
   sozinha, e um filtro que não se aplica é pior do que um botão a mais. O
   script esconde-o mal arranca. */
.eco-pesquisa-periodo__aplicar {
	border: 1px solid var(--wp--preset--color--inverse);
	border-radius: 999px;
	padding: 8px 18px;
	background: var(--wp--preset--color--inverse);
	color: var(--wp--preset--color--base);
	font-family: inherit;
	font-size: var(--wp--preset--font-size--small);
	font-weight: 600;
	cursor: pointer;
}

/* ── Ordenar por (linha da contagem) ──────────────────────────────────────
   O filete que abria a lista estava na contagem; passa para a linha inteira,
   senão ficava por baixo de metade dela. */

.eco-pesquisa-topo {
	display: flex;
	align-items: baseline;
	justify-content: space-between;
	gap: var(--wp--preset--spacing--50);
	flex-wrap: wrap;
	border-bottom: 1px solid var(--wp--preset--color--border);
	padding-bottom: var(--wp--preset--spacing--30);
}

.eco-pesquisa-topo > .wp-block-query-total {
	margin: 0;
}

.eco-pesquisa-ordenar {
	display: flex;
	align-items: center;
	gap: var(--wp--preset--spacing--40);
}

.eco-pesquisa-ordenar__rotulo {
	color: var(--wp--preset--color--inverse);
	font-size: var(--wp--preset--font-size--small);
	white-space: nowrap;
}

.eco-pesquisa-ordenar__pastilha {
	display: inline-block;
	box-sizing: border-box;
	border: 1px solid var(--wp--preset--color--inverse);
	border-radius: 999px;
	padding: 6px 20px;
	background: var(--wp--preset--color--base);
	color: var(--wp--preset--color--inverse);
	font-size: var(--wp--preset--font-size--small);
	font-weight: 600;
	line-height: 1.3;
	text-decoration: none;
	white-space: nowrap;
}

.eco-pesquisa-ordenar__pastilha.is-activa {
	border-color: var(--wp--preset--color--primary);
	background: var(--wp--preset--color--primary);
	color: var(--wp--preset--color--base);
}

.eco-pesquisa-ordenar__pastilha:hover,
.eco-pesquisa-ordenar__pastilha:focus-visible {
	border-color: var(--wp--preset--color--primary-dark);
	background: var(--wp--preset--color--primary-dark);
	color: var(--wp--preset--color--base);
}


/* ──────────────────────────────────────────────────────────────────────────
   9. Ecrãs estreitos
   ──────────────────────────────────────────────────────────────────────────
   Abaixo de 781px os cartões horizontais deixam de ter espaço para uma
   miniatura fixa ao lado do texto: empilham. Os filetes verticais que
   separavam colunas também não fazem sentido quando as colunas passam a
   linhas.
   ────────────────────────────────────────────────────────────────────────── */

@media (max-width: 781px) {
	:is(.eco-card--horizontal, .is-style-eco-card--horizontal) > .wp-block-post-featured-image,
	:is(.eco-card--topic, .is-style-eco-card--topic) > .wp-block-post-featured-image {
		flex-basis: 100%;
		width: 100%;
	}

	:is(.eco-card--entrevista, .is-style-eco-card--entrevista) {
		gap: var(--wp--preset--spacing--40);
	}

	:is(.eco-card--entrevista, .is-style-eco-card--entrevista) > :not(.wp-block-post-featured-image) {
		flex-basis: 100%;
	}

	.eco-text-strip-row > .wp-block-post,
	.eco-live-strip-related > .wp-block-post {
		border-left: 0;
		padding-left: 0;
	}

	/* Tirado o filete, as três manchetes do Em Direto ficavam sem nada entre
	   elas: o `blockGap: 0` do bloco existe para as colunas encostarem ao
	   filete vizinho, e empilhadas isso dá três títulos seguidos a ler-se
	   como um parágrafo só. Repõe-se o intervalo que a faixa usa de cada lado
	   das colunas (24px). As duas classes são de propósito — as regras de
	   `layout` do core pesam uma classe e ganhavam a uma só. */
	.eco-live-strip-related.wp-block-post-template {
		row-gap: var(--wp--preset--spacing--50);
	}

	/* O leque das newsletters precisa de ~600px para ler-se como um leque;
	   abaixo disso é ruído por cima do texto e sai. */
	.eco-newsletter__fan {
		display: none;
	}

	/* Os 894+76+310 do herói da pesquisa não cabem: a barra e o período
	   empilham e ocupam a largura toda, com o intervalo normal entre eles. */
	.eco-search-row {
		gap: var(--wp--preset--spacing--50);
	}

	.eco-search-row > .wp-block-search,
	.eco-search-row > .eco-pesquisa-periodo {
		flex: 1 1 100%;
		max-width: none;
	}

	/* A entrada de /ultimas/ é a exceção à regra desta secção: NÃO empilha. No
	   desenho de telemóvel (pages-mobile/ECO ultimas mobile.png) a miniatura
	   continua ao lado do texto, só que pequena — é o que mantém a lista
	   percorrível com o polegar em vez de a esticar por doze ecrãs.

	   O título desce de 30px para 20px, que é onde uma manchete de quatro linhas
	   ainda cabe ao lado de uma miniatura de 96px. */
	:is(.eco-card--ultimas, .is-style-eco-card--ultimas) {
		--eco-card-thumb: 96px;
		--eco-card-body: 8rem;
		gap: var(--wp--preset--spacing--40);
	}

	:is(.eco-card--ultimas, .is-style-eco-card--ultimas) .wp-block-post-title,
	:is(.eco-card--ultimas, .is-style-eco-card--ultimas) .wp-block-post-title a {
		font-size: 20px;
	}

	/* A coluna da direita passa a linha e o painel dos parceiros deixa de ter
	   de ocupar 310px — no desenho de telemóvel a coluna inteira desaparece para
	   o fim da página, e é isso que o `wp:columns` já faz sozinho. */
	.eco-parceiros__grelha {
		gap: var(--wp--preset--spacing--50) var(--wp--preset--spacing--40);
	}

	/* Empilhadas as colunas da citação, o retrato deixa de ter uma coluna a que
	   se encostar: sangra para os dois lados do painel e baixa para 16:9, que é
	   o que impede um quadrado de ocupar o ecrã todo antes da primeira linha. */
	.eco-citacao--retrato .eco-citacao-retrato__foto {
		width: calc(100% + var(--wp--preset--spacing--50) * 2);
		margin-right: calc(var(--wp--preset--spacing--50) * -1);
	}

	.eco-citacao--retrato .eco-citacao-retrato__foto img {
		aspect-ratio: 16 / 9;
	}
}


/* ──────────────────────────────────────────────────────────────────────────
   10. Paywall e Premium
   ──────────────────────────────────────────────────────────────────────────
   O corte do artigo, o painel que o fecha, e a página de assinatura.

   Medido em pages-desktop/ECO artigo bloqueado.png e ECO Premium.png.
   ────────────────────────────────────────────────────────────────────────── */

/* O último bloco visível esbate-se para branco. A classe é posta pelo eco-core
   (inc/paywall.php) no bloco onde o corte cai.

   `mask` e não um degradê por cima: um pseudo-elemento branco sobreposto
   deixaria de funcionar sobre o cinzento do painel seguinte, e a máscara apaga
   o próprio texto em vez de o tapar. O que está por baixo não existe — o corte
   é feito no servidor, e o que se esbate é a última linha que sobra. */
.eco-article-body .eco-paywall-corte {
	-webkit-mask-image: linear-gradient(to bottom, #000 0%, #000 25%, transparent 92%);
	mask-image: linear-gradient(to bottom, #000 0%, #000 25%, transparent 92%);
	color: var(--wp--preset--color--muted);

	/* A cauda não pode ser mais alta do que aquilo que se vê dela.

	   Um bloco mascarado desaparece mas continua a ocupar a altura toda: com
	   um parágrafo de seis linhas a apagar-se ao fim da segunda, sobravam
	   quatro linhas de branco entre o texto legível e o painel, e a
	   sobreposição caía nesse vazio. Limitada a três linhas, a mancha acaba
	   onde a legibilidade acaba. */
	max-height: 6rem;
	overflow: hidden;
}

/* ── Onde o painel entra ──────────────────────────────────────────────────
   Medido no artigo premium da produção
   (eco.sapo.pt/especiais/economia-a-crescer-…), que é a única forma de ver
   isto: em produção o muro só aparece em peças mesmo restringidas, e o acesso
   é medido do lado do cliente, por isso nem 28 artigos seguidos num browser o
   fazem aparecer numa peça aberta.

   A leitura que eu tinha feita do CSS estava certa no mecanismo e errada no
   resultado. O `.trimmer-cta-container` é mesmo `position: absolute` no fundo
   do `.content-trimmer` — mas o rodapé do artigo e a barra de partilha vivem
   DENTRO da zona cortada, por isso o cartão aterra depois deles e não por cima
   da prosa. Medido na página: `.content-trimmer` x=110 w=1220, `.entry__footer`
   y=1527 h=211, `.trimmer-cta-container` y=1741, e o cartão x=486 w=468 —
   centrado nos 1220, a 468px de largura.

   Ou seja: o artigo é fechado como deve ser — o texto pára a meio da frase, a
   assinatura de quem escreveu, a barra de partilha — e só então vem a oferta.
   Não há painel deitado por cima do texto a desvanecer, e o cartão nunca chega
   perto da coluna lateral.

   Aqui o painel passa a viver dentro da coluna do texto (894px), a seguir ao
   `eco-artigo-fim`, em vez de ser uma faixa de 1440 fora das colunas. Isso
   resolve as duas coisas de uma vez: não tapa a lateral, porque não tem
   largura para lá chegar, e vem depois do fecho do artigo, porque é essa a
   ordem no template. */

/* Sem sobreposição e sem degradê por cima de texto vivo: o corte é seco, como
   na produção. O que restava do desvanecimento fica só na última linha, que é
   o `mask` do `.eco-paywall-corte` acima — dá o sinal de interrupção sem
   fingir que há um painel a tapar alguma coisa. */

/* ── A barra lateral num artigo fechado ───────────────────────────────────
   Não leva tratamento nenhum, e isso é a correcção.

   Havia aqui um bloco que a punha em posição absoluta e lhe passava uma
   máscara por cima, para ela não mandar na altura das colunas: com o painel
   fora das colunas, à largura de 1440, a altura do bloco era a da coluna mais
   alta — a lateral, com as Últimas e as Populares — e o painel aterrava
   centenas de pixels abaixo do texto, por baixo dela.

   Com o painel dentro da coluna do texto esse problema deixa de existir, e o
   remédio passou a ser pior do que a doença: cortava as Últimas e as
   Populares a meio numa peça fechada, que é precisamente o que a produção não
   faz. Lá a lateral fica inteira — o cartão está na coluna do texto e nunca
   chega perto dela. */



/* ── O painel ─────────────────────────────────────────────────────────────
   Faixa cinzenta de largura total com o conteúdo a 894px centrado na página —
   e não na coluna do texto. No desenho o painel é simétrico e o artigo acima
   dele não é: é o que faz o painel ler-se como uma interrupção e não como a
   continuação da peça. */

.eco-paywall__titulo {
	color: var(--eco-accent-text);
	font-weight: 700;
}

.eco-paywall__planos {
	gap: 40px;
}

/* Cartão de plano — serve o painel do artigo e a página Premium. */
.eco-plano {
	box-sizing: border-box;
	background: var(--wp--preset--color--base);
	border: 1px solid var(--wp--preset--color--border);
	padding: var(--wp--preset--spacing--50);
}

/* O plano recomendado: contorno verde de 2px e fundo cinzento. O fundo é o que
   o distingue quando o painel já é cinzento — no artigo os cartões são brancos
   sobre cinzento, e aqui inverte-se. */
.eco-plano--destaque {
	border: 2px solid var(--eco-accent);
	background: var(--wp--preset--color--surface);
}

.eco-paywall .eco-plano {
	display: flex;
	flex-direction: column;
	gap: var(--wp--preset--spacing--40);
	text-align: center;
}

.eco-plano__nome {
	margin: 0;
	font-family: var(--wp--preset--font-family--headline);
	font-size: var(--wp--preset--font-size--large);
	font-weight: 700;
	line-height: 1.2;
}

.eco-plano__preco {
	display: flex;
	align-items: baseline;
	gap: 8px;
	margin: 0;
	color: var(--eco-accent-text);
}

.eco-paywall .eco-plano__preco {
	justify-content: center;
}

/* 40px no desenho, contra os 20 do texto ao lado: o preço é a única coisa que
   o leitor procura neste painel. */
.eco-plano__preco strong {
	font-family: var(--wp--preset--font-family--headline);
	font-size: 40px;
	font-weight: 700;
	line-height: 1;
}

.eco-plano__preco span {
	color: var(--wp--preset--color--muted);
	font-size: var(--wp--preset--font-size--small);
}

.eco-paywall__sessao {
	margin: 0;
	font-weight: 700;
}

.eco-paywall__sessao a {
	color: var(--eco-accent-text);
	text-decoration: underline;
}

/* ── A página Premium ─────────────────────────────────────────────────────
   O herói é a única faixa verde-escura do site: o título sai a verde da marca
   por cima dela, e o subtítulo num verde mais claro. */

.eco-premium-hero .wp-block-post-title {
	margin: 0;
}

.eco-premium-hero .wp-block-post-excerpt {
	color: color-mix(in srgb, var(--wp--preset--color--primary) 72%, var(--wp--preset--color--base));
}

/* ── Interruptor de período ───────────────────────────────────────────────
   Dois botões de rádio numa pílula cinzenta. O que está escolhido veste a
   pílula verde; o outro fica em texto.

   Os `input` ficam escondidos mas não removidos — é neles que o foco assenta e
   é deles que sai o `:checked` que troca os preços. Sem JavaScript: os cartões
   são irmãos seguintes dos rádios, e o CSS esconde o preço do período que não
   está escolhido. */

.eco-periodo {
	display: block;
}

.eco-periodo__input {
	position: absolute;
	width: 1px;
	height: 1px;
	opacity: 0;
	pointer-events: none;
}

.eco-periodo__rotulo {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	min-height: 44px;
	padding: 0 var(--wp--preset--spacing--50);
	border-radius: 999px;
	background: none;
	color: var(--wp--preset--color--ink);
	font-weight: 700;
	cursor: pointer;
}

/* A pílula cinzenta é o fundo do grupo: desenha-se no primeiro rótulo com um
   pseudo-elemento atrás dos dois, para não precisar de um contentor a mais. */
.eco-periodo__rotulo:first-of-type {
	position: relative;
}

.eco-periodo__rotulo:first-of-type::before {
	content: "";
	position: absolute;
	inset: 0 auto 0 0;
	width: calc(200% + 8px);
	border-radius: 999px;
	background: var(--wp--preset--color--surface);
	z-index: -1;
}

.eco-periodo__input:checked + .eco-periodo__rotulo {
	background: var(--eco-accent);
	color: var(--wp--preset--color--inverse);
}

.eco-periodo__input:focus-visible + .eco-periodo__rotulo {
	outline: 2px solid var(--eco-accent-text);
	outline-offset: 2px;
}

/* Os preços de cada período. Um deles está sempre escondido, e qual depende do
   rádio — a regra é a mesma duas vezes, com o alvo trocado. */
#eco-periodo-anual:checked ~ .eco-planos .eco-plano__preco--mensal,
#eco-periodo-mensal:checked ~ .eco-planos .eco-plano__preco--anual {
	display: none;
}

/* Centrar o interruptor sem um contentor extra. */
.eco-premium .eco-periodo {
	text-align: center;
}

/* Os cartões são filhos do `.eco-periodo` — é essa a única maneira de os
   rádios os alcançarem com `:checked ~ …`. Por isso o ar entre o interruptor
   e eles tem de sair daqui: uma margem no `.eco-periodo` cai por baixo dos
   cartões, que é onde estava, e o interruptor ficava assente no bordo do
   primeiro cartão. 40px, o mesmo intervalo que separa os dois cartões: o
   interruptor pertence-lhes e não à secção. */
.eco-planos {
	display: grid;
	grid-template-columns: repeat(auto-fit, minmax(min(100%, 320px), 1fr));
	gap: 40px;
	margin-top: 40px;
	text-align: left;
}

.eco-premium .eco-plano {
	display: flex;
	flex-direction: column;
	gap: var(--wp--preset--spacing--30);
}

.eco-plano__cabeca {
	display: flex;
	align-items: baseline;
	justify-content: space-between;
	gap: var(--wp--preset--spacing--30);
}

.eco-plano__cabeca .eco-plano__nome {
	font-size: var(--wp--preset--font-size--card);
}

.eco-plano__selo {
	flex: none;
	color: var(--eco-accent-text);
	font-size: var(--wp--preset--font-size--small);
}

/* A pastilha do desconto acompanha o preço e não a linha de baixo: no desenho
   está à direita do número, à altura do meio dele. */
.eco-plano__poupanca {
	align-self: center;
	border-radius: 999px;
	padding: 2px 10px;
	background: var(--eco-accent);
	color: var(--wp--preset--color--inverse);
	font-size: var(--wp--preset--font-size--small);
	font-weight: 600;
}

.eco-plano__nota {
	margin: 0;
	color: var(--wp--preset--color--muted);
	font-size: var(--wp--preset--font-size--small);
}

/* As vantagens. O visto é um disco verde com o sinal em branco — desenhado, e
   não um caractere: um "✓" no texto ia parar ao leitor de ecrã antes de cada
   linha e à cópia do texto. */
.eco-plano__vantagens {
	list-style: none;
	margin: var(--wp--preset--spacing--30) 0 0;
	padding: 0;
	display: flex;
	flex-direction: column;
	gap: var(--wp--preset--spacing--30);
}

.eco-plano__vantagens li {
	display: flex;
	align-items: flex-start;
	gap: 10px;
	font-size: var(--wp--preset--font-size--medium);
	line-height: 1.4;
}

.eco-visto {
	flex: none;
	display: block;
	width: 20px;
	height: 20px;
	margin-top: 2px;
	color: var(--eco-accent);
}

.eco-visto svg {
	display: block;
	width: 100%;
	height: 100%;
}

/* O botão de cada plano é o botão principal do tema, à largura do cartão. */
.eco-plano__acao {
	margin: auto 0 0;
	padding-top: var(--wp--preset--spacing--40);
}

.eco-plano__acao a {
	display: block;
	border-radius: 999px;
	padding: 14px var(--wp--preset--spacing--50);
	background: var(--eco-accent);
	color: var(--wp--preset--color--inverse);
	font-weight: 700;
	text-align: center;
	text-decoration: none;
}

.eco-plano__acao a:hover {
	background: var(--eco-accent-text);
	color: var(--wp--preset--color--base);
}

/* A linha das equipas fecha os planos: título e texto à esquerda, botão de
   contorno à direita. */
.eco-premium__equipas {
	gap: var(--wp--preset--spacing--50);
}

/* ── As quatro vantagens ──────────────────────────────────────────────────
   Faixa cinzenta com quatro colunas centradas. Em ecrã estreito passa a duas
   colunas e não a uma: são pares de ideias curtas, e uma coluna só dava quatro
   ecrãs de scroll para dizer quatro coisas. */

.eco-vantagens__grelha {
	display: grid;
	grid-template-columns: repeat(auto-fit, minmax(min(100%, 200px), 1fr));
	gap: var(--wp--preset--spacing--70) var(--wp--preset--spacing--50);
}

.eco-vantagem {
	display: flex;
	flex-direction: column;
	align-items: center;
	gap: var(--wp--preset--spacing--30);
	text-align: center;
}

.eco-vantagem__icone {
	display: block;
	width: 48px;
	height: 48px;
	color: var(--eco-accent);
}

.eco-vantagem__icone svg {
	display: block;
	width: 100%;
	height: 100%;
}

.eco-vantagem__titulo {
	margin: 0;
	color: var(--eco-accent-text);
	font-family: var(--wp--preset--font-family--headline);
	font-size: var(--wp--preset--font-size--large);
	font-weight: 700;
	line-height: 1.15;
}

.eco-vantagem__texto {
	margin: 0;
	color: var(--wp--preset--color--ink);
	font-size: var(--wp--preset--font-size--small);
	line-height: 1.45;
}

/* ── Perguntas frequentes ─────────────────────────────────────────────────
   `<details>` do core, vestido: pergunta em verde-texto, galho à direita e
   filete a separar. O galho é o mesmo canto rodado do ECO FAST, pela mesma
   razão — desenhado, não escrito. */

.eco-faq__item {
	border-bottom: 1px solid var(--wp--preset--color--border);
	padding-bottom: var(--wp--preset--spacing--40);
}

.eco-faq__item summary {
	display: flex;
	align-items: center;
	gap: var(--wp--preset--spacing--40);
	list-style: none;
	cursor: pointer;
	color: var(--eco-accent-text);
	font-family: var(--wp--preset--font-family--headline);
	font-size: var(--wp--preset--font-size--large);
	font-weight: 700;
	line-height: 1.25;
}

.eco-faq__item summary::-webkit-details-marker {
	display: none;
}

.eco-faq__item summary::after {
	content: "";
	flex: none;
	width: 10px;
	height: 10px;
	margin-left: auto;
	border-right: 2px solid currentColor;
	border-bottom: 2px solid currentColor;
	transform: translateY(-3px) rotate(45deg);
}

.eco-faq__item[open] summary::after {
	transform: translateY(3px) rotate(-135deg);
}

.eco-faq__item p {
	margin: var(--wp--preset--spacing--30) 0 0;
	max-width: 70ch;
	color: var(--wp--preset--color--ink);
	font-size: var(--wp--preset--font-size--medium);
	line-height: 1.5;
}

@media (max-width: 781px) {
	/* No painel do artigo os dois planos ficam lado a lado até ao fim: são duas
	   caixas com um número cada, e empilhadas empurravam o botão para fora do
	   primeiro ecrã. */
	.eco-paywall__planos {
		gap: var(--wp--preset--spacing--40);
		flex-wrap: nowrap;
	}

	.eco-paywall .eco-plano {
		padding: var(--wp--preset--spacing--40);
	}

	.eco-plano__preco strong {
		font-size: 30px;
	}
}

/* ──────────────────────────────────────────────────────────────────────────
   A conta do leitor

   Medida nas capturas de produção da área de conta (perfil, comentários,
   assinatura): painel branco com o retrato ao centro sobre as circunferências
   esbatidas da marca, nome em verde-texto a 40px, email a cinzento, e a barra
   de separadores a fechar o painel — o aberto é uma pastilha cinzenta e os
   outros são texto simples. O corpo assenta sobre o cinzento do site.

   As circunferências são um gradiente e não uma imagem: são três anéis a 3% de
   preto, não valem um pedido ao servidor nem um ficheiro a manter.
   ────────────────────────────────────────────────────────────────────────── */

.eco-conta-cabecalho {
	position: relative;
	overflow: hidden;
	text-align: center;
}

.eco-conta-cabecalho::before {
	content: "";
	position: absolute;
	inset: 0;
	background: repeating-radial-gradient(
		circle at 50% 22%,
		transparent 0 78px,
		rgba(0, 0, 0, 0.035) 78px 80px
	);
	pointer-events: none;
}

.eco-conta-cabecalho > * {
	position: relative;
}

.eco-conta-cabecalho__identidade {
	display: flex;
	flex-direction: column;
	align-items: center;
	gap: var(--wp--preset--spacing--20);
}

.eco-conta-cabecalho__nome {
	margin: var(--wp--preset--spacing--40) 0 0;
	color: var(--eco-accent-text, var(--wp--preset--color--primary-dark));
	font-family: var(--wp--preset--font-family--headline);
	font-size: var(--wp--preset--font-size--xx-large);
	font-weight: 700;
	line-height: 1.1;
}

.eco-conta-cabecalho__email {
	margin: 0;
	color: var(--wp--preset--color--muted);
	font-size: var(--wp--preset--font-size--medium);
}

/* O retrato. O tamanho vem do PHP numa propriedade, para o mesmo componente
   servir os 200px da página e os 40px do cabeçalho. */
.eco-conta-retrato {
	display: inline-flex;
	width: var(--eco-retrato, 160px);
	height: var(--eco-retrato, 160px);
	border-radius: 50%;
	overflow: hidden;
	background: #d8d8d8;
}

.eco-conta-retrato__imagem {
	width: 100%;
	height: 100%;
	object-fit: cover;
	display: block;
}

/* Separadores. */
.eco-conta-abas {
	display: flex;
	justify-content: center;
	flex-wrap: wrap;
	gap: var(--wp--preset--spacing--30);
	margin-top: var(--wp--preset--spacing--50);
}

.eco-conta-abas__item {
	padding: 10px 22px;
	border-radius: 999px;
	color: var(--wp--preset--color--ink);
	font-size: var(--wp--preset--font-size--large);
	text-decoration: none;
	white-space: nowrap;
}

.eco-conta-abas__item:hover,
.eco-conta-abas__item:focus-visible {
	background: var(--wp--preset--color--surface);
}

.eco-conta-abas__item.is-atual {
	background: var(--wp--preset--color--surface);
	font-weight: 600;
}

/* O corpo de cada separador. */
.eco-conta-painel {
	margin-top: var(--wp--preset--spacing--70);
}

.eco-conta-estado {
	margin: 0 0 var(--wp--preset--spacing--30);
	min-height: 1.4em;
	font-size: var(--wp--preset--font-size--small);
	font-weight: 600;
}

.eco-conta-estado.is-ok {
	color: var(--wp--preset--color--primary-dark);
}

.eco-conta-estado.is-erro {
	color: var(--wp--preset--color--live);
}

/* Os campos do perfil: cartão branco, uma linha por campo. */
.eco-conta-campos {
	background: var(--wp--preset--color--base);
	padding: var(--wp--preset--spacing--20) var(--wp--preset--spacing--60);
}

.eco-conta-campo {
	display: grid;
	grid-template-columns: 1fr auto;
	align-items: center;
	gap: var(--wp--preset--spacing--40);
	padding: var(--wp--preset--spacing--50) 0;
	border-bottom: 1px solid var(--wp--preset--color--border);
}

.eco-conta-campo:last-child {
	border-bottom: 0;
}

.eco-conta-campo__texto {
	display: flex;
	flex-direction: column;
	gap: 6px;
	min-width: 0;
}

.eco-conta-campo__rotulo {
	font-size: var(--wp--preset--font-size--large);
	font-weight: 700;
}

/* Fechada, a caixa é o valor: sem contorno e cinzenta, como em produção.
   Aberta, volta a parecer uma caixa de texto. */
.eco-conta-campo__input {
	width: 100%;
	max-width: 26rem;
	padding: 8px 12px;
	border: 1px solid var(--wp--preset--color--border);
	background: var(--wp--preset--color--base);
	color: var(--wp--preset--color--ink);
	font: inherit;
	font-size: var(--wp--preset--font-size--medium);
}

.eco-conta-campo__input:disabled {
	border-color: transparent;
	padding-left: 0;
	background: transparent;
	color: var(--wp--preset--color--muted);
	opacity: 1;
	-webkit-text-fill-color: var(--wp--preset--color--muted);
}

.eco-conta-campo__ajuda {
	color: var(--wp--preset--color--muted);
	font-size: var(--wp--preset--font-size--small);
}

/* Os dois botões ocupam a mesma célula da grelha: em células separadas, o
   "Guardar" caía para a linha de baixo e esticava-se pela largura toda. */
.eco-conta-campo__accoes {
	display: flex;
	align-items: center;
	gap: var(--wp--preset--spacing--20);
}

.eco-conta-campo__editar,
.eco-conta-campo__gravar {
	padding: 9px 26px;
	border: 1px solid var(--wp--preset--color--ink);
	border-radius: 999px;
	background: transparent;
	color: var(--wp--preset--color--ink);
	font: inherit;
	font-size: var(--wp--preset--font-size--medium);
	cursor: pointer;
}

.eco-conta-campo__gravar {
	border-color: var(--eco-accent-text, var(--wp--preset--color--primary-dark));
	background: var(--eco-accent-text, var(--wp--preset--color--primary-dark));
	color: var(--wp--preset--color--base);
}

.eco-conta-campo__editar:hover,
.eco-conta-campo__gravar:hover {
	opacity: 0.85;
}

/* Sem script não há "Editar" nenhum para carregar: a caixa está aberta e o que
   se mostra é o "Guardar". Com script (is-js) é ao contrário. */
.eco-conta-campo__editar {
	display: none;
}

.eco-conta-campo.is-js .eco-conta-campo__editar {
	display: inline-block;
}

.eco-conta-campo.is-js .eco-conta-campo__gravar {
	display: none;
}

.eco-conta-campo.is-js.is-aberto .eco-conta-campo__gravar {
	display: inline-block;
}

.eco-conta-campo.is-a-gravar {
	opacity: 0.6;
	pointer-events: none;
}

/* Apagar o perfil. Fundo rosa, tudo a vermelho — é a única linha do ecrã que
   não se pode desfazer, e tem de se ler como tal. */
.eco-conta-apagar {
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: var(--wp--preset--spacing--40);
	flex-wrap: wrap;
	margin-top: 2px;
	padding: var(--wp--preset--spacing--50) var(--wp--preset--spacing--60);
	background: #fdecec;
}

.eco-conta-apagar__titulo {
	margin: 0;
	color: var(--wp--preset--color--live);
	font-size: var(--wp--preset--font-size--large);
	font-weight: 700;
}

.eco-conta-apagar__nota {
	margin: 4px 0 0;
	color: var(--wp--preset--color--live);
	font-size: var(--wp--preset--font-size--medium);
}

.eco-conta-apagar__botao {
	padding: 9px 26px;
	border: 1px solid var(--wp--preset--color--live);
	border-radius: 999px;
	background: transparent;
	color: var(--wp--preset--color--live);
	font: inherit;
	cursor: pointer;
}

.eco-conta-apagar__botao:hover {
	background: var(--wp--preset--color--live);
	color: var(--wp--preset--color--base);
}

/* A confirmação. É um <dialog>: o foco preso, o Escape e o fundo inerte vêm do
   elemento. */
.eco-conta-dialogo,
.eco-login {
	max-width: min(92vw, 1040px);
	padding: 0;
	border: 0;
	background: transparent;
}

.eco-conta-dialogo::backdrop,
.eco-login::backdrop {
	background: rgba(0, 0, 0, 0.72);
}

.eco-conta-dialogo__caixa {
	padding: var(--wp--preset--spacing--60);
	background: var(--wp--preset--color--base);
	max-width: 34rem;
}

.eco-conta-dialogo__titulo {
	margin: 0 0 var(--wp--preset--spacing--30);
	font-size: var(--wp--preset--font-size--card);
}

.eco-conta-dialogo__nota {
	margin: 0 0 var(--wp--preset--spacing--50);
	color: var(--wp--preset--color--muted);
}

.eco-conta-dialogo__accoes {
	display: flex;
	justify-content: flex-end;
	gap: var(--wp--preset--spacing--30);
	flex-wrap: wrap;
}

.eco-conta-dialogo__cancelar,
.eco-conta-dialogo__confirmar {
	padding: 9px 22px;
	border-radius: 999px;
	border: 1px solid var(--wp--preset--color--ink);
	background: transparent;
	color: var(--wp--preset--color--ink);
	font: inherit;
	cursor: pointer;
}

.eco-conta-dialogo__confirmar {
	border-color: var(--wp--preset--color--live);
	background: var(--wp--preset--color--live);
	color: var(--wp--preset--color--base);
}

/* Comentários, assinatura e os vazios. */
.eco-conta-vazio {
	margin: 0;
	padding: var(--wp--preset--spacing--70) 0;
	text-align: center;
	font-size: var(--wp--preset--font-size--large);
}

.eco-conta-vazio a {
	color: inherit;
}

.eco-conta-comentarios {
	margin: 0;
	padding: 0 var(--wp--preset--spacing--60);
	list-style: none;
	background: var(--wp--preset--color--base);
}

.eco-conta-comentario {
	padding: var(--wp--preset--spacing--50) 0;
	border-bottom: 1px solid var(--wp--preset--color--border);
}

.eco-conta-comentario:last-child {
	border-bottom: 0;
}

.eco-conta-comentario__artigo {
	display: block;
	color: var(--wp--preset--color--ink);
	font-family: var(--wp--preset--font-family--headline);
	font-size: var(--wp--preset--font-size--large);
	font-weight: 700;
	text-decoration: none;
}

.eco-conta-comentario__data {
	display: block;
	margin-top: 4px;
	color: var(--wp--preset--color--muted);
	font-size: var(--wp--preset--font-size--small);
}

.eco-conta-comentario__texto {
	margin: var(--wp--preset--spacing--20) 0 0;
	color: var(--wp--preset--color--ink);
}

.eco-conta-assinatura {
	padding: var(--wp--preset--spacing--60);
	background: var(--wp--preset--color--base);
}

.eco-conta-assinatura__nome {
	margin: 0 0 var(--wp--preset--spacing--40);
	font-size: var(--wp--preset--font-size--card);
	font-weight: 700;
}

.eco-conta-assinatura__lista {
	display: grid;
	gap: var(--wp--preset--spacing--30);
	margin: 0;
}

.eco-conta-assinatura__lista > div {
	display: flex;
	justify-content: space-between;
	gap: var(--wp--preset--spacing--40);
	border-bottom: 1px solid var(--wp--preset--color--border);
	padding-bottom: var(--wp--preset--spacing--30);
}

.eco-conta-assinatura__lista dt {
	color: var(--wp--preset--color--muted);
}

.eco-conta-assinatura__lista dd {
	margin: 0;
	font-weight: 600;
}

.eco-conta-assinatura__gerir {
	display: inline-block;
	margin-top: var(--wp--preset--spacing--50);
	padding: 10px 26px;
	border-radius: 999px;
	background: var(--eco-accent-text, var(--wp--preset--color--primary-dark));
	color: var(--wp--preset--color--base);
	text-decoration: none;
}

/* ──────────────────────────────────────────────────────────────────────────
   O controlo da conta no cabeçalho
   ────────────────────────────────────────────────────────────────────────── */

.eco-conta-entrar__botao {
	flex: none;
	padding: 8px 22px;
	border: 2px solid var(--wp--preset--color--base);
	border-radius: 999px;
	color: var(--wp--preset--color--base);
	font-size: var(--wp--preset--font-size--small);
	font-weight: 700;
	text-decoration: none;
	white-space: nowrap;
	cursor: pointer;
	background: transparent;
}

.eco-conta-menu {
	position: relative;
	flex: none;
}

.eco-conta-menu__gatilho {
	display: inline-flex;
	list-style: none;
	cursor: pointer;
	border-radius: 50%;
}

/* O triângulo que o Safari põe à frente de um <summary>. */
.eco-conta-menu__gatilho::-webkit-details-marker {
	display: none;
}

.eco-conta-menu__painel {
	position: absolute;
	top: calc(100% + 14px);
	right: 0;
	z-index: 60;
	width: min(92vw, 420px);
	padding: var(--wp--preset--spacing--60) var(--wp--preset--spacing--50) var(--wp--preset--spacing--50);
	background: var(--wp--preset--color--base);
	box-shadow: 0 18px 44px rgba(0, 0, 0, 0.22);
	text-align: center;
	color: var(--wp--preset--color--ink);
}

.eco-conta-menu__identidade {
	display: flex;
	flex-direction: column;
	align-items: center;
}

.eco-conta-menu__nome {
	margin: var(--wp--preset--spacing--30) 0 0;
	color: var(--eco-accent-text, var(--wp--preset--color--primary-dark));
	font-family: var(--wp--preset--font-family--headline);
	font-size: var(--wp--preset--font-size--card);
	font-weight: 700;
}

.eco-conta-menu__email {
	margin: 2px 0 0;
	color: var(--wp--preset--color--muted);
	font-size: var(--wp--preset--font-size--medium);
}

.eco-conta-menu__lista {
	margin: var(--wp--preset--spacing--50) 0 0;
	padding: 0;
	list-style: none;
	box-shadow: 0 2px 10px rgba(0, 0, 0, 0.08);
	overflow: hidden;
	text-align: left;
}

.eco-conta-menu__lista li + li {
	border-top: 1px solid var(--wp--preset--color--border);
}

.eco-conta-menu__lista a {
	display: flex;
	align-items: center;
	gap: var(--wp--preset--spacing--40);
	padding: var(--wp--preset--spacing--40) var(--wp--preset--spacing--50);
	color: var(--wp--preset--color--ink);
	font-size: var(--wp--preset--font-size--large);
	text-decoration: none;
}

.eco-conta-menu__lista a:hover {
	background: var(--wp--preset--color--surface);
}

.eco-conta-menu__icone {
	flex: none;
	color: var(--wp--preset--color--primary);
}

.eco-conta-menu__sair {
	display: inline-block;
	margin-top: var(--wp--preset--spacing--40);
	color: var(--wp--preset--color--muted);
	font-size: var(--wp--preset--font-size--small);
}

/* ──────────────────────────────────────────────────────────────────────────
   O modal de sessão
   ────────────────────────────────────────────────────────────────────────── */

.eco-login__caixa {
	position: relative;
	width: min(92vw, 1040px);
	padding: var(--wp--preset--spacing--70) var(--wp--preset--spacing--60);
	background: var(--wp--preset--color--inverse);
	color: var(--wp--preset--color--base);
	text-align: center;
}

.eco-login__fechar {
	position: absolute;
	top: 12px;
	right: 16px;
	border: 0;
	background: transparent;
	color: var(--wp--preset--color--base);
	font-size: 2rem;
	line-height: 1;
	cursor: pointer;
}

/* A marca sobre o fundo escuro. O ficheiro é o mesmo da faixa verde e está
   desenhado em inverse (#002410), que aqui desapareceria: entra como máscara,
   que é para o que foi preparado, e a cor passa a ser o verde da marca. */
.eco-login__simbolo {
	display: block;
	width: 62px;
	aspect-ratio: 123 / 180;
	margin: 0 auto;
	background: var(--wp--preset--color--primary);
	-webkit-mask: url("../images/eco-mark.svg") center / contain no-repeat;
	mask: url("../images/eco-mark.svg") center / contain no-repeat;
}

.eco-login__titulo {
	margin: var(--wp--preset--spacing--30) 0 var(--wp--preset--spacing--60);
	color: var(--wp--preset--color--primary);
	font-size: var(--wp--preset--font-size--x-large);
}

.eco-login__colunas {
	display: grid;
	grid-template-columns: 1fr 1px 1fr;
	gap: var(--wp--preset--spacing--60);
	align-items: start;
	text-align: center;
}

/* O filete do meio é a coluna do meio: uma borda numa das colunas encostava-se
   ao conteúdo dela e desalinhava as duas. */
.eco-login__colunas::before {
	content: "";
	grid-column: 2;
	grid-row: 1;
	width: 1px;
	height: 100%;
	background: rgba(255, 255, 255, 0.25);
}

.eco-login__coluna {
	grid-row: 1;
}

.eco-login__coluna--registo {
	grid-column: 3;
}

.eco-login__legenda,
.eco-login__chamada {
	margin: 0 0 var(--wp--preset--spacing--40);
	font-size: var(--wp--preset--font-size--large);
	font-weight: 600;
}

.eco-login__chamada {
	font-size: var(--wp--preset--font-size--card);
}

.eco-login__form {
	display: flex;
	flex-direction: column;
	gap: var(--wp--preset--spacing--30);
	align-items: center;
}

.eco-login__form input {
	width: min(100%, 22rem);
	padding: 12px 20px;
	border: 0;
	border-radius: 999px;
	background: var(--wp--preset--color--base);
	color: var(--wp--preset--color--ink);
	font: inherit;
}

.eco-login__submeter {
	margin-top: var(--wp--preset--spacing--20);
	padding: 11px 34px;
	border: 0;
	border-radius: 999px;
	background: var(--wp--preset--color--primary);
	color: var(--wp--preset--color--base);
	font: inherit;
	font-weight: 700;
	cursor: pointer;
}

.eco-login__esqueci {
	display: inline-block;
	margin-top: var(--wp--preset--spacing--40);
	color: var(--wp--preset--color--base);
	font-size: var(--wp--preset--font-size--medium);
}

.eco-login__disclaimer,
.eco-login__fechado {
	margin: var(--wp--preset--spacing--40) 0 0;
	font-size: var(--wp--preset--font-size--small);
}

.eco-login__disclaimer a,
.eco-login__fechado a,
.eco-login__esqueci {
	color: var(--wp--preset--color--base);
}

.eco-login__estado {
	margin: var(--wp--preset--spacing--20) 0 0;
	font-size: var(--wp--preset--font-size--small);
}

.eco-login__estado.is-erro {
	color: var(--wp--preset--color--negative);
}

.eco-login__social {
	margin-bottom: var(--wp--preset--spacing--50);
}

@media (max-width: 781px) {
	.eco-conta-cabecalho__nome {
		font-size: var(--wp--preset--font-size--x-large);
	}

	.eco-conta-campos,
	.eco-conta-comentarios,
	.eco-conta-assinatura {
		padding-left: var(--wp--preset--spacing--40);
		padding-right: var(--wp--preset--spacing--40);
	}

	/* O botão passa para baixo do campo: lado a lado numa coluna estreita, a
	   caixa de texto ficava com dois dedos de largura. */
	.eco-conta-campo {
		grid-template-columns: 1fr;
	}

	.eco-conta-campo__accoes {
		justify-self: start;
	}

	.eco-conta-apagar {
		padding-left: var(--wp--preset--spacing--40);
		padding-right: var(--wp--preset--spacing--40);
	}

	/* Uma coluna e o filete fora: a linha vertical entre duas colunas
	   empilhadas não separa nada. */
	.eco-login__colunas {
		grid-template-columns: 1fr;
		gap: var(--wp--preset--spacing--60);
	}

	.eco-login__colunas::before {
		display: none;
	}

	.eco-login__coluna,
	.eco-login__coluna--registo {
		grid-column: 1;
		grid-row: auto;
	}

	.eco-login__caixa {
		padding: var(--wp--preset--spacing--60) var(--wp--preset--spacing--40);
		max-height: 90vh;
		overflow-y: auto;
	}
}

/* O formulário do plugin de assinaturas, dentro do modal de entrada.

   O markup é dele (`.rcp_form`, `#rcp_login_form`) e não se pode mudar sem
   deixar de receber as correcções do plugin — por isso veste-se onde está, em
   vez de se copiar. As caixas ficam com a mesma forma das do registo ao lado,
   que é o que o desenho mostra: pílulas brancas sobre o fundo escuro. */

.eco-login .rcp_form {
	display: flex;
	flex-direction: column;
	gap: var(--wp--preset--spacing--30);
	align-items: center;
	text-align: center;
}

.eco-login .rcp_form p,
.eco-login .rcp_form fieldset {
	margin: 0;
	padding: 0;
	border: 0;
	width: min(100%, 22rem);
}

/* Os rótulos do plugin ficam por cima das caixas, e ficam à vista.

   O desenho põe o texto dentro da caixa, como sugestão, mas o markup é do
   plugin e não tem `placeholder` nenhum — escondê-los deixava duas caixas
   brancas em branco, sem nada que dissesse o que lá vai dentro. Um rótulo
   pequeno por cima diz, e diz também a quem usa leitor de ecrã. */
.eco-login .rcp_form label {
	display: block;
	margin-bottom: 4px;
	text-align: left;
	color: var(--wp--preset--color--base);
	font-size: var(--wp--preset--font-size--small);
}

/* O "Manter sessão iniciada" é uma caixa de confirmação: rótulo à direita, na
   mesma linha, e não por cima como os campos de texto. */
.eco-login .rcp_form .rcp_login_data label {
	display: inline;
	margin: 0 0 0 6px;
}

.eco-login .rcp_form input[type="text"],
.eco-login .rcp_form input[type="email"],
.eco-login .rcp_form input[type="password"] {
	width: 100%;
	padding: 12px 20px;
	border: 0;
	border-radius: 999px;
	background: var(--wp--preset--color--base);
	color: var(--wp--preset--color--ink);
	font: inherit;
}

.eco-login .rcp_form input[type="submit"],
.eco-login .rcp_form .rcp-button {
	margin-top: var(--wp--preset--spacing--20);
	padding: 11px 34px;
	border: 0;
	border-radius: 999px;
	background: var(--wp--preset--color--primary);
	color: var(--wp--preset--color--base);
	font: inherit;
	font-weight: 700;
	cursor: pointer;
}

/* "Lembrar-me" e "Esqueceu-se da palavra-passe?" — miudezas por baixo do botão,
   na mesma escala do resto da coluna. */
.eco-login .rcp_form .rcp_login_data,
.eco-login .rcp_form .rcp_lost_password,
.eco-login .rcp_form label {
	color: var(--wp--preset--color--base);
	font-size: var(--wp--preset--font-size--small);
}

.eco-login .rcp_form a {
	color: var(--wp--preset--color--base);
}

.eco-login .rcp_message,
.eco-login .rcp_error {
	width: min(100%, 22rem);
	margin: 0 auto var(--wp--preset--spacing--30);
	padding: 10px 16px;
	background: rgba(255, 255, 255, 0.12);
	color: var(--wp--preset--color--base);
	font-size: var(--wp--preset--font-size--small);
}

/* ──────────────────────────────────────────────────────────────────────────
   Conteúdo importado da produção — imagens e galerias em HTML clássico.

   Os 51 artigos de exemplo trazem o corpo tal como a produção o guarda:
   HTML clássico, sem gramática de blocos. As imagens vêm com width/height
   fixos (2000px no podcast do Santander) e o slider de galeria vem com o
   markup do tema antigo (`ul.gallery__slides.rslides`), cujo CSS/JS não
   existe aqui. Sem isto, a página estica até à largura da maior imagem —
   medido: 2120px numa janela de 1440 — e as galerias empilham <li> com
   marcador de lista à vista.

   Só o que impede o transbordo e o marcador; o desenho das galerias fica
   para uma sessão de trabalho (ver relatório de 2026-08-20). */

.wp-block-post-content img {
	max-width: 100%;
	height: auto;
}

/* O `max-width: 100%` na imagem não chegava, e a razão é a que sempre é: 100%
   de quê.

   O editor clássico embrulha uma imagem com legenda num
   `<figure class="wp-caption" style="width: 1500px">` — a largura vai inline,
   no elemento. A imagem lá dentro respeitava o seu `max-width: 100%` com toda
   a lealdade: 100% de 1500px. Medido no artigo 316 (as dez casas de luxo):
   vinte elementos a passar do poço de 894, com figuras de 1500, 1200 e 1038px
   a sangrar por cima da coluna lateral. Na produção o mesmo artigo não
   transborda em nada.

   Travar a figura resolve os dois: o `max-width` limita sempre o `width`,
   mesmo o que vem inline, por isso não é preciso `!important` nenhum — e a
   imagem, ao pedir 100% de uma figura já limitada, cabe. */
.wp-block-post-content :is(figure, .wp-caption, .wp-block-image) {
	max-width: 100%;
}

/* ── Ícones de um sprite que não existe ───────────────────────────────────
   O corpo importado traz componentes da produção — o cartão de artigo
   relacionado (`aside.info-card`, o "Ler Mais") é o mais comum — e dentro
   deles um `<svg class="eco-sprite"><use xlink:href="#shape-…"></use></svg>`.

   A produção injecta uma folha de sprites no HTML; aqui não existe. Um `<svg>`
   sem conteúdo e sem dimensões desenha-se ao tamanho de substituição do
   browser — 300×150 — e é isso que fazia os 213px de branco no meio do artigo
   que pareciam um bloco por renderizar. Não é: é um ícone órfão a ocupar
   espaço.

   Enquanto a folha de sprites não vier (é parte do pedido dos mu-plugins), o
   ícone sai do caminho. O texto ao lado — "Ler Mais" — continua lá e continua
   a ser uma ligação, que é o que interessa.

   Esconder só o `<svg>` não chegava: o `<span class="info-card__icon">` que o
   embrulha traz dois `<br>` do markup da produção, e sem o ícone lá dentro
   ficavam duas linhas em branco — 84px em vez dos 213 originais, mas ainda um
   buraco. Sai o span inteiro. */
.wp-block-post-content .info-card__icon,
.wp-block-post-content .eco-sprite {
	display: none;
}

/* O cartão de relacionado ganha a forma do nosso `eco/ler-mais`: painel
   cinzento, sem sublinhado, com o título a herdar a tinta do artigo. Não é o
   componente — é o markup da produção a parecer-se com ele até haver uma
   sessão para converter um no outro. */
.wp-block-post-content .info-card {
	display: block;
	margin-block: var(--wp--preset--spacing--50);
	padding: var(--wp--preset--spacing--40) var(--wp--preset--spacing--50);
	background: var(--wp--preset--color--surface);
}

.wp-block-post-content .info-card a {
	text-decoration: none;
}

.wp-block-post-content .info-card__intro {
	margin: 0;
	font-family: var(--wp--preset--font-family--headline);
	font-size: var(--wp--preset--font-size--large);
	font-weight: 700;
	line-height: 1.2;
	color: var(--wp--preset--color--ink);
}

.wp-block-post-content .info-card__link {
	margin: var(--wp--preset--spacing--20, 6px) 0 0;
	color: var(--eco-accent-text);
	font-size: var(--wp--preset--font-size--small);
	font-weight: 600;
}

/* ── O mesmo cartão, mas desmontado ───────────────────────────────────────
   Num artigo fechado o cartão chega partido. O cortador do paywall trabalha
   sobre HTML clássico e, ao cortar, deita fora o `<aside class="info-card">`
   e promove os `<p>` de dentro a irmãos do corpo. Fica o conteúdo sem a caixa
   — o título do relacionado solto no meio do texto e um "Ler Mais" verde por
   baixo, sem nada que os ligue.

   Distinguem-se pelo combinador de filho: dentro do cartão inteiro os
   parágrafos são netos do corpo; achatados, são filhos directos. Assim a
   mesma caixa desenha-se nos dois casos sem se duplicar em nenhum — o
   parágrafo de cima traz o topo do painel, o de baixo traz o fundo.

   O `border-radius` só nas pontas certas e o `margin-top: 0` no segundo são
   o que os cola: dois blocos a fingirem-se de um. */
.wp-block-post-content > .info-card__intro {
	margin-top: var(--wp--preset--spacing--50);
	margin-bottom: 0;
	padding: var(--wp--preset--spacing--40) var(--wp--preset--spacing--50) 0;
	background: var(--wp--preset--color--surface);
}

.wp-block-post-content > .info-card__link {
	margin-top: 0;
	margin-bottom: var(--wp--preset--spacing--50);
	padding: var(--wp--preset--spacing--20, 6px) var(--wp--preset--spacing--50) var(--wp--preset--spacing--40);
	background: var(--wp--preset--color--surface);
}

/* O bloco marcado pelo corte é o que desvanece, e um painel a desvanecer não
   se lê como painel: fica sem fundo para o degradê cair no texto e não numa
   caixa cinzenta cortada a meio. */
.wp-block-post-content > .info-card__link.eco-paywall-corte {
	padding: 0;
	background: none;
}

/* E o que vier depois do corte não se desenha.

   Num artigo fechado, tudo a seguir ao bloco que desvanece é resto: o
   cortador parte o cartão de relacionado a meio e o que sobra do outro lado
   são pedaços sem dono — no artigo 344, um "Ler Mais" solto, sem a caixa e
   sem a ligação de que fazia parte. Não é conteúdo que falte mostrar; é
   conteúdo que já foi cortado e ficou meio de fora.

   A regra vale só dentro de um artigo fechado: num artigo aberto não há
   marcador de corte e não há nada para esconder. */
.eco-artigo-fechado .wp-block-post-content .eco-paywall-corte ~ * {
	display: none;
}

/* ── Galerias importadas ──────────────────────────────────────────────────
   Cerca de um em cada sete artigos da produção traz uma galeria, e traz
   sempre a mesma: o `[gallery]` do editor clássico passado pelo
   `eco_post_gallery()`, que devolve
   `div.gallery > ul.gallery__slides.rslides > li.gallery__slide > figure`.
   As outras variantes que o tema antigo tem em SCSS — `gallery--wide`, as
   peles do +M e do Fora de Série, o slider dos descodificadores — não
   aparecem em conteúdo publicado.

   Do lado da produção o que impede as imagens de se empilharem é uma linha:
   `.gallery__slide { display: none }` com o primeiro visível, e o
   responsiveSlides a trocar qual é o primeiro. Nós não temos o slider, e
   esconder tudo menos uma imagem sem forma de avançar seria esconder o
   artigo.

   Aqui a galeria passa a ser uma fita que se arrasta, com paragem por
   imagem. Não precisa de JavaScript nenhum, não engana ninguém sobre o que
   faz, e as legendas — que na produção estão em 28 de 29 galerias, com
   crédito de fotógrafo — continuam à vista. Os controlos do tema antigo
   (setas, contador, ampliar) ficam escondidos: sem o slider por baixo, o
   contador mentia e o "ampliar" era uma ligação para `#`. */
.wp-block-post-content .gallery__slides {
	display: flex;
	gap: var(--wp--preset--spacing--30);
	overflow-x: auto;
	scroll-snap-type: x mandatory;
	overscroll-behavior-x: contain;
	scrollbar-width: thin;
	list-style: none;
	margin: 0;
	padding: 0;
}

.wp-block-post-content .gallery__slide {
	flex: 0 0 100%;
	scroll-snap-align: center;
	margin: 0;
}

.wp-block-post-content .gallery__slide figure {
	margin: 0;
}

.wp-block-post-content .gallery__slide-meta {
	display: block;
	margin-top: var(--wp--preset--spacing--20, 6px);
	color: var(--wp--preset--color--muted);
	font-size: var(--wp--preset--font-size--small);
}

.wp-block-post-content .gallery__slide-meta .caption__source {
	display: block;
	font-size: var(--wp--preset--font-size--x-small, .75rem);
}

/* Inertes sem o slider: escondidos em vez de deixados a fingir. */
.wp-block-post-content :is(.gallery__controls, .gallery__maximize, .gallery__exit, .gallery__overlay) {
	display: none;
}

/* ── Em Direto: painel de momentos-chave ──────────────────────────────────
   O quadro cinzento da coluna estreita do artigo em direto
   (pages-desktop/ECO artigo - em direto.png). No desenho ele está à ESQUERDA
   da lista de entradas, e não à direita como as barras laterais do resto do
   site — é por isso que o `em-direto.html` inverte a ordem das colunas em vez
   de reutilizar a disposição do `single.html`. A razão é editorial: num
   directo o que interessa é o que acabou de acontecer, e a lista de momentos
   é o índice por onde se salta para trás. Um índice fica à esquerda do texto,
   como num livro.

   O `sticky` a 104px é a altura da faixa verde colada (78px) mais o respiro:
   sem isso o índice desaparecia ao segundo scroll, que é exactamente quando
   passa a ser preciso.
   ───────────────────────────────────────────────────────────────────────── */
.eco-direto-momentos {
	padding: var(--wp--preset--spacing--50);
	background: var(--wp--preset--color--surface);
}

.eco-direto-momentos__titulo {
	margin: 0 0 var(--wp--preset--spacing--40);
	color: var(--eco-accent-text);
	letter-spacing: 0.02em;
}

/* Abaixo do patamar de duas colunas o índice deixa de ser um índice — passa a
   ser uma caixa a empurrar o directo para baixo do ecrã. Vai para cima, sem
   se colar, e o directo começa logo a seguir. */
@media (max-width: 781px) {
	.eco-direto-momentos {
		position: static !important;
	}
}

/* ── Em Direto: as duas pastilhas na mesma linha ──────────────────────────
   O desenho abre a peça com "● Em Direto" e a pastilha da secção lado a lado
   (pages-desktop/ECO artigo - em direto.png). O `eco/artigo-cabecalho` traz a
   sua própria pastilha de categoria, e compor os dois padrões um a seguir ao
   outro dava-as em duas linhas — o distintivo em cima, a secção por baixo.

   A linha é montada no template (distintivo + `post-terms`) e a pastilha que
   vem dentro do cabeçalho é escondida, em vez de se mexer no
   `eco/artigo-cabecalho`: esse padrão desenha o topo de TODOS os artigos, e
   uma alteração lá dentro por causa do directo mudava as outras centenas de
   peças que não têm distintivo nenhum. */
.eco-direto-cabecalho .eco-label--categoria {
	display: none;
}

/* ── Aviso de bloco, para quem edita ──────────────────────────────────────
   Os blocos de manchete aceitam a lista toda de lugares e cada tratamento
   desenha os seus. Um lugar preenchido que o tratamento não desenha teria de
   desaparecer em silêncio — e um artigo escolhido que não aparece manda quem
   edita procurar o defeito no sítio errado. Esta linha aparece à cabeça do
   bloco, e SÓ a quem tem permissão para editar: o eco-core não a imprime para
   o leitor.

   Amarelo do aviso e não vermelho do erro: o bloco está a desenhar bem, só
   está a desenhar menos do que quem o preencheu julga. */
.eco-bloco__aviso {
	margin: 0 0 var(--wp--preset--spacing--40);
	padding: var(--wp--preset--spacing--30) var(--wp--preset--spacing--40);
	border-left: 3px solid #d99b00;
	background: color-mix(in srgb, #d99b00 12%, transparent);
	font-size: var(--wp--preset--font-size--small, .875rem);
	line-height: 1.45;
}

/* ── Chamada Premium no fim de um artigo aberto ───────────────────────────
   Painel escuro que fecha uma peça que se leu inteira. O desenho (Figma
   677:5665) mede 894 de fora a fora e 846 de poço, e é dessa diferença que
   sai o `padding` lateral; o filete corre o poço todo. */

.eco-premium-cta__marca { gap: var(--wp--preset--spacing--40); }
.eco-premium-cta__marca .wp-block-site-logo img { display: block; }
/* A cor do selo e a do filete saíram do markup para aqui. As classes de
   preset do núcleo (`has-primary-color`, `has-primary-background-color`)
   trazem `!important`, e com elas no HTML não havia regra que as vencesse
   sem `!important` também — que é uma guerra que não vale a pena ter dentro
   de um padrão nosso. */
.eco-premium-cta__selo {
	margin: 0;
	letter-spacing: -0.01em;
	color: var( --wp--preset--color--primary );
}

/* O filete é a régua do desenho: 1px, a cor da marca, sem a opacidade que o
   separador do núcleo lhe põe por omissão.

   O `margin: 0` que aqui esteve punha-o encostado à marca. O desenho quer-lhe
   120px do topo do painel, e a conta é 48 de padding + 48 da marca + 24 de
   blockGap — mas o blockGap chega ao separador como margem, e o `margin: 0`
   apagava-o. Media-se 80. Fica só o que o separador precisa mesmo de perder,
   que é a margem lateral. */
.eco-premium-cta__filete.wp-block-separator {
	border: 0;
	height: 1px;
	opacity: 1;
	margin-inline: 0;
	width: 100%;
	max-width: none;
	background-color: var( --wp--preset--color--primary );
}

/* O título tem de herdar a cor do painel, e não a dos títulos do site.
   O `theme.json` põe `elements.heading.color.text: ink` — preto — e isso
   ganha à cor de texto do grupo: num painel `inverse` o título saía a
   rgb(0,0,0) sobre rgb(0,36,16), **1,26 de contraste**. Era isto o "sem
   contraste" reportado, mais do que o selo: a frase maior do painel era a
   menos legível de todas. */
.eco-premium-cta__titulo {
	line-height: 1.15;
	margin: 0;
	color: inherit;
}

.eco-premium-cta__vantagens { row-gap: var(--wp--preset--spacing--50); }

/* Cada vantagem é ícone + texto na mesma linha, e o ícone não encolhe quando
   o texto quebra em ecrãs estreitos. */
.eco-premium-cta__vantagem {
	display: flex;
	align-items: center;
	gap: 8px;
	margin: 0;
	font-size: var(--wp--preset--font-size--medium, 1rem);
	white-space: nowrap;
}

.eco-premium-cta__vantagem svg { flex: 0 0 24px; }

/* 13px e não 16: o desenho mede o botão a 48 de altura e com 16 saía a 54. */
.eco-premium-cta__botao .wp-block-button__link {
	padding: 13px 32px;
	/* A cor do rótulo é calculada por marca — branco ou #002410, o que
	   contrastar mais com o fundo do botão. Sem isto o rótulo herdava `inverse`
	   fixo e, nas marcas de primary escuro, desaparecia dentro do próprio
	   botão: o Local Online media 1,01 de contraste (#002410 sobre #1D1D1B),
	   o ECO Avenida 1,23 e o +M 1,49. O token já existia — é o mesmo que veste
	   o hamburger e a lupa do cabeçalho. */
	color: var( --eco-on-primary, var( --wp--preset--color--inverse ) );
}

/* ── Folga entre as duas chamadas ─────────────────────────────────────────
   O painel tem duas chamadas a seguir uma à outra — o botão de assinatura e a
   linha "Veja todos os planos · Cancele quando quiser" — e o `blockGap` do
   grupo dava-lhes o mesmo intervalo que dá ao resto da pilha. Com o botão a
   48px de altura e a nota a 14px, o mesmo intervalo lê-se como menos: as duas
   colavam-se e a nota parecia legenda do botão em vez de segunda opção.
   Aqui separam-se de propósito, e a nota fica mais perto do botão do que o
   botão fica do que vem antes dele — é ela que pertence à chamada. */
.eco-premium-cta .wp-block-buttons {
	margin-top: var(--wp--preset--spacing--60);
}

.eco-premium-cta__nota { margin: var(--wp--preset--spacing--40) 0 0; opacity: .85; }

/* Mesma história em ponto pequeno: a ligação saía com o verde dos links do
   corpo (primary-dark, rgb(0,103,44)) e media 2,36 sobre o painel. Herda a
   cor do painel; quem diz que é ligação é o sublinhado, que já lá estava. */
.eco-premium-cta__nota a {
	text-decoration: underline;
	color: inherit;
}

/* ── O painel dentro de uma vertical ──────────────────────────────────────
   O fundo do painel é `inverse` (#002410) e não muda com a marca; o que muda
   é o `primary`, que aqui pintava o selo "Premium" e o filete. Medido nas dez
   marcas registadas, o contraste do primary sobre o inverse:

     local-online 1,01 · ECO Avenida 1,23 · +M 1,49 · ECOseguros 2,93 ·
     Capital Verde 3,80 · Advocatus 5,27 · eRadar 5,80 · ECO 7,09 ·
     EContas 7,99 · Trabalho 13,05

   Cinco das dez ficam abaixo do mínimo de 4,5, e as três primeiras são
   praticamente invisíveis — o Local Online é cinzento quase preto sobre
   verde quase preto. É a mesma família de defeito do logótipo de canal: uma
   regra escrita a pensar no ECO que passou a valer para doze marcas.

   O ECO fica como está (7,09 passa, e o verde sobre o escuro é o desenho).
   Dentro de uma vertical o selo e o filete passam a branco, que dá 16,67 em
   todas. A marca continua a ver-se no botão, onde o rótulo é calculado e não
   corre risco. */
.eco-brand .eco-premium-cta__selo,
.eco-brand .eco-premium-cta__filete.wp-block-separator {
	color: var( --wp--preset--color--base );
	background-color: var( --wp--preset--color--base );
}

.eco-brand .eco-premium-cta__selo {
	background-color: transparent;
}

/* Abaixo dos 600px as três vantagens deixam de caber lado a lado; empilham
   alinhadas à esquerda em vez de partirem os títulos ao meio. */
@media (max-width: 600px) {
	.eco-premium-cta__vantagens { flex-direction: column; align-items: flex-start; }
	.eco-premium-cta__vantagem { white-space: normal; }
	.eco-premium-cta__botao .wp-block-button__link { padding: 14px 20px; }
}

/* ──────────────────────────────────────────────────────────────────────────
   Opinião — três formas, escolhidas pelo número de peças
   ──────────────────────────────────────────────────────────────────────────
   O desenhador do `eco-core` decide a forma pela contagem e põe o modificador
   no `.eco-opiniao`. Aqui só se veste o que ele monta.

   Medidas lidas do dump do Figma, não do olho:
     `--fila`   Group 54  (395:567)  1360×251
     `--uma`    Frame 278 (756:909)  1359×316
   ────────────────────────────────────────────────────────────────────────── */

/* O mesmo sublinhado do `elements.link` que apanhava os cartões apanha isto:
   qualquer ligação dentro do conteúdo de uma página nasce sublinhada, e numa
   home de canal a Opinião está lá dentro. O título de uma peça é a ligação
   inteira — sublinhá-lo não distingue nada. Vale para as três formas; a fila
   já o tinha na regra do `__item` e faltava às outras duas. */
.eco-opiniao a {
	text-decoration: none;
}

.eco-opiniao a:hover .eco-opiniao__titulo,
.eco-opiniao a:focus-visible .eco-opiniao__titulo {
	text-decoration: underline;
}

.eco-opiniao__assinatura.eco-byline {
	display: flex;
	align-items: center;
	gap: var(--wp--preset--spacing--30);
}

.eco-opiniao__assinatura .eco-byline__nome {
	font-size: var(--wp--preset--font-size--small);
	font-weight: 600;
	line-height: 1.3;
}

/* ── Uma peça: é uma citação, não um cartão ───────────────────────────────
   O desenho põe o texto a 120 da esquerda, o título a 720 de largura e o
   retrato a 80 — o dobro do disco de assinatura normal. As aspas são duas no
   ficheiro (278×200 em baixo à direita, 111×80 em cima à esquerda); fica a
   grande, que é a que se lê como ornamento e não como gralha. */
.eco-opiniao--uma {
	position: relative;
	overflow: hidden;
	padding: var(--wp--preset--spacing--50) 120px;
}

.eco-opiniao--uma .eco-opiniao__aspas {
	position: absolute;
	right: 40px;
	bottom: -64px;
	font-family: var(--wp--preset--font-family--headline);
	font-size: 320px;
	line-height: 1;
	color: var(--eco-accent);
	opacity: .16;
	pointer-events: none;
	user-select: none;
}

.eco-opiniao--uma .eco-opiniao__texto {
	position: relative;
	max-width: 720px;
}

.eco-opiniao--uma .eco-opiniao__titulo {
	margin: 0 0 var(--wp--preset--spacing--50);
	font-size: var(--wp--preset--font-size--x-large);
	line-height: 1.2;
}

.eco-opiniao--uma .eco-opiniao__assinatura {
	--eco-byline-size: 80px;
}

/* ── Duas a quatro: a fila em painel ──────────────────────────────────────
   O painel é cinzento e tem 24px de folga por dentro; é por ele que o título
   vai sem filete — dois sinais de "aqui começa uma secção" no mesmo sítio
   anulam-se.

   A conta das colunas, no desenho: passo de 340, peça de 292, filete a 316 —
   ou seja a meio dos 48 de intervalo. Sai exacta sem `gap`: cada item leva
   24px de folga de cada lado (24 + 292 + 24 = 340) e o filete é o
   `border-left` do segundo em diante. A `__fila` recua 24px para os lados
   para que a folga do primeiro item caia em cima da folga do painel e o texto
   comece onde o desenho o põe.

   `grid-auto-flow: column` em vez de `repeat(n, 1fr)`: a contagem varia entre
   dois e quatro e assim a folha não precisa de a saber. */
.eco-opiniao--fila {
	background: var(--wp--preset--color--surface);
	padding: var(--wp--preset--spacing--50);
}

.eco-opiniao--fila .eco-opiniao__fila {
	display: grid;
	grid-auto-flow: column;
	grid-auto-columns: 1fr;
	/* Intervalo entre cartões. Houve aqui um recuo negativo enquanto a separação
	   era um filete entre textos encostados; com cartões independentes, o recuo
	   colava-os uns aos outros e a fila lia-se como uma grelha de tabela.

	   A grelha é declarada AQUI e não no PHP: `grid-auto-flow` mais
	   `grid-auto-columns` arruma qualquer número de peças sem a folha precisar
	   de o saber, e abaixo dos 781px passa a `row`/`auto` e empilha. O
	   desenhador chegou a escrever `grid-template-columns` em linha, que declara
	   pistas explícitas e não deixava a média-consulta empilhar nada — nove
	   homes de canal deslizavam para o lado a 375px. */
	gap: var(--wp--preset--spacing--40);
}

/* Cada opinião é um cartão SEM contorno: o que o separa do vizinho é o fundo
   claro do próprio cartão contra o painel, mais o intervalo da grelha.

   Chegou a ter borda dos quatro lados durante uma hora a 26/08/2026, por eu ter
   lido o pedido do utilizador ao contrário — ele estava a descrever o alvo
   («the opinion cards have no border») e li como queixa de que faltavam. Neste
   desenho o cartão distingue-se pelo painel, não por uma linha à volta. */
.eco-opiniao__item {
	/* Coluna, com a assinatura encostada ao fundo: os cartões da fila têm todos
	   a mesma altura, e sem isto a assinatura seguia o título — subia nos
	   títulos de uma linha e descia nos de duas, e a fila lia-se desalinhada.
	   Pedido do utilizador a 27/08/2026, depois de a ver a saltar de cartão
	   para cartão.

	   A folga sobrante passa a ficar ENTRE o título e a assinatura, que é onde
	   não se nota; antes caía toda por baixo da assinatura. */
	display: flex;
	flex-direction: column;
	padding: var(--wp--preset--spacing--40);
	color: inherit;
	text-decoration: none;
	background-color: var(--wp--preset--color--base);
	/* A cor entra e sai depressa; o que não pode é piscar a meio de uma fila. */
	transition: background-color .15s ease, color .15s ease;
}

/* Empurra a assinatura para o fundo. `auto` na margem de cima come toda a
   folga que sobrar, e é o que alinha as assinaturas da fila umas com as
   outras. */
.eco-opiniao__item .eco-opiniao__assinatura {
	margin-top: auto;
}

.eco-opiniao__item-titulo {
	/* O desenhador escreve-o como `<span>`, portanto em linha: sem isto o
	   título encolhia à largura do texto e as quatro peças saíam com medidas
	   diferentes (222, 209, 164 e 137 na fila do Advocatus) em vez dos 292
	   iguais do desenho. */
	display: block;
	/* Margem só em cima do mínimo: o afastamento até à assinatura é agora
	   dado pelo `margin-top: auto` dela, e somar as duas coisas afastava-as
	   duas vezes nos cartões de título curto. */
	margin: 0 0 var(--wp--preset--spacing--30);
	font-family: var(--wp--preset--font-family--headline);
	font-size: var(--wp--preset--font-size--large);
	font-weight: 600;
	line-height: 1.2;
}

/* O realce é a cor do canal, não um cinzento: é o mesmo `primary` que as
   marcas redefinem, por isso o Advocatus acende a verde-escuro e o Local
   Online no seu quase-preto sem precisarem de regra própria.

   O texto por cima usa o `--eco-on-primary`, que o `eco_brand_css()` calcula
   por marca — branco ou #002410, o que contrastar mais. Sem isso o rótulo
   herdava `ink` fixo e desaparecia nas marcas de primary escuro, que foi
   exactamente o defeito da chamada Premium.

   Ao rato muda o fundo e o texto, e MAIS NADA — sem deslocamento, sem sombra,
   sem anel no retrato. É regra do utilizador e tem bom argumento: um
   deslocamento assinala a peça movendo-a, e numa fila de cartões encostados
   isso empurra a leitura para o que está debaixo do cursor.

   Efeito lateral conhecido e por resolver: o disco genérico do retrato é
   pintado com o `primary`, que é a MESMA cor do fundo aceso — sobre o realce
   desaparece. Um retrato a sério (fotografia) não tem o problema. */
.eco-opiniao__item:hover,
.eco-opiniao__item:focus-visible {
	background: var(--eco-accent, var(--wp--preset--color--primary));
	color: var(--eco-on-primary, var(--wp--preset--color--inverse));
}

.eco-opiniao__item:hover .eco-byline__nome,
.eco-opiniao__item:focus-visible .eco-byline__nome,
.eco-opiniao__item:hover .eco-opiniao__item-titulo,
.eco-opiniao__item:focus-visible .eco-opiniao__item-titulo {
	color: inherit;
}

/* Abaixo dos 781px a fila não cabe em colunas: passa a linhas, e o filete
   muda de lado com ela. */
@media (max-width: 781px) {
	.eco-opiniao--fila .eco-opiniao__fila {
		grid-auto-flow: row;
		grid-auto-columns: auto;
	}

	/* Em coluna a borda de cada cartão já os separa; o filete extra que aqui
	   estava somava-se a ela e dava linha dupla. */
}

/* ──────────────────────────────────────────────────────────────────────────
   Comentários — o gatilho e a gaveta
   ──────────────────────────────────────────────────────────────────────────
   A gaveta em si não se veste aqui: a caixa, o fundo escurecido, a entrada
   pela direita e a transição são do `.eco-drawer` no `style.css`, e este
   painel usa-os tal como o menu os usa. O que fica aqui é o que é dos
   comentários — a lista, o comentário, os dois ecrãs e o pé.

   Sem cantos arredondados, pela regra do topo do ficheiro: só botões e
   etiquetas os levam, e aqui o único que é botão é o "Comentar".
   ────────────────────────────────────────────────────────────────────────── */

.eco-comentarios-gatilho {
	display: inline-flex;
	align-items: center;
	gap: var(--wp--preset--spacing--20);
	color: var(--eco-accent-text);
	font-size: var(--wp--preset--font-size--small);
	font-weight: 700;
	text-decoration: none;
}

.eco-comentarios-gatilho:hover {
	text-decoration: underline;
}

/* O painel é mais largo do que o do menu: ali são links curtos, aqui são
   parágrafos, e a 400px um comentário de cinquenta palavras vira uma coluna
   de sete linhas. O `min()` mantém a regra do menu para ecrãs pequenos. */
.eco-comentarios .eco-drawer__painel {
	width: min(480px, 100vw);
}

.eco-comentarios__corpo {
	flex: 1 1 auto;
	overflow-y: auto;
	padding: var(--wp--preset--spacing--50);
}

/* Só com script é que os ecrãs de resposta se escondem. Sem ele ficam
   visíveis debaixo da lista, e é por isso que a regra vive na classe que o
   `comentarios.js` acrescenta e não no elemento. */
.eco-comentarios__corpo--com-script .eco-comentarios__respostas[hidden],
.eco-comentarios__corpo--com-script .eco-comentarios__lista[hidden] {
	display: none;
}

.eco-comentarios__lista {
	margin: 0;
	padding: 0;
	list-style: none;
}

.eco-comentario {
	padding-block: var(--wp--preset--spacing--40);
	border-bottom: 1px solid var(--wp--preset--color--border);
}

.eco-comentario:last-child {
	border-bottom: 0;
}

.eco-comentario__topo {
	display: flex;
	align-items: center;
	gap: var(--wp--preset--spacing--30);
	margin-bottom: var(--wp--preset--spacing--30);
}

/* O disco com as iniciais, à medida do retrato de assinatura mas mais pequeno:
   aqui há muitos numa coluna estreita e 48px empurravam o texto para metade da
   largura. */
.eco-comentario__avatar {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	flex: 0 0 36px;
	width: 36px;
	height: 36px;
	border-radius: 999px;
	background: var(--wp--preset--color--surface);
	color: var(--eco-accent-text);
	font-family: var(--wp--preset--font-family--headline);
	font-size: .8rem;
	font-weight: 700;
	text-transform: uppercase;
}

/* Quem escreve no ECO leva a cor da marca, como na produção
   (`comment__avatar--writer`). A letra sai do `--eco-on-primary` e nunca de
   uma cor fixa — nas verticais de primary escuro um preto fixo desaparecia,
   que é o mesmo defeito que a chamada Premium teve. */
.eco-comentario__avatar--eco {
	background: var(--eco-accent, var(--wp--preset--color--primary));
	color: var(--eco-on-primary, var(--wp--preset--color--inverse));
}

.eco-comentario__nome {
	font-weight: 700;
	line-height: 1.2;
}

.eco-comentario__hora {
	margin-left: auto;
	color: var(--wp--preset--color--muted);
	font-size: var(--wp--preset--font-size--small);
	white-space: nowrap;
}

.eco-comentario__texto p {
	margin: 0 0 var(--wp--preset--spacing--30);
}

.eco-comentario__texto p:last-child {
	margin-bottom: 0;
}

/* Dobrado: quatro linhas e o resto cortado. `-webkit-line-clamp` é o que os
   browsers todos servem hoje para isto, e o `max-height` fica de reserva para
   quem não o tenha — sem ele, um comentário longo abria-se inteiro. */
.eco-comentario__texto--dobrado {
	display: -webkit-box;
	-webkit-line-clamp: 4;
	-webkit-box-orient: vertical;
	max-height: 6.5em;
	overflow: hidden;
}

.eco-comentario__mais,
.eco-comentario__respostas {
	display: inline-block;
	margin-top: var(--wp--preset--spacing--30);
	padding: 0;
	border: 0;
	background: none;
	color: var(--eco-accent-text);
	font-family: inherit;
	font-size: var(--wp--preset--font-size--small);
	font-weight: 700;
	text-decoration: underline;
	cursor: pointer;
}

.eco-comentarios__respostas-topo {
	display: flex;
	align-items: center;
	gap: var(--wp--preset--spacing--30);
	padding-bottom: var(--wp--preset--spacing--40);
	border-bottom: 2px solid var(--eco-accent);
	margin-bottom: var(--wp--preset--spacing--20);
}

.eco-comentarios__voltar {
	display: inline-flex;
	align-items: center;
	gap: 4px;
	color: var(--eco-accent-text);
	font-size: var(--wp--preset--font-size--small);
	font-weight: 700;
	text-decoration: none;
}

.eco-comentarios__respostas-info {
	margin: 0;
	color: var(--wp--preset--color--muted);
	font-size: var(--wp--preset--font-size--small);
}

.eco-comentarios__vazio {
	padding-block: var(--wp--preset--spacing--60);
	text-align: center;
}

.eco-comentarios__vazio-titulo {
	margin: 0 0 var(--wp--preset--spacing--20);
	font-family: var(--wp--preset--font-family--headline);
	font-size: var(--wp--preset--font-size--large);
	font-weight: 600;
}

.eco-comentarios__vazio-nota {
	margin: 0;
	color: var(--wp--preset--color--muted);
}

/* O pé não rola com a lista: quem está a ler o quinquagésimo comentário tem a
   caixa de escrever no mesmo sítio onde a tinha ao abrir. */
.eco-comentarios__pe {
	flex: 0 0 auto;
	padding: var(--wp--preset--spacing--40) var(--wp--preset--spacing--50);
	border-top: 1px solid var(--wp--preset--color--border);
	background: var(--wp--preset--color--base);
}

.eco-comentarios__campo textarea {
	width: 100%;
	padding: var(--wp--preset--spacing--30);
	border: 1px solid var(--wp--preset--color--border);
	font-family: inherit;
	font-size: 1rem;
	resize: vertical;
}

.eco-comentarios__entrar {
	margin: 0;
	color: var(--wp--preset--color--muted);
	font-size: var(--wp--preset--font-size--small);
}

.eco-comentarios__entrar-ligacao {
	color: var(--eco-accent-text);
	font-weight: 700;
}

/* ── Painel de paywall, revisto a 26/08/2026 ──────────────────────────────
   O que mudou, e porquê:

   1. O painel deixou de ter fundo. Era uma faixa cinzenta de largura total, e
      no desenho o que separa o painel da peça é um FILETE, não uma mancha —
      com o fundo cinzento o corte do texto lia-se como o fim do artigo e não
      como uma interrupção.
   2. Os cartões de plano ficaram mais altos e mais estreitos: o desenho dá-lhes
      ar por dentro e não os deixa esticar até aos 427px que a coluna permite.
   3. A letra subiu — título, nome do plano e preço. Este painel é a única
      coisa na página que está a pedir dinheiro; a escala tem de dizer isso.
   4. Mais espaço acima do botão e entre o botão e a linha de "Já é assinante".

   Fica em bloco no fim da folha, e não espalhado pelas regras de cima, para se
   poder ler a revisão inteira de uma vez. */

.eco-paywall {
	background: transparent;
	border-top: 1px solid var(--eco-accent, var(--wp--preset--color--primary));
}

/* Sem fundo no painel, o cartão em destaque volta a distinguir-se pelo
   cinzento — que era o que fazia antes de o painel lho roubar. */
/* Os dois cartões juntos ao meio, e não um encostado a cada lado: as colunas
   do núcleo esticam por omissão, e com o painel sem fundo isso deixava um vão
   no meio que lia como se faltasse lá alguma coisa. */
.eco-paywall__planos {
	justify-content: center;
	flex-wrap: wrap;
}

.eco-paywall .eco-plano {
	background: transparent;
	border: 1px solid var(--wp--preset--color--border);
	flex: 0 1 320px;
	max-width: 320px;
	padding: var(--wp--preset--spacing--60) var(--wp--preset--spacing--50);
	gap: var(--wp--preset--spacing--30);
}

/* O recomendado é o único com peso: fundo cinzento e contorno da marca. Sem o
   fundo do painel a fazer de contraste, é isto que o separa do outro. */
.eco-paywall .eco-plano--destaque {
	background: var(--wp--preset--color--surface);
	border: 2px solid var(--eco-accent);
}

.eco-paywall__titulo {
	font-size: var(--wp--preset--font-size--xx-large);
	line-height: 1.15;
}

.eco-paywall .eco-plano__nome {
	font-size: var(--wp--preset--font-size--x-large);
}

.eco-paywall .eco-plano__preco strong { font-size: 48px; }
.eco-paywall .eco-plano__preco span { font-size: var(--wp--preset--font-size--medium); }

/* O ar à volta das chamadas. O `blockGap` do grupo dá o resto; isto é o que
   separa o bloco de botões do que vem antes e depois dele. */
.eco-paywall .wp-block-buttons { margin-top: var(--wp--preset--spacing--60); }
.eco-paywall .eco-paywall__sessao { margin-top: var(--wp--preset--spacing--50); }
.eco-paywall .wp-block-button__link { padding: 18px 36px; font-size: var(--wp--preset--font-size--medium); }

@media (max-width: 782px) {
	.eco-paywall .eco-plano { max-width: none; }
}

/* ── O logótipo nas páginas de canal ──────────────────────────────────────
   Uma home de marca abre com o logótipo, e a 104px — a medida do cabeçalho de
   uma página normal — ele lê-se como se a página fosse do ECO e não da marca.
   Numa home de marca sobe para 150.

   **Esta regra esteve morta.** Falava de `body.single-grid`, que era o que as
   homes de marca eram enquanto foram posts do tipo `grid`; a 26/08/2026
   passaram a ser PÁGINAS com `[eco_grelha]`, e a partir daí nenhuma delas
   voltou a ter essa classe — o logótipo ficou nos 104 em todas, sem ninguém
   dar por isso. É o mesmo modo de falha que o `deploy-checklist.md` passou a
   avisar: mudou-se o que o desenhador produz e ficou uma regra a apontar para
   um selector que já não acontece.

   Passa a apanhar as duas: o `single-grid` (que ainda serve a pré-visualização
   de uma grelha no backoffice) e o `body.eco-brand`, que é o que uma home de
   marca tem hoje. */
body.single-grid .wp-block-site-logo img,
body.single-grid .wp-block-site-logo a,
body.eco-brand .wp-block-site-logo img,
body.eco-brand .wp-block-site-logo a { max-width: 240px; }

/* A LARGURA não se fixa aqui. Quem manda no logótipo de canal é a altura, no
   `style.css` (`.eco-brand .eco-masthead .custom-logo`, 48px de altura com a
   largura a acompanhar): os logótipos da produção têm proporções muito
   diferentes — o do Fundos Europeus é 2304x292 e o do ECO 104x48 — e fixar a
   largura fazia cada um sair de um tamanho. Escrever aqui uma largura era pôr
   dois valores a discutir a mesma coisa, que é o defeito que o comentário
   desse ficheiro já descreve. */

/* ── Retratos de quem assina ──────────────────────────────────────────────
   O `eco-core` já sabia montar a peça — `eco_autor_retrato_html()` devolve o
   disco com a fotografia do perfil, e as iniciais quando não há fotografia —
   mas a folha do tema nunca chegou a vestir estas classes. O sintoma via-se no
   cabeçalho de uma opinião a duas mãos: as iniciais saíam como texto solto,
   "HS" e "MT" encostados um ao outro, que se lê "HSMT".

   O disco é do tema e não do plugin de propósito: o `assets/autor.css` do
   eco-core só entra no ecrã de perfil do backoffice, e o que se vê no site é
   responsabilidade de quem desenha o site. */

.eco-retrato {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	width: var(--eco-retrato-tamanho, 48px);
	height: var(--eco-retrato-tamanho, 48px);
	border-radius: 50%;
	overflow: hidden;
	flex: 0 0 auto;
	background: var(--wp--preset--color--surface);
	color: var(--eco-accent-text, var(--wp--preset--color--primary));
	font-family: var(--wp--preset--font-family--headline);
	font-weight: 700;
	font-size: calc(var(--eco-retrato-tamanho, 48px) * 0.34);
	line-height: 1;
	letter-spacing: .02em;
	text-transform: uppercase;
}

.eco-retrato img {
	width: 100%;
	height: 100%;
	object-fit: cover;
	display: block;
}

/* As iniciais ganham a cor da marca por trás — sem fotografia, o disco tem de
   continuar a ler-se como uma pessoa e não como um espaço por preencher.

   O resto desta regra existe porque a variante não pode contar com a classe
   base. O `eco_autor_retrato_html()` recebe as classes de fora, e nem todos os
   sítios lhe passam `eco-retrato`: os cartões de assinatura passam-lhe
   `eco-byline__foto`, que desenha o mesmo disco de 48px mas é `display:block`
   e não centra nada. O elemento saía `eco-byline__foto eco-retrato--iniciais`,
   ficava só com o fundo e a cor daqui, e as iniciais encostavam ao canto
   superior esquerdo — com `overflow:hidden` a circunferência cortava-as ao
   meio. Via-se no Advocatus, no cartão do Filipe de Vasconcelos Fernandes:
   "FF" a 16px encostado a (0,0) de um círculo de 48.

   Podia resolver-se em PHP, obrigando o autor a levar sempre `eco-retrato`.
   Fica aqui porque uma variante que só funciona ao lado de uma classe
   específica volta a partir-se no próximo sítio que a use — e já se partiu
   uma vez. Estes valores são os mesmos do `.eco-retrato`; quando as duas
   classes vêm juntas não muda nada. */
.eco-retrato--iniciais {
	background: var(--eco-accent, var(--wp--preset--color--primary));
	color: var(--wp--preset--color--base);
	display: inline-flex;
	align-items: center;
	justify-content: center;
	font-family: var(--wp--preset--font-family--headline);
	font-weight: 700;
	/* Cai para a medida do disco de assinatura quando o retrato não define a
	   sua — é a mesma proporção de 0,34 que o `.eco-retrato` usa. */
	font-size: calc(var(--eco-retrato-tamanho, var(--eco-byline-size, 48px)) * 0.34);
	line-height: 1;
	letter-spacing: .02em;
	text-transform: uppercase;
}

/* No cabeçalho de opinião o retrato é grande: é o primeiro elemento da peça e
   é ele que diz de quem é o texto. */
.eco-retrato--opiniao { --eco-retrato-tamanho: 80px; }

.eco-retratos {
	display: inline-flex;
	align-items: center;
}

/* Duas ou mais assinaturas encavalitam-se ligeiramente, como na produção: diz
   "isto é a duas mãos" sem ocupar o dobro da largura. O anel da cor do fundo
   separa um disco do outro. */
.eco-retratos--multi .eco-retrato.is-multi + .eco-retrato.is-multi {
	margin-left: calc(var(--eco-retrato-tamanho, 48px) * -0.28);
}

.eco-retratos--multi .eco-retrato.is-multi {
	box-shadow: 0 0 0 3px var(--wp--preset--color--base);
}

.eco-artigo-cabecalho__retrato {
	display: flex;
	margin-bottom: var(--wp--preset--spacing--40);
}

@media (max-width: 782px) {
	.eco-retrato--opiniao { --eco-retrato-tamanho: 64px; }
}

/* ── ECO do Dia ───────────────────────────────────────────────────────────
   O arquivo em /eco-do-dia/ e a capa dentro de uma edição.

   O que se desenha aqui é UMA imagem: a fotografia da grelha do dia, que a
   produção fabrica com html2canvas num quadro de 1568px e grava na meta
   `eco_daily_cover_image`. Por isso quase tudo nesta secção é enquadramento —
   o cartaz é a capa, e o resto tem de lhe sair da frente.

   A capa fica travada nos 900px e centrada. À largura toda dos 1360 do poço
   ficava com 1,5m de altura no ecrã: é uma página de jornal, lê-se de cima a
   baixo e não de uma vez. `height:auto` é obrigatório e não decorativo — a
   altura do quadro varia com o desenho fotografado e não há aqui medida
   nenhuma que se possa escrever.

   A parede de "Outras edições" é de ligações datadas e não de miniaturas, e
   isso é uma decisão medida, não um esquecimento: cada capa é 1,25 MiB de
   base64 dentro do HTML, e dez miniaturas eram 12 MB numa página. No dia em
   que as capas forem anexos a sério, é a `.eco-edicao__outra` que ganha o
   `<img>` — a grelha já está feita para o receber. */

.eco-edicao {
	display: flex;
	flex-direction: column;
	gap: var(--wp--preset--spacing--70);
}

/* O formulário de data. É o da produção — três números e um botão — arrumado
   numa barra em vez de numa coluna, porque aqui não há três colunas ao lado. */
.eco-edicao__pesquisa {
	display: flex;
	flex-wrap: wrap;
	align-items: flex-end;
	gap: var(--wp--preset--spacing--40);
	padding: var(--wp--preset--spacing--40);
	background: var(--wp--preset--color--surface);
}

.eco-edicao__pesquisa-titulo {
	flex: 1 1 100%;
	margin: 0;
	font-family: var(--wp--preset--font-family--headline);
	font-size: var(--wp--preset--font-size--medium, 1.125rem);
	color: var(--wp--preset--color--primary-dark);
}

.eco-edicao__campos {
	display: flex;
	gap: var(--wp--preset--spacing--30);
}

.eco-edicao__campo {
	display: flex;
	flex-direction: column;
	gap: 4px;
	font-size: var(--wp--preset--font-size--small, .875rem);
}

.eco-edicao__campo input {
	width: 6.5ch;
	padding: 8px 10px;
	border: 1px solid color-mix(in srgb, var(--wp--preset--color--ink) 25%, transparent);
	background: var(--wp--preset--color--base);
	font: inherit;
	font-size: 1rem;
}

/* O ano precisa de mais quatro dígitos do que o dia. */
.eco-edicao__campo:last-child input { width: 8ch; }

.eco-edicao__submeter {
	min-height: 42px;
	padding: 0 var(--wp--preset--spacing--50);
	border: 0;
	background: var(--wp--preset--color--primary-dark);
	color: var(--wp--preset--color--base);
	font-family: var(--wp--preset--font-family--headline);
	font-size: 1rem;
	cursor: pointer;
}

.eco-edicao__submeter:hover,
.eco-edicao__submeter:focus-visible { background: var(--wp--preset--color--ink); }

.eco-edicao__titulo {
	margin: 0 0 var(--wp--preset--spacing--40);
	font-family: var(--wp--preset--font-family--headline);
	font-size: var(--wp--preset--font-size--x-large, 1.75rem);
	line-height: 1.15;
}

/* A capa. `margin:0` porque um `figure` traz margens do browser que aqui
   descentravam o cartaz dentro da secção. */
.eco-edicao__capa {
	max-width: 900px;
	margin: 0 auto;
}

.eco-edicao__imagem {
	display: block;
	width: 100%;
	height: auto;
	border: 1px solid color-mix(in srgb, var(--wp--preset--color--ink) 12%, transparent);
	box-shadow: 0 2px 18px rgb(0 0 0 / 8%);
}

.eco-edicao__data {
	margin-top: var(--wp--preset--spacing--30);
	color: color-mix(in srgb, var(--wp--preset--color--ink) 65%, transparent);
	font-size: var(--wp--preset--font-size--small, .875rem);
	text-align: center;
}

/* Dentro de uma edição a capa é o corpo da peça e já está numa coluna de
   894px: não precisa de trave própria nem de se centrar outra vez. */
.eco-edicao__capa--corpo {
	max-width: 100%;
	margin: 0;
}

.eco-edicao__outras {
	display: grid;
	grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));
	gap: var(--wp--preset--spacing--30);
	margin: 0;
	padding: 0;
	list-style: none;
}

.eco-edicao__outra a {
	display: flex;
	flex-direction: column;
	gap: 4px;
	height: 100%;
	padding: var(--wp--preset--spacing--30) var(--wp--preset--spacing--40);
	border-left: 3px solid var(--wp--preset--color--primary);
	background: var(--wp--preset--color--surface);
	color: var(--wp--preset--color--ink);
	text-decoration: none;
}

.eco-edicao__outra a:hover,
.eco-edicao__outra a:focus-visible { background: color-mix(in srgb, var(--wp--preset--color--primary) 14%, var(--wp--preset--color--surface)); }

.eco-edicao__outra-data {
	color: var(--wp--preset--color--primary-dark);
	font-family: var(--wp--preset--font-family--headline);
	font-size: var(--wp--preset--font-size--small, .875rem);
	text-transform: uppercase;
	letter-spacing: .04em;
}

.eco-edicao__outra-titulo {
	font-size: 1rem;
	line-height: 1.3;
}

.eco-edicao__vazio {
	margin: 0;
	padding: var(--wp--preset--spacing--50);
	background: var(--wp--preset--color--surface);
	text-align: center;
}

@media (max-width: 600px) {
	.eco-edicao__pesquisa { flex-direction: column; align-items: stretch; }
	.eco-edicao__submeter { width: 100%; }
}
