/* ==========================================================================
   Sistema-EDT — Tokens de design + shell da aplicação
   --------------------------------------------------------------------------
   Fonte única de verdade de cor, espaçamento, raio e sombra.
   Carregado por ÚLTIMO em base.html para vencer os CSS legados por página.

   Navegação em dois níveis:
     - barra horizontal no topo  -> seções (Escalação, Análises, Konecta, ...)
     - lateral contextual        -> páginas da seção em que se entrou
       (só aparece nas seções que têm sub-itens)

   Tema: atributo data-theme no <html>, definido pelo script inline em
   base.html antes da primeira pintura (evita piscar claro->escuro).
   ==========================================================================

   CONTRATO DE TELA — breakpoints canônicos
   --------------------------------------------------------------------------
   Cinco faixas, desktop-first, TODAS em max-width. Antes disto o repo tinha 17
   valores distintos em 49 @media, nenhum documentado.

     nome   faixa (CSS px)   significado
     xs     < 860            mobile: gaveta hamburger, lateral vira faixa
     sm     860 – 1199       desktop compacto: lateral em RAIL de ícones
     md     1200 – 1559      desktop padrão
     lg     1560 – 1919      4 colunas de card (preescalacao/kanban.html)
     xl     >= 1920          ultrawide: tetos de container liberados

   Altura: baixa < 640 · media 640–819 · alta >= 820.

   NÃO se cria `@media (min-width: ...)`. A forma canônica do complemento é
   `@media not all and (max-width: 859px)` — ver a justificativa completa no
   bloco 3.1: com `min-width` sobra uma faixa morta nas larguras fracionárias
   (859,5px), comuns justamente na escala 125/150% do Windows.

   Viewport CSS = pixels físicos ÷ escala do Windows. O parque real:
     1280x720 @100% -> 1280   @125% -> 1024
     1366x768 @100% -> 1366   @125% -> 1093   @150% -> 911
     1920x1080 @100% -> 1920  @150% -> 1280
     2560x1080 e 3440x1440 -> ultrawide

   As 8 regras de tela (tabela com wrapper, sticky exige max-height, altura
   derivada de --edt-vh-util, container com max-width e nunca min-width, modal
   .edt-modal, zero cor hardcoded, media query só no shell, gráfico em
   .edt-chart-wrap) estão em CLAUDE.md §18.7.

   ATENÇÃO: o valor 860 aparece em 5 lugares que precisam mudar JUNTOS —
   blocos 3.1 e 7 deste arquivo, documentos_escalacao.css (2x) e
   js/nav_topo.js. Divergir abre uma faixa em que o painel acha que está no
   mobile e o shell acha que não.
   ========================================================================== */

/* --------------------------------------------------------------------------
   1. Tokens — tema claro (padrão)
   -------------------------------------------------------------------------- */
:root {
    /* Superfícies */
    --edt-surface-0: #f5f6f8;   /* fundo da página */
    --edt-surface-1: #ffffff;   /* cards, painéis */
    --edt-surface-2: #eef0f4;   /* linhas alternadas, hover */
    --edt-surface-3: #e4e7ec;   /* elementos elevados/afundados */

    /* Texto */
    --edt-text: #1f2937;
    --edt-text-muted: #6b7280;
    --edt-text-inverse: #ffffff;

    /* Bordas */
    --edt-border: #e2e5ea;
    --edt-border-strong: #cbd2dc;

    /* Marca */
    --edt-brand: #2563eb;
    --edt-brand-hover: #1d4ed8;
    --edt-brand-soft: #eaf1ff;
    --edt-brand-contrast: #ffffff;

    /* Semânticas (status do domínio) */
    --edt-success: #16a34a;
    --edt-success-soft: #dcfce7;
    --edt-warning: #d97706;
    --edt-warning-soft: #fef3c7;
    --edt-danger: #dc2626;
    --edt-danger-soft: #fee2e2;
    --edt-info: #0891b2;
    --edt-info-soft: #cffafe;
    --edt-neutral: #64748b;
    --edt-neutral-soft: #e2e8f0;
    /* Cores que precisam se distinguir das semânticas acima sem entrar na
       família da marca. Hoje: "campo" e "parcial" na Carga Disponível.
       O amarelo é mais aberto que --edt-warning (matiz 45° contra 32°), para
       não colidir com o vermelho na escala de ocupação; escurecido o bastante
       para manter 3,2:1 sobre fundo branco, porque também pinta texto. */
    --edt-violeta: #7c3aed;
    --edt-amarelo: #b58900;

    /* Navegação */
    --edt-nav-bg: #ffffff;
    --edt-nav-border: #e2e5ea;
    --edt-nav-text: #4b5563;
    --edt-nav-text-active: #2563eb;
    --edt-nav-hover: #f1f3f7;
    --edt-nav-active-bg: #eaf1ff;
    --edt-nav-grupo: #9ca3af;

    /* Espaçamento (base 4px) */
    --edt-space-1: 0.25rem;
    --edt-space-2: 0.5rem;
    --edt-space-3: 0.75rem;
    --edt-space-4: 1rem;
    --edt-space-5: 1.5rem;
    --edt-space-6: 2rem;

    /* Raio */
    --edt-radius-sm: 0.25rem;
    --edt-radius-md: 0.5rem;
    --edt-radius-lg: 0.75rem;

    /* Sombra */
    --edt-shadow-sm: 0 1px 2px rgba(16, 24, 40, 0.06);
    --edt-shadow-md: 0 2px 8px rgba(16, 24, 40, 0.08);
    --edt-shadow-lg: 0 8px 24px rgba(16, 24, 40, 0.12);

    /* Layout */
    --edt-topbar-height: 56px;
    /* Fluida: 200px em telas estreitas, 258px a partir de ~1612px. Em 1366 dá
       ~218px — 40px devolvidos ao conteúdo sem perder os rótulos. */
    --edt-subnav-width: clamp(12.5rem, 16vw, 16.125rem);

    /* Altura útil abaixo da barra superior. Base de toda área rolável do
       sistema — ver --edt-chrome no bloco 8.1 e a regra 3 do contrato.
       dvh porque em 512px de viewport a diferença para vh importa. */
    --edt-vh-util: calc(100dvh - var(--edt-topbar-height));

    /* Quanto a tela gasta ACIMA da área rolável (cabeçalho, filtros, KPIs).
       Cada tela redefine o seu; este é só um padrão razoável. Ver o bloco
       "Contrato vertical" mais abaixo. */
    --edt-chrome: 12rem;
    /* Piso da área rolável. Pequeno de propósito — ver o mesmo bloco. */
    --edt-scroll-min: 8rem;

    /* Tipografia — stack do sistema (Segoe UI no Windows da equipe) */
    --edt-font: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue",
                Arial, sans-serif;
    --edt-font-mono: ui-monospace, SFMono-Regular, Consolas, "Liberation Mono",
                     monospace;
}

/* --------------------------------------------------------------------------
   2. Tokens — tema escuro
   Semente: gradiente azul-marinho já usado em login.css
   -------------------------------------------------------------------------- */
:root[data-theme="dark"] {
    --edt-surface-0: #1a2029;
    --edt-surface-1: #232b39;
    --edt-surface-2: #2c3444;
    --edt-surface-3: #353f52;

    --edt-text: #e6eaf2;
    --edt-text-muted: #9aa5b8;
    --edt-text-inverse: #1a2029;

    --edt-border: #333c4d;
    --edt-border-strong: #465166;

    --edt-brand: #4d84ff;
    --edt-brand-hover: #6b99ff;
    --edt-brand-soft: #1e2f52;
    --edt-brand-contrast: #ffffff;

    --edt-success: #34d399;
    --edt-success-soft: #10352a;
    --edt-warning: #fbbf24;
    --edt-warning-soft: #3a2e10;
    --edt-danger: #f87171;
    --edt-danger-soft: #3d1d1d;
    --edt-info: #38bdf8;
    --edt-info-soft: #10303f;
    --edt-neutral: #94a3b8;
    --edt-neutral-soft: #2c3444;
    --edt-violeta: #a78bfa;
    --edt-amarelo: #facc15;

    --edt-nav-bg: #1d2431;
    --edt-nav-border: #333c4d;
    --edt-nav-text: #b6c0d0;
    --edt-nav-text-active: #6b99ff;
    --edt-nav-hover: #262f3e;
    --edt-nav-active-bg: #1e2f52;
    --edt-nav-grupo: #7c889b;

    --edt-shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.3);
    --edt-shadow-md: 0 2px 8px rgba(0, 0, 0, 0.35);
    --edt-shadow-lg: 0 8px 24px rgba(0, 0, 0, 0.45);
}

/* --------------------------------------------------------------------------
   3. Remapeamento das variáveis do Bootstrap
   Faz componentes não migrados (modal, dropdown, .btn, .table) herdarem a
   paleta sem precisar tocar cada página individualmente.
   -------------------------------------------------------------------------- */
:root {
    --bs-body-bg: var(--edt-surface-0);
    --bs-body-color: var(--edt-text);
    --bs-border-color: var(--edt-border);
    --bs-secondary-color: var(--edt-text-muted);
    --bs-emphasis-color: var(--edt-text);
    --bs-primary: var(--edt-brand);
    --bs-link-color: var(--edt-brand);
    --bs-link-hover-color: var(--edt-brand-hover);
    --bs-font-sans-serif: var(--edt-font);
}

:root[data-theme="dark"] {
    --bs-tertiary-bg: var(--edt-surface-2);
    --bs-secondary-bg: var(--edt-surface-2);
}

:root[data-theme="dark"] .card,
:root[data-theme="dark"] .modal-content,
:root[data-theme="dark"] .dropdown-menu,
:root[data-theme="dark"] .list-group-item,
:root[data-theme="dark"] .accordion-item {
    background-color: var(--edt-surface-1);
    color: var(--edt-text);
    border-color: var(--edt-border);
}

:root[data-theme="dark"] .table {
    --bs-table-bg: transparent;
    --bs-table-color: var(--edt-text);
    --bs-table-border-color: var(--edt-border);
    --bs-table-striped-bg: var(--edt-surface-2);
    --bs-table-striped-color: var(--edt-text);
    --bs-table-hover-bg: var(--edt-surface-2);
    --bs-table-hover-color: var(--edt-text);
}

:root[data-theme="dark"] .form-control,
:root[data-theme="dark"] .form-select {
    background-color: var(--edt-surface-2);
    border-color: var(--edt-border);
    color: var(--edt-text);
}

