/* Visual (cor, forma, tipografia) fica por conta do Pico.css classless
   carregado no index.html -- aqui só o que é FUNCIONAL pro app rodar,
   coisa que nenhum framework de estilo resolve sozinho. */

/* Mobile-first -- autônomo de campo usa isso no celular, não no desktop.
   Pico classless só centraliza header/main/footer diretos do body (não
   é o nosso caso, usamos <section>), então isso continua sendo nosso. */
body {
    max-width: 480px;
    margin: 0 auto;
    padding: 16px;
}

/* Achado no print do usuário: existia só ".view.hidden" (seletor
   composto -- exige as DUAS classes) -- funcionava pras <section>, mas
   #logo-preview usa só class="hidden" (sem "view"), então esconder virava
   NADA pra ela: ícone de imagem quebrada + alt="Logo atual" apareciam
   sempre, mesmo autônomo sem logo nenhuma. Regra genérica cobre os dois
   casos com uma linha só -- ".view" continua existindo só como marcador
   pro querySelectorAll(".view") de mostrarView(), não precisa de CSS. */
.hidden { display: none; }

/* Reforça o tema claro fixado no <html data-theme="light"> (ver o
   comentário longo lá): color-scheme diz ao NAVEGADOR pra desenhar os
   controles nativos (calendário do type="date", spinner do type="number",
   barra de rolagem) na versão clara também -- sem isso, o campo de data
   continuaria com o miolo escuro dentro de uma tela branca. */
:root {
    color-scheme: light;
}

input, select, button {
    width: 100%;
    font-size: 16px; /* evita zoom automático no iOS ao focar input */
    box-sizing: border-box;
}

/* Pedido do usuário: botões empilhados (Home, Agenda, Perfil, Novo
   orçamento etc.) ficavam colados um no outro -- width:100% sem margem
   nenhuma entre eles. `li button` (regra mais específica, abaixo) sobrepõe
   isso pros botões de ação dentro de item de lista, que já tinham o
   próprio espaçamento -- essa aqui é só pros botões de tela inteira. */
button {
    margin-bottom: 8px;
}

/* Botões DENTRO de item de lista (ex: "Lembrar"/"Concluído"/"Cancelar"
   na Agenda, "Marcar concluído" na Home) são ação secundária de uma
   linha, não CTA de tela inteira -- sem isso herdam width:100% e cada
   botão vira uma linha própria, deixando a lista gigante. */
li button {
    width: auto;
    display: inline-block;
    margin: 4px 4px 0 0;
    padding: 6px 10px;
    font-size: 14px;
}

/* Achado no print do usuário: texto + botões ficavam soltos dentro do
   mesmo <li> (elementos inline), então quebravam de linha de forma
   inconsistente dependendo do tamanho do nome do cliente -- às vezes o
   1º botão colava do lado do texto, às vezes ia todo mundo pra linha de
   baixo. app.js agora bota os botões dentro deste wrapper (div é
   block-level por padrão) -- garante SEMPRE a mesma linha nova abaixo de
   data/nome, com o mesmo espaçamento, em todo item da lista.

   2º achado no print do usuário: com 4 botões na Agenda (Lembrar/Gerar
   orçamento/Concluído/Cancelar), o texto "Gerar orçamento" sozinho não
   cabe mais nos 480px do container -- fazia o 4º botão (Cancelar) cair
   pra uma 2ª linha, um "quebrado" que o usuário não quer. Em vez de
   apertar fonte/padding até talvez ainda não caber, ou deixar quebrar,
   vira uma fileira que ROLA na horizontal (flex + overflow-x) -- todo
   botão sempre "um ao lado do outro" numa linha só, com scroll de dedo
   se a tela for estreita demais pra mostrar tudo de uma vez. Padrão comum
   em app mobile pra fileira de ações (ex: chips de ação do Gmail). */
