/*
 * Base structure
 */

html,
body {
    height: 100%;
}

body {
    display: flex;
    flex-direction: column;
}

.cover-container {
    flex: 1;
}

.cover-container > nav {
    flex: none;
}
.cover-container > .container {
    flex: 1 0 auto;
}
.cover-container > footer {
    flex: none;
}

/*
 * Navbar
 */
.navbar {
    min-height: 60px;
}

.lang-flag-toggle {
    width: 24px;
    height: 16px;
    object-fit: contain;
    vertical-align: middle;
}

.lang-flag-item {
    width: 21px;
    height: 14px;
    object-fit: contain;
    vertical-align: middle;
}

/**
 * Navbar active link
 */

.navbar .nav-link.active {
    font-weight: 600;
}

/**
 * Social Buttons
 */
.btn-social:hover {
    opacity: 0.85;
    text-decoration: none;
}

.btn-facebook, .btn-facebook:hover {
    color: #3B5998;
}

.btn-twitter, .btn-twitter:hover {
    color: #55ACEE;
}

.btn-google, .btn-google:hover {
    color: #dd4b39;
}

/**
 * Login Page Form Wrapper
 */
.form-wrapper { display: none; }
.form-wrapper.active { display: block; }

/**
 * Misc
 */

.page-header small {
    font-size: 1rem;
}

.blockquote {
    font-size: 1rem;
}

.table th {
    font-size: 0.85rem;
    color: var(--bs-secondary-color);
}

.dropdown-item i {
    color: var(--bs-secondary-color);
}

label .required {
    color: #a00;
}

.table-responsive {
    min-height: 200px;
}

dt {
    font-weight: 400 !important;
}

dd {
    font-weight: 700;
}

/**
 * DataTables — padding nos controles (busca, paginação, info)
 * mantém a tabela edge-to-edge dentro do card-body p-0
 */
div.dataTables_wrapper div.dataTables_length,
div.dataTables_wrapper div.dataTables_filter,
div.dataTables_wrapper div.dataTables_info,
div.dataTables_wrapper div.dataTables_paginate {
    padding: 0.65rem 1rem;
}

/**
 * Botões de AÇÃO dentro das tabelas (editar / excluir / ver / dropdown) —
 * alvos de toque maiores (~44px) p/ uso em tela touch COM LUVAS no chão de
 * fábrica. Vale em todas as telas (app.css é global). Sobrepõe o .btn-sm só
 * dentro de <td>; não afeta botões de modal, navbar ou toolbar do card.
 */
.table td .btn,
.table td .btn-sm {
    min-height: 44px;
    min-width: 44px;
    padding: 0.45rem 0.85rem;
    font-size: 0.95rem;
    display: inline-flex;
    align-items: center;
    justify-content: center;
}
.table td .btn i {
    font-size: 1.05rem;
}
.table td .btn-group {
    flex-wrap: nowrap;
}
/* Itens dos dropdowns de ação das linhas (ex.: ver / excluir) */
.table td .dropdown-item {
    min-height: 44px;
    padding: 0.6rem 1rem;
    font-size: 1rem;
    display: flex;
    align-items: center;
}
.table td .dropdown-item i {
    font-size: 1.05rem;
}

/**
 * Responsive CSS Rules
 */

@media (min-width : 992px) {
    .table-responsive {
        overflow-x: visible;
    }
}

/* O esqueleto canônico do projeto põe o <form> entre .modal-content e
   .modal-body/.modal-footer. Quando a altura do .modal-content é travada — em
   modal-dialog-scrollable (qualquer largura) e em modal-fullscreen-sm-down
   (<576px) — o form vira flex item que não encolhe e interrompe a cadeia flex:
   o body não rola e o .modal-content (overflow:hidden) CORTA o footer com o
   botão de salvar. Caso real 25/09/2026: a Baixa de título no fin_faturamento
   ficou sem o botão "Baixar" em tela de notebook. display:contents devolve
   header/body/footer ao flex do .modal-content. Os style="display:contents"
   pontuais em empresas.php, ar_materiais.php etc. são anteriores a esta regra. */
.modal-dialog-scrollable .modal-content > form { display: contents; }
@media (max-width: 575.98px) {
    .modal-fullscreen-sm-down .modal-content > form { display: contents; }
}

/* Toasts (AS.Util.showAlert): no mobile o container top-0 cobria a navbar sticky
   por até 8s (erros). Desce pra baixo da navbar; --navbar-h vem do header.php,
   56px é o fallback. !important porque o .top-0 do Bootstrap também é. */
@media (max-width: 575.98px) {
    #as-toast-container {
        top: calc(var(--navbar-h, 56px) + 8px) !important;
    }
}

/* ============================================================================
   crm_clientes.php no celular (< md).

   A tela nasceu desktop-first: 9 cards de segmento em .col auto-width e uma
   tabela de 11 colunas com scroll horizontal. No celular isso virava uma faixa
   de números ilegíveis e uma tabela que só andava de lado. Aqui:
     - os cards de segmento viram uma faixa rolável com snap;
     - cada <tr> da DataTable vira um cartão, com o rótulo da coluna injetado
       por JS (data-label) — a tabela continua sendo uma DataTable, então busca,
       paginação e filtros seguem funcionando.
   O thead some, por isso crm_clientes.php expõe um select "Ordenar por".
   ========================================================================== */