:root[data-theme="dark"] .form-control::placeholder {
    color: var(--edt-text-muted);
}

/* --------------------------------------------------------------------------
   4. Shell: topo + (lateral contextual) + conteúdo
   -------------------------------------------------------------------------- */
html,
body {
    height: 100%;
}

body {
    font-family: var(--edt-font);
    background-color: var(--edt-surface-0);
    color: var(--edt-text);
}

.base {
    display: flex;
    flex-direction: column;
    height: 100vh;
    width: 100%;
    overflow: hidden;
}

/* Faixa abaixo do topo: lateral + conteúdo */
.edt-shell {
    display: flex;
    flex-direction: row;
    align-items: stretch;
    flex: 1 1 auto;
    min-height: 0;
    width: 100%;
}

.content {
    flex: 1 1 auto;
    min-width: 0;
    height: 100%;
    overflow: auto;
    background-color: var(--edt-surface-0);
    color: var(--edt-text);
}

/* --------------------------------------------------------------------------
   5. Barra superior — seções
   -------------------------------------------------------------------------- */
.edt-topbar {
    flex: 0 0 auto;
    display: flex;
    align-items: center;
    gap: var(--edt-space-4);
    height: var(--edt-topbar-height);
    padding: 0 var(--edt-space-4);
    background-color: var(--edt-nav-bg);
    border-bottom: 1px solid var(--edt-nav-border);
    z-index: 1100;
}

/* Marca = logo (que recolhe a lateral) + nome (que leva para a home).
   São dois alvos separados de propósito: antes o logo fazia parte do link e
   clicar nele navegava. */
.edt-topbar__marca {
    display: flex;
    align-items: center;
    gap: var(--edt-space-2);
    flex: 0 0 auto;
    /* Piso da barra: js/nav_topo.js recolhe seções por medição, mas quando
       TODAS já foram para o "Mais" e ainda não cabe, não há mais o que
       recolher. Sem isto a marca (nowrap, flex 0 0 auto) empurra e a topbar
       transborda — acontece perto de 900px com sufixo de marca e nome de
       usuário longos. */
    min-width: 0;
    overflow: hidden;
}

.edt-topbar__brand {
    display: flex;
    align-items: center;
    gap: var(--edt-space-2);
    flex: 0 0 auto;
    font-size: 1rem;
    font-weight: 700;
    letter-spacing: -0.01em;
    color: var(--edt-text) !important;
    text-decoration: none;
    white-space: nowrap;
}

/* Logo como botão de recolher/expandir a lateral */
.edt-topbar__logo--acao {
    border: 0;
    cursor: pointer;
    padding: 0;
    transition: background-color 0.15s ease, opacity 0.15s ease;
}

/* O botão mostra o que o clique VAI fazer: seta para a esquerda quando a
   lateral está aberta (vai recolher), para a direita quando está fechada (vai
   abrir). Antes era o `bi-diagram-3` da marca, que não dizia nada sobre haver
   um controle ali.

   Os dois ícones vêm no HTML e quem escolhe é o CSS, a partir do `data-subnav`
   que o script inline do <head> escreve antes da primeira pintura. Trocar o
   ícone no JS (que roda no fim do <body>) faria a seta piscar invertida a cada
   navegação — o app é multi-page, é o mesmo motivo do script de tema.

   O padrão é a seta de recolher: sem `data-subnav` (JS desligado) a lateral
   também nasce aberta. */
.edt-topbar__logo--acao [data-subnav-icone="oculta"] { display: none; }

:root[data-subnav="oculta"] .edt-topbar__logo--acao [data-subnav-icone="oculta"] {
    display: block;
}

:root[data-subnav="oculta"] .edt-topbar__logo--acao [data-subnav-icone="expandida"] {
    display: none;
}

.edt-topbar__logo--acao:hover {
    background-color: var(--edt-brand-hover);
}

.edt-topbar__logo--acao:focus-visible {
    outline: none;
    box-shadow: 0 0 0 3px var(--edt-brand-soft);
}

.edt-topbar__logo {
    display: grid;
    place-items: center;
    width: 1.75rem;
    height: 1.75rem;
    border-radius: var(--edt-radius-md);
    background-color: var(--edt-brand);
    color: #fff;
    font-size: 0.95rem;
    flex-shrink: 0;
}

/* Seções sem lateral: o quadrado não é renderizado (não há o que recolher), e
   isto ocupa a caixa dele apenas para reservar o espaço. Sem a reserva, a
   marca e a barra de seções deslizariam ~2,2rem para a esquerda ao navegar de
   uma seção com lateral para uma sem — e de volta na seguinte. */
.edt-topbar__logo--vazio {
    background-color: transparent;
}

.edt-topbar__suffix {
    color: var(--edt-brand);
}

/* Lista de seções */
.edt-topnav {
    display: flex;
    align-items: center;
    /* Seções centradas no vão entre a marca e o menu do usuário. Como os dois
       lados têm larguras diferentes, isto centra no espaço disponível, não no
       meio exato da janela — é o que dá para fazer sem tirar a lista do fluxo
       e quebrar a medição de transbordo de js/nav_topo.js.

       O `safe` NÃO é enfeite: com `center` puro, quando a lista transborda o
       excesso vai para OS DOIS lados e o começo fica inalcançável pela
       rolagem (o scroll só chega até o início da área de conteúdo). O
       transbordo normalmente é absorvido pelo menu "Mais", mas a PRIMEIRA
       pintura acontece antes do primeiro recalcular. `safe center` volta a
       `flex-start` justamente nesse caso. A linha sem `safe` fica como reserva
       para quem não suportar a palavra-chave. */
    justify-content: center;
    justify-content: safe center;
    gap: var(--edt-space-1);
    flex: 1 1 auto;
    min-width: 0;
    margin: 0;
    padding: 0;
    list-style: none;
    overflow-x: auto;
    scrollbar-width: none;
}

.edt-topnav::-webkit-scrollbar {
    display: none;
}

.edt-topnav > li {
    flex: 0 0 auto;
    position: relative;
}

/* Seção recolhida no transbordo. `hidden` sozinho não bastaria se algum dia
   esta regra ganhar um `display`. */
.edt-topnav > li[hidden] {
    display: none;
}

/* Enquanto a seção está NA BARRA o ícone fica escondido — a barra é só texto.
   Quando o item é movido para dentro do menu "Mais" ele deixa de ser filho
   direto de `.edt-topnav`, este seletor para de valer e o ícone reaparece,
   alinhado com os demais itens de menu. A seta do dropdown é exceção. */
.edt-topnav > li > .edt-topnav__link > .bi:not(.bi-chevron-down) {
    display: none;
}

/* Item de seção que foi movido para dentro do transbordo: passa a ter a mesma
   aparência de um `.dropdown-item`, sem precisar de marcação duplicada. */
.edt-topnav .dropdown-menu > li > .edt-topnav__link {
    display: flex;
    align-items: center;
    gap: var(--edt-space-2);
    width: 100%;
    padding: var(--edt-space-2) var(--edt-space-3);
    font-size: 0.8125rem;
    font-weight: 400;
    /* `!important` só para vencer o `!important` de `.edt-topnav__link` (que
       existe por causa dos ~35 CSS legados por tela). Sem isto o item
       transbordado sairia em `--edt-nav-text` e ficaria de tom diferente dos
       `.dropdown-item` vizinhos dentro do mesmo menu. */
    color: var(--edt-text) !important;
    border-radius: var(--edt-radius-sm);
    white-space: normal;
}

.edt-topnav .dropdown-menu > li > .edt-topnav__link:hover {
    background-color: var(--edt-surface-2);
    color: var(--edt-text) !important;
}

.edt-topnav .dropdown-menu > li > .edt-topnav__link.active {
    background-color: var(--edt-nav-active-bg);
    color: var(--edt-nav-text-active) !important;
}

.edt-topnav .dropdown-menu > li > .edt-topnav__link > .bi {
    width: 1rem;
    flex-shrink: 0;
    text-align: center;
}

/* Título de grupo de uma seção com submenu que foi achatada no transbordo */
.edt-topnav .dropdown-menu .dropdown-header {
    padding: var(--edt-space-2) var(--edt-space-3) var(--edt-space-1);
    font-size: 0.6875rem;
    font-weight: 600;
    letter-spacing: 0.06em;
    text-transform: uppercase;
    color: var(--edt-text-muted);
}

.edt-topnav__link {
    display: inline-flex;
    align-items: center;
    gap: var(--edt-space-1);
    padding: 0.4rem var(--edt-space-3);
    font-size: 0.875rem;
    font-weight: 500;
    line-height: 1.4;
    white-space: nowrap;
    border-radius: var(--edt-radius-md);
    color: var(--edt-nav-text) !important;
    text-decoration: none;
    background: transparent;
    border: 0;
    cursor: pointer;
    transition: background-color 0.15s ease, color 0.15s ease;
}

.edt-topnav__link:hover {
    background-color: var(--edt-nav-hover);
    color: var(--edt-text) !important;
}

.edt-topnav__link.active {
    background-color: var(--edt-nav-active-bg);
    color: var(--edt-nav-text-active) !important;
    font-weight: 600;
}

.edt-topnav__link .bi-chevron-down {
    font-size: 0.7rem;
    opacity: 0.7;
}

/* A seta gira quando o menu abre (o Bootstrap mantém aria-expanded no gatilho) */
.edt-topnav__link[aria-expanded="true"] .bi-chevron-down {
    transform: rotate(180deg);
}

/* Por que esta regra existe:
   `.edt-topnav` tem `overflow-x: auto` para a lista de seções poder rolar na
   horizontal quando não cabe. Só que, pela especificação, `overflow-x` diferente
   de `visible` faz o `overflow-y` "visible" virar `auto` — ou seja, a lista
   passa a recortar nos DOIS eixos. Como o `.dropdown-menu` é posicionado em
   absolute dentro de um `<li>` que fica DENTRO desse contêiner de rolagem, ele
   era recortado pela altura da barra (~40px) e não aparecia: clicar na seta não
   fazia nada visível.

   Enquanto o menu está aberto, o recorte é suspenso. A rolagem horizontal fica
   desativada nesse intervalo, o que é irrelevante — o usuário está escolhendo
   um item, não rolando a barra. A classe é posta/tirada por js/nav_topo.js nos
   eventos show/hide do Bootstrap.

   Só no desktop: abaixo de 860px a lista vira painel deslizante com
   `overflow-y: auto` (precisa rolar) e os dropdowns já são estáticos.

   O `not all and (max-width: 859px)` é o COMPLEMENTO exato do breakpoint mobile
   (mesmo valor usado no bloco 7 e em js/nav_topo.js). Com `min-width: 860px`
   sobrava uma faixa morta nas larguras fracionárias (859,5px, comuns com escala
   do Windows em 125/150% ou zoom do navegador): o JS já tratava como desktop,
   mas o recorte do dropdown não era suspenso e o menu abria numa fatia da altura
   da barra. */
