/* Estilo customizado para o botão btn-ghost-danger */
.btn-ghost-danger {
    --vz-btn-color: #ed5e5e !important;
    --vz-btn-bg: rgba(237, 94, 94, 0.1) !important;
    --vz-btn-border-color: transparent !important;
    color: #ed5e5e !important;
    background-color: rgba(237, 94, 94, 0.1) !important;
    border-color: transparent !important;
}

.btn-ghost-danger:hover,
.btn-ghost-danger:focus,
.btn-ghost-danger:active {
    --vz-btn-hover-color: #fff !important;
    --vz-btn-hover-bg: #dc3545 !important;
    --vz-btn-hover-border-color: #dc3545 !important;
    color: #fff !important;
    background-color: #dc3545 !important;
    border-color: #dc3545 !important;
}

/* Foco visível nos botões: o tema compila o Bootstrap com $btn-focus-width: 0, então o anel
   de foco existe mas tem 0px — invisível. Reativamos com o mesmo cinza do SweetAlert para o
   usuário enxergar onde o foco parou ao navegar com Tab/Enter (ex.: ao chegar no Salvar).
   Usamos box-shadow e não outline porque há botões quadrados de ícone sem padding, e um
   outline com offset invadiria os campos vizinhos. */
.btn:focus,
.btn:focus-visible,
.btn:first-child:active:focus,
.btn.active:focus,
.btn.show:focus,
.btn-check:focus + .btn {
    --vz-btn-focus-box-shadow: 0 0 0 3px rgba(110, 120, 129, .5);
    outline: 0;
    box-shadow: 0 0 0 3px rgba(110, 120, 129, .5);
}

/* Mesmo problema nos radios/checkboxes: o anel de .form-check-input:focus também vem com 0px,
   e como o marcador é pequeno o usuário não enxergava em qual opção o teclado parou. Só em
   :focus-visible — clicar com o mouse não deixa o anel para trás. */
.form-check-input:focus-visible {
    border-color: var(--vz-primary, #405189);
    outline: 0;
    box-shadow: 0 0 0 3px rgba(110, 120, 129, .5);
}

/* Estilo para manter abas de produtos em uma linha */
/* (deploy) */
#produtosTabs,
#produtosTabsEdit {
    flex-wrap: nowrap !important;
    overflow-x: auto;
    overflow-y: hidden;
    -webkit-overflow-scrolling: touch;
}

#produtosTabs .nav-item,
#produtosTabsEdit .nav-item {
    flex-shrink: 0;
    white-space: nowrap;
}

#produtosTabs .nav-link,
#produtosTabsEdit .nav-link {
    white-space: nowrap;
    padding: 0.5rem 0.75rem;
    font-size: 0.875rem;
}

/* Em telas muito pequenas, permite quebra de linha */
@media (max-width: 768px) {
    #produtosTabs,
    #produtosTabsEdit {
        flex-wrap: wrap !important;
    }
}

/* Modal de lookup deve aparecer acima de outros modais */
/* Bootstrap usa z-index 1055 para modais, então usamos valores maiores */
#modalLookup {
    z-index: 1080 !important;
}

#modalLookup.modal.show {
    z-index: 1080 !important;
}

#modalLookup .modal-backdrop {
    z-index: 1079 !important;
}

/* Quando há um modal aberto e outro modal é aberto, ajustar z-index */
.modal.show ~ .modal.show {
    z-index: 1080 !important;
}

.modal.show ~ .modal.show .modal-backdrop {
    z-index: 1079 !important;
}

/* Garantir que o modal de lookup apareça acima do modal de editar produto */
#modalEditarProduto.show ~ #modalLookup.show,
#modalEditarProduto.show + #modalLookup.show {
    z-index: 1080 !important;
}

#modalEditarProduto.show ~ #modalLookup.show .modal-backdrop,
#modalEditarProduto.show + #modalLookup.show .modal-backdrop {
    z-index: 1079 !important;
}

/* Forçar z-index maior para qualquer modal de lookup quando há modal de editar aberto */
body:has(#modalEditarProduto.show) #modalLookup {
    z-index: 1080 !important;
}

body:has(#modalEditarProduto.show) #modalLookup .modal-backdrop {
    z-index: 1079 !important;
}

/*# sourceMappingURL=custom.min.css.map */

/* Personalizados */

.input-number-small {
    max-width: 70px;
}

/* Altura canônica dos campos (mesmo valor do Select2 do tema) */
:root {
    --apollo-input-height: 37.5px;
}

/*
 * Inputs e selects — altura padrão global do ERP.
 * NÃO depende de estarem dentro de <form>: formulários SPA (ex.: MDF-e em #mdForm)
 * usam div/card e herdavam o padding maior do Bootstrap.
 * .form-control-sm / .form-control-lg e sizes de select ficam de fora.
 */
.form-control:not(textarea):not([type="hidden"]):not([type="checkbox"]):not([type="radio"]):not([type="file"]):not(.form-control-sm):not(.form-control-lg),
.form-select:not(.form-select-sm):not(.form-select-lg) {
    height: var(--apollo-input-height);
    min-height: var(--apollo-input-height);
    max-height: var(--apollo-input-height);
    box-sizing: border-box;
}

textarea.form-control {
    height: auto;
    min-height: calc(var(--apollo-input-height) * 2);
    max-height: none;
}

/*
 * Busca simples (listagem): input + botão(ões) do .input-group com a mesma altura.
 * Sem isso o .btn fica maior que o .form-control em todas as telas.
 */
.input-group:has(> .form-control):has(> .btn) {
    align-items: stretch;
    height: var(--apollo-input-height);
    min-height: var(--apollo-input-height);
    max-height: var(--apollo-input-height);
}

.input-group:has(> .form-control):has(> .btn) > .form-control:not(textarea):not([type="hidden"]):not([type="checkbox"]):not([type="radio"]):not([type="file"]),
.input-group:has(> .form-control):has(> .btn) > .form-select {
    height: var(--apollo-input-height) !important;
    min-height: var(--apollo-input-height) !important;
    max-height: var(--apollo-input-height) !important;
    box-sizing: border-box;
}