.linha-acoes {
    margin-top: 4px;
    display: flex;
    flex-wrap: nowrap;
    gap: 6px;
    overflow-x: auto;
    padding-bottom: 2px; /* não corta a borda/sombra do botão ao rolar */
    /* CAUSA REAL da "mancha" relatada pelo usuário (v27→v29): a v27 tentou
       o aviso de "tem mais botão pra rolar" com um ::after de degradê
       (position:absolute, right:0) indo de transparent até a cor de FUNDO
       DA TELA (branco/rosa). Isso pinta um retângulo dessa cor por cima de
       QUALQUER botão que caia sob os últimos 18px da fileira -- e os
       botões daqui são AZUIS (.linha-acoes button:not(.btn-perigo)...,
       mais abaixo), não brancos. Resultado: branco em cima de azul, a
       "sombra" no meio do botão "Calendário" -- 100% reproduzível parado,
       nunca foi um artefato de compositing/scroll (por isso remover
       -webkit-overflow-scrolling, tentativa da v28, não resolveu).
       Fix: mask-image em vez de retângulo colorido. Mask desbota o
       CONTEÚDO real (a cor do próprio botão) perto da borda, em vez de
       empastar uma cor de fundo que não combina com o que está por baixo
       -- não depende mais de casar cor de fundo por cartão, então o
       --cor-fundo-fade e o override pro compromisso vencido saem daqui. */
    mask-image: linear-gradient(to right, #000 calc(100% - 18px), transparent);
    -webkit-mask-image: linear-gradient(to right, #000 calc(100% - 18px), transparent);
}
.linha-acoes button {
    flex: 0 0 auto;
    white-space: nowrap;
    margin: 0; /* espaçamento já vem do gap do flex, não duplica com li button */
}

/* Preview da logo em "Meu perfil". Achado no print do usuário: sem
   width/height fixos, uma logo pequena aparecia minúscula (ilegível) e
   uma sem "hidden" funcionando (bug à parte, ver .hidden acima) mostrava
   ícone de imagem quebrada. Caixa fixa + object-fit:contain resolve os
   dois lados: logo grande é reduzida, logo pequena é ampliada, sempre
   sem distorcer proporção (contain nunca corta nem estica). Fundo cinza
   claro é só pra logo com PNG transparente não sumir contra o branco da
   página. */
#logo-preview {
    display: block;
    width: 140px;
    height: 90px;
    object-fit: contain;
    background: #f4f4f4;
    border-radius: 4px;
}

/* Tabela do Financeiro (coluna Serviço concatena itens, pode passar dos
   480px do container) -- rola só ela na horizontal, sem forçar a página
   toda a rolar de lado num celular estreito. */
.tabela-scroll {
    overflow-x: auto;
}

/* Achado na revisão visual (print real do Financeiro em 430px): a tabela
   ficava mais larga que a tela e a coluna VALOR -- a que o autônomo mais
   olha -- era a última, então saía do enquadramento: ele via "R$ 1.00..."
   cortado na borda e precisava rolar de lado pra ler dinheiro.
   table-layout: fixed trava a tabela na largura da tela e distribui as
   colunas por porcentagem; quem cede espaço é Serviço (texto descritivo,
   quebra sem prejuízo), e o dinheiro fica inteiro, alinhado à direita como
   em qualquer extrato. */
.tabela-scroll table {
    table-layout: fixed;
    width: 100%;
    font-size: 0.85rem;   /* cabe as 4 colunas em tela de 360-430px */
}
/* Padding do Pico é generoso pra desktop; em 4 colunas no celular ele
   sozinho já consome ~25% da largura útil. */
.tabela-scroll th,
.tabela-scroll td {
    padding-left: 4px;
    padding-right: 4px;
    overflow-wrap: anywhere;   /* descrição concatenada pode ter palavra longa */
    vertical-align: top;   /* Cliente quebra em 2 linhas; alinhado em cima
                               fica com "cara de extrato" ao lado da Data
                               em vez de flutuar centralizado na linha. */
}
/* Data e Valor não quebram (data partida em "10/01/202" + "6" e dinheiro
   partido em duas linhas eram o que mais poluía a leitura); Cliente e
   Serviço são texto e cedem espaço.

   Achado do usuário (print real): com só 4px de padding dos dois lados,
   "06/09/2026" e "Monica Sousa" ficavam praticamente colados -- sem
   separador nenhum entre as colunas 1 e 2, a tabela lia como um bloco só.
   Sobe o respiro só NESSA borda (a que faltava), sem mexer nas outras --
   Serviço/Valor já tinham a borda direita da tela como limite natural. */
.tabela-scroll th:nth-child(1), .tabela-scroll td:nth-child(1) { width: 21%; white-space: nowrap; padding-right: 10px; }
.tabela-scroll th:nth-child(2), .tabela-scroll td:nth-child(2) { width: 24%; padding-left: 10px; }
.tabela-scroll th:nth-child(3), .tabela-scroll td:nth-child(3) { width: 27%; }
.tabela-scroll th:nth-child(4), .tabela-scroll td:nth-child(4) {
    width: 28%;
    text-align: right;
    white-space: nowrap;
}

/* Pedido do usuário: "dias" visível do lado do número de validade, não só
   no rótulo de cima -- input encolhe (sobrepõe o width:100% genérico) e
   divide a linha com a palavra fixa ao lado. */
.campo-com-sufixo {
    display: flex;
    align-items: center;
    gap: 8px;
    margin-bottom: 8px;
}
.campo-com-sufixo input {
    width: auto;
    flex: 1;
    margin-bottom: 0;
}
.campo-com-sufixo .sufixo {
    white-space: nowrap;
    color: #555;
}

/* Bairros do perfil (pedido do usuário): input + botão "Adicionar" numa
   linha só, mesma ideia de layout do .campo-com-sufixo acima -- o botão
   não pode encolher (senão o texto "Adicionar" quebra linha). */
.campo-com-botao {
    display: flex;
    align-items: center;
    gap: 8px;
}
.campo-com-botao input {
    flex: 1;
    margin-bottom: 0;
}
.campo-com-botao button {
    flex-shrink: 0;
    width: auto;
    margin-bottom: 0;
}

/* Lista de "chips" (bairros adicionados) -- cada um removível com o ×.
   role=list/listitem não muda (já são ul/li); o × é role=button pro
   mesmo motivo dos alertas da Home (foco de teclado, Enter/Espaço). */
.lista-chips {
    display: flex;
    flex-wrap: wrap;
    gap: 6px;
    list-style: none;
    padding: 0;
    margin: 4px 0 16px;
}
.lista-chips li {
    display: flex;
    align-items: center;
    gap: 6px;
    /* rgba fixo em vez de color-mix() -- color-mix() não roda em
       navegador Android mais antigo, e o público daqui é autônomo com
       celular variado, não dev com Chrome atualizado. */
    background: rgba(1, 39, 98, 0.08);
    border: 1px solid rgba(1, 39, 98, 0.25);
    color: var(--marca-azul);
    border-radius: 999px;
    padding: 4px 6px 4px 12px;
    font-size: 0.9rem;
}
.lista-chips button {
    all: unset;
    cursor: pointer;
    width: 20px;
    height: 20px;
    line-height: 20px;
    text-align: center;
    border-radius: 50%;
    color: var(--marca-azul);
}
.lista-chips button:hover,
.lista-chips button:focus-visible {
    background: rgba(1, 39, 98, 0.15);
    outline: none;
}

/* Resultados da busca de cidade (autocomplete). Lista simples abaixo do
   campo -- de propósito NÃO é um overlay/dropdown flutuante (position:
   absolute) pra não abrir espaço pra bug de z-index/recorte em telas
   pequenas; empurra o conteúdo abaixo, que é aceitável aqui (a lista
   já limita a 8 resultados). */
.lista-sugestoes {
    list-style: none;
    padding: 0;
    margin: -8px 0 12px;
    border: 1px solid #ccc;
    border-radius: 6px;
    max-height: 220px;
    overflow-y: auto;
}
/* ACHADO NA REVISÃO (renderizado com o Pico real pra confirmar): o app.js
   põe role="button" em cada <li> de sugestão -- correto pra acessibilidade
   (o item é clicável) -- mas o Pico estiliza QUALQUER elemento com
   role="button" como botão azul preenchido dele. Resultado: a busca de
   cidade virava uma pilha de botões azuis gigantes com texto centralizado,
   em vez de uma lista de sugestões. É exatamente o mesmo bug que as caixas
   de aviso da Home já tinham tido; a correção não havia sido replicada
   aqui. Desfaz o botão e devolve a cara de lista. */
.lista-sugestoes li,
.lista-sugestoes li[role="button"] {
    padding: 8px 12px;
    cursor: pointer;
    border-bottom: 1px solid #eee;
    background: transparent;
    color: inherit;
    border-radius: 0;
    border-left: none;
    border-right: none;
    border-top: none;
    text-align: left;
    font-weight: normal;
    font-size: 1rem;
    line-height: 1.4;
    box-shadow: none;
    margin: 0;
    width: auto;
    display: block;
}
.lista-sugestoes li:hover,
.lista-sugestoes li:focus-visible {
    background: rgba(1, 39, 98, 0.08);
    outline: none;
}
.lista-sugestoes li:last-child {
    border-bottom: none;
}
.lista-sugestoes li:hover,
.lista-sugestoes li:focus-visible {
    background: rgba(1, 39, 98, 0.08);
    outline: none;
}

/* Gráfico de faturamento (Financeiro) -- SVG desenhado à mão (ver app.js),
   sem lib de gráfico nova. */
/* Fundo branco explícito (achado na revisão): as barras e os rótulos do
   gráfico são desenhados com cor FIXA da marca (azul-marinho #012762 e
   cinza). O Pico troca pro tema escuro sozinho quando o celular está no
   modo noturno -- e aí azul-marinho sobre fundo escuro simplesmente some.
   Mesmo tratamento que as caixas de aviso da Home já receberam pelo mesmo
   motivo: o bloco carrega o próprio fundo, então não depende do tema. */
.grafico-financeiro {
    margin: 8px 0 16px;
    background: #fff;
    border: 1px solid #e0e0e0;
    border-radius: 8px;
    padding: 10px 8px 4px;
}
.grafico-financeiro svg {
    width: 100%;
    height: auto;
    display: block;
}
.indicadores-financeiro {
    line-height: 1.8;
}

/* Pedido do usuário: título padronizado em TODO o app -- Opção B ("Bloco
   Sólido Anguloso") escolhida entre 4 mockups
   (brainstorm/mockup_titulos_v2.html): bloco azul sólido com barra amarela
   na lateral esquerda, ângulos retos (sem border-radius, ao contrário da
   Opção A anterior -- "anguloso" é o ponto central da B). 3 variantes, uma
   família só de cor/borda, porque nem todo título é do mesmo tipo:
   - .titulo-pagina: <h1> no topo de cada tela.
   - .titulo-secao-numerada: seção numerada (Perfil 1/2, Novo Compromisso
     1/2, Novo Orçamento 1/2/3) -- número vira "bolha" amarela ao lado do
     texto (era número gigante translúcido de fundo na Opção A; não existe
     mais nesta opção).
   - .titulo-subsecao: <h2> "divisor de lista" dentro da tela (Home:
     Precisam de Você/Concluídos Recentes; Financeiro: Faturamento por
     Mês/Quem Mais Rendeu) -- fundo claro (não azul sólido) pra não pesar
     demais empilhado em cima de lista/gráfico/tabela.
   Espaçamento (pedido do usuário): 28px embaixo do título de página/seção
   numerada, 18px embaixo da subseção -- mesmo valor nas 3 telas que usam
   cada tipo, pra manter o respiro coerente em todo o app. */
.titulo-pagina {
    background: var(--marca-azul);
    color: #fff;
    border-left: 6px solid var(--marca-amarelo);
    padding: 12px 16px;
    margin: 0 0 28px;
    font-size: 1.15rem;
    font-weight: 800;
    text-transform: uppercase;
    letter-spacing: 0.03em;
}
.titulo-secao-numerada {
    background: var(--marca-azul);
    border-left: 6px solid var(--marca-amarelo);
    padding: 10px 14px;
    margin: 22px 0 28px;
}
/* 1ª seção da tela não precisa do respiro de cima (já tem o <h1> ali). */
.titulo-secao-numerada:first-child,
h1 + .titulo-secao-numerada,
.titulo-pagina + .titulo-secao-numerada {
    margin-top: 0;
}
.tsn-cabecalho {
    display: flex;
    align-items: center;
    gap: 10px;
}
.tsn-numero {
    background: var(--marca-amarelo);
    color: var(--marca-azul-escuro);
    width: 22px;
    height: 22px;
    border-radius: 50%;
    display: flex;
    align-items: center;
    justify-content: center;
    font-size: 0.78rem;
    font-weight: 800;
    flex-shrink: 0;
}
.tsn-titulo {
    color: #fff;
    font-size: 0.98rem;
    font-weight: 700;
    margin: 0;
}
.tsn-sub {
    color: var(--marca-amarelo);
    font-size: 0.72rem;
    font-weight: 700;
    letter-spacing: 0.04em;
    text-transform: uppercase;
    /* Alinhado embaixo do TEXTO do título, não da bolha (22px + 10px de
       gap = 32px), pra ficar visualmente "dentro" do título, não solto. */
    margin: 4px 0 0 32px;
}
.titulo-subsecao {
    display: block;
    background: #eef1f8;
    color: var(--marca-azul);
    padding: 6px 10px;
    margin: 22px 0 18px;
    font-size: 0.85rem;
    font-weight: 800;
    text-transform: uppercase;
    letter-spacing: 0.03em;
}
.titulo-subsecao:first-of-type {
    margin-top: 16px;
}

/* Pedido do usuário: faixa de avisos no topo da Home ("compromisso nas
   próximas 48h", "orçamento enviado sem resposta"). Cores de fundo fixas
   e texto escuro explícito de propósito: o Pico troca o tema
   automaticamente (claro/escuro) conforme o sistema, e sem o texto fixo
   o aviso ficaria ilegível no tema escuro (texto claro sobre fundo
   claro). Mesma escolha da caixa do PIX no PDF. */
/* Espaçamento igual ao dos botões da Home: o Pico separa cada botão por
   --pico-spacing, então o bloco de avisos usa a MESMA variável em vez de
   um valor chutado em px -- se o tema mudar a escala, os avisos
   acompanham sozinhos (achado no print do usuário: com 14px fixos o
   aviso ficava colado no "+ Novo orçamento"). */
#home-alertas {
    display: flex;
    flex-direction: column;
    /* entre os próprios avisos o espaço é menor de propósito -- eles são
       um grupo só; o respiro maior fica entre o grupo e os botões. */
    gap: calc(var(--pico-spacing, 1rem) / 2);
    margin: 0 0 var(--pico-spacing, 1rem);
}