@media not all and (max-width: 859px) {
    .edt-topnav.edt-topnav--dropdown-aberto {
        overflow: visible;
    }

    /* O menu do transbordo pode ficar mais alto que a janela: com todas as
       seções achatadas passa fácil de 20 linhas. Como `.base` é
       `height: 100vh; overflow: hidden`, o excedente seria recortado sem rolagem
       em lugar nenhum — os últimos itens ficariam inalcançáveis. Aqui quem rola
       é o próprio menu.

       Só no desktop: no mobile o dropdown é estático e quem rola é o painel
       `.edt-topnav` inteiro. */
    .edt-topnav .dropdown-menu {
        max-height: calc(100vh - var(--edt-topbar-height) - var(--edt-space-4));
        overflow-y: auto;
        overscroll-behavior: contain;
    }
}

/* Dropdowns do topo */
.edt-topnav .dropdown-menu {
    background-color: var(--edt-surface-1);
    border: 1px solid var(--edt-border);
    border-radius: var(--edt-radius-md);
    box-shadow: var(--edt-shadow-lg);
    padding: var(--edt-space-1);
    min-width: 15rem;
}

.edt-topnav .dropdown-item {
    display: flex;
    align-items: center;
    gap: var(--edt-space-2);
    padding: var(--edt-space-2) var(--edt-space-3);
    font-size: 0.8125rem;
    color: var(--edt-text);
    border-radius: var(--edt-radius-sm);
    white-space: normal;
}

.edt-topnav .dropdown-item:hover,
.edt-topnav .dropdown-item:focus {
    background-color: var(--edt-surface-2);
    color: var(--edt-text);
}

.edt-topnav .dropdown-item.active {
    background-color: var(--edt-nav-active-bg);
    color: var(--edt-nav-text-active);
}

.edt-topnav .dropdown-item i {
    width: 1rem;
    flex-shrink: 0;
    text-align: center;
    opacity: 0.75;
}

/* Lado direito: tema + usuário */
.edt-topbar__right {
    display: flex;
    align-items: center;
    gap: var(--edt-space-1);
    flex: 0 0 auto;
    margin-left: auto;
}

.edt-icon-btn {
    display: grid;
    place-items: center;
    width: 2rem;
    height: 2rem;
    border: 0;
    border-radius: var(--edt-radius-md);
    background: transparent;
    color: var(--edt-nav-text);
    font-size: 1rem;
    cursor: pointer;
}

.edt-icon-btn:hover {
    background-color: var(--edt-nav-hover);
    color: var(--edt-text);
}

.edt-user {
    display: flex;
    align-items: center;
    gap: var(--edt-space-2);
    padding: 0.25rem var(--edt-space-2);
    border-radius: var(--edt-radius-md);
    color: var(--edt-text) !important;
    text-decoration: none;
    font-size: 0.875rem;
}

.edt-user:hover {
    background-color: var(--edt-nav-hover);
}

.edt-user__avatar {
    display: grid;
    place-items: center;
    width: 1.75rem;
    height: 1.75rem;
    border-radius: 50%;
    background-color: var(--edt-brand-soft);
    color: var(--edt-brand);
    font-size: 0.75rem;
    font-weight: 700;
    flex-shrink: 0;
}

.edt-topbar__right .dropdown-menu {
    background-color: var(--edt-surface-1);
    border: 1px solid var(--edt-border);
    border-radius: var(--edt-radius-md);
    box-shadow: var(--edt-shadow-lg);
}

.edt-topbar__right .dropdown-item {
    display: flex;
    align-items: center;
    gap: var(--edt-space-2);
    font-size: 0.875rem;
    color: var(--edt-text);
}

.edt-topbar__right .dropdown-item:hover,
.edt-topbar__right .dropdown-item:focus {
    background-color: var(--edt-surface-2);
    color: var(--edt-text);
}

.edt-topbar__right .dropdown-divider {
    border-top-color: var(--edt-border);
}

/* Hamburger (só mobile) */
.edt-topbar__burger {
    display: none;
}

/* --------------------------------------------------------------------------
   6. Lateral contextual — páginas da seção atual
   -------------------------------------------------------------------------- */
/* A lateral tem DOIS estados, ditados por `data-subnav` no <html>:

     expandida  largura fluida com rótulos      (padrão em >= 1200px)
     oculta     largura zero                    (padrão em < 1200px)

   Havia um terceiro, `rail` (só ícones), que saiu junto com o ciclo de quatro
   modos do logo: o botão passou a alternar apenas aberto/fechado.

   O atributo é escrito por um script inline no <head> de base.html, antes da
   primeira pintura — mesmo motivo do script de tema: o app é multi-page e sem
   isso a lateral apareceria inteira e encolheria a cada navegação.

   O estado vem de localStorage['edt-subnav-modo']; sem valor gravado, a
   largura da janela decide. js/nav_topo.js faz a mesma conta no clique. */
:root                      { --edt-subnav-atual: var(--edt-subnav-width); }
html[data-subnav="oculta"] { --edt-subnav-atual: 0px; }

.edt-subnav {
    flex: 0 0 var(--edt-subnav-atual);
    width: var(--edt-subnav-atual);
    height: 100%;
    overflow-y: auto;
    /* Durante a transição de largura o conteúdo é mais largo que a faixa
       por um instante; sem isto pisca uma barra de rolagem horizontal. */
    overflow-x: hidden;
    padding: var(--edt-space-4) var(--edt-space-3);
    background-color: var(--edt-nav-bg);
    border-right: 1px solid var(--edt-nav-border);
    transition: flex-basis 0.18s ease, width 0.18s ease, padding 0.18s ease;
}

/* Oculta: `visibility: hidden` junto com a largura zero tira os links do foco
   do teclado — sem isso dava para tabular por uma lateral invisível. */
html[data-subnav="oculta"] .edt-subnav {
    padding-left: 0;
    padding-right: 0;
    overflow: hidden;
    border-right-width: 0;
    visibility: hidden;
}

@media (prefers-reduced-motion: reduce) {
    .edt-subnav {
        transition: none;
    }
}

.edt-subnav__grupo {
    padding: var(--edt-space-4) var(--edt-space-3) var(--edt-space-1);
    font-size: 0.6875rem;
    font-weight: 600;
    letter-spacing: 0.06em;
    text-transform: uppercase;
    color: var(--edt-nav-grupo);
    user-select: none;
}

.edt-subnav__grupo:first-child {
    padding-top: 0;
}

.edt-subnav__lista {
    list-style: none;
    margin: 0;
    padding: 0;
}

.edt-subnav__link {
    display: flex;
    align-items: center;
    gap: var(--edt-space-3);
    width: 100%;
    padding: 0.5rem var(--edt-space-3);
    margin-bottom: 1px;
    font-size: 0.875rem;
    line-height: 1.4;
    text-align: left;
    color: var(--edt-nav-text) !important;
    text-decoration: none;
    background: transparent;
    border: 0;
    border-radius: var(--edt-radius-md);
    cursor: pointer;
    transition: background-color 0.15s ease, color 0.15s ease;
}

.edt-subnav__link:hover {
    background-color: var(--edt-nav-hover);
    color: var(--edt-text) !important;
}

.edt-subnav__link.active {
    background-color: var(--edt-nav-active-bg);
    color: var(--edt-nav-text-active) !important;
    font-weight: 600;
}

.edt-subnav__link i {
    flex: 0 0 auto;
    width: 1rem;
    font-size: 0.95rem;
    text-align: center;
    opacity: 0.85;
}

/* Quando a lateral controla os painéis, os botões antigos somem.

   São duas regras de propósito, e a primeira é a que importa:
   `html.edt-subnav-js` vem de um script inline no <head> (base.html), então
   vale já na primeira pintura. `body.edt-tem-subnav` só é aplicada quando
   js/secao_paineis.js termina de montar a lateral — e esse script roda no fim
   do <body>, depois de ~20 <script src> bloqueantes dos painéis incluídos.
   Depender apenas dela fazia a lista de botões antiga piscar na tela até a
   lateral aparecer. A segunda fica como rede de segurança para páginas que
   montem a lateral sem declarar `tem_subnav`. */
html.edt-subnav-js .hidden-buttons-container > p,
body.edt-tem-subnav .hidden-buttons-container > p {
    display: none;
}

/* Mesmo par de guardas, e pelo mesmo motivo.

   O `margin-bottom: 2em` de `.card.card-body` (body-containers.css) existe
   para separar painéis EMPILHADOS, do tempo em que todos ficavam abertos um
   embaixo do outro. Com a lateral contextual isso não acontece mais:
   js/secao_paineis.js remove o `show` de TODOS antes de abrir o alvo, então há
   sempre um painel visível e só um. A margem deixou de separar coisa alguma e
   virou uma faixa morta de 32px no fim da página — evidente nas telas que
   ocupam a altura toda (`.edt-card-cheio`), onde o cartão encosta no fim e
   ainda sobra espaço abaixo dele.

   Fica escopada: sem a lateral (JS desligado) os painéis voltam a empilhar e a
   margem continua fazendo sentido. */
html.edt-subnav-js .hidden-buttons-container .card.card-body,
body.edt-tem-subnav .hidden-buttons-container .card.card-body {
    margin-bottom: 0;
}

/* --------------------------------------------------------------------------
   7. Mobile (faixa xs, < 860px)

   O corte era 992px, e isso jogava DESKTOP no layout mobile: um notebook
   1366x768 com a escala de 150% do Windows tem 911x512 de viewport CSS. A
   lateral virava faixa de 40vh sobre 512px de altura e sobravam ~251px de
   conteúdo. Entre 860 e 1200px a lateral segue vertical, apenas fechada
   por padrão (bloco 6) — não vira gaveta.

   860 aparece também no bloco 3.1, em documentos_escalacao.css (2x) e em
   js/nav_topo.js — os quatro precisam mudar juntos.
   -------------------------------------------------------------------------- */
