/* =====================================================================
 *  KRELATORIO — SO O QUE O PRODUTO ACRESCENTA
 *
 *  Ordem de carga (declarada no index.html):
 *    1. krigs-tokens.css       tokens oficiais da plataforma  (nao alterar)
 *    2. krigs-componentes.css  componentes oficiais           (nao alterar)
 *    3. krelatorio-tokens.css      tokens de navegacao do produto
 *    4. krelatorio.css             ESTE arquivo: a moldura
 *
 *  Aqui vive somente o que o Design System nao entrega pronto: a moldura
 *  (menu lateral, barra superior, area de conteudo), a tela de entrada e
 *  a lampada do Assistente. Botao, campo, tabela, cartao, indicador,
 *  selo, alerta, estado vazio, aviso temporario, modal, responsividade e
 *  impressao ja vem dos componentes oficiais — reescrever qualquer um
 *  deles aqui seria a segunda implementacao do mesmo problema.
 *
 *  NENHUMA COR LITERAL. Toda cor vem de token (Documento 04 secao 2.1).
 * ===================================================================== */

/* =====================================================================
 *  TELA DE ENTRADA — componente oficial, referencia KEPI (secao 21).
 *  Os valores sao os do Documento 05 secao 3.1: cartao de 380px, raio de
 *  14px, respiro de 34/30 e a sombra propria da entrada. Nao ha
 *  alternador de tema aqui: a entrada e sempre o gradiente.
 * ===================================================================== */
#tela-entrada{
  position:fixed; inset:0; z-index:100;
  display:flex; flex-direction:column; align-items:center; justify-content:center; gap:14px;
  background:var(--grad-entrada);
  padding:20px; overflow-y:auto;
}
/* Sessao guardada: a entrada nao chega a ser pintada (ver o script do
 * <head>). Sem isto, quem ja esta dentro ve a tela de entrada piscar a
 * cada F5 — um round-trip inteiro depois. */
html.com-sessao #tela-entrada{ display:none }

.entrada-cartao{
  background:var(--branco); color:var(--texto);
  border-radius:14px; box-shadow:var(--entrada-sombra);
  padding:34px 30px; width:100%; max-width:380px;
}
.entrada-marca{ text-align:center; margin-bottom:22px }
.entrada-marca .placa{
  display:inline-flex; align-items:center; justify-content:center;
  min-width:84px; max-width:290px; min-height:66px; padding:16px 24px;
  border-radius:18px; background:var(--grad-placa);
}
/* A marca sobre fundo escuro e SEMPRE a versao branca
 * (`logo-krigs-login.png`). Nunca `logo-krigs-white.png`: esse arquivo e
 * byte a byte igual ao navy, e a placa azul-marinho sobre azul-marinho
 * faz a marca desaparecer. Documento 04 secao 6.1. */
.entrada-marca .placa img{ max-width:100%; max-height:56px; width:auto; display:block }
.entrada-marca h1{ font-size:20px; margin:14px 0 2px }
.entrada-marca p{ color:var(--cinza); margin:0; font-size:14px }
/* Erro da entrada vai NO CARTAO, nao em aviso temporario: a tela de
 * entrada nao tem a area de avisos montada (Documento 05 secao 3.1). */
.entrada-erro{ color:var(--vermelho); font-size:13px; margin-top:10px; min-height:18px }
.entrada-links{ text-align:center; margin-top:14px; font-size:13px }
.entrada-links a[aria-disabled="true"]{ color:var(--cinza); pointer-events:none; text-decoration:none }
.entrada-rodape{ text-align:center; color:var(--entrada-rodape); font-size:12px; margin:0 }
/* A mensagem boa (codigo reenviado, senha redefinida) nao sai em vermelho:
 * vermelho diz "deu errado" a quem acabou de acertar. */
.entrada-erro.ok{ color:var(--verde, #15803d) }
.entrada-ajuda{ text-align:center; color:var(--cinza); font-size:12px; line-height:1.45; margin:12px 0 0 }
/* O codigo se le em blocos: letra grande, espacada e centralizada, como
 * aparece no e-mail. No celular o teclado numerico abre sozinho
 * (inputmode=numeric). */
.entrada-codigo{ text-align:center; font-size:22px !important; letter-spacing:8px;
  font-variant-numeric:tabular-nums }

/* =====================================================================
 *  MOLDURA — menu lateral, barra superior e conteudo.
 *
 *  Componente OFICIAL da plataforma: a referencia de layout e o KFROTA
 *  (Constituicao secao 20). Muda o que a secao 20 autoriza — quais
 *  modulos existem, quem ve cada um e em que categoria ficam. Estrutura,
 *  largura, espacamento, tipografia, cor, selecao, hover, rolagem,
 *  responsividade e comportamento de gaveta sao COPIA, nao aproximacao.
 * ===================================================================== */
#app{
  display:grid;
  /* minmax(0, ...) e nao 1fr solto: `1fr` quer dizer
     `minmax(auto, 1fr)`, e esse `auto` de minimo faz a faixa se
     recusar a ficar menor que o conteudo mais largo que tem dentro.
     Uma tabela de oito colunas empurrava a faixa para 685px dentro de
     um telefone de 374px, e a pagina inteira passava a rolar de lado,
     com menu e cabecalho junto. Vai em par com o min-width:0 do
     #conteudo: um sem o outro nao resolve. */
  grid-template-columns:var(--nav-w) minmax(0, 1fr);
  grid-template-rows:60px 1fr;
  height:100vh;
}
#app[hidden]{ display:none }

.sidebar{
  grid-row:1/3;
  background:linear-gradient(180deg,var(--nav-fundo-1),var(--nav-fundo-2));
  color:var(--nav-texto);
  display:flex; flex-direction:column;
  padding:16px 12px; overflow-y:auto;
}
.sidebar .marca{
  display:flex; flex-direction:column; align-items:flex-start; gap:6px;
  padding:6px 8px 18px;
  border-bottom:1px solid var(--nav-linha); margin-bottom:12px;
}
.sidebar .marca img{ width:100%; max-width:176px; height:auto; display:block }
.sidebar .marca .empresa{
  display:block; font-size:11px; font-weight:700; letter-spacing:2px;
  color:var(--nav-suave); text-transform:uppercase; padding-left:2px;
}
.sidebar .marca .empresa:empty{ display:none }

.nav-item{
  display:flex; align-items:center; gap:11px;
  padding:10px 12px; border-radius:10px;
  color:var(--nav-texto); font-weight:500; font-size:14px;
  margin-bottom:3px; cursor:pointer; transition:.12s;
  background:none; border:0; width:100%; text-align:left;
  font-family:inherit;
}
.nav-item .ic{ width:18px; height:18px; display:grid; place-items:center; opacity:.9; flex:none }
.nav-item:hover{ background:var(--nav-hover); color:var(--branco); text-decoration:none }
.nav-item.ativo{
  background:var(--azul); color:var(--branco);
  box-shadow:0 4px 12px var(--nav-sombra-ativo);
}
/* Categoria e SO um titulo: nao abre, nao fecha e nao esconde nada. */
.nav-sep{
  font-size:10.5px; text-transform:uppercase; letter-spacing:.7px;
  color:var(--nav-rotulo); padding:14px 12px 6px;
}
.sidebar .rodape{
  margin-top:auto; font-size:10.5px; color:var(--nav-rotulo);
  padding:12px 8px 4px; border-top:1px solid var(--nav-linha);
}
.sidebar .rodape b{ color:var(--nav-suave); letter-spacing:.4px }

.topbar{
  grid-column:2;
  display:flex; align-items:center; justify-content:space-between;
  background:var(--branco); border-bottom:1px solid var(--linha);
  padding:0 22px; box-shadow:var(--sombra);
}
.topbar h2{ font-size:17px; font-weight:700 }
.topbar .direita{ display:flex; align-items:center; gap:14px }

.empresa-switch{ display:flex; align-items:center; gap:7px; font-size:13px; color:var(--cinza) }
.empresa-switch select{
  padding:6px 9px; border:1px solid var(--linha); border-radius:var(--raio-sm);
  font-family:inherit; font-size:13px; background:var(--branco); color:var(--texto);
}

/* Cabecalho do usuario (`user-chip`): avatar, nome e — obrigatorio — o
 * E-MAIL da conta em uso. Responde a pergunta "com qual conta eu estou?",
 * comum em quem administra varias empresas (Documento 05 secao 3.4). */
.user-chip{ display:flex; align-items:center; gap:10px }
.user-chip .avatar{
  width:34px; height:34px; border-radius:50%;
  background:var(--azul-900); color:var(--branco);
  display:grid; place-items:center; font-weight:700; font-size:13px;
}
.user-chip .quem{ line-height:1.2; min-width:0 }
.user-chip .nome{ font-weight:600; font-size:13px }
.user-chip .email{
  font-size:11px; color:var(--cinza);
  max-width:190px; overflow:hidden; text-overflow:ellipsis; white-space:nowrap;
}
.btn-icone{
  background:var(--branco); color:var(--texto);
  border:1px solid var(--linha); border-radius:var(--raio-sm);
  padding:7px 9px; cursor:pointer; display:inline-flex; align-items:center;
  /* Alvo de toque minimo de 40x40 no celular (Documento 04 secao 12). */
  min-width:40px; min-height:36px; justify-content:center;
}
.btn-icone:hover{ background:var(--azul-claro) }

/* A area de conteudo.
 *
 * O `width:100%` NAO e redundante, e a falta dele foi um defeito real
 * visto no navegador: `.conteudo` dos componentes oficiais traz
 * `max-width:1100px; margin:0 auto`, e margem automatica num ITEM DE
 * GRADE nao centraliza, ela encolhe o item para a largura do conteudo.
 * O painel abria com os indicadores empilhados numa coluna de 240px, no
 * meio da tela. Com a largura explicita, a margem automatica volta a
 * fazer o que se espera dela: centralizar dentro do limite de 1100px.
 *
 * E o motivo de nao consertar isso no arquivo oficial: ele e copia da
 * plataforma e nao se altera. O ajuste pertence a quem monta a moldura. */
#conteudo{
  grid-column:2; overflow-y:auto; width:100%;
  /* min-width:0 E O QUE FAZ O SISTEMA CABER NO CELULAR, e a falta dele
     era defeito de tela INTEIRA, e nao de uma tabela.

     #app e uma grade, e item de grade nasce com min-width:auto: ele se
     recusa a encolher abaixo do conteudo mais largo que tem dentro. Uma
     tabela de oito colunas media 616px de conteudo minimo, entao a
     coluna da grade inchava para 685px dentro de um telefone de 374px, e
     a PAGINA INTEIRA passava a rolar de lado: o menu, a barra do topo e
     o cabecalho junto. Medido no navegador, num quadro de 390px: #app
     com 359px e #conteudo com 685px dentro dele.

     Com min-width:0 a coluna encolhe, e quem rola passa a ser a tabela
     dentro do proprio .tabela-wrap, que ja tem overflow-x:auto para
     isso. A pagina para de andar de lado e o cabecalho volta a caber. */
  min-width:0;
}

