/* ============================================================
   MAIS — Biblioteca de Componentes WEB (camada 6)
   Depende de: tokens/core.css + web/web.css (importar ANTES).
   Ordem no <head>: core.css → web.css → components.css
   Consome tokens do core: semânticos primeiro; primitivas de
   camada B (derivadas) apenas para estados (hover, disabled, fundos
   suaves). Nenhum valor de cor hardcoded — se faltar, crie token
   novo em core.css (identidade) ou web.css (web).
   ============================================================ */

/* ------------------------------------------------------------
   BOTÃO — pílula, Poppins 500. 5 variações (primário, campanha,
   secundário, texto, claro) + modificadores --sm/--block, 5 estados.
   ------------------------------------------------------------ */
.btn {
  --btn-fundo: var(--cor-acento);
  --btn-texto: var(--cor-texto-sobre-acento); /* carvão: AA 5,1:1 sobre coral */
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: var(--space-2);
  min-height: 44px;                /* alvo de toque mínimo */
  padding: 12px var(--space-4);
  border: 2px solid transparent;
  border-radius: var(--radius-pill);
  font-family: var(--fonte-texto);
  font-weight: var(--peso-medium);
  font-size: var(--fs-body);
  line-height: 1;
  text-decoration: none;
  cursor: pointer;
  background: var(--btn-fundo);
  color: var(--btn-texto);
  transition: background var(--transicao), box-shadow var(--transicao),
              transform var(--transicao), border-color var(--transicao);
}
.btn:hover        { background: var(--cor-acento-hover); box-shadow: var(--shadow-md); }
.btn:focus-visible{ outline: none; box-shadow: var(--anel-foco); }
.btn:active       { transform: translateY(1px); box-shadow: var(--shadow-sm); }
.btn:disabled,
.btn[aria-disabled="true"] {
  background: var(--taupe-300);
  color: var(--cor-superficie);
  box-shadow: none;
  cursor: not-allowed;
  transform: none;
}

/* Primário = default acima (coral) */
.btn--primario { background: var(--cor-acento); color: var(--cor-texto-sobre-acento); }

/* Campanha/LP = pílula coral BOLD MAIÚSCULA (padrão extraído da LP) */
.btn--campanha { text-transform: uppercase; font-weight: var(--peso-semibold); letter-spacing: .04em; line-height: 1.2; }

/* Secundário = contorno oliva */
.btn--secundario {
  background: transparent;
  color: var(--cor-marca);
  border-color: var(--cor-marca);
}
.btn--secundario:hover { background: var(--oliva-100); box-shadow: var(--shadow-sm); }
.btn--secundario:disabled,
.btn--secundario[aria-disabled="true"] {
  background: transparent;
  color: var(--taupe-300);
  border-color: var(--taupe-300);
}

/* Texto = link discreto, underline no hover */
.btn--texto {
  background: transparent;
  color: var(--oliva-700);   /* AA 7,6:1 — coral não passa em texto pequeno */
  padding: var(--space-2);
  border-color: transparent;
}
.btn--texto:hover { background: transparent; box-shadow: none; text-decoration: underline; text-underline-offset: 3px; }
.btn--texto:active{ transform: none; }
.btn--texto:disabled,
.btn--texto[aria-disabled="true"] { background: transparent; color: var(--taupe-300); }

/* Tamanho compacto (ex.: CTA da navbar) */
.btn--sm { min-height: 36px; padding: var(--space-2) var(--space-3); font-size: var(--fs-caption); }
/* Em tela de toque o compacto volta aos 44px. Os 36px existem para
   densidade no desktop, onde o alvo é um ponteiro de 1px; no dedo,
   36px é erro de toque. `pointer: coarse` pergunta pelo APARELHO de
   apontar, não pela largura — pega tablet em paisagem (que é largo e
   mesmo assim é dedo) e não pune uma janela estreita no notebook. */
@media (pointer: coarse) { .btn--sm { min-height: 44px; } }

/* ------------------------------------------------------------
   CARD — superfície branca sobre creme, cantos grandes, sombra suave.
   ------------------------------------------------------------ */
.card {
  display: flex;
  flex-direction: column;
  gap: var(--space-3);
  background: var(--cor-superficie);
  border-radius: var(--radius-lg);
  box-shadow: var(--shadow-md);
  padding: var(--space-5);
}
.card__titulo { font-family: var(--fonte-texto); font-weight: var(--peso-semibold); font-size: var(--fs-h3); line-height: var(--lh-snug); color: var(--cor-texto); margin: 0; }
.card__texto  { font-family: var(--fonte-texto); font-weight: var(--peso-light); font-size: var(--fs-body); line-height: var(--lh-normal); color: var(--cor-texto-suave); margin: 0; }

/* Ícone em círculo (estilo brand guide): oliva com detalhe coral */
.card__icone {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 64px;
  height: 64px;
  border-radius: var(--radius-full);
  background: var(--oliva-100);
  color: var(--cor-marca);
}
.card__icone svg { width: 32px; height: 32px; }

