/**
 * Widget "Hero"
 *
 * Primeira dobra: fundo gradiente azul diagonal, grid de 2 colunas (texto +
 * foto com badges flutuantes), onda decorativa na base. Reproduz a seção
 * Hero do design original (Figma Make) — ver Obsidian
 * proerp/fjpn-site/architecture/secoes-design.md.
 *
 * Tipografia/eyebrow/botões reaproveitam .fjpn-heading-hero, .fjpn-body(-lg),
 * .fjpn-btn(-blue), .fjpn-animate-fade-up(-2/-3/-4) e .fjpn-badge-float(-2/
 * -3/-4) de base.css — nada disso é redeclarado aqui. Só o que é exclusivo
 * do Hero (pill, destaque em gradiente, foto+overlay, badges posicionados,
 * onda) vive neste arquivo.
 */

/* ==========================================================
 * 1. SEÇÃO E CONTAINER
 * ========================================================== */

.fjpn-hero {
	position: relative;
	/* Especificar só overflow-x faz o navegador computar overflow-y como
	   "auto" (regra do CSS Overflow Module: se um eixo não é "visible", o
	   outro deixa de ser "visible" também). Com min-height:100vh + flex, isso
	   transforma o Hero num contêiner de rolagem própria sempre que o
	   conteúdo passa da altura da viewport — a barra de rolagem interna do
	   H1 e a faixa azul abaixo da onda do H2 são o mesmo bug: a onda (H2)
	   fica ancorada ao fundo dessa caixa "grudada" no cálculo de overflow,
	   e não ao fim visual real do conteúdo. overflow-y:visible explícito
	   restaura o comportamento normal (a seção cresce com o conteúdo, quem
	   rola é a página) sem abrir mão da contenção no eixo X, que ainda segura
	   os badges flutuantes sangrando para fora da foto.

	   ARMADILHA (errei isto uma vez): tem de ser `clip`, não `hidden`. A
	   regra completa do CSS Overflow Module 3 é — quando um eixo é
	   `visible`/`clip` e o outro NÃO é nenhum dos dois, o `visible` computa
	   para `auto` e o `clip` para `hidden`. Logo `overflow-x: hidden` +
	   `overflow-y: visible` não entrega nada: `hidden` está fora do par
	   {visible, clip}, então o `visible` escrito ao lado vira `auto` e o Hero
	   continua sendo scroller, com a barra interna intacta. `clip` + `visible`
	   é a única combinação que escapa da coerção, porque ambos pertencem ao
	   conjunto e nada é reescrito. */
	overflow-x: clip;
	overflow-y: visible;
	/* SEM `min-height: 100vh`, e isto é um desvio CONSCIENTE do fonte, que usa
	   `min-h-screen`.
	   Motivo: o protótipo foi desenhado numa janela de ~900px, onde o conteúdo
	   do Hero praticamente preenche a tela e o `min-h-screen` não cria folga.
	   Numa janela de 1250px o mesmo valor deixa cerca de 500px de azul vazio
	   entre os botões e a onda — o defeito que o responsável reportou.
	   Sem a altura mínima, o Hero passa a ser dimensionado pelo próprio
	   conteúdo mais os espaçamentos do fonte (144px em cima, 80px embaixo), o
	   que dá a mesma composição em qualquer altura de janela. */
	/* --fjpn-hero-bg só existe quando a cliente escolhe uma cor sólida no
	   painel (widgets/hero.php, seção "Estilo") — sem escolha, o fallback
	   mantém o gradiente original. */
	background: var(--fjpn-hero-bg, var(--fjpn-gradient-hero));
	/* 96px do header fixo (não tokenizado — a navbar ainda não tem widget
	   próprio neste tema) + 48px de respiro, conforme doc da seção Hero. */
	/* Espaçamento vertical mora só no container (ver `.fjpn-hero__container`),
	   como no fonte: `padding-top: 144px` mais `pb-20`. Ter padding nos dois
	   níveis foi o que produziu o vão no topo — 96 aqui somados a 48 lá. */
	display: flex;
	/* `center` como no fonte. Sem `min-height` não há folga para distribuir,
	   então na prática isto só age se alguém deixar o Hero com muito pouco
	   conteúdo — e nesse caso centralizar é o comportamento certo. */
	align-items: center;
}

