/* ==========================================================================
   Tema Next ERP.

   A identidade antiga (Uniplus) era vermelha -- o flamingo #eb575a herdado de
   login_files/styles.ec41ca96b6a4810b.css. A marca passou a ser Next ERP, azul.

   A troca acontece SO aqui: nao existem `.bg-red`, `.navbar` ou classes com cor
   fixa espalhadas pela folha. Tudo o que era vermelho lia `var(--up-flamingo*)`,
   token que virou `--up-primaria*` -- nome semantico, para que a proxima
   mudanca de marca continue sendo so estas quatro linhas. Quem consome:
   .btn-primary (Bootstrap), .item-menu:hover, .modulo.aberto, .aba-interna.ativa,
   .chip-filtro, o realce de linha do AG Grid e os cabecalhos de seccao.

   Medidas e neutros seguem os do sistema real:
     .navbar-white -> 1.4px #cfd8dc      .text-cinza-chumbo -> #57525a
     .card-shadow  -> 0 -1px 6px #00060c33
     fonte         -> "FS Truman", Calibri
   ========================================================================== */

:root {
  /* Marca Next ERP. O tom primario e o mesmo azul do botao ENTRAR da tela de
     login e da seta clara do logotipo. */
  --up-primaria: #2e2edb;
  --up-primaria-escuro: #2424b0; /* hover/ativo */
  --up-primaria-claro: #b9baf0;  /* desabilitado e borda de campo em foco */
  --up-primaria-fundo: #eeeffe;  /* realce suave: chips, hover de linha/menu */

  /* Azul escuro da marca: a seta cheia do logotipo e os titulos fortes. */
  --up-marca-escura: #151a3d;

  /* Azuis de apoio, herdados do sistema (links, linha selecionada na grade).
     Sao outra familia: nao confundir com --up-primaria. */
  --up-azul: #0032a0e6;
  --up-azul-escuro: #004664;
  --up-azul-sky: #36a9e1;
  --up-azul-royal: #0050a0; /* --azul-royal-01 */

  /* Neutros */
  --up-cinza-chumbo: #57525a;
  --up-borda: #cfd8dc;
  --up-borda-suave: #e3e7ea;
  --up-cinza-frio: #f5f5f5;
  --up-texto: #2f3438;
  --up-texto-suave: #7b8085;

  /* Indigo da marca. Era o papel de parede da area de trabalho (hoje ela usa
     o mesmo fundo claro do login); segue como cor da barrinha de navegacao. */
  --up-desktop: #4d58b8;

  /* Intervencao administrativa: alguem com mais poder desfez o que outra
     pessoa estava fazendo. Hoje so a liberacao da trava de edicao por um
     supervisor, na Rastreabilidade (.evento-edicao_liberada). Ambar de
     proposito -- nao e erro (vermelho) nem conclusao (verde), e um aviso de
     que houve mao humana por cima. */
  --up-intervencao: #b07d2b;
  /* Fundo do mesmo ambar, para ETIQUETA de algo que espera uma decisao
     humana -- hoje o lojista "Pendente" do Catalogo virtual. Com o texto em
     --up-intervencao por cima, e o "falta alguem olhar" da grade. */
  --up-intervencao-fundo: #f8eedb;

  /* Botoes de ACAO DA LINHA com cor pelo significado (24/09/2026, pedido do
     cliente na grade Categorias e Departamentos: so a lixeira tinha cor e o
     resto parecia desligado). Mesmas cores dos botoes de tela da casa:
     incluir/ativar = verde do .botao-incluir, alterar = petroleo do "Alterar
     (F3)" do pedido (.botao-nf-alterar). Inativar e ambar: tira de exibicao
     mas nao apaga -- nem o vermelho da lixeira nem o verde de criar. */
  --up-acao-incluir: #55a459;
  --up-acao-incluir-escuro: #468f4a;
  --up-acao-alterar: #26808f;
  --up-acao-alterar-escuro: #1d6672;
  --up-acao-inativar: #e08e1b;
  --up-acao-inativar-escuro: #b87212;
  /* Excluir da barra de ferramentas (Tipos de Documento Financeiro,
     26/09/2026): o vermelho do .btn-danger do ERP original, o mesmo do
     .botao-excluir-item das grades */
  --up-acao-excluir: #d70a23;
  --up-acao-excluir-escuro: #b40a1e;

  /* Tipo do documento na Expedicao > Entregas (01/10/2026, "Modelo A"):
     a etiqueta Pedido / NF-e / NFC-e de cada linha. Tres familias que o olho
     separa de longe: o azul royal dos pedidos (o mesmo das listas de venda),
     o petroleo do fiscal (o "Alterar (F3)" da nota, --up-acao-alterar) e um
     roxo proprio para o cupom do caixa. O fundo claro de cada um vem junto. */
  --up-tipo-pedido: var(--up-azul-royal);
  --up-tipo-pedido-fundo: #e6eef8;
  --up-tipo-nfe: var(--up-acao-alterar-escuro);
  --up-tipo-nfe-fundo: #dff0f2;
  --up-tipo-nfce: #5a3f8f;
  --up-tipo-nfce-fundo: #ece7f6;
  /* Situacao "Acerto financeiro" da carga (01/10/2026): a quarta situacao,
     depois de Baixada (verde). Ambar/azul/verde ja contam Aberta/Fechada/
     Baixada, entao o acerto (dinheiro conferido) ganha o roxo -- emprestado
     do cupom do caixa, a outra cor "de dinheiro" da tela. Consomem: a
     etiqueta .tom-acerto, a bolinha do Kanban e a linha do tempo. */
  --up-acerto: var(--up-tipo-nfce);
  --up-acerto-fundo: var(--up-tipo-nfce-fundo);
  /* Realce translucido SOBRE o azul escuro da marca (o contador do painel
     "Montar carga" e o fundo do icone da faixa do formulario da carga):
     clareia o que estiver embaixo, sem inventar um terceiro azul. */
  --up-realce-sobre-escuro: rgba(255, 255, 255, 0.14);
  /* Coluna de perfil das fichas de cadastro (Modelo B, 03/10/2026): o texto
     secundario (rotulos, "sem e-mail", "Cadastrado em") e o filete entre os
     grupos SOBRE o azul escuro. O --up-texto-suave some no escuro; este e um
     lilas claro tirado do proprio azul da marca (contraste 7,6:1). */
  --up-texto-sobre-escuro-suave: #a9add0;
  --up-divisor-sobre-escuro: rgba(255, 255, 255, 0.12);
  /* Fundo das colunas do Kanban de cargas (Entregas, 01/10/2026): um cinza
     azulado um tom abaixo do papel de parede, para os cartoes brancos de
     dentro se destacarem sem precisar de sombra forte. */
  --up-coluna-kanban: #eceff5;
  /* Trilho das abas em pilulas das Entregas (o topo do Modelo B do canvas,
     01/10/2026): a aba ativa e a pilula branca por cima dele. */
  --up-pilulas-fundo: #e3e7ef;
  /* Tipo de pessoa no cadastro de Clientes (Modelo A, 01/10/2026): o circulo
     das iniciais e a etiqueta Juridica/Fisica da grade. Emprestados das
     familias dos tipos de documento (azul royal e petroleo), que o olho ja
     separa de longe -- nao sao cores novas, sao nomes com o sentido certo. */
  --up-pessoa-juridica: var(--up-tipo-pedido);
  --up-pessoa-juridica-fundo: var(--up-tipo-pedido-fundo);
  --up-pessoa-fisica: var(--up-tipo-nfe);
  --up-pessoa-fisica-fundo: var(--up-tipo-nfe-fundo);

  /* Estrela da pauta FAVORITA (Painel Admin > Usuarios): o dourado pedido
     pelo usuario para "a pauta que abre no pedido". E vizinho do
     --up-intervencao, mas nao e o mesmo tom nem o mesmo sentido: aquele avisa
     que alguem interveio, este marca uma escolha preferida. */
  --up-favorita: #e0a516;

  /* "So com autorizacao": hoje o cadeado FECHADO do seletor de pautas
     (Painel Admin > Usuarios) e a contagem dele no resumo da celula -- a
     pauta aparece para o vendedor, mas so entra no pedido com a senha de um
     supervisor. Nao e erro nem recusa de uma acao, mas divide com elas o
     vermelho que ja existia solto na folha (#c0392b do
     .acesso-desenvolvedor-erro), agora com nome. */
  --up-restrito: #c0392b;

  /* Pendencia esperando o operador (Minhas Notificacoes, 24/09/2026): o
     contador ao lado do nome e o cartao da notificacao pendente. O mesmo
     vermelho de recusa da casa, com nome proprio: aqui o sentido e "ha um
     problema esperando voce", nao "so com autorizacao". O fundo claro e o do
     circulo do icone e da etiqueta "Pendente". */
  --up-pendencia: var(--up-restrito);
  --up-pendencia-fundo: #fbeae8;
  /* ...e a notificacao resolvida: o verde das etiquetas "Liberado"/"Nao
     faturado" (.etiqueta-status), que ate aqui estava solto na folha. */
  --up-resolvida: #3d7a42;
  --up-resolvida-fundo: #e3f1e4;
  /* borda do botao claro sobre o `--up-resolvida-fundo` ("Copiar Orcamento"
     do Pedido/Orcamento, facelift de 04/10/2026) */
  --up-resolvida-borda: #bfdcc2;
  /* fundo da linha do somatorio (Sigma) no pe das grades AG Grid */
  --up-grade-rodape: #f2f5f7;

  /* Dinheiro que entra e que sai da conta (extrato da Conta Corrente Banco,
     26/09/2026): coluna Entrada/Saida, saldo negativo e a borda dos cartoes
     do resumo. Apontam para o verde do resolvido e o vermelho do restrito
     para o extrato nao inventar um terceiro verde/vermelho. */
  --up-dinheiro-entrada: var(--up-resolvida);
  --up-dinheiro-saida: var(--up-restrito);

  /* Concilia-Pro (04/10/2026): a cor de cada tipo de sugestao -- a etiqueta,
     o sinal redondo e o botao da linha. Apontam para cores que a casa ja usa
     com o mesmo sentido: verde do resolvido (exato), ambar da intervencao
     (provavel), roxo do acerto (soma), azul do andamento (titulo a baixar),
     o verde-agua da NF-e (regra/transferencia) e o vermelho da pendencia
     (sem par). */
  --up-cpro-exato: var(--up-resolvida);
  --up-cpro-exato-fundo: var(--up-resolvida-fundo);
  --up-cpro-provavel: var(--up-intervencao);
  --up-cpro-provavel-fundo: var(--up-intervencao-fundo);
  --up-cpro-soma: var(--up-acerto);
  --up-cpro-soma-fundo: var(--up-acerto-fundo);
  --up-cpro-titulo: var(--up-status-andamento);
  --up-cpro-titulo-fundo: var(--up-status-andamento-fundo);
  --up-cpro-regra: var(--up-tipo-nfe);
  --up-cpro-regra-fundo: var(--up-tipo-nfe-fundo);
  --up-cpro-sem: var(--up-pendencia);
  --up-cpro-sem-fundo: var(--up-pendencia-fundo);
  /* Boletos no banco (05/10/2026): a situacao de cada boleto no banco */
  --up-bb-cobranca: var(--up-tipo-pedido);
  --up-bb-cobranca-fundo: var(--up-tipo-pedido-fundo);
  --up-bb-vencido: #8a5f17; /* o ambar da intervencao escurecido para o texto */
  --up-bb-vencido-fundo: var(--up-intervencao-fundo);
  --up-bb-baixado: var(--up-pendencia);
  --up-bb-baixado-fundo: var(--up-pendencia-fundo);
  --up-bb-pedida: var(--up-acerto);
  --up-bb-pedida-fundo: var(--up-acerto-fundo);
  --up-bb-rejeitado: var(--up-cinza-chumbo);
  --up-bb-rejeitado-fundo: #eceff3;

  /* Saldo negativo SOBRE a faixa escura do extrato (03/10/2026): o vermelho
     do --up-dinheiro-saida some no azul escuro; este e o mesmo aviso, claro. */
  --up-negativo-sobre-escuro: #ffb4ab;
  /* ...e os outros dois indicadores da mesma faixa (Modelo A do canvas
     "Extrato com grade maior", 03/10/2026): Entradas e Conciliados no verde
     claro, A conciliar no ambar claro -- o verde do resolvido e o ambar da
     intervencao somem no azul escuro, como o vermelho. */
  --up-positivo-sobre-escuro: #8fdc9c;
  --up-atencao-sobre-escuro: #ffd28a;
  /* Fundo dos indicadores que filtram sobre a faixa escura: apagado, e o
     aceso (o filtro aplicado) com a borda quase branca. O --up-realce-
     sobre-escuro fica no meio dos dois e e a borda do apagado. */
  --up-indicador-sobre-escuro: rgba(255, 255, 255, 0.07);
  --up-indicador-ativo-sobre-escuro: rgba(255, 255, 255, 0.18);
  --up-borda-ativa-sobre-escuro: rgba(255, 255, 255, 0.75);

  /* Pilula da forma de pagamento PIX na grade do extrato (03/10/2026): o
     verde-azulado separa o PIX (a maioria das entradas) do "Conta corrente"
     no cinza da pilula. */
  --up-forma-pix: #1f7a6a;
  --up-forma-pix-fundo: #e3f3ef;

  /* Barra "X de N conciliados" na faixa escura da conciliacao por arquivo
     (03/10/2026): o verde do resolvido nao aparece sobre o azul escuro. */
  --up-progresso-sobre-escuro: #7bd389;

  /* Base do papel de parede (fundo-login.svg), usada pelas telas que o
     exibem: .pagina-login, .app-uniplus e o painel .corpo-status (Status
     retirada). E o que aparece enquanto o SVG nao carregou e nas sobras do
     `cover`, entao precisa acompanhar o tom do desenho -- por isso token, e
     nao o hex repetido em cada lugar. */
  --up-papel-parede: #f4f7fd;

  /* Painel Status retirada (Expedicao > Status, 25/09/2026): a cor de cada
     coluna diz em que ponto o pedido esta, para o cliente achar o dele de
     longe. Reaproveitam o sentido de tons que a casa ja tem -- espera = o
     ambar de "falta alguem olhar", andamento = o azul royal das perguntas,
     pronto = o verde de resolvido. So o fundo do andamento e novo. */
  --up-status-espera: var(--up-intervencao);
  --up-status-espera-fundo: var(--up-intervencao-fundo);
  --up-status-andamento: var(--up-azul-royal);
  --up-status-andamento-fundo: #e6f0fa;
  --up-status-pronto: var(--up-resolvida);
  --up-status-pronto-fundo: var(--up-resolvida-fundo);

  /* Confirmacao/descarte dos dialogos. Eram laranja fixo (#e47646/#d4622b) da
     folha antiga -- viraram token para acompanharem a marca. */
  --up-confirmar: #2e2edb;
  --up-confirmar-escuro: #2424b0;
  /* "Gerar PDF" da confirmacao de gravacao: o mesmo verde do Gerar PDF da
     janela Imprimir da listagem (.botao-gravar), para o operador reconhecer
     a acao nas duas telas */
  --up-gerar-pdf: #55a459;
  --up-gerar-pdf-escuro: #468f4a;

  /* Sombras e medidas */
  --up-sombra-card: 0 -1px 6px #00060c33;
  --up-sombra-menu: 0 6px 14px rgba(0, 6, 12, 0.18);
  --up-sombra-login: 0 6px 26px rgba(0, 6, 12, 0.16);
  /* Telas do financeiro com visual proprio (`.fin-tela`, 28/09/2026): o
     branco dos cartoes sobre o fundo claro da area de trabalho e a sombra
     leve que os destaca -- tingida do azul escuro da marca, nao do preto. */
  --up-superficie: #fff;
  --up-sombra-cartao-leve: 0 1px 3px rgba(21, 26, 61, 0.07);
  /* Cabecalho global. Em 22/09/2026 as tres barras (saudacao + modulos +
     abas) desceram de 146px para ~96px, para sobrar area util nas telas de
     lancamento. A casca nova (Modelo A do canvas, aprovado em 02/10/2026)
     voltou a crescer -- cabecalho com o cartao do usuario, faixa escura de
     modulos com o icone em quadradinho colorido e abas com icone -- e soma
     134px (50 + 46 + 38). Os 52/52/42 do canvas foram apertados aqui para
     nao roubar mais altura das telas fixas (.fin-tela, .ent-tela). */
  --up-header-altura: 50px;
  --up-barra-modulos-altura: 46px;
  --up-faixa-abas-altura: 38px;

  /* Casca nova (02/10/2026). A faixa dos modulos e o azul escuro da marca;
     a das abas, o cinza-azulado onde a aba branca da tela aberta se destaca.
     O veu escurece a tela atras do painel do modulo aberto. */
  --up-faixa-modulos: var(--up-marca-escura);
  --up-faixa-abas: #eceff5;
  --up-veu-menu: rgba(21, 26, 61, 0.22);
  /* veu mais leve atras do painel "Filial de trabalho": e um painel pequeno */
  --up-veu-filial: rgba(21, 26, 61, 0.12);
  /* aba de fundo: branco translucido sobre a faixa, mais firme no hover */
  --up-aba-fundo: rgba(255, 255, 255, 0.45);
  --up-aba-fundo-hover: rgba(255, 255, 255, 0.8);
  --up-sombra-painel-modulo: 0 22px 44px rgba(21, 26, 61, 0.2);
  /* Busca rapida do topo (04/10/2026): o amarelo-claro atras das letras do
     nome da tela que bateram com o que foi digitado (.busca-rapida-marca) */
  --up-busca-realce: #fff0b3;

  /* Aviso "Aguarde" (03/10/2026, Modelo C do canvas): faixa no azul escuro
     da marca, "Aguarde" em branco e a frase do motivo num lilas claro, que
     fica em segundo plano sem perder a leitura sobre o escuro. */
  --up-aguarde-fundo: var(--up-marca-escura);
  --up-aguarde-texto: #ffffff;
  --up-aguarde-frase: #c9cdea;
  --up-aguarde-sombra: 0 10px 28px rgba(21, 26, 61, 0.28);

  /* Filtros rapidos das listas de venda (03/10/2026): a bolinha de cada
     situacao repete a cor do TEXTO da etiqueta dela na grade
     (.etiqueta-status.status-N), para o botao e a coluna se reconhecerem.
     PDV e Pedido gerado ficam no cinza, como la. */
  --up-situacao-aberta: #3d7a42;
  --up-situacao-cancelada: var(--up-primaria-escuro);
  --up-situacao-nota: var(--up-azul-royal);
  --up-situacao-outra: var(--up-cinza-chumbo);

  /* Cor de cada modulo (casca nova, 02/10/2026): pinta o quadradinho do
     icone na faixa, os icones do painel e o friso da aba aberta. O -fundo e
     o tom claro atras do icone. Os tons escuros passam 4.5:1 sobre branco.
     Cadastros fica com a marca; Fiscal, com o royal que ja era do fiscal.
     `mod-sistema` e o de telas fora dos modulos (Painel Admin, notificacoes). */
  --up-mod-cadastros: var(--up-primaria);
  --up-mod-cadastros-fundo: var(--up-primaria-fundo);
  --up-mod-vendas: #0e7c86;
  --up-mod-vendas-fundo: #e0f2f3;
  --up-mod-financeiro: #2f7d3a;
  --up-mod-financeiro-fundo: #e3f1e4;
  --up-mod-expedicao: #b45309;
  --up-mod-expedicao-fundo: #fdeedd;
  --up-mod-fiscal: var(--up-azul-royal);
  --up-mod-fiscal-fundo: var(--up-tipo-pedido-fundo);
  --up-mod-catalogo: #6b3fa0;
  --up-mod-catalogo-fundo: #efe8f8;
  --up-mod-ferramentas: #4a5568;
  --up-mod-ferramentas-fundo: #eceff3;
  --up-mod-sistema: var(--up-marca-escura);
  --up-mod-sistema-fundo: #e8e9f0;

  /* A folha original usa "FS Truman"; o arquivo da fonte nao acompanha a
     pagina salva, entao Calibri (o proprio fallback deles) assume. */
  --up-fonte: "FS Truman", Calibri, "Segoe UI", system-ui, sans-serif;
}

body {
  font-family: var(--up-fonte);
  font-size: 13px;
  color: var(--up-texto);
  background-color: #fff;
}

/* --- Icones --------------------------------------------------------------- */

/* Todo icone sai de partials/icones.html com class="icone". O TAMANHO continua
   vindo do atributo width/height que cada chamada passa (`ico.pessoa(15)`),
   e nao daqui: os tamanhos ja estao afinados tela a tela, de 13px no lapis da
   grade a 22px no envio de arquivo do admin. Pisar neles com um `width` fixo
   no CSS quebraria esses ajustes.
   Logo, esta classe cuida so do que o atributo nao resolve: */
.icone {
  /* nunca espremer o icone quando o texto ao lado e longo */
  flex: 0 0 auto;
  /* alinha com a linha de base do texto quando o pai NAO e flex */
  vertical-align: -0.14em;
}

/* A COR e o ESPACO nao ficam aqui de proposito:
   - cor: e contextual. O icone herda `currentColor`, entao segue a cor do item
     (.item-menu svg -> azul, .botao-acao svg -> branco, .modulo svg -> grafite).
     Fixar um cinza nesta classe atropelaria todos esses casos.
   - espaco: os menus e botoes sao flex e ja separam icone e texto com `gap`
     (.item-menu 0.45rem, .modulo 0.4rem, .grupo-titulo 0.5rem). Um
     `margin-right` aqui SOMARIA ao gap e o respiro sairia dobrado. */

/* --- Logotipo ------------------------------------------------------------- */

.marca-lockup {
  display: inline-flex;
  align-items: flex-start;
  line-height: 1.1;
}

.marca {
  display: block;
  height: 2.4rem;
  width: auto;
}

/* ==========================================================================
   Componentes do Bootstrap alinhados ao tema
   ========================================================================== */

.btn {
  font-family: var(--up-fonte);
}

.btn-primary {
  --bs-btn-bg: var(--up-primaria);
  --bs-btn-border-color: var(--up-primaria);
  --bs-btn-hover-bg: var(--up-primaria-escuro);
  --bs-btn-hover-border-color: var(--up-primaria-escuro);
  --bs-btn-active-bg: #b74c51;
  --bs-btn-active-border-color: #b74c51;
  --bs-btn-disabled-bg: var(--up-primaria-claro);
  --bs-btn-disabled-border-color: var(--up-primaria-claro);
  --bs-btn-focus-shadow-rgb: 235, 87, 90;
}

.form-control:focus,
.form-select:focus {
  border-color: var(--up-primaria-claro);
  box-shadow: 0 0 0 0.2rem rgba(235, 87, 90, 0.18);
}

.spinner-border {
  color: var(--up-primaria);
}

.card {
  --bs-card-border-color: var(--up-borda-suave);
}

.card-header {
  background-color: var(--up-cinza-frio);
  border-bottom-color: var(--up-borda-suave);
  color: var(--up-azul);
  font-weight: 600;
}

/* ==========================================================================
   Tela de login (Next ERP)

   Escrita sem Bootstrap: o login.html carrega SO esta folha, entao tudo o que
   a tela usa -- inclusive .visually-hidden, que antes vinha do framework --
   precisa estar aqui. As demais telas continuam com o Bootstrap carregado
   antes do app.css; a redeclaracao abaixo e identica a dele e nao muda nada la.
   ========================================================================== */

/* Mesma regra do Bootstrap: some da tela, continua no leitor de tela. */
.visually-hidden {
  position: absolute !important;
  width: 1px !important;
  height: 1px !important;
  padding: 0 !important;
  margin: -1px !important;
  overflow: hidden !important;
  clip: rect(0, 0, 0, 0) !important;
  white-space: nowrap !important;
  border: 0 !important;
}

/* A pagina de login e a unica que rola livremente -- .app-uniplus (o corpo do
   sistema) trava em 100vh. Por isso a casca aqui e um corpo proprio. */
.corpo-login {
  margin: 0;
  min-height: 100vh;
}

/* Grade de 3 faixas: logo | cartao | rodape. As faixas de cima e de baixo
   dividem a sobra por igual, entao e o CARTAO que fica no centro vertical
   da tela (e nao o conjunto logo + cartao). Quando a janela e baixa, a faixa
   de baixo cede ate o tamanho do rodape e o cartao sobe o necessario para
   caber -- o minimo deixou de ser 0 quando o rodape entrou ali, senao a faixa
   colapsava e a assinatura passava por cima do cartao.

   `border-box`: sem ele o padding somava aos 100vh e a pagina sempre ganhava
   uma barra de rolagem. So rola se a janela for menor que logo + cartao. */
.pagina-login {
  box-sizing: border-box;
  /* altura DEFINIDA (e nao min-height): com min-height a grade reservava para
     a faixa de baixo o mesmo tamanho do logo e gerava rolagem em tela baixa.
     Se a janela for menor que logo + cartao, o conteudo passa da altura e o
     proprio corpo rola, como deve. */
  height: 100vh;
  display: grid;
  grid-template-rows: minmax(max-content, 1fr) auto minmax(max-content, 1fr);
  justify-items: center;
  padding: 1rem;

  /* fundo-login.svg traz o degrade e as setas; `cover` mantem a decoracao nos
     cantos em qualquer proporcao de janela (ver o comentario no proprio SVG) */
  background-color: var(--up-papel-parede);
  background-image: url("/static/img/fundo-login.svg");
  background-repeat: no-repeat;
  background-position: center;
  background-size: cover;
  background-attachment: fixed;
}

.login-logo {
  display: block;
  align-self: end;
  width: auto;
  height: 6.5rem;
  max-width: min(22rem, 80vw);
  margin-bottom: 2.5rem;
}

/* --- Cartao --------------------------------------------------------------- */

.cartao-login {
  width: 100%;
  max-width: 26rem;
  padding: 2rem 1.9rem 1.6rem;
  background-color: #fff;
  border-radius: 0.9rem;
  box-shadow: 0 18px 44px rgba(20, 30, 70, 0.12), 0 2px 6px rgba(20, 30, 70, 0.06);
}

/* --- Campos --------------------------------------------------------------- */

/* Um unico retangulo arredondado com o icone dentro, e nao input-group com
   caixas emendadas: e assim que a referencia desenha o campo. A borda vive no
   .campo-login (o pai), o <input> entra sem borda nenhuma -- por isso o foco
   precisa ser :focus-within e nao :focus. */
.campo-login {
  display: flex;
  align-items: center;
  margin-bottom: 0.7rem;
  border: 1.5px solid var(--up-borda);
  border-radius: 0.55rem;
  background-color: #fff;
  transition: border-color 0.15s, background-color 0.15s, box-shadow 0.15s;
}

.campo-login:focus-within {
  border-color: var(--up-primaria-claro);
  background-color: var(--up-primaria-fundo);
  box-shadow: 0 0 0 3px rgba(46, 46, 219, 0.08);
}

.campo-login-icone {
  display: flex;
  align-items: center;
  flex: 0 0 auto;
  padding: 0 0.7rem 0 0.85rem;
  color: var(--up-cinza-chumbo);
}

.campo-login:focus-within .campo-login-icone {
  color: var(--up-primaria);
}

.campo-login-entrada {
  flex: 1 1 auto;
  /* largura minima zero: sem isso o input impoe o tamanho padrao dele e
     estoura o cartao em telas estreitas */
  min-width: 0;
  padding: 0.7rem 0.9rem 0.7rem 0;
  border: 0;
  background: none;
  font-family: var(--up-fonte);
  font-size: 0.95rem;
  color: var(--up-texto);
}

.campo-login-entrada::placeholder {
  color: var(--up-texto-suave);
}

.campo-login-entrada:focus {
  outline: none; /* o realce e a borda do .campo-login inteiro */
}

/* Autofill do Chrome pinta o input de amarelo e ignora background-color;
   a sombra interna e a unica forma de cobrir. */
.campo-login-entrada:-webkit-autofill,
.campo-login-entrada:-webkit-autofill:focus {
  -webkit-box-shadow: 0 0 0 40rem #fff inset;
  -webkit-text-fill-color: var(--up-texto);
}

/* --- Campo com problema ---------------------------------------------------- */

/* Borda e icone em vermelho; o aviso logo abaixo diz o que falta. A classe
   `tremer` e posta pelo login.js a cada tentativa recusada -- um balanco
   curto, so para puxar o olho para o campo certo. */
.campo-login.invalido,
.campo-login.invalido:focus-within {
  border-color: #e0898b;
  background-color: #fff;
  box-shadow: 0 0 0 3px rgba(217, 83, 79, 0.1);
}

.campo-login.invalido .campo-login-icone {
  color: #c9423f;
}

.campo-login.tremer {
  animation: tremer-campo-login 0.32s ease-in-out;
}

@keyframes tremer-campo-login {
  0%, 100% { transform: translateX(0); }
  20%      { transform: translateX(-5px); }
  40%      { transform: translateX(5px); }
  60%      { transform: translateX(-3px); }
  80%      { transform: translateX(3px); }
}

/* O aviso encosta no campo (margem negativa come o respiro do .campo-login)
   e entra deslizando de leve. */
.aviso-campo-login {
  margin: -0.35rem 0 0.7rem 0.2rem;
  font-size: 0.82rem;
  color: #b53a37;
  animation: surgir-aviso-login 0.2s ease-out;
}

.aviso-campo-login[hidden] {
  display: none;
}

@keyframes surgir-aviso-login {
  from { opacity: 0; transform: translateY(-4px); }
  to   { opacity: 1; transform: translateY(0); }
}

.campo-login-olho {
  display: flex;
  align-items: center;
  flex: 0 0 auto;
  padding: 0 0.85rem;
  border: 0;
  background: none;
  color: var(--up-texto-suave);
}

.campo-login-olho:hover {
  color: var(--up-primaria);
}

.campo-login-olho:focus-visible {
  outline: 2px solid var(--up-primaria-claro);
  outline-offset: 2px;
  border-radius: 4px;
}

/* Um olho de cada vez: `aria-pressed` ja diz qual estado e, entao o CSS
   apenas segue o mesmo atributo em vez de uma classe paralela. */
.campo-login-olho .olho-aberto,
.campo-login-olho[aria-pressed="true"] .olho-fechado {
  display: none;
}

.campo-login-olho[aria-pressed="true"] .olho-aberto {
  display: block;
}

/* --- Manter conectado ---------------------------------------------------- */

.opcoes-login {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 1rem;
  flex-wrap: wrap;
  margin: 0.9rem 0 0.2rem;
  font-size: 0.85rem;
}

.lembrar-login {
  display: inline-flex;
  align-items: center;
  gap: 0.45rem;
  color: var(--up-texto);
}

.lembrar-login input {
  width: 1rem;
  height: 1rem;
  accent-color: var(--up-primaria);
}

/* --- Botao ---------------------------------------------------------------- */

.botao-entrar {
  display: block;
  width: 100%;
  margin-top: 1.1rem;
  padding: 0.8rem 1rem;
  border: 0;
  border-radius: 0.55rem;
  background-color: var(--up-primaria);
  font-family: var(--up-fonte);
  font-size: 0.95rem;
  font-weight: 700;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: #fff;
  transition: background-color 0.15s;
}

.botao-entrar:hover {
  background-color: var(--up-primaria-escuro);
}

.botao-entrar:focus-visible {
  outline: 2px solid var(--up-primaria-escuro);
  outline-offset: 2px;
}

/* Enquanto o login.js espera a resposta: evita o duplo clique. */
.botao-entrar:disabled {
  background-color: var(--up-primaria-claro);
}

@media (prefers-reduced-motion: reduce) {
  .campo-login,
  .botao-entrar {
    transition: none;
  }

  .campo-login.tremer,
  .aviso-campo-login {
    animation: none;
  }
}

/* --- Rodape: versao da build + direitos autorais -------------------------- */

/* Mora na terceira faixa da grade e encosta na base da janela (`align-self:
   end`). Discreto de proposito: e assinatura e conferencia de versao, nao
   informacao de uso. */
.rodape-login {
  align-self: end;
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
  align-items: center;
  gap: 0.15rem 0.5rem;
  margin-top: 1.5rem;
  padding-top: 0.75rem;
  color: var(--up-texto-suave);
  font-size: 0.78rem;
  line-height: 1.5;
  text-align: center;
}

.rodape-login-versao {
  font-weight: 600;
  color: var(--up-cinza-chumbo);
}

/* Some junto com a quebra de linha: empilhado, o ponto separador vira sujeira
   no meio da coluna. */
.rodape-login-separador {
  color: var(--up-primaria-claro);
}

@media (max-width: 575.98px) {
  .pagina-login {
    padding: 1rem;
    /* `fixed` custa caro em rolagem no iOS e nem sempre e respeitado */
    background-attachment: scroll;
  }

  .login-logo {
    height: 4.4rem;
    margin-bottom: 1.75rem;
  }

  .cartao-login {
    padding: 1.6rem 1.25rem 1.25rem;
  }

  .rodape-login {
    flex-direction: column;
    margin-top: 1.25rem;
    font-size: 0.72rem;
  }

  .rodape-login-separador {
    display: none;
  }
}

/* ==========================================================================
   Tela de login Conectsys (TESTE da marca nova, 04/10/2026)
   So o login.html usa: escopo .lg. Duas aparencias na mesma marcacao,
   trocadas pelo botao "Aparencia" (login.js -> data-aparencia):
     a = Dividida: painel azul-marinho com a frase | cartao branco com o logo
     c = Escuro: logo no topo, formulario a esquerda, elos grandes a direita
   Reaproveita os componentes do bloco acima (.campo-login, avisos, olho,
   .botao-entrar) e so troca a roupa deles aqui dentro.
   ========================================================================== */

/* Sora (SIL Open Font License), recortada para o latim e servida daqui: a CSP
   so aceita fonte do proprio servidor (font-src self). Arquivo variavel:
   um so cobre os pesos 400 a 700. */
@font-face {
  font-family: "Sora";
  src: url("/static/fonts/sora.woff") format("woff");
  font-weight: 100 800;
  font-display: swap;
}

.lg {
  --lg-marinho: #0D1F3C;
  --lg-noite: #0A1830;
  --lg-azul: #1557B0;
  --lg-laranja: #F5A04B;
  --lg-fundo: #EEF3FA;
  --lg-texto: #0D1F3C;
  --lg-rotulo: #23365C;
  --lg-suave: #46567A;
  --lg-icone: #6B7A99;
  --lg-borda: #D5DCE8;

  position: relative;
  box-sizing: border-box;
  min-height: 100vh;
  display: flex;
  flex-wrap: wrap;
  background: var(--lg-fundo);
  color: var(--lg-texto);
  font-family: "Sora", var(--up-fonte);
}

.lg-elos {
  position: absolute;
  pointer-events: none;
}

/* --- Aparencia A: Dividida ------------------------------------------------ */

.lg-marca {
  position: relative;
  overflow: hidden;
  flex: 1 1 520px;
  min-width: 0;
  box-sizing: border-box;
  padding: 48px 56px;
  display: flex;
  flex-direction: column;
  justify-content: center;
  background: var(--lg-marinho);
  color: #fff;
}
.lg-elos-marca {
  right: -170px;
  bottom: -150px;
  width: 560px;
  height: 560px;
  opacity: 0.16;
}
.lg-marca-texto {
  position: relative;
  max-width: 460px;
  display: flex;
  flex-direction: column;
  gap: 20px;
}
.lg-marca-titulo {
  margin: 0;
  font-size: 2.5rem;
  line-height: 1.15;
  font-weight: 700;
  letter-spacing: -0.02em;
}
.lg-marca-apoio {
  margin: 0;
  font-size: 1rem;
  line-height: 1.6;
  color: #C3CDE0;
}

.lg-entrada {
  position: relative;
  overflow: hidden;
  flex: 1 1 460px;
  min-width: 0;
  box-sizing: border-box;
  padding: 48px 32px 24px;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  gap: 28px;
}
.lg-elos-fundo,
.lg-logo-escuro,
.lg-subtitulo {
  display: none;
}

.lg .cartao-login {
  position: relative;
  box-sizing: border-box;
  width: 100%;
  max-width: 420px;
  padding: 40px 40px 32px;
  border-radius: 20px;
  background: #fff;
  box-shadow: 0 1px 2px rgba(13, 31, 60, 0.06), 0 24px 48px -16px rgba(13, 31, 60, 0.18);
}
.lg-logo-claro {
  display: block;
  height: 58px;
  width: auto;
  margin: 0 auto 26px;
}
.lg-divisa {
  height: 1px;
  margin: 0 -40px 22px;
  border: 0;
  background: #E6EBF3;
}
.lg-titulo {
  margin: 0 0 18px;
  font-size: 1.125rem;
  font-weight: 600;
  text-align: center;
  color: var(--lg-rotulo);
}
.lg-rotulo {
  display: block;
  margin: 0 0 6px;
  font-size: 0.8125rem;
  font-weight: 600;
  color: var(--lg-rotulo);
}

.lg .campo-login {
  height: 46px;
  margin-bottom: 18px;
  border: 1px solid var(--lg-borda);
  border-radius: 10px;
  background: #fff;
}
.lg .campo-login:focus-within {
  border-color: var(--lg-azul);
  background: #fff;
  box-shadow: 0 0 0 3px rgba(21, 87, 176, 0.14);
}
.lg .campo-login-icone {
  padding: 0 10px 0 14px;
  color: var(--lg-icone);
}
.lg .campo-login:focus-within .campo-login-icone {
  color: var(--lg-azul);
}
.lg .campo-login-entrada {
  align-self: stretch;
  padding: 0 14px 0 0;
  font-family: inherit;
  font-size: 0.9375rem;
  color: var(--lg-texto);
}
.lg .campo-login-entrada::placeholder {
  color: #7D8AA5;
}
.lg .campo-login-olho {
  align-self: stretch;
  padding: 0 14px;
  color: var(--lg-icone);
}
.lg .campo-login-olho:hover {
  color: var(--lg-azul);
}
.lg .aviso-campo-login {
  margin: -12px 0 14px 2px;
}
.lg .opcoes-login {
  margin: 0 0 22px;
  font-size: 0.875rem;
}
.lg .lembrar-login {
  gap: 10px;
  color: var(--lg-rotulo);
  cursor: pointer;
}
.lg .lembrar-login input {
  width: 18px;
  height: 18px;
  margin: 0;
  accent-color: var(--lg-azul);
}
.lg .botao-entrar {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 10px;
  height: 48px;
  margin: 0;
  padding: 0 16px;
  border-radius: 10px;
  background: var(--lg-marinho);
  font-family: inherit;
  font-size: 1rem;
  font-weight: 600;
  letter-spacing: 0;
  text-transform: none;
  color: #fff;
  cursor: pointer;
}
.lg .botao-entrar:hover {
  background: #17305A;
}
.lg .botao-entrar:focus-visible {
  outline: 2px solid var(--lg-azul);
}
.lg .botao-entrar:disabled {
  background: #4A5A78;
}
.lg-seta {
  color: var(--lg-laranja);
}

.lg .rodape-login {
  align-self: auto;
  margin: 0;
  padding: 0;
  color: var(--lg-suave);
  font-size: 0.75rem;
}
.lg .rodape-login-versao {
  color: var(--lg-rotulo);
}
.lg .rodape-login-separador {
  color: #9AA8C4;
}

/* Botao "Aparencia": discreto, no canto de baixo a esquerda. Escuro meio
   transparente para ler igual sobre o painel marinho e sobre o fundo claro. */
.lg-aparencia {
  position: fixed;
  left: 14px;
  bottom: 14px;
  z-index: 5;
  display: inline-flex;
  align-items: center;
  gap: 6px;
  padding: 6px 11px;
  border: 1px solid rgba(255, 255, 255, 0.22);
  border-radius: 999px;
  background: rgba(10, 24, 48, 0.62);
  font-family: inherit;
  font-size: 0.75rem;
  color: #fff;
  opacity: 0.7;
  cursor: pointer;
  transition: opacity 0.15s;
}
.lg-aparencia:hover,
.lg-aparencia:focus-visible {
  opacity: 1;
}
.lg-aparencia:focus-visible {
  outline: 2px solid var(--lg-laranja);
  outline-offset: 2px;
}
.lg-aparencia[hidden] {
  display: none;
}

/* --- Aparencia C: Escuro -------------------------------------------------- */

.lg[data-aparencia="c"] {
  background: var(--lg-noite);
  color: #fff;
}
.lg[data-aparencia="c"] .lg-marca,
.lg[data-aparencia="c"] .lg-logo-claro,
.lg[data-aparencia="c"] .lg-divisa,
.lg[data-aparencia="c"] .lg-seta {
  display: none;
}
.lg[data-aparencia="c"] .lg-entrada {
  flex: 1 1 100%;
  align-items: flex-start;
  justify-content: space-between;
  /* embaixo sobra lugar para o botao Aparencia nao cobrir o rodape */
  padding: 48px clamp(16px, 7vw, 104px) 64px;
}
.lg[data-aparencia="c"] .lg-elos-fundo {
  display: block;
  right: -240px;
  top: 50%;
  width: 900px;
  height: 900px;
  margin-top: -450px;
  opacity: 0.9;
}
.lg[data-aparencia="c"] .lg-logo-escuro {
  position: relative;
  display: block;
  height: 56px;
  width: auto;
}
.lg[data-aparencia="c"] .cartao-login {
  max-width: 380px;
  padding: 0;
  border-radius: 0;
  background: none;
  box-shadow: none;
}
.lg[data-aparencia="c"] .lg-titulo {
  margin: 0 0 8px;
  font-size: 2.125rem;
  font-weight: 700;
  line-height: 1.15;
  letter-spacing: -0.02em;
  text-align: left;
  color: #fff;
}
.lg[data-aparencia="c"] .lg-subtitulo {
  display: block;
  margin: 0 0 24px;
  font-size: 0.9375rem;
  color: #C3CDE0;
}
.lg[data-aparencia="c"] .lg-rotulo,
.lg[data-aparencia="c"] .lembrar-login {
  color: #C3CDE0;
}
.lg[data-aparencia="c"] .campo-login {
  height: 48px;
  border-color: #2A4472;
  background: #12264A;
}
.lg[data-aparencia="c"] .campo-login:focus-within {
  border-color: var(--lg-laranja);
  background: #12264A;
  box-shadow: 0 0 0 3px rgba(245, 160, 75, 0.16);
}
.lg[data-aparencia="c"] .campo-login-icone,
.lg[data-aparencia="c"] .campo-login-olho {
  color: #9AA8C4;
}
.lg[data-aparencia="c"] .campo-login:focus-within .campo-login-icone,
.lg[data-aparencia="c"] .campo-login-olho:hover {
  color: var(--lg-laranja);
}
.lg[data-aparencia="c"] .campo-login-entrada {
  color: #fff;
}
.lg[data-aparencia="c"] .campo-login-entrada::placeholder {
  color: #8796B3;
}
.lg[data-aparencia="c"] .campo-login-entrada:-webkit-autofill,
.lg[data-aparencia="c"] .campo-login-entrada:-webkit-autofill:focus {
  -webkit-box-shadow: 0 0 0 40rem #12264A inset;
  -webkit-text-fill-color: #fff;
}
.lg[data-aparencia="c"] .campo-login.invalido,
.lg[data-aparencia="c"] .campo-login.invalido:focus-within {
  border-color: #E0898B;
  background: #12264A;
}
.lg[data-aparencia="c"] .aviso-campo-login {
  color: #FFA9A6;
}
.lg[data-aparencia="c"] .lembrar-login input {
  accent-color: var(--lg-laranja);
}
.lg[data-aparencia="c"] .botao-entrar {
  height: 50px;
  background: var(--lg-laranja);
  font-weight: 700;
  color: var(--lg-noite);
}
.lg[data-aparencia="c"] .botao-entrar:hover {
  background: #F7B26C;
}
.lg[data-aparencia="c"] .botao-entrar:disabled {
  background: #B98A5C;
}
.lg[data-aparencia="c"] .botao-entrar:focus-visible {
  outline-color: #fff;
}
.lg[data-aparencia="c"] .rodape-login {
  position: relative;
  justify-content: flex-start;
  text-align: left;
  color: #9AA8C4;
}
.lg[data-aparencia="c"] .rodape-login-versao {
  color: #C3CDE0;
}
.lg[data-aparencia="c"] .rodape-login-separador {
  color: #4A6390;
}

/* --- Telas estreitas ------------------------------------------------------ */

@media (max-width: 900px) {
  /* os elos grandes passariam por tras do formulario: so um eco ao fundo */
  .lg[data-aparencia="c"] .lg-elos-fundo {
    opacity: 0.22;
  }
}
@media (max-width: 575.98px) {
  .lg-marca {
    padding: 32px 24px;
  }
  .lg-marca-titulo {
    font-size: 1.75rem;
  }
  .lg-entrada {
    padding: 32px 16px 64px;
  }
  .lg .cartao-login {
    padding: 28px 22px 24px;
  }
  .lg-divisa {
    margin: 0 -22px 20px;
  }
  .lg-logo-claro {
    height: 48px;
  }
  .lg[data-aparencia="c"] .lg-entrada {
    padding: 32px 16px 64px;
    gap: 32px;
  }
  .lg[data-aparencia="c"] .lg-titulo {
    font-size: 1.75rem;
  }
}
@media (prefers-reduced-motion: reduce) {
  .lg-aparencia {
    transition: none;
  }
}

/* ==========================================================================
   Casca do sistema: cabecalho + barra de modulos + area de trabalho
   ========================================================================== */

.app-uniplus {
  height: 100vh;
  display: flex;
  flex-direction: column;
  overflow: hidden;

  /* So a cor lisa: o papel de parede (papel-parede-marca.svg) fica na
     .area-trabalho, para o logo centralizar na area e nao na janela inteira.
     Ate 04/10/2026 era o fundo-login.svg (setas) aqui, com `cover` + `fixed`;
     voltar = repor o background-image dele. */
  background-color: var(--up-papel-parede);
}

/* --- Cabecalho (app-header + navbar-white do sistema) --------------------- */

/* Casca nova (Modelo A, 02/10/2026): a marca a esquerda e, a direita, os
   atalhos + o cartao do usuario + sair. A saudacao centralizada saiu. */
.topo {
  flex: 0 0 var(--up-header-altura);
  height: var(--up-header-altura);
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 1rem;
  background-color: var(--up-superficie);
  border-bottom: 1px solid var(--up-borda-suave);
  padding: 0 1rem 0 1.4rem;
}

.topo-marca {
  display: flex;
  align-items: center;
  text-decoration: none;
}

/* no cabecalho a logo cede altura para o nome do sistema caber embaixo */
.topo-marca .marca {
  height: 1.55rem;
}

/* O cartao do usuario: iniciais num circulo da marca, o nome em cima e a
   empresa embaixo. Sao dois botoes (menu do usuario / troca de filial),
   cada um com o seu hover; o cartao e so o fundo em volta. */
.topo-usuario {
  display: flex;
  align-items: center;
  gap: 0.55rem;
  min-width: 0;
  max-width: 24rem;
  height: 40px;
  margin: 0;
  padding: 0 0.45rem 0 0.25rem;
  border-radius: 12px;
  background-color: var(--up-papel-parede);
  color: var(--up-texto);
  overflow: hidden;
  white-space: nowrap;
}

.topo-avatar {
  flex: 0 0 auto;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 32px;
  height: 32px;
  border-radius: 50%;
  background-color: var(--up-primaria);
  color: #fff;
  font-size: 12px;
  font-weight: 700;
  letter-spacing: 0.02em;
}

.topo-usuario-textos {
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  min-width: 0;
  line-height: 1.15;
}

.topo-nome {
  font-size: 13px;
  font-weight: 700;
  color: var(--up-marca-escura);
}

/* Nome clicavel: abre o menu do usuario (Meus Dados, Minha Senha, Minhas
   Notificacoes -- base.html + js/menu_usuario.js). Mesmo desenho do botao da
   filial logo ao lado: sem moldura, so o fundo claro no hover. */
.topo-nome-menu {
  display: inline-flex;
  align-items: center;
  gap: 0.3rem;
  padding: 0 0.3rem;
  border: 0;
  border-radius: 4px;
  background: none;
  font: inherit;
  font-size: 13px;
  font-weight: 700;
  color: var(--up-marca-escura);
}

.topo-nome-menu:hover,
.topo-nome-menu:focus-visible,
.topo-nome-menu[aria-expanded="true"] {
  background-color: var(--up-primaria-fundo);
  outline: none;
}

/* O painel reaproveita o .menu-opcoes (itens, hover, "Em breve") numa coluna
   so. `fixed` e nao `absolute`: fica fora do cabecalho, cujo .topo-usuario
   corta o que passa da borda -- o menu_usuario.js o poe sob o nome. */
.menu-opcoes.menu-usuario {
  position: fixed;
  top: 0;
  right: auto;
  grid-template-columns: minmax(13rem, auto);
  gap: 0.15rem;
  padding: 0.4rem;
  z-index: 1060;
}

/* O aceno (👋) da saudacao antiga saiu com ela (02/10/2026). */

/* --- Minhas Notificacoes ---------------------------------------------------- */

/* Contador de pendencias: pilula vermelha com o sino, dentro do botao do nome
   (e so o numero, no item do menu). Fica aceso ate o problema ser resolvido
   -- abrir a lista nao apaga (menu_usuario.js). Sem pendencia, `hidden`. */
.contador-notificacoes {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: 0.15rem;
  min-width: 1.15rem;
  height: 1.15rem;
  padding: 0 0.35rem;
  border-radius: 999px;
  background-color: var(--up-pendencia);
  color: #fff;
  font-size: 11px;
  font-weight: 700;
  line-height: 1;
}

.contador-notificacoes[hidden] {
  display: none;
}

/* no menu, o numero encosta na direita do item */
.contador-notificacoes-item {
  margin-left: auto;
}

/* A lista: um cartao por problema, no desenho do .cartao-agente (Cadastro de
   Impressoras) -- faixa colorida a esquerda + circulo com o icone. Largura
   contida: e texto corrido, e numa tela larga a linha ficaria longa demais
   para ler. */
.lista-notificacoes {
  max-width: 62rem;
}

.cartao-notificacao {
  display: flex;
  gap: 0.9rem;
  margin-bottom: 0.75rem;
  padding: 0.85rem 1rem;
  border: 1px solid var(--up-borda-suave);
  border-left: 4px solid var(--up-pendencia);
  border-radius: 6px;
  background-color: #fff;
}

.cartao-notificacao.resolvida {
  border-left-color: var(--up-resolvida);
}

.cartao-notificacao-icone {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 2.4rem;
  height: 2.4rem;
  flex: 0 0 auto;
  border-radius: 50%;
  background-color: var(--up-pendencia-fundo);
  color: var(--up-pendencia);
}

.resolvida .cartao-notificacao-icone {
  background-color: var(--up-resolvida-fundo);
  color: var(--up-resolvida);
}

.cartao-notificacao-corpo {
  display: flex;
  flex: 1 1 auto;
  flex-direction: column;
  gap: 0.3rem;
  min-width: 0;
}

.cartao-notificacao-topo {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 0.6rem;
}

.cartao-notificacao-titulo {
  margin: 0;
  font-size: 14px;
  font-weight: 700;
  color: var(--up-marca-escura);
}

.cartao-notificacao-quando,
.cartao-notificacao-nota {
  margin: 0;
  font-size: 12px;
  color: var(--up-texto-suave);
}

.cartao-notificacao-motivo {
  margin: 0;
  font-size: 13.5px;
  color: var(--up-texto);
}

.cartao-notificacao-detalhes {
  display: flex;
  flex-wrap: wrap;
  gap: 0.15rem 1.5rem;
  margin: 0;
  font-size: 12px;
}

.cartao-notificacao-detalhes div {
  display: flex;
  gap: 0.35rem;
}

.cartao-notificacao-detalhes dt {
  font-weight: 700;
  color: var(--up-cinza-chumbo);
}

.cartao-notificacao-detalhes dd {
  margin: 0;
}

/* a orientacao e o que o operador vai seguir: bloco discreto, mas destacado
   do texto do motivo */
.cartao-notificacao-onde {
  margin: 0.15rem 0 0;
  padding: 0.45rem 0.65rem;
  border-radius: 4px;
  background-color: var(--up-cinza-frio);
  font-size: 12.5px;
  color: var(--up-texto);
}

.cartao-notificacao-acoes {
  display: flex;
  flex-wrap: wrap;
  gap: 0.4rem;
  margin-top: 0.2rem;
}

/* mesma altura dos botoes do cartao do Cadastro de Impressoras */
.cartao-notificacao-acoes .botao-acao {
  height: 28px;
  padding: 0 0.85rem;
}

.cartao-notificacao-resolucao {
  margin: 0;
  font-size: 12.5px;
  color: var(--up-texto);
}

.etiqueta-status.notificacao-pendente {
  background-color: var(--up-pendencia-fundo);
  color: var(--up-pendencia);
}

.etiqueta-status.notificacao-resolvida {
  background-color: var(--up-resolvida-fundo);
  color: var(--up-resolvida);
}

.bloco-titulo-resolvidas {
  margin-top: 1.4rem;
}

/* --- Filial de trabalho no cabecalho (02/10/2026) ---------------------------- */
/* Modelo A do canvas https://claude.ai/artifact/5C81UtcCSmDNDUM9pt2gkm. Antes a
   filial era a linha miuda embaixo do nome do usuario (.topo-local) e abria o
   modal "Local de trabalho" (Empresa + Filial + Gravar): o cliente achou
   escondido. Agora e um cartao proprio ao lado da marca -- rotulo "Filial de
   trabalho", o nome e, com o controle por local ligado, o local de estoque --
   e o painel abaixo troca num clique. */

.topo-inicio {
  display: flex;
  align-items: center;
  gap: 1.4rem;
  min-width: 0;
}

.topo-filial {
  display: flex;
  align-items: center;
  gap: 0.6rem;
  min-width: 0;
  height: 40px;
  padding: 0 0.7rem 0 0.3rem;
  border: 1.5px solid var(--up-borda);
  border-radius: 12px;
  background-color: var(--up-superficie);
  font-family: var(--up-fonte);
  text-align: left;
  transition: border-color 0.15s ease;
}

.topo-filial:hover,
.topo-filial:focus-visible,
.topo-filial.aberto {
  border-color: var(--up-primaria);
  outline: none;
}

.topo-filial-icone {
  flex: 0 0 auto;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 30px;
  height: 30px;
  border-radius: 9px;
  background-color: var(--up-primaria-fundo);
  color: var(--up-primaria);
}

.topo-filial-textos {
  display: flex;
  flex-direction: column;
  min-width: 0;
  line-height: 1.15;
}

.topo-filial-rotulo {
  font-size: 10px;
  font-weight: 700;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: var(--up-texto-suave);
}

.topo-filial-linha {
  display: flex;
  align-items: baseline;
  gap: 0.45rem;
  min-width: 0;
  white-space: nowrap;
}

.topo-filial-nome {
  overflow: hidden;
  text-overflow: ellipsis;
  font-size: 13.5px;
  font-weight: 700;
  color: var(--up-marca-escura);
}

/* local de estoque, separado do nome por um risco */
.topo-filial-local {
  display: inline-flex;
  align-items: center;
  gap: 0.25rem;
  padding-left: 0.45rem;
  border-left: 1px solid var(--up-borda);
  font-size: 12px;
  font-weight: 600;
  color: var(--up-cinza-chumbo);
}

.topo-filial-cnpj {
  font-size: 11.5px;
  color: var(--up-texto-suave);
}

.topo-filial-local[hidden],
.topo-filial-cnpj[hidden] {
  display: none;
}

.topo-filial-trocar {
  flex: 0 0 auto;
  display: inline-flex;
  align-items: center;
  gap: 0.25rem;
  margin-left: 0.2rem;
  padding-left: 0.6rem;
  border-left: 1px solid var(--up-borda-suave);
  font-size: 12px;
  font-weight: 700;
  color: var(--up-primaria);
}

/* o cartao do usuario agora e so o nome: "Minha conta" embaixo, no lugar da
   filial que foi para o cartao proprio */
.topo-nome-menu {
  flex-direction: column;
  align-items: flex-start;
  gap: 0;
}

.topo-nome-linha {
  display: inline-flex;
  align-items: center;
  gap: 0.3rem;
}

.topo-usuario-sub {
  font-size: 11px;
  font-weight: 600;
  color: var(--up-texto-suave);
}

@media (max-width: 991.98px) {
  /* em tela estreita o cartao cede: some o "Trocar" e o nome encurta */
  .topo-filial-trocar {
    display: none;
  }

  .topo-filial-nome {
    max-width: 10rem;
  }
}

/* --- Busca rapida de telas (04/10/2026) ------------------------------------- */
/* Modelo A do canvas https://claude.ai/artifact/NmcYdJWccshmHRRZXzKMJT. O
   sistema cresceu e achar a tela abrindo o painel de cada modulo ficou lento:
   o campo fica ao lado do cartao da filial e a lista suspensa sugere as telas
   desde a primeira letra (partials/busca_rapida.html + js/busca_rapida.js).
   Cada linha leva a classe mod-* do modulo da tela, entao o icone e a pilula
   "Modulo > Grupo" saem na cor do modulo (--mod-cor/--mod-fundo). */

/* Quando falta largura no topo, quem encolhe primeiro e a busca (fator 50),
   ate os 12rem; so depois o cartao da filial. Com o fator 1 os dois
   dividiam o aperto e o nome da filial virava "B." a 1366px. */
.busca-rapida {
  position: relative; /* ancora a lista suspensa */
  flex: 0 50 22.5rem;
  min-width: 12rem;
}

/* A largura natural do .topo-inicio vem do tamanho padrao do <input> (bem
   menor que os 22.5rem), entao ele nascia estreito e espremia a busca e a
   filial mesmo com o topo sobrando. Crescendo ate o .topo-acoes, os itens
   ficam no tamanho deles; o cartao do usuario continua na ponta direita. */
.topo-inicio {
  flex: 1 1 auto;
}

/* mesmo com a busca cedendo quase todo o aperto, a fracao que sobrava para
   a filial (1px a 1100px) ja punha reticencias no nome ("Bike Sp...") */
@media (min-width: 992px) {
  .topo-filial {
    flex-shrink: 0;
  }
}

.busca-rapida-lupa {
  position: absolute;
  top: 50%;
  left: 0.75rem;
  display: flex;
  transform: translateY(-50%);
  color: var(--up-texto-suave);
  pointer-events: none;
}

.busca-rapida-campo {
  width: 100%;
  height: 40px; /* a altura do cartao da filial, lado a lado */
  padding: 0 4.4rem 0 2.4rem;
  border: 1.5px solid var(--up-borda);
  border-radius: 12px;
  background-color: var(--up-cinza-frio);
  font-family: var(--up-fonte);
  font-size: 14px;
  color: var(--up-texto);
  outline: none;
  transition: border-color 0.15s ease, box-shadow 0.15s ease, background-color 0.15s ease;
}

.busca-rapida-campo::placeholder {
  color: var(--up-texto-suave);
}

.busca-rapida-campo:hover {
  border-color: var(--up-primaria-claro);
}

.busca-rapida-campo:focus {
  border-color: var(--up-primaria);
  background-color: var(--up-superficie);
  box-shadow: 0 0 0 3px var(--up-primaria-fundo);
}

/* "Ctrl K" no canto: some quando ha texto, para nao brigar com ele */
.busca-rapida-atalho {
  position: absolute;
  top: 50%;
  right: 0.6rem;
  display: flex;
  gap: 3px;
  transform: translateY(-50%);
  pointer-events: none;
}

.busca-rapida-campo:not(:placeholder-shown) ~ .busca-rapida-atalho {
  display: none;
}

/* ...e o espaco reservado a ele (4.4rem) vai para o texto: com o atalho
   escondido, sobrava uma faixa vazia a direita e o texto longo era cortado
   antes da hora (05/10/2026, pedido do cliente) */
.busca-rapida-campo:not(:placeholder-shown) {
  padding-right: 0.75rem;
}

.busca-rapida-atalho kbd {
  padding: 1px 5px;
  border: 1px solid var(--up-borda-suave);
  border-radius: 5px;
  background-color: var(--up-superficie);
  box-shadow: none;
  font-family: var(--up-fonte);
  font-size: 11px;
  font-weight: 700;
  color: var(--up-cinza-chumbo);
}

/* A lista desce por cima da faixa escura dos modulos (z-index 1050) */
.busca-rapida-painel {
  position: absolute;
  top: calc(100% + 7px);
  left: 0;
  z-index: 1060;
  width: 31rem;
  max-width: calc(100vw - 24px);
  border: 1px solid var(--up-borda-suave);
  border-radius: 12px;
  background-color: var(--up-superficie);
  box-shadow: var(--up-sombra-painel-modulo);
  overflow: hidden;
}

.busca-rapida-painel[hidden] {
  display: none;
}

.busca-rapida-cabeca {
  display: flex;
  align-items: center;
  justify-content: space-between;
  padding: 0.6rem 0.9rem 0.35rem;
  font-size: 11px;
  font-weight: 700;
  letter-spacing: 0.07em;
  text-transform: uppercase;
  color: var(--up-texto-suave);
}

.busca-rapida-contagem {
  font-weight: 600;
  letter-spacing: 0;
  text-transform: none;
}

.busca-rapida-lista {
  display: flex;
  flex-direction: column;
  max-height: 24rem;
  margin: 0;
  padding: 0 0.4rem 0.4rem;
  list-style: none;
  overflow-y: auto;
}

.busca-rapida-item {
  display: flex;
  align-items: center;
  gap: 0.7rem;
  padding: 0.45rem 0.5rem;
  border-radius: 9px;
  cursor: pointer;
}

.busca-rapida-item[aria-selected="true"] {
  background-color: var(--up-primaria-fundo);
  box-shadow: inset 0 0 0 1.5px var(--up-primaria-claro);
}

/* o icone e o mesmo do item no menu, no quadradinho do modulo */
.busca-rapida-icone {
  flex: 0 0 32px;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 32px;
  height: 32px;
  border-radius: 9px;
  background-color: var(--mod-fundo, var(--up-primaria-fundo));
  color: var(--mod-cor, var(--up-primaria));
}

.busca-rapida-textos {
  flex: 1;
  display: flex;
  flex-direction: column;
  min-width: 0;
  line-height: 1.2;
}

.busca-rapida-nome,
.busca-rapida-desc {
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.busca-rapida-nome {
  font-size: 14px;
  color: var(--up-texto);
}

.busca-rapida-desc {
  font-size: 12px;
  color: var(--up-texto-suave);
}

.busca-rapida-marca {
  padding: 0;
  border-radius: 3px;
  background-color: var(--up-busca-realce);
  font-weight: 700;
  color: var(--up-marca-escura);
}

.busca-rapida-caminho {
  flex: 0 0 auto;
  padding: 3px 9px;
  border-radius: 999px;
  background-color: var(--mod-fundo, var(--up-cinza-frio));
  font-size: 11.5px;
  font-weight: 700;
  color: var(--mod-cor, var(--up-cinza-chumbo));
  white-space: nowrap;
}

.busca-rapida-vazio,
.busca-rapida-dica {
  margin: 0 0.75rem 0.65rem;
  font-size: 12.5px;
  color: var(--up-cinza-chumbo);
}

.busca-rapida-dica {
  padding: 0.5rem 0.65rem;
  border-radius: 8px;
  background-color: var(--up-cinza-frio);
}

.busca-rapida-dica b {
  color: var(--up-marca-escura);
}

.busca-rapida-vazio[hidden],
.busca-rapida-dica[hidden],
.busca-rapida-cabeca [hidden] {
  display: none;
}

.busca-rapida-rodape {
  display: flex;
  gap: 0.9rem;
  padding: 0.5rem 0.9rem;
  border-top: 1px solid var(--up-borda-suave);
  background-color: var(--up-cinza-frio);
  font-size: 11.5px;
  color: var(--up-texto-suave);
}

.busca-rapida-rodape b {
  color: var(--up-cinza-chumbo);
}

/* Preferencia escolhida na busca (05/10/2026): a linha da grade das Opcoes
   do modulo, ou a caixa do campo, acende no amarelo do realce e apaga
   devagar. Na linha, a cor vai nas celulas (o fundo delas cobre o do tr). */
.busca-rapida-destaque:not(tr) {
  border-radius: 8px;
  animation: busca-rapida-destaque 2.6s ease-out;
}

tr.busca-rapida-destaque > td {
  animation: busca-rapida-destaque-celula 2.6s ease-out;
}

@keyframes busca-rapida-destaque {
  0%,
  45% {
    background-color: var(--up-busca-realce);
    box-shadow: 0 0 0 6px var(--up-busca-realce);
  }

  100% {
    background-color: transparent;
    box-shadow: 0 0 0 6px transparent;
  }
}

@keyframes busca-rapida-destaque-celula {
  0%,
  45% {
    background-color: var(--up-busca-realce);
  }
}

@media (max-width: 1199.98px) {
  /* janela estreita: o campo encolhe e o "Ctrl K" sai */
  .busca-rapida-atalho {
    display: none;
  }

  .busca-rapida-campo {
    padding-right: 0.75rem;
  }
}

/* --- Painel "Onde voce vai trabalhar?" ------------------------------------- */
/* Abre embaixo do cartao (posicao no local_trabalho.js). A lista vem agrupada
   por empresa; cada filial e um botao (radio + iniciais + nome + codigo/CNPJ)
   e, com o controle por local, os locais de estoque dela em pilulas. */

.painel-filial-veu {
  position: fixed;
  inset: 0;
  z-index: 1055;
  background-color: var(--up-veu-filial);
}

.painel-filial-veu[hidden],
.painel-filial[hidden],
.aviso-filial[hidden] {
  display: none;
}

.painel-filial {
  position: fixed;
  z-index: 1060;
  display: flex;
  flex-direction: column;
  width: 34rem;
  max-width: calc(100vw - 16px);
  max-height: calc(100vh - var(--up-header-altura) - 24px);
  border: 1px solid var(--up-borda-suave);
  border-radius: 16px;
  background-color: var(--up-superficie);
  box-shadow: var(--up-sombra-painel-modulo);
  overflow: hidden;
}

.painel-filial-topo {
  display: flex;
  flex-direction: column;
  gap: 0.15rem;
  padding: 0.9rem 1rem 0.65rem;
}

.painel-filial-titulo {
  margin: 0;
  font-size: 15px;
  font-weight: 700;
  color: var(--up-marca-escura);
}

.painel-filial-texto {
  margin: 0;
  font-size: 12px;
  color: var(--up-texto-suave);
}

.painel-filial-busca {
  position: relative;
  display: flex;
  align-items: center;
  margin-top: 0.55rem;
  color: var(--up-texto-suave);
}

.painel-filial-busca[hidden] {
  display: none;
}

.painel-filial-busca .icone {
  position: absolute;
  left: 0.7rem;
}

.painel-filial-busca input {
  width: 100%;
  height: 34px;
  padding: 0 0.75rem 0 2.1rem;
  border: 1.5px solid var(--up-borda);
  border-radius: 10px;
  font-family: var(--up-fonte);
  font-size: 13px;
  color: var(--up-marca-escura);
}

.painel-filial-busca input:focus {
  outline: none;
  border-color: var(--up-primaria);
  box-shadow: 0 0 0 3px var(--up-primaria-fundo);
}

.painel-filial-lista {
  flex: 1 1 auto;
  min-height: 0;
  overflow-y: auto;
  padding: 0 0.6rem 0.6rem;
}

.painel-filial-grupo + .painel-filial-grupo {
  margin-top: 0.35rem;
}

.painel-filial-empresa {
  margin: 0;
  padding: 0.45rem 0.5rem 0.25rem;
  font-size: 10.5px;
  font-weight: 700;
  letter-spacing: 0.1em;
  text-transform: uppercase;
  color: var(--up-texto-suave);
}

.painel-filial-item {
  border-radius: 12px;
}

.painel-filial-item.atual {
  background-color: var(--up-papel-parede);
}

.painel-filial-escolher {
  display: flex;
  align-items: center;
  gap: 0.75rem;
  width: 100%;
  padding: 0.55rem 0.6rem;
  border: 0;
  border-radius: 12px;
  background: none;
  font-family: var(--up-fonte);
  text-align: left;
}

.painel-filial-escolher:hover,
.painel-filial-escolher:focus-visible {
  background-color: var(--up-papel-parede);
  outline: none;
}

.painel-filial-radio {
  flex: 0 0 auto;
  width: 18px;
  height: 18px;
  border: 2px solid var(--up-borda);
  border-radius: 50%;
  box-sizing: border-box;
}

.atual .painel-filial-radio {
  border-color: var(--up-primaria);
  box-shadow: inset 0 0 0 3px var(--up-superficie), inset 0 0 0 8px var(--up-primaria);
}

/* As iniciais ganham um tom por posicao na lista, so para as filiais se
   distinguirem de relance. Reaproveitam as cores dos modulos: a filial nao
   tem cor propria no Uniplus. */
.painel-filial-avatar {
  flex: 0 0 auto;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 36px;
  height: 36px;
  border-radius: 10px;
  font-size: 13px;
  font-weight: 700;
}

.pf-cor-0 { background-color: var(--up-mod-cadastros-fundo); color: var(--up-mod-cadastros); }
.pf-cor-1 { background-color: var(--up-mod-vendas-fundo); color: var(--up-mod-vendas); }
.pf-cor-2 { background-color: var(--up-mod-catalogo-fundo); color: var(--up-mod-catalogo); }
.pf-cor-3 { background-color: var(--up-mod-expedicao-fundo); color: var(--up-mod-expedicao); }
.pf-cor-4 { background-color: var(--up-mod-financeiro-fundo); color: var(--up-mod-financeiro); }
.pf-cor-5 { background-color: var(--up-mod-fiscal-fundo); color: var(--up-mod-fiscal); }

.painel-filial-dados {
  display: flex;
  flex: 1 1 auto;
  flex-direction: column;
  gap: 0.05rem;
  min-width: 0;
}

.painel-filial-nome {
  font-size: 13.5px;
  font-weight: 700;
  color: var(--up-marca-escura);
}

.painel-filial-doc {
  font-size: 12px;
  color: var(--up-texto-suave);
}

.painel-filial-atual {
  flex: 0 0 auto;
  padding: 2px 9px;
  border-radius: 999px;
  background-color: var(--up-primaria-fundo);
  color: var(--up-primaria);
  font-size: 11px;
  font-weight: 700;
}

/* os locais de estoque da filial, alinhados com o nome (depois do radio e
   das iniciais) */
.painel-filial-locais {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 0.35rem;
  padding: 0 0.6rem 0.55rem 4.45rem;
}

.painel-filial-locais-rotulo {
  display: inline-flex;
  align-items: center;
  gap: 0.25rem;
  font-size: 11px;
  font-weight: 700;
  color: var(--up-texto-suave);
}

.painel-filial-local {
  height: 26px;
  padding: 0 0.65rem;
  border: 1px solid var(--up-borda);
  border-radius: 999px;
  background-color: var(--up-superficie);
  font-family: var(--up-fonte);
  font-size: 11.5px;
  font-weight: 700;
  color: var(--up-cinza-chumbo);
}

.painel-filial-local:hover,
.painel-filial-local:focus-visible {
  border-color: var(--up-primaria);
  color: var(--up-primaria);
  outline: none;
}

.painel-filial-local.marcado {
  border-color: var(--up-primaria);
  background-color: var(--up-primaria);
  color: #fff;
}

.painel-filial-sem-local,
.painel-filial-vazio {
  margin: 0;
  padding: 0 0.6rem 0.55rem 4.45rem;
  font-size: 11.5px;
  color: var(--up-texto-suave);
}

.painel-filial-vazio {
  padding: 0.75rem;
  font-size: 12.5px;
}

.painel-filial-rodape {
  margin: 0;
  padding: 0.55rem 1rem;
  border-top: 1px solid var(--up-borda-suave);
  font-size: 11.5px;
  color: var(--up-texto-suave);
}

/* Confirmacao da troca: pilula escura no pe da janela, some em 5s */
.aviso-filial {
  position: fixed;
  left: 50%;
  bottom: 28px;
  z-index: 1070;
  display: flex;
  align-items: center;
  gap: 0.7rem;
  padding: 0.6rem 1rem 0.6rem 0.75rem;
  border-radius: 14px;
  background-color: var(--up-marca-escura);
  color: #fff;
  font-size: 13.5px;
  white-space: nowrap;
  box-shadow: var(--up-sombra-painel-modulo);
  transform: translateX(-50%);
}

.aviso-filial-icone {
  display: inline-flex;
  color: var(--up-mod-financeiro-fundo);
}

/* --- Ferramentas > Modelo de impressao ------------------------------------ */

.texto-apoio {
  margin-bottom: 1.1rem;
  font-size: 13px;
  color: var(--up-texto-suave);
}

.bloco-modelos {
  margin-bottom: 1.4rem;
}

/* usado tambem em Painel Admin > Vendas ("Situacao padrao das listagens") */
.bloco-modelos-topo {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  justify-content: space-between;
  gap: 0.6rem;
  margin-bottom: 0.5rem;
}

.bloco-modelos-topo .bloco-titulo {
  display: inline-flex;
  align-items: center;
  gap: 0.4rem;
  margin: 0;
}

/* --- Ferramentas > Modelo de Impressao ------------------------------------ */

/* texto de apoio na mesma linha do Incluir, empurrando o botao para a direita */
.barra-apoio {
  flex: 1 1 auto;
  margin: 0;
  font-size: 12.5px;
}

.bloco-modelos-titulo {
  display: flex;
  align-items: center;
  gap: 0.4rem;
}

.bloco-modelos-contagem {
  min-width: 1.35rem;
  padding: 0 0.4rem;
  border-radius: 10px;
  background-color: #e3eef8;
  font-size: 11px;
  line-height: 1.35rem;
  text-align: center;
  color: var(--up-azul-royal);
}

/* Layout fixo + <colgroup>: as colunas das duas tabelas (Pedido e Orcamento)
   ficam na mesma posicao, e cabecalho e conteudo alinham pelo mesmo lado. */
.tabela-modelos {
  width: 100%;
  table-layout: fixed;
}

.tabela-modelos .col-arquivos { width: 7rem; }
.tabela-modelos .col-situacao { width: 9rem; }
/* dois botoes de 26px + o espaco entre eles + o respiro da celula */
.tabela-modelos .col-acao { width: 6rem; }

.tabela-modelos .centro {
  text-align: center;
}

.tabela-modelos td.destaque {
  overflow: hidden;
  text-overflow: ellipsis;
}

.tabela-modelos td {
  vertical-align: middle;
}

.modelos-vazio {
  margin: 0;
  padding: 0.85rem 1rem;
  border: 1px dashed var(--up-borda);
  border-radius: 4px;
  font-size: 12.5px;
  color: var(--up-texto-suave);
}

/* --- Assistente de inclusao ------------------------------------------------ */

/* overflow-x: a etapa entra deslizando 10px da direita, e sem isto o dialogo
   ganhava uma barra de rolagem horizontal durante a animacao */
.dialogo-assistente {
  width: min(36rem, calc(100vw - 2rem));
  overflow-x: hidden;
}

.assistente-passos {
  display: flex;
  gap: 0.25rem;
  margin: 0;
  padding: 0.75rem 1.25rem;
  list-style: none;
  border-bottom: 1px solid var(--up-borda-suave);
  background-color: var(--up-cinza-frio);
}

.assistente-passo {
  flex: 1 1 0;
  display: flex;
  align-items: center;
  gap: 0.45rem;
  font-size: 12px;
  font-weight: 600;
  color: var(--up-texto-suave);
}

.assistente-passo span {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 1.4rem;
  height: 1.4rem;
  border: 1.5px solid var(--up-borda);
  border-radius: 50%;
  background-color: #fff;
  font-size: 11px;
  transition: background-color 0.2s, border-color 0.2s, color 0.2s;
}

.assistente-passo.atual {
  color: var(--up-texto);
}

.assistente-passo.atual span {
  border-color: var(--up-azul-royal);
  background-color: var(--up-azul-royal);
  color: #fff;
}

.assistente-passo.feito span {
  border-color: #3d7a42;
  background-color: #e3f1e4;
  color: #3d7a42;
}

.assistente-corpo {
  margin: 0;
}

.assistente-etapa {
  min-height: 13.5rem;
  margin: 0;
  padding: 1.25rem 1.25rem 0.75rem;
  border: 0;
  animation: assistente-entrada 0.2s ease-out;
}

.assistente-etapa[hidden] {
  display: none;
}

@keyframes assistente-entrada {
  from { opacity: 0; transform: translateX(10px); }
  to { opacity: 1; transform: none; }
}

@media (prefers-reduced-motion: reduce) {
  .assistente-etapa {
    animation: none;
  }
}

/* <legend> flutuando (o mesmo truque do Bootstrap): sem o float o navegador
   desenha a legenda EM CIMA da borda do fieldset, ignorando o padding -- a
   pergunta colava na barra de etapas */
.assistente-pergunta {
  float: left;
  width: 100%;
  margin: 0 0 0.25rem;
  padding: 0;
  font-size: 1rem;
  font-weight: 700;
  line-height: 1.35;
  color: var(--up-texto);
}

.assistente-pergunta + * {
  clear: left;
}

.assistente-apoio {
  margin: 0 0 1rem;
  font-size: 12.5px;
  color: var(--up-texto-suave);
}

.assistente-etapa .campo input[type="text"] {
  padding: 0.55rem 0.75rem;
  font-size: 14px;
}

.opcoes-documento {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(12rem, 1fr));
  gap: 0.75rem;
}

.opcao-documento {
  position: relative;
  display: flex;
  align-items: center;
  gap: 0.75rem;
  padding: 0.9rem 1rem;
  border: 1.5px solid var(--up-borda);
  border-radius: 6px;
  background-color: #fff;
  transition: border-color 0.15s, background-color 0.15s, box-shadow 0.15s;
}

.opcao-documento:hover {
  border-color: var(--up-azul-sky);
}

/* o radio fica acessivel (teclado/leitor de tela), mas quem aparece e o cartao */
.opcao-documento input {
  position: absolute;
  opacity: 0;
  pointer-events: none;
}

.opcao-documento:has(input:checked) {
  border-color: var(--up-azul-royal);
  background-color: #eef5fc;
  box-shadow: 0 0 0 3px rgba(0, 80, 160, 0.12);
}

.opcao-documento:has(input:focus-visible) {
  outline: 2px solid var(--up-azul-sky);
  outline-offset: 2px;
}

.opcao-documento-icone {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 2.5rem;
  height: 2.5rem;
  flex: 0 0 auto;
  border-radius: 50%;
  background-color: #dceefb;
  color: var(--up-azul-royal);
}

.opcao-documento-texto {
  display: flex;
  flex-direction: column;
  gap: 0.1rem;
}

.opcao-documento-texto strong {
  font-size: 13.5px;
}

.opcao-documento-texto small {
  font-size: 11.5px;
  color: var(--up-texto-suave);
}

.dialogo-assistente .zona-envio {
  padding: 1.5rem 1rem;
}

.dialogo-assistente .zona-envio[hidden],
.dialogo-assistente .zona-envio-arquivo[hidden] {
  display: none;
}

.assistente-resumo {
  margin: 0.9rem 0 0;
  padding: 0.55rem 0.75rem;
  border-left: 3px solid var(--up-azul-royal);
  border-radius: 3px;
  background-color: #eef5fc;
  font-size: 12.5px;
  color: var(--up-texto);
}

.assistente-rodape {
  align-items: center;
  gap: 0.4rem;
}

.assistente-rodape .botao-acao {
  height: 28px;
  padding: 0 0.85rem;
  gap: 0.5rem;
}

.assistente-rodape .botao-acao[hidden] {
  display: none;
}

.assistente-espaco {
  flex: 1 1 auto;
}

/* --- Dialogo Imprimir (listagens de Pedido/Orcamento) ---------------------
   Veste a casca da confirmacao de gravacao (`.dialogo-sucesso`: entrada,
   titulo, resumo, faixa da pergunta, listas lado a lado, botoes `.botao-up`).
   Antes tinha cabecalho com "x", campos empilhados e botoes `.botao-acao`,
   e por isso as duas janelas de impressao pareciam de sistemas diferentes
   (23/09/2026). Aqui fica so o que e dele. */

/* "· Pedido nº 318455" ao lado do titulo da edicao rapida do cliente, mais
   leve que ele (nasceu no Imprimir antigo, hoje so a edicao rapida usa) */
.imprimir-documento {
  font-size: 0.95rem;
  font-weight: 400;
  color: var(--up-texto-suave);
}

/* No lugar do check animado, a impressora dentro de um circulo no azul da
   faixa da pergunta -- e uma pergunta, nao um aviso de sucesso. */
.imprimir-icone span {
  display: flex;
  align-items: center;
  justify-content: center;
  width: 3.25rem;
  height: 3.25rem;
  border: 3px solid var(--up-azul-royal);
  border-radius: 50%;
  color: var(--up-azul-royal);
}

/* cliente longo nao empurra a largura do dialogo */
.dialogo-imprimir .sucesso-texto {
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

/* --- Expedicao > Conferencia, passo 1 (os itens do pedido) ----------------
   Tambem veste a casca do Imprimir (acima). Antes era um `.dialogo-largo`
   de 52rem com cabecalho, "x" e a grade densa dos Itens Rapidos, e parecia
   de outro sistema ao lado das mensagens de impressao (25/09/2026). So a
   largura e a caixa dos itens sao dela: o nome do produto e longo e nao
   cabe nos 28rem da confirmacao. */
.dialogo-sucesso.dialogo-conferencia {
  width: min(38rem, calc(100vw - 2rem));
}

.dialogo-conferencia .sucesso-texto {
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

/* Mesmo cartao do resumo logo acima (borda suave, raio 6px, cabecalho no
   cinza frio com o rotulo dos `dt`). A altura para no limite e a caixa rola
   por dentro, com o cabecalho parado; em tela baixa ela encolhe para os
   botoes continuarem a vista. Conteudo a esquerda, embaixo do titulo,
   inclusive a quantidade (regra das grades). */
/* botoes a direita, alinhados a borda da caixa dos itens (1.5rem), com o
   Proximo no canto -- os outros dialogos da casca seguem centralizados */
.dialogo-sucesso.dialogo-conferencia .dialogo-acoes {
  justify-content: flex-end;
  padding-right: 1.5rem;
}

.conferencia-itens,
.duplicar-itens {
  max-height: min(17rem, calc(100vh - 24rem));
  min-height: 5rem;
  margin: 0.85rem 1.5rem 0;
  overflow-y: auto;
  border: 1px solid var(--up-borda-suave);
  border-radius: 6px;
  text-align: left;
}

.conferencia-itens table,
.duplicar-itens table {
  width: 100%;
  border-collapse: collapse;
  font-size: 12px;
}

.conferencia-itens th,
.duplicar-itens th {
  position: sticky;
  top: 0;
  padding: 0.4rem 0.6rem;
  border-bottom: 1px solid var(--up-borda-suave);
  background-color: var(--up-cinza-frio);
  font-size: 10.5px;
  font-weight: 700;
  letter-spacing: 0.04em;
  text-transform: uppercase;
  color: var(--up-texto-suave);
}

.conferencia-itens td,
.duplicar-itens td {
  padding: 0.35rem 0.6rem;
  color: var(--up-texto);
}

.conferencia-itens tbody tr + tr td,
.duplicar-itens tbody tr + tr td {
  border-top: 1px solid var(--up-borda-suave);
}

/* codigo e quantidade so ocupam o que precisam; o produto fica com o resto */
.conferencia-itens th:first-child,
.conferencia-itens td:first-child,
.conferencia-itens th:last-child,
.conferencia-itens td:last-child {
  width: 1%;
  white-space: nowrap;
}

.conferencia-itens td:first-child {
  color: var(--up-texto-suave);
}

.conferencia-itens td:last-child {
  font-weight: 700;
  color: var(--up-azul-royal);
}

/* Expedicao > Retirada, pedido MISTO (01/10/2026): o aviso de que parte dos
   itens vai pela ENTREGA e nao sai no balcao. Negrito e ambar de "atencao"
   (--up-intervencao, o mesmo do aviso da carga so para consulta), na largura
   da caixa de itens logo abaixo -- o funcionario le antes de conferir. */
.aviso-retirada-mista {
  display: flex;
  align-items: center;
  gap: 0.5rem;
  margin: 0.85rem 1.5rem 0;
  padding: 0.5rem 0.75rem;
  border-left: 4px solid var(--up-intervencao);
  border-radius: 4px;
  background-color: var(--up-intervencao-fundo);
  font-size: 13px;
  font-weight: 700;
  text-align: left;
  color: var(--up-intervencao);
}

.aviso-retirada-mista[hidden] {
  display: none;
}

/* as variacoes da grade (cor/tamanho) do item, embaixo do nome do produto */
.conferencia-itens .item-variacoes {
  display: block;
  margin-top: 0.1rem;
  font-size: 11px;
  color: var(--up-texto-suave);
}

.conferencia-itens tr.vazia td {
  width: auto;
  padding: 1.25rem 0.6rem;
  font-weight: 400;
  text-align: center;
  color: var(--up-texto-suave);
}

/* --- Dialogo Duplicar (listagens de Pedido/Orcamento) ---------------------
   Tambem veste a casca do Imprimir, com a caixa de itens da Conferencia
   (regras compartilhadas logo acima). Antes era um `.dialogo-largo` com
   cabecalho, "x" e a grade densa dos Itens Rapidos (26/09/2026). Tem mais
   colunas que a Conferencia (preco, desconto, total), por isso a largura. */
.dialogo-sucesso.dialogo-duplicar {
  width: min(46rem, calc(100vw - 2rem));
}

.dialogo-duplicar .sucesso-texto {
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

/* Duplicar da nota fiscal (01/10/2026): no lugar da lista de itens dos
   Pedidos, so a quantidade de notas -- um campo curto, centralizado, com o
   numero grande o bastante para conferir de relance */
.duplicar-quantidade {
  align-items: center;
  margin: 1rem 1.5rem 0;
}

.duplicar-quantidade input {
  width: 8rem;
  font-size: 18px;
  font-weight: 700;
  text-align: center;
}

/* a caixa vem DEPOIS da faixa da instrucao (primeiro o que fazer, depois a
   lista), entao a margem de cima e a da faixa */
.duplicar-itens {
  margin-top: 1rem;
}

/* a linha inteira marca/desmarca (ver venda_documento_lista.js) */
.duplicar-itens tbody tr {
  cursor: pointer;
}

.duplicar-itens tbody tr:hover td {
  background-color: var(--up-cinza-frio);
}

/* so o produto estica; caixa, codigo e numeros ocupam o que precisam */
.duplicar-itens th:not(:nth-child(3)),
.duplicar-itens td:not(:nth-child(3)) {
  width: 1%;
  white-space: nowrap;
}

.duplicar-itens td:first-child {
  padding-right: 0.2rem;
}

.duplicar-itens td:nth-child(2) {
  color: var(--up-texto-suave);
}

.duplicar-itens td:last-child {
  font-weight: 700;
  color: var(--up-azul-royal);
}

.duplicar-itens .marca-celula {
  width: 13px;
  height: 13px;
  margin: 0;
  vertical-align: middle;
  accent-color: var(--up-azul-royal);
  cursor: pointer;
}

.duplicar-referencia {
  display: block;
  font-size: 10.5px;
  color: var(--up-texto-suave);
}

/* item desmarcado fica apagado e riscado no total: de relance o operador ve
   o que NAO vai para o documento novo */
/* (a caixinha fica de fora, para nao parecer desabilitada) */
.duplicar-itens tr.fora td:not(:first-child) {
  color: var(--up-texto-suave);
  opacity: 0.55;
}

.duplicar-itens tr.fora td:last-child {
  text-decoration: line-through;
}

/* Conferencia do "Gerar NF-e" (30/09/2026, faturamento_nfe_service): o que
   impede a nota (caixa vermelha da recusa, .sucesso-pergunta.falhou) e o que
   falta informar (caixa azul da pergunta), cada um uma lista. Mais largo que
   o dialogo de sucesso porque os textos citam produto e cadastro inteiros */
.dialogo-sucesso.dialogo-conferencia-nfe {
  width: min(32rem, calc(100vw - 2rem));
}

.conferencia-nfe-grupo > div {
  flex: 1;
  min-width: 0;
}

.conferencia-nfe-grupo ul {
  margin: 0.35rem 0 0;
  padding-left: 1.1rem;
  font-size: 13px;
  line-height: 1.4;
  color: var(--up-texto);
}

.conferencia-nfe-grupo li + li {
  margin-top: 0.3rem;
}

/* as duas caixas empilhadas ficam mais juntas que a margem da faixa */
.conferencia-nfe-grupo + .conferencia-nfe-grupo {
  margin-top: 0.6rem;
}

.conferencia-nfe-onde {
  display: block;
  font-size: 12px;
  color: var(--up-texto-suave);
}

/* avisos (sem modelo / situacao da impressora) na mesma margem da faixa */
.dialogo-imprimir .modelos-vazio,
.dialogo-imprimir .destino-impressao {
  margin: 0.85rem 1.5rem 0;
  text-align: left;
}

.dialogo-imprimir .modelos-vazio[hidden],
.dialogo-imprimir .destino-impressao[hidden] {
  display: none;
}

/* Para onde o Imprimir vai mandar: so informa, no mesmo desenho do resumo do
   assistente. Verde quando ha impressora, ambar quando falta algo. */
.destino-impressao {
  display: flex;
  align-items: center;
  gap: 0.5rem;
  margin: 0;
  padding: 0.5rem 0.75rem;
  border-left: 3px solid var(--up-borda);
  border-radius: 3px;
  background-color: var(--up-cinza-frio);
  font-size: 12.5px;
  color: var(--up-texto-suave);
}

.destino-impressao[data-estado="ok"] {
  border-left-color: #55a459;
  background-color: #eef7ee;
  color: #2f6a33;
}

.destino-impressao[data-estado="aviso"] {
  border-left-color: #e0a526;
  background-color: #fdf6e7;
  color: #7a5a14;
}

/* Botao trabalhando (Gerando.../Imprimindo...): o icone pulsa */

.botao-acao.processando .icone,
.botao-up.processando .icone {
  animation: pulsar-icone 0.9s ease-in-out infinite;
}

@keyframes pulsar-icone {
  0%, 100% { opacity: 1; }
  50% { opacity: 0.3; }
}

/* --- Ferramentas > Cadastro de Impressoras --------------------------------- */

/* Situacao do programa de impressao deste computador */
.cartao-agente {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 0.75rem 1rem;
  margin-bottom: 1rem;
  padding: 0.85rem 1rem;
  border: 1px solid var(--up-borda-suave);
  border-left: 4px solid var(--up-borda);
  border-radius: 6px;
  background-color: #fff;
}

.cartao-agente-icone {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 2.5rem;
  height: 2.5rem;
  flex: 0 0 auto;
  border-radius: 50%;
  background-color: var(--up-cinza-frio);
  color: var(--up-texto-suave);
}

.cartao-agente-texto {
  display: flex;
  flex: 1 1 18rem;
  flex-direction: column;
  gap: 0.1rem;
  min-width: 0;
}

.cartao-agente-texto strong {
  font-size: 13.5px;
  color: var(--up-texto);
}

.cartao-agente-texto span {
  font-size: 12px;
  color: var(--up-texto-suave);
}

.cartao-agente-acoes {
  display: flex;
  flex-wrap: wrap;
  gap: 0.4rem;
}

.cartao-agente-acoes [hidden] {
  display: none;
}

/* mesma altura dos botoes da barra de ferramentas */
.cartao-agente-acoes .botao-acao {
  height: 28px;
  padding: 0 0.85rem;
  gap: 0.5rem;
}

.cartao-agente[data-estado="ok"] {
  border-left-color: #55a459;
}

.cartao-agente[data-estado="ok"] .cartao-agente-icone {
  background-color: #e3f1e4;
  color: #3d7a42;
}

.cartao-agente[data-estado="ausente"],
.cartao-agente[data-estado="nao-autorizado"],
.cartao-agente[data-estado="desatualizado"] {
  border-left-color: #e0a526;
}

.cartao-agente[data-estado="ausente"] .cartao-agente-icone,
.cartao-agente[data-estado="nao-autorizado"] .cartao-agente-icone,
.cartao-agente[data-estado="desatualizado"] .cartao-agente-icone {
  background-color: #fdf6e7;
  color: #a3740f;
}

.cartao-agente[data-estado="verificando"] .cartao-agente-icone {
  animation: pulsar-icone 0.9s ease-in-out infinite;
}

.passos-instalacao {
  margin: 0 0 1.25rem;
  padding: 0.75rem 1rem 0.75rem 2.25rem;
  border: 1px dashed var(--up-borda);
  border-radius: 4px;
  font-size: 12.5px;
  color: var(--up-texto);
}

.passos-instalacao[hidden] {
  display: none;
}

.passos-instalacao li + li {
  margin-top: 0.35rem;
}

.tabela-impressoras .col-documento { width: 9rem; }
.tabela-impressoras .col-acoes { width: 7.5rem; }

.tabela-impressoras .texto-ausente {
  color: var(--up-texto-suave);
}

/* "Padrao": a impressora que ja vem escolhida ao imprimir o documento */
.tabela-impressoras .etiqueta-padrao {
  display: inline-flex;
  align-items: center;
  gap: 0.25rem;
}

/* "Tornar padrao" abaixo do "Sim": discreto, como um link */
.botao-tornar-padrao {
  display: block;
  margin: 0.2rem auto 0;
  padding: 0;
  border: 0;
  background: none;
  font-size: 11.5px;
  color: var(--up-azul-royal);
  text-decoration: underline;
}

.botao-tornar-padrao:hover {
  color: #003f80;
}

.acoes-impressora {
  display: inline-flex;
  gap: 0.3rem;
}

/* pagina de teste: contornado em azul, como o mover item da grade do Pedido.
   Classe dobrada: `.botao-icone-item` vem depois no arquivo e zeraria a borda. */
.botao-icone-item.botao-teste-impressora {
  border-color: var(--up-azul-royal);
  background-color: #fff;
  color: var(--up-azul-royal);
}

.botao-icone-item.botao-teste-impressora:hover:not(:disabled),
.botao-icone-item.botao-teste-impressora:focus-visible:not(:disabled) {
  background-color: var(--up-azul-royal);
  color: #fff;
}

/* dialogo Incluir/Alterar impressora */
.impressora-corpo {
  display: flex;
  flex-direction: column;
  gap: 1.1rem;
  padding: 1.25rem 1.25rem 0.9rem;
}

.impressora-corpo .campo select {
  padding: 0.5rem 0.65rem;
  font-size: 14px;
}

.impressora-apoio {
  margin: 0.3rem 0 0;
}

.impressora-documentos {
  min-width: 0;
  margin: 0;
  padding: 0;
  border: 0;
}

/* documento marcavel (varios ao mesmo tempo): o visto aparece a direita */
.opcao-marca {
  display: inline-flex;
  margin-left: auto;
  color: var(--up-azul-royal);
  opacity: 0;
  transform: scale(0.6);
  transition: opacity 0.15s, transform 0.15s;
}

.opcao-marcavel:has(input:checked) .opcao-marca {
  opacity: 1;
  transform: none;
}

@media (prefers-reduced-motion: reduce) {
  .botao-acao.processando .icone,
  .botao-up.processando .icone,
  .cartao-agente[data-estado="verificando"] .cartao-agente-icone {
    animation: none;
  }
}

/* --- Pauta de preco (aba Itens do documento de venda) ---------------------
   O <select> mora no rodape (`.rodape-documento .footer-start`); aqui so o
   aviso de "nenhuma pauta ativa". */

.aviso-pauta {
  margin: 0 0 0.75rem;
  font-size: 12px;
  color: var(--up-texto-suave);
}

/* Campo recusado: so a moldura muda de cor -- nada que mexa na altura da
   linha do formulario denso. */
.campo-invalido,
.campo input.campo-invalido {
  border-color: var(--up-primaria);
  box-shadow: 0 0 0 2px var(--up-primaria-fundo);
}

/* O modal "Local de trabalho" (Empresa + Filial em caixas .combo + Gravar)
   saiu em 02/10/2026: virou o painel "Filial de trabalho" (.painel-filial). */

.topo-acoes {
  display: flex;
  align-items: center;
  gap: 0.35rem;
  min-width: 0;
}

/* risco fino entre os atalhos e o cartao do usuario */
.topo-divisor {
  flex: 0 0 auto;
  width: 1px;
  height: 26px;
  margin: 0 0.35rem;
  background-color: var(--up-borda-suave);
}

/* o <form> do logout so existe pra dar POST em /logout -- display:contents
   tira a caixa dele do layout, entao o <button> vira filho direto do flex
   acima, exatamente como o <a> do Painel Admin. Sem isso o botao ficava
   fora do centro: o form (bloco comum) nao repassava o align-items:center
   pro botao dentro dele. */
.topo-acoes form {
  display: contents;
}

/* Atalhos do topo (Painel de Vendas, Painel Admin, Sair). Eram quadrados
   colados uns nos outros com um risco a esquerda; viraram botoes soltos de
   cantos arredondados (casca nova, 02/10/2026). */
.btn-topo {
  flex: 0 0 auto;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 36px;
  height: 36px;
  padding: 0;
  border: 0;
  border-radius: 10px;
  background: transparent;
  color: var(--up-cinza-chumbo);
  transition: background-color 0.15s ease, color 0.15s ease;
}

.btn-topo:hover,
.btn-topo:focus-visible {
  background-color: var(--up-primaria-fundo);
  color: var(--up-marca-escura);
}

.btn-topo.btn-sair:hover,
.btn-topo.btn-sair:focus-visible {
  color: var(--up-primaria);
  background-color: var(--up-primaria-fundo);
}

/* --- Barra de modulos ----------------------------------------------------- */

/* Casca nova (Modelo A do canvas, aprovado em 02/10/2026): a faixa branca de
   modulos em caixa alta, com icone azul-celeste e sublinhado no aberto, virou
   a faixa no azul escuro da marca. Cada modulo e uma pilula: icone num
   quadradinho na cor do modulo (classes mod-*), nome em caixa normal e a
   seta. O aberto fica branco com o texto escuro. A ordem continua a mesma,
   com Ferramentas sempre por ultimo. */

/* Cor de cada modulo: o botao, o painel e a aba leem --mod-cor/--mod-fundo,
   entao trocar a cor de um modulo e mexer so no token dele, no :root. */
.mod-cadastros { --mod-cor: var(--up-mod-cadastros); --mod-fundo: var(--up-mod-cadastros-fundo); }
.mod-vendas { --mod-cor: var(--up-mod-vendas); --mod-fundo: var(--up-mod-vendas-fundo); }
.mod-financeiro { --mod-cor: var(--up-mod-financeiro); --mod-fundo: var(--up-mod-financeiro-fundo); }
.mod-expedicao { --mod-cor: var(--up-mod-expedicao); --mod-fundo: var(--up-mod-expedicao-fundo); }
.mod-fiscal { --mod-cor: var(--up-mod-fiscal); --mod-fundo: var(--up-mod-fiscal-fundo); }
.mod-catalogo { --mod-cor: var(--up-mod-catalogo); --mod-fundo: var(--up-mod-catalogo-fundo); }
.mod-ferramentas { --mod-cor: var(--up-mod-ferramentas); --mod-fundo: var(--up-mod-ferramentas-fundo); }
.mod-sistema { --mod-cor: var(--up-mod-sistema); --mod-fundo: var(--up-mod-sistema-fundo); }

.barra-modulos {
  position: relative; /* ancora o painel suspenso */
  z-index: 1050;      /* acima do veu do menu aberto (body::after) */
  flex: 0 0 var(--up-barra-modulos-altura);
  height: var(--up-barra-modulos-altura);
  display: flex;
  align-items: center;
  gap: 0.25rem;
  padding: 0 1rem;
  background-color: var(--up-faixa-modulos);
}

.modulo {
  display: inline-flex;
  align-items: center;
  gap: 0.55rem;
  height: 34px;
  padding: 0 0.7rem 0 0.35rem;
  border: 0;
  border-radius: 11px;
  background: none;
  font-family: var(--up-fonte);
  font-size: 13.5px;
  font-weight: 700;
  color: #fff;
  white-space: nowrap;
  transition: background-color 0.15s ease;
}

.modulo-icone {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 26px;
  height: 26px;
  border-radius: 8px;
  background-color: var(--mod-cor);
  color: #fff;
}

/* a seta do fim: mais apagada que o nome */
.modulo > .icone:last-child {
  opacity: 0.7;
}

/* O realce do hover vale SO para o modulo fechado. No canvas ele tambem
   pegava o aberto, apagava o fundo branco e o nome escuro sumia contra a
   faixa (achado do cliente, 02/10/2026). */
.modulo:not(.aberto):hover,
.modulo:not(.aberto):focus-visible {
  background-color: var(--up-realce-sobre-escuro);
  outline: none;
}

.modulo.aberto {
  background-color: var(--up-superficie);
  color: var(--up-marca-escura);
}

/* --- Painel suspenso do modulo -------------------------------------------- */

/* O painel desce da faixa na largura toda, com os cantos de baixo
   arredondados: a esquerda a apresentacao do modulo (icone grande na cor
   dele, nome e resumo) e, ao lado, os grupos em colunas. Cada item traz o
   icone num quadradinho claro, o nome e uma frase curta do que a tela faz. */
.mega-menu {
  position: absolute;
  top: 100%;
  left: 0;
  right: 0;
  z-index: 1050;
  display: flex;
  gap: 1rem;
  padding: 1.5rem 1.75rem 1.75rem;
  background-color: var(--up-superficie);
  border-radius: 0 0 20px 20px;
  box-shadow: var(--up-sombra-painel-modulo);
  max-height: calc(100vh - var(--up-header-altura) - var(--up-barra-modulos-altura) - 1rem);
  overflow-y: auto;
}

.mega-menu[hidden] {
  display: none;
}

/* Veu atras do painel: escurece a tela aberta e mostra que o clique fora
   fecha (o clique cai no document -- menu.js). Comeca embaixo da faixa de
   modulos, que fica por cima dele para outro modulo poder ser escolhido. */
body.menu-modulo-aberto::after {
  content: "";
  position: fixed;
  inset: calc(var(--up-header-altura) + var(--up-barra-modulos-altura)) 0 0 0;
  z-index: 1040;
  background-color: var(--up-veu-menu);
}

/* Do tamanho do nome e do resumo, ate 9rem (04/10/2026, pedido do
   cliente): a coluna fixa de 13rem deixava um vao entre o nome do modulo e
   os icones, maior ainda nos modulos com poucas telas (Vendas, Fiscal,
   Catalogo virtual). O resumo mais comprido quebra em duas linhas. */
.mega-menu-intro {
  flex: 0 0 auto;
  width: max-content;
  max-width: 9rem;
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  gap: 0.6rem;
  padding-right: 1rem;
  border-right: 1px solid var(--up-borda-suave);
}

.mega-menu-icone {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 52px;
  height: 52px;
  border-radius: 14px;
  background-color: var(--mod-cor);
  color: #fff;
}

.mega-menu-nome {
  font-size: 19px;
  line-height: 1.2;
  font-weight: 700;
  color: var(--up-marca-escura);
}

.mega-menu-resumo {
  font-size: 13px;
  line-height: 1.4;
  color: var(--up-texto-suave);
}

.mega-menu-colunas {
  display: flex;
  gap: 1.5rem;
  min-width: 0;
}

.grupo-menu {
  display: flex;
  flex-direction: column;
  gap: 0.5rem;
}

/* so o nome do grupo, em caixa alta pequena -- o icone de pastinha e a
   linha embaixo sairam com a casca nova */
.grupo-titulo {
  margin: 0;
  padding-left: 0.6rem;
  font-size: 11px;
  font-weight: 700;
  letter-spacing: 0.1em;
  text-transform: uppercase;
  color: var(--up-texto-suave);
}

/* ate 5 itens por coluna, em TODOS os menus (regra do cliente: 4 em
   04/10/2026, 5 desde 05/10/2026 para sobrar espaco no Financeiro, o maior
   painel); grupo maior abre outra coluna ao lado, em vez de uma lista
   comprida */
.lista-menu {
  display: grid;
  grid-template-rows: repeat(5, auto);
  grid-auto-flow: column;
  /* cada coluna da largura do item mais comprido dela (04/10/2026): a
     coluna fixa de 16.5rem sobrava muito em "Contas a Receber" sozinho */
  grid-auto-columns: minmax(12.5rem, max-content);
  gap: 0.1rem 0.6rem;
  list-style: none;
  margin: 0;
  padding: 0;
}

.item-menu {
  display: flex;
  align-items: center;
  gap: 0.75rem;
  padding: 0.5rem 0.6rem;
  border-radius: 12px;
  text-decoration: none;
  color: var(--up-marca-escura);
}

.item-menu-icone {
  flex: 0 0 auto;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 36px;
  height: 36px;
  border-radius: 10px;
  background-color: var(--mod-fundo);
  color: var(--mod-cor);
}

.item-menu-texto {
  display: flex;
  flex-direction: column;
  gap: 0.1rem;
  min-width: 0;
}

.item-menu-nome {
  display: flex;
  align-items: center;
  gap: 0.4rem;
  font-size: 13.5px;
  font-weight: 700;
  color: var(--up-marca-escura);
}

.item-menu-desc {
  font-size: 11.5px;
  color: var(--up-texto-suave);
}

.item-menu:hover,
.item-menu:focus-visible {
  background-color: var(--up-papel-parede);
  outline: none;
}

/* Funcao do menu que ainda nao existe ("Em breve" no `title` e no selo) --
   hoje as etapas da Expedicao sem tela. E um <span>, nao um <a>: nada a
   seguir. Mesma opacidade do item travado do menu Opcoes
   (.menu-opcoes-item:disabled), e o hover NAO acende, para nao prometer um
   clique que nao faz nada. */
.item-menu.item-menu-inativo {
  opacity: 0.5;
  cursor: not-allowed;
}

.item-menu.item-menu-inativo:hover {
  background-color: transparent;
}

/* --- Lapis: arrumar os icones do painel (menu_ordem.js, 04/10/2026) ----- */

/* Discreto no pe da coluna do nome; acende no hover. Vale para todo painel
   de modulo, o JS e quem poe. */
.mega-menu-lapis {
  margin-top: auto;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 30px;
  height: 30px;
  padding: 0;
  border: 1px solid transparent;
  border-radius: 8px;
  background: none;
  color: var(--up-texto-suave);
  opacity: 0.55;
  cursor: pointer;
  transition: opacity 0.15s ease, background-color 0.15s ease;
}

.mega-menu-lapis:hover,
.mega-menu-lapis:focus-visible {
  opacity: 1;
  background-color: var(--up-papel-parede);
  border-color: var(--up-borda-suave);
  color: var(--mod-cor);
  outline: none;
}

.mega-menu-lapis[hidden],
.mega-menu-edicao[hidden] {
  display: none;
}

.mega-menu-edicao {
  margin-top: auto;
  display: flex;
  flex-direction: column;
  gap: 0.4rem;
  width: 100%;
  min-width: 8.5rem;
}

.mega-menu-dica {
  margin: 0 0 0.2rem;
  font-size: 11.5px;
  line-height: 1.35;
  color: var(--up-texto-suave);
}

.mega-menu-edicao .botao-acao.cad-botao {
  height: 30px;
  padding: 0 0.9rem;
  border-radius: 8px;
  font-size: 12.5px;
}

.mega-menu-restaurar {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: 0.35rem;
  height: 26px;
  padding: 0;
  border: 0;
  background: none;
  font-family: var(--up-fonte);
  font-size: 11.5px;
  font-weight: 700;
  color: var(--up-texto-suave);
  cursor: pointer;
}

.mega-menu-restaurar:hover,
.mega-menu-restaurar:focus-visible {
  color: var(--up-marca-escura);
  text-decoration: underline;
  outline: none;
}

/* grupo que ficou sem tela nenhuma (todas arrastadas para outro): some
   fora do modo de arrumar; arrumando, vira um alvo para soltar */
.mega-menu:not(.editando) .grupo-menu:not(:has(.lista-menu > li)) {
  display: none;
}

.mega-menu.editando .lista-menu:not(:has(> li)) {
  min-width: 12.5rem;
  min-height: 52px;
  border: 1px dashed var(--up-borda);
  border-radius: 12px;
}

.mega-menu.editando .lista-menu > li {
  cursor: grab;
}

.mega-menu.editando .item-menu {
  /* contorno, e nao borda: nao empurra o painel 2px ao entrar */
  outline: 1px dashed var(--up-borda);
  outline-offset: -1px;
  background-color: var(--up-superficie);
  pointer-events: none;
}

.mega-menu.editando .lista-menu > li:hover .item-menu {
  outline-color: var(--mod-cor);
  background-color: var(--up-papel-parede);
}

.mega-menu.editando .lista-menu > li.arrastando .item-menu {
  opacity: 0.4;
  outline-style: solid;
  outline-color: var(--mod-cor);
}

.item-menu-alca {
  margin-left: auto;
  display: inline-flex;
  color: var(--up-texto-suave);
}

.item-menu-selo {
  padding: 1px 6px;
  border-radius: 999px;
  background-color: var(--up-intervencao-fundo);
  color: var(--up-intervencao);
  font-size: 10px;
  font-weight: 700;
}

/* --- Area trocada a cada navegacao (SPA) ---------------------------------- */

/* O #dynamic-content (base.html) entra ENTRE o .app-uniplus e a faixa de
   abas/painel, entao precisa repassar o contexto flex: sem isto o
   `flex: 1 1 auto` do .painel nao acha coluna nenhuma e a tela perde altura.
   `min-height: 0` e o que deixa o .painel rolar por dentro -- item de flex
   aninhado tem min-height auto por padrao e cresceria ate estourar a janela
   em vez de ativar o proprio overflow-y. */
#dynamic-content {
  flex: 1 1 auto;
  min-height: 0;
  display: flex;
  flex-direction: column;
}

/* Enquanto o router busca a proxima tela. Fica numa barra fina sobre o
   cabecalho (o cursor de "carregando" saiu em 22/09/2026: o sistema usa so a
   setinha -- ver "Cursor do sistema", no fim da folha): a tela atual continua visivel e clicavel (o router
   cancela o fetch anterior se vier outro clique). */

body.navegando::before {
  content: "";
  position: fixed;
  inset: 0 auto auto 0;
  z-index: 2000;
  width: 100%;
  height: 2px;
  background: linear-gradient(90deg, transparent, var(--up-desktop), transparent);
  animation: up-navegando 900ms linear infinite;
}

@keyframes up-navegando {
  from { transform: translateX(-100%); }
  to { transform: translateX(100%); }
}

@media (prefers-reduced-motion: reduce) {
  body.navegando::before {
    animation: none;
    background: var(--up-desktop);
  }
}

/* --- Area de trabalho vazia ----------------------------------------------- */

/* Papel de parede "Marca d'agua" (modelo B do canvas, 04/10/2026): logo
   Conectsys grande e claro no centro da area. `cover` sem `fixed`, para o
   centro ser o da area, abaixo do topo e da faixa de modulos. */
.area-trabalho {
  flex: 1 1 auto;
  background: var(--up-papel-parede) url("/static/img/papel-parede-marca.svg") center / cover no-repeat;
}

/* --- Abas das funcoes abertas --------------------------------------------- */

/* Casca nova (Modelo A do canvas, aprovado em 02/10/2026). A faixa e uma
   tira cinza-azulada na largura toda; sem aba aberta ela some e fica so o
   papel de parede (a aba fixa "Inicio" saiu no mesmo dia). A aba tem os cantos de cima arredondados, o icone do
   modulo, o titulo em caixa normal e o "x"; a da tela aberta e branca com
   um friso de 3px na cor do modulo. Antes: abas brancas/cinza em caixa alta
   de 11px, e a ativa no azul da marca (27/09/2026).

   A aba tem a LARGURA DO NOME, com teto de 220px e reticencias depois (pedido
   do cliente: "Caixa" nao precisa de aba grande). Quando nao cabem todas, as
   mais antigas vao para o "Mais abas" no fim da faixa -- ver abas.js. */
.abas {
  position: relative; /* ancora a lista do "Mais abas" */
  z-index: 1030;      /* a lista passa por cima do painel da tela */
  flex: 0 0 var(--up-faixa-abas-altura);
  height: var(--up-faixa-abas-altura);
  display: flex;
  align-items: flex-end;
  gap: 4px;
  padding: 0 1rem;
  background-color: var(--up-faixa-abas);
}

.abas[hidden] {
  display: none;
}

.aba {
  flex: 0 0 auto;
  display: inline-flex;
  align-items: center;
  gap: 0.45rem;
  height: 32px;
  border-radius: 10px 10px 0 0;
  background-color: var(--up-aba-fundo);
  font-size: 12.5px;
  font-weight: 600;
  white-space: nowrap;
  text-decoration: none;
  color: var(--up-marca-escura);

  /* Setinha normal, e nao a mao de link. So as abas INATIVAS sao <a> (a ativa
     e um <span> e o "x" e um <button>), entao sem isto a mao aparecia uma sim
     outra nao ao passar pela faixa. O cursor e herdado, entao o "x" de dentro
     acompanha. Elas continuam clicaveis -- muda so o ponteiro. */
  cursor: default;
}

.aba {
  max-width: 220px;
  padding: 0 0.25rem 0 0.75rem;
}

.aba-icone {
  flex: 0 0 auto;
  display: inline-flex;
  color: var(--mod-cor, var(--up-marca-escura));
}

.aba-titulo {
  min-width: 0;
  overflow: hidden;
  text-overflow: ellipsis;
}

a.aba:hover {
  background-color: var(--up-aba-fundo-hover);
  color: var(--up-marca-escura);
}

/* Aba em uso: branca, com o friso na cor do modulo. O friso e box-shadow
   inset, e nao border-top, para a aba ativa ter a mesma altura das outras --
   sem isso a faixa "pulava" a cada troca. */
.aba.ativa {
  background-color: var(--up-superficie);
  box-shadow: inset 0 3px 0 var(--mod-cor, var(--up-primaria));
}

.aba-fechar {
  flex: 0 0 auto;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 22px;
  height: 22px;
  padding: 0;
  border: 0;
  border-radius: 6px;
  background: none;
  line-height: 1;
  color: var(--up-texto-suave);
  text-decoration: none;
}

.aba-fechar:hover {
  background-color: var(--up-primaria-fundo);
  color: var(--up-primaria);
}

/* Arrastar para reordenar (01/10/2026, ver abas.js > ligarArrasto): o titulo
   nao seleciona ao segurar, e a aba em movimento passa por cima das vizinhas */
.aba {
  user-select: none;
  -webkit-user-drag: none;
}

.abas.com-arrasto,
.abas.com-arrasto .aba {
  cursor: grabbing;
}

.aba.arrastando {
  position: relative;
  z-index: 5;
  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.18);
}

/* --- "Mais abas" (02/10/2026) ---------------------------------------------- */
/* Botao no fim da faixa, com a quantidade agrupada, e a lista que desce dele:
   as abas que sairam da barra, a usada ha menos tempo em cima. */
.abas-mais {
  flex: 0 0 auto;
  display: inline-flex;
  align-items: center;
  gap: 0.45rem;
  height: 32px;
  margin-left: auto;
  padding: 0 0.7rem;
  border: 0;
  border-radius: 10px 10px 0 0;
  background-color: var(--up-aba-fundo);
  font-family: var(--up-fonte);
  font-size: 12.5px;
  font-weight: 600;
  color: var(--up-marca-escura);
}

.abas-mais[hidden] {
  display: none;
}

.abas-mais:hover,
.abas-mais.aberto {
  background-color: var(--up-superficie);
}

.abas-mais-qtd {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  min-width: 20px;
  height: 20px;
  padding: 0 6px;
  border-radius: 999px;
  background-color: var(--up-marca-escura);
  color: #fff;
  font-size: 11px;
  font-weight: 700;
}

.abas-lista {
  position: absolute;
  top: 100%;
  right: 1rem;
  width: 22.5rem;
  border: 1px solid var(--up-borda-suave);
  border-radius: 0 0 14px 14px;
  background-color: var(--up-superficie);
  box-shadow: var(--up-sombra-painel-modulo);
  overflow: hidden;
}

.abas-lista[hidden] {
  display: none;
}

.abas-lista-cabecalho {
  display: flex;
  flex-direction: column;
  gap: 0.15rem;
  padding: 0.75rem 1rem 0.5rem;
  border-bottom: 1px solid var(--up-borda-suave);
  font-size: 12px;
  color: var(--up-texto-suave);
}

.abas-lista-cabecalho strong {
  font-size: 13.5px;
  color: var(--up-marca-escura);
}

.abas-lista-itens {
  max-height: 22rem;
  overflow-y: auto;
  padding: 0.35rem;
}

.abas-lista-item {
  display: flex;
  align-items: center;
  gap: 0.25rem;
  padding-right: 0.25rem;
  border-radius: 10px;
}

.abas-lista-item:hover {
  background-color: var(--up-papel-parede);
}

.abas-lista-abrir {
  flex: 1 1 auto;
  display: flex;
  align-items: center;
  gap: 0.65rem;
  min-width: 0;
  padding: 0.45rem 0.5rem;
  text-decoration: none;
  color: var(--up-marca-escura);
}

.abas-lista-icone {
  flex: 0 0 auto;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 30px;
  height: 30px;
  border-radius: 9px;
  background-color: var(--mod-fundo, var(--up-cinza-frio));
  color: var(--mod-cor, var(--up-marca-escura));
}

.abas-lista-textos {
  display: flex;
  flex-direction: column;
  min-width: 0;
  line-height: 1.25;
}

.abas-lista-nome {
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  font-size: 13px;
  font-weight: 600;
}

.abas-lista-onde {
  font-size: 11.5px;
  color: var(--up-texto-suave);
}

.abas-lista-rodape {
  display: flex;
  justify-content: flex-end;
  padding: 0.5rem 0.75rem 0.6rem;
  border-top: 1px solid var(--up-borda-suave);
}

.abas-lista-fechar-todas {
  height: 28px;
  padding: 0 0.75rem;
  border: 1px solid var(--up-borda);
  border-radius: 8px;
  background-color: var(--up-superficie);
  font-family: var(--up-fonte);
  font-size: 12px;
  font-weight: 600;
  color: var(--up-cinza-chumbo);
}

.abas-lista-fechar-todas:hover {
  border-color: var(--up-primaria-claro);
  color: var(--up-marca-escura);
}

/* --- Painel da funcao aberta ---------------------------------------------- */

/* Com a faixa de abas na largura toda (casca nova, 02/10/2026) o painel
   nao continua mais a aba como uma ficha de pasta: os quatro cantos sao
   iguais e ele ganha um respiro em cima. Era `0 4px 4px 4px`, colado. */
.painel {
  flex: 1 1 auto;
  overflow-y: auto;
  margin: 8px 8px 8px;
  padding: 1.25rem 1.5rem;
  background-color: #fff;
  border: 1px solid var(--up-borda);
  border-radius: 6px;
  box-shadow: var(--up-sombra-card);
}

/* A tela vira uma camada so dela (03/10/2026): os menus e listas que abrem
   dentro dela (Opcoes, filtro de coluna, seletores...) ficam sempre ABAIXO
   da casca -- barra e painel dos modulos, veu do menu, painel da filial --
   seja qual for o z-index de cada um. Antes o Opcoes (1050) empatava com a
   barra dos modulos e aparecia por cima do painel aberto. O Aguarde
   (popover) e o balao do sistema base (no body) nao sao afetados.

   Dialogo modal aberto (04/10/2026): os que moram DENTRO da tela (ex.: o da
   engrenagem das grades, partials/grade_ferramentas.html) ficavam presos
   nesta camada e a casca passava por cima -- o cabecalho escuro do dialogo
   sumia atras da barra dos modulos e das abas. Com dialogo aberto o
   isolamento sai (o Bootstrap poe `modal-open` no body ao abrir e tira ao
   fechar); nessa hora o fundo escuro ja cobre tudo e nenhum menu da tela
   abre por cima. */
main.painel {
  isolation: isolate;
}

body.modal-open main.painel {
  isolation: auto;
}

@media (max-width: 575.98px) {
  .topo {
    flex-basis: 3.25rem;
    height: 3.25rem;
    padding-left: 0.85rem;
  }

  .marca {
    height: 1.9rem;
  }

  .topo-usuario {
    display: none;
  }

  .painel {
    padding: 1rem;
  }
}

/* ==========================================================================
   Dialogo de confirmacao

   O botao SIM era o laranja #e47646/#d4622b da folha original (identidade
   Uniplus); agora le --up-confirmar, que segue o azul da marca Next ERP. O NAO
   continua no cinza neutro -- e o descarte, nao tem cor de marca.
     .btn-cancel-up -> #93a3b5 / borda #00000080 (NAO)
     .modal-content -> raio .3rem   .line-bottom -> 1px rgba(0,0,0,.1)
   ========================================================================== */

.dialogo {
  width: min(30rem, calc(100vw - 2rem));
  padding: 0;
  border: 0;
  border-radius: 0.3rem;
  box-shadow: 0 10px 34px rgba(0, 6, 12, 0.3);
  color: var(--up-texto);
}

.dialogo::backdrop {
  background-color: rgba(0, 0, 0, 0.45);
}

.dialogo-titulo {
  margin: 0;
  padding: 2rem 2rem 1.5rem;
  border-bottom: 1px solid rgba(0, 0, 0, 0.1);
  font-size: 1.3rem;
  font-weight: 600;
  text-align: center;
  color: #3a4550;
}

.dialogo-acoes {
  display: flex;
  justify-content: center;
  gap: 0.6rem;
  padding: 1.25rem 2rem 1.5rem;
}

/* --- Senha tecnica do Painel Admin (base.html + js/senha_tecnica.js) ------- */

.dialogo-senha-tecnica {
  width: min(24rem, calc(100vw - 2rem));
  text-align: center;
}

.senha-tecnica-icone {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 3rem;
  height: 3rem;
  margin-top: 1.5rem;
  border-radius: 50%;
  background-color: #dceefb;
  color: var(--up-azul-royal);
}

.dialogo-senha-tecnica .dialogo-titulo {
  padding: 0.6rem 2rem 0.25rem;
  border-bottom: 0;
}

.dialogo-senha-tecnica .dialogo-texto {
  padding-top: 0;
}

.senha-tecnica-campo {
  padding: 1rem 2rem 0;
}

/* Campo e botoes na altura padrao da casa: o campo com o mesmo recuo dos
   formularios (2px), e os botoes com os 28px dos botoes de acao. Antes o
   dialogo nascia com um campo de ~48px e botoes de ~34px, destoando do resto
   do sistema. Escopado a este dialogo: os outros (Sim/Nao, sucesso, recusa)
   seguem com a medida deles. */
.senha-tecnica-campo input {
  width: 100%;
  padding: 2px 0.75rem;
  height: 28px;
  border: 1px solid var(--up-borda);
  border-radius: 4px;
  font-family: var(--up-fonte);
  font-size: 15px;
  letter-spacing: 0.35em;
  text-align: center;
}

.dialogo-senha-tecnica .dialogo-acoes {
  padding: 1rem 2rem 1.25rem;
}

.dialogo-senha-tecnica .botao-up {
  height: 28px;
  padding: 0 1.1rem;
  font-size: 12px;
}

/* o placeholder nao herda o espacamento largo dos digitos da senha */
.senha-tecnica-campo input::placeholder {
  font-size: 13px;
  letter-spacing: normal;
}

.senha-tecnica-campo input:focus {
  outline: none;
  border-color: var(--up-azul-sky);
  box-shadow: 0 0 0 3px rgba(54, 169, 225, 0.2);
}

.senha-tecnica-campo input.campo-invalido {
  border-color: var(--up-primaria);
  box-shadow: 0 0 0 3px var(--up-primaria-fundo);
}

.senha-tecnica-erro {
  margin: 0.45rem 0 0;
  font-size: 12px;
  font-weight: 600;
  color: var(--up-primaria);
}

.senha-tecnica-erro[hidden] {
  display: none;
}

.senha-tecnica-recusada {
  animation: senha-tecnica-sacudir 0.3s ease-in-out;
}

/* Expedicao > Conferencia, a pergunta dos volumes: o mesmo dialogo da senha
   tecnica (icone, pergunta, um campo, OK/Cancelar), mas o numero nao precisa
   do espacamento largo dos digitos da senha. */
.dialogo-volumes .senha-tecnica-campo input {
  letter-spacing: normal;
}

@keyframes senha-tecnica-sacudir {
  0%, 100% { transform: translateX(0); }
  20%, 60% { transform: translateX(-6px); }
  40%, 80% { transform: translateX(6px); }
}

@media (prefers-reduced-motion: reduce) {
  .senha-tecnica-recusada {
    animation: none;
  }
}

/* --- Minha Senha (menu do usuario) -------------------------------------------
   O dialogo e o da senha tecnica (icone, titulo, botoes de 28px); os tres
   campos sao `.campo` com rotulo em cima, na medida padrao dos formularios
   (#formMinhaSenha entra nas listas "Cadastros de Cliente, Produto e
   Vendedor"). */
.minha-senha-campos {
  display: flex;
  flex-direction: column;
  gap: 0.55rem;
  padding: 1rem 2rem 0;
  text-align: left;
}

/* --- Liberacao de desconto pelo supervisor (venda_documento_form) ----------
   Mesma casca da senha tecnica (icone redondo, titulo, campo com erro que
   sacode), com dois campos -- usuario e senha -- e o percentual pedido em
   destaque, para o supervisor saber o que esta liberando. */

.dialogo-supervisor {
  width: min(25rem, calc(100vw - 2rem));
  text-align: center;
}

.dialogo-supervisor[open] {
  animation: up-sucesso-entrada 0.28s cubic-bezier(0.2, 0.9, 0.3, 1.25);
}

.supervisor-icone {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 3rem;
  height: 3rem;
  margin-top: 1.5rem;
  border-radius: 50%;
  background-color: #fdecea;
  color: #d70a23;
}

.dialogo-supervisor .dialogo-titulo {
  padding: 0.6rem 1.75rem 0;
  border-bottom: 0;
  font-size: 1.15rem;
  line-height: 1.3;
}

.dialogo-supervisor .dialogo-texto {
  padding: 0.35rem 1.75rem 0;
}

.dialogo-supervisor .dialogo-texto:empty {
  display: none;
}

.supervisor-pedido {
  display: inline-flex;
  align-items: baseline;
  gap: 0.5rem;
  margin-top: 0.75rem;
  padding: 0.3rem 0.85rem;
  border-radius: 999px;
  background-color: #f1f4f6;
  font-size: 12px;
  color: var(--up-texto-suave);
}

.supervisor-pedido strong {
  font-size: 15px;
  color: var(--up-marca-escura);
}

.supervisor-instrucao {
  margin: 0.9rem 0 0;
  font-size: 13px;
  font-weight: 600;
  color: var(--up-azul-royal);
}

.supervisor-campos {
  display: grid;
  gap: 0.5rem;
  padding: 0.6rem 2rem 0;
}

.supervisor-campo {
  display: flex;
  align-items: center;
  gap: 0.5rem;
  padding: 0 0.65rem;
  border: 1px solid var(--up-borda);
  border-radius: 4px;
  background-color: #fff;
  color: var(--up-texto-suave);
  cursor: text;
}

.supervisor-campo:focus-within {
  border-color: var(--up-azul-sky);
  box-shadow: 0 0 0 3px rgba(54, 169, 225, 0.2);
  color: var(--up-azul-royal);
}

.supervisor-campo.campo-invalido {
  border-color: var(--up-primaria);
  box-shadow: 0 0 0 3px var(--up-primaria-fundo);
}

.supervisor-campo input {
  flex: 1;
  min-width: 0;
  padding: 0.5rem 0;
  border: 0;
  outline: none;
  background: transparent;
  font-family: var(--up-fonte);
  font-size: 14px;
  color: var(--up-texto);
}

.supervisor-campos .senha-tecnica-erro {
  margin: 0;
}

.botao-up {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: 0.45rem;
  min-width: 7rem;
  padding: 0.45rem 1.5rem;
  border: 1px solid transparent;
  border-radius: 4px;
  font-family: var(--up-fonte);
  font-size: 13px;
  font-weight: 700;
  letter-spacing: 0.04em;
  text-transform: uppercase;
  color: #fff;
  transition: background-color 0.2s;
}

.botao-sim {
  background-color: var(--up-confirmar);
  border-color: var(--up-confirmar-escuro);
}

.botao-sim:hover,
.botao-sim:focus-visible {
  background-color: var(--up-confirmar-escuro);
}

/* --- Confirmacao de gravacao (pedido/orcamento) ----------------------------
   Circulo e check se desenham em sequencia (stroke-dashoffset), o dialogo
   entra com um leve "pulo" e a barra no pe esvazia no tempo que falta para
   fechar sozinho. A duracao da barra vem do JS (TEMPO_SUCESSO). */

.dialogo-sucesso {
  width: min(24rem, calc(100vw - 2rem));
  overflow: hidden;
  text-align: center;
}

.dialogo-sucesso[open] {
  animation: up-sucesso-entrada 0.28s cubic-bezier(0.2, 0.9, 0.3, 1.25);
}

.dialogo-sucesso::backdrop {
  background-color: rgba(21, 26, 61, 0.45);
}

.sucesso-icone {
  display: flex;
  justify-content: center;
  padding-top: 1.75rem;
}

.sucesso-circulo,
.sucesso-check {
  stroke: #1e9e5a;
  stroke-width: 3;
  stroke-linecap: round;
  stroke-linejoin: round;
}

.sucesso-circulo {
  stroke-dasharray: 151;
  stroke-dashoffset: 151;
  animation: up-sucesso-traco 0.5s ease-out 0.1s forwards;
}

.sucesso-check {
  stroke-width: 3.5;
  stroke-dasharray: 36;
  stroke-dashoffset: 36;
  animation: up-sucesso-traco 0.3s ease-out 0.55s forwards;
}

.sucesso-titulo {
  margin: 0.75rem 0 0;
  padding: 0 1.5rem;
  font-size: 1.35rem;
  font-weight: 700;
  color: var(--up-marca-escura);
}

.sucesso-texto {
  margin: 0.3rem 0 0;
  padding: 0 1.5rem;
  font-size: 13px;
  color: var(--up-texto-suave);
}

.sucesso-resumo {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  margin: 1.1rem 1.5rem 0;
  border: 1px solid var(--up-borda-suave);
  border-radius: 6px;
  background-color: var(--up-cinza-frio);
}

.sucesso-resumo > div {
  padding: 0.55rem 0.4rem;
}

.sucesso-resumo > div + div {
  border-left: 1px solid var(--up-borda-suave);
}

.sucesso-resumo dt {
  font-size: 10.5px;
  font-weight: 700;
  letter-spacing: 0.04em;
  text-transform: uppercase;
  color: var(--up-texto-suave);
}

.sucesso-resumo dd {
  margin: 0.1rem 0 0;
  font-size: 15px;
  font-weight: 700;
  color: var(--up-azul-royal);
  white-space: nowrap;
}

/* Pergunta "imprimir?" da confirmacao de gravacao; `.falhou` quando a
   impressao nao saiu (mesmo vermelho da caixa de motivo da recusa). */
.sucesso-pergunta {
  display: flex;
  align-items: flex-start;
  gap: 0.55rem;
  margin: 1rem 1.5rem 0;
  padding: 0.65rem 0.85rem;
  border-left: 4px solid var(--up-azul-royal);
  border-radius: 4px;
  background-color: #eef6fd;
  color: var(--up-azul-royal);
  text-align: left;
}

.sucesso-pergunta[hidden],
.dialogo-sucesso .botao-up[hidden] {
  display: none;
}

.sucesso-pergunta .icone {
  flex-shrink: 0;
  margin-top: 0.1rem;
}

.sucesso-pergunta p {
  margin: 0;
  font-size: 14px;
  font-weight: 600;
  line-height: 1.4;
  color: var(--up-texto);
}

.sucesso-pergunta.falhou {
  border-left-color: #d70a23;
  background-color: #fdf2f2;
  color: #d70a23;
}

.sucesso-tempo {
  height: 4px;
  background-color: var(--up-borda-suave);
}

.sucesso-tempo span {
  display: block;
  height: 100%;
  background-color: #1e9e5a;
  transform-origin: left;
  animation: up-sucesso-tempo linear forwards;
}

/* --- Operacao recusada ------------------------------------------------------
   Reaproveita a casca da confirmacao (`.dialogo-sucesso`: entrada, titulo,
   icone) trocando o verde pelo vermelho da lixeira, e o resumo pela caixa do
   motivo. Na entrada o dialogo balanca de leve -- o "nao" do gesto. */

.dialogo-recusa[open] {
  animation: up-sucesso-entrada 0.28s cubic-bezier(0.2, 0.9, 0.3, 1.25),
    up-recusa-balanco 0.4s ease-in-out 0.28s;
}

.recusa-circulo,
.recusa-sinal {
  stroke: #d70a23;
  stroke-width: 3;
  stroke-linecap: round;
}

.recusa-circulo {
  stroke-dasharray: 151;
  stroke-dashoffset: 151;
  animation: up-sucesso-traco 0.5s ease-out 0.1s forwards;
}

.recusa-sinal {
  stroke-width: 3.5;
}

.recusa-ponto {
  fill: #d70a23;
}

.recusa-motivo {
  margin: 1rem 1.5rem 0;
  padding: 0.65rem 0.85rem;
  border-left: 4px solid #d70a23;
  border-radius: 4px;
  background-color: #fdf2f2;
  text-align: left;
}

.recusa-motivo-rotulo {
  display: block;
  font-size: 10.5px;
  font-weight: 700;
  letter-spacing: 0.04em;
  text-transform: uppercase;
  color: #a33a37;
}

.recusa-motivo p {
  margin: 0.15rem 0 0;
  font-size: 14px;
  font-weight: 600;
  line-height: 1.4;
  color: var(--up-texto);
}

@keyframes up-recusa-balanco {
  0%, 100% { transform: translateX(0); }
  20%, 60% { transform: translateX(-6px); }
  40%, 80% { transform: translateX(6px); }
}

@keyframes up-sucesso-entrada {
  from { opacity: 0; transform: scale(0.92); }
  to { opacity: 1; transform: scale(1); }
}

@keyframes up-sucesso-traco {
  to { stroke-dashoffset: 0; }
}

@keyframes up-sucesso-tempo {
  from { transform: scaleX(1); }
  to { transform: scaleX(0); }
}

@media (prefers-reduced-motion: reduce) {
  .dialogo-sucesso[open],
  .sucesso-circulo,
  .sucesso-check,
  .recusa-circulo {
    animation: none;
    stroke-dashoffset: 0;
  }
}

/* --- Baixa que mandou o pedido para a Expedicao (02/10/2026) -----------------
   Fluxo com liberacao financeira: a baixa de titulo de Pedido de Faturamento
   engatilha o envio para Expedicao > Preparacao (baixa_form.html,
   #dialogoBaixaFluxo). Veste a casca do sucesso e mostra os passos numa
   linha: verde o que a baixa ja fez, anel da marca no passo atual (o mesmo
   desenho dos passos da Preparacao, .prep-passos). Os passos nascem
   apagados e o JS acende um a um (.feito / .atual). Eram 4, com a Entrega em
   cinza no fim; o cliente tirou (02/10/2026): o financeiro so precisa ver ate
   o Aguardando separacao. */
.dialogo-sucesso.dialogo-baixa-fluxo {
  width: min(32rem, calc(100vw - 2rem));
}

.bxf-passos {
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr));
  margin: 1.1rem 1.5rem 0;
  padding: 0.9rem 0.25rem 0.75rem;
  border: 1px solid var(--up-borda-suave);
  border-radius: 6px;
  background-color: var(--up-cinza-frio);
  list-style: none;
}

.bxf-passo {
  position: relative;
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 0.2rem;
  padding: 0 0.25rem;
  color: var(--up-texto-suave);
  transition: color 0.3s ease;
}

/* o traco que liga a bola anterior a esta: centro a centro, por tras das bolas */
.bxf-passo + .bxf-passo::before {
  content: "";
  position: absolute;
  top: 14px;
  right: 50%;
  left: -50%;
  height: 2px;
  background-color: var(--up-borda);
  transition: background-color 0.3s ease;
}

.bxf-passo.feito::before,
.bxf-passo.atual::before {
  background-color: var(--up-resolvida);
}

.bxf-bola {
  position: relative;
  z-index: 1;
  display: flex;
  align-items: center;
  justify-content: center;
  width: 30px;
  height: 30px;
  border: 2px solid var(--up-borda);
  border-radius: 50%;
  background-color: var(--up-superficie);
  color: var(--up-texto-suave);
  transition: background-color 0.3s ease, border-color 0.3s ease, color 0.3s ease,
    transform 0.3s ease;
}

.bxf-passo strong {
  margin-top: 0.2rem;
  font-size: 12px;
  line-height: 1.25;
}

.bxf-passo small {
  font-size: 10.5px;
  line-height: 1.3;
  overflow-wrap: anywhere;
}

.bxf-passo.feito {
  color: var(--up-resolvida);
}

.bxf-passo.feito .bxf-bola {
  border-color: var(--up-resolvida);
  background-color: var(--up-resolvida);
  color: var(--up-superficie);
  transform: scale(1.08);
}

.bxf-passo.atual {
  color: var(--up-primaria);
}

.bxf-passo.atual .bxf-bola {
  border-color: var(--up-primaria);
  color: var(--up-primaria);
  animation: up-bxf-pulso 1.6s ease-in-out infinite;
}

.bxf-passo.feito strong,
.bxf-passo.atual strong {
  color: var(--up-marca-escura);
}

/* o passo atual "respira": o anel da marca cresce e some, devagar */
@keyframes up-bxf-pulso {
  0%,
  100% {
    box-shadow: 0 0 0 0 var(--up-primaria-fundo);
  }

  50% {
    box-shadow: 0 0 0 6px var(--up-primaria-fundo);
  }
}

.bxf-nota {
  margin: 0.85rem 1.5rem 0;
  font-size: 12.5px;
  line-height: 1.45;
  color: var(--up-texto);
}

@media (prefers-reduced-motion: reduce) {
  .bxf-passo,
  .bxf-passo::before,
  .bxf-bola {
    transition: none;
  }

  .bxf-passo.atual .bxf-bola {
    animation: none;
    box-shadow: 0 0 0 4px var(--up-primaria-fundo);
  }
}

.botao-nao {
  background-color: #93a3b5;
  border-color: rgba(0, 0, 0, 0.5);
}

.botao-nao:hover,
.botao-nao:focus-visible {
  background-color: #7d8d9f;
}

.botao-pdf {
  background-color: var(--up-gerar-pdf);
  border-color: var(--up-gerar-pdf-escuro);
}

.botao-pdf:hover:enabled,
.botao-pdf:focus-visible {
  background-color: var(--up-gerar-pdf-escuro);
}

/* com o "Gerar PDF" a confirmacao de gravacao tem tres botoes (Sim / Gerar
   PDF / Nao): o dialogo passou de 24rem para 28rem e os botoes dele ficaram
   mais enxutos para caber os tres numa linha. Em tela estreita eles quebram
   de linha em vez de estourar a largura. */
.dialogo-sucesso {
  width: min(28rem, calc(100vw - 2rem));
}

.dialogo-sucesso .dialogo-acoes {
  flex-wrap: wrap;
  padding-left: 1.25rem;
  padding-right: 1.25rem;
}

.dialogo-sucesso .botao-up {
  min-width: 6rem;
  padding-left: 1rem;
  padding-right: 1rem;
}

/* Listas "Impressora" e "Modelo" da confirmacao de gravacao. Antes so havia
   a do modelo, sozinha e com margem propria; agora as duas dividem a mesma
   linha (o dialogo tem largura de sobra) e a margem passou para o grupo. Em
   tela estreita a segunda desce para a linha de baixo. Qualquer uma pode
   estar escondida -- so a impressora, so o modelo, ou nenhuma. */
.sucesso-escolhas {
  display: flex;
  flex-wrap: wrap;
  gap: 0.6rem 0.85rem;
  margin: 0.85rem 1.5rem 0;
}

.sucesso-escolhas[hidden] {
  display: none;
}

/* Rotulo e campo nas medidas da casa (10.5px / 11.5px), alinhados a margem
   da pergunta de impressao logo acima. */
.sucesso-campo {
  flex: 1 1 9rem;
  display: flex;
  flex-direction: column;
  gap: 0.2rem;
  min-width: 0;
  text-align: left;
}

.sucesso-campo[hidden] {
  display: none;
}

.sucesso-campo label {
  font-size: 10.5px;
  font-weight: 700;
  color: var(--up-texto-suave);
  text-transform: uppercase;
  letter-spacing: 0.04em;
}

.sucesso-campo select {
  width: 100%;
  padding: 0.3rem 0.4rem;
  border: 1px solid var(--up-borda);
  border-radius: 4px;
  font-family: var(--up-fonte);
  font-size: 11.5px;
  color: var(--up-texto);
  background-color: #fff;
}

.sucesso-campo select:focus {
  outline: none;
  border-color: var(--up-primaria-claro);
}

/* nada a escolher (uma impressora so, ou programa de impressao antigo): o
   campo continua mostrando o destino, mas sem parecer clicavel. O motivo vai
   no `title`. */
.sucesso-campo select:disabled {
  color: var(--up-texto-suave);
  background-color: var(--up-cinza-frio);
  cursor: not-allowed;
}

/* ==========================================================================
   Barra de ferramentas e grade de listagem
   ========================================================================== */

.barra-ferramentas {
  display: flex;
  align-items: center;
  /* barra fina: os botoes andam juntos, como na barra do ERP */
  gap: 0.3rem;
  margin-bottom: 0.5rem;
}

.campo-pesquisa {
  flex: 1 1 auto;
  display: flex;
  align-items: center;
  gap: 0.5rem;
  padding: 0.35rem 0.75rem;
  background-color: #fff;
  border: 1px solid var(--up-borda);
  border-radius: 4px;
  color: var(--up-texto-suave);
}

.campo-pesquisa input {
  flex: 1 1 auto;
  border: 0;
  outline: 0;
  font-family: var(--up-fonte);
  font-size: 13px;
  color: var(--up-texto);
  background: none;
}

/* A pesquisa na MESMA altura dos botoes ao lado, senao a barra fica com dois
   patamares. So dentro da barra de ferramentas: o mesmo `.campo-pesquisa` e
   usado no dialogo de pesquisa de produtos, onde o tamanho normal e o certo. */
.barra-ferramentas .campo-pesquisa {
  height: 28px;
  padding-block: 0;
  padding-inline: 0.6rem;
}

.barra-ferramentas .campo-pesquisa input {
  font-size: 12px;
}

.botao-acao {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: 0.4rem;
  padding: 0.42rem 1rem;
  border: 1px solid transparent;
  border-radius: 4px;
  font-family: var(--up-fonte);
  font-size: 12px;
  font-weight: 700;
  letter-spacing: 0.04em;
  text-transform: uppercase;
  text-decoration: none;
  color: #fff;
  white-space: nowrap;
}

.botao-incluir,
.botao-gravar,
.botao-ok {
  background-color: #55a459;
  border-color: #468f4a;
}

.botao-incluir:hover,
.botao-gravar:hover,
.botao-ok:hover {
  background-color: #468f4a;
  color: #fff;
}

.botao-cancelar,
.botao-limpar {
  background-color: #93a3b5;
  border-color: rgba(0, 0, 0, 0.35);
}

.botao-cancelar:hover,
.botao-limpar:hover {
  background-color: #7d8d9f;
  color: #fff;
}

.botao-acao:disabled {
  opacity: 0.55;
  /* acao indisponivel (sem permissao, documento travado...): o cursor ja
     avisa, e o motivo fica no `title` do botao */
  cursor: not-allowed;
}

.grade-envolucro {
  overflow-x: auto;
  border: 1px solid var(--up-borda);
  border-radius: 4px;
  background-color: #fff;

  /* ANCORA para o que estiver posicionado em absolute aqui dentro -- hoje os
     <label class="visually-hidden"> de cada controle das grades do Painel
     Admin. Sem um ancestral posicionado, `position: absolute` se resolve
     contra o bloco inicial do DOCUMENTO: os rotulos das linhas do fim ficam
     ancorados centenas de pixels abaixo da janela e esticam a area rolavel do
     documento (medido: 170px de rolagem fantasma). Como o <body> tem
     overflow:hidden, isso nao rola com a roda -- mas o navegador rola o
     documento sozinho ao focar um campo, o app inteiro sobe e aparece uma
     faixa do fundo vermelho embaixo do card. */
  position: relative;
}

.grade {
  width: 100%;
  border-collapse: collapse;
  font-size: 12.5px;
}

.grade th {
  padding: 0.5rem 0.65rem;
  background-color: #f2f5f7;
  border-bottom: 1px solid var(--up-borda);
  font-weight: 700;
  text-align: left;
  white-space: nowrap;
  color: var(--up-texto);
}

.grade td {
  padding: 0.42rem 0.65rem;
  border-bottom: 1px solid var(--up-borda-suave);
  white-space: nowrap;
}

.grade tbody tr:hover td {
  background-color: var(--up-primaria-fundo);
}

.grade .num {
  text-align: right;
}

/* nomes das colunas sempre a esquerda, mesmo nas colunas numericas */
.grade th.num {
  text-align: left;
}

/* Coluna do tamanho do conteudo: com layout automatico, width minimo faz a
   coluna encolher ate caber o texto e sobra vai para as colunas sem a classe. */
.grade th.encolher {
  width: 1px;
  white-space: nowrap;
}

/* --- Colunas arrastaveis e redimensionaveis -------------------------------- */

.grade th {
  position: relative;
}

.grade th.movel {
  cursor: grab;
  user-select: none;
}

.puxador {
  position: absolute;
  top: 0;
  right: 0;
  width: 6px;
  height: 100%;
  cursor: col-resize;
  z-index: 2;
}

.puxador:hover,
.puxador.ativo {
  background-color: var(--up-azul-sky);
}

body.redimensionando,
body.redimensionando * {
  cursor: col-resize !important;
  user-select: none;
}

/* depois do primeiro redimensionamento a largura declarada passa a mandar */
.grade.fixa {
  table-layout: fixed;
}

.grade.fixa th,
.grade.fixa td {
  overflow: hidden;
  text-overflow: ellipsis;
}

.grade th.movel:active {
  cursor: grabbing;
}

.grade th.arrastando {
  opacity: 0.45;
}

.grade th.alvo {
  box-shadow: inset 3px 0 0 var(--up-azul-sky);
}

.grade .destaque {
  color: var(--up-azul-royal);
}

.grade .vazia td {
  padding: 1.5rem;
  text-align: center;
  color: var(--up-texto-suave);
}

.grade tfoot td {
  padding: 0.5rem 0.65rem;
  background-color: #f2f5f7;
  border-top: 1px solid var(--up-borda);
  font-weight: 700;
}

.grade .acao {
  text-align: center;
}

/* --- Variante "planilha" da grade ------------------------------------------
   Modificador de `.grade` para as telas em que o que importa e densidade de
   leitura, e nao respiro: fonte pequena, celulas apertadas, linhas finas e
   claras nos DOIS sentidos e coluna de numeracao com o fundo do cabecalho,
   fazendo o papel do indice de linhas do Excel. Nasceu na grade de itens do
   Pedido/Orcamento (para acompanhar a tela original do ERP) e e usada hoje em:

     #gradeItens            Pedido/Orcamento > Itens
     #gradeSituacaoPadrao   Painel Admin > Vendas
     #gradeUsuarios         Painel Admin > Usuarios

   Marcar a grade com `.grade-planilha` e o envolucro com `.planilha` e o que
   liga tudo -- `.grade` sozinha continua com o visual arejado das listagens do
   resto do sistema (inclusive o dialogo de pesquisa de produtos). */

.grade-envolucro.planilha {
  border-color: #d4d9dd;
}

.grade-planilha {
  font-family: Tahoma, Arial, Helvetica, sans-serif;
  font-size: 11.5px;
}

.grade-planilha th {
  padding: 3px 6px;
  /* degrade vertical bem sutil do branco pro cinza claro, como o cabecalho de
     coluna de uma planilha */
  background-color: #f5f5f5;
  background-image: linear-gradient(#fdfdfd, #f1f2f4);
  border-bottom: 1px solid #c9ced3;
  border-right: 1px solid #dfe3e6;
  font-size: 11.5px;
  font-weight: 700;
  color: #2c3e50;
}

/* Sem background-color aqui: o fundo branco ja vem do .grade-envolucro e
   deixar a celula transparente preserva o realce de linha no hover e o da
   linha em edicao (regras de especificidade menor). */
.grade-planilha td {
  padding: 2px 6px;
  border-bottom: 1px solid #e0e0e0;
  border-right: 1px solid #e0e0e0;
}

/* ultima coluna e ultima linha encostam na moldura do envolucro -- borda
   propria ali viraria linha dupla */
.grade-planilha th:last-child,
.grade-planilha td:last-child {
  border-right: 0;
}

.grade-planilha tbody tr:last-child td {
  border-bottom: 0;
}

/* Coluna de numeracao: indice da planilha -- fundo do cabecalho, negrito,
   centralizado e do tamanho exato do conteudo.
   `.grade.grade-planilha` (duas classes) de proposito: com uma so, o realce de
   `.grade tbody tr:hover td` teria especificidade maior e repintaria o indice
   junto com a linha. */
/* --- Altura da linha da grade de itens ------------------------------------
   Alvo pedido: ~21px por linha (vinha de ~23,4).

   A altura da linha e o MAIOR requisito entre as celulas, entao os dois pisos
   precisam cair juntos -- mexer so num deles nao muda nada, porque o outro
   vira o novo limite:

     celula de texto  = line-height + padding (2+2) + borda (1)
     celula de Acoes  = altura do botao + padding (2+2) + borda (1)

   Com line-height e botao em 16px, os dois dao 21px e a linha para ai.
   Escopado em #gradeItens: as grades do Painel Admin compartilham
   `.grade-planilha`, mas tem <select> de 20px dentro e ficariam com texto
   espremido sem ganhar altura nenhuma. */
#gradeItens td {
  line-height: 16px;
}

/* Botoes de acao encolhidos DENTRO da grade densa.
   Eram eles, e nao o padding da celula, que definiam a altura da linha: com
   26px fixos a linha ficava em 33px (26 + 3 + 3 + borda) por mais que o `td`
   encolhesse. Em 18px quem manda volta a ser o texto, e a linha cai para ~22px
   -- cerca de 30% mais itens visiveis sem rolar. Escopado na variante densa
   para nao mexer no mesmo botao usado fora dela. */
.grade-planilha .botao-icone-item {
  width: 18px;
  height: 18px;
  border-radius: 3px;
}

.grade.grade-planilha .indice {
  width: 1px;
  background-color: #f5f5f5;
  font-weight: 700;
  text-align: center;
  color: var(--up-cinza-chumbo);
}

/* `.grade .vazia td` tem a mesma especificidade de `.grade-planilha td` e
   perde por vir antes na folha -- a linha de "nada encontrado" precisa do
   respiro de volta. */
.grade-planilha tbody tr.vazia td {
  padding: 1.25rem;
}

/* Celula que hospeda um campo (hoje o <select> de pauta): o campo e quem
   ganha o respiro, a celula fica praticamente sem padding. */
.grade-planilha td.celula-campo {
  padding: 1px 4px;
}

/* Campo dentro da celula: sem moldura enquanto esta parado, para a linha nao
   engordar nem virar um formulario; a borda so aparece no hover/foco, quando
   o usuario ja esta interagindo. A seta e desenhada aqui (appearance: none)
   porque a nativa do Windows nao cabe em 20px de altura. */
.grade-planilha .campo-celula {
  width: 100%;
  height: 20px;
  padding: 0 17px 0 4px;
  border: 1px solid transparent;
  border-radius: 2px;
  background-color: transparent;
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 5'%3E%3Cpath d='M0 0h8L4 5z' fill='%237b8085'/%3E%3C/svg%3E");
  background-repeat: no-repeat;
  background-position: right 5px center;
  background-size: 7px 5px;
  font-family: inherit;
  font-size: inherit;
  color: var(--up-texto);
  appearance: none;
}

.grade-planilha .campo-celula:hover {
  border-color: var(--up-borda);
  background-color: #fff;
}

.grade-planilha .campo-celula:focus {
  border-color: var(--up-azul-royal);
  background-color: #fff;
  outline: none;
}

/* Situacao: cor do texto, nada de badge -- um retangulo colorido no meio de
   uma planilha quebraria a altura da linha e o alinhamento da coluna. */
.grade-planilha .situacao-ativo {
  color: #1d7a45;
}

.grade-planilha .situacao-inativa {
  color: #a3423a;
}

/* --- Controles editaveis DENTRO da linha ---------------------------------- */
/* Regra que vale pra todos: nada aqui pode aumentar a altura da linha (20px de
   campo dentro de uma celula de 3px de padding). Por isso checkbox miudo,
   toggle reduzido e input numerico sem as setinhas. */

.grade-planilha .coluna-marca {
  width: 1px;
  text-align: center;
}

.grade-planilha .coluna-percentual {
  width: 6.5rem;
}

/* Espaco liberado para o bloco de permissoes: o nome trunca com reticencias
   em vez de esticar a coluna (o `title` no <td> mostra o nome inteiro).
   O limite vai no <span>, nao no <td>: com `table-layout: auto` o navegador
   trata `max-width` de celula como sugestao e estica a coluna assim mesmo. */
.grade-planilha .nome-usuario {
  display: inline-block;
  max-width: 9.5rem;
  overflow: hidden;
  text-overflow: ellipsis;
  vertical-align: bottom;
}

/* Coluna "Acesso": interruptor + texto "Ativo/Inativo" (ver admin/usuarios.html) */
.grade-planilha .coluna-situacao {
  width: 1px;
  white-space: nowrap;
}

.grade-planilha td.coluna-marca,
.grade-planilha td.coluna-percentual,
.grade-planilha td.coluna-situacao {
  text-align: center;
}

/* Checkbox fino: o nativo em 13px fica na altura certa e mantem o
   comportamento de teclado (espaco marca/desmarca). */
.grade-planilha .marca-celula {
  width: 13px;
  height: 13px;
  margin: 0;
  vertical-align: middle;
  accent-color: var(--up-azul-royal);
}

/* Input numerico: alinhado a direita como todo numero da planilha, e sem as
   setas do navegador -- elas nao cabem em 20px e roubariam a largura do valor. */
.grade-planilha .numero-celula {
  text-align: right;
  padding: 0 4px;
  background-image: none;
  cursor: text;
}

.grade-planilha .numero-celula::-webkit-outer-spin-button,
.grade-planilha .numero-celula::-webkit-inner-spin-button {
  margin: 0;
  appearance: none;
}

.grade-planilha .numero-celula {
  appearance: textfield;
}

/* Toggle da situacao: mesma peca do Painel Admin > Vendas (.chave-liga),
   reduzida pra caber na linha. Sobrescreve so as medidas. */
.grade-planilha .chave-celula {
  display: inline-flex;
  align-items: center;
  gap: 0.35rem;
  font-size: inherit;
}

.grade-planilha .chave-celula .chave-liga-trilho {
  width: 26px;
  height: 14px;
  margin-top: 0;
}

.grade-planilha .chave-celula .chave-liga-trilho::after {
  top: 2px;
  left: 2px;
  width: 10px;
  height: 10px;
}

.grade-planilha .chave-celula .chave-liga-entrada:checked + .chave-liga-trilho::after {
  transform: translateX(12px);
}

/* Acesso na grade de Usuarios: verde = ativo, vermelho = inativo, no trilho e
   no texto ao lado. So aqui (`.chave-celula`): os toggles de regra do Painel
   Admin > Vendas seguem azul/cinza, porque la "desligado" nao e um alerta. */
.grade-planilha .chave-celula .chave-liga-trilho {
  background-color: #d63a3a;
}

.grade-planilha .chave-celula .chave-liga-entrada:checked + .chave-liga-trilho {
  background-color: #1e9e5a;
}

.grade-planilha .chave-celula .rotulo-situacao {
  /* largura de "Inativo": o interruptor nao dança ao trocar o texto */
  min-width: 3.4em;
  font-weight: 700;
  text-align: left;
  color: #c62828;
}

.grade-planilha .chave-celula .chave-liga-entrada:checked ~ .rotulo-situacao {
  color: #1b7f47;
}


/* Linha com alteracao ainda nao gravada: o mesmo azul da linha em edicao da
   grade de itens, pro operador enxergar o que o GRAVAR vai levar. */
.grade-planilha tbody tr.linha-alterada td {
  background-color: #eef6fd;
}

.grade-planilha tbody tr.linha-alterada .indice {
  background-color: #dceefb;
  color: var(--up-azul-royal);
}

/* Bloqueio de seguranca do ERP: so indicacao, nao e editavel aqui. */
.grade-planilha .marca-bloqueado {
  margin-left: 0.3rem;
  font-size: 9.5px;
  font-weight: 700;
  text-transform: uppercase;
  color: #a3423a;
}

/* Marcador de administrador ao lado do nome: "(ADMIN)" em negrito, sem fundo
   nem pilula -- um retangulo colorido aqui quebraria a altura da linha.
   Sem margin-left: o espaco antes ja esta no proprio HTML. */
.grade-planilha .marca-admin {
  font-size: 10px;
  letter-spacing: 0.03em;
  color: var(--up-texto-suave);
}

.grade-planilha .coluna-vendedor {
  width: 13rem;
}

/* --- Seletor de vendedor (Painel Admin > Usuarios) --------------------------
   O botao da celula herda o visual do `.campo-celula` (o <select> que ele
   substitui); o painel abre em `position: fixed` logo abaixo dele, com a
   pesquisa em cima e a lista rolando por dentro. */
.grade-planilha .vendedor-escolha {
  display: block;
  overflow: hidden;
  text-align: left;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.grade-planilha .vendedor-escolha:disabled {
  cursor: default;
}

.seletor-vendedor {
  position: fixed;
  z-index: 1060;
  display: flex;
  flex-direction: column;
  border: 1px solid var(--up-borda);
  border-radius: 4px;
  background-color: #fff;
  box-shadow: var(--up-sombra-menu);
}

.seletor-vendedor[hidden] {
  display: none;
}

.seletor-vendedor .campo-pesquisa {
  flex: 0 0 auto;
  margin: 0.4rem;
  padding: 0.25rem 0.6rem;
}

.seletor-vendedor-lista {
  flex: 1 1 auto;
  min-height: 0;
  margin: 0;
  padding: 0 0 0.3rem;
  overflow-y: auto;
  list-style: none;
  font-size: 12.5px;
}

.seletor-vendedor-lista li {
  padding: 0.25rem 0.7rem;
  color: var(--up-texto);
  white-space: nowrap;
}

.seletor-vendedor-lista li.ativo {
  background-color: var(--up-primaria-fundo);
}

.seletor-vendedor-lista li[aria-selected="true"] {
  font-weight: 700;
  color: var(--up-azul-royal);
}

.seletor-vendedor-vazio {
  margin: 0;
  padding: 0.4rem 0.7rem 0.6rem;
  font-size: 12.5px;
  color: var(--up-texto-suave);
}

.seletor-vendedor-vazio[hidden] {
  display: none;
}

/* --- Seletor de pautas (Painel Admin > Usuarios) ----------------------------
   A coluna "Pautas de preco" era um <select> de escolha unica ate 23/09/2026.
   Hoje sao duas informacoes na mesma celula -- as pautas MARCADAS (as que o
   vendedor usa sem senha de supervisor) e a FAVORITA (estrela dourada, a que
   abre no pedido) --, e nenhum controle nativo mostra as duas. O botao da
   celula resume ("estrela + nome + 2 outras") e o painel abaixo dele, irmao do
   .seletor-vendedor, e onde se marca. */
.grade-planilha .pautas-escolha {
  display: flex;
  align-items: center;
  gap: 0.25rem;
  overflow: hidden;
  text-align: left;
  white-space: nowrap;
}

.grade-planilha .pautas-escolha:disabled {
  cursor: default;
}

/* o nome da pauta e a unica parte que pode encolher: a estrela e o "+2" sao
   curtos e nao podem sumir antes dele */
.grade-planilha .pautas-resumo {
  overflow: hidden;
  text-overflow: ellipsis;
}

.grade-planilha .pautas-extra {
  flex: 0 0 auto;
  font-size: 10px;
  color: var(--up-texto-suave);
}

/* a estrela segue o texto pelo `currentColor` em todo lugar, MENOS aqui: e
   justamente a cor que diz qual e a favorita */
.pauta-favorita,
.pauta-estrela.favorita {
  color: var(--up-favorita);
}

.pauta-favorita {
  display: inline-flex;
  flex: 0 0 auto;
}

/* preenchida quando acesa: a silhueta cheia se le de relance numa grade de 13
   colunas, o contorno nao */
.pauta-favorita .icone,
.pauta-estrela.favorita .icone {
  fill: currentColor;
}

.seletor-pautas {
  position: fixed;
  z-index: 1060;
  display: flex;
  flex-direction: column;
  border: 1px solid var(--up-borda);
  border-radius: 4px;
  background-color: #fff;
  box-shadow: var(--up-sombra-menu);
}

.seletor-pautas[hidden] {
  display: none;
}

.seletor-pautas-titulo {
  flex: 0 0 auto;
  margin: 0;
  padding: 0.4rem 0.7rem 0.3rem;
  border-bottom: 1px solid var(--up-borda-suave);
  font-size: 11.5px;
  font-weight: 700;
  color: var(--up-azul-royal);
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.seletor-pautas-lista {
  flex: 1 1 auto;
  min-height: 0;
  margin: 0;
  padding: 0.2rem 0;
  overflow-y: auto;
  list-style: none;
  font-size: 12.5px;
}

.pauta-opcao {
  display: flex;
  align-items: center;
  gap: 0.4rem;
  padding: 0.2rem 0.5rem 0.2rem 0.7rem;
  color: var(--up-texto);
}

.pauta-opcao.marcada {
  background-color: var(--up-primaria-fundo);
}

/* o rotulo inteiro e area de clique do checkbox -- alvo maior numa lista
   densa, e o mesmo gesto das colunas de marca da grade */
.pauta-marca {
  display: flex;
  flex: 1 1 auto;
  align-items: center;
  gap: 0.4rem;
  min-width: 0;
  cursor: pointer;
}

.pauta-marca span {
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.pauta-inativa {
  font-size: 10.5px;
  font-style: normal;
  color: var(--up-texto-suave);
}

/* apagada ate ser acesa: contorno cinza, para o dourado da favorita ser a
   unica coisa colorida da lista */
.pauta-estrela {
  display: inline-flex;
  flex: 0 0 auto;
  padding: 0.1rem;
  border: 0;
  border-radius: 3px;
  background: none;
  color: var(--up-borda);
  cursor: pointer;
}

.pauta-estrela:hover {
  color: var(--up-favorita);
}

.pauta-estrela:focus-visible {
  outline: 2px solid var(--up-azul-royal);
  outline-offset: 1px;
}

/* Cadeado, ao lado da estrela (23/09/2026): ABERTO a pauta entra no pedido
   direto; FECHADO ela continua na lista do vendedor, mas so entra com a senha
   de um supervisor. Nasce apagado como a estrela -- a lista so ganha cor onde
   uma decisao foi tomada --, e acende no vermelho de restricao quando
   fechado. */
.pauta-cadeado {
  display: inline-flex;
  flex: 0 0 auto;
  padding: 0.1rem;
  border: 0;
  border-radius: 3px;
  background: none;
  color: var(--up-borda);
  cursor: pointer;
}

.pauta-cadeado:hover,
.pauta-cadeado.fechado {
  color: var(--up-restrito);
}

.pauta-cadeado:focus-visible {
  outline: 2px solid var(--up-azul-royal);
  outline-offset: 1px;
}

/* Pauta DESMARCADA: ela nao aparece para o vendedor, entao o nome sai riscado
   e apagado -- o risco e o sinal de "desativada" que o usuario pediu
   (23/09/2026). A estrela e o cadeado ficam desativados (o JS poe o
   `disabled`): nao ha favorita nem liberacao a definir numa pauta que ele nem
   ve. O caminho e marcar a pauta primeiro. */
.pauta-opcao.desmarcada .pauta-marca span {
  color: var(--up-texto-suave);
  text-decoration: line-through;
}

.pauta-opcao.desmarcada .pauta-estrela,
.pauta-opcao.desmarcada .pauta-cadeado {
  opacity: 0.4;
  cursor: default;
}

/* botao desativado nao responde ao mouse: o vermelho do hover confundiria */
.pauta-opcao.desmarcada .pauta-cadeado:hover {
  color: var(--up-borda);
}

/* Contagem de cadeados no resumo da celula ("🔒 2"): da para varrer a coluna
   e ver quem tem pauta pedindo supervisor sem abrir o painel. Curta e fixa,
   como o "+2" das marcadas. */
.grade-planilha .pautas-com-senha {
  display: inline-flex;
  flex: 0 0 auto;
  align-items: center;
  gap: 0.1rem;
  font-size: 10px;
  color: var(--up-restrito);
}

.seletor-pautas-ajuda {
  flex: 0 0 auto;
  margin: 0;
  padding: 0.35rem 0.7rem 0.5rem;
  border-top: 1px solid var(--up-borda-suave);
  font-size: 10.5px;
  line-height: 1.35;
  color: var(--up-texto-suave);
}

/* "so Next" na coluna Next ERP: inativo no Uniplus e ativo aqui. Mesmo
   desenho do "bloq." da coluna ao lado (texto miudo, sem pilula, para nao
   engordar a linha), mas na cor da marca: e uma excecao escolhida, nao um
   alerta. */
.grade-planilha .marca-so-next {
  margin-left: 0.3rem;
  font-size: 9.5px;
  font-weight: 700;
  text-transform: uppercase;
  color: var(--up-primaria);
}

.grade-planilha .marca-so-next[hidden] {
  display: none;
}

/* --- Filtro por coluna (funil no titulo da grade) ---------------------------
   Pedido do cliente em 23/09/2026 para a grade de Usuarios: o autofiltro do
   Excel. O funil fica apagado ate a coluna ter filtro; filtrada, ele acende
   na cor da marca e fica PREENCHIDO -- numa fileira de 14 titulos, a silhueta
   cheia e o que se acha de relance. O painel e irmao do .seletor-pautas
   (fixed, abre embaixo do botao) -- ver js/filtro_colunas.js. */
.filtro-coluna-botao {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 16px;
  height: 16px;
  margin-left: 3px;
  padding: 0;
  border: 1px solid transparent;
  border-radius: 3px;
  background: none;
  color: var(--up-texto-suave);
  vertical-align: middle;
  cursor: pointer;
}

.filtro-coluna-botao:hover,
.filtro-coluna-botao[aria-expanded="true"] {
  border-color: var(--up-borda);
  background-color: #fff;
  color: var(--up-azul-royal);
}

.filtro-coluna-botao.ativo {
  border-color: var(--up-primaria);
  background-color: var(--up-primaria-fundo);
  color: var(--up-primaria);
}

.filtro-coluna-botao.ativo .icone {
  fill: currentColor;
}

.filtro-coluna {
  position: fixed;
  z-index: 1060;
  display: flex;
  flex-direction: column;
  border: 1px solid var(--up-borda);
  border-radius: 4px;
  background-color: #fff;
  box-shadow: var(--up-sombra-menu);
  font-size: 12px;
}

.filtro-coluna[hidden] {
  display: none;
}

.filtro-coluna-titulo {
  flex: 0 0 auto;
  margin: 0;
  padding: 0.4rem 0.7rem 0.3rem;
  border-bottom: 1px solid var(--up-borda-suave);
  font-size: 11.5px;
  font-weight: 700;
  color: var(--up-azul-royal);
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.filtro-coluna .campo-pesquisa {
  flex: 0 0 auto;
  margin: 0.4rem 0.5rem 0.2rem;
  padding: 0.2rem 0.5rem;
}

.filtro-coluna .campo-pesquisa input {
  font-size: 12px;
}

/* "(Selecionar tudo)" e cada valor: checkbox, texto que trunca e, colada na
   direita, a quantidade de linhas -- o resumo da coluna */
.filtro-coluna-todos,
.filtro-coluna-item {
  display: flex;
  align-items: center;
  gap: 0.45rem;
  margin: 0;
  padding: 0.2rem 0.7rem;
  color: var(--up-texto);
  cursor: pointer;
}

.filtro-coluna-todos {
  flex: 0 0 auto;
  border-bottom: 1px solid var(--up-borda-suave);
  font-weight: 700;
}

.filtro-coluna-item:hover,
.filtro-coluna-todos:hover {
  background-color: var(--up-primaria-fundo);
}

.filtro-coluna-todos input,
.filtro-coluna-item input {
  flex: 0 0 auto;
  margin: 0;
  accent-color: var(--up-azul-royal);
}

.filtro-coluna-valor {
  flex: 1 1 auto;
  min-width: 0;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.filtro-coluna-qtd {
  flex: 0 0 auto;
  font-size: 10.5px;
  font-variant-numeric: tabular-nums;
  color: var(--up-texto-suave);
}

.filtro-coluna-lista {
  flex: 1 1 auto;
  min-height: 0;
  margin: 0;
  padding: 0.15rem 0;
  overflow-y: auto;
  list-style: none;
}

.filtro-coluna-vazio {
  margin: 0;
  padding: 0.4rem 0.7rem;
  color: var(--up-texto-suave);
}

.filtro-coluna-vazio[hidden] {
  display: none;
}

/* botoes de tela (.botao-acao) encolhidos: o painel tem 250px e os dois
   precisam caber lado a lado sem quebrar o texto */
.filtro-coluna-acoes {
  flex: 0 0 auto;
  display: flex;
  justify-content: flex-end;
  gap: 0.4rem;
  padding: 0.4rem 0.5rem;
  border-top: 1px solid var(--up-borda-suave);
}

.filtro-coluna-acoes .botao-acao {
  padding: 0.25rem 0.65rem;
  font-size: 11px;
}

/* "Limpar filtros" na barra da grade: so aparece com algum funil aceso. Cara
   de link, e nao de botao cheio -- e um atalho, nao uma acao da tela. */
.limpar-filtros {
  display: inline-flex;
  align-items: center;
  gap: 0.3rem;
  padding: 0.2rem 0.3rem;
  border: 0;
  background: none;
  font-size: 12px;
  font-weight: 700;
  color: var(--up-primaria);
  cursor: pointer;
}

.limpar-filtros:hover {
  text-decoration: underline;
}

.limpar-filtros[hidden] {
  display: none;
}

/* --- Grade AG Grid --------------------------------------------------------- */
/* A listagem de pedidos usa AG Grid; o resto do sistema segue com .grade.
   Aqui o tema alpine e calibrado com os mesmos tokens do ERP. */

/* painel em coluna: a grade ocupa a altura que sobra e rola por dentro */
.painel.painel-coluna {
  display: flex;
  flex-direction: column;
  overflow: hidden;
  /* o rodape da grade (engrenagem, exportar, "X de Y") ja e a ultima linha:
     o respiro cheio de baixo do .painel so engordava a faixa */
  padding-bottom: 0.45rem;
}

.grade-ag {
  flex: 1 1 auto;
  min-height: 12rem;
  width: 100%;

  /* A grade nasce invisivel e `.pronta` a revela em onFirstDataRendered (ver
     revelarQuandoPronta em grade_ferramentas.js). Entre createGrid() e o
     primeiro bloco de linhas o AG Grid pinta com a largura/ordem PADRAO das
     colunas e so entao aplica o estado salvo: as colunas andam na frente do
     usuario. No MPA o branco do reload escondia isso; com a injecao do
     router.js a casca nao pisca mais e o salto ficou evidente.

     `opacity`, e nao `display:none`/`visibility:hidden`: o AG Grid precisa
     medir o container para calcular a coluna `flex: 1`, e escondido de
     verdade ele mede zero. A classe entra por JS -- se o script nao rodar, o
     temporizador de seguranca de grade_ferramentas.js revela assim mesmo. */
  opacity: 0;
}

.grade-ag.pronta {
  opacity: 1;
  transition: opacity 0.2s ease;
}

@media (prefers-reduced-motion: reduce) {
  .grade-ag.pronta {
    transition: none;
  }
}

/* Densidade: as listagens seguem a mesma regua da grade de itens do
   Pedido/Orcamento (.grade-planilha) -- fonte 11.5px e 6px de padding lateral
   na celula. O que NAO da para trazer de la e a altura da linha: no AG Grid ela
   e opcao de JS (`rowHeight`/`headerHeight`, aplicada como estilo inline em
   cada linha), nao CSS -- ver os tres *_grade.js. */
.grade-ag.ag-theme-alpine {
  --ag-font-family: var(--up-fonte);
  --ag-font-size: 11.5px;
  --ag-foreground-color: var(--up-texto);
  --ag-background-color: #fff;
  --ag-border-color: var(--up-borda);
  --ag-wrapper-border-radius: 4px;
  --ag-borders: solid 1px;

  --ag-header-background-color: #f2f5f7;
  --ag-header-foreground-color: var(--up-texto);
  --ag-header-column-separator-display: block;
  --ag-header-column-separator-color: var(--up-borda);
  --ag-header-column-separator-height: 100%;
  --ag-header-column-separator-width: 1px;

  --ag-row-border-color: var(--up-borda-suave);
  --ag-cell-horizontal-border: solid var(--up-borda-suave);
  /* 6px = o mesmo padding lateral de `.grade-planilha td` */
  --ag-cell-horizontal-padding: 6px;
  --ag-row-hover-color: var(--up-primaria-fundo);
  --ag-selected-row-background-color: #dceefb;

  --ag-checkbox-checked-color: var(--up-azul-royal);
  --ag-input-focus-border-color: var(--up-azul-sky);
  --ag-range-selection-border-color: transparent;
}

.grade-ag .ag-header-cell-text {
  font-weight: 700;
}

/* nome da coluna sempre a esquerda, mesmo nas colunas numericas */
.grade-ag .ag-header-cell-label {
  justify-content: flex-start;
}

/* Setinha normal em toda a grade, e nao a mao. Duas fontes de mao aqui:

   1. a LINHA, que era `pointer` nesta regra por ser clicavel (duplo clique
      abre o registro);
   2. o CABECALHO de cada coluna -- o AG Grid poe `pointer` em
      `.ag-header-cell-sortable .ag-header-cell-label`, e como o defaultColDef
      declara `sortable: true`, isso vale para TODAS as colunas.

   O seletor do cabecalho aqui fica em 0,3,0 contra os 0,2,0 do AG Grid, entao
   ganha por especificidade -- o que importa porque o AG Grid injeta as folhas
   dele em <style> no runtime, DEPOIS do app.css, e um empate se resolveria a
   favor dele. Clicar e ordenar continuam funcionando; muda so o ponteiro. */
.grade-ag .ag-row {
  cursor: default;
}

.grade-ag .ag-header-cell-sortable .ag-header-cell-label {
  cursor: default;
}

/* O tema alpine define `.ag-theme-alpine .ag-row { font-size: calc(var
   (--ag-font-size) + 1px) }` -- a linha sai 1px MAIOR que o resto da grade.
   Aqui o tamanho e cravado para bater com `.grade-planilha` (11.5px), em vez de
   compensar o +1 no token, o que deixaria o valor do token mentindo sobre o
   tamanho real.

   As DUAS classes no mesmo elemento nao sao enfeite. O AG Grid injeta as
   folhas dele em <style> no runtime, DEPOIS do app.css, entao `.grade-ag
   .ag-row` empataria em especificidade com o seletor do tema (as duas em
   0,2,0) e perderia o desempate por ordem no documento. `.grade-ag
   .ag-theme-alpine` no mesmo elemento sobe para 0,3,0 e resolve. */
.grade-ag.ag-theme-alpine .ag-row {
  font-size: 11.5px;
}

/* A etiqueta de status e `inline-block`: a altura dela sai da line-height
   herdada da celula, que o AG Grid calcula a partir da altura da linha. Sem um
   valor proprio ela pedia 25px dentro de uma linha de 22 e ficava cortada. */
.grade-ag .etiqueta-status {
  padding-block: 0;
  line-height: 15px;
}

.grade-ag .celula-destaque {
  color: var(--up-azul-royal);
}

/* Plano de Contas (26/09/2026): a arvore numa lista plana. O AG Grid
   Community nao tem "tree data" (e Enterprise), entao o nome recua 1rem por
   nivel -- somado ao padding normal da celula -- e a conta de agrupamento
   (com subcontas) fica em negrito. Sao 5 niveis porque planocontas.codigo tem
   30 caracteres, 6 por nivel (ver plano_contas_service). */
.grade-ag .celula-plano-nivel-2 { padding-left: calc(var(--ag-cell-horizontal-padding, 17px) + 1rem); }
.grade-ag .celula-plano-nivel-3 { padding-left: calc(var(--ag-cell-horizontal-padding, 17px) + 2rem); }
.grade-ag .celula-plano-nivel-4 { padding-left: calc(var(--ag-cell-horizontal-padding, 17px) + 3rem); }
.grade-ag .celula-plano-nivel-5 { padding-left: calc(var(--ag-cell-horizontal-padding, 17px) + 4rem); }

.grade-ag .celula-plano-agrupamento {
  font-weight: 600;
}

/* Contas a Pagar / a Receber: o grid global so tem as larguras 1-4, 6 e 12;
   o Plano de contas precisa de 8 ao lado do Tipo de documento (4). Fica
   restrito a este formulario, como .dialogo-cliente-rapido e .form-catalogo
   fazem, para nao mudar o layout de tela que ja use campo-8 esperando a
   linha inteira. (A tabela de parcelas que morava aqui virou cartoes em
   28/09/2026 -- ver `.fin-parcela`.) */
@media (min-width: 768px) {
  #formTitulo .campo-8 { grid-column: span 8; }
}

/* coluna fixa da esquerda: caixa de marcar (e o sigma no rodape) */
.grade-ag .celula-escolha {
  padding-inline: 0;
  text-align: center;
}

.grade-ag .celula-escolha .ag-selection-checkbox {
  justify-content: center;
  width: 100%;
  margin-right: 0;
}

/* rodape fixo do somatorio. O fundo vai na faixa INTEIRA (04/10/2026,
   pedido do cliente): so na linha, ele parava onde acabava a ultima coluna
   e o resto da largura ficava branco, como se a faixa fosse cortada. */
.grade-ag .ag-floating-bottom {
  border-top: 1px solid var(--up-borda);
  background-color: var(--up-grade-rodape);
  font-weight: 700;
}

.grade-ag .ag-floating-bottom .ag-row {
  background-color: var(--up-grade-rodape);
  cursor: default;
}

/* Colunas que nao enchem a largura da grade (sobra espaco a direita,
   esperando coluna nova): a AG Grid faz o conteiner das linhas da largura
   EXATA das colunas, e o fundo da linha marcada/do hover, o filete entre as
   linhas e o rodape paravam no meio. Com o piso de 100% as linhas vao ate a
   borda; quando as colunas passam da largura, quem manda e a largura delas
   e a rolagem lateral continua igual. */
.grade-ag .ag-center-cols-container,
.grade-ag .ag-floating-bottom-container,
.grade-ag .ag-header-container {
  min-width: 100%;
}

.grade-ag .soma {
  font-weight: 700;
  color: var(--up-cinza-chumbo);
}

/* Valores do extrato do banco (Conta Corrente Banco): entrada em verde,
   saida e saldo negativo em vermelho -- como o extrato de qualquer banco,
   o olho acha o dinheiro que saiu sem ler o sinal. */
.grade-ag .celula-entrada {
  color: var(--up-dinheiro-entrada);
}

.grade-ag .celula-negativa {
  color: var(--up-dinheiro-saida);
}

/* Cabecalho do extrato e da conciliacao por arquivo: desde 03/10/2026 sao a
   faixa escura e os cartoes da nova aparencia (.ext-*, .ccl-* e .tit-cartao,
   no fim da folha). Ficam aqui so as janelas da conciliacao. */

/* dialogo da conciliacao multipla: as duas grades rolam por dentro e o
   filtro fica numa linha so, como o do Uniplus */
.conciliacao-grade-dialogo {
  max-height: 13rem;
  overflow-y: auto;
  margin-bottom: 0.6rem;
}

.conciliacao-filtro {
  display: flex;
  flex-wrap: wrap;
  align-items: flex-end;
  gap: 0.5rem 0.75rem;
  margin-bottom: 0.5rem;
}

.conciliacao-filtro .campo {
  display: flex;
  flex-direction: column;
  font-size: 10.5px;
}

.conciliacao-somas {
  display: flex;
  flex-wrap: wrap;
  justify-content: flex-end;
  gap: 0.4rem 1.5rem;
  margin: 0;
  font-size: 12px;
  font-variant-numeric: tabular-nums;
}

.conciliacao-somas dt {
  font-weight: 400;
  color: var(--up-texto-suave);
}

.conciliacao-somas dd {
  margin: 0;
  font-weight: 700;
  text-align: right;
}

/* ==========================================================================
   Ferramentas da grade: rodape (configuracao de colunas / exportacao) e os
   dois modais Bootstrap correspondentes -- ver partials/grade_ferramentas.html
   ========================================================================== */

.grade-rodape-ferramentas {
  display: flex;
  align-items: center;
  gap: 0.3rem;
  padding: 0.3rem 0.1rem 0;
}

/* botoes compactos (22px), na altura da linha da grade */
.botao-ferramenta-grade {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 22px;
  height: 22px;
  padding: 0;
  border: 1px solid transparent;
  border-radius: 4px;
  background-color: var(--up-azul);
  color: #fff;
}

.botao-ferramenta-grade:hover,
.botao-ferramenta-grade:focus-visible {
  background-color: var(--up-azul-royal);
}

/* "X de Y" encostado na direita da barra, como no ERP */
.contador-registros {
  margin-left: auto;
  padding-right: 0.2rem;
  font-size: 12px;
  font-weight: 600;
  white-space: nowrap;
  color: var(--up-texto);
}

/* --- Modal: exportacao --------------------------------------------------- */

.grupo-opcoes-exportar {
  margin-bottom: 1.1rem;
}

.grupo-opcoes-exportar:last-child {
  margin-bottom: 0;
}

.titulo-opcoes-exportar {
  margin: 0 0 0.5rem;
  font-size: 12px;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.03em;
  color: var(--up-azul-royal);
}

.botoes-opcoes-exportar {
  display: flex;
  flex-wrap: wrap;
  gap: 0.6rem;
}

.botao-opcao-exportar {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 0.3rem;
  min-width: 5.5rem;
  padding: 0.6rem 0.9rem;
  border: 1px solid var(--up-borda);
  border-radius: 6px;
  background-color: #fff;
  color: var(--up-texto-suave);
  font-size: 12px;
  font-weight: 600;
  user-select: none;
}

.botao-opcao-exportar:hover {
  border-color: var(--up-azul-sky);
}

.btn-check:checked + .botao-opcao-exportar {
  border-color: #55a459;
  background-color: #eef8ef;
  color: var(--up-texto);
}

.btn-check:focus-visible + .botao-opcao-exportar {
  outline: 2px solid var(--up-azul-sky);
  outline-offset: 1px;
}

/* --- Modal: configuracao de colunas --------------------------------------- */
/* Saiu daqui em 02/10/2026: o modal ganhou a nova aparencia (bloco `.col-*`
   no fim da folha). Eram a lista + tabela em planilha de 11.5px e os botoes
   MOVER PARA CIMA / MOVER PARA BAIXO / EXCLUIR. */

/* Fora da grade densa (ex.: "atualizar lista" no Painel Admin > Geral) o
   botao continua com area de toque confortavel. */
.botao-icone-item {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 26px;
  height: 26px;
  padding: 0;
  border-radius: 4px;
  border: 1px solid transparent;
}

.botao-editar-item {
  border-color: var(--up-borda);
  background-color: #fff;
  color: var(--up-texto-suave);
}

.botao-editar-item:hover,
.botao-editar-item:focus-visible {
  background-color: var(--up-cinza-frio);
  color: var(--up-texto);
}

/* Acoes de linha coloridas (tokens --up-acao-*): cheias como a lixeira ao
   lado, para a coluna Acoes ler como um conjunto. Classe dobrada com
   .botao-icone-item para vencer a borda transparente dela. */
.botao-icone-item.botao-incluir-item,
.botao-icone-item.botao-ativar-item {
  border-color: var(--up-acao-incluir-escuro);
  background-color: var(--up-acao-incluir);
  color: #fff;
}

.botao-icone-item.botao-incluir-item:hover,
.botao-icone-item.botao-incluir-item:focus-visible,
.botao-icone-item.botao-ativar-item:hover,
.botao-icone-item.botao-ativar-item:focus-visible {
  background-color: var(--up-acao-incluir-escuro);
}

.botao-icone-item.botao-alterar-item {
  border-color: var(--up-acao-alterar-escuro);
  background-color: var(--up-acao-alterar);
  color: #fff;
}

.botao-icone-item.botao-alterar-item:hover,
.botao-icone-item.botao-alterar-item:focus-visible {
  background-color: var(--up-acao-alterar-escuro);
}

.botao-icone-item.botao-inativar-item {
  border-color: var(--up-acao-inativar-escuro);
  background-color: var(--up-acao-inativar);
  color: #fff;
}

.botao-icone-item.botao-inativar-item:hover,
.botao-icone-item.botao-inativar-item:focus-visible {
  background-color: var(--up-acao-inativar-escuro);
}

/* Excluir item da grade. Vermelho do .btn-danger da folha original do ERP. */
.botao-excluir-item {
  border-color: #990b24;
  background-color: #d70a23;
  color: #fff;
}

.botao-excluir-item:hover,
.botao-excluir-item:focus-visible {
  background-color: #b40a1e;
}

.botao-icone-item:disabled {
  opacity: 0.55;
}

/* Linha cujo item esta carregado no bloco "Incluir item" para edicao --
   mesmo azul usado em `.grade.selecionavel tbody tr.selecionada` (abaixo),
   pra reaproveitar o mesmo sinal visual de "este e o registro corrente". */
.grade-planilha tbody tr.linha-em-edicao td {
  background-color: #dceefb;
}

/* ==========================================================================
   Formulario com abas internas
   ========================================================================== */

.abas-internas {
  display: flex;
  gap: 0;
  border-bottom: 1px solid var(--up-borda);
  margin-bottom: 1.1rem;
  overflow-x: auto;
}

.aba-interna {
  padding: 0.6rem 1.5rem;
  border: 0;
  border-bottom: 3px solid transparent;
  background: none;
  font-family: var(--up-fonte);
  font-size: 13px;
  font-weight: 600;
  color: var(--up-texto-suave);
  white-space: nowrap;
}

.aba-interna:hover {
  color: var(--up-texto);
}

.aba-interna.ativa {
  color: var(--up-azul-royal);
  border-bottom-color: var(--up-azul-sky);
}

.aba-interna:disabled {
  color: var(--up-borda);
  cursor: not-allowed;
}

.painel-aba {
  display: none;
}

.painel-aba.ativa {
  display: block;
}

.bloco-titulo {
  margin: 0 0 0.6rem;
  font-size: 13px;
  font-weight: 700;
  color: var(--up-azul-sky);
}

/* Titulo "Itens" com o "Copiar Pedido" ao lado (Pedido/Orcamento) */
.itens-topo {
  display: flex;
  align-items: center;
  gap: 0.6rem;
  margin-bottom: 0.4rem;
}

/* "Itens" e o titulo do cartao (`.titulo-bloco-nf`); `.bloco-titulo` ficou
   para as outras telas que usam a mesma faixa */
.itens-topo .bloco-titulo,
.itens-topo .titulo-bloco-nf {
  margin: 0;
}

/* discreto: mesmo verde do Gravar, mas na altura de uma linha de texto */
.botao-copiar-itens {
  height: 20px;
  padding: 0 0.55rem;
  gap: 0.3rem;
  font-size: 10.5px;
  letter-spacing: 0.02em;
}

.botao-copiar-itens:disabled {
  opacity: 0.45;
  cursor: default;
}

/* Plano B do "Copiar Pedido": a imagem gerada, para copiar pelo botao direito */
.dialogo-imagem {
  width: min(64rem, calc(100vw - 3rem));
}

.imagem-instrucao {
  margin: 0;
  padding: 0.8rem 1.25rem 0;
  font-size: 13px;
}

.imagem-moldura {
  max-height: calc(100vh - 16rem);
  margin: 0.8rem 1.25rem 0;
  overflow: auto;
  border: 1px solid var(--up-borda-suave);
}

/* tamanho real (a imagem sai em 2x), sem esticar */
.imagem-moldura img {
  display: block;
  max-width: 100%;
}

.bloco-campos {
  display: grid;
  grid-template-columns: repeat(12, 1fr);
  gap: 0.85rem 1rem;
  padding: 1rem;
  border: 1px solid var(--up-borda-suave);
  border-radius: 4px;
}

.campo {
  display: flex;
  flex-direction: column;
  gap: 0.2rem;
  min-width: 0;
  grid-column: span 12;
}

.campo label {
  font-size: 12px;
  font-weight: 600;
  color: var(--up-texto-suave);
}

.campo .obrigatorio,
.grupo-marcar .obrigatorio {
  color: #ff8b15;
}

/* Campo exigido pelo Painel Admin > Campos obrigatorios: mesmo asterisco do
   `.obrigatorio`, mas por ::after -- o rotulo pode ter o texto reescrito pelo
   JS da tela (CNPJ/CPF no Cliente). Ver static/js/campos_obrigatorios.js. */
.campo label.rotulo-obrigatorio::after {
  content: " *";
  color: #ff8b15;
}

/* o titulo do cartao de bloco e o "Incluir bloco" da Aparencia do catalogo
   ficam fora de `.campo`, mas sao campos como os outros: mesma moldura */
.campo input,
.campo select,
.campo textarea,
.cartao-bloco-topo input[type="text"],
.incluir-bloco select {
  width: 100%;
  padding: 0.4rem 0.55rem;
  border: 1px solid var(--up-borda);
  border-radius: 4px;
  font-family: var(--up-fonte);
  font-size: 13px;
  color: var(--up-texto);
  background-color: #fff;
}

.campo textarea {
  resize: vertical;
}

.campo input:focus,
.campo select:focus,
.campo textarea:focus,
.cartao-bloco-topo input[type="text"]:focus,
.incluir-bloco select:focus {
  outline: 0;
  border-color: var(--up-azul-sky);
  box-shadow: 0 0 0 0.15rem rgba(54, 169, 225, 0.2);
}

/* Campo travado. O select entrou em 26/09/2026 (Tipos de Documento
   Financeiro, que trava varios combos): antes so o input ficava cinza e o
   combo travado parecia editavel. Os formularios com regra propria de
   select travado (#formNotaFiscal, Pedido de Faturamento) continuam
   mandando -- sao mais especificos. */
.campo input:disabled,
.campo select:disabled {
  background-color: var(--up-cinza-frio);
  color: var(--up-texto-suave);
}

/* "Preço mínimo" do Incluir item (regra "Respeitar preço mínimo por pauta"):
   so leitura, mas em verde pastel -- e uma informacao para o vendedor, nao um
   campo apagado. Ver venda_documento_form.html. */
.campo input.campo-preco-minimo:disabled {
  background-color: #e6f4ea;
  border-color: #b7dfc2;
  color: #1e6b3a;
  font-weight: 600;
}

/* Caixa de marcar dentro de um .campo (ex.: "Aprovado" no Orcamento): precisa
   escapar do width:100% que vale para os campos de digitacao. */
.campo input.campo-marca {
  width: 1.15rem;
  height: 1.15rem;
  padding: 0;
  margin-top: 0.15rem;
  accent-color: var(--up-azul-royal);
}

.campo-botoes {
  flex-direction: row;
  align-items: flex-end;
  gap: 0.5rem;
}

/* --- Pedido de Venda / Orcamento: layout mais denso -------------------------
   Igual ao "Incluir item" do ERP de referencia: campos com fonte menor e
   menos padding, pra sobrar mais altura de tela pros itens lancados. Escopado
   a #formDocumento (o <form> desta tela) para nao encolher Clientes/Produtos
   nem o dialogo de pesquisa de produto, que ficam com o padrao normal. */
/* Abas Geral/Itens no mesmo desenho do Pedido de Faturamento: fonte de 13px e
   a mesma altura. La as sete abas se esticam (`flex: 1 1 0`); aqui sao duas, e
   esticadas virariam dois botoes enormes -- entao ficam na largura do texto,
   encostadas na esquerda, com mais recuo lateral para nao ficarem estreitas. */
#formDocumento .abas-internas {
  margin-bottom: 0.6rem;
}

#formDocumento .aba-interna {
  padding: 0.45rem 1.4rem;
  font-size: 13px;
}

#formDocumento .bloco-titulo {
  margin-bottom: 0.4rem;
  font-size: 12px;
  font-weight: 600;
}

/* Cartao branco com sombra, como os do Pedido de Faturamento, no lugar da
   moldura de traco fino. `.bloco-sem-moldura` e o bloco que ja mora DENTRO de
   um cartao (`.bloco-nf`): la a sombra seria sombra sobre sombra. */
#formDocumento .bloco-campos {
  gap: 0.5rem 0.75rem;
  padding: 0.75rem;
  border: 0;
  background-color: #fff;
  box-shadow: 0 1px 4px rgba(0, 6, 12, 0.12);
}

#formDocumento .bloco-campos.bloco-sem-moldura {
  padding: 0;
  border: 0;
  background: none;
  box-shadow: none;
}

#formDocumento .campo {
  gap: 0.05rem;
}

#formDocumento .campo label {
  font-size: 10.5px;
  line-height: 1.25;
}

/* Campos sem cara de "caixa grande": a altura vem do padding, entao cortar o
   padding vertical e o que realmente devolve linhas de item na tela. */
#formDocumento .campo input,
#formDocumento .campo select,
#formDocumento .campo textarea,
#formDocumento .busca-item,
#formDocumento .busca-vazio,
#dialogoLojista .lojista-cliente input,
#dialogoLojista .busca-item,
#dialogoLojista .busca-vazio {
  padding: 2px 4px;
  font-size: 11.5px;
  line-height: 1.35;
  border-radius: 3px;
}

/* A observacao e o unico campo alto do formulario: `min-height` (e nao
   `height`) para o `resize: vertical` de `.campo textarea` continuar valendo
   -- o operador pode esticar quando a observacao e longa, mas nunca encolher
   abaixo dos 80px. O `rows="3"` no HTML e so a rede para quando esta folha
   nao carrega. */
#formDocumento #observacao {
  min-height: 80px;
}

/* o checkbox "Aprovado" nao acompanha o encolhimento do texto */
#formDocumento .campo .campo-marca {
  width: 14px;
  height: 14px;
  padding: 0;
}

/* Botoes da linha de inclusao na altura EXATA dos campos ao lado.
   As metricas sao copiadas do input de proposito -- mesma fonte, mesma
   line-height, mesmo padding vertical e mesma borda de 1px. Foi assim que a
   diferenca de 5px (botao 29px x campo 24px) sumiu, sem cravar um `height`
   fixo que descasaria de novo no proximo ajuste de fonte. */
#formDocumento .campo-botoes .botao-acao {
  padding: 2px 10px;
  font-size: 11.5px;
  line-height: 1.35;
  border-width: 1px;
}

/* --- Cadastros de Cliente, Produto e Vendedor: mesma altura de campo -------
   Os campos seguem as medidas do Pedido/Orcamento (acima), que viraram o
   padrao da casa: rotulo 10.5px, campo com 2px de padding e fonte 11.5px.
   Checkbox e radio ficam de fora -- o `.interruptor` (Ativo) e o
   `.campo-marcavel` tem desenho proprio e quebrariam com padding de campo.
   A edicao rapida do cliente (#formEditarCliente, no Pedido/Orcamento)
   segue o mesmo padrao, e a Aparencia do Catalogo virtual (#formAparencia,
   24/09/2026) tambem -- la entram ainda o titulo do cartao de bloco e o
   seletor "Incluir bloco", que ficam fora de `.campo`. As Configuracoes do
   catalogo (#formCatalogo) seguem igual, e o Plano de Contas do Financeiro
   (#formPlanoContas, 26/09/2026) tambem -- ele tem <select> de verdade, por
   isso entra na lista de select que o Vendedor nao tem. A Conta Corrente
   (#formContaCorrente, 26/09/2026) entra com select, textarea e busca, e o
   Tipo de Documento Financeiro (#formTipoDocumento, 26/09/2026) com select.
   As telas do financeiro de 26/09/2026 (espelho do Uniplus) entram em
   bloco: Bancos, Motivo de Baixa, Tipo de Cobranca, Tipo de Comissao,
   o lancamento de Caixa/Conta Corrente e a Baixa de titulos. As Condicoes
   de Pagamento (#formCondicaoPagamento, 01/10/2026) vao junto do Tipo de
   Cobranca, linha a linha, porque tem os mesmos tipos de campo.
   Contas a Pagar/Receber (#formTitulo) e a Baixa (#formBaixa) SAIRAM destas
   listas em 28/09/2026: ganharam o visual proprio `.fin-tela` (mais no fim
   da folha), com campos maiores -- pedido do cliente.
   Cadastro novo entra nas TRES listas deste bloco e nas duas do rodape
   (`.painel-documento`, mais abaixo). */
#formCliente .campo,
#formProduto .campo,
#formVendedor .campo,
#formPlanoContas .campo,
#formContaCorrente .campo,
#formTipoDocumento .campo,
#formBanco .campo,
#formMotivoBaixa .campo,
#formMotorista .campo,
#formRota .campo,
#formVeiculo .campo,
#formCarga .campo,
#formBaixaCarga .campo,
#formAcertoCarga .campo,
#formTipoCobranca .campo,
#formCondicaoPagamento .campo,
#formTipoComissao .campo,
#formLancamentoConta .campo,
#formEditarCliente .campo,
#formMinhaSenha .campo,
#formAparencia .campo,
#formCatalogo .campo {
  gap: 0.05rem;
}

#formCliente .campo label,
#formProduto .campo label,
#formVendedor .campo label,
#formPlanoContas .campo label,
#formContaCorrente .campo label,
#formTipoDocumento .campo label,
#formBanco .campo label,
#formMotivoBaixa .campo label,
#formMotorista .campo label,
#formRota .campo label,
#formVeiculo .campo label,
#formCarga .campo label,
#formBaixaCarga .campo label,
#formAcertoCarga .campo label,
#formTipoCobranca .campo label,
#formCondicaoPagamento .campo label,
#formTipoComissao .campo label,
#formLancamentoConta .campo label,
#formEditarCliente .campo label,
#formMinhaSenha .campo label,
#formAparencia .campo label,
#formCatalogo .campo label {
  font-size: 10.5px;
  line-height: 1.25;
}

#formEditarCliente .campo input:not([type="checkbox"]):not([type="radio"]),
#formEditarCliente .campo select,
#formEditarCliente .busca-item,
#formEditarCliente .busca-vazio,
#formCliente .campo input:not([type="checkbox"]):not([type="radio"]),
#formCliente .campo select,
#formCliente .campo textarea,
#formCliente .busca-item,
#formCliente .busca-vazio,
#formVendedor .campo input:not([type="checkbox"]):not([type="radio"]),
#formPlanoContas .campo input:not([type="checkbox"]):not([type="radio"]),
#formPlanoContas .campo select,
#formContaCorrente .campo input:not([type="checkbox"]):not([type="radio"]),
#formContaCorrente .campo select,
#formContaCorrente .campo textarea,
#formContaCorrente .busca-item,
#formContaCorrente .busca-vazio,
#formTipoDocumento .campo input:not([type="checkbox"]):not([type="radio"]),
#formTipoDocumento .campo select,
#formBanco .campo input:not([type="checkbox"]):not([type="radio"]),
#formBanco .campo select,
#formBanco .campo textarea,
#formBanco .busca-item,
#formBanco .busca-vazio,
#formMotivoBaixa .campo input:not([type="checkbox"]):not([type="radio"]),
#formMotorista .campo input:not([type="checkbox"]):not([type="radio"]),
#formRota .campo input:not([type="checkbox"]):not([type="radio"]),
#formVeiculo .campo input:not([type="checkbox"]):not([type="radio"]),
#formCarga .campo input:not([type="checkbox"]):not([type="radio"]),
#formBaixaCarga .campo input:not([type="checkbox"]):not([type="radio"]),
#formAcertoCarga .campo input:not([type="checkbox"]):not([type="radio"]),
#formMotivoBaixa .campo select,
#formMotorista .campo select,
#formRota .campo select,
#formVeiculo .campo select,
#formCarga .campo select,
#formBaixaCarga .campo select,
#formMotivoBaixa .campo textarea,
#formMotorista .campo textarea,
#formRota .campo textarea,
#formVeiculo .campo textarea,
#formCarga .campo textarea,
#formBaixaCarga .campo textarea,
#formMotivoBaixa .busca-item,
#formMotorista .busca-item,
#formRota .busca-item,
#formVeiculo .busca-item,
#formCarga .busca-item,
#formBaixaCarga .busca-item,
#formMotivoBaixa .busca-vazio,
#formMotorista .busca-vazio,
#formRota .busca-vazio,
#formVeiculo .busca-vazio,
#formCarga .busca-vazio,
#formBaixaCarga .busca-vazio,
#formTipoCobranca .campo input:not([type="checkbox"]):not([type="radio"]),
#formCondicaoPagamento .campo input:not([type="checkbox"]):not([type="radio"]),
#formTipoCobranca .campo select,
#formCondicaoPagamento .campo select,
#formTipoCobranca .campo textarea,
#formCondicaoPagamento .campo textarea,
#formTipoCobranca .busca-item,
#formCondicaoPagamento .busca-item,
#formTipoCobranca .busca-vazio,
#formCondicaoPagamento .busca-vazio,
#formTipoComissao .campo input:not([type="checkbox"]):not([type="radio"]),
#formTipoComissao .campo select,
#formTipoComissao .campo textarea,
#formTipoComissao .busca-item,
#formTipoComissao .busca-vazio,
#formLancamentoConta .campo input:not([type="checkbox"]):not([type="radio"]),
#formLancamentoConta .campo select,
#formLancamentoConta .campo textarea,
#formLancamentoConta .busca-item,
#formLancamentoConta .busca-vazio,
#formMinhaSenha .campo input,
#formProduto .campo input:not([type="checkbox"]):not([type="radio"]),
#formProduto .campo select,
#formProduto .campo textarea,
#formProduto .busca-item,
#formProduto .busca-vazio,
#formAparencia .campo input:not([type="checkbox"]):not([type="radio"]),
#formAparencia .campo select,
#formAparencia .campo textarea,
#formAparencia .cartao-bloco-topo input[type="text"],
#formAparencia .incluir-bloco select,
#formCatalogo .campo input:not([type="checkbox"]):not([type="radio"]),
#formCatalogo .campo select {
  padding: 2px 4px;
  font-size: 11.5px;
  line-height: 1.35;
  border-radius: 3px;
}

/* CEP consultando a tabela de CEPs: moldura azul pulsando enquanto a resposta
   nao chega -- a consulta e rapida, mas o operador ve que algo esta vindo */
#formCliente #cep.carregando-cep {
  border-color: var(--up-azul-sky);
  animation: up-cep-pulso 0.8s ease-in-out infinite alternate;
}

@keyframes up-cep-pulso {
  from { box-shadow: 0 0 0 0 rgba(54, 169, 225, 0.35); }
  to { box-shadow: 0 0 0 3px rgba(54, 169, 225, 0.15); }
}

/* "OK / Limpar" da classificacao do produto na altura dos campos ao lado */
#formProduto .campo-botoes .botao-acao {
  padding: 2px 10px;
  font-size: 11.5px;
  line-height: 1.35;
  border-width: 1px;
}


@media (min-width: 768px) {
  .campo-1 { grid-column: span 1; }
  .campo-2 { grid-column: span 2; }
  .campo-3 { grid-column: span 3; }
  .campo-4 { grid-column: span 4; }
  .campo-12 { grid-column: span 12; }
}

/* --- Busca com sugestoes --------------------------------------------------- */

.busca {
  position: relative;
}

.busca-resultados {
  position: absolute;
  top: 100%;
  left: 0;
  right: 0;
  z-index: 1040;
  max-height: 15rem;
  margin: 2px 0 0;
  padding: 0;
  list-style: none;
  overflow-y: auto;
  background-color: #fff;
  border: 1px solid var(--up-borda);
  border-radius: 4px;
  box-shadow: var(--up-sombra-menu);
}

.busca-resultados[hidden] {
  display: none;
}

.busca-item,
.busca-vazio {
  padding: 0.4rem 0.6rem;
  font-size: 13px;
}

.busca-item {
  color: var(--up-azul-royal);
}

/* .ativo = linha realcada pelas setas do teclado -- mesmo destaque do mouse,
   para quem lanca item sem tirar as maos do teclado ver onde esta */
.busca-item:hover,
.busca-item.ativo {
  background-color: var(--up-primaria-fundo);
  color: var(--up-primaria-escuro);
}

.busca-vazio {
  color: var(--up-texto-suave);
}

/* --- Lista de opcoes dos <select> (js/selecao.js) -------------------------
   Substitui a lista nativa, que o Windows desenha fora da pagina e vaza da
   janela. Mesmo desenho das sugestoes de busca (.busca-resultados). A posicao
   e o tamanho vem do JS, medidos contra a janela; a fonte, do proprio campo. */
.lista-selecao {
  z-index: 2000;
  margin: 0;
  padding: 2px 0;
  list-style: none;
  overflow-y: auto;
  overflow-x: hidden;
  background-color: #fff;
  border: 1px solid var(--up-borda);
  border-radius: 4px;
  box-shadow: var(--up-sombra-menu);
  color: var(--up-texto, #212529);
}

.lista-selecao-item {
  padding: 3px 8px;
  line-height: 1.4;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}

/* a opcao que esta no campo agora */
.lista-selecao-item.selecionado {
  font-weight: 700;
}

/* realce do mouse / das setas -- mesmo da busca com sugestoes */
.lista-selecao-item.ativo {
  background-color: var(--up-primaria-fundo);
  color: var(--up-primaria-escuro);
}

.lista-selecao-item.desabilitado {
  color: var(--up-texto-suave);
  cursor: default;
}

/* --- Sugestoes em grade de planilha (produto nos itens, cliente na Geral) --
   Mesmo desenho da `.grade-planilha` de itens logo abaixo: cabecalho em
   degrade cinza, linhas de grade e fonte densa. Mais larga que o campo (que e
   estreito) para caber codigo, nome e preco lado a lado. */
.busca-resultados.busca-grade {
  right: auto;
  width: max(100%, 38rem);
  max-width: calc(100vw - 2rem);
  font-family: Tahoma, Arial, Helvetica, sans-serif;
  /* as setas rolam a linha realcada para a vista (scrollIntoView): sem isto
     ela pararia escondida atras do cabecalho fixo */
  scroll-padding-top: 1.6rem;
}

.busca-grade .busca-cabecalho,
#formDocumento .busca-grade .busca-item,
#dialogoLojista .busca-grade .busca-item {
  display: grid;
  grid-template-columns: 6.5rem minmax(0, 1fr) 8.5rem;
  padding: 0;
  border-radius: 0;
}

/* cliente: so codigo e nome -- sem a coluna de preco, o nome fica com o resto */
[data-busca="clientes"] .busca-grade .busca-cabecalho,
#formDocumento [data-busca="clientes"] .busca-grade .busca-item,
#dialogoLojista [data-busca="clientes"] .busca-grade .busca-item {
  grid-template-columns: 6.5rem minmax(0, 1fr);
}

.busca-grade .busca-cabecalho {
  position: sticky;
  top: 0;
  z-index: 1;
  background-color: #f5f5f5;
  background-image: linear-gradient(#fdfdfd, #f1f2f4);
  font-size: 11.5px;
  font-weight: 700;
  color: #2c3e50;
}

.busca-grade .busca-cabecalho span {
  padding: 3px 6px;
  border-bottom: 1px solid #c9ced3;
  border-right: 1px solid #dfe3e6;
}

.busca-grade .busca-item span {
  padding: 2px 6px;
  border-bottom: 1px solid #e0e0e0;
  border-right: 1px solid #e0e0e0;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}

.busca-grade .busca-cabecalho span:last-child,
.busca-grade .busca-item span:last-child {
  border-right: 0;
}

.busca-grade .num {
  text-align: right;
}

.aviso-itens {
  margin: 0.6rem 0 0;
  font-size: 12px;
  color: var(--up-texto-suave);
}

.aviso-itens[hidden] {
  display: none;
}

/* Alteracoes nao gravadas restauradas (01/10/2026, vendas/_aviso_rascunho.html):
   a mesma tarja amarela do "somente para consulta" (alert-warning), com o
   texto a esquerda e o "Descartar" a direita. O [hidden] precisa vencer o
   display do .alert, que vem depois na cascata do Bootstrap */
.aviso-rascunho {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 0.75rem;
  font-size: 12px;
}

.aviso-rascunho[hidden] {
  display: none;
}

.aviso-rascunho-texto {
  display: flex;
  align-items: flex-start;
  gap: 0.5rem;
}

.aviso-rascunho .botao-acao {
  flex: none;
}

/* --- Rodape do formulario -------------------------------------------------- */

.rodape-formulario {
  display: flex;
  flex-wrap: wrap;
  align-items: flex-end;
  justify-content: flex-end;
  gap: 1rem 2rem;
  border-top: 1px solid var(--up-borda-suave);

  /* Fixo no fundo da area de rolagem: `.painel` e quem rola (overflow-y:
     auto, ver acima), entao "sticky" gruda no fundo DELE, nao da janela --
     o usuario grava/cancela sem descer ate o fim do formulario. As margens
     negativas cancelam o padding do `.painel` para o rodape encostar nas
     bordas; o `padding` repoe o respiro visual por dentro. */
  position: sticky;
  bottom: -1.25rem;
  z-index: 3;
  margin: 1.25rem -1.5rem -1.25rem;
  padding: 1rem 1.5rem;
  background-color: #fff;
  box-shadow: var(--up-sombra-card);
}

.totais {
  display: flex;
  gap: 2rem;
  margin-right: auto;
}

.total {
  display: flex;
  flex-direction: column;
  align-items: flex-end;
}

.total-rotulo {
  font-size: 11px;
  color: var(--up-texto-suave);
}

.total-valor {
  font-size: 17px;
  color: var(--up-texto);
}

.total-valor.destaque {
  color: var(--up-azul-royal);
}

.acoes-formulario {
  display: flex;
  gap: 0.5rem;
}

/* --- Rodape da tela de Pedido/Orcamento ------------------------------------
   Aqui o rodape precisa ficar na BASE do card sempre, nao so quando ha
   rolagem. `position: sticky` sozinho nao resolve isso: sticky gruda enquanto
   se rola, mas com a aba ativa curta (a Geral, com poucos campos) o conteudo
   acaba no meio da tela e o rodape acaba junto, deixando uma faixa branca
   embaixo.

   A cola e a mesma do Painel Admin: uma CADEIA FLEX com altura definida
   (.app-uniplus 100vh -> .painel flex:1 -> formulario) e `margin-top: auto` no
   rodape, que empurra ele para a base da coluna. O sticky continua valendo
   para o caso oposto (muitos itens): ai o rodape gruda no fundo da area
   rolavel em vez de sumir la embaixo. */

.painel-documento {
  display: flex;
  flex-direction: column;
  /* quem encosta na base do card agora e o rodape, nao o padding do card */
  padding-bottom: 0;
}

#formDocumento,
#formCliente,
#formProduto,
#formVendedor,
#formPlanoContas,
#formTitulo,
#formContaCorrente,
#formTipoDocumento,
#formBanco,
#formMotivoBaixa,
#formMotorista,
#formRota,
#formVeiculo,
#formCarga,
#formBaixaCarga,
#formAcertoCarga,
#formTipoCobranca,
#formCondicaoPagamento,
#formTipoComissao,
#formLancamentoConta,
#formBaixa,
#formAparencia,
#formCatalogo {
  display: flex;
  flex-direction: column;
  /* cresce ate o fundo do card, mas NUNCA encolhe abaixo do proprio conteudo
     (flex-shrink 0) -- com muitos itens quem rola e o card, como antes */
  flex: 1 0 auto;
}

/* O Importar XML e o contrario dos formularios acima: nao tem campos que
   crescem, tem UMA grade que precisa de toda a altura do card (`1 1 auto` +
   `min-height: 0`, para poder encolher e rolar por dentro). */
#importacaoXml {
  display: flex;
  flex-direction: column;
  flex: 1 1 auto;
  min-height: 0;
}

/* --- Aba Itens: grade com cabecalho fixo e rolagem interna ----------------
   Com a aba Itens aberta, o formulario deixa de crescer com o conteudo e fica
   do tamanho exato do card (flex 1 1 auto + min-height 0). A aba pega a altura
   que sobra entre as abas e o rodape, e dentro dela a grade (`.rolagem-interna`,
   regra do Painel Admin) fica com o resto: "Incluir item" e rodape parados, so
   as linhas rolam.

   `:has()` escopa isso a aba Itens. A Geral continua como era -- o card rola
   inteiro se ela nao couber -- e o dropdown da busca de cliente nao corre
   risco de ser cortado por um overflow.

   Sem overflow na aba de proposito: a lista de sugestoes do produto
   (`.busca-resultados`, absolute) passa por cima da grade e seria cortada. Numa
   janela baixa demais, o `min-height` da grade faz o card rolar, como antes. */
#formDocumento:has(#painelItens.ativa) {
  flex: 1 1 auto;
  min-height: 0;
}

#formDocumento #painelItens.ativa {
  display: flex;
  flex-direction: column;
  flex: 1 1 auto;
  min-height: 0;
}

#formDocumento #envolucroItens {
  min-height: 6rem;
}

/* Com muitos itens, quem cede espaco e SO a grade (que rola por dentro).
   A barra das abas internas tem `overflow-x: auto`, e num flex em coluna isso
   zera o tamanho minimo dela: sem o `flex-shrink: 0` ela era espremida ate
   sumir ("Geral"/"Itens" cortados). O mesmo vale para o resto da aba Itens
   -- "Incluir item", campos, barra do "Copiar" e aviso ficam com a altura
   deles. */
#formDocumento > .abas-internas,
#formDocumento #painelItens.ativa > * {
  flex-shrink: 0;
}

/* A grade fica DENTRO do cartao "Itens", entao quem toma a altura que sobra e
   o cartao; dentro dele, so a grade cede (o titulo e a barra de botoes ficam
   com a altura deles). Mesma cadeia ja usada no Pedido de Faturamento. */
#formDocumento #painelItens.ativa > #cartaoItens {
  display: flex;
  flex-direction: column;
  flex: 1 1 auto;
  min-height: 0;
}

/* `:not(.rolagem-interna)` NAO e detalhe: era `> *` e isso incluia a propria
   grade. Um seletor com 2 ids vence o `flex: 1 1 auto` de
   `.grade-envolucro.rolagem-interna` (2 classes), entao o envolucro ficava com
   `flex-shrink: 0` e nunca encolhia: ele crescia com os itens, o cartao
   estourava e quem rolava era o CARD inteiro -- a pagina andava junto e a
   rolagem de dentro nunca aparecia. Excluindo a grade, ela volta a ser a unica
   que cede altura, como o Painel Admin ja fazia em
   `.admin-corpo-rolavel > :not(.rolagem-interna)`. */
#formDocumento #cartaoItens > :not(.rolagem-interna) {
  flex-shrink: 0;
}

#formDocumento .rodape-formulario,
#formCliente .rodape-formulario,
#formProduto .rodape-formulario,
#formVendedor .rodape-formulario,
#formPlanoContas .rodape-formulario,
#formTitulo .rodape-formulario,
#formContaCorrente .rodape-formulario,
#formTipoDocumento .rodape-formulario,
#formBanco .rodape-formulario,
#formMotivoBaixa .rodape-formulario,
#formMotorista .rodape-formulario,
#formRota .rodape-formulario,
#formVeiculo .rodape-formulario,
#formCarga .rodape-formulario,
#formBaixaCarga .rodape-formulario,
#formAcertoCarga .rodape-formulario,
#formTipoCobranca .rodape-formulario,
#formCondicaoPagamento .rodape-formulario,
#formTipoComissao .rodape-formulario,
#formLancamentoConta .rodape-formulario,
#formBaixa .rodape-formulario,
#formAparencia .rodape-formulario,
#formCatalogo .rodape-formulario,
#importacaoXml .rodape-formulario,
#formOpcoesExpedicao .rodape-formulario,
#formOpcoesFinanceiro .rodape-formulario,
#formOpcoesFiscal .rodape-formulario,
#formModeloNotaFiscal .rodape-formulario {
  /* topo auto = cola na base; laterais negativas = alcanca as bordas do card,
     passando por cima do padding dele. A margem inferior e 0 (e nao -1.25rem,
     como na regra geral) porque `.painel-documento` ja zerou o padding de
     baixo: nao sobrou nada para cancelar. */
  margin: auto -1.5rem 0;
  bottom: 0;
}

/* Duas FAIXAS empilhadas, as duas encostadas na direita: totais em cima,
   botoes embaixo. A regra geral poe tudo na mesma linha (totais na esquerda,
   via `margin-right: auto` em `.totais`); aqui a coluna e o que reproduz a
   barra do ERP. */
/* Uma linha so. Era `flex-direction: column`, e por isso desconto, totais e
   botoes saiam empilhados e o rodape ficava alto. Agora:
   `.footer-start` (desconto) a esquerda | `.footer-end` (totais + acoes) a
   direita, empurrados pelo space-between. O `nowrap` cancela o `flex-wrap:
   wrap` da regra geral -- sem ele os botoes caem para a linha de baixo assim
   que a janela aperta, que e justamente o que queremos evitar. */
.rodape-documento {
  flex-direction: row;
  flex-wrap: nowrap;
  align-items: center;
  justify-content: space-between;
  gap: 1rem;
  padding: 0.3rem 1.5rem;
}

/* Pauta de preco e desconto do subtotal lado a lado; o `gap` e o respiro
   entre os dois campos. */
.rodape-documento .footer-start {
  display: flex;
  align-items: center;
  gap: 1.5rem;
  min-width: 0;
}

/* O rotulo sai de cima e vai para o lado do input: e o que tira uma linha
   inteira da altura do rodape. A espessura do input NAO e tocada aqui -- ela
   continua vindo de `#formDocumento .campo input`. */
/* `#formDocumento` no seletor: sem ele vence `#formDocumento .campo`
   (gap: 0.05rem) e rotulo e input ficam colados, apesar do 0.75rem daqui. */
#formDocumento .rodape-documento .footer-start .campo {
  flex-direction: row;
  align-items: center;
  gap: 0.75rem;
}

/* Rotulos do rodape (Pauta de preco, Desc. Subtotal, Total geral) com a mesma
   cara: preto, negrito, 14px. O `#formDocumento` no seletor e necessario para
   vencer `#formDocumento .campo label`, que encolhe os rotulos a 10.5px. */
#formDocumento .rodape-documento .footer-start .campo label,
.rodape-documento .total-rotulo {
  font-size: 14px;
  font-weight: 700;
  color: #000;
  white-space: nowrap;
}

/* `.campo input` e width:100%; aqui ele precisa de largura propria, senao
   estica e empurra os totais. */
.rodape-documento .footer-start .campo input {
  width: 3.5rem;
}

/* O desconto do subtotal em R$, ao lado do percentual (25/09/2026): cabe
   "R$ 10.000,00" sem cortar. Os 3.5rem do percentual mal passariam de
   "R$ 9,99". */
.rodape-documento .footer-start .campo input.desconto-subtotal-valor {
  width: 6.5rem;
}

.rodape-documento .footer-start .campo select {
  width: 10rem;
}

/* Pauta trocada pelo Tab (23/09/2026): o cursor continua no item em
   digitacao, entao e esta piscada que conta ao operador -- que esta olhando
   para o campo do produto, no alto -- que a pauta mudou. Antes o Tab levava o
   foco ate aqui, e o proprio foco era o sinal.
   Azul da marca, e nao o amarelo do `.admin-destaque`: la algo foi ENCONTRADO
   e pede conferencia; aqui e a confirmacao de uma acao que o operador acabou
   de fazer. `inset` de proposito: o rodape e uma linha so e um anel por fora
   encostaria nos campos vizinhos. */
.rodape-documento .footer-start .campo select.pauta-trocada {
  animation: pauta-trocada 1.4s ease-out;
}

@keyframes pauta-trocada {
  0%, 30% {
    background-color: var(--up-primaria-fundo);
    box-shadow: inset 0 0 0 2px var(--up-primaria);
  }
  100% {
    background-color: transparent;
    box-shadow: inset 0 0 0 2px transparent;
  }
}

@media (prefers-reduced-motion: reduce) {
  .rodape-documento .footer-start .campo select.pauta-trocada {
    animation: none;
    background-color: var(--up-primaria-fundo);
  }
}

.rodape-documento .footer-end {
  display: flex;
  align-items: center;
  gap: 15px;
}

/* o `margin-right: auto` da regra geral e o que jogaria os totais para a
   esquerda -- sem ele o bloco encosta na direita, sobre os botoes */
.rodape-documento .totais {
  margin-right: 0;
  gap: 2.5rem;
}

/* Rotulo ao lado do valor, e nao acima. `.total` e coluna na regra geral, e
   com o rodape em linha unica essas duas linhas eram o que ainda sobrava de
   altura. `baseline` alinha o texto pequeno do rotulo pela base do numero
   grande. Escopado ao rodape do documento: as outras telas que usam `.totais`
   seguem empilhadas. */
.rodape-documento .total {
  flex-direction: row;
  align-items: baseline;
  /* mesmo respiro entre rotulo e valor dos campos de `.footer-start` */
  gap: 0.75rem;
  white-space: nowrap;
}

/* Valor grande e azul -- a proporcao da tela do ERP, onde o numero e que se
   le de longe. O rotulo segue a regra comum dos rotulos do rodape, acima.
   Escopado ao `.rodape-documento` para nao repintar os totais das outras telas
   que usam a mesma barra. */

.rodape-documento .total-valor {
  font-size: 19px;
  font-weight: 700;
  color: var(--up-azul-royal);
}

/* botoes colados uns nos outros, como na barra do ERP */
.rodape-documento .acoes-formulario {
  gap: 0.3rem;
}

/* Cadastros de Cliente/Produto: o rodape so tem os botoes, sem desconto nem
   totais. Sozinho, o `space-between` deixaria o grupo na esquerda. */
.rodape-documento > .acoes-formulario:only-child {
  margin-left: auto;
}

/* 28px de altura e a medida do ERP: no HTML original o botao quadrado de
   configuracao traz `h-28p` e fica rente aos de texto ao lado. O `gap` de meio
   rem repoe o respiro que la vem dos `&nbsp;&nbsp;` em volta do <i> do icone.
   Escopado ao rodape do documento e a barra das listagens -- os formularios de
   Clientes/Produtos e o Painel Admin seguem com os 33px do padrao da casa.

   Os dois seletores dividem a MESMA regra de proposito: o pedido era que os
   botoes do topo das listagens ficassem identicos aos do rodape, e duas regras
   iguais lado a lado so garantem isso ate alguem mexer numa delas. O
   "Selecionar" das lupas (clientes/produtos) entra na mesma regra: abre por
   cima do documento e fica do tamanho do Gravar dele. O "Ficha do cliente",
   no canto esquerdo do rodape da ficha do cliente, tambem: ficava com os 33px
   do padrao e destoava do Gravar/Cancelar da mesma linha. */
.rodape-documento .acoes-formulario .botao-acao,
.rodape-documento .footer-start .botao-acao,
.barra-ferramentas .botao-acao,
.dialogo-largo .dialogo-rodape .botao-acao,
.dialogo-vitrine .dialogo-rodape .botao-acao {
  height: 28px;
  padding: 0 0.85rem;
  gap: 0.5rem;
}

/* Funil, Duplicar e Atualizar sao so icone: o recuo lateral de um botao com
   texto os deixaria largos a toa. Dividem a MESMA regra porque o pedido era
   que tivessem exatamente o mesmo tamanho -- separados, o primeiro ajuste num
   deles desencontraria os outros. */
.barra-ferramentas .botao-filtro,
.barra-ferramentas .botao-duplicar,
.barra-ferramentas .botao-atualizar-grade {
  padding-inline: 0.55rem;
}

.botao-navegacao {
  background-color: var(--up-azul-royal);
  border-color: #003f80;
}

.botao-navegacao:hover:enabled {
  background-color: #003f80;
  color: #fff;
}

/* --- Selecao de linha na grade --------------------------------------------- */


.grade.selecionavel tbody tr.selecionada td {
  background-color: #dceefb;
}

.grade .escolha {
  width: 2.2rem;
  padding-inline: 0.35rem;
  text-align: center;
  border-right: 1px solid var(--up-borda-suave);
}

.grade .escolha input {
  vertical-align: middle;
  accent-color: var(--up-azul-royal);
}

.grade thead .escolha {
  border-right-color: var(--up-borda);
}

.etiqueta-status {
  display: inline-block;
  padding: 0.1rem 0.5rem;
  border-radius: 10px;
  font-size: 11px;
  font-weight: 700;
  background-color: #e8ecef;
  color: var(--up-cinza-chumbo);
}

/* Cores pela tabela de status do ERP (venda_documento_service.ROTULO_STATUS).
   Verde = ainda aceita alterar/cancelar (STATUS_EDITAVEIS: 1 Nao faturado,
   9 Pre-pedido e o 0 legado); vermelho = os dois cancelados (3 e 13, no PDV);
   azul = nota fiscal gerada. O resto fica no cinza padrao da etiqueta. */
.etiqueta-status.status-0,
.etiqueta-status.status-1,
.etiqueta-status.status-9,
.etiqueta-status.lojista-liberado {
  background-color: #e3f1e4;
  color: #3d7a42;
}

.etiqueta-status.status-3,
.etiqueta-status.status-13,
.etiqueta-status.lojista-bloqueado {
  background-color: var(--up-primaria-fundo);
  color: var(--up-primaria-escuro);
}

.etiqueta-status.status-4 {
  background-color: #dceefb;
  color: var(--up-azul-royal);
}

/* Situacao da NF-e (Fiscal > Notas fiscais de saida), nas cores da legenda
   da tela equivalente do Uniplus: verde autorizada, vermelho cancelada ou
   rejeitada, cinza denegada, azul normal (nao transmitida), lilas
   desconhecida. Codigos em fiscal_service.SITUACAO_NFE. */
.etiqueta-nfe {
  display: inline-block;
  padding: 0 0.5rem;
  border-radius: 10px;
  font-size: 11px;
  font-weight: 700;
  line-height: 15px;
}

.etiqueta-nfe.nfe-autorizada { background-color: #e3f1e4; color: #3d7a42; }
.etiqueta-nfe.nfe-rejeitada,
.etiqueta-nfe.nfe-cancelada { background-color: #fbe3e3; color: #b3261e; }
.etiqueta-nfe.nfe-denegada { background-color: #e8ecef; color: var(--up-cinza-chumbo); }
.etiqueta-nfe.nfe-normal { background-color: #dceefb; color: var(--up-azul-royal); }
.etiqueta-nfe.nfe-desconhecida { background-color: #efe6f7; color: #6b3fa0; }

.botao-alterar {
  background-color: var(--up-azul-royal);
  border-color: #003f80;
}

.botao-alterar:hover:enabled {
  background-color: #003f80;
}

/* Excluir na barra de ferramentas: vermelho de acao sem volta (o servidor
   ainda confere se o registro esta em uso, e o dialogo pergunta antes) */
.botao-excluir {
  background-color: var(--up-acao-excluir);
  border-color: var(--up-acao-excluir-escuro);
}

.botao-excluir:hover:enabled {
  background-color: var(--up-acao-excluir-escuro);
}

/* Encargos do Tipo de Documento: o grupo so existe para ligar/desligar os
   campos juntos ("Calcular encargos"); `display: contents` devolve cada campo
   a grade de 12 colunas do .bloco-campos, como se o grupo nao existisse */
.grupo-encargos {
  display: contents;
}

.grupo-encargos[hidden] {
  display: none;
}

/* --- Menu "Opcoes" da lista de Orcamentos ----------------------------------
   Botao claro com texto azul e painel de duas colunas (Faturamento / Outras
   acoes), no desenho do menu equivalente do Uniplus. */
.opcoes-lista {
  position: relative;
}

.botao-opcoes {
  background-color: #fff;
  border-color: var(--up-azul-royal);
  color: var(--up-azul-royal);
}

.botao-opcoes:hover:enabled,
.botao-opcoes[aria-expanded="true"] {
  background-color: #eef3fb;
  color: var(--up-azul-royal);
}

.menu-opcoes {
  position: absolute;
  top: calc(100% + 6px);
  right: 0;
  z-index: 1050;
  display: grid;
  grid-template-columns: repeat(2, minmax(15rem, 1fr));
  gap: 1.5rem;
  padding: 0.9rem 1.1rem 1rem;
  background-color: #fff;
  border: 1px solid var(--up-borda);
  border-radius: 6px;
  box-shadow: 0 6px 18px rgba(0, 6, 12, 0.18);
}

.menu-opcoes[hidden] {
  display: none;
}

.menu-opcoes-titulo {
  display: flex;
  align-items: center;
  gap: 0.45rem;
  margin: 0 0 0.35rem;
  padding-bottom: 0.4rem;
  border-bottom: 1px solid var(--up-borda);
  font-size: 15px;
  font-weight: 700;
  color: var(--up-azul-royal);
}

.menu-opcoes-item {
  display: flex;
  align-items: center;
  gap: 0.55rem;
  width: 100%;
  padding: 0.4rem 0.5rem;
  border: 0;
  border-radius: 4px;
  background: none;
  font-size: 13px;
  color: var(--up-cinza-chumbo);
  text-align: left;
  white-space: nowrap;
}

.menu-opcoes-item:hover:enabled,
.menu-opcoes-item:focus-visible {
  background-color: #57525a;
  color: #fff;
  outline: none;
}

.menu-opcoes-item:disabled {
  opacity: 0.5;
  cursor: not-allowed;
}

/* Menu Opcoes com um grupo so (Pedido de Venda: so "Outras acoes"; notas
   fiscais de saida: so "Opcoes NF-e"). */
.menu-opcoes.menu-opcoes-1 {
  grid-template-columns: minmax(15rem, auto);
}

@media (max-width: 575.98px) {
  .menu-opcoes {
    grid-template-columns: 1fr;
    gap: 0.75rem;
  }
}

.botao-cancelar-pedido {
  background-color: #e47646;
  border-color: #d4622b;
}

.botao-cancelar-pedido:hover:enabled {
  background-color: #d4622b;
}

/* Marrom -- fica ao lado do laranja do "Cancelar" sem se confundir com ele.
   Sem fundo proprio o botao herdaria so o `color: #fff` de .botao-acao e
   sumiria contra a pagina branca. */
/* Verde-azulado -- consulta, entre o azul claro do filtro e o marrom do
   "Imprimir", sem se confundir com o azul do "Alterar". */
.botao-visualizar {
  background-color: #0f766e;
  border-color: #0b5c56;
}

.botao-visualizar:hover:enabled {
  background-color: #0b5c56;
}

/* Duplicar: indigo da marca (--up-desktop, o mesmo da barrinha de navegacao).
   Fica ao lado do azul claro do funil sem virar irmao dele -- os dois sao os
   unicos botoes so-icone da barra, e cor igual faria parecerem um par de
   filtros. O tom escuro do hover e a unica cor solta aqui, como nos vizinhos:
   e uma sombra do proprio token, nao uma cor nova da identidade. */
.botao-duplicar {
  background-color: var(--up-desktop);
  border-color: #3f49a1;
}

.botao-duplicar:hover:enabled {
  background-color: #3f49a1;
}

/* Atualizar a lista: cinza chumbo -- e utilidade da grade, nao acao sobre o
   documento, entao nao pega cor de acao. Escuro o bastante para nao parecer
   o cinza claro de "descartar" (.botao-cancelar), e longe do azul do funil e
   do indigo do Duplicar, que ficam colados nele. O hover e sombra do proprio
   token, como nos vizinhos. */
.botao-atualizar-grade {
  background-color: var(--up-cinza-chumbo);
  border-color: #403c43;
}

.botao-atualizar-grade:hover:enabled {
  background-color: #403c43;
}

/* Uma volta do icone a cada clique: se nada mudou, a grade repinta igual e,
   sem isso, o vendedor ficaria sem saber se o clique pegou. */
.botao-atualizar-grade.girando .icone {
  animation: atualizar-grade-girar 0.6s ease-in-out;
}

@keyframes atualizar-grade-girar {
  to {
    transform: rotate(360deg);
  }
}

@media (prefers-reduced-motion: reduce) {
  .botao-atualizar-grade.girando .icone {
    animation: none;
  }
}

/* Roxo -- consulta rapida dos itens, distinto dos vizinhos */
.botao-itens-rapidos {
  background-color: #6d4fa8;
  border-color: #563d88;
}

.botao-itens-rapidos:hover:enabled {
  background-color: #563d88;
}

.botao-imprimir {
  background-color: #7a4f2c;
  border-color: #5f3d21;
}

.botao-imprimir:hover:enabled {
  background-color: #5f3d21;
}

/* Conciliacao por arquivo (extrato da Conta Corrente): azul da marca. Ao
   lado dele ficam o verde do "Conciliar" e o laranja do "Desconciliar" --
   reaproveitam .botao-ok e .botao-cancelar-pedido pelo sentido (confirma /
   desfaz); a importacao do arquivo e uma tela a parte, entao ganha a cor
   da marca em vez de uma terceira cor de acao. `a` tambem: e um link. */
.botao-conciliacao-arquivo {
  background-color: var(--up-primaria);
  border-color: var(--up-primaria-escuro);
}

.botao-conciliacao-arquivo:hover:enabled,
a.botao-conciliacao-arquivo:hover {
  background-color: var(--up-primaria-escuro);
  color: #fff;
}

/* --- Campo com lupa -------------------------------------------------------- */

.campo-com-lupa {
  display: flex;
}

.campo-com-lupa input {
  border-top-right-radius: 0;
  border-bottom-right-radius: 0;
}

.botao-lupa {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 2.1rem;
  border: 1px solid var(--up-azul-royal);
  border-left: 0;
  border-radius: 0 4px 4px 0;
  background-color: var(--up-azul-royal);
  color: #fff;
}

.botao-lupa:hover:enabled {
  background-color: #003f80;
}

/* Lupa seguida de outro botao (ex.: editar cliente): so o ultimo arredonda,
   e um filete claro separa os dois */
.campo-com-lupa .botao-lupa:not(:last-child) {
  border-radius: 0;
}

.campo-com-lupa .botao-lupa + .botao-lupa {
  border-left: 1px solid rgba(255, 255, 255, 0.45);
}

/* sem cliente escolhido nao ha o que editar */
.botao-editar-cliente:disabled {
  opacity: 0.45;
  cursor: default;
}

/* O lapis nao tem rotulo -- e so o desenho --, entao o atalho aparece DENTRO
   dele, do mesmo jeito que os botoes com texto mostram o deles ("GRAVAR
   (F10)", "ALTERAR (F3)"). Sem isto o F3 existia so no `title`, e atalho que
   so aparece parando o mouse em cima ninguem descobre.
   A largura deixa de ser a fixa da lupa (2.1rem) e passa a acompanhar o
   conteudo; o resto (fundo azul, cor branca, centralizacao) continua vindo de
   `.botao-lupa`. */
.botao-editar-cliente {
  width: auto;
  gap: 0.3rem;
  padding: 0 0.45rem;
}

/* Miudo de proposito: e uma legenda do botao, nao o conteudo dele -- quem
   nomeia a acao e o icone (e o `title`, para quem passa o mouse). */
.atalho-botao {
  font-size: 10.5px;
  font-weight: 700;
  line-height: 1;
}

/* --- Edicao rapida do cliente (Pedido/Orcamento) --------------------------- */

/* Cabecalho e rodape fixos, so o meio rola: numa janela baixa os botoes
   Gravar/Cancelar continuam sempre a vista (mesma ideia do rodape fixo do
   Pedido). A altura maxima deixa folga da borda da janela. */
/* `.dialogo-medio.` na frente: a regra generica `.dialogo-medio[open]
   { display: block }` vem depois no arquivo e desligaria o flex */
.dialogo-medio.dialogo-cliente-rapido[open] {
  display: flex;
  flex-direction: column;
  max-height: calc(100vh - 2rem);
}

.dialogo-cliente-rapido .dialogo-cabecalho,
.dialogo-cliente-rapido .dialogo-rodape {
  flex: 0 0 auto;
}

.dialogo-cliente-rapido .cliente-rapido-corpo {
  flex: 1 1 auto;
  min-height: 0;
  overflow-y: auto;
}

/* mesma densidade do bloco de campos do Pedido (#formDocumento) */
.dialogo-cliente-rapido .bloco-campos {
  gap: 0.5rem 0.75rem;
  padding: 0.9rem 1.25rem;
  border: 0;
}

/* titulo de secao, como "Pessoa Juridica" no Cadastro de Clientes */
.dialogo-cliente-rapido .bloco-titulo {
  grid-column: span 12;
  margin: 0.35rem 0 0;
}

/* campos so de Pessoa Juridica, escondidos na Fisica (o `display` do
   .campo passaria por cima do atributo hidden) */
.dialogo-cliente-rapido .campo[hidden] {
  display: none;
}
.dialogo-cliente-rapido .campo-7 { grid-column: span 7; }
.dialogo-cliente-rapido .campo-8 { grid-column: span 8; }

.dialogo-cliente-rapido .dialogo-rodape {
  gap: 0.5rem;
  padding: 0.6rem 1.25rem;
}

@media (max-width: 767.98px) {
  .dialogo-cliente-rapido .campo {
    grid-column: span 12;
  }
}

/* --- Dialogo largo (pesquisa de produtos) ---------------------------------- */

.dialogo-largo {
  /* tamanho fixo: a janela nao pode encolher/crescer conforme o resultado */
  width: min(72rem, calc(100vw - 3rem));
  height: min(44rem, calc(100vh - 4rem));
}

/* nao declarar `display` fora do [open]: isso sobrescreve o
   `dialog:not([open]) { display: none }` do navegador e a janela nasce aberta */
.dialogo-largo[open] {
  display: flex;
  flex-direction: column;
}

.dialogo-cabecalho {
  display: flex;
  align-items: center;
  justify-content: space-between;
  padding: 1rem 1.25rem;
  border-bottom: 1px solid rgba(0, 0, 0, 0.1);
}

.dialogo-titulo-largo {
  margin: 0;
  font-size: 1.15rem;
  font-weight: 600;
  color: #3a4550;
}

.dialogo-fechar {
  border: 0;
  background: none;
  font-size: 22px;
  line-height: 1;
  color: var(--up-texto-suave);
}

.dialogo-fechar:hover {
  color: var(--up-primaria);
}

.dialogo-filtros {
  display: flex;
  align-items: center;
  gap: 1.25rem;
  padding: 0.9rem 1.25rem;
}

.dialogo-filtros .campo-pesquisa {
  max-width: 22rem;
}

.campo-marcavel {
  display: inline-flex;
  align-items: center;
  gap: 0.4rem;
  font-size: 12px;
  font-weight: 600;
  color: var(--up-texto-suave);
}

.campo-marcavel input {
  accent-color: var(--up-azul-royal);
}

/* --- Interruptor (toggle) --------------------------------------------------- */
/* Checkbox nativo escondido + trilho estilizado ao lado; sem JS proprio. */

.interruptor {
  position: relative;
  display: inline-flex;
  align-items: center;
  width: 2.5rem;
  height: 1.35rem;
  flex: 0 0 auto;
}

.interruptor input {
  position: absolute;
  inset: 0;
  margin: 0;
  opacity: 0;
}

.interruptor .trilho {
  position: absolute;
  inset: 0;
  background-color: var(--up-borda);
  border-radius: 999px;
  transition: background-color 0.15s ease;
}

.interruptor .trilho::before {
  content: "";
  position: absolute;
  top: 2px;
  left: 2px;
  width: 1.05rem;
  height: 1.05rem;
  background-color: #fff;
  border-radius: 50%;
  box-shadow: 0 1px 2px rgba(0, 6, 12, 0.3);
  transition: transform 0.15s ease;
}

.interruptor input:checked + .trilho {
  background-color: var(--up-azul-royal);
}

.interruptor input:checked + .trilho::before {
  transform: translateX(1.15rem);
}

.interruptor input:focus-visible + .trilho {
  box-shadow: 0 0 0 0.15rem rgba(54, 169, 225, 0.35);
}

/* Travado (ex.: "Ativo" de um tipo de documento do sistema): apagado, como
   os campos desabilitados, e sem cursor de clique */
.interruptor input:disabled {
  cursor: not-allowed;
}

.interruptor input:disabled + .trilho {
  opacity: 0.5;
}

/* --- Linha de sinalizadores (Cliente, Fornecedor, Vendedor...) ------------- */

.linha-flags {
  display: flex;
  flex-wrap: wrap;
  gap: 0.4rem 1.25rem;
}

.dialogo-corpo {
  flex: 1 1 auto;
  min-height: 0; /* deixa o flex encolher e a rolagem ficar aqui dentro */
  overflow-y: auto;
  padding: 0 1.25rem;
}

/* dentro do dialogo a rolagem e do corpo, nao da moldura da grade */
.dialogo-corpo .grade-envolucro {
  overflow-y: visible;
}

.dialogo-corpo .grade thead th {
  position: sticky;
  top: 0;
  z-index: 1;
}

/* --- Rastreabilidade (janela do menu Opcoes) -------------------------------
   Duas colunas: o CAMINHO do documento a esquerda, em largura fixa (a lista e
   curta e previsivel -- de onde veio, no que deu, a nota), e a LINHA DO TEMPO
   a direita, que e quem cresce. Abaixo de 900px viram uma coluna so: a janela
   ja ocupa quase a tela inteira e duas colunas estreitas quebrariam as datas.

   Nada aqui inventa cor: as situacoes reaproveitam `.etiqueta-status` e
   `.etiqueta-nfe` das listagens, e os pontos da linha do tempo usam as cores
   que ja significam aquela acao na barra de ferramentas (verde = incluir,
   indigo = duplicar, marrom = imprimir...). */

.rastreio-corpo {
  display: grid;
  grid-template-columns: 20rem 1fr;
  gap: 1.5rem;
  align-items: start;
  padding-block: 0.75rem;
}

@media (max-width: 900px) {
  .rastreio-corpo {
    grid-template-columns: 1fr;
  }
}

.rastreio-corpo .bloco-titulo {
  margin: 0 0 0.6rem;
}

.rastreio-aviso {
  margin: 0 0 0.6rem;
  font-size: 11.5px;
  color: var(--up-texto-suave);
}

/* --- Caminho do documento --------------------------------------------------- */

.rastreio-cadeia {
  margin: 0;
  padding: 0;
  list-style: none;
}

/* O fio da esquerda e o que transforma cartoes soltos em CADEIA: sem ele,
   "veio de" e "duplicado para" pareceriam listas independentes. */
.rastreio-item {
  position: relative;
  padding-left: 0.9rem;
}

.rastreio-item::before {
  content: "";
  position: absolute;
  left: 3px;
  top: 0;
  bottom: 0;
  border-left: 2px solid var(--up-borda);
}

/* o fio comeca no primeiro cartao e termina no ultimo, em vez de sobrar para
   fora da lista */
.rastreio-item:first-child::before {
  top: 1.1rem;
}

.rastreio-item:last-child::before {
  bottom: calc(100% - 1.1rem);
}

.rastreio-relacao {
  display: block;
  margin: 0.5rem 0 0.2rem;
  font-size: 10.5px;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.02em;
  color: var(--up-texto-suave);
}

.rastreio-cartao {
  display: block;
  width: 100%;
  padding: 0.5rem 0.6rem;
  border: 1px solid var(--up-borda);
  border-radius: 4px;
  background-color: #fff;
  font-family: inherit;
  font-size: 12px;
  text-align: left;
  color: var(--up-texto);
}

/* o cartao vira botao quando da para abrir o documento; quando nao da (outra
   filial, outro vendedor, ou a tela desligada nos Modulos) ele continua ali,
   so que como texto -- esconder o documento mentiria sobre a historia */

button.rastreio-cartao:hover {
  border-color: var(--up-primaria);
  background-color: var(--up-primaria-fundo);
}

.rastreio-item.atual .rastreio-cartao {
  border-color: var(--up-azul-royal);
  background-color: #dceefb;
}

.rastreio-cartao-titulo {
  display: block;
  font-weight: 700;
  color: var(--up-marca-escura);
}

.rastreio-cartao-cliente {
  display: block;
  margin-top: 0.15rem;
  overflow: hidden;
  white-space: nowrap;
  text-overflow: ellipsis;
  color: var(--up-texto-suave);
}

.rastreio-cartao-rodape {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 0.5rem;
  margin-top: 0.35rem;
}

.rastreio-cartao-valor {
  font-weight: 700;
  color: var(--up-azul-royal);
}

/* --- Linha do tempo --------------------------------------------------------- */

.linha-tempo {
  margin: 0;
  padding: 0;
  list-style: none;
}

.linha-tempo .evento {
  position: relative;
  padding: 0 0 0.9rem 1.15rem;
}

.linha-tempo .evento::before {
  content: "";
  position: absolute;
  left: 4px;
  top: 1rem;
  bottom: 0;
  border-left: 2px solid var(--up-borda);
}

.linha-tempo .evento:last-child::before {
  display: none;
}

/* o ponto: o anel branco + a sombra de 1px o destacam do fio que passa por
   tras dele */
.evento-marca {
  position: absolute;
  left: 0;
  top: 0.3rem;
  width: 10px;
  height: 10px;
  border: 2px solid #fff;
  border-radius: 50%;
  background-color: var(--up-azul-sky);
  box-shadow: 0 0 0 1px var(--up-borda);
}

/* autorizada pela SEFAZ e importada do XML (Rastreabilidade da nota) sao o
   mesmo "nasceu" da criacao; a carta de correcao fica com o azul padrao */
.evento-criado .evento-marca,
.evento-autorizado .evento-marca,
.evento-importado .evento-marca {
  background-color: #55a459;
}

.evento-cancelado .evento-marca {
  background-color: #d70a23;
}

.evento-duplicado .evento-marca,
.evento-copia_de .evento-marca {
  background-color: var(--up-desktop);
}

/* o Gerar financeiro do Pedido de Faturamento (01/10/2026) e da mesma
   familia: o pedido deu origem a outro documento (os titulos a receber) */
.evento-transformado .evento-marca,
.evento-gerado_de .evento-marca,
.evento-nota_gerada .evento-marca,
.evento-financeiro_gerado .evento-marca {
  background-color: #6d4fa8;
}

.evento-impresso .evento-marca {
  background-color: #7a4f2c;
}

/* conferido na Expedicao: o verde de "resolvido", o mesmo da etiqueta
   "Conferido" da grade da Conferencia */
.evento-conferido .evento-marca,
.evento-enviado_expedicao .evento-marca,
.evento-separacao_iniciada .evento-marca,
.evento-separacao_concluida .evento-marca,
.evento-liberado_preparacao .evento-marca {
  background-color: var(--up-resolvida);
}

/* supervisor derrubou a edicao de alguem (ver trava_edicao_service) e
   supervisor liberou uma pauta fora das marcadas para o vendedor (ver
   autorizacao_pauta_service): os dois sao a mesma coisa para quem le o
   historico -- alguem com mais poder autorizou o que a regra barrava. */
.evento-edicao_liberada .evento-marca,
.evento-pauta_liberada .evento-marca {
  background-color: var(--up-intervencao);
}

/* titulos (Contas a Pagar / a Receber): a baixa e o "resolvido" (o mesmo
   verde da Conferencia); estorno e "estornar so esta" desfazem, em ambar;
   a exclusao e o vermelho do cancelamento; a prorrogacao muda o prazo, no
   roxo das transformacoes. Taxa do cartao, acrescimo e desconto ficam com o
   azul padrao. */
.evento-baixado .evento-marca {
  background-color: var(--up-resolvida);
}

.evento-estornado .evento-marca,
.evento-retirado_expedicao .evento-marca,
.evento-preparacao_voltou .evento-marca,
.evento-liberacao_desfeita .evento-marca,
.evento-forma_estornada .evento-marca {
  background-color: #d98b0b;
}

.evento-excluido .evento-marca {
  background-color: #d70a23;
}

.evento-prorrogado .evento-marca {
  background-color: #6d4fa8;
}

.evento-titulo {
  font-size: 12.5px;
  font-weight: 700;
  color: var(--up-texto);
}

.evento-dados {
  display: flex;
  flex-wrap: wrap;
  gap: 0.1rem 0.5rem;
  font-size: 11.5px;
  color: var(--up-texto-suave);
}

/* de qual sistema veio a linha: o mesmo documento tem historia dos dois lados,
   e saber quem registrou o que e parte da rastreabilidade */
.evento-fonte {
  padding: 0 0.35rem;
  border-radius: 10px;
  background-color: var(--up-cinza-frio);
  font-size: 10.5px;
  font-weight: 700;
}

.evento-campos {
  margin: 0.35rem 0 0;
  padding: 0;
  list-style: none;
  font-size: 11.5px;
}

.evento-campos li {
  display: flex;
  flex-wrap: wrap;
  gap: 0.35rem;
  padding: 0.1rem 0;
}

.evento-campo {
  color: var(--up-texto-suave);
}

/* valor antigo riscado: a mudanca se le de relance, sem precisar comparar os
   dois textos palavra a palavra */
.evento-de {
  color: var(--up-texto-suave);
  text-decoration: line-through;
}

.evento-para {
  font-weight: 600;
}

.rastreio-vazio {
  margin: 0;
  font-size: 12px;
  color: var(--up-texto-suave);
}

.contagem-resultados {
  margin: 0.5rem 0;
  text-align: right;
  font-size: 12px;
  font-weight: 600;
  color: var(--up-azul-royal);
}

.carregando-mais {
  margin: 0 0 0.5rem;
  text-align: center;
  font-size: 12px;
  color: var(--up-texto-suave);
}

.carregando-mais[hidden] {
  display: none;
}

.dialogo-rodape {
  display: flex;
  justify-content: flex-end;
  padding: 1rem 1.25rem;
  border-top: 1px solid rgba(0, 0, 0, 0.1);
}

.dialogo-texto {
  margin: 0;
  padding: 1rem 2rem 0;
  text-align: center;
  font-size: 13px;
  color: var(--up-texto-suave);
}

/* a pergunta do UniplusRetorno.confirmar e texto puro (textContent): a
   quebra de linha do texto vira quebra na tela -- a conciliacao lista ali os
   lancamentos que serao duplicados, um por linha. Textos sem "\n" nao mudam. */
#retornoConfirmarTexto {
  white-space: pre-line;
}

/* --- Dialogo de filtros ---------------------------------------------------- */

.dialogo-medio {
  width: min(46rem, calc(100vw - 3rem));
}

.dialogo-medio[open] {
  display: block;
}

.formulario-filtro .bloco-campos.sem-moldura {
  border: 0;
  padding: 1.25rem;
}

.dialogo-rodape.centralizado {
  justify-content: center;
  gap: 0.5rem;
}

.botao-filtro {
  background-color: var(--up-azul-sky);
  border-color: #2b8dbe;
  padding-inline: 0.75rem;
}

.botao-filtro:hover {
  background-color: #2b8dbe;
  color: #fff;
}

.botao-filtro.ativo {
  background-color: var(--up-azul-royal);
  border-color: #003f80;
}

.botao-aplicar {
  background-color: var(--up-azul-royal);
  border-color: #003f80;
}

.botao-aplicar:hover {
  background-color: #003f80;
  color: #fff;
}

.chips-filtro {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 0.4rem;
  margin: 0 0 0.75rem;
}

.chip-filtro {
  display: inline-block;
  padding: 0.2rem 0.6rem;
  border-radius: 3px;
  background-color: var(--up-azul-royal);
  font-size: 11px;
  font-weight: 700;
  color: #fff;
}

/* "x" dentro do chip: fecha so aquele filtro (ver venda_documento_lista.html) */
.chip-filtro {
  display: inline-flex;
  align-items: center;
  gap: 0.35rem;
}

.chip-fechar {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 15px;
  height: 15px;
  border-radius: 50%;
  font-size: 14px;
  line-height: 1;
  color: #fff;
  text-decoration: none;
  opacity: 0.8;
}

.chip-fechar:hover,
.chip-fechar:focus-visible {
  background-color: rgba(255, 255, 255, 0.25);
  color: #fff;
  opacity: 1;
}

@media (min-width: 768px) {
  .campo-6 { grid-column: span 6; }
}

/* Previa do arquivo lido: monoespacada para preservar as colunas fixas */
.previa-arquivo {
  font-family: ui-monospace, SFMono-Regular, Consolas, "Liberation Mono", monospace;
  font-size: 11px;
  white-space: pre;
  overflow-x: auto;
  background-color: var(--up-cinza-frio);
  border: 1px solid var(--up-borda-suave);
  border-radius: 4px;
  padding: 0.75rem;
  margin-bottom: 0;
}

/* ==========================================================================
   Painel Admin: casca da tela (menu lateral + conteudo)
   ========================================================================== */

/* O painel do admin cuida do proprio espacamento (o menu lateral precisa ir de
   ponta a ponta) e, principalmente, vira uma COLUNA FLEX: e daqui que sai a
   altura definida para `.painel-admin` -> `.admin-conteudo` -> formulario ->
   grade. Sem uma altura definida nessa cadeia, `flex: 1` na grade nao tem do
   que tomar 1 fracao e ela cresce com o conteudo, esticando o card.

   `overflow-y: auto` continua na regra geral de `.painel` como rede de
   seguranca (janela muito baixa), mas no uso normal quem rola e a grade. */
.painel.painel-sem-respiro {
  display: flex;
  flex-direction: column;
  padding: 0;
}

.painel-admin {
  display: grid;
  grid-template-columns: 200px minmax(0, 1fr);
  gap: 1.5rem;
  /* toma a altura que sobra do card; min-height:0 deixa encolher abaixo do
     conteudo, que e o que faz a rolagem acontecer na grade e nao aqui */
  flex: 1 1 auto;
  min-height: 0;
}

.admin-menu {
  padding: 1.25rem 0.75rem;
  border-right: 1px solid var(--up-borda-suave);
  background-color: var(--up-cinza-frio);
}

.admin-menu-titulo {
  margin: 0 0 0.6rem 0.65rem;
  font-size: 10.5px;
  font-weight: 700;
  letter-spacing: 0.06em;
  text-transform: uppercase;
  color: var(--up-texto-suave);
}

/* --- Busca de configuracoes (menu lateral) -------------------------------
   Campo com lupa acima das secoes; os resultados abrem por cima do conteudo,
   mais largos que o menu, com o nome e a secao de cada configuracao. */
.admin-busca {
  position: relative;
  margin: 0 0 0.75rem;
}

.admin-busca-campo {
  position: relative;
}

.admin-busca-lupa {
  position: absolute;
  top: 50%;
  left: 8px;
  display: flex;
  transform: translateY(-50%);
  color: #a7b1ba;
  pointer-events: none;
  transition: color 0.15s;
}

.admin-busca-campo:focus-within .admin-busca-lupa {
  color: var(--up-azul-sky);
}

.admin-busca-campo input {
  width: 100%;
  padding: 3px 6px 3px 26px;
  border: 1px solid var(--up-borda);
  border-radius: 4px;
  background-color: #fff;
  font-family: var(--up-fonte);
  font-size: 12px;
  line-height: 1.4;
  color: var(--up-texto);
}

.admin-busca-campo input:focus {
  outline: 0;
  border-color: var(--up-azul-sky);
  box-shadow: 0 0 0 0.15rem rgba(54, 169, 225, 0.2);
}

.admin-busca-resultados {
  position: absolute;
  top: calc(100% + 3px);
  left: 0;
  z-index: 1040;
  width: 22rem;
  max-width: calc(100vw - 2rem);
  max-height: 22rem;
  margin: 0;
  padding: 3px 0;
  overflow-y: auto;
  list-style: none;
  border: 1px solid var(--up-borda);
  border-radius: 4px;
  background-color: #fff;
  box-shadow: var(--up-sombra-menu);
}

.admin-busca-resultados[hidden] {
  display: none;
}

.admin-busca-item {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  gap: 0.75rem;
  padding: 4px 10px;
}

.admin-busca-item.ativo {
  background-color: var(--up-primaria-fundo);
}

.admin-busca-titulo {
  min-width: 0;
  font-size: 12px;
  color: var(--up-azul-royal);
}

.admin-busca-item.ativo .admin-busca-titulo {
  color: var(--up-primaria-escuro);
}

.admin-busca-secao {
  flex-shrink: 0;
  font-size: 10.5px;
  color: var(--up-texto-suave);
}

.admin-busca-vazio {
  padding: 6px 10px;
  font-size: 12px;
  color: var(--up-texto-suave);
}

/* Configuracao encontrada pela busca: pisca em amarelo suave e apaga */
.admin-destaque {
  animation: admin-destaque 2.6s ease-out;
}

@keyframes admin-destaque {
  0%, 35% {
    background-color: #fff3bf;
    box-shadow: inset 0 0 0 2px #f2c94c;
  }
  100% {
    background-color: transparent;
    box-shadow: inset 0 0 0 2px transparent;
  }
}

@media (prefers-reduced-motion: reduce) {
  .admin-destaque {
    animation: none;
    background-color: #fff3bf;
  }
}

.admin-menu-lista {
  margin: 0;
  padding: 0;
  list-style: none;
}

.admin-menu-item {
  display: flex;
  align-items: center;
  gap: 0.55rem;
  padding: 0.45rem 0.65rem;
  border-radius: 4px;
  font-size: 12.5px;
  color: var(--up-cinza-chumbo);
  text-decoration: none;
  transition: background-color 0.15s ease, color 0.15s ease;
}

.admin-menu-item:hover,
.admin-menu-item:focus-visible {
  background-color: #fff;
  color: var(--up-texto);
}

.admin-menu-item.ativo {
  background-color: #fff;
  box-shadow: inset 2px 0 0 var(--up-azul-royal);
  font-weight: 700;
  color: var(--up-azul-royal);
}

/* Coluna de conteudo como FLEX COLUMN: e o que permite a grade tomar a altura
   que sobra e o rodape ficar colado na base do card.

   `position: sticky` sozinho nao resolvia: sticky gruda enquanto HA rolagem,
   mas nao empurra nada para o fundo. Numa janela alta, em que o conteudo cabe
   inteiro, o rodape parava no lugar natural dele e sobrava um bloco de card
   branco vazio embaixo -- o "espaco enorme" entre o GRAVAR e o fundo vermelho. */
.admin-conteudo {
  /* o padding que o .painel daria de volta, agora so do lado do conteudo */
  padding: 1.25rem 1.5rem 0 0;
  min-width: 0;
  min-height: 0;
  display: flex;
  flex-direction: column;
}

/* o formulario da secao ocupa toda a altura que sobra da coluna */
.admin-conteudo > .formulario {
  flex: 1 1 auto;
  display: flex;
  flex-direction: column;
  /* sem isto um filho que rola nao encolhe abaixo do proprio conteudo e o
     flex:1 da grade nao teria efeito nenhum */
  min-height: 0;
}

/* `margin-top: auto` empurra o rodape para a base da coluna -- que e o que
   `position: sticky` NAO faz (sticky so gruda enquanto ha rolagem).
   A margem inferior negativa da regra geral e zerada aqui de proposito: num
   container flex a margem auto ABSORVE o espaco que a negativa criaria, o
   rodape nao desce, e sobra o padding do card como uma faixa branca. Aqui o
   `.painel` nao tem padding nenhum (painel-sem-respiro), entao nao ha o que
   cancelar; so a direita precisa esticar ate a borda do card. */
.admin-conteudo .rodape-formulario {
  /* topo auto = cola na base; direita negativa = alcanca a borda do card,
     passando por cima do padding da coluna */
  margin: auto -1.5rem 0 0;
}

/* Grade que rola POR DENTRO em vez de esticar o card. A altura sai do
   flex:1 1 auto -- nada de max-height/calc() com numero magico, que quebraria
   em outra resolucao ou se o cabecalho da secao mudasse de tamanho. */
/* Painel Admin > Usuarios: os textos de ajuda acima da grade, num bloco so.
   Ate 23/09/2026 eram <p> soltos com a margem do .texto-apoio (1.1rem) e a
   entrelinha do corpo -- quatro paragrafos tomavam ~1/3 da altura e a grade,
   que so fica com a SOBRA da coluna (flex: 1), mostrava umas 10 linhas. O
   cliente pediu o texto mais junto e a grade mais alta: letra 12px,
   entrelinha 1.35 e 0.3rem entre paragrafos. `flex-shrink: 0` porque quem
   cede altura numa janela baixa e a grade (ate o min-height dela), nunca o
   texto -- texto espremido num flex vira sobreposicao. */
.ajuda-usuarios {
  flex: 0 0 auto;
  margin-bottom: 0.55rem;
}

.ajuda-usuarios .texto-apoio,
.ajuda-usuarios .aviso-pauta {
  margin: 0 0 0.3rem;
  font-size: 12px;
  line-height: 1.35;
}

.ajuda-usuarios > :last-child {
  margin-bottom: 0;
}

/* a grade de Usuarios nao encolhe abaixo de ~8 linhas: numa janela baixa
   quem rola passa a ser o painel (a rede de seguranca do .painel), em vez de
   a grade virar uma fresta de 3 linhas */
#formUsuarios .grade-envolucro.rolagem-interna {
  min-height: 15rem;
}

/* Painel Admin > Usuarios: pesquisa acima da grade */
.barra-usuarios .campo-pesquisa {
  flex: 0 1 24rem;
}

.contagem-usuarios {
  margin-left: auto;
  font-size: 12px;
  color: var(--up-texto-suave);
}

#gradeUsuarios tbody tr[hidden] {
  display: none;
}

.grade-envolucro.rolagem-interna {
  flex: 1 1 auto;
  min-height: 8rem;
  overflow-y: auto;
}

/* Corpo da secao que rola POR INTEIRO quando nao cabe (Painel Admin > Vendas):
   o rodape fica fora dele, sempre colado na base. Coluna flex para a grade
   `.rolagem-interna` de dentro continuar tomando a sobra numa janela alta;
   os demais blocos nao encolhem -- quem cede altura primeiro e a grade (ate o
   min-height dela), e so depois o corpo passa a rolar. */
.admin-corpo-rolavel {
  flex: 1 1 auto;
  min-height: 0;
  overflow-y: auto;
  display: flex;
  flex-direction: column;
}

.admin-corpo-rolavel > :not(.rolagem-interna) {
  flex-shrink: 0;
}

/* --- Painel Admin > Modulos -------------------------------------------------- */

/* pedido da senha de desenvolvedor: cartao pequeno no alto da secao */
.acesso-desenvolvedor {
  max-width: 26rem;
  margin: 2.5rem auto 0;
  padding: 1.5rem 1.75rem;
  border: 1px solid var(--up-borda-suave);
  border-radius: 6px;
  text-align: center;
}

.acesso-desenvolvedor-icone {
  color: var(--up-primaria);
  margin-bottom: 0.5rem;
}

.acesso-desenvolvedor-titulo {
  margin: 0 0 0.4rem;
  font-size: 15px;
  font-weight: 700;
  color: var(--up-texto);
}

.acesso-desenvolvedor-texto {
  margin: 0 0 1rem;
  font-size: 12.5px;
  color: var(--up-texto-suave);
}

.acesso-desenvolvedor-form {
  display: flex;
  flex-wrap: wrap;
  gap: 0.5rem;
  justify-content: center;
}

.acesso-desenvolvedor-form input {
  flex: 1 1 12rem;
  padding: 0.35rem 0.6rem;
  border: 1px solid var(--up-borda);
  border-radius: 4px;
}

.acesso-desenvolvedor-erro {
  flex-basis: 100%;
  margin: 0.25rem 0 0;
  font-size: 12px;
  color: #c0392b;
}

/* liga/desliga do modulo, no lugar do titulo do bloco */
.modulo-chave .bloco-titulo {
  margin: 0;
}

.grade-modulos {
  flex-shrink: 0;
}

.grade-modulos .coluna-tela {
  width: 16rem;
}

.grade-modulos .coluna-disponivel {
  width: 6.5rem;
  text-align: center;
}

.grade-modulos .celula-funcoes {
  display: flex;
  flex-wrap: wrap;
  gap: 0.25rem 1.1rem;
}

.marca-funcao {
  display: inline-flex;
  align-items: center;
  gap: 0.3rem;
  white-space: nowrap;
}

/* desligado (proprio ou por um pai desligado): apagado, mas a marca fica */
.marca-funcao.desligado,
.grade-modulos tr.desligado td:not(.coluna-disponivel),
.grade-modulos.desligado {
  opacity: 0.45;
}

.grade-modulos.desligado tr.desligado td:not(.coluna-disponivel) {
  opacity: 1;
}

/* Painel Admin > Vendas, "Situacao padrao das listagens": poucas linhas (uma
   por filial), entao nao encolhe -- quando falta altura quem rola e o corpo da
   secao inteiro (`.admin-corpo-rolavel`). Antes de 22/09/2026 a secao tinha
   embaixo a grade de pautas, que era a que rolava por dentro; ela virou uma
   coluna da grade de Usuarios. */
.grade-situacao-padrao {
  flex-shrink: 0;
  margin-bottom: 0.25rem;
}

.grade-planilha .coluna-situacao-padrao {
  width: 14rem;
}

/* Pesquisa de Produtos (Pedido/Orcamento): produto sem preco numa pauta mostra
   o preco base naquela coluna, apagado -- e o que vale, mas nao e da pauta */
.grade-planilha td.preco-sem-pauta {
  color: #9aa3ab;
}

/* --- Painel Admin > Modelos de impressao ------------------------------------
   23/09/2026: a secao virou GRADE (antes: um bloco por documento com tabela
   propria, botao Incluir sozinho no topo e assistente de 3 passos). Uma linha
   por modelo, na variante densa `.grade-planilha` das outras grades do painel,
   com pesquisa + contagem + Incluir numa barra so -- o mesmo arranjo de
   Usuarios. Estilo escopado em #gradeModelos / .dialogo-modelo: a classe
   `.tabela-modelos` antiga continua sendo do Cadastro de Impressoras. */

.barra-modelos .campo-pesquisa {
  flex: 0 1 26rem;
}

.contagem-modelos {
  margin-left: auto;
  margin-right: 0.4rem;
  font-size: 12px;
  color: var(--up-texto-suave);
}

/* layout fixo: com texto longo (lista de filiais) as colunas nao dancam;
   o que nao cabe corta com reticencias e o `title` da celula mostra inteiro */
#gradeModelos {
  width: 100%;
  table-layout: fixed;
}

#gradeModelos .col-documentos { width: 22%; }
#gradeModelos .col-filiais { width: 20%; }
#gradeModelos .col-arquivo { width: 16%; }
#gradeModelos .col-situacao { width: 5.5rem; }
#gradeModelos .col-alterado { width: 8.5rem; }
/* tres botoes de 18px (variante densa) + os espacos entre eles */
#gradeModelos .col-acao { width: 5.2rem; }

#gradeModelos td {
  vertical-align: middle;
  overflow: hidden;
  white-space: nowrap;
  text-overflow: ellipsis;
}

#gradeModelos tbody tr[data-id] {
  cursor: default;
}

#gradeModelos tbody tr[hidden] {
  display: none;
}

/* inativo: continua na grade, apagado -- nao aparece no Imprimir */
#gradeModelos tr.inativo td:not(:last-child) {
  color: var(--up-texto-suave);
}

#gradeModelos .marca-todas {
  font-weight: 600;
  color: var(--up-azul-royal);
}

#gradeModelos .linha-vazia td {
  padding: 0.9rem 0.75rem;
  text-align: center;
  white-space: normal;
  color: var(--up-texto-suave);
}

/* alterar / baixar / excluir lado a lado; o <a> do download ganha o mesmo
   formato dos botoes pela .botao-icone-item */
#gradeModelos .acoes-modelo {
  display: inline-flex;
  gap: 0.25rem;
}

#gradeModelos a.botao-icone-item {
  text-decoration: none;
}

/* --- Formulario Incluir / Alterar ------------------------------------------ */

.dialogo-medio.dialogo-modelo {
  width: min(40rem, calc(100vw - 3rem));
}

.dialogo-medio.dialogo-modelo[open] {
  display: flex;
  flex-direction: column;
  max-height: calc(100vh - 2rem);
}

.dialogo-modelo .modelo-corpo {
  flex: 1 1 auto;
  min-height: 0;
  overflow-y: auto;
}

/* mesma densidade do "Editar cliente" do Pedido */
.dialogo-modelo .bloco-campos {
  gap: 0.6rem 0.75rem;
  padding: 0.9rem 1.25rem;
  border: 0;
}

.dialogo-modelo .campo label {
  font-size: 10.5px;
  line-height: 1.25;
}

.dialogo-modelo .campo input[type="text"],
.dialogo-modelo .campo select {
  padding: 2px 4px;
  font-size: 11.5px;
  line-height: 1.35;
  border-radius: 3px;
}

.dialogo-modelo .campo-9 { grid-column: span 9; }
.dialogo-modelo .campo-3 { grid-column: span 3; }

.dialogo-modelo .dialogo-rodape {
  flex: 0 0 auto;
  gap: 0.5rem;
  padding: 0.6rem 1.25rem;
}

/* arquivo: campo de leitura + botao Selecionar, na altura de um campo comum.
   O campo inteiro aceita soltar o .jrxml (borda azul enquanto arrasta). */
.campo-arquivo {
  display: flex;
  gap: 0.35rem;
  border-radius: 3px;
}

.campo-arquivo input[type="text"] {
  flex: 1 1 auto;
  min-width: 0;
  cursor: pointer;
  background-color: var(--up-cinza-frio);
}

.campo-arquivo.arrastando input[type="text"] {
  border-color: var(--up-azul-sky);
  box-shadow: 0 0 0 2px var(--up-azul-sky);
}

.campo-arquivo .botao-selecionar {
  flex: 0 0 auto;
  height: auto;
  padding: 0 0.7rem;
  border: 1px solid var(--up-borda);
  background-color: #fff;
  color: var(--up-texto);
}

.campo-arquivo .botao-selecionar:hover,
.campo-arquivo .botao-selecionar:focus-visible {
  background-color: var(--up-cinza-frio);
}

.dialogo-modelo .campo-ajuda {
  margin: 0;
  font-size: 10.5px;
  color: var(--up-texto-suave);
}

.dialogo-modelo .campo-ajuda[hidden] {
  display: none;
}

/* grupos de caixas de marcar (tipos de pedido, filiais): fieldset sem a
   moldura do navegador, legenda no lugar do rotulo. NAO leva `.campo` de
   proposito: o `.campo input` estica todo input a 100% e as caixas viravam
   colunas com o texto espremido ao lado. */
.grupo-marcar {
  grid-column: span 12;
  margin: 0;
  padding: 0;
  border: 0;
  min-width: 0;
}

/* mesma aparencia do rotulo de campo do formulario (.campo label, 10.5px) */
.grupo-marcar legend {
  float: left;
  width: 100%;
  margin: 0 0 0.2rem;
  padding: 0;
  font-size: 10.5px;
  font-weight: 600;
  line-height: 1.25;
  color: var(--up-texto-suave);
}

.grupo-marcar legend + * {
  clear: left;
}

.lista-marcar {
  display: flex;
  flex-direction: column;
  gap: 0.1rem;
}

.lista-marcar-linha {
  flex-direction: row;
  flex-wrap: wrap;
  gap: 0.2rem 1.25rem;
}

/* filiais: lista rolavel de altura contida -- base com muitas lojas nao
   empurra o GRAVAR para fora da janela */
.lista-filiais {
  max-height: 9.5rem;
  margin-top: 0.3rem;
  padding: 0.3rem 0.5rem;
  overflow-y: auto;
  border: 1px solid var(--up-borda);
  border-radius: 3px;
}

.lista-filiais.desativada {
  background-color: var(--up-cinza-frio);
  opacity: 0.6;
}

.opcao-marcar {
  display: inline-flex;
  align-items: center;
  gap: 0.4rem;
  font-size: 11.5px;
  font-weight: 400;
  cursor: pointer;
}

.opcao-marcar small {
  color: var(--up-texto-suave);
}

.opcao-todas {
  font-weight: 600;
}

.codigo-filial {
  min-width: 1.1rem;
  color: var(--up-texto-suave);
}

@media (max-width: 767.98px) {
  .dialogo-modelo .campo {
    grid-column: span 12;
  }
}

/* Painel Admin > Campos obrigatorios: as abas (Cliente, Vendedor...) ficam
   entre o seletor de filial e o rodape; a aba ativa vira coluna flex para a
   grade dela rolar por dentro, como as demais secoes do painel. */
/* Filial e barra de abas mantem a altura: numa coluna flex com min-height 0
   eles encolheriam para dar lugar a grade, cortando o texto das abas (a barra
   tem overflow-x:auto, entao nao se defende sozinha). */
#formCamposObrigatorios > .bloco-campos,
#formCamposObrigatorios > .abas-internas {
  flex-shrink: 0;
}

#formCamposObrigatorios > .painel-aba.ativa {
  flex: 1 1 auto;
  display: flex;
  flex-direction: column;
  min-height: 0;
}

/* A lista e so rotulo + secao + uma marca: esticada na largura toda, a coluna
   "Campo" abria um vao enorme ate a secao. A grade (e a moldura dela) ocupa so
   o que o conteudo pede; as larguras minimas deixam as cinco abas alinhadas. */
#formCamposObrigatorios .grade-envolucro {
  align-self: flex-start;
  max-width: 100%;
}

#formCamposObrigatorios .grade-planilha {
  width: auto;
}

#formCamposObrigatorios .grade-planilha .coluna-campo {
  min-width: 22rem;
}

#formCamposObrigatorios .grade-planilha .coluna-secao {
  min-width: 11rem;
}

.grade-planilha .nota-campo {
  color: var(--up-cinza-chumbo);
  font-size: 11px;
}

/* Com a rolagem por dentro, o cabecalho sairia de vista na primeira rolada.
   Escopado no modificador porque so faz sentido em quem rola por dentro; nas
   demais grades o sticky nao teria efeito.
   (O comentario antigo citava a grade de itens do Pedido como exemplo de grade
   que NAO rola por dentro -- isso era o sintoma de um bug, nao a intencao: o
   `> *` do `#cartaoItens` travava o encolhimento do envolucro. Corrigido junto
   com esta nota; a grade do Pedido rola por dentro e usa este cabecalho fixo.) */
.grade-envolucro.rolagem-interna .grade-planilha th {
  position: sticky;
  top: 0;
  /* acima do <select>/checkbox das linhas, que criam contexto de empilhamento */
  z-index: 2;
}

.admin-cabecalho {
  margin-bottom: 1.1rem;
  padding-bottom: 0.7rem;
  border-bottom: 1px solid var(--up-borda-suave);
}

.admin-titulo {
  margin: 0;
  font-size: 17px;
  font-weight: 700;
  color: var(--up-texto);
}

.admin-apoio {
  margin: 0.15rem 0 0;
  font-size: 12px;
  color: var(--up-texto-suave);
}

.admin-apoio:empty {
  display: none;
}

@media (max-width: 767px) {
  .painel-admin {
    grid-template-columns: minmax(0, 1fr);
    gap: 0;
  }

  .admin-menu {
    border-right: 0;
    border-bottom: 1px solid var(--up-borda-suave);
  }

  .admin-menu-lista {
    display: flex;
    flex-wrap: wrap;
    gap: 0.25rem;
  }

  .admin-conteudo {
    padding: 1.25rem 1.5rem 0;
  }
}

/* --- Chave liga/desliga (toggle switch) ----------------------------------- */

.bloco-preferencia {
  align-items: start;
}

/* Regras em colunas de 3: enche a coluna de cima para baixo e so entao abre a
   proxima. A 4a regra comeca a 2a coluna ao lado da 1a, e as primeiras nao
   mudam de lugar quando entra uma regra nova. No celular, uma coluna so. */
@media (min-width: 768px) {
  .bloco-preferencia.em-colunas {
    grid-template-columns: repeat(3, minmax(0, 1fr));
    grid-template-rows: repeat(3, auto);
    grid-auto-flow: column;
  }

  .bloco-preferencia.em-colunas > .campo {
    grid-column: auto;
  }
}

.chave-liga {
  display: flex;
  align-items: flex-start;
  gap: 0.7rem;
  font-size: 12.5px;
  color: var(--up-texto);
  /* ancora o <input> escondido abaixo, que e position:absolute -- ver a nota
     em .grade-envolucro sobre a rolagem fantasma do documento */
  position: relative;
}

/* O <input> real continua no DOM (acessibilidade, teclado, :focus-visible e o
   `checked` que o servidor renderiza); quem aparece e o trilho ao lado. */
.chave-liga-entrada {
  position: absolute;
  width: 1px;
  height: 1px;
  opacity: 0;
  pointer-events: none;
}

.chave-liga-trilho {
  position: relative;
  flex: 0 0 auto;
  width: 34px;
  height: 18px;
  margin-top: 1px;
  border-radius: 999px;
  background-color: #c6ccd2;
  transition: background-color 0.18s ease;
}

.chave-liga-trilho::after {
  content: "";
  position: absolute;
  top: 2px;
  left: 2px;
  width: 14px;
  height: 14px;
  border-radius: 50%;
  background-color: #fff;
  box-shadow: 0 1px 2px rgba(0, 0, 0, 0.25);
  transition: transform 0.18s ease;
}

.chave-liga-entrada:checked + .chave-liga-trilho {
  background-color: var(--up-azul-royal);
}

.chave-liga-entrada:checked + .chave-liga-trilho::after {
  transform: translateX(16px);
}

.chave-liga-entrada:focus-visible + .chave-liga-trilho {
  outline: 2px solid var(--up-azul-royal);
  outline-offset: 2px;
}

.chave-liga-texto {
  display: block;
  font-weight: 600;
}

/* Coluna "Pautas de preco" da grade de Usuarios (ate 22/09/2026 era a grade
   "Pauta fixa por vendedor", em Vendas). A grade usa a variante
   `.grade-planilha`, definida junto de `.grade` la em cima -- o que sobra de
   especifico daqui e so a largura da celula. Mais estreita que a de
   "Vendedor vinculado" (13rem) porque o que aparece e um resumo curto
   (estrela + nome da favorita + "+2") e a linha ja tem 13 colunas disputando
   largura -- a lista inteira vive no painel `.seletor-pautas`. */
.coluna-pauta {
  width: 10.5rem;
}

/* ==========================================================================
   Painel Admin > Atualizacao do Sistema
   ========================================================================== */

.zona-envio-bloco {
  margin-bottom: 1.6rem;
}

.zona-envio {
  display: flex;
  flex-direction: column;
  align-items: center;
  text-align: center;
  gap: 0.35rem;
  padding: 2.25rem 1.5rem;
  border: 1.5px dashed var(--up-borda);
  border-radius: 6px;
  background-color: var(--up-cinza-frio);
  transition: border-color 0.15s, background-color 0.15s;
}

.zona-envio.arrastando {
  border-color: var(--up-azul-royal);
  background-color: #eaf3fb;
}

.zona-envio-icone {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 2.6rem;
  height: 2.6rem;
  margin-bottom: 0.3rem;
  border-radius: 50%;
  background-color: #dceefb;
  color: var(--up-azul-royal);
}

.zona-envio-titulo {
  margin: 0;
  font-weight: 700;
  color: var(--up-texto);
}

.zona-envio-apoio {
  margin: 0;
  font-size: 12px;
  color: var(--up-texto-suave);
}

.zona-envio-link {
  border: 0;
  background: none;
  padding: 0;
  color: var(--up-azul-royal);
  font-weight: 700;
  text-decoration: underline;
}

.zona-envio-arquivo {
  display: flex;
  align-items: center;
  gap: 0.5rem;
  margin-top: 0.6rem;
  padding: 0.5rem 0.75rem;
  border: 1px solid var(--up-borda-suave);
  border-radius: 4px;
  background-color: #fff;
  font-size: 13px;
  color: var(--up-texto);
}

.zona-envio-arquivo span {
  flex: 1 1 auto;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.zona-envio-remover {
  border: 0;
  background: none;
  padding: 0 0.2rem;
  font-size: 16px;
  line-height: 1;
  color: var(--up-texto-suave);
}

.zona-envio-remover:hover {
  color: var(--up-primaria);
}

/* ==========================================================================
   Fiscal > Notas de saida > Importar XML (fiscal/importar_xml.html)
   Reaproveita a .grade, a .busca com sugestoes e o rodape de formulario; aqui
   so o que e da tela. A zona de envio acima NAO e mais usada por ela -- ficou
   para o Painel Admin > Atualizacao do Sistema, que e quem a estreou.
   ========================================================================== */

/* Uma linha so acima da grade: o que o lote tem (esquerda, negrito) e como
   mexer nele (direita, cinza). `wrap` para a dica cair para baixo, e nao ser
   espremida, em janela estreita. */
.importacao-faixa {
  display: flex;
  flex-wrap: wrap;
  align-items: baseline;
  justify-content: space-between;
  gap: 0.35rem 1.5rem;
  margin-bottom: 0.5rem;
}

.importacao-resumo {
  margin: 0;
  font-size: 12.5px;
  font-weight: 700;
  color: var(--up-texto);
}

.importacao-apoio {
  margin: 0;
  font-size: 12px;
  color: var(--up-texto-suave);
}

/* --- A lista e a tela -----------------------------------------------------
   Era uma lista de altura fixa (16.5rem) com os itens da nota clicada num
   BLOCO SEPARADO embaixo. Esse bloco mudava de tamanho a cada nota -- uma com
   2 itens, a seguinte com 30 -- e a tela chacoalhava a cada clique.

   Agora a nota abre na PROPRIA LINHA (accordion) e a lista ocupa o card do
   topo ao rodape, rolando por dentro: o que esta em volta nao se mexe, so o
   conteudo da lista. A cadeia de altura e a mesma da aba Itens do Pedido
   (.painel-documento em flex -> bloco -> grade).

   A zona de arrastar arquivos que ficava em cima saiu: era um terco da tela
   parado, para uma acao feita uma vez por lote. Quem abre os XMLs agora e o
   botao do rodape (ver o comentario do template). */

/* faixa de resumo e rodape ficam com a altura deles; so a grade cede */
#importacaoXml > * {
  flex-shrink: 0;
}

.importacao-bloco-notas {
  display: flex;
  flex-direction: column;
}

#importacaoXml > .importacao-bloco-notas {
  flex: 1 1 auto;
  min-height: 0;
}

#importacaoXml .rodape-documento .footer-start {
  gap: 0.5rem;
}

.importacao-notas {
  flex: 1 1 auto;
  overflow-y: auto;
  /* com a janela baixa demais quem rola e o card, como antes: abaixo disto a
     lista viraria uma fresta */
  min-height: 12rem;
}

.importacao-notas:focus-visible {
  outline: 2px solid var(--up-azul-sky);
  outline-offset: 1px;
}

/* z-index 2: acima da linha aberta, que tem fundo proprio */
.importacao-notas > .grade > thead th {
  position: sticky;
  top: 0;
  z-index: 2;
}

.importacao-notas .importacao-linha {
  cursor: pointer;
}

/* --- Colunas da lista das notas --------------------------------------------
   Numero, Valor e Itens usavam `.num` (alinhado a direita, padrao da casa).
   Com o layout automatico, a sobra da tabela caia nessas colunas e o valor ia
   parar a um palmo do proprio titulo -- o mesmo defeito ja corrigido na tabela
   dos itens. Agora toda coluna curta e `.encolher` (largura do conteudo) e o
   conteudo fica a ESQUERDA, comecando embaixo do rotulo; a sobra vai para
   Cliente e Observacao, que sao as colunas de texto. */
.importacao-grade td.importacao-col-sequencia {
  /* "3 de 45": a posicao do XML no lote. Discreta, como o numero do item da
     tabela de itens -- e referencia de conferencia, nao dado da nota. */
  color: var(--up-texto-suave);
  font-variant-numeric: tabular-nums;
}

/* --- A linha que expande ---------------------------------------------------
   A seta e o unico enfeite novo: fechada aponta para baixo, aberta gira para
   cima, como nas arvores do proprio ERP. */
.grade .importacao-col-seta {
  width: 1.9rem;
  padding-inline: 0.4rem;
  text-align: center;
}

.importacao-seta {
  display: inline-flex;
  color: var(--up-texto-suave);
  transition: transform 0.15s;
}

.importacao-linha.aberta .importacao-seta {
  transform: rotate(180deg);
  color: var(--up-azul-royal);
}

@media (prefers-reduced-motion: reduce) {
  .importacao-seta {
    transition: none;
  }
}

/* A linha da nota aberta continua realcada (a classe .selecionada, azul de
   .grade.selecionavel) e ganha peso: com os itens abertos embaixo, e ela que
   diz de qual nota sao. */
.importacao-linha.aberta td {
  font-weight: 700;
}

/* a linha do detalhe nao e clicavel nem realca no hover: ela nao e uma nota */
.importacao-detalhe td {
  padding: 0;
  border-bottom: 1px solid var(--up-borda);
  white-space: normal;
}

.grade tbody tr.importacao-detalhe:hover td {
  background-color: transparent;
}

/* fundo cinza e faixa azul a esquerda amarram os itens a nota de cima */
.importacao-detalhe-caixa {
  padding: 0.75rem 0.9rem 0.9rem;
  border-left: 3px solid var(--up-azul-sky);
  background-color: var(--up-cinza-frio);
}

.importacao-detalhe-titulo {
  margin: 0 0 0.35rem;
  font-size: 12.5px;
  font-weight: 700;
  color: var(--up-azul-sky);
}

.importacao-detalhe .importacao-apoio {
  margin-bottom: 0.5rem;
}

.importacao-itens-acoes {
  display: flex;
  align-items: center;
  justify-content: flex-end;
  gap: 1rem;
  margin-top: 0.6rem;
}

/* dentro do detalhe a grade dos itens rola SO na horizontal: a altura e dada
   pelos itens, e quem rola na vertical e a lista de notas */
.importacao-associacao {
  overflow-x: auto;
  overflow-y: visible;
}

/* A lista de sugestoes do produto em `position: fixed`, com a posicao vinda do
   JS (posicionarOpcoes): dentro de uma area que rola por dentro, uma lista em
   `absolute` seria cortada na borda dela. Mesma solucao da lista de opcoes dos
   <select> (.lista-selecao). */
.importacao-detalhe .busca-resultados {
  position: fixed;
  top: auto;
  left: auto;
  right: auto;
  margin: 0;
  box-sizing: border-box;
}

/* --- A grade dos itens da nota aberta --------------------------------------
   Colunas: Item | Codigo no XML | Descricao | Un. | Quantidade | Valor |
   Produto no sistema.

   As larguras e o filete entre as colunas nao sao enfeite. Com o layout
   automatico e sem borda, "Item" (alinhado a direita) encostava em "Codigo no
   XML" (alinhado a esquerda) e os dois liam-se como um numero so: item 1 +
   codigo 0256 viravam "10256". O mesmo acontecia entre o valor e o nome do
   produto. O filete e a mesma ideia da planilha de itens do Pedido
   (.grade-planilha), sem a densidade dela: aqui cada linha hospeda um campo de
   busca e e lida com calma, entao a linha e ALTA, nao apertada. */
.importacao-itens th,
.importacao-itens td {
  border-right: 1px solid var(--up-borda-suave);
  vertical-align: middle;
}

/* no cabecalho o filete acompanha a borda de baixo, que e mais forte */
.importacao-itens th {
  border-right-color: var(--up-borda);
}

/* a ultima coluna encosta na moldura do envolucro: borda ali viraria dupla */
.importacao-itens th:last-child,
.importacao-itens td:last-child {
  border-right: 0;
}

/* `height` numa celula de tabela vale como altura MINIMA do conteudo: e o que
   mantem a linha do item com campo de busca e a do produto ja vinculado do
   mesmo tamanho -- sem isso a grade ficava com degraus de 5px, linha sim,
   linha nao. Cuidado ao mexer: a celula e content-box, entao os 0.4rem de
   padding entram POR FORA (1.9 + 0.8rem = uma linha de ~44px). */
.importacao-itens td {
  height: 1.9rem;
  padding: 0.4rem 0.7rem;
}

/* numero do item: do tamanho do conteudo e centralizado, como a coluna de
   indice da planilha do Pedido */
.importacao-itens .indice {
  width: 1px;
  text-align: center;
  color: var(--up-texto-suave);
}

.importacao-itens .importacao-col-codigo {
  width: 9rem;
}

.importacao-itens .importacao-col-un {
  width: 4rem;
  text-align: center;
}

/* largura fixa nas duas colunas numericas: sem ela o layout automatico dava a
   elas a sobra da tabela e o numero ia parar longe do proprio cabecalho. O
   conteudo fica a esquerda, embaixo do rotulo, como na lista das notas. */
.importacao-itens .importacao-col-numero {
  width: 8rem;
}

.grade .importacao-col-produto {
  min-width: 22rem;
  white-space: normal;
}

.importacao-busca {
  width: 100%;
  /* mesma altura das outras celulas da linha: o campo nao aperta a linha nem
     sobra por fora dela */
  padding: 4px 8px;
  border: 1px solid var(--up-borda);
  border-radius: 3px;
  font-size: 12.5px;
}

.importacao-busca:focus {
  outline: none;
  border-color: var(--up-azul-royal);
}

.importacao-produto-fixo {
  font-weight: 700;
  color: var(--up-texto);
}

.importacao-dica {
  font-size: 11px;
  color: var(--up-texto-suave);
}

/* Era um "x" cinza, sem borda e sem cursor de mao: o operador que associou o
   produto errado nao via que dali dava para trocar e achava que a tela tinha
   travado. Virou botao com a palavra Trocar -- pequeno, para nao competir com
   o nome do produto, mas com cara de botao. */
.importacao-trocar {
  display: inline-flex;
  align-items: center;
  gap: 0.25rem;
  margin-left: 0.4rem;
  padding: 1px 0.45rem;
  border: 1px solid var(--up-borda);
  border-radius: 3px;
  background-color: #fff;
  font-size: 11px;
  line-height: 1.6;
  color: var(--up-texto-suave);
  cursor: pointer;
}

.importacao-trocar:hover {
  border-color: var(--up-primaria);
  color: var(--up-primaria);
}

.importacao-trocar:focus-visible {
  outline: 2px solid var(--up-azul-sky);
  outline-offset: 1px;
}

.grade .importacao-texto {
  max-width: 22rem;
  overflow: hidden;
  text-overflow: ellipsis;
}

.grade .importacao-motivo {
  min-width: 16rem;
  white-space: normal;
  color: var(--up-texto-suave);
}

/* 23/09/2026: a secao virou DUAS COLUNAS -- adicionar a build a esquerda,
   builds enviadas a direita, uma por linha, com Atualizar e Remover. Antes
   era uma coluna so: envio em cima (que ja instalava, "Atualizar agora"),
   campo de anotacao, e o historico embaixo em cartoes com "Instalar" e o
   link "Excluir". A anotacao saiu da tela por ora (o servidor continua
   aceitando). A esquerda tem largura propria para a zona de arrastar nao
   esticar numa faixa larga e vazia; abaixo de 992px as colunas empilham. */
.atualizar-colunas {
  display: grid;
  grid-template-columns: minmax(16rem, 21rem) minmax(0, 1fr);
  gap: 1.5rem;
  align-items: start;
}

@media (max-width: 991.98px) {
  .atualizar-colunas {
    grid-template-columns: minmax(0, 1fr);
  }
}

/* o respiro entre os pedacos vem do gap; a margem de baixo da
   .zona-envio-bloco (e a de cima do arquivo escolhido) sobraria dobrada */
.atualizar-envio {
  display: flex;
  flex-direction: column;
  gap: 0.75rem;
  margin-bottom: 0;
}

/* Titulo das duas colunas na mesma linha: a altura do botao de recarregar
   (26px, a direita) vale para as duas, e o espaco ate o conteudo e o mesmo
   gap da coluna da esquerda. */
.atualizar-colunas .bloco-modelos-topo {
  min-height: 26px;
  margin-bottom: 0;
}

.atualizar-colunas .bloco-titulo {
  margin-bottom: 0;
}

.atualizar-builds .bloco-modelos-topo {
  margin-bottom: 0.75rem;
}

.atualizar-envio .zona-envio {
  padding: 1.75rem 1rem;
}

.atualizar-envio .zona-envio-arquivo {
  margin-top: 0;
}

.atualizar-adicionar {
  justify-content: center;
  width: 100%;
}

.zona-envio-aviso {
  margin: 0;
  font-size: 12px;
  color: var(--up-texto-suave);
}

.zona-envio-aviso strong {
  color: var(--up-texto);
}

.bloco-builds {
  margin-bottom: 1.6rem;
}

/* Lista de builds: a grade densa do painel (.grade-planilha), com layout fixo
   para o nome comprido cortar com reticencias -- o `title` mostra inteiro. */
#gradeBuilds {
  width: 100%;
  table-layout: fixed;
}

#gradeBuilds .col-enviada { width: 9.5rem; }
#gradeBuilds .col-botao { width: 4.8rem; }

#gradeBuilds td {
  padding-top: 4px;
  padding-bottom: 4px;
  vertical-align: middle;
  overflow: hidden;
  white-space: nowrap;
  text-overflow: ellipsis;
}

#gradeBuilds .build-nome {
  font-weight: 700;
}

#gradeBuilds tr.build-atual .build-nome {
  color: var(--up-azul-royal);
}

#gradeBuilds .etiqueta-status {
  margin-left: 0.35rem;
}

/* Poucas linhas e acao que reinicia o sistema: botao um pouco maior que os
   18px da grade densa, para nao errar o clique. */
#gradeBuilds .botao-icone-item {
  width: 22px;
  height: 22px;
}

/* Atualizar (instalar) a build da linha: cor da marca, e a acao principal da
   lista. A lixeira ao lado e a .botao-excluir-item de sempre. */
.botao-instalar-item {
  border-color: var(--up-primaria-escuro);
  background-color: var(--up-primaria);
  color: #fff;
}

.botao-instalar-item:hover:not(:disabled),
.botao-instalar-item:focus-visible:not(:disabled) {
  background-color: var(--up-primaria-escuro);
}

.botao-icone-item:disabled {
  cursor: not-allowed;
}

/* ==========================================================================
   Painel de Vendas (painel/vendas.html + js/painel_vendas.js)

   Cores com papel fixo, NUNCA pela posicao: Pedido e sempre azul e Orcamento
   sempre laranja, em cartao, chave e grafico. Sao os slots 1 e 2 da paleta de
   referencia de dataviz, validados como par adjacente para daltonismo. Texto
   nunca usa a cor da serie -- a identidade vem da "chave" colorida ao lado.
   Grade e eixos em linha fina e solida, um tom acima do fundo.
   ========================================================================== */

.painel.painel-vendas {
  --pv-pedido: #2a78d6;
  --pv-orcamento: #eb6834;
  --pv-superficie: #ffffff;
  --pv-plano: #f6f7f8;
  --pv-tinta: #1f2328;
  --pv-tinta-2: #52514e;
  --pv-tinta-3: #898781;
  --pv-grade: #e6e7e3;
  --pv-borda: rgba(11, 11, 11, 0.09);
  display: flex;
  flex-direction: column;
  padding: 0.75rem 1rem;
  background-color: var(--pv-plano);
}

/* Tela unica: o painel ocupa exatamente a altura disponivel e os dois blocos
   dividem o que sobra depois dos filtros. Os graficos encolhem junto -- nada
   de rolagem em tela de desktop. So em tela baixa demais (ou celular) os
   blocos ganham altura minima e a rolagem volta, para nao esmagar o grafico. */
.pv {
  flex: 1 1 auto;
  display: flex;
  flex-direction: column;
  gap: 0.5rem;
  width: 100%;
  color: var(--pv-tinta);
}

.pv-topo {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  justify-content: space-between;
  gap: 0.5rem 1rem;
}

.pv-titulo {
  margin: 0;
  font-size: 1.15rem;
  font-weight: 700;
  line-height: 1.2;
  color: var(--up-marca-escura);
}

.pv-apoio {
  margin: 0;
  font-size: 12px;
  color: var(--pv-tinta-2);
}

/* --- Filtros ---------------------------------------------------------------- */

.pv-filtros {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 0.5rem 0.75rem;
}

.pv-periodos {
  display: inline-flex;
  padding: 2px;
  border: 1px solid var(--pv-borda);
  border-radius: 8px;
  background-color: var(--pv-superficie);
}

.pv-periodo {
  padding: 3px 10px;
  border: 0;
  border-radius: 6px;
  background: none;
  font-size: 12px;
  font-weight: 600;
  color: var(--pv-tinta-2);
}

.pv-periodo:hover {
  background-color: var(--pv-plano);
}

.pv-periodo.ativo {
  background-color: var(--up-azul-royal);
  color: #fff;
}

.pv-datas {
  display: inline-flex;
  align-items: center;
  gap: 0.4rem;
  font-size: 12px;
  color: var(--pv-tinta-2);
}

.pv-datas input,
.pv-vendedor select {
  height: 28px;
  padding: 0 8px;
  border: 1px solid var(--pv-borda);
  border-radius: 6px;
  background-color: var(--pv-superficie);
  font-family: var(--up-fonte);
  font-size: 12px;
  color: var(--pv-tinta);
}

.pv-vendedor select {
  min-width: 13rem;
  max-width: 100%;
}

.pv-situacoes {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 0.35rem;
}

.pv-situacoes:empty {
  display: none;
}

.pv-situacoes-rotulo {
  margin-right: 0.2rem;
  font-size: 12px;
  font-weight: 600;
  color: var(--pv-tinta-2);
}

.pv-chip {
  display: inline-flex;
  align-items: center;
  gap: 0.35rem;
  padding: 1px 9px;
  border: 1px solid var(--pv-borda);
  border-radius: 999px;
  background-color: var(--pv-superficie);
  font-size: 11.5px;
  color: var(--pv-tinta-3);
  user-select: none;
}

.pv-chip input {
  margin: 0;
  accent-color: var(--up-azul-royal);
}

.pv-chip.marcado {
  border-color: rgba(0, 80, 160, 0.35);
  background-color: #eef4fb;
  color: var(--pv-tinta);
}

.pv-chip-qtd {
  font-variant-numeric: tabular-nums;
  color: var(--pv-tinta-3);
}

.pv-erro {
  margin: 0;
  padding: 0.4rem 0.75rem;
  border-left: 4px solid #d70a23;
  border-radius: 4px;
  background-color: #fdf2f2;
  font-size: 13px;
}

.pv-erro[hidden] {
  display: none;
}

/* --- Blocos Pedido / Orcamento ---------------------------------------------- */

.pv-blocos {
  flex: 1 1 auto;
  display: flex;
  flex-direction: column;
  gap: 0.5rem;
  transition: opacity 0.15s;
}

/* recarregando: mantem o desenho anterior esmaecido, sem piscar nem pular */
.pv-blocos.carregando {
  opacity: 0.5;
  pointer-events: none;
}

.pv-bloco {
  flex: 1 1 0;
  display: flex;
  flex-direction: column;
  min-height: 210px;
  padding: 0.5rem 0.75rem 0.4rem;
  border: 1px solid var(--pv-borda);
  border-top: 3px solid var(--pv-cor);
  border-radius: 8px;
  background-color: var(--pv-superficie);
}

.pv-pedidos { --pv-cor: var(--pv-pedido); }
.pv-orcamentos { --pv-cor: var(--pv-orcamento); }

.pv-bloco-cabecalho {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  justify-content: space-between;
  gap: 0.25rem 1rem;
  margin-bottom: 0.25rem;
}

.pv-bloco-titulo {
  display: flex;
  align-items: center;
  gap: 0.45rem;
  margin: 0;
  font-size: 14px;
  font-weight: 700;
  color: var(--pv-tinta);
}

.pv-bloco-sub {
  font-weight: 600;
  color: var(--pv-tinta-3);
}

.pv-chave {
  width: 10px;
  height: 10px;
  border-radius: 3px;
  background-color: var(--pv-cor);
}

/* totais do periodo: uma linha no cabecalho do bloco, nao cartoes soltos */
.pv-kpis {
  display: flex;
  flex-wrap: wrap;
  gap: 0.25rem 1.5rem;
  margin: 0;
}

.pv-kpi {
  display: flex;
  align-items: baseline;
  gap: 0.4rem;
}

.pv-kpi dt {
  font-size: 11.5px;
  font-weight: 600;
  color: var(--pv-tinta-3);
}

.pv-kpi dd {
  margin: 0;
  font-size: 15px;
  font-weight: 700;
  color: var(--pv-tinta);
  font-variant-numeric: tabular-nums;
}

.pv-graficos {
  flex: 1 1 0;
  display: grid;
  grid-template-columns: minmax(0, 2.2fr) minmax(0, 1fr);
  gap: 0.75rem;
  min-height: 0;
}

.pv-blocos.sem-ranking .pv-graficos {
  grid-template-columns: minmax(0, 1fr);
}

.pv-cartao {
  display: flex;
  flex-direction: column;
  min-width: 0;
  min-height: 0;
  margin: 0;
}

.pv-cartao + .pv-cartao {
  padding-left: 0.75rem;
  border-left: 1px solid var(--pv-grade);
}

.pv-cartao-cabecalho {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 0.5rem;
  margin-bottom: 0.15rem;
}

.pv-cartao-titulo {
  font-size: 12px;
  font-weight: 600;
  color: var(--pv-tinta-2);
}

.pv-alternar-tabela {
  padding: 0 8px;
  border: 1px solid var(--pv-borda);
  border-radius: 6px;
  background: none;
  font-size: 11px;
  font-weight: 600;
  color: var(--pv-tinta-2);
}

.pv-alternar-tabela[aria-pressed="true"] {
  background-color: var(--pv-plano);
  color: var(--pv-tinta);
}

/* o grafico preenche o cartao; o Chart.js redimensiona junto com a janela */
.pv-tela {
  position: relative;
  flex: 1 1 0;
  min-height: 0;
}

/* canvas fora do fluxo: o tamanho dele nao segura a altura do bloco quando a
   janela diminui (o Chart.js mede o pai e redesenha) */
.pv-tela canvas {
  position: absolute;
  inset: 0;
}

.pv-tela[hidden],
.pv-sem-dados[hidden],
.pv-tabela[hidden],
.pv-alternar-tabela[hidden] {
  display: none;
}

.pv-sem-dados {
  flex: 1 1 auto;
  display: flex;
  align-items: center;
  justify-content: center;
  margin: 0;
  font-size: 13px;
  color: var(--pv-tinta-3);
}

.pv-tabela {
  flex: 1 1 0;
  min-height: 0;
  overflow: auto;
}

.pv-tabela table {
  width: 100%;
  border-collapse: collapse;
  font-size: 12px;
}

.pv-tabela th,
.pv-tabela td {
  padding: 3px 8px;
  border-bottom: 1px solid var(--pv-grade);
  text-align: left;
}

.pv-tabela th {
  position: sticky;
  top: 0;
  background-color: var(--pv-superficie);
  font-weight: 700;
  color: var(--pv-tinta-2);
}

.pv-tabela .num {
  text-align: right;
  font-variant-numeric: tabular-nums;
}

@media (max-width: 900px) {
  .pv-graficos {
    grid-template-columns: minmax(0, 1fr);
  }

  .pv-bloco {
    flex: 0 0 auto;
  }

  .pv-tela {
    flex: 0 0 auto;
    height: 240px;
  }

  .pv-cartao + .pv-cartao {
    padding: 0.5rem 0 0;
    border-left: 0;
    border-top: 1px solid var(--pv-grade);
  }
}

/* --- Sem vendedor vinculado ------------------------------------------------- */

.pv-vazio {
  max-width: 34rem;
  margin: 3rem auto;
  padding: 2rem;
  border: 1px solid var(--pv-borda);
  border-radius: 12px;
  background-color: var(--pv-superficie);
  text-align: center;
}

.pv-vazio-icone {
  display: inline-flex;
  padding: 0.75rem;
  border-radius: 999px;
  background-color: #eef4fb;
  color: var(--up-azul-royal);
}

.pv-vazio h2 {
  margin: 0.75rem 0 0.5rem;
  font-size: 1.1rem;
  font-weight: 700;
}

.pv-vazio p {
  margin: 0;
  font-size: 13px;
  color: var(--pv-tinta-2);
}

/* ==========================================================================
   Sistema base (Uniplus): funcao bloqueada por configuracao feita LA
   (core/sistema_base.py + js/sistema_base.js). Azul e discreto, de proposito:
   nao e erro do operador, e um ajuste de configuracao.
   ========================================================================== */

/* Controle travado: o <span> recebe mouse/clique/Tab no lugar do botao
   desabilitado (que nao recebe nenhum dos tres) */
.bloqueio-base {
  display: inline-flex;
  cursor: help;
  border-radius: 4px;
}

.bloqueio-base > :disabled {
  pointer-events: none;
}

.bloqueio-base:focus-visible {
  outline: 2px solid var(--up-azul-sky);
  outline-offset: 1px;
}

/* lapis de editar cliente travado, ao lado da lupa: mesmo filete e cantos */
.campo-com-lupa .bloqueio-base .botao-lupa {
  height: 100%;
  border-left: 1px solid rgba(255, 255, 255, 0.45);
}

.balao-sistema-base {
  position: fixed;
  z-index: 2000;
  max-width: 21rem;
  padding: 0.5rem 0.7rem 0.55rem;
  border: 1px solid #c9dcf0;
  border-left: 3px solid #2f6fb3;
  border-radius: 4px;
  background-color: #f5f9fd;
  box-shadow: 0 6px 16px rgba(0, 6, 12, 0.14);
  font-family: var(--up-fonte);
  animation: balao-sistema-base 0.12s ease-out;
}

.balao-sistema-base[hidden] {
  display: none;
}

.balao-sistema-base p {
  margin: 0;
}

.balao-sistema-base-titulo {
  display: flex;
  align-items: center;
  gap: 0.35rem;
  font-size: 10.5px;
  font-weight: 700;
  letter-spacing: 0.03em;
  text-transform: uppercase;
  color: #2f6fb3;
}

.balao-sistema-base-texto {
  margin-top: 0.25rem !important;
  font-size: 12px;
  line-height: 1.4;
  color: var(--up-texto);
}

.balao-sistema-base-caminho {
  margin-top: 0.35rem !important;
  font-size: 11px;
  line-height: 1.35;
  color: var(--up-texto-suave);
}

.balao-sistema-base-caminho span::after {
  content: ": ";
}

.balao-sistema-base-caminho strong {
  font-weight: 600;
  color: #2f6fb3;
}

.balao-sistema-base-caminho[hidden] {
  display: none;
}

@keyframes balao-sistema-base {
  from { opacity: 0; transform: translateY(-3px); }
  to { opacity: 1; transform: translateY(0); }
}

/* Recusa vinda do servidor por configuracao do sistema base: o mesmo dialogo
   de recusa, trocado para o tom de aviso -- azul, sem o balanco do "nao",
   com "O que ajustar" e a linha "Onde ajustar". */
.dialogo-recusa.aviso-sistema-base[open] {
  animation: up-sucesso-entrada 0.28s cubic-bezier(0.2, 0.9, 0.3, 1.25);
}

.aviso-sistema-base .recusa-circulo,
.aviso-sistema-base .recusa-sinal {
  stroke: #2f6fb3;
}

.aviso-sistema-base .recusa-ponto {
  fill: #2f6fb3;
}

.aviso-sistema-base .sucesso-titulo {
  font-size: 1.15rem;
}

.aviso-sistema-base .recusa-motivo {
  border-left-color: #2f6fb3;
  background-color: #eef5fc;
}

.aviso-sistema-base .recusa-motivo-rotulo {
  color: #2f6fb3;
}

.aviso-sistema-base .recusa-motivo p {
  font-weight: 500;
}

.recusa-caminho {
  margin: 0.45rem 0 0 !important;
  font-size: 12px !important;
  font-weight: 400 !important;
  color: var(--up-texto-suave) !important;
}

.recusa-caminho strong {
  font-weight: 600;
  color: #2f6fb3;
}

.recusa-caminho[hidden] {
  display: none;
}

/* --- Fiscal > Nota fiscal de saida (Visualizar) ----------------------------
   Copia da tela do Uniplus: oito abas espalhadas na largura toda, grade de 24
   colunas (as larguras do Uniplus nao cabem nas 12 da casa -- IE, Contribuinte,
   Tipo e Celular tem 1,5 coluna cada) e rodape em duas faixas: credito e totais
   em cima, botoes embaixo. So leitura: todos os campos vem desabilitados. */

.painel-documento #formNotaFiscal {
  display: flex;
  flex-direction: column;
  flex: 1 0 auto;
}

#formNotaFiscal > .abas-internas {
  flex-shrink: 0;
  margin-bottom: 0.6rem;
}

#formNotaFiscal .aba-interna {
  flex: 1 1 0;
  padding: 0.45rem 0.6rem;
  font-size: 13px;
}

/* Espaco entre colunas SEM `column-gap`: com 24 colunas, 23 vaos fixos de
   ~17px somam ~400px, mais que a largura de um cartao estreito (os 4 do
   Subtotal) -- os campos vazavam para fora a 100% de zoom. O respiro vira
   recuo lateral de cada `.campo` (meio vao de cada lado), e a grade, que so
   tem trilhas `minmax(0, 1fr)`, encolhe com o cartao em qualquer largura.
   A margem negativa na grade devolve o alinhamento das bordas. */
#formNotaFiscal .bloco-campos {
  grid-template-columns: repeat(24, minmax(0, 1fr));
  gap: 0.5rem 0;
  padding: 0.9rem 0.55rem 1.1rem;
  box-shadow: 0 1px 4px rgba(0, 6, 12, 0.12);
}

#formNotaFiscal .bloco-campos.bloco-sem-moldura {
  margin: 0 -0.55rem;
}

#formNotaFiscal .bloco-campos > .campo {
  padding: 0 0.55rem;
}

#formNotaFiscal .campo {
  gap: 0.05rem;
  grid-column: span 24;
  min-width: 0;
}

@media (min-width: 768px) {
  #formNotaFiscal .nf-2 { grid-column: span 2; }
  #formNotaFiscal .nf-3 { grid-column: span 3; }
  #formNotaFiscal .nf-4 { grid-column: span 4; }
  #formNotaFiscal .nf-6 { grid-column: span 6; }
  #formNotaFiscal .nf-8 { grid-column: span 8; }
  #formNotaFiscal .nf-12 { grid-column: span 12; }
}

/* Medidas do padrao da casa (Cadastros, Pedido/Orcamento): rotulo 10.5px,
   campo com 2px 4px de padding e fonte 11.5px. */
#formNotaFiscal .campo label {
  font-size: 10.5px;
  line-height: 1.25;
}

/* campo de consulta: cinza claro, texto legivel (nao o cinza apagado de um
   campo desabilitado comum -- aqui o valor e a informacao da tela) */
#formNotaFiscal .campo input:not([type="checkbox"]),
#formNotaFiscal .campo select {
  padding: 2px 4px;
  font-size: 11.5px;
  line-height: 1.35;
  border-radius: 3px;
  border-color: var(--up-borda);
  background-color: var(--up-cinza-frio);
  color: var(--up-texto);
  opacity: 1;
}

#formNotaFiscal .campo select:disabled {
  cursor: default;
}

/* Cliente + botao azul de atualizar, separados como no Uniplus */
.nf-cliente-linha {
  display: flex;
  gap: 1.2rem;
}

.botao-nf-cliente {
  flex: 0 0 auto;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 36px;
  border: 1px solid #8fa8e0;
  border-radius: 4px;
  background-color: #a9bdf0;
  color: #fff;
}

/* Icones DENTRO do campo (CEP, calendario, relogio): o grupo leva a moldura e
   o fundo do campo, e o input perde a dele */
.campo-com-icones {
  display: flex;
  align-items: stretch;
  border: 1px solid var(--up-borda);
  border-radius: 3px;
  background-color: var(--up-cinza-frio);
}

#formNotaFiscal .campo-com-icones input {
  border: 0;
  min-width: 0;
  flex: 1 1 auto;
}

.botao-no-campo {
  flex: 0 0 auto;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 24px;
  border: 0;
  border-left: 1px solid var(--up-borda-suave);
  background: none;
  color: var(--up-cinza-chumbo);
}

.botao-nf-cliente:disabled,
.botao-no-campo:disabled {
  cursor: default;
}

/* "Emissao": caixa verde marcada, como no Uniplus. Desenhada a mao
   (appearance: none) porque o navegador pinta de cinza toda caixa desabilitada,
   e aqui ela e so leitura. */
#formNotaFiscal .campo .marca-nf {
  appearance: none;
  width: 21px;
  height: 21px;
  margin: 0.1rem 0 0;
  border: 1px solid var(--up-borda);
  border-radius: 3px;
  background-color: var(--up-cinza-frio);
  opacity: 1;
}

#formNotaFiscal .campo .marca-nf:checked {
  border-color: #7cb342;
  background: #9ccc65 url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23fff' stroke-width='3' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M20 6 9 17l-5-5'/%3E%3C/svg%3E") center / 16px no-repeat;
}

/* --- Rodape da nota -------------------------------------------------------- */

#formNotaFiscal .rodape-nota {
  margin: auto -1.5rem 0;
  bottom: 0;
  flex-direction: column;
  flex-wrap: nowrap;
  align-items: stretch;
  gap: 0.3rem;
  padding: 0.5rem 1.5rem 0.35rem;
}

.rodape-nota-valores {
  display: flex;
  align-items: flex-end;
  justify-content: space-between;
  gap: 1.5rem;
}

.nf-credito,
.nf-totais {
  display: flex;
}

.nf-credito .nf-valor {
  align-items: center;
  min-width: 9rem;
}

.nf-credito .nf-valor + .nf-valor {
  margin-left: 6rem;
}

/* totais encostados na direita, com o filete tracejado entre eles */
.nf-totais .nf-valor {
  align-items: flex-end;
  min-width: 11rem;
  padding: 0 1.2rem;
}

.nf-totais .nf-valor + .nf-valor {
  border-left: 1px dashed var(--up-borda);
}

.nf-totais .nf-valor:last-child {
  padding-right: 0;
}

.nf-valor {
  display: flex;
  flex-direction: column;
}

.nf-valor-rotulo {
  font-size: 12px;
  font-weight: 700;
  color: var(--up-cinza-chumbo);
}

.nf-valor-numero {
  font-size: 17px;
  color: var(--up-azul-escuro);
  white-space: nowrap;
}

.nf-valor-numero.nf-total {
  font-size: 22px;
}

.rodape-nota .acoes-formulario {
  justify-content: flex-end;
  gap: 0.3rem;
}

.rodape-nota .acoes-formulario .botao-acao {
  height: 28px;
  padding: 0 0.85rem;
  gap: 0.5rem;
}

@media (max-width: 991.98px) {
  .rodape-nota-valores {
    flex-direction: column;
    align-items: stretch;
  }

  .nf-credito .nf-valor + .nf-valor {
    margin-left: 2rem;
  }
}

/* --- Nota fiscal (Visualizar) > aba Itens ---------------------------------- */

/* Sub-abas Produtos/Servicos: encostadas na esquerda, a ativa com fundo cinza
   (e nao o sublinhado das abas principais), como no Uniplus */
#formNotaFiscal .sub-abas-nf {
  margin-bottom: 0.4rem;
  border-bottom: 0;
}

#formNotaFiscal .sub-abas-nf .aba-interna {
  flex: 0 0 12.5rem;
  padding: 0.3rem 0.6rem;
  border-bottom: 0;
  color: var(--up-texto);
}

#formNotaFiscal .sub-abas-nf .aba-interna.ativa {
  background-color: #e8e8e8;
  color: var(--up-texto);
}

#formNotaFiscal .sub-abas-nf .aba-interna:disabled {
  color: var(--up-borda);
}

/* cartoes "Incluir item" e "Itens" */
.bloco-nf {
  margin-bottom: 0.6rem;
  padding: 0.7rem 1.1rem 0.6rem;
  border-radius: 4px;
  background-color: #fff;
  box-shadow: 0 1px 4px rgba(0, 6, 12, 0.12);
}

.titulo-bloco-nf {
  margin: 0 0 0.4rem;
  font-size: 15px;
  color: var(--up-azul-sky);
}

#formNotaFiscal .bloco-campos.bloco-sem-moldura {
  padding: 0;
  border: 0;
  box-shadow: none;
}

/* forca o proximo campo para a linha de baixo (CFOP sozinho, como la) */
#formNotaFiscal .nf-quebra {
  grid-column: 1 / -1;
  height: 0;
}

#formNotaFiscal .campo input.texto-direita {
  text-align: right;
}

.nf-produto-linha {
  gap: 1rem;
}

.botao-nf-lupa {
  flex: 0 0 auto;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 30px;
  border: 0;
  border-radius: 3px;
  background-color: #6aa7dc;
  color: #fff;
}

.botao-nf-lupa:disabled {
  cursor: default;
}

.acoes-bloco-nf {
  display: flex;
  flex-wrap: wrap;
  justify-content: flex-end;
  gap: 0.3rem;
  margin-top: 0.6rem;
  padding-top: 0.5rem;
  border-top: 1px solid var(--up-borda-suave);
}

.acoes-bloco-nf .botao-acao {
  height: 28px;
  padding: 0 0.85rem;
  gap: 0.5rem;
  border: 0;
  color: #fff;
  text-transform: uppercase;
}

/* cores dos botoes do Uniplus; travados, ficam no tom claro de la */
.acoes-bloco-nf .botao-acao:disabled {
  opacity: 0.6;
  cursor: default;
}

.botao-nf-ok { background-color: #9ccc65; }
.botao-nf-limpar { background-color: #78909c; }
.botao-nf-alterar { background-color: #26808f; }
.botao-nf-excluir { background-color: #f4743b; }
.botao-nf-kit { background-color: #4a90d9; }
.botao-nf-dimensoes { background-color: #4db6ac; }

/* Grade: larguras fixas do Uniplus (colgroup), rolagem na horizontal */
.grade-itens-nf {
  min-height: 11rem;
  overflow-x: auto;
  overflow-y: auto;
  border: 1px solid var(--up-borda);
}

#gradeNfItens {
  table-layout: fixed;
  width: 1671px;
}

#gradeNfItens th,
#gradeNfItens td {
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

#gradeNfItens th {
  position: sticky;
  top: 0;
  z-index: 1;
  font-weight: 700;
}

.legenda-nf {
  display: flex;
  flex-wrap: wrap;
  gap: 0.3rem 1.2rem;
  margin: 0.2rem 0 0.4rem;
  font-size: 11.5px;
  font-weight: 600;
  color: var(--up-cinza-chumbo);
}

.bolinha-nf {
  display: inline-block;
  width: 9px;
  height: 9px;
  margin-right: 0.3rem;
  border-radius: 50%;
}

.bolinha-nf.verde { background-color: #b6e3a8; }
.bolinha-nf.vermelha { background-color: #f28b82; }
.bolinha-nf.amarela { background-color: #fff176; }

/* --- Nota fiscal (Visualizar) > Subtotal, Financeiro, Comissao, Transporte,
   Retirada/Entrega e Inf. Complementares ------------------------------------ */

@media (min-width: 768px) {
  #formNotaFiscal .nf-5 { grid-column: span 5; }
  #formNotaFiscal .nf-7 { grid-column: span 7; }
  #formNotaFiscal .nf-9 { grid-column: span 9; }
}

/* cartoes lado a lado (Subtotal: 4; Financeiro e Inf. Complementares: 2) */
.nf-cartoes {
  display: grid;
  grid-template-columns: minmax(0, 1fr);
  gap: 0.6rem;
}

@media (min-width: 992px) {
  .nf-cartoes-2 { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .nf-cartoes-4 { grid-template-columns: repeat(4, minmax(0, 1fr)); }
}

.nf-cartoes > .bloco-nf {
  margin-bottom: 0;
}

/* cartao dentro de cartao (Dados cheque, Outros parcelamentos, os dois do
   Financeiro): mesma moldura, respiro menor */
.bloco-nf .bloco-nf {
  margin: 0.6rem 0 0;
  padding: 0.6rem 0.9rem;
}

#formNotaFiscal .campo textarea {
  min-height: 92px;
  padding: 2px 4px;
  font-size: 11.5px;
  line-height: 1.4;
  border-radius: 3px;
  border-color: var(--up-borda);
  background-color: var(--up-cinza-frio);
  color: var(--up-texto);
  resize: vertical;
}

#formNotaFiscal .bloco-nf > .campo + .campo {
  margin-top: 0.5rem;
}

/* botao "impressora" do POS: o azul claro do Uniplus */
.botao-nf-lupa.botao-nf-claro {
  background-color: #9db8e8;
}

/* grades que ocupam a largura toda (Servicos, parcelas): proporcoes do
   colgroup, sem rolagem horizontal */
#formNotaFiscal .grade-nf-larga {
  table-layout: fixed;
  width: 100%;
}

#formNotaFiscal .grade-nf-larga th,
#formNotaFiscal .grade-nf-larga td {
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

#formNotaFiscal .grade-nf-larga th {
  position: sticky;
  top: 0;
  z-index: 1;
  font-weight: 700;
}

.grade-parcelas-nf {
  min-height: 6.5rem;
}

.acoes-bloco-nf.sem-filete {
  border-top: 0;
  padding-top: 0;
}

/* "Carregar" da entrega: na linha do combo, alinhado pela base */
#formNotaFiscal .campo-botao-nf {
  justify-content: flex-end;
  align-items: flex-start;
}

#formNotaFiscal .campo-botao-nf .botao-acao {
  height: 28px;
  padding: 0 0.85rem;
  gap: 0.5rem;
  border: 0;
  color: #fff;
  text-transform: uppercase;
  opacity: 0.6;
}

/* --- Vendas > Pedido de Faturamento ------------------------------------------
   O formulario do Pedido de Venda (#formDocumento, mesmas medidas de campo)
   no desenho da tela "Ped. Faturamento" do Uniplus: sete abas espalhadas na
   largura toda, grade de 24 colunas (as mesmas classes `nf-*` da Nota fiscal
   de saida), cartoes "Incluir item"/"Itens" e rodape em duas faixas, totais
   em cima e botoes embaixo. Aqui os campos sao EDITAVEIS: ficam brancos com a
   borda azul do Uniplus; so os calculados/copiados ficam cinza.
   `#formDocumento` nos seletores: as regras do Pedido de Venda sao escopadas
   pelo id, e sem ele venceriam estas. */

#formDocumento#formDocumento.form-faturamento > .abas-internas {
  flex-shrink: 0;
  margin-bottom: 0.6rem;
}

#formDocumento.form-faturamento .aba-interna {
  flex: 1 1 0;
  padding: 0.45rem 0.6rem;
  font-size: 13px;
}

/* mesmo truque da nota: sem `column-gap`, o respiro vira recuo de cada campo */
#formDocumento.form-faturamento .bloco-campos {
  grid-template-columns: repeat(24, minmax(0, 1fr));
  gap: 0.5rem 0;
  padding: 0.9rem 0.55rem 1.1rem;
  box-shadow: 0 1px 4px rgba(0, 6, 12, 0.12);
}

#formDocumento.form-faturamento .bloco-campos > .campo {
  padding: 0 0.55rem;
}

#formDocumento.form-faturamento .campo {
  grid-column: span 24;
  min-width: 0;
}

@media (min-width: 768px) {
  #formDocumento.form-faturamento .nf-2 { grid-column: span 2; }
  #formDocumento.form-faturamento .nf-3 { grid-column: span 3; }
  #formDocumento.form-faturamento .nf-4 { grid-column: span 4; }
  #formDocumento.form-faturamento .nf-5 { grid-column: span 5; }
  #formDocumento.form-faturamento .nf-6 { grid-column: span 6; }
  #formDocumento.form-faturamento .nf-7 { grid-column: span 7; }
  #formDocumento.form-faturamento .nf-8 { grid-column: span 8; }
  #formDocumento.form-faturamento .nf-9 { grid-column: span 9; }
  #formDocumento.form-faturamento .nf-12 { grid-column: span 12; }
}

#formDocumento.form-faturamento .nf-quebra {
  grid-column: 1 / -1;
  height: 0;
}

/* Condicao de pagamento e Vendedor da aba Geral: largura pelo nome escolhido
   (pedido de 23/09/2026). Na grade um campo tem largura fixa (nf-3 cortava
   nome comprido), entao os dois ficam numa faixa flex da linha inteira. O
   piso e 3/24 da faixa -- a mesma largura das datas, porque a grade nao tem
   column-gap e a faixa tem a largura util do bloco --, o teto e a metade da
   linha. `field-sizing: content` faz o <select> medir a opcao ESCOLHIDA e
   acompanhar cada troca, sem JS; navegador sem suporte cai no piso. */
#formDocumento.form-faturamento .campos-crescentes {
  grid-column: 1 / -1;
  display: flex;
  flex-wrap: wrap;
  gap: 0.5rem 0;
}

#formDocumento.form-faturamento .campos-crescentes > .campo {
  flex: 0 0 auto;
  width: 100%;
  padding: 0 0.55rem;
}

@media (min-width: 768px) {
  #formDocumento.form-faturamento .campos-crescentes > .campo {
    width: auto;
    min-width: calc(100% * 3 / 24);
    max-width: 50%;
  }

  #formDocumento.form-faturamento .campos-crescentes select {
    field-sizing: content;
    width: auto;
    min-width: 100%;
    max-width: 100%;
  }
}

/* campo editavel: a borda azul do Uniplus */
#formDocumento.form-faturamento .campo input:not([type="checkbox"]):not(:disabled),
#formDocumento.form-faturamento .campo select:not(:disabled),
#formDocumento.form-faturamento .campo textarea {
  border-color: #3b64c4;
}

#formDocumento.form-faturamento .campo select:disabled {
  background-color: var(--up-cinza-frio);
  color: var(--up-texto-suave);
  opacity: 1;
}

#formDocumento.form-faturamento .campo input.texto-direita {
  text-align: right;
}

#formDocumento.form-faturamento .bloco-campos.bloco-sem-moldura {
  margin: 0 -0.55rem;
  padding: 0;
  border: 0;
  box-shadow: none;
}

/* Brinde: a caixa sozinha embaixo do rotulo */
#formDocumento.form-faturamento .campo-marca-faturamento .campo-marca {
  width: 21px;
  height: 21px;
  margin-top: 0.1rem;
}

/* icones dentro do campo (CEP, telefone) num campo que se digita */
#formDocumento.form-faturamento .campo-com-icones-editavel {
  border-color: #3b64c4;
  background-color: #fff;
}

#formDocumento.form-faturamento .campo-com-icones input {
  border: 0;
  min-width: 0;
  flex: 1 1 auto;
}

#formDocumento.form-faturamento .campo-com-icones input:focus {
  box-shadow: none;
}

#formDocumento.form-faturamento .botao-no-campo:enabled {
  color: #3b64c4;
}

/* "Carregar" da entrega: na linha do combo, alinhado pela base */
#formDocumento.form-faturamento .campo-botao-nf {
  justify-content: flex-end;
  align-items: flex-start;
}

#formDocumento.form-faturamento .campo-botao-nf .botao-acao,
#formDocumento .acoes-bloco-nf .botao-acao {
  height: 28px;
  padding: 0 0.85rem;
  gap: 0.5rem;
  border: 0;
  color: #fff;
  text-transform: uppercase;
}

#formDocumento.form-faturamento .observacao-faturamento,
#formDocumento.form-faturamento #observacao {
  min-height: 70px;
}

#formDocumento.form-faturamento .bloco-complementares {
  padding-top: 3.2rem;
}

/* Inf. Complementares: a observacao ocupa metade da largura, como la */
#formDocumento.form-faturamento .bloco-complementares .campo {
  grid-column: span 24;
}

@media (min-width: 768px) {
  #formDocumento.form-faturamento .bloco-complementares .campo {
    grid-column: span 12;
  }
}

/* --- Aba Itens ---------------------------------------------------------------- */

/* sub-aba "Itens" encostada na esquerda, com o fundo cinza do Uniplus */
.sub-abas-faturamento {
  display: flex;
  margin-bottom: 0.4rem;
}

.sub-aba-faturamento {
  flex: 0 0 12.5rem;
  padding: 0.3rem 0.6rem;
  font-size: 13px;
  font-weight: 600;
  text-align: center;
  color: var(--up-texto);
}

.sub-aba-faturamento.ativa {
  background-color: #e8e8e8;
}

/* A aba Itens ocupa a altura que sobra e so a grade rola (mesma ideia do
   Pedido de Venda, mas a grade aqui esta dentro do cartao "Itens") */
#formDocumento.form-faturamento #painelItens.ativa {
  display: flex;
  flex-direction: column;
  flex: 1 1 auto;
  min-height: 0;
}

#formDocumento.form-faturamento #painelItens.ativa > * {
  flex-shrink: 0;
}

#formDocumento.form-faturamento #painelItens.ativa > #cartaoItens {
  display: flex;
  flex-direction: column;
  flex: 1 1 auto;
  min-height: 0;
}

/* mesmo cuidado do Pedido de Venda: a grade fica de fora do `flex-shrink: 0`.
   A nota antiga dizia que `#formDocumento.form-faturamento #envolucroItens`
   devolvia o `flex: 1 1 auto` "por vir depois com a mesma especificidade" --
   nao vinha: o `:not(.rolagem-interna)` pesa uma classe a mais e VENCIA o
   flex-shrink. Como o envolucro daqui nao tinha `.rolagem-interna` (usava uma
   classe que nem existia na folha), ele nunca encolhia: crescia com os itens,
   o cartao estourava, a pagina rolava inteira e o rodape colado na base cobria
   as linhas. Com a classe certa no HTML a grade volta a ser a unica que cede
   altura, igual ao Pedido/Orcamento. */
#formDocumento.form-faturamento #cartaoItens > :not(.rolagem-interna) {
  flex-shrink: 0;
}

/* `.rolagem-interna` ja da `flex: 1 1 auto` e `overflow-y: auto`; aqui sobra o
   que e so desta tela -- a grade tem 1914px fixos, entao precisa rolar tambem
   na horizontal (`overflow: auto`, nos dois eixos). */
#formDocumento.form-faturamento #envolucroItens {
  min-height: 10rem;
  overflow: auto;
  border: 1px solid var(--up-borda);
}

/* larguras do Uniplus (colgroup) e rolagem na horizontal, como la. Eram
   1914px; +125px da coluna "Codigo de barras" (produto.ean). */
#formDocumento.form-faturamento #gradeItens {
  table-layout: fixed;
  width: 2039px;
}

#formDocumento.form-faturamento #gradeItens th,
#formDocumento.form-faturamento #gradeItens td {
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

/* o cabecalho fixo vem de `.grade-envolucro.rolagem-interna .grade-planilha th`
   (sticky + z-index 2), o mesmo das outras grades; aqui so o peso da fonte. */
#formDocumento.form-faturamento #gradeItens th {
  font-weight: 700;
}

#formDocumento.form-faturamento #gradeItens .centro {
  text-align: center;
}

/* linha marcada: e sobre ela que a barra de botoes age (as tres telas) */
#formDocumento #gradeItens tbody tr.linha-selecionada td {
  background-color: #b9dcf5;
}


/* --- Mover para cima / para baixo -----------------------------------------
   As duas linhas trocam de lugar deslizando e a movida ainda recebe um realce
   que some sozinho -- sem isso a troca e instantanea e o operador perde de
   vista qual item andou. O deslize nasce em `--desloca` (a altura da outra
   linha, medida no JS antes de redesenhar) e termina em zero. */

@keyframes desliza-item {
  from { transform: translateY(var(--desloca, 0)); }
  to   { transform: translateY(0); }
}

/* #gradeCategorias (Catalogo virtual) usa o MESMO efeito ao mover
   departamento/categoria -- pedido do cliente; la o bloco inteiro do
   departamento (ele + as categorias) desliza junto. */
#formDocumento #gradeItens tbody tr.item-deslizando,
#gradeCategorias tbody tr.item-deslizando {
  animation: desliza-item 260ms ease-out;
  /* durante o deslize a linha passa por cima das vizinhas */
  position: relative;
  z-index: 2;
}

/* Moldura azul por dentro da celula, que se apaga. E `box-shadow` e nao
   `background`: assim o realce convive com a cor da linha marcada, em vez de
   disputar a mesma propriedade com ela. */
@keyframes realca-item {
  from { box-shadow: inset 0 0 0 2px var(--up-azul-royal); }
  to   { box-shadow: inset 0 0 0 2px rgba(0, 0, 0, 0); }
}

#formDocumento #gradeItens tbody tr.item-movido td,
#gradeCategorias tbody tr.item-movido td {
  animation: realca-item 900ms ease-out;
}

/* Quem pediu menos movimento no sistema operacional ve so o realce. */
@media (prefers-reduced-motion: reduce) {
  #formDocumento #gradeItens tbody tr.item-deslizando,
  #gradeCategorias tbody tr.item-deslizando {
    animation: none;
  }
}

.barra-itens {
  margin-top: 0.5rem;
}

/* travados ficam no tom claro de la (ver .acoes-bloco-nf .botao-acao:disabled) */
#formDocumento .acoes-bloco-nf .botao-acao:disabled {
  opacity: 0.6;
  cursor: default;
}

#formDocumento.form-faturamento #painelItens .campo-com-lupa .botao-lupa {
  margin-left: 1rem;
  border-radius: 3px;
}

/* --- Rodape: o mesmo do Pedido de Venda (`.rodape-documento`) --------------------
   Aqui so o encaixe no card do faturamento: colado na base e rente as bordas. */

#formDocumento.form-faturamento .rodape-faturamento {
  margin: auto -1.5rem 0;
  bottom: 0;
}

/* ==========================================================================
   Cursor do sistema -- regra do cliente (22/09/2026)
   Em toda tela o cursor e a SETINHA padrao do Windows. Nada de maozinha em
   botao, link, aba, linha de grade ou cartao, e nada do cursor de texto em
   cima de texto que nao se edita (as abas internas do Orcamento, rotulos,
   titulos). O cursor de texto fica SO no campo em que se digita -- campo
   desabilitado ou somente leitura tambem mostra a setinha.

   Por que numa regra so, no fim da folha, e nao espalhado: a maozinha vinha
   de tres lugares -- esta folha (as ~30 declaracoes foram tiradas no mesmo
   dia), o Bootstrap (`button`, `.btn`, `[role=button]`...) e o proprio
   navegador (todo link). O cursor de texto sobre texto comum e o `auto` do
   navegador. `body` com a setinha resolve o `auto` por heranca; a lista de
   baixo neutraliza quem declara a maozinha, com `inherit` e NAO `default`:
   durante o arraste de coluna a AG Grid (e o nosso `body.redimensionando`)
   pinta o cursor no body e conta com a heranca para ele valer em cima de
   qualquer elemento.

   Mantidos de proposito, a pedido do cliente: o de proibido nos botoes
   desabilitados, os de redimensionar/mover colunas das grades e o de ajuda
   do aviso de sistema base. O de "carregando" saiu.
   ========================================================================== */

html,
body {
  cursor: default;
}

a,
button,
summary,
label,
select,
input,
textarea,
.btn,
[role="button"],
[type="button"],
[type="reset"],
[type="submit"],
.ag-root-wrapper,
.ag-root-wrapper * {
  cursor: inherit !important;
}

/* o botao "x" que o Chrome poe no campo de busca */
input::-webkit-search-cancel-button {
  cursor: inherit !important;
}

/* onde se digita de verdade */
input:not([type="checkbox"]):not([type="radio"]):not([type="button"]):not([type="submit"]):not([type="reset"]):not([type="range"]):not([type="color"]):not([type="file"]):not([type="image"]):not([type="search"]):not(:disabled):not([readonly]),
textarea:not(:disabled):not([readonly]),
[contenteditable=""],
[contenteditable="true"] {
  cursor: text !important;
}

/* campo de pesquisa das listas (lupa + texto) tambem fica com a setinha
   (04/10/2026, pedido do cliente na Consulta NFC-e; antes, o mesmo no combo
   de condicoes do Tipo de Documento). Digitar continua valendo. Por isso o
   `:not([type="search"])` na regra de cima. */
input[type="search"]:not(:disabled) {
  cursor: default !important;
}

/* --- Excecoes mantidas ------------------------------------------------------ */

/* botao que nao pode ser clicado agora (o motivo vai no `title`) */
.botao-acao:disabled,
.aba-interna:disabled,
.menu-opcoes-item:disabled {
  cursor: not-allowed !important;
}

/* bloqueado por configuracao do Uniplus: o balao explica ao passar o mouse */
.bloqueio-base,
.bloqueio-base * {
  cursor: help !important;
}

/* colunas das grades: puxador de largura e arraste de ordem (nossa .grade) */
.puxador,
body.redimensionando,
body.redimensionando * {
  cursor: col-resize !important;
}

.grade th.movel {
  cursor: grab !important;
}

.grade th.movel:active {
  cursor: grabbing !important;
}

/* ...e as mesmas alças na AG Grid (listagens) */
.ag-root-wrapper .ag-header-cell-resize {
  cursor: ew-resize !important;
}

.ag-root-wrapper .ag-drag-handle {
  cursor: grab !important;
}


/* === Catalogo virtual (retaguarda) ==========================================
   Telas Configuracoes, Pendentes de liberacao, Lojistas e Pedidos do catalogo
   (templates/catalogo). Tudo aqui e ajuste de componentes que ja existem --
   .grade-planilha, .bloco-campos, .pauta-opcao/.pauta-estrela do Painel Admin
   > Usuarios --, nenhum componente novo. */

.form-catalogo .bloco-titulo {
  margin-top: 1rem;
}

.form-catalogo .bloco-titulo:first-of-type {
  margin-top: 0;
}

.form-catalogo .bloco-campos + .bloco-titulo {
  margin-top: 1.25rem;
}

/* as larguras globais param no campo-4 (ver o @media dos .campo-N): cada
   formulario declara as que usa, como o "Editar cliente" do Pedido */
@media (min-width: 768px) {
  .form-catalogo .campo-6 { grid-column: span 6; }
  .form-catalogo .campo-8 { grid-column: span 8; }
}

/* checkbox dentro de .campo: a regra dos campos esticaria a caixa a 100% da
   coluna e jogaria o texto para longe dela */
.form-catalogo .campo .opcao-marcar {
  align-self: flex-start;
}

.form-catalogo .campo .opcao-marcar input {
  width: auto;
  flex: 0 0 auto;
}

/* endereco do site + Copiar + Abrir na mesma linha, do tamanho de um campo */
.catalogo-link-linha {
  display: flex;
  gap: 0.5rem;
  align-items: center;
}

.catalogo-link-linha input {
  flex: 1 1 auto;
  min-width: 0;
}

/* Copiar / Abrir o site na altura EXATA do endereco ao lado -- mesmas
   metricas do campo (padrao da casa), como os `.campo-botoes` do Pedido */
.catalogo-link-linha .botao-acao {
  padding: 2px 10px;
  font-size: 11.5px;
  line-height: 1.35;
  border-width: 1px;
}

.catalogo-link-linha .botao-acao {
  flex: 0 0 auto;
  text-decoration: none;
}

/* --- Configuracoes > Pautas de preco (24/09/2026) ---------------------------
   A metodologia (padrao x multiplas pautas do ERP) e as pautas que o catalogo
   oferece. A lista passa de 70 nas multiplas (banco gerais): grade de colunas
   com rolagem propria + pesquisa, a mesma .lista-grupos das Categorias. */

.metodologias-pauta {
  display: flex;
  flex-direction: column;
  gap: 0.5rem;
}

/* radio + titulo em negrito + a explicacao na linha de baixo: o radio fica
   na altura do titulo, nao no meio das duas linhas */
.form-catalogo .campo .opcao-metodologia {
  align-items: flex-start;
}

.form-catalogo .campo .opcao-metodologia input {
  margin-top: 0.15rem;
}

/* o `small` do .opcao-marcar (80% de 11.5px) ficava ilegivel numa frase
   inteira de explicacao */
.opcao-metodologia small {
  display: block;
  font-size: 11px;
}

.opcao-metodologia.desativada {
  color: var(--up-texto-suave);
  cursor: not-allowed;
}

.etiqueta-status.etiqueta-sugerida {
  margin-left: 0.35rem;
  background-color: var(--up-primaria-fundo);
  color: var(--up-primaria-escuro);
}

.pautas-catalogo-barra {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 0.4rem 1rem;
  margin-top: 0.25rem;
}

/* a pesquisa na altura de um campo da casa (a .campo-pesquisa cheia e a da
   barra de ferramentas); o input dela nao leva a moldura do `.campo input` */
.pautas-catalogo-barra .campo-pesquisa {
  flex: 0 1 20rem;
  padding: 2px 0.6rem;
}

.form-catalogo .pautas-catalogo-barra .campo-pesquisa input {
  width: auto;
  padding: 0;
  border: 0;
  box-shadow: none;
  font-size: 11.5px;
}

/* o seletor com .form-catalogo passa na frente da .lista-grupos, que vem
   depois no arquivo e zeraria o padding */
.form-catalogo .lista-pautas-catalogo {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(13rem, 1fr));
  align-content: start;
  gap: 0 1rem;
  max-height: 16rem;
  margin-top: 0.3rem;
  padding: 0.35rem 0.6rem;
  border: 1px solid var(--up-borda-suave);
  border-radius: 4px;
}

#gradeLojistas .acoes-modelo,
#gradePedidosCatalogo .acoes-modelo {
  display: inline-flex;
  gap: 0.25rem;
}

#gradePedidosCatalogo a.botao-icone-item {
  text-decoration: none;
}

#gradeLojistas tr.inativo td:not(:first-child):not(:last-child) {
  color: var(--up-texto-suave);
}

#gradeLojistas .linha-vazia td,
#gradePedidosCatalogo .linha-vazia td {
  padding: 0.9rem 0.75rem;
  white-space: normal;
  color: var(--up-texto-suave);
}

/* Liberar / Recusar dentro da linha: o .botao-acao de sempre, mais baixo --
   a linha da grade tem ~24px e o botao cheio a esticaria */
.botao-acao.botao-compacto {
  padding: 0.1rem 0.5rem;
  font-size: 11px;
}

.etiqueta-status.lojista-pendente {
  background-color: var(--up-intervencao-fundo);
  color: var(--up-intervencao);
}

.filtro-situacao {
  display: inline-flex;
  align-items: center;
  gap: 0.4rem;
  font-size: 12px;
  color: var(--up-texto-suave);
}

/* --- Dialogo Liberar / Alterar lojista ------------------------------------ */

.dialogo-medio.dialogo-lojista {
  width: min(40rem, calc(100vw - 3rem));
}

.dialogo-medio.dialogo-lojista[open] {
  display: flex;
  flex-direction: column;
}

/* Caixa FIXA (pedido do cliente, 24/09/2026), como a .dialogo-vitrine: antes
   era so `max-height`, e com as Multiplas pautas (dezenas) a janela crescia
   ate a borda e ganhava rolagem por fora, alem da do corpo. Agora a altura e
   fixa e so a LISTA DE PAUTAS rola -- resumo, Cliente do ERP e os titulos
   ficam parados. O `overflow: hidden` garante que nada vaze para a caixa. */
.dialogo-medio.dialogo-lojista {
  height: min(44rem, calc(100vh - 2rem));
  overflow: hidden;
}

/* mesmo meio rem da .dialogo-vitrine: Cancelar e Liberar encostavam */
.dialogo-lojista .dialogo-rodape {
  gap: 0.5rem;
}

/* Coluna: o que vem antes das pautas fica no tamanho natural e a lista toma
   o resto (ver .lojista-pautas). O `overflow-y: auto` daqui e so a rede para
   janela muito baixa, quando a lista ja chegou no minimo dela. */
.lojista-corpo {
  /* mesmo motivo do `position` da .lojista-pautas, para o resto do corpo */
  position: relative;
  display: flex;
  flex: 1 1 auto;
  flex-direction: column;
  min-height: 0;
  overflow-y: auto;
  padding: 1rem 1.25rem;
}

.lojista-corpo > * {
  flex: 0 0 auto;
}

.lojista-corpo .bloco-titulo {
  margin: 1rem 0 0.2rem;
}

/* dados que o lojista digitou no site: duas colunas de rotulo + valor */
.lojista-resumo {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: 0.35rem 1rem;
  margin: 0;
  padding: 0.6rem 0.75rem;
  border: 1px solid var(--up-borda-suave);
  border-radius: 4px;
  background-color: var(--up-cinza-frio);
  font-size: 12px;
}

.lojista-resumo dt {
  font-size: 10.5px;
  font-weight: 400;
  color: var(--up-texto-suave);
}

.lojista-resumo dd {
  margin: 0;
  overflow-wrap: anywhere;
  color: var(--up-texto);
}

/* A unica parte que rola: ocupa a altura que sobra no corpo. Moldura suave
   para a rolagem ter onde morar -- sem ela a lista parecia cortada.
   `position: relative` e o que prende a rolagem aqui dentro: cada estrela tem
   um `.visually-hidden` (position: absolute), e sem um pai posicionado ele se
   mede pelo proprio <dialog> -- a rolagem da lista nao o corta e os ~70 textos
   invisiveis esticavam a janela (2253px de conteudo numa caixa de 704px). Era
   dai que vinha a barra de rolagem por FORA da janela. */
.lojista-corpo > .lojista-pautas {
  position: relative;
  flex: 1 1 auto;
  min-height: 6rem;
  margin: 0.4rem 0 0;
  padding: 0;
  overflow-y: auto;
  list-style: none;
  border: 1px solid var(--up-borda-suave);
  border-radius: 4px;
}

/* Cliente do ERP: o campo Cliente dos pedidos (sugestoes + lupa), com as
   medidas deles (listas do #formDocumento, la em cima). Antes era uma lista
   de radios com os clientes de mesmo CNPJ/CPF e uma busca que empilhava os
   achados nela -- trocado a pedido do cliente (24/09/2026) para o padrao da
   casa. A lista de sugestoes fica da largura do campo: os 38rem da
   `.busca-grade` passariam do corpo do dialogo e abririam rolagem lateral. */
.lojista-cliente {
  margin: 0.4rem 0 0.2rem;
}

#dialogoLojista .busca-resultados.busca-grade {
  width: 100%;
}

.lojista-pautas .pauta-opcao {
  border-bottom: 1px solid var(--up-borda-suave);
}

/* a moldura da lista ja fecha embaixo: sem filete dobrado na ultima */
.lojista-pautas .pauta-opcao:last-child {
  border-bottom: 0;
}

/* Pesquisar pauta (so com lista longa): o mesmo campo compacto das
   Configuracoes do catalogo (.pautas-catalogo-barra). Aqui o corpo e coluna
   flex, entao a largura vem do `width`, e nao do `flex-basis` de la. */
.lojista-corpo > .lojista-pesquisa-pautas {
  flex: none;
  width: min(20rem, 100%);
  margin-top: 0.4rem;
  padding: 2px 0.6rem;
}

.lojista-pesquisa-pautas input {
  padding: 0;
  font-size: 11.5px;
  line-height: 1.35;
}

/* o `display: flex` da .pauta-opcao venceria o [hidden] do navegador */
.lojista-pautas .pauta-opcao[hidden] {
  display: none;
}

.pautas-vazio {
  padding: 0.5rem 0.7rem;
  font-size: 12px;
  color: var(--up-texto-suave);
}


/* --- Catalogo virtual > Vitrine (Categorias, Destaques, Aparencia) --------
   Mesmos componentes da retaguarda; aqui so o que e proprio da vitrine: campo
   de imagem com miniatura, seletor de destino, grade de icones, a arvore com
   recuo e as listas editaveis (itens que sobem/descem/saem). */

.dialogo-medio.dialogo-vitrine {
  width: min(52rem, calc(100vw - 3rem));
}

.dialogo-medio.dialogo-vitrine[open] {
  display: flex;
  flex-direction: column;
}

/* Caixa FIXA (pedido do cliente, 24/09/2026): antes era so `max-height`, e a
   janela crescia/encolhia conforme o conteudo -- e a propria caixa ganhava
   rolagem por fora, alem da do corpo. Agora a altura e fixa, como no
   .dialogo-largo; cabecalho e rodape ficam parados e so o .vitrine-corpo rola.
   O `overflow: hidden` garante que nada vaze para a caixa. Botoes do rodape
   com os 28px do padrao (regra compartilhada la no .dialogo-largo). */
.dialogo-medio.dialogo-vitrine {
  height: min(44rem, calc(100vh - 2rem));
  overflow: hidden;
}

/* Cancelar e Gravar encostavam um no outro: o .dialogo-rodape nao tem gap
   (os outros dialogos resolvem com margem propria); aqui o mesmo meio rem
   do .dialogo-rodape.centralizado */
.dialogo-vitrine .dialogo-rodape {
  gap: 0.5rem;
}

.vitrine-corpo {
  flex: 1 1 auto;
  min-height: 0;
  overflow-y: auto;
  padding: 0.5rem 1.25rem 1rem;
}

.vitrine-corpo .bloco-titulo {
  margin: 0.75rem 0 0.25rem;
}

/* campo de imagem: miniatura + Enviar/Trocar + Remover */
.campo-imagem {
  display: flex;
  align-items: center;
  gap: 0.75rem;
}

.campo-imagem-previa {
  display: flex;
  flex: 0 0 auto;
  align-items: center;
  justify-content: center;
  width: 7.5rem;
  height: 4.5rem;
  overflow: hidden;
  border: 1px dashed var(--up-borda);
  border-radius: 4px;
  background-color: var(--up-cinza-frio);
}

.campo-imagem-previa img {
  max-width: 100%;
  max-height: 100%;
  object-fit: contain;
}

.campo-imagem-vazio {
  display: flex;
  flex-direction: column;
  padding: 0.25rem;
  font-size: 10.5px;
  text-align: center;
  color: var(--up-texto-suave);
}

.campo-imagem-vazio small {
  font-size: 9.5px;
}

.campo-imagem-acoes {
  display: flex;
  flex-direction: column;
  gap: 0.35rem;
}

.campo-imagem-acoes .botao-acao {
  padding: 0.15rem 0.6rem;
  font-size: 11px;
}

/* "para onde o link leva": tipo + alvo lado a lado */
.seletor-destino {
  display: flex;
  gap: 0.4rem;
}

.seletor-destino select[data-tipo] {
  flex: 0 0 7.5rem;
}

.seletor-destino select[data-alvo],
.seletor-destino input[data-url] {
  flex: 1 1 auto;
  min-width: 0;
}

/* icones de departamento: grade de botoes de radio */
.grade-icones {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(6.5rem, 1fr));
  gap: 0.35rem;
  max-height: 12.5rem;
  overflow-y: auto;
  padding: 0.35rem;
  border: 1px solid var(--up-borda-suave);
  border-radius: 4px;
}

.opcao-icone {
  /* ancora o radio escondido: sem isso ele se posicionava pela caixa do
     dialogo, herdava a largura dela e criava rolagem horizontal na janela */
  position: relative;
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 0.2rem;
  padding: 0.35rem 0.2rem;
  border: 1px solid transparent;
  border-radius: 4px;
  font-size: 10px;
  text-align: center;
  color: var(--up-texto);
  cursor: pointer;
}

.opcao-icone input {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  margin: 0;
  opacity: 0;
  pointer-events: none;
}

.opcao-icone:has(input:checked) {
  border-color: var(--up-primaria);
  background-color: var(--up-primaria-fundo);
  color: var(--up-primaria-escuro);
}

.opcao-icone:has(input:focus-visible) {
  outline: 2px solid var(--up-azul-royal);
}

/* grupos do ERP da categoria: duas listas lado a lado, com rolagem */
.grupos-pesquisa {
  max-width: 24rem;
  margin: 0.4rem 0;
}

.grupos-colunas {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: 1rem;
}

.grupos-colunas fieldset {
  min-width: 0;
  margin: 0;
  padding: 0.4rem 0.6rem;
  border: 1px solid var(--up-borda-suave);
  border-radius: 4px;
}

.grupos-colunas legend {
  width: auto;
  margin: 0;
  padding: 0 0.3rem;
  font-size: 12px;
  font-weight: 700;
  color: var(--up-azul-royal);
}

.grupos-colunas legend small {
  font-weight: 400;
  color: var(--up-texto-suave);
}

.lista-grupos {
  max-height: 14rem;
  margin: 0;
  padding: 0;
  overflow-y: auto;
  list-style: none;
}

.lista-grupos li[hidden] {
  display: none;
}

.lista-grupos .opcao-marcar {
  padding: 0.1rem 0;
}

.lista-grupos .sem-produto {
  color: var(--up-texto-suave);
}

.codigo-grupo {
  min-width: 2.2rem;
  font-size: 10.5px;
  color: var(--up-texto-suave);
}

/* a arvore na grade: recuo por nivel (--nivel vem da linha) */
#gradeCategorias .categoria-nome {
  display: inline-flex;
  align-items: center;
  gap: 0.4rem;
  padding-left: calc(var(--nivel, 0) * 1.4rem);
}

#gradeCategorias tr.nivel-1 td.destaque {
  font-weight: 700;
}

.categoria-miniatura {
  width: 1.5rem;
  height: 1.5rem;
  border-radius: 50%;
  object-fit: cover;
}

.categoria-icone {
  display: inline-flex;
  color: var(--up-primaria);
}

/* rodape da grade Categorias e Departamentos: so a contagem, a esquerda e
   mais baixo que o rodape de formulario (nao tem botao) */
/* Rodape SEMPRE na base, mesmo com a pesquisa deixando poucas linhas: sem
   isto o sticky so gruda quando o painel rola, e com a grade curta o rodape
   subia junto com ela. O painel vira coluna flex e o rodape empurra-se para
   baixo com margin-top auto; os demais filhos nao encolhem, entao quem rola
   continua sendo o .painel, como antes. */
.painel:has(> .rodape-contagem) {
  display: flex;
  flex-direction: column;
}

.painel:has(> .rodape-contagem) > * {
  flex-shrink: 0;
}

.rodape-formulario.rodape-contagem {
  margin-top: auto;
  justify-content: flex-start;
  padding-block: 0.5rem;
  font-size: 12px;
  color: var(--up-texto-suave);
}

#gradeCategorias .col-nivel { width: 7rem; }
#gradeCategorias .col-quantidade { width: 8rem; }
#gradeCategorias .col-situacao { width: 6rem; }
/* 4 botoes no departamento (+, ativar/inativar, alterar, excluir): subir e
   descer foram para a barra de cima em 24/09/2026 */
#gradeCategorias .col-acoes-categoria { width: 7.5rem; }

#gradeCategorias .acoes-modelo,
#gradeDestaques .acoes-modelo,
.item-editavel-acoes {
  display: inline-flex;
  gap: 0.25rem;
}

#gradeCategorias tbody tr[hidden] {
  display: none;
}

#gradeCategorias tr.inativo td:not(:last-child),
#gradeDestaques tr.inativo td:not(:last-child) {
  color: var(--up-texto-suave);
}

#gradeCategorias .linha-vazia td,
#gradeDestaques .linha-vazia td {
  padding: 0.9rem 0.75rem;
  white-space: normal;
  color: var(--up-texto-suave);
}

/* endereco do destaque: o prefixo fixo colado no campo */
.campo-prefixo {
  display: flex;
  align-items: stretch;
}

.campo-prefixo span {
  display: flex;
  align-items: center;
  padding: 0 0.4rem;
  border: 1px solid var(--up-borda);
  border-right: 0;
  border-radius: 3px 0 0 3px;
  background-color: var(--up-cinza-frio);
  font-size: 11px;
  color: var(--up-texto-suave);
}

.campo-prefixo input {
  flex: 1 1 auto;
  min-width: 0;
}

.busca-produto-destaque {
  position: relative;
  max-width: 34rem;
  margin: 0.4rem 0;
}

.resultados-produto {
  position: absolute;
  top: 100%;
  left: 0;
  right: 0;
  z-index: 5;
  max-height: 16rem;
  margin: 0.2rem 0 0;
  padding: 0.2rem 0;
  overflow-y: auto;
  border: 1px solid var(--up-borda);
  border-radius: 4px;
  background-color: #fff;
  box-shadow: var(--up-sombra-menu);
  list-style: none;
}

.resultados-produto button {
  width: 100%;
  padding: 0.3rem 0.6rem;
  border: 0;
  background: none;
  font-size: 12px;
  text-align: left;
  cursor: pointer;
}

.resultados-produto button:hover:enabled {
  background-color: var(--up-primaria-fundo);
}

.resultados-produto button:disabled {
  color: var(--up-texto-suave);
  cursor: default;
}

.lista-produtos-destaque {
  max-height: 16rem;
  margin: 0;
  padding: 0 0 0 1.6rem;
  overflow-y: auto;
  font-size: 12px;
}

.lista-produtos-destaque li {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 0.5rem;
  padding: 0.2rem 0;
  border-bottom: 1px solid var(--up-borda-suave);
}

.produto-destaque-nome {
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

/* --- Aparencia --------------------------------------------------------------- */

/* "Ver o site" na mesma linha das abas, encostado a direita */
.abas-aparencia {
  align-items: center;
}

.abas-aparencia-site {
  margin-left: auto;
  text-decoration: none;
}

.form-aparencia .bloco-titulo small {
  font-weight: 400;
  font-size: 11px;
}

.bloco-lista {
  display: block;
}

.lista-editavel,
.lista-blocos {
  margin: 0 0 0.6rem;
  padding: 0;
  list-style: none;
}

.item-editavel {
  display: flex;
  align-items: flex-start;
  gap: 0.5rem;
  padding: 0.35rem 0;
  border-bottom: 1px solid var(--up-borda-suave);
}

.item-editavel > :first-child {
  flex: 1 1 auto;
  min-width: 0;
}

.item-editavel > .bloco-campos {
  padding: 0.25rem 0;
}

.item-editavel-acoes {
  flex: 0 0 auto;
  padding-top: 1.1rem;
}

.lista-blocos > .item-bloco {
  margin-bottom: 0.75rem;
  padding: 0;
  border: 0;
}

.cartao-bloco {
  padding: 0.6rem 0.85rem;
  border: 1px solid var(--up-borda);
  border-radius: 4px;
  background-color: #fff;
}

.cartao-bloco-topo {
  display: flex;
  align-items: center;
  gap: 0.75rem;
  padding-bottom: 0.4rem;
  border-bottom: 1px solid var(--up-borda-suave);
}

.cartao-bloco-tipo {
  flex: 0 0 auto;
  min-width: 11rem;
  font-size: 12px;
  color: var(--up-azul-royal);
}

.cartao-bloco-topo input[type="text"] {
  flex: 1 1 auto;
  min-width: 0;
}

.editor-itens {
  padding-top: 0.25rem;
}

.lista-itens-bloco .item-editavel {
  padding-left: 0.5rem;
  border-left: 3px solid var(--up-primaria-fundo);
}

.escolha-categorias {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(16rem, 1fr));
  gap: 0.15rem 1rem;
  max-height: 12rem;
  overflow-y: auto;
  padding-top: 0.4rem;
}

.escolha-categorias .nivel-1 {
  font-weight: 700;
}

.incluir-bloco {
  display: flex;
  align-items: center;
  gap: 0.5rem;
  font-size: 12px;
}

.incluir-bloco select {
  max-width: 16rem;
}

/* "Incluir" na altura EXATA do seletor ao lado -- mesmas metricas do campo
   (padrao da casa), como os botoes de `.campo-botoes` do Pedido */
.incluir-bloco .botao-acao {
  padding: 2px 10px;
  font-size: 11.5px;
  line-height: 1.35;
  border-width: 1px;
}

.colunas-rodape .cartao-bloco {
  margin-bottom: 0.5rem;
}

/* --- Aparencia > Paleta de cores (24/09/2026) --------------------------------
   Campos a esquerda, previa a direita (empilham na janela estreita). As cores
   da previa NAO sao tokens desta folha: sao as escolhidas pelo cliente, postas
   pelo catalogo_aparencia.js em --previa-<chave> no #previaCores. O que nao e
   configuravel (cartao branco, borda, texto suave) le os tokens da casa. */

.barra-cores {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 1rem;
  margin-bottom: 0.75rem;
}

.barra-cores .texto-apoio {
  margin: 0;
}

.barra-cores .botao-acao {
  flex: 0 0 auto;
}

.paleta-cores {
  display: grid;
  gap: 1rem;
  align-items: start;
}

@media (min-width: 992px) {
  .paleta-cores {
    grid-template-columns: minmax(0, 1fr) minmax(0, 26rem);
  }
}

/* quadrinho + codigo lado a lado; o quadrinho estica na altura do codigo
   (align-self) em vez de cravar px -- segue o padrao da casa sozinho */
.campo-cor {
  display: flex;
  gap: 0.4rem;
}

#formAparencia .campo-cor input[type="color"] {
  flex: 0 0 2.5rem;
  width: 2.5rem;
  align-self: stretch;
  height: auto;
  padding: 1px 2px;
  cursor: pointer;
}

#formAparencia .campo-cor input[type="text"] {
  flex: 0 1 7rem;
  width: 7rem;
  text-transform: lowercase;
}

.previa-cores {
  overflow: hidden;
  border: 1px solid var(--up-borda);
  border-radius: 6px;
  background-color: var(--previa-fundo);
  box-shadow: var(--up-sombra-card);
  font-size: 11px;
  color: var(--previa-texto);
}

.previa-topo {
  display: flex;
  align-items: center;
  gap: 0.6rem;
  padding: 0.55rem 0.7rem;
  background-color: var(--previa-principal);
  color: var(--previa-sobre-principal);
}

.previa-topo strong {
  font-size: 12px;
}

.previa-busca {
  flex: 1 1 auto;
  padding: 0.2rem 0.5rem;
  border-radius: 4px;
  background-color: #fff;
  color: var(--up-texto-suave);
}

.previa-menu {
  display: flex;
  gap: 0.9rem;
  padding: 0.35rem 0.7rem;
  border-bottom: 1px solid var(--up-borda-suave);
  background-color: #fff;
}

.previa-menu strong {
  color: var(--previa-principal);
}

.previa-corpo {
  padding: 0.7rem;
}

.previa-cabeca {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  margin-bottom: 0.45rem;
}

.previa-titulo {
  font-size: 13px;
  font-weight: 700;
  color: var(--previa-titulos);
}

.previa-link {
  color: var(--previa-principal);
  text-decoration: underline;
}

.previa-cartoes {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 0.5rem;
}

.previa-cartao {
  display: flex;
  flex-direction: column;
  gap: 0.25rem;
  padding: 0.5rem;
  border-radius: 6px;
  background-color: #fff;
}

.previa-foto {
  height: 3.5rem;
  border-radius: 4px;
  background-color: var(--up-cinza-frio);
}

.previa-preco {
  font-size: 13px;
  color: var(--previa-preco);
}

.previa-comprar {
  padding: 0.25rem;
  border-radius: 4px;
  background-color: var(--previa-comprar);
  color: var(--previa-sobre-principal);
  font-weight: 700;
  text-align: center;
}

/* ==========================================================================
   Painel Admin > Sessoes web (25/09/2026)

   Tres abas internas (Conectados agora / Historico / Seguranca), no molde de
   Campos obrigatorios: a aba ativa vira coluna flex para a grade dela rolar
   por dentro e o cabecalho da secao nao andar. Cores so por token: o verde de
   "Ativa" e o das etiquetas "Liberado" (--up-resolvida), o ambar de "Parada"
   e o da intervencao/pendente do Catalogo (--up-intervencao), o vermelho de
   recusa e o da pendencia (--up-pendencia).
   ========================================================================== */

/* barra de abas mantem a altura, como em #formCamposObrigatorios */
#formSessoesWeb > .abas-internas {
  flex-shrink: 0;
}

#formSessoesWeb > .painel-aba.ativa {
  flex: 1 1 auto;
  display: flex;
  flex-direction: column;
  min-height: 0;
}

/* a aba Seguranca tem varias listas e rola inteira (`.admin-corpo-rolavel`);
   as demais rolam so a grade */
#abaSeguranca .admin-corpo-rolavel {
  padding-bottom: 1rem;
}

#abaSeguranca .bloco-titulo {
  margin-top: 1.1rem;
}

#abaSeguranca .bloco-titulo:first-of-type {
  margin-top: 0.2rem;
}

#abaSeguranca .texto-apoio {
  margin: 0 0 0.5rem;
  font-size: 12px;
  line-height: 1.35;
}

#abaSeguranca .grade-envolucro {
  align-self: flex-start;
  max-width: 100%;
}

#abaSeguranca .grade-planilha {
  width: auto;
  min-width: 34rem;
}

/* Cartoes do resumo (topo de "Conectados agora") */
.sessoes-resumo {
  flex: 0 0 auto;
  display: flex;
  flex-wrap: wrap;
  gap: 0.6rem;
  margin-bottom: 0.7rem;
}

.sessoes-cartao {
  display: flex;
  align-items: baseline;
  gap: 0.6rem;
  min-width: 9rem;
  padding: 0.45rem 0.9rem;
  border: 1px solid var(--up-borda-suave);
  border-left: 3px solid var(--up-azul-sky);
  border-radius: 4px;
  background-color: var(--up-cinza-frio);
}

.sessoes-cartao-ativos {
  border-left-color: var(--up-resolvida);
}

.sessoes-cartao-parados {
  border-left-color: var(--up-intervencao);
}

.sessoes-cartao-valor {
  font-size: 20px;
  font-weight: 700;
  line-height: 1;
  color: var(--up-texto);
}

.sessoes-cartao-rotulo {
  font-size: 12px;
  color: var(--up-cinza-chumbo);
}

.sessoes-cartao-rotulo small {
  color: var(--up-texto-suave);
}

.barra-sessoes {
  flex: 0 0 auto;
}

.barra-sessoes .campo-pesquisa {
  flex: 0 1 24rem;
}

.barra-sessoes .filtro-sessoes {
  height: 28px;
  padding: 0 0.4rem;
  border: 1px solid var(--up-borda);
  border-radius: 4px;
  background-color: #fff;
  font-family: var(--up-fonte);
  font-size: 12px;
  color: var(--up-texto);
}

.contagem-sessoes {
  font-size: 12px;
  color: var(--up-texto-suave);
}

/* hora da ultima busca, empurrada para junto do botao Atualizar */
.sessoes-atualizado {
  margin-left: auto;
  font-size: 12px;
  color: var(--up-texto-suave);
}

.sessoes-atualizado.sem-conexao {
  color: var(--up-pendencia);
}

.nota-sessoes {
  flex: 0 0 auto;
  margin: 0.3rem 0;
  font-size: 12px;
  color: var(--up-texto-suave);
}

#gradeSessoes tbody tr[hidden] {
  display: none;
}

#gradeSessoes .linha-vazia td,
#gradeHistorico .linha-vazia td,
#gradeBloqueios .linha-vazia td,
#gradeFalhas .linha-vazia td,
#gradeIpNovo .linha-vazia td,
#gradeApelidos .linha-vazia td {
  padding: 0.9rem 0.75rem;
  text-align: center;
  white-space: normal;
  color: var(--up-texto-suave);
}

/* sessao parada: a linha esmaece, o que importa e quem esta mexendo */
#gradeSessoes tr.sessao-parada-linha td:not(:last-child) {
  color: var(--up-texto-suave);
}

#gradeSessoes .acoes-modelo,
#gradeBloqueios .acoes-modelo,
#gradeApelidos .acoes-modelo {
  display: inline-flex;
  gap: 0.25rem;
}

.sessoes-login {
  font-size: 11px;
  color: var(--up-texto-suave);
}

.sessoes-hora {
  font-size: 11px;
  color: var(--up-texto-suave);
}

.sessoes-voce {
  display: inline-block;
  padding: 0 0.4rem;
  border-radius: 8px;
  background-color: var(--up-primaria-fundo);
  font-size: 10px;
  font-weight: 700;
  color: var(--up-primaria-escuro);
}

.sessoes-digitado,
.sessoes-sem-apelido {
  font-style: italic;
  color: var(--up-texto-suave);
}

/* --- Tipo de envio -------------------------------------------------------
   Coluna da grade de itens do pedido (modo "No item") e a janela "Alterar
   tipo de envio" das listagens dos Pedidos (casca do Duplicar). */
#gradeItens td.sem-tipo-envio {
  color: var(--up-texto-suave);
}

.dialogo-tipo-envio .tipo-envio-aviso {
  margin: 0.85rem 1.5rem 0;
  text-align: left;
}

.dialogo-tipo-envio .tipo-envio-pedido {
  display: flex;
  flex-direction: column;
  gap: 0.25rem;
  margin: 1rem 1.5rem 0;
  text-align: left;
}

.dialogo-tipo-envio .tipo-envio-pedido label {
  font-size: 11px;
  font-weight: 700;
  color: var(--up-texto-suave);
}

.dialogo-tipo-envio select {
  width: 100%;
  min-width: 12rem;
  padding: 0.25rem 0.4rem;
  border: 1px solid var(--up-borda-suave);
  border-radius: 4px;
  background-color: #fff;
  font-size: 12px;
}

/* a linha nao marca nada aqui: sem a maozinha do Duplicar */
.dialogo-tipo-envio .tipo-envio-itens tbody tr {
  cursor: default;
}

/* o seletor (4a coluna) tambem estica, alem do produto */
.dialogo-tipo-envio .tipo-envio-itens th:nth-child(4),
.dialogo-tipo-envio .tipo-envio-itens td:nth-child(4) {
  width: 14rem;
}

/* IP: o apelido em destaque, o numero miudo ao lado, e o lapis */
.sessoes-ip {
  display: inline-flex;
  align-items: center;
  gap: 0.3rem;
}

.sessoes-ip-apelido {
  font-weight: 700;
  color: var(--up-azul-royal);
}

.sessoes-ip-numero {
  font-size: 12px;
  color: var(--up-cinza-chumbo);
}

.sessoes-ip-apelido + .sessoes-ip-numero {
  font-size: 11px;
  color: var(--up-texto-suave);
}

/* Situacao da sessao e tipo de evento (mesma etiqueta das demais grades) */
.etiqueta-status.sessao-ativa,
.etiqueta-status.tom-ok {
  background-color: var(--up-resolvida-fundo);
  color: var(--up-resolvida);
}

/* "Status financeiro" do Pedido de Faturamento (01/10/2026, fluxo com
   liberacao financeira): "Financeiro gerado" no verde de resolvido; "Nao
   gerado" fica no cinza padrao da etiqueta. Status novo do fluxo ganha a sua
   classe aqui (status-financeiro-<codigo>) */
.etiqueta-status.status-financeiro-gerado {
  background-color: var(--up-resolvida-fundo);
  color: var(--up-resolvida);
}

/* "Enviado p/ expedicao" (a baixa do titulo mandou o pedido para a
   expedicao): o pedido seguiu adiante, no azul de "em andamento" */
.etiqueta-status.status-financeiro-enviado_expedicao {
  background-color: var(--up-status-andamento-fundo);
  color: var(--up-status-andamento);
}

/* "Status do pedido" do Contas a Receber (02/10/2026, titulos_grade.js): a
   etiqueta do passo atual do Pedido de Faturamento e, ao lado, "feitos/total"
   em cinza; o passo a passo inteiro vem no title */
.status-pedido {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  max-width: 100%;
  cursor: help;
}

.status-pedido .etiqueta-status {
  overflow: hidden;
  text-overflow: ellipsis;
}

.status-pedido-passos {
  flex: none;
  font-size: 11px;
  color: var(--up-texto-suave);
}

.etiqueta-status.sessao-parada,
.etiqueta-status.tom-aviso {
  background-color: var(--up-intervencao-fundo);
  color: var(--up-intervencao);
}

.etiqueta-status.tom-erro {
  background-color: var(--up-pendencia-fundo);
  color: var(--up-pendencia);
}

/* "Derrubar": acao que desconecta alguem, entao contornada em vermelho (o
   mesmo da recusa) e so enche no hover. "Liberar" e o oposto -- tira um
   bloqueio --, no petroleo do "Alterar". */
.botao-derrubar {
  display: inline-flex;
  align-items: center;
  gap: 0.3rem;
  padding: 0.1rem 0.55rem;
  border: 1px solid var(--up-pendencia);
  border-radius: 4px;
  background-color: #fff;
  font-family: var(--up-fonte);
  font-size: 11px;
  font-weight: 700;
  color: var(--up-pendencia);
  cursor: pointer;
}

.botao-derrubar:hover,
.botao-derrubar:focus-visible {
  background-color: var(--up-pendencia);
  color: #fff;
}

.botao-derrubar.botao-liberar {
  border-color: var(--up-acao-alterar);
  color: var(--up-acao-alterar);
}

.botao-derrubar.botao-liberar:hover,
.botao-derrubar.botao-liberar:focus-visible {
  background-color: var(--up-acao-alterar);
  color: #fff;
}

.botao-derrubar:disabled {
  opacity: 0.55;
  cursor: not-allowed;
}

/* Dialogo do apelido do IP: pequeno, na mesma densidade do "Editar cliente" */
.dialogo-medio.dialogo-apelido {
  width: min(26rem, calc(100vw - 3rem));
}

.dialogo-medio.dialogo-apelido[open] {
  display: flex;
  flex-direction: column;
}

.dialogo-apelido .bloco-campos {
  gap: 0.6rem 0.75rem;
  padding: 0.9rem 1.25rem;
  border: 0;
}

.dialogo-apelido .campo label {
  font-size: 10.5px;
  line-height: 1.25;
}

.dialogo-apelido .campo input[type="text"] {
  padding: 2px 4px;
  font-size: 11.5px;
  line-height: 1.35;
  border-radius: 3px;
}

.dialogo-apelido .campo input[readonly] {
  background-color: var(--up-cinza-frio);
  color: var(--up-cinza-chumbo);
}

.dialogo-apelido .dialogo-rodape {
  flex: 0 0 auto;
  gap: 0.5rem;
  padding: 0.6rem 1.25rem;
}

/* ==========================================================================
   Painel Status retirada (Expedicao > Status, 25/09/2026)
   Pagina propria, fora da casca do ERP, feita para ficar numa tela a vista
   do cliente que espera a mercadoria: letra grande, alto contraste, nada
   clicavel. Mesmo papel de parede do login para parecer do mesmo sistema.

   Desenho de painel de lanchonete (pedido do cliente, 25/09/2026), no lugar
   da grade unica de cartoes da primeira versao: tres colunas -- Aguardando
   separacao | Chamando agora | Ultimos chamados. A do meio e a maior e a
   unica com fundo cheio no cabecalho: e para onde o olho vai.
   Cabecalho, faixa de instrucao e rodape fixos; as colunas ocupam o resto e
   NAO rolam (numa TV ninguem rola) -- o contador no cabecalho da coluna diz
   quantos ha quando nao cabem todos.
   ========================================================================== */

.corpo-status {
  margin: 0;
  font-family: var(--up-fonte);
  color: var(--up-texto);
  background: var(--up-papel-parede) url("/static/img/fundo-login.svg") center / cover no-repeat fixed;
}

.status-painel {
  box-sizing: border-box;
  display: grid;
  grid-template-rows: auto auto 1fr auto;
  height: 100vh;
}

.status-topo {
  display: flex;
  align-items: center;
  gap: 2rem;
  padding: 0.7rem 2.5rem;
  background-color: #fff;
  box-shadow: var(--up-sombra-menu);
}

.status-logo {
  height: 2.6rem;
  flex-shrink: 0;
}

.status-titulo {
  flex: 1 1 auto;
  min-width: 0;
}

.status-titulo h1 {
  margin: 0;
  font-size: clamp(1.4rem, 2.6vw, 2.3rem);
  font-weight: 700;
  color: var(--up-marca-escura);
}

.status-titulo p {
  margin: 0.1rem 0 0;
  overflow: hidden;
  font-size: clamp(0.95rem, 1.3vw, 1.2rem);
  color: var(--up-texto-suave);
  text-overflow: ellipsis;
  white-space: nowrap;
}

.status-relogio {
  display: flex;
  flex-direction: column;
  align-items: flex-end;
  flex-shrink: 0;
  line-height: 1.1;
}

.status-relogio strong {
  font-size: clamp(1.6rem, 3vw, 2.6rem);
  font-weight: 700;
  font-variant-numeric: tabular-nums;
  color: var(--up-marca-escura);
}

.status-relogio span {
  font-size: 0.95rem;
  color: var(--up-texto-suave);
}

/* "Viu seu nome? Va ao caixa": a faixa azul das perguntas dos dialogos
   (.sucesso-pergunta), no tamanho de quem le de longe */
.status-instrucao {
  display: flex;
  align-items: center;
  gap: 0.85rem;
  margin: 1rem 2.5rem 0;
  padding: 0.6rem 1.25rem;
  border-left: 6px solid var(--up-status-andamento);
  border-radius: 8px;
  background-color: var(--up-status-andamento-fundo);
  font-size: clamp(1rem, 1.5vw, 1.3rem);
  color: var(--up-texto);
}

.status-instrucao .icone {
  flex-shrink: 0;
  color: var(--up-status-andamento);
}

.status-instrucao strong {
  color: var(--up-status-pronto);
}

/* --- As tres colunas ------------------------------------------------------ */

/* As laterais ganharam largura (eram 1fr | 1.5fr | 1fr) para o nome caber
   inteiro em mais linhas; o cartao do meio continua folgado */
.status-colunas {
  display: grid;
  grid-template-columns: 1.2fr 1fr 1.2fr;
  gap: 1.25rem;
  min-height: 0;
  padding: 1rem 2.5rem;
}

/* O tom de cada coluna (--tom / --tom-fundo) pinta o cabecalho, o
   contador e os numeros: ambar na fila, verde onde o pedido ja esta pronto */
.status-coluna {
  --tom: var(--up-status-espera);
  --tom-fundo: var(--up-status-espera-fundo);
  display: flex;
  flex-direction: column;
  min-height: 0;
  overflow: hidden;
  border-radius: 10px;
  background-color: #fff;
  box-shadow: var(--up-sombra-login);
}

.coluna-chamando,
.coluna-chamados {
  --tom: var(--up-status-pronto);
  --tom-fundo: var(--up-status-pronto-fundo);
}

/* altura minima comum: o "Ultimos chamados" tem a segunda linha
   (Aguardando pagamento) e os tres cabecalhos precisam alinhar */
.coluna-cabecalho {
  box-sizing: border-box;
  display: flex;
  align-items: center;
  gap: 0.6rem;
  min-height: 4.2rem;
  padding: 0.6rem 1.1rem;
  border-bottom: 3px solid var(--tom);
  background-color: var(--tom-fundo);
  color: var(--tom);
}

.coluna-cabecalho .icone {
  flex-shrink: 0;
}

.coluna-cabecalho h2 {
  flex: 1 1 auto;
  min-width: 0;
  margin: 0;
  font-size: clamp(1.1rem, 1.6vw, 1.45rem);
  font-weight: 700;
  line-height: 1.15;
}

.coluna-cabecalho small {
  display: block;
  font-size: 0.62em;
  font-weight: 700;
  letter-spacing: 0.05em;
  text-transform: uppercase;
  opacity: 0.8;
}

/* o "Chamando agora" e o destaque: cabecalho cheio, texto branco, centrado */
.coluna-chamando .coluna-cabecalho {
  justify-content: center;
  background-color: var(--tom);
  color: #fff;
}

.coluna-chamando .coluna-cabecalho h2 {
  flex: 0 1 auto;
  font-size: clamp(1.3rem, 2vw, 1.8rem);
}

.coluna-contagem {
  flex-shrink: 0;
  min-width: 2.2rem;
  padding: 0.1rem 0.6rem;
  border-radius: 999px;
  background-color: var(--tom);
  font-size: 1.05rem;
  font-weight: 700;
  text-align: center;
  color: #fff;
}

/* Colunas laterais: uma linha por pedido, numero e nome lado a lado */
/* `relative`: o encaixar (status_retirada.js) mede o offsetTop das linhas
   a partir da propria lista */
.coluna-lista {
  position: relative;
  flex: 1 1 auto;
  min-height: 0;
  margin: 0;
  padding: 0;
  overflow: hidden;
  list-style: none;
}

/* Pedido do cliente (26/09/2026): as colunas laterais sao 10 FAIXAS de
   altura igual que enchem o quadro -- nem sobra embaixo, nem linha cortada
   -- e o NOME vai INTEIRO, nunca com reticencias. O status_retirada.js
   (encaixar) divide a altura livre da lista por 10 e poe em --linha; a
   altura da linha e as letras saem dela, entao crescem numa TV grande e
   encolhem num monitor pequeno sem nunca passar de 10 por coluna. O nome
   cabe em ate duas linhas da faixa (2 x 0.36 x 1.15 = 83% da altura).
   Antes as medidas seguiam o vh da tela, e com poucos pedidos sobrava meio
   quadro em branco e letra miuda. */
.coluna-item {
  box-sizing: border-box;
  display: flex;
  align-items: center;
  gap: 0.75rem;
  height: var(--linha, 3rem);
  padding: 0 1rem;
  overflow: hidden;
  border-bottom: 1px solid var(--up-borda-suave);
}

.coluna-item[hidden] {
  display: none;
}

.item-numero {
  flex-shrink: 0;
  font-size: calc(var(--linha, 3rem) * 0.52);
  font-weight: 700;
  font-variant-numeric: tabular-nums;
  color: var(--up-marca-escura);
}

.coluna-chamados .item-numero {
  color: var(--tom);
}

.item-cliente {
  min-width: 0;
  font-size: calc(var(--linha, 3rem) * 0.36);
  font-weight: 600;
  line-height: 1.15;
  overflow-wrap: anywhere;
}

.coluna-vazia {
  margin: auto;
  padding: 2rem 1rem;
  font-size: clamp(1rem, 1.3vw, 1.2rem);
  text-align: center;
  color: var(--up-texto-suave);
}

.coluna-lista[hidden],
.chamando-lista[hidden],
.coluna-vazia[hidden] {
  display: none;
}

/* Coluna do meio: no maximo 2 pedidos por vez (o resto espera a vez --
   expedicao_service._fila_de_chamada), um EMBAIXO do outro, dividindo a
   altura por igual; um sozinho fica com o quadro todo. Antes os cartoes
   tinham altura propria e, com 3 ou mais chamados juntos, estouravam o
   quadro e saiam cortados (26/09/2026).

   `container-type: size` em cada cartao: as letras de dentro medem o
   PROPRIO cartao (cqh/cqw) e encolhem junto com ele -- dois cartoes tem
   letra menor que um so, e nada passa da borda. O ajustarChamadas do JS
   ainda diminui o nome que nao coube. */
.chamando-lista {
  position: relative;
  flex: 1 1 auto;
  display: grid;
  grid-auto-rows: 1fr;
  gap: 1rem;
  min-height: 0;
  margin: 0;
  padding: 1.25rem;
  list-style: none;
}

.chamada {
  container-type: size;
  position: relative;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  gap: 3cqh;
  min-width: 0;
  min-height: 0;
  overflow: hidden;
  padding: 1rem;
  border: 2px solid var(--tom-fundo);
  border-radius: 12px;
  background-color: #fff;
  text-align: center;
}

.chamada-numero {
  font-size: clamp(1.8rem, min(24cqh, 17cqw), 6.5rem);
  font-weight: 700;
  line-height: 1;
  font-variant-numeric: tabular-nums;
  color: var(--up-marca-escura);
}

.chamada-cliente {
  max-width: 100%;
  font-size: clamp(1rem, min(10cqh, 6.4cqw), 2.6rem);
  font-weight: 600;
  line-height: 1.2;
  overflow-wrap: anywhere;
}

/* a etiqueta verde cheia, com o brilho que passa devagar (abaixo) */
.chamada-aviso {
  position: relative;
  overflow: hidden;
  flex-shrink: 0;
  padding: 0.4em 1.1em;
  border-radius: 999px;
  background-color: var(--tom);
  font-size: clamp(0.85rem, min(6cqh, 3.8cqw), 1.5rem);
  font-weight: 700;
  letter-spacing: 0.05em;
  text-transform: uppercase;
  color: #fff;
}

.chamando-vazio {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 0.75rem;
}

.chamando-vazio p {
  margin: 0;
}

.chamando-vazio-icone {
  display: flex;
  align-items: center;
  justify-content: center;
  width: 5rem;
  height: 5rem;
  border: 4px solid var(--up-status-pronto-fundo);
  border-radius: 50%;
  color: var(--tom);
}

.status-rodape {
  display: flex;
  align-items: center;
  gap: 0.5rem;
  padding: 0.6rem 2.5rem;
  background-color: rgba(255, 255, 255, 0.85);
  font-size: 0.9rem;
  color: var(--up-texto-suave);
}

/* verde = a ultima consulta deu certo; vermelho = sem resposta (o que esta
   na tela e o que chegou por ultimo) */
.status-sinal {
  width: 0.6rem;
  height: 0.6rem;
  border-radius: 50%;
  background-color: var(--up-resolvida);
}

.status-sinal.falhou {
  background-color: var(--up-pendencia);
}

/* Botao da chamada por voz, na ponta direita do rodape: discreto enquanto
   desligado (so quem liga o painel precisa dele), verde quando a voz esta
   ativa -- de longe da para ver se o painel vai falar. */
.status-voz {
  display: inline-flex;
  align-items: center;
  gap: 0.4rem;
  margin-left: auto;
  padding: 0.3rem 0.8rem;
  border: 1px solid var(--up-borda);
  border-radius: 999px;
  background-color: #fff;
  font-family: var(--up-fonte);
  font-size: 0.85rem;
  font-weight: 700;
  color: var(--up-texto-suave);
  cursor: pointer;
}

.status-voz:hover:enabled {
  border-color: var(--up-status-pronto);
  color: var(--up-status-pronto);
}

.status-voz.ativa {
  border-color: var(--up-status-pronto);
  background-color: var(--up-status-pronto-fundo);
  color: var(--up-status-pronto);
}

.status-voz:disabled {
  opacity: 0.55;
  cursor: not-allowed;
}

/* --- Chegada (25/09/2026) -------------------------------------------------
   Pedido do cliente: um efeito que chame a atencao sem exagero quando o
   pedido fica disponivel para pagamento. So o que CHEGA a uma coluna com o
   painel aberto anima -- quem ja estava ao abrir a pagina, nao:
     * no "Chamando agora": o cartao entra com um leve "pulo", um anel verde
       que se desfaz e um estouro de confetes saindo da etiqueta
       (status_retirada.js cria os pedacos com direcao, giro e cor
       sorteados; somem em ~2s);
     * nas laterais: a linha desliza para o lugar com o fundo do tom da
       coluna, que se apaga devagar;
     * enquanto o cartao chamado estiver na tela, um brilho passa pela
       etiqueta "Dirija-se ao caixa" -- o lembrete que continua. */

.chamada.chegou {
  z-index: 1;
  animation: status-chegada 0.6s cubic-bezier(0.2, 0.9, 0.3, 1.3),
    status-anel 1.8s ease-out 0.2s;
}

.coluna-item.chegou {
  animation: status-entrada 0.5s ease-out, status-realce 2s ease-out;
}

/* na frente do cartao que chegou (z-index 1 durante a chegada): os pedacos
   ficam na lista, fora do cartao, que corta o que passa da borda dele */
.confete {
  position: absolute;
  z-index: 2;
  width: 7px;
  height: 11px;
  margin: -5px 0 0 -3px;
  border-radius: 1px;
  pointer-events: none;
  opacity: 0;
  animation: status-confete 1.6s cubic-bezier(0.15, 0.7, 0.35, 1) var(--atraso) forwards;
}

.confete-redondo {
  width: 8px;
  height: 8px;
  border-radius: 50%;
}

.chamada-aviso::after {
  content: "";
  position: absolute;
  inset: 0;
  background: linear-gradient(
    100deg,
    transparent 30%,
    rgba(255, 255, 255, 0.55) 50%,
    transparent 70%
  );
  transform: translateX(-100%);
  animation: status-brilho 3.5s ease-in-out 1s infinite;
}

@keyframes status-chegada {
  0% { opacity: 0; transform: scale(0.85); }
  60% { opacity: 1; transform: scale(1.04); }
  100% { transform: scale(1); }
}

@keyframes status-anel {
  from { box-shadow: 0 0 0 0 color-mix(in srgb, var(--up-status-pronto) 45%, transparent); }
  to { box-shadow: 0 0 0 18px transparent; }
}

@keyframes status-entrada {
  from { opacity: 0; transform: translateX(-12px); }
  to { opacity: 1; transform: translateX(0); }
}

@keyframes status-realce {
  from { background-color: var(--tom-fundo); }
  to { background-color: transparent; }
}

@keyframes status-confete {
  0% { opacity: 1; transform: translate(0, 0) rotate(0); }
  45% { opacity: 1; transform: translate(var(--dx), var(--dy)) rotate(calc(var(--giro) * 0.5)); }
  100% { opacity: 0; transform: translate(calc(var(--dx) * 1.15), var(--queda)) rotate(var(--giro)); }
}

@keyframes status-brilho {
  0% { transform: translateX(-100%); }
  40%, 100% { transform: translateX(100%); }
}

@media (prefers-reduced-motion: reduce) {
  .chamada.chegou,
  .coluna-item.chegou,
  .chamada-aviso::after {
    animation: none;
  }
}

/* Tela estreita (celular, monitor em pe): as colunas se empilham, o
   "Chamando agora" primeiro, e a pagina passa a rolar */
@media (max-width: 900px) {
  .status-painel {
    height: auto;
    min-height: 100vh;
  }

  .status-topo {
    flex-wrap: wrap;
    gap: 0.75rem 1rem;
    padding: 0.85rem 1rem;
  }

  .status-relogio {
    display: none;
  }

  .status-instrucao {
    margin: 1rem 1rem 0;
  }

  .status-colunas {
    grid-template-columns: 1fr;
    padding: 1rem;
  }

  .coluna-chamando {
    order: -1;
  }

  .coluna-lista {
    overflow: visible;
  }

  /* sem as 10 faixas: cada linha no tamanho do seu conteudo */
  .coluna-item {
    height: auto;
    padding: 0.55rem 1rem;
  }

  .item-numero {
    font-size: 1.4rem;
  }

  .item-cliente {
    font-size: 1rem;
  }

  .status-rodape {
    padding-left: 1rem;
    padding-right: 1rem;
  }
}

/* ==========================================================================
   Financeiro: Contas a Pagar / a Receber e Baixa -- visual "modelo A"
   (28/09/2026, escolha do cliente entre dois modelos: "esta muito simples,
   parece sistema antigo"). Vale para #formTitulo (incluir e a tela de dois
   cliques) e #formBaixa, marcados com `.fin-tela`.

   O que muda em relacao ao resto da casa, de proposito:
   - cada assunto vira um CARTAO branco com icone, sobre o fundo claro
     (`.painel-fin`), no lugar do `.bloco-campos` de borda fina;
   - uma COLUNA LATERAL com o que o operador consulta enquanto digita:
     parcelas (incluir), situacao e movimentos (dois cliques), o resumo com
     os totais e os botoes (baixa);
   - campos de 31px, fonte 13px. Estes dois formularios SAIRAM das listas de
     campo compacto (10.5/11.5px, "medidas da casa") por isso.
   - TELA FIXA (28/09/2026, segundo pedido: "a barra de rolagem atrapalha").
     A tela ocupa a altura do card e so rolam as LISTAS que crescem
     (`.fin-rolagem`: parcelas, movimentos, lancamentos da baixa) e a tabela
     de documentos da baixa quando sao muitos. A primeira versao (36px, sem
     cadeia de altura) rolava o card inteiro numa tela de notebook.
   Os campos, ids e a ordem de gravacao sao os mesmos de antes: so a
   aparencia mudou.
   ========================================================================== */

.painel-fin {
  padding-top: 0.65rem;
  background-color: var(--up-papel-parede);
}

/* --- Tela fixa: a cadeia de altura ------------------------------------------
   `.painel` (flex 1, rola) -> form (flex 1) -> `.fin-corpo` (flex 1, grade
   esticada) -> colunas -> cartao que cresce -> `.fin-rolagem`. O form NAO
   ganha `min-height: 0`: numa janela baixa demais ele fica do tamanho minimo
   do conteudo e o `.painel` volta a rolar, em vez de cortar campo. O que
   deixa esse minimo pequeno e a lista da `.fin-rolagem` ser `absolute` --
   ela nao conta na altura, so a `min-height` da caixa conta. */

#formTitulo.fin-tela,
#formBaixa.fin-tela {
  flex: 1 1 auto;
}

.fin-tela > * {
  flex-shrink: 0;
}

.fin-cartao-cresce {
  display: flex;
  flex: 1 1 auto;
  flex-direction: column;
}

.fin-rolagem {
  position: relative;
  flex: 1 1 auto;
  min-height: 7rem;
}

.fin-rolagem > * {
  position: absolute;
  inset: 0;
  overflow-y: auto;
}

.fin-rolagem-curta {
  min-height: 2.75rem;
}

/* --- Cabecalho da tela ---------------------------------------------------- */

.fin-cabecalho {
  display: flex;
  justify-content: space-between;
  align-items: flex-end;
  gap: 1rem;
  margin-bottom: 0.6rem;
}

/* "CONTAS A RECEBER" / "BAIXA ..." como etiqueta ANTES do titulo, na mesma
   linha -- era uma linha propria em cima dele; saiu para a tela caber sem
   rolar */
.fin-sobretitulo {
  padding: 0.15rem 0.55rem;
  border-radius: 999px;
  background-color: var(--up-primaria-fundo);
  font-size: 10.5px;
  font-weight: 700;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: var(--up-primaria);
  white-space: nowrap;
}

.fin-titulo-linha {
  display: flex;
  align-items: center;
  flex-wrap: wrap;
  gap: 0.65rem;
}

.fin-titulo {
  margin: 0;
  font-size: 20px;
  font-weight: 700;
  color: var(--up-marca-escura);
}

/* na mesma linha do titulo (e da etiqueta): uma linha a menos de altura */
.fin-subtitulo {
  margin: 0.15rem 0 0;
  font-size: 12.5px;
  color: var(--up-cinza-chumbo);
}

/* numero automatico do Incluir: tracejado = previa, nao esta reservado */
.fin-selo {
  display: inline-flex;
  align-items: center;
  gap: 0.5rem;
  padding: 0.4rem 0.8rem;
  border: 1px dashed var(--up-primaria-claro);
  border-radius: 10px;
  background-color: var(--up-superficie);
  font-size: 12.5px;
  font-weight: 700;
  color: var(--up-primaria-escuro);
  white-space: nowrap;
}

/* etiqueta de situacao: os mesmos tons da grade (titulo_service.linha_grade) */
.fin-situacao {
  display: inline-flex;
  align-items: center;
  height: 1.45rem;
  padding: 0 0.7rem;
  border-radius: 999px;
  background-color: var(--up-cinza-frio);
  font-size: 12px;
  font-weight: 700;
  color: var(--up-cinza-chumbo);
}

.fin-situacao.tom-aviso {
  background-color: var(--up-intervencao-fundo);
  color: var(--up-intervencao);
}

.fin-situacao.tom-erro {
  background-color: var(--up-pendencia-fundo);
  color: var(--up-pendencia);
}

.fin-situacao.tom-ok {
  background-color: var(--up-resolvida-fundo);
  color: var(--up-resolvida);
}

.fin-aviso {
  display: flex;
  align-items: center;
  gap: 0.6rem;
  margin: 0 0 0.75rem;
  padding: 0.4rem 0.8rem;
  border-radius: 9px;
  background-color: var(--up-primaria-fundo);
  font-size: 12.5px;
  color: var(--up-primaria-escuro);
}

/* --- Corpo: coluna de cartoes + coluna lateral ---------------------------- */

/* `.painel-aba.ativa` e `display: block`; aqui a aba unica vira a grade, que
   toma a altura que sobra e estica as duas colunas ate o rodape */
.fin-corpo.painel-aba.ativa {
  display: grid;
  flex: 1 1 auto;
  grid-template-columns: minmax(0, 1fr) 340px;
  gap: 1rem;
}

.fin-coluna,
.fin-lateral {
  display: flex;
  flex-direction: column;
  gap: 0.65rem;
  min-width: 0;
}

/* janela baixa demais (o `.painel` volta a rolar): o resumo da baixa
   acompanha a rolagem */
.fin-lateral-fixa {
  position: sticky;
  top: 0;
  align-self: start;
}

@media (max-width: 1100px) {
  .fin-corpo.painel-aba.ativa {
    grid-template-columns: minmax(0, 1fr);
  }

  .fin-lateral-fixa {
    position: static;
  }
}

.fin-cartao {
  padding: 0.65rem 1rem 0.75rem;
  border: 1px solid var(--up-borda-suave);
  border-radius: 12px;
  background-color: var(--up-superficie);
  box-shadow: var(--up-sombra-cartao-leve);
}

.fin-cartao-titulo {
  display: flex;
  align-items: center;
  gap: 0.55rem;
  margin: 0 0 0.5rem;
  font-size: 14px;
  font-weight: 700;
  color: var(--up-marca-escura);
}

.fin-icone {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  flex-shrink: 0;
  width: 24px;
  height: 24px;
  border-radius: 7px;
  background-color: var(--up-primaria-fundo);
  color: var(--up-primaria);
}

/* logo abaixo do titulo, alinhada com o texto dele (icone 24px + gap) */
.fin-cartao-nota {
  margin: -0.35rem 0 0.55rem 2.05rem;
  font-size: 12px;
  color: var(--up-cinza-chumbo);
}

/* dentro do cartao a grade de campos perde a moldura: o cartao ja e ela */
.fin-cartao .bloco-campos {
  gap: 0.55rem 0.9rem;
  padding: 0;
  border: 0;
}

/* --- Campos ----------------------------------------------------------------
   `:is()` deixa a especificidade no nivel do `.campo input` global (0,2,1),
   e as excecoes abaixo (icone, prefixo, contador, travado, recusado) vencem
   por virem depois. */

.fin-tela .campo {
  gap: 0.2rem;
}

.fin-tela .campo label {
  display: flex;
  align-items: center;
  gap: 0.3rem;
  font-size: 11px;
  font-weight: 700;
  letter-spacing: 0.02em;
  color: var(--up-cinza-chumbo);
}

/* cadeado dos campos travados pela regra do Uniplus */
.fin-tela .campo label .icone {
  color: var(--up-texto-suave);
}

.fin-tela .campo :is(input, select, textarea) {
  height: 1.95rem;
  padding: 0.2rem 0.6rem;
  border: 1px solid var(--up-borda);
  border-radius: 7px;
  font-size: 13px;
  color: var(--up-texto);
  background-color: var(--up-superficie);
}

.fin-tela .campo :is(input, select, textarea):focus {
  outline: 0;
  border-color: var(--up-primaria);
  box-shadow: 0 0 0 3px var(--up-primaria-fundo);
}

.fin-tela .campo :is(input, select):disabled {
  border-color: var(--up-borda-suave);
  background-color: var(--up-cinza-frio);
  color: var(--up-cinza-chumbo);
}

.fin-tela .campo input.campo-invalido {
  border-color: var(--up-primaria);
  box-shadow: 0 0 0 2px var(--up-primaria-fundo);
}

.fin-tela .campo input[type="checkbox"] {
  width: auto;
  height: auto;
}

.fin-tela .campo .num {
  text-align: right;
  font-variant-numeric: tabular-nums;
}

.fin-com-icone,
.fin-com-prefixo {
  position: relative;
}

.fin-com-icone .icone {
  position: absolute;
  top: 50%;
  left: 0.65rem;
  transform: translateY(-50%);
  color: var(--up-texto-suave);
  pointer-events: none;
}

.fin-tela .fin-com-icone input {
  padding-left: 2rem;
}

.fin-com-prefixo span {
  position: absolute;
  top: 50%;
  left: 0.7rem;
  transform: translateY(-50%);
  font-size: 13px;
  font-weight: 700;
  color: var(--up-cinza-chumbo);
  pointer-events: none;
}

.fin-tela .fin-com-prefixo input {
  padding-left: 2.2rem;
  text-align: right;
  font-size: 14px;
  font-weight: 700;
  color: var(--up-marca-escura);
}

/* Parcelas: - [ 3 ] + */
.fin-contador {
  display: flex;
  height: 1.95rem;
  overflow: hidden;
  border: 1px solid var(--up-borda);
  border-radius: 7px;
  background-color: var(--up-superficie);
}

.fin-contador:focus-within {
  border-color: var(--up-primaria);
  box-shadow: 0 0 0 3px var(--up-primaria-fundo);
}

.fin-contador button {
  flex: 0 0 2.2rem;
  border: 0;
  background-color: var(--up-cinza-frio);
  font-size: 17px;
  font-weight: 700;
  line-height: 1;
  color: var(--up-primaria);
}

.fin-contador button:hover {
  background-color: var(--up-primaria-fundo);
}

.fin-tela .fin-contador input {
  height: 100%;
  min-width: 0;
  border: 0;
  border-radius: 0;
  text-align: center;
  font-weight: 700;
}

.fin-tela .fin-contador input:focus {
  box-shadow: none;
}

/* --- Parcelas do Incluir (cartoes montados pelo titulos_form.js) ---------- */

/* ate 60 parcelas: rola dentro da `.fin-rolagem`; a soma fica sempre a vista.
   O respiro da direita separa os cartoes da barra de rolagem. */
.fin-parcelas {
  display: flex;
  flex-direction: column;
  gap: 0.5rem;
  padding-right: 0.25rem;
}

.fin-parcela {
  display: flex;
  flex-direction: column;
  flex-shrink: 0;
  gap: 0.35rem;
  padding: 0.5rem 0.65rem;
  border: 1px solid var(--up-borda-suave);
  border-radius: 10px;
}

.fin-parcela-topo {
  display: flex;
  justify-content: space-between;
  align-items: center;
  gap: 0.5rem;
}

.fin-parcela-doc {
  display: flex;
  align-items: center;
  gap: 0.5rem;
  min-width: 0;
  overflow-wrap: anywhere;
  font-size: 13px;
  font-weight: 700;
  color: var(--up-marca-escura);
}

.fin-parcela-numero {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  flex-shrink: 0;
  width: 22px;
  height: 22px;
  border-radius: 50%;
  background-color: var(--up-primaria);
  font-size: 11.5px;
  color: var(--up-superficie);
}

.fin-parcela-valor {
  font-size: 14px;
  font-weight: 700;
  font-variant-numeric: tabular-nums;
  color: var(--up-marca-escura);
  white-space: nowrap;
}

.fin-parcela-datas {
  display: flex;
  gap: 0.5rem;
}

.fin-parcela-datas label {
  display: flex;
  flex: 1;
  flex-direction: column;
  gap: 0.15rem;
  min-width: 0;
  font-size: 10.5px;
  font-weight: 700;
  color: var(--up-cinza-chumbo);
}

.fin-parcela-datas input {
  width: 100%;
  min-width: 0;
  height: 1.7rem;
  padding: 0.1rem 0.4rem;
  border: 1px solid var(--up-borda);
  border-radius: 6px;
  font-family: var(--up-fonte);
  font-size: 12.5px;
  color: var(--up-texto);
  background-color: var(--up-superficie);
}

.fin-parcela-datas input:focus {
  outline: 0;
  border-color: var(--up-primaria);
  box-shadow: 0 0 0 3px var(--up-primaria-fundo);
}

.fin-soma {
  display: flex;
  justify-content: space-between;
  align-items: baseline;
  gap: 0.5rem;
  margin-top: 0.6rem;
  padding: 0.55rem 0.85rem;
  border-radius: 10px;
  background-color: var(--up-primaria-fundo);
}

.fin-soma span {
  font-size: 11px;
  font-weight: 700;
  letter-spacing: 0.05em;
  text-transform: uppercase;
  color: var(--up-primaria-escuro);
}

.fin-soma strong {
  font-size: 18px;
  font-variant-numeric: tabular-nums;
  color: var(--up-marca-escura);
}

/* --- Valores em destaque, barra e linhas de resumo ------------------------ */

.fin-rotulo-forte {
  font-size: 11px;
  font-weight: 700;
  letter-spacing: 0.05em;
  text-transform: uppercase;
  color: var(--up-cinza-chumbo);
}

.fin-valor-grande {
  margin: 0 0 0.5rem;
  font-size: 26px;
  font-weight: 700;
  line-height: 1.15;
  font-variant-numeric: tabular-nums;
  color: var(--up-marca-escura);
}

.fin-barra {
  height: 8px;
  overflow: hidden;
  border-radius: 999px;
  background-color: var(--up-primaria-fundo);
}

.fin-barra span {
  display: block;
  width: 0;
  height: 100%;
  border-radius: inherit;
  background-color: var(--up-primaria);
  transition: width 0.25s ease;
}

@media (prefers-reduced-motion: reduce) {
  .fin-barra span {
    transition: none;
  }
}

.fin-barra-legenda {
  display: flex;
  justify-content: space-between;
  margin: 0.3rem 0;
  font-size: 12px;
  color: var(--up-cinza-chumbo);
}

.fin-linhas {
  margin: 0;
}

.fin-linhas > div {
  display: flex;
  justify-content: space-between;
  gap: 1rem;
  padding: 0.35rem 0;
  border-bottom: 1px solid var(--up-borda-suave);
  font-size: 13px;
}

.fin-linhas > div:last-child {
  border-bottom: 0;
}

.fin-linhas dt {
  font-weight: 400;
  color: var(--up-cinza-chumbo);
}

.fin-linhas dd {
  margin: 0;
  font-weight: 700;
  font-variant-numeric: tabular-nums;
  color: var(--up-texto);
  white-space: nowrap;
}

/* a linha tracejada separa as parcelas da conta do total */
.fin-linhas > .fin-linha-corte {
  margin-bottom: 0.55rem;
  padding-bottom: 0.55rem;
  border-bottom: 1px dashed var(--up-borda);
}

.fin-linhas dd.fin-acrescimo {
  color: var(--up-intervencao);
}

/* --- Movimentos do titulo (dois cliques) ---------------------------------- */

.fin-movimentos {
  margin: 0;
  padding: 0 0.25rem 0 0;
  list-style: none;
}

.fin-movimentos li {
  position: relative;
  padding: 0 0 0.7rem 1.35rem;
}

/* bolinha do evento e o fio da linha do tempo ate o proximo */
.fin-movimentos li::before {
  content: "";
  position: absolute;
  top: 0.2rem;
  left: 0;
  width: 11px;
  height: 11px;
  border-radius: 50%;
  background-color: var(--up-texto-suave);
}

.fin-movimentos li::after {
  content: "";
  position: absolute;
  top: 1.1rem;
  bottom: 0.1rem;
  left: 4.5px;
  width: 2px;
  background-color: var(--up-borda-suave);
}

.fin-movimentos li:last-child {
  padding-bottom: 0;
}

.fin-movimentos li:last-child::after {
  display: none;
}

.fin-movimentos .mov-baixa::before {
  background-color: var(--up-resolvida);
}

.fin-movimentos .mov-inclusao::before {
  background-color: var(--up-primaria);
}

.mov-linha {
  display: flex;
  justify-content: space-between;
  gap: 0.75rem;
  font-size: 13px;
  font-weight: 700;
  color: var(--up-texto);
}

.mov-linha span:last-child {
  font-variant-numeric: tabular-nums;
  white-space: nowrap;
}

.mov-detalhe {
  font-size: 12px;
  color: var(--up-cinza-chumbo);
}

/* por onde o dinheiro passou em cada movimento (pedido de 28/09/2026: "qual
   conta corrente ou meio foi usado"): uma linha por forma, com a conta */
.mov-formas {
  display: flex;
  flex-direction: column;
  gap: 0.25rem;
  margin: 0.35rem 0 0;
  padding: 0;
  list-style: none;
}

.fin-movimentos .mov-formas li {
  display: flex;
  align-items: center;
  gap: 0.45rem;
  padding: 0.25rem 0.5rem;
  border-radius: 7px;
  background-color: var(--up-papel-parede);
  font-size: 12.5px;
  color: var(--up-cinza-chumbo);
}

/* os itens da forma nao sao eventos: sem a bolinha e o fio da linha do tempo */
.fin-movimentos .mov-formas li::before,
.fin-movimentos .mov-formas li::after {
  display: none;
}

.mov-forma-icone {
  display: inline-flex;
  flex-shrink: 0;
  color: var(--up-primaria);
}

.mov-formas .tipo-caixa .mov-forma-icone {
  color: var(--up-resolvida);
}

.mov-forma-texto {
  flex: 1;
  min-width: 0;
}

.mov-forma-texto strong {
  color: var(--up-texto);
}

.mov-forma-valor {
  font-weight: 700;
  font-variant-numeric: tabular-nums;
  color: var(--up-texto);
  white-space: nowrap;
}

.mov-nota {
  margin-top: 0.2rem;
  font-size: 11.5px;
  color: var(--up-texto-suave);
}

/* de onde veio a inclusao (pedido de 01/10/2026): a mesma pilula das formas
   da baixa. Com tela para abrir, a pilula inteira vira o link (seta no fim) */
.mov-origem .tipo-manual .mov-forma-icone {
  color: var(--up-cinza-chumbo);
}

.mov-origem a {
  display: flex;
  flex: 1;
  align-items: center;
  gap: 0.45rem;
  min-width: 0;
  color: inherit;
  text-decoration: none;
}

.mov-origem-abrir {
  display: inline-flex;
  flex-shrink: 0;
  color: var(--up-texto-suave);
}

/* plano de contas com lupa (titulos_form.js, montarPlano; 01/10/2026): a
   conta ja escolhida aparece em negrito na lista, como o item marcado da
   lista dos <select> */
[data-busca="plano"] .busca-item.selecionado {
  font-weight: 700;
}

/* Fornecedor/cliente dos titulos (titulos_form.js, montarBusca; 01/10/2026):
   a previa abre ao clicar no campo, no desenho da grade de Clientes (nova
   aparencia) -- cabecalho cinza em caixa alta, linhas de 30px, codigo
   suave, iniciais + nome em destaque e o CNPJ/CPF suavizado, a pedido do
   cliente. O circulo e o nome sao os mesmos .cad-avatar/.cad-nome-texto da
   grade; as colunas sao fixas porque a lista nao se redimensiona. */
.busca-resultados.busca-entidade {
  max-height: 20rem;
  border-radius: 10px;
  box-shadow: var(--up-sombra-menu);
  /* as setas rolam a linha realcada para a vista: sem isto ela pararia
     atras do cabecalho fixo */
  scroll-padding-top: 30px;
}

.busca-entidade .busca-cabecalho,
.busca-entidade .busca-item {
  display: grid;
  grid-template-columns: 4.5rem minmax(0, 1fr) 10.5rem;
  align-items: center;
  column-gap: 0.85rem;
  padding: 0 0.85rem;
}

.busca-entidade .busca-cabecalho {
  position: sticky;
  top: 0;
  z-index: 1;
  height: 30px;
  background-color: var(--up-cinza-frio);
  border-bottom: 1px solid var(--up-borda-suave);
  font-size: 10.5px;
  font-weight: 700;
  letter-spacing: 0.04em;
  text-transform: uppercase;
  color: var(--up-texto-suave);
}

.busca-entidade .busca-cabecalho span:first-child,
.busca-entidade .be-codigo {
  text-align: right;
}

.busca-entidade .busca-item {
  height: 30px;
  border-bottom: 1px solid var(--up-borda-suave);
  font-size: 12.5px;
  color: var(--up-texto);
  cursor: pointer;
}

/* realce do mouse e das setas: o da linha marcada da grade de Clientes
   (fundo da marca + filete de 3px na borda esquerda) */
.busca-entidade .busca-item:hover,
.busca-entidade .busca-item.ativo {
  background-color: var(--up-primaria-fundo);
  box-shadow: inset 3px 0 0 var(--up-primaria);
  color: var(--up-texto);
}

.busca-entidade .be-codigo,
.busca-entidade .be-documento {
  overflow: hidden;
  font-variant-numeric: tabular-nums;
  white-space: nowrap;
  text-overflow: ellipsis;
}

.busca-entidade .be-codigo {
  color: var(--up-texto-suave);
}

.busca-entidade .be-documento {
  font-size: 12px;
  color: var(--up-texto-suave);
}

/* o ja escolhido, quando a previa reabre */
.busca-entidade .busca-item.selecionado .be-codigo {
  font-weight: 700;
  color: var(--up-primaria);
}

.busca-entidade .busca-vazio,
.busca-entidade .busca-dica {
  padding: 0.5rem 0.85rem;
  font-size: 11.5px;
  color: var(--up-texto-suave);
}

.busca-entidade .busca-dica {
  background-color: var(--up-papel-parede);
}

.mov-origem a:hover .mov-forma-texto strong,
.mov-origem a:hover .mov-origem-abrir {
  color: var(--up-primaria);
}

/* --- Baixa: documentos ------------------------------------------------------ */

/* varios documentos marcados: a tabela rola por dentro (cabecalho parado) e
   passa a vez para os lancamentos, que e onde se digita */
.fin-tabela-rolagem {
  max-height: 8.5rem;
  overflow: auto;
}

.fin-tabela {
  width: 100%;
  border-collapse: collapse;
  font-size: 13px;
}

.fin-tabela th {
  position: sticky;
  top: 0;
  z-index: 1;
  padding: 0 0.6rem 0.3rem;
  border-bottom: 1px solid var(--up-borda-suave);
  background-color: var(--up-superficie);
  font-size: 10.5px;
  font-weight: 700;
  letter-spacing: 0.05em;
  text-align: left;
  text-transform: uppercase;
  color: var(--up-cinza-chumbo);
  white-space: nowrap;
}

.fin-tabela td {
  padding: 0.25rem 0.6rem;
  border-bottom: 1px solid var(--up-borda-suave);
  white-space: nowrap;
}

/* o nome do cliente/fornecedor quebra; os numeros nao */
.fin-tabela td:nth-child(2) {
  white-space: normal;
}

.fin-tabela tbody tr:last-child td {
  border-bottom: 0;
}

.fin-tabela .num {
  text-align: right;
  font-variant-numeric: tabular-nums;
}

.fin-tabela .fin-doc {
  font-weight: 700;
  color: var(--up-marca-escura);
}

.fin-tabela .fin-forte {
  font-weight: 700;
}

.fin-atraso {
  margin-left: 0.35rem;
  padding: 0.05rem 0.45rem;
  border-radius: 999px;
  background-color: var(--up-pendencia-fundo);
  font-size: 10.5px;
  font-weight: 700;
  color: var(--up-pendencia);
}

/* "Dados da baixa" dentro do cartao dos documentos: um titulo de secao
   menor, com a linha em cima fazendo a vez da borda do cartao que saiu */
.fin-divisoria {
  display: flex;
  align-items: center;
  gap: 0.45rem;
  margin: 0.45rem 0 0.4rem;
  padding-top: 0.45rem;
  border-top: 1px solid var(--up-borda-suave);
  font-size: 12.5px;
  font-weight: 700;
  color: var(--up-marca-escura);
}

.fin-divisoria .icone {
  color: var(--up-primaria);
}

/* --- Baixa: lancamentos ------------------------------------------------------ */

/* a linha de digitar o lancamento: tracejada, como "ainda nao entrou" */
.fin-cartao .fin-novo-lancamento {
  align-items: end;
  padding: 0.5rem 0.75rem;
  border: 1px dashed var(--up-borda);
  border-radius: 10px;
  background-color: var(--up-papel-parede);
}

.fin-tela .fin-campo-botao .botao-acao {
  width: 100%;
  height: 1.95rem;
  padding-block: 0;
}

.fin-tela .fin-botao-suave {
  border-color: var(--up-primaria-claro);
  background-color: var(--up-primaria-fundo);
  color: var(--up-primaria-escuro);
}

.fin-tela .fin-botao-suave:hover {
  background-color: var(--up-primaria-claro);
  color: var(--up-marca-escura);
}

.fin-rolagem-lancamentos {
  margin-top: 0.5rem;
}

.fin-lancamentos {
  display: flex;
  flex-direction: column;
  gap: 0.45rem;
  margin: 0;
  padding: 0 0.25rem 0 0;
  list-style: none;
}

.fin-lancamento {
  display: flex;
  flex-shrink: 0;
  align-items: center;
  gap: 0.7rem;
  padding: 0.4rem 0.65rem;
  border: 1px solid var(--up-borda-suave);
  border-radius: 10px;
}

.fin-lancamento-icone {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  flex-shrink: 0;
  width: 30px;
  height: 30px;
  border-radius: 9px;
  background-color: var(--up-primaria-fundo);
  color: var(--up-primaria);
}

/* dinheiro no caixa em verde, como a entrada de dinheiro da casa */
.fin-lancamento-icone.tipo-caixa {
  background-color: var(--up-resolvida-fundo);
  color: var(--up-resolvida);
}

.fin-lancamento-texto {
  display: flex;
  flex: 1;
  flex-direction: column;
  min-width: 0;
}

.fin-lancamento-texto strong {
  font-size: 13.5px;
  color: var(--up-texto);
}

.fin-lancamento-texto small {
  font-size: 12px;
  color: var(--up-cinza-chumbo);
}

.fin-lancamento-valor {
  font-size: 14px;
  font-weight: 700;
  font-variant-numeric: tabular-nums;
  color: var(--up-marca-escura);
  white-space: nowrap;
}

.fin-lancamento-tirar {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  flex-shrink: 0;
  width: 28px;
  height: 28px;
  border: 0;
  border-radius: 7px;
  background-color: var(--up-pendencia-fundo);
  color: var(--up-acao-excluir);
}

.fin-lancamento-tirar:hover {
  background-color: var(--up-acao-excluir);
  color: var(--up-superficie);
}

.fin-lancamento-vazio {
  padding: 0.65rem;
  border-radius: 10px;
  background-color: var(--up-papel-parede);
  font-size: 12.5px;
  text-align: center;
  color: var(--up-cinza-chumbo);
}

/* --- Baixa: resumo ------------------------------------------------------------ */

.fin-resumo .fin-rotulo-forte {
  margin-top: 0.1rem;
}

/* o que falta lancar muda de cor com o sentido: ambar = parcial,
   verde = quita, vermelho = pago a mais (baixa_form.js troca a classe) */
.fin-falta {
  display: flex;
  justify-content: space-between;
  align-items: center;
  gap: 0.75rem;
  margin-top: 0.3rem;
  padding: 0.55rem 0.8rem;
  border-radius: 10px;
  background-color: var(--up-intervencao-fundo);
  color: var(--up-intervencao);
}

/* so o rotulo: o valor (#totalSaldo) e um span DENTRO do strong */
.fin-falta > span {
  font-size: 12.5px;
  font-weight: 700;
}

.fin-falta strong {
  font-size: 17px;
  font-variant-numeric: tabular-nums;
  white-space: nowrap;
}

.fin-falta.fin-falta-ok {
  background-color: var(--up-resolvida-fundo);
  color: var(--up-resolvida);
}

.fin-falta.fin-falta-mais {
  background-color: var(--up-pendencia-fundo);
  color: var(--up-pendencia);
}

.fin-resumo #campoExcedente {
  margin-top: 0.6rem;
}

.fin-acoes-resumo {
  display: flex;
  flex-direction: column;
  gap: 0.45rem;
  margin-top: 0.8rem;
}

/* --- Botoes e rodape -------------------------------------------------------- */

.fin-tela .botao-acao {
  padding: 0.5rem 1rem;
  border-radius: 7px;
  font-size: 12px;
}

.fin-tela .fin-acoes-resumo .botao-acao {
  width: 100%;
  padding-block: 0.6rem;
  font-size: 12.5px;
}

.fin-tela .rodape-formulario {
  justify-content: space-between;
  align-items: center;
  margin-top: 0.75rem;
  padding-block: 0.55rem;
}

.fin-tela .acoes-formulario {
  margin-left: auto;
}

.fin-rodape-nota {
  font-size: 12px;
  color: var(--up-cinza-chumbo);
}

/* --- Janela "Lancamentos do documento" (listagem de Contas a Pagar/Receber) --
   Mesmo visual das telas `.fin-tela` (28/09/2026): era uma tabela de grade;
   agora um cartao por lancamento, com as formas de pagamento da baixa e o
   "Estornar so esta" em cada forma (estornar e refazer). So o corpo rola;
   cabecalho e rodape ficam parados. */

.fin-dialogo {
  overflow: hidden;
  border-radius: 14px;
  background-color: var(--up-papel-parede);
}

.fin-dialogo-cabecalho {
  background-color: var(--up-superficie);
}

.fin-dialogo-cabecalho .fin-titulo {
  font-size: 18px;
}

.fin-dialogo-corpo {
  flex: 1 1 auto;
  min-height: 0;
  overflow-y: auto;
  padding: 1rem 1.25rem;
}

.fin-lanc-lista {
  display: flex;
  flex-direction: column;
  gap: 0.75rem;
}

.fin-lanc-vazio {
  margin: 0;
  padding: 1.5rem;
  border-radius: 12px;
  background-color: var(--up-superficie);
  font-size: 13px;
  text-align: center;
  color: var(--up-cinza-chumbo);
}

.fin-lanc-cartao {
  padding: 0.75rem 1rem;
  border: 1px solid var(--up-borda-suave);
  border-radius: 12px;
  background-color: var(--up-superficie);
  box-shadow: var(--up-sombra-cartao-leve);
}

.fin-lanc-topo {
  display: flex;
  align-items: center;
  gap: 0.75rem;
}

.fin-lanc-marca {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  flex-shrink: 0;
  width: 32px;
  height: 32px;
  border-radius: 9px;
  background-color: var(--up-cinza-frio);
  color: var(--up-cinza-chumbo);
}

.fin-lanc-marca.tipo-baixa {
  background-color: var(--up-resolvida-fundo);
  color: var(--up-resolvida);
}

.fin-lanc-titulo {
  display: flex;
  flex: 1;
  flex-direction: column;
  min-width: 0;
}

.fin-lanc-titulo strong {
  font-size: 14px;
  color: var(--up-marca-escura);
}

.fin-lanc-titulo small {
  font-size: 12px;
  color: var(--up-cinza-chumbo);
}

.fin-lanc-valor {
  font-size: 17px;
  font-weight: 700;
  font-variant-numeric: tabular-nums;
  color: var(--up-marca-escura);
  white-space: nowrap;
}

/* encargos, historico e formas alinhados com o texto do titulo
   (marca de 32px + o gap de 0.75rem) */
.fin-lanc-detalhe {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 0.4rem 0.6rem;
  margin: 0.45rem 0 0 2.75rem;
}

.fin-lanc-chip {
  padding: 0.1rem 0.5rem;
  border-radius: 999px;
  background-color: var(--up-intervencao-fundo);
  font-size: 11.5px;
  font-weight: 700;
  color: var(--up-intervencao);
}

.fin-lanc-hist {
  font-size: 12.5px;
  color: var(--up-cinza-chumbo);
}

.fin-lanc-formas {
  display: flex;
  flex-direction: column;
  gap: 0.4rem;
  margin: 0.55rem 0 0 2.75rem;
  padding: 0;
  list-style: none;
}

.fin-lanc-forma {
  display: flex;
  align-items: center;
  gap: 0.7rem;
  padding: 0.4rem 0.65rem;
  border: 1px solid var(--up-borda-suave);
  border-radius: 10px;
}

.fin-dialogo .botao-acao {
  padding: 0.45rem 0.9rem;
  border-radius: 7px;
  font-size: 11.5px;
}

/* estornar uma forma: discreto, para nao competir com o "Estornar baixa" */
.fin-dialogo .fin-botao-estornar-forma {
  padding: 0.3rem 0.7rem;
  border-color: var(--up-primaria-claro);
  background-color: var(--up-superficie);
  font-size: 11px;
  color: var(--up-primaria-escuro);
}

.fin-dialogo .fin-botao-estornar-forma:hover {
  background-color: var(--up-primaria-fundo);
  color: var(--up-marca-escura);
}

.fin-dialogo-rodape {
  display: flex;
  align-items: center;
  gap: 0.5rem;
  padding: 0.6rem 1.25rem;
  border-top: 1px solid var(--up-borda-suave);
  background-color: var(--up-superficie);
  font-size: 12px;
  color: var(--up-cinza-chumbo);
}

.fin-dialogo-rodape .icone {
  flex-shrink: 0;
  color: var(--up-intervencao);
}

/* ==========================================================================
   Financeiro > Geral > Conta Corrente / Caixa -- visual "modelo A"
   (28/09/2026, escolha do cliente entre tres modelos). Era uma grade AG Grid
   de linhas de 22px; virou uma faixa de RESUMO (quatro indicadores) e um
   CARTAO por conta, no mesmo acabamento do `.fin-tela` (cartao branco,
   sombra leve, fundo `.painel-fin`). Os dados e a regra de quais contas
   aparecem sao os mesmos da grade: so a aparencia mudou
   (conta_corrente_banco_cartoes.js).

   Tela fixa, como as outras do financeiro: so a area dos cartoes rola.
   ========================================================================== */

.cc-tela {
  display: flex;
  flex: 1 1 auto;
  flex-direction: column;
  gap: 0.85rem;
  min-height: 0;
}

.cc-tela > :not(.cc-rolagem) {
  flex-shrink: 0;
}

/* ferramentas a esquerda, titulo a direita: o proprio cliente trocou a
   ordem no modelo (o desenho original tinha o titulo primeiro) */
.cc-cabecalho {
  display: flex;
  justify-content: space-between;
  align-items: center;
  flex-wrap: wrap;
  gap: 0.75rem 1.5rem;
}

.cc-ferramentas {
  display: flex;
  align-items: center;
  flex-wrap: wrap;
  gap: 0.6rem;
}

.cc-titulo {
  display: flex;
  align-items: center;
  gap: 0.65rem;
}

.cc-busca,
.cc-filtro {
  display: flex;
  align-items: center;
  gap: 0.5rem;
  height: 36px;
  margin: 0;
  padding: 0 0.75rem;
  border: 1px solid var(--up-borda);
  border-radius: 9px;
  background-color: var(--up-superficie);
  color: var(--up-cinza-chumbo);
}

.cc-busca {
  width: 360px;
  max-width: 100%;
}

.cc-busca:focus-within,
.cc-filtro:focus-within {
  border-color: var(--up-primaria);
  outline: 3px solid var(--up-primaria-claro);
}

.cc-busca input {
  flex: 1 1 auto;
  min-width: 0;
  border: 0;
  outline: 0;
  background: none;
  font-family: var(--up-fonte);
  font-size: 13.5px;
  color: var(--up-texto);
}

/* Filial (select) e Contas (botao que abre as caixas de marcar): a mesma
   pilula, para a barra nao ter dois desenhos de filtro */
.cc-filtro {
  font-family: var(--up-fonte);
  font-size: 13px;
  cursor: pointer;
}

.cc-filtro select {
  border: 0;
  outline: 0;
  background: none;
  font-family: var(--up-fonte);
  font-size: 13px;
  font-weight: 700;
  color: var(--up-marca-escura);
  cursor: pointer;
}

.cc-filtro b {
  max-width: 11rem;
  overflow: hidden;
  color: var(--up-marca-escura);
  white-space: nowrap;
  text-overflow: ellipsis;
}

/* --- Filtro de contas: caixas de marcar ------------------------------------
   Pedido do cliente (28/09/2026): marcar uma, duas, tres ou todas as contas
   de uma vez -- "nao pode ser uma lista onde so escolho uma". Nenhuma
   marcada = todas; marcar todas uma a uma volta ao "Todas". */

.cc-multi {
  position: relative;
}

.cc-multi-painel {
  position: absolute;
  top: calc(100% + 6px);
  left: 0;
  z-index: 20;
  width: 280px;
  padding: 0.4rem;
  border: 1px solid var(--up-borda-suave);
  border-radius: 12px;
  background-color: var(--up-superficie);
  box-shadow: var(--up-sombra-menu);
}

.cc-multi-painel[hidden] {
  display: none;
}

.cc-multi-lista {
  max-height: 320px;
  overflow-y: auto;
}

.cc-multi-item {
  display: flex;
  align-items: center;
  gap: 0.6rem;
  margin: 0;
  padding: 0.45rem 0.6rem;
  border-radius: 8px;
  font-size: 13px;
  color: var(--up-texto);
  cursor: pointer;
}

.cc-multi-item:hover {
  background-color: var(--up-primaria-fundo);
}

.cc-multi-item input {
  width: 16px;
  height: 16px;
  margin: 0;
  accent-color: var(--up-primaria);
  cursor: pointer;
}

.cc-multi-todas {
  margin-bottom: 0.25rem;
  border-bottom: 1px solid var(--up-borda-suave);
  border-radius: 8px 8px 0 0;
  font-weight: 700;
  color: var(--up-marca-escura);
}

/* troca de filial: o servidor recalcula os saldos; os cartoes antigos
   esmaecem ate chegar a resposta, em vez de piscar vazios */
.cc-tela.carregando .cc-resumo,
.cc-tela.carregando .cc-cartoes {
  opacity: 0.5;
  transition: opacity 0.15s;
}

@media (prefers-reduced-motion: reduce) {
  .cc-tela.carregando .cc-resumo,
  .cc-tela.carregando .cc-cartoes {
    transition: none;
  }
}

/* o azul da marca, como o botao do modelo: o `.botao-navegacao` azul royal
   da barra fina das outras listas destoava dos cartoes */
.cc-tela .botao-navegacao {
  height: 36px;
  padding-inline: 1.1rem;
  border-radius: 9px;
  border-color: var(--up-primaria);
  background-color: var(--up-primaria);
  font-size: 12.5px;
}

.cc-tela .botao-navegacao:hover:enabled {
  border-color: var(--up-primaria-escuro);
  background-color: var(--up-primaria-escuro);
}

.cc-tela .botao-navegacao:disabled {
  opacity: 0.55;
  cursor: not-allowed;
}

/* --- Resumo: quatro indicadores ------------------------------------------- */

.cc-resumo {
  display: grid;
  grid-template-columns: repeat(4, minmax(0, 1fr));
  gap: 0.85rem;
}

@media (max-width: 1000px) {
  .cc-resumo {
    grid-template-columns: repeat(2, minmax(0, 1fr));
  }
}

.cc-indicador {
  display: flex;
  align-items: center;
  gap: 0.85rem;
  padding: 0.7rem 1rem;
  border: 1px solid var(--up-borda-suave);
  border-radius: 12px;
  background-color: var(--up-superficie);
  box-shadow: var(--up-sombra-cartao-leve);
}

.cc-indicador-icone {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  flex-shrink: 0;
  width: 38px;
  height: 38px;
  border-radius: 10px;
  background-color: var(--up-primaria-fundo);
  color: var(--up-primaria);
}

.cc-indicador-icone.tom-erro {
  background-color: var(--up-pendencia-fundo);
  color: var(--up-pendencia);
}

.cc-indicador-icone.tom-aviso {
  background-color: var(--up-intervencao-fundo);
  color: var(--up-intervencao);
}

.cc-rotulo {
  display: block;
  font-size: 11px;
  font-weight: 700;
  letter-spacing: 0.05em;
  text-transform: uppercase;
  color: var(--up-cinza-chumbo);
}

.cc-indicador-valor {
  font-size: 20px;
  font-weight: 700;
  font-variant-numeric: tabular-nums;
  line-height: 1.25;
  color: var(--up-marca-escura);
}

.cc-indicador-nota {
  font-size: 12px;
  color: var(--up-cinza-chumbo);
}

.cc-indicador-valor.negativo,
.cc-saldo.negativo {
  color: var(--up-dinheiro-saida);
}

/* --- Cartoes das contas ---------------------------------------------------- */

/* a lista e `absolute` dentro da caixa que cresce: rola sem empurrar a
   altura da tela (a mesma cadeia do `.fin-rolagem`) */
.cc-rolagem {
  position: relative;
  flex: 1 1 auto;
  min-height: 12rem;
}

.cc-cartoes {
  position: absolute;
  inset: 0;
  display: grid;
  /* 3 colunas, como no modelo aprovado. `auto-fill` foi descartado: num
     monitor de 1900px dava 5 por linha e a sexta conta sobrava sozinha */
  grid-template-columns: repeat(3, minmax(0, 1fr));
  grid-auto-rows: min-content;
  gap: 0.85rem;
  padding: 3px 3px 0.5rem;
  overflow-y: auto;
}

@media (max-width: 1100px) {
  .cc-cartoes {
    grid-template-columns: repeat(2, minmax(0, 1fr));
  }
}

@media (max-width: 700px) {
  .cc-cartoes {
    grid-template-columns: minmax(0, 1fr);
  }
}

.cc-vazio {
  position: absolute;
  inset: 2rem 0 auto;
  margin: 0;
  text-align: center;
  font-size: 13.5px;
  color: var(--up-cinza-chumbo);
}

.cc-cartao {
  display: flex;
  flex-direction: column;
  gap: 0.7rem;
  width: 100%;
  padding: 0.85rem 1rem;
  border: 1px solid var(--up-borda-suave);
  border-radius: 12px;
  background-color: var(--up-superficie);
  box-shadow: var(--up-sombra-cartao-leve);
  font-family: var(--up-fonte);
  text-align: left;
  color: var(--up-texto);
  cursor: pointer;
}

.cc-cartao:hover {
  border-color: var(--up-primaria-claro);
}

.cc-cartao:focus-visible {
  outline: 3px solid var(--up-primaria-claro);
  outline-offset: 0;
}

.cc-cartao.selecionado {
  border-color: var(--up-primaria);
  box-shadow: 0 0 0 3px var(--up-primaria-claro);
}

.cc-cartao-topo,
.cc-cartao-meio,
.cc-cartao-rodape {
  display: flex;
  gap: 0.75rem;
  width: 100%;
}

.cc-cartao-topo {
  align-items: center;
}

.cc-selo-banco {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  flex-shrink: 0;
  width: 40px;
  height: 40px;
  border-radius: 10px;
  background-color: var(--up-primaria-fundo);
  font-size: 12.5px;
  font-weight: 700;
  color: var(--up-primaria-escuro);
}

.cc-cartao-nome {
  display: flex;
  flex-direction: column;
  min-width: 0;
}

.cc-cartao-nome strong {
  font-size: 15px;
  color: var(--up-marca-escura);
}

.cc-cartao-nome span {
  overflow: hidden;
  font-size: 12px;
  color: var(--up-cinza-chumbo);
  white-space: nowrap;
  text-overflow: ellipsis;
}

.cc-cartao-meio {
  justify-content: space-between;
  align-items: flex-end;
}

.cc-saldo {
  display: block;
  font-size: 22px;
  font-weight: 700;
  font-variant-numeric: tabular-nums;
  color: var(--up-marca-escura);
}

.cc-agconta {
  font-size: 12px;
  text-align: right;
  color: var(--up-cinza-chumbo);
}

/* cadastro incompleto: avisa sem gritar */
.cc-agconta.vazio {
  font-style: italic;
}

.cc-cartao-rodape {
  justify-content: space-between;
  align-items: center;
  padding-top: 0.6rem;
  border-top: 1px solid var(--up-borda-suave);
  font-size: 12px;
  color: var(--up-cinza-chumbo);
}

.cc-cartao-rodape b {
  color: var(--up-texto);
}

.cc-cartao-rodape .fin-situacao {
  height: 1.35rem;
  font-size: 11.5px;
}

.cc-rodape {
  display: flex;
  align-items: center;
  justify-content: space-between;
  padding-top: 0.1rem;
}

/* ==========================================================================
   Expedicao > Entrega: as CARGAS (28/09/2026) -- entrega_lista/form/baixa.
   E os cadastros proprios dela (Motoristas, Rotas, Veiculos), que usam o
   visual compacto dos cadastros (os #formMotorista/#formRota/#formVeiculo/
   #formCarga/#formBaixaCarga entraram nas listas de seletor dos formularios
   la em cima). Nada aqui inventa cor: situacoes e eventos reaproveitam os
   tokens de status (--up-resolvida, --up-intervencao, --up-pendencia,
   --up-status-andamento).
   ========================================================================== */

/* Situacao "Fechada" da carga: o azul de "em andamento" (saiu, ainda nao
   voltou a baixa). Aberta = ambar (tom-aviso), Baixada = verde (tom-ok),
   Excluida = vermelho (tom-erro) -- ver carga_service.TOM_SITUACAO */
.etiqueta-status.tom-info {
  background-color: var(--up-status-andamento-fundo);
  color: var(--up-status-andamento);
}

/* Saldo de estoque na grade de Produtos (30/09/2026): a tarja e a mesma
   etiqueta tom-* (vermelho negativo, verde positivo, azul zerado -- ver
   produtos_grade.js). Algarismos de largura fixa e largura minima para as
   tarjas de uma coluna ficarem alinhadas pela direita, como numero. */
.grade-ag .etiqueta-saldo,
.dialogo-estoque-grade .etiqueta-saldo {
  min-width: 4.5rem;
  text-align: right;
  font-variant-numeric: tabular-nums;
}

/* na janela da grade a visao por local chega a 5+ colunas: tarja mais
   estreita para o Total caber sem rolar para o lado */
.dialogo-estoque-grade .etiqueta-saldo {
  min-width: 3rem;
}

/* --- Produtos > Opcoes > Estoque da grade (30/09/2026) -----------------------
   Modelo A escolhido pelo cliente no canvas: cabecalho com o produto, o
   alternador "Por filial / Por local de estoque", a tabela (uma linha por
   variacao, tarjas tom-* como nas colunas de estoque da grade) e o total do
   produto no pe. Largo porque a visao por local pode ter varias colunas; a
   tabela rola dentro dela em vez de esticar o dialogo. */
.dialogo-estoque-grade {
  width: min(46rem, calc(100vw - 2rem));
}

/* muitas colunas (produtos_lista.js liga a classe com mais de 3): a janela
   cresce ate 64rem antes de a tabela precisar rolar para o lado */
.dialogo-estoque-grade.estoque-grade-larga {
  width: min(64rem, calc(100vw - 2rem));
}

.estoque-grade-topo {
  display: flex;
  justify-content: space-between;
  align-items: flex-start;
  gap: 1rem;
  padding: 1rem 1.25rem 0.85rem;
  border-bottom: 1px solid var(--up-borda-suave);
}

.estoque-grade-rotulo {
  margin: 0;
  font-size: 12px;
  font-weight: 700;
  text-transform: uppercase;
  color: var(--up-azul-sky);
}

.estoque-grade-produto {
  margin: 0;
  font-size: 17px;
  font-weight: 700;
  color: var(--up-marca-escura);
}

.estoque-grade-sub,
.estoque-grade-nota {
  margin: 0;
  font-size: 12px;
  color: var(--up-texto-suave);
}

.estoque-grade-fechar {
  display: inline-flex;
  padding: 0.2rem;
  border: 0;
  background: none;
  color: var(--up-texto-suave);
}

.estoque-grade-fechar:hover,
.estoque-grade-fechar:focus-visible {
  color: var(--up-texto);
}

.estoque-grade-corpo {
  display: flex;
  flex-direction: column;
  gap: 0.75rem;
  padding: 0.9rem 1.25rem 0;
}

/* alternador em duas metades coladas; a ativa enche no azul funcional */
.estoque-grade-visao {
  display: flex;
}

.estoque-grade-alternar {
  height: 26px;
  padding: 0 0.75rem;
  border: 1px solid var(--up-borda);
  background-color: #fff;
  font-size: 12px;
  font-weight: 700;
  color: var(--up-texto);
}

.estoque-grade-alternar:first-child {
  border-radius: 4px 0 0 4px;
}

.estoque-grade-alternar:last-child {
  border-radius: 0 4px 4px 0;
  border-left: 0;
}

.estoque-grade-alternar:only-of-type,
.estoque-grade-alternar:first-child:has(+ [hidden]) {
  border-radius: 4px;
}

.estoque-grade-alternar.ativo {
  border-color: var(--up-azul-royal);
  background-color: var(--up-azul-royal);
  color: #fff;
}

.estoque-grade-tabela {
  max-height: min(22rem, calc(100vh - 20rem));
  overflow: auto;
  border: 1px solid var(--up-borda);
}

.estoque-grade-tabela table {
  width: 100%;
  border-collapse: collapse;
  font-size: 12.5px;
}

.estoque-grade-tabela th,
.estoque-grade-tabela td {
  padding: 0.3rem 0.6rem;
  border-bottom: 1px solid var(--up-borda-suave);
  white-space: nowrap;
}

.estoque-grade-tabela thead th {
  position: sticky;
  top: 0;
  background-color: var(--up-cinza-frio);
  border-bottom-color: var(--up-borda);
  font-size: 11.5px;
  text-align: left;
}

.estoque-grade-tabela .numero {
  text-align: right;
}

.estoque-grade-tabela tfoot td {
  position: sticky;
  bottom: 0;
  background-color: var(--up-cinza-frio);
  font-weight: 700;
  font-variant-numeric: tabular-nums;
}

.estoque-grade-acoes {
  justify-content: flex-end;
  padding: 0.9rem 1.25rem 1.1rem;
}

/* Exportar: acao secundaria, contornada (o cinza cheio e o do Fechar) */
.botao-up.botao-exportar-grade {
  border-color: var(--up-borda);
  background-color: #fff;
  color: var(--up-cinza-chumbo);
}

.botao-up.botao-exportar-grade:hover,
.botao-up.botao-exportar-grade:focus-visible {
  background-color: var(--up-cinza-frio);
}

/* dica embaixo do item do menu Opcoes (Produtos) */
.menu-opcoes-dica {
  margin: 0.1rem 0.5rem 0;
  font-size: 11px;
  color: var(--up-texto-suave);
  white-space: normal;
}

/* celula em destaque na grade dos cadastros (a CNH vencida do motorista) */
.grade-ag .celula-alerta {
  color: var(--up-pendencia);
  font-weight: 700;
}

/* quantos documentos a carga tem, ao lado do nome da aba */
.contador-aba {
  display: inline-block;
  min-width: 1.3rem;
  margin-left: 0.3rem;
  padding: 0 0.35rem;
  border-radius: 9px;
  background-color: var(--up-cinza-frio);
  font-size: 11px;
  font-weight: 700;
  text-align: center;
  color: var(--up-cinza-chumbo);
}

/* carga Fechada/Baixada/Excluida aberta so para consulta: o aviso fica no
   topo, antes das abas, para ninguem digitar achando que vai gravar */
.aviso-carga-consulta {
  display: flex;
  align-items: center;
  gap: 0.4rem;
  margin: 0 0 0.6rem;
  padding: 0.35rem 0.65rem;
  border-radius: 4px;
  background-color: var(--up-intervencao-fundo);
  font-size: 12px;
  color: var(--up-intervencao);
}

/* As listas da carga rolam POR DENTRO, com altura limitada: a de documentos
   pode passar de 600 linhas (o Uniplus da Gerais tem cargas assim) e a de
   itens precisa continuar a vista embaixo dela. */
.carga-documentos,
.carga-importar,
.carga-baixa {
  max-height: 16rem;
  overflow-y: auto;
}

.carga-itens {
  max-height: 11rem;
  overflow-y: auto;
}

.carga-documentos thead th,
.carga-itens thead th,
.carga-importar thead th,
.carga-baixa thead th {
  position: sticky;
  top: 0;
  z-index: 1;
}

.carga-documentos tbody tr {
  cursor: pointer;
}

.carga-itens .campo-celula.num {
  max-width: 7rem;
  text-align: right;
}

.carga-baixa .campo-celula {
  min-width: 16rem;
}

/* documento marcado como Nao entregue na baixa: o mesmo vermelho claro da
   pendencia, para a lista mostrar de relance o que volta */
.carga-baixa tr.nao-entregue td {
  background-color: var(--up-pendencia-fundo);
}

.barra-itens .resumo-carga {
  margin-left: auto;
}

.resumo-carga {
  font-size: 12px;
  font-weight: 700;
  color: var(--up-cinza-chumbo);
}

#formCarga .rodape-formulario .resumo-carga {
  margin-right: auto;
}

#formBuscaImportar .campo-botao {
  justify-content: flex-end;
}

/* Rastreabilidade da carga: o resumo (situacao, motorista, veiculo, total)
   em cima da lista de documentos */
.rastreio-carga-resumo {
  margin: 0 0 0.5rem;
  font-size: 12px;
  color: var(--up-cinza-chumbo);
}

/* eventos da carga na linha do tempo: entrar/sair e troca de quantidade no
   azul padrao; fechar no azul de andamento; abrir de novo no ambar (desfaz o
   fechamento); entregue no verde de resolvido e nao entregue no vermelho de
   pendencia. `criado`, `alterado`, `baixado` e `excluido` ja tinham cor. */
.evento-fechado .evento-marca,
.evento-carga_incluido .evento-marca {
  background-color: var(--up-status-andamento);
}

.evento-reaberto .evento-marca,
.evento-entrega_desfeita .evento-marca,
.evento-financeiro_desfeito .evento-marca,
.evento-documento_retirado .evento-marca,
.evento-carga_retirado .evento-marca {
  background-color: var(--up-intervencao);
}

.evento-entregue .evento-marca {
  background-color: var(--up-resolvida);
}

.evento-nao_entregue .evento-marca {
  background-color: var(--up-pendencia);
}

/* campos de digitar dentro das grades da carga (Enviada, Observacao da
   baixa): o `.campo-celula` foi desenhado para o <select> da pauta e traz a
   seta dele -- num campo de texto/numero ela so confunde */
.carga-itens input.campo-celula,
.carga-baixa input.campo-celula {
  padding-right: 4px;
  background-image: none;
}

.carga-itens input.campo-celula::-webkit-inner-spin-button,
.carga-itens input.campo-celula::-webkit-outer-spin-button {
  margin: 0;
  -webkit-appearance: none;
}

/* as barras de botoes das telas da carga: botoes a esquerda, resumo a direita */
#painelDocumentos .barra-itens,
#formBaixaCarga .barra-itens,
#formAcertoCarga .barra-itens {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 0.4rem;
  margin: 0 0 0.5rem;
}

/* respiro entre a lista de documentos e o titulo dos itens */
#painelDocumentos #tituloItens {
  margin-top: 0.9rem;
}

/* Parcelas da nota (Fiscal > Notas de saida > Incluir/Alterar, 30/09/2026):
   vencimento e valor editaveis direto na celula, como na grade do Uniplus --
   o campo some na linha e so o contorno do foco mostra onde se esta */
.grade-parcelas-nf .celula-editavel {
  width: 100%;
  padding: 0 0.25rem;
  border: 0;
  background: transparent;
  font: inherit;
  color: inherit;
}

.grade-parcelas-nf .celula-editavel:focus {
  outline: 1px solid var(--up-primaria);
}

/* --- Expedicao > Opcoes do modulo (01/10/2026) -------------------------------
   Grade no desenho da de Painel Admin > Usuarios (pesquisa, funil, valor na
   propria linha). Mesma cadeia do Importar XML: `.painel-documento` em flex,
   o formulario com a altura do card (`1 1 auto` + `min-height: 0`), a grade
   rolando por dentro e o rodape padrao colado na base (regra dos formularios,
   mais acima). */
.form-opcoes-modulo {
  display: flex;
  flex: 1 1 auto;
  flex-direction: column;
  min-height: 0;
}

#gradeOpcoes tbody tr[hidden] {
  display: none;
}

/* Fluxo de trabalho da Expedicao (01/10/2026): a escolha que vem ANTES das
   opcoes. Um cartao por fluxo, lado a lado, com radio + nome em negrito + a
   explicacao embaixo (o desenho da Metodologia de pauta do Catalogo); o
   marcado ganha a borda e o fundo da marca. `flex: none` porque o form e
   coluna flex: a grade de baixo fica com a altura que sobra e rola sozinha. */
.fluxo-expedicao {
  flex: none;
  margin-bottom: 0.6rem;
}

.fluxos-expedicao {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(16rem, 1fr));
  gap: 0.5rem;
}

.opcao-marcar.opcao-fluxo {
  display: flex;
  align-items: flex-start;
  padding: 0.5rem 0.75rem;
  border: 1px solid var(--up-borda);
  border-radius: 8px;
  background-color: var(--up-superficie);
}

.opcao-fluxo input {
  margin-top: 0.15rem;
}

.opcao-fluxo:has(input:checked) {
  border-color: var(--up-primaria);
  background-color: var(--up-primaria-fundo);
}

.opcao-fluxo:has(input:disabled) {
  cursor: default;
}

.opcao-fluxo small {
  display: block;
  font-size: 11px;
}

.opcao-fluxo .etiqueta-status {
  margin-left: 0.35rem;
}

/* layout automatico da .grade: `width: 1%` + nowrap encolhe a coluna ao
   conteudo, e a Opcao (nome + descricao) fica com a sobra */
.grade-opcoes .coluna-grupo,
.grade-opcoes .coluna-padrao,
.grade-opcoes .coluna-situacao,
.grade-opcoes .celula-grupo,
.grade-opcoes .celula-padrao {
  width: 1%;
  white-space: nowrap;
}

.grade-opcoes .coluna-valor {
  width: 18rem;
}

.grade-opcoes .celula-opcao {
  min-width: 20rem;
  white-space: normal;
}

.grade-opcoes .opcao-nome {
  display: block;
}

.grade-opcoes .opcao-descricao {
  display: block;
  font-size: 11px;
  color: var(--up-texto-suave);
}

.grade-opcoes .celula-valor {
  white-space: nowrap;
}

/* numero: sem a seta do <select> que o .campo-celula traz */
.grade-opcoes input.campo-celula {
  width: 6rem;
  padding-right: 4px;
  background-image: none;
}

.grade-opcoes .opcao-unidade {
  margin-left: 0.35rem;
  font-size: 12px;
  color: var(--up-texto-suave);
}

.grade-opcoes .botao-lista-opcao {
  display: block;
  width: 100%;
  max-width: 19rem;
  overflow: hidden;
  text-align: left;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.grade-opcoes .celula-padrao {
  color: var(--up-texto-suave);
}

/* o limite vai no <span>: no <td> o layout automatico ignora o max-width.
   O texto inteiro fica no `title` */
.grade-opcoes .texto-padrao {
  display: block;
  max-width: 16rem;
  overflow: hidden;
  text-overflow: ellipsis;
}

/* Fiscal > Opcoes do modulo (05/10/2026): a linha de uma serie tem o
   proximo numero + o lapis que abre a janela da serie; marcada para sair,
   fica riscada ate o GRAVAR */
.grade-opcoes .botao-serie {
  margin-left: 0.35rem;
  vertical-align: middle;
}

.grade-opcoes tr.linha-excluir .celula-opcao,
.grade-opcoes tr.linha-excluir .campo-sequencial {
  color: var(--up-texto-suave);
  text-decoration: line-through;
}

/* linha atalho das Opcoes (ex.: Modelo nota fiscal): o botao abre a tela
   de cadastro; e um link, entao o hover do botao:enabled nao vale */
.grade-opcoes a.botao-atalho-opcao {
  display: inline-flex;
  align-items: center;
  gap: 0.35rem;
  text-decoration: none;
}

.grade-opcoes a.botao-atalho-opcao:hover {
  background-color: #003f80; /* o mesmo do .botao-alterar:hover */
}

/* a serie e POR FILIAL: cada filial abre o bloco das series dela */
.grade-opcoes tr.subtitulo-grade td {
  padding: 0.45rem 0.6rem;
  border-top: 2px solid var(--up-primaria);
  background-color: var(--up-primaria-fundo);
  color: var(--up-primaria);
  font-weight: 700;
  white-space: nowrap;
}

.grade-opcoes tr.subtitulo-grade svg {
  vertical-align: -2px;
}

.grade-opcoes .subtitulo-contagem,
.grade-opcoes .subtitulo-ajuda {
  margin-left: 0.5rem;
  font-size: 11px;
  font-weight: 400;
  color: var(--up-texto-suave);
}

/* proximo numero ate a ultima nota emitida: so aviso, nao bloqueia */
.grade-opcoes input.serie-numero-usado {
  border-color: var(--up-pendencia);
  color: var(--up-pendencia);
}

#dialogoSerie .serie-aviso-numero,
#dialogoSerie .serie-aviso-default {
  color: var(--up-pendencia);
}

#dialogoSerie .campo-ajuda-inline {
  font-weight: 400;
  color: var(--up-texto-suave);
}

#dialogoSerie .serie-marcas {
  display: flex;
  flex-wrap: wrap;
  gap: 0.5rem 1.25rem;
}

#dialogoSerie .serie-marcas .campo-marcavel {
  width: auto;
  margin: 0;
  white-space: nowrap;
}

#dialogoSerie .serie-marcas input {
  width: auto;
  margin: 0;
}

.grade-opcoes input.campo-sequencial {
  width: 7.5rem;
}

.lista-situacoes {
  columns: 2;
  margin: 0.5rem 0 0;
  padding: 0;
  list-style: none;
}

.lista-situacoes li {
  break-inside: avoid;
  padding: 0.15rem 0;
}

.aviso-situacoes {
  margin: 0.5rem 0 0;
  color: var(--up-pendencia);
  font-size: 12px;
}

@media (max-width: 640px) {
  .lista-situacoes {
    columns: 1;
  }
}

/* ==========================================================================
   EXPEDICAO > ENTREGAS (01/10/2026) -- o "Modelo A" escolhido pelo cliente no
   canvas: era uma grade AG Grid de cargas; virou DUAS ABAS --
   Entregas (lista dos documentos a entregar + painel "Montar carga" ao lado)
   e Cargas (um cartao por carga). Montado por entrega_painel.js.

   Mesmo acabamento das telas do financeiro e da Conta Corrente (cartoes
   brancos com sombra leve sobre o `.painel-fin`; busca e filtros nas pilulas
   `.cc-busca` / `.cc-filtro`). Tela fixa: so a lista, o meio do painel e os
   cartoes rolam -- a cadeia de altura e a mesma do `.cc-tela` (a area que
   rola e `absolute` dentro de `.ent-rolagem`, entao nao empurra a altura).
   Medido para caber a partir de ~630px de altura util.
   ========================================================================== */

.ent-tela {
  display: flex;
  flex: 1 1 auto;
  flex-direction: column;
  gap: 0.6rem;
  min-height: 0;
}

.ent-tela > * {
  flex-shrink: 0;
}

.ent-tela > .ent-painel:not([hidden]) {
  display: flex;
  flex: 1 1 auto;
  flex-direction: column;
  gap: 0.55rem;
  min-height: 0;
}

/* --- Cabecalho: uma linha so (01/10/2026) --------------------------------
   As abas viraram pilulas (o topo do Modelo B do canvas, pedido do cliente) e
   a barra da aba visivel sobe para a mesma linha: a pesquisa estica e os
   filtros ficam encostados a direita. Antes eram abas sublinhadas com o
   titulo "Expedicao · Geral / Entregas" a direita e a barra numa segunda
   linha; o titulo saiu (a aba da janela ja diz Entregas) e a pesquisa ganhou
   o espaco dele. */

.ent-cabecalho {
  display: flex;
  align-items: center;
  gap: 0.6rem;
}

.ent-abas {
  display: flex;
  flex-shrink: 0;
  gap: 0.25rem;
  padding: 4px;
  border-radius: 10px;
  background-color: var(--up-pilulas-fundo);
}

.ent-aba {
  display: inline-flex;
  align-items: center;
  gap: 0.5rem;
  height: 32px;
  padding: 0 1rem;
  border: 0;
  border-radius: 7px;
  background: none;
  font-family: var(--up-fonte);
  font-size: 14px;
  font-weight: 700;
  color: var(--up-texto-suave);
  cursor: pointer;
}

.ent-aba:hover {
  color: var(--up-texto);
}

.ent-aba.ativa {
  background-color: var(--up-superficie);
  box-shadow: var(--up-sombra-cartao-leve);
  color: var(--up-marca-escura);
}

.ent-aba:focus-visible {
  outline: 3px solid var(--up-primaria-claro);
  outline-offset: 0;
}

.ent-aba-qtd {
  min-width: 1.6rem;
  padding: 0.05rem 0.5rem;
  border-radius: 999px;
  background-color: var(--up-borda-suave);
  font-size: 11.5px;
  color: var(--up-texto-suave);
  text-align: center;
}

.ent-aba.ativa .ent-aba-qtd {
  background-color: var(--up-primaria);
  color: var(--up-superficie);
}

/* --- Barra de cada aba ---------------------------------------------------- */

.ent-barra {
  display: flex;
  flex: 1 1 auto;
  align-items: center;
  flex-wrap: wrap;
  gap: 0.5rem;
  min-width: 0;
}

.ent-barra[hidden] {
  display: none;
}

/* estica ate onde os filtros deixarem; abaixo de 180px a barra quebra a
   linha em vez de espremer a pesquisa. A base e o proprio minimo (era 220px):
   e a base que o navegador usa para decidir a quebra, e com o "Acerto" na
   barra das Cargas os 40px a mais jogavam tudo para a segunda linha */
.ent-busca {
  flex: 1 1 180px;
  width: auto;
  min-width: 180px;
}

/* botao so com o icone (Atualizar das cargas): o nome vai no title */
.cc-filtro.ent-so-icone {
  justify-content: center;
  width: 36px;
  padding: 0;
}

.ent-barra-direita {
  display: flex;
  align-items: center;
  gap: 0.5rem;
  margin-left: auto;
}

/* Filtro com algo aplicado: a pilula fica na cor da marca, como o funil
   ativo das listagens (.botao-filtro.ativo) */
.ent-tela .cc-filtro.ativo {
  border-color: var(--up-primaria);
  background-color: var(--up-primaria-fundo);
  color: var(--up-primaria);
}

/* Segmento Todos/Pedidos/NF-e/NFC-e e Abertas/Fechadas/Baixadas: um botao
   so com divisorias, para a escolha unica ler como uma coisa so */
.ent-seg {
  display: flex;
  height: 36px;
  border: 1px solid var(--up-borda);
  border-radius: 9px;
  background-color: var(--up-superficie);
  overflow: hidden;
}

.ent-seg button {
  display: inline-flex;
  align-items: center;
  gap: 0.35rem;
  padding: 0 0.85rem;
  border: 0;
  border-right: 1px solid var(--up-borda-suave);
  background: none;
  font-family: var(--up-fonte);
  font-size: 13px;
  color: var(--up-texto);
  cursor: pointer;
}

.ent-seg button:last-child {
  border-right: 0;
}

.ent-seg button small {
  font-size: 11.5px;
  color: var(--up-texto-suave);
}

.ent-seg button.ativo {
  background-color: var(--up-primaria-fundo);
  font-weight: 700;
  color: var(--up-primaria);
}

.ent-seg button.ativo small {
  color: var(--up-primaria);
}

.ent-seg button:focus-visible {
  outline: 2px solid var(--up-primaria);
  outline-offset: -2px;
}

.ent-seg button:disabled {
  opacity: 0.55;
  cursor: not-allowed;
}

.ent-aviso {
  margin: 0;
  padding: 0.4rem 0.75rem;
  border-radius: 6px;
  background-color: var(--up-intervencao-fundo);
  font-size: 12.5px;
  font-weight: 700;
  color: var(--up-intervencao);
}

/* --- Aba Entregas: lista + painel ---------------------------------------- */

.ent-conteudo {
  display: flex;
  flex: 1 1 auto;
  gap: 0.85rem;
  min-height: 0;
}

.ent-lista,
.ent-montar {
  display: flex;
  flex-direction: column;
  min-height: 0;
  border: 1px solid var(--up-borda);
  border-radius: 10px;
  background-color: var(--up-superficie);
  box-shadow: var(--up-sombra-cartao-leve);
  overflow: hidden;
}

.ent-lista {
  flex: 1 1 auto;
  min-width: 0;
}

/* Bairro e cidade numa coluna so (cidade embaixo, menor): sem isso o
   cliente ficava com menos de 120px ao lado do painel */
.ent-lista-cab,
.ent-linha {
  display: grid;
  grid-template-columns: 18px 62px 88px 44px minmax(0, 1fr) minmax(0, 165px) 38px 94px 148px;
  align-items: center;
  gap: 0 0.65rem;
  padding: 0 0.85rem;
}

.ent-lista-cab {
  flex-shrink: 0;
  min-height: 32px;
  border-bottom: 1px solid var(--up-borda);
  background-color: var(--up-cinza-frio);
  font-size: 10.5px;
  font-weight: 700;
  letter-spacing: 0.04em;
  text-transform: uppercase;
  color: var(--up-texto-suave);
}

.ent-marca-todos {
  display: flex;
  margin: 0;
}

.ent-rolagem {
  position: relative;
  flex: 1 1 auto;
  min-height: 7rem;
}

.ent-rolagem > .ent-linhas,
.ent-rolagem > .ent-cartoes {
  position: absolute;
  inset: 0;
  overflow-y: auto;
}

.ent-vazio {
  position: absolute;
  top: 0;
  right: 0;
  left: 0;
  margin: 0;
  padding: 2rem 1.5rem;
  font-size: 13px;
  color: var(--up-texto-suave);
  text-align: center;
}

.ent-linha {
  min-height: 44px;
  margin: 0;
  border-bottom: 1px solid var(--up-borda-suave);
  font-size: 12.5px;
  cursor: pointer;
}

.ent-linha:hover {
  background-color: var(--up-papel-parede);
}

.ent-linha.marcada {
  background-color: var(--up-primaria-fundo);
}

.ent-linha input,
.ent-marca-todos input {
  width: 15px;
  height: 15px;
  margin: 0;
  accent-color: var(--up-primaria);
  cursor: pointer;
}

.ent-tela.carregando .ent-linhas {
  opacity: 0.6;
}

.ent-num {
  font-variant-numeric: tabular-nums;
  text-align: right;
  white-space: nowrap;
}

.ent-valor {
  font-weight: 700;
  color: var(--up-marca-escura);
}

.ent-tipo {
  padding: 0.15rem 0;
  border-radius: 4px;
  font-size: 10.5px;
  font-weight: 700;
  text-align: center;
  white-space: nowrap;
}

.ent-tipo-dav {
  background-color: var(--up-tipo-pedido-fundo);
  color: var(--up-tipo-pedido);
}

.ent-tipo-notafiscal {
  background-color: var(--up-tipo-nfe-fundo);
  color: var(--up-tipo-nfe);
}

.ent-tipo-pdv {
  background-color: var(--up-tipo-nfce-fundo);
  color: var(--up-tipo-nfce);
}

.ent-numero,
.ent-cliente,
.ent-onde {
  display: flex;
  flex-direction: column;
  min-width: 0;
  padding: 0.3rem 0;
  line-height: 1.25;
}

/* o numero da NFC-e do pedido pago no caixa, na cor do tipo NFC-e */
.ent-numero small {
  font-size: 10.5px;
  font-weight: 700;
  color: var(--up-tipo-nfce);
  white-space: nowrap;
}

.ent-cliente b,
.ent-onde b {
  overflow: hidden;
  font-weight: 600;
  white-space: nowrap;
  text-overflow: ellipsis;
}

.ent-onde b {
  font-weight: 400;
}

.ent-onde small {
  overflow: hidden;
  font-size: 10.5px;
  color: var(--up-texto-suave);
  white-space: nowrap;
  text-overflow: ellipsis;
}

/* a rota de entrega (do pedido, ou do cadastro do cliente), na cor da marca:
   e o que o operador procura ao separar a carga por regiao */
.ent-onde small.ent-rota {
  font-weight: 700;
  color: var(--up-primaria);
}

/* parcial / misto / sem endereco: a mesma linha ambar do aviso da Retirada */
.ent-alerta-linha {
  display: flex;
  align-items: center;
  gap: 0.3rem;
  overflow: hidden;
  font-size: 10.5px;
  font-weight: 700;
  color: var(--up-intervencao);
  white-space: nowrap;
  text-overflow: ellipsis;
}

.ent-linha .etiqueta-status {
  justify-self: start;
  max-width: 100%;
  overflow: hidden;
  white-space: nowrap;
  text-overflow: ellipsis;
}

/* A situacao no financeiro (01/10/2026, opcao "Exigir pagamento para
   entregar") fica EMBAIXO da etiqueta, na mesma celula, como o bairro/cidade:
   uma coluna a mais nao cabia ao lado do painel "Montar carga". Verde pago,
   ambar em aberto, cinza sem financeiro (carga_pagamento_service.TOM). */
.ent-situacao {
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  gap: 2px;
  min-width: 0;
  padding: 0.3rem 0;
  line-height: 1.25;
}

.ent-financeiro {
  max-width: 100%;
  overflow: hidden;
  font-size: 10.5px;
  font-weight: 700;
  white-space: nowrap;
  text-overflow: ellipsis;
}

.ent-financeiro.tom-ok {
  color: var(--up-resolvida);
}

.ent-financeiro.tom-aviso {
  color: var(--up-intervencao);
}

.ent-financeiro.tom-info {
  color: var(--up-texto-suave);
}

.ent-lista-pe {
  display: flex;
  flex-shrink: 0;
  justify-content: space-between;
  padding: 0.45rem 0.85rem;
  border-top: 1px solid var(--up-borda);
  background-color: var(--up-cinza-frio);
  font-size: 12px;
  color: var(--up-texto-suave);
}

.ent-lista-pe b {
  color: var(--up-texto);
}

/* --- Painel "Montar carga" ----------------------------------------------- */

.ent-montar {
  flex: 0 0 330px;
}

/* cabecalho no azul escuro da marca: o painel e o "carrinho" da carga e
   precisa se destacar da lista branca ao lado */
.ent-montar-cab {
  display: flex;
  flex-shrink: 0;
  align-items: center;
  gap: 0.65rem;
  padding: 0.65rem 0.9rem;
  background-color: var(--up-marca-escura);
  color: var(--up-superficie);
}

.ent-montar-cab h2 {
  margin: 0;
  font-size: 14px;
  font-weight: 700;
}

.ent-montar-cab p {
  margin: 0;
  font-size: 11.5px;
  opacity: 0.8;
}

.ent-montar-qtd {
  min-width: 2rem;
  margin-left: auto;
  padding: 0.1rem 0.6rem;
  border-radius: 999px;
  background-color: var(--up-realce-sobre-escuro);
  font-weight: 700;
  text-align: center;
}

.ent-montar-resumo {
  display: grid;
  flex-shrink: 0;
  grid-template-columns: repeat(3, minmax(0, 1fr));
  border-bottom: 1px solid var(--up-borda-suave);
}

.ent-montar-resumo div {
  padding: 0.45rem 0.75rem;
  border-right: 1px solid var(--up-borda-suave);
}

.ent-montar-resumo div:last-child {
  border-right: 0;
}

.ent-montar-resumo small {
  display: block;
  font-size: 10px;
  font-weight: 700;
  letter-spacing: 0.04em;
  text-transform: uppercase;
  color: var(--up-texto-suave);
}

.ent-montar-resumo b {
  font-size: 14.5px;
  font-variant-numeric: tabular-nums;
  color: var(--up-marca-escura);
  white-space: nowrap;
}

/* o meio (marcados + avisos) e o que rola; campos e botoes ficam sempre a vista */
.ent-montar-meio {
  flex: 1 1 auto;
  min-height: 4rem;
  padding: 0.3rem 0;
  overflow-y: auto;
}

.ent-montar-vazio {
  margin: 0;
  padding: 1.1rem 1rem;
  font-size: 12.5px;
  color: var(--up-texto-suave);
  text-align: center;
}

.ent-escolhidos,
.ent-avisos {
  margin: 0;
  padding: 0;
  list-style: none;
}

.ent-escolhido {
  display: grid;
  grid-template-columns: minmax(0, 1fr) auto 26px;
  align-items: center;
  gap: 0.5rem;
  padding: 0.25rem 0.55rem 0.25rem 0.9rem;
  font-size: 12px;
}

.ent-escolhido b {
  display: block;
  overflow: hidden;
  font-weight: 600;
  white-space: nowrap;
  text-overflow: ellipsis;
}

.ent-escolhido div span {
  font-size: 11px;
  color: var(--up-texto-suave);
}

.ent-tirar {
  display: flex;
  align-items: center;
  justify-content: center;
  width: 26px;
  height: 26px;
  padding: 0;
  border: 0;
  border-radius: 4px;
  background: none;
  color: var(--up-texto-suave);
  cursor: pointer;
}

.ent-tirar:hover,
.ent-tirar:focus-visible {
  background-color: var(--up-pendencia-fundo);
  color: var(--up-pendencia);
  outline: none;
}

.ent-avisos {
  display: flex;
  flex-direction: column;
  gap: 0.35rem;
  padding: 0.35rem 0.75rem 0.2rem;
}

.ent-aviso-montar {
  display: flex;
  align-items: flex-start;
  gap: 0.45rem;
  padding: 0.4rem 0.6rem;
  border-radius: 6px;
  background-color: var(--up-intervencao-fundo);
  font-size: 11.5px;
  font-weight: 700;
  line-height: 1.35;
  color: var(--up-intervencao);
}

.ent-aviso-montar .icone {
  margin-top: 0.1rem;
}

.ent-montar-campos {
  display: grid;
  flex-shrink: 0;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: 0.4rem 0.6rem;
  padding: 0.55rem 0.75rem;
  border-top: 1px solid var(--up-borda-suave);
}

.ent-campo {
  display: flex;
  flex-direction: column;
  gap: 0.15rem;
  min-width: 0;
}

.ent-campo-largo {
  grid-column: 1 / -1;
}

.ent-campo label {
  font-size: 10.5px;
  font-weight: 700;
  color: var(--up-texto-suave);
}

.ent-campo input,
.ent-campo select,
.ent-adicionar select {
  min-width: 0;
  height: 30px;
  padding: 0 0.45rem;
  border: 1px solid var(--up-borda);
  border-radius: 5px;
  background-color: var(--up-superficie);
  font-family: var(--up-fonte);
  font-size: 12.5px;
  color: var(--up-texto);
}

.ent-campo input:focus,
.ent-campo select:focus,
.ent-adicionar select:focus {
  border-color: var(--up-primaria);
  outline: 2px solid var(--up-primaria-claro);
}

.ent-montar-acoes {
  display: flex;
  flex-shrink: 0;
  flex-direction: column;
  gap: 0.45rem;
  padding: 0 0.75rem 0.75rem;
}

.ent-montar-acoes .botao-gravar {
  width: 100%;
  padding: 0.5rem;
}

.ent-adicionar {
  display: flex;
  gap: 0.4rem;
}

.ent-adicionar select {
  flex: 1 1 auto;
  height: 32px;
}

/* --- Aba Cargas: cartoes -------------------------------------------------- */

.ent-cartoes {
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr));
  align-content: start;
  gap: 0.85rem;
  padding: 2px 4px 0.75rem 2px;
}

@media (max-width: 1100px) {
  .ent-cartoes {
    grid-template-columns: repeat(2, minmax(0, 1fr));
  }
}

@media (max-width: 700px) {
  .ent-cartoes {
    grid-template-columns: 1fr;
  }
}

.ent-carga {
  display: flex;
  flex-direction: column;
  border: 1px solid var(--up-borda);
  border-radius: 10px;
  background-color: var(--up-superficie);
  box-shadow: var(--up-sombra-cartao-leve);
  overflow: hidden;
}

.ent-carga:focus-visible {
  border-color: var(--up-primaria);
  outline: 3px solid var(--up-primaria-claro);
}

/* a carga que acabou de ser criada / receber documentos */
.ent-carga.destaque {
  border-color: var(--up-primaria);
  box-shadow: 0 0 0 3px var(--up-primaria-claro);
}

.ent-carga.excluida {
  opacity: 0.75;
}

.ent-carga-cab {
  display: flex;
  align-items: flex-start;
  gap: 0.6rem;
  padding: 0.7rem 0.55rem 0.4rem 0.85rem;
}

.ent-carga-icone {
  display: flex;
  flex: 0 0 36px;
  align-items: center;
  justify-content: center;
  height: 36px;
  border-radius: 9px;
  background-color: var(--up-primaria-fundo);
  color: var(--up-primaria);
}

.ent-carga-titulo {
  flex: 1 1 auto;
  min-width: 0;
}

.ent-carga-titulo h3 {
  margin: 0;
  font-size: 15px;
  font-weight: 700;
  color: var(--up-marca-escura);
}

.ent-carga-titulo p {
  margin: 0;
  overflow: hidden;
  font-size: 12px;
  color: var(--up-texto-suave);
  white-space: nowrap;
  text-overflow: ellipsis;
}

.ent-carga-cab .etiqueta-status {
  flex-shrink: 0;
  margin-top: 0.15rem;
}

.ent-carga-mais {
  display: flex;
  flex: 0 0 28px;
  align-items: center;
  justify-content: center;
  height: 28px;
  padding: 0;
  border: 0;
  border-radius: 6px;
  background: none;
  color: var(--up-texto-suave);
  cursor: pointer;
}

.ent-carga-mais:hover,
.ent-carga-mais:focus-visible,
.ent-carga-mais[aria-expanded="true"] {
  background-color: var(--up-cinza-frio);
  color: var(--up-texto);
  outline: none;
}

.ent-carga-meta {
  display: flex;
  flex-wrap: wrap;
  gap: 0.2rem 0.9rem;
  padding: 0 0.85rem 0.55rem;
  font-size: 12px;
  color: var(--up-texto-suave);
}

.ent-carga-meta span {
  display: inline-flex;
  align-items: center;
  gap: 0.3rem;
}

.ent-carga-docs {
  flex: 1 1 auto;
  margin: 0;
  padding: 0.3rem 0;
  border-top: 1px solid var(--up-borda-suave);
  border-bottom: 1px solid var(--up-borda-suave);
  list-style: none;
}

.ent-carga-docs li {
  display: grid;
  grid-template-columns: 92px minmax(0, 1fr) auto 10px;
  align-items: center;
  gap: 0.5rem;
  padding: 0.2rem 0.85rem;
  font-size: 12px;
}

.ent-carga-docs li.ent-carga-docs-mais {
  display: block;
  font-size: 11.5px;
  color: var(--up-texto-suave);
}

.ent-carga-doc-num {
  font-weight: 700;
  color: var(--up-tipo-pedido);
  white-space: nowrap;
}

.ent-carga-doc-cliente {
  overflow: hidden;
  white-space: nowrap;
  text-overflow: ellipsis;
}

/* a bolinha da entrega: cinza pendente, verde entregue, vermelho nao entregue */
.ent-ponto {
  width: 9px;
  height: 9px;
  border-radius: 50%;
  background-color: var(--up-borda);
}

.ent-ponto.entregue {
  background-color: var(--up-resolvida);
}

.ent-ponto.nao-entregue {
  background-color: var(--up-pendencia);
}

.ent-carga-pe {
  display: flex;
  flex-direction: column;
  gap: 0.45rem;
  padding: 0.6rem 0.85rem 0.75rem;
}

.ent-carga-totais {
  display: flex;
  justify-content: space-between;
  align-items: baseline;
  gap: 0.5rem;
  font-size: 12px;
  color: var(--up-texto-suave);
}

.ent-carga-totais b {
  font-size: 15px;
  font-variant-numeric: tabular-nums;
  color: var(--up-marca-escura);
}

.ent-progresso {
  height: 6px;
  border-radius: 3px;
  background-color: var(--up-borda-suave);
  overflow: hidden;
}

.ent-progresso div {
  height: 100%;
  background-color: var(--up-resolvida);
}

.ent-nao-entregue {
  font-size: 11.5px;
  font-weight: 700;
  color: var(--up-pendencia);
}

.ent-carga-acoes {
  display: flex;
  gap: 0.4rem;
}

.ent-carga-acoes .botao-acao {
  flex: 1 1 0;
  padding: 0.32rem 0.5rem;
  font-size: 11px;
}

/* botao de contorno (Alterar, Abrir, Rastreabilidade): a acao de rotina
   fica discreta ao lado da acao principal colorida do cartao */
.ent-botao-linha {
  border-color: var(--up-borda);
  background-color: var(--up-superficie);
  color: var(--up-texto);
}

.ent-botao-linha:hover {
  background-color: var(--up-cinza-frio);
  color: var(--up-texto);
}

/* menu "..." dos cartoes: o .menu-opcoes da casa, numa coluna so e preso a
   janela (o JS o posiciona embaixo do botao) */
.menu-opcoes.ent-menu-carga {
  position: fixed;
  top: 0;
  right: auto;
  left: 0;
  display: flex;
  flex-direction: column;
  gap: 0.1rem;
  min-width: 12rem;
  padding: 0.35rem;
}

.menu-opcoes.ent-menu-carga[hidden] {
  display: none;
}

/* --- Aba Cargas: Cartoes, Kanban ou Lista (01/10/2026) --------------------------
   Pedido do cliente para quando houver muitas cargas, aprovado no canvas. O
   conteiner (#cartoesCargas) e sempre o .ent-cargas-area preso a .ent-rolagem;
   o JS troca so a classe do modo (.ent-cartoes / .ent-quadro /
   .ent-tabela-cargas). A escolha e de cada usuario (carga_service.VISUALIZACOES). */

.ent-rolagem > .ent-quadro,
.ent-rolagem > .ent-tabela-cargas {
  position: absolute;
  inset: 0;
}

/* o mesmo segmento da barra (.ent-seg), mas o modo ativo fica no azul escuro
   da marca: e "como ver", nao "o que filtrar", e nao pode ser confundido com
   o Abertas/Fechadas ao lado */
.ent-modos {
  display: flex;
  height: 36px;
  border: 1px solid var(--up-borda);
  border-radius: 9px;
  background-color: var(--up-superficie);
  overflow: hidden;
}

.ent-modos button {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: 0.35rem;
  width: 36px;
  padding: 0;
  border: 0;
  border-right: 1px solid var(--up-borda-suave);
  background: none;
  font-family: var(--up-fonte);
  font-size: 12.5px;
  color: var(--up-texto-suave);
  cursor: pointer;
}

.ent-modos button:last-child {
  border-right: 0;
}

.ent-modos button:hover {
  color: var(--up-texto);
}

.ent-modos button.ativo {
  background-color: var(--up-marca-escura);
  font-weight: 700;
  color: var(--up-superficie);
}

.ent-modos button:focus-visible {
  outline: 2px solid var(--up-primaria);
  outline-offset: -2px;
}

/* Kanban: uma coluna por situacao, cada uma rolando por si (o conteiner nao
   rola). Eram tres ate 01/10/2026; o "Acerto financeiro" fez a quarta */
.ent-quadro {
  display: grid;
  grid-template-columns: repeat(4, minmax(0, 1fr));
  gap: 0.85rem;
  padding: 2px 2px 0.25rem;
}

.ent-coluna {
  display: flex;
  flex-direction: column;
  min-height: 0;
  border-radius: 10px;
  background-color: var(--up-coluna-kanban);
}

.ent-coluna-cab {
  display: flex;
  align-items: center;
  gap: 0.5rem;
  padding: 0.65rem 0.85rem 0.55rem;
}

.ent-coluna-cab h2 {
  margin: 0;
  font-size: 12.5px;
  font-weight: 700;
  letter-spacing: 0.04em;
  text-transform: uppercase;
  color: var(--up-marca-escura);
}

/* a bolinha segue a etiqueta da situacao: ambar aberta, azul fechada, verde baixada */
.ent-coluna-bola {
  width: 10px;
  height: 10px;
  border-radius: 50%;
  background-color: var(--up-texto-suave);
}

.ent-coluna-bola.aberta {
  background-color: var(--up-acao-inativar);
}

.ent-coluna-bola.fechada {
  background-color: var(--up-azul-royal);
}

.ent-coluna-bola.baixada {
  background-color: var(--up-resolvida);
}

.ent-coluna-qtd {
  padding: 0 0.5rem;
  border-radius: 10px;
  background-color: var(--up-superficie);
  font-size: 11.5px;
  font-weight: 700;
  color: var(--up-texto-suave);
}

.ent-coluna-total {
  margin-left: auto;
  font-size: 12px;
  font-weight: 700;
  font-variant-numeric: tabular-nums;
  color: var(--up-texto-suave);
}

.ent-coluna-corpo {
  display: flex;
  flex: 1 1 auto;
  flex-direction: column;
  gap: 0.5rem;
  min-height: 0;
  padding: 0 0.6rem 0.6rem;
  overflow-y: auto;
}

.ent-coluna-vazia {
  margin: 0;
  padding: 0.75rem 0.25rem;
  font-size: 12px;
  text-align: center;
  color: var(--up-texto-suave);
}

.ent-coluna-nova {
  display: flex;
  flex-shrink: 0;
  align-items: center;
  justify-content: center;
  gap: 0.4rem;
  padding: 0.65rem;
  border: 2px dashed var(--up-borda);
  border-radius: 8px;
  background: none;
  font-family: var(--up-fonte);
  font-size: 12px;
  font-weight: 700;
  color: var(--up-texto-suave);
  cursor: pointer;
}

.ent-coluna-nova:hover,
.ent-coluna-nova:focus-visible {
  border-color: var(--up-primaria);
  color: var(--up-primaria);
  outline: none;
}

/* cartao compacto: sem a lista de documentos (para isso ha o modo Cartoes) */
.ent-kc {
  display: flex;
  flex-shrink: 0;
  flex-direction: column;
  gap: 0.4rem;
  padding: 0.6rem 0.5rem 0.65rem 0.75rem;
  border: 1px solid var(--up-borda-suave);
  border-radius: 8px;
  background-color: var(--up-superficie);
  box-shadow: var(--up-sombra-cartao-leve);
}

.ent-kc:focus-visible {
  border-color: var(--up-primaria);
  outline: 3px solid var(--up-primaria-claro);
}

.ent-kc.destaque {
  border-color: var(--up-primaria);
  box-shadow: 0 0 0 3px var(--up-primaria-claro);
}

.ent-kc.excluida {
  opacity: 0.75;
}

.ent-kc-topo {
  display: flex;
  align-items: center;
  gap: 0.5rem;
}

.ent-kc-topo h3 {
  flex-shrink: 0;
  margin: 0;
  font-size: 14px;
  font-weight: 700;
  color: var(--up-marca-escura);
}

.ent-kc-desc {
  flex: 1 1 auto;
  min-width: 0;
  overflow: hidden;
  font-size: 11.5px;
  color: var(--up-texto-suave);
  white-space: nowrap;
  text-overflow: ellipsis;
}

.ent-carga-meta.ent-kc-meta {
  padding: 0 0.25rem 0 0;
  font-size: 11.5px;
}

.ent-kc-num {
  display: flex;
  align-items: center;
  gap: 0.6rem;
  padding-right: 0.25rem;
  font-size: 11.5px;
  color: var(--up-texto-suave);
}

.ent-kc-num .ent-progresso {
  flex: 1 1 auto;
}

.ent-kc-num b {
  margin-left: auto;
  font-size: 13.5px;
  font-variant-numeric: tabular-nums;
  color: var(--up-marca-escura);
}

.ent-kc .ent-carga-acoes {
  padding-right: 0.25rem;
}

/* Lista: uma linha por carga; cabecalho e rodape grudados no conteiner que
   rola. A largura minima evita espremer a descricao a zero em tela estreita
   (ai a lista rola de lado, dentro do proprio cartao) */
.ent-tabela-cargas {
  display: flex;
  flex-direction: column;
  border: 1px solid var(--up-borda);
  border-radius: 10px;
  background-color: var(--up-superficie);
  box-shadow: var(--up-sombra-cartao-leve);
  overflow: auto;
}

.ent-tc-cab,
.ent-tc-linha {
  display: grid;
  grid-template-columns: 22px 62px minmax(0, 1fr) 76px 82px 108px 118px 80px 38px 112px 98px 220px;
  align-items: center;
  gap: 0 0.6rem;
  min-width: 1150px;
  padding: 0 0.6rem 0 0.75rem;
}

.ent-tc-cab {
  position: sticky;
  top: 0;
  z-index: 1;
  flex-shrink: 0;
  min-height: 32px;
  border-bottom: 1px solid var(--up-borda);
  background-color: var(--up-cinza-frio);
  font-size: 10.5px;
  font-weight: 700;
  letter-spacing: 0.04em;
  text-transform: uppercase;
  color: var(--up-texto-suave);
}

.ent-tc-linha {
  flex-shrink: 0;
  min-height: 42px;
  border-bottom: 1px solid var(--up-borda-suave);
  font-size: 12.5px;
}

.ent-tc-linha:hover {
  background-color: var(--up-papel-parede);
}

.ent-tc-linha.aberta {
  background-color: var(--up-primaria-fundo);
}

.ent-tc-linha:focus-visible {
  outline: 2px solid var(--up-primaria);
  outline-offset: -2px;
}

.ent-tc-linha.destaque {
  box-shadow: inset 3px 0 0 var(--up-primaria);
  background-color: var(--up-primaria-fundo);
}

.ent-tc-linha.excluida {
  color: var(--up-texto-suave);
}

.ent-tc-seta {
  display: flex;
  align-items: center;
  justify-content: center;
  width: 22px;
  height: 22px;
  padding: 0;
  border: 0;
  border-radius: 4px;
  background: none;
  color: var(--up-texto-suave);
  cursor: pointer;
}

.ent-tc-seta:hover,
.ent-tc-seta:focus-visible {
  background-color: var(--up-superficie);
  color: var(--up-texto);
  outline: none;
}

.ent-tc-num {
  font-weight: 700;
  color: var(--up-marca-escura);
  white-space: nowrap;
}

.ent-tc-cort {
  overflow: hidden;
  white-space: nowrap;
  text-overflow: ellipsis;
}

.ent-tc-entregues {
  display: flex;
  align-items: center;
  gap: 0.4rem;
  font-size: 11.5px;
  color: var(--up-texto-suave);
  white-space: nowrap;
}

.ent-tc-entregues .ent-progresso {
  flex: 1 1 auto;
}

.ent-tc-acoes {
  display: flex;
  align-items: center;
  justify-content: flex-end;
  gap: 0.35rem;
}

.ent-tc-acoes .botao-acao {
  padding: 0.25rem 0.55rem;
  font-size: 10.5px;
}

/* os documentos da linha aberta, alinhados a partir da descricao */
.ent-tc-detalhe {
  flex-shrink: 0;
  min-width: 1150px;
  margin: 0;
  padding: 0.3rem 0.75rem 0.55rem 6.6rem;
  border-bottom: 1px solid var(--up-borda-suave);
  background-color: var(--up-papel-parede);
  list-style: none;
}

.ent-tc-detalhe li {
  display: grid;
  grid-template-columns: 110px minmax(0, 1fr) 170px 100px 120px;
  align-items: center;
  gap: 0.6rem;
  padding: 0.25rem 0;
  border-bottom: 1px dashed var(--up-borda-suave);
  font-size: 12px;
}

.ent-tc-detalhe li:last-child {
  border-bottom: 0;
}

.ent-tc-detalhe li.ent-carga-docs-mais {
  display: block;
}

.ent-tc-doc-sit {
  display: flex;
  align-items: center;
  gap: 0.4rem;
  color: var(--up-texto-suave);
}

.ent-tc-rodape {
  position: sticky;
  bottom: 0;
  display: flex;
  flex-shrink: 0;
  justify-content: space-between;
  min-width: 1150px;
  margin-top: auto;
  padding: 0.45rem 0.75rem;
  border-top: 1px solid var(--up-borda);
  background-color: var(--up-cinza-frio);
  font-size: 12px;
  color: var(--up-texto-suave);
}

.ent-tc-rodape b {
  font-variant-numeric: tabular-nums;
  color: var(--up-texto);
}

/* --- Aba Entregas: modo MAPA (01/10/2026) -------------------------------------
   O "Mapa 1" aprovado no canvas: o mapa entra no lugar da lista e o painel
   Montar carga fica ao lado, igual. Montado por entrega_mapa.js sobre o
   Leaflet (static/vendor/leaflet). Os quadrinhos vem do OpenStreetMap (unico
   host externo, liberado na CSP so como imagem). Os pinos sao divIcon nossos,
   pintados aqui com os tokens dos tipos de documento -- o Leaflet nao traz
   imagem de pino nenhuma. */

/* Lista | Mapa: o mesmo segmento do Cartoes/Kanban/Lista das cargas, mas com
   o nome ao lado do icone (la os botoes sao so icone, de 36px) */
.ent-modos.ent-vista button {
  width: auto;
  padding: 0 0.75rem;
}

/* com o modo Mapa desligado nas Opcoes do modulo o botao some (o display:flex
   do .ent-modos passaria por cima do atributo hidden) */
.ent-modos[hidden] {
  display: none;
}

.ent-mapa {
  position: relative;
  flex: 1 1 auto;
  min-width: 0;
  min-height: 7rem;
  border: 1px solid var(--up-borda);
  border-radius: 10px;
  background-color: var(--up-cinza-frio);
  box-shadow: var(--up-sombra-cartao-leve);
  overflow: hidden;
}

.ent-mapa[hidden],
.ent-lista[hidden] {
  display: none;
}

.ent-mapa-area {
  position: absolute;
  inset: 0;
  font-family: var(--up-fonte);
}

/* Selecionar area / posicionar: a mira no lugar da maozinha do Leaflet */
.ent-mapa-area.selecionando,
.ent-mapa-area.selecionando .leaflet-interactive,
.ent-mapa-area.posicionando,
.ent-mapa-area.posicionando .leaflet-interactive {
  cursor: crosshair;
}

/* o retangulo da selecao (o Leaflet desenha em SVG) */
.ent-mapa-retangulo {
  stroke: var(--up-primaria);
  stroke-width: 2;
  stroke-dasharray: 6 4;
  fill: var(--up-primaria);
  fill-opacity: 0.08;
}

/* ferramentas, aviso, legenda e "sem localizacao" ficam por cima dos pinos
   (pane 600 do Leaflet) e EMBAIXO do cartao do pino (popup, 700) -- antes
   ficavam em 800 e cobriam o cartao aberto perto do canto */
.ent-mapa-ferramentas {
  position: absolute;
  top: 10px;
  left: 10px;
  z-index: 690;
  display: flex;
  gap: 0.4rem;
}

.ent-mapa-botao,
.ent-mapa-semloc {
  display: inline-flex;
  align-items: center;
  gap: 0.4rem;
  height: 32px;
  padding: 0 0.7rem;
  border: 1px solid var(--up-borda);
  border-radius: 8px;
  background-color: var(--up-superficie);
  box-shadow: var(--up-sombra-cartao-leve);
  font-family: var(--up-fonte);
  font-size: 12.5px;
  color: var(--up-texto);
  cursor: pointer;
}

.ent-mapa-botao.ativo {
  border-color: var(--up-marca-escura);
  background-color: var(--up-marca-escura);
  font-weight: 700;
  color: var(--up-superficie);
}

.ent-mapa-botao:focus-visible,
.ent-mapa-semloc:focus-visible {
  outline: 3px solid var(--up-primaria-claro);
}

.ent-mapa-semloc {
  position: absolute;
  top: 10px;
  right: 54px;
  z-index: 690;
  border-color: var(--up-intervencao);
  background-color: var(--up-intervencao-fundo);
  font-weight: 700;
  color: var(--up-intervencao);
}

.ent-mapa-semloc[hidden],
.ent-mapa-dica[hidden],
.ent-mapa-gaveta[hidden] {
  display: none;
}

.ent-mapa-dica {
  position: absolute;
  top: 50px;
  left: 10px;
  z-index: 690;
  max-width: calc(100% - 20px);
  margin: 0;
  padding: 0.3rem 0.65rem;
  border-radius: 6px;
  background-color: var(--up-marca-escura);
  font-size: 12px;
  font-weight: 700;
  color: var(--up-superficie);
}

.ent-mapa-gaveta {
  position: absolute;
  top: 48px;
  right: 54px;
  z-index: 690;
  display: flex;
  flex-direction: column;
  gap: 0.35rem;
  width: 320px;
  max-height: calc(100% - 100px);
  padding: 0.6rem 0.75rem;
  border: 1px solid var(--up-borda);
  border-radius: 10px;
  background-color: var(--up-superficie);
  box-shadow: var(--up-sombra-menu);
  overflow-y: auto;
}

.ent-mapa-gaveta h3 {
  margin: 0;
  font-size: 13px;
  font-weight: 700;
  color: var(--up-marca-escura);
}

.ent-mapa-gaveta p {
  margin: 0;
  font-size: 11.5px;
  color: var(--up-texto-suave);
}

.ent-mapa-gaveta ul {
  margin: 0;
  padding: 0;
  list-style: none;
}

.ent-mapa-gaveta li {
  display: flex;
  align-items: center;
  gap: 0.5rem;
  padding: 0.35rem 0;
  border-top: 1px solid var(--up-borda-suave);
  font-size: 12px;
}

.ent-mapa-gaveta li > div:first-child {
  flex: 1 1 auto;
  min-width: 0;
}

.ent-mapa-gaveta li b {
  display: block;
  overflow: hidden;
  font-weight: 600;
  white-space: nowrap;
  text-overflow: ellipsis;
}

.ent-mapa-gaveta li small {
  color: var(--up-texto-suave);
}

.ent-mapa-gaveta-acoes {
  display: flex;
  flex-shrink: 0;
  gap: 0.5rem;
}

/* botao com cara de link (Marcar, Posicionar, Corrigir posicao) */
.ent-mapa-link {
  padding: 0;
  border: 0;
  background: none;
  font-family: var(--up-fonte);
  font-size: 12px;
  font-weight: 700;
  color: var(--up-primaria);
  cursor: pointer;
}

.ent-mapa-link:hover,
.ent-mapa-link:focus-visible {
  text-decoration: underline;
  outline: none;
}

.ent-mapa-legenda {
  position: absolute;
  left: 10px;
  bottom: 10px;
  z-index: 690;
  display: flex;
  align-items: center;
  gap: 0.75rem;
  padding: 0.3rem 0.6rem;
  border: 1px solid var(--up-borda-suave);
  border-radius: 8px;
  background-color: var(--up-superficie);
  font-size: 11.5px;
  color: var(--up-texto-suave);
}

.ent-mapa-legenda span {
  display: inline-flex;
  align-items: center;
  gap: 0.3rem;
}

.ent-mapa-leg {
  width: 10px;
  height: 10px;
  border-radius: 50%;
}

.ent-mapa-leg.pedido { background-color: var(--up-tipo-pedido); }
.ent-mapa-leg.nfe { background-color: var(--up-tipo-nfe); }
.ent-mapa-leg.nfce { background-color: var(--up-tipo-nfce); }

.ent-mapa-leg.aprox {
  background-color: var(--up-tipo-pedido);
  opacity: 0.62;
}

/* o + / - do Leaflet e um <a>: sem isto ele pegava o azul dos links do
   sistema */
.ent-mapa .leaflet-control-zoom a,
.ent-mapa .leaflet-control-zoom a:hover,
.ent-mapa .leaflet-control-zoom a:focus {
  background-color: var(--up-superficie);
  color: var(--up-texto);
  text-decoration: none;
}

.ent-mapa .leaflet-control-zoom a:hover {
  background-color: var(--up-cinza-frio);
}

/* --- Pinos, grupos e a loja (divIcon) --- */

/* tira o quadrado branco que o Leaflet poe em todo divIcon */
.leaflet-marker-icon.ent-mapa-icone {
  border: 0;
  background: none;
}

.ent-mapa-pino {
  position: relative;
  width: 30px;
  height: 38px;
}

/* a gota: um quadrado de canto vivo embaixo, girado */
.ent-mapa-gota {
  position: absolute;
  left: 3px;
  top: 2px;
  display: flex;
  align-items: center;
  justify-content: center;
  width: 24px;
  height: 24px;
  border: 2px solid var(--up-superficie);
  border-radius: 50% 50% 50% 0;
  box-shadow: var(--up-sombra-menu);
  transform: rotate(-45deg);
}

.ent-mapa-gota b {
  font-size: 11px;
  font-weight: 700;
  color: var(--up-superficie);
  transform: rotate(45deg);
}

.ent-mapa-gota.pedido { background-color: var(--up-tipo-pedido); }
.ent-mapa-gota.nfe { background-color: var(--up-tipo-nfe); }
.ent-mapa-gota.nfce { background-color: var(--up-tipo-nfce); }

/* posicao aproximada (centro da rua, do CEP ou do bairro): o pino mais
   claro. Antes era a borda tracejada, que na gota girada parecia uma
   engrenagem */
.ent-mapa-gota.aprox {
  opacity: 0.62;
}

.ent-mapa-pino.marcado .ent-mapa-gota.aprox {
  opacity: 0.85;
}

.ent-mapa-pino.marcado .ent-mapa-gota {
  left: 0;
  top: -2px;
  width: 30px;
  height: 30px;
  box-shadow: 0 0 0 3px var(--up-resolvida), var(--up-sombra-menu);
}

.ent-mapa-ok {
  position: absolute;
  top: -8px;
  right: -8px;
  display: flex;
  align-items: center;
  justify-content: center;
  width: 17px;
  height: 17px;
  border: 2px solid var(--up-superficie);
  border-radius: 50%;
  background-color: var(--up-resolvida);
  font-size: 10px;
  font-weight: 700;
  color: var(--up-superficie);
}

/* o grupo de pinos de longe (Leaflet.markercluster): azul escuro; verde com
   todos marcados; petroleo com parte marcada */
.ent-mapa-grupo {
  display: flex;
  align-items: center;
  justify-content: center;
  width: 100%;
  height: 100%;
  border: 3px solid var(--up-superficie);
  border-radius: 50%;
  background-color: var(--up-marca-escura);
  box-shadow: 0 0 0 4px var(--up-primaria-claro);
  color: var(--up-superficie);
}

.ent-mapa-grupo b {
  font-size: 14px;
  font-weight: 700;
}

.ent-mapa-grupo.marcado {
  background-color: var(--up-resolvida);
  box-shadow: 0 0 0 4px var(--up-resolvida-fundo);
}

.ent-mapa-grupo.parte {
  background-color: var(--up-acao-alterar);
}

.ent-mapa-loja {
  display: flex;
  align-items: center;
  gap: 0.35rem;
  white-space: nowrap;
}

.ent-mapa-loja-ico {
  display: flex;
  flex: 0 0 30px;
  align-items: center;
  justify-content: center;
  height: 30px;
  border-radius: 8px;
  background-color: var(--up-marca-escura);
  box-shadow: var(--up-sombra-menu);
  color: var(--up-superficie);
}

.ent-mapa-loja b {
  padding: 0.05rem 0.4rem;
  border-radius: 5px;
  background-color: var(--up-superficie);
  box-shadow: var(--up-sombra-cartao-leve);
  font-size: 11px;
  color: var(--up-marca-escura);
}

/* --- O cartaozinho do pino (popup do Leaflet) --- */

.ent-mapa-popup {
  display: flex;
  flex-direction: column;
  gap: 0.35rem;
  font-family: var(--up-fonte);
  font-size: 12px;
  color: var(--up-texto);
}

.ent-mapa-popup-cab b {
  display: block;
  font-size: 13px;
  color: var(--up-marca-escura);
}

.ent-mapa-popup-cab small {
  color: var(--up-texto-suave);
}

.ent-mapa-popup-doc {
  display: grid;
  grid-template-columns: 16px minmax(0, 1fr) auto;
  align-items: center;
  gap: 0.45rem;
  margin: 0;
  padding-top: 0.35rem;
  border-top: 1px solid var(--up-borda-suave);
  cursor: pointer;
}

.ent-mapa-popup-doc input {
  width: 15px;
  height: 15px;
  margin: 0;
  accent-color: var(--up-primaria);
}

.ent-mapa-popup-texto b {
  display: block;
  font-weight: 600;
}

.ent-mapa-popup-texto small {
  color: var(--up-texto-suave);
}

.ent-mapa-popup-aviso {
  padding: 0.15rem 0.45rem;
  border-radius: 5px;
  background-color: var(--up-intervencao-fundo);
  font-size: 11px;
  font-weight: 700;
  color: var(--up-intervencao);
}

.ent-mapa-popup-pe {
  display: flex;
  justify-content: space-between;
  gap: 0.5rem;
  padding-top: 0.3rem;
  border-top: 1px solid var(--up-borda-suave);
  font-size: 11px;
  color: var(--up-texto-suave);
}

.ent-check {
  display: flex;
  align-items: center;
  gap: 0.45rem;
  font-size: 13px;
}

/* --- Formulario da carga e Baixa (01/10/2026): o mesmo acabamento -----------
   Faixa no azul escuro da marca com o numero e a situacao da carga (o mesmo
   cabecalho do painel "Montar carga"), e o conteudo num cartao branco sobre o
   fundo claro. Antes era o titulo azul (.bloco-titulo) solto em cima dos
   campos; o comportamento das duas telas nao mudou. */

.ent-faixa {
  display: flex;
  align-items: center;
  gap: 0.75rem;
  margin-bottom: 0.65rem;
  padding: 0.6rem 1rem;
  border-radius: 10px;
  background-color: var(--up-marca-escura);
  color: var(--up-superficie);
}

/* A faixa NUNCA rola (01/10/2026, regra do cliente para toda ficha que tiver
   este cabecalho -- cliente, carga e qualquer cadastro que o ganhar): presa
   no topo do .painel, so os campos/cartoes passam por baixo dela.
   - `top: 0` ja e o lugar dela: o Chrome conta o `top` a partir do fim do
     padding do .painel (os 0.65rem do .painel-fin), entao ela nao pula. Com
     `top: 0.65rem` (primeira versao) sobrava uma fresta dupla em cima, por
     onde os campos apareciam rolando;
   - a sombra sem desfoque, na cor do fundo, tapa a faixa de fundo em volta
     (o respiro de cima e o margin-bottom), para o cartao que sobe sumir na
     borda da faixa em vez de aparecer por cima/atras dos cantos arredondados;
   - `z-index` acima dos campos com `position` (interruptor, listas de busca).
   Nas telas fixas (Baixa, Acerto) o .painel nao rola e isto nao muda nada. */
.ent-faixa {
  position: sticky;
  top: 0;
  z-index: 5;
  /* duas sombras: a de cima sobe mais 0.65rem (o fio da borda do .painel
     ainda deixava ver o alto dos campos rolando) */
  box-shadow:
    0 0 0 0.65rem var(--up-papel-parede),
    0 -0.65rem 0 0.65rem var(--up-papel-parede);
}

.ent-faixa-icone {
  display: flex;
  flex: 0 0 38px;
  align-items: center;
  justify-content: center;
  height: 38px;
  border-radius: 9px;
  background-color: var(--up-realce-sobre-escuro);
}

.ent-faixa-titulo span {
  display: block;
  font-size: 10.5px;
  font-weight: 700;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  opacity: 0.75;
}

.ent-faixa-titulo h1 {
  margin: 0;
  font-size: 18px;
  font-weight: 700;
}

/* o resumo (documentos e valor) vai para a direita da faixa: saiu do rodape,
   que ficou so com os botoes */
.ent-faixa-resumo {
  margin-left: auto;
  font-size: 13px;
  font-weight: 700;
  font-variant-numeric: tabular-nums;
  white-space: nowrap;
}

.ent-form-cartao {
  padding: 0.6rem 1rem 0.9rem;
  border: 1px solid var(--up-borda);
  border-radius: 10px;
  background-color: var(--up-superficie);
  box-shadow: var(--up-sombra-cartao-leve);
}

.ent-form .rodape-documento {
  justify-content: flex-end;
}

/* --- Acerto financeiro da carga (01/10/2026, entrega_acerto.html) -------------------
   A prestacao de contas do motorista depois da Baixa. Mesma faixa escura e
   cartao branco da Baixa; a situacao nova usa o roxo do --up-acerto. */
.etiqueta-status.tom-acerto {
  background-color: var(--up-acerto-fundo);
  color: var(--up-acerto);
}

.ent-coluna-bola.acerto {
  background-color: var(--up-acerto);
}

.evento-acerto_financeiro .evento-marca {
  background-color: var(--up-acerto);
}

.evento-acerto_estornado .evento-marca {
  background-color: var(--up-intervencao);
}

/* os totais em cima da grade: juros e multa, o que havia a receber, o
   recebido (verde), o que ficou em aberto (ambar) e o dinheiro que deve estar
   com o motorista. Eram quatro; juros e multa entraram em 01/10/2026, na
   ordem das colunas da grade, para explicar o a receber maior que o saldo. */
.ent-acerto-totais {
  display: grid;
  grid-template-columns: repeat(6, minmax(0, 1fr));
  gap: 0.65rem;
  margin: 0.75rem 0 0.25rem;
}

.ent-acerto-total {
  display: flex;
  flex-direction: column;
  gap: 2px;
  padding: 0.45rem 0.75rem;
  border: 1px solid var(--up-borda-suave);
  border-radius: 6px;
  background-color: var(--up-cinza-frio);
}

.ent-acerto-total span {
  font-size: 10.5px;
  font-weight: 700;
  letter-spacing: 0.04em;
  text-transform: uppercase;
  color: var(--up-texto-suave);
}

.ent-acerto-total b {
  font-size: 16px;
  color: var(--up-marca-escura);
}

.ent-acerto-total.ok b {
  color: var(--up-resolvida);
}

.ent-acerto-total.aviso b {
  color: var(--up-intervencao);
}

.carga-acerto {
  max-height: 18rem;
  overflow-y: auto;
}

.carga-acerto thead th {
  position: sticky;
  top: 0;
  z-index: 1;
}

/* documento sem nada a receber (pago, sem financeiro, nao entregue): fica na
   lista so para conferencia, apagado */
.carga-acerto tr.sem-acerto td {
  color: var(--up-texto-suave);
}

.carga-acerto .campo-celula {
  min-width: 9rem;
}

.carga-acerto .ent-financeiro {
  display: block;
}

.ent-acerto-formas {
  display: flex;
  align-items: center;
  gap: 0.4rem;
  min-width: 0;
}

.ent-acerto-formas span {
  overflow: hidden;
  font-size: 11.5px;
  white-space: nowrap;
  text-overflow: ellipsis;
}

/* "Fica em aberto" na linha: o ambar do aviso, como o "Em aberto" do financeiro */
.ent-acerto-aberto {
  font-size: 11.5px;
  font-weight: 700;
  color: var(--up-intervencao);
}

.ent-acerto-rodape {
  margin-top: 0.75rem;
}

.ent-acerto-rotulo {
  font-size: 12px;
  font-weight: 600;
  color: var(--up-texto-suave);
}

/* a diferenca do dinheiro: verde quando bate, ambar quando sobra ou falta */
.ent-acerto-diferenca {
  display: flex;
  align-items: center;
  min-height: 28px;
  font-size: 14px;
  font-weight: 700;
  color: var(--up-texto-suave);
}

.ent-acerto-diferenca.ok {
  color: var(--up-resolvida);
}

.ent-acerto-diferenca.aviso {
  color: var(--up-intervencao);
}

/* a janela "Como foi recebido" */
.ent-acerto-dialogo-doc {
  margin: 0 0 0.6rem;
  font-size: 12.5px;
  color: var(--up-cinza-chumbo);
}

.ent-acerto-dialogo-pe {
  display: flex;
  align-items: center;
  justify-content: space-between;
  margin: 0.5rem 0 0.75rem;
  font-size: 12.5px;
  font-weight: 700;
  color: var(--up-cinza-chumbo);
}

#gradeFormas .campo-celula {
  width: 100%;
  min-width: 7rem;
}

#gradeFormas input.campo-celula,
.carga-acerto input.campo-celula {
  padding-right: 4px;
  background-image: none;
}

#gradeFormas .ent-acerto-cheque {
  display: flex;
  gap: 0.35rem;
}

.ent-acerto-tirar {
  width: 2.25rem;
}

@media (max-width: 1100px) {
  .ent-acerto-totais {
    grid-template-columns: repeat(3, minmax(0, 1fr));
  }
}

/* ==========================================================================
   Cadastros no "Modelo A" (.cad-*): a nova aparencia das listagens e fichas
   Nasceu em Clientes (01/10/2026, piloto, classes `.cli-*`): o visual das
   telas da Expedicao numa listagem que PRECISA do AG Grid (a base de
   clientes e grande demais para vir inteira ao navegador). O motor da grade
   nao mudou -- carga aos poucos pela API, colunas arrastaveis e
   redimensionaveis, configuracao e exportacao --; aqui so muda a roupa:
   fundo claro (.painel-fin), barra de uma linha com a pesquisa em pilula
   (.cc-busca) e a grade num cartao branco, sem as bordas de planilha. O
   formulario reaproveita a faixa escura da carga (.ent-faixa) e os cartoes
   do financeiro (.fin-cartao).
   Em 02/10/2026 o cliente aprovou o piloto para Produtos, Vendedores,
   Motoristas (e os cadastros da Expedicao que dividem o molde com ele:
   Rotas, Tipos de envio, Veiculos). O prefixo `cli-` virou `cad-` -- um
   desenho so, em vez de uma copia por tela. Ficaram `cli-` apenas as pecas
   que so Clientes tem (a consulta de CNPJ, mais abaixo). As emprestadas
   (.ent-faixa, .fin-cartao, .cc-busca) seguiram com o nome de origem: sao
   as mesmas regras das telas de la, e trocar o nome mexeria em todas elas.
   ========================================================================== */

/* --- Listagem: a cadeia de altura -------------------------------------------
   .painel.painel-coluna (flex em coluna, nao rola) -> .cad-tela -> o cartao,
   que fica com a altura que sobra -> a grade (flex 1, regra do .grade-ag). */

.cad-tela {
  display: flex;
  flex: 1 1 auto;
  flex-direction: column;
  gap: 0.65rem;
  min-height: 0;
}

.cad-tela > * {
  flex-shrink: 0;
}

.cad-cabecalho {
  display: flex;
  align-items: center;
  flex-wrap: wrap;
  gap: 0.5rem;
}

/* a pesquisa estica ate os botoes; abaixo de 220px a barra quebra a linha
   em vez de espremer a pesquisa (o .cc-busca nasce com 360px fixos) */
.cad-busca {
  flex: 1 1 220px;
  width: auto;
  /* 30px, a altura das linhas da grade e dos botoes ao lado (era os 36px
     do .cc-busca; pedido do cliente em 01/10/2026) */
  height: 30px;
}

.cad-acoes {
  display: flex;
  align-items: center;
  gap: 0.5rem;
  margin-left: auto;
}

/* Botoes da barra com 30px, a mesma altura das linhas da grade (pedido do
   cliente em 01/10/2026; a primeira versao tinha 36px, a altura do
   .cc-busca, que baixou junto) e com o raio das pilulas. A cor continua a
   do sentido (.botao-incluir verde, .botao-alterar petroleo); so a medida
   muda. */
/* Tambem no rodape da ficha (Ficha do cliente, Gravar, Cancelar): a regra
   dos 28px do rodape (`.rodape-documento .acoes-formulario .botao-acao`)
   tem 3 classes; `.cad-form`/`.cad-tela` no seletor empata e esta, por vir
   depois, vence. */
.cad-tela .botao-acao.cad-botao,
.cad-form .botao-acao.cad-botao {
  height: 30px;
  padding: 0 0.9rem;
  border-radius: 8px;
  font-size: 12.5px;
}

/* depois do `.cad-tela > *` de proposito: o cartao e o unico que cresce */
.cad-cartao {
  display: flex;
  flex: 1 1 auto;
  flex-direction: column;
  min-height: 0;
  border: 1px solid var(--up-borda);
  border-radius: 10px;
  background-color: var(--up-superficie);
  box-shadow: var(--up-sombra-cartao-leve);
  overflow: hidden;
}

/* --- A grade dentro do cartao ------------------------------------------------
   Os tokens do tema alpine trocados so aqui: a moldura sai (o cartao ja e
   ela), os separadores verticais tambem (fica so a linha entre os registros,
   como na lista das Entregas), e o cabecalho vira a faixa cinza de letras
   pequenas em caixa alta do Modelo A. A alca de largura continua la, mais
   discreta: as colunas seguem redimensionaveis. Altura de linha e cabecalho
   sao opcao de JS (30/30 em clientes_grade.js, produtos_grade.js,
   vendedores_grade.js e cadastro_nxt_lista.js). */
.cad-grade.grade-ag.ag-theme-alpine {
  --ag-font-size: 12.5px;
  --ag-wrapper-border-radius: 0;
  --ag-borders: none;
  --ag-header-background-color: var(--up-cinza-frio);
  --ag-header-foreground-color: var(--up-texto-suave);
  --ag-header-column-separator-display: none;
  --ag-header-column-resize-handle-display: block;
  --ag-header-column-resize-handle-color: var(--up-borda);
  --ag-header-column-resize-handle-height: 40%;
  --ag-header-column-resize-handle-width: 1px;
  --ag-cell-horizontal-border: solid transparent;
  --ag-cell-horizontal-padding: 10px;
  --ag-row-border-color: var(--up-borda-suave);
  --ag-row-hover-color: var(--up-papel-parede);
  --ag-selected-row-background-color: var(--up-primaria-fundo);
  --ag-checkbox-checked-color: var(--up-primaria);
  --ag-input-focus-border-color: var(--up-primaria);
}

/* com `--ag-borders: none` a linha embaixo do cabecalho some junto */
.cad-grade.ag-theme-alpine .ag-header {
  border-bottom: 1px solid var(--up-borda);
}

/* 4 classes: o `.grade-ag.ag-theme-alpine .ag-row` (11.5px) tem 3 */
.cad-grade.grade-ag.ag-theme-alpine .ag-row {
  font-size: 12.5px;
}

.cad-grade.ag-theme-alpine .ag-header-cell-text {
  font-size: 10.5px;
  font-weight: 700;
  letter-spacing: 0.04em;
  text-transform: uppercase;
}

/* Linha marcada: alem do fundo, um filete da marca na beirada esquerda. Vai
   como sombra na celula da caixa de marcar porque os ::before/::after da
   linha ja sao do AG Grid (e neles que ele pinta o hover e a selecao). */
.cad-grade .ag-row-selected .celula-escolha {
  box-shadow: inset 3px 0 0 var(--up-primaria);
}

.cad-grade .cad-codigo,
.cad-grade .cad-documento {
  font-variant-numeric: tabular-nums;
}

.cad-grade .cad-codigo {
  color: var(--up-texto-suave);
}

.cad-grade .cad-documento,
.cad-grade .cad-suave {
  color: var(--up-cinza-chumbo);
}

/* Nome: iniciais num circulo (22px: com a linha de 30px sobram 4px de
   respiro em cima e embaixo; era 24px na linha de 36) + o nome em negrito. `inline-flex` com
   `vertical-align: middle` centra na linha sem mexer no `display` da celula
   (que e do AG Grid); `max-width` + `min-width: 0` deixam o nome cortar com
   reticencias quando a coluna estreita. */
.cad-nome {
  display: inline-flex;
  align-items: center;
  gap: 0.55rem;
  max-width: 100%;
  vertical-align: middle;
  line-height: normal;
}

.cad-avatar {
  display: inline-flex;
  flex: 0 0 22px;
  align-items: center;
  justify-content: center;
  height: 22px;
  border-radius: 50%;
  font-size: 9.5px;
  font-weight: 700;
  letter-spacing: 0.02em;
}

.cad-nome-texto {
  min-width: 0;
  overflow: hidden;
  font-weight: 700;
  color: var(--up-marca-escura);
  white-space: nowrap;
  text-overflow: ellipsis;
}

.cad-pilula {
  display: inline-block;
  padding: 0 0.6rem;
  border-radius: 999px;
  font-size: 11px;
  font-weight: 700;
  line-height: 19px;
  vertical-align: middle;
}

.cad-avatar.pj,
.cad-pilula.pj {
  background-color: var(--up-pessoa-juridica-fundo);
  color: var(--up-pessoa-juridica);
}

.cad-avatar.pf,
.cad-pilula.pf {
  background-color: var(--up-pessoa-fisica-fundo);
  color: var(--up-pessoa-fisica);
}

/* Sem tipo de pessoa (motorista, cadastros do Next): o circulo na cor da
   marca e a pilula no cinza discreto, para nao parecer um aviso */
.cad-avatar.marca {
  background-color: var(--up-primaria-fundo);
  color: var(--up-primaria);
}

.cad-pilula {
  background-color: var(--up-cinza-frio);
  color: var(--up-cinza-chumbo);
}

/* a etiqueta Ativo/Inativo na mesma pilula do tipo de pessoa (o
   `.grade-ag .etiqueta-status` geral e de 15px, para linhas de 22) */
.cad-grade .etiqueta-status {
  padding-inline: 0.6rem;
  line-height: 19px;
  vertical-align: middle;
}

/* Rodape de ferramentas (colunas, exportar, "X de Y") como pe do cartao */
.cad-cartao .grade-rodape-ferramentas {
  padding: 0.4rem 0.75rem;
  border-top: 1px solid var(--up-borda-suave);
  background-color: var(--up-cinza-frio);
}

.cad-cartao .botao-ferramenta-grade {
  width: 26px;
  height: 26px;
  border-radius: 7px;
}

.cad-cartao .contador-registros {
  color: var(--up-texto-suave);
}

/* --- Formulario ----------------------------------------------------------------
   Faixa escura (.ent-faixa) + cartoes (.fin-cartao) empilhados. Os campos
   continuam na medida compacta dos cadastros (#formCliente, #formProduto...
   nas listas do bloco de formulario): so a moldura mudou.
   As regras que precisam vencer o `#formX .campo` daquelas listas levam o
   `:is(#formCliente, ...)` com as fichas da nova aparencia: o `:is()` pesa
   como um id. Ficha nova no visual: somar o id dela ali. */
.cad-cartoes {
  display: flex;
  flex-direction: column;
  gap: 0.65rem;
}

/* Abas da ficha em pilulas (Produto, 02/10/2026: Geral | Impostos). O
   desenho das abas da Expedicao (.ent-abas/.ent-aba), na altura de 30px dos
   botoes da nova aparencia; o comportamento continua o das abas internas de
   sempre (.abas-internas + abas_internas.js). Desfaz o sublinhado e a borda
   de baixo do `.abas-internas`/`.aba-interna` comuns. */
.cad-abas.abas-internas {
  align-self: flex-start;
  flex-shrink: 0;
  gap: 0.25rem;
  margin-bottom: 0.65rem;
  padding: 4px;
  border-bottom: 0;
  border-radius: 10px;
  background-color: var(--up-pilulas-fundo);
}

.cad-abas .aba-interna {
  display: inline-flex;
  align-items: center;
  gap: 0.45rem;
  height: 30px;
  padding: 0 1rem;
  border: 0;
  border-radius: 7px;
  font-size: 13px;
  font-weight: 700;
  color: var(--up-texto-suave);
}

.cad-abas .aba-interna:hover {
  color: var(--up-texto);
}

.cad-abas .aba-interna.ativa {
  background-color: var(--up-superficie);
  box-shadow: var(--up-sombra-cartao-leve);
  color: var(--up-marca-escura);
}

.cad-abas .aba-interna:focus-visible {
  outline: 3px solid var(--up-primaria-claro);
  outline-offset: 0;
}

/* Ativo e Bloquear cliente lado a lado na mesma coluna, cada um com o
   rotulo em cima do seu interruptor (o .campo e coluna; aqui vira linha).
   O id no seletor vence o `#formCliente .campo` (gap de 0.05rem). */
:is(#formCliente, #formProduto, #formVendedor, #formMotorista, #formRota, #formTipoEnvio, #formVeiculo, #formConciliaRegra,
    #formBanco, #formContaCorrente, #formMotivoBaixa, #formPlanoContas, #formTipoCobranca,
    #formTipoComissao, #formTipoDocumento, #formCondicaoPagamento) .campo.cad-situacao {
  flex-direction: row;
  gap: 2rem;
}

.cad-interruptor {
  display: flex;
  flex-direction: column;
  gap: 0.05rem;
}

/* "Tambem e": rotulo na medida dos outros rotulos do formulario */
.cad-papeis-rotulo {
  font-size: 10.5px;
  font-weight: 600;
  line-height: 1.25;
  color: var(--up-texto-suave);
}

/* Os papeis (Fornecedor, Vendedor...) em pilulas de marcar: a marcada fica na
   cor da marca. Antes eram caixas soltas numa linha. O id no seletor vence o
   `#formCliente .campo label` (rotulo de 10.5px). */
.cad-papeis {
  gap: 0.4rem;
  margin-top: 0.2rem;
}

:is(#formCliente, #formProduto, #formVendedor, #formMotorista, #formRota, #formTipoEnvio, #formVeiculo, #formConciliaRegra,
    #formBanco, #formContaCorrente, #formMotivoBaixa, #formPlanoContas, #formTipoCobranca,
    #formTipoComissao, #formTipoDocumento, #formCondicaoPagamento) .cad-papeis .campo-marcavel {
  height: 28px;
  padding: 0 0.75rem;
  border: 1px solid var(--up-borda);
  border-radius: 999px;
  background-color: var(--up-superficie);
  font-size: 12px;
  line-height: 1;
}

:is(#formCliente, #formProduto, #formVendedor, #formMotorista, #formRota, #formTipoEnvio, #formVeiculo, #formConciliaRegra,
    #formBanco, #formContaCorrente, #formMotivoBaixa, #formPlanoContas, #formTipoCobranca,
    #formTipoComissao, #formTipoDocumento, #formCondicaoPagamento) .cad-papeis .campo-marcavel:has(input:checked) {
  border-color: var(--up-primaria-claro);
  background-color: var(--up-primaria-fundo);
  color: var(--up-primaria);
}

.cad-papeis input {
  accent-color: var(--up-primaria);
}

/* --- Consultar contribuinte (01/10/2026) -------------------------------------
   A lupa colada no campo CNPJ (mesma altura dele: o par estica junto) e a
   janela de conferencia dos dados da Receita. O topo da janela repete a faixa
   escura da ficha (.ent-faixa), para ler como "o cadastro que vai entrar". */
.cad-doc-linha {
  display: flex;
  align-items: stretch;
  gap: 0.3rem;
}

.cad-doc-linha input {
  flex: 1 1 auto;
  min-width: 0;
}

.cli-consultar {
  display: inline-flex;
  flex: 0 0 26px;
  align-items: center;
  justify-content: center;
  padding: 0;
  border: 1px solid var(--up-primaria-claro);
  border-radius: 4px;
  background-color: var(--up-primaria-fundo);
  color: var(--up-primaria);
}

.cli-consultar:hover:enabled,
.cli-consultar:focus-visible {
  background-color: var(--up-primaria);
  color: var(--up-superficie);
}

/* o `display` acima venceria o [hidden] do navegador (Pessoa Fisica) */
.cli-consultar[hidden] {
  display: none;
}

/* consultando: a lupa pulsa ate a resposta chegar */
.cli-consultar.consultando .icone {
  animation: cli-pulsar 0.9s ease-in-out infinite;
}

@keyframes cli-pulsar {
  50% {
    opacity: 0.35;
  }
}

@media (prefers-reduced-motion: reduce) {
  .cli-consultar.consultando .icone {
    animation: none;
  }
}

.cli-dialogo-cnpj {
  width: min(36rem, calc(100vw - 2rem));
  overflow: hidden;
}

.cli-cnpj-topo {
  display: flex;
  align-items: center;
  gap: 0.75rem;
  padding: 0.9rem 1.25rem;
  background-color: var(--up-marca-escura);
  color: var(--up-superficie);
}

.cli-cnpj-icone {
  display: flex;
  flex: 0 0 38px;
  align-items: center;
  justify-content: center;
  height: 38px;
  border-radius: 9px;
  background-color: var(--up-realce-sobre-escuro);
}

.cli-cnpj-titulos {
  min-width: 0;
}

.cli-cnpj-titulos > span {
  display: block;
  font-size: 10.5px;
  font-weight: 700;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  opacity: 0.75;
}

.cli-cnpj-titulos h2 {
  margin: 0;
  font-size: 16px;
  font-weight: 700;
}

.cli-cnpj-titulos p {
  display: flex;
  align-items: center;
  flex-wrap: wrap;
  gap: 0.5rem;
  margin: 0.15rem 0 0;
  font-size: 12.5px;
}

.cli-cnpj-aviso {
  margin: 0.85rem 1.25rem 0;
  padding: 0.55rem 0.75rem;
  border-radius: 8px;
  background-color: var(--up-intervencao-fundo);
  font-size: 12.5px;
  font-weight: 700;
  color: var(--up-intervencao);
}

.cli-cnpj-instrucao {
  margin: 0.85rem 1.25rem 0.4rem;
  font-size: 12px;
  color: var(--up-texto-suave);
}

.cli-cnpj-grupos {
  margin: 0 1.25rem;
  padding: 0;
  border: 1px solid var(--up-borda-suave);
  border-radius: 10px;
  list-style: none;
  overflow: hidden;
}

.cli-cnpj-grupos li + li {
  border-top: 1px solid var(--up-borda-suave);
}

.cli-cnpj-grupos label {
  display: flex;
  align-items: flex-start;
  gap: 0.65rem;
  margin: 0;
  padding: 0.55rem 0.8rem;
}

.cli-cnpj-grupos input {
  margin-top: 0.2rem;
  accent-color: var(--up-primaria);
}

.cli-cnpj-textos {
  display: flex;
  flex-direction: column;
  gap: 0.1rem;
  min-width: 0;
}

.cli-cnpj-textos b {
  font-size: 10.5px;
  letter-spacing: 0.04em;
  text-transform: uppercase;
  color: var(--up-texto-suave);
}

.cli-cnpj-textos span {
  font-size: 13px;
  color: var(--up-texto);
  overflow-wrap: anywhere;
}

.cli-cnpj-fonte {
  margin: 0.6rem 1.25rem 0;
  font-size: 11px;
  color: var(--up-texto-suave);
}

/* ==========================================================================
   EXPEDICAO > PREPARACAO (02/10/2026) -- o "Modelo B" escolhido pelo cliente
   no canvas: Aguardando, Separacao e Conferencia num quadro so (cartoes
   compactos) e o painel do pedido escolhido a direita, mais a aba "Liberados
   hoje". So existe no fluxo com liberacao financeira. Montada pelo
   preparacao.js.

   Veste as pecas da tela de Entregas de proposito: abas em pilula
   (.ent-abas), busca e segmento (.cc-busca/.ent-seg), colunas do Kanban
   (.ent-coluna), lista (.ent-lista/.ent-rolagem) e o painel com cabecalho
   escuro (.ent-montar). Aqui so o que e da Preparacao. Tela fixa: rolam as
   colunas, a lista e o meio do painel.
   ========================================================================== */

.prep-conteudo {
  display: flex;
  flex: 1 1 auto;
  gap: 0.85rem;
  min-height: 0;
}

.prep-quadro {
  display: grid;
  flex: 1 1 auto;
  grid-template-columns: repeat(3, minmax(0, 1fr));
  gap: 0.75rem;
  min-width: 0;
  min-height: 0;
}

/* .ent-lista e .ent-montar sao flex: sem isto o [hidden] nao esconde */
.prep-quadro[hidden],
.prep-lib[hidden],
.prep-det-conteudo[hidden],
.prep-det-acoes[hidden],
.prep-det-vazio[hidden],
.prep-det-aviso[hidden],
.prep-link[hidden] {
  display: none;
}

/* a bolinha da coluna: ambar esperando, azul separando, verde conferindo --
   a mesma leitura das situacoes das cargas */
.ent-coluna-bola.prep-aguardando {
  background-color: var(--up-acao-inativar);
}

.ent-coluna-bola.prep-separacao {
  background-color: var(--up-azul-royal);
}

.ent-coluna-bola.prep-conferencia {
  background-color: var(--up-resolvida);
}

/* --- Cartao compacto (um botao: clicar escolhe o pedido) ------------------ */

.prep-cartao {
  display: flex;
  flex-shrink: 0;
  flex-direction: column;
  gap: 0.25rem;
  width: 100%;
  padding: 0.5rem 0.65rem;
  border: 1px solid var(--up-borda-suave);
  border-radius: 8px;
  background-color: var(--up-superficie);
  box-shadow: var(--up-sombra-cartao-leve);
  font-family: var(--up-fonte);
  color: var(--up-texto);
  text-align: left;
  cursor: pointer;
}

.prep-cartao:hover {
  border-color: var(--up-borda);
}

.prep-cartao.escolhido {
  border-color: var(--up-primaria);
  box-shadow: 0 0 0 2px var(--up-primaria-claro);
}

.prep-cartao:focus-visible {
  outline: 3px solid var(--up-primaria-claro);
}

.prep-cartao-1 {
  display: flex;
  align-items: center;
  gap: 0.4rem;
}

.prep-cartao-1 b {
  font-size: 13px;
  color: var(--up-marca-escura);
}

.prep-envio {
  display: inline-flex;
  gap: 2px;
  color: var(--up-texto-suave);
}

.prep-cartao-valor {
  margin-left: auto;
  font-size: 12.5px;
  font-weight: 700;
  font-variant-numeric: tabular-nums;
  color: var(--up-marca-escura);
  white-space: nowrap;
}

.prep-cartao-cliente,
.prep-corta {
  overflow: hidden;
  font-size: 12px;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.prep-cartao-3 {
  display: flex;
  align-items: center;
  gap: 0.5rem;
  min-height: 20px;
  font-size: 11px;
  color: var(--up-texto-suave);
}

.prep-cartao-tempo {
  margin-left: auto;
  white-space: nowrap;
}

/* barra dos itens separados: azul andando, verde quando completa */
.prep-progresso {
  display: block;
  flex: 1 1 auto;
  height: 5px;
  border-radius: 3px;
  background-color: var(--up-borda-suave);
  overflow: hidden;
}

.prep-progresso > span {
  display: block;
  height: 100%;
  background-color: var(--up-azul-royal);
}

.prep-progresso.cheio > span {
  background-color: var(--up-resolvida);
}

/* etiqueta da Retirada: neutra, para nao competir com a da Entrega (azul) */
.etiqueta-status.prep-tom-neutro {
  background-color: var(--up-cinza-frio);
  color: var(--up-texto-suave);
}

/* --- Aba Liberados hoje ---------------------------------------------------- */

.prep-lib {
  flex: 1 1 auto;
  min-width: 0;
}

.prep-lib-resumo {
  display: flex;
  flex-shrink: 0;
  align-items: center;
  gap: 0.5rem;
  padding: 0.55rem 0.85rem;
  border-bottom: 1px solid var(--up-borda);
}

.prep-lib-resumo h2 {
  margin: 0 0.35rem 0 0;
  font-size: 14px;
  font-weight: 700;
  color: var(--up-marca-escura);
}

.prep-lib-cab,
.prep-lib-linha {
  display: grid;
  grid-template-columns: 90px minmax(0, 1fr) minmax(0, 1fr) 104px 150px 66px 56px minmax(0, 130px) 136px;
  align-items: center;
  gap: 0 0.65rem;
  padding: 0 0.85rem;
}

.prep-lib-cab {
  flex-shrink: 0;
  min-height: 32px;
  border-bottom: 1px solid var(--up-borda);
  background-color: var(--up-cinza-frio);
  font-size: 10.5px;
  font-weight: 700;
  letter-spacing: 0.04em;
  text-transform: uppercase;
  color: var(--up-texto-suave);
}

.prep-lib-linha {
  width: 100%;
  min-height: 38px;
  border: 0;
  border-bottom: 1px solid var(--up-borda-suave);
  background-color: var(--up-superficie);
  font-family: var(--up-fonte);
  font-size: 12.5px;
  color: var(--up-texto);
  text-align: left;
}

.prep-lib-linha:hover {
  background-color: var(--up-primaria-fundo);
}

.prep-lib-linha.escolhido {
  background-color: var(--up-primaria-fundo);
  box-shadow: inset 3px 0 0 var(--up-primaria);
}

.prep-lib-linha b {
  color: var(--up-marca-escura);
}

.prep-lib-linha:focus-visible {
  outline: 2px solid var(--up-primaria);
  outline-offset: -2px;
}

/* Pendencias (04/10/2026): o que segura o pedido fora da Retirada / das
   Entregas -- a primeira em amarelo (cortada com reticencias), as outras no
   "+N"; todas no title */
.prep-pendencias {
  display: inline-flex;
  align-items: center;
  gap: 5px;
  max-width: 100%;
  min-width: 0;
}

.prep-pendencias .etiqueta-status {
  display: inline-flex;
  align-items: center;
  gap: 4px;
  min-width: 0;
}

.prep-pendencias .etiqueta-status svg {
  flex: none;
}

.prep-pendencias .etiqueta-status span {
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.prep-pendencias-mais {
  flex: none;
  font-size: 11px;
  font-weight: 700;
  color: var(--up-intervencao);
}

/* Atalho para a tela que recebeu o pedido (04/10/2026): "Ir para Entrega" /
   "Ir para Retirada" na ultima coluna; o misto mostra os dois so com o
   icone. O botao neutro da linha (.ret-botao-linha), baixo para caber nos
   38px da linha e sem as maiusculas do .botao-acao. */
.prep-atalhos {
  display: flex;
  justify-content: flex-end;
  gap: 6px;
}

.botao-acao.prep-ir {
  height: 26px;
  padding: 0 9px;
  gap: 5px;
  border-radius: 6px;
  font-size: 11.5px;
  letter-spacing: 0;
  text-transform: none;
  white-space: nowrap;
}

.botao-acao.prep-ir.prep-ir-curto {
  width: 30px;
  padding: 0;
}

/* --- Painel do pedido ------------------------------------------------------ */

.ent-montar.prep-det {
  flex: 0 0 400px;
}

.prep-det.ocupado {
  opacity: 0.7;
  pointer-events: none;
}

.prep-det-conteudo {
  display: flex;
  flex: 1 1 auto;
  flex-direction: column;
  min-height: 0;
}

.ent-montar-cab.prep-det-cab {
  align-items: flex-start;
}

.prep-det-titulo {
  min-width: 0;
}

.prep-det-titulo small {
  font-size: 10.5px;
  font-weight: 700;
  letter-spacing: 0.06em;
  opacity: 0.75;
}

.prep-det-titulo h2 {
  margin: 0;
  font-size: 18px;
  font-weight: 700;
}

.prep-det-titulo p {
  margin: 0;
  overflow: hidden;
  font-size: 12.5px;
  text-overflow: ellipsis;
  white-space: nowrap;
  opacity: 0.85;
}

.prep-det-etiquetas {
  display: flex;
  flex-direction: column;
  align-items: flex-end;
  gap: 0.3rem;
  margin-left: auto;
}

.prep-etiqueta-escura {
  display: inline-flex;
  align-items: center;
  gap: 0.25rem;
  padding: 0.1rem 0.55rem;
  border-radius: 999px;
  background-color: var(--up-realce-sobre-escuro);
  font-size: 11px;
  font-weight: 700;
  white-space: nowrap;
}

/* os passos do pedido: verde feito, anel da marca na etapa atual */
.prep-passos {
  display: grid;
  flex-shrink: 0;
  grid-template-columns: repeat(5, minmax(0, 1fr));
  margin: 0;
  padding: 0.6rem 0.4rem 0.5rem;
  border-bottom: 1px solid var(--up-borda-suave);
  list-style: none;
}

.prep-passos li {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 0.25rem;
  font-size: 10.5px;
  text-align: center;
  color: var(--up-texto-suave);
}

.prep-passo-bola {
  display: flex;
  align-items: center;
  justify-content: center;
  width: 20px;
  height: 20px;
  border: 2px solid var(--up-borda);
  border-radius: 50%;
  background-color: var(--up-superficie);
  color: var(--up-superficie);
}

.prep-passos li.feito {
  color: var(--up-resolvida);
}

.prep-passos li.feito .prep-passo-bola {
  border-color: var(--up-resolvida);
  background-color: var(--up-resolvida);
}

.prep-passos li.atual {
  font-weight: 700;
  color: var(--up-primaria);
}

.prep-passos li.atual .prep-passo-bola {
  border-color: var(--up-primaria);
  box-shadow: 0 0 0 3px var(--up-primaria-fundo);
}

.ent-montar-meio.prep-det-meio {
  display: flex;
  flex-direction: column;
  gap: 0.75rem;
  padding: 0.6rem 0.9rem;
}

.prep-dados {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: 0.4rem 1rem;
  margin: 0;
}

.prep-dados dt {
  font-size: 10px;
  font-weight: 700;
  letter-spacing: 0.04em;
  text-transform: uppercase;
  color: var(--up-texto-suave);
}

.prep-dados dd {
  margin: 0;
  font-size: 13px;
  font-weight: 700;
  color: var(--up-marca-escura);
}

.prep-secao h3 {
  display: flex;
  align-items: center;
  gap: 0.5rem;
  margin: 0 0 0.35rem;
  font-size: 11px;
  font-weight: 700;
  letter-spacing: 0.05em;
  text-transform: uppercase;
  color: var(--up-marca-escura);
}

.prep-secao h3 span {
  margin-left: auto;
  font-weight: 400;
  letter-spacing: 0;
  text-transform: none;
  color: var(--up-texto-suave);
}

.prep-link {
  padding: 0;
  border: 0;
  background: none;
  font-family: var(--up-fonte);
  font-size: 11.5px;
  font-weight: 400;
  letter-spacing: 0;
  text-decoration: underline;
  text-transform: none;
  color: var(--up-azul-royal);
  cursor: pointer;
}

.prep-itens,
.prep-historico {
  margin: 0;
  padding: 0;
  list-style: none;
}

.prep-itens {
  border: 1px solid var(--up-borda-suave);
  border-radius: 7px;
}

.prep-itens li {
  border-bottom: 1px solid var(--up-borda-suave);
}

.prep-itens li:last-child {
  border-bottom: 0;
}

.prep-itens label {
  display: flex;
  align-items: center;
  gap: 0.5rem;
  margin: 0;
  padding: 0.35rem 0.6rem;
  font-size: 12px;
  cursor: pointer;
}

.prep-itens input {
  width: 16px;
  height: 16px;
  margin: 0;
  accent-color: var(--up-resolvida);
}

.prep-item-cod {
  flex-shrink: 0;
  width: 42px;
  font-variant-numeric: tabular-nums;
  color: var(--up-texto-suave);
}

.prep-item-nome {
  flex: 1 1 auto;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.prep-item-qtd {
  flex-shrink: 0;
  font-variant-numeric: tabular-nums;
  color: var(--up-texto-suave);
  white-space: nowrap;
}

/* item ja separado: riscado, para o olho achar o que falta */
.prep-itens li.ok .prep-item-nome {
  color: var(--up-texto-suave);
  text-decoration: line-through;
}

.prep-historico {
  display: flex;
  flex-direction: column;
  gap: 0.35rem;
}

.prep-historico li {
  display: flex;
  align-items: baseline;
  gap: 0.5rem;
  font-size: 12px;
}

.prep-historico li::before {
  content: "";
  flex-shrink: 0;
  width: 8px;
  height: 8px;
  border-radius: 50%;
  background-color: var(--up-resolvida);
}

.prep-historico small {
  margin-left: auto;
  font-size: 11px;
  color: var(--up-texto-suave);
  white-space: nowrap;
}

.prep-historico li.prep-vazio::before {
  display: none;
}

.prep-vazio {
  padding: 0.4rem 0.6rem;
  font-size: 12px;
  color: var(--up-texto-suave);
}

.prep-det-aviso {
  flex-shrink: 0;
  margin: 0;
  padding: 0.4rem 0.9rem;
  border-top: 1px solid var(--up-borda-suave);
  background-color: var(--up-cinza-frio);
  font-size: 11.5px;
  color: var(--up-texto-suave);
}

.prep-det-aviso.ok {
  font-weight: 700;
  color: var(--up-resolvida);
}

/* rodape dos botoes: o de seguir em frente estica e fica a direita */
.prep-det-acoes {
  display: flex;
  flex-shrink: 0;
  gap: 0.5rem;
  padding: 0.65rem 0.9rem;
  border-top: 1px solid var(--up-borda-suave);
  background-color: var(--up-cinza-frio);
}

.prep-det-acoes .botao-acao {
  height: 34px;
}

.prep-det-acoes .botao-acao:last-child {
  flex: 1 1 auto;
}

.prep-det-acoes .botao-acao:disabled {
  opacity: 0.55;
  cursor: not-allowed;
}

/* o "seguir em frente" das etapas: a cor da marca (o verde fica para o
   Liberar, que e o fim da preparacao) */
.botao-acao.prep-botao-azul {
  border-color: var(--up-primaria);
  background-color: var(--up-primaria);
  color: var(--up-superficie);
}

.botao-acao.prep-botao-azul:hover:not(:disabled) {
  border-color: var(--up-primaria-escuro);
  background-color: var(--up-primaria-escuro);
}

/* ==========================================================================
   EXPEDICAO > RETIRADAS (02/10/2026) -- o "Modelo A" escolhido pelo cliente
   no canvas (https://claude.ai/artifact/F1vt58inUATo3QPXcqQVAu): pilulas "A
   entregar" | "Entregues", a lista a esquerda e o painel do pedido escolhido
   a direita, com os itens que saem no balcao e o "Entregar ao cliente".
   Antes era uma grade AG Grid com a janela de itens no Entregar.

   Veste as pecas das Entregas (.ent-abas, .ent-seg, .ent-lista,
   .ent-rolagem, .ent-montar) e o painel da Preparacao (.prep-det-*,
   .prep-dados, .prep-itens, .prep-det-acoes). Aqui so o que e da Retirada.
   Tela fixa: rolam a lista e o meio do painel. Montada pelo
   retirada_painel.js.
   ========================================================================== */

.ret-cab,
.ret-linha {
  display: grid;
  grid-template-columns: 84px minmax(0, 1fr) 132px 160px 44px 138px;
  align-items: center;
  gap: 0 0.65rem;
  padding: 0 0.85rem;
}

.ret-cab {
  flex-shrink: 0;
  min-height: 32px;
  border-bottom: 1px solid var(--up-borda);
  background-color: var(--up-cinza-frio);
  font-size: 10.5px;
  font-weight: 700;
  letter-spacing: 0.04em;
  text-transform: uppercase;
  color: var(--up-texto-suave);
}

/* a linha e um botao: clicar escolhe o pedido e abre o painel */
.ret-linha {
  width: 100%;
  min-height: 44px;
  border: 0;
  border-bottom: 1px solid var(--up-borda-suave);
  background-color: var(--up-superficie);
  font-family: var(--up-fonte);
  font-size: 12.5px;
  color: var(--up-texto);
  text-align: left;
  cursor: pointer;
}

.ret-linha:hover {
  background-color: var(--up-papel-parede);
}

/* o escolhido: o fundo da marca e o filete a esquerda, como a linha marcada
   da nova aparencia (Clientes) e os Liberados hoje da Preparacao */
.ret-linha.escolhido {
  background-color: var(--up-primaria-fundo);
  box-shadow: inset 3px 0 0 var(--up-primaria);
}

.ret-linha:focus-visible {
  outline: 3px solid var(--up-primaria-claro);
  outline-offset: -3px;
}

.ret-linha > b {
  color: var(--up-marca-escura);
}

/* cliente em negrito e o vendedor embaixo, menor: e assim que o balcao acha
   o pedido quando o cliente diz o nome */
.ret-cliente {
  display: flex;
  flex-direction: column;
  min-width: 0;
  line-height: 1.25;
}

.ret-cliente b,
.ret-cliente small {
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.ret-cliente b {
  font-size: 13px;
  color: var(--up-marca-escura);
}

.ret-cliente small {
  font-size: 11px;
  color: var(--up-texto-suave);
}

/* abaixo de ~1280px a coluna Documento sai (o tipo continua no painel) para
   o cliente nao ficar espremido ao lado do painel */
@media (max-width: 1279px) {
  .ret-cab,
  .ret-linha {
    grid-template-columns: 84px minmax(0, 1fr) 150px 40px 120px;
  }

  .ret-col-doc {
    display: none;
  }
}

.ret-pe {
  align-items: center;
  gap: 0.75rem;
}

.ret-pe-limite {
  color: var(--up-intervencao);
}

/* os chips do filtro (periodo, vendedor) moram no pe da lista */
.ret-chips {
  display: flex;
  flex-wrap: wrap;
  justify-content: flex-end;
  gap: 0.35rem;
}

.ret-chips .chip-filtro {
  margin: 0;
}

/* o Atualizar gira uma volta a cada clique, como o das grades */
.ret-tela .cc-filtro.girando .icone {
  animation: atualizar-grade-girar 0.6s ease-in-out;
}

@media (prefers-reduced-motion: reduce) {
  .ret-tela .cc-filtro.girando .icone {
    animation: none;
  }
}

/* .ent-seg e flex: sem isto o [hidden] nao esconde */
.ret-tela .ent-seg[hidden] {
  display: none;
}

/* --- Painel do pedido ------------------------------------------------------ */

.ent-montar.prep-det.ret-det {
  flex: 0 0 430px;
}

.ret-det .prep-det-titulo h2 {
  font-size: 20px;
}

/* o aviso do pedido misto, que nasceu na janela do Entregar: aqui sem a
   margem de janela */
.ret-aviso-misto {
  margin: 0;
  font-size: 12.5px;
}

.ret-det .prep-itens label {
  padding: 0.4rem 0.6rem;
  font-size: 12.5px;
}

.ret-item-nome {
  display: flex;
  flex: 1 1 auto;
  flex-direction: column;
  min-width: 0;
}

/* as variacoes da grade (cor/tamanho) embaixo do nome, como na janela antiga */
.ret-variacoes {
  font-size: 11px;
  font-weight: 700;
  color: var(--up-azul-royal);
}

/* a quantidade e o que o balcao confere: em destaque */
.ret-item-qtd {
  font-weight: 700;
  color: var(--up-marca-escura);
}

/* conferido com o cliente: so esmaece (o riscado da Preparacao diz "feito",
   e aqui marcar e so apoio, nao grava nada) */
.ret-det .prep-itens li.ok .prep-item-nome {
  color: var(--up-texto-suave);
  text-decoration: none;
}

.ret-dica {
  display: flex;
  align-items: center;
  gap: 0.4rem;
  margin: 0;
  font-size: 11.5px;
  color: var(--up-texto-suave);
}

.ret-dica[hidden],
.ret-det .prep-det-acoes [hidden] {
  display: none;
}

/* o rodape: o botao principal (Entregar ou Desfazer) estica; o Rastreio nao.
   O :last-child da Preparacao nao serve aqui porque o ultimo pode estar
   escondido */
.ret-det .prep-det-acoes .botao-acao:last-child {
  flex: 0 0 auto;
}

.ret-det .prep-det-acoes .botao-acao.ret-entregar,
.ret-det .prep-det-acoes .botao-acao.botao-cancelar {
  flex: 1 1 auto;
  justify-content: center;
}

.ret-det .prep-det-acoes .ret-entregar {
  height: 40px;
  font-size: 13px;
}

/* botao neutro (Rastreio): consulta, nao age sobre o pedido -- branco com
   borda, longe do verde do Entregar e do cinza do Desfazer */
.botao-acao.ret-botao-linha {
  border: 1px solid var(--up-borda);
  background-color: var(--up-superficie);
  color: var(--up-texto);
}

.botao-acao.ret-botao-linha:hover:not(:disabled) {
  border-color: var(--up-texto-suave);
  background-color: var(--up-cinza-frio);
}

/* ==========================================================================
   Configuracao de colunas da grade -- nova aparencia (.col-*, 02/10/2026)

   O modal da engrenagem do rodape de TODAS as grades AG Grid
   (partials/grade_ferramentas.html + grade_ferramentas.js). Modelo A do
   canvas https://claude.ai/artifact/JHvqJdsURYmx3ShZpwjArX, escolhido pelo
   cliente sem as setas de subir/descer: a ordem muda clicando no nome e
   arrastando. Faixa escura das fichas, dois cartoes sobre o fundo claro
   ("Fora da grade" e "Na grade"), a nova visao numa faixa e o rodape
   Restaurar | resumo | Cancelar | Gravar. Linhas, botoes e pesquisa com
   30px, as medidas da nova aparencia.
   ========================================================================== */

.modal-dialog.col-dialogo {
  max-width: min(1040px, calc(100vw - 2rem));
}

.col-modal .modal-content {
  overflow: hidden;
  border: 0;
  border-radius: 14px;
  box-shadow: var(--up-sombra-painel-modulo);
  font-family: var(--up-fonte);
  color: var(--up-texto);
}

/* a faixa da ficha (.ent-faixa) sem o sticky e as sombras de tapar o
   fundo: aqui ela e o cabecalho do modal, nao rola com nada */
.col-faixa {
  display: flex;
  align-items: center;
  gap: 0.75rem;
  padding: 14px 16px 14px 18px;
  background-color: var(--up-marca-escura);
  color: var(--up-superficie);
}

.col-faixa .ent-faixa-titulo {
  flex: 1 1 auto;
  min-width: 0;
}

.col-visao {
  display: inline-flex;
  align-items: center;
  height: 24px;
  padding: 0 11px;
  border-radius: 999px;
  background-color: var(--up-realce-sobre-escuro);
  font-size: 12px;
  font-weight: 700;
  white-space: nowrap;
}

.col-fechar {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 30px;
  height: 30px;
  padding: 0;
  border: 0;
  border-radius: 8px;
  background: none;
  color: var(--up-superficie);
  opacity: 0.8;
}

.col-fechar:hover,
.col-fechar:focus-visible {
  background-color: var(--up-realce-sobre-escuro);
  opacity: 1;
}

/* Os dois cartoes tem a mesma altura, que acompanha a janela: no notebook
   (1366x768, ~657px uteis) o modal inteiro cabe sem rolar; as listas e que
   rolam por dentro. */
.col-corpo {
  display: grid;
  grid-template-columns: minmax(0, 0.85fr) minmax(0, 1.15fr);
  grid-template-rows: clamp(280px, calc(100vh - 290px), 470px) auto;
  gap: 14px;
  padding: 16px 18px;
  background-color: var(--up-papel-parede);
}

@media (max-width: 767px) {
  .col-corpo {
    grid-template-columns: minmax(0, 1fr);
    grid-template-rows: 360px 420px auto;
  }
}

.col-cartao {
  display: flex;
  flex-direction: column;
  gap: 10px;
  min-width: 0;
  min-height: 0;
  padding: 14px;
  border: 1px solid var(--up-borda-suave);
  border-radius: 12px;
  background-color: var(--up-superficie);
  box-shadow: var(--up-sombra-cartao-leve);
}

.col-cartao-titulo {
  display: flex;
  align-items: center;
  gap: 8px;
  margin: 0;
  font-size: 14px;
  font-weight: 700;
  color: var(--up-marca-escura);
}

.col-contador {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  min-width: 22px;
  height: 19px;
  padding: 0 7px;
  border-radius: 999px;
  background-color: var(--up-pilulas-fundo);
  font-size: 11px;
  font-variant-numeric: tabular-nums;
}

.col-dica {
  margin: 0;
  font-size: 11.5px;
  color: var(--up-texto-suave);
}

/* a pesquisa em pilula das telas novas (.cc-busca), na altura de 30px */
.cc-busca.col-busca {
  flex: 0 0 auto;
  width: auto;
  height: 30px;
  padding: 0 0.65rem;
  border-radius: 8px;
}

.cc-busca.col-busca input {
  font-size: 12.5px;
}

.col-lista {
  flex: 1 1 auto;
  min-height: 0;
  margin: 0;
  padding: 0;
  overflow-y: auto;
  border: 1px solid var(--up-borda-suave);
  border-radius: 10px;
  background-color: var(--up-superficie);
  list-style: none;
}

.col-lista ol {
  margin: 0;
  padding: 0;
  list-style: none;
}

/* --- Fora da grade --------------------------------------------------------- */

.col-item-fora {
  display: flex;
  align-items: center;
  gap: 8px;
  height: 30px;
  padding: 0 6px 0 12px;
  border-bottom: 1px solid var(--up-borda-suave);
  font-size: 12.5px;
  cursor: grab;
  user-select: none;
}

.col-item-fora:hover {
  background-color: var(--up-cinza-frio);
}

.col-nome-fora {
  flex: 1 1 auto;
  min-width: 0;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.col-vazio {
  padding: 18px 12px;
  font-size: 12px;
  text-align: center;
  color: var(--up-texto-suave);
}

/* uma linha da "Na grade" arrastada para ca sai da grade */
.col-lista-fora.soltar-aqui {
  outline: 2px dashed var(--up-primaria);
  outline-offset: -2px;
  background-color: var(--up-primaria-fundo);
}

/* --- Botoezinhos das linhas (+ e x) ---------------------------------------- */

.col-mini {
  display: inline-flex;
  flex: 0 0 auto;
  align-items: center;
  justify-content: center;
  width: 24px;
  height: 24px;
  padding: 0;
  border: 1px solid transparent;
  border-radius: 7px;
  background: none;
  color: var(--up-texto-suave);
  cursor: pointer;
}

.col-mini-mais {
  border-color: var(--up-primaria-claro);
  background-color: var(--up-superficie);
  color: var(--up-primaria);
}

.col-mini-mais:hover,
.col-mini-mais:focus-visible {
  background-color: var(--up-primaria);
  color: var(--up-superficie);
}

.col-mini-tirar:hover,
.col-mini-tirar:focus-visible {
  background-color: var(--up-pendencia-fundo);
  color: var(--up-pendencia);
}

/* --- Na grade -------------------------------------------------------------- */

.col-cab,
.col-item {
  display: grid;
  grid-template-columns: 18px 22px minmax(0, 1fr) 116px 28px;
  align-items: center;
  gap: 6px;
  height: 30px;
  padding: 0 8px;
}

.col-cab {
  position: sticky;
  top: 0;
  z-index: 1;
  border-bottom: 1px solid var(--up-borda-suave);
  background-color: var(--up-cinza-frio);
  font-size: 10.5px;
  font-weight: 700;
  letter-spacing: 0.04em;
  text-transform: uppercase;
  color: var(--up-texto-suave);
}

/* a linha inteira e a alca: clica no nome e arrasta (pedido do cliente) */
.col-item {
  border-bottom: 1px solid var(--up-borda-suave);
  background-color: var(--up-superficie);
  font-size: 12.5px;
  cursor: grab;
  user-select: none;
}

.col-item:hover {
  background-color: var(--up-cinza-frio);
}

.col-item:active {
  cursor: grabbing;
}

.col-item:focus-visible {
  outline: 2px solid var(--up-primaria-claro);
  outline-offset: -2px;
}

.col-item.arrastando,
.col-item-fora.arrastando {
  opacity: 0.4;
}

/* o fio da marca mostra onde a coluna vai cair */
.col-item.soltar-antes {
  box-shadow: inset 0 2px 0 var(--up-primaria);
}

.col-item.soltar-depois {
  box-shadow: inset 0 -2px 0 var(--up-primaria);
}

.col-alca {
  display: inline-flex;
  color: var(--up-texto-suave);
  opacity: 0.55;
}

.col-pos {
  font-size: 11.5px;
  font-variant-numeric: tabular-nums;
  text-align: right;
  color: var(--up-texto-suave);
}

.col-nome {
  overflow: hidden;
  font-weight: 700;
  text-overflow: ellipsis;
  white-space: nowrap;
  color: var(--up-marca-escura);
}

.col-centro {
  display: flex;
  justify-content: center;
  text-align: center;
}

.col-traco {
  color: var(--up-borda);
}

/* grade sem nenhuma coluna pesquisavel: a coluna da chave fica vazia */
.col-lista-na.sem-pesquisa .col-centro {
  visibility: hidden;
}

/* O .interruptor das fichas, menor (cabe na linha de 30px) e ligado na cor
   da marca, como no canvas -- nas fichas ele segue o azul royal. */
.col-modal .interruptor {
  width: 30px;
  height: 17px;
}

.col-modal .interruptor .trilho::before {
  width: 13px;
  height: 13px;
}

.col-modal .interruptor input:checked + .trilho {
  background-color: var(--up-primaria);
}

.col-modal .interruptor input:checked + .trilho::before {
  transform: translateX(13px);
}

/* --- Nova visao ------------------------------------------------------------ */

.col-cartao.col-nova-visao {
  grid-column: 1 / -1;
  flex-direction: row;
  flex-wrap: wrap;
  align-items: center;
  gap: 12px;
  padding: 10px 14px;
}

.col-nova-rotulo {
  font-size: 13px;
  font-weight: 700;
  white-space: nowrap;
  color: var(--up-marca-escura);
  cursor: pointer;
}

.cc-busca.col-busca.col-nova-descricao {
  flex: 1 1 260px;
  max-width: 420px;
}

.cc-busca.col-busca.col-nova-descricao:has(input:disabled) {
  background-color: var(--up-cinza-frio);
}

.col-dica-direita {
  margin-left: auto;
}

/* --- Rodape ---------------------------------------------------------------- */

.col-rodape {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 8px;
  padding: 12px 18px;
  border-top: 1px solid var(--up-borda-suave);
  background-color: var(--up-superficie);
}

/* os 30px e o raio de 8px da .cad-botao, que la so vale dentro de
   .cad-tela/.cad-form */
.col-rodape .botao-acao.cad-botao {
  height: 30px;
  padding: 0 0.9rem;
  border-radius: 8px;
  font-size: 12.5px;
}

.col-resumo {
  flex: 1 1 auto;
  min-width: 0;
  font-size: 11.5px;
  text-align: right;
  color: var(--up-texto-suave);
}

/* ==========================================================================
   Aviso "Aguarde" (03/10/2026)
   Modelo C do canvas https://claude.ai/artifact/SrQ9GdS8UaQ4j2SbKzFXCU:
   faixa escura centralizada logo abaixo das abas, com "Aguarde" e uma frase
   do motivo (banco, servidor ou internet). Antes, uma chamada demorada so
   deixava a tela parada, sem nenhum aviso. Quem liga, desliga, posiciona
   (top) e escreve a frase e o js/aguarde.js; o elemento mora no base.html.

   E um popover: os valores abaixo desfazem o estilo padrao do navegador para
   [popover] (inset 0, margin auto, borda, fundo Canvas). Nao segura o clique
   (pointer-events: none): avisa, mas nao trava a tela.
   ========================================================================== */

.aguarde {
  display: none;
  position: fixed;
  inset: auto;
  top: 146px;
  left: 50%;
  transform: translateX(-50%);
  z-index: 1090;
  margin: 0;
  border: 0;
  overflow: visible;
  align-items: center;
  gap: 12px;
  padding: 10px 18px;
  border-radius: 12px;
  background-color: var(--up-aguarde-fundo);
  color: var(--up-aguarde-texto);
  box-shadow: var(--up-aguarde-sombra);
  pointer-events: none;
  font-family: var(--up-fonte);
}

.aguarde.aberto {
  display: flex;
}

.aguarde-icone {
  display: inline-flex;
}

.aguarde-icone .icone {
  animation: aguarde-girar 0.9s linear infinite;
}

.aguarde-textos {
  display: flex;
  flex-direction: column;
  line-height: 1.3;
}

.aguarde-titulo {
  font-size: 15px;
  font-weight: 700;
}

.aguarde-frase {
  font-size: 12.5px;
  color: var(--up-aguarde-frase);
}

@keyframes aguarde-girar {
  to {
    transform: rotate(360deg);
  }
}

@media (prefers-reduced-motion: reduce) {
  .aguarde-icone .icone {
    animation: none;
  }
}

/* ==========================================================================
   Filtros rapidos das listas de venda (.fr-*, 03/10/2026)
   Modelo C do canvas https://claude.ai/artifact/3wnJwuLJd8KKU6qiUCgr1j, nas
   tres listas (Orcamento, Pedido de Venda, Pedido de Faturamento): uma linha
   embaixo da pesquisa, NUNCA mais larga que ela (regra do cliente) -- por
   isso a pesquisa e a linha moram juntas na .fr-coluna, que e quem estica na
   barra. Menu escuro "Periodo: X", bolinhas das situacoes da tela, "Nao
   impressos", os chips do filtro avancado que sobraram e "Limpar". Os itens
   sao links montados na rota (_filtros_rapidos); o JS so abre o menu.
   ========================================================================== */

/* os botoes ficam no alto, na linha da pesquisa, e nao no meio das duas */
.barra-ferramentas.com-filtros-rapidos {
  align-items: flex-start;
}

.fr-coluna {
  flex: 1 1 auto;
  min-width: 0;
  display: flex;
  flex-direction: column;
  gap: 6px;
}

/* o .campo-pesquisa estica (flex 1) -- na coluna isso seria esticar para
   baixo */
.fr-coluna .campo-pesquisa {
  flex: none;
}

.fr-linha {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 6px;
}

.fr-periodo-caixa {
  position: relative;
}

.fr-periodo {
  height: 26px;
  display: inline-flex;
  align-items: center;
  gap: 6px;
  padding: 0 10px 0 11px;
  border: 0;
  border-radius: 999px;
  background-color: var(--up-marca-escura);
  color: var(--up-superficie);
  font-size: 12px;
  white-space: nowrap;
  cursor: pointer;
}

.fr-periodo:hover {
  background-color: var(--up-primaria-escuro);
}

.fr-periodo:focus-visible,
.fr-chip:focus-visible,
.fr-limpar:focus-visible {
  outline: 2px solid var(--up-primaria);
  outline-offset: 2px;
}

.fr-periodo-prefixo {
  opacity: 0.75;
}

.fr-menu {
  position: absolute;
  top: calc(100% + 6px);
  left: 0;
  z-index: 1050;
  width: 270px;
  padding: 6px;
  background-color: var(--up-superficie);
  border: 1px solid var(--up-borda);
  border-radius: 10px;
  box-shadow: var(--up-sombra-menu);
}

.fr-menu[hidden] {
  display: none;
}

.fr-menu-item {
  display: flex;
  align-items: center;
  gap: 10px;
  height: 32px;
  padding: 0 10px;
  border-radius: 7px;
  font-size: 12.5px;
  color: var(--up-texto);
  text-decoration: none;
}

.fr-menu-item span:first-child {
  flex: 1 1 auto;
}

.fr-menu-item:hover,
.fr-menu-item:focus-visible {
  background-color: var(--up-primaria-fundo);
  color: var(--up-texto);
}

.fr-menu-item.ativo {
  background-color: var(--up-primaria-fundo);
  color: var(--up-primaria);
  font-weight: 700;
}

.fr-menu-faixa {
  font-size: 11px;
  font-weight: 400;
  color: var(--up-texto-suave);
}

.fr-menu-nota {
  display: flex;
  align-items: center;
  gap: 4px;
  margin: 6px 0 0;
  padding: 8px 10px 4px;
  border-top: 1px solid var(--up-borda-suave);
  font-size: 11.5px;
  color: var(--up-texto-suave);
}

.fr-divisor {
  width: 1px;
  height: 18px;
  margin: 0 2px;
  background-color: var(--up-borda);
}

.fr-chip {
  height: 26px;
  box-sizing: border-box;
  display: inline-flex;
  align-items: center;
  gap: 6px;
  padding: 0 10px;
  border: 1px solid var(--up-borda);
  border-radius: 999px;
  background-color: var(--up-superficie);
  color: var(--up-texto);
  font-size: 12px;
  white-space: nowrap;
  text-decoration: none;
}

.fr-chip:hover {
  border-color: var(--up-primaria);
  color: var(--up-primaria);
}

.fr-chip.ativo {
  border-color: var(--up-primaria);
  background-color: var(--up-primaria-fundo);
  color: var(--up-primaria);
  font-weight: 700;
}

.fr-ponto {
  flex: none;
  width: 8px;
  height: 8px;
  border-radius: 50%;
  background-color: var(--up-situacao-outra);
}

.fr-ponto.status-1 {
  background-color: var(--up-situacao-aberta);
}

.fr-ponto.status-3 {
  background-color: var(--up-situacao-cancelada);
}

.fr-ponto.status-4 {
  background-color: var(--up-situacao-nota);
}

.fr-limpar {
  padding: 0 4px;
  font-size: 12px;
  font-weight: 700;
  color: var(--up-primaria);
  text-decoration: none;
}

.fr-limpar:hover {
  text-decoration: underline;
}

/* Pilula de marcar travada pelo JS (03/10/2026, Cadastro de Conta Corrente:
   "Caixa padrao" sem "Caixa", "Pix no PDV" com "Caixa"): antes so a caixinha
   ficava cinza e a pilula parecia liberada. O motivo continua no title. */
.cad-papeis .campo-marcavel:has(input:disabled) {
  opacity: 0.55;
  cursor: not-allowed;
}

/* A caixinha da pilula com a largura dela (03/10/2026): o `.campo input`
   (largura 100%) tambem pega o checkbox, que esticava e espremia o texto --
   "Receber Pix no PDV" e "Considera para inadimplencia" quebravam em tres
   linhas nas fichas do Financeiro. Em Clientes os textos curtos escondiam. */
.cad-papeis .campo-marcavel {
  white-space: nowrap;
}

.cad-papeis .campo-marcavel input {
  flex: none;
  width: auto;
  margin: 0;
}


/* --- Menu "Periodo" com dois grupos (03/10/2026) ---------------------------
   No financeiro o menu tem a chave Vencimento | Emissao dentro: trocar o
   grupo so mostra a outra lista (js/filtros_rapidos.js), nada navega ate
   escolher o periodo. Mesmo desenho das pilulas .ent-abas. */
.fr-menu-grupos {
  display: flex;
  gap: 2px;
  margin-bottom: 6px;
  padding: 3px;
  border-radius: 999px;
  background-color: var(--up-pilulas-fundo);
}

.fr-menu-grupo {
  flex: 1 1 0;
  height: 26px;
  border: 0;
  border-radius: 999px;
  background: none;
  font-family: var(--up-fonte);
  font-size: 12px;
  color: var(--up-texto-suave);
  cursor: pointer;
}

.fr-menu-grupo.ativo {
  background-color: var(--up-superficie);
  color: var(--up-marca-escura);
  font-weight: 700;
  box-shadow: var(--up-sombra-cartao-leve);
}

.fr-menu-lista[hidden] {
  display: none;
}

/* --- Filtros rapidos montados no navegador (04/10/2026) --------------------
   js/filtros_rapidos_tela.js: a mesma linha nas telas da Expedicao
   (Preparacao, Retirada, Entregas), que filtram no JS. Ali o item do menu, o
   "x" do chip avancado e o "Limpar" sao BOTOES (nao links): tiram a cara de
   botao do navegador. A contagem de cada chip vem miuda ao lado do nome. */
button.fr-menu-item {
  width: 100%;
  border: 0;
  background: none;
  font-family: var(--up-fonte);
  text-align: left;
}

button.fr-limpar,
button.chip-fechar {
  border: 0;
  background: none;
  font-family: var(--up-fonte);
}

button.chip-fechar {
  padding: 0;
}

.fr-chip:disabled {
  opacity: 0.5;
}

.fr-qtd {
  font-size: 11px;
  font-weight: 700;
  color: var(--up-texto-suave);
}

.fr-chip.ativo .fr-qtd {
  color: var(--up-primaria);
}

/* Nas telas .ent-* (Preparacao, Retirada, Entregas) a pesquisa e os filtros
   ficam NA MESMA LINHA, junto com os outros botoes (pedido do cliente,
   04/10/2026): a pesquisa encurta e a linha dos filtros segue ao lado dela,
   ate os botoes da direita. Nas listas de venda a linha continua embaixo da
   pesquisa. A .fr-coluna vira uma fileira: so a pesquisa e a linha dos
   filtros moram nela. Faltando espaco, os filtros descem para baixo da
   pesquisa (o wrap), em vez de espremer os chips -- e por isso abas e
   botoes ficam presos no ALTO (na linha da pesquisa), e nao no meio das
   duas linhas. Numa linha so da no mesmo: as pilulas, a pesquisa e os
   botoes tem a mesma altura. */
.ent-cabecalho:has(.fr-coluna),
.ent-barra:has(> .fr-coluna) {
  align-items: flex-start;
}

/* as pilulas Entregas/Cargas (A entregar/Entregues, Em preparacao/
   Liberados) na altura da pesquisa e dos botoes: 4 + 28 + 4 = 36px. Eram
   32px por dentro, e a pilula passava 4px da linha (pedido do cliente,
   04/10/2026). So nas telas da linha de filtros (.fr-coluna). */
.ent-cabecalho:has(.fr-coluna) .ent-aba {
  height: 28px;
}

.ent-barra > .fr-coluna {
  flex: 1 1 180px;
  min-width: 180px;
  flex-direction: row;
  flex-wrap: wrap;
  align-items: center;
  gap: 6px 0.5rem;
}

.ent-barra > .fr-coluna > .ent-busca {
  flex: 0 1 280px;
  min-width: 170px;
}

/* a linha dos filtros na altura da pesquisa (os chips tem 26px) */
.ent-barra > .fr-coluna .fr-linha {
  min-height: 36px;
}

.ent-barra > .fr-coluna > div:has(> .fr-linha) {
  flex: 1 1 auto;
  min-width: 0;
}

/* Preparacao e Retirada: o Atualizar das telas de pedido
   (.botao-atualizar-grade) logo depois da pesquisa, quadrado na altura dela
   (36px) */
.ent-tela .botao-acao.ent-atualizar {
  flex: none;
  width: 36px;
  height: 36px;
  padding: 0;
  border-radius: 8px;
  justify-content: center;
}

/* Cargas: o "Nova carga" na linha da pesquisa, logo depois do Atualizar, na
   altura dela (04/10/2026, pedido do cliente) */
.ent-tela .fr-coluna > .botao-acao.ent-nova-carga {
  flex: none;
  height: 36px;
  border-radius: 8px;
}

/* as bolinhas de cada chip, nas cores que a tela ja usa: as etiquetas
   "Seguiu para" (Preparacao), as situacoes da Retirada e as colunas do
   Kanban das cargas */
.fr-ponto.envio-entrega,
.fr-ponto.doc-nfe,
.fr-ponto.ret-nfe {
  background-color: var(--up-situacao-nota);
}

.fr-ponto.envio-retirada,
.fr-ponto.doc-nfce {
  background-color: var(--up-situacao-outra);
}

.fr-ponto.ret-pdv,
.fr-ponto.doc-pedido {
  background-color: var(--up-situacao-aberta);
}

.fr-ponto.carga-aberta {
  background-color: var(--up-acao-inativar);
}

.fr-ponto.carga-fechada {
  background-color: var(--up-azul-royal);
}

.fr-ponto.carga-baixada {
  background-color: var(--up-resolvida);
}

.fr-ponto.carga-acerto {
  background-color: var(--up-acerto);
}

/* ==========================================================================
   Contas a Pagar / Receber na nova aparencia (.tit-*, 03/10/2026)
   Modelo B do canvas https://claude.ai/artifact/TCBhPgTL5NLngtPDVJAuxv: a
   roupa dos cadastros (.cad-tela) + a linha de filtros rapidos embaixo da
   pesquisa + 4 cartoes de resumo do que esta em aberto, que sao atalhos de
   filtro. As cores sao as das etiquetas de situacao da grade: vencido no
   tom de pendencia, em aberto no de intervencao, quitado no de resolvido.
   ========================================================================== */

/* os botoes ficam no alto, na linha da pesquisa, e nao no meio das duas */
.cad-cabecalho.com-filtros-rapidos {
  align-items: flex-start;
}

/* o .cad-busca estica (flex 1 1 220px) -- na coluna isso seria crescer para
   baixo */
.fr-coluna > .cad-busca {
  flex: none;
}

/* A coluna parte do zero e fica com o que sobra dos botoes. Com o `auto` do
   .fr-coluna ela media a linha de filtros esticada numa linha so e, como o
   .cad-cabecalho quebra linha, os botoes caiam para baixo da pesquisa (1366px
   ou com um chip a mais). Assim quem quebra e a linha de filtros, dentro da
   largura da pesquisa -- a regra do cliente. */
.cad-cabecalho.com-filtros-rapidos > .fr-coluna {
  flex: 1 1 0;
}

/* Filtro, Atualizar e (nas listas de venda, 04/10/2026) Duplicar so com o
   icone: quadrados de 30px. O Duplicar so quando NAO tem texto (o nome fica
   no .visually-hidden): nos cadastros (barra cadastro_barra.html) ele tem o
   texto "Duplicar", e a Conciliacao multipla usa a mesma cor -- presos em
   30px, o texto saia por cima do Excluir. */
.cad-tela .botao-filtro.cad-botao,
.cad-tela .botao-duplicar.cad-botao:has(> .visually-hidden),
.cad-tela .botao-atualizar-grade.cad-botao {
  justify-content: center;
  width: 30px;
  padding: 0;
}

/* bolinhas das situacoes dos titulos nos filtros rapidos */
.fr-ponto.tit-aberto {
  background-color: var(--up-intervencao);
}

.fr-ponto.tit-vencido {
  background-color: var(--up-pendencia);
}

.fr-ponto.tit-quitado {
  background-color: var(--up-resolvida);
}

/* --- Cartoes de resumo ---------------------------------------------------- */

.tit-resumo {
  display: grid;
  grid-template-columns: repeat(4, minmax(0, 1fr));
  gap: 0.6rem;
}

.tit-cartao {
  /* a cor de cada cartao vem da classe dele (abaixo) */
  --tit-cor: var(--up-marca-escura);
  --tit-fundo: var(--up-primaria-fundo);
  display: flex;
  align-items: center;
  gap: 12px;
  min-width: 0;
  padding: 10px 14px;
  border: 1px solid var(--up-borda);
  border-radius: 10px;
  background-color: var(--up-superficie);
  box-shadow: var(--up-sombra-cartao-leve);
  color: var(--up-texto);
  text-decoration: none;
}

.tit-cartao:hover,
.tit-cartao:focus-visible {
  border-color: var(--tit-cor);
  color: var(--up-texto);
}

.tit-cartao:focus-visible {
  outline: 2px solid var(--up-primaria);
  outline-offset: 2px;
}

/* o atalho que esta aplicado na grade */
.tit-cartao.ativo {
  border-color: var(--tit-cor);
  box-shadow: 0 0 0 2px var(--tit-fundo);
}

.tit-cartao-vencido {
  --tit-cor: var(--up-pendencia);
  --tit-fundo: var(--up-pendencia-fundo);
}

.tit-cartao-hoje {
  --tit-cor: var(--up-intervencao);
  --tit-fundo: var(--up-intervencao-fundo);
}

.tit-cartao-proximos {
  --tit-cor: var(--up-status-andamento);
  --tit-fundo: var(--up-status-andamento-fundo);
}

.tit-cartao-icone {
  display: inline-flex;
  flex: none;
  align-items: center;
  justify-content: center;
  width: 36px;
  height: 36px;
  border-radius: 10px;
  background-color: var(--tit-fundo);
  color: var(--tit-cor);
}

.tit-cartao-textos {
  display: flex;
  flex-direction: column;
  gap: 1px;
  min-width: 0;
}

.tit-cartao-rotulo {
  font-size: 10.5px;
  font-weight: 700;
  letter-spacing: 0.04em;
  text-transform: uppercase;
  color: var(--up-texto-suave);
}

.tit-cartao-valor {
  font-size: 17px;
  font-weight: 700;
  font-variant-numeric: tabular-nums;
  color: var(--tit-cor);
  white-space: nowrap;
}

.tit-cartao-qtd {
  font-size: 11.5px;
  color: var(--up-texto-suave);
}

/* janela estreita: dois por linha, em vez de espremer o valor */
@media (max-width: 1100px) {
  .tit-resumo {
    grid-template-columns: repeat(2, minmax(0, 1fr));
  }
}

/* --- Grade ---------------------------------------------------------------- */
/* 4 classes: a .ag-cell da AG Grid ja pesa 3 (ver skill nova-aparencia) */
.cad-grade.grade-ag.ag-theme-alpine .tit-numero {
  font-variant-numeric: tabular-nums;
}

.cad-grade.grade-ag.ag-theme-alpine .tit-saldo {
  font-weight: 700;
}

.cad-grade.grade-ag.ag-theme-alpine .tit-vencido {
  font-weight: 700;
  color: var(--up-pendencia);
}


/* ==========================================================================
   Conta Corrente / Caixa: extrato na nova aparencia (.ext-*, 03/10/2026)
   Modelo B do canvas https://claude.ai/artifact/7ykxUsSnNpFnBimVzEtoTj, com o
   topo enxugado no mesmo dia pelo Modelo A de
   https://claude.ai/artifact/WvStRDcGkpYp2SzVRKx5GN (a grade cabia so 5
   linhas): a faixa escura da ficha (.ent-faixa) com a conta, o "Trocar", os
   indicadores que filtram (Entradas, Saidas, A conciliar, Conciliados) e o
   caminho saldo anterior -> final; embaixo, UMA linha com a pesquisa, o
   menu Periodo e os botoes, e a grade em cartao (.cad-*). A conciliacao por
   arquivo usa a faixa e os .tit-cartao (mais abaixo, .ccl-*).
   ========================================================================== */

/* a .cad-tela ja separa os blocos com o gap: a margem da faixa sobraria */
.ext-faixa {
  flex-wrap: wrap;
  margin-bottom: 0;
}

.ext-faixa .ent-faixa-titulo {
  min-width: 0;
}

/* banco, agencia e conta na mesma linha do nome, mais apagados
   (conciliacao por arquivo) */
.ext-faixa-conta {
  margin-left: 0.5rem;
  font-size: 12.5px;
  font-weight: 400;
  opacity: 0.8;
}

/* no extrato a linha vai embaixo do nome: o lado direito e dos indicadores */
.ext-faixa .ent-faixa-titulo h1 {
  font-size: 17px;
  line-height: 1.15;
}

.ent-faixa-titulo p.ext-faixa-conta {
  margin: 0;
  overflow: hidden;
  font-size: 11.5px;
  white-space: nowrap;
  text-overflow: ellipsis;
}

/* Uma linha so ate 1280px (notebook 1366 com a barra do Windows): quem
   cede e o nome da conta, com reticencias -- o banco e a conta continuam no
   "title" do Trocar e no menu dele. Abaixo disso a faixa quebra. */
.ext-tela .ext-faixa {
  flex-wrap: nowrap;
}

.ext-tela .ext-faixa .ent-faixa-titulo {
  flex: 0 1 auto;
  overflow: hidden;
}

.ext-tela .ext-faixa .ent-faixa-titulo h1 {
  overflow: hidden;
  white-space: nowrap;
  text-overflow: ellipsis;
}

@media (max-width: 1280px) {
  .ext-tela .ext-faixa {
    flex-wrap: wrap;
  }
}

/* --- Trocar conta --------------------------------------------------------- */

.ext-trocar {
  position: relative;
}

.ext-trocar-botao {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  height: 28px;
  padding: 0 11px;
  border: 1px solid var(--up-realce-sobre-escuro);
  border-radius: 999px;
  background: none;
  font-family: var(--up-fonte);
  font-size: 12px;
  color: var(--up-superficie);
  white-space: nowrap;
  cursor: pointer;
}

.ext-trocar-botao:hover,
.ext-trocar-botao[aria-expanded="true"] {
  background-color: var(--up-realce-sobre-escuro);
}

.ext-trocar-botao:focus-visible {
  outline: 2px solid var(--up-superficie);
  outline-offset: 2px;
}

/* o mesmo cartao do menu "Periodo" (.fr-menu), em cima da grade */
.ext-trocar-menu {
  position: absolute;
  top: calc(100% + 6px);
  left: 0;
  z-index: 1050;
  width: 330px;
  max-height: 360px;
  padding: 6px;
  overflow-y: auto;
  border: 1px solid var(--up-borda);
  border-radius: 10px;
  background-color: var(--up-superficie);
  box-shadow: var(--up-sombra-menu);
}

.ext-trocar-menu[hidden] {
  display: none;
}

.ext-trocar-item {
  display: flex;
  flex-direction: column;
  gap: 1px;
  padding: 6px 10px;
  border-radius: 7px;
  font-size: 12.5px;
  color: var(--up-texto);
  text-decoration: none;
}

.ext-trocar-item:hover,
.ext-trocar-item:focus-visible {
  background-color: var(--up-primaria-fundo);
  color: var(--up-texto);
}

.ext-trocar-item.ativo {
  background-color: var(--up-primaria-fundo);
  color: var(--up-primaria);
}

.ext-trocar-nome {
  font-weight: 700;
}

.ext-trocar-detalhe {
  font-size: 11px;
  color: var(--up-texto-suave);
}

/* --- Indicadores que filtram ----------------------------------------------
   Eram os .tit-cartao embaixo da faixa (uma fileira de 62px); dentro dela
   cabem na altura do nome da conta. O aceso e o filtro aplicado. */

.ext-indicadores {
  display: flex;
  flex: none;
  flex-wrap: wrap;
  align-items: stretch;
  gap: 8px;
  margin-left: auto;
}

.ext-indicador {
  /* a cor do valor e da bolinha vem da classe de cada um (abaixo) */
  --ext-claro: var(--up-superficie);
  display: flex;
  flex-direction: column;
  gap: 1px;
  min-width: 128px;
  padding: 5px 11px;
  border: 1px solid var(--up-realce-sobre-escuro);
  border-radius: 9px;
  background-color: var(--up-indicador-sobre-escuro);
  color: var(--up-superficie);
  text-decoration: none;
}

.ext-indicador:hover,
.ext-indicador.ativo {
  border-color: var(--up-borda-ativa-sobre-escuro);
  color: var(--up-superficie);
}

.ext-indicador.ativo {
  background-color: var(--up-indicador-ativo-sobre-escuro);
}

.ext-indicador:focus-visible {
  outline: 2px solid var(--up-superficie);
  outline-offset: 2px;
}

.ext-indicador-rotulo {
  display: flex;
  align-items: center;
  gap: 6px;
  font-size: 10px;
  font-weight: 700;
  letter-spacing: 0.06em;
  text-transform: uppercase;
  opacity: 0.85;
}

.ext-indicador-ponto {
  width: 7px;
  height: 7px;
  border-radius: 999px;
  background-color: var(--ext-claro);
}

.ext-indicador-valor {
  font-size: 14.5px;
  font-weight: 700;
  font-variant-numeric: tabular-nums;
  color: var(--ext-claro);
  white-space: nowrap;
}

.ext-indicador-valor small {
  font-size: 11px;
  font-weight: 400;
  color: var(--up-superficie);
  opacity: 0.7;
}

.ext-indicador-entrada,
.ext-indicador-conciliado {
  --ext-claro: var(--up-positivo-sobre-escuro);
}

.ext-indicador-saida {
  --ext-claro: var(--up-negativo-sobre-escuro);
}

.ext-indicador-conciliar {
  --ext-claro: var(--up-atencao-sobre-escuro);
}

.ext-faixa-divisor {
  width: 1px;
  align-self: stretch;
  background-color: var(--up-realce-sobre-escuro);
}

/* --- Saldos (anterior -> final), empilhados no fim da faixa --------------- */

.ext-saldos {
  display: flex;
  flex: none;
  flex-direction: column;
  align-items: flex-end;
  gap: 1px;
}

.ext-saldos-rotulo {
  font-size: 10px;
  font-weight: 700;
  letter-spacing: 0.06em;
  text-transform: uppercase;
  white-space: nowrap;
  opacity: 0.75;
}

.ext-saldos-valores {
  font-variant-numeric: tabular-nums;
  white-space: nowrap;
}

.ext-saldo-anterior {
  font-size: 12.5px;
}

.ext-saldos-valores strong {
  font-size: 17px;
}

.ext-saldos-seta {
  opacity: 0.6;
}

.ext-saldos .negativo {
  color: var(--up-negativo-sobre-escuro);
}

/* o menu Periodo na linha da pesquisa: 30px, a altura dela e dos botoes */
.ext-tela .fr-periodo {
  height: 30px;
}

/* a pesquisa cede mais antes de a linha quebrar: com a Conciliacao sao 8
   botoes, e em 1366px eles caiam para baixo da pesquisa */
.ext-tela .cad-busca {
  flex-basis: 150px;
  /* sem isto o minimo e a largura natural do <input> (~230px) */
  min-width: 150px;
}

/* --- Cartoes da conciliacao por arquivo ------------------------------------
   Os .tit-cartao do Contas a Pagar, com as cores das situacoes, tres por
   linha. */

.tit-resumo.tit-resumo-3 {
  grid-template-columns: repeat(3, minmax(0, 1fr));
}

.tit-cartao-conciliado {
  --tit-cor: var(--up-resolvida);
  --tit-fundo: var(--up-resolvida-fundo);
}

.tit-cartao-nao-localizado {
  --tit-cor: var(--up-pendencia);
  --tit-fundo: var(--up-pendencia-fundo);
}

.tit-cartao-nao-conciliado {
  --tit-cor: var(--up-intervencao);
  --tit-fundo: var(--up-intervencao-fundo);
}

/* o cartao que filtra no navegador (conciliacao por arquivo) e um botao */
button.tit-cartao {
  width: 100%;
  font-family: var(--up-fonte);
  text-align: left;
  cursor: pointer;
}

/* --- Grade (4 classes: a .ag-cell da AG Grid ja pesa 3) -------------------- */

.cad-grade.grade-ag.ag-theme-alpine .ext-entrada {
  font-weight: 700;
  color: var(--up-dinheiro-entrada);
}

.cad-grade.grade-ag.ag-theme-alpine .ext-saida {
  font-weight: 700;
  color: var(--up-dinheiro-saida);
}

.cad-grade.grade-ag.ag-theme-alpine .ext-negativo {
  color: var(--up-dinheiro-saida);
}

.cad-pilula.ext-pix {
  background-color: var(--up-forma-pix-fundo);
  color: var(--up-forma-pix);
}

/* --- Conciliacao por arquivo: a lista lado a lado (.ccl-*) ---------------------
   Mesmo Modelo B: a faixa (.ext-faixa) com o arquivo aberto e o progresso,
   3 cartoes por situacao (.tit-cartao, aqui botoes que filtram no
   navegador), os botoes Creditos | Debitos e a lista em cartao: o registro
   do banco | o sinal da situacao | o lancamento da conta | a acao da linha.
   Antes era uma tabela .grade-planilha com a situacao em etiqueta. */

/* o "Abrir arquivo" e um label (abre o seletor do input escondido) com o
   desenho do "Trocar conta" */
label.ext-trocar-botao {
  margin: 0;
}

label.ext-trocar-botao.processando {
  opacity: 0.6;
  pointer-events: none;
}

.ccl-progresso {
  display: flex;
  flex-direction: column;
  align-items: flex-end;
  gap: 5px;
  min-width: 220px;
  margin-left: auto;
  font-size: 12.5px;
}

.ccl-progresso[hidden] {
  display: none;
}

.ccl-progresso strong {
  font-size: 16px;
  font-variant-numeric: tabular-nums;
}

.ccl-barra {
  display: block;
  width: 220px;
  height: 6px;
  overflow: hidden;
  border-radius: 999px;
  background-color: var(--up-realce-sobre-escuro);
}

.ccl-barra > span {
  display: block;
  width: 0;
  height: 100%;
  border-radius: 999px;
  background-color: var(--up-progresso-sobre-escuro);
  transition: width 0.3s ease;
}

@media (prefers-reduced-motion: reduce) {
  .ccl-barra > span {
    transition: none;
  }
}

/* a soma ao lado da quantidade no cartao */
.ccl-cartao-soma {
  margin-left: 6px;
  font-size: 12.5px;
  color: var(--up-texto);
}

/* filtros que rodam no navegador: os mesmos chips, so que botoes */
button.fr-chip,
button.fr-limpar {
  font-family: var(--up-fonte);
  cursor: pointer;
}

button.fr-limpar {
  border: 0;
  background: none;
}

button.fr-limpar[hidden] {
  display: none;
}

/* --- A lista --------------------------------------------------------------- */

.ccl-cartao {
  min-height: 220px;
}

.ccl-cab,
.ccl-linha {
  display: grid;
  grid-template-columns: 40px minmax(0, 1fr) 52px minmax(0, 1.15fr) 112px;
  align-items: center;
}

.ccl-cab {
  flex: none;
  height: 30px;
  border-bottom: 1px solid var(--up-borda);
  background-color: var(--up-cinza-frio);
  font-size: 10.5px;
  font-weight: 700;
  letter-spacing: 0.04em;
  text-transform: uppercase;
  color: var(--up-texto-suave);
}

.ccl-cab > span {
  padding: 0 10px;
}

.ccl-cab > .ccl-escolha {
  padding: 0;
}

.ccl-rolagem {
  flex: 1 1 auto;
  min-height: 0;
  overflow-y: auto;
}

.ccl-lista {
  margin: 0;
  padding: 0;
  list-style: none;
}

.ccl-linha {
  min-height: 44px;
  border-bottom: 1px solid var(--up-borda-suave);
  font-size: 12.5px;
}

.ccl-linha:hover {
  background-color: var(--up-papel-parede);
}

/* marcada: o fundo e o filete da marca, como a linha marcada da grade */
.ccl-linha.marcada {
  background-color: var(--up-primaria-fundo);
  box-shadow: inset 3px 0 0 var(--up-primaria);
}

.ccl-escolha {
  display: flex;
  justify-content: center;
}

.ccl-lado {
  display: flex;
  align-items: center;
  gap: 10px;
  min-width: 0;
  padding: 4px 10px;
}

.ccl-textos {
  display: flex;
  flex: 1 1 auto;
  flex-direction: column;
  min-width: 0;
}

.ccl-textos strong,
.ccl-textos small {
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.ccl-textos strong {
  color: var(--up-marca-escura);
}

.ccl-textos small {
  font-size: 11.5px;
  color: var(--up-texto-suave);
}

.ccl-valor {
  flex: none;
  font-weight: 700;
  font-variant-numeric: tabular-nums;
  white-space: nowrap;
}

.ccl-valor.credito {
  color: var(--up-dinheiro-entrada);
}

.ccl-valor.debito {
  color: var(--up-dinheiro-saida);
}

.ccl-valor.ccl-valor-conta {
  font-weight: 400;
  color: var(--up-texto-suave);
}

.ccl-sem {
  font-size: 12px;
  color: var(--up-pendencia);
}

/* o sinal da situacao entre o banco e a conta */
.ccl-sinal {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  justify-self: center;
  width: 28px;
  height: 28px;
  border-radius: 50%;
}

.ccl-sinal.situacao-0 {
  background-color: var(--up-pendencia-fundo);
  color: var(--up-pendencia);
}

.ccl-sinal.situacao-1 {
  background-color: var(--up-intervencao-fundo);
  color: var(--up-intervencao);
}

.ccl-sinal.situacao-2 {
  background-color: var(--up-resolvida-fundo);
  color: var(--up-resolvida);
}

/* a acao da linha: contorno na cor do que ela faz (incluir = a marca,
   conciliar = o verde do resolvido, desfazer = cinza) */
.ccl-acao {
  padding: 0 10px;
}

.ccl-acao-botao {
  height: 26px;
  padding: 0 10px;
  border: 1px solid currentColor;
  border-radius: 7px;
  background-color: var(--up-superficie);
  font-family: var(--up-fonte);
  font-size: 11.5px;
  font-weight: 700;
  text-transform: uppercase;
  cursor: pointer;
}

.ccl-acao-botao.situacao-0 {
  color: var(--up-primaria);
}

.ccl-acao-botao.situacao-1 {
  color: var(--up-resolvida);
}

.ccl-acao-botao.situacao-2 {
  color: var(--up-texto-suave);
}

.ccl-acao-botao:hover {
  background-color: var(--up-papel-parede);
}

.ccl-acao-botao:focus-visible {
  outline: 2px solid var(--up-primaria);
  outline-offset: 2px;
}

.ccl-vazio {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 6px;
  padding: 48px 16px;
  font-size: 13px;
  color: var(--up-texto-suave);
  text-align: center;
}

.ccl-vazio strong {
  color: var(--up-texto);
}

.ccl-vazio .icone {
  color: var(--up-primaria);
}

.ccl-rodape {
  display: flex;
  flex: none;
  align-items: center;
  justify-content: space-between;
  gap: 12px;
  padding: 7px 12px;
  border-top: 1px solid var(--up-borda-suave);
  font-size: 12px;
}

.ccl-aviso {
  color: var(--up-texto-suave);
}

.ccl-contagem {
  font-weight: 700;
}

/* --- Tipo de Documento Financeiro > aba "Condicoes e quitacao" (03/10/2026)
   As listas do tipo (condicoes de pagamento e formas de quitacao). Codigo
   estreito e a esquerda; o resto como a grade de classificacoes do Produto. */
.tdf-grade .grade th.num,
.tdf-grade .grade td.num {
  width: 5rem;
  text-align: left;
}
.tdf-grade .grade td.acao {
  width: 1%;
  white-space: nowrap;
}

/* --- Condicao de pagamento por tipo de documento (03/10/2026) -----------------
   Trocar o tipo tirou a condicao que nao vale para ele: a borda ambar marca o
   campo ate o operador escolher outra (condicao_por_tipo.js). */
select.condicao-saiu {
  border-color: var(--up-acao-inativar) !important;
  box-shadow: 0 0 0 2px var(--up-intervencao-fundo);
}

/* --- Ficha de cadastro com coluna de perfil (Modelo B, 03/10/2026) ----------
   Canvas https://claude.ai/artifact/SGUbJpF14iYFtiyVjNhG1W. O cliente achou a
   ficha de faixa escura + cartoes empilhados (o "Modelo A" de 01/10/2026) com
   cara de "HTML antigo" e escolheu o B:
   - a faixa virou uma COLUNA escura a esquerda (`.cad-perfil`) com o resumo
     do que esta GRAVADO: iniciais, numero, situacao, documento, endereco,
     contato, papeis e a data do cadastro;
   - a direita (`.cad-ficha-corpo`), as abas em pilula (`.cad-abas`, com o
     contador `.cad-aba-conta`) sobre UM cartao branco (`.cad-ficha-cartao`),
     com os campos maiores (34px, 13.5px) e subtitulos (`.cad-ficha-sub`) no
     lugar dos cartoes separados;
   - o rodape (Gravar/Cancelar) embaixo do cartao, sempre a vista.
   Por enquanto so em Clientes, Produtos, Vendedores e Motoristas (decisao do
   cliente: os cadastros do Financeiro e da Expedicao ficam como estao ate ele
   ver com calma). Pecas do template em partials/cadastro_ficha.html; contador
   e segmento em js/cadastro_ficha.js.

   Tela fixa: a coluna e as abas ficam paradas, so o cartao rola -- a regra
   da `.ent-faixa` (o cabecalho da ficha nunca rola) levada para a coluna. O
   form deixa de crescer com o conteudo e fica do tamanho do painel.

   Os seletores com campo levam `:is(#formCliente, ...).cad-ficha`: pesam um id
   + uma classe e vencem as listas de campo compacto (`#formCliente .campo
   input...`, rotulo de 10.5px), onde estas fichas continuam para o resto da
   casa (busca com sugestoes, rodape). Ficha nova neste visual: somar o id
   dela nos `:is()` deste bloco. */
:is(#formCliente, #formProduto, #formVendedor, #formMotorista).cad-ficha {
  display: flex;
  flex-direction: row;
  flex: 1 1 auto;
  gap: 0.9rem;
  min-height: 0;
  padding-bottom: 0.9rem;
}

/* --- Coluna de perfil --- */
/* Em 1366x768 o resumo do cliente passa um pouco da altura: a coluna rola
   por dentro, com a barra fina e escura (a do sistema, branca e larga,
   cortava a coluna ao meio). */
.cad-perfil {
  display: flex;
  flex: 0 0 300px;
  flex-direction: column;
  gap: 0.85rem;
  min-height: 0;
  overflow-y: auto;
  padding: 1.15rem 1.15rem 1rem;
  border-radius: 12px;
  background-color: var(--up-marca-escura);
  color: var(--up-superficie);
  scrollbar-width: thin;
  scrollbar-color: var(--up-indicador-ativo-sobre-escuro) transparent;
}

.cad-perfil-topo {
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  gap: 0.55rem;
}

/* o circulo grande das iniciais: as mesmas cores do circulo da grade
   (`.cad-avatar.pj/.pf/.marca`); sem classe e o registro novo, com o icone
   sobre o realce translucido */
.cad-perfil-avatar {
  display: flex;
  flex: none;
  align-items: center;
  justify-content: center;
  width: 52px;
  height: 52px;
  border-radius: 50%;
  background-color: var(--up-realce-sobre-escuro);
  color: var(--up-superficie);
  font-size: 19px;
  font-weight: 700;
  letter-spacing: 0.02em;
}

.cad-perfil-avatar.pj {
  background-color: var(--up-pessoa-juridica-fundo);
  color: var(--up-pessoa-juridica);
}

.cad-perfil-avatar.pf {
  background-color: var(--up-pessoa-fisica-fundo);
  color: var(--up-pessoa-fisica);
}

.cad-perfil-avatar.marca {
  background-color: var(--up-primaria-fundo);
  color: var(--up-primaria);
}

.cad-perfil-sobre {
  font-size: 10.5px;
  font-weight: 700;
  letter-spacing: 0.06em;
  text-transform: uppercase;
  color: var(--up-texto-sobre-escuro-suave);
}

.cad-perfil h1 {
  margin: 0;
  font-size: 19px;
  font-weight: 700;
  line-height: 1.2;
  overflow-wrap: anywhere;
}

.cad-perfil-etiquetas {
  display: flex;
  flex-wrap: wrap;
  gap: 6px;
}

.cad-perfil-etiquetas:empty {
  display: none;
}

/* etiqueta de situacao (Ativo/Inativo/Bloqueado) e chip neutro (Pessoa
   Juridica, papeis) na mesma altura, lado a lado */
.cad-perfil .etiqueta-status,
.cad-perfil-chip {
  display: inline-flex;
  align-items: center;
  height: 22px;
  padding: 0 9px;
  border-radius: 999px;
  font-size: 11.5px;
}

.cad-perfil-chip {
  background-color: var(--up-realce-sobre-escuro);
  font-weight: 600;
}

.cad-perfil-divisor {
  flex: none;
  width: 100%;
  height: 1px;
  margin: 0;
  border: 0;
  background-color: var(--up-divisor-sobre-escuro);
  opacity: 1;
}

.cad-perfil-dados {
  display: flex;
  flex-direction: column;
  gap: 0.65rem;
}

.cad-perfil-dado {
  display: flex;
  align-items: flex-start;
  gap: 0.6rem;
  font-size: 12.5px;
  line-height: 1.4;
}

.cad-perfil-dado > .icone {
  flex: none;
  margin-top: 2px;
  color: var(--up-primaria-claro);
}

.cad-perfil-dado-texto {
  display: flex;
  flex-direction: column;
  min-width: 0;
}

.cad-perfil-rotulo {
  font-size: 10px;
  font-weight: 700;
  letter-spacing: 0.05em;
  text-transform: uppercase;
  color: var(--up-texto-sobre-escuro-suave);
}

.cad-perfil-valor {
  overflow-wrap: anywhere;
}

/* o preco do produto: o numero que se procura primeiro na coluna */
.cad-perfil-destaque {
  font-size: 20px;
  font-weight: 700;
  font-variant-numeric: tabular-nums;
}

.cad-perfil-vazio,
.cad-perfil-dica {
  color: var(--up-texto-sobre-escuro-suave);
}

.cad-perfil-dica {
  margin: 0;
  font-size: 12.5px;
  line-height: 1.5;
}

.cad-perfil-dica strong {
  color: var(--up-superficie);
}

.cad-perfil-bloco {
  display: flex;
  flex-direction: column;
  gap: 0.5rem;
}

/* "Cadastrado em": encostado no pe da coluna */
.cad-perfil-rodape {
  margin: auto 0 0;
  font-size: 11.5px;
  color: var(--up-texto-sobre-escuro-suave);
}

/* --- Abas + cartao + rodape --- */
.cad-ficha-corpo {
  display: flex;
  flex: 1 1 auto;
  flex-direction: column;
  gap: 0.75rem;
  min-width: 0;
  min-height: 0;
}

.cad-ficha-corpo > :not(.cad-ficha-cartao) {
  flex-shrink: 0;
}

/* a `.cad-abas` da ficha do Produto (02/10/2026) tinha margem embaixo; aqui
   quem separa e o gap do corpo */
.cad-ficha-corpo > .cad-abas.abas-internas {
  margin-bottom: 0;
}

.cad-ficha-corpo .alert {
  margin: 0;
}

/* O cartao e o painel da aba (ou o cartao unico, nas fichas sem abas): so
   ele rola. Sem `display` aqui: quem mostra/esconde e o `.painel-aba(.ativa)`. */
.cad-ficha-cartao {
  flex: 1 1 auto;
  min-height: 0;
  overflow-y: auto;
  padding: 1.35rem 1.6rem 1.5rem;
  border: 1px solid var(--up-borda-suave);
  border-radius: 12px;
  background-color: var(--up-superficie);
  box-shadow: var(--up-sombra-cartao-leve);
}

/* contador de campos preenchidos da aba ("3/5"); verde com tudo preenchido */
.cad-aba-conta {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  min-width: 18px;
  height: 18px;
  padding: 0 5px;
  border-radius: 999px;
  background-color: var(--up-borda);
  color: var(--up-cinza-chumbo);
  font-size: 10.5px;
  font-weight: 700;
  font-variant-numeric: tabular-nums;
}

.cad-aba-conta:empty {
  display: none;
}

.cad-abas .aba-interna.ativa .cad-aba-conta {
  background-color: var(--up-primaria-fundo);
  color: var(--up-primaria);
}

.cad-abas .aba-interna .cad-aba-conta.completa {
  background-color: var(--up-resolvida-fundo);
  color: var(--up-resolvida);
}

/* subtitulo dentro do cartao ("Tambem e", "Empresa", "Pessoa de contato"):
   caixa alta pequena com o filete ate a borda, no lugar de um cartao a mais */
.cad-ficha-sub {
  display: flex;
  grid-column: 1 / -1;
  align-items: center;
  gap: 0.6rem;
  margin-top: 0.35rem;
  font-size: 10.5px;
  font-weight: 700;
  letter-spacing: 0.06em;
  text-transform: uppercase;
  color: var(--up-texto-suave);
}

.cad-ficha-sub:first-child {
  margin-top: 0;
}

.cad-ficha-sub::after {
  content: "";
  flex: 1;
  height: 1px;
  background-color: var(--up-borda-suave);
}

/* blocos lado a lado dentro de uma aba (Contato: Telefones | E-mails) */
.cad-ficha-blocos {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  align-items: start;
  gap: 1rem;
}

.cad-ficha-bloco {
  display: flex;
  flex-direction: column;
  gap: 0.9rem;
  padding: 1rem;
  border: 1px solid var(--up-borda-suave);
  border-radius: 10px;
}

.cad-ficha-bloco h3 {
  display: flex;
  align-items: center;
  gap: 0.5rem;
  margin: 0;
  font-size: 13.5px;
  font-weight: 700;
  color: var(--up-marca-escura);
}

.cad-ficha-bloco-icone {
  display: flex;
  align-items: center;
  justify-content: center;
  width: 26px;
  height: 26px;
  border-radius: 7px;
  background-color: var(--up-primaria-fundo);
  color: var(--up-primaria);
}

/* rodape embaixo do cartao, fora da rolagem: sem o sticky, as margens
   negativas e a sombra do rodape de documento (que encostava nas bordas do
   painel). O Gravar/Cancelar fica a direita mesmo sem o `.footer-start`. */
:is(#formCliente, #formProduto, #formVendedor, #formMotorista).cad-ficha .rodape-formulario {
  position: static;
  margin: 0;
  padding: 0;
  border-top: 0;
  background-color: transparent;
  box-shadow: none;
}

.cad-ficha .rodape-formulario .acoes-formulario {
  margin-left: auto;
}

/* --- Campos (maiores que a medida compacta das listas) --- */
:is(#formCliente, #formProduto, #formVendedor, #formMotorista).cad-ficha .bloco-campos {
  gap: 1rem;
  padding: 0;
  border: 0;
  border-radius: 0;
}

:is(#formCliente, #formProduto, #formVendedor, #formMotorista).cad-ficha .campo {
  gap: 0.3rem;
}

:is(#formCliente, #formProduto, #formVendedor, #formMotorista).cad-ficha .campo label,
.cad-ficha .cad-rotulo {
  font-size: 11.5px;
  font-weight: 600;
  line-height: 1.25;
  color: var(--up-cinza-chumbo);
}

/* o input fica numa regra so dele: dentro de um `:is()` com o input:not()
   o textarea herdaria o peso do input e a regra "height: auto" de baixo
   perderia (a caixa de Observacoes ficava com a altura de um campo) */
:is(#formCliente, #formProduto, #formVendedor, #formMotorista).cad-ficha .campo input:not([type="checkbox"]):not([type="radio"]),
:is(#formCliente, #formProduto, #formVendedor, #formMotorista).cad-ficha .campo select,
:is(#formCliente, #formProduto, #formVendedor, #formMotorista).cad-ficha .campo textarea {
  height: 34px;
  padding: 0 0.7rem;
  border: 1px solid var(--up-borda);
  border-radius: 8px;
  font-size: 13.5px;
  line-height: 1.35;
  color: var(--up-texto);
  background-color: var(--up-superficie);
}

:is(#formCliente, #formProduto, #formVendedor, #formMotorista).cad-ficha .campo textarea {
  height: auto;
  padding: 0.5rem 0.7rem;
}

:is(#formCliente, #formProduto, #formVendedor, #formMotorista).cad-ficha .campo :is(input:not([type="checkbox"]):not([type="radio"]), select, textarea):focus {
  outline: 0;
  border-color: var(--up-primaria);
  box-shadow: 0 0 0 3px var(--up-primaria-fundo);
}

:is(#formCliente, #formProduto, #formVendedor, #formMotorista).cad-ficha .campo :is(input, select, textarea):disabled {
  border-color: var(--up-borda-suave);
  background-color: var(--up-cinza-frio);
  color: var(--up-cinza-chumbo);
}

/* o codigo travado em negrito: e o numero do cadastro, nao um campo apagado */
:is(#formCliente, #formProduto, #formVendedor, #formMotorista).cad-ficha #codigo:disabled {
  font-weight: 700;
}

:is(#formCliente, #formProduto, #formVendedor, #formMotorista).cad-ficha .campo input.campo-invalido {
  border-color: var(--up-primaria);
  box-shadow: 0 0 0 2px var(--up-primaria-fundo);
}

/* lupa do CNPJ e engrenagem do codigo na altura do campo de 34px */
.cad-ficha .cli-consultar {
  flex-basis: 34px;
  border-radius: 8px;
}

:is(#formCliente, #formProduto, #formVendedor, #formMotorista).cad-ficha .campo-com-lupa input {
  border-radius: 8px 0 0 8px;
}

.cad-ficha .botao-lupa {
  width: 34px;
  border-radius: 0 8px 8px 0;
}

/* larguras que o `.bloco-campos` global nao tem (so 1-4, 6 e 12), so aqui:
   o cartao unico e largo e o Nome ao lado do Codigo pede 10 colunas */
@media (min-width: 768px) {
  .cad-ficha .campo-5 { grid-column: span 5; }
  .cad-ficha .campo-6 { grid-column: span 6; }
  .cad-ficha .campo-7 { grid-column: span 7; }
  .cad-ficha .campo-8 { grid-column: span 8; }
  .cad-ficha .campo-9 { grid-column: span 9; }
  .cad-ficha .campo-10 { grid-column: span 10; }
}

/* --- Segmento (Pessoa: Juridica | Fisica) --- */
.cad-seg {
  display: inline-flex;
  align-self: flex-start;
  gap: 2px;
  height: 34px;
  padding: 3px;
  border-radius: 9px;
  background-color: var(--up-pilulas-fundo);
}

.cad-seg button {
  padding: 0 1.1rem;
  border: 0;
  border-radius: 7px;
  background-color: transparent;
  font-family: inherit;
  font-size: 13px;
  font-weight: 600;
  color: var(--up-texto-suave);
  cursor: pointer;
}

.cad-seg button:hover:enabled {
  color: var(--up-texto);
}

.cad-seg button[aria-pressed="true"] {
  background-color: var(--up-superficie);
  box-shadow: var(--up-sombra-cartao-leve);
  color: var(--up-marca-escura);
}

.cad-seg button:focus-visible {
  outline: 3px solid var(--up-primaria-claro);
  outline-offset: 0;
}

.cad-seg button:disabled {
  cursor: not-allowed;
  opacity: 0.55;
}

/* --- Situacao: interruptores dentro de uma moldura da altura dos campos ---
   O texto ao lado do trilho, e nao em cima (era assim no Modelo A). O
   `row-reverse` poe o trilho primeiro sem mudar a ordem do HTML (rotulo e
   depois o interruptor), que e a que o leitor de tela le. */
:is(#formCliente, #formProduto, #formVendedor, #formMotorista).cad-ficha .campo.cad-situacao {
  flex-direction: column;
  gap: 0.3rem;
}

.cad-situacao-linha {
  display: flex;
  flex-wrap: wrap;
  gap: 0.5rem;
}

.cad-ficha .cad-interruptor {
  flex-direction: row-reverse;
  justify-content: flex-end;
  align-items: center;
  gap: 0.6rem;
  height: 34px;
  padding: 0 0.85rem 0 0.5rem;
  border: 1px solid var(--up-borda);
  border-radius: 8px;
  background-color: var(--up-superficie);
}

:is(#formCliente, #formProduto, #formVendedor, #formMotorista).cad-ficha .cad-interruptor > label:not(.interruptor) {
  font-size: 13px;
  font-weight: 600;
  color: var(--up-texto);
  white-space: nowrap;
  cursor: pointer;
}

.cad-ficha .interruptor input:checked + .trilho {
  background-color: var(--up-primaria);
}

/* Bloquear ligado e vermelho: e um aviso, nao uma escolha qualquer */
.cad-ficha .cad-interruptor.perigo .interruptor input:checked + .trilho {
  background-color: var(--up-acao-excluir);
}

/* papeis (Fornecedor, Vendedor...) na altura dos botoes da ficha */
.cad-ficha .cad-papeis {
  gap: 0.5rem;
  margin-top: 0;
}

:is(#formCliente, #formProduto, #formVendedor, #formMotorista).cad-ficha .cad-papeis .campo-marcavel {
  height: 32px;
  padding: 0 0.9rem;
  font-size: 13px;
  font-weight: 600;
}

/* --- Janelas menores --- */
@media (max-width: 1180px) {
  .cad-perfil {
    flex-basis: 250px;
  }

  .cad-ficha-blocos {
    grid-template-columns: minmax(0, 1fr);
  }
}

/* celular: a coluna sobe para o topo e a pagina volta a rolar inteira */
@media (max-width: 767.98px) {
  :is(#formCliente, #formProduto, #formVendedor, #formMotorista).cad-ficha {
    flex-direction: column;
    flex: 1 0 auto;
  }

  .cad-perfil,
  .cad-ficha-cartao {
    flex: none;
    overflow: visible;
  }
}

/* =========================================================================
   Ficha do Tipo de Documento Financeiro em abas (.tdf-*), 04/10/2026
   -------------------------------------------------------------------------
   Modelo A do canvas https://claude.ai/artifact/JSq8aCaxWkxntePec59CVr: as
   abas em pilula (.cad-abas), a explicacao embaixo de cada campo, o motivo
   de cada campo travado, a coluna "Onde este tipo aparece" ao lado e a aba de
   condicoes com Incluir, Tirar todas e a previa da tela de venda. A logica
   esta em tipo_documento_form.js. As regras com #formTipoDocumento precisam
   vencer as medidas compactas do formulario (bloco das listas de #form*).
   ========================================================================= */

.tdf-indicadores .ext-indicador {
  min-width: 108px;
}

.tdf-sistema {
  background-color: var(--up-realce-sobre-escuro);
  color: var(--up-superficie);
}

.tdf-corpo {
  display: flex;
  flex-wrap: wrap;
  align-items: flex-start;
  gap: 14px;
}

.tdf-principal {
  flex: 999 1 560px;
  min-width: 0;
}

.tdf-principal > .cad-abas {
  margin-bottom: 10px;
}

.tdf-lado {
  flex: 1 1 280px;
  max-width: 360px;
  margin-top: 44px; /* alinha com o primeiro cartao, abaixo das abas */
}

/* --- Textos de apoio ------------------------------------------------------ */

.tdf-sub {
  margin: -0.25rem 0 0.75rem;
  font-size: 12.5px;
  color: var(--up-texto-suave);
}

.tdf-leg {
  margin: 6px 0 0;
  padding: 6px 9px;
  border-radius: 7px;
  background-color: var(--up-primaria-fundo);
  font-size: 12px;
  line-height: 1.35;
  color: var(--up-texto);
}

.tdf-leg b {
  color: var(--up-marca-escura);
}

.tdf-leg[hidden] {
  display: none;
}

.tdf-rotulo {
  display: block;
  margin-bottom: 3px;
  font-size: 10.5px;
  font-weight: 700;
  color: var(--up-texto);
}

.tdf-dica {
  display: block;
  margin-top: 4px;
  font-size: 11.5px;
  color: var(--up-texto-suave);
}

.tdf-trava {
  display: block;
  margin-top: 6px;
  padding: 5px 9px;
  border-radius: 7px;
  background-color: var(--up-intervencao-fundo);
  font-size: 12px;
  color: var(--up-texto);
}

.tdf-trava[hidden] {
  display: none;
}

.tdf-aviso {
  margin: 0.6rem 0 0;
  padding: 6px 9px;
  border-radius: 7px;
  background-color: var(--up-intervencao-fundo);
  color: var(--up-texto);
}

.tdf-aviso[hidden] {
  display: none;
}

/* --- Botoes proprios ------------------------------------------------------ */

.tdf-linha-botao {
  margin-top: 0.75rem;
}

.cad-form .botao-acao.cad-botao.tdf-botao-sec {
  border: 1px solid var(--up-primaria);
  background-color: var(--up-superficie);
  color: var(--up-primaria);
}

.cad-form .botao-acao.cad-botao.tdf-botao-sec:hover {
  background-color: var(--up-primaria-fundo);
}

.cad-form .botao-acao.cad-botao.tdf-botao-perigo {
  border: 1px solid var(--up-acao-excluir);
  background-color: var(--up-superficie);
  color: var(--up-acao-excluir);
}

.cad-form .botao-acao.cad-botao.tdf-botao-perigo:hover {
  background-color: var(--up-pendencia-fundo);
}

.cad-form .botao-acao.cad-botao.tdf-botao-perigo-cheio {
  border: 0;
  background-color: var(--up-acao-excluir);
  color: var(--up-superficie);
}

.cad-form .botao-acao.cad-botao.tdf-botao-perigo-cheio:hover {
  background-color: var(--up-acao-excluir-escuro);
}

.tdf-botao-perigo[hidden],
.tdf-confirma[hidden],
.tdf-grade[hidden],
.tdf-incluida[hidden] {
  display: none;
}

/* --- Legenda completa (Local e Tipo de uso) --------------------------------- */

.tdf-legenda {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(260px, 1fr));
  gap: 12px;
  margin-top: 0.75rem;
}

.tdf-legenda[hidden] {
  display: none;
}

.tdf-tabela {
  width: 100%;
  border-collapse: collapse;
  font-size: 12px;
}

.tdf-tabela th {
  padding: 5px 8px;
  background-color: var(--up-cinza-frio);
  font-size: 10.5px;
  text-align: left;
  text-transform: uppercase;
  letter-spacing: 0.04em;
  color: var(--up-texto-suave);
}

.tdf-tabela td {
  padding: 5px 8px;
  border-top: 1px solid var(--up-borda-suave);
  vertical-align: top;
}

.tdf-tabela td:first-child {
  font-weight: 700;
  white-space: nowrap;
}

.tdf-tabela tr.atual td {
  background-color: var(--up-primaria-fundo);
}

.tdf-tabela tr.atual td:first-child {
  box-shadow: inset 3px 0 0 var(--up-primaria);
  color: var(--up-marca-escura);
}

/* --- Opcoes (caixa + nome + o que faz) -------------------------------------- */

.tdf-opcoes {
  display: flex;
  flex-direction: column;
}

.tdf-opcoes-linha {
  flex-direction: row;
  flex-wrap: wrap;
  gap: 0 24px;
}

.tdf-opcao {
  display: flex;
  align-items: flex-start;
  gap: 10px;
  padding: 9px 0;
  border-top: 1px solid var(--up-borda-suave);
  cursor: pointer;
}

.tdf-opcao:first-child {
  border-top: 0;
}

.tdf-opcoes-linha .tdf-opcao {
  border-top: 0;
}

#formTipoDocumento .tdf-opcao input {
  flex: none;
  width: 16px;
  height: 16px;
  margin: 1px 0 0;
}

.tdf-opcao:has(input:disabled) {
  cursor: default;
}

.tdf-opcao-texto {
  display: flex;
  flex-direction: column;
  gap: 1px;
  min-width: 0;
}

.tdf-opcao-texto strong {
  font-size: 13px;
  color: var(--up-texto);
}

.tdf-opcao:has(input:checked:not(:disabled)) .tdf-opcao-texto strong {
  color: var(--up-marca-escura);
}

.tdf-opcao-texto > span {
  font-size: 12px;
  color: var(--up-texto-suave);
}

#formTipoDocumento .tdf-opcao .tdf-trava {
  color: var(--up-texto);
}

/* --- Condicoes de pagamento -------------------------------------------------- */

.tdf-incluir {
  display: flex;
  flex-wrap: wrap;
  align-items: flex-end;
  gap: 10px;
  margin-top: 0.75rem;
  padding: 10px 12px;
  border: 1px solid var(--up-resolvida);
  border-radius: 10px;
  background-color: var(--up-resolvida-fundo);
}

#formTipoDocumento .tdf-incluir-campo {
  flex: 1 1 320px;
  min-width: 0;
}

.tdf-incluida {
  margin: 6px 0 0;
  font-size: 12px;
  font-weight: 700;
  color: var(--up-resolvida);
}

.tdf-lista-cab {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  justify-content: space-between;
  gap: 8px;
  min-height: 30px;
  margin: 0.9rem 0 6px;
  font-size: 13px;
  color: var(--up-marca-escura);
}

.tdf-confirma {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 8px;
  padding: 4px 6px 4px 10px;
  border-radius: 8px;
  background-color: var(--up-pendencia-fundo);
  font-size: 12.5px;
  color: var(--up-texto);
}

.tdf-grade .grade td.tdf-suave {
  color: var(--up-texto-suave);
}

.tdf-tirar {
  height: 24px;
  padding: 0 10px;
  border: 1px solid var(--up-acao-excluir);
  border-radius: 6px;
  background-color: var(--up-superficie);
  font-family: var(--up-fonte);
  font-size: 12px;
  font-weight: 700;
  color: var(--up-acao-excluir);
  cursor: pointer;
}

.tdf-tirar:hover:not(:disabled) {
  background-color: var(--up-pendencia-fundo);
}

.tdf-tirar:disabled {
  opacity: 0.45;
  cursor: not-allowed;
}

/* --- Previa da tela de venda ------------------------------------------------- */

.tdf-previa {
  margin-top: 1rem;
  padding: 10px 12px 12px;
  border: 1px dashed var(--up-borda);
  border-radius: 10px;
  background-color: var(--up-cinza-frio);
}

.tdf-previa-cab {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  justify-content: space-between;
  gap: 8px;
  margin-bottom: 10px;
}

/* mesma fonte das abas ao lado (PF/PV/Orcamento/NF), em negrito e na cor
   escura -- o cinza claro em 10.5px nao parecia negrito (cliente, 04/10/2026) */
.tdf-previa-tit {
  font-size: 12.5px;
  font-weight: 700;
  letter-spacing: 0.04em;
  text-transform: uppercase;
  color: var(--up-marca-escura);
}

.tdf-seg.ent-seg {
  height: 30px;
}

.tdf-seg.ent-seg button {
  font-size: 12.5px;
}

.tdf-janela {
  overflow: hidden;
  border: 1px solid var(--up-borda);
  border-radius: 10px;
  background-color: var(--up-superficie);
  box-shadow: var(--up-sombra-cartao-leve);
}

.tdf-janela-topo {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 14px;
  padding: 7px 12px;
  background-color: var(--up-marca-escura);
  color: var(--up-superficie);
}

.tdf-janela-tit {
  font-size: 13px;
  font-weight: 700;
}

.tdf-janela-abas {
  display: flex;
  flex-wrap: wrap;
  gap: 2px;
}

.tdf-janela-abas span {
  padding: 2px 9px;
  border-radius: 6px;
  font-size: 12px;
  color: var(--up-texto-sobre-escuro-suave);
}

.tdf-janela-abas span.ativa {
  background-color: var(--up-realce-sobre-escuro);
  font-weight: 700;
  color: var(--up-superficie);
}

.tdf-janela-corpo {
  display: flex;
  flex-wrap: wrap;
  align-items: flex-start;
  gap: 12px;
  padding: 12px 12px 4px;
}

.tdf-previa-campo {
  display: flex;
  flex: 1 1 200px;
  flex-direction: column;
  gap: 3px;
  min-width: 0;
}

.tdf-previa-larga {
  flex: 1.4 1 250px;
}

.tdf-previa-campo[hidden] {
  display: none;
}

.tdf-apagado {
  opacity: 0.45;
}

.tdf-previa-rotulo {
  display: flex;
  align-items: center;
  gap: 4px;
  font-size: 11px;
  font-weight: 700;
  color: var(--up-texto);
}

.tdf-pino {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 16px;
  height: 16px;
  border-radius: 50%;
  background-color: var(--up-primaria);
  font-size: 10px;
  color: var(--up-superficie);
}

.tdf-caixa {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 6px;
  height: 28px;
  padding: 0 8px;
  border: 1px solid var(--up-borda);
  border-radius: 6px;
  background-color: var(--up-superficie);
  font-size: 12.5px;
  white-space: nowrap;
  overflow: hidden;
}

.tdf-caixa-aberta {
  border-color: var(--up-primaria);
  box-shadow: 0 0 0 2px var(--up-primaria-fundo);
}

.tdf-caixa-seta {
  display: flex;
  flex: none;
  color: var(--up-texto);
}

.tdf-ph {
  color: var(--up-texto-suave);
}

.tdf-menu {
  display: flex;
  flex-direction: column;
  padding: 3px 0;
  border: 1px solid var(--up-borda);
  border-radius: 6px;
  background-color: var(--up-superficie);
  box-shadow: var(--up-sombra-cartao-leve);
  font-size: 12.5px;
}

.tdf-menu > span:first-child {
  display: flex;
  flex-direction: column;
}

.tdf-menu-op {
  padding: 3px 9px;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}

.tdf-menu-escolhida {
  background-color: var(--up-primaria);
  font-weight: 700;
  color: var(--up-superficie);
}

.tdf-menu-rodape {
  margin-top: 3px;
  padding: 5px 9px 2px;
  border-top: 1px solid var(--up-borda-suave);
  font-size: 11.5px;
  color: var(--up-texto-suave);
}

.tdf-janela-nota {
  margin: 0;
  padding: 6px 12px 10px;
  font-size: 12px;
  color: var(--up-texto-suave);
}

/* --- Onde aparece (aba e coluna) --------------------------------------------- */

.tdf-frase {
  margin: 0 0 4px;
  font-size: 15px;
  font-weight: 700;
  color: var(--up-marca-escura);
}

.tdf-secao {
  margin: 12px 0 6px;
  font-size: 10.5px;
  font-weight: 700;
  letter-spacing: 0.06em;
  text-transform: uppercase;
  color: var(--up-texto-suave);
}

.tdf-cartoes {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(240px, 1fr));
  gap: 8px;
}

.tdf-efeito {
  display: flex;
  flex-direction: column;
  gap: 2px;
  padding: 8px 11px;
  border: 1px solid var(--up-resolvida);
  border-radius: 9px;
  background-color: var(--up-resolvida-fundo);
  font-size: 12px;
  color: var(--up-texto);
}

.tdf-efeito strong {
  font-size: 13px;
  color: var(--up-resolvida);
}

.tdf-efeito-nao {
  border: 1px dashed var(--up-borda);
  background-color: var(--up-cinza-frio);
  color: var(--up-texto-suave);
}

.tdf-efeito-nao strong {
  color: var(--up-texto);
  font-weight: 600;
}

.tdf-lado h3 {
  margin: 0;
  font-size: 14px;
  color: var(--up-marca-escura);
}

.tdf-placar {
  display: flex;
  align-items: baseline;
  gap: 6px;
  margin: 4px 0 6px;
  font-size: 12px;
  color: var(--up-texto-suave);
}

.tdf-placar b {
  font-size: 22px;
  color: var(--up-resolvida);
}

.tdf-itens {
  margin: 0;
  padding: 0;
  list-style: none;
}

.tdf-item {
  display: flex;
  gap: 8px;
  padding: 6px 0;
  border-top: 1px solid var(--up-borda-suave);
  font-size: 12.5px;
  line-height: 1.3;
}

.tdf-item-icone {
  display: flex;
  flex: none;
  align-items: center;
  justify-content: center;
  width: 18px;
  height: 18px;
  border-radius: 50%;
  background-color: var(--up-resolvida-fundo);
  font-size: 11px;
  font-weight: 700;
  color: var(--up-resolvida);
}

.tdf-item-texto {
  display: flex;
  flex-direction: column;
  min-width: 0;
}

.tdf-item-texto strong {
  color: var(--up-texto);
}

.tdf-item-texto small {
  font-size: 11.5px;
  color: var(--up-texto-suave);
}

.tdf-item-nao .tdf-item-icone {
  background-color: var(--up-borda-suave);
  color: var(--up-texto-suave);
}

.tdf-item-nao .tdf-item-texto strong {
  font-weight: 600;
  color: var(--up-texto-suave);
}

.tdf-lado .tdf-botao-sec {
  margin-top: 10px;
}

@media (max-width: 991.98px) {
  .tdf-lado {
    max-width: none;
    margin-top: 0;
  }
}

.tdf-lista-cab[hidden] {
  display: none;
}

/* Campos da ficha do Tipo de Documento na medida do Modelo A do canvas
   (04/10/2026, pedido do cliente: "os campos ainda parecem quadrados"). A
   ficha herdava a medida compacta das listas de #form* (rotulo de 10.5px,
   campo baixo e de canto reto); aqui vale a do modelo: campo de 30px, cantos
   de 6px, texto de 13.5px e rotulo de 12px em negrito. `.tdf-form` no
   seletor para vencer o `#formTipoDocumento .campo input:not(...)`. */
#formTipoDocumento.tdf-form .bloco-campos {
  gap: 12px 14px;
}

#formTipoDocumento.tdf-form .campo {
  gap: 4px;
}

#formTipoDocumento.tdf-form .campo label,
#formTipoDocumento.tdf-form .tdf-rotulo {
  font-size: 12px;
  font-weight: 700;
  line-height: 1.25;
  color: var(--up-texto);
}

#formTipoDocumento.tdf-form .campo input:not([type="checkbox"]):not([type="radio"]),
#formTipoDocumento.tdf-form .campo select {
  height: 30px;
  padding: 0 0.6rem;
  border: 1px solid var(--up-borda);
  border-radius: 6px;
  background-color: var(--up-superficie);
  font-size: 13.5px;
  line-height: 1.3;
  color: var(--up-texto);
}

#formTipoDocumento.tdf-form .campo :is(input:not([type="checkbox"]):not([type="radio"]), select):focus {
  outline: 0;
  border-color: var(--up-primaria);
  box-shadow: 0 0 0 3px var(--up-primaria-fundo);
}

#formTipoDocumento.tdf-form .campo :is(input:not([type="checkbox"]):not([type="radio"]), select):disabled {
  border-color: var(--up-borda-suave);
  background-color: var(--up-cinza-frio);
  color: var(--up-cinza-chumbo);
}

/* o aviso do tipo do sistema, no topo da Identificacao: faixa ambar como os
   campos travados (no cinza miudo do .aviso-pauta ele passava batido) */
.tdf-aviso.tdf-aviso-topo {
  margin: 0 0 0.75rem;
  font-size: 12.5px;
}

/* a Descricao com 10 colunas e o Ativo com 2 (o .bloco-campos global so tem
   1-4, 6 e 12): Opcao 1 do canvas, 04/10/2026 */
@media (min-width: 768px) {
  #formTipoDocumento.tdf-form .campo-10 {
    grid-column: span 10;
  }
}

/* --- Orcamento, Pedido de Venda e Pedido de Faturamento: facelift (04/10/2026)
   Canvas https://claude.ai/artifact/H6AYkiMJDxR2AoUkuoCszW, prancheta
   "Facelift", aprovada pelo cliente. Regra dele: o LAYOUT NAO MUDA (o
   operador ja esta adaptado) -- mesmos campos nos mesmos lugares, mesmas
   abas, botoes, cores de botao e teclas. So a aparencia:
   - campos de 30px, cantos de 8px, fonte 13px e o anel de foco da marca;
     travado em cinza; rotulo 11.5px. 30 e nao os 34px da ficha de cadastro:
     a 1366x768 a grade de itens caia de 6 para 3 linhas; com 30 fica em 5;
   - cartoes brancos de 12px sobre o fundo claro (`painel-fin` no template),
     titulo com icone (`.doc-tit-ico`) e contador de itens (`.doc-conta`, o JS
     preenche os `[data-conta-itens]`);
   - grade no desenho das listagens novas: cabecalho em caixa alta, linhas de
     26px, sem separador vertical, descricao em negrito, linha marcada com o
     filete da marca;
   - botoes com cantos de 8px; Anterior/Proximo na cor da marca.
   A classe `doc-nova` vai no <form id="formDocumento"> das tres telas (o
   Pedido de Faturamento soma a `form-faturamento`). Os campos usam
   `#formDocumento#formDocumento.doc-nova` (dois ids) de proposito: as regras
   antigas da tela chegam a um id + quatro classes (a borda azul dos editaveis
   do faturamento) e qualquer coisa abaixo disso perderia em algum campo. */

/* --- Abas em pilula (04/10/2026) ---
   As mesmas pilulas da Expedicao (.ent-abas) e da ficha do Produto
   (.cad-abas, que o <nav> tambem leva): fundo cinza arredondado, aba ativa
   branca com sombra, 30px. Pedido do cliente para fechar o facelift. As
   regras sao repetidas aqui com o id porque as antigas da tela
   (`#formDocumento .aba-interna`, as sete abas esticadas do faturamento)
   venceriam a `.cad-abas`. No faturamento as abas deixam de esticar e ficam
   na largura do nome, como em toda pilula do sistema. */
#formDocumento#formDocumento.doc-nova > .abas-internas {
  align-self: flex-start;
  flex-shrink: 0;
  gap: 0.25rem;
  margin-bottom: 0.4rem;
  padding: 4px;
  border-bottom: 0;
  border-radius: 10px;
  background-color: var(--up-pilulas-fundo);
}

#formDocumento.doc-nova .aba-interna {
  display: inline-flex;
  flex: 0 0 auto;
  align-items: center;
  justify-content: center;
  gap: 0.45rem;
  height: 30px;
  padding: 0 1rem;
  border: 0;
  border-radius: 7px;
  font-size: 13px;
  font-weight: 700;
  color: var(--up-texto-suave);
}

#formDocumento.doc-nova.form-faturamento .aba-interna {
  flex: 0 0 auto;
  padding: 0 1rem;
}

#formDocumento.doc-nova .aba-interna:hover {
  color: var(--up-texto);
}

#formDocumento.doc-nova .aba-interna.ativa {
  background-color: var(--up-superficie);
  box-shadow: var(--up-sombra-cartao-leve);
  color: var(--up-marca-escura);
}

#formDocumento.doc-nova .aba-interna:focus-visible {
  outline: 3px solid var(--up-primaria-claro);
  outline-offset: 0;
}

/* contador de itens: na aba Itens e no titulo do cartao; vazio, some */
.doc-conta {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  min-width: 18px;
  height: 18px;
  padding: 0 5px;
  border-radius: 999px;
  background-color: var(--up-borda-suave);
  color: var(--up-cinza-chumbo);
  font-size: 10.5px;
  font-weight: 700;
  font-variant-numeric: tabular-nums;
}

.doc-conta:empty {
  display: none;
}

.aba-interna.ativa .doc-conta,
.titulo-bloco-nf .doc-conta {
  background-color: var(--up-primaria-fundo);
  color: var(--up-primaria);
}

/* --- Cartoes --- */
#formDocumento.doc-nova .bloco-campos,
#formDocumento.doc-nova .bloco-nf {
  border: 1px solid var(--up-borda-suave);
  border-radius: 12px;
  background-color: var(--up-superficie);
  box-shadow: var(--up-sombra-cartao-leve);
}

#formDocumento.doc-nova:not(.form-faturamento) .bloco-campos {
  gap: 0.5rem 0.75rem;
  padding: 0.75rem 1rem;
}

/* o faturamento nao tem `column-gap` (o respiro e o padding de cada campo,
   ver "Vendas > Pedido de Faturamento"): so o padding do cartao muda */
#formDocumento.doc-nova.form-faturamento .bloco-campos {
  padding: 0.75rem 0.45rem 0.9rem;
}

/* Inf. Complementares: a observacao mais abaixo, como la (a regra acima
   apagava o recuo de cima de `.bloco-complementares`) */
#formDocumento.doc-nova.form-faturamento .bloco-complementares {
  padding-top: 3.2rem;
}

/* o bloco que mora DENTRO de um cartao continua sem moldura (vem depois das
   duas regras acima para vencer o empate) */
#formDocumento.doc-nova .bloco-campos.bloco-sem-moldura {
  padding: 0;
  border: 0;
  border-radius: 0;
  background: none;
  box-shadow: none;
}

#formDocumento.doc-nova .bloco-nf {
  margin-bottom: 0.4rem;
  padding: 0.55rem 0.9rem 0.6rem;
}

/* "Incluir item" sem titulo (04/10/2026): as duas linhas de campos mais
   juntas -- cada pixel aqui e da grade de itens, que fica com a sobra */
#formDocumento#formDocumento.doc-nova #cartaoIncluirItem .bloco-campos {
  row-gap: 0.4rem;
}

#formDocumento.doc-nova .titulo-bloco-nf {
  display: flex;
  align-items: center;
  gap: 0.5rem;
  margin: 0 0 0.4rem;
  font-size: 13.5px;
  font-weight: 700;
  color: var(--up-marca-escura);
}

#formDocumento.doc-nova .itens-topo {
  margin-bottom: 0.3rem;
}

.doc-tit-ico {
  display: flex;
  flex: none;
  align-items: center;
  justify-content: center;
  width: 20px;
  height: 20px;
  border-radius: 7px;
  background-color: var(--up-primaria-fundo);
  color: var(--up-primaria);
}

/* sub-aba "Itens" do faturamento (a faixa cinza do Uniplus): vira pilula */
#formDocumento.doc-nova .sub-abas-faturamento {
  margin-bottom: 0.5rem;
}

#formDocumento.doc-nova .sub-aba-faturamento {
  flex: 0 0 auto;
  min-width: 8rem;
  height: 26px;
  padding: 0 1rem;
  border-radius: 8px;
  font-size: 12.5px;
  line-height: 26px;
}

#formDocumento.doc-nova .sub-aba-faturamento.ativa {
  background-color: var(--up-primaria-fundo);
  color: var(--up-primaria);
  font-weight: 700;
}

/* --- Campos --- */
#formDocumento.doc-nova .campo {
  gap: 3px;
}

#formDocumento.doc-nova .campo label {
  font-size: 11.5px;
  font-weight: 600;
  line-height: 1.2;
  color: var(--up-cinza-chumbo);
}

#formDocumento#formDocumento.doc-nova .campo :is(input:not([type="checkbox"]):not([type="radio"]), select, textarea) {
  padding: 0 0.6rem;
  border: 1px solid var(--up-borda);
  border-radius: 8px;
  font-size: 13px;
  line-height: 1.35;
  color: var(--up-texto);
  background-color: var(--up-superficie);
}

/* a altura so no input e no select: a observacao tem a altura propria
   (`#observacao`, min-height de 80/70px) */
#formDocumento#formDocumento.doc-nova .campo :is(input:not([type="checkbox"]):not([type="radio"]), select) {
  height: 30px;
}

#formDocumento#formDocumento.doc-nova .campo textarea {
  padding: 0.45rem 0.6rem;
}

#formDocumento#formDocumento.doc-nova .campo :is(input, textarea)::placeholder {
  color: var(--up-texto-suave);
}

#formDocumento#formDocumento.doc-nova .campo :is(input:not([type="checkbox"]):not([type="radio"]), select, textarea):focus {
  outline: 0;
  border-color: var(--up-primaria);
  box-shadow: 0 0 0 3px var(--up-primaria-fundo);
}

#formDocumento#formDocumento.doc-nova .campo :is(input:not([type="checkbox"]):not([type="radio"]), select, textarea):disabled {
  border-color: var(--up-borda-suave);
  background-color: var(--up-cinza-frio);
  color: var(--up-cinza-chumbo);
  opacity: 1;
}

/* o numero do documento travado em negrito: e o numero, nao um campo apagado */
#formDocumento#formDocumento.doc-nova #codigo:disabled {
  font-weight: 700;
  color: var(--up-marca-escura);
}

/* Preco minimo: continua verde (so leitura), nos tons da casa. Os dois
   `:not()` igualam o peso da regra do travado logo acima (vence por vir
   depois); sem eles o campo ficava cinza */
#formDocumento#formDocumento.doc-nova .campo input.campo-preco-minimo:not([type="checkbox"]):not([type="radio"]):disabled {
  border-color: var(--up-resolvida-borda);
  background-color: var(--up-resolvida-fundo);
  color: var(--up-resolvida);
  font-weight: 700;
}

/* lupa e lapis colados no campo, na altura dele */
#formDocumento#formDocumento.doc-nova .campo-com-lupa input:not([type="checkbox"]):not([type="radio"]) {
  border-radius: 8px 0 0 8px;
}

#formDocumento.doc-nova .botao-lupa {
  width: 2.25rem;
  border-color: var(--up-primaria);
  border-radius: 0 8px 8px 0;
  background-color: var(--up-primaria);
}

#formDocumento.doc-nova .botao-lupa:hover:enabled {
  background-color: var(--up-primaria-escuro);
}

#formDocumento.doc-nova .campo-com-lupa .botao-lupa:not(:last-child) {
  border-radius: 0;
}

#formDocumento.doc-nova .botao-editar-cliente {
  width: auto;
  border: 1px solid var(--up-borda);
  border-left: 0;
  background-color: var(--up-superficie);
  color: var(--up-primaria);
}

#formDocumento.doc-nova .botao-editar-cliente:hover:enabled {
  background-color: var(--up-primaria-fundo);
}

/* no faturamento a lupa do produto fica separada do campo (como no Uniplus):
   os dois ficam com os cantos redondos */
#formDocumento#formDocumento.doc-nova.form-faturamento #painelItens .campo-com-lupa input:not([type="checkbox"]):not([type="radio"]) {
  border-radius: 8px;
}

#formDocumento#formDocumento.doc-nova.form-faturamento #painelItens .campo-com-lupa .botao-lupa {
  border-radius: 8px;
}

/* CEP e telefone da entrega: o campo com os icones dentro e a caixa inteira */
#formDocumento.doc-nova .campo-com-icones {
  height: 30px;
  border-color: var(--up-borda);
  border-radius: 8px;
  background-color: var(--up-superficie);
  overflow: hidden;
}

#formDocumento.doc-nova .campo-com-icones:focus-within {
  border-color: var(--up-primaria);
  box-shadow: 0 0 0 3px var(--up-primaria-fundo);
}

#formDocumento#formDocumento.doc-nova .campo-com-icones input:not([type="checkbox"]):not([type="radio"]) {
  height: 28px;
  border: 0;
  border-radius: 0;
  background: none;
  box-shadow: none;
}

#formDocumento.doc-nova .botao-no-campo {
  width: 30px;
}

/* --- Botoes: mesmas cores e lugares, cantos de 8px --- */
#formDocumento.doc-nova .botao-acao {
  border-radius: 8px;
}

#formDocumento.doc-nova .campo-botoes .botao-acao {
  height: 30px;
  padding: 0 0.85rem;
  font-size: 12px;
  line-height: normal;
}

#formDocumento.doc-nova .rodape-documento .acoes-formulario .botao-acao {
  height: 30px;
  padding: 0 0.9rem;
}

#formDocumento.doc-nova .botao-navegacao {
  border-color: var(--up-primaria);
  background-color: var(--up-primaria);
}

#formDocumento.doc-nova .botao-navegacao:hover:enabled {
  border-color: var(--up-primaria-escuro);
  background-color: var(--up-primaria-escuro);
}

#formDocumento.doc-nova .botao-copiar-itens {
  height: 24px;
  padding: 0 0.6rem;
  border: 1px solid var(--up-resolvida-borda);
  background-color: var(--up-resolvida-fundo);
  color: var(--up-resolvida);
  font-size: 11px;
}

#formDocumento.doc-nova .barra-itens {
  margin-top: 0.35rem;
}

/* menos respiro entre a casca e as abas: a altura vai para a grade */
.painel-documento.painel-fin:has(> #formDocumento.doc-nova) {
  padding-top: 0.4rem;
}

/* --- Grade de itens --- */
#formDocumento#formDocumento.doc-nova #envolucroItens {
  border: 1px solid var(--up-borda-suave);
  border-radius: 10px;
  scrollbar-width: thin;
  scrollbar-color: var(--up-borda) transparent;
}

/* Faturamento: a grade podia encolher so ate 10rem e, a 1366x768, empurrava
   a barra Alterar/Excluir/... para baixo do rodape (com os campos de 30px ela
   sumia de vez). Com o piso do Pedido de Venda (6rem) a barra fica a vista */
#formDocumento#formDocumento.doc-nova.form-faturamento #envolucroItens {
  min-height: 6rem;
}

#formDocumento.doc-nova #gradeItens {
  font-family: var(--up-fonte);
  font-size: 12.5px;
}

#formDocumento#formDocumento.doc-nova #gradeItens th {
  height: 26px;
  padding: 0 8px;
  border-right: 0;
  border-bottom: 1px solid var(--up-borda-suave);
  background-color: var(--up-cinza-frio);
  background-image: none;
  font-size: 10.5px;
  font-weight: 700;
  letter-spacing: 0.04em;
  text-transform: uppercase;
  color: var(--up-texto-suave);
}

#formDocumento#formDocumento.doc-nova #gradeItens td {
  height: 26px;
  padding: 0 8px;
  border-right: 0;
  border-bottom: 1px solid var(--up-borda-suave);
  line-height: 18px;
}

#formDocumento#formDocumento.doc-nova #gradeItens td.indice {
  background-color: transparent;
  font-size: 11px;
  font-weight: 400;
  color: var(--up-texto-suave);
}

#formDocumento#formDocumento.doc-nova #gradeItens td.destaque {
  font-weight: 700;
  color: var(--up-marca-escura);
}

#formDocumento#formDocumento.doc-nova #gradeItens tbody tr:hover td {
  background-color: var(--up-cinza-frio);
}

#formDocumento#formDocumento.doc-nova #gradeItens tbody tr.linha-selecionada td {
  background-color: var(--up-primaria-fundo);
}

#formDocumento#formDocumento.doc-nova #gradeItens tbody tr.linha-selecionada td:first-child {
  box-shadow: inset 3px 0 0 var(--up-primaria);
}

/* --- Rodape --- */
#formDocumento.doc-nova .rodape-documento {
  padding: 0.35rem 1.5rem;
}

#formDocumento#formDocumento.doc-nova .rodape-documento .footer-start .campo label,
#formDocumento.doc-nova .rodape-documento .total-rotulo {
  font-size: 12.5px;
  font-weight: 700;
  color: var(--up-marca-escura);
}

#formDocumento.doc-nova .rodape-documento .total-valor {
  font-size: 21px;
  color: var(--up-primaria);
}

/* A lista "Condicao de pagamento a incluir" (04/10/2026): lista propria que
   abre sempre para BAIXO (a do <select> nativo subia quando faltava espaco)
   e campo da largura da maior condicao, com o Incluir logo ao lado. */
#formTipoDocumento .tdf-incluir-campo {
  flex: none;
  max-width: 100%;
}

.tdf-combo {
  position: relative;
}

#formTipoDocumento.tdf-form .tdf-combo input {
  padding-right: 1.8rem;
}

/* a seta em "V" do <select> (o mesmo desenho da do campo Acao), no lugar do
   triangulo pequeno que mal aparecia (04/10/2026, pedido do cliente) */
.tdf-combo-seta {
  position: absolute;
  top: 50%;
  right: 8px;
  display: flex;
  transform: translateY(-50%);
  color: var(--up-texto);
  pointer-events: none;
}

#formTipoDocumento.tdf-form .tdf-combo input:disabled + .tdf-combo-seta {
  color: var(--up-texto-suave);
}

.tdf-combo-lista {
  position: absolute;
  top: calc(100% + 3px);
  left: 0;
  right: 0;
  z-index: 6;
  max-height: 280px;
  margin: 0;
  padding: 4px 0;
  overflow-y: auto;
  list-style: none;
  border: 1px solid var(--up-borda);
  border-radius: 6px;
  background-color: var(--up-superficie);
  box-shadow: var(--up-sombra-cartao-leve);
}

.tdf-combo-lista[hidden] {
  display: none;
}

.tdf-combo-op {
  display: flex;
  flex-direction: column;
  padding: 5px 10px;
  font-size: 13px;
  cursor: pointer;
}

.tdf-combo-op small {
  font-size: 11px;
  color: var(--up-texto-suave);
}

.tdf-combo-op:hover,
.tdf-combo-op.ativa {
  background-color: var(--up-primaria-fundo);
  box-shadow: inset 3px 0 0 var(--up-primaria);
}

.tdf-combo-vazio {
  padding: 6px 10px;
  font-size: 12.5px;
  color: var(--up-texto-suave);
}

/* a lista de condicoes se comporta como um combo: seta do mouse, como no
   <select>, e nao a barra de digitar (04/10/2026, pedido do cliente). Digitar
   para filtrar continua valendo. O `!important` vence a regra geral "onde se
   digita de verdade" (cursor: text !important em todo input editavel). */
#formTipoDocumento.tdf-form .tdf-combo input {
  cursor: default !important;
}

#formTipoDocumento.tdf-form .tdf-combo input:disabled {
  cursor: not-allowed !important;
}

/* ==========================================================================
   FINANCEIRO > GERAL > CONCILIA-PRO (04/10/2026) -- a conciliacao bancaria
   nova. Modelo C do canvas https://claude.ai/artifact/HQ9EaUJ97unt9RakrtgfZy
   ("so o que precisa de voce"), escolhido pelo cliente:
   * inicio (concilia_pro_inicio.html): passo 1 conta | passo 2 arquivo +
     extratos ja importados;
   * extrato (concilia_pro.html): a faixa escura do extrato (.ext-faixa), UMA
     linha com pesquisa + abas em sequencia + botoes (pedido do cliente: a
     pesquisa no comeco e os filtros logo depois, para nao perder linha da
     grade), a faixa verde das conciliadas e a grade feita a mao (poucos
     movimentos por extrato: o desenho e o das .ccl-* da conciliacao antiga).
   Tela fixa, na cadeia do .cad-tela: so a lista rola. As cores de cada tipo
   de sugestao vem dos tokens --up-cpro-* (:root); cada classe de tipo so
   aponta --cp/--cpf para eles.
   ========================================================================== */

.cpro-tela [hidden] {
  display: none !important;
}

.cpro-tela .exato { --cp: var(--up-cpro-exato); --cpf: var(--up-cpro-exato-fundo); }
.cpro-tela .provavel { --cp: var(--up-cpro-provavel); --cpf: var(--up-cpro-provavel-fundo); }
.cpro-tela .soma { --cp: var(--up-cpro-soma); --cpf: var(--up-cpro-soma-fundo); }
.cpro-tela .titulo { --cp: var(--up-cpro-titulo); --cpf: var(--up-cpro-titulo-fundo); }
.cpro-tela .regra { --cp: var(--up-cpro-regra); --cpf: var(--up-cpro-regra-fundo); }
.cpro-tela .sem { --cp: var(--up-cpro-sem); --cpf: var(--up-cpro-sem-fundo); }

/* --- Faixa escura ------------------------------------------------------------ */

.cpro-faixa .ent-faixa-titulo {
  min-width: 0;
}

.cpro-passos {
  display: flex;
  gap: 6px;
  margin: 0 0 0 auto;
  padding: 0;
  list-style: none;
}

.cpro-passos li {
  display: inline-flex;
  align-items: center;
  gap: 7px;
  height: 28px;
  padding: 0 12px 0 5px;
  border-radius: 999px;
  background-color: var(--up-indicador-sobre-escuro);
  font-size: 12.5px;
  font-weight: 700;
  color: var(--up-superficie);
  white-space: nowrap;
}

.cpro-passos li span {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 20px;
  height: 20px;
  border-radius: 999px;
  background-color: var(--up-realce-sobre-escuro);
  font-size: 11px;
}

.cpro-passos li.atual {
  background-color: var(--up-superficie);
  color: var(--up-marca-escura);
}

.cpro-passos li.atual span {
  background-color: var(--up-marca-escura);
  color: var(--up-superficie);
}

.cpro-faixa-numeros {
  display: flex;
  align-items: center;
  gap: 22px;
  margin-left: auto;
}

.cpro-faixa-numeros .ccl-progresso {
  margin-left: 0;
}

.cpro-dif {
  display: flex;
  flex-direction: column;
  align-items: flex-end;
}

.cpro-dif span {
  font-size: 10.5px;
  font-weight: 700;
  letter-spacing: 0.06em;
  text-transform: uppercase;
  opacity: 0.75;
}

.cpro-dif strong {
  font-size: 16px;
  font-variant-numeric: tabular-nums;
  color: var(--up-atencao-sobre-escuro);
}

.cpro-dif strong.zerado {
  color: var(--up-progresso-sobre-escuro);
}

.cpro-aviso {
  display: flex;
  align-items: center;
  gap: 10px;
  padding: 10px 14px;
  border: 1px solid var(--up-intervencao);
  border-radius: 10px;
  background-color: var(--up-intervencao-fundo);
  font-size: 13px;
  color: var(--up-texto);
}

/* --- Inicio: conta + arquivo --------------------------------------------------- */

.cpro-inicio {
  display: grid;
  flex: 1 1 auto;
  grid-template-columns: minmax(0, 1.05fr) minmax(0, 1fr);
  gap: 12px;
  min-height: 0;
}

.cpro-coluna {
  display: flex;
  flex-direction: column;
  gap: 12px;
  min-height: 0;
}

.cpro-cartao {
  display: flex;
  flex-direction: column;
  min-height: 0;
}

.cpro-cresce {
  flex: 1 1 auto;
}

.cpro-cartao .cpro-rolagem {
  flex: 1 1 auto;
  min-height: 0;
  overflow-y: auto;
}

.cpro-numero {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 22px;
  height: 22px;
  border-radius: 999px;
  background-color: var(--up-marca-escura);
  font-size: 12px;
  color: var(--up-superficie);
}

.cpro-ajuda {
  margin: -2px 0 10px;
  font-size: 12px;
  color: var(--up-texto-suave);
}

.cpro-contas,
.cpro-extratos,
.cpro-candidatos,
.cpro-linhas {
  margin: 0;
  padding: 0;
  list-style: none;
}

.cpro-contas {
  display: flex;
  flex-direction: column;
  gap: 6px;
}

.cpro-conta,
.cpro-extrato {
  display: grid;
  grid-template-columns: 40px minmax(0, 1fr) auto;
  align-items: center;
  gap: 12px;
  width: 100%;
  padding: 9px 12px;
  border: 1px solid var(--up-borda-suave);
  border-radius: 9px;
  background-color: var(--up-superficie);
  font-family: var(--up-fonte);
  text-align: left;
  text-decoration: none;
  color: var(--up-texto);
  cursor: pointer;
}

.cpro-conta:hover,
.cpro-extrato:hover {
  border-color: var(--up-borda);
  background-color: var(--up-papel-parede);
}

.cpro-conta.escolhida {
  border-color: var(--up-primaria);
  background-color: var(--up-primaria-fundo);
  box-shadow: 0 0 0 2px var(--up-primaria-claro);
}

.cpro-conta-sigla {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 40px;
  height: 40px;
  border-radius: 10px;
  background-color: var(--up-primaria-fundo);
  font-size: 12px;
  font-weight: 700;
  color: var(--up-primaria-escuro);
}

.cpro-conta.escolhida .cpro-conta-sigla {
  background-color: var(--up-primaria);
  color: var(--up-superficie);
}

.cpro-conta-textos {
  display: flex;
  flex-direction: column;
  gap: 1px;
  min-width: 0;
}

.cpro-conta-textos strong {
  overflow: hidden;
  font-size: 13.5px;
  color: var(--up-marca-escura);
  text-overflow: ellipsis;
  white-space: nowrap;
}

.cpro-conta-textos small {
  overflow: hidden;
  font-size: 11.5px;
  color: var(--up-texto-suave);
  text-overflow: ellipsis;
  white-space: nowrap;
}

.cpro-conta-textos small.cpro-alerta {
  color: var(--up-intervencao);
}

.cpro-selo {
  display: inline-block;
  padding: 0 9px;
  border-radius: 999px;
  font-size: 11px;
  font-weight: 700;
  line-height: 20px;
  white-space: nowrap;
}

.cpro-selo.pendente {
  background-color: var(--up-intervencao-fundo);
  color: var(--up-intervencao);
}

.cpro-selo.ok {
  background-color: var(--up-resolvida-fundo);
  color: var(--up-resolvida);
}

.cpro-selo.nunca {
  background-color: var(--up-cinza-frio);
  color: var(--up-texto-suave);
}

.cpro-extrato-icone {
  width: 40px;
  height: 40px;
  border-radius: 10px;
  background-color: var(--up-cinza-frio);
}

.cpro-soltar {
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  gap: 8px;
  min-height: 170px;
  margin: 0;
  padding: 16px;
  border: 2px dashed var(--up-borda);
  border-radius: 12px;
  background-color: var(--up-papel-parede);
  text-align: center;
  color: var(--up-texto-suave);
  cursor: pointer;
}

.cpro-soltar strong {
  font-size: 14.5px;
  color: var(--up-marca-escura);
}

.cpro-soltar small {
  font-size: 12px;
}

.cpro-soltar-icone {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 52px;
  height: 52px;
  border-radius: 14px;
  background-color: var(--up-primaria-fundo);
  color: var(--up-primaria);
}

.cpro-soltar:hover,
.cpro-soltar.arrastando {
  border-color: var(--up-primaria);
  background-color: var(--up-primaria-fundo);
}

.cpro-soltar.processando,
.cpro-soltar.travada {
  opacity: 0.6;
  pointer-events: none;
}

.cpro-vazio {
  padding: 14px;
  border-radius: 9px;
  background-color: var(--up-cinza-frio);
  font-size: 12.5px;
  color: var(--up-texto-suave);
}

.cpro-extratos {
  display: flex;
  flex-direction: column;
  gap: 6px;
}

/* --- Extrato: a linha de pesquisa + abas + botoes ------------------------------ */

.cpro-lista {
  min-height: 240px;
}

.cpro-barra {
  display: flex;
  flex: none;
  flex-wrap: wrap;
  align-items: center;
  gap: 10px;
  min-height: 52px;
  padding: 6px 12px;
  border-bottom: 1px solid var(--up-borda);
}

.cpro-busca {
  flex: 0 1 270px;
  min-width: 200px;
}

.cpro-abas {
  display: inline-flex;
  align-items: stretch;
  height: 38px;
  overflow: hidden;
  border: 1px solid var(--up-borda);
  border-radius: 10px;
  background-color: var(--up-superficie);
}

.cpro-aba-grupo {
  display: inline-flex;
  align-items: stretch;
  border-left: 1px solid var(--up-borda);
}

.cpro-aba-grupo.primeiro {
  border-left: 0;
}

.cpro-aba-grupo.entrada { --grupo: var(--up-dinheiro-entrada); --grupo-fundo: var(--up-resolvida-fundo); }
.cpro-aba-grupo.saida { --grupo: var(--up-dinheiro-saida); --grupo-fundo: var(--up-pendencia-fundo); }

.cpro-aba-rotulo {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  padding: 0 10px 0 13px;
  background-color: var(--grupo-fundo);
  font-size: 10.5px;
  font-weight: 700;
  letter-spacing: 0.06em;
  text-transform: uppercase;
  color: var(--grupo);
}

.cpro-aba-rotulo::before {
  content: "";
  width: 8px;
  height: 8px;
  border-radius: 999px;
  background-color: var(--grupo);
}

.cpro-aba {
  display: inline-flex;
  align-items: center;
  gap: 7px;
  padding: 0 13px;
  border: 0;
  background-color: var(--up-superficie);
  font-family: var(--up-fonte);
  font-size: 13px;
  color: var(--up-texto-suave);
  white-space: nowrap;
  cursor: pointer;
}

.cpro-aba:hover {
  background-color: var(--up-papel-parede);
}

.cpro-aba.ativa {
  background-color: var(--up-primaria-fundo);
  box-shadow: inset 0 -3px 0 var(--grupo);
  font-weight: 700;
  color: var(--up-marca-escura);
}

.cpro-conta-aba {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  min-width: 20px;
  height: 20px;
  padding: 0 6px;
  border-radius: 999px;
  background-color: var(--up-resolvida-fundo);
  font-size: 11px;
  font-weight: 700;
  color: var(--up-resolvida);
}

.cpro-conta-aba.alerta {
  background-color: var(--up-intervencao);
  color: var(--up-superficie);
}

.cpro-acoes {
  display: flex;
  flex: none;
  gap: 6px;
  margin-left: auto;
}

.cpro-tela .botao-acao.cpro-botao-contorno {
  border: 1px solid var(--up-dinheiro-entrada);
  background-color: var(--up-superficie);
  color: var(--up-dinheiro-entrada);
}

.cpro-tela .botao-acao.cpro-botao-desfazer {
  border: 1px solid var(--up-dinheiro-saida);
  background-color: var(--up-superficie);
  color: var(--up-dinheiro-saida);
}

/* --- Faixa verde (o que ja esta conciliado) ------------------------------------- */

.cpro-faixa-ok {
  display: flex;
  flex: none;
  flex-wrap: wrap;
  align-items: center;
  gap: 12px;
  padding: 8px 14px;
  border-bottom: 1px solid var(--up-resolvida-borda);
  background-color: var(--up-resolvida-fundo);
}

.cpro-ok-icone {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 28px;
  height: 28px;
  border-radius: 999px;
  background-color: var(--up-resolvida);
  color: var(--up-superficie);
}

.cpro-ok-textos {
  display: flex;
  flex-direction: column;
}

.cpro-ok-textos strong {
  font-size: 13.5px;
  color: var(--up-resolvida);
}

.cpro-ok-textos small {
  font-size: 12px;
  color: var(--up-texto-suave);
}

.cpro-origens {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  margin-left: 10px;
}

.cpro-origens-rotulo {
  font-size: 12px;
  color: var(--up-texto-suave);
}

.cpro-origem,
.cpro-botao-claro {
  height: 26px;
  padding: 0 11px;
  border: 1px solid var(--up-resolvida);
  border-radius: 999px;
  background-color: var(--up-superficie);
  font-family: var(--up-fonte);
  font-size: 12px;
  color: var(--up-resolvida);
  cursor: pointer;
}

.cpro-origem.ativa {
  background-color: var(--up-resolvida);
  font-weight: 700;
  color: var(--up-superficie);
}

.cpro-botao-claro {
  margin-left: auto;
  border-radius: 7px;
  font-weight: 700;
}

/* --- A grade ------------------------------------------------------------------ */

.cpro-cab,
.cpro-linha {
  display: grid;
  grid-template-columns: 42px 58px minmax(0, 1fr) 118px 36px minmax(0, 1.25fr) minmax(0, 1fr) 176px;
  align-items: center;
}

.cpro-cab {
  flex: none;
  height: 30px;
  border-bottom: 1px solid var(--up-borda);
  background-color: var(--up-cinza-frio);
  font-size: 10.5px;
  font-weight: 700;
  letter-spacing: 0.04em;
  text-transform: uppercase;
  color: var(--up-texto-suave);
}

.cpro-cab > span {
  padding: 0 8px;
}

.cpro-cab > .num {
  text-align: right;
}

.cpro-tela .cpro-rolagem {
  flex: 1 1 auto;
  min-height: 0;
  overflow-y: auto;
}

.cpro-linha {
  min-height: 50px;
  border-bottom: 1px solid var(--up-borda-suave);
  font-size: 12.5px;
}

.cpro-linha:hover {
  background-color: var(--up-papel-parede);
}

.cpro-linha.marcada {
  background-color: var(--up-primaria-fundo);
  box-shadow: inset 3px 0 0 var(--up-primaria);
}

.cpro-escolha {
  display: flex;
  justify-content: center;
}

.cpro-caixa {
  width: 16px;
  height: 16px;
  padding: 0;
  border: 1.5px solid var(--up-texto-suave);
  border-radius: 3px;
  background-color: var(--up-superficie);
  cursor: pointer;
}

.cpro-caixa.marcada {
  border-color: var(--up-primaria);
  background-color: var(--up-primaria);
  box-shadow: inset 0 0 0 2px var(--up-superficie);
}

.cpro-caixa:disabled {
  opacity: 0.4;
  cursor: not-allowed;
}

.cpro-data {
  padding: 0 8px;
  font-size: 12px;
  font-variant-numeric: tabular-nums;
  color: var(--up-texto-suave);
}

.cpro-banco,
.cpro-sugestao {
  display: flex;
  flex-direction: column;
  gap: 2px;
  min-width: 0;
  padding: 4px 8px;
}

.cpro-banco strong,
.cpro-banco small,
.cpro-sugestao strong,
.cpro-sugestao small {
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.cpro-banco strong {
  color: var(--up-texto);
}

.cpro-linha.conciliada .cpro-banco strong {
  font-weight: 400;
  color: var(--up-texto-suave);
}

.cpro-banco small,
.cpro-sugestao small {
  font-size: 11px;
  color: var(--up-texto-suave);
}

.cpro-valor {
  padding: 0 10px;
  font-weight: 700;
  font-variant-numeric: tabular-nums;
  text-align: right;
  white-space: nowrap;
}

.cpro-valor.entrada {
  color: var(--up-dinheiro-entrada);
}

.cpro-valor.saida {
  color: var(--up-dinheiro-saida);
}

.cpro-sinal-env {
  display: flex;
  justify-content: center;
}

.cpro-sinal {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 26px;
  height: 26px;
  border-radius: 999px;
  background-color: var(--cpf);
  color: var(--cp);
}

.cpro-sugestao-topo {
  display: flex;
  align-items: center;
  gap: 6px;
  min-width: 0;
}

.cpro-sugestao strong {
  color: var(--up-marca-escura);
}

.cpro-etiqueta {
  flex: none;
  padding: 0 7px;
  border-radius: 999px;
  background-color: var(--cpf);
  font-size: 10.5px;
  font-weight: 700;
  line-height: 17px;
  color: var(--cp);
  white-space: nowrap;
}

.cpro-por {
  display: flex;
  flex-direction: column;
  gap: 2px;
  min-width: 0;
  padding: 4px 8px;
}

.cpro-motivo {
  display: flex;
  align-items: center;
  gap: 6px;
  min-width: 0;
  font-size: 11.5px;
  color: var(--up-texto-suave);
}

.cpro-motivo > span {
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.cpro-motivo i {
  flex: none;
  width: 6px;
  height: 6px;
  border-radius: 999px;
  background-color: var(--up-resolvida);
}

.cpro-motivo.aviso i {
  background-color: var(--up-intervencao);
}

.cpro-acao {
  display: flex;
  justify-content: flex-end;
  gap: 4px;
  padding: 0 12px 0 4px;
}

.cpro-botao-linha {
  height: 28px;
  padding: 0 10px;
  border: 1px solid var(--cp);
  border-radius: 7px;
  background-color: var(--cp);
  font-family: var(--up-fonte);
  font-size: 11px;
  font-weight: 700;
  color: var(--up-superficie);
  text-transform: uppercase;
  white-space: nowrap;
  cursor: pointer;
}

.cpro-botao-linha.neutro {
  border-color: var(--up-borda);
  background-color: var(--up-superficie);
  color: var(--up-texto-suave);
}

.cpro-botao-icone {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 28px;
  height: 28px;
  padding: 0;
  border: 1px solid var(--up-borda);
  border-radius: 7px;
  background-color: var(--up-superficie);
  color: var(--up-texto-suave);
  cursor: pointer;
}

.cpro-botao-linha:disabled,
.cpro-botao-icone:disabled {
  opacity: 0.55;
  cursor: not-allowed;
}

.cpro-pe {
  display: flex;
  flex: none;
  justify-content: space-between;
  align-items: center;
  height: 30px;
  padding: 0 12px;
  border-top: 1px solid var(--up-borda);
  background-color: var(--up-cinza-frio);
  font-size: 12px;
  color: var(--up-texto-suave);
}

.cpro-pe #peMarcados {
  font-weight: 700;
  color: var(--up-texto);
}

.cpro-vazio-lista {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 4px;
  padding: 60px 16px;
  font-size: 13.5px;
  color: var(--up-texto-suave);
}

.cpro-vazio-lista strong {
  font-size: 15px;
  color: var(--up-texto);
}

.cpro-vazio-lista strong.ok {
  font-size: 17px;
  color: var(--up-resolvida);
}

/* --- Janelas ------------------------------------------------------------------- */

/* Resolver e Procurar: o .dialogo-largo tem altura FIXA (44rem) para a
   janela nao pular com o resultado; estas tem pouco conteudo, entao ficam
   com a altura do que mostram (a lista do Procurar rola sozinha) */
#dialogoResolver,
#dialogoProcurar {
  width: min(52rem, calc(100vw - 3rem));
  height: auto;
  max-height: calc(100vh - 4rem);
}

#dialogoDesfazer {
  width: 500px;
  max-width: calc(100vw - 32px);
  padding: 0;
  border: 0;
  border-radius: 14px;
  box-shadow: var(--up-sombra-menu);
}

.cpro-dialogo-topo {
  display: flex;
  align-items: flex-start;
  gap: 14px;
  padding: 20px 22px 4px;
}

.cpro-dialogo-topo h2 {
  margin: 0 0 6px;
  font-size: 17px;
  color: var(--up-marca-escura);
}

.cpro-dialogo-topo p {
  margin: 0;
  font-size: 13px;
  line-height: 1.45;
  color: var(--up-texto-suave);
}

.cpro-dialogo-icone {
  display: inline-flex;
  flex: none;
  align-items: center;
  justify-content: center;
  width: 42px;
  height: 42px;
  border-radius: 999px;
  background-color: var(--up-intervencao-fundo);
  color: var(--up-intervencao);
}

.cpro-resumo {
  display: grid;
  grid-template-columns: 1fr auto;
  gap: 4px 12px;
  margin: 10px 22px 0 78px;
  font-size: 12.5px;
}

.cpro-resumo dt {
  font-weight: 400;
}

.cpro-resumo dd {
  margin: 0;
  font-weight: 700;
  font-variant-numeric: tabular-nums;
}

.cpro-criados {
  display: flex;
  align-items: flex-start;
  gap: 9px;
  margin: 12px 22px 0 78px;
  padding: 10px 12px;
  border-radius: 9px;
  background-color: var(--up-intervencao-fundo);
  font-size: 12.5px;
  line-height: 1.4;
  cursor: pointer;
}

.cpro-criados input {
  flex: none;
  margin-top: 2px;
}

.cpro-criados strong {
  display: block;
}

.cpro-dialogo-rodape {
  display: flex;
  justify-content: flex-end;
  gap: 10px;
  padding: 18px 22px 20px;
}

.cpro-mov-resumo {
  display: flex;
  align-items: center;
  gap: 12px;
  margin-bottom: 12px;
  padding: 10px 12px;
  border-radius: 9px;
  background-color: var(--up-cinza-frio);
}

.cpro-mov-data {
  font-size: 12px;
  font-variant-numeric: tabular-nums;
  color: var(--up-texto-suave);
}

.cpro-mov-texto {
  display: flex;
  flex: 1 1 auto;
  flex-direction: column;
  min-width: 0;
}

.cpro-mov-texto small {
  font-size: 11.5px;
  color: var(--up-texto-suave);
}

.cpro-seg {
  display: inline-flex;
  gap: 2px;
  margin-bottom: 10px;
  padding: 2px;
  border-radius: 999px;
  background-color: var(--up-pilulas-fundo);
}

.cpro-seg button {
  height: 28px;
  padding: 0 14px;
  border: 0;
  border-radius: 999px;
  background: none;
  font-family: var(--up-fonte);
  font-size: 12.5px;
  color: var(--up-texto-suave);
  cursor: pointer;
}

.cpro-seg button.ativo {
  background-color: var(--up-superficie);
  font-weight: 700;
  color: var(--up-marca-escura);
}

.cpro-campos {
  border: 0;
  padding: 0;
}

.cpro-lembrar {
  display: flex;
  flex-direction: column;
  gap: 8px;
  margin-top: 12px;
  padding: 10px 12px;
  border: 1px dashed var(--up-borda);
  border-radius: 9px;
  font-size: 12.5px;
}

.cpro-marcar {
  display: flex;
  align-items: center;
  gap: 7px;
  cursor: pointer;
}

.cpro-lembrar-campos {
  display: flex;
  flex-direction: column;
  gap: 6px;
}

.cpro-lembrar-campos input[type="text"] {
  width: 100%;
  height: 30px;
  padding: 0 10px;
  border: 1px solid var(--up-borda);
  border-radius: 7px;
  font-family: var(--up-fonte);
}

.cpro-link {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  margin-top: 12px;
  padding: 0;
  border: 0;
  background: none;
  font-family: var(--up-fonte);
  font-size: 12.5px;
  font-weight: 700;
  color: var(--up-primaria);
  cursor: pointer;
}

.cpro-busca-dialogo {
  width: 100%;
  margin-bottom: 6px;
}

.cpro-candidatos {
  max-height: 340px;
  overflow-y: auto;
  border: 1px solid var(--up-borda);
  border-radius: 9px;
}

.cpro-candidatos .cpro-vazio {
  border-radius: 0;
}

.cpro-candidato {
  display: grid;
  grid-template-columns: 28px 86px minmax(0, 1fr) 120px;
  align-items: center;
  min-height: 42px;
  margin: 0;
  border-bottom: 1px solid var(--up-borda-suave);
  font-size: 12.5px;
  cursor: pointer;
}

.cpro-candidato input {
  justify-self: center;
}

.cpro-candidato.marcada {
  background-color: var(--up-primaria-fundo);
}

.cpro-soma {
  margin-right: auto;
  font-size: 12.5px;
  font-weight: 700;
  color: var(--up-intervencao);
}

.cpro-soma.bate {
  color: var(--up-resolvida);
}

/* ate 1366px: o "Por que" encolhe antes da sugestao, e a barra quebra em duas
   linhas so abaixo de ~1200px (medido com as duas abas e tres botoes) */
@media (max-width: 1400px) {
  .cpro-cab,
  .cpro-linha {
    grid-template-columns: 38px 52px minmax(0, 1fr) 108px 34px minmax(0, 1.2fr) minmax(0, 0.8fr) 170px;
  }
  .cpro-busca {
    flex-basis: 200px;
    min-width: 150px;
  }
}

@media (max-width: 1100px) {
  .cpro-inicio {
    grid-template-columns: minmax(0, 1fr);
  }
  .cpro-faixa-numeros {
    margin-left: 0;
  }
}

/* Aba "Condicoes e quitacao" do Tipo de Documento (05/10/2026, Modelo B do
   canvas https://claude.ai/artifact/6QrUeChocF38ikK6iLDTaW): "Na venda" e
   "Na quitacao" lado a lado, cada coluna com o bloco verde de incluir em
   cima e a tabela embaixo; as previas das duas telas numa linha abaixo.
   Tela estreita: uma coluna embaixo da outra. */
.tdf-par {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  align-items: start;
  gap: 14px;
  margin-top: 0.75rem;
}

.tdf-coluna {
  min-width: 0;
  padding: 12px;
  border: 1px solid var(--up-borda-suave);
  border-radius: 12px;
  background-color: var(--up-cinza-frio);
}

.tdf-col-quando {
  display: block;
  font-size: 10.5px;
  font-weight: 700;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: var(--up-primaria);
}

.tdf-col-tit {
  margin: 2px 0 4px;
  font-size: 14px;
  font-weight: 700;
  color: var(--up-marca-escura);
}

.tdf-col-sub {
  margin: 0 0 10px;
  font-size: 12px;
  color: var(--up-texto-suave);
}

.tdf-coluna .tdf-aviso {
  margin: 0 0 10px;
}

.tdf-coluna .tdf-incluir {
  flex-wrap: nowrap;
  margin-top: 0;
}

#formTipoDocumento .tdf-coluna .tdf-incluir-campo {
  flex: 1 1 auto;
  min-width: 0;
}

.tdf-coluna .tdf-incluir .botao-acao.cad-botao {
  flex: none;
}

.tdf-coluna .tdf-grade .grade {
  background-color: var(--up-superficie);
}

/* meia largura: o texto quebra na celula (a explicacao da forma e longa) e
   o Tirar fica sempre a vista, sem barra de rolagem */
.tdf-coluna .tdf-grade .grade td:not(.acao) {
  white-space: normal;
}

.tdf-coluna .tdf-cond-vazia {
  margin-top: 0.9rem;
  background-color: var(--up-superficie);
}

.tdf-previas {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(320px, 1fr));
  align-items: start;
  gap: 14px;
  margin-top: 1rem;
}

.tdf-previas .tdf-previa {
  margin-top: 0;
}

.tdf-cond-vazia {
  margin: 0;
  padding: 14px;
  border: 1px dashed var(--up-borda);
  border-radius: 10px;
  text-align: center;
}

.tdf-cond-vazia[hidden] {
  display: none;
}

@media (max-width: 900px) {
  .tdf-par {
    grid-template-columns: minmax(0, 1fr);
  }
}

/* --- Baixa: formas filtradas pelo tipo do titulo (05/10/2026) ------------------
   O combo Forma de pagamento so traz as formas que o tipo aceita (aba
   "Condicoes e quitacao" do Tipo de Documento). A frase diz o porque; sem
   nenhuma forma em comum ela vira aviso ambar. */
.fin-aviso-formas {
  margin: -0.2rem 0 0.6rem;
  padding: 6px 10px;
  border-radius: 8px;
  background-color: var(--up-primaria-fundo);
  font-size: 12px;
  color: var(--up-texto);
}

.fin-aviso-formas-vazio {
  background-color: var(--up-intervencao-fundo);
  font-weight: 700;
}

/* --- Menus dos modulos sem os titulos de secao (04/10/2026, teste) ---------
   Pedido do cliente: esconder "Geral", "Status", "Configuracao"... dos menus
   da barra de modulos, POR ENQUANTO -- nao apagar. O <h2 class="grupo-titulo">
   continua no HTML: o abas.js (nome do grupo na aba) e o menu_ordem.js leem o
   texto dele. Para voltar, basta tirar esta regra. (marca: mega-menu-sem-secoes) */
.mega-menu .grupo-titulo {
  display: none;
}

/* ==========================================================================
   Janelas do documento de venda na nova aparencia (.dlg-nova, 04/10/2026)

   Pesquisa de Clientes, Pesquisa de Produtos e Editar cliente do Orcamento,
   Pedido de Venda e Pedido de Faturamento (vendas/_documento_dialogos.html).
   Pedido do cliente: "nao podem ficar desse jeito". O desenho e o do modal
   de Configuracao de colunas (.col-*): faixa escura no topo, fundo claro,
   conteudo em cartao branco, pesquisa e botoes de 30px; a grade no desenho
   das listagens novas (cabecalho em caixa alta, linhas de 30px, nome em
   negrito, linha marcada com o filete da marca). So o visual: as colunas,
   os campos e o JS sao os mesmos.
   ========================================================================== */

.dialogo.dlg-nova {
  overflow: hidden;
  border-radius: 14px;
  background-color: var(--up-papel-parede);
  box-shadow: var(--up-sombra-painel-modulo);
  font-family: var(--up-fonte);
}

.dlg-nova .dlg-faixa {
  flex: 0 0 auto;
}

.dlg-nova .dlg-faixa h1 {
  font-size: 17px;
}

.dlg-nova .dlg-faixa b {
  font-weight: 700;
}

/* --- Pesquisa ----------------------------------------------------------- */
.dlg-nova .dialogo-filtros {
  flex: 0 0 auto;
  gap: 1rem;
  padding: 14px 18px 10px;
}

.dlg-nova .dlg-busca {
  flex: 0 1 30rem;
  height: 30px;
}

.dlg-nova .dlg-busca input {
  font-size: 13px;
}

.dlg-nova .campo-marcavel {
  font-size: 12.5px;
  color: var(--up-cinza-chumbo);
}

.dlg-nova .campo-marcavel input {
  accent-color: var(--up-primaria);
}

/* --- A grade em cartao: o corpo e o cartao e e ele que rola, com o
   cabecalho preso no alto (.dialogo-corpo .grade thead th) --------------- */
.dlg-nova .dialogo-corpo {
  margin: 0 18px;
  padding: 0;
  border: 1px solid var(--up-borda);
  border-radius: 10px;
  background-color: var(--up-superficie);
  box-shadow: var(--up-sombra-cartao-leve);
  scrollbar-width: thin;
  scrollbar-color: var(--up-borda) transparent;
}

.dlg-nova .dialogo-corpo .grade-envolucro.planilha {
  border: 0;
  border-radius: 0;
}

.dlg-nova .grade.grade-planilha {
  font-family: var(--up-fonte);
  font-size: 12.5px;
}

.dlg-nova .grade.grade-planilha th {
  height: 30px;
  padding: 0 10px;
  border-right: 0;
  border-bottom: 1px solid var(--up-borda-suave);
  background-color: var(--up-cinza-frio);
  background-image: none;
  font-size: 10.5px;
  font-weight: 700;
  letter-spacing: 0.04em;
  text-transform: uppercase;
  white-space: nowrap;
  color: var(--up-texto-suave);
}

.dlg-nova .grade.grade-planilha td {
  height: 30px;
  padding: 0 10px;
  border-right: 0;
  border-bottom: 1px solid var(--up-borda-suave);
  line-height: 18px;
  color: var(--up-texto);
}

/* codigo: cinza suave, como a .cad-codigo das listagens */
.dlg-nova .grade.grade-planilha td.num:first-child {
  font-variant-numeric: tabular-nums;
  color: var(--up-texto-suave);
}

.dlg-nova .grade.grade-planilha td.num {
  font-variant-numeric: tabular-nums;
}

.dlg-nova .grade.grade-planilha td.destaque {
  font-weight: 700;
  color: var(--up-marca-escura);
}

.dlg-nova .grade.grade-planilha tbody tr:not(.vazia) {
  cursor: pointer;
}

.dlg-nova .grade.grade-planilha tbody tr:hover td {
  background-color: var(--up-cinza-frio);
}

.dlg-nova .grade.grade-planilha.selecionavel tbody tr.selecionada td {
  background-color: var(--up-primaria-fundo);
}

.dlg-nova .grade.grade-planilha.selecionavel tbody tr.selecionada td:first-child {
  box-shadow: inset 3px 0 0 var(--up-primaria);
}

.dlg-nova .grade.grade-planilha tbody tr.vazia td {
  height: auto;
  padding: 1.5rem;
  text-align: center;
  color: var(--up-texto-suave);
}

.dlg-nova .carregando-mais,
.dlg-nova .contagem-resultados {
  margin: 0;
  padding: 8px 12px;
  font-size: 11.5px;
  color: var(--up-texto-suave);
}

/* --- Rodape ------------------------------------------------------------- */
.dlg-nova .dialogo-rodape {
  flex: 0 0 auto;
  gap: 8px;
  margin-top: 14px;
  padding: 12px 18px;
  border-top: 1px solid var(--up-borda-suave);
  background-color: var(--up-superficie);
}

.dlg-nova .dialogo-rodape .botao-acao.cad-botao {
  height: 30px;
  padding: 0 0.9rem;
  gap: 0.5rem;
  border-radius: 8px;
  font-size: 12.5px;
}

/* --- Editar cliente: tres cartoes (Dados, Contato, Endereco) ------------ */
.dlg-nova .cliente-rapido-corpo {
  display: flex;
  flex-direction: column;
  gap: 12px;
  padding: 14px 18px 0;
}

.dlg-nova .bloco-campos.dlg-cartao {
  gap: 0.55rem 0.75rem;
  margin: 0;
  padding: 12px 14px 14px;
  border: 1px solid var(--up-borda-suave);
  border-radius: 12px;
  background-color: var(--up-superficie);
  box-shadow: var(--up-sombra-cartao-leve);
}

.dlg-nova .dlg-cartao .bloco-titulo {
  display: flex;
  align-items: center;
  gap: 0.5rem;
  margin: 0;
  font-size: 13.5px;
  font-weight: 700;
  color: var(--up-marca-escura);
}

/* o rodape tem a margem de cima; aqui o corpo rola ate a borda */
.dlg-nova.dialogo-cliente-rapido .dialogo-rodape {
  margin-top: 14px;
}

/* campos na medida do facelift das telas de venda (.doc-nova) */
.dlg-nova .campo {
  gap: 3px;
}

.dlg-nova .campo label {
  font-size: 11.5px;
  font-weight: 600;
  line-height: 1.2;
  color: var(--up-cinza-chumbo);
}

.dialogo.dlg-nova .campo :is(input:not([type="checkbox"]):not([type="radio"]):not([type="hidden"]), select) {
  height: 30px;
  padding: 0 0.6rem;
  border: 1px solid var(--up-borda);
  border-radius: 8px;
  font-size: 13px;
  line-height: 1.35;
  color: var(--up-texto);
  background-color: var(--up-superficie);
}

.dialogo.dlg-nova .campo :is(input, select):focus {
  outline: 0;
  border-color: var(--up-primaria);
  box-shadow: 0 0 0 3px var(--up-primaria-fundo);
}

.dialogo.dlg-nova .campo :is(input, select):disabled {
  border-color: var(--up-borda-suave);
  background-color: var(--up-cinza-frio);
  color: var(--up-cinza-chumbo);
}

.dialogo.dlg-nova .campo input::placeholder {
  color: var(--up-texto-suave);
}

/* produto sem preco na pauta: o preco base apagado continua apagado */
.dlg-nova .grade.grade-planilha td.preco-sem-pauta {
  color: var(--up-texto-suave);
}

/* ==========================================================================
   Vendas > PDV > Consulta NFC-e (.nfc-*, 04/10/2026)
   "Modelo A" do canvas https://claude.ai/artifact/Y6QYhT4f7ddCKuE12B3DDh:
   uma linha com pesquisa, Periodo (menu com "Periodo especifico" De/Ate),
   chips de situacao e as acoes (PDF, Copiar chave, Mais, Atualizar); lista a
   esquerda e o cupom da NFC-e marcada a direita, com o "Reimprimir cupom".
   Linhas e botoes de 30px, como a nova aparencia (skill nova-aparencia).
   ========================================================================== */
.nfc-tela {
  display: flex;
  flex: 1 1 auto;
  flex-direction: column;
  gap: 0.55rem;
  min-height: 0;
}

.nfc-tela > * {
  flex-shrink: 0;
}

.nfc-cabecalho {
  position: relative;
  z-index: 6;
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 0.4rem;
}

/* a pesquisa encolhe (ate 160px) antes de a linha quebrar: as acoes ficam na
   linha do Atualizar, pedido do cliente no canvas */
.nfc-tela .nfc-busca {
  flex: 1 1 160px;
  width: auto;
  min-width: 160px;
  max-width: 290px;
  height: 30px;
  border-radius: 999px;
}

.nfc-botao {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  height: 30px;
  padding: 0 0.75rem;
  border: 1px solid transparent;
  border-radius: 8px;
  font: inherit;
  font-size: 12.5px;
  font-weight: 600;
  white-space: nowrap;
  cursor: pointer;
}

.nfc-botao:disabled {
  opacity: 0.45;
  cursor: not-allowed;
}

.nfc-botao-marca {
  background-color: var(--up-primaria);
  color: var(--up-superficie);
}

.nfc-botao-marca:hover:not(:disabled) {
  background-color: var(--up-primaria-escuro);
}

.nfc-botao-claro {
  border-color: var(--up-borda);
  background-color: var(--up-superficie);
  color: var(--up-texto);
}

.nfc-botao-claro:hover:not(:disabled) {
  border-color: var(--up-primaria-claro);
  background-color: var(--up-primaria-fundo);
}

.nfc-botao-claro.ok {
  border-color: var(--up-resolvida-borda);
  background-color: var(--up-resolvida-fundo);
  color: var(--up-resolvida);
}

.nfc-botao-escuro {
  background-color: var(--up-marca-escura);
  color: var(--up-superficie);
}

.nfc-botao-escuro:hover:not(:disabled) {
  background-color: var(--up-primaria-escuro);
}

.nfc-botao[hidden],
.nfc-chip[hidden] {
  display: none;
}

/* --- Chips de situacao --- */
.nfc-chips {
  display: flex;
  flex-wrap: wrap;
  gap: 0.25rem;
}

.nfc-chip {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  height: 26px;
  padding: 0 8px;
  border: 1px solid var(--up-borda);
  border-radius: 999px;
  background-color: var(--up-superficie);
  color: var(--up-texto);
  font: inherit;
  font-size: 12px;
  cursor: pointer;
}

.nfc-chip:hover {
  border-color: var(--up-primaria-claro);
}

.nfc-chip b {
  color: var(--up-texto-suave);
}

.nfc-chip.on {
  border-color: var(--up-primaria);
  background-color: var(--up-primaria-fundo);
  color: var(--up-primaria-escuro);
  font-weight: 700;
}

.nfc-chip.on b {
  color: var(--up-primaria-escuro);
}

.nfc-chip-limpar {
  border-style: dashed;
}

.nfc-bolinha {
  width: 8px;
  height: 8px;
  border-radius: 50%;
  background-color: var(--up-texto-suave);
}

.nfc-bolinha.ok { background-color: var(--up-resolvida); }
.nfc-bolinha.aviso { background-color: var(--up-intervencao); }
.nfc-bolinha.erro { background-color: var(--up-pendencia); }

/* --- Menus suspensos (Periodo e Mais) --- */
.nfc-periodo,
.nfc-mais {
  position: relative;
}

.nfc-acoes {
  display: flex;
  align-items: center;
  gap: 0.4rem;
  margin-left: auto;
}

.nfc-menu {
  position: absolute;
  top: 34px;
  z-index: 20;
  padding: 6px 0;
  border: 1px solid var(--up-borda);
  border-radius: 10px;
  background-color: var(--up-superficie);
  box-shadow: var(--up-sombra-menu);
}

.nfc-menu[hidden] {
  display: none;
}

.nfc-menu-periodo {
  left: 0;
  width: 300px;
}

.nfc-menu-mais {
  right: 0;
  width: 260px;
}

.nfc-menu-item {
  display: flex;
  justify-content: space-between;
  align-items: center;
  gap: 18px;
  width: 100%;
  height: 30px;
  padding: 0 12px;
  border: 0;
  background: none;
  color: var(--up-texto);
  font: inherit;
  font-size: 12.5px;
  text-align: left;
  cursor: pointer;
}

.nfc-menu-item:hover:not(:disabled) {
  background-color: var(--up-primaria-fundo);
}

.nfc-menu-item:disabled {
  opacity: 0.45;
  cursor: not-allowed;
}

.nfc-menu-item[hidden] {
  display: none;
}

.nfc-menu-item small {
  color: var(--up-texto-suave);
  font-size: 11.5px;
  font-weight: 400;
}

.nfc-menu-item.on {
  color: var(--up-primaria-escuro);
  font-weight: 700;
}

/* "Periodo especifico" no fim do menu Periodo (ajuste do cliente no canvas) */
.nfc-especifico {
  display: flex;
  flex-direction: column;
  gap: 8px;
  margin-top: 6px;
  padding: 10px 12px 6px;
  border-top: 1px solid var(--up-borda-suave);
}

.nfc-especifico-titulo {
  display: flex;
  align-items: center;
  gap: 6px;
  color: var(--up-marca-escura);
  font-size: 12.5px;
  font-weight: 700;
}

.nfc-especifico-titulo.on {
  color: var(--up-primaria-escuro);
}

.nfc-especifico-campos {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: 8px;
}

.nfc-especifico-campos label {
  display: flex;
  flex-direction: column;
  gap: 3px;
  color: var(--up-texto-suave);
  font-size: 11.5px;
}

.nfc-especifico-campos input {
  height: 30px;
  padding: 0 8px;
  border: 1px solid var(--up-borda);
  border-radius: 8px;
  background-color: var(--up-superficie);
  color: var(--up-texto);
  font: inherit;
  font-size: 13px;
}

.nfc-especifico-campos input:focus {
  border-color: var(--up-primaria);
  outline: 3px solid var(--up-primaria-claro);
}

.nfc-especifico-erro {
  margin: 0;
  color: var(--up-pendencia);
  font-size: 12px;
}

.nfc-especifico .nfc-botao {
  justify-content: center;
}

/* --- Lista + painel --- */
.nfc-conteudo {
  display: flex;
  flex: 1 1 auto;
  gap: 0.7rem;
  min-height: 0;
}

.nfc-lista,
.nfc-painel {
  display: flex;
  flex-direction: column;
  min-height: 0;
  border: 1px solid var(--up-borda);
  border-radius: 10px;
  background-color: var(--up-superficie);
  box-shadow: var(--up-sombra-cartao-leve);
  overflow: hidden;
}

.nfc-lista {
  flex: 1 1 auto;
  min-width: 0;
}

.nfc-painel {
  flex: 0 0 380px;
}

.nfc-linha {
  display: grid;
  grid-template-columns: 76px 88px minmax(0, 1fr) 130px 92px 170px;
  align-items: center;
  column-gap: 10px;
  width: 100%;
  height: 30px;
  padding: 0 10px;
  border: 0;
  border-bottom: 1px solid var(--up-borda-suave);
  background-color: var(--up-superficie);
  color: var(--up-texto);
  font: inherit;
  font-size: 12.5px;
  text-align: left;
  cursor: pointer;
}

.nfc-linha:hover {
  background-color: var(--up-primaria-fundo);
}

.nfc-linha.sel {
  background-color: var(--up-primaria-fundo);
  box-shadow: inset 3px 0 0 var(--up-primaria);
}

.nfc-linha:focus-visible {
  outline: 2px solid var(--up-primaria);
  outline-offset: -2px;
}

.nfc-linha > span {
  min-width: 0;
  overflow: hidden;
  white-space: nowrap;
  text-overflow: ellipsis;
}

.nfc-linha-cab {
  flex: none;
  color: var(--up-texto-suave);
  font-size: 10.5px;
  letter-spacing: 0.04em;
  text-transform: uppercase;
  cursor: default;
}

.nfc-linha-cab:hover {
  background-color: var(--up-superficie);
}

.nfc-num {
  text-align: right;
  font-variant-numeric: tabular-nums;
}

.nfc-forte {
  color: var(--up-marca-escura);
  font-weight: 700;
}

.nfc-suave {
  color: var(--up-texto-suave);
  font-variant-numeric: tabular-nums;
}

.nfc-cliente {
  display: flex;
  align-items: center;
  gap: 7px;
}

.nfc-av {
  display: inline-flex;
  flex: none;
  align-items: center;
  justify-content: center;
  width: 22px;
  height: 22px;
  border-radius: 50%;
  background-color: var(--up-pessoa-fisica-fundo);
  color: var(--up-pessoa-fisica);
  font-size: 9.5px;
  font-weight: 700;
}

.nfc-nome {
  overflow: hidden;
  color: var(--up-marca-escura);
  font-weight: 700;
  white-space: nowrap;
  text-overflow: ellipsis;
}

.nfc-pag {
  display: inline-block;
  max-width: 100%;
  overflow: hidden;
  padding: 0 8px;
  border-radius: 999px;
  background-color: var(--up-pilulas-fundo);
  color: var(--up-cinza-chumbo);
  font-size: 11px;
  font-weight: 700;
  line-height: 19px;
  vertical-align: middle;
  white-space: nowrap;
  text-overflow: ellipsis;
}

.nfc-pag.pix { background-color: var(--up-forma-pix-fundo); color: var(--up-forma-pix); }
.nfc-pag.dinheiro { background-color: var(--up-resolvida-fundo); color: var(--up-resolvida); }
.nfc-pag.credito { background-color: var(--up-tipo-pedido-fundo); color: var(--up-tipo-pedido); }
.nfc-pag.debito { background-color: var(--up-tipo-nfe-fundo); color: var(--up-tipo-nfe); }
.nfc-pag.misto { background-color: var(--up-tipo-nfce-fundo); color: var(--up-tipo-nfce); }

.nfc-situacao {
  display: flex;
  align-items: center;
  gap: 4px;
}

.nfc-rolagem {
  position: relative;
  flex: 1 1 auto;
  min-height: 0;
  overflow-y: auto;
}

.nfc-vazio {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 10px;
  padding: 48px 20px;
  color: var(--up-texto-suave);
  font-size: 12.5px;
  text-align: center;
}

.nfc-vazio[hidden] {
  display: none;
}

.nfc-vazio strong {
  color: var(--up-texto);
  font-size: 14px;
}

.nfc-lista-pe {
  display: flex;
  flex: none;
  align-items: center;
  gap: 14px;
  height: 30px;
  padding: 0 12px;
  border-top: 1px solid var(--up-borda-suave);
  background-color: var(--up-grade-rodape);
  color: var(--up-cinza-chumbo);
  font-size: 12px;
}

.nfc-lista-pe strong {
  color: var(--up-marca-escura);
}

.nfc-cortada {
  margin-left: auto;
  color: var(--up-intervencao);
}

/* --- Painel do cupom --- */
.nfc-painel-vazio {
  display: flex;
  flex: 1 1 auto;
  align-items: center;
  justify-content: center;
  margin: 0;
  padding: 20px;
  color: var(--up-texto-suave);
  font-size: 13px;
  text-align: center;
}

.nfc-painel-vazio[hidden],
.nfc-painel-conteudo[hidden] {
  display: none;
}

.nfc-painel-conteudo {
  display: flex;
  flex: 1 1 auto;
  flex-direction: column;
  min-height: 0;
}

.nfc-faixa {
  display: flex;
  flex: none;
  align-items: center;
  gap: 10px;
  padding: 10px 14px;
  background-color: var(--up-marca-escura);
  color: var(--up-superficie);
}

.nfc-faixa-icone {
  display: inline-flex;
  flex: none;
  align-items: center;
  justify-content: center;
  width: 34px;
  height: 34px;
  border-radius: 9px;
  background-color: var(--up-realce-sobre-escuro);
}

.nfc-faixa-titulo {
  flex: 1 1 auto;
  min-width: 0;
}

.nfc-faixa-titulo small {
  display: block;
  overflow: hidden;
  color: var(--up-texto-sobre-escuro-suave);
  font-size: 11px;
  white-space: nowrap;
  text-overflow: ellipsis;
}

.nfc-faixa-titulo h2 {
  margin: 0;
  color: inherit;
  font-size: 17px;
  font-weight: 800;
}

.nfc-faixa-dir {
  display: flex;
  flex-direction: column;
  align-items: flex-end;
  gap: 3px;
}

.nfc-faixa-dir strong {
  font-size: 14px;
  font-weight: 800;
}

.nfc-cupom {
  display: flex;
  flex: 1 1 auto;
  flex-direction: column;
  align-items: center;
  min-height: 0;
  padding: 14px;
  overflow-y: auto;
  background-color: var(--up-coluna-kanban);
}

/* a imagem tem 300 dpi (850 px nos 72 mm da bobina): mostrada na largura de
   uma bobina na tela, com a sombra de papel */
.nfc-cupom-imagem {
  display: block;
  width: 302px;
  max-width: 100%;
  height: auto;
  background-color: var(--up-superficie);
  box-shadow: var(--up-sombra-menu);
}

.nfc-cupom-imagem[hidden],
.nfc-cupom-aviso[hidden] {
  display: none;
}

.nfc-cupom-aviso {
  display: flex;
  flex-direction: column;
  gap: 8px;
  max-width: 280px;
  margin: 40px 0 0;
  color: var(--up-cinza-chumbo);
  font-size: 13px;
  text-align: center;
}

.nfc-cupom-aviso strong {
  color: var(--up-marca-escura);
  font-size: 14px;
}

.nfc-painel-pe {
  flex: none;
  padding: 10px 12px;
  border-top: 1px solid var(--up-borda-suave);
}

.nfc-reimprimir {
  justify-content: center;
  width: 100%;
  height: 36px;
  font-size: 13.5px;
}

/* tela estreita: o painel desce para baixo da lista */
@media (max-width: 1100px) {
  .nfc-conteudo {
    flex-direction: column;
  }

  .nfc-painel {
    flex: 1 1 420px;
  }

  .nfc-acoes {
    margin-left: 0;
  }
}

/* Cadastro de Impressoras: com a NFC-e sao 4 documentos -- dois por linha,
   em vez de tres e um sobrando sozinho embaixo */
.opcoes-documento:has(> :nth-child(4):last-child) {
  grid-template-columns: repeat(2, minmax(0, 1fr));
}

/* ===========================================================================
   Conta corrente > abas da cobranca do boleto (04/10/2026)
   conta_cobranca_abas.html + conta_cobranca_form.js. Mesmos cartoes da ficha;
   as listas (carteiras, acoes, parametros) sao a `.grade` com campos dentro.
   =========================================================================== */
#formContaCorrente > .cad-abas {
  margin-top: 0.65rem;
}

.cc-sub {
  margin: -0.25rem 0 0.65rem;
  font-size: 12.5px;
  color: var(--up-texto-suave);
}

.cc-aviso {
  margin: 0;
  padding: 7px 10px;
  border-radius: 8px;
  background-color: var(--up-intervencao-fundo);
  color: var(--up-texto);
  font-size: 13px;
}

.cc-aviso[hidden],
.cc-vazio[hidden] {
  display: none;
}

.cc-grade .grade td {
  padding: 3px 6px;
  vertical-align: middle;
}

.cc-grade .grade input[type="text"],
.cc-grade .grade select {
  width: 100%;
  height: 28px;
  padding: 0 7px;
  border: 1px solid var(--up-borda);
  border-radius: 7px;
  background-color: var(--up-superficie);
  font-size: 13px;
}

.cc-grade .grade input.cc-codigo {
  width: 4.5rem;
}

.cc-centro {
  text-align: center;
  width: 1%;
  white-space: nowrap;
}

.cc-info {
  font-size: 12px;
  color: var(--up-texto-suave);
}

.cc-tirar {
  width: 26px;
  height: 26px;
  border: 1px solid var(--up-borda);
  border-radius: 7px;
  background: var(--up-superficie);
  color: var(--up-texto-suave);
  font-size: 16px;
  line-height: 1;
  cursor: pointer;
}

.cc-tirar:hover {
  border-color: var(--up-acao-excluir);
  color: var(--up-acao-excluir);
}

.cc-vazio {
  margin: 0.5rem 0 0;
  font-size: 12.5px;
  color: var(--up-texto-suave);
}

.cc-incluir {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 0.5rem;
  margin-top: 0.65rem;
}

/* "Restaurar acoes prontas do banco" (05/10/2026): botao neutro no fim da
   linha, e a nota do que entrou logo abaixo */
.cc-prontas {
  margin-left: auto;
  border: 1px solid var(--up-borda);
  background-color: var(--up-superficie);
  color: var(--up-texto);
}

.cc-prontas:hover {
  border-color: var(--up-primaria-claro);
  color: var(--up-primaria-escuro);
}

.cc-prontas-nota {
  margin-top: 0.5rem;
  padding: 0.45rem 0.65rem;
  border-radius: 8px;
  background-color: var(--up-intervencao-fundo);
  color: var(--up-bb-vencido);
}

.cc-prontas-nota[hidden] {
  display: none;
}

.cc-sugestao {
  height: 30px;
  max-width: 340px;
  padding: 0 8px;
  border: 1px solid var(--up-borda);
  border-radius: 8px;
  background-color: var(--up-superficie);
  font-size: 13px;
}

/* Contas a Receber > Opcoes > Imprimir boleto (04/10/2026) -- boleto_imprimir.js */
.bol-form {
  padding: 0 1rem;
}

.bol-resumo {
  margin: 0.25rem 0 0.75rem;
  font-size: 13px;
  font-weight: 600;
  color: var(--up-texto);
}

.bol-aviso {
  margin: 0.6rem 0 0;
  padding: 7px 10px;
  border-radius: 8px;
  background-color: var(--up-intervencao-fundo);
  color: var(--up-texto);
  font-size: 12.5px;
}

.bol-aviso[hidden] {
  display: none;
}

/* --- Remessa de cobranca (04/10/2026, Modelo A do canvas) --------------------
   Financeiro > Cobranca > Remessa: abas em pilula (as .ent-abas da Expedicao),
   os titulos numa grade em cartao a esquerda e o painel da conta a direita --
   cartoes de conta com o logotipo do banco, os campos da cobranca, o resumo
   no azul escuro da marca com o Gerar remessa (verde, o "fazer" da casa) e,
   depois de gerar, o cartao com Baixar de novo / Boletos / Francesinha.
   Remessas geradas: a mesma grade, a linha abre os titulos da remessa. */

.rem-tela {
  display: flex;
  flex-direction: column;
  gap: 0.65rem;
  min-height: 0;
  font-family: var(--up-fonte);
  color: var(--up-texto);
}

.rem-cabecalho {
  display: flex;
  align-items: center;
  gap: 0.75rem;
}

.rem-aviso {
  display: flex;
  align-items: center;
  gap: 0.5rem;
  padding: 0.5rem 0.8rem;
  border-radius: 10px;
  background-color: var(--up-intervencao-fundo);
  color: var(--up-intervencao);
  font-size: 13px;
}

.rem-gerar {
  display: flex;
  flex-wrap: wrap;
  align-items: flex-start;
  gap: 0.75rem;
  min-height: 0;
}

.rem-gerar[hidden],
.rem-historico[hidden] {
  display: none;
}

.rem-lista,
.rem-historico {
  display: flex;
  flex: 999 1 620px;
  flex-direction: column;
  min-width: 0;
  border: 1px solid var(--up-borda-suave);
  border-radius: 12px;
  background-color: var(--up-superficie);
  box-shadow: var(--up-sombra-cartao-leve);
}

.rem-barra {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 0.5rem;
  padding: 0.6rem 0.75rem;
  border-bottom: 1px solid var(--up-borda-suave);
}

.rem-pesquisa {
  display: inline-flex;
  align-items: center;
  gap: 0.4rem;
  width: 240px;
  height: 30px;
  padding: 0 0.75rem;
  border: 1px solid var(--up-borda);
  border-radius: 999px;
  color: var(--up-texto-suave);
}

.rem-pesquisa input {
  width: 100%;
  border: 0;
  outline: 0;
  background: none;
  font: inherit;
  font-size: 13px;
  color: var(--up-texto);
}

.rem-pesquisa:focus-within {
  border-color: var(--up-primaria);
  box-shadow: 0 0 0 3px var(--up-primaria-fundo);
}

.rem-periodo {
  display: inline-flex;
  align-items: center;
  gap: 0.4rem;
  font-size: 12px;
  color: var(--up-texto-suave);
}

.rem-periodo select {
  height: 30px;
  padding: 0 0.5rem;
  border: 0;
  border-radius: 8px;
  background-color: var(--up-marca-escura);
  font: inherit;
  font-size: 13px;
  font-weight: 700;
  color: var(--up-superficie);
  cursor: pointer;
}

.rem-separador {
  width: 1px;
  height: 22px;
  background-color: var(--up-borda-suave);
}

.rem-chips {
  display: flex;
  flex-wrap: wrap;
  gap: 0.35rem;
}

.rem-chip {
  height: 28px;
  padding: 0 0.8rem;
  border: 1px solid var(--up-borda);
  border-radius: 999px;
  background-color: var(--up-superficie);
  font: inherit;
  font-size: 12.5px;
  color: var(--up-texto);
  cursor: pointer;
}

.rem-chip:hover {
  border-color: var(--up-primaria-claro);
}

.rem-chip.ativo {
  border-color: var(--up-primaria);
  background-color: var(--up-primaria-fundo);
  font-weight: 700;
  color: var(--up-primaria-escuro);
}

.rem-btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: 0.4rem;
  height: 30px;
  padding: 0 0.8rem;
  border: 1px solid var(--up-borda);
  border-radius: 8px;
  background-color: var(--up-superficie);
  font: inherit;
  font-size: 13px;
  color: var(--up-texto);
  cursor: pointer;
}

.rem-btn:hover:not(:disabled) {
  border-color: var(--up-primaria-claro);
  color: var(--up-primaria-escuro);
}

.rem-btn:disabled {
  opacity: 0.45;
  cursor: default;
}

.rem-btn-pri {
  border-color: var(--up-primaria);
  background-color: var(--up-primaria);
  font-weight: 700;
  color: #fff;
}

.rem-btn-pri:hover:not(:disabled) {
  background-color: var(--up-primaria-escuro);
  color: #fff;
}

.rem-btn-link {
  border-color: transparent;
  color: var(--up-primaria);
}

.rem-btn-mini {
  height: 26px;
  padding: 0 0.55rem;
  font-size: 12px;
}

.rem-atualizar {
  width: 30px;
  margin-left: auto;
  padding: 0;
}

.rem-grade-caixa {
  flex: 1;
  min-height: 0;
  max-height: calc(100vh - 290px);
  overflow: auto;
}

.rem-grade {
  width: 100%;
  border-collapse: collapse;
  font-size: 13px;
}

.rem-grade th {
  position: sticky;
  top: 0;
  z-index: 1;
  padding: 0.5rem 0.6rem;
  border-bottom: 1px solid var(--up-borda-suave);
  background-color: #f7f8fb;
  font-size: 11px;
  font-weight: 700;
  letter-spacing: 0.04em;
  text-align: left;
  text-transform: uppercase;
  color: var(--up-texto-suave);
  white-space: nowrap;
}

.rem-grade td {
  height: 28px;
  padding: 0.3rem 0.6rem;
  border-bottom: 1px solid #eef0f2;
  vertical-align: middle;
}

.rem-grade tbody tr:hover td {
  background-color: #f6f7fe;
}

.rem-grade tr.marcada td {
  background-color: var(--up-primaria-fundo);
}

.rem-col-marca {
  width: 30px;
}

.rem-num {
  text-align: right;
  font-variant-numeric: tabular-nums;
  white-space: nowrap;
}

.rem-doc {
  font-weight: 700;
  white-space: nowrap;
}

.rem-nn {
  font-variant-numeric: tabular-nums;
  white-space: nowrap;
}

.rem-cliente b,
.rem-cliente span {
  display: block;
}

.rem-cliente b {
  font-size: 12.5px;
}

.rem-cliente span,
.rem-suave {
  font-size: 11.5px;
  color: var(--up-texto-suave);
}

.rem-vencido {
  font-weight: 700;
  color: var(--up-acao-excluir);
}

.rem-etq {
  display: inline-block;
  padding: 1px 8px;
  border-radius: 999px;
  font-size: 11px;
  font-weight: 700;
  white-space: nowrap;
}

.rem-etq-enviar {
  background-color: var(--up-intervencao-fundo);
  color: #8a5f17;
}

.rem-etq-ok {
  background-color: var(--up-mod-financeiro-fundo);
  color: #2f6e33;
}

.rem-etq-bloq,
.rem-etq-uniplus {
  background-color: #eceff3;
  color: var(--up-cinza-chumbo);
}

.rem-etq-next {
  background-color: var(--up-tipo-pedido-fundo);
  color: var(--up-tipo-pedido);
}

.rem-vazio {
  margin: 0;
  padding: 1.5rem;
  text-align: center;
  font-size: 13px;
  color: var(--up-texto-suave);
}

.rem-vazio[hidden] {
  display: none;
}

.rem-rodape {
  display: flex;
  justify-content: space-between;
  gap: 0.75rem;
  padding: 0.5rem 0.75rem;
  border-top: 1px solid var(--up-borda-suave);
  font-size: 12.5px;
  color: var(--up-texto-suave);
}

.rem-rodape b {
  color: var(--up-primaria);
}

.rem-rodape-nota {
  justify-content: flex-start;
  font-size: 12px;
}

/* painel da direita: rola sozinho e o resumo com o Gerar fica sempre a
   vista no pe dele (em 1366x768 o botao ficava abaixo da dobra) */
.rem-painel {
  display: flex;
  flex: 1 1 330px;
  flex-direction: column;
  gap: 0.75rem;
  max-width: 390px;
  max-height: calc(100vh - 222px);
  overflow-y: auto;
  scrollbar-width: thin;
}

.rem-painel > .rem-resumo {
  position: sticky;
  bottom: 0;
  flex-shrink: 0;
}

.rem-painel > .rem-cartao {
  flex-shrink: 0;
}

.rem-cartao {
  display: flex;
  flex-direction: column;
  gap: 0.6rem;
  padding: 0.75rem;
  border: 1px solid var(--up-borda-suave);
  border-radius: 12px;
  background-color: var(--up-superficie);
  box-shadow: var(--up-sombra-cartao-leve);
}

.rem-cartao[hidden],
.rem-resumo[hidden] {
  display: none;
}

.rem-cartao-titulo {
  font-size: 11.5px;
  font-weight: 700;
  letter-spacing: 0.05em;
  text-transform: uppercase;
  color: var(--up-texto-suave);
}

.rem-contas {
  display: flex;
  flex-direction: column;
  gap: 0.45rem;
}

.rem-conta {
  display: flex;
  align-items: center;
  gap: 0.65rem;
  width: 100%;
  padding: 0.5rem 0.65rem;
  border: 1.5px solid var(--up-borda-suave);
  border-radius: 10px;
  background-color: var(--up-superficie);
  font: inherit;
  text-align: left;
  color: var(--up-texto);
  cursor: pointer;
}

.rem-conta:hover {
  border-color: var(--up-primaria-claro);
}

.rem-conta.ativa {
  border-color: var(--up-primaria);
  box-shadow: 0 0 0 3px var(--up-primaria-fundo);
}

.rem-conta-logo {
  display: flex;
  flex: 0 0 86px;
  align-items: center;
  height: 30px;
  font-size: 12px;
  font-weight: 700;
}

.rem-conta-logo img {
  max-width: 86px;
  max-height: 26px;
}

.rem-conta-texto {
  display: flex;
  flex-direction: column;
  gap: 1px;
  min-width: 0;
}

.rem-conta-texto b {
  font-size: 13px;
}

.rem-conta-texto span {
  overflow: hidden;
  font-size: 11.5px;
  color: var(--up-texto-suave);
  text-overflow: ellipsis;
  white-space: nowrap;
}

.rem-sem-contas,
.rem-aviso-layout {
  margin: 0;
  padding: 0.5rem 0.65rem;
  border-radius: 8px;
  background-color: var(--up-intervencao-fundo);
  font-size: 12.5px;
  color: #8a5f17;
}

.rem-sem-contas[hidden],
.rem-aviso-layout[hidden] {
  display: none;
}

.rem-campos {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: 0.5rem;
}

.rem-campo {
  display: flex;
  flex-direction: column;
  gap: 4px;
  font-size: 11.5px;
  color: var(--up-texto-suave);
}

.rem-campo[hidden] {
  display: none;
}

.rem-largo {
  grid-column: span 2;
}

.rem-campo select,
.rem-campo input {
  height: 30px;
  padding: 0 0.5rem;
  border: 1px solid var(--up-borda);
  border-radius: 8px;
  background-color: var(--up-superficie);
  font: inherit;
  font-size: 13px;
  color: var(--up-texto);
}

.rem-campo select:focus,
.rem-campo input:focus {
  border-color: var(--up-primaria);
  outline: 0;
  box-shadow: 0 0 0 3px var(--up-primaria-fundo);
}

/* o resumo: azul escuro da marca, como no canvas */
.rem-resumo {
  display: flex;
  flex-direction: column;
  gap: 0.6rem;
  padding: 0.9rem;
  border-radius: 12px;
  background-color: var(--up-marca-escura);
  color: var(--up-superficie);
}

.rem-resumo-topo {
  display: flex;
  justify-content: space-between;
  gap: 0.5rem;
  font-size: 12px;
  opacity: 0.8;
}

.rem-resumo-numero {
  display: flex;
  align-items: baseline;
  gap: 0.6rem;
  font-size: 14px;
}

.rem-resumo-numero > b {
  font-size: 30px;
}

.rem-resumo-dados,
.rem-gerado-dados {
  display: grid;
  grid-template-columns: auto 1fr;
  gap: 3px 12px;
  margin: 0;
  font-size: 12.5px;
}

.rem-resumo-dados dt {
  opacity: 0.75;
}

.rem-resumo-dados dd,
.rem-gerado-dados dd {
  margin: 0;
  font-weight: 700;
}

.rem-resumo-imprimir {
  display: flex;
  align-items: center;
  gap: 0.5rem;
  font-size: 12.5px;
}

.rem-gerar-btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: 0.45rem;
  height: 40px;
  border: 0;
  border-radius: 8px;
  background-color: var(--up-acao-incluir);
  font: inherit;
  font-size: 14px;
  font-weight: 700;
  color: #fff;
  cursor: pointer;
}

.rem-gerar-btn:hover:not(:disabled) {
  background-color: var(--up-acao-incluir-escuro);
}

.rem-gerar-btn:disabled {
  opacity: 0.45;
  cursor: default;
}

.rem-gerar-btn.processando {
  cursor: progress;
}

/* depois de gerar */
.rem-gerado-topo {
  display: flex;
  align-items: center;
  gap: 0.65rem;
}

.rem-gerado-ok {
  display: inline-flex;
  flex: 0 0 36px;
  align-items: center;
  justify-content: center;
  height: 36px;
  border-radius: 999px;
  background-color: var(--up-mod-financeiro-fundo);
  color: var(--up-mod-financeiro);
}

.rem-gerado-titulo {
  font-size: 16px;
  font-weight: 700;
  color: var(--up-marca-escura);
}

.rem-gerado-sub {
  font-size: 12.5px;
  color: var(--up-texto-suave);
}

.rem-gerado-dados {
  padding: 0.6rem;
  border: 1px dashed var(--up-borda);
  border-radius: 10px;
}

.rem-gerado-dados dt {
  color: var(--up-texto-suave);
}

.rem-gerado-acoes {
  display: flex;
  flex-direction: column;
  gap: 0.4rem;
}

/* remessas geradas */
.rem-historico {
  flex: 1 1 auto;
}

.rem-linha-hist {
  cursor: pointer;
}

.rem-col-seta {
  width: 18px;
  color: var(--up-texto-suave);
}

.rem-arquivo {
  font-family: Consolas, ui-monospace, monospace;
  font-size: 12px;
}

.rem-acoes-col {
  text-align: right;
  white-space: nowrap;
}

.rem-acoes-col .rem-btn + .rem-btn {
  margin-left: 0.3rem;
}

.rem-linha-docs td {
  background-color: #f7f8fb;
}

.rem-docs {
  display: flex;
  flex-direction: column;
  gap: 4px;
  padding: 0.25rem 0;
}

.rem-doc-linha {
  display: flex;
  align-items: center;
  gap: 0.9rem;
  font-size: 12.5px;
}

.rem-doc-linha b:first-child {
  flex: 0 0 80px;
}

.rem-doc-cliente {
  flex: 1;
  min-width: 0;
}

.rem-doc-linha .rem-num {
  flex: 0 0 100px;
}

.rem-carregando {
  font-size: 12.5px;
  color: var(--up-texto-suave);
}

@media (max-width: 900px) {
  .rem-painel {
    max-width: none;
    max-height: none;
    overflow: visible;
  }

  .rem-grade-caixa {
    max-height: none;
  }
}

/* --- Retorno de cobranca (04/10/2026, Modelo C do canvas) --------------------
   Financeiro > Cobranca > Retorno: reaproveita as .rem-* da Remessa (abas,
   barra, chips, grade, historico). Proprio daqui: o "Importar retornos" no
   verde do Incluir, a pilula "N arquivos" com os logotipos que abre a lista
   fina dos arquivos (lixeirinha logo depois do nome), as linhas de grupo
   claras e recolhiveis por arquivo, as etiquetas por acao e a barra de baixa
   no azul escuro da marca, na largura toda. */

.ret-arquivos {
  display: flex;
  flex-direction: column;
  gap: 0.65rem;
  min-height: 0;
}

.ret-arquivos[hidden] {
  display: none;
}

.ret-lista {
  flex: 1 1 auto;
}

.ret-importar {
  display: inline-flex;
  align-items: center;
  gap: 0.4rem;
  height: 30px;
  padding: 0 0.9rem;
  border: 1px solid var(--up-acao-incluir-escuro);
  border-radius: 8px;
  background-color: var(--up-acao-incluir);
  font: inherit;
  font-size: 12.5px;
  font-weight: 700;
  color: #fff;
  cursor: pointer;
}

.ret-importar:hover:not(:disabled) {
  background-color: var(--up-acao-incluir-escuro);
}

.ret-importar:disabled {
  opacity: 0.45;
  cursor: default;
}

.ret-importar.processando {
  cursor: progress;
}

.ret-pilula {
  display: inline-flex;
  align-items: center;
  gap: 0.35rem;
  height: 28px;
  padding: 0 0.65rem 0 0.4rem;
  border: 1px solid var(--up-borda);
  border-radius: 999px;
  background-color: var(--up-superficie);
  font: inherit;
  font-size: 12px;
  color: var(--up-texto);
  cursor: pointer;
}

.ret-pilula:hover:not(:disabled),
.ret-pilula.ativa {
  border-color: var(--up-primaria);
}

.ret-pilula.ativa {
  background-color: var(--up-primaria-fundo);
  color: var(--up-primaria-escuro);
}

.ret-pilula:disabled {
  cursor: default;
}

.ret-pilula-logos {
  display: inline-flex;
  gap: 3px;
}

.ret-pilula-logo {
  display: inline-flex;
  width: 18px;
  height: 14px;
  overflow: hidden;
  border-radius: 3px;
  font-size: 8px;
}

.ret-pilula-logo img {
  width: 18px;
  height: 14px;
  object-fit: cover;
  object-position: left;
}

.ret-pilula-seta {
  display: inline-flex;
  transition: transform 0.15s;
}

.ret-pilula.ativa .ret-pilula-seta {
  transform: rotate(180deg);
}

.ret-mostrar {
  margin-right: 2px;
  font-size: 12px;
  color: var(--up-texto-suave);
}

/* a lista fina dos arquivos, que abre na pilula */
.ret-lista-arquivos {
  display: flex;
  flex-direction: column;
  padding: 0.25rem 0.75rem;
  border-bottom: 1px solid var(--up-borda-suave);
  background-color: #f7f8fb;
}

.ret-lista-arquivos[hidden] {
  display: none;
}

.ret-arq-linha {
  display: flex;
  align-items: center;
  gap: 0.6rem;
  height: 28px;
  font-size: 12px;
  color: var(--up-texto-suave);
}

.ret-arq-logo {
  display: inline-flex;
  flex: 0 0 44px;
  align-items: center;
  font-size: 10px;
  font-weight: 700;
}

.ret-arq-logo img {
  max-width: 44px;
  max-height: 14px;
  object-fit: contain;
}

.ret-arq-nome {
  font-family: Consolas, ui-monospace, monospace;
  color: var(--up-marca-escura);
}

.ret-lixeira {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 24px;
  height: 24px;
  margin-left: -0.35rem;
  border: 0;
  border-radius: 6px;
  background: transparent;
  color: var(--up-texto-suave);
  cursor: pointer;
}

.ret-lixeira:hover {
  background-color: #fdecea;
  color: var(--up-acao-excluir);
}

.ret-arq-conta {
  min-width: 120px;
  margin-left: 0.4rem;
}

.ret-arq-resumo b {
  color: var(--up-texto);
}

/* grade agrupada por arquivo */
.ret-grade-caixa {
  max-height: calc(100vh - 300px);
}

.ret-grade .ret-grupo-linha td {
  height: 24px;
  padding: 2px 6px;
  background-color: #f3f4fa;
}

.ret-grade tbody tr.ret-grupo-linha:hover td {
  background-color: #f3f4fa;
}

.ret-grupo {
  display: inline-flex;
  align-items: center;
  gap: 0.4rem;
  height: 22px;
  padding: 0 4px;
  border: 0;
  border-radius: 6px;
  background: transparent;
  font: inherit;
  font-size: 12px;
  color: var(--up-texto-suave);
  cursor: pointer;
}

.ret-grupo:hover {
  background-color: #e6e8f3;
}

.ret-grupo b {
  color: var(--up-marca-escura);
}

.ret-grupo-seta {
  display: inline-block;
  font-size: 11px;
  transition: transform 0.15s;
}

.ret-grupo.aberto .ret-grupo-seta {
  transform: rotate(90deg);
}

.ret-grupo-arquivo {
  font-family: Consolas, ui-monospace, monospace;
}

.ret-oc {
  white-space: nowrap;
}

.ret-encargos {
  color: #8a5f17;
}

.ret-pago {
  font-weight: 700;
}

.ret-grade tr.ret-linha-quitado td {
  color: var(--up-texto-suave);
}

.ret-grade tr.ret-linha-vincular td {
  background-color: #fffaf0;
}

/* etiquetas por acao: baixa verde, escolher amarelo, ja baixado cinza,
   so registrar azul, erro vermelho */
.ret-etq-baixa {
  background-color: var(--up-mod-financeiro-fundo);
  color: #2f6e33;
}

.ret-etq-vincular {
  background-color: #fff1d6;
  color: #7a5210;
}

.ret-etq-quitado {
  background-color: #eceff3;
  color: var(--up-cinza-chumbo);
}

.ret-etq-info {
  background-color: var(--up-tipo-pedido-fundo);
  color: #0050a0;
}

.ret-etq-erro {
  background-color: #fdecea;
  color: #b3261e;
}

.ret-sel {
  max-width: 260px;
  height: 26px;
  padding: 0 6px;
  border: 1px solid #e0b25c;
  border-radius: 6px;
  background-color: #fffaf0;
  font: inherit;
  font-size: 12px;
  color: #7a5210;
}

/* a barra de baixa: azul escuro da marca, na largura toda */
.ret-barra {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 0.5rem 1.1rem;
  padding: 0.6rem 0.9rem;
  border-radius: 12px;
  background-color: var(--up-marca-escura);
  color: #fff;
}

.ret-barra[hidden] {
  display: none;
}

.ret-barra-numero {
  display: flex;
  align-items: baseline;
  gap: 0.5rem;
  font-size: 13.5px;
}

.ret-barra-numero > b {
  font-size: 26px;
}

.ret-barra-contas {
  display: contents;
}

.ret-barra-info {
  font-size: 12.5px;
  opacity: 0.85;
}

.ret-barra-francesinha {
  display: flex;
  align-items: center;
  gap: 0.4rem;
  margin-left: auto;
  font-size: 12.5px;
}

.ret-gravar {
  display: inline-flex;
  align-items: center;
  gap: 0.45rem;
  height: 36px;
  padding: 0 1rem;
  border: 0;
  border-radius: 8px;
  background-color: var(--up-acao-incluir);
  font: inherit;
  font-size: 14px;
  font-weight: 700;
  color: #fff;
  cursor: pointer;
}

.ret-gravar:hover:not(:disabled) {
  background-color: var(--up-acao-incluir-escuro);
}

.ret-gravar:disabled {
  opacity: 0.45;
  cursor: default;
}

.ret-gravar.processando {
  cursor: progress;
}

.ret-gravado-ok {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 28px;
  height: 28px;
  border-radius: 999px;
  background-color: var(--up-acao-incluir);
  color: #0f2a11;
}

.ret-gravado-texto {
  font-size: 14px;
}

.ret-gravado .rem-btn:first-of-type {
  margin-left: auto;
}

.ret-gravado a.rem-btn {
  text-decoration: none;
}

.ret-btn-escuro {
  border-color: #3a4170;
  background-color: transparent;
  color: #fff;
}

.ret-oc-linha .ret-oc-desc {
  flex: 0 0 180px;
}

@media (max-width: 900px) {
  .ret-grade-caixa {
    max-height: none;
  }

  .ret-barra-francesinha {
    margin-left: 0;
  }
}

/* --- Boletos no banco (05/10/2026, Modelo B do canvas) ------------------------
   Financeiro > Cobranca > Boletos no banco: titulo da tela com as contas em
   pilula, a grade (as .rem-* da Remessa) com os filtros por situacao no
   banco, o historico do boleto focado numa coluna a direita e a barra escura
   do Retorno (.ret-barra) com as instrucoes e o Gerar instrucao. */

.bb-cabecalho {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 0.75rem;
}

.bb-marca {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 34px;
  height: 34px;
  border-radius: 9px;
  background-color: var(--up-marca-escura);
  color: #fff;
}

.bb-titulo h1 {
  margin: 0;
  font-size: 18px;
  font-weight: 700;
  color: var(--up-marca-escura);
}

.bb-titulo p {
  margin: 0;
  font-size: 12px;
  color: var(--up-texto-suave);
}

.bb-contas {
  margin-left: auto;
}

.rem-chip.bb-chip-conta,
.rem-chip.bb-filtro {
  display: inline-flex;
  align-items: center;
  gap: 0.4rem;
}

.bb-chip-logo,
.bb-logo {
  display: inline-flex;
  align-items: center;
  font-size: 11px;
  color: var(--up-texto-suave);
}

.bb-chip-logo img {
  max-width: 46px;
  height: 13px;
  object-fit: contain;
}

.bb-logo img {
  max-width: 44px;
  height: 12px;
  object-fit: contain;
}

/* a cadeia de altura: .painel.painel-coluna (nao rola) -> .bb-tela -> o
   corpo fica com o que sobra entre o titulo e a barra escura -> a grade e o
   historico rolam por dentro (a barra nunca cobre a ultima linha) */
.bb-tela {
  flex: 1 1 auto;
}

.bb-tela > .bb-cabecalho,
.bb-tela > .rem-aviso,
.bb-tela > .bb-barra {
  flex-shrink: 0;
}

.bb-corpo {
  display: flex;
  flex: 1 1 auto;
  align-items: stretch;
  gap: 0.75rem;
  min-height: 0;
}

.bb-lista {
  flex: 999 1 640px;
  min-height: 0;
}

.bb-pesquisa {
  margin-left: auto;
}

.bb-atualizar {
  width: 30px;
  padding: 0;
}

.bb-grade-caixa {
  max-height: none;
}

.bb-grade td {
  cursor: pointer;
}

.bb-grade tr.bb-focada td {
  background-color: var(--up-primaria-fundo);
}

.bb-grade tr.bb-focada td:first-child {
  box-shadow: inset 3px 0 0 var(--up-primaria);
}

/* texto longo corta com reticencias numa linha (o title mostra inteiro);
   o max-width vai num span: na <td> a tabela automatica ignora */
.bb-corta {
  display: block;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.bb-doc {
  max-width: 110px;
}

.bb-cliente {
  max-width: 200px;
}

.bb-ultima {
  max-width: 150px;
  font-size: 12px;
  color: var(--up-cinza-chumbo);
}

.bb-qtd {
  display: inline-block;
  min-width: 20px;
  padding: 0 6px;
  border-radius: 999px;
  background-color: var(--up-pilulas-fundo);
  font-size: 11px;
  font-weight: 700;
  line-height: 18px;
  text-align: center;
}

.bb-qtd-todos { background-color: var(--up-marca-escura); color: #fff; }
.bb-qtd-cobranca { background-color: var(--up-bb-cobranca-fundo); color: var(--up-bb-cobranca); }
.bb-qtd-vencido { background-color: var(--up-bb-vencido-fundo); color: var(--up-bb-vencido); }
.bb-qtd-baixado_next { background-color: var(--up-bb-baixado-fundo); color: var(--up-bb-baixado); }
.bb-qtd-baixa_pedida { background-color: var(--up-bb-pedida-fundo); color: var(--up-bb-pedida); }
.bb-qtd-rejeitado { background-color: var(--up-bb-rejeitado-fundo); color: var(--up-bb-rejeitado); }

.bb-etq {
  display: inline-block;
  padding: 1px 8px;
  border-radius: 999px;
  font-size: 11px;
  font-weight: 700;
  line-height: 17px;
  white-space: nowrap;
}

.bb-sit-cobranca { background-color: var(--up-bb-cobranca-fundo); color: var(--up-bb-cobranca); }
.bb-sit-vencido { background-color: var(--up-bb-vencido-fundo); color: var(--up-bb-vencido); }
.bb-sit-baixado_next { background-color: var(--up-bb-baixado-fundo); color: var(--up-bb-baixado); }
.bb-sit-baixa_pedida { background-color: var(--up-bb-pedida-fundo); color: var(--up-bb-pedida); }
.bb-sit-rejeitado,
.bb-sit-fora { background-color: var(--up-bb-rejeitado-fundo); color: var(--up-bb-rejeitado); }

/* coluna do historico */
.bb-lado {
  display: flex;
  flex: 1 1 300px;
  flex-direction: column;
  gap: 0.6rem;
  max-width: 360px;
  min-height: 0;
  padding: 0.85rem;
  overflow-y: auto;
  border: 1px solid var(--up-borda-suave);
  border-radius: 12px;
  background-color: var(--up-superficie);
  box-shadow: var(--up-sombra-cartao-leve);
  scrollbar-width: thin;
}

.bb-lado-vazio {
  margin: 0;
  font-size: 12.5px;
  color: var(--up-texto-suave);
}

.bb-lado-vazio[hidden],
.bb-foco[hidden] {
  display: none;
}

.bb-foco {
  display: flex;
  flex: 1;
  flex-direction: column;
  gap: 0.7rem;
}

.bb-foco-topo {
  display: flex;
  flex-wrap: wrap;
  justify-content: space-between;
  align-items: flex-start;
  gap: 0.35rem 0.5rem;
}

.bb-foco-topo > div {
  flex: 1 1 150px;
}

.bb-foco-doc {
  font-size: 16px;
  font-weight: 700;
  color: var(--up-marca-escura);
}

.bb-foco-cli {
  font-size: 12.5px;
  color: var(--up-texto-suave);
}

.bb-ficha {
  display: grid;
  grid-template-columns: auto 1fr;
  gap: 3px 12px;
  margin: 0;
  padding: 0.5rem 0.6rem;
  border: 1px dashed var(--up-borda);
  border-radius: 10px;
  font-size: 12.5px;
}

.bb-ficha dt {
  font-weight: 400;
  color: var(--up-texto-suave);
}

.bb-ficha dd {
  margin: 0;
  font-weight: 700;
}

.bb-ficha dd .bb-logo {
  margin-right: 4px;
  vertical-align: -1px;
}

.bb-eventos {
  display: flex;
  flex-direction: column;
  margin: 0;
  padding: 0;
  list-style: none;
}

.bb-evento {
  position: relative;
  display: flex;
  gap: 10px;
  padding-bottom: 12px;
}

/* o fio que liga um ponto ao proximo */
.bb-evento:not(:last-child)::before {
  content: "";
  position: absolute;
  top: 15px;
  bottom: 0;
  left: 5px;
  width: 2px;
  background-color: var(--up-borda-suave);
}

.bb-ponto {
  flex: 0 0 12px;
  width: 12px;
  height: 12px;
  margin-top: 3px;
  border-radius: 999px;
  background-color: var(--up-primaria);
}

.bb-ev-banco .bb-ponto { background-color: var(--up-bb-cobranca); }
.bb-ev-pago .bb-ponto { background-color: var(--up-resolvida); }
.bb-ev-recusa .bb-ponto,
.bb-ev-baixa .bb-ponto { background-color: var(--up-bb-baixado); }
.bb-ev-prorrogado .bb-ponto { background-color: var(--up-bb-vencido); }
.bb-ev-falta .bb-ponto { background-color: var(--up-intervencao); }
.bb-ev-espera .bb-ponto,
.bb-ev-fim .bb-ponto { background-color: var(--up-borda); }

.bb-evento-texto {
  display: flex;
  flex-direction: column;
  gap: 1px;
}

.bb-evento-texto b {
  font-size: 12.5px;
}

.bb-evento-texto span,
.bb-evento-carregando {
  font-size: 11.5px;
  color: var(--up-texto-suave);
}

.bb-limpar {
  margin-top: auto;
}

/* barra escura */
.bb-barra-sep {
  width: 1px;
  height: 24px;
  background-color: var(--up-divisor-sobre-escuro);
}

.bb-acoes {
  display: flex;
  flex-wrap: wrap;
  gap: 0.4rem;
}

.bb-acao {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  height: 34px;
  padding: 0 12px;
  border: 1px solid #3a4170;
  border-radius: 8px;
  background-color: transparent;
  font: inherit;
  font-size: 13px;
  color: #fff;
  cursor: pointer;
}

.bb-acao:hover:not(:disabled) {
  background-color: var(--up-realce-sobre-escuro);
}

.bb-acao.ativa {
  border-color: var(--up-acao-incluir);
  background-color: var(--up-acao-incluir);
  font-weight: 700;
}

.bb-acao:disabled {
  opacity: 0.5;
  cursor: default;
}

.bb-cod {
  padding: 0 5px;
  border-radius: 4px;
  background-color: var(--up-realce-sobre-escuro);
  font-family: Consolas, monospace;
  font-size: 10.5px;
}

/* o resumo estica e quebra por dentro: a barra fica numa linha so */
.bb-resumo {
  flex: 1 1 200px;
  min-width: 0;
  font-size: 12.5px;
  text-align: right;
  opacity: 0.85;
}

.bb-resumo-alerta {
  color: var(--up-atencao-sobre-escuro);
  opacity: 1;
}

/* janela de prorrogar */
.bb-prorrogar {
  display: flex;
  flex-direction: column;
  gap: 0.75rem;
  padding: 0.25rem 1rem 0;
}

.bb-info {
  margin: 0;
  padding: 0.55rem 0.7rem;
  border-radius: 10px;
  background-color: var(--up-bb-cobranca-fundo);
  font-size: 12.5px;
  color: var(--up-bb-cobranca);
}

.bb-prorrogar-campos {
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr));
  gap: 0.6rem;
}

.bb-largo {
  grid-column: 1 / -1;
}

.bb-prorrogar .rem-campo input:disabled {
  background-color: var(--up-cinza-frio);
  color: var(--up-texto-suave);
}

.bb-nota {
  margin: 0;
  font-size: 12px;
  color: var(--up-texto-suave);
}

@media (max-width: 900px) {
  .bb-contas,
  .bb-pesquisa {
    margin-left: 0;
  }

  .bb-corpo {
    flex-wrap: wrap;
    overflow-y: auto;
  }

  .bb-resumo {
    text-align: left;
  }

  .bb-lado {
    max-width: none;
  }

  .bb-grade-caixa {
    max-height: none;
  }

  .bb-prorrogar-campos {
    grid-template-columns: 1fr;
  }
}

/* Depois da baixa no Contas a Receber: "Este titulo tem boleto no banco"
   (partials/boleto_pos_baixa.html). Mesma casca centralizada dos dialogos de
   retorno, com o "?" no azul da casa e o OK verde depois de gerar. */
.bpb-dialogo {
  width: min(520px, calc(100vw - 32px));
  padding: 22px 24px;
  border: 0;
  border-radius: 14px;
  text-align: center;
}

.bpb-pergunta,
.bpb-feito {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 0.75rem;
}

.bpb-pergunta[hidden],
.bpb-feito[hidden] {
  display: none;
}

.bpb-icone {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 46px;
  height: 46px;
  border: 2.5px solid var(--up-primaria);
  border-radius: 999px;
  font-size: 24px;
  font-weight: 700;
  color: var(--up-primaria);
}

.bpb-icone-ok {
  border: 0;
  background-color: var(--up-resolvida-fundo);
  color: var(--up-resolvida);
}

.bpb-titulo {
  margin: 0;
  font-size: 19px;
  font-weight: 700;
  color: var(--up-marca-escura);
}

.bpb-texto {
  margin: 0;
  font-size: 13.5px;
  line-height: 1.45;
  color: var(--up-cinza-chumbo);
}

.bpb-ficha {
  display: grid;
  grid-template-columns: auto 1fr;
  gap: 3px 12px;
  width: 100%;
  margin: 0;
  padding: 8px 10px;
  border-radius: 8px;
  background-color: #f7f8fb;
  font-size: 12.5px;
  text-align: left;
}

.bpb-ficha dt {
  font-weight: 400;
  color: var(--up-texto-suave);
}

.bpb-ficha dd {
  margin: 0;
  font-weight: 700;
}

.bpb-botoes {
  display: flex;
  gap: 10px;
  margin-top: 4px;
}

.bpb-btn {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  min-width: 7rem;
  height: 34px;
  padding: 0 14px;
  border: 0;
  border-radius: 8px;
  font: inherit;
  font-size: 13px;
  font-weight: 700;
  text-transform: uppercase;
  color: #fff;
  cursor: pointer;
}

.bpb-nao { background-color: #93a3b5; }
.bpb-sim { background-color: var(--up-acao-incluir); }
.bpb-sim:hover:not(:disabled) { background-color: var(--up-acao-incluir-escuro); }
.bpb-ok { justify-content: center; background-color: var(--up-primaria); }

.bpb-btn:disabled {
  opacity: 0.5;
  cursor: default;
}

.bpb-rodape {
  font-size: 11.5px;
  color: var(--up-texto-suave);
}

/* --- Painel Admin > Caixa de saida (05/10/2026) ------------------------------
   As caixas de e-mail que o Next usa para enviar. Tres colunas: a lista das
   caixas (cartoes), a ficha (cartoes .fin-cartao como as fichas do
   Financeiro) e o cartao do teste, que acende as etapas da conversa com o
   servidor e termina num resultado grande: verde com o visto que se desenha,
   ou vermelho com o motivo e o que conferir. */

/* Tela FIXA (05/10/2026, pedido do cliente: "nao preciso ficar rolando"):
   eram tres colunas soltas que rolavam juntas -- a ficha empilhava 4 cartoes
   (603px) e, em 1280px, o teste caia para baixo dela. Agora sao a lista e a
   ficha em duas colunas de cartoes, todas com a altura do corpo; so rolam,
   por dentro, a lista das caixas e o resultado do teste. Medido em 1366x657
   (notebook com o navegador): sobram ~380px e a coluna mais alta usa ~330.

   Fluxo em duas etapas (05/10/2026, pedido do cliente): a lista deixou de
   ficar ao lado da ficha. A tela abre na LISTAGEM (cartoes em grade, com o
   "Cadastrar nova"); abrir uma caixa ou cadastrar troca para a FICHA, que
   ganha a largura toda. Gravar/Excluir/Cancelar voltam a listagem. */
.admin-corpo-rolavel.cx-corpo {
  display: grid;
  grid-template-columns: minmax(0, 1fr);
  grid-template-rows: minmax(0, 1fr);
  padding: 0.25rem 0.1rem 0.5rem;
}

/* as duas vistas tem display proprio: o [hidden] precisa da regra dele */
.cx-lista[hidden],
.cx-ficha[hidden],
.cx-rodape[hidden],
.cx-cartoes[hidden] {
  display: none;
}

.cx-lista {
  display: flex;
  flex-direction: column;
  gap: 0.75rem;
  min-height: 0;
}

/* o Cadastrar nova em cima, a esquerda; o titulo e a contagem embaixo dele */
.cx-lista-topo {
  display: flex;
  flex-shrink: 0;
  flex-direction: column;
  align-items: flex-start;
  gap: 1rem;
  padding-top: 0.15rem;
}

.cx-lista-cab {
  display: flex;
  align-items: baseline;
  gap: 0.6rem;
}

.cx-lista-titulo {
  margin: 0;
  font-size: 15px;
  font-weight: 700;
  color: var(--up-marca-escura);
}

.cx-lista-conta {
  font-size: 12.5px;
  color: var(--up-texto-suave);
}

#cxCadastrar[hidden] {
  display: none;
}

/* muitas caixas: a grade de cartoes rola sozinha, a tela nao */
.cx-cartoes {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));
  align-content: start;
  gap: 0.75rem;
  min-height: 0;
  margin: 0;
  padding: 2px 4px 4px 2px;
  list-style: none;
  overflow-y: auto;
}

.cx-cartao-caixa {
  display: flex;
  flex-direction: column;
  gap: 0.4rem;
  width: 100%;
  height: 100%;
  padding: 0.8rem 0.95rem 0.7rem;
  border: 1px solid var(--up-borda);
  border-radius: 12px;
  background-color: var(--up-superficie);
  box-shadow: var(--up-sombra-cartao-leve);
  font: inherit;
  text-align: left;
  color: var(--up-texto);
  cursor: pointer;
  transition: border-color 0.15s, box-shadow 0.15s, transform 0.15s;
}

.cx-cartao-caixa:hover,
.cx-cartao-caixa:focus-visible {
  border-color: var(--up-primaria-claro);
  box-shadow: var(--up-sombra-menu);
  transform: translateY(-1px);
}

.cx-cartao-caixa.inativa {
  opacity: 0.7;
}

/* a caixa que acabou de ser gravada: o anel da marca acende e apaga */
.cx-cartao-caixa.recem {
  animation: cx-recem 2.4s ease-out;
}

@keyframes cx-recem {
  0%, 35% { border-color: var(--up-primaria); box-shadow: 0 0 0 3px var(--up-primaria-fundo), var(--up-sombra-menu); }
  100% { border-color: var(--up-borda); box-shadow: var(--up-sombra-cartao-leve); }
}

.cx-cc-cab {
  display: flex;
  align-items: center;
  gap: 0.65rem;
  min-width: 0;
}

.cx-cc-icone {
  display: inline-flex;
  flex: none;
  align-items: center;
  justify-content: center;
  width: 34px;
  height: 34px;
  border-radius: 10px;
  background-color: var(--up-primaria-fundo);
  color: var(--up-primaria);
}

.cx-cc-nomes {
  display: flex;
  flex-direction: column;
  min-width: 0;
}

.cx-cc-topo {
  display: flex;
  align-items: center;
  gap: 0.4rem;
  min-width: 0;
  font-size: 14px;
  color: var(--up-marca-escura);
}

.cx-cc-topo b {
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.cx-cc-pe {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 0.5rem;
  margin-top: auto;
  padding-top: 0.45rem;
  border-top: 1px solid var(--up-borda-suave);
}

.cx-cc-abrir {
  display: inline-flex;
  flex: none;
  align-items: center;
  gap: 0.3rem;
  font-size: 12px;
  font-weight: 700;
  color: var(--up-primaria);
}

.cx-cc-linha {
  overflow: hidden;
  font-size: 12px;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.cx-cc-suave {
  color: var(--up-texto-suave);
}

.cx-cc-teste {
  font-size: 11.5px;
  font-weight: 700;
  color: var(--up-texto-suave);
}

.cx-cc-teste.ok {
  color: var(--up-resolvida);
}

.cx-cc-teste.falha {
  color: var(--up-restrito);
}

.cx-selo {
  display: inline-block;
  padding: 1px 8px;
  border-radius: 999px;
  font-size: 10.5px;
  font-weight: 700;
  line-height: 17px;
  white-space: nowrap;
}

.cx-selo[hidden] {
  display: none;
}

.cx-selo-padrao {
  background-color: var(--up-tipo-pedido-fundo);
  color: var(--up-tipo-pedido);
}

.cx-selo-inativa {
  background-color: #eceff3;
  color: var(--up-cinza-chumbo);
}

/* nenhuma caixa: o caminho inteiro (1-2-3) e o botao no meio da tela */
.cx-lista-vazia {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 0.6rem;
  max-width: 34rem;
  margin: 1.5rem auto 0;
  padding: 1.6rem 1.8rem;
  border: 1px dashed var(--up-borda);
  border-radius: 14px;
  background-color: var(--up-superficie);
  text-align: center;
}

.cx-lista-vazia[hidden] {
  display: none;
}

.cx-vazia-icone {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 58px;
  height: 58px;
  border-radius: 16px;
  background-color: var(--up-primaria-fundo);
  color: var(--up-primaria);
}

.cx-lista-vazia h3 {
  margin: 0;
  font-size: 16px;
  font-weight: 700;
  color: var(--up-marca-escura);
}

.cx-lista-vazia p {
  margin: 0;
  font-size: 13px;
  color: var(--up-texto-suave);
}

.cx-passos {
  display: flex;
  flex-direction: column;
  gap: 0.4rem;
  margin: 0.3rem 0 0.4rem;
  padding: 0;
  list-style: none;
  font-size: 13px;
  text-align: left;
  color: var(--up-texto);
}

.cx-passos li {
  display: flex;
  align-items: center;
  gap: 0.55rem;
}

.cx-passos b {
  display: inline-flex;
  flex: none;
  align-items: center;
  justify-content: center;
  width: 22px;
  height: 22px;
  border-radius: 999px;
  background-color: var(--up-marca-escura);
  font-size: 11.5px;
  color: #fff;
}

.cx-passos em {
  font-style: normal;
  font-weight: 700;
}

/* ficha: duas colunas de cartoes; em janela estreita, uma so (e ai o corpo
   volta a rolar, em vez de espremer os campos) */
.cx-ficha {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: 0.75rem;
  min-width: 0;
  min-height: 0;
}

.cx-col {
  display: flex;
  flex-direction: column;
  gap: 0.6rem;
  min-width: 0;
  min-height: 0;
}

.cx-col > .fin-cartao.cx-cartao {
  flex-shrink: 0;
  padding: 0.6rem 0.85rem 0.7rem;
}

@media (max-width: 1099.98px) {
  .admin-corpo-rolavel.cx-corpo {
    grid-template-rows: auto;
  }

  .cx-ficha {
    grid-template-columns: minmax(0, 1fr);
  }
}

.cx-ficha-topo {
  display: flex;
  flex-shrink: 0;
  align-items: center;
  gap: 0.65rem;
  padding: 0.45rem 0.8rem;
  border-radius: 12px;
  background-color: var(--up-marca-escura);
  color: #fff;
}

/* a seta de volta a listagem, no lugar do icone da faixa */
.cx-voltar {
  display: inline-flex;
  flex: none;
  align-items: center;
  justify-content: center;
  width: 32px;
  height: 32px;
  border: 0;
  border-radius: 9px;
  background-color: var(--up-realce-sobre-escuro);
  color: #fff;
  cursor: pointer;
}

.cx-voltar:hover,
.cx-voltar:focus-visible {
  background-color: var(--up-primaria);
}

.cx-ficha-titulo {
  margin: 0;
  font-size: 14.5px;
  font-weight: 700;
}

.cx-ficha-sub {
  margin: 0;
  font-size: 12px;
  color: var(--up-texto-sobre-escuro-suave);
}

.cx-ficha-topo .cx-selo {
  margin-left: auto;
}

.cx-cartao-titulo {
  margin: 0 0 0.45rem;
  font-size: 11.5px;
  font-weight: 700;
  letter-spacing: 0.05em;
  text-transform: uppercase;
  color: var(--up-texto-suave);
}

.cx-campos {
  display: grid;
  grid-template-columns: repeat(12, minmax(0, 1fr));
  gap: 0.5rem 0.75rem;
  align-items: start;
}

.cx-c4 { grid-column: span 4; }
.cx-c6 { grid-column: span 6; }
.cx-c8 { grid-column: span 8; }
.cx-c12 { grid-column: 1 / -1; }

.cx-campos .campo .texto-apoio {
  margin: 0.15rem 0 0;
  font-size: 11.5px;
}

/* interruptor com o apoio AO LADO (era embaixo): o apoio quebra a linha
   quando a coluna e estreita, mas nunca some com reticencias */
.cx-campos .campo.cx-liga {
  flex-direction: row;
  align-items: center;
  gap: 0.65rem;
}

.cx-campos .campo.cx-liga .chave-liga {
  flex: none;
  min-width: 8.5rem;
}

.cx-campos .campo.cx-liga .texto-apoio {
  margin: 0;
  line-height: 1.3;
}

/* SSL, TLS e as combinacoes comuns numa linha, embaixo do servidor */
.cx-seguranca {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 0.35rem 1.1rem;
}

.cx-seguranca .cx-atalhos {
  margin-left: auto;
}

.cx-atalhos {
  display: flex;
  gap: 0.35rem;
  padding-top: 2px;
}

.cx-atalho {
  height: 26px;
  padding: 0 0.6rem;
  border: 1px solid var(--up-borda);
  border-radius: 999px;
  background-color: var(--up-superficie);
  font: inherit;
  font-size: 11.5px;
  color: var(--up-texto);
  cursor: pointer;
}

.cx-atalho.ativo {
  border-color: var(--up-primaria);
  background-color: var(--up-primaria-fundo);
  font-weight: 700;
  color: var(--up-primaria-escuro);
}

.cx-aviso,
.cx-dica {
  margin: 0;
  padding: 0.4rem 0.6rem;
  border-radius: 8px;
  font-size: 12px;
}

.cx-aviso {
  background-color: var(--up-intervencao-fundo);
  color: var(--up-bb-vencido);
}

.cx-dica {
  background-color: var(--up-tipo-pedido-fundo);
  color: var(--up-tipo-pedido);
}

.cx-aviso[hidden],
.cx-dica[hidden] {
  display: none;
}

.cx-senha {
  position: relative;
}

.cx-senha input {
  width: 100%;
  padding-right: 2.2rem;
}

.cx-olho {
  position: absolute;
  top: 50%;
  right: 4px;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 28px;
  height: 26px;
  border: 0;
  border-radius: 6px;
  background: none;
  color: var(--up-texto-suave);
  cursor: pointer;
  transform: translateY(-50%);
}

.cx-olho:hover {
  color: var(--up-primaria);
}

/* teste: fica com o que sobra da coluna e rola por dentro quando as etapas
   e o resultado passam da altura */
.cx-teste {
  display: flex;
  flex: 1 1 auto;
  flex-direction: column;
  gap: 0.5rem;
  min-height: 0;
  overflow-y: auto;
  padding: 0.7rem 0.85rem;
  border: 1px solid var(--up-borda-suave);
  border-radius: 12px;
  background-color: var(--up-superficie);
  box-shadow: var(--up-sombra-cartao-leve);
}

.cx-teste-titulo {
  display: flex;
  align-items: center;
  gap: 0.45rem;
  margin: 0;
  font-size: 14px;
  font-weight: 700;
  color: var(--up-marca-escura);
}

.cx-teste-apoio {
  margin: 0;
  font-size: 12px;
  color: var(--up-texto-suave);
}

/* "Enviar para" e o botao lado a lado (eram um embaixo do outro): o botao
   fica na altura do campo, alinhado pela base */
.cx-teste-linha {
  display: flex;
  flex-shrink: 0;
  align-items: flex-end;
  gap: 0.5rem;
}

.cx-teste-linha .campo {
  flex: 1 1 auto;
  min-width: 0;
}

.cx-teste-linha .cx-testar {
  flex: none;
  padding: 0 0.9rem;
}

.cx-teste > * {
  flex-shrink: 0;
}

.cx-testar {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: 0.45rem;
  height: 34px;
  border: 0;
  border-radius: 8px;
  background-color: var(--up-primaria);
  font: inherit;
  font-size: 13.5px;
  font-weight: 700;
  color: #fff;
  cursor: pointer;
}

.cx-testar:hover:not(:disabled) {
  background-color: var(--up-primaria-escuro);
}

.cx-testar:disabled {
  opacity: 0.6;
  cursor: progress;
}

.cx-etapas {
  display: flex;
  flex-direction: column;
  margin: 0;
  padding: 0;
  list-style: none;
}

.cx-etapas[hidden] {
  display: none;
}

.cx-etapa {
  position: relative;
  display: flex;
  gap: 0.6rem;
  padding-bottom: 0.55rem;
  font-size: 12.5px;
}

.cx-etapa:not(:last-child)::before {
  content: "";
  position: absolute;
  top: 20px;
  bottom: 0;
  left: 9px;
  width: 2px;
  background-color: var(--up-borda-suave);
}

.cx-etapa.ok:not(:last-child)::before {
  background-color: var(--up-resolvida-borda);
}

.cx-etapa-marca {
  position: relative;
  flex: 0 0 20px;
  width: 20px;
  height: 20px;
  border: 2px solid var(--up-borda);
  border-radius: 999px;
  background-color: var(--up-superficie);
}

.cx-etapa.ok .cx-etapa-marca {
  border-color: var(--up-resolvida);
  background-color: var(--up-resolvida);
  animation: cx-pulo 0.25s ease-out;
}

/* o visto e o x desenhados em CSS (sem imagem) */
.cx-etapa.ok .cx-etapa-marca::after {
  content: "";
  position: absolute;
  top: 3px;
  left: 5px;
  width: 5px;
  height: 9px;
  border: solid #fff;
  border-width: 0 2px 2px 0;
  transform: rotate(45deg);
}

.cx-etapa.falha .cx-etapa-marca {
  border-color: var(--up-restrito);
  background-color: var(--up-restrito);
  animation: cx-pulo 0.25s ease-out;
}

.cx-etapa.falha .cx-etapa-marca::before,
.cx-etapa.falha .cx-etapa-marca::after {
  content: "";
  position: absolute;
  top: 7px;
  left: 3px;
  width: 10px;
  height: 2px;
  background-color: #fff;
  transform: rotate(45deg);
}

.cx-etapa.falha .cx-etapa-marca::after {
  transform: rotate(-45deg);
}

.cx-etapa.andando .cx-etapa-marca {
  border-color: var(--up-primaria-claro);
  border-top-color: var(--up-primaria);
  animation: cx-gira 0.8s linear infinite;
}

.cx-etapa.espera {
  color: var(--up-texto-suave);
}

.cx-etapa-texto {
  display: flex;
  flex-direction: column;
  padding-top: 1px;
}

.cx-etapa-texto small {
  font-size: 11px;
  color: var(--up-texto-suave);
}

.cx-etapa.falha .cx-etapa-texto b {
  color: var(--up-restrito);
}

.cx-resultado {
  display: flex;
  align-items: flex-start;
  gap: 0.65rem;
  padding: 0.75rem;
  border-radius: 12px;
}

.cx-resultado[hidden] {
  display: none;
}

.cx-resultado.ok {
  border: 1px solid var(--up-resolvida-borda);
  background-color: var(--up-resolvida-fundo);
  color: var(--up-resolvida);
}

.cx-resultado.falha {
  border: 1px solid rgba(192, 57, 43, 0.25);
  background-color: var(--up-pendencia-fundo);
  color: var(--up-restrito);
}

.cx-resultado.entrou {
  animation: cx-entra 0.35s ease-out;
}

.cx-resultado.falha.entrou {
  animation: cx-entra 0.35s ease-out, cx-treme 0.4s 0.35s ease-in-out;
}

.cx-resultado-icone {
  position: relative;
  flex: 0 0 34px;
  width: 34px;
  height: 34px;
  border-radius: 999px;
}

.cx-resultado.ok .cx-resultado-icone {
  background-color: var(--up-resolvida);
}

.cx-resultado.falha .cx-resultado-icone {
  background-color: var(--up-restrito);
}

.cx-resultado.ok .cx-resultado-icone::after {
  content: "";
  position: absolute;
  top: 7px;
  left: 12px;
  width: 8px;
  height: 15px;
  border: solid #fff;
  border-width: 0 3px 3px 0;
  transform: rotate(45deg);
  animation: cx-visto 0.4s 0.15s ease-out both;
}

.cx-resultado.falha .cx-resultado-icone::before,
.cx-resultado.falha .cx-resultado-icone::after {
  content: "";
  position: absolute;
  top: 15px;
  left: 8px;
  width: 18px;
  height: 3px;
  border-radius: 2px;
  background-color: #fff;
  transform: rotate(45deg);
}

.cx-resultado.falha .cx-resultado-icone::after {
  transform: rotate(-45deg);
}

.cx-resultado-texto {
  display: flex;
  flex-direction: column;
  gap: 0.25rem;
  font-size: 12.5px;
  color: var(--up-texto);
}

.cx-resultado-texto b {
  font-size: 14.5px;
}

.cx-resultado.ok .cx-resultado-texto b {
  color: var(--up-resolvida);
}

.cx-resultado.falha .cx-resultado-texto b {
  color: var(--up-restrito);
}

.cx-resultado-dica {
  padding-top: 0.3rem;
  border-top: 1px solid rgba(0, 0, 0, 0.08);
  color: var(--up-cinza-chumbo);
}

.cx-resultado-dica[hidden] {
  display: none;
}

.cx-ultimo {
  margin: 0;
  font-size: 11.5px;
  color: var(--up-texto-suave);
}

.cx-ultimo[hidden] {
  display: none;
}

.cx-ultimo.ok::before {
  content: "✓ ";
  font-weight: 700;
  color: var(--up-resolvida);
}

.cx-ultimo.falha::before {
  content: "✕ ";
  font-weight: 700;
  color: var(--up-restrito);
}

@keyframes cx-gira { to { transform: rotate(360deg); } }
@keyframes cx-pulo { 0% { transform: scale(0.6); } 70% { transform: scale(1.15); } 100% { transform: scale(1); } }
@keyframes cx-entra { from { opacity: 0; transform: translateY(6px); } to { opacity: 1; transform: none; } }
@keyframes cx-treme { 0%, 100% { transform: none; } 25% { transform: translateX(-5px); } 75% { transform: translateX(5px); } }
@keyframes cx-visto { from { opacity: 0; transform: rotate(45deg) scale(0.4); } to { opacity: 1; transform: rotate(45deg) scale(1); } }

@media (prefers-reduced-motion: reduce) {
  .cx-etapa.ok .cx-etapa-marca,
  .cx-etapa.falha .cx-etapa-marca,
  .cx-resultado.entrou,
  .cx-resultado.falha.entrou,
  .cx-resultado.ok .cx-resultado-icone::after {
    animation: none;
  }
}

@media (max-width: 900px) {
  .cx-lista,
  .cx-teste {
    flex-basis: 100%;
    max-width: none;
  }

  .cx-c4,
  .cx-c6,
  .cx-c8 {
    grid-column: 1 / -1;
  }
}

/* ==========================================================================
   Carregamento de entrada (04/10/2026, Painel Admin > Aparencia)
   A animacao entre o login e o sistema, para nao haver a "transicao seca"
   do login direto para o menu. Modelos A "Desenho" e B "Orbita" do canvas
   https://claude.ai/artifact/4caiz4qiPgjHdrop9rEEnY (padrao: Orbita).

   Marcacao: partials/entrada.html. Comando: js/entrada.js, em duas fases:
     introducao  roda sozinha assim que a .entrada aparece (tempos fixos)
     saida       comeca quando a .entrada e o "palco" ganham `.saindo`
                 (palco = <html> na casca, .cg-previa-palco na previa do
                 painel); o palco tambem ganha .cg-modelo-desenho/-orbita, que
                 escolhe como a casca (topo, faixa, modulos, papel de parede)
                 entra por baixo.
   Medidas pela propria .entrada (container-type: size -> cqw/cqh): a mesma
   regra serve para a tela cheia e para o quadro de previa de 1366x768.
   ========================================================================== */

.entrada {
  --cg-topo: var(--up-header-altura);
  --cg-barra: var(--up-barra-modulos-altura);
  --cg-casca: calc(var(--cg-topo) + var(--cg-barra));
  /* 1 unidade do papel-parede-marca.svg (viewBox 1920x1000, `cover` na area
     de trabalho) em px: o Desenho usa para cair EXATAMENTE em cima dele.
     Os cq* resolvem nos filhos, medidos pela propria .entrada. */
  --cg-s: max(calc(100cqw / 1920), calc((100cqh - var(--cg-casca)) / 1000));
  position: fixed;
  inset: 0;
  z-index: 3000; /* acima da faixa de modulos (1050) e dos dialogos */
  display: none;
  overflow: hidden;
  container-type: size;
  font-family: var(--up-fonte);
}

html.entrando .entrada:not(.entrada-previa),
.entrada.entrada-teste {
  display: block;
}

/* Rede de seguranca: se o entrada.js nao rodar, o carregamento some sozinho
   e nao prende o usuario atras dele */
html.entrando .entrada:not(.entrada-previa) {
  animation: cg-seguranca 0s linear 9s forwards;
}

.entrada.cg-fim {
  display: none !important;
}

@keyframes cg-seguranca { to { visibility: hidden; } }
@keyframes cg-desenha { to { stroke-dashoffset: 0; } }
@keyframes cg-surge { from { opacity: 0; transform: translateY(8px); } to { opacity: 1; transform: none; } }
@keyframes cg-some { to { opacity: 0; } }
@keyframes cg-aparece { from { opacity: 0; } to { opacity: 1; } }
@keyframes cg-desce { from { opacity: 0; transform: translateY(-100%); } to { opacity: 1; transform: none; } }
@keyframes cg-enche { from { width: 0; } to { width: 100%; } }
@keyframes cg-gira { to { transform: rotate(360deg); } }
@keyframes cg-estala { 0% { opacity: 0; transform: scale(.4); } 70% { opacity: 1; transform: scale(1.15); } 100% { opacity: 1; transform: scale(1); } }
@keyframes cg-acende { from { opacity: .35; } to { opacity: 1; } }
/* A: o logo cresce ate o tamanho e a transparencia (13%) do logo do
   papel-parede-marca.svg (713 unidades de largura) */
@keyframes cg-vira-papel {
  to {
    width: calc(var(--cg-s) * 713);
    opacity: .13;
  }
}
/* A: o veu libera o topo e a faixa, que descem por cima dele */
@keyframes cg-abre-casca {
  to { clip-path: inset(var(--cg-casca) 0 0 0); }
}
@keyframes cg-esconde { to { visibility: hidden; } }
/* B: o marinho encolhe ate o retangulo exato da faixa de modulos */
@keyframes cg-vira-barra {
  to { clip-path: inset(var(--cg-topo) 0 calc(100% - var(--cg-casca)) 0); }
}

/* --- A · Desenho ----------------------------------------------------------- */

.cg-veu {
  position: absolute;
  inset: 0;
  /* o MESMO degrade do papel-parede-marca.svg (cx .5, cy .47, r .6 do
     viewBox), na mesma escala: a troca do veu pelo papel nao aparece */
  background: radial-gradient(
    calc(var(--cg-s) * 1152) calc(var(--cg-s) * 600)
      at 50% calc(var(--cg-casca) + (100cqh - var(--cg-casca)) / 2 - var(--cg-s) * 30),
    #ffffff 0%, #e6ecf6 100%);
  clip-path: inset(0 0 0 0);
}

/* no centro da AREA de trabalho (abaixo do topo e da faixa), onde o papel de
   parede tem o logo; as 20 unidades sao o deslocamento do logo no SVG */
.cg-logo {
  position: absolute;
  left: 50%;
  top: calc(var(--cg-casca) + (100cqh - var(--cg-casca)) / 2 - var(--cg-s) * 20);
  width: 360px;
  aspect-ratio: 310 / 83;
  transform: translate(-50%, -50%);
}

/* os aneis na mesma posicao em que o logo-conectsys.svg os desenha */
.cg-logo-elos {
  position: absolute;
  left: -2.106%;
  top: 4.133%;
  width: 24.516%;
  height: 91.566%;
  overflow: visible;
}

.cg-logo-nome {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  animation: cg-surge .45s ease-out .85s both;
}

.entrada[data-modelo="desenho"] .cg-anel {
  stroke-dasharray: 100;
  stroke-dashoffset: 100;
  animation: cg-desenha .75s cubic-bezier(.6, 0, .3, 1) .1s forwards;
}

.entrada[data-modelo="desenho"] .cg-anel-laranja {
  animation-delay: .3s;
}

.cg-progresso {
  position: absolute;
  left: 50%;
  top: calc(var(--cg-casca) + (100cqh - var(--cg-casca)) / 2 + 72px);
  transform: translateX(-50%);
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 10px;
  animation: cg-aparece .3s ease .95s both;
}

.cg-trilho {
  width: 220px;
  height: 4px;
  border-radius: 4px;
  background: #dce3ef;
  overflow: hidden;
}

.cg-enche {
  width: 0;
  height: 100%;
  border-radius: 4px;
  background: linear-gradient(90deg, #1557b0, #e8862a);
  animation: cg-enche 1s cubic-bezier(.4, 0, .2, 1) .95s forwards;
}

.cg-texto {
  font-size: 13px;
  color: #46567a;
  white-space: nowrap;
}

/* o logo cresce ate o tamanho do logo do papel; aos .66s veu + logo somem e
   a area de trabalho aparece NO MESMO quadro (sem somar os dois logos) */
.entrada.saindo .cg-veu {
  animation: cg-abre-casca .3s ease .05s forwards, cg-esconde 0s linear .66s forwards;
}
.entrada.saindo .cg-logo {
  animation: cg-vira-papel .6s cubic-bezier(.5, 0, .2, 1) .05s forwards, cg-esconde 0s linear .66s forwards;
}
/* sem papel de parede na frente (a pagina abriu com uma aba, ex.: Painel de
   Vendas): veu e logo so somem */
.entrada.saindo.sem-papel .cg-veu { animation: cg-some .5s ease .05s forwards; }
.entrada.saindo.sem-papel .cg-logo { animation: cg-some .45s ease .05s forwards; }
.entrada.saindo .cg-progresso { animation: cg-some .25s ease forwards; }

html.saindo.cg-modelo-desenho .topo,
.cg-previa-palco.saindo.cg-modelo-desenho .cg-topo {
  animation: cg-desce .4s cubic-bezier(.2, .7, .2, 1) .1s both;
}
html.saindo.cg-modelo-desenho .barra-modulos,
.cg-previa-palco.saindo.cg-modelo-desenho .cg-barra {
  animation: cg-desce .4s cubic-bezier(.2, .7, .2, 1) .2s both;
}
html.saindo.cg-modelo-desenho .area-trabalho,
.cg-previa-palco.saindo.cg-modelo-desenho .cg-area {
  animation: cg-aparece 0s linear .66s both;
}
html.saindo.cg-modelo-desenho .barra-modulos > .modulo,
.cg-previa-palco.saindo.cg-modelo-desenho .cg-modulo {
  animation: cg-surge .3s ease-out calc(.35s + var(--i, 0) * .05s) both;
}

/* --- B · Orbita ------------------------------------------------------------ */

.cg-cortina {
  position: absolute;
  inset: 0;
  background: var(--up-faixa-modulos);
  clip-path: inset(0 0 0 0);
}

.cg-brilho {
  position: absolute;
  inset: 0;
  background: radial-gradient(circle at 50% 46%, #1a3a78 0%, #0d1f3c 58%, #0a1730 100%);
}

.cg-miolo {
  position: absolute;
  inset: 0;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  gap: 22px;
  color: #fff;
}

.cg-orbita {
  position: relative;
  width: 132px;
  height: 132px;
}

.cg-orbita svg {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  overflow: visible;
}

/* duas voltas e para no angulo do logo; ai os aneis entrelacados (.cg-fixo)
   tomam o lugar */
.cg-giro {
  transform-box: view-box;
  transform-origin: 32px 32px;
  animation: cg-gira 1s cubic-bezier(.65, 0, .35, 1) .1s 2 both, cg-some .15s linear 2s forwards;
}

.cg-fixo {
  opacity: 0;
  animation: cg-aparece .15s linear 2s forwards;
}

/* recorta so o nome do entrada-nome-claro.svg (a caixa do logo tem o vao
   dos aneis a esquerda). Altura de 70px (05/10/2026, pedido do cliente): com
   64 a imagem (que desce ate 69px, por causa do -4px de cima) perdia a parte
   de baixo das letras da frase "A gestao que voce procura." */
.cg-nome {
  width: 196px;
  height: 70px;
  overflow: hidden;
  animation: cg-surge .45s ease-out .3s both;
}

.cg-nome img {
  display: block;
  width: 274px;
  height: 73px;
  margin: -4px 0 0 -75px;
}

.cg-passos {
  display: flex;
  flex-direction: column;
  gap: 10px;
  min-width: 260px;
}

.cg-passo {
  display: flex;
  align-items: center;
  gap: 10px;
  font-size: 15px;
  opacity: .35;
}

.cg-p1 { animation: cg-acende .2s ease .3s forwards; }
.cg-p2 { animation: cg-acende .2s ease .9s forwards; }
.cg-p3 { animation: cg-acende .2s ease 1.45s forwards; }

.cg-ico {
  position: relative;
  flex: none;
  width: 18px;
  height: 18px;
}

.cg-roda {
  position: absolute;
  inset: 0;
  box-sizing: border-box;
  border: 2px solid rgba(255, 255, 255, .22);
  border-top-color: #e8862a;
  border-radius: 50%;
}

.cg-ok {
  position: absolute;
  inset: 0;
  display: flex;
  align-items: center;
  justify-content: center;
  border-radius: 50%;
  background: #e8862a;
  opacity: 0;
}

.cg-p1 .cg-roda { animation: cg-gira .7s linear infinite, cg-some .1s linear .9s forwards; }
.cg-p2 .cg-roda { animation: cg-gira .7s linear infinite, cg-some .1s linear 1.45s forwards; }
.cg-p3 .cg-roda { animation: cg-gira .7s linear infinite, cg-some .1s linear 1.95s forwards; }
.cg-p1 .cg-ok { animation: cg-estala .25s ease-out .9s forwards; }
.cg-p2 .cg-ok { animation: cg-estala .25s ease-out 1.45s forwards; }
.cg-p3 .cg-ok { animation: cg-estala .25s ease-out 1.95s forwards; }

.cg-quadros {
  display: flex;
  gap: 8px;
}

.cg-q {
  width: 12px;
  height: 12px;
  border-radius: 3px;
  background: var(--mod-cor);
  opacity: 0;
  animation: cg-estala .25s ease-out calc(1.45s + var(--i, 0) * .06s) forwards;
}

.entrada.saindo .cg-miolo { animation: cg-some .25s ease forwards; }
.entrada.saindo .cg-brilho { animation: cg-some .3s ease .05s forwards; }
.entrada.saindo .cg-cortina {
  animation: cg-vira-barra .5s cubic-bezier(.7, 0, .2, 1) .25s forwards, cg-some .2s ease .8s forwards;
}

html.saindo.cg-modelo-orbita .topo,
.cg-previa-palco.saindo.cg-modelo-orbita .cg-topo {
  animation: cg-desce .35s cubic-bezier(.2, .7, .2, 1) .35s both;
}
html.saindo.cg-modelo-orbita .area-trabalho,
.cg-previa-palco.saindo.cg-modelo-orbita .cg-area {
  animation: cg-aparece .5s ease .3s both;
}
html.saindo.cg-modelo-orbita .barra-modulos > .modulo,
.cg-previa-palco.saindo.cg-modelo-orbita .cg-modulo {
  animation: cg-surge .3s ease-out calc(.65s + var(--i, 0) * .05s) both;
}

/* --- Painel Admin > Aparencia: cartoes com a previa ------------------------ */

.cg-escolha {
  display: flex;
  flex-wrap: wrap;
  gap: 16px;
}

.cg-cartao {
  box-sizing: border-box;
  width: 454px;
  display: flex;
  flex-direction: column;
  gap: 10px;
  padding: 14px 16px 16px;
  border: 1px solid var(--up-borda);
  border-radius: 12px;
  background: var(--up-superficie);
}

.cg-cartao:has(.opcao-carregamento:checked) {
  border-color: var(--up-primaria);
  box-shadow: 0 0 0 2px var(--up-primaria);
}

.cg-cartao-escolha {
  display: flex;
  align-items: center;
  gap: 8px;
  font-size: 14px;
  font-weight: 700;
  color: var(--up-texto);
  cursor: pointer;
}

.cg-cartao-escolha input {
  width: 16px;
  height: 16px;
  margin: 0;
  accent-color: var(--up-primaria);
}

.cg-cartao-padrao {
  margin-left: auto;
  padding: 2px 8px;
  border-radius: 999px;
  background: var(--up-primaria-fundo);
  color: var(--up-primaria);
  font-size: 11px;
  font-weight: 600;
}

/* 1366x768 reduzido a 30,75%: cabe no cartao com a mesma conta da tela cheia */
.cg-previa-moldura {
  position: relative;
  width: 420px;
  height: 236px;
  overflow: hidden;
  border: 1px solid var(--up-borda-suave);
  border-radius: 10px;
  background: var(--up-papel-parede);
}

.cg-previa-palco {
  position: absolute;
  left: 0;
  top: 0;
  width: 1366px;
  height: 768px;
  transform: scale(.30747);
  transform-origin: 0 0;
}

.entrada.entrada-previa {
  position: absolute;
  display: block;
  z-index: 5;
}

/* casca de mentira por baixo da previa (as mesmas medidas da de verdade) */
.cg-mini {
  position: absolute;
  inset: 0;
  display: flex;
  flex-direction: column;
  font-family: var(--up-fonte);
}

.cg-topo {
  flex: 0 0 var(--up-header-altura);
  display: flex;
  align-items: center;
  gap: 20px;
  padding: 0 22px;
  background: var(--up-superficie);
  border-bottom: 1px solid var(--up-borda-suave);
}

.cg-topo-logo { height: 25px; }
.cg-topo-filial { width: 230px; height: 38px; border: 1px solid var(--up-borda); border-radius: 10px; }
.cg-topo-usuario { width: 150px; height: 38px; margin-left: auto; border-radius: 10px; background: var(--up-papel-parede); }

.cg-barra {
  flex: 0 0 var(--up-barra-modulos-altura);
  display: flex;
  align-items: center;
  gap: 24px;
  padding: 0 22px;
  background: var(--up-faixa-modulos);
}

.cg-modulo {
  display: flex;
  align-items: center;
  gap: 8px;
  color: #fff;
  font-size: 13px;
  font-weight: 700;
  white-space: nowrap;
}

.cg-modulo-q {
  width: 26px;
  height: 26px;
  border-radius: 7px;
  background: var(--mod-cor);
}

.cg-area {
  flex: 1;
  background: var(--up-papel-parede) url("/static/img/papel-parede-marca.svg") center / cover no-repeat;
}

.cg-cartao-acoes {
  display: flex;
  gap: 8px;
}

.cg-botao {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  height: 30px;
  padding: 0 12px;
  border: 1px solid var(--up-borda);
  border-radius: 8px;
  background: var(--up-superficie);
  color: var(--up-texto);
  font-family: var(--up-fonte);
  font-size: 12.5px;
  font-weight: 600;
  cursor: pointer;
}

.cg-botao:hover {
  border-color: var(--up-primaria);
  color: var(--up-primaria);
}

/* ==========================================================================
   Expedicao > Conferencia na nova aparencia (05/10/2026)

   A roupa das listas de pedido (.cad-tela, grade de 30px num cartao) com os
   filtros rapidos por link (partials/filtros_rapidos.html). Como nas outras
   telas da Expedicao (Preparacao, Retirada, Entregas -- ver `.ent-barra >
   .fr-coluna`), os filtros ficam NA MESMA LINHA da pesquisa, que encurta;
   nas listas de venda a linha continua embaixo. `.fr-na-linha` liga isso no
   .cad-cabecalho. Faltando espaco, os filtros descem para baixo da pesquisa
   (o wrap) e os botoes ficam presos no alto, na linha dela.
   ========================================================================== */
.cad-cabecalho.fr-na-linha > .fr-coluna {
  flex-direction: row;
  flex-wrap: wrap;
  align-items: center;
  gap: 6px 0.5rem;
  min-width: 180px;
}

.cad-cabecalho.fr-na-linha > .fr-coluna > .cad-busca {
  flex: 0 1 280px;
  min-width: 170px;
}

/* a linha dos filtros na altura da pesquisa (os chips tem 26px) */
.cad-cabecalho.fr-na-linha > .fr-coluna > .fr-linha {
  flex: 1 1 auto;
  min-width: 0;
  min-height: 30px;
}

/* bolinhas do andamento, nas cores da etiqueta da coluna "Status da
   conferencia": pendente no ambar, conferido no verde */
.fr-ponto.conferencia-pendente {
  background-color: var(--up-intervencao);
}

.fr-ponto.conferencia-conferido {
  background-color: var(--up-resolvida);
}

/* --- Conferencia: Lista | Kanban (05/10/2026, pedido do cliente) -----------
   O seletor em pilula das Entregas (.ent-modos.ent-vista, ativo no azul
   escuro da marca: e "como ver", nao "o que filtrar") na altura de 30px da
   barra da nova aparencia -- la ele tem os 36px das telas .ent-*. */
.cad-cabecalho > .ent-modos {
  flex: none;
  height: 30px;
  border-radius: 8px;
}

/* O quadro: as duas colunas do Kanban das Cargas (.ent-coluna) ocupando a
   altura que sobra, cada uma rolando por si. Com duas colunas so, cada uma
   fica larga: os cartoes viram uma grade dentro da coluna (2 ou 3 por linha
   em 1366px), em vez de uma fila comprida com sobra dos lados. */
.conf-quadro {
  flex: 1 1 auto;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  grid-template-rows: minmax(0, 1fr);
  min-height: 0;
  padding: 0;
}

.conf-quadro[hidden] {
  display: none;
}

.conf-quadro.carregando .conf-coluna-corpo {
  opacity: 0.55;
}

.ent-coluna-corpo.conf-coluna-corpo {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(230px, 1fr));
  align-content: start;
}

/* a mensagem de coluna vazia atravessa a grade toda */
.conf-coluna-corpo .ent-coluna-vazia {
  grid-column: 1 / -1;
}

/* as bolinhas das colunas, nas cores da etiqueta "Status da conferencia" */
.ent-coluna-bola.conf-pendente {
  background-color: var(--up-intervencao);
}

.ent-coluna-bola.conf-conferido {
  background-color: var(--up-resolvida);
}

/* o tipo de envio na pilula cinza da grade, depois do numero */
.conf-cartao .conf-envio {
  overflow: hidden;
  max-width: 9rem;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.conf-cartao .conf-volumes {
  color: var(--up-resolvida);
}

.conf-cartao .conf-sem-cliente {
  font-style: italic;
  color: var(--up-texto-suave);
}

/* ==========================================================================
   Gerar nota ao montar a carga (05/10/2026) -- partials/carga_notas_dialogo.html
   Modelo C do canvas https://claude.ai/artifact/KzgdZaiCQBwmSgcvdHWzF1:
   faixa escura, "Aplicar a todos", uma linha por pedido com NF-e 55 | Nota 01
   e a situacao (Aguardando / gerada / Fora da carga) na propria linha.
   ========================================================================== */
.cn-dialogo {
  /* 05/10/2026: mais larga, e o ganho vai todo para o nome do cliente */
  width: min(62rem, calc(100vw - 2rem));
  border-radius: 12px;
  overflow: hidden;
  box-shadow: 0 18px 48px rgba(21, 26, 61, 0.35);
}

.cn-dialogo[open] {
  display: flex;
  flex-direction: column;
  max-height: calc(100vh - 4rem);
}

.cn-faixa {
  display: flex;
  align-items: center;
  gap: 0.75rem;
  padding: 14px 20px;
  background: var(--up-marca-escura);
  color: #fff;
}

.cn-faixa-texto {
  flex: 1;
  display: flex;
  flex-direction: column;
  gap: 2px;
  min-width: 0;
}

.cn-titulo {
  margin: 0;
  font-size: 16px;
  font-weight: 700;
}

.cn-subtitulo {
  font-size: 12px;
  color: rgba(255, 255, 255, 0.72);
}

.cn-fechar {
  width: 32px;
  height: 32px;
  border: 0;
  border-radius: 8px;
  background: transparent;
  color: #fff;
  font-size: 22px;
  line-height: 1;
  cursor: pointer;
}

.cn-fechar:hover {
  background: var(--up-realce-sobre-escuro);
}

.cn-barra {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 8px 10px;
  padding: 12px 20px;
  border-bottom: 1px solid var(--up-borda-suave);
  font-size: 12.5px;
}

.cn-barra-rotulo {
  color: var(--up-cinza-chumbo);
}

.cn-todos {
  height: 28px;
  padding: 0 12px;
  border-radius: 999px;
  font-family: var(--up-fonte);
  font-size: 12px;
  font-weight: 700;
  cursor: pointer;
}

.cn-todos-55 {
  border: 1px solid var(--up-primaria-claro);
  background: var(--up-primaria-fundo);
  color: var(--up-primaria);
}

.cn-todos-01 {
  border: 1px solid #e5c98f;
  background: var(--up-intervencao-fundo);
  color: #8a5f17;
}

.cn-todos:disabled {
  border-color: var(--up-borda-suave);
  background: var(--up-papel-parede);
  color: #b0b5ba;
  cursor: not-allowed;
}

.cn-series {
  margin-left: auto;
  display: flex;
  align-items: center;
  gap: 5px;
  color: var(--up-texto-suave);
}

.cn-series strong {
  color: var(--up-texto);
}

.cn-series-sep {
  margin: 0 2px;
}

.cn-series-falta {
  color: var(--up-texto-suave);
  font-style: italic;
  cursor: help;
}

.cn-serie-escolha {
  height: 24px;
  border: 1px solid var(--up-borda);
  border-radius: 6px;
  font-family: var(--up-fonte);
  font-size: 12px;
}

.cn-tabela {
  overflow-y: auto;
  min-height: 0;
}

.cn-linha {
  display: grid;
  grid-template-columns: 120px minmax(0, 1fr) 86px 164px 184px;
  align-items: center;
  gap: 10px;
  min-height: 44px;
  padding: 6px 20px;
  border-bottom: 1px solid var(--up-borda-suave);
  font-size: 12.5px;
}

/* o titulo das colunas fica no alto enquanto a lista rola */
.cn-cabecalho {
  position: sticky;
  top: 0;
  z-index: 1;
  background: var(--up-superficie);
  min-height: 0;
  padding-top: 8px;
  padding-bottom: 8px;
  font-size: 10.5px;
  font-weight: 700;
  letter-spacing: 0.04em;
  text-transform: uppercase;
  color: var(--up-texto-suave);
}

.cn-pedido {
  display: flex;
  flex-direction: column;
  font-weight: 700;
  color: var(--up-marca-escura);
}

.cn-tipo {
  overflow: hidden;
  white-space: nowrap;
  text-overflow: ellipsis;
  font-size: 11px;
  font-weight: 400;
  color: var(--up-texto-suave);
}

.cn-cliente {
  overflow: hidden;
  white-space: nowrap;
  text-overflow: ellipsis;
}

.cn-valor {
  text-align: right;
  font-variant-numeric: tabular-nums;
}

.cn-centro {
  text-align: center;
}

.cn-segmento {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: 3px;
  padding: 3px;
  border: 1px solid var(--up-borda-suave);
  border-radius: 8px;
  background: var(--up-papel-parede);
}

.cn-seg {
  height: 26px;
  border: 0;
  border-radius: 6px;
  background: transparent;
  color: var(--up-texto);
  font-family: var(--up-fonte);
  font-size: 12px;
  font-weight: 700;
  cursor: pointer;
}

.cn-seg.ativo {
  background: var(--up-primaria);
  color: #fff;
}

.cn-seg:disabled {
  cursor: not-allowed;
}

.cn-seg:disabled:not(.ativo) {
  color: #b0b5ba;
}

.cn-situacao {
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  gap: 2px;
}

.cn-etiqueta {
  display: inline-block;
  max-width: 100%;
  overflow: hidden;
  white-space: nowrap;
  text-overflow: ellipsis;
  padding: 2px 10px;
  border-radius: 999px;
  font-size: 11.5px;
  font-weight: 700;
  line-height: 17px;
}

.cn-aguardando,
.cn-fila {
  background: var(--up-borda-suave);
  color: var(--up-cinza-chumbo);
}

.cn-fila {
  opacity: 0.7;
}

.cn-andamento {
  background: var(--up-primaria-fundo);
  color: var(--up-primaria);
}

.cn-ok {
  background: var(--up-resolvida-fundo);
  color: var(--up-resolvida);
}

.cn-erro {
  background: var(--up-pendencia-fundo);
  color: #9b2c22;
  cursor: help;
}

.cn-rodape {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 8px;
  padding: 12px 20px;
  background: #fafbfc;
}

.cn-rodape-texto {
  flex: 1;
  min-width: 200px;
  font-size: 12px;
  color: var(--up-texto-suave);
}

.cn-botao {
  height: 30px;
  padding: 0 16px;
  border-radius: 8px;
  font-family: var(--up-fonte);
  font-size: 12.5px;
  cursor: pointer;
}

.cn-secundario {
  border: 1px solid var(--up-borda);
  background: #fff;
  color: var(--up-cinza-chumbo);
}

.cn-principal {
  border: 1px solid #468f4a;
  background: var(--up-acao-incluir);
  color: #fff;
  font-weight: 700;
}

.cn-principal:hover:not(:disabled) {
  background: #468f4a;
}

.cn-principal:disabled {
  opacity: 0.7;
  cursor: progress;
}

@media (max-width: 760px) {
  .cn-linha {
    grid-template-columns: minmax(0, 1fr) auto;
  }

  .cn-cabecalho {
    display: none;
  }

  .cn-cliente,
  .cn-situacao {
    grid-column: 1 / -1;
  }
}
