/* ==========================================================================
   ZappyXPlay — ajustes sobre o Spotlight
   ==========================================================================

   ⚠️ Este arquivo NÃO reescreve o tema: ele corrige o que quebra quando as
   páginas do sistema (login, cadastro, suporte, preços) usam um template feito
   para uma landing page de agência. Carregado DEPOIS do `main.css`.

   Cada bloco abaixo resolve um defeito visto na tela, e diz qual.
   ========================================================================== */


/* --------------------------------------------------------------------------
   1. Conteúdo passando por baixo do cabeçalho
   --------------------------------------------------------------------------
   O cabeçalho é `position: fixed`, e no template só DUAS coisas compensam a
   altura dele: `.hero` (`padding-top: 160px`) e `.page-title`. Toda página que
   não começa com uma das duas — o login, por exemplo — nasce com o título
   escondido atrás da barra.

   Aqui a compensação passa a ser do `.main`, e as duas exceções a devolvem:
   quem já tinha o respiro embutido não pode ganhar outro.
   -------------------------------------------------------------------------- */
/* ⚠️ **A compensação é por CLASSE, não por `:has()` nem margem negativa.**
 *
 * Duas tentativas anteriores falharam, e as duas de um jeito visível:
 *
 *   · `margin-top: -100px` no primeiro filho puxava o BLOCO inteiro para
 *     dentro da faixa do cabeçalho fixo — o título grande ficava cortado ao
 *     meio, atrás da barra;
 *   · `:has()` resolveria, mas o player roda em WebView de TV Box antigo, onde
 *     o seletor não existe. O CSS é o mesmo para todo o site.
 *
 * Então quem sabe se precisa de respiro é o PHP, que já sabe se a página tem
 * cabeçalho: o `<body>` recebe `sem-cabecalho` quando não tem, e só nesse caso
 * o `.main` compensa a altura da barra. Quem tem `hero` ou `page-title` já
 * carrega o próprio `padding-top`.
 */
body.sem-cabecalho .main {
    padding-top: 100px;
}

@media (max-width: 991px) {
    body.sem-cabecalho .main {
        padding-top: 80px;
    }
}


/* --------------------------------------------------------------------------
   2. Formulários ilegíveis
   --------------------------------------------------------------------------
   ⚠️ Este é o defeito mais grave dos três: o Bootstrap desenha `.form-control`
   com fundo BRANCO e texto escuro. Num tema escuro o campo vira um retângulo
   branco, e o texto digitado sai quase invisível — foi o que aconteceu no
   login, com o CPF digitado sumindo dentro do campo.

   O Spotlight só estiliza os campos DENTRO de `.php-email-form`, que é o
   formulário de contato dele. Nenhum formulário do sistema usa essa classe.
   -------------------------------------------------------------------------- */
.form-control,
.form-select {
    background-color: color-mix(in srgb, var(--surface-color), transparent 20%);
    border: 1px solid color-mix(in srgb, var(--default-color), transparent 80%);
    color: var(--default-color);
    padding: 12px 15px;
    border-radius: 8px;
}

.form-control:focus,
.form-select:focus {
    background-color: var(--surface-color);
    border-color: var(--accent-color);
    color: var(--default-color);
    box-shadow: 0 0 0 3px color-mix(in srgb, var(--accent-color), transparent 85%);
}

/* O texto de exemplo precisa ser visivelmente mais fraco que o digitado —
   senão a pessoa não distingue o que ela escreveu do que o campo sugere. */
.form-control::placeholder {
    color: color-mix(in srgb, var(--default-color), transparent 55%);
    opacity: 1;
}

.form-label {
    color: var(--heading-color);
    font-weight: 500;
    margin-bottom: .4rem;
}

/* `.form-text` é a linha de ajuda embaixo do campo. O Bootstrap a pinta de
   cinza escuro, que sobre fundo escuro fica ilegível — era o caso de "É por
   aqui que a resposta chega" no suporte. */
.form-text,
.text-muted {
    color: color-mix(in srgb, var(--default-color), transparent 40%) !important;
}

/* O select abre uma lista desenhada pelo sistema operacional: sem isto, as
   opções saem escuras sobre fundo escuro em boa parte dos navegadores. */
.form-select option {
    background-color: var(--surface-color);
    color: var(--default-color);
}

textarea.form-control {
    min-height: 120px;
}


/* --------------------------------------------------------------------------
   3. Botões sem contraste
   --------------------------------------------------------------------------
   ⚠️ `.btn-accent` e `.btn-ghost` existem no Spotlight, mas SÓ dentro de
   `.hero .hero-actions` e `.why-us .intro-content`. Usados em qualquer outro
   lugar — no login, na página de preços — eles caem no botão cru do Bootstrap:
   transparente, com texto escuro sobre fundo escuro.

   Era o "Entrar" invisível do login e o "Testar 14 dias grátis" apagado nos
   preços.
   -------------------------------------------------------------------------- */
.btn-accent {
    background-color: var(--accent-color);
    color: var(--contrast-color);
    border: 2px solid var(--accent-color);
    padding: 12px 28px;
    border-radius: 50px;
    font-weight: 600;
    transition: .3s;
}