/* Seletor com o id (#home-alertas .alerta) de propósito, e não só
   `.alerta`: o Pico estiliza QUALQUER elemento com role="button" como
   botão azul dele, e o app.js precisa desse role pra faixa continuar
   acessível por teclado/leitor de tela. Empatando em especificidade o
   Pico vencia dependendo da ordem de carga (foi o que apareceu no print
   do usuário: aviso com cara de botão azul). Com o id na frente, a
   disputa acaba. Mesmo motivo do background-color explícito abaixo. */
#home-alertas .alerta {
    padding: 10px 12px;
    border-radius: 6px;
    border-left: 5px solid;
    border-top: 0;
    border-right: 0;
    border-bottom: 0;
    cursor: pointer;
    font-size: 0.95rem;
    line-height: 1.35;
    text-align: left;
    color: #222;
    box-shadow: none;
}
/* Três níveis de urgência do compromisso (pedido do usuário: 12h / 24h /
   48h). A cor sobe de intensidade conforme aperta o prazo; o app.js ainda
   põe um emoji junto, porque cor sozinha falha no sol e pra daltônico. */
#home-alertas .alerta-urgente {
    background-color: #fde2e0;
    border-left-color: #c0392b;
}
#home-alertas .alerta-atencao {
    background-color: #ffeccc;
    border-left-color: #e07b00;
}
#home-alertas .alerta-agenda {
    background-color: #e3f0fb;
    border-left-color: #1a6faa;
}
#home-alertas .alerta-orcamento {
    background-color: #fff7d6;
    border-left-color: #d2a800;
}
#home-alertas .alerta:hover,
#home-alertas .alerta:focus {
    filter: brightness(0.96);
    outline: none;
}

/* Destaque temporário nos orçamentos parados, ao clicar no aviso --
   evita ter que criar uma tela de lista filtrada só pra isso. */
li.destacado {
    background: #fff7d6;
    color: #222;
    border-radius: 6px;
    padding: 6px 8px;
}

/* Termo de consentimento do portal (LGPD art. 8º, §1º: quando o
   consentimento vem junto de outros assuntos, ele precisa estar em
   DESTAQUE). Por isso o termo é um bloco visível na própria tela, com
   moldura e fundo próprios -- e não um link "leia os termos", que é
   justamente o padrão que a lei não aceita. white-space: pre-line
   preserva as quebras de linha do texto original sem precisar de HTML
   dentro dele (ver TERMO_PORTAL em app.js). */
/* Definição ÚNICA do bloco do termo. Antes existia um segundo ".termo" mais
   abaixo no arquivo sobrescrevendo white-space e padding -- as declarações
   daqui eram código morto, e o comentário que justificava o `pre-line`
   descrevia um comportamento que já não existia (o termo deixou de ser
   texto pré-formatado quando virou HTML estruturado). Valores finais
   consolidados aqui. */
.termo {
    white-space: normal;
    background: #f7f7f7;
    color: #222;
    border: 1px solid #d8d8d8;
    border-radius: 6px;
    padding: 16px 18px;
    margin: var(--pico-spacing, 1rem) 0 calc(var(--pico-spacing, 1rem) / 2);
    font-size: 0.92rem;
    line-height: 1.5;
}
/* Sem max-height/scroll de propósito: com o termo cortado, a parte
   "IMPORTANTE SABER" (a que avisa que o telefone fica público) ficava
   escondida atrás de rolagem -- e o público-alvo não rola. Informação que
   sustenta o consentimento não pode depender do autônomo descobrir que há
   mais texto embaixo. O termo é curto; cabe inteiro. */

/* Caixa e texto na mesma linha, alinhados pelo topo -- em celular o
   rótulo ocupa 2-3 linhas e, sem isso, a caixa ficaria centralizada no
   meio do texto, longe do começo da frase. */
.linha-toggle {
    display: flex;
    align-items: flex-start;
    gap: 10px;
    cursor: pointer;
    font-weight: 600;
}
.linha-toggle input {
    flex: 0 0 auto;
    margin: 0;
}
.aviso-sutil {
    color: #555;
    font-size: 0.88rem;
    margin: 4px 0 var(--pico-spacing, 1rem);
    min-height: 1.2em;
}

/* Linha de lista vazia ("Nenhum orçamento aguardando resposta") -- some o
   marcador de bullet, que num texto de estado fica parecendo item real. */
.linha-vazia {
    list-style: none;
    margin-left: -1.2rem;
    color: #555;
    font-style: italic;
}

/* ====================================================================
   Sistema de botões -- hierarquia visual
   ====================================================================
   Problema que isto resolve: todos os botões do app eram idênticos (o
   azul padrão do Pico), empilhados e do mesmo tamanho. Quando tudo tem o
   mesmo peso, nada tem destaque -- e a ação que gera dinheiro ("Novo
   Orçamento") competia em pé de igualdade com "Voltar".

   As cores saíram da própria logo do Combinado (amostradas do PNG), pra
   o app e o PDF falarem a mesma língua visual:
     azul-marinho #012762  -- contraste 14.3:1 com branco (WCAG AAA)
     turquesa     #05bbbb  -- 2.4:1 com branco: REPROVA pra texto branco,
                              por isso só aparece como detalhe/foco
     amarelo      #fec51d  -- destaque pontual (caixa do PIX no PDF)
   ==================================================================== */