.input-group:has(> .form-control):has(> .btn) > .btn {
    height: var(--apollo-input-height) !important;
    min-height: var(--apollo-input-height) !important;
    max-height: var(--apollo-input-height) !important;
    margin: 0;
    padding-top: 0 !important;
    padding-bottom: 0 !important;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    box-sizing: border-box;
    line-height: 1;
    border-radius: 0;
}

/* Último botão visível arredonda à direita (como o final do input) */
.input-group:has(> .form-control):has(> .btn) > .btn:not(:has(+ .btn:not(.d-none))) {
    border-top-right-radius: var(--vz-border-radius, 0.25rem) !important;
    border-bottom-right-radius: var(--vz-border-radius, 0.25rem) !important;
}

.input-group:has(> .form-control):has(> .btn) > .form-control:not(textarea) {
    border-top-right-radius: 0 !important;
    border-bottom-right-radius: 0 !important;
}

/* Radio buttons estilizados como input — mesma borda/altura do .form-control */
.radio-input-box {
    display: flex;
    align-items: center;
    box-sizing: border-box;
    border: 1px solid var(--vz-input-border);
    border-radius: 0.25rem;
    height: var(--apollo-input-height);
    min-height: var(--apollo-input-height);
    max-height: var(--apollo-input-height);
    margin: 0;
    padding: 0;
    color: var(--vz-body-color);
    background-color: var(--vz-input-bg);
    background-clip: padding-box;
    -webkit-appearance: none;
    -moz-appearance: none;
    appearance: none;
    box-shadow: none;
    outline: 0;
    overflow: hidden;
    vertical-align: top;
}
.radio-input-box .form-check {
    flex: 1;
    margin-bottom: 0;
    display: flex;
    align-items: center;
    justify-content: center;
    gap: 0.35rem;
    padding-left: 0;
}
.radio-input-box .form-check-input { float: none; margin: 0; }

/*
 * Lookup (código + lupa + nome): altura fixa em px (evita 1px de diferença por
 * arredondamento de rem). Global — SPA sem <form>, modais e cadastros.
 */
.d-flex:has(> .form-control):has(> .btn.btn-light) {
    align-items: center !important;
    height: var(--apollo-input-height);
    min-height: var(--apollo-input-height);
    max-height: var(--apollo-input-height);
    margin: 0;
    padding: 0;
    box-sizing: border-box;
}

.d-flex:has(> .form-control) > .btn.btn-light {
    height: var(--apollo-input-height) !important;
    min-height: var(--apollo-input-height) !important;
    max-height: var(--apollo-input-height) !important;
    margin: 0;
    padding-top: 0 !important;
    padding-bottom: 0 !important;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    box-sizing: border-box;
    line-height: 1;
    flex: 0 0 auto;
}

.d-flex:has(> .form-control):has(> .btn.btn-light) > .form-control {
    height: var(--apollo-input-height) !important;
    min-height: var(--apollo-input-height) !important;
    max-height: var(--apollo-input-height) !important;
    margin: 0;
    box-sizing: border-box;
}

/* Incluir / ação ao lado do lookup (mesma altura dos inputs) */
.d-flex:has(> .form-control):has(> .btn.btn-light) > .btn:not(.btn-sm):not(.btn-lg) {
    height: var(--apollo-input-height) !important;
    min-height: var(--apollo-input-height) !important;
    max-height: var(--apollo-input-height) !important;
    padding-top: 0 !important;
    padding-bottom: 0 !important;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    box-sizing: border-box;
    line-height: 1;
}

/* Labels da mesma linha com a mesma caixa — evita 1px de deslocamento do campo abaixo */
.row.g-2 > [class*="col-"] > .form-label,
.row.gy-2 > [class*="col-"] > .form-label {
    margin-bottom: 0.5rem;
    min-height: 1.3125rem;
    line-height: 1.3125rem;
    display: flex;
    align-items: center;
}

/*
 * Fieldset + legend (padrão Orçamento / forms Apollo).
 * `.p-3` do Bootstrap aplica 1rem no topo — a legend fica na borda e o
 * padding-top vira um “buraco” entre o título da seção e os campos.
 * Lateral e base permanecem 1rem; o topo fica só o necessário.
 */
fieldset.border.rounded.p-3 {
    padding: 0.25rem 1rem 1rem !important;
}

fieldset.border.rounded > legend,
legend.orc-form-legend {
    float: none !important;
    width: auto !important;
    padding: 0 0.5rem;
    margin: 0 0 0.15rem 0 !important;
    font-size: 15px;
    font-weight: 700;
    color: var(--vz-primary, #405189);
    line-height: 1.25;
}

/* Qualquer primeiro bloco sob a legend: sem margem superior (mt-* no HTML) */
fieldset.border.rounded > legend + * {
    margin-top: 0 !important;
}

/* Legacy: row direta sob a legend */
fieldset.border.rounded > .row:first-of-type {
    margin-top: 0 !important;
}

/* Readonly com mesma aparência de disabled (envia no submit) */
.form-control[readonly] {
    background-color: #e9ecef;
    cursor: not-allowed;
    opacity: 1;
}
.form-control[readonly]:focus {
    background-color: #e9ecef;
    border-color: #86b7fe;
    box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25);
}

