/* =========================================================================
   SurfApp - Site publico (landing, contratacao e paginas legais)
   -------------------------------------------------------------------------
   CSS escrito a mao, sem framework e sem build: o projeto nao depende de Node.
   Nenhum @import, nenhuma webfont baixada, nenhum recurso de terceiro - a CSP
   da aplicacao e `default-src 'self'` e derrubaria qualquer um deles.

   A paleta tem origem em `config/surfapp.php` (bloco `brand.palette`), que e a
   fonte unica das cores da marca. As derivadas listadas abaixo existem so para
   dar hierarquia de interface e NAO sao cores de marca: nao use nenhuma delas
   em e-mail, grafico ou material impresso.

   Contraste, a regra que mais restringe este arquivo:
     - #4AA5A6, #C2DFDB, #ECE8DF e #A5A4A4 nunca sao cor de TEXTO. Servem para
       superficie, filete, icone e divisoria. O turquesa da marca fica em 2.9:1
       sobre branco e reprovaria em qualquer tamanho.
     - a cor de acao (link, botao, foco) e #1A828E, que da 4.54:1 sobre branco.
     - texto forte #0A2638, texto secundario #5A6E78.
     - sobre fundo escuro, branco (ou o menta apenas em corpo grande).

   Tema: a pagina publica e SEMPRE clara. Nao existe alternancia de tema aqui,
   e de proposito - a landing e cartao de visita e precisa sair igual em todo
   aparelho, inclusive quando o sistema do visitante esta em modo escuro.

   Mobile first: a base e a versao de celular e toda regra maior comeca em
   min-width. Breakpoints: 480, 768, 1024 e 1280.

   Nomes de classe: prefixo `site-` em tudo. Onde o componente aceita as duas
   grafias (`.site-card` e `.site-cartao`, por exemplo), as duas estao na mesma
   regra - a marcacao Blade pode usar qualquer uma sem quebrar o visual.
   ========================================================================= */

:root {
    /* ---- Marca (config/surfapp.php: brand.palette) ---- */
    --navy: #0A2638;
    --teal-deep: #1A828E;   /* cor de acao: unica da marca aprovada para texto */
    --teal: #4AA5A6;        /* superficie, icone, filete - nunca texto */
    --mint: #C2DFDB;        /* painel de apoio, divisoria - nunca texto */
    --sand: #ECE8DF;        /* fundo de pagina - nunca fundo de cartao */
    --gray: #A5A4A4;        /* desabilitado, apoio grafico - nunca texto */

    /* ---- Derivadas de interface (nao sao cores de marca) ---- */
    --turquesa-fundo: #E7F2F1;
    --turquesa-escuro: #2F7F86;
    --pagina: #F6F3EC;
    --linha: #E3DED3;
    --linha-forte: #D5CFC3;
    --superficie: #FFFFFF;

    --tinta: #16303F;
    /* Texto secundario. Escurecido de #5A6E78 para #4E606A depois de medir a
       pagina renderizada: sobre o branco do cartao o valor antigo passava, mas
       sobre as faixas tingidas pelo gradiente turquesa do hero ele caia para
       3.82:1 e reprovava AA. Este passa em todas as superficies claras do site
       (5.9:1 sobre --pagina, 4.9:1 no ponto mais tingido do hero). */
    --tinta-media: #4E606A;
    --tinta-fraca: #8B9AA2;  /* apoio grafico e divisoria; nao usar em texto */

    --sucesso: #2E8B6A;
    --alerta: #C08A3E;
    --erro: #C0503F;

    /* Pares fundo/texto dos estados. O texto de cada par ja vem escurecido o
       bastante para passar em AA sobre o proprio fundo. */
    --sucesso-fundo: #DFF0E8;
    --sucesso-texto: #1F6B4E;
    --alerta-fundo: #FBF0DC;
    --alerta-texto: #8A5F14;
    --erro-fundo: #F9E6E3;
    --erro-texto: #9C2B2B;
    --info-fundo: #E7F2F1;
    --info-texto: #1F5F66;

    /* Acao. `--acao-forte` e o mesmo turquesa profundo escurecido: #1A828E
       cumpre AA sobre branco (4.54:1), mas cai para 4.1:1 sobre a areia e o
       turquesa-fundo. Onde o texto pequeno assenta em faixa tingida - olho de
       secao, link dentro de painel claro, hover - entra a versao forte, que
       fica acima de 6:1 em todos esses fundos. */
    --acao: #1A828E;
    --acao-forte: #14646E;

    /* ---- Forma ---- */
    /* A ONDA COMO LINHA.

       A página separa seções com uma curva (`.site-onda`); estes dois tokens
       levam a mesma curva para as linhas finas — a trilha de etapas do
       cadastro, a que liga os cinco passos de "Do cadastro à primeira venda" e
       todo `<hr>`. Antes cada um desses lugares desenhava um risco reto, que é
       a única forma que a marca não usa em lugar nenhum.

       São MÁSCARAS, e não imagens de fundo: assim quem pinta continua sendo o
       token de cor de cada lugar (`--linha`, `--linha-forte`), e a paleta segue
       com uma definição só. O `%23fff` é o traço da máscara, não uma cor da
       página — em máscara o que importa é opaco contra transparente.

       Um PERÍODO INTEIRO em cada bloco (32px de comprimento por 8px de faixa):
       as tangentes das duas pontas coincidem e a repetição emenda sem bico. Com
       meio período, cada emenda viraria um "V". A proporção é larga e rasa como
       a do divisor de seção; um período curto vira zigue-zague e lê como
       tracejado, não como água. */
    --onda-linha-h: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 8' preserveAspectRatio='none'%3E%3Cpath d='M0,4 Q8,1.4 16,4 T32,4' fill='none' stroke='%23fff' stroke-width='1.6' stroke-linecap='round'/%3E%3C/svg%3E");
    --onda-linha-v: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 32' preserveAspectRatio='none'%3E%3Cpath d='M4,0 Q1.4,8 4,16 T4,32' fill='none' stroke='%23fff' stroke-width='1.6' stroke-linecap='round'/%3E%3C/svg%3E");

    --raio-sm: 9px;
    --raio: 14px;
    --raio-lg: 16px;
    --raio-pill: 999px;

    /* ---- Sombra: sempre a tinta da marca, nunca preto puro ---- */
    --sombra-sm: 0 1px 2px rgba(10, 38, 56, .06);
    --sombra: 0 1px 2px rgba(10, 38, 56, .05), 0 8px 24px rgba(10, 38, 56, .08);
    --sombra-lg: 0 12px 40px rgba(10, 38, 56, .14);
    --sombra-foco: 0 0 0 3px rgba(26, 130, 142, .16);

    /* ---- Espacamento (4/8/12/16/24/32/48/64/96) ---- */
    --esp-1: 4px;
    --esp-2: 8px;
    --esp-3: 12px;
    --esp-4: 16px;
    --esp-5: 24px;
    --esp-6: 32px;
    --esp-7: 48px;
    --esp-8: 64px;
    --esp-9: 96px;

    /* ---- Tipografia. Sem @font-face: se Montserrat e Open Sans nao estiverem
            instaladas, a pilha do sistema assume e nada e baixado. ---- */
    --fonte-titulo: 'Montserrat', system-ui, -apple-system, "Segoe UI", Roboto, sans-serif;
    --fonte-corpo: 'Open Sans', system-ui, -apple-system, "Segoe UI", Roboto, sans-serif;

    /* ---- Medidas ---- */
    --maxw: 1140px;
    --altura-header: 62px;
    --toque: 44px;
}

@media (min-width: 1024px) {
    :root {
        --altura-header: 74px;
    }
}

/* =========================================================================
   Reset e base
   ========================================================================= */

*,
*::before,
*::after {
    box-sizing: border-box;
}

html {
    -webkit-text-size-adjust: 100%;
    scroll-behavior: smooth;
    /* O cabecalho e fixo: sem esta folga a ancora joga o titulo da secao para
       debaixo dele. */
    scroll-padding-top: calc(var(--altura-header) + var(--esp-4));
}

body {
    margin: 0;
    /* O cabecalho fixo sai do fluxo; a folga aqui evita que o hero comece
       escondido atras dele. */
    padding-top: var(--altura-header);
    background: var(--pagina);
    color: var(--tinta);
    font-family: var(--fonte-corpo);
    font-size: 1rem;
    line-height: 1.6;
    /* Nenhum filho pode empurrar a pagina para os lados no celular. */
    overflow-x: hidden;
}

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

h1, h2, h3, h4, h5, h6 {
    margin: 0 0 var(--esp-3);
    font-family: var(--fonte-titulo);
    color: var(--navy);
    line-height: 1.2;
    font-weight: 700;
    /* Palavra longa em tela de 320px quebra em vez de estourar a largura. */
    overflow-wrap: break-word;
}

h1 { font-size: clamp(2rem, 6.4vw, 3.5rem); letter-spacing: -.02em; }
h2 { font-size: clamp(1.5rem, 4.2vw, 2rem); letter-spacing: -.01em; }
h3 { font-size: clamp(1.15rem, 2.6vw, 1.375rem); }
h4 { font-size: 1.0625rem; }

p {
    margin: 0 0 var(--esp-4);
}

p:last-child {
    margin-bottom: 0;
}

a {
    color: var(--acao);
    text-decoration: none;
}

a:hover {
    color: var(--acao-forte);
    text-decoration: underline;
}

ul, ol {
    margin: 0 0 var(--esp-4);
    padding-left: 1.25rem;
}

strong, b {
    font-weight: 700;
    color: var(--navy);
}

/* O separador do corpo de texto também ondula. É a mesma curva do divisor de
   seção, na espessura de uma linha: onde a página respira, ela respira com a
   forma da marca.

   O `<hr>` continua sendo `<hr>` — separador é significado, não desenho, e
   quem usa leitor de tela ouve a mudança de assunto do mesmo jeito. O que
   muda é só a pintura: a borda dá lugar a uma faixa de 8px recortada pela
   máscara, e `--linha` continua sendo quem escolhe a cor. */
hr {
    border: 0;
    height: 8px;
    margin: var(--esp-6) 0;
    background: var(--linha-forte);
    -webkit-mask-image: var(--onda-linha-h);
    mask-image: var(--onda-linha-h);
    -webkit-mask-repeat: repeat-x;
    mask-repeat: repeat-x;
    -webkit-mask-size: 32px 8px;
    mask-size: 32px 8px;
    -webkit-mask-position: left center;
    mask-position: left center;
}

@supports not ((-webkit-mask-image: none) or (mask-image: none)) {
    hr {
        height: 0;
        border-top: 1px solid var(--linha);
        background: none;
    }
}

button {
    font-family: inherit;
}

/* Foco visivel unico em toda a pagina. Fica de fora do bloco de transicoes de
   proposito: indicacao de foco nunca deve depender de animacao. */
:focus-visible {
    outline: 3px solid #1A828E;
    outline-offset: 2px;
    border-radius: var(--raio-sm);
}

/* Navegadores que ainda nao entendem :focus-visible nao podem ficar sem foco. */
:focus:not(:focus-visible) {
    outline: none;
}

::selection {
    background: var(--mint);
    color: var(--navy);
}

/* =========================================================================
   Utilitarios
   ========================================================================= */

.site-sr-only {
    position: absolute;
    width: 1px;
    height: 1px;
    padding: 0;
    margin: -1px;
    overflow: hidden;
    clip: rect(0, 0, 0, 0);
    white-space: nowrap;
    border: 0;
}

/* Atalho para o conteudo: so aparece quando recebe foco pelo teclado. */
.site-skip {
    position: absolute;
    left: var(--esp-4);
    top: -100px;
    z-index: 100;
    background: var(--navy);
    color: #fff;
    padding: var(--esp-3) var(--esp-4);
    border-radius: var(--raio-sm);
    font-weight: 700;
}

.site-skip:focus {
    top: var(--esp-3);
    color: #fff;
    text-decoration: none;
}

.site-apoio { color: var(--tinta-media); }
.site-centro { text-align: center; }
.site-nowrap { white-space: nowrap; }
.site-meta { font-size: .875rem; color: var(--tinta-media); }

/* =========================================================================
   Estrutura: container, secao, olho de secao e titulo com filete
   ========================================================================= */

.site-container {
    width: 100%;
    max-width: var(--maxw);
    margin-inline: auto;
    padding-inline: var(--esp-4);
}

@media (min-width: 768px) {
    .site-container { padding-inline: var(--esp-5); }
}

@media (min-width: 1024px) {
    .site-container { padding-inline: var(--esp-6); }
}

.site-secao,
.site-section {
    padding-block: var(--esp-7);
}

@media (min-width: 768px) {
    .site-secao,
    .site-section { padding-block: var(--esp-8); }
}

@media (min-width: 1280px) {
    .site-secao,
    .site-section { padding-block: var(--esp-9); }
}

/* Faixas alternadas. O branco e o fundo de leitura; a areia separa blocos sem
   introduzir uma linha dura. */
.site-secao--clara { background: var(--superficie); }
.site-secao--areia { background: var(--pagina); }
.site-secao--menta { background: var(--turquesa-fundo); }