@media (max-width: 859px) {
    .edt-topbar__burger {
        display: grid;
        place-items: center;
        width: 2rem;
        height: 2rem;
        border: 0;
        border-radius: var(--edt-radius-md);
        background: transparent;
        color: var(--edt-text);
        font-size: 1.25rem;
        cursor: pointer;
        flex: 0 0 auto;
    }

    /* Seções viram painel deslizante */
    .edt-topnav {
        position: fixed;
        top: var(--edt-topbar-height);
        left: 0;
        right: 0;
        bottom: 0;
        flex-direction: column;
        align-items: stretch;
        /* A centralização do desktop vale para o eixo principal; aqui ele
           virou o vertical, e sem desfazer os itens ficariam boiando no meio
           da tela em vez de começarem no topo do painel. */
        justify-content: flex-start;
        gap: var(--edt-space-1);
        padding: var(--edt-space-3);
        background-color: var(--edt-nav-bg);
        border-top: 1px solid var(--edt-nav-border);
        overflow-y: auto;
        transform: translateX(-100%);
        transition: transform 0.25s ease;
        z-index: 1200;
    }

    body.edt-menu-aberto .edt-topnav {
        transform: translateX(0);
    }

    .edt-topnav__link {
        width: 100%;
        padding: var(--edt-space-3);
        font-size: 0.9375rem;
    }

    .edt-topnav .dropdown-menu {
        position: static !important;
        transform: none !important;
        width: 100%;
        border: 0;
        box-shadow: none;
        background-color: var(--edt-surface-2);
        margin: var(--edt-space-1) 0;
    }

    /* Lateral vira faixa rolável acima do conteúdo */
    .edt-shell {
        flex-direction: column;
    }

    /* Aqui a faixa é horizontal: a largura volta a 100% e a altura é que fica
       limitada. */
    .edt-subnav {
        flex: 0 0 auto;
        width: 100%;
        height: auto;
        /* 40vh de 512px são 205px — quase metade do que resta depois da
           topbar. O teto em rem para de escalar junto com a tela pequena. */
        max-height: min(40vh, 14rem);
        border-right: 0;
        border-bottom: 1px solid var(--edt-nav-border);
        padding: var(--edt-space-3);
    }

    /* No mobile a lateral é uma faixa acima do conteúdo, então ocultar é
       zerar a ALTURA, não a largura. Precisa estar dentro do media query:
       a regra acima vem depois da versão desktop e a sobrescreveria. */
    html[data-subnav="oculta"] .edt-subnav {
        max-height: 0;
        padding-top: 0;
        padding-bottom: 0;
        border-bottom-width: 0;
    }

    .edt-user__nome {
        display: none;
    }
}

/* --------------------------------------------------------------------------
   8. Componentes compartilhados (usados pelas macros Jinja)
   -------------------------------------------------------------------------- */

/* Cabeçalho de página: breadcrumb + título + ações */
.edt-page-header {
    display: flex;
    flex-wrap: wrap;
    align-items: flex-start;
    justify-content: space-between;
    gap: var(--edt-space-4);
    padding: var(--edt-space-5) var(--edt-space-6) var(--edt-space-4);
}

.edt-page-header__titles {
    min-width: 0;
}

.edt-breadcrumb {
    display: flex;
    align-items: center;
    flex-wrap: wrap;
    gap: var(--edt-space-2);
    margin-bottom: var(--edt-space-2);
    font-size: 0.8125rem;
    color: var(--edt-text-muted);
}

.edt-breadcrumb a {
    color: var(--edt-text-muted);
    text-decoration: none;
}

.edt-breadcrumb a:hover {
    color: var(--edt-brand);
    text-decoration: underline;
}

.edt-breadcrumb__sep {
    opacity: 0.5;
}

.edt-page-title {
    margin: 0;
    font-size: 1.5rem;
    font-weight: 700;
    letter-spacing: -0.02em;
    color: var(--edt-text);
}

.edt-page-subtitle {
    margin: var(--edt-space-1) 0 0;
    font-size: 0.875rem;
    color: var(--edt-text-muted);
}

.edt-page-header__actions {
    display: flex;
    align-items: center;
    gap: var(--edt-space-2);
    flex-shrink: 0;
}

/* Card / painel */
.edt-card {
    background-color: var(--edt-surface-1);
    border: 1px solid var(--edt-border);
    border-radius: var(--edt-radius-lg);
    box-shadow: var(--edt-shadow-sm);
    overflow: hidden;
}

.edt-card + .edt-card {
    margin-top: var(--edt-space-4);
}

.edt-card__header {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: var(--edt-space-3);
    padding: var(--edt-space-4) var(--edt-space-5);
    border-bottom: 1px solid var(--edt-border);
}

.edt-card__title {
    margin: 0;
    font-size: 0.9375rem;
    font-weight: 600;
    color: var(--edt-text);
}

.edt-card__body {
    padding: var(--edt-space-5);
}

/* Área de conteúdo com respiro padrão */
.edt-page-body {
    padding: 0 var(--edt-space-6) var(--edt-space-6);
}

/* Badges de status do domínio */
.edt-badge {
    display: inline-flex;
    align-items: center;
    gap: var(--edt-space-1);
    padding: 0.15rem var(--edt-space-2);
    border-radius: 999px;
    font-size: 0.75rem;
    font-weight: 600;
    line-height: 1.5;
    white-space: nowrap;
    background-color: var(--edt-neutral-soft);
    color: var(--edt-neutral);
}

.edt-badge--success { background-color: var(--edt-success-soft); color: var(--edt-success); }
.edt-badge--warning { background-color: var(--edt-warning-soft); color: var(--edt-warning); }
.edt-badge--danger  { background-color: var(--edt-danger-soft);  color: var(--edt-danger); }
.edt-badge--info    { background-color: var(--edt-info-soft);    color: var(--edt-info); }
.edt-badge--brand   { background-color: var(--edt-brand-soft);   color: var(--edt-brand); }
.edt-badge--neutral { background-color: var(--edt-neutral-soft); color: var(--edt-neutral); }

/* Botões */
.edt-btn {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    gap: var(--edt-space-2);
    padding: 0.5rem var(--edt-space-4);
    font-size: 0.875rem;
    font-weight: 500;
    line-height: 1.4;
    border-radius: var(--edt-radius-md);
    border: 1px solid transparent;
    cursor: pointer;
    text-decoration: none;
    transition: background-color 0.15s ease, border-color 0.15s ease,
                color 0.15s ease;
}

.edt-btn:disabled,
.edt-btn.disabled {
    opacity: 0.55;
    cursor: not-allowed;
}

/* `[hidden] { display: none }` vem da folha do NAVEGADOR, e qualquer `display`
   declarado numa folha de autor a vence — independente de especificidade. Como
   `.edt-btn` declara `display: inline-flex`, um `<button class="edt-btn" hidden>`
   continuava aparecendo, e `el.hidden = true` no JS não escondia nada.
   Mesma armadilha já documentada em static/recurso_nao_definido.css. */
.edt-btn[hidden] { display: none; }

.edt-btn--primary {
    background-color: var(--edt-brand);
    color: var(--edt-brand-contrast);
}

.edt-btn--primary:hover:not(:disabled) {
    background-color: var(--edt-brand-hover);
    color: var(--edt-brand-contrast);
}

.edt-btn--secondary {
    background-color: var(--edt-surface-1);
    border-color: var(--edt-border-strong);
    color: var(--edt-text);
}

.edt-btn--secondary:hover:not(:disabled) {
    background-color: var(--edt-surface-2);
    color: var(--edt-text);
}

.edt-btn--ghost {
    background-color: transparent;
    color: var(--edt-text-muted);
}

.edt-btn--ghost:hover:not(:disabled) {
    background-color: var(--edt-surface-2);
    color: var(--edt-text);
}

.edt-btn--danger {
    background-color: var(--edt-danger);
    color: #ffffff;
}

.edt-btn--danger:hover:not(:disabled) {
    filter: brightness(0.93);
    color: #ffffff;
}

/* Tabela.

   ATENÇÃO — `.edt-table-wrap` SOZINHO não resolve tabela larga. Ele só dá o
   `overflow-x`; se a `<table>` for `width: 100%` ela encolhe para caber e nunca
   aciona a rolagem. O par é indivisível (regra 1 do contrato):

       <div class="edt-table-wrap edt-table-wrap--rolagem">
         <table class="edt-table edt-table--compacta" style="min-width: 62rem">

   A largura pode vir de `min-width` em rem na tabela ou de `nowrap` nas
   células — mas alguém precisa gerá-la. */
.edt-table-wrap {
    width: 100%;
    overflow-x: auto;
}

/* --------------------------------------------------------------------------
   Contrato vertical

   O sistema tinha >20 restrições de altura fixas (`60vh` em 7 arquivos,
   `height: 650px`, `calc(100vh - 400px)`) contra 2 media queries de altura no
   repositório inteiro. `60vh` de um 1280x720 a 125% (576px de viewport) são
   345px, contra 648px num 1080p: a mesma regra entrega o dobro conforme o
   monitor, e `calc(100vh - 400px)` chega a deixar 112px de tabela.

   A altura de uma área rolável passa a ser DERIVADA: o que sobra da tela
   depois do cabeçalho da tela. Cada tela declara só o próprio `--edt-chrome`
   (quanto ela gasta acima da área rolável) e nunca escreve a conta.

       .terceirizacoes-container { --edt-chrome: 21rem; }
       <div class="edt-table-wrap edt-table-wrap--rolagem">

   O piso é 8rem (128px) e não algo confortável de propósito: num viewport de
   512px sobram ~250px de conteúdo, e um piso grande faria o filho ficar MAIOR
   que o pai. O resultado não seria mais conteúdo visível, seria uma segunda
   barra de rolagem dentro de um `.content` que já rola.
   -------------------------------------------------------------------------- */
.edt-scroll-y,
.edt-table-wrap--rolagem {
    overflow: auto;
    max-height: max(
        var(--edt-scroll-min),
        calc(var(--edt-vh-util) - var(--edt-chrome))
    );
}

/* Variante para quando a tabela É a tela: só barra de título acima dela. */
.edt-table-wrap--cheia {
    --edt-chrome: 8rem;
    overflow: auto;
    max-height: max(
        var(--edt-scroll-min),
        calc(var(--edt-vh-util) - var(--edt-chrome))
    );
}