/* COLISAO DE CLASSE nos componentes oficiais, corrigida aqui.
 *
 * O arquivo oficial usa `.num` para duas coisas diferentes: a coluna
 * NUMERICA de tabela, que e alinhada a direita, e o NUMERO do indicador
 * do painel, que nao tem alinhamento declarado no Documento 04. As duas
 * regras casam no mesmo elemento, e o numero do indicador saia colado na
 * direita do cartao, longe do rotulo dele. Foi visto no navegador, nao
 * deduzido.
 *
 * O arquivo oficial nao se altera, entao o desempate mora aqui. Esta
 * divergencia vale para TODO produto que usar os dois componentes na
 * mesma tela: registrada no TODO para subir ao dono da plataforma. */
.stat .num{ text-align:left }

/* Cabecalho de pagina: titulo e subtitulo a esquerda, UM botao primario
 * a direita (Documento 05 secao 3.6). */
.pagina-cab{
  display:flex; align-items:flex-start; justify-content:space-between;
  gap:14px; flex-wrap:wrap; margin-bottom:18px;
}
.pagina-cab .acoes{ display:flex; gap:10px; flex-wrap:wrap }
.filtros{ display:flex; gap:10px; align-items:center; flex-wrap:wrap; margin-bottom:14px }
.filtros input,.filtros select{
  padding:9px 11px; border:1px solid var(--linha); border-radius:var(--raio-sm);
  font-family:inherit; font-size:14px; background:var(--branco); color:var(--texto);
}
.filtros input{ min-width:240px }
.aviso-limite{ font-size:12px; color:var(--cinza-2); margin-top:8px }

/* Bloco de duas colunas que vira uma no notebook (escada oficial). */
.cards-2{ display:grid; grid-template-columns:1.5fr 1fr; gap:16px }

/* =====================================================================
 *  TELA DE CAM — o esqueleto que o NUCLEO preenche.
 *
 *  A navegacao, a permissao e a chamada de API destas telas funcionam de
 *  verdade; o desenho (editor de geometria, previa do nesting, simulacao
 *  do percurso) e escrito por quem faz o nucleo CAM. O palco existe aqui
 *  para que a moldura nao precise mudar quando o conteudo chegar.
 * ===================================================================== */
.palco-cam{
  border:1px dashed var(--linha); border-radius:var(--raio);
  background:var(--branco); min-height:320px;
  display:grid; place-items:center; text-align:center;
  padding:32px 20px; color:var(--cinza-2);
}
.palco-cam h3{ color:var(--texto); margin-bottom:6px }
.palco-cam p{ max-width:52ch; margin:0 auto }

/* =====================================================================
 *  ASSISTENTE KRIGS — lampada flutuante e painel lateral.
 *  Constituicao secao 22: uma lampada no canto inferior direito, dentro
 *  do sistema, NUNCA na tela de entrada, e nenhuma entrada de menu.
 * ===================================================================== */
.ak-botao{
  position:fixed; right:20px; bottom:20px; z-index:90;
  width:52px; height:52px; border-radius:50%;
  background:var(--azul-2); color:var(--branco);
  border:0; cursor:pointer; display:grid; place-items:center;
  box-shadow:var(--sombra-lg);
}
.ak-botao:hover{ background:var(--azul) }
.ak-botao[hidden]{ display:none }

.ak-painel{
  position:fixed; top:0; right:0; bottom:0; z-index:95;
  width:420px; max-width:100vw;
  background:var(--branco); color:var(--texto);
  border-left:1px solid var(--linha); box-shadow:var(--sombra-lg);
  display:flex; flex-direction:column;
  transform:translateX(100%); transition:transform .22s ease;
}
.ak-painel.aberto{ transform:none }
.ak-painel[hidden]{ display:none }
.ak-painel .ak-cab{
  background:var(--grad-institucional); color:var(--branco);
  padding:16px 18px; display:flex; align-items:center; justify-content:space-between;
}
.ak-painel .ak-cab b{ font-size:15px }
.ak-painel .ak-cab button{ background:none; border:0; color:var(--branco); cursor:pointer }
.ak-painel .ak-busca{ padding:14px 18px; border-bottom:1px solid var(--linha) }
.ak-painel .ak-busca input{
  width:100%; padding:10px 12px; border:1px solid var(--linha);
  border-radius:var(--raio-sm); font-family:inherit; font-size:15px;
  background:var(--branco); color:var(--texto);
}
/* Rolagem CONTIDA: nao "vaza" para a pagina (Documento 05 secao 3.14). */
.ak-painel .ak-corpo{ flex:1; overflow-y:auto; overscroll-behavior:contain; padding:14px 18px }
.ak-artigo{ border-bottom:1px solid var(--linha); padding:12px 0 }
.ak-artigo:last-child{ border-bottom:0 }
.ak-artigo h4{ font-size:14px; margin-bottom:4px }
.ak-artigo .disciplina{ font-size:11px; color:var(--cinza-2); text-transform:uppercase }
.ak-artigo ol{ margin:8px 0 0 18px; font-size:13.5px; color:var(--cinza) }
.ak-artigo ol li{ margin-bottom:4px }

/* A classe que TRAVA a rolagem do fundo com o painel aberto. Ela existe
 * na folha de estilo de proposito: um sistema da plataforma aplicou esta
 * classe pelo JavaScript durante duas versoes sem que houvesse regra
 * nenhuma para ela, e o efeito simplesmente nao acontecia. Classe escrita
 * e contrato, e um teste de convencao confere que a regra existe. */
body.sem-rolagem{ overflow:hidden }

/* Cobertura da gaveta no celular. */
.cobertura{
  position:fixed; inset:0; z-index:40;
  background:var(--cobertura); border:0; padding:0;
}
.cobertura[hidden]{ display:none }

/* Botao de gaveta: some no desktop. */
.hamburguer{ display:none }

/* =====================================================================
 *  RESPONSIVIDADE — a escada oficial. O produto so trata os degraus da
 *  MOLDURA; tabela, formulario, campo e indicador ja sao tratados pelos
 *  componentes oficiais.
 * ===================================================================== */
@media (max-width:1100px){
  .cards-2{ grid-template-columns:1fr }
}

@media (max-width:860px){
  #app{ grid-template-columns:1fr }
  .sidebar{
    position:fixed; top:0; left:0; bottom:0;
    width:min(82vw,var(--nav-w)); z-index:50;
    transform:translateX(-100%); transition:transform .22s ease;
  }
  .sidebar.aberta{ transform:none; box-shadow:var(--sombra-lg) }
  .topbar,#conteudo{ grid-column:1 }
  /* Uma coluna so, e ela encolhe. Sem o minmax, a faixa unica herdaria o
     mesmo minimo de conteudo e o telefone continuaria rolando de lado. */
  #app{ grid-template-columns:minmax(0, 1fr) }
  .hamburguer{ display:inline-flex }
  .user-chip .quem{ display:none }
  .ak-painel{ width:100vw }
}

