/* CFarma — identidade visual Cantagalli/CTECH (cantagalli.tec.br): tema escuro por PADRAO,
   acentos vermelho #E8302A / laranja #F39200 / verde #4FB546, Fraunces + Inter + JetBrains Mono.
   Tema claro opcional: <html class="light"> (toggle no topo; preferencia em localStorage). */
:root{
  --bg:#0a0a0a; --bg2:#141414; --panel:#1a1a1a; --ink:#f5f5f5; --ink-strong:#fff; --muted:#999;
  --line:rgba(255,255,255,.08); --line-strong:rgba(255,255,255,.16);
  --brand:#E8302A; --brand2:#F39200; --accent:#E8302A;
  --ok:#4FB546; --warn:#F39200; --bad:#ff6b66; --soft:#141414;
  --input-bg:#111; --btn-bg:#222; --btn-hover:#2a2a2a; --th-bg:#161616; --row-hover:#202020;
  --nav-ink:#ccc; --nav-mut:#777; --nav-hover:#1f1f1f;
  --tag-ok:#7ed476; --tag-warn:#ffb84d; --tag-bad:#ff8a85; --tag-mut:#aaa; --tag-mut-bg:rgba(255,255,255,.08);
  --shadow:0 8px 30px rgba(0,0,0,.5);
  --serif:'Fraunces',Georgia,serif; --sans:'Inter',-apple-system,Segoe UI,Roboto,sans-serif;
  --mono:'JetBrains Mono',ui-monospace,monospace;
}
/* -------- TEMA CLARO (opcional) -------- */
:root.light{
  --bg:#faf9f7; --bg2:#ffffff; --panel:#ffffff; --ink:#1d1d1d; --ink-strong:#111; --muted:#6b6b6b;
  --line:rgba(0,0,0,.09); --line-strong:rgba(0,0,0,.18);
  --bad:#d02823; --soft:#f1efeb;
  --input-bg:#fff; --btn-bg:#f1f1f1; --btn-hover:#e6e6e6; --th-bg:#f6f5f2; --row-hover:#f3f1ec;
  --nav-ink:#494949; --nav-mut:#9a9a9a; --nav-hover:#efedea;
  --tag-ok:#2e7d32; --tag-warn:#a05e00; --tag-bad:#c62828; --tag-mut:#666; --tag-mut-bg:rgba(0,0,0,.07);
  --shadow:0 8px 30px rgba(0,0,0,.14);
}
*{box-sizing:border-box} html,body{margin:0;height:100%}
body{font-family:var(--sans);color:var(--ink);
  background:var(--soft);display:grid;grid-template-columns:250px 1fr;min-height:100vh;
  -webkit-font-smoothing:antialiased}
a{color:inherit;text-decoration:none}

.sidebar{background:var(--bg);border-right:1px solid var(--line);color:var(--nav-ink);display:flex;flex-direction:column;padding:18px 14px}
.brand{display:flex;gap:12px;align-items:center;padding:6px 6px 14px}
.brand .logo{width:42px;height:42px;border-radius:11px;display:grid;place-items:center;overflow:hidden;background:transparent}
.brand .logo img{width:100%;height:100%;object-fit:contain}
.brand b{color:var(--ink-strong);font-size:17px;display:block;font-family:var(--serif);font-weight:600;letter-spacing:.01em}
.brand span{font-size:11px;color:var(--muted);display:block}

/* busca do menu */
.menu-busca{padding:0 2px 8px}
.menu-busca input{width:100%;border:1px solid var(--line-strong);border-radius:9px;padding:8px 11px;
  font-size:13px;outline:none;background:var(--input-bg);color:var(--ink)}
.menu-busca input:focus{border-color:var(--brand)}
body.sem-sessao .menu-busca{display:none}
/* SEM SESSAO: a tela de login mostrava a casca inteira do app em volta do formulario —
   250px de barra lateral vazia, o sino de alertas e a trilha escrita "Dashboard". Prometia
   uma navegacao que nao existe e nomeava um lugar onde a pessoa nao esta. Some tudo o que
   nao serve a quem ainda vai entrar; o alternador de tema fica, porque quem prefere claro
   quer o login claro tambem. */