/* --------------------------------------------------------------------------
   Cartão que ocupa a altura restante da tela

   `.edt-table-wrap--rolagem` resolve o caso "a lista é MAIOR que a tela".
   Este resolve o oposto, que é igualmente comum e ficava sem resposta: a lista
   é MENOR, o cartão termina na última linha e sobra uma faixa morta até o fim
   da página — com o rodapé do cartão boiando no meio da tela.

   A altura é a MESMA conta derivada de `--edt-vh-util` e do `--edt-chrome` que
   a tela declara, então a tela continua sem escrever a conta (regra 3 do
   contrato). Como é `height` e não `min-height`, também serve de teto: com
   muitas linhas quem rola é a área interna, não a página.

       .minha-tela { --edt-chrome: 26rem; }
       <div class="meu-card edt-card-cheio">
         <div class="edt-table-wrap edt-cresce"> <table> … </table> </div>
         <div class="meu-rodape">…</div>       <- fica colado embaixo
       </div>
   -------------------------------------------------------------------------- */
.edt-card-cheio {
    display: flex;
    flex-direction: column;
    height: max(
        var(--edt-scroll-min),
        calc(var(--edt-vh-util) - var(--edt-chrome))
    );
}

/* Filho que absorve a sobra de altura do pai flex. O `min-height: 0` é
   obrigatório e não decorativo: o padrão `min-height: auto` de item flex
   impede o filho de encolher abaixo do próprio conteúdo, e aí a rolagem
   interna nunca acontece — a área simplesmente estoura o pai. */
.edt-cresce {
    flex: 1 1 auto;
    min-height: 0;
}

/* Gráfico Chart.js: altura derivada, nunca fixa. Exige
   `maintainAspectRatio: false` no config — sem isso o Chart.js impõe a própria
   proporção e o gráfico cresce junto com a largura (num ultrawide, 1270px de
   altura). Substitui os `height: 650px` / `height: 440px` espalhados. */
.edt-chart-wrap {
    position: relative;
    width: 100%;
    height: clamp(14rem, calc(var(--edt-vh-util) - 22rem), 34rem);
}

/* --------------------------------------------------------------------------
   Modal que cabe na tela

   Promovido do modal de checklist da pré-escalação, que era o único do sistema
   com tratamento de altura. O corpo é quem rola; cabeçalho e rodapé ficam.
   Aplicar em cima do modal do Bootstrap:  <div class="modal fade edt-modal">
   -------------------------------------------------------------------------- */
.edt-modal .modal-dialog {
    max-width: min(60rem, calc(100vw - 2rem));
    max-height: min(90dvh, 90vh);
    display: flex;
    flex-direction: column;
    min-height: 0;
}

.edt-modal .modal-content {
    max-height: min(90dvh, 90vh);
    display: flex;
    flex-direction: column;
    min-height: 0;
    overflow: hidden;
}

.edt-modal .modal-header,
.edt-modal .modal-footer {
    flex-shrink: 0;
}

.edt-modal .modal-body {
    flex: 1 1 auto;
    min-height: 0;
    overflow-y: auto;
}

.edt-table {
    width: 100%;
    border-collapse: collapse;
    font-size: 0.875rem;
}

.edt-table thead th {
    padding: var(--edt-space-3) var(--edt-space-4);
    text-align: left;
    font-size: 0.6875rem;
    font-weight: 600;
    letter-spacing: 0.06em;
    text-transform: uppercase;
    color: var(--edt-text-muted);
    border-bottom: 1px solid var(--edt-border);
    white-space: nowrap;
}

.edt-table tbody td {
    padding: var(--edt-space-3) var(--edt-space-4);
    border-bottom: 1px solid var(--edt-border);
    color: var(--edt-text);
    vertical-align: middle;
    /* Alinhamento explícito de propósito. `levantamento_de_campo.css` tem a
       regra `.levantamentos_list tbody, td, tfoot, th, thead, tr { text-align:
       center }` — só o primeiro seletor da lista é escopado, os demais são
       seletores de elemento GLOBAIS. Como todos os CSS carregam em toda página,
       aquele `td` centraliza a célula de qualquer tabela do sistema. O cabeçalho
       escapa porque `.edt-table thead th` tem especificidade maior; o corpo não
       tinha concorrente e ficava centralizado enquanto o cabeçalho ficava à
       esquerda. Quem precisar de outro alinhamento usa .edt-num (à direita) ou
       uma regra com pelo menos duas classes. */
    text-align: left;
}

.edt-table tbody tr:last-child td {
    border-bottom: 0;
}

.edt-table tbody tr:hover {
    background-color: var(--edt-surface-2);
}

/* Variante compacta: tabelas largas, com muitas colunas */
.edt-table--compacta thead th {
    padding: var(--edt-space-2) var(--edt-space-3);
    position: sticky;
    top: 0;
    z-index: 2;
    background-color: var(--edt-surface-1);
    cursor: pointer;
    user-select: none;
}

.edt-table--compacta thead th:hover {
    color: var(--edt-text);
}

.edt-table--compacta tbody td {
    padding: var(--edt-space-2) var(--edt-space-3);
    font-size: 0.8125rem;
    white-space: nowrap;
}

/* Colunas congeladas na rolagem horizontal.
   `.edt-table--col-fixa` congela as duas primeiras colunas (gutter "#" e o
   identificador). Larguras são fixas porque o deslocamento `left` da segunda
   coluna precisa ser conhecido — sem isso as colunas se sobrepõem ao rolar.

   Camadas (sticky exige empilhamento explícito):
     corpo normal ......... auto
     coluna fixa (corpo) .. 1
     cabeçalho ............ 2
     canto (fixa+cabeç.) .. 4  */
.edt-table--col-fixa th:nth-child(1),
.edt-table--col-fixa td:nth-child(1) {
    position: sticky;
    left: 0;
    width: 3.25rem;
    min-width: 3.25rem;
    max-width: 3.25rem;
}

.edt-table--col-fixa th:nth-child(2),
.edt-table--col-fixa td:nth-child(2) {
    position: sticky;
    left: 3.25rem;
    width: 12rem;
    min-width: 12rem;
    max-width: 12rem;
    font-weight: 600;
    /* Largura é fixa, então identificadores longos truncam com reticências
       em vez de empurrar a coluna e desalinhar o deslocamento sticky. */
    overflow: hidden;
    text-overflow: ellipsis;
}

/* Células fixas precisam de fundo opaco, senão o conteúdo rolante aparece
   por baixo delas. */
.edt-table--col-fixa tbody td:nth-child(1),
.edt-table--col-fixa tbody td:nth-child(2) {
    z-index: 1;
    background-color: var(--edt-surface-1);
}

.edt-table--col-fixa thead th:nth-child(1),
.edt-table--col-fixa thead th:nth-child(2) {
    z-index: 4;
    background-color: var(--edt-surface-1);
}

/* O hover da linha não atravessa a célula fixa (ela tem fundo próprio),
   então precisa ser repintado. */
.edt-table--col-fixa tbody tr:hover td:nth-child(1),
.edt-table--col-fixa tbody tr:hover td:nth-child(2) {
    background-color: var(--edt-surface-2);
}

/* Borda separando o bloco congelado do conteúdo que rola */
.edt-table--col-fixa th:nth-child(2),
.edt-table--col-fixa td:nth-child(2) {
    border-right: 1px solid var(--edt-border);
}

/* Variante de UMA coluna congelada.

   `.edt-table--col-fixa` pressupõe a forma "gutter # + identificador", que é o
   que as tabelas de Mix, Cadastro de Colaborador e Alocação já têm. Muitas
   outras começam direto no identificador (Terceirizações, Preços Fixos) e não
   têm a coluna de numeração — nelas congelar duas colunas prenderia um dado
   qualquer.

   A largura fica no seletor porque o deslocamento sticky da segunda coluna
   depende dela; aqui, com uma coluna só, não há deslocamento a calcular e a
   largura pode ficar a cargo da tela (`--edt-col-fixa-w`). */
.edt-table--col-fixa-1 {
    --edt-col-fixa-w: 14rem;
}

.edt-table--col-fixa-1 th:nth-child(1),
.edt-table--col-fixa-1 td:nth-child(1) {
    position: sticky;
    left: 0;
    width: var(--edt-col-fixa-w);
    min-width: var(--edt-col-fixa-w);
    max-width: var(--edt-col-fixa-w);
    font-weight: 600;
    /* Trunca em vez de empurrar: identificador longo não pode alargar a coluna
       congelada e comer a área que rola. */
    overflow: hidden;
    text-overflow: ellipsis;
    border-right: 1px solid var(--edt-border);
}

/* Mesmas camadas de .edt-table--col-fixa: corpo auto, célula fixa 1,
   cabeçalho 2, canto 4. */
.edt-table--col-fixa-1 tbody td:nth-child(1) {
    z-index: 1;
    background-color: var(--edt-surface-1);
}

.edt-table--col-fixa-1 thead th:nth-child(1) {
    z-index: 4;
    background-color: var(--edt-surface-1);
}

.edt-table--col-fixa-1 tbody tr:hover td:nth-child(1) {
    background-color: var(--edt-surface-2);
}

/* Paginação */
.edt-pag-btn {
    min-width: 2rem;
    padding: 0.3rem var(--edt-space-2);
    font-size: 0.8125rem;
    font-variant-numeric: tabular-nums;
}

.edt-pag-btn:disabled {
    opacity: 0.4;
    cursor: not-allowed;
}

.edt-pag-sep {
    padding: 0 var(--edt-space-1);
    color: var(--edt-text-muted);
    font-size: 0.8125rem;
}

/* --------------------------------------------------------------------------
   Harmonização das tabelas Bootstrap com o padrão .edt-table
   --------------------------------------------------------------------------
   ~28 templates usam `.table` do Bootstrap com combinações variadas
   (table-striped, table-hover, table-sm, table-dark...). Em vez de reescrever
   a marcação de 45 arquivos, o visual é unificado aqui.

   DELIBERADAMENTE não mexe em `padding` nem em `font-size`: várias telas são
   densas por necessidade (acompanhamento semanal/mensal, cron, mentoria,
   porcentagem diária) e definem seu próprio espaçamento. Mexer nisso
   quebraria layouts que não tenho como verificar. Aqui só se harmoniza cor,
   borda e o tratamento do cabeçalho.
   -------------------------------------------------------------------------- */
