/* =====================================================================
   AZM - UI custom (aditivo ao tema Phoenix)
   Estilos das melhorias transversais: DataTable padrao, filtros, uploads.
   Carregado em head-assets apos user.min.css. Nao substitui o tema.
   ===================================================================== */

/* =====================================================================
   1. DataTable padrao (.azm-dt)
   ===================================================================== */

/* Cabecalho: mais contraste + separacao visual, alinhado ao tema.
   Tinta sutil derivada das PROPRIAS variaveis do tema -> funciona em
   claro e escuro sem cor fixa. */
.azm-dt thead th {
    background: color-mix(in srgb, var(--phoenix-secondary-color, #6e7891) 9%, var(--phoenix-card-bg, #fff));
    border-bottom: 2px solid color-mix(in srgb, var(--phoenix-secondary-color, #6e7891) 28%, transparent);
    color: var(--phoenix-secondary-color, #6e7891);
    font-weight: 700;
    letter-spacing: .02em;
    vertical-align: middle;
    /* Tamanho e respiro do cabecalho moram na secao 20 (densidade), junto
       com os do corpo — sao a MESMA decisao e precisam andar juntos. */
}
.azm-dt thead th:first-child { border-top-left-radius: .55rem; }
.azm-dt thead th:last-child { border-top-right-radius: .55rem; }

/* Cabecalho: icone a esquerda do titulo */
.azm-dt thead th .azm-th {
    display: inline-flex;
    align-items: center;
    gap: .4rem;
    white-space: nowrap;
}
.azm-dt thead th .azm-th svg {
    /* Acompanha o rotulo (secao 20): icone maior que o texto ao lado vira
       o elemento mais pesado do cabecalho. */
    width: 12px;
    height: 12px;
    stroke-width: 2.25;
    color: currentColor;
    opacity: .85;
    flex: 0 0 auto;
}

/* Regiao AJAX + overlay de carregamento (hx-indicator) */
.azm-dt-wrap { position: relative; min-height: 120px; }
.azm-dt-loading {
    position: absolute;
    inset: 0;
    display: none;
    align-items: center;
    justify-content: center;
    gap: .5rem;
    background: color-mix(in srgb, var(--phoenix-card-bg, #fff) 62%, transparent);
    z-index: 5;
    border-radius: inherit;
    color: var(--phoenix-secondary-color, #6e7891);
    font-size: .85rem;
}
.azm-dt-loading.htmx-request { display: flex; }

/* Linha clicavel */
.azm-dt tbody tr[role="button"] { cursor: pointer; }

/* Coluna de acoes sempre a direita e sem quebrar */
.azm-dt .azm-dt-acoes { white-space: nowrap; width: 1%; text-align: end; }

/* ---- Responsivo: em telas pequenas cada linha vira um card ---- */
@media (max-width: 767.98px) {
    .azm-dt.azm-dt-cards { display: block; }
    .azm-dt.azm-dt-cards thead { display: none; }
    .azm-dt.azm-dt-cards tbody,
    .azm-dt.azm-dt-cards tr,
    .azm-dt.azm-dt-cards td { display: block; width: 100%; }

    .azm-dt.azm-dt-cards tbody tr {
        border: 1px solid var(--phoenix-border-color, #e3e6ed);
        border-radius: .625rem;
        margin-bottom: .75rem;
        padding: .35rem .25rem;
        background: var(--phoenix-card-bg, #fff);
        box-shadow: 0 1px 2px rgba(0, 0, 0, .04);
    }
    .azm-dt.azm-dt-cards tbody tr:last-child { margin-bottom: 0; }

    .azm-dt.azm-dt-cards td {
        display: flex;
        align-items: center;
        justify-content: space-between;
        gap: 1rem;
        padding: .5rem .85rem;
        border: 0;
        text-align: right;
    }
    .azm-dt.azm-dt-cards td + td {
        border-top: 1px dashed var(--phoenix-border-color, #eff2f6);
    }
    .azm-dt.azm-dt-cards td::before {
        content: attr(data-label);
        font-weight: 600;
        color: var(--phoenix-secondary-color, #6e7891);
        text-align: left;
        text-transform: uppercase;
        font-size: .68rem;
        letter-spacing: .03em;
        white-space: nowrap;
        flex: 0 0 auto;
    }
    /* celulas sem rotulo (ex.: acoes) ocupam a largura toda */
    .azm-dt.azm-dt-cards td[data-label=""]::before,
    .azm-dt.azm-dt-cards td:not([data-label])::before { content: none; }
    .azm-dt.azm-dt-cards td.azm-dt-acoes {
        justify-content: flex-end;
        width: auto;
        padding-top: .65rem;
    }
    /* empty-state ocupa a linha inteira sem virar par rotulo/valor */
    .azm-dt.azm-dt-cards td.azm-dt-empty { justify-content: center; text-align: center; }
    .azm-dt.azm-dt-cards td.azm-dt-empty::before { content: none; }
}

/* =====================================================================
   2. Paginacao padrao (.azm-pagination) — corrige setas/alinhamento/espacos
   ===================================================================== */
.azm-pagination {
    display: flex;
    align-items: center;
    justify-content: space-between;
    flex-wrap: wrap;
    gap: .5rem 1rem;
    margin-top: 1rem;
}
.azm-pagination .azm-pagination-info {
    font-size: .8rem;
    color: var(--phoenix-secondary-color, #6e7891);
}
.azm-pagination .pagination {
    margin: 0;
    gap: .25rem;
    flex-wrap: wrap;
}
.azm-pagination .page-item .page-link {
    border: 1px solid var(--phoenix-border-color, #e3e6ed);
    border-radius: .5rem;
    min-width: 34px;
    height: 34px;
    padding: 0 .5rem;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    font-size: .82rem;
    line-height: 1;
    color: var(--phoenix-body-color, #31374a);
    transition: background-color .15s, border-color .15s, color .15s;
}
.azm-pagination .page-link svg { width: 15px; height: 15px; stroke-width: 2.25; }
.azm-pagination .page-link:hover {
    background: var(--phoenix-secondary-bg, #f5f7fa);
    border-color: var(--phoenix-border-color, #cbd0dd);
}
.azm-pagination .page-item.active .page-link {
    background: var(--brand-primary, #3874ff);
    border-color: var(--brand-primary, #3874ff);
    color: #fff;
}
.azm-pagination .page-item.disabled .page-link {
    opacity: .45;
    pointer-events: none;
}

/* =====================================================================
   3. Botao de Filtros (.azm-filtros-btn) — destaque quando ativo
   ===================================================================== */
.azm-filtros-btn { position: relative; }
.azm-filtros-btn.is-ativo {
    border-color: var(--brand-primary, #3874ff);
    color: var(--brand-primary, #3874ff);
    background: color-mix(in srgb, var(--brand-primary, #3874ff) 10%, transparent);
    font-weight: 600;
}
.azm-filtros-btn .azm-filtros-contador {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    min-width: 18px;
    height: 18px;
    padding: 0 5px;
    margin-left: .35rem;
    border-radius: 999px;
    background: var(--brand-primary, #3874ff);
    color: #fff;
    font-size: .68rem;
    font-weight: 700;
    line-height: 1;
}

/* ---------------------------------------------------------------------
   3b. Painel de filtros colapsavel (.azm-filtros-painel) — a forma do
   legado, usada onde os filtros sao muitos e ficam ACIMA da tabela.

   O botao e o contador sao os mesmos do modal; o que muda aqui e' so' o
   invólucro e a seta que acompanha o estado do collapse.
   --------------------------------------------------------------------- */
/* O cabecalho INTEIRO e' o gatilho do collapse (data-azm-colapsar, no JS) —
   entao ele precisa se anunciar como clicavel. Os controles que moram dentro
   dele voltam ao cursor normal: la' o clique e' do controle, nao da faixa. */
.azm-filtros-cabecalho { cursor: pointer; }
.azm-filtros-cabecalho .dropdown-menu { cursor: auto; }

.azm-filtros-painel-card .azm-filtros-btn {
    font-weight: 600;
    color: var(--phoenix-body-color, inherit);
}
.azm-filtros-painel-card .azm-filtros-btn.is-ativo {
    background: transparent;                 /* no cabecalho, so' a cor destaca */
    border-color: transparent;
    color: var(--brand-primary, #3874ff);
}
/* A seta olha para baixo quando fechado e para cima quando aberto — o
   `aria-expanded` do proprio Bootstrap e' quem diz qual dos dois. */
.azm-filtros-painel-card .azm-filtros-seta { transition: transform .18s ease-in-out; }
.azm-filtros-painel-card [aria-expanded="true"] .azm-filtros-seta { transform: rotate(180deg); }

/* ---------------------------------------------------------------------
   3b-2. Seletor de periodo (.azm-periodo)

   Aqui HOUVE um estado "travado": fora do modo "Datas fixas" os dois
   campos de data ficavam esmaecidos e readonly, porque mostram um
   resultado ("Mês passado" escreveu 01/07 e 31/07) e nao um campo a
   preencher. O contraste explicava o bloqueio, mas o bloqueio e' que era
   o problema: quem queria empurrar uma ponta dois dias clicava, digitava
   e nao acontecia nada — sem pista de que precisava trocar a escolha
   antes.

   Os campos agora sao comuns, e digitar neles E' o pedido de datas
   fixas: azm-periodo.js troca a escolha junto. Nao ha estado a pintar —
   por isso esta secao ficou sem regra, e nao por esquecimento.
   --------------------------------------------------------------------- */

.azm-filtros-painel .form-label {
    font-size: .72rem;
    text-transform: uppercase;
    letter-spacing: .02em;
    margin-bottom: .15rem;
    color: var(--phoenix-secondary-color, #6c757d);
}

/* ---------------------------------------------------------------------
   3c. Coluna-resumo da listagem (.azm-dt-resumo) — "DADOS DA VENDA"

   No legado, a primeira coluna juntava data, cliente, cidade, contrato,
   produtos, equipe e status num bloco so', e aparecia SOZINHA nas telas
   estreitas (as demais colunas ficavam `hidden-sm-down`). E' o mesmo
   arranjo aqui, com as classes responsivas do Bootstrap 5 na view.
   --------------------------------------------------------------------- */
.azm-dt-resumo { line-height: 1.35; }
.azm-dt-resumo .azm-resumo-linha {
    display: flex;
    align-items: center;
    gap: .35rem;
    justify-content: center;
    text-align: center;
}
.azm-dt-resumo .azm-resumo-topo {
    display: flex;
    justify-content: space-between;
    gap: .5rem;
    font-size: .72rem;
    color: var(--phoenix-secondary-color, #6c757d);
}
.azm-dt-resumo .azm-resumo-destaque { font-size: .95rem; font-weight: 600; }

/* =====================================================================
   4. Upload de imagem com preview (.azm-foto-upload)
   ---------------------------------------------------------------------
   Um PAINEL por foto — a imagem de hoje em cima, a area de troca embaixo.
   O motivo esta no proprio componente (resources/views/components/ui/
   foto-upload.blade.php); aqui so' a parte visual.

   O truque que sustenta a area de soltar: o <input type="file"> continua
   sendo o do navegador, esticado por cima da area inteira com
   `opacity: 0`. E' ele quem recebe o clique e o arquivo arrastado — nao
   ha JS de drag-and-drop para manter, e o campo `required` continua
   RENDERIZADO (um `display:none` faria o Chrome abortar o submit em
   silencio, a mesma armadilha documentada na secao 8).
   ===================================================================== */
.azm-foto-upload {
    display: flex;
    flex-direction: column;
    gap: .75rem;
    padding: 1rem;
    border: 1px solid var(--azm-fio-superficie, rgba(20, 24, 36, .10));
    border-radius: .5rem;
}
.azm-foto-cabecalho { display: flex; align-items: center; gap: .75rem; min-width: 0; }
.azm-foto-legenda { min-width: 0; }
.azm-foto-titulo { font-weight: 600; font-size: .9rem; line-height: 1.2; }
.azm-foto-estado {
    font-size: .75rem;
    color: var(--phoenix-secondary-color, #6e7891);
}
/* Quadrada de cantos arredondados, como as miniaturas da secao 7: a mesma
   foto nao pode mudar de formato entre a ficha e a tela que a edita. */
.azm-foto-preview {
    width: 88px;
    height: 88px;
    border-radius: .625rem;
    object-fit: cover;
    border: 1px solid var(--azm-fio-superficie, rgba(20, 24, 36, .10));
    background: var(--phoenix-secondary-bg, #f5f7fa);
    flex: 0 0 auto;
}

/* --- A area de soltar ------------------------------------------------- */
.azm-foto-solta {
    position: relative;
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    gap: .2rem;
    padding: .9rem .75rem;
    text-align: center;
    border: 1px dashed var(--phoenix-border-color, #cbd0dd);
    border-radius: .5rem;
    background: var(--phoenix-secondary-bg, #f5f7fa);
    color: var(--phoenix-secondary-color, #6e7891);
    cursor: pointer;
    transition: border-color .15s, background-color .15s;
}
/* `focus-within` porque o foco visivel mora no input transparente: sem
   isto, quem navega por teclado nao ve onde esta. */
.azm-foto-solta:hover,
.azm-foto-solta:focus-within {
    border-color: var(--brand-primary, #3874ff);
    background: color-mix(in srgb, var(--brand-primary, #3874ff) 7%, transparent);
}
.azm-foto-solta .azm-foto-input {
    position: absolute;
    inset: 0;
    width: 100%;
    height: 100%;
    opacity: 0;
    cursor: pointer;
}
.azm-foto-solta .azm-foto-icone { color: var(--brand-primary, #3874ff); }
.azm-foto-chamada { font-size: .82rem; line-height: 1.3; }
.azm-foto-dica { font-size: .72rem; }
/* Depois de escolher, a dica de formato da lugar ao nome do arquivo — e o
   peso maior e' o aviso de que ainda falta clicar em "Enviar". */
.azm-foto-dica.tem-arquivo {
    color: var(--phoenix-emphasis-color, #31374a);
    font-weight: 600;
    overflow-wrap: anywhere;
}

.azm-foto-botoes { display: flex; flex-wrap: wrap; gap: .5rem; }

/* =====================================================================
   5. Portal de Carreiras (landing publica de vagas)
   ---------------------------------------------------------------------
   Linguagem "comercial": gradientes de marca, ilustracoes SVG e cards
   coloridos. NENHUMA cor de marca fixa — tudo deriva dos tokens
   --brand-* injetados pelo TenantManager (white-label).
   O matiz de cada card vem da variavel --c, definida no proprio Blade,
   o que permite alternar a paleta por item sem classes extras.
   ---------------------------------------------------------------------
   Superficie e borda saem de --phoenix-white / --phoenix-gray-200, que
   existem nos dois temas e acompanham a troca em qualquer elemento.
   (Historico: --phoenix-card-bg e --phoenix-border-color eram armadilhas
   fora de `.card` porque o tema nao as declarava no escuro; a secao 18.1
   passou a declarar as duas, mas nao ha motivo para trocar o que ja
   funciona — este bloco fica como esta.)
   ===================================================================== */
.portal-beneficio,
.portal-vaga-card,
.portal-form-card {
    --portal-superficie: var(--phoenix-white, #fff);
    --portal-borda: var(--phoenix-gray-200, #e3e6ed);
}

/* ---------- Hero ---------- */
.portal-hero {
    position: relative;
    isolation: isolate;
    overflow: hidden;
    color: #fff;
    border-radius: 1.25rem;
    padding: 2.75rem 1.75rem;
    margin-bottom: 2rem;
    background:
        radial-gradient(115% 135% at 100% 0%,
            color-mix(in srgb, var(--brand-info, #0097eb) 62%, transparent), transparent 58%),
        radial-gradient(105% 125% at 0% 100%,
            color-mix(in srgb, var(--brand-accent, #25b003) 45%, transparent), transparent 55%),
        linear-gradient(135deg,
            color-mix(in srgb, var(--brand-primary, #3874ff) 86%, #000),
            var(--brand-primary, #3874ff));
    box-shadow: 0 1.5rem 3rem -1.25rem color-mix(in srgb, var(--brand-primary, #3874ff) 60%, transparent);
}
/* Textura pontilhada: profundidade sem depender de arquivo de imagem. */
.portal-hero::before {
    content: "";
    position: absolute;
    inset: 0;
    z-index: -1;
    background-image: radial-gradient(rgba(255, 255, 255, .18) 1px, transparent 1px);
    background-size: 22px 22px;
    opacity: .55;
    -webkit-mask-image: linear-gradient(180deg, #000, transparent 72%);
    mask-image: linear-gradient(180deg, #000, transparent 72%);
}
.portal-hero h1 { font-weight: 800; letter-spacing: -.02em; line-height: 1.12; }
.portal-hero .portal-hero-sub { opacity: .92; font-size: 1.02rem; }
.portal-hero .form-control,
.portal-hero .form-select { border: 0; }

.portal-hero-badge {
    display: inline-flex;
    align-items: center;
    gap: .4rem;
    padding: .3rem .8rem;
    border-radius: 999px;
    background: rgba(255, 255, 255, .18);
    border: 1px solid rgba(255, 255, 255, .3);
    font-size: .76rem;
    font-weight: 700;
    letter-spacing: .03em;
}
.portal-hero-badge svg { width: 14px; height: 14px; }

/* Atalho para o banco de talentos (cadastro sem vaga). Sublinhado discreto
   sobre o gradiente: precisa se ler como link, mas nao competir com o CTA
   principal, que e a busca de vagas. */
.portal-hero-link {
    display: inline-flex;
    align-items: center;
    gap: .4rem;
    color: #fff;
    text-decoration: underline;
    text-underline-offset: .28em;
    text-decoration-color: rgba(255, 255, 255, .45);
    opacity: .92;
}
.portal-hero-link:hover,
.portal-hero-link:focus-visible {
    color: #fff;
    opacity: 1;
    text-decoration-color: #fff;
}

/* Ilustracao SVG ou foto do tenant (assets.carreiras_hero) */
.portal-hero-art { display: block; width: 100%; height: auto; max-height: 310px; }
.portal-hero-foto {
    display: block;
    width: 100%;
    max-height: 310px;
    object-fit: cover;
    border-radius: 1rem;
    box-shadow: 0 1rem 2rem rgba(0, 0, 0, .25);
}

/* Barra de busca: pill translucida com campos solidos (legibilidade) */
.portal-busca {
    background: rgba(255, 255, 255, .16);
    border: 1px solid rgba(255, 255, 255, .28);
    border-radius: 1rem;
    padding: .5rem;
    box-shadow: 0 .75rem 1.75rem rgba(0, 0, 0, .18);
}
.portal-busca .form-control,
.portal-busca .form-select { border: 0; box-shadow: none; }

/* Indicadores do hero */
.portal-stats {
    display: flex;
    flex-wrap: wrap;
    gap: 1.25rem 2.25rem;
}
.portal-stat-num { font-size: 1.55rem; font-weight: 800; line-height: 1; }
.portal-stat-lbl {
    font-size: .72rem;
    text-transform: uppercase;
    letter-spacing: .07em;
    opacity: .85;
}

/* ---------- Icone circular colorido (reaproveitado em varias secoes) ---------- */
.portal-ico {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 44px;
    height: 44px;
    flex: 0 0 auto;
    border-radius: .85rem;
    background: color-mix(in srgb, var(--c, var(--brand-primary, #3874ff)) 18%, transparent);
    color: var(--c, var(--brand-primary, #3874ff));
}
.portal-ico svg { width: 21px; height: 21px; }
.portal-ico-sm { width: 34px; height: 34px; border-radius: .65rem; }
.portal-ico-sm svg { width: 17px; height: 17px; }

/* ---------- Cards de diferenciais ---------- */
.portal-beneficio {
    height: 100%;
    padding: 1.15rem;
    border: 1px solid var(--portal-borda);
    border-radius: 1rem;
    color: var(--phoenix-body-color);
    background:
        linear-gradient(180deg,
            color-mix(in srgb, var(--c, var(--brand-primary, #3874ff)) 10%, var(--portal-superficie)),
            var(--portal-superficie));
    transition: transform .18s, box-shadow .18s;
}
.portal-beneficio:hover { transform: translateY(-3px); box-shadow: 0 .75rem 1.5rem rgba(0, 0, 0, .08); }
.portal-beneficio h3 { font-size: .95rem; font-weight: 700; margin: .7rem 0 .25rem; }
.portal-beneficio p { font-size: .82rem; margin: 0; }

/* ---------- Card de vaga ---------- */
.portal-vaga-card {
    position: relative;
    overflow: hidden;
    height: 100%;
    border: 1px solid var(--portal-borda);
    border-radius: 1rem;
    transition: box-shadow .18s, transform .18s, border-color .18s;
}
/* Faixa superior colorida (o "matiz" do card) */
.portal-vaga-card::before {
    content: "";
    position: absolute;
    inset: 0 0 auto 0;
    height: 4px;
    background: linear-gradient(90deg,
        var(--c, var(--brand-primary, #3874ff)),
        color-mix(in srgb, var(--c, var(--brand-primary, #3874ff)) 30%, transparent));
}
.portal-vaga-card:hover {
    box-shadow: 0 .75rem 1.75rem rgba(0, 0, 0, .1);
    transform: translateY(-4px);
    border-color: color-mix(in srgb, var(--c, var(--brand-primary, #3874ff)) 50%, transparent);
}
.portal-vaga-card .card-body { padding-top: 1.15rem; }
.portal-vaga-card .portal-vaga-titulo { font-weight: 700; }
.portal-vaga-chip {
    display: inline-flex;
    align-items: center;
    gap: .3rem;
    font-size: .74rem;
    font-weight: 600;
    padding: .2rem .55rem;
    border-radius: 999px;
    background: var(--phoenix-secondary-bg, #f5f7fa);
    color: var(--phoenix-secondary-color, #6e7891);
}
.portal-vaga-chip svg { width: 13px; height: 13px; }
/* Variante tingida pela cor do item (usada em destaques e no topo da vaga) */
.portal-vaga-chip.is-cor {
    background: color-mix(in srgb, var(--c, var(--brand-primary, #3874ff)) 15%, transparent);
    color: var(--c, var(--brand-primary, #3874ff));
}
.portal-vaga-salario { font-weight: 700; color: var(--c, var(--brand-primary, #3874ff)); }
.portal-badge-novo {
    background: var(--brand-accent, #25b003);
    color: #fff;
    font-size: .68rem;
    font-weight: 700;
    padding: .18rem .5rem;
    border-radius: 999px;
    text-transform: uppercase;
    letter-spacing: .03em;
}
.portal-filtros { position: sticky; top: 1rem; }
@media (min-width: 992px) {
    .portal-filtros-offcanvas { visibility: visible !important; }
}

/* ---------- Estado vazio ---------- */
.portal-arte-vazio { width: 200px; max-width: 70%; height: auto; }

/* ---------- Chamada final ---------- */
.portal-cta {
    position: relative;
    overflow: hidden;
    color: #fff;
    border-radius: 1.25rem;
    padding: 2rem 1.75rem;
    background: linear-gradient(120deg,
        var(--brand-secondary, #31374a),
        color-mix(in srgb, var(--brand-primary, #3874ff) 72%, #000));
}
.portal-cta h2 { color: #fff; font-weight: 800; }
.portal-arte-cta { width: 100%; max-width: 220px; height: auto; }

/* ---------- Pagina da vaga ---------- */
.portal-vaga-hero {
    position: relative;
    overflow: hidden;
    color: #fff;
    border-radius: 1.25rem;
    padding: 2rem 1.5rem;
    margin-bottom: 1.75rem;
    background:
        radial-gradient(120% 160% at 100% 0%,
            color-mix(in srgb, var(--brand-info, #0097eb) 55%, transparent), transparent 60%),
        linear-gradient(135deg,
            color-mix(in srgb, var(--brand-primary, #3874ff) 86%, #000),
            var(--brand-primary, #3874ff));
    box-shadow: 0 1.25rem 2.5rem -1.25rem color-mix(in srgb, var(--brand-primary, #3874ff) 60%, transparent);
}
.portal-vaga-hero h1 { color: #fff; font-weight: 800; letter-spacing: -.02em; }
/* Chips sobre o gradiente: vidro fosco em vez do cinza do tema */
.portal-vaga-hero .portal-vaga-chip {
    background: rgba(255, 255, 255, .18);
    border: 1px solid rgba(255, 255, 255, .26);
    color: #fff;
}
.portal-vaga-hero .portal-vaga-salario { color: #fff; }
.portal-vaga-hero .link-voltar { color: rgba(255, 255, 255, .85); text-decoration: none; font-size: .85rem; }
.portal-vaga-hero .link-voltar:hover { color: #fff; text-decoration: underline; }

/* Formulario de candidatura */
.portal-form-card {
    overflow: hidden;
    border: 1px solid var(--portal-borda);
    border-radius: 1rem;
}
.portal-form-card-head {
    padding: 1rem 1.25rem;
    color: #fff;
    background: linear-gradient(135deg,
        color-mix(in srgb, var(--brand-primary, #3874ff) 86%, #000),
        var(--brand-primary, #3874ff));
}
.portal-form-card-head h2 { color: #fff; font-weight: 700; margin: 0; }
@media (min-width: 992px) {
    .portal-form-sticky { position: sticky; top: 1rem; }
}

/* Avatar do candidato (iniciais) — navbar, capa da conta e card da vaga */
.portal-avatar {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 30px;
    height: 30px;
    flex: 0 0 auto;
    border-radius: 50%;
    font-size: .74rem;
    font-weight: 800;
    letter-spacing: .02em;
    background: color-mix(in srgb, var(--brand-primary, #3874ff) 20%, transparent);
    color: var(--brand-primary, #3874ff);
}
/* Sobre o gradiente da capa: vidro fosco, nao a tinta da marca */
.portal-avatar-lg {
    width: 54px;
    height: 54px;
    font-size: 1.15rem;
    background: rgba(255, 255, 255, .2);
    border: 1px solid rgba(255, 255, 255, .3);
    color: #fff;
}

/* Campo do codigo de acesso: digitos grandes e espacados */
.portal-codigo {
    text-align: center;
    font-size: 1.6rem;
    font-weight: 700;
    letter-spacing: .5em;
    text-indent: .5em; /* compensa o espaco extra que o letter-spacing poe no fim */
}

/* Etapas do processo seletivo */
.portal-passo { display: flex; align-items: flex-start; gap: .85rem; }
.portal-passo-num {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 30px;
    height: 30px;
    flex: 0 0 auto;
    border-radius: 50%;
    font-size: .82rem;
    font-weight: 800;
    background: color-mix(in srgb, var(--c, var(--brand-primary, #3874ff)) 18%, transparent);
    color: var(--c, var(--brand-primary, #3874ff));
}
.portal-passo h3 { font-size: .9rem; font-weight: 700; margin: .25rem 0 .15rem; }
.portal-passo p { font-size: .82rem; margin: 0; }

/* ---------- Ajustes do tema escuro ---------- */
.dark .portal-vaga-chip:not(.is-cor) {
    background: color-mix(in srgb, var(--phoenix-gray-300, #4b5563) 45%, transparent);
    color: var(--phoenix-gray-700, #c3c9d5);
}
/* Excecao: sobre o gradiente da capa os chips seguem "de vidro" (vem depois
   da regra acima de proposito — mesma especificidade, esta prevalece). */
.dark .portal-vaga-hero .portal-vaga-chip {
    background: rgba(255, 255, 255, .18);
    border: 1px solid rgba(255, 255, 255, .26);
    color: #fff;
}
.dark .portal-vaga-card:hover,
.dark .portal-beneficio:hover { box-shadow: 0 .75rem 1.75rem rgba(0, 0, 0, .45); }

/* =====================================================================
   Troca de tema (claro / escuro / automatico)
   O botao mostra so o icone do estado atual (data-azm-theme-atual).
   ===================================================================== */
.azm-theme-ico { display: none; line-height: 0; }
[data-azm-theme-atual="light"] .azm-theme-ico-light,
[data-azm-theme-atual="dark"]  .azm-theme-ico-dark,
[data-azm-theme-atual="auto"]  .azm-theme-ico-auto { display: inline-flex; }
/* Fallback (antes do JS definir o atributo): mostra o icone "auto". */
[data-azm-theme-toggle]:not([data-azm-theme-atual]) .azm-theme-ico-auto { display: inline-flex; }

/* Variante flutuante (telas sem menu: login). Canto inferior direito. */
.azm-theme-floating {
    position: fixed;
    right: 1rem;
    bottom: 1rem;
    z-index: 1030;
}

/* =====================================================================
   Upload de documentos com barra de % (azm-upload.js)
   ===================================================================== */
.azm-doc-upload {
    border: 1px solid var(--phoenix-border-color, #e3e6ed);
    border-radius: .5rem;
    padding: .75rem;
    background: var(--phoenix-card-bg, #fff);
}
.azm-doc-upload.is-enviado { border-color: var(--phoenix-success, #25b003); }
.azm-doc-label { font-weight: 600; font-size: .85rem; display: inline-flex; align-items: center; gap: .4rem; }
.azm-doc-label svg { flex: 0 0 auto; }

.azm-doc-drop {
    display: flex;
    align-items: center;
    justify-content: center;
    gap: .4rem;
    width: 100%;
    padding: .55rem;
    margin: .25rem 0;
    border: 1px dashed var(--phoenix-border-color, #cbd0dd);
    border-radius: .4rem;
    color: var(--phoenix-secondary-color, #6e7891);
    font-size: .8rem;
    cursor: pointer;
    transition: border-color .15s, background .15s;
}
.azm-doc-drop:hover { border-color: var(--brand-primary, #3874ff); background: var(--phoenix-secondary-bg, #f5f7fa); }
.azm-doc-drop input[type="file"] { display: none; }

.azm-doc-bar {
    height: 6px;
    border-radius: 999px;
    background: var(--phoenix-secondary-bg, #eef0f5);
    overflow: hidden;
    margin: .35rem 0 .25rem;
}
.azm-doc-bar-fill {
    display: block;
    height: 100%;
    width: 0;
    background: var(--brand-primary, #3874ff);
    transition: width .18s ease;
}
.azm-doc-bar-fill.is-ok { background: var(--phoenix-success, #25b003); }
.azm-doc-bar-fill.is-erro { background: var(--phoenix-danger, #e5164a); }
.azm-doc-status { font-size: .74rem; }
.azm-doc-upload.is-enviando .azm-doc-drop { opacity: .6; pointer-events: none; }

/* =====================================================================
   6. Correcoes de contraste do TEMA ESCURO (.dark)
   ---------------------------------------------------------------------
   O CSS compilado do Phoenix, no bloco `.dark`, sobrescreve as variaveis
   *-color (hex) mas ESQUECE varias contrapartidas *-rgb. Como diversas
   utilities do Bootstrap/Phoenix consomem a forma rgba(var(--x-rgb), a),
   elas continuam com o valor CLARO no tema escuro -> texto/fundo sem
   contraste. Aqui completamos essas variaveis reaproveitando os proprios
   tons do tema (sem cores novas/fixas), corrigindo a origem do problema
   de uma vez para todos os componentes que dependem delas.
   ===================================================================== */
.dark {
    /* Fundos: `bg-body`/`bg-body-*` usam --*-bg-rgb (nao setados no escuro),
       o que os deixava claros. Alinha o rgb ao hex ja definido pelo tema:
       --phoenix-body-bg: #0f111a -> 15,17,26. */
    --phoenix-body-bg-rgb: 15, 17, 26;
    --phoenix-emphasis-bg-rgb: 15, 17, 26;
}

/* Texto secundario, titulos e labels do escuro MUDARAM DE LUGAR: agora saem
   da escala de tres degraus da secao 18 (--phoenix-secondary-color e
   companhia), que atende tambem `.text-body-secondary`/`.text-body-tertiary`.
   Manter copias aqui so' criaria dois lugares para o mesmo ajuste. */

/* Placeholders: dica de preenchimento e' o degrau mais fraco da escala —
   nunca pode disputar leitura com o valor ja digitado (secao 18.3). */
.dark .form-control::placeholder,
.dark .form-select::placeholder {
    color: var(--phoenix-tertiary-color);
    opacity: 1;
}

/* ---------------------------------------------------------------------
   color-scheme: o Phoenix troca o tema so por classe (.dark) e nunca
   declara `color-scheme`. Sem ela o navegador continua desenhando TUDO
   que e nativo em modo claro: fundo do autofill, calendario do
   input[type=date], lista do select, barras de rolagem e caret. Dai o
   "flash branco" ao clicar num campo — e o preview do autopreenchimento
   do Chrome, pintado por cima do CSS. Declarar aqui resolve na origem,
   em todas as telas (painel e portal).
   --------------------------------------------------------------------- */
:root { color-scheme: light; }
:root.dark { color-scheme: dark; }

/* Autofill: o Chrome anima o fundo do campo ate a cor propria dele e
   ignora `background-color`. O tema ja mascara com box-shadow inset, mas
   so em `input` sem estado — no hover/focus/active e em select/textarea a
   mascara caia. Aqui cobrimos todos os casos e, com a transicao absurda
   de background/color, o navegador nunca chega a pintar a cor original
   (fim do piscar). border-color/box-shadow seguem com a transicao do
   tema para nao perder o realce de foco. */
input:-webkit-autofill,
input:-webkit-autofill:hover,
input:-webkit-autofill:focus,
input:-webkit-autofill:active,
select:-webkit-autofill,
select:-webkit-autofill:hover,
select:-webkit-autofill:focus,
textarea:-webkit-autofill,
textarea:-webkit-autofill:hover,
textarea:-webkit-autofill:focus {
    -webkit-text-fill-color: var(--phoenix-input-color, var(--phoenix-gray-900));
    caret-color: var(--phoenix-input-color, var(--phoenix-gray-900));
    -webkit-box-shadow: inset 0 0 0 30px var(--phoenix-input-bg);
    box-shadow: inset 0 0 0 30px var(--phoenix-input-bg);
    -webkit-transition: background-color 600000s 0s, color 600000s 0s,
        border-color .15s ease-in-out, -webkit-box-shadow .15s ease-in-out;
    transition: background-color 600000s 0s, color 600000s 0s,
        border-color .15s ease-in-out, box-shadow .15s ease-in-out;
}

/* Campo travado pelo CEP tem fundo proprio (translucido sobre o card).
   A mascara do autofill precisa reproduzi-lo em duas camadas: a de baixo
   opaca, senao a cor do Chrome vaza pela transparencia. */
.azm-endereco .azm-campo-bloqueado:-webkit-autofill,
.azm-endereco .azm-campo-bloqueado:-webkit-autofill:hover,
.azm-endereco .azm-campo-bloqueado:-webkit-autofill:focus {
    -webkit-box-shadow: inset 0 0 0 30px var(--phoenix-secondary-bg, rgba(0, 0, 0, .035)),
        inset 0 0 0 30px var(--phoenix-input-bg);
    box-shadow: inset 0 0 0 30px var(--phoenix-secondary-bg, rgba(0, 0, 0, .035)),
        inset 0 0 0 30px var(--phoenix-input-bg);
}
.dark .azm-endereco .azm-campo-bloqueado:-webkit-autofill,
.dark .azm-endereco .azm-campo-bloqueado:-webkit-autofill:hover,
.dark .azm-endereco .azm-campo-bloqueado:-webkit-autofill:focus {
    -webkit-box-shadow: inset 0 0 0 30px rgba(255, 255, 255, .04),
        inset 0 0 0 30px var(--phoenix-input-bg);
    box-shadow: inset 0 0 0 30px rgba(255, 255, 255, .04),
        inset 0 0 0 30px var(--phoenix-input-bg);
}

/* =====================================================================
   7. Avatares (.azm-avatar / .azm-avatar-group)
   ===================================================================== */
.azm-avatar { line-height: 0; }

/* QUADRADA DE CANTOS ARREDONDADOS, e nao redonda. O circulo corta as
   pontas de qualquer foto — o topo da cabeca no retrato e as bordas do
   cracha na corporativa —, e as duas miniaturas juntas ficavam com
   silhuetas diferentes. O raio e' relativo ao lado justamente porque o
   mesmo componente serve de 1.75rem (listagem) a 4rem (ficha): em rem
   fixo, a miniatura pequena sairia quase quadrada e a grande, quase
   redonda. Quem e' quem continua no `title` de cada uma. */
.azm-avatar .azm-avatar-foto { border-radius: 22%; }

/* Miniaturas parcialmente sobrepostas (foto de perfil + corporativa). */
.azm-avatar-group { line-height: 0; }
.azm-avatar-group .azm-avatar-stacked {
    border: 2px solid var(--phoenix-card-bg, #fff);
    /* Um pouco maior que o raio de dentro: a borda e' externa
       (`content-box`), e raios iguais deixariam o fio "apertando" o canto. */
    border-radius: 26%;
    box-sizing: content-box;
    background: var(--phoenix-card-bg, #fff);
}
/* Sobreposicao menor que a de antes (-.42): com o canto quase reto, a
   segunda miniatura cobria metade do rosto da primeira — no circulo, a
   mesma medida so' comia a borda vazia. */
.azm-avatar-group .azm-avatar-stacked + .azm-avatar-stacked {
    margin-left: calc(var(--azm-avatar-size, 2.25rem) * -.28);
}
/* Realce ao passar o mouse: a foto sob o cursor vem para a frente. */
.azm-avatar-group .azm-avatar-stacked { position: relative; transition: transform .15s; }
.azm-avatar-group .azm-avatar-stacked:hover { transform: translateY(-2px); z-index: 2; }

/* O cabecalho "estilo rede social" de usuarios/show (faixa colorida de
   120px + foto subindo por cima dela) foi aposentado — virou a ficha da
   secao 25, que explica o porque. As classes `.azm-profile-*` sairam
   junto: nao ha outra tela usando. */

/* =====================================================================
   8. Select com busca (Choices.js) — ajustes finos sobre o tema Phoenix

   TODO <select> do sistema vira um campo pesquisavel (public/js/azm-forms.js),
   entao estas regras valem para a interface inteira: a caixa fechada tem que
   ler como um `.form-select` comum — inclusive nos tamanhos `sm`/`lg`, no
   estado invalido e no tema escuro.
   ===================================================================== */
/* Remove a margem inferior padrao do Choices (alinha em grids/inline). */
.choices { margin-bottom: 0; }

/* Aberto, o campo precisa passar por cima do que vem depois (linhas de
   tabela, cards e rodapes de modal criam contexto de empilhamento). */
.choices.is-open { position: relative; z-index: 6; }
.choices .choices__list--dropdown { z-index: 6; }

/* Lista aberta em COORDENADAS DE TELA (quem marca a caixa e calcula a
   geometria e' o public/js/azm-forms.js — o porque esta la, no bloco
   "Lista ABERTA em coordenadas de tela"). Em resumo: um contêiner que rola
   (`.table-responsive` e afins) recortava a lista e criava barra de
   rolagem, e no ultimo campo da tela ela esticava a pagina.

   O JS escreve so' `top`/`left`/`width`; o resto mora aqui — inclusive o
   `bottom: 100%` que o proprio Choices aplica quando decide virar a lista
   para cima, que passaria por cima do calculo. */
/* O `z-index: 6` da caixa aberta (regra acima) CRIA UM CONTEXTO DE
   EMPILHAMENTO, e dentro dele o 1080 da lista nao valeria nada: a lista
   solta continuaria empilhando como "6" e passaria por baixo da navbar
   (1030). Aberta em coordenadas de tela ela nao precisa mais daquele
   degrau — quem se defende sozinha e' a propria lista. */
.choices.azm-choices-solto.is-open { z-index: auto; }
.choices.azm-choices-solto .choices__list--dropdown {
    position: fixed !important;
    bottom: auto !important;
    margin: 0 !important;
    z-index: 1080;   /* acima do modal (1055), abaixo do dialogo (1085) */
}
/* Virada para cima: os cantos arredondados trocam de lado. */
.choices.azm-choices-solto.azm-choices-acima .choices__list--dropdown {
    border-radius: .25rem .25rem 0 0;
}

/* Em foco, usa o realce da marca (consistente com .form-control:focus). */
.choices.is-focused .choices__inner {
    border-color: var(--brand-primary, #3874ff);
    box-shadow: 0 0 0 .25rem color-mix(in srgb, var(--brand-primary, #3874ff) 25%, transparent);
}

/* Campo travado: mesma leitura de um <select disabled>. */
.choices.is-disabled .choices__inner {
    background-color: var(--phoenix-secondary-bg, rgba(0, 0, 0, .035)) !important;
    cursor: not-allowed;
    opacity: 1;
}

/* Erro de validacao (a view marca o <select> com .is-invalid). */
.choices.invalid .choices__inner { border-color: var(--phoenix-danger, #e5780b); }

/* --- Lista do dropdown ------------------------------------------------
   O tema pinta cada item com --phoenix-gray-200, o que empasta a lista
   inteira; aqui so o item sob o cursor/teclado recebe cor. */
.choices .choices__list--dropdown .choices__item--selectable {
    background-color: transparent;
    color: var(--phoenix-body-color, #525b75);
    padding: .35rem 1rem;
    font-size: .9rem !important;
}
.choices .choices__list--dropdown .choices__item--selectable.is-highlighted {
    background-color: var(--brand-primary, #3874ff);
    color: #fff;
}
.choices .choices__list--dropdown .choices__item--selectable[data-value=""] {
    color: var(--phoenix-secondary-color, #8a94ad);
}
.choices .choices__list--dropdown .choices__item--disabled { opacity: .5; }
.choices .choices__list--dropdown .choices__list { max-height: 16rem; }

/* Campo de digitacao da busca: e o coracao do padrao, precisa parecer campo. */
.choices .choices__list--dropdown .choices__input {
    background-color: var(--phoenix-input-bg, #fff) !important;
    color: var(--phoenix-input-color, #31374a);
    border-bottom: 1px solid var(--phoenix-border-color, #cbd0dd);
    padding: .5rem 1rem;
    font-size: .9rem;
}

/* --- Tamanhos (espelham .form-select-sm / .form-select-lg) ------------- */
.choices.azm-choices-sm .choices__inner {
    min-height: calc(1.5em + .5rem + 2px) !important;
    padding: .25rem 2.25rem .25rem .75rem;
    font-size: .8rem;
    line-height: 1.25rem !important;
    border-radius: .25rem;
}
.choices.azm-choices-sm[data-type*="select-one"] .choices__inner { padding-bottom: .25rem !important; }
.choices.azm-choices-sm .choices__list--dropdown .choices__item--selectable { font-size: .8rem !important; }
.choices.azm-choices-sm .choices__list--dropdown .choices__input { font-size: .8rem; padding: .35rem .75rem; }
.choices.azm-choices-sm::after { right: .75rem; }

.choices.azm-choices-lg .choices__inner {
    padding: .5rem 3.5rem .5rem 1rem;
    font-size: 1.125rem;
    border-radius: .5rem;
}

/* A caixa nunca pode estourar a coluna/celula que a contem. */
.choices { max-width: 100%; }

/* --- Campo nativo por tras do widget (campos obrigatorios) -------------
   O Choices marca o <select> original com `hidden`; um campo `required`
   escondido faz o Chrome abortar o submit sem mensagem nenhuma. O JS tira o
   `hidden` e aplica esta classe: o campo continua invisivel e sem interacao,
   mas segue "renderizado" — a validacao nativa volta a funcionar e a bolha de
   erro aparece ancorada no canto do campo. */
.choices select.azm-select-validavel {
    display: block !important;
    position: absolute !important;
    left: 1rem;
    bottom: 2px;
    width: 1px !important;
    height: 1px !important;
    min-height: 0 !important;
    padding: 0 !important;
    margin: 0 !important;
    border: 0 !important;
    background: transparent !important;
    box-shadow: none !important;
    opacity: 0 !important;
    pointer-events: none;
    -webkit-appearance: none;
    appearance: none;
}

/* =====================================================================
   9. Endereco por CEP (.azm-endereco)
   ===================================================================== */
/* Campo preenchido pela consulta de CEP: legivel, mas visivelmente travado.
   Usamos `readonly` (nao `disabled`) para o valor continuar indo no POST — o
   estilo abaixo e o que comunica o bloqueio ao usuario. */
.azm-endereco .azm-campo-bloqueado,
.azm-endereco .azm-campo-bloqueado:focus {
    background-color: var(--phoenix-secondary-bg, rgba(0, 0, 0, .035));
    cursor: not-allowed;
    box-shadow: none;
    border-color: var(--phoenix-border-color, #cbd0dd);
}
.dark .azm-endereco .azm-campo-bloqueado,
.dark .azm-endereco .azm-campo-bloqueado:focus {
    background-color: rgba(255, 255, 255, .04);
}

/* Mensagem de apoio do bloco (consultando / preenchido / erro). */
.azm-endereco-status {
    min-height: 1.5rem;
    padding-bottom: .35rem;
    line-height: 1.35;
}
.azm-endereco-status i { vertical-align: -2px; }

/* Consulta em andamento: sinaliza sem bloquear a interacao. */
.azm-endereco-carregando .azm-cep {
    background-image: linear-gradient(90deg,
        transparent 0%,
        color-mix(in srgb, var(--brand-primary, #3874ff) 14%, transparent) 50%,
        transparent 100%);
    background-size: 200% 100%;
    animation: azm-cep-pulso 1.1s linear infinite;
}
@keyframes azm-cep-pulso {
    from { background-position: 200% 0; }
    to   { background-position: -200% 0; }
}
@media (prefers-reduced-motion: reduce) {
    .azm-endereco-carregando .azm-cep { animation: none; }
}

/* =====================================================================
   10. Seletor de usuarios por digitacao (.azm-usuarios)

   Campo composto: os chips e o input de busca vivem DENTRO da mesma
   moldura, para o conjunto ler como um unico controle de formulario.
   O foco e desenhado na moldura (o input real perde a borda), senao o
   usuario veria duas caixas concorrendo.
   ===================================================================== */
.azm-usuarios { position: relative; }

.azm-usuarios-campo {
    position: relative;
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: .35rem;
    min-height: calc(1.5em + 1rem + 2px);
    padding: .3rem .4rem;
    background-color: var(--phoenix-input-bg, var(--phoenix-card-bg, #fff));
    border: 1px solid var(--phoenix-input-border-color, var(--phoenix-border-color, #cbd0dd));
    border-radius: var(--phoenix-border-radius, .375rem);
}
.azm-usuarios-campo:focus-within {
    border-color: var(--brand-primary, #3874ff);
    box-shadow: 0 0 0 .25rem color-mix(in srgb, var(--brand-primary, #3874ff) 20%, transparent);
}
.azm-usuarios.is-invalid .azm-usuarios-campo {
    border-color: var(--phoenix-danger, #e5780b);
}

/* O input real e transparente: a moldura acima e que faz o papel dele. */
.azm-usuarios-input,
.azm-usuarios-input:focus {
    flex: 1 1 12rem;
    min-width: 8rem;
    width: auto;
    border: 0;
    background: transparent;
    box-shadow: none;
    padding: .2rem .25rem;
}
.azm-usuarios-input:disabled { background: transparent; cursor: not-allowed; }

/* ---- Chips (usuarios ja escolhidos) ---- */
.azm-usuarios-chips { display: contents; }

.azm-usuarios-chip {
    display: inline-flex;
    align-items: center;
    gap: .4rem;
    max-width: 100%;
    padding: .2rem .3rem .2rem .55rem;
    border-radius: 2rem;
    background: color-mix(in srgb, var(--brand-primary, #3874ff) 12%, transparent);
    border: 1px solid color-mix(in srgb, var(--brand-primary, #3874ff) 28%, transparent);
    line-height: 1.15;
}
.azm-usuarios-chip-texto { display: inline-flex; flex-direction: column; min-width: 0; }
.azm-usuarios-chip-nome {
    font-size: .8125rem;
    font-weight: 600;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}
.azm-usuarios-chip-meta {
    font-size: .6875rem;
    color: var(--phoenix-secondary-color, #6e7891);
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}
.azm-usuarios-remover {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    flex: 0 0 auto;
    width: 1.15rem;
    height: 1.15rem;
    padding: 0;
    border: 0;
    border-radius: 50%;
    background: transparent;
    color: var(--phoenix-secondary-color, #6e7891);
}
.azm-usuarios-remover:hover {
    background: color-mix(in srgb, var(--phoenix-danger, #e5780b) 18%, transparent);
    color: var(--phoenix-danger, #e5780b);
}
.azm-usuarios-remover svg { width: 12px; height: 12px; stroke-width: 2.5; }

/* ---- Lista de resultados ---- */
.azm-usuarios-lista {
    position: absolute;
    z-index: 1056;               /* acima do modal de filtros do tema */
    top: 100%;
    left: 0;
    right: 0;
    margin-top: .25rem;
    max-height: 17rem;
    overflow-y: auto;
    background: var(--phoenix-card-bg, #fff);
    border: 1px solid var(--phoenix-border-color, #cbd0dd);
    border-radius: var(--phoenix-border-radius, .375rem);
    box-shadow: 0 .5rem 1.5rem rgba(0, 0, 0, .12);
}
.azm-usuarios-item {
    display: flex;
    flex-direction: column;
    gap: .1rem;
    width: 100%;
    padding: .5rem .75rem;
    border: 0;
    background: transparent;
    text-align: left;
}
.azm-usuarios-item + .azm-usuarios-item {
    border-top: 1px solid color-mix(in srgb, var(--phoenix-border-color, #cbd0dd) 55%, transparent);
}
.azm-usuarios-item:hover,
.azm-usuarios-item.is-ativo {
    background: color-mix(in srgb, var(--brand-primary, #3874ff) 10%, transparent);
}
.azm-usuarios-item-nome { font-size: .875rem; font-weight: 600; }
.azm-usuarios-item-meta { font-size: .75rem; color: var(--phoenix-secondary-color, #6e7891); }

.azm-usuarios-vazio {
    padding: .65rem .75rem;
    font-size: .8125rem;
    color: var(--phoenix-secondary-color, #6e7891);
}

/* Consulta em andamento: sinaliza sem bloquear a digitacao. */
.azm-usuarios-carregando .azm-usuarios-campo::after {
    content: '';
    position: absolute;
    right: .6rem;
    top: 50%;
    width: .85rem;
    height: .85rem;
    margin-top: -.425rem;
    border: 2px solid color-mix(in srgb, var(--brand-primary, #3874ff) 35%, transparent);
    border-top-color: var(--brand-primary, #3874ff);
    border-radius: 50%;
    animation: azm-usuarios-giro .7s linear infinite;
}
@keyframes azm-usuarios-giro { to { transform: rotate(360deg); } }
@media (prefers-reduced-motion: reduce) {
    .azm-usuarios-carregando .azm-usuarios-campo::after { animation: none; }
}

.dark .azm-usuarios-lista { box-shadow: 0 .5rem 1.5rem rgba(0, 0, 0, .5); }

/* =====================================================================
   10b. Escolha de chat/grupo do WhatsApp (.azm-chatpick)

   Difere do seletor de usuarios acima num ponto que muda o desenho: aqui
   o campo continua sendo um <input> comum, com name — o autocomplete so'
   PREENCHE o valor. Por isso nao ha moldura composta nem chip: ha o campo
   (que o Bootstrap ja veste) e, abaixo, um cartao que mostra de quem e' o
   ID que esta valendo. E' ele que responde "e' este grupo mesmo?".
   ===================================================================== */
.azm-chatpick { position: relative; }
.azm-chatpick-campo { position: relative; }

/* ---- Avatar: iniciais embaixo, foto por cima ----
   A URL da miniatura do WhatsApp expira; quando a imagem morre ela e
   removida (azm-zapi-chats.js) e as iniciais ja estao no lugar. */
.azm-chatpick-av {
    position: relative;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    flex: 0 0 auto;
    width: 2rem;
    height: 2rem;
    border-radius: 50%;
    overflow: hidden;
    background: color-mix(in srgb, var(--brand-primary, #3874ff) 14%, transparent);
    color: var(--brand-primary, #3874ff);
    font-size: .6875rem;
    font-weight: 700;
    letter-spacing: .02em;
}
.azm-chatpick-av img {
    position: absolute;
    inset: 0;
    width: 100%;
    height: 100%;
    object-fit: cover;
}

/* ---- Cartao do valor em vigor ---- */
.azm-chatpick-atual {
    display: flex;
    align-items: center;
    gap: .55rem;
    margin-top: .5rem;
    padding: .45rem .6rem;
    border: 1px solid var(--phoenix-border-color, #cbd0dd);
    border-radius: var(--phoenix-border-radius, .375rem);
    background: color-mix(in srgb, var(--phoenix-border-color, #cbd0dd) 12%, transparent);
}
.azm-chatpick-atual[hidden] { display: none; }

.azm-chatpick-texto { display: inline-flex; flex-direction: column; min-width: 0; }
.azm-chatpick-nome {
    font-size: .8125rem;
    font-weight: 600;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}
.azm-chatpick-id {
    font-size: .6875rem;
    font-family: var(--phoenix-font-monospace, ui-monospace, SFMono-Regular, Menlo, monospace);
    color: var(--phoenix-secondary-color, #6e7891);
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}

/* ---- Lista de resultados ---- */
.azm-chatpick-lista {
    position: absolute;
    z-index: 1056;               /* acima do modal de filtros do tema */
    top: 100%;
    left: 0;
    right: 0;
    margin-top: .25rem;
    max-height: 19rem;
    overflow-y: auto;
    background: var(--phoenix-card-bg, #fff);
    border: 1px solid var(--phoenix-border-color, #cbd0dd);
    border-radius: var(--phoenix-border-radius, .375rem);
    box-shadow: 0 .5rem 1.5rem rgba(0, 0, 0, .12);
}
.azm-chatpick-item {
    display: flex;
    align-items: center;
    gap: .55rem;
    width: 100%;
    padding: .45rem .75rem;
    border: 0;
    background: transparent;
    text-align: left;
}
.azm-chatpick-item + .azm-chatpick-item {
    border-top: 1px solid color-mix(in srgb, var(--phoenix-border-color, #cbd0dd) 55%, transparent);
}
.azm-chatpick-item:hover,
.azm-chatpick-item.is-ativo {
    background: color-mix(in srgb, var(--brand-primary, #3874ff) 10%, transparent);
}
.azm-chatpick-item-texto { display: flex; flex-direction: column; min-width: 0; }
.azm-chatpick-item-nome {
    font-size: .875rem;
    font-weight: 600;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}
.azm-chatpick-item-id {
    font-size: .6875rem;
    font-family: var(--phoenix-font-monospace, ui-monospace, SFMono-Regular, Menlo, monospace);
    color: var(--phoenix-secondary-color, #6e7891);
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}
.azm-chatpick-tag {
    margin-left: auto;
    flex: 0 0 auto;
    font-size: .625rem;
    text-transform: uppercase;
    letter-spacing: .04em;
    color: var(--phoenix-secondary-color, #6e7891);
}
.azm-chatpick-vazio {
    padding: .65rem .75rem;
    font-size: .8125rem;
    color: var(--phoenix-secondary-color, #6e7891);
}

/* Consulta em andamento: sinaliza sem bloquear a digitacao. */
.azm-chatpick-carregando .azm-chatpick-campo::after {
    content: '';
    position: absolute;
    right: .6rem;
    top: 50%;
    width: .85rem;
    height: .85rem;
    margin-top: -.425rem;
    border: 2px solid color-mix(in srgb, var(--brand-primary, #3874ff) 35%, transparent);
    border-top-color: var(--brand-primary, #3874ff);
    border-radius: 50%;
    animation: azm-usuarios-giro .7s linear infinite;
}
@media (prefers-reduced-motion: reduce) {
    .azm-chatpick-carregando .azm-chatpick-campo::after { animation: none; }
}

.dark .azm-chatpick-lista { box-shadow: 0 .5rem 1.5rem rgba(0, 0, 0, .5); }

/* =====================================================================
   11. Assistente virtual do portal publico (.azm-chat)

   Widget flutuante (launcher + painel) do <x-portal.chatbot>. Vale a mesma
   regra da secao 5: como o painel NAO e um `.card`, superficie e borda saem
   de --phoenix-white / --phoenix-gray-200 (as duas existem no claro e no
   escuro). --phoenix-card-bg e --phoenix-border-color so passaram a valer
   fora de `.card` a partir da secao 18.1.

   Cor de destaque: --brand-primary do tenant. Nenhuma marca fixa.
   ===================================================================== */
.azm-chat {
    --chat-superficie: var(--phoenix-white, #fff);
    --chat-borda: var(--phoenix-gray-200, #e3e6ed);
    --chat-marca: var(--brand-primary, #3874ff);

    position: fixed;
    right: 1.25rem;
    bottom: 1.25rem;
    z-index: 1035; /* acima do conteudo, abaixo de modal (1055) e toast */
    display: flex;
    flex-direction: column;
    align-items: flex-end;
    gap: .75rem;
}

/* ---------- Botao flutuante ---------- */
.azm-chat-launcher {
    order: 2; /* o painel abre ACIMA do botao */
    width: 3.5rem;
    height: 3.5rem;
    padding: 0;
    border: 0;
    border-radius: 50%;
    background: var(--chat-marca);
    color: #fff;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    box-shadow: 0 .75rem 1.75rem -.35rem color-mix(in srgb, var(--chat-marca) 65%, transparent);
    transition: transform .15s ease, box-shadow .15s ease;
}
.azm-chat-launcher:hover { transform: translateY(-2px); }
.azm-chat-launcher:focus-visible {
    outline: 2px solid var(--chat-marca);
    outline-offset: 3px;
}
.azm-chat-launcher svg { width: 24px; height: 24px; }

/* Um icone por estado (o outro some) — sem trocar markup por JS. */
.azm-chat-launcher .azm-chat-ico-fechar,
.azm-chat.is-aberto .azm-chat-launcher .azm-chat-ico-abrir { display: none; }
.azm-chat.is-aberto .azm-chat-launcher .azm-chat-ico-fechar { display: inline-flex; }

/* ---------- Painel ---------- */
.azm-chat-painel {
    order: 1;
    padding: 0px;
    display: flex;
    flex-direction: column;
    overflow: hidden;
    width: min(23rem, calc(100vw - 2.5rem));
    height: min(34rem, calc(100vh - 8rem));
    background: var(--chat-superficie);
    border: 1px solid var(--chat-borda);
    border-radius: 1rem;
    box-shadow: 0 1.5rem 3rem -.75rem rgba(0, 0, 0, .25);
}
.azm-chat-painel[hidden] { display: none; }

.azm-chat-head {
    display: flex;
    align-items: center;
    gap: .65rem;
    padding: .85rem 1rem;
    background: linear-gradient(135deg,
        color-mix(in srgb, var(--chat-marca) 88%, #000), var(--chat-marca));
    color: #fff;
}
.azm-chat-avatar {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    flex: 0 0 auto;
    width: 2.25rem;
    height: 2.25rem;
    border-radius: 50%;
    background: rgba(255, 255, 255, .2);
    border: 1px solid rgba(255, 255, 255, .35);
    font-size: .8125rem;
    font-weight: 700;
}
.azm-chat-head-txt { flex: 1 1 auto; min-width: 0; line-height: 1.2; }
.azm-chat-head-txt strong { display: block; font-size: .9375rem; }
.azm-chat-head-txt small { font-size: .75rem; opacity: .85; }
.azm-chat-fechar {
    flex: 0 0 auto;
    padding: .15rem;
    border: 0;
    background: transparent;
    color: inherit;
    opacity: .85;
    line-height: 0;
}
.azm-chat-fechar:hover { opacity: 1; }
.azm-chat-fechar svg { width: 18px; height: 18px; }

/* ---------- Conversa ---------- */
.azm-chat-mensagens {
    flex: 1 1 auto;
    overflow-y: auto;
    padding: 1rem;
    background: color-mix(in srgb, var(--phoenix-gray-200, #e3e6ed) 22%, var(--chat-superficie));
}
.azm-chat-linha { display: flex; margin-bottom: .6rem; }
.azm-chat-linha-user { justify-content: flex-end; }

.azm-chat-bolha {
    max-width: 85%;
    padding: .55rem .75rem;
    border-radius: .85rem;
    background: var(--chat-superficie);
    border: 1px solid var(--chat-borda);
    font-size: .8125rem;
    line-height: 1.5;
    white-space: pre-line;
}
.azm-chat-linha-bot .azm-chat-bolha { border-bottom-left-radius: .25rem; }
.azm-chat-linha-user .azm-chat-bolha {
    background: var(--chat-marca);
    border-color: var(--chat-marca);
    color: #fff;
    border-bottom-right-radius: .25rem;
}
/* Quem esta falando, quando nao e' o bot: a pessoa precisa saber que passou a
   conversar com gente. Sem isso, uma resposta escrita a mao parece do robo. */
.azm-chat-marca {
    display: block;
    font-size: .6875rem;
    font-weight: 700;
    text-transform: uppercase;
    letter-spacing: .02em;
    opacity: .7;
    margin-bottom: .15rem;
}

/* Aviso do sistema (conectando, encerrado, fila): mesma caixa, tom de nota. */
.azm-chat-linha-nota .azm-chat-bolha {
    background: color-mix(in srgb, var(--brand-warning, #e5780b) 12%, var(--chat-superficie));
    border-color: color-mix(in srgb, var(--brand-warning, #e5780b) 35%, transparent);
    font-size: .75rem;
}

/* Entrada suave APENAS das mensagens novas (marcadas no desenho). */
.azm-chat-linha.is-nova { animation: azm-chat-entrada .18s ease-out; }
@keyframes azm-chat-entrada {
    from { opacity: 0; transform: translateY(.35rem); }
    to { opacity: 1; transform: none; }
}
@media (prefers-reduced-motion: reduce) {
    .azm-chat-linha.is-nova { animation: none; }
    .azm-chat-launcher:hover { transform: none; }
}

/* ---------- Opcoes ---------- */
.azm-chat-acoes { display: grid; gap: .4rem; margin: .25rem 0 .5rem; }
.azm-chat-acao {
    display: block;
    width: 100%;
    padding: .5rem .7rem;
    border: 1px solid var(--chat-borda);
    border-radius: .6rem;
    background: var(--chat-superficie);
    color: var(--phoenix-body-color, #525b75);
    font-size: .8125rem;
    font-weight: 600;
    text-align: left;
    text-decoration: none;
    transition: background-color .12s ease, border-color .12s ease;
}
.azm-chat-acao:hover {
    background: color-mix(in srgb, var(--chat-marca) 9%, var(--chat-superficie));
    border-color: color-mix(in srgb, var(--chat-marca) 45%, transparent);
    color: var(--chat-marca);
}
.azm-chat-acao:focus-visible { outline: 2px solid var(--chat-marca); outline-offset: 1px; }
.azm-chat-acao.is-principal { border-color: color-mix(in srgb, var(--chat-marca) 55%, transparent); color: var(--chat-marca); }
.azm-chat-acao.is-voltar {
    border-style: dashed;
    font-weight: 500;
    color: var(--phoenix-secondary-color, #6e7891);
}

/* ---------- Caixa de texto ---------- */
.azm-chat-envio {
    display: flex;
    gap: .4rem;
    padding: .65rem;
    border-top: 1px solid var(--chat-borda);
    background: var(--chat-superficie);
}
.azm-chat-envio .form-control { min-width: 0; }
.azm-chat-envio .btn svg { width: 15px; height: 15px; }
/* Passo de botoes: o campo continua visivel (previsibilidade), mas apagado. */
.azm-chat-envio.is-inativo { opacity: .6; }

/* ---------- Telas pequenas: o painel toma a tela ---------- */
@media (max-width: 575.98px) {
    .azm-chat { right: .75rem; bottom: .75rem; left: .75rem; align-items: flex-end; }
    .azm-chat-painel {
        width: 100%;
        height: calc(100vh - 6.5rem);
        height: calc(100dvh - 6.5rem);
    }
}

/* ---------- Tema escuro ---------- */
.dark .azm-chat-painel { box-shadow: 0 1.5rem 3rem -.75rem rgba(0, 0, 0, .6); }

/* =====================================================================
   12. Dialogos, toasts e faixas de aviso (.azm-dialogo / .azm-toast / .azm-alerta)

   Substituem o `confirm()`/`alert()` do navegador e as faixas `.alert` cruas.
   Tudo em variaveis do tema (Bootstrap/Phoenix), entao claro e escuro saem de
   graca e nenhuma marca fica fixa aqui.
   ===================================================================== */

/* ---------- Dialogo modal ---------- */
.azm-dialogo-fundo {
    position: fixed;
    inset: 0;
    z-index: 1085;                      /* acima do modal do Bootstrap (1055) */
    display: flex;
    align-items: center;
    justify-content: center;
    padding: 1rem;
    background: rgba(11, 23, 39, .55);
    opacity: 0;
    transition: opacity .18s ease;
}
.azm-dialogo-fundo.is-aberto { opacity: 1; }

body.azm-dialogo-travado { overflow: hidden; }

.azm-dialogo {
    width: 100%;
    max-width: 26rem;
    background: var(--phoenix-card-bg, #fff);
    color: var(--phoenix-body-color, #31374a);
    border: 1px solid var(--phoenix-border-color, #e3e6ed);
    border-radius: .75rem;
    box-shadow: 0 1.5rem 3rem -.75rem rgba(0, 0, 0, .35);
    transform: translateY(.75rem) scale(.98);
    transition: transform .18s ease;
}
.azm-dialogo-fundo.is-aberto .azm-dialogo { transform: none; }

.azm-dialogo-corpo {
    display: flex;
    gap: .85rem;
    padding: 1.25rem 1.25rem .5rem;
}

.azm-dialogo-icone {
    flex: 0 0 auto;
    width: 2.5rem;
    height: 2.5rem;
    padding: .55rem;
    border-radius: 50%;
    stroke-width: 2;
}
.azm-dialogo-perigo  .azm-dialogo-icone { color: var(--phoenix-danger,  #ed2000); background: rgba(237, 32, 0, .12); }
.azm-dialogo-aviso   .azm-dialogo-icone { color: var(--phoenix-warning, #e5780b); background: rgba(229, 120, 11, .14); }
.azm-dialogo-info    .azm-dialogo-icone { color: var(--phoenix-info,    #0097eb); background: rgba(0, 151, 235, .12); }
.azm-dialogo-sucesso .azm-dialogo-icone { color: var(--phoenix-success, #25b003); background: rgba(37, 176, 3, .12); }

.azm-dialogo-textos { min-width: 0; }

.azm-dialogo-titulo {
    margin: .15rem 0 .35rem;
    font-size: 1rem;
    font-weight: 700;
    line-height: 1.35;
}

.azm-dialogo-texto {
    margin: 0;
    font-size: .875rem;
    line-height: 1.5;
    color: var(--phoenix-secondary-color, #6e7891);
    white-space: pre-line;              /* a mensagem pode ter quebras de linha */
}

.azm-dialogo-acoes {
    display: flex;
    justify-content: flex-end;
    gap: .5rem;
    padding: .85rem 1.25rem 1.15rem;
}

@media (max-width: 575.98px) {
    .azm-dialogo-acoes { flex-direction: column-reverse; }
    .azm-dialogo-acoes .btn { width: 100%; }
}

/* ---------- Toasts ---------- */
.azm-toasts {
    position: fixed;
    top: 1rem;
    right: 1rem;
    z-index: 1090;                      /* acima do proprio dialogo */
    display: flex;
    flex-direction: column;
    gap: .5rem;
    max-width: min(24rem, calc(100vw - 2rem));
    pointer-events: none;               /* a pagina atras continua clicavel */
}

.azm-toast {
    pointer-events: auto;
    display: flex;
    align-items: flex-start;
    gap: .6rem;
    padding: .7rem .8rem;
    background: var(--phoenix-card-bg, #fff);
    border: 1px solid var(--phoenix-border-color, #e3e6ed);
    border-left-width: .25rem;
    border-radius: .5rem;
    box-shadow: 0 .75rem 1.5rem -.5rem rgba(0, 0, 0, .25);
    opacity: 0;
    transform: translateX(.75rem);
    transition: opacity .18s ease, transform .18s ease;
}
.azm-toast.is-aberto { opacity: 1; transform: none; }

.azm-toast .azm-dialogo-icone {
    width: 1.35rem;
    height: 1.35rem;
    padding: 0;
    margin-top: .1rem;
    background: none;
}

.azm-toast-sucesso { border-left-color: var(--phoenix-success, #25b003); }
.azm-toast-sucesso .azm-dialogo-icone { color: var(--phoenix-success, #25b003); }
.azm-toast-perigo  { border-left-color: var(--phoenix-danger,  #ed2000); }
.azm-toast-perigo  .azm-dialogo-icone { color: var(--phoenix-danger,  #ed2000); }
.azm-toast-aviso   { border-left-color: var(--phoenix-warning, #e5780b); }
.azm-toast-aviso   .azm-dialogo-icone { color: var(--phoenix-warning, #e5780b); }
.azm-toast-info    { border-left-color: var(--phoenix-info,    #0097eb); }
.azm-toast-info    .azm-dialogo-icone { color: var(--phoenix-info,    #0097eb); }

.azm-toast-textos { min-width: 0; flex: 1 1 auto; font-size: .8125rem; line-height: 1.45; }
.azm-toast-titulo { display: block; font-size: .875rem; }
.azm-toast-texto  { color: var(--phoenix-secondary-color, #6e7891); word-break: break-word; }

.azm-toast-fechar {
    flex: 0 0 auto;
    padding: 0 .15rem;
    font-size: 1.15rem;
    line-height: 1;
    color: var(--phoenix-secondary-color, #6e7891);
    background: none;
    border: 0;
    opacity: .7;
}
.azm-toast-fechar:hover { opacity: 1; }

@media (max-width: 575.98px) {
    .azm-toasts { top: auto; bottom: 1rem; left: 1rem; right: 1rem; max-width: none; }
}

/* ---------- Faixa de aviso na propria pagina ---------- */
/* Para o que NAO pode sumir sozinho: erro de validacao, estado do sistema. */
.azm-alerta {
    display: flex;
    align-items: flex-start;
    gap: .65rem;
    padding: .75rem .9rem;
    font-size: .875rem;
    line-height: 1.5;
    border: 1px solid var(--phoenix-border-color, #e3e6ed);
    border-left-width: .25rem;
    border-radius: .5rem;
    background: var(--phoenix-card-bg, #fff);
}
.azm-alerta ul { margin: 0; padding-left: 1.1rem; }

.azm-alerta-icone { flex: 0 0 auto; width: 1.15rem; height: 1.15rem; margin-top: .15rem; }

.azm-alerta-ok     { border-left-color: var(--phoenix-success, #25b003); }
.azm-alerta-ok     .azm-alerta-icone { color: var(--phoenix-success, #25b003); }
.azm-alerta-erro   { border-left-color: var(--phoenix-danger,  #ed2000); }
.azm-alerta-erro   .azm-alerta-icone { color: var(--phoenix-danger,  #ed2000); }
.azm-alerta-aviso  { border-left-color: var(--phoenix-warning, #e5780b); }
.azm-alerta-aviso  .azm-alerta-icone { color: var(--phoenix-warning, #e5780b); }
.azm-alerta-info   { border-left-color: var(--phoenix-info,    #0097eb); }
.azm-alerta-info   .azm-alerta-icone { color: var(--phoenix-info,    #0097eb); }

/* ---------- Tema escuro ---------- */
/* O tema escuro do Phoenix esquece varias `*-rgb` (ver secao 6): por isso as
   superficies aqui saem de `--phoenix-body-bg`, que ele sobrescreve direito. */
.dark .azm-dialogo-fundo { background: rgba(0, 0, 0, .65); }
.dark .azm-dialogo,
.dark .azm-toast,
.dark .azm-alerta { box-shadow: 0 1rem 2rem -.5rem rgba(0, 0, 0, .6); }

/* =====================================================================
   13. Curriculo do candidato (.azm-curriculo)

   Reaproveita a barra de progresso do upload de documentos (secao 5,
   `.azm-doc-bar`); o que muda e' a moldura, porque aqui o bloco e' o primeiro
   campo do formulario e nao um item de checklist.
   ===================================================================== */
.azm-curriculo {
    padding: .9rem;
    border: 1px dashed var(--phoenix-border-color, #e3e6ed);
    border-radius: .5rem;
    background: var(--phoenix-secondary-bg, #f5f7fa);
}
.azm-curriculo.is-enviado { border-style: solid; border-color: var(--phoenix-success, #25b003); }

.azm-curriculo-drop {
    display: block;
    padding: .9rem;
    text-align: center;
    cursor: pointer;
    border: 1px dashed var(--phoenix-border-color, #e3e6ed);
    border-radius: .5rem;
    background: var(--phoenix-card-bg, #fff);
    transition: border-color .15s ease, background-color .15s ease;
}
.azm-curriculo-drop:hover { border-color: var(--brand-primary, #3874ff); }
.azm-curriculo-drop input[type="file"] { display: none; }
.azm-curriculo-drop-texto { display: inline-flex; align-items: center; gap: .5rem; font-size: .875rem; }

.azm-curriculo.is-enviando .azm-curriculo-drop { opacity: .6; pointer-events: none; }

.azm-curriculo-status { margin-top: .5rem; font-size: .8125rem; line-height: 1.45; }

.azm-curriculo-resultado {
    margin-top: .6rem;
    padding-top: .6rem;
    border-top: 1px solid var(--phoenix-border-color, #e3e6ed);
}

.azm-curriculo-arquivo {
    display: inline-block;
    margin-bottom: .35rem;
    font-size: .875rem;
    font-weight: 600;
    word-break: break-all;
}

/* Campo preenchido pela leitura do arquivo: destaque discreto e temporario,
   para o RH saber o que CONFERIR sem que a tela pareça um formulário com erro. */
.azm-campo-do-curriculo {
    border-color: var(--phoenix-success, #25b003) !important;
    background-image: linear-gradient(0deg, rgba(37, 176, 3, .06), rgba(37, 176, 3, .06));
}
.azm-campo-do-curriculo:focus { background-image: none; }

/* =====================================================================
   14. Barra de progresso da navegacao (.azm-progresso)
   ---------------------------------------------------------------------
   Linha fina logo ABAIXO do header fixo, no lugar da barra que o navegador
   desenharia se a navegacao nao fosse parcial (HTMX). Controle em
   public/js/azm-progresso.js; aqui so a aparencia.

   Posicao: `fixed` colada no rodape da navbar superior, cuja altura o tema
   ja publica em --phoenix-navbar-top-height (varia por breakpoint, entao a
   barra acompanha sozinha). z-index acima do conteudo e da navbar (1030),
   abaixo dos modais (1055).

   O ESTADO (largura e classes) fica no <html>, e nao neste elemento: voltar e
   avancar no painel reinserem um retrato do <body> guardado pelo htmx, tirado
   com a barra ainda no ar. Classe e style inline aqui dentro voltavam
   congelados nesse retrato — uma barra parada na tela que nenhum
   carregamento fechava. O <html> nao entra no retrato.
   ===================================================================== */
:root { --azm-progresso-avanco: 0; }

.azm-progresso {
    position: fixed;
    top: var(--phoenix-navbar-top-height, 4rem);
    left: 0;
    right: 0;
    height: 3px;
    z-index: 1035;
    pointer-events: none;
    opacity: 0;
    /* visibility, e nao so opacidade: elemento `fixed` com opacidade 0
       continua no fluxo de pintura, e o Chrome as vezes deixa o ultimo quadro
       dele na tela quando a troca acontece junto de um swap pesado — o rastro
       ficava ali ate' alguma outra coisa forcar o repinte. Escondido de
       verdade, nao ha quadro para sobrar. O atraso de .2s espera o fade. */
    visibility: hidden;
    transition: opacity .2s ease, visibility 0s linear .2s;
    will-change: opacity;
}

html.azm-progresso-ativo .azm-progresso {
    opacity: 1;
    visibility: visible;
    transition: opacity .2s ease;
}

/* Fecho: some junto com a barra chegando a 100%, sem "pular" para vazio.
   Depois do estado ativo de proposito — mesma especificidade, quem vem por
   ultimo manda. */
html.azm-progresso-fim .azm-progresso { opacity: 0; transition: opacity .3s ease .12s; }

.azm-progresso-barra {
    display: block;
    height: 100%;
    width: 100%;
    /* O avanco e' TRANSFORM, nao largura: transform anima no compositor, sem
       repintar a faixa da tela a cada passo. Animar `width` de um elemento
       fixo, em cima de uma troca de tela inteira, e' o que deixava pedaco de
       barra pintado depois de a barra ter sumido do DOM. Fracao de 0 a 1. */
    transform: scaleX(var(--azm-progresso-avanco, 0));
    transform-origin: 0 50%;
    will-change: transform;
    /* Cor da marca do tenant (--brand-primary vem do TenantManager); o azul
       do tema e' so o fallback de quem nao tem marca definida. */
    background: linear-gradient(90deg,
        var(--brand-primary, var(--phoenix-primary, #3874ff)) 0%,
        var(--brand-secondary, var(--phoenix-primary, #3874ff)) 100%);
    /* Brilho na ponta: reforca a sensacao de movimento no avanco fingido. */
    /*box-shadow: 0 0 8px var(--brand-primary, var(--phoenix-primary, #3874ff));*/
    transition: transform .2s ease;
}

/* Quem pediu menos movimento nao ganha o avanco animado — so o estado. */
@media (prefers-reduced-motion: reduce) {
    .azm-progresso,
    .azm-progresso-barra { transition: none; }
}

/* =====================================================================
   15. Linha do tempo (.azm-linha-tempo-*)
   ---------------------------------------------------------------------
   Historico consolidado do candidato (Vagas > Candidatos > ficha): eventos
   de origens diferentes — conta no portal, candidaturas, triagem,
   documentacoes e anexos — numa coluna unica em ordem cronologica.

   A linha vertical e um ::before do proprio item (e nao um elemento a
   parte), para o marcador e o traco nunca sairem de sincronia quando o
   texto do evento quebra em varias linhas.
   ===================================================================== */
.azm-linha-tempo-item {
    position: relative;
    display: flex;
    gap: .75rem;
    padding-bottom: 1.1rem;
}

.azm-linha-tempo-item:last-child { padding-bottom: 0; }

/* Traco ligando um marcador ao proximo (o ultimo nao tem proximo). */
.azm-linha-tempo-item:not(:last-child)::before {
    content: "";
    position: absolute;
    left: 11px;
    top: 24px;
    bottom: 0;
    width: 1px;
    background: var(--phoenix-border-color, #e3e6ed);
}

.azm-linha-tempo-ponto {
    flex: 0 0 auto;
    width: 23px;
    height: 23px;
    border-radius: 50%;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    /* Fica ACIMA do traco para o corte ficar limpo. */
    position: relative;
    z-index: 1;
}

/* =====================================================================
   16. Mapa do fluxo do bot (.azm-fluxo-*)

   A arvore de decisao do editor de fluxos (/bot/fluxos/{fluxo}). E' um
   desenho de CAIXAS E LIGACOES feito com listas aninhadas: a indentacao
   diz a profundidade e o traco pontilhado liga cada ramo ao passo que o
   originou. Sem canvas e sem biblioteca de diagrama — o que mantem a
   tela util no celular e o fluxo legivel por leitor de tela (continua
   sendo uma lista).

   Cores sempre por variavel do tema: claro e escuro saem de graca.
   ===================================================================== */
.azm-fluxo-raiz,
.azm-fluxo-ramos {
    list-style: none;
    margin: 0;
    padding: 0;
}

/* Filhos: recuo + a linha vertical que os une sob o passo de origem. */
.azm-fluxo-ramos {
    margin-left: .75rem;
    padding-left: 1rem;
    border-left: 1px dashed var(--phoenix-border-color, #e3e6ed);
}

.azm-fluxo-item {
    position: relative;
    padding: .3rem 0;
}

/* Traco horizontal ligando a linha vertical a caixa do passo. */
.azm-fluxo-ramos > .azm-fluxo-item::before {
    content: "";
    position: absolute;
    left: -1rem;
    top: 1.35rem;
    width: .75rem;
    border-top: 1px dashed var(--phoenix-border-color, #e3e6ed);
}

/* Rotulo da ligacao: o que a pessoa faz para seguir por este ramo. */
.azm-fluxo-aresta {
    display: inline-block;
    margin-bottom: .15rem;
    padding: .05rem .4rem;
    border-radius: .35rem;
    font-size: .7rem;
    line-height: 1.4;
    background: var(--phoenix-body-bg, #f5f7fa);
    border: 1px solid var(--phoenix-border-color, #e3e6ed);
    color: var(--phoenix-body-color, #31374a);
}

/* A cor diz a natureza do caminho, sem depender de ler o rotulo. */
.azm-fluxo-aresta-opcao       { border-color: var(--phoenix-primary, #3874ff); }
.azm-fluxo-aresta-proximo     { border-style: dashed; }
.azm-fluxo-aresta-alternativo { border-color: var(--phoenix-warning, #e5780b); }

/* ---------- A caixa do passo ---------- */
.azm-fluxo-no {
    display: flex;
    align-items: flex-start;
    gap: .5rem;
    width: 100%;
    max-width: 34rem;
    text-align: left;
    padding: .5rem .65rem;
    border: 1px solid var(--phoenix-border-color, #e3e6ed);
    border-radius: .5rem;
    background: var(--phoenix-card-bg, #fff);
    color: var(--phoenix-body-color, #31374a);
    transition: border-color .15s ease, box-shadow .15s ease;
}

button.azm-fluxo-no { cursor: pointer; }

button.azm-fluxo-no:hover,
button.azm-fluxo-no:focus-visible {
    border-color: var(--phoenix-primary, #3874ff);
    outline: none;
}

/* Passo escolhido no mapa (e todas as suas repeticoes na arvore). */
.azm-fluxo-no.is-selecionado {
    border-color: var(--phoenix-primary, #3874ff);
    box-shadow: 0 0 0 .15rem rgba(var(--phoenix-primary-rgb, 56, 116, 255), .18);
}

.azm-fluxo-no.is-inicial  { border-left: 3px solid var(--phoenix-primary, #3874ff); }
.azm-fluxo-no.is-pendente { border-color: var(--phoenix-warning, #e5780b); }

/* Volta para um passo ja desenhado: e' referencia, nao um passo novo. */
.azm-fluxo-no.is-repetido { border-style: dashed; opacity: .85; }

/* Ligacao que nao leva a lugar nenhum. */
.azm-fluxo-no-vazio {
    border-style: dashed;
    border-color: var(--phoenix-danger, #ed2000);
    color: var(--phoenix-danger, #ed2000);
    max-width: 26rem;
}

.azm-fluxo-no-icone {
    flex: 0 0 auto;
    display: inline-flex;
    margin-top: .1rem;
    color: var(--phoenix-secondary-color, #6e7891);
}

.azm-fluxo-no-icone svg { width: 15px; height: 15px; }

.azm-fluxo-no-corpo {
    display: flex;
    flex-direction: column;
    gap: .15rem;
    min-width: 0;
}

.azm-fluxo-no-titulo {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: .3rem;
    font-size: .8rem;
}

.azm-fluxo-no-texto {
    font-size: .75rem;
    color: var(--phoenix-secondary-color, #6e7891);
    /* Duas linhas bastam para reconhecer a fala; o texto inteiro fica no
       formulario do passo, a um clique daqui. */
    overflow-wrap: anywhere;
}

/* Passos que ninguem alcanca, desenhados a parte. */
.azm-fluxo-soltos {
    margin-top: 1rem;
    padding-top: .75rem;
    border-top: 1px dashed var(--phoenix-border-color, #e3e6ed);
}

/* Realce momentaneo do cartao aberto pelo mapa (o alvo da rolagem). */
.azm-fluxo-realce {
    box-shadow: 0 0 0 .15rem rgba(var(--phoenix-primary-rgb, 56, 116, 255), .35);
    transition: box-shadow .3s ease;
}

/* =====================================================================
   Dashboard comercial - tabela da equipe (.azm-equipe)
   =====================================================================
   Tabela larga (17 colunas, duas fontes de venda lado a lado). Tres
   problemas que uma tabela normal do painel nao tem:

   1. rolagem horizontal deixa a linha ANONIMA - a coluna da pessoa fica
      grudada (position: sticky) para o numero nunca perder o dono;
   2. cabecalho de dois andares - o primeiro diz de ONDE vem o numero;
   3. o rodape de totais e' referencia constante: fica grudado embaixo.

   Cores sempre derivadas das variaveis do tema (color-mix), nunca fixas:
   o mesmo bloco atende claro e escuro. */

.azm-equipe {
    font-size: .8125rem;
    /* Fixed: com 17 colunas o auto-layout redistribui a cada troca de
       filtro e a tabela "pula" na tela a cada busca. */
    table-layout: fixed;
    /* Soma das colunas declaradas (identificacao + cadastro, ~53rem) mais o
       espaco das de numero. Com `fixed`, o que sobra e' dividido por igual
       entre as colunas sem largura - aumentar as de informacao SEM aumentar
       este minimo espremeria as de numero na mesma conta. */
    min-width: 1900px;
}

/* A rolagem e' da tabela, nao da pagina (o body nunca rola de lado). */
.azm-equipe-scroll {
    overflow-x: auto;
    max-height: calc(100vh - 22rem);
    min-height: 18rem;
}

.azm-equipe th,
.azm-equipe td {
    padding: .45rem .5rem;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}

/* ---- Cabecalho: dois andares, ambos grudados no topo ---- */
.azm-equipe thead th {
    position: sticky;
    background: color-mix(in srgb, var(--phoenix-secondary-color, #6e7891) 9%, var(--phoenix-card-bg, #fff));
    color: var(--phoenix-secondary-color, #6e7891);
    font-weight: 700;
    z-index: 2;
}
.azm-equipe thead tr:first-child th { top: 0; }
.azm-equipe thead tr:last-child th {
    /* Altura da primeira faixa: o segundo andar para logo abaixo dela. */
    top: 2rem;
    border-bottom: 2px solid color-mix(in srgb, var(--phoenix-secondary-color, #6e7891) 28%, transparent);
}

.azm-equipe-grupos th {
    text-align: center;
    font-size: .7rem;
    letter-spacing: .08em;
    text-transform: uppercase;
    height: 2rem;
}

/* A faixa da fonte (Portal / Rocketbit) e' o que separa os dois blocos. */
.azm-equipe-grupos .azm-equipe-fonte {
    color: var(--phoenix-emphasis-color, #31374a);
    background: color-mix(in srgb, var(--phoenix-primary, #3874ff) 10%, var(--phoenix-card-bg, #fff));
}

/* ---- Coluna da pessoa: a primeira da tabela, grudada ----
   Ela ABRE a tabela (o bloco de cadastro passou para depois das colunas de
   informacao): rolando de lado, e' o nome que nao pode sumir. */
.azm-equipe .azm-equipe-fixa {
    position: sticky;
    left: 0;
    width: 17rem;
    max-width: 17rem;
    z-index: 1;
    /* Fundo OPACO: sem ele o conteudo rolado aparece por baixo. */
    background: var(--phoenix-card-bg, #fff);
    border-right: 1px solid var(--phoenix-border-color, #e3e6ed);
}
/* Cantos do cabecalho: grudados nos dois eixos, com a tinta do cabecalho
   (a regra da coluna fixa e' mais especifica e apagaria a faixa). */
.azm-equipe thead .azm-equipe-fixa {
    z-index: 3;
    background: color-mix(in srgb, var(--phoenix-secondary-color, #6e7891) 9%, var(--phoenix-card-bg, #fff));
}
/* O hover do Bootstrap pinta a linha com --phoenix-table-hover-bg, que nao
   alcanca a celula grudada (fundo proprio): repete aqui. */
.azm-equipe tbody tr:hover .azm-equipe-fixa {
    background: color-mix(in srgb, var(--phoenix-secondary-color, #6e7891) 7%, var(--phoenix-card-bg, #fff));
}

/* ---- Colunas de informacao (superior, status, admissao) ----
   Com `table-layout: fixed` a coluna sem largura declarada recebe uma
   fatia igual a das de numero — e nome de lider, situacao de contrato e
   data nao cabem no espaco de um "1.234". Dai a largura propria: e' o
   que separa "Coordenador de Ope..." de "Coordenador de Operações". */
.azm-equipe .azm-equipe-info {
    width: 11rem;
    max-width: 11rem;
}
.azm-equipe .azm-equipe-data {
    width: 7rem;
    max-width: 7rem;
}

/* ---- Bloco de cadastro: tres colunas de icone DEPOIS das informacoes ----
   Elas abriam a tabela e empurravam o nome para dentro; hoje vem logo
   apos as colunas de informacao. Nao sao grudadas (so a coluna da pessoa
   e'): tres bolinhas ocupando 6.75rem da faixa fixa custavam, no
   celular, quase a largura util da tela. */
.azm-equipe .azm-equipe-sis {
    width: 2.25rem;
    max-width: 2.25rem;
    padding-left: .15rem;
    padding-right: .15rem;
    text-align: center;
}
/* A faixa "Sistemas" do primeiro andar cobre as tres de uma vez. */
.azm-equipe thead .azm-equipe-sis-grupo {
    color: var(--phoenix-emphasis-color, #31374a);
    background: color-mix(in srgb, var(--phoenix-primary, #3874ff) 10%, var(--phoenix-card-bg, #fff));
}

/* A bolinha e' CSS, e nao um icone do Feather: sao tres por linha, e
   cinquenta linhas por pagina dariam 150 SVGs trocados a cada filtro. */
.azm-sis-dot {
    display: inline-block;
    width: .6rem;
    height: .6rem;
    border-radius: 50%;
    /* A cor vem da classe de texto (text-success/danger/info) da propria
       marcacao — o mesmo vocabulario do resto do painel. */
    background: currentColor;
    vertical-align: middle;
}
/* Na legenda, "sem cadastro" precisa de FORMA, nao de cor: na tabela
   essa celula e' vazia mesmo. */
.azm-sis-dot-vazio {
    background: transparent;
    border: 1px dashed var(--phoenix-secondary-color, #6e7891);
}

.azm-sis-legenda {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: .25rem 1rem;
    margin-bottom: .5rem;
    font-size: .75rem;
    color: var(--phoenix-secondary-color, #6e7891);
}
.azm-sis-legenda-sep {
    width: 1px;
    height: 1rem;
    background: var(--phoenix-border-color, #e3e6ed);
}

/* ---- Separador entre os blocos de fonte ---- */
.azm-equipe .azm-equipe-borda {
    border-left: 1px solid var(--phoenix-border-color, #e3e6ed);
}

/* ---- Ordenacao pelo cabecalho ---- */
.azm-equipe-ordenar {
    color: inherit;
    text-decoration: none;
    white-space: nowrap;
}
.azm-equipe-ordenar:hover { color: var(--phoenix-primary, #3874ff); }
.azm-equipe-ordenar.is-ativo { color: var(--phoenix-primary, #3874ff); }
.azm-equipe-seta { font-size: .7em; }

/* ---- Rodape de totais ---- */
.azm-equipe tfoot td {
    position: sticky;
    bottom: 0;
    z-index: 2;
    font-weight: 600;
    background: color-mix(in srgb, var(--phoenix-secondary-color, #6e7891) 12%, var(--phoenix-card-bg, #fff));
    border-top: 2px solid color-mix(in srgb, var(--phoenix-secondary-color, #6e7891) 28%, transparent);
}
/* A celula do canto e' grudada nos DOIS eixos: repete a tinta do rodape,
   que a regra da coluna fixa (mais especifica) sobrescreveria. */
.azm-equipe tfoot .azm-equipe-fixa {
    z-index: 3;
    background: color-mix(in srgb, var(--phoenix-secondary-color, #6e7891) 12%, var(--phoenix-card-bg, #fff));
}

/* ---- Leitura por equipe (o "Agrupar por líder") ----
   Mesma ideia da tabela de parciais (.azm-pivot, mais abaixo): a linha do
   lider e' o agrupador e traz o subtotal da equipe; as pessoas dele vem
   recolhidas. Aqui as regras sao proprias porque a tabela e' outra — tem
   coluna grudada, e a celula fixa precisa repetir a tinta do lider
   (fundo opaco, senao o que rola passa por baixo). */
.azm-equipe tbody tr.azm-equipe-lider > td {
    font-weight: 700;
    color: var(--phoenix-primary, #3874ff);
    background: color-mix(in srgb, var(--phoenix-primary, #3874ff) 7%, var(--phoenix-card-bg, #fff));
    border-top: 1px solid color-mix(in srgb, var(--phoenix-primary, #3874ff) 25%, transparent);
}
/* O hover do Bootstrap nao alcanca a celula grudada (fundo proprio), e a
   regra dela e' mais especifica: as duas repetem a tinta do lider. */
.azm-equipe tbody tr.azm-equipe-lider:hover > td,
.azm-equipe tbody tr.azm-equipe-lider .azm-equipe-fixa,
.azm-equipe tbody tr.azm-equipe-lider:hover .azm-equipe-fixa {
    background: color-mix(in srgb, var(--phoenix-primary, #3874ff) 7%, var(--phoenix-card-bg, #fff));
}
/* Grupo recolhido. A linha continua no DOM de proposito: e' so classe. */
.azm-equipe tr.azm-pivot-oculta { display: none; }

/* No celular a coluna da pessoa grudada com 17rem comeria a tela: o nome
   continua fixo (e' o que nao pode sumir), mas mais estreito. */
@media (max-width: 575.98px) {
    .azm-equipe .azm-equipe-fixa { width: 11rem; max-width: 11rem; }
}

/* =====================================================================
   Parciais Temporarias - tabela dinamica (.azm-pivot)
   =====================================================================
   Uma tabela de PIVOT, e nao uma listagem: a linha da EQUIPE e' o
   agrupador (o consolidado dela) e os promotores vem indentados
   abaixo dela. O que a leitura exige:

   1. a equipe tem de saltar aos olhos - so ela traz o total do grupo;
   2. o filho tem de PARECER filho - dai o recuo e o fio vertical, que
      e' o que sobra da hierarquia quando a tabela e' longa;
   3. cabecalho e rodape grudados: o rodape e' o Total Geral, referencia
      constante enquanto se rola a lista.

   Cores derivadas das variaveis do tema (color-mix), nunca fixas: o
   mesmo bloco atende claro e escuro. A IMAGEM baixada e' outra coisa -
   ela e' sempre clara, desenhada em canvas (ver azm-parciais.js). */

.azm-pivot {
    font-size: .8125rem;
    min-width: 46rem;
}

.azm-pivot-scroll {
    overflow-x: auto;
    max-height: calc(100vh - 22rem);
    min-height: 14rem;
}

.azm-pivot th,
.azm-pivot td {
    padding: .4rem .6rem;
    white-space: nowrap;
}

/* ---- Cabecalho grudado ---- */
.azm-pivot thead th {
    position: sticky;
    top: 0;
    z-index: 2;
    background: color-mix(in srgb, var(--phoenix-secondary-color, #6e7891) 9%, var(--phoenix-card-bg, #fff));
    color: var(--phoenix-secondary-color, #6e7891);
    font-weight: 700;
    text-transform: uppercase;
    font-size: .7rem;
    letter-spacing: .04em;
    border-bottom: 2px solid color-mix(in srgb, var(--phoenix-secondary-color, #6e7891) 28%, transparent);
}

/* ---- Linha da equipe (o agrupador das Parciais) ---- */
.azm-pivot tbody tr.azm-pivot-equipe > td {
    font-weight: 700;
    color: var(--phoenix-primary, #3874ff);
    background: color-mix(in srgb, var(--phoenix-primary, #3874ff) 7%, var(--phoenix-card-bg, #fff));
    border-top: 1px solid color-mix(in srgb, var(--phoenix-primary, #3874ff) 25%, transparent);
}

/* ---- Linha da subequipe (o segundo agrupador) ----
   O degrau DO MEIO: mesma familia da equipe, um passo abaixo em peso e em
   contraste. Sao tres niveis na mesma tabela (equipe, subequipe, pessoa) e
   eles precisam se distinguir sem legenda — se a subequipe tivesse o mesmo
   destaque da equipe, a leitura de "onde comeca o proximo grupo" se perderia. */
.azm-pivot tbody tr.azm-pivot-subequipe > td {
    font-weight: 600;
    color: color-mix(in srgb, var(--phoenix-primary, #3874ff) 70%, var(--phoenix-body-color, #1b1f2b));
    background: color-mix(in srgb, var(--phoenix-primary, #3874ff) 3%, var(--phoenix-card-bg, #fff));
}

/* A coluna grudada tem de repetir o fundo da propria linha: ela rola por cima
   das outras, e sem isto o nome da subequipe apareceria sobre a celula vizinha. */
.azm-pivot tbody tr.azm-pivot-subequipe > td:first-child {
    background: color-mix(in srgb, var(--phoenix-primary, #3874ff) 3%, var(--phoenix-card-bg, #fff));
}

/* ---- Botao de expandir/recolher ----
   O mesmo botao serve aos dois agrupadores (equipe e subequipe) e ao "todos"
   (no cabecalho), de proposito: e' a mesma acao, no escopo de cada linha. */
.azm-pivot-toggle {
    border: 1px solid color-mix(in srgb, var(--phoenix-primary, #3874ff) 35%, transparent);
    background: transparent;
    color: inherit;
    border-radius: .2rem;
    width: 1.05rem;
    height: 1.05rem;
    line-height: 1;
    padding: 0;
    margin-right: .35rem;
    font-size: .8rem;
    font-weight: 700;
    vertical-align: middle;
}
.azm-pivot-toggle:hover {
    background: color-mix(in srgb, var(--phoenix-primary, #3874ff) 15%, transparent);
}

/* ---- Promotores: recuo + fio da hierarquia ----
   O recuo tem de passar da PONTA DO NOME do lider (que ja comeca depois do
   botao de recolher, ~2rem), e nao so da borda da celula: com recuo menor
   que isso o nome do filho volta para debaixo do botao e a coluna inteira
   parece desalinhada do cabecalho. O fio vertical cai onde o nome do lider
   comeca — e' ele que amarra a coluna quando a lista e' longa.
   Seletor com tbody+td de proposito: e' padding, o mesmo que o
   `.table > :not(caption) > * > *` do Bootstrap escreve. */
.azm-pivot tbody td.azm-pivot-nome {
    padding-left: 2.95rem;
    position: relative;
}
.azm-pivot tbody td.azm-pivot-nome::before {
    content: "";
    position: absolute;
    left: 2rem;
    top: 0;
    bottom: 0;
    border-left: 1px solid var(--phoenix-border-color, #e3e6ed);
}

/* Grupo recolhido. A linha continua no DOM de proposito: a imagem sai
   COMPLETA mesmo com os grupos fechados na tela. */
.azm-pivot tr.azm-pivot-oculta {
    display: none;
}

/* ---- Total Geral ---- */
.azm-pivot tfoot td {
    position: sticky;
    bottom: 0;
    z-index: 2;
    font-weight: 700;
    background: color-mix(in srgb, var(--phoenix-secondary-color, #6e7891) 12%, var(--phoenix-card-bg, #fff));
    border-top: 2px solid color-mix(in srgb, var(--phoenix-secondary-color, #6e7891) 28%, transparent);
}

/* ---- Primeira coluna grudada ----
   Mesmo motivo da tabela da equipe: rolando de lado, a linha fica ANONIMA
   e o numero perde o dono. Aqui e' pior, porque a hierarquia mora nessa
   coluna — sem ela nao da nem para saber de que equipe e' a linha.

   Cada faixa mantem o PROPRIO fundo na celula fixa: o fundo tem de ser
   opaco (senao o conteudo rolado passa por baixo) e nao pode ser um so
   (apagaria a tinta do cabecalho, da equipe, da subequipe e do total).
   Cabecalho, rodape, equipe e subequipe ja pintam a celula nas regras
   acima; so o filho, que e' transparente, precisa do fundo do card.

   A celula da mensagem "nenhum promotor" fica de fora: ela tem colspan e
   ocupa a tabela inteira, nao ha o que grudar. */
.azm-pivot thead th:first-child,
.azm-pivot tfoot td:first-child,
.azm-pivot tbody tr.azm-pivot-equipe > td:first-child,
.azm-pivot tbody tr.azm-pivot-subequipe > td:first-child,
.azm-pivot tbody td.azm-pivot-nome {
    position: sticky;
    left: 0;
    border-right: 1px solid color-mix(in srgb, var(--phoenix-secondary-color, #6e7891) 22%, transparent);
}

.azm-pivot tbody tr.azm-pivot-equipe > td:first-child,
.azm-pivot tbody tr.azm-pivot-subequipe > td:first-child,
.azm-pivot tbody td.azm-pivot-nome {
    z-index: 1;
}
.azm-pivot tbody td.azm-pivot-nome {
    background: var(--phoenix-card-bg, #fff);
}

/* Cantos: grudados nos DOIS eixos, logo acima de tudo que rola por baixo. */
.azm-pivot thead th:first-child,
.azm-pivot tfoot td:first-child {
    z-index: 3;
}

/* ---- Rodape "atualizado até" ----
   Fica FORA da tabela, logo abaixo do Total Geral. Discreto: e' carimbo de
   procedencia, nao mais um numero do relatorio — mas em cor de aviso quando
   a coleta falhou (`text-warning-emphasis`, do proprio tema), que e' quando
   ele precisa ser lido. A mesma informacao e' redesenhada na imagem
   baixada (ver azm-parciais.js). */
.azm-pivot-atualizacoes {
    margin-top: .5rem;
    font-size: .75rem;
    line-height: 1.6;
    color: var(--phoenix-secondary-color, #6e7891);
}
.azm-pivot-atualizacoes svg {
    margin-right: .25rem;
    vertical-align: -2px;
}

/* ---- Bloco "Como cada indicador foi apurado" ---- */
.azm-pivot-regras > summary {
    cursor: pointer;
    color: var(--phoenix-secondary-color, #6e7891);
    font-size: .8125rem;
    display: flex;
    align-items: center;
    gap: .35rem;
}
.azm-pivot-regras > summary:hover { color: var(--phoenix-primary, #3874ff); }

/* =====================================================================
   17. Botao ocupado (.azm-btn-ocupado)
   ---------------------------------------------------------------------
   O estado "estou gerando isso agora" dos botoes que baixam arquivo
   (AZM.baixarArquivo, em azm-ui.js).

   POR QUE NAO USA `.disabled`/`:disabled`. No tema escuro o `.btn-phoenix-*`
   nao redefine as variaveis `--phoenix-btn-disabled-*`: o botao desligado cai
   nas cores do tema CLARO — fundo quase branco e texto preto no meio da tela
   escura. Aqui o botao guarda as proprias cores e apenas para de aceitar
   clique (o segundo clique tambem ja' e' barrado no JS, que e' quem responde
   pelo teclado).

   POR QUE CRESCE SO' PARA O LADO. O rotulo muda ("Exportar" -> "Gerando…") e
   o icone da lugar ao giratorio; sem cuidado, o botao engorda para baixo e a
   barra de acoes inteira se mexe. Duas travas: o rotulo nao quebra linha, e o
   giratorio ocupa a MESMA caixa do icone que substituiu (feather de 15px,
   alinhado pela base, como o <svg>). A altura em si o JS congela antes da
   troca.
   ===================================================================== */
.azm-btn-ocupado {
    pointer-events: none;
    white-space: nowrap;
    opacity: .85;
}

.azm-btn-ocupado .spinner-border {
    width: 15px;
    height: 15px;
    border-width: .15em;
    vertical-align: baseline;
}

/* =====================================================================
   18. HIERARQUIA VISUAL DO TEMA ESCURO — dar "foco" a informacao
   ---------------------------------------------------------------------
   SINTOMA. No escuro tudo tem o mesmo peso: o cartao nao se separa do
   fundo, o texto de apoio sai na mesma cor do dado, o campo tem o mesmo
   fundo do cartao e a linha da tabela fica azul-escura sob o mouse.
   Nada guia o olho — a tela vira uma parede cinza-azulada uniforme.

   CAUSA. Nao e' gosto, e' TOKEN faltando. Sao tres buracos:

     a) O painel foi escrito com nomes do Bootstrap 5.3
        (`--phoenix-secondary-color`, `.text-body-secondary`,
        `.text-body-tertiary`...) que o Phoenix compilado NAO possui.
        Sao ~334 usos nas views e ~90 no proprio azm-ui.css que hoje caem
        no fallback do CLARO ou nao pintam nada. Sem eles existe UM unico
        nivel de texto: ou e' titulo, ou e' corpo.

     b) O bloco `.dark` do tema esquece contrapartidas: nunca redefine
        `--phoenix-body-color-rgb`, entao `.text-body` (348 usos) sai
        #31374a — quase invisivel sobre #141824. Idem
        `--phoenix-headings-color`, `--phoenix-border-color-translucent`,
        `--phoenix-list-group-hover-bg` e `--phoenix-code-color`.

     c) O tema tem valor errado no escuro: a linha da tabela em hover vira
        #004dff (2,9:1) e o botao ativo vira literalmente `red`.

   CORRECAO. Tudo aqui e' na ORIGEM (variavel ou utility), nunca por tela:
   definido o token, as listagens, os cartoes e os formularios inteiros
   herdam o acerto de uma vez. Segue a secao 6, que ja fazia isso para as
   variaveis *-rgb de fundo.
   ===================================================================== */

/* ---------------------------------------------------------------------
   18.1  Os tokens que o Phoenix nao entrega
   ---------------------------------------------------------------------
   No CLARO os valores sao os mesmos que hoje estao chumbados como
   fallback pelo arquivo inteiro (#6e7891 / #f5f7fa) — ou seja, o claro
   nao muda de aparencia, so' passa a ter um lugar unico para mudar.

   No ESCURO a escala e' escolhida por CONTRASTE MEDIDO sobre o cartao
   (#141824), nao por gosto:
       dado          #b6bdd0   9,2:1
       apoio         #8f99b2   6,1:1
       metadado      #7a8499   4,6:1  (limite AA)
   Tres degraus separados o bastante para o olho ordenar sozinho o que e'
   valor, o que e' rotulo e o que e' rodape de celula.
   --------------------------------------------------------------------- */
:root {
    --phoenix-secondary-color: #6e7891;              /* gray-600 claro */
    --phoenix-tertiary-color:  #8a94ad;              /* gray-500 claro */
    --phoenix-secondary-bg:    #f5f7fa;
    --phoenix-tertiary-bg:     #eff2f6;
    /* O degrau ACIMA do corpo — o rotulo que precisa ser lido antes dos
       outros. Tambem e' nome do Bootstrap 5.3 que o Phoenix nao gera, e o
       buraco aparecia so' no escuro: os quatro usos do arquivo caiam no
       fallback do claro (#31374a) e saiam quase pretos sobre fundo escuro.
       Sao justamente os rotulos que a tinta do fundo ja destaca — a coluna
       que esta ORDENANDO na listagem (secao 21), a faixa da fonte e a de
       "Sistemas" no dashboard comercial (tabela .azm-equipe) e a linha de
       total das somas da venda. Realce de fundo com texto ilegivel por
       cima e' o pior dos dois mundos: chama o olho para o que nao da'
       para ler. */
    --phoenix-emphasis-color:  #31374a;
    /* `--phoenix-card-bg` so' existe DENTRO de `.card`; fora dele as
       dezenas de `var(--phoenix-card-bg, #fff)` caiam no branco fixo. */
    --phoenix-card-bg:         #fff;
    /* Fio de contorno das superficies (secao 18.4). */
    --azm-fio-superficie:      rgba(20, 24, 36, .10);
}

.dark {
    --phoenix-secondary-color: #8f99b2;
    --phoenix-tertiary-color:  #7a8499;
    /* Um degrau ACIMA do dado (#b6bdd0): sobre a tinta do cabecalho
       ordenado (~#29303f) da ~11:1. */
    --phoenix-emphasis-color:  #e3e6ed;
    /* Translucido de proposito: e' um realce que precisa funcionar tanto
       sobre o cartao quanto sobre o fundo da pagina (hover de paginacao,
       trilho de progresso, painel tracejado, item desabilitado). */
    --phoenix-secondary-bg:    rgba(255, 255, 255, .045);
    --phoenix-tertiary-bg:     rgba(255, 255, 255, .028);
    --phoenix-card-bg:         #141824;
    --azm-fio-superficie:      rgba(160, 175, 210, .13);
}

/* ---------------------------------------------------------------------
   18.2  As utilities de texto/fundo que as views ja usam
   ---------------------------------------------------------------------
   `.text-body-tertiary` (270 usos), `.text-body-secondary` (64) e
   `.bg-body-tertiary` (15) sao Bootstrap 5.3; o Phoenix compilado parou
   no 5.2 e nunca as gerou. Hoje elas nao fazem NADA — e' por isso que a
   descricao do cartao, o "ultima coleta", o CPF sob o nome do cliente e o
   rodape "Origem: ..." saem todos na mesma cor do titulo do bloco.
   --------------------------------------------------------------------- */
.text-body-secondary { color: var(--phoenix-secondary-color) !important; }
.text-body-tertiary  { color: var(--phoenix-tertiary-color) !important; }
.text-body-emphasis  { color: var(--phoenix-1100) !important; }
.bg-body-secondary   { background-color: var(--phoenix-secondary-bg) !important; }
.bg-body-tertiary    { background-color: var(--phoenix-tertiary-bg) !important; }

/* `.text-secondary` (503 usos) passa a ser o MESMO degrau de "apoio" que
   `.text-body-secondary`, em vez de um cinza proprio. Substitui a regra
   equivalente da secao 6. */
.dark .text-secondary { color: var(--phoenix-secondary-color) !important; }

/* ---------------------------------------------------------------------
   18.3  A escala de texto do escuro
   ---------------------------------------------------------------------
   O tema poe o corpo em #9fa6bc e o apoio em #8a94ad: dois tons a um
   passo um do outro. Empurrar o DADO para cima e' o que cria o contraste
   de papeis — o apoio ja' desceu no 18.1.
   --------------------------------------------------------------------- */
.dark {
    --phoenix-body-color: #b6bdd0;
    /* Nunca redefinida no escuro pelo tema: `.text-body` (348 usos, com
       !important) vinha saindo #31374a, ilegivel. E' a razao de os
       cartoes das Bases parecerem "apagados". */
    --phoenix-body-color-rgb: 182, 189, 208;
    /* Idem: fica no valor do claro e escurece titulos de componentes. */
    --phoenix-headings-color: var(--phoenix-1100);
    --phoenix-heading-color: var(--phoenix-1100);
    /* Bordas translucidas do tema sao PRETAS — invisiveis no escuro. */
    --phoenix-border-color-translucent: rgba(255, 255, 255, .14);
    /* `<code>` em rosa #d63384 sobre fundo escuro fica em ~3:1. */
    --phoenix-code-color: #ff9ec4;
    --phoenix-highlight-bg: rgba(255, 204, 133, .28);
    /* Hover de list-group caia no cinza claro do tema (flash branco). */
    --phoenix-list-group-hover-bg: rgba(255, 255, 255, .05);
    --phoenix-list-group-action-hover-color: var(--phoenix-1100);
    --phoenix-navbar-top-link-active-color: var(--phoenix-primary);
    --phoenix-scrollbar-bg: rgba(138, 148, 173, .35);
}

/* O que a pessoa DIGITOU e' dado, nao rotulo: sai um degrau acima do
   corpo. A label continua um degrau abaixo (a hierarquia do formulario e'
   rotulo fraco / valor forte, e nao o contrario). */
.dark { --phoenix-input-color: var(--phoenix-gray-1000); }
.dark .form-label { color: var(--phoenix-secondary-color); }

/* ---------------------------------------------------------------------
   18.4  Superficie: o cartao precisa ter beira
   ---------------------------------------------------------------------
   271 cartoes do sistema usam `card border-0 shadow-sm`. No escuro isso
   e' um cartao SEM NENHUM limite visual: `border-0` apaga a borda e
   `.shadow-sm` e' `rgba(0,0,0,.075)` — sombra preta sobre fundo #0f111a
   nao existe. Dai a sensacao de conteudo solto no vazio.

   A beira volta como FIO DE LUZ desenhado por box-shadow (nao ocupa
   espaco, entao vale igual para o cartao com e sem `border-0` e nao
   desloca nada), somado a uma sombra de verdade para o escuro.
   --------------------------------------------------------------------- */
.dark .shadow-sm {
    -webkit-box-shadow: 0 0 0 1px var(--azm-fio-superficie),
        0 .125rem .5rem -.125rem rgba(0, 0, 0, .5) !important;
    box-shadow: 0 0 0 1px var(--azm-fio-superficie),
        0 .125rem .5rem -.125rem rgba(0, 0, 0, .5) !important;
}
.dark .shadow {
    -webkit-box-shadow: 0 0 0 1px var(--azm-fio-superficie),
        0 .5rem 1.25rem -.375rem rgba(0, 0, 0, .6) !important;
    box-shadow: 0 0 0 1px var(--azm-fio-superficie),
        0 .5rem 1.25rem -.375rem rgba(0, 0, 0, .6) !important;
}
.dark .shadow-lg {
    -webkit-box-shadow: 0 0 0 1px var(--azm-fio-superficie),
        0 1.25rem 2.5rem -.75rem rgba(0, 0, 0, .7) !important;
    box-shadow: 0 0 0 1px var(--azm-fio-superficie),
        0 1.25rem 2.5rem -.75rem rgba(0, 0, 0, .7) !important;
}
/* Cartao sem classe de sombra nenhuma ganha ao menos o fio. */
.dark .card:not([class*="shadow"]) {
    -webkit-box-shadow: 0 0 0 1px var(--azm-fio-superficie);
    box-shadow: 0 0 0 1px var(--azm-fio-superficie);
}

/* Cartao clicavel (Bases, stat-cards): sob o mouse ele SOBE. Sem isto o
   cartao-link nao se anuncia como link em tela nenhuma. */
.dark a.card:hover,
.dark .card[role="button"]:hover {
    -webkit-box-shadow: 0 0 0 1px rgba(133, 169, 255, .38),
        0 .75rem 1.5rem -.5rem rgba(0, 0, 0, .65) !important;
    box-shadow: 0 0 0 1px rgba(133, 169, 255, .38),
        0 .75rem 1.5rem -.5rem rgba(0, 0, 0, .65) !important;
}

/* Cabecalho/rodape "bg-transparent" (painel de filtros) precisam do fio
   separador, senao o cabecalho colapsavel se funde ao corpo do cartao. */
.dark .card > .card-header,
.dark .card > .card-footer { border-color: var(--azm-fio-superficie); }

/* Bordas gerais um passo acima do #31374a do tema (1,5:1 sobre o cartao). */
.dark { --phoenix-border-color: #363e57; }
.dark hr { opacity: 1; color: var(--azm-fio-superficie); }

/* ---------------------------------------------------------------------
   18.5  O campo tem de parecer um campo
   ---------------------------------------------------------------------
   No escuro o tema poe `--phoenix-input-bg: #141824`, que e' EXATAMENTE a
   cor do cartao. Vinte campos de filtro em cima de um cartao viram vinte
   retangulos invisiveis — so' a borda a 1,7:1 denuncia que ali se digita.
   O campo passa a ser levemente ELEVADO em relacao ao cartao (funciona
   tambem quando ele esta direto sobre o fundo da pagina, como no login).
   --------------------------------------------------------------------- */
.dark {
    --phoenix-input-bg: #1b2030;
    --phoenix-input-border-color: #3c4560;
    --phoenix-input-group-addon-bg: #232a3d;
}
.dark .form-control:hover:not(:disabled):not([readonly]),
.dark .form-select:hover:not(:disabled) { border-color: #4a5473; }

/* Campo TRAVADO (CEP preenchido pela API, select desabilitado): agora que
   o campo ativo e' elevado, o travado se define pelo contrario — sem
   relevo, sem borda forte, texto de apoio. Le-se "resultado", nao "campo
   a preencher".

   As datas do seletor de periodo saiam daqui: elas deixaram de ser
   travadas (secao 3b-2). */
.dark .azm-endereco .azm-campo-bloqueado,
.dark .azm-endereco .azm-campo-bloqueado:focus,
.dark .choices.is-disabled .choices__inner {
    background-color: transparent !important;
    border-color: var(--azm-fio-superficie) !important;
    color: var(--phoenix-secondary-color) !important;
    opacity: 1;
}

/* ---------------------------------------------------------------------
   18.6  A tabela: o dado em primeiro plano
   ---------------------------------------------------------------------
   `--phoenix-table-hover-color: #004dff` e' um erro do tema: passar o
   mouse na linha pinta a linha INTEIRA de azul-marinho (2,9:1 sobre o
   cartao) — e como toda listagem usa `table-hover` com a linha clicavel,
   e' o estado em que a pessoa passa o tempo todo. Aqui o hover faz o
   contrario do que fazia: CLAREIA o texto e levanta o fundo.
   --------------------------------------------------------------------- */
.dark .table {
    --phoenix-table-color: var(--phoenix-body-color);
    --phoenix-table-hover-color: var(--phoenix-1100);
    --phoenix-table-hover-bg: rgba(133, 169, 255, .08);
    --phoenix-table-border-color: #272e42;
    --phoenix-table-active-bg: rgba(133, 169, 255, .12);
}

/* Regra de leitura da grade: rotulo de coluna fraco, valor forte.
   O `thead` ja consome `--phoenix-secondary-color` (secao 1) e agora
   pousa no degrau de apoio; aqui o corpo sobe para o degrau do dado. */
.dark .azm-dt tbody td { color: var(--phoenix-body-color); }

/* Dentro da grade, o que esta marcado como forte fica MESMO forte —
   e' o identificador da linha (nome do cliente, nome da pessoa). */
.dark .azm-dt tbody .fw-semibold,
.dark .azm-dt tbody .fw-bold,
.dark .azm-dt tbody strong { color: var(--phoenix-1100); }

/* ---------------------------------------------------------------------
   18.7  Valores errados do proprio tema no escuro
   --------------------------------------------------------------------- */
/* `--phoenix-btn-active-color: red` — literalmente. */
.dark .btn.active { --phoenix-btn-active-color: var(--phoenix-1100); }
/* `--phoenix-btn-active-color: #000000` (1,2:1) nos botoes soft. */
.dark .btn-soft-primary   { --phoenix-btn-active-color: var(--phoenix-primary-200); }
.dark .btn-soft-secondary { --phoenix-btn-active-color: var(--phoenix-1100); }
.dark .btn-soft-success   { --phoenix-btn-active-color: var(--phoenix-success-200); }
.dark .btn-soft-info      { --phoenix-btn-active-color: var(--phoenix-info-200); }
.dark .btn-soft-warning   { --phoenix-btn-active-color: var(--phoenix-warning-200); }
.dark .btn-soft-danger    { --phoenix-btn-active-color: var(--phoenix-danger-200); }

/* ---------------------------------------------------------------------
   18.8  Alerta: painel tingido, nao bloco solido
   ---------------------------------------------------------------------
   `.alert-info` e' `#0097eb` chapado com 1,5rem de respiro. No escuro
   vira a coisa MAIS clara e mais saturada da tela: no Dashboard comercial
   o aviso de "vendas sem vendedor" pesa mais que a tabela inteira que a
   pessoa veio ver. Um aviso e' contexto — precisa ser legivel e achavel,
   nao ser o assunto. Vira tinta de 12% com fio da cor e faixa lateral.
   --------------------------------------------------------------------- */
.dark .alert {
    /* Pela variavel, para que qualquer variante que recalcule o respiro
       continue coerente (o tema abre 1,5rem em cima e embaixo). */
    --phoenix-alert-padding-y: 1rem;
    border-left-width: .1875rem;
}
.dark .alert-primary {
    --phoenix-alert-bg: rgba(133, 169, 255, .12);
    --phoenix-alert-border-color: rgba(133, 169, 255, .38);
    --phoenix-alert-color: var(--phoenix-primary-200);
}
.dark .alert-info {
    --phoenix-alert-bg: rgba(96, 198, 255, .12);
    --phoenix-alert-border-color: rgba(96, 198, 255, .38);
    --phoenix-alert-color: var(--phoenix-info-200);
}
.dark .alert-success {
    --phoenix-alert-bg: rgba(144, 214, 127, .12);
    --phoenix-alert-border-color: rgba(144, 214, 127, .38);
    --phoenix-alert-color: var(--phoenix-success-200);
}
.dark .alert-warning {
    --phoenix-alert-bg: rgba(255, 204, 133, .12);
    --phoenix-alert-border-color: rgba(255, 204, 133, .38);
    --phoenix-alert-color: var(--phoenix-warning-200);
}
.dark .alert-danger {
    --phoenix-alert-bg: rgba(244, 130, 112, .12);
    --phoenix-alert-border-color: rgba(244, 130, 112, .38);
    --phoenix-alert-color: var(--phoenix-danger-200);
}
.dark .alert-secondary {
    --phoenix-alert-bg: rgba(255, 255, 255, .05);
    --phoenix-alert-border-color: var(--azm-fio-superficie);
    --phoenix-alert-color: var(--phoenix-1000);
}
/* Dentro do alerta o texto de apoio nao pode virar o mesmo cinza do resto
   da pagina: ele acompanha a cor do proprio alerta, so' mais fraco. */
.dark .alert .text-body-tertiary,
.dark .alert .text-body-secondary,
.dark .alert .text-secondary { color: inherit !important; opacity: .72; }
.dark .alert code { color: inherit; opacity: .85; }

/* ---------------------------------------------------------------------
   18.9  Badge de status: chip tingido, nao bloco chapado
   ---------------------------------------------------------------------
   `.text-bg-*` sai com as cores CHUMBADAS do claro (`!important`, sem
   contrapartida no escuro). Duas consequencias opostas e ambas ruins:
   `text-bg-secondary` (o badge "neutro", usado nos icones de produto e em
   42 lugares) e' #31374a — 1,5:1, some no cartao; e `text-bg-danger` /
   `-success` sao blocos saturados que gritam mais alto que o dado.

   No escuro os dois convergem para a mesma forma: fundo tingido, fio da
   cor e TEXTO na cor — o sinal fica na cor, nao no volume. Escopo em
   `.badge` para nao mexer em `text-bg-*` usado como fundo de bloco.
   --------------------------------------------------------------------- */
.dark .badge.text-bg-secondary {
    color: var(--phoenix-1000) !important;
    background-color: rgba(255, 255, 255, .07) !important;
    -webkit-box-shadow: inset 0 0 0 1px var(--azm-fio-superficie);
    box-shadow: inset 0 0 0 1px var(--azm-fio-superficie);
}
.dark .badge.text-bg-primary {
    color: var(--phoenix-primary-200) !important;
    background-color: rgba(133, 169, 255, .16) !important;
    -webkit-box-shadow: inset 0 0 0 1px rgba(133, 169, 255, .34);
    box-shadow: inset 0 0 0 1px rgba(133, 169, 255, .34);
}
.dark .badge.text-bg-success {
    color: var(--phoenix-success-200) !important;
    background-color: rgba(144, 214, 127, .16) !important;
    -webkit-box-shadow: inset 0 0 0 1px rgba(144, 214, 127, .34);
    box-shadow: inset 0 0 0 1px rgba(144, 214, 127, .34);
}
.dark .badge.text-bg-info {
    color: var(--phoenix-info-200) !important;
    background-color: rgba(96, 198, 255, .16) !important;
    -webkit-box-shadow: inset 0 0 0 1px rgba(96, 198, 255, .34);
    box-shadow: inset 0 0 0 1px rgba(96, 198, 255, .34);
}
.dark .badge.text-bg-warning {
    color: var(--phoenix-warning-200) !important;
    background-color: rgba(255, 204, 133, .16) !important;
    -webkit-box-shadow: inset 0 0 0 1px rgba(255, 204, 133, .34);
    box-shadow: inset 0 0 0 1px rgba(255, 204, 133, .34);
}
.dark .badge.text-bg-danger {
    color: var(--phoenix-danger-200) !important;
    background-color: rgba(244, 130, 112, .16) !important;
    -webkit-box-shadow: inset 0 0 0 1px rgba(244, 130, 112, .34);
    box-shadow: inset 0 0 0 1px rgba(244, 130, 112, .34);
}

/* ---------------------------------------------------------------------
   18.10 Foco de teclado visivel
   ---------------------------------------------------------------------
   Com o campo agora elevado, o anel de foco do tema (azul #3874ff, que e'
   o tom do CLARO) fica escuro demais para marcar onde o cursor esta.
   --------------------------------------------------------------------- */
.dark .form-control:focus,
.dark .form-select:focus,
.dark .choices.is-focused .choices__inner {
    border-color: var(--phoenix-primary) !important;
    -webkit-box-shadow: 0 0 0 .2rem rgba(133, 169, 255, .22) !important;
    box-shadow: 0 0 0 .2rem rgba(133, 169, 255, .22) !important;
}
.dark :focus-visible { outline-color: var(--phoenix-primary); }

/* =====================================================================
   19. Calendario (Flatpickr) — cabecalho que nao se sobrepoe e escuro legivel
   ---------------------------------------------------------------------
   Dois defeitos independentes, os dois vindos do tema compilado:

   1) SOBREPOSICAO (claro E escuro). O cabecalho do calendario nao tem
      layout: as setas de mes sao `position:absolute` presas em
      `left:28px` / `right:25px !important`, enquanto o miolo (o `select`
      de mes + o `input` de ano) fica CENTRADO em fluxo separado. Como o
      `select` de mes tem `appearance:menulist` — largura ditada pelo
      nome mais comprido ("Setembro") mais a seta nativa do sistema — o
      miolo cresce para os lados ate as setinhas do ano (`.arrowUp` /
      `.arrowDown`, que so aparecem no hover) baterem na seta de "proximo
      mes". Nenhum ajuste de pixel resolve isso para todo mes/idioma:
      a correcao e' dar ao cabecalho um layout de verdade — flex de tres
      colunas — para que as pecas nao possam mais ocupar o mesmo lugar.

   2) ILEGIVEL NO ESCURO. O tema pinta o nome do mes com
      `color: #141824` CHUMBADO — que e' EXATAMENTE
      `--phoenix-flatpickr-calendar-bg` no escuro. Nome do mes preto
      sobre fundo preto: some por completo (so' o ano aparece). Junto com
      ele: os dias do mes vizinho em `--phoenix-gray-400` (#3e465b, 1,9:1),
      as setinhas do ano desenhadas em `rgba(0,0,0,.9)`, os campos de hora
      em `--phoenix-gray-400` e a superficie do calendario na MESMA cor do
      cartao — um popup sem nenhuma separacao do que esta atras.
   ===================================================================== */

/* ---------------------------------------------------------------------
   19.1  Cabecalho: tres colunas de verdade (claro e escuro)
   --------------------------------------------------------------------- */
.flatpickr-calendar .flatpickr-months {
    display: -webkit-box;
    display: -ms-flexbox;
    display: flex;
    -webkit-box-align: center;
        -ms-flex-align: center;
            align-items: center;
    -ms-flex-wrap: nowrap;
        flex-wrap: nowrap;
    gap: .125rem;
    /* Altura, respiro lateral e a conta de quanto sobra para a coluna do
       meio estao na secao 19.6, junto com as demais medidas. */
}

/* As setas saem do posicionamento absoluto e viram itens do flex — e' o
   que torna a colisao impossivel, e nao um recuo maior. */
.flatpickr-calendar .flatpickr-months .flatpickr-prev-month,
.flatpickr-calendar .flatpickr-months .flatpickr-next-month {
    position: static !important;
    top: auto !important;
    left: auto !important;
    right: auto !important;
    -webkit-box-flex: 0;
        -ms-flex: 0 0 auto;
            flex: 0 0 auto;
    display: -webkit-inline-box;
    display: -ms-inline-flexbox;
    display: inline-flex;
    -webkit-box-align: center;
        -ms-flex-align: center;
            align-items: center;
    -webkit-box-pack: center;
        -ms-flex-pack: center;
            justify-content: center;
    padding: 0;                 /* tamanho da caixa: secao 19.6 */
    border-radius: .375rem;
    -webkit-transition: background-color .15s;
    transition: background-color .15s;
}
.flatpickr-calendar .flatpickr-months .flatpickr-prev-month:hover,
.flatpickr-calendar .flatpickr-months .flatpickr-next-month:hover {
    background-color: var(--phoenix-secondary-bg);
}
.flatpickr-calendar .flatpickr-months .flatpickr-prev-month:hover svg,
.flatpickr-calendar .flatpickr-months .flatpickr-next-month:hover svg {
    /* O tema levava o hover para gray-800, um degrau imperceptivel. */
    fill: var(--phoenix-1100);
}

/* No escuro o tema deixa as duas setas em gray-700 (#8a94ad). O numero
   passa em contraste, mas contraste de TEXTO nao serve para um cheveron de
   14px: linha fina de 2px nao tem massa para sustentar o mesmo tom que uma
   letra. As setas de mes sao o controle principal do calendario — sobem
   para o degrau do titulo, na mesma altura do nome do mes e do ano.
   `color` junto de `fill` porque o `<path>` do Flatpickr herda um ou outro
   conforme a versao do icone. */
.dark .flatpickr-calendar .flatpickr-months .flatpickr-prev-month,
.dark .flatpickr-calendar .flatpickr-months .flatpickr-next-month {
    color: var(--phoenix-1000);
    fill: var(--phoenix-1000);
}
.dark .flatpickr-calendar .flatpickr-months .flatpickr-prev-month svg,
.dark .flatpickr-calendar .flatpickr-months .flatpickr-next-month svg,
.dark .flatpickr-calendar .flatpickr-months .flatpickr-prev-month svg path,
.dark .flatpickr-calendar .flatpickr-months .flatpickr-next-month svg path {
    fill: var(--phoenix-1000);
}
.dark .flatpickr-calendar .flatpickr-months .flatpickr-prev-month:hover,
.dark .flatpickr-calendar .flatpickr-months .flatpickr-next-month:hover {
    background-color: rgba(255, 255, 255, .09);
}
.dark .flatpickr-calendar .flatpickr-months .flatpickr-prev-month:hover svg,
.dark .flatpickr-calendar .flatpickr-months .flatpickr-next-month:hover svg,
.dark .flatpickr-calendar .flatpickr-months .flatpickr-prev-month:hover svg path,
.dark .flatpickr-calendar .flatpickr-months .flatpickr-next-month:hover svg path {
    fill: var(--phoenix-1100);
}

/* O miolo ocupa o espaco que sobra entre as duas setas. `overflow:visible`
   porque as setinhas do ano moram fora da caixa do campo. */
.flatpickr-calendar .flatpickr-months .flatpickr-month {
    -webkit-box-flex: 1;
        -ms-flex: 1 1 auto;
            flex: 1 1 auto;
    height: auto;
    padding-top: 0;
    overflow: visible;
    min-width: 0;
}
.flatpickr-calendar .flatpickr-months .flatpickr-month .flatpickr-current-month {
    height: auto;
    padding: 0;
}

/* ---------------------------------------------------------------------
   19.2  Nome do mes e ano
   ---------------------------------------------------------------------
   O `color: #141824` chumbado do tema vira o token do proprio tema, que
   existe nos dois modos (#31374a no claro, #cbd0dd no escuro) — e de
   quebra o mes passa a ter a MESMA cor do ano, que ja usava o token.
   --------------------------------------------------------------------- */
.flatpickr-calendar .flatpickr-months .flatpickr-month .flatpickr-current-month .flatpickr-monthDropdown-months {
    color: var(--phoenix-flatpickr-current-month-color);
    background-color: transparent;
    padding: 0 .25ch 0 .5ch;
    border-radius: .25rem;
}
.flatpickr-calendar .flatpickr-months .flatpickr-month .flatpickr-current-month .flatpickr-monthDropdown-months:hover {
    background-color: var(--phoenix-secondary-bg);
}
/* A LISTA do `select` e' desenhada pelo sistema operacional. O
   `color-scheme: dark` da secao 6 ja pede a versao escura, mas o
   Flatpickr zera o fundo de cada `option` — sem cor explicita algumas
   combinacoes de SO/navegador devolvem o item em fundo claro. */
.dark .flatpickr-calendar .flatpickr-monthDropdown-months option,
.dark .flatpickr-calendar .flatpickr-monthDropdown-months .flatpickr-monthDropdown-month {
    background-color: var(--phoenix-flatpickr-calendar-bg);
    color: var(--phoenix-1100);
}

/* O campo do ano tem 6ch e as setinhas ocupam os 14px da direita POR CIMA
   do texto. Com 7,5ch elas ganham faixa propria e param de disputar
   espaco com os digitos. */
.flatpickr-calendar .flatpickr-current-month .numInputWrapper {
    width: 7.5ch;
    border-radius: .25rem;
}

/* As setinhas do ano eram triangulos `rgba(0,0,0,.9)` — invisiveis no
   escuro — com moldura e realce tambem em preto. */
.flatpickr-calendar .flatpickr-current-month .numInputWrapper span {
    border-color: var(--phoenix-border-color);
}
.flatpickr-calendar .flatpickr-current-month .numInputWrapper span.arrowUp:after {
    border-bottom-color: var(--phoenix-flatpickr-current-month-color);
}
.flatpickr-calendar .flatpickr-current-month .numInputWrapper span.arrowDown:after {
    border-top-color: var(--phoenix-flatpickr-current-month-color);
}
.flatpickr-calendar .flatpickr-current-month .numInputWrapper:hover,
.flatpickr-calendar .flatpickr-current-month .numInputWrapper span:hover {
    background: var(--phoenix-secondary-bg);
}

/* ---------------------------------------------------------------------
   19.3  Superficie: o calendario e' um popup, nao parte do cartao
   ---------------------------------------------------------------------
   O tema forca `box-shadow: none !important`. No claro isso ja e' ruim
   (o painel pousa sobre os campos sem nenhuma separacao); no escuro e'
   pior, porque `--phoenix-flatpickr-calendar-bg` e' #141824 — a MESMA
   cor do cartao que esta atras. O popup sobe um degrau e ganha sombra.
   --------------------------------------------------------------------- */
.flatpickr-calendar {
    -webkit-box-shadow: 0 .75rem 2rem -.5rem rgba(20, 24, 36, .28) !important;
    box-shadow: 0 .75rem 2rem -.5rem rgba(20, 24, 36, .28) !important;
}
.dark {
    --phoenix-flatpickr-calendar-bg: #1c2130;
    --phoenix-flatpickr-calendar-day-hover-bg: rgba(255, 255, 255, .07);
    /* Texto sobre o circulo do dia de hoje (fundo --phoenix-primary). */
    --phoenix-flatpickr-today-color: #0f111a;
}
/* A borda continua sendo a do tema (--phoenix-border-color, ja reforcada
   na secao 18.4): e' a mesma variavel que pinta o triangulo apontador do
   popup, entao mexer so' aqui deixaria os dois em tons diferentes. */
.dark .flatpickr-calendar {
    -webkit-box-shadow: 0 1rem 2.5rem -.5rem rgba(0, 0, 0, .75) !important;
    box-shadow: 0 1rem 2.5rem -.5rem rgba(0, 0, 0, .75) !important;
}

/* ---------------------------------------------------------------------
   19.4  Grade de dias: a mesma escala de tres degraus da secao 18
   --------------------------------------------------------------------- */
/* Cabecalho da semana e' ROTULO, nao dado — o tema o deixava na cor do
   corpo, com o mesmo peso dos numeros. */
.flatpickr-calendar span.flatpickr-weekday {
    color: var(--phoenix-secondary-color) !important;
    font-weight: 600;
}
.dark .flatpickr-day { color: var(--phoenix-body-color); }
/* Dias do mes vizinho estavam em gray-400 (#3e465b): 1,9:1, sumiam. */
.dark .flatpickr-day.prevMonthDay,
.dark .flatpickr-day.nextMonthDay { color: var(--phoenix-tertiary-color); }
/* Dia fora do minDate/maxDate: precisa parecer indisponivel, nao ausente. */
.dark .flatpickr-day.flatpickr-disabled,
.dark .flatpickr-day.flatpickr-disabled:hover { color: #4b5470; }

/* ---------------------------------------------------------------------
   19.5  Hora (data-enable-time)
   ---------------------------------------------------------------------
   Nao ha uso no painel hoje, mas o `<x-ui.date-input data-enable-time>`
   oferece: os campos saem em gray-400 (invisiveis no escuro) e o realce
   em gray-100.
   --------------------------------------------------------------------- */
.dark .flatpickr-time input,
.dark .flatpickr-time .flatpickr-am-pm,
.dark .flatpickr-time .flatpickr-time-separator { color: var(--phoenix-body-color); }
.dark .flatpickr-time input:hover,
.dark .flatpickr-time input:focus,
.dark .flatpickr-time .flatpickr-am-pm:hover,
.dark .flatpickr-time .flatpickr-am-pm:focus {
    background-color: var(--phoenix-secondary-bg) !important;
}
.dark .flatpickr-time .numInputWrapper span.arrowUp:after { border-bottom-color: var(--phoenix-body-color); }
.dark .flatpickr-time .numInputWrapper span.arrowDown:after { border-top-color: var(--phoenix-body-color); }

/* ---------------------------------------------------------------------
   19.6  Tamanho: um calendario proporcional ao campo que ele preenche
   ---------------------------------------------------------------------
   O tema desenha o calendario para uma tela de agenda, nao para um
   popover de filtro: 322px de largura, cabecalho em 1,5625rem (25px —
   mais que o dobro do texto do formulario ao lado) e celula de dia com
   passo de 40px (32px + 4px de margem de cada lado). Ao lado de campos
   de 31px de altura ele chega como um bloco fora de escala.

   A conta abaixo e' fechada, nao arredondada no olho — se algum numero
   mudar, os outros acompanham:

       celula   30px + 3px de margem dos dois lados = passo de 36px
       grade    7 colunas x 36px                    = 252px
       miolo    252px + 12px de respiro lateral x2  = 276px
       total    276px + 1px de borda x2             = 278px

   O cabecalho cai de 25px para 16px. Isso encolhe junto o `select` de
   mes — que e' `appearance:menulist` e tem a largura do nome mais
   comprido ("Setembro"): de ~134px para ~90px. Com 8px de respiro lateral
   sobram 260px, dos quais 52px sao as duas setas mais o vao; restam
   ~208px para mes+ano contra ~155px de conteudo. A folga que impede a
   colisao da secao 19.1 continua de pe, agora com margem maior.
   --------------------------------------------------------------------- */
.flatpickr-calendar {
    width: 278px !important;
}

/* Cabecalho mais baixo e na escala do formulario. O `padding: 0 2rem` do
   tema tambem sai: com o flex da 19.1 ele so' espremia a coluna do meio. */
.flatpickr-calendar .flatpickr-months {
    height: 36px;
    padding: 0 .5rem;
}
.flatpickr-calendar .flatpickr-months .flatpickr-prev-month,
.flatpickr-calendar .flatpickr-months .flatpickr-next-month {
    width: 24px;
    height: 24px;
}
.flatpickr-calendar .flatpickr-months .flatpickr-prev-month svg,
.flatpickr-calendar .flatpickr-months .flatpickr-next-month svg {
    width: 13px;
    height: 13px;
}
.flatpickr-calendar .flatpickr-months .flatpickr-month .flatpickr-current-month {
    font-size: 1rem;
}
/* O peso 700 do tema, somado ao corpo menor, deixava o mes pesado demais
   perto do ano. Os dois passam a ler como um par. */
.flatpickr-calendar .flatpickr-months .flatpickr-month .flatpickr-current-month .flatpickr-monthDropdown-months,
.flatpickr-calendar .flatpickr-months .flatpickr-month .flatpickr-current-month .cur-year {
    font-weight: 600;
}

/* Grade: respiro do miolo e largura da area de dias (ver a conta acima). */
.flatpickr-calendar .flatpickr-innerContainer {
    padding: .75rem .75rem .625rem;
}
.flatpickr-calendar .flatpickr-innerContainer .flatpickr-rContainer {
    width: 252px;
    min-width: 252px;
    max-width: 252px;
}

/* Faixa dos dias da semana: rotulo curto nao precisa de 28px de altura. */
.flatpickr-calendar .flatpickr-weekdays {
    height: 22px;
}
.flatpickr-calendar span.flatpickr-weekday {
    font-size: .68rem;
    letter-spacing: .02em;
}

/* Celula do dia. `flex-basis` fixo em vez dos 14,2857% do vendor: com a
   largura da grade fechada em 252px, a porcentagem so' reintroduz
   arredondamento e faz a ultima coluna sair do lugar. */
.flatpickr-calendar .flatpickr-day {
    margin: 3px !important;
    height: 30px !important;
    width: 30px !important;
    max-width: 30px !important;
    -webkit-flex-basis: 30px;
        -ms-flex-preferred-size: 30px;
            flex-basis: 30px;
    font-size: .8125rem;
    font-weight: 600;
}

/* O intervalo (mode: range) e' pintado com uma sombra lateral que tapa a
   margem entre as celulas — o tema usa 5px porque a margem era 4px. Com
   3px de margem a faixa passaria 2px alem da celula em cada ponta. */
.flatpickr-calendar .flatpickr-day.inRange {
    -webkit-box-shadow: -4px 0 0 var(--phoenix-flatpickr-calendar-bg),
        4px 0 0 var(--phoenix-flatpickr-calendar-bg);
    box-shadow: -4px 0 0 var(--phoenix-flatpickr-calendar-bg),
        4px 0 0 var(--phoenix-flatpickr-calendar-bg);
}

/* =====================================================================
   20. DENSIDADE DAS TABELAS DO PAINEL
   =====================================================================
   O Phoenix desenha a tabela como se cada linha fosse um cartao:
   `padding: 1rem .5rem` com fonte de 1rem (16px) da uma linha de ~56px.
   O legado (`versao_antiga`, Bootstrap 4 com `html { font-size: 14px }` e
   `.table-sm`) resolvia a mesma linha em ~30px, e e' assim que a operacao
   esta acostumada a ler: mais registros por tela, menos rolagem.

   Aqui a grade do painel encolhe para perto disso — fonte de 13px e
   ~.4rem de respiro vertical, a MESMA medida que as Parciais e o dashboard
   comercial (secoes das tabelas largas) ja usavam por conta propria. Elas
   eram a excecao; agora sao o padrao.

   O cabecalho encolhe MENOS de proposito: ele ja e' o degrau fraco da
   pagina (caixa alta, cinza, 700) e derrubar o tamanho junto com o corpo
   o tornaria ilegivel — a coluna deixaria de se anunciar.

   Escopo `.content` = so' o painel. Portal de Carreiras e telas de login
   (`x-portal-layout` / `x-guest-layout`) nao tem esse wrapper e ficam com
   o desenho arejado do tema, que la' e' o certo.
   ===================================================================== */

.content .table {
    font-size: .8125rem;
    /* 1.5 do tema abre demais a celula de duas linhas (nome + login,
       equipe + subequipe), que e' o formato de metade das listagens. */
    line-height: 1.4;
}

/* O corpo da celula. `.table-sm` fica de fora: quem ja pediu a variante
   compacta do Bootstrap (.25rem) esta MAIS apertado que este padrao —
   entrar aqui seria AUMENTAR o respiro dessas tabelas. */
.content .table:not(.table-sm) > :not(caption) > * > * {
    padding: .4rem .5rem;
}

/* Cabecalho: e' ROTULO, nao dado. Ele diz o que a coluna guarda e depois
   sai do caminho — em caixa alta, 700 e espacado, um cabecalho no tamanho
   do dado disputa a leitura com a propria tabela. Dai ele ficar um degrau
   ABAIXO do corpo (11,2px contra 13px) e com menos respiro vertical que a
   celula (.3rem contra .4rem): a barra encolhe ~10px e some uma linha de
   rolagem por tela, sem tirar nada do que se veio ler.

   O espacamento entre letras tambem cai (.045em -> .02em, secao 1): em
   11px o valor antigo era desenhado para 13px e abria demais rotulos de
   duas palavras ("DATA DA VENDA"), que e' o formato da maioria. */
.content .table thead th {
    font-size: .7rem;
    padding-top: .3rem;
    padding-bottom: .3rem;
}

/* ---------------------------------------------------------------------
   20.1  O que mora DENTRO da celula
   ---------------------------------------------------------------------
   Encolher a celula sem encolher o conteudo nao compacta nada: um botao
   de 35px ou uma foto de 36px continuam mandando na altura da linha. */

/* Subtitulo da celula (login, subequipe, cidade). `.small` e' relativo:
   .875em de 13px daria 11,4px. Fixado em 12px para nao sumir. */
.content .table .small,
.content .table small {
    font-size: .75rem;
}

/* Badge de status: `--phoenix-badge-font-size: .75em` tambem e' relativo
   e cairia para ~9,7px dentro da grade. */
.content .table .badge {
    --phoenix-badge-font-size: .7rem;
}

/* Acoes da linha: o `btn-sm` do tema tem .5rem de respiro vertical e
   sozinho segura a linha em ~48px. */
.content .table .btn-sm,
.content .table .btn-group-sm > .btn {
    --phoenix-btn-padding-y: .25rem;
    --phoenix-btn-padding-x: .5rem;
    --phoenix-btn-font-size: .75rem;
}

/* Campos dentro da grade (edicao em linha, selecao em massa). */
.content .table .form-control-sm,
.content .table .form-select-sm {
    padding-top: .15rem;
    padding-bottom: .15rem;
    font-size: .75rem;
}

/* ---------------------------------------------------------------------
   20.2  Excecao do celular: a linha vira cartao
   ---------------------------------------------------------------------
   Na secao 1 o cartao do celular tem respiro proprio (`.5rem .85rem`),
   maior que o da grade — la' cada celula e' uma LINHA de um cartao, nao
   uma casa de uma grade, e apertar isso encosta rotulo e valor. Aquela
   regra tem menos peso que a densidade acima, entao volta aqui. */
@media (max-width: 767.98px) {
    .content .table.azm-dt-cards > :not(caption) > * > * {
        padding: .5rem .85rem;
    }
    .content .table.azm-dt-cards > tbody > tr > td.azm-dt-acoes {
        padding-top: .65rem;
    }
}


/* =====================================================================
   21. Cabecalho clicavel (classificacao) e coluna de acoes congelada
   =====================================================================
   Duas melhorias da mesma tabela, e as duas nascem do mesmo problema:
   a listagem das Vendas Residenciais tem treze colunas, entao ela ROLA na
   horizontal em qualquer tela menor que um monitor largo. Rolando, o
   cabecalho fica sem indicacao de que da' para classificar, e a coluna de
   acoes — a que a pessoa foi buscar — sai do campo de visao pela direita.
   --------------------------------------------------------------------- */

/* ---- 21.1  O cabecalho que classifica ---- */

/* O link ocupa a celula inteira: o alvo do clique passa a ser o cabecalho,
   e nao as duas palavras dentro dele. Numa barra que ocupa a largura da
   tela, mirar o texto e' o tipo de precisao que ninguem quer ter. */
.azm-dt thead th.azm-th-ordenavel { padding: 0; }
.azm-dt thead th.azm-th-ordenavel .azm-th-link {
    display: flex;
    align-items: center;
    gap: .4rem;
    width: 100%;
    height: 100%;
    /* O MESMO respiro que a secao 20 (densidade) da' ao cabecalho — o
       padding saiu do <th> e veio para ca', entao ele tem de ser repetido
       aqui ou a barra fica desalinhada nas colunas clicaveis. */
    padding: .3rem .5rem;
    color: inherit;
    text-decoration: none;
    white-space: nowrap;
    cursor: pointer;
    /* A cor do fundo responde ao mouse; a do texto, nao. Cabecalho que
       muda de cor ao passar o mouse parece link de navegacao, e este leva
       para a MESMA tela — so' que reordenada. */
    transition: background-color .12s ease;
}
.azm-dt thead th.azm-th-ordenavel .azm-th-link:hover,
.azm-dt thead th.azm-th-ordenavel .azm-th-link:focus-visible {
    background: color-mix(in srgb, var(--phoenix-secondary-color, #6e7891) 12%, transparent);
}
.azm-dt thead th.azm-th-ordenavel .azm-th-link:focus-visible {
    outline: 2px solid var(--phoenix-primary, #3874ff);
    outline-offset: -2px;
}

/* A seta: solida na coluna que ordena, invisivel nas outras ate' o mouse
   chegar. Acesa em todas, ela vira ruido e some com a unica informacao
   que o cabecalho precisa dar — qual coluna manda. */
.azm-dt thead th .azm-th-seta {
    width: 11px;
    height: 11px;
    stroke-width: 2.5;
    flex: 0 0 auto;
    margin-left: auto;
    opacity: 0;
    transition: opacity .12s ease;
}
.azm-dt thead th .azm-th-seta.is-ativa { opacity: 1; }
.azm-dt thead th.azm-th-ordenavel .azm-th-link:hover .azm-th-seta,
.azm-dt thead th.azm-th-ordenavel .azm-th-link:focus-visible .azm-th-seta { opacity: .55; }
.azm-dt thead th.azm-th-ordenavel .azm-th-link:hover .azm-th-seta.is-ativa,
.azm-dt thead th.azm-th-ordenavel .azm-th-link:focus-visible .azm-th-seta.is-ativa { opacity: 1; }

/* A coluna que esta ordenando fica com a tinta um degrau mais forte — e'
   o que responde "por onde esta ordenado?" sem obrigar a procurar a seta
   entre treze cabecalhos. */
.azm-dt thead th[aria-sort] {
    background: color-mix(in srgb, var(--phoenix-secondary-color, #6e7891) 17%, var(--phoenix-card-bg, #fff));
    color: var(--phoenix-emphasis-color, #31374a);
}

/* ---- 21.2  A coluna de acoes congelada a direita ----

   Ela e' o destino de quem abriu a lista: filtrar, achar a linha e clicar
   no olho. Numa tabela que rola na horizontal, esse ultimo passo obrigava
   a rolar ate' o fim — e, pior, a rolar de volta para conferir de que
   linha era o botao.

   `position: sticky` no `right: 0` resolve dentro do proprio contêiner de
   rolagem (`.table-responsive`), sem JS e sem duplicar a coluna.

   SO' A PARTIR DO `md`. Abaixo disso a listagem das Vendas Residenciais
   mostra apenas a coluna-resumo (nao ha rolagem horizontal para congelar),
   e as demais listagens viram CARTAO (`.azm-dt-cards`), onde cada celula e'
   uma linha de largura total: congelar ali empurraria o botao para fora do
   cartao. A media query e' o que mantem as duas leituras intactas. */
@media (min-width: 768px) {
    .azm-dt thead th.azm-dt-acoes,
    .azm-dt tbody td.azm-dt-acoes {
        position: sticky;
        right: 0;
        z-index: 2;
        /* Fundo OPACO, obrigatoriamente: a celula fica por cima das outras
           enquanto elas passam por baixo. Com fundo transparente, o texto
           das colunas roladas aparece atras dos botoes. */
        background: var(--phoenix-card-bg, #fff);
        /* A sombra a esquerda e' o que diz que ha conteudo escondido ali —
           sem ela, a coluna parada parece um erro de alinhamento. */
        box-shadow: -6px 0 8px -6px rgba(0, 0, 0, .18);
    }

    /* O cabecalho da coluna congelada fica ACIMA das celulas congeladas (o
       thead ja tem tinta propria) e mantem a cor do cabecalho, e nao a do
       cartao — senao a ultima casa da barra fica branca no meio da faixa. */
    .azm-dt thead th.azm-dt-acoes {
        z-index: 3;
        background: color-mix(in srgb, var(--phoenix-secondary-color, #6e7891) 9%, var(--phoenix-card-bg, #fff));
    }

    /* O realce de linha do `table-hover` pinta o `<td>`, e o fundo opaco
       acima o cobriria justamente na coluna em que o mouse esta. Repintar
       aqui devolve o destaque da linha inteira. */
    .azm-dt.table-hover > tbody > tr:hover > td.azm-dt-acoes {
        background: color-mix(in srgb, var(--phoenix-secondary-color, #6e7891) 8%, var(--phoenix-card-bg, #fff));
    }
}

/* No tema escuro o `--phoenix-card-bg` ja vem escuro, entao o fundo opaco
   acompanha sozinho. O que nao acompanha e' a sombra: preta sobre escuro
   ela some, e a coluna volta a parecer desalinhada em vez de congelada. */
@media (min-width: 768px) {
    .dark .azm-dt thead th.azm-dt-acoes,
    .dark .azm-dt tbody td.azm-dt-acoes {
        box-shadow: -6px 0 8px -6px rgba(0, 0, 0, .55);
    }
}


/* =====================================================================
   22. O "i" das datas na listagem (botao + popover)
   =====================================================================
   Ele mora dentro de uma linha inteiramente clicavel, entao precisa
   PARECER um controle proprio — senao quem olha nao imagina que clicar
   nele faz outra coisa que nao abrir a venda. Um <i> solto (o que havia
   antes) nao dava esse sinal nenhum.
   --------------------------------------------------------------------- */
.azm-dt-info {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 18px;
    height: 18px;
    padding: 0;
    margin-left: .15rem;
    vertical-align: middle;
    border: 0;
    border-radius: 50%;
    background: transparent;
    color: var(--phoenix-secondary-color, #6e7891);
    opacity: .6;
    cursor: pointer;
    transition: opacity .12s ease, background-color .12s ease;
}
.azm-dt-info:hover,
.azm-dt-info:focus-visible {
    opacity: 1;
    background: color-mix(in srgb, var(--phoenix-secondary-color, #6e7891) 18%, transparent);
}
.azm-dt-info:focus-visible {
    outline: 2px solid var(--phoenix-primary, #3874ff);
    outline-offset: 1px;
}
.azm-dt-info svg { width: 12px; height: 12px; stroke-width: 2.5; }

/* O conteudo do popover: rotulo a esquerda, data a direita, uma por
   linha. Duas colunas em vez de "Cadastro: 01/08/2026" corrido porque as
   datas ficam alinhadas entre si, e ler sete datas desalinhadas e' o que
   fazia o tooltip do legado ser inutil na pratica. */
.azm-popover-datas { max-width: 280px; }
.azm-popover-datas .popover-body { padding: .5rem .75rem; font-size: .78rem; }
.azm-popover-datas .popover-header { font-size: .72rem; text-transform: uppercase; letter-spacing: .04em; }
.azm-popover-data {
    display: flex;
    align-items: baseline;
    justify-content: space-between;
    gap: 1rem;
    padding: .15rem 0;
    white-space: nowrap;
}
.azm-popover-data + .azm-popover-data {
    border-top: 1px dashed var(--phoenix-border-color, #eff2f6);
}
.azm-popover-data span { color: var(--phoenix-secondary-color, #6e7891); }
.azm-popover-data b { font-variant-numeric: tabular-nums; }

/* =====================================================================
   23. As somas da venda (combo, adicionais, total)
   =====================================================================
   Tres linhas com rotulo a esquerda e as duas moedas (dinheiro e pontos)
   alinhadas a direita, uma sobre a outra. A grade fixa e' o ponto: com os
   numeros alinhados, conferir "planos + adicionais = total" e' uma olhada
   na vertical; escritos em texto corrido, vira conta de cabeca.
   --------------------------------------------------------------------- */
.azm-totais-venda {
    border: 1px solid var(--phoenix-border-color, #e3e6ed);
    border-radius: .5rem;
    overflow: hidden;
}
.azm-totais-linha {
    display: grid;
    grid-template-columns: 1fr 9rem 7rem;
    gap: .5rem;
    align-items: baseline;
    padding: .45rem .75rem;
    font-size: .8125rem;
}
.azm-totais-linha + .azm-totais-linha {
    border-top: 1px solid var(--phoenix-border-color, #eff2f6);
}
.azm-totais-linha span { color: var(--phoenix-secondary-color, #6e7891); }
/* Tabular: sem isto os digitos tem larguras diferentes e as tres linhas
   deixam de alinhar justamente na casa que se esta conferindo. */
.azm-totais-linha b { text-align: right; font-variant-numeric: tabular-nums; }

.azm-totais-linha.is-total {
    background: color-mix(in srgb, var(--phoenix-secondary-color, #6e7891) 8%, transparent);
    font-size: .875rem;
}
.azm-totais-linha.is-total span { color: var(--phoenix-emphasis-color, #31374a); font-weight: 600; }

/* No celular as duas colunas de numero nao cabem ao lado do rotulo. A
   linha vira duas: rotulo em cima, os dois numeros embaixo. */
@media (max-width: 575.98px) {
    .azm-totais-linha {
        grid-template-columns: 1fr 1fr;
    }
    .azm-totais-linha span { grid-column: 1 / -1; }
}

/* =====================================================================
   24. Itens adicionais no cadastro da venda
   =====================================================================
   Eles moram DENTRO da coluna do plano a que se atrelam, logo abaixo do
   select. O recuo e o fio a esquerda sao o que diz isso sem legenda: o
   bloco pertence ao campo de cima, e nao e' mais uma pergunta solta do
   formulario.
   --------------------------------------------------------------------- */
.azm-adicionais {
    padding-left: .75rem;
    border-left: 2px solid var(--phoenix-border-color, #e3e6ed);
}
.azm-adicionais-titulo {
    font-size: .68rem;
    font-weight: 700;
    text-transform: uppercase;
    letter-spacing: .04em;
    color: var(--phoenix-secondary-color, #6e7891);
    margin-bottom: .25rem;
}

/* Os genericos (que valem para a venda toda) nao pertencem a campo nenhum,
   entao viram uma caixa em vez de um recuo. */
.azm-adicionais-gerais {
    padding: .75rem;
    border: 1px solid var(--phoenix-border-color, #e3e6ed);
    border-left-width: 1px;
    border-radius: .5rem;
}

.azm-adicional + .azm-adicional { margin-top: .2rem; }

/* Nome e preco um sobre o outro: o nome e' o que se procura, o preco e' o
   que se confere depois de achar. Lado a lado, os precos de itens de nome
   curto e longo ficariam desalinhados e ilegiveis em coluna estreita. */
.azm-adicional-rotulo { display: block; line-height: 1.25; cursor: pointer; }
.azm-adicional-nome { display: block; font-size: .8125rem; }
.azm-adicional-preco {
    display: block;
    font-size: .7rem;
    color: var(--phoenix-secondary-color, #6e7891);
    font-variant-numeric: tabular-nums;
}

/* O contador (itens de quantidade > 1) fica ao lado do rotulo, estreito:
   sao no maximo dois digitos, e um campo de largura total ali pareceria
   pedir outra coisa. */
.azm-adicional:has(.azm-adicional-qtd) {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: .5rem;
}
.azm-adicional-qtd { width: 4.25rem; flex: 0 0 auto; text-align: center; }

/* =====================================================================
   25. Ficha do usuario (.azm-ficha-*) — cabecalho de usuarios/show e edit
   ---------------------------------------------------------------------
   O que havia antes: uma faixa de 120px em degrade da cor da marca, com a
   foto subindo por cima dela (`margin-top: -3rem`) e os dados soltos numa
   linha de icones. Tres problemas, e nenhum e' de gosto:

     a) a faixa colorida NAO carregava informacao nenhuma — ocupava o topo
        inteiro da tela mais consultada do cadastro para nao dizer nada, e
        empurrava o dado (nome, cargo, operacao) para baixo da dobra em
        tela de notebook;
     b) o `margin-top` negativo obrigava tudo da linha a se alinhar pelo
        RODAPE (`align-items: end`) — dai o bloco do nome, a miniatura da
        foto corporativa e os botoes ficarem cada um numa altura, com
        `pb-1` chumbado em cada um para disfarcar;
     c) os dados vinham como icone+texto emendados: sem rotulo, "Canoas"
        e "Consultor" liam-se como a mesma coisa, e um e-mail longo
        quebrava a linha inteira.

   A troca e' por uma FICHA: identidade em cima (foto, nome, situacao),
   dados embaixo numa grade rotulada. Sem tinta de fundo — o cartao ja
   separa do corpo da pagina, e o realce fica para o que e' excecao
   (a etiqueta de inativo).
   ===================================================================== */
.azm-ficha-topo {
    display: flex;
    flex-wrap: wrap;
    align-items: flex-start;
    justify-content: space-between;
    gap: 1rem 1.25rem;
}

/* Foto(s) + nome. `min-width: 0` para o nome longo poder encolher em vez
   de estourar a linha e empurrar os botoes para fora. */
.azm-ficha-identidade {
    display: flex;
    align-items: center;
    gap: 1rem;
    min-width: 0;
}

/* As duas fotos LADO A LADO, e nao sobrepostas como na listagem: aqui ha
   espaco, e a corporativa e' a foto do cracha — quem abre a ficha abre
   justamente para confere-la.

   As duas com o MESMO formato (quadrada de cantos arredondados, secao 7).
   O formato ja tentou dizer qual era qual — redonda = perfil, retangulo =
   corporativa —, mas era uma convencao que so' quem escreveu conhecia, e
   custava a silhueta desalinhada da dupla. Qual e' qual esta no `title` de
   cada uma, na ordem fixa perfil › corporativa. */
.azm-ficha-fotos { display: flex; align-items: center; gap: .5rem; }
.azm-ficha-fotos .azm-avatar-foto {
    border: 2px solid var(--phoenix-card-bg, #fff);
    box-shadow: 0 0 0 1px var(--azm-fio-superficie, rgba(20, 24, 36, .10));
    /* A 4rem, a proporcao da secao 7 arredondaria demais: aqui o raio e'
       medido, para ler como cartao e nao como pastilha. */
    border-radius: .625rem;
}

.azm-ficha-nome { line-height: 1.2; }

/* Login e CPF: identificam a pessoa, mas nao sao o titulo. Um degrau
   abaixo do nome e tabular no CPF, que se le digito a digito. */
.azm-ficha-chaves {
    display: flex;
    flex-wrap: wrap;
    gap: .15rem .6rem;
    margin-top: .2rem;
    font-size: .8125rem;
    color: var(--phoenix-secondary-color, #6e7891);
}
.azm-ficha-chaves .azm-ficha-cpf { font-variant-numeric: tabular-nums; }

.azm-ficha-acoes { display: flex; flex-wrap: wrap; gap: .5rem; }

/* ---------------------------------------------------------------------
   A grade de dados do cabecalho
   ---------------------------------------------------------------------
   `auto-fit` com minimo de 11rem: a mesma marcacao vira quatro colunas no
   monitor, duas no tablet e uma no telefone, sem `col-md-*` chumbado e
   sem sobrar coluna vazia quando um dado nao existe.

   Rotulo em cima do valor (e nao ao lado): os rotulos daqui tem larguras
   muito diferentes ("Cargo" x "E-mail corporativo") e, lado a lado, ou os
   valores desalinhavam ou se perdia meia coluna com o rotulo mais longo.
   --------------------------------------------------------------------- */
.azm-ficha-dados {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(11rem, 1fr));
    gap: .9rem 1.5rem;
    margin: 1.1rem 0 0;
    padding-top: 1.1rem;
    border-top: 1px solid var(--azm-fio-superficie, rgba(20, 24, 36, .10));
}
.azm-ficha-dados > div { min-width: 0; }
.azm-ficha-dados dt {
    font-size: .68rem;
    font-weight: 600;
    text-transform: uppercase;
    letter-spacing: .04em;
    color: var(--phoenix-tertiary-color, #8a94ad);
    margin-bottom: .1rem;
}
.azm-ficha-dados dd {
    margin: 0;
    line-height: 1.35;
    /* E-mail corporativo nao cabe em 11rem e nao tem espaco onde quebrar:
       sem isto ele estoura a celula e desalinha a grade inteira. */
    overflow-wrap: anywhere;
}

@media (max-width: 575.98px) {
    /* No telefone os botoes viram uma faixa propria de largura inteira —
       espremidos ao lado do nome, cada um cairia numa linha. */
    .azm-ficha-acoes { width: 100%; }
    .azm-ficha-acoes > *,
    .azm-ficha-acoes .btn { flex: 1 1 auto; }
}

/* =====================================================================
   26. ANALISES — o editor de blocos e o modo "organizar" do painel

   Duas superficies de arrastar e soltar, e elas nao se parecem por acaso:

     - no EDITOR, arrasta-se um CAMPO da fonte para uma zona ("dimensao",
       "metrica", "filtros"). E' a tabela dinamica: o que se move e' o
       significado do campo, nao um pedaco de tela;
     - no PAINEL, arrasta-se o BLOCO para outro lugar e puxa-se a alca para
       mudar de tamanho. Aqui o que se move e' o layout.

   As duas usam Pointer Events, e nao a API de drag-and-drop do HTML5: aquela
   nao funciona em toque sem polyfill, nao deixa desenhar o fantasma que segue
   o dedo e da' um "drop" que o iOS ignora. Pointer Events cobre mouse, dedo e
   caneta com o mesmo codigo.
   ===================================================================== */

/* --- A moldura de tres colunas do editor -------------------------------- */

.azm-an-editor {
    display: grid;
    /* Campos | zonas | previa. A do meio e' a que cresce: e' onde se trabalha. */
    grid-template-columns: 260px minmax(0, 1fr) minmax(0, 420px);
    gap: 1rem;
    align-items: start;
}

@media (max-width: 1399.98px) {
    /* A previa desce para baixo das zonas — continua visivel sem rolar duas
       colunas ao mesmo tempo. */
    .azm-an-editor { grid-template-columns: 240px minmax(0, 1fr); }
    .azm-an-previa-col { grid-column: 1 / -1; }
}

@media (max-width: 991.98px) {
    .azm-an-editor { grid-template-columns: minmax(0, 1fr); }
}

/* A coluna de campos acompanha a rolagem: arrastar um campo para uma zona que
   saiu da tela seria arrastar as cegas. */
.azm-an-campos-col,
.azm-an-previa-col {
    position: sticky;
    top: 1rem;
}

@media (max-width: 1399.98px) {
    .azm-an-previa-col { position: static; }
}

@media (max-width: 991.98px) {
    .azm-an-campos-col { position: static; }
}

/* --- A lista de campos da fonte ---------------------------------------- */

.azm-an-campos {
    max-height: 62vh;
    overflow-y: auto;
}

.azm-an-campos-grupo {
    font-size: .68rem;
    font-weight: 700;
    text-transform: uppercase;
    letter-spacing: .05em;
    color: var(--phoenix-tertiary-color, #8a94ad);
    padding: .6rem .25rem .25rem;
}

.azm-an-campo {
    display: flex;
    align-items: center;
    gap: .4rem;
    width: 100%;
    padding: .3rem .45rem;
    border: 1px solid transparent;
    border-radius: .375rem;
    background: transparent;
    font-size: .82rem;
    line-height: 1.25;
    text-align: left;
    color: inherit;
    /* `grab` e nao `pointer`: o cursor e' a unica pista de que isto se arrasta
       antes de a pessoa tentar. */
    cursor: grab;
    touch-action: none;
}

.azm-an-campo:hover {
    background: var(--phoenix-secondary-bg, rgba(0, 0, 0, .04));
    border-color: var(--phoenix-border-color, #e3e6ed);
}

.azm-an-campo:focus-visible {
    outline: 2px solid var(--phoenix-primary, #3874ff);
    outline-offset: 1px;
}

.azm-an-campo.is-arrastando { opacity: .4; }

/* O simbolo do papel do campo. A cor e' encoding SECUNDARIO — a letra diz a
   mesma coisa, para quem nao distingue as duas. */
.azm-an-papel {
    flex: 0 0 auto;
    width: 18px;
    height: 18px;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    border-radius: .25rem;
    font-size: .62rem;
    font-weight: 700;
}

.azm-an-papel-dimensao { background: rgba(42, 120, 214, .16); color: #2a78d6; }
.azm-an-papel-metrica  { background: rgba(0, 131, 0, .16);   color: #0a7a0a; }
.azm-an-papel-data     { background: rgba(237, 161, 0, .18); color: #a06d00; }

.dark .azm-an-papel-dimensao { background: rgba(57, 135, 229, .22); color: #7fb3f2; }
.dark .azm-an-papel-metrica  { background: rgba(25, 158, 112, .22); color: #5fd0a6; }
.dark .azm-an-papel-data     { background: rgba(201, 133, 0, .22);  color: #e8b45c; }

.azm-an-campo-nome {
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

/* --- As zonas de soltura ------------------------------------------------ */

.azm-an-zona {
    border: 1.5px dashed var(--phoenix-border-color, #e3e6ed);
    border-radius: .5rem;
    padding: .5rem;
    min-height: 3.25rem;
    transition: border-color .12s ease, background-color .12s ease;
}

/* Aceita o campo que esta sendo arrastado: convite. */
.azm-an-zona.is-alvo {
    border-color: var(--phoenix-primary, #3874ff);
    background: color-mix(in srgb, var(--phoenix-primary, #3874ff) 8%, transparent);
}

/* NAO aceita: a zona APAGA em vez de ficar vermelha. Vermelho anuncia erro, e
   arrastar uma metrica para o eixo nao e' erro — e' uma tentativa. */
.azm-an-zona.is-recusada { opacity: .45; }

.azm-an-zona-vazia {
    display: flex;
    align-items: center;
    justify-content: center;
    min-height: 2.25rem;
    font-size: .78rem;
    color: var(--phoenix-tertiary-color, #8a94ad);
}

.azm-an-zona-rotulo {
    display: flex;
    align-items: baseline;
    gap: .4rem;
    font-size: .72rem;
    font-weight: 700;
    text-transform: uppercase;
    letter-spacing: .04em;
    color: var(--phoenix-tertiary-color, #8a94ad);
    margin-bottom: .3rem;
}

.azm-an-zona-ajuda {
    font-weight: 400;
    text-transform: none;
    letter-spacing: 0;
}

/* --- A ficha de um campo ja atribuido (o "chip") ------------------------ */

.azm-an-ficha {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: .35rem;
    padding: .35rem .4rem;
    border: 1px solid var(--phoenix-border-color, #e3e6ed);
    border-radius: .375rem;
    background: var(--phoenix-body-bg, #fff);
}

.dark .azm-an-ficha { background: var(--phoenix-emphasis-bg, #1e1f24); }

.azm-an-ficha + .azm-an-ficha { margin-top: .35rem; }

.azm-an-ficha-nome {
    font-size: .82rem;
    font-weight: 600;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

/* Os controles dentro da ficha (calculo, granularidade, operador, valor) sao
   os CAMPOS DE VERDADE do formulario — nao ha espelho escondido para manter em
   dia. Por isso ficam pequenos, mas continuam sendo select e input comuns. */
.azm-an-ficha select,
.azm-an-ficha input {
    height: auto;
    padding: .12rem .4rem;
    font-size: .76rem;
    width: auto;
    min-width: 6rem;
}

.azm-an-ficha .azm-an-ficha-valor { min-width: 8rem; flex: 1 1 8rem; }

/* O SINAL DE DIVISAO da ficha de razao, entre a coluna de cima e a de baixo.
   Ele nao e' enfeite: e' o que diz QUAL DAS DUAS e' o numerador. Sem o sinal,
   duas caixas iguais lado a lado se leem em qualquer ordem, e trocar as duas
   da' um numero plausivel e invertido. `aria-hidden` porque o leitor de tela
   ja' ouve o rotulo do select ("dividido por") — o caractere solto seria ruido. */
.azm-an-ficha-divisao {
    font-size: .95rem;
    font-weight: 700;
    line-height: 1;
    color: var(--phoenix-secondary-color, #6e7891);
}

.azm-an-ficha-remover {
    margin-left: auto;
    border: 0;
    background: transparent;
    color: var(--phoenix-tertiary-color, #8a94ad);
    line-height: 1;
    padding: .1rem .25rem;
    border-radius: .25rem;
}

.azm-an-ficha-remover:hover { color: var(--phoenix-danger, #e5780b); }

/* --- O fantasma que segue o ponteiro ------------------------------------ */

.azm-an-fantasma {
    position: fixed;
    z-index: 2000;
    /* Nao pode capturar o ponteiro: o `elementFromPoint` que descobre a zona
       sob o dedo devolveria o proprio fantasma, e nenhuma zona jamais
       acenderia. */
    pointer-events: none;
    padding: .25rem .5rem;
    border-radius: .375rem;
    font-size: .78rem;
    font-weight: 600;
    background: var(--phoenix-primary, #3874ff);
    color: #fff;
    box-shadow: 0 6px 16px rgba(0, 0, 0, .22);
    transform: translate(8px, 8px);
}

/* --- Os tipos de bloco, como botoes ------------------------------------- */

.azm-an-tipos {
    display: flex;
    flex-wrap: wrap;
    gap: .4rem;
}

.azm-an-tipo {
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: .2rem;
    min-width: 5.25rem;
    padding: .5rem .35rem;
    border: 1px solid var(--phoenix-border-color, #e3e6ed);
    border-radius: .5rem;
    background: transparent;
    font-size: .7rem;
    color: inherit;
}

.azm-an-tipo:hover { border-color: var(--phoenix-primary, #3874ff); }

.azm-an-tipo.is-ativo {
    border-color: var(--phoenix-primary, #3874ff);
    background: color-mix(in srgb, var(--phoenix-primary, #3874ff) 10%, transparent);
    font-weight: 600;
}

/* =====================================================================
   26.b  O modo "organizar" do painel
   ===================================================================== */

/* Fora do modo organizar nada muda: o painel e' uma tela de leitura, e um
   cartao que se mexe ao passar o mouse e' um convite a arrastar sem querer. */
.azm-an-painel.is-organizando .azm-analise-bloco {
    cursor: grab;
    user-select: none;
    position: relative;
}

/* Os botoes do cabecalho do bloco (exportar, editar) saem de cena enquanto se
   organiza: comecar um arrasto em cima de um link abriria a outra tela. */
.azm-an-painel.is-organizando .azm-analise-bloco .card-header .btn {
    pointer-events: none;
    opacity: .4;
}

.azm-an-painel.is-organizando .azm-analise-bloco::after {
    /* A alca de tamanho, no canto — as duas dimensoes na mesma pega, como em
       qualquer janela. */
    content: '';
    position: absolute;
    right: 2px;
    bottom: 2px;
    width: 16px;
    height: 16px;
    border-right: 2px solid var(--phoenix-tertiary-color, #8a94ad);
    border-bottom: 2px solid var(--phoenix-tertiary-color, #8a94ad);
    border-bottom-right-radius: .25rem;
    cursor: nwse-resize;
    opacity: .55;
}

.azm-an-bloco-col.is-movendo { opacity: .35; }

/* O lugar onde o bloco cai, desenhado enquanto se arrasta. */
.azm-an-vaga {
    border: 2px dashed var(--phoenix-primary, #3874ff);
    border-radius: .5rem;
    background: color-mix(in srgb, var(--phoenix-primary, #3874ff) 7%, transparent);
    min-height: 6rem;
}

/* A barra do modo organizar gruda no topo: "Salvar layout" nao pode exigir
   rolar ate o fim de um painel de doze blocos. */
.azm-an-barra {
    position: sticky;
    top: 0;
    z-index: 3;
}

/* A caixa de marcacao das colunas de uma fonte.

   A margem existe porque a coluna e' estreita e o Bootstrap encosta a caixa na
   borda da celula: sem ela o quadradinho fica colado na linha vertical da
   tabela e parece parte da moldura, nao um controle. */
.azm-an-check {
    margin-left: .55rem;
}

/* O ATRIBUTO `hidden` TEM DE VENCER AS UTILITIES DE DISPLAY.

   `hidden` vira `display: none` pela folha do NAVEGADOR, que perde para
   qualquer regra de autor — e as utilities do Bootstrap (`d-flex`, `d-block`,
   `d-grid`) sao `display: ... !important`. Um elemento com as duas coisas fica
   VISIVEL, e nada na marcacao denuncia isso: o `hidden` esta la, escrito.

   Foi o que aconteceu com a barra do modo organizar — `alert d-flex ... hidden`
   aparecia o tempo todo, inclusive com o modo desligado.

   A regra e' restrita aos elementos das Analises de proposito: uma versao
   global mudaria o comportamento de qualquer lugar do painel que combine as
   duas coisas, e essa varredura nao cabe aqui. */
.azm-an-barra[hidden],
[data-azm-zona-bloco][hidden] {
    display: none !important;
}

/* =====================================================================
   26.c  O grid do painel — blocos ocupando mais de uma "linha"

   Um CSS GRID de 12 colunas, e nao a `row` do Bootstrap. A row estica
   todos os cartoes de uma linha ate o mais alto — e com isso um bloco
   nunca ocupa "duas linhas" enquanto dois vizinhos baixos se empilham ao
   lado dele. Aqui a ALTURA gravada do bloco vira `grid-row: span N` sobre
   linhas finas de 8px, e o `dense` preenche os buracos: dois indicadores
   baixos cabem um em cima do outro, ao lado de uma tabela alta.

   A CONTA DAS LINHAS: linha de 8px + vao de 16px => cada passo vale 24px,
   e N linhas medem 24N - 16. Ela vive em TRES lugares que tem de bater:
   aqui (8px/16px), no show.blade.php (span inicial) e em definirAltura()
   do azm-analises.js (a alca de tamanho).

   As larguras continuam em "colunas de 12", agora via a variavel
   `--azm-an-larg` (o col-lg-N saiu de cena: fora de uma .row, a classe
   traria width em % que brigaria com a trilha do grid).
   ===================================================================== */

.azm-an-painel {
    display: grid;
    grid-template-columns: repeat(12, 1fr);
    grid-auto-rows: 8px;
    grid-auto-flow: row dense;
    gap: 1rem;
}

.azm-an-bloco-col {
    /* No celular todo bloco vale a tela inteira, como o col-12 de antes;
       a altura gravada continua valendo — grafico precisa de altura fixa
       em qualquer largura. */
    grid-column: 1 / -1;
    grid-row: span var(--azm-an-linhas, 13);
    min-width: 0;
}

@media (max-width: 991.98px) {
    /* A ORDEM DO CELULAR e' a VISUAL do desktop (linha*12+coluna, calculada
       no show.blade.php com o mesmo primeiro-encaixe do `dense`), e nao a do
       DOM: num painel montado para empilhar, a ordem do cadastro poe o bloco
       alto entre os dois baixos — e a pilha do celular sairia embaralhada. */
    .azm-an-bloco-col {
        order: var(--azm-an-ordem, 0);
    }
}

@media (min-width: 992px) {
    .azm-an-bloco-col {
        grid-column: span var(--azm-an-larg, 6);
    }
}

/* O cartao preenche a celula do grid (o h-100 ja' vem da classe), e o miolo
   vira flex para o DESENHO ocupar a sobra: a altura agora mora na celula, e
   nao mais num height fixo do canvas — e' o que deixa o mesmo bloco caber em
   qualquer span sem duas verdades sobre o tamanho. Os `!important` vencem o
   height/max-height inline do bloco.blade.php, que segue existindo como
   fallback e para a previa do editor (que nao tem grid nenhum). */
/* O corte de sobra fica no card-body, e NAO no cartao: overflow hidden no
   cartao decapitaria o menu suspenso de exportar, que e' um filho absoluto
   do cabecalho. */
.azm-an-bloco-col .azm-analise-bloco > .card-body {
    display: flex;
    flex-direction: column;
    min-height: 0;
    overflow: hidden;
}

.azm-an-bloco-col .azm-analise-bloco .card-body > [data-azm-chart] {
    flex: 1 1 auto;
    min-height: 0;
    display: flex;
    flex-direction: column;
}

.azm-an-bloco-col .azm-analise-bloco .card-body .azm-chart-canvas {
    flex: 1 1 auto;
    min-height: 0;
    height: auto !important;
}

.azm-an-bloco-col .azm-analise-bloco .card-body > .table-responsive {
    flex: 1 1 auto;
    min-height: 0;
    max-height: none !important;
}

/* =====================================================================
   26.d  O (i) dos filtros do bloco — um tooltip, nao um rodape

   As frases de filtro fixo abriam o cartao inteiro de aviso; agora vivem
   numa dica flutuante ancorada no (i) do cabecalho. CSS puro (hover +
   focus-within): sem JS para religar a cada troca de tela do HTMX, e o
   foco do teclado abre a mesma dica que o mouse.

   O (i) e' MAIS APAGADO que os botoes de acao de proposito (tertiary, e
   nao secondary): ele informa, nao age — um cinza igual ao do lapis
   convidaria o clique esperando uma acao.
   ===================================================================== */

.azm-an-info {
    position: relative;
    display: inline-flex;
}

.azm-an-info-botao {
    color: var(--phoenix-tertiary-color, #9fa6bc);
    opacity: .7;
}

.azm-an-info-botao:hover,
.azm-an-info-botao:focus {
    color: var(--phoenix-secondary-color, #525b75);
    opacity: 1;
}

.azm-an-info-dica {
    display: none;
    position: absolute;
    top: calc(100% + .35rem);
    right: -.25rem;
    /* Acima dos cartoes vizinhos do grid, que sao irmaos no empilhamento. */
    z-index: 30;
    min-width: 230px;
    max-width: 320px;
    padding: .5rem .65rem;
    font-size: .78rem;
    line-height: 1.5;
    text-align: left;
    white-space: normal;
    color: var(--phoenix-body-color, #31374a);
    background: var(--phoenix-body-bg, #fff);
    border: 1px solid var(--phoenix-border-color, #cbd0dd);
    border-radius: .375rem;
    box-shadow: 0 .5rem 1rem rgba(0, 0, 0, .15);
}

.azm-an-info:hover .azm-an-info-dica,
.azm-an-info:focus-within .azm-an-info-dica {
    display: block;
}

/* --- A barra de paginas de um painel ------------------------------------
   Itens soltos e menus suspensos, no desenho da navegacao de um relatorio.
   So aparece com mais de uma pagina — uma barra de um item so' ocupa espaco
   para nao informar nada. */
.azm-an-paginas {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: .25rem;
    border-bottom: 1px solid var(--phoenix-border-color, #e3e6ed);
    padding-bottom: .25rem;
}

/* A VAGA DO ICONE, no menu suspenso das paginas e no cadastro delas.

   Ela ocupa o lugar mesmo VAZIA, de proposito. Num menu em que so' metade das
   paginas tem desenho, sem a vaga os nomes das outras comecariam mais a'
   esquerda e a lista viraria um zigue-zague — a mesma razao pela qual um menu
   de aplicativo reserva a coluna do check. */
.azm-an-icone-vaga,
.azm-an-icone-previa {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    flex: 0 0 16px;
    width: 16px;
    height: 16px;
    color: var(--phoenix-secondary-color, #6e7891);
}

.dropdown-item.active .azm-an-icone-vaga { color: inherit; }

/* ---- O SELETOR DE ICONE (cadastro de paginas) -----------------------

   Nao e' um `select`: opcao de select so' carrega TEXTO, e a lista dizia
   "Barras", "Pessoas", "Movimento" — nomes que descrevem o desenho sem
   mostra-lo. Aqui o botao mostra o escolhido e a grade mostra todos. */
/* O campo em si nao posiciona nada — a grade e' `fixed`. O `relative` fica
   para o dia em que o botao ganhar um adorno proprio. */
.azm-an-icone-campo {
    position: relative;
}

/* O botao JA' E' um `.form-select` — borda, altura, fonte, tema e a seta do
   fundo vem de la'. Aqui so' entra o que o `form-select` nao preve': ele
   espera um texto solto, e este tem um desenho antes do nome. */
.azm-an-icone-botao {
    display: inline-flex;
    align-items: center;
    gap: .4rem;
    width: 100%;
    text-align: left;
}

/* O nome do icone escolhido. Encolhe antes do desenho e da seta: numa coluna
   estreita, quem some primeiro tem de ser o texto, nao o desenho — que e' a
   informacao que a pessoa veio conferir. */
.azm-an-icone-rotulo {
    flex: 1 1 auto;
    min-width: 0;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

/* A GRADE FLUTUA EM `fixed`, e o JavaScript poe as coordenadas.

   Nao e' preciosismo: a tabela vive num `.table-responsive`, que e' um
   `overflow: auto`, e todo `overflow` recorta o que passa das bordas. Em
   `absolute` dentro da celula, a grade sairia cortada nas colunas da direita e
   nas ultimas linhas — sem erro nenhum, so' com metade dos icones fora de
   alcance. */
.azm-an-icone-grade {
    position: fixed;
    z-index: 1056; /* acima do dropdown do Bootstrap (1000) e do modal (1055) */
    top: 0;
    left: 0;
    display: grid;
    grid-template-columns: repeat(8, 1fr);
    gap: .15rem;
    width: max-content;
    max-width: 20rem;
    padding: .4rem;
    border: 1px solid var(--phoenix-border-color, #e3e6ed);
    border-radius: .5rem;
    background: var(--phoenix-body-bg, #fff);
    box-shadow: 0 .5rem 1.5rem rgba(0, 0, 0, .18);
}

.dark .azm-an-icone-grade { background: var(--phoenix-emphasis-bg, #1e1f24); }

.azm-an-icone-grade[hidden] { display: none; }

.azm-an-icone-cel {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 30px;
    height: 30px;
    padding: 0;
    border: 0;
    border-radius: .3rem;
    background: transparent;
    color: var(--phoenix-body-color, #31374a);
}

.azm-an-icone-cel:hover {
    background: var(--phoenix-primary, #3874ff);
    color: #fff;
}

.azm-an-pagina {
    display: inline-flex;
    align-items: center;
    gap: .3rem;
    padding: .4rem .7rem;
    border: 0;
    border-bottom: 2px solid transparent;
    background: transparent;
    border-radius: .375rem .375rem 0 0;
    font-size: .85rem;
    color: var(--phoenix-secondary-color, #6e7891);
    text-decoration: none;
    /* A margem negativa faz a borda do item cair EM CIMA da borda da barra, e
       nao um pixel abaixo dela. */
    margin-bottom: -.3rem;
}

.azm-an-pagina:hover {
    color: var(--phoenix-emphasis-color, #141824);
    background: var(--phoenix-secondary-bg, rgba(0, 0, 0, .04));
}

.azm-an-pagina.is-ativa {
    color: var(--phoenix-primary, #3874ff);
    border-bottom-color: var(--phoenix-primary, #3874ff);
    font-weight: 600;
}