/* Card clicável (link/artigo interativo): reage a hover/foco */
.card--link { text-decoration: none; transition: transform var(--transicao), box-shadow var(--transicao); }
.card--link:hover        { transform: translateY(-4px); box-shadow: var(--shadow-lg); }
.card--link:focus-visible{ outline: none; box-shadow: var(--anel-foco); }
.card--link:active       { transform: translateY(-1px); box-shadow: var(--shadow-md); }

/* Card orgânico (retrato / autoridade) — raio 104px assimétrico */
.card--organico { border-radius: var(--radius-organico) var(--radius-organico) var(--radius-lg) var(--radius-organico); }

/* ------------------------------------------------------------
   INPUT / CAMPO — label acima, borda taupe, foco coral.
   ------------------------------------------------------------ */
/* `min-width: 0` é obrigatório aqui: item de grid/flex tem largura
   mínima automática igual ao conteúdo, e o <select> herda a largura
   da maior <option>. Sem isso a coluna não encolhe e o formulário
   fura a página no mobile. */
.campo { display: flex; flex-direction: column; gap: var(--space-1); min-width: 0; }
.campo__label {
  font-family: var(--fonte-texto);
  font-weight: var(--peso-medium);
  font-size: var(--fs-caption);
  color: var(--cor-texto);
}
.campo__controle {
  width: 100%;
  min-width: 0;                    /* ver nota em .campo */
  min-height: 44px;
  padding: 12px 16px;
  background: var(--cor-superficie);
  border: 1px solid var(--cor-borda);
  border-radius: var(--radius-sm);
  font-family: var(--fonte-texto);
  font-weight: var(--peso-regular);
  font-size: var(--fs-body);
  color: var(--cor-texto);
  transition: border-color var(--transicao), box-shadow var(--transicao);
}
.campo__controle::placeholder { color: var(--taupe-300); }
.campo__controle:hover        { border-color: var(--taupe-600); }
.campo__controle:focus-visible,
.campo__controle:focus        { outline: none; border-color: var(--cor-acento); box-shadow: var(--anel-foco); }
.campo__controle:disabled     { background: var(--cor-fundo-alt); color: var(--taupe-300); border-color: var(--taupe-300); cursor: not-allowed; }
.campo__ajuda { font-family: var(--fonte-texto); font-size: var(--fs-caption); color: var(--cor-texto-suave); }

/* Estado de erro */
.campo--erro .campo__controle { border-color: var(--cor-erro); }
.campo--erro .campo__controle:focus-visible { box-shadow: var(--anel-foco-erro); }
.campo__erro { font-family: var(--fonte-texto); font-size: var(--fs-caption); color: var(--cor-erro); }

/* Campo obrigatório — asterisco no label (usar também aria-required no controle) */
.campo--obrigatorio .campo__label::after { content: " *"; color: var(--coral-800); }

/* Select — mesma anatomia do controle, seta própria (a nativa é escondida).
   Nota: os hex nos data-URIs duplicam taupe-600/creme-100 (limitação de
   url() em CSS) — se esses tokens mudarem, atualizar as setas junto. */
select.campo__controle {
  appearance: none;
  -webkit-appearance: none;
  padding-right: var(--space-6);
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 16 16'%3E%3Cpath d='M4 6l4 4 4-4' fill='none' stroke='%23695F44' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");
  background-repeat: no-repeat;
  background-position: right var(--space-3) center;
  cursor: pointer;
}

/* Textarea — altura mínima confortável, só cresce na vertical */
textarea.campo__controle { min-height: 120px; resize: vertical; line-height: var(--lh-normal); padding-block: var(--space-2); }

/* Campo sobre fundo de cor — APENAS seções TEAL/ESCURA (texto claro
   passa AA nelas). Sobre CORAL o creme dá 2,4:1: form vai em CARD
   BRANCO (como a LP NR-1 faz) — nunca campo solto sobre coral.
   Fundo do controle escurece (mix carvão) p/ texto claro passar. */
