/* ==========================================================================
   NFeArquivo v2 — folha de estilo única
   --------------------------------------------------------------------------
   Substitui estilo_adm.css, estilo.css, flexigrid.css, jquerytools.css,
   datainput.css, table_jui.css e o tema jQuery UI da versão antiga.

   Princípios:
   1. Layout fluido, feito com Grid e Flexbox — nada de larguras fixas em
      pixels como os `width: 1150` que o flexigrid exigia.
   2. Mobile-first de verdade: a tabela de dados vira uma lista de cartões
      abaixo de 860px, sem rolagem horizontal e sem "aperte CTRL + para
      controlar o tamanho", que era a instrução dada ao usuário antes.
   3. Tokens em custom properties: mudar a identidade visual é mexer no
      bloco :root.
   4. Modo claro/escuro: segue o sistema operacional até o usuário escolher
      no botão do topo; a escolha fica salva no navegador.
   ========================================================================== */

/* --------------------------------------------------------------------------
   1. Tokens de design
   -------------------------------------------------------------------------- */
:root {
  /* Ajusta controles nativos (calendário, barras de rolagem) ao tema. */
  color-scheme: light;

  /* Paleta — azul institucional do NFeArquivo */
  --cor-marca: #0b4f9c;
  --cor-marca-escura: #083a75;
  --cor-marca-clara: #e8f1fb;

  /* Barra superior e menu (texto sempre branco sobre elas). */
  --cor-topo: #0b4f9c;
  --cor-menu: #083a75;

  --cor-fundo: #f4f6f9;
  --cor-superficie: #ffffff;
  --cor-superficie-2: #f8fafc;
  --cor-borda: #dfe3e8;
  --cor-texto: #1c2430;
  --cor-texto-suave: #5b6775;

  --cor-sucesso: #15803d;
  --cor-sucesso-fundo: #e8f6ee;
  --cor-erro: #b91c1c;
  --cor-erro-fundo: #fdeaea;
  --cor-aviso: #b45309;
  --cor-aviso-fundo: #fdf3e3;
  --cor-info: #0b4f9c;
  --cor-info-fundo: #e8f1fb;

  /* Escala tipográfica e espaçamento */
  --fonte: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
  --fonte-mono: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, monospace;
  --raio: 10px;
  --raio-p: 6px;
  --sombra: 0 1px 2px rgba(16, 24, 40, .06), 0 1px 3px rgba(16, 24, 40, .1);
  --sombra-alta: 0 4px 12px rgba(16, 24, 40, .12);

  /* Alturas mínimas de toque: 44px é o mínimo confortável no celular */
  --alvo-toque: 44px;
}

/*
 * Modo escuro: só os tokens mudam, nenhum componente precisa saber disso.
 *
 * O tema ativo fica em <html data-tema="claro|escuro">, gravado antes da
 * pintura da página por templates/parciais/tema.php: vale a escolha salva
 * pelo usuário ou, sem escolha, a preferência do sistema operacional.
 *
 * A media query abaixo é só o plano B para navegador com JavaScript
 * desligado (sem data-tema). Os valores se repetem nos dois blocos porque o
 * CSS não permite compartilhar um conjunto de variáveis entre um seletor e
 * uma media query — ao mudar uma cor escura, mude nos dois.
 */
:root[data-tema="escuro"] {
  color-scheme: dark;
  /* Azul profundo: o azul claro da marca no escuro não dá contraste com
     o texto branco da barra e do menu. */
  --cor-topo: #12325a;
  --cor-menu: #0c243f;
  --cor-fundo: #0f141b;
  --cor-superficie: #171e27;
  --cor-superficie-2: #1e2732;
  --cor-borda: #2b3644;
  --cor-texto: #e8edf3;
  --cor-texto-suave: #9aa7b6;
  --cor-marca: #4b93e6;
  --cor-marca-escura: #3878c4;
  --cor-marca-clara: #16283f;
  --cor-sucesso-fundo: #12261a;
  --cor-erro-fundo: #2a1414;
  --cor-aviso-fundo: #2a2011;
  --cor-info-fundo: #16283f;
}

