/* Reset básico */
*,
*::before,
*::after {
	box-sizing: border-box;
}

/* Alias local do marinho da paleta, só pra encurtar o uso em sombra. A cor
   de verdade mora no theme.json (slug "marinho"), porque também é cor de
   conteúdo — é ela que colore os links do menu. */
:root {
	--nv-marinho: var(--wp--preset--color--marinho);

	/* Escala de título de seção. Existe porque cada seção nova vinha
	   inventando o próprio clamp: a LP do PA27 chegou a ter seis títulos de
	   seção em seis tamanhos (28, 34, 35.2, 38.4, 43.2 e 44.8px), sem que
	   nenhuma diferença dessas significasse alguma coisa.
	   --nv-titulo-secao   título de seção de largura cheia
	   --nv-titulo-faixa   faixa compacta, que não deve competir com as seções */
	--nv-titulo-secao: clamp(1.9rem, 3.2vw, 2.6rem);
	--nv-titulo-faixa: 1.5rem;
}

/* Scroll suave e transições só pra quem não pediu movimento reduzido no SO
   (prefers-reduced-motion) — requisito de acessibilidade (WCAG 2.3.3). */
@media (prefers-reduced-motion: no-preference) {
	html {
		scroll-behavior: smooth;
	}
}

/* Compensa o header sticky ao rolar pra uma âncora do sumário do post */
.entry-content h2,
.entry-content h3 {
	scroll-margin-top: 96px;
}

/* Cor padrão de título é navy (#151544, definida no theme.json > elements.heading)
   e vale em fundo claro. Em qualquer contexto de fundo escuro — grupo com texto
   branco (textColor) ou seção com fundo escuro da paleta — o título volta a
   HERDAR a cor do ambiente (branca), pra não sair navy sobre escuro. Herança em
   vez de branco fixo cobre também o caso de um card claro dentro de uma seção
   escura (o título herda o texto do card, não o da seção). Título com cor
   própria (classe .has-*-color do editor) ganha via !important e não é afetado. */
.on-dark :is(h1, h2, h3, h4, h5, h6),
.has-white-color :is(h1, h2, h3, h4, h5, h6),
[class*="has-ink-background-color"] :is(h1, h2, h3, h4, h5, h6),
[class*="has-marinho-background-color"] :is(h1, h2, h3, h4, h5, h6),
[class*="has-secondary-background-color"] :is(h1, h2, h3, h4, h5, h6),
[class*="has-accent-background-color"] :is(h1, h2, h3, h4, h5, h6),
[class*="has-primary-background-color"] :is(h1, h2, h3, h4, h5, h6),
[class*="has-dark-background-color"] :is(h1, h2, h3, h4, h5, h6) {
	color: inherit;
}

img,
video {
	max-width: 100%;
	height: auto;
}

/* Header sticky — o position:sticky precisa ficar no wrapper <header
   class="wp-block-template-part"> gerado pelo próprio wp:template-part, não
   no .site-header interno. O sticky só "flutua" dentro da altura do seu pai
   direto; como esse wrapper tem exatamente a mesma altura do header (é um
   wrapper 1:1, sem folga), aplicar sticky no filho não tem espaço pra
   funcionar e o header simplesmente rola com a página. */
header.wp-block-template-part {
	position: sticky;
	top: 0;
	z-index: 100;
}

/* Branco puro, não o creme (--background) do resto do site: o header é uma
   superfície à parte, que se separa do conteúdo pela sombra. */
.site-header {
	position: relative;
	background: var(--wp--preset--color--white);
	box-shadow: 0 6px 14px rgba(40, 40, 91, 0.03);
}

/* <main> e <footer> são o 2º e o 3º filho direto de .wp-site-blocks (depois
   do header) e herdam o blockGap padrão do WordPress (margin-block-start)
   como uma faixa vazia revelando a cor de fundo do body entre as seções —
   zerar nos dois. */
.wp-site-blocks > main,
.wp-site-blocks > footer {
	margin-top: 0;
	margin-bottom: 0;
}

.site-header__inner {
	position: relative;
	flex-wrap: nowrap;
}

.site-header__logo,
.site-header__nav,
.site-header__cta {
	flex-shrink: 0;
}

/* Logo à esquerda; menu + busca + CTA empurrados pra direita. O margin-left:auto
   no nav (1º item do grupo da direita) absorve o espaço livre e empurra ele +
   busca + CTA pra borda direita, deixando a logo sozinha na esquerda. No compact
   o nav some e quem faz esse papel é o margin-left:auto da lupa.
   Escopado em `.site-header__inner >` (0,2,0) pra vencer o reset do layout flex
   do WP (`.is-layout-flex > * { margin: 0 }`, 0,1,0, que ganharia por ordem). */
.site-header__inner > .site-header__nav {
	margin-left: auto;
}

/* O CTA continua visível quando o menu vira hambúrguer — é a ação principal
   do site, não um item de menu. */
.site-header__cta {
	margin: 0;
}

/* Mobile: logo + hambúrguer na 1ª linha, CTA inteiro na 2ª.
   Medido em 390px: sobram 342px úteis, e logo (160) + CTA (209) + hambúrguer
   (44) somam 413. Não cabe nem com o botão no tamanho natural, então ele desce
   de linha em vez de ser espremido — espremido, o rótulo quebraria em duas
   linhas ou o botão viraria um toco. */
@media (max-width: 600px) {
	.site-header__inner {
		flex-wrap: wrap;
		row-gap: var(--wp--preset--spacing--1);
	}

	.site-header__logo {
		order: 1;
	}

	.site-header__toggle {
		order: 2;
	}

	.site-header__cta {
		order: 3;
		flex-basis: 100%;
	}

	.site-header__cta .wp-block-button,
	.site-header__cta .wp-block-button__link {
		width: 100%;
	}

	/* Rótulo à esquerda e disco na borda direita, em vez de tudo centralizado
	   num botão largo. Precisa repetir o .btn-cta do seletor base, senão a
	   regra base (mais específica) mantém o justify-content: center. */
	.site-header__cta .wp-block-button.btn-cta .wp-block-button__link {
		justify-content: space-between;
	}
}

/* Alvo de toque dos itens do menu (WCAG 2.5.8 exige 24x24 no mínimo; o padrão
   Navival é 40-44px). O bloco de Navegação herda só o font-size `sm` do
   theme.json e não tem padding próprio: sem isso os links saem com ~23px de
   altura e reprovam o critério por 1px — fácil de não notar, porque o link
   continua clicável no mouse.
   Os dois seletores são necessários: .wp-block-navigation-item__content é o
   item de um menu de verdade, .wp-block-pages-list__item__link é o fallback
   que o bloco renderiza quando nenhum menu foi atribuído ainda (caso do tema
   recém-instalado). */
.site-header .wp-block-navigation-item__content,
.site-header .wp-block-pages-list__item__link {
	display: flex;
	align-items: center;
	min-height: 44px;
	padding-top: 0.35rem;
	padding-bottom: 0.35rem;
}

/* Rótulos do menu do header: marinho, Figtree 800. Escopado no .site-header
   de propósito — o mesmo core/navigation renderiza o menu do RODAPÉ, que fica
   sobre fundo escuro; pintar de marinho no theme.json (global) deixaria os
   links do rodapé ilegíveis. */
.site-header .wp-block-navigation {
	color: var(--wp--preset--color--marinho);
	font-size: 1rem;
	font-weight: 700;
}

/* Respiro entre os links. O blockGap padrão (24px) do tema estourava o menu pro
   hambúrguer em 1200px de conteúdo; com contentSize 1440 e o peso reduzido pra
   700 (texto mais estreito) cabe folgado. Baixado de 18 pra 14px pra reabrir
   espaço depois que a lupa de busca entrou na barra. Conferir que não colapsa se
   mexer aqui. */
.site-header .wp-block-navigation__container {
	gap: 14px;
}

/* Seta do submenu em laranja, contra o rótulo marinho. O ícone do core é um
   <path stroke-width="1.5"> num <svg fill="none"> — ou seja, ele se pinta por
   `stroke`, não por `fill`. Um `fill: laranja` aqui não daria erro nenhum:
   simplesmente não mudaria nada, e a seta seguiria herdando o currentColor
   marinho do link.
   O width/height fixo também é obrigatório: o core declara `width: inherit;
   height: inherit` no svg, então ele adota o tamanho do botão-pai — e o botão
   abaixo tem 44px pra cumprir alvo de toque. Sem fixar aqui, a seta vira um
   chevron de 44px. */
.site-header .wp-block-navigation__submenu-icon svg {
	stroke: var(--wp--preset--color--laranja);
	stroke-width: 2;
	width: 14px;
	height: 14px;
	transition: transform 0.25s ease;
}

/* Seta rotaciona quando o item está em hover / aberto (dropdown ou mega menu). */
.site-header .wp-block-navigation-item:hover .wp-block-navigation__submenu-icon svg,
.site-header .wp-block-navigation-submenu__toggle[aria-expanded="true"] .wp-block-navigation__submenu-icon svg,
.site-header .nv-has-megamenu.is-active .wp-block-navigation__submenu-icon svg {
	transform: rotate(180deg);
}

/* O core dá 0.6em (~10px) ao botão da seta, abaixo do mínimo de 24x24 do
   WCAG 2.5.8 — e ele é um botão de verdade, que abre o submenu no clique.
   24px e não os 44px do resto do header: em 44 o botão afasta a seta do
   rótulo e desenha um vão que a referência não tem. 24 é o mínimo do
   critério, não um arredondamento — não descer daqui. */
.site-header .wp-block-navigation-submenu__toggle {
	display: flex;
	align-items: center;
	justify-content: center;
	width: 24px;
	height: 24px;
	margin-left: -0.15em;
	padding: 0;
}

/* Submenu aberto: o core força `color: #000` em quem não tem has-text-color,
   o que ignoraria o marinho e deixaria os filhos pretos. */
.site-header .wp-block-navigation__submenu-container {
	background-color: var(--wp--preset--color--white);
	border: 1px solid var(--wp--preset--color--borda);
	border-radius: 16px;
	padding: var(--wp--preset--spacing--1);
	box-shadow: var(--wp--preset--shadow--md);
}

.site-header .wp-block-navigation__submenu-container .wp-block-navigation-item__content {
	color: var(--wp--preset--color--marinho);
	border-radius: 10px;
	white-space: nowrap;
}

.site-header .wp-block-navigation__submenu-container .wp-block-navigation-item__content:hover {
	background-color: var(--wp--preset--color--surface);
	color: var(--wp--preset--color--laranja);
}

/* Sem sublinhado nos links do menu — o estilo global de link (theme.json) força
   text-decoration:underline no hover e na página atual. */
.site-header .wp-block-navigation a,
.site-header .wp-block-navigation a:hover,
.site-header .wp-block-navigation a:focus,
.site-header .wp-block-navigation a[aria-current] {
	text-decoration: none;
}

.site-header .wp-block-navigation__container > .wp-block-navigation-item > .wp-block-navigation-item__content:hover {
	color: var(--wp--preset--color--laranja);
}

/* ── Mega menu "Estude no Genoma" ─────────────────────────────────────────
   O bloco core/navigation não tem mega menu. O painel é renderizado pelo
   shortcode [nv_megamenu_cursos] como filho direto de .site-header e aberto
   pelo megamenu.js no hover/foco do item. No desktop o submenu nativo do item
   é escondido (o .nv-has-megamenu vem do JS); no mobile/compact o painel some
   e o submenu nativo (5 links) volta como fallback. */
.nv-megamenu {
	position: absolute;
	top: 100%;
	left: 0;
	right: 0;
	max-width: none !important;
	margin: 0 !important;
	padding: 0 var(--wp--preset--spacing--3);
	z-index: 90;
	opacity: 0;
	visibility: hidden;
	transform: translateY(-10px);
	transition: opacity 0.22s ease, transform 0.22s ease, visibility 0.22s;
	pointer-events: none;
}

.nv-megamenu.is-open {
	opacity: 1;
	visibility: visible;
	transform: translateY(0);
	pointer-events: auto;
}

.nv-megamenu__inner {
	max-width: 1440px;
	margin: 10px auto 0;
	display: grid;
	grid-template-columns: repeat(5, minmax(0, 1fr));
	background: var(--wp--preset--color--white);
	border: 1px solid var(--wp--preset--color--borda);
	border-radius: 28px;
	box-shadow: 0 26px 60px rgba(40, 40, 91, 0.16);
	padding: var(--wp--preset--spacing--4) var(--wp--preset--spacing--3);
}

.nv-megamenu__card {
	display: flex;
	flex-direction: column;
	padding: 0 var(--wp--preset--spacing--3);
	border-left: 1px solid var(--wp--preset--color--borda);
	text-decoration: none;
}

.nv-megamenu__card:first-child {
	border-left: 0;
}

.nv-megamenu__img img {
	display: block;
	width: 100%;
	aspect-ratio: 4 / 3;
	object-fit: cover;
	border-radius: 18px;
	transition: transform 0.25s ease;
}

.nv-megamenu__card:hover .nv-megamenu__img img {
	transform: translateY(-3px);
}

.nv-megamenu__nome {
	margin-top: 0.9rem;
	font-family: var(--wp--preset--font-family--heading);
	font-weight: 800;
	font-size: 1.05rem;
	line-height: 1.2;
	color: var(--wp--preset--color--marinho);
	transition: color 0.2s ease;
}

.nv-megamenu__card:hover .nv-megamenu__nome {
	color: var(--wp--preset--color--accent);
}

.nv-megamenu__faixa {
	margin-top: 0.2rem;
	font-family: var(--wp--preset--font-family--heading);
	font-weight: 700;
	font-size: 0.9rem;
	line-height: 1.3;
	color: var(--wp--preset--color--laranja);
}

/* Desktop com o menu completo: esconde o submenu nativo do "Estude no Genoma"
   e deixa só o mega menu. */
.site-header:not(.is-compact) .nv-has-megamenu > .wp-block-navigation__submenu-container {
	display: none !important;
}

/* Compact (hambúrguer por overflow ou mobile): sem mega menu, o submenu nativo
   volta a ser o caminho. */
.site-header.is-compact .nv-megamenu {
	display: none;
}

@media (max-width: 600px) {
	.nv-megamenu {
		display: none;
	}
}

/* ── Busca no header ──────────────────────────────────────────────────────
   A lupa fica ao lado do CTA; o clique abre um painel absoluto logo abaixo,
   no mesmo padrão do mega menu (top:100% + .is-open). O campo é um core/search
   focado pelo header-nav.js. */
.site-header__search-toggle {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	flex-shrink: 0;
	width: 44px;
	height: 44px;
	padding: 0;
	background: none;
	border: 0;
	color: var(--wp--preset--color--marinho);
	cursor: pointer;
	transition: color 0.2s ease;
}
.site-header__search-toggle:hover,
.site-header__search-toggle[aria-expanded="true"] {
	color: var(--wp--preset--color--laranja);
}
.site-header__search-toggle svg {
	width: 22px;
	height: 22px;
}

/* Em compact (nav vira hambúrguer) e no mobile, a lupa se agrupa à direita
   junto do hambúrguer/CTA em vez de flutuar no meio da barra. */
.site-header.is-compact .site-header__search-toggle {
	margin-left: auto;
}
@media (max-width: 600px) {
	.site-header__search-toggle {
		order: 2;
	}
}

.site-header__search {
	position: absolute;
	top: 100%;
	left: 0;
	right: 0;
	z-index: 95;
	/* O grupo é filho do header (layout constrained) e herdaria o blockGap de
	   24px como margin-top — que, somado ao top:100%, abriria um vão entre a
	   barra e o painel. Zerar cola o painel no header (mesmo motivo do mega menu). */
	margin: 0 !important;
	background: var(--wp--preset--color--white);
	border-radius: 0 0 24px 24px;
	box-shadow: 0 22px 40px rgba(40, 40, 91, 0.12);
	opacity: 0;
	visibility: hidden;
	transform: translateY(-10px);
	transition: opacity 0.22s ease, transform 0.22s ease, visibility 0.22s;
	pointer-events: none;
}
.site-header__search.is-open {
	opacity: 1;
	visibility: visible;
	transform: translateY(0);
	pointer-events: auto;
}

/* Campo core/search em pílula com botão laranja (mesmo estilo da página de busca).
   Largura limitada e centralizado no painel. */
.site-header__search .wp-block-search {
	max-width: 720px;
	margin: 0 auto;
}
.site-header__search .wp-block-search__inside-wrapper {
	border: 1.5px solid var(--wp--preset--color--borda);
	border-radius: 999px;
	padding: 4px 4px 4px 20px;
	background: var(--wp--preset--color--white);
	transition: border-color 0.2s ease;
}
.site-header__search .wp-block-search__inside-wrapper:focus-within {
	border-color: var(--wp--preset--color--laranja);
}
.site-header__search .wp-block-search__input {
	flex-grow: 1;
	border: none;
	background: transparent;
	padding: 0;
	min-height: 46px;
	font-family: var(--wp--preset--font-family--body);
	font-size: var(--wp--preset--font-size--base);
	color: var(--wp--preset--color--ink);
}
.site-header__search .wp-block-search__input:focus {
	outline: none;
}
.site-header__search .wp-block-search__button {
	flex-shrink: 0;
	margin: 0;
	border: none;
	border-radius: 999px;
	padding: 0 1.6em;
	min-height: 46px;
	background: var(--wp--preset--color--laranja);
	color: var(--wp--preset--color--white);
	font-family: var(--wp--preset--font-family--heading);
	font-weight: 700;
	cursor: pointer;
	transition: background-color 0.2s ease;
}
.site-header__search .wp-block-search__button:hover {
	background: var(--wp--preset--color--primary);
}

/* Botão hambúrguer — escondido por padrão, só aparece quando o JS detecta
   que o menu não cabe mais numa linha (ou em telas mobile). Sem JS, o menu
   flat continua visível e funcional (progressive enhancement). */
/* flex-shrink: 0 é obrigatório: sem ele, quando o header estoura a largura
   (header com CTA no mobile), o flex espreme o botão até 0px de largura e o
   menu fica inalcançável — o botão continua "display: flex" e visível no
   DevTools, mas com largura zero. 44px pra cumprir o alvo de toque. */
.site-header__toggle {
	display: none;
	flex-direction: column;
	justify-content: center;
	align-items: center;
	flex-shrink: 0;
	gap: 5px;
	width: 44px;
	height: 44px;
	padding: 0;
	background: none;
	border: 0;
	cursor: pointer;
}

.site-header__toggle span {
	display: block;
	width: 24px;
	height: 2px;
	background: currentColor;
}

.site-header.is-compact .site-header__nav {
	display: none;
}

.site-header.is-compact .site-header__toggle {
	display: flex;
}

.site-header.is-compact.is-open .site-header__nav {
	display: flex;
	position: absolute;
	top: 100%;
	left: 0;
	right: 0;
	flex-direction: column;
	align-items: flex-start;
	gap: var(--wp--preset--spacing--1);
	background: var(--wp--preset--color--background);
	padding: var(--wp--preset--spacing--2) var(--wp--preset--spacing--3);
	box-shadow: 0 8px 24px rgba(0, 0, 0, 0.08);
}

.site-header.is-compact.is-open .site-header__nav .wp-block-navigation__container {
	flex-direction: column;
	align-items: flex-start;
	width: 100%;
}

/* O submenu nativo do core vem com position:absolute (flyout de desktop) por
   padrão — no hambúrguer isso faz o painel flutuar por cima do conteúdo (e
   até vazar pra fora da tela pela esquerda, o left é calculado pro contexto
   de desktop). Aqui ele volta a ser parte do fluxo normal, empurrando os
   itens seguintes do menu pra baixo em vez de sobrepor a página.
   O item pai (rótulo + seta + submenu) é display:flex;flex-direction:row no
   core. Só colocar o submenu em fluxo normal faria ele virar um 3º item NA
   MESMA linha (ao lado do rótulo) — mas empilhar o <li> INTEIRO em coluna
   (flex-direction:column) também separa a seta do rótulo em linhas
   diferentes, o que não é o layout desejado. O certo é manter [rótulo][seta]
   lado a lado (flex-wrap:wrap) e só forçar o submenu pra própria linha via
   flex-basis:100% — truque padrão de flexbox pra "quebrar linha" antes de
   um item específico sem mudar a direção dos outros. */
.site-header.is-compact.is-open .wp-block-navigation-item.has-child {
	flex-wrap: wrap;
}
.site-header.is-compact.is-open .wp-block-navigation__submenu-container {
	position: static;
	top: auto;
	left: auto;
	right: auto;
	flex-basis: 100%;
	width: 100%;
	min-width: 0;
	/* O core faz height:0 no estado fechado (aria-expanded=false) — mas como
	   o submenu agora é filho de um flex container, o default min-height:auto
	   do flexbox ignora esse height:0 e mantém o conteúdo no tamanho mínimo
	   intrínseco. min-height:0 devolve o controle pro height:0/height:auto do
	   core. Ainda não basta: o padding/borda do card (herdados da regra base,
	   pensada pro dropdown de desktop) continuam ocupando espaço mesmo com
	   height:0, porque padding/border não encolhem junto — por isso ficam
	   zerados aqui e só voltam no seletor [aria-expanded="true"] abaixo,
	   quando o submenu está de fato aberto. */
	min-height: 0;
	padding: 0;
	border: 0;
	margin-top: 0;
	box-shadow: none;
}
.site-header.is-compact.is-open .wp-block-navigation-submenu__toggle[aria-expanded="true"] ~ .wp-block-navigation__submenu-container {
	padding: var(--wp--preset--spacing--1);
	border: 1px solid var(--wp--preset--color--borda);
	border-radius: 16px;
	margin-top: var(--wp--preset--spacing--1);
}
.site-header.is-compact.is-open .wp-block-navigation__submenu-container .wp-block-navigation-item__content {
	white-space: normal;
}

/* Fallback via media query pro breakpoint mobile "óbvio" (mesma largura que
   o JS usa) — sem isso, o menu completo aparece por uma fração de segundo
   antes do JS rodar (o script fica no footer, só executa depois do parse do
   HTML), causando flash visual e um possível salto de layout. O JS continua
   necessário pro caso de overflow em telas largas (menu grande demais mesmo
   acima de 600px), que este fallback sozinho não cobre. */
@media (max-width: 600px) {
	.site-header__nav {
		display: none;
	}

	.site-header__toggle {
		display: flex;
	}

	.site-header.is-open .site-header__nav {
		display: flex;
		position: absolute;
		top: 100%;
		left: 0;
		right: 0;
		flex-direction: column;
		align-items: flex-start;
		gap: var(--wp--preset--spacing--1);
		background: var(--wp--preset--color--background);
		padding: var(--wp--preset--spacing--2) var(--wp--preset--spacing--3);
		box-shadow: 0 8px 24px rgba(0, 0, 0, 0.08);
	}

	.site-header.is-open .site-header__nav .wp-block-navigation__container {
		flex-direction: column;
		align-items: flex-start;
		width: 100%;
	}

	.site-header.is-open .wp-block-navigation-item.has-child {
		flex-wrap: wrap;
	}
	.site-header.is-open .wp-block-navigation__submenu-container {
		position: static;
		top: auto;
		left: auto;
		right: auto;
		flex-basis: 100%;
		width: 100%;
		min-width: 0;
		min-height: 0;
		padding: 0;
		border: 0;
		margin-top: 0;
		box-shadow: none;
	}
	.site-header.is-open .wp-block-navigation-submenu__toggle[aria-expanded="true"] ~ .wp-block-navigation__submenu-container {
		padding: var(--wp--preset--spacing--1);
		border: 1px solid var(--wp--preset--color--borda);
		border-radius: 16px;
		margin-top: var(--wp--preset--spacing--1);
	}
	.site-header.is-open .wp-block-navigation__submenu-container .wp-block-navigation-item__content {
		white-space: normal;
	}
}

/* CTA global — usar sempre estas classes, nunca criar botão por seção.
   Contexto padrão: fundo CLARO (--background / --surface), que é o padrão do
   site Genoma. "primary" e "secondary" são preenchidos com cores AAA, então
   funcionam sobre qualquer fundo; só o "ghost" depende do contraste com o
   fundo — em seção de fundo escuro (roxo/laranja), envolver com .on-dark.
   Estiliza só o elemento que é a superfície real do botão: o <button>/<a> cru
   ou o .wp-block-button__link dentro de um wp:button — o
   <div class="wp-block-button"> é apenas wrapper de layout, sem padding nem
   borda própria (evita o efeito "caixa dentro de caixa"). */
button.btn-primary,
button.btn-secondary,
button.btn-ghost,
button.btn-cta,
.wp-block-button.btn-primary .wp-block-button__link,
.wp-block-button.btn-secondary .wp-block-button__link,
.wp-block-button.btn-ghost .wp-block-button__link,
.wp-block-button.btn-cta .wp-block-button__link {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	gap: 0.6em;
	/* min-height garante o alvo de toque de 44px mesmo no .btn-sm, que pelo
	   padding sozinho ficaria em ~35px. */
	min-height: 44px;
	padding: 0.95rem 2rem;
	border-radius: 999px;
	border: 2px solid transparent;
	font-family: var(--wp--preset--font-family--heading);
	font-weight: 700;
	font-size: 0.95rem;
	letter-spacing: 0.02em;
	text-decoration: none;
	cursor: pointer;
	box-shadow: var(--wp--preset--shadow--sm);
	transition: background-color 0.22s ease, color 0.22s ease, border-color 0.22s ease, transform 0.22s ease, box-shadow 0.22s ease;
}

/* Tamanhos */
.wp-block-button.btn-sm .wp-block-button__link,
button.btn-sm {
	padding: 0.6rem 1.3rem;
	font-size: 0.82rem;
}

.wp-block-button.btn-lg .wp-block-button__link,
button.btn-lg {
	padding: 1.15rem 2.5rem;
	font-size: 1.05rem;
}

.wp-block-button.btn-block,
.wp-block-button.btn-block .wp-block-button__link,
button.btn-block {
	width: 100%;
}

button.btn-primary,
.wp-block-button.btn-primary .wp-block-button__link {
	background-color: var(--wp--preset--color--primary);
	color: var(--wp--preset--color--background);
	border-color: var(--wp--preset--color--primary);
}

/* Secundária: link puro (sem borda, sem fundo, sem padding) — texto marinho
   + disco laranja com seta branca à direita. */
button.btn-secondary,
.wp-block-button.btn-secondary .wp-block-button__link {
	background-color: transparent;
	color: #151544;
	border: none;
	box-shadow: none;
	padding: 0.4rem 0;
	min-height: 0;
}
button.btn-secondary::after,
.wp-block-button.btn-secondary .wp-block-button__link::after {
	content: "";
	flex: 0 0 auto;
	width: 26px;
	height: 26px;
	border-radius: 50%;
	background-color: var(--wp--preset--color--laranja);
	background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23ffffff' stroke-width='3' stroke-linecap='round' stroke-linejoin='round'%3E%3Cline x1='4' y1='12' x2='19' y2='12'/%3E%3Cpolyline points='12 5 19 12 12 19'/%3E%3C/svg%3E");
	background-repeat: no-repeat;
	background-position: center;
	background-size: 13px 13px;
	transition: transform 0.2s ease;
}
button.btn-secondary:hover::after,
.wp-block-button.btn-secondary .wp-block-button__link:hover::after {
	transform: translateX(3px);
}

button.btn-ghost,
.wp-block-button.btn-ghost .wp-block-button__link {
	background-color: transparent;
	color: var(--wp--preset--color--secondary);
	border-color: var(--wp--preset--color--secondary);
	box-shadow: none;
}

/* Hover: o fundo do botão preenchido não muda de cor (design system Genoma),
   o feedback é a elevação + o glow da própria cor da marca. */
button.btn-primary:hover,
.wp-block-button.btn-primary .wp-block-button__link:hover {
	box-shadow: 0 8px 30px rgba(241, 86, 34, 0.35);
}

/* Outline não ganha glow preenchido — só a elevação (regra compartilhada abaixo). */
button.btn-secondary:hover,
.wp-block-button.btn-secondary .wp-block-button__link:hover {
	box-shadow: none;
}

button.btn-ghost:hover,
.wp-block-button.btn-ghost .wp-block-button__link:hover {
	background-color: var(--wp--preset--color--secondary);
	color: var(--wp--preset--color--background);
	box-shadow: 0 8px 30px rgba(111, 38, 129, 0.3);
}

/* A elevação é decorativa: quem pediu menos movimento recebe só a cor/sombra. */
@media (prefers-reduced-motion: no-preference) {
	button.btn-primary:hover,
	button.btn-secondary:hover,
	button.btn-ghost:hover,
	.wp-block-button.btn-primary .wp-block-button__link:hover,
	.wp-block-button.btn-secondary .wp-block-button__link:hover,
	.wp-block-button.btn-ghost .wp-block-button__link:hover {
		transform: translateY(-3px);
	}
}

button.btn-primary:active,
button.btn-secondary:active,
button.btn-ghost:active,
.wp-block-button.btn-primary .wp-block-button__link:active,
.wp-block-button.btn-secondary .wp-block-button__link:active,
.wp-block-button.btn-ghost .wp-block-button__link:active {
	transform: scale(0.96);
}

/* Fundo escuro: só o ghost precisa inverter — os preenchidos já têm contraste. */
.on-dark button.btn-ghost,
.on-dark .wp-block-button.btn-ghost .wp-block-button__link {
	color: var(--wp--preset--color--background);
	border-color: var(--wp--preset--color--background);
}

.on-dark button.btn-ghost:hover,
.on-dark .wp-block-button.btn-ghost .wp-block-button__link:hover {
	background-color: var(--wp--preset--color--background);
	color: var(--wp--preset--color--secondary);
}

/* CTA de matrícula — laranja vibrante da marca, sombra dura marinho e seta
   num disco branco. É a ação principal do site (header e onde mais for
   preciso), por isso vive aqui como variante global e não como classe de
   seção.
   O disco é um único ::after: o círculo é o background-color, a seta é o
   background-image por cima. Evita SVG solto dentro do wp:button, que não
   sobrevive a re-salvamento do editor. */
/* CONTRASTE ABAIXO DO AA, POR DECISÃO DE PROJETO — não é descuido.
   Branco sobre o laranja vibrante da marca dá 3.45:1, contra os 4.5:1 que o
   WCAG exige pra texto normal. O cliente optou (jul/2026) por manter a cor da
   marca e o botão na proporção do design, assumindo o apontamento de contraste
   no Lighthouse.
   Já tentamos o caminho de subir a fonte pra 19.2px: acima de 18.66px em peso
   700+ o texto vira "grande" pro WCAG e a exigência cai pra 3:1, o que fazia
   passar. Foi revertido porque inchava o botão (255px contra os ~154px do
   design) e ele destoava de tudo na tela.
   Ou seja: se um dia for pra fechar esse gap, o caminho é ESCURECER o laranja
   (#D8400E dá 4.51:1 na mesma matiz), não mexer no tamanho da fonte. */
button.btn-cta,
.wp-block-button.btn-cta .wp-block-button__link {
	background-color: var(--wp--preset--color--laranja);
	color: var(--wp--preset--color--white);
	border-color: var(--wp--preset--color--laranja);
	font-weight: 800;
	line-height: 1.2;
	gap: 0.5rem;
	padding: 0.5rem 0.5rem 0.5rem 1.5rem;
	box-shadow: 0 5px 0 var(--nv-marinho);
}