.fjpn-hero__container {
	position: relative;
	z-index: 1; /* fica acima da onda decorativa, que é absolute */
	width: 100%;
	/* 144px em cima — valor do fonte (`padding-top: 144px`), que já embute a
	   compensação do cabeçalho fixo de 96px: o Hero começa no topo do
	   documento, atrás dele.

	   Embaixo, os 80px do fonte (`pb-20`) MAIS a altura da onda. A onda é
	   `position: absolute; bottom: 0` (ver §4) e o SVG tem viewBox de
	   1440×64 com `height: auto` — logo ela ocupa 64/1440 = 4.44% da largura
	   da janela, o que dá ~75px numa tela de 1680px. Esses 75px comiam quase
	   todo o `pb-20`, e os botões acabavam encostando na crista branca do
	   lado direito, onde a onda é mais alta. Somar a altura da onda ao
	   padding devolve os 80px de respiro reais em qualquer largura — no
	   fonte isso não aparecia porque o `min-h-screen` sempre sobrava altura
	   para absorver a onda. */
	padding-block: 144px calc(5rem + 4.45vw);
}

.fjpn-hero__grid {
	display: grid;
	grid-template-columns: 1fr;
	align-items: center;
	gap: var(--fjpn-gap-hero-columns); /* gap-12 no mobile/tablet */
}

/* 1024px = --fjpn-breakpoint-lg. Custom properties não resolvem dentro da
   condição de @media — ver mesma observação em base.css. */
@media (min-width: 1024px) {
	.fjpn-hero__grid {
		grid-template-columns: 1fr 1fr;
		/* `lg:gap-0` do aprovado. Eu havia trocado por 48px achando que a
		   ausência de calha era o que fazia o texto encostar na foto — não
		   era: o aprovado resolve isso com padding nas colunas (ver logo
		   abaixo), o que preserva a foto colada na borda direita. */
		gap: 0;
	}

	/* A separação entre as colunas vem do PADDING de cada uma, não do gap do
	   grid — é assim no aprovado (`lg:pr-16` no texto, `lg:pl-8` na mídia,
	   com `lg:gap-0`). A diferença importa: com padding, a foto continua
	   alinhada à borda direita do container, e o respiro fica todo do lado do
	   texto. Com gap simétrico, as duas colunas encolhem por igual e a
	   composição sai diferente da aprovada. */
	.fjpn-hero__conteudo {
		padding-right: 4rem;
	}

	.fjpn-hero__midia {
		padding-left: 2rem;
	}
}

/* ==========================================================
 * 2. COLUNA DE TEXTO
 * ========================================================== */

.fjpn-hero__conteudo {
	display: flex;
	flex-direction: column;
	align-items: flex-start;
	gap: var(--fjpn-gap-medium);
	/* Mesmo defeito que já foi corrigido do lado da foto, e que passou batido
	   aqui: item de grid tem `min-width: auto`, ou seja, não encolhe abaixo do
	   min-content do próprio conteúdo. Com o H1 em 61px, uma palavra longa
	   ("Comunicação") tem min-content maior que a faixa de 1fr, e a coluna de
	   texto invade a coluna da foto — que, por vir depois no DOM, é pintada
	   por cima e cobre o final das linhas.
	   `min-width: 0` faz a coluna respeitar a faixa do grid; `overflow-wrap`
	   dá à palavra longa permissão para quebrar em vez de esticar a coluna,
	   que é o que garante o comportamento também em 360px. */
	min-width: 0;
	overflow-wrap: break-word;
}

/* Pill / citação com ponto pulsante */
.fjpn-hero__pill {
	display: inline-flex;
	align-items: center;
	gap: var(--fjpn-gap-icon-text);
	padding: var(--fjpn-padding-badge-y) var(--fjpn-padding-badge-x);
	border-radius: var(--fjpn-radius-full);
	/* Fundo translúcido sobre o gradiente do Hero — sem token dedicado
	   (tokens.css não tem uma escala de opacidade sobre branco/azul). */
	background: rgba(255, 255, 255, 0.12);
	border: 1px solid rgba(255, 255, 255, 0.22);
	color: var(--fjpn-white);
	font-family: var(--fjpn-font-sans);
	font-size: var(--fjpn-text-small);
	font-weight: var(--fjpn-weight-medium);
	letter-spacing: var(--fjpn-tracking-badge);
}

.fjpn-hero__pill-pulso {
	flex: 0 0 auto;
	width: 8px;
	height: 8px;
	border-radius: var(--fjpn-radius-full);
	background: var(--fjpn-orange-primary);
	animation: fjpn-hero-pulso 1.6s var(--fjpn-ease-simple) infinite;
}

@keyframes fjpn-hero-pulso {
	0%, 100% {
		transform: scale(1);
		opacity: 1;
	}
	50% {
		transform: scale(1.4);
		opacity: 0.55;
	}
}

/* Título — herda tipografia de .fjpn-heading-hero (base.css), só sobrepõe
   a cor (o Hero tem fundo escuro; .fjpn-heading-hero assume texto escuro
   por padrão para uso em seções de fundo claro). */
.fjpn-hero__titulo {
	color: var(--fjpn-hero-titulo-cor, var(--fjpn-white));
	margin: 0;
}

.fjpn-hero__titulo-parte {
	display: inline;
}