/* Select2 com mesma altura dos inputs padrão */
.select2-container .select2-selection--single {
    height: 37.5px !important;
    min-height: 37.5px !important;
    border: 1px solid var(--vz-input-border, #ced4da) !important;
    border-radius: 0.25rem !important;
}
.select2-container .select2-selection--single .select2-selection__rendered {
    line-height: 37.5px !important;
    padding-left: 0.75rem !important;
    padding-right: 2rem !important;
    color: var(--vz-body-color, #212529) !important;
}
.select2-container .select2-selection--single .select2-selection__arrow {
    height: 35.5px !important;
    right: 0.35rem !important;
}

/* Evita rodapé sticky sobrepor menu lateral/dropdowns */
.card-footer[style*="position: sticky"][style*="z-index: 100"],
.orc-form-footer-actions,
.cli-form-footer-actions,
.mot-form-footer-actions,
.doc-form-footer-actions,
.pol-form-footer-actions,
.cfo-form-footer-actions,
.tdc-form-footer-actions,
.mdf-form-footer-actions {
    z-index: 2 !important;
}

/*
 * Page-title — topo padronizado (todas as telas com .page-title-box).
 *
 * Layout horizontal (Velzon): o tema usa margin-top -19px + padding 1.2rem 0.
 * Só puxar a margin NÃO centra o h4 — o padding alto deixa ~43px acima do
 * texto e ~20px abaixo (menu → título → card). Medido no desenv (Clientes @
 * 1920px, 2026-08-10): balance ideal ≈ gap 19px + 19px com:
 *   margin-top: -44px; padding-top/bottom: 0.35rem
 * (!important: app.min declara padding e margin no mesmo seletor).
 */
@media (min-width: 1024.1px) {
    [data-layout="horizontal"] .page-title-box {
        margin-top: -44px !important; /* tema: -19px */
        padding-top: 0.35rem !important;
        padding-bottom: 0.35rem !important;
    }

    /* Detached usa o mesmo padding 1.2rem do horizontal no tema */
    [data-layout="vertical"][data-layout-style="detached"] .page-title-box {
        margin-top: -44px !important;
        padding-top: 0.35rem !important;
        padding-bottom: 0.35rem !important;
    }
}

/* Vertical (menu lateral): tema base margin-top -23px + padding compactado */
[data-layout="vertical"]:not([data-layout-style="detached"]) .page-title-box {
    margin-top: -48px !important; /* tema: -23px */
    padding-top: 0.35rem !important;
    padding-bottom: 0.35rem !important;
}

/*
 * Barra de flash/alertas (embAlertsBar, comAlertsBar, etc.) renderizada SEM .col-*
 * ainda levava margin-bottom do .mb-3 (~1rem) e empurrava o page-title para baixo.
 * Oculta a faixa vazia para igualar telas ao padrão MDF-e (title colado no topo).
 */
.container-fluid > .row.mb-3:not(:has(> [class*="col"])),
.container-fluid > .row.mb-2:not(:has(> [class*="col"])) {
    display: none !important;
    margin: 0 !important;
    padding: 0 !important;
    height: 0 !important;
    min-height: 0 !important;
    overflow: hidden;
    border: 0 !important;
}

.navbar-menu .menu-dropdown {
    z-index: 1100;
}

/*
 * Correção de raiz do menu horizontal:
 * A barra do menu (.navbar-menu) recebe z-index:100 no layout horizontal, empatando
 * com os card-footer sticky (z-index:100) das telas de formulário. Elevamos a barra
 * acima do conteúdo (abaixo dos modais Bootstrap 1050+).
 * NÃO definir z-index em .main-content — isso cria stacking context e deixa modais
 * (dentro de container-fluid) atrás do .modal-backdrop no body.
 */
[data-layout="horizontal"] .navbar-menu {
    z-index: 1031;
    isolation: isolate;
}
[data-layout="horizontal"] #page-topbar {
    z-index: 1032;
}
[data-layout="horizontal"] .navbar-menu .collapse.menu-dropdown,
[data-layout="horizontal"] .navbar-menu .menu-dropdown {
    background-color: var(--vz-choices-bg, #fff);
    box-shadow: 0 0 5px rgba(15, 34, 58, 0.15);
}

/* Desktop: 1º nível (Cadastros, Movimentação…) só abre no hover — .show do PHP é estado ativo, não dropdown aberto */
@media (min-width: 1024.1px) {
    [data-layout="horizontal"] .navbar-nav > .nav-item > .menu-dropdown {
        left: 0;
        display: none !important;
    }
    [data-layout="horizontal"] .navbar-nav > .nav-item:hover > .menu-dropdown {
        display: block !important;
        height: auto !important;
    }
}

/*
 * Fundo do dropdown de 2 colunas (.menu-content) no menu horizontal:
 * No horizontal a .menu-dropdown é position:absolute e encolhe para a largura de
 * apenas UMA coluna, enquanto o grid .menu-content (min-width:530px) transborda — a
 * segunda coluna ficava sem fundo e o conteúdo da página vazava atrás dela.
 * Pintamos o fundo no próprio .menu-content (caixa que envolve as duas colunas) e
 * fazemos a caixa do dropdown acompanhar a largura do conteúdo.
 */
[data-layout="horizontal"] .navbar-nav .menu-dropdown {
    width: -webkit-max-content;
    width: max-content;
    max-width: 95vw;
}
[data-layout="horizontal"] .menu-content {
    background-color: var(--vz-choices-bg, #fff);
    border-radius: 0.3rem;
}

/*
 * Sub-dropdown que estoura a borda direita do viewport (ex.: Relatórios > Financeiro em
 * monitores de 14″/1366 px): o JS em scripts.php detecta o overflow e adiciona esta
 * classe para inverter o eixo — útil para dropdowns ativados via Bootstrap collapse.
 */
[data-layout="horizontal"] .menu-dropdown-abre-esquerda {
    left: auto !important;
    right: 100% !important;
}

/*
 * Relatórios → Financeiro, TI e Tabelas: todos abrem à ESQUERDA.
 *
 * Em layout horizontal, sub-dropdowns aninhados abrem via CSS :hover com left:100%
 * (regra do framework). Substituímos por right:100% (espelha o eixo):
 *   right:100% → borda direita do flyout = borda esquerda do dropdown pai.
 *
 * Cadeia de posicionamento:
 *   Financeiro → abre à esquerda de #sidebarAuth  (Relatórios)
 *   TI         → abre à esquerda de #sidebarAuth  (Relatórios)
 *   Tabelas    → abre à esquerda de #sidebarTwoStep (TI)
 *
 * Hover continua funcionando (flyout é filho do nav-item no DOM → mover o mouse
 * para dentro dele mantém o :hover ativo no ancestral nav-item).
 * Especificidade ID + attr (1,1,0) vence o seletor de classe (0,3,0) do framework.
 */
[data-layout="horizontal"] #sidebarFinanceiro,
[data-layout="horizontal"] #sidebarTwoStep {
    left: auto !important;
    right: 100% !important;
}

/*
 * Relatórios > TI > Tabelas: flyout à esquerda do TI, centralizado no item
 * e com scroll quando a lista é longa (altura ajustada via JS).
 */
@media (min-width: 1024.1px) {
    [data-layout="horizontal"] .nav-item-menu-tabelas {
        position: relative;
    }

    [data-layout="horizontal"] .menu-dropdown .menu-dropdown#tabelasSubmenu,
    [data-layout="horizontal"] #tabelasSubmenu {
        left: auto !important;
        right: 100% !important;
        top: 50% !important;
        bottom: auto !important;
        transform: translateY(-50%) !important;
        max-height: min(360px, calc(100vh - 130px));
        overflow-y: auto;
        overflow-x: hidden;
        -webkit-overflow-scrolling: touch;
    }
}

@media (max-width: 1024px) {
    [data-layout="horizontal"] .menu .nav-item-menu-tabelas {
        position: relative;
    }

    [data-layout="horizontal"] .menu #tabelasSubmenu {
        position: absolute !important;
        top: auto !important;
        bottom: auto !important;
        left: 0 !important;
        right: auto !important;
        width: 100%;
        transform: none;
        max-height: min(300px, calc(100vh - 140px));
        overflow-y: auto;
        overflow-x: hidden;
        z-index: 1100;
        background-color: var(--vz-choices-bg, #fff);
        box-shadow: 0 -2px 6px rgba(15, 34, 58, 0.12);
    }
}

/*
 * Scroll nos sub-dropdowns de 1º nível de Relatórios, EXCETO TI (#sidebarTwoStep):
 *
 *   — Todos os outros (#sidebarSignIn, #sidebarProdutos, #sidebarMovimentacao,
 *     #sidebarFinanceiro, #sidebarLockScreen, #sidebarLogout, #sidebarSuccessMsg)
 *     ganham max-height + overflow-y:auto para o usuário rolar em monitores de 14".
 *
 *   — #sidebarTwoStep é EXCLUÍDO via :not() porque tem um filho absoluto
 *     (#tabelasSubmenu) posicionado com right:100% fora da sua borda esquerda.
 *     Se aplicássemos overflow:auto ao TI, o CSS forçaria overflow-x:auto e
 *     cliparia o flyout Tabelas que fica à esquerda. Com apenas 3 itens diretos
 *     (Monitoramento, Log de Acesso, Tabelas), TI nunca precisa de scroll.
 */
@media (min-width: 1024.1px) {
    [data-layout="horizontal"] #sidebarAuth > ul > li > .menu-dropdown:not(#sidebarTwoStep) {
        max-height: calc(100vh - 80px);
        overflow-y: auto;
    }
}

