/*
Theme Name: Di Carvalho
Theme URI: https://dicarvalho.local
Description: Tema de blocos (FSE) de Di Carvalho. Gerado por weboption-gutenberg-creator.
Version: 1.0.0
Requires at least: 6.5
Requires PHP: 8.0
License: GNU General Public License v2 or later
License URI: http://www.gnu.org/licenses/gpl-2.0.html
Text Domain: dicarvalho
Tags: full-site-editing, block-patterns
*/

html {
	scroll-behavior: smooth;
}

/* Reset do design (`input,select{box-sizing:border-box}`). Sem ele o <input>
   fica em content-box e width:100% soma padding+borda por fora: num campo de
   660px com padding 18px o input sai com 698px e estoura a coluna, enquanto
   <select> e <button> — border-box pela folha do navegador — ficam nos 660px.
   O resultado e a fileira de campos desalinhada em qualquer formulario. */
input,
select,
textarea {
	box-sizing: border-box;
}

/* Altura do header fixo, publicada como token para quem precisa NÃO ficar
   embaixo dele — hoje a galeria horizontal (dicarvalho/obra-galeria-horizontal),
   que fixa a própria seção no topo da janela e teria o título coberto.
   O valor mora aqui, junto da regra que o produz (padding 20+20 + logo), para
   os dois não saírem de sincronia; o bloco consome com fallback e não precisa
   saber nada do tema. */
:root {
	--dc-altura-do-header: 131px;
}

@media (max-width: 1120px) {
	:root {
		--dc-altura-do-header: 97px;
	}
}

/* ===== Header (theme/parts/header.html) ===== */

/* Grid de 3 colunas (1fr auto 1fr), como no design: e o que centraliza o menu
   de verdade, independente da largura do logo e das acoes. O seletor duplo
   (.dc-nav.wp-block-group) sobe a especificidade acima da classe de layout que
   o core/group emite (.wp-container-core-group-is-layout-*, que traz display:flex).

   O padding lateral e 48px literal, nao var(--wp--preset--spacing--50): esse
   preset vale 18px no theme.json, entao o fallback "48px" NUNCA entrava e o
   header ficava com 18px — logo colado na borda. O design pede 48px
   (design/Home.dc.html:84). */
.dc-nav,
.dc-nav.wp-block-group {
	position: fixed;
	top: 0;
	left: 0;
	right: 0;
	z-index: 50;
	display: grid;
	grid-template-columns: 1fr auto 1fr;
	column-gap: 32px;
	align-items: center;
	padding: 20px 48px;
	background: transparent;
	transition: border-color .3s ease;
}

/* Camada do vidro fosco. Existe como pseudo-elemento, e nao como propriedade do
   proprio .dc-nav, por um motivo especifico: `backdrop-filter` faz do elemento
   um CONTAINING BLOCK para descendentes `position: fixed`. O menu offcanvas do
   core/navigation e um `position: fixed; inset: 0` que mora dentro deste <nav>,
   entao com o filtro no .dc-nav ele parava de se ancorar na viewport e passava
   a se ancorar na faixa do header — abria com 430x96 em vez de 430x900, ficando
   por baixo do conteudo. Como o filtro so entra com [data-scrolled], o menu
   funcionava no topo da home e quebrava depois de rolar.
   O pseudo e IRMAO do overlay, nao ancestral, entao filtra o fundo sem prender
   ninguem. `position: absolute` tambem o mantem fora do grid de 3 colunas. */
.dc-nav::before {
	content: "";
	position: absolute;
	inset: 0;
	z-index: -1;
	pointer-events: none;
	background: transparent;
	transition: background .3s ease, backdrop-filter .3s ease;
}

/* O vidro fosco so entra depois de 24px de rolagem — quem alterna o atributo e
   assets/js/nav.js. Aplicar sempre (como estava) punha uma faixa escura por
   cima do hero, que e a divergencia mais visivel contra o prototipo. */