:root {
    --marca-azul: #012762;
    --marca-azul-escuro: #001b45;
    --marca-turquesa: #05bbbb;
    --marca-amarelo: #fec51d;
    --perigo: #b3261e;
}

/* PRIMÁRIO -- uma por tela, a ação que o autônomo veio fazer. Também se
   aplica a <a class="btn-primario"> (achado no Portal: cadastro.html usa
   um link, não um <button>, pro CTA "Criar Minha Conta Agora" -- sem essa
   regra ele caía no link sublinhado padrão do Pico, longe de "chamativo") --
   por isso os ajustes extra de display/decoração abaixo, que <button> já
   tem de graça e <a> não. */
button.btn-primario,
a.btn-primario {
    background-color: var(--marca-azul);
    border-color: var(--marca-azul);
    color: #fff;
    font-weight: 700;
    font-size: 1.08rem;
    padding: 1rem;
    letter-spacing: 0.01em;
}
a.btn-primario {
    display: block;
    text-align: center;
    text-decoration: none;
    border-radius: 0.25rem;
    border-width: 1px;
    border-style: solid;
    box-sizing: border-box;
}
button.btn-primario:hover,
button.btn-primario:focus,
a.btn-primario:hover,
a.btn-primario:focus {
    background-color: var(--marca-azul-escuro);
    border-color: var(--marca-azul-escuro);
    color: #fff;
}

/* SECUNDÁRIO -- navegação e saída. Contorno em vez de preenchido: some
   do caminho sem sumir da tela, e faz o primário saltar por contraste. */
button.btn-secundario {
    background-color: transparent;
    border: 2px solid var(--marca-azul);
    color: var(--marca-azul);
    font-weight: 600;
    font-size: 0.94rem;
    padding: 0.6rem 0.5rem;
}
button.btn-secundario:hover,
button.btn-secundario:focus {
    background-color: var(--marca-azul);
    color: #fff;
}

/* PERIGO -- "Cancelar Orçamento" é destrutivo e não pode ter o mesmo peso
   de "Marcar Concluído", que é o desfecho desejado. Contorno vermelho:
   visível pra quem procura, discreto pra quem não quer. */
button.btn-perigo {
    background-color: transparent;
    border: 1px solid var(--perigo);
    color: var(--perigo);
}
button.btn-perigo:hover,
button.btn-perigo:focus {
    background-color: var(--perigo);
    color: #fff;
}

/* Achado do usuário (print real, botão "Ajuda" novo): com 4 botões e a
   régua antiga (auto-fit + minmax(105px, 1fr)), calibrada pros 3 de
   antes, a coluna ficava estreita demais pra "Financeiro" -- o texto
   quebrava NO MEIO da palavra ("Financeir" / "o"), porque o Pico aplica
   overflow-wrap:break-word nos controles e a coluna não tinha 105px de
   sobra real (borda + padding do botão já comiam parte disso).
   Fixo em 2 colunas (grade 2x2) em vez de deixar o navegador decidir
   quantas cabem: cada botão sempre tem metade da largura da tela, o que
   sobra de verdade pra "Financeiro" não quebrar mesmo no menor celular
   comum (~280px). Efeito colateral bem-vindo: 4 botões de mesmo tamanho
   em grade 2x2 lê mais organizado que 4 apertados numa fileira só. */
.nav-secundaria {
    display: grid;
    grid-template-columns: repeat(2, 1fr);
    gap: 8px;
    margin-bottom: var(--pico-spacing, 1rem);
}
.nav-secundaria button {
    margin: 0;
    width: 100%;
}

/* Turquesa da marca como anel de foco -- acessibilidade de teclado com a
   cor da marca, no único uso em que o contraste baixo dela não importa. */
button:focus-visible,
.alerta:focus-visible {
    outline: 3px solid var(--marca-turquesa);
    outline-offset: 2px;
}

/* Títulos de seção da Home menores que o <h1> da tela -- hierarquia de
   texto acompanhando a hierarquia de botão. */
#view-home h2 {
    font-size: 1.15rem;
    margin-top: 1.4rem;
    margin-bottom: 0.4rem;
}

/* Ações dentro de uma linha da lista: mesmo azul da marca, porém menores
   que o botão primário da tela -- 3 níveis de peso, na ordem em que o
   autônomo decide (ação da tela > ação de um item > ação destrutiva).
   Sem isto, "Marcar Concluído" saía no azul padrão do Pico, que não é
   nenhuma cor da logo e destoava do resto. */
/* Botão de linha preenchido: era a regra pra TODO botão que não fosse
   destrutivo, porque na época todo botão de linha era ação principal
   ("Marcar Concluído", "Lembrar", "Gerar Orçamento").
   Achado ao inserir o "Reabrir": esta regra tem especificidade (0,2,1) e
   vencia `button.btn-secundario` (0,1,1), então um botão explicitamente
   marcado como secundário saía com cara de principal. "Reabrir" é ação
   CORRETIVA -- não pode competir visualmente com o que gera trabalho.
   `:not(.btn-secundario)` devolve o controle a quem declara a classe, sem
   mexer em nenhum botão existente (nenhum outro usa btn-secundario aqui). */
.linha-acoes button:not(.btn-perigo):not(.btn-secundario) {
    background-color: var(--marca-azul);
    border-color: var(--marca-azul);
    color: #fff;
}
.linha-acoes button:not(.btn-perigo):not(.btn-secundario):hover,
.linha-acoes button:not(.btn-perigo):not(.btn-secundario):focus {
    background-color: var(--marca-azul-escuro);
    border-color: var(--marca-azul-escuro);
}
.linha-acoes button {
    font-size: 0.85rem;
    padding: 0.42rem 0.75rem;
}

/* ---- Cartão do orçamento -------------------------------------------
   Pedido do usuário: destacar os itens de cada seção sem depender só de
   fonte maior. Antes eram <li> com marcador, num bloco de texto contínuo:
   três orçamentos seguidos viravam uma parede cinza, e o VALOR -- que é o
   que ele procura ao bater o olho -- ficava no meio de uma frase, em
   posição diferente a cada linha.

   O destaque aqui vem de quatro coisas, nenhuma delas "letra maior":
   1. Separação: cada orçamento é um cartão com fundo, borda e respiro --
      o olho conta quantos são sem ler nada.
   2. Faixa colorida à esquerda, pelo STATUS -- ele separa "esperando
      resposta" de "concluído" antes de ler a etiqueta.
   3. Alinhamento: o dinheiro sempre na mesma coluna à direita, então dá
      pra comparar valores descendo a lista.
   4. Etiqueta de status com palavra de gente, no lugar do valor cru do
      banco (a tela mostrava "concluido", sem acento).                  */
.card-orcamento {
    list-style: none;
    background: #fff;
    border: 1px solid #e3e7ec;
    border-left: 4px solid #c9ced6;   /* cor real vem do status, abaixo */
    border-radius: 10px;
    padding: 10px 12px;
    margin: 0 0 10px;
    /* Sombra bem fraca: dá o "descolado do fundo" sem virar enfeite --
       tela de trabalho, não vitrine. */
    box-shadow: 0 1px 2px rgba(16, 24, 40, 0.05);
}
/* A <ul> perde o recuo do marcador, que agora não existe mais. */
#lista-orcamentos,
#lista-orcamentos-encerrados {
    list-style: none;
    padding: 0;
    margin: 0 0 var(--pico-spacing, 1rem);
}

.card-topo {
    display: flex;
    align-items: baseline;
    justify-content: space-between;
    gap: 10px;
}
.card-cliente {
    font-weight: 600;
    /* Nome longo não empurra o valor pra fora do cartão: quebra o nome. */
    min-width: 0;
    overflow-wrap: anywhere;
}
.card-valor {
    flex: 0 0 auto;
    white-space: nowrap;
    color: var(--marca-azul);
    font-size: 1.05rem;
}