@media (max-width: 767.98px) {
    #crm-seg-cards {
        flex-wrap: nowrap;
        overflow-x: auto;
        scroll-snap-type: x proximity;
        -webkit-overflow-scrolling: touch;
    }
    #crm-seg-cards > .col {
        flex: 0 0 46%;
        scroll-snap-align: start;
    }

    /* O título carrega o seletor "Cadastrados de [data] até [data]" (2 inputs de
       150px). Com flex-shrink-0 ele não encolhia e empurrava a página pra 576px
       de largura num viewport de 390. */
    #crm-card-title {
        flex-shrink: 1 !important;
        min-width: 0;
    }
    #crm-novos-selector {
        width: 100%;
        margin-left: 0 !important;
    }
    #crm-novos-selector input[type="date"] {
        flex: 1 1 8rem;
        width: auto !important;
        min-width: 0;
    }

    #crm-table thead { display: none; }
    #crm-table,
    #crm-table tbody,
    #crm-table tr,
    #crm-table td { display: block; width: 100%; }

    /* !important: o autoWidth do DataTables grava style="width:1153px" inline na
       <table>, que venceria a regra acima e estouraria a página na horizontal. */
    #crm-table {
        width: 100% !important;
        min-width: 0 !important;
    }

    #crm-table tr {
        border: 1px solid var(--bs-border-color);
        border-radius: .5rem;
        margin-bottom: .625rem;
        padding: .625rem .75rem;
        background-color: var(--bs-body-bg);
    }
    /* "Nenhum registro" da DataTable não deve virar cartão. */
    #crm-table tr.dataTables_empty,
    #crm-table td.dataTables_empty { border: 0; text-align: center !important; }

    #crm-table td {
        border: 0;
        padding: .2rem 0;
        text-align: left !important;
        white-space: normal;
    }
    #crm-table td[data-label]::before {
        content: attr(data-label) ": ";
        font-weight: 600;
        color: var(--bs-secondary-color);
        font-size: .8125rem;
    }

    /* Nome = título do cartão (sem rótulo). */
    #crm-table td.crm-cell-nome::before { content: none; }
    #crm-table td.crm-cell-nome {
        font-size: 1.0625rem;
        line-height: 1.25;
        margin-bottom: .35rem;
    }

    /* Seleção em massa é fluxo de desktop — o checkbox só ocuparia espaço. */
    #crm-table td.crm-cell-hide-sm { display: none !important; }

    #crm-table td.crm-cell-acoes {
        text-align: right !important;
        padding-top: .5rem;
        border-top: 1px dashed var(--bs-border-color);
        margin-top: .35rem;
    }
    #crm-table td.crm-cell-acoes::before { content: none; }
}

/* Utilitário que o Bootstrap 5 NÃO traz: flex item só encolhe (e o
 * text-truncate só trunca) com min-width:0. Usado nas listas flex do CRM
 * (leads, clínicas, legenda do rastreamento, picker de roteiro). */
.min-w-0 { min-width: 0 !important; }

/* Barra de seção do financeiro (templates/_fin_subnav.php, 16/10/2026): o nome do espaço, a
 * lista de telas e um canto fixo (Cadastros + o link do outro espaço). Fonte de 14 px porque a
 * operação inteira precisa caber numa linha em 1366 px com a barra de rolagem do Windows — com
 * 16 px ela estourava 72 px depois de a fonte carregar e o link "Gestão" saía cortado. Numa tela
 * mais estreita só a lista rola; o canto fica. Trava: tools/smoke_fin_espacos_browser.py. */