@media (prefers-color-scheme: dark) {
  :root:not([data-tema]) {
    color-scheme: dark;
    --cor-topo: #12325a;
    --cor-menu: #0c243f;
    --cor-fundo: #0f141b;
    --cor-superficie: #171e27;
    --cor-superficie-2: #1e2732;
    --cor-borda: #2b3644;
    --cor-texto: #e8edf3;
    --cor-texto-suave: #9aa7b6;
    --cor-marca: #4b93e6;
    --cor-marca-escura: #3878c4;
    --cor-marca-clara: #16283f;
    --cor-sucesso-fundo: #12261a;
    --cor-erro-fundo: #2a1414;
    --cor-aviso-fundo: #2a2011;
    --cor-info-fundo: #16283f;
  }
}

/* --------------------------------------------------------------------------
   2. Base
   -------------------------------------------------------------------------- */
*,
*::before,
*::after { box-sizing: border-box; }

html { -webkit-text-size-adjust: 100%; }

body {
  margin: 0;
  font-family: var(--fonte);
  font-size: 15px;
  line-height: 1.5;
  color: var(--cor-texto);
  background: var(--cor-fundo);
  -webkit-font-smoothing: antialiased;
}

h1, h2, h3, h4 { margin: 0 0 .5rem; line-height: 1.25; font-weight: 600; }
h1 { font-size: 1.35rem; }
h2 { font-size: 1.15rem; }
h3 { font-size: 1rem; }
p  { margin: 0 0 .75rem; }

a { color: var(--cor-marca); text-decoration: none; }
a:hover { text-decoration: underline; }

img { max-width: 100%; height: auto; }

/* Foco sempre visível: navegação por teclado era impossível na versão antiga. */
:focus-visible {
  outline: 2px solid var(--cor-marca);
  outline-offset: 2px;
  border-radius: var(--raio-p);
}

/* Conteúdo só para leitores de tela. */
.oculto-visual {
  position: absolute;
  width: 1px; height: 1px;
  padding: 0; margin: -1px;
  overflow: hidden;
  clip: rect(0 0 0 0);
  white-space: nowrap;
  border: 0;
}

/* --------------------------------------------------------------------------
   3. Estrutura da página
   -------------------------------------------------------------------------- */
.app {
  min-height: 100vh;
  display: flex;
  flex-direction: column;
}

/* Barra superior fixa: marca à esquerda, identificação à direita. */
.topo {
  background: var(--cor-topo);
  color: #fff;
  padding: .5rem 1rem;
  display: flex;
  align-items: center;
  gap: 1rem;
  flex-wrap: wrap;
}

.topo__marca { display: flex; align-items: center; gap: .6rem; }
.topo__marca img { height: 34px; width: auto; }
.topo__marca strong { font-size: 1rem; letter-spacing: .02em; }

.topo__identificacao {
  margin-left: auto;
  display: flex;
  align-items: center;
  gap: .75rem;
  font-size: .8rem;
  text-align: right;
}

.topo__identificacao dl { margin: 0; }
.topo__identificacao dt { display: none; }
.topo__identificacao dd { margin: 0; opacity: .9; }
.topo__identificacao strong { display: block; }

/* Acesso total: login e seletor de loja lado a lado, na mesma linha e
   centralizados com os botões de tema e Sair. */
.topo__identificacao dl.topo__dados--em-linha {
  display: flex;
  align-items: center;
  flex-wrap: nowrap;
  gap: .6rem;
}
.topo__dados--em-linha strong { display: inline; white-space: nowrap; }

/* Seletor de loja do acesso total, compacto para caber na barra. */
.topo__loja { opacity: 1 !important; }
.topo__loja select {
  width: auto;
  max-width: 18rem;
  min-height: 32px;
  padding: .2rem .45rem;
  font-size: .8rem;
}