/* Segunda linha: contexto. Flex com wrap pra caber em tela estreita sem
   estourar -- em 320px os pedaços descem de linha em vez de cortar. */
.card-meta {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 4px 8px;
    margin-top: 6px;
    font-size: 0.84rem;
    color: #55606b;   /* 6,4:1 no branco do cartão */
}
.card-numero {
    font-variant-numeric: tabular-nums;
    color: #55606b;
}

/* Etiqueta de status. Fundo tingido + texto escuro da mesma família:
   legível, e a cor reforça o que a palavra já diz (quem não distingue
   cor lê a etiqueta do mesmo jeito). */
.etiqueta {
    display: inline-block;
    padding: 2px 8px;
    border-radius: 999px;
    font-size: 0.78rem;
    font-weight: 600;
    line-height: 1.5;
    white-space: nowrap;
}
.etiqueta-enviado   { background: #fff3cd; color: #6b4e00; }  /* aguardando */
.etiqueta-aprovado  { background: #e3ecf9; color: #012762; }  /* fechado, a executar */
.etiqueta-concluido { background: #d9f3f3; color: #0b4f4f; }  /* deu certo */
.etiqueta-cancelado { background: #eceff3; color: #4a5560; }  /* não deu */
.etiqueta-rascunho  { background: #eceff3; color: #4a5560; }

/* Faixa da esquerda por status -- a leitura mais rápida do cartão. */
.card-orcamento.status-enviado   { border-left-color: var(--marca-amarelo); }
.card-orcamento.status-aprovado  { border-left-color: var(--marca-azul); }
.card-orcamento.status-concluido { border-left-color: var(--marca-turquesa); }
.card-orcamento.status-cancelado { border-left-color: #c9ced6; }

/* Item de "nada aqui ainda" não é cartão -- é recado. */
.linha-vazia {
    list-style: none;
}

/* Usadas pela AGENDA (compromissos), que mantém o formato de duas linhas:
   o que decide em cima, o contexto embaixo e menor. Estavam declaradas
   junto da lista de orçamentos e quase foram removidas junto na conversão
   pra cartão -- o que teria quebrado a Agenda em silêncio. */
.linha-principal {
    display: block;
    font-weight: 600;
}
.linha-detalhe {
    display: block;
    font-size: 0.84rem;
    color: #55606b;   /* 6,4:1 no branco -- era #5a5a5a, 5,9:1 */
    margin-top: 2px;
}

/* A Agenda ganha o mesmo cartão, pra as duas telas parecerem o mesmo app.
   A faixa da esquerda aqui é turquesa (compromisso marcado); a de
   compromisso vencido continua vermelha, na regra específica mais abaixo,
   que vence esta por vir depois no arquivo. */
#lista-compromissos {
    list-style: none;
    padding: 0;
    margin: 0 0 var(--pico-spacing, 1rem);
}
#lista-compromissos li {
    list-style: none;
    background: #fff;
    border: 1px solid #e3e7ec;
    border-left: 4px solid var(--marca-turquesa);
    border-radius: 10px;
    padding: 10px 12px;
    margin: 0 0 10px;
    box-shadow: 0 1px 2px rgba(16, 24, 40, 0.05);
}
/* Idade acima do limite do aviso -- mesmo vermelho da faixa de alerta,
   pra os dois contarem a mesma história. */
.idade-parado {
    color: #b3261e;
}

/* Transição no destaque: aparece e some suave, em vez de piscar. */
#lista-orcamentos li,
#lista-compromissos li {
    transition: background-color 0.35s ease;
}

/* ---- Termo de consentimento: tipografia ----------------------------
   Antes era um bloco único de texto pré-formatado, tudo do mesmo tamanho
   e sem hierarquia -- o pior formato possível pra quem lê pouco. Agora
   cada tipo de bloco tem peso próprio, e a informação que sustenta o
   consentimento (o que aparece, e o aviso de que o site é aberto) salta
   à vista sem precisar ler tudo. */
.termo-titulo {
    font-size: 1.06rem;
    margin: 0 0 6px;
    color: var(--marca-azul);
}
.termo-paragrafo {
    margin: 0 0 12px;
}
.termo-secao {
    font-size: 0.8rem;
    letter-spacing: 0.06em;
    text-transform: uppercase;
    color: #55606b;
    margin: 14px 0 6px;
    padding-bottom: 3px;
    border-bottom: 1px solid #dcdcdc;
}
.termo-lista {
    margin: 0 0 4px;
    padding-left: 20px;
}
.termo-lista li {
    margin-bottom: 5px;
}
/* O bloco que mais importa juridicamente: é ele que informa o risco de o
   telefone ficar público. Fundo amarelo da marca pra ninguém passar reto. */
.termo-aviso {
    font-size: 0.8rem;
    letter-spacing: 0.06em;
    text-transform: uppercase;
    color: #7a5b00;
    margin: 16px 0 0;
}
.termo-paragrafo-aviso {
    background: #fff7d6;
    border-left: 4px solid var(--marca-amarelo);
    padding: 10px 12px;
    border-radius: 4px;
    margin: 6px 0 12px;
}
.termo-rodape {
    font-size: 0.86rem;
    color: #55606b;
    margin: 2px 0 0;
}

/* <details> que envolve o Termo de Uso do autônomo no cadastro (pedido do
   usuário) -- mesma moldura/comportamento do <details> da calculadora
   (borda, resumo clicável, ícone antes do texto), só com ícone de
   documento em vez de calculadora, já que o conteúdo aqui é o termo. */
.termo-detalhes {
    border: 1px solid var(--marca-turquesa);
    border-radius: 8px;
    background: #f2fdfd;
    margin: 4px 0 12px;
    overflow: hidden;
}
.termo-detalhes summary {
    padding: 12px 14px;
    font-weight: 700;
    color: var(--marca-azul);
    cursor: pointer;
    list-style: none;
    min-height: 20px;
    display: flex;
    align-items: center;
    gap: 8px;
}
.termo-detalhes summary::-webkit-details-marker { display: none; }
.termo-detalhes summary::before {
    content: "📄";
    flex: 0 0 auto;
}
.termo-detalhes[open] summary {
    border-bottom: 1px solid var(--marca-turquesa);
}
.termo-detalhes .termo {
    margin: 0;
    border: none;
    border-radius: 0;
}

/* Compromisso cuja hora passou e segue "agendado" (pedido do usuário). */
/* Compromisso vencido: mantém o formato de cartão (borda, raio, respiro
   vêm da regra de #lista-compromissos li acima) e troca só o que comunica
   o atraso -- fundo avermelhado e faixa vermelha. O `margin-left: -1.2rem`
   antigo saiu junto com o marcador da lista: existia pra compensar o recuo
   do bullet, que não existe mais, e agora só desalinharia este cartão em
   relação aos outros. */
#lista-compromissos li.compromisso-vencido {
    background: #fdeceb;
    border-left-color: var(--perigo);
}
#home-alertas .alerta-vencido {
    background-color: #fdd9d6;
    border-left-color: var(--perigo);
}

/* Sugestão de item favorito (item 6): o texto ocupa a linha e o "x" fica
   na ponta -- clicar no texto usa o favorito, clicar no "x" apaga. Mesmo
   par de gestos dos chips de bairro/cidade, que ele já conhece. */
#lista-sugestoes-item li {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 8px;
}
.sugestao-texto {
    flex: 1;
    cursor: pointer;
}
button.btn-remover-favorito {
    flex: 0 0 auto;
    width: 32px;
    height: 32px;
    min-width: 32px;
    padding: 0;
    margin: 0;
    line-height: 1;
    font-size: 1.2rem;
    border-radius: 50%;
    background: transparent;
    color: var(--perigo);
    border: 1px solid rgba(179, 38, 30, 0.35);
}
button.btn-remover-favorito:hover,
button.btn-remover-favorito:focus-visible {
    background: rgba(179, 38, 30, 0.1);
}