.site-secao--escura {
    background: linear-gradient(160deg, #0A2638 0%, #14435A 100%);
    color: rgba(255, 255, 255, .86);
}

.site-secao--escura h2,
.site-secao--escura h3,
.site-secao--escura strong {
    color: #fff;
}

/* Sobre fundo escuro o texto e sempre branco. O menta da marca fica reservado
   ao grafismo: como cor de texto ele nao esta liberado em nenhum tamanho. */
.site-secao--escura a {
    color: #fff;
    text-decoration: underline;
}

.site-secao--escura .site-apoio,
.site-secao--escura .site-meta {
    color: rgba(255, 255, 255, .78);
}

/* Cabecalho da secao */
.site-secao__cabecalho {
    max-width: 62ch;
    margin-bottom: var(--esp-6);
}

.site-secao__cabecalho--centro {
    margin-inline: auto;
    text-align: center;
}

.site-secao__cabecalho--centro .site-titulo::after {
    margin-inline: auto;
}

.site-secao__apoio {
    margin: var(--esp-3) 0 0;
    color: var(--tinta-media);
    font-size: 1.0625rem;
}

.site-secao--escura .site-secao__apoio {
    color: rgba(255, 255, 255, .8);
}

/* Olho (eyebrow): 12px, caixa alta, entressacada. Usa a acao forte porque
   texto pequeno em faixa tingida nao alcanca AA com #1A828E. */
.site-eyebrow {
    display: block;
    margin: 0 0 var(--esp-2);
    font-family: var(--fonte-titulo);
    font-size: .75rem;
    font-weight: 700;
    line-height: 1.4;
    letter-spacing: .18em;
    text-transform: uppercase;
    color: var(--acao-forte);
}

.site-secao--escura .site-eyebrow {
    color: rgba(255, 255, 255, .84);
}

/* Titulo de secao com filete. O filete usa o turquesa da marca - e elemento
   grafico, nao texto, entao a restricao de contraste nao se aplica. */
.site-titulo,
.site-title {
    margin: 0;
}

.site-titulo::after,
.site-title::after {
    content: '';
    display: block;
    width: 56px;
    height: 4px;
    margin-top: var(--esp-4);
    border-radius: var(--raio-pill);
    background: linear-gradient(90deg, var(--teal) 0%, var(--acao) 100%);
}

.site-secao--escura .site-titulo::after,
.site-secao--escura .site-title::after {
    background: linear-gradient(90deg, var(--mint) 0%, var(--teal) 100%);
}

/* =========================================================================
   Cabecalho fixo e navegacao
   ========================================================================= */

.site-header {
    position: fixed;
    top: 0;
    left: 0;
    right: 0;
    z-index: 50;
    /* Translucido com desfoque: o conteudo passa por baixo sem sumir e o texto
       do cabecalho continua legivel. */
    background: rgba(255, 255, 255, .86);
    -webkit-backdrop-filter: saturate(180%) blur(12px);
    backdrop-filter: saturate(180%) blur(12px);
    border-bottom: 1px solid rgba(10, 38, 56, .08);
}

/* Sem desfoque o fundo precisa ser opaco, senao o texto se mistura ao da
   pagina rolando por tras. */
@supports not ((backdrop-filter: blur(1px)) or (-webkit-backdrop-filter: blur(1px))) {
    .site-header { background: var(--superficie); }
}

.site-header.is-rolado {
    box-shadow: var(--sombra-sm);
}

.site-header__inner {
    max-width: var(--maxw);
    margin-inline: auto;
    min-height: var(--altura-header);
    padding: var(--esp-2) var(--esp-4);
    display: flex;
    align-items: center;
    gap: var(--esp-3);
}

@media (min-width: 768px) {
    .site-header__inner { padding-inline: var(--esp-5); gap: var(--esp-4); }
}

@media (min-width: 1024px) {
    .site-header__inner { padding-inline: var(--esp-6); }
}

.site-header__marca {
    display: inline-flex;
    align-items: center;
    flex: 0 0 auto;
    min-width: 0;
    min-height: var(--toque);
}

.site-header__marca:hover {
    text-decoration: none;
}

/* Altura fixa e largura livre: a logomarca nunca estica nem e cortada. */
.site-logo {
    height: 34px;
    width: auto;
    max-width: 190px;
    object-fit: contain;
    display: block;
}

@media (min-width: 1024px) {
    .site-logo { height: 40px; max-width: 230px; }
}

.site-header__acoes {
    margin-left: auto;
    display: flex;
    align-items: center;
    gap: var(--esp-2);
    flex: 0 0 auto;
}

/* Navegacao horizontal: existe a partir de 1024px. Abaixo disso quem manda e
   o menu de celular. */
.site-nav {
    display: none;
}

.site-nav__lista {
    display: flex;
    align-items: center;
    gap: var(--esp-1);
    list-style: none;
    margin: 0;
    padding: 0;
}

.site-nav__link {
    display: inline-flex;
    align-items: center;
    min-height: var(--toque);
    padding: var(--esp-2) var(--esp-3);
    border-radius: var(--raio-pill);
    color: var(--tinta);
    font-size: .9375rem;
    font-weight: 600;
    white-space: nowrap;
    transition: background-color .15s ease, color .15s ease;
}

.site-nav__link:hover,
.site-nav__link:focus-visible {
    background: var(--turquesa-fundo);
    color: var(--acao-forte);
    text-decoration: none;
}

.site-nav__link.is-ativo {
    color: var(--acao-forte);
    background: var(--turquesa-fundo);
}

@media (min-width: 1024px) {
    .site-nav {
        display: flex;
        margin-left: auto;
    }

    .site-header__acoes { margin-left: var(--esp-4); }
}

/* =========================================================================
   As duas portas de entrada, no cabecalho de desktop
   -------------------------------------------------------------------------
   Portal do aluno e painel da escola sao dois produtos, com senhas e telas
   diferentes. Ate aqui o cabecalho tinha um "Entrar" so, que levava ao painel,
   e o Portal existia apenas numa linha do rodape: quem errava a porta era
   sempre o aluno, que e quem mais entra.

   POR QUE LINKS DE TEXTO EMPILHADOS, E NAO DOIS BOTOES LADO A LADO. A barra
   tem `--maxw` de 1140px e a navegacao ja come metade dela. Medido na pagina
   renderizada: marca (152) + menu (567) + botao (145) ja somam 864, e o par de
   portas escrito EM LINHA ocupa 268 — o conjunto passava de 1230 e o "Começar
   agora" saia da barra. Em COLUNA o mesmo par ocupa a largura do rotulo mais
   longo (~125px) e as duas linhas cabem folgadas na altura do cabecalho (74px
   a partir de 1024). Sobra e coluna; falta e largura.

   Encurtar os rotulos resolveria a conta e destruiria o motivo: "Entrar" e
   "Portal" sozinhos sao exatamente a ambiguidade que fez o aluno bater na porta
   da escola. Os dois nomes ficam por extenso e visiveis sem abrir nada.

   O botao cheio continua sendo um so na barra. Tres acoes do mesmo peso lado a
   lado nao vendem mais, vendem menos.
   ========================================================================= */

.site-acessos {
    display: flex;
    flex-direction: column;
    align-items: flex-start;
    justify-content: center;
    gap: 2px;
}

/* Sem `--toque` aqui, e e a unica excecao a essa regra no arquivo: dois alvos
   de 44px empilhados dao 88px e nao cabem nos 74px do cabecalho. Vale porque
   este bloco so existe a partir de 1024px, onde quem aponta e um mouse; no
   celular as mesmas duas portas aparecem no painel do menu, com area de toque
   inteira (`.site-acesso`). */
.site-acessos__link {
    display: inline-flex;
    align-items: center;
    padding-block: 3px;
    color: var(--tinta);
    font-family: var(--fonte-titulo);
    font-size: .8125rem;
    font-weight: 700;
    line-height: 1.25;
    white-space: nowrap;
    transition: color .15s ease;
}

.site-acessos__link:hover,
.site-acessos__link:focus-visible {
    color: var(--acao-forte);
    text-decoration: underline;
    text-underline-offset: 3px;
}

/* Filete separando as duas portas, desenhado no proprio link: um <span>
   separador na marcacao seria um no sem conteudo, lido por leitor de tela como
   um item a mais da lista de links. `--linha-forte` porque e divisoria, nao
   texto. */
.site-acessos__link + .site-acessos__link {
    border-top: 1px solid var(--linha);
    padding-top: var(--esp-1);
    margin-top: 1px;
}

/* Entre 1024 e 1279 a barra e o lugar mais apertado do site: nav completa,
   duas portas e o botao dentro de uma largura que ainda nao chegou aos 1140px.
   Os itens do menu e a propria barra cedem respiro lateral — e o que sobra sem
   tirar palavra nenhuma da tela. A partir de 1280 tudo volta ao normal. */
@media (min-width: 1024px) and (max-width: 1279.98px) {
    .site-header__inner { padding-inline: var(--esp-4); }

    .site-nav__link {
        padding-inline: var(--esp-2);
        font-size: .875rem;
    }

    .site-header__acoes { margin-left: var(--esp-3); }
}

/* =========================================================================
   Menu de celular
   -------------------------------------------------------------------------
   Feito com <details>/<summary>: abre e fecha sem uma linha de JavaScript,
   ja e anunciado pelo leitor de tela e continua funcionando se algum script
   da pagina falhar. Se a marcacao preferir o botao com aria-expanded, a
   classe `.is-aberto` no painel produz o mesmo resultado.
   ========================================================================= */

.site-menu {
    position: relative;
    flex: 0 0 auto;
}

.site-menu__botao {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    gap: var(--esp-2);
    min-width: var(--toque);
    min-height: var(--toque);
    padding: var(--esp-2) var(--esp-3);
    border: 1px solid var(--linha-forte);
    border-radius: var(--raio-sm);
    background: var(--superficie);
    color: var(--navy);
    font-family: var(--fonte-titulo);
    font-size: .8125rem;
    font-weight: 700;
    letter-spacing: .04em;
    text-transform: uppercase;
    cursor: pointer;
    list-style: none;
}

/* O triangulo padrao do <summary> nao cabe no desenho do cabecalho. */
.site-menu__botao::-webkit-details-marker { display: none; }
.site-menu__botao::marker { content: ''; }

/* Tres tracos desenhados em CSS - um icone a menos para carregar. */
.site-menu__icone {
    position: relative;
    width: 18px;
    height: 2px;
    border-radius: var(--raio-pill);
    background: var(--navy);
    flex: 0 0 auto;
}

.site-menu__icone::before,
.site-menu__icone::after {
    content: '';
    position: absolute;
    left: 0;
    width: 18px;
    height: 2px;
    border-radius: var(--raio-pill);
    background: var(--navy);
}

.site-menu__icone::before { top: -6px; }
.site-menu__icone::after { top: 6px; }

.site-menu[open] .site-menu__icone { background: transparent; }
.site-menu[open] .site-menu__icone::before { top: 0; transform: rotate(45deg); }
.site-menu[open] .site-menu__icone::after { top: 0; transform: rotate(-45deg); }

.site-menu__painel {
    position: absolute;
    right: 0;
    top: calc(100% + var(--esp-3));
    z-index: 60;
    /* Largura travada na viewport: em 320px o painel nao pode furar a lateral. */
    width: max-content;
    min-width: 232px;
    max-width: calc(100vw - var(--esp-6));
    padding: var(--esp-3);
    background: var(--superficie);
    border: 1px solid var(--linha);
    border-radius: var(--raio);
    box-shadow: var(--sombra-lg);
}

.site-menu__painel .site-nav__lista,
.site-menu__lista {
    display: flex;
    flex-direction: column;
    align-items: stretch;
    gap: var(--esp-1);
    list-style: none;
    margin: 0;
    padding: 0;
}

.site-menu__painel .site-nav__link {
    justify-content: flex-start;
    border-radius: var(--raio-sm);
}

.site-menu__painel .site-btn {
    width: 100%;
    margin-top: var(--esp-2);
}

/* Alternativa por JavaScript minimo: painel escondido ate ganhar `.is-aberto`. */
.site-menu__painel[hidden] { display: none; }
.site-menu__painel.is-aberto { display: block; }

/* ---- As duas portas dentro do painel de celular ----

   No celular ha espaco vertical de sobra, e por isso aqui cada porta ganha o
   que nao cabe no cabecalho de desktop: um icone e uma linha dizendo o que ha
   do outro lado. "Portal do aluno" e "Entrar como escola" sao rotulos claros,
   mas quem nunca entrou nao sabe qual dos dois e o seu — e a tentativa de
   login na porta errada e um erro que so aparece depois da senha digitada.

   O rotulo do grupo ("Já usa o SurfApp?") separa quem VOLTA de quem esta
   chegando: abaixo dele estao as duas entradas, e o "Começar agora" continua
   como o unico botao cheio do painel. */
.site-menu__rotulo {
    margin: var(--esp-4) 0 var(--esp-2);
    padding-top: var(--esp-3);
    border-top: 1px solid var(--linha);
    font-family: var(--fonte-titulo);
    font-size: .6875rem;
    font-weight: 700;
    letter-spacing: .12em;
    text-transform: uppercase;
    color: var(--tinta-media);
}

.site-acesso {
    display: flex;
    align-items: flex-start;
    gap: var(--esp-3);
    min-height: var(--toque);
    padding: var(--esp-2) var(--esp-3);
    border-radius: var(--raio-sm);
    color: var(--tinta);
    transition: background-color .15s ease;
}

.site-acesso:hover,
.site-acesso:focus-visible {
    background: var(--turquesa-fundo);
    text-decoration: none;
}

.site-acesso__corpo {
    display: block;
    min-width: 0;
}

.site-acesso__titulo {
    display: block;
    font-family: var(--fonte-titulo);
    font-size: .9375rem;
    font-weight: 700;
    color: var(--navy);
}

/* A linha de apoio e informacao, nao decoracao: `--tinta-media` passa em AA
   sobre o branco do painel e sobre o turquesa claro do hover. */
.site-acesso__apoio {
    display: block;
    font-size: .8125rem;
    line-height: 1.35;
    color: var(--tinta-media);
}

@media (min-width: 1024px) {
    .site-menu { display: none; }
}

/* =========================================================================
   Botoes
   -------------------------------------------------------------------------
   Uma acao primaria por secao. As demais entram como secundaria ou fantasma,
   para o olho nao ter duas ofertas do mesmo peso na mesma tela.
   ========================================================================= */

.site-btn {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    gap: var(--esp-2);
    min-height: var(--toque);
    padding: var(--esp-3) var(--esp-5);
    border: 1.5px solid transparent;
    border-radius: var(--raio-pill);
    font-family: var(--fonte-titulo);
    font-size: .9375rem;
    font-weight: 700;
    line-height: 1.25;
    text-align: center;
    text-decoration: none;
    cursor: pointer;
    transition: background-color .15s ease, border-color .15s ease, color .15s ease, box-shadow .15s ease;
}

.site-btn:hover {
    text-decoration: none;
}

.site-btn:disabled,
.site-btn.is-desabilitado {
    /* O cinza da marca so entra como apoio grafico: a borda e o rotulo
       continuam legiveis, o que muda e a saturacao. */
    background: #EFEDE8;
    border-color: var(--gray);
    color: var(--tinta-media);
    cursor: not-allowed;
    box-shadow: none;
}

/* BOTAO OCUPADO: o envio saiu e a resposta ainda nao voltou.

   Existe porque o cadastro da landing passou a enviar por `fetch`: sem recarga
   de pagina, o unico sinal de que algo esta acontecendo e o proprio botao. O
   `disabled` acima ja tira a cor e barra o segundo clique; o que faltava era
   dizer que o pedido esta EM CURSO, e nao que o botao morreu.

   Disco em `::before`, e nao um <span> na marcacao: o script troca o
   `textContent` do botao para "Criando sua escola…" e apagaria qualquer filho
   escrito no HTML — a marca giratoria sumiria exatamente no estado em que ela
   existe para aparecer.

   `currentColor` com o topo transparente: o disco herda a cor do rotulo, entao
   funciona igual no botao primario (texto branco) e no fantasma (texto navy),
   sem uma variante de cor por tipo de botao. */
.site-btn.is-ocupado::before {
    content: '';
    flex: 0 0 auto;
    width: 16px;
    height: 16px;
    border: 2px solid currentColor;
    border-top-color: transparent;
    border-radius: 50%;
    animation: site-girar .7s linear infinite;
}

@keyframes site-girar {
    to { transform: rotate(360deg); }
}

/* Quem pediu menos movimento fica com o disco parado — que continua sendo um
   sinal visivel de "espere", so que sem rotacao. Sumir com ele deixaria essa
   pessoa sem nenhuma marca de espera alem do rotulo. */
@media (prefers-reduced-motion: reduce) {
    .site-btn.is-ocupado::before { animation: none; }
}

.site-btn--primario {
    background: var(--acao);
    color: #fff;
    box-shadow: 0 6px 18px rgba(10, 38, 56, .12);
}

.site-btn--primario:hover:not(:disabled) {
    background: var(--acao-forte);
    color: #fff;
}

.site-btn--secundario {
    background: var(--navy);
    color: #fff;
}

.site-btn--secundario:hover:not(:disabled) {
    background: #14435A;
    color: #fff;
}

.site-btn--fantasma {
    background: transparent;
    border-color: var(--linha-forte);
    color: var(--navy);
}

.site-btn--fantasma:hover:not(:disabled) {
    background: var(--turquesa-fundo);
    border-color: var(--teal);
    color: var(--acao-forte);
}

/* Sobre a faixa escura o fantasma inverte, senao some no fundo. */
.site-secao--escura .site-btn--fantasma,
.site-btn--fantasma-claro {
    border-color: rgba(255, 255, 255, .5);
    color: #fff;
}

.site-secao--escura .site-btn--fantasma:hover:not(:disabled),
.site-btn--fantasma-claro:hover:not(:disabled) {
    background: rgba(255, 255, 255, .12);
    border-color: #fff;
    color: #fff;
}

.site-btn--pequeno {
    min-height: var(--toque);
    padding: var(--esp-2) var(--esp-4);
    font-size: .875rem;
}

.site-btn--grande {
    min-height: 52px;
    padding: var(--esp-4) var(--esp-6);
    font-size: 1.0625rem;
}

.site-btn--bloco {
    display: flex;
    width: 100%;
}

.site-btn-grupo {
    display: flex;
    flex-wrap: wrap;
    gap: var(--esp-3);
}

/* Em 320px dois botoes lado a lado ficam apertados; empilha e ocupa a largura. */
@media (max-width: 479px) {
    .site-btn-grupo { flex-direction: column; align-items: stretch; }
    .site-btn-grupo > .site-btn { width: 100%; }
}

/* =========================================================================
   Hero
   ========================================================================= */

.site-hero {
    position: relative;
    overflow: hidden;
    padding-block: var(--esp-7) var(--esp-8);
    /* O pico do turquesa foi de .26 para .18 pelo mesmo motivo do
       --tinta-media: o tingimento escurecia o fundo justamente sob o texto de
       apoio do hero. O movimento continua visivel; o que saiu foi a parte que
       so atrapalhava a leitura. */
    background:
        radial-gradient(760px 420px at 88% -12%, rgba(74, 165, 166, .18) 0%, rgba(74, 165, 166, 0) 62%),
        radial-gradient(620px 380px at -10% 110%, rgba(194, 223, 219, .30) 0%, rgba(194, 223, 219, 0) 66%),
        linear-gradient(180deg, #FFFFFF 0%, var(--pagina) 100%);
}

@media (min-width: 1024px) {
    .site-hero { padding-block: var(--esp-8) var(--esp-9); }
}

.site-hero__inner {
    display: grid;
    grid-template-columns: 1fr;
    gap: var(--esp-6);
    align-items: center;
}

@media (min-width: 1024px) {
    .site-hero__inner {
        grid-template-columns: minmax(0, 1.15fr) minmax(0, .85fr);
        gap: var(--esp-7);
    }
}

.site-hero__conteudo {
    min-width: 0;
}

.site-hero__titulo {
    margin: 0 0 var(--esp-4);
    /* 48-56px no desktop, 32px no celular: cabe em 320px sem estourar. */
    font-size: clamp(2rem, 6.4vw, 3.5rem);
    letter-spacing: -.02em;
    line-height: 1.08;
    color: var(--navy);
}

.site-hero__apoio {
    margin: 0 0 var(--esp-6);
    max-width: 54ch;
    font-size: 1.0625rem;
    color: var(--tinta-media);
}

@media (min-width: 768px) {
    .site-hero__apoio { font-size: 1.125rem; }
}

.site-hero__acoes {
    display: flex;
    flex-wrap: wrap;
    gap: var(--esp-3);
}

@media (max-width: 479px) {
    .site-hero__acoes { flex-direction: column; align-items: stretch; }
    .site-hero__acoes > .site-btn { width: 100%; }
}

/* A ALTERNATIVA COMERCIAL, logo abaixo dos dois botoes do hero.

   Quem cobra por fora (maquininha propria, Pix da escola) le "seus alunos pagam
   pelo SurfApp" na primeira tela e conclui que a plataforma nao serve para ela.
   Esta linha e o que segura essa saida — e por isso ela precisa estar aqui em
   cima, e nao so na secao de preco.

   Tamanho e cor de apoio, e o link em `--acao-forte`: e uma saida lateral, nao
   uma terceira oferta. Um botao aqui competiria com o "Começar agora" que esta
   dois centimetros acima, e a acao primaria do hero e uma so. */
.site-hero__alternativa {
    margin: var(--esp-4) 0 0;
    max-width: 52ch;
    font-size: .875rem;
    line-height: 1.5;
    color: var(--tinta-media);
}

.site-hero__alternativa a {
    color: var(--acao-forte);
    font-weight: 700;
    text-decoration: underline;
    text-underline-offset: 3px;
    white-space: nowrap;
}

.site-hero__nota {
    margin: var(--esp-4) 0 0;
    font-size: .875rem;
    color: var(--tinta-media);
}

/* Composicao visual: onda de gradiente com o simbolo da marca ao centro.
   Nada de captura de tela inventada - so a paleta e a marca real. */
.site-hero__arte {
    position: relative;
    display: grid;
    place-items: center;
    min-width: 0;
    aspect-ratio: 4 / 3;
    border-radius: var(--raio-lg);
    background:
        radial-gradient(circle at 30% 25%, rgba(255, 255, 255, .55) 0%, rgba(255, 255, 255, 0) 55%),
        linear-gradient(150deg, var(--mint) 0%, var(--teal) 58%, var(--turquesa-escuro) 100%);
    box-shadow: var(--sombra-lg);
    overflow: hidden;
}

.site-hero__arte::after {
    /* Arco de espuma: da movimento sem competir com o texto. */
    content: '';
    position: absolute;
    left: -18%;
    bottom: -46%;
    width: 136%;
    aspect-ratio: 1;
    border-radius: 50%;
    background: rgba(255, 255, 255, .22);
    pointer-events: none;
}

.site-hero__arte img {
    position: relative;
    z-index: 1;
    width: 58%;
    max-width: 240px;
    height: auto;
    object-fit: contain;
}

/* Selos de confianca abaixo do hero. */
.site-hero__selos {
    display: flex;
    flex-wrap: wrap;
    gap: var(--esp-3) var(--esp-5);
    margin-top: var(--esp-6);
    padding: 0;
    list-style: none;
    font-size: .875rem;
    color: var(--tinta-media);
}

.site-hero__selos li {
    display: flex;
    align-items: center;
    gap: var(--esp-2);
    min-width: 0;
}

.site-hero__selos li::before {
    content: '';
    flex: 0 0 auto;
    width: 8px;
    height: 8px;
    border-radius: 50%;
    background: var(--teal);
}

/* =========================================================================
   Grades e cartoes
   ========================================================================= */

.site-grid {
    display: grid;
    grid-template-columns: 1fr;
    gap: var(--esp-4);
}

/* `min-width: 0` em todo filho de grade e de flex: sem isso um texto longo ou
   uma tabela dentro da celula empurra a coluna e a pagina ganha rolagem
   horizontal - justamente o que nao pode acontecer em 320px. */
.site-grid > *,
.site-hero__inner > *,
.site-planos > *,
.site-passos > *,
.site-form__grid > *,
.site-footer__inner > * {
    min-width: 0;
}

@media (min-width: 480px) {
    .site-grid--2 { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}

@media (min-width: 768px) {
    .site-grid { gap: var(--esp-5); }
    .site-grid--3 { grid-template-columns: repeat(2, minmax(0, 1fr)); }
    .site-grid--4 { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}

@media (min-width: 1024px) {
    .site-grid--3 { grid-template-columns: repeat(3, minmax(0, 1fr)); }
    .site-grid--4 { grid-template-columns: repeat(4, minmax(0, 1fr)); }
}

.site-card,
.site-cartao {
    display: flex;
    flex-direction: column;
    gap: var(--esp-2);
    height: 100%;
    padding: var(--esp-5);
    /* Cartao e sempre branco: a areia e fundo de pagina e some sobre si mesma. */
    background: var(--superficie);
    border: 1px solid var(--linha);
    border-radius: var(--raio);
    box-shadow: var(--sombra-sm);
}

.site-card--realce,
.site-cartao--realce {
    border-color: var(--teal);
    box-shadow: var(--sombra);
}

.site-card--calmo,
.site-cartao--calmo {
    background: var(--turquesa-fundo);
    border-color: #CFE5E3;
    box-shadow: none;
}

.site-secao--escura .site-card,
.site-secao--escura .site-cartao {
    background: rgba(255, 255, 255, .07);
    border-color: rgba(255, 255, 255, .16);
    box-shadow: none;
    color: rgba(255, 255, 255, .86);
}

/* Icone do cartao: placa de cor com um glifo ou SVG dentro. */
.site-card__icone,
.site-cartao__icone {
    display: grid;
    place-items: center;
    width: 44px;
    height: 44px;
    margin-bottom: var(--esp-2);
    border-radius: var(--raio-sm);
    background: var(--turquesa-fundo);
    color: var(--acao-forte);
    font-size: 1.25rem;
    line-height: 1;
    flex: 0 0 auto;
}

.site-secao--escura .site-card__icone,
.site-secao--escura .site-cartao__icone {
    background: rgba(255, 255, 255, .12);
    color: #fff;
}

.site-card__titulo,
.site-cartao__titulo {
    margin: 0;
    font-size: 1.0625rem;
    font-weight: 700;
    color: var(--navy);
}

.site-secao--escura .site-card__titulo,
.site-secao--escura .site-cartao__titulo {
    color: #fff;
}

.site-card__texto,
.site-cartao__texto {
    margin: 0;
    color: var(--tinta-media);
    font-size: .9375rem;
}

.site-secao--escura .site-card__texto,
.site-secao--escura .site-cartao__texto {
    color: rgba(255, 255, 255, .8);
}

.site-card__rodape,
.site-cartao__rodape {
    margin-top: auto;
    padding-top: var(--esp-4);
}

/* =========================================================================
   Lista de itens com marcador turquesa
   -------------------------------------------------------------------------
   O marcador e um disco menta com um tique desenhado em SVG embutido (data:
   URI, permitido pela CSP). Nao ha texto na cor turquesa em nenhum ponto.
   ========================================================================= */

.site-lista,
.site-list {
    list-style: none;
    margin: 0;
    padding: 0;
    display: grid;
    gap: var(--esp-2);
}

.site-lista > li,
.site-list > li {
    position: relative;
    min-width: 0;
    padding-left: 30px;
    color: var(--tinta-media);
    font-size: .9375rem;
}

.site-lista > li::before,
.site-list > li::before {
    content: '';
    position: absolute;
    left: 0;
    top: .28em;
    width: 20px;
    height: 20px;
    border-radius: 50%;
    background-color: var(--turquesa-fundo);
    background-image: url("data:image/svg+xml;charset=UTF-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 16 16'%3E%3Cpath fill='%231A828E' d='M6.2 12.4 1.9 8.1l1.5-1.5 2.8 2.8 6.4-6.4L14.1 4.5z'/%3E%3C/svg%3E");
    background-repeat: no-repeat;
    background-position: center;
}

.site-lista--menta > li::before,
.site-list--menta > li::before {
    background-color: var(--mint);
}

.site-secao--escura .site-lista > li,
.site-secao--escura .site-list > li {
    color: rgba(255, 255, 255, .84);
}

.site-secao--escura .site-lista > li::before,
.site-secao--escura .site-list > li::before {
    background-color: rgba(255, 255, 255, .16);
    background-image: url("data:image/svg+xml;charset=UTF-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 16 16'%3E%3Cpath fill='%23C2DFDB' d='M6.2 12.4 1.9 8.1l1.5-1.5 2.8 2.8 6.4-6.4L14.1 4.5z'/%3E%3C/svg%3E");
}

/* Variante em duas colunas para listas longas de beneficios. */
@media (min-width: 768px) {
    .site-lista--duas,
    .site-list--duas {
        grid-template-columns: repeat(2, minmax(0, 1fr));
        gap: var(--esp-2) var(--esp-5);
    }
}

/* =========================================================================
   Planos
   -------------------------------------------------------------------------
   `auto-fit` com `minmax(min(100%, 280px), 1fr)`: a vitrine se acomoda a
   qualquer quantidade de planos publicos vinda do banco, de um a cinco, sem
   media query nova e sem estourar a largura em 320px.
   ========================================================================= */

.site-planos {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(min(100%, 280px), 1fr));
    gap: var(--esp-4);
    align-items: stretch;
}

@media (min-width: 768px) {
    .site-planos { gap: var(--esp-5); }
}

.site-plano,
.site-plan {
    position: relative;
    display: flex;
    flex-direction: column;
    padding: var(--esp-6) var(--esp-5) var(--esp-5);
    background: var(--superficie);
    border: 1px solid var(--linha);
    border-radius: var(--raio-lg);
    box-shadow: var(--sombra-sm);
}

/* Plano em destaque: borda na cor de acao e leve elevacao. O selo escrito
   "Mais escolhido" acompanha - a distincao nunca fica so na cor. */
.site-plano--destaque,
.site-plan--destaque {
    border: 2px solid var(--acao);
    box-shadow: var(--sombra);
}

@media (min-width: 1024px) {
    .site-plano--destaque,
    .site-plan--destaque {
        transform: translateY(-12px);
    }
}

.site-plano__badge {
    position: absolute;
    top: -13px;
    left: 50%;
    transform: translateX(-50%);
    white-space: nowrap;
    padding: var(--esp-1) var(--esp-3);
    border-radius: var(--raio-pill);
    background: var(--acao);
    color: #fff;
    font-family: var(--fonte-titulo);
    font-size: .6875rem;
    font-weight: 700;
    letter-spacing: .14em;
    text-transform: uppercase;
    line-height: 1.6;
}

.site-plano__nome {
    margin: 0;
    font-size: 1.375rem;
    color: var(--navy);
}

.site-plano__headline {
    margin: var(--esp-2) 0 0;
    color: var(--tinta-media);
    font-size: .9375rem;
    min-height: 2.8em;
}

.site-plano__preco {
    display: flex;
    align-items: baseline;
    flex-wrap: wrap;
    gap: var(--esp-1);
    margin: var(--esp-5) 0 var(--esp-1);
}

.site-plano__valor {
    font-family: var(--fonte-titulo);
    font-size: clamp(1.75rem, 5vw, 2.25rem);
    font-weight: 700;
    line-height: 1.1;
    letter-spacing: -.02em;
    color: var(--navy);
    overflow-wrap: anywhere;
}

.site-plano__ciclo {
    font-size: .875rem;
    font-weight: 600;
    color: var(--tinta-media);
}

.site-plano__nota {
    margin: 0 0 var(--esp-5);
    font-size: .8125rem;
    color: var(--tinta-media);
}

.site-plano__beneficios {
    margin: 0 0 var(--esp-5);
}

/* Limites do plano em pares rotulo/valor. */
.site-plano__limites {
    display: grid;
    grid-template-columns: repeat(2, minmax(0, 1fr));
    gap: var(--esp-3);
    margin: 0 0 var(--esp-5);
    padding: var(--esp-4);
    background: var(--pagina);
    border-radius: var(--raio-sm);
}

.site-plano__limites > div { min-width: 0; }

.site-plano__limites dt {
    font-size: .75rem;
    font-weight: 700;
    letter-spacing: .06em;
    text-transform: uppercase;
    color: var(--tinta-media);
}

.site-plano__limites dd {
    margin: 0;
    font-size: .9375rem;
    font-weight: 700;
    color: var(--navy);
    overflow-wrap: anywhere;
}

.site-plano__acao {
    margin-top: auto;
}

/* =========================================================================
   Planos — alinhamento das faixas entre os três cartões
   -------------------------------------------------------------------------
   Antes: cada cartão era um flex independente, então descrição e lista de
   benefícios de tamanhos diferentes empurravam preço, limites e botão para
   alturas distintas — a "escada" que se via na vitrine. Só o botão alinhava,
   pelo `margin-top:auto` acima.

   Agora a fileira é uma grade de 7 linhas e cada cartão adota essas mesmas
   linhas com `subgrid`: ícone, nome, headline, preço, descrição, benefícios,
   limites e ação passam a começar na mesma altura nos três, sem nenhuma
   altura fixa e sem cortar conteúdo — cada linha cresce até caber o maior.

   Fica atrás de `@supports`: onde não houver subgrid, o comportamento é
   exatamente o de antes (flex com o botão no rodapé), que já era aceitável.
   Só vale no desktop: empilhados, os cartões não têm com quem alinhar.
   ========================================================================= */

@supports (grid-template-rows: subgrid) {
    @media (min-width: 768px) {
        .site-planos {
            /* ícone · nome · headline · preço · nota · benefícios · limites · ação */
            grid-template-rows: repeat(7, auto) 1fr;
            align-items: stretch;
        }

        .site-plano,
        .site-plan {
            display: grid;
            grid-row: span 8;
            grid-template-rows: subgrid;
            /* O `gap` da grade substitui as margens que o fluxo dava entre os
               blocos; sem isto os elementos encostariam nas bordas da linha. */
            gap: var(--esp-3);
        }

        /* Dentro da grade, margem de bloco vira espaço duplicado. */
        .site-plano > *,
        .site-plan > * {
            margin-block: 0;
        }

        /* A ação ocupa a última linha, que é a única elástica (1fr): o botão
           encosta na base mesmo quando o cartão vizinho é mais alto. */
        .site-plano__acao {
            align-self: end;
            margin-top: 0;
        }
    }
}

.site-plano__acao .site-btn {
    width: 100%;
}

/* Vitrine sem nenhum plano publico: estado vazio explicito, nunca uma area em
   branco que parece pagina quebrada. */
.site-vazio {
    grid-column: 1 / -1;
    padding: var(--esp-7) var(--esp-5);
    text-align: center;
    border: 1px dashed var(--linha-forte);
    border-radius: var(--raio);
    background: var(--superficie);
    color: var(--tinta-media);
}

.site-vazio__titulo {
    margin: 0 0 var(--esp-2);
    font-weight: 700;
    color: var(--navy);
}

/* =========================================================================
   Passos numerados
   ========================================================================= */

.site-passos,
.site-steps {
    counter-reset: site-passo;
    list-style: none;
    display: grid;
    grid-template-columns: 1fr;
    gap: var(--esp-4);
    margin: 0;
    padding: 0;
}

@media (min-width: 768px) {
    .site-passos,
    .site-steps { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: var(--esp-5); }
}

@media (min-width: 1024px) {
    .site-passos--tres,
    .site-steps--tres { grid-template-columns: repeat(3, minmax(0, 1fr)); }
}

.site-passo,
.site-step {
    counter-increment: site-passo;
    position: relative;
    min-width: 0;
    padding: var(--esp-5) var(--esp-5) var(--esp-5) 74px;
    background: var(--superficie);
    border: 1px solid var(--linha);
    border-radius: var(--raio);
    box-shadow: var(--sombra-sm);
}

.site-passo::before,
.site-step::before {
    content: counter(site-passo, decimal-leading-zero);
    position: absolute;
    left: var(--esp-5);
    top: var(--esp-5);
    display: grid;
    place-items: center;
    width: 38px;
    height: 38px;
    border-radius: 50%;
    background: var(--navy);
    color: #fff;
    font-family: var(--fonte-titulo);
    font-size: .9375rem;
    font-weight: 700;
    line-height: 1;
}

/* Se a marcacao trouxer o numero escrito, o contador sai de cena para o passo
   nao aparecer numerado duas vezes. */
.site-passo:has(.site-passo__numero)::before,
.site-step:has(.site-passo__numero)::before {
    content: none;
}

.site-passo__numero {
    position: absolute;
    left: var(--esp-5);
    top: var(--esp-5);
    display: grid;
    place-items: center;
    width: 38px;
    height: 38px;
    border-radius: 50%;
    background: var(--navy);
    color: #fff;
    font-family: var(--fonte-titulo);
    font-size: .9375rem;
    font-weight: 700;
    line-height: 1;
}

.site-passo__titulo {
    margin: 0 0 var(--esp-2);
    font-size: 1.0625rem;
    color: var(--navy);
}

.site-passo__texto {
    margin: 0;
    color: var(--tinta-media);
    font-size: .9375rem;
}

/* =========================================================================
   Perguntas frequentes
   -------------------------------------------------------------------------
   <details>/<summary> nativos: abre, fecha e e anunciado sem JavaScript.
   ========================================================================= */

.site-faq {
    display: grid;
    gap: var(--esp-3);
    max-width: 820px;
}

.site-faq__item {
    background: var(--superficie);
    border: 1px solid var(--linha);
    border-radius: var(--raio);
    overflow: hidden;
}

.site-faq__item[open] {
    border-color: var(--teal);
    box-shadow: var(--sombra-sm);
}

.site-faq__pergunta {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: var(--esp-4);
    min-height: var(--toque);
    padding: var(--esp-4) var(--esp-5);
    font-family: var(--fonte-titulo);
    font-size: 1rem;
    font-weight: 700;
    color: var(--navy);
    cursor: pointer;
    list-style: none;
}

.site-faq__pergunta::-webkit-details-marker { display: none; }
.site-faq__pergunta::marker { content: ''; }

.site-faq__pergunta:hover {
    background: var(--turquesa-fundo);
}

/* O sinal de mais/menos acompanha o estado. Como o texto da pergunta ja muda
   de vizinho visual ao abrir, o icone e reforco, nao a unica pista. */
.site-faq__pergunta::after {
    content: '';
    flex: 0 0 auto;
    width: 14px;
    height: 14px;
    background: var(--acao);
    /* Cruz feita por mascara: sem imagem e sem fonte de icone. */
    -webkit-mask: linear-gradient(#000 0 0) center / 14px 2px no-repeat,
                  linear-gradient(#000 0 0) center / 2px 14px no-repeat;
    mask: linear-gradient(#000 0 0) center / 14px 2px no-repeat,
          linear-gradient(#000 0 0) center / 2px 14px no-repeat;
    transition: transform .15s ease;
}

.site-faq__item[open] .site-faq__pergunta::after {
    -webkit-mask: linear-gradient(#000 0 0) center / 14px 2px no-repeat;
    mask: linear-gradient(#000 0 0) center / 14px 2px no-repeat;
}

/* Aberta, a pergunta ganha um filete embaixo: separa visualmente a pergunta da
   resposta, que antes encostavam e liam como um parágrafo só. */
.site-faq__item[open] .site-faq__pergunta {
    border-bottom: 1px solid var(--linha);
}

.site-faq__resposta {
    /* Respiro maior que o de antes (0 esp-5 esp-5): a resposta é o conteúdo que
       a pessoa veio ler e estava colada nas bordas do cartão. */
    padding: var(--esp-4) var(--esp-5) var(--esp-5);
    color: var(--tinta-media);
    font-size: .9375rem;
    line-height: 1.65;
}

.site-faq__resposta > :last-child { margin-bottom: 0; }

/* Link dentro de uma resposta ("Conhecer planos", no fim da pergunta sobre
   receber por outros meios). Sublinhado e em negrito porque a resposta é um
   bloco de texto corrido: sem os dois, a única diferença entre o link e a
   frase seria a cor — e cor sozinha não distingue link. */
.site-faq__resposta a {
    color: var(--acao-forte);
    font-weight: 700;
    text-decoration: underline;
    text-underline-offset: 3px;
}

/* Mesma abertura discreta dos blocos de recursos. */
@media (prefers-reduced-motion: no-preference) {
    .site-faq__item[open] .site-faq__resposta {
        animation: site-recursos-abre 200ms ease-out;
    }
}

/* =========================================================================
   Formulario de cadastro
   ========================================================================= */

.site-form {
    padding: var(--esp-5);
    background: var(--superficie);
    border: 1px solid var(--linha);
    border-radius: var(--raio-lg);
    box-shadow: var(--sombra);
}

@media (min-width: 768px) {
    .site-form { padding: var(--esp-6); }
}

.site-form__bloco {
    margin-bottom: var(--esp-6);
}

.site-form__bloco:last-of-type {
    margin-bottom: var(--esp-5);
}

.site-form__legenda {
    display: block;
    width: 100%;
    margin: 0 0 var(--esp-4);
    padding: 0 0 var(--esp-3);
    border-bottom: 1px solid var(--linha);
    font-family: var(--fonte-titulo);
    font-size: .8125rem;
    font-weight: 700;
    letter-spacing: .1em;
    text-transform: uppercase;
    color: var(--acao-forte);
}

/* <fieldset> traz borda e margem proprias em todo navegador; aqui o desenho
   vem do bloco, entao o elemento entra zerado. */
.site-form fieldset {
    margin: 0;
    padding: 0;
    border: 0;
    min-width: 0;
}

.site-form__grid {
    display: grid;
    grid-template-columns: 1fr;
    gap: var(--esp-4);
}

@media (min-width: 768px) {
    .site-form__grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }
    .site-campo--largo,
    .site-field--largo { grid-column: 1 / -1; }

    /* CAMPO QUE OCUPA A LINHA SÓ QUANDO FICA SOZINHO NELA.
       "Nome do responsável" some para pessoa física (`hidden`), e o campo
       seguinte — o e-mail — ficaria com meia linha e um vazio ao lado. Com
       esta regra o e-mail assume a linha inteira exatamente nesse caso, e
       divide a linha com o nome quando ele existe.

       Vale para o par adjacente, que é o arranjo real do bloco: sem isso a
       alternativa era marcar os dois como `--largo` para sempre, gastando duas
       linhas inteiras num formulário que tem duas colunas disponíveis. */
    [hidden] + .site-campo--acompanha { grid-column: 1 / -1; }
}

.site-campo,
.site-field {
    display: flex;
    flex-direction: column;
    gap: var(--esp-2);
    min-width: 0;
}

/* O atributo `hidden` so apaga o elemento enquanto NADA declarar `display` para
   ele: o estilo do navegador perde para qualquer regra de autor. A regra logo
   acima declara `display: flex`, entao um campo marcado com `hidden` — o nome
   do responsavel, que so pessoa juridica preenche — continuaria na tela como se
   nada tivesse acontecido.

   Nao existe `[hidden] { display: none }` global nesta folha de proposito: as
   regras sao pontuais, uma por componente que realmente esconde (ver o painel
   do menu, a janela legal e os controles do hero). */
.site-campo[hidden],
.site-field[hidden] { display: none; }

.site-label {
    font-size: .875rem;
    font-weight: 700;
    color: var(--navy);
}

.site-label__opcional {
    font-weight: 400;
    color: var(--tinta-media);
}

/* O asterisco sozinho nao comunica nada a quem usa leitor de tela; a marcacao
   deve trazer `required` e o rotulo textual. Aqui ele e so reforco visual. */
.site-label__obrigatorio {
    color: var(--erro-texto);
    margin-left: 2px;
}

.site-input,
.site-select,
.site-textarea {
    width: 100%;
    max-width: 100%;
    min-height: var(--toque);
    padding: var(--esp-3) var(--esp-4);
    background: var(--superficie);
    border: 1.5px solid var(--linha-forte);
    border-radius: var(--raio-sm);
    color: var(--tinta);
    font-family: inherit;
    /* 16px exatos: abaixo disso o Safari do iPhone da zoom ao focar o campo. */
    font-size: 1rem;
    line-height: 1.4;
    appearance: none;
    transition: border-color .15s ease, box-shadow .15s ease;
}

.site-textarea {
    min-height: 110px;
    resize: vertical;
}

.site-select {
    padding-right: var(--esp-8);
    background-image: url("data:image/svg+xml;charset=UTF-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='14' height='9' viewBox='0 0 14 9'%3E%3Cpath fill='%235A6E78' d='M1.4 0 7 5.6 12.6 0 14 1.4 7 8.4 0 1.4Z'/%3E%3C/svg%3E");
    background-repeat: no-repeat;
    background-position: right var(--esp-4) center;
}

.site-input::placeholder,
.site-textarea::placeholder {
    color: var(--tinta-media);
    opacity: .75;
}

.site-input:focus,
.site-select:focus,
.site-textarea:focus {
    border-color: var(--acao);
    box-shadow: var(--sombra-foco);
}

/* Campo invalido: borda, fundo e a mensagem escrita logo abaixo. Nunca so a
   cor - a mensagem e obrigatoria. */
.site-input.is-invalido,
.site-select.is-invalido,
.site-textarea.is-invalido,
.site-input[aria-invalid="true"],
.site-select[aria-invalid="true"],
.site-textarea[aria-invalid="true"] {
    border-color: var(--erro);
    background-color: var(--erro-fundo);
}

.site-input.is-invalido:focus,
.site-input[aria-invalid="true"]:focus,
.site-select[aria-invalid="true"]:focus,
.site-textarea[aria-invalid="true"]:focus {
    border-color: var(--erro);
    box-shadow: 0 0 0 3px rgba(192, 80, 63, .18);
}

.site-campo__erro,
.site-field__erro {
    display: flex;
    align-items: flex-start;
    gap: var(--esp-1);
    font-size: .8125rem;
    font-weight: 600;
    color: var(--erro-texto);
}

.site-campo__erro::before,
.site-field__erro::before {
    content: '!';
    flex: 0 0 auto;
    display: grid;
    place-items: center;
    width: 16px;
    height: 16px;
    margin-top: 1px;
    border-radius: 50%;
    background: var(--erro-texto);
    color: #fff;
    font-size: .75rem;
    font-weight: 700;
    line-height: 1;
}

/* Mesma armadilha do `.site-campo[hidden]` logo acima: a regra de autor declara
   `display: flex` e o `hidden` do navegador perde para ela. A validacao do
   cadastro no navegador reaproveita a MESMA caixa que o Blade usa para o erro
   do servidor e a apaga com `hidden` quando o campo e corrigido; sem esta
   regra, o que sobraria na tela e o circulo vermelho do `::before`, sozinho e
   sem mensagem nenhuma ao lado. */
.site-campo__erro[hidden],
.site-field__erro[hidden] { display: none; }

.site-campo__dica,
.site-field__dica {
    font-size: .8125rem;
    color: var(--tinta-media);
}

/* ---- Escolha do plano em cartoes de radio ---- */

.site-radio-cards {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(min(100%, 220px), 1fr));
    gap: var(--esp-3);
}

.site-radio-cards > * { min-width: 0; }

.site-radio-card {
    position: relative;
    display: flex;
    align-items: flex-start;
    gap: var(--esp-3);
    min-height: var(--toque);
    padding: var(--esp-4);
    background: var(--superficie);
    border: 1.5px solid var(--linha-forte);
    border-radius: var(--raio);
    cursor: pointer;
    transition: border-color .15s ease, background-color .15s ease, box-shadow .15s ease;
}

.site-radio-card:hover {
    border-color: var(--teal);
}

.site-radio-card__input {
    flex: 0 0 auto;
    width: 20px;
    height: 20px;
    margin: 2px 0 0;
    accent-color: var(--acao);
}

.site-radio-card__corpo {
    min-width: 0;
}

.site-radio-card__nome {
    display: block;
    font-weight: 700;
    color: var(--navy);
}

.site-radio-card__preco {
    display: block;
    font-size: .875rem;
    color: var(--tinta-media);
}

/* Selecionado. As duas formas de marcacao estao cobertas: o rotulo que envolve
   o radio (`:has`) e o radio irmao do corpo (`+`). */
.site-radio-card:has(.site-radio-card__input:checked) {
    border-color: var(--acao);
    background: var(--turquesa-fundo);
    box-shadow: var(--sombra-foco);
}

.site-radio-card__input:checked + .site-radio-card__corpo .site-radio-card__nome {
    color: var(--acao-forte);
}

.site-radio-card:has(.site-radio-card__input:checked) .site-radio-card__nome {
    color: var(--acao-forte);
}

.site-radio-card:focus-within {
    outline: 3px solid #1A828E;
    outline-offset: 2px;
}

/* ---- Aceite de termos ---- */

.site-check {
    display: flex;
    align-items: flex-start;
    gap: var(--esp-3);
    min-height: var(--toque);
    padding-block: var(--esp-2);
    font-size: .9375rem;
    color: var(--tinta-media);
    cursor: pointer;
}

.site-check__input,
.site-check input[type="checkbox"] {
    flex: 0 0 auto;
    width: 20px;
    height: 20px;
    margin: 3px 0 0;
    accent-color: var(--acao);
}

.site-check__texto {
    min-width: 0;
}

.site-check a {
    font-weight: 600;
    text-decoration: underline;
}

/* Aceites e ação final na mesma faixa: marcar as duas caixas e enviar é um
   gesto só, e o botão numa faixa própria abaixo lia como um passo a mais. Os
   aceites ficam na coluna elástica, o botão encosta na borda direita do
   formulário e acompanha o rodapé da lista. A ressalva de gratuidade sai da
   linha do botão e fecha o formulário centralizada — ela informa, não age. */
.site-form__bloco--aceites fieldset {
    display: grid;
    grid-template-columns: minmax(0, 1fr) auto;
    align-items: end;
    gap: var(--esp-4);
}

/* A legenda atravessa as duas colunas: o filete dela é o mesmo dos outros
   blocos e pararia no meio da faixa se ficasse presa à coluna dos aceites. */
.site-form__bloco--aceites .site-form__legenda {
    grid-column: 1 / -1;
}

/* Abaixo disso a linha não cabe: o botão volta a ocupar a largura toda. */
@media (max-width: 639px) {
    .site-form__bloco--aceites fieldset {
        grid-template-columns: minmax(0, 1fr);
    }
}

.site-form__nota {
    max-width: 46ch;
    margin: var(--esp-4) auto 0;
    font-size: .8125rem;
    color: var(--tinta-media);
    text-align: center;
}

/* =========================================================================
   Alertas e selos
   -------------------------------------------------------------------------
   Todo estado traz rotulo escrito alem da cor: o icone e o texto do alerta
   dizem o que aconteceu mesmo para quem nao distingue as cores.
   ========================================================================= */

.site-alerta,
.site-alert {
    display: flex;
    align-items: flex-start;
    gap: var(--esp-3);
    padding: var(--esp-4);
    margin-bottom: var(--esp-5);
    border: 1px solid transparent;
    border-radius: var(--raio-sm);
    font-size: .9375rem;
}

.site-alerta__icone,
.site-alert__icone {
    flex: 0 0 auto;
    display: grid;
    place-items: center;
    width: 22px;
    height: 22px;
    border-radius: 50%;
    font-size: .8125rem;
    font-weight: 700;
    line-height: 1;
    color: #fff;
}

.site-alerta__corpo,
.site-alert__corpo {
    min-width: 0;
}

.site-alerta__titulo {
    display: block;
    margin-bottom: var(--esp-1);
    font-weight: 700;
}

.site-alerta ul,
.site-alert ul {
    margin: var(--esp-2) 0 0;
    padding-left: 1.1rem;
}

/* Link DENTRO de alerta herda a cor do proprio alerta, e nao a de acao.
   Medido: o turquesa `--acao` (#1A828E) sobre o fundo de erro (#F9E6E3) da
   3.77:1 e reprova AA, enquanto o `--erro-texto` do proprio alerta da 6.25:1.
   Como a cor deixa de distinguir o link do texto ao redor, o sublinhado passa a
   ser obrigatorio - e nao decoracao.

   Isto existe porque o resumo de erros do cadastro lista LINKS para os campos
   que falharam; cada item leva ao campo com um clique. */
.site-alerta__corpo a,
.site-alert__corpo a {
    color: inherit;
    text-decoration: underline;
    text-underline-offset: 2px;
    font-weight: 600;
}

.site-alerta__corpo a:hover,
.site-alert__corpo a:hover {
    text-decoration-thickness: 2px;
}

.site-alerta--sucesso,
.site-alert--sucesso {
    background: var(--sucesso-fundo);
    border-color: #BFE0CE;
    color: var(--sucesso-texto);
}

.site-alerta--sucesso .site-alerta__icone,
.site-alert--sucesso .site-alert__icone { background: var(--sucesso-texto); }

.site-alerta--erro,
.site-alert--erro {
    background: var(--erro-fundo);
    border-color: #EEC4BE;
    color: var(--erro-texto);
}

.site-alerta--erro .site-alerta__icone,
.site-alert--erro .site-alert__icone { background: var(--erro-texto); }

.site-alerta--alerta,
.site-alert--alerta {
    background: var(--alerta-fundo);
    border-color: #EDDCB4;
    color: var(--alerta-texto);
}

.site-alerta--alerta .site-alerta__icone,
.site-alert--alerta .site-alert__icone { background: var(--alerta-texto); }

.site-alerta--info,
.site-alert--info {
    background: var(--info-fundo);
    border-color: #CFE5E3;
    color: var(--info-texto);
}

.site-alerta--info .site-alerta__icone,
.site-alert--info .site-alert__icone { background: var(--info-texto); }

.site-alerta strong,
.site-alert strong {
    color: inherit;
}

.site-badge {
    display: inline-flex;
    align-items: center;
    gap: var(--esp-1);
    padding: var(--esp-1) var(--esp-3);
    border-radius: var(--raio-pill);
    background: var(--turquesa-fundo);
    color: var(--info-texto);
    font-family: var(--fonte-titulo);
    font-size: .6875rem;
    font-weight: 700;
    letter-spacing: .14em;
    text-transform: uppercase;
    line-height: 1.6;
    white-space: nowrap;
}

.site-badge--acao { background: var(--acao); color: #fff; }
.site-badge--navy { background: var(--navy); color: #fff; }
.site-badge--sucesso { background: var(--sucesso-fundo); color: var(--sucesso-texto); }
.site-badge--alerta { background: var(--alerta-fundo); color: var(--alerta-texto); }
.site-badge--erro { background: var(--erro-fundo); color: var(--erro-texto); }

/* =========================================================================
   Conteudo corrido (termos de uso, politica de privacidade)
   ========================================================================= */

.site-prosa {
    max-width: 76ch;
    color: var(--tinta-media);
}

.site-prosa h2 { margin-top: var(--esp-7); }
.site-prosa h3 { margin-top: var(--esp-5); }
.site-prosa h2:first-child,
.site-prosa h3:first-child { margin-top: 0; }

.site-prosa li { margin-bottom: var(--esp-2); }

.site-prosa a {
    text-decoration: underline;
}

/* =========================================================================
   Rodape
   ========================================================================= */

.site-footer {
    background: var(--navy);
    color: rgba(255, 255, 255, .78);
    padding-block: var(--esp-7) var(--esp-5);
}

.site-footer__inner {
    display: grid;
    grid-template-columns: 1fr;
    gap: var(--esp-6);
}

@media (min-width: 768px) {
    .site-footer__inner {
        grid-template-columns: minmax(0, 1.4fr) minmax(0, 1fr);
        gap: var(--esp-7);
    }
}

.site-footer__marca img {
    height: 42px;
    width: auto;
    max-width: 220px;
    object-fit: contain;
    display: block;
    margin-bottom: var(--esp-3);
}

.site-footer__texto {
    margin: 0;
    max-width: 46ch;
    font-size: .9375rem;
    color: rgba(255, 255, 255, .74);
}

.site-footer__titulo {
    margin: 0 0 var(--esp-3);
    font-family: var(--fonte-titulo);
    font-size: .75rem;
    font-weight: 700;
    letter-spacing: .18em;
    text-transform: uppercase;
    color: rgba(255, 255, 255, .72);
}

.site-footer__links {
    list-style: none;
    margin: 0;
    padding: 0;
    display: grid;
    gap: var(--esp-1);
}

.site-footer__links a {
    display: inline-flex;
    align-items: center;
    min-height: var(--toque);
    color: rgba(255, 255, 255, .82);
    font-size: .9375rem;
}

.site-footer__links a:hover {
    color: #fff;
    text-decoration: underline;
}

.site-footer__base {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    justify-content: space-between;
    gap: var(--esp-3);
    margin-top: var(--esp-6);
    padding-top: var(--esp-4);
    border-top: 1px solid rgba(255, 255, 255, .14);
    font-size: .8125rem;
    color: rgba(255, 255, 255, .68);
}

.site-footer__base a {
    color: rgba(255, 255, 255, .82);
}

/* =========================================================================
   Movimento reduzido
   -------------------------------------------------------------------------
   Quem pediu menos movimento no sistema recebe a pagina inteira parada,
   inclusive a rolagem suave das ancoras.
   ========================================================================= */

@media (prefers-reduced-motion: reduce) {
    html {
        scroll-behavior: auto;
    }

    *,
    *::before,
    *::after {
        animation: none !important;
        transition: none !important;
        scroll-behavior: auto !important;
    }
}

/* =========================================================================
   Impressao
   ========================================================================= */

@media print {
    body { padding-top: 0; background: #fff; }

    .site-header,
    .site-menu,
    .site-skip,
    #btn-criar-conta,
    .site-hero__arte { display: none !important; }

    .site-card,
    .site-cartao,
    .site-plano,
    .site-form { box-shadow: none; border-color: #CCC; }

    .site-footer { background: #fff; color: #333; }
}

/* =========================================================================
   ETAPA 2 — Enriquecimento visual da landing
   -------------------------------------------------------------------------
   Bloco acrescentado depois que a página pública já estava no ar e funcionando.
   Nada acima desta linha foi reescrito: tudo aqui é adição. Onde um componente
   antigo precisou de ajuste (plano em destaque, legenda do formulário), a regra
   nova vem depois e refina — a original continua legível no seu lugar.

   As três restrições que mandam neste bloco:

   1) Contraste AA. Texto secundário sempre em --tinta-media (#4E606A); ação e
      link em #1A828E (--acao) ou #14646E (--acao-forte) quando o fundo é
      tingido. Sobre a faixa escura, branco puro. #4AA5A6, #C2DFDB, #ECE8DF e
      #A5A4A4 continuam proibidos como cor de texto — aparecem só em filete,
      chapa de ícone e grafismo. Texto desabilitado troca de COR, nunca ganha
      `opacity`: opacidade derruba o contraste do rótulo junto com o resto.

   2) Mobile primeiro. Toda media query deste bloco começa em `min-width`. O
      estado base é o celular de 320px, e nenhum elemento novo pode empurrar a
      página para os lados: todo filho de grade e de flex leva `min-width: 0`.

   3) Movimento discreto. Transições de no máximo 420ms com `ease-out`. Hover
      que levanta o elemento só existe em ponteiro fino (mouse/trackpad) — no
      celular ele "gruda" no toque e o cartão fica levantado sem motivo.
      O bloco de `prefers-reduced-motion` no fim do arquivo desliga tudo.
   ========================================================================= */

:root {
    /* Sombra de terceiro nível: a peça que precisa parecer descolada da página
       (foto do hero, moldura de screenshot). --sombra-lg já era forte demais
       para um retângulo grande — espalha mais e escurece menos. */
    --sombra-3: 0 18px 44px rgba(10, 38, 56, .16);

    /* Curva e duração padrão das transições novas. O teto de 420ms vale para a
       revelação ao rolar; interação de interface fica bem abaixo disso. */
    --transicao: 200ms ease-out;
}

/* =========================================================================
   §2.1 Ícone — chapa quadrada com SVG de contorno dentro
   -------------------------------------------------------------------------
   O tamanho é uma variável local (--ic-tam) em vez de width/height fixos: os
   modificadores só trocam o valor da variável e o padding interno acompanha
   sozinho, mantendo a mesma proporção de respiro em 28px e em 64px. O padrão
   é 44px porque é exatamente a área mínima de toque — quando o ícone estiver
   dentro de um alvo clicável, ele já entrega o alvo inteiro.
   ========================================================================= */

.site-ic {
    --ic-tam: 44px;
    --ic-raio: 12px;
    display: inline-grid;
    place-items: center;
    flex: 0 0 auto;
    width: var(--ic-tam);
    height: var(--ic-tam);
    /* ~22% de folga de cada lado deixa o desenho de 24 do viewBox com a mesma
       área útil visual em qualquer tamanho da escala. */
    padding: calc(var(--ic-tam) * .22);
    border-radius: var(--ic-raio);
    /* Sem cor de fundo por padrão: `.site-ic` puro é ícone dentro de texto e
       herda a cor de quem o contém. As chapas são os modificadores. */
    color: inherit;
    line-height: 0;
}

.site-ic--sm { --ic-tam: 36px; --ic-raio: 10px; }
.site-ic--lg { --ic-tam: 56px; --ic-raio: 14px; }
.site-ic--xl { --ic-tam: 64px; --ic-raio: 16px; }

/* Chapas. As três cores foram escolhidas para o traço do ícone ficar acima de
   4.5:1 sobre a própria chapa — ícone não é texto, mas contorno de 1.75px é
   ainda mais frágil que uma letra e merece a mesma régua. */
.site-ic--menta { background: #E7F2F1; color: #14646E; }
.site-ic--navy  { background: rgba(10, 38, 56, .06); color: #0A2638; }
.site-ic--claro { background: rgba(255, 255, 255, .10); color: #fff; }

/* O reset do topo do arquivo impõe `height: auto` em todo SVG; aqui a classe
   ganha da regra de elemento e o desenho preenche a caixa de conteúdo. */
.site-ic__svg {
    display: block;
    width: 100%;
    height: 100%;
}

/* =========================================================================
   §2.2 Divisor de onda
   -------------------------------------------------------------------------
   O SVG é inline no Blade (a CSP não deixa buscar arquivo externo, e como
   imagem de fundo ele não herdaria a cor da seção). A regra `fill: currentColor`
   nos filhos vence o atributo `fill=` do markup de propósito: assim o divisor
   sempre pinta a cor da seção de DESTINO indicada pelo modificador, e não
   sobra chance de o Blade e o CSS discordarem. Sem modificador, o destino
   presumido é o branco de leitura.
   ========================================================================= */

.site-onda {
    display: block;
    width: 100%;
    height: 48px;
    /* O -1px come o fio de fundo que o arredondamento de subpixel deixa entre
       o fim da curva e o começo da seção seguinte. */
    margin-bottom: -1px;
    line-height: 0;
    pointer-events: none;
    color: var(--superficie);
    fill: currentColor;
}

@media (min-width: 768px) {
    .site-onda { height: 64px; }
}

@media (min-width: 1280px) {
    .site-onda { height: 80px; }
}

/* Serve tanto para `.site-onda` aplicado no próprio <svg> quanto num invólucro. */
.site-onda > svg {
    display: block;
    width: 100%;
    height: 100%;
}

.site-onda path,
.site-onda polygon {
    fill: currentColor;
}

.site-onda--para-branco { color: var(--superficie); }
.site-onda--para-areia  { color: var(--pagina); }
.site-onda--para-menta  { color: var(--turquesa-fundo); }
.site-onda--para-navy   { color: var(--navy); }


/* Onda que fecha a seção por DENTRO, colada na base. Nasceu da faixa escura:
   lá o fundo é um gradiente diagonal com foto por cima, e o invólucro de cor
   chapada que serve às outras transições deixava uma emenda na largura toda —
   o gradiente recomeça no invólucro enquanto a seção acima já terminou
   clareada. Sem fundo próprio e por dentro, o que fica acima da curva é o
   fundo real da seção, seja ele qual for.

   Ela ocupa o padding inferior da seção; por isso o respiro extra abaixo do
   conteúdo, senão a crista encosta no último cartão. */
/* A especificidade extra é necessária: `.site-beneficios > *:not(.foto)` mais
   abaixo devolve `position: relative` a todo filho direto da faixa escura. */
.site-secao > .site-onda.site-onda--dentro {
    position: absolute;
    right: 0;
    left: 0;
    z-index: 1;
    margin-bottom: 0;
    background: none;
}

.site-secao > .site-onda.site-onda--dentro-base {
    bottom: 0;
}

/* No topo a mesma curva entra espelhada: a área cheia do desenho é a de baixo,
   e ali ela precisa ficar em cima, do lado da seção que ACABOU. */
.site-secao > .site-onda.site-onda--dentro-topo {
    top: 0;
    transform: rotate(180deg);
}

/* As ondas de dentro ocupam o padding da seção; daí o respiro extra, senão a
   crista encosta no conteúdo. */
.site-secao:has(> .site-onda--dentro-base) {
    position: relative;
    padding-bottom: calc(var(--esp-7) + var(--esp-6));
}

.site-secao:has(> .site-onda--dentro-topo) {
    position: relative;
    padding-top: calc(var(--esp-7) + var(--esp-6));
}

@media (min-width: 768px) {
    .site-secao:has(> .site-onda--dentro-base) {
        padding-bottom: calc(var(--esp-8) + var(--esp-6));
    }

    .site-secao:has(> .site-onda--dentro-topo) {
        padding-top: calc(var(--esp-8) + var(--esp-6));
    }
}

@media (min-width: 1280px) {
    .site-secao:has(> .site-onda--dentro-base) {
        padding-bottom: calc(var(--esp-9) + var(--esp-6));
    }

    .site-secao:has(> .site-onda--dentro-topo) {
        padding-top: calc(var(--esp-9) + var(--esp-6));
    }
}

/* Espelha a curva quando a mesma forma precisa fechar a seção em vez de abrir. */
.site-onda--invertida { transform: rotate(180deg); }

/* =========================================================================
   §2.3 Hero — texto, foto orgânica, tela sobreposta, flutuantes e provas
   ========================================================================= */

.site-hero__grid {
    display: grid;
    grid-template-columns: 1fr;
    gap: var(--esp-6);
    align-items: center;
}

.site-hero__grid > * { min-width: 0; }

@media (min-width: 1024px) {
    .site-hero__grid {
        /* 1.05 / .95: a coluna de texto ganha o fio de vantagem que o olho lê
           como "aqui é o assunto", sem transformar a mídia em miniatura. */
        grid-template-columns: minmax(0, 1.05fr) minmax(0, .95fr);
        gap: var(--esp-7);
    }
}

/* Palco da composição. O teto de largura existe porque a foto é 3:4 (retrato):
   solta numa coluna de 700px ela passaria de 900px de altura e empurraria o
   botão principal para fora da primeira tela no tablet. */
.site-hero__midia {
    position: relative;
    max-width: 420px;
    margin-inline: auto;
    min-width: 0;
}

@media (min-width: 768px) {
    /* Folga para a tela sobreposta descer sem encostar na seção seguinte. */
    .site-hero__midia { margin-bottom: var(--esp-5); }
}

@media (min-width: 1024px) {
    .site-hero__midia { max-width: 460px; margin-bottom: 0; }
}

/* Recorte assimétrico: dois cantos retos e dois muito arredondados. É o mesmo
   gesto da onda do divisor — a marca é de surf, e uma foto em retângulo duro
   ficaria com cara de banco de imagens colado na página. A diagonal do recorte
   também aponta para a coluna de texto, então o olho volta para a chamada em
   vez de escapar pela borda. */
.site-hero__foto {
    display: block;
    width: 100%;
    aspect-ratio: 3 / 4;
    object-fit: cover;
    border-radius: 28px 120px 28px 120px;
    box-shadow: var(--sombra-3);
    /* `overflow` cobre o caso de `.site-hero__foto` ser o <picture> e não o
       <img>: sem ele o recorte não aparece no filho. */
    overflow: hidden;
}

.site-hero__foto img {
    display: block;
    width: 100%;
    height: 100%;
    object-fit: cover;
    border-radius: inherit;
    /* A prancha está no centro do enquadramento original, e é justamente ali
       que a tela do aplicativo entra por cima. Deslocar o recorte para a
       esquerda tira a prancha de baixo da sobreposição: as duas peças passam a
       dividir a composição em vez de disputar o mesmo ponto. */
    object-position: 34% center;
}

@media (max-width: 767.98px) {
    /* Sem a tela sobreposta, nada disputa o centro: a prancha volta ao meio. */
    .site-hero__foto img { object-position: center; }
}

/* Tela do produto sobreposta. Some abaixo de 768px: em 320px ela cobriria
   metade da foto e as duas peças virariam uma colagem ilegível — o hero do
   celular fica com foto, título e botão, que é o que precisa ser lido. */
.site-hero__tela {
    display: none;
    position: absolute;
    /* Mais estreita e mais para fora do que o esboço original (62% / -5%):
       naquela medida o aparelho cobria a prancha inteira e a fotografia virava
       um fundo de areia sem assunto. */
    right: -11%;
    bottom: -24px;
    z-index: 2;
    width: 52%;
    padding: 6px;
    background: var(--superficie);
    border-radius: 14px;
    /* Sombra mais fechada que a --sombra-3 para a tela descolar da foto que
       está logo atrás dela, e não da página. */
    box-shadow: 0 16px 40px rgba(10, 38, 56, .28);
}

.site-hero__tela img {
    display: block;
    width: 100%;
    height: auto;
    border-radius: 9px;
}

/* Cartão flutuante: rótulo curto e demonstrativo sobre a composição. Também
   some abaixo de 768px, pelo mesmo motivo da tela. */
.site-flutuante {
    display: none;
    position: absolute;
    z-index: 3;
    align-items: center;
    gap: var(--esp-2);
    max-width: 190px;
    padding: 10px 14px;
    background: var(--superficie);
    border: 1px solid var(--linha);
    border-radius: 12px;
    box-shadow: var(--sombra);
    font-size: 13px;
    font-weight: 700;
    line-height: 1.3;
    color: var(--navy);
}

.site-flutuante__ic {
    --ic-tam: 28px;
    --ic-raio: 8px;
    flex: 0 0 auto;
    width: 28px;
    height: 28px;
}

@media (min-width: 768px) {
    .site-hero__tela { display: block; }
    .site-flutuante { display: flex; }
}

/* Posições distintas para os dois flutuantes não se empilharem: um encosta no
   canto superior esquerdo da foto, o outro flutua no meio da borda direita,
   acima da tela sobreposta. */
.site-flutuante--a {
    top: 7%;
    left: -6%;
    animation: site-flutua 6s ease-in-out infinite alternate;
}

/* Encostado na base, à esquerda: na posição anterior (meio da borda direita)
   ele caía em cima da tela do aplicativo e tapava justamente os números de
   crédito — o dado que a captura existe para mostrar. */
.site-flutuante--b {
    bottom: 14%;
    left: -7%;
    animation: site-flutua 6s ease-in-out 1.2s infinite alternate-reverse;
}

/* ±4px em 6 segundos: quase imperceptível de propósito. A ideia é a página
   respirar, não animar. Nada de parallax. */
@keyframes site-flutua {
    from { transform: translateY(-4px); }
    to   { transform: translateY(4px); }
}

/* Provas curtas abaixo da chamada: ícone + rótulo, quebrando em duas linhas no
   celular em vez de encolher a fonte. */
.site-hero__provas {
    display: flex;
    flex-wrap: wrap;
    /* Vão horizontal menor que o do esboço (--esp-5): com ele os três rótulos
       não cabiam na coluna do hero em 1440px e o terceiro caía sozinho numa
       segunda linha, desalinhado dos outros dois. */
    gap: var(--esp-3) var(--esp-4);
    margin: var(--esp-6) 0 0;
    padding: 0;
    list-style: none;
}

.site-hero__provas > * {
    display: flex;
    align-items: center;
    gap: var(--esp-2);
    min-width: 0;
    /* 13px, e não 14: medido na coluna do hero em 1440px, os três rótulos
       somavam 584px contra 540px disponíveis e o terceiro caía sozinho numa
       segunda linha. Com 13px e o ícone em 24px eles somam ~531px e a fileira
       fecha em uma linha só. Continua acima do mínimo de 12px do projeto. */
    font-size: .8125rem;
    font-weight: 600;
    color: var(--tinta-media);
}

/* Ícone das provas menor que o padrão de 44px: aqui ele acompanha um rótulo
   curto, não é alvo de toque — nada nesta fileira é clicável. */
.site-hero__provas .site-ic {
    --ic-tam: 24px;
    --ic-raio: 7px;
    flex: 0 0 auto;
    width: 24px;
    height: 24px;
}

/* =========================================================================
   §2.4 Problemas — 3 destaques em cartão + 5 linhas compactas
   -------------------------------------------------------------------------
   Oito problemas em oito cartões iguais viram uma parede de caixas e ninguém
   lê o quinto. Três ganham cartão e peso de título; os outros cinco viram
   linha de lista, sem caixa, que o olho varre em segundos.
   ========================================================================= */

.site-problemas__destaques {
    display: grid;
    grid-template-columns: 1fr;
    gap: var(--esp-4);
    margin-bottom: var(--esp-7);
}

@media (min-width: 600px) {
    .site-problemas__destaques { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}

@media (min-width: 900px) {
    .site-problemas__destaques {
        grid-template-columns: repeat(3, minmax(0, 1fr));
        gap: var(--esp-5);
    }
}

.site-problemas__destaques > * { min-width: 0; }

.site-problema--destaque {
    display: flex;
    flex-direction: column;
    gap: var(--esp-3);
    height: 100%;
    padding: var(--esp-6) var(--esp-5);
    background: var(--superficie);
    border: 1px solid var(--linha);
    border-radius: var(--raio-lg);
    box-shadow: var(--sombra-sm);
}

.site-problema__titulo,
.site-problema--destaque h3 {
    margin: 0;
    font-size: 1.25rem;
    line-height: 1.25;
    color: var(--navy);
}

.site-problema__texto,
.site-problema--destaque p {
    margin: 0;
    color: var(--tinta-media);
    font-size: .9375rem;
}

/* Os cinco restantes. Sem fundo e sem borda ao redor: o único traço é o filete
   inferior, que dá ritmo de lista e não de cartão. */
.site-problemas__resto {
    display: grid;
    grid-template-columns: 1fr;
    /* Sem gap entre linhas: quem separa é o filete de cada item. */
    gap: 0;
    margin: 0;
    padding: 0;
    list-style: none;
}

@media (min-width: 600px) {
    .site-problemas__resto {
        grid-template-columns: repeat(2, minmax(0, 1fr));
        column-gap: var(--esp-6);
    }
}

@media (min-width: 1024px) {
    .site-problemas__resto {
        grid-template-columns: repeat(3, minmax(0, 1fr));
        column-gap: var(--esp-7);
    }
}

.site-problema-linha {
    display: flex;
    align-items: flex-start;
    gap: 12px;
    min-width: 0;
    padding-block: var(--esp-4);
    border-bottom: 1px solid var(--linha);
    color: var(--tinta-media);
    font-size: .9375rem;
}

/* Só o último item perde o filete. Em duas ou três colunas os itens do fim de
   cada coluna mantêm o traço, e isso é proposital: ele fecha a coluna. */
.site-problema-linha:last-child {
    border-bottom: 0;
}

.site-problema-linha strong,
.site-problema-linha__titulo {
    display: block;
    color: var(--navy);
    font-size: 1rem;
}

/* =========================================================================
   §2.6 Funcionalidades — linhas alternadas texto/imagem
   ========================================================================= */

.site-split {
    display: grid;
    grid-template-columns: 1fr;
    gap: var(--esp-5);
    align-items: center;
}

.site-split > * { min-width: 0; }

@media (min-width: 1024px) {
    .site-split {
        grid-template-columns: minmax(0, 1fr) minmax(0, 1.1fr);
        gap: 48px;
    }
}

/* Respiro grande entre blocos: sem ele duas linhas alternadas parecem uma
   tabela de quatro células. 48px no celular, 72px do tablet para cima. */
.site-split + .site-split {
    margin-top: var(--esp-7);
}

@media (min-width: 768px) {
    .site-split + .site-split { margin-top: 72px; }
}

/* A inversão vale só onde existem duas colunas. No celular a ordem do código
   manda — texto antes da imagem em todos os blocos, sempre, senão a leitura
   alterna sem motivo e a navegação por teclado pula. */
@media (min-width: 1024px) {
    .site-split--invertido > :first-child { order: 2; }
    .site-split--invertido > :last-child { order: 1; }
}

/* Moldura de screenshot: chapa branca fina em volta da imagem. Sem ela a
   captura sangra no fundo da seção e o visitante não sabe onde a tela começa. */
.site-tela {
    max-width: 100%;
    padding: 8px;
    background: var(--superficie);
    border: 1px solid rgba(10, 38, 56, .08);
    border-radius: 16px;
    box-shadow: var(--sombra-3);
}

.site-tela img {
    display: block;
    width: 100%;
    height: auto;
    border-radius: 10px;
}

/* Captura do aplicativo: moldura estreita e cantos de aparelho. O teto de
   300px impede que uma tela de celular apareça do tamanho de um monitor. */
.site-tela--telefone {
    max-width: 300px;
    margin-inline: auto;
    padding: 6px;
    border-radius: 28px;
}

.site-tela--telefone img {
    border-radius: 22px;
}

/* Legenda da captura. Fora do contrato, mas obrigatória pela regra de conteúdo:
   toda tela precisa dizer o que é e que os dados são de demonstração. */
.site-figura {
    margin: 0;
}

.site-figura figcaption,
.site-legenda {
    margin-top: var(--esp-2);
    font-size: .8125rem;
    color: var(--tinta-media);
    text-align: center;
}

/* A LISTA DE RECURSOS NÃO ABRE MAIS — ELA JÁ ESTÁ ABERTA.

   Era um <details> por bloco, fechado por padrão. Ele resolvia o comprimento da
   página e comprava um problema maior: fechados, os quatro resumos deixavam a
   coluna de texto com pouco mais de 200px ao lado da figura, e a seção virava
   quatro faixas com um link solto no meio do branco. Pior que o vazio: o
   conteúdo que responde "isso serve para a MINHA escola?" ficava atrás de um
   clique que quase ninguém dá.

   Abrir os quatro no lugar antigo seria trocar o vazio por uma coluna estreita
   com treze linhas empilhadas. Então a lista MUDOU DE EIXO: saiu da coluna de
   texto e virou uma faixa de largura inteira embaixo do par texto/figura,
   distribuída em colunas de ~250px. O mesmo conteúdo, na horizontal — a seção
   fica mais curta do que ficaria com os <details> abertos onde estavam, e o
   par texto/figura volta a ser uma vitrine curta em vez de um acordeão.

   Sem <summary> some o único controle do bloco: nada aqui depende mais de
   `[open]`, de alvo de toque nem do script que anunciava `aria-expanded`. A
   animação `site-recursos-abre` continua no arquivo porque quem a usa hoje é o
   FAQ, que ainda abre e fecha. */
/* ---------------------------------------------------------------------------
   A LISTA DE RECURSOS VIVE DENTRO DA COLUNA DE TEXTO
   ---------------------------------------------------------------------------
   Ela já foi faixa de largura inteira embaixo do par texto/figura, e a medição
   condenou o desenho: a coluna de texto tinha 136–187px de conteúdo ao lado de
   uma figura de 269–425px e, com `align-items: center`, sobravam de 54 a 145px
   de branco ACIMA e ABAIXO do texto — 772px de vazio somando os quatro blocos.
   A lista que descrevia o bloco ficava de 141 a 232px abaixo do próprio título,
   depois de uma imagem, e a seção inteira media 3303px: três vezes a maior das
   outras da página.

   O conteúdo que faltava na coluna era justamente esse. Trazendo a lista para
   dentro dela, a coluna cresce até a altura da figura, o vazio de centramento
   desaparece, o texto encosta no título a que pertence e a seção volta ao mesmo
   padrão do resto do site: `.site-split` com duas colunas de peso parecido, que
   é como "Problemas" e "Para o aluno" já funcionam.

   O rótulo ("Recursos da gestão") saiu junto: ele existia porque a faixa estava
   longe do <h3> e precisava dizer de quem era. Encostada no título, repetiria o
   assunto duas vezes em três linhas.
   --------------------------------------------------------------------------- */

.site-recursos {
    margin-top: var(--esp-4);
}

/* Rótulo da faixa, no mesmo desenho do olho de seção (`.site-eyebrow`) e pela
   mesma razão dele: nomear o bloco sem competir com o <h3> que está logo acima.
   É um <p>, e não um <h4> — quatro cabeçalhos de três palavras engordariam o
   sumário da página sem acrescentar navegação nenhuma, que é a mesma decisão já
   tomada nas linhas curtas de "Problemas". */
.site-recursos__rotulo {
    margin: 0 0 var(--esp-3);
    font-family: var(--fonte-titulo);
    font-size: .75rem;
    font-weight: 700;
    line-height: 1.4;
    letter-spacing: .14em;
    text-transform: uppercase;
    color: var(--acao-forte);
}

/* ---------------------------------------------------------------------------
   "Ver os outros N recursos"
   ---------------------------------------------------------------------------
   O controle precisa parecer o que é: um link discreto, e não um botão. Ele
   revela o RESTO de uma lista que já começou visível — quem não clicar não
   perde a resposta, só o inventário completo.

   Por isso ele não ganha caixa, borda nem cor de ação cheia: um botão ali
   competiria com o CTA da seção e sugeriria que a informação importante está
   escondida. Está o contrário: os quatro primeiros itens são os que importam.
   --------------------------------------------------------------------------- */

.site-recursos__mais {
    margin-top: var(--esp-3);
}

.site-recursos__mais > summary {
    display: inline-flex;
    align-items: center;
    gap: .4rem;
    width: fit-content;
    padding: .2rem 0;
    color: var(--acao);
    font-size: .92rem;
    font-weight: 600;
    cursor: pointer;
    list-style: none;
}

/* O triângulo nativo do Safari e do Chrome vem em dois seletores diferentes, e
   os dois precisam sumir: o marcador próprio abaixo é o que gira. */
.site-recursos__mais > summary::-webkit-details-marker {
    display: none;
}

/* Seta desenhada com borda, e não caractere: `▸` muda de forma e de baseline
   conforme a fonte instalada, e aqui ela precisa girar exatamente 90°. */
.site-recursos__mais > summary::after {
    content: '';
    width: .42rem;
    height: .42rem;
    border-right: 2px solid currentColor;
    border-bottom: 2px solid currentColor;
    transform: rotate(45deg) translate(-1px, -1px);
    transition: transform .18s ease;
}

.site-recursos__mais[open] > summary::after {
    transform: rotate(-135deg) translate(-1px, -1px);
}

.site-recursos__mais > summary:hover {
    color: var(--acao-forte);
}

.site-recursos__mais > summary:focus-visible {
    outline: 2px solid var(--acao);
    outline-offset: 3px;
    border-radius: 4px;
}

/* A lista revelada respira em relação ao controle, e não encosta nele. */
.site-recursos__mais > .site-lista {
    margin-top: var(--esp-3);
}

@media (prefers-reduced-motion: reduce) {
    .site-recursos__mais > summary::after {
        transition: none;
    }
}

/* Colunas por LARGURA, não por quantidade: os quatro blocos têm de 6 a 13 itens
   e frases de comprimentos muito diferentes. `auto-fit` com piso de 250px dá
   três colunas na página cheia, duas no tablet e uma no celular, sem uma media
   query por bloco — o mesmo mecanismo que a vitrine de planos já usa. O piso é
   300px, e não 250: medido na página cheia, 250px dava QUATRO colunas de ~245px
   e quase todo item quebrava em duas linhas. Com 300 são três colunas de ~340px
   e a maioria dos itens cabe numa linha só, que é o que faz a faixa ser varrida
   de relance em vez de lida.

   É grade, e não multicoluna: o preenchimento é por LINHA, então a sobra do
   último item cai no FIM da lista, onde não separa nada. Com `columns` o
   navegador equilibraria as alturas e um item longo poderia partir no meio. */
/* UMA COLUNA, agora que a lista mora dentro da coluna de texto.

   Ela era de largura inteira e se distribuía em três colunas de ~300px. Numa
   coluna de ~520px, `auto-fit` daria uma segunda coluna espremida a 250px, com
   frases de oito palavras quebrando em três linhas cada — mais alto do que a
   coluna única e muito mais difícil de varrer.

   O `gap` vertical é o mesmo do resto do site para lista com marcador. */
.site-recursos .site-lista {
    grid-template-columns: 1fr;
    gap: var(--esp-3);
}

/* A lista ABERTA continua em uma coluna, e isto é coerência com o parágrafo
   acima e não descuido: a largura disponível é a mesma nos dois estados. Duas
   colunas de ~250px quebrariam frases de oito palavras em três linhas cada, e o
   inventário aberto ficaria mais alto do que em coluna única — pagando altura
   para ganhar densidade que a medida não comporta. */

/* O TEXTO ANCORA NO TOPO, e não no centro da linha.

   `.site-split` centra por padrão, e isso está certo onde as duas colunas têm
   peso parecido. Aqui a figura ainda é mais alta que o texto em dois dos quatro
   blocos, e centrar devolveria — em menor escala — o mesmo vazio simétrico que a
   medição condenou. Ancorado no topo, o que sobra fica embaixo, junto da
   imagem, onde lê como respiro e não como buraco. */
.site-funcionalidade > .site-split {
    align-items: start;
}

/* Um bloco de funcionalidade = par texto/figura + faixa de recursos.

   O respiro entre blocos mudou de dono: era `.site-split + .site-split`, e com a
   faixa no meio os dois splits deixaram de ser irmãos adjacentes. Os valores são
   os mesmos de antes (48px no celular, 72px do tablet para cima) porque o
   problema também é o mesmo — sem eles, quatro blocos se leem como uma tabela. */
.site-funcionalidade + .site-funcionalidade {
    margin-top: var(--esp-7);
}

@media (min-width: 768px) {
    .site-funcionalidade + .site-funcionalidade { margin-top: 72px; }
}

@keyframes site-recursos-abre {
    from { opacity: 0; transform: translateY(-6px); }
    to   { opacity: 1; transform: none; }
}

/* =========================================================================
   §2.7 Recursos complementares
   ========================================================================= */

/* Refino: eram três caixas azuladas iguais e apagadas. Agora o fundo sobe da
   areia para o branco (deixa de ser bloco chapado), a borda some em favor de
   uma linha de água no topo, e o padding cresce para o conteúdo respirar. */
.site-extra {
    position: relative;
    display: flex;
    flex-direction: column;
    gap: var(--esp-2);
    height: 100%;
    min-width: 0;
    overflow: hidden;
    padding: var(--esp-6) var(--esp-5) var(--esp-5);
    background: linear-gradient(180deg, var(--turquesa-fundo) 0%, #FBFCFC 62%, var(--superficie) 100%);
    border: 1px solid #DCEAE8;
    border-radius: var(--raio-lg);
    transition: transform var(--transicao), box-shadow var(--transicao);
}

/* Filete de água no topo do cartão: dois pixels de turquesa que dão a mesma
   assinatura aos três sem repetir caixa. */
.site-extra::before {
    content: '';
    position: absolute;
    top: 0;
    right: 0;
    left: 0;
    height: 3px;
    background: linear-gradient(90deg, var(--teal-deep) 0%, var(--teal) 100%);
}

/* Altura fixa da faixa de ilustração para os cartões da fileira alinharem o
   título na mesma linha, mesmo com desenhos de proporções diferentes. */
.site-extra__arte {
    display: grid;
    place-items: center;
    height: 96px;
    margin-bottom: var(--esp-2);
}

.site-extra__arte svg,
.site-extra__arte img {
    max-height: 96px;
    width: auto;
}

.site-extra__titulo {
    /* Respiro próprio entre a ilustração e o título, e entre o título e o
       texto: antes os três blocos encostavam e o cartão lia como um parágrafo
       só. */
    margin: 0 0 var(--esp-1);
    font-size: 1.0625rem;
    font-weight: 700;
    line-height: 1.3;
    color: var(--navy);
}

.site-extra__texto {
    margin: 0;
    color: var(--tinta-media);
    font-size: .9375rem;
    line-height: 1.6;
}

/* `.site-extra__nota` morava aqui: a ressalva do rodapé do cartão, com filete
   e itálico. Saiu junto com a única frase que a usava (a condição do serviço
   de previsão, em Recursos) — sem ela a regra não tinha um só elemento no
   HTML. Uma ressalva nova nasce em `.site-observacao`, logo abaixo — que já é
   o padrão único desses avisos. */

/* =========================================================================
   Observação de seção — estilo reutilizável
   -------------------------------------------------------------------------
   Nota curta que fecha uma seção: abaixo dos cartões complementares
   (Recursos), abaixo dos planos, abaixo do painel de Pagamentos. Nasceu de
   duas linhas soltas que encostavam no bloco anterior e liam como continuação
   dele. Marcador de água à esquerda, largura curta e itálico: o olho reconhece
   como ressalva antes de ler.

   Este é o padrão único dessas ressalvas. A de Pagamentos chegou a ganhar
   caixa com ícone (`site-nota`) para pesar mais; a caixa passou a competir com
   o painel logo acima e o remédio ficou mais visível que o sintoma. Uma
   ressalva nova entra aqui — não em variante própria.
   ========================================================================= */

.site-observacao {
    position: relative;
    max-width: 62ch;
    margin: var(--esp-7) auto var(--esp-2);
    padding-left: var(--esp-4);
    color: var(--tinta-media);
    font-size: .875rem;
    font-style: italic;
    line-height: 1.65;
    text-align: left;
}

.site-observacao::before {
    content: '';
    position: absolute;
    top: .55em;
    left: 0;
    width: 8px;
    height: 8px;
    background: var(--teal);
    border-radius: 50%;
}

/* Centralizada quando fecha uma seção centralizada (planos). */
.site-observacao--centro {
    display: block;
    width: fit-content;
    text-align: center;
}

/* DUAS RESSALVAS SEGUIDAS. Pagamentos fecha com duas: a tarifa do Mercado Pago
   e a saída para quem cobra por fora. Com o `--esp-7` de topo em cada uma, a
   segunda abriria o mesmo respiro de fim de seção e as duas leriam como dois
   finais diferentes. Encostadas, leem como uma nota de duas partes. */
.site-observacao + .site-observacao {
    margin-top: var(--esp-3);
}

/* O link dentro da ressalva sai do itálico e ganha peso: é a única ação da
   frase, e em itálico ele se confundiria com a ênfase do texto ao redor. O
   sublinhado é obrigatório porque a cor sozinha não pode ser o que distingue
   um link. */
.site-observacao a {
    color: var(--acao-forte);
    font-style: normal;
    font-weight: 700;
    text-decoration: underline;
    text-underline-offset: 3px;
}

/* =========================================================================
   §2.8 Timeline "Como funciona"
   -------------------------------------------------------------------------
   A linha que liga as etapas é um ::before do próprio item, não um elemento no
   HTML: é grafismo puro, não deve existir para o leitor de tela e não pode
   entrar na ordem de leitura. Cada item traz o número escrito, então a ordem
   continua compreensível se a linha não pintar (impressão, contraste alto,
   navegador antigo).
   ========================================================================= */

.site-timeline {
    /* Vão e selo entram em variáveis porque a linha conectora precisa medir
       "do fim de um selo até o próximo", ou seja, atravessar exatamente o vão.
       Mexer no tamanho do selo ou no vão numa media query reajusta a linha
       sozinho — sem isso, cada mudança de tamanho pedia três correções de
       `top`/`left`/`height` espalhadas, e uma delas sempre ficava para trás. */
    --tl-gap: var(--esp-5);
    --tl-selo: 64px;
    display: grid;
    grid-template-columns: 1fr;
    gap: var(--tl-gap);
    margin: 0;
    padding: 0;
    list-style: none;
}

.site-timeline__item {
    position: relative;
    min-width: 0;
    /* No celular o selo fica à ESQUERDA e o texto ao lado. Se ficasse em cima
       (como no desktop), a linha vertical desceria por dentro do parágrafo e
       riscaria o texto. */
    padding-left: calc(var(--tl-selo) + var(--esp-4));
    /* Alinha o texto ao centro óptico do selo, em vez de encostar no topo. */
    padding-top: var(--esp-1);
}

/* MARCADOR ÚNICO: número e ícone eram duas peças pequenas, uma embaixo da
   outra, e nenhuma das duas tinha peso suficiente para marcar a etapa. Agora
   são um selo só — disco com o ícone e o número num contador encostado na
   borda. Um elemento, duas informações. */
.site-timeline__marcador {
    position: absolute;
    top: 0;
    left: 0;
    z-index: 1;
    display: block;
    width: var(--tl-selo);
    height: var(--tl-selo);
}

.site-timeline__ic {
    --ic-tam: var(--tl-selo);
    width: var(--tl-selo);
    height: var(--tl-selo);
    border-radius: 50%;
    /* Anel claro para o selo destacar da linha que passa atrás dele. */
    box-shadow: 0 0 0 4px var(--pagina);
}

.site-timeline__ic svg {
    /* ~53% do selo: proporção que mantém o desenho legível sem encostar no
       anel, em qualquer um dos três tamanhos de selo da página. */
    width: calc(var(--tl-selo) * .53);
    height: calc(var(--tl-selo) * .53);
}

.site-timeline__num {
    position: absolute;
    right: -6px;
    bottom: -4px;
    display: grid;
    place-items: center;
    min-width: 26px;
    height: 26px;
    padding: 0 7px;
    border-radius: var(--raio-pill);
    background: var(--acao);
    color: #fff;
    font-family: var(--fonte-titulo);
    font-size: .8125rem;
    font-weight: 700;
    line-height: 1;
    box-shadow: 0 0 0 2px var(--pagina);
}

/* Linha vertical no celular: do fim do selo até o selo do item seguinte,
   atravessando o vão da grade. Ondula, pela mesma razão da trilha de etapas do
   cadastro — a curva é a assinatura da página, e um risco reto ligando os
   cinco passos era o único traço que falava outra língua.

   A faixa passa de 2px para 8px de largura para caber a amplitude da onda; o
   `left` desconta metade disso (4px em vez de 1px) para o eixo continuar
   passando pelo centro do selo, que é o que o anel do selo esconde. */
.site-timeline__item::before {
    content: '';
    position: absolute;
    left: calc(var(--tl-selo) / 2 - 4px);
    top: calc(var(--tl-selo) + 4px);
    width: 8px;
    height: calc(100% - var(--tl-selo) - 4px + var(--tl-gap));
    background: var(--linha-forte);
    -webkit-mask-image: var(--onda-linha-v);
    mask-image: var(--onda-linha-v);
    -webkit-mask-repeat: repeat-y;
    mask-repeat: repeat-y;
    -webkit-mask-size: 8px 32px;
    mask-size: 8px 32px;
    -webkit-mask-position: center top;
    mask-position: center top;
}

/* Sem suporte a máscara a linha não pode sumir: os cinco passos ficariam
   soltos, sem nada dizendo que são uma sequência. Volta o risco reto. */
@supports not ((-webkit-mask-image: none) or (mask-image: none)) {
    .site-timeline__item::before {
        left: calc(var(--tl-selo) / 2 - 1px);
        width: 2px;
    }
}

/* O último item não liga em lugar nenhum. */
.site-timeline__item:last-child::before {
    content: none;
}

.site-timeline__titulo {
    margin: 0 0 var(--esp-1);
    font-size: 1.0625rem;
    color: var(--navy);
    text-wrap: balance;
}

.site-timeline__texto {
    margin: 0;
    color: var(--tinta-media);
    font-size: .9375rem;
}

@media (min-width: 700px) {
    /* Aqui a peça vira coluna: selo em cima, texto embaixo, linha horizontal
       ligando os selos. */
    .site-timeline__item {
        padding-left: 0;
        padding-top: calc(var(--tl-selo) + var(--esp-3));
    }


    /* A linha sai da borda direita do selo e atravessa o vão até o próximo.
       Deitada, a onda troca de eixo: máscara horizontal, e o `top` desconta
       metade da faixa (4px) para o eixo continuar na altura do centro do
       selo. */
    .site-timeline__item::before {
        left: calc(var(--tl-selo) + 6px);
        top: calc(var(--tl-selo) / 2 - 4px);
        width: calc(100% - var(--tl-selo) - 6px + var(--tl-gap));
        height: 8px;
        -webkit-mask-image: var(--onda-linha-h);
        mask-image: var(--onda-linha-h);
        -webkit-mask-repeat: repeat-x;
        mask-repeat: repeat-x;
        -webkit-mask-size: 32px 8px;
        mask-size: 32px 8px;
        -webkit-mask-position: left center;
        mask-position: left center;
    }

    @supports not ((-webkit-mask-image: none) or (mask-image: none)) {
        .site-timeline__item::before {
            top: calc(var(--tl-selo) / 2 - 1px);
            height: 2px;
        }
    }

    /* O QUINTO SELO TAMBÉM GANHA ONDA — e ela some.

       Deitada, a trilha ficava torta: quatro selos com linha à direita e o
       último com um vão vazio do tamanho de meia coluna, que lê como etapa que
       não carregou. Ligar o quinto a um sexto seria pior (não há sexto), e
       centralizar os selos brigaria com o texto de cada passo, que é alinhado
       à esquerda.

       A saída é a onda continuar e esvanecer: a operação não termina no quinto
       passo, ela segue. Quem esvanece é o FUNDO, num gradiente — compor duas
       máscaras (curva e fade) daria o mesmo desenho e dependeria de
       `mask-composite`, que é justamente o pedaço com pior suporte. */
    .site-timeline__item:last-child::before {
        content: '';
        width: calc(100% - var(--tl-selo) - 6px);
        background: linear-gradient(90deg, var(--linha-forte) 0%, var(--linha-forte) 35%, transparent 100%);
    }
}

/* SÃO CINCO ETAPAS, E CINCO NÃO DIVIDE POR TRÊS.
   A grade tem SEIS colunas e cada etapa ocupa DUAS: três por fileira. A
   segunda fileira, com duas etapas, seria empurrada para a esquerda e
   deixaria um buraco à direita do tamanho de uma etapa — o leitor lê esse
   buraco como um passo que faltou carregar. Deslocar as duas em uma coluna
   centraliza a fileira e o buraco vira margem simétrica. */
@media (min-width: 700px) and (max-width: 1023.98px) {
    .site-timeline {
        grid-template-columns: repeat(6, minmax(0, 1fr));
    }

    .site-timeline__item {
        grid-column: span 2;
    }

    .site-timeline__item:nth-child(4) { grid-column: 2 / span 2; }
    .site-timeline__item:nth-child(5) { grid-column: 4 / span 2; }

    /* Fim de fileira não aponta para lugar nenhum. */
    .site-timeline__item:nth-child(3)::before { content: none; }
}

/* Cinco colunas, uma por etapa — não seis.
   O layout anterior pedia `repeat(6, ...)` para cinco itens: sobrava uma
   coluna inteira vazia à direita (~280px em 1140), a fileira ficava encostada
   à esquerda e cada etapa recebia só 166px, estreito o bastante para quebrar
   o título em três linhas. Com cinco colunas cada etapa fica com ~202px e a
   fileira ocupa a largura que tem. */
@media (min-width: 1024px) {
    .site-timeline {
        --tl-gap: var(--esp-4);
        grid-template-columns: repeat(5, minmax(0, 1fr));
    }

    .site-timeline__titulo { font-size: 1rem; }

    /* TÍTULOS DE ALTURAS DIFERENTES DESALINHAVAM TODOS OS PARÁGRAFOS.
       "O SurfApp recebe uma pequena taxa sobre as vendas" ocupa três linhas;
       "Venda aulas e pacotes" ocupa uma. Com cada etapa fechada em si, o texto
       de cada coluna começava numa altura diferente e a fileira perdia a linha
       de base — cinco blocos soltos em vez de uma sequência.

       `subgrid` faz as etapas compartilharem as linhas da grade externa: os
       títulos ocupam uma faixa só e os parágrafos começam todos juntos.

       Só a partir daqui, onde as cinco etapas cabem numa fileira. Entre 700 e
       1023 são duas fileiras, e as linhas da grade passariam a separar também
       uma fileira da outra: o mesmo `row-gap` teria de servir para "título e
       texto da mesma etapa" e para "uma fileira e a seguinte", que pedem
       distâncias bem diferentes.

       Por isso o vão vertical se separa do horizontal: o `--tl-gap` continua
       afastando as colunas (e a linha conectora conta com ele), enquanto entre
       título e texto vale um respiro de parágrafo. Com o vão único, a etapa de
       título curto ficava com um buraco de 24px antes do texto.

       Sem suporte a `subgrid`, cada item volta a ser um bloco comum — os
       parágrafos desalinham como antes e nada mais muda. */
    @supports (grid-template-rows: subgrid) {
        .site-timeline {
            grid-template-rows: auto auto;
            column-gap: var(--tl-gap);
            row-gap: var(--esp-2);
        }

        .site-timeline__item {
            display: grid;
            grid-template-rows: subgrid;
            grid-row: span 2;
            align-content: start;
        }
    }
}

/* Selo maior onde há espaço: a etapa é a única figura da seção e, no tamanho
   anterior, o ícone competia em peso com o número que fica na borda dele. */
@media (min-width: 1280px) {
    .site-timeline {
        --tl-selo: 72px;
        --tl-gap: var(--esp-5);
    }

    .site-timeline__titulo { font-size: 1.0625rem; }
}

/* =========================================================================
   §2.9 Benefícios — faixa escura com fotografia ao fundo
   -------------------------------------------------------------------------
   Contraste aqui é requisito, não gosto. A foto entra com opacidade baixa E
   um gradiente navy por cima, em camadas separadas:
     - foto a 16% sobre o navy: mesmo que o trecho da imagem seja branco puro,
       o fundo composto não passa de ~9.5:1 contra o texto branco;
     - gradiente de proteção em opacidade cheia, acima da foto e abaixo do
       texto: derruba o pior caso para ~11:1 e cobre também o caso de alguém
       trocar a foto por outra mais clara.
   O gradiente NÃO pode morar dentro do elemento da foto quando ele tem
   opacity: .16 — ele seria achatado junto. Por isso a proteção é ::before da
   seção, e o ::after da foto é só um reforço para o caso de o markup usar um
   invólucro em vez do <img> direto.
   ========================================================================= */

.site-beneficios {
    position: relative;
    isolation: isolate;
    overflow: hidden;
    /* Só a cor: se a seção também levar `.site-secao--escura`, o gradiente dela
       continua valendo por cima deste fundo. */
    background-color: var(--navy);
    color: #fff;
}

.site-beneficios__foto {
    position: absolute;
    inset: 0;
    z-index: 0;
    display: block;
    margin: 0;
    width: 100%;
    height: 100%;
    object-fit: cover;
    opacity: .16;
    pointer-events: none;
}

.site-beneficios__foto img {
    display: block;
    width: 100%;
    height: 100%;
    object-fit: cover;
}

.site-beneficios__foto::after {
    content: '';
    position: absolute;
    inset: 0;
    background: linear-gradient(180deg, rgba(10, 38, 56, .40) 0%, rgba(10, 38, 56, .75) 100%);
}

/* Camada de proteção de contraste, em opacidade cheia. */
.site-beneficios::before {
    content: '';
    position: absolute;
    inset: 0;
    z-index: 1;
    background: linear-gradient(180deg, rgba(10, 38, 56, .35) 0%, rgba(10, 38, 56, .70) 100%);
    pointer-events: none;
}

/* O conteúdo sobe para cima das duas camadas. O `:not` é obrigatório: sem ele
   esta regra atingiria também o elemento da foto (que é filho direto) e o
   devolveria para `position: relative`, desmontando a composição inteira. */
.site-beneficios > *:not(.site-beneficios__foto) {
    position: relative;
    z-index: 2;
}

.site-beneficios h2,
.site-beneficios h3 {
    color: #fff;
}

/* Quatro frases grandes em 2x2. No desktop batem os 34px pedidos; em 320px o
   clamp desce até 24px, senão uma palavra comprida estoura a largura. */
.site-beneficios__frases {
    display: grid;
    grid-template-columns: 1fr;
    gap: var(--esp-4);
    margin: 0;
    padding: 0;
    list-style: none;
}

.site-beneficios__frases > * {
    min-width: 0;
    font-family: var(--fonte-titulo);
    font-size: clamp(1.5rem, 4.6vw, 2.125rem);
    font-weight: 700;
    line-height: 1.15;
    letter-spacing: -.01em;
    color: #fff;
    overflow-wrap: break-word;
}

/* Empilhado (celular e tablet), o respiro DENTRO do par é menor que o respiro
   ENTRE os pares — é o que faz "uma agenda / uma operação" ler como uma coisa
   só e não como quatro frases soltas. No desktop as frases voltam a ser uma
   grade de duas linhas e uma margem no terceiro item desalinharia a linha
   inteira; por isso a regra morre no mesmo ponto em que a segunda coluna
   nasce. */
@media (max-width: 1023px) {
    .site-beneficios__frases > *:nth-child(3) {
        margin-top: var(--esp-5);
    }
}

/* COLUNAS DO TAMANHO DA FRASE, não da metade da faixa. Com
   `repeat(2, minmax(0, 1fr))` cada coluna ficava com 514px para uma frase de
   233px: sobravam 329px de vazio no MEIO da linha, entre "Uma agenda." e a
   frase seguinte, e o par lia como duas colunas sem relação. Com `auto auto` +
   `justify-content: start` cada coluna encolhe até o próprio texto, o par fica
   separado só pelo gap e o bloco termina onde a frase mais longa termina — a
   sobra que resta é a margem direita de um bloco de texto, não um buraco
   dentro dele. `auto` (e não `max-content`) porque a coluna ainda precisa
   poder ceder se a fonte da máquina for maior que a nossa.

   Duas colunas só a partir de 1024px: em 768px o par mais longo ("Um
   histórico." + "Toda a evolução registrada.") pede 758px e o container tem
   720 — a segunda coluna quebraria no meio de uma frase de 34px. Até lá, as
   quatro empilhadas, que é onde o agrupamento por par acima trabalha. */
@media (min-width: 1024px) {
    .site-beneficios__frases {
        grid-template-columns: auto auto;
        justify-content: start;
        gap: var(--esp-6) var(--esp-7);
    }
}

.site-beneficios__lista {
    display: grid;
    grid-template-columns: 1fr;
    gap: var(--esp-4);
    margin: var(--esp-7) 0 0;
    padding: 0;
    list-style: none;
}

@media (min-width: 600px) {
    .site-beneficios__lista { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}

@media (min-width: 1024px) {
    .site-beneficios__lista { grid-template-columns: repeat(4, minmax(0, 1fr)); }
}

/* Branco puro, não branco a 80%: sobre foto o fundo varia de trecho para
   trecho e a margem de contraste tem que ser a maior possível. */
.site-beneficios__lista > * {
    display: flex;
    align-items: center;
    gap: var(--esp-3);
    min-width: 0;
    color: #fff;
    font-size: .9375rem;
    font-weight: 600;
}

/* =========================================================================
   §2.10 Planos — ícone de perfil, limites e dica do limite
   ========================================================================= */

/* Ícone do perfil a que o plano atende (prancha, equipe, rede). Vem antes do
   nome para o visitante se reconhecer antes de olhar o preço. */
.site-plano__ic {
    --ic-tam: 56px;
    --ic-raio: 14px;
    margin-bottom: var(--esp-3);
    background: var(--turquesa-fundo);
    color: var(--acao-forte);
}

/* Refino do destaque: além da borda de 2px que já existia, um halo bem fraco
   na cor de ação. A distinção continua não sendo só de cor — o selo escrito
   "Mais escolhido" segue no topo do cartão. */
.site-plano--destaque,
.site-plan--destaque {
    box-shadow: var(--sombra), 0 0 0 4px rgba(26, 130, 142, .10);
}

/* Alinhamento dos limites: rótulo e valor colados, pares afastados. Antes o
   `gap` uniforme deixava o rótulo de um par mais perto do valor do par de cima
   do que do seu próprio. */
.site-plano__limites {
    align-items: start;
    row-gap: var(--esp-4);
    border: 1px solid var(--linha);
}

.site-plano__limites dt {
    display: flex;
    align-items: center;
    gap: var(--esp-1);
    margin-bottom: 2px;
    line-height: 1.3;
}

.site-plano__limites dd {
    font-size: 1rem;
    line-height: 1.3;
}

/* Dica do limite. O glifo mede 20px por questão de desenho, mas o alvo real é
   o retângulo invisível de 44px do ::after — quem toca no celular acerta a
   dica sem precisar mirar. O texto explicativo vem de `title`/aria-describedby
   no markup: o ícone sozinho nunca carrega significado. */
.site-plano__dica {
    position: relative;
    display: inline-grid;
    place-items: center;
    width: 20px;
    height: 20px;
    margin-left: 4px;
    color: var(--acao-forte);
    vertical-align: -4px;
    cursor: help;
}

.site-plano__dica::after {
    content: '';
    position: absolute;
    left: 50%;
    top: 50%;
    width: var(--toque);
    height: var(--toque);
    transform: translate(-50%, -50%);
}

.site-plano__dica svg {
    display: block;
    width: 100%;
    height: 100%;
}

/* =========================================================================
   §2.11 Cadastro — formulário, resumo do plano e trilha de etapas
   -------------------------------------------------------------------------
   A submissão continua sendo uma só. O stepper é orientação visual (e
   aria-hidden no markup): mostra em quantas partes o formulário está dividido,
   sem virar assistente de várias telas.
   ========================================================================= */

.site-cadastro__grid {
    display: grid;
    grid-template-columns: 1fr;
    gap: var(--esp-5);
    align-items: start;
}

.site-cadastro__grid > * { min-width: 0; }

@media (min-width: 1024px) {
    .site-cadastro__grid {
        grid-template-columns: minmax(0, 1.6fr) minmax(0, .9fr);
        gap: var(--esp-7);
    }
}

.site-resumo {
    padding: var(--esp-5);
    background: var(--superficie);
    border: 1px solid var(--linha);
    border-radius: var(--raio-lg);
    box-shadow: var(--sombra-sm);
}

/* Sticky só onde existem duas colunas. Abaixo de 1024px o resumo está no fluxo,
   acima do formulário, e travar um cartão no topo de uma tela de celular
   comeria a área útil de digitação. O `top` desconta o cabeçalho fixo. */
@media (min-width: 1024px) {
    .site-resumo {
        position: sticky;
        top: calc(var(--altura-header) + 16px);
    }
}

.site-resumo__rotulo {
    display: block;
    margin-bottom: var(--esp-1);
    font-family: var(--fonte-titulo);
    font-size: .75rem;
    font-weight: 700;
    letter-spacing: .14em;
    text-transform: uppercase;
    color: var(--acao-forte);
}

.site-resumo__plano {
    margin: 0;
    font-family: var(--fonte-titulo);
    font-size: 1.25rem;
    font-weight: 700;
    color: var(--navy);
}

.site-resumo__preco {
    display: flex;
    align-items: baseline;
    flex-wrap: wrap;
    gap: var(--esp-1);
    margin: var(--esp-3) 0 0;
    font-family: var(--fonte-titulo);
    font-size: clamp(1.75rem, 5vw, 2.25rem);
    font-weight: 700;
    line-height: 1.1;
    letter-spacing: -.02em;
    color: var(--navy);
    overflow-wrap: anywhere;
}

.site-resumo__ciclo {
    font-size: .875rem;
    font-weight: 600;
    color: var(--tinta-media);
}

.site-resumo__lista {
    margin: var(--esp-4) 0 0;
}

/* Alvo de toque cheio no link de trocar de plano — é uma âncora curta e no
   celular ela precisa ter altura de botão. */
.site-resumo__trocar {
    display: inline-flex;
    align-items: center;
    gap: var(--esp-1);
    min-height: var(--toque);
    margin-top: var(--esp-3);
    font-size: .875rem;
    font-weight: 700;
    color: var(--acao-forte);
}

/* Versão compacta que aparece só onde o resumo lateral não cabe. Fica ANTES do
   formulário: quem chega pelo botão de um plano precisa confirmar que veio ao
   plano certo antes de começar a digitar. */
.site-resumo--movel {
    display: block;
    margin-bottom: var(--esp-4);
    padding: 0;
    box-shadow: none;
}

.site-resumo--movel > summary {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: var(--esp-3);
    min-height: var(--toque);
    padding: var(--esp-3) var(--esp-4);
    font-family: var(--fonte-titulo);
    font-size: .9375rem;
    font-weight: 700;
    color: var(--navy);
    cursor: pointer;
    list-style: none;
}

.site-resumo--movel > summary::-webkit-details-marker { display: none; }
.site-resumo--movel > summary::marker { content: ''; }

.site-resumo--movel > *:not(summary) {
    padding: 0 var(--esp-4) var(--esp-4);
}

@media (min-width: 1024px) {
    .site-resumo--movel { display: none; }
}

/* Trilha de etapas. Decorativa (aria-hidden no markup): o formulário continua
   sendo um só e a ordem real está nos <fieldset>. */
.site-etapas {
    display: flex;
    align-items: center;
    gap: var(--esp-2);
    margin: 0 0 var(--esp-5);
    padding: 0;
    list-style: none;
}

.site-etapas__item {
    display: flex;
    align-items: center;
    gap: var(--esp-2);
    flex: 1 1 0;
    min-width: 0;
    font-family: var(--fonte-titulo);
    font-size: .75rem;
    font-weight: 700;
    letter-spacing: .06em;
    text-transform: uppercase;
    /* Etapa ainda não preenchida muda de COR, nunca de opacidade — o rótulo
       precisa continuar legível. */
    color: var(--tinta-media);
}

/* O marcador é o que se lê primeiro nesta trilha — o rótulo ao lado é apoio,
   em 12px. Com 26px de chapa e 13px de número ele pesava menos que a palavra
   que explica, e a numeração (que é a mesma dos blocos do formulário) sumia.
   32px/15px devolvem a hierarquia. O alinhamento vertical com o rótulo não
   depende desta medida: quem centra é o `align-items: center` do item. */
.site-etapas__num {
    flex: 0 0 auto;
    display: grid;
    place-items: center;
    width: 32px;
    height: 32px;
    border-radius: 50%;
    background: var(--turquesa-fundo);
    color: var(--acao-forte);
    font-size: .9375rem;
    line-height: 1;
}

/* O traço entre marcadores é ::after do item, não elemento no HTML.

   ELE ONDULA, e não é enfeite solto: é a mesma curva do divisor entre seções
   (`.site-onda`), na escala de 12px. A página inteira separa blocos com onda;
   uma trilha de etapas com risco reto era o único lugar onde a marca falava
   outra língua.

   A curva é MÁSCARA, não `background-image`. Como imagem de fundo, a cor teria
   de ser escrita dentro do data URI — um sexto lugar guardando o valor de
   `--linha-forte`, que sairia do lugar no dia em que a paleta mudasse. Como
   máscara, o SVG só recorta a forma e quem pinta continua sendo o token.

   O padrão tem exatamente UM PERÍODO (32px: sobe até o pico, desce até o vale,
   volta ao meio). Com um período inteiro as tangentes das duas pontas
   coincidem e a repetição emenda sem bico; com meio período, cada emenda
   viraria um "V".

   O período é LONGO e a amplitude baixa (32px por 2,6px de altura útil) porque
   a referência é a onda do divisor de seção, que é larga e rasa. A primeira
   tentativa usou 12px de período: na trilha de ~200px aquilo virava um
   zigue-zague miúdo, que lê como tracejado decorativo e não como água. */
.site-etapas__item::after {
    content: '';
    flex: 1 1 auto;
    height: 8px;
    background: var(--linha-forte);
    -webkit-mask-image: var(--onda-linha-h);
    mask-image: var(--onda-linha-h);
    -webkit-mask-repeat: repeat-x;
    mask-repeat: repeat-x;
    -webkit-mask-size: 32px 8px;
    mask-size: 32px 8px;
    -webkit-mask-position: left center;
    mask-position: left center;
}

/* Sem suporte a máscara o traço não pode sumir: a trilha ficaria com três
   selos soltos e nenhuma ligação entre eles. Volta o risco reto de antes. */
@supports not ((-webkit-mask-image: none) or (mask-image: none)) {
    .site-etapas__item::after {
        height: 2px;
        border-radius: var(--raio-pill);
    }
}

.site-etapas__item:last-child::after {
    content: none;
}

/* A ÚLTIMA ETAPA NÃO DIVIDE A LARGURA COM AS OUTRAS. Com `flex: 1 1 0` nos
   três, ela ganhava um terço da linha e ocupava só o começo dele — quem
   preencheria o resto é o traço que a regra acima acabou de remover. Sobrava
   um vão à direita e a trilha terminava antes do cartão, desalinhada dos
   blocos de baixo, que vão de ponta a ponta. Encolhida ao tamanho do próprio
   conteúdo, ela devolve o espaço para os traços dos dois primeiros e
   "Aceites" fecha rente à borda. `0 1 auto`, e não `0 0 auto`: em tela
   estreita o item ainda precisa poder ceder. */
.site-etapas__item:last-child {
    flex: 0 1 auto;
}

/* Em 320px quatro rótulos escritos não cabem de jeito nenhum; sobram os
   marcadores numerados, que é o que a trilha precisa comunicar. */
.site-etapas__rotulo {
    display: none;
}

@media (min-width: 600px) {
    .site-etapas__rotulo { display: inline; }
}

/* Numeração dos blocos do formulário, casada com a trilha acima. O contador
   nasce no <form> e avança a cada bloco, então inserir ou remover um bloco no
   Blade não desalinha nada. */
.site-form {
    counter-reset: site-bloco;
}

.site-form__bloco {
    counter-increment: site-bloco;
}

/* O selo do bloco cresce junto com o da trilha (22px/12px eram menos que o
   ícone de 36px ao lado, e o número que abre o bloco ficava lendo como nota
   de rodapé). 28px/14px o põem no mesmo peso da legenda.

   O `vertical-align` foi MEDIDO, não estimado: com `-5px` o centro do selo
   caía 6px abaixo do centro da linha do rótulo — ele parecia pendurado. Como
   a caixa é uma `inline-grid` de altura par com o número centrado, a linha de
   base dela já cai no lugar certo, e é `0` que faz o centro do selo coincidir
   com o centro do texto ao lado. Mexer no tamanho aqui obriga a refazer essa
   conta. */
.site-form__legenda::before {
    content: counter(site-bloco);
    display: inline-grid;
    place-items: center;
    width: 28px;
    height: 28px;
    margin-right: var(--esp-2);
    border-radius: 50%;
    background: var(--acao);
    color: #fff;
    font-size: .875rem;
    line-height: 1;
    vertical-align: 0;
}

/* =========================================================================
   §2.12 FAQ em duas colunas
   ========================================================================= */

.site-faq__grid {
    display: grid;
    grid-template-columns: 1fr;
    gap: var(--esp-6);
    align-items: start;
}

.site-faq__grid > * { min-width: 0; }

@media (min-width: 1024px) {
    .site-faq__grid {
        grid-template-columns: minmax(0, .85fr) minmax(0, 1.15fr);
        gap: var(--esp-7);
    }
}

.site-faq__apoio p {
    color: var(--tinta-media);
}

.site-faq__apoio-arte {
    display: block;
    max-width: 240px;
    margin-top: var(--esp-5);
}

/* A coluna de apoio acompanha a rolagem enquanto a lista de perguntas é longa;
   no celular ela é só o texto de abertura, no fluxo normal. */
@media (min-width: 1024px) {
    .site-faq__apoio {
        position: sticky;
        top: calc(var(--altura-header) + var(--esp-5));
    }
}

.site-faq__lista {
    display: grid;
    gap: var(--esp-3);
}

/* O `.site-faq` original tem teto de 820px, que faz sentido quando ele ocupa a
   página inteira. Dentro da grade de duas colunas quem define a largura é a
   coluna. */
.site-faq__grid .site-faq,
.site-faq__lista.site-faq {
    max-width: none;
}

/* =========================================================================
   §2.13 Rodapé com divisor de onda
   -------------------------------------------------------------------------
   A curva já dá o respiro que o topo do rodapé pedia, então o padding superior
   encolhe na mesma medida: a página não fica mais alta por causa do enfeite.
   ========================================================================= */

.site-onda--para-navy {
    color: var(--navy);
}

.site-onda--para-navy + .site-footer {
    padding-top: var(--esp-6);
}

.site-footer .site-onda {
    margin-bottom: 0;
}

/* =========================================================================
   §2.14 Revelação ao rolar
   -------------------------------------------------------------------------
   O estado inicial (invisível) mora DENTRO de `no-preference` de propósito:
   quem pediu menos movimento no sistema recebe o conteúdo já visível, sem
   depender de o JavaScript rodar. E como a classe `.is-visivel` só é aplicada
   pelo IntersectionObserver, se o script falhar ou o navegador não tiver o
   observer o conteúdo também aparece — o Blade deve marcar isso desligando a
   classe no `<html>`, mas o CSS não deixa a página em branco de qualquer jeito.
   ========================================================================= */

@media (prefers-reduced-motion: no-preference) {
    .site-revelar {
        opacity: 0;
        transform: translateY(14px);
        transition: opacity 420ms ease-out, transform 420ms ease-out;
    }

    .site-revelar.is-visivel {
        opacity: 1;
        transform: none;
    }
}

/* =========================================================================
   Elevação no hover — só em ponteiro fino
   -------------------------------------------------------------------------
   Num aparelho de toque o `:hover` fica preso depois do toque e o cartão
   permanece levantado até o próximo toque em outro lugar. Todo hover que mexe
   em geometria mora aqui; hover que só troca cor pode viver solto.
   ========================================================================= */

@media (hover: hover) and (pointer: fine) {
    .site-extra:hover {
        transform: translateY(-3px);
        box-shadow: var(--sombra);
    }

    .site-problema--destaque {
        transition: box-shadow var(--transicao), border-color var(--transicao);
    }

    .site-problema--destaque:hover {
        border-color: var(--teal);
        box-shadow: var(--sombra);
    }

    .site-tela {
        transition: box-shadow var(--transicao);
    }
}

/* =========================================================================
   Impressão — complemento da Etapa 2
   -------------------------------------------------------------------------
   Enfeite não vai para o papel: onda, flutuantes, tela sobreposta e a foto de
   fundo da faixa escura saem, e a revelação ao rolar é neutralizada para
   nenhum bloco sair em branco.
   ========================================================================= */

@media print {
    .site-onda,
    .site-flutuante,
    .site-hero__tela,
    .site-beneficios__foto,
    .site-extra__arte { display: none !important; }

    .site-beneficios::before { display: none; }

    .site-revelar {
        opacity: 1 !important;
        transform: none !important;
    }
}

/* =========================================================================
   Movimento reduzido — bloco final obrigatório (§5 do contrato)
   -------------------------------------------------------------------------
   Forma canônica pedida pelo contrato, mantida literal e por último no arquivo.
   O bloco antigo (mais acima) já zera tudo com `animation: none`, que é uma
   trava mais dura e continua valendo — este aqui é a rede de segurança para
   qualquer regra nova que venha a ser acrescentada depois dele.
   ========================================================================= */

@media (prefers-reduced-motion: reduce) {
    *,
    *::before,
    *::after {
        animation-duration: .001ms !important;
        animation-iteration-count: 1 !important;
        transition-duration: .001ms !important;
        scroll-behavior: auto !important;
    }
}

/* =========================================================================
   Janela de termos e política
   -------------------------------------------------------------------------
   Serve para ler o documento sem sair do formulário, preservando o que já foi
   digitado. O conteúdo vem da própria página legal (ver o script no layout),
   então não há texto duplicado para sair de sincronia.
   ========================================================================= */

.site-modal[hidden] { display: none; }

.site-modal {
    position: fixed;
    inset: 0;
    z-index: 100;
    display: grid;
    place-items: center;
    padding: var(--esp-4);
}

.site-modal__fundo {
    position: absolute;
    inset: 0;
    background: rgba(10, 38, 56, .55);
}

.site-modal__caixa {
    position: relative;
    display: flex;
    flex-direction: column;
    width: min(760px, 100%);
    /* Teto de altura para a janela nunca passar da tela: quem rola é o corpo,
       não a página atrás. */
    max-height: min(82vh, 720px);
    background: var(--superficie);
    border-radius: var(--raio-lg);
    box-shadow: 0 24px 60px rgba(10, 38, 56, .35);
    overflow: hidden;
}

.site-modal__topo,
.site-modal__base {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: var(--esp-4);
    flex: 0 0 auto;
    padding: var(--esp-4) var(--esp-5);
}

.site-modal__topo { border-bottom: 1px solid var(--linha); }
.site-modal__base { border-top: 1px solid var(--linha); }

.site-modal__titulo {
    margin: 0;
    font-family: var(--fonte-titulo);
    font-size: 1.125rem;
    color: var(--navy);
}

.site-modal__fechar {
    display: grid;
    place-items: center;
    width: var(--toque);
    height: var(--toque);
    border: 0;
    border-radius: var(--raio-sm);
    background: transparent;
    color: var(--tinta-media);
    font-size: 1.5rem;
    line-height: 1;
    cursor: pointer;
}

.site-modal__fechar:hover {
    background: var(--turquesa-fundo);
    color: var(--navy);
}

/* O corpo é a única área rolável, e recebe o foco ao abrir para que a rolagem
   por teclado funcione sem precisar tabular até algum link do texto. */
.site-modal__corpo {
    flex: 1 1 auto;
    overflow-y: auto;
    padding: var(--esp-5);
    color: var(--tinta);
}

.site-modal__corpo h1,
.site-modal__corpo h2 {
    font-size: 1.25rem;
    color: var(--navy);
}

.site-modal__corpo h3 { font-size: 1.0625rem; }

.site-modal__carregando {
    color: var(--tinta-media);
    font-style: italic;
}

.site-modal__link {
    color: var(--acao-forte);
    font-size: .875rem;
    font-weight: 600;
}

/* Trava a rolagem do documento atrás da janela. */
.site-sem-rolagem { overflow: hidden; }

/* =========================================================================
   Hero — rodízio de telas dentro do mesmo aparelho
   -------------------------------------------------------------------------
   O aparelho, o tamanho e a posição continuam os mesmos; o que muda é a
   imagem dentro dele. As telas ficam empilhadas no mesmo lugar e só a ativa
   aparece — assim a moldura não muda de altura a cada troca e não há salto de
   layout.
   ========================================================================= */

.site-hero__tela[data-hero-telas] {
    /* Cria o contexto para empilhar os quadros e ancorar os pontos. */
    position: absolute;
}

.site-hero__quadro {
    display: block;
}

/* Do segundo em diante, sai do fluxo e fica por cima do primeiro. O primeiro
   permanece no fluxo para dar altura à moldura. */
.site-hero__quadro:not(:first-child) {
    position: absolute;
    inset: 6px;           /* o padding da moldura do telefone */
}

.site-hero__quadro img {
    display: block;
    width: 100%;
    height: 100%;
    object-fit: cover;
    object-position: top center;
    border-radius: 22px;
}

/* Sem script, o :first-child aparece e os demais ficam escondidos. Com script,
   a classe .is-ativo comanda. */
.site-hero__quadro:not(.is-ativo) { opacity: 0; }
.site-hero__quadro.is-ativo { opacity: 1; }

@media (prefers-reduced-motion: no-preference) {
    .site-hero__quadro { transition: opacity 420ms ease-out; }
}

.site-hero__controles {
    position: absolute;
    bottom: -34px;
    left: 50%;
    transform: translateX(-50%);
    display: flex;
    align-items: center;
    gap: var(--esp-2);
}

.site-hero__controles[hidden] { display: none; }

.site-hero__pontos {
    display: flex;
    align-items: center;
    gap: var(--esp-2);
}

/* Seta discreta: contorno leve, sem preenchimento, do tamanho de um ponto de
   toque. A primeira aponta para a esquerda por rotação — o conjunto de ícones
   tem uma seta só, e girá-la evita um desenho novo para dizer o oposto. */
.site-hero__seta {
    display: grid;
    place-items: center;
    width: 30px;
    height: 30px;
    padding: 0;
    border: 1px solid var(--linha-forte);
    border-radius: 50%;
    background: rgba(255, 255, 255, .82);
    color: var(--tinta-media);
    cursor: pointer;
    transition: border-color var(--transicao), color var(--transicao), background var(--transicao);
}

.site-hero__seta svg {
    width: 16px;
    height: 16px;
}

.site-hero__seta[data-hero-passo="-1"] svg {
    transform: rotate(180deg);
}

.site-hero__seta:hover {
    border-color: var(--acao);
    background: var(--superficie);
    color: var(--acao-forte);
}

/* Alvo de toque de 44px sem inflar o desenho de 30px. */
.site-hero__seta::after {
    content: '';
    position: absolute;
    width: var(--toque);
    height: var(--toque);
}

.site-hero__seta { position: relative; }

/* Alvo de toque de 44px com marcador visual de 8px: o botão é pequeno aos
   olhos e grande ao dedo. */
.site-hero__ponto {
    position: relative;
    width: 8px;
    height: 8px;
    padding: 0;
    border: 0;
    border-radius: 50%;
    background: var(--linha-forte);
    cursor: pointer;
    transition: background var(--transicao);
}

.site-hero__ponto::after {
    content: '';
    position: absolute;
    top: 50%;
    left: 50%;
    width: var(--toque);
    height: var(--toque);
    transform: translate(-50%, -50%);
}

.site-hero__ponto.is-ativo { background: var(--acao); }
.site-hero__ponto:hover { background: var(--teal); }

/* =========================================================================
   Benefícios — refino de espaçamento (etapa 3)
   -------------------------------------------------------------------------
   Nada muda de estrutura, cor ou conteúdo: a seção escura com a fotografia
   continua igual. O que se ajusta é o ritmo vertical, que estava irregular —
   o cabeçalho encostava nas frases, as frases encostavam nos cartões e a
   fileira final vinha grudada, o que fazia a seção parecer mais apertada do
   que as outras.
   ========================================================================= */

.site-beneficios {
    /* Mais ar em cima e embaixo: é a única faixa escura da página e precisa
       ler como pausa, não como bloco espremido entre duas seções claras. */
    padding-block: var(--esp-8);
}

@media (min-width: 768px) {
    .site-beneficios { padding-block: var(--esp-9); }
}

/* Distância do cabeçalho (olho + título) para as frases. */
.site-beneficios .site-secao__cabecalho {
    margin-bottom: var(--esp-7);
}

/* As quatro frases e os quatro cartões são blocos irmãos: o vão entre eles
   precisa ser maior que o vão interno de cada um, senão o olho lê tudo como
   uma coisa só. */
.site-beneficios .site-grid > .site-beneficios__frases {
    margin-bottom: var(--esp-7);
}

@media (min-width: 1024px) {
    .site-beneficios .site-grid > .site-beneficios__frases {
        margin-bottom: var(--esp-8);
    }
}

/* Cartões da faixa escura: respiro interno maior, para o texto não encostar
   na borda translúcida. */
.site-beneficios .site-card {
    padding: var(--esp-5);
}

/* A fileira final ganha um filete acima: separa os quatro benefícios menores
   dos quatro cartões sem precisar de mais espaço vertical. */
/* O divisor entre os cartões e a lista de ganhos ondula, como o resto da
   página. Ele é `::before` posicionado, e não `border-top`: a lista é grid, e
   um pseudo-elemento no fluxo viraria mais uma célula, empurrando os quatro
   itens de lugar.

   A cor sobe de 14% para 22% de branco porque a curva ocupa menos área que um
   risco reto de ponta a ponta — no mesmo tom ela quase sumia sobre a faixa
   escura. */
.site-beneficios__lista {
    position: relative;
    margin-top: var(--esp-8);
    padding-top: var(--esp-6);
}

.site-beneficios__lista::before {
    content: '';
    position: absolute;
    top: 0;
    right: 0;
    left: 0;
    height: 8px;
    background: rgba(255, 255, 255, .22);
    -webkit-mask-image: var(--onda-linha-h);
    mask-image: var(--onda-linha-h);
    -webkit-mask-repeat: repeat-x;
    mask-repeat: repeat-x;
    -webkit-mask-size: 32px 8px;
    mask-size: 32px 8px;
    -webkit-mask-position: left center;
    mask-position: left center;
}

/* Sem máscara o divisor não pode sumir: os quatro ganhos encostariam nos
   cartões sem nada separando. Volta o filete reto. */
@supports not ((-webkit-mask-image: none) or (mask-image: none)) {
    .site-beneficios__lista::before {
        height: 1px;
        background: rgba(255, 255, 255, .14);
        -webkit-mask-image: none;
        mask-image: none;
    }
}

/* Alinhamento uniforme dos quatro itens finais: com `center` os de uma linha e
   os de duas linhas ficavam com o ícone em alturas diferentes. */
@media (min-width: 640px) {
    .site-beneficios__lista > * { align-items: flex-start; }
}

/* =========================================================================
   Formulário de cadastro — compactação (etapa 3)
   -------------------------------------------------------------------------
   Nenhum campo saiu, nenhuma validação mudou, a submissão continua única. O
   que muda é a densidade: a tela ocupava quase três dobras e o visitante
   perdia de vista o que estava preenchendo.
   ========================================================================= */

/* Blocos mais próximos entre si: o filete da legenda já separa um do outro,
   então o vão grande era redundante. */
.site-form__bloco { margin-bottom: var(--esp-5); }
.site-form__legenda { margin-bottom: var(--esp-3); }

/* Campos relacionados mais próximos na vertical do que na horizontal: o olho
   percorre a coluna, e o vão largo fazia cada campo parecer isolado. */
@media (min-width: 768px) {
    .site-form__grid { gap: var(--esp-3) var(--esp-4); }
}

/* Texto de apoio do campo: era do mesmo tamanho do rótulo e competia com ele. */
.site-campo__dica {
    font-size: .8125rem;
    line-height: 1.45;
}

/* Bloco do plano dentro do formulário: os três cartões de escolha não
   precisam do mesmo peso dos cartões da vitrine — aqui a decisão já foi
   tomada lá em cima e isto é confirmação. */
.site-form .site-plano-escolha { gap: var(--esp-3); }

/* Aviso de pagamento manual: informação, não alerta. Menos padding e menos
   corpo, para não roubar a atenção do botão de enviar logo abaixo. */
.site-form .site-aviso {
    padding: var(--esp-4);
    font-size: .875rem;
}


/* =========================================================================
   Funcionalidades — equilíbrio das linhas com captura de telefone
   -------------------------------------------------------------------------
   Com as listas recolhidas, a coluna de texto ficou com ~230px de altura. Ao
   lado, a captura de telefone renderizava com 664px (a tela tem proporção
   1:2,17), o que deixava mais de 400px de vazio na linha — medido, não
   estimado.

   Duas correções, ambas locais:

   1) a moldura do telefone passa a ENQUADRAR a captura, em vez de exibi-la
      inteira: proporção 1:1,6, ancorada no topo. Some a barra de abas do
      rodapé do aplicativo, que é justamente a faixa sem informação; o que
      interessa (cabeçalho, dados, ações) fica todo à vista. O aplicativo
      inteiro continua sendo mostrado no rodízio do hero;

   2) nessas linhas o texto ganha a coluna maior. Antes a captura levava a
      coluna larga e ainda sobrava espaço nela — o desequilíbrio aparecia dos
      dois lados.
   ========================================================================= */

@media (min-width: 1024px) {
    /* Linha cuja figura é um telefone: texto na coluna maior. */
    .site-split:has(.site-tela--telefone) {
        grid-template-columns: 1.25fr .75fr;
    }

    .site-split--invertido:has(.site-tela--telefone) {
        grid-template-columns: .75fr 1.25fr;
    }
}

.site-split .site-tela--telefone {
    /* Teto de largura menor que o do hero: aqui o aparelho acompanha um texto,
       não é o assunto da composição. 240px deixa a linha com ~170px de folga
       vertical, contra os 433px do estado anterior — e a captura continua
       legível, porque o que se lê nela são números e rótulos grandes. */
    max-width: 240px;
    margin-inline: auto;
}

.site-split .site-tela--telefone picture,
.site-split .site-tela--telefone img {
    display: block;
    width: 100%;
}

.site-split .site-tela--telefone img {
    aspect-ratio: 1 / 1.6;
    height: auto;
    object-fit: cover;
    object-position: top center;
}

/* No celular a linha é uma coluna só e não há vizinho para equilibrar: a
   captura volta a aparecer inteira, que é a melhor leitura ali. */
@media (max-width: 1023.98px) {
    .site-split .site-tela--telefone img {
        aspect-ratio: auto;
        object-fit: fill;
    }
}

/* Legenda alinhada ao aparelho, e não à coluna: com o telefone estreito no
   meio de uma coluna larga, a legenda encostada à esquerda parecia pertencer a
   outro elemento. */
.site-split .site-figura:has(.site-tela--telefone) figcaption {
    max-width: 260px;
    margin-inline: auto;
    text-align: center;
}

/* =========================================================================
   Janela de "cadastro recebido"
   -------------------------------------------------------------------------
   Reaproveita inteira a janela de termos (.site-modal): o que muda é o CORPO.
   Lá o conteúdo vem pronto da página legal, com os respiros dele; aqui ele é
   escrito na própria janela, e são estas três regras que faltavam.
   ========================================================================= */

/* O último bloco do corpo não precisa da margem inferior que ele carrega por
   ser parágrafo, lista ou alerta: o respiro do rodapé da janela já vem do
   `padding` de .site-modal__corpo, e a margem o dobrava. */
.site-modal__corpo > :last-child {
    margin-bottom: 0;
}

/* Próximos passos. Lista ordenada de verdade — a numeração é do navegador, e
   não de um `::before` com contador, para o leitor de tela anunciar "1 de 3".
   Só o espaçamento entre os itens e o peso do número são desta folha. */
.site-modal__passos li + li {
    margin-top: var(--esp-3);
}

.site-modal__passos li::marker {
    font-weight: 700;
    color: var(--navy);
}

/* O "x" da confirmação é um link (precisa fechar sem JavaScript), e link ganha
   sublinhado no hover por regra geral. Em botão de ícone isso vira um traço
   solto embaixo do glifo. */
a.site-modal__fechar:hover {
    text-decoration: none;
}

/* =========================================================================
   Cadastro sem seletor de plano — coluna única
   -------------------------------------------------------------------------
   O resumo lateral saiu junto com a escolha de plano: sem mensalidade não há
   valor, ciclo nem limite a resumir ao lado do formulário. Sobrou um filho só
   dentro de `.site-cadastro__grid`, e a partir de 1024px ele ficaria preso na
   coluna de 1.6fr com a coluna estreita vazia à direita.

   O modificador desfaz as duas colunas e segura a largura.

   O teto era 760px, herdado de quando o formulário dividia a linha com o
   resumo: a largura certa para UMA coluna de um par. Sozinho no meio de 1140,
   o cartão virava uma faixa estreita com folga inútil dos dois lados, e cada
   campo ficava com ~350px — um <select> de natureza jurídica e um CNPJ com
   dica de duas linhas cabiam, mas apertados.

   920px é o teto de um formulário de duas colunas: ~420px por campo, que é a
   largura em que um rótulo, um input e a dica abaixo dele leem sem quebrar.
   Não vai além disso porque o cartão é branco sobre faixa clara — passando de
   ~950px ele perde a silhueta de cartão e vira fundo.
   ========================================================================= */

.site-cadastro__grid--solo {
    max-width: 920px;
    margin-inline: auto;
}

@media (min-width: 1024px) {
    .site-cadastro__grid--solo {
        grid-template-columns: minmax(0, 1fr);
    }
}

/* =========================================================================
   Destaque — painel largo com ícone à esquerda
   -------------------------------------------------------------------------
   Para a frase que precisa sair do ritmo dos cartões sem virar outra seção.
   Nasceu para "Continue vendendo pelo WhatsApp", em Pagamentos: é uma objeção
   respondida, e no meio de três cartões iguais ela passava despercebida.

   Fundo menta e não branco: sobre a faixa clara da seção, um cartão branco a
   mais seria só mais um cartão. O texto continua em `--tinta`/`--acao-forte`,
   nunca no turquesa claro.
   ========================================================================= */

.site-destaque {
    display: grid;
    grid-template-columns: 1fr;
    gap: var(--esp-4);
    margin-top: var(--esp-5);
    padding: var(--esp-5);
    background: var(--turquesa-fundo);
    border: 1px solid #CFE5E3;
    border-radius: var(--raio-lg);
}

/* A partir do tablet o ícone assume a coluna estreita e o texto ocupa o resto.
   No celular ele fica em cima, porque duas colunas em 320px espremeriam o
   parágrafo em quatro palavras por linha. */
@media (min-width: 768px) {
    .site-destaque {
        grid-template-columns: auto minmax(0, 1fr);
        gap: var(--esp-5);
        align-items: start;
        padding: var(--esp-6);
    }
}

/* `.site-ic` é inline-grid e ganharia a largura da coluna inteira aqui. */
.site-destaque__ic {
    flex: 0 0 auto;
    justify-self: start;
}

.site-destaque__titulo {
    margin: 0 0 var(--esp-2);
    font-family: var(--fonte-titulo);
    font-size: 1.125rem;
    font-weight: 700;
    color: var(--navy);
}

.site-destaque__texto {
    margin: 0;
    color: var(--tinta-media);
}

@media (min-width: 768px) {
    .site-destaque__titulo { font-size: 1.25rem; }
}

/* =========================================================================
   Oferta única — os três números do preço
   -------------------------------------------------------------------------
   Substitui a grade de planos: não há mais o que comparar. O bloco tem duas
   partes empilhadas — a faixa dos três números e o corpo com a lista do que
   está incluído — dentro de um cartão só, para o preço e a promessa lerem-se
   como uma coisa só.

   Nenhum valor mora aqui: os três saem de `Finance\PlatformPricing`, pelo
   LandingController. Esta folha só decide o tamanho deles.
   ========================================================================= */

.site-oferta {
    max-width: 880px;
    margin-inline: auto;
    background: var(--superficie);
    border: 1px solid var(--linha);
    border-radius: var(--raio-lg);
    box-shadow: var(--sombra);
    overflow: hidden;
}

/* A faixa dos números. Uma coluna no celular (três números lado a lado em
   320px cairiam para duas linhas cada) e três a partir de 480px. */
.site-oferta__numeros {
    display: grid;
    grid-template-columns: 1fr;
    gap: 1px;
    margin: 0;
    padding: 0;
    background: var(--linha);
}

@media (min-width: 480px) {
    .site-oferta__numeros {
        grid-template-columns: repeat(3, minmax(0, 1fr));
    }
}

/* O fundo do item é que pinta a faixa; o `gap: 1px` da grade acima vira a
   divisória entre eles, sem uma borda por item que dobraria nas junções. */
.site-oferta__numero {
    min-width: 0;
    padding: var(--esp-5) var(--esp-4);
    background: var(--superficie);
    text-align: center;
}

/* O número que a página inteira prepara: a taxa por venda. Recebe a chapa
   menta para o olho parar nele antes dos dois zeros. */
.site-oferta__numero--realce {
    background: var(--turquesa-fundo);
}

.site-oferta__numero dd {
    margin: 0;
}

.site-oferta__valor {
    display: block;
    font-family: var(--fonte-titulo);
    font-size: 2.25rem;
    font-weight: 800;
    line-height: 1.1;
    color: var(--navy);
}

@media (min-width: 768px) {
    .site-oferta__valor { font-size: 2.75rem; }
}

/* Rótulo em `--tinta-media`: passa AA sobre o branco e sobre o menta. O
   turquesa claro nunca é cor de texto neste arquivo. */
.site-oferta__rotulo {
    display: block;
    margin-top: var(--esp-1);
    font-size: .875rem;
    color: var(--tinta-media);
}

.site-oferta__corpo {
    padding: var(--esp-5);
    border-top: 1px solid var(--linha);
}

@media (min-width: 768px) {
    .site-oferta__corpo { padding: var(--esp-6); }
}

.site-oferta__titulo {
    margin: 0 0 var(--esp-4);
    font-family: var(--fonte-titulo);
    font-size: 1.0625rem;
    font-weight: 700;
    color: var(--navy);
}

.site-oferta__acao {
    margin-top: var(--esp-5);
    text-align: center;
}

/* Em 320px o botão ocupa a linha inteira; a partir do tablet ele volta a ter a
   largura do próprio rótulo, para não virar uma barra atravessando o cartão. */
.site-oferta__acao .site-btn {
    width: 100%;
}

@media (min-width: 480px) {
    .site-oferta__acao .site-btn {
        width: auto;
        min-width: 260px;
    }
}

.site-oferta__nota {
    margin: var(--esp-3) 0 0;
    font-size: .875rem;
    color: var(--tinta-media);
}

/* "Como o SurfApp ganha dinheiro?": mesma largura do cartão da oferta, para as
   duas peças formarem uma coluna só no centro da seção.

   `.site-oferta__alternativa` (o plano mensal) entra na MESMA regra de
   propósito: as três peças da seção — oferta, explicação e alternativa —
   formam uma coluna única no centro, e uma largura própria para a terceira
   faria a coluna terminar torta. Ela vem depois da explicação, e não ao lado:
   lado a lado seriam duas ofertas a escolher, e não é isso — a conta por
   comissão é o caminho de quem chega, o plano mensal é a saída de quem cobra
   por fora. */
.site-oferta__explicacao,
.site-oferta__alternativa {
    max-width: 880px;
    margin: var(--esp-5) auto 0;
}

/* O botão dentro de um cartão de texto. Fantasma e alinhado à esquerda, junto
   do parágrafo que ele conclui: centralizado ele leria como a ação da seção,
   que é o "Começar agora" do cartão da oferta, logo acima. */
.site-cartao__acao {
    margin: var(--esp-4) 0 0;
}

/* =========================================================================
   Aviso de sistema em validacao (faixa beta)

   A FAIXA E DO AMBIENTE, NAO DA PAGINA. Por isso ela sangra de ponta a ponta,
   nao tem borda em cima nem embaixo e fica ACIMA do cabecalho: emoldura-la ou
   centraliza-la num container a transformaria num cartao de aviso dentro do
   conteudo, que e outra coisa.

   COR: o PAR de superficie de aviso da paleta — `--alerta-fundo` (#FBF0DC,
   amarelo pastel) com texto em `--alerta-texto` (#8A5F14, ambar escuro).
   Contraste medido: 4,99:1, acima do 4,5:1 exigido pela AA.

   O token SOLIDO `--alerta` (#C08A3E) foi tentado como fundo e reprovado no
   olho: e o tom de icone e filete, nao de superficie, e como faixa larga fica
   pesado demais e derruba o contraste do texto. O par pastel resolve os dois
   de uma vez.

   O QUE SEGURA A LEITURA DE "AVISO" com fundo suave e sem borda: o triangulo
   de atencao antes da frase (ver `.beta-aviso__texto::before`) e o peso 600.
   Sem eles, um retangulo pastel de ponta a ponta passa por faixa informativa
   neutra.

   Esta mesma regra existe, com os tokens de cada casa, em public/css/portal.css
   e public/css/admin/surfapp-admin.css. Sao tres folhas independentes e
   nenhuma importa a outra; repetir doze linhas e mais barato do que uma quarta
   folha que as tres passariam a baixar.
   ========================================================================= */

.beta-aviso {
    /* Triangulo de atencao. MASCARA, e nao imagem: quem pinta e
       `currentColor`, entao o icone acompanha `--alerta-texto` e a cor tem uma
       definicao so. Mesmo criterio de `--onda-linha-h` la em cima.
       `fill-rule='evenodd'` vaza a barra e o ponto de exclamacao. */
    --beta-icone: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='%23fff' fill-rule='evenodd' d='M12 2.5 22.5 21 1.5 21 Z M10.9 9 h2.2 v6.5 h-2.2 Z M10.9 17.2 h2.2 v2 h-2.2 Z'/%3E%3C/svg%3E");

    /* Sem `max-width`, sem `margin-inline`: a faixa vai de x=0 a 100%. */
    width: 100%;
    padding: var(--esp-2) var(--esp-4);
    /* Explicito porque o requisito e explicito: nada de filete em cima nem
       embaixo. A separacao vem da propria cor. */
    border: 0;
    background: var(--alerta-fundo);
    color: var(--alerta-texto);
    text-align: center;
}

.beta-aviso__texto {
    /* `p` do site tem `margin-bottom: var(--esp-4)`; aqui ele viraria um vao
       amarelo embaixo do texto. */
    margin: 0;
    font-size: .875rem;
    line-height: 1.4;
    font-weight: 600;
}

/* No `::before` do texto, e nao no da faixa: assim o icone e a primeira linha
   andam juntos quando a frase quebra no celular, em vez de o icone ficar
   sozinho numa linha propria. */
.beta-aviso__texto::before {
    content: "";
    display: inline-block;
    width: 1.05em;
    height: 1.05em;
    margin-right: .45em;
    /* Alinha o centro do triangulo com a altura de x da fonte. */
    vertical-align: -.16em;
    background-color: currentColor;
    -webkit-mask: var(--beta-icone) center / contain no-repeat;
    mask: var(--beta-icone) center / contain no-repeat;
}

/* -------------------------------------------------------------------------
   O CABECALHO FIXO PRECISA SAIR DA FRENTE

   `.site-header` e `position: fixed` e o <body> reserva a altura dele em
   `padding-top`. Com a faixa no fluxo, ela comecaria DEPOIS desse padding e o
   cabecalho ficaria por cima dela.

   A saida nao pode ser somar a altura da faixa ao `padding-top`: o texto e
   editavel e quebra em duas ou tres linhas no celular, entao qualquer numero
   escrito aqui erra em alguma largura.

   Com a faixa presente, o cabecalho passa a `sticky` — ele volta ao fluxo,
   fica logo abaixo da faixa sem que ninguem meca nada, e continua grudando no
   topo ao rolar. O `padding-top` do <body> sai junto, porque em fluxo o
   cabecalho ja ocupa o proprio espaco.

   `:has()` em vez de uma classe no <body>: assim o layout nao precisa
   consultar o servico que decide se o aviso aparece — quem decide continua
   sendo so o componente.

   Sem a faixa (o caso normal, fora do periodo de validacao) nada disto casa e
   o site fica exatamente como estava.
   ------------------------------------------------------------------------- */

body:has(> .beta-aviso) {
    padding-top: 0;
}

body:has(> .beta-aviso) .site-header {
    position: sticky;
    /* Em `sticky`, `left`/`right` prendem o elemento na horizontal; herdados
       do `fixed` eles nao servem para nada aqui. */
    left: auto;
    right: auto;
}

/* =========================================================================
   Página de campanha — o espaço onde o chat monta
   -------------------------------------------------------------------------
   Um bloco só, e é a única regra que a página de campanha precisou acrescentar
   a esta folha: tudo o mais nela (hero, cartões, destaque, botões, faixa
   menta, divisores de onda) é o que a vitrine já usa. Uma landing paga com
   sistema de estilo próprio seria a segunda folha do projeto a divergir da
   marca, e divergiria justamente na página que a campanha compra.

   `:empty` NÃO É REFINAMENTO, É O ESTADO PADRÃO. O bloco nasce vazio no HTML e
   fica vazio até o widget de chat montar dentro dele — e enquanto isso ele não
   pode ocupar uma linha de margem no meio da seção. Sem esta regra, um espaço
   morto de 40px apareceria entre os botões e o desvio de suporte em toda
   visita em que o widget demorasse a carregar, ou não carregasse.

   `display: none` e não `margin: 0`: o filho que o widget injeta pode trazer a
   própria margem, e um bloco vazio de altura zero com margem viva continuaria
   empurrando o que vem depois.

   `min-width: 0` pelo mesmo motivo de toda célula de grade desta folha: o
   widget é HTML de terceiro e pode trazer uma largura fixa; sem isso ela
   empurra a coluna e a página ganha rolagem horizontal a 320px.
   ========================================================================= */

.site-conversa {
    min-width: 0;
    margin-top: var(--esp-5);
}

.site-conversa:empty {
    display: none;
}

/* O grupo de botões da chamada final é centralizado pelo `.site-centro` do
   cabeçalho da seção, que alinha TEXTO. O grupo é flex: o que centraliza os
   filhos dele é `justify-content`, e sem esta linha os dois botões ficariam
   encostados à esquerda numa seção cujo título e apoio estão no meio. */
.site-btn-grupo.site-centro {
    justify-content: center;
}

/* =========================================================================
   Checkout transparente — a tela onde o aluno paga
   -------------------------------------------------------------------------
   Fica NESTA folha, e nao num `checkout.css` proprio, porque a organizacao de
   public/css e um arquivo por AREA (admin, portal, site) e nao por pagina: o
   checkout e uma pagina do site e reaproveita cartao, alerta, selo, campo,
   botao e grade que ja estao aqui em cima. Uma segunda folha significaria
   segundo lugar para a paleta divergir, e um pedido de rede a mais no momento
   em que a pessoa esta decidindo pagar.

   O QUE FOI PRECISO ACRESCENTAR e so o que nao existia: o selo com a cor da
   escola, o valor em destaque, a caixa do QR, a linha do copia-e-cola e a
   moldura dos campos de cartao — que nao sao <input> nossos, e sim <iframe> do
   provedor (ver o comentario do formulario em site/checkout/show.blade.php).

   COR DA ESCOLA: chega em `--checkout-marca` / `--checkout-marca-texto`, no
   atributo `style` do involucro, ja calculada por `App\Support\ReadableColor`.
   Nenhuma das duas tem valor escrito aqui de proposito — a folha e uma so para
   todas as escolas, e nao existe cor de texto fixa que se leia sobre as duas
   pontas de uma paleta que o autor do CSS nunca viu.
   ========================================================================= */

.site-checkout {
    min-width: 0;
}

/* Uma coluna ate 768px, e nao ate 480px como as demais grades do site: a
   coluna da acao carrega um QR de 220px e o formulario de cartao, e nenhum dos
   dois cabe nos ~210px que meia tela de 480px oferece — a pagina ganharia
   rolagem horizontal justamente onde ela nao pode ganhar.

   Numa coluna so vale a ORDEM DO CODIGO, e ela e resumo -> pagamento nas duas
   telas: quem paga confere o valor antes de digitar cartao. Nenhuma regra
   daqui usa `order`. */
.site-checkout .site-grid--2,
.site-checkout__colunas {
    grid-template-columns: 1fr;
}

@media (min-width: 768px) {
    /* A tela de RECIBO (`concluded`) fica em duas colunas iguais: os dois
       cartoes de la sao de leitura, e nenhum tem mais trabalho que o outro. */
    .site-checkout .site-grid--2 { grid-template-columns: repeat(2, minmax(0, 1fr)); }

    /* A tela de PAGAMENTO nao: o peso das colunas e desigual de proposito.
       A esquerda e leitura — valor, codigo da compra, item, aluno: seis linhas
       curtas que nao ganham nada com largura. A direita e onde se trabalha:
       seletor de meio, QR de 220px, seis campos de cartao e o botao. Em
       colunas iguais sobrava branco de um lado e o formulario ficava apertado
       do outro.

       1fr : 1.6fr aqui (38% / 62%) e 1fr : 2fr a partir de 1024px (33% / 67%).
       A proporcao abre com a tela porque so a partir de 1024px o formulario de
       cartao vira duas colunas — e e ai que a largura extra deixa de ser
       espaco e vira uma linha a menos de rolagem. O piso de 1.6fr existe para
       o resumo nao encolher abaixo de ~270px em 768px, onde "R$ 1.234,56" e o
       codigo da compra ainda precisam caber sem quebrar. */
    .site-checkout__colunas { grid-template-columns: minmax(0, 1fr) minmax(0, 1.6fr); }

    /* Os dois cartoes NAO se esticam ate a mesma altura, ao contrario do resto
       do site. Aqui eles nao sao pares: o resumo tem cinco linhas e o cartao da
       acao carrega um formulario de cartao inteiro. Esticados, o resumo virava
       meia tela de branco vazio embaixo do que ele diz. */
    .site-checkout .site-grid--2,
    .site-checkout__colunas { align-items: start; }

    /* `align-items` sozinho nao basta: `.site-cartao` traz `height: 100%`, e a
       porcentagem resolve contra a ALTURA DA LINHA da grade — que continua
       sendo a do cartao mais alto. */
    .site-checkout .site-grid--2 > .site-cartao,
    .site-checkout__colunas > .site-cartao { height: auto; }
}

/* O formulario do cartao so ganha duas colunas quando a pagina passa de
   1024px. Continua sendo o mesmo limite de antes, mas agora por outra conta:
   ate la a coluna de pagamento tem ~380px uteis, e dois campos lado a lado
   dariam ~175px cada — menos do que "MM/AA" e o CVV pedem com 16px de fonte.
   Acima de 1024px a coluna larga entrega ~660px uteis, e ai os pares cabem. */
.site-checkout .site-form__grid {
    grid-template-columns: 1fr;
}

@media (min-width: 1024px) {
    .site-checkout .site-form__grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }

    .site-checkout__colunas { grid-template-columns: minmax(0, 1fr) minmax(0, 2fr); }
}

/* ---- Quem esta cobrando ---- */

.site-checkout__marca {
    display: inline-block;
    max-width: 100%;
    padding: var(--esp-1) var(--esp-3);
    border-radius: var(--raio-pill);
    background: var(--checkout-marca, var(--navy));
    color: var(--checkout-marca-texto, #fff);
    font-family: var(--fonte-titulo);
    font-size: .8125rem;
    font-weight: 700;
    line-height: 1.4;
    /* Nome comprido de escola nao pode esticar a caixa nem quebrar a linha no
       meio de uma palavra. */
    overflow-wrap: anywhere;
}

/* ---- Valor ---- */

.site-checkout__valor {
    margin: 0;
    font-family: var(--fonte-titulo);
    font-size: 2rem;
    font-weight: 700;
    line-height: 1.1;
    letter-spacing: -.01em;
    color: var(--navy);
}

/* =========================================================================
   O RESUMO EM FORMA DE CANHOTO
   -------------------------------------------------------------------------
   A coluna da esquerda das duas telas de checkout (o resumo do que se esta
   pagando, e o recibo depois de pago) e comprovante, e nao formulario. Ela e
   desenhada como o canhoto destacavel de um pagamento: serrilhado nas duas
   pontas, picote entre o cabecalho e o corpo, entalhes nas laterais e os
   numeros em monoespacada, que e o que da cara de comprovante.

   TUDO AQUI E DECORACAO, e decoracao nao pode custar leitura:
     - nenhum texto mora em pseudo-elemento; o que se le e o mesmo <h2>, o
       mesmo valor e o mesmo <dl> de antes;
     - o picote e o unico elemento a mais, vazio e com `aria-hidden` no
       markup, porque nao diz nada;
     - as cores nao mudam: fundo branco e a mesma tinta, com o mesmo
       contraste que o cartao comum ja tinha.

   E NAO USA IMAGEM NENHUMA. Serrilhado por mascara de gradiente conico,
   picote por borda tracejada, entalhes por dois circulos da cor da pagina.
   Nada disso e pedido pela rede, e a CSP desta tela nem deixaria.
   ========================================================================= */

.site-checkout__cupom {
    /* As tres medidas do recorte precisam concordar entre si: o dente e
       cortado por mascara e o entalhe e desenhado por pseudo-elemento. */
    --cupom-passo: 16px;    /* largura de cada dente do serrilhado */
    --cupom-dente: 8px;     /* profundidade do serrilhado */
    --cupom-entalhe: 9px;   /* raio do entalhe lateral */
    --cupom-respiro: var(--esp-5);

    /* Monoespacada do sistema. Sem @font-face e sem download, como o resto da
       tipografia deste arquivo: numero de comprovante alinhado nao vale um
       pedido de rede no momento em que a pessoa esta decidindo pagar. */
    --cupom-mono: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas,
                  "Liberation Mono", "Courier New", monospace;

    gap: 0;
    /* O respiro passa para cada metade do canhoto: o picote precisa atravessar
       de ponta a ponta, e nao parar na borda interna do padding. */
    padding: 0;
}

/* O cabecalho do canhoto: o que e, e quanto e. */
.site-checkout__cupom-topo {
    display: flex;
    flex-direction: column;
    gap: var(--esp-2);
    /* O dente entra na conta do respiro de cima: sem isso o titulo encostaria
       no serrilhado quando a mascara esta ativa. */
    padding: calc(var(--cupom-respiro) + var(--cupom-dente)) var(--cupom-respiro) var(--cupom-respiro);
}

/* O PICOTE — "destaque aqui". Linha de zero altura: quem ocupa espaco sao os
   respiros das duas metades. */
.site-checkout__cupom-picote {
    position: relative;
    height: 0;
    margin: 0 var(--cupom-respiro);
    border-top: 2px dashed var(--linha-forte);
}

/* O corpo. A lista perde a caixa propria (`.site-plano__limites` traz fundo,
   borda e margem): dentro do canhoto a caixa e o canhoto. */
.site-checkout__cupom-linhas {
    margin: 0;
    padding: var(--cupom-respiro) var(--cupom-respiro) calc(var(--cupom-respiro) + var(--cupom-dente));
    background: transparent;
    border: 0;
    border-radius: 0;
}

/* Os NUMEROS do comprovante: valor, codigo da compra, quantidade, data. O
   `tabular-nums` alinha as colunas de digitos, que e metade do efeito. Rotulo
   e texto corrido ficam na fonte do site — monoespacada em frase encompridaria
   o nome do aluno sem ganhar nada. */
.site-checkout__cupom .site-checkout__valor,
.site-checkout__cupom-numero {
    font-family: var(--cupom-mono);
    font-variant-numeric: tabular-nums;
    letter-spacing: 0;
}

/* Monoespacada e mais larga que a Montserrat no mesmo corpo: a 2rem, um valor
   de quatro digitos passava da coluna estreita a 768px. */
.site-checkout__cupom .site-checkout__valor {
    font-size: 1.75rem;
}

/* =========================================================================
   O RECORTE, e por que ele mora inteiro num `@supports`.

   A mascara e o que transforma o retangulo em canhoto — e ela e tambem o que
   obriga a tirar borda, canto arredondado e sombra: mascara corta o pixel, e
   uma borda de 1px viraria um risco reto atravessando os dentes.

   Onde a mascara nao existe (Safari antigo, sobretudo), NADA disso acontece: a
   coluna continua sendo o `.site-cartao` branco de borda fina que ela sempre
   foi, com o picote tracejado por cima. Perde-se o enfeite e nao se perde
   informacao nenhuma — que e a degradacao certa numa tela de cobranca.

   AS TRES CAMADAS da mascara se somam (composicao `add`, o padrao):
     1. dentes apontando para cima, presos no topo;
     2. dentes apontando para baixo, presos na base;
     3. o retangulo do meio, encolhido de um dente em cada ponta.
   Cada dente e o setor de +-45 graus de um gradiente conico: num ladrilho de
   16x8 esse setor e exatamente o triangulo de base 16 e altura 8, e por isso
   as duas medidas nao podem ser escolhidas separadamente.
   ========================================================================= */
@supports (mask-image: conic-gradient(#000, #fff)) {
    .site-checkout__cupom {
        border: 0;
        border-radius: 0;
        box-shadow: none;
        -webkit-mask:
            conic-gradient(from 135deg at top, transparent, #000 1deg 89deg, transparent 90deg)
                0 0 / var(--cupom-passo) var(--cupom-dente) repeat-x,
            conic-gradient(from -45deg at bottom, transparent, #000 1deg 89deg, transparent 90deg)
                0 100% / var(--cupom-passo) var(--cupom-dente) repeat-x,
            linear-gradient(#000 0 0) 0 50% / 100% calc(100% - 2 * var(--cupom-dente)) no-repeat;
        mask:
            conic-gradient(from 135deg at top, transparent, #000 1deg 89deg, transparent 90deg)
                0 0 / var(--cupom-passo) var(--cupom-dente) repeat-x,
            conic-gradient(from -45deg at bottom, transparent, #000 1deg 89deg, transparent 90deg)
                0 100% / var(--cupom-passo) var(--cupom-dente) repeat-x,
            linear-gradient(#000 0 0) 0 50% / 100% calc(100% - 2 * var(--cupom-dente)) no-repeat;
    }

    /* OS ENTALHES LATERAIS, na altura do picote. Sao dois circulos da cor da
       pagina centrados nas bordas do canhoto — o mesmo truque do bilhete de
       cinema. So funcionam porque as duas telas de checkout vivem sempre em
       `.site-secao--areia`, cujo fundo e exatamente `--pagina`; sobre qualquer
       outro fundo eles apareceriam como duas bolas.

       Ficam dentro do `@supports` de proposito: sem a mascara o canhoto ainda
       tem borda e canto arredondado, e meio circulo por cima disso leria como
       defeito, e nao como entalhe. */
    .site-checkout__cupom-picote::before,
    .site-checkout__cupom-picote::after {
        content: '';
        position: absolute;
        top: 50%;
        width: calc(var(--cupom-entalhe) * 2);
        height: calc(var(--cupom-entalhe) * 2);
        transform: translateY(-50%);
        border-radius: 50%;
        background: var(--pagina);
    }

    /* O picote esta recuado do respiro; o centro do circulo tem de cair na
       borda do canhoto, um raio mais para fora. */
    .site-checkout__cupom-picote::before {
        left: calc(-1 * (var(--cupom-respiro) + var(--cupom-entalhe)));
    }

    .site-checkout__cupom-picote::after {
        right: calc(-1 * (var(--cupom-respiro) + var(--cupom-entalhe)));
    }
}

/* ---- Escolha do meio de pagamento ----
   Um meio POR VEZ. Antes os dois vinham empilhados e o formulario de cartao
   ficava sempre aberto, inclusive para quem ia pagar por Pix. O seletor e um
   grupo de radio (`<fieldset>`), e nao `role="tablist"`: isto e uma escolha, e
   nao a navegacao entre vistas do mesmo conteudo — e um tablist honesto
   exigiria gestao de foco em JavaScript, numa tela onde o unico script que
   importa e o da tokenizacao. Mesmo padrao da secao de precos do site. */

.site-checkout__metodos {
    display: flex;
    flex-direction: column;
    gap: var(--esp-5);
    min-width: 0;
    /* Referencia para o painel inativo, que sai do fluxo sem sair do DOM. */
    position: relative;
}

/* Filete entre um meio e o outro: vale para a queda sem `:has()`, quando os
   dois formularios voltam a aparecer empilhados. `~` e nao `+` porque o
   `<fieldset>` do seletor fica entre eles. */
.site-checkout__metodo ~ .site-checkout__metodo {
    padding-top: var(--esp-5);
    border-top: 1px solid var(--linha);
}

.site-checkout__metodo {
    display: flex;
    flex-direction: column;
    gap: var(--esp-3);
    min-width: 0;
}

.site-checkout__escolha {
    border: 0;
    margin: 0;
    padding: 0;
    min-width: 0;
}

/* A trilha: dois alvos de largura igual. Empilham abaixo de 560px, onde o
   texto de apoio de cada um quebraria em tres linhas lado a lado. */
.site-checkout__abas {
    display: grid;
    grid-template-columns: 1fr;
    gap: var(--esp-2);
    padding: 6px;
    background: var(--superficie);
    border: 1px solid var(--linha);
    border-radius: var(--raio-lg);
    box-shadow: var(--sombra-sm);
}

@media (min-width: 560px) {
    .site-checkout__abas { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}

.site-checkout__aba {
    display: block;
    min-height: var(--toque);
    padding: var(--esp-2) var(--esp-3);
    border-radius: 12px;
    text-align: center;
    cursor: pointer;
    color: var(--tinta-media);
    transition: background-color .18s ease, color .18s ease;
}

.site-checkout__aba-titulo {
    display: block;
    font-weight: 700;
    color: inherit;
}

.site-checkout__aba-apoio {
    display: block;
    margin-top: .15rem;
    font-size: .82rem;
    color: inherit;
    opacity: .85;
}

.site-checkout__aba:hover {
    background: var(--turquesa-fundo);
}

/* Estado marcado. `--acao` e o unico turquesa da marca aprovado para
   contraste, e o texto sobre ele e branco (7,1:1). A COR DA ESCOLA nao entra
   aqui de proposito: ela ja e o fundo do topo e nao ha como garantir contraste
   de uma paleta que este arquivo nunca viu. */
#checkout-meio-pix:checked ~ .site-checkout__abas .site-checkout__aba[for="checkout-meio-pix"],
#checkout-meio-cartao:checked ~ .site-checkout__abas .site-checkout__aba[for="checkout-meio-cartao"] {
    background: var(--acao);
    color: #fff;
}

/* O foco do teclado precisa aparecer NA ABA, e nao no radio escondido: sem
   isto, navegar por Tab e pelas setas move a selecao sem sinal nenhum. */
.site-checkout__radio:focus-visible ~ .site-checkout__abas .site-checkout__aba[for="checkout-meio-pix"],
.site-checkout__radio:focus-visible ~ .site-checkout__abas .site-checkout__aba[for="checkout-meio-cartao"] {
    outline: 2px solid var(--acao);
    outline-offset: 2px;
}

/* =========================================================================
   O PAINEL INATIVO SAI DE CENA SEM SAIR DA PAGINA — e esta e a regra mais
   fragil desta folha.

   Os campos de numero, validade e CVV sao <iframe> do provedor, montados uma
   unica vez por `mp.fields.create(...).mount(id)`. `display: none` no
   container ANTES da montagem entrega ao SDK uma caixa de altura zero e os
   campos nascem quebrados — e como o Pix vem marcado por padrao, o painel do
   cartao esta escondido exatamente no instante da montagem. Tirar o painel do
   DOM e remonta-lo tem o mesmo efeito, com o agravante de perder o que ja
   estava digitado.

   Por isso o escondido aqui e `position: absolute` + `visibility: hidden`:
   o elemento continua no DOM, continua com largura (`left/right: 0`) e
   continua gerando caixa, entao os iframes sao montados e dimensionados
   normalmente; so nao sao pintados. `visibility: hidden` ainda tira o painel
   da ordem de tabulacao e da arvore de acessibilidade, que e o que um painel
   fora de cena deve fazer. Nada aqui pode virar `display: none`.
   ========================================================================= */
.site-checkout__metodos--abas .site-checkout__painel {
    position: absolute;
    top: 0;
    left: 0;
    right: 0;
    visibility: hidden;
    opacity: 0;
    pointer-events: none;
    /* Em abas nunca ha dois meios na tela ao mesmo tempo: o filete separaria o
       painel visivel de um vizinho que ninguem ve. */
    padding-top: 0;
    border-top: 0;
}

.site-checkout__metodos--abas:has(#checkout-meio-pix:checked) .site-checkout__painel--pix,
.site-checkout__metodos--abas:has(#checkout-meio-cartao:checked) .site-checkout__painel--cartao {
    position: static;
    visibility: visible;
    opacity: 1;
    pointer-events: auto;
}

/* Queda para navegador sem `:has()`: os dois meios voltam a aparecer
   empilhados, na ordem do HTML e com o filete entre eles — exatamente a tela
   anterior. Perde-se a aba e nao se perde nenhum meio de pagamento, que e a
   degradacao certa numa tela de cobranca. */
@supports not selector(:has(*)) {
    .site-checkout__metodos--abas .site-checkout__painel {
        position: static;
        visibility: visible;
        opacity: 1;
        pointer-events: auto;
    }

    .site-checkout__metodos--abas .site-checkout__painel ~ .site-checkout__painel {
        padding-top: var(--esp-5);
        border-top: 1px solid var(--linha);
    }

    .site-checkout__escolha {
        display: none;
    }

    /* Sem a trilha, o titulo de cada meio volta a ser a unica coisa que diz
       "isto aqui e o Pix" — ele so estava escondido porque a aba ja escrevia o
       nome logo acima. */
    .site-checkout__painel > .site-cartao__titulo.site-sr-only {
        position: static;
        width: auto;
        height: auto;
        margin: 0;
        overflow: visible;
        clip: auto;
        white-space: normal;
    }
}

/* ---- Pix ---- */

.site-checkout__qr {
    display: flex;
    justify-content: center;
    padding: var(--esp-3);
    background: var(--superficie);
    border: 1px solid var(--linha);
    border-radius: var(--raio-sm);
}

/* O QR e lido por camera: nunca reduzir abaixo do que a leitura exige, e nunca
   deixar passar da largura do cartao. */
.site-checkout__qr img {
    display: block;
    width: 220px;
    max-width: 100%;
    height: auto;
}

.site-checkout__copia {
    display: flex;
    flex-wrap: wrap;
    gap: var(--esp-2);
    min-width: 0;
}

/* `min-width: 0` no campo: o codigo copia-e-cola tem centenas de caracteres, e
   sem isso o <input> se recusa a encolher e empurra a pagina. */
.site-checkout__copia .site-input {
    flex: 1 1 180px;
    min-width: 0;
}

.site-checkout__copia .site-btn {
    flex: 0 0 auto;
}

.site-checkout__contador {
    margin: 0;
    font-size: .875rem;
    font-weight: 700;
    color: var(--alerta-texto);
}

/* ---- Campos de cartao do provedor ----
   A moldura e nossa, o campo nao: dentro de cada uma destas caixas monta um
   <iframe> de outra origem. Por isso o desenho copia `.site-input` em vez de
   reaproveita-lo — o seletor nao alcanca o input, que vive noutro documento.
   Pela mesma razao `:focus-within` nao serve, e quem acende a borda e a classe
   `is-focado`, aplicada pelos eventos de foco do SDK. */

.site-checkout__campo-seguro {
    display: block;
    width: 100%;
    max-width: 100%;
    min-height: var(--toque);
    padding: 0 var(--esp-4);
    background: var(--superficie);
    border: 1.5px solid var(--linha-forte);
    border-radius: var(--raio-sm);
    transition: border-color .15s ease, box-shadow .15s ease;
}

.site-checkout__campo-seguro.is-focado {
    border-color: var(--acao);
    box-shadow: var(--sombra-foco);
}

.site-checkout__campo-seguro iframe {
    display: block;
    width: 100%;
    height: calc(var(--toque) - 3px);
    border: 0;
}

/* Mesma armadilha do `.site-campo[hidden]` la em cima: `.site-alerta` declara
   `display: flex`, e o `hidden` do navegador perde para qualquer regra de
   autor. A caixa de erro da tokenizacao nasce escondida e so aparece quando o
   provedor recusa os dados do cartao; sem esta linha ela apareceria vazia
   desde o primeiro render, com o circulo vermelho e nenhuma mensagem. */
.site-alerta[hidden],
.site-alert[hidden] {
    display: none;
}

/* ---- Selo de pagamento seguro ----

   Bloco de LEITURA dentro do formulario de cartao, entre o ultimo campo e o
   botao. Diz o que acontece com o numero do cartao: quem recebe, o que sai
   daqui e o que fica guardado.

   NAO E UM ALERTA. `.site-alerta--info` daria o desenho de graca, e foi
   descartado: alerta significa "aconteceu alguma coisa" e vem com
   `role="alert"` nas telas onde e usado — quem le por voz seria interrompido
   por uma informacao que esta na pagina desde que ela abriu.

   CALMO DE PROPOSITO. Selo de pagamento e o lugar classico do exagero
   (cadeado enorme, borda verde, "100% seguro"), e exagero num formulario de
   cartao produz o efeito contrario do pretendido. Texto menor que o dos
   campos, cor de apoio, e o botao continua sendo a coisa mais forte da area.

   FUNDO BRANCO, e nao tingido: o painel em volta e `.site-cartao--calmo`, cujo
   fundo E o `--turquesa-fundo`. Tingir o selo da mesma cor o faria sumir, e
   ficariam um icone e um texto soltos no meio do formulario. A borda repete a
   do proprio cartao calmo, para o bloco ler como parte dele.

   Nenhuma imagem: o icone e a chapa `.site-ic--menta` ja existente com o
   `escudo` da familia desenhada dentro do projeto. A CSP desta tela barraria
   qualquer logotipo baixado de fora — e o fundo branco do selo e o que faz a
   chapa menta aparecer, coisa que ela nao faria sobre o cartao calmo. */

.site-checkout__selo {
    display: flex;
    align-items: flex-start;
    gap: var(--esp-3);
    /* Sem margem: o `<form>` e um flex column com `gap`, e uma margem aqui
       somaria ao espaco que ja existe entre os campos e o botao. */
    margin: 0;
    padding: var(--esp-3) var(--esp-4);
    background: var(--superficie);
    border: 1px solid #CFE5E3;
    border-radius: var(--raio-sm);
}

/* `min-width: 0` pelo motivo de sempre num flex: sem ele o paragrafo se recusa
   a quebrar e estica o cartao inteiro no celular. */
.site-checkout__selo-corpo {
    min-width: 0;
}

.site-checkout__selo-titulo {
    display: block;
    font-size: .9375rem;
    font-weight: 700;
    color: var(--tinta);
}

/* `--tinta-media` sobre branco da 6.5:1 — sobra para um texto de .8125rem. */
.site-checkout__selo-texto {
    margin: var(--esp-1) 0 0;
    font-size: .8125rem;
    line-height: 1.55;
    color: var(--tinta-media);
}

/* ---- Rodape do checkout ---- */

/* Quem processa o pagamento, dito por extenso. E exigencia de transparencia e
   fica discreto de proposito: e informacao, nao chamada. */
.site-checkout__aviso {
    margin: var(--esp-5) 0 0;
    text-align: center;
}


/* ===========================================================================
   PRECO — as duas formas de cobranca, em abas sem JavaScript
   ===========================================================================
   A secao mostra DOIS contratos: o modelo por comissao (sem mensalidade) e os
   planos mensais. Eles nao vao lado a lado de proposito — duas colunas fariam
   parecer uma escolha entre iguais, e nao e: a conta gratuita e o caminho de
   quem chega, e o plano e a saida para a escola que cobra por fora.

   A troca e feita por dois `<input type="radio">` escondidos e o combinador
   `~`, sem uma linha de script. O site inteiro carrega zero JS obrigatorio, e
   um seletor de preco que so funciona com JavaScript e um seletor que as vezes
   nao funciona — justamente na visita em que a conexao esta ruim.

   Os inputs precisam vir ANTES dos paineis no HTML. Trocar a ordem quebra as
   abas sem erro nenhum no console.
   =========================================================================== */

.site-precos {
    max-width: 880px;
    margin-inline: auto;
}

.site-precos__escolha {
    border: 0;
    margin: 0 0 1.5rem;
    padding: 0;
}

/* As abas: dois botoes de largura igual dentro de uma trilha. Empilham no
   celular, onde dois alvos lado a lado ficariam com o texto de apoio quebrado
   em tres linhas. */
.site-precos__abas {
    display: grid;
    grid-template-columns: 1fr;
    gap: .5rem;
    padding: .35rem;
    background: var(--superficie);
    border: 1px solid var(--linha);
    border-radius: var(--raio-lg);
    box-shadow: var(--sombra-sm);
}

@media (min-width: 560px) {
    .site-precos__abas {
        grid-template-columns: repeat(2, minmax(0, 1fr));
    }
}

.site-precos__aba {
    display: block;
    padding: .8rem 1rem;
    border-radius: 12px;
    text-align: center;
    cursor: pointer;
    color: var(--tinta-media);
    transition: background-color .18s ease, color .18s ease;
}

.site-precos__aba-titulo {
    display: block;
    font-weight: 700;
    color: inherit;
}

.site-precos__aba-apoio {
    display: block;
    margin-top: .15rem;
    font-size: .82rem;
    color: inherit;
    opacity: .85;
}

.site-precos__aba:hover {
    background: var(--turquesa-fundo);
}

/* Estado ativo e visibilidade do painel: os dois saem do mesmo `:checked`.
   `--acao` e o unico turquesa da marca aprovado para contraste, e o texto sobre
   ele e branco (7,1:1). */
#site-preco-comissao:checked ~ .site-precos__abas .site-precos__aba[for="site-preco-comissao"],
#site-preco-plano:checked ~ .site-precos__abas .site-precos__aba[for="site-preco-plano"] {
    background: var(--acao);
    color: #fff;
}

/* O foco do teclado precisa aparecer NA ABA, e nao no input escondido: sem
   isto, navegar por Tab move a selecao sem nenhum sinal na tela. */
.site-precos__radio:focus-visible ~ .site-precos__abas .site-precos__aba[for="site-preco-comissao"],
.site-precos__radio:focus-visible ~ .site-precos__abas .site-precos__aba[for="site-preco-plano"] {
    outline: 2px solid var(--acao);
    outline-offset: 2px;
}

.site-precos[data-com-abas] .site-precos__painel {
    display: none;
}

.site-precos[data-com-abas]:has(#site-preco-comissao:checked) .site-precos__painel--comissao,
.site-precos[data-com-abas]:has(#site-preco-plano:checked) .site-precos__painel--plano {
    display: block;
}

/* Queda para navegador sem `:has()`: sem ele as duas ofertas aparecem
   empilhadas, na ordem do HTML — a principal primeiro. Perde-se a aba e nao se
   perde nenhuma informacao, que e a degradacao certa. */
@supports not selector(:has(*)) {
    .site-precos[data-com-abas] .site-precos__painel {
        display: block;
    }

    .site-precos__escolha {
        display: none;
    }
}

.site-precos__intro,
.site-precos__nota {
    max-width: 62ch;
    margin-inline: auto;
    text-align: center;
    color: var(--tinta-media);
}

.site-precos__intro {
    margin-bottom: 1.5rem;
}

.site-precos__nota {
    margin-top: 1.25rem;
    font-size: .9rem;
}

/* A ponte entre as abas. E um `<label>`, e nao um link: aponta para o mesmo
   radio da aba, entao continua funcionando sem script e nao sai da pagina. */
.site-precos__link {
    color: var(--acao);
    font-weight: 600;
    text-decoration: underline;
    text-underline-offset: 2px;
    cursor: pointer;
}

.site-precos__link:hover {
    color: var(--acao-forte);
}

.site-precos__ponte {
    margin-top: 1.5rem;
}

/* ---- Os cartoes de plano ---- */

.site-planos {
    display: grid;
    grid-template-columns: 1fr;
    gap: 1rem;
    margin: 0;
    padding: 0;
    list-style: none;
}

@media (min-width: 768px) {
    .site-planos {
        grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
    }
}

.site-plano {
    position: relative;
    display: flex;
    flex-direction: column;
    padding: 1.5rem 1.25rem;
    background: var(--superficie);
    border: 1px solid var(--linha);
    border-radius: var(--raio-lg);
    box-shadow: var(--sombra-sm);
}

/* O destaque e uma BORDA, e nao um fundo colorido: o cartao continua branco e o
   texto dentro dele mantem o contraste medido para essa superficie. */
.site-plano--destaque {
    border-color: var(--acao);
    box-shadow: var(--sombra);
}

/* CENTRALIZADO, e nao ancorado a esquerda: o selo e um rotulo do cartao
   inteiro, e nao de uma coluna dele. Encostado na esquerda ele disputava o
   alinhamento com o nome do plano logo abaixo e o cartao ficava com dois
   inicios diferentes.

   `left: 50%` + `translateX(-50%)` mantem o centro correto qualquer que seja o
   comprimento do texto — "Recomendado" e "Mais escolhido" tem larguras bem
   diferentes, e uma margem fixa serviria a um so. */
.site-plano__selo {
    position: absolute;
    top: -.7rem;
    left: 50%;
    transform: translateX(-50%);
    white-space: nowrap;
    padding: .2rem .6rem;
    border-radius: 999px;
    background: var(--acao);
    color: #fff;
    font-size: .72rem;
    font-weight: 700;
    letter-spacing: .04em;
    text-transform: uppercase;
}

.site-plano__nome {
    margin: 0 0 .5rem;
    font-size: 1.1rem;
    color: var(--tinta);
}

.site-plano__preco {
    margin: 0 0 .75rem;
}

.site-plano__valor {
    display: block;
    font-size: 1.75rem;
    font-weight: 700;
    line-height: 1.15;
    color: var(--tinta);
}

.site-plano__ciclo {
    display: block;
    font-size: .85rem;
    color: var(--tinta-media);
}

.site-plano__chamada {
    margin: 0 0 1rem;
    color: var(--tinta-media);
    font-size: .92rem;
}

/* A lista de benefícios do plano é uma `.site-lista` — o disco menta com o tique,
   igual ao da lista "Tudo isto incluído" da aba vizinha. Este seletor só empurra
   a ação do cartão para longe do último item; marcador, cor, tamanho e o
   espaçamento entre itens (que ali é `gap` de grade, não margem) vêm todos de
   `.site-lista` e NÃO podem ser redeclarados aqui: um `padding-left` próprio
   jogaria o texto para cima do marcador absoluto. */
.site-plano__lista {
    margin: 0 0 1.25rem;
}

/* `margin-top: auto` prende a acao no rodape do cartao: com listas de tamanhos
   diferentes, os botoes ficam alinhados entre si em vez de subir junto com o
   texto mais curto. */
.site-plano__acao {
    margin-top: auto;
    align-self: stretch;
    text-align: center;
}

/* ---------------------------------------------------------------------------
   O PLANO ESCOLHIDO, no topo do formulario de cadastro
   ---------------------------------------------------------------------------
   Confirmacao, e nao decoracao: quem clicou num plano na secao de preco precisa
   ver que a escolha sobreviveu a rolagem. Fica no topo do formulario porque e
   o primeiro lugar em que o olho pousa depois da ancora — no rodape ele seria
   lido depois de a pessoa ja ter preenchido tudo desconfiada.

   Fundo branco sobre a faixa menta da secao: o cartao precisa se separar do
   fundo tingido sem virar uma segunda cor de marca.
   --------------------------------------------------------------------------- */

.site-plano-escolhido {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: .75rem 1rem;
    margin-bottom: 1.5rem;
    padding: .9rem 1.1rem;
    background: var(--superficie);
    border: 1px solid var(--acao);
    border-radius: 12px;
}

.site-plano-escolhido__texto {
    flex: 1 1 12rem;
    min-width: 0;
}

.site-plano-escolhido__rotulo {
    display: block;
    font-size: .72rem;
    font-weight: 700;
    letter-spacing: .06em;
    text-transform: uppercase;
    color: var(--acao);
}

.site-plano-escolhido__nome {
    display: block;
    font-size: 1.05rem;
    color: var(--tinta);
}

.site-plano-escolhido__preco {
    display: block;
    font-size: .9rem;
    color: var(--tinta-media);
}

.site-plano-escolhido__trocar {
    flex: 0 0 auto;
    color: var(--acao);
    font-weight: 600;
    text-decoration: underline;
    text-underline-offset: 2px;
}

.site-plano-escolhido__trocar:hover {
    color: var(--acao-forte);
}

/* ---------------------------------------------------------------------------
   Tabela de comparacao (usada no FAQ, entre os dois modelos comerciais)
   ---------------------------------------------------------------------------
   Uma tabela de verdade, e nao uma grade de <div>: sao dois contratos com as
   mesmas quatro perguntas, e o leitor de tela precisa anunciar "Comissao por
   venda, Plano mensal, nenhuma" — o que so acontece com `<th scope>` de linha e
   de coluna.

   O `overflow-x` fica no INVOLUCRO, e nao na tabela: rolagem horizontal aplicada
   a propria tabela esconde, no celular, a primeira coluna — que e justamente o
   rotulo da linha, sem o qual as outras duas nao significam nada.
   --------------------------------------------------------------------------- */

.site-tabela-wrap {
    overflow-x: auto;
    margin: 1rem 0;
    -webkit-overflow-scrolling: touch;
}

.site-tabela {
    width: 100%;
    min-width: 22rem;
    border-collapse: collapse;
    font-size: .92rem;
}

.site-tabela th,
.site-tabela td {
    padding: .55rem .7rem;
    text-align: left;
    border-bottom: 1px solid var(--linha);
    vertical-align: top;
}

.site-tabela thead th {
    font-size: .78rem;
    text-transform: uppercase;
    letter-spacing: .04em;
    color: var(--acao);
    border-bottom-width: 2px;
}

/* O rotulo da linha e cabecalho, e nao dado: peso maior e cor de texto cheia,
   para a leitura vertical funcionar sem depender da posicao. */
.site-tabela tbody th {
    font-weight: 600;
    color: var(--tinta);
    white-space: nowrap;
}

.site-tabela tbody td {
    color: var(--tinta-media);
}

.site-tabela tbody tr:last-child th,
.site-tabela tbody tr:last-child td {
    border-bottom: 0;
}

/* =========================================================================
   Diagramação da vitrine — etapa "espaço em branco ao lado do título"
   -------------------------------------------------------------------------
   Três problemas do mesmo tipo, resolvidos juntos: um cabeçalho curto com meia
   linha vazia à direita (Pagamentos), duas caixas de destaque empilhadas quando
   caberiam lado a lado, e um diagrama que precisava existir sem baixar arquivo
   nenhum. Nada aqui muda cor de marca, tipografia ou espaçamento global.
   ========================================================================= */

/* -------------------------------------------------------------------------
   Split com apoio visual — texto na coluna maior
   -------------------------------------------------------------------------
   O `.site-split` padrão dá a coluna maior à DIREITA (minmax(0,1fr) /
   minmax(0,1.1fr)), porque nasceu para texto + captura de tela, e a captura é o
   assunto. Quando o vizinho é um DESENHO de apoio a hierarquia se inverte: o
   diagrama ilustra o texto, não o contrário. Este modificador troca a proporção
   sem tocar no utilitário, que continua servindo os quatro blocos de
   Funcionalidades e o cabeçalho de Problemas. */
@media (min-width: 1024px) {
    .site-split--apoio {
        grid-template-columns: minmax(0, 1.15fr) minmax(0, .85fr);
        align-items: center;
    }
}

/* O bloco de cabeçalho + diagrama precisa se separar do que vem abaixo.

   `.site-secao__cabecalho` traz a margem que servia a um cabeçalho sozinho;
   com o diagrama ao lado, o conjunto ficou mais alto e a mesma medida deixou os
   três cartões parecendo a continuação do desenho. */
.site-split--apoio {
    margin-bottom: var(--esp-7);
}

/* -------------------------------------------------------------------------
   O caminho do dinheiro — diagrama de fluxo em SVG
   -------------------------------------------------------------------------
   Todo o desenho vive em `resources/views/site/sections/pagamentos.blade.php`;
   aqui ficam só cor, tamanho de texto e espessura de traço. A separação não é
   estética: as cores TÊM de sair dos tokens da paleta, e um SVG carregado como
   arquivo (`<img src>`) não enxerga variável CSS nenhuma — ficaria com a marca
   congelada em hexadecimal. Inline, ele herda `:root` como qualquer elemento.

   CONTRASTE, a regra que manda neste bloco. O turquesa da marca (`--teal`)
   pinta apenas TRAÇO — as setas e os contornos —, nunca texto: sobre branco ele
   fica em 2,9:1 e reprovaria em qualquer tamanho. O texto do diagrama usa os
   três de sempre: `--navy` nos rótulos, `--tinta-media` no apoio e
   `--acao-forte` no valor da comissão (6,1:1 sobre a areia da pastilha).

   TAMANHO DE FONTE EM UNIDADE DE viewBox: `font-size: 19px` aqui significa 19
   unidades do sistema de coordenadas 400x330, e não 19 pixels de tela. Em 375px
   de largura o desenho renderiza a 343px, ou seja, 0,86 do tamanho de projeto —
   os rótulos caem para ~16px reais e o apoio para ~12px, que é o piso aceitável.
   Foi por isso que o viewBox ficou em 400 e não em 480: cada unidade a mais de
   largura encolhe a letra no celular. */
.site-fluxo {
    display: block;
    width: 100%;
    max-width: 420px;
    height: auto;
    /* Centrado na própria coluna: no celular ele fica sob o texto, e encostado à
       esquerda pareceria um bloco solto em vez do fecho do cabeçalho. */
    margin-inline: auto;
    /* RESPIRO PRÓPRIO, e não só o `gap` da grade.

       O desenho tem traço fino e caixas claras: sem folga ele encosta no
       parágrafo à esquerda e na grade de cartões abaixo, e os três blocos leem
       como um só amontoado. A folga de baixo é maior porque ali começa outro
       assunto (os três cartões), e a de cima existe para o topo do diagrama não
       nascer colado no `eyebrow` da seção no celular, onde os dois empilham. */
    margin-block: var(--esp-4) var(--esp-5);
}

@media (min-width: 1024px) {
    /* No desktop as duas colunas já estão centradas entre si (`align-items:
       center` do `.site-split--apoio`), e a margem de cima passaria a
       desequilibrar o alinhamento em vez de dar folga. Fica só a de baixo. */
    .site-fluxo {
        margin-block: 0 var(--esp-4);
    }
}

/* Superfície das três etapas: a mesma do painel de destaque desta seção
   (`--turquesa-fundo` com filete #CFE5E3), para o diagrama e as caixas de
   "Venda também com a escola fechada" lerem como a mesma família. */
.site-fluxo__caixa {
    fill: var(--turquesa-fundo);
    stroke: #CFE5E3;
    stroke-width: 1;
}

/* O destino do dinheiro ganha o contorno na cor de ação, e não um fundo
   próprio: é o fim do caminho e precisa se destacar sem introduzir uma quarta
   cor num desenho de três caixas. */
.site-fluxo__caixa--destino {
    stroke: var(--acao);
    stroke-width: 1.75;
}

/* A comissão em pastilha de AREIA. Ela não é uma etapa por onde o dinheiro
   passa — é o que fica pelo caminho —, então não pode usar a superfície das
   etapas. `--sand` é fundo de página na paleta e resolve isso sem inventar cor:
   pertence à marca e não compete com o turquesa das caixas. */
.site-fluxo__pilula {
    fill: var(--sand);
    stroke: var(--linha-forte);
    stroke-width: 1;
}

/* Os ícones repetem, traço por traço, os desenhos de `partials/icone.blade.php`
   (aluno, pagamento, escola). Foram copiados em vez de incluídos porque o
   partial devolve um <svg> completo, e SVG não aninha dentro de SVG mantendo o
   sistema de coordenadas — o que se herda aqui é só a métrica: contorno de 1.75
   num viewBox de 24. */
.site-fluxo__ic {
    fill: none;
    stroke: var(--acao);
    stroke-width: 1.75;
    stroke-linecap: round;
    stroke-linejoin: round;
}

/* Setas em `--teal`: elemento gráfico, e é exatamente para isto que o turquesa
   claro serve na paleta. 2px de traço para a linha não sumir ao lado do filete
   de 1px das caixas. */
.site-fluxo__seta {
    fill: none;
    stroke: var(--teal);
    stroke-width: 2;
    stroke-linecap: round;
    stroke-linejoin: round;
}

.site-fluxo__rotulo {
    font-family: var(--fonte-titulo);
    font-size: 19px;
    font-weight: 700;
    fill: var(--navy);
}

.site-fluxo__apoio {
    font-family: var(--fonte-corpo);
    font-size: 14px;
    fill: var(--tinta-media);
}

.site-fluxo__mini {
    font-family: var(--fonte-corpo);
    /* 13, e não 12: medido em 375px de largura, 12 unidades caíam para 9,8px
       reais na tela — abaixo do que se lê sem aproximar o aparelho do rosto. A
       pastilha tem 138 unidades de largura e o rótulo cabe folgado em 13. */
    font-size: 13px;
    fill: var(--tinta-media);
}

.site-fluxo__valor {
    font-family: var(--fonte-titulo);
    font-size: 15px;
    font-weight: 700;
    fill: var(--acao-forte);
}

/* -------------------------------------------------------------------------
   Dois destaques na mesma linha
   -------------------------------------------------------------------------
   `.site-destaque` nasceu para ser um painel largo e solitário, com margem
   própria e o ícone numa coluna à esquerda. Empilhados, dois deles viravam uma
   escada de painéis menta logo abaixo de uma grade de três cartões — mesmo peso
   visual, mesmo assunto, ritmo diferente. Lado a lado eles se leem pelo que são:
   duas metades da mesma resposta.

   A margem sai do painel e vem para o invólucro: dentro de uma grade de duas
   colunas, `margin-top` em cada filho empurraria os dois para baixo do mesmo
   jeito e ainda quebraria o alinhamento se um dia forem três. */
.site-destaques--par {
    display: grid;
    grid-template-columns: 1fr;
    gap: var(--esp-4);
    margin-top: var(--esp-5);
}

.site-destaques--par > .site-destaque {
    margin-top: 0;
}

@media (min-width: 768px) {
    .site-destaques--par {
        grid-template-columns: repeat(2, minmax(0, 1fr));
        gap: var(--esp-5);
    }

    /* Dentro do par, o ícone fica SEMPRE em cima do texto — em toda largura, e
       não só entre 768 e 1024 como era antes.

       A primeira razão é a mesma que o mantém empilhado no celular: com metade
       da linha, a coluna do ícone come 80px dos 526px da caixa e deixa o
       parágrafo com 380px, largura em que um texto de três frases começa a
       virar coluna de jornal.

       A segunda apareceu ao medir a assimetria que o par exibia no desktop. O
       padding é simétrico — 33px nos quatro lados, conferido —, mas o CONTEÚDO
       não era: à esquerda o ícone forma uma parede reta que começa exatamente
       no padding; à direita o texto termina irregular, em média 30px antes da
       borda e, na última linha, 186px antes. O olho não mede a caixa, mede o
       conteúdo, e via muito mais ar de um lado que do outro.

       Com o ícone em cima, o bloco inteiro ocupa a largura entre os paddings e
       a comparação deixa de existir. De quebra, o texto ganha os 80px da coluna
       do ícone e quebra menos.

       E é o desenho que os TRÊS CARTÕES logo acima nesta mesma seção já usam
       (`.site-card`: ícone no topo, título e texto na mesma margem). Dois
       destaques com ícone lateral logo abaixo deles era a inconsistência que
       fazia o conjunto parecer desalinhado. */
    .site-destaques--par > .site-destaque {
        grid-template-columns: minmax(0, 1fr);
        gap: var(--esp-4);
    }
}

/* -------------------------------------------------------------------------
   Cabeçalhos centrados — quebra de linha sem palavra órfã
   -------------------------------------------------------------------------
   Três seções passaram a centrar o cabeçalho (Como funciona, O que o SurfApp
   faz, Para o aluno) porque o conteúdo abaixo delas é simétrico e ocupa a
   largura inteira. Centrado, um título de duas linhas fica com a segunda
   ocupada por uma palavra só — "vendendo", "inteira" — e o desequilíbrio salta
   à vista muito mais do que saltaria alinhado à esquerda.

   `text-wrap: balance` reparte as linhas do título; `pretty` cuida só da última
   linha do parágrafo de apoio, que é onde a viúva aparece em texto corrido.
   As duas são progressivas: no navegador que não as conhece, a quebra continua
   sendo a de sempre e nada quebra. Nenhuma largura foi alterada — a medida de
   leitura de 62ch do cabeçalho continua intacta. */
.site-secao__cabecalho--centro .site-titulo {
    text-wrap: balance;
}

.site-secao__cabecalho--centro .site-secao__apoio {
    text-wrap: pretty;
}

/* ==========================================================================
   CHECKOUT — o cromo enxuto da tela de pagamento
   ==========================================================================
   Usado só por `site/checkout/layout.blade.php`. O corpo da tela continua
   usando as classes de seção deste mesmo arquivo; o que está aqui é apenas o
   cabeçalho e o rodapé que substituíram os do site de marketing.

   A regra que guia tudo: nada nesta tela compete com o botão de pagar. Não há
   navegação, não há link de saída, e o único destaque de cor é a marca da
   escola — que é quem está cobrando.
   ========================================================================== */

.checkout-corpo {
    display: flex;
    flex-direction: column;
    min-height: 100vh;
    background: var(--pagina, #F6F3EC);
    /* O `body` reserva `--altura-header` para o cabecalho FIXO do site de
       marketing. Aqui o cabecalho e estatico e rola junto, entao a reserva vira
       uma faixa vazia acima dele. */
    padding-top: 0;
}

/* O <main> empurra o rodapé para o fim mesmo em compra de uma linha só, senão
   a nota do rodapé sobe e fica boiando no meio da tela. */
.checkout-corpo > main {
    flex: 1 0 auto;
}

.checkout-topo {
    background: var(--checkout-topo-fundo, #0A2638);
    color: var(--checkout-topo-texto, #FFFFFF);
    padding: 0.9rem 0;
}

.checkout-topo__interno {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 1rem;
}

/* ---------------------------------------------------------------------------
   A MARCA DA ESCOLA NO TOPO DA COBRANÇA
   ---------------------------------------------------------------------------
   Pedido do dono do produto: "na página de pagamento devemos ter a marca da
   escola, caso aplicável". Antes havia só o nome em texto.

   Quem NÃO tem logomarca continua vendo só o nome — o `<img>` nem chega a ser
   escrito no HTML (ver o layout). Nada de moldura vazia, e nunca o símbolo do
   SurfApp: quem está com o cartão na mão comprou da escola, e uma marca
   desconhecida acima do valor é o que faz desistir.

   O QUE NÃO ENTROU, e por quê: a cor da escola pintando o resto da página. A
   confiança aqui vem de reconhecer QUEM cobra, não de a tela ficar diferente —
   e um checkout que muda de aparência a cada escola tem exatamente a cara do
   golpe que ele precisa não ter. A marca fica na faixa de cima; o formulário, o
   valor e os botões continuam no cromo neutro da plataforma, iguais para todas
   as escolas.
   --------------------------------------------------------------------------- */
.checkout-topo__marca {
    display: flex;
    align-items: center;
    gap: 0.6rem;
    min-width: 0;
}

/* A placa existe pelo mesmo motivo que existe no portal: logomarca PNG
   transparente de traço claro some numa faixa clara, e a de traço escuro some
   numa faixa escura. Qual é o caso, só quem enviou o arquivo sabe — vem de
   `tenants.logo_background` (ver `App\Enums\LogoBackground`). A placa tem o
   tamanho da arte, sem respiro: moldura em volta faria a marca da escola
   parecer um anexo, e não o cabeçalho da cobrança. */
.checkout-topo__logo {
    flex: 0 0 auto;
    display: block;
    max-height: 34px;
    width: auto;
    max-width: 150px;
    object-fit: contain;
    border-radius: 6px;
    background: var(--checkout-logo-placa, #ffffff);
    box-shadow: 0 0 0 1px var(--checkout-logo-borda, rgba(10, 38, 56, 0.10));
}

.checkout-topo__escola {
    font-size: 1.05rem;
    font-weight: 700;
    letter-spacing: -0.01em;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

/* "Pagamento seguro" é etiqueta, não promessa de recurso: some no celular,
   onde a largura pertence ao nome de quem está cobrando. */
.checkout-topo__seguro {
    font-size: 0.78rem;
    text-transform: uppercase;
    letter-spacing: 0.08em;
    opacity: 0.85;
}

@media (max-width: 480px) {
    .checkout-topo__seguro {
        display: none;
    }

    /* No celular a largura pertence a quem está cobrando: o logo encolhe para
       o nome caber inteiro ao lado dele, em vez de as duas coisas disputarem a
       linha e o nome sair cortado. */
    .checkout-topo__logo {
        max-height: 28px;
        max-width: 96px;
    }
}

.checkout-rodape {
    padding: 1.5rem 0 2rem;
}

.checkout-rodape__texto {
    margin: 0;
    color: var(--tinta-media, #4E606A);
    font-size: 0.85rem;
    text-align: center;
}

/* ---------------------------------------------------------------------------
   RESUMO DOS VALORES DO CARTÃO
   ---------------------------------------------------------------------------
   Tres linhas: o que se compra, o que o emissor cobra por parcelar, e o total.

   Separadas de proposito, em vez de so mostrar o total maior. Os juros nao sao
   da escola nem do SurfApp — sao do banco de quem parcela — e um numero que
   aparece do nada, maior que o anunciado, parece taxa de quem esta vendendo.
   Nomear a diferenca e o que evita a desconfianca bem na hora do clique.

   Desenhado pelo script quando o provedor responde a consulta da BIN; sem
   resposta ele nao existe, e o botao volta a dizer o valor a vista. */
.site-resumo {
    border: 1px solid var(--linha);
    border-radius: .5rem;
    padding: .7rem .9rem;
    margin-bottom: .9rem;
    background: var(--pagina);
}

.site-resumo__linha {
    display: flex;
    align-items: baseline;
    justify-content: space-between;
    gap: 1rem;
    font-size: .875rem;
    line-height: 1.5;
}

.site-resumo__linha + .site-resumo__linha {
    margin-top: .15rem;
}

/* Os juros ficam no tom de apoio: e informacao de contexto, nao o numero que a
   pessoa precisa para decidir. `--gray` e proibido em texto nesta folha, entao
   o tom vem do mesmo cinza-escuro que o resto do apoio usa. */
.site-resumo__linha--juros {
    color: #6b6560;
}

.site-resumo__linha--total {
    margin-top: .45rem;
    padding-top: .45rem;
    border-top: 1px solid var(--linha);
    font-size: .95rem;
}

/* ---------------------------------------------------------------------------
   Formulario congelado enquanto o pagamento e processado
   ---------------------------------------------------------------------------
   Os campos comuns ficam `disabled` pelo script e o navegador ja os apaga
   sozinho. Esta regra existe pelos OUTROS: os campos de cartao sao <iframe> de
   `secure-fields.mercadopago.com`, de outro dominio, e `disabled` nao os
   alcanca — quem os trava e `pointer-events`.

   O cursor de espera vale para o formulario inteiro. Sem ele o congelamento
   parece travamento: a pessoa clica, nada responde, e ela clica de novo. */
.site-form--processando {
    cursor: progress;
}

.site-form--processando .site-checkout__campo-seguro,
.site-form--processando iframe {
    pointer-events: none;
}

/* Opacidade so nos campos: o botao precisa continuar legivel para mostrar
   "Processando…", e o resumo de valores e justamente o que a pessoa quer reler
   enquanto espera. */
.site-form--processando .site-input:disabled,
.site-form--processando .site-select:disabled,
.site-form--processando .site-checkout__campo-seguro {
    opacity: .65;
}