.table {
    --bs-table-bg: transparent;
    --bs-table-color: var(--edt-text);
    --bs-table-border-color: var(--edt-border);
    --bs-table-striped-bg: var(--edt-surface-2);
    --bs-table-striped-color: var(--edt-text);
    --bs-table-hover-bg: var(--edt-surface-2);
    --bs-table-hover-color: var(--edt-text);
    --bs-table-active-bg: var(--edt-surface-3);
    --bs-table-active-color: var(--edt-text);
    border-color: var(--edt-border);
}

/* Cabeçalho no mesmo tratamento da .edt-table: rótulo curto, caixa alta,
   discreto, separado por uma única linha.

   Envolto em :where() de propósito — isso zera a especificidade do seletor.
   Sem ele, `.table > thead > tr > th` (0,1,3) venceria regras próprias como
   `.as-table thead th` (0,1,2), e telas densas que definem seu próprio
   cabeçalho (acompanhamento semanal/mensal, cron, check demandas, mentoria)
   teriam o cabeçalho alterado sem que eu possa verificar. Com :where(), quem
   tem estilo próprio continua mandando; quem não tem herda o padrão. */
:where(.table) > thead > tr > th {
    font-size: 0.6875rem;
    font-weight: 600;
    letter-spacing: 0.06em;
    text-transform: uppercase;
    color: var(--edt-text-muted);
    background-color: transparent;
    border-bottom: 1px solid var(--edt-border);
    vertical-align: middle;
}

/* Sem linhas verticais; só a divisória horizontal entre registros. */
:where(.table) > tbody > tr > td {
    border-left: 0;
    border-right: 0;
    color: var(--edt-text);
}

/* `table-dark` fixa um tema escuro no elemento e brigava com o modo claro
   (usado em analises/atrasados e analises/cron_execucoes). Neutralizado para
   seguir os tokens; as duas telas passam a acompanhar o tema. */
.table-dark {
    --bs-table-bg: transparent;
    --bs-table-color: var(--edt-text);
    --bs-table-border-color: var(--edt-border);
    --bs-table-striped-bg: var(--edt-surface-2);
    --bs-table-striped-color: var(--edt-text);
    --bs-table-hover-bg: var(--edt-surface-2);
    --bs-table-hover-color: var(--edt-text);
    color: var(--edt-text);
}

.table-dark > thead > tr > th {
    color: var(--edt-text-muted);
}

/* Bordas completas continuam válidas onde foram pedidas de propósito
   (ex.: calendário de colaboradores). */
.table-bordered > :not(caption) > * > * {
    border-color: var(--edt-border);
}

/* Skeleton loading */
.edt-skeleton {
    display: block;
    height: 0.75rem;
    border-radius: 999px;
    background: linear-gradient(
        90deg,
        var(--edt-surface-2) 25%,
        var(--edt-surface-3) 37%,
        var(--edt-surface-2) 63%
    );
    background-size: 400% 100%;
    animation: edt-shimmer 1.4s ease infinite;
}

@keyframes edt-shimmer {
    0%   { background-position: 100% 50%; }
    100% { background-position: 0 50%; }
}

@media (prefers-reduced-motion: reduce) {
    .edt-skeleton { animation: none; }
}

/* Estado vazio */
.edt-empty {
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    gap: var(--edt-space-2);
    padding: var(--edt-space-6) var(--edt-space-4);
    text-align: center;
    color: var(--edt-text-muted);
}

.edt-empty__icon {
    font-size: 1.75rem;
    opacity: 0.45;
}

.edt-empty__msg {
    font-size: 0.875rem;
    margin: 0;
}

/* Campo de formulário */
.edt-field {
    display: flex;
    flex-direction: column;
    gap: var(--edt-space-2);
    min-width: 0;
}

.edt-field__label {
    font-size: 0.8125rem;
    font-weight: 500;
    color: var(--edt-text);
}

.edt-field__hint {
    font-size: 0.75rem;
    color: var(--edt-text-muted);
}

.edt-field__control,
.edt-field select,
.edt-field input[type="text"],
.edt-field input[type="date"],
.edt-field input[type="number"] {
    width: 100%;
    padding: 0.5rem var(--edt-space-3);
    font-size: 0.875rem;
    color: var(--edt-text);
    background-color: var(--edt-surface-1);
    border: 1px solid var(--edt-border-strong);
    border-radius: var(--edt-radius-md);
}

.edt-field__control:focus,
.edt-field select:focus,
.edt-field input:focus {
    outline: none;
    border-color: var(--edt-brand);
    box-shadow: 0 0 0 3px var(--edt-brand-soft);
}

/* Desabilitado precisa de regra própria: as declarações acima fixam cor e fundo
   incondicionalmente e, por serem de autor, vencem o cinza que o navegador daria
   sozinho. Sem isto um <select disabled> fica idêntico a um habilitado — foi o
   que aconteceu ao trocar .form-select do Bootstrap por .edt-field. */
.edt-field__control:disabled,
.edt-field select:disabled,
.edt-field input:disabled {
    background-color: var(--edt-surface-2);
    color: var(--edt-text-muted);
    border-color: var(--edt-border);
    cursor: not-allowed;
}

/* Estado inválido (validação de formulário). O JS marca aria-invalid no input e
   .edt-field--invalid no .edt-field; a mensagem entra como .edt-field__error logo
   após o input (js/cpf_telefone.js). A regra de :focus é explícita porque o :focus
   acima e o .form-control:focus do Bootstrap devolveriam a borda da marca. */
.edt-field--invalid .edt-field__control,
.edt-field--invalid input,
.edt-field__control[aria-invalid="true"],
.edt-field input[aria-invalid="true"] {
    border-color: var(--edt-danger);
}

.edt-field--invalid .edt-field__control:focus,
.edt-field--invalid input:focus,
.edt-field__control[aria-invalid="true"]:focus,
.edt-field input[aria-invalid="true"]:focus {
    border-color: var(--edt-danger);
    box-shadow: 0 0 0 3px var(--edt-danger-soft);
}

.edt-field__error {
    font-size: 0.75rem;
    color: var(--edt-danger);
}

/* Grade de filtros */
.edt-filters {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
    gap: var(--edt-space-4);
}

/* Esconde o ícone/rótulo que não corresponde ao tema atual */
:root .edt-theme-toggle__dark { display: none; }
:root[data-theme="dark"] .edt-theme-toggle__dark { display: inline; }
:root[data-theme="dark"] .edt-theme-toggle__light { display: none; }

/* --------------------------------------------------------------------------
   9. Painel padrão — moldura comum dos arquétipos de página
   Cabeçalho (título + subtítulo + ações) / corpo / rodapé (info + ações)
   -------------------------------------------------------------------------- */
.edt-panel {
    background-color: var(--edt-surface-1);
    border: 1px solid var(--edt-border);
    border-radius: var(--edt-radius-lg);
    box-shadow: var(--edt-shadow-sm);
    display: flex;
    flex-direction: column;
    /* NÃO usar overflow:hidden aqui. O painel hospeda dropdowns (filtros
       multisseleção) posicionados em absolute que precisam transbordar; um
       overflow:hidden no ancestral os recorta, e z-index não corrige recorte.
       O arredondamento dos cantos é feito nos filhos das pontas. */
    overflow: visible;
}

/* Cantos arredondados sem recortar o painel inteiro */
.edt-panel > :first-child {
    border-top-left-radius: var(--edt-radius-lg);
    border-top-right-radius: var(--edt-radius-lg);
}

.edt-panel > :last-child {
    border-bottom-left-radius: var(--edt-radius-lg);
    border-bottom-right-radius: var(--edt-radius-lg);
}

.edt-panel__header {
    display: flex;
    flex-wrap: wrap;
    align-items: flex-start;
    justify-content: space-between;
    gap: var(--edt-space-4);
    padding: var(--edt-space-5) var(--edt-space-5) var(--edt-space-4);
}

.edt-panel__titles {
    min-width: 0;
}

.edt-panel__title {
    display: flex;
    align-items: center;
    gap: var(--edt-space-2);
    margin: 0;
    font-size: 1.125rem;
    font-weight: 700;
    letter-spacing: -0.01em;
    color: var(--edt-text);
}

.edt-panel__subtitle {
    margin: var(--edt-space-1) 0 0;
    font-size: 0.875rem;
    color: var(--edt-text-muted);
}

.edt-panel__count {
    display: inline-flex;
    align-items: center;
    padding: 0.1rem var(--edt-space-2);
    border-radius: 999px;
    background-color: var(--edt-surface-2);
    color: var(--edt-text-muted);
    font-size: 0.75rem;
    font-weight: 600;
}

.edt-panel__actions {
    display: flex;
    align-items: center;
    gap: var(--edt-space-2);
    flex-shrink: 0;
    flex-wrap: wrap;
}

.edt-panel__body {
    padding: 0 var(--edt-space-5) var(--edt-space-5);
    flex: 1 1 auto;
    min-height: 0;
}

.edt-panel__body--flush {
    padding: 0;
}

.edt-panel__footer {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    justify-content: space-between;
    gap: var(--edt-space-3);
    padding: var(--edt-space-4) var(--edt-space-5);
    border-top: 1px solid var(--edt-border);
    background-color: var(--edt-surface-1);
    /* O rodapé pinta fundo próprio; sem isto seus cantos ficam quadrados
       sobre o canto arredondado do painel. */
    border-bottom-left-radius: var(--edt-radius-lg);
    border-bottom-right-radius: var(--edt-radius-lg);
}

/* Corpo que hospeda dropdowns precisa ficar acima do conteúdo seguinte
   (tabela com cabeçalho sticky) e nunca recortar.
   `flex: 0 0 auto` é essencial: .edt-panel__body cresce por padrão, e num
   painel com dois corpos (filtros + tabela) os dois dividiriam o espaço
   livre — a barra de filtros ficaria com um vão enorme embaixo. Uma barra de
   filtros tem altura natural; quem cresce é o conteúdo. */
.edt-panel__body--dropdowns {
    position: relative;
    z-index: 30;
    overflow: visible;
    flex: 0 0 auto;
}

.edt-panel__footer-info {
    font-size: 0.875rem;
    color: var(--edt-text-muted);
}

.edt-panel__footer-info strong {
    color: var(--edt-text);
    font-weight: 700;
}

/* Campo de busca compacto (cabeçalho de painel) */
.edt-search {
    display: flex;
    align-items: center;
    gap: var(--edt-space-2);
    padding: 0.4rem var(--edt-space-3);
    min-width: 220px;
    background-color: var(--edt-surface-1);
    border: 1px solid var(--edt-border-strong);
    border-radius: var(--edt-radius-md);
}