/* Busca de cliente na Home (item 1 do brainstorm). O rótulo é discreto de
   propósito: é ferramenta de apoio, não pode competir com "+ Novo
   Orçamento" nem empurrar a lista pra baixo. */
.rotulo-busca {
    font-size: 0.85rem;
    color: #55606b;
    margin-bottom: 2px;
}
#home-busca-cliente {
    margin-bottom: 4px;
}

/* Ranking de clientes (item 9 do brainstorm). Cada item é uma linha com
   nome à esquerda, valor à direita e a contagem de serviços embaixo --
   mesma hierarquia de leitura das linhas da Home ("quem e quanto" em cima,
   detalhe menor embaixo). */
.ranking-clientes {
    list-style: none;
    padding: 0;
    margin: 8px 0 16px;
}
.ranking-clientes li {
    display: grid;
    grid-template-columns: 1fr auto;
    gap: 0 8px;
    padding: 8px 0;
    border-bottom: 1px solid #eee;
}
.ranking-clientes li:last-child { border-bottom: none; }
.ranking-valor {
    text-align: right;
    white-space: nowrap;
    color: var(--marca-azul);
}
.ranking-detalhe {
    grid-column: 1 / -1;
    font-size: 0.85rem;
    color: #55606b;   /* 6,4:1 no branco */
}

/* Contador de serviços concluídos (item 10 do brainstorm). Turquesa da
   marca como faixa lateral -- é a única cor "positiva" da paleta, e
   diferencia visualmente de aviso (amarelo/vermelho, que pedem ação). */
.contador-servicos {
    background: rgba(5, 187, 187, 0.09);
    border-left: 4px solid var(--marca-turquesa);
    border-radius: 4px;
    padding: 8px 12px;
    margin: 0 0 var(--pico-spacing, 1rem);
    font-size: 0.92rem;
    color: #0b4f4f;   /* turquesa escurecido: 7,1:1 no fundo claro acima */
}

/* "×" pra remover item do orçamento em construção. Mesma linguagem visual
   do "×" dos chips de bairro/cidade -- o autônomo já aprendeu esse gesto no
   Perfil. Antes, item lançado errado só saía refazendo o orçamento inteiro.
   Alvo de toque de 32px: dedo em celular, não mouse de desktop. */
#lista-itens li {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 8px;
}
button.btn-remover-item {
    flex: 0 0 auto;
    width: 32px;
    height: 32px;
    min-width: 32px;
    padding: 0;
    margin: 0;
    line-height: 1;
    font-size: 1.2rem;
    border-radius: 50%;
    background: transparent;
    color: var(--perigo);
    border: 1px solid rgba(179, 38, 30, 0.35);
}
button.btn-remover-item:hover,
button.btn-remover-item:focus-visible {
    background: rgba(179, 38, 30, 0.1);
}

/* "✎" pra corrigir item já lançado (pedido do usuário). Mesmo formato e mesmo
   alvo de toque do "×" ao lado, mas em azul da marca, não em vermelho:
   corrigir não é destruir, e as duas ações ficam coladas num celular -- a cor
   é o que evita o dedo errar o gesto caro. */
button.btn-editar-item {
    flex: 0 0 auto;
    width: 32px;
    height: 32px;
    min-width: 32px;
    padding: 0;
    margin: 0;
    line-height: 1;
    font-size: 1rem;
    border-radius: 50%;
    background: transparent;
    color: var(--marca-azul);
    border: 1px solid rgba(1, 39, 98, 0.35);
}
button.btn-editar-item:hover,
button.btn-editar-item:focus-visible {
    background: rgba(1, 39, 98, 0.1);
}

/* Item que está aberto no formulário pra correção. Sem essa marca, o botão
   "Salvar Alteração" não diz QUAL dos itens ele vai substituir. Faixa lateral
   + fundo, não só cor de texto: tem que ser visível na tela do celular no sol. */
#lista-itens li.item-em-edicao {
    background: rgba(1, 39, 98, 0.07);
    border-left: 3px solid var(--marca-azul);
    padding-left: 8px;
    border-radius: 4px;
}

/* Links de "Criar conta" e "Esqueci minha senha", embaixo do botão Entrar.
   Discretos de propósito: entrar é a ação principal de quem já tem conta (a
   maioria dos toques nessa tela), criar/recuperar é exceção. */
.linha-links-login {
    text-align: center;
    font-size: 0.95rem;
    margin-top: 12px;
}

/* ====================================================================
   AJUDA / FAQ (pedido do usuário)
   ====================================================================
   Cada pergunta é um <details>/<summary> nativo -- o navegador já cuida
   de abrir/fechar, teclado (Enter/Espaço) e leitor de tela sozinho. Aqui
   só troco a CARA: sem marcador de lista, sem o triângulo padrão do
   navegador (que muda de desenho entre Chrome/Safari), e com um "+"/"−"
   consistente -- pra parecer o mesmo componente nos dois principais
   navegadores de celular, não dois componentes diferentes por acaso. */
.lista-faq {
    list-style: none;
    margin: 0 0 12px;
    padding: 0;
}
/* Achado do usuário (print real): quadradinho de marcador aparecia do lado
   de fora de cada card e de cada título de seção, mesmo com list-style:none
   no <ul> acima. Causa: list-style:none tira o marcador PADRÃO, mas não
   limpa um ::marker com content customizado (que é o caso aqui) -- os dois
   precisam ser zerados, não só um. */
.lista-faq > li::marker {
    content: "";
}
.item-faq {
    margin-bottom: 8px;
}
.item-faq details {
    border: 1px solid #ddd;
    border-radius: 8px;
    background: #fff;
    overflow: hidden; /* a resposta não escapa do cantinho arredondado */
}
/* Toque grande de propósito (autônomo no sol, com luva, no meio da obra) --
   min 44px de altura é a recomendação de alvo de toque, não capricho. */
.item-faq summary {
    padding: 12px 14px;
    font-weight: bold;
    color: var(--marca-azul);
    cursor: pointer;
    list-style: none; /* remove o triângulo padrão (Firefox/Chrome) */
    min-height: 20px;
    display: flex;
    align-items: center;
    gap: 8px;
}
.item-faq summary::-webkit-details-marker { display: none; } /* remove no Safari */
/* "+"/"−" no lugar do triângulo do navegador -- muda sozinho com o
   atributo [open], sem precisar de JS pra saber se está aberto. */
.item-faq summary::before {
    content: "+";
    flex: 0 0 auto;
    width: 20px;
    text-align: center;
    color: var(--marca-azul);
}
.item-faq details[open] summary::before {
    content: "−";
}
.item-faq details[open] summary {
    border-bottom: 1px solid #eee;
}
.item-faq details p {
    margin: 0;
    padding: 12px 14px;
    color: #333;
}

/* ====================================================================
   CALCULADORA DE PREÇO (dentro do item do orçamento, pedido do usuário)
   ====================================================================
   Mesmo componente <details>/summary do item-faq acima (nativo, sem JS
   pra abrir/fechar) -- mas com CARA diferente de propósito: a FAQ é uma
   pergunta entre várias, isso aqui é uma FERRAMENTA dentro do formulário.
   Contorno na cor de destaque (turquesa) + fundo levemente tingido faz o
   olho separar "isso é um botão de ajuda especial" de "isso é só mais um
   campo do formulário". */
.calculadora-preco {
    border: 1px solid var(--marca-turquesa);
    border-radius: 8px;
    background: #f2fdfd;
    margin: 4px 0 16px;
    overflow: hidden;
}
.calculadora-preco summary {
    padding: 12px 14px;
    font-weight: 700;
    color: var(--marca-azul);
    cursor: pointer;
    list-style: none;
    min-height: 20px;
    display: flex;
    align-items: center;
    gap: 8px;
}
.calculadora-preco summary::-webkit-details-marker { display: none; }
.calculadora-preco summary::before {
    content: "🧮";
    flex: 0 0 auto;
}
.calculadora-preco[open] summary {
    border-bottom: 1px solid var(--marca-turquesa);
}
.calculadora-preco .calc-corpo {
    padding: 4px 14px 14px;
}
/* Resultado em destaque -- é a única coisa que o autônomo PRECISA ler
   depois de preencher os campos, o resto é rascunho de conta. */