/* Modal lookup — orçamento: área fixa em telas grandes, adaptável em telas pequenas (deploy) */
#modalOrcLookup .modal-dialog {
    max-height: calc(100vh - 1rem);
    margin: 0.5rem auto;
}
#modalOrcLookup .modal-content {
    max-height: calc(100vh - 1rem);
    display: flex;
    flex-direction: column;
}
/* Modal lookup — Apollo (genérico): mesma moldura do orçamento */
#apolloLookupModal .modal-dialog {
    max-height: calc(100vh - 1rem);
    margin: 0.5rem auto;
}
#apolloLookupModal .modal-content {
    max-height: calc(100vh - 1rem);
    display: flex;
    flex-direction: column;
}
#modalOrcLookup .orc-lookup-modal-body,
.apollo-lookup-modal-body {
    min-height: min(480px, calc(100vh - 9rem));
    max-height: calc(100vh - 9rem);
    overflow: hidden;
    flex: 1 1 auto;
}
/* Altura FIXA enquanto o modal está aberto (teto proporcional à janela — assim
   maximizar realmente ganha altura). Fixa, e não min/max, porque o tamanho do
   modal não pode depender da quantidade de linhas: trocar de página, ordenar
   uma coluna ou receber uma página vazia não pode encolher nem crescer a caixa. */
#apolloLookupModal .apollo-lookup-modal-body {
    height: min(70vh, calc(100vh - 9rem));
    min-height: min(70vh, calc(100vh - 9rem));
    max-height: min(70vh, calc(100vh - 9rem));
}
/* Maximizado: o corpo acompanha toda a altura da janela (sem sobra em branco) */
#apolloLookupModal.apollo-lookup-cheio .apollo-lookup-modal-body {
    height: auto;
    min-height: 0;
    max-height: none;
}
/* A tabela ocupa toda a altura livre entre a busca e a paginação —
   nunca uma altura fixa, senão sobra espaço em branco em telas altas. */
.orc-lookup-table-wrap {
    flex: 1 1 auto;
    min-height: 180px;
    overflow-y: auto;
}
.orc-lookup-table-wrap tbody .orc-lookup-status-row td {
    min-height: min(320px, calc(100vh - 17rem));
    vertical-align: middle;
}
.orc-lookup-pagination-wrap .pagination-prev,
.orc-lookup-pagination-wrap .pagination-next {
    padding: 0.25rem 0.45rem;
    font-size: 0.8125rem;
    background: transparent;
    border: none;
    border-radius: 0;
}
.orc-lookup-pagination-wrap .pagination .page-link {
    padding: 0.25rem 0.45rem;
    font-size: 0.8125rem;
    color: #6691e7;
    background: transparent;
    border: none;
    border-radius: 0;
    box-shadow: none;
}
.orc-lookup-pagination-wrap .pagination .page-link:hover {
    color: #405189;
    background: transparent;
}
.orc-lookup-pagination-wrap .pagination .page-item.active .page-link {
    color: #405189;
    font-weight: 600;
    background: transparent;
}
.orc-lookup-pagination-wrap .pagination .page-item.disabled .page-link {
    color: #878a99;
    background: transparent;
}

