/* ═══════════════════════════════════════════════════════════
   FUEL MIND: Dark Design System v3.1
   Layout: Sidebar + Header + Content
   Fonts: Syne (headings) + DM Sans (body) + JetBrains Mono (numbers)
   Theme: Dark default | Light toggle
   v3.1: Cobertura completa de --primary (sem hardcodes de vinho)
═══════════════════════════════════════════════════════════ */

/* Fontes carregadas por <link> no index.html: dentro do CSS o navegador
   só descobre a fonte depois de baixar o arquivo inteiro (17/09/2026). */

/* ── TOKENS DARK (DEFAULT), Ultra Dark ── */
:root {
    --bg:              #0a0a0a;        /* fundo principal quase preto */
    --surface:         #151515;        /* cards, superfícies elevadas */
    --surface-alt:     #1e1e1e;        /* alternativo, um pouco mais claro */
    --surface-raised:  #202020;        /* elementos em destaque */
    --surface-hover:   #2a2a2a;        /* hover sobre superfícies */
    --sidebar-bg:      #0c0c0c;        /* sidebar mais escura que o fundo */
    --sidebar-width:   260px;
    /* Altura da faixa de demonstração. Zero fora do modo demo; o próprio
       demo.js mede a faixa e sobrescreve, porque ela quebra em duas linhas
       no celular e um valor fixo deixaria a sidebar desalinhada. */
    --faixa-demo-h:    0px;
    --header-height:   64px;
    --header-bg:       #0a0a0a;
    --text:            #f5f5f5;        /* texto principal branco suave */
    --text-muted:      #aaaaaa;        /* texto secundário */
    --text-light:      #888888;        /* texto ainda mais suave */
    --text-on-dark:    #f8fafc;
    --primary:         #a02828;        /* tom vinho (pode ajustar) */
    /* O vinho da marca como TEXTO sobre fundo escuro: #a02828 sobre #151515
       dá contraste 2,3: ilegível. Vale só para texto (etiqueta de papel,
       @usuario, aba ativa, seta de ordenação); preenchimentos e botões
       continuam no --primary. No tema claro os dois são a mesma cor.
       (21/09/2026) */
    --primary-texto:   #d06a6a;
    /* Cor do contorno de foco (23/09/2026). Era o --primary, e o vinho sobre
       o fundo escuro dá de 1,9 a 2,7 de contraste: abaixo dos 3 que um
       indicador precisa para ser visto, e quem anda pelo teclado perdia o
       lugar. O --primary-texto dá de 4,1 a 5,6 nos seis fundos escuros; no
       tema claro ele é o próprio vinho (6,3 a 7,4). Por apontar para ele,
       este token troca sozinho com o tema. */
    --foco:            var(--primary-texto);
    --primary-hover:   #8c2222;        /* escurecido ~12%, feedback visual de hover */
    --primary-light:   rgba(139,34,82,0.2);
    --primary-glow:    rgba(139,34,82,0.4);
    --primary-mid:     #b84040;        /* clareado ~15%, para ícones, labels secundários */
    /* Derivadas de --primary usadas em badges e superfícies sutis.
       Quando o usuário altera --primary via aplicarCorPersonalizada(),
       essas três variáveis são recalculadas via JS para manter consistência. */
    --primary-subtle:  rgba(139,34,82,0.1);   /* fundos de badge/ícone leve */
    --primary-subtle2: rgba(139,34,82,0.08);  /* itens ativos na sidebar (light) */
    --primary-subtle3: rgba(139,34,82,0.15);  /* badge-role-supremo */
    --primary-subtle4: rgba(139,34,82,0.18);  /* hover badge empresa */
    --border:          #333333;        /* bordas padrão */
    --border-light:    #262626;        /* bordas mais sutis */
    --border-strong:   #444444;        /* bordas de destaque */
    --success:         #10b981;
    --success-light:   rgba(16,185,129,0.15);
    --warning:         #f59e0b;
    --warning-light:   rgba(245,158,11,0.15);
    /* Clareado em 21/09: como TEXTO sobre a propria tonalidade escura
       (--danger-light) o #ef4444 dava 4,17, abaixo de 4,5. O preenchimento
       de botao nao usa mais esta variavel, entao clarear e seguro. */
    --danger:          #f26a6a;
    /* O --danger é claro de propósito: ele é texto sobre fundo escuro. Como
       FUNDO de botão com texto branco dá só 3,76 de contraste, então o
       preenchimento usa este tom sólido, igual nos dois temas (branco sobre
       ele: 6,5). (21/09/2026) */
    --danger-solido:   #b02a37;
    --danger-light:    rgba(239,68,68,0.15);
    /* Mesmo caso do --danger: como texto sobre --info-light dava 4,17. */
    --info:            #5a9bf8;
    --info-solido:     #1c6f9c;   /* preenchimento com texto branco (5,5) */
    --info-light:      rgba(59,130,246,0.15);
    /* A quinta cor dos cards (24/09/2026): o card de frete do Dashboard
       repetia o vermelho do primeiro. Roxo de matiz 270, longe do azul
       (215): 6,9 sobre o card e 5,5 sobre o fundo do ícone. */
    --violeta:         #c084fc;
    --violeta-light:   rgba(192,132,252,0.15);
    --thead-bg:        #0a0a0a;
    --thead-color:     #c4d0de;
    --row-hover:       #252525;
    --row-alt:         #181818;
    --shadow-sm:       0 1px 3px rgba(0,0,0,0.6);
    --shadow:          0 4px 12px rgba(0,0,0,0.7);
    --shadow-md:       0 8px 24px rgba(0,0,0,0.8);
    --shadow-lg:       0 16px 48px rgba(0,0,0,0.9);
    --shadow-glow:     0 0 24px rgba(139,34,82,0.3);
    --radius-sm:       4px;
    --radius:          8px;
    --radius-md:       12px;
    --radius-lg:       16px;
    --radius-xl:       20px;
    --export-bg:       #151515;
    --export-border:   #333333;

    /* ── MOVIMENTO ──────────────────────────────────────────────────
       Três durações e uma curva, para a ferramenta ter um ritmo só. O
       arquivo tinha sete durações soltas; as novas entram por aqui.
       Regra: animar transform e opacity, nunca largura, altura ou
       margem. E nada longo numa ação que se repete trinta vezes por
       dia, como lançar nota. */
    --duration-fast:   0.12s;   /* estado de botão, hover, foco */
    --duration-base:   0.2s;    /* abrir lista, trocar aba */
    --duration-slow:   0.3s;    /* entrada de tela e de modal */
    --ease-standard:   cubic-bezier(0.2, 0, 0.2, 1);

    /* ── ESPAÇAMENTO (programa 3.3, 18/09/2026) ────────────────────
       Uma escala só, de 4 em 4. O arquivo usava 6, 7, 10, 14, 18 e 22
       ao lado de 8, 12, 16, 20 e 24; o que sai do estilo inline entra
       por aqui, arredondado para o degrau mais perto. */
    --space-1:  4px;
    --space-2:  8px;
    --space-3: 12px;
    --space-4: 16px;
    --space-5: 20px;
    --space-6: 24px;
    --space-7: 28px;
    --space-8: 32px;
}

/* Quem pede menos movimento no sistema operacional recebe menos
   movimento aqui. Antes não havia nenhuma ocorrência desta regra no
   projeto: as três animações rodavam sempre. */
@media (prefers-reduced-motion: reduce) {
    *, *::before, *::after {
        animation-duration: 0.01ms !important;
        animation-iteration-count: 1 !important;
        transition-duration: 0.01ms !important;
        scroll-behavior: auto !important;
    }
}

/* ── TOKENS LIGHT (mantido, mas com ajustes de contraste) ── */
[data-theme="light"] {
    --bg:              #ffffff;
    --surface:         #f8f9fa;
    --surface-alt:     #f1f3f5;
    --surface-raised:  #ffffff;
    --surface-hover:   #e9ecef;
    --sidebar-bg:      #212529;
    --header-bg:       #ffffff;
    --text:            #212529;
    /* Escurecidos em 21/09/2026. Os anteriores (#6c757d e #868e96) davam
       contraste 4,22 e 2,99 sobre --surface-alt, abaixo do mínimo de 4,5
       para texto normal, e são usados em rótulos de 9 a 11 px nas dez
       telas. A hierarquia entre os dois continua visível. */
    --text-muted:      #5c646c;
    --text-light:      #6b737b;
    --text-on-dark:    #f8f9fa;
    --primary:         #a02828;
    --primary-texto:   #a02828;   /* no claro o vinho já se lê bem (7,4 sobre branco) */
    --primary-hover:   #a02828;
    --primary-light:   #a028281c;
    --primary-glow:    rgba(139,34,34,0.15);
    --primary-mid:     #b04a4a;
    --primary-subtle:  rgba(139,34,34,0.08);
    --primary-subtle2: rgba(139,34,34,0.06);
    --primary-subtle3: rgba(139,34,34,0.12);
    --primary-subtle4: rgba(139,34,34,0.14);
    --border:          #dee2e6;
    --border-light:    #e9ecef;
    --border-strong:   #ced4da;
    --success:         #0c6b4b;
    --success-light:   rgba(12,107,75,0.08);
    --warning:         #9c4e08;   /* escurecido em 21/09: 4,05 -> 5,1 sobre --warning-light */
    --warning-light:   rgba(180,91,10,0.08);
    --danger:          #b02a37;
    --danger-light:    rgba(176,42,55,0.08);
    --info:            #1c6f9c;
    --info-light:      rgba(28,111,156,0.08);
    --violeta:         #7e22ce;   /* 6,6 sobre o card e 5,8 sobre o fundo do ícone */
    --violeta-light:   rgba(126,34,206,0.08);
    --thead-bg:        rgb(224, 224, 224);
    --thead-color:     #212529;
    --row-hover:       #f1f3f5;
    --row-alt:         #fcfcfd;
    --shadow-sm:       0 1px 2px rgba(0,0,0,0.05);
    --shadow:          0 4px 8px rgba(0,0,0,0.08);
    --shadow-md:       0 8px 16px rgba(0,0,0,0.10);
    --shadow-lg:       0 16px 24px rgba(0,0,0,0.12);
    --shadow-glow:     0 0 12px rgba(139,34,34,0.15);
    --export-bg:       #f8f9fa;
    --export-border:   #dee2e6;
}

/* ── RESET ── */
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
/* `color-scheme` faz o navegador desenhar os controles NATIVOS no tom do
   tema: a caixa de marcar desmarcada deixa de ter fundo branco no escuro,
   e a barra de rolagem e o calendario acompanham. E a forma certa de
   resolver isso: `accent-color` so pinta o estado marcado. (21/09/2026) */
:root { color-scheme: dark; }
[data-theme="light"] { color-scheme: light; }
html { font-size: 14px; -webkit-font-smoothing: antialiased; scroll-behavior: smooth; }
body {
    font-family: 'DM Sans', 'Segoe UI', system-ui, sans-serif;
    background: var(--bg);
    color: var(--text);
    line-height: 1.5;
    min-height: 100vh;
    overflow-x: hidden;
    transition: background 0.3s, color 0.3s;
}

/* ══ LAYOUT ══════════════════════════════════════ */
.app-wrapper { display: flex; min-height: 100vh; }

/* ── SIDEBAR ── */
.sidebar {
    width: var(--sidebar-width);
    min-height: calc(100vh - var(--faixa-demo-h));
    background: var(--sidebar-bg);
    border-right: 1px solid rgba(255,255,255,0.06);
    display: flex;
    flex-direction: column;
    position: fixed;
    left: 0; top: var(--faixa-demo-h); bottom: 0;
    z-index: 200;
    transition: transform 0.3s cubic-bezier(0.4,0,0.2,1);
    overflow: hidden;
    overflow-y: auto;
}
.sidebar::-webkit-scrollbar { width: 3px; }
.sidebar::-webkit-scrollbar-thumb { background: rgba(255,255,255,0.1); border-radius: 3px; }

/* A MESMA ALTURA DA BARRA DE CIMA (22/09/2026).
   A area da logo tinha 83px contra os 64px do cabecalho, e as duas tem
   uma linha embaixo: eram dois riscos horizontais separados por 19px,
   perto demais para parecer intencao e longe demais para passar
   despercebido. Com a altura igual eles viram um risco so, atravessando a
   tela, e a barra lateral passa a ser lida junto com o conteudo em vez de
   ao lado dele.
   `height` e nao `padding`: e a altura que precisa casar com a do
   cabecalho, e amarrar as duas na mesma variavel e o que mantem isso
   verdade se ela mudar. A logo tem 40px, entao sobram 12px em cima e
   embaixo. */
.sidebar-logo {
    display: flex;
    align-items: center;
    gap: 13px;
    height: var(--header-height);
    padding: 0 18px;
    border-bottom: 1px solid rgba(255,255,255,0.06);
    text-decoration: none;
    flex-shrink: 0;
}
.sidebar-logo-icon {
    width: 42px; height: 42px;
    background: var(--primary);
    border-radius: var(--radius-md);
    display: flex; align-items: center; justify-content: center;
    flex-shrink: 0;
    box-shadow: 0 4px 16px var(--primary-glow);
    transition: transform 0.2s, box-shadow 0.2s;
}
.sidebar-logo:hover .sidebar-logo-icon { transform: scale(1.05); box-shadow: 0 6px 20px var(--primary-glow); }
.sidebar-logo-icon svg { width: 22px; height: 22px; color: #fff; }
.sidebar-logo-title {
    font-family: 'Syne', sans-serif;
    font-size: 0.95rem; font-weight: 800;
    color: #f8fafc;
    white-space: nowrap; letter-spacing: -0.01em; line-height: 1.2;
}
.sidebar-logo-sub {
    font-size: 0.86rem; color: rgba(255,255,255,0.35);
    text-transform: uppercase; letter-spacing: 0.1em;
    margin-top: 2px; white-space: nowrap;
}

.sidebar-nav { flex: 1; padding: 10px 0; }
.sidebar-section { padding: 0 10px; margin-bottom: 2px; }
.sidebar-item {
    display: flex; align-items: center; gap: 11px;
    padding: 9px 12px;
    border-radius: var(--radius);
    cursor: pointer;
    transition: background 0.15s, color 0.15s;
    margin-bottom: 1px;
    border: none; background: transparent;
    color: rgba(255,255,255,0.68);
    font-family: 'DM Sans', sans-serif;
    /* 1rem, nao 0.875rem (22/09/2026). A raiz deste projeto e 14px, entao
       0.875rem dava 12,25px de texto dentro de um item de 240px de largura:
       o conteudo boiava na area e quase metade da barra ficava vazia. A
       razao entre o tamanho da fonte e a largura da coluna era de 4,7%,
       contra os 5,8% de uma barra de 240px com texto de 14px, que e a
       proporcao das ferramentas que servem de referencia.
       A largura de 260px NAO mudou, de proposito: ela ja esta dentro da
       faixa usada por elas, de 240 a 280. Quem estava fora do padrao era o
       texto. */
    font-size: 1rem; font-weight: 500;
    width: 100%; text-align: left;
    white-space: nowrap; overflow: hidden;
    position: relative;
}
.sidebar-item:hover { background: rgba(255,255,255,0.09); color: rgba(255,255,255,0.93); }
.sidebar-item.ativo {
    background: var(--primary-light);
    color: #a02828;
    font-weight: 600;
}
/* A MARCA DO ITEM ATIVO CRESCE, em vez de piscar (22/09/2026).
   Ela existia so sob `.ativo`, entao nascia e morria junto com a classe e
   nao havia estado anterior para transicionar: aparecia de uma vez. Agora
   o pseudo-elemento existe em todos os itens, encolhido em `scaleY(0)`, e
   so estica no que esta ativo.
   `transform` e nao `height`: a altura recalcularia layout a cada quadro,
   a escala a GPU compoe sozinha. E quem pede menos movimento no sistema
   ja e atendido pela regra global de `prefers-reduced-motion`. */
.sidebar-item::before {
    content: '';
    position: absolute; left: 0; top: 6px; bottom: 6px;
    width: 3px; background: var(--primary);
    border-radius: 0 3px 3px 0;
    transform: scaleY(0);
    transition: transform 0.18s cubic-bezier(0.4, 0, 0.2, 1);
}
.sidebar-item.ativo::before { transform: scaleY(1); }
.sidebar-item-icon {
    width: 20px; height: 20px;
    display: flex; align-items: center; justify-content: center;
    flex-shrink: 0; opacity: 0.6; transition: opacity 0.15s;
}
.sidebar-item:hover .sidebar-item-icon,
.sidebar-item.ativo .sidebar-item-icon { opacity: 1; }
.sidebar-item svg { width: 17px; height: 17px; }
.sidebar-item-label { overflow: hidden; text-overflow: ellipsis; }
/* Separa os grupos por ESPACO, sem risco (22/09/2026). A linha saiu junto
   com os rotulos: com quatro riscos e quatro titulos, o menu tinha mais
   moldura do que conteudo. O nome da classe fica, porque e citado no HTML
   e trocar so renomearia a mesma coisa. */
.sidebar-divider { height: 16px; }
/* ── MAIN AREA ── */
.main-area {
    margin-left: var(--sidebar-width);
    flex: 1; display: flex; flex-direction: column; min-width: 0;
    transition: margin-left 0.3s cubic-bezier(0.4,0,0.2,1);
}

/* ── HEADER ── */
.app-header {
    height: var(--header-height);
    background: var(--header-bg);
    border-bottom: 1px solid var(--border-light);
    display: flex; align-items: center;
    padding: 0 28px;
    position: sticky; top: var(--faixa-demo-h); z-index: 100;
    gap: 14px;
}
[data-theme="light"] .app-header { box-shadow: var(--shadow-sm); }

.btn-hamburger {
    display: none;
    background: none; border: none;
    color: var(--text-muted);
    cursor: pointer; padding: 6px;
    border-radius: var(--radius);
    transition: background 0.15s, color 0.15s;
}
.btn-hamburger:hover { background: var(--surface-hover); color: var(--text); }
.btn-hamburger svg { width: 22px; height: 22px; display: block; }

.header-page-title {
    font-family: 'Syne', sans-serif;
    font-size: 1.3rem; font-weight: 700;
    color: var(--text); letter-spacing: -0.02em;
    flex: 1; white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}

.header-actions { display: flex; align-items: center; gap: 8px; flex-shrink: 0; }

.header-action-btn {
    width: 36px; height: 36px;
    border-radius: var(--radius);
    background: var(--header-bg);
    border: 1px solid var(--border-light);
    color: var(--text-muted);
    cursor: pointer;
    display: flex; align-items: center; justify-content: center;
    transition: all 0.15s; font-family: inherit; font-size: 0.9rem;
}
.header-action-btn:hover { background: var(--surface-hover); color: var(--text); border-color: var(--border-strong); }
.header-action-btn svg { width: 17px; height: 17px; }

/* Busca global expandida no header */
.btn-busca-global {
    display: flex; align-items: center; gap: 8px;
    padding: 7px 14px;
    border-radius: var(--radius);
    background: var(--header-bg);
    border: 1px solid var(--border);
    color: var(--text-muted);
    cursor: pointer;
    font-family: inherit;
    font-size: 0.893rem; font-weight: 500;
    transition: all 0.18s;
    min-width: 140px;
}
.btn-busca-global:hover {
    background: var(--surface-hover);
    border-color: var(--primary);
    color: var(--text);
    box-shadow: 0 0 0 2px var(--primary-glow);
}

/* =====================================================
   LOGO FUEL MIND - Alternância por tema
   ===================================================== */
.sidebar-logo-img {
  height: 40px;
  width: auto;
  max-width: 180px;
  display: block;
  margin-left: auto;
  margin-right: auto;
}

/* Versão reduzida para mobile */
@media (max-width: 768px) {
  .sidebar-logo-img {
    height: 32px;
    max-width: none;
  }
}
.btn-busca-global span { white-space: nowrap; }
@media (max-width: 768px) {
    .btn-busca-global span { display: none; }
    .btn-busca-global { min-width: unset; padding: 7px 10px; }
}


.header-datetime {
    font-size: 0.893rem; color: var(--text-light);
    font-family: 'JetBrains Mono', monospace; white-space: nowrap;
}

/* ── CONTENT AREA ── */
.content-area { flex: 1; padding: 28px 28px 60px; overflow-x: hidden; }

/* ── OVERLAY MOBILE ── */
.sidebar-overlay {
    display: none; position: fixed; inset: var(--faixa-demo-h) 0 0 0;
    background: rgba(0,0,0,0.6); z-index: 199;
    backdrop-filter: blur(3px);
}
.sidebar-overlay.visivel { display: block; }

/* ══ TELAS ══════════════════════════════════════ */
.tela {
    display: none;
    animation: fadeSlideIn 0.22s ease;
    max-width: 1400px;
}
@keyframes fadeSlideIn {
    from { opacity: 0; transform: translateY(8px); }
    to   { opacity: 1; transform: translateY(0); }
}
.tela h2 {
    font-family: 'Syne', sans-serif;
    font-size: 1.5rem; font-weight: 700;
    color: var(--text); letter-spacing: -0.02em;
    margin-bottom: 24px;
}
.tela h3 {
    font-size: 0.86rem; font-weight: 700;
    color: var(--text-light); text-transform: uppercase;
    letter-spacing: 0.12em; margin: 28px 0 12px;
}

/* ══ KPI CARDS ══════════════════════════════════ */
.kpi-container {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));
    gap: 16px; margin-bottom: 28px;
}
.kpi-card {
    background: var(--surface);
    border: 1px solid var(--border-light);
    border-radius: var(--radius-lg);
    padding: 22px 22px 18px;
    position: relative; overflow: hidden;
    transition: transform 0.2s, box-shadow 0.2s;
    box-shadow: var(--shadow-sm);
}
.kpi-card:hover { transform: translateY(-3px); box-shadow: var(--shadow); }
.kpi-card::before {
    content: ''; position: absolute; left: 0; top: 0; bottom: 0;
    width: 4px; background: var(--primary); border-radius: 4px 0 0 4px;
}
.kpi-card::after {
    content: ''; position: absolute; right: -20px; top: -20px;
    width: 90px; height: 90px; border-radius: 50%;
    background: var(--primary); opacity: 0.05; transition: opacity 0.2s;
}
.kpi-card:hover::after { opacity: 0.1; }
.kpi-card.verde::before  { background: var(--success); }
.kpi-card.verde::after   { background: var(--success); }
.kpi-card.laranja::before{ background: var(--warning); }
.kpi-card.laranja::after { background: var(--warning); }
.kpi-card.roxo::before   { background: var(--info); }
.kpi-card.roxo::after    { background: var(--info); }
.kpi-card.violeta::before { background: var(--violeta); }
.kpi-card.violeta::after  { background: var(--violeta); }

.kpi-icon {
    width: 42px; height: 42px;
    border-radius: var(--radius);
    background: var(--primary-light);
    display: flex; align-items: center; justify-content: center;
    margin-bottom: 16px;
}
.kpi-icon svg { width: 20px; height: 20px; color: var(--primary-mid); }
.kpi-card.verde  .kpi-icon { background: var(--success-light); }
.kpi-card.verde  .kpi-icon svg { color: var(--success); }
.kpi-card.laranja .kpi-icon { background: var(--warning-light); }
.kpi-card.laranja .kpi-icon svg { color: var(--warning); }
.kpi-card.roxo   .kpi-icon { background: var(--info-light); }
.kpi-card.roxo   .kpi-icon svg { color: var(--info); }
.kpi-card.violeta .kpi-icon { background: var(--violeta-light); }
.kpi-card.violeta .kpi-icon svg { color: var(--violeta); }

.kpi-valor {
    font-family: 'Syne', sans-serif;
    font-size: 1.85rem; font-weight: 700;
    color: var(--text); line-height: 1;
    margin-bottom: 6px; letter-spacing: -0.03em;
}
.kpi-label {
    font-size: 0.86rem; text-transform: uppercase;
    letter-spacing: 0.09em; color: var(--text-light); font-weight: 700;
}
/* De que data é o número (rodada 11): o Dashboard mostra volume pela
   descarga e compra pela emissão, e cada card diz qual. */
.kpi-base {
    font-size: 0.86rem; color: var(--text-muted); margin-top: 4px;
}
.kpi-delta {
    display: inline-flex; align-items: center; gap: 3px;
    font-size: 0.893rem; font-weight: 700;
    margin-top: 10px; padding: 3px 9px; border-radius: 20px;
}
.kpi-delta.positivo { background: var(--success-light); color: var(--success); }
.kpi-delta.negativo { background: var(--danger-light); color: var(--danger); }
.kpi-delta.neutro   { background: var(--surface-alt); color: var(--text-light); }
.kpi-delta svg { width: 12px; height: 12px; }

/* ══ ALERTAS ══════════════════════════════════ */
.alertas-container { display: grid; gap: 8px; margin-bottom: 22px; }
.alertas-resumo { margin: 0; }
.alertas-mais { justify-self: start; }
.alerta-card {
    background: var(--surface);
    border-left: 4px solid var(--warning);
    border-radius: var(--radius);
    padding: 12px 16px;
    font-size: 0.875rem;
    color: var(--text);
    display: flex;
    align-items: center;
    gap: 10px;
    border: 1px solid var(--border-light);
    border-left-color: var(--warning);
}
.alerta-card.critico { border-left-color: var(--danger); }
.alerta-card::before { content: '⚠'; flex-shrink: 0; }
.alerta-card.critico::before { color: var(--danger); }

.alerta-clicavel {
    justify-content: space-between;
}
.alerta-corpo {
    cursor: pointer; flex: 1;
    padding: 2px 0;
}
.alerta-corpo:hover { opacity: 0.85; }
.alerta-link {
    font-size: 0.893rem; color: var(--primary);
    margin-left: 8px; font-weight: 600;
}
.alerta-ignorar {
    background: var(--surface-raised);
    border: 1px solid var(--border);
    border-radius: var(--radius-sm);
    padding: 4px 10px; font-size: 0.893rem;
    color: var(--text-muted); cursor: pointer;
    white-space: nowrap; transition: all 0.15s;
}
.alerta-ignorar:hover { background: var(--success); color: #fff; border-color: var(--success); }

/* ══ CARD / SEÇÃO ════════════════════════════ */
.card {
    background: var(--surface); border: 1px solid var(--border-light);
    border-radius: var(--radius-lg); padding: 24px;
    box-shadow: var(--shadow-sm); margin-bottom: 20px;
}
.card-header {
    display: flex; align-items: center; justify-content: space-between;
    margin-bottom: 20px; gap: 12px; flex-wrap: wrap;
}
.card-title {
    font-family: 'Syne', sans-serif; font-size: 1rem; font-weight: 700;
    color: var(--text); letter-spacing: -0.01em;
}

.sistema-secao {
    background: var(--surface); border: 1px solid var(--border-light);
    border-radius: var(--radius-lg); padding: 22px 24px;
    margin-bottom: 16px; box-shadow: var(--shadow-sm);
}
.sistema-secao h3 {
    margin-top: 0; margin-bottom: 10px;
    color: var(--text); font-family: 'Syne', sans-serif;
    font-size: 0.95rem; text-transform: none;
    letter-spacing: 0; font-weight: 700;
}
.sistema-acoes { display: flex; flex-wrap: wrap; gap: 10px; align-items: flex-start; flex-direction: column; }
/* Correções em massa: sete botões iguais em grade, não uma coluna de sete
   linhas (vistoria de 28/09/2026). */
.sistema-acoes--grade { display: grid; grid-template-columns: repeat(auto-fill, minmax(min(100%, 220px), 1fr)); align-items: stretch; }
.sistema-acoes--grade > button { justify-content: center; }
.zona-perigo { border-color: var(--danger); background: var(--danger-light); }

.info-sistema { display: grid; grid-template-columns: repeat(auto-fill, minmax(150px, 1fr)); gap: 10px; margin-bottom: 16px; }
/* O aviso de espaço em disco é concatenado na frente dos cartões e vira
   filho direto desta grade: sem isto ele fica espremido numa célula de
   150 px, com título, lista e explicação dentro. (21/09/2026) */
.info-sistema > .faixa-validacao { grid-column: 1 / -1; }
/* Cartão de número pequeno (Sistema, Conferência): rótulo em cima, número
   embaixo, como os cartões das outras telas. É `column-reverse` porque no
   HTML o número vem antes. O número não quebra linha ("L" sozinho). */
.info-card {
    display: flex; flex-direction: column-reverse; justify-content: flex-end; gap: 6px;
    background: var(--surface-alt); border: 1px solid var(--border-light);
    border-radius: var(--radius-md); padding: 14px 16px; text-align: left; min-width: 0;
}
.info-card-valor {
    font-family: 'Syne', sans-serif; font-size: 1.3rem; font-weight: 700;
    color: var(--text); line-height: 1.2; letter-spacing: -0.02em; white-space: nowrap;
    overflow: hidden; text-overflow: ellipsis;
}
.info-card-label {
    font-size: 0.86rem; text-transform: uppercase; letter-spacing: 0.08em;
    color: var(--text-muted); font-weight: 700;
}

/* ══ FORMULÁRIOS ════════════════════════════ */
.form-linha { display: flex; gap: 10px; margin-bottom: 16px; flex-wrap: wrap; }
.form-linha input { flex: 1; min-width: 200px; }
.form-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(220px, 1fr)); gap: 16px; margin-bottom: 24px; }
.campo { display: flex; flex-direction: column; gap: 6px; }
.campo label { font-size: 0.86rem; font-weight: 700; color: var(--text-muted); text-transform: uppercase; letter-spacing: 0.09em; }
/* Marcador de campo obrigatório: asterisco sutil na cor de perigo */
.campo-obrigatorio {
    color: var(--danger);
    font-size: 0.893rem;
    font-weight: 700;
    margin-left: 2px;
    vertical-align: middle;
    opacity: 0.75;
}