/* Celular: a identificação quebra linha para os botões não saírem da tela. */
@media (max-width: 600px) {
  .topo__identificacao { flex-wrap: wrap; justify-content: flex-end; }
  .topo__loja select { max-width: 14rem; }
}

/* Menu principal em forma de abas roláveis no celular. */
.menu {
  background: var(--cor-menu);
  display: flex;
  gap: .25rem;
  padding: 0 .5rem;
  overflow-x: auto;
  scrollbar-width: none;
}
.menu::-webkit-scrollbar { display: none; }

.menu__item {
  color: #dbe7f6;
  padding: .7rem .9rem;
  font-size: .85rem;
  font-weight: 600;
  letter-spacing: .03em;
  text-transform: uppercase;
  white-space: nowrap;
  border-bottom: 3px solid transparent;
  min-height: var(--alvo-toque);
  display: flex;
  align-items: center;
}
.menu__item:hover { color: #fff; text-decoration: none; }
.menu__item[aria-current="page"] {
  color: #fff;
  border-bottom-color: #fff;
  background: rgba(255, 255, 255, .08);
}

/* Largura generosa para aproveitar monitores grandes em tela cheia: as
   listagens têm muitas colunas. O limite só evita linhas longas demais em
   telas ultralargas. */
.conteudo {
  flex: 1;
  width: 100%;
  max-width: 1920px;
  margin: 0 auto;
  padding: 1rem;
}

.rodape {
  padding: 1rem;
  text-align: center;
  font-size: .75rem;
  color: var(--cor-texto-suave);
}

/* Cabeçalho de seção: título + ações da tela. */
.secao-topo {
  display: flex;
  align-items: flex-end;
  justify-content: space-between;
  gap: .75rem;
  flex-wrap: wrap;
  margin-bottom: .75rem;
}
.secao-topo p { margin: 0; color: var(--cor-texto-suave); font-size: .85rem; }

/* --------------------------------------------------------------------------
   4. Cartões e blocos
   -------------------------------------------------------------------------- */
.cartao {
  background: var(--cor-superficie);
  border: 1px solid var(--cor-borda);
  border-radius: var(--raio);
  box-shadow: var(--sombra);
  margin-bottom: 1rem;
  overflow: hidden;
}

.cartao__cabecalho {
  padding: .75rem 1rem;
  border-bottom: 1px solid var(--cor-borda);
  background: var(--cor-superficie-2);
  display: flex;
  align-items: center;
  gap: .75rem;
  flex-wrap: wrap;
}
.cartao__cabecalho h2 { margin: 0; font-size: .95rem; }

.cartao__corpo { padding: 1rem; }

/* Painel de indicadores (totais). */
.indicadores {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(160px, 1fr));
  gap: .75rem;
  margin-bottom: 1rem;
}
.indicador {
  background: var(--cor-superficie);
  border: 1px solid var(--cor-borda);
  border-radius: var(--raio);
  padding: .75rem .9rem;
}
.indicador__rotulo {
  font-size: .7rem;
  text-transform: uppercase;
  letter-spacing: .05em;
  color: var(--cor-texto-suave);
}
.indicador__valor { font-size: 1.2rem; font-weight: 600; }

/* --------------------------------------------------------------------------
   5. Formulários e filtros
   -------------------------------------------------------------------------- */
.campo { display: flex; flex-direction: column; gap: .25rem; }

.campo__rotulo {
  font-size: .72rem;
  font-weight: 600;
  text-transform: uppercase;
  letter-spacing: .04em;
  color: var(--cor-texto-suave);
}

input[type="text"],
input[type="search"],
input[type="password"],
input[type="date"],
input[type="email"],
input[type="number"],
select,
textarea {
  font: inherit;
  color: var(--cor-texto);
  background: var(--cor-superficie);
  border: 1px solid var(--cor-borda);
  border-radius: var(--raio-p);
  padding: .5rem .6rem;
  min-height: var(--alvo-toque);
  width: 100%;
}