.dc-nav[data-scrolled]::before,
.dc-nav.wp-block-group[data-scrolled]::before {
	background: color-mix(in srgb, var(--wp--preset--color--base, #0b0a08) 65%, transparent);
	backdrop-filter: blur(20px) saturate(1.6);
	-webkit-backdrop-filter: blur(20px) saturate(1.6);
	box-shadow:
		inset 0 1px 0 rgba(255, 255, 255, .06),
		0 8px 30px rgba(0, 0, 0, .25);
}

/* A borda fica no proprio .dc-nav: `border` nao cria containing block, e manter
   ela aqui preserva a altura exata do header. */
.dc-nav[data-scrolled],
.dc-nav.wp-block-group[data-scrolled] {
	border-bottom: 1px solid color-mix(in srgb, var(--wp--preset--color--contraste, #ede6d8) 10%, transparent);
}

.dc-nav__logo img {
	height: 90px;
	width: auto;
	filter: invert(1);
}

.dc-nav__menu {
	font-size: 12px;
	letter-spacing: .2em;
	text-transform: uppercase;
	white-space: nowrap;
}

/* O core/navigation nao herda gap do layout do grupo: sem isto os itens saem
   colados ("ACADEMIAWORKSHOPSESTUDIO..."). 24px e o valor do proprio design.
   A classe dc-nav__menu cai tanto no <nav> quanto no <ul> que o bloco emite,
   por isso o seletor cobre os dois caminhos. */
ul.dc-nav__menu,
.dc-nav__menu .wp-block-navigation__container {
	gap: 24px;
}

.dc-nav__menu .wp-block-navigation-item a {
	color: color-mix(in srgb, var(--wp--preset--color--contraste, #ede6d8) 75%, transparent);
}
.dc-nav__menu .wp-block-navigation-item a:hover {
	color: var(--wp--preset--color--acento, #c9a86a);
}

/* Tela em que o visitante esta. No design e um style inline no <a>
   (`color:#c9a86a` em design/Workshops.dc.html), so a cor — sem peso nem
   sublinhado diferentes. Mesmo token dourado que o idioma ativo ja usa em
   .dc-nav__lang-item.is-current, logo abaixo.

   A classe nao vem do core: quem a poe e dicarvalho_navegacao_por_idioma()
   em functions.php — ver la o porque (a funcao antiga, dicarvalho_marca_item_
   do_menu_atual(), foi fundida nela junto com a reescrita de href por idioma).
   Um seletor de classe a mais que a regra base acima, que e o suficiente para
   vencer sem !important. */
.dc-nav__menu .wp-block-navigation-item.current-menu-item a {
	color: var(--wp--preset--color--acento, #c9a86a);
}

/* A 3a coluna do grid e 1fr, entao o grupo ocupa toda a faixa da direita — mas
   sem justify-content ele encosta no INICIO dessa faixa, ou seja, colado no
   ultimo item do menu. O design alinha no fim
   (design/Home.dc.html:94, justify-content:flex-end).
   Filho direto no seletor para ganhar do layout do core, que emite
   `.wp-container-core-group-is-layout-*` na mesma faixa de especificidade. */
.dc-nav > .dc-nav__actions {
	justify-content: flex-end;
	gap: 22px;
}

/* Seletor de idioma — bloco dicarvalho/lang-switcher.
   Marcacao propria (nao mais <ul><li> do Polylang), entao nao ha reset de lista
   a fazer aqui: sao <a> irmaos separados por um <span> com "·". */
.dc-nav__lang {
	display: flex;
	align-items: center;
	gap: 9px;
}

/* text-decoration:none e obrigatorio: no design os idiomas sao <button> (sem
   sublinhado), aqui viraram <a> de verdade — e o tema de blocos sublinha link
   por padrao. O "ativo" e a borda inferior dourada, nao o underline. */
.dc-nav__lang-item {
	font-family: var(--wp--preset--font-family--base, "Instrument Sans", sans-serif);
	font-size: 12px;
	font-weight: 500;
	letter-spacing: .14em;
	text-transform: uppercase;
	text-decoration: none;
	padding: 2px 0;
	color: color-mix(in srgb, var(--wp--preset--color--contraste, #ede6d8) 50%, transparent);
	border-bottom: 1px solid transparent;
	transition: color .2s ease, border-color .2s ease;
}

.dc-nav__lang-item:hover {
	color: var(--wp--preset--color--contraste, #ede6d8);
}

.dc-nav__lang-item.is-current {
	color: var(--wp--preset--color--acento, #c9a86a);
	border-bottom-color: var(--wp--preset--color--acento, #c9a86a);
}

.dc-nav__lang-sep {
	font-size: 11px;
	color: color-mix(in srgb, var(--wp--preset--color--contraste, #ede6d8) 28%, transparent);
}

/* Carrinho — bloco dicarvalho/cart-link. O badge e posicionado em relacao ao
   <a>, por isso o position:relative fica no link e nao no wrapper do bloco. */
.dc-nav__cart-link {
	position: relative;
	display: flex;
	align-items: center;
	text-decoration: none;
	color: var(--wp--preset--color--contraste, #ede6d8);
}

.dc-nav__cart-link:hover {
	color: var(--wp--preset--color--acento, #c9a86a);
}

.dc-nav__cart-icon {
	display: block;
}

.dc-nav__cart-badge {
	position: absolute;
	top: -7px;
	right: -9px;
	/* box-sizing:border-box faz o min-width de 16px JA incluir o padding: com um
	   digito o badge fica no circulo exato de 16px do design, e so vira pilula
	   quando a contagem passa de 9 — em vez de o numero vazar do circulo. */
	box-sizing: border-box;
	min-width: 16px;
	height: 16px;
	padding: 0 4px;
	border-radius: 8px;
	background: var(--wp--preset--color--acento, #c9a86a);
	color: var(--wp--preset--color--base, #0b0a08);
	font-family: var(--wp--preset--font-family--base, "Instrument Sans", sans-serif);
	font-size: 10px;
	font-weight: 600;
	line-height: 1;
	display: flex;
	align-items: center;
	justify-content: center;
}

/* Toast "Añadido al carrito" — o retorno do add-to-cart.
   ------------------------------------------------------------------------
   O WooCommerce, sozinho, anexa <a class="added_to_cart">Ver carrito</a>
   DEPOIS do botao: o link empurra o card e o design nao o tem em lugar nenhum.
   Esconder aqui e nao no bloco porque a decisao e do site inteiro — qualquer
   botao ajax_add_to_cart que nasca depois herda o mesmo retorno.

   O !important nao e preguica de especificidade: o WooCommerce declara o
   display do mesmo no em TRES folhas suas (woocommerce-blocktheme.css usa
   `a.added_to_cart`, woocommerce.css usa `.woocommerce a.added_to_cart`,
   wc-blocks.css usa uma terceira variante), e a versao sem !important perdeu
   para a primeira delas em teste — o link continuou visivel embaixo do botao.
   Empatar em especificidade com folhas de terceiro que podem mudar de ordem a
   cada release deixa o layout do card refem do changelog do WooCommerce. */
a.added_to_cart {
	display: none !important;
}

/* Geometria e tipografia literais de design/Obra.dc.html:180. O
   translate(-50%) do eixo X faz parte do estado de repouso: o `left: 50%`
   centraliza a BORDA esquerda, nao a caixa. */
.dc-toast {
	position: fixed;
	left: 50%;
	bottom: 34px;
	z-index: 70;
	padding: 15px 28px;
	background: var(--wp--preset--color--acento, #c9a86a);
	color: var(--wp--preset--color--base, #0b0a08);
	font-family: var(--wp--preset--font-family--base, "Instrument Sans", sans-serif);
	font-size: 12px;
	font-weight: 600;
	line-height: 1;
	letter-spacing: 0.14em;
	text-transform: uppercase;
	pointer-events: none;
	opacity: 0;
	transform: translate(-50%, 80px);
	/* Saida: gsap power2.in, delay 2 (design/Obra.dc.html:249). */
	transition:
		opacity 0.4s cubic-bezier(0.55, 0.085, 0.68, 0.53),
		transform 0.4s cubic-bezier(0.55, 0.085, 0.68, 0.53);
}

/* Entrada: gsap power3.out (design/Obra.dc.html:248). A curva muda com o
   estado, e nao e o mesmo easing nos dois sentidos — por isso a transition e
   redeclarada aqui em vez de viver so na regra base. */
.dc-toast[data-visivel] {
	opacity: 1;
	transform: translate(-50%, 0);
	transition:
		opacity 0.4s cubic-bezier(0.215, 0.61, 0.355, 1),
		transform 0.4s cubic-bezier(0.215, 0.61, 0.355, 1);
}

/* Sem deslocamento: o toast aparece e some no lugar. A confirmacao continua
   existindo — o que sai e o movimento, nao o aviso. */
@media (prefers-reduced-motion: reduce) {
	.dc-toast,
	.dc-toast[data-visivel] {
		transform: translate(-50%, 0);
		transition: opacity 0.2s linear;
	}
}

/* Avisos do WooCommerce.
   ------------------------------------------------------------------------
   Num tema de blocos, quem imprime os avisos é o bloco woocommerce/store-notices
   declarado em templates/single-product.html — os hooks do template PHP do
   plugin não rodam. O que chega aqui é o CSS de fábrica do WooCommerce: caixa
   rosa, borda vermelha, tipografia do plugin. Numa loja em fundo #0b0a08 isso
   não é um aviso, é um susto. */
.woocommerce-notices-wrapper {
	max-width: 1280px;
	margin: 0 auto;
	padding: 24px 48px 0;
}

.woocommerce-notices-wrapper .woocommerce-message,
.woocommerce-notices-wrapper .woocommerce-error,
.woocommerce-notices-wrapper .woocommerce-info,
.wc-block-components-notice-banner {
	display: flex;
	align-items: center;
	gap: 12px;
	margin: 0 0 16px;
	/* Fix round 2 — o WooCommerce declara padding:16px!important em DUAS
	   folhas suas (wc-blocks.css e store-notices.css) para
	   .wc-block-components-notice-banner: sem !important aqui a nossa
	   declaração nunca vence, não importa a especificidade nem a ordem de
	   carga. Mesmo raciocínio do !important em a.added_to_cart, acima neste
	   arquivo — regra de terceiro que muda a cada release; empatar sem
	   forçar deixa o layout do aviso refém do changelog do plugin. */
	padding: 16px 20px !important;
	/* Fix round 2 — zera os 4 lados antes de desenhar só a barra da
	   esquerda. O plugin aplica `border: 1px solid #2f2f2f` na regra base
	   e `border-color: <tom do estado>` por cima em
	   .is-error/.is-warning/.is-success/.is-info (mesma especificidade
	   desta regra, então o reset de largura passa ileso: a regra de
	   estado só toca a COR, não a largura). Sem esse reset, topo/direita/
	   base ficavam com o vermelho/verde/azul/dourado crus do plugin. */
	border: 0;
	border-left: 2px solid var(--wp--preset--color--acento, #c9a86a);
	border-radius: 0;
	background: color-mix(in srgb, var(--wp--preset--color--contraste, #ede6d8) 7%, transparent);
	color: var(--wp--preset--color--contraste, #ede6d8);
	font-family: var(--wp--preset--font-family--base, "Instrument Sans", sans-serif);
	font-size: 14px;
	line-height: 1.6;
}

/* Fix round 1 — o fundo ficava rosa mesmo depois da regra genérica acima.
   Causa: o bloco de blocos declara UM fundo por estado — .is-error,
   .is-warning, .is-success, .is-info —, cada um com especificidade (0,2,0)
   em wc-blocks/store-notices.css. A regra genérica só tem UMA classe
   (.wc-block-components-notice-banner, 0,1,0) e perde para a regra de
   estado por especificidade, não por ordem de carga — carregar depois não
   ajuda quando a outra regra é mais específica. O texto (var(--contraste),
   creme) por cima do fundo de fábrica do plugin (#fff0f0 no erro, tons
   igualmente claros nos outros três estados) cai pra ~1.1:1 de contraste:
   abaixo do mínimo de 4.5:1 do WCAG AA, o aviso fica ilegível. A correção é
   igualar a especificidade — uma regra por estado, (0,2,0) como a do
   plugin — para o fundo do site voltar a valer; nossa folha carrega por
   último, então o empate de especificidade se resolve a nosso favor. */
.wc-block-components-notice-banner.is-error,
.wc-block-components-notice-banner.is-warning,
.wc-block-components-notice-banner.is-success,
.wc-block-components-notice-banner.is-info {
	background: color-mix(in srgb, var(--wp--preset--color--contraste, #ede6d8) 7%, transparent);
}

/* A barra da esquerda segue marcando o estado — as outras três arestas já
   ficam zeradas pela regra genérica acima, então só a cor da esquerda
   importa daqui pra baixo.

   Fix round 2 — sucesso e info usavam verde/azul inventados (#6f9c74,
   #6f8fa6): não existem na paleta do site (theme.json não tem token verde
   nem azul) e não vieram do design. Trocados por tokens que já existem:
   sucesso reaproveita o dourado "acento" — o mesmo tom do toast "Añadido al
   carrito", é o vocabulário que o site já usa pra positivo — e info usa o
   próprio token de texto "contraste" diluído, neutro. Aviso mantém
   "estrela" (decisão do fix round 1: a cor de fábrica do próprio aviso,
   #f0b849, já cai nessa família dourada).

   Erro é a ÚNICA exceção cromática que sobra, e é deliberada: a paleta não
   tem nenhum tom que sirva de sinal de erro sem ambiguidade — usar dourado
   aqui também deixaria erro indistinguível de aviso/sucesso. #c4634f é o
   vermelho de fábrica do plugin (#cc1818) rebaixado pra não brigar com o
   dourado da marca, mesma lógica do fix round 1. Registrado de novo aqui
   pra próxima pessoa não achar que foi descuido simétrico às outras duas
   cores que FORAM removidas.

   Até 2026-07-30 isso era falso na prática: assets/css/checkout.css tinha a
   sua própria cópia deste bloco inteiro, sem escopo, com um vermelho
   diferente (#c0392b) por cima — o checkout já tinha uma segunda exceção
   cromática, só que não documentada aqui. Essa cópia saiu; #c4634f agora é
   o único vermelho do site, nesta regra, e o checkout herda dela como
   qualquer outra página. */
.woocommerce-notices-wrapper .woocommerce-error,
.wc-block-components-notice-banner.is-error {
	border-left-color: #c4634f;
}

.wc-block-components-notice-banner.is-warning {
	border-left-color: var(--wp--preset--color--estrela, #e7a83e);
}

.wc-block-components-notice-banner.is-success {
	border-left-color: var(--wp--preset--color--acento, #c9a86a);
}

.wc-block-components-notice-banner.is-info {
	border-left-color: color-mix(in srgb, var(--wp--preset--color--contraste, #ede6d8) 40%, transparent);
}

/* O ícone e o botão "Ver carrito" que o WooCommerce injeta dentro do aviso
   saem: o link repete o que o header já oferece, e o ícone é do design system
   do plugin. */
.woocommerce-notices-wrapper .button,
.wc-block-components-notice-banner > svg {
	display: none;
}

@media (max-width: 782px) {
	.woocommerce-notices-wrapper {
		padding: 16px 20px 0;
	}
}

/* Seletor de país do campo de telefone — plugin Country & Phone Field CF7.
   ------------------------------------------------------------------------
   Vale para os três formulários (contacto, reserva de plaza, reserva de curso),
   por isso mora aqui e não no CSS de um bloco: o widget é o mesmo nos três, e
   três cópias divergiriam na primeira correção.

   O plugin embarca uma versão antiga do intl-tel-input — daí os nomes de classe
   sem prefixo `iti__` (`.country-list`, `.selected-flag`, `.iti-flag`). Se um
   dia ele atualizar a biblioteca, estes seletores param de casar de uma vez, e
   o sintoma será o dropdown branco de volta: nada quebra, só desveste. */

/* O container precisa ocupar a célula inteira do grid de duas colunas, senão o
   input de telefone encolhe para o tamanho mínimo do conteúdo. */
.intl-tel-input {
	display: block;
	width: 100%;
}

/* A bandeira e o prefixo vivem DENTRO do campo escuro. O plugin pinta esta
   faixa de cinza-claro por padrão. */
.intl-tel-input .selected-flag {
	background: transparent;
	border-right: 1px solid color-mix(in srgb, var(--wp--preset--color--contraste, #ede6d8) 12%, transparent);
}

.intl-tel-input .selected-flag:hover,
.intl-tel-input .selected-flag:focus {
	background: color-mix(in srgb, var(--wp--preset--color--contraste, #ede6d8) 6%, transparent);
}

.intl-tel-input .selected-dial-code {
	color: var(--wp--preset--color--contraste, #ede6d8);
	font-family: var(--wp--preset--font-family--base, "Instrument Sans", sans-serif);
	font-size: 14px;
}

/* A seta do plugin é um triângulo com border-color escuro — invisível sobre
   fundo escuro. */
.intl-tel-input .iti-arrow {
	border-top-color: color-mix(in srgb, var(--wp--preset--color--contraste, #ede6d8) 55%, transparent);
}

.intl-tel-input.separate-dial-code .selected-flag {
	background: transparent;
}

/* A lista. Sem isto ela nasce branca com o texto creme que herda do cartão —
   creme sobre branco, ilegível, o mesmo defeito que os avisos do WooCommerce
   tiveram. */
.intl-tel-input .country-list {
	max-width: 320px;
	max-height: 260px;
	border: 1px solid color-mix(in srgb, var(--wp--preset--color--contraste, #ede6d8) 14%, transparent);
	border-radius: 0;
	background: var(--wp--preset--color--superficie, #14110d);
	box-shadow: 0 24px 60px rgba(0, 0, 0, 0.55);
	font-family: var(--wp--preset--font-family--base, "Instrument Sans", sans-serif);
}

.intl-tel-input .country-list .country {
	padding: 9px 12px;
	color: var(--wp--preset--color--contraste, #ede6d8);
	font-size: 13.5px;
	line-height: 1.4;
}

/* `.highlight` é o teclado, `:hover` é o mouse — o plugin usa as duas e sem
   ambas a navegação por seta fica sem retorno nenhum. */
.intl-tel-input .country-list .country.highlight,
.intl-tel-input .country-list .country:hover {
	background: color-mix(in srgb, var(--wp--preset--color--acento, #c9a86a) 16%, transparent);
}

.intl-tel-input .country-list .country-name {
	color: var(--wp--preset--color--contraste, #ede6d8);
}

.intl-tel-input .country-list .dial-code {
	color: color-mix(in srgb, var(--wp--preset--color--contraste, #ede6d8) 55%, transparent);
}

/* Separador entre os países preferidos (es, pt, br, fr, it, de, gb) e o resto
   da lista: no tema claro do plugin ele é uma linha cinza que some no escuro. */
.intl-tel-input .country-list .divider {
	border-bottom: 1px solid color-mix(in srgb, var(--wp--preset--color--contraste, #ede6d8) 16%, transparent);
}

/* Abaixo de 1120px o design (design/Home.dc.html, "responsive pass v3") troca o
   grid de 3 colunas por flex space-between, reduz o logo para 56px e encolhe o
   padding lateral para 20px. Os valores anteriores aqui (22px / 44px) nao vinham
   do design.
 *
 * DIVERGENCIA DELIBERADA: o design tambem esconde o seletor de idioma no topo
 * (.nav-desktop) — mas so porque o painel offcanvas dele carrega uma SEGUNDA
 * copia do switcher no rodape do menu. Aqui o menu mobile e o overlay do
 * core/navigation, que aceita apenas blocos de link: nao ha onde colocar a
 * copia. Esconder deixaria o mobile sem nenhuma forma de trocar de idioma, num
 * site cujo motivo de existir e ser trilingue. Fica visivel ate o offcanvas
 * proprio existir. */
@media (max-width: 1120px) {
	.dc-nav,
	.dc-nav.wp-block-group {
		display: flex;
		justify-content: space-between;
		align-items: center;
		padding: 20px;
	}

	.dc-nav__logo img {
		height: 56px;
	}

	/* O burger vem do core/navigation, que e o filho do MEIO. No design ele e o
	   ultimo elemento, depois do carrinho — order corrige sem mexer no markup. */
	.dc-nav__menu {
		order: 3;
	}

	/* Sem o margin-left:auto o space-between joga as acoes para o meio da barra,
	   com o burger sozinho na direita. O design mantem idioma+carrinho+burger
	   como um bloco unico encostado na direita.
	   O seletor precisa do filho direto (.dc-nav > ...): o core emite
	   `.is-layout-flex > :is(*, div){margin:0}`, que tem especificidade 0,1,1 e
	   zerava um `.dc-nav__actions{margin-left:auto}` solto (0,1,0). */
	.dc-nav > .dc-nav__actions {
		margin-left: auto;
		gap: 18px;
	}
}

/* Alvo de toque do seletor de idioma.
 *
 * Medido no telefone: 18x20px e 19x20px, abaixo dos 24x24 CSS px que o WCAG 2.2
 * (2.5.8, Target Size Minimum) exige.
 *
 * Nao da para resolver com padding: o "ativo" e uma `border-bottom` dourada, e
 * padding vertical empurraria o sublinhado para longe do texto. Alargar o `gap`
 * tambem nao serve — a barra ja estoura 22px em 320px, e crescer o switcher
 * pioraria isso. Um ::after absoluto cresce so a AREA DE TOQUE: nada reflui, o
 * sublinhado fica onde esta e a largura da barra nao muda.
 *
 * -9px na horizontal e o teto: os itens ficam a 19px um do outro (medido), logo
 * as areas param a 1px de encostar. Resultado 36x44px por item.
 *
 * Fica so no movel: no ponteiro fino o alvo de 18px ja e clicavel, e o ::after
 * cobriria o `·` entre os idiomas sem necessidade. */
@media (max-width: 782px) {
	.dc-nav__lang-item {
		position: relative;
	}

	.dc-nav__lang-item::after {
		content: "";
		position: absolute;
		inset: -12px -9px;
	}
}

/* O core/navigation troca para o menu overlay a 600px — valor fixo no CSS do
   core, que o atributo overlayMenu:"mobile" nao parametriza. O design troca a
   1120px. Sem este bloco, entre 600 e 1120 os seis links ficam inline, estouram
   a largura do nav e a pagina ganha scroll horizontal.
   Aqui desfazemos, so nessa faixa, o que o @media (min-width:600px) do core faz:
   ele revela o menu inline e esconde o botao do burger. Os seletores repetem os
   do core com .dc-nav na frente para ganhar em especificidade. */
@media (min-width: 600px) and (max-width: 1120px) {
	.dc-nav .wp-block-navigation__responsive-container:not(.hidden-by-default):not(.is-menu-open) {
		display: none;
	}

	.dc-nav .wp-block-navigation__responsive-container-open:not(.always-shown) {
		display: flex;
	}
}

/* ----- Menu overlay (offcanvas) -----
   O core/navigation abre um overlay de tela cheia, centralizado e sem estilo do
   tema. O design usa um painel escuro encostado na direita
   (design/Home.dc.html, bloco data-ocpanel). Sem isto o menu abre branco com
   texto preto — o que so nao aparecia antes porque o overlay so existia abaixo
   de 600px. */

/* O container vira o backdrop: sem o padding do core, para o painel encostar
   mesmo na borda.
   O :not(.has-background) precisa estar no seletor porque o core pinta o
   overlay de BRANCO justamente com
   `.wp-block-navigation:not(.has-background) .…is-menu-open{background:#fff}`
   (especificidade 0,4,0) — sem repetir esse trecho, a regra do tema perde e o
   menu abre branco. */
.dc-nav .wp-block-navigation:not(.has-background) .wp-block-navigation__responsive-container.is-menu-open,
.dc-nav .wp-block-navigation__responsive-container.is-menu-open {
	padding: 0;
	background-color: rgba(0, 0, 0, .55);
}

/* E o wrapper interno vira o painel. margin-left:auto o joga para a direita. */
.dc-nav .wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-close {
	width: min(380px, 88vw);
	max-width: none;
	margin: 0 0 0 auto;
	height: 100%;
	box-sizing: border-box;
	padding: 26px 28px 36px;
	overflow-y: auto;
	background: var(--wp--preset--color--base, #0b0a08);
	border-left: 1px solid color-mix(in srgb, var(--wp--preset--color--acento, #c9a86a) 30%, transparent);
}

/* O `display: flex` nao e decorativo: o botao do core nasce `display: block` e o
   <svg> de 24px, sendo inline, encosta na borda esquerda do content-box. Numa
   caixa de 40px isso deixava os 14px de folga todos do lado direito — o X saia
   7px para a esquerda do centro. */
.dc-nav .wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-container-close {
	display: flex;
	align-items: center;
	justify-content: center;
	width: 40px;
	height: 40px;
	padding: 0;
	color: var(--wp--preset--color--contraste, #ede6d8);
	border: 1px solid color-mix(in srgb, var(--wp--preset--color--contraste, #ede6d8) 30%, transparent);
}

/* Links grandes em serifa, empilhados e divididos por fio — como no painel do
   design. O seletor precisa de .is-menu-open para nao vazar no menu inline. */
.dc-nav .wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__container {
	flex-direction: column;
	align-items: stretch;
	gap: 0;
	margin-top: 34px;
}

.dc-nav .wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation-item {
	display: block;
}

.dc-nav .wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation-item a {
	display: block;
	padding: 14px 0;
	border-bottom: 1px solid color-mix(in srgb, var(--wp--preset--color--contraste, #ede6d8) 12%, transparent);
	font-family: var(--wp--preset--font-family--familia-2, "Cormorant Garamond", serif);
	font-size: 32px;
	font-weight: 300;
	letter-spacing: 0;
	text-transform: none;
	text-decoration: none;
	color: var(--wp--preset--color--contraste, #ede6d8);
}

/* ===== Footer (theme/parts/footer.html) ===== */

.dc-footer {
	/* No design o rodapé nasce 100px depois da última seção — é o que separa a
	   última chamada da página do bloco de contatos. Sem isso o rodapé fica
	   colado no CTA anterior em todas as telas. */
	margin-top: 100px;

	/* 48px LITERAL, não `var(--wp--preset--spacing--50, 48px)`.
	 *
	 * O fallback de `var()` só entra quando a variável NÃO existe — e ela
	 * existe: `--wp--preset--spacing--50` vale 18px no theme.json. A regra
	 * parecia pedir 48 e entregava 18, e o rodapé ficava 30px à esquerda do
	 * eixo de toda a página (hero, academia e contacto-cta alinham em 48).
	 * Medido em 1440px: conteúdo do rodapé começando em x=18, o resto em x=48.
	 *
	 * Quando o design dá um número literal, escreva o número literal. */
	padding: 26px 48px 40px;

	/* Os quatro vãos abaixo existem porque `styles.spacing.blockGap` é "0" no
	 * theme.json — e com isso `--wp--style--block-gap` vale 0, que é de onde
	 * core/group e core/social-links tiram o `gap`. Zerado na origem, nenhum
	 * dos quatro aparecia acima de 1120px: "© 2026 Di CarvalhoCÓMO LLEGAR"
	 * saía grudado, e os três ícones sociais se tocavam.
	 *
	 * Não se conserta subindo o blockGap global: isso mexeria em TODO bloco do
	 * site para resolver quatro vãos de um rodapé. O zero global é proposital —
	 * cada bloco do design controla o próprio espaçamento.
	 *
	 * Os números são os do protótipo, medidos em design/Home.dc.html.
	 * A faixa <=1120px tem valores próprios, mais apertados, e vem depois
	 * nesta folha — por isso ela vence estes aqui. */
	gap: 24px;

	border-top: 1px solid color-mix(in srgb, var(--wp--preset--color--contraste, #ede6d8) 12%, transparent);
	font-size: 12px;
	letter-spacing: .14em;
	color: color-mix(in srgb, var(--wp--preset--color--contraste, #ede6d8) 45%, transparent);
}

/* Entre a linha do endereço e a do copyright. */
.dc-footer__addr {
	gap: 10px;
}

/* Entre "© 2026 Di Carvalho" e "Cómo llegar".
 *
 * Mira o GRUPO, não a classe solta: `dc-footer__line` está no <p> do endereço
 * e também no <div> que embrulha copyright + link. Sem o `.wp-block-group` a
 * regra cairia no parágrafo, que não é flex, e o vão que o Daniel viu grudado
 * continuaria grudado. */
.dc-footer__addr .dc-footer__line.wp-block-group {
	gap: 14px;
}

.dc-footer__social-links {
	gap: 18px;
}

.dc-footer a:hover {
	color: var(--wp--preset--color--acento, #c9a86a);
}

.dc-footer__maps a {
	color: var(--wp--preset--color--acento, #c9a86a);
	text-transform: uppercase;
	border-bottom: 1px solid color-mix(in srgb, var(--wp--preset--color--acento, #c9a86a) 50%, transparent);
}

.dc-footer__social-links a {
	color: color-mix(in srgb, var(--wp--preset--color--contraste, #ede6d8) 75%, transparent);
	transition: opacity .2s ease;
}

/* `opacity:.7` é o que o protótipo pede nos três ícones sociais — as únicas
   três ocorrências de style-hover na seção do rodapé. Eles não tinham hover
   nenhum: o ícone é um <svg> dentro do <a>, e a regra global de hover de link
   troca `color`, que o SVG do core não usa (ele pinta por `fill` fixo). */
.dc-footer__social-links a:hover,
.dc-footer__social-links a:focus-visible {
	opacity: .7;
}

/* O dimensionamento mora aqui, e nao na folha `wp-block-image` do core, porque
   o selo deixou de ser um core/image (ver theme/blocks/selo-weboption). O
   WordPress so enfileira aquela folha quando ha um core/image de verdade na
   pagina; sem estas duas linhas o SVG renderizaria nos seus 205x94 nativos e
   transbordaria a figure de 90px. */
.dc-footer__weboption {
	/* 32px de LARGURA, que no SVG de 205x94 dão 14.7px de altura — o design
	   pede `height:16px` (design/Home.dc.html, linha 274), então é isto com
	   1.3px de folga. Vinha de 90px, ou seja, 41px de altura: o selo era quase
	   o dobro dos 24px dos ícones sociais ao lado, para uma marca que é de
	   autoria e não da página.

	   Mora aqui, e não inline no render, porque agora vale em toda largura de
	   tela — ver theme/blocks/selo-weboption/render.php.

	   `display: flex` não é decoração: sem ele a figura crescia 5px abaixo dos
	   782px, engordada pelo `::after` que amplia o alvo do link — um elemento
	   posicionado, que não devia entrar em conta nenhuma. Como item de flex a
	   altura vira o tamanho do filho e para de escutar o que transborda; medido
	   14.7px em 390 e em 1440. */
	display: flex;
	width: 32px;
}

.dc-footer__weboption img {
	display: block;
	width: 100%;
	height: auto;
	opacity: .9;
	transition: opacity .2s ease;
}

/* Os 32px do selo dão 14.7px de altura, e é isso que o dedo teria para acertar
   — abaixo dos 24x24 que a WCAG 2.2 (2.5.8) pede, o mesmo número que abriu o
   `gap` dos ícones sociais logo acima. Quem cresce é o `::after` — ele é
   posicionado, então sai do fluxo e não empurra nada — desde que a figura seja
   flex (ver acima); como bloco ela contava o transbordo e ganhava 5px a 390px.
   Medido: alvo de 32x24.7, selo de 32x14.7 no mesmo pixel das duas larguras.

   (A primeira tentativa foi `padding: 5px 0; margin: -5px 0` no próprio <a>:
   as margens negativas colapsam com as da figura, e o colapso não saiu igual
   nas duas larguras — a 390px o selo subiu 2px.) */
.dc-footer__weboption a {
	position: relative;
	display: block;
	width: 100%;
}

.dc-footer__weboption a::after {
	content: "";
	position: absolute;
	inset: -5px 0;
}

/* O selo virou link (https://weboption.com.br/) e precisa responder ao ponteiro
   como tal. A regra global `.dc-footer a:hover` troca `color`, que não pinta
   este SVG — ele tem `fill` fixo. Mesmo `.7` dos três ícones sociais ao lado,
   pelo mesmo motivo. */
.dc-footer__weboption a:hover img,
.dc-footer__weboption a:focus-visible img {
	opacity: .7;
}

@media (max-width: 1120px) {
	/* 20px na lateral, nao 22: e a margem que hero, tipo-45, academia,
	   la-artista e contacto-cta usam no telefone. Com 22 o rodape ficava 2px
	   fora do eixo de todo o resto da pagina — pequeno demais para nomear
	   olhando, grande o bastante para o olho pegar. */
	.dc-footer {
		padding: 22px 20px 32px;
		flex-direction: column;
		align-items: flex-start;
		gap: 16px;
	}

	/* Os vaos internos do rodape sao ZERO — os grupos vem do core/group, que nao
	 * emite `gap` nenhum, e o `gap: 16px` acima so separa os tres filhos diretos.
	 * Medido em 390px:
	 *
	 *   "© 2026 Di Carvalho" termina em x=159 e "Cómo llegar" comeca em x=159
	 *   os tres icones sociais se tocam (24px cada, colados)
	 *   a linha do endereco encosta na linha do copyright
	 *
	 * Era o "© 2026 Di CarvalhoCÓMO LLEGAR" grudado do print.
	 *
	 * ATENCAO: os mesmos tres vaos sao zero ACIMA de 1120px tambem — medido
	 * identico em 1440px. Isto conserta so a faixa empilhada porque o combinado
	 * desta rodada e nao tocar no escritorio; o defeito la continua. */
	.dc-footer > .wp-block-group {
		gap: 6px;
	}

	.dc-footer > .wp-block-group .wp-block-group {
		flex-wrap: wrap;
		gap: 4px 10px;
	}

	/* 24x24 e o minimo do WCAG 2.2 (2.5.8) e passa raspando — mas so quando os
	 * alvos nao se tocam, e aqui eles se tocam. O gap resolve os dois lados:
	 * separa os alvos e abre a linha. */
	.dc-footer__social-links {
		gap: 14px;
	}
}

/* ===== Telefone: o selo Weboption sobe para a linha dos ícones =====
 *
 * Corta em 782px, não nos 1120px acima: a faixa de tablet continua empilhada
 * como está, e o combinado desta rodada é não mexer nela.
 *
 * Até aqui os três filhos do rodapé empilhavam (`flex-direction: column`) e o
 * selo caía sozinho numa terceira linha, encostado à esquerda e com 41px de
 * altura — mais alto que o endereço e que os próprios ícones sociais, para uma
 * marca que é de autoria, não da página.
 *
 * Volta a ser linha COM wrap: o endereço toma a largura toda (`flex-basis:
 * 100%`) e segue no topo; ícones e selo dividem a segunda linha. */
@media (max-width: 782px) {
	.dc-footer {
		flex-direction: row;
		flex-wrap: wrap;
		align-items: center;
	}

	.dc-footer__addr {
		flex-basis: 100%;
	}

	/* Só a posição: o tamanho agora é 32px em toda tela, definido uma vez lá
	 * em cima. Aqui havia um `width: 62px !important` — o `!important` existia
	 * para vencer a largura que vinha inline no próprio selo, e os dois saíram
	 * juntos quando ela virou regra de folha.
	 *
	 * `margin-left: auto` e não só o `space-between` do grupo: com wrap, o
	 * `space-between` só empurra enquanto houver dois itens na linha — a margem
	 * mantém o selo à direita mesmo se um dia os ícones saírem daqui. */
	.dc-footer__weboption {
		margin-left: auto;
	}
}


/* ===== Movimento de entrada (portado do protótipo) =====
 *
 * O protótipo anima com GSAP; aqui é CSS puro. Estas duas entradas rodam no
 * CARREGAMENTO, sobre elementos que estão sempre acima da dobra (o hero), então
 * não precisam de IntersectionObserver nem de JS nenhum — o que também as torna
 * imunes a falha de script.
 *
 * Equivalências de easing do GSAP:
 *   power3.out  →  cubic-bezier(.165, .84, .44, 1)
 *   power2.out  →  cubic-bezier(.215, .61, .355, 1)
 *
 * Quem pediu menos movimento não recebe nenhuma das duas: as regras inteiras
 * vivem dentro do @media, então sem a preferência o elemento nasce no estado
 * final e nada se move. */
@media (prefers-reduced-motion: no-preference) {

	/* --- Headline: cada linha sobe de dentro da própria máscara.
	 *
	 * `[data-hline]` no protótipo: yPercent 110 → 0, 1.2s, power3.out,
	 * stagger .15, delay .2. O elemento que corta é o .__linha/.__heading-line
	 * (overflow:hidden, já existia); quem se move é o texto dentro dele. */
	@keyframes dc-linha-sobe {
		from { transform: translateY(110%); }
		to   { transform: translateY(0); }
	}

	.dicarvalho-tipo-9__linha-texto,
	.dicarvalho-hero__heading-text {
		animation: dc-linha-sobe 1.2s cubic-bezier(.165, .84, .44, 1) .2s both;
	}

	/* O stagger do protótipo: a segunda linha sai 150ms depois da primeira. */
	.dicarvalho-tipo-9__linha:nth-of-type(2) .dicarvalho-tipo-9__linha-texto,
	.dicarvalho-hero__heading-line:nth-of-type(2) .dicarvalho-hero__heading-text {
		animation-delay: .35s;
	}

	/* --- Imagem do hero: fecha o zoom devagar.
	 *
	 * `[data-heroimg]`: scale 1.12 → 1, 2.2s, power2.out. */
	@keyframes dc-hero-zoom {
		from { transform: scale(1.12); }
		to   { transform: scale(1); }
	}

	.dicarvalho-tipo-9__imagem,
	.dicarvalho-hero__media,
	.dicarvalho-curso-hero__imagem {
		animation: dc-hero-zoom 2.2s cubic-bezier(.215, .61, .355, 1) both;
	}

	/* --- Entrada por scroll ([data-dc-rv]).
	 *
	 * `[data-rv]` no protótipo: y 42 → 0, opacity 0 → 1, .9s, power2.out,
	 * disparado por IntersectionObserver. Quem marca os nós é o render.php de
	 * cada bloco, nos mesmos elementos que o design marca.
	 *
	 * O `.dc-rv-armado` no <html> é o contrato: o estado escondido só vale
	 * depois que theme/assets/js/reveal.js confirmou que existe quem revele.
	 * Sem JS, sem IntersectionObserver ou com movimento reduzido, a classe
	 * nunca entra e o conteúdo nasce visível — nada fica preso invisível. */
	.dc-rv-armado [data-dc-rv] {
		opacity: 0;
		transform: translateY(42px);
		transition: opacity .9s cubic-bezier(.215, .61, .355, 1),
			transform .9s cubic-bezier(.215, .61, .355, 1);
	}

	.dc-rv-armado [data-dc-rv].is-revelado {
		opacity: 1;
		transform: none;
	}
}
