/* ====================================================================
   Portal Synconsult Pecuária — Design tokens (Manual de Identidade Visual)
   ==================================================================== */
:root {
  --verde-escuro: #0A2924;
  --verde-escuro-2: #0d3830;
  --dourado: #FFAD00;
  --dourado-hover: #e69c00;
  /* O dourado da marca sobre branco dá só 2,3:1 — ilegível, ainda mais no
     celular sob sol. Este tom escuro mantém a família e chega a 5,9:1.
     O dourado original segue nos botões, onde o texto é verde-escuro (8:1). */
  --dourado-texto: #8a5a00;
  --areia: #F7F7F7;
  --preto: #262626;
  --branco: #FFFFFF;
  --cinza-borda: #E1E4E3;
  /* #6B7472 dava 4,49:1 sobre a areia — abaixo do mínimo legível de 4,5:1 */
  --cinza-texto: #636B69;
  --vermelho: #C0392B;
  --verde-ok: #2E7D32;
  --amarelo-alerta: #E0A800;
  --sombra: 0 2px 10px rgba(10, 41, 36, 0.08);
  --sombra-lg: 0 8px 30px rgba(10, 41, 36, 0.16);
  --raio: 10px;
  --fonte: 'Sora', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
  /* ---------- Realces e tintas de fundo ----------
     Fundos claros escritos à mão (o #FBFBF9 do hover de linha, o creme da
     linha selecionada, o verde-água do filtro ligado) sobreviviam à troca de
     tema: no modo escuro o texto continua claro e a linha realçada virava
     branco no branco — texto sumindo debaixo do mouse. Agora são tokens, e
     cada modo define os seus. */
  --realce-linha:     #FBFBF9;
  --realce-selecao:   #FFF6E0;
  --tinta-verde:      #EEF4F1;
  --tinta-verde-2:    #EAF1EE;
  --tinta-vermelha:   #FDECEA;
  --tinta-amarela:    #FFF6E0;
  --tinta-dourada:    #FDF6E6;
  --superficie-fraca: #FBFCFC;

  /* Pilha do menu do Portal SynConsult, para os dois portais terem o mesmo
     menu. A Neo Sans Pro é a fonte do MIV e é paga: entra se estiver instalada
     na máquina; senão o navegador desce a lista sozinho, sem baixar nada. */
  --fonte-menu: 'Neo Sans Pro', 'Poppins', 'Century Gothic', 'Sora', 'Segoe UI', sans-serif;
}

* { box-sizing: border-box; }

html, body {
  margin: 0;
  padding: 0;
  font-family: var(--fonte);
  background: var(--areia);
  color: var(--preto);
  -webkit-font-smoothing: antialiased;
}

h1, h2, h3, h4 { font-weight: 700; margin: 0 0 8px; color: var(--verde-escuro); }
p { margin: 0 0 12px; line-height: 1.5; }
a { color: var(--dourado-texto); text-decoration: none; }

button {
  font-family: var(--fonte);
  cursor: pointer;
  border: none;
  border-radius: 8px;
  padding: 10px 18px;
  font-weight: 600;
  font-size: 14px;
  transition: all .15s ease;
}
.btn-primario {
  background: var(--dourado);
  color: var(--verde-escuro);
}
.btn-primario:hover { background: var(--dourado-hover); }
.btn-primario:disabled { opacity: .55; cursor: not-allowed; }
.btn-secundario {
  background: transparent;
  color: var(--verde-escuro);
  border: 1.5px solid var(--verde-escuro);
}
.btn-secundario:hover { background: rgba(10,41,36,.06); }
.btn-perigo {
  background: transparent;
  color: var(--vermelho);
  border: 1.5px solid var(--vermelho);
}
.btn-perigo:hover { background: rgba(192,57,43,.08); }
.btn-texto {
  background: transparent;
  color: var(--verde-escuro);
  padding: 6px 10px;
}
.btn-sm { padding: 6px 12px; font-size: 13px; }

/* Campo que guarda o texto em maiúsculas (nome do animal, genealogia de fora,
   fornecedor, origem da transferência). O CSS mostra; quem converte o valor é
   o listener em js/app.js, e o banco normaliza de novo ao gravar. */
.maiusculo { text-transform: uppercase; }

input, select, textarea {
  font-family: var(--fonte);
  width: 100%;
  padding: 10px 12px;
  border: 1.5px solid var(--cinza-borda);
  border-radius: 8px;
  font-size: 14px;
  background: var(--branco);
  color: var(--preto);
}
input:focus, select:focus, textarea:focus {
  outline: none;
  border-color: var(--dourado);
  box-shadow: 0 0 0 3px rgba(255,173,0,.18);
}
label {
  display: block;
  font-size: 12.5px;
  font-weight: 600;
  color: var(--verde-escuro);
  margin-bottom: 6px;
  letter-spacing: .01em;
}
.campo { margin-bottom: 16px; }
.linha-campos { display: grid; grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); gap: 16px; }

/* ---------- Faixa de filtros das janelas de relatório ----------
   Os filtros ficam lado a lado numa linha só. Cada um cresce para ocupar a
   sobra, mas nunca encolhe abaixo de 170px (o período pede 260px, porque leva
   duas datas). Quando não couber mais, o flex-wrap quebra sozinho — é o que
   mantém a janela usável no celular. */
.faixa-filtros-relatorio {
  display: flex;
  flex-wrap: wrap;
  gap: 12px 14px;
  align-items: flex-end;
  margin-bottom: 14px;
}
.faixa-filtros-relatorio .filtro-relatorio {
  flex: 1 1 170px;
  min-width: 170px;
  margin-bottom: 0;
}
.faixa-filtros-relatorio .filtro-relatorio-periodo {
  flex: 1 1 260px;
  min-width: 260px;
}
.faixa-filtros-relatorio .filtro-relatorio select,
.faixa-filtros-relatorio .filtro-relatorio input {
  width: 100%;
  min-width: 0;
}
/* Nome de categoria longo ("Bovino — Bezerro (Macho)") não pode esticar o
   select e furar a linha: o texto corta com reticências. */
.faixa-filtros-relatorio .filtro-relatorio select {
  text-overflow: ellipsis;
}
.faixa-filtros-relatorio .filtro-relatorio .multiseletor { width: 100%; }

/* ---------- Seletor com busca (campos de formulário, escolha única) ----------
   O <select> nativo continua no DOM guardando valor, required e id — só sai
   da vista. clip em vez de display:none de propósito: validarCamposModal
   descarta o que tem offsetParent nulo, e um campo obrigatório invisível
   deixaria de ser validado. */