input, select, textarea {
    padding: 10px 14px; border: 1px solid var(--border);
    border-radius: var(--radius); font-size: 0.9rem; width: 100%;
    background: var(--surface-alt); color: var(--text);
    transition: border-color 0.2s, box-shadow 0.2s, background 0.2s;
    font-family: inherit;
    -webkit-appearance: none; appearance: none; line-height: 1.4;
}
input:focus, select:focus, textarea:focus {
    outline: none; border-color: var(--primary);
    box-shadow: 0 0 0 3px var(--primary-glow); background: var(--surface);
}
input::placeholder { color: var(--text-light); }
select {
    background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='6' viewBox='0 0 10 6'%3E%3Cpath d='M1 1l4 4 4-4' stroke='%2364748b' stroke-width='1.5' fill='none' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");
    background-repeat: no-repeat; background-position: right 12px center;
    padding-right: 34px; cursor: pointer;
}
textarea { resize: vertical; min-height: 80px; }
input[type="month"], input[type="date"] { font-family: 'JetBrains Mono', monospace; font-size: 0.93rem; }
input[type="checkbox"] { width: auto; padding: 0; cursor: pointer; accent-color: var(--primary); }

/* ══ LINKS ═══════════════════════════════════ */
/* O site não tinha regra nenhuma para `a`. A única que existia era a da
   faixa de validação, então os poucos links soltos (os anexos do detalhe
   da nota e o "Cancelar edição" do banner) saíam no azul padrão do
   navegador (#0000EE). No tema escuro isso é azul sobre preto, ilegível.
   Achado em 21/09/2026, montando na memória uma nota com anexo: o demo não
   tem nenhuma, e por isso nunca tinha aparecido. */
a { color: var(--primary); text-decoration: underline; text-underline-offset: 2px; }
a:hover { color: var(--primary-hover); }
/* Dentro de uma faixa colorida o link toma a cor da faixa, não a da marca. */
.banner-edicao a { color: inherit; }

/* ══ BOTÕES ══════════════════════════════════ */
button {
    padding: 9px 18px; border: none; border-radius: var(--radius);
    cursor: pointer; font-size: 0.875rem; font-weight: 600;
    font-family: inherit; letter-spacing: 0.01em;
    transition: all 0.2s ease; white-space: nowrap;
    display: inline-flex; align-items: center; gap: 7px;
}
.btn-primario {
    background: var(--primary); color: #fff;
    box-shadow: 0 2px 10px var(--primary-glow);
}
.btn-primario:hover { background: var(--primary-hover); transform: translateY(-1px); box-shadow: 0 4px 18px var(--primary-glow); }
.btn-primario:active { transform: translateY(0); }
/* Secundário com texto na cor normal: em cinza sobre cinza ele parecia
   desabilitado nos dois temas. Cancelar não fica vermelho ao passar o
   mouse: vermelho é de apagar, e cancelar não apaga nada. */