.fin-subnav .nav-link { font-size: .875rem; padding: .25rem .5rem; }
.fin-subnav-espaco { font-size: .75rem; letter-spacing: .03em; }
.fin-subnav-telas { overflow-x: auto; scrollbar-width: thin; }
/* Há telas fora da vista: a borda daquele lado esmaece (_fin_subnav.php, sombra()). */
.fin-subnav-telas.fin-subnav-mais-dir { -webkit-mask-image: linear-gradient(to right, #000 calc(100% - 2.5rem), transparent); mask-image: linear-gradient(to right, #000 calc(100% - 2.5rem), transparent); }
.fin-subnav-telas.fin-subnav-mais-esq { -webkit-mask-image: linear-gradient(to left, #000 calc(100% - 2.5rem), transparent); mask-image: linear-gradient(to left, #000 calc(100% - 2.5rem), transparent); }
.fin-subnav-telas.fin-subnav-mais-esq.fin-subnav-mais-dir { -webkit-mask-image: linear-gradient(to right, transparent, #000 2.5rem, #000 calc(100% - 2.5rem), transparent); mask-image: linear-gradient(to right, transparent, #000 2.5rem, #000 calc(100% - 2.5rem), transparent); }

/* Dentro do acordeão do relatório de visitas a tabela é curta por natureza (um
   vendedor pode ter 2 visitas no período) — o min-height global de
   .table-responsive deixaria um vão branco embaixo de cada bloco. */
#vis-acordeao .table-responsive { min-height: 0; }

/* ==========================================================================
   AS.Install — banner de convite de instalação do PWA (common.js).
   z-index 1040: acima do conteúdo, abaixo do modal-backdrop (1050) — o
   banner nunca cobre um modal aberto. safe-area: iPhone sem botão físico.
   Variáveis --bs-*: tema escuro (data-bs-theme) resolve sozinho.
   ========================================================================== */
.as-install-banner {
    position: fixed;
    left: .75rem;
    right: .75rem;
    bottom: calc(.75rem + env(safe-area-inset-bottom, 0px));
    z-index: 1040;
    display: flex;
    align-items: center;
    gap: .75rem;
    padding: .75rem;
    background-color: var(--bs-body-bg);
    border: 1px solid var(--bs-border-color);
    border-radius: .75rem;
}
.as-install-icon {
    width: 44px;
    height: 44px;
    border-radius: .625rem;
    flex-shrink: 0;
}
.as-install-text {
    flex: 1 1 auto;
    min-width: 0;
    display: flex;
    flex-direction: column;
    line-height: 1.25;
}
.as-install-text span {
    color: var(--bs-secondary-color);
    font-size: .85rem;
}
.as-install-banner .as-install-cta { white-space: nowrap; }
/* Desktop (convite pós-login): cartão no canto, não uma faixa de borda a borda. */
@media (min-width: 768px) {
    .as-install-banner { left: auto; right: 1.25rem; max-width: 440px; }
}

/* Com o banner visível, o launcher do assistente sobe pra não ficar coberto. */
body.has-install-banner #asst-launcher { bottom: 96px; }

/* ===========================================================================
   AS.Periodo — filtro de período padrão: dois <input type="date"> De/Até
   (common.js + templates/_periodo_filtro.php). O calendário é o do navegador,
   e o tema escuro vem do color-scheme que o Bootstrap aplica em
   [data-bs-theme=dark] — não há tema a mapear.
   Largura fixa: sem ela o type=date encolhe numa coluna estreita e corta o ano.
   =========================================================================== */
.as-periodo .as-periodo-de,
.as-periodo .as-periodo-ate { width: 9.25rem; }
.as-periodo-compacto .as-periodo-de,
.as-periodo-compacto .as-periodo-ate { width: 100%; min-width: 8.5rem; }
/* Linha do motivo do erro, dentro do container compacto: some sem erro (não abre
   espaço no <th>) e quebra linha em vez de alargar a coluna. */
.as-periodo-compacto .as-periodo-msg:empty { display: none; }
.as-periodo-compacto .as-periodo-msg { line-height: 1.2; white-space: normal; }
/* Variante "linha" ($pfLinha): De/Até SEMPRE lado a lado, elásticos na largura da
   coluna — a coluna de filtros da fin_conferencia, onde a largura fixa jogava o Até
   para a linha de baixo. O padding menor é o que faz "dd/mm/aaaa" + o calendário
   caberem numa coluna de ~280px; o conector e o × não encolhem. */
.as-periodo-linha { flex-wrap: nowrap; }
.as-periodo-linha .as-periodo-de,
.as-periodo-linha .as-periodo-ate { flex: 1 1 0; width: auto; min-width: 0; padding-left: .4rem; padding-right: .3rem; }
.as-periodo-linha .as-periodo-conector,
.as-periodo-linha .btn { flex: 0 0 auto; }
/* A cor do texto é explícita: o .active do btn-outline-secondary pinta a letra de
   branco, que no tema claro sumia no fundo cinza-claro. */
.as-periodo-atalhos .btn.active {
    color: var(--bs-emphasis-color);
    background-color: var(--bs-secondary-bg);
    border-color: var(--bs-secondary);
}

/* Select2 (AS.Util.select2) — o tema select2-bootstrap-5-theme é compilado só
   com as cores CLARAS do Bootstrap; no escuro remapeamos pros vars --bs-*.
   O gate [data-bs-theme] também dá a especificidade extra necessária, já que
   o CSS do tema carrega DEPOIS do app.css (include por página, no body). */
/* Select2 dentro de .input-group (contraparte + lápis da janela do título, fornecedor + "novo" do lançamento):
   sem isto o container ocupa 100% e o botão do grupo cai para a linha de baixo (16/10/2026). */
.input-group > .select2-container { flex: 1 1 auto; width: 1% !important; min-width: 0; }
.input-group > .select2-container:not(:last-child) .select2-selection { border-top-right-radius: 0; border-bottom-right-radius: 0; }
.input-group > .select2-container:not(:first-child) .select2-selection { border-top-left-radius: 0; border-bottom-left-radius: 0; }
[data-bs-theme="dark"] .select2-container--bootstrap-5 .select2-selection {
    background-color: var(--bs-body-bg);
    border-color: var(--bs-border-color);
    color: var(--bs-body-color);
}
[data-bs-theme="dark"] .select2-container--bootstrap-5 .select2-selection--single .select2-selection__rendered,
[data-bs-theme="dark"] .select2-container--bootstrap-5 .select2-results__option {
    color: var(--bs-body-color);
}
[data-bs-theme="dark"] .select2-container--bootstrap-5 .select2-selection__placeholder {
    color: var(--bs-secondary-color);
}
[data-bs-theme="dark"] .select2-container--bootstrap-5 .select2-dropdown {
    background-color: var(--bs-body-bg);
    border-color: var(--bs-border-color);
    color: var(--bs-body-color);
}
[data-bs-theme="dark"] .select2-container--bootstrap-5 .select2-dropdown .select2-search .select2-search__field {
    background-color: var(--bs-body-bg);
    border-color: var(--bs-border-color);
    color: var(--bs-body-color);
}
/* Cadeia espelha o seletor do tema (que tem (0,5,0)) — versao mais curta perde no empate. */
[data-bs-theme="dark"] .select2-container--bootstrap-5 .select2-dropdown .select2-results__options .select2-results__option.select2-results__option--highlighted {
    color: var(--bs-body-color);
    background-color: var(--bs-tertiary-bg);
}
/* Opcao selecionada continua azul --bs-primary do proprio tema (funciona nos 2 temas). */
/* Chip do select MULTIPLO: o tema crava color:#212529 sem fundo — no escuro o chip
   ficava vazio (texto escuro sobre fundo escuro; Óticas liberadas, 02/10/2026). */
[data-bs-theme="dark"] .select2-container--bootstrap-5 .select2-selection--multiple .select2-selection__rendered .select2-selection__choice {
    color: var(--bs-body-color);
    background-color: var(--bs-tertiary-bg);
    border-color: var(--bs-border-color);
}
[data-bs-theme="dark"] .select2-container--bootstrap-5 .select2-selection--multiple .select2-search .select2-search__field {
    color: var(--bs-body-color);
}
/* Desabilitado: o tema crava #e9ecef (0,3,0, carregado depois) — no escuro virava faixa clara com
   texto claro (janela do título pago, 27/10/2026). Mesmo fundo do .form-control:disabled. */
[data-bs-theme="dark"] .select2-container--bootstrap-5.select2-container--disabled .select2-selection {
    background-color: var(--bs-secondary-bg);
    border-color: var(--bs-border-color);
    color: var(--bs-body-color);
}

/* ===== Destaques da OS: URGENTE e SEM MEDIDAS (18/09/2026) =====================
   Um visual para toda lista/ficha — quem marca é AS.Util.osDestacarLinha (common.js)
   e templates/_os_destaques.php. A faixa lateral vai na 1ª célula (tr não aceita
   border-left com border-collapse); o fundo usa as vars do Bootstrap e por isso
   funciona nos dois temas. Urgente vence sem-medidas quando os dois valem. */
tr.os-sem-medidas > td { background-color: rgba(var(--bs-warning-rgb), .10) !important; }
tr.os-sem-medidas > td:first-child { box-shadow: inset 4px 0 0 var(--bs-warning); }
tr.os-urgente > td { background-color: rgba(var(--bs-danger-rgb), .09) !important; }
tr.os-urgente > td:first-child { box-shadow: inset 4px 0 0 var(--bs-danger); }
.os-selo-urgente, .os-selo-sem-medidas { font-size: .72rem; letter-spacing: .03em; }
.os-selo-urgente { animation: os-urgente-pulso 1.8s ease-in-out infinite; }
@keyframes os-urgente-pulso { 0%, 100% { box-shadow: 0 0 0 0 rgba(var(--bs-danger-rgb), .45); } 50% { box-shadow: 0 0 0 5px rgba(var(--bs-danger-rgb), 0); } }
@media (prefers-reduced-motion: reduce) { .os-selo-urgente { animation: none; } }
.kanban-card.os-sem-medidas { border-left-color: var(--bs-warning); }

/* ===== AS.Lista (common.js): seleção + menu do botão direito (23/09/2026) =========
   Selecionada = o `--bs-table-bg-state` do próprio Bootstrap (o mecanismo do
   .table-active): acompanha zebrado, hover e os dois temas sem cor fixa. O seletor
   tem um elemento a mais que o `.table-hover > tbody > tr:hover > *` para a linha
   selecionada não "apagar" quando o mouse passa por cima.
   Faixa azul na 1ª célula, SOMADA ao fundo (nunca trocando-o): no modo 'linha' toda
   selecionada leva a faixa (a seleção É o que o operador aponta); no modo 'caixa' só
   o foco — a âncora das setas e do Shift —, porque a caixa marcada já diz o resto.
   Sem `user-select: none`: o nº da OS/NF segue copiável no arraste (o componente só
   cancela o mousedown de Shift/Ctrl/duplo clique, que selecionariam texto). */
/* 20/10/2026 (dono: "se a setinha virar um mouse ao passar por cima da lista, pra o usuário saber que pode clicar
   com o botão direito?"): seta + mouse com o botão direito aceso (assets/img/cursor-menu.svg, ponta em 1,1). Vale para
   TODA lista do AS.Lista; a linha de grupo (sem dado, sem menu) fica na seta comum. Quem não desenha cursor SVG cai
   na mão (pointer). Especificidade acima de .as-clicavel (rowClickAction), que só diz "clicável". */
.as-lista tbody > tr { cursor: url("../img/cursor-menu.svg") 1 1, pointer; }
.as-lista tbody > tr.as-grupo { cursor: default; }
/* AS.Util.rowClickAction: linha com ação primária (classe, não estilo inline, para a lista acima poder vencer). */
.as-clicavel { cursor: pointer; }
/* O scrollIntoView das setas respeita scroll-margin: sem isto a linha apontada ficava
   inteira por baixo da navbar presa (subindo) ou do rodapé preso da lista (descendo). */
.as-lista tbody > tr { scroll-margin-top: calc(var(--navbar-h, 56px) + 3.5rem); scroll-margin-bottom: 4.5rem; }
.as-lista:focus { outline: none; }
/* 19/10/2026: o foco por teclado na lista precisa aparecer (o clique segue sem anel). */
.as-lista:focus-visible { outline: 2px solid var(--bs-primary); outline-offset: -2px; }
table.as-lista > tbody > tr.as-lista-sel > *,
.as-lista table > tbody > tr.as-lista-sel > * { --bs-table-bg-state: rgba(var(--bs-primary-rgb), .16); }
table.as-lista > tbody > tr.as-lista-sel:hover > *,
.as-lista table > tbody > tr.as-lista-sel:hover > * { --bs-table-bg-state: rgba(var(--bs-primary-rgb), .24); }
table.as-lista-linha > tbody > tr.as-lista-sel > :first-child,
.as-lista-linha table > tbody > tr.as-lista-sel > :first-child,
table.as-lista-caixa > tbody > tr.as-lista-foco > :first-child,
.as-lista-caixa table > tbody > tr.as-lista-foco > :first-child {
    box-shadow: inset 3px 0 0 var(--bs-primary),
                inset 0 0 0 9999px var(--bs-table-bg-state, var(--bs-table-bg-type, var(--bs-table-accent-bg)));
}
/* Linha URGENTE / SEM MEDIDAS (AS.Util.osDestacarLinha) selecionada: a 1ª célula
   soma as três camadas — a faixa do destaque, a da seleção logo depois e o tom. Sem
   isto uma sombra apagava a outra (a urgência sumia da selecionada, ou o tom sumia
   da célula do número). */
.as-lista tr.as-lista-sel.os-sem-medidas > :first-child {
    box-shadow: inset 4px 0 0 var(--bs-warning), inset 0 0 0 9999px var(--bs-table-bg-state, transparent);
}
.as-lista tr.as-lista-sel.os-urgente > :first-child {
    box-shadow: inset 4px 0 0 var(--bs-danger), inset 0 0 0 9999px var(--bs-table-bg-state, transparent);
}
.as-lista-linha tr.as-lista-sel.os-sem-medidas > :first-child,
.as-lista-caixa tr.as-lista-foco.os-sem-medidas > :first-child {
    box-shadow: inset 4px 0 0 var(--bs-warning), inset 7px 0 0 var(--bs-primary),
                inset 0 0 0 9999px var(--bs-table-bg-state, transparent);
}
.as-lista-linha tr.as-lista-sel.os-urgente > :first-child,
.as-lista-caixa tr.as-lista-foco.os-urgente > :first-child {
    box-shadow: inset 4px 0 0 var(--bs-danger), inset 7px 0 0 var(--bs-primary),
                inset 0 0 0 9999px var(--bs-table-bg-state, transparent);
}
.as-lista-ctx { position: fixed; z-index: 1080; min-width: 230px; max-width: 360px;
                max-height: calc(100vh - 8px); overflow-y: auto; }
.as-lista-ctx .dropdown-item.disabled { white-space: normal; }

/* ===== Dica (AS.Util.dicaTexto / .as-dica, common.js): o porquê atrás de um ⓘ ===== */
.as-dica { color: var(--bs-secondary-color); cursor: help; }
.as-dica:hover, .as-dica:focus { color: var(--bs-primary); outline: none; }
.as-dica:focus-visible { outline: 2px solid var(--bs-primary); outline-offset: 2px; border-radius: 50%; }
.as-dica-tip .tooltip-inner { max-width: 340px; text-align: left; white-space: pre-line; }

/* ===== Campo em CAIXA ALTA (AS.Util.caixaAlta, common.js): o helper grava maiúsculo ao digitar;
   o CSS cobre o valor posto por código (edição, OCR, prefill) antes de qualquer tecla. ===== */
.as-caixa-alta { text-transform: uppercase; }
.as-caixa-alta::placeholder { text-transform: none; }
/* Campo monetário padrão (.as-moeda, common.js): dinheiro alinha à direita, como na máscara. */
.as-moeda { text-align: right; }

/* Perfil com os valores do laboratório ocultos (ASValorLabVisibilidade, migr 506): some o LUGAR
   do valor. O valor em si o servidor já não mandou. */
body.valores-lab-ocultos .valor-lab { display: none !important; }

/* ===== Seção colapsável (AS.Secao, common.js): uma linha por assunto, o número no cabeçalho =====
   Nasceu no fin_hub (06/10/2026). A seção fechada é a LINHA do cabeçalho: seta, título, resumo
   em cinza com os números em preto. Sem cartão, sem sombra — a régua de cima separa os assuntos. */
.as-secao { border-top: 1px solid var(--bs-border-color); }
.as-secao-cab {
    display: flex; align-items: center; gap: .75rem; margin: 0; padding: .55rem 0;
    font-size: .92rem; font-weight: 600; line-height: 1.3; min-height: 2.6rem;
}
.as-secao-btn {
    display: flex; align-items: center; gap: .6rem; flex: 1 1 auto; min-width: 0;
    background: none; border: 0; padding: 0; margin: 0; color: inherit; font: inherit;
    text-align: left; cursor: pointer;
}
.as-secao-btn:focus-visible { outline: 2px solid var(--bs-primary); outline-offset: 4px; border-radius: .25rem; }
.as-secao-seta { width: .9rem; font-size: .68rem; color: var(--bs-secondary-color); transition: transform .15s ease; flex: none; }
.as-secao-aberta > .as-secao-cab .as-secao-seta { transform: rotate(90deg); }
.as-secao-titulo { flex: none; white-space: nowrap; }
.as-secao-titulo > .fa-solid, .as-secao-titulo > .fa-regular { color: var(--bs-secondary-color); }
.as-secao-resumo {
    font-weight: 400; color: var(--bs-secondary-color); min-width: 0; overflow: hidden;
    text-overflow: ellipsis; white-space: nowrap; font-variant-numeric: tabular-nums;
}
.as-secao-resumo:empty { display: none; }
/* Aberta, o corpo já mostra o número: o resumo some para não dizer tudo duas vezes.
   `.as-secao-resumo-fixo` fica sempre (o semáforo da Saúde é o estado, não um resumo). */
.as-secao-aberta > .as-secao-cab .as-secao-resumo:not(.as-secao-resumo-fixo) { display: none; }
.as-secao-resumo strong { color: var(--bs-body-color); font-weight: 600; }
.as-secao-resumo .badge { vertical-align: baseline; }
.as-secao-acoes { flex: none; display: flex; align-items: center; gap: .5rem; font-weight: 400; }
.as-secao-corpo { padding: .15rem 0 1rem; }
.as-secao-sub { border-top: 1px dashed var(--bs-border-color); margin-top: .5rem; }
.as-secao-sub > .as-secao-cab { font-size: .85rem; font-weight: 500; min-height: 2.2rem; padding: .35rem 0; }
/* Mini barra de progresso no resumo (meta do mês). */
.as-secao-barra {
    display: inline-block; width: 72px; height: 6px; border-radius: 3px; vertical-align: middle;
    background: var(--bs-secondary-bg); overflow: hidden;
}
.as-secao-barra > span { display: block; height: 100%; border-radius: 3px; }
@media (prefers-reduced-motion: reduce) { .as-secao-seta { transition: none; } }
@media (max-width: 575.98px) {
    .as-secao-cab { flex-wrap: wrap; }
    .as-secao-resumo { white-space: normal; flex-basis: 100%; padding-left: 1.5rem; }
}

/* ===== Tile de posição (fin_hub): rótulo pequeno, número, uma linha de contexto. Sem caixa de
   ícone — o número é o que se lê. A borda esquerda é o canal de ESTADO (AS.Util.aplicaTom): as
   classes border-<tom> do Bootstrap pintam os quatro lados, aqui só o esquerdo conta. ===== */
.as-tile {
    display: block; height: 100%; padding: .55rem .85rem .6rem;
    border: 1px solid var(--bs-border-color); border-left-width: 4px; border-radius: .375rem;
    background: var(--bs-body-bg); color: inherit; text-decoration: none; min-width: 0;
}
a.as-tile:hover, a.as-tile:focus-visible { color: inherit; background: var(--bs-tertiary-bg); outline: none; }
a.as-tile:focus-visible { box-shadow: 0 0 0 2px var(--bs-primary); }
.as-tile.border-success   { border-color: var(--bs-border-color) !important; border-left-color: var(--bs-success) !important; }
.as-tile.border-danger    { border-color: var(--bs-border-color) !important; border-left-color: var(--bs-danger) !important; }
.as-tile.border-warning   { border-color: var(--bs-border-color) !important; border-left-color: var(--bs-warning) !important; }
.as-tile.border-info      { border-color: var(--bs-border-color) !important; border-left-color: var(--bs-info) !important; }
.as-tile.border-primary   { border-color: var(--bs-border-color) !important; border-left-color: var(--bs-primary) !important; }
.as-tile.border-secondary { border-color: var(--bs-border-color) !important; }
.as-tile-rotulo { font-size: .74rem; color: var(--bs-secondary-color); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.as-tile-rotulo a { color: inherit; text-decoration: none; }
.as-tile-valor { font-size: 1.3rem; font-weight: 700; line-height: 1.15; margin-top: .1rem; font-variant-numeric: tabular-nums; white-space: nowrap; }
.as-tile-manchete .as-tile-valor { font-size: 1.6rem; }
.as-tile-sub { font-size: .74rem; color: var(--bs-secondary-color); margin-top: .2rem; line-height: 1.35; }
.as-tile-sub a { color: inherit; text-decoration: none; }
.as-tile-sub a:hover strong { text-decoration: underline; }
/* Tile que abre/fecha uma seção (data-alterna-secao): a setinha diz o estado. */
.as-tile-seta { display: inline-block; transition: transform .15s ease; }
@media (prefers-reduced-motion: reduce) { .as-tile-seta { transition: none; } }
[data-alterna-secao][aria-expanded="true"] .as-tile-seta { transform: rotate(180deg); }

/* ===== Contador (Recepção, 08/10/2026): faixa de UMA linha no lugar dos cards de KPI que
   empurravam a lista para fora da 1ª tela. É botão (o clique filtra a lista); a cor vem de
   --as-cor (style="--as-cor: var(--bs-warning)") e pinta a borda esquerda e o ícone. Quebra em
   no máximo 2 linhas de ~34 px em tela estreita / zoom alto, em vez de fileiras de 170 px. ===== */
/* Grade de colunas IGUAIS (dono, 08/10/2026: "porque não ficam lado a lado?"): numa linha só
   enquanto cabem 140 px por contador; abaixo disso quebra alinhada em colunas. O rótulo corta
   com reticências (o texto inteiro fica no title) e o número encosta à direita. */
.as-contadores { display: grid; grid-template-columns: repeat(auto-fit, minmax(var(--as-contador-min, 140px), 1fr)); gap: .4rem; margin-bottom: .75rem; }
.as-contadores > span { display: flex; min-width: 0; }
.as-contadores > span > .as-contador { flex: 1 1 auto; }
.as-contadores:not(:has(> :not(.d-none))) { display: none; }
/* Um chip sozinho (a ótica só tem "Urgentes em produção") não vira uma faixa de ponta a ponta. */
.as-contadores > :only-child { max-width: 20rem; }
.as-contador {
    --as-cor: var(--bs-secondary-color);
    display: flex; align-items: center; gap: .45rem; min-width: 0; min-height: 2.1rem; padding: .25rem .6rem;
    border: 1px solid var(--bs-border-color); border-left: 4px solid var(--as-cor); border-radius: .375rem;
    background: var(--bs-body-bg); color: var(--bs-body-color); font-size: .85rem; line-height: 1.2;
    white-space: nowrap; cursor: pointer;
    container-type: inline-size;   /* o selo secundário consulta a largura do próprio chip (abaixo) */
}
.as-contador:hover { background: var(--bs-tertiary-bg); }
.as-contador:focus-visible { outline: none; box-shadow: 0 0 0 2px var(--bs-primary); }
.as-contador.active { border-color: var(--as-cor); background: color-mix(in srgb, var(--as-cor) 16%, var(--bs-body-bg)); }
.as-contador-ic { color: var(--as-cor); }
.as-contador-rotulo { color: var(--bs-secondary-color); flex: 1 1 auto; min-width: 0; overflow: hidden; text-overflow: ellipsis; text-align: left; }
.as-contador-alerta > span { flex: 1 1 auto; min-width: 0; overflow: hidden; text-overflow: ellipsis; text-align: left; }
/* Selo secundário do chip (Recepção: "5 sem motivo (?)" em Pendências). O RÓTULO tem prioridade
   (dono, 15/10/2026: a 1366 px o chip saía "P… 45 [5 sem motivo (?)]"): o selo só aparece quando
   cabe INTEIRO ao lado do rótulo — medido: ícone + gaps + número + padding ≈ 81 px, rótulo 75, selo
   95 → 260 px com folga; abaixo disso some e o title do chip repete o número. Se ainda apertar
   (idioma mais longo, zoom), o selo encurta antes do rótulo (shrink 50× o dele). */
.as-contador .badge { display: none; flex: 0 50 auto; min-width: 0; overflow: hidden; text-overflow: ellipsis; }
@container (min-width: 260px) { .as-contador .badge { display: inline-block; } }
.as-contador.active .as-contador-rotulo { color: var(--bs-body-color); }
.as-contador-num { font-weight: 700; font-size: 1.05rem; font-variant-numeric: tabular-nums; }
/* Empilhado (valor em R$, que é largo): rótulo pequeno em cima, número embaixo — fin_conferencia. */
.as-contador-empilhado { flex-direction: column; align-items: stretch; gap: 0; padding: .3rem .65rem; text-align: left; }
.as-contador-empilhado .as-contador-rotulo { flex: none; font-size: .72rem; text-transform: uppercase; }
.as-contador-empilhado .as-contador-num { font-size: 1rem; line-height: 1.25; white-space: nowrap; }
/* Busca por texto suspende o recorte do contador aceso: ele fica esmaecido enquanto não vale. */
.as-contadores-suspenso .as-contador.active { opacity: .55; background: var(--bs-body-bg); }
/* Alerta (algo parado esperando alguém): fundo de aviso mesmo sem estar ativo. */
.as-contador-alerta { background: var(--bs-warning-bg-subtle); border-color: var(--bs-warning-border-subtle); color: var(--bs-warning-text-emphasis); }
.as-contador-alerta:hover { background: color-mix(in srgb, var(--bs-warning) 22%, var(--bs-body-bg)); }

/* Vitrine — tabela oficial do fabricante em grade (migr 594): cartão por produto com seta,
   célula com venda (em cima) e custo (embaixo), clicável para o detalhe. */
.vit-tf-cab { user-select: none; }
.vit-tf-cab:hover { background: var(--bs-tertiary-bg); }
.vit-tf-seta { transition: transform .15s ease; }
.vit-tf-cab:not(.collapsed) .vit-tf-seta { transform: rotate(90deg); }
.vit-tf-grade th[scope="row"] { min-width: 12rem; }
.vit-tf-grade td.vit-tf-cel { font-variant-numeric: tabular-nums; line-height: 1.15; }
.vit-tf-grade td.vit-tf-cel[role="button"]:hover { background: var(--bs-primary-bg-subtle); }


/* ---- Carregando (AS.Loading, common.js): a marca DiopLab enquanto o sistema processa ----
   Dois modos pelo data-modo: "discreto" (badge no canto inferior ESQUERDO, não bloqueia — AJAX
   > 400 ms; o canto direito é do #asst-launcher) e "bloqueante" (overlay — troca de página e
   operação pesada declarada pela tela). Cores pelos tokens da marca (marca.css), com o Bootstrap
   como reserva quando a marca está desligada. */
.as-loading { position: fixed; z-index: 10050; display: none; opacity: 0; transition: opacity .18s ease; pointer-events: none; }
.as-loading.is-visivel { display: flex; opacity: 1; }
.as-loading[data-modo="bloqueante"] { inset: 0; align-items: center; justify-content: center; pointer-events: auto; cursor: progress;
    background: color-mix(in srgb, var(--mk-ink, var(--bs-dark)) 58%, transparent); backdrop-filter: blur(2px); -webkit-backdrop-filter: blur(2px); }
.as-loading[data-modo="discreto"] { left: 1rem; bottom: 1rem; max-width: calc(100vw - 2rem); padding: .4rem .9rem .4rem .45rem; border-radius: 999px;
    background: var(--bs-body-bg); border: 1px solid var(--bs-border-color);
    box-shadow: 0 .5rem 1.25rem color-mix(in srgb, var(--mk-ink, var(--bs-dark)) 18%, transparent); }
.as-loading-caixa { display: flex; align-items: center; gap: .6rem; }
.as-loading[data-modo="bloqueante"] .as-loading-caixa { flex-direction: column; gap: 1.1rem; }
.as-loading-marca { position: relative; flex: 0 0 auto; width: 2.1rem; height: 2.1rem; }
.as-loading[data-modo="bloqueante"] .as-loading-marca { width: 5.75rem; height: 5.75rem; }
.as-loading-marca img { position: absolute; inset: 19%; width: 62%; height: 62%; display: block; border-radius: 23%;
    animation: as-loading-pulso 1.6s ease-in-out infinite; will-change: transform, opacity; }
.as-loading-anel { position: absolute; inset: 0; width: 100%; height: 100%; animation: as-loading-giro .9s linear infinite; will-change: transform; }
.as-loading-anel circle { fill: none; stroke: var(--mk-gold, var(--bs-primary)); stroke-width: 6; stroke-linecap: round; stroke-dasharray: 72 217; }
.as-loading-texto { font-size: .875rem; color: var(--bs-body-color); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.as-loading[data-modo="bloqueante"] .as-loading-texto { color: #fff; font-size: 1rem; letter-spacing: .01em; text-shadow: 0 1px 2px rgba(0, 0, 0, .35); }
@keyframes as-loading-giro { to { transform: rotate(360deg); } }
@keyframes as-loading-pulso { 0%, 100% { opacity: 1; transform: scale(1); } 50% { opacity: .78; transform: scale(.95); } }
@media (prefers-reduced-motion: reduce) {
    .as-loading { transition: none; }
    .as-loading-anel, .as-loading-marca img { animation: none; }
    .as-loading-anel circle { stroke-dasharray: 5 9; }
}

/* ===== Acessibilidade e leitura (19/10/2026, levantamento de UX do financeiro) =====
   Link de pular a navbar (header.php): só aparece no foco do teclado. */
.as-pular:focus { position: fixed; top: .5rem; left: .5rem; z-index: 2000; padding: .5rem .9rem;
    background: var(--bs-body-bg); color: var(--bs-body-color); border: 2px solid var(--bs-primary); border-radius: .375rem; }
.as-conteudo-ancora { display: block; height: 0; scroll-margin-top: calc(var(--navbar-h, 56px) + .5rem); }
.as-conteudo-ancora:focus { outline: none; }
#btn-busca-global:focus-visible { outline: 2px solid var(--bs-primary); outline-offset: 2px; }
/* Elemento que responde ao teclado como botão (AS.A11y em common.js: [data-as-tecla]). */
[data-as-tecla] { cursor: pointer; }
[data-as-tecla]:focus-visible { outline: 2px solid var(--bs-primary); outline-offset: 2px; }
/* Coluna de valor: algarismos de mesma largura, para a vírgula de uma linha cair sob a da outra. */
.table td.text-end, .table th.text-end, .table tfoot td { font-variant-numeric: tabular-nums; }

/* AS.Funil — autofiltro de cabeçalho (templates/_funil.php). O menu sai do card por Popper fixo
   (data-bs-popper-config); largura e altura da lista eram inline na Conferência. */
.as-funil-menu { width: 340px; }
.as-funil-lista { max-height: 300px; overflow-y: auto; }

/* Linha de grupo numa lista (cabeçalho da seção/linha, desenhada pelo JS entre as linhas de dado) */
tr.as-grupo > td { background: var(--bs-tertiary-bg); font-size: .85rem; padding-top: .35rem; padding-bottom: .35rem; }

/* ===== Aba Prazo da Análise de OS (fin_prazo.js, 21/10/2026: "melhore a página, está difícil de
   entender os dados"). Blocos numerados com a pergunta que respondem; barras de UM tom (o dourado
   da marca) misturado ao fundo — o mesmo desenho vale no tema escuro sem cor literal. ===== */
.pz-secao { margin-bottom: 1.75rem; }
.pz-secao-cab { display: flex; align-items: baseline; flex-wrap: wrap; gap: .25rem .75rem; margin-bottom: .6rem; }
.pz-secao-titulo { margin: 0; font-size: 1rem; font-weight: 600; display: flex; align-items: center; gap: .5rem; }
.pz-secao-num { display: inline-flex; align-items: center; justify-content: center; width: 1.45rem; height: 1.45rem;
    border-radius: 50%; font-size: .75rem; font-weight: 700; color: var(--bs-body-bg);
    background: var(--mk-gold, var(--bs-primary)); }
.pz-secao-sub { font-size: .8rem; color: var(--bs-secondary-color); }
.pz-ic { color: var(--mk-gold, var(--bs-primary)); }
.pz-tile { padding: .75rem 1rem .8rem; }
.pz-tile .as-tile-rotulo { font-size: .85rem; color: var(--bs-body-color); white-space: normal; }
.pz-tile-valor { font-size: 1.75rem; }
.pz-selo { font-size: .75rem; font-weight: 600; white-space: nowrap; }

/* Faixas de dias: claro = rápido, escuro = demorado. 2px de fundo entre os pedaços. */
.pz-faixas { display: flex; gap: 2px; height: 1.35rem; margin-top: .6rem; border-radius: 4px; overflow: hidden; }
.pz-faixas-mini { height: .7rem; margin-top: 0; min-width: 8rem; }
.pz-f { display: flex; align-items: center; justify-content: center; min-width: 3px; font-size: .68rem;
    font-weight: 600; font-variant-numeric: tabular-nums; color: var(--bs-body-color); overflow: hidden; white-space: nowrap; }
.pz-f0 { background: color-mix(in srgb, var(--mk-gold, #b8863b) 22%, var(--bs-body-bg)); }
.pz-f1 { background: color-mix(in srgb, var(--mk-gold, #b8863b) 42%, var(--bs-body-bg)); }
.pz-f2 { background: color-mix(in srgb, var(--mk-gold, #b8863b) 62%, var(--bs-body-bg)); color: var(--mk-ink, #0b1324); }
.pz-f3 { background: color-mix(in srgb, var(--mk-gold, #b8863b) 82%, var(--bs-body-bg)); color: var(--mk-ink, #0b1324); }
.pz-f4 { background: var(--mk-gold, #b8863b); color: var(--mk-ink, #0b1324); }
.pz-legenda { display: flex; flex-wrap: wrap; align-items: center; gap: .25rem .9rem; font-size: .75rem; color: var(--bs-secondary-color); }
.pz-legenda-item { display: inline-flex; align-items: center; gap: .3rem; }
.pz-legenda-item .pz-f { width: .85rem; height: .85rem; border-radius: 3px; }

/* Manchete do card de causa: o número grande à esquerda, a frase que o explica à direita. */
.pz-manchete { display: flex; align-items: center; gap: .9rem; min-height: 3rem; }
.pz-manchete-num { font-size: 1.9rem; font-weight: 700; line-height: 1; font-variant-numeric: tabular-nums; white-space: nowrap; text-align: center; }
.pz-manchete-leg { font-size: .7rem; font-weight: 400; color: var(--bs-secondary-color); margin-top: .2rem; }

/* Comparação sem × com medidas: uma medida, duas barras na mesma escala. */
.pz-cmp { border: 1px solid var(--bs-border-color); border-radius: .375rem; padding: .5rem .7rem; height: 100%; }
.pz-cmp-linha { display: grid; grid-template-columns: 7.5rem 1fr 4.2rem; align-items: center; gap: .5rem; font-size: .8rem; margin-bottom: .25rem; }
.pz-cmp-rotulo { color: var(--bs-secondary-color); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.pz-cmp-valor { text-align: right; font-weight: 600; font-variant-numeric: tabular-nums; white-space: nowrap; }
.pz-cmp-trilho { display: block; height: .6rem; background: var(--bs-tertiary-bg); border-radius: 4px; overflow: hidden; }
.pz-cmp-barra { display: block; height: 100%; border-radius: 0 4px 4px 0; }
.pz-cmp-sem { background: var(--mk-gold, #b8863b); }
.pz-cmp-com { background: color-mix(in srgb, var(--bs-secondary-color) 55%, var(--bs-body-bg)); }

/* Listas de ótica dos cards de causa: rolam DENTRO do card, cabeçalho ordenável. */
.pz-tabela-causa { max-height: 26rem; overflow-y: auto; border-top: 1px solid var(--bs-border-color); }
.pz-tabela-causa thead th { position: sticky; top: 0; background: var(--bs-body-bg); z-index: 1; }
.pz-col-nome { max-width: 16rem; }
.pz-ord { border: 0; background: none; padding: 0; color: inherit; font: inherit; font-weight: 600; cursor: pointer; white-space: nowrap; }
.pz-ord:hover, .pz-ord.ativo { color: var(--bs-emphasis-color); text-decoration: underline; }
.pz-ord:focus-visible { outline: 2px solid var(--bs-primary); outline-offset: 2px; }
.pz-pct-cel { position: relative; display: inline-block; min-width: 3.5rem; padding: 0 .25rem; font-variant-numeric: tabular-nums; }
.pz-pct-barra { position: absolute; left: 0; top: 15%; bottom: 15%; z-index: -1; border-radius: 3px;
    background: color-mix(in srgb, var(--mk-gold, #b8863b) 30%, transparent); }
.pz-pct-cel { isolation: isolate; }

/* Pendências por motivo: rótulo · barra · vezes · detalhe, alinhados em grade. */
.pz-pend-grade { display: grid; grid-template-columns: minmax(9rem, 14rem) minmax(6rem, 1fr) 6rem minmax(10rem, 18rem);
    align-items: center; gap: .55rem .9rem; font-size: .85rem; }
.pz-pend-num { text-align: right; white-space: nowrap; font-variant-numeric: tabular-nums; }
.pz-pend-det { color: var(--bs-secondary-color); font-size: .8rem; }
@media (max-width: 767.98px) {
    .pz-pend-grade { grid-template-columns: 1fr 5rem; }
    .pz-pend-grade .pz-cmp-trilho, .pz-pend-grade .pz-pend-det { grid-column: 1 / -1; }
    .pz-cmp-linha { grid-template-columns: 6rem 1fr 3.8rem; }
}
.pz-col-vend { max-width: 11rem; }
/* Onde o tempo aumenta (porTipo): cada lado da comparação = nome, barra da média, metade/9 de 10 + selo, faixas. */
.pz-tipo-lado { padding: .5rem 0; border-top: 1px solid var(--bs-border-color); }
.pz-tipo-lado .pz-faixas-mini { margin-top: .4rem; }
.pz-tipo-barra { grid-template-columns: 1fr 4.6rem; margin: .3rem 0; }
/* Tempo em cada setor: o setor com poucos bipes sai apagado; "agora" abre um grupo de colunas (é de hoje, não do período). */
.pz-setor-pouco > td { color: var(--bs-secondary-color); }
#pz-setores-table .pz-col-agora { border-left: 2px solid var(--bs-border-color); }

/* ---- Promoção do laboratório (AS.PromoCard, migr 628) -------------------------------------
   O MESMO cartão no assistente da gerente (proposta), no da ótica, na página promocao.php e no
   preview do relatório. Cores por variável do BS: tema claro/escuro resolve sozinho. */
.as-promo-card {
    border: 1px solid color-mix(in srgb, var(--mk-gold, #b8863b) 55%, var(--bs-border-color));
    border-left: 4px solid var(--mk-gold, #b8863b);
    border-radius: .6rem;
    background: color-mix(in srgb, var(--mk-gold, #b8863b) 7%, var(--bs-body-bg));
    color: var(--bs-body-color);
    padding: .6rem .75rem;
    font-size: .85rem;
    max-width: 30rem;
}
.as-promo-topo { font-size: .72rem; text-transform: uppercase; letter-spacing: .04em; color: var(--bs-secondary-color); }
.as-promo-topo .fa-bullhorn { color: var(--mk-gold, #b8863b); }
.as-promo-titulo { font-weight: 700; font-size: 1rem; margin-top: .15rem; }
.as-promo-img { display: block; margin: .4rem 0; cursor: zoom-in; }
.as-promo-img img { width: 100%; height: auto; border-radius: .4rem; border: 1px solid var(--bs-border-color); display: block; }
.as-promo-arte { padding: .4rem; }
.as-promo-arte .as-promo-img { margin-top: 0; }
/* Visor da arte: por cima de tudo (inclusive do painel do assistente), a imagem INTEIRA dentro da tela. */
.as-promo-visor {
    position: fixed; inset: 0; z-index: 3000; display: flex; align-items: center; justify-content: center;
    background: rgba(0, 0, 0, .88); cursor: zoom-out; padding: 1rem;
}
.as-promo-visor img { max-width: 100%; max-height: 100%; width: auto; height: auto; object-fit: contain; border-radius: .4rem; }
.as-promo-visor-x {
    position: absolute; top: .75rem; right: .9rem; border: 0; background: rgba(255, 255, 255, .15); color: #fff;
    width: 2.4rem; height: 2.4rem; border-radius: 50%; font-size: 1.2rem; line-height: 1;
}
.as-promo-condicao {
    display: inline-block; margin: .3rem 0 .35rem; padding: .1rem .5rem; border-radius: 999px;
    background: var(--mk-gold, #b8863b); color: #fff; font-weight: 700;
}
.as-promo-msg { margin-bottom: .35rem; }
.as-promo-produtos { font-size: .78rem; color: var(--bs-secondary-color); }
.as-promo-validade { font-size: .75rem; color: var(--bs-secondary-color); margin-top: .2rem; }
.as-promo-acoes { display: flex; flex-wrap: wrap; gap: .4rem; margin-top: .5rem; }
.as-promo-acoes .btn { font-size: .8rem; border-radius: 999px; padding: .2rem .7rem; }
.as-promo-encerrada { opacity: .65; }
.as-promo-encerrada .as-promo-condicao { background: var(--bs-secondary-bg); color: var(--bs-secondary-color); }
/* Selo da recepção no número do pedido: a lente/serviço da promoção — lembra quem aplica o desconto. */
.rec-promocao { color: var(--mk-gold, #b8863b); }