.campo--sobre-cor .campo__label { color: var(--cor-texto-invertido); }
.campo--sobre-cor .campo__label::after { color: var(--cor-texto-invertido); } /* asterisco visível sobre cor */
.campo--sobre-cor .campo__controle {
  background: color-mix(in srgb, var(--carvao-900) 30%, transparent);
  border-color: color-mix(in srgb, var(--branco) 55%, transparent);
  color: var(--cor-texto-invertido);
}
.campo--sobre-cor .campo__controle::placeholder { color: color-mix(in srgb, var(--cor-texto-invertido) 80%, transparent); }
.campo--sobre-cor .campo__controle:hover { border-color: var(--branco); }
.campo--sobre-cor .campo__controle:focus-visible,
.campo--sobre-cor .campo__controle:focus { border-color: var(--branco); box-shadow: var(--anel-foco-invertido); }
.campo--sobre-cor .campo__controle:disabled { background: color-mix(in srgb, var(--carvao-900) 12%, transparent); color: color-mix(in srgb, var(--cor-texto-invertido) 50%, transparent); border-color: color-mix(in srgb, var(--branco) 25%, transparent); }
.campo--sobre-cor .campo__ajuda { color: color-mix(in srgb, var(--cor-texto-invertido) 85%, transparent); }
/* erro sobre cor: borda coral-clara + mensagem branca (creme-erro não passa AA) */
.campo--sobre-cor.campo--erro .campo__controle { border-color: var(--coral-100); }
.campo--sobre-cor .campo__erro { color: var(--branco); font-weight: var(--peso-medium); }
.campo--sobre-cor select.campo__controle { background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 16 16'%3E%3Cpath d='M4 6l4 4 4-4' fill='none' stroke='%23F7F4D2' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E"); }
.campo--sobre-cor select.campo__controle option { color: var(--cor-texto); background: var(--cor-superficie); } /* dropdown nativo renderiza claro */

/* ------------------------------------------------------------
   FORM — grid padrão de formulário (lead/contato).
   1 coluna por padrão; --2col pareia campos curtos (e-mail/tel…);
   .form__full ocupa a linha inteira. Colapsa no mobile.
   ------------------------------------------------------------ */
.form { display: grid; grid-template-columns: 1fr; gap: var(--space-3); }
.form--2col { grid-template-columns: 1fr 1fr; }
.form__full { grid-column: 1 / -1; }
@media (max-width: 640px) { .form--2col { grid-template-columns: 1fr; } }

/* Aviso de privacidade sob o botão. Vem DEPOIS do envio na ordem
   visual e ANTES dele na leitura de quem hesita: é o lugar onde a
   dúvida "o que vão fazer com meu e-mail" aparece.
   Taupe sobre branco dá 5,4:1 — passa AA mesmo neste tamanho. */
.form__aviso {
  font-family: var(--fonte-texto);
  font-weight: var(--peso-light);
  font-size: var(--fs-caption);
  line-height: var(--lh-normal);
  color: var(--cor-texto-suave);
  margin: 0;
}
.form__aviso a { color: var(--oliva-700); text-decoration: underline; text-underline-offset: 2px; }
.form__aviso a:focus-visible { outline: none; box-shadow: var(--anel-foco); border-radius: var(--radius-sm); }

/* Botão de envio ocupando a largura do form */
.btn--block { width: 100%; }

/* Botão claro — para CTAs sobre seções de cor (coral/teal/escura),
   onde o primário coral desaparece. Fundo creme, texto carvão. */
.btn--claro { background: var(--creme-100); color: var(--cor-texto); }
.btn--claro:hover { background: var(--branco); box-shadow: var(--shadow-md); }
.btn--claro:focus-visible { box-shadow: var(--anel-foco-invertido); }

/* ------------------------------------------------------------
   BADGE / TAG — pílula para categorias (EAP · NR-1 · Care Ops).
   ------------------------------------------------------------ */
.tag {
  display: inline-flex;
  align-items: center;
  padding: 4px 12px;
  border-radius: var(--radius-pill);
  font-family: var(--fonte-texto);
  font-weight: var(--peso-medium);
  font-size: var(--fs-caption);
  line-height: 1.4;
}
.tag--coral { background: var(--coral-100); color: var(--coral-800); } /* AA 5,5:1 */
.tag--oliva { background: var(--oliva-100); color: var(--oliva-700); }

/* ------------------------------------------------------------
   NAVBAR — creme translúcido com blur, logo à esquerda, CTA à direita.
   ------------------------------------------------------------ */
.navbar {
  position: sticky;
  top: 0;
  z-index: 50;
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--space-4);
  padding: var(--space-3) var(--space-4);
  background: color-mix(in srgb, var(--cor-fundo) 80%, transparent);
  backdrop-filter: blur(12px);
  -webkit-backdrop-filter: blur(12px);
  border-bottom: 1px solid var(--cor-borda);
}
.navbar__logo { display: inline-flex; align-items: center; }
.navbar__logo img { height: 32px; width: auto; display: block; }
.navbar__links { display: flex; align-items: center; gap: var(--space-4); list-style: none; margin: 0; padding: 0; }
.navbar__link {
  font-family: var(--fonte-texto);
  font-weight: var(--peso-medium);
  font-size: var(--fs-caption);
  color: var(--cor-texto);
  text-decoration: none;
  padding: 8px 4px;
  transition: color var(--transicao);
}
.navbar__link:hover        { color: var(--cor-acento-hover); }
.navbar__link:focus-visible{ outline: none; box-shadow: var(--anel-foco); border-radius: var(--radius-sm); }

/* ------------------------------------------------------------
   SEÇÃO — container repetível, alterna fundos p/ criar ritmo.
   ------------------------------------------------------------ */
.secao { padding-block: var(--espaco-secao); background: var(--cor-fundo); }
.secao--alt    { background: var(--cor-fundo-alt); }
.secao--escura { background: var(--cor-superficie-escura); color: var(--cor-texto-invertido); }
.secao--escura .card__texto { color: var(--cor-texto-invertido); }
/* Seções coloridas (cor protagonista + texto invertido) — padrão MAIS extraído da LP */
.secao--coral { background: var(--cor-secao-coral); color: var(--cor-texto-invertido); }
.secao--teal  { background: var(--cor-secao-teal);  color: var(--cor-texto-invertido); }
.secao--coral .card__texto, .secao--teal .card__texto { color: var(--cor-texto-invertido); }
.secao__container      { width: 100%; max-width: var(--container); margin-inline: auto; padding-inline: var(--space-4); }
.secao__container--texto { max-width: var(--container-text); }
.secao__cabecalho { display: flex; flex-direction: column; gap: var(--space-2); margin-bottom: var(--space-6); }