.calc-resultado {
    font-size: 1.15rem;
    font-weight: 700;
    color: var(--marca-azul);
    margin: 10px 0 2px;
}

/* Pedido do usuário (2ª rodada): FAQ cresceu de 11 pra ~40 perguntas --
   sem um título por seção, virava um livro sem capítulo pra rolar.
   Título discreto de propósito (não é botão, não abre nada, não some
   junto com o cartão azul das perguntas) -- só orienta onde na lista o
   dedo está. */
.titulo-secao-faq {
    margin: 20px 0 8px;
}
.titulo-secao-faq:first-child {
    margin-top: 4px; /* a 1ª seção não precisa do respiro extra do topo */
}
.titulo-secao-faq h2 {
    margin: 0;
    /* Pedido do usuário (print real): "CONTA E SENHA"/"MEU PERFIL" saíam
       discretos demais -- cinza claro e do mesmo tamanho de rodapé, quase
       invisível ao lado dos cards de pergunta. Sobe pra cor da marca e
       borda mais grossa na cor de destaque, pra virar divisor de capítulo
       de verdade, não só uma legenda. */
    font-size: 0.95rem;
    font-weight: 700;
    text-transform: uppercase;
    letter-spacing: 0.04em;
    color: var(--marca-azul);
    border-bottom: 2px solid var(--marca-turquesa);
    padding-bottom: 6px;
}

/* ============================================================================
   PORTAL PÚBLICO (web/portal/) -- página separada (sem login), mas MESMO
   arquivo de CSS que o app: garante que a marca (cor, forma, tipografia)
   nunca diverge entre as duas telas, mesmo raciocínio de "fonte única" já
   usado pro termo LGPD e pras categorias do portal.
   ============================================================================ */

/* Cabeçalho simples de página pública -- sem menu, sem "Voltar" (não tem
   fluxo de tela anterior, é o ponto de entrada). Logo/nome só pra situar
   quem chegou aqui direto de um link, sem ter visto o app antes.
   Mantido (classe ainda usada em cadastro.html) mesmo com o hero novo
   abaixo, que é específico da busca (index.html). */
.portal-cabecalho {
    text-align: center;
    margin-bottom: 18px;
}
.portal-cabecalho h1 {
    color: var(--marca-azul);
    margin-bottom: 2px;
}
.portal-cabecalho p {
    color: #55606b;
    margin-top: 0;
}

/* Hero da busca (web/portal/index.html) -- pedido do usuário: mesmo
   padrão de cor/forma/estilo do app, profissional, "transmita confiança
   e seriedade". Reaproveita o MESMO gradiente de 2 cores de marca já
   usado em .portal-hero-cadastro (zero cor nova), só que aqui titula a
   busca em vez do pré-cadastro. Os 3 selos usam o mesmo formato de
   .portal-selos-confianca (compromisso real do produto, zero número não
   medido -- mesma regra do selo de "serviços concluídos" nos cards). */
.portal-hero-busca {
    background: linear-gradient(135deg, var(--marca-azul) 0%, var(--marca-azul-escuro) 100%);
    color: #fff;
    border-radius: 10px;
    padding: 22px 18px 34px;
    margin-bottom: -20px;
    text-align: center;
    /* margin-bottom negativa + .portal-busca puxada pra cima logo abaixo:
       o cartão de busca "flutua" por cima da faixa azul, em vez de só
       encostar embaixo -- pedido do usuário (2026-09-22): "filetado, borda
       arredondada e com sombra" pro Portal. Padrão comum em página de
       busca profissional (hero + card de ação sobreposto), reforça que o
       card é a ação principal da tela. */
    position: relative;
    z-index: 1;
}
.portal-hero-busca h1 {
    color: #fff;
    margin: 0 0 6px;
    font-size: 1.5rem;
}
.portal-hero-busca p {
    color: #e3ecf9;
    margin: 0 auto 14px;
    max-width: 30em;
}
/* Ilustração (2026-09-22, pedido do usuário: "deixe uma ilustração pra
   facilitar") -- SVG inline, zero imagem/lib nova, pra quem chega na
   página SEM ter visto o app entender de cara "isso aqui é busca de
   profissional", antes mesmo de ler o texto. Chave de fenda (ferramenta,
   representa o profissional) + lupa (busca) -- as 2 ideias da página numa
   imagem só, cores 100% da marca (zero cor nova). */
.portal-ilustracao {
    margin: 0 auto 8px;
    width: 84px;
    height: 84px;
}

/* Formulário de busca isolado num cartão -- mesma linguagem visual dos
   cartões de orçamento/agenda, pra quem já usa o app reconhecer, e pra
   quem nunca viu entender que é uma coisa só, não 3 blocos soltos.
   Reforçado (2026-09-22, pedido do usuário): borda colorida (filete) na
   cor de destaque da marca, mais arredondado e sombra mais presente --
   antes era só um contorno cinza quase invisível (1px #e3e7ec, sombra de
   1px), agora se destaca como a AÇÃO principal da tela, flutuando por
   cima do hero (ver margin-bottom negativa em .portal-hero-busca acima). */
.portal-busca {
    background: #fff;
    border: 2px solid var(--marca-amarelo);
    border-radius: 16px;
    padding: 18px 16px;
    margin: 0 0 18px;
    box-shadow: 0 10px 24px rgba(1, 39, 98, 0.16);
    position: relative;
    z-index: 2;
}

.portal-resultado-contagem {
    color: #55606b;
    font-size: 0.88rem;
    margin: 0 0 10px;
}

/* Card de autônomo na lista de resultado -- mesma anatomia do
   .card-orcamento (faixa colorida à esquerda, nome em destaque, meta-
   informação abaixo, ação clara ao final), faixa sempre turquesa aqui
   (não há "status" no resultado de busca, é sempre um resultado positivo). */
.card-portal-autonomo {
    list-style: none;
    background: #fff;
    border: 1px solid #e3e7ec;
    border-left: 4px solid var(--marca-turquesa);
    border-radius: 14px;
    padding: 12px 14px;
    margin: 0 0 12px;
    box-shadow: 0 3px 10px rgba(16, 24, 40, 0.08);
    /* Elevação sutil ao passar o mouse -- só cosmético (não afeta clique/
       toque em mobile, que é maioria do público-alvo), pra dar sensação de
       "cartão sério" em vez de lista plana de texto. */
    transition: box-shadow 0.15s ease, transform 0.15s ease;
}
.card-portal-autonomo:hover {
    box-shadow: 0 4px 10px rgba(16, 24, 40, 0.10);
    transform: translateY(-1px);
}
#portal-lista-resultados {
    list-style: none;
    padding: 0;
    margin: 0;
}
.card-portal-nome {
    font-weight: 600;
    font-size: 1.05rem;
    color: var(--marca-azul);
    margin: 0 0 2px;
}
.card-portal-categoria {
    display: inline-block;
    background: #e3ecf9;
    color: var(--marca-azul);
    font-size: 0.78rem;
    font-weight: 600;
    padding: 2px 8px;
    border-radius: 999px;
    margin-bottom: 6px;
}
.card-portal-meta {
    font-size: 0.84rem;
    color: #55606b;
    margin: 2px 0;
}
/* Selo de confiança (contador de concluídos) -- mesmo número que já existe
   na Home do autônomo, aqui é o que substitui "prova social" que o app
   não tem (sem depoimento fabricado, ver PROMPT_CLAUDE_CODE_FRONTEND.md /
   levantamento do portal -- zero número inventado). */