/* Alerta piscar para respostas não vistas em cotações */
@keyframes cotacao-alerta-pulse {
    0%, 100% {
        box-shadow: 0 0 0 0 rgba(64, 81, 137, 0.4);
    }
    50% {
        box-shadow: 0 0 0 6px rgba(64, 81, 137, 0);
    }
}

tr.cotacao-row-alerta {
    animation: cotacao-alerta-pulse 1.5s ease-in-out infinite;
    background-color: rgba(64, 81, 137, 0.06);
}

/* SweetAlert2 deve ficar acima de QUALQUER modal — inclusive modais empilhados
   (.modal.show ~ .modal.show => z-index:1080) e dropdowns do menu (z-index:1100).
   O padrão do Swal (z-index:1060) ficava por baixo, escondendo os alertas de
   resposta (ex.: retorno de /caixa/cancelar-venda atrás do modal de motivo). */
.swal2-container {
    z-index: 2000 !important;
}

/* Badge de situação — padrão tonal (fundo claro + texto na cor semântica) */
.apollo-sit-badge {
    --vz-text-opacity: 1;
    font-weight: 600;
    border: 0;
    text-transform: uppercase;
    font-size: 0.7rem;
    letter-spacing: 0.02em;
    padding: 0.35em 0.65em;
    border-radius: 0.25rem;
}
.apollo-sit-badge.apollo-sit-ativo {
    color: #12b76a;
    background: #d7f7e6;
}
.apollo-sit-badge.apollo-sit-inativo {
    color: #d92d20;
    background: #ffe1de;
}
.apollo-sit-badge.apollo-sit-neutro {
    color: #667085;
    background: #e6e8eb;
}
.apollo-sit-badge.apollo-sit-sim {
    color: #12b76a;
    background: #d7f7e6;
}
.apollo-sit-badge.apollo-sit-nao {
    color: #865ce2;
    background: #ede9fe;
}
.apollo-sit-badge.apollo-sit-info {
    color: #0ea5e9;
    background: #e0f2fe;
}
.apollo-sit-badge.apollo-sit-primary {
    color: #405189;
    background: #e8ebf4;
}
.apollo-sit-badge.apollo-sit-danger {
    color: #d92d20;
    background: #ffe1de;
}
/* Âmbar de ABERTA e azul de ALTERANDO — mesmas cores do .ven-badge da tela de Venda. */
.apollo-sit-badge.apollo-sit-aviso {
    color: #b54708;
    background: #fdeccd;
}
.apollo-sit-badge.apollo-sit-azul {
    color: #175cd3;
    background: #d1e9ff;
}

