/* A tela de candidaturas (spec 2026-09-23). Nenhuma cor nova: tudo sai das variáveis do
   estilo.css. */

/* ⚠️ FOLHA PRÓPRIA, saída do `construtor.css` em 23/09/2026 junto com o `candidaturas.js`.
   Ela NÃO é autossuficiente de propósito: a tabela reusa `.construtor-lista` (mesma tabela,
   mesmo hover, mesmo foco) e o topo reusa `.construtor-topo` — duas tabelas parecidas no
   mesmo painel divergem no primeiro ajuste de padding. As duas folhas carregam juntas no
   `index.html`, então o reúso continua valendo.

   ⚠️ E O QUE NÃO VEIO JUNTO: `.selo-whatsapp-*`, `.pasta-vaga`, `.coluna-pasta`,
   `.icone-botao` e a faixa `.desfazer` continuam no `construtor.css` porque a LISTA DE
   VAGAS também as usa; `.candidaturas-cartao`, `.aba-candidaturas`,
   `.candidatura-linha.qualificada` e `.ficha-veredito` ficaram lá porque moram em outras
   seções daquela folha (a das abas e a da ficha de teste) — mudança de arquivo sem
   necessidade é diff que esconde o que importa. As duas folhas carregam juntas. */

/* ─── as candidaturas: a lista ────────────────────────────────────────────────────────── */

/* O nome da vaga ao lado do título, e não no lugar dele: "Candidaturas" diz em que tela a
   pessoa está, o apelido diz de qual vaga. `min-width: 0` + reticências para um título
   longo não empurrar os botões do topo para fora da tela. */