/* ------------------------------------------------------------
   TEXTURA DE MARCA — camada expressiva (conceito Jardim Tropical).
   Grão orgânico por cima de qualquer superfície de COR da marca.
   Compõe, não substitui: o elemento mantém seu `background` de
   token e ganha `.textura-marca`.

       <section class="secao secao--coral textura-marca">
       <div class="clientes textura-marca">

   Por que blend e não uma imagem colorida: o arquivo é uma base
   NEUTRA (cimento). Assim a mesma textura serve coral, teal e
   carvão — e continua servindo se a cor da marca mudar.
   ------------------------------------------------------------ */
.textura-marca { position: relative; isolation: isolate; }
.textura-marca::before {
  content: "";
  position: absolute;
  inset: 0;
  z-index: -1;                    /* atrás do conteúdo, à frente do fundo do próprio bloco */
  border-radius: inherit;         /* acompanha painéis arredondados (.clientes) */
  background: url("../assets/texturas/textura-base.jpg") center / cover;
  mix-blend-mode: soft-light;
  opacity: var(--textura-forca, .55);
  pointer-events: none;
}
/* Sobre cor ESCURA (teal, carvão) o soft-light some — `overlay` é
   quem entrega o relevo. Aferido no render, não no papel. */
.textura-marca--escura::before { mix-blend-mode: overlay; opacity: var(--textura-forca, .4); }

/* ------------------------------------------------------------
   CLIENTES ("Quem confia na MAIS") — painel de prova social.
   Repete-se nas 5 LPs e no site: é MOLDE do DS, não conteúdo de
   entrega. A seção que o envolve é `.secao` + `.secao__container`;
   `.clientes` é o PAINEL de cor.

   Regra de marca (CLAUDE.md): logo de cliente é SEMPRE branca,
   SEMPRE sobre painel de cor. Nunca solta no creme, nunca
   recolorida, nunca com filter/opacity que a apague.

   Normalização por CAIXA, não por altura: as logos têm proporções
   muito diferentes (CDN 3,73:1 · DM9 2,74:1) e `height` fixo faria
   a mais larga dominar. Cada logo entra numa caixa de largura igual
   e é limitada nos DOIS eixos (max-width + max-height), então
   nenhuma proporção manda no conjunto.
   ------------------------------------------------------------ */
.clientes {
  --clientes-caixa:  192px;  /* largura da caixa de cada logo */
  --clientes-altura: 56px;   /* teto de altura ótica dentro da caixa */
  background: var(--cor-secao-coral);
  /* Texto CARVÃO, não creme: creme sobre coral dá 2,4:1 e reprova AA
     em qualquer tamanho (regra não negociável do CLAUDE.md).
     `--cor-texto-sobre-acento` = 5,1:1. As LOGOS seguem brancas —
     a regra da logo branca é sobre o painel de cor, não sobre o texto. */
  color: var(--cor-texto-sobre-acento);
  border-radius: var(--radius-lg);
  padding: var(--space-7) var(--space-5);
  text-align: center;
}
/* Cor protagonista alternativa (LP que rode em teal — camada C).
   Teal é escuro: aqui o texto INVERTE para creme (carvão sobre teal
   não passa AA; creme passa). */
.clientes--teal { background: var(--cor-secao-teal); color: var(--cor-texto-invertido); }

.clientes__overline { font-family: var(--fonte-texto); font-weight: var(--peso-medium); font-size: var(--fs-overline); letter-spacing: .12em; text-transform: uppercase; margin: 0; }
/* Itálico Lora = assinatura da marca (brandbook pág. 5) */
.clientes__titulo   { font-family: var(--fonte-titulo); font-style: italic; font-weight: var(--peso-regular); font-size: var(--fs-h2); line-height: 1.2; margin: var(--space-2) 0 0; }
.clientes__apoio    { font-family: var(--fonte-texto); font-weight: var(--peso-light); font-size: var(--fs-body); line-height: var(--lh-normal); max-width: var(--container-text); margin: var(--space-3) auto 0; }

/* Grade das logos — flex-wrap centrado: a ÚLTIMA fileira também
   centraliza, então de 2 a 8+ logos nunca sobra item órfão
   encostado à esquerda (o que `grid auto-fit` faria). */
.clientes__logos {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  justify-content: center;
  gap: var(--space-6) var(--space-8);
  list-style: none;
  margin: var(--space-6) 0 0;
  padding: 0;
}
.clientes__logo {
  flex: 0 0 var(--clientes-caixa);
  display: flex;
  align-items: center;
  justify-content: center;
}
/* --clientes-escala: ajuste fino ÓTICO por logo (setado no <li>),
   para marcas com peso de tinta muito diferente lerem com a mesma
   importância. Só isso — não é para corrigir respiro do arquivo:
   respiro sobrando se corrige no viewBox do próprio SVG. */
.clientes__logo img {
  width: auto;
  height: auto;
  max-width: 100%;
  max-height: calc(var(--clientes-altura) * var(--clientes-escala, 1));
  object-fit: contain;
  display: block;
}