body.sem-sessao{grid-template-columns:1fr}
body.sem-sessao .sidebar,
body.sem-sessao #nav-toggle,
body.sem-sessao #sino-wrap{display:none}
body.sem-sessao #crumb{font-family:var(--sans);font-weight:500;color:var(--muted);font-size:14px}

nav{display:flex;flex-direction:column;gap:2px;margin-top:2px;overflow-y:auto}
/* grupos = MODULOS COLAPSAVEIS (acordeao) */
nav .grp{display:flex;justify-content:space-between;align-items:center;gap:8px;cursor:pointer;user-select:none;
  font-size:10px;text-transform:uppercase;letter-spacing:.08em;color:var(--nav-mut);
  margin:8px 0 2px;padding:7px 10px;border-radius:8px}
nav .grp:hover{background:var(--nav-hover);color:var(--ink)}
nav .grp .chev{font-weight:700;font-size:13px;transition:transform .15s ease;line-height:1}
nav .grp.aberto .chev{transform:rotate(90deg)}
nav .grp-items{display:flex;flex-direction:column;gap:2px}
nav .grp-items.fechado{display:none}
nav .menu-vazio{color:var(--nav-mut);font-size:12px;padding:14px 10px;text-align:center}
nav a{display:flex;gap:10px;align-items:center;padding:9px 11px;border-radius:9px;font-size:13.5px;color:var(--nav-ink)}
nav a:hover{background:var(--nav-hover);color:var(--ink-strong)}
nav a.active{background:linear-gradient(90deg,rgba(232,48,42,.28),rgba(243,146,0,.14));color:var(--ink-strong);font-weight:600}
/* ÍCONE DO MENU · SVG de traço herdando a cor do texto. Emoji nao aceita currentColor: o
   icone ficava colorido e imutavel enquanto o rotulo mudava de cor no hover e no ativo, o
   que quebrava a leitura de estado justamente no elemento que deveria reforca-la. */
nav a .ic{width:18px;display:flex;align-items:center;justify-content:center;flex:0 0 18px}
.glifo{width:15px;height:15px;stroke:currentColor;fill:none;
  stroke-width:1.35;stroke-linecap:round;stroke-linejoin:round;
  opacity:.62;transition:opacity .14s}
nav a:hover .glifo{opacity:.9}
nav a.active .glifo{opacity:1}
/* Glifo dentro de botao (acao de linha, como o salvar de cada parametro): opacidade cheia,
   porque ali ele NAO e decoracao de navegacao — e o proprio rotulo do botao. */
.btn .glifo{opacity:.85;width:14px;height:14px}
.btn:hover .glifo{opacity:1}
/* Glifo dentro de texto (a lupa que marca linha detalhavel do DRE): acompanha a linha de
   base e fica discreto — e uma pista, nao um botao. */
.glifo-inline{display:inline-flex;vertical-align:-2px;opacity:.45}
.glifo-inline .glifo{width:13px;height:13px}
tr:hover .glifo-inline{opacity:.9}
/* estrela de favorito: aparece no hover; fixa quando favoritado */
nav a .fav{margin-left:auto;opacity:0;font-size:12px;color:var(--warn);padding:0 2px;transition:opacity .12s}
nav a:hover .fav{opacity:.45}
nav a .fav:hover{opacity:1;transform:scale(1.2)}
nav a .fav.on{opacity:.95}
@media (pointer: coarse){ nav a .fav{opacity:.3} }
.sidebar-foot{margin-top:auto;font-size:11px;color:var(--nav-mut);padding:12px 8px;line-height:1.5}