input:focus, select:focus, textarea:focus {
  border-color: var(--cor-marca);
  outline: none;
  box-shadow: 0 0 0 3px var(--cor-marca-clara);
}

/*
 * Seleção de arquivos (tela de manutenção). O campo não ocupa a largura
 * inteira do cartão: o botão "Enviar arquivos" fica logo abaixo, ao lado dos
 * botões de importação, e não mais afastado na ponta direita da tela.
 */
.campo--arquivo { max-width: 34rem; margin-bottom: .75rem; }
.campo--arquivo input[type="file"] {
  font: inherit;
  font-size: .85rem;
  color: var(--cor-texto);
  background: var(--cor-superficie);
  border: 1px solid var(--cor-borda);
  border-radius: var(--raio-p);
  padding: .45rem .6rem;
  width: 100%;
}

/* Barra de filtros: vira uma coluna só no celular. */
.filtros {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
  gap: .6rem;
  align-items: end;
}
.filtros__acoes {
  display: flex;
  gap: .5rem;
  flex-wrap: wrap;
}

/* --------------------------------------------------------------------------
   6. Botões
   -------------------------------------------------------------------------- */
.botao {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: .4rem;
  font: inherit;
  font-size: .85rem;
  font-weight: 600;
  line-height: 1;
  min-height: var(--alvo-toque);
  padding: .55rem .9rem;
  border: 1px solid var(--cor-borda);
  border-radius: var(--raio-p);
  background: var(--cor-superficie);
  color: var(--cor-texto);
  cursor: pointer;
  text-decoration: none;
  white-space: nowrap;
  transition: background .15s ease, border-color .15s ease;
}
.botao:hover { background: var(--cor-superficie-2); text-decoration: none; }
.botao:disabled, .botao[aria-disabled="true"] { opacity: .5; cursor: not-allowed; }

.botao--primario {
  background: var(--cor-marca);
  border-color: var(--cor-marca);
  color: #fff;
}
.botao--primario:hover { background: var(--cor-marca-escura); border-color: var(--cor-marca-escura); }