@media (max-width: 640px) {
  .clientes { --clientes-caixa: 144px; --clientes-altura: 44px; padding: var(--space-6) var(--space-4); }
  .clientes__logos { gap: var(--space-5) var(--space-6); }
}

/* Depoimentos — RESERVADO, não renderizar ainda.
   Os do Figma são lorem ipsum com foto de banco de imagem; entram
   só com citação real, nome, cargo e autorização (copy.md §9).
   Quando entrarem, o container é este — 2 `.card` sobre o painel:

   .clientes__depoimentos {
     display: grid;
     grid-template-columns: 1fr 1fr;
     gap: var(--space-4);
     margin-top: var(--space-7);
     text-align: left;
   }
   @media (max-width: 900px) { .clientes__depoimentos { grid-template-columns: 1fr; } }
*/

/* ------------------------------------------------------------
   SERVIÇOS — `.servico`, o card-etiqueta das frentes da MAIS.
   As 5 frentes (+ educação) aparecem nas 5 LPs e no site, sempre
   iguais: é molde do DS, não conteúdo de entrega.

   A arte veio do Figma como PNG fechado (disco + ícone + título +
   subtítulo). Aqui só o ÍCONE é imagem — o disco, o card, a ponta
   e o texto são forma sólida e texto, reconstruídos com token.
   Motivo: texto dentro de PNG não é indexado, não é lido por
   leitor de tela, não requebra no mobile e não segue a cor da
   marca (a arte trazia #222A2A, cinza frio, no lugar do carvão).

   Geometria aferida na arte original (card de 374px):
     disco sálvia = círculo de raio 143 centrado no topo-centro
                    → diâmetro 76,5% da largura do card, meia-lua
     ponta        = quadrado girado 45°, base ~18% da largura
     canto        = ~38px em 374 ≈ --radius-lg
   ------------------------------------------------------------ */
.servicos {
  display: grid;
  grid-template-columns: repeat(6, 1fr);
  gap: var(--space-3);
  list-style: none;
  margin: 0;
  padding: 0;
}

.servico {
  --servico-disco: 76.5%;   /* diâmetro do disco, relativo à largura do card */
  position: relative;
  display: flex;
  flex-direction: column;
  align-items: center;
  text-align: center;
  background: var(--cor-superficie);
  border-radius: var(--radius-lg);
  /* Sem padding lateral no card: o disco é % da largura TOTAL (é assim
     na arte). O respiro lateral fica no texto, logo abaixo. */
  padding: 0 0 var(--space-4);
}

/* Ponta inferior: quadrado girado 45° com um canto arredondado —
   metade dele sobra para fora da borda do card. Mesma cor do card,
   então lê como uma forma só. `aspect-ratio` mantém o quadrado. */
.servico::after {
  content: "";
  position: absolute;
  left: 50%;
  bottom: 0;
  width: 13%;
  aspect-ratio: 1;
  background: var(--cor-superficie);
  border-radius: 0 0 var(--radius-sm) 0;
  transform: translate(-50%, 50%) rotate(45deg);
}

/* Meia-lua: caixa 2:1 com raio grande só embaixo. O CSS reduz os
   dois raios pelo mesmo fator, então o resultado é meio CÍRCULO
   exato — não uma elipse. Nasce colada ao topo do card, sem clip. */
.servico__disco {
  position: relative;
  width: var(--servico-disco);
  aspect-ratio: 2 / 1;
  border-radius: 0 0 var(--radius-pill) var(--radius-pill);
  background: var(--cor-superficie-salvia);
  margin-bottom: var(--space-3);
}

/* Ícone normalizado por CAIXA, nunca por altura fixa: as proporções
   variam muito entre eles (80×118 na flor, 124×97 no play) e travar
   um eixo faria o mais largo dominar. Mesma lógica de .clientes__logo.
   Os limites (79% da altura da meia-lua, 44% da largura) são os da
   arte original, aferidos ícone a ícone.

   `position: absolute` não é enfeite: em fluxo, a % de `max-height`
   resolvia contra uma altura que o próprio ícone estava definindo
   (a meia-lua vem de `aspect-ratio`), então o ícone alto empurrava o
   disco e cada card virava uma elipse de altura diferente. Fora do
   fluxo, o disco manda na altura e a % passa a ter contra o que
   resolver. */
.servico__ic {
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
  width: auto;
  height: auto;
  max-width: 44%;
  max-height: 79%;
  object-fit: contain;
  display: block;
}

.servico__titulo {
  font-family: var(--fonte-texto);
  font-weight: var(--peso-semibold);
  font-size: var(--fs-caption);
  /* .02em, não os .12em de rótulo de seção: aqui o título disputa uma
     coluna estreita, e cada 0,01em custa ~2px em "EDUCAÇÃO CONTÍNUA",
     o mais longo dos seis. `balance` cuida do caso em que ele quebra. */
  letter-spacing: .02em;
  text-transform: uppercase;
  color: var(--cor-texto);
  margin: 0;
  padding-inline: var(--space-1);
  text-wrap: balance;
}
/* Hierarquia por PESO, não por cinza: o subtítulo mantém o carvão
   (é conteúdo, não legenda) e recua no peso. Vale a regra do
   brandbook — legibilidade vem do tamanho, não de apagar a cor. */