@media (max-width:560px){
  .topbar{
    padding:8px 12px; gap:8px;
    /* A BARRA QUEBRA EM DUAS LINHAS em vez de empurrar a pagina.
       Medido: o lado direito tinha 572px num telefone de 374px. */
    flex-wrap:wrap; min-width:0;
  }
  /* A altura da faixa deixa de ser fixa, senao a segunda linha e
     cortada pela grade de 60px. */
  #app{ grid-template-rows:auto 1fr }
  .topbar h2{ font-size:15px }
  /* A QUEBRA TEM DE SER AQUI, e nao so na `.topbar`: o seletor de
     empresa e filho de `.direita`, entao e `.direita` que precisa
     deixar quebrar. Com a quebra so na barra, o seletor ia para o fim
     da MESMA linha e a barra inteira passava a rolar de lado, cortando
     "Minha Conta" pela esquerda. */
  .topbar .direita{
    /* Base ZERO, e nao `auto`: com base automatica a caixa reivindica a
       largura do conteudo dela ANTES de quebrar por dentro, e o seletor
       de empresa inteiro entrava nessa conta. A barra quebrava logo na
       primeira linha e o titulo ficava sozinho numa faixa inteira. */
    min-width:0; flex:1 1 0; justify-content:flex-end;
    gap:8px; flex-wrap:wrap; row-gap:6px;
  }
  /* O SELETOR DE EMPRESA VAI PARA A SEGUNDA LINHA, inteiro.
     Disputando espaco na mesma linha que os botoes ele perdia: os
     botoes nao encolhem e o <select> absorvia todo o aperto, ficando
     com uns 20px, inutil. Em linha propria ele tem a largura toda, que
     e o que um nome de razao social precisa.
     O rotulo "Empresa" some: o proprio seletor diz o que ele e. */
  .empresa-switch{ order:9; flex:1 0 100%; min-width:0; margin-top:2px }
  .empresa-switch label{ display:none }
  .empresa-switch select{ min-width:0; width:100%; min-height:40px }
  /* Alvo de dedo: 40px de altura no que se toca. */
  .topbar .btn, .topbar .btn-icone{ min-height:40px }
  .filtros input{ min-width:0; width:100% }
}

/* =====================================================================
 *  IMPRESSAO — a moldura some; o conteudo vai ao papel.
 *  O resto do bloco de impressao esta em krigs-componentes.css.
 * ===================================================================== */
@media print{
  #app{ display:block; height:auto }
  .sidebar,.topbar,.ak-botao,.ak-painel,.cobertura,#tela-entrada,
  .pagina-cab .acoes,.filtros,.hamburguer,.empresa-switch,.aviso-limite{
    display:none !important;
  }
  #conteudo{ overflow:visible }
}

/* =====================================================================
   SELO AZUL - o unico acrescimo deste produto ao conjunto de selos.
   Ele marca a EMPRESA DA PLATAFORMA na lista de empresas, que e a unica
   linha que nao e cliente e nao pode ser confundida com uma.
   Usa os tokens OFICIAIS, sem inventar cor nova: --azul-claro no fundo e
   --azul no texto, exatamente como o selo verde usa o par do verde.
   ===================================================================== */
.badge.azul{ background:var(--azul-claro); color:var(--azul) }

/* =====================================================================
   LARGURA E ALINHAMENTO DO FORMULARIO - a grade de doze colunas.

   O QUE HAVIA, E POR QUE NAO SERVIA
   Os componentes oficiais entregam `.form-grid` com DUAS colunas e
   `.campo.full` ocupando as duas (krigs-componentes.css, linha 60). Duas
   larguras possiveis, metade e inteiro: um campo de hora, "07:00", ficava
   do mesmo tamanho de "Observacoes do cliente, supervisao de
   construcao"; e quem precisava de mais que metade levava a linha
   inteira, entao a pagina ganhava um degrau a cada duas linhas. O dono
   recusou a tela: "ficou muito desalinhado as caixas, quero que melhore,
   alinhe tudo".

   O QUE MUDA
   A faixa passa a ter DOZE colunas e cada campo diz quantas ocupa, pela
   classe `l-1` ate `l-12` que o motor de tela escreve. Doze porque
   divide certo por 2, 3, 4 e 6: meia faixa, um terco, um quarto e um
   sexto fecham sem sobra de pixel no fim da linha.

   O ATIVO OFICIAL NAO FOI TOCADO. `krigs-tokens.css` e
   `krigs-componentes.css` continuam identicos, byte a byte. O que ha
   aqui e sobreposicao, que e o unico caminho que o produto tem.
   ===================================================================== */
.form-grid{
  /* `minmax(0,1fr)` e nao `1fr`: uma faixa de `1fr` nunca encolhe abaixo
     do conteudo dela, e um <select> com "JOB_1699 · EXPANSAO LAMINACAO"
     dentro esticaria a faixa e empurraria a linha inteira para o lado.
     Com o minimo em zero quem encolhe e a caixa, que ja tem width:100%. */
  grid-template-columns:repeat(12,minmax(0,1fr));
  /* Cada campo fica na altura do proprio conteudo, e nao esticado ate a
     altura do vizinho mais alto. Hoje isso nao se ve, porque o campo nao
     tem fundo nem borda; no dia em que tiver, a caixa esticada apareceria
     como um retangulo alto sem motivo ao lado de um campo baixo. */
  align-items:start;
}

/* As doze larguras. E so isto que a classe faz. */
.campo.l-1 { grid-column:span 1 }
.campo.l-2 { grid-column:span 2 }
.campo.l-3 { grid-column:span 3 }
.campo.l-4 { grid-column:span 4 }
.campo.l-5 { grid-column:span 5 }
.campo.l-6 { grid-column:span 6 }
.campo.l-7 { grid-column:span 7 }
.campo.l-8 { grid-column:span 8 }
.campo.l-9 { grid-column:span 9 }
.campo.l-10{ grid-column:span 10 }
.campo.l-11{ grid-column:span 11 }
.campo.l-12{ grid-column:span 12 }

/* ---- ALTURA PREVISIVEL DA FAIXA: o rotulo ---------------------------
   Numa faixa estreita o rotulo quebra em duas linhas ("Torque
   especificado (N·m)" nao cabe nos 159px de um campo de largura 2) e
   empurra a caixa dele para baixo: uma faixa inteira desalinha por causa
   de um rotulo. Reservar DUAS linhas de rotulo para todos custa 16px por
   faixa e devolve a caixa sempre na mesma altura.
   `2.5em` com entrelinha `1.25` sao exatamente duas linhas do proprio
   rotulo: se o tamanho da fonte mudar um dia, a reserva acompanha
   sozinha, sem numero de pixel escrito a mao.
   NAO se usou `subgrid`, que alinharia sem reserva nenhuma: ele daria
   DOIS resultados visuais conforme o navegador do aparelho, e um sistema
   com dez anos de manutencao pela frente nao pode ter duas telas.
   -------------------------------------------------------------------- */
.form-grid > .campo > label,
.grade-linha > .campo > label{ line-height:1.25; min-height:2.5em }

/* ---- ALTURA PREVISIVEL DA FAIXA: a mensagem de erro -----------------
   A reserva de 16px que vem do componente oficial FICA, e por dois
   motivos. Primeiro: o servidor recusa varios campos de uma vez, e sem a
   reserva cada mensagem que aparece empurra tudo que esta abaixo, ou
   seja, o formulario pula debaixo do dedo de quem esta lendo. Segundo: a
   reserva faz toda caixa terminar na mesma altura, e e isso que fecha a
   faixa alinhada.
   O que muda aqui e so a entrelinha. Texto de 12px com a entrelinha do
   corpo (1.45) ocupa 17.4px e estoura os 16px reservados, deslocando a
   pagina em 1.4px por campo com erro. Com 16px cravados, a primeira
   linha de erro cabe EXATAMENTE na reserva e nada se move.
   -------------------------------------------------------------------- */
.form-grid .msg-erro{ line-height:16px }

/* ---- O GRUPO DO CABECALHO ------------------------------------------
   "Horario de trabalho", "Condicoes do tempo". Era um <h3> solto entre
   duas grades de campos, e titulo solto nao diz onde o assunto comeca
   nem onde termina: lido de cima, parecia titulo do resto da pagina.
   Vira bloco, com a MESMA cara da grade e do bloco de fotos (mesma
   borda, mesmo raio, mesmo respiro, titulo em azul de 14px), para o
   formulario ser uma pilha de caixas iguais e nao tres desenhos
   diferentes na mesma tela.
   -------------------------------------------------------------------- */
.grupo{ border:1px solid var(--linha); border-radius:var(--raio);
        padding:12px 14px; margin:16px 0; background:var(--branco) }
.grupo-titulo{ margin:0 0 10px; font-size:14px; color:var(--azul) }
/* A explicacao do grupo inteiro, quando existe, fica entre o titulo e os
   campos. `> .dica` e filho DIRETO de proposito: a dica de dentro do
   campo e outra coisa e nao pode receber este respiro. */
.grupo > .dica{ display:block; margin:0 0 10px }

/* =====================================================================
   GRADES E FOTOS - o miolo dos relatorios da casa.
   A grade e a parte que se repete: efetivo por funcao no RDO, ponto de
   torque no RTOR, participante no RDDS. Ela e desenhada pelo motor de
   formulario a partir da declaracao do modulo, e nao escrita por tipo.
   ===================================================================== */
.grade{ border:1px solid var(--linha); border-radius:var(--raio);
        padding:12px 14px; margin:16px 0; background:var(--branco) }
.grade-cab{ display:flex; align-items:center; gap:8px; flex-wrap:wrap; margin-bottom:8px }
.grade-cab h3{ margin:0; font-size:14px; color:var(--azul); flex:1 }