button.btn-cta::after,
.wp-block-button.btn-cta .wp-block-button__link::after {
	content: "";
	flex: 0 0 auto;
	width: 26px;
	height: 26px;
	border-radius: 50%;
	background-color: var(--wp--preset--color--white);
	background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%2328285B' stroke-width='3' stroke-linecap='round' stroke-linejoin='round'%3E%3Cline x1='4' y1='12' x2='19' y2='12'/%3E%3Cpolyline points='12 5 19 12 12 19'/%3E%3C/svg%3E");
	background-repeat: no-repeat;
	background-position: center;
	background-size: 13px 13px;
}

/* A sombra dura não pode "crescer" no hover como a dos outros botões: ela é
   uma peça sólida, então o feedback é o botão afundar sobre ela. */
button.btn-cta:hover,
.wp-block-button.btn-cta .wp-block-button__link:hover {
	box-shadow: 0 3px 0 var(--nv-marinho);
}

button.btn-cta:active,
.wp-block-button.btn-cta .wp-block-button__link:active {
	transform: none;
	box-shadow: 0 0 0 var(--nv-marinho);
}

@media (prefers-reduced-motion: no-preference) {
	button.btn-cta:hover,
	.wp-block-button.btn-cta .wp-block-button__link:hover {
		transform: translateY(2px);
	}
}

/* ==========================================================================
   BOTÕES DENTRO DO CONTEÚDO DO POST
   Todo wp:button que o cliente insere no corpo do artigo herda o visual do
   CTA da marca (pílula laranja + sombra dura marinho + disco branco à
   direita). O ícone do disco é CONTEXTUAL e automático: muda conforme o
   destino do link (externo, PDF, download, telefone, e-mail, WhatsApp),
   sem o cliente precisar marcar nada — só colar o link.

   Técnica: o ícone vive numa custom property (--nv-btn-ico) setada no link;
   o ::after (disco) só a consome. Cada contexto reescreve a variável.
   :where(:not(...)) zera a especificidade extra, então a ORDEM aqui é que
   decide o vencedor quando um link casa em mais de um contexto (ex.: um PDF
   hospedado fora casa em "externo" e em "pdf" — como pdf vem depois, ganha).
   ========================================================================== */
.wp-block-post-content .wp-block-button__link {
	/* Ícone padrão (links internos): seta pra frente. */
	--nv-btn-ico: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%2328285B' stroke-width='3' stroke-linecap='round' stroke-linejoin='round'%3E%3Cline x1='4' y1='12' x2='19' y2='12'/%3E%3Cpolyline points='12 5 19 12 12 19'/%3E%3C/svg%3E");
	display: inline-flex;
	align-items: center;
	justify-content: center;
	gap: 0.5rem;
	max-width: 100%;
	min-height: 44px;
	padding: 0.5rem 0.5rem 0.5rem 1.5rem;
	border-radius: 999px;
	border: 2px solid var(--wp--preset--color--laranja);
	background-color: var(--wp--preset--color--laranja);
	color: var(--wp--preset--color--white);
	font-family: var(--wp--preset--font-family--heading);
	font-weight: 800;
	/* Tamanho fixo do componente (0.875rem = 14px). !important porque um botão
	   salvo no editor pode trazer o preset .has-medium-font-size, que o WordPress
	   gera com !important e senão sobrescreveria este valor. */
	font-size: 0.875rem !important;
	line-height: 1.2;
	letter-spacing: 0.02em;
	text-decoration: none;
	box-shadow: 0 5px 0 var(--nv-marinho);
	transition: transform 0.22s ease, box-shadow 0.22s ease;
}

.wp-block-post-content .wp-block-button__link::after {
	content: "";
	flex: 0 0 auto;
	width: 26px;
	height: 26px;
	border-radius: 50%;
	background-color: var(--wp--preset--color--white);
	background-image: var(--nv-btn-ico);
	background-repeat: no-repeat;
	background-position: center;
	background-size: 14px 14px;
}

/* A sombra dura é uma peça sólida: no hover o botão afunda sobre ela. */
.wp-block-post-content .wp-block-button__link:hover {
	box-shadow: 0 3px 0 var(--nv-marinho);
}
.wp-block-post-content .wp-block-button__link:active {
	transform: none;
	box-shadow: 0 0 0 var(--nv-marinho);
}
@media (prefers-reduced-motion: no-preference) {
	.wp-block-post-content .wp-block-button__link:hover {
		transform: translateY(2px);
	}
}

/* --- Contextos (ordem = prioridade; o último que casar vence) --- */

/* Link externo (http/https de outro domínio): seta diagonal pra cima. */
.wp-block-post-content .wp-block-button__link[href^="http" i]:where(:not([href*="colegiogenoma" i])) {
	--nv-btn-ico: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%2328285B' stroke-width='3' stroke-linecap='round' stroke-linejoin='round'%3E%3Cline x1='7' y1='17' x2='17' y2='7'/%3E%3Cpolyline points='7 7 17 7 17 17'/%3E%3C/svg%3E");
}

/* Arquivos para download em geral (planilha, doc, zip…): ícone de download. */
.wp-block-post-content .wp-block-button__link[href$=".zip" i],
.wp-block-post-content .wp-block-button__link[href$=".rar" i],
.wp-block-post-content .wp-block-button__link[href$=".doc" i],
.wp-block-post-content .wp-block-button__link[href$=".docx" i],
.wp-block-post-content .wp-block-button__link[href$=".xls" i],
.wp-block-post-content .wp-block-button__link[href$=".xlsx" i],
.wp-block-post-content .wp-block-button__link[href$=".ppt" i],
.wp-block-post-content .wp-block-button__link[href$=".pptx" i],
.wp-block-post-content .wp-block-button__link[href$=".csv" i] {
	--nv-btn-ico: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%2328285B' stroke-width='2.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4'/%3E%3Cpolyline points='7 10 12 15 17 10'/%3E%3Cline x1='12' y1='15' x2='12' y2='3'/%3E%3C/svg%3E");
}

/* PDF: ícone de documento (vence "download" pra um .pdf externo). */
.wp-block-post-content .wp-block-button__link[href$=".pdf" i] {
	--nv-btn-ico: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%2328285B' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z'/%3E%3Cpolyline points='14 2 14 8 20 8'/%3E%3Cline x1='16' y1='13' x2='9' y2='13'/%3E%3Cline x1='16' y1='17' x2='9' y2='17'/%3E%3C/svg%3E");
}

/* Telefone: ícone de fone. */
.wp-block-post-content .wp-block-button__link[href^="tel:" i] {
	--nv-btn-ico: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='%2328285B'%3E%3Cpath d='M6.6 10.8c1.4 2.8 3.8 5.1 6.6 6.6l2.2-2.2c.3-.3.7-.4 1-.2 1.1.4 2.3.6 3.6.6.6 0 1 .4 1 1V20c0 .6-.4 1-1 1C10.8 21 3 13.2 3 3.5c0-.6.4-1 1-1h3.5c.6 0 1 .4 1 1 0 1.2.2 2.4.6 3.6.1.4 0 .8-.2 1l-2.3 2.2z'/%3E%3C/svg%3E");
}

/* E-mail: ícone de envelope. */
.wp-block-post-content .wp-block-button__link[href^="mailto:" i] {
	--nv-btn-ico: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%2328285B' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='3' y='5' width='18' height='14' rx='2'/%3E%3Cpolyline points='3 7 12 13 21 7'/%3E%3C/svg%3E");
}

/* WhatsApp: logo do WhatsApp (vence "externo" pro wa.me). */
.wp-block-post-content .wp-block-button__link[href*="wa.me" i],
.wp-block-post-content .wp-block-button__link[href*="whatsapp" i] {
	--nv-btn-ico: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='%2328285B'%3E%3Cpath d='M12 2a10 10 0 0 0-8.6 15.1L2 22l5.1-1.3A10 10 0 1 0 12 2Zm0 18.2a8.1 8.1 0 0 1-4.2-1.2l-.3-.2-3 .8.8-2.9-.2-.3A8.2 8.2 0 1 1 12 20.2Zm4.5-6.1c-.2-.1-1.5-.7-1.7-.8-.2-.1-.4-.1-.6.1-.2.2-.7.8-.8.9-.1.2-.3.2-.5.1-.2-.1-1-.4-2-1.2-.7-.6-1.2-1.4-1.4-1.6-.1-.2 0-.4.1-.5l.4-.4c.1-.1.2-.3.2-.4.1-.2 0-.3 0-.4L9.3 8c-.2-.4-.4-.4-.5-.4h-.5c-.2 0-.4.1-.6.3-.2.2-.8.8-.8 1.9s.8 2.2.9 2.4c.1.2 1.6 2.5 3.9 3.4.5.2 1 .4 1.3.5.5.2 1 .1 1.4.1.4-.1 1.3-.5 1.5-1.1.2-.5.2-.9.1-1Z'/%3E%3C/svg%3E");
}

/* ==========================================================================
   BUSCA — header no padrão do archive (nv-unidades-hero) + toolbar + lista.
   ========================================================================== */

/* Subtítulo do hero (fundo claro): total de resultados. */
.nv-busca-hero__titulo {
	margin: 0 0 var(--wp--preset--spacing--1);
}
.nv-busca-total {
	margin: 0;
	color: var(--wp--preset--color--text-muted);
	font-size: var(--wp--preset--font-size--lg);
}

/* Toolbar: filtro por tipo (esquerda) + busca (direita), na mesma linha. */
.nv-busca-toolbar {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	justify-content: space-between;
	gap: var(--wp--preset--spacing--3);
	margin-bottom: var(--wp--preset--spacing--4);
	padding-bottom: var(--wp--preset--spacing--3);
	border-bottom: 1px solid var(--wp--preset--color--borda);
}
.nv-busca-toolbar--sem-filtro {
	justify-content: flex-end;
}

/* Filtro em chips arredondados (sem uppercase). */
.nv-busca-filtro {
	display: flex;
	flex-wrap: wrap;
	gap: var(--wp--preset--spacing--1);
}
.nv-busca-filtro__item {
	display: inline-flex;
	align-items: center;
	min-height: 40px;
	padding: 0.4em 1.1em;
	border: 1.5px solid var(--wp--preset--color--borda);
	border-radius: 999px;
	background: var(--wp--preset--color--white);
	font-family: var(--wp--preset--font-family--heading);
	font-size: var(--wp--preset--font-size--sm);
	font-weight: 600;
	color: var(--wp--preset--color--text-muted);
	cursor: pointer;
	transition: color 0.2s ease, border-color 0.2s ease, background-color 0.2s ease;
}
.nv-busca-filtro__item:hover {
	color: #151544;
	border-color: var(--wp--preset--color--laranja);
}
.nv-busca-filtro__item.is-ativo {
	background: var(--wp--preset--color--laranja);
	border-color: var(--wp--preset--color--laranja);
	color: var(--wp--preset--color--white);
}

/* Campo de busca em pílula com botão laranja (sem uppercase).
   get_search_form() sem tema customizado gera o markup clássico
   (.search-form/.search-field/.search-submit). */
.nv-busca-form .search-form {
	display: inline-flex;
	align-items: center;
	gap: 6px;
	min-height: 48px;
	padding: 4px 4px 4px 18px;
	border: 1.5px solid var(--wp--preset--color--borda);
	border-radius: 999px;
	background: var(--wp--preset--color--white);
	transition: border-color 0.2s ease;
}
.nv-busca-form .search-form:focus-within {
	border-color: var(--wp--preset--color--laranja);
}
.nv-busca-form label {
	display: flex;
	flex: 1 1 auto;
	margin: 0;
}
.nv-busca-form .search-field {
	width: 100%;
	min-width: 180px;
	border: none;
	background: transparent;
	padding: 0;
	font-family: var(--wp--preset--font-family--body);
	font-size: var(--wp--preset--font-size--base);
	color: var(--wp--preset--color--ink);
}
.nv-busca-form .search-field:focus {
	outline: none;
}
.nv-busca-form .search-submit {
	flex: 0 0 auto;
	min-height: 40px;
	padding: 0 1.4em;
	border: none;
	border-radius: 999px;
	background: var(--wp--preset--color--laranja);
	color: var(--wp--preset--color--white);
	font-family: var(--wp--preset--font-family--heading);
	font-size: var(--wp--preset--font-size--sm);
	font-weight: 700;
	cursor: pointer;
	transition: background-color 0.2s ease;
}
.nv-busca-form .search-submit:hover {
	background: var(--wp--preset--color--primary);
}

/* Lista de resultados: grid de 3 cards por linha (chip + título + rodapé). */
.nv-busca-lista {
	display: grid;
	grid-template-columns: repeat(3, 1fr);
	gap: var(--wp--preset--spacing--3);
}
.nv-busca-card {
	position: relative;
	display: flex;
	flex-direction: column;
	align-items: flex-start;
	gap: var(--wp--preset--spacing--2);
	background: var(--wp--preset--color--white);
	border: 1px solid var(--wp--preset--color--borda);
	border-radius: 16px;
	padding: var(--wp--preset--spacing--3) var(--wp--preset--spacing--4);
	transition: transform 0.2s ease, box-shadow 0.2s ease, border-color 0.2s ease;
}
.nv-busca-card:hover {
	box-shadow: 0 10px 24px rgba(26, 26, 26, 0.08);
	border-color: transparent;
}
@media (prefers-reduced-motion: no-preference) {
	.nv-busca-card:hover {
		transform: translateY(-3px);
	}
}
.nv-busca-card__tipo {
	margin: 0;
	padding: 0.35em 0.9em;
	border-radius: 999px;
	background: var(--wp--preset--color--surface);
	color: var(--wp--preset--color--primary);
	font-family: var(--wp--preset--font-family--heading);
	font-size: var(--wp--preset--font-size--xs);
	font-weight: 700;
	white-space: nowrap;
}
.nv-busca-lista .nv-busca-card__titulo {
	margin: 0;
	font-size: var(--wp--preset--font-size--lg);
	line-height: 1.3;
	display: -webkit-box;
	-webkit-line-clamp: 3;
	-webkit-box-orient: vertical;
	overflow: hidden;
}
.nv-busca-card__titulo a {
	color: #151544;
	text-decoration: none;
}
/* Link esticado: o card inteiro fica clicável. */
.nv-busca-card__titulo a::after {
	content: "";
	position: absolute;
	inset: 0;
}
.nv-busca-card:hover .nv-busca-card__titulo a {
	color: var(--wp--preset--color--laranja);
}
.nv-busca-card__rodape {
	margin-top: auto;
	width: 100%;
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: var(--wp--preset--spacing--2);
	padding-top: var(--wp--preset--spacing--2);
}
.nv-busca-card__data {
	margin: 0;
	font-size: var(--wp--preset--font-size--sm);
	color: var(--wp--preset--color--text-muted);
}
.nv-busca-card__seta {
	flex: 0 0 auto;
	display: inline-flex;
	color: var(--wp--preset--color--laranja);
	transition: transform 0.2s ease;
}
.nv-busca-card__seta svg {
	width: 20px;
	height: 20px;
}
.nv-busca-card:hover .nv-busca-card__seta {
	transform: translateX(3px);
}

.nv-busca-resultados .is-oculto {
	display: none !important;
}

/* Estado vazio */
.nv-busca-vazio {
	color: var(--wp--preset--color--text-muted);
}

@media (max-width: 900px) {
	.nv-busca-lista {
		grid-template-columns: repeat(2, 1fr);
	}
}

@media (max-width: 600px) {
	.nv-busca-lista {
		grid-template-columns: 1fr;
	}
	.nv-busca-toolbar {
		flex-direction: column;
		align-items: stretch;
	}
	.nv-busca-form .search-form {
		width: 100%;
	}
}

/* Banner escuro com o H1 (página interna e archive do blog) */
.page-header {
	text-align: center;
}

/* Grid de posts do blog (archive) — gap uniforme linha/coluna. */
.blog-grid {
	gap: var(--wp--preset--spacing--4) !important;
}

.post-card {
	display: flex;
	flex-direction: column;
	border: 1px solid var(--wp--preset--color--surface);
	border-radius: 12px;
	overflow: hidden;
	background: var(--wp--preset--color--background);
	box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06);
}

.post-card .wp-block-post-featured-image img {
	width: 100%;
	object-fit: cover;
}

.post-card__body {
	display: flex;
	flex-direction: column;
	gap: var(--wp--preset--spacing--1);
	padding: var(--wp--preset--spacing--2);
}

/* O blockGap padrão do WordPress (margin-block-start) soma com o gap do flex
   acima, dobrando o espaço entre título/resumo/data — zerar e deixar só o
   gap controlando a distância. */
.post-card__body > * {
	margin-block-start: 0;
	margin-block-end: 0;
}

.post-card .wp-block-post-excerpt {
	color: var(--wp--preset--color--text-muted);
}

.post-card .wp-block-post-date {
	font-size: var(--wp--preset--font-size--sm);
	color: var(--wp--preset--color--text-muted);
}

/* ── Archive de blog (index): card retrato + caixa branca do título sobreposta
   + selo de categoria (pílula na imagem). Loop nativo wp:query. ── */