.edt-search:focus-within {
    border-color: var(--edt-brand);
    box-shadow: 0 0 0 3px var(--edt-brand-soft);
}

.edt-search i {
    color: var(--edt-text-muted);
    font-size: 0.9rem;
    flex-shrink: 0;
}

.edt-search input {
    flex: 1;
    min-width: 0;
    border: 0;
    outline: none;
    background: transparent;
    color: var(--edt-text);
    font-size: 0.875rem;
}

.edt-search input::placeholder {
    color: var(--edt-text-muted);
}

/* --------------------------------------------------------------------------
   10. Lista de seleção — itens com checkbox, barra de progresso e contagem
   -------------------------------------------------------------------------- */
.edt-select-list {
    display: grid;
    grid-template-columns: repeat(2, minmax(0, 1fr));
    gap: 0 var(--edt-space-6);
    align-content: start;
}

@media (max-width: 900px) {
    .edt-select-list {
        grid-template-columns: 1fr;
    }
}

.edt-select-row {
    display: flex;
    align-items: center;
    gap: var(--edt-space-3);
    padding: var(--edt-space-3) var(--edt-space-2);
    border-bottom: 1px solid var(--edt-border);
    cursor: pointer;
    min-width: 0;
}

.edt-select-row:hover {
    background-color: var(--edt-surface-2);
}

.edt-select-row.is-hidden {
    display: none;
}

.edt-select-row input[type="checkbox"] {
    flex: 0 0 auto;
    width: 1.05rem;
    height: 1.05rem;
    accent-color: var(--edt-brand);
    cursor: pointer;
    margin: 0;
}

.edt-select-row__label {
    flex: 0 0 auto;
    min-width: 2.5rem;
    font-size: 0.875rem;
    font-weight: 600;
    color: var(--edt-text);
}

.edt-select-row__bar {
    flex: 1 1 auto;
    min-width: 60px;
    height: 6px;
    border-radius: 999px;
    background-color: var(--edt-surface-3);
    overflow: hidden;
}

.edt-select-row__fill {
    display: block;
    height: 100%;
    border-radius: 999px;
    background-color: var(--edt-brand);
    transition: width 0.2s ease;
}

/* Disciplina totalmente escalada */
.edt-select-row__fill--completo {
    background-color: var(--edt-success);
}

.edt-select-row__count {
    flex: 0 0 auto;
    font-size: 0.8125rem;
    font-variant-numeric: tabular-nums;
    color: var(--edt-text);
    white-space: nowrap;
}

.edt-select-row__count span {
    color: var(--edt-text-muted);
}

/* Mensagem quando a busca não casa com nada */
.edt-select-empty {
    grid-column: 1 / -1;
    padding: var(--edt-space-5);
    text-align: center;
    font-size: 0.875rem;
    color: var(--edt-text-muted);
}

/* Quando o estado vazio é uma célula de tabela, precisa de duas classes para
   vencer o `text-align: left` de `.edt-table tbody td`. */
.edt-table tbody td.edt-select-empty {
    text-align: center;
}

/* --------------------------------------------------------------------------
   11. Pill de status com ponto (tabelas)
   -------------------------------------------------------------------------- */
.edt-pill {
    display: inline-flex;
    align-items: center;
    gap: var(--edt-space-2);
    padding: 0.2rem var(--edt-space-3);
    border-radius: 999px;
    font-size: 0.75rem;
    font-weight: 600;
    line-height: 1.5;
    white-space: nowrap;
    background-color: var(--edt-neutral-soft);
    color: var(--edt-neutral);
}

.edt-pill::before {
    content: "";
    width: 0.4rem;
    height: 0.4rem;
    border-radius: 50%;
    background-color: currentColor;
    flex-shrink: 0;
}

/* Ícone de recarregar girando — usado pelos painéis que recarregam listas
   (Atualizações, Publicações). Fica aqui por ser compartilhado. */
@keyframes reload-spin {
    from { transform: rotate(0deg); }
    to   { transform: rotate(360deg); }
}

/* Checkbox com rótulo, em linha (rodapé de painel) */
.edt-check-inline {
    display: inline-flex;
    align-items: center;
    gap: var(--edt-space-2);
    margin: 0;
    font-size: 0.875rem;
    color: var(--edt-text);
    cursor: pointer;
}

.edt-check-inline input[type="checkbox"] {
    width: 1.05rem;
    height: 1.05rem;
    accent-color: var(--edt-brand);
    cursor: pointer;
    margin: 0;
}

.edt-pill--success { background-color: var(--edt-success-soft); color: var(--edt-success); }
.edt-pill--warning { background-color: var(--edt-warning-soft); color: var(--edt-warning); }
.edt-pill--danger  { background-color: var(--edt-danger-soft);  color: var(--edt-danger); }
.edt-pill--info    { background-color: var(--edt-info-soft);    color: var(--edt-info); }
/* `info` é ciano; `brand` é o azul da marca. Status "EM PRODUÇÃO" usa brand,
   igual ao que a macro status_badge já faz para o badge. */
.edt-pill--brand   { background-color: var(--edt-brand-soft);   color: var(--edt-brand); }
.edt-pill--neutral { background-color: var(--edt-neutral-soft); color: var(--edt-neutral); }

/* --------------------------------------------------------------------------
   12. Edição em lista — switch, barra de filtros e alterações pendentes
   --------------------------------------------------------------------------
   Primitivas das telas que carregam uma lista, deixam o usuário mexer linha a
   linha e só gravam no fim (Congelar Documentos é a primeira a usar).
   Tudo aqui é genérico de propósito: nenhum nome cita a tela.
   -------------------------------------------------------------------------- */

/* Dois tokens que faltavam, definidos nos dois temas como os da seção 1:
     --edt-shadow-up ...... sombra projetada para CIMA (as três sombras
                            existentes apontam para baixo; uma barra colada no
                            rodapé precisa do inverso para descolar do
                            conteúdo que passa por baixo dela).
     --edt-color-scheme ... diz ao navegador em que variante desenhar os
                            controles nativos (ícone de calendário do
                            input[type=date], barras de rolagem internas).
                            Sem isto o seletor de data fica preto no escuro. */
:root {
    --edt-shadow-up: 0 -2px 8px rgba(16, 24, 40, 0.10);
    --edt-color-scheme: light;
}

:root[data-theme="dark"] {
    --edt-shadow-up: 0 -2px 8px rgba(0, 0, 0, 0.40);
    --edt-color-scheme: dark;
}

/* --- Switch (liga/desliga) -------------------------------------------------
   Construído sobre um <input type="checkbox"> real: continua focável pelo
   teclado, alternável com espaço e anunciado pelo leitor de tela; o desenho
   fica nos dois <span> irmãos.

     <label class="edt-switch">
       <input type="checkbox" class="edt-switch__input" aria-label="...">
       <span class="edt-switch__track"><span class="edt-switch__thumb"></span></span>
     </label>
   -------------------------------------------------------------------------- */
.edt-switch {
    position: relative;
    display: inline-flex;
    align-items: center;
    flex-shrink: 0;
    margin: 0;
    cursor: pointer;
}

/* Escondido visualmente, NÃO com display:none — some da ordem de foco. */
.edt-switch__input {
    position: absolute;
    width: 1px;
    height: 1px;
    margin: 0;
    padding: 0;
    opacity: 0;
    pointer-events: none;
}

.edt-switch__track {
    display: block;
    position: relative;
    width: 2.25rem;
    height: 1.25rem;
    border-radius: 999px;
    background-color: var(--edt-surface-3);
    border: 1px solid var(--edt-border-strong);
    transition: background-color 0.15s ease, border-color 0.15s ease;
}

.edt-switch__thumb {
    position: absolute;
    top: 50%;
    left: 0.1875rem;
    width: 0.75rem;
    height: 0.75rem;
    margin-top: -0.375rem;
    border-radius: 50%;
    /* Cinza de texto suave em vez de branco fixo: legível sobre o trilho claro
       do tema claro E sobre o trilho escuro do tema escuro. */
    background-color: var(--edt-text-muted);
    transition: transform 0.15s ease, background-color 0.15s ease;
}

.edt-switch__input:checked + .edt-switch__track {
    background-color: var(--edt-brand);
    border-color: var(--edt-brand);
}

.edt-switch__input:checked + .edt-switch__track .edt-switch__thumb {
    background-color: var(--edt-brand-contrast);
    transform: translateX(1rem);
}

/* Foco visível só para teclado (clique de mouse não desenha o anel). */
.edt-switch__input:focus-visible + .edt-switch__track {
    outline: 2px solid var(--edt-brand);
    outline-offset: 2px;
}

.edt-switch__input:disabled + .edt-switch__track {
    opacity: 0.5;
}

.edt-switch:has(.edt-switch__input:disabled) {
    cursor: not-allowed;
}

/* --- Switch + rótulo + ponto de alteração --------------------------------- */
.edt-switch-field {
    display: inline-flex;
    align-items: center;
    gap: var(--edt-space-2);
    min-width: 0;
}

/* Largura mínima para "Sim"/"Não" não empurrarem o ponto de alteração. */
.edt-switch-field__label {
    min-width: 2.1rem;
    font-size: 0.8125rem;
    font-weight: 600;
    color: var(--edt-text);
}

.edt-switch-field__label.is-off {
    font-weight: 500;
    color: var(--edt-text-muted);
}

/* --- Ponto indicador ------------------------------------------------------ */
.edt-dot {
    display: inline-block;
    width: 0.4rem;
    height: 0.4rem;
    border-radius: 50%;
    flex-shrink: 0;
    background-color: var(--edt-neutral);
}

.edt-dot--brand   { background-color: var(--edt-brand); }
.edt-dot--success { background-color: var(--edt-success); }
.edt-dot--warning { background-color: var(--edt-warning); }

/* --- Barra horizontal de filtros ------------------------------------------
   Um bloco à esquerda (busca) e outro à direita (filtros compactos); em tela
   estreita os dois quebram para linhas próprias.
   -------------------------------------------------------------------------- */
.edt-toolbar {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: var(--edt-space-3);
    width: 100%;
}

.edt-toolbar__inicio,
.edt-toolbar__fim {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: var(--edt-space-2);
    min-width: 0;
}

.edt-toolbar__inicio {
    flex: 1 1 16rem;
}

.edt-toolbar__fim {
    margin-left: auto;
}