/* Trecho em destaque — gradiente laranja recortado no texto */
.fjpn-hero__destaque {
	display: inline;
	/* --fjpn-hero-destaque-cor só existe quando a cliente escolhe uma cor
	   sólida (widgets/hero.php, seção "Estilo") — sem escolha, mantém o
	   gradiente laranja original recortado no texto. */
	background: var(--fjpn-hero-destaque-cor, var(--fjpn-gradient-hero-word));
	background-clip: text;
	-webkit-background-clip: text;
	color: transparent;
	-webkit-text-fill-color: transparent;
}

/* Parágrafos — herdam .fjpn-body/.fjpn-body-lg (base.css) com cor escura
   por padrão; sobrepõe para texto claro sobre o fundo azul do Hero. */
.fjpn-hero__paragrafo {
	margin: 0;
	/* --fjpn-hero-texto-cor só existe quando a cliente escolhe uma cor no
	   painel (widgets/hero.php, seção "Estilo") — sem escolha, mantém o
	   branco translúcido original (mesma justificativa de opacidade da
	   pill, acima). */
	color: var(--fjpn-hero-texto-cor, rgba(255, 255, 255, 0.88));
}

.fjpn-hero__ctas {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	gap: var(--fjpn-gap-medium);
	margin-top: var(--fjpn-gap-icon-text);
}

/* CTA principal — reaproveita .fjpn-btn-blue de base.css (não editado);
   estas duas declarações só sobrescrevem fundo/texto quando a cliente
   define uma cor no painel (widgets/hero.php, seção "Estilo"). Sem
   escolha, os fallbacks reproduzem exatamente o gradiente/branco de
   base.css. */
.fjpn-hero__ctas .fjpn-btn-blue {
	background: var(--fjpn-hero-cta-primario-fundo, var(--fjpn-gradient-blue-button));
	color: var(--fjpn-hero-cta-primario-texto, var(--fjpn-white));
}

/* CTA secundário — link outline branco (distinto do .fjpn-btn-blue-outline
   de base.css, que é outline azul para fundo claro). A seta é decorativa,
   fora do campo de texto editável (ver PHP). */
.fjpn-hero__cta-secundario {
	display: inline-flex;
	align-items: center;
	gap: var(--fjpn-gap-icon-text);
	padding: var(--fjpn-padding-button-y) var(--fjpn-padding-button-x);
	border-radius: var(--fjpn-radius-2xl);
	border: var(--fjpn-border-width-outline) solid rgba(255, 255, 255, 0.5);
	color: var(--fjpn-hero-cta-secundario-texto, var(--fjpn-white));
	text-decoration: none;
	transition:
		background var(--fjpn-duration-background) var(--fjpn-ease-simple),
		transform var(--fjpn-duration-base) var(--fjpn-ease-simple);
}

.fjpn-hero__cta-secundario::after {
	content: '→';
}

.fjpn-hero__cta-secundario:hover {
	background: rgba(255, 255, 255, 0.14);
	transform: scale(1.05);
}

.fjpn-hero__cta-secundario:active {
	transform: scale(0.95);
}

/* ==========================================================
 * 3. COLUNA DE MÍDIA (foto + badges)
 * ========================================================== */

.fjpn-hero__midia {
	position: relative;
	/* Causa raiz do H3 (imagem cortada): item de CSS Grid tem min-width:auto
	   por padrão, ou seja, não encolhe abaixo do min-content do seu conteúdo.
	   A <img> dentro da foto empurrava essa coluna além da faixa de 1fr do
	   grid, e o excesso era cortado pelo overflow-x:hidden do Hero.
	   min-width:0 deixa a coluna respeitar de fato a largura do grid. */
	min-width: 0;
	/* Mobile/tablet (grid de 1 coluna, ver §1): sem essa borda a foto (altura
	   fixa de 520px) esticava até a largura cheia do container, virando um
	   retângulo bem mais largo que alto. 520px de teto mantém a proporção
	   quase quadrada do aprovado também fora do desktop. Os badges usam
	   inset:0 sobre este mesmo elemento (ver §3.1), então ficam alinhados
	   com a foto automaticamente. */
	max-width: 520px;
	margin-inline: auto;
}

/* A partir do grid de 2 colunas (§1), a mídia já preenche a coluna inteira
   (~608px com o container de 1280px), próxima o bastante de quadrada com a
   altura fixa de 520px — não precisa mais do teto/centralização do mobile. */
@media (min-width: 1024px) {
	.fjpn-hero__midia {
		max-width: none;
		margin-inline: 0;
	}
}