.nv-post-card {
	position: relative;
	/* aspecto fixo: todos os cards com a mesma altura, mesmo sem imagem
	   destacada (aí aparece o fundo de fallback). */
	aspect-ratio: 1 / 1;
	border-radius: 30px;
	background: linear-gradient(150deg, var(--wp--preset--color--surface), #f3e8dc);
}
@media (prefers-reduced-motion: no-preference) {
	.nv-post-card {
		transition: transform 0.25s ease;
	}
	.nv-post-card:hover {
		transform: scale(1.05) rotate(-1deg);
		z-index: 2;
	}
}
/* A imagem preenche o card (absoluta), cobrindo o fundo de fallback. */
.nv-post-card__img {
	position: absolute;
	inset: 0;
	margin: 0;
}
.nv-post-card__img img {
	display: block;
	width: 100%;
	height: 100%;
	object-fit: cover;
	border-radius: 30px;
}

/* Caixa branca do título, sobreposta na base da imagem (inset 8px). */
.nv-post-card__box {
	position: absolute;
	left: 8px;
	right: 8px;
	bottom: 8px;
	z-index: 2;
	background: var(--wp--preset--color--white);
	border-radius: 22px;
	padding: var(--wp--preset--spacing--3);
	/* sombra mais contida verticalmente pra não vazar no vão entre as linhas. */
	box-shadow: 0 8px 20px rgba(40, 40, 91, 0.14);
}

/* Linha de meta dentro do box: selo de categoria + data, antes do título. */
.nv-post-card__meta {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	gap: 0.6em;
	margin-bottom: 0.6rem;
}
.nv-post-card__selo {
	margin: 0;
	display: inline-flex;
	flex-wrap: wrap;
	gap: 4px;
}
.nv-post-card__selo a {
	display: inline-block;
	background: var(--wp--preset--color--laranja);
	color: #fff;
	font-family: var(--wp--preset--font-family--heading);
	font-weight: 700;
	font-size: 0.68rem;
	line-height: 1.2;
	letter-spacing: 0.02em;
	padding: 0.32em 0.7em;
	border-radius: 999px;
	text-decoration: none;
	transition: background-color 0.2s ease;
}
.nv-post-card__selo a:hover {
	background: var(--wp--preset--color--primary);
	text-decoration: none;
}
.nv-post-card__data {
	margin: 0;
	font-family: var(--wp--preset--font-family--heading);
	font-weight: 600;
	font-size: 0.74rem;
	/* cinza mais claro que o text-muted, mas ainda ~7:1 sobre branco = AAA. */
	color: #585858;
}
/* Título limitado a 2 linhas (com reticências) e altura reservada de 2 linhas,
   pra o box branco ficar sempre com a mesma altura. */
.nv-post-card__titulo {
	margin: 0;
	min-height: 2.5em;
	font-size: 1.1rem;
	line-height: 1.25;
	color: #28285B;
}
.nv-post-card__titulo a {
	display: -webkit-box;
	-webkit-line-clamp: 2;
	-webkit-box-orient: vertical;
	overflow: hidden;
	color: inherit;
	text-decoration: none;
}
.nv-post-card__titulo a:hover {
	color: var(--wp--preset--color--laranja);
	text-decoration: none;
}

/* Botão "Carregar mais" (Load More) do archive de blog. */
.nv-loadmore-wrap {
	display: flex;
	justify-content: center;
	margin-top: var(--wp--preset--spacing--6);
}
.nv-loadmore {
	font-family: var(--wp--preset--font-family--heading);
	font-weight: 700;
	font-size: 0.95rem;
	letter-spacing: 0.02em;
	color: #fff;
	background: var(--wp--preset--color--laranja);
	border: 0;
	border-radius: 999px;
	padding: 0.9em 2.4em;
	cursor: pointer;
	transition: background-color 0.2s ease, transform 0.2s ease;
}
.nv-loadmore:hover {
	background: var(--wp--preset--color--primary);
	transform: translateY(-2px);
}
.nv-loadmore.is-loading {
	opacity: 0.65;
	cursor: default;
	transform: none;
}

/* Paginação — números em pill, atual destacado, anterior/próxima discretos */
.wp-block-query-pagination .page-numbers {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	min-width: 2.25em;
	height: 2.25em;
	padding: 0 0.5em;
	border-radius: 6px;
	color: var(--wp--preset--color--ink);
	font-size: var(--wp--preset--font-size--sm);
	text-decoration: none;
}

.wp-block-query-pagination a.page-numbers:hover {
	background-color: var(--wp--preset--color--surface);
	text-decoration: none;
}

.wp-block-query-pagination .page-numbers.current {
	background-color: var(--wp--preset--color--primary);
	color: var(--wp--preset--color--white);
	font-weight: 600;
}

.wp-block-query-pagination-previous,
.wp-block-query-pagination-next {
	padding: 0 0.75em;
	height: 2.25em;
	display: inline-flex;
	align-items: center;
	border-radius: 6px;
	font-size: var(--wp--preset--font-size--sm);
	color: var(--wp--preset--color--primary);
	text-decoration: none;
}

.wp-block-query-pagination-previous:hover,
.wp-block-query-pagination-next:hover {
	background-color: var(--wp--preset--color--surface);
	text-decoration: none;
}

/* Breadcrumb (fallback sem Rank Math — com o plugin ativo, o estilo dele prevalece).
   Tamanho de fonte fixo em 12px pro projeto inteiro, nos dois sistemas
   (fallback .nv-breadcrumb e Rank Math .rank-math-breadcrumb), independente
   do contexto/página — por isso a regra do Rank Math aqui não é escopada a
   nenhum ancestral. */
.nv-breadcrumb ol,
.rank-math-breadcrumb {
	font-size: 12px;
}
.nv-breadcrumb ol {
	display: flex;
	flex-wrap: wrap;
	gap: 0.4em;
	list-style: none;
	margin: 0;
	padding: 0;
	color: var(--wp--preset--color--text-muted);
}

.nv-breadcrumb li:not(:last-child)::after {
	content: "/";
	margin-left: 0.4em;
	color: var(--wp--preset--color--surface);
}

.nv-breadcrumb a {
	color: var(--wp--preset--color--text-muted);
}

/* ==========================================================================
   SINGLE DE POST — faixa verde (hero-band) + conteúdo em 2 colunas.
   Base: single de matéria do Jornal GV, adaptada à identidade Genoma.
   ========================================================================== */

/* Faixa verde do herói: breadcrumb + título + dek + meta + imagem destacada.
   O gradiente troca o verde pela cor de papel nos últimos 20% da altura, e a
   imagem (último elemento) "vaza" pra fora do verde. */
.hero-band {
	padding-bottom: 0;
}
.hero-band.has-accent-background-color {
	background-color: #05613b !important;
	background-image: linear-gradient(to bottom, #05613b 80%, var(--wp--preset--color--background) 80%);
}

/* Breadcrumb branco dentro da faixa (Rank Math + fallback). */
.hero-band .nv-breadcrumb ol,
.hero-band .nv-breadcrumb a,
.hero-band .rank-math-breadcrumb p,
.hero-band .rank-math-breadcrumb a,
.hero-band .rank-math-breadcrumb .last {
	color: #fff;
}
.hero-band .nv-breadcrumb li:not(:last-child)::after,
.hero-band .rank-math-breadcrumb .separator {
	color: rgba(255, 255, 255, 0.4);
}
.hero-band .nv-breadcrumb a:hover,
.hero-band .rank-math-breadcrumb a:hover {
	color: #fff;
	text-decoration: underline;
}

/* Alinhamento à esquerda do conteúdo da faixa (o constrained centralizaria). */
.single-shell.is-layout-constrained > * {
	margin-left: 0 !important;
}

.hero-band h1.wp-block-post-title {
	color: #fff;
	margin-top: 0;
}
@media (max-width: 600px) {
	.hero-band h1.wp-block-post-title {
		font-size: 1.9rem;
	}
}

/* Dek (resumo) abaixo do H1 — branco suave. */
.single-dek {
	margin-top: var(--wp--preset--spacing--2);
	margin-bottom: 20px;
	max-width: 70ch;
}
.single-dek .wp-block-post-excerpt__excerpt {
	margin: 0;
	font-size: var(--wp--preset--font-size--lg);
	line-height: 1.55;
	color: rgba(255, 255, 255, 0.85);
}

/* Meta (autor · categoria · data · atualizado · leitura) — branca, na faixa. */
.single-meta {
	align-items: center;
	gap: var(--wp--preset--spacing--1) !important;
	margin-top: var(--wp--preset--spacing--2);
	color: rgba(255, 255, 255, 0.78);
	font-size: var(--wp--preset--font-size--sm);
}
.single-meta a {
	color: #fff;
}
.single-meta .wp-block-avatar {
	margin: 0;
}
.single-meta .wp-block-avatar img {
	display: block;
	border-radius: 50%;
	border: 2px solid rgba(255, 255, 255, 0.4);
}
.single-meta__dot {
	margin: 0;
	color: rgba(255, 255, 255, 0.4);
}
.single-meta__category {
	font-weight: 700;
}
.single-meta__atualizado {
	font-style: italic;
}
.single-meta__data-curta {
	display: none;
}
@media (max-width: 600px) {
	.single-meta__data-longa {
		display: none;
	}
	.single-meta__data-curta {
		display: inline-block;
	}
}

/* Imagem destacada — 16:9, cantos arredondados, "vaza" 24px de cada lado no
   desktop, por cima da transição do gradiente. */
.single-featured-image {
	margin: 0;
}
.single-featured-image img {
	display: block;
	width: 100%;
	aspect-ratio: 16 / 9;
	object-fit: cover;
	border-radius: 20px;
}
@media (min-width: 900px) {
	.single-featured-image img {
		width: calc(100% + 48px);
		max-width: none;
		margin-left: -24px;
	}
}
.single-featured-caption {
	margin: var(--wp--preset--spacing--2) 0 0;
	font-size: var(--wp--preset--font-size--sm);
	font-style: italic;
	color: var(--wp--preset--color--text-muted);
}

/* Compartilhar — ícones em pílula, hover laranja. */
.nv-compartilhar {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	gap: 8px;
	margin-top: var(--wp--preset--spacing--2);
}
.nv-compartilhar__label {
	flex-basis: 100%;
	font-family: var(--wp--preset--font-family--heading);
	font-size: var(--wp--preset--font-size--xs);
	font-weight: 700;
	letter-spacing: 0.08em;
	text-transform: uppercase;
	color: var(--wp--preset--color--text-muted);
	margin-bottom: 2px;
}
.nv-compartilhar__icone {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	width: 38px;
	height: 38px;
	border-radius: 50%;
	border: 1px solid var(--wp--preset--color--borda);
	background: var(--wp--preset--color--white);
	color: var(--wp--preset--color--text-muted);
	cursor: pointer;
	transition: color 0.2s ease, background-color 0.2s ease, border-color 0.2s ease;
}
.nv-compartilhar__icone svg {
	width: 18px;
	height: 18px;
}
.nv-compartilhar__icone:hover {
	color: #fff;
	background-color: var(--wp--preset--color--laranja);
	border-color: var(--wp--preset--color--laranja);
}
.nv-compartilhar__icone.is-copiado {
	color: #fff;
	background-color: var(--wp--preset--color--accent);
	border-color: var(--wp--preset--color--accent);
}

/* Layout de 2 colunas: conteúdo à esquerda, sumário fixo à direita. */
.single-layout {
	display: grid;
	grid-template-columns: minmax(0, 1fr) 264px;
	gap: var(--wp--preset--spacing--5);
	align-items: start;
	max-width: 1200px;
	margin-left: auto;
	margin-right: auto;
}
.single-layout > * {
	margin-block-start: 0;
	min-width: 0;
	overflow-wrap: break-word;
}
.single-body {
	order: 1;
	max-width: 720px;
}
.single-toc {
	order: 2;
	min-width: 0;
	width: 264px;
	max-width: 264px;
	position: sticky;
	top: calc(var(--wp--preset--spacing--3) + 88px);
	border-left: 2px solid var(--wp--preset--color--borda);
	padding-left: var(--wp--preset--spacing--2);
}
.single-toc__label {
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: 0.5em;
	font-family: var(--wp--preset--font-family--heading);
	font-size: var(--wp--preset--font-size--xs);
	font-weight: 700;
	letter-spacing: 0.08em;
	text-transform: uppercase;
	color: var(--wp--preset--color--laranja);
	margin-bottom: var(--wp--preset--spacing--1);
	list-style: none;
	cursor: pointer;
}
.single-toc__label::-webkit-details-marker {
	display: none;
}
/* Seta de expandir — só aparece no mobile (no desktop o sumário fica aberto). */
.single-toc__label::after {
	content: "";
	display: none;
	width: 8px;
	height: 8px;
	border-right: 2px solid currentColor;
	border-bottom: 2px solid currentColor;
	transform: rotate(45deg);
	transition: transform 0.2s ease;
}
.single-toc__toc[open] .single-toc__label::after {
	transform: rotate(-135deg);
}
@media (min-width: 901px) {
	.single-toc__label {
		pointer-events: none;
		cursor: default;
	}
}
.single-toc__list {
	list-style: none;
	margin: 0;
	padding: 0;
	display: flex;
	flex-direction: column;
	gap: 0.6em;
}
.single-toc__list a {
	display: block;
	color: var(--wp--preset--color--ink);
	font-size: var(--wp--preset--font-size--sm);
	line-height: 1.3;
	text-decoration: none;
	transition: color 0.2s ease;
}
.single-toc__list a:hover {
	color: var(--wp--preset--color--laranja);
}
.single-toc__list .is-active > a {
	color: var(--wp--preset--color--laranja);
	font-weight: 600;
}
.single-toc__list .single-toc__sub {
	padding-left: 1em;
}
.single-toc__toc.is-empty {
	display: none;
}
.single-toc .nv-compartilhar {
	margin-top: var(--wp--preset--spacing--3);
	padding-top: var(--wp--preset--spacing--2);
	border-top: 1px solid var(--wp--preset--color--borda);
}
.single-toc__toc.is-empty + .nv-compartilhar {
	margin-top: 0;
	padding-top: 0;
	border-top: none;
}

@media (max-width: 900px) {
	.single-layout {
		grid-template-columns: 1fr;
	}
	.single-toc {
		order: 3;
		width: auto;
		max-width: none;
		position: static;
		border-left: none;
		border: 1px solid var(--wp--preset--color--borda);
		border-radius: 12px;
		padding: var(--wp--preset--spacing--3);
	}
	.single-toc__label {
		margin-bottom: 0;
	}
	.single-toc__toc[open] .single-toc__label {
		margin-bottom: var(--wp--preset--spacing--2);
	}
	.single-toc__label::after {
		display: block;
	}
	.single-body {
		max-width: none;
	}
}

/* Chips de taxonomia (categoria + tags) ao final do conteúdo. */
.nv-post-tax {
	display: flex;
	flex-direction: column;
	gap: var(--wp--preset--spacing--2);
	margin-top: var(--wp--preset--spacing--5);
	padding-top: var(--wp--preset--spacing--4);
	border-top: 1px solid var(--wp--preset--color--borda);
}
.nv-post-tax__grupo {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	gap: 0.5em;
}
.nv-post-tax__label {
	font-family: var(--wp--preset--font-family--heading);
	font-size: var(--wp--preset--font-size--xs);
	font-weight: 700;
	letter-spacing: 0.06em;
	text-transform: uppercase;
	color: var(--wp--preset--color--text-muted);
}
.nv-post-tax__chips {
	display: flex;
	flex-wrap: wrap;
	gap: 0.5em;
}
.nv-post-tax__chip {
	display: inline-block;
	background: var(--wp--preset--color--surface);
	color: var(--wp--preset--color--marinho);
	font-family: var(--wp--preset--font-family--heading);
	font-weight: 600;
	font-size: 0.8rem;
	padding: 0.35em 0.9em;
	border-radius: 999px;
	text-decoration: none;
	transition: background-color 0.2s ease, color 0.2s ease;
}
.nv-post-tax__chip:hover {
	background: var(--wp--preset--color--laranja);
	color: #fff;
	text-decoration: none;
}

/* Box do autor. */
.author-box {
	align-items: flex-start !important;
	gap: var(--wp--preset--spacing--3) !important;
	margin-top: var(--wp--preset--spacing--6) !important;
	padding: var(--wp--preset--spacing--3);
	border: 1px solid var(--wp--preset--color--borda);
	border-radius: 16px;
	background: var(--wp--preset--color--surface);
}
.author-box .wp-block-avatar img {
	border-radius: 50%;
}
.author-box__label {
	margin: 0 !important;
	font-family: var(--wp--preset--font-family--heading);
	font-size: var(--wp--preset--font-size--xs);
	text-transform: uppercase;
	letter-spacing: 0.08em;
	color: var(--wp--preset--color--text-muted);
}
.author-box .wp-block-post-author-name {
	font-family: var(--wp--preset--font-family--heading);
	font-weight: 800;
	font-size: 1.1rem;
	margin-top: 0.15em;
	color: #151544;
}
.author-box .wp-block-post-author-name a {
	color: inherit;
	text-decoration: none;
}
.author-box .wp-block-post-author-biography {
	margin-top: 0.4em;
	color: var(--wp--preset--color--text-muted);
	font-size: var(--wp--preset--font-size--sm);
	line-height: 1.5;
}

/* Navegação anterior/próximo. */
.single-nav__link a {
	font-family: var(--wp--preset--font-family--heading);
	font-weight: 700;
	color: var(--wp--preset--color--marinho);
	text-decoration: none;
}
.single-nav__link a:hover {
	color: var(--wp--preset--color--laranja);
}

/* Barra de progresso de leitura — fixa na base da tela, só em posts. */
.reading-progress {
	position: fixed;
	bottom: 0;
	left: 0;
	right: 0;
	height: 4px;
	background: var(--wp--preset--color--surface);
	z-index: 90;
}
.reading-progress__fill {
	height: 100%;
	width: 0%;
	background: var(--wp--preset--color--laranja);
}
@media (prefers-reduced-motion: no-preference) {
	.reading-progress__fill {
		transition: width 0.1s linear;
	}
}

/* Posts relacionados */
.nv-relacionados__eyebrow {
	display: block;
	color: var(--wp--preset--color--primary);
	font-family: var(--wp--preset--font-family--heading);
	font-size: var(--wp--preset--font-size--sm);
	font-weight: 700;
	letter-spacing: 0.08em;
	text-transform: uppercase;
}

.nv-relacionados__titulo {
	margin: 0.2em 0 0;
}

@media (max-width: 900px) {
	.nv-relacionados .blog-grid {
		grid-template-columns: repeat(2, 1fr) !important;
	}
}

@media (max-width: 600px) {
	.nv-relacionados .blog-grid {
		grid-template-columns: 1fr !important;
	}
}

/* Blocos nativos de conteúdo (post-content, páginas) — sem isso ficam no
   estilo cru do navegador assim que um post usar citação, tabela ou lista. */
.entry-content blockquote,
.wp-block-post-content blockquote {
	margin: var(--wp--preset--spacing--3) 0;
	padding-left: var(--wp--preset--spacing--2);
	border-left: 3px solid var(--wp--preset--color--primary);
	font-family: var(--wp--preset--font-family--heading);
	font-size: var(--wp--preset--font-size--lg);
	font-style: normal;
	color: var(--wp--preset--color--ink);
}

.entry-content blockquote cite,
.wp-block-post-content blockquote cite {
	display: block;
	margin-top: var(--wp--preset--spacing--1);
	font-family: var(--wp--preset--font-family--body);
	font-size: var(--wp--preset--font-size--sm);
	font-style: normal;
	color: var(--wp--preset--color--text-muted);
}

.entry-content table,
.wp-block-post-content table {
	width: 100%;
	border-collapse: collapse;
	margin: var(--wp--preset--spacing--3) 0;
	font-size: var(--wp--preset--font-size--sm);
}

.entry-content th,
.entry-content td,
.wp-block-post-content th,
.wp-block-post-content td {
	padding: 0.6em 0.8em;
	border: 1px solid var(--wp--preset--color--surface);
	text-align: left;
}

.entry-content th,
.wp-block-post-content th {
	background: var(--wp--preset--color--surface);
	font-family: var(--wp--preset--font-family--heading);
	font-weight: 700;
}

.entry-content ul,
.entry-content ol,
.wp-block-post-content ul,
.wp-block-post-content ol {
	padding-left: 1.4em;
	margin: var(--wp--preset--spacing--2) 0;
}

.entry-content li,
.wp-block-post-content li {
	margin-bottom: 0.4em;
}

.entry-content code,
.wp-block-post-content code {
	background: var(--wp--preset--color--surface);
	padding: 0.15em 0.4em;
	border-radius: 4px;
	font-size: 0.9em;
}

.entry-content pre,
.wp-block-post-content pre {
	background: var(--wp--preset--color--ink);
	color: var(--wp--preset--color--white);
	padding: var(--wp--preset--spacing--2);
	border-radius: 8px;
	overflow-x: auto;
	margin: var(--wp--preset--spacing--3) 0;
}

.entry-content pre code,
.wp-block-post-content pre code {
	background: none;
	padding: 0;
	color: inherit;
}

/* Alvos de toque — pills de paginação e abas de filtro um pouco pequenos
   pra toque confortável em mobile (recomendação Google: ~44px mínimo). */
.wp-block-query-pagination .page-numbers,
.wp-block-query-pagination-previous,
.wp-block-query-pagination-next {
	min-height: 40px;
}

.nv-busca-filtro__item {
	min-height: 40px;
	display: inline-flex;
	align-items: center;
}

/* ==========================================================================
   Hero — Home
   ========================================================================== */

/* O box tem 1600px (wideSize do theme.json, via align:wide) e o conteúdo
   dentro dele 1200px (contentSize) — os dois vêm dos tokens, não de px
   chumbado aqui. */
/* Sem overflow: hidden — os personagens precisam vazar pra fora do box. O
   gradiente continua recortado no raio mesmo assim, porque background-image é
   clipado pelo border-radius por padrão (background-clip: border-box); o
   overflow só governa os elementos filhos. */
.hero-home__box {
	/* Altura do hero num lugar só: o box e a linha de colunas precisam do
	   mesmo valor (a coluna é quem estica de fato), e mantê-los em duas
	   declarações separadas já fez o box ignorar a altura nova em silêncio,
	   porque a coluna continuava esticando pelo valor antigo.
	   68vh e não 75: o hero tem que terminar acima da dobra pra deixar a
	   próxima seção espiar. */
	--nv-hero-altura: 68vh;
	min-height: var(--nv-hero-altura);
}

/* Quem carrega os 75vh de verdade é a linha de colunas: o box é constrained,
   então altura + centralização vertical moram aqui. O texto centraliza
   (are-vertically-aligned-center) e os personagens encostam na base
   (is-vertically-aligned-bottom, no próprio bloco). */
.hero-home__cols {
	min-height: var(--nv-hero-altura);
	margin-bottom: 0;
	gap: var(--wp--preset--spacing--4);
}

/* Base (mobile): imagem no fluxo normal, centralizada, sem vazar. */
.hero-home__cols .wp-block-image {
	margin: 0;
	line-height: 0;
}

.hero-home__cols .wp-block-image img {
	display: block;
	width: 100%;
	max-width: 420px;
	height: auto;
	margin: 0 auto;
}

/* 782px é onde o core empilha as colunas — abaixo disso a imagem fica no
   fluxo (regra acima). */
@media (min-width: 782px) {
	/* Os personagens vazam 28px pra fora do box, pela direita e por baixo.
	   A âncora é o BOX, não a coluna: a folga entre a borda da coluna e a
	   borda do box não é constante (72px em 1440, 200px em 1920, porque o box
	   cresce até travar em 1600 enquanto o conteúdo fica em 1200). Preso na
	   coluna por margem negativa, o vazamento só acertava num viewport e
	   sumia nos outros. */
	.hero-home__box {
		position: relative;
	}

	.hero-home__cols .wp-block-image {
		position: absolute;
		right: -28px;
		/* Só a direita vaza. A base fica alinhada na borda do box (bottom: 0):
		   a imagem já vem recortada na altura do quadril, então descê-la
		   deixaria o corte flutuando pra fora do gradiente. */
		bottom: 0;
		width: min(640px, 48%);
	}

	.hero-home__cols .wp-block-image img {
		max-width: none;
	}
}

.hero-home__cols .wp-block-buttons {
	margin-top: var(--wp--preset--spacing--4);
}

@media (max-width: 781px) {
	/* Empilhado, 75vh viraria uma tela inteira só de hero: a altura passa a
	   ser o que o conteúdo pedir. */
	.hero-home__box,
	.hero-home__cols {
		min-height: 0;
	}

	.hero-home__box {
		border-radius: 28px;
	}

	.hero-home__cols {
		gap: var(--wp--preset--spacing--3);
	}

	/* Em 390px os 48px de respiro lateral comiam 25% da tela e deixavam o box
	   com 294px. Com 24px ele vai a 342 e passa a nascer na mesma linha que a
	   logo do header.
	   O !important é necessário, não preguiça: esse padding é atributo do
	   bloco (pra seguir editável no Gutenberg), então o WordPress o escreve
	   como style="" inline na tag — e inline vence qualquer seletor. É o preço
	   de deixar o espaçamento editável e ainda assim responsivo. */
	.hero-home {
		padding-left: var(--wp--preset--spacing--3) !important;
		padding-right: var(--wp--preset--spacing--3) !important;
	}
}

/* ==========================================================================
   Cards de Cursos (seção "Formação completa e inspiradora")
   Fundo e forma derivam de --cor (campo cor_curso). A forma é máscara SVG,
   então recolore junto.
   ========================================================================== */

/* A seção NÃO tem padding lateral de propósito: com padding, o alignfull dos
   cards ficaria preso no content-box e não sangraria até a borda. O gutter que
   o título/descrição precisam no mobile vem abaixo, só neles. */
/* Título da seção — tamanho e cor fixos aqui sobrepõem o preset de h2 do
   theme.json. A pílula "inspiradora" mantém a própria cor (.nv-pill). */
.nv-formacao > .wp-block-heading {
	font-size: 28px;
	color: #151544;
}

/* Descrição abaixo do título: largura máxima pra não esticar a linha. */
.nv-formacao > .wp-block-paragraph {
	max-width: 930px;
	margin-inline: auto;
}

@media (max-width: 1199px) {
	.nv-formacao > .wp-block-heading,
	.nv-formacao > .wp-block-paragraph {
		padding-left: var(--wp--preset--spacing--3);
		padding-right: var(--wp--preset--spacing--3);
	}
}

.nv-cursos-cards {
	display: flex;
	gap: var(--wp--preset--spacing--3);
	/* Desktop: a linha do loop é 1600px centralizada. Padding vertical dá ar
	   pra sombra do hover não ser cortada pelo overflow; padding lateral é o
	   gutter (vira a margem em telas menores). */
	max-width: 1600px;
	margin-inline: auto;
	padding: 20px var(--wp--preset--spacing--3) 44px;
	/* safe center: quando os 5 cabem, ficam centralizados; quando não cabem,
	   cai pra "start" (alinha à esquerda) e o corte vai pra direita — o swipe. */
	justify-content: safe center;
	/* Swipe em telas menores, SEM barra de rolagem visível. */
	overflow-x: auto;
	scroll-snap-type: x proximity;
	scroll-padding-left: var(--wp--preset--spacing--3);
	scrollbar-width: none;          /* Firefox */
	-webkit-overflow-scrolling: touch;
}
.nv-cursos-cards::-webkit-scrollbar { display: none; } /* Chrome/Safari/Edge */

.nv-curso-card {
	position: relative;
	/* largura fixa: 5 × 288 + 4 gaps cabem em 1600. Não encolhe → em telas
	   menores estouram e viram swipe (com safe center virando start). */
	flex: 0 0 288px;
	/* altura fixa (não min-height): garante que a base seja a mesma em todos,
	   pra as formas — ancoradas na base — alinharem o topo entre si. */
	height: 380px;
	padding: var(--wp--preset--spacing--5) var(--wp--preset--spacing--4) var(--wp--preset--spacing--4);
	border-radius: 28px;
	overflow: hidden;
	text-decoration: none;
	scroll-snap-align: start;
	/* fundo pastel derivado da cor do curso */
	background-color: color-mix(in srgb, var(--cor) 13%, #fff);
	transition: transform 0.22s ease, box-shadow 0.22s ease;
}

@media (prefers-reduced-motion: no-preference) {
	.nv-curso-card:hover {
		transform: translateY(-6px);
		/* sombra suave: opacidade baixa e sem espalhamento duro */
		box-shadow: 0 12px 28px color-mix(in srgb, var(--cor) 20%, transparent);
	}
}

.nv-curso-card__conteudo {
	position: relative;
	z-index: 1;
	display: flex;
	flex-direction: column;
	gap: 0.4rem;
}

/* Forma decorativa na base do card, colada na borda inferior. mask-position:
   top alinha o TOPO de todas as formas na mesma linha (o topo do elemento, que
   é o mesmo Y em todos os cards por causa da altura fixa). Como as formas têm
   alturas diferentes, as mais altas (3, 4, 5) passam da altura do elemento e
   são cortadas na BASE (nunca no topo). Fica atrás do texto (z-index), mas não
   encosta nele por causa da altura reservada. Cor = tom médio da cor. */
.nv-curso-card__forma {
	position: absolute;
	left: 0;
	right: 0;
	bottom: 0;
	/* altura menor que a forma MAIS BAIXA (a de aspecto mais largo ≈ 144px de
	   altura renderizada), pra TODAS estourarem e cortarem na base. Reduzir a
	   altura também empurra a linha de topo pra baixo (as formas descem). */
	height: 130px;
	background-color: color-mix(in srgb, var(--cor) 52%, #fff);
	-webkit-mask: var(--forma) no-repeat top center / 100% auto;
	mask: var(--forma) no-repeat top center / 100% auto;
	pointer-events: none;
}

/* Heading do card via <span role="heading" aria-level="3"> (não <h3>) pra ser
   inline e imune ao wpautop do wp:shortcode — display:block recupera o layout
   de bloco. font-size fixo é o tamanho do card, não o da escala do theme.json. */
.nv-curso-card__titulo {
	display: block;
	margin: 0;
	max-width: 185px;
	font-family: var(--wp--preset--font-family--heading);
	font-weight: 800;
	font-size: 22px;
	line-height: 1.15;
	color: #151544;
}

.nv-curso-card__faixa {
	font-family: var(--wp--preset--font-family--heading);
	font-weight: 700;
	font-size: 0.95rem;
	color: var(--wp--preset--color--marinho);
	margin-top: 0.5rem;
}

.nv-curso-card__desc {
	font-size: 0.9rem;
	line-height: 1.5;
	color: var(--wp--preset--color--text-muted);
	max-width: 90%;
}

/* Pílula "inspiradora" no título da seção — levemente inclinada, como na referência. */
.nv-pill {
	display: inline-block;
	background: var(--wp--preset--color--laranja);
	color: #fff;
	border-radius: 999px;
	padding: 0.1em 0.6em;
	line-height: 1.2;
	transform: rotate(-3deg);
}

/* Selo circular do lema da escola — gira lentamente no sentido anti-horário. Fica
   no canto inferior esquerdo da seção de cursos, na margem, como na referência. */
.nv-formacao {
	position: relative;
}

.nv-formacao__lema {
	position: absolute;
	/* left negativo: metade do selo sangra pra fora da tela à esquerda; bottom
	   pequeno + padding-bottom maior da seção jogam ele mais pra baixo. */
	left: -75px;
	bottom: var(--wp--preset--spacing--2);
	width: 190px;
	height: 190px;
	margin: 0;
	/* atrás dos cards: em telas médias (conteúdo 1600 quase sem margem) o selo
	   encosta no 1º card; deixá-lo atrás faz a sobreposição ficar graciosa. Em
	   telas largas há margem e ele aparece inteiro. */
	z-index: 0;
	pointer-events: none;
	animation: nv-girar-lema 26s linear infinite;
}
/* wp:image aplica a className no <figure>, não no <img> — forçar o tamanho
   também no filho evita depender só do max-width:100% padrão do core. */
.nv-formacao__lema img {
	display: block;
	width: 100%;
	height: 100%;
}

/* cards acima do selo */
.nv-cursos-wrap {
	position: relative;
	z-index: 1;
}

@keyframes nv-girar-lema {
	from { transform: rotate(0deg); }
	to   { transform: rotate(-360deg); }
}

/* Respeita quem pediu menos movimento no SO (WCAG 2.3.3) */
@media (prefers-reduced-motion: reduce) {
	.nv-formacao__lema { animation: none; }
}

/* Em telas estreitas ele continua, menor e recortado pela borda da seção.
   Antes ficava escondido porque o sangramento de 75px não cabia; o problema não
   era o selo, era a medida — reduzido pra 120px e com 42px de sangria ele mantém
   a mesma leitura de "selo entrando pela margem" sem espremer nada.
   O overflow entra só aqui: no desktop a metade que sangra é pra aparecer, e
   recortar lá mudaria a arte. */
@media (max-width: 1100px) {
	.nv-formacao {
		overflow: hidden;
	}

	.nv-formacao__lema {
		width: 120px;
		height: 120px;
		left: -42px;
	}
}

/* ==========================================================================
   POR DENTRO DO GENOMA — diferenciais: texto + CTA à esquerda, mosaico à direita
   ========================================================================== */
.nv-por-dentro {
	position: relative;
	/* o blob sangra pra fora à esquerda; overflow evita scroll horizontal */
	overflow: hidden;
}

/* Onda decorativa no canto inferior esquerdo, atrás do conteúdo. */
.nv-por-dentro__onda {
	position: absolute;
	left: -70px;
	bottom: -10px;
	width: 460px;
	height: auto;
	margin: 0;
	z-index: 0;
	pointer-events: none;
}
/* wp:image aplica a className no <figure>, não no <img>. */
.nv-por-dentro__onda img {
	display: block;
	width: 100%;
	height: auto;
}

.nv-por-dentro__cols {
	position: relative;
	z-index: 1;
	gap: var(--wp--preset--spacing--6);
}

.nv-por-dentro__texto {
	padding-top: 40px;
}

.nv-por-dentro__texto .wp-block-heading {
	font-size: 28px;
	color: #151544;
	margin-bottom: var(--wp--preset--spacing--3);
}
.nv-por-dentro__texto p {
	max-width: 34ch;
}

/* Mosaico (bento), grid de 4 colunas x 3 linhas (posições, não conteúdo — o
   sorteio de qual diferencial cai em cada slot é feito em inc/por-dentro.php):
   big = 2 colunas x 2 linhas (canto superior esquerdo); p2-p5 = 1 coluna x 1
   linha cada, preenchendo o resto das duas primeiras linhas; p6/p7 = 2
   colunas x 1 linha cada, lado a lado na linha de baixo. */
.nv-pd-grid {
	display: grid;
	grid-template-columns: repeat(4, 1fr);
	/* linhas 1-2: altura livre, ditada pelo aspect-ratio 1:1 dos tiles p2-p5
	   (a linha vira do tamanho exato de 1 coluna, garantindo o quadrado). */
	grid-template-rows: auto auto 168px;
	gap: var(--wp--preset--spacing--3);
}
.nv-pd-tile--big { grid-column: 1 / span 2; grid-row: 1 / span 2; }
.nv-pd-tile--p2   { grid-column: 3; grid-row: 1; }
.nv-pd-tile--p3   { grid-column: 4; grid-row: 1; }
.nv-pd-tile--p4   { grid-column: 3; grid-row: 2; }
.nv-pd-tile--p5   { grid-column: 4; grid-row: 2; }
.nv-pd-tile--p6   { grid-column: 1 / span 2; grid-row: 3; }
.nv-pd-tile--p7   { grid-column: 3 / span 2; grid-row: 3; }

.nv-pd-tile--p2,
.nv-pd-tile--p3,
.nv-pd-tile--p4,
.nv-pd-tile--p5 {
	aspect-ratio: 1 / 1;
}

.nv-pd-tile {
	position: relative;
	display: block;
	border-radius: 20px;
	overflow: hidden;
	text-decoration: none;
}

.nv-pd-tile__img,
.nv-pd-tile__placeholder {
	position: absolute;
	inset: 0;
	width: 100%;
	height: 100%;
	object-fit: cover;
	display: block;
	transition: transform 0.35s ease;
}
/* placeholder enquanto a foto real não é enviada */
.nv-pd-tile__placeholder {
	background: linear-gradient(135deg, #f1e9e0 0%, #e7ddd1 100%);
}

/* rótulo branco no canto inferior esquerdo */
.nv-pd-tile__label {
	position: absolute;
	left: 14px;
	bottom: 14px;
	z-index: 2;
	background: var(--wp--preset--color--white);
	color: #151544;
	font-family: var(--wp--preset--font-family--heading);
	font-weight: 700;
	font-size: 0.85rem;
	line-height: 1.2;
	padding: 0.4em 0.9em;
	border-radius: 999px;
	box-shadow: 0 2px 10px rgba(0, 0, 0, 0.14);
}

/* hover só quando o tile virar link (futuro) */
a.nv-pd-tile:hover .nv-pd-tile__img { transform: scale(1.05); }

/* Tablet: mosaico ocupa a largura toda quando as colunas empilham (< 782px é
   onde o core quebra o wp:columns). Antes disso, alivia o gap entre colunas. */
@media (max-width: 1024px) {
	.nv-por-dentro__cols { gap: var(--wp--preset--spacing--4); }
}

/* Mobile: reflui o bento em 2 colunas e some com o blob (não há margem pra ele). */
@media (max-width: 600px) {
	.nv-pd-grid {
		grid-template-columns: 1fr 1fr;
		grid-template-rows: none;
	}
	.nv-pd-tile--big,
	.nv-pd-tile--p6,
	.nv-pd-tile--p7 {
		grid-column: 1 / span 2;
		grid-row: auto;
	}
	.nv-pd-tile--p2,
	.nv-pd-tile--p3,
	.nv-pd-tile--p4,
	.nv-pd-tile--p5 {
		grid-column: auto;
		grid-row: auto;
		aspect-ratio: 1 / 1;
	}
	.nv-pd-tile--big { aspect-ratio: 16 / 10; }
	.nv-pd-tile--p6,
	.nv-pd-tile--p7 { aspect-ratio: 16 / 8; }
	.nv-por-dentro__onda { display: none; }
}

/* ==========================================================================
   CURSO — cabeçalho da interna: breadcrumb + divisória pontilhada + 2 colunas
   ========================================================================== */

/* Breadcrumb do Rank Math dentro do header do curso: pequeno e suave, no mesmo
   tom do fallback .nv-breadcrumb (o plugin não traz estilo próprio). */
.curso-header .rank-math-breadcrumb,
.nv-unidades-hero .rank-math-breadcrumb {
	margin: 0;
	color: var(--wp--preset--color--text-muted);
}
.curso-header .rank-math-breadcrumb a,
.nv-unidades-hero .rank-math-breadcrumb a {
	color: var(--wp--preset--color--text-muted);
}
.curso-header .rank-math-breadcrumb .separator,
.nv-unidades-hero .rank-math-breadcrumb .separator {
	margin: 0 0.4em;
	color: var(--wp--preset--color--laranja);
}
.curso-header .rank-math-breadcrumb .last,
.nv-unidades-hero .rank-math-breadcrumb .last {
	color: #151544;
	font-weight: 600;
}

/* Divisória pontilhada suave — quase se misturando com o fundo #FAF8F5. Os
   pontos vêm de um radial-gradient (não de `border: dotted`) pra controlar o
   espaçamento: o gap é o background-size horizontal. */
.nv-divider-dotted.wp-block-separator {
	width: 100% !important;
	max-width: none !important;
	height: 2px;
	border: 0;
	background-image: radial-gradient(circle, #ddd2c4 1px, transparent 1.2px);
	background-size: 11px 2px;
	background-repeat: repeat-x;
	background-position: left center;
	opacity: 1;
	margin-block: var(--wp--preset--spacing--3);
}

/* Header do curso: altura se ajusta ao conteúdo, com teto de 90vh (não força
   altura nem centraliza, então não sobra espaço vazio acima do breadcrumb). */
.curso-header {
	max-height: 90vh;
}
.curso-header__cols {
	align-items: center;
	gap: var(--wp--preset--spacing--6);
	margin-top: var(--wp--preset--spacing--4);
}

.curso-header__titulo {
	color: #151544;
	margin: 0 0 var(--wp--preset--spacing--3);
}

.curso-header__resumo {
	max-width: 60ch;
	margin: 0;
	line-height: 1.6;
}

/* Container da imagem: ancora a forma decorativa atrás dela. */
.curso-header__media {
	position: relative;
}

/* Forma decorativa (onda peach, PNG) atrás da imagem, deslocada pra esquerda e
   pra baixo. O container não tem overflow:hidden, então ela sangra sem corte. */
.curso-header__media::before {
	content: "";
	position: absolute;
	left: -20%;
	bottom: -25%;
	width: 82%;
	aspect-ratio: 657 / 391;
	z-index: 0;
	background: url("../images/forma-por-dentro-do-genoma.png") no-repeat center bottom / contain;
	pointer-events: none;
}

/* Imagem destacada com cantos orgânicos — cada canto com um raio diferente. */
.curso-header__img {
	position: relative;
	z-index: 1;
	margin: 0;
	border-radius: 110px 32px 72px 24px;
	overflow: hidden;
}
.curso-header__img img {
	display: block;
	width: 100%;
	height: 100%;
	object-fit: cover;
}

/* Mobile: colunas empilham (core quebra < 782px); alivia o raio orgânico e não
   força 90vh (H1 + imagem empilhados ficariam altos demais). */
@media (max-width: 781px) {
	.curso-header { max-height: none; }
	.curso-header__cols { gap: var(--wp--preset--spacing--4); }
	.curso-header__img { border-radius: 64px 20px 48px 16px; }
}

/* ==========================================================================
   INTERNA DE UNIDADE (single-unidades.html)
   Hero reaproveita .curso-header. Abaixo: títulos de seção, sobre, contato +
   mapa. Conteúdo dinâmico vem dos shortcodes (inc/unidade-single.php).
   ========================================================================== */
.nv-unidade__titulo {
	color: #151544;
	font-size: clamp(1.75rem, 3vw, 2.25rem);
	line-height: 1.2;
	margin: 0 0 var(--wp--preset--spacing--3);
}
.nv-unidade__titulo--center {
	margin-bottom: var(--wp--preset--spacing--5);
}

/* Sobre a unidade */
.nv-unidade-sobre__texto {
	line-height: 1.7;
}
.nv-unidade-sobre__texto p {
	margin: 0 0 1rem;
}
.nv-unidade-sobre__texto p:last-child {
	margin-bottom: 0;
}

/* Contato e localização */
.nv-unidade-contato__cols {
	gap: var(--wp--preset--spacing--6);
	margin-top: var(--wp--preset--spacing--4);
}

.nv-unidade-contato {
	list-style: none;
	margin: 0;
	padding: 0;
	display: flex;
	flex-direction: column;
	gap: var(--wp--preset--spacing--3);
}
.nv-contato-item {
	display: flex;
	align-items: flex-start;
	gap: 0.9rem;
}
.nv-contato-item__ico {
	flex: 0 0 44px;
	width: 44px;
	height: 44px;
	display: inline-flex;
	align-items: center;
	justify-content: center;
	border-radius: 14px;
	background: var(--wp--preset--color--surface);
	color: var(--wp--preset--color--laranja);
}
.nv-contato-item__ico svg {
	width: 22px;
	height: 22px;
}
.nv-contato-item--whatsapp .nv-contato-item__ico {
	color: var(--wp--preset--color--verde);
}
.nv-contato-item__txt {
	padding-top: 0.35rem;
	font-family: var(--wp--preset--font-family--heading);
	font-weight: 600;
	color: #151544;
	line-height: 1.45;
}
.nv-contato-item--endereco .nv-contato-item__txt {
	font-family: var(--wp--preset--font-family--body);
	font-weight: 400;
}
.nv-contato-item__txt a {
	color: inherit;
	text-decoration: none;
}
.nv-contato-item__txt a:hover {
	color: var(--wp--preset--color--primary);
	text-decoration: underline;
}

/* Mapa + Ver rota */
.nv-unidade-mapa__frame {
	position: relative;
	aspect-ratio: 16 / 10;
	border-radius: 24px;
	overflow: hidden;
	border: 1px solid var(--wp--preset--color--borda);
	box-shadow: var(--wp--preset--shadow--md);
}
.nv-unidade-mapa__frame iframe {
	position: absolute;
	inset: 0;
	width: 100%;
	height: 100%;
	border: 0;
	display: block;
}
.nv-unidade-mapa__rota {
	display: inline-flex;
	align-items: center;
	gap: 0.5rem;
	margin-top: var(--wp--preset--spacing--3);
	padding: 0.8rem 1.5rem;
	border-radius: 999px;
	background: var(--wp--preset--color--laranja);
	color: #fff;
	font-family: var(--wp--preset--font-family--heading);
	font-weight: 700;
	font-size: 0.95rem;
	text-decoration: none;
	transition: background 0.2s ease, transform 0.2s ease;
}
.nv-unidade-mapa__rota:hover {
	background: var(--wp--preset--color--primary);
	transform: translateY(-2px);
	text-decoration: none;
}
.nv-unidade-mapa__rota-ico svg {
	display: block;
	width: 20px;
	height: 20px;
}

@media (max-width: 781px) {
	.nv-unidade-contato__cols {
		gap: var(--wp--preset--spacing--4);
	}
}

/* ==========================================================================
   ARCHIVE DE UNIDADES (archive-unidades.html)
   Grid de cards: fachada + caixa branca sobreposta (nome, cursos, contatos,
   "Conheça"). Loop via [nv_cards_unidades].
   ========================================================================== */
/* Header do arquivo: forma peach decorativa no canto inferior direito.
   Reaproveitado também pelo template pagina-simples.html (mesmo padrão de
   hero: breadcrumb + pontilhado + título + intro), por isso o nome da classe
   ficou mais amplo que "unidades" — não renomear sem atualizar as duas
   templates que dependem dela. */
.nv-unidades-hero {
	position: relative;
}
.nv-unidades-hero > * {
	position: relative;
	z-index: 1;
}
.nv-unidades-hero::after {
	content: "";
	position: absolute;
	right: 0;
	bottom: -45px;
	width: min(42%, 420px);
	aspect-ratio: 1230 / 759;
	background: url("../images/forma-header.png") no-repeat right bottom / contain;
	pointer-events: none;
	z-index: 0;
}

/* H1 + intro no mesmo formato das internas (breadcrumb + pontilhado + H1 + texto).
   Essa classe é compartilhada pelo archive-unidades (H1 filho DIRETO do header)
   e pela pagina-simples (H1 dentro de um wrapper "titlewrap"). Por isso o
   max-width NÃO pode ir aqui, na base: no archive-unidades o H1 é filho direto
   de um grupo "constrained", e qualquer max-width menor que o container ativa
   o margin:auto!important forçado do WordPress (.is-layout-constrained >
   :where(...)), centralizando o título — foi exatamente isso que quebrou o
   archive quando o max-width estava aqui. O limite de largura fica só na regra
   escopada abaixo, que atinge apenas o H1 dentro do titlewrap (netos do header,
   filhos de um "is-layout-flow", livres da regra forçada). */
.nv-unidades-hero__titulo {
	color: #151544;
	margin: 0 0 var(--wp--preset--spacing--4);
}
.nv-unidades-hero__titlewrap .nv-unidades-hero__titulo {
	max-width: 780px;
}
.nv-unidades-hero__intro {
	/* dentro do introwrap (layout default), fluxo normal → alinha com o H1. */
	max-width: 60ch;
	margin: 0;
	line-height: 1.6;
}

/* A forma some no mobile/tablet, onde encostaria no texto. */
@media (max-width: 900px) {
	.nv-unidades-hero::after {
		display: none;
	}
}

.nv-unidades-grid {
	display: grid;
	grid-template-columns: repeat(2, 1fr);
	gap: var(--wp--preset--spacing--5);
	/* start (não stretch): a altura do card = a da fachada, senão o grid estica
	   o card além da imagem e o box (ancorado no fundo) sai por baixo dela. */
	align-items: start;
}

/* A fachada preenche o card; a caixa branca flutua DENTRO da imagem, com margem
   em volta (referência). Aspecto fixo → todos os cards com a mesma altura. */
/* Foto 16:9 inteira em cima, caixa branca embaixo, rente às bordas do card.
   Antes a caixa flutuava sobre a foto (absolute, 8px de recuo), o que comia a
   parte de baixo da fachada — e obrigava o slider a esticar a foto pra 3/2 e
   4/3 só pra sobrar fachada à vista. Empilhado, a foto aparece inteira na
   proporção original e esses remendos deixam de existir.
   O raio e o recorte passam pro card: assim foto e caixa terminam no mesmo
   arredondamento, sem cada uma carregar o seu. */
.nv-unidade-card {
	position: relative;
	overflow: hidden;
	border-radius: 30px;
	background: var(--wp--preset--color--white);
	box-shadow: 0 14px 32px rgba(40, 40, 91, 0.18);
	transition: transform 0.25s ease;
}
/* Hover: cresce e inclina levemente, igual às cards de curso. */
@media (prefers-reduced-motion: no-preference) {
	.nv-unidade-card:hover {
		transform: scale(1.05) rotate(-1deg);
		z-index: 2;
	}
}
.nv-unidade-card__foto {
	display: block;
	margin: 0;
}
.nv-unidade-card__foto a {
	display: block;
}
.nv-unidade-card__foto img {
	display: block;
	width: 100%;
	aspect-ratio: 16 / 9;
	object-fit: cover;
}
.nv-unidade-card__box {
	padding: var(--wp--preset--spacing--3);
}
/* Sem fachada: só a moldura, já que não há foto pra separar da caixa. */
.nv-unidade-card:not(:has(.nv-unidade-card__foto)) {
	border: 1px solid var(--wp--preset--color--borda);
	box-shadow: none;
}

.nv-unidade-card__nome {
	margin: 0;
	color: #28285B;
	font-family: var(--wp--preset--font-family--heading);
	font-weight: 800;
	font-size: 1.4rem;
	line-height: 1.2;
}
.nv-unidade-card__cursos {
	margin: 0.35rem 0 0;
	color: var(--wp--preset--color--text-muted);
	font-size: 0.85rem;
	line-height: 1.7;
}
/* Cada curso com uma bolinha na cor do curso; nowrap mantém bolinha+nome juntos. */
.nv-unidade-card__curso {
	display: inline-block;
	white-space: nowrap;
	margin-right: 0.7em;
}
.nv-unidade-card__dot {
	display: inline-block;
	width: 6px;
	height: 6px;
	border-radius: 50%;
	margin-right: 0.4em;
	vertical-align: middle;
	opacity: 0.55;
}

.nv-unidade-card__acoes {
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: var(--wp--preset--spacing--2);
	margin-top: var(--wp--preset--spacing--3);
}
.nv-unidade-card__contatos {
	display: inline-flex;
	gap: 0.5rem;
}
.nv-unidade-card__ico {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	width: 42px;
	height: 42px;
	border-radius: 50%;
	border: 1.5px solid var(--wp--preset--color--borda);
	color: var(--wp--preset--color--marinho);
	transition: background-color 0.2s ease, color 0.2s ease, border-color 0.2s ease;
}
.nv-unidade-card__ico svg {
	width: 18px;
	height: 18px;
}
.nv-unidade-card__ico:hover {
	background: var(--wp--preset--color--laranja);
	border-color: var(--wp--preset--color--laranja);
	color: #fff;
}
.nv-unidade-card__link {
	display: inline-flex;
	align-items: center;
	gap: 0.35rem;
	font-family: var(--wp--preset--font-family--heading);
	font-weight: 700;
	color: #28285B;
	text-decoration: none;
	white-space: nowrap;
}
.nv-unidade-card__seta {
	width: 14px;
	height: auto;
	transition: transform 0.2s ease;
}
.nv-unidade-card__link:hover {
	color: var(--wp--preset--color--primary);
	text-decoration: none;
}
.nv-unidade-card__link:hover .nv-unidade-card__seta {
	transform: translateX(4px);
}

@media (max-width: 700px) {
	.nv-unidades-grid {
		grid-template-columns: 1fr;
	}
}

/* ==========================================================================
   UNIDADES NA HOME — mesmo card do archive, em esteira horizontal (swipe).
   Mesma técnica de scroll-snap do .nv-cursos-cards: o swipe é nativo, sem JS;
   as setas (assets/js/unidades-slider.js) são só um atalho de clique.
   ========================================================================== */
.nv-unidades-home {
	position: relative;
}
.nv-unidades-home > .wp-block-heading {
	font-size: 28px;
	color: #151544;
}
.nv-unidades-home > .wp-block-paragraph {
	max-width: 930px;
	margin-inline: auto;
}

/* Mesmo tratamento do .nv-formacao: abaixo do contentSize o texto encostaria
   na borda, porque o "constrained" só limita, não cria gutter. */
@media (max-width: 1199px) {
	.nv-unidades-home > .wp-block-heading,
	.nv-unidades-home > .wp-block-paragraph {
		padding-left: 20px;
		padding-right: 20px;
	}
}

.nv-unidades-slider__track {
	display: flex;
	--nv-gap: var(--wp--preset--spacing--4);
	/* fatia do 3º card que fica à mostra — o convite pro swipe */
	--nv-espia: 104px;
	gap: var(--nv-gap);
	/* mesma linha de 1440px do resto da home; o padding lateral é o gutter e
	   o vertical dá espaço pro scale(1.05) do hover não ser cortado. */
	max-width: 1440px;
	margin-inline: auto;
	padding: 20px 20px 44px;
	/* safe center: quando todos cabem, centralizados; quando não cabem, cai
	   pra "start" e o corte vai pra direita — o swipe. */
	justify-content: safe center;
	overflow-x: auto;
	scroll-snap-type: x proximity;
	scroll-padding-left: 20px;
	scrollbar-width: none;          /* Firefox */
	-webkit-overflow-scrolling: touch;
}
.nv-unidades-slider__track::-webkit-scrollbar { display: none; } /* Chrome/Safari/Edge */

/* Largura calculada a partir do container: sempre 2 cards inteiros + a fatia
   do 3º, em qualquer largura de tela. Visível na linha = W + gap + W + gap +
   espia = 100%, logo W = (100% - 2*gap - espia) / 2. Não encolhe (flex 0 0),
   então o resto estoura pra direita e vira swipe. */
.nv-unidades-slider__track .nv-unidade-card {
	flex: 0 0 calc((100% - var(--nv-gap) * 2 - var(--nv-espia)) / 2);
	scroll-snap-align: start;
}

/* Rodapé: link "Conheça todas" à esquerda, setas à direita, na mesma linha
   de 1440px + 20px de gutter do restante da seção. */
.nv-unidades-home__rodape {
	max-width: 1440px;
	margin-inline: auto;
	padding-inline: 20px;
}

.nv-unidades-slider__nav {
	display: inline-flex;
	gap: var(--wp--preset--spacing--3);
}
.nv-unidades-slider__seta {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	/* 44px: alvo de toque mínimo (WCAG 2.5.8) mesmo o ícone sendo menor. */
	width: 44px;
	height: 44px;
	padding: 0;
	background: none;
	border: none;
	border-radius: 50%;
	color: var(--wp--preset--color--laranja);
	cursor: pointer;
	transition: background-color 0.2s ease, transform 0.2s ease;
}
.nv-unidades-slider__seta svg {
	width: 22px;
	height: 22px;
}
.nv-unidades-slider__seta:hover {
	background: color-mix(in srgb, var(--wp--preset--color--laranja) 12%, transparent);
}

/* Abaixo disso o cálculo de "2 + fatia" deixaria o card estreito demais e a
   caixa branca comeria a foto (medido: a 1024px a caixa ocupava 87% da altura
   da foto, contra 45% no archive). Passa a um card por vez, com o seguinte
   espiando — mesmo convite ao swipe, em escala legível. */
@media (max-width: 1200px) {
	.nv-unidades-slider__track .nv-unidade-card {
		flex-basis: min(85vw, 520px);
	}
	.nv-unidades-home__rodape {
		flex-wrap: wrap;
		gap: var(--wp--preset--spacing--3);
	}
}

/* ==========================================================================
   ACONTECE NO GENOMA — blog na home: 3 destaques evergreen (mesmo card do
   archive, .nv-post-card) + lista de Comunicados + lista do Genoma Cast.
   Tudo wp:query nativo; aqui só o acabamento das duas listas novas.
   ========================================================================== */
.nv-acontece__box > .wp-block-heading {
	font-size: 28px;
	color: #151544;
	margin-bottom: var(--wp--preset--spacing--5);
}

/* O <ul> do post-template herda o reset de lista de texto corrido
   (".wp-block-post-content ul", padding-left 1.4em) — como a home inteira vive
   dentro do post-content, sem zerar aqui as listas saem indentadas. */
.nv-acontece .wp-block-post-template {
	margin: 0 !important;
	padding: 0 !important;
	list-style: none !important;
}
/* margin-block-start é o blockGap do tema (24px) aplicado a todo li que não é
   o primeiro — ele SOMA com o gap do flex das listas abaixo (16 + 24 = 40).
   Zerar aqui e deixar só o gap mandando no espaçamento. */
.nv-acontece .wp-block-post-template > li {
	margin-block-start: 0 !important;
	margin-bottom: 0 !important;
}

.nv-acontece__listas {
	margin-top: var(--wp--preset--spacing--6);
	gap: var(--wp--preset--spacing--6);
}
.nv-acontece__listas .wp-block-heading {
	margin: 0 0 var(--wp--preset--spacing--3);
	font-size: 1.4rem;
	color: #151544;
}

/* Altura igual entre Comunicados e Genoma Cast: as colunas do wp:columns já
   esticam juntas, então basta a cadeia coluna → query → lista → item herdar
   essa altura e os 5 itens se dividirem por igual (flex:1). Assim as duas
   listas terminam exatamente na mesma linha, mesmo com títulos de tamanhos
   diferentes. */
.nv-acontece__listas > .wp-block-column {
	display: flex;
	flex-direction: column;
}
.nv-acontece__listas .wp-block-query {
	display: flex;
	flex: 1;
}
.nv-lista-simples,
.nv-lista-cast {
	flex: 1;
}
.nv-lista-simples > li,
.nv-lista-cast > li {
	display: flex;
	flex: 1;
}
.nv-lista-simples__item,
.nv-lista-cast__item {
	flex: 1;
}

/* ── Comunicados: caixa clara, data miúda + título ── */
.nv-lista-simples {
	display: flex !important;
	flex-direction: column;
	gap: var(--wp--preset--spacing--2) !important;
}
.nv-lista-simples__item {
	display: flex;
	flex-direction: column;
	justify-content: center;
	background: var(--wp--preset--color--surface);
	border: 1px solid var(--wp--preset--color--borda);
	border-radius: 14px;
	padding: 0.85rem 1.1rem;
	transition: border-color 0.2s ease;
}
.nv-lista-simples__item:hover {
	border-color: var(--wp--preset--color--laranja);
}
.nv-lista-simples__data {
	margin: 0 0 0.2rem;
	font-family: var(--wp--preset--font-family--heading);
	font-weight: 600;
	font-size: 0.72rem;
	color: #585858;
}
.nv-lista-simples__titulo {
	margin: 0;
	font-size: 0.95rem;
	line-height: 1.35;
	color: #28285B;
}
.nv-lista-simples__titulo a {
	color: inherit;
	text-decoration: none;
}
.nv-lista-simples__titulo a:hover {
	color: var(--wp--preset--color--laranja);
	text-decoration: none;
}

/* ── Genoma Cast: item escuro, thumb + título + play à direita ── */
.nv-lista-cast {
	display: flex !important;
	flex-direction: column;
	gap: var(--wp--preset--spacing--2) !important;
}
.nv-lista-cast__item {
	position: relative;
	gap: var(--wp--preset--spacing--2) !important;
	/* padding-right abre espaço pro disco de play não encostar no título */
	padding: 0.6rem 3.4rem 0.6rem 0.6rem;
	background: #151515;
	border-radius: 14px;
}
.nv-lista-cast__thumb {
	flex: 0 0 auto;
	margin: 0 !important;
}
.nv-lista-cast__thumb img {
	display: block;
	width: 64px;
	height: 44px;
	object-fit: cover;
	border-radius: 8px;
}
.nv-lista-cast__titulo {
	margin: 0 !important;
	font-size: 0.9rem;
	line-height: 1.3;
	color: #fff;
}
.nv-lista-cast__titulo a {
	color: inherit;
	text-decoration: none;
}
/* Link esticado: o item inteiro (incluindo o disco de play) vira área
   clicável, sem precisar de um segundo link na thumb. */
.nv-lista-cast__titulo a::before {
	content: "";
	position: absolute;
	inset: 0;
	z-index: 1;
	border-radius: inherit;
}
.nv-lista-cast__item:hover .nv-lista-cast__titulo a {
	text-decoration: none;
	color: var(--wp--preset--color--laranja);
}
/* Disco de play — decorativo (o clique é do link esticado acima). */
.nv-lista-cast__item::after {
	content: "";
	position: absolute;
	right: 1rem;
	top: 50%;
	transform: translateY(-50%);
	z-index: 2;
	width: 26px;
	height: 26px;
	border-radius: 50%;
	background-color: var(--wp--preset--color--laranja);
	background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='%23ffffff'%3E%3Cpath d='M8 5v14l11-7z'/%3E%3C/svg%3E");
	background-repeat: no-repeat;
	background-position: center;
	background-size: 12px 12px;
	pointer-events: none;
}

@media (max-width: 781px) {
	.nv-acontece__listas {
		gap: var(--wp--preset--spacing--5);
	}
	/* !important vence o style inline do bloco (3rem): em tela estreita esse
	   padding comia 96px dos 350px da caixa, espremendo os cards.
	   Lateral em 20px, e não nos 32px do vertical, porque 20px é a calha do
	   site no mobile — o mesmo padding do header e do palco do hero. Assim o
	   conteúdo da caixa alinha com a logo e com o banner em vez de recuar
	   sozinho 12px a mais. */
	.nv-acontece__box {
		padding: var(--wp--preset--spacing--4) 20px !important;
		border-radius: 20px !important;
	}
}

/* ==========================================================================
   NOSSO DNA — grid de diferenciais (página /por-dentro-do-genoma/). Card: foto
   16:9 + corpo com título e resumo. Loop nativo wp:query.
   ========================================================================== */
.nv-dna-grid {
	/* !important necessário: o reset de tipografia ".wp-block-post-content ul"
	   (padding-left: 1.4em, pensado pra lista de texto corrido) tem mais
	   especificidade que ".nv-dna-grid" sozinho e vence — o grid saía
	   indentado só à esquerda (assimétrico) em vez de simétrico. */
	margin: 0 !important;
	padding: 0 !important;
	list-style: none !important;
	gap: var(--wp--preset--spacing--4) !important;
}
.nv-dna-card {
	position: relative;
	display: flex;
	flex-direction: column;
	background: var(--wp--preset--color--white);
	border: 1px solid var(--wp--preset--color--borda);
	border-radius: 20px;
	overflow: hidden;
	transition: transform 0.25s ease, box-shadow 0.25s ease;
}
@media (prefers-reduced-motion: no-preference) {
	.nv-dna-card:hover {
		transform: scale(1.05) rotate(-1deg);
		z-index: 2;
	}
}
.nv-dna-card:hover {
	box-shadow: 0 14px 32px rgba(40, 40, 91, 0.14);
}
.nv-dna-card__img {
	margin: 0;
	display: block;
}
.nv-dna-card__img img {
	display: block;
	width: 100%;
	aspect-ratio: 16 / 9;
	object-fit: cover;
}
.nv-dna-card__body {
	display: flex;
	flex-direction: column;
	flex: 1;
	padding: var(--wp--preset--spacing--3) var(--wp--preset--spacing--4) var(--wp--preset--spacing--4);
}
.nv-dna-card__titulo {
	margin: 0 0 0.5rem;
	font-size: 1.15rem;
	line-height: 1.3;
	color: #28285B;
}
.nv-dna-card__titulo a {
	color: inherit;
	text-decoration: none;
}
.nv-dna-card__titulo a:hover {
	color: var(--wp--preset--color--laranja);
	text-decoration: none;
}
.nv-dna-card__resumo {
	margin: 0;
	color: var(--wp--preset--color--text-muted);
	font-size: 0.92rem;
	line-height: 1.6;
}

@media (max-width: 900px) {
	.nv-dna-grid {
		grid-template-columns: repeat(2, 1fr) !important;
	}
}
@media (max-width: 600px) {
	.nv-dna-grid {
		grid-template-columns: 1fr !important;
	}
}

.nv-dna-intro {
	max-width: 820px !important;
	margin-left: 0 !important;
	margin-right: auto !important;
	text-align: left;
	padding-bottom: 60px;
}

.nv-dna-cta {
	max-width: 680px;
	margin-left: auto !important;
	margin-right: auto !important;
	padding-top: 60px;
	padding-bottom: 60px;
	text-align: center;
}
.nv-dna-cta .wp-block-buttons {
	justify-content: center;
}

.nv-dna-faq {
	max-width: 780px;
	margin-left: auto !important;
	margin-right: auto !important;
	text-align: center;
}
.nv-dna-faq #rank-math-faq,
.nv-dna-faq .rank-math-question,
.nv-dna-faq .rank-math-answer {
	text-align: left;
}

/* ==========================================================================
   FORMULÁRIO — seção de conversão (última antes do rodapé). Âncora #estude-no-genoma
   ========================================================================== */
.nv-formulario__cols {
	gap: var(--wp--preset--spacing--6);
	align-items: center;
}

.nv-formulario__texto h2 {
	color: #151544;
	font-size: clamp(1.75rem, 3.2vw, 2.25rem);
	line-height: 1.2;
	margin: 0 0 var(--wp--preset--spacing--3);
}
.nv-formulario__texto p {
	line-height: 1.6;
}

/* Lista de diferenciais com check laranja. */
.nv-form-lista {
	list-style: none;
	margin: var(--wp--preset--spacing--3) 0 0;
	padding: 0;
}
.nv-form-lista li {
	position: relative;
	padding-left: 2rem;
	margin-block: 0.7rem;
	font-family: var(--wp--preset--font-family--heading);
	font-weight: 700;
	color: #151544;
}
.nv-form-lista li::before {
	content: "";
	position: absolute;
	left: 0;
	top: 0.12em;
	width: 1.25rem;
	height: 1.25rem;
	background-color: var(--wp--preset--color--laranja);
	-webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='%23000'%3E%3Cpath d='M9 16.17 4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z'/%3E%3C/svg%3E") no-repeat center / contain;
	mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='%23000'%3E%3Cpath d='M9 16.17 4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z'/%3E%3C/svg%3E") no-repeat center / contain;
}

.nv-formulario__nota {
	margin-top: var(--wp--preset--spacing--4);
	font-style: italic;
}

/* Card branco do formulário — estilo do design system (não é background de
   seção editável), por isso via CSS: evita o padding padrão do has-background
   e a fragilidade de ordem do style inline na validação do bloco. */
/* Padding horizontal menor (32px) de propósito: o Forminator colapsa as colunas
   (forminator-size--small) quando o form mede <= 480px de largura. Com 48px de
   padding o form caía em 472px e empilhava tudo; com 32px sobe pra ~504px e o
   layout de 2 colunas configurado no builder passa a valer. */
.nv-form-card {
	background: var(--wp--preset--color--white);
	border-radius: 28px;
	padding: var(--wp--preset--spacing--5) var(--wp--preset--spacing--4);
	box-shadow: 0 20px 48px rgba(40, 40, 91, 0.08);
}
.nv-form-card .forminator-ui {
	margin: 0;
}

@media (max-width: 781px) {
	.nv-formulario__cols { gap: var(--wp--preset--spacing--4); }
	.nv-form-card { padding: var(--wp--preset--spacing--4); }
}

/* ==========================================================================
   FORMINATOR — estilização global de TODOS os formulários do site (design
   system Genoma). Cada form do Forminator gera um CSS próprio por ID
   (#forminator-module-XXXX, ex: wp-content/uploads/forminator/XXXX/css/
   style-XXXX.css) com cores do preset "Default/Theme" do PLUGIN — que não
   tem relação nenhuma com o theme.json do site (é só o nome de um preset
   interno do Forminator). Esse CSS por formulário é aplicado com um ID no
   seletor, então tem mais especificidade que qualquer classe daqui — por
   isso as regras abaixo usam !important (mesmo padrão já usado no resto do
   arquivo pra vencer estilo gerado por plugin/WordPress). Como o alvo é
   ".forminator-ui" (raiz de TODO form do Forminator, não só o 178330), isso
   cobre o formulário atual e qualquer outro form/página nova no projeto,
   sem precisar repetir a regra por ID de formulário.
   ========================================================================== */

.forminator-ui {
	font-family: var(--wp--preset--font-family--body) !important;
}

.forminator-ui .forminator-row {
	margin-bottom: var(--wp--preset--spacing--3);
}

/* Label + asterisco de obrigatório. */
.forminator-ui .forminator-label {
	font-family: var(--wp--preset--font-family--body) !important;
	font-size: var(--wp--preset--font-size--sm) !important;
	font-weight: 700 !important;
	color: var(--wp--preset--color--marinho) !important;
	margin-bottom: 0.5em;
}
.forminator-ui .forminator-required {
	color: var(--wp--preset--color--laranja) !important;
}
.forminator-ui .forminator-description,
.forminator-ui .forminator-description p {
	font-family: var(--wp--preset--font-family--body) !important;
	color: var(--wp--preset--color--text-muted) !important;
}

/* Campos de texto/e-mail/telefone — o input do telefone (intl-tel-input)
   também recebe a classe .forminator-input, então a mesma regra já cobre
   os dois sem precisar de seletor à parte. */
.forminator-ui .forminator-input {
	border: 1.5px solid var(--wp--preset--color--borda) !important;
	border-radius: 14px !important;
	background-color: var(--wp--preset--color--white) !important;
	padding: 0 1.1em !important;
	min-height: 52px !important;
	font-family: var(--wp--preset--font-family--body) !important;
	font-size: var(--wp--preset--font-size--base) !important;
	color: var(--wp--preset--color--ink) !important;
	box-shadow: none !important;
	transition: border-color 0.2s ease, box-shadow 0.2s ease;
}
.forminator-ui .forminator-input::placeholder {
	color: var(--wp--preset--color--text-muted);
	opacity: 1;
}
.forminator-ui .forminator-input:focus {
	border-color: var(--wp--preset--color--laranja) !important;
	outline: none !important;
	box-shadow: 0 0 0 3px rgba(241, 86, 34, 0.15) !important;
}
.forminator-ui .forminator-field.forminator-has_error .forminator-input {
	border-color: #e51919 !important;
}

/* Textarea (campo "Mensagem") — o core não usa .forminator-input aqui, é uma
   classe própria (.forminator-textarea), então fica sem a regra acima. */
.forminator-ui .forminator-textarea {
	border: 1.5px solid var(--wp--preset--color--borda) !important;
	border-radius: 14px !important;
	background-color: var(--wp--preset--color--white) !important;
	padding: 0.9em 1.1em !important;
	min-height: 130px !important;
	font-family: var(--wp--preset--font-family--body) !important;
	font-size: var(--wp--preset--font-size--base) !important;
	color: var(--wp--preset--color--ink) !important;
	box-shadow: none !important;
	transition: border-color 0.2s ease, box-shadow 0.2s ease;
}
.forminator-ui .forminator-textarea::placeholder {
	color: var(--wp--preset--color--text-muted);
	opacity: 1;
}
.forminator-ui .forminator-textarea:focus {
	border-color: var(--wp--preset--color--laranja) !important;
	outline: none !important;
	box-shadow: 0 0 0 3px rgba(241, 86, 34, 0.15) !important;
}
.forminator-ui .forminator-field.forminator-has_error .forminator-textarea {
	border-color: #e51919 !important;
}

/* Select (Select2) — caixa fechada. O painel de opções aberto é um portal
   fora de .forminator-ui (ver seletores globais .select2-* mais abaixo). */
.forminator-ui .forminator-select2 + .forminator-select .selection .select2-selection--single {
	display: flex !important;
	align-items: center !important;
	height: 52px !important;
	border: 1.5px solid var(--wp--preset--color--borda) !important;
	border-radius: 14px !important;
	background-color: var(--wp--preset--color--white) !important;
	padding: 0 1.1em !important;
}
.forminator-ui .select2-selection__rendered {
	font-family: var(--wp--preset--font-family--body) !important;
	font-size: var(--wp--preset--font-size--base) !important;
	color: var(--wp--preset--color--ink) !important;
	padding: 0 !important;
}
.forminator-ui .select2-selection__placeholder {
	color: var(--wp--preset--color--text-muted) !important;
}
.forminator-ui .select2-selection__arrow {
	color: var(--wp--preset--color--text-muted) !important;
	height: 100% !important;
}
.forminator-ui .forminator-select2 + .forminator-select .selection .select2-selection--single:hover,
.forminator-ui .forminator-select2 + .forminator-select.select2-container--open .selection .select2-selection--single {
	border-color: var(--wp--preset--color--laranja) !important;
	background-color: var(--wp--preset--color--white) !important;
}
.forminator-ui .forminator-select2 + .forminator-select .selection .select2-selection--single:hover .select2-selection__arrow,
.forminator-ui .forminator-select2 + .forminator-select.select2-container--open .selection .select2-selection--single .select2-selection__arrow {
	color: var(--wp--preset--color--laranja) !important;
}
.forminator-ui .forminator-field.forminator-has_error .select2-selection--single {
	border-color: #e51919 !important;
}

/* Painel de opções do Select2 — renderiza fora de .forminator-ui (portal),
   por isso o seletor é global. Afeta só o dropdown do próprio Select2. */
.select2-dropdown,
.forminator-select-dropdown {
	border-color: var(--wp--preset--color--borda) !important;
	border-radius: 14px !important;
	overflow: hidden;
	font-family: var(--wp--preset--font-family--body) !important;
}
.select2-results__option {
	background-color: var(--wp--preset--color--white) !important;
	font-size: var(--wp--preset--font-size--base) !important;
}
.select2-results__option--highlighted {
	background-color: var(--wp--preset--color--surface) !important;
	color: var(--wp--preset--color--ink) !important;
}
.select2-results__option--selected {
	background-color: var(--wp--preset--color--laranja) !important;
	color: var(--wp--preset--color--white) !important;
}

/* Checkbox (consentimento LGPD e checkboxes normais). */
.forminator-ui .forminator-checkbox-box {
	width: 22px !important;
	height: 22px !important;
	border: 1.5px solid var(--wp--preset--color--borda) !important;
	border-radius: 6px !important;
	background-color: var(--wp--preset--color--white) !important;
	color: var(--wp--preset--color--white) !important;
}
.forminator-ui .forminator-checkbox:hover .forminator-checkbox-box,
.forminator-ui .forminator-checkbox input:focus-visible + .forminator-checkbox-box {
	border-color: var(--wp--preset--color--laranja) !important;
}
.forminator-ui .forminator-checkbox input:checked + .forminator-checkbox-box {
	border-color: var(--wp--preset--color--laranja) !important;
	background-color: var(--wp--preset--color--laranja) !important;
	color: var(--wp--preset--color--white) !important;
}
.forminator-ui .forminator-has_error .forminator-checkbox-box {
	border-color: #e51919 !important;
}
.forminator-ui .forminator-checkbox__label,
.forminator-ui .forminator-checkbox__label p {
	font-family: var(--wp--preset--font-family--body) !important;
	font-size: var(--wp--preset--font-size--sm) !important;
	color: var(--wp--preset--color--text-muted) !important;
}
.forminator-ui .forminator-checkbox__label a {
	color: var(--wp--preset--color--primary) !important;
}

/* Botão de enviar — mesma linguagem visual do .btn-cta global (pílula
   laranja vibrante + sombra dura marinho), sem o disco/seta (só texto,
   centralizado). Não dá pra aplicar a classe .btn-cta direto (o Forminator
   gera o próprio <button>), então a aparência é replicada aqui com os
   mesmos tokens. */
.forminator-ui .forminator-button-submit {
	display: inline-flex !important;
	align-items: center !important;
	justify-content: center !important;
	min-height: 44px !important;
	width: auto !important;
	padding: 0.95rem 2rem !important;
	border: none !important;
	border-radius: 999px !important;
	background-color: var(--wp--preset--color--laranja) !important;
	color: var(--wp--preset--color--white) !important;
	font-family: var(--wp--preset--font-family--heading) !important;
	font-weight: 800 !important;
	font-size: 0.95rem !important;
	line-height: 1.2;
	box-shadow: 0 5px 0 var(--nv-marinho) !important;
	cursor: pointer;
	transition: box-shadow 0.22s ease, transform 0.22s ease;
}
.forminator-ui .forminator-button-submit:hover {
	box-shadow: 0 3px 0 var(--nv-marinho) !important;
}
.forminator-ui .forminator-button-submit:active {
	box-shadow: 0 0 0 var(--nv-marinho) !important;
}
@media (prefers-reduced-motion: no-preference) {
	.forminator-ui .forminator-button-submit:hover {
		transform: translateY(2px);
	}
}

/* Linha do botão de enviar alinhada à direita do formulário. */
.forminator-ui .forminator-row-last {
	text-align: right;
}

/* Mensagens de resposta (sucesso/erro no envio) e erro por campo. */
.forminator-ui .forminator-response-message {
	border-radius: 12px !important;
	font-family: var(--wp--preset--font-family--body) !important;
}
.forminator-ui .forminator-response-message.forminator-error {
	background-color: #fdecea !important;
	color: var(--wp--preset--color--ink) !important;
}
.forminator-ui .forminator-response-message.forminator-success {
	background-color: var(--wp--preset--color--surface) !important;
	color: var(--wp--preset--color--ink) !important;
}
.forminator-ui .forminator-error-message {
	font-family: var(--wp--preset--font-family--body) !important;
	color: #e51919 !important;
}

/* Anel de foco visível (acessibilidade, teclado) do Forminator vem em azul
   genérico (#254DEB) — mantido por WCAG 2.4.7 (nunca remover foco visível
   sem substituto), só recolorido pra combinar com a marca. */
.forminator-ui *:focus-visible,
.select2-container *:focus-visible,
.select2-results__option--highlighted {
	outline-color: var(--wp--preset--color--laranja) !important;
}

/* Seletor de país do campo de telefone (intl-tel-input) — o dropdown de
   países também é um portal fora de .forminator-ui. */
.iti__country-list {
	font-family: var(--wp--preset--font-family--body) !important;
	border-radius: 10px !important;
	border-color: var(--wp--preset--color--borda) !important;
}
.iti__country.iti__highlight {
	background-color: var(--wp--preset--color--surface) !important;
}

/* ==========================================================================
   CURSO — Apresentação (vídeo + texto)
   ========================================================================== */
.nv-curso-apresentacao__cols {
	gap: var(--wp--preset--spacing--6);
	align-items: center;
}

/* Vídeo: bordas orgânicas irregulares (cada canto um raio), sombra amarela dura
   e leve inclinação de -2°. A sombra e a inclinação sangram pra fora — a seção
   não tem overflow:hidden, e a coluna de texto ganha respiro pelo gap. */
.curso-video .wp-block-embed__wrapper {
	border-radius: 44px 18px 40px 20px;
	overflow: hidden;
	box-shadow: 12px 18px 0 0 #F5B400;
	transform: rotate(-1deg);
}
.curso-video iframe {
	display: block;
	border: 0;
}

/* Mobile: sem inclinação (evita corte lateral) e sombra menor. */
@media (max-width: 781px) {
	.nv-curso-apresentacao__cols { gap: var(--wp--preset--spacing--4); }
	.curso-video .wp-block-embed__wrapper {
		transform: none;
		box-shadow: 8px 12px 0 0 #F5B400;
	}
}

/* ==========================================================================
   CURSO — Proposta pedagógica (4 pilares em cards)
   ========================================================================== */
/* H2 centralizado, 42px. */
.nv-proposta > .nv-proposta__titulo {
	color: #151544;
	font-size: 42px;
	max-width: 24ch;
	text-align: center;
	margin: 0 auto var(--wp--preset--spacing--3) !important;
}
/* Parágrafo: texto à esquerda, mas a div centralizada (margin auto L/R). A
   largura termina na borda direita do 3º card: área de conteúdo real é 1392px
   (contentSize 1440 menos 24px de padding de cada lado), gap 24px →
   col = 330px → 3 colunas + 2 gaps = 330*3 + 24*2 = 1038px. */
.nv-proposta > .nv-proposta__intro {
	max-width: 1038px;
	text-align: left;
	margin: 0 auto !important;
	line-height: 1.6;
}

/* Grid dos 4 cards (CSS grid próprio pra controlar a responsividade). */
.nv-pilares {
	display: grid;
	grid-template-columns: repeat(4, 1fr);
	gap: var(--wp--preset--spacing--3);
	margin-top: var(--wp--preset--spacing--5);
}
.nv-pilares > * { margin-block: 0; }

/* Card: número no topo, título empurrado pra base (margin-top:auto) e o mini
   texto logo abaixo com um respiro. Cada card tem sua cor da marca em --cor. */
.nv-pilar {
	display: flex;
	flex-direction: column;
	min-height: 320px;
	padding: var(--wp--preset--spacing--4);
	border: 1.5px solid var(--wp--preset--color--borda);
	border-radius: 22px;
	background: var(--wp--preset--color--white);
	color: #1A1A1A;
	transition: transform 0.3s ease, background-color 0.3s ease, color 0.3s ease, border-color 0.3s ease, box-shadow 0.3s ease;
}
.nv-pilar__num {
	margin: 0;
	font-family: var(--wp--preset--font-family--heading);
	font-weight: 700;
	font-size: 1rem;
	opacity: 0.5;
}
.nv-pilar__titulo {
	margin: auto 0 0;          /* empurra título + texto pra base do card */
	font-size: 1.3rem;
	line-height: 1.2;
	color: inherit;
}
.nv-pilar__texto {
	margin: 0.85rem 0 0;       /* espaço entre o H3 e o mini texto */
	font-size: 0.95rem;
	line-height: 1.55;
	color: inherit;
	opacity: 0.82;
}

/* Cores da marca por card (uma em cada). --cor = fundo no estado ativo/hover;
   --cor-texto = cor do texto pra dar contraste sobre esse fundo. */
.nv-pilar--1 { --cor: #F15622; --cor-texto: #ffffff; }
.nv-pilar--2 { --cor: #6F2681; --cor-texto: #ffffff; }
.nv-pilar--3 { --cor: #F5B400; --cor-texto: #5C4600; }
.nv-pilar--4 { --cor: #079C5F; --cor-texto: #ffffff; }

/* Estado ativo (um card já nasce colorido) + hover pintam com a cor da marca. */
.nv-pilar.is-ativo,
.nv-pilar:hover {
	background: var(--cor);
	border-color: var(--cor);
	color: var(--cor-texto);
}

/* Hover: cresce, inclina levemente e ganha sombra. Respeita reduced-motion. */
@media (prefers-reduced-motion: no-preference) {
	.nv-pilar:hover {
		transform: scale(1.05) rotate(-1deg);
		box-shadow: 0 18px 40px rgba(0, 0, 0, 0.14);
	}
}

@media (max-width: 1024px) {
	.nv-pilares { grid-template-columns: repeat(2, 1fr); }
}
@media (max-width: 560px) {
	.nv-pilares { grid-template-columns: 1fr; }
	.nv-pilar { min-height: 220px; }
}

/* ==========================================================================
   CURSO — Por dentro do Genoma Start (foto de fundo + curvas + parallax)
   ========================================================================== */
/* O full-bleed do .nv-start usa 100vw, que inclui a largura da scrollbar e gera
   um scroll horizontal de ~15px em navegadores com scrollbar clássica (Windows).
   clip no wrapper raiz remove o estouro sem criar container de scroll (não
   quebra position:sticky, ao contrário de overflow:hidden). */
.wp-site-blocks {
	overflow-x: clip;
}

.nv-start {
	position: relative;
	color: #fff;
	background-color: #043c26;
	/* full-bleed: rompe a largura do container (post-content) e ocupa 100vw. */
	width: 100vw;
	margin-inline: calc(50% - 50vw);
	/* A FOTO vem do background do BLOCO (editável no Gutenberg, aplicada
	   server-side, com parallax via background-attachment:fixed no atributo).
	   Overlay e curvas ficam nos pseudo-elementos abaixo. */
}
/* conteúdo (título, intro, grid) acima do overlay e das curvas */
.nv-start > * {
	position: relative;
	z-index: 2;
}
/* overlay verde sobre a foto */
.nv-start::before {
	content: "";
	position: absolute;
	inset: 0;
	z-index: 0;
	background: linear-gradient(rgba(4, 60, 37, 0.88), rgba(5, 97, 59, 0.80));
	pointer-events: none;
}
/* curvas (sorriso) no topo e na base, na cor do fundo da página */
.nv-start::after {
	content: "";
	position: absolute;
	inset: 0;
	z-index: 1;
	pointer-events: none;
	background-image:
		url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 1440 70' preserveAspectRatio='none'%3E%3Cpath d='M0 0 H1440 Q720 70 0 0 Z' fill='%23FAF8F5'/%3E%3C/svg%3E"),
		url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 1440 70' preserveAspectRatio='none'%3E%3Cpath d='M0 0 Q720 70 1440 0 V70 H0 Z' fill='%23FAF8F5'/%3E%3C/svg%3E");
	background-position: top center, bottom center;
	background-size: 100% 70px, 100% 70px;
	background-repeat: no-repeat;
}

.nv-start__titulo {
	color: #fff;
	text-align: center;
	margin: 0 auto var(--wp--preset--spacing--3);
}
.nv-start__intro {
	color: rgba(255, 255, 255, 0.9);
	text-align: center;
	max-width: 80ch;
	margin: 0 auto;
	line-height: 1.6;
	/* equilibra as linhas e evita a última palavra sozinha (linha órfã). */
	text-wrap: balance;
}

/* Grid 3 por linha (8 diferenciais + 1 card de CTA). */
.nv-start-grid {
	display: grid;
	grid-template-columns: repeat(3, 1fr);
	/* auto-rows 1fr = todas as linhas com a altura da linha mais alta, então
	   todos os boxes ficam com a mesma altura independente do texto. */
	grid-auto-rows: 1fr;
	gap: var(--wp--preset--spacing--3);
	margin-top: var(--wp--preset--spacing--6);
}
.nv-start-grid > * { margin-block: 0; }

.nv-start-card {
	display: flex;
	flex-direction: column;
	padding: var(--wp--preset--spacing--4);
	background: #fff;
	border-radius: 20px;
	color: #1A1A1A;
	box-shadow: 0 10px 30px rgba(0, 0, 0, 0.12);
	transition: transform 0.28s ease, box-shadow 0.28s ease;
}
@media (prefers-reduced-motion: no-preference) {
	.nv-start-card:hover {
		transform: translateY(-6px);
		box-shadow: 0 18px 42px rgba(0, 0, 0, 0.22);
	}
}

/* Ícone (wp:image editável) no topo de cada card. */
.nv-start-card__icone {
	margin: 0 0 1.5rem;
}
.nv-start-card__icone img {
	display: block;
	width: 42px;
	height: 42px;
	transform-origin: center;
}
/* Animação única no hover do card (pop). */
@media (prefers-reduced-motion: no-preference) {
	.nv-start-card:hover .nv-start-card__icone img {
		animation: nv-ic-pop 0.5s ease;
	}
}
@keyframes nv-ic-pop { 0% { transform: scale(1); } 50% { transform: scale(1.2); } 100% { transform: scale(1); } }

.nv-start-card__titulo {
	margin: 0 0 0.5rem;
	font-size: 1.14rem;
	line-height: 1.25;
	color: inherit;
}
.nv-start-card__texto {
	margin: 0;
	font-size: 0.92rem;
	line-height: 1.5;
	color: var(--wp--preset--color--text-muted);
}

/* Card de CTA (último do grid) — laranja, sem ícone, com botão branco. */
.nv-start-cta {
	background: var(--wp--preset--color--laranja);
	color: #fff;
	justify-content: center;
	gap: 1rem;
}
.nv-start-cta__titulo {
	margin: 0;
	color: #fff;
	font-size: 1.3rem;
	line-height: 1.2;
}
.wp-block-button.btn-branco .wp-block-button__link {
	background: #fff;
	color: var(--wp--preset--color--laranja);
	font-weight: 800;
	line-height: 1.2;
	display: inline-flex;
	align-items: center;
	gap: 0.5rem;
	padding: 0.5rem 0.5rem 0.5rem 1.3rem;
	border-radius: 999px;
	/* Zera a borda de 2px laranja herdada da regra genérica de botões em
	   conteúdo (.wp-block-post-content .wp-block-button__link) — lá ela é
	   invisível porque o preenchimento também é laranja, mas aqui o
	   preenchimento é branco: a borda laranja cria um anel visível bem em
	   cima da sombra marinho, dando a impressão de um vão entre os dois. */
	border: none;
}
.wp-block-button.btn-branco .wp-block-button__link::after {
	content: "";
	flex: 0 0 auto;
	width: 24px;
	height: 24px;
	border-radius: 50%;
	background-color: var(--wp--preset--color--laranja);
	background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23ffffff' stroke-width='3' stroke-linecap='round' stroke-linejoin='round'%3E%3Cline x1='4' y1='12' x2='19' y2='12'/%3E%3Cpolyline points='12 5 19 12 12 19'/%3E%3C/svg%3E");
	background-repeat: no-repeat;
	background-position: center;
	background-size: 12px 12px;
}

/* Tablet: 2 colunas e desliga o parallax (fixed engasga no mobile/iOS). O bg da
   foto vem inline do bloco, então o override precisa de !important. */
@media (max-width: 900px) {
	.nv-start-grid { grid-template-columns: repeat(2, 1fr); }
	.nv-start { background-attachment: scroll !important; }
}
@media (max-width: 560px) {
	.nv-start-grid { grid-template-columns: 1fr; }
}

/* ==========================================================================
   CARD DE VÍDEO (conteúdo editorial — página simples, ex: Educação Bilíngue)
   Sombra em bloco de cor (âmbar) + blob laranja espiando atrás, mesma
   linguagem visual dos blobs decorativos do hero. Aplicar a classe
   "nv-video-card" no bloco wp:embed (painel do bloco > Avançado > Classe CSS
   adicional).
   ========================================================================== */
.nv-video-card {
	position: relative;
	z-index: 1;
}
.nv-video-card::before {
	content: "";
	position: absolute;
	top: -24px;
	right: -24px;
	width: 120px;
	height: 120px;
	background: var(--wp--preset--color--laranja);
	opacity: .3;
	border-radius: 50% 45% 55% 50% / 55% 50% 50% 45%;
	z-index: -1;
	pointer-events: none;
}
.nv-video-card .wp-block-embed__wrapper {
	border-radius: 28px;
	overflow: hidden;
	box-shadow: 16px 16px 0 0 var(--wp--preset--color--amarelo);
}
@media (max-width: 600px) {
	.nv-video-card::before {
		width: 80px;
		height: 80px;
		top: -16px;
		right: -16px;
	}
	.nv-video-card .wp-block-embed__wrapper {
		box-shadow: 10px 10px 0 0 var(--wp--preset--color--amarelo);
	}
}

/* ==========================================================================
   IMAGEM DE CONTEÚDO — cantos orgânicos (conteúdo editorial, ex: fotos em
   páginas simples). Mesmo padrão do .curso-header__img: cada canto com um
   raio diferente, nunca retos. Aplicar a classe "nv-foto-organica" no bloco
   wp:image (painel do bloco > Avançado > Classe CSS adicional).
   ========================================================================== */
.nv-foto-organica {
	border-radius: 110px 32px 72px 24px;
	overflow: hidden;
}
.nv-foto-organica img {
	display: block;
	width: 100%;
	height: auto;
}
@media (max-width: 781px) {
	.nv-foto-organica {
		border-radius: 64px 20px 48px 16px;
	}
}

/* ==========================================================================
   TABELAS (core/table) — conteúdo editorial. Cantos arredondados (raio no
   wrapper .wp-block-table, que recorta a tabela por dentro) + linhas finas
   entre todas as células, cabeçalho com fundo surface e tipografia de título.
   ========================================================================== */
.wp-block-table,
.wp-block-table table,
.wp-block-table thead,
.wp-block-table tbody,
.wp-block-table tfoot {
	margin: 0;
	padding: 0;
}
.wp-block-table {
	margin: 2rem 0;
	border: 1px solid var(--wp--preset--color--borda);
	border-radius: 20px;
	overflow: hidden;
	box-shadow: 0 4px 14px rgba(26, 26, 26, .06);
	line-height: 0;
}
.wp-block-table table {
	width: 100%;
	border-collapse: collapse;
	font-family: var(--wp--preset--font-family--body);
	line-height: 1.5;
}
/* O core aplica thead{border-bottom:3px solid} e tfoot{border-top:3px solid}
   por padrao (preto/currentColor), zera os dois: a borda visivel vem só das
   células abaixo, na cor do tema. */
.wp-block-table thead {
	border-bottom: none;
}
.wp-block-table tfoot {
	border-top: none;
}
.wp-block-table th,
.wp-block-table td {
	padding: 1rem 1.5rem;
	text-align: left;
	border: none;
	border-bottom: 1px solid var(--wp--preset--color--borda);
	border-right: 1px solid var(--wp--preset--color--borda);
}
.wp-block-table th:last-child,
.wp-block-table td:last-child {
	border-right: none;
}
.wp-block-table thead th {
	background: var(--wp--preset--color--surface);
	color: var(--wp--preset--color--ink);
	font-family: var(--wp--preset--font-family--heading);
	font-weight: 700;
	font-size: .95rem;
	border-bottom: 2px solid var(--wp--preset--color--borda);
}
.wp-block-table tbody td {
	color: var(--wp--preset--color--text-muted);
	background: var(--wp--preset--color--white);
}
.wp-block-table tbody td:first-child {
	font-weight: 700;
}
.wp-block-table tbody tr:last-child td {
	border-bottom: none;
}
@media (max-width: 600px) {
	.wp-block-table th,
	.wp-block-table td {
		padding: .75rem 1rem;
		font-size: .9rem;
	}
}

/* ==========================================================================
   LP ADMISSÃO 2027 — Hero + Escolha de cidade
   ========================================================================== */
.nv-lp-hero {
	/* background-repeat/position/size vêm inline (ver lp-hero-cidades.php) —
	   textura de 2012x917px, repete só no eixo X pra não esticar (esticada
	   ela ficava borrada/"estourada"). */
	background-color: var(--wp--preset--color--background);
}

.nv-lp-hero__titulo {
	max-width: 720px;
	margin-left: auto;
	margin-right: auto;
}

.nv-lp-hero__foto img {
	max-width: 380px;
	width: 100%;
	height: auto;
}

/* Destaques em negrito+sublinhado no corpo do texto (copy da LP). */
.nv-lp-destaque {
	text-decoration: underline;
	text-decoration-color: var(--wp--preset--color--laranja);
	text-decoration-thickness: 2px;
	text-underline-offset: 3px;
}

/* Ícone empilhado sobre o H2, os dois centralizados. Réplica do ícone
   "map-pin-house" animado do lucide-animated.com (via motion/react) em CSS
   puro: o pino sobe num pulo curto (translateY 0 → -5px → -3px) e a casinha
   dentro dele se desenha por cima (stroke-dashoffset + fade), com um delay
   pra começar a meio caminho do pulo do pino. No site original só dispara no
   :hover — aqui dispara sozinho assim que a seção entra na viewport
   (.js-reveal-icon soma .is-inview via assets/js/nv-reveal.js), e o hover
   continua funcionando por cima como reforço. */
.nv-cidades-heading-row {
	flex-direction: column;
	align-items: center;
	gap: var(--wp--preset--spacing--1);
	text-align: center;
}
.nv-cidades-heading-row .wp-block-heading {
	margin: 0;
	max-width: 480px;
}
.nv-cidades-icone {
	display: inline-flex;
	color: var(--wp--preset--color--laranja);
}
.nv-pin-house {
	opacity: 0;
	stroke-dasharray: 50;
	stroke-dashoffset: 50;
}
/* Ciclo de 3s: o pin pula, a casinha se desenha dentro dele, segura, e tudo
   volta ao início. Antes era one-shot ("forwards") disparado no scroll; agora
   repete em loop, no mesmo espírito do ícone de rota da seção seguinte. */
@keyframes nv-pin-hop {
	0%, 100%  { transform: translateY(0); }
	12%       { transform: translateY(-5px); }
	22%, 84%  { transform: translateY(-3px); }
	94%       { transform: translateY(0); }
}
@keyframes nv-pin-house-draw {
	0%        { opacity: 0; stroke-dashoffset: 50; }
	10%       { opacity: 1; }
	35%, 84%  { opacity: 1; stroke-dashoffset: 0; }
	96%, 100% { opacity: 0; stroke-dashoffset: 50; }
}
@media (prefers-reduced-motion: no-preference) {
	/* .is-inview continua sendo o gatilho: o loop só começa quando o ícone
	   entra na viewport, em vez de rodar desde o carregamento da página. */
	.nv-cidades-icone.is-inview .nv-pin-svg,
	.nv-cidades-heading-row:hover .nv-cidades-icone .nv-pin-svg {
		animation: nv-pin-hop 3s ease-in-out infinite;
	}
	.nv-cidades-icone.is-inview .nv-pin-house,
	.nv-cidades-heading-row:hover .nv-cidades-icone .nv-pin-house {
		animation: nv-pin-house-draw 3s ease-in-out infinite;
	}
}

/* Fileira dos 5 cards de cidade em leque — cada card gira levemente em torno
   do próprio pé (transform-origin bottom), o card central fica reto/no lugar
   e os cards se afastam pra fora e pra baixo em graus crescentes, formando um
   arco suave (como um leque de cartas). Só entra em telas largas o bastante
   pra caber os 5 numa linha só — girar cards que já quebraram em 2-3 linhas
   fica visualmente quebrado, então o leque é desligado no breakpoint mobile
   logo abaixo. */
.nv-cidades-grid {
	display: flex;
	flex-wrap: wrap;
	justify-content: center;
	align-items: flex-start;
	gap: var(--wp--preset--spacing--3);
	margin-top: var(--wp--preset--spacing--6);
	padding-top: var(--wp--preset--spacing--3);
}
.nv-cidades-grid > * { margin-block: 0; }

.nv-cidade-card {
	--nv-fan-rotate: 0deg;
	--nv-fan-y: 0px;
	display: flex;
	flex: 1 1 224px;
	max-width: 246px;
	height: 212px;
	flex-direction: column;
	padding: 40px 20px 0;
	background: var(--wp--preset--color--white);
	border: 1.5px solid var(--wp--preset--color--borda);
	border-bottom: none;
	border-radius: 22px;
	overflow: hidden;
	transition: transform 0.3s ease, box-shadow 0.3s ease, border-color 0.3s ease;
}
@media (min-width: 783px) {
	.nv-cidade-card {
		transform: rotate(var(--nv-fan-rotate)) translateY(var(--nv-fan-y));
		transform-origin: 50% 100%;
	}
	.nv-cidades-grid > *:nth-child(1) { --nv-fan-rotate: -8deg; --nv-fan-y: 20px; }
	.nv-cidades-grid > *:nth-child(2) { --nv-fan-rotate: -4deg; --nv-fan-y: 6px; }
	.nv-cidades-grid > *:nth-child(3) { --nv-fan-rotate: 0deg;  --nv-fan-y: 0px; }
	.nv-cidades-grid > *:nth-child(4) { --nv-fan-rotate: 4deg;  --nv-fan-y: 6px; }
	.nv-cidades-grid > *:nth-child(5) { --nv-fan-rotate: 8deg;  --nv-fan-y: 20px; }
}
@media (prefers-reduced-motion: no-preference) {
	.nv-cidade-card:hover {
		transform: rotate(var(--nv-fan-rotate)) translateY(calc(var(--nv-fan-y) - 8px)) scale(1.05);
		box-shadow: 0 18px 40px rgba(0, 0, 0, 0.12);
		border-color: var(--wp--preset--color--laranja);
	}
}
.nv-cidade-card__titulo {
	margin: 0 0 var(--wp--preset--spacing--2);
	font-size: 1.05rem;
}
.nv-cidade-card__meta {
	margin: 0 0 24px;
	color: var(--wp--preset--color--text-muted);
	font-size: var(--wp--preset--font-size--sm);
	line-height: 1.5;
	flex-grow: 1;
}
/* Botão sangra até a borda do card — o próprio overflow:hidden do card corta
   os cantos inferiores no mesmo raio, sem precisar duplicar o border-radius
   no botão. */
.nv-cidade-card .wp-block-buttons {
	margin: auto -20px 0;
}
.nv-cidade-card .wp-block-buttons .wp-block-button {
	margin: 0;
}
.nv-cidade-card .btn-primary .wp-block-button__link {
	width: 100%;
	border-radius: 0;
	border-color: transparent;
	box-shadow: none;
	padding-top: 0.9rem;
	padding-bottom: 0.9rem;
}
.nv-cidade-card .wp-block-button__link::after {
	display: none;
}

@media (max-width: 782px) {
	.nv-lp-hero .wp-block-columns {
		flex-wrap: wrap;
	}
}

/* No celular os cards viram dois por linha. Com o flex-basis de 224px do padrão
   só cabia um por linha abaixo de ~500px, e a fileira das 5 cidades virava uma
   coluna de 5 telas de altura — muita rolagem pra uma lista curta.
   O max-width em 50% é o que impede o quinto card (sozinho na terceira linha)
   de esticar até a largura toda e ficar deslocado dos outros quatro.
   A altura passa a ser automática porque, na metade da largura, o nome de
   cidade mais longo ("Governador Valadares") ocupa duas linhas e estouraria os
   212px fixos; o min-height preserva o alinhamento entre os cards da mesma
   linha. */
@media (max-width: 600px) {
	.nv-cidades-grid {
		gap: 16px;
		/* Sem isto os dois cards da mesma linha ficam com alturas diferentes
		   (o flex-start do desktop existe pro leque, que aqui já está
		   desligado) e a faixa laranja do botão desalinha entre eles.
		   "Governador Valadares" é o caso que expõe: na metade da largura o
		   nome ocupa duas linhas e o card cresce sozinho. */
		align-items: stretch;
	}
	.nv-cidade-card {
		flex: 1 1 calc(50% - 8px);
		max-width: calc(50% - 8px);
		height: auto;
		min-height: 212px;
		padding: 24px 16px 0;
	}
	/* acompanha o padding lateral acima: é o que faz o botão sangrar até a
	   borda do card em vez de sobrar uma faixa branca dos dois lados. */
	.nv-cidade-card .wp-block-buttons {
		margin: auto -16px 0;
	}
}

/* ==========================================================================
   PÁGINA APP GENOMA (/area-do-aluno/app-genoma/)
   Hero reaproveita .curso-header (mesmo fundo creme, largura, forma decorativa,
   breadcrumb + pontilhado). Aqui só: mockup flutuante + botões de download +
   seção "Nossa plataforma" + box "Como acessar".
   ========================================================================== */

/* Mockup do celular numa moldura de cantos orgânicos (mesmo padrão da
   .curso-header__img). O PNG tem fundo branco, então a moldura vira um card
   limpo do print do app, com a forma decorativa aparecendo por trás. Retrato
   (o aparelho é vertical), com largura limitada pra não esticar o hero. */
.nv-app-hero__img {
	position: relative;
	z-index: 1;
	margin: 0;
	border-radius: 110px 32px 72px 24px;
	overflow: hidden;
}
.nv-app-hero__img img {
	display: block;
	width: 100%;
	aspect-ratio: 4 / 3;
	object-fit: cover;
	object-position: center 28%;
}

/* Botões de download — verde da marca, com ícone da plataforma. Sobrescreve o
   estilo de botão de conteúdo (pílula laranja + sombra dura + disco de seta). */
.nv-app-download {
	gap: var(--wp--preset--spacing--2);
}
.nv-app-download .nv-app-btn .wp-block-button__link {
	display: inline-flex;
	align-items: center;
	gap: 0.6rem;
	padding: 0.85rem 1.6rem;
	background-color: var(--wp--preset--color--accent) !important;
	border-color: var(--wp--preset--color--accent);
	color: var(--wp--preset--color--white);
	box-shadow: none;
	font-size: 0.95rem !important;
}
.nv-app-download .nv-app-btn .wp-block-button__link::after {
	display: none;
}
.nv-app-download .nv-app-btn .wp-block-button__link::before {
	content: "";
	flex: 0 0 auto;
	width: 22px;
	height: 22px;
	background-color: currentColor;
	-webkit-mask: var(--nv-app-ico) center / contain no-repeat;
	mask: var(--nv-app-ico) center / contain no-repeat;
}
.nv-app-btn--android {
	--nv-app-ico: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M17.6 9.48l1.84-3.18c.16-.31.04-.69-.26-.85a.637.637 0 0 0-.83.22l-1.88 3.24a11.463 11.463 0 0 0-8.94 0L5.65 5.67a.643.643 0 0 0-.87-.2c-.28.18-.37.54-.22.83L6.4 9.48A10.78 10.78 0 0 0 1 18h22a10.78 10.78 0 0 0-5.4-8.52M7 15.25a1.25 1.25 0 1 1 0-2.5 1.25 1.25 0 0 1 0 2.5m10 0a1.25 1.25 0 1 1 0-2.5 1.25 1.25 0 0 1 0 2.5'/%3E%3C/svg%3E");
}
.nv-app-btn--ios {
	--nv-app-ico: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M17.05 20.28c-.98.95-2.05.8-3.08.35-1.09-.46-2.09-.48-3.24 0-1.44.62-2.2.44-3.06-.35C2.79 15.25 3.51 7.59 9.05 7.31c1.35.07 2.29.74 3.08.8 1.18-.24 2.31-.93 3.57-.84 1.51.12 2.65.72 3.4 1.8-3.12 1.87-2.38 5.98.48 7.13-.57 1.5-1.31 2.99-2.54 4.09l.01-.01M12.03 7.25c-.15-2.23 1.66-4.07 3.74-4.25.29 2.58-2.34 4.5-3.74 4.25Z'/%3E%3C/svg%3E");
}
.nv-app-download .nv-app-btn .wp-block-button__link:hover {
	box-shadow: 0 10px 24px rgba(5, 97, 59, 0.28);
}
@media (prefers-reduced-motion: no-preference) {
	.nv-app-download .nv-app-btn .wp-block-button__link {
		transition: transform 0.2s ease, box-shadow 0.2s ease;
	}
	.nv-app-download .nv-app-btn .wp-block-button__link:hover {
		transform: translateY(-2px);
	}
}

/* Seção "Nossa plataforma mudou". */
.nv-app-info__titulo {
	margin: 0;
}
.nv-app-info__titulo mark {
	background: transparent;
	color: var(--wp--preset--color--laranja);
}
.nv-app-info__sub {
	margin: var(--wp--preset--spacing--2) 0 0;
	color: var(--wp--preset--color--primary);
}
.nv-app-info p {
	color: var(--wp--preset--color--text-muted);
	line-height: 1.65;
}

/* Box "Como acessar" — amarelo, cantos arredondados, texto escuro pro contraste. */
.nv-app-acesso__box {
	box-shadow: 0 20px 44px rgba(245, 180, 0, 0.22);
}
.nv-app-acesso__titulo {
	margin: 0 0 var(--wp--preset--spacing--2);
	color: #5c4600;
}
.nv-app-acesso__box p {
	margin: 0;
	color: #5c4600;
}
.nv-app-acesso__box strong {
	color: #3f3000;
}

/* Mobile: suaviza os cantos orgânicos (mesmo padrão do .curso-header__img). */
@media (max-width: 781px) {
	.nv-app-hero__img {
		border-radius: 64px 20px 48px 16px;
	}
	.nv-app-download {
		justify-content: flex-start;
	}
}

/* ==========================================================================
   PÁGINA MATERIAL ESCOLAR (/area-do-aluno/material-escolar-genoma/)
   Hero reaproveita .curso-header. Aqui: cards de ciclo (sem imagem) com botões
   de série (PDF) + box "Como comprar" (Editora DNA + 3 passos).
   ========================================================================== */

.nv-material-listas__titulo {
	margin: 0;
}
.nv-material-listas .nv-material-grid {
	margin-top: var(--wp--preset--spacing--5);
}

/* Grid de 4 cards de ciclo — 2 por linha, todas as linhas com a mesma altura. */
.nv-material-grid {
	display: grid;
	grid-template-columns: repeat(2, 1fr);
	grid-auto-rows: 1fr;
	gap: var(--wp--preset--spacing--4);
	align-items: stretch;
}
/* O grupo é layout flow: o WordPress injeta o blockGap como margin-block-start
   nos filhos 2-4. Em grid isso desalinha os cards e soma ao gap das linhas —
   zerar aqui deixa a altura igual e o espaço linha = coluna. */
.nv-material-grid > * {
	margin-block: 0;
}
.nv-material-card {
	border-radius: 28px;
	padding: var(--wp--preset--spacing--5) var(--wp--preset--spacing--4);
	background-color: color-mix(in srgb, var(--cor, var(--wp--preset--color--laranja)) 12%, #fff);
}
/* Cores oficiais de cada curso (campo cor_curso), iguais ao padrão do print. */
.nv-material-card--infantil { --cor: #f5b400; }
.nv-material-card--iniciais { --cor: #6f2681; }
.nv-material-card--finais   { --cor: #079c5f; }
.nv-material-card--medio    { --cor: #f15622; }
.nv-material-card__faixa {
	margin: 0;
	font-family: var(--wp--preset--font-family--heading);
	font-size: var(--wp--preset--font-size--xs);
	font-weight: 700;
	letter-spacing: 0.06em;
	color: var(--wp--preset--color--text-muted);
}
.nv-material-card__nome {
	margin: 0.15em 0 0;
	color: #151544;
	font-size: 1.4rem;
}
.nv-material-card__idade {
	margin: 0.2em 0 0;
	color: var(--wp--preset--color--text-muted);
	font-size: var(--wp--preset--font-size--sm);
}

/* Botões de série — usam o mesmo estilo dos botões do conteúdo de post
   (.wp-block-post-content .wp-block-button__link): pílula laranja com sombra
   dura marinho e disco branco. Como linkam pra .pdf, o ícone contextual do disco
   já vira o de documento automaticamente. Só o espaçamento é ajustado aqui. */
.nv-material-series {
	gap: 12px;
	margin-top: var(--wp--preset--spacing--3);
}

/* Box "Como comprar" — teal da Editora DNA: logo à esquerda (centralizada) +
   título + 3 passos à direita, no padrão do print. */
.nv-material-comprar {
	gap: var(--wp--preset--spacing--5);
	background: #1e9184;
	color: var(--wp--preset--color--white);
}
.nv-material-comprar__logo {
	margin: 0;
	flex: 0 0 auto;
	width: 190px;
	max-width: 42%;
}
.nv-material-comprar__main {
	flex: 1 1 480px;
}
.nv-material-comprar__titulo {
	margin: 0 0 var(--wp--preset--spacing--4);
	color: var(--wp--preset--color--white);
	font-size: 1.55rem;
	line-height: 1.25;
}
.nv-material-passos {
	display: grid;
	grid-template-columns: repeat(3, 1fr);
	gap: var(--wp--preset--spacing--3);
	align-items: stretch;
}
/* Mesmo motivo do grid de ciclos: zera o blockGap que o layout flow injeta nos
   filhos 2-3, senão os passos desalinham (o card 1 fica mais alto). */
.nv-material-passos > * {
	margin-block: 0;
}
.nv-material-passo {
	position: relative;
	display: flex;
	flex-direction: column;
	align-items: center;
	gap: 0.4em;
	background: #efe1ca;
	border-radius: 18px;
	padding: var(--wp--preset--spacing--4) var(--wp--preset--spacing--3);
	text-align: center;
	transition: transform 0.2s ease, box-shadow 0.2s ease;
}
.nv-material-passo:hover {
	transform: translateY(-4px);
	box-shadow: 0 14px 28px rgba(0, 0, 0, 0.2);
}
.nv-material-passo__num {
	margin: 0;
	font-family: var(--wp--preset--font-family--heading);
	font-weight: 800;
	font-size: 2.6rem;
	line-height: 1;
	color: var(--wp--preset--color--accent);
}
.nv-material-passo__label {
	margin: 0;
}
.nv-material-passo__label a {
	font-family: var(--wp--preset--font-family--heading);
	font-weight: 700;
	font-size: var(--wp--preset--font-size--sm);
	color: var(--wp--preset--color--accent);
	text-decoration: none;
}
.nv-material-passo__label a::after {
	content: "";
	position: absolute;
	inset: 0;
}
.nv-material-passo:hover .nv-material-passo__label a {
	color: #05613b;
}

@media (max-width: 781px) {
	.nv-material-grid {
		grid-template-columns: 1fr;
	}
	.nv-material-passos {
		grid-template-columns: 1fr;
	}
	.nv-material-comprar__topo {
		flex-direction: column;
	}
}

/* ==========================================================================
   CANAL DE RELACIONAMENTO — texto + WhatsApp (40%) e formulário (60%).
   Vão largo entre colunas e respiro no topo do texto só no desktop: no
   mobile as colunas empilham (comportamento nativo do core/columns abaixo
   de 782px) e esse espaçamento extra não faz sentido ali.
   ========================================================================== */
@media (min-width: 782px) {
	.nv-canal-cols {
		column-gap: var(--wp--preset--spacing--8);
	}
	.nv-canal-col-texto {
		padding-top: 120px;
	}
}

/* ==========================================================================
   RODAPÉ — fundo em gradiente (mesh), colunas de links e o bloco
   "Genoma próximo de você" com um card por unidade ([nv_footer_unidades]).

   O gradiente vem de imagem, não de CSS: é um mesh de várias cores em 2D
   com a marca d'água do "e" da marca, coisa que radial-gradient empilhado
   só aproxima. O PNG original (388 KB) virou WebP em meia resolução e caiu
   pra 5 KB — nesse peso a imagem fiel sai mais barata que a aproximação.
   ========================================================================== */
.site-footer {
	position: relative;
	color: #151544;
	background-color: #F6EDE7; /* fallback enquanto a imagem não pinta */
	background-image: url("../images/background-rodape.webp");
	background-repeat: no-repeat;
	background-position: center;
	background-size: cover;
	border-radius: 80px 80px 0 0;
}

.site-footer a {
	color: inherit;
	text-decoration: none;
}
.site-footer a:hover {
	color: var(--wp--preset--color--primary);
	text-decoration: underline;
}

.site-footer__topo {
	gap: var(--wp--preset--spacing--5);
}

.site-footer__sobre {
	max-width: 34ch;
	margin-top: var(--wp--preset--spacing--3);
	font-size: 0.92rem;
	line-height: 1.6;
}

.site-footer__titulo {
	margin: 0 0 var(--wp--preset--spacing--2);
	font-family: var(--wp--preset--font-family--heading);
	font-weight: 800;
	font-size: 1rem;
	color: #151544;
}
.site-footer__titulo--unidades {
	margin-top: var(--wp--preset--spacing--7);
	margin-bottom: var(--wp--preset--spacing--3);
}
/* ── Siga o Genoma ──
   Virou coluna de links de texto, então herda o .site-footer__links das outras
   três. A classe própria fica só como gancho, caso as redes precisem de algum
   tratamento que as demais colunas não têm. */

/* Listas de link: sem marcador e sem o recuo de lista de texto corrido. */
.site-footer__links {
	margin: 0 !important;
	padding: 0 !important;
	list-style: none !important;
}
.site-footer__links li {
	margin-bottom: 0.55em !important;
	font-size: 0.92rem;
	line-height: 1.4;
}

/* ── Cards de unidade ── */
.nv-footer-unidades {
	display: grid;
	grid-template-columns: repeat(4, 1fr);
	gap: var(--wp--preset--spacing--3);
}
.nv-footer-unidade {
	display: flex;
	flex-direction: column;
	background: var(--wp--preset--color--white);
	border-radius: 16px;
	padding: var(--wp--preset--spacing--3);
}
.nv-footer-unidade__nome {
	margin: 0 0 0.5rem;
	font-family: var(--wp--preset--font-family--heading);
	font-weight: 800;
	font-size: 0.95rem;
	line-height: 1.25;
	color: #151544;
}
/* O nome é link pra página da unidade. Sem esta regra ele herda o link global
   do tema, que é colorido e ganha sublinhado no hover — num card que já tem
   quatro botões, o sublinhado vira ruído. Fica na cor do título e sinaliza o
   hover pela cor. O :focus-visible acompanha, mas sem mexer no outline: quem
   navega por teclado continua vendo onde está. */
.nv-footer-unidade__nome a {
	color: inherit;
	text-decoration: none;
	transition: color 0.2s ease;
}
/* Empatava em especificidade com `.site-footer a:hover` e só ganhava por vir
   depois no arquivo. Com o `.nv-footer-unidade` na frente o resultado não
   depende mais da ordem — e ordem é o tipo de coisa que se perde no primeiro
   refactor do arquivo. */
.nv-footer-unidade .nv-footer-unidade__nome a:hover,
.nv-footer-unidade .nv-footer-unidade__nome a:focus-visible {
	color: var(--wp--preset--color--laranja);
	text-decoration: none;
}
/* Mesmo desenho dos cursos do card do archive (bolinha na cor do curso + nome),
   só que um degrau menor: aqui o card é de rodapé, não a peça principal da
   página. O HTML das duas versões sai da mesma função,
   nv_unidade_cursos_bolinhas(). */
.nv-footer-unidade__cursos {
	margin: 0 0 0.5rem;
	font-size: 0.76rem;
	line-height: 1.7;
	color: var(--wp--preset--color--text-muted);
}
.nv-footer-unidade__curso {
	display: inline-block;
	/* mantém bolinha e nome na mesma linha; a quebra acontece entre cursos */
	white-space: nowrap;
	margin-right: 0.7em;
}
.nv-footer-unidade__dot {
	display: inline-block;
	width: 6px;
	height: 6px;
	border-radius: 50%;
	margin-right: 0.4em;
	vertical-align: middle;
	opacity: 0.55;
}
/* auto no topo: empurra a linha de ações pra base, alinhando-a entre cards de
   alturas diferentes (o número de cursos varia de uma unidade pra outra). */
.nv-footer-unidade__acoes {
	display: flex;
	align-items: center;
	gap: 0.5rem;
	margin-top: auto;
	padding-top: var(--wp--preset--spacing--3);
}
.nv-footer-unidade__ico {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	/* 42px atende o alvo mínimo de toque (WCAG 2.5.8) */
	width: 42px;
	height: 42px;
	border-radius: 50%;
	border: 1.5px solid var(--wp--preset--color--borda);
	color: #151544;
	transition: background-color 0.2s ease, border-color 0.2s ease, color 0.2s ease;
}
/* Link com ícone dentro não pode herdar o sublinhado de hover do estilo global:
   o traço aparece cortando o SVG dentro do círculo. Vale pros contatos e pra
   seta — nos dois o estado de hover é dado por cor, não por sublinhado. */
.nv-footer-unidade__acoes a:hover,
.nv-footer-unidade__acoes a:focus-visible {
	text-decoration: none;
}
.nv-footer-unidade__ico svg {
	width: 18px;
	height: 18px;
}
/* O `__acoes` na frente não é enfeite: `.site-footer a:hover` (uma classe + um
   elemento + a pseudo-classe) vence `.nv-footer-unidade__ico:hover` (uma classe
   + a pseudo-classe). Sem ele o `color:#fff` daqui nunca valia, o ícone ficava
   no laranja escuro do link global sobre o fundo laranja do hover e quase
   sumia — o fundo pintava, o traço não. */
.nv-footer-unidade__acoes .nv-footer-unidade__ico:hover {
	background: var(--wp--preset--color--laranja);
	border-color: var(--wp--preset--color--laranja);
	color: #fff;
}

/* Seta pra página da unidade, na ponta direita da linha. O margin-left:auto é
   o que a empurra: com ele a seta encosta na borda do card independentemente de
   quantos ícones de contato a unidade tiver (nem todas têm os três).
   Sem moldura, só o traço em laranja — é o destino principal do card, e a cor
   já dá o peso que o círculo dava. */
/* O seletor repete o pai de propósito. O tema tem um `.site-footer a { color:
   inherit }` que zera a cor de link global dentro do rodapé — e com um elemento
   a mais na conta ele vence uma classe sozinha, então `.nv-footer-unidade__seta`
   não pintava nada e a seta saía na cor herdada do card. Com o `__acoes` na
   frente são duas classes contra uma classe + um elemento, e a cor pega. */
.nv-footer-unidade__acoes .nv-footer-unidade__seta {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	margin-left: auto;
	/* A caixa continua com 42px mesmo sem o círculo: é o alvo mínimo de toque
	   (WCAG 2.5.8) e some visualmente, já que não há mais fundo nem borda.
	   O -10px na direita compensa a sobra de centralização dentro dessa caixa,
	   pra ponta da seta alinhar com a margem do texto acima em vez de parecer
	   recuada. */
	width: 42px;
	height: 42px;
	margin-right: -10px;
	color: var(--wp--preset--color--laranja);
	transition: color 0.2s ease, transform 0.2s ease;
}
.nv-footer-unidade__seta svg {
	width: 22px;
	height: 22px;
}
.nv-footer-unidade__acoes .nv-footer-unidade__seta:hover {
	color: #151544;
}
@media (prefers-reduced-motion: no-preference) {
	.nv-footer-unidade__acoes .nv-footer-unidade__seta:hover {
		transform: translateX(3px);
	}
}

.site-footer__linha {
	border-color: rgba(21, 21, 68, 0.18);
}
.site-footer__legal {
	gap: var(--wp--preset--spacing--2);
}
.site-footer__legal p {
	margin: 0;
}

@media (max-width: 1100px) {
	.nv-footer-unidades {
		grid-template-columns: repeat(2, 1fr);
	}
}
@media (max-width: 781px) {
	.site-footer {
		border-radius: 40px 40px 0 0;
	}
	.site-footer__sobre {
		max-width: none;
	}
	.site-footer__titulo--unidades {
		margin-top: var(--wp--preset--spacing--5);
	}
}
@media (max-width: 600px) {
	.nv-footer-unidades {
		grid-template-columns: 1fr;
	}
}

/* ==========================================================================
   SELETIVA — faixa de destaque da LP de Processo de Admissão: H1 à esquerda
   e os dados da prova à direita, sobre textura de papel.
   ========================================================================== */
.nv-seletiva {
	/* A textura ocupa 100% da largura e repete só no eixo Y: em telas largas
	   um ladrilho horizontal deixaria a emenda vertical visível no meio da
	   faixa. A altura fica "auto", então a proporção do papel é preservada e o
	   grão não estica. background-color é o tom do próprio papel, pra cobrir a
	   sobra quando a seção for mais alta que os ladrilhos. */
	position: relative;
	overflow: hidden;
	background-color: #F2F2F2;
	background-image: url("../images/bg-pa27.webp");
	background-repeat: repeat-y;
	background-size: 100% auto;
	background-position: top center;
	/* cola no hero: sem isso o blockGap do tema (24px) abre uma faixa clara
	   entre a base do hero e o topo da faixa de papel. */
	margin-top: 0 !important;
	/* O padrão da LP é 60px de respiro em cima e embaixo. Aqui embaixo os 60px
	   somam com os 110px que a curva separadora ocupa: a curva é desenhada por
	   cima do fim da seção, então sem esse acréscimo o cartão encostaria no
	   arco. 170 = 60 de papel plano + 110 de curva. */
	padding-bottom: 170px !important;
}

/* Separador: a cor da seção seguinte sobe numa curva rasa, emendando as duas
   sem linha reta. O elemento é mais largo que a seção (left/right negativos)
   pra que só o miolo do arco apareça — as pontas ficam cortadas pelo overflow,
   o que dá a curva suave em vez de um semicírculo. */
.nv-seletiva::after {
	content: "";
	position: absolute;
	left: -12%;
	right: -12%;
	bottom: -1px; /* -1px evita a fresta de subpixel no zoom */
	height: 110px;
	background: var(--wp--preset--color--background);
	border-radius: 50% 50% 0 0 / 110px 110px 0 0;
	pointer-events: none;
}

.nv-seletiva__cols {
	position: relative;
	z-index: 1;
	gap: 110px;
}

.nv-seletiva__titulo h1 {
	margin: 0;
	/* mais estreito que o parágrafo abaixo: força a quebra em 3 linhas curtas,
	   que é o desenho pretendido pro título. */
	max-width: 480px;
	font-size: clamp(1.9rem, 3.2vw, 2.6rem);
	line-height: 1.12;
	color: #151544;
}
.nv-seletiva__sub {
	margin: var(--wp--preset--spacing--2) 0 0;
	font-family: var(--wp--preset--font-family--heading);
	font-weight: 600;
	font-size: var(--wp--preset--font-size--base);
	line-height: 1.5;
	color: var(--wp--preset--color--text-muted);
}

/* A coluna da direita é um cartão branco sobre o papel — mesma linguagem dos
   cards de unidade e de post (branco, canto generoso, sombra suave). Aqui a
   sombra é mais leve porque o fundo é claro: sombra forte sobre papel claro
   suja em vez de destacar. */
.nv-seletiva__oferta {
	background: var(--wp--preset--color--white);
	border-radius: 24px;
	padding: var(--wp--preset--spacing--5);
	box-shadow: 0 18px 40px rgba(21, 21, 68, 0.08);
}

.nv-seletiva__lead {
	margin: 0;
	font-family: var(--wp--preset--font-family--heading);
	font-weight: 700;
	font-size: var(--wp--preset--font-size--lg);
	line-height: 1.35;
	color: #151544;
}

/* Ficha da prova: rótulo numa ponta, valor na outra, filete separando. O
   filete é o que permite apertar o line-height sem as linhas se colarem — o
   respiro passa a vir do padding da linha, não da entrelinha. */
.nv-seletiva__dados {
	margin: var(--wp--preset--spacing--4) 0 !important;
	padding: 0 !important;
	list-style: none !important;
	border-top: 1px solid var(--wp--preset--color--borda);
}
.nv-seletiva__dados li {
	display: flex;
	align-items: baseline;
	justify-content: space-between;
	gap: var(--wp--preset--spacing--3);
	margin: 0 !important;
	padding: 0.72rem 0;
	border-bottom: 1px solid var(--wp--preset--color--borda);
	font-size: var(--wp--preset--font-size--base);
	line-height: 1.25;
	color: var(--wp--preset--color--text-muted);
	text-align: right;
}
.nv-seletiva__dados strong {
	flex: 0 0 auto;
	font-family: var(--wp--preset--font-family--heading);
	font-weight: 700;
	color: #151544;
	text-align: left;
}

/* Agora vive na coluna do título, abaixo do subtítulo. Sem max-width: a
   largura da própria coluna é que define a medida da linha. */
.nv-seletiva__fecho {
	margin: var(--wp--preset--spacing--3) 0 0;
	font-size: var(--wp--preset--font-size--base);
	line-height: 1.55;
	color: var(--wp--preset--color--text-muted);
}

/* O CTA fecha o cartão: distância maior da ficha, pra não parecer mais uma
   linha da lista. */
.nv-seletiva__oferta .wp-block-buttons {
	margin-top: var(--wp--preset--spacing--4);
}

@media (max-width: 781px) {
	/* 60px de papel plano + os 60px que a curva ocupa nesta faixa. Mesma conta
	   do desktop, só com a curva menor. */
	.nv-seletiva {
		padding-top: 60px !important;
		padding-bottom: 120px !important;
	}
	.nv-seletiva::after {
		height: 60px;
		border-radius: 50% 50% 0 0 / 60px 60px 0 0;
	}
	.nv-seletiva__cols {
		gap: var(--wp--preset--spacing--5);
	}
	.nv-seletiva__oferta {
		padding: var(--wp--preset--spacing--4);
		border-radius: 20px;
	}
	/* Empilhado, a coluna do título ocupa a largura inteira e os 480px do
	   desktop passam a jogar contra: quebravam em 3 linhas, a última com duas
	   palavras. 640px fecha em 2 no tablet e não tem efeito no celular, onde a
	   própria tela já é mais estreita que isso. */
	.nv-seletiva__titulo h1 {
		max-width: 640px;
	}
	/* Em tela estreita o valor longo ("sábado, 26 de setembro") brigaria com o
	   rótulo na mesma linha: empilha e alinha tudo à esquerda. */
	.nv-seletiva__dados li {
		flex-direction: column;
		align-items: flex-start;
		gap: 0.15rem;
		text-align: left;
	}
}

@media (max-width: 600px) {
	/* No celular os 60px de respiro do tablet ainda empurram o conteúdo pra
	   baixo da dobra. 40px + os 60px da curva. */
	.nv-seletiva {
		padding-top: 40px !important;
		padding-bottom: 100px !important;
	}
	/* Assimétrico de propósito: o topo precisa afastar a frase de chamada da
	   borda do cartão, mas embaixo o botão já traz o próprio respiro e 32px
	   iguais nos quatro lados desperdiçavam altura numa tela estreita. */
	.nv-seletiva__oferta {
		padding: 40px 20px 20px;
	}
}

/* ==========================================================================
   JORNADA — "Um caminho pra cada fase": caixa branca agrupando os 4 segmentos
   de ensino, sob o ícone de rota animado (o SVG traz a própria animação).
   ========================================================================== */
.nv-jornada__box {
	box-shadow: 0 18px 44px rgba(21, 21, 68, 0.07);
}

.nv-jornada__icone {
	margin: 0 auto var(--wp--preset--spacing--2);
}
.nv-jornada__icone img {
	display: block;
	width: 52px;
	height: 52px;
}

.nv-jornada__titulo {
	margin: 0;
	font-size: var(--nv-titulo-secao);
	line-height: 1.15;
	color: #151544;
}
.nv-jornada__sub {
	margin: var(--wp--preset--spacing--2) auto 0;
	max-width: 60ch;
	color: var(--wp--preset--color--text-muted);
}

.nv-jornada__cards {
	margin-top: var(--wp--preset--spacing--6) !important;
	gap: var(--wp--preset--spacing--4);
}

/* Card com corpo em tom areia (surface): dentro de uma caixa branca, um card
   branco sumiria. O tom quente separa o card do fundo sem precisar de borda
   nem de sombra, que a essa altura já seriam a terceira camada de moldura.
   Sem hover: os cards deixaram de ser links, e hover em elemento não clicável
   promete interação que não existe. */
.nv-jornada__card {
	display: flex;
	flex-direction: column;
	overflow: hidden;
	background: var(--wp--preset--color--surface);
	border-radius: 20px;
}
.nv-jornada__foto {
	margin: 0;
}
.nv-jornada__foto img {
	display: block;
	width: 100%;
	aspect-ratio: 16 / 9;
	object-fit: cover;
	/* sem raio próprio: quem arredonda é o card, via overflow hidden */
	border-radius: 0;
}

.nv-jornada__nome {
	margin: 0 0 0.45rem;
	padding: var(--wp--preset--spacing--3) var(--wp--preset--spacing--3) 0;
	font-size: 1.2rem;
	line-height: 1.2;
	color: #151544;
}
.nv-jornada__desc {
	margin: 0;
	padding: 0 var(--wp--preset--spacing--3) var(--wp--preset--spacing--4);
	font-size: 0.95rem;
	line-height: 1.5;
	color: var(--wp--preset--color--text-muted);
}

.nv-jornada__cta {
	margin-top: var(--wp--preset--spacing--6) !important;
}

@media (max-width: 1100px) {
	/* 4 colunas viram 2: abaixo disso o card fica estreito demais pro título
	   de duas palavras ("Fundamental anos iniciais") caber sem esfarelar. */
	.nv-jornada__cards {
		flex-wrap: wrap !important;
	}
	/* O seletor repete o :not(.is-not-stacked-on-mobile) do core e soma uma
	   classe. O core empilha TODA .wp-block-columns abaixo de 781px com
	   flex-basis:100% !important — mesma especificidade que a regra daqui, e
	   como a folha dele carrega depois, ele ganhava no desempate por ordem. Era
	   por isso que o tablet mostrava um card por linha mesmo com esta regra
	   pedindo 50%. Com a classe extra a disputa não depende mais da ordem. */
	.nv-jornada__cards.wp-block-columns:not(.is-not-stacked-on-mobile) > .wp-block-column {
		flex-basis: calc(50% - var(--wp--preset--spacing--4)) !important;
	}
}
@media (max-width: 781px) {
	.nv-jornada__box {
		padding: var(--wp--preset--spacing--4) !important;
		border-radius: 30px !important;
	}
}
/* A coluna única só entra no celular de verdade. Antes começava em 781px, o que
   deixava o tablet (768) com um card por linha ocupando 664px de largura — um
   banner deitado, não um card. Em 600px a dupla ainda dá ~250px por card, que é
   a mesma medida que eles têm no desktop. */
@media (max-width: 600px) {
	.nv-jornada__cards.wp-block-columns:not(.is-not-stacked-on-mobile) > .wp-block-column {
		flex-basis: 100% !important;
	}
}

/* ==========================================================================
   FASES — fundo verde em degradê animado, texto fixo à esquerda e os cards
   se empilhando conforme a rolagem.

   O empilhamento é position:sticky puro, sem JS: cada card gruda numa altura
   um pouco maior que a do anterior, então o próximo sobe por cima e deixa uma
   faixa do de baixo à mostra. Nenhum ancestral pode ter overflow:hidden, ou o
   sticky morre em silêncio.
   ========================================================================== */
.nv-fases {
	position: relative;
	color: #fff;
	/* verde da marca em três paradas; o size maior que 100% é o que dá espaço
	   pro degradê "andar" na animação. */
	background: linear-gradient(125deg, #05613B 0%, #079C5F 35%, #0BB86E 55%, #079C5F 75%, #05613B 100%);
	background-size: 280% 280%;
}
@media (prefers-reduced-motion: no-preference) {
	.nv-fases {
		animation: nv-fases-degrade 22s ease-in-out infinite;
	}
}
@keyframes nv-fases-degrade {
	0%, 100% { background-position: 0% 50%; }
	50%      { background-position: 100% 50%; }
}

/* Divisor curvo pro que vier depois. Ao contrário da .nv-seletiva, aqui a
   curva é CÔNCAVA (sorriso): o verde é que desce no meio, e a cor da seção
   seguinte sobe pelas pontas. Cor fixa (#FAF8F5) porque não dá pra ler o fundo
   do irmão seguinte por CSS; se a seção depois desta mudar de cor, atualizar
   aqui.

   Por que radial-gradient em vez de border-radius: border-radius só produz
   curva CONVEXA (o canto é arredondado pra fora). Pra côncava seria preciso
   pintar um arco na cor da PRÓPRIA seção estendido pra baixo — inviável aqui,
   porque o fundo é um degradê animado de 280% e um pseudo-elemento de 110px de
   altura reproduziria a mesma declaração numa escala completamente diferente,
   sem casar a cor. Com o gradiente radial o arco é um recorte transparente: o
   degradê real da seção aparece por baixo, animação inclusive.

   A elipse fica centrada no topo do elemento. Não usa overflow:hidden na
   seção: isso mataria o position:sticky dos cards. */
.nv-fases::after {
	content: "";
	position: absolute;
	left: 0;
	right: 0;
	bottom: -1px; /* -1px evita a fresta de subpixel no zoom */
	height: 70px;
	/* Dois números controlam o arco: a altura (quanto o verde desce) e o raio
	   horizontal (quão aberta é a elipse). Quanto MAIOR o raio, mais rasa a
	   curva no trecho que aparece na tela — a 72% o desnível entre a ponta e o
	   meio fica em ~20px no desktop, contra os ~45px da primeira versão.
	   O passo 99.5%→100% é a suavização da borda: com corte seco (100%/100%) o
	   arco serrilha, porque gradiente não recebe antialiasing do navegador. */
	background: radial-gradient(72% 70px at 50% 0, transparent 99.5%, #FAF8F5 100%);
	pointer-events: none;
	z-index: 2;
}

/* align-items start: sem isso o wp:columns estica as colunas na altura toda e
   o sticky da coluna de texto nunca dispara (não sobra espaço pra grudar). */
.nv-fases__cols {
	align-items: flex-start !important;
	gap: var(--wp--preset--spacing--7);
}

/* Centralizado na vertical enquanto está preso: o "top" é metade da tela menos
   metade da altura do bloco (~288px). Feito por calc em vez de
   translateY(-50%) de propósito — o transform valeria também no fluxo normal,
   antes de grudar, e puxaria o texto pra cima invadindo o topo da seção. */
.nv-fases__texto {
	position: sticky;
	top: calc(50vh - 144px);
}

/* Fôlego de rolagem depois do último card. A LP não tem rodapé (é assim de
   propósito, ver templates/lp.html), então esta seção é o fim da página e não
   há nada abaixo pra gerar percurso: sem esse padding os cards 3 e 4 nunca
   chegam a grudar e a pilha fica pela metade.
   O vão entre os cards NÃO resolve: ele aumenta o percurso necessário e a
   rolagem disponível na mesma medida, então se anula. Quem manda é este valor.

   E ele PRECISA acompanhar a altura da tela. Com um valor fixo, numa tela mais
   baixa sobra rolagem depois da pilha montada: os cards se soltam e sobem
   sozinhos enquanto o texto continua preso — que é justamente o defeito de a
   coluna 2 rolar separada da seção. A conta (medida, não estimada) é
   "altura da tela menos 560px": nesse ponto a pilha termina de montar
   exatamente quando a página acaba, então nada se solta sozinho e a seção
   inteira rola junto. */
.nv-fases__cards {
	padding-bottom: max(0px, calc(100vh - 560px));
}
.nv-fases__titulo {
	margin: 0;
	font-size: var(--nv-titulo-secao);
	line-height: 1.12;
	color: #fff;
}
.nv-fases__sub {
	margin: var(--wp--preset--spacing--3) 0 var(--wp--preset--spacing--4);
	/* 58ch (~569px) fecha o texto em 2 linhas. Com os 42ch de antes eram 3, e a
	   terceira sobrava com meia dúzia de palavras. O teto real é a largura da
	   coluna (588px no desktop), então o valor não estica além disso. */
	max-width: 58ch;
	color: rgba(255, 255, 255, 0.88);
}

/* ── Os cards ── */
.nv-fases__card {
	position: sticky;
	padding: var(--wp--preset--spacing--5);
	border-radius: 24px;
	/* a sombra separa um card do outro quando eles se sobrepõem */
	box-shadow: 0 -6px 30px rgba(4, 46, 28, 0.22);
}
/* A margem entre cards É a distância de rolagem até o próximo colar sobre o
   anterior. Com os 48px de antes, a coluna toda tinha 1208px e a seção (última
   da página) só oferecia 400px de rolagem: os cards 3 e 4 nunca chegavam a
   grudar. 120px por vão dá ~405px de percurso para cada card. */
.nv-fases__card + .nv-fases__card {
	margin-top: var(--wp--preset--spacing--8);
}

/* Cada card numa cor da paleta de cursos, em tinta clara (mesma técnica do
   .nv-curso-card): saturado demais brigaria com o verde do fundo e derrubaria
   o contraste do texto. A inclinação alterna de lado pra dar o ar de pilha
   de cartas em vez de blocos empilhados. */
.nv-fases__card--1 {
	top: 110px;
	transform: rotate(-1.5deg);
	background: color-mix(in srgb, #F5B400 12%, #fff);
}
.nv-fases__card--2 {
	top: 132px;
	transform: rotate(1.2deg);
	background: color-mix(in srgb, #6F2681 10%, #fff);
}
.nv-fases__card--3 {
	top: 154px;
	transform: rotate(-1deg);
	background: color-mix(in srgb, #079C5F 12%, #fff);
}
.nv-fases__card--4 {
	top: 176px;
	transform: rotate(1.5deg);
	background: color-mix(in srgb, #F15622 11%, #fff);
}

.nv-fases__icone {
	margin: 0 0 var(--wp--preset--spacing--3);
}
.nv-fases__icone img {
	display: block;
	width: 40px;
	height: 40px;
}
/* A cor de cada ícone vive dentro do próprio .svg: currentColor não atravessa
   a fronteira do <img> (o SVG é um documento isolado, não herda a cor de quem
   o carrega). Se for trocar a cor de um card, trocar também no arquivo. */

.nv-fases__card-titulo {
	margin: 0 0 0.5rem;
	font-size: 1.3rem;
	line-height: 1.2;
	color: #151544;
}
.nv-fases__card-texto {
	margin: 0;
	font-size: 0.95rem;
	line-height: 1.55;
	color: var(--wp--preset--color--text-muted);
}

@media (max-width: 781px) {
	/* A profundidade do arco é proporcional à largura da tela: a mesma elipse
	   que no desktop é um repuxo raso vira uma tigela funda no celular. */
	.nv-fases::after {
		height: 40px;
		background: radial-gradient(72% 40px at 50% 0, transparent 99.5%, #FAF8F5 100%);
	}
	/* 60px de respiro + os 40px que o arco ocupa nesta faixa. */
	.nv-fases {
		padding-bottom: 100px !important;
	}
	.nv-fases__cols {
		gap: var(--wp--preset--spacing--5);
	}
	/* Empilhado, a coluna de texto não tem contra o que "grudar" — vira fluxo
	   normal. Os cards seguem sticky, que é o efeito pedido. */
	.nv-fases__texto {
		position: static;
	}
	.nv-fases__card {
		padding: var(--wp--preset--spacing--4);
		border-radius: 20px;
	}
	.nv-fases__card--1 { top: 90px; }
	.nv-fases__card--2 { top: 106px; }
	.nv-fases__card--3 { top: 122px; }
	.nv-fases__card--4 { top: 138px; }
}

/* ==========================================================================
   BOLSAS — chamada principal: texto à esquerda, coluna de mídia à direita
   (reservada). O ícone traz a própria animação dentro do .svg.
   ========================================================================== */
.nv-bolsas__cols {
	gap: var(--wp--preset--spacing--7);
}

.nv-bolsas__icone {
	margin: 0 0 var(--wp--preset--spacing--4);
}
.nv-bolsas__icone img {
	display: block;
	width: 56px;
	height: 56px;
}

.nv-bolsas__titulo {
	margin: 0;
	/* medido: nesta largura o título quebra nas 3 linhas da referência
	   ("Bolsas de até 100%" / "pra quem passar no" / "processo seletivo") */
	max-width: 450px;
	font-size: var(--nv-titulo-secao);
	line-height: 1.15;
	color: #151544;
}
.nv-bolsas__sub {
	margin: var(--wp--preset--spacing--4) 0 0;
	max-width: 52ch;
	color: var(--wp--preset--color--text-muted);
}

.nv-bolsas__formatos {
	margin-top: var(--wp--preset--spacing--6) !important;
	gap: var(--wp--preset--spacing--5);
}
.nv-bolsas__formato-titulo {
	margin: 0 0 0.55rem;
	font-size: 1.15rem;
	line-height: 1.2;
	color: #151544;
}
.nv-bolsas__formato-texto {
	margin: 0;
	font-size: var(--wp--preset--font-size--base);
	line-height: 1.55;
	color: var(--wp--preset--color--text-muted);
}

.nv-bolsas__texto .wp-block-buttons {
	margin-top: var(--wp--preset--spacing--6);
}

/* Coluna reservada pra mídia: sem conteúdo ainda, o wp:columns colapsaria a
   altura dela e a linha ficaria desalinhada. O min-height segura o espaço até
   a imagem/vídeo entrar; some no mobile, onde a coluna vazia só criaria um
   buraco entre o CTA e a próxima seção. */
.nv-bolsas__midia {
	min-height: 520px;
}
@media (max-width: 781px) {
	.nv-bolsas__cols {
		gap: var(--wp--preset--spacing--5);
	}
	.nv-bolsas__midia {
		min-height: 0;
	}
}

/* ==========================================================================
   EDITAL — faixa roxa horizontal: ícone ao lado do texto e os botões de
   download por cidade numa linha só. É uma seção de apoio, não de conversão,
   por isso é mais baixa e com título menor que as demais.
   ========================================================================== */
.nv-edital__box {
	border-radius: 28px;
	color: #fff;
	/* roxo da marca em três paradas; o size maior que 100% é o que dá espaço
	   pro degradê "andar" na animação. */
	background: linear-gradient(130deg, #4E1C5C 0%, #6F2681 40%, #8B3299 60%, #6F2681 80%, #4E1C5C 100%);
	background-size: 260% 260%;
	box-shadow: 0 16px 40px rgba(78, 28, 92, 0.18);
}
@media (prefers-reduced-motion: no-preference) {
	.nv-edital__box {
		animation: nv-edital-degrade 20s ease-in-out infinite;
	}
}
@keyframes nv-edital-degrade {
	0%, 100% { background-position: 0% 50%; }
	50%      { background-position: 100% 50%; }
}

.nv-edital__topo {
	gap: var(--wp--preset--spacing--3);
}
/* Altura casada com o bloco de texto ao lado (título + legenda). */
.nv-edital__icone {
	flex: 0 0 auto;
	margin: 0 !important;
}
.nv-edital__icone img {
	display: block;
	width: 52px;
	height: 52px;
}

.nv-edital__titulo {
	margin: 0;
	font-size: 1.5rem;
	line-height: 1.2;
	color: #fff;
}
.nv-edital__sub {
	margin: 0.35rem 0 0;
	font-size: 0.95rem;
	line-height: 1.5;
	color: rgba(255, 255, 255, 0.82);
}

/* Os 5 numa linha só. O flex:1 1 auto reparte a sobra da linha entre eles a
   partir do tamanho do próprio rótulo: assim todos preenchem a largura e o
   space-between tem folga pra empurrar texto e ícone pras pontas. O nowrap
   evita o nome da cidade quebrar dentro da pílula. */
.nv-edital__cidades {
	margin-top: var(--wp--preset--spacing--4) !important;
	gap: 0.5rem;
}
.nv-edital__cidades .wp-block-button {
	flex: 1 1 auto;
}
/* Repete o ".btn-ghost" no seletor de propósito: a regra base do tema é
   ".wp-block-button.btn-ghost .wp-block-button__link" (3 classes) e vence uma
   com 2, então padding e alinhamento daqui seriam ignorados em silêncio. */
.nv-edital__cidades .wp-block-button.btn-ghost .wp-block-button__link {
	width: 100%;
	justify-content: space-between;
	gap: var(--wp--preset--spacing--3);
	padding: 8px 8px 8px 30px;
	font-size: 0.8rem !important;
	white-space: nowrap;
	/* Ícone de documento em vez da seta: estes botões baixam um PDF, e seta
	   pra direita lê como navegação. Quando os href de 2027 forem preenchidos,
	   a regra [href$=".pdf"] do tema aponta pro mesmo ícone — sem conflito. */
	--nv-btn-ico: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%236F2681' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z'/%3E%3Cpolyline points='14 2 14 8 20 8'/%3E%3Cline x1='16' y1='13' x2='9' y2='13'/%3E%3Cline x1='16' y1='17' x2='9' y2='17'/%3E%3C/svg%3E");
}
.nv-edital__cidades .wp-block-button.btn-ghost .wp-block-button__link::after {
	width: 24px;
	height: 24px;
	background-size: 13px 13px;
}

/* Grade de 3 em vez de fila única. Com Governador Valadares desdobrado em duas
   unidades são seis botões, e em fila eles quebravam 5 + 1: o último sobrava
   sozinho na segunda linha, esticado de ponta a ponta, porque o `width:100%`
   do link faz o item solto ocupar todo o espaço restante da linha.
   Duas fileiras de três resolvem e ainda dão folga pros rótulos das duas
   unidades de GV, que são os mais longos.
   O !important é contra o `.wp-block-buttons.is-layout-flex{display:flex}` que
   o WordPress gera pro layout do bloco: dois seletores de classe contra um. */
.nv-edital__cidades {
	display: grid !important;
	grid-template-columns: repeat(3, 1fr);
}
.nv-edital__cidades .wp-block-button {
	width: 100%;
}

@media (max-width: 900px) {
	/* Abaixo disso três não cabem: viram duas colunas, que ainda leem como
	   bloco único (empilhar seis alongaria demais a seção). */
	.nv-edital__cidades {
		grid-template-columns: repeat(2, 1fr);
	}
	.nv-edital__cidades .wp-block-button,
	.nv-edital__cidades .wp-block-button.btn-ghost .wp-block-button__link {
		width: 100%;
	}
	.nv-edital__cidades .wp-block-button.btn-ghost .wp-block-button__link {
		justify-content: space-between;
	}
}
@media (max-width: 600px) {
	.nv-edital__topo {
		flex-wrap: wrap !important;
	}
	.nv-edital__cidades {
		grid-template-columns: 1fr;
	}
}

/* ==========================================================================
   FAQ — acordeão nativo (<details>/<summary>). Sem JS: o navegador cuida do
   abre/fecha, do foco e do anúncio pro leitor de tela.
   ========================================================================== */
.nv-faq__titulo {
	margin: 0;
	font-size: var(--nv-titulo-secao);
	line-height: 1.15;
	color: #151544;
}
.nv-faq__sub {
	margin: var(--wp--preset--spacing--2) 0 0;
	color: var(--wp--preset--color--text-muted);
}

.nv-faq__lista {
	margin-top: var(--wp--preset--spacing--6);
	display: flex;
	flex-direction: column;
	gap: 8px;
}
/* margin-block-start é o blockGap do tema (24px) aplicado a todo filho que não
   é o primeiro — ele SOMA com o gap do flex acima (8 + 24 = 32) e afasta os
   itens. Zerar e deixar só o gap mandando. */
.nv-faq__lista > .nv-faq__item {
	margin-block-start: 0 !important;
	margin-block-end: 0 !important;
}

.nv-faq__item {
	background: var(--wp--preset--color--white);
	border: 1px solid var(--wp--preset--color--borda);
	border-radius: 16px;
	padding: 0 var(--wp--preset--spacing--4);
	/* interpolate-size é o que destrava animar ATÉ um valor-palavra: sem ele o
	   `block-size: auto` do ::details-content lá embaixo não interpola e o
	   conteúdo continua aparecendo de uma vez. Fica escopado aqui, e não no
	   :root, porque a propriedade é herdada: no :root ela ligaria interpolação
	   de keyword em qualquer transição de height/width do resto do site, que
	   hoje salta de propósito. */
	interpolate-size: allow-keywords;
	transition: border-color 0.2s ease, padding-bottom 0.32s ease;
}
.nv-faq__item[open] {
	border-color: var(--wp--preset--color--laranja);
}

/* ── Abertura e fechamento animados ──
   O ::details-content é o pseudo-elemento que embrulha tudo que vem depois do
   <summary>. Antes dele existir não havia o que animar num <details>: o
   navegador alternava a exibição do conteúdo inteiro de uma vez, e as
   soluções eram gambiarra (max-height chutado, wrapper com grid 0fr→1fr ou JS
   medindo altura). Aqui é a altura real, sem valor mágico.

   O content-visibility com allow-discrete é o par obrigatório do block-size:
   ele é uma propriedade discreta (liga/desliga, sem meio-termo), e sem o
   allow-discrete o navegador esconde o conteúdo já no primeiro frame do
   fechamento — a altura animaria sobre o vazio e o efeito só apareceria na
   abertura.

   Navegador sem suporte a ::details-content ignora este bloco e volta ao
   comportamento de hoje, abrindo direto. Nada quebra. */
.nv-faq__item::details-content {
	block-size: 0;
	overflow: hidden;
	transition:
		block-size 0.32s ease,
		content-visibility 0.32s allow-discrete;
}
.nv-faq__item[open]::details-content {
	block-size: auto;
}

.nv-faq__item > summary {
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: var(--wp--preset--spacing--3);
	/* padding no summary (e não no details) pra área de clique cobrir a linha
	   toda; 60px garante o alvo de toque mínimo (WCAG 2.5.8). */
	min-height: 60px;
	padding: var(--wp--preset--spacing--3) 0;
	cursor: pointer;
	list-style: none;
	font-family: var(--wp--preset--font-family--heading);
	font-weight: 700;
	font-size: 1.02rem;
	line-height: 1.35;
	color: #151544;
}
/* Some com o triangulinho padrão do navegador (os dois seletores são
   necessários: WebKit usa o pseudo-elemento, o resto usa list-style). */
.nv-faq__item > summary::-webkit-details-marker {
	display: none;
}

/* Sinal de + que vira − quando abre. Feito com mask pra herdar a cor via
   background-color, em vez de duas imagens. */
.nv-faq__item > summary::after {
	content: "";
	flex: 0 0 auto;
	width: 22px;
	height: 22px;
	background-color: var(--wp--preset--color--laranja);
	-webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='2.5' stroke-linecap='round'%3E%3Cline x1='12' y1='5' x2='12' y2='19'/%3E%3Cline x1='5' y1='12' x2='19' y2='12'/%3E%3C/svg%3E") no-repeat center / contain;
	mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='2.5' stroke-linecap='round'%3E%3Cline x1='12' y1='5' x2='12' y2='19'/%3E%3Cline x1='5' y1='12' x2='19' y2='12'/%3E%3C/svg%3E") no-repeat center / contain;
	transition: transform 0.22s ease;
}
.nv-faq__item[open] > summary::after {
	/* 45° transforma o + em ×; o traço vertical some visualmente no cruzamento
	   e lê como "fechar". Mais barato que trocar a máscara. */
	transform: rotate(45deg);
}

.nv-faq__item > summary:focus-visible {
	outline: 2px solid var(--wp--preset--color--laranja);
	outline-offset: 4px;
	border-radius: 8px;
}

.nv-faq__item > *:not(summary) {
	margin: 0;
	font-size: var(--wp--preset--font-size--base);
	line-height: 1.6;
	color: var(--wp--preset--color--text-muted);
}
/* O respiro embaixo vai no card, não na margem do parágrafo: o reset de
   último filho do WordPress (:where(.is-layout-flow) > :last-child) zera
   margin-block-end e a margem simplesmente não pegava. */
.nv-faq__item[open] {
	padding-bottom: var(--wp--preset--spacing--4);
}

@media (prefers-reduced-motion: reduce) {
	.nv-faq__item,
	.nv-faq__item > summary::after,
	.nv-faq__item::details-content {
		transition: none;
	}
}

/* ==========================================================================
   "Ainda com dúvidas?" — caixa verde compacta com o WhatsApp do Canal de
   Relacionamento. Fecha a LP logo depois do FAQ, então é de propósito baixa e
   horizontal: quem chegou aqui já leu as respostas, isso é só a saída.
   ========================================================================== */
.nv-duvidas__box {
	border-radius: 24px;
	color: #fff;
	gap: var(--wp--preset--spacing--4);
	/* mesmo verde da .nv-fases, com o size acima de 100% pro degradê ter
	   espaço pra "andar" na animação. */
	background: linear-gradient(125deg, #05613B 0%, #079C5F 35%, #0BB86E 55%, #079C5F 75%, #05613B 100%);
	background-size: 260% 260%;
}
@media (prefers-reduced-motion: no-preference) {
	.nv-duvidas__box {
		animation: nv-duvidas-degrade 20s ease-in-out infinite;
	}
}
@keyframes nv-duvidas-degrade {
	0%, 100% { background-position: 0% 50%; }
	50%      { background-position: 100% 50%; }
}

.nv-duvidas__icone {
	flex: 0 0 auto;
	margin: 0 !important;
}
.nv-duvidas__icone img {
	display: block;
	width: 44px;
	height: 44px;
}

.nv-duvidas__texto {
	flex: 1 1 auto;
	margin-block-start: 0 !important;
}
.nv-duvidas__titulo {
	margin: 0;
	font-size: 1.35rem;
	line-height: 1.2;
	color: #fff;
}
.nv-duvidas__sub {
	margin: 0.3rem 0 0;
	font-size: 0.95rem;
	line-height: 1.5;
	color: rgba(255, 255, 255, 0.82);
}

.nv-duvidas__acao {
	flex: 0 0 auto;
	/* blockGap do tema empurraria a ação pra baixo dentro do flex row. */
	margin-block-start: 0 !important;
}
/* Pílula branca sólida em vez do contorno vazado. É a única ação da caixa, e
   contra o verde em degradê o ghost sumia — o branco cheio é o ponto de maior
   contraste da seção, então o olho vai direto nele.
   A sombra dura embaixo é a mesma linguagem do .btn-cta laranja do site (lá é
   marinho, aqui é verde escuro): mantém a família sem competir com o laranja,
   que segue sendo a ação principal da página.
   O ".btn-ghost" repetido no seletor não é redundância: a regra base do tema é
   ".wp-block-button.btn-ghost .wp-block-button__link" (3 classes) e venceria
   uma daqui com 2, em silêncio. */
.nv-duvidas__acao .wp-block-button.btn-ghost .wp-block-button__link {
	white-space: nowrap;
	gap: 0.55rem;
	/* disco encostado na borda direita, texto respirando na esquerda */
	padding: 8px 8px 8px 26px;
	background-color: #fff;
	border-color: #fff;
	color: #05613B;
	font-weight: 800;
	font-size: 0.9rem !important;
	/* peça sólida + halo suave pra descolar do degradê */
	box-shadow: 0 5px 0 #044029, 0 14px 26px rgba(3, 45, 28, 0.22);
}

/* Disco invertido: no resto do site é branco com o glifo escuro; aqui o botão
   já é branco, então o disco vira verde com o glifo em branco. */
.nv-duvidas__acao .wp-block-button.btn-ghost .wp-block-button__link {
	--nv-btn-ico: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='%23ffffff'%3E%3Cpath d='M12 2a10 10 0 0 0-8.6 15.1L2 22l5.1-1.3A10 10 0 1 0 12 2Zm0 18.2a8.1 8.1 0 0 1-4.2-1.2l-.3-.2-3 .8.8-2.9-.2-.3A8.2 8.2 0 1 1 12 20.2Zm4.5-6.1c-.2-.1-1.5-.7-1.7-.8-.2-.1-.4-.1-.6.1-.2.2-.7.8-.8.9-.1.2-.3.2-.5.1-.2-.1-1-.4-2-1.2-.7-.6-1.2-1.4-1.4-1.6-.1-.2 0-.4.1-.5l.4-.4c.1-.1.2-.3.2-.4.1-.2 0-.3 0-.4L9.3 8c-.2-.4-.4-.4-.5-.4h-.5c-.2 0-.4.1-.6.3-.2.2-.8.8-.8 1.9s.8 2.2.9 2.4c.1.2 1.6 2.5 3.9 3.4.5.2 1 .4 1.3.5.5.2 1 .1 1.4.1.4-.1 1.3-.5 1.5-1.1.2-.5.2-.9.1-1Z'/%3E%3C/svg%3E");
}
.nv-duvidas__acao .wp-block-button.btn-ghost .wp-block-button__link::after {
	width: 28px;
	height: 28px;
	background-color: #079C5F;
	background-size: 15px 15px;
}

/* O botão afunda sobre a sombra, igual ao .btn-cta. O hover do .on-dark
   inverteria pra fundo branco/texto secundário — precisa ser neutralizado
   aqui, senão o botão pisca de cor ao passar o mouse. */
.nv-duvidas__acao .wp-block-button.btn-ghost .wp-block-button__link:hover {
	background-color: #fff;
	color: #05613B;
	box-shadow: 0 3px 0 #044029, 0 10px 18px rgba(3, 45, 28, 0.26);
}
.nv-duvidas__acao .wp-block-button.btn-ghost .wp-block-button__link:active {
	transform: none;
	box-shadow: 0 0 0 #044029;
}
@media (prefers-reduced-motion: no-preference) {
	.nv-duvidas__acao .wp-block-button.btn-ghost .wp-block-button__link:hover {
		transform: translateY(2px);
	}
	/* pulsinho lento no disco, só pra sinalizar "tem alguém do outro lado" */
	.nv-duvidas__acao .wp-block-button.btn-ghost .wp-block-button__link::after {
		animation: nv-duvidas-pulso 2.8s ease-in-out infinite;
	}
}
@keyframes nv-duvidas-pulso {
	0%, 70%, 100% { box-shadow: 0 0 0 0 rgba(7, 156, 95, 0); }
	35%           { box-shadow: 0 0 0 6px rgba(7, 156, 95, 0.28); }
}

.nv-duvidas__acao .wp-block-button.btn-ghost .wp-block-button__link:focus-visible {
	outline: 3px solid #fff;
	outline-offset: 4px;
}

@media (max-width: 780px) {
	.nv-duvidas__box {
		flex-wrap: wrap !important;
		text-align: center;
		justify-content: center;
	}
	.nv-duvidas__texto {
		flex-basis: 100%;
	}
	.nv-duvidas__acao {
		flex-basis: 100%;
		justify-content: center;
	}
	.nv-duvidas__acao .wp-block-button,
	.nv-duvidas__acao .wp-block-button.btn-ghost .wp-block-button__link {
		width: 100%;
	}
}

/* O número não pode quebrar no meio ("800" numa linha e "033 8921" na outra) —
   telefone partido lê como dois números diferentes. */
.nv-duvidas__fone {
	white-space: nowrap;
	font-weight: 600;
	color: #fff;
}

/* ==========================================================================
   Rodapé das LPs — mesma pele do rodapé do site (fundo, cantos, cores de
   link), só que numa faixa só. Herda tudo de .site-footer; aqui vai apenas o
   que é específico da versão enxuta.
   ========================================================================== */
.site-footer__lp-topo {
	gap: var(--wp--preset--spacing--4);
}
/* O logo é um <div> do wp:site-logo: sem isso o blockGap do tema empurraria a
   linha inteira pra baixo dentro do flex. */
.site-footer--lp .wp-block-site-logo,
.site-footer__lp-volta {
	margin-block-start: 0 !important;
}
.site-footer--lp .wp-block-site-logo img {
	display: block;
}

/* O botão de volta é a única saída do rodapé, então fica no ghost marinho
   (fundo claro aqui, não precisa do .on-dark). Compacto de propósito: é uma
   porta, não uma chamada. */
.site-footer__lp-volta .wp-block-button.btn-ghost .wp-block-button__link {
	padding: 12px 26px;
	font-size: 0.85rem !important;
}

/* No estreito o par logo + botão só centraliza: deixo o flex quebrar sozinho
   quando não couber (acontece por volta dos 400px). Esticar o botão em 100%
   ficaria desproporcional ao lado de um logo de 160px. */
@media (max-width: 600px) {
	.site-footer__lp-topo {
		justify-content: center !important;
		text-align: center;
	}
}

/* Botão de edital ainda sem PDF: o :not([href]) faz o estado "aguardando"
   ser consequência automática do dado que falta, e não uma classe que alguém
   precisa lembrar de tirar depois. Quando o link for colado no editor, o
   botão volta ao normal sozinho. */
.nv-edital__cidades .wp-block-button.btn-ghost .wp-block-button__link:not([href]) {
	opacity: 0.45;
	cursor: default;
	pointer-events: none;
}
.nv-edital__aviso {
	margin: var(--wp--preset--spacing--3) 0 0 !important;
	font-size: 0.8rem;
	line-height: 1.4;
	color: rgba(255, 255, 255, 0.72);
}

/* ==========================================================================
   Barra de CTA fixa (só no celular). A LP tem ~15 telas de altura no mobile e
   não tinha nenhum botão sempre à mão; a barra também repete data e valor, que
   antes só existiam no topo.
   ========================================================================== */
/* !important porque o WordPress gera ".wp-block-group.is-layout-flex{display:flex}"
   pro layout do bloco: dois seletores de classe contra um daqui, e ele ganharia. */
.nv-barra-cta {
	display: none !important;
}

@media (max-width: 781px) {
	.nv-barra-cta {
		display: flex !important;
		position: fixed;
		z-index: 90;
		right: 0;
		bottom: 0;
		left: 0;
		gap: var(--wp--preset--spacing--3);
		/* env(safe-area-inset-bottom) tira a barra de baixo da faixa do gesto
		   de home nos iPhones sem botão, senão o botão fica meio inalcançável. */
		padding: 10px 16px calc(10px + env(safe-area-inset-bottom, 0px));
		background: rgba(255, 255, 255, 0.94);
		backdrop-filter: blur(10px);
		-webkit-backdrop-filter: blur(10px);
		border-top: 1px solid var(--wp--preset--color--borda);
		box-shadow: 0 -6px 24px rgba(21, 21, 68, 0.1);
	}

	/* O rodapé precisa caber acima da barra, senão a última linha do legal
	   fica escondida atrás dela pra sempre.
	   !important porque o padding do rodapé vem inline no bloco (style="…"),
	   e estilo inline vence qualquer seletor.

	   Condicionado a a barra EXISTIR na página (:has). Antes valia pra todo
	   mundo que usasse o footer-lp, e a página /links/, que não tem barra
	   nenhuma, ficava com 108px de espaço morto embaixo do legal — folga
	   reservada pra um elemento que nunca aparece. Sem a barra, vale o padding
	   do próprio bloco (32px). */
	body:has(.nv-barra-cta) .site-footer--lp {
		padding-bottom: calc(var(--wp--preset--spacing--4) + 76px) !important;
	}

	.nv-barra-cta__info {
		flex: 1 1 auto;
		min-width: 0;
		margin-block-start: 0 !important;
	}
	.nv-barra-cta__data {
		margin: 0 !important;
		font-family: var(--wp--preset--font-family--heading);
		font-weight: 800;
		font-size: 0.9rem;
		line-height: 1.2;
		color: #151544;
	}
	.nv-barra-cta__valor {
		margin: 2px 0 0 !important;
		font-size: 0.78rem;
		line-height: 1.2;
		color: var(--wp--preset--color--text-muted);
	}

	.nv-barra-cta__acao {
		flex: 0 0 auto;
		margin-block-start: 0 !important;
	}
	.nv-barra-cta__acao .wp-block-button.btn-cta .wp-block-button__link {
		white-space: nowrap;
		padding: 8px 8px 8px 18px;
		font-size: 0.85rem !important;
		/* sombra dura de 5px encostaria na borda inferior da barra */
		box-shadow: 0 3px 0 var(--nv-marinho);
	}
}

/* Telas bem estreitas: o valor sai e fica só a data, pro botão não espremer. */
@media (max-width: 360px) {
	.nv-barra-cta__valor {
		display: none;
	}
}

/* ==========================================================================
   Escala de título dentro da LP. Fecha o buraco do QA: os títulos de seção
   estavam em 28, 34, 35.2, 38.4, 43.2 e 44.8px, seis tamanhos sem que nenhuma
   diferença significasse alguma coisa.
   O passo acima do h2 do site (34px) é de propósito: uma LP pede título mais
   presente que uma página institucional. O que não pode é cada seção escolher
   o seu.
   Escopo em .nv-lp porque .nv-cidades-heading-row também vive na home, e lá o
   título tem que continuar seguindo o h2 do tema.
   ========================================================================== */
.nv-lp .nv-cidades-heading-row .wp-block-heading {
	font-size: var(--nv-titulo-secao);
	line-height: 1.15;
	/* Sobrepõe os 480px do padrão (que na home dá o desenho certo): nesta LP o
	   título é maior e a 480px quebrava em 3 linhas, sendo que a terceira era só
	   "2027". 560px é o degrau que fecha em 2 linhas com folga — a virada
	   acontece em 520px, e acima de 720px voltaria a caber numa linha só no
	   tablet, o que descaracterizaria o bloco. */
	max-width: 560px;
}

/* Faixas compactas: edital e "ainda com dúvidas" são apoio, não seção. Ficam
   no degrau de baixo, agora no mesmo valor em vez de 24 e 21.6px. */
.nv-edital__titulo,
.nv-duvidas__titulo {
	font-size: var(--nv-titulo-faixa);
}

/* Lembrete de data e valor colado nos CTAs de baixo. Discreto de propósito:
   é informação de apoio pra quem já decidiu, não uma segunda chamada. */
.nv-lembrete {
	margin: var(--wp--preset--spacing--3) 0 0 !important;
	font-size: 0.85rem;
	line-height: 1.4;
	color: var(--wp--preset--color--text-muted);
}
/* Sobre o verde das fases o texto apagado sumiria. */
.nv-fases__texto .nv-lembrete {
	color: rgba(255, 255, 255, 0.85);
}
@media (max-width: 781px) {
	/* No celular a barra fixa já mostra data e valor o tempo todo; repetir
	   dentro da seção vira ruído. */
	.nv-lembrete {
		display: none;
	}
}

/* ==========================================================================
   H1 da home. Existe pra a página inicial ter um nível 1 de verdade (a
   auditoria de 30/07 achou a home sem nenhum), mas sem disputar atenção com o
   hero de campanha logo abaixo. Referência: a linha discreta do Jornal da
   Cidade entre o cabeçalho e a manchete.
   ========================================================================== */
.nv-home-h1 {
	/* margin-block-start é o blockGap do tema (24px) aplicado a todo filho de
	   .wp-site-blocks que não é o primeiro. Aqui ele grudava um vão fantasma
	   entre o cabeçalho e a faixa, por fora do padding. */
	margin-block-start: 0 !important;
	padding: 16px 20px;
	background: var(--wp--preset--color--background);
}
.nv-home-h1__texto {
	/* Só o eixo vertical. "margin: 0" zerava junto as margens laterais "auto"
	   que o layout constrained usa pra centralizar a caixa de 1100px, e o
	   título saía encostado à esquerda. O !important é por causa do blockGap
	   de 24px que o tema aplica em todo filho de grupo. */
	margin-block: 0 !important;
	font-family: var(--wp--preset--font-family--heading);
	font-weight: 700;
	/* deliberadamente pequeno: é declaração de identidade, não manchete */
	font-size: 0.75rem;
	line-height: 1.4;
	letter-spacing: 0.01em;
	color: #151544;
}

@media (max-width: 600px) {
	.nv-home-h1 {
		padding-top: 12px;
		padding-bottom: 12px;
	}
	.nv-home-h1__texto {
		/* mesmos 12px do desktop: abaixo disso o texto deixa de ser legível
		   antes de deixar de ser discreto. */
		font-size: 0.75rem;
	}
}

/* ==========================================================================
   Poppins auto-hospedada. A arte dos heroes (home e LP) pede Poppins, e as duas
   páginas puxavam de fonts.googleapis.com: requisição de terceiro no caminho
   crítico do primeiro paint, e IP de todo visitante indo pro Google sem que
   ninguém tenha consentido. Só os cortes latin e latin-ext; o devanagari que
   vinha junto era peso morto num site em português.
   ========================================================================== */
@font-face {
	font-family: "Poppins";
	font-style: normal;
	font-weight: 700;
	font-display: swap;
	src: url("../fonts/poppins-700-latin.woff2") format("woff2");
	unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
	font-family: "Poppins";
	font-style: normal;
	font-weight: 700;
	font-display: swap;
	src: url("../fonts/poppins-700-latin-ext.woff2") format("woff2");
	unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
@font-face {
	font-family: "Poppins";
	font-style: normal;
	font-weight: 800;
	font-display: swap;
	src: url("../fonts/poppins-800-latin.woff2") format("woff2");
	unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
	font-family: "Poppins";
	font-style: normal;
	font-weight: 800;
	font-display: swap;
	src: url("../fonts/poppins-800-latin-ext.woff2") format("woff2");
	unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
@font-face {
	font-family: "Poppins";
	font-style: italic;
	font-weight: 800;
	font-display: swap;
	src: url("../fonts/poppins-800-italic-latin.woff2") format("woff2");
	unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
	font-family: "Poppins";
	font-style: italic;
	font-weight: 800;
	font-display: swap;
	src: url("../fonts/poppins-800-italic-latin-ext.woff2") format("woff2");
	unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}

/* ==========================================================================
   ENTRADA DE ELEMENTOS AO ROLAR

   A regra de ouro está no seletor: tudo depende de .nv-reveal-on no <html>,
   que só o JS adiciona. Sem JS, sem prefers-reduced-motion atendido, ou se o
   arquivo não carregar, nada disso vale e o conteúdo aparece normal. Esconder
   por CSS e revelar por JS é como se deixa um site em branco.
   ========================================================================== */
.nv-reveal-on .js-reveal {
	opacity: 0;
	/* 14px é o suficiente pra o olho ler como "chegou agora". Mais que isso
	   vira deslocamento e começa a competir com o scroll. */
	transform: translateY(14px);
	transition:
		opacity 0.52s cubic-bezier(0.22, 0.61, 0.36, 1) var(--nv-reveal-atraso, 0ms),
		transform 0.52s cubic-bezier(0.22, 0.61, 0.36, 1) var(--nv-reveal-atraso, 0ms);
	/* o navegador prepara a camada só enquanto o elemento ainda vai animar */
	will-change: opacity, transform;
}

.nv-reveal-on .js-reveal.is-inview {
	opacity: 1;
	transform: none;
	will-change: auto;
}

/* O que já estava na tela no primeiro paint entra sem transição: animar o que
   está acima da dobra atrasa o LCP e faz a página parecer mais lenta. */
.nv-reveal-on .js-reveal.nv-reveal--sem-anim {
	transition: none;
}

/* Variante pra bloco largo (seção inteira, caixa branca): sobe menos, porque
   deslocar uma área grande chama mais atenção que o conteúdo dela. */
.nv-reveal-on .js-reveal.js-reveal--suave {
	transform: translateY(8px);
}

@media (prefers-reduced-motion: reduce) {
	.nv-reveal-on .js-reveal,
	.nv-reveal-on .js-reveal.is-inview {
		opacity: 1;
		transform: none;
		transition: none;
	}
}

/* ==========================================================================
   TRANSIÇÃO ENTRE PÁGINAS

   View Transitions nativa entre documentos. Uma regra de CSS, zero JavaScript,
   zero router. Onde o navegador não suporta (Firefox, hoje), a navegação
   acontece do jeito de sempre: não quebra nada, só não tem o efeito.

   O ganho real não é o fade. É o header e o rodapé receberem nome próprio e
   PARAREM de participar do cross-fade: eles ficam parados enquanto só o miolo
   troca. A navegação deixa de parecer "a página piscou" e passa a parecer "o
   conteúdo mudou", que é o que de fato aconteceu.
   ========================================================================== */
@view-transition {
	navigation: auto;
}

/* Cada nome tem que ser único no documento. Header e rodapé aparecem uma vez
   só; o miolo é o que realmente troca. */
.site-header {
	view-transition-name: nv-cabecalho;
}
.site-footer,
.site-footer--lp {
	view-transition-name: nv-rodape;
}
.site-main {
	view-transition-name: nv-conteudo;
}

/* O conteúdo sai e entra com um deslocamento pequeno, na mesma direção da
   leitura. 220ms: rápido o bastante pra não atrasar quem já sabe onde quer
   chegar, longo o bastante pra o olho registrar a troca. */
::view-transition-old(nv-conteudo) {
	animation: nv-pagina-sai 0.18s cubic-bezier(0.4, 0, 1, 1) both;
}
::view-transition-new(nv-conteudo) {
	animation: nv-pagina-entra 0.28s cubic-bezier(0, 0, 0.2, 1) both;
}

@keyframes nv-pagina-sai {
	to { opacity: 0; transform: translateY(-8px); }
}
@keyframes nv-pagina-entra {
	from { opacity: 0; transform: translateY(10px); }
}

/* Header e rodapé não têm animação nomeada: sem isso o navegador aplicaria o
   cross-fade padrão neles também, e o efeito de "moldura fixa" se perde. */
::view-transition-old(nv-cabecalho),
::view-transition-new(nv-cabecalho),
::view-transition-old(nv-rodape),
::view-transition-new(nv-rodape) {
	animation: none;
	mix-blend-mode: normal;
}

@media (prefers-reduced-motion: reduce) {
	@view-transition {
		navigation: none;
	}
	::view-transition-old(nv-conteudo),
	::view-transition-new(nv-conteudo) {
		animation: none;
	}
}

/* ===========================================================================
   TEMPORÁRIO — remover no lançamento do Processo de Admissão 2027
   ===========================================================================
   Botão do header oculto a pedido do cliente em 01/08/2026, até a campanha
   abrir. O aviso pra reativar vem manualmente, não por data.

   Escondido por CSS, e não removido do parts/header.html, de propósito: voltar
   é apagar este bloco, sem precisar reconstruir markup de bloco Gutenberg e
   sem risco de o botão voltar diferente do que era.

   display:none tira o botão também da ordem de tabulação e da árvore de
   acessibilidade, então ele não fica alcançável por teclado nem anunciado por
   leitor de tela enquanto estiver oculto.

   A LP /processo-de-admissao-2027/ continua publicada e acessível por link
   direto — o que está oculto é a chamada, não a página.
   ======================================================================== */
.site-header__cta {
	display: none !important;
}

/* ==========================================================================
   MOBILE — vão entre "Formação completa" e "Por dentro do Genoma"
   ==========================================================================
   No celular esse intervalo somava 192px de quatro fontes empilhadas, e lia
   como se a página tivesse acabado:

     64px  padding-bottom da .nv-formacao (4rem, style inline do bloco)
     64px  padding-top da .nv-por-dentro (4rem, idem)
     24px  blockGap órfão no .alignwide — ele não é o primeiro filho da seção
           (a onda decorativa vem antes), então herda o margin-block-start
           padrão do WordPress sem que ninguém tenha pedido
     40px  padding-top do .nv-por-dentro__texto, desenhado pra alinhar o texto
           com o topo do mosaico no desktop, onde as duas colunas convivem

   Os dois últimos não são decisão de design nesta largura: no mobile as colunas
   empilham, então não há nada com que alinhar, e o blockGap nunca foi
   intencional. Ficam 64px no total, que é o respiro normal entre seções aqui.
   !important nos dois primeiros porque o padding vem de style inline do bloco.
   ========================================================================== */
@media (max-width: 781px) {
	.nv-formacao {
		padding-bottom: var(--wp--preset--spacing--4) !important;
	}

	.nv-por-dentro {
		padding-top: var(--wp--preset--spacing--4) !important;
	}

	.nv-por-dentro > .alignwide {
		margin-top: 0;
	}

	.nv-por-dentro__texto {
		padding-top: 0;
	}
}

/* ==========================================================================
   Página de links da bio — /links/
   --------------------------------------------------------------------------
   Uma tela, sem rolagem: quem chega vem do link da bio do Instagram, abre no
   navegador interno do app (que come ~120px dos 844 do aparelho) e decide em
   segundos. O orçamento de altura do conteúdo é ~560px, e é ele que manda em
   toda decisão daqui: por isso as oito unidades vivem dentro de um <details>
   fechado, e não como oito linhas soltas.

   O visual não inventa linguagem nova: cartão claro de canto arredondado,
   sombra sm, título Figtree marinho e a pílula laranja da marca — os mesmos
   elementos dos cards de curso da home. O que muda é a densidade.
   ========================================================================== */

.nv-bio {
	--nv-bio-raio: 18px;
	--nv-bio-raio-int: 14px;

	position: relative;
	padding: var(--wp--preset--spacing--5) 20px var(--wp--preset--spacing--4);
	text-align: center;
}

/* Um respiro quente atrás do logo, na direção do amarelo → laranja da marca.
   Existe pra a página não abrir como um retângulo creme chapado; para antes de
   virar fundo colorido, que competiria com os quatro cartões. */
.nv-bio::before {
	content: "";
	position: absolute;
	inset: 0 0 auto;
	height: 340px;
	background:
		radial-gradient(115% 90% at 50% 0%,
			rgba(245, 180, 0, 0.20) 0%,
			rgba(241, 86, 34, 0.08) 45%,
			rgba(250, 248, 245, 0) 75%);
	pointer-events: none;
}

.nv-bio > * {
	position: relative;
}

.nv-bio__logo {
	display: flex;
	justify-content: center;
}

.nv-bio__logo img {
	display: block;
	height: auto;
}

.nv-bio__titulo {
	/* Sem max-width de propósito: o título ocupa a coluna inteira e "O Genoma
	   perto de você" fica numa linha só. Chegou a ter 9em pra jogar a pílula
	   pra linha de baixo, e foi revertido. Se for pra quebrar de novo, o
	   caminho é esse (a pílula mede 7,24em e o conjunto 12,2em, então qualquer
	   valor entre 7,3em e 12,1em quebra), e em em, não em px, pra acompanhar o
	   clamp da fonte. */
	padding-block: var(--wp--preset--spacing--3);
	font-size: clamp(1.45rem, 5.6vw, 1.75rem);
	line-height: 1.15;
}

/* A pílula herda .nv-pill (laranja, rotação -3deg). Aqui ela só ganha um
   respiro lateral: dentro de um H1 com letter-spacing negativo, o texto
   branco encostava na curva da direita. */
.nv-bio__titulo .nv-pill {
	padding-inline: 0.5em;
}

/* --------------------------------------------------------------------------
   As quatro linhas
   O <summary> do seletor e o <a> dos botões precisam ficar idênticos, e são
   elementos diferentes: um é o próprio alvo, o outro é o .wp-block-button__link
   dentro de um wrapper. Daí os dois seletores compartilharem a mesma regra.
   -------------------------------------------------------------------------- */

.nv-bio__unidades > .nv-bio__acao,
.nv-bio .nv-bio__acao > .wp-block-button__link {
	display: flex;
	align-items: center;
	justify-content: flex-start;
	gap: 0.85rem;
	width: 100%;
	min-height: 58px;
	padding: 0.6rem 1.1rem;
	border: 1px solid var(--wp--preset--color--borda);
	border-radius: var(--nv-bio-raio);
	background-color: #fff;
	color: #151544;
	font-family: var(--wp--preset--font-family--heading);
	font-size: 1.02rem;
	font-weight: 700;
	letter-spacing: 0;
	line-height: 1.2;
	text-align: left;
	text-decoration: none;
	box-shadow: var(--wp--preset--shadow--sm);
	transition: transform 0.2s ease, box-shadow 0.2s ease, border-color 0.2s ease;
}

/* Seletor de unidade — a linha primária, e a única preenchida.
   Verde #05613B e não o #079C5F decorativo: em branco sobre o vibrante o
   rótulo mede 3,5:1, abaixo dos 4,5 que a WCAG pede pra este corpo de texto.
   No #05613B são 7,5:1. */
.nv-bio__unidades > .nv-bio__acao {
	background-color: var(--wp--preset--color--accent);
	border-color: var(--wp--preset--color--accent);
	color: #fff;
	cursor: pointer;
	list-style: none;
}

.nv-bio__unidades > .nv-bio__acao::-webkit-details-marker {
	display: none;
}

.nv-bio__acao-rotulo {
	flex: 1 1 auto;
}

.nv-bio__acao-chevron {
	flex: 0 0 auto;
	width: 20px;
	height: 20px;
	background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23ffffff' stroke-width='2.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m6 9 6 6 6-6'/%3E%3C/svg%3E");
	background-repeat: no-repeat;
	background-position: center;
	transition: transform 0.25s ease;
}

.nv-bio__unidades[open] .nv-bio__acao-chevron {
	transform: rotate(180deg);
}

/* O slot das Matrículas 2027 já tem estilo, esperando o bloco entrar no
   conteúdo (ver o comentário em patterns/links-bio.php). Laranja preenchido:
   é a única linha que pode competir com o verde do WhatsApp, e só deve existir
   quando houver matrícula aberta de verdade. */
.nv-bio__acao--matricula > .wp-block-button__link {
	background-color: var(--wp--preset--color--primary);
	border-color: var(--wp--preset--color--primary);
	color: #fff;
}

/* --------------------------------------------------------------------------
   Lista de unidades (dentro do <details>)
   -------------------------------------------------------------------------- */

.nv-bio__lista {
	display: flex;
	flex-direction: column;
	gap: 8px;
	padding-top: 10px;
}

/* Caixa de cidade: uma por cidade com mais de uma unidade. É a moldura que
   fecha o escopo — o cabeçalho solto que existia antes nunca terminava, e as
   cidades de uma unidade só (Teixeira, Teófilo) liam como se pertencessem à
   cidade anterior. Cidade com uma unidade não ganha caixa: vira uma linha
   direta, e a diferença de forma já diz que é outra coisa. */
.nv-bio__grupo {
	overflow: hidden;
	padding: 10px 4px 4px;
	border: 1px solid var(--wp--preset--color--borda);
	border-radius: var(--nv-bio-raio-int);
	background-color: #fff;
	box-shadow: var(--wp--preset--shadow--sm);
}

.nv-bio__grupo-cidade {
	padding: 0 1.1rem 6px;
	color: var(--wp--preset--color--text-muted);
	font-family: var(--wp--preset--font-family--heading);
	font-size: 0.66rem;
	font-weight: 700;
	letter-spacing: 0.09em;
	line-height: 1.3;
	text-align: left;
	text-transform: uppercase;
}

/* Dentro da caixa a unidade não é outro cartão: sem borda, sem sombra, sem
   fundo. Cartão dentro de cartão empilha duas molduras que não significam nada
   e ainda come a largura útil do rótulo. O que separa uma da outra é um fio. */
.nv-bio__grupo-item {
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: 0.75rem;
	min-height: 48px;
	padding: 0.45rem 1.1rem;
	border-radius: 10px;
	color: #151544;
	font-family: var(--wp--preset--font-family--heading);
	font-size: 0.95rem;
	font-weight: 700;
	line-height: 1.25;
	text-align: left;
	transition: background-color 0.18s ease;
}

.nv-bio__grupo-item + .nv-bio__grupo-item {
	border-top: 1px solid var(--wp--preset--color--borda);
	border-start-start-radius: 0;
	border-start-end-radius: 0;
}

.nv-bio__grupo-item:hover {
	background-color: var(--wp--preset--color--surface);
}

.nv-bio__unidade {
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: 0.75rem;
	min-height: 52px;
	padding: 0.5rem 1.1rem;
	border: 1px solid var(--wp--preset--color--borda);
	border-radius: var(--nv-bio-raio-int);
	background-color: #fff;
	color: #151544;
	font-family: var(--wp--preset--font-family--heading);
	font-size: 0.95rem;
	font-weight: 700;
	line-height: 1.25;
	text-align: left;
	transition: transform 0.2s ease, box-shadow 0.2s ease, border-color 0.2s ease;
}

/* theme.json pinta link de primary e sublinha no hover. Numa lista de cartões
   isso lê como texto quebrado, não como link. */
.nv-bio a,
.nv-bio a:hover {
	text-decoration: none;
}

.nv-bio__unidade-seta {
	flex: 0 0 auto;
	width: 22px;
	height: 22px;
	border-radius: 50%;
	background-color: var(--wp--preset--color--accent);
	background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23ffffff' stroke-width='3' stroke-linecap='round' stroke-linejoin='round'%3E%3Cline x1='4' y1='12' x2='19' y2='12'/%3E%3Cpolyline points='12 5 19 12 12 19'/%3E%3C/svg%3E");
	background-repeat: no-repeat;
	background-position: center;
	background-size: 11px 11px;
	transition: transform 0.2s ease;
}

/* --------------------------------------------------------------------------
   Estados
   -------------------------------------------------------------------------- */

.nv-bio__unidades > .nv-bio__acao:hover,
.nv-bio .nv-bio__acao > .wp-block-button__link:hover,
.nv-bio__unidade:hover {
	border-color: rgba(21, 21, 68, 0.18);
	box-shadow: var(--wp--preset--shadow--md);
}

.nv-bio__grupo-item:hover .nv-bio__unidade-seta,
.nv-bio__unidade:hover .nv-bio__unidade-seta {
	transform: translateX(3px);
}

.nv-bio__unidades > .nv-bio__acao:active,
.nv-bio .nv-bio__acao > .wp-block-button__link:active,
.nv-bio__unidade:active {
	transform: scale(0.985);
}

/* Foco visível de verdade: a página inteira é navegável por Tab e o anel
   padrão do navegador some contra o cartão branco. */
.nv-bio__unidades > .nv-bio__acao:focus-visible,
.nv-bio .nv-bio__acao > .wp-block-button__link:focus-visible,
.nv-bio__unidade:focus-visible,
.nv-bio__grupo-item:focus-visible,
.nv-bio__redes a:focus-visible {
	outline: 3px solid var(--wp--preset--color--secondary);
	outline-offset: 3px;
}

.nv-bio__redes {
	padding-top: var(--wp--preset--spacing--2);
}

/* --------------------------------------------------------------------------
   Movimento
   Uma entrada só, escalonada, na carga. É o único momento em que a página tem
   a atenção inteira de quem chegou; micro-interação espalhada não acrescenta
   nada numa tela que dura seis segundos.
   -------------------------------------------------------------------------- */

@media (prefers-reduced-motion: no-preference) {

	.nv-bio__logo,
	.nv-bio__titulo,
	.nv-bio__unidades,
	.nv-bio__acoes .wp-block-button,
	.nv-bio__redes {
		animation: nv-bio-entra 0.5s cubic-bezier(0.22, 0.61, 0.36, 1) backwards;
	}

	.nv-bio__logo    { animation-delay: 0.04s; }
	.nv-bio__titulo  { animation-delay: 0.10s; }
	.nv-bio__unidades { animation-delay: 0.17s; }
	.nv-bio__acoes .wp-block-button:nth-child(1) { animation-delay: 0.23s; }
	.nv-bio__acoes .wp-block-button:nth-child(2) { animation-delay: 0.28s; }
	.nv-bio__acoes .wp-block-button:nth-child(3) { animation-delay: 0.33s; }
	.nv-bio__redes   { animation-delay: 0.40s; }

	.nv-bio__unidades[open] .nv-bio__lista {
		animation: nv-bio-abre 0.26s cubic-bezier(0.22, 0.61, 0.36, 1);
	}

	.nv-bio__unidades > .nv-bio__acao:hover,
	.nv-bio .nv-bio__acao > .wp-block-button__link:hover,
	.nv-bio__unidade:hover {
		transform: translateY(-2px);
	}
}

@keyframes nv-bio-entra {
	from { opacity: 0; transform: translateY(10px); }
}

@keyframes nv-bio-abre {
	from { opacity: 0; transform: translateY(-6px); }
}

/* --------------------------------------------------------------------------
   Telas curtas e telas grandes
   -------------------------------------------------------------------------- */

/* Aparelho baixo (SE, aparelho antigo): aperta o topo pra as quatro linhas
   continuarem acima da dobra em vez de empurrar a última pra fora. */
@media (max-height: 700px) {
	.nv-bio {
		padding-top: var(--wp--preset--spacing--4);
	}

	.nv-bio__logo img {
		width: 108px;
	}

	.nv-bio__unidades > .nv-bio__acao,
	.nv-bio .nv-bio__acao > .wp-block-button__link {
		min-height: 52px;
	}
}

/* No desktop a coluna continua com 420px: esta página é um objeto de celular,
   e esticar as linhas até 1440px transformaria cada cartão numa faixa vazia.
   O que muda é o respiro em volta. */
@media (min-width: 782px) {
	.nv-bio {
		padding-top: var(--wp--preset--spacing--6);
		padding-bottom: var(--wp--preset--spacing--6);
	}
}

/* O tema desenha uma seta em disco depois de TODO botão dentro do
   .wp-block-post-content (regra lá de cima, herdada pela LP). Sem tratar, ela
   sai colada no rótulo, enquanto o chevron do seletor de unidade fica na borda
   direita — e são justamente os elementos da direita que fazem as quatro linhas
   lerem como uma lista só. Aqui ela é empurrada pra direita e ganha a cor da
   própria linha, a mesma do chip da esquerda. */
.nv-bio__acao--estudo   { --nv-bio-cor: #5C4600; }
.nv-bio__acao--porque   { --nv-bio-cor: #6F2681; }
.nv-bio__acao--acontece { --nv-bio-cor: #8C3417; }
.nv-bio__acao--matricula { --nv-bio-cor: rgba(255, 255, 255, 0.22); }

.nv-bio .nv-bio__acao > .wp-block-button__link::after {
	margin-left: auto;
	width: 22px;
	height: 22px;
	background-color: var(--nv-bio-cor, var(--wp--preset--color--accent));
	background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23ffffff' stroke-width='3' stroke-linecap='round' stroke-linejoin='round'%3E%3Cline x1='4' y1='12' x2='19' y2='12'/%3E%3Cpolyline points='12 5 19 12 12 19'/%3E%3C/svg%3E");
	background-size: 11px 11px;
	transition: transform 0.2s ease;
}

/* O mesmo bloco herdado crava `font-size: 0.875rem !important` no rótulo. Sem
   reverter, a linha da bio fica menor que a do seletor de unidade (que é um
   <summary>, fora daquela regra) e as quatro deixam de casar. */
.nv-bio .nv-bio__acao > .wp-block-button__link {
	font-size: 1.02rem !important;
}

@media (prefers-reduced-motion: no-preference) {
	.nv-bio .nv-bio__acao > .wp-block-button__link:hover::after {
		transform: translateX(3px);
	}
}

/* Aberto, a lista precisa pertencer visualmente ao botão verde. Sem isso as
   oito unidades e os três destinos fixos ficam com o mesmo peso, e
   "Estude no Genoma" lê como se fosse a nona unidade. Painel preso ao
   <summary>: fundo creme, borda contínua e o canto de cima quadrado. */
.nv-bio__lista {
	padding: 10px 10px 12px;
	border: 1px solid var(--wp--preset--color--borda);
	border-top: none;
	border-radius: 0 0 var(--nv-bio-raio) var(--nv-bio-raio);
	background-color: var(--wp--preset--color--surface);
}

.nv-bio__unidades[open] > .nv-bio__acao {
	border-end-start-radius: 0;
	border-end-end-radius: 0;
}

/* E um respiro a mais antes do trio de destinos fixos — padding, não margin,
   pra não zerar o blockGap do grupo. */
.nv-bio__acoes {
	padding-top: 6px;
}

/* Redes: normalização ÓPTICA, não geométrica.
   Os quatro SVG do core saem na mesma caixa de 24px, e mesmo assim o TikTok
   parece maior. Medido: o ícone dele tem viewBox de 32 (os outros, 24) e o
   desenho ocupa a altura inteira, então a tinta renderiza a 24px — contra 18px
   do Instagram, 20px do Facebook e 14px do YouTube. Igualar a CAIXA é
   justamente o que produz o desalinhamento; o que precisa ficar igual é o
   desenho.
   Alvo: ~18px de tinta. Marca quadrada normaliza pela altura (Instagram,
   Facebook, TikTok); marca larga e baixa normaliza pela largura, senão o
   YouTube viraria uma faixa enorme pra alcançar 18px de altura. */
.nv-bio__redes .wp-block-social-link svg {
	display: block;
	width: 24px;
	height: 24px;
}

.nv-bio__redes .wp-social-link-facebook svg {
	width: 22px;
	height: 22px;
}

.nv-bio__redes .wp-social-link-tiktok svg {
	width: 18px;
	height: 18px;
}

/* Alvo de toque: o desenho encolheu, a área clicável não pode encolher junto.
   Os 44px são o mínimo da WCAG 2.2 pra ação em toque. */
.nv-bio__redes .wp-block-social-link a {
	display: flex;
	width: 44px;
	height: 44px;
	align-items: center;
	justify-content: center;
	padding: 0;
}

/* --------------------------------------------------------------------------
   Ícones animados das linhas
   O chip deixou de ser ::before com background-image porque SVG de fundo do
   CSS não anima: o navegador o desenha em modo estático seguro e descarta
   animação declarativa. Agora é um <span> com SVG inline dentro (injetado em
   inc/links.php), e o traço herda currentColor.

   Ritmo copiado dos ícones que já rodam no site (assets/images/icone-*.svg):
   ciclo de 3s com JANELA DE DESCANSO — o movimento acontece no primeiro terço
   e o resto do ciclo fica parado. Quatro ícones em loop contínuo numa tela só
   viram ruído; assim eles piscam, param e deixam ler.
   -------------------------------------------------------------------------- */

.nv-bio__acao-ico {
	display: flex;
	flex: 0 0 auto;
	width: 36px;
	height: 36px;
	align-items: center;
	justify-content: center;
	border-radius: 11px;
	background-color: var(--nv-bio-chip, rgba(21, 21, 68, 0.06));
	color: var(--nv-bio-ico, var(--nv-bio-cor, #151544));
}

.nv-bio__acao-ico .nv-ico {
	width: 19px;
	height: 19px;
	overflow: visible;
}

/* Uma cor de marca por linha. As quatro juntas percorrem a paleta inteira
   (verde, amarelo, roxo, laranja) sem que nenhuma precise de rótulo colorido
   pra se distinguir. */
.nv-bio__acao--whats     { --nv-bio-chip: rgba(255, 255, 255, 0.16); --nv-bio-ico: #fff; }
.nv-bio__acao--matricula { --nv-bio-chip: rgba(255, 255, 255, 0.18); --nv-bio-ico: #fff; }
.nv-bio__acao--estudo    { --nv-bio-chip: #FFF1CC; }
.nv-bio__acao--porque    { --nv-bio-chip: #F3E9F6; }
.nv-bio__acao--acontece  { --nv-bio-chip: #FDE7DC; }

@media (prefers-reduced-motion: no-preference) {

	/* WhatsApp: o glifo é marca, não pictograma — mexer nas partes tira o
	   reconhecimento. Quem se move é o ícone inteiro, num aceno curto. */
	.nv-ico__whats {
		transform-origin: 12px 12px;
		animation: nv-ico-acena 3s ease-in-out infinite;
	}

	/* Capelo e borla: mesmo movimento do ícone de graduação que já roda nas
	   páginas de curso, pra o gesto ser reconhecível entre as duas telas. */
	.nv-ico__capelo {
		transform-origin: 12px 10px;
		animation: nv-ico-balanca 3s ease-in-out infinite;
	}

	.nv-ico__borla {
		transform-origin: 22px 10px;
		animation: nv-ico-pendula 3s ease-in-out infinite;
	}

	.nv-ico__estrela {
		transform-origin: 12px 12px;
		animation: nv-ico-brilha 3s ease-in-out infinite;
	}

	/* As duas faíscas entram DEPOIS da estrela, não junto: simultâneas leem
	   como o ícone inteiro piscando, em cascata leem como brilho. */
	.nv-ico__faisca      { animation: nv-ico-pisca 3s ease-in-out infinite 0.22s; }
	.nv-ico__faisca--2   { animation-delay: 0.36s; }

	/* Jornal: a moldura fica parada e as duas linhas de texto se escrevem da
	   esquerda pra direita, uma depois da outra.
	   Primeira tentativa foi deslocar 5px e apagar; num ícone de 19px isso não
	   lê — a diferença entre as fases era menor que um pixel e meio. Crescer em
	   largura muda a SILHUETA, que é o que ainda se enxerga nesse tamanho.
	   O scaleX(0.06) em vez de 0 deixa a ponta arredondada do traço visível
	   como um cursor, em vez de sumir. */
	/* Origem em coordenada do viewBox, mesma convenção dos outros ícones
	   animados do tema. Evita `transform-box: fill-box` de propósito: as duas
	   linhas são traços horizontais, e a caixa de preenchimento de um traço
	   horizontal tem altura zero (fill-box não conta o stroke; quem conta é
	   stroke-box, de suporte bem mais recente). Origem explícita não depende
	   disso. As duas linhas começam em x=10. */
	.nv-ico__linha {
		transform-origin: 10px 14px;
		animation: nv-ico-escreve 3s ease-in-out infinite;
	}

	.nv-ico__linha--2 {
		transform-origin: 10px 18px;
		animation-delay: 0.18s;
	}
}

@keyframes nv-ico-acena {
	0%, 62%, 100% { transform: rotate(0) scale(1); }
	12%           { transform: rotate(-8deg) scale(1.07); }
	28%           { transform: rotate(6deg) scale(1.07); }
	44%           { transform: rotate(0) scale(1); }
}

@keyframes nv-ico-balanca {
	0%, 60%, 100% { transform: rotate(0deg); }
	15%           { transform: rotate(-5deg); }
	35%           { transform: rotate(4deg); }
}

@keyframes nv-ico-pendula {
	0%, 60%, 100% { transform: rotate(0deg); }
	18%           { transform: rotate(10deg); }
	40%           { transform: rotate(-7deg); }
}

@keyframes nv-ico-brilha {
	0%, 58%, 100% { transform: scale(1) rotate(0deg); }
	20%           { transform: scale(1.16) rotate(20deg); }
	40%           { transform: scale(0.96) rotate(0deg); }
}

@keyframes nv-ico-pisca {
	0%, 55%, 100% { opacity: 0.3; }
	20%           { opacity: 1; }
}

@keyframes nv-ico-escreve {
	0%, 6%        { transform: scaleX(0.06); }
	34%, 100%     { transform: scaleX(1); }
}