/* --- Filtros que CARREGAM conteúdo ---------------------------------------
   Rótulo acima do campo, como no formulário "Nova escalação".

   Diferente da .edt-toolbar: aquela refina uma lista já carregada (rótulo
   dentro da pílula, .edt-select-inline); esta é a escolha que traz os dados
   para a tela — Peso, GED/SI e Terceirizar ACO. Usada onde a tabela só existe
   depois de escolher.
   -------------------------------------------------------------------------- */
.edt-filtros-form {
    display: flex;
    flex-wrap: wrap;
    align-items: flex-end;
    gap: var(--edt-space-4);
    width: 100%;
}

.edt-filtros-form > .edt-field,
.edt-filtros-form > [id$="-projeto-container"] {
    flex: 0 1 16rem;
    min-width: 12rem;
}

/* Botões e contadores alinham pela base dos campos, não pelo rótulo. */
.edt-filtros-form > .edt-btn {
    flex: 0 0 auto;
}

.edt-filtros-form > .edt-panel__count {
    margin-left: auto;
    align-self: center;
}

@media (max-width: 700px) {
    .edt-filtros-form > .edt-field,
    .edt-filtros-form > [id$="-projeto-container"] {
        flex: 1 1 100%;
    }

    .edt-filtros-form > .edt-panel__count {
        margin-left: 0;
    }
}

/* --- Select compacto com rótulo embutido ("Status  Todos") ---------------- */
.edt-select-inline {
    display: inline-flex;
    align-items: center;
    gap: var(--edt-space-2);
    margin: 0;
    padding: 0.35rem var(--edt-space-3);
    background-color: var(--edt-surface-1);
    border: 1px solid var(--edt-border-strong);
    border-radius: var(--edt-radius-md);
    white-space: nowrap;
    cursor: pointer;
}

.edt-select-inline:focus-within {
    border-color: var(--edt-brand);
    box-shadow: 0 0 0 3px var(--edt-brand-soft);
}

.edt-select-inline__label {
    font-size: 0.75rem;
    color: var(--edt-text-muted);
}

.edt-select-inline__control {
    max-width: 11rem;
    margin: 0;
    padding: 0;
    border: 0;
    outline: none;
    background: transparent;
    color: var(--edt-text);
    font-family: inherit;
    font-size: 0.8125rem;
    font-weight: 600;
    cursor: pointer;
}

/* O menu suspenso nativo não herda a cor do elemento em todo navegador;
   pintar as opções evita texto claro sobre fundo claro no tema escuro. */
.edt-select-inline__control option {
    background-color: var(--edt-surface-1);
    color: var(--edt-text);
    font-weight: 500;
}

/* --- Intervalo de datas (início "até" fim) -------------------------------- */
.edt-daterange {
    display: inline-flex;
    flex-wrap: wrap;
    align-items: center;
    gap: var(--edt-space-2);
}

.edt-daterange__sep {
    font-size: 0.8125rem;
    color: var(--edt-text-muted);
}

.edt-daterange input[type="date"] {
    width: auto;
    min-width: 8.75rem;
    margin: 0;
    padding: 0.4rem var(--edt-space-3);
    background-color: var(--edt-surface-1);
    border: 1px solid var(--edt-border-strong);
    border-radius: var(--edt-radius-md);
    color: var(--edt-text);
    font-family: inherit;
    font-size: 0.8125rem;
    color-scheme: var(--edt-color-scheme);
}

.edt-daterange input[type="date"]:focus {
    outline: none;
    border-color: var(--edt-brand);
    box-shadow: 0 0 0 3px var(--edt-brand-soft);
}

/* --- Célula numérica, valor ausente e seta de ordenação ------------------- */
.edt-num {
    text-align: right;
    font-variant-numeric: tabular-nums;
}

/* Precisa vencer o `text-align: left` de `.edt-table thead th` (mesma
   especificidade não bastaria se viesse antes; aqui vem depois e com uma
   classe a mais). */
.edt-table thead th.edt-num,
.edt-table tbody td.edt-num {
    text-align: right;
}

/* Traço de valor ausente ("—") */
.edt-muted-dash {
    color: var(--edt-text-muted);
}

/* Indicador de coluna ordenada. Fica num <span> próprio para o JS trocar só
   o texto dele — reescrever o <th> inteiro apagaria ícones e rótulo. */
.edt-sort-arrow {
    margin-left: var(--edt-space-1);
    font-size: 0.7rem;
    color: var(--edt-brand);
}

/* --- Linha com alteração ainda não salva ---------------------------------- */
/* Primeira declaração é o fallback para quem não tem color-mix. */
.edt-table tbody tr.is-alterada {
    background-color: var(--edt-brand-soft);
    background-color: color-mix(in srgb, var(--edt-brand) 8%, transparent);
}

.edt-table tbody tr.is-alterada:hover {
    background-color: var(--edt-brand-soft);
    background-color: color-mix(in srgb, var(--edt-brand) 14%, transparent);
}

/* --- Barra de alterações pendentes ---------------------------------------- */
/* Gruda no fim do painel enquanto a página rola (o scroller é `.content`).
   Como é o último filho de `.edt-panel`, herda os cantos inferiores. */
.edt-savebar {
    position: sticky;
    bottom: 0;
    z-index: 20;
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    justify-content: space-between;
    gap: var(--edt-space-3);
    padding: var(--edt-space-3) var(--edt-space-5);
    background-color: var(--edt-surface-1);
    border-top: 1px solid var(--edt-border);
    box-shadow: var(--edt-shadow-up);
    border-bottom-left-radius: var(--edt-radius-lg);
    border-bottom-right-radius: var(--edt-radius-lg);
}

.edt-savebar--oculta {
    display: none;
}

.edt-savebar__info {
    display: flex;
    align-items: center;
    gap: var(--edt-space-2);
    font-size: 0.875rem;
    color: var(--edt-text-muted);
}

.edt-savebar__info strong {
    color: var(--edt-text);
    font-weight: 700;
}

.edt-savebar__acoes {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: var(--edt-space-2);
}

/* --- Envelope de painel ---------------------------------------------------
   Painéis incluídos em containers que centralizam os filhos
   (`.hidden-buttons-container` é flex column + align-items:center) não
   esticam sozinhos: sem largura declarada o painel encolhe até o conteúdo.
   -------------------------------------------------------------------------- */
.edt-panel-wrap {
    width: 100%;
    max-width: 100%;
    margin: 0;
}

@media (prefers-reduced-motion: reduce) {
    .edt-switch__track,
    .edt-switch__thumb {
        transition: none;
    }
}

/* --------------------------------------------------------------------------
   13. Arquétipo "cadastrar + listar"
   --------------------------------------------------------------------------
   Telas que têm um formulário curto no topo (escolher opções e Adicionar) e,
   embaixo, a lista do que já foi cadastrado, com filtros e ação de remover.
   Escalar Documentos, Escalar Pacotes, Levantamento de Campo e Colaboradores
   seguem todas esse mesmo arquétipo.
   -------------------------------------------------------------------------- */

/* Corpo que é o PRIMEIRO filho de um painel sem cabeçalho. `.edt-panel__body`
   traz `padding: 0 X X` (topo zerado, porque normalmente vem logo abaixo do
   cabeçalho, que já dá o respiro). Sem cabeçalho, o conteúdo encosta na borda.

   As duas classes no seletor são deliberadas: tokens.css é carregado DEPOIS
   dos CSS por tela (ver base.html), então uma regra de tela com uma classe só
   empata em especificidade com `.edt-panel__body` e perde. Qualquer override
   de tokens.css feito a partir de um CSS por tela precisa de especificidade
   maior, nunca só de ordem. */
.edt-panel__body.edt-panel__body--com-topo {
    padding-top: var(--edt-space-5);
}

/* Grade do formulário: campos que se acomodam sozinhos na largura disponível e
   o botão de ação alinhado pela base dos campos (e não esticado). */
.edt-form-grid {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(12rem, 1fr));
    align-items: end;
    gap: var(--edt-space-3);
    width: 100%;
}

.edt-form-grid__acao {
    align-self: end;
    justify-self: start;
    white-space: nowrap;
}

/* Campo que precisa do dobro de espaço dos vizinhos (documento, colaborador) */
.edt-form-grid__largo {
    grid-column: span 2;
}

@media (max-width: 700px) {
    .edt-form-grid {
        grid-template-columns: 1fr;
    }
    .edt-form-grid__largo {
        grid-column: span 1;
    }
}

/* Botão de ícone destrutivo (remover linha da lista) */
.edt-icon-btn--perigo:hover {
    background-color: var(--edt-danger-soft);
    color: var(--edt-danger);
}

/* Coluna de ações no fim da tabela: estreita e encostada à direita.
   Duas classes para vencer `.edt-table tbody td`, que fixa text-align: left. */
.edt-col-acao {
    width: 3rem;
}

.edt-table th.edt-col-acao,
.edt-table td.edt-col-acao {
    text-align: right;
}

/* --------------------------------------------------------------------------
   Faixa xl (>= 1920px) — aproveitar tela grande

   Até agosto de 2026 não havia UMA regra acima de 992px em todo o repositório:
   de 993 a 3440px o layout era literalmente o mesmo. Os containers das telas de
   escalação travam entre 1100 e 1400px, o que é bom em 1366 e desperdício em
   ultrawide — num 3440 sobram 68% de tela vazia.

   Fica no fim de tokens.css, e não em cada CSS de tela, porque tokens.css é o
   último a carregar e vence os arquivos legados sem precisar de !important.

   Forma negada em vez de `min-width: 1920px`, pela mesma razão do bloco 3.1:
   larguras fracionárias do zoom do Windows caem na faixa morta.

   As telas de FORMULÁRIO (férias, outras demandas, atualizar ME — 820 a 920px)
   ficam de fora de propósito: campo de texto muito largo piora a leitura.
   -------------------------------------------------------------------------- */
@media not all and (max-width: 1919px) {
    /* Telas de lista/tabela que hoje param em 1100–1200px */
    .atualizar-container,
    .escalar-container,
    .edt-ranklist,
    .gedsi-container,
    .publicar-container,
    .tercerizar-aco-container,
    .peso-container,
    .docs-escalados-container {
        max-width: min(1600px, 100%);
    }

    /* As que já iam a 1400px são as mais densas: sobem mais. */
    .colabs-esc-container,
    .escalar-doc-container,
    .escalar-pacote-container,
    .levantamento-campo-container {
        max-width: min(1900px, 100%);
    }
}