.sb-nativo-oculto {
  position: absolute !important;
  width: 1px; height: 1px;
  padding: 0; margin: -1px; border: 0;
  overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap;
  pointer-events: none;
}
.seletor-busca { position: relative; width: 100%; }
.sb-gatilho {
  width: 100%;
  display: flex; align-items: center; justify-content: space-between; gap: 8px;
  background: var(--branco);
  border: 1.5px solid var(--cinza-borda);
  border-radius: 8px;
  padding: 10px 12px;
  font: inherit; font-size: 14px;
  color: var(--preto);
  text-align: left; cursor: pointer;
  min-height: 42px;
}
.sb-gatilho:focus-visible, .seletor-busca.sb-aberto .sb-gatilho {
  outline: none; border-color: var(--dourado); box-shadow: 0 0 0 3px rgba(255,173,0,.18);
}
.sb-rotulo { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.sb-rotulo.sb-placeholder { color: var(--cinza-texto); }
.sb-seta { flex: none; font-size: 11px; color: var(--cinza-texto); }
.seletor-busca.sb-desabilitado .sb-gatilho { background: var(--areia); color: var(--cinza-texto); cursor: not-allowed; }
/* O balão nativo do navegador não aparece num campo escondido: a marca de
   campo obrigatório em branco tem de ser nossa. */
.seletor-busca.sb-invalido .sb-gatilho {
  border-color: var(--vermelho);
  box-shadow: 0 0 0 3px rgba(192,57,43,.14);
}

.sb-painel {
  position: fixed; z-index: 200;
  background: var(--branco);
  border: 1px solid var(--cinza-borda);
  border-radius: 10px;
  box-shadow: var(--sombra-lg);
  padding: 8px;
  display: flex; flex-direction: column; gap: 8px;
  max-height: min(60vh, 380px);
}
.sb-painel.oculto { display: none; }
.sb-painel .sb-busca {
  width: 100%; min-width: 0;
  padding: 8px 10px;
  border: 1px solid var(--cinza-borda);
  border-radius: 8px;
  font-size: 13.5px;
}
.sb-painel .sb-busca.oculto { display: none; }
.sb-lista { overflow-y: auto; flex: 1; min-height: 0; display: flex; flex-direction: column; }
.sb-opcao {
  display: block; width: 100%;
  background: none; border: none; border-radius: 6px;
  padding: 9px 10px;
  font: inherit; font-size: 13.5px; font-weight: 400;
  color: var(--verde-escuro);
  text-align: left; cursor: pointer;
  white-space: normal; overflow-wrap: anywhere;
}
.sb-opcao:hover, .sb-opcao:focus-visible { background: var(--areia); outline: none; }
.sb-opcao.sb-escolhida { background: var(--tinta-verde); font-weight: 600; }
.sb-opcao.oculto { display: none; }
.sb-vazio { font-size: 12.5px; color: var(--cinza-texto); padding: 8px 6px; margin: 0; }

@media (max-width: 760px) {
  .sb-opcao { padding: 12px 10px; }
  .sb-gatilho { min-height: 46px; }
}

/* ---------- Multisseletor (filtros com busca e múltipla seleção) ----------
   O painel é position:fixed de propósito: os filtros vivem dentro de
   .modal-corpo (max-height + overflow-y) e de .modal (overflow:hidden), que
   recortariam um painel absoluto. Nenhum desses ancestrais usa transform,
   então o fixed escapa do recorte. As coordenadas vêm do JS. */
.multiseletor { position: relative; display: inline-block; min-width: 0; }
.ms-gatilho {
  width: 100%;
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 8px;
  background: var(--branco);
  border: 1px solid var(--cinza-borda);
  border-radius: 8px;
  padding: 9px 12px;
  font: inherit;
  font-size: 13.5px;
  color: var(--verde-escuro);
  text-align: left;
  cursor: pointer;
  min-height: 40px;
}
.ms-gatilho:focus-visible { outline: 2px solid var(--verde-escuro); outline-offset: 1px; }
.ms-resumo { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.ms-seta { flex: none; font-size: 11px; color: var(--cinza-texto); }
/* Filtro ligado fica visualmente diferente do filtro em branco: sem isso o
   usuário esquece que há filtro aplicado e acha que "sumiram registros". */
.multiseletor.ms-ativo .ms-gatilho {
  border-color: var(--verde-escuro);
  background: var(--tinta-verde);
  font-weight: 600;
}
.multiseletor.ms-excluindo .ms-gatilho {
  border-color: var(--dourado);
  background: var(--tinta-dourada);
}

.ms-painel {
  position: fixed;
  z-index: 200;
  background: var(--branco);
  border: 1px solid var(--cinza-borda);
  border-radius: 10px;
  box-shadow: var(--sombra-lg);
  padding: 10px;
  display: flex;
  flex-direction: column;
  gap: 8px;
  max-height: min(60vh, 420px);
}
.ms-painel.oculto { display: none; }
.ms-busca {
  width: 100%;
  padding: 8px 10px;
  border: 1px solid var(--cinza-borda);
  border-radius: 8px;
  font-size: 13.5px;
}
.ms-modo {
  display: flex;
  flex-direction: column;
  gap: 2px;
  padding: 6px 4px;
  border-top: 1px solid var(--cinza-borda);
  border-bottom: 1px solid var(--cinza-borda);
}
.ms-modo label {
  display: flex;
  align-items: center;
  text-align: left;
  gap: 7px;
  font-size: 12.5px;
  font-weight: 500;
  color: var(--cinza-texto);
  margin: 0;
  cursor: pointer;
  text-transform: none;
  letter-spacing: 0;
}
/* As caixas de marcação precisam voltar ao tamanho nativo. Duas regras globais
   puxam contra: "input { width: 100% }" e, dentro das barras de filtro,
   ".filtros input { min-width: 150px }" — esta última é a que fazia o quadradinho
   ocupar 150px, com o navegador desenhando o controle no MEIO desse espaço e
   jogando o texto para a direita. Por isso o min-width: 0 é obrigatório aqui, e
   o seletor é prefixado por .ms-painel para ganhar de ".filtros input". */
.ms-painel input[type="radio"],
.ms-painel input[type="checkbox"] {
  width: auto;
  min-width: 0;
  flex: none;
  margin: 0;
}

.ms-lista { overflow-y: auto; flex: 1; min-height: 0; }
.ms-opcao {
  display: flex;
  align-items: flex-start;
  text-align: left;
  gap: 8px;
  padding: 7px 6px;
  border-radius: 6px;
  font-size: 13.5px;
  cursor: pointer;
  margin: 0;
  text-transform: none;
  letter-spacing: 0;
  font-weight: 400;
  color: var(--verde-escuro);
}
.ms-opcao:hover { background: var(--areia); }

.ms-opcao span { white-space: normal; overflow-wrap: anywhere; text-align: left; }
.ms-opcao.oculto { display: none; }
.ms-vazio { font-size: 12.5px; color: var(--cinza-texto); padding: 8px 6px; margin: 0; }

.ms-rodape { display: flex; justify-content: space-between; align-items: center; gap: 8px; }
/* Linha de busca + ações de marcação (Marcar/Desmarcar todas, Só marcadas). */
.ms-busca-linha { display: flex; gap: 6px; align-items: center; }
.ms-busca-linha .ms-busca { flex: 1; }
.ms-limpar-busca { font-size: 12px; white-space: nowrap; padding: 4px 6px; }
.ms-acoes { display: flex; flex-wrap: wrap; gap: 4px 10px; align-items: center; font-size: 12.5px; }
.ms-acoes .btn-texto { font-size: 12.5px; padding: 2px 4px; }
.ms-acoes .ms-so-marcadas { display: flex; align-items: center; gap: 5px; margin: 0 0 0 auto; font-size: 12.5px;
  font-weight: 500; color: var(--cinza-texto); text-transform: none; letter-spacing: 0; cursor: pointer; }
.multiseletor.ms-formulario { display: block; width: 100%; }
.multiseletor.ms-desabilitado .ms-gatilho { background: var(--areia); color: var(--cinza-texto); cursor: not-allowed; opacity: .75; }
.multiseletor.ms-invalido .ms-gatilho { border-color: var(--vermelho); }
/* Protocolos de Medicação: grades de detalhe dentro do modal. */
.pm-grade { width: 100%; border-collapse: collapse; font-size: 13px; }
.pm-grade th, .pm-grade td { padding: 6px 6px; border-bottom: 1px solid var(--cinza-borda); text-align: left; vertical-align: middle; }
.pm-grade td input, .pm-grade td select { min-width: 0; padding: 6px 8px; font-size: 13px; }
.pm-grade .pm-num { width: 78px; }
.pm-adicionar { display: flex; gap: 8px; align-items: flex-end; flex-wrap: wrap; margin-bottom: 10px; }
.pm-adicionar .campo { margin: 0; flex: 1 1 220px; }
.pm-adicionar .pm-codigo { flex: 0 0 90px; }
.pm-setas button { padding: 2px 8px; }
.selo-sistema { background: var(--tinta-verde); color: var(--verde-escuro); }
.ms-rodape .ms-aplicar { padding: 6px 16px; }

@media (max-width: 760px) {
  /* Alvo de toque: a linha de opção precisa dos 44px recomendados. */
  .ms-opcao { padding: 11px 8px; }
  .ms-gatilho { min-height: 44px; }
}

/* ---------- Tela de login/onboarding ---------- */
.tela-auth {
  min-height: 100vh;
  display: flex;
  align-items: center;
  justify-content: center;
  background: radial-gradient(circle at 15% 15%, var(--verde-escuro-2), var(--verde-escuro) 60%);
  padding: 24px;
}
.cartao-auth {
  background: var(--branco);
  border-radius: 16px;
  box-shadow: var(--sombra-lg);
  width: 100%;
  max-width: 420px;
  padding: 40px 36px;
}
.marca-auth { display: flex; align-items: center; gap: 12px; margin-bottom: 28px; }
.marca-auth img { width: 40px; height: 40px; }
.marca-auth .nome-marca { font-size: 20px; font-weight: 800; color: var(--verde-escuro); }
.marca-auth .subtitulo { font-size: 12.5px; color: var(--cinza-texto); margin-top: -2px; }
.faixa-auth { font-size: 13px; color: var(--cinza-texto); margin-top: 22px; text-align: center; }
/* Sem isto o link tem 17px de altura — impossível de acertar com o dedo. */
.faixa-auth a { display: inline-block; padding: 12px 10px; font-weight: 600; }
.erro-auth {
  background: var(--tinta-vermelha);
  color: var(--vermelho);
  border-radius: 8px;
  padding: 10px 12px;
  font-size: 13px;
  margin-bottom: 16px;
  display: none;
}
.erro-auth.mostrar { display: block; }
.aviso-auth {
  background: #FFF6E0;
  color: #7a5900;
  border-radius: 8px;
  padding: 10px 12px;
  font-size: 13px;
  margin-bottom: 16px;
  display: none;
}
.aviso-auth.mostrar { display: block; }
.icone-status { font-size: 34px; text-align: center; margin-bottom: 6px; }

/* ---------- Shell do app ---------- */
.app-shell { display: flex; min-height: 100vh; }
/* O menu segue o desenho do Portal SynConsult: mesma largura, mesma tipografia,
   título de grupo em maiúscula, seta desenhada em CSS e linha-guia ligando os
   itens ao grupo. Os dois portais são o mesmo produto para quem usa. */
.barra-lateral {
  width: 256px;
  background: var(--verde-escuro);
  color: var(--branco);
  font-family: var(--fonte-menu);
  display: flex;
  flex-direction: column;
  flex-shrink: 0;
  /* Fica parada junto com o topo: menu que sobe com a rolagem obriga a voltar
     ao começo da página só para trocar de tela. O `.nav-modulos` já rola por
     dentro quando os itens não cabem. */
  position: sticky; top: 0; align-self: flex-start; height: 100vh;
}
.barra-lateral .marca {
  display: flex; align-items: center; gap: 10px;
  padding: 22px 20px; border-bottom: 1px solid rgba(247,247,247,.14);
}
.barra-lateral .marca img { width: 28px; height: 28px; }
.barra-lateral .marca span { font-weight: 800; font-size: 16px; letter-spacing: -.01em; }
.nav-modulos { flex: 1; padding: 18px 14px; overflow-y: auto; display: flex; flex-direction: column; gap: 4px; }
.nav-item {
  display: flex; align-items: center; gap: 11px;
  padding: 11px 14px; border-radius: 9px; color: rgba(247,247,247,.82);
  font-size: 14px; font-weight: 600; cursor: pointer;
  transition: background .12s ease, color .12s ease;
}
.nav-item:hover { background: rgba(247,247,247,.08); color: var(--branco); }
.nav-item.ativo { background: var(--dourado); color: var(--verde-escuro); font-weight: 700; }
.nav-item .ico { width: 18px; text-align: center; flex-shrink: 0; }
/* Item dentro de um grupo: marcador redondo no lugar do ícone. */
.nav-item-filho { font-size: 13.5px; font-weight: 500; padding: 9px 12px; }
.nav-item-filho .marcador {
  width: 5px; height: 5px; border-radius: 50%; flex: none;
  background: currentColor; opacity: .55; margin-left: 5px; margin-right: 4px;
}
.nav-item-filho.ativo .marcador { opacity: 1; }
.rodape-lateral { padding: 16px 20px; border-top: 1px solid rgba(247,247,247,.14); font-size: 12.5px; color: rgba(247,247,247,.65); }
.rodape-lateral b { color: var(--branco); display: block; font-size: 13px; }

/* Modo de cores: botão no topo, ao lado de quem está logado — é preferência da
   pessoa, e é onde ela procura as coisas dela. */
.area-tema { position: relative; display: flex; align-items: center; }
.btn-tema {
  background: none; border: none; padding: 6px 8px; margin: 0;
  font-size: 17px; line-height: 1; cursor: pointer; border-radius: 8px;
}
.btn-tema:hover { background: var(--areia); }
.menu-tema {
  position: absolute; top: calc(100% + 8px); right: 0; z-index: 60;
  min-width: 210px; padding: 8px;
  background: var(--branco); border: 1px solid var(--cinza-borda);
  border-radius: 10px; box-shadow: var(--sombra-lg);
}
.menu-tema.oculto { display: none; }
.menu-tema-titulo {
  margin: 4px 8px 8px; font-size: 10.5px; text-transform: uppercase;
  letter-spacing: .12em; font-weight: 700; color: var(--cinza-texto);
}
.menu-tema-op {
  display: block; width: 100%; text-align: left;
  padding: 9px 10px; border-radius: 8px; border: none; background: none;
  font-size: 13px; font-weight: 500; color: var(--preto);
}
.menu-tema-op:hover { background: var(--areia); }
/* O modo em uso precisa se anunciar sem depender só da cor. */
.menu-tema-op.escolhido { font-weight: 700; color: var(--verde-escuro); }
.menu-tema-op.escolhido::before { content: "✓ "; color: var(--dourado-texto); }

.area-principal { flex: 1; min-width: 0; display: flex; flex-direction: column; }
/* A barra do topo acompanha a rolagem: em listagem longa, trocar de fazenda,
   ver o sino ou sair exigia rolar de volta ao começo da página. */
.topo {
  height: 64px; flex-shrink: 0;
  position: sticky; top: 0; z-index: 30;
  display: flex; align-items: center; justify-content: space-between;
  padding: 0 28px; background: var(--branco); border-bottom: 1px solid var(--cinza-borda);
}
.topo-esquerda { display: flex; align-items: center; gap: 10px; min-width: 0; }
.topo h1 { font-size: 18px; margin: 0; }
/* O ☰ passou a existir em qualquer largura: no celular abre o menu deslizante,
   no computador mostra e oculta a barra lateral. */
.btn-menu-mobile {
  display: inline-flex; align-items: center; justify-content: center;
  background: none; border: none; padding: 4px 8px; margin: 0;
  font-size: 21px; line-height: 1; color: var(--verde-escuro); cursor: pointer;
}
.sobreposicao-menu-mobile {
  display: none; position: fixed; inset: 0; background: rgba(10,41,36,.45); z-index: 39;
}
.sobreposicao-menu-mobile.aberta { display: block; }
/* Filho direto de .topo (não do bloco do usuário): é o que permite ele ocupar
   uma linha inteira no celular sem alargar o cabeçalho. */
#seletor-fazenda-ativa { width: auto; min-width: 180px; max-width: 260px; margin-left: auto; margin-right: 14px; }
/* O seletor de fazenda também passou pelo componente de busca
   (js/seletorbusca.js), que esconde o <select> nativo e põe uma casca por
   cima. A casca é .seletor-busca { width:100% } — medida pensada para o campo
   dentro de um formulário. Como no cabeçalho ela vira item flex irmão do
   título, esses 100% faziam a casca disputar a linha inteira e espremer o
   "Permissões", "Dashboard" etc. até sobrar uma sílaba. Os limites que eram do
   <select> passam a valer para a casca, que é quem de fato ocupa espaço. */
.topo > .seletor-busca {
  width: auto;
  flex: 0 1 260px;
  min-width: 140px;
  margin-left: auto;
  margin-right: 14px;
}
/* O <select> nativo some por classe (uma fazenda só); a casca precisa sumir
   junto — o JS espelha a classe, isto apenas garante o display. */
.topo > .seletor-busca.oculto { display: none !important; }
/* Título longo encurta com reticências em vez de cortar no meio da palavra. */
.topo h1 { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.topo .usuario-topo { display: flex; align-items: center; gap: 12px; font-size: 13.5px; color: var(--cinza-texto); margin-left: auto; flex: none; }
.avatar-inicial {
  width: 32px; height: 32px; border-radius: 50%;
  background: var(--dourado); color: var(--verde-escuro);
  display: flex; align-items: center; justify-content: center; font-weight: 700; font-size: 13px;
}
/* Sem `overflow-y: auto` aqui de propósito: quem rola é a PÁGINA (a casca tem
   min-height, não height, então este bloco cresce com o conteúdo e nunca teve
   rolagem própria). Com o overflow declarado, o navegador o tratava como
   contêiner de rolagem mesmo sem rolar, e qualquer `position: sticky` dentro
   dele — a barra de abas das telas — se ancorava neste bloco parado, ou seja,
   não congelava coisa nenhuma. */
.conteudo { padding: 26px 28px; flex: 1; }

/* ---------- KPI / Dashboard ---------- */
.grade-kpi { display: grid; grid-template-columns: repeat(auto-fit, minmax(220px, 1fr)); gap: 18px; margin-bottom: 26px; }

/* Uma linha só, cartões do mesmo tamanho.
   Um conjunto FECHADO de cartões (as situações da matriz, o resumo da base
   demo) é para ser lido de uma olhada: quebrando em duas linhas, o último
   cartão fica sozinho embaixo e parece outra coisa. Aqui as colunas são
   implícitas e dividem a largura por igual — `minmax(0, 1fr)`, e não `1fr`,
   porque `1fr` se recusa a encolher abaixo do conteúdo e voltaria a estourar.
   No tablet e no celular volta a quebrar: sete cartões de 100px não se leem. */
.grade-kpi-linha {
  grid-auto-flow: column;
  grid-auto-columns: minmax(0, 1fr);
  grid-template-columns: none;
  gap: 14px;
}
@media (max-width: 1100px) {
  .grade-kpi-linha {
    grid-auto-flow: row;
    grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
  }
}

.cartao-kpi {
  background: var(--branco); border-radius: var(--raio); padding: 18px 20px;
  box-shadow: var(--sombra); border-left: 4px solid var(--dourado);
  /* Coluna para o rodapé poder ir para o fim do cartão: sem isso, cartão com
     rótulo de duas linhas empurra tudo e nada se alinha com os vizinhos. */
  display: flex; flex-direction: column; min-width: 0;
}
.cartao-kpi .rotulo-kpi {
  font-size: 12.5px; color: var(--cinza-texto); font-weight: 600;
  text-transform: uppercase; letter-spacing: .03em; line-height: 1.3;
  /* Duas linhas reservadas: "Aguardando diagnóstico" ocupa duas e os demais
     uma. Sem a reserva, os números saem em alturas diferentes na mesma fila. */
  min-height: 2.6em;
}
.cartao-kpi .valor-kpi { font-size: 30px; font-weight: 800; color: var(--verde-escuro); margin-top: 6px; }
.cartao-kpi .rodape-kpi { font-size: 12px; color: var(--cinza-texto); margin-top: auto; padding-top: 4px; }

.grade-painel { display: grid; grid-template-columns: 1.4fr 1fr; gap: 18px; }
@media (max-width: 980px) { .grade-painel { grid-template-columns: 1fr; } }
.painel {
  background: var(--branco); border-radius: var(--raio); padding: 20px 22px; box-shadow: var(--sombra);
  /* Sem min-width:0 o item de grid nunca encolhe abaixo da largura do próprio
     conteúdo: uma tabela larga dentro de um painel esticava a coluna e fazia o
     gráfico vizinho ficar mais largo que a tela no celular. */
  min-width: 0;
}
.painel h3 { font-size: 15px; margin-bottom: 14px; }

/* ---------- Tabela ---------- */
.barra-ferramentas { display: flex; justify-content: space-between; align-items: center; gap: 12px; margin-bottom: 16px; flex-wrap: wrap; }
.filtros { display: flex; gap: 10px; flex-wrap: wrap; align-items: center; }
/* Os campos dividem a linha e ENCOLHEM: com min-width fixo, oito filtros
   somavam mais que a largura da tela e a barra quebrava em duas linhas, com o
   último campo sozinho embaixo. Agora cada um tem uma largura preferida
   (flex-basis) e um piso pequeno; quando nem assim couberem — janela estreita,
   tela com dez filtros — a barra volta a quebrar, que é melhor do que espremer
   tudo até ninguém conseguir ler. */
.filtros > * { min-width: 0; }
.filtros select, .filtros input { width: auto; min-width: 118px; flex: 1 1 auto; }
/* Do tablet para cima a barra NÃO quebra: os campos encolhem até caberem na
   mesma linha. Com `wrap`, o navegador nem tenta encolher — ele enche a linha
   e joga o resto para baixo, que era o que deixava a tela de Animais com oito
   filtros em três linhas. Se nem encolhendo couber (muitos filtros numa
   janela estreita), a própria barra rola de lado: melhor do que espremer os
   campos até ninguém conseguir ler o que está escrito. */
@media (min-width: 761px) {
  .filtros { flex-wrap: nowrap; overflow-x: auto; padding-bottom: 2px; }
}
/* Data precisa de mais: abaixo disso o dd/mm/aaaa some atrás do ícone. */
.filtros input[type="date"] { min-width: 142px; }
/* O multisseletor entra no lugar dos selects das barras de filtro e precisa da
   mesma largura mínima. As regras abaixo são mais específicas que
   ".filtros input" de propósito: sem isso o campo de busca do painel herdaria
   width:auto e ficaria menor que o painel. */
.filtros .multiseletor { min-width: 132px; max-width: 260px; flex: 1 1 auto; }
.ms-painel .ms-busca { width: 100%; min-width: 0; }
.tabela-cartao {
  background: var(--branco); border-radius: var(--raio); box-shadow: var(--sombra);
  overflow-x: auto; -webkit-overflow-scrolling: touch;
  scrollbar-width: thin; scrollbar-color: #C4CBC9 var(--areia);
}
.tabela-cartao::-webkit-scrollbar { height: 11px; }
.tabela-cartao::-webkit-scrollbar-track { background: var(--areia); }
.tabela-cartao::-webkit-scrollbar-thumb { background: #C4CBC9; border-radius: 6px; }
table { width: 100%; border-collapse: collapse; font-size: 13.5px; }
thead th {
  text-align: left; padding: 12px 16px; background: var(--areia);
  color: var(--verde-escuro); font-weight: 700; font-size: 12px; text-transform: uppercase; letter-spacing: .02em;
  border-bottom: 1px solid var(--cinza-borda);
}
tbody td { padding: 12px 16px; border-bottom: 1px solid #EEF0EF; color: var(--preto); }
tbody tr:hover { background: var(--realce-linha); }

/* Linha selecionada. Fundo próprio + uma faixa dourada à esquerda: só a cor de
   fundo se perde no modo claro e some de vez no alto contraste, e a pessoa
   precisa enxergar de longe qual animal vai para a pesagem. */
tbody tr[data-sel] { cursor: pointer; }
tbody tr.linha-selecionada,
tbody tr.linha-selecionada:hover { background: var(--realce-selecao); }
tbody tr.linha-selecionada td:first-child { box-shadow: inset 3px 0 0 var(--dourado); }
[data-tema="contraste"] tbody tr.linha-selecionada { outline: 2px solid #000; }
tbody tr:last-child td { border-bottom: none; }

/* ---------- Linha da grade: uma linha só, sempre ----------
   Uma célula que quebra em duas linhas desalinha a leitura de toda a grade —
   e numa lista de 50 animais isso é a diferença entre correr o olho e ter de
   ler linha a linha. Fonte menor, nada quebra, e o texto longo é cortado com
   reticências. Nada fica escondido: o texto inteiro aparece ao passar o mouse
   (o title é posto por prepararTabelasResponsivas, só nas células que
   realmente foram cortadas) e a tabela continua rolando de lado.
   Vale só do tablet para cima — no celular a linha vira cartão, com o rótulo
   ao lado do valor, e cortar ali esconderia justamente o que se foi ver. */
@media (min-width: 761px) {
  table { font-size: 12.5px; }
  thead th { padding: 10px 14px; }
  tbody td {
    padding: 10px 14px;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
    max-width: 340px;
  }
  /* A coluna de ações não é texto: cortar um botão pela metade não ajuda. */
  tbody td.celula-acoes { max-width: none; overflow: visible; }
}
.selo { display: inline-block; padding: 3px 10px; border-radius: 20px; font-size: 11.5px; font-weight: 700; }
.selo-ativo { background: #E7F5E8; color: var(--verde-ok); }
.selo-vendido, .selo-obito, .selo-descartado { background: #FDECEA; color: var(--vermelho); }
.selo-transferido { background: #FFF6E0; color: #7a5900; }
.selo-matriz { background: #EAF1FE; color: #2255c4; }
.selo-reprodutor { background: #F3E9FE; color: #6a2fc4; }
.selo-doadoradeovulo { background: #E6F6F4; color: #0f6b60; }
.selo-doadordesemen { background: #FDEEF6; color: #9c2667; }
.vazio { text-align: center; padding: 44px 20px; color: var(--cinza-texto); }

/* ---------- Monitoramento de vacinação ----------
   A legenda: vermelho vencida (ou nunca vacinada), amarelo a vencer em até
   15 dias, verde acima disso. As mesmas três cores valem no selo da tabela,
   no ponto da árvore e na legenda do topo — a cor precisa querer dizer a
   mesma coisa em todo lugar. */
.selo-vac-vermelho { background: #FDECEA; color: var(--vermelho); }
.selo-vac-amarelo  { background: #FFF6E0; color: #7a5900; }
.selo-vac-verde    { background: #E7F5E8; color: var(--verde-ok); }

.legenda-vacinacao { display: flex; flex-wrap: wrap; gap: 16px; align-items: center;
  font-size: 12.5px; color: var(--cinza-texto); margin: 0 0 14px; }
.legenda-vacinacao span { display: flex; align-items: center; gap: 6px; }
.ponto-vac { width: 11px; height: 11px; border-radius: 50%; flex: none; display: inline-block; }
.ponto-vac-vermelho { background: var(--vermelho); }
.ponto-vac-amarelo  { background: var(--amarelo-alerta); }
.ponto-vac-verde    { background: var(--verde-ok); }

/* Aviso calculado dentro dos modais (próxima dose, carência). */
.aviso-vacina {
  background: var(--tinta-verde); border-left: 4px solid var(--verde-escuro);
  border-radius: 8px; padding: 10px 14px; margin-bottom: 16px;
  font-size: 12.5px; line-height: 1.5; color: var(--verde-escuro);
}
.aviso-vacina[hidden] { display: none; }

/* ---------- Árvore de vacinas ---------- */
.arvore-vacinas { display: flex; flex-direction: column; gap: 10px; }
.no-vacina { background: var(--branco); border: 1px solid var(--cinza-borda);
  border-radius: var(--raio); overflow: hidden; }
.no-vacina-cabecalho {
  display: flex; align-items: center; gap: 12px; width: 100%;
  padding: 14px 16px; background: none; border: none; text-align: left;
  font-family: var(--fonte); font-size: 14px; font-weight: 600; color: var(--verde-escuro);
}
.no-vacina-cabecalho:hover { background: var(--areia); }
.no-vacina-seta { flex: none; font-size: 11px; color: var(--cinza-texto); transition: transform .15s; }
.no-vacina.aberto .no-vacina-seta { transform: rotate(90deg); }
.no-vacina-nome { flex: 1; min-width: 0; }
.no-vacina-nome small { display: block; font-weight: 400; font-size: 12px; color: var(--cinza-texto); }
.no-vacina-contagens { display: flex; gap: 6px; flex: none; flex-wrap: wrap; justify-content: flex-end; }
.no-vacina-corpo {
  border-top: 1px solid var(--cinza-borda);
  overflow-x: auto;
  scrollbar-width: thin; scrollbar-color: #C4CBC9 var(--areia);
}
.no-vacina-corpo::-webkit-scrollbar { height: 11px; }
.no-vacina-corpo::-webkit-scrollbar-track { background: var(--areia); }
.no-vacina-corpo::-webkit-scrollbar-thumb { background: #C4CBC9; border-radius: 6px; }
.no-vacina-corpo table { font-size: 13px; }
.linha-animal-vac { cursor: pointer; }
.historico-animal { background: var(--areia); }
.historico-animal td { padding: 12px 16px 16px 44px; }
.historico-animal h5 { margin: 0 0 8px; font-size: 12.5px; color: var(--verde-escuro); }
.historico-animal ul { margin: 0; padding-left: 18px; font-size: 12.5px; line-height: 1.7; }

/* Sino de aviso no topo. Só aparece quando há pendência — botão que nunca faz
   nada é ruído visual. */
.sino-notificacao {
  position: relative; background: none; border: none; padding: 6px 8px;
  font-size: 18px; line-height: 1; cursor: pointer;
}
.sino-notificacao.oculto { display: none; }
.sino-contador {
  position: absolute; top: 0; right: 0;
  background: var(--vermelho); color: #fff;
  font-size: 10px; font-weight: 700; line-height: 1;
  padding: 3px 5px; border-radius: 10px; min-width: 16px; text-align: center;
}
.grupo-aviso-vacina { margin-bottom: 20px; }
.grupo-aviso-vacina h4 { display: flex; align-items: center; gap: 8px; font-size: 14px; margin-bottom: 8px; }

/* ---------- Árvore do aviso de vacinas: protocolo > piquete > animais ----------
   O segundo nível tem classes próprias (.no-lote-*) de propósito: a regra
   `.no-vacina.aberto .no-vacina-seta` alcança QUALQUER seta descendente, então
   reaproveitar a classe do primeiro nível giraria também as setas dos piquetes
   fechados assim que a vacina fosse aberta. */
.arvore-aviso .no-vacina-corpo { overflow-x: visible; }
.sub-arvore-lotes { display: flex; flex-direction: column; }
.no-lote + .no-lote { border-top: 1px solid var(--cinza-borda); }
.no-lote-cabecalho {
  display: flex; align-items: center; gap: 12px; width: 100%;
  padding: 11px 16px 11px 36px; background: var(--areia); border: none; text-align: left;
  font-family: var(--fonte); font-size: 13px; font-weight: 600; color: var(--verde-escuro);
}
.no-lote-cabecalho:hover { background: var(--tinta-verde-2); }
.no-lote-seta { flex: none; font-size: 10px; color: var(--cinza-texto); transition: transform .15s; }
.no-lote.aberto > .no-lote-cabecalho .no-lote-seta { transform: rotate(90deg); }
.no-lote-datas {
  display: flex; gap: 16px; flex: none; flex-wrap: wrap;
  font-size: 12px; font-weight: 400; color: var(--cinza-texto);
}
.no-lote-datas b { color: var(--verde-escuro); font-weight: 600; }
.no-lote-corpo { background: var(--branco); overflow-x: auto; }
.no-lote-corpo table { font-size: 13px; }
.marca-diverge {
  color: var(--amarelo-alerta); font-weight: 700; cursor: help;
  text-decoration: none; border: none; margin-left: 2px;
}
.titulo-bloco-ficha {
  display: flex; align-items: center; gap: 8px;
  font-size: 13px; text-transform: uppercase; letter-spacing: .4px;
  color: var(--cinza-texto); margin: 22px 0 8px;
}
.titulo-bloco-ficha:first-child { margin-top: 0; }
.rotulo-desligar-aviso {
  display: flex; align-items: center; gap: 8px; margin: 0;
  font-size: 12.5px; font-weight: 500; color: var(--cinza-texto);
  text-transform: none; letter-spacing: 0; cursor: pointer;
}
.rotulo-desligar-aviso input[type="checkbox"] { width: auto; min-width: 0; margin: 0; }

@media (max-width: 760px) {
  .no-vacina-cabecalho { flex-wrap: wrap; }
  .no-vacina-contagens { width: 100%; justify-content: flex-start; }
  .historico-animal td { padding-left: 16px; }
  .no-lote-cabecalho { flex-wrap: wrap; padding-left: 22px; }
  .no-lote-datas { width: 100%; gap: 12px; }
}

/* ---------- Modal ---------- */
.sobreposicao {
  position: fixed; inset: 0; background: rgba(10,41,36,.45);
  display: none; align-items: flex-start; justify-content: center;
  padding: 40px 20px; overflow-y: auto; z-index: 50;
}
.sobreposicao.aberta { display: flex; }
.modal {
  background: var(--branco); border-radius: 14px; width: 100%; max-width: 640px;
  box-shadow: var(--sombra-lg); overflow: hidden;
}
.modal-cabecalho { padding: 20px 26px; border-bottom: 1px solid var(--cinza-borda); display: flex; justify-content: space-between; align-items: center; }
.modal-fechar { background: none; border: none; font-size: 20px; color: var(--cinza-texto); padding: 4px 8px; }
.modal-corpo { padding: 22px 26px; max-height: 60vh; overflow-y: auto; }
.modal-rodape { padding: 16px 26px; border-top: 1px solid var(--cinza-borda); display: flex; justify-content: flex-end; gap: 10px; }
.abas { display: flex; gap: 4px; border-bottom: 1px solid var(--cinza-borda); margin-bottom: 20px; }

/* ---------- Barra de abas congelada ao rolar ----------
   Formulário de quatro abas com 20 campos: ao chegar no fim da aba, a barra
   já saiu da tela e não há como trocar de aba sem voltar ao topo. As abas são
   a navegação da janela — navegação que some não navega.

   São duas situações, com âncoras diferentes:
   • Dentro de um modal, quem rola é o .modal-corpo, então a barra gruda no
     topo DELE (top: 0). O sangramento lateral negativo cobre o padding do
     corpo: sem ele o conteúdo aparece passando por baixo, nas beiradas.
   • Numa tela, quem rola é a página, e a barra do topo já está congelada em
     64px — as abas param logo abaixo dela. Só do tablet para cima: no celular
     o cabeçalho quebra em duas linhas e a altura deixa de ser 64px fixos.
   O fundo é obrigatório nos dois casos: barra transparente deixaria o texto
   passar por trás enquanto rola. */
@media (min-width: 761px) {
  .conteudo .abas, .conteudo .abas-topo {
    position: sticky; top: 64px; z-index: 8;
    background: var(--areia);
    padding-top: 10px;
  }
}
.modal-corpo .abas {
  position: sticky; top: 0; z-index: 6;
  background: var(--branco);
  margin-left: -26px; margin-right: -26px;
  padding: 10px 26px 0;
  /* O corpo do modal tem padding, e o navegador congela a barra logo ABAIXO
     desse padding — sobra uma faixa de 22px por onde o texto rolando
     apareceria acima das abas. A sombra sólida pinta essa faixa; o próprio
     overflow do corpo a recorta, então não vaza para o cabeçalho. */
  box-shadow: 0 -24px 0 var(--branco);
}
@media (max-width: 760px) {
  .modal-corpo .abas { margin-left: -18px; margin-right: -18px; padding-left: 18px; padding-right: 18px; }
}
.aba-btn {
  background: none; border: none; padding: 10px 4px; margin-right: 18px;
  font-size: 13.5px; font-weight: 600; color: var(--cinza-texto); border-bottom: 2.5px solid transparent; border-radius: 0;
}
.aba-btn.ativa { color: var(--verde-escuro); border-bottom-color: var(--dourado); }
.painel-aba { display: none; }
.painel-aba.ativa { display: block; }

.carregando { text-align: center; padding: 60px 20px; color: var(--cinza-texto); }
.oculto { display: none !important; }

/* ---------- Ajuda de campo (ícone "?" + F2) ---------- */
.ajuda-campo-icone {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 18px;
  height: 18px;
  margin-left: 6px;
  position: relative;
  border-radius: 50%;
  background: var(--cinza-borda);
  color: var(--verde-escuro);
  font-size: 10.5px;
  font-weight: 700;
  line-height: 1;
  cursor: pointer;
  vertical-align: middle;
  user-select: none;
}
.ajuda-campo-icone::after {
  /* área de toque de 44px ao redor do ícone, invisível — o "?" desenhado
     continua pequeno para não poluir o formulário, mas o dedo acerta. */
  content: '';
  position: absolute;
  top: 50%; left: 50%;
  width: 44px; height: 44px;
  transform: translate(-50%, -50%);
}
.ajuda-campo-icone:hover, .ajuda-campo-icone:focus {
  background: var(--dourado);
  outline: none;
}
.popover-ajuda {
  position: absolute;
  z-index: 90;
  background: var(--verde-escuro);
  color: var(--branco);
  font-size: 12.5px;
  font-weight: 400;
  line-height: 1.5;
  padding: 10px 14px;
  border-radius: 8px;
  box-shadow: var(--sombra-lg);
  letter-spacing: normal;
}

/* ---------- Relatórios ---------- */
.grupo-relatorios { margin-bottom: 30px; }
.grade-relatorios { display: grid; grid-template-columns: repeat(auto-fill, minmax(260px, 1fr)); gap: 16px; }
.cartao-relatorio {
  background: var(--branco); border-radius: var(--raio); padding: 18px 20px; box-shadow: var(--sombra);
  border-left: 4px solid var(--dourado); cursor: pointer; transition: box-shadow .15s, transform .1s;
}
.cartao-relatorio:hover { box-shadow: var(--sombra-lg); transform: translateY(-1px); }
.cartao-relatorio h4 { margin: 0 0 6px; font-size: 14.5px; }
.cartao-relatorio p { font-size: 12.5px; color: var(--cinza-texto); margin: 0; line-height: 1.4; }
.contagem-resultado { font-size: 13px; color: var(--verde-escuro); font-weight: 600; margin: 4px 0 0; }
.botoes-exportar { display: flex; gap: 10px; flex-wrap: wrap; }
.btn-exportar {
  display: inline-flex; align-items: center; gap: 8px; padding: 10px 16px; border-radius: 8px;
  border: 1.5px solid var(--cinza-borda); background: var(--branco); font-weight: 700; font-size: 13px;
  color: var(--verde-escuro); cursor: pointer; flex: 1; justify-content: center; min-width: 100px;
}
.btn-exportar:hover { border-color: var(--dourado); background: #FFFBF0; }
.btn-exportar:disabled { opacity: .5; cursor: not-allowed; }

.grade-relatorio-scroll {
  overflow: auto;
  border: 1px solid var(--cinza-borda);
  border-radius: 8px;
  margin-top: 4px;
  /* Mais alto que os 340px de antes: com a janela larga, sobra tela e o que
     faltava era ver mais linhas de uma vez. */
  max-height: min(52vh, 440px);
}
.grade-relatorio-scroll table { font-size: 12.5px; white-space: nowrap; }
.grade-relatorio-scroll thead th { position: sticky; top: 0; background: var(--branco); z-index: 2; }
/* A primeira coluna é o identificador (Número do animal, Nome, Data). Rolar
   para o lado e perder a referência de qual linha se está lendo torna a grade
   inútil justamente quando ela tem muitas colunas. */
.grade-relatorio-scroll th:first-child,
.grade-relatorio-scroll td:first-child {
  position: sticky; left: 0;
  background: var(--branco);
  box-shadow: 1px 0 0 var(--cinza-borda);
  z-index: 1;
}
.grade-relatorio-scroll thead th:first-child { z-index: 3; }
.grade-relatorio-scroll tbody tr:hover td:first-child { background: var(--realce-linha); }
.aviso-rolagem-lateral {
  font-size: 12px; color: var(--cinza-texto); margin: 6px 0 0;
  display: flex; align-items: center; gap: 6px;
}
/* Sombra na borda direita enquanto houver coluna escondida. Não depende da
   barra de rolagem aparecer — em macOS e no Chrome ela some sozinha, e foi
   por isso que a tabela pareceu simplesmente cortada. Sombra INSET não rola
   junto com o conteúdo: fica colada na borda da caixa. */
.grade-relatorio-scroll.tem-mais-a-direita {
  box-shadow: inset -18px 0 14px -14px rgba(10, 41, 36, .38);
}

/* ---------- Janela de relatório: a grade é quem rola ----------
   Antes o corpo do modal rolava por fora E a grade rolava por dentro. Como a
   grade era mais alta que a área visível, a barra horizontal dela ficava
   ABAIXO da dobra: o usuário via a tabela cortada à direita e nada indicando
   que dava para rolar — foi exatamente a queixa.
   Agora o modal é uma coluna flex: cabeçalho e rodapé fixos, e a grade ocupa
   a sobra. A barra horizontal fica sempre na base da área visível. */
/* Só a partir de tablet: no celular os filtros empilham e o topo do corpo
   sozinho já passa da altura útil — travar a rolagem vertical ali recortaria
   a grade em vez de deixar chegar nela. Abaixo de 760px vale o modelo antigo,
   com o corpo do modal rolando e a grade com altura limitada. */
@media (min-width: 761px) {
  #sobreposicao-relatorio .modal {
    display: flex;
    flex-direction: column;
    max-height: calc(100vh - 80px);
  }
  #sobreposicao-relatorio .modal-corpo {
    display: flex;
    flex-direction: column;
    max-height: none;
    flex: 1;
    min-height: 0;
    overflow: hidden;
  }
  #sobreposicao-relatorio #rel-grade {
    display: flex;
    flex-direction: column;
    flex: 1;
    min-height: 0;
  }
  #sobreposicao-relatorio .grade-relatorio-scroll {
    flex: 1;
    min-height: 140px;
    max-height: none;
  }
  /* O topo do corpo (descrição, filtros, contagem) não encolhe; só a grade. */
  #sobreposicao-relatorio .modal-corpo > :not(#rel-grade) { flex: none; }
}

/* ---------- Barra de rolagem horizontal sempre visível ----------
   Em macOS e no Chrome a barra some quando ninguém está rolando, e o usuário
   conclui que a tabela acabou ali — foi o que aconteceu na janela de
   relatórios. Definir ::-webkit-scrollbar força a barra clássica, que fica. */
.rolagem-visivel { scrollbar-width: thin; scrollbar-color: #C4CBC9 var(--areia); }
.rolagem-visivel::-webkit-scrollbar { height: 11px; width: 11px; }
.rolagem-visivel::-webkit-scrollbar-track { background: var(--areia); border-radius: 6px; }
.rolagem-visivel::-webkit-scrollbar-thumb { background: #C4CBC9; border-radius: 6px; }
.rolagem-visivel::-webkit-scrollbar-thumb:hover { background: #A9B2B0; }

/* Área usada exclusivamente para impressão (visualização/impressão do relatório) */
.area-impressao { display: none; }
@media print {
  body * { visibility: hidden; }
  .area-impressao, .area-impressao * { visibility: visible; }
  .area-impressao {
    display: block !important; position: absolute; top: 0; left: 0; width: 100%; padding: 24px;
  }
  .area-impressao h2 { margin: 0 0 4px; color: #000; }
  .area-impressao .subtitulo-impressao { color: #555; font-size: 12px; margin: 0 0 16px; }
  .area-impressao table { width: 100%; border-collapse: collapse; font-size: 11px; }
  .area-impressao th, .area-impressao td { border: 1px solid #999; padding: 5px 8px; text-align: left; }
  .area-impressao thead th { background: #eee; }
}

@media (max-width: 760px) {
  .barra-lateral { position: fixed; z-index: 40; height: 100%; transform: translateX(-100%); transition: transform .2s; }
  .barra-lateral.aberta { transform: translateX(0); }
  .area-principal { width: 100%; }
  .btn-menu-mobile { display: inline-flex; align-items: center; justify-content: center; }
  .conteudo { padding: 16px 14px; }
  .modal-corpo, .modal-cabecalho, .modal-rodape { padding-left: 18px; padding-right: 18px; }

  /* Topo: com mais de uma fazenda, o seletor não cabia na mesma linha e
     empurrava o cabeçalho para 522px numa tela de 390px. Como isso alarga a
     página inteira, os modais estouravam junto. Agora o seletor desce para
     uma linha própria e o cabeçalho cresce em altura, não em largura. */
  .topo { height: auto; min-height: 64px; flex-wrap: wrap; padding: 8px 14px; row-gap: 8px; }
  .topo-esquerda { flex: 1 1 auto; min-width: 0; }
  .topo h1 { font-size: 16px; }
  .topo .usuario-topo { flex: 0 0 auto; gap: 6px; margin-left: 0; }
  #seletor-fazenda-ativa { order: 10; flex: 1 0 100%; width: 100%; min-width: 0; max-width: none; margin: 0; }
  /* Mesma regra para a casca do seletor com busca (ver comentário no bloco do
     topo): no celular ela ocupa uma linha inteira, abaixo do cabeçalho. */
  .topo > .seletor-busca { order: 10; flex: 1 0 100%; width: 100%; min-width: 0; max-width: none; margin: 0; }
  /* o avatar já identifica quem está logado; o nome só rouba largura aqui */
  #topo-nome-usuario { display: none; }

  /* O Safari do iPhone dá zoom sozinho ao focar campos com fonte menor que
     16px — e não desfaz depois, deixando a tela torta. */
  input, select, textarea { font-size: 16px; }

  /* Alvos de toque: a referência é 44px. Estavam entre 17px e 40px. */
  .btn-primario, .btn-secundario, .btn-perigo, .btn-texto, .aba-btn { min-height: 44px; }
  .btn-sm { min-height: 38px; padding: 8px 12px; }
  .nav-item { min-height: 44px; }
  .modal-fechar { min-width: 44px; min-height: 44px; }
  .btn-menu-mobile { min-width: 44px; min-height: 44px; }
}

/* ====================================================================
   Diálogos do sistema (js/dialogos.js)
   ==================================================================== */
.modal-dialogo { max-width: 460px; }
.dialogo-mensagem {
  white-space: pre-line;      /* preserva as quebras de linha das mensagens */
  font-size: 14px; line-height: 1.55; color: var(--preto); margin: 0;
}
#sobreposicao-dialogo { z-index: 70; }   /* acima dos modais das telas */

/* ====================================================================
   Tabelas viram cartões no celular.
   Rolar 9 colunas de lado é inviável de operar no curral, com o celular
   numa mão. Cada linha vira um cartão e cada célula ganha o rótulo da
   coluna à esquerda — os rótulos são colocados em data-label pelo JS
   (prepararTabelasResponsivas), lendo o <thead>, então isso vale para
   todas as telas sem precisar mexer no HTML de cada uma.
   ==================================================================== */
@media (max-width: 760px) {
  .tabela-cartao { overflow-x: visible; }
  .tabela-cartao table { border: none; }
  /* substituído no bloco de acessibilidade no fim do arquivo: display:none tirava
     o cabeçalho da árvore de acessibilidade junto (achado BX-09) */
  .tabela-cartao table, .tabela-cartao tbody, .tabela-cartao tr, .tabela-cartao td { display: block; width: 100%; }

  .tabela-cartao tbody tr {
    border: 1px solid var(--cinza-borda);
    border-radius: var(--raio);
    margin: 0 0 10px;
    padding: 6px 12px;
    background: var(--branco);
  }
  .tabela-cartao tbody tr:last-child { margin-bottom: 4px; }

  .tabela-cartao tbody td {
    border: none;
    padding: 7px 0;
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 14px;
    text-align: right;
    font-size: 13.5px;
  }
  .tabela-cartao tbody td + td { border-top: 1px solid var(--areia); }

  .tabela-cartao tbody td[data-label]::before {
    content: attr(data-label);
    flex: 0 0 40%;
    text-align: left;
    font-weight: 600;
    font-size: 12.5px;
    color: var(--cinza-texto);
  }

  /* Célula de ações: botões ocupam a linha inteira, lado a lado. */
  .tabela-cartao tbody td.celula-acoes { flex-wrap: wrap; justify-content: flex-start; gap: 8px; }
  .tabela-cartao tbody td.celula-acoes::before { flex-basis: 100%; margin-bottom: 2px; }
  .tabela-cartao tbody td.celula-acoes .btn-sm { flex: 1 1 auto; }

  /* Linha de "nenhum registro": ocupa o cartão inteiro, sem rótulo. */
  .tabela-cartao tbody tr.linha-vazia { border: none; background: none; padding: 0; }
  .tabela-cartao tbody td.celula-vazia { justify-content: center; text-align: center; }
}

/* Rodapé de paginação das listagens (achado PERF-03) */
.rodape-paginacao {
  display: flex; align-items: center; justify-content: space-between; gap: 12px; flex-wrap: wrap;
  padding: 10px 14px; border-top: 1px solid var(--cinza-borda);
  font-size: 13px; color: var(--cinza-texto); background: var(--superficie-fraca);
}
.controles-paginacao { display: flex; align-items: center; gap: 10px; }
.rodape-paginacao button[disabled] { opacity: .45; cursor: not-allowed; }

/* ---------------------------------------------------------------------------
   Acessibilidade (achados UX-02, UX-04, BX-06 da auditoria de 28/07/2026)
   --------------------------------------------------------------------------- */

/* O menu lateral virou <a href="#rota"> para ser navegável por teclado. */
.nav-item { text-decoration: none; }

/* Indicador de foco. O CSS anterior removia o outline nativo e o substituía por
   uma borda dourada: #FFAD00 sobre branco dá 1,87:1 e contra a borda normal
   (#E1E4E3) dá 1,46:1 — abaixo do mínimo de 3:1 do WCAG. Quem navega por
   teclado, num celular sob sol, simplesmente perdia onde estava.
   O verde escuro sobre branco dá 15,49:1. :focus-visible só aparece na
   navegação por teclado, então o clique de mouse continua limpo. */
:focus-visible {
  outline: 2px solid var(--verde-escuro);
  outline-offset: 2px;
  border-radius: 4px;
}
.barra-lateral :focus-visible,
.topo .btn-texto:focus-visible {
  outline: 2px solid var(--dourado);
  outline-offset: -2px;
}
input:focus-visible, select:focus-visible, textarea:focus-visible {
  outline: 2px solid var(--verde-escuro);
  outline-offset: 1px;
}

/* Respeita "Reduzir movimento" do sistema: sem isso, o menu lateral continua
   deslizando a tela toda a cada navegação para quem tem sensibilidade
   vestibular. */
@media (prefers-reduced-motion: reduce) {
  *, *::before, *::after {
    transition-duration: .01ms !important;
    animation-duration: .01ms !important;
    animation-iteration-count: 1 !important;
    scroll-behavior: auto !important;
  }
}

/* Texto visível só para leitor de tela — usado nos <caption> das tabelas. */
.apenas-leitor-tela {
  position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px;
  overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; border: 0;
}

/* No celular o cabeçalho da tabela era removido com display:none, o que também
   o tira da árvore de acessibilidade. Com clip ele some visualmente mas
   continua anunciável (achado BX-09). */
@media (max-width: 760px) {
  .tabela-cartao thead {
    display: block; position: absolute; width: 1px; height: 1px;
    overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap;
  }
  /* Alvos de toque: 44px é o mínimo recomendado. */
  .tabela-cartao .btn-texto { padding-top: 10px; padding-bottom: 10px; }
  .abas { flex-wrap: wrap; }
  .tabela-cartao select { min-width: 0; width: 100%; }
}

/* ====================================================================
   Campo obrigatório em destaque (25/08/2026)
   --------------------------------------------------------------------
   Pedido do usuário: o rótulo em outra cor e o fundo do campo numa cor
   clara, para o preenchimento obrigatório saltar aos olhos antes de o
   usuário tentar salvar.

   Vale por CSS, não por JS: a regra olha o atributo required no momento,
   então os campos que só ficam obrigatórios em certas situações (Peso de
   Saída ao marcar Vendido, Origem da transferência, Resultado do
   diagnóstico) acendem e apagam sozinhos, sem nenhuma tela precisar
   avisar. Os que estão desabilitados ou dentro de um bloco .oculto não
   acendem — são exatamente os que validarCamposModal também ignora.

   Creme, e não vermelho: vermelho lê-se como "campo com erro", e aqui não
   há erro nenhum — o campo só precisa ser preenchido. O tom vem do
   dourado da marca. */
:root {
  /* 19/09/2026: o creme antigo (#FFF8EA) sumia ao lado do branco depois das
     linhas mais suaves do layout novo. Tom mais firme + faixa dourada à
     esquerda, que distingue o campo mesmo para quem enxerga pouca cor. */
  --obrigatorio-fundo: #FFF1CC;
  --obrigatorio-borda: #E2B65C;
  --obrigatorio-faixa: #FFAD00;
}

.campo:has(> input[required]:not(:disabled)) > label,
.campo:has(> select[required]:not(:disabled)) > label,
.campo:has(> textarea[required]:not(:disabled)) > label {
  color: var(--dourado-texto);
}

input[required]:not(:disabled),
select[required]:not(:disabled),
textarea[required]:not(:disabled) {
  background-color: var(--obrigatorio-fundo);
  border-color: var(--obrigatorio-borda);
}

/* Select enfeitado pelo seletor com busca: quem aparece na tela é a casca,
   o <select> nativo está escondido com .sb-nativo-oculto. */
.campo:has(> select[required]:not(:disabled)) > .seletor-busca > .sb-gatilho {
  background-color: var(--obrigatorio-fundo);
  border-color: var(--obrigatorio-borda);
}

/* O foco continua mandando na borda — senão o campo obrigatório perderia a
   marca dourada de "estou aqui" que todos os outros têm. */
input[required]:focus,
select[required]:focus,
textarea[required]:focus,
.campo:has(> select[required]) > .seletor-busca > .sb-gatilho:focus-visible,
.campo:has(> select[required]) > .seletor-busca.sb-aberto > .sb-gatilho {
  border-color: var(--dourado);
  box-shadow: 0 0 0 3px rgba(255,173,0,.18);
}

/* Reforço de 19/09/2026 — cobre também os campos que não são filhos diretos
   do .campo: select com o "+" do cadastro rápido (.cr-linha), valor com
   máscara de moeda (.mn-moeda), a casca do seletor com busca em qualquer
   lugar e os multiseletores de formulário marcados como obrigatórios. */
.campo:has(:is(input, select, textarea)[required]:not(:disabled):not([type="checkbox"]):not([type="radio"])) > label,
.campo:has(> .multiseletor.ms-obrigatorio) > label {
  color: var(--dourado-texto);
}
input[required]:not(:disabled):not([type="checkbox"]):not([type="radio"]),
select[required]:not(:disabled),
textarea[required]:not(:disabled),
select[required]:not(:disabled) + .seletor-busca > .sb-gatilho,
.multiseletor.ms-obrigatorio:not(.ms-desabilitado) .ms-gatilho {
  background-color: var(--obrigatorio-fundo);
  border-color: var(--obrigatorio-borda);
  box-shadow: inset 3px 0 0 var(--obrigatorio-faixa);
}
input[required]:not([type="checkbox"]):not([type="radio"]):focus,
select[required]:focus,
textarea[required]:focus,
select[required] + .seletor-busca > .sb-gatilho:focus-visible,
select[required] + .seletor-busca.sb-aberto > .sb-gatilho {
  border-color: var(--dourado);
  box-shadow: inset 3px 0 0 var(--obrigatorio-faixa), 0 0 0 3px rgba(255,173,0,.18);
}
.multiseletor.ms-obrigatorio.ms-invalido .ms-gatilho { border-color: var(--vermelho); }

/* Campo obrigatório que ficou em branco na hora de salvar: aí sim é erro. */
.campo:has(> select[required]) > .seletor-busca.sb-invalido > .sb-gatilho,
select[required] + .seletor-busca.sb-invalido > .sb-gatilho {
  border-color: var(--vermelho);
  box-shadow: 0 0 0 3px rgba(192,57,43,.14);
}

/* ====================================================================
   Vacinação em Lote — folha de curral
   ==================================================================== */

/* A janela de escolha dos animais mostra uma árvore com tabela dentro:
   com a largura padrão do modal (640px) sobrariam duas colunas visíveis. */
.modal-lote-selecao { max-width: min(1040px, 94vw); }
.modal-lote-selecao .modal-corpo { max-height: 68vh; }
.modal-lote-selecao .no-vacina-corpo { max-height: none; }
.chk-lote-todos { display: flex; align-items: center; flex: none; margin: 0; }
.chk-lote-todos input { width: 17px; height: 17px; }

/* Rótulo de coluna que ordena. A seta só aparece na coluna em uso — um
   indicador em todas as colunas vira ruído e nenhuma delas se destaca. */
.th-ordenavel { cursor: pointer; user-select: none; white-space: nowrap; }
.th-ordenavel:hover { color: var(--dourado-texto); }
.th-ordenavel::after { content: ''; }
.th-ordenavel.ord-asc::after  { content: ' ▲'; font-size: 9px; }
.th-ordenavel.ord-desc::after { content: ' ▼'; font-size: 9px; }

/* Animal que provavelmente ficou de fora da aplicação anterior. Fundo
   claro e uma barra à esquerda: em tabela grande, colorir o texto inteiro
   de vermelho atrapalha a leitura em vez de chamar atenção. */
.linha-alerta-aplic > td { background: var(--tinta-vermelha); }
.linha-alerta-aplic > td:first-child { box-shadow: inset 3px 0 0 var(--vermelho); }

/* No celular a tabela vira cartão (ver .tabela-cartao): a barra à esquerda
   sai do lugar, então o cartão inteiro ganha a borda. */
@media (max-width: 760px) {
  .linha-alerta-aplic { border-left: 3px solid var(--vermelho); }
  .linha-alerta-aplic > td:first-child { box-shadow: none; }
  .modal-lote-selecao .modal-corpo { max-height: 62vh; }
}

/* Nó da árvore de seleção: o checkbox de "todos" fica fora do botão que abre
   e fecha o lote — marcar o lote inteiro e olhar a lista são duas intenções
   diferentes, e um checkbox dentro de <button> não é clicável de forma
   confiável. */
.no-vacina-linha { display: flex; align-items: center; gap: 4px; padding-left: 16px; }
.no-vacina-linha .no-vacina-cabecalho { width: auto; flex: 1; min-width: 0; padding-left: 6px; cursor: pointer; }

/* Abas de primeiro nível (tela Medicação). Classes próprias porque as telas
   de dentro têm abas com .aba-btn e caçam os botões delas no documento
   inteiro — misturar as duas camadas fazia um clique mexer na outra
   (achado da auditoria de 25/08/2026). O visual é o mesmo, a regra é
   separada de propósito. */
.abas-topo { margin-bottom: 18px; }
.aba-topo-btn {
  background: none; border: none; padding: 10px 4px; margin-right: 18px;
  font-family: var(--fonte);
  font-size: 13.5px; font-weight: 600; color: var(--cinza-texto);
  border-bottom: 2.5px solid transparent; border-radius: 0; cursor: pointer;
}
.aba-topo-btn.ativa { color: var(--verde-escuro); border-bottom-color: var(--dourado); }
.painel-topo { display: none; }
.painel-topo.ativa { display: block; }

/* ====================================================================
   Menu lateral agrupado (sanfona)
   ==================================================================== */
.nav-grupo { display: flex; flex-direction: column; }
.nav-grupo-titulo {
  display: flex; align-items: center; gap: 11px; width: 100%;
  padding: 11px 14px; margin: 6px 0 0; border-radius: 9px; border: none; background: transparent;
  /* "Manejo", não "MANEJO": caixa alta em nome de grupo lê-se como grito e
     custa legibilidade num menu que já é curto. O negrito é o que separa o
     grupo dos seus itens. */
  font-family: var(--fonte-menu); font-size: 14px; font-weight: 700; letter-spacing: 0;
  color: rgba(247,247,247,.82); text-align: left;
  cursor: pointer; transition: background .12s ease, color .12s ease;
}
.nav-grupo-titulo:hover { background: rgba(247,247,247,.08); color: #fff; }
.nav-grupo-titulo .ico { width: 18px; text-align: center; font-size: 14px; flex-shrink: 0; }
.nav-grupo-rotulo { flex: 1; min-width: 0; }
/* Triângulo desenhado com bordas: não depende de qual fonte a máquina tem. */
.nav-grupo-seta {
  width: 0; height: 0; flex: none;
  border-left: 5px solid currentColor;
  border-top: 4px solid transparent; border-bottom: 4px solid transparent;
  transition: transform .18s ease;
}
.nav-grupo.aberto > .nav-grupo-titulo { color: #fff; background: rgba(247,247,247,.06); }
.nav-grupo.aberto > .nav-grupo-titulo .nav-grupo-seta { transform: rotate(90deg); }

/* Grupo fechado que contém a tela aberta: um ponto dourado no título. Sem ele
   o usuário perderia a única pista de onde está — o item ativo fica escondido. */
.nav-grupo-marca {
  flex: none; width: 7px; height: 7px; border-radius: 50%; background: var(--dourado);
}

/* Os itens do grupo recuam e ganham uma linha-guia à esquerda: é o que faz a
   hierarquia ser lida de relance, mesmo com dois grupos abertos. */
.nav-grupo-itens {
  display: flex; flex-direction: column; gap: 2px;
  margin: 4px 0 2px 12px; padding-left: 10px;
  border-left: 1px solid rgba(247,247,247,.16);
  animation: navGrupoAbre .18s ease;
}
/* Esta linha NÃO é detalhe: o menu recolhe os subitens com o atributo `hidden`,
   e qualquer `display` declarado aqui vence a regra do navegador que esconde
   elementos com hidden. Sem ela o grupo "abre" e "fecha" no estado, mas os
   subitens ficam à mostra o tempo todo — que foi exatamente o que aconteceu
   quando o menu adotou o estilo do Portal (07/09/2026). Mesma armadilha de
   .filtros[hidden], mais abaixo. */
.nav-grupo-itens[hidden] { display: none; }
@keyframes navGrupoAbre { from { opacity: 0; transform: translateY(-4px); } to { opacity: 1; transform: none; } }
@media (prefers-reduced-motion: reduce) {
  .nav-grupo-itens { animation: none; }
  .nav-grupo-seta, .btn-filtros-seta { transition: none; }
}

@media (max-width: 760px) {
  .nav-grupo-titulo { min-height: 44px; }
  .nav-grupo-itens .nav-item { min-height: 44px; }
}

/* ====================================================================
   Mostrar / ocultar o menu lateral (computador)
   --------------------------------------------------------------------
   No celular a barra já é deslizante e some sozinha; a regra abaixo vale só
   da largura de tablet para cima, senão o menu do celular ficaria com
   display:none e o ☰ deixaria de funcionar.
   ==================================================================== */
@media (min-width: 761px) {
  .app-shell.menu-oculto .barra-lateral { display: none; }
}

/* ====================================================================
   Área de filtros recolhível
   ==================================================================== */
.filtros[hidden] { display: none; }
.btn-filtros {
  display: inline-flex; align-items: center; gap: 8px;
  padding: 9px 14px; border-radius: 8px;
  background: var(--branco); color: var(--verde-escuro);
  border: 1.5px solid var(--cinza-borda);
  font-size: 13px; font-weight: 600; align-self: flex-start;
}
.btn-filtros:hover { border-color: var(--dourado); }
.btn-filtros .ico { font-size: 13px; }
.btn-filtros-seta { font-size: 10px; transition: transform .15s ease; }
.btn-filtros.recolhido .btn-filtros-seta { transform: rotate(-90deg); }
/* Filtro escondido que continua filtrando seria uma armadilha: o selo diz
   quantos estão valendo mesmo com a área fechada. */
.btn-filtros-selo { background: var(--dourado); color: var(--verde-escuro); }
.btn-filtros-selo.oculto { display: none; }

/* ====================================================================
   Modos de cores
   --------------------------------------------------------------------
   Cada modo só troca os tokens do :root — nenhuma tela conhece o tema. As
   poucas regras nomeadas abaixo existem porque duas variáveis da marca são
   usadas nos dois papéis: --verde-escuro é cor de TEXTO em quase todo lugar,
   mas é FUNDO no menu e no balão de ajuda; e --branco é fundo de cartão em
   quase todo lugar, mas é cor de texto dentro do menu. Trocar o token sem
   tratar esses casos deixaria texto escuro sobre fundo escuro.
   O modo padrão (verde MIV) é o :root lá do começo do arquivo.
   ==================================================================== */

/* ---------- Escuro (mesmos tons do Portal SynConsult) ---------- */
[data-tema="escuro"] {
  --areia: #071F1B;
  --branco: #0C2E28;
  --preto: #EDECE6;
  --cinza-borda: rgba(237,236,230,.16);
  --cinza-texto: rgba(237,236,230,.68);
  /* verde como TEXTO precisa clarear para continuar legível */
  --verde-escuro: #9FD3B8;
  --verde-escuro-2: #B7E2CA;
  --dourado: #FFAD00;
  --dourado-hover: #e0980a;
  /* no escuro o ouro cheio já rende contraste de sobra: não precisa escurecer */
  --dourado-texto: #FFC44D;
  --vermelho: #E57366;
  --verde-ok: #6FB894;
  --amarelo-alerta: #FFC44D;
  --sombra: 0 4px 20px rgba(0,0,0,.38);
  --sombra-lg: 0 12px 40px rgba(0,0,0,.55);
  --obrigatorio-fundo: rgba(255,173,0,.16);
  --obrigatorio-borda: rgba(255,173,0,.55);
  --obrigatorio-faixa: #FFAD00;
  /* Realces do escuro: clarear a superfície, nunca pintar de branco. */
  --realce-linha:     rgba(237,236,230,.07);
  --realce-selecao:   rgba(255,173,0,.20);
  --tinta-verde:      rgba(159,211,184,.12);
  --tinta-verde-2:    rgba(159,211,184,.18);
  --tinta-vermelha:   rgba(229,115,102,.18);
  --tinta-amarela:    rgba(255,196,77,.16);
  --tinta-dourada:    rgba(255,173,0,.14);
  --superficie-fraca: rgba(237,236,230,.04);
  color-scheme: dark;
}
[data-tema="escuro"] .barra-lateral { background: #0A2924; color: #EDECE6; border-right: 1px solid var(--cinza-borda); }
[data-tema="escuro"] .popover-ajuda { background: #123A33; color: #EDECE6; }
[data-tema="escuro"] .aviso-vacina { background: rgba(159,211,184,.10); }
[data-tema="escuro"] .no-lote-cabecalho { background: rgba(237,236,230,.05); }
[data-tema="escuro"] .no-lote-cabecalho:hover { background: rgba(237,236,230,.09); }
[data-tema="escuro"] .historico-animal { background: rgba(237,236,230,.05); }
/* Texto sobre o dourado continua escuro: inverter deixaria o botão ilegível. */
[data-tema="escuro"] .btn-primario,
[data-tema="escuro"] .nav-item.ativo,
[data-tema="escuro"] .btn-filtros-selo { color: #0A2924; }
[data-tema="escuro"] .tela-auth { background: var(--areia); }

/* ---------- Claro neutro ---------- */
[data-tema="claro"] {
  --verde-escuro: #2F3A38;
  --verde-escuro-2: #3B4948;
  --dourado: #E4B44C;
  --dourado-hover: #d3a238;
  --dourado-texto: #7A5A12;
  --areia: #FAFAFA;
  --branco: #FFFFFF;
  --preto: #1F2422;
  --cinza-borda: #E5E7E7;
  --cinza-texto: #5F6866;
  --sombra: 0 2px 10px rgba(31,36,34,.07);
  --sombra-lg: 0 8px 30px rgba(31,36,34,.14);
  --realce-linha:   #F4F5F5;
  --realce-selecao: #FBEFD2;
  --tinta-verde:    #EFF1F1;
  --tinta-verde-2:  #E7EAEA;
  --tinta-dourada:  #FBF3E2;
}

/* ---------- Alto contraste ----------
   Para tela batida de sol, no escritório da fazenda ou no celular no curral:
   preto sobre branco, borda em tudo, sombra nenhuma (sombra clara vira
   borrão e não ajuda a separar as caixas). */
[data-tema="contraste"] {
  --verde-escuro: #00201A;
  --verde-escuro-2: #002C24;
  --dourado: #FFC400;
  --dourado-hover: #E6B000;
  --dourado-texto: #5C4200;
  --areia: #FFFFFF;
  --branco: #FFFFFF;
  --preto: #000000;
  --cinza-borda: #000000;
  --cinza-texto: #000000;
  --vermelho: #A5001C;
  --verde-ok: #005A20;
  --amarelo-alerta: #6B4E00;
  --sombra: none;
  --sombra-lg: 0 0 0 2px #000000;
  --obrigatorio-fundo: #FFF0B3;
  --obrigatorio-borda: #000000;
  --obrigatorio-faixa: #000000;
  --realce-linha:     #EAEAEA;
  --realce-selecao:   #FFF0B3;
  --tinta-verde:      #E6E6E6;
  --tinta-verde-2:    #DDDDDD;
  --tinta-vermelha:   #FFE3E0;
  --tinta-amarela:    #FFF3C4;
  --tinta-dourada:    #FFF3C4;
  --superficie-fraca: #F4F4F4;
}
[data-tema="contraste"] .painel,
[data-tema="contraste"] .cartao-kpi,
[data-tema="contraste"] .tabela-cartao,
[data-tema="contraste"] .modal,
[data-tema="contraste"] .no-vacina { border: 2px solid #000; }
[data-tema="contraste"] .selo { border: 1px solid #000; }
[data-tema="contraste"] .nav-item:hover { background: rgba(247,247,247,.22); }

/* ---------- Cadastro rápido (botão "+" ao lado do campo) ----------
   Campos que vêm de outro cadastro (Piquete, Lote, Origem, Medicamento,
   Protocolo, Animal…) ganham um "+" que abre o cadastro de origem por cima do
   formulário. Ver js/cadastrorapido.js. */
.cr-linha { display: flex; align-items: stretch; gap: 6px; }
.cr-linha > .seletor-busca, .cr-linha > select { flex: 1 1 auto; min-width: 0; }
.btn-cad-rapido {
  flex: none; width: 40px; min-height: 40px; padding: 0;
  display: inline-flex; align-items: center; justify-content: center;
  border: 1px solid var(--cinza-borda); border-radius: 8px;
  background: var(--branco); color: var(--verde-escuro);
  font-size: 20px; font-weight: 700; line-height: 1; cursor: pointer;
}
.btn-cad-rapido:hover:not(:disabled) { border-color: var(--verde-escuro); background: var(--areia); }
.btn-cad-rapido:focus-visible { outline: 2px solid var(--dourado); outline-offset: 2px; }
.btn-cad-rapido:disabled { opacity: .45; cursor: not-allowed; }
.btn-cad-rapido.cr-ocupado span { animation: cr-girar .8s linear infinite; display: inline-block; }
@keyframes cr-girar { to { transform: rotate(360deg); } }
@media (max-width: 760px) { .btn-cad-rapido { width: 44px; min-height: 44px; } }

/* Tela emprestada só para usar a janela de cadastro: nada dela aparece nem
   recebe clique, a não ser a própria janela. */
.cr-host { position: fixed; inset: 0; visibility: hidden; pointer-events: none; overflow: hidden; }
.cr-host .sobreposicao { visibility: visible; pointer-events: auto; }

/* ---------- Campos de valor com máscara (js/mascaranumero.js) ---------- */
.campo-numero { font-variant-numeric: tabular-nums; }
.mn-moeda { position: relative; display: block; }
.mn-moeda > .mn-prefixo {
  position: absolute; left: 12px; top: 50%; transform: translateY(-50%);
  color: var(--cinza-texto); font-size: 14px; font-weight: 600; pointer-events: none;
}
.mn-moeda > input { padding-left: 40px; width: 100%; }

/* Protocolos de Medicação — modal largo, com as duas guias de detalhe. */
.modal-protocolo-med { max-width: min(1080px, 95vw); }
.modal-protocolo-med .modal-corpo { max-height: 70vh; }
.modal-protocolo-med .cr-linha .multiseletor { flex: 1; }

/* Medicação — folha de curral: linha já lançada. */
.pm-grade tr.linha-feita td { background: var(--tinta-verde); }

/* ====================================================================
   LAYOUT 2026-09 — menu superior recolhido, linhas suaves e densidade
   --------------------------------------------------------------------
   Aprovado em 19/09/2026 (protótipo "Modelo B2"). Três camadas, todas por
   atributo no <html> aplicado por js/interface.js antes da primeira pintura:

   • data-menu="superior" | "lateral"  — só do tablet para cima. No celular o
     menu continua sendo o deslizante de sempre, em qualquer opção.
   • data-densidade="compacta" | "confortavel" — também só do tablet para
     cima: no celular valem os 44px de toque e a fonte de 16px (zoom do iOS).
   • Linhas suaves — vale sempre: bordas de 1px e sombras mais leves.

   As regras de densidade usam :where() no seletor do <html> para NÃO ganhar
   especificidade: elas substituem só as regras-base (input, button, .btn-sm…)
   e continuam perdendo para os ajustes finos de cada componente, como já
   perdiam antes. Sem isso um "html[...] button" passaria por cima do padding
   das abas, do menu, das opções do seletor com busca etc.
   ==================================================================== */

/* ---------- Linhas suaves (todas as larguras, todas as densidades) ---------- */
:root { --raio: 8px; --fundo-barra: #0A2924; }
html:not([data-tema]) {
  --sombra: 0 1px 3px rgba(10, 41, 36, 0.06);
  --cinza-borda: #E3E7E5;
}
[data-tema="claro"] { --sombra: 0 1px 3px rgba(31, 36, 34, 0.06); --fundo-barra: #2F3A38; }
[data-tema="contraste"] { --fundo-barra: #00201A; }
input, select, textarea { border-width: 1px; }
.sb-gatilho { border-width: 1px; }
.btn-secundario, .btn-perigo, .btn-filtros { border-width: 1px; }
thead th { color: var(--cinza-texto); font-weight: 600; }
.menu-tema-sep { margin-top: 12px; padding-top: 10px; border-top: 1px solid var(--cinza-borda); }
.menu-tema-nota { margin: 8px 8px 4px; font-size: 11px; line-height: 1.45; color: var(--cinza-texto); max-width: 230px; }

/* ---------- Densidade compacta (computador) ---------- */
@media (min-width: 761px) {
  :where(html[data-densidade="compacta"]) input,
  :where(html[data-densidade="compacta"]) select,
  :where(html[data-densidade="compacta"]) textarea { padding: 6px 10px; font-size: 13px; border-radius: 6px; }
  :where(html[data-densidade="compacta"]) label { font-size: 11.5px; margin-bottom: 4px; }
  :where(html[data-densidade="compacta"]) .campo { margin-bottom: 12px; }
  :where(html[data-densidade="compacta"]) .linha-campos { gap: 12px; }
  :where(html[data-densidade="compacta"]) button { padding: 7px 14px; font-size: 13px; border-radius: 6px; }
  :where(html[data-densidade="compacta"]) .btn-sm { padding: 4px 10px; font-size: 12.5px; }
  :where(html[data-densidade="compacta"]) .btn-texto { padding: 4px 8px; }
  :where(html[data-densidade="compacta"]) .sb-gatilho { min-height: 32px; padding: 5px 10px; font-size: 13px; border-radius: 6px; }
  :where(html[data-densidade="compacta"]) .ms-gatilho { min-height: 32px; padding: 5px 10px; font-size: 13px; border-radius: 6px; }
  :where(html[data-densidade="compacta"]) .btn-filtros { padding: 6px 12px; font-size: 12.5px; border-radius: 6px; }
  :where(html[data-densidade="compacta"]) thead th { padding: 8px 12px; font-size: 11px; }
  :where(html[data-densidade="compacta"]) tbody td { padding: 7px 12px; }
  :where(html[data-densidade="compacta"]) .conteudo { padding: 16px 20px; }
  :where(html[data-densidade="compacta"]) .painel { padding: 16px 18px; }
  :where(html[data-densidade="compacta"]) .barra-ferramentas { margin-bottom: 12px; gap: 10px; }
  :where(html[data-densidade="compacta"]) .filtros { gap: 8px; }
  :where(html[data-densidade="compacta"]) .grade-kpi { gap: 12px; margin-bottom: 16px; }
  :where(html[data-densidade="compacta"]) .cartao-kpi { padding: 14px 16px; }
  :where(html[data-densidade="compacta"]) .cartao-kpi .valor-kpi { font-size: 24px; }
  :where(html[data-densidade="compacta"]) .abas { margin-bottom: 14px; }
  :where(html[data-densidade="compacta"]) .aba-btn { padding: 8px 2px; font-size: 13px; }
  :where(html[data-densidade="compacta"]) .modal-cabecalho { padding: 14px 20px; }
  :where(html[data-densidade="compacta"]) .modal-corpo { padding: 16px 20px; }
  :where(html[data-densidade="compacta"]) .modal-rodape { padding: 12px 20px; }
  /* As abas do modal sangram exatamente o padding lateral do corpo. */
  :where(html[data-densidade="compacta"]) .modal-corpo .abas { margin-left: -20px; margin-right: -20px; padding: 8px 20px 0; box-shadow: 0 -18px 0 var(--branco); }
}

/* ---------- Menu superior recolhido (computador) ---------- */
@media (min-width: 761px) {
  html[data-menu="superior"] .barra-lateral { display: none; }

  html[data-menu="superior"] .topo {
    height: 48px; padding: 0 16px 0 10px; gap: 12px;
    background: var(--fundo-barra); border-bottom: none; color: #fff;
  }
  html[data-menu="superior"] .topo-esquerda { flex: 1 1 auto; gap: 12px; height: 48px; }
  /* O título da tela continua no documento (leitor de tela, título da aba),
     mas a barra já mostra a tela ativa sublinhada — repetir seria ruído. */
  html[data-menu="superior"] #titulo-pagina {
    position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px;
    overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; border: 0;
  }
  html[data-menu="superior"] .btn-menu-mobile {
    height: 32px; padding: 0 12px 0 10px; gap: 8px; flex: none;
    border: 1px solid rgba(255,255,255,.18); border-radius: 6px;
    background: rgba(255,255,255,.06); color: #fff; font-size: 16px;
  }
  html[data-menu="superior"] .btn-menu-mobile::after {
    content: 'Menu'; font-family: var(--fonte); font-size: 13px; font-weight: 600;
  }
  html[data-menu="superior"] .btn-menu-mobile:hover { background: rgba(255,255,255,.12); }
  html[data-menu="superior"] .btn-menu-mobile[aria-expanded="true"] {
    background: var(--dourado); border-color: var(--dourado); color: #0A2924;
  }

  /* grupo fixado + telas do grupo */
  html[data-menu="superior"] .barra-grupo {
    display: flex; align-items: stretch; height: 48px; min-width: 0; flex: 1 1 auto;
    padding-left: 10px; border-left: 1px solid rgba(255,255,255,.14);
  }
  .bg-grupo {
    display: flex; align-items: center; gap: 7px; flex: none;
    margin: 8px 4px 8px 0; padding: 0 10px; border-radius: 6px;
    background: none; color: var(--dourado);
    font-family: var(--fonte-menu); font-size: 11px; font-weight: 700;
    letter-spacing: .08em; text-transform: uppercase; white-space: nowrap;
  }
  .bg-grupo:hover { background: rgba(255,255,255,.08); }
  .bg-grupo .ico { font-size: 13px; letter-spacing: 0; }
  .bg-grupo-seta {
    width: 0; height: 0; margin-left: 2px;
    border-left: 4px solid transparent; border-right: 4px solid transparent; border-top: 5px solid currentColor;
  }
  .bg-itens { display: flex; align-items: stretch; min-width: 0; overflow-x: auto; scrollbar-width: none; }
  .bg-itens::-webkit-scrollbar { display: none; }
  /* Quando as telas do grupo não cabem, a barra rola de lado; o esmaecido na
     borda avisa que há mais, em vez de um nome cortado no meio parecer defeito. */
  .bg-itens.mais-a-direita { -webkit-mask-image: linear-gradient(to right, #000 calc(100% - 36px), transparent); mask-image: linear-gradient(to right, #000 calc(100% - 36px), transparent); }
  .bg-itens.mais-a-esquerda { -webkit-mask-image: linear-gradient(to left, #000 calc(100% - 36px), transparent); mask-image: linear-gradient(to left, #000 calc(100% - 36px), transparent); }
  .bg-itens.mais-a-direita.mais-a-esquerda { -webkit-mask-image: linear-gradient(to right, transparent, #000 36px, #000 calc(100% - 36px), transparent); mask-image: linear-gradient(to right, transparent, #000 36px, #000 calc(100% - 36px), transparent); }
  .bg-item {
    display: flex; align-items: center; padding: 0 12px; white-space: nowrap;
    font-family: var(--fonte-menu); font-size: 13px; font-weight: 500;
    color: rgba(255,255,255,.74); text-decoration: none;
    border-top: 2px solid transparent; border-bottom: 2px solid transparent;
  }
  .bg-item:hover { color: #fff; background: rgba(255,255,255,.05); }
  .bg-item.ativo { color: #fff; font-weight: 600; border-bottom-color: var(--dourado); }
  html[data-menu="superior"] .bg-item:focus-visible,
  html[data-menu="superior"] .bg-grupo:focus-visible,
  html[data-menu="superior"] .btn-menu-mobile:focus-visible { outline: 2px solid var(--dourado); outline-offset: -2px; }

  /* lado direito da barra: fazenda, preferências, sino, usuário */
  html[data-menu="superior"] .topo > .seletor-busca { flex: 0 1 200px; min-width: 120px; margin-right: 2px; }
  html[data-menu="superior"] .topo > .seletor-busca .sb-gatilho,
  html[data-menu="superior"] #seletor-fazenda-ativa {
    min-height: 32px; padding: 5px 10px; font-size: 13px; border-radius: 6px;
    background: rgba(255,255,255,.07); border: 1px solid rgba(255,255,255,.18); color: #fff;
  }
  /* A lista que abre é do sistema (fundo branco): sem isto as opções
     herdavam o texto branco da barra e só apareciam sob o mouse. */
  html[data-menu="superior"] #seletor-fazenda-ativa option,
  html[data-menu="superior"] #seletor-fazenda-ativa optgroup {
    background-color: var(--branco); color: var(--verde-escuro);
  }
  html[data-menu="superior"] .topo > .seletor-busca .sb-painel { color: var(--verde-escuro); }
  html[data-menu="superior"] .topo > .seletor-busca .sb-seta,
  html[data-menu="superior"] .topo > .seletor-busca .sb-rotulo.sb-placeholder { color: rgba(255,255,255,.7); }
  html[data-menu="superior"] .topo .usuario-topo { gap: 6px; color: rgba(255,255,255,.75); }
  html[data-menu="superior"] #topo-nome-usuario { display: none; }
  html[data-menu="superior"] .avatar-inicial { width: 30px; height: 30px; font-size: 12px; }
  html[data-menu="superior"] .topo .btn-texto { color: rgba(255,255,255,.8); padding: 5px 7px; font-size: 12px; white-space: nowrap; }
  html[data-menu="superior"] .topo .btn-texto:hover,
  html[data-menu="superior"] .btn-tema:hover,
  html[data-menu="superior"] .sino-notificacao:hover { background: rgba(255,255,255,.1); color: #fff; }
  html[data-menu="superior"] .btn-tema, html[data-menu="superior"] .sino-notificacao { border-radius: 6px; }
  html[data-menu="superior"] .topo .btn-texto:focus-visible,
  html[data-menu="superior"] .btn-tema:focus-visible,
  html[data-menu="superior"] .sino-notificacao:focus-visible { outline: 2px solid var(--dourado); outline-offset: -2px; }

  /* A barra ficou com 48px: as abas congeladas das telas param logo abaixo. */
  html[data-menu="superior"] .conteudo .abas,
  html[data-menu="superior"] .conteudo .abas-topo { top: 48px; }
  /* …mas não as abas de dentro de um modal (que também mora em .conteudo):
     lá quem rola é o corpo do modal, e a barra gruda no topo DELE. */
  html[data-menu="superior"] .modal-corpo .abas { top: 0; }

  /* ---------- painel que desce ---------- */
  .veu-menu {
    position: fixed; inset: 48px 0 0 0; z-index: 44;
    background: rgba(10,41,36,.34); opacity: 0; pointer-events: none; transition: opacity .16s;
  }
  .veu-menu.aberto { opacity: 1; pointer-events: auto; }
  .painel-menu {
    position: fixed; top: 48px; left: 0; right: 0; z-index: 45;
    display: flex; max-height: calc(100vh - 72px); overflow: auto;
    background: var(--branco); color: var(--preto);
    border-bottom: 1px solid var(--cinza-borda); box-shadow: 0 18px 40px rgba(10,41,36,.18);
    animation: painelMenuDesce .18s ease-out;
  }
  .painel-menu[hidden] { display: none; }
  @keyframes painelMenuDesce { from { opacity: 0; transform: translateY(-10px); } to { opacity: 1; transform: none; } }

  .mnp-lado {
    width: 260px; flex: none; padding: 18px 18px 16px; background: var(--areia);
    border-right: 1px solid var(--cinza-borda); display: flex; flex-direction: column; gap: 2px;
  }
  .mnp-busca { margin-bottom: 12px; }
  .mnp-titulo-lado {
    margin: 4px 0 4px; font-size: 10px; font-weight: 700; letter-spacing: .08em;
    text-transform: uppercase; color: var(--cinza-texto);
  }
  .mnp-recente {
    display: block; padding: 7px 10px; border-radius: 6px;
    font-size: 13px; font-weight: 500; color: var(--preto); text-decoration: none;
  }
  .mnp-recente:hover { background: var(--branco); }
  .mnp-recente.ativo { font-weight: 700; color: var(--verde-escuro); }
  .mnp-dica { margin: auto 0 0; padding-top: 16px; font-size: 11px; line-height: 1.7; color: var(--cinza-texto); }
  .mnp-dica b { color: var(--preto); font-weight: 600; }

  .mnp-grade {
    flex: 1; min-width: 0; padding: 18px 24px 22px;
    display: grid; grid-template-columns: repeat(auto-fill, minmax(210px, 1fr)); gap: 18px 24px; align-content: start;
  }
  .mnp-grupo { display: flex; flex-direction: column; gap: 1px; min-width: 0; }
  .mnp-grupo[hidden] { display: none; }
  .mnp-grupo-titulo {
    display: flex; align-items: center; gap: 8px; width: 100%; text-align: left;
    margin-bottom: 4px; padding: 6px 8px 8px; border-radius: 6px 6px 0 0;
    background: none; border-bottom: 1px solid var(--cinza-borda);
    font-family: var(--fonte-menu); font-size: 11px; font-weight: 700;
    letter-spacing: .08em; text-transform: uppercase; color: var(--verde-escuro);
  }
  .mnp-grupo-titulo:hover { background: var(--areia); }
  .mnp-grupo-titulo .ico { font-size: 14px; letter-spacing: 0; }
  .mnp-grupo-rotulo { flex: 1; min-width: 0; }
  .mnp-grupo-fixar {
    font-size: 10px; font-weight: 600; letter-spacing: 0; text-transform: none;
    color: var(--dourado-texto); opacity: 0; transition: opacity .12s;
  }
  .mnp-grupo-titulo:hover .mnp-grupo-fixar, .mnp-grupo-titulo:focus-visible .mnp-grupo-fixar { opacity: 1; }
  .mnp-grupo-titulo.fixado { border-bottom: 2px solid var(--dourado); }
  .mnp-grupo-titulo.fixado .mnp-grupo-fixar { opacity: 1; color: var(--cinza-texto); }
  .mnp-item {
    display: block; padding: 7px 8px; border-radius: 6px;
    font-family: var(--fonte-menu); font-size: 13px; font-weight: 500;
    color: var(--preto); text-decoration: none;
  }
  .mnp-item[hidden] { display: none; }
  .mnp-item:hover { background: var(--areia); }
  .mnp-item.ativo { background: var(--realce-selecao); color: var(--verde-escuro); font-weight: 700; }
  .mnp-vazio { grid-column: 1 / -1; color: var(--cinza-texto); margin: 12px 0; }
  .mnp-vazio[hidden] { display: none; }
  [data-tema="contraste"] .painel-menu { border-bottom: 2px solid #000; }
  [data-tema="escuro"] .mnp-item.ativo { color: #EDECE6; }
}

/* A barra do grupo e o painel não existem no celular nem no modo lateral. */
@media (max-width: 760px) {
  .barra-grupo, .painel-menu, .veu-menu { display: none !important; }
}
html[data-menu="lateral"] .barra-grupo,
html[data-menu="lateral"] .painel-menu,
html[data-menu="lateral"] .veu-menu { display: none !important; }

/* ====================================================================
   TELAS 2026-09 — Animais: resumo à direita e cadastro em página inteira
   --------------------------------------------------------------------
   --topo-altura: onde as coisas "grudadas" param ao rolar a página. 64px no
   topo antigo (menu lateral), 48px na barra do menu superior.
   ==================================================================== */
:root { --topo-altura: 64px; }
@media (min-width: 761px) { html[data-menu="superior"] { --topo-altura: 48px; } }

/* ---------- Resumo do animal (só em tela larga) ---------- */
.an-detalhe { display: none; }
@media (min-width: 1100px) {
  .an-mestre-detalhe {
    display: grid; grid-template-columns: minmax(0, 1fr) 340px; gap: 14px; align-items: start;
  }
  .an-mestre-detalhe > .tabela-cartao { min-width: 0; }
  .an-detalhe {
    display: block; position: sticky; top: calc(var(--topo-altura) + 12px);
    max-height: calc(100vh - var(--topo-altura) - 24px); overflow-y: auto;
    background: var(--branco); border: 1px solid var(--cinza-borda); border-radius: var(--raio);
    box-shadow: var(--sombra); font-size: 13px;
    transition: opacity .12s;
  }
  .an-detalhe.and-atualizando { opacity: .55; }
  .and-vazio { padding: 28px 22px; color: var(--cinza-texto); line-height: 1.55; }
  .and-vazio b { color: var(--verde-escuro); }
  .and-cab { padding: 16px 18px 14px; border-bottom: 1px solid var(--cinza-borda); }
  .and-selos { display: flex; gap: 6px; flex-wrap: wrap; }
  .and-titulo { margin: 8px 0 0; font-size: 20px; letter-spacing: -.01em; overflow-wrap: anywhere; }
  .and-nome { margin: 0; font-weight: 600; color: var(--verde-escuro); }
  .and-sub { margin: 2px 0 0; color: var(--cinza-texto); font-size: 12.5px; }
  .and-acoes { display: flex; gap: 6px; margin-top: 12px; flex-wrap: wrap; }
  .and-bloco { padding: 14px 18px; border-bottom: 1px solid var(--cinza-borda); }
  .and-bloco:last-child { border-bottom: none; }
  .and-bloco h3 {
    margin: 0 0 10px; font-size: 10.5px; font-weight: 700; letter-spacing: .08em;
    text-transform: uppercase; color: var(--verde-escuro);
  }
  .and-bloco-cab { display: flex; justify-content: space-between; align-items: baseline; gap: 8px; }
  .and-bloco-cab span { font-size: 12px; color: var(--cinza-texto); }
  .and-bloco-cab b { color: var(--verde-escuro); font-variant-numeric: tabular-nums; }
  .and-kv { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 10px 14px; margin: 0; }
  .and-kv dt { font-size: 11px; color: var(--cinza-texto); }
  .and-kv dd { margin: 1px 0 0; font-weight: 600; overflow-wrap: anywhere; }
  .and-peso { margin: 0 0 4px; }
  .and-peso b { font-size: 18px; color: var(--verde-escuro); font-variant-numeric: tabular-nums; }
  .and-peso span { font-size: 12px; color: var(--cinza-texto); }
  .and-spark { display: block; width: 100%; height: auto; }
  .and-spark-eixo { stroke: var(--cinza-borda); stroke-width: 1; }
  .and-spark-area { fill: var(--verde-escuro); fill-opacity: .07; stroke: none; }
  .and-spark-linha { fill: none; stroke: var(--verde-escuro); stroke-width: 2; stroke-linejoin: round; stroke-linecap: round; }
  .and-spark-ponto { fill: var(--dourado); stroke: var(--verde-escuro); stroke-width: 1.5; }
  .and-spark-rotulo { fill: var(--cinza-texto); font-size: 10px; font-family: var(--fonte); }
  .and-nada { margin: 0; color: var(--cinza-texto); font-size: 12.5px; }
  .and-eventos { list-style: none; margin: 0; padding: 0; }
  .and-eventos li { display: flex; gap: 10px; padding: 7px 0; border-bottom: 1px solid var(--cinza-borda); }
  .and-eventos li:last-child { border-bottom: none; }
  .and-eventos i {
    flex: none; width: 26px; height: 26px; border-radius: 6px; font-style: normal;
    display: flex; align-items: center; justify-content: center;
    background: var(--tinta-verde); color: var(--verde-escuro); font-size: 9.5px; font-weight: 700;
  }
  .and-eventos b { display: block; font-weight: 600; font-size: 12.5px; }
  .and-eventos small { display: block; color: var(--cinza-texto); font-size: 11px; margin-top: 1px; }
  .and-obs { margin: 10px 0 0; padding: 8px 10px; background: var(--areia); border-radius: 6px; font-size: 12px; white-space: pre-line; }
  .and-alerta { background: var(--tinta-amarela); display: flex; flex-direction: column; gap: 3px; font-size: 12px; }
  .and-alerta b { color: var(--dourado-texto); font-size: 12.5px; }
}

/* ---------- Cadastro em página inteira (computador) ----------
   O modal continua sendo o mesmo HTML, com a mesma lógica, validação e
   foco — só deixa de ser uma janela sobre a lista: a lista some enquanto o
   cadastro está aberto e ele ocupa a área da tela. Em tela larga as abas
   viram colunas, para ver o cadastro inteiro sem clicar em aba.

   Tudo preso a "#conteudo-principal >": o cadastro rápido (js/cadastrorapido.js)
   monta a MESMA tela num contêiner invisível anexado ao <body> para abrir o
   modal por cima de outra tela — ali ele tem de continuar sendo janela.

   Duas páginas abertas ao mesmo tempo (Aplicação → Folha de curral): vale a
   de baixo no HTML, que é a aberta por último; a outra espera escondida e
   volta quando esta fechar, como um "voltar". */
@media (min-width: 761px) {
  #conteudo-principal:has(> .sobreposicao.modo-pagina.aberta) > :not(.sobreposicao) { display: none !important; }
  #conteudo-principal > .sobreposicao.modo-pagina.aberta {
    position: static; display: block; padding: 0; background: none; overflow: visible; z-index: auto;
  }
  #conteudo-principal > .sobreposicao.modo-pagina.aberta:has(~ .sobreposicao.modo-pagina.aberta) { display: none; }
  #conteudo-principal > .sobreposicao.modo-pagina > .modal {
    /* !important: alguns modais trazem max-width inline (Usuários, Piquetes). */
    max-width: none !important; width: 100%; border-radius: var(--raio);
    box-shadow: var(--sombra); border: 1px solid var(--cinza-borda); overflow: visible;
  }
  #conteudo-principal > .sobreposicao.modo-pagina .modal-cabecalho {
    position: sticky; top: var(--topo-altura); z-index: 9;
    background: var(--branco); border-radius: var(--raio) var(--raio) 0 0;
  }
  #conteudo-principal > .sobreposicao.modo-pagina .modal-corpo { max-height: none; overflow: visible; }
  #conteudo-principal > .sobreposicao.modo-pagina .modal-rodape {
    position: sticky; bottom: 0; z-index: 9; background: var(--branco);
    border-radius: 0 0 var(--raio) var(--raio); box-shadow: 0 -6px 16px rgba(10,41,36,.05);
  }
  /* Com o corpo sem rolagem própria, as abas grudam logo abaixo do cabeçalho. */
  #conteudo-principal > .sobreposicao.modo-pagina .modal-corpo .abas { top: calc(var(--topo-altura) + 57px); }
  :where(html[data-densidade="compacta"]) #conteudo-principal > .sobreposicao.modo-pagina .modal-corpo .abas { top: calc(var(--topo-altura) + 49px); }
  /* Listas longas dentro de um cadastro (animais do protocolo, folha de curral)
     tinham altura de janela; como página, usam a altura da tela. */
  #conteudo-principal > .sobreposicao.modo-pagina .tabela-cartao[style*="max-height"] {
    max-height: max(260px, calc(100vh - var(--topo-altura) - 340px)) !important;
  }
}
@media (min-width: 1100px) {
  #conteudo-principal > .sobreposicao.modo-pagina .modal-corpo > .abas { display: none; }
  #conteudo-principal > .sobreposicao.modo-pagina :is(form, .modal-corpo):has(> .painel-aba) {
    display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 0 28px; align-items: start;
  }
  #conteudo-principal > .sobreposicao.modo-pagina :is(form, .modal-corpo):has(> .painel-aba) > :not(.painel-aba) { grid-column: 1 / -1; }
  #conteudo-principal > .sobreposicao.modo-pagina .painel-aba { display: block; min-width: 0; padding: 4px 0 18px; }
  #conteudo-principal > .sobreposicao.modo-pagina .painel-aba::before {
    display: flex; align-items: center; gap: 10px; margin: 6px 0 12px; padding-bottom: 8px;
    border-bottom: 2px solid var(--dourado);
    font-size: 11px; font-weight: 700; letter-spacing: .08em; text-transform: uppercase; color: var(--verde-escuro);
  }
  #conteudo-principal > #sobreposicao-animal .painel-aba[data-painel="identificacao"]::before { content: 'Identificação'; }
  #conteudo-principal > #sobreposicao-animal .painel-aba[data-painel="aquisicao"]::before { content: 'Origem e Peso'; }
  #conteudo-principal > #sobreposicao-animal .painel-aba[data-painel="genealogia"]::before { content: 'Raça e Genealogia'; }
  #conteudo-principal > #sobreposicao-animal .painel-aba[data-painel="situacao"]::before { content: 'Situação'; }
  #conteudo-principal > #sobreposicao-md-aplic .painel-aba[data-painel="mdagenda"]::before { content: 'Agenda'; }
  #conteudo-principal > #sobreposicao-md-aplic .painel-aba[data-painel="mdanimais"]::before { content: 'Animais'; }
}
@media (min-width: 1600px) {
  #conteudo-principal > #sobreposicao-animal form { grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 0 24px; }
}

/* Tabelinha dentro do resumo (histórico de pesagens, etapas). Precisa de
   seletor próprio: as regras gerais de tabela (tbody td com padding largo,
   cabeçalho em caixa alta, cartão no celular) são pensadas para as grades. */
@media (min-width: 1100px) {
  .an-detalhe .and-tabela { width: 100%; border-collapse: collapse; font-size: 12px; }
  .an-detalhe .and-tabela th {
    padding: 4px 6px; background: none; border-bottom: 1px solid var(--cinza-borda);
    font-size: 10.5px; font-weight: 600; text-transform: none; letter-spacing: 0; color: var(--cinza-texto); text-align: left;
  }
  .an-detalhe .and-tabela td { padding: 5px 6px; border-bottom: 1px solid var(--cinza-borda); white-space: nowrap; }
  .an-detalhe .and-tabela tr:last-child td { border-bottom: none; }
  .an-detalhe .and-tabela tbody tr:hover { background: none; }
  .an-detalhe .and-tabela .num { text-align: right; font-variant-numeric: tabular-nums; }
  .and-pos { color: var(--verde-ok); font-weight: 600; }
  .and-neg { color: var(--vermelho); font-weight: 600; }
  .and-progresso { height: 6px; border-radius: 3px; background: var(--tinta-verde-2); overflow: hidden; margin: 6px 0 4px; }
  .and-progresso > span { display: block; height: 100%; background: var(--verde-ok); border-radius: 3px; }
  .and-etapas { list-style: none; margin: 0; padding: 0; }
  .and-etapas li { display: flex; gap: 10px; align-items: flex-start; padding: 8px 0; border-bottom: 1px solid var(--cinza-borda); }
  .and-etapas li:last-child { border-bottom: none; }
  .and-etapas .and-etapa-data { flex: none; width: 74px; font-size: 12px; font-weight: 600; font-variant-numeric: tabular-nums; }
  .and-etapas .and-etapa-texto { flex: 1; min-width: 0; font-size: 12.5px; }
  .and-etapas .and-etapa-texto small { display: block; color: var(--cinza-texto); font-size: 11px; margin-top: 2px; }
  .and-etapas li.feita .and-etapa-texto b { color: var(--cinza-texto); font-weight: 500; }
}

/* Contagens em pílulas (composição do lote / do piquete) e ocupação acima da
   capacidade — peças do resumo à direita, layout de 19/09/2026. */
@media (min-width: 1100px) {
  .and-chips { list-style: none; margin: 0; padding: 0; display: flex; flex-wrap: wrap; gap: 6px; }
  .and-chips li {
    display: inline-flex; align-items: center; gap: 6px; padding: 3px 4px 3px 10px; border-radius: 12px;
    background: var(--tinta-verde); font-size: 12px; color: var(--preto);
  }
  .and-chips li b {
    min-width: 22px; padding: 1px 6px; border-radius: 9px; text-align: center;
    background: var(--branco); color: var(--verde-escuro); font-size: 11px; font-variant-numeric: tabular-nums;
  }
  .and-progresso-excedido > span { background: var(--vermelho); }
  .and-alerta-linha { margin: 4px 0 0; font-size: 12px; font-weight: 600; color: var(--vermelho); }
}

/* Reprodução: cartão de matriz clicável (resumo à direita). Prefixo rpm-
   conferido como inexistente no projeto antes de criar (lição do .pm-grade). */
.rpm-cartao { cursor: pointer; transition: box-shadow .12s, background .12s; }
.rpm-cartao:hover { box-shadow: var(--sombra-lg); }
.rpm-cartao.rpm-selecionado { background: var(--realce-selecao); box-shadow: 0 0 0 2px var(--dourado); }
.rpm-cartao:focus-visible { outline: 2px solid var(--verde-escuro); outline-offset: 2px; }

/* Protocolos de Medicação em página inteira: Operacional e Medicamentos são
   grades largas (a de medicamentos tem 8 colunas de campos) — uma embaixo da
   outra, as duas à vista, em vez de lado a lado. */
@media (min-width: 1100px) {
  #conteudo-principal > #sobreposicao-protmed form:has(> .painel-aba) { grid-template-columns: minmax(0, 1fr); }
  #conteudo-principal > #sobreposicao-protmed .painel-aba[data-painel="pmoperacional"]::before { content: 'Operacional'; }
  #conteudo-principal > #sobreposicao-protmed .painel-aba[data-painel="pmmedicamentos"]::before { content: 'Medicamentos'; }
}
/* Roteiro do protocolo: operação e medicamento do mesmo dia, cada um na sua linha. */
@media (min-width: 1100px) {
  .and-roteiro-op { font-size: 12.5px; color: var(--preto); }
  .and-roteiro-med { margin-top: 3px; }
  .and-roteiro-op + .and-roteiro-med, .and-roteiro-med + .and-roteiro-med { margin-top: 5px; }
}

/* Logs: o que mudou no registro (resumo à direita). */
@media (min-width: 1100px) {
  .and-alteracoes { list-style: none; margin: 0; padding: 0; }
  .and-alteracoes li {
    display: grid; grid-template-columns: minmax(0, 1fr); gap: 2px;
    padding: 8px 0; border-bottom: 1px solid var(--cinza-borda); font-size: 12.5px;
  }
  .and-alteracoes li:last-child { border-bottom: none; }
  .and-alt-campo { font-weight: 700; color: var(--verde-escuro); font-size: 12px; }
  .and-alt-antes, .and-alt-depois { overflow-wrap: anywhere; padding: 2px 6px; border-radius: 4px; }
  .and-alt-antes { background: var(--tinta-vermelha); color: var(--vermelho); text-decoration: line-through; text-decoration-thickness: 1px; }
  .and-alt-depois { background: var(--tinta-verde); color: var(--verde-ok); font-weight: 600; }
  .and-alt-antes::before { content: '− '; text-decoration: none; display: inline-block; }
  .and-alt-depois::before { content: '+ '; }
  .and-iguais { margin-top: 10px; font-size: 12px; color: var(--cinza-texto); }
  .and-iguais summary { cursor: pointer; }
  .and-iguais p { margin: 6px 0 0; overflow-wrap: anywhere; }
  .and-kv-lista { grid-template-columns: minmax(0, 1fr); }
}

/* Usuários: edição em página inteira; Dados e Acessos lado a lado em tela
   larga (as abas deste formulário usam classes próprias: .painel-aba-ed). */
@media (min-width: 1100px) {
  #conteudo-principal > #us-sobreposicao-editar .modal-corpo {
    display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1.4fr); gap: 0 28px; align-items: start;
  }
  #conteudo-principal > #us-sobreposicao-editar .modal-corpo > :not(.painel-aba-ed) { grid-column: 1 / -1; }
  #conteudo-principal > #us-sobreposicao-editar .modal-corpo > .abas { display: none; }
  #conteudo-principal > #us-sobreposicao-editar .painel-aba-ed,
  #conteudo-principal > #us-sobreposicao-editar .painel-aba-ed.oculto { display: block !important; min-width: 0; }
  #conteudo-principal > #us-sobreposicao-editar .painel-aba-ed::before {
    display: block; margin: 6px 0 12px; padding-bottom: 8px; border-bottom: 2px solid var(--dourado);
    font-size: 11px; font-weight: 700; letter-spacing: .08em; text-transform: uppercase; color: var(--verde-escuro);
  }
  #conteudo-principal > #us-sobreposicao-editar .painel-aba-ed[data-painel-ed="dados"]::before { content: 'Dados do usuário'; }
  #conteudo-principal > #us-sobreposicao-editar .painel-aba-ed[data-painel-ed="acessos"]::before { content: 'Acessos — proprietários e fazendas'; }
}


/* ====================================================================
   Marca SynConsult no topo (19/09/2026)
   Sempre à vista: aparece no topo quando a barra lateral (que também traz a
   marca) não está na tela — menu superior, barra lateral recolhida, celular.
   Com a barra lateral aberta no computador, fica só nela, sem repetir.
   ==================================================================== */
.marca-topo {
  display: none; align-items: center; gap: 8px; flex: none;
  font-family: var(--fonte-menu); font-weight: 800; font-size: 15px;
  letter-spacing: -.01em; color: var(--verde-escuro); white-space: nowrap;
  user-select: none;
}
.marca-topo img { width: 26px; height: 26px; display: block; }
@media (min-width: 761px) {
  .app-shell.menu-oculto .marca-topo { display: flex; }
  html[data-menu="superior"] .marca-topo {
    display: flex; color: #fff; height: 48px;
    padding: 0 14px 0 4px; margin-right: 2px;
    border-right: 1px solid rgba(255,255,255,.14);
  }
}
@media (max-width: 760px) {
  .marca-topo { display: flex; }
  .marca-topo span { display: none; }
  .marca-topo img { width: 24px; height: 24px; }
}

/* ====================================================================
   ALINHAMENTO DOS CAMPOS (19/09/2026)
   Achado da varredura de todas as telas: campos lado a lado com alturas
   diferentes (texto 29px, data 31px, lista 32px, "+" 40px) e rótulos com
   o "?" de ajuda mais altos que os sem ele. Resultado: campos da mesma
   linha começando e terminando em alturas diferentes.
   Regra única: todo controle de uma linha tem a mesma altura
   (--altura-campo) e todo rótulo a mesma altura mínima (a do "?").
   Só no computador — no celular os campos já ficam um embaixo do outro e
   mantêm a altura de toque de 44px.
   ==================================================================== */
@media (min-width: 761px) {
  :root { --altura-campo: 42px; }
  html[data-densidade="compacta"] { --altura-campo: 32px; }

  input:not([type="checkbox"]):not([type="radio"]):not([type="range"]):not([type="file"]):not([type="color"]):not([type="hidden"]),
  select:not([multiple]):not([size]),
  .sb-gatilho, .ms-gatilho, .btn-cad-rapido {
    box-sizing: border-box;
    height: var(--altura-campo); min-height: var(--altura-campo);
  }
  .btn-cad-rapido { width: var(--altura-campo); font-size: calc(var(--altura-campo) * .5); }

  /* Rótulo: sempre da altura do "?" — com ou sem ícone, o campo começa no
     mesmo ponto. Texto longo continua podendo quebrar linha. */
  .campo > label {
    display: flex; align-items: center; flex-wrap: wrap;
    min-height: 18px; line-height: 1.25;
  }
  .campo > label > .ajuda-campo-icone { flex: none; }

  /* Botão de ação na mesma linha dos campos (Adicionar, Incluir…): mesma
     altura do campo, sentado na mesma base. */
  .campo ~ button:not(.btn-sm):not(.btn-texto),
  button:not(.btn-sm):not(.btn-texto):has(~ .campo) {
    box-sizing: border-box; height: var(--altura-campo); padding-top: 0; padding-bottom: 0;
  }
}
/* Rótulo esticado para acompanhar o vizinho de duas linhas: o texto fica
   junto do próprio campo, embaixo. */
@media (min-width: 761px) {
  .campo > label[data-igualado] { align-items: flex-end; }
}

/* Animais: Código do Animal (até 10 caracteres) estreito, Nome logo ao lado. */
.linha-campos.an-codigo-nome { grid-template-columns: minmax(120px, 150px) minmax(0, 1fr); }
@media (max-width: 760px) { .linha-campos.an-codigo-nome { grid-template-columns: 1fr; } }
.an-nome-lista { display: block; font-size: 11.5px; color: var(--cinza-texto); font-weight: 500; }

/* Aviso de manejos sanitários pendentes (20/09/2026): a tabela cabe na janela,
   sem barra de rolagem horizontal. Colunas curtas não quebram; Protocolo e
   Etapa quebram linha quando falta espaço. */
.tabela-aviso-manejos thead th,
.tabela-aviso-manejos tbody td { padding: 10px 12px; }
.tabela-aviso-manejos thead th { white-space: nowrap; }
.tabela-aviso-manejos td:nth-child(3),
.tabela-aviso-manejos td:nth-child(4) { white-space: normal; overflow: visible; max-width: none; }
.tabela-aviso-manejos td:nth-child(3) { min-width: 130px; }
.tabela-aviso-manejos td:nth-child(4) { min-width: 170px; }
@media (max-width: 1000px) {
  .tabela-aviso-manejos thead th,
  .tabela-aviso-manejos tbody td { padding: 8px 8px; }
  .tabela-aviso-manejos td:nth-child(3) { min-width: 110px; }
  .tabela-aviso-manejos td:nth-child(4) { min-width: 140px; }
  /* tablet estreito: o selo "Atrasada 18 dia(s)" quebra em duas linhas */
  .tabela-aviso-manejos tbody td:nth-child(2) { white-space: normal !important; }
  .tabela-aviso-manejos .selo { white-space: normal; }
}

/* ==================================================================
   Filtro por coluna (js/filtrocolunas.js — 20/09/2026)
   Linha de campos acima dos rótulos de toda grade.
   ================================================================== */
.tabela-cartao thead tr.fc-linha td {
  padding: 6px 8px 4px; background: var(--areia); border-bottom: none;
  white-space: normal; overflow: visible; max-width: none; vertical-align: middle;
}
.tabela-cartao thead tr.fc-linha td.fc-primeira { padding-left: 14px; }
.tabela-cartao .fc-campo {
  width: 100%; min-width: 64px; box-sizing: border-box;
  height: 28px; padding: 3px 8px; font-size: 12px; font-weight: 500;
  border: 1px solid var(--cinza-borda); border-radius: 6px; background: var(--branco); color: var(--preto);
}
.tabela-cartao .fc-campo::placeholder { color: var(--cinza-texto); opacity: .75; font-weight: 500; }
.tabela-cartao .fc-campo:focus { outline: 2px solid var(--dourado); outline-offset: 0; border-color: var(--dourado); }
.tabela-cartao .fc-campo:not(:placeholder-shown) { border-color: var(--dourado); background: var(--realce-selecao, #FFF8E6); }
.tabela-cartao .fc-acoes { display: inline-flex; align-items: center; gap: 6px; white-space: nowrap; }
.tabela-cartao .fc-contagem { font-size: 11.5px; color: var(--cinza-texto); font-weight: 600; }
.tabela-cartao .fc-limpar {
  display: inline-block; border: 1px solid transparent; background: none; color: var(--cinza-texto);
  font-size: 11.5px; font-weight: 600; padding: 3px 7px; cursor: pointer; border-radius: 6px; white-space: nowrap; opacity: .55;
}
.tabela-cartao tr.fc-linha.fc-ativo .fc-limpar { opacity: 1; color: var(--vermelho); border-color: var(--cinza-borda); background: var(--branco); }
.tabela-cartao .fc-limpar:hover { background: var(--branco); color: var(--vermelho); }
.tabela-cartao tbody tr.fc-oculta { display: none !important; }
@media (max-width: 760px) {
  /* O cabeçalho da tabela fica recortado no celular (achado BX-09); a linha
     de filtro precisa aparecer, então só ela sai do recorte. */
  .tabela-cartao thead:has(tr.fc-linha) {
    position: static; width: auto; height: auto; overflow: visible; clip: auto; white-space: normal; display: block;
  }
  .tabela-cartao thead:has(tr.fc-linha) tr:not(.fc-linha) {
    display: block; position: absolute; width: 1px; height: 1px; overflow: hidden; clip: rect(0 0 0 0);
  }
  .tabela-cartao thead tr.fc-linha {
    display: grid; grid-template-columns: 1fr 1fr; gap: 6px; padding: 8px; margin-bottom: 10px;
    background: var(--areia); border-radius: var(--raio);
  }
  .tabela-cartao thead tr.fc-linha td { display: block; width: auto; padding: 0; background: none; }
  .tabela-cartao thead tr.fc-linha td.fc-vazia:not(:has(.fc-acoes)) { display: none; }
  .tabela-cartao thead tr.fc-linha td.fc-primeira { padding-left: 0; }
  .tabela-cartao .fc-campo { height: 36px; font-size: 13px; }
}

/* ==================================================================
   Painéis de indicadores e janela de registros (js/paineis.js — 20/09/2026)
   ================================================================== */
.pn-modal-indicadores { max-width: min(1180px, 96vw) !important; }
.pn-modal-registros { max-width: min(1180px, 96vw) !important; }
.pn-corpo { max-height: 70vh; }
.pn-subtitulo { margin: 4px 0 0; font-size: 12.5px; color: var(--cinza-texto); font-weight: 500; }
.pn-dica { font-size: 12.5px; color: var(--cinza-texto); }
.pn-contagem { margin: 0 0 10px; font-size: 12.5px; color: var(--cinza-texto); }
.pn-secao { margin: 6px 0 10px; font-size: 13px; text-transform: uppercase; letter-spacing: .03em; color: var(--cinza-texto); }
.pn-grade { grid-template-columns: repeat(auto-fit, minmax(min(100%, 190px), 1fr)); gap: 12px; margin-bottom: 20px; }
.pn-grade .cartao-kpi { padding: 14px 16px; }
.pn-grade .valor-kpi { font-size: 26px; }
.pn-clicavel { cursor: pointer; transition: transform .12s ease, box-shadow .12s ease; }
.pn-clicavel:hover, .pn-clicavel:focus-visible { transform: translateY(-2px); box-shadow: var(--sombra-lg); }
.pn-clicavel:focus-visible { outline: 2px solid var(--dourado); outline-offset: 2px; }
.pn-grade-cat { display: grid; grid-template-columns: repeat(auto-fill, minmax(min(100%, 430px), 1fr)); gap: 12px; margin-bottom: 12px; }
.pn-cat { background: var(--branco); border-radius: var(--raio); box-shadow: var(--sombra); padding: 12px 14px; border-left: 4px solid var(--dourado); }
.pn-cat h4 { margin: 0 0 10px; font-size: 14.5px; color: var(--verde-escuro); }
.pn-cat h4 small { font-weight: 500; color: var(--cinza-texto); font-size: 12px; }
.pn-metricas { display: grid; grid-template-columns: repeat(5, 1fr); gap: 6px; }
.pn-metrica {
  display: flex; flex-direction: column; align-items: flex-start; gap: 2px; padding: 7px 8px;
  border: 1px solid var(--cinza-borda); border-left: 3px solid var(--pn-cor, var(--dourado)); border-radius: 8px;
  background: var(--areia); cursor: pointer; text-align: left; font: inherit; color: inherit; min-width: 0;
}
.pn-metrica span { font-size: 11px; color: var(--cinza-texto); font-weight: 600; white-space: nowrap; }
.pn-metrica b { font-size: 18px; color: var(--verde-escuro); }
.pn-metrica:hover, .pn-metrica:focus-visible { background: var(--branco); box-shadow: var(--sombra); }
.pn-nota { font-size: 12px; color: var(--cinza-texto); margin: 4px 0 0; }
.btn-indicadores span { font-size: 14px; margin-right: 2px; }
@media (max-width: 520px) { .pn-metricas { grid-template-columns: repeat(3, 1fr); } .pn-grade-cat { grid-template-columns: 1fr; } }

/* Dashboard (20/09/2026): cartões e gráficos que levam aos registros. */
.dash-kpi-clicavel { cursor: pointer; transition: transform .12s ease, box-shadow .12s ease; position: relative; }
.dash-kpi-clicavel:hover, .dash-kpi-clicavel:focus-visible { transform: translateY(-2px); box-shadow: var(--sombra-lg); }
.dash-kpi-clicavel:focus-visible { outline: 2px solid var(--dourado); outline-offset: 2px; }
.dash-kpi-clicavel .dash-kpi-ver { font-size: 11.5px; color: var(--cinza-texto); font-weight: 600; margin-top: 6px; }
.dash-dica-interativo {
  display: inline-flex; align-items: center; gap: 6px; margin: -8px 0 10px; font-size: 12px; color: var(--cinza-texto);
  background: var(--areia); border-radius: 20px; padding: 3px 10px;
}
.dash-grafico-clicavel canvas { cursor: pointer; }

/* Reprodução: abas + botão Indicadores na mesma linha (20/09/2026). */
.rep-topo { display: flex; justify-content: space-between; align-items: flex-end; gap: 12px; flex-wrap: wrap; margin-bottom: 20px; border-bottom: 1px solid var(--cinza-borda); }
.rep-topo .abas { border-bottom: none; }
.rep-topo .btn-indicadores { margin-bottom: 8px; }
.sm-explica { font-size: 13px; color: var(--cinza-texto); margin: -4px 0 14px; max-width: 920px; }
/* Destino de um atalho (Dashboard → tela): pisca um contorno para mostrar onde olhar. */
.destaque-foco { animation: destaqueFoco 2.4s ease-out 1; border-radius: var(--raio); }
@keyframes destaqueFoco {
  0%, 35% { box-shadow: 0 0 0 3px var(--dourado); }
  100% { box-shadow: 0 0 0 0 transparent; }
}
@media (prefers-reduced-motion: reduce) { .destaque-foco { animation: none; box-shadow: 0 0 0 3px var(--dourado); } }

/* Lotes › Transferência (20/09/2026): origem, destino e motivo lado a lado,
   congelados no alto enquanto se rola a árvore de animais. */
.tr-barra-fixa {
  position: sticky; top: calc(var(--topo-altura) + 8px); z-index: 12;
  margin-bottom: 16px; padding: 14px 18px; box-shadow: var(--sombra-lg);
}
.tr-campos { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 14px; align-items: end; }
.tr-campos .campo { margin: 0; min-width: 0; }
.tr-campos .multiseletor { display: block; width: 100%; }
.tr-rodape { display: flex; align-items: center; gap: 12px; flex-wrap: wrap; margin-top: 10px; }
.tr-rodape #busca-tr-animal { flex: 0 1 260px; min-width: 180px; }
@media (max-width: 900px) { .tr-campos { grid-template-columns: 1fr 1fr; } }
@media (max-width: 760px) {
  .tr-campos { grid-template-columns: 1fr; gap: 8px; }
  .tr-barra-fixa { top: calc(var(--topo-altura) + 4px); padding: 10px 12px; }
  .tr-rodape #busca-tr-animal { flex: 1 1 100%; }
}

/* Piquetes › Transferência / Indicadores (20/09/2026) */
.pt-campos { display: grid; grid-template-columns: 1.4fr 1.4fr .8fr 1.2fr 1fr; gap: 12px; align-items: end; }
.pt-campos .campo { margin: 0; min-width: 0; }
.pt-campos .multiseletor { display: block; width: 100%; }
.pt-resumo-troca { font-size: 13px; background: #FFF6E0; color: #7a5900; border-radius: 20px; padding: 3px 10px; }
#pt-tabela tbody tr[data-animal] { cursor: pointer; }
#pt-tabela tbody tr.linha-marcada { background: var(--realce-selecao); }
.pt-codigo { font-weight: 700; padding: 0; letter-spacing: .02em; }
.pt-nota { font-size: 12.5px; color: var(--cinza-texto); margin: -4px 0 10px; }
.pt-periodo { display: flex; flex-wrap: wrap; align-items: center; gap: 8px 12px; margin: 0 0 14px; padding: 10px 12px;
  background: var(--areia); border-radius: var(--raio); font-size: 13px; color: var(--cinza-texto); }
.pt-periodo label { display: inline-flex; align-items: center; gap: 6px; }
.pt-periodo input[type=date] { width: auto; padding: 5px 8px; }
.pt-graficos { display: grid; grid-template-columns: repeat(auto-fit, minmax(min(100%, 440px), 1fr)); gap: 14px; }
@media (max-width: 1100px) { .pt-campos { grid-template-columns: 1fr 1fr 1fr; } }
@media (max-width: 760px) { .pt-campos { grid-template-columns: 1fr 1fr; } }
@media (max-width: 480px) { .pt-campos { grid-template-columns: 1fr; } }

/* Botão "Limpar filtros" ao lado de "Filtros" (20/09/2026). */
.btn-limpar-filtros {
  display: inline-flex; align-items: center; gap: 6px; border: 1px solid var(--cinza-borda); background: var(--branco);
  color: var(--cinza-texto); border-radius: var(--raio); padding: 7px 12px; font-size: 13px; font-weight: 600; cursor: pointer; margin-left: 6px;
}
.btn-limpar-filtros:hover { border-color: var(--vermelho); color: var(--vermelho); }
.tabela-cartao thead tr.fc-linha td:not(.fc-vazia) .fc-acoes { display: flex; margin-top: 3px; }
/* No celular os 5 campos empilhados cobririam a tela: a barra da transferência
   de piquete rola junto (a de Lotes, com 3 campos, continua fixa). */
@media (max-width: 760px) {
  #pt-barra-fixa { position: static; }
  .pt-campos { grid-template-columns: 1fr 1fr; }
  .pt-campos .campo:first-child, .pt-campos .campo:nth-child(2) { grid-column: 1 / -1; }
}

/* ==================================================================
   Grades: linha inteira clicável (20/09/2026)
   Onde clicar num registro abre outra tela ou janela, a LINHA é o botão —
   sem botão "Ver"/"Animais" separado. Cursor, realce ao passar o mouse e o
   texto-chave sublinhado mostram onde clicar; Enter/Espaço abrem pelo teclado.
   ================================================================== */
.tabela-cartao tbody tr.linha-clicavel { cursor: pointer; transition: background-color .12s ease; }
.tabela-cartao tbody tr.linha-clicavel:hover { background: var(--realce-selecao); }
.tabela-cartao tbody tr.linha-clicavel:focus-visible { outline: 2px solid var(--dourado); outline-offset: -2px; background: var(--realce-selecao); }
.tabela-cartao tbody tr.linha-clicavel .link-linha { color: var(--verde-escuro); text-decoration: underline; text-decoration-color: var(--dourado); text-decoration-thickness: 2px; text-underline-offset: 3px; }
.tabela-cartao tbody tr.linha-clicavel:hover .link-linha { text-decoration-color: currentColor; }
.tabela-cartao tbody tr.linha-clicavel td:last-child::after { content: '›'; float: right; margin-left: 8px; color: var(--cinza-texto); font-weight: 700; opacity: .5; }
.tabela-cartao tbody tr.linha-clicavel:hover td:last-child::after { opacity: 1; color: var(--dourado); }

/* ==================================================================
   Manejo › Baixa de Animais (20/09/2026)
   ================================================================== */
.selo-consumo { background: #FFF6E0; color: #7a5900; }
.selo-bx-morte { background: #FDECEA; color: var(--vermelho); }
.selo-bx-venda { background: #E7F5E8; color: var(--verde-ok); }
.selo-bx-consumo { background: #FFF6E0; color: #7a5900; }
.selo-bx-carencia { background: #FDECEA; color: var(--vermelho); white-space: nowrap; }
.bx-barra-acoes { display: flex; align-items: center; justify-content: space-between; gap: 12px; flex-wrap: wrap; padding: 12px 16px; margin-bottom: 14px; }
.bx-resumo-txt { font-size: 13px; color: var(--cinza-texto); }
.bx-botoes { display: flex; gap: 8px; flex-wrap: wrap; }
.bx-btn-morte:not(:disabled) { border-color: var(--vermelho); color: var(--vermelho); }
.bx-btn-consumo:not(:disabled) { border-color: #b08000; color: #7a5900; }
#bx-tabela tbody tr[data-animal], #bx-v-tabela tbody tr[data-animal] { cursor: pointer; }
#bx-tabela tbody tr.linha-marcada, #bx-v-tabela tbody tr.linha-marcada { background: var(--realce-selecao); }
.bx-venda-cab { margin-bottom: 14px; padding: 14px 18px; }
.bx-campos { display: grid; grid-template-columns: repeat(6, minmax(0, 1fr)); gap: 12px; align-items: end; }
.bx-campos .campo { margin: 0; min-width: 0; }
.bx-campos .multiseletor { display: block; width: 100%; }
.bx-c-lotes, .bx-c-comprador { grid-column: span 2; }
.bx-c-obs { grid-column: span 2; }
.bx-pesagem { display: flex; flex-wrap: wrap; align-items: center; gap: 8px 12px; margin-top: 12px; padding: 8px 12px; background: var(--areia); border-radius: var(--raio); font-size: 13px; }
.bx-pesagem-tit { font-weight: 700; color: var(--verde-escuro); }
.bx-balanca { display: inline-flex; align-items: center; gap: 6px; color: var(--cinza-texto); }
.bx-balanca input { width: 130px; padding: 5px 8px; }
.bx-peso-venda { width: 110px; padding: 5px 8px; }
.bx-resumo-fixo {
  position: sticky; bottom: 0; z-index: 11; display: flex; align-items: center; justify-content: space-between; gap: 12px; flex-wrap: wrap;
  margin-top: 12px; padding: 10px 16px; background: var(--branco); border-top: 3px solid var(--dourado); border-radius: var(--raio) var(--raio) 0 0; box-shadow: 0 -6px 18px rgba(0,0,0,.08);
}
.bx-totais { display: flex; flex-wrap: wrap; gap: 6px 18px; align-items: baseline; }
.bx-totais > span { display: inline-flex; flex-direction: column; }
.bx-totais small { font-size: 11px; color: var(--cinza-texto); font-weight: 600; }
.bx-totais b { font-size: 16px; color: var(--verde-escuro); }
.bx-totais b.bx-valor { font-size: 19px; }
.bx-totais .bx-totais-lotes { flex-direction: row; font-size: 12px; color: var(--cinza-texto); align-self: center; }
.bx-celula-texto { white-space: normal !important; min-width: 180px; max-width: 320px; font-size: 12.5px; }
.bx-detalhe-grade { display: grid; grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); gap: 10px 16px; margin-bottom: 14px; }
.bx-detalhe-grade > div { display: flex; flex-direction: column; gap: 2px; font-size: 13.5px; }
.bx-detalhe-grade small, .bx-detalhe-texto small { font-size: 11px; color: var(--cinza-texto); font-weight: 600; text-transform: uppercase; letter-spacing: .03em; }
.bx-detalhe-texto { margin-bottom: 12px; }
.bx-detalhe-texto p { margin: 2px 0 0; font-size: 13.5px; white-space: pre-wrap; }
.bx-kpi-un { font-size: 13px; font-weight: 600; color: var(--cinza-texto); }
@media (max-width: 1200px) { .bx-campos { grid-template-columns: repeat(4, minmax(0, 1fr)); } }
@media (max-width: 760px) {
  .bx-campos { grid-template-columns: 1fr 1fr; }
  .bx-c-lotes, .bx-c-comprador, .bx-c-obs { grid-column: 1 / -1; }
  .bx-resumo-fixo { padding: 8px 10px; }
  .bx-totais b { font-size: 14px; }
}
@media (max-width: 480px) { .bx-campos { grid-template-columns: 1fr; } }
.pn-grade.bx-grade-grupo { grid-template-columns: repeat(auto-fill, minmax(min(100%, 230px), 1fr)); }
@media (max-width: 760px) {
  .bx-resumo-fixo { flex-wrap: nowrap; gap: 8px; }
  .bx-resumo-fixo .bx-t-extra { display: none; }
  .bx-totais { gap: 4px 12px; }
  .bx-resumo-fixo .btn-primario { padding: 8px 12px; white-space: nowrap; }
}
/* Linha clicável automática: o botão que abria o registro some; a linha abre. */
.tabela-cartao tbody tr.linha-clicavel .lc-alvo { display: none !important; }
.tabela-cartao tbody tr.linha-clicavel td.lc-chave { color: var(--verde-escuro); font-weight: 600; }
.tabela-cartao tbody tr.linha-clicavel td.lc-chave > :first-child:is(b, strong, span:not(.selo)), .tabela-cartao tbody tr.linha-clicavel td.lc-chave:not(:has(> *)) {
  text-decoration: underline; text-decoration-color: var(--dourado); text-decoration-thickness: 2px; text-underline-offset: 3px;
}

/* ==================================================================
   Explicação dos cartões (20/09/2026): botão "?" no canto de todo cartão
   de indicador; abre o informativo (o que mostra, cálculo, exemplo, termos).
   ================================================================== */
.cartao-kpi { position: relative; }
.cartao-info {
  position: absolute; top: 8px; right: 8px; z-index: 2; width: 22px; height: 22px; padding: 0; border-radius: 50%;
  border: 1.5px solid var(--cinza-borda); background: var(--branco); color: var(--cinza-texto);
  font: 700 12.5px/1 inherit; cursor: help; display: inline-flex; align-items: center; justify-content: center;
  transition: border-color .12s, color .12s, background .12s;
}
.cartao-info:hover, .cartao-info:focus-visible { border-color: var(--dourado); color: var(--verde-escuro); background: #FFF6E0; outline: none; }
.cartao-info:focus-visible { box-shadow: 0 0 0 2px var(--dourado); }
.cartao-kpi:has(> .cartao-info) .rotulo-kpi { padding-right: 26px; }
.pn-secao-info { display: flex; align-items: center; gap: 8px; }
.pn-secao-info .cartao-info { position: static; }
.info-modal { max-width: min(640px, 94vw) !important; }
.info-sobre { margin: 0 0 2px; font-size: 11px; font-weight: 700; letter-spacing: .05em; text-transform: uppercase; color: var(--dourado); }
.info-bloco { margin-bottom: 16px; }
.info-bloco:last-child { margin-bottom: 0; }
.info-bloco h4 { margin: 0 0 6px; font-size: 12px; text-transform: uppercase; letter-spacing: .04em; color: var(--cinza-texto); }
.info-bloco p { margin: 0; font-size: 14px; line-height: 1.55; }
.info-formula { background: var(--areia); border-left: 3px solid var(--verde-escuro); padding: 8px 12px; border-radius: 6px; font-weight: 600; }
.info-exemplo { background: #FFF6E0; border-left: 3px solid var(--dourado); padding: 8px 12px; border-radius: 6px; color: #4a3b00; }
.info-termos { margin: 0; }
.info-termos dt { font-weight: 700; color: var(--verde-escuro); font-size: 13.5px; margin-top: 10px; }
.info-termos dt:first-child { margin-top: 0; }
.info-termos dd { margin: 3px 0 0; font-size: 13.5px; line-height: 1.5; }
.info-termo-ex { display: block; margin-top: 4px; font-size: 13px; color: var(--cinza-texto); }
.info-obs p { font-size: 13.5px; color: var(--cinza-texto); }

/* ==================================================================
   Manual da tela (20/09/2026) — js/manual.js + js/manuais/<tela>.js
   ================================================================== */
.btn-manual {
  display: inline-flex; align-items: center; gap: 6px; flex: none; margin-left: 4px;
  border: 1px solid var(--cinza-borda); background: var(--branco); color: var(--verde-escuro);
  border-radius: 20px; padding: 5px 12px; font: 600 12.5px var(--fonte); cursor: pointer;
}
.btn-manual:hover, .btn-manual:focus-visible { border-color: var(--dourado); background: var(--tinta-amarela); outline: none; }
.btn-manual.oculto { display: none; }
@media (max-width: 520px) { .btn-manual { padding: 5px 9px; font-size: 0; gap: 0; } .btn-manual span { font-size: 15px; } }

#sobreposicao-manual { z-index: 85; }
.mn-modal { max-width: min(1180px, 97vw) !important; width: 100%; height: min(92vh, 1000px); display: flex; flex-direction: column; }
.mn-cabecalho { gap: 12px; flex-wrap: wrap; }
.mn-cab-texto { min-width: 0; flex: 1 1 280px; }
.mn-doc { margin: 0 0 2px; font-size: 11px; font-weight: 700; letter-spacing: .05em; text-transform: uppercase; color: var(--dourado-texto); }
.mn-cab-acoes { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }
.mn-cab-acoes input[type=search] { width: 230px; padding: 6px 10px; }
.mn-layout { display: grid; grid-template-columns: 250px minmax(0, 1fr); flex: 1; min-height: 0; }
.mn-sumario { border-right: 1px solid var(--cinza-borda); padding: 14px 10px; overflow-y: auto; background: var(--superficie-fraca); }
.mn-sum-tit { margin: 0 8px 8px; font-size: 11px; font-weight: 700; text-transform: uppercase; letter-spacing: .05em; color: var(--cinza-texto); }
.mn-sumario a { display: flex; gap: 8px; align-items: baseline; padding: 7px 8px; border-radius: 8px; color: var(--preto); text-decoration: none; font-size: 13px; line-height: 1.3; }
.mn-sumario a span { color: var(--cinza-texto); font-size: 11.5px; min-width: 16px; font-weight: 700; }
.mn-sumario a:hover { background: var(--tinta-verde); }
.mn-sumario a.ativo { background: var(--tinta-amarela); color: var(--verde-escuro); font-weight: 700; }
.mn-corpo { overflow-y: auto; max-height: none !important; padding: 22px 30px 30px !important; line-height: 1.6; font-size: 14px; scroll-padding-top: 12px; }
.mn-corpo:focus { outline: none; }
.mn-capa-impressao, .mn-titulo-impressao { display: none; }
.mn-resumo { font-size: 15px; color: var(--cinza-texto); margin: 0 0 18px; padding-bottom: 16px; border-bottom: 1px solid var(--cinza-borda); }
.mn-secao { margin-bottom: 30px; }
.mn-secao > h3 { display: flex; align-items: center; gap: 10px; font-size: 18px; margin: 0 0 12px; color: var(--verde-escuro); }
.mn-sec-num { display: inline-flex; align-items: center; justify-content: center; width: 28px; height: 28px; border-radius: 50%; background: var(--verde-escuro); color: var(--branco); font-size: 13px; flex: none; }
[data-tema="escuro"] .mn-sec-num { color: #0A2924; }
.mn-secao h4 { font-size: 14.5px; margin: 18px 0 8px; color: var(--verde-escuro); display: flex; align-items: center; gap: 8px; }
.mn-secao p { margin: 0 0 10px; }
.mn-secao ol, .mn-secao ul { margin: 6px 0 12px; padding-left: 22px; }
.mn-secao li { margin-bottom: 5px; }
.mn-num { display: inline-flex; align-items: center; justify-content: center; min-width: 26px; height: 22px; padding: 0 6px; border-radius: 6px; background: var(--dourado); color: #0A2924; font-size: 12px; font-weight: 700; }
.mn-ficha { display: grid; grid-template-columns: repeat(auto-fit, minmax(min(100%, 220px), 1fr)); gap: 10px; margin: 8px 0 14px; }
.mn-ficha > div { background: var(--superficie-fraca); border: 1px solid var(--cinza-borda); border-radius: 8px; padding: 10px 12px; display: flex; flex-direction: column; gap: 3px; font-size: 13.5px; }
.mn-ficha-larga { grid-column: 1 / -1; }
.mn-ficha small { font-size: 11px; font-weight: 700; text-transform: uppercase; letter-spacing: .04em; color: var(--cinza-texto); }
.mn-dl dt { font-weight: 700; color: var(--verde-escuro); margin-top: 10px; }
.mn-dl dd { margin: 2px 0 0; }
.mn-caixa { border-radius: 8px; padding: 10px 14px; margin: 10px 0 14px; font-size: 13.5px; border-left: 4px solid; }
.mn-caixa > b { display: block; margin-bottom: 4px; }
.mn-caixa p:last-child, .mn-caixa ul:last-child { margin-bottom: 0; }
.mn-caixa-conceito { background: var(--tinta-verde); border-color: var(--verde-escuro); }
.mn-caixa-controle { background: var(--tinta-verde); border-color: var(--verde-ok); }
.mn-caixa-atencao { background: var(--tinta-amarela); border-color: var(--dourado); }
.mn-caixa-resultado { background: var(--tinta-dourada); border-color: var(--dourado); }
.mn-proc, .mn-exemplo { border: 1px solid var(--cinza-borda); border-radius: 10px; padding: 4px 18px 8px; margin-bottom: 14px; background: var(--branco); }
.mn-quando, .mn-cenario { font-size: 13.5px; color: var(--cinza-texto); }
.mn-tabela-rolagem { overflow-x: auto; margin: 6px 0 14px; }
.mn-tabela { width: 100%; border-collapse: collapse; font-size: 13px; }
.mn-tabela th { text-align: left; background: var(--tinta-verde); color: var(--verde-escuro); font-size: 11.5px; text-transform: uppercase; letter-spacing: .03em; padding: 8px 10px; white-space: nowrap; }
.mn-tabela td { border-bottom: 1px solid var(--cinza-borda); padding: 8px 10px; vertical-align: top; white-space: normal !important; }
.mn-tabela td:first-child { min-width: 150px; }
.mn-tabela td.mn-ex { color: var(--cinza-texto); font-style: italic; min-width: 140px; }
.mn-tabela code { font-size: 11.5px; background: var(--tinta-amarela); padding: 1px 5px; border-radius: 4px; white-space: nowrap; }
.mn-obrig { display: inline-block; margin-top: 3px; font-size: 10.5px; font-weight: 700; color: var(--dourado-texto); background: var(--tinta-amarela); border-radius: 10px; padding: 1px 7px; white-space: nowrap; }
.mn-regra { margin-top: 4px; font-size: 12px; color: var(--cinza-texto); }
.mn-regra::before { content: 'Regra: '; font-weight: 700; }
.mn-deps { display: grid; grid-template-columns: repeat(auto-fit, minmax(min(100%, 320px), 1fr)); gap: 14px; }
.mn-dep { border: 1px solid var(--cinza-borda); border-radius: 10px; padding: 2px 16px 8px; border-top: 4px solid var(--verde-escuro); }
.mn-dep-depois { border-top-color: var(--dourado); }
.mn-dep ul { list-style: none; padding: 0; }
.mn-dep li { padding: 8px 0; border-bottom: 1px solid var(--cinza-borda); font-size: 13.5px; }
.mn-dep li:last-child { border-bottom: none; }
.mn-ir { padding: 0 4px; }
.mn-faq { border: 1px solid var(--cinza-borda); border-radius: 8px; padding: 10px 14px; margin-bottom: 8px; }
.mn-faq summary { cursor: pointer; font-weight: 600; color: var(--verde-escuro); }
.mn-faq[open] summary { margin-bottom: 8px; }
.mn-glos-ex { display: block; margin-top: 3px; font-size: 13px; color: var(--cinza-texto); }
.mn-rodape { margin-top: 30px; padding-top: 12px; border-top: 1px solid var(--cinza-borda); font-size: 11.5px; color: var(--cinza-texto); }
mark.mn-achado { background: #FFE08A; color: #262626; border-radius: 3px; padding: 0 1px; }
mark.mn-achado.atual { background: var(--dourado); box-shadow: 0 0 0 2px var(--dourado); }
/* Figuras SVG: cores pelos tokens, valem no claro e no escuro. */
.mn-figura { margin: 12px 0 4px; overflow-x: auto; }
.mn-figura svg { width: 100%; min-width: 620px; height: auto; font-family: var(--fonte); }
.mn-svg-ciclo { fill: none; stroke: var(--verde-escuro); stroke-dasharray: 5 4; opacity: .55; }
.mn-svg-no rect { fill: var(--branco); stroke: var(--verde-escuro); stroke-width: 1.4; }
.mn-svg-no text { fill: var(--preto); font-size: 13px; font-weight: 700; text-anchor: middle; }
.mn-svg-no text.mn-svg-sit { font-size: 11.5px; font-weight: 600; fill: var(--cinza-texto); }
.mn-svg-fim rect { stroke: var(--verde-ok); stroke-width: 2; }
.mn-svg-neg rect { stroke: var(--vermelho); }
.mn-svg-pos rect { stroke: var(--dourado); stroke-dasharray: 4 3; }
.mn-svg-centro rect { fill: var(--tinta-amarela); stroke: var(--dourado); stroke-width: 2; }
.mn-svg-linha { fill: none; stroke: var(--cinza-texto); stroke-width: 1.5; }
.mn-svg-trac { stroke-dasharray: 5 4; }
.mn-svg-seta { fill: var(--cinza-texto); }
.mn-svg-leg { fill: var(--cinza-texto); font-size: 11px; font-weight: 700; letter-spacing: .03em; }
@media (max-width: 760px) {
  .mn-modal { height: 100vh; max-width: 100vw !important; border-radius: 0; }
  .mn-layout { grid-template-columns: 1fr; }
  .mn-sumario { display: flex; gap: 4px; overflow-x: auto; border-right: none; border-bottom: 1px solid var(--cinza-borda); padding: 8px; }
  .mn-sumario a { white-space: nowrap; flex: none; }
  .mn-sum-tit { display: none; }
  .mn-corpo { padding: 16px 16px 24px !important; }
  .mn-cab-acoes input[type=search] { width: 100%; flex: 1 1 160px; }
}

/* Impressão / PDF do manual: só o conteúdo, com cabeçalho de documento. */
@media print {
  body.imprimindo-manual > *:not(#sobreposicao-manual) { display: none !important; }
  body.imprimindo-manual #sobreposicao-manual, body.imprimindo-manual #sobreposicao-manual * { visibility: visible !important; }
  body.imprimindo-manual #sobreposicao-manual { position: static !important; display: block !important; background: none !important; padding: 0 !important; overflow: visible !important; }
  body.imprimindo-manual .mn-modal { box-shadow: none !important; max-width: none !important; width: auto !important; height: auto !important; display: block !important; transform: none !important; border-radius: 0; }
  body.imprimindo-manual .mn-cabecalho, body.imprimindo-manual .mn-sumario { display: none !important; }
  body.imprimindo-manual .mn-layout { display: block !important; }
  body.imprimindo-manual .mn-corpo { overflow: visible !important; height: auto !important; padding: 0 !important; color: #262626; }
  body.imprimindo-manual .mn-capa-impressao { display: flex !important; align-items: center; gap: 12px; background: #0A2924; color: #fff; padding: 14px 18px; border-radius: 8px; margin-bottom: 14px; -webkit-print-color-adjust: exact; print-color-adjust: exact; }
  body.imprimindo-manual .mn-capa-impressao img { width: 34px; height: 34px; }
  body.imprimindo-manual .mn-capa-impressao b { display: block; font-size: 16px; }
  body.imprimindo-manual .mn-capa-impressao span { display: block; font-size: 11px; opacity: .85; }
  body.imprimindo-manual .mn-capa-doc { margin-left: auto; text-align: right; }
  body.imprimindo-manual .mn-capa-doc b { color: #FFAD00; }
  body.imprimindo-manual .mn-titulo-impressao { display: block !important; font-size: 20px; color: #0A2924; margin: 0 0 6px; }
  body.imprimindo-manual .mn-secao { break-inside: auto; }
  body.imprimindo-manual .mn-proc, body.imprimindo-manual .mn-exemplo, body.imprimindo-manual .mn-tabela tr, body.imprimindo-manual .mn-figura { break-inside: avoid; }
  body.imprimindo-manual .mn-secao > h3 { break-after: avoid; }
  body.imprimindo-manual .mn-ir { display: none !important; }
  body.imprimindo-manual .mn-sec-num { -webkit-print-color-adjust: exact; print-color-adjust: exact; }
  body.imprimindo-manual .mn-figura svg { min-width: 0; }
  @page { margin: 14mm 12mm; }
}
.mn-ficha ul { margin: 2px 0 0; padding-left: 18px; }
.mn-ficha li { margin-bottom: 3px; }
@media (max-width: 760px) {
  #sobreposicao-manual { padding: 0 !important; align-items: stretch !important; }
  #sobreposicao-manual .mn-modal { margin: 0 !important; width: 100vw; max-height: 100vh; }
  .mn-cabecalho { position: relative; padding-right: 50px !important; }
  #fechar-manual { position: absolute; top: 10px; right: 10px; }
  .mn-cab-acoes { width: 100%; flex-wrap: nowrap; }
  #mn-imprimir { white-space: nowrap; }
}