main{display:flex;flex-direction:column;min-width:0}
/* barra do SUPER ADMIN (fica acima da topbar) */
#superbar{display:flex;align-items:center;gap:12px;flex-wrap:wrap;padding:7px 24px;font-size:12.5px;
  background:linear-gradient(90deg,rgba(232,48,42,.16),rgba(243,146,0,.08));
  border-bottom:1px solid rgba(232,48,42,.4)}
#superbar.simulando{background:linear-gradient(90deg,rgba(243,146,0,.28),rgba(232,48,42,.10));
  border-bottom-color:var(--warn)}
#superbar .sb-tag{font-weight:800;letter-spacing:.07em;font-size:10.5px;color:var(--brand);white-space:nowrap}
#superbar.simulando .sb-tag{color:var(--warn)}
#superbar .sb-info{color:var(--ink);opacity:.85;min-width:0}
#superbar .sb-right{margin-left:auto;display:flex;gap:8px;align-items:center}
#superbar label{font-size:11.5px;color:var(--muted);white-space:nowrap}
#superbar select{max-width:220px}

.topbar{height:60px;background:var(--bg2);border-bottom:1px solid var(--line);display:flex;
  align-items:center;justify-content:space-between;padding:0 24px}
#crumb{font-weight:600;font-size:16px;font-family:var(--serif)}
.env{font-size:12px;color:var(--warn);background:rgba(243,146,0,.12);border:1px solid rgba(243,146,0,.35);padding:4px 10px;border-radius:20px}
#tema-toggle{border:1px solid var(--line-strong);background:var(--btn-bg);border-radius:9px;
  padding:6px 10px;font-size:15px;line-height:1;cursor:pointer}
#tema-toggle:hover{background:var(--btn-hover)}
/* sininho de alertas */
#sino{border:1px solid var(--line-strong);background:var(--btn-bg);border-radius:8px;
  padding:7px 9px;line-height:0;cursor:pointer;position:relative;color:var(--ink)}
#sino .glifo{width:16px;height:16px;opacity:.75}
#sino:hover .glifo{opacity:1}
#sino:hover{background:var(--btn-hover)}
#sino-badge{position:absolute;top:-6px;right:-6px;background:var(--brand);color:#fff;
  font-size:10px;font-weight:700;min-width:17px;height:17px;border-radius:9px;
  display:none;place-items:center;padding:0 4px}
#sino-drop{position:absolute;right:0;top:calc(100% + 8px);z-index:70;min-width:320px;max-width:420px;
  background:var(--panel);border:1px solid var(--line-strong);border-radius:12px;
  box-shadow:var(--shadow);overflow:hidden}
#sino-drop.hidden{display:none}
#sino-drop a{display:block;padding:12px 14px;font-size:13px;border-bottom:1px solid var(--line)}
#sino-drop a:hover{background:var(--row-hover)}
#sino-drop .sino-vazio{padding:16px;font-size:13px;color:var(--muted);text-align:center}
.view{padding:24px;overflow:auto}