.card-portal-selo {
    display: inline-flex;
    align-items: center;
    gap: 4px;
    font-size: 0.84rem;
    font-weight: 600;
    color: #0b4f4f;
    background: #d9f3f3;
    padding: 3px 9px;
    border-radius: 999px;
    margin: 6px 0;
}
.card-portal-redes {
    display: flex;
    gap: 10px;
    margin: 8px 0;
}
.card-portal-redes a {
    font-size: 0.84rem;
    color: var(--marca-azul);
    text-decoration: underline;
}
/* Botão de contato tem cor própria (verde-WhatsApp) de propósito -- é a
   ÚNICA vez no app inteiro que um botão sai da paleta de marca, porque
   aqui a associação "isto abre o WhatsApp" precisa ser reconhecida em
   menos de 1 segundo por alguém que nunca usou o TaCombinado -- cor da
   marca teria menos reconhecimento imediato que o verde já associado
   à ferramenta que a pessoa já usa todo dia. */
.btn-whatsapp {
    display: block;
    width: 100%;
    text-align: center;
    background: #25d366;
    color: #fff;
    font-weight: 600;
    border: none;
    border-radius: 8px;
    padding: 10px 14px;
    margin-top: 8px;
    text-decoration: none;
    box-sizing: border-box;
}
.btn-whatsapp:hover, .btn-whatsapp:focus-visible {
    background: #1ebd5a;
}

.portal-rodape {
    text-align: center;
    font-size: 0.8rem;
    color: #8a94a3;
    margin-top: 24px;
}

/* Pré-cadastro (web/portal/cadastro.html) -- 2ª porta de entrada do portal,
   pedido do usuário: "chamativo", tom profissional/credibilidade. Gradiente
   com as 2 cores de marca (não uma cor plana) pra destacar do resto da
   página sem sair da paleta -- zero cor nova, zero lib nova. */
.portal-hero-cadastro {
    background: linear-gradient(135deg, var(--marca-azul) 0%, var(--marca-azul-escuro) 100%);
    color: #fff;
    border-radius: 10px;
    padding: 22px 18px;
    margin-bottom: 18px;
    text-align: center;
}
.portal-hero-cadastro h2 {
    color: #fff;
    margin: 0 0 10px;
    font-size: 1.3rem;
}
.portal-hero-cadastro p {
    color: #e3ecf9;
    margin: 0 auto 14px;
    max-width: 32em;
}
/* Selos de confiança em linha -- credibilidade sem prometer número não
   medido (mesmo cuidado do selo de "serviços concluídos" acima: zero dado
   inventado, só compromissos que o produto de fato cumpre). */
.portal-selos-confianca {
    list-style: none;
    display: flex;
    flex-wrap: wrap;
    justify-content: center;
    gap: 8px 16px;
    padding: 0;
    margin: 0;
    font-size: 0.84rem;
    font-weight: 600;
    color: var(--marca-amarelo);
}
.portal-confirmacao-titulo {
    font-size: 1.1rem;
    font-weight: 700;
    color: #0b4f4f;
    margin: 0 0 6px;
}

/* Pedido do usuário (2026-09-15): texto simples explicando o que o botão
   "Repetir Último Orçamento Deste Cliente" faz -- cor mais fraca (mesmo
   #55606b já usado pros outros textos de apoio, 6,4:1 no branco) pra não
   competir com o botão, mas ainda legível. */
.texto-ajuda {
    font-size: 0.82rem;
    color: #55606b;
    margin: 4px 0 0;
}

/* ============================================================================
   CRACHÁ DIGITAL + CONVÊNIO COM LOJAS PARCEIRAS (2026-09-22) -- pedido do
   usuário: "bem atrativo tanto pro lojista quanto pro autônomo, além de
   praticidade e facilidade de visualização pros dois". O crachá reaproveita
   o MESMO gradiente de marca já usado no Portal (.portal-hero-busca/
   .portal-hero-cadastro) -- zero cor nova -- pra quem já viu o app
   reconhecer na hora, e pro lojista (que nunca viu o app) bater o olho e
   entender "isso é oficial", sem precisar ler nada primeiro.
   ============================================================================ */
.cracha-digital {
    background: linear-gradient(135deg, var(--marca-azul) 0%, var(--marca-azul-escuro) 100%);
    color: #fff;
    border-radius: 14px;
    padding: 18px 16px;
    margin-bottom: 18px;
    box-shadow: 0 3px 10px rgba(1, 39, 98, 0.25);
}
.cracha-digital-cabecalho {
    display: flex;
    align-items: center;
    gap: 12px;
}
/* Círculo com iniciais -- mesmo raciocínio de "avatar" de qualquer app
   profissional (LinkedIn, bancos digitais etc.), zero foto obrigatória
   (nem todo autônomo tem/quer subir foto de rosto, e a logo já é outra
   coisa -- ver Storage bucket `logos`). Preenchido via JS com as iniciais
   do nome. */
.cracha-avatar {
    flex: 0 0 auto;
    width: 52px;
    height: 52px;
    border-radius: 50%;
    background: rgba(255, 255, 255, 0.16);
    border: 2px solid var(--marca-amarelo);
    display: flex;
    align-items: center;
    justify-content: center;
    font-size: 1.15rem;
    font-weight: 700;
    color: #fff;
}
.cracha-digital-nome {
    margin: 0;
    font-size: 1.15rem;
    font-weight: 700;
    color: #fff;
}
.cracha-digital-categoria {
    margin: 2px 0 0;
    font-size: 0.86rem;
    color: #cfe0f7;
}
/* Selo "Conta Ativa" -- estado, não estatística (autônomo só vê essa tela
   logado/autenticado, então a afirmação é sempre verdadeira -- zero dado
   inventado ou não medido, ver regra de "zero alucinação de dados"). */
.cracha-selo-ativo {
    display: inline-flex;
    align-items: center;
    gap: 4px;
    margin-top: 10px;
    background: rgba(255, 255, 255, 0.14);
    border: 1px solid rgba(255, 255, 255, 0.35);
    color: var(--marca-amarelo);
    font-size: 0.8rem;
    font-weight: 700;
    padding: 4px 10px;
    border-radius: 999px;
}
.cracha-digital-desde {
    margin: 8px 0 0;
    font-size: 0.76rem;
    color: #b9cdea;
}

/* Lojas parceiras -- mesma anatomia de card já usada em .card-portal-
   autonomo (faixa colorida à esquerda, nome em destaque), faixa amarela
   aqui (cor de destaque/benefício em todo o resto do app, ver .btn-
   primario e os badges de "Novo"). */
.card-parceiro-desconto {
    list-style: none;
    background: #fff;
    border: 1px solid #e3e7ec;
    border-left: 4px solid var(--marca-amarelo);
    border-radius: 10px;
    padding: 12px 14px;
    margin: 0 0 10px;
    box-shadow: 0 1px 2px rgba(16, 24, 40, 0.05);
}
.card-parceiro-nome {
    font-weight: 600;
    font-size: 1rem;
    color: var(--marca-azul);
    margin: 0 0 2px;
}
.card-parceiro-categoria {
    display: block;
    font-size: 0.8rem;
    color: #55606b;
    margin-bottom: 6px;
}
.card-parceiro-desconto-valor {
    display: inline-block;
    background: #fff6e0;
    color: #6b4e00;
    font-weight: 700;
    font-size: 0.92rem;
    padding: 3px 10px;
    border-radius: 999px;
    margin: 0 0 6px;
}
.btn-ver-codigo-parceiro {
    width: 100%;
    box-sizing: border-box;
    margin-top: 4px;
}
/* Código revelado -- grande e monoespaçado, pra ler de longe (autônomo
   mostra a tela pro balconista, não é ele quem lê). */
.card-parceiro-codigo {
    margin: 8px 0 0;
    text-align: center;
    font-family: ui-monospace, "SF Mono", Consolas, monospace;
    font-size: 1.15rem;
    font-weight: 700;
    letter-spacing: 0.04em;
    color: var(--marca-azul-escuro);
    background: #f4f5f7;
    border: 1px dashed var(--marca-amarelo);
    border-radius: 8px;
    padding: 8px;
}
#lista-parceiros-desconto {
    list-style: none;
    padding: 0;
    margin: 0;
}