/* A LINHA DA GRADE USA A MESMA GRADE DE DOZE do formulario, e por isso a
   coluna tambem honra `largura`: "Efetivo", de um digito, deixa de
   ocupar o mesmo espaco de "Nome".
   O que havia era `repeat(auto-fit,minmax(150px,1fr))`: toda coluna com
   a mesma largura minima de 150px e, pior, o NUMERO de faixas decidido
   pela largura da tela e nao pela declaracao. Uma grade de onze colunas
   ganhava seis faixas e transbordava para uma segunda faixa implicita
   que nao coincidia com a da linha de cima. Com doze colunas fixas todo
   registro quebra no MESMO ponto, e a coluna de um registro fica
   exatamente em cima da coluna do outro.
   A faixa de 40px do botao saiu junto. Ela existia porque `auto-fit` nao
   aceita faixa de tamanho `auto` ao lado (o navegador descartava a
   declaracao inteira, calado, e a grade virava uma coluna so, defeito
   real pego na prova de navegador). Sem `auto-fit` o problema deixa de
   existir, e o botao passa a ficar SEMPRE no mesmo lugar, o canto
   superior direito da linha, com 48px reservados no respiro da direita:
   40 do alvo minimo de toque mais os 8 do vao da grade. */
.grade-linha{ display:grid; grid-template-columns:repeat(12,minmax(0,1fr));
              gap:8px; align-items:start; position:relative;
              padding:10px 48px 10px 0;
              border-top:1px dashed var(--linha) }
.grade-linha:first-child{ border-top:none }
.grade-linha .campo{ margin:0 }
.grade-linha .btn-icone.remove{ position:absolute; top:10px; right:0; color:var(--vermelho) }

/* A AJUDA da coluna aparece SO NA PRIMEIRA LINHA. Ela explica a COLUNA e
   nao o registro: repetida nas cinquenta linhas de um relatorio de
   torque vira ruido, e ainda muda a altura de cada linha conforme o
   texto quebra. Na primeira linha ela continua inteira, e a primeira
   linha e onde a pessoa olha ao comecar a preencher. */
.grade-linha:not(:first-child) .campo .dica{ display:none }

/* A RESERVA DE ERRO NAO EXISTE DENTRO DA GRADE, ao contrario do
   formulario. Aqui ela seria espaco gasto com o que nao pode acontecer:
   o servidor devolve erro por NOME DE CAMPO (`erros[c.nome]`, em
   src/api/rotas.js) e a celula de grade se chama
   `g_pontos_3_torque_aplicado`, endereco que nenhuma mensagem tem. Vazia
   ela some, e o vao de 8px some junto; com texto dentro, ela volta. */
.grade-linha .msg-erro:empty{ display:none }
.grade-total{ margin:10px 0 0; padding-top:8px; border-top:2px solid var(--azul);
              font-size:13px; text-align:right }

.bloco-fotos{ border:1px solid var(--linha); border-radius:var(--raio);
              padding:12px 14px; margin:16px 0; background:var(--branco) }
.fotos-lista{ display:grid; grid-template-columns:repeat(auto-fill,minmax(210px,1fr));
              gap:12px; margin-top:10px }
.foto{ border:1px solid var(--linha); border-radius:var(--raio-sm); padding:8px;
       display:flex; flex-direction:column; gap:6px }
/* A foto do campo e retrato com frequencia. `contain` mostra a foto
   inteira; `cover` cortaria justamente a solda que o relatorio prova. */
.foto img{ width:100%; height:150px; object-fit:contain; background:#f1f3f6;
           border-radius:var(--raio-sm) }
.foto .foto-legenda, .foto .foto-etapa{ width:100%; padding:6px 8px; font-size:13px;
       border:1px solid var(--linha); border-radius:var(--raio-sm) }

/* =====================================================================
   RESPONSIVIDADE DO FORMULARIO - dois degraus, e so dois.

   TABLET, abaixo de 1000px: SEIS colunas, e a largura declarada vale
   METADE, com piso em 2. Nao e uma segunda tabela de larguras: e a mesma
   declaracao lida pela metade, entao ninguem precisa declarar largura
   duas vezes e nao ha como as duas discordarem.

   CELULAR, abaixo de 760px: UMA coluna, tudo inteiro. E regra do padrao
   KRIGS, e vale para as duas grades: a do formulario e a que se repete.

   ATENCAO A UMA DIVERGENCIA DELIBERADA. Os componentes oficiais quebram
   o `.form-grid` em uma coluna aos 860px (krigs-componentes.css, linha
   189). Aqui a quebra e aos 760px, com um degrau de seis colunas antes.
   O arquivo oficial NAO foi tocado: esta folha carrega depois dele e so
   sobrepoe `grid-template-columns`. Entre 760px e 860px, portanto, o
   K-RELATORIO mostra seis colunas onde o padrao mostraria uma. Fica
   registrado aqui porque divergencia que entra calada fica anos.
   ===================================================================== */
/* =====================================================================
   O TABLET CONTINUA COM DOZE COLUNAS, e isto foi decidido com conta.

   Existia aqui uma faixa intermediaria que remapeava para seis colunas,
   com a largura pela metade arredondada para cima e piso em 2. A
   intencao estava certa e a aritmetica nao fechava: metade com
   arredondamento e piso NAO preserva a soma. A linha "Horario de
   trabalho", que e 3+3+3+3=12, virava 2+2+2+2=8, e o quarto campo caia
   sozinho na linha seguinte. Medido nas declaracoes reais: 44 das 93
   linhas do sistema deixavam de fechar entre 760px e 1000px.

   Ou seja, o degrau que o dono recusou voltava no tablet, que e
   justamente onde ele disse que o sistema vai ser usado.

   O custo de manter doze colunas ate 760px cai sobre TRES celulas em
   todo o sistema: matricula no RDDS, e diferenca e diferenca_percentual
   no RTOR. As tres sao de leitura ou codigo curto. Nenhum campo de
   DIGITAR fica abaixo de 2, que nessa faixa da de 109px a 127px e cabe
   seletor com seta e caixa de hora. O campo de data ja foi resolvido na
   declaracao: todo campo de data esta em 3 e nao no 2 do padrao, porque
   o seletor nativo corta o ano abaixo de uns 140px.
   ===================================================================== */

@media (max-width:760px){
  /* `minmax(0,1fr)` e nao `1fr` tambem aqui, e no celular isto pesa
     mais que no computador: a faixa de `1fr` tem minimo `auto`, ou seja,
     o conteudo mais largo de dentro. Um <select> de JOB com "JOB_1699 ·
     EXPANSAO LAMINACAO SUL" tem min-content maior que a tela de 360px e
     empurraria a coluna inteira para fora, criando a rolagem lateral que
     o padrao proibe. Com o minimo em zero quem encolhe e a caixa. */
  .form-grid,.grade-linha{ grid-template-columns:minmax(0,1fr) }
  /* As doze precisam ser desfeitas UMA A UMA. `span 4` numa grade de uma
     coluna nao e ignorado: o navegador cria tres colunas implicitas para
     caber o span, e a tela volta a rolar para o lado, que e exatamente o
     que o padrao proibe no celular. */
  .campo.l-1,.campo.l-2,.campo.l-3,.campo.l-4,.campo.l-5,.campo.l-6,
  .campo.l-7,.campo.l-8,.campo.l-9,.campo.l-10,.campo.l-11,.campo.l-12{
    grid-column:1/-1;
  }
  /* Com a faixa inteira para um campo so, o rotulo nao quebra mais em
     duas linhas: reservar as duas seria gastar 16px por campo na tela
     onde o espaco vertical e o que falta. */
  .form-grid > .campo > label,
  .grade-linha > .campo > label{ min-height:0 }

  /* ALVO DE DEDO: 44px de altura em TUDO que se toca.

     Medido no quadro de 374px, na tela de lancar RDO: 12 dos 35 alvos
     estavam abaixo de 40px, incluindo "Criar e continuar", "+ Linha",
     "Camera" e o botao de remover linha. Quem preenche RDO as 17h esta
     de pe, de luva, com o celular numa mao: alvo pequeno erra o toque,
     e errar o toque no botao de remover linha apaga o trabalho.

     44px e a medida da mao com luva. Vale no formulario e na moldura,
     e nao vale na tabela de leitura, onde nada se toca. */
  #conteudo .btn,
  #conteudo .btn-icone,
  #conteudo input:not([type="checkbox"]):not([type="radio"]),
  #conteudo select,
  .form-acoes .btn{ min-height:44px }
  #conteudo .btn.peq{ min-height:40px }
  /* O botao de remover linha e o mais perigoso da tela: ele fica
     encostado nos campos e apaga sem pedir. Ganha area propria. */
  .grade-linha .btn-icone.remove{ min-width:44px; min-height:44px }

  .grade-linha{ gap:6px; padding:12px 0 10px }
  /* No celular a linha da grade e uma coluna so, entao o respiro da
     direita nao pode ficar na linha inteira: seriam 48px perdidos em
     TODOS os campos de uma tela de 360px. Quem se afasta do botao e so o
     primeiro campo, que e o unico que fica ao lado dele. */
  .grade-linha > .campo:first-child{ padding-right:48px }
  .grade-linha .btn-icone.remove{ top:6px }
  .fotos-lista{ grid-template-columns:1fr 1fr }
}

@media print{
  .grade-cab button, .bloco-fotos button, .foto button,
  #btn-camera, #btn-upload{ display:none !important }
  .grade, .bloco-fotos{ border:none; padding:0 }
  .foto img{ height:auto }
}

/* =====================================================================
   GESTAO DE RELATORIOS - o pouco de estilo que a tela nova precisou.

   Nenhuma regra daqui redefine classe existente: sao seletores novos, e
   por isso este bloco pode viver no fim do arquivo sem disputar cascata
   com nada. Onde havia componente pronto (cartao, tabela, alerta, selo),
   a tela usa o componente e nao inventa outro.
   ===================================================================== */