.servico__apoio {
  font-family: var(--fonte-texto);
  font-weight: var(--peso-light);
  font-size: var(--fs-caption);
  line-height: 1.35;
  color: var(--cor-texto);
  margin: var(--space-1) 0 0;
  padding-inline: var(--space-2);
  text-wrap: balance;
}

/* 1200px e não 1024: abaixo disso o card cai de ~178px para ~150px e
   o título mais longo passa a quebrar em toda tela da faixa. Melhor
   trocar de 6 para 3 colunas do que espremer seis. */
@media (max-width: 1200px) { .servicos { grid-template-columns: repeat(3, 1fr); } }
@media (max-width: 560px)  { .servicos { grid-template-columns: repeat(2, 1fr); gap: var(--space-2); } }

/* ------------------------------------------------------------
   PALCO — peça (mockup, retrato) sobre formas orgânicas em camada.
   Jardim Tropical, regra 1: os anéis de crescimento do símbolo são
   o padrão-mãe. Aqui viram manchas orgânicas sobrepostas atrás da
   peça — "somos feitos de camadas" (brandbook pág. 6).

       <div class="palco">
         <span class="palco__camada palco__camada--a" aria-hidden="true"></span>
         <span class="palco__camada palco__camada--b" aria-hidden="true"></span>
         <img class="palco__peca" src="…">
       </div>

   Duas manchas, não cinco: "complexidade também pode ser leveza".
   As manchas são `aria-hidden` e não têm conteúdo — decoração pura.
   ------------------------------------------------------------ */
.palco {
  position: relative;
  isolation: isolate;
  display: flex;
  align-items: center;
  justify-content: center;
  /* Sem overflow escondido: as manchas VAZAM de propósito. O corte
     reto contradiz a forma orgânica. Quem contém é a `.lp-sec`. */
}

.palco__camada {
  position: absolute;
  z-index: -1;
  pointer-events: none;
  /* Blob: raios assimétricos nos dois eixos. É o mesmo princípio do
     `--radius-organico`, só que sem simetria — forma de mancha, não
     de cápsula. */
  background: var(--palco-cor, var(--cor-secao-coral));
  /* A textura entra por cima da cor, como em `.textura-marca`: a base
     é neutra, então a mesma mancha serve coral, oliva ou sálvia. */
  background-image: url("../assets/texturas/textura-base.jpg");
  background-size: cover;
  background-position: center;
  background-blend-mode: soft-light;
  opacity: var(--palco-forca, .85);
}

/* Mancha maior, atrás e à esquerda — a que "segura" a peça.
   Ela precisa ESCAPAR da peça pelos dois lados: se couber atrás do
   mockup, some e a camada vira sombra colorida sem leitura.

   O tamanho vem da ALTURA do palco, não da largura. Dimensionada em
   `width`, a mancha é um quadrado do tamanho da coluna: quando o
   layout empilha e o palco vira largura total, ela cresce junto e
   despenca sobre o texto de baixo. Ancorada na altura, o vazamento
   vertical fica fixo em ~8% da peça, em qualquer largura de tela. */
.palco__camada--a {
  --palco-cor: var(--cor-secao-coral);
  --palco-forca: 1;
  height: 116%;
  aspect-ratio: 1;
  left: -18%;
  top: -8%;
  border-radius: 58% 42% 47% 53% / 52% 46% 54% 48%;
}
/* Mancha menor — espia por BAIXO da peça, não pela direita.
   A mancha A pode vazar para fora do container (ali só tem margem);
   esta não pode passar da borda direita do palco, senão entra na
   coluna de texto ao lado e o parágrafo passa a ser lido sobre ela. */
.palco__camada--b {
  --palco-cor: var(--cor-superficie-salvia);
  --palco-forca: .8;
  height: 62%;                       /* ver nota da mancha A */
  aspect-ratio: 1;
  right: 4%;
  bottom: -10%;
  border-radius: 46% 54% 60% 40% / 48% 55% 45% 52%;
}

/* A peça flutua sobre as manchas. `drop-shadow` e não `box-shadow`:
   o mockup é PNG/WebP com alfa, e a sombra tem que seguir o recorte,
   não a caixa. */
.palco__peca {
  position: relative;
  width: 100%;
  height: auto;
  display: block;
  filter: drop-shadow(0 24px 48px color-mix(in srgb, var(--carvao-900) 28%, transparent));
}

/* Quando o layout empilha, o que estava ao LADO do palco passa a
   estar EMBAIXO dele — e o vazamento inferior da mancha B, que na
   coluna dupla caía em margem vazia, passa a cair em cima do texto
   seguinte. Aqui ela recolhe e o palco reserva o respiro. */
@media (max-width: 900px) {
  .palco { margin-bottom: var(--space-7); }   /* > que o vazamento de 10% */
}
@media (max-width: 640px) {
  /* Manchas menores no mobile: em coluna estreita elas comem a peça. */
  .palco__camada--a { height: 104%; left: -12%; top: -2%; }
  .palco__camada--b { height: 54%; }
}