.btn-accent:hover,
.btn-accent:focus {
    background-color: color-mix(in srgb, var(--accent-color), #fff 15%);
    border-color: color-mix(in srgb, var(--accent-color), #fff 15%);
    color: var(--contrast-color);
    transform: translateY(-2px);
}

.btn-ghost {
    background: transparent;
    color: var(--default-color);
    border: 2px solid color-mix(in srgb, var(--default-color), transparent 70%);
    padding: 12px 28px;
    border-radius: 50px;
    font-weight: 600;
    transition: .3s;
}

.btn-ghost:hover,
.btn-ghost:focus {
    border-color: var(--accent-color);
    color: var(--accent-color);
    background: color-mix(in srgb, var(--accent-color), transparent 92%);
}

/* Os botões de escolha (pessoa física / jurídica) no cadastro. */
.btn-outline-secondary {
    color: var(--default-color);
    border-color: color-mix(in srgb, var(--default-color), transparent 70%);
}

.btn-outline-secondary:hover {
    background-color: color-mix(in srgb, var(--accent-color), transparent 88%);
    border-color: var(--accent-color);
    color: var(--accent-color);
}

.btn-check:checked + .btn-outline-secondary {
    background-color: var(--accent-color);
    border-color: var(--accent-color);
    color: var(--contrast-color);
}


/* --------------------------------------------------------------------------
   4. Cartões e avisos
   -------------------------------------------------------------------------- */
.card {
    background-color: var(--surface-color);
    border: 1px solid color-mix(in srgb, var(--default-color), transparent 88%);
    color: var(--default-color);
}

.alert {
    border: 1px solid transparent;
    border-radius: 8px;
}

.alert-success {
    background-color: color-mix(in srgb, #22c55e, transparent 88%);
    border-color: color-mix(in srgb, #22c55e, transparent 70%);
    color: #86efac;
}

.alert-danger {
    background-color: color-mix(in srgb, #ef4444, transparent 88%);
    border-color: color-mix(in srgb, #ef4444, transparent 70%);
    color: #fca5a5;
}

.alert-warning {
    background-color: color-mix(in srgb, #f59e0b, transparent 88%);
    border-color: color-mix(in srgb, #f59e0b, transparent 70%);
    color: #fcd34d;
}

.alert-info {
    background-color: color-mix(in srgb, var(--accent-color), transparent 90%);
    border-color: color-mix(in srgb, var(--accent-color), transparent 70%);
    color: var(--accent-color);
}


/* --------------------------------------------------------------------------
   5. A grade de planos
   --------------------------------------------------------------------------
   O `.offering-block` do template foi feito para um cartão de serviço, de
   altura livre. Numa grade de preços os cartões precisam terminar na mesma
   linha, com o botão colado embaixo — senão o plano de descrição mais curta
   fica com o botão subindo no meio do cartão.
   -------------------------------------------------------------------------- */
.services .offering-block {
    height: 100%;
    display: flex;
    flex-direction: column;
}

.services .offering-block .offering-body {
    display: flex;
    flex-direction: column;
    flex: 1 1 auto;
}

/* Empurra o botão para o rodapé do cartão. */
.services .offering-block .offering-body > .btn {
    margin-top: auto;
}

.services .offering-block ul li {
    color: var(--default-color);
}


/* --------------------------------------------------------------------------
   6. O cabeçalho das páginas internas
   --------------------------------------------------------------------------
   É o bloco que a Central de atendimento já usava e que agora abre TODAS as
   páginas internas: título grande, uma linha de contexto e a trilha de volta.

   O template desenha o fundo com um verde de 2% sobre o preto — quase nada, e
   na tela o bloco somia no fundo da página. Aqui ele ganha peso suficiente
   para ler-se como um cabeçalho, sem virar um segundo herói.
   -------------------------------------------------------------------------- */
.page-title {
    background: linear-gradient(
        180deg,
        color-mix(in srgb, var(--accent-color), transparent 92%) 0%,
        var(--background-color) 100%
    );
    border-bottom: 1px solid color-mix(in srgb, var(--default-color), transparent 90%);
}

.page-title .heading {
    padding: 140px 0 50px;
}

.page-title .heading h1 {
    color: var(--heading-color);
    font-weight: 700;
    margin-bottom: .75rem;
}

/* A linha de contexto: precisa ser lida, mas não competir com o título. */
.page-title .heading p {
    color: color-mix(in srgb, var(--default-color), transparent 25%);
    font-size: 1.05rem;
    max-width: 640px;
    margin-inline: auto;
}

/* A trilha (Início / Suporte) — o que diz onde a pessoa está.
 *
 * ⚠️ **Só o fundo é nosso.** O tema já cuida do separador `/` (por `::after`),
 * do espaçamento entre itens, da cor dos links e do destaque do item atual.
 *
 * A primeira versão redeclarava tudo isso e o resultado foi visível: um
 * `::before` próprio somava um segundo separador e a trilha saía
 * "Início / / Criar conta". Redeclarar o que o tema já faz não é neutro — é
 * assim que nasce esse tipo de defeito.
 */
.page-title .breadcrumbs {
    background-color: color-mix(in srgb, var(--surface-color), transparent 55%);
    border-top: 1px solid color-mix(in srgb, var(--default-color), transparent 92%);
    padding: 14px 0;
}

@media (max-width: 991px) {
    .page-title .heading {
        padding: 110px 0 40px;
    }

    .page-title .heading h1 {
        font-size: 1.9rem;
    }
}


/* --------------------------------------------------------------------------
   7. A caixa dos formulários curtos (login, cadastro)
   --------------------------------------------------------------------------
   `.reservation-form-bg` é do template antigo e não existe mais no Spotlight:
   a caixa do cadastro ficava sem fundo nenhum, solta no meio da página.
   -------------------------------------------------------------------------- */
.reservation-form-bg {
    background-color: var(--surface-color);
    border: 1px solid color-mix(in srgb, var(--default-color), transparent 88%);
    border-radius: 14px;
    padding-bottom: 1.5rem;
}


/* --------------------------------------------------------------------------
   8. Títulos que separam blocos de formulário — e o espaço entre eles
   --------------------------------------------------------------------------
   "Dados da empresa" e "Dados do titular" no cadastro. Sem a linha embaixo os
   dois grupos se misturam num paredão de campos, e é justamente a separação
   que explica por que o CPF aparece depois do CNPJ.
   -------------------------------------------------------------------------- */
.titulo-bloco {
    color: var(--heading-color);
    font-size: 1.05rem;
    font-weight: 600;
    border-bottom: 1px solid color-mix(in srgb, var(--accent-color), transparent 75%);

    /* ⚠️ O espaço vem daqui, e não das classes `mt-4 mb-3` do Bootstrap: o
       tema define `margin` nos títulos (`h1..h6`) DEPOIS delas na cascata, e o
       título acabava colado no campo anterior. Declarar aqui vence, porque
       este arquivo é o último a carregar. */
    margin-top: 2.5rem;
    margin-bottom: 1.25rem;
    padding-bottom: .5rem;
}


/* --------------------------------------------------------------------------
   9. A caixa do formulário: respiro
   --------------------------------------------------------------------------
   ⚠️ `.reservation-form-bg` vinha do tema ANTIGO e lá trazia o padding junto.
   No Spotlight a classe não existe: os campos encostavam nas bordas da caixa,
   e o formulário virava uma laje cinza sem margem nenhuma.
   -------------------------------------------------------------------------- */
.reservation-form-bg {
    padding: 2rem;
}

@media (max-width: 575px) {
    .reservation-form-bg {
        padding: 1.25rem;
    }
}

/* ⚠️ NÃO use `:first-of-type` aqui.
 *
 * Ele conta entre IRMÃOS, e os dois títulos vivem em divs diferentes
 * (`#bloco-empresa` e `#bloco-titular`): cada um é o primeiro `h5` do próprio
 * pai, então a regra zerava a margem dos DOIS — e "Dados do titular" colava no
 * campo de cima.
 *
 * ⚠️ **A regra que zerava o `#bloco-empresa` foi REMOVIDA (26/08/2026).** Ela
 * nasceu quando "Dados da empresa" era a primeira coisa da caixa. Hoje o
 * seletor Empresa/Pessoa física vem antes dele, e o título ficava grudado nos
 * dois botões — sem nada separando a escolha do bloco que ela comanda.
 *
 * O respiro certo é sempre o mesmo, e agora todo título de bloco o recebe. O
 * primeiro elemento da caixa é o rótulo "Esta conta é de", que traz o próprio.
 */


/* --------------------------------------------------------------------------
   10. A escolha do plano dentro do cadastro
   --------------------------------------------------------------------------
   ⚠️ `.opcoes-escolha` e `.opcao-pagamento` são classes do PAINEL
   (`assets/css/painel.css`), que a página pública não carrega. Sem estilo
   nenhum, os quatro planos viravam uma pilha de texto solto — nada indicava
   que eram escolhas, nem qual estava marcada.
   -------------------------------------------------------------------------- */
.opcoes-escolha {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
    gap: .75rem;
    margin-top: .5rem;
}

.opcao-pagamento {
    display: flex;
    flex-direction: column;
    gap: .15rem;
    padding: 1rem;
    border: 2px solid color-mix(in srgb, var(--default-color), transparent 85%);
    border-radius: 12px;
    background-color: color-mix(in srgb, var(--surface-color), transparent 35%);
    cursor: pointer;
    transition: .2s;
    text-align: center;
}

.opcao-pagamento:hover {
    border-color: color-mix(in srgb, var(--accent-color), transparent 50%);
}

/* A marcada precisa ser óbvia à distância: é a única coisa que diz o que a
   pessoa está prestes a contratar. */
.opcao-pagamento.selecionada {
    border-color: var(--accent-color);
    background-color: color-mix(in srgb, var(--accent-color), transparent 88%);
}

.opcao-pagamento h4 {
    font-size: 1rem;
    font-weight: 600;
    color: var(--heading-color);
    margin: 0;
}

.opcao-pagamento .valor {
    font-size: 1.25rem;
    font-weight: 700;
    color: var(--accent-color);
}

.opcao-pagamento p {
    font-size: .8rem;
    margin: 0;
    color: color-mix(in srgb, var(--default-color), transparent 35%);
}


/* --------------------------------------------------------------------------
   11. Botão sem classe
   --------------------------------------------------------------------------
   ⚠️ O `#btn-criar` é um `<button>` cru, sem classe: no tema antigo o CSS o
   pegava pelo seletor do formulário. Aqui ele saía como botão padrão do
   navegador — cinza, pequeno, no meio de uma página escura.
   -------------------------------------------------------------------------- */
.reservation-form-bg button[type="submit"] {
    background-color: var(--accent-color);
    color: var(--contrast-color);
    border: 2px solid var(--accent-color);
    padding: 12px 34px;
    border-radius: 50px;
    font-weight: 600;
    font-size: 1rem;
    transition: .3s;
}

.reservation-form-bg button[type="submit"]:hover:not(:disabled) {
    background-color: color-mix(in srgb, var(--accent-color), #fff 15%);
    border-color: color-mix(in srgb, var(--accent-color), #fff 15%);
    transform: translateY(-2px);
}

.reservation-form-bg button[type="submit"]:disabled {
    opacity: .6;
    cursor: progress;
}


/* --------------------------------------------------------------------------
   12. Linhas de formulário que não se desalinham
   --------------------------------------------------------------------------
   ⚠️ O defeito é sutil e aparece em toda linha de dois campos: um deles tem
   texto de ajuda embaixo e o outro não. A coluna com ajuda fica mais alta, e a
   linha SEGUINTE começa desencontrada — no cadastro, o "E-mail" descia abaixo
   do "Telefone" sem motivo aparente.

   A correção não é dar ajuda a todos os campos (texto inventado só para
   preencher é pior): é fazer cada coluna ocupar a altura toda e empurrar a
   ajuda para o rodapé dela.
   -------------------------------------------------------------------------- */
.reservation-form-bg .row > [class*="col-"] {
    display: flex;
    flex-direction: column;
}

/* A ajuda encosta no fim da coluna, alinhando a base de todas as colunas da
   linha independentemente de quantas têm texto. */
.reservation-form-bg .row > [class*="col-"] > .form-text {
    margin-top: .35rem;
}

/* Respiro entre as linhas do formulário. O `gy-3` do Bootstrap deixa 1rem, que
   fica apertado quando metade das colunas tem texto de ajuda. */
.reservation-form-bg .row.gy-3 {
    --bs-gutter-y: 1.4rem;
}

/* O bloco do plano precisa de mais ar: ele é a decisão da tela. */
.reservation-form-bg .form-label.mt-4 {
    margin-top: 2.5rem !important;
    display: block;
}

/* E o botão de enviar não pode encostar na última linha de campos. */
.reservation-form-bg .text-center.mt-4 {
    margin-top: 2.5rem !important;
}


/* ==========================================================================
   REFORMA DA UI PÚBLICA — 26/08/2026
   ==========================================================================
   Os blocos 1–12 acima corrigem defeitos pontuais do Spotlight. Os de baixo
   assumem mais liberdade sobre o template: onde o componente do tema não serve
   ao propósito, existe um componente nosso no lugar dele.
   ========================================================================== */


/* --------------------------------------------------------------------------
   13. A vitrine de planos
   --------------------------------------------------------------------------
   ⚠️ **Substitui `col-lg-4` + `.offering-block` na página de preços.**

   Dois defeitos ao mesmo tempo:

     · `col-lg-4` fixava TRÊS cartões por linha. Publicado um quarto plano, o
       último caía sozinho na segunda linha, centralizado — o "Ilimitado"
       parecia um bloco à parte, e não o topo da mesma escada;
     · `.offering-block` é o cartão de SERVIÇO do tema, desenhado na horizontal
       (`display:flex; align-items:flex-start`, ícone à esquerda). Como cartão
       de preço ele não tem hierarquia nenhuma: nome, preço e lista ficam todos
       no mesmo peso.

   O número de colunas vem do PHP, em `--colunas-planos`, porque quem sabe
   quantos planos existem é quem os buscou no banco. `minmax(0, 1fr)` e não
   `1fr`: o `1fr` tem `min-width:auto`, e uma linha de texto longa (o nome de um
   plano) faria a coluna estourar a grade em vez de quebrar.
   -------------------------------------------------------------------------- */
.secao-planos {
    padding: 60px 0 40px;
}

.vitrine-planos {
    display: grid;
    grid-template-columns: repeat(var(--colunas-planos, 3), minmax(0, 1fr));
    gap: 24px;
    align-items: stretch;
}

/* ⚠️ A ordem das faixas importa: o navegador aplica a ÚLTIMA que casar. Do
   maior para o menor, cada uma reduz o teto de colunas — e o `min()` preserva
   a decisão do PHP, senão dois planos publicados virariam duas colunas largas
   num tablet e três colunas vazias num desktop. */
@media (max-width: 1399px) {
    .vitrine-planos {
        grid-template-columns: repeat(min(var(--colunas-planos, 3), 3), minmax(0, 1fr));
    }
}

@media (max-width: 1199px) {
    .vitrine-planos {
        grid-template-columns: repeat(min(var(--colunas-planos, 3), 2), minmax(0, 1fr));
        gap: 20px;
    }
}

@media (max-width: 767px) {
    .vitrine-planos {
        grid-template-columns: minmax(0, 1fr);
    }
}

/* O cartão. `isolation` cria contexto de empilhamento próprio: sem ela o cartão
   em destaque, que se eleva com `translateY`, passava por baixo da sombra do
   vizinho. */
.plano-cartao {
    position: relative;
    isolation: isolate;
    display: flex;
    flex-direction: column;
    padding: 32px 26px 26px;
    border-radius: 16px;
    background: linear-gradient(
        180deg,
        color-mix(in srgb, var(--surface-color), transparent 12%) 0%,
        color-mix(in srgb, var(--surface-color), transparent 32%) 100%
    );
    border: 1px solid color-mix(in srgb, var(--default-color), transparent 88%);
    transition: transform .3s ease, border-color .3s ease, box-shadow .3s ease;
}

.plano-cartao:hover {
    transform: translateY(-4px);
    border-color: color-mix(in srgb, var(--accent-color), transparent 55%);
    box-shadow: 0 14px 40px rgba(0, 0, 0, .35);
}

/* --- O plano em destaque ---------------------------------------------------
   Borda de acento, elevação permanente e o selo em faixa no topo. Os três
   dizem a mesma coisa; o selo sozinho (como era antes) só marcava o NOME, e a
   escolha recomendada não se lia à distância. */
.plano-cartao--destaque {
    border-color: var(--accent-color);
    background: linear-gradient(
        180deg,
        color-mix(in srgb, var(--accent-color), transparent 90%) 0%,
        color-mix(in srgb, var(--surface-color), transparent 25%) 45%
    );
    box-shadow: 0 10px 36px color-mix(in srgb, var(--accent-color), transparent 82%);
    transform: translateY(-8px);
}

.plano-cartao--destaque:hover {
    transform: translateY(-12px);
    box-shadow: 0 18px 48px color-mix(in srgb, var(--accent-color), transparent 72%);
}

/* ⚠️ A elevação do destaque só existe onde há mais de uma coluna. Empilhado no
   celular, um cartão 8px acima do vizinho não se lê como destaque — se lê como
   espaçamento errado. */
@media (max-width: 767px) {
    .plano-cartao--destaque,
    .plano-cartao--destaque:hover {
        transform: none;
    }
}

.plano-selo {
    position: absolute;
    top: 0;
    left: 50%;
    transform: translate(-50%, -50%);
    background: var(--accent-color);
    color: var(--contrast-color);
    font-family: var(--nav-font);
    font-size: .68rem;
    font-weight: 700;
    letter-spacing: .06em;
    text-transform: uppercase;
    padding: 5px 16px;
    border-radius: 30px;
    white-space: nowrap;
}

/* Piso de altura para o bloco nome+descrição, usado por quem NÃO tem `subgrid`
   (ver o `@supports` logo abaixo): sem ele, um plano de descrição curta joga o
   preço para cima e a linha de preços da vitrine sai serrilhada. */
.plano-topo {
    min-height: 92px;
}

/* ⚠️ **`min-height` alinha por chute; `subgrid` alinha de verdade.**
 *
 * Os cartões têm descrições de tamanhos diferentes ("Sem limite de telas nem de
 * armazenamento, com suporte prioritário" ocupa três linhas onde os outros
 * ocupam duas). Com cada cartão medindo a própria altura, o preço do Ilimitado
 * nascia mais baixo que os outros três — e a faixa de telas, e a lista, e o
 * botão. Quatro réguas diferentes na mesma vitrine.
 *
 * `subgrid` faz os cartões compartilharem as MESMAS linhas da grade mãe: cada
 * faixa (nome+descrição, preço, medida, itens, botão) tem uma altura só, ditada
 * pelo cartão mais alto. Não é ajuste fino de pixel — é a grade fazendo o que a
 * grade faz.
 *
 * O `min-height` acima fica como piso para quem não tem `subgrid` (Safari < 16,
 * navegador de TV Box): lá o alinhamento é aproximado, mas nunca quebrado.
 */
@supports (grid-template-rows: subgrid) {
    .vitrine-planos {
        /* nome+descrição · preço · medida · itens (estica) · botão */
        grid-template-rows: auto auto auto 1fr auto;
    }

    .plano-cartao {
        display: grid;
        grid-template-rows: subgrid;
        grid-row: span 5;
        /* Com subgrid o espaço entre as faixas é o `row-gap`, e não a margem de
           cada elemento — senão o gap soma às margens e o cartão respira demais. */
        row-gap: 0;
    }

    .plano-topo {
        min-height: 0;
    }

    /* ⚠️ Empilhado, o subgrid não tem o que alinhar — há uma coluna só — e as
       linhas implícitas do segundo cartão em diante deixariam de casar com as
       cinco declaradas. Um cartão por linha volta a medir a própria altura. */
    @media (max-width: 767px) {
        .plano-cartao {
            display: flex;
            grid-row: auto;
        }

        .plano-topo {
            min-height: 0;
        }
    }
}

.plano-nome {
    font-size: 1.35rem;
    font-weight: 700;
    color: var(--heading-color);
    margin: 0 0 .4rem;
}

/* A descrição precisa ser lida sem competir com o preço, que é o que a pessoa
   veio buscar. */
.plano-resumo {
    font-size: .88rem;
    line-height: 1.55;
    color: color-mix(in srgb, var(--default-color), transparent 35%);
    margin: 0;
}

.plano-preco {
    font-family: var(--heading-font);
    font-size: 2.4rem;
    font-weight: 700;
    line-height: 1;
    color: var(--heading-color);
    margin: 22px 0 0;
    /* Números de larguras diferentes desalinham a vírgula entre um cartão e
       outro; `tabular-nums` dá a todos a mesma caixa. */
    font-variant-numeric: tabular-nums;
}

.plano-periodo {
    font-size: .85rem;
    font-weight: 400;
    color: color-mix(in srgb, var(--default-color), transparent 45%);
}

/* A medida do plano: quantas telas. É o número que decide a compra, e por isso
   sai da lista e ganha faixa própria logo abaixo do preço. */
.plano-medida {
    display: flex;
    align-items: center;
    gap: 8px;
    margin: 18px 0 0;
    padding: 10px 14px;
    border-radius: 10px;
    background: color-mix(in srgb, var(--accent-color), transparent 92%);
    border: 1px solid color-mix(in srgb, var(--accent-color), transparent 82%);
    font-size: .95rem;
    color: var(--default-color);
}

.plano-medida i {
    color: var(--accent-color);
    font-size: 1.05rem;
}

.plano-medida strong {
    color: var(--heading-color);
}

.plano-itens {
    list-style: none;
    margin: 20px 0 26px;
    padding: 0;
    /* Empurra o botão para o rodapé: os cartões terminam na mesma linha mesmo
       com descrições de tamanhos diferentes. */
    flex: 1 1 auto;
}

.plano-itens li {
    display: flex;
    align-items: flex-start;
    gap: 9px;
    padding: 7px 0;
    font-size: .92rem;
    color: color-mix(in srgb, var(--default-color), transparent 18%);
    border-bottom: 1px solid color-mix(in srgb, var(--default-color), transparent 93%);
}

.plano-itens li:last-child {
    border-bottom: 0;
}

.plano-itens i {
    color: var(--accent-color);
    font-size: 1rem;
    line-height: 1.5;
    flex-shrink: 0;
}

.plano-acao {
    width: 100%;
    text-align: center;
    margin-top: auto;
}

/* --- O cartão sob consulta ------------------------------------------------
   ⚠️ **Ele não é um cartão diferente — é o mesmo cartão com três faixas vazias.**

   A vitrine é `subgrid`: todo cartão declara `grid-row: span 5` e as cinco
   faixas (nome · preço · medida · itens · botão) são compartilhadas. Um cartão
   que omitisse preço, medida e itens teria três faixas a menos, o `span 5`
   deixaria de casar com o que ele de fato ocupa, e o cartão escorregaria para
   fora da linha — o botão dele nasceria na altura do preço dos vizinhos.

   Por isso a view mantém os blocos e o CSS apenas os esvazia: `.plano-vao`
   ocupa a faixa da medida sem desenhar nada, e `.plano-convite` ocupa a faixa
   dos itens (a que estica, `1fr`) com o texto que substitui a lista.

   A borda tracejada é o que diz "este não é um preço de tabela" sem precisar
   escrever a frase: ela lê como formulário em aberto, não como oferta fechada.
   -------------------------------------------------------------------------- */
.plano-cartao--consulta {
    border-style: dashed;
    border-color: color-mix(in srgb, var(--accent-color), transparent 60%);
}

.plano-cartao--consulta:hover {
    border-style: dashed;
    border-color: color-mix(in srgb, var(--accent-color), transparent 30%);
}

/* "Valor a combinar" no lugar do número. Menor que o preço dos vizinhos — 2.4rem
   fazia a frase quebrar em duas linhas e empurrar o resto do cartão para baixo —
   mas na MESMA faixa da grade, então as bases se alinham.
   Sem `tabular-nums`: não há algarismo a alinhar. */
.plano-preco--consulta {
    font-size: 1.6rem;
    color: var(--accent-color);
    font-variant-numeric: normal;
}

/* ⚠️ **`align-self:end` só pode existir onde o cartão é GRID.**
   Na faixa do preço (ditada pelo cartão mais alto) um texto menor flutuaria no
   topo enquanto os "R$" dos vizinhos assentam embaixo — daí o `end`. Mas
   empilhado no celular o cartão volta a ser `display:flex` em coluna, e ali o
   eixo transversal é o HORIZONTAL: o mesmo `end` jogou "Valor a combinar" para
   a direita, sozinho, enquanto todo o resto do cartão ficou à esquerda.
   Dentro do `@supports` + acima de 767px ele alinha o que deve alinhar. */
@supports (grid-template-rows: subgrid) {
    @media (min-width: 768px) {
        .plano-preco--consulta {
            align-self: end;
        }
    }
}

/* A faixa da medida, vazia. Não é `display:none`: escondida, ela deixaria de
   ocupar a linha da grade e o `span 5` quebraria — que é justamente o defeito
   que esta seção existe para evitar. */
.plano-vao {
    margin: 0;
    padding: 0;
    min-height: 0;
}

/* A faixa dos itens (a que estica). O texto ocupa o lugar da lista de limites
   sem fingir ser uma: nada de ícone de check, que prometeria item incluído.

   ⚠️ A margem superior é MENOR que a dos `.plano-itens` (20px) de propósito. O
   cartão sob consulta tem a faixa da medida vazia — os vizinhos gastam ali uma
   caixa de ~44px que ele não desenha — e com a mesma margem o texto nascia
   flutuando no meio de um vão. Este cartão encosta o texto no preço; a faixa
   vazia continua reservando a linha da grade, que é o que mantém os botões
   alinhados. */
.plano-convite {
    margin: 4px 0 26px;
    flex: 1 1 auto;
}

.plano-convite p {
    margin: 0;
    font-size: .92rem;
    line-height: 1.6;
    color: color-mix(in srgb, var(--default-color), transparent 22%);
}

/* A nota do rodapé da vitrine: o que vale para todos os planos. */
.planos-nota {
    display: flex;
    align-items: center;
    justify-content: center;
    gap: 10px;
    flex-wrap: wrap;
    margin: 48px auto 0;
    padding: 16px 24px;
    max-width: 720px;
    text-align: center;
    border-radius: 12px;
    background: color-mix(in srgb, var(--surface-color), transparent 45%);
    border: 1px solid color-mix(in srgb, var(--default-color), transparent 90%);
    color: color-mix(in srgb, var(--default-color), transparent 20%);
    font-size: .95rem;
}

.planos-nota i {
    color: var(--accent-color);
    font-size: 1.15rem;
}


/* --------------------------------------------------------------------------
   14. As páginas de erro e os estados vazios
   --------------------------------------------------------------------------
   ⚠️ **`view/errors/404.php` usava `.vazio`, `.btn-marca` e
   `.btn-marca-contorno` — classes de `assets/css/tema.css`, que o layout
   público NÃO carrega.**

   O resultado estava na tela: o ícone `bi-signpost-split` saía do tamanho de
   uma letra (o `.vazio .bi { font-size: 2.6rem }` nunca chegou), e os dois
   botões viravam links de texto cru, um do lado do outro, sem nada que os
   identificasse como ação.

   A correção não é carregar o `tema.css` no site público — ele é o CSS do
   painel do CLIENTE, com dezenas de regras que não têm o que fazer aqui. É ter
   o estado vazio como componente próprio do site.
   -------------------------------------------------------------------------- */
.vazio-publico {
    max-width: 560px;
    margin: 0 auto;
    padding: 56px 24px 64px;
    text-align: center;
}

.vazio-publico > i {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 88px;
    height: 88px;
    margin-bottom: 24px;
    border-radius: 50%;
    font-size: 2.4rem;
    color: var(--accent-color);
    background: color-mix(in srgb, var(--accent-color), transparent 90%);
    border: 1px solid color-mix(in srgb, var(--accent-color), transparent 78%);
}

.vazio-publico h3 {
    font-size: 1.6rem;
    font-weight: 700;
    color: var(--heading-color);
    margin-bottom: .75rem;
}

.vazio-publico p {
    color: color-mix(in srgb, var(--default-color), transparent 30%);
    margin-bottom: 0;
}

/* As ações do estado vazio: botões de verdade, com respiro entre eles e
   empilhando no celular em vez de espremer. */
.vazio-acoes {
    display: flex;
    align-items: center;
    justify-content: center;
    gap: 12px;
    flex-wrap: wrap;
    margin-top: 32px !important;
}

@media (max-width: 420px) {
    .vazio-acoes {
        flex-direction: column;
        align-items: stretch;
    }
}

/* O detalhe técnico do erro 500 só aparece em desenvolvimento. Ele é leitura de
   quem depura: alinhado à esquerda, monoespaçado e com rolagem própria — sem
   isso um trace longo alargava a página inteira. */
.erro-detalhe {
    margin-top: 32px;
    padding: 18px;
    border-radius: 10px;
    background: #0d0d0d;
    border: 1px solid color-mix(in srgb, var(--default-color), transparent 88%);
    color: #e8e8e8;
    text-align: left;
    font-size: .8rem;
    line-height: 1.6;
    max-height: 340px;
    overflow: auto;
    white-space: pre-wrap;
    word-break: break-word;
}


/* --------------------------------------------------------------------------
   15. O autofill do Chrome apagava o campo preenchido
   --------------------------------------------------------------------------
   ⚠️ **Este é o defeito mais grave desta rodada, e o mais fácil de não
   reproduzir:** ele só aparece na SEGUNDA visita, depois que o navegador
   guardou a senha.

   O Chrome pinta o campo autopreenchido com um amarelo/branco próprio via
   `-webkit-autofill`, e essa cor NÃO é `background-color`: é uma sombra interna
   do próprio navegador. Nenhuma regra de `background` do bloco 2 a alcança. O
   campo virava um retângulo branco com o texto claro do tema por cima —
   ilegível. Foi o que aconteceu com a Senha na tela de login.

   A única forma que funciona é sobrescrever essa sombra com uma `inset` do
   tamanho do campo, e mandar o texto com `-webkit-text-fill-color` (o `color`
   comum também é ignorado pelo autofill).

   `transition-delay` gigante é o truque conhecido para segurar a cor: o Chrome
   reaplica o amarelo numa transição, e o atraso a empurra para depois do fim
   do universo.
   -------------------------------------------------------------------------- */
.form-control:-webkit-autofill,
.form-control:-webkit-autofill:hover,
.form-control:-webkit-autofill:focus,
.form-control:-webkit-autofill:active {
    -webkit-box-shadow: 0 0 0 1000px var(--surface-color) inset !important;
    box-shadow: 0 0 0 1000px var(--surface-color) inset !important;
    -webkit-text-fill-color: var(--default-color) !important;
    caret-color: var(--default-color);
    transition: background-color 9999s ease-in-out 0s;
}

.form-control:-webkit-autofill:focus {
    -webkit-box-shadow:
        0 0 0 1000px var(--surface-color) inset,
        0 0 0 3px color-mix(in srgb, var(--accent-color), transparent 85%) !important;
    box-shadow:
        0 0 0 1000px var(--surface-color) inset,
        0 0 0 3px color-mix(in srgb, var(--accent-color), transparent 85%) !important;
}


/* --------------------------------------------------------------------------
   16. A caixa dos formulários curtos
   --------------------------------------------------------------------------
   ⚠️ O login usava `.offering-block` — o cartão de serviço do tema, que é
   `display:flex` na horizontal. O formulário inteiro virava a "coluna do
   texto" de um cartão de serviço, e herdava dele o hover de borda verde: passar
   o mouse sobre a página acendia a caixa de login inteira, sem que nada ali
   fosse clicável.

   `.caixa-form` é a caixa de verdade: um contêiner de formulário, sem hover,
   com o respiro pensado para campos.
   -------------------------------------------------------------------------- */
.caixa-form {
    background: color-mix(in srgb, var(--surface-color), transparent 15%);
    border: 1px solid color-mix(in srgb, var(--default-color), transparent 88%);
    border-radius: 16px;
    padding: 34px;
    box-shadow: 0 10px 34px rgba(0, 0, 0, .28);
}

@media (max-width: 575px) {
    .caixa-form {
        padding: 22px;
    }
}

.caixa-form .btn {
    /* Botão de formulário ocupa a linha: num formulário curto ele é a única
       ação, e um botão estreito no meio da caixa parece opcional. */
    padding-block: 13px;
}

/* O rodapé de links da caixa (esqueci a senha, criar conta): separado do botão
   por uma linha, senão vira continuação dele. */
.caixa-form-rodape {
    margin-top: 26px;
    padding-top: 22px;
    border-top: 1px solid color-mix(in srgb, var(--default-color), transparent 90%);
    text-align: center;
    font-size: .92rem;
    color: color-mix(in srgb, var(--default-color), transparent 35%);
}

.caixa-form-rodape p {
    margin: 0;
}

.caixa-form-rodape p + p {
    margin-top: 10px;
}

/* O aviso de que o código do QR foi lido. Ele é a explicação de por que a
   pessoa está nesta tela, e precisa se distinguir do formulário. */
.aviso-pareamento {
    display: flex;
    align-items: flex-start;
    gap: 12px;
    margin-bottom: 26px;
    padding: 14px 16px;
    border-radius: 12px;
    background: color-mix(in srgb, var(--accent-color), transparent 92%);
    border: 1px solid color-mix(in srgb, var(--accent-color), transparent 78%);
    font-size: .92rem;
    line-height: 1.55;
}

.aviso-pareamento i {
    color: var(--accent-color);
    font-size: 1.2rem;
    flex-shrink: 0;
}

.aviso-pareamento code {
    background: color-mix(in srgb, var(--accent-color), transparent 80%);
    color: var(--heading-color);
    padding: 1px 8px;
    border-radius: 6px;
    font-weight: 700;
    letter-spacing: .08em;
}


/* --------------------------------------------------------------------------
   17. O cadastro: a caixa e a escolha do plano
   --------------------------------------------------------------------------
   `.reservation-form-bg` (blocos 7 e 9) continua valendo para quem ainda a usa;
   aqui o que muda é a densidade da grade de planos DENTRO do formulário, que
   com quatro planos numa coluna `col-lg-8` deixava o quarto sozinho embaixo —
   a mesma quebra que a vitrine de /precos tinha.
   -------------------------------------------------------------------------- */
.opcoes-escolha.opcoes-planos {
    grid-template-columns: repeat(auto-fit, minmax(118px, 1fr));
    gap: .6rem;
}

/* Marcada precisa ser óbvia à distância: é a única coisa na tela que diz o que
   a pessoa está prestes a contratar. O anel externo aguenta o daltonismo que a
   diferença de matiz sozinha não aguenta. */
.opcao-pagamento.selecionada {
    box-shadow: 0 0 0 3px color-mix(in srgb, var(--accent-color), transparent 82%);
}

.opcao-pagamento:focus-within {
    outline: 2px solid var(--accent-color);
    outline-offset: 2px;
}


/* --------------------------------------------------------------------------
   18. Acessibilidade do foco
   --------------------------------------------------------------------------
   O tema não desenha foco visível em link nenhum: quem navega por teclado
   atravessa o site inteiro sem saber onde está. `:focus-visible` (e não
   `:focus`) para que o anel não apareça no clique de mouse.
   -------------------------------------------------------------------------- */
a:focus-visible,
button:focus-visible,
.btn:focus-visible {
    outline: 2px solid var(--accent-color);
    outline-offset: 3px;
    border-radius: 4px;
}

/* ⚠️ Quem pediu para reduzir movimento no sistema operacional não pode receber
   cartão que sobe no hover nem bloco que desliza ao rolar. O AOS respeita a
   preferência por conta própria; a elevação dos cartões é nossa. */
@media (prefers-reduced-motion: reduce) {
    .plano-cartao,
    .plano-cartao:hover,
    .plano-cartao--destaque,
    .plano-cartao--destaque:hover {
        transform: none;
        transition: none;
    }
}

/* ===========================================================================
   A vitrine do aplicativo (/aplicativo)
   ---------------------------------------------------------------------------
   ⚠️ Classes do SITE PÚBLICO. O layout público não carrega `painel.css` nem
   `tema.css`, então nada aqui pode depender deles.

   ⚠️ **Toda cor sai dos tokens do tema, nunca de hex fixo.** A primeira versão
   deste bloco trazia `background:#fff` e `#6c757d` — escritos por hábito, sem
   olhar o resto do arquivo. O site é de tema ESCURO: as caixas saíram brancas
   no meio da página e o `strong`, herdando a cor clara do tema, ficou quase
   invisível sobre elas. Nada acusa isso: `php -l` passa, o HTTP dá 200 e o
   teste de HTML passa, porque o markup está certo e só o VALOR está errado.
   Só a captura mostra.

   As duas portas (Google Play e APK direto) são o MESMO componente
   (`.app-porta`): são escolhas equivalentes, e desenhar uma como botão
   principal e a outra como link secundário decidiria pelo cliente qual usar —
   quando quem decide é o aparelho que ele tem na mão.
   =========================================================================== */

.app-portas {
    display: grid;
    gap: 14px;
    /* auto-fit + minmax: com as duas portas ficam lado a lado no desktop; com
       uma só, ela ocupa a largura inteira em vez de ficar meia caixa órfã. */
    grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
    margin-top: 22px;
}

.app-porta {
    display: flex;
    align-items: center;
    gap: 14px;
    padding: 16px 18px;
    border-radius: 12px;
    background: color-mix(in srgb, var(--default-color), transparent 94%);
    border: 1px solid color-mix(in srgb, var(--default-color), transparent 82%);
    color: var(--default-color);
    text-decoration: none;
    transition: border-color .2s, background-color .2s, transform .2s;
}

.app-porta:hover,
.app-porta:focus {
    background: color-mix(in srgb, var(--accent-color), transparent 88%);
    border-color: var(--accent-color);
    transform: translateY(-2px);
    color: var(--default-color);
    text-decoration: none;
}

.app-porta > i {
    font-size: 30px;
    line-height: 1;
    color: var(--accent-color);
    flex: 0 0 auto;
}

/* ⚠️ O `<span>` é flex-column de propósito: sem ele, `strong` e `small` seriam
   filhos diretos do flex com `gap` e o espaçamento entraria ENTRE eles na
   horizontal — a mesma armadilha do `.plano-medida`. */
.app-porta > span {
    display: flex;
    flex-direction: column;
    min-width: 0;
}

.app-porta strong {
    font-size: 1.02rem;
    color: var(--heading-color);
}

.app-porta small {
    color: color-mix(in srgb, var(--default-color), transparent 40%);
}

.app-requisitos {
    list-style: none;
    padding: 0;
    margin: 0;
}

.app-requisitos li {
    display: flex;
    align-items: flex-start;
    gap: 8px;
    padding: 6px 0;
}

.app-requisitos li > i {
    color: var(--accent-color);
    margin-top: 3px;
    flex: 0 0 auto;
}

/* A ficha técnica: rótulo e valor em duas colunas.
   ⚠️ `display:grid` num `<dl>`, e não `.row` do Bootstrap — misturar os dois é
   o que quebrou `.ficha-dados` (o CSS órfão do MesaPronta). */
.app-ficha {
    display: grid;
    grid-template-columns: auto 1fr;
    gap: 8px 18px;
    margin: 0;
}

.app-ficha dt {
    font-weight: 500;
    color: color-mix(in srgb, var(--default-color), transparent 45%);
    font-size: .92rem;
}

.app-ficha dd {
    margin: 0;
    color: var(--heading-color);
}

.app-soma code {
    display: block;
    word-break: break-all;
    font-size: .76rem;
    line-height: 1.6;
    background: color-mix(in srgb, var(--default-color), transparent 94%);
    border: 1px solid color-mix(in srgb, var(--default-color), transparent 88%);
    border-radius: 8px;
    padding: 9px 11px;
    color: color-mix(in srgb, var(--default-color), transparent 25%);
}

/* O bloco do app na tela de pareamento é do PAINEL (AdminLTE), e o painel tem
   CSS próprio — ele não usa nada daqui. */

/* ---------------------------------------------------------------------------
   CENTRAL DE AJUDA (/ajuda, migration 013)

   ⚠️ Nenhuma cor fixa aqui. O site é TEMA ESCURO, e um `#fff` escrito por
   hábito produz caixa branca no meio da página com o texto herdando a cor
   clara — quase invisível. Nada disso é acusado por `php -l`, pelo HTTP 200
   nem pelo teste de markup: só a captura mostra. Tudo sai de
   `color-mix()` sobre os tokens do tema.
   -------------------------------------------------------------------------- */

.ajuda-busca .form-control {
    background: color-mix(in srgb, var(--surface-color), transparent 15%);
    border: 1px solid color-mix(in srgb, var(--default-color), transparent 82%);
    color: var(--default-color);
    padding: 12px 18px;
}

.ajuda-busca .form-control::placeholder {
    color: color-mix(in srgb, var(--default-color), transparent 55%);
}

.ajuda-busca .form-control:focus {
    background: color-mix(in srgb, var(--surface-color), transparent 8%);
    border-color: var(--accent-color);
    box-shadow: none;
    color: var(--default-color);
}

/* O botão da busca senta ao lado do campo: o `border-radius: 50px` de
   `.btn-accent` deixaria uma fresta entre os dois dentro do input-group. */
.ajuda-busca .btn-accent {
    padding: 12px 24px;
    border-radius: 0 8px 8px 0;
}

.ajuda-busca .form-control {
    border-radius: 8px 0 0 8px;
}

/* ---------------------------------------------------------------------------
   A lista de artigos.

   `.list-group-item` do Bootstrap nasce com fundo BRANCO e texto escuro — é a
   armadilha da cor fixa vinda do framework, e não do nosso CSS. Sem esta
   sobrescrita a lista sai como uma faixa branca atravessando a página escura.
   -------------------------------------------------------------------------- */

.ajuda-lista .list-group-item {
    background: color-mix(in srgb, var(--surface-color), transparent 15%);
    border: 1px solid color-mix(in srgb, var(--default-color), transparent 88%);
    color: var(--default-color);
    padding: 16px 20px;
    margin-bottom: 10px;
    border-radius: 12px;
    transition: .25s;
}

.ajuda-lista .list-group-item:hover {
    background: color-mix(in srgb, var(--surface-color), transparent 4%);
    border-color: color-mix(in srgb, var(--accent-color), transparent 55%);
    transform: translateY(-2px);
}

/* O item inteiro é o link — o `strong` não pode acender sozinho e sugerir que
   só o título é clicável. */
.ajuda-lista .list-group-item strong {
    color: var(--heading-color);
}

.ajuda-lista .list-group-item:hover strong {
    color: var(--accent-color);
}

/* Os cards de assunto da capa: `h-100` iguala a altura na linha, e o título
   precisa herdar a cor de heading — dentro de `.caixa-form` ele é um link. */
.caixa-form h4 a {
    color: var(--heading-color);
}

.caixa-form h4 a:hover {
    color: var(--accent-color);
}