.botao--perigo { color: var(--cor-erro); border-color: #f0c2c2; }
.botao--perigo:hover { background: var(--cor-erro-fundo); }

.botao--pequeno { min-height: 34px; padding: .35rem .6rem; font-size: .78rem; }

.botao--bloco { width: 100%; }

/* --------------------------------------------------------------------------
   7. Avisos
   -------------------------------------------------------------------------- */
.aviso {
  border-radius: var(--raio-p);
  padding: .7rem .9rem;
  margin-bottom: .75rem;
  font-size: .88rem;
  border: 1px solid transparent;
}
.aviso--info    { background: var(--cor-info-fundo);    color: var(--cor-info);    border-color: var(--cor-info); }
.aviso--erro    { background: var(--cor-erro-fundo);    color: var(--cor-erro);    border-color: var(--cor-erro); }
.aviso--sucesso { background: var(--cor-sucesso-fundo); color: var(--cor-sucesso); border-color: var(--cor-sucesso); }
.aviso--aviso   { background: var(--cor-aviso-fundo);   color: var(--cor-aviso);   border-color: var(--cor-aviso); }

/* Selos de situação usados nas listagens. */
.selo {
  display: inline-block;
  font-size: .7rem;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: .04em;
  padding: .15rem .45rem;
  border-radius: 999px;
  background: var(--cor-superficie-2);
  color: var(--cor-texto-suave);
  border: 1px solid var(--cor-borda);
}
.selo--ok       { background: var(--cor-sucesso-fundo); color: var(--cor-sucesso); border-color: var(--cor-sucesso); }
.selo--alerta   { background: var(--cor-aviso-fundo);   color: var(--cor-aviso);   border-color: var(--cor-aviso); }
.selo--perigo   { background: var(--cor-erro-fundo);    color: var(--cor-erro);    border-color: var(--cor-erro); }

/* ==========================================================================
   8. GRADE DE DADOS — o componente central da v2
   --------------------------------------------------------------------------
   Um mesmo HTML atende às três larguras:

   ≥ 861px  → tabela tradicional, com cabeçalho clicável para ordenar;
   ≤ 860px  → cada linha vira um cartão; o rótulo de cada campo é escrito
              pelo pseudo-elemento a partir do atributo data-rotulo, então
              não existe HTML duplicado para "versão mobile".
   ========================================================================== */
.grade { width: 100%; }

.grade__barra {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: .75rem;
  flex-wrap: wrap;
  padding: .6rem .9rem;
  border-bottom: 1px solid var(--cor-borda);
  background: var(--cor-superficie-2);
  font-size: .82rem;
  color: var(--cor-texto-suave);
}

/* Pesquisa: campo da busca, texto, botão limpar e indicador de carregamento,
   lado a lado; em telas estreitas o seletor ocupa a primeira linha. */
.grade__pesquisa {
  display: flex;
  align-items: center;
  flex-wrap: wrap;
  gap: .4rem;
  flex: 1 1 32rem;
  max-width: 46rem;
}
.grade__pesquisa .grade__campo { flex: 0 1 12rem; width: auto; min-width: 9rem; }
.grade__pesquisa .grade__busca { flex: 1 1 14rem; width: auto; min-width: 0; }

/* O "x" nativo do input de busca (Chrome/Safari) duplicaria o botão limpar. */
.grade__busca::-webkit-search-cancel-button { -webkit-appearance: none; appearance: none; display: none; }

.grade__limpar { flex: 0 0 auto; width: var(--alvo-toque); padding: 0; font-size: 1rem; }

.grade__carregando { flex: 0 0 auto; width: 1.25rem; height: 1.25rem; }
/* .girando define display: inline-block, que venceria o atributo hidden. */
.grade__carregando[hidden] { display: none; }

/* No celular o seletor ocupa a linha inteira; texto e botão limpar abaixo. */
@media (max-width: 860px) {
  .grade__pesquisa { flex-basis: 100%; max-width: none; }
  .grade__pesquisa .grade__campo { flex-basis: 100%; }
}

.grade__rolagem { width: 100%; overflow-x: auto; }

.grade__tabela {
  width: 100%;
  border-collapse: collapse;
  font-size: .86rem;
}

.grade__tabela th,
.grade__tabela td {
  padding: .6rem .75rem;
  text-align: left;
  border-bottom: 1px solid var(--cor-borda);
  vertical-align: middle;
}

.grade__tabela thead th {
  position: sticky;
  top: 0;
  z-index: 1;
  background: var(--cor-superficie-2);
  font-size: .72rem;
  text-transform: uppercase;
  letter-spacing: .04em;
  color: var(--cor-texto-suave);
  white-space: nowrap;
}

.grade__tabela tbody tr:hover { background: var(--cor-marca-clara); }

/* Alinhamentos declarados pela definição da coluna. */
.grade [data-alinhamento="direita"] { text-align: right; }
.grade [data-alinhamento="centro"]  { text-align: center; }

/* Cabeçalho ordenável. */
.grade__ordenar {
  background: none;
  border: 0;
  padding: 0;
  font: inherit;
  color: inherit;
  text-transform: inherit;
  letter-spacing: inherit;
  cursor: pointer;
  display: inline-flex;
  align-items: center;
  gap: .3rem;
}
.grade__ordenar::after { content: "↕"; opacity: .35; font-size: .9em; }
.grade__ordenar[data-direcao="ASC"]::after  { content: "↑"; opacity: 1; }
.grade__ordenar[data-direcao="DESC"]::after { content: "↓"; opacity: 1; }

/* Valores monetários e chaves de acesso em fonte tabular/monoespaçada. */
.grade [data-tipo="moeda"],
.grade [data-tipo="numero"],
.grade [data-tipo="documento"],
.grade [data-tipo="data"] { font-variant-numeric: tabular-nums; }
.grade [data-tipo="chave"]  { font-family: var(--fonte-mono); font-size: .78rem; word-break: break-all; }

/* Na tabela (desktop), CNPJ/CPF, datas e valores nunca quebram de linha:
   "R$ 1.234,56" partido em dois ou um CNPJ cortado na barra ficam ilegíveis.
   Quem cede espaço são as colunas de texto livre (destinatário, natureza). */
@media (min-width: 861px) {
  .grade [data-tipo="moeda"],
  .grade [data-tipo="numero"],
  .grade [data-tipo="documento"],
  .grade [data-tipo="data"] { white-space: nowrap; }
}

/* Coluna de ações. */
.grade__acoes {
  display: flex;
  gap: .35rem;
  flex-wrap: wrap;
  justify-content: flex-end;
}

/* Em telas largas os botões ficam lado a lado, sem dobrar a altura de cada
   linha; o espaço sai das colunas de texto livre e da chave de acesso. */
@media (min-width: 1280px) {
  .grade__acoes { flex-wrap: nowrap; }
}

/* Estados. */
.grade__estado {
  padding: 2rem 1rem;
  text-align: center;
  color: var(--cor-texto-suave);
  font-size: .9rem;
}
.grade__estado[hidden] { display: none; }

/* "Carregando…" em destaque, com o indicador animado ao lado. */
.grade__estado--carregando {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: .6rem;
  font-weight: 700;
  color: var(--cor-texto);
}

.grade[aria-busy="true"] .grade__rolagem { opacity: .45; pointer-events: none; }

/* Rodapé com paginação. */
.paginacao {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: .75rem;
  flex-wrap: wrap;
  padding: .6rem .9rem;
  border-top: 1px solid var(--cor-borda);
  background: var(--cor-superficie-2);
  font-size: .82rem;
}
.paginacao__botoes { display: flex; gap: .4rem; align-items: center; }

/* --------------------------------------------------------------------------
   8.1 Modo cartão (celular e tablet em pé)
   -------------------------------------------------------------------------- */
@media (max-width: 860px) {
  .grade__rolagem { overflow-x: visible; }

  .grade__tabela,
  .grade__tabela tbody,
  .grade__tabela tr,
  .grade__tabela td { display: block; width: 100%; }

  /* O cabeçalho da tabela some: cada célula passa a exibir o próprio rótulo. */
  .grade__tabela thead { display: none; }

  .grade__tabela tr {
    background: var(--cor-superficie);
    border: 1px solid var(--cor-borda);
    border-radius: var(--raio);
    margin-bottom: .6rem;
    padding: .3rem .1rem;
    box-shadow: var(--sombra);
  }
  .grade__tabela tbody tr:hover { background: var(--cor-superficie); }

  .grade__tabela td {
    display: flex;
    align-items: baseline;
    justify-content: space-between;
    gap: 1rem;
    border: 0;
    padding: .3rem .8rem;
    text-align: right;
  }

  /* O rótulo vem do atributo data-rotulo preenchido pela grade. */
  .grade__tabela td::before {
    content: attr(data-rotulo);
    flex: 0 0 auto;
    font-size: .68rem;
    font-weight: 700;
    text-transform: uppercase;
    letter-spacing: .04em;
    color: var(--cor-texto-suave);
    text-align: left;
  }

  /* A coluna marcada como principal vira o título do cartão. */
  .grade__tabela td[data-principal="1"] {
    font-size: 1.05rem;
    font-weight: 700;
    padding-top: .6rem;
  }

  /* Campos longos (nome, chave) ocupam a largura inteira, em duas linhas. */
  .grade__tabela td[data-quebra="1"] {
    flex-direction: column;
    align-items: flex-start;
    text-align: left;
    gap: .1rem;
  }

  /* Células vazias não ocupam espaço no cartão. */
  .grade__tabela td[data-vazio="1"] { display: none; }

  .grade__tabela td[data-coluna="acoes"] { padding: .5rem .8rem .7rem; }
  .grade__tabela td[data-coluna="acoes"]::before { content: ""; display: none; }
  .grade__acoes { justify-content: stretch; }
  .grade__acoes .botao { flex: 1 1 auto; }

  .paginacao { justify-content: center; }
  .paginacao__resumo { width: 100%; text-align: center; }
}

/* --------------------------------------------------------------------------
   9. Tabelas simples (detalhe de fatura, relatórios)
   -------------------------------------------------------------------------- */
.tabela-simples {
  width: 100%;
  border-collapse: collapse;
  font-size: .86rem;
}
.tabela-simples th,
.tabela-simples td {
  padding: .5rem .65rem;
  border-bottom: 1px solid var(--cor-borda);
  text-align: left;
}
.tabela-simples thead th {
  font-size: .72rem;
  text-transform: uppercase;
  letter-spacing: .04em;
  color: var(--cor-texto-suave);
}
.tabela-simples tfoot td {
  font-weight: 700;
  background: var(--cor-superficie-2);
}
.tabela-simples .direita { text-align: right; }
.tabela-simples .centro  { text-align: center; }

/* Em telas estreitas a tabela simples rola na horizontal dentro do cartão. */
.rolagem-horizontal { overflow-x: auto; -webkit-overflow-scrolling: touch; }

/* --------------------------------------------------------------------------
   10. Telas de login
   -------------------------------------------------------------------------- */
.login {
  min-height: 100vh;
  display: grid;
  place-items: center;
  padding: 1.5rem 1rem;
  background: linear-gradient(160deg, var(--cor-marca) 0%, var(--cor-marca-escura) 100%);
}

.login__caixa {
  width: 100%;
  max-width: 380px;
  background: var(--cor-superficie);
  border-radius: var(--raio);
  box-shadow: var(--sombra-alta);
  padding: 1.5rem;
}
.login__marca { text-align: center; margin-bottom: 1.25rem; }
.login__marca img { max-height: 72px; width: auto; }
.login__campos { display: grid; gap: .85rem; }
.login__rodape { margin-top: 1rem; font-size: .75rem; color: var(--cor-texto-suave); text-align: center; }

/* Senha nova mostrada na tela (método 2 da recuperação). Monoespaçada e
   espaçada para não confundir caracteres parecidos na hora de anotar. */
.senha-nova {
  margin: 1rem 0 .75rem;
  padding: .9rem;
  background: var(--cor-marca-clara);
  border: 1px solid var(--cor-marca);
  border-radius: var(--raio-p);
  font-family: var(--fonte-mono);
  font-size: 1.6rem;
  font-weight: 700;
  letter-spacing: .15em;
  text-align: center;
  color: var(--cor-texto);
  user-select: all;          /* um clique seleciona a senha inteira */
  word-break: break-all;
}

/* Recuperação de senha: os campos pedem um quadro mais largo, e os campos
   curtos (IE/município, número/valor da nota) ficam lado a lado onde couber. */
.login__caixa--larga { max-width: 520px; }
.recuperar__dupla { display: grid; gap: .85rem; }

@media (min-width: 480px) {
  .recuperar__dupla { grid-template-columns: 1fr 1fr; }
}

/* --------------------------------------------------------------------------
   11. Utilitários e componentes menores
   -------------------------------------------------------------------------- */
.pilha    { display: grid; gap: .75rem; }
.linha    { display: flex; gap: .5rem; flex-wrap: wrap; align-items: center; }
.direita  { text-align: right; }
.centro   { text-align: center; }
.suave    { color: var(--cor-texto-suave); }
.pequeno  { font-size: .8rem; }
.mono     { font-family: var(--fonte-mono); }
.sem-margem { margin: 0; }

/* Indicador de carregamento em linha. */
.girando {
  width: 1rem; height: 1rem;
  border: 2px solid var(--cor-borda);
  border-top-color: var(--cor-marca);
  border-radius: 50%;
  display: inline-block;
  animation: girar .7s linear infinite;
}
@keyframes girar { to { transform: rotate(360deg); } }

@media (prefers-reduced-motion: reduce) {
  .girando { animation-duration: 2s; }
  * { transition: none !important; }
}

/* Botão de tema claro/escuro. O rótulo visível indica o modo para o qual o
   clique leva; qual dos dois aparece é decidido pelo data-tema do <html>. */
.tema-alternar__claro { display: none; }
:root[data-tema="escuro"] .tema-alternar__claro  { display: inline; }
:root[data-tema="escuro"] .tema-alternar__escuro { display: none; }

/* Nas telas de login não há barra superior: o botão flutua no canto. */
.tema-alternar--flutuante {
  position: fixed;
  top: .75rem;
  right: .75rem;
  z-index: 10;
}

/* Conferência de sequência: um quadrinho por número de nota. */
.sequencia { display: flex; flex-wrap: wrap; gap: 2px; font-size: .65rem; }
.sequencia__item {
  min-width: 1.4rem;
  padding: .15rem .2rem;
  text-align: center;
  border-radius: 3px;
  font-family: var(--fonte-mono);
  cursor: default;
}
.sequencia__item--ok          { background: var(--cor-sucesso-fundo); color: var(--cor-sucesso); }
.sequencia__item--sem_arquivo { background: var(--cor-aviso-fundo);   color: var(--cor-aviso); font-weight: 700; }
.sequencia__item--sem_registro{ background: var(--cor-erro-fundo);    color: var(--cor-erro);  font-weight: 700; }

/* Saída de processos longos (importação). */
.terminal {
  background: #0f141b;
  color: #cfe3f7;
  font-family: var(--fonte-mono);
  font-size: .78rem;
  padding: .85rem;
  border-radius: var(--raio-p);
  max-height: 22rem;
  overflow: auto;
  white-space: pre-wrap;
  word-break: break-word;
}

/* Aviso de expiração da sessão (templates/parciais/sessao.php).
   Fica por cima de tudo, escurecendo o resto da tela, para não passar
   despercebido em uma aba deixada aberta a manhã inteira. */
.sessao-aviso {
  position: fixed;
  inset: 0;
  z-index: 100;
  display: flex;
  align-items: center;
  justify-content: center;
  padding: 1rem;
  background: rgba(15, 20, 27, .55);
}
.sessao-aviso[hidden] { display: none; }

.sessao-aviso__caixa {
  background: var(--cor-superficie);
  color: var(--cor-texto);
  border: 1px solid var(--cor-borda);
  border-radius: var(--raio);
  box-shadow: var(--sombra-alta);
  padding: 1.25rem;
  max-width: 24rem;
  width: 100%;
  text-align: center;
}
.sessao-aviso__titulo { font-size: 1.05rem; margin: 0 0 .5rem; }
.sessao-aviso__texto  { font-size: .85rem; color: var(--cor-texto-suave); margin: 0 0 .75rem; }
.sessao-aviso__contador {
  font-family: var(--fonte-mono);
  font-size: 2rem;
  font-weight: 700;
  line-height: 1;
  margin: 0 0 1rem;
  color: var(--cor-erro);
}
.sessao-aviso__acoes { display: flex; gap: .5rem; justify-content: center; flex-wrap: wrap; }

/* --------------------------------------------------------------------------
   12. Impressão
   -------------------------------------------------------------------------- */
@media print {
  .topo, .menu, .filtros, .paginacao, .grade__acoes, .rodape, .botao,
  .sessao-aviso { display: none !important; }
  /* Papel é sempre branco: no modo escuro o texto claro sumiria na impressão. */
  body { background: #fff; color: #000; }
  .cartao, .grade__tabela thead th { background: #fff; color: #000; }
  .cartao { border: 0; box-shadow: none; }
  .grade__tabela { font-size: 10pt; }
}