.cards{display:grid;grid-template-columns:repeat(auto-fill,minmax(232px,1fr));gap:16px;margin-bottom:24px}
.card{background:var(--panel);border:1px solid var(--line);border-radius:10px;padding:15px 17px;min-width:0}
.card .k{font-size:10.5px;color:var(--muted);text-transform:uppercase;letter-spacing:.13em;font-weight:600;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
/* valor do KPI: nunca quebra linha; encolhe suavemente p/ caber valores grandes (R$ milhões) */
.card .v{font-size:clamp(20px,2.4vw,26px);font-weight:700;margin-top:6px;font-variant-numeric:tabular-nums;
  white-space:nowrap;letter-spacing:-.015em;line-height:1.15;overflow:hidden;text-overflow:ellipsis}
.card .s{font-size:12px;color:var(--muted);margin-top:2px}
/* MEDIDO: branco sobre o lado laranja do gradiente dava 2.35:1 (o rotulo a 85%, 2.07) —
   reprova ate no limite de texto grande, que e 3.0. O cartao de destaque existe para o KPI
   ser LIDO primeiro, e ele era justamente o menos legivel da tela. O gradiente vira faixa
   de acento no topo; o numero volta para o contraste normal do tema. A enfase continua,
   agora sem custar a leitura. */
/* ESTADO DO CARTAO · borda esquerda, nao cartao inteiro pintado. O cartao cheio de cor foi
   justamente o erro do brandcard logo abaixo: fundo forte come a legibilidade do numero, que
   e o conteudo. Aqui a cor entra na quina e no valor — o suficiente para o olho achar o
   problema varrendo a grade, sem transformar o painel em semaforo. */
.card.estado-atencao{border-left:3px solid var(--warn)}
.card.estado-atencao .v{color:var(--tag-warn)}
.card.estado-critico{border-left:3px solid var(--brand)}
.card.estado-critico .v{color:var(--tag-bad)}

/* VEREDITO · a frase que responde "esta tudo bem agora?" antes de qualquer numero.
   Tipografia serifada e maior que os cartoes de proposito: e a conclusao, nao mais um dado.
   Fica discreto quando esta tudo certo e so ganha peso quando ha o que olhar. */
.veredito{display:flex;align-items:baseline;gap:14px;flex-wrap:wrap;
  padding:14px 18px;border-radius:14px;margin:14px 0 18px;
  background:var(--panel);border:1px solid var(--line);border-left:4px solid var(--ok)}
.veredito .vd-titulo{font-family:var(--serif);font-size:19px;font-weight:600;color:var(--ink-strong)}
.veredito .vd-detalhe{font-size:13px;color:var(--muted)}
.veredito.atencao{border-left-color:var(--warn)}
.veredito.atencao .vd-titulo{color:var(--tag-warn)}
.veredito.critico{border-left-color:var(--brand)}
.veredito.critico .vd-titulo{color:var(--tag-bad)}

.card.brandcard{background:var(--panel);border:1px solid var(--line);position:relative;overflow:hidden}
.card.brandcard::before{content:'';position:absolute;left:0;right:0;top:0;height:3px;
  background:linear-gradient(90deg,#E8302A,#F39200)}
.card.brandcard .v{color:var(--ink-strong)}
.card.brandcard .k,.card.brandcard .s{color:var(--muted)}

.panel{background:var(--panel);border:1px solid var(--line);border-radius:10px;overflow:hidden}
.panel-head{display:flex;justify-content:space-between;align-items:center;padding:13px 17px;
  border-bottom:1px solid var(--line);gap:12px;flex-wrap:wrap;background:var(--th-bg)}
.panel-head h2{margin:0;font-size:12px;font-weight:600;text-transform:uppercase;
  letter-spacing:.12em;color:var(--muted);font-family:var(--sans)}
.search{display:flex;gap:8px;align-items:center}
/* `:not([type=checkbox]):not([type=radio])` — a largura de 280px é do CAMPO DE BUSCA, e a
   regra pegava também as caixas de marcar que moram na mesma barra (`filtersHtml` do
   listView). O "só críticos" da Posição de Estoque era um checkbox de 280px de largura, com
   o rótulo empurrado para longe do quadradinho que ele nomeia. Aparecia em toda tela com
   filtro de marcar. */
.search input:not([type=checkbox]):not([type=radio]){border:1px solid var(--line-strong);border-radius:9px;padding:8px 12px;font-size:13px;width:280px;outline:none;background:var(--input-bg);color:var(--ink)}
.search input:not([type=checkbox]):not([type=radio]):focus{border-color:var(--brand)}
.btn{border:1px solid var(--line-strong);background:var(--btn-bg);color:var(--ink);border-radius:8px;
  padding:8px 13px;font-size:13px;cursor:pointer;transition:background .12s,border-color .12s}
.btn:hover{background:var(--btn-hover)}
/* MEDIDO: branco sobre #E8302A da 4.3:1 — reprova no AA (minimo 4.5 para texto normal).
   #d02823 da 5.24:1 e ja era a cor de hover, entao o botao continua na mesma familia da
   marca. O #E8302A segue valendo para borda, tag, foco e acento: o problema e so texto
   branco POR CIMA dele. */
.btn.primary{background:#d02823;color:#fff;border-color:#d02823}
.btn.primary:hover{background:#b81d1b;border-color:#b81d1b}

table{width:100%;border-collapse:collapse;font-size:13px}
th,td{text-align:left;padding:10px 14px;border-bottom:1px solid var(--line);white-space:nowrap}
th{background:var(--th-bg);color:var(--muted);font-weight:600;font-size:11.5px;text-transform:uppercase;letter-spacing:.03em;position:sticky;top:0}
/* FAIXA ALTERNADA · numa tabela de 1110px com 7 colunas, o olho atravessa 791px entre o
   nome do cliente e o valor sem nenhum guia. Com 50 linhas por pagina e centenas de milhares
   de registros, trocar de linha no meio do caminho e questao de tempo — e num titulo a
   receber isso significa ler o valor de OUTRO cliente. E o motivo de razao contabil ter
   pautado alternado desde antes do computador.
   Intensidade baixissima de proposito: o suficiente para o olho seguir, longe de virar
   listra. O hover continua vencendo, porque a linha sob o cursor tem de ser inequivoca. */
tbody tr:nth-child(even){background:rgba(255,255,255,.022)}
:root.light tbody tr:nth-child(even){background:rgba(0,0,0,.018)}
tbody tr:hover{background:var(--row-hover)}
/* mão só onde a linha ABRE algo (listas com onRow) — em relatórios ela prometia um clique
   que não existia. A classe é aplicada pelo listView quando há onRow. */
tbody tr.rowlink{cursor:pointer}
/* container de rolagem das listas: é ele que rola verticalmente, então o th sticky
   volta a funcionar (antes o scroll era da .view e o cabeçalho sumia em 50 linhas) */
.tbl-scroll{overflow:auto;max-height:calc(100vh - 300px)}
td.num,th.num{text-align:right;font-variant-numeric:tabular-nums;font-family:var(--mono);font-size:12.5px}
.tag{font-size:11px;padding:2px 8px;border-radius:20px;font-weight:600}
.tag.ok{background:rgba(79,181,70,.15);color:var(--tag-ok)}.tag.warn{background:rgba(243,146,0,.15);color:var(--tag-warn)}
.tag.bad{background:rgba(232,48,42,.14);color:var(--tag-bad)}.tag.mut{background:var(--tag-mut-bg);color:var(--tag-mut)}
.pager{display:flex;justify-content:space-between;align-items:center;padding:12px 18px;font-size:13px;color:var(--muted)}
.pager .pg{display:flex;gap:8px}
.empty{padding:40px;text-align:center;color:var(--muted)}
.loading{padding:40px;text-align:center;color:var(--muted)}

.modal{position:fixed;inset:0;background:rgba(0,0,0,.65);display:grid;place-items:center;z-index:50}
.modal.hidden{display:none}
.modal-box{background:var(--panel);border:1px solid var(--line-strong);border-radius:12px;max-width:820px;width:92%;max-height:85vh;overflow:auto;position:relative;padding:22px 26px}
#modal-close{position:absolute;top:12px;right:16px;border:0;background:none;font-size:26px;cursor:pointer;color:var(--muted)}
.kv{display:grid;grid-template-columns:180px 1fr;gap:6px 14px;font-size:13px;margin:14px 0}
.kv .k{color:var(--muted)} .kv .v{font-weight:600}
.section-title{font-size:10.5px;text-transform:uppercase;letter-spacing:.13em;font-weight:600;
  color:var(--muted);margin:22px 0 10px;border-top:1px solid var(--line);padding-top:14px}
h1.page{font-size:27px;line-height:1.15;margin:0 0 5px;font-family:var(--serif);
  font-weight:600;letter-spacing:-.015em} .sub{color:var(--muted);font-size:13px;margin-bottom:20px;max-width:78ch;line-height:1.5}

/* ---- forms, toast, barras ---- */
.form-grid{display:grid;grid-template-columns:1fr 1fr;gap:14px;font-size:13px}
.form-row{display:flex;gap:10px;align-items:center;margin-top:8px;font-size:13px;flex-wrap:wrap}
.form-row input,.form-grid input{border:1px solid var(--line-strong);border-radius:9px;padding:8px 12px;font-size:13px;outline:none;background:var(--input-bg);color:var(--ink)}
.form-row input:focus,.form-grid input:focus{border-color:var(--brand)}
label.chk{display:flex;gap:6px;align-items:center;font-size:12.5px;color:var(--muted);white-space:nowrap}
select.btn{padding:7px 10px}
.inp{border:1px solid var(--line-strong);border-radius:9px;padding:8px 12px;font-size:13px;outline:none;background:var(--input-bg);color:var(--ink)}
.inp:focus{border-color:var(--brand)}
/* estilo-base p/ QUALQUER input/select/textarea fora de contêiner (login, parâmetros, etc.):
   sem isto, o browser renderiza caixa branca com texto preto — ilegível no tema escuro. */
input:not([type=checkbox]):not([type=radio]),select,textarea{
  background:var(--input-bg);color:var(--ink);border:1px solid var(--line-strong);
  border-radius:9px;padding:8px 12px;font:inherit;font-size:13px;outline:none}
input:focus,select:focus,textarea:focus{border-color:var(--brand)}
/* texto auxiliar "apagado" (classe usada em várias telas, faltava a regra) */
.mut{color:var(--muted)}
/* Campo obrigatorio. Marcar ANTES do clique e diferente de reclamar depois: o formulario de
   Novo Pedido exigia cliente e vendedor e nao dizia — a pessoa so descobria ao tentar gravar.
   Asterisco discreto, com title para quem usa leitor de tela nao receber so um simbolo. */
.obrigatorio{color:var(--tag-bad);font-weight:700;margin-left:2px;cursor:help}
/* Referencia a tabela do legado no subtitulo. Ela CONTINUA visivel porque conferir a
   migracao contra o inFarma e o proposito do projeto — mas deixa de ser a primeira coisa
   que a pessoa le, que era o caso quando o subtitulo abria com "PDVCB ·". */
.sub .ref-legado{font-family:var(--mono);font-size:11px;color:var(--muted);opacity:.65;
  border:1px solid var(--line);border-radius:5px;padding:1px 5px;margin-left:6px;
  white-space:nowrap;vertical-align:1px}
/* foco de teclado visível (acessibilidade) — antes o outline era removido sem substituto */
:focus-visible{outline:2px solid var(--brand);outline-offset:2px}
/* O modal recebe foco por programa (tabindex=-1) para o teclado entrar no dialogo, e com
   isso casava :focus-visible — pintando um anel VERMELHO de 2px em volta da caixa inteira.
   Anel de foco serve para dizer onde o teclado esta num controle; em volta de um dialogo
   inteiro, e nesta paleta onde vermelho tambem significa erro, vira alarme falso. O que
   sinaliza a abertura e o proprio dialogo. */
#modal .modal-box:focus,#modal .modal-box:focus-visible{outline:none}
/* Acao destrutiva nao pode ter a mesma aparencia de uma acao inofensiva ao lado. Nao usa o
   vermelho cheio da acao principal (que e "siga em frente"): usa contorno, que pede
   confirmacao com os olhos antes do clique. */
.btn.perigo{border-color:rgba(232,48,42,.55);color:var(--tag-bad);background:transparent}
.btn.perigo:hover{background:rgba(232,48,42,.12);border-color:var(--brand);color:var(--ink-strong)}
.toast{position:fixed;bottom:24px;right:24px;z-index:99;background:var(--btn-bg);color:var(--ink);padding:12px 18px;
  border:1px solid var(--line-strong);border-radius:12px;font-size:13.5px;box-shadow:var(--shadow);animation:tin .2s ease}
.toast.ok{border-left:4px solid var(--ok)} .toast.bad{border-left:4px solid var(--bad)}
@keyframes tin{from{transform:translateY(12px);opacity:0}to{transform:none;opacity:1}}
.bar{background:var(--tag-mut-bg);border-radius:8px;height:14px;overflow:hidden}
.bar>div{background:linear-gradient(90deg,#E8302A,#F39200);height:100%}
.rowlink{cursor:pointer}

/* ================= RESPONSIVO — PC / tablet / celular ================= */
/* botao hamburguer (so aparece fora do desktop) e overlay do drawer */
#nav-toggle{display:none;border:1px solid var(--line-strong);background:var(--btn-bg);color:var(--ink);
  border-radius:9px;padding:8px 12px;font-size:18px;line-height:1;cursor:pointer;margin-right:12px}
#nav-overlay{display:none;position:fixed;inset:0;background:rgba(0,0,0,.55);z-index:39}
body.nav-open #nav-overlay{display:block}

/* tabelas nunca estouram a pagina: rolagem no proprio painel */
.panel{overflow-x:auto}
.modal-box table{display:block;overflow-x:auto}

/* TABLET (<=1024px): menu vira gaveta deslizante */
@media (max-width: 1024px){
  body{grid-template-columns:1fr}
  .sidebar{position:fixed;left:0;top:0;bottom:0;width:270px;z-index:40;
    transform:translateX(-102%);transition:transform .22s ease;overflow-y:auto}
  body.nav-open .sidebar{transform:translateX(0);box-shadow:8px 0 40px rgba(0,0,0,.5)}
  #nav-toggle{display:inline-block}
  .topbar{padding:0 14px}
  #superbar{padding:7px 14px}
  .view{padding:16px}
  .search input:not([type=checkbox]):not([type=radio]){width:min(280px,52vw)}
}

/* CELULAR (<=640px): densidade e toque */
@media (max-width: 640px){
  .view{padding:12px}
  h1.page{font-size:19px}
  .env{display:none}
  #superbar{gap:8px;font-size:12px}
  #superbar .sb-info{display:none}
  #superbar .sb-right{margin-left:0}
  .form-grid{grid-template-columns:1fr}
  .form-row{gap:8px}
  .form-row input,.form-row select,.form-row button,.btn{min-height:42px}
  .search{flex:1}
  .search input:not([type=checkbox]):not([type=radio]){width:100%;flex:1}
  .panel-head{padding:12px 14px}
  th,td{padding:9px 10px;font-size:12.5px}
  .modal-box{width:96%;max-height:92vh;padding:16px 14px;border-radius:12px}
  /* no celular, cards mais largos (1 coluna em telas estreitas) p/ valores em R$ milhões caberem */
  .cards{grid-template-columns:repeat(auto-fill,minmax(min(100%,240px),1fr));gap:10px}
  .card .v{font-size:22px}
  nav a{padding:12px 11px;font-size:15px}
}

/* toque confortavel em qualquer tela touch */
@media (pointer: coarse){
  .btn{min-height:42px}
  tbody tr{height:44px}
}

/* defesa: no DESKTOP a barra lateral nunca passa de 250px, mesmo que o grid falhe por
   qualquer motivo (CSS antigo em cache, etc.) — evita a barra ocupar a tela inteira. */
/* BLINDAGEM de layout no DESKTOP: extensões do navegador (RSS, etc.) injetam <div> como filho
   direto do <body>, que vira item do grid e empurra o main p/ a coluna de 250px (layout quebrado
   só no PC COM extensão — não reproduz sem). Fixamos sidebar/main nas células e colapsamos
   qualquer intruso in-flow. Escopado a >=1025px p/ não afetar a gaveta (mobile) nem o modo TV. */
@media (min-width: 1025px){
  /* sidebar com SCROLL PRÓPRIO: sem isto ela (5000px+ com o menu aberto) dirigia a altura
     da página inteira — o conteúdo acabava e a página continuava rolando em branco */
  body:not(.tv-mode):not(.sem-sessao) > .sidebar{ grid-area:1/1; max-width:250px; position:sticky; top:0; height:100vh; overflow-y:auto }
  body:not(.tv-mode):not(.sem-sessao) > main{ grid-area:1/2; min-width:0 }
  /* DEFEITO GRAVE CORRIGIDO EM 13/08/2026 · esta regra colapsava os avisos do proprio app.
     Ela existe para neutralizar <div> que extensoes de navegador injetam como filho direto
     do <body>, e fazia isso por exclusao: tudo que nao fosse sidebar/main/modal/overlay
     virava 0x0 com overflow:hidden. So que o app pendura no <body> exatamente as coisas que
     precisam flutuar por cima de tudo — os toasts de sucesso e erro, o botao "Reportar erro"
     e o dialogo dele, e o botao de sair do modo TV.
     Resultado: TODA mensagem de status e de erro do sistema saia como um cotoco de 41x26px
     no canto, ilegivel. O usuario clicava em Faturar e via um circulo vermelho sem texto.
     Elementos com position:fixed NAO viram item de grid (estao fora do fluxo), entao o
     grid-area nunca foi o problema; quem quebrava era o width/height zerado. A lista de
     excecoes abaixo e o que o app legitimamente pendura no body — ao criar um overlay novo,
     acrescente aqui, senao ele nasce invisivel. */
  body:not(.tv-mode):not(.sem-sessao) > :not(.sidebar):not(main):not(#modal):not(#nav-overlay):not(script):not(.toast):not(#cf-err-btn):not(#cf-err-mask):not(#cf-err-css):not(#tv-sair):not(#tv-relogio){
    grid-area:1/1; width:0; height:0; overflow:hidden; pointer-events:none }
}

/* ================= MODO TV (BI em tela cheia p/ TV) ================= */
body.tv-mode{grid-template-columns:1fr}
body.tv-mode .sidebar,body.tv-mode .topbar,body.tv-mode #superbar{display:none}
body.tv-mode .view{padding:26px 36px}
body.tv-mode #bi-filtros{display:none}                    /* esconde a barra de filtros */
body.tv-mode h1.page{font-size:28px}
body.tv-mode .cards .card .v{font-size:34px}
body.tv-mode .cards .card .k{font-size:13px}
#tv-sair{position:fixed;top:14px;right:14px;z-index:60;opacity:.25}
/* Relogio do modo TV. Numa TV na parede nao da para distinguir dado vivo de tela travada;
   esta marca e o unico jeito de alguem passando saber se o painel ainda respira. Discreto
   de proposito: quem olha o painel quer os numeros, nao o relogio. */
#tv-relogio{position:fixed;bottom:12px;right:16px;z-index:60;font-size:13px;color:var(--muted);
  font-family:var(--mono);opacity:.5;letter-spacing:.02em}
body:not(.tv-mode) #tv-relogio{display:none}
#tv-sair:hover{opacity:1}

/* ================= IMPRESSAO (🖨 dos relatorios) ================= */
@media print{
  :root{--bg:#fff;--bg2:#fff;--panel:#fff;--ink:#000;--ink-strong:#000;--muted:#555;
    --line:#ccc;--line-strong:#999;--soft:#fff;--input-bg:#fff;--btn-bg:#fff;
    --th-bg:#eee;--row-hover:#fff;--tag-mut-bg:#eee;
    --tag-ok:#2e7d32;--tag-warn:#a05e00;--tag-bad:#c62828;--tag-mut:#555}
  body{display:block;background:#fff;color:#000}
  .sidebar,.topbar,#superbar,#nav-toggle,#nav-overlay,.pager,.search,.form-row,
  button,select,input,.toast,.modal,.sub a{display:none !important}
  .view{padding:0;overflow:visible}
  .view div{overflow:visible !important;max-height:none !important}
  .panel{border:1px solid #bbb;border-radius:6px}
  th{position:static;background:#eee !important;color:#000}
  th,td{white-space:normal}
  h1.page{font-size:18px}
}