.candidaturas-vaga {
  min-width: 0;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

/* O "Exportar planilha" desabilitado — a vaga ainda não tem candidatura nenhuma.

   ⚠️ **`.pasta-vaga` SÓ APAGA O BOTÃO PELA CLASSE `.sem-pasta`**, que é do botão da pasta e
   não deste. Sem esta regra, o botão desabilitado sairia com a cor da marca e o cursor de
   mão — a tela convidaria um clique que não acontece, e a pessoa concluiria que a
   exportação está quebrada. `cursor: default` e não `not-allowed` pelo mesmo motivo de lá:
   não há nada de errado no clique, simplesmente não há o que exportar. Quem explica é o
   `title`. */
.exportar-planilha:disabled {
  color: var(--suave-texto);
  cursor: default;
  opacity: .6;
}

/* ─── a grade: todas as colunas, no formato da planilha (spec 2026-09-23 §4.2) ─────────── */

/* ⚠️ **A GRADE É A ÁREA DE ROLAGEM, NOS DOIS EIXOS, e o cabeçalho é `sticky` DENTRO dela.**
   Um `position: sticky` só prende ao ancestral que ROLA; com `overflow-x: auto` aqui e a
   PÁGINA rolando na vertical, o cabeçalho prenderia a esta caixa e sumiria junto com ela
   — ou seja, não prenderia a nada de útil. Dar altura à caixa (o que sobra da janela
   abaixo do topo fixo) é o que faz o cabeçalho ficar SEMPRE à vista, que é o pedido
   ("o header fique lá para ele ver quais as colunas").

   Os 190px descontados são o topo da tela + as abas + a caixa de aviso; sobrando pouco,
   a grade encolhe em vez de empurrar a página. */
.candidaturas-rolagem {
  border: 1px solid var(--linha);
  border-radius: 8px;
  max-height: calc(100vh - var(--altura-topo) - 190px);
  overflow: auto;
}

/* ⚠️ `separate` E NÃO `collapse` (que é o que `.construtor-lista` traz): com bordas
   colapsadas o navegador NÃO pinta a borda de uma célula `sticky` — ela pertence à
   tabela, não à célula, e some na rolagem. Daí também o `box-shadow: inset` no lugar de
   `border` no cabeçalho e na coluna `#`.

   `width: max-content` + `min-width: 100%`: 25 colunas não cabem em 100% sem espremer
   cada uma a três letras; com poucas colunas a tabela ainda ocupa a largura toda. */
.candidaturas-grade { border-collapse: separate; border-spacing: 0;
                      min-width: 100%; width: max-content; }

/* ⚠️ **O CORTE COM RETICÊNCIAS É DO RÓTULO, NÃO DO `<th>`.** Enquanto o cabeçalho era só
   texto, `overflow: hidden` no `<th>` bastava; com o `▾` do menu ao lado, o mesmo recorte
   comia o BOTÃO — a coluna de rótulo comprido ficava sem como ser ordenada ou filtrada, e
   nada na tela dizia por quê. Daí os dois nós (ver `cabecalho` no JS): o `<span>` corta, o
   botão fica inteiro.

   ⚠️ E O `<th>` CONTINUA `table-cell`. `display: flex` aqui alinharia os dois filhos com
   uma linha de CSS — e quebraria a tabela: um filho de `table-row` que não é `table-cell`
   é embrulhado numa célula anônima, e células anônimas CONSECUTIVAS viram UMA só. O
   cabeçalho inteiro colapsaria numa coluna. `inline-block` nos dois filhos resolve o
   alinhamento sem sair do modelo de tabela. */
.candidaturas-grade thead th {
  background: #fff;
  box-shadow: inset 0 -1px 0 var(--linha);
  position: sticky;
  top: 0;
  white-space: nowrap;
  z-index: 3;
}
.candidaturas-grade thead th .th-rotulo {
  display: inline-block;
  max-width: 28ch;
  min-width: 0;
  overflow: hidden;
  text-overflow: ellipsis;
  vertical-align: middle;
  white-space: nowrap;
}

/* A coluna `#` fica à esquerda ao rolar de lado: é por ela que se volta à linha certa
   depois de percorrer 25 colunas. `z-index` maior no cabeçalho dela, que é sticky nos
   DOIS eixos e passa por baixo das outras células se empatar. */
.candidaturas-grade th.coluna-id,
.candidaturas-grade td.coluna-id {
  background: #fff;
  box-shadow: inset -1px 0 0 var(--linha);
  left: 0;
  position: sticky;
  z-index: 2;
}
.candidaturas-grade thead th.coluna-id { z-index: 4; }

/* ⚠️ **A CÉLULA GRUDADA PRECISA REPETIR A COR DA LINHA.** Ela tem fundo OPACO próprio (é o
   que impede o texto das outras colunas de passar por baixo ao rolar), e um fundo opaco
   não deixa passar o `background` do `<tr>`: sem estas três regras, a coluna `#` fica
   branca e morta enquanto a linha inteira acende no hover ou no azul do qualificado —
   justamente na coluna por onde o olho segue a linha.
   ⚠️ E A ORDEM DELAS NÃO DECIDE NADA — o comentário que estava aqui dizia que sim. As
   duas primeiras empatam em especificidade (0,3,3: `:hover` conta como classe, no mesmo
   lugar de `.qualificada`), mas só se encontram no MESMO elemento quando a linha é
   qualificada E está sob o cursor — e aí a terceira, que soma as duas (0,4,3), vence
   ambas por especificidade, esteja ela escrita onde estiver. Trocá-las de lugar não muda
   pixel nenhum; o que não se pode é apagar a TERCEIRA, o único desempate que existe. */
.candidaturas-grade tbody tr:hover td.coluna-id { background: var(--fundo); }
.candidaturas-grade tbody tr.qualificada td.coluna-id { background: var(--gelo-hex); }
.candidaturas-grade tbody tr.qualificada:hover td.coluna-id { background: var(--gelo-forte-hex); }

/* Uma linha por célula, cortada com reticências — é o que deixa 25 colunas caberem sem
   que uma resposta de parágrafo estique a linha inteira. O texto completo fica no
   `title` (ver `celula` no JS) e na ficha. */
.candidaturas-grade td {
  max-width: 36ch;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
.candidaturas-grade td.coluna-texto_longo { max-width: 48ch; }

/* A pergunta saiu do formulário, a coluna fica (D9). Em itálico apagado, e não escondida:
   as respostas antigas continuam no banco e na planilha. */
.candidaturas-grade th.coluna-inativa .th-rotulo {
  color: var(--suave-texto);
  font-style: italic;
}

/* Um link por arquivo, empilhados: nome de anexo de candidato é comprido
   ("Certificado TBO - JOAO DA SILVA SOUZA 2024.pdf") e dois lado a lado quebram no meio
   da palavra. Mesmo clipe da ficha, para o olho reconhecer a mesma coisa nas duas telas. */
.candidaturas-grade .anexo-link {
  color: var(--marca);
  display: block;
  text-decoration: underline;
  text-underline-offset: 2px;
}
.candidaturas-grade .anexo-link::before { content: "📎 "; text-decoration: none; }

/* O dropdown de Status. ⚠️ AS CORES SÃO AS DO PAINEL (`--ok`, `--perigo`, `--marca`), e
   não um verde/vermelho novos: a área Vagas não tem paleta por ETAPA (só aceso/apagado
   nos círculos), então o que mantém a linguagem visual única aqui são os tokens do
   `estilo.css` — a mesma regra que o cabeçalho desta folha já declara. */
.status-candidatura {
  background: #fff;
  border: 1px solid var(--linha);
  border-radius: 6px;
  font: inherit;
  padding: 3px 6px;
}
.status-candidatura.status-aprovado { border-color: var(--ok); color: var(--ok); }
.status-candidatura.status-reprovado,
.status-candidatura.status-desistiu { border-color: var(--perigo); color: var(--perigo); }
.status-candidatura.status-entrevistado,
.status-candidatura.status-encaminhado,
.status-candidatura.status-em_selecao { border-color: var(--marca); color: var(--marca); }

/* Verde-marca porque é a ação boa desta tela (levar o dado para a planilha), e um `<a>` e
   não um `<button>` de propósito — ver `botaoDeCSV`. Sem `text-decoration`: aqui ele é
   botão, e sublinhado dentro de um retângulo cheio parece defeito. */
.baixar-csv:focus-visible { box-shadow: 0 0 0 2px var(--acento); outline: 0; }

.candidaturas-grade .candidatura-data { color: var(--suave-texto); white-space: nowrap; }

/* Monoespaçada, como o `.form-endereco`: o CPF mascarado é uma sequência de dígitos que
   se compara com a de baixo, e com fonte proporcional as colunas de pontos não alinham. */
.candidatura-cpf {
  font-family: ui-monospace, monospace;
  white-space: nowrap;
}

.candidatura-linha { cursor: pointer; }

/* ─── as candidaturas: a tela vazia ───────────────────────────────────────────────────── */

/* Ela é o conteúdo principal da tela quando não há inscrição, então tem o peso de um
   cartão — e não a discrição de um `.meta` perdido no canto. */
.candidaturas-vazio {
  background: #fff;
  border: 1px solid var(--linha);
  border-radius: 10px;
  margin-top: 6px;
  padding: 22px 24px;
}
.candidaturas-vazio p { margin: 0 0 10px; }
.candidaturas-vazio p:last-child { margin-bottom: 0; }
.candidaturas-vazio-frase { max-width: 62ch; }

/* O endereço em destaque e monoespaçado: é o que a pessoa vai LER em voz alta para
   alguém, ou selecionar com o mouse para colar no WhatsApp. */
.candidaturas-endereco {
  color: var(--marca);
  font-family: ui-monospace, monospace;
  font-size: 1.02rem;
  font-weight: 600;
  word-break: break-all;
}

/* ─── a candidatura aberta: a ficha ───────────────────────────────────────────────────── */

/* Mesma coluna de papel da tela do construtor (`.tela`), e pelo mesmo motivo: uma resposta
   de parágrafo se lê num bloco de largura controlada, não numa linha de 1600 px. */
.ficha {
  background: #fff;
  border: 1px solid var(--linha);
  border-radius: 10px;
  box-shadow: var(--sombra);
  margin: 0 auto;
  max-width: 760px;
  padding: 26px 30px 30px;
}

.ficha-cabeca {
  border-bottom: 1px solid var(--linha);
  margin-bottom: 18px;
  padding-bottom: 14px;
}
.ficha-cabeca h2 { font-size: 1.3rem; margin: 0 0 4px; }
.ficha-cabeca p { margin: 0; }

/* ⚠️ O ÚNICO LUGAR DO PAINEL COM O CPF INTEIRO. Destacado de propósito — quem abriu esta
   tela abriu para conferir a identidade de UMA pessoa, e um número escondido no meio do
   texto faria abrir de novo. O rótulo antes dele impede que os onze dígitos sejam lidos
   como qualquer outro número da ficha. */
.ficha-cabeca p.ficha-cpf {
  align-items: baseline;
  display: flex;
  gap: 8px;
  margin-top: 10px;
}
.ficha-cpf strong { font-family: ui-monospace, monospace; font-size: 1.05rem; }
.ficha-cpf-rotulo {
  color: var(--suave-texto);
  font-size: 12px;
  font-weight: 700;
  letter-spacing: .06em;
  text-transform: uppercase;
}

/* O título do grupo, entre os campos — o mesmo passo que o candidato viu (09/09/2026). */
.ficha-grupo {
  border-bottom: 2px solid var(--marca);
  color: var(--marca);
  font-size: .95rem;
  letter-spacing: .02em;
  margin: 22px 0 4px;
  padding-bottom: 4px;
  text-transform: uppercase;
}
.ficha-grupo:first-of-type { margin-top: 6px; }
.ficha-campo { border-bottom: 1px solid var(--fundo); padding: 11px 0; }
.ficha-campo:last-child { border-bottom: 0; }

.ficha-rotulo {
  align-items: center;
  color: var(--suave-texto);
  display: flex;
  flex-wrap: wrap;
  font-size: 12.5px;
  font-weight: 700;
  gap: 8px;
  margin-bottom: 3px;
  text-transform: uppercase;
}

/* `pre-wrap`: resposta de texto longo vem com quebra de linha do jeito que a pessoa
   digitou, e colapsá-la juntaria parágrafos numa parede de texto. */
.ficha-valor {
  margin: 0;
  white-space: pre-wrap;
  word-break: break-word;
}
.ficha-valor.vazio { color: var(--suave-texto); font-style: italic; }

/* A pergunta saiu do formulário, a RESPOSTA fica — ver `fichaDeCampo`. Em `--alerta` sobre
   âmbar, o mesmo par que o painel usa para "olhe isto", e nunca em `--perigo`: não há
   nada de errado com este campo, ele só não existe mais na vaga. */
.ficha-campo.desativada { background: #fffbeb; border-radius: 8px; padding: 11px 12px; }
.ficha-selo {
  background: #fff;
  border: 1px solid #fde68a;
  border-radius: 999px;
  color: var(--alerta);
  font-size: 10.5px;
  font-weight: 700;
  letter-spacing: .04em;
  padding: 2px 8px;
  text-transform: none;
}

/* "Perfil para outras vagas" (05/10/2026): cards só leitura; bolinhas na COR DO NÍVEL, as
   mesmas do quiz (`--perfil-nivel-*` vêm de `perfil.css`, que o painel carrega; a reserva é
   o token do painel). O nível também sai por extenso ao lado — a cor sozinha não basta. */
.ficha-perfil-card { border: 1px solid var(--linha); border-radius: var(--raio-mini); margin: 8px 0; padding: 10px 12px; }
.ficha-perfil-card strong { display: block; }
.ficha-perfil-nivel { align-items: center; display: flex; gap: 8px; margin-top: 4px; }
.ficha-perfil-nivel-rotulo { min-width: 96px; color: var(--suave-texto); font-size: 12.5px; }
.ficha-perfil-bolinhas { display: inline-flex; gap: 4px; }
/* Vazia = anel, cheia = disco (forma, não só cor — o dourado contra o cinza dá ~1,9:1). */
.ficha-perfil-bolinha { background: #fff; border: 2px solid var(--perfil-vazio, var(--suave)); border-radius: 50%; box-sizing: border-box; display: inline-block; height: 12px; width: 12px; }
.perfil-cor-basico .ficha-perfil-bolinha.cheia { background: var(--perfil-nivel-basico, var(--dourado)); border-color: var(--perfil-nivel-basico, var(--dourado)); }
.perfil-cor-intermediario .ficha-perfil-bolinha.cheia { background: var(--perfil-nivel-intermediario, var(--marca-clara)); border-color: var(--perfil-nivel-intermediario, var(--marca-clara)); }
.perfil-cor-avancado .ficha-perfil-bolinha.cheia { background: var(--perfil-nivel-avancado, var(--ok)); border-color: var(--perfil-nivel-avancado, var(--ok)); }
.perfil-cor-fluente .ficha-perfil-bolinha.cheia { background: var(--perfil-nivel-fluente, var(--ok)); border-color: var(--perfil-nivel-fluente, var(--ok)); }

/* Os anexos da candidatura. Empilhados e não em linha: nome de arquivo de candidato é
   comprido ("Certificado TBO - JOAO DA SILVA SOUZA 2024.pdf") e dois deles lado a lado
   quebram no meio da palavra. Um por linha se lê e se clica no celular. */
.ficha-anexos { display: flex; flex-direction: column; gap: 6px; margin-top: 2px; }

/* ⚠️ Sublinhado SEMPRE, não só no hover: é o único link dentro de uma ficha que, fora
   isto, é toda texto. Sem a marca permanente ele parece mais um valor de campo — e o
   currículo é justamente o que a pessoa veio buscar nesta tela. */
.ficha-anexo {
  align-items: center;
  color: var(--marca);
  display: inline-flex;
  font-weight: 600;
  gap: 7px;
  text-decoration: underline;
  text-underline-offset: 2px;
  word-break: break-word;
}
.ficha-anexo::before { content: "📎"; text-decoration: none; }
.ficha-anexo:hover { color: var(--marca-escura, var(--marca)); }
.ficha-anexo:focus-visible { border-radius: 4px; outline: 2px solid var(--marca);
                             outline-offset: 3px; }

/* Sem link e sem sublinhado: não há o que clicar, e um sublinhado que não leva a lugar
   nenhum é a mentira mais barata de uma interface. */
.ficha-anexo.indisponivel {
  color: var(--suave-texto);
  font-style: italic;
  font-weight: 500;
  margin: 0;
  text-decoration: none;
}

/* A coluna fixa "Anexos" (a contagem "📎 3") SAIU em 23/09/2026: com todas as colunas na
   tela, cada pergunta de tipo `arquivo` tem a sua, com os links — a regra de largura que
   morava aqui ficou sem alvo. */

/* ─── o menu da coluna e a barra de filtros (spec 2026-09-23 §4.3) ────────────────────── */

/* ⚠️ `position: relative` AQUI é o que prende o menu à coluna dele. No `<th>` não dá: ele
   é `position: sticky`, e um `sticky` já é o bloco de contenção — o menu ficaria preso ao
   cabeçalho e rolaria com ele, que é quase certo mas não é o que se quer (ele precisa
   descer POR CIMA das linhas). */
.th-menu { display: inline-block; margin-left: 4px; position: relative;
           vertical-align: middle; }

.th-menu-botao {
  background: transparent;
  border: 0;
  color: var(--suave-texto);
  cursor: pointer;
  font: inherit;
  padding: 0 4px;
}
.th-menu-botao:hover, .th-menu-botao:focus-visible { color: var(--marca); }

/* ⚠️ ESTE `z-index: 10` SÓ VALE DENTRO DO `<th>`, e é bom saber disso antes de mexer: o
   `<th>` é `position: sticky` COM `z-index: 3`, ou seja um contexto de empilhamento — o
   menu não disputa com nada de fora dele, nem com o `4` do `thead th.coluna-id` (que é
   outro `<th>`, nunca sob este menu). Quem põe o menu por cima das LINHAS é o `3` do
   próprio `<th>`, maior que o `2` das células grudadas; o `10` garante só que ele fique
   acima do que mais houver dentro do `<th>` — hoje, o rótulo.
   `font-weight: 400` e `white-space: normal` porque o `<th>` é negrito e sem quebra — o
   menu é texto comum, e sem isto "Ocultar coluna" sairia em negrito numa linha só. */
.th-menu-lista {
  background: #fff;
  border: 1px solid var(--linha);
  border-radius: 8px;
  box-shadow: 0 8px 24px rgba(0, 0, 0, .12);
  display: flex;
  flex-direction: column;
  font-weight: 400;
  gap: 2px;
  left: 0;
  max-height: 320px;
  min-width: 220px;
  overflow: auto;
  padding: 6px;
  position: absolute;
  text-align: left;
  top: 100%;
  white-space: normal;
  z-index: 10;
}
.th-menu-lista[hidden] { display: none; }

.th-menu-item {
  background: transparent;
  border: 0;
  border-radius: 6px;
  cursor: pointer;
  font: inherit;
  padding: 6px 8px;
  text-align: left;
}
.th-menu-item:hover, .th-menu-item:focus-visible { background: var(--fundo); }

.th-menu-filtro {
  align-items: center;
  display: flex;
  flex-wrap: wrap;
  gap: 6px;
  padding: 6px 8px;
}
.th-menu-filtro input {
  border: 1px solid var(--linha);
  border-radius: 6px;
  flex: 1;
  font: inherit;
  min-width: 0;
  padding: 4px 6px;
}
/* A lista de valores rola dentro do menu: uma coluna de cidade tem 40 valores distintos,
   e sem teto o menu passaria da altura da janela. */
.th-menu-valores {
  display: flex;
  flex-direction: column;
  gap: 2px;
  max-height: 180px;
  overflow: auto;
  padding: 4px 8px;
}
.th-menu-valor { align-items: center; cursor: pointer; display: flex; gap: 6px; }

.barra-filtros {
  align-items: center;
  display: flex;
  flex-wrap: wrap;
  gap: 8px;
  margin: 8px 0;
}
.chip-filtro {
  align-items: center;
  background: var(--fundo);
  border: 1px solid var(--linha);
  border-radius: 999px;
  display: inline-flex;
  font-size: .9rem;
  gap: 4px;
  padding: 2px 8px;
}
.chip-filtro button {
  background: transparent;
  border: 0;
  cursor: pointer;
  font: inherit;
  padding: 0 2px;
}
.limpar-filtros {
  background: #fff;
  border: 1px solid var(--linha);
  border-radius: 8px;
  cursor: pointer;
  font: inherit;
  padding: 4px 10px;
}
.colunas-ocultas { position: relative; }
.colunas-ocultas summary { cursor: pointer; }
.colunas-ocultas > div { display: flex; flex-direction: column; gap: 2px; padding: 4px 0; }

/* ─── o modo seleção do disparo de WhatsApp (spec 2026-09-23 §5.2) ──────────────────────── */

/* ⚠️ **A COLUNA DE CAIXAS GRUDA À ESQUERDA, E A `#` ANDA 40 PX PARA A DIREITA.** As duas
   são `sticky` com `left`; com as duas em `left: 0` a `#` passaria POR CIMA da caixa ao
   rolar de lado, e a pessoa marcaria às cegas. A largura é fixa para que o `left` da `#`
   seja uma conta certa, e não uma medida que muda com a fonte. */
.candidaturas-grade .coluna-selecao {
  background: #fff;
  left: 0;
  max-width: 40px;
  min-width: 40px;
  position: sticky;
  text-align: center;
  width: 40px;
  z-index: 2;
}
.candidaturas-grade thead th.coluna-selecao { z-index: 4; }
.candidaturas-grade.em-selecao th.coluna-id,
.candidaturas-grade.em-selecao td.coluna-id { left: 40px; }
/* A mesma regra da `#`: célula grudada tem fundo opaco, então repete a cor da linha. */
.candidaturas-grade tbody tr:hover td.coluna-selecao { background: var(--fundo); }
.candidaturas-grade tbody tr.qualificada td.coluna-selecao { background: var(--gelo-hex); }
.candidaturas-grade tbody tr.qualificada:hover td.coluna-selecao { background: var(--gelo-forte-hex); }
/* A linha escolhida ganha uma faixa à esquerda (e não uma cor de fundo): o fundo já diz
   "qualificado" em azul, e duas cores de fundo disputariam o mesmo sinal. */
.candidaturas-grade.em-selecao tr.selecionada td.coluna-selecao { box-shadow: inset 3px 0 0 var(--ok); }
/* Linha que não pode receber: esmaecida, e sem a mãozinha — clicar nela não faz nada. */
.candidaturas-grade.em-selecao tr.travada { cursor: default; opacity: .6; }

/* ⚠️ A BARRA É `sticky` NO RODAPÉ DO CARTÃO, não `fixed` na janela: `fixed` a deixaria
   flutuando sobre qualquer tela se a pessoa trocasse de aba do painel no meio da seleção
   — o cartão some com a tela, e a barra some junto. */
.barra-selecao {
  align-items: center;
  background: #fff;
  border-top: 1px solid var(--linha);
  bottom: 0;
  box-shadow: 0 -6px 12px -10px rgba(0, 0, 0, .35);
  display: flex;
  gap: .6rem;
  margin-top: 12px;
  padding: 10px 4px;
  position: sticky;
  z-index: 5;
}
.barra-selecao-conta { font-weight: 600; }
.barra-selecao button[disabled],
.disparo-whatsapp[disabled] { cursor: not-allowed; opacity: .55; }

/* ─── o modal de números do disparo (spec 2026-09-23 §5.2) ──────────────────────────────── */

/* ⚠️ VEIO DO `construtor.css` EM 23/09/2026, junto com o disparo, que saiu da lista de
   formulários para esta tela. Sobreposto, com o mesmo `.cartao` do resto do painel por
   baixo (ver `estilo.css`). `z-index: 20`, acima da barra do modo seleção (5), que fica
   atrás da sobreposição enquanto o modal está aberto — é o que impede um segundo
   "Continuar" com o modal na frente. */
.dialogo-whatsapp { position: fixed; inset: 0; background: rgba(0, 0, 0, .35);
                    display: grid; place-items: center; z-index: 20; }
.dialogo-whatsapp .cartao { max-width: 520px; width: calc(100vw - 32px); }
.dialogo-whatsapp pre.exemplo { white-space: pre-wrap; background: var(--fundo);
                                padding: .6rem; border-radius: .5rem; }
.dialogo-acoes { display: flex; justify-content: flex-end; gap: .6rem; margin-top: .8rem; }
/* ⚠️ **O ERRO DO `POST` MORA DENTRO DO CARTÃO**, e não na `.construtor-erro` da tela —
   aquela fica por BAIXO desta sobreposição (`position: fixed`), então um erro escrito lá
   nunca chegaria aos olhos de quem está com o modal na frente (defeito medido em 21/09).
   `:empty { display: none }`: sem isto, o `min-height` de `.erro` (`estilo.css`) deixaria
   uma faixa em branco no cartão mesmo sem erro nenhum. */
.dialogo-erro:empty { display: none; }
/* A lista de números: uma linha por número, a caixa grudada no nome. Com rolagem própria
   porque uma célula grande pode ter uma dúzia de números conectados. */
.numeros-whatsapp { list-style: none; margin: .4rem 0; max-height: 40vh; overflow: auto;
                    padding: 0; }
.numeros-whatsapp li { padding: 4px 0; }
.numeros-whatsapp label { cursor: pointer; }
.estimativa-disparo { font-weight: 600; margin: .6rem 0 0; }

/* ─── no celular ──────────────────────────────────────────────────────────────────────── */

/* A ficha no celular: o papel encosta nas bordas em vez de perder 30 px de cada lado para
   uma margem que não cabe. Ao contrário do construtor, esta tela É útil no telefone — ler
   uma candidatura a caminho de uma entrevista é uso normal, e não há nada para arrastar.

   ⚠️ **ESTE BLOCO TEM DE MORAR NA MESMA FOLHA QUE AS REGRAS-BASE, E DEPOIS DELAS.** Ele
   ficou no `construtor.css` quando a tela saiu (23/09/2026) e virou CSS morto na hora:
   `@media` não acrescenta especificidade nenhuma, e o `index.html` carrega esta folha
   DEPOIS — então `.ficha { padding: 26px 30px 30px }` daqui vencia por ordem e o telefone
   continuava com a margem de monitor. Não estoura, não avisa: some. */
@media (max-width: 700px) {
  .ficha { padding: 18px 16px 22px; }
  .candidaturas-vazio { padding: 16px 14px; }
  .construtor-topo .candidaturas-vaga { display: none; }
}

/* As Observações do Conecta (24/09/2026): texto livre na própria grade, salvo no blur. */
.observacao-candidatura {
  width: 100%;
  min-width: 220px;
  font: inherit;
  resize: vertical;
  box-sizing: border-box;
  /* sem a margem base do textarea (6px 0): é uma por linha, e 12px a mais em cada uma
     alongam a grade inteira (revisão de 30/09/2026) */
  margin: 0;
}

/* Fretado (24/09/2026): o resultado gravado na candidatura. Verde = dentro de alguma rota;
   vermelho = fora de todas. O detalhe de auditoria por rota está no `title` da célula.
   25/09/2026: "Dentro de N rotas" abre (`<details>`) numa linha por rota. ⚠️ A célula
   solta a regra "uma linha por célula, com reticências" de `.candidaturas-grade td`
   (acima): aberta, a lista precisa quebrar; fechada, o resumo curto cabe numa linha. */
.candidaturas-grade td.coluna-fretado { white-space: normal; text-overflow: clip; }
.fretado-resultado { font-weight: 600; white-space: nowrap; }
.fretado-resultado.dentro { color: #16a34a; }
.fretado-resultado.fora { color: var(--perigo); }
.fretado-detalhe summary { cursor: pointer; white-space: nowrap; }
.fretado-rotas { list-style: none; margin: 4px 0 0; padding: 0; font-size: 12px; }
.fretado-rotas li { padding: 1px 0; }
.fretado-rotas li.dentro { color: #16a34a; }
.fretado-rotas li.fora { color: var(--suave-texto); }