.btn-secundario {
    background: var(--surface-alt); color: var(--text); border: 1px solid var(--border);
}
.btn-secundario:hover { background: var(--surface-hover); color: var(--text); border-color: var(--border-strong); }
[data-theme="light"] .btn-secundario { background: var(--surface-raised); border-color: var(--border-strong); }
[data-theme="light"] .btn-secundario:hover { background: var(--surface-hover); }
.btn-cancelar { background: transparent; color: var(--text-muted); border: 1px solid var(--border); }
.btn-cancelar:hover { background: var(--surface-hover); color: var(--text); border-color: var(--border-strong); }
.btn-excluir  { background: transparent; color: var(--danger); font-size: 0.893rem; padding: 4px 10px; border: 1px solid var(--border); border-radius: var(--radius-sm); font-weight: 600; }
.btn-excluir:hover  { background: var(--danger-light); border-color: var(--danger); }
.btn-editar   { background: transparent; color: var(--success); font-size: 0.893rem; padding: 4px 10px; border: 1px solid var(--border); border-radius: var(--radius-sm); font-weight: 600; }
.btn-editar:hover   { background: var(--success-light); border-color: var(--success); }
.btn-inativar { background: transparent; color: var(--warning); font-size: 0.893rem; padding: 4px 10px; border: 1px solid var(--border); border-radius: var(--radius-sm); font-weight: 600; }
.btn-inativar:hover { background: var(--warning-light); border-color: var(--warning); }
.btn-clonar   { background: transparent; color: var(--info); font-size: 0.893rem; padding: 4px 10px; border: 1px solid var(--border); border-radius: var(--radius-sm); font-weight: 600; }
.btn-clonar:hover   { background: var(--info-light); border-color: var(--info); }
.btn-reset    { background: var(--danger-solido); color: #fff; padding: 10px 20px; font-weight: 700; }
.btn-reset:hover { opacity: 0.9; }

/* ══ EXPORTAÇÃO ══════════════════════════════ */
.barra-exportacao {
    display: flex; align-items: center; flex-wrap: wrap; gap: 6px;
    padding: 10px 16px; background: var(--surface);
    border: 1px solid var(--border-light); border-radius: var(--radius);
    margin-bottom: 16px;
}
.exportacao-titulo { font-weight: 700; font-size: 0.86rem; color: var(--text-light); text-transform: uppercase; letter-spacing: 0.1em; margin-right: 4px; }
/* Um grupo por documento (28/09/2026). A separação é o espaço e o nome de
   cada grupo: com um fio à esquerda, o grupo que descia de linha (Histórico
   a 1280 px) começava com um traço solto e recuado (revisão de 28/09/2026). */
.barra-exportacao:has(.exportacao-grupo) { column-gap: 26px; row-gap: 10px; }
.exportacao-grupo { display: flex; align-items: center; flex-wrap: wrap; gap: 6px; }
@media (max-width: 768px) {
    .exportacao-grupo { width: 100%; }
    .exportacao-grupo .exportacao-titulo { flex-basis: 100%; }
    .exportacao-grupo + .exportacao-grupo {
        border-left: 0; padding-left: 0; margin-left: 0;
        border-top: 1px solid var(--border); padding-top: 8px;
    }
}
.btn-export { padding: 5px 12px; border-radius: var(--radius); font-size: 0.893rem; font-weight: 700; border: 1px solid var(--border); background: var(--surface-alt); color: var(--text-muted); transition: all 0.15s; letter-spacing: 0.02em; }
.btn-export:hover { background: var(--surface-hover); color: var(--text); border-color: var(--border-strong); }
.btn-xlsx  { color: var(--success) !important; }
.btn-xlsx:hover  { background: var(--success-light) !important; border-color: var(--success) !important; }
.btn-pdf   { color: var(--primary-texto) !important; }
.btn-pdf:hover   { background: var(--primary-light) !important; border-color: var(--primary) !important; }
.btn-wpp   { color: var(--success) !important; }
.btn-wpp:hover   { background: var(--success-light) !important; border-color: var(--success) !important; }
.btn-email { color: var(--info) !important; }
/* "Imprimir" era o unico da fileira sem classe de cor no CSS. (21/09/2026) */
.btn-print { color: var(--text-muted) !important; }
.btn-print:hover { background: var(--surface-hover) !important; border-color: var(--border-strong) !important; color: var(--text) !important; }
.btn-email:hover { background: var(--info-light) !important; border-color: var(--info) !important; }
/* O verde estava escrito na mao e era o mesmo nos dois temas: 3,17 de
   contraste no escuro. --success ja tem tom por tema. (21/09/2026) */
.btn-csv { color: var(--success) !important; }
.btn-csv:hover { background: var(--success-light) !important; border-color: var(--success) !important; }

/* ══ TABELAS ═════════════════════════════════ */
/* `position: relative` não é enfeite. Sem ele, o `.sr-only` do cabeçalho
   ("Abrir", "Ações"), que é `position: absolute`, tinha como referência a
   janela e não este contêiner, e a rolagem daqui não o recortava. No
   celular ele ficava lá na direita, a 596 px, e o navegador reduzia o zoom
   da página inteira para caber: tudo miúdo, a partir do Dashboard. */
.tabela-container {
    position: relative;
    overflow-x: auto; border: 1px solid var(--border-light);
    border-radius: var(--radius-lg); box-shadow: var(--shadow-sm);
    background: var(--surface);
}
table { width: 100%; border-collapse: collapse; font-size: 0.855rem; }
thead tr { background: var(--thead-bg); }
th {
    padding: 13px 16px; text-align: left; font-weight: 700;
    font-size: 0.86rem; text-transform: uppercase;
    letter-spacing: 0.1em; white-space: nowrap; color: var(--thead-color);
}
td { padding: 11px 16px; text-align: left; border-bottom: 1px solid var(--border-light); color: var(--text); vertical-align: middle; }
tbody tr:last-child td { border-bottom: none; }
tbody tr:hover { background: var(--row-hover); }
tbody tr:nth-child(even) { background: var(--row-alt); }
tbody tr:nth-child(even):hover { background: var(--row-hover); }
.td-vazio { text-align: center; color: var(--text-muted); padding: 40px; font-style: italic; font-size: 0.875rem; }

/* ══ PAINEL DETALHES ═════════════════════════ */
.painel-detalhes { margin-top: 20px; background: var(--surface); border: 1px solid var(--border-light); border-radius: var(--radius-lg); padding: 24px; box-shadow: var(--shadow); }
.detalhe-info { display: grid; grid-template-columns: repeat(auto-fill, minmax(180px, 1fr)); gap: 12px; margin-bottom: 16px; }
.detalhe-info div { padding: 6px 0; }
.detalhe-info span { font-size: 0.86rem; color: var(--text-light); text-transform: uppercase; letter-spacing: 0.1em; display: block; font-weight: 700; margin-bottom: 3px; }
.detalhe-info strong { font-size: 0.9rem; color: var(--text); font-weight: 600; }
.detalhe-tabela { width: 100%; border-collapse: collapse; margin-top: 12px; font-size: 0.855rem; border: 1px solid var(--border-light); border-radius: var(--radius); overflow: hidden; }
.detalhe-tabela th { background: var(--surface-alt); color: var(--text-muted); padding: 9px 14px; text-align: left; font-size: 0.86rem; text-transform: uppercase; letter-spacing: 0.09em; font-weight: 700; }
.detalhe-tabela td { padding: 10px 14px; border-bottom: 1px solid var(--border-light); }
.detalhe-obs { background: var(--surface-alt); border: 1px solid var(--border-light); border-radius: var(--radius); padding: 12px 16px; margin-top: 12px; font-size: 0.875rem; color: var(--text-muted); white-space: pre-wrap; }
.detalhe-obs > strong:first-child { display: block; font-size: 0.86rem; text-transform: uppercase; letter-spacing: 0.1em; color: var(--text-light); margin-bottom: 5px; font-weight: 700; }

/* ══ LISTAS ══════════════════════════════════ */
.filtro-lista { margin-bottom: 12px; font-size: 0.855rem; color: var(--text-muted); }
.filtro-lista label { display: flex; align-items: center; gap: 8px; cursor: pointer; user-select: none; }
ul { list-style: none; }
ul li { display: flex; justify-content: space-between; align-items: center; padding: 12px 16px; border-bottom: 1px solid var(--border-light); font-size: 0.875rem; gap: 10px; flex-wrap: wrap; transition: background 0.12s; }
ul li:first-child { border-top: 1px solid var(--border-light); }
ul li:hover { background: var(--row-hover); }
ul li.inativo { opacity: 0.45; }
.acoes-lista { display: flex; gap: 5px; flex-shrink: 0; flex-wrap: wrap; }
.tag-inativo { font-size: 0.86rem; background: var(--warning-light); color: var(--warning); padding: 2px 7px; border-radius: 10px; font-style: normal; font-weight: 700; margin-left: 8px; text-transform: uppercase; letter-spacing: 0.06em; }
.tag-perda   { font-size: 0.86rem; background: var(--info-light); color: var(--info); padding: 2px 7px; border-radius: 10px; font-style: normal; font-weight: 700; margin-left: 8px; text-transform: uppercase; letter-spacing: 0.06em; }
.vazio { color: var(--text-light); font-style: italic; font-size: 0.875rem; justify-content: flex-start !important; padding: 20px 16px !important; border: none !important; }

/* Botão de ação dentro do toast, o "Desfazer" (18/09/2026). */
.toast-acao {
    margin-left: 10px; padding: 3px 10px; border-radius: var(--radius-sm);
    border: 1px solid currentColor; background: transparent; color: inherit;
    font-weight: 600; cursor: pointer; font-size: 0.893rem;
}
.toast-acao:hover { background: rgba(255,255,255,0.12); }

/* Variação contra o período anterior, dentro do card (18/09/2026). */
.kpi-variacao { font-size: 0.86rem; margin-top: 4px; color: var(--text-muted); font-family: 'JetBrains Mono', monospace; }
.kpi-variacao-boa { color: var(--success); }
.kpi-variacao-ruim { color: var(--danger); }

/* Número que leva à lista que o formou (17/09/2026). */
.kpi-clicavel { cursor: pointer; }
/* A borda do hover seguia sempre a cor da marca, entao um cartao verde
   piscava vermelho ao passar o mouse. Agora cada variante usa a propria
   cor, a mesma do tracinho da esquerda e do icone. (21/09/2026) */
/* Contorno uniforme no hover (24/09/2026, pedido do dono): era a borda de
   1 px pintada, e a faixa de 4 px da esquerda ficava mais grossa que o
   resto do contorno. Agora são a borda mais 2 px de sombra interna, 3 px
   em volta (com 4 px o dono achou largo demais), e a faixa some no hover
   para o lado esquerdo não ficar mais grosso. Sombra, e não borda mais
   grossa: nada se mexe no layout. */
.kpi-clicavel { --cor-kpi: var(--primary); }
.kpi-clicavel.verde   { --cor-kpi: var(--success); }
.kpi-clicavel.laranja { --cor-kpi: var(--warning); }
.kpi-clicavel.roxo    { --cor-kpi: var(--info); }
.kpi-clicavel.violeta { --cor-kpi: var(--violeta); }
.kpi-clicavel::before { transition: opacity var(--duration-fast) var(--ease-standard); }
.kpi-clicavel:hover {
    border-color: var(--cor-kpi);
    box-shadow: var(--shadow), inset 0 0 0 2px var(--cor-kpi);
    transform: translateY(-1px);
    transition: transform var(--duration-fast) var(--ease-standard),
                border-color var(--duration-fast) var(--ease-standard),
                box-shadow var(--duration-fast) var(--ease-standard);
}
.kpi-clicavel:hover::before { opacity: 0; }
tr.linha-clicavel { cursor: pointer; }
/* Linha escolhida pelas setas do teclado (18/09/2026). */
tr.linha-teclado-ativa td { background: var(--surface-hover); box-shadow: inset 3px 0 0 var(--primary); }
tr.linha-clicavel:hover td { background: var(--surface-hover); }

/* ══ LANÇAMENTOS ════════════════════════════ */
.linha-combustivel {
    /* As colunas são declaradas junto da célula de descarga, mais abaixo:
       com o campo oculto a linha tem uma coluna a menos. É lá também que
       elas viram uma coluna só, abaixo de 640 px. Havia regras para 768 e
       480 px no bloco responsivo, mas nunca valeram: vinham antes no
       arquivo e perdiam sempre para esta (saíram em 23/09/2026). */
    display: grid;
    gap: 8px; align-items: center; margin-bottom: 8px;
    padding: 12px 14px; background: var(--surface-alt);
    border-radius: var(--radius); border: 1px solid var(--border-light);
    transition: border-color 0.15s;
}
.linha-combustivel:hover { border-color: var(--border-strong); }
.badge-perda { font-size: 0.86rem; padding: 3px 10px; border-radius: 12px; font-weight: 700; white-space: nowrap; font-family: 'JetBrains Mono', monospace; }
.badge-perda.ok      { background: var(--success-light); color: var(--success); }
.badge-perda.alerta  { background: var(--warning-light); color: var(--warning); }
.badge-perda.excesso { background: var(--danger-light);  color: var(--danger); }
.acoes-lancamento { display: flex; gap: 10px; margin-top: 24px; flex-wrap: wrap; padding-top: 20px; border-top: 1px solid var(--border-light); }
.banner-edicao { background: var(--info-light); border: 1px solid var(--border-light); border-left: 4px solid var(--info); border-radius: var(--radius); padding: 10px 16px; margin-bottom: 16px; font-size: 0.875rem; color: var(--info); display: none; }

/* ══ DICA ════════════════════════════════════ */
.dica { font-size: 0.93rem; color: var(--text-muted); margin-bottom: 14px; line-height: 1.6; }

/* ══ FILTROS ═════════════════════════════════ */
.filtros { display: grid; grid-template-columns: repeat(auto-fill, minmax(170px, 1fr)); gap: 12px; margin-bottom: 14px; padding: 18px; background: var(--surface); border: 1px solid var(--border-light); border-radius: var(--radius-lg); box-shadow: var(--shadow-sm); }
/* O botão que recolhe os filtros do Histórico só existe no celular. */
.filtros-alternar { display: none; }
@media (max-width: 768px) {
    /* Com a classe do botão junto: a regra de tela de toque centraliza todo
       `.btn-secundario`, vem depois no arquivo e empatava com esta. */
    .btn-secundario.filtros-alternar {
        display: flex; width: 100%; justify-content: space-between; align-items: center;
        margin-bottom: var(--space-3);
    }
    .filtros-alternar svg { width: 16px; height: 16px; transition: transform 0.15s; }
    .filtros-alternar[aria-expanded="true"] svg { transform: rotate(180deg); }
    .filtros-alternar-qtd { color: var(--primary-texto); font-weight: 700; }
    #relatorios .filtros:not(.filtros-abertos) { display: none; }
}
.filtros-acoes { display: flex; gap: 8px; margin-bottom: 16px; flex-wrap: wrap; align-items: center; }
.resumo { background: var(--surface); border: 1px solid var(--border-light); border-left: 4px solid var(--primary); border-radius: var(--radius); padding: 11px 16px; margin-bottom: 14px; font-size: 0.875rem; color: var(--text-muted); display: none; }
.filtros-rapidos-sep { font-size: 0.86rem; font-weight: 700; color: var(--text-light); text-transform: uppercase; letter-spacing: 0.08em; align-self: center; white-space: nowrap; }
.filtros-rapidos-linha { display: flex; align-items: center; gap: 7px; margin-bottom: 18px; flex-wrap: wrap; }
.btn-filtro-rapido { padding: 5px 12px; border: 1px solid var(--border); background: var(--surface); color: var(--text-muted); border-radius: 20px; font-size: 0.893rem; font-weight: 600; cursor: pointer; transition: all 0.15s; font-family: inherit; }
.btn-filtro-rapido:hover { background: var(--primary-light); border-color: var(--primary); color: var(--primary-mid); }

/* ══ ABAS ════════════════════════════════════ */
.analitico-abas { display: flex; flex-wrap: wrap; gap: 4px; margin-bottom: 20px; border-bottom: 1px solid var(--border-light); }
.aba-btn { background: transparent; color: var(--text-light); padding: 9px 16px; border-radius: 0; font-size: 0.893rem; font-weight: 600; border: none; border-bottom: 2px solid transparent; position: relative; bottom: -1px; transition: color 0.15s, border-color 0.15s; }
.aba-btn:hover { color: var(--text); border-bottom-color: var(--border-strong); }
.aba-btn.ativa { color: var(--primary-texto); font-weight: 700; border-bottom-color: var(--primary); }
.aba-btn svg {
    width: 16px;
    height: 16px;
    margin-right: 6px;
    vertical-align: middle;
}

/* ══ GRÁFICOS ════════════════════════════════ */
.grafico-wrapper { background: var(--surface); border: 1px solid var(--border-light); border-radius: var(--radius-lg); padding: 20px; overflow-x: auto; min-height: 200px; display: flex; align-items: center; justify-content: center; }
.grafico-wrapper canvas { max-width: 100%; display: block; }
.grafico-vazio { color: var(--text-light); font-style: italic; font-size: 0.9rem; text-align: center; padding: 40px 0; }
/* Estado vazio de uma tela inteira (mês sem nota etc.): um cartão, não uma
   frase solta. */
.estado-vazio-cartao {
    display: flex; flex-direction: column; gap: 4px; padding: var(--space-5) var(--space-6);
    background: var(--surface); border: 1px dashed var(--border); border-radius: var(--radius-lg);
    color: var(--text-muted); font-size: 0.88rem; margin-bottom: var(--space-4);
}
.estado-vazio-cartao strong { color: var(--text); font-size: 0.95rem; }

/* ══ MODAL ═══════════════════════════════════ */
/* Modal mais alto que a tela: o fundo rola e a margem automática centraliza
   só quando cabe. Com `align-items: center` sozinho, o topo do modal (título
   incluído) ficava fora da tela, sem como chegar nele (18/09/2026). No modo
   demo a camada começa abaixo da faixa vermelha, que cobria o título. */
.modal-overlay { position: fixed; top: var(--faixa-demo-h); left: 0; width: 100%; height: calc(100% - var(--faixa-demo-h)); background: rgba(0,0,0,0.85); backdrop-filter: blur(6px); -webkit-backdrop-filter: blur(6px); display: flex; align-items: center; justify-content: center; z-index: 1000; padding: 20px; overflow-y: auto; }
.modal { background: var(--surface-raised); border-radius: var(--radius-xl); padding: 28px 30px; width: 100%; max-width: 400px; box-shadow: var(--shadow-lg); border: 1px solid var(--border); animation: modalIn 0.22s cubic-bezier(0.34,1.56,0.64,1); margin: auto; }
/* No tema claro o fundo do modal escurece menos: preto a 85 % pesava como
   se a tela tivesse apagado. */
[data-theme="light"] .modal-overlay { background: rgba(33,37,41,0.5); }
@keyframes modalIn { from { opacity: 0; transform: scale(0.93) translateY(12px); } to { opacity: 1; transform: scale(1) translateY(0); } }
.modal h3 { color: var(--text); margin-bottom: 20px; font-family: 'Syne', sans-serif; font-size: 1.05rem; font-weight: 700; text-transform: none; letter-spacing: 0; }
.modal-acoes { display: flex; gap: 8px; margin-top: 20px; justify-content: flex-end; flex-wrap: wrap; }
/* Botão com nome de empresa no rótulo pode passar da largura do modal:
   quebra a linha em vez de vazar pela borda. */
.modal-acoes button { max-width: 100%; white-space: normal; }

/* ══ BADGES ══════════════════════════════════ */
.badge-var { display: inline-flex; align-items: center; gap: 3px; padding: 3px 8px; border-radius: 10px; font-size: 0.86rem; font-weight: 700; font-family: 'JetBrains Mono', monospace; }
.badge-var.alta  { background: var(--danger-light); color: var(--danger); }
.badge-var.baixa { background: var(--success-light); color: var(--success); }
.badge-var.igual { background: var(--surface-alt); color: var(--text-light); }
.alerta-comparativo { background: var(--warning-light); border: 1px solid var(--warning); border-radius: var(--radius); padding: 11px 16px; margin-top: 12px; font-size: 0.875rem; color: var(--warning); }
.barra-progresso { height: 3px; background: var(--border-light); border-radius: 3px; overflow: hidden; margin-top: 6px; }
.barra-progresso-fill { height: 100%; background: var(--primary); border-radius: 3px; transition: width 0.6s ease; }

/* ══ ANALÍTICO FILTROS ═══════════════════════ */

.input-tabela { width: 110px !important; padding: 6px 8px !important; font-size: 0.893rem !important; border-radius: var(--radius-sm) !important; text-align: right; font-family: 'JetBrains Mono', monospace !important; }

/* ══ FRETES ══════════════════════════════════ */
.frete-taxas-grid { display: flex; flex-wrap: wrap; gap: 10px; margin-top: 12px; }
.frete-taxa-item { display: flex; flex-direction: column; gap: 6px; background: var(--surface-alt); border: 1px solid var(--border-light); border-radius: var(--radius-md); padding: 12px 16px; min-width: 180px; }
.frete-taxa-item label { font-weight: 700; font-size: 0.86rem; text-transform: uppercase; letter-spacing: 0.08em; color: var(--text-muted); }
.linha-detalhe-frete td { background: var(--surface-alt) !important; font-size: 0.893rem; }

/* ══ TOAST ═══════════════════════════════════ */
.toast { position: relative; display: flex; align-items: center; gap: 11px; padding: 13px 20px; border-radius: var(--radius-md); font-size: 0.875rem; font-weight: 500; line-height: 1.4; box-shadow: var(--shadow-md); z-index: 9999; opacity: 0; transform: translateY(16px) scale(0.96); transition: opacity 0.25s ease, transform 0.25s ease; max-width: 380px; pointer-events: none; }
.toast-visivel { opacity: 1; transform: translateY(0) scale(1); }
.toast-icone { width: 22px; height: 22px; border-radius: 50%; display: flex; align-items: center; justify-content: center; font-size: 0.893rem; font-weight: 700; flex-shrink: 0; }
/* Texto na cor normal; o tipo fica na borda, na faixa da esquerda e no
   ícone. A frase inteira em azul ou laranja lia mal, principalmente no tema
   escuro (18/09/2026). */
.toast-sucesso { background: var(--surface-raised); color: var(--text); border: 1px solid var(--success); border-left-width: 4px; }
.toast-sucesso .toast-icone { background: var(--success); color: #fff; }
.toast-erro    { background: var(--surface-raised); color: var(--text); border: 1px solid var(--danger); border-left-width: 4px; }
.toast-erro    .toast-icone { background: var(--danger-solido); color: #fff; }
.toast-aviso   { background: var(--surface-raised); color: var(--text); border: 1px solid var(--warning); border-left-width: 4px; }
.toast-aviso   .toast-icone { background: var(--warning); color: #fff; }
.toast-info    { background: var(--surface-raised); color: var(--text); border: 1px solid var(--info); border-left-width: 4px; }
.toast-info    .toast-icone { background: var(--info-solido); color: #fff; }

/* ══ TOTALIZADOR ════════════════════════════ */
.totalizador-nota { display: flex; align-items: center; gap: 20px; padding: 14px 20px; background: var(--surface-alt); border: 1px solid var(--border-light); border-left: 4px solid var(--primary); border-radius: var(--radius); margin-top: 12px; flex-wrap: wrap; }
.total-item { display: flex; flex-direction: column; gap: 2px; }
.total-label { font-size: 0.86rem; font-weight: 700; text-transform: uppercase; letter-spacing: 0.1em; color: var(--text-light); }
.total-valor { font-size: 1.1rem; font-weight: 700; color: var(--text); font-family: 'JetBrains Mono', monospace; letter-spacing: -0.02em; }
/* Destaque pelo tamanho, não pelo vermelho, que no sistema quer dizer
   alerta (vistoria de 28/09/2026, como o frete do mês em Fretes). */
.total-destaque { color: var(--text); font-size: 1.2rem; }
.total-sep { color: var(--border-strong); font-size: 1.4rem; align-self: center; }

/* ══ PAGINAÇÃO ═══════════════════════════════ */
.paginacao { display: flex; align-items: center; justify-content: space-between; flex-wrap: wrap; gap: 8px; padding: 12px 16px; background: var(--surface); border: 1px solid var(--border-light); border-top: none; border-radius: 0 0 var(--radius-lg) var(--radius-lg); font-size: 0.893rem; }
/* Sem páginas, sem barra: vazia ela aparecia como uma tira solta sob a tabela. */
.paginacao:empty { display: none; }
.pag-info { color: var(--text-muted); }
.pag-controles { display: flex; align-items: center; gap: 4px; flex-wrap: wrap; }
.pag-btn { padding: 5px 10px; min-width: 32px; border: 1px solid var(--border); background: var(--surface); color: var(--text-muted); border-radius: var(--radius-sm); font-size: 0.893rem; font-weight: 600; cursor: pointer; transition: all 0.12s; font-family: inherit; }
.pag-btn:hover:not(:disabled) { background: var(--surface-alt); border-color: var(--border-strong); color: var(--text); }
.pag-btn.ativo { background: var(--primary); color: #fff; border-color: var(--primary); }
.pag-btn:disabled { opacity: 0.3; cursor: not-allowed; }
.pag-ellipsis { padding: 4px; color: var(--text-light); font-size: 0.893rem; user-select: none; }

/* ══ XML / IMPORTAÇÃO ═══════════════════════ */
.importar-xml-bloco { background: var(--surface-alt); border: 1px solid var(--border-light); border-left: 4px solid var(--primary); border-radius: var(--radius-md); padding: 16px 20px; margin-bottom: 24px; }
.importar-xml-label { display: block; font-size: 0.893rem; font-weight: 700; color: var(--text); text-transform: uppercase; letter-spacing: 0.08em; margin-bottom: 5px; }
.tag-opcional { font-size: 0.86rem; background: var(--surface); color: var(--text-light); border: 1px solid var(--border); padding: 2px 7px; border-radius: 10px; font-style: normal; font-weight: 600; margin-left: 7px; text-transform: uppercase; vertical-align: middle; }
.banner-xml { background: var(--success-light); border: 1px solid var(--success); border-left: 4px solid var(--success); border-radius: var(--radius); padding: 12px 16px; margin-bottom: 16px; font-size: 0.875rem; color: var(--success); line-height: 1.7; display: none; }
.banner-xml small { display: block; margin-top: 5px; color: var(--warning); font-size: 0.893rem; }

/* ══ IMPORTAÇÃO PLANILHA ════════════════════ */
.tabela-preview { width: 100%; border-collapse: collapse; font-size: 0.893rem; }
.tabela-preview th { background: var(--surface-alt); padding: 8px 12px; text-align: left; font-size: 0.86rem; text-transform: uppercase; letter-spacing: 0.07em; color: var(--text-light); border-bottom: 2px solid var(--border); white-space: nowrap; }
.tabela-preview td { padding: 7px 12px; border-bottom: 1px solid var(--border-light); max-width: 160px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.tabela-preview tr:hover td { background: var(--row-hover); }
/* Mínimo de 360 px por coluna, mas nunca mais que a largura que existe: no
   celular de 320 ou 360 a grade passava da tela. Sem espaço para rótulo e
   seletor lado a lado, o seletor desce (23/09/2026). */
.mapeamento-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(min(100%, 360px), 1fr)); gap: 10px; margin-top: 10px; }
.mapeamento-linha { display: flex; flex-wrap: wrap; align-items: center; gap: 12px; padding: 10px 14px; background: var(--surface-alt); border: 1px solid var(--border-light); border-radius: var(--radius); }
.mapeamento-label { flex: 1; font-size: 0.855rem; min-width: 160px; }
.mapeamento-label.obrigatorio { font-weight: 700; }
.mapeamento-label.obrigatorio::after { content: " *"; color: var(--danger); }
.mapeamento-select { flex: 1; min-width: 160px; }
.importacao-aviso { background: var(--warning-light); border: 1px solid var(--warning); border-radius: var(--radius); padding: 12px 16px; font-size: 0.875rem; color: var(--warning); margin-top: 12px; line-height: 1.8; }
.importacao-aviso.aviso-novos { background: var(--info-light); border-color: var(--info); color: var(--info); }
.resumo-cards { display: flex; gap: 14px; flex-wrap: wrap; margin: 16px 0; }
.resumo-card { flex: 1; min-width: 120px; padding: 16px 20px; border-radius: var(--radius-md); text-align: center; }
.resumo-card.verde   { background: var(--success-light); color: var(--success); }
.resumo-card.laranja { background: var(--warning-light); color: var(--warning); }
.resumo-card.cinza   { background: var(--surface-alt);   color: var(--text-muted); }
.resumo-card.vermelho{ background: var(--danger-light);  color: var(--danger); }
.resumo-valor { font-family: 'Syne', sans-serif; font-size: 2rem; font-weight: 700; line-height: 1; }
.resumo-label { font-size: 0.86rem; margin-top: 5px; font-weight: 700; text-transform: uppercase; letter-spacing: 0.07em; }
.detalhes-resumo { background: var(--surface); border: 1px solid var(--border-light); border-radius: var(--radius); padding: 10px 14px; font-size: 0.855rem; cursor: pointer; margin-top: 10px; }
.detalhes-resumo.erro summary { color: var(--danger); }
.detalhes-resumo summary { font-weight: 700; user-select: none; }
.importacao-sucesso { text-align: center; padding: 48px 24px; }
.sucesso-icone { font-size: 3.5rem; margin-bottom: 16px; }
.importacao-sucesso h3 { font-family: 'Syne', sans-serif; font-size: 1.4rem; margin-bottom: 10px; }
.importacao-sucesso p { color: var(--text-muted); margin-bottom: 5px; }

/* ══ LOG LIST ════════════════════════════════ */
.log-list { margin-top: 6px; font-size: 0.893rem; color: var(--text-light); list-style: none; font-family: 'JetBrains Mono', monospace; }
.log-list li { padding: 3px 0; border: none; font-size: 0.893rem; justify-content: flex-start; }
.log-list li::before { content: '·'; margin-right: 7px; color: var(--primary); }
.preview-nf { max-width: 100%; margin-top: 8px; border-radius: var(--radius); border: 1px solid var(--border); }


/* ══════════════════════════════════════════════
   INPUT DATE / MONTH: o ícone do calendário

   Aqui havia DUAS correções para o mesmo problema, escritas em momentos
   diferentes, e a segunda desfazia a primeira.

   O `filter: invert(1)` nasceu quando o ícone vinha preto por padrão e não
   havia mais nada cuidando dos controles nativos. Em 21/09/2026 entrou
   `color-scheme` por tema (no topo deste arquivo), que manda o NAVEGADOR
   desenhar caixa de marcar, barra de rolagem e calendário no tom certo: no
   escuro o ícone já nasce branco. A partir dali o `invert` passou a fazer
   o contrário do que prometia, devolvendo o ícone branco para preto, e no
   fundo escuro ele sumia. O dono achou no seletor de mês da central.

   Sobra a opacidade, que é a única coisa que ainda é decisão nossa: o
   ícone fica discreto em repouso e firme no hover. Não há mais bloco
   separado por tema, porque o `color-scheme` já resolve os dois.
   (22/09/2026) */
input[type="date"]::-webkit-calendar-picker-indicator,
input[type="month"]::-webkit-calendar-picker-indicator {
    opacity: 0.75;
    cursor: pointer;
    transition: opacity 0.15s;
}
input[type="date"]::-webkit-calendar-picker-indicator:hover,
input[type="month"]::-webkit-calendar-picker-indicator:hover {
    opacity: 1;
}

/* ══ IMPRESSÃO ═══════════════════════════════ */
@media print {
    .sidebar, .app-header, .filtros, .filtros-acoes, .barra-exportacao, .acoes-lancamento, .acoes-lista, .btn-excluir, .btn-editar, .btn-secundario, .btn-clonar, .painel-detalhes, .no-print { display: none !important; }
    .main-area { margin-left: 0 !important; }
    /* Os botões "Imprimir" de Fretes e de Relatórios imprimem o PDF do
       padrão desde 25/09/2026; a folha montada à parte (#areaImpressao)
       saiu. Isto aqui é só o Ctrl+P da tela aberta. */
    body { background: white; color: black; font-size: 11px; font-family: Arial, sans-serif; }
    table { border-collapse: collapse; width: 100%; font-size: 10px; }
    th, td { border: 1px solid #aaa; padding: 5px 8px; }
    thead tr { background: #1e2227 !important; color: white !important; }
    tr { page-break-inside: avoid; }
}

/* ══ RESPONSIVO ══════════════════════════════ */
@media (max-width: 1024px) {
    :root { --sidebar-width: 220px; }
    .content-area { padding: 20px 20px 48px; }
}
/* A barra lateral vira gaveta abaixo de 1024 px, e não só no celular
   (23/09/2026). Entre 769 e 1023 ela ficava fixa com 220 px: num tablet em
   pé (820) sobravam 565 px para o conteúdo, e a legenda da Distribuição
   caía para 8 px de largura. No celular deitado (844x390) a barra ocupava
   um quarto da tela, a tela inteira de altura. Notebook de 1366 com zoom
   de 125% continua com a barra fixa: a janela dele tem 1093. O limite em
   JS que fecha a gaveta ao tocar num item (ui.js) usa o mesmo número. */
/* Fechada, a gaveta também fica `visibility: hidden`: só com o
   `transform` ela saía da vista mas não do Tab, e quem navega pelo
   teclado numa janela de 960 px passava por quinze itens invisíveis antes
   de chegar à tela. O `visibility` espera a animação de saída terminar
   (atraso de 0,3 s) e volta na hora ao abrir. */
@media (max-width: 1023px) {
    :root { --sidebar-width: 260px; }
    .sidebar {
        transform: translateX(-100%); visibility: hidden;
        transition: transform 0.3s cubic-bezier(0.4,0,0.2,1), visibility 0s linear 0.3s;
    }
    .sidebar.aberta {
        transform: translateX(0); visibility: visible; box-shadow: var(--shadow-lg);
        transition: transform 0.3s cubic-bezier(0.4,0,0.2,1), visibility 0s;
    }
    .main-area { margin-left: 0; }
    .btn-hamburger { display: flex; }
}
/* O fundo escuro da gaveta não existe com a barra fixa. Sem isto, um
   tablet girado de em pé para deitado com o menu aberto ficava com o
   fundo escuro por cima de tudo até mais um toque. */
@media (min-width: 1024px) { .sidebar-overlay.visivel { display: none; } }
@media (max-width: 768px) {
    .content-area { padding: 16px 14px 48px; }
    .kpi-container { grid-template-columns: repeat(2, 1fr); gap: 10px; }
    .kpi-valor { font-size: 1.4rem; }
    .form-grid { grid-template-columns: 1fr; }
    .filtros { grid-template-columns: 1fr; padding: 14px; }
    th { padding: 10px 12px; font-size: 0.86rem; }
    td { padding: 9px 12px; }
    .aba-btn { font-size: 0.893rem; padding: 8px 11px; }
    .info-sistema { grid-template-columns: repeat(2, 1fr); }
    .header-datetime { display: none; }
    .header-page-title { font-size: 1rem; }
}
@media (max-width: 480px) {
    .kpi-container { grid-template-columns: 1fr; }
    .resumo-cards { flex-direction: column; }
    .mapeamento-grid { grid-template-columns: 1fr; }
    td, th {
        padding: 6px 8px;
        font-size: 0.86rem;
    }
    .btn-export {
        padding: 4px 8px;
        font-size: 0.86rem;
    }
    /* Alvo de toque no celular. Estes três caíam para 21–22 px de altura,
       abaixo do mínimo de 24 px, e são botões largos com espaço de sobra.
       Os ícones das tabelas ficam em 28 px e já passam: a densidade delas,
       escolhida em 18/09, não muda. (21/09/2026) */
    .btn-export, .segmentado button, .btn-metrica, .demo-dica button { min-height: 32px; }
    /* Os dois links de saida criados em 22/09 caiam em 22 px de altura,
       o mesmo problema dos tres acima: "Ver no Analitico" no Dashboard e
       "Ver em Fretes" no cartao da central. */
    .dash-ver-completo, .central-card-abrir { min-height: 32px; }
}

/* ══════════════════════════════════════════════
   DASHBOARD: POR COMBUSTÍVEL (único bloco)
══════════════════════════════════════════════ */
.dash-combs-wrapper {
    background: var(--surface);
    border: 1px solid var(--border-light);
    border-radius: var(--radius-lg);
    padding: 20px;
    margin-top: 8px;
}

.dash-comb-kpis {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(160px, 1fr));
    gap: 12px;
    margin-bottom: 4px;
}

.dash-comb-kpi {
    background: var(--surface-alt);
    border: 1px solid var(--border-light);
    border-radius: var(--radius-md);
    padding: 14px 16px;
    border-left: 3px solid var(--border-strong);
    transition: transform 0.15s;
}
.dash-comb-kpi:hover { transform: translateY(-2px); }
/* As mesmas cores dos cartões do topo: o de notas é o vermelho da marca,
   e era o único sem cor, com a borda cinza (vistoria de 28/09/2026). */
.dash-comb-kpi.vermelho { border-left-color: var(--primary); }
.dash-comb-kpi.verde   { border-left-color: var(--success); }
.dash-comb-kpi.laranja { border-left-color: var(--warning); }
.dash-comb-kpi.roxo    { border-left-color: var(--info); }

.dash-comb-kpi-val {
    font-family: 'JetBrains Mono', monospace;
    font-size: 1.25rem;
    font-weight: 600;
    color: var(--text);
    letter-spacing: -0.02em;
    line-height: 1.2;
}

.dash-comb-kpi-label {
    font-size: 0.86rem;
    text-transform: uppercase;
    letter-spacing: 0.07em;
    color: var(--text-light);
    margin-top: 4px;
    display: flex;
    flex-direction: column;
    gap: 3px;
}

.dash-variacao-alta  { color: var(--danger);  font-size: 0.86rem; font-weight: 600; }
.dash-variacao-baixa { color: var(--success); font-size: 0.86rem; font-weight: 600; }
.dash-variacao-ok    { color: var(--text-muted); font-size: 0.86rem; }

/* ── Comparativo mês a mês ── */
#dashComparativoContainer .tabela-container { margin-top: 8px; }
.linha-mes-atual td { background: var(--surface-raised) !important; font-weight: 600; }

/* ========== SPINNER EM BOTÕES ========== */
.btn-spinner {
    pointer-events: none;
    opacity: 0.7;
    position: relative;
    padding-left: 2.2rem;
}
.btn-spinner::before {
    content: '';
    position: absolute;
    left: 0.7rem;
    top: calc(50% - 8px);
    width: 16px;
    height: 16px;
    border: 2px solid transparent;
    border-top-color: currentColor;
    border-radius: 50%;
    animation: spin 0.6s linear infinite;
}
@keyframes spin { to { transform: rotate(360deg); } }

/* ========== FOCO VISÍVEL ========== */
/* Campo de texto longo, link e o que recebe foco por `tabindex` (a prévia
   do PDF no celular, por exemplo) também ganham o contorno. */
button:focus-visible, input:focus-visible, select:focus-visible,
textarea:focus-visible, a:focus-visible, [tabindex]:not([tabindex="-1"]):focus-visible {
    outline: 2px solid var(--foco);
    outline-offset: 2px;
}

/* ========== TOGGLE SWITCH ========== */
._cfg-toggle {
    position: relative;
    display: inline-block;
    width: 42px;
    height: 24px;
    flex-shrink: 0;
}
._cfg-toggle input { opacity: 0; width: 0; height: 0; }
._cfg-slider {
    position: absolute; inset: 0;
    background: var(--border);
    border-radius: 24px;
    cursor: pointer;
    transition: background 0.2s;
}
._cfg-slider:before {
    content: '';
    position: absolute;
    width: 18px; height: 18px;
    left: 3px; top: 3px;
    background: #fff;
    /* A bolinha branca sobre a trilha --border do tema claro (#dee2e6) dava
       1,2 de contraste e praticamente sumia com o alerta desligado. A sombra
       a destaca nos dois temas sem mudar o tamanho. (21/09/2026) */
    box-shadow: 0 1px 3px rgba(0,0,0,0.35), 0 0 0 1px rgba(0,0,0,0.12);
    border-radius: 50%;
    transition: transform 0.2s;
}
._cfg-toggle input:checked + ._cfg-slider { background: var(--primary); }
._cfg-toggle input:checked + ._cfg-slider:before { transform: translateX(18px); }

/* ========== BLOCO DE CONFIG ========== */
._cfg-bloco {
    padding: 16px;
    border-radius: 10px;
    border: 1px solid var(--border-light);
    background: var(--surface-alt);
}
/* ========== SELETOR DE EMPRESA NO HEADER ========== */
.header-select {
    background: var(--header-bg);
    border: 1px solid var(--border);
    color: var(--text);
    border-radius: var(--radius);
    padding: 6px 10px;
    font-size: 0.93rem;
    cursor: pointer;
    outline: none;
}
.header-select:hover {
    border-color: var(--border-strong);
}
.header-select:focus {
    border-color: var(--primary);
    box-shadow: 0 0 0 2px var(--primary-glow);
}

/* ── SIDEBAR MODO CLARO ── */
[data-theme="light"] .sidebar {
    background: #ffffff;
    border-right: 1px solid #e2e8f0;
    box-shadow: 2px 0 12px rgba(0,0,0,0.04);
}
/* Sem fundo proprio (22/09/2026). O tema claro pintava a area da logo de
   #f8fafc contra o #ffffff da barra: 4,6% mais escura, numa superficie de
   259 por 64 px colada nela. Sutil para medir, visivel para o olho, e o
   dono reparou. O tema escuro nunca fez isso, deixa a area transparente e
   ela herda o fundo da barra, entao a diferenca era so entre os temas.
   E desde que a area passou a ter a mesma altura do cabecalho, a linha de
   baixo ja a delimita: o fundo era uma segunda marcacao para a mesma
   coisa. */
[data-theme="light"] .sidebar-logo {
    border-bottom: 1px solid #e2e8f0;
}
[data-theme="light"] .sidebar-logo-title { color: #0f172a; }
[data-theme="light"] .sidebar-logo-sub { color: #94a3b8; }
/* Ícone da logo usa --primary-subtle para seguir a cor primária */
[data-theme="light"] .sidebar-logo-icon { background: var(--primary-subtle); }
[data-theme="light"] .sidebar-logo-icon svg { stroke: var(--primary); }
[data-theme="light"] .sidebar-item { color: #334155; }
[data-theme="light"] .sidebar-item:hover { background: #f1f5f9; color: #0f172a; }
[data-theme="light"] .sidebar-item:hover .sidebar-item-icon svg { stroke: var(--primary); }
/* Item ativo usa --primary-subtle2 para seguir a cor primária */
[data-theme="light"] .sidebar-item.ativo {
    background: var(--primary-subtle2);
    color: var(--primary);
    border-left-color: var(--primary);
}
[data-theme="light"] .sidebar-item.ativo .sidebar-item-icon svg { stroke: var(--primary); }
[data-theme="light"] .sidebar-item .sidebar-item-icon { color: #94a3b8; }
[data-theme="light"] .sidebar-item.ativo .sidebar-item-icon { color: var(--primary); }
/* ── ALERTAS MODO ESCURO ── */
[data-theme="dark"] .alerta-card {
    background: rgba(30,37,53,0.95) !important;
    color: var(--text);
}
[data-theme="dark"] .alerta-card strong { color: var(--text); }
[data-theme="dark"] .alerta-card .alerta-msg { color: var(--text-muted); }
[data-theme="dark"] .alerta-card--laranja {
    background: rgba(245,158,11,0.07) !important;
    border-left-color: var(--warning) !important;
}
[data-theme="dark"] .alerta-card--laranja .alerta-titulo { color: var(--warning) !important; }
[data-theme="dark"] .alerta-card--azul {
    background: rgba(59,130,246,0.07) !important;
    border-left-color: var(--info) !important;
}
[data-theme="dark"] .alerta-card--azul .alerta-titulo { color: var(--info) !important; }
[data-theme="dark"] .alerta-card--vermelho {
    background: rgba(239,68,68,0.07) !important;
    border-left-color: var(--danger) !important;
}
[data-theme="dark"] .alerta-card--vermelho .alerta-titulo { color: var(--danger) !important; }
[data-theme="dark"] .alerta-ignorar {
    border-color: #475569;
    color: var(--text-muted);
    background: transparent;
}
[data-theme="dark"] .alerta-ignorar:hover {
    background: var(--success);
    color: #fff;
    border-color: var(--success);
}

/* ── BADGE DE ABA (dashboard) ── */
.badge-aba {
    display: inline-block;
    margin-left: 6px;
    font-size: 0.86rem;
    font-family: 'JetBrains Mono', monospace;
    background: var(--primary-light);
    color: var(--primary-texto);
    padding: 1px 6px;
    border-radius: 10px;
    font-weight: 600;
    vertical-align: middle;
}
/* ══ ABAS TELA UNIFICADA RELATÓRIOS ══════════════════ */
.rel-aba-conteudo { animation: fadeSlideIn 0.18s ease; }
/* As outras vinte abas do sistema, que trocavam secas (22/09/2026).
   Cadastros tem sete, o Analitico seis, Fretes quatro e Sistema tres, e
   nenhuma delas animava, enquanto a troca de TELA e as abas do Historico
   ja faziam isto desde sempre. Nao era escolha: era esta regra, que
   existia so para a classe do Historico.
   Medido: 8,9 ms a mais por troca, metade de um quadro a 60 fps, e as
   duas propriedades animadas sao compostas pela GPU. */
.aba-conteudo, .sistema-aba-conteudo { animation: fadeSlideIn 0.18s ease; }

/* ══ BUSCA GLOBAL: REDESIGN ═════════════════════════ */
.busca-global-modal {
    padding: 0 !important;
    overflow: hidden;
    border-radius: var(--radius-xl) !important;
}
.busca-global-header {
    display: flex;
    align-items: center;
    gap: 12px;
    padding: 16px 20px;
    border-bottom: 1px solid var(--border-light);
    background: var(--surface);
}
.busca-global-icone {
    width: 20px; height: 20px;
    color: var(--text-muted);
    flex-shrink: 0;
}
.busca-global-input {
    flex: 1;
    border: none !important;
    background: transparent !important;
    font-size: 1rem !important;
    color: var(--text) !important;
    padding: 0 !important;
    box-shadow: none !important;
    outline: none !important;
    font-family: 'DM Sans', sans-serif;
}
.busca-global-input:focus {
    border: none !important;
    box-shadow: none !important;
}
/* 420 px, ou menos em janela baixa: no notebook com zoom (530 px de
   janela) e no celular deitado, o campo de busca e os resultados não
   cabiam juntos. Os 170 px são o campo, o rodapé de atalhos e o recuo da
   camada escura; a faixa da demonstração, quando existe, sai também. */
.busca-global-resultados {
    max-height: min(420px, calc(100vh - var(--faixa-demo-h) - 170px));
    overflow-y: auto;
    padding: 8px;
}
.busca-global-resultados::-webkit-scrollbar { width: 4px; }
.busca-global-resultados::-webkit-scrollbar-thumb { background: var(--border-strong); border-radius: 4px; }
.busca-global-footer {
    display: flex;
    gap: 20px;
    padding: 10px 20px;
    border-top: 1px solid var(--border-light);
    background: var(--surface-alt);
    font-size: 0.86rem;
    color: var(--text-light);
}
.busca-kbd {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    padding: 2px 6px;
    background: var(--surface-raised);
    border: 1px solid var(--border-strong);
    border-radius: 4px;
    font-size: 0.86rem;
    font-family: 'JetBrains Mono', monospace;
    color: var(--text-muted);
    line-height: 1.4;
    margin: 0 2px;
}
.busca-kbd-esc {
    cursor: pointer;
    transition: all 0.15s;
    flex-shrink: 0;
}
.busca-kbd-esc:hover {
    background: var(--danger-light);
    border-color: var(--danger);
    color: var(--danger);
}

.td-vazio { color: var(--text-muted) !important; }
.dica     { color: var(--text-muted) !important; }

.sidebar-item         { color: rgba(255,255,255,0.68); }
.sidebar-item:hover   { background: rgba(255,255,255,0.09); color: rgba(255,255,255,0.93); }
.campo label          { color: var(--text-muted); font-size: 0.86rem; }

/* =====================================================
   EMPRESA ATIVA: Badge no header
   ===================================================== */
.empresa-ativa-badge {
    display:flex; align-items:center; gap:5px;
    background: var(--primary-subtle);
    border:1px solid var(--primary);
    color:var(--primary); border-radius:20px; padding:4px 10px;
    font-size:0.893rem; font-weight:600; cursor:pointer;
    transition:background 0.15s; white-space:nowrap;
}
.empresa-ativa-badge:hover { background: var(--primary-subtle4); }
/* O badge virou <button> para ser alcançável por Tab: era um <div onclick>
   sem tabindex, e quem trabalha só com teclado não conseguia trocar de
   empresa. Estas linhas desfazem o estilo nativo do botão. */
button.empresa-ativa-badge { font-family: inherit; line-height: inherit; }
.empresa-ativa-badge:focus-visible { outline: 2px solid var(--foco); outline-offset: 2px; }

/* O campo Empresa travado pela empresa ativa era idêntico a um campo
   editável: mesmo fundo, mesma cor, mesma borda. Não havia regra para
   input desabilitado no projeto. */
#empresaInput:disabled {
    border-style: dashed;
    color: var(--text-muted);
    cursor: not-allowed;
    opacity: 0.85;
}

/* O nome da empresa ao lado do título da lista da sessão: é ali que fica o
   Desfazer, e é ali que importa saber de que empresa são as notas. */
.sessao-empresa-titulo { font-weight: 600; color: var(--text-muted); }

.btn-empresa-troca {
    width:100%; padding:12px 16px; text-align:left;
    background:var(--surface-alt); border:1px solid var(--border);
    border-radius:var(--radius-sm); cursor:pointer; font-size:0.92rem;
    display:flex; align-items:center; justify-content:space-between; gap:8px;
    transition:background 0.15s, border-color 0.15s; color:var(--text);
}
.btn-empresa-troca:hover { background:var(--surface-hover); border-color:var(--primary); }
.btn-empresa-troca.ativa {
    border-color:var(--primary);
    background: var(--primary-subtle2);
    color:var(--text); font-weight:600;
}
/* O nome em vermelho-vinho sobre o fundo escuro quase sumia; o destaque
   fica na borda, no fundo e no ✓. */
.btn-empresa-troca.ativa .icone-check { color: var(--primary-mid); }

/* =====================================================
   USUÁRIOS: Badges de role e status
   ===================================================== */
.badge-role {
    display:inline-flex; align-items:center;
    font-size:0.86rem; font-weight:700; border-radius:20px;
    padding:2px 8px; text-transform:uppercase; letter-spacing:0.03em;
}
/* badge-role-supremo usa --primary-subtle3 para seguir a cor primária */
.badge-role-supremo { background: var(--primary-subtle3); color:var(--primary-texto); }
/* Estas quatro etiquetas tinham a cor escrita na mão, e escrita com os
   valores do tema ESCURO (#3b82f6, #10b981, #ef4444, #f59e0b), que ficavam
   também no tema claro. Sobre o fundo claro delas o contraste caía para
   1,87 ("Você"), 2,16 ("Operador") e 3,03 ("Admin"), abaixo do mínimo de
   4,5. O tema claro já tem as variantes escurecidas (--info, --success,
   --danger, --warning) justamente para isso; agora elas as usam. (21/09/2026) */
.badge-role-admin   { background: var(--info-light);    color: var(--info); }
.badge-role-usuario { background: var(--success-light); color: var(--success); }
/* Papel fora dos tres conhecidos cai em "desconhecido" e nao tinha cor. */
.badge-role-desconhecido { background: var(--surface-hover); color: var(--text-muted); }


.badge-inativo-user {
    display:inline-flex; font-size:0.86rem; font-weight:600;
    background: var(--danger-light); color: var(--danger);
    border-radius:20px; padding:2px 8px;
}
.badge-voce {
    display:inline-flex; font-size:0.86rem; font-weight:600;
    background: var(--warning-light); color: var(--warning);
    border-radius:20px; padding:2px 8px;
}
.badge-empresa-tag {
    display:inline-flex; font-size:0.893rem;
    background:var(--surface-alt); border:1px solid var(--border-light);
    border-radius:20px; padding:2px 8px;
}
.linha-inativo td { opacity:0.55; }

/* O estado de um lançamento vem colado no número da nota, e não numa
   coluna própria: uma décima primeira coluna, vazia em quase todas as
   linhas, empurrava a de Ações para fora da área visível e cobrava uma
   rolagem lateral no dia normal por causa de uma exceção rara. O badge é
   o mesmo que a tela de Usuários usa no usuário desativado. */
.linha-inativo .badge-inativo-user { text-decoration: none; opacity: 1; }

/* O diff de uma edição, dentro do histórico do lançamento. */
.log-diff { margin: 4px 0 0 14px; padding: 0; list-style: none; }
.log-diff li { font-size: 0.893rem; color: var(--text-muted); line-height: 1.5; }
.log-diff s { opacity: 0.7; }
.log-motivo { font-size: 0.893rem; color: var(--text-muted); margin-top: 2px; }

/* O caminho de "cancelada na origem" mora no painel de detalhe, longe da
   linha de todo dia: é operação rara e não pode competir com Editar. */
.detalhe-acoes-estado {
    margin-top: 14px; padding-top: 12px;
    border-top: 1px solid var(--border-light);
    display: flex; align-items: center; gap: 10px; flex-wrap: wrap;
}
.detalhe-acoes-estado small { color: var(--text-light); font-size: 0.893rem; }
/* O risco pula a célula da nota (senão o badge sairia riscado junto) e a
   de Ações, onde ficam os botões. */
.linha-inativo td:not(:nth-child(3)):not(.no-print) { text-decoration: line-through; }

/* A caixa "Mostrar excluídas" fica na grade de filtros do relatório, no
   mesmo lugar em que as seis abas de Cadastros põem "Mostrar inativos". */
.filtros .campo-checkbox { justify-content: flex-end; }
.filtros .campo-checkbox label {
    display: flex; align-items: center; gap: 6px;
    font-size: 0.893rem; color: var(--text-muted); cursor: pointer;
    white-space: nowrap;
}
.filtros .campo-checkbox input { width: auto; margin: 0; }

/* ══════════════════════════════════════════════
   CABEÇALHOS ORDENÁVEIS (relatorios.js)
══════════════════════════════════════════════ */
.th-sortable {
    cursor: pointer;
    user-select: none;
    white-space: nowrap;
}
.th-sortable:hover { background: rgba(255,255,255,0.06); }
.th-sort-icon {
    display: inline-block;
    margin-left: 4px;
    font-size: 0.86rem;
    opacity: 0.35;
    transition: opacity 0.15s;
}
.th-sort-icon.ativo {
    opacity: 1;
    color: var(--primary-texto);
}

/* ══════════════════════════════════════════════
   BOTÃO FECHAR SIDEBAR (mobile)
══════════════════════════════════════════════ */
.btn-fechar-sidebar {
    display: none;
    align-items: center;
    justify-content: center;
    background: none;
    border: none;
    cursor: pointer;
    color: rgba(255,255,255,0.6);
    padding: 4px;
    border-radius: 6px;
    flex-shrink: 0;
    transition: color 0.15s, background 0.15s;
}
.btn-fechar-sidebar:hover {
    color: #fff;
    background: rgba(255,255,255,0.1);
}
/* No tema claro a barra é branca: o × branco sumia (18/09/2026). */
[data-theme="light"] .btn-fechar-sidebar { color: #64748b; }
[data-theme="light"] .btn-fechar-sidebar:hover { color: #0f172a; background: #f1f5f9; }
@media (max-width: 1023px) {
    .btn-fechar-sidebar { display: flex; }
    /* Garante que logo e botão fechar fiquem lado a lado */
    .sidebar-logo {
        display: flex;
        align-items: center;
        justify-content: space-between;
    }
}

/* ══════════════════════════════════════════════
   MELHORIAS MOBILE
══════════════════════════════════════════════ */
@media (max-width: 768px) {
    /* Tabelas: permite scroll horizontal com indicação visual */
    .tabela-container {
        overflow-x: auto;
        -webkit-overflow-scrolling: touch;
        border-radius: var(--radius);
    }
    .tabela-container::after {
        content: '';
        display: block;
    }

    /* Colunas secundárias nas tabelas de relatório: ocultar em telas pequenas.
       No Relatório (sem a coluna Empresa desde 18/09/2026): base e placa. */
    #tabelaRelatorio > tr.linha-nota > td:nth-child(4),
    #tabelaRelatorio > tr.linha-nota > td:nth-child(6),
    #tabelaHistorico td:nth-child(4),
    #tabelaHistorico td:nth-child(6),
    #tabelaRelatorioEl thead th:nth-child(4),
    #tabelaRelatorioEl thead th:nth-child(6) {
        display: none;
    }

    /* Botões de ação menores em mobile */
    .btn-editar, .btn-clonar, .btn-excluir, .btn-ver-inline {
        font-size: 0.86rem;
        padding: 3px 7px;
    }

    /* Barra de exportação empilha verticalmente */
    .barra-exportacao {
        flex-wrap: wrap;
        gap: 6px;
    }
    .barra-exportacao .btn-export {
        flex: 1 1 auto;
        min-width: 80px;
        text-align: center;
    }

    /* KPI cards do dashboard em 2 colunas no mobile médio */
    .kpi-container { grid-template-columns: repeat(2, 1fr); }

    /* Formulário de lançamento: campos essenciais destacados */
    .linha-combustivel {
        background: var(--surface-alt);
        border-radius: var(--radius);
        padding: 10px;
        margin-bottom: 6px;
    }
}

@media (max-width: 480px) {
    /* KPI em coluna única em telas muito pequenas */
    .kpi-container { grid-template-columns: 1fr; }

    /* Ocultar mais colunas secundárias. No Relatório fica o essencial:
       emissão, NOTA, litros, total e ações; antes o número da nota era
       justamente o que sumia. */
    #tabelaRelatorio > tr.linha-nota > td:nth-child(2),
    #tabelaRelatorio > tr.linha-nota > td:nth-child(5),
    #tabelaRelatorioEl thead th:nth-child(2),
    #tabelaRelatorioEl thead th:nth-child(5),
    #tabelaHistorico td:nth-child(3) {
        display: none;
    }

    /* Títulos menores */
    h2 { font-size: 1.1rem; }
    h3 { font-size: 0.95rem; }

    /* Modal ocupa tela inteira */
    .modal {
        width: 100% !important;
        max-width: 100% !important;
        border-radius: var(--radius) var(--radius) 0 0;
        margin: auto 0 0;
    }
    /* A folha encosta nas laterais e no pé da tela, como folha de celular. */
    .modal-overlay { align-items: flex-end; padding: 20px 0 0; }
    /* A busca fica no alto: no pé da tela o teclado aberto espremia o campo. */
    #buscaGlobalModal { padding: 0; }
    #buscaGlobalModal .modal { margin: 0 0 auto; border-radius: 0 0 var(--radius) var(--radius); }
}

/* ══════════════════════════════════════════════
   RESPONSIVIDADE MOBILE, COMPLEMENTAR
   Cobre tabelas de fretes, usuários
   e melhorias gerais não cobertas anteriormente
══════════════════════════════════════════════ */

@media (max-width: 768px) {

    /* ── Tabela de usuários: ocultar último acesso ── */
    #usuariosConteudo table thead th:nth-child(4),
    #usuariosConteudo table tbody td:nth-child(4) {
        display: none;
    }

    /* ── Barra de abas do analítico: scroll horizontal ── */
    #analiticoAbas {
        display: flex;
        flex-wrap: nowrap;
        overflow-x: auto;
        -webkit-overflow-scrolling: touch;
        gap: 6px;
        padding-bottom: 4px;
    }
    #analiticoAbas .aba-btn { flex-shrink: 0; }

    /* ── Formulário de lançamento: ajustes ── */
    .acoes-lancamento {
        flex-direction: column;
        gap: 8px;
    }
    .acoes-lancamento .btn-primario,
    .acoes-lancamento .btn-secundario {
        width: 100%;
        text-align: center;
    }

    /* ── Filtros rápidos: wrap melhor ── */
    .filtros-acoes {
        flex-wrap: wrap;
        gap: 6px;
    }

    /* ── Paginação: botões menores ── */
    .pag-btn {
        padding: 4px 8px;
        font-size: 0.893rem;
        min-width: 30px;
    }

    /* ── Header: esconder data/hora ── */
    .header-datetime { display: none; }

    /* ── Sistema: grid de info em 1 coluna ── */
    .info-sistema { grid-template-columns: 1fr; }
}

@media (max-width: 480px) {
    /* ── KPI do dashboard: 1 coluna ── */
    .dash-comb-kpis { grid-template-columns: 1fr 1fr; }

    /* ── Barra de exportação: 2 por linha ── */
    .barra-exportacao { gap: 4px; }
    .btn-export { flex: 1 1 calc(50% - 4px); text-align: center; }

    /* ── Filtros rápidos: 2 por linha ── */
    .btn-filtro-rapido { flex: 1 1 calc(50% - 4px); text-align: center; }

    /* ── Sidebar: largura total ── */
    :root { --sidebar-width: 100vw; }
}

/* ========== MODO DEMONSTRAÇÃO ========== */
#demoFaixa {
    position: fixed;
    top: 0; left: 0; right: 0;
    z-index: 1500;
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 16px;
    flex-wrap: wrap;
    padding: 8px 16px;
    background: var(--primary);
    color: #fff;
    font-size: 0.893rem;
    box-shadow: 0 2px 10px rgba(0,0,0,0.25);
}
#demoFaixa button {
    background: rgba(255,255,255,0.16);
    color: #fff;
    border: 1px solid rgba(255,255,255,0.35);
    border-radius: var(--radius-sm);
    padding: 4px 10px;
    font-size: 0.893rem;
    cursor: pointer;
}
#demoFaixa button:hover { background: rgba(255,255,255,0.28); }
/* No celular a faixa tinha três linhas (116 px de 844) e ficava por cima de
   tudo. Fica o aviso e os dois botões numa linha só; a explicação continua
   na tela de entrada da demonstração. */
@media (max-width: 560px) {
    #demoFaixa { flex-wrap: nowrap; gap: var(--space-2); padding: 6px 12px; }
    #demoFaixa .demo-faixa-detalhe { display: none; }
    #demoFaixa .demo-faixa-acoes { flex-shrink: 0; }
}
body.com-faixa-demo { padding-top: var(--faixa-demo-h); }


/* =================================================================
   AFN SYSTEMS: marca compartilhada
   Padrao dos projetos do Alyssom Fernandes. Tokens e medidas vem do
   brand guide; nao ajustar cor, peso ou letter-spacing por projeto.
   O tema escuro e o padrao aqui, entao os valores base sao os dark e
   [data-theme="light"] sobrescreve.
   Contraste no escuro (13/10/2026, aprovado pelo dono): SYSTEMS, a barra,
   o nome do projeto e o "by" saem a 62% do branco (eram 28%, 2,4:1), e o
   AFN clareia um tom, de #c44a5a (4,2:1 a 10 px) para #cf5868. O guia da
   marca e os outros projetos precisam receber o mesmo ajuste.
   ================================================================= */
.pf-afn  { font-family: 'JetBrains Mono', monospace; font-weight: 700; letter-spacing: 2px; color: #cf5868; -webkit-text-stroke: 0.3px rgba(207,88,104,0.4); }
.pf-sys  { font-family: 'JetBrains Mono', monospace; font-weight: 700; letter-spacing: 2px; color: rgba(255,255,255,0.62); }
.pf-gap  { width: 4px; display: inline-block; }
.pf-pipe { font-family: 'JetBrains Mono', monospace; font-weight: 700; color: rgba(255,255,255,0.62); }
.pf-info { font-family: 'JetBrains Mono', monospace; font-weight: 700; letter-spacing: .3px; color: rgba(255,255,255,0.62); }

[data-theme="light"] .pf-afn  { color: #6b1f2a; -webkit-text-stroke: 0.3px rgba(107,31,42,0.4); }
[data-theme="light"] .pf-sys,
[data-theme="light"] .pf-pipe,
[data-theme="light"] .pf-info { color: #505050; }

/* Assinatura no login: AFN SYSTEMS sobre "by Alyssom Fernandes" */
.pf-assinatura {
    margin-top: 20px; padding-top: 16px;
    border-top: 1px solid var(--border);
    display: flex; flex-direction: column; align-items: center; gap: 3px;
}
.pf-marca { display: flex; align-items: baseline; }
.pf-by {
    font-family: 'JetBrains Mono', monospace; font-weight: 700;
    font-size: 9px; letter-spacing: 1.4px; text-transform: uppercase;
    color: rgba(255,255,255,0.62);
}
[data-theme="light"] .pf-by { color: #505050; }

/* Rodape: AFN SYSTEMS | NomeDoProjeto */
.pf-rodape {
    display: flex; align-items: center; justify-content: center; gap: 10px;
    flex-wrap: wrap;
}

/* Rodapé de página, AFN Systems. Fica no fim da área de conteúdo, não na
   sidebar: é rodapé da página, e acompanha a rolagem do conteúdo. */
.page-footer {
    padding: 20px 36px;
    border-top: 1px solid var(--border);
    display: flex; align-items: center; justify-content: center;
    gap: 10px; flex-wrap: wrap;
    margin-top: auto;
}

@media (max-width: 480px) {
    .page-footer { padding: 16px 18px; }
}

@media print {
    .page-footer, #demoFaixa, #toastPilha, .modal-overlay { display: none !important; }
}

/* Pilha de mensagens: o posicionamento saiu do .toast individual para o
   contêiner, para que várias mensagens se empilhem em vez de se sobrepor. */
#toastPilha {
    position: fixed; bottom: 28px; right: 28px;
    z-index: 9999;
    display: flex; flex-direction: column-reverse; align-items: flex-end;
    gap: 10px;
    pointer-events: none;
}
@media (max-width: 480px) {
    #toastPilha { left: 16px; right: 16px; bottom: 16px; align-items: stretch; }
}

/* ══ COMBOBOX DE CADASTRO (motorista, placa, base) ═══════════════════
   Substitui o <datalist> nativo nos campos que apontam para cadastro.
   O wrapper existe para a lista se posicionar em relação ao campo. */
.fm-combo { position: relative; display: block; width: 100%; }
.fm-combo-lista {
    position: absolute; top: calc(100% + 4px); left: 0; right: 0;
    /* Acima do bannerXML e do totalizador, abaixo dos modais (que usam 1000+). */
    z-index: 60;
    margin: 0; padding: 4px; list-style: none;
    max-height: 260px; overflow-y: auto;
    background: var(--surface-raised, var(--surface));
    border: 1px solid var(--border); border-radius: var(--radius);
    box-shadow: 0 8px 24px rgba(0,0,0,0.28);
}
.fm-combo-cabecalho {
    font-size: 0.86rem; font-weight: 700; text-transform: uppercase;
    letter-spacing: 0.09em; color: var(--text-light);
    padding: 6px 10px 4px;
}
.fm-combo-item {
    padding: 8px 10px; border-radius: var(--radius-sm);
    font-size: 0.875rem; color: var(--text); cursor: pointer;
    display: flex; align-items: center; justify-content: space-between; gap: 10px;
}
.fm-combo-item:hover { background: var(--surface-hover); }
.fm-combo-item.ativo { background: var(--primary); color: var(--text-on-dark); }
.fm-combo-item.ativo .fm-combo-extra { color: var(--text-on-dark); opacity: 0.75; }
/* Nome longo quebra a linha em vez de empurrar a lista para o lado. O
   texto de apoio (município, placa antiga, apelido) pode ocupar até
   metade e também quebra, alinhado à direita. */
.fm-combo-nome { min-width: 0; overflow-wrap: anywhere; }
.fm-combo-extra { font-size: 0.893rem; color: var(--text-light); flex: 0 1 auto; max-width: 50%; text-align: right; overflow-wrap: anywhere; }
/* Sem espaço embaixo do campo, a lista abre em cima (combobox.js). */
.fm-combo-lista--acima { top: auto; bottom: calc(100% + 4px); box-shadow: 0 -8px 24px rgba(0,0,0,0.28); }
.fm-combo-vazio {
    padding: 8px 10px; font-size: 0.93rem; color: var(--text-light); font-style: italic;
}
.fm-combo-novo { color: var(--primary-mid); font-weight: 600; }
.fm-combo-novo.ativo { color: var(--text-on-dark); }
/* Anúncio para leitor de tela; invisível na tela. */
.fm-combo-status {
    position: absolute; width: 1px; height: 1px; overflow: hidden;
    clip: rect(0 0 0 0); white-space: nowrap;
}
/* Campo preenchido por sugestão do histórico, não escolhido pelo operador. */
.campo-sugerido {
    border-color: var(--info) !important;
    background: var(--info-light) !important;
}

/* ══ FAIXA DE RASCUNHO RECUPERADO ════════════════════════════════════ */
.banner-rascunho {
    background: var(--warning-light); border: 1px solid var(--warning);
    border-left: 4px solid var(--warning); border-radius: var(--radius);
    padding: 12px 16px; margin-bottom: 16px;
    font-size: 0.875rem; color: var(--warning); line-height: 1.7;
}
.banner-rascunho small { display: block; margin-top: 4px; color: var(--text-muted); font-size: 0.893rem; }
.banner-acoes { display: flex; gap: 8px; margin-top: 10px; flex-wrap: wrap; }
.banner-acoes button { padding: 6px 14px; font-size: 0.893rem; }

/* ══ MARCA DE CAMPO HERDADO ══════════════════════════════════════════ */
.marca-herdada {
    display: inline-block; margin-left: 6px; padding: 1px 6px;
    border-radius: 999px; background: var(--info-light); color: var(--info);
    font-size: 0.86rem; font-weight: 700; letter-spacing: 0.06em;
    text-transform: uppercase;
}

/* ══ LANÇADAS NESTA SESSÃO ═══════════════════════════════════════════ */
.sessao-bloco { margin-top: 28px; }
.sessao-contador {
    font-size: 0.86rem; font-weight: 700; color: var(--text-light);
    text-transform: uppercase; letter-spacing: 0.08em; margin-left: 8px;
}
.sessao-item {
    display: flex; align-items: center; gap: 12px; flex-wrap: wrap;
    padding: 9px 12px; margin-bottom: 6px;
    background: var(--surface-alt); border: 1px solid var(--border-light);
    border-radius: var(--radius); font-size: 0.93rem;
}
.sessao-hora    { color: var(--text-light); font-size: 0.893rem; min-width: 40px; }
.sessao-nota    { font-weight: 700; min-width: 70px; }
.sessao-empresa { color: var(--text-muted); flex: 1; min-width: 120px; }
.sessao-base    { color: var(--text-light); min-width: 90px; }
.sessao-litros  { min-width: 100px; text-align: right; }
.sessao-total   { min-width: 100px; text-align: right; font-weight: 600; }
.sessao-item .btn-excluir,
.sessao-item .btn-editar { margin-left: auto; }

/* A nota desfeita continua na lista da sessão, riscada, com o Refazer ao
   lado. Sumir seria a mesma mentira de antes, só que do outro lado. */
.sessao-item-desfeita {
    opacity: 0.6;
    border-style: dashed;
}
.sessao-item-desfeita .sessao-nota,
.sessao-item-desfeita .sessao-litros,
.sessao-item-desfeita .sessao-total { text-decoration: line-through; }

.dica-atalho {
    font-size: 0.86rem; color: var(--text-light);
    align-self: center; margin-left: 4px;
}
@media (max-width: 640px) {
    .dica-atalho { display: none; }
    .sessao-empresa, .sessao-base { min-width: 0; }
}

/* ══ VALIDAÇÃO INLINE ════════════════════════════════════════════════
   Mensagem persistente junto do campo, no lugar da fila de modais que
   o salvamento abria. Cor nunca sozinha: sempre com texto. */
.msg-validacao {
    display: none; margin-top: 5px; font-size: 0.893rem; line-height: 1.45;
}
.msg-validacao[data-tipo="bloqueio"] { color: var(--danger); }
.msg-validacao[data-tipo="alerta"]   { color: var(--warning); }
.msg-validacao::before { margin-right: 5px; font-weight: 700; }
.msg-validacao[data-tipo="bloqueio"]::before { content: "✕"; }
.msg-validacao[data-tipo="alerta"]::before   { content: "!"; }

.campo-bloqueio { border-color: var(--danger) !important; }
.campo-alerta   { border-color: var(--warning) !important; }

/* Referência de preço: a régua que o alerta usa, mostrada antes do erro.
   Discreta de propósito: é informação, não julgamento, e por isso não
   usa a cor de aviso nem ícone. */
.ref-preco {
    display: block; margin-top: 4px;
    font-size: 0.86rem; line-height: 1.35; color: var(--text-muted);
    max-width: 240px;
}

/* Alerta de preço, dentro da célula de badge que a linha já tem. */
.aviso-preco {
    display: block; margin-top: 4px;
    font-size: 0.86rem; line-height: 1.35; color: var(--warning);
    max-width: 240px;
}

/* ══ FAIXA DE VALIDAÇÃO, ACIMA DOS BOTÕES ════════════════════════════ */
.faixa-validacao {
    margin-top: 24px; padding: 12px 16px;
    border-radius: var(--radius); border: 1px solid; border-left-width: 4px;
    font-size: 0.93rem; line-height: 1.6;
}
.faixa-validacao.faixa-bloqueio {
    background: var(--danger-light); border-color: var(--danger); color: var(--danger);
}
.faixa-validacao.faixa-alerta {
    background: var(--warning-light); border-color: var(--warning); color: var(--warning);
}
.faixa-validacao ul { margin: 6px 0 0; padding-left: 20px; }
.faixa-validacao li { margin-bottom: 3px; }
.faixa-validacao a  { color: inherit; text-decoration: underline; }
.faixa-validacao a:hover { opacity: 0.8; }

/* ══ DICA DO MODO DEMONSTRAÇÃO ═══════════════════════════════════════
   Só aparece na demo, e só na tela de lançamento: os avisos do
   formulário dependem de o operador digitar algo que os provoque, e
   numa demonstração ninguém adivinha que existem. */
.demo-dica {
    background: var(--info-light); border: 1px solid var(--info);
    border-left: 4px solid var(--info); border-radius: var(--radius);
    padding: 12px 16px; margin-bottom: 16px;
    font-size: 0.93rem; line-height: 1.6; color: var(--info);
}
.demo-dica ul { margin: 8px 0 10px; padding-left: 20px; }
.demo-dica li { margin-bottom: 4px; }
.demo-dica strong { color: inherit; }
.demo-dica button {
    background: transparent; border: 1px solid currentColor; color: inherit;
    padding: 4px 14px; border-radius: var(--radius-sm);
    font-size: 0.893rem; cursor: pointer;
}
.demo-dica button:hover { background: rgba(255,255,255,0.08); }

/* A regra global `ul li` do arquivo transforma item de lista em linha
   flex com espaço entre as pontas. Isso serve às listas de cadastro, mas
   estica o texto corrido destas duas listas. Aqui elas voltam a ser
   lista de texto normal. */
.demo-dica li,
.faixa-validacao li {
    display: list-item; justify-content: initial; align-items: initial;
    padding: 0; border: 0; gap: 0; flex-wrap: initial;
    font-size: inherit; background: none;
}
.demo-dica li:hover,
.faixa-validacao li:hover { background: none; }
.demo-dica ul,
.faixa-validacao ul { list-style: disc; }

/* ══ CAMPOS NUMÉRICOS EM PORTUGUÊS ═══════════════════════════════════
   Deixaram de ser `type="number"` e viraram texto, então perderam o
   alinhamento e as setas do tipo nativo. Número alinhado à direita é
   mais fácil de comparar de uma linha para a outra. */
.fm-numero { text-align: right; font-variant-numeric: tabular-nums; }
/* As casas ",000" do número inteiro nas tabelas: ocupam o lugar para as
   unidades alinharem, mas não aparecem (`fmtL3Celula`). */
.casas-vazias { visibility: hidden; }

/* ══ QUANTIDADE DESCARREGADA, FORA DO CAMINHO ════════════════════════
   O campo só aparece quando a descarga foi diferente da carga, que é a
   exceção. Escondido, ele sai do grid e a linha fica com uma coluna a
   menos, daí os dois modelos de colunas. */
.celula-descarga { display: none; }
.linha-combustivel { grid-template-columns: 2fr 1fr 1fr auto; }
.linha-combustivel.mostra-descarga { grid-template-columns: 2fr 1fr 1fr 1fr auto; }
.linha-combustivel.mostra-descarga .celula-descarga { display: block; }
/* Perda e referência de preço numa faixa embaixo dos campos, na largura
   toda: numa coluna estreita ao lado elas viravam três linhas espremidas
   (18/09/2026). Sem aviso, a faixa não ocupa espaço. */
.linha-combustivel > .badge-wrapper { order: 10; grid-column: 1 / -1; display: flex; flex-wrap: wrap; align-items: center; gap: 6px 10px; }
.linha-combustivel > .badge-wrapper:empty { display: none; }
/* O nome de cada campo em cima dele (28/09/2026). O botão de tirar desce
   para a altura dos campos, não do meio do conjunto nome + campo. */
.campo-item { display: flex; flex-direction: column; gap: 4px; min-width: 0; margin: 0; }
/* A descarga continua escondida até a opção ser ligada: `.campo-item`, com
   o mesmo peso e vindo depois, vencia o `display: none` dela. */
.campo-item.celula-descarga { display: none; }
.linha-combustivel.mostra-descarga .campo-item.celula-descarga { display: flex; }
.campo-item-rotulo {
    font-size: 0.86rem; font-weight: 700; letter-spacing: 0.06em; text-transform: uppercase;
    color: var(--text-muted);
}
.linha-combustivel > .btn-icone { align-self: end; margin-bottom: 4px; }
@media (max-width: 640px) { .linha-combustivel > .btn-icone { justify-self: end; } }
.linha-combustivel > .badge-wrapper .ref-preco,
.linha-combustivel > .badge-wrapper .aviso-preco { max-width: none; }

.titulo-com-opcao {
    display: flex; align-items: center; justify-content: space-between;
    gap: 16px; flex-wrap: wrap;
}
.opcao-descarga {
    display: inline-flex; align-items: center; gap: 7px;
    font-size: 0.893rem; font-weight: 400; color: var(--text-muted);
    text-transform: none; letter-spacing: 0; cursor: pointer;
}
.opcao-descarga input { width: auto; margin: 0; cursor: pointer; }
@media (max-width: 640px) {
    .linha-combustivel,
    .linha-combustivel.mostra-descarga { grid-template-columns: 1fr; }
}

/* Permissões por papel (aplicarPermissoesDaTela, app.js). */
.fm-sem-permissao { display: none !important; }

/* Resultado destacado pelo teclado na busca global. */
#buscaGlobalResultados .busca-item-ativo { outline: 2px solid var(--foco); outline-offset: -2px; background: var(--surface-raised) !important; }

/* Foco visível nos interruptores do modal de alertas: o checkbox real tem
   tamanho zero, então o anel vai no desenho. */
._cfg-toggle input:focus-visible + ._cfg-slider { outline: 2px solid var(--foco); outline-offset: 2px; }

/* ══ A AÇÃO RESPONDE ONDE ACONTECEU (programa 3.5, 3.6, 3.7, 18/09/2026) ══
   Só transform, opacity e cor; durações dos tokens. Com movimento reduzido
   a regra geral do topo encurta as animações, e o sinal continua: a cor e o
   texto não dependem de movimento. */

/* 3.5: confirmação no lugar: o botão ou a linha piscam em verde, com ✓. */
.confirmado-local {
    animation: confirmadoLocal 1.6s var(--ease-standard) both;
    position: relative;
}
button.confirmado-local::after {
    content: "✓";
    position: absolute;
    top: -8px; right: -8px;
    width: 18px; height: 18px;
    border-radius: 50%;
    background: var(--success);
    color: #fff;
    font-size: 0.86rem;
    font-weight: 700;
    line-height: 18px;
    text-align: center;
    animation: confirmadoMarca 1.6s var(--ease-standard) both;
    pointer-events: none;
}
@keyframes confirmadoLocal {
    0%, 60% { box-shadow: 0 0 0 2px var(--success); background-color: var(--success-light); }
    100%    { box-shadow: 0 0 0 0 transparent; }
}
@keyframes confirmadoMarca {
    0%   { opacity: 0; transform: scale(0.6); }
    15%, 75% { opacity: 1; transform: scale(1); }
    100% { opacity: 0; transform: scale(1); }
}

/* 3.6: o erro fica escrito no alto da tela (ou do modal) onde falhou. */
.erros-locais { display: grid; gap: 6px; margin-bottom: 14px; }
.erro-local {
    display: flex; align-items: flex-start; gap: 10px;
    padding: 10px 12px;
    background: var(--danger-light);
    border: 1px solid var(--danger);
    border-left-width: 4px;
    border-radius: var(--radius);
    color: var(--text);
    font-size: 0.86rem;
    line-height: 1.45;
    animation: erroLocalEntra var(--duration-base) var(--ease-standard) both;
}
.erro-local-icone { color: var(--danger); font-weight: 700; }
.erro-local-msg   { flex: 1; min-width: 0; overflow-wrap: anywhere; }
.erro-local-hora  { color: var(--text-muted); font-family: 'JetBrains Mono', monospace; font-size: 0.893rem; white-space: nowrap; }
.erro-local-fechar {
    background: none; border: none; color: var(--text-muted);
    font-size: 1.1rem; line-height: 1; padding: 0 2px; cursor: pointer;
}
.erro-local-fechar:hover, .erro-local-fechar:focus-visible { color: var(--text); }
@keyframes erroLocalEntra { from { opacity: 0; transform: translateY(-4px); } to { opacity: 1; transform: none; } }

/* 3.7: recalculando: os números esmaecem e aparece o aviso. O atraso de
   90 ms faz a conta rápida não piscar; só a lenta mostra o sinal. */
.tela.recalculando :is(.kpi-container, .alertas-container, .dash-combs-wrapper,
    #dashComparativoContainer, .tabela-container, .resumo, #freteHistoricoContainer,
    #grupoConteudo, .aba-conteudo, canvas) {
    animation: recalculoEsmaece var(--duration-fast) var(--ease-standard) 90ms both;
}
.tela.recalculando::before {
    content: "Recalculando…";
    position: fixed;
    top: 72px; right: 24px;
    z-index: 60;
    padding: 4px 12px;
    border-radius: 20px;
    background: var(--surface-raised);
    border: 1px solid var(--border);
    box-shadow: var(--shadow-sm);
    color: var(--text-muted);
    font-size: 0.893rem;
    font-weight: 600;
    animation: recalculoAviso var(--duration-fast) var(--ease-standard) 90ms both;
    pointer-events: none;
}
@keyframes recalculoEsmaece { from { opacity: 1; } to { opacity: 0.45; } }
@keyframes recalculoAviso   { from { opacity: 0; } to { opacity: 1; } }

/* ══ REDESENHO: O QUE SAIU DO ESTILO INLINE (programa 3.2 e 3.3, 18/09/2026) ══
   Token não vence valor inline, por isso o inline saiu primeiro. Os
   espaços vêm da escala `--space-*`; os `display:none` que o JS liga e
   desliga continuam no HTML, porque são estado e não aparência. */

/* Utilitários de margem: só para o caso solto; padrão que se repete ganha nome.
   `!important` de propósito: substituem o estilo inline, que vencia qualquer
   regra de componente (`.tela h3`, `.sistema-secao h3`); sem isso o h3 dos
   Fretes, que tinha 4px, voltaria a ter os 28px do componente. */
.mt-0 { margin-top: 0 !important; }
.mt-1 { margin-top: var(--space-1) !important; }
.mt-2 { margin-top: var(--space-2) !important; }
.mt-3 { margin-top: var(--space-3) !important; }
.mt-4 { margin-top: var(--space-4) !important; }
.mt-5 { margin-top: var(--space-5) !important; }
.mt-7 { margin-top: var(--space-7) !important; }
.mb-0 { margin-bottom: 0 !important; }
.mb-1 { margin-bottom: var(--space-1) !important; }
.mb-2 { margin-bottom: var(--space-2) !important; }
.mb-3 { margin-bottom: var(--space-3) !important; }
.mb-4 { margin-bottom: var(--space-4) !important; }
.mb-5 { margin-bottom: var(--space-5) !important; }
.mb-6 { margin-bottom: var(--space-6) !important; }

/* Arranjos que se repetem */
.pilha        { display: flex; flex-direction: column; gap: var(--space-2); }
.linha-flex   { display: flex; align-items: center; gap: var(--space-3); flex-wrap: wrap; }
.linha-acoes  { display: flex; gap: var(--space-3); flex-wrap: wrap; }
.acoes-grafico { display: flex; gap: var(--space-2); margin-top: var(--space-2); }
.grade-2      { display: grid; grid-template-columns: 1fr 1fr; gap: var(--space-5); }
.lista-limpa  { list-style: none; padding: 0; }
.largura-total { width: 100%; box-sizing: border-box; }
.flex-1 { flex: 1; }
.flex-2 { flex: 2; }
.sep-vertical { width: 1px; background: var(--border); margin: 0 var(--space-1); align-self: stretch; }
@media (max-width: 768px) { .grade-2 { grid-template-columns: 1fr; } }

/* Texto */
.rotulo-suave { font-size: 0.93rem; color: var(--text-muted); }
.rotulo-nota  { font-size: 0.893rem; color: var(--text-muted); font-weight: 400; }
.rotulo-nota--perigo { color: var(--danger); }
/* `.dica` tem uma cor com !important lá em cima (tema claro); o aviso de perigo precisa vencê-la. */
.dica.dica--perigo { color: var(--danger) !important; }
.dica--nota   { font-size: 0.893rem; margin: 0; }
.dica--colada { margin-top: calc(-1 * var(--space-1)); }
.sistema-descricao { color: var(--text-muted); font-size: 0.88rem; margin-bottom: var(--space-4); }

/* Ícones dentro de botão e de aba */
.icone-btn { width: 13px; height: 13px; margin-right: 5px; vertical-align: middle; }
.icone-aba { width: 16px; height: 16px; margin-right: 6px; vertical-align: middle; }

/* Modais */
.modal-overlay--desfoque-forte { backdrop-filter: blur(8px); -webkit-backdrop-filter: blur(8px); }
.modal-overlay--desfoque-leve  { backdrop-filter: blur(4px); -webkit-backdrop-filter: blur(4px); }
.modal--centro { max-width: 380px; text-align: center; }
.modal--medio  { max-width: 420px; }
.modal--largo  { max-width: 520px; width: 92%; }
.busca-global-modal { max-width: 800px; width: 90%; }
.modal-subtitulo { color: var(--text-muted); font-size: 0.93rem; margin-bottom: var(--space-6); }

/* Login e escolha de empresa: cartão em duas partes (18/09/2026).
   A marca é sempre escura, nos dois temas: a logo usada é a de letras
   brancas. O fundo da tela tem um brilho leve da cor principal. */
.modal-overlay.login-overlay {
    background:
        radial-gradient(70% 55% at 50% -10%, var(--primary-subtle3), transparent 70%),
        var(--bg);
    backdrop-filter: none; -webkit-backdrop-filter: none;
    overflow-y: auto;
}
.login-cartao {
    display: grid; grid-template-columns: 1fr 1fr;
    width: min(880px, 100%); margin: auto;
    background: var(--surface-raised);
    border: 1px solid var(--border); border-radius: var(--radius-xl);
    box-shadow: var(--shadow-lg); overflow: hidden;
    animation: modalIn 0.22s cubic-bezier(0.34,1.56,0.64,1);
}
.login-cartao--uma-coluna { grid-template-columns: 1fr; width: min(420px, 100%); }
.login-marca {
    display: flex; flex-direction: column; justify-content: center; gap: var(--space-6);
    padding: 44px 40px;
    color: rgba(255,255,255,0.8);
    background:
        radial-gradient(90% 70% at 0% 0%, color-mix(in srgb, var(--primary) 45%, transparent), transparent 70%),
        linear-gradient(160deg, #1c0b0b 0%, #0e0707 100%);
}
.login-logo-img { width: 210px; height: auto; display: block; }
.login-marca-frase {
    font-family: 'Syne', sans-serif; font-weight: 700; font-size: 1.35rem;
    line-height: 1.3; color: #fff; margin: 0;
}
.login-marca-lista { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: var(--space-3); }
/* `ul li` global (listas de Cadastros) põe borda, respiro e texto à direita. */
.login-marca-lista li,
.login-marca-lista li:first-child {
    display: flex; justify-content: flex-start; align-items: center; gap: var(--space-3);
    padding: 0; border: 0; font-size: 0.9rem; flex-wrap: nowrap;
}
.login-marca-lista li:hover { background: none; }
.login-marca-lista svg {
    width: 20px; height: 20px; flex-shrink: 0; padding: 3px; border-radius: 50%;
    color: #fff; background: rgba(255,255,255,0.12);
}
.login-marca--faixa { padding: var(--space-6) var(--space-7); align-items: center; }
.login-marca--faixa .login-logo-img { width: 170px; }
.login-form { padding: 40px 40px 28px; display: flex; flex-direction: column; }
.login-form .campo { text-align: left; }
.login-form label { font-size: 0.893rem; }
.login-titulo { margin: 0 0 var(--space-1); font-size: 1.5rem; }
.login-subtitulo { color: var(--text-muted); margin: 0 0 var(--space-6); font-size: 0.88rem; }
.login-senha { position: relative; }
.login-senha input { padding-right: 44px; }
.login-ver-senha {
    position: absolute; right: 4px; top: 50%; transform: translateY(-50%);
    width: 36px; height: 32px; display: flex; align-items: center; justify-content: center;
    padding: 0; background: none; border: none; border-radius: var(--radius-sm); cursor: pointer;
    color: var(--text-light);
}
.login-ver-senha:hover, .login-ver-senha:focus-visible { color: var(--text); background: var(--surface-hover); }
.login-ver-senha svg { width: 18px; height: 18px; }
.login-ver-senha.ativo { color: var(--primary); }
.btn-bloco  { width: 100%; justify-content: center; }
.btn-grande { padding: var(--space-3); font-size: 1rem; }
.login-msg  { font-size: 0.93rem; margin: var(--space-3) 0 0; padding: var(--space-2) var(--space-3); border-radius: var(--radius-sm); text-align: left; line-height: 1.4; }
.login-msg--erro { color: var(--danger); background: var(--danger-light); }
.login-msg--ok   { color: var(--success); background: var(--success-light); }
.btn-link {
    background: none; border: none; cursor: pointer; text-decoration: underline;
    color: var(--text-muted); font-size: 0.893rem; margin-top: var(--space-2);
}
.btn-link:hover { color: var(--text); }
.login-esqueci { align-self: center; margin-top: var(--space-3); }
.login-ou {
    display: flex; align-items: center; gap: var(--space-3);
    margin: var(--space-5) 0 var(--space-4); color: var(--text-light); font-size: 0.893rem;
}
.login-ou::before, .login-ou::after { content: ""; flex: 1; height: 1px; background: var(--border); }
.login-demo-nota { color: var(--text-muted); font-size: 0.893rem; margin: var(--space-2) 0 0; line-height: 1.4; text-align: center; }
.login-form .pf-assinatura { margin-top: var(--space-6); }
.pf-assinatura .pf-afn, .pf-assinatura .pf-sys { font-size: 13px; }
@media (max-width: 760px) {
    .modal-overlay.login-overlay { align-items: flex-start; padding: var(--space-4); }
    .login-cartao { grid-template-columns: 1fr; }
    .login-marca { padding: var(--space-6); gap: var(--space-3); align-items: center; text-align: center; }
    .login-logo-img { width: 170px; }
    .login-marca-frase { font-size: 0.95rem; font-family: inherit; font-weight: 500; color: rgba(255,255,255,0.8); }
    .login-marca-lista { display: none; }
    .login-form { padding: var(--space-6) var(--space-5) var(--space-5); }
}
.page-footer .pf-afn, .page-footer .pf-sys { font-size: 10px; }
.page-footer .pf-pipe { font-size: 13px; }
.page-footer .pf-info { font-size: 11px; }

/* Cabeçalho */
.sidebar-logo { cursor: pointer; }
.header-empresa { display: flex; align-items: center; gap: var(--space-2); }
.header-empresa-rotulo { font-size: 0.893rem; color: var(--text-light); }
.icone-chevron { width: 12px; height: 12px; flex-shrink: 0; opacity: 0.6; }
.icone-busca   { width: 15px; height: 15px; flex-shrink: 0; }
.header-action-btn--texto   { font-size: 0.893rem; padding: 4px 8px; opacity: 0.7; }

/* O título de cada tela mora no cabeçalho; o h2 interno nasce escondido
   em vez de piscar até o JS escondê-lo (defeito visual listado em 0.5).
   Escondido só da vista, como o `.sr-only`: o leitor de tela o lê, e a
   ordem dos títulos fica h1, h2, h3 (13/10/2026). */
.tela > h2[id^="titulo"] { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; border: 0; }

/* Fretes */
.fretes-filtro { display: flex; align-items: center; gap: var(--space-3); flex-wrap: wrap; margin-bottom: var(--space-3); }
.fretes-filtro-rotulo { font-weight: 600; color: var(--text-muted); font-size: 0.93rem; text-transform: uppercase; }
.campo-mes { max-width: 180px; }

/* Analítico */
.campo--botao { justify-content: flex-end; padding-top: var(--space-5); }
.linha-metrica { display: flex; gap: var(--space-2); margin-bottom: var(--space-4); align-items: center; }
.btn-metrica.ativo { background: var(--primary); color: #fff; border-color: var(--primary); }


/* Sistema */
.campo--restaurar { max-width: 360px; }
.campo-medio { max-width: 420px; }
.form-linha--opcoes { gap: var(--space-5); margin-top: var(--space-2); }
/* Cadastros */
/* Mais específico que `.form-linha input`, como o inline era. */
.form-linha .flex-1 { flex: 1; }
.form-linha .flex-2 { flex: 2; }
.form-linha .campo-taxa { flex: 0 0 130px; }
.campo-curto { max-width: 200px; }
.conjunto-historico {
    margin-bottom: var(--space-3); padding: 10px; font-size: 0.893rem;
    background: var(--surface-alt); border-radius: 6px;
}

/* Dashboard */
.dash-filtros { display: flex; gap: var(--space-3); align-items: flex-end; flex-wrap: wrap; margin-bottom: var(--space-2); }
.dash-filtros-rapidos { display: flex; gap: 6px; align-items: flex-end; flex-wrap: wrap; padding-bottom: 2px; }
.dash-filtros-rapidos .filtros-rapidos-sep { align-self: center; }
.campo-data { min-width: 140px; }
.dica--pequena { font-size: 0.893rem; }
.dica--legenda { margin: 0 0 var(--space-2); }
.kpi-base--alerta { color: var(--danger); }
.celula-num { text-align: right; }
.variacao-mini { font-size: 0.86rem; margin-left: var(--space-1); }
.variacao-mini--danger  { color: var(--danger); }
.variacao-mini--success { color: var(--success); }
.dash-comb-kpi-label--nota { opacity: 0.8; }
.grafico-wrapper--comparativo { height: 280px; margin-bottom: var(--space-4); }
.grafico-wrapper--pizza { max-width: 400px; margin: 0 auto; }
/* Gasto por combustível: anel à esquerda, valores e fatias à direita.

   Quem decide se a lista cabe ao lado do anel é o espaço do CARTÃO, não o
   da janela (23/09/2026). Com grade fixa de 240 px e empilhamento só
   abaixo de 640 px de janela, um tablet em pé deixava a lista com 8 px e
   os nomes viravam reticências. Agora a lista pede 280 px; sem eles, desce
   para baixo do anel. `container-type` na lista é o que faz a regra de
   @container mais abaixo olhar a largura dela. */
.distribuicao-cartao {
    display: flex; flex-wrap: wrap; justify-content: center; gap: var(--space-4) var(--space-7); align-items: center;
    padding: var(--space-5) var(--space-6); background: var(--surface);
    border: 1px solid var(--border-light); border-radius: var(--radius-lg);
}
.distribuicao-grafico { position: relative; height: 220px; flex: 0 0 240px; max-width: 100%; }
.distribuicao-cartao > .distribuicao-lista { flex: 1 1 280px; min-width: 0; container-type: inline-size; }
.distribuicao-centro {
    position: absolute; inset: 0; display: flex; flex-direction: column; align-items: center; justify-content: center;
    pointer-events: none; text-align: center;
}
.distribuicao-centro span { font-size: 0.86rem; font-weight: 700; text-transform: uppercase; letter-spacing: 0.08em; color: var(--text-muted); }
.distribuicao-centro strong { font-family: 'Syne', sans-serif; font-size: 1rem; color: var(--text); }
.distribuicao-lista { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; }
.distribuicao-lista li,
.distribuicao-lista li:first-child {
    display: grid; grid-template-columns: 12px minmax(0, 1fr) auto 64px; gap: var(--space-3); align-items: center;
    padding: 10px 0; border: 0; border-bottom: 1px solid var(--border-light); font-size: 0.9rem; flex-wrap: nowrap;
}
.distribuicao-lista li:last-child { border-bottom: 0; }
.distribuicao-lista li:hover { background: none; }
.distribuicao-cor { width: 12px; height: 12px; border-radius: 3px; }
.distribuicao-lista li.distribuicao-vazia { display: block; color: var(--text-muted); font-style: italic; border: 0; }
.distribuicao-nome { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
/* Coluna de porcentagem com barrinha: número e barra alinhados à direita. */
.tabela-numeros td.celula-pct .barra-progresso { margin-left: auto; width: 100%; max-width: 120px; }
.distribuicao-nome { color: var(--text); font-weight: 600; }
.distribuicao-valor { font-family: 'JetBrains Mono', monospace; font-size: 0.93rem; color: var(--text); text-align: right; }
.distribuicao-pct { font-family: 'JetBrains Mono', monospace; font-size: 0.893rem; color: var(--text-muted); text-align: right; }
@media (max-width: 640px) {
    .distribuicao-cartao { padding: var(--space-4); }
    .distribuicao-grafico { height: 200px; flex-basis: 200px; }
    .distribuicao-lista li, .distribuicao-lista li:first-child { grid-template-columns: 12px minmax(0, 1fr) auto 52px; font-size: 0.93rem; }
}
/* Lista estreita: o valor e a porcentagem empilham à direita do nome. Em
   uma linha só, a 320 px sobravam 51 px para o nome e "Cleiton Andrade"
   pede 94. */
@container (max-width: 340px) {
    .distribuicao-lista li, .distribuicao-lista li:first-child {
        grid-template-columns: 12px minmax(0, 1fr) auto;
        grid-template-areas: "cor nome valor" "cor nome pct";
        row-gap: 0;
    }
    .distribuicao-cor   { grid-area: cor; }
    .distribuicao-nome  { grid-area: nome; }
    .distribuicao-valor { grid-area: valor; }
    .distribuicao-pct   { grid-area: pct; font-size: 0.893rem; }
}
.titulo-nota { font-weight: 400; font-size: 0.86rem; color: var(--text-muted); text-transform: none; letter-spacing: 0; }
/* O teto de altura e a rolagem vêm do `.modal` desde 23/09/2026 (100% da
   área livre, que numa janela baixa é menos que os 85vh que havia aqui). */
.modal--detalhe { max-width: 680px; width: 100%; }
.alerta-corpo { cursor: pointer; }

/* Relatórios: o resumo acima da tabela */
.rel-totais { display: flex; align-items: center; gap: var(--space-4); flex-wrap: wrap; margin-bottom: var(--space-2); }
.rel-totais > span { font-size: 0.93rem; color: var(--text-muted); }
.rel-totais > span.rel-totais-nota { font-size: 0.893rem; }
.rel-totais strong { color: var(--text); }
.rel-totais em { font-style: normal; opacity: 0.75; }
/* Etiquetas abaixo dos totais do Relatório; a explicação abre no clique. */
.rel-chips { display: flex; flex-wrap: wrap; align-items: flex-start; gap: 6px; margin: 0 0 var(--space-3); }
.rel-chip {
    display: inline-flex; align-items: center; gap: 6px; padding: 3px 10px; border-radius: 999px;
    font-size: 0.86rem; color: var(--text-muted); background: var(--surface-alt); border: 1px solid var(--border-light);
    white-space: nowrap;
}
.rel-chip--aviso { color: var(--warning); background: var(--warning-light); border-color: transparent; }
.rel-chip-detalhe { position: relative; display: inline-block; }
.rel-chip-detalhe > summary { cursor: pointer; list-style: none; }
.rel-chip-detalhe > summary::-webkit-details-marker { display: none; }
.rel-chip-detalhe > summary::after { content: "ⓘ"; font-size: 0.893rem; opacity: 0.7; }
.rel-chip-detalhe[open] > summary { color: var(--text); border-color: var(--border-strong); }
.rel-chip-detalhe > p {
    position: absolute; top: calc(100% + 6px); left: 0; z-index: 30;
    width: max-content; max-width: min(440px, 82vw); margin: 0; padding: var(--space-3) var(--space-4);
    font-size: 0.893rem; line-height: 1.5; color: var(--text-muted); white-space: normal;
    background: var(--surface-raised); border: 1px solid var(--border); border-radius: var(--radius);
    box-shadow: var(--shadow-md);
}
.rel-chip-detalhe > p strong { color: var(--text); }
.rel-cards { display: flex; gap: var(--space-2); flex-wrap: wrap; }
.rel-card {
    flex: 1; min-width: 160px; padding: 10px 14px;
    background: var(--surface-alt); border: 1px solid var(--border-light); border-radius: var(--radius-sm);
}
.rel-card--lista { min-width: 180px; }
.rel-card-titulo {
    font-size: 0.86rem; font-weight: 700; text-transform: uppercase; letter-spacing: .07em;
    color: var(--text-muted); margin-bottom: 6px;
}
.rel-card--lista .rel-card-titulo { margin-bottom: var(--space-2); }
.rel-card-valor { font-family: 'JetBrains Mono', monospace; font-size: 1rem; font-weight: 700; color: var(--text); }
.rel-card-linha { font-size: 0.893rem; color: var(--text-muted); margin-top: 2px; }
/* Sobre --surface-alt (o fundo claro mais escuro) o --text-light ainda
   ficava em 4,33; aqui a linha usa o nivel de texto de cima. (21/09/2026) */
.rel-card-linha--fraca { font-size: 0.86rem; color: var(--text-muted); }
/* No celular, dois combustíveis por linha: um por linha fazia o resumo ter
   quase duas telas de altura. A lista de motoristas ocupa a linha toda. */
@media (max-width: 480px) {
    .rel-cards { display: grid; grid-template-columns: 1fr 1fr; }
    .rel-card { min-width: 0; padding: 8px 10px; }
    .rel-card--lista { grid-column: 1 / -1; }
    .rel-card-valor { font-size: 0.893rem; white-space: nowrap; }
    .rel-card-nome { max-width: none; }
}
.rel-card-item { display: flex; justify-content: space-between; align-items: center; }
.rel-card-item + .rel-card-item { margin-top: 5px; padding-top: 5px; border-top: 1px solid var(--border-light); }
.rel-card-nome { font-size: 0.893rem; color: var(--text); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; max-width: 120px; }
.rel-card-num { font-family: 'JetBrains Mono', monospace; font-size: 0.893rem; color: var(--text-muted); margin-left: var(--space-2); white-space: nowrap; }
.celula-detalhe { padding: 0 !important; border-top: none !important; }
.faixa-validacao.faixa-estado { margin: 0 0 var(--space-3); }
.detalhe-subtitulo { margin: var(--space-3) 0 6px; }
.detalhe-inline-inner .preview-nf { max-width: 80px; max-height: 80px; margin-right: var(--space-2); cursor: pointer; }

/* Fretes */
.texto-perigo { color: var(--danger); }
.linha-detalhe-frete td { color: var(--text-muted); font-size: 0.893rem; }
.celula-recuada { padding-left: var(--space-6); }
/* Sublinhas de frete: mais baixas que a linha do grupo, números alinhados
   com os dela, bolinha na cor do combustível. */
.tabela-fretes tr.linha-detalhe-frete td { padding-top: 5px; padding-bottom: 5px; font-size: 0.893rem; }
.tabela-numeros.tabela-fretes tr.linha-detalhe-frete td.celula-num { text-align: right; font-family: 'JetBrains Mono', monospace; font-size: 0.893rem; }
.tabela-fretes tr.linha-detalhe-frete td.celula-recuada { padding-left: 28px; }
.frete-sub-cor { display: inline-block; width: 8px; height: 8px; border-radius: 50%; margin-right: 8px; vertical-align: 1px; }
.frete-sub-placa { font-family: 'JetBrains Mono', monospace; font-size: 0.893rem; color: var(--text); }
.tabela-fretes tr.linha-detalhe-frete--placa td { background: var(--surface) !important; }
.celula-fraca { font-size: 0.893rem; color: var(--text-muted); }
.grafico-wrapper--220 { height: 220px; }
/* 1240 px: com 1000, a lista nota a nota (dez colunas) deixava a coluna do
   frete, a que interessa, fora da janela num notebook de 1366 (vistoria
   de 28/09/2026). Em tela menor a tabela continua rolando de lado. */
.modal--tabela { max-width: min(1240px, 96vw); }
.tabela-container--rolagem { max-height: 52vh; overflow: auto; }
/* Frete nota a nota: uma nota por linha, números à direita em fonte de
   número; nomes longos com reticências (o nome inteiro no `title`). */
.tabela-frete-notas td, .tabela-frete-notas th { white-space: nowrap; padding-left: 12px; padding-right: 12px; }
.tabela-frete-notas td.celula-num { font-family: 'JetBrains Mono', monospace; font-size: 0.893rem; }
.tabela-frete-notas .celula-texto-longo { max-width: 150px; overflow: hidden; text-overflow: ellipsis; }
.tabela-frete-notas thead th { position: sticky; top: 0; z-index: 1; }
.tabela-frete-notas tfoot td { position: sticky; bottom: 0; background: var(--surface-alt); }
/* O rótulo do total ocupa as 7 colunas de texto no computador e as 3 que
   sobram no celular: um colspan fixo desalinhava a linha. */
.tabela-frete-notas .total-rotulo-estreito,
.tabela-frete-notas .data-curta { display: none; }
@media (max-width: 768px) {
    .tabela-frete-notas .col-secundaria,
    .tabela-frete-notas .total-rotulo-largo,
    .tabela-frete-notas .data-longa { display: none; }
    .tabela-frete-notas .total-rotulo-estreito { display: table-cell; }
    /* A data sem o ano (o mês está no título) e células mais justas: com
       cinco colunas, o frete ainda passava da tela a 375 px. */
    .tabela-frete-notas .data-curta { display: inline; }
    .modal--tabela { padding: 20px 14px; }
    .tabela-frete-notas td, .tabela-frete-notas th { padding-left: 6px; padding-right: 6px; font-size: 0.893rem; }
    .tabela-frete-notas td.celula-num { font-size: 0.86rem; }
    .tabela-frete-notas .celula-texto-longo { max-width: 84px; }
    .tabela-frete-notas th { white-space: normal; vertical-align: bottom; letter-spacing: 0.02em; }
}

/* Grupo e Analítico */
.grafico-wrapper--240 { height: 240px; }
/* So a cor do texto era trocada; o fundo continuava o azul de --info-light
   da .tag-perda. As duas cores agora sao do mesmo par. (21/09/2026) */
.tag-perda.tag-perda--perigo { background: var(--danger-light); color: var(--danger); }
.alerta-comparativo--subiu { background: var(--danger-light);  border-color: var(--danger);  color: var(--text); }
.alerta-comparativo--caiu  { background: var(--success-light); border-color: var(--success); color: var(--text); }

/* Cadastros */
/* O histórico virou `<details>` recolhido em 21/09/2026: aberto, empurrava
   os campos do formulário para baixo e crescia sem limite. A rolagem
   própria só vale depois de aberto. */
.historico-cadastro {
    margin-top: var(--space-4); padding: var(--space-3) var(--space-4);
    background: var(--surface-alt); border: 1px solid var(--border-light); border-radius: var(--radius);
    font-size: 0.893rem; color: var(--text-muted);
}
.historico-cadastro[open] { max-height: 200px; overflow-y: auto; }
.historico-cadastro-titulo {
    display: block; font-size: 0.86rem; font-weight: 700; text-transform: uppercase;
    letter-spacing: 0.1em; color: var(--text-light); cursor: pointer; user-select: none;
}
.historico-cadastro[open] .historico-cadastro-titulo { margin-bottom: var(--space-2); color: var(--text-muted); }
/* Mesmo tratamento no detalhe da nota. */
.detalhe-obs--historico > summary { cursor: pointer; user-select: none; }
.detalhe-obs--historico[open] > summary { margin-bottom: var(--space-2); }
.vazio.vazio--conjuntos { padding: var(--space-3) !important; color: var(--text-muted); }
/* O bloco de nome e placas não encolhia, então no celular um conjunto de
   três placas empurrava os ícones para uma segunda linha e a linha ficava
   com o dobro da altura da de cima. A base precisa ser 0: com `flex-wrap`
   a quebra é decidida pelo tamanho NATURAL do bloco, antes de ele encolher,
   então `flex: 1 1 auto` ainda quebrava. Agora ele cede espaço e as placas
   ganham reticências (a lista inteira fica no `title`). (21/09/2026) */
.conjunto-info   { flex: 1 1 0; min-width: 0; }
.conjunto-placas { font-size: 0.893rem; color: var(--text-muted); margin-top: 3px;
                   overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.conjunto-historico-titulo { font-size: 0.893rem; font-weight: 600; color: var(--text-muted); margin-bottom: 6px; }
.conjunto-historico-item { font-size: 0.893rem; color: var(--text-muted); padding: 3px 0; }
.conjunto-historico-vigencia { margin-left: 6px; opacity: 0.7; }
.form-linha.form-linha--placa { gap: var(--space-2); margin-bottom: 6px; }
.form-linha .campo-placa { text-transform: uppercase; flex: 1; font-family: 'JetBrains Mono', monospace; letter-spacing: 0.05em; }
.campo-data-curta { max-width: 200px; }

/* Importação */
.rolagem-x { overflow-x: auto; }
.linha-acoes--apertada { gap: var(--space-2); }
.linha-acoes--centro { justify-content: center; }
.btn-pequeno { font-size: 0.893rem; }
.tabela-preview.tabela-preview--pequena { font-size: 0.893rem; }
.coluna-marcar { width: 36px; }
.celula-centro { text-align: center; }
.caixa-marcar { width: auto; accent-color: var(--primary); }
.lista-erros-importacao { margin-top: var(--space-2); padding-left: 20px; font-size: 0.93rem; color: var(--danger); }
.texto-aviso, .importacao-sucesso p.texto-aviso { color: var(--warning); }

/* Sistema */
.tabela-simples { width: 100%; font-size: 0.93rem; border-collapse: collapse; }
.tabela-simples thead tr { background: var(--surface-alt); }
.tabela-simples th {
    padding: 7px 12px; text-align: left; font-size: 0.86rem; text-transform: uppercase;
    letter-spacing: 0.08em; color: var(--text-light);
}
.tabela-simples td { padding: var(--space-2) var(--space-3); }
.tabela-simples tbody tr { border-bottom: 1px solid var(--border-light); }
.celula-mono { color: var(--text-muted); font-family: monospace; }
.tabela-container--baixa { max-height: 240px; overflow: auto; }
.codigo-pequeno { font-size: 0.893rem; }
.caixa-previa {
    font-size: 0.93rem; color: var(--text-muted); margin-bottom: var(--space-4);
    padding: var(--space-2); background: var(--surface-alt); border-radius: 6px;
}
.caixa-previa--cfg { margin: var(--space-4) 0 0; padding: 10px 14px; font-size: 0.893rem; min-height: 36px; border-radius: var(--radius); }

/* Modais montados em JS: o mesmo `.modal`, com o que cada um precisa a mais */
.modal--500 { max-width: 500px; }
.modal--520 { max-width: 520px; }
.modal--largo-800 { max-width: 800px; width: 90%; }
.modal--largo-640 { max-width: 640px; }
.campo-senha-sorteada { font-family: 'JetBrains Mono', monospace; letter-spacing: 0.04em; }
/* `.modal--rolagem` ficou sem regra: todo `.modal` rola por dentro desde
   23/09/2026. A classe continua no HTML dos atalhos, sem efeito. */
.modal-cabecalho { display: flex; justify-content: space-between; align-items: center; margin-bottom: var(--space-4); }
.modal-cabecalho h3 { margin: 0; }
.modal-cabecalho--colado { margin-bottom: var(--space-1); }
/* A mesma letra do campo de R$ da mesma janela (`.fm-numero`): eram duas
   letras diferentes lado a lado (vistoria de 28/09/2026). */
.cfg-campos input[type="number"] { text-align: right; font-variant-numeric: tabular-nums; }
.modal-fechar { border: none; background: none; font-size: 1.2rem; padding: 4px 8px; border-radius: 6px; cursor: pointer; color: var(--text-muted); line-height: 1; }
.modal-fechar:hover, .modal-fechar:focus-visible { color: var(--text); }
.modal-acoes--separadas { justify-content: space-between; }

/* Configurações de Alertas */
.cfg-introducao { margin: calc(-1 * var(--space-2)) 0 var(--space-5); font-size: 0.893rem; color: var(--text-muted); }
.cfg-campos { border: none; margin: 0; padding: 0; min-width: 0; }
._cfg-bloco + ._cfg-bloco { margin-top: var(--space-5); }
.cfg-bloco-cabecalho { display: flex; align-items: center; justify-content: space-between; gap: var(--space-3); margin-bottom: var(--space-3); }
.cfg-bloco-descricao { margin: 2px 0 0; font-size: 0.893rem; color: var(--text-muted); }
.cfg-opcoes { transition: opacity var(--duration-fast) var(--ease-standard); }
.cfg-opcoes--desligado { opacity: 0.4; pointer-events: none; }
.grade-2--apertada { gap: var(--space-3); }

/* Conferência */
.conf-filtros { display: flex; gap: var(--space-3); flex-wrap: wrap; align-items: flex-end; margin-bottom: var(--space-4); }
.campo-180 { min-width: 180px; }
.valor-fixo {
    padding: 9px 12px; border: 1px solid var(--border); border-radius: var(--radius);
    background: var(--surface-alt); color: var(--text); font-size: 0.875rem; font-weight: 600;
}
/* Passos numerados de uma tela que começa vazia (Conferências). */
.passos-lista { margin: var(--space-3) 0 0; padding: 0; list-style: none; counter-reset: passo; display: grid; gap: var(--space-2); }
.passos-lista li,
.passos-lista li:first-child {
    counter-increment: passo; display: block; position: relative; min-height: 26px;
    padding: 2px 0 0 38px; border: 0; font-size: 0.875rem; color: var(--text-muted); line-height: 1.5;
}
.passos-lista li:hover { background: none; }
.passos-lista li::before {
    position: absolute; left: 0; top: 0;
    content: counter(passo); width: 26px; height: 26px; border-radius: 50%;
    display: flex; align-items: center; justify-content: center;
    background: var(--primary-subtle3); color: var(--primary-mid); font-weight: 700; font-size: 0.893rem;
}
.passos-lista strong { color: var(--text); }
.tabela-notas-dia td.celula-num, .tabela-notas-dia th.celula-num { text-align: right; font-family: 'JetBrains Mono', monospace; font-size: 0.893rem; }
.conf-origem { font-size: 0.893rem; color: var(--text-muted); margin: -6px 0 14px; }
.conf-resumo { display: grid; grid-template-columns: repeat(auto-fill, minmax(160px, 1fr)); gap: var(--space-3); margin-bottom: var(--space-4); }
.info-card--perigo { border-left: 3px solid var(--danger); }
.info-card--aviso  { border-left: 3px solid var(--warning); }
.info-card--ok     { border-left: 3px solid var(--success); }
.info-card--perigo .info-card-valor { color: var(--danger); }
.info-card--aviso  .info-card-valor { color: var(--warning); }
.info-card--ok     .info-card-valor { color: var(--success); }
.texto-ok { color: var(--success); }
/* O fundo tinha o rgb do --danger do tema ESCURO cravado, e ficava assim
   tambem no claro, onde --danger e outro vermelho. --danger-light ja existe
   para isso nos dois temas. (21/09/2026) */
tbody tr.linha-divergente { background: var(--danger-light); }
tbody tr.linha-apagada { opacity: 0.5; }
tr.linha-total { font-weight: 700; border-top: 2px solid var(--border); }
.celula-notas-dia { padding: var(--space-2) var(--space-3) !important; background: var(--surface-alt); }
.notas-dia-titulo { font-size: 0.893rem; color: var(--text-muted); margin-bottom: 6px; }

/* Busca global: seções e itens */
.busca-secao { margin-bottom: var(--space-4); }
.busca-secao-titulo {
    display: block; padding: 0 2px; margin-bottom: 6px;
    font-size: 0.86rem; font-weight: 700; text-transform: uppercase; letter-spacing: .1em; color: var(--text-muted);
}
.busca-item {
    display: flex; align-items: center; justify-content: space-between; gap: var(--space-2);
    padding: var(--space-2) 10px; margin-bottom: 5px; cursor: pointer;
    border: 1px solid var(--border-light); border-radius: var(--radius-sm); background: var(--surface-alt);
    transition: background var(--duration-fast) var(--ease-standard);
}
.busca-item:hover { background: var(--surface-raised); }
.busca-item-texto { font-size: 0.93rem; color: var(--text); }
.busca-item-acao  { font-size: 0.86rem; color: var(--primary); }
/* "Enter ↵" só no item em foco: repetido em todas as linhas era ruído. */
.busca-item-acao--enter { opacity: 0; transition: opacity var(--duration-fast); }
.busca-item:hover .busca-item-acao--enter, .busca-item-ativo .busca-item-acao--enter { opacity: 1; }
.busca-item-corpo { min-width: 0; }
.busca-item-titulo { font-weight: 600; font-size: 0.93rem; color: var(--text); }
.busca-item-data  { font-weight: 400; color: var(--text-muted); font-size: 0.893rem; margin-left: 6px; }
.busca-item-marca { margin-left: 6px; }
.busca-item-linha { font-size: 0.893rem; color: var(--text-muted); margin-top: 2px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.busca-item-tipos { margin-left: 6px; color: var(--text-light); font-size: 0.86rem; }
.busca-vazio { margin: 0; padding: var(--space-3) var(--space-2) var(--space-4); font-size: 0.93rem; color: var(--text-muted); line-height: 1.5; }
.busca-vazio strong { display: block; color: var(--text); font-weight: 600; }
.busca-item-numeros { text-align: right; flex-shrink: 0; }
.busca-item-valor { font-family: 'JetBrains Mono', monospace; font-size: 0.893rem; font-weight: 600; color: var(--text); }
.busca-item-litros { font-size: 0.86rem; color: var(--text-muted); }

/* Diálogos (fmConfirm, fmAlert, fmPrompt) */
.modal-overlay--dialogo { z-index: 2000; }
.modal--460 { max-width: 460px; }
.modal .dialogo-titulo { margin-bottom: var(--space-5); }   /* vence `.modal h3` */
.modal .dialogo-titulo--com-texto { margin-bottom: var(--space-3); }
.dialogo-texto { font-size: 0.9rem; line-height: 1.55; margin-bottom: var(--space-5); white-space: pre-wrap; }
.titulo-com-icone { display: flex; align-items: center; gap: var(--space-2); }
.dialogo-icone-svg { width: 18px; height: 18px; flex-shrink: 0; }
.dialogo-icone--info    { color: var(--primary); }
.dialogo-icone--aviso   { color: var(--warning); }
.dialogo-icone--erro    { color: var(--danger); }
.dialogo-icone--sucesso { color: var(--success); }
.btn-primario.btn-tom-perigo { background: var(--danger-solido);  border-color: var(--danger-solido); }
.btn-primario.btn-tom-aviso  { background: var(--warning); border-color: var(--warning); }
.btn-primario.btn-tom-info   { background: var(--primary); border-color: var(--primary); }
.fm-prompt-label { display: block; font-size: 0.93rem; margin-bottom: 6px; }
.fm-prompt-input { width: 100%; box-sizing: border-box; resize: vertical; }
.fm-prompt-erro  { color: var(--danger); font-size: 0.893rem; margin-top: 6px; }

/* Atalhos de teclado */
.modal--atalhos { max-width: 480px; width: 92%; }
.icone-titulo { width: 18px; height: 18px; color: var(--primary); }
.atalhos-grupo { margin-bottom: var(--space-5); }
.atalhos-grupo-titulo { font-size: 0.86rem; font-weight: 700; text-transform: uppercase; letter-spacing: 0.08em; color: var(--text-muted); margin: 0 0 10px; }
.atalho-linha { display: flex; align-items: center; justify-content: space-between; padding: 7px 0; border-bottom: 1px solid var(--border-light); }
.atalho-descricao { font-size: 0.88rem; color: var(--text); }
.atalho-teclas { display: flex; gap: var(--space-1); flex-shrink: 0; margin-left: var(--space-4); }
.atalho-mais { color: var(--text-muted); font-size: 0.893rem; align-self: center; }
.atalho-tecla {
    display: inline-block; padding: 3px 7px; border-radius: 5px;
    background: var(--surface-alt); border: 1px solid var(--border); box-shadow: 0 1px 0 var(--border);
    font-size: 0.893rem; font-family: monospace; color: var(--text-muted);
}
.atalho-tecla--pequena { padding: 2px 6px; border-radius: 4px; font-size: 0.86rem; box-shadow: none; }
.atalhos-rodape { margin-top: var(--space-4); font-size: 0.893rem; color: var(--text-muted); text-align: center; }

/* Usuários */
.card.card--perfil { padding: var(--space-6); max-width: 520px; }
.caixa-erro-carga { padding: var(--space-5); background: var(--surface-alt); border-radius: var(--radius); border: 1px solid var(--border); }
.celula-fraca--italico { font-style: italic; }
.usuario-arroba { color: var(--primary-texto); opacity: 0.9; }
.acoes-celula { display: flex; gap: 6px; flex-wrap: wrap; }
.acoes-celula.acoes-celula--icones { gap: 2px; flex-wrap: nowrap; justify-content: flex-end; }
.usuarios-topo { display: flex; justify-content: flex-end; flex-wrap: wrap; gap: var(--space-2); margin-bottom: var(--space-4); }
/* Celular: nome, nível e ações cabem; as empresas ficam no Editar. */
@media (max-width: 480px) {
    #usuariosConteudo table thead th:nth-child(3),
    #usuariosConteudo table tbody td:nth-child(3) { display: none; }
}
.modal-corpo--pilha { display: flex; flex-direction: column; gap: 14px; }
.campo-arroba { position: relative; }
.campo-arroba-sinal { position: absolute; left: 10px; top: 50%; transform: translateY(-50%); color: var(--text-muted); pointer-events: none; }
.campo-arroba input { padding-left: 24px; }
.texto-fraco { opacity: 0.7; }
.caixa-empresas { background: var(--surface-alt); border: 1px solid var(--border); border-radius: var(--radius-sm); padding: var(--space-3); }
.btn-empresa-toggle {
    display: flex; align-items: center; gap: var(--space-2); width: 100%; text-align: left;
    padding: var(--space-2) var(--space-3); margin-bottom: 6px; border-radius: var(--radius-sm);
    border: 1px solid var(--border); background: var(--surface-alt);
    color: var(--text); cursor: pointer; font-size: 0.88rem;
    transition: background var(--duration-fast) var(--ease-standard), border-color var(--duration-fast) var(--ease-standard);
}
.btn-empresa-toggle.selecionada { border-color: var(--primary); background: var(--primary-subtle); }
/* Caixinha quadrada com o sinal de marcado: a bolinha redonda lia como
   escolha única, e aqui se marcam várias (vistoria de 28/09/2026). */
.emp-toggle-dot {
    width: 16px; height: 16px; flex-shrink: 0; border-radius: 4px;
    border: 2px solid var(--border-strong); background: transparent;
    display: inline-flex; align-items: center; justify-content: center;
    transition: background var(--duration-fast) var(--ease-standard), border-color var(--duration-fast) var(--ease-standard);
}
.btn-empresa-toggle.selecionada .emp-toggle-dot { border-color: var(--primary); background: var(--primary); }
.btn-empresa-toggle.selecionada .emp-toggle-dot::after {
    content: ""; width: 4px; height: 8px; margin-top: -2px;
    border: solid #fff; border-width: 0 2px 2px 0; transform: rotate(45deg);
}
.modal-corpo input:disabled { opacity: 0.6; cursor: not-allowed; }

/* Escolha de empresa, carregamento e conexão (app.js) */
.empresa-ultima { opacity: 0.6; font-weight: 400; }
.icone-seta  { width: 14px; height: 14px; opacity: 0.5; }
.icone-check { width: 14px; height: 14px; }
.carregando-tela {
    position: fixed; inset: 0; z-index: 9999;
    display: flex; flex-direction: column; align-items: center; justify-content: center; gap: var(--space-4);
    background: var(--bg);
}
.carregando-roda {
    width: 40px; height: 40px; border-radius: 50%;
    border: 3px solid var(--border); border-top-color: var(--primary);
    animation: carregandoGira 0.8s linear infinite;
}
.carregando-texto { color: var(--text-muted); font-size: 0.9rem; }
.carregando-logo { width: 190px; height: auto; margin-bottom: var(--space-3); }
@keyframes carregandoGira { to { transform: rotate(360deg); } }
.status-conexao {
    position: fixed; bottom: var(--space-4); right: var(--space-4); z-index: 900;
    align-items: center; gap: 6px; padding: 5px 10px; cursor: pointer;
    background: var(--surface); border: 1px solid var(--border-light); border-radius: 20px;
    box-shadow: 0 2px 8px rgba(0,0,0,0.15);
    font-size: 0.86rem; color: var(--text-muted);
    opacity: 0.85; transition: opacity var(--duration-base) var(--ease-standard);
}
.status-conexao:hover { opacity: 1; }
.status-conexao-ponto { font-size: 8px; }
.status-conexao-ponto--conectando   { color: #a1a1aa; }
.status-conexao-ponto--sincronizado { color: #22c55e; }
.status-conexao-ponto--salvando     { color: #f59e0b; }
.status-conexao-ponto--offline      { color: #ef4444; }
.status-conexao-ponto--pendente     { color: #f97316; }
.status-conexao-ponto--erro         { color: #ef4444; }

/* Demonstração e estado vazio */
.btn-empresa-troca.btn-empresa-troca--perfil { flex-direction: column; align-items: flex-start; gap: 2px; }
.demo-perfil-nome { font-weight: 600; }
.demo-perfil-papel { font-style: normal; opacity: 0.6; font-size: 0.893rem; }
.demo-perfil-descricao { font-size: 0.893rem; color: var(--text-muted); }
.demo-faixa-acoes { display: flex; gap: var(--space-2); }
.td-vazio.td-vazio--ensina { padding: 26px 14px; }
.td-vazio-titulo { display: block; color: var(--text); font-size: 0.95rem; margin-bottom: var(--space-1); }
.acoes-celula .btn-secundario { font-size: 0.893rem; padding: 4px 10px; }   /* do tamanho dos vizinhos da linha */

/* ══ REDESENHO VISÍVEL, 18/09/2026 ══════════════════════════════════
   Depois de tirar o inline (3.2/3.3), o desenho em si, tela por tela. */

/* Relatório: uma nota por linha */
#tabelaRelatorioEl > thead th { padding: 11px 10px; }
#tabelaRelatorio > tr.linha-nota > td { padding: 8px 10px; white-space: nowrap; }
#tabelaRelatorioEl .celula-texto { max-width: 140px; overflow: hidden; text-overflow: ellipsis; }
#tabelaRelatorio > tr > td:nth-child(4) { max-width: 130px; }   /* base */
#tabelaRelatorio > tr > td:nth-child(5) { max-width: 170px; }   /* motorista */
#tabelaRelatorioEl .celula-data,
#tabelaRelatorioEl .celula-placa { font-family: 'JetBrains Mono', monospace; font-size: 0.893rem; color: var(--text-muted); }
#tabelaRelatorioEl .celula-nota { font-weight: 600; }
#tabelaRelatorioEl .celula-num { font-family: 'JetBrains Mono', monospace; font-size: 0.893rem; text-align: right; }
#tabelaRelatorioEl .celula-dinheiro { font-weight: 600; }
#tabelaRelatorioEl thead th:nth-child(7),
#tabelaRelatorioEl thead th:nth-child(8) { text-align: right; }
#tabelaRelatorioEl tr.linha-nota { cursor: pointer; }
.celula-acoes { text-align: right; }
.celula-acoes .btn-icone + .btn-icone { margin-left: 2px; }

/* Botão de ícone: 30 px, fundo só no hover, cor pela ação */
.btn-icone {
    display: inline-flex; align-items: center; justify-content: center;
    width: 28px; height: 28px; padding: 0; vertical-align: middle;
    border: 1px solid transparent; border-radius: var(--radius-sm);
    background: transparent; color: var(--text-muted); cursor: pointer;
    transition: background var(--duration-fast) var(--ease-standard), color var(--duration-fast) var(--ease-standard), border-color var(--duration-fast) var(--ease-standard);
}
.btn-icone svg { width: 16px; height: 16px; }
.btn-icone:hover, .btn-icone:focus-visible { background: var(--surface-hover); color: var(--text); border-color: var(--border); }
.btn-icone--editar:hover  { color: var(--success); }
.btn-icone--clonar:hover  { color: var(--info); }
.btn-icone--excluir:hover { color: var(--danger); background: var(--danger-light); border-color: var(--danger); }
.btn-ver-inline svg { transition: transform var(--duration-base) var(--ease-standard); }
.btn-ver-inline.btn-ver-ativo { color: var(--primary); border-color: var(--primary); }
.btn-ver-inline.btn-ver-ativo svg { transform: rotate(180deg); }

/* Relatório: totais em destaque */
.rel-kpis { display: grid; grid-template-columns: repeat(auto-fit, minmax(170px, 1fr)); gap: var(--space-3); margin-bottom: var(--space-3); }
.rel-kpi { display: flex; flex-direction: column; gap: 2px; min-width: 0; }
.rel-kpi-rotulo { font-size: 0.86rem; font-weight: 700; text-transform: uppercase; letter-spacing: 0.08em; color: var(--text-muted); }
.rel-kpi-valor { font-family: 'Syne', sans-serif; font-size: 1.35rem; font-weight: 700; color: var(--text); line-height: 1.2; white-space: nowrap; }
.rel-kpi-nota { font-size: 0.86rem; color: var(--text-muted); }
#resumoRelatorio { padding: var(--space-4) var(--space-5); }

/* Cartões de número (Dashboard, Analítico, Grupo): rótulo em cima, número
   grande embaixo, ícone no canto, sem uma linha inteira só para o ícone. */
.kpi-container { gap: var(--space-4); margin-bottom: var(--space-7); }
.kpi-card { display: flex; flex-direction: column; padding: 18px 20px 16px; }
.kpi-card::after { display: none; }
.kpi-card:hover { transform: translateY(-2px); }
.kpi-card .kpi-icon {
    position: absolute; top: 14px; right: 14px; margin: 0;
    width: 32px; height: 32px;
}
.kpi-card .kpi-icon svg { width: 16px; height: 16px; }
.kpi-card .kpi-label { order: -1; padding-right: 44px; margin-bottom: 10px; color: var(--text-muted); }
.kpi-card .kpi-valor { font-size: clamp(1.4rem, 1.05rem + 0.9vw, 1.85rem); margin-bottom: 4px; }
.kpi-card .kpi-variacao {
    align-self: flex-start; margin-top: var(--space-2);
    padding: 2px 8px; border-radius: 999px;
    background: var(--surface-alt); font-size: 0.86rem;
}
.kpi-card .kpi-variacao-boa { background: var(--success-light); }
.kpi-card .kpi-variacao-ruim { background: var(--danger-light); }
@media (min-width: 1100px) {
    #kpiDashboard { grid-template-columns: repeat(6, 1fr); }
    #kpiDashboard > .kpi-card:nth-child(-n+3) { grid-column: span 2; }
    #kpiDashboard > .kpi-card:nth-child(n+4) { grid-column: span 3; }
}

/* Explicação recolhida: uma linha que abre com um clique */
.dica-recolhida { font-size: 0.893rem; color: var(--text-muted); }
.dica-recolhida > summary {
    cursor: pointer; width: fit-content; list-style: none;
    display: inline-flex; align-items: center; gap: 6px;
    padding: 2px 0; color: var(--text-muted);
}
.dica-recolhida > summary::-webkit-details-marker { display: none; }
.dica-recolhida > summary::before { content: "ⓘ"; font-size: 0.9rem; color: var(--primary); }
.dica-recolhida > summary:hover { color: var(--text); }
.dica-recolhida[open] > summary { margin-bottom: 6px; color: var(--text); }
.dica-recolhida > p { max-width: 900px; }

/* Por combustível: os quatro cartões ocupam a largura toda, e a nota longa
   do custo recebido fica em texto normal, não em maiúsculas espremidas. */
.dash-comb-kpis { grid-template-columns: repeat(auto-fit, minmax(190px, 1fr)); }
/* Rótulo em cima, número grande embaixo: o desenho dos cartões do topo. */
.dash-comb-kpi { display: flex; flex-direction: column; gap: 6px; background: var(--surface); padding: 14px 16px 12px; }
.dash-comb-kpi .dash-comb-kpi-label {
    order: 0; margin: 0; display: block; font-weight: 700; font-size: 0.86rem;
    color: var(--text-muted); letter-spacing: 0.08em;
}
.dash-comb-kpi-base { font-weight: 400; text-transform: none; letter-spacing: 0; color: var(--text-light); }
.dash-comb-kpi .dash-comb-kpi-val {
    font-family: 'Syne', sans-serif; font-weight: 700; font-size: 1.4rem;
    letter-spacing: -0.02em; line-height: 1.1; white-space: nowrap;
}
.dash-comb-kpi-nota { font-size: 0.86rem; line-height: 1.4; color: var(--text-muted); }
.kpi-variacao-chip {
    align-self: flex-start; padding: 2px 8px; border-radius: 999px;
    font-family: 'JetBrains Mono', monospace; font-size: 0.86rem; font-weight: 700;
}
.kpi-variacao-chip--danger  { background: var(--danger-light);  color: var(--danger); }
.kpi-variacao-chip--success { background: var(--success-light); color: var(--success); }

/* Tabelas curtas do Dashboard: números à direita, em fonte de número. */
.tabela-ultimas td.celula-num { font-family: 'JetBrains Mono', monospace; font-size: 0.893rem; white-space: nowrap; }
.tabela-ultimas .celula-acoes { width: 44px; padding-top: 4px; padding-bottom: 4px; }
.sr-only { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; border: 0; }

/* Lançamento: faixa do XML, dois painéis e a barra de salvar sempre à vista */
.importar-xml-bloco {
    display: flex; align-items: center; gap: var(--space-3); flex-wrap: wrap;
    padding: 10px 14px; margin-bottom: var(--space-4);
    border: 1px dashed var(--border); border-left: 1px dashed var(--border);
    background: transparent; border-radius: var(--radius-md);
}
.importar-xml-icone { width: 20px; height: 20px; color: var(--primary); flex-shrink: 0; }
/* Nota ainda sem combustível: diz o que fazer, em vez de um painel vazio. */
#combustiveisNota:empty::before {
    content: "Nenhum combustível ainda. Adicione o primeiro abaixo, ou importe o XML da nota lá em cima.";
    display: block; margin-bottom: var(--space-3); padding: var(--space-3) var(--space-4);
    border: 1px dashed var(--border); border-radius: var(--radius); color: var(--text-muted); font-size: 0.93rem;
}
.importar-xml-texto { flex: 1; min-width: 220px; display: flex; flex-direction: column; gap: 2px; }
.importar-xml-bloco .importar-xml-label { display: inline; margin: 0; font-size: 0.86rem; }
.importar-xml-dica { font-size: 0.893rem; color: var(--text-muted); }
/* `label` com cara de botão: a regra geral de `button` não vale para ele. */
.btn-arquivo {
    display: inline-flex; align-items: center; gap: 7px; cursor: pointer; white-space: nowrap;
    padding: 9px 18px; border-radius: var(--radius);
    font-size: 0.875rem; font-weight: 600; font-family: inherit; letter-spacing: 0.01em;
    text-transform: none; margin: 0;
}
.input-arquivo-oculto {
    position: absolute; width: 1px; height: 1px; overflow: hidden;
    clip: rect(0 0 0 0); clip-path: inset(50%); white-space: nowrap;
}
.input-arquivo-oculto:focus-visible + *, .btn-arquivo:has(+ .input-arquivo-oculto:focus-visible) { outline: 2px solid var(--foco); outline-offset: 2px; }
/* Os outros campos de arquivo (Conferências, backup, importação de planilha
   e de cadastros) saíam com o botão cru do navegador, "Escolher Arquivo" e
   um "Nenhum ar…vo escolhido" cortado (vistoria de 28/09/2026). Agora têm o
   mesmo botão da faixa do XML, com o nome do arquivo ao lado. */
.arquivo-escolha {
    position: relative; display: flex; align-items: center; gap: 10px;
    flex-wrap: wrap; margin-top: var(--space-2);
}
.arquivo-escolha .input-arquivo-oculto { left: 0; top: 0; }
/* Dentro de `.campo`, a regra dos rótulos (caixa alta, letra miúda, cinza)
   pegava o botão, que também é um `label`. */
.arquivo-escolha .btn-arquivo {
    font-size: 0.875rem; font-weight: 600; letter-spacing: 0.01em;
    text-transform: none; color: var(--text);
}
.arquivo-nome { font-size: 0.893rem; color: var(--text-muted); overflow-wrap: anywhere; }

.lanc-painel {
    background: var(--surface); border: 1px solid var(--border-light);
    border-radius: var(--radius-lg); box-shadow: var(--shadow-sm);
    padding: var(--space-5) var(--space-6) var(--space-6);
    margin-bottom: var(--space-4);
}
.tela h3.lanc-painel-titulo { margin: 0 0 var(--space-4); }
.lanc-painel .form-grid { margin-bottom: 0; }

/* Os botões de salvar ficam presos ao pé da tela enquanto se rola o formulário. */
.acoes-lancamento {
    position: sticky; bottom: 0; z-index: 20;
    margin-top: var(--space-4); padding: var(--space-3) 0;
    background: linear-gradient(to top, var(--bg) 75%, transparent);
    border-top: none; align-items: center;
}

/* Fretes: o mês em cartões, o frete em destaque */
.kpi-container--fretes { margin-bottom: var(--space-4); }
@media (min-width: 1100px) {
    .kpi-container--fretes { grid-template-columns: 1.4fr 1fr 1fr 1fr; }
}
/* O frete do mês fica em destaque pelo tamanho do cartão, não pela cor: em
   vermelho ele lia como alerta, que é o que o vermelho quer dizer no resto
   do sistema (vistoria de 28/09/2026). */

/* Títulos de seção legíveis: eram 0,66rem, maiúsculas e cinza-claro, e o
   olho não achava onde começava cada bloco. Agora seguem o título das
   seções do Sistema: fonte de título, cor do texto, tamanho de leitura. */
.tela h3 {
    font-family: 'Syne', sans-serif; font-size: 1rem; font-weight: 700;
    color: var(--text); text-transform: none; letter-spacing: -0.01em;
}
.tela h3 .titulo-nota { font-family: 'DM Sans', sans-serif; }

/* Detalhe da nota no Relatório: um painel de verdade. Até aqui não tinha
   estilo nenhum: encostava na borda, herdava a `ul li` das listas de
   Cadastros (o histórico se espalhava de ponta a ponta) e o negrito de cada
   linha do histórico virava título ("CRIADO" sozinho numa linha). */
.linha-detalhe-inline > td { background: var(--bg) !important; }
.detalhe-inline-inner {
    margin: 2px 0 10px; padding: var(--space-5) var(--space-6);
    background: var(--surface-alt); border: 1px solid var(--border-light);
    border-left: 3px solid var(--primary); border-radius: 0 0 var(--radius-md) var(--radius-md);
    animation: detalheAbre var(--duration-base) var(--ease-standard) both;
}
@keyframes detalheAbre { from { opacity: 0; transform: translateY(-4px); } to { opacity: 1; transform: none; } }
.detalhe-inline-inner .detalhe-info {
    grid-template-columns: repeat(4, minmax(0, 1fr)); gap: var(--space-2) var(--space-5);
    margin-bottom: var(--space-4);
}
.detalhe-inline-inner .detalhe-info div { padding: 4px 0; min-width: 0; }
.detalhe-inline-inner .detalhe-info strong { display: block; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.detalhe-inline-inner .detalhe-subtitulo { font-family: 'Syne', sans-serif; font-size: 0.93rem; color: var(--text); margin: var(--space-2) 0 var(--space-2); }
.detalhe-inline-inner .detalhe-tabela { background: var(--surface); margin-top: 0; }
.detalhe-inline-inner .detalhe-tabela td, .detalhe-inline-inner .detalhe-tabela th { white-space: normal; max-width: none; }
.detalhe-inline-inner .detalhe-obs { background: var(--surface); }
.log-list { padding: 0; margin: 6px 0 0; }
.log-list li { display: block; padding: 3px 0; border: none; background: none; gap: 0; }
.log-list li:first-child { border-top: none; }
.log-list li:hover { background: none; }
.log-list li strong { color: var(--text); font-weight: 600; }
.detalhe-inline-inner .detalhe-acoes-estado { margin-top: var(--space-4); }
@media (max-width: 900px) {
    .detalhe-inline-inner .detalhe-info { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}
/* O `pre-wrap` é para as quebras de linha das observações; no histórico e nos
   anexos ele transformava a indentação do HTML em linhas em branco. */
.detalhe-obs.detalhe-obs--historico { white-space: normal; }
/* Números da tabela de combustíveis à direita e numa linha só
   ("23.000,000 L" quebrava em duas). */
.detalhe-tabela th:nth-child(n+2):nth-child(-n+5),
.detalhe-tabela td:nth-child(n+2):nth-child(-n+5) { text-align: right; }
.detalhe-inline-inner .detalhe-tabela td:nth-child(n+2):nth-child(-n+5) {
    white-space: nowrap; font-family: 'JetBrains Mono', monospace; font-size: 0.893rem;
}
/* O mesmo conteúdo dentro de um modal (detalhe da entrada no Dashboard):
   sem a moldura de painel aberto na tabela. */
.modal--detalhe { max-width: 780px; }
.modal--detalhe .detalhe-inline-inner {
    margin: 0; padding: 0; background: none; border: none; border-radius: 0; animation: none;
}
.modal--detalhe .detalhe-inline-inner .detalhe-info strong { white-space: normal; }
.detalhe-tabela-rolagem { overflow-x: auto; }

/* Anexos do detalhe: fichas lado a lado, não faixas de lista. */
.lista-anexos { display: flex; flex-wrap: wrap; gap: var(--space-2); align-items: flex-start; }
.lista-anexos .anexo-item {
    display: inline-flex; width: auto; padding: 0; gap: 0;
    border: none; border-top: none; background: none;
}
.lista-anexos .anexo-item:hover { background: none; }
.lista-anexos .anexo-imagem { display: block; line-height: 0; text-decoration: none; }
.lista-anexos .anexo-imagem .preview-nf { margin: 0; }
/* Arquivo que não é imagem (PDF, XML): etiqueta com o nome, no desenho das
   outras etiquetas do site. */
.lista-anexos .anexo-arquivo {
    display: inline-block; max-width: 220px; overflow: hidden;
    text-overflow: ellipsis; white-space: nowrap;
    padding: 7px var(--space-3); border: 1px solid var(--border);
    border-radius: var(--radius); background: var(--surface);
    color: var(--text); text-decoration: none; font-size: 0.893rem; font-weight: 600;
}
.lista-anexos .anexo-arquivo:hover { border-color: var(--primary); color: var(--primary); }

/* No celular a tabela do Relatório é mais larga que a tela e rola de lado
   (488 px de tabela para 330 visíveis a 375). A célula do detalhe segue a
   largura da TABELA, não a da tela: o painel nascia com os rótulos à vista
   e os valores fora, alcançáveis só rolando a tabela para o lado. Agora ele
   gruda na borda esquerda e mede a área visível de quem rola. Vale para
   qualquer nota, não só as de vários combustíveis (21/09/2026). */
@media (max-width: 560px) {
    .tabela-container { container-type: inline-size; }
    .detalhe-inline-container { position: sticky; left: 0; width: 100cqw; }
}

@media (max-width: 560px) {
    .detalhe-tabela thead { display: none; }
    .detalhe-tabela, .detalhe-tabela tbody, .detalhe-tabela tr { display: block; width: 100%; }
    .detalhe-tabela tr { padding: var(--space-2) 0; border-bottom: 1px solid var(--border-light); }
    .detalhe-tabela tr:last-child { border-bottom: none; }
    .detalhe-tabela td,
    .detalhe-inline-inner .detalhe-tabela td:nth-child(n+2):nth-child(-n+5) {
        display: flex; justify-content: space-between; align-items: center; gap: var(--space-3);
        padding: 4px var(--space-3); border: none; text-align: right; white-space: normal;
    }
    .detalhe-tabela td::before {
        content: attr(data-rotulo); font-family: 'DM Sans', sans-serif; font-size: 0.86rem; font-weight: 700;
        text-transform: uppercase; letter-spacing: 0.08em; color: var(--text-light); text-align: left;
    }
    .detalhe-tabela td:first-child { font-weight: 600; color: var(--text); }
}
.modal-titulo-apoio { font-family: 'DM Sans', sans-serif; font-weight: 400; font-size: 0.93rem; color: var(--text-muted); margin-left: var(--space-2); }
@media (max-width: 560px) { .modal-titulo-apoio { display: block; margin: 2px 0 0; } }

/* Alertas do Dashboard: uma linha por alerta, com etiqueta do tipo */
.alertas-container { gap: 6px; }
.alerta-item {
    display: grid; grid-template-columns: 76px minmax(0, 1fr) auto auto; align-items: center;
    gap: var(--space-3); padding: 10px 12px 10px 14px;
    background: var(--surface); border: 1px solid var(--border-light); border-radius: var(--radius);
    transition: border-color var(--duration-fast) var(--ease-standard), background var(--duration-fast) var(--ease-standard);
}
.alerta-item:hover { border-color: var(--border); background: var(--surface-alt); }
.alerta-tipo {
    justify-self: start; padding: 3px 9px; border-radius: 999px;
    font-size: 0.86rem; font-weight: 700; text-transform: uppercase; letter-spacing: 0.07em;
}
.alerta-item--preco  .alerta-tipo { background: var(--warning-light); color: var(--warning); }
.alerta-item--volume .alerta-tipo { background: var(--info-light);    color: var(--info); }
.alerta-item--data   .alerta-tipo { background: var(--danger-light);  color: var(--danger); }
.alerta-conteudo { min-width: 0; cursor: pointer; }
.alerta-item-titulo { font-weight: 600; font-size: 0.875rem; color: var(--text); }
/* A mensagem quebra a linha em vez de terminar em reticências
   (23/09/2026). Cortada, ela escondia justamente o que o alerta existe
   para mostrar: o preço, a mediana e quantas notas entraram na conta. No
   tablet e no notebook ela era cortada em quase todo alerta de preço. */
.alerta-item-msg { font-size: 0.893rem; color: var(--text-muted); margin-top: 2px; overflow-wrap: anywhere; }
.alerta-item-msg strong { color: var(--text); font-weight: 600; }
.alerta-confirmar {
    padding: 6px 12px; font-size: 0.893rem; font-weight: 600;
    background: transparent; color: var(--text-muted);
    border: 1px solid var(--border); border-radius: var(--radius-sm);
}
.alerta-confirmar:hover { color: var(--success); border-color: var(--success); background: var(--success-light); }
@media (max-width: 700px) {
    .alerta-item { grid-template-columns: auto minmax(0, 1fr); }
    .alerta-item .btn-icone { display: none; }
    .alerta-confirmar { grid-column: 1 / -1; justify-self: end; }
    .alerta-item-msg { white-space: normal; }
}

/* Barra de filtros: campos e aplicar numa linha, atalhos embaixo, uma caixa só */
.barra-filtros {
    background: var(--surface); border: 1px solid var(--border-light); border-radius: var(--radius-lg);
    box-shadow: var(--shadow-sm); padding: var(--space-4) var(--space-5); margin-bottom: var(--space-5);
}
.barra-filtros-campos { display: flex; flex-wrap: wrap; align-items: flex-end; gap: var(--space-3); }
.barra-filtros-campos .campo { flex: 1 1 170px; max-width: 240px; margin: 0; }
.barra-filtros-aplicar { flex: 0 0 auto; }
.barra-filtros-rodape {
    display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: var(--space-3);
    margin-top: var(--space-3); padding-top: var(--space-3); border-top: 1px solid var(--border-light);
}
.barra-filtros-grupo { display: flex; flex-wrap: wrap; align-items: center; gap: 6px; }

/* Controle segmentado: duas opções coladas, a ativa preenchida */
.segmentado { display: inline-flex; padding: 3px; border-radius: 999px; background: var(--surface-alt); border: 1px solid var(--border-light); }
.segmentado button {
    padding: 5px 14px; border-radius: 999px; border: none; background: transparent;
    color: var(--text-muted); font-size: 0.893rem; font-weight: 600;
}
.segmentado button:hover { color: var(--text); }
.segmentado button.ativo { background: var(--primary); color: #fff; }

/* O número do cartão cabe numa linha: a fonte acompanha a largura do cartão */
.kpi-card { container-type: inline-size; }
.kpi-card .kpi-valor { font-size: min(1.85rem, 10.5cqi); white-space: nowrap; }

/* Analítico: nas tabelas das abas, da segunda coluna em diante é número,
   alinhado à direita, em fonte de número, para comparar de olho. */
#analitico .aba-conteudo table th:nth-child(n+2),
#analitico .aba-conteudo table td:nth-child(n+2) { text-align: right; }
#analitico .aba-conteudo table td:nth-child(n+2) { font-family: 'JetBrains Mono', monospace; font-size: 0.893rem; }
#analitico .aba-conteudo table td:first-child { font-weight: 600; }
#analitico .aba-conteudo .barra-progresso { margin-left: auto; }
/* No celular, a regra geral espicha cada atalho a meia largura; na barra
   de filtros eles ficam no tamanho natural, e o rótulo em linha própria. */
.barra-filtros-grupo .btn-filtro-rapido { flex: 0 0 auto; }
/* O Excel do Grupo esta sozinho na barra: a regra de 480px que poe dois
   botoes por linha o esticava a meia largura. (21/09/2026) */
.barra-filtros-grupo .btn-export { flex: 0 0 auto; }
@media (max-width: 768px) {
    .barra-filtros-grupo .filtros-rapidos-sep { flex-basis: 100%; }
    .barra-filtros-campos .campo { max-width: none; }
    .barra-filtros-aplicar { width: 100%; justify-content: center; }
}

/* Cadastros: cada aba é um painel; o formulário de inclusão fica numa faixa
   no alto e a lista vira uma tabela leve, com ações em ícones. */
#cadastros .aba-conteudo {
    background: var(--surface); border: 1px solid var(--border-light); border-radius: var(--radius-lg);
    box-shadow: var(--shadow-sm); padding: var(--space-5) var(--space-6); margin-top: var(--space-4);
}
#cadastros .aba-conteudo > h3 { margin-top: 0; }
#cadastros .aba-conteudo > .form-linha {
    padding: var(--space-3); margin-bottom: var(--space-2);
    background: var(--surface-alt); border: 1px solid var(--border-light); border-radius: var(--radius-md);
}
#cadastros .aba-conteudo > ul { margin: 0; padding: 0; border: 1px solid var(--border-light); border-radius: var(--radius-md); overflow: hidden; }
#cadastros .aba-conteudo > ul > li { padding: 8px 10px 8px 16px; border-top: none; border-bottom: 1px solid var(--border-light); }
#cadastros .aba-conteudo > ul > li:last-child { border-bottom: none; }
#cadastros .aba-conteudo > ul > li:first-child { border-top: none; }
#cadastros .aba-conteudo > ul > li.vazio { border: none; }
#cadastros .acoes-lista { gap: 2px; flex-wrap: nowrap; }
.btn-icone--inativar:hover { color: var(--warning); }
#cadastros .filtro-lista { margin: var(--space-3) 0 var(--space-2); }

/* Opções do PDF: a `.form-linha input` (flex:1; min-width:200px) esticava
   as caixas de marcar em traços de 200 px, e o rótulo herdava a caixa-alta
   do rótulo de campo. Caixa de marcar é caixa de marcar. */
.form-linha--opcoes label {
    display: inline-flex; align-items: center; gap: var(--space-2); cursor: pointer;
    text-transform: none; letter-spacing: 0; font-size: 0.93rem; font-weight: 500; color: var(--text); margin: 0;
}
.form-linha--opcoes input[type="checkbox"] { flex: 0 0 auto; min-width: 0; width: 16px; height: 16px; margin: 0; }

/* Tabela de números: a primeira coluna é o nome; da segunda em diante
   (ou da terceira, com --3), número à direita em fonte de número. */
/* Só as células da própria tabela (`>`): uma tabela dentro dela (as notas
   do dia na Conferência) tem colunas de texto e herdava o alinhamento. */
.tabela-numeros > * > tr > th:nth-child(n+2), .tabela-numeros > * > tr > td:nth-child(n+2) { text-align: right; }
.tabela-numeros > * > tr > td:nth-child(n+2) { font-family: 'JetBrains Mono', monospace; font-size: 0.893rem; white-space: nowrap; }
.tabela-numeros.tabela-numeros--3 > * > tr > th:nth-child(2), .tabela-numeros.tabela-numeros--3 > * > tr > td:nth-child(2) {
    text-align: left; font-family: inherit;
}
.tabela-numeros > * > tr > td[colspan] { text-align: left; font-family: inherit; white-space: normal; }
/* A regra acima, feita para as sublinhas e para a linha de total, vencia a
   .td-vazio (mais especifica) e jogava o cartao de "nenhuma descarga" para
   a borda esquerda nas quatro abas de Fretes. (21/09/2026) */
.tabela-numeros > * > tr > td[colspan].td-vazio { text-align: center; }
.filtros .filtros-rodape-grade { grid-column: 1 / -1; margin-top: 0; }
.filtros { padding: var(--space-4) var(--space-5); margin-bottom: var(--space-5); }

/* Fretes e Dashboard: o mesmo cartão dos outros filtros */
.fretes-filtro, #dashFiltrosPeriodo {
    background: var(--surface); border: 1px solid var(--border-light); border-radius: var(--radius-lg);
    box-shadow: var(--shadow-sm); padding: var(--space-3) var(--space-5);
}
#dashFiltrosPeriodo { margin-bottom: var(--space-3); }
.fretes-filtro { margin-bottom: var(--space-5); }

/* Caixa de marcar e botão de opção voltam a ser desenhados pelo navegador.
   A regra geral de `input` tira a aparência nativa (por causa da seta do
   select) e dá `width: auto`: a caixa encolhia para 2 px e sumia, em
   "Mostrar excluídas", "Mostrar inativos", "Informar quantidade
   descarregada", nas opções do PDF. Defeito antigo, achado em 18/09/2026. */
input[type="checkbox"], input[type="radio"] {
    -webkit-appearance: auto; appearance: auto;
    width: 16px; height: 16px; min-width: 16px; padding: 0; margin: 0;
    border: none; background: none; border-radius: 3px;
    flex: 0 0 auto; vertical-align: middle; accent-color: var(--primary); cursor: pointer;
}
/* Os interruptores do modal de alertas escondem a caixa de propósito. */
._cfg-toggle input { width: 0; height: 0; min-width: 0; opacity: 0; }

/* Celular: o cabeçalho tinha 502 px numa tela de 375 e empurrava a página
   para o lado. Fica o essencial: menu, empresa, busca, sair e tema. */
@media (max-width: 768px) {
    .header-actions { gap: 6px; min-width: 0; }
    .header-empresa-rotulo, .busca-kbd { display: none; }
    /* Sem as teclas, o rodapé da busca virava "navegar abrir fechar" solto. */
    .busca-global-footer { display: none; }
    .header-empresa { min-width: 0; }
    .btn-busca-global { padding: 7px 9px; }
    .app-header { padding: 0 14px; gap: 10px; }
    /* Atalhos de período no tamanho natural, como na barra de filtros. */
    .dash-filtros-rapidos .btn-filtro-rapido { flex: 0 0 auto; }
    .dash-filtros-rapidos .filtros-rapidos-sep { flex-basis: 100%; }
    #dashFiltrosPeriodo .campo-data { flex: 1 1 130px; min-width: 0; }
}
/* O nome da empresa ativa tem teto em qualquer largura (23/09/2026). O
   limite existia só no celular; acima de 768 px um nome de transportadora
   com 40 letras empurrava o título da tela para fora. O nome inteiro
   aparece ao tocar, no modal de troca. */
.empresa-ativa-badge { max-width: 240px; min-width: 0; }
.empresa-ativa-badge #empresaAtivaLabel { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; min-width: 0; }
.empresa-ativa-badge .icone-chevron { flex-shrink: 0; }
/* Até 768 px o teto acompanha a janela: 150 px perto de 480, onde o título
   mais longo ainda precisa caber ao lado, e os 240 inteiros a partir de
   570. Com 150 fixos, um celular deitado cortava o nome com a linha vazia. */
@media (max-width: 768px) { .empresa-ativa-badge { max-width: min(240px, calc(100vw - 330px)); } }

/* Celular estreito: cabeçalho em duas linhas (23/09/2026). Numa linha só,
   o título da tela ficava com 11 px a 320 e 51 px a 360: "Dash...", e
   "Histórico de lançamentos" precisa de 191. Ele é a única coisa na página
   que diz em qual tela se está (o h2 interno é escondido de propósito),
   então ele fica com a primeira linha, entre o menu e a busca, e a empresa
   ativa desce para a segunda, com o nome inteiro à vista. O
   `display: contents` solta a empresa e a busca do grupo de ações para que
   cada uma vá para a sua linha. */
@media (max-width: 480px) {
    .app-header { height: auto; min-height: var(--header-height); flex-wrap: wrap; row-gap: 4px; padding: 6px 14px; }
    .header-actions { display: contents; }
    .btn-hamburger { order: 0; }
    .header-page-title { order: 1; flex: 1 1 0; }
    .btn-busca-global { order: 2; }
    .header-empresa { order: 3; flex: 1 1 100%; }
    /* `.app-header` na frente para vencer o mínimo de 36 px do bloco de
       toque, que vem depois no arquivo: aqui a segunda linha pesa mais
       que 4 px de alvo. */
    .app-header .empresa-ativa-badge { max-width: 100%; min-height: 32px; }
}
/* O campo de arquivo escondido fica preso dentro da faixa do XML (solto,
   ele empurrava a página 30 px para o lado no celular). */
.importar-xml-bloco { position: relative; }
.input-arquivo-oculto { left: 0; top: 0; }
/* Celular: os filtros do Relatório em duas colunas (eram oito campos
   empilhados, uma tela inteira antes da primeira nota). */
/* `minmax(0, 1fr)` e o campo com `min-width: 0`: com `1fr` puro a coluna
   não fica menor que o conteúdo, e no celular (campos em 16 px para o
   iPhone não dar zoom) a data empurrava as duas colunas para fora da tela
   (23/09/2026). */
@media (max-width: 768px) {
    #relatorios .filtros { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: var(--space-2) var(--space-3); padding: var(--space-3); }
    #relatorios .filtros .campo input:not([type="checkbox"]), #relatorios .filtros .campo select { min-width: 0; width: 100%; }
    #relatorios .filtros .campo input[type="date"] { font-size: 0.893rem; padding: 8px 8px; }
    #relatorios .filtros .campo-checkbox { grid-column: 1 / -1; }
}
@media (max-width: 768px) {
    .rel-kpis { grid-template-columns: 1fr 1fr; }
    .rel-kpi-valor { font-size: 1.05rem; }
}

/* ── ESCOLHA DE EMPRESAS DO FECHAMENTO (22/09/2026) ────────────────
   Cada linha é clicável inteira, e não só a caixinha: a lista é curta e
   o alvo pequeno de um checkbox é o erro mais comum num modal que decide
   o conteúdo de um documento. */
.fm-escolha {
    display: flex; align-items: flex-start; gap: 10px; cursor: pointer;
    padding: 11px 14px; border: 1px solid var(--border-light);
    border-radius: var(--radius); background: var(--surface-alt);
    transition: border-color 0.12s, background 0.12s;
}
.fm-escolha:hover { border-color: var(--primary); }
.fm-escolha input { width: auto; margin: 2px 0 0; cursor: pointer; flex-shrink: 0; }
.fm-escolha span { display: flex; flex-direction: column; gap: 2px; font-size: 0.875rem; }
.fm-escolha em { font-style: normal; font-size: 0.893rem; color: var(--text-muted); }

/* ── PRÉVIA DETALHADA DA IMPORTAÇÃO (22/09/2026) ───────────────────
   A lista completa vive dentro de um <details>: fechada ela não empurra o
   botão de confirmar para fora da tela, e aberta tem altura máxima com
   rolagem própria, para 128 placas não virarem uma página de rolar. */
.cad-imp-detalhe { margin-top: 10px; }
.cad-imp-detalhe summary {
    cursor: pointer; font-size: 0.893rem; color: var(--text-muted);
    padding: 7px 0; user-select: none;
}
.cad-imp-detalhe summary:hover { color: var(--primary); }
.cad-imp-itens {
    max-height: 190px; overflow-y: auto;
    background: var(--surface-alt); border: 1px solid var(--border-light);
    border-radius: var(--radius); padding: 11px 14px; margin: 0;
    font-size: 0.893rem; line-height: 2; word-break: break-word;
}
.cad-imp-itens em { font-style: normal; color: var(--text-muted); font-size: 0.86rem; }

/* ── CENTRAL DE RELATÓRIOS (22/09/2026) ────────────────────────────
   A lista do que o sistema emite. O desenho mudou no mesmo dia, depois de
   o dono usar: o cartão era um botão gigante que abria outra tela, e os
   formatos eram etiquetas miúdas no canto. O alvo grande fazia a coisa
   fraca e o pequeno fazia a forte, então a página lia como um segundo
   menu. Agora o cartão é só a descrição do documento, os botões de
   formato são a ação, e "Ver em Fretes" é um link discreto no rodapé.

   `auto-fill` com mínimo de 320px: em tela larga saem três colunas, no
   celular uma, sem media query. O `min(100%, ...)` é para o celular de
   320: sobram 292 px e a coluna de 320 passava da tela, com os botões de
   formato cortados pela borda (23/09/2026). */
.central-lista {
    display: grid; gap: 14px;
    grid-template-columns: repeat(auto-fill, minmax(min(100%, 320px), 1fr));
}
/* Sem `cursor: pointer` e sem `:hover` de elevação: o cartão não é mais
   clicável, e fingir que é foi o defeito que esta versão corrige. */
.central-card {
    display: flex; flex-direction: column; gap: 9px;
    background: var(--surface); border: 1px solid var(--border-light);
    border-radius: var(--radius-lg); padding: 18px 20px;
    box-shadow: var(--shadow-sm);
}
/* A base de data subiu para o topo: ela qualifica o documento, e no rodapé
   competia por atenção com os botões. Fica sempre embaixo do nome: ao lado
   dele, ela descia de linha só nos cartões de nome comprido, e os seis
   cartões saíam com dois arranjos (vistoria de 28/09/2026). */
.central-card-topo {
    display: flex; flex-direction: column; align-items: flex-start; gap: 3px;
}
.central-card-nome {
    margin: 0; font-family: 'Syne', sans-serif; font-size: 0.98rem;
    font-weight: 700; color: var(--text); letter-spacing: -0.01em;
}
.central-card-base {
    font-size: 0.86rem; color: var(--text-muted); font-style: italic;
    white-space: nowrap;
}
.central-card-linha {
    margin: 0; font-size: 0.893rem; line-height: 1.55; color: var(--text-muted);
}
.central-card-rodape {
    display: flex; align-items: center; justify-content: space-between;
    gap: 10px; flex-wrap: wrap; margin-top: auto; padding-top: 6px;
}
.central-card-formatos { display: flex; gap: 7px; flex-wrap: wrap; }
/* Os botões de formato agora são a ação principal, e têm o tamanho de
   quem é: os mesmos 0.78rem dos botões do resto do sistema, não os
   0.72rem de etiqueta que tinham quando eram secundários. */
.central-card .central-formato { font-size: 0.893rem; padding: 6px 13px; }
/* No celular a regra geral estica todo `.btn-export` a meia largura, para
   a barra de exportação sair com dois por linha. Aqui isso empilhava PDF e
   Excel um sobre o outro dentro do cartão. Mesma solução da barra de
   filtros, que tem a mesma regra. */
.central-card-formatos .btn-export { flex: 0 0 auto; }
/* O link para a tela de origem: discreto em repouso, porque é a saída de
   quem quer conferir antes de emitir, não a ação que a página oferece.
   `--text-muted` e não `--primary`: o vinho da marca sobre a superfície
   escura dá 2,46:1, abaixo do mínimo de texto pequeno mesmo sem nenhuma
   transparência. */
.central-card-abrir {
    display: inline-flex; align-items: center; gap: 3px; flex-shrink: 0;
    background: none; border: none; padding: 4px 0; margin-left: auto;
    font-family: inherit; font-size: 0.86rem; font-weight: 600;
    color: var(--text-muted); cursor: pointer; transition: color 0.14s;
}
.central-card-abrir svg { width: 13px; height: 13px; }
.central-card-abrir:hover { color: var(--text); text-decoration: underline; }
.central-card-abrir:focus-visible { outline: 2px solid var(--foco); outline-offset: 2px; border-radius: 4px; }

/* O segmentado miúdo do alvo do período rápido, na barra de filtros do
   histórico: o de tamanho normal empurraria os quatro atalhos para a
   linha de baixo. */
.segmentado--mini { padding: 2px; }
.segmentado--mini button { padding: 3px 10px; font-size: 0.86rem; }

@media (max-width: 480px) {
    .central-lista { grid-template-columns: 1fr; }
    .central-card { padding: 15px 16px; }
    .central-card-abrir { margin-left: 0; }
}

/* ── O RODAPÉ DA BARRA LATERAL (22/09/2026) ────────────────────────
   A barra terminava em 321px de vazio, 37% da altura dela, porque nada
   ancorava o fim. O dono trouxe quatro referências e todas prendiam algo
   embaixo: o sair numa, o sair mais o tema noutra, as ações mais o cartão
   do usuário na terceira. Nelas o vazio fica ENTRE duas âncoras e lê como
   respiro; aqui ficava depois da última e lia como inacabado.

   `margin-top: auto` num filho de coluna flex empurra o bloco para o fim
   e deixa a sobra no meio, que é exatamente o desenho das referências. */
.sidebar-nav { flex: 1 1 auto; }
.sidebar-rodape {
    flex: 0 0 auto; margin-top: auto;
    padding: 10px 10px 12px;
    border-top: 1px solid rgba(255,255,255,0.07);
}
/* O cartão da identidade: quem está logado e com qual papel. Fica abaixo
   das ações e separado delas, porque é informação e não botão. */
/* O mesmo `gap` e o mesmo `padding` lateral do `.sidebar-item`, para o
   nome cair na coluna exata dos rótulos acima. Com o círculo de 30px que
   havia aqui antes o texto começava 11px à direita deles. */
.sidebar-usuario {
    display: flex; align-items: center; gap: 11px;
    padding: 11px 12px 3px; margin-top: 6px;
    border-top: 1px solid rgba(255,255,255,0.07);
    min-width: 0;
}
.sidebar-usuario-icone { flex-shrink: 0; color: rgba(255,255,255,0.55); }
/* `min-width: 0` para o nome longo caber com reticência em vez de empurrar
   o ícone para fora da barra. */
.sidebar-usuario-nome {
    min-width: 0;
    font-size: 0.93rem; font-weight: 600; color: rgba(255,255,255,0.92);
    white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
/* No tema claro a barra tem fundo claro, entao o branco fixo do cartao
   ficava invisivel: sobrava o avatar sozinho. As cores seguem as mesmas
   que os itens do menu ja usam aqui, logo acima. */
[data-theme="light"] .sidebar-rodape,
[data-theme="light"] .sidebar-usuario { border-top-color: rgba(0,0,0,0.08); }
[data-theme="light"] .sidebar-usuario-nome  { color: #0f172a; }
[data-theme="light"] .sidebar-usuario-icone { color: #64748b; }

/* ── O TÍTULO DO CABEÇALHO EM TELA MÉDIA (22/09/2026) ──────────────
   Num notebook de 1024 px o título ficava com 7,8 px dos 248 de que
   precisa: o nome da tela sumia por completo, em TODAS as telas, porque
   `.header-actions` tem `flex-shrink: 0` e não cede nada. Sobrava a
   reticência sozinha.

   Achado ao conferir a renomeação de "Relatórios" para "Histórico", e é
   por ela que deixou de ser cosmético: agora há duas telas de nome
   parecido, o `<h2>` interno fica escondido de propósito, e esse título
   é a única coisa na página que diz em qual das duas você está.

   A dieta é a mesma que o celular já faz desde 21/09, começando antes:
   o relógio (118 px, e a hora está no sistema operacional), o rótulo
   "Empresa:" (48 px, o nome ao lado já se explica) e a tecla do Ctrl+K
   (49 px, o atalho continua funcionando), e o "?" dos atalhos de teclado,
   que o celular também já esconde. Libera 259 px sem tirar ação nenhuma de
   ninguém: o Ctrl+K continua abrindo a busca e o "?" continua respondendo.

   Os 259 px são o que faz "Histórico de lançamentos", o título mais longo
   do sistema com 248 px, caber inteiro. Sem o "?" ele parava em
   "Histórico de lançament…", que é onde o nome deixa de distinguir. */
@media (max-width: 1200px) {
    .header-datetime { display: none; }
    .header-empresa-rotulo { display: none; }
    .busca-kbd { display: none; }
}

/* ── "VER NO ANALÍTICO" NOS BLOCOS DE PRÉVIA (22/09/2026) ──────────
   Dois blocos do Dashboard repetem, em miniatura, o que o Analítico faz
   por inteiro. O link fica na mesma linha do título, alinhado à direita,
   discreto em repouso: é uma saída, não a ação do bloco.

   `--text-muted` e não `--primary`: o vinho da marca sobre a superfície
   escura dá 2,46:1, abaixo do mínimo de texto pequeno mesmo sem nenhuma
   transparência. */
.dash-bloco-cabecalho {
    display: flex; align-items: baseline; justify-content: space-between;
    gap: 12px; flex-wrap: wrap;
}
/* O `h3` dentro do cabeçalho já recebe a margem do bloco, então a dele
   zera: com as duas, o título descolava do conteúdo que ele nomeia. */
.dash-bloco-cabecalho h3 { margin-bottom: 0; }
.dash-ver-completo {
    display: inline-flex; align-items: center; gap: 3px; flex-shrink: 0;
    background: none; border: none; padding: 4px 0;
    font-family: inherit; font-size: 0.893rem; font-weight: 600;
    color: var(--text-muted); cursor: pointer; transition: color 0.14s;
}
.dash-ver-completo svg { width: 13px; height: 13px; }
.dash-ver-completo:hover { color: var(--text); text-decoration: underline; }
.dash-ver-completo:focus-visible { outline: 2px solid var(--foco); outline-offset: 2px; border-radius: 4px; }

/* ── PRÉVIA DO PDF (22/09/2026) ────────────────────────────────────
   O documento aparece antes de ser salvo, num `iframe` que é o próprio
   visualizador de PDF do navegador. O modal é alto de propósito: uma
   prévia em que só cabe meia página não deixa conferir nada, e é
   justamente conferir que ela existe para permitir.

   `min-height` além do `height` em vh porque numa janela baixa o
   visualizador ficaria com uns poucos centímetros e a rolagem do PDF
   dentro dele ficaria inutilizável. */
/* A prévia ocupa quase a janela toda, e é de propósito: ela existe para
   conferir um documento antes de mandá-lo para fora, e conferir tabela de
   oito colunas numa janelinha não é conferir.

   A ALTURA NÃO É FIXA, e a primeira versão errou nisso. Ela dava 80vh ao
   quadro do PDF e esquecia que o cabeçalho do modal, os botões, o padding
   e a faixa do modo demonstração também ocupam altura: a soma passava da
   janela e o modal virava uma coisa para rolar, justamente ele, que existe
   para ser visto de uma vez.

   Agora quem manda é o `max-height: 100%` do modal. O `.modal-overlay` já
   desconta a faixa da demonstração e tem 20px de recuo, então esse 100% é
   o espaço que sobra de verdade. O quadro do PDF recebe o que restar
   depois do cabeçalho e dos botões, e `min-height: 0` é o que permite ele
   encolher: sem isso um filho de flex se recusa a ficar menor que o
   próprio conteúdo e o modal estouraria de novo. */
.modal--pdf {
    max-width: min(1400px, 97vw);
    width: 97vw;
    /* `height` ALEM do `max-height`: só com o teto o modal encolhia até o
       tamanho do conteúdo, e um iframe não tem altura própria para
       empurrar, então a prévia colapsava para uns poucos centímetros. Com
       os dois, ele ocupa exatamente o espaço que o overlay oferece. */
    height: 100%;
    max-height: 100%;
    display: flex; flex-direction: column;
}
.pdf-previa {
    width: 100%;
    flex: 1 1 auto; min-height: 0;
    border: 1px solid var(--border-light);
    border-radius: var(--radius);
    background: var(--surface-alt);
    margin: var(--space-3) 0;
}
/* O cabeçalho e os botões não encolhem: quem cede espaço é o quadro. */
.modal--pdf .modal-cabecalho,
.modal--pdf .modal-acoes { flex: 0 0 auto; }

/* ══ RESPONSIVIDADE, REVISÃO DE 23/09/2026 ══════════════════════════
   Medido tela por tela em quinze tamanhos, de 320x568 a 2560x1440,
   passando por celular deitado (844x390) e notebook com zoom de 125%
   (1093x530). O roteiro de medição está em `.claude/auditoria.js`. */

/* ── Todo modal cabe na janela ──────────────────────────────────────
   Só a prévia do PDF tinha teto de altura. Os outros cresciam com o
   conteúdo e quem rolava era o fundo: numa janela baixa, o detalhe da
   nota, o cadastro de usuário, o frete nota a nota e a conferência antes
   de gravar perdiam de vista o X e os botões ao rolar para ver o meio.
   Agora o modal para na altura que existe e rola por dentro, com o
   cabeçalho grudado em cima e os botões embaixo.

   O `padding` com `margin` negativa do mesmo tamanho não muda nada quando
   o modal cabe; quando ele rola, é o respiro entre o texto grudado e a
   borda. O fundo opaco e o `z-index` impedem que o conteúdo que passa por
   baixo (tabelas têm `position: relative`) apareça por cima deles.

   `top` e `bottom` NEGATIVOS, do tamanho do padding do modal (28 px): o
   grudado para no limite do padding, não na borda. Com `0`, sobrava uma
   faixa de 28 px em cima e embaixo por onde o formulário aparecia rolando
   (conferido no cadastro de usuário, a 530 px de altura).

   O respiro entre o grudado e o conteúdo que passa por baixo dele é um
   degradê de 12 px (`::after` no cabeçalho, `::before` nos botões), e não
   `padding`: ele fica sobre a margem que já existia, então com o modal
   parado não muda espaçamento nenhum. Com `padding` o espaço acima dos
   botões crescia até 12 px nos diálogos de confirmação.

   O campo focado que para atrás dos botões grudados (Tab, teclado do
   celular) é resolvido em ui.js, no `focusin`. Com `scroll-padding` aqui,
   o diálogo que abre com o foco num botão grudado já abria rolado até o
   fim. */
.modal { max-height: 100%; overflow-y: auto; overscroll-behavior: contain; }
/* Barra de rolagem fina e sem setas nas janelas altas e nas tabelas que
   rolam dentro delas: a padrão do Windows, cinza e com setas, cortava a
   borda arredondada da janela (vistoria de 28/09/2026). */
.modal, .modal .tabela-container--rolagem {
    scrollbar-width: thin; scrollbar-color: var(--border-strong) transparent;
}
.modal .modal-cabecalho {
    position: sticky; top: -28px; z-index: 3;
    background: var(--surface-raised);
    padding-top: 16px; margin-top: -16px;
}
.modal .modal-cabecalho::after,
.modal .modal-acoes::before,
.modal > .linha-acoes:last-child::before {
    content: ""; position: absolute; left: 0; right: 0; height: 12px; pointer-events: none;
}
.modal .modal-cabecalho::after { top: 100%; background: linear-gradient(var(--surface-raised), transparent); }
/* Sem degradê onde a margem é menor que ele: no cabeçalho "colado" (4 px
   até o subtítulo) ele cobriria o alto do texto; a prévia do PDF não rola. */
.modal .modal-cabecalho--colado::after,
.modal--pdf .modal-cabecalho::after,
.modal--pdf .modal-acoes::before { display: none; }
.modal .modal-acoes::before,
.modal > .linha-acoes:last-child::before { bottom: 100%; background: linear-gradient(transparent, var(--surface-raised)); }
.modal .modal-cabecalho h3 { min-width: 0; overflow-wrap: anywhere; }
.modal .modal-acoes {
    position: sticky; bottom: -28px; z-index: 3;
    background: var(--surface-raised);
    padding-bottom: 16px; margin-bottom: -16px;
}
/* Alguns modais (o do fechamento em PDF) fecham com `.linha-acoes`. Só a
   do fim gruda: no meio de um modal ela é outra coisa, como o "Marcar
   todas" das empresas de um usuário. */
.modal > .linha-acoes:last-child {
    position: sticky; bottom: -28px; z-index: 3;
    background: var(--surface-raised);
    padding-bottom: 16px; margin-bottom: -16px;
}
/* O aviso de erro entra no alto do modal, ANTES do cabeçalho (ui.js,
   `fixarErroNoLocal`). A margem negativa do cabeçalho o fazia subir 2 px
   por cima da caixa do erro. */
.modal > .erros-locais + .modal-cabecalho { margin-top: 0; padding-top: 0; }
/* A busca tem a rolagem dela na lista de resultados: o modal inteiro
   rolando levava o campo de busca para fora da vista. */
.modal.busca-global-modal { overflow: hidden; }

/* A tabela do "frete nota a nota" tinha 52% da altura da JANELA, somada
   ao resto do modal. Agora o modal é uma coluna e a tabela fica com o que
   sobra: é ela que rola, e o cabeçalho e o botão de Excel não saem. */
.modal--tabela { display: flex; flex-direction: column; }
.modal--tabela > .tabela-container--rolagem { flex: 1 1 auto; min-height: 120px; max-height: none; }
.modal--tabela > :not(.tabela-container--rolagem) { flex: 0 0 auto; }

/* ── Rolar até um ponto da página sem parar embaixo do cabeçalho ────
   O cabeçalho é grudado no topo (64 px, mais a faixa da demonstração).
   Quem rola a página até um elemento, como o Histórico ao trocar de
   página da tabela, ou o navegador ao focar um campo, deixava o topo dele
   escondido ali embaixo. No celular o cabeçalho tem duas linhas. */
html { scroll-padding-top: calc(var(--faixa-demo-h) + var(--header-height) + 8px); }
@media (max-width: 480px) { html { scroll-padding-top: calc(var(--faixa-demo-h) + 96px); } }

/* ── Tela larga: o conteúdo no meio ─────────────────────────────────
   As telas param em 1400 px. A 2560 sobravam 857 px vazios à direita,
   tudo encostado na barra lateral. Abaixo de uns 1716 px de janela não
   muda nada, porque o conteúdo não chega ao limite. */
.tela { margin-inline: auto; }

/* ── Cartões por combustível do Dashboard no celular ────────────────
   Duas colunas abaixo de 480 px, e o valor em fonte grande sem quebra:
   um gasto de sete dígitos passava da borda do cartão. O tamanho acompanha
   a largura do cartão, como já fazem os cartões do topo. */
.dash-comb-kpi { min-width: 0; container-type: inline-size; }
.dash-comb-kpi .dash-comb-kpi-val { font-size: min(1.4rem, 13cqi); }
/* O mesmo no resumo do Histórico: a 320 px, "R$ 27.789.913,95" pedia
   129 px num cartão de 118 e passava da borda. O `container-type` do
   cartão de combustível só vale no celular, onde a largura dele vem da
   grade: no computador ela vem do conteúdo, e a contenção a zeraria. */
.rel-kpi { container-type: inline-size; }
.rel-kpi .rel-kpi-valor { font-size: min(1.35rem, 11cqi); }
@media (max-width: 768px) { .rel-kpi .rel-kpi-valor { font-size: min(1.05rem, 11cqi); } }
@media (max-width: 480px) {
    .rel-card { container-type: inline-size; }
    .rel-card .rel-card-valor { font-size: min(0.86rem, 10.5cqi); }
}

/* ── Linha de combustível com a descarga à vista, em tela média ─────
   Cinco colunas entre 641 e 820 px deixavam de 112 a 124 px para cada
   número, e com o campo em 16 px (toque) "1.234.567,89" já não cabia. O
   combustível sobe para uma linha própria e os três números dividem a de
   baixo. Vai até 820 para pegar o tablet em pé, que desde a gaveta tem a
   largura toda da tela para o formulário. */
@media (min-width: 641px) and (max-width: 820px) {
    .linha-combustivel.mostra-descarga { grid-template-columns: repeat(3, minmax(0, 1fr)) auto; }
    .linha-combustivel.mostra-descarga > .campo-item--tipo { grid-column: 1 / -1; }
}

/* ── Login em janela baixa ──────────────────────────────────────────
   Com duas colunas, o cartão tinha 573 px de altura; num notebook com
   zoom (530 px de janela) o fim dele ficava fora. Menos respiro, a mesma
   informação. */
@media (max-height: 620px) and (min-width: 761px) {
    .login-marca { padding: 28px 32px; gap: var(--space-4); }
    .login-form { padding: 24px 32px 16px; }
    .login-subtitulo { margin-bottom: var(--space-4); }
    .login-ou { margin: var(--space-3) 0 var(--space-2); }
    .login-form .pf-assinatura { margin-top: var(--space-3); }
}
/* Janela muito baixa, como o celular deitado: fica só o formulário. Com a
   faixa da marca por cima, a 360 px de altura o campo de senha e o botão
   Entrar ficavam abaixo da dobra. A assinatura AFN continua no pé. */
@media (max-height: 500px) {
    .modal-overlay.login-overlay { align-items: flex-start; padding: var(--space-3); }
    .login-cartao { grid-template-columns: 1fr; width: min(440px, 100%); }
    .login-cartao > .login-marca { display: none; }
    .login-form { padding: var(--space-5) var(--space-5) var(--space-3); }
    .login-subtitulo { margin-bottom: var(--space-3); }
}

/* ── Tela de toque ──────────────────────────────────────────────────
   Vale para qualquer aparelho cujo apontador principal é o dedo:
   celular, tablet. No computador nada muda, e a densidade das tabelas
   escolhida em 18/09 continua a mesma.

   1. Campos com 16 px. Abaixo disso o Safari do iPhone dá zoom sozinho
      ao tocar no campo, e a página pula a cada campo do formulário. Com a
      raiz em 14 px, todo campo do site estava entre 11,2 e 12,6 px. O
      `!important` é de propósito: há regras de campo mais específicas
      espalhadas pelo arquivo (data, mês, número, busca), e todas precisam
      ceder aqui.
   2. Alvos de 40 px. Os ícones de ação das tabelas tinham 28 px com 2 px
      entre eles: no dedo, tocar em Editar e acertar Excluir era questão
      de milímetro. Abas, paginação, filtros de período e os botões de
      fechar ficavam entre 22 e 31 px. */
@media (pointer: coarse) {
    input:not([type="checkbox"]):not([type="radio"]):not([type="range"]),
    select, textarea { font-size: 16px !important; }

    .btn-icone { width: 40px; height: 40px; }
    .celula-acoes .btn-icone + .btn-icone { margin-left: 4px; }
    #cadastros .acoes-lista, .acoes-celula.acoes-celula--icones { gap: 4px; }
    .aba-btn { min-height: 40px; }
    .btn-filtro-rapido { min-height: 36px; }
    .pag-btn { min-width: 40px; min-height: 40px; }
    .modal-fechar { min-width: 40px; min-height: 40px; }
    .btn-hamburger, .btn-fechar-sidebar { min-width: 40px; min-height: 40px; align-items: center; justify-content: center; }
    .btn-busca-global { min-height: 40px; min-width: 40px; justify-content: center; }
    .busca-global-input { min-height: 40px; }
    .empresa-ativa-badge { min-height: 36px; }
    .alerta-confirmar, .dash-ver-completo, .central-card-abrir { min-height: 36px; }
    .btn-export, .segmentado button, .btn-metrica, .demo-dica button { min-height: 36px; }
    .btn-primario, .btn-secundario, .btn-cancelar { min-height: 40px; justify-content: center; }
    /* O mês por extenso ("setembro de 2026") em 16 px não cabia nos 180 px
       do campo, e o ano saía cortado. */
    .campo-mes { max-width: 240px; }
    /* As duas datas do Dashboard dividiam a linha com 137 px cada, e a data
       em 16 px pede 150: saía "01/09/202". Com a base em 150 elas ficam lado
       a lado a partir de uns 390 px de tela e uma embaixo da outra abaixo. */
    #dashFiltrosPeriodo .campo-data { flex-basis: 150px; }
    /* Data em 16 px na fonte mono pedia 138 px, e os filtros do Histórico
       a 320 de largura dão 125 por coluna. Na fonte do resto do site, com
       algarismos de largura igual, ela cabe e continua alinhada. */
    input[type="date"], input[type="month"] { font-family: 'DM Sans', sans-serif; font-variant-numeric: tabular-nums; }
    .login-esqueci { min-height: 40px; }
    .login-ver-senha { width: 40px; height: 40px; }
    #demoFaixa button { min-height: 32px; }
    input[type="checkbox"], input[type="radio"] { width: 20px; height: 20px; min-width: 20px; }
    /* Os interruptores das Configurações de alertas escondem a caixa de
       propósito: a regra de cima, que vem depois, a traria de volta. */
    ._cfg-toggle input { width: 0; height: 0; min-width: 0; }
}
/* Celular de 320: as datas dos filtros do Histórico ocupam a linha
   inteira, e os outros filtros seguem em duas colunas. Em meia linha
   (125 px) a data não cabia, e no iPhone ela aparece por extenso
   ("23 de set. de 2026"), que é ainda mais larga. */
@media (max-width: 340px) {
    #relatorios .filtros .campo:has(input[type="date"]) { grid-column: 1 / -1; }
}

/* ── Prévia do PDF em qualquer tela ─────────────────────────────────
   O nome do arquivo numa linha só, cortado: um relatório com os dois
   filtros de data tem nome de 90 caracteres, que quebrava em três linhas
   e tirava altura da prévia. O nome inteiro fica no `title`. */
.modal--pdf .modal-cabecalho h3 { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
/* No celular e no tablet as páginas vêm desenhadas pelo PDF.js
   (_pdfEntregar): uma embaixo da outra, na largura da caixa, rolando
   dentro dela. */
.pdf-previa--paginas {
    overflow: auto; overscroll-behavior: contain;
    display: flex; flex-direction: column; align-items: center; gap: var(--space-3);
    padding: var(--space-3);
}
/* A folha existe desde o início, com a proporção da página (`aspect-ratio`
   vem do JS); a imagem entra e sai conforme a rolagem. */
.pdf-pagina { display: flex; width: 100%; flex: 0 0 auto; background: #fff; box-shadow: var(--shadow-sm); }
.pdf-pagina canvas { display: block; width: 100%; height: auto; }
.pdf-pagina .pdf-previa-aviso { color: #555; }
.pdf-previa-aviso { margin: auto; padding: var(--space-5); color: var(--text-muted); text-align: center; line-height: 1.5; }
/* Celular: os três botões dividem a linha, em vez de dois e um sobrando. */
@media (max-width: 480px) {
    .modal--pdf .modal-acoes button { flex: 1 1 auto; }
}
/* Janela baixa ou celular: a prévia ocupa a janela inteira, com o mínimo
   de moldura. No celular deitado (360 px de altura, menos a faixa da
   demonstração) o recuo, o cabeçalho e os botões deixavam 80 px para o
   documento. Sem `:has` (navegador antigo) o recuo fica, e nada quebra. */
@media (max-height: 560px), (max-width: 480px) {
    .modal-overlay:has(> .modal--pdf) { padding: 0; }
    .modal--pdf { width: 100%; max-width: 100%; border-radius: 0; padding: 10px 12px; }
    .modal--pdf .modal-cabecalho { padding-top: 0; margin: 0; }
    .modal--pdf .modal-cabecalho h3 { font-size: 0.9rem; }
    .modal--pdf .pdf-previa { margin: 8px 0; }
    .modal--pdf .modal-acoes { margin: 0; padding: 0; }
}

/* ══ MÊS FECHADO E VIGÊNCIAS (23/09/2026) ═══════════════════════════ */
/* A faixa da tela de Fretes: em que pé o mês da empresa ativa está. */
.faixa-fechamento {
    display: flex; align-items: center; justify-content: space-between; gap: var(--space-3); flex-wrap: wrap;
    margin-bottom: var(--space-3); padding: var(--space-3) var(--space-4);
    background: var(--surface); border: 1px solid var(--border-light); border-left: 4px solid var(--border-strong);
    border-radius: var(--radius); font-size: 0.93rem; line-height: 1.5;
}
.faixa-fechamento--fechado { background: var(--success-light); border-color: var(--success); }
.faixa-fechamento-texto { display: flex; flex-direction: column; gap: 2px; flex: 1 1 320px; min-width: 0; }
.faixa-fechamento-texto strong { color: var(--text); }
.faixa-fechamento-texto span { color: var(--text-muted); }
#fretesFechamentoMes .historico-cadastro { margin: 0 0 var(--space-4); }

/* O editor de vigências da taxa e do % no cadastro da empresa. */
.vigencias-titulo { font-size: 0.86rem; font-weight: 700; color: var(--text-muted); text-transform: uppercase; letter-spacing: 0.09em; }
.vigencias { display: flex; flex-direction: column; gap: 6px; }
.vigencia-linha { display: grid; grid-template-columns: minmax(0, 1fr) auto 110px 32px; gap: 8px; align-items: center; }
.vigencia-inicio { font-size: 0.93rem; color: var(--text-muted); }
.vigencia-ate { font-size: 0.893rem; color: var(--text-light); white-space: nowrap; }
.vigencia-linha .vigencia-data, .vigencia-linha .fm-numero { width: 100%; min-width: 0; }
.btn-vigencia-nova { align-self: flex-start; }
@media (max-width: 480px) {
    .vigencia-linha { grid-template-columns: minmax(0, 1fr) 96px 32px; }
    .vigencia-ate { grid-column: 1 / -1; grid-row: 2; }
}

/* ══ DE QUAL BASE É ESTA NOTA? (item 10, 23/09/2026) ════════════════ */
.base-nfe-opcao { display: flex; align-items: center; gap: 8px; font-size: 0.93rem; font-weight: 600; color: var(--text); cursor: pointer; margin-bottom: 6px; }
.base-nfe-opcao input { width: auto; margin: 0; }
.base-nfe-select, .base-nfe-nome { width: 100%; }
.vinculo-nfe-linha { display: flex; align-items: center; justify-content: space-between; gap: 8px; font-size: 0.93rem; color: var(--text-muted); }

/* ══ LEITURA E UM ACENTO SÓ (13/10/2026) ═══════════════════════════════
   Revisão visual que o dono aprovou vendo a prévia lado a lado (a
   "Proposta B"). A identidade fica: preto, vinho, Syne, DM Sans. Muda o
   que se lê:
   - piso de 12 px no texto, no arquivo inteiro (a base é 14 px, então
     12 px = 0,86rem; 12,5 px = 0,893rem; 13 px = 0,93rem). Antes, 276 dos
     316 textos do Dashboard tinham de 9 a 11,5 px;
   - rótulos dos cartões sem maiúsculas espaçadas;
   - no número grande, "R$" pequeno no alto e centavos e "L" menores: em
     Syne, o ponto do milhar e a vírgula se confundiam (`kpiNum`, utils.js);
   - pílulas em letra de texto, cinza quando é volume (`htmlVariacao`);
   - um acento só: o vinho fica no primeiro cartão de cada fileira e os
     outros ficam neutros, para a cor dizer alguma coisa (alerta, preço que
     subiu) em vez de enfeitar. */
.kpi-card .kpi-label {
    text-transform: none; letter-spacing: 0;
    font-size: 0.93rem; font-weight: 600; color: var(--text-muted);
}
.kpi-card .kpi-valor {
    letter-spacing: -0.03em; white-space: nowrap;
    font-size: clamp(1.6rem, 1.15rem + 1vw, 2.15rem);
}
.kpi-moeda {
    font-family: 'DM Sans', sans-serif; font-weight: 600;
    font-size: max(0.86rem, 0.5em); letter-spacing: 0; color: var(--text-muted);
    margin-right: 0.04em; vertical-align: 0.55em;
}
.kpi-centavos, .kpi-unidade {
    font-family: 'DM Sans', sans-serif; font-weight: 600;
    font-size: max(0.86rem, 0.5em); letter-spacing: 0; color: var(--text-muted);
}
.kpi-unidade { margin-left: 0.04em; }
.kpi-card .kpi-base { font-size: 0.893rem; line-height: 1.45; }
.kpi-base--nota { margin-top: 6px; color: var(--text-light); cursor: help; }
.kpi-card .kpi-variacao, .kpi-variacao-chip {
    font-family: 'DM Sans', sans-serif; font-variant-numeric: tabular-nums;
    font-size: 0.86rem; font-weight: 600; padding: 3px 8px; letter-spacing: 0;
    white-space: nowrap; max-width: 100%; overflow: hidden; text-overflow: ellipsis;
}
.kpi-card .kpi-variacao-neutra { background: var(--surface-alt); color: var(--text-muted); }

/* Um acento só. `:is()` para vencer as cores por classe (.verde, .roxo...)
   sem `!important`: a especificidade é a mesma, e esta regra vem depois. */
.kpi-card::before,
.kpi-card:is(.verde, .laranja, .roxo, .violeta)::before { background: var(--border-strong); }
.kpi-container > .kpi-card:first-child::before { background: var(--primary); }
.kpi-card .kpi-icon,
.kpi-card:is(.verde, .laranja, .roxo, .violeta) .kpi-icon { background: var(--surface-alt); }
.kpi-card .kpi-icon svg,
.kpi-card:is(.verde, .laranja, .roxo, .violeta) .kpi-icon svg { color: var(--text-muted); }
.kpi-container > .kpi-card:first-child .kpi-icon { background: var(--primary-light); }
.kpi-container > .kpi-card:first-child .kpi-icon svg { color: var(--primary-texto); }
.kpi-clicavel,
.kpi-clicavel:is(.verde, .laranja, .roxo, .violeta) { --cor-kpi: var(--primary); }

/* Item ativo do menu: o vinho como texto sobre o vinho escuro dava 2,4:1. */
.sidebar-item.ativo {
    color: var(--text);
    background: linear-gradient(90deg, rgba(160, 40, 40, 0.34), rgba(160, 40, 40, 0.06));
}
.sidebar-item.ativo .sidebar-item-icon { color: var(--primary-texto); }
[data-theme="light"] .sidebar-item.ativo { background: rgba(160, 40, 40, 0.1); color: var(--primary); }

/* Empresa no cabeçalho (era 2,6:1): o nome em texto claro, o vinho na borda. */
.empresa-ativa-badge { color: var(--text); }
.empresa-ativa-badge .icone-chevron { color: var(--primary-texto); opacity: 1; }
[data-theme="light"] .empresa-ativa-badge { color: var(--primary); }

/* O <small> sem classe ficava com 83% do pai: o @usuário da lista de
   Usuários saía com 10 px. Nunca abaixo do piso. */
small { font-size: max(0.86rem, 0.83em); }

/* Cabeçalho de tabela a 12 px: menos espaçamento entre letras. */
th { letter-spacing: 0.04em; }

/* O botão da demo esperando o app terminar de carregar. */
.btn-secundario[aria-busy="true"] { opacity: 0.6; cursor: progress; }

/* O nome no rodapé da barra virou botão: abre "Meu perfil". */
button.sidebar-usuario {
    width: 100%; padding: 10px 12px; border: 0; border-top: 1px solid rgba(255, 255, 255, 0.07);
    border-radius: 0; background: none; color: inherit; text-align: left; font: inherit; gap: 11px;
}
button.sidebar-usuario:hover, button.sidebar-usuario.ativo { background: rgba(255, 255, 255, 0.06); }
button.sidebar-usuario:focus-visible { outline: 2px solid var(--foco); outline-offset: -2px; }
[data-theme="light"] button.sidebar-usuario { border-top-color: rgba(0, 0, 0, 0.08); }
[data-theme="light"] button.sidebar-usuario:hover,
[data-theme="light"] button.sidebar-usuario.ativo { background: rgba(0, 0, 0, 0.04); }

/* "Pular para o conteúdo": invisível até receber o foco do teclado. */
.pular-conteudo {
    position: absolute; left: 12px; top: -60px; z-index: 10000;
    padding: 10px 16px; border-radius: var(--radius);
    background: var(--primary); color: #fff; font-weight: 600; text-decoration: none;
}
.pular-conteudo:focus { top: 12px; }
/* No login não há conteúdo para onde pular. */
body:has(#loginOverlay[style*="flex"]) .pular-conteudo { display: none; }
#conteudoPrincipal:focus { outline: none; }