/* Painéis de seção em formulários (Venda, Orçamento, Caixa) */
.apollo-form-panel,
.ven-panel {
    border: 1px solid var(--vz-border-color, #e9ebec);
    border-radius: .5rem;
    padding: 1rem 1.15rem;
    background: var(--vz-card-bg, #fff);
}
.apollo-form-panel-title,
.ven-panel-title {
    font-size: .78rem;
    font-weight: 700;
    text-transform: uppercase;
    letter-spacing: .02em;
    color: #495057;
    margin-bottom: .9rem;
    padding-bottom: .55rem;
    border-bottom: 1px solid var(--vz-border-color, #eef0f2);
    display: flex;
    align-items: center;
    gap: .45rem;
}
.apollo-form-panel-title i,
.ven-panel-title i {
    color: var(--vz-primary, #405189);
    font-size: 1.05rem;
}
.apollo-form-panel .d-flex.gap-2 > .form-control,
.apollo-form-panel .d-flex.gap-2 > .btn,
.ven-panel .d-flex.gap-2 > .form-control,
.ven-panel .d-flex.gap-2 > .btn {
    border-radius: .375rem !important;
}
.orc-codigo-campo,
.ven-codigo-campo {
    max-width: 120px;
    min-width: 4.5rem;
    flex: 0 0 auto;
}
.ven-fone-campo {
    width: 10.5rem;
}

/* Grade de itens (orçamento / venda) — conteúdo centralizado na linha */
.apollo-itens-grade-table > :not(caption) > * > * {
    vertical-align: middle;
    padding-top: 0.5rem;
    padding-bottom: 0.5rem;
}
.apollo-itens-grade-table thead th {
    vertical-align: middle;
}
.apollo-itens-grade-table .btn-sm {
    line-height: 1.25;
}

/*
 * Tabelas embutidas em formulários (abas Estoques, Fornecedores, Endereços, etc.):
 * width 100% + table-layout fixed + larguras em % distribuem o espaço entre
 * todas as colunas — a descritiva (Locação etc.) não engole o monitor largo
 * e a tabela não encolhe à esquerda.
 */
.apollo-form-table {
    width: 100%;
    table-layout: fixed;
}
.apollo-form-table > :not(caption) > * > * {
    vertical-align: middle;
    overflow-wrap: anywhere;
    word-break: break-word;
}
.apollo-form-table .col-codigo {
    width: 8%;
}
.apollo-form-table .col-nome {
    width: 14%;
}
.apollo-form-table .col-num,
.apollo-form-table .col-qtde {
    width: 11%;
}
.apollo-form-table .col-acoes {
    width: 7%;
}
.apollo-form-table .col-desc {
    width: 22%;
}
.apollo-form-table td.col-desc,
.apollo-form-table th.col-desc {
    white-space: normal;
}

/*
 * TEMA DARK — cor da fonte do menu horizontal.
 *
 * O template (app.min.css) hard-codeia a cor do link do menu horizontal:
 *   [data-layout="horizontal"] .navbar-menu .navbar-nav .nav-link { color: #353538 }
 * Como é literal (e não var), ao ligar o dark mode (data-layout-mode="dark" no <html>)
 * o fundo da barra escurece (--vz-topnav-bg: #272b30) mas a fonte continua preta —
 * tanto nos itens de topo (Cadastros, Movimentação…) quanto nos sub-itens dos dropdowns
 * (mesmo seletor casa os .nav-sm .nav-link).
 *
 * Aqui devolvemos a cor às variáveis do tema: barra usa --vz-topnav-item-color e o
 * dropdown usa --vz-choices-link-color (o próprio template define #adb5bd no dark).
 * Especificidade: repetimos a cadeia do template + [data-layout-mode="dark"], então
 * vencemos sem !important.
 */
[data-layout-mode="dark"][data-layout="horizontal"] .navbar-menu .navbar-nav .nav-link {
    color: var(--vz-topnav-item-color);
}
[data-layout-mode="dark"][data-layout="horizontal"] .navbar-menu .navbar-nav .nav-link .icon-dual {
    color: var(--vz-topnav-item-color);
}
[data-layout-mode="dark"][data-layout="horizontal"] .navbar-menu .menu-dropdown .nav-link {
    color: var(--vz-choices-link-color, #adb5bd);
}
[data-layout-mode="dark"][data-layout="horizontal"] .navbar-menu .menu-dropdown .nav-link:hover,
[data-layout-mode="dark"][data-layout="horizontal"] .navbar-menu .menu-dropdown .nav-link.active,
[data-layout-mode="dark"][data-layout="horizontal"] .navbar-menu .navbar-nav .nav-item:hover > .nav-link,
[data-layout-mode="dark"][data-layout="horizontal"] .navbar-menu .navbar-nav .nav-link.active,
[data-layout-mode="dark"][data-layout="horizontal"] .navbar-menu .navbar-nav .nav-link[data-bs-toggle="collapse"][aria-expanded="true"] {
    color: var(--vz-topnav-item-color-active);
}
[data-layout-mode="dark"][data-layout="horizontal"] .navbar-menu .menu-title {
    color: var(--vz-vertical-menu-title-color-dark, #878a99);
}

/* Badge de atalho (Ctrl+Alt+…) definido em sidebar.php com cinza claro fixo:
   no dark o #e9ebec grita. Reaproveita o cinza do tema. */
[data-layout-mode="dark"] .badge-custom.badge-atalho {
    background-color: var(--vz-gray-300, #2a2f34);
    color: var(--vz-gray-600, #bfc8e2);
}

/* Apollo tooltip help icon */
.apollo-tooltip{font-size:.82em;color:var(--vz-secondary-color,#6c757d);cursor:default;vertical-align:middle;margin-left:.25rem;}
.apollo-tooltip:hover{color:var(--vz-primary,#405189);}

/* Busca simples da listagem: sempre MAIÚSCULAS */
.apollo-busca-listagem,
#buscaSimples input[type="text"],
[id^="inputBusca"],
#filtroBusca {
    text-transform: uppercase;
}
.apollo-busca-listagem::placeholder,
#buscaSimples input[type="text"]::placeholder,
[id^="inputBusca"]::placeholder,
#filtroBusca::placeholder {
    text-transform: uppercase;
}

/* Listagem: rolagem interna — barra horizontal e rodapé visíveis sem descer a página */
.table-responsive.table-card {
    max-height: calc(100dvh - 20rem);
    overflow: auto;
}
.table-responsive.table-card.apollo-listagem-scroll {
    margin-bottom: .5rem !important;
}
.table-responsive.table-card > table > thead th,
.table-responsive.table-card > table > thead td {
    position: sticky;
    top: 0;
    z-index: 3;
    background-color: var(--vz-light, #f3f6f9);
}
/*
 * Botão de ação inativo nas listagens: cinza chapado, sem borda.
 * O padrão do sistema é desabilitar a ação, nunca escondê-la (ver
 * Apollo.Listagem.botaoAcaoHtml). Sem esta regra o Bootstrap cai nas
 * --vz-btn-disabled-* da base .btn (fundo branco + borda cinza), que destoa
 * dos btn-soft-* vizinhos e faz cada botão inativo ter visual próprio.
 * `.btn.disabled` cobre os poucos casos em que a ação ainda é um <a>.
 */
.table td .btn:disabled,
.table td .btn.disabled {
    background-color: var(--vz-light, #f3f6f9);
    color: var(--vz-gray-500, #adb5bd);
    border-color: transparent;
    opacity: .55;
    cursor: not-allowed;
    pointer-events: none;
}

.apollo-listagem-rodape {
    position: sticky;
    bottom: 0;
    z-index: 4;
    background-color: #fff;
    padding-top: .5rem;
    padding-bottom: .35rem;
}

/*
 * ── Carregamento das listagens: esqueleto com shimmer ──
 *
 * Substitui o spinner (Apollo.Listagem.loadingRowHtml, depreciado). O spinner ocupava
 * UMA linha com colspan: o corpo da tabela colapsava, o rodapé subia para perto do
 * cabeçalho e descia de novo na resposta — o "efeito sanfona" —, e as colunas eram
 * remedidas pela largura do spinner, fazendo o cabeçalho "andar" a cada ordenação.
 *
 * O esqueleto mantém uma página cheia de linhas com a altura real, e as larguras ficam
 * imóveis porque a tabela usa `table-layout: fixed` (ver .apollo-tabela-fixa).
 * Ver .claude/skills/listagem-datatable/SKILL.md.
 */
@keyframes apolloSkelShimmer {
    0%   { background-position: 100% 50%; }
    100% { background-position: 0 50%; }
}
.apollo-skel-bar {
    display: block;
    height: 1.05rem;
    border-radius: .25rem;
    background-image: linear-gradient(90deg, #e9ecef 25%, #f4f6f8 37%, #e9ecef 63%);
    background-size: 400% 100%;
    animation: apolloSkelShimmer 1.1s ease-in-out infinite;
}
@media (prefers-reduced-motion: reduce) {
    .apollo-skel-bar { animation: none; }
}
/* Nada na linha-esqueleto deve ser clicável nem parecer conteúdo. */
.table > tbody > tr.apollo-skel-row { pointer-events: none; }
.table > tbody > tr.apollo-skel-row > td {
    background: transparent;
    /* A zebra do table-striped e o hover não pintam `background`: pintam um box-shadow
     * inset na célula. Zerar só o fundo deixaria a listra aparecer sob as barras. */
    box-shadow: none;
    border-bottom-color: transparent;
    /* O JS mede uma linha real e escreve --apollo-skel-h em cada <tr> do esqueleto. Vai
     * na variável, e não em `height` no <tr>, porque altura no <tr> só funcionaria como
     * piso: a medida nunca conseguiria encolher a linha abaixo do palpite daqui. O
     * padrão é a altura de uma linha com botões btn-sm (27px + 2×.75rem de padding). */
    height: var(--apollo-skel-h, 51px);
}

/*
 * ── Carregamento dos formulários: esqueleto com shimmer ──
 *
 * Substitui o spinner centralizado que ficava no #…FormInner enquanto o form_content
 * vinha por AJAX. O spinner ocupava uma caixa de ~90px de altura: o card nascia baixo e
 * dava um salto quando o formulário real chegava, e a tela ficava sem nenhuma pista de
 * como o conteúdo seria. O esqueleto desenha o cabeçalho, as linhas de campos e o
 * rodapé de ações já na altura deles.
 * Ver .claude/skills/formulario-esqueleto/SKILL.md.
 */
.apollo-skel-form { pointer-events: none; }
/* Título da tela (page-title-box) e a trilha do breadcrumb à direita. */
.apollo-skel-form .apollo-skel-titulo { height: 1.25rem; }
/* A label é mais baixa e mais estreita que o campo — sem isso o esqueleto vira uma
 * grade de blocos iguais, que não lembra um formulário. */
.apollo-skel-form .apollo-skel-label {
    height: .7rem;
    margin-bottom: .5rem;
}
/* Altura do .form-control do Velzon (padding .5rem/.9rem + borda). */
.apollo-skel-form .apollo-skel-campo { height: 38px; }
.apollo-skel-form .apollo-skel-acao  { height: 38px; border-radius: .25rem; }

/*
 * ── Larguras de coluna travadas ──
 *
 * Sem `table-layout: fixed` o navegador remede TODAS as colunas pelo conteúdo a cada
 * troca de linhas: ordenar traz textos de larguras diferentes e o cabeçalho inteiro se
 * desloca. Com o layout fixo a largura vem só das regras da tela (largura no <th>), e
 * a coluna sem largura declarada fica com a sobra.
 *
 * Cada tela declara as próprias larguras e o próprio min-width — o min-width é o que
 * faz a tabela rolar na horizontal em tela estreita em vez de espremer a coluna livre.
 */
.apollo-tabela-fixa { table-layout: fixed; }
/* Com largura fixa o texto longo precisa de reticências (o table-nowrap dá o
 * white-space). A última coluna fica de fora: é a das ações, que hospeda o menu "⋮". */
.apollo-tabela-fixa > tbody > tr > td { overflow: hidden; text-overflow: ellipsis; }
.apollo-tabela-fixa > tbody > tr > td:last-child { overflow: visible; }
/* Largura reservada para a seta de ordenação: ela troca de coluna a cada clique e, sem
 * espaço fixo, a coluna que a perde encolhe enquanto a que a ganha se alarga. */
.apollo-tabela-fixa .th-sort-icon { display: inline-block; width: 1em; text-align: center; }

/*
 * Listagens em monitor pequeno (≤1366px ou altura ≤800px — 21" / 1366x768).
 * 24" Full HD (~1920x1080) não entra aqui.
 */
@media (max-width: 1366px), (max-height: 800px) {
    /* Usa as laterais (tema limita o conteúdo a 90%) */
    [data-layout="horizontal"] .page-content > .container-fluid {
        max-width: 100% !important;
        padding-left: 0.75rem;
        padding-right: 0.75rem;
    }

    .page-title-box {
        padding-top: 0.12rem !important;
        padding-bottom: 0.12rem !important;
    }
    .page-title-box h4 {
        font-size: 1rem !important;
        line-height: 1.25 !important;
    }
    .row.mb-3:has(.page-title-box) {
        margin-bottom: 0.45rem !important;
    }

    [id$="ListBlock"] .card > .card-header,
    [id$="ListagemBlock"] .card > .card-header {
        padding-top: 0.4rem;
        padding-bottom: 0.4rem;
    }
    [id$="ListBlock"] .card > .card-header .card-title,
    [id$="ListagemBlock"] .card > .card-header .card-title {
        display: none;
    }
    [id$="ListBlock"] .card > .card-header > .d-flex,
    [id$="ListagemBlock"] .card > .card-header > .d-flex {
        justify-content: flex-end;
        width: 100%;
    }
    [id$="ListBlock"] .card > .card-header .flex-shrink-0,
    [id$="ListagemBlock"] .card > .card-header .flex-shrink-0 {
        margin-left: auto;
    }
    [id$="ListBlock"] .card > .card-header .btn,
    [id$="ListagemBlock"] .card > .card-header .btn {
        padding: 0.2rem 0.5rem;
        font-size: 0.75rem;
    }
    [id$="ListBlock"] .card-body.border.border-dashed,
    [id$="ListagemBlock"] .card-body.border.border-dashed {
        padding-top: 0.45rem !important;
        padding-bottom: 0.45rem !important;
    }

    .table-responsive.table-card {
        max-height: calc(100dvh - 14rem);
    }
    .table-responsive.table-card table {
        font-size: 0.8125rem;
    }
    .table-responsive.table-card tbody td:not(.text-end):not(.text-center) {
        max-width: 200px;
        overflow: hidden;
        text-overflow: ellipsis;
        white-space: nowrap;
    }
}

/*
 * ── Modal de prévia da Requisição de Peças ──
 *
 * Layout mora aqui, e o HTML em Apollo.PrintAgent.previaRequisicao, porque a MESMA prévia
 * é aberta pela listagem de vendas e pelo formulário da venda. As duas cópias já viveram
 * soltas em venda-index.js e venda-form.js — mexer numa e esquecer a outra é exatamente o
 * que fazia as telas saírem do lugar.
 */
/* As medidas seguem os modais da casa (partials/modal_frm/_estilos): gutter de 20px,
   cabeçalho e rodapé separados por uma borda #EEF2F7. O Swal não tem header/body/footer
   próprios, então o espaçamento é dado pelas faixas .apollo-req-cab / -corpo / swal2-actions
   — daí o padding do popup ser zero. */
.apollo-req-popup { border-radius: 1rem; padding: 0; }
.apollo-req-popup .swal2-html-container { margin: 0; padding: 0; text-align: left; overflow: visible; }
.apollo-req-popup .swal2-close { font-size: 1.75rem; color: #98a2b3; margin: .4rem .5rem 0 0; }
.apollo-req-popup .swal2-close:focus { box-shadow: none; }

.apollo-req-cab {
    display: flex; align-items: flex-start; gap: 1rem;
    /* Direita maior: é onde o × do Swal fica sobreposto ao canto. */
    padding: 1.25rem 3rem 1.15rem 1.25rem;
    border-bottom: 1px solid #eef2f7;
}
.apollo-req-ico {
    flex: 0 0 3.25rem;
    height: 3.25rem;
    display: inline-flex; align-items: center; justify-content: center;
    border-radius: .875rem;
    background: #e9f0fe;
    color: #1c2d5a;
    font-size: 1.55rem;
}
.apollo-req-tit { min-width: 0; }
.apollo-req-tit strong { display: block; font-size: 1.4rem; font-weight: 700; color: #16233f; line-height: 1.3; }
.apollo-req-tit small { display: block; margin-top: .3rem; font-size: .95rem; color: #7b8499; }
/* A arte é decorativa: encolhe antes de qualquer coisa e some no celular, onde ela
   roubaria a largura da tabela, que é o conteúdo real do modal. Também não manda na altura
   do cabeçalho — grande demais, ela abria um vão sob o título. */
.apollo-req-arte { width: 5.5rem; max-width: 22%; margin-left: auto; align-self: center; }

/* Corpo — o equivalente ao .modal-body dos modais da casa. */
.apollo-req-corpo { padding: 1.25rem; }

.apollo-req-grade {
    border: 1px solid #e6e9f0;
    border-radius: .625rem;
    overflow: auto;
    max-height: 21rem;
}
.apollo-req-grade table { width: 100%; margin: 0; font-size: .9rem; border-collapse: separate; border-spacing: 0; }
.apollo-req-grade thead th {
    position: sticky; top: 0; z-index: 1;
    background: #f5f7fa;
    color: #16233f;
    font-weight: 600;
    white-space: nowrap;
    padding: .7rem .75rem;
    border-bottom: 1px solid #e6e9f0;
}
.apollo-req-grade tbody td { padding: .7rem .75rem; color: #2a3547; border-top: 1px solid #edf0f5; }
.apollo-req-grade thead th:not(:last-child),
.apollo-req-grade tbody td:not(:last-child) { border-right: 1px solid #edf0f5; }
.apollo-req-grade tbody tr:first-child td { border-top: 0; }

.apollo-req-nota {
    display: flex; align-items: flex-start; gap: .6rem;
    margin-top: 1.1rem;
    padding: .9rem 1rem;
    border-radius: .625rem;
    background: #eaf2fe;
    color: #3f6ad8;
    font-size: .875rem;
    line-height: 1.45;
}
.apollo-req-nota i { font-size: 1.1rem; line-height: 1.3; }

/* Rodapé: mesma faixa dos modais da casa (.cx-frm-rodape — borda em cima e 14px/20px). */
.apollo-req-popup .swal2-actions {
    margin: 0; gap: .75rem;
    padding: 1rem 1.25rem;
    border-top: 1px solid #eef2f7;
}
.apollo-req-popup .apollo-req-ok,
.apollo-req-popup .apollo-req-cancel { padding: .7rem 1.6rem; font-size: 1rem; font-weight: 600; border-radius: .5rem; }
.apollo-req-popup .apollo-req-ok i { vertical-align: -2px; margin-right: .4rem; }
/* Cancelar é neutro: a ação destacada é Imprimir, e um cinza chapado ao lado do verde
   fazia os dois competirem. */
.apollo-req-popup .apollo-req-cancel {
    background: #fff;
    color: #2a3547;
    border: 1px solid #d7dbe3;
}
.apollo-req-popup .apollo-req-cancel:hover { background: #f5f7fa; }

@media (max-width: 575.98px) {
    .apollo-req-arte { display: none; }
    .apollo-req-tit strong { font-size: 1.2rem; }
    /* Em tela estreita o gutter encolhe, senão sobra pouca largura para a tabela — que é o
       conteúdo real do modal. */
    .apollo-req-cab { padding: 1rem 2.75rem .95rem 1rem; }
    .apollo-req-corpo { padding: 1rem; }
    .apollo-req-popup .swal2-actions { padding: .85rem 1rem; }
}

/* Borda preta nos checkboxes DESMARCADOS. A borda clara padrão do Bootstrap some em
   alguns monitores e o usuário não enxerga onde marcar; quando marcado o preenchimento
   já deixa claro o estado, então a borda sai. Switches (.form-switch) ficam de fora — o
   trilho deles já é visível por si só. */
.form-check-input[type="checkbox"]:not(:checked):not(.form-switch *),
input[type="checkbox"]:not(:checked):not(.form-check-input):not(.form-switch *) {
    border: 1px solid #000 !important;
}
/* Checkbox nativo (sem .form-check-input) ignora border no Chrome/Edge — só o outline aparece. */
input[type="checkbox"]:not(:checked):not(.form-check-input):not(.form-switch *) {
    outline: 1px solid #000;
    outline-offset: 0;
}