/* ------------------------------------------------------------
   TRILHO — acordeão de diferenciais com marcador vertical.
   Estrutura do Figma; a leitura de marca vem do brandbook: o
   marcador é o anel de crescimento ("somos feitos de camadas") e
   APROFUNDA quando o item abre. Só um item aberto por vez, então o
   trilho inteiro é lido como uma barra de camadas em que uma está
   à mostra.

       <div class="trilho">
         <details class="trilho__item" name="porque" open>
           <summary class="trilho__cabeca">…</summary>
           <div class="trilho__corpo"><p class="trilho__texto">…</p></div>
         </details>
       </div>

   `<details name>` faz o acordeão exclusivo NATIVO: teclado, foco e
   leitor de tela já vêm prontos, sem uma linha de JS. Onde o `name`
   não é suportado, degrada para "vários abertos" — que continua
   utilizável, nunca quebrado.
   ------------------------------------------------------------ */
.trilho { display: flex; flex-direction: column; }

.trilho__item {
  /* O marcador É a borda: um elemento a menos e ele acompanha a
     altura do item aberto sem cálculo nenhum. */
  border-left: var(--trilho-marcador, 5px) solid var(--cor-marcador);
  padding: var(--space-4) 0 var(--space-4) var(--space-4);
  transition: border-color var(--transicao), padding-left var(--transicao);
}
.trilho__item[open] {
  border-left-color: var(--cor-marcador-ativo);
  /* Recua um passo ao abrir: a camada "vem à tona". Sutil de
     propósito — complexidade com leveza. */
  padding-left: var(--space-5);
}
/* `:not([open])` é obrigatório: sem ele o hover vence o `[open]` por
   ordem de origem (mesma especificidade) e o item ABERTO clareia
   quando o mouse passa — o oposto do que o estado quer dizer. */
.trilho__item:not([open]):hover { border-left-color: color-mix(in srgb, var(--cor-marcador-ativo) 55%, var(--cor-marcador)); }

.trilho__cabeca {
  font-family: var(--fonte-texto);
  font-weight: var(--peso-medium);
  font-size: var(--fs-h3);
  line-height: var(--lh-snug);
  color: var(--cor-titulo-profundo);
  cursor: pointer;
  list-style: none;               /* tira o triângulo padrão */
  min-height: 44px;               /* alvo de toque */
  display: flex;
  align-items: center;
}
.trilho__cabeca::-webkit-details-marker { display: none; }
.trilho__cabeca:focus-visible { outline: none; box-shadow: var(--anel-foco); border-radius: var(--radius-sm); }
.trilho__item[open] .trilho__cabeca { font-weight: var(--peso-semibold); }

.trilho__corpo { padding-top: var(--space-2); }
.trilho__texto {
  font-family: var(--fonte-texto);
  font-weight: var(--peso-light);
  font-size: var(--fs-body);
  line-height: var(--lh-normal);
  color: var(--cor-texto);
  max-width: 46ch;
  margin: 0;
}

@media (max-width: 640px) {
  .trilho__item { padding: var(--space-3) 0 var(--space-3) var(--space-3); }
  .trilho__item[open] { padding-left: var(--space-4); }
}

/* ------------------------------------------------------------
   FOOTER — fundo sálvia (--cor-rodape, padrão da LP), texto carvão
   (AA 4,6:1 sobre sálvia), logo branca.
   ------------------------------------------------------------ */
.rodape { background: var(--cor-rodape); color: var(--cor-texto); padding-block: var(--space-7); }
.rodape__container { width: 100%; max-width: var(--container); margin-inline: auto; padding-inline: var(--space-4); display: flex; flex-wrap: wrap; gap: var(--space-5); justify-content: space-between; align-items: flex-start; }
.rodape__logo img { height: 36px; width: auto; display: block; }
.rodape__tagline { font-family: var(--fonte-titulo); font-style: italic; font-size: var(--fs-quote); color: var(--cor-texto); margin-top: var(--space-3); max-width: 32ch; }
.rodape__links { display: flex; flex-direction: column; gap: var(--space-2); list-style: none; margin: 0; padding: 0; }
.rodape__link {
  font-family: var(--fonte-texto);
  font-weight: var(--peso-light);
  font-size: var(--fs-caption);
  color: var(--cor-texto);
  text-decoration: none;
  /* Sem `opacity`. Carvão cheio sobre sálvia dá 4,59:1 e passa AA por
     uma margem estreita; a 85% que estava aqui derruba para 3,66:1 e
     reprova — e nem 95% salva (4,23:1). O rodapé é o único lugar da
     página com texto pequeno sobre sálvia, então não sobra folga para
     apagar cor. Vale a regra do brandbook: hierarquia vem do tamanho,
     nunca de desbotar o texto. Mesma correção já feita no `.camada__n`. */
  transition: color var(--transicao);
  /* Alvo de toque: no dedo, link de rodapé em linha de 14px é alvo de
     ~19px. `pointer: coarse` dá altura sem inchar o rodapé no desktop. */
}
@media (pointer: coarse) { .rodape__link { display: inline-flex; align-items: center; min-height: 44px; } }
.rodape__link:hover        { text-decoration: underline; text-underline-offset: 3px; }
.rodape__link:focus-visible{ outline: none; box-shadow: var(--anel-foco); border-radius: var(--radius-sm); }