/* A FRASE DE COBERTURA embaixo do numero. Ela nao e legenda decorativa:
   e a parte do indicador que diz de quantos lancamentos aquele numero
   saiu e quantos ficaram de fora. Fica menor que o rotulo, porque e a
   terceira coisa que se le, e nunca escondida atras do mouse: no tablet
   em obra nao existe mouse. */
.stat .nota{
  margin-top:8px; font-size:12px; line-height:1.45; color:var(--cinza);
  /* O cartao respira ate tres linhas de frase sem empurrar os vizinhos,
     porque a grade de cartoes alinha pelo mais alto. */
  max-width:42ch;
}

/* Texto secundario dentro de celula e de alerta. Existia so como
   `.badge.cinza`; a forma solta faltava e cada tela resolvia no estilo
   embutido, que e o comeco de toda divergencia visual. */
.cinza{ color:var(--cinza) }

/* Titulo de secao DENTRO da pagina. Diferente do h2 solto: ele precisa
   de um respiro maior em cima, porque separa dois assuntos, e de quase
   nenhum embaixo, porque vem colado na frase que o explica. */
h2.secao{ margin:28px 0 4px }
h3.sub-secao{
  margin:18px 0 8px; font-size:14px; font-weight:700;
  text-transform:uppercase; letter-spacing:.4px; color:var(--cinza);
}

/* O par de botoes que troca a leitura do MESMO numero: por funcao ou por
   nome. Sao dois modos de ver, e nao dois filtros, e por isso ficam
   juntos e encostados, e nao espalhados na barra de filtros. */
.seg{ display:flex; gap:0; margin-bottom:12px; flex-wrap:wrap }
.seg .btn{ border-radius:0 }
.seg .btn:first-child{ border-radius:var(--raio-sm) 0 0 var(--raio-sm) }
.seg .btn:last-child { border-radius:0 var(--raio-sm) var(--raio-sm) 0; margin-left:-1px }
/* O modo ativo se declara pelo CONTRASTE, e nao so por uma borda: numa
   tela ao sol, borda de 1px nao diferencia nada. */
.seg .btn.ativo{
  background:var(--azul); color:var(--branco); border-color:var(--azul);
}
.seg .btn.ativo:hover{ background:var(--azul-2) }

/* Rotulo curto na barra de filtros. Sem ele o campo de data aparece
   vazio e ninguem sabe se e o comeco ou o fim do periodo. */
.filtro-rot{
  font-size:12px; font-weight:700; text-transform:uppercase;
  letter-spacing:.4px; color:var(--cinza);
}
/* Data nao precisa dos 240px do campo de busca: o seletor nativo cabe em
   170px com o ano inteiro visivel. */
.filtros input[type="date"]{ min-width:0; width:170px }

/* O rodape de soma da tabela. Vive fora do <table> de proposito: a
   tabela responsiva vira lista no celular, e um <tfoot> viraria mais uma
   linha de dados, com cara de JOB chamado "Total". */
.rodape-tabela{
  margin-top:10px; padding:10px 12px; font-size:13px;
  background:var(--bg); border:1px solid var(--linha);
  border-radius:var(--raio-sm); color:var(--texto);
}

/* As ressalvas de um indice. Lista curta, dentro do alerta que a
   carrega, nunca em nota de rodape: quem le o numero tem de ler a
   ressalva no mesmo lugar. */
.ressalvas{ margin:8px 0 0; padding-left:20px }
.ressalvas li{ margin:3px 0 }

@media (max-width:760px){
  /* No celular a barra de filtros empilha, e o rotulo passa a ocupar a
     largura inteira para nao ficar orfao ao lado do campo anterior. */
  .filtro-rot{ width:100%; margin-bottom:-4px }
  .filtros input[type="date"]{ width:100% }
  .seg{ width:100% }
  .seg .btn{ flex:1 }
}