/* Espelha o aprovado: `<div class="relative rounded-3xl overflow-hidden">`.
   A caixa NÃO tem altura própria — quem tem altura é a <img> lá dentro
   (520px fixos). Foi a lição das três tentativas anteriores: enquanto a
   altura morava na caixa e a imagem tentava preenchê-la por porcentagem, flex
   ou proporção, sempre havia um caminho em que a altura da caixa ficava
   indefinida e a foto sumia ou sobrava fundo azul. Com a altura no próprio
   elemento que precisa dela, não há dependência nenhuma a resolver. */
.fjpn-hero__foto {
	position: relative;
	border-radius: var(--fjpn-radius-3xl);
	overflow: hidden;
	box-shadow: var(--fjpn-shadow-modal-strong);
}

/* Igual ao aprovado: `<img class="w-full object-cover" style="height:520px">`.
   Estática, largura total, altura fixa. É a imagem que carrega a altura, e a
   caixa em volta apenas a recorta com o raio de canto — por isso não existe
   caminho em que a altura fique indefinida.
   O prefixo `.elementor` é obrigatório: o plugin declara
   `.elementor img { height: auto }` com especificidade (0,1,1), que vence
   `.fjpn-hero__foto-img` (0,1,0). Sem ele, esta altura é descartada em
   silêncio — ver a nota no topo do base.css. */
.elementor .fjpn-hero__foto-img {
	width: 100%;
	height: 520px;
	object-fit: cover;
	display: block;
}

.fjpn-hero__foto-overlay {
	position: absolute;
	inset: 0;
	/* Gradiente escuro por cima da foto — espelha --fjpn-blue-dark (#133a7a)
	   em rgba; CSS não permite extrair os componentes de uma custom property
	   hexadecimal dentro de rgba(), por isso o valor fica literal aqui. */
	background: linear-gradient(180deg, rgba(19, 58, 122, 0) 45%, rgba(19, 58, 122, 0.6) 100%);
	pointer-events: none;
}

/* Badges flutuantes — 4 posições/animações fixas nos cantos da foto.
   Itens além do 4º reaproveitam o ciclo (ver hero.php, `$indice % 4`). */
.fjpn-hero__badges {
	position: absolute;
	inset: 0;
	pointer-events: none; /* a foto continua clicável/selecionável por baixo */
}

.fjpn-hero__badge {
	position: absolute;
	display: inline-flex;
	align-items: center;
	gap: var(--fjpn-gap-icon-text);
	max-width: 160px;
	padding: var(--fjpn-gap-icon-text) var(--fjpn-gap-medium);
	background: var(--fjpn-white);
	border-radius: var(--fjpn-radius-xl);
	box-shadow: var(--fjpn-shadow-card-hover);
	pointer-events: auto;
}

.fjpn-hero__badge--1 {
	top: 8%;
	left: -6%;
}

.fjpn-hero__badge--2 {
	top: 8%;
	right: -6%;
}

.fjpn-hero__badge--3 {
	bottom: 10%;
	left: -6%;
}

.fjpn-hero__badge--4 {
	bottom: 10%;
	right: -6%;
}

/* Em telas estreitas, os badges recuam para dentro da foto — o deslocamento
   negativo do desktop faria o badge sair da viewport e criar scroll horizontal. */
@media (max-width: 767px) {
	.fjpn-hero__badge--1,
	.fjpn-hero__badge--3 {
		left: 4%;
	}

	.fjpn-hero__badge--2,
	.fjpn-hero__badge--4 {
		right: 4%;
	}

	.fjpn-hero__badge {
		max-width: 132px;
	}
}

.fjpn-hero__badge-icone {
	flex: 0 0 auto;
	font-size: var(--fjpn-text-heading-sm);
	line-height: 1;
}

.fjpn-hero__badge-texto {
	display: flex;
	flex-direction: column;
	line-height: var(--fjpn-leading-snug);
}

.fjpn-hero__badge-linha {
	font-family: var(--fjpn-font-sans);
	font-size: var(--fjpn-text-small);
	font-weight: var(--fjpn-weight-semibold);
	color: var(--fjpn-text-primary);
}

/* ==========================================================
 * 4. ONDA DECORATIVA
 * Estrutura travada (não é conteúdo editável) — transição visual para a
 * próxima seção, conforme doc da seção Hero.
 * ========================================================== */

.fjpn-hero__wave {
	position: absolute;
	left: 0;
	right: 0;
	bottom: -1px;
	line-height: 0;
	z-index: 0;
}

.fjpn-hero__wave svg {
	width: 100%;
	height: auto;
	display: block;
}

.fjpn-hero__wave path {
	fill: var(--fjpn-white);
}

/* ==========================================================
 * 5. PREFERS-REDUCED-MOTION
 * A regra global de base.css já zera duração/iteração de toda animação e
 * transição da página (inclusive as classes fjpn-animate-fade-up* e
 * fjpn-badge-float* usadas aqui, e o keyframe fjpn-hero-pulso acima) —
 * nada adicional é necessário neste arquivo.
 * ========================================================== */