/* ------------------------------------------------------------
   MODAL — janela de captura, aberta por qualquer CTA da página.
   Molde das 5 LPs: o caminho até o formulário é sempre o mesmo,
   muda só a copy dentro.

   Por que janela e não rolagem até o topo: quando a pessoa clica
   num CTA no meio da página, ela acabou de ser convencida por
   AQUELE argumento. Jogar a página de volta ao topo obriga ela a
   reencontrar o que a convenceu, e cada reencontro é uma chance
   de desistir.

   Usa <dialog> nativo, não uma div com z-index. O nativo já traz,
   sem uma linha de JS: foco preso dentro da janela, fechar no ESC,
   e o resto da página marcado como inerte para leitor de tela.
   Uma div com z-index não tem nada disso — a pessoa que navega por
   teclado sai da janela e fica presa atrás dela, sem saber.

       <dialog class="modal" aria-labelledby="…">
         <button class="modal__fechar" …>
         <div class="modal__corpo">
           <section class="modal__etapa" data-etapa="form">…</section>
           <section class="modal__etapa" data-etapa="agenda" hidden>…</section>
         </div>
       </dialog>
   ------------------------------------------------------------ */
.modal {
  --modal-largura: 560px;
  width: min(var(--modal-largura), calc(100vw - var(--space-5) * 2));
  max-height: 92dvh;             /* dvh e não vh: no celular a barra do
                                    navegador some e volta, e vh não
                                    acompanha — a janela fica cortada. */
  padding: 0;
  border: 0;
  background: var(--cor-superficie);
  border-radius: var(--radius-lg);
  box-shadow: var(--shadow-lg);
  color: var(--cor-texto);
  overflow: hidden;
  /* Centralizar sem transform: `margin: auto` no <dialog> é o modo
     nativo, e não briga com a animação de entrada. */
  margin: auto;
  opacity: 0;
  transition: opacity var(--transicao), display var(--transicao) allow-discrete;
}
.modal[open] { opacity: 1; }
@starting-style { .modal[open] { opacity: 0; } }

.modal::backdrop {
  background: color-mix(in srgb, var(--carvao-900) 55%, transparent);
  opacity: 0;
  transition: opacity var(--transicao), display var(--transicao) allow-discrete;
}
.modal[open]::backdrop { opacity: 1; }
@starting-style { .modal[open]::backdrop { opacity: 0; } }

/* A janela cresce quando entra a agenda: o calendário precisa de
   largura para mostrar o mês inteiro sem virar lista de rolagem. */
.modal--largo { --modal-largura: 760px; }

.modal__corpo {
  padding: var(--space-6);
  overflow-y: auto;
  max-height: 92dvh;
}

.modal__fechar {
  position: absolute;
  top: var(--space-2);
  right: var(--space-2);
  z-index: 1;
  width: 44px;                    /* alvo de toque, não o tamanho do × */
  height: 44px;
  display: flex;
  align-items: center;
  justify-content: center;
  border: 0;
  border-radius: var(--radius-full);
  background: transparent;
  color: var(--cor-texto-suave);
  font-size: 24px;
  line-height: 1;
  cursor: pointer;
  transition: background var(--transicao), color var(--transicao);
}
.modal__fechar:hover        { background: var(--cor-fundo); color: var(--cor-texto); }
.modal__fechar:focus-visible{ outline: none; box-shadow: var(--anel-foco); }

.modal__titulo {
  font-family: var(--fonte-texto);
  font-weight: var(--peso-semibold);
  font-size: var(--fs-h3);
  color: var(--cor-texto);
  margin: 0 0 var(--space-1);
  padding-right: var(--space-6);  /* não passa por baixo do × */
}
.modal__apoio {
  font-family: var(--fonte-texto);
  font-weight: var(--peso-light);
  font-size: var(--fs-caption);
  line-height: var(--lh-normal);
  color: var(--cor-texto-suave);
  margin: 0;
}
.modal__etapa[hidden] { display: none; }

/* Caixa do calendário. A altura é generosa de propósito: com menos
   que isso o widget vira rolagem dentro de rolagem, que no celular é
   praticamente inutilizável. */
.modal__agenda { min-height: 660px; margin-top: var(--space-3); }

/* Erro de envio. Fica ao lado do botão, não no topo: a pessoa está
   olhando para onde clicou. */
.modal__erro {
  font-family: var(--fonte-texto);
  font-size: var(--fs-caption);
  color: var(--cor-erro);
  margin: var(--space-2) 0 0;
}

/* No celular a janela é a tela. Caixa flutuante em tela pequena
   briga com o teclado do aparelho: ele sobe, come metade da altura,
   e a janela centralizada fica com o campo escondido atrás dele. */
@media (max-width: 640px) {
  .modal {
    --modal-largura: 100vw;
    width: 100vw;
    max-width: 100vw;
    max-height: 100dvh;
    height: 100dvh;
    border-radius: 0;
    margin: 0;
  }
  .modal__corpo { padding: var(--space-5) var(--space-4); max-height: 100dvh; }
  .modal__agenda { min-height: 76dvh; }
}

@media (prefers-reduced-motion: reduce) {
  .modal, .modal::backdrop { transition: none; }
}