@media print{
  /* Controle nao se imprime; o numero e a frase dele, sim. */
  .seg{ display:none !important }
  .stat .nota{ color:#333 }
}

/* O aviso de "repetido do dia anterior", dentro da grade.
   Ele fica na tela enquanto o formulário estiver aberto, e não some
   sozinho: quem repetiu a equipe precisa lembrar de conferir quem faltou,
   e um aviso que some em seis segundos não lembra ninguém. */
.grade-repetida { margin: 8px 0 0; font-size: 13px; line-height: 1.45 }

/* ---------------------------------------------------------------------
   LOGOTIPO DA EMPRESA (tela de Empresas)

   Um campo simples, como o dono pediu: a previa do que esta gravado, o
   botao de escolher e o de tirar. O quadro tem tamanho FIXO para a
   pagina nao pular de altura quando a marca entra ou sai, e o fundo
   xadrez claro existe para logotipo com fundo transparente aparecer, em
   vez de sumir no branco da tela.
   --------------------------------------------------------------------- */
.logo-caixa {
  display: flex; align-items: flex-start; gap: 12px; flex-wrap: wrap;
}
.logo-previa {
  width: 160px; height: 72px; flex: 0 0 auto;
  display: flex; align-items: center; justify-content: center;
  border: 1px dashed var(--borda, #cbd5e1); border-radius: 8px;
  background:
    linear-gradient(45deg, #f1f5f9 25%, transparent 25%, transparent 75%, #f1f5f9 75%),
    linear-gradient(45deg, #f1f5f9 25%, #fff 25%, #fff 75%, #f1f5f9 75%);
  background-size: 12px 12px;
  background-position: 0 0, 6px 6px;
  overflow: hidden;
}
.logo-previa img { max-width: 100%; max-height: 100%; object-fit: contain }
/* `min-width: 0` para o bloco encolher no celular em vez de empurrar a
   linha para fora da tela: sem ele o texto de ajuda estica o flex. */
.logo-acoes { flex: 1 1 200px; min-width: 0 }
.logo-acoes .dica { display: block; margin-top: 6px }

/* ---------------------------------------------------------------------
   MODAL CENTRALIZADO — remendo de um defeito do ATIVO OFICIAL

   Quem centraliza `dialog:modal` é o `margin:auto` da folha do próprio
   navegador. O `*{ margin:0 }` da linha 10 do `krigs-componentes.css`
   apaga esse padrão junto com os outros, e o resultado é que TODO modal
   do sistema abre grudado no canto superior esquerdo. Achado em
   10/09/2026, ao conferir a exclusão de colaborador na tela de Equipes.

   O remendo mora AQUI, e não lá, porque `krigs-componentes.css` é ativo
   oficial da plataforma e entra neste produto copiado sem alteração
   (docs/ESTRUTURA_DE_PASTAS.md). O conserto de verdade é na origem, e
   está registrado no TODO como pendência da plataforma: o mesmo defeito
   está no KFROTA, no KEPI e em todo produto que copiou o arquivo.

   O teto de altura com rolagem interna é para o modal alto não passar da
   tela do celular, que é onde o encarregado usa o sistema.
   --------------------------------------------------------------------- */
dialog.modal{ margin:auto; max-height:90dvh; overflow:auto }

/* Imagem do documento que não pôde ser carregada. Ela DIZ que faltou, em
   vez de deixar um quadro branco: quadro branco no papel é o defeito que
   ninguém percebe até o cliente perguntar cadê a foto. */
.doc-imagem-faltou{
  border:1px dashed var(--vermelho, #b42318); color:var(--vermelho, #b42318);
  border-radius:6px; padding:10px 12px; font-size:12px; text-align:center;
}

/* Campo que o SISTEMA preenche: o CPF que veio do cadastro de Equipes, o
   HH que o servidor calcula. Fundo diferente e cursor de texto normal
   para a pessoa entender, sem ler nada, que aquilo não é dela. Não vira
   `disabled`: campo desabilitado sai do formulário e some do documento. */
.campo input.so-leitura{
  background:#eef1f5; color:var(--cinza-2,#5b6472); cursor:default;
}

/* ---------------------------------------------------------------------
   CATÁLOGO DE TEMAS DE DDS
   Lista dentro do modal, com rolagem própria: são 121 temas e a caixa
   não pode crescer até sair da tela do celular.
   --------------------------------------------------------------------- */
.tema-lista{ max-height:52vh; overflow:auto; margin-top:10px }
.tema-item{
  border:1px solid var(--linha); border-radius:10px;
  padding:12px 14px; margin-bottom:10px;
}
.tema-item .tema-topo{ display:flex; align-items:center; gap:8px; flex-wrap:wrap }
.tema-item p{ margin:6px 0 10px }

/* Um bloco por quadro de assinatura na tela "Mandar para assinar". */
.link-papel{
  border:1px solid var(--linha); border-radius:10px;
  padding:12px 14px; margin-bottom:10px;
}
.link-papel-topo{ display:flex; align-items:center; gap:8px; margin-bottom:8px; flex-wrap:wrap }
/* As quatro saídas do quadro na mesma fileira, quebrando no celular. O
   link em si vai embaixo, inteiro, para quem prefere selecionar à mão. */
.link-acoes{ display:flex; gap:8px; flex-wrap:wrap; margin-bottom:8px }
.link-campo{ width:100%; font-size:12px; color:var(--cinza); padding:6px 8px;
             border:1px solid var(--linha); border-radius:var(--raio-sm); background:#f7f8fa }
/* A assinatura que está valendo, do tamanho de uma rubrica. Fundo branco
   com borda tracejada, igual ao quadro onde ela foi feita. */
.assinatura-atual{ display:flex; align-items:center; gap:14px; flex-wrap:wrap; margin-bottom:8px }
.assinatura-atual img{ width:180px; max-width:100%; height:70px; object-fit:contain;
                       background:#fff; border:1px dashed var(--linha); border-radius:var(--raio-sm) }
/* A CAIXA DE REFAZER. Fechada até alguém pedir: é a ação que tira prova
   de um documento, e ela não fica aberta no caminho de quem só veio
   copiar um link. Aberta, é amarela, como o cartão do KEPI. */
.refazer summary{ cursor:pointer; color:var(--vermelho); font-weight:600; font-size:13px;
                  padding:4px 0; width:max-content; max-width:100% }
.refazer-corpo{ background:var(--amarelo-claro); border:1px solid #e9c46a;
                border-radius:var(--raio-sm); padding:12px 14px; margin-top:8px }
.refazer-corpo p{ margin:0 0 10px; font-size:13px }
.refazer-corpo .campo{ margin-bottom:10px }

/* A CAIXA DE MARCAR DENTRO DO CABEÇALHO DA GRADE ("Mostrar a função no
   documento"). Texto do tamanho do botão ao lado, e alvo grande no
   celular: a caixa sozinha tem 13 px e o dedo erra. */
.grade-opcao{ display:inline-flex; align-items:center; gap:6px; font-size:13px;
              color:var(--texto); cursor:pointer; min-height:36px }
.grade-opcao input{ width:18px; height:18px; margin:0 }
/* A mesma caixa DENTRO de um campo (o Turno do RFAB): logo abaixo da
   escolha, sem a altura mínima de rótulo que os rótulos de campo têm. */
.form-grid > .campo > label.grade-opcao{ min-height:0; margin-top:6px; font-weight:600 }

/* ---------------------------------------------------------------------
   A ESCOLHA DO JOB POR BUSCA e a FICHA DO JOB.
   A lista abre colada embaixo da caixa, por cima do formulário, e rola
   sozinha quando passa de oito JOBs: no celular ela não pode empurrar a
   página nem sair da tela.
   --------------------------------------------------------------------- */
.busca-job{ position:relative }
.busca-job-lista{
  position:absolute; left:0; right:0; top:100%; z-index:40; margin-top:2px;
  background:var(--branco,#fff); border:1px solid var(--linha); border-radius:var(--raio-sm);
  box-shadow:0 8px 24px rgba(15,23,42,.14); max-height:320px; overflow:auto;
}
.busca-job-item{
  display:flex; flex-direction:column; align-items:flex-start; gap:2px; width:100%;
  text-align:left; background:none; border:0; border-bottom:1px solid var(--linha);
  padding:9px 12px; font:inherit; font-size:14px; color:var(--texto); cursor:pointer;
}
.busca-job-item:last-child{ border-bottom:0 }
.busca-job-item span{ font-size:12px; color:var(--cinza) }
.busca-job-item:hover, .busca-job-item.marcado{ background:var(--azul-claro,#e6efff) }
.busca-job-vazio{ padding:10px 12px; font-size:13px; color:var(--cinza) }

.ficha-job{
  display:flex; flex-wrap:wrap; gap:6px 18px; align-items:baseline;
  background:#f4f6f9; border:1px solid var(--linha); border-radius:var(--raio-sm);
  padding:8px 12px; margin-top:10px;
}
.ficha-job-item{ display:flex; flex-direction:column; min-width:0 }
.ficha-job-item .r{ font-size:11px; color:var(--cinza); text-transform:uppercase; letter-spacing:.02em }
.ficha-job-item .v{ font-size:13px; font-weight:600; color:var(--texto); overflow-wrap:anywhere }
.ficha-job-origem{ margin-left:auto; font-size:11px; color:var(--cinza) }

/* A função que veio do cadastro da pessoa escolhida. Mesmo aspecto do
   campo que o sistema preenche, porque é isso que ela passa a ser. */
.campo input.travado-cadastro{ background:#eef1f5; color:var(--cinza-2,#5b6472); cursor:default }

/* ---------------------------------------------------------------------
   ONDE ARRUMAR: quadro e asterisco LARANJA.
   Pedido do dono em 14/09/2026: "quando sair alerta, ficar um asterisco
   laranja ou um quadro laranja onde tem que arrumar, sempre". Laranja, e
   não o vermelho de erro dos componentes: vermelho diz que algo quebrou,
   laranja diz "falta você fazer isto aqui". Vence o `.invalido` e o foco,
   senão a marca some justamente quando o cursor entra no campo.
   --------------------------------------------------------------------- */
.campo.arrumar input:not([type=hidden]),
.campo.arrumar select,
.campo.arrumar textarea{
  border-color:#ea580c !important; border-width:2px;
  box-shadow:0 0 0 3px #ffedd5 !important;
}
/* Campo que ja tem asterisco nao ganha o segundo: o dele fica laranja.
 * Saia "Tempo pela manhã * *" (prova de tela, 14/09/2026). */
.campo.arrumar > label:not(.grade-opcao):not(.com-asterisco)::after{ content:" *"; color:#ea580c; font-weight:800 }
.campo.arrumar > label .asterisco{ color:#ea580c; font-weight:800 }
.campo.arrumar .msg-erro{ color:#c2410c; font-weight:600 }

/* A foto que acabou de entrar pisca uma vez, para quem voltou da câmera
   achar a foto nova sem procurar. */
.foto.foto-nova{ outline:3px solid var(--verde); outline-offset:2px; transition:outline-color .6s }

/* ---------------------------------------------------------------------
   OS BOTÕES DA LINHA, na mesma caixa.

   Antes eram botões soltos separados por espaço em branco: com quatro
   deles a linha quebrava em qualquer lugar, e "Excluir" caía sozinho
   embaixo, longe do que ele apaga. Numa grade flex eles ficam do mesmo
   tamanho, quebram juntos e alinhados à direita, e o vermelho fica onde
   o olho procura, no fim.
   --------------------------------------------------------------------- */
.acoes-linha{
  display:flex; gap:5px; flex-wrap:wrap; justify-content:flex-end; align-items:center;
}
/* BOTÃO DE LINHA É MAIS APERTADO que botão de tela. Com quatro deles na
   última coluna, os 11 px de folga lateral de cada um somavam quase 40,
   e eram esses 40 que faziam a tabela passar da largura disponível. */
.acoes-linha .btn{ margin:0; white-space:nowrap; padding:6px 9px }
/* A COLUNA PEDE O QUE PRECISA, e quem cede é o resto da tabela.
   `width: 1%` sozinho deixava o navegador espremer a coluna até 124 px e
   os quatro botões caíam em três linhas. Com `min-width`, ela reserva a
   largura de uma linha de botões e as colunas de texto, que sabem
   quebrar, é que abrem mão. Se um dia nem assim couber, os botões
   quebram (`flex-wrap: wrap` acima) em vez de a tabela inteira passar a
   rolar de lado. */
td.acoes{ width:1%; min-width:300px; padding-left:6px }

/* NUNCA FORÇAR ROLAGEM LATERAL NA LISTA.
   Eu tinha posto `white-space: nowrap` aqui para os quatro botões nunca
   quebrarem, e o preço foi uma barra de rolagem horizontal por baixo da
   tabela inteira por causa de catorze pixels. O dono viu e mandou tirar:
   "tira, ficou feio". Ele está certo, e a ordem de prioridade é essa
   mesmo: com o espaçamento apertado os quatro cabem numa linha na tela
   de trabalho, que é o que ele pediu, e no dia em que não couberem eles
   quebram em silêncio, em vez de a tabela inteira passar a rolar. */

/* No celular a tabela vira CARTÃO (820px, regra do ativo oficial). Aí os
   botões ganham a linha inteira, lado a lado, em vez de se espremerem no
   canto direito de um cartão. */
@media (max-width:820px){
  .acoes-linha{ justify-content:flex-start }
  .acoes-linha .btn{ flex:1 1 auto; justify-content:center }
  td.acoes{ width:auto; min-width:0; padding-left:13px }
}

/* ---------------------------------------------------------------------
   A AJUDA DE IMPRESSÃO na tela do documento.

   Fechada por padrão: quem imprime todo dia já sabe, e quem está
   imprimindo pela primeira vez abre. Nunca sai no papel.
   --------------------------------------------------------------------- */
.doc-ajuda-impressao{
  border:1px solid var(--linha); border-radius:10px;
  background:var(--branco); padding:10px 14px; margin-bottom:14px;
}
.doc-ajuda-impressao summary{
  cursor:pointer; font-weight:600; font-size:14px; color:var(--azul-2);
}
.doc-ajuda-impressao ul{ margin:10px 0 2px; padding-left:20px; font-size:13.5px }
.doc-ajuda-impressao li{ margin-bottom:5px; color:var(--cinza) }
@media print{ .doc-ajuda-impressao{ display:none !important } }

/* =====================================================================
   CELULAR E IPAD: AJUSTE DE ENCAIXE (auditoria de 14/09/2026)

   Tudo o que está daqui para baixo saiu de medição por script em 412 px
   (celular), 768 px (iPad em pé), 1024 px (iPad Pro em pé) e 1366 px
   (iPad deitado), como administrador e como emitente. Nenhuma regra muda
   cor, tipografia, largura do menu ou desenho de componente: é encaixe,
   respiro, alvo de toque e rolagem de tabela. Cada bloco diz o que foi
   medido antes, para ninguém "limpar" a regra achando que sobra.
   ===================================================================== */

/* ---- A BARRA DO TOPO ------------------------------------------------
   1. O título ficava 6 px acima do centro dos botões em TODA largura: o
      `h2` herda `margin:0 0 12px` do componente oficial, e dentro de uma
      barra flex essa margem empurra o texto para cima.
   2. No iPad em pé (768 px) o título flutuava no meio da barra, longe do
      botão do menu. O KFROTA, que é a referência da moldura, cola o
      título no botão e corta com reticências abaixo de 860 px: é cópia.
   3. No celular, título comprido ("Gestão de relatórios", "Minha Conta")
      quebrava o lado direito em duas linhas, com o botão de tema sozinho
      numa e "Minha / Conta" partido na outra: a barra ia a 110 px. Parte
      disso era o seletor de empresa ESCONDIDO ocupando lugar, porque
      `.empresa-switch{display:flex}` vence o atributo `hidden`, e no
      celular ele ainda pede `flex:1 0 100%`, uma linha inteira vazia. */
.topbar h2{ margin:0 }

/* ---- `hidden` QUE NÃO ESCONDIA ----------------------------------------
   O atributo `hidden` só vale `display:none` na folha do navegador, e
   qualquer classe que declare `display` passa por cima dele. Medido nas
   telas: "Carregar mais" aparecia com "Mostrando 3 de 3" (`.form-acoes`),
   "Qual foi o motivo?" ficava aberto antes de escolher "Outro" na caixa
   de refazer assinatura (`.campo`), o "Cancelar" que o catálogo de temas
   manda sumir continuava lá (`.btn`), e o seletor de empresa escondido
   ocupava lugar na barra do topo. Seletores com a classe, e não um
   `[hidden]` geral com `!important`: o cabeçalho e o rodapé de impressão
   nascem com `hidden` e são mostrados no papel pela folha oficial. */
.empresa-switch[hidden],
.form-acoes[hidden],
.campo[hidden],
.btn[hidden]{ display:none }
@media (max-width:860px){
  .topbar{ padding:0 12px; gap:10px }
  .topbar .direita{ gap:10px }
  .topbar h2{
    flex:1 1 auto; min-width:0; font-size:16px;
    white-space:nowrap; overflow:hidden; text-overflow:ellipsis;
  }
}
@media (max-width:560px){
  .topbar{ padding:8px 12px; gap:8px }
  .topbar h2{ font-size:15px }
  .topbar .btn{ white-space:nowrap }
  .topbar .user-chip{ gap:6px }
  /* Sem seletor de empresa (todo perfil que não é o dono) a barra fica
     numa linha só: os botões mantêm o tamanho e quem cede é o título. O
     avatar sai, como no KFROTA, porque ali ele é o que sobra. Com o
     seletor de empresa visível continua valendo a quebra em duas linhas
     que está mais acima. */
  .topbar:has(#empresa-switch[hidden]){ flex-wrap:nowrap }
  .topbar:has(#empresa-switch[hidden]) .direita{ flex:0 0 auto; flex-wrap:nowrap }
  .topbar:has(#empresa-switch[hidden]) .user-chip .avatar{ display:none }
}

/* ---- ALTURA DA MOLDURA NO CELULAR ------------------------------------
   `100vh` no Safari do iPhone e no Chrome do Android é a altura com a
   barra de endereço RECOLHIDA. Com a barra à vista, o pé da área de
   conteúdo, que é quem rola, fica atrás dela, e o último botão da tela
   ("Criar e continuar", "Esquecer todos os aparelhos") some. `dvh`
   acompanha a barra. Só na tela: o papel tem regra própria. */
@media screen{
  @supports (height:100dvh){ #app{ height:100dvh } }
}

/* ---- O FIM DA PÁGINA NÃO FICA DEBAIXO DA LÂMPADA ---------------------
   Medido rolando até o fim: o botão "Excluir" da última linha de Equipes
   e o "Editar" da última linha de Acessos ficavam embaixo da lâmpada do
   Assistente, sem ter para onde rolar. O respiro no pé da área de
   conteúdo é a altura da lâmpada com a margem dela. */
@media screen{
  #conteudo{ padding-bottom:88px }
}
/* A lâmpada no celular e no tablet, com os números do KFROTA
   (public/css/app.css, bloco do Assistente abaixo de 820 px). */
@media (max-width:820px){
  .ak-botao{ right:14px; bottom:14px; width:48px; height:48px }
}

/* ---- O INDICADOR "EM RASCUNHO" ----------------------------------------
   Colisão de classe nos componentes oficiais, igual à do `.num` lá em
   cima. O indicador de natureza "alerta" recebe as classes `stat alerta`,
   e `.alerta` é também a caixa de aviso: borda de 1 px na cor do texto,
   outro respiro e margem embaixo. No painel o cartão "Em rascunho" saía
   com contorno preto, mais baixo e desalinhado dos outros três, em todas
   as larguras. Aqui ele volta a ser só um indicador com a barra laranja. */
.stat.alerta{
  border:1px solid var(--linha); border-left:4px solid var(--laranja);
  padding:16px 18px; margin-bottom:0; font-weight:400; color:inherit;
}

/* ---- O CABEÇALHO DA GRADE --------------------------------------------
   `flex:1` dá ao título base ZERO, e ele era o primeiro a ceder: no
   celular "Mão de obra" ficava espremido em 60 px, partido em "Mão de /
   obra", ao lado de "Mostrar a função no documento". Com base automática
   o título guarda a largura dele e quem desce de linha são os controles.
   No celular, quando há mais de um controle, o título fica com a linha
   dele e os botões vêm juntos embaixo. */
.grade-cab h3{ flex:1 1 auto }
@media (max-width:760px){
  .grade-cab:has(> :nth-child(3)) > h3{ flex-basis:100% }
}

/* ---- "SAIR NO RELATÓRIO" COLADO NA ESCOLHA ---------------------------
   A caixa do Turno do RFAB vinha DEPOIS da ajuda e da reserva de erro, a
   30 px da escolha e mais perto do campo de baixo ("Supervisor
   responsável") do que do dela. A regra da caixa já dizia "logo abaixo
   da escolha"; a ordem visual passa a cumprir isso. A ordem de tabulação
   não muda: é a do documento. */
.campo:has(> label.grade-opcao) > label.grade-opcao{ order:1 }
.campo:has(> label.grade-opcao) > .dica,
.campo:has(> label.grade-opcao) > .msg-erro{ order:2 }

/* ---- FICHA DO JOB: nada abaixo de 12 px ------------------------------ */
.ficha-job-item .r, .ficha-job-origem{ font-size:12px }

/* ---- ALVO DE TOQUE EM QUALQUER TELA DE TOQUE --------------------------
   Os 44 px de alvo só valiam abaixo de 760 px, e o iPad em pé tem 768:
   medido nele, TODO botão de linha tinha 27 px ("Ver", "Editar",
   "Excluir"), o de tela 36, "Minha Conta" e "Sair" 27, e os campos de
   legenda da foto 29. O critério certo não é a largura, é o dedo:
   `pointer:coarse` vale para celular e iPad em qualquer posição e não
   vale para o computador com mouse, onde a tela de trabalho continua
   exatamente como estava. */
@media (pointer:coarse){
  .topbar .btn, .topbar .btn-icone{ min-height:40px }
  #conteudo .btn,
  #conteudo .btn-icone,
  #conteudo input:not([type="checkbox"]):not([type="radio"]):not([type="hidden"]),
  #conteudo select,
  dialog.modal .btn,
  dialog.modal .btn-icone{ min-height:44px }
  #conteudo .btn.peq{ min-height:40px }
  .grade-linha .btn-icone.remove{ min-width:44px; min-height:44px }
  /* A caixa de marcar: o rótulo inteiro é o alvo. A do Turno tinha 18 px. */
  .grade-opcao{ min-height:44px }
  .form-grid > .campo > label.grade-opcao{ min-height:40px; margin-top:2px }
  /* "Como sair certo no papel" tinha 20 px e "Refazer assinatura" 27. O
     respiro vai para o `summary`, que é o que se toca, e sai da caixa,
     para ela não crescer. */
  .doc-ajuda-impressao{ padding-top:0; padding-bottom:0 }
  .doc-ajuda-impressao[open]{ padding-bottom:10px }
  .doc-ajuda-impressao summary{ padding:12px 0 }
  .refazer summary{ padding:13px 0 }
  /* "Reenviar código" e "Entrar com outra conta" tinham 19 px de altura:
     a área de toque cresce 11 px para cima e para baixo, e a margem
     negativa devolve o espaço, então o cartão não muda de tamanho. */
  .entrada-links a{ display:inline-block; padding:11px 0; margin:-11px 0 }
}

/* ---- FILTROS DA LISTA: o rótulo não se separa do campo ---------------
   A barra é flex com quebra, e rótulo e campo são irmãos soltos: onde a
   linha acabava, o rótulo ficava sozinho no fim de uma linha e o campo
   dele começava a outra. Medido: "Até" órfão em 768 e em 1024 px, e "De"
   órfão no celular, ao lado de "Situação". Em grade, cada rótulo tem
   lugar marcado ao lado (tablet) ou em cima (celular) do campo dele.
   Acima de 1290 px tudo cabe numa linha e a barra fica como era. */
@media (min-width:561px) and (max-width:1290px){
  .filtros.filtros-lista{
    display:grid; align-items:center; gap:10px;
    grid-template-columns:auto minmax(0,1fr) auto minmax(0,1fr);
  }
  .filtros.filtros-lista input,
  .filtros.filtros-lista select{ width:100%; min-width:0 }

  .filtros:has(#g-job){
    display:grid; align-items:center; gap:10px;
    grid-template-columns:auto minmax(0,1fr) auto minmax(0,1fr) auto;
  }
  .filtros:has(#g-job) .filtro-rot{ width:auto; margin:0 }
  .filtros:has(#g-job) select,
  .filtros:has(#g-job) input{ width:100%; min-width:0 }
  .filtros label[for="g-job"]{ grid-area:1 / 1 }
  .filtros #g-job{ grid-area:1 / 2 }
  .filtros label[for="g-ano"]{ grid-area:1 / 3 }
  .filtros #g-ano{ grid-area:1 / 4 }
  .filtros label[for="g-de"]{ grid-area:2 / 1 }
  .filtros #g-de{ grid-area:2 / 2 }
  .filtros label[for="g-ate"]{ grid-area:2 / 3 }
  .filtros #g-ate{ grid-area:2 / 4 }
  .filtros #g-limpar{ grid-area:2 / 5 }
}
@media (max-width:560px){
  .filtros.filtros-lista,
  .filtros:has(#g-job){
    display:grid; align-items:end; gap:4px 10px;
    grid-template-columns:repeat(2, minmax(0,1fr));
  }
  .filtros.filtros-lista input,
  .filtros.filtros-lista select,
  .filtros:has(#g-job) input,
  .filtros:has(#g-job) select{ width:100%; min-width:0 }
  /* Procurar e Situação na largura toda; De e Até lado a lado, que é
     como se lê um período. */
  .filtros-lista label[for="f-busca"]{ grid-area:1 / 1 / 2 / 3 }
  .filtros-lista #f-busca{ grid-area:2 / 1 / 3 / 3 }
  .filtros-lista label[for="f-sit"]{ grid-area:3 / 1 / 4 / 3; margin-top:6px }
  .filtros-lista #f-sit{ grid-area:4 / 1 / 5 / 3 }
  .filtros-lista label[for="f-de"]{ grid-area:5 / 1; margin-top:6px }
  .filtros-lista label[for="f-ate"]{ grid-area:5 / 2; margin-top:6px }
  .filtros-lista #f-de{ grid-area:6 / 1 }
  .filtros-lista #f-ate{ grid-area:6 / 2 }
  /* O Consolidado tem Tipo a mais: Tipo e Situação lado a lado. Sem isto a
     caixa do Tipo caía embaixo de "Até" e o rótulo ficava sozinho na outra
     coluna (terceira rodada de aceitação, celular 412 px). */
  .filtros-lista:has(#f-tipo) label[for="f-tipo"]{ grid-area:3 / 1; margin-top:6px }
  .filtros-lista:has(#f-tipo) #f-tipo{ grid-area:4 / 1 }
  .filtros-lista:has(#f-tipo) label[for="f-sit"]{ grid-area:3 / 2 }
  .filtros-lista:has(#f-tipo) #f-sit{ grid-area:4 / 2 }

  .filtros:has(#g-job) .filtro-rot{ width:auto; margin:0 }
  .filtros label[for="g-job"]{ grid-area:1 / 1 / 2 / 3 }
  .filtros #g-job{ grid-area:2 / 1 / 3 / 3 }
  .filtros label[for="g-ano"]{ grid-area:3 / 1; margin-top:6px }
  .filtros #g-ano{ grid-area:4 / 1 }
  .filtros #g-limpar{ grid-area:4 / 2; justify-self:start }
  .filtros label[for="g-de"]{ grid-area:5 / 1; margin-top:6px }
  .filtros label[for="g-ate"]{ grid-area:5 / 2; margin-top:6px }
  .filtros #g-de{ grid-area:6 / 1 }
  .filtros #g-ate{ grid-area:6 / 2 }
}

/* ---- TABELA LARGA NO IPAD: a coluna que importa não sai da tela -------
   No iPad Pro em pé (1024 px, menu à vista) a lista de relatórios tem
   1047 px de tabela num espaço de 738: os botões "Ver", "Compartilhar",
   "Revisar" e "Excluir" ficavam fora da tela, e só apareciam arrastando a
   tabela de lado. A rolagem própria da tabela continua, que é o padrão;
   o que muda é que a coluna de botões fica presa na borda direita e os
   dados passam por baixo dela. Nas tabelas sem botões (as grandes da
   Gestão, de horas e kg) quem fica presa é a primeira coluna, para o ano,
   o mês ou o dia não sumirem enquanto se lê o número lá do fim.
   Abaixo de 820 px a tabela já vira cartão e isto não se aplica; acima
   de 1290 px as listas cabem inteiras. */
@media screen and (min-width:821px) and (max-width:1290px){
  /* O filete é SOMBRA INTERNA, e não borda: com `border-collapse` a borda
     pertence à grade da tabela e fica para trás quando a célula gruda. */
  table.dados td.acoes,
  table.dados th.acoes{
    position:sticky; right:0; z-index:1;
    box-shadow:inset 1px 0 0 var(--linha);
  }
  table.dados td.acoes{ background:var(--branco) }
  table.dados:not(:has(td.acoes)) th:first-child,
  table.dados:not(:has(td.acoes)) td:first-child{ position:sticky; left:0; z-index:1 }
  table.dados:not(:has(td.acoes)) td:first-child{ background:var(--branco) }
}

/* ---- A LINHA DA GRADE NO IPAD -----------------------------------------
   As doze colunas da linha da grade (ver o bloco "O TABLET CONTINUA COM
   DOZE COLUNAS") foram contadas com a largura de uma tela sem menu. Na
   prática, no iPad em pé (768 px) e no iPad Pro em pé (1024 px, com o
   menu à vista) a linha tem 662 px úteis, e cada coluna fica com 48 px.
   Medido: "Diferença" e "Diferença (%)" do RTOR com caixa de 48 px e o
   rótulo de uma escrito por cima do da outra ("DiferençaDiferença"), a
   ajuda das duas sobreposta, e os seletores de 2 colunas do RLP e do RFAB
   mostrando "Não info" em vez de "Não informado".

   Nessa faixa a linha passa a ser flex com quebra, e cada campo pede a
   MESMA proporção da declaração (a base é N doze avos da linha). Onde
   tudo cabe, o resultado é o das doze colunas. Onde não cabe, o campo de
   uma coluna e o seletor estreito ganham um mínimo legível, e quem não
   couber desce e estica para fechar a linha, sem deixar buraco. Todo
   registro de uma grade tem os mesmos campos na mesma largura, então
   todos quebram no mesmo ponto e continuam alinhados entre si.

   A faixa é pela largura da GRADE (consulta de contêiner), e não da
   janela, porque o menu lateral muda o espaço que sobra: 900 px pega o
   iPad em pé, o iPad Pro em pé e o iPad Air deitado, e deixa de fora a
   tela de 1366 px. Abaixo de 760 px a linha já é uma coluna só. Navegador
   sem consulta de contêiner fica com as doze colunas de antes. */
.grade{ container:grade / inline-size }
@media (min-width:761px){
  @container grade (max-width:900px){
    .grade-linha{ display:flex; flex-wrap:wrap }
    .grade-linha > .campo.l-1 { flex:1 1 calc(100% * 1 / 12 - 8px) }
    .grade-linha > .campo.l-2 { flex:2 1 calc(100% * 2 / 12 - 8px) }
    .grade-linha > .campo.l-3 { flex:3 1 calc(100% * 3 / 12 - 8px) }
    .grade-linha > .campo.l-4 { flex:4 1 calc(100% * 4 / 12 - 8px) }
    .grade-linha > .campo.l-5 { flex:5 1 calc(100% * 5 / 12 - 8px) }
    .grade-linha > .campo.l-6 { flex:6 1 calc(100% * 6 / 12 - 8px) }
    .grade-linha > .campo.l-7 { flex:7 1 calc(100% * 7 / 12 - 8px) }
    .grade-linha > .campo.l-8 { flex:8 1 calc(100% * 8 / 12 - 8px) }
    .grade-linha > .campo.l-9 { flex:9 1 calc(100% * 9 / 12 - 8px) }
    .grade-linha > .campo.l-10{ flex:10 1 calc(100% * 10 / 12 - 8px) }
    .grade-linha > .campo.l-11{ flex:11 1 calc(100% * 11 / 12 - 8px) }
    .grade-linha > .campo.l-12{ flex:12 1 100% }
    /* Os mínimos: caixa de uma coluna com o tamanho de uma de duas, e
       seletor estreito com lugar para "Não informado" e a seta. */
    .grade-linha > .campo.l-1{ min-width:96px }
    .grade-linha > .campo.l-1:has(select),
    .grade-linha > .campo.l-2:has(select){ min-width:150px }
  }
}

@media print{
  #conteudo{ padding-bottom:0 }
  table.dados td.acoes, table.dados th.acoes,
  table.dados th:first-child, table.dados td:first-child{ position:static !important; box-shadow:none !important }
}

/* A nota de conferência da casa (colunas vazias não impressas) não sai no papel:
 * ela saía dentro da folha que vai ao cliente (teste de aceitação, 14/09/2026). */
@media print{ .doc-nota-interna{ display:none !important } }
