/* ==========================================================
   Sistema de Vendas - Estilos base
   pt-BR / UTF-8
   ========================================================== */
*, *::before, *::after { box-sizing: border-box; }

/* ==========================================================
   SCROLLBAR GLOBAL — fina e minimalista, igual em todos os elementos
   roláveis. Firefox usa scrollbar-width/color (nativo); Chrome/Edge/Safari
   usam ::-webkit-scrollbar. Sem isto, containers sem estilo próprio caíam no
   scrollbar GROSSO e escuro padrão do SO no Chrome (vertical e horizontal).
   Elementos específicos (.conteudo, .modal-body...) ainda podem refinar.
   ========================================================== */
* {
    scrollbar-width: thin;                          /* Firefox: barra fina */
    scrollbar-color: var(--borda-forte, #cbd5e1) transparent;
}
*::-webkit-scrollbar { width: 8px; height: 8px; }   /* vertical + horizontal */
*::-webkit-scrollbar-track { background: transparent; }
*::-webkit-scrollbar-thumb {
    background: var(--borda-forte, #cbd5e1);
    border-radius: 8px;
    border: 2px solid transparent;                  /* "respiro" — afina o thumb */
    background-clip: content-box;
}
*::-webkit-scrollbar-thumb:hover { background: var(--texto-fraco, #94a3b8); background-clip: content-box; }
*::-webkit-scrollbar-corner { background: transparent; }
/* ==========================================================
   THEMING — pares semânticos (light = default + dark override)

   REGRA INVARIANTE: NUNCA hex/rgb hardcoded em color: ou background: novos.
   Use SEMPRE uma var dessa lista. Light e dark precisam ter o MESMO conjunto
   de vars — se faltar dark, o site quebra (text invisível em bg dinâmico).

   Em dark mode, --primary vira blurple Discord (#7289DA) por padrão (botões
   primários ficam blurple). Hovers de menu/sidebar continuam SUTIS (bg-hover)
   tanto em light quanto em dark — nada de blurple sólido em hover.
   ========================================================== */
:root {
    /* --primary é sobrescrito pelo /api/aparencia/theme.css quando há tema
       customizado por tenant; sem isso, fica o laranja oficial.
       --cor-primaria mantém-se como alias pra retrocompatibilidade. */
    --cor-primaria: #FF6B00;
    --primary:      #FF6B00;
    --primary-hover:#E05E00;
    --primary-soft: color-mix(in srgb, var(--primary) 12%, transparent);
    --texto-on-primary: #FFFFFF;

    --texto:        #0F1115;
    --texto-fraco:  #6B7280;
    --texto-medio:  #2A2F3A;
    --texto-disabled:#9CA3AF;
    --bg:           #F7F8FA;
    --bg-card:      #FFFFFF;
    --bg-elevado:   #F9FAFB;   /* hover de linha, sticky header, área levantada */
    --bg-hover:     #F3F4F6;   /* hover de botão ghost, item de menu */
    --bg-disabled:  #F9FAFB;
    --input-bg:     #FFFFFF;   /* input/select/textarea — light igual ao card */
    --input-borda:  #E5E7EB;
    --borda:        #E5E7EB;
    --borda-forte:  #CAD1D9;
    --overlay:      rgba(0,0,0,.45);

    --sucesso:      #10B981;
    --erro:         #EF4444;
    --aviso:        #F59E0B;
    --info:         #3B82F6;

    /* Badges/pills semânticos — pares fg/bg validados WCAG AA */
    --badge-success-bg: #DCFCE7; --badge-success-fg: #15803D;
    --badge-erro-bg:    #FEE2E2; --badge-erro-fg:    #991B1B;
    --badge-aviso-bg:   #FEF3C7; --badge-aviso-fg:   #92400E;
    --badge-info-bg:    #DBEAFE; --badge-info-fg:    #1E40AF;
    --badge-neutro-bg:  #F3F4F6; --badge-neutro-fg:  #374151;

    --sombra:       0 1px 2px rgba(15,17,21,.06);
    --sombra-md:    0 4px 12px rgba(15,17,21,.08);
    --sombra-lg:    0 20px 40px -12px rgba(15,17,21,.15);
    --sombra-orange:0 10px 30px color-mix(in srgb, var(--primary) 25%, transparent);

    --raio:         10px;
    --raio-sm:      8px;
    --raio-lg:      16px;
    --raio-xl:      24px;

    --font-display: 'Space Grotesk', 'Inter', system-ui, sans-serif;
    --font-body:    'Inter', 'Segoe UI', Roboto, system-ui, -apple-system, sans-serif;
}

/* DARK MODE — paleta Discord-inspired. Aplicado quando <html data-theme="dark">.
   Especificidade (0,1,1) vence :root (0,0,1), então sobrepõe o theme.css
   da empresa em dark mode (intencional — branding empresa só vale no light). */
:root[data-theme="dark"] {
    --primary:          #7289DA;   /* Discord blurple */
    --primary-hover:    #5B6EAE;
    --primary-soft:     color-mix(in srgb, var(--primary) 18%, transparent);
    --texto-on-primary: #FFFFFF;
    --cor-primaria:     #7289DA;   /* alias legado */

    --texto:        #DCDDDE;
    --texto-fraco:  #99AAB5;       /* Discord text secondary */
    --texto-medio:  #B9BBBE;
    --texto-disabled:#6B7280;
    --bg:           #23272A;       /* Discord darkest */
    --bg-card:      #2C2F33;       /* Discord card */
    --bg-elevado:   #36393F;       /* Discord channel hover */
    --bg-hover:     #36393F;
    --bg-disabled:  #2C2F33;
    --input-bg:     #40444B;       /* Discord input "sunken" — mais escuro que card pra contraste */
    --input-borda:  #202225;       /* Discord input border (borda escura) */
    --borda:        #40444B;
    --borda-forte:  #4F545C;
    --overlay:      rgba(0,0,0,.7);

    /* Cores semânticas em dark: tons mais saturados pra contraste no escuro */
    --sucesso:      #4ADE80;
    --erro:         #F87171;
    --aviso:        #FCD34D;
    --info:         #93C5FD;

    /* Badges em dark: bg ESCURO + fg CLARO (inverte o esquema light) */
    --badge-success-bg: #1F3A2E; --badge-success-fg: #4ADE80;
    --badge-erro-bg:    #3F1D1D; --badge-erro-fg:    #F87171;
    --badge-aviso-bg:   #3F2D14; --badge-aviso-fg:   #FCD34D;
    --badge-info-bg:    #1E2A4A; --badge-info-fg:    #93C5FD;
    --badge-neutro-bg:  #36393F; --badge-neutro-fg:  #B9BBBE;

    --sombra:       0 1px 2px rgba(0,0,0,.4);
    --sombra-md:    0 4px 12px rgba(0,0,0,.5);
    --sombra-lg:    0 20px 40px -12px rgba(0,0,0,.6);
    --sombra-orange:0 10px 30px color-mix(in srgb, var(--primary) 30%, transparent);

    /* Esquema de cor nativo do browser — afeta scrollbar, form controls
       nativos e color-scheme em outras integrações (PDF preview etc). */
    color-scheme: dark;
}

/* Transição suave ao trocar de tema. Não aplica em element-level pra evitar
   chuva de animações; só nas raízes que geralmente mudam. */
html, body, .card, .modal-content, .topbar, .sidebar, .conteudo {
    transition: background-color .2s ease, color .2s ease, border-color .2s ease;
}

/* ===== Dark mode overrides — vencem regras com !important ou alta especificidade ===== */
:root[data-theme="dark"] .sidebar-header,
:root[data-theme="dark"] .sidebar.colapsada .sidebar-header {
    background: var(--bg-card) !important;
    border-bottom-color: var(--borda) !important;
}
:root[data-theme="dark"] .modal-content,
:root[data-theme="dark"] .dropdown,
:root[data-theme="dark"] .user-menu-popup,
:root[data-theme="dark"] .tooltip,
:root[data-theme="dark"] .toast {
    background: var(--bg-card) !important;
    color: var(--texto) !important;
    border-color: var(--borda) !important;
}
/* .modal-dialog é o wrapper externo retangular SEM border-radius — não
   pode receber background, senão aparece uma "caixa" atrás do .modal-content
   arredondado (12px). Garantimos transparência aqui pra evitar regressão. */
:root[data-theme="dark"] .modal-dialog { background: transparent !important; }
:root[data-theme="dark"] .modal-overlay {
    background: var(--overlay) !important;
}
/* Tabelas: row hover em vez de bg-elevado claro */
:root[data-theme="dark"] .tabela tbody tr:hover,
:root[data-theme="dark"] tr.adm-item:hover td,
:root[data-theme="dark"] .table-row:hover {
    background: var(--bg-elevado) !important;
}
:root[data-theme="dark"] .tabela thead th,
:root[data-theme="dark"] thead th {
    background: var(--bg-elevado) !important;
    color: var(--texto-fraco) !important;
}
/* SweetAlert2 — confirmações/diálogos SEMPRE acima dos modais e drawers do app.
   Default do SweetAlert é z-index:1060, que fica ATRÁS do drawer de tarefas
   (1201), dos modais (1000) e do menu de variáveis (1200) — a confirmação
   "Cancelar esta tarefa?" aparecia por trás do overlay do drawer. Subimos pra
   um patamar dedicado, ainda abaixo do loading-overlay (99999) e do tour (100000+),
   pra que o "Carregando" continue cobrindo tudo. NÃO mexe no toast (canto da tela). */
.swal2-container:not(.swal2-toast-shown) { z-index: 10600 !important; }

/* SweetAlert2 — popup em dark */
:root[data-theme="dark"] .swal2-popup {
    background: var(--bg-card) !important;
    color: var(--texto) !important;
}
:root[data-theme="dark"] .swal2-title,
:root[data-theme="dark"] .swal2-html-container { color: var(--texto) !important; }

/* TOAST (canto da tela) — em AMBOS os temas: fundo de card sólido + texto forte.
   O default do SweetAlert pintava o título numa cor clara que somava com o fundo
   tingido (rosa no warning/erro) e ficava ilegível. Forçamos contraste real e
   damos a "cor" do toast por uma barra à esquerda. */
.swal2-toast {
    background: var(--bg-card) !important;
    color: var(--texto) !important;
    box-shadow: 0 4px 16px rgba(0,0,0,.18) !important;
    border: 1px solid var(--borda) !important;
}
.swal2-toast .swal2-title,
.swal2-toast .swal2-html-container { color: var(--texto) !important; }
.swal2-toast.swal2-icon-error   { border-left: 4px solid #dc2626 !important; }
.swal2-toast.swal2-icon-warning { border-left: 4px solid #d97706 !important; }
.swal2-toast.swal2-icon-success { border-left: 4px solid #16a34a !important; }
.swal2-toast.swal2-icon-info    { border-left: 4px solid #2563eb !important; }

:root[data-theme="dark"] .swal2-input,
:root[data-theme="dark"] .swal2-select,
:root[data-theme="dark"] .swal2-textarea {
    background: var(--input-bg) !important;
    color: var(--texto) !important;
    border-color: var(--input-borda) !important;
}

html, body {
    margin: 0;
    padding: 0;
    font-family: var(--font-body);
    color: var(--texto);
    background: var(--bg);
    -webkit-font-smoothing: antialiased;
}

/* Sem sublinhado em links — nem no estado normal, nem no hover/focus.
   O destaque visual fica por conta de cor/peso, não de underline.
   (Padrão antigo "a:hover {text-decoration: underline}" foi removido.) */
a, a:hover, a:focus, a:active, a:visited {
    color: var(--primary);
    text-decoration: none;
}

/* Botões e elementos que fazem papel de botão NUNCA devem ter sublinhado,
   mesmo se forem <a>. Cobre todos os estados pra evitar que regras locais
   herdadas adicionem underline acidental. */
button,
.btn,
.btn-card,
.btn-acao,
.btn-icone,
a.btn, a.btn-card, a.btn-acao, a.btn-icone,
button:hover, button:focus, button:active,
.btn:hover, .btn:focus, .btn:active,
.btn-card:hover, .btn-card:focus, .btn-card:active,
.btn-acao:hover, .btn-acao:focus, .btn-acao:active,
.btn-icone:hover, .btn-icone:focus, .btn-icone:active {
    text-decoration: none !important;
}

/* ----- Headlines em Space Grotesk (display) ----- */
h1, h2, h3 {
    font-family: var(--font-display);
    color: var(--texto);
    line-height: 1.15;
    letter-spacing: -0.02em;
    margin: 0 0 .35rem;
}
h1 { font-weight: 700; font-size: 1.75rem; }
h2 { font-weight: 700; font-size: 1.4rem; }
h3 { font-weight: 600; font-size: 1.15rem; }

/* ----- Botões — alinhado ao design system (ink primary, shadow-orange) ----- */
.btn {
    display: inline-flex;
    align-items: center;
    gap: .5rem;
    padding: .65rem 1.1rem;
    border: 1px solid var(--borda);
    border-radius: var(--raio);
    background: var(--bg-card);
    color: var(--texto);
    font-size: .9rem;
    font-weight: 600;
    cursor: pointer;
    transition: background .15s ease, border-color .15s ease, transform .15s ease, box-shadow .15s ease;
    box-shadow: var(--sombra);
}
.btn:hover {
    background: var(--bg);
    border-color: var(--borda-forte);
    /* Salvaguarda: pareia o fundo claro do hover com texto escuro. Sem isso,
       botão colorido (texto branco) que NÃO tem :hover próprio cai aqui, troca
       só o fundo p/ claro e fica branco-no-branco (ilegível). Variantes
       coloridas definem o próprio :hover depois e vencem esta regra. */
    color: var(--texto);
    transform: translateY(-1px);
}
.btn:active { transform: translateY(0); }
.btn:disabled { opacity: .6; cursor: not-allowed; transform: none; }
/* `.btn { display:inline-flex }` vence o [hidden] do user-agent (mesma
   especificidade, autor ganha por ordem) → o atributo `hidden` no botão era
   ignorado e ele ficava sempre visível. Força esconder quando hidden. */
.btn[hidden] { display: none !important; }

.btn-primary,
a.btn-primary,
a.btn-primary:hover,
a.btn-primary:focus,
a.btn-primary:visited {
    background: var(--primary);
    color: #fff;
    border-color: var(--primary);
    box-shadow: var(--sombra-orange);
}
.btn-primary:hover,
a.btn-primary:hover {
    background: var(--primary-hover);
    border-color: var(--primary-hover);
    color: #fff; /* garante texto branco no hover, mesmo quando o <a> tem regra global de color */
}

.btn-secondary,
a.btn-secondary,
a.btn-secondary:hover,
a.btn-secondary:focus,
a.btn-secondary:visited {
    background: var(--bg-card); color: var(--texto); border-color: var(--borda);
}
.btn-secondary:hover,
a.btn-secondary:hover { background: var(--bg); border-color: var(--borda-forte); color: var(--texto); }

.btn-ghost { background: transparent; border-color: transparent; box-shadow: none; color: var(--texto-fraco); }
.btn-ghost:hover { background: rgba(255, 107, 44, .08); border-color: var(--cor-primaria); color: var(--cor-primaria); }

.btn-danger,
a.btn-danger,
a.btn-danger:hover,
a.btn-danger:focus,
a.btn-danger:visited {
    background: var(--erro); color: #fff; border-color: var(--erro);
}
.btn-danger:hover,
a.btn-danger:hover { background: #dc2626; color: #fff; }

.btn-success,
a.btn-success,
a.btn-success:hover,
a.btn-success:focus,
a.btn-success:visited {
    background: var(--sucesso); color: #fff; border-color: var(--sucesso);
}
/* Hover próprio — escurece o verde e mantém texto branco. Sem ele, o botão
   caía no `.btn:hover` (fundo claro) e ficava ilegível. */
.btn-success:hover,
a.btn-success:hover,
.btn-success:focus,
a.btn-success:focus {
    background: #0E9F70; border-color: #0E9F70; color: #fff;
}
.btn-bloco { width: 100%; justify-content: center; }
.btn-icone { background: transparent; border: 0; color: var(--texto); padding: .5rem; border-radius: 50%; }
.btn-icone:hover { background: #e5e7eb; }

/* ----- Formulários ----- */
.form-group { margin-bottom: .7rem; }   /* v1.1.29 — era 1rem, ficava espaçoso demais */

/* v1.1.56 — Utility: checkbox/radio inline com label.
   Resolve o padrão antigo em que checkbox vinha com width:100% herdado do
   .form-group input. Use:
     <label class="check-inline">
       <input type="checkbox" name="..."> <span>Texto do toggle</span>
     </label> */
.check-inline {
    display: inline-flex; align-items: center; gap: .6rem;
    cursor: pointer; font-weight: 500; font-size: .9rem;
    margin: 0; user-select: none;
    line-height: 1.4;
}
/* `.form-group .check-inline` (0,2,0) vence o `.form-group label{display:block}`
   (0,1,1) — sem isso o label de checkbox vira bloco, o `gap` morre e o texto
   gruda no check. Restaura o inline-flex aqui p/ TODO .check-inline em form. */
.form-group .check-inline { margin-top: .15rem; display: inline-flex; align-items: center; gap: .6rem; width: auto; }
.check-inline input[type="checkbox"],
.check-inline input[type="radio"] {
    width: 18px !important; height: 18px !important;
    min-width: 18px; min-height: 18px;
    margin: 0; padding: 0; flex-shrink: 0; cursor: pointer;
    accent-color: var(--primary);
    line-height: 1; vertical-align: middle;
}
.check-inline span { line-height: 1.4; }

/* Contador de caracteres (window.CharCounter — char-counter.js).
   Renderizado automaticamente abaixo de [maxlength][data-counter]. */
.char-counter {
    display: block;
    margin-top: .2rem;
    font-size: .72rem;
    color: var(--texto-fraco);
    text-align: right;
    font-variant-numeric: tabular-nums;
    line-height: 1.2;
}
.char-counter-alerta { color: #b45309; }
.char-counter-cheio  { color: #b91c1c; font-weight: 600; }
[data-theme="dark"] .char-counter-alerta { color: #fbbf24; }
[data-theme="dark"] .char-counter-cheio  { color: #fca5a5; }

/* Dica de campo (<small>/.field-hint) hugando o input acima. Sem isso o
   respiro vertical do modal afastava a dica do controle e ela parecia solta —
   pior ainda quando há char-counter no meio (a dica caía longe da linha
   "0/150"). Mantém a dica colada e, quando vem depois do contador, sobe pra
   mesma linha visual. */
.modal-body .form-group small,
.modal-body .form-group .field-hint {
    display: block;
    margin-top: .25rem;
    line-height: 1.3;
}
/* Quando a dica vem logo após o contador de caracteres, encosta as duas. */
.modal-body .form-group .char-counter + small,
.modal-body .form-group .char-counter + .field-hint {
    margin-top: 0;
}

/* v1.1.xx — Modal "Novo condomínio": Nome e Status empilhados na coluna
   esquerda, Slug (+ dica) na direita. A coluna com a dica cresce mais, então
   deixamos as células alinharem ao topo — o Status sobe e cola no Nome, sem o
   vão que aparecia quando ele era um bloco solto abaixo da linha inteira.
   Os .form-group internos não repetem a margem inferior do padrão do modal. */
#formTenant .form-row.row-identificacao { align-items: start; }
#formTenant .form-row.row-identificacao .form-col { min-width: 0; }
#formTenant .form-row.row-identificacao .form-col > .form-group:last-child {
    margin-bottom: 0;
}

/* v1.1.56 — Color picker nativo. Sem isso, fica esticado feio. */
.form-group input[type="color"] {
    width: 56px !important; height: 36px; padding: 2px;
    cursor: pointer; vertical-align: middle;
}
.form-row { display: grid; grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); gap: .75rem; }
/* Modal-body usa form-group dentro — mantém um respiro extra na última */
.modal-body .form-group:last-of-type { margin-bottom: .3rem; }

/* ── Respiro vertical em TODOS os modais ──────────────────────────────
   O padrão .form-group (.7rem) + label (.35rem) deixava os campos colados
   uns nos outros e o label grudado no input. Em modal damos mais ar:
   afasta cada campo do seguinte, o label do seu controle, e os títulos de
   seção dos campos vizinhos. Escopo .modal-body pra não inchar forms densos
   fora de modal (filtros inline, fluxo público, editores). */
.modal-body .form-group { margin-bottom: 1.15rem; }
.modal-body .form-group > label { margin-bottom: .5rem; }
/* align-items:start — sem isto, o grid estica todas as colunas à altura da
   mais alta (ex.: a coluna com form-hint de 3 linhas), criando um vão grande
   abaixo dos campos curtos ao lado. Alinhar ao topo mantém os inputs na mesma
   linha e o campo seguinte logo abaixo, sem espaço morto. */
.modal-body .form-row { gap: 1rem 1.1rem; margin-bottom: 1.15rem; align-items: start; }
.modal-body .form-section-title { margin-top: 2rem; margin-bottom: 1.1rem; }

/* REGRA GLOBAL: nenhum modal pode ter scroll horizontal. O corpo rola só na
   vertical; qualquer conteúdo largo (tabela, código) deve rolar dentro do
   próprio wrapper com overflow-x:auto, nunca o modal inteiro. box-sizing em
   todos os campos evita padding/borda estourando a largura da coluna. */
.modal-body { overflow-x: hidden; }
.modal-body input, .modal-body select, .modal-body textarea { max-width: 100%; box-sizing: border-box; }
.modal-body .form-row > .form-group { min-width: 0; }

/* ── Cabeçalho de SEÇÃO do formulário (Identificação / Contato / Endereço...) ──
   Antes era um <h4> solto sem estilo: o form parecia uma pilha de campos sem
   divisão. Agora cada seção vira um bloco visual claro — separador no topo,
   título em destaque com ícone de acento e respiro generoso entre grupos. */
.form-section-title {
    display: flex; align-items: center; gap: .5rem;
    margin: 1.6rem 0 .9rem; padding-top: 1rem;
    border-top: 1px solid var(--borda);
    font-size: .8rem; font-weight: 700; letter-spacing: .04em; text-transform: uppercase;
    color: var(--texto-medio);
}
.form-section-title i { color: var(--primary); font-size: .95rem; }
/* A 1ª seção do modal não precisa de separador/empurrão no topo. */
.modal-body > .form-section-title:first-child,
.modal-body form > .form-section-title:first-child { margin-top: .2rem; padding-top: 0; border-top: none; }

/* Modal de terminal (devices): a seção "Identidade" (só-edição) fica com
   display:none ANTES do 1º título visível ("Identificação"), então o
   :first-child acima não pega — o título herdava margin/borda de topo e abria
   um vão vazio no topo do modal ao CRIAR um novo terminal. Aqui zeramos o topo
   do 1º título de seção que aparece logo após o bloco oculto de identidade.
   Escopo restrito a #modalDevice pra não afetar modais cujo 1º section-title é
   uma seção do meio do form (ex.: "Senha" em #modalUsuario). */
#modalDevice #deviceIdentidade[style*="display:none"] + .form-section-title,
#modalDevice #deviceIdentidade[style*="display: none"] + .form-section-title { margin-top: .2rem; padding-top: 0; border-top: none; }

/* v1.1.29 — variante: 1 campo grande + 2 campos pequenos (host/porta/segurança).
   Em mobile colapsa pra 1 coluna. */
.form-row.row-host { grid-template-columns: 1fr 110px 140px; }
@media (max-width: 540px) {
    .form-row.row-host { grid-template-columns: 1fr; }
}
.form-group label {
    display: block;
    margin-bottom: .35rem;
    font-size: .85rem;
    font-weight: 600;
    color: var(--texto);
}
/* v1.1.56 — Estilo unificado de inputs/selects/textareas.
   Aplica em .form-group input/select/textarea (forms tradicionais) E em
   inputs "naked" dentro de .modal-body (caixas de busca, etc). Sem isso,
   inputs fora de .form-group ficavam com aparência crua de browser default. */
.form-group input:not([type="checkbox"]):not([type="radio"]):not([type="range"]):not([type="color"]):not(.no-polish),
.form-group select, .form-group textarea,
.modal-body input[type="text"]:not(.no-polish):not([type="color"]),
.modal-body input[type="email"]:not(.no-polish),
.modal-body input[type="tel"]:not(.no-polish),
.modal-body input[type="number"]:not(.no-polish),
.modal-body input[type="search"]:not(.no-polish),
.modal-body input[type="url"]:not(.no-polish),
.modal-body input[type="password"]:not(.no-polish),
.modal-body input[type="date"]:not(.no-polish),
.modal-body input[type="time"]:not(.no-polish),
.modal-body input[type="datetime-local"]:not(.no-polish),
.modal-body select:not(.no-polish),
.modal-body textarea:not(.no-polish) {
    width: 100%;
    padding: .6rem .85rem;
    border: 1.5px solid var(--input-borda);
    border-radius: var(--raio);
    font-size: .92rem;
    font-family: inherit;
    background: var(--input-bg);
    color: var(--texto);
    transition: border-color .15s ease, box-shadow .15s ease, background .15s ease;
    min-height: 38px;
    box-shadow: inset 0 1px 1px rgba(0,0,0,.02);
}
.form-group input:hover:not([type="checkbox"]):not([type="radio"]):not([type="range"]):not([type="color"]), .form-group select:hover, .form-group textarea:hover,
.modal-body input:hover:not(.no-polish):not([type="color"]):not([type="checkbox"]):not([type="radio"]):not([type="range"]),
.modal-body select:hover:not(.no-polish),
.modal-body textarea:hover:not(.no-polish) {
    border-color: var(--borda-forte);
}
.form-group input::placeholder, .form-group textarea::placeholder,
.modal-body input::placeholder, .modal-body textarea::placeholder {
    color: var(--texto-disabled); font-weight: 400;
}
.form-group input:focus:not([type="checkbox"]):not([type="radio"]):not([type="range"]):not([type="color"]), .form-group select:focus, .form-group textarea:focus,
.modal-body input:focus:not(.no-polish):not([type="color"]):not([type="checkbox"]):not([type="radio"]):not([type="range"]),
.modal-body select:focus:not(.no-polish),
.modal-body textarea:focus:not(.no-polish) {
    outline: none;
    border-color: var(--primary);
    box-shadow: 0 0 0 3px var(--primary-soft);
    background: var(--input-bg);
}
.form-group input:disabled, .form-group select:disabled, .form-group textarea:disabled {
    background: var(--bg-disabled); color: var(--texto-disabled); cursor: not-allowed;
}
/* select com seta customizada (visual mais limpo que a default do browser) */
.form-group select, .modal-body select:not(.no-polish) {
    -webkit-appearance: none; appearance: none;
    background-image: url("data:image/svg+xml;charset=UTF-8,%3csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 24 24' fill='none' stroke='%2364748b' stroke-width='2'%3e%3cpath d='M6 9l6 6 6-6'/%3e%3c/svg%3e");
    background-repeat: no-repeat;
    background-position: right .75rem center;
    padding-right: 2.25rem;
}
.form-group textarea, .modal-body textarea:not(.no-polish) { min-height: 80px; resize: vertical; }
.form-group small { color: var(--texto-fraco); font-size: .75rem; }

/* v1.2.x — `.form-control` (input/select/textarea) usado em toolbars/filtros
   FORA de .form-group/.modal-body (ex.: header de Tarefas, filtros de Tags)
   ficava cru com a aparência default do browser. Reaplica o mesmo polish
   unificado aqui. `.no-polish` continua opt-out (ex.: inputs de hora estimada). */
select.form-control:not(.no-polish),
input.form-control:not(.no-polish):not([type="checkbox"]):not([type="radio"]):not([type="range"]):not([type="color"]),
textarea.form-control:not(.no-polish) {
    width: 100%;
    padding: .6rem .85rem;
    border: 1.5px solid var(--input-borda);
    border-radius: var(--raio);
    font-size: .92rem;
    font-family: inherit;
    background: var(--input-bg);
    color: var(--texto);
    transition: border-color .15s ease, box-shadow .15s ease, background .15s ease;
    min-height: 38px;
    box-shadow: inset 0 1px 1px rgba(0,0,0,.02);
}
select.form-control:not(.no-polish):hover,
input.form-control:not(.no-polish):hover:not([type="checkbox"]):not([type="radio"]):not([type="range"]):not([type="color"]),
textarea.form-control:not(.no-polish):hover { border-color: var(--borda-forte); }
select.form-control:not(.no-polish):focus,
input.form-control:not(.no-polish):focus:not([type="checkbox"]):not([type="radio"]):not([type="range"]):not([type="color"]),
textarea.form-control:not(.no-polish):focus {
    outline: none;
    border-color: var(--primary);
    box-shadow: 0 0 0 3px var(--primary-soft);
    background: var(--input-bg);
}
select.form-control:disabled,
input.form-control:disabled,
textarea.form-control:disabled {
    background: var(--bg-disabled); color: var(--texto-disabled); cursor: not-allowed;
}
input.form-control::placeholder, textarea.form-control::placeholder { color: var(--texto-disabled); font-weight: 400; }
/* Seta customizada no select (igual aos selects de form-group). */
select.form-control:not(.no-polish) {
    -webkit-appearance: none; appearance: none;
    background-image: url("data:image/svg+xml;charset=UTF-8,%3csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 24 24' fill='none' stroke='%2364748b' stroke-width='2'%3e%3cpath d='M6 9l6 6 6-6'/%3e%3c/svg%3e");
    background-repeat: no-repeat;
    background-position: right .75rem center;
    padding-right: 2.25rem;
}
textarea.form-control:not(.no-polish) { min-height: 80px; resize: vertical; }
/* v1.1.56 — Checkbox/radio inline com label.
   - `align-items:center` no flex container deixa caixa e texto no mesmo eixo;
   - tamanho fixo 18px do checkbox (sem inflar pelo input global do form-group);
   - `accent-color` colore o "check" com a marca da empresa;
   - line-height:1 no input mantém a baseline da caixa estável. */
.form-check {
    display: flex; align-items: flex-start; gap: .6rem;   /* top-align: labels com descrição multi-linha não desalinham */
    margin: 0;
}
/* Respiro entre form-checks empilhados (antes ficavam grudados). */
.form-check + .form-check { margin-top: .7rem; }
/* Respiro quando um form-check vem logo após um bloco de permissões/funções/
   setores: sem isso o checkbox "Forçar redefinição de senha" ficava colado na
   matriz de permissões acima. */
.permissoes-bloco + .form-check,
.funcoes-bloco + .form-check,
.setores-bloco + .form-check { margin-top: 1.25rem; }
.form-check input[type="checkbox"],
.form-check input[type="radio"] {
    width: 18px !important; height: 18px;
    /* margin-top fino: alinha o checkbox ao topo do título quando o label
       tem descrição multi-linha (com align-items:flex-start no wrapper). */
    margin: .12rem 0 0; padding: 0; flex-shrink: 0;
    cursor: pointer; accent-color: var(--primary);
    line-height: 1;
}
.form-check label {
    margin: 0; font-weight: 500;
    cursor: pointer; line-height: 1.4;
    user-select: none;
}

.input-senha { position: relative; }
.btn-toggle-senha {
    position: absolute; right: 8px; top: 50%; transform: translateY(-50%);
    background: transparent; border: 0; cursor: pointer; color: var(--texto-fraco); padding: 4px;
}

/* ----- Login ----- */
/* Fundo da tela de login espelha o legado (painel-adm/login/styles.css):
   gradiente neutro suave + 3 círculos coloridos com blur que flutuam
   atrás do card. */
body:has(.login-container) {
    background: linear-gradient(145deg, var(--bg) 0%, var(--bg-card) 100%);
    min-height: 100vh;
    position: relative;
    overflow-x: hidden;
}

.login-container {
    min-height: 100vh;
    display: flex; align-items: center; justify-content: center;
    padding: 1rem;
    position: relative;
    z-index: 1;
}
.login-card {
    width: 100%; max-width: 420px;
    background: color-mix(in srgb, var(--bg-card) 92%, transparent);
    backdrop-filter: blur(8px); -webkit-backdrop-filter: blur(8px);
    padding: 2.5rem 2rem;
    border-radius: 20px;
    box-shadow:
        0 30px 50px -20px rgba(0, 0, 0, .25),
        0 8px 16px -8px rgba(0, 0, 0, .08);
    animation: sv-login-card-appear .55s ease;
    position: relative; z-index: 1;
}
@keyframes sv-login-card-appear {
    from { opacity: 0; transform: translateY(12px); }
    to   { opacity: 1; transform: translateY(0); }
}
.login-logo { text-align: center; margin-bottom: 1.75rem; }
.login-logo i { font-size: 2.25rem; color: var(--cor-primaria); margin-bottom: .5rem; }
.login-logo h1 { margin: .25rem 0 0; font-size: 1.25rem; color: var(--texto); }
.login-footer { margin-top: 1.5rem; text-align: center; color: var(--texto-fraco); }

/* Link "voltar para o início" no canto superior esquerdo da tela de login. */
.login-back-home {
    position: fixed;
    top: 1.25rem;
    left: 1.25rem;
    z-index: 2;
    display: inline-flex;
    align-items: center;
    gap: .5rem;
    padding: .5rem .9rem;
    border-radius: 999px;
    background: rgba(255, 255, 255, .85);
    backdrop-filter: blur(8px); -webkit-backdrop-filter: blur(8px);
    border: 1px solid var(--borda);
    color: var(--texto-medio);
    font-size: .88rem;
    font-weight: 500;
    text-decoration: none;
    box-shadow: var(--sombra);
    transition: all .15s;
}
.login-back-home:visited { color: var(--texto-medio); }
.login-back-home:hover,
.login-back-home:focus {
    background: var(--bg-card);
    color: var(--texto);
    border-color: var(--borda-forte);
    box-shadow: var(--sombra-md);
    transform: translateX(-2px);
    text-decoration: none;
}
.login-back-home:hover i { transform: translateX(-2px); }
.login-back-home i { transition: transform .15s; }
.login-back-home i { font-size: .85rem; }
@media (max-width: 480px) {
    .login-back-home span { display: none; }
    .login-back-home { padding: .55rem .7rem; }
}

/* Decoração de fundo: 3 blobs flutuantes (espelha .login-decoration do legado) */
.login-decoration {
    position: fixed; inset: 0;
    pointer-events: none;
    z-index: 0;
    overflow: hidden;
}
.decoration-shape {
    position: absolute;
    border-radius: 50%;
    filter: blur(60px);
    opacity: .3;
    animation: sv-login-float 20s infinite ease-in-out;
}
.decoration-shape.shape-1 {
    top: -10%; right: -5%;
    width: 400px; height: 400px;
    background: var(--cor-primaria);
    animation-delay: 0s;
}
.decoration-shape.shape-2 {
    bottom: -10%; left: -5%;
    width: 350px; height: 350px;
    background: #0057B8;
    animation-delay: -5s;
}
.decoration-shape.shape-3 {
    top: 40%; left: 50%;
    transform: translateX(-50%);
    width: 300px; height: 300px;
    background: #ff8c3f;
    opacity: .2;
    animation-delay: -10s;
}
@keyframes sv-login-float {
    0%, 100% { transform: translate(0, 0) scale(1); }
    33%      { transform: translate(2%, 2%) scale(1.1); }
    66%      { transform: translate(-2%, -2%) scale(.9); }
}
@media (max-width: 768px) {
    .decoration-shape { filter: blur(40px); }
    .decoration-shape.shape-1 { width: 250px; height: 250px; }
    .decoration-shape.shape-2 { width: 220px; height: 220px; }
    .decoration-shape.shape-3 { width: 200px; height: 200px; }
}
@media (prefers-reduced-motion: reduce) {
    .decoration-shape { animation: none; }
    .login-card { animation: none; }
}

/* ----- Dashboard layout ----- */
/* Quando o layout dashboard estiver presente, o body NÃO rola — quem rola é a área de conteúdo */
body:has(.layout-dashboard) { overflow: hidden; }

.layout-dashboard {
    display: flex;
    height: 100vh;             /* fixo na viewport */
    overflow: hidden;
}

.sidebar {
    width: 240px; background: var(--bg-card); color: var(--texto);
    display: flex; flex-direction: column;
    transition: width .2s;
    height: 100vh;
    flex-shrink: 0;            /* nunca encolhe */
    overflow: hidden;          /* scroll é interno na sidebar-nav */
    border-right: 1px solid var(--borda);
}
.sidebar.colapsada { width: 60px; }
.sidebar.colapsada .sidebar-app-name,
.sidebar.colapsada .sidebar-nav a span { display: none; }
/* No modo colapsado a busca não cabe — esconde inteira. */
.sidebar.colapsada .sidebar-busca { display: none; }

/* Busca do menu lateral. */
.sidebar-busca { position: relative; padding: .6rem .75rem .35rem; flex-shrink: 0; }
.sidebar-busca-icone {
    position: absolute; left: 1.35rem; top: 50%; transform: translateY(-50%);
    color: var(--texto-fraco); font-size: .8rem; pointer-events: none;
}
.sidebar-busca-input {
    width: 100%; padding: .45rem .6rem .45rem 1.9rem;
    background: var(--bg-elevado); border: 1px solid var(--borda); border-radius: 8px;
    color: var(--texto); font-size: .82rem; outline: none;
    transition: border-color .15s, box-shadow .15s, background-color .15s;
}
.sidebar-busca-input::placeholder { color: var(--texto-fraco); }
.sidebar-busca-input:hover { border-color: var(--borda-forte, var(--borda)); }
.sidebar-busca-input:focus {
    border-color: var(--primary); background: var(--bg-card);
    box-shadow: 0 0 0 3px color-mix(in srgb, var(--primary) 16%, transparent);
}
.sidebar-busca-limpar {
    position: absolute; right: 1.1rem; top: 50%; transform: translateY(-50%);
    background: none; border: 0; cursor: pointer; color: var(--texto-fraco);
    font-size: .85rem; line-height: 1; padding: .25rem; border-radius: 6px;
}
.sidebar-busca-limpar:hover { background: var(--bg-hover); color: var(--texto); }
.sidebar-busca-limpar[hidden] { display: none; }
/* Itens/seções fora do filtro de busca do menu. */
.sidebar-nav a.is-menu-oculto,
.sidebar-nav .menu-secao.is-menu-oculto { display: none; }
.sidebar-busca-vazio {
    padding: 1rem .9rem; color: var(--texto-fraco); font-size: .82rem; text-align: center;
}
.sidebar-busca-vazio[hidden] { display: none; }

.sidebar-header { padding: 1rem; display: flex; align-items: center; gap: .75rem; border-bottom: 1px solid var(--borda); flex-shrink: 0; }
.sidebar-header i { font-size: 1.25rem; color: var(--primary); }
.sidebar-app-name { font-weight: 700; }

.sidebar-nav {
    flex: 1; padding: .75rem 0;
    overflow-y: auto;
    min-height: 0;             /* libera scroll dentro do flex */
    scrollbar-width: thin;
    scrollbar-color: #cbd5e1 transparent;
}
.sidebar-nav::-webkit-scrollbar { width: 6px; }
.sidebar-nav::-webkit-scrollbar-thumb { background: var(--borda-forte); border-radius: 3px; }
.sidebar-nav a {
    display: flex; align-items: center; gap: .75rem;
    padding: .6rem 1rem; color: var(--texto-medio); text-decoration: none;
    border-left: 3px solid transparent;
    font-size: .92rem;
}
.sidebar-nav a:hover { background: var(--bg-hover); color: var(--texto); text-decoration: none; }
.sidebar-nav a.ativo {
    background: var(--primary-soft);
    color: var(--primary);
    border-left-color: var(--primary);
    font-weight: 600;
}
.sidebar-nav a.ativo i { color: var(--primary); }
.sidebar-nav i { width: 18px; text-align: center; color: var(--texto-fraco); }

/* Separadores de seção (visíveis quando o sidebar está expandido) */
.menu-secao {
    padding: .9rem 1rem .3rem;
    color: var(--texto-fraco);
    font-size: .68rem;
    font-weight: 700;
    text-transform: uppercase;
    letter-spacing: .06em;
}
.menu-secao span {
    display: block;
    padding-bottom: .25rem;
}
/* Cabeçalho de seção CLICÁVEL (grupo recolhível): vira um botão full-width com
   o chevron à direita. Mantém a aparência de label (uppercase, cinza). */
.menu-secao-toggle {
    display: flex; align-items: center; justify-content: space-between;
    width: 100%; background: transparent; border: 0; cursor: pointer;
    color: inherit; font: inherit; text-transform: inherit; letter-spacing: inherit;
    text-align: left;
    padding: .9rem 1rem .3rem;
    border-radius: 8px;
    transition: color .15s;
}
.menu-grupo .menu-secao-toggle { padding: .9rem 1rem .3rem; }   /* o padding do header vai no botão */
.menu-grupo > .menu-secao-toggle { padding-top: .9rem; }
.menu-secao-toggle span { padding-bottom: 0; }
.menu-secao-toggle:hover { color: var(--texto); }
.menu-secao-chevron {
    font-size: .6rem; opacity: .55; transition: transform .2s ease;
    flex-shrink: 0; margin-left: .5rem;
}
.menu-grupo.is-colapsado .menu-secao-chevron { transform: rotate(-90deg); }
/* Wrapper dos itens do grupo — anima a altura ao recolher. */
.menu-grupo-itens {
    overflow: hidden;
    transition: max-height .22s ease, opacity .18s ease;
    max-height: 1500px; opacity: 1;
}
.menu-grupo.is-colapsado .menu-grupo-itens { max-height: 0; opacity: 0; }
/* Durante a busca, o grupo abre mesmo se colapsado (mostra os resultados). */
.menu-grupo.is-busca-aberto .menu-grupo-itens { max-height: 1500px; opacity: 1; }
.menu-grupo.is-busca-aberto .menu-secao-chevron { transform: none; }
.menu-grupo.is-menu-oculto { display: none; }

.sidebar.colapsada .menu-secao { padding: .35rem 0; }
/* No modo colapsado (sidebar fina) não há colapso de grupo — esconde chevron e
   os itens ficam sempre visíveis (a sidebar fina já é o "resumo"). */
.sidebar.colapsada .menu-secao-chevron { display: none; }
.sidebar.colapsada .menu-grupo.is-colapsado .menu-grupo-itens { max-height: 1500px; opacity: 1; }
.sidebar.colapsada .menu-secao-toggle { padding: .35rem 0; justify-content: center; }
.sidebar.colapsada .menu-secao span {
    width: 24px; margin: 0 auto;
    border-bottom: 1px solid var(--borda);
    overflow: hidden; text-indent: -9999px;
}
/* ===== Logo dinâmica (sidebar + login) ===== */
/* Logo do Entrega Jah! no header do painel (sidebar / topnav) e no login.
   Não há mais logo por empresa — só a COR primária é configurável.
   O wordmark "pipe" NÃO pode herdar a cor primária da empresa nem o --texto
   do tema: usa --entregajah-wordmark (navy de marca fixo), que só clareia no tema
   escuro pra continuar legível sobre fundo escuro. */
.entregajah-logo { display: block; height: 30px; width: auto; --entregajah-wordmark: #101522; }
:root[data-theme="dark"] .entregajah-logo { --entregajah-wordmark: #ECEDEE; }
.sidebar-brand,
.topnav-brand { display: inline-flex; align-items: center; color: var(--texto); }
.sidebar-brand { text-decoration: none; }
.sidebar-brand:hover,
.topnav-brand:hover { opacity: .85; }
.sidebar-header .entregajah-logo { height: 32px; }

/* Legado: qualquer marcador residual de logo por empresa fica oculto. */
.sv-logo-com,
.sv-logo-sem,
.sv-logo-img { display: none !important; }

/* Sidebar: garante que a logo respira no header */
.sidebar-header { justify-content: center; align-items: center; }

/* Quando sidebar colapsada (desktop): topbar atravessa por cima dos 60px
   da sidebar (vira header full-width), e a sidebar desce pra começar abaixo
   do topbar. Sidebar fica só com os ícones de navegação ao lado. */
.sidebar.colapsada .sidebar-header { display: none; }
.sidebar.colapsada .sidebar-header::before { content: none !important; }

@media (min-width: 769px) {
    .layout-dashboard:has(.sidebar.colapsada) .topbar {
        position: fixed;
        top: 0;
        left: 0;
        right: 0;
        z-index: 10;
    }
    .layout-dashboard:has(.sidebar.colapsada) .sidebar.colapsada {
        margin-top: 56px;
        height: calc(100vh - 56px);
    }
    .layout-dashboard:has(.sidebar.colapsada) .conteudo {
        padding-top: calc(1.5rem + 56px);
    }
}

/* Login: logo Entrega Jah! grande e centralizada */
.login-logo { display: flex; justify-content: center; }
.login-logo .entregajah-logo { height: 52px; width: auto; color: var(--texto, #101522); }

/* sidebar-footer (avatar + sair) foi removido — migrou para popup do topbar */

.main-content {
    flex: 1;
    display: flex; flex-direction: column;
    min-width: 0;
    height: 100vh;
    overflow: hidden;          /* scroll fica no .conteudo */
}

.topbar {
    background: var(--bg-card); border-bottom: 1px solid var(--borda);
    padding: .75rem 1rem;
    display: flex; align-items: center; gap: 1rem;
    box-shadow: var(--sombra);
    flex-shrink: 0;
    /* z-index alto: a topbar cria um stacking context; sem isto, painéis do
       conteúdo (ex.: "Flow issues" do editor) ficavam ACIMA do menu do usuário.
       Fica ABAIXO dos modais (.modal = 1000) mas ACIMA do conteúdo/editor. */
    position: sticky; top: 0; z-index: 100;
}
.topbar-title { margin: 0; font-size: 1rem; font-weight: 600; }
.topbar-actions { margin-left: auto; display: flex; gap: .25rem; align-items: center; }

/* ===== Assumir empresa (impersonação) — chip/badge/dropdown no topbar ===== */
.imp-empresa { position: relative; display: inline-flex; align-items: center; margin-right: .35rem; }
.imp-empresa[hidden] { display: none !important; }
.imp-chip, .imp-badge { display: inline-flex; align-items: center; gap: .4rem; font-size: .82rem; }
.imp-chip[hidden], .imp-badge[hidden], .imp-dropdown[hidden] { display: none !important; }
/* Chip da Gerência */
.imp-chip {
    background: var(--bg-card); border: 1px solid var(--borda); color: var(--texto);
    padding: .38rem .7rem; border-radius: 8px; cursor: pointer;
    transition: border-color .12s, background .12s;
}
.imp-chip:hover { border-color: var(--primary); background: var(--primary-soft); }
.imp-chip-chevron { font-size: .65rem; color: var(--texto-fraco); }
/* Badge de sessão assumida (alerta) */
.imp-badge {
    background: #fff4ee; border: 1px solid #ffd5bf; color: #9a3412;
    padding: .3rem .35rem .3rem .6rem; border-radius: 999px;
}
.imp-badge i { color: var(--primary); }
.imp-voltar {
    background: var(--primary); border: none; color: #fff; cursor: pointer;
    font-size: .74rem; font-weight: 600; padding: .22rem .6rem; border-radius: 999px; margin-left: .35rem;
}
.imp-voltar:hover { filter: brightness(1.06); color: #fff; }
/* Dropdown com busca */
.imp-dropdown {
    position: absolute; top: calc(100% + 6px); right: 0; z-index: 1200;
    width: 300px; max-width: 86vw; background: var(--bg-card);
    border: 1px solid var(--borda); border-radius: 12px; box-shadow: var(--sombra-lg);
    overflow: hidden;
}
.imp-dropdown-busca { position: relative; padding: .6rem; border-bottom: 1px solid var(--borda); }
.imp-dropdown-busca i { position: absolute; left: 1.1rem; top: 50%; transform: translateY(-50%); color: var(--texto-fraco); font-size: .85rem; pointer-events: none; }
.imp-dropdown-busca input {
    width: 100%; padding: .5rem .6rem .5rem 2rem; border: 1px solid var(--input-borda);
    border-radius: 8px; background: var(--input-bg); color: var(--texto); font-size: .85rem;
}
.imp-dropdown-busca input:focus { outline: none; border-color: var(--primary); box-shadow: 0 0 0 3px var(--primary-soft); }
/* Rola a lista quando há muitas empresas. min(...,50vh) garante que o dropdown
   nunca ultrapasse a tela em monitores baixos; overscroll-contain evita que o
   scroll "vaze" pra página ao chegar no fim. */
.imp-dropdown-lista { max-height: min(320px, 50vh); overflow-y: auto; overscroll-behavior: contain; padding: .3rem; }
.imp-lista-info { padding: 1rem; text-align: center; color: var(--texto-fraco); font-size: .82rem; }
.imp-item {
    display: flex; align-items: center; gap: .5rem; width: 100%; text-align: left;
    background: transparent; border: none; cursor: pointer; color: var(--texto);
    padding: .5rem .55rem; border-radius: 8px; font-size: .86rem;
}
.imp-item:hover { background: var(--bg-hover); }
.imp-item i { color: var(--texto-fraco); width: 16px; text-align: center; }
.imp-item span { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.imp-item small { color: var(--texto-fraco); font-size: .72rem; flex-shrink: 0; }

/* ===== Menu do usuário no topbar (avatar + popup) ===== */
.user-menu { position: relative; }
.user-menu-trigger {
    display: inline-flex; align-items: center; gap: .55rem;
    background: transparent; border: 1px solid transparent; border-radius: 999px;
    padding: .35rem .8rem .35rem .45rem;
    cursor: pointer; color: var(--texto);
    transition: all .15s;
}
.user-menu-trigger:hover { background: var(--bg-hover); border-color: var(--borda); }
.user-menu.aberto .user-menu-trigger {
    background: var(--bg-card); border-color: var(--cor-primaria);
    box-shadow: 0 0 0 3px rgba(255,107,0,.15);
}
.user-menu-trigger > i:first-child {
    font-size: 1.5rem; color: var(--cor-primaria);
}
.user-menu-trigger-avatar {
    width: 28px; height: 28px; border-radius: 50%;
    display: inline-flex; align-items: center; justify-content: center;
    background-size: cover; background-position: center;
    flex-shrink: 0; overflow: hidden;
}
.user-menu-trigger-avatar > i {
    font-size: 1.5rem; color: var(--cor-primaria); line-height: 1;
}
.user-menu-trigger-avatar.tem-foto {
    border: 1px solid var(--borda);
}
.user-menu-trigger-avatar.tem-foto > i { display: none; }
.user-menu-avatar.tem-foto {
    background-size: cover; background-position: center;
    background-color: #f4f6f9;
}
.user-menu-avatar.tem-foto > i { display: none; }
/* Iniciais (fallback quando o usuário ainda não fez upload de foto).
   Mostra "GA" / "AD" coloridos. Funciona pro mini-avatar do trigger e pro
   avatar grande do popup — texto é o data-attr `data-iniciais`. */
.user-menu-trigger-avatar.tem-iniciais > i,
.user-menu-avatar.tem-iniciais        > i { display: none; }
.user-menu-trigger-avatar.tem-iniciais::before,
.user-menu-avatar.tem-iniciais::before {
    content: attr(data-iniciais);
    color: #fff; font-weight: 700;
    line-height: 1; letter-spacing: .01em;
}
.user-menu-trigger-avatar.tem-iniciais::before { font-size: .72rem; }
.user-menu-avatar.tem-iniciais::before        { font-size: 1.1rem; }
.user-menu-nome {
    font-size: .9rem; font-weight: 600;
    max-width: 120px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.user-menu-chevron {
    font-size: .7rem; color: var(--texto-fraco);
    transition: transform .2s;
}
.user-menu.aberto .user-menu-chevron { transform: rotate(180deg); color: var(--cor-primaria); }

@media (max-width: 600px) { .user-menu-nome { display: none; } }

.user-menu-popup {
    position: absolute; top: calc(100% + 8px); right: 0;
    background: var(--bg-card); border: 1px solid var(--borda);
    border-radius: 12px; box-shadow: 0 12px 28px rgba(0,0,0,.12), 0 2px 6px rgba(0,0,0,.06);
    min-width: 240px; padding: .35rem;
    opacity: 0; visibility: hidden; transform: translateY(-4px);
    transition: opacity .15s, transform .15s;
    /* Acima dos painéis do editor/dropdowns flutuantes, mas abaixo dos modais
       (.modal = 1000), que devem cobrir tudo inclusive a topbar. */
    z-index: 999;
}
.user-menu.aberto .user-menu-popup { opacity: 1; visibility: visible; transform: translateY(0); }

.user-menu-cabecalho {
    display: flex; align-items: center; gap: .65rem;
    padding: .65rem .65rem .85rem;
    border-bottom: 1px solid var(--borda);
    margin-bottom: .35rem;
}
.user-menu-avatar {
    width: 40px; height: 40px; border-radius: 50%;
    background: rgba(255,107,0,.12); color: var(--cor-primaria);
    display: flex; align-items: center; justify-content: center;
    font-size: 1.2rem; flex-shrink: 0;
}
.user-menu-info { display: flex; flex-direction: column; min-width: 0; }
.user-menu-info strong { font-size: .9rem; color: var(--texto); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.user-menu-info small  { font-size: .75rem; color: var(--texto-fraco); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }

.user-menu-item {
    display: flex; align-items: center; gap: .65rem;
    width: 100%; padding: .55rem .75rem;
    background: transparent; border: 0; border-radius: 8px;
    color: var(--texto); font-size: .9rem;
    cursor: pointer; text-align: left;
    transition: background .12s;
}
/* Itens do menu do usuário são <a>/<button>: não devem herdar o laranja
   global de link. Texto neutro; ícone suave. Cobre todos os estados. */
.user-menu-item,
.user-menu-item:link,
.user-menu-item:visited,
.user-menu-item:hover,
.user-menu-item:focus,
.user-menu-item:active { color: var(--texto); }
.user-menu-item:hover { background: var(--bg-hover); }
.user-menu-item i { width: 18px; text-align: center; color: var(--texto-fraco); }
.user-menu-item-danger { color: var(--erro); }
.user-menu-item-danger i { color: var(--erro); }
.user-menu-item-danger:hover { background: color-mix(in srgb, var(--erro) 12%, transparent); }

/* Seletor de idioma — item com submenu inline (não float) */
.user-menu-item-meta {
    margin-left: auto;
    color: var(--texto-fraco);
    font-size: .78rem;
    padding-right: .25rem;
}
.user-menu-item-chevron {
    color: var(--texto-fraco);
    font-size: .72rem !important;
    width: auto !important;
}
.user-menu-sub {
    display: flex; flex-direction: column;
    gap: 2px;
    margin: 2px 0 4px;
    padding: 4px 0 4px 12px;
    border-left: 2px solid var(--borda);
}
/* IMPORTANTE: a regra acima (display:flex) tem a MESMA especificidade do
 * seletor de atributo [hidden] do user-agent (0,0,1,0), e como ela vem
 * depois no nosso CSS, ela ganha — fazendo o submenu ficar sempre aberto.
 * Forçamos display:none com !important pra restaurar o comportamento de
 * "hidden" como toggle real. */
.user-menu-sub[hidden] { display: none !important; }

/* Chevron do item "Idioma" gira 90° quando o submenu está aberto. */
#btnIdioma[aria-expanded="true"] .user-menu-item-chevron {
    transform: rotate(90deg);
}
.user-menu-item-chevron {
    transition: transform .15s ease;
}
.user-menu-sub-item {
    padding: .4rem .6rem;
    font-size: .85rem;
    gap: .5rem;
}
/* Item ativo (idioma/tema selecionado): mantém destaque visual via bg
   primary-soft + peso 600, mas o texto usa --primary pra ficar legível
   em ambos os temas (laranja sobre laranja-soft em light, blurple sobre
   blurple-soft em dark — ambos com contraste WCAG AA). */
.user-menu-sub-item.is-ativa { background: var(--primary-soft); color: var(--primary); font-weight: 600; }
.user-menu-sub-item.is-ativa i { color: var(--primary); }
.user-menu-flag {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 22px; height: 15px;
    background: var(--bg-hover);
    border-radius: 2px;
    font-size: .62rem;
    font-weight: 700;
    color: var(--texto-medio);
    flex-shrink: 0;
}

/* ===== Sino de notificacoes (topbar) ===== */
.notif-menu { position: relative; }
.notif-trigger {
    position: relative;
    display: inline-flex; align-items: center; justify-content: center;
    width: 38px; height: 38px;
    background: transparent;
    border: 1px solid transparent;
    border-radius: 999px;
    cursor: pointer;
    color: var(--texto-medio);
    font-size: 1.05rem;
    transition: all .15s;
}
.notif-trigger:hover { background: var(--bg-hover); color: var(--texto); }
.notif-menu.aberto .notif-trigger {
    background: var(--bg-card);
    border-color: var(--cor-primaria);
    color: var(--cor-primaria);
}
.notif-badge {
    position: absolute;
    top: 5px; right: 5px;
    min-width: 14px; height: 14px;
    padding: 0 3px;
    background: #ef4444;
    color: #fff;
    font-size: .58rem;
    font-weight: 700;
    line-height: 14px;
    border-radius: 999px;
    border: 1.5px solid #fff;
    text-align: center;
    box-sizing: content-box;
    transition: min-width .12s, padding .12s;
}
.notif-badge[hidden] { display: none; }

.notif-popup {
    position: absolute; top: calc(100% + 8px); right: 0;
    width: 360px; max-width: calc(100vw - 2rem);
    background: var(--bg-card);
    border: 1px solid var(--borda);
    border-radius: 12px;
    box-shadow: 0 12px 28px rgba(0,0,0,.12), 0 2px 6px rgba(0,0,0,.06);
    z-index: 50;
    overflow: hidden;
}
.notif-popup[hidden] { display: none; }

.notif-cabecalho {
    display: flex; align-items: center; justify-content: space-between;
    gap: .5rem;
    padding: .75rem .85rem;
    border-bottom: 1px solid var(--borda);
}
.notif-cabecalho strong { font-size: .95rem; color: var(--texto); }
.notif-marcar-todas {
    background: none; border: none;
    color: var(--primary);
    font-size: .78rem; font-weight: 500;
    cursor: pointer;
    padding: .2rem .4rem;
    border-radius: 6px;
}
.notif-marcar-todas:hover { background: var(--primary-soft); }

.notif-lista {
    max-height: 420px;
    overflow-y: auto;
    scrollbar-width: thin;
}
.notif-lista::-webkit-scrollbar { width: 6px; }
.notif-lista::-webkit-scrollbar-thumb { background: var(--borda-forte); border-radius: 3px; }

.notif-vazio {
    padding: 2rem 1rem;
    text-align: center;
    color: var(--texto-fraco);
    font-size: .88rem;
}

/* v1.1.70 — Wrapper da linha: conteúdo (botão) + "X" de excluir. O fundo/hover
   e a borda agora vivem no wrapper; o .notif-item interno fica transparente. */
.notif-item-wrap {
    display: flex; align-items: stretch;
    background: var(--primary-soft);
    border-bottom: 1px solid var(--borda);
    transition: background .12s;
}
.notif-item-wrap:hover { background: color-mix(in srgb, var(--primary) 18%, transparent); }
.notif-item-wrap.is-lida { background: var(--bg-card); }
.notif-item-wrap.is-lida:hover { background: var(--bg-elevado); }
.notif-item-wrap:last-child { border-bottom: none; }

.notif-item {
    display: block;
    flex: 1; min-width: 0;
    text-align: left;
    padding: .7rem .85rem;
    background: transparent;
    border: none;
    cursor: pointer;
}
/* Botão "X" de excluir a notificação. */
.notif-item-excluir {
    flex-shrink: 0;
    background: transparent; border: none; cursor: pointer;
    color: var(--texto-fraco); padding: 0 .7rem;
    display: flex; align-items: center; font-size: .9rem;
    transition: color .12s;
}
.notif-item-excluir:hover { color: #ef4444; }

.notif-item-titulo {
    font-size: .9rem;
    font-weight: 600;
    color: var(--texto);
    margin-bottom: .15rem;
}
.notif-item-wrap.is-lida .notif-item-titulo { font-weight: 500; color: var(--texto-medio); }
.notif-item-body {
    font-size: .82rem;
    color: var(--texto-fraco);
    margin-bottom: .25rem;
    line-height: 1.35;
}
.notif-item-meta {
    font-size: .72rem;
    color: var(--texto-fraco);
}

/* Barra "viva" do lote de IA gerando em background (topo do sino). */
.notif-lote-vivo {
    padding: .7rem .85rem;
    background: var(--primary-soft);
    border-bottom: 1px solid var(--borda);
}
.notif-lote-vivo .notif-item-titulo { margin-bottom: .4rem; }
.notif-lote-bar {
    height: 6px;
    border-radius: 99px;
    background: var(--bg-elevado);
    overflow: hidden;
}
.notif-lote-bar-fill {
    height: 100%;
    border-radius: 99px;
    background: var(--primary);
    transition: width .4s ease;
}
/* Ponto pulsante no badge do sino enquanto gera. */
.notif-badge.is-pulsando { animation: notif-pulse 1.2s ease-in-out infinite; }
@keyframes notif-pulse {
    0%, 100% { opacity: 1; }
    50%      { opacity: .35; }
}

.conteudo {
    padding: 1.5rem;
    flex: 1;
    overflow-y: auto;          /* este é o scroll principal da página */
    min-height: 0;
    /* min-width:0 é a trava anti-estouro do flex: sem ela, um filho largo
       (tabela, string sem espaço) força a coluna a crescer além da viewport e
       empurra o layout. Em telas largas (desktop) não muda NADA — só impede o
       estouro em notebooks/telas escaladas. */
    min-width: 0;
    scrollbar-width: thin;
}
.conteudo::-webkit-scrollbar { width: 10px; }
.conteudo::-webkit-scrollbar-track { background: transparent; }
.conteudo::-webkit-scrollbar-thumb { background: var(--borda-forte); border-radius: 5px; }
.conteudo::-webkit-scrollbar-thumb:hover { background: #94a3b8; }

.page-header {
    display: flex; align-items: center; justify-content: space-between;
    margin-bottom: 1.25rem; gap: 1rem; flex-wrap: wrap;
}
.page-header h2 { margin: 0; font-size: 1.25rem; display: flex; align-items: center; gap: .5rem; }
.page-actions { display: flex; gap: .5rem; }

.card { background: var(--bg-card); border-radius: var(--raio); box-shadow: var(--sombra); }
.card-header {
    padding: .9rem 1rem;
    border-bottom: 1px solid var(--borda);
}
.card-header h3 {
    margin: 0;
    font-size: 1rem;
    font-weight: 600;
    color: var(--texto);
}
.card-body { padding: 1rem; }

/* ----- Tabelas ----- */
.table-responsive { overflow-x: auto; }
.tabela { width: 100%; border-collapse: collapse; font-size: .9rem; }
.tabela th, .tabela td { padding: .65rem .75rem; text-align: left; border-bottom: 1px solid var(--borda); }
.tabela th { background: var(--bg-elevado); font-weight: 600; color: var(--texto); }
.tabela tbody tr:hover { background: var(--bg-elevado); }
.tabela .th-acoes { text-align: right; width: 1%; white-space: nowrap; }
.tabela td.td-acoes { text-align: right; white-space: nowrap; }

/* ===== Paginacao client-side (CrudHelper + administradores accordion) ===== */
.crud-paginacao {
    display: flex; align-items: center; justify-content: space-between;
    gap: 1rem; margin-top: .75rem; padding: .15rem .25rem;
    font-size: .85rem;
    color: var(--texto-fraco);
    flex-wrap: wrap;
}
.crud-paginacao:empty { display: none; }
.crud-pag-info { font-variant-numeric: tabular-nums; }
.crud-pag-controles { display: flex; align-items: center; gap: .5rem; }
.crud-pag-pagina { font-weight: 600; color: var(--texto); font-variant-numeric: tabular-nums; padding: 0 .25rem; }
.crud-pag-btn {
    display: inline-flex; align-items: center; gap: .35rem;
    padding: .35rem .7rem;
    background: var(--bg-card);
    border: 1px solid var(--borda);
    border-radius: 6px;
    color: var(--texto-medio);
    font-size: .82rem;
    cursor: pointer;
    transition: all .12s;
}
.crud-pag-btn:hover:not(:disabled) {
    background: var(--primary-soft);
    border-color: var(--primary);
    color: var(--primary);
}
.crud-pag-btn:disabled { opacity: .4; cursor: not-allowed; }
.crud-pag-btn i { font-size: .7rem; }

/* ===== Accordion por empresa (administradores) ===== */
.tabela tr.adm-grupo { background: var(--bg-elevado); }
.tabela tr.adm-grupo:hover { background: var(--bg-hover); }
.tabela tr.adm-grupo td { padding: 0; border-bottom: 1px solid var(--borda); }
.adm-grupo-toggle {
    display: flex; align-items: center; gap: .65rem;
    width: 100%;
    background: transparent;
    border: none;
    padding: .7rem .85rem;
    cursor: pointer;
    font-size: .92rem;
    color: var(--texto);
    text-align: left;
}
.adm-grupo-toggle:hover { color: var(--primary); }
.adm-grupo-toggle strong { font-weight: 600; }
.adm-grupo-chevron {
    color: var(--texto-fraco);
    font-size: .75rem;
    transition: transform .15s;
    width: 12px; text-align: center;
}
.adm-grupo-chevron.aberto { transform: rotate(90deg); color: var(--primary); }
.adm-grupo-count {
    margin-left: auto;
    background: var(--primary-soft);
    color: var(--primary);
    font-size: .72rem; font-weight: 700;
    padding: .15rem .55rem;
    border-radius: 999px;
    font-variant-numeric: tabular-nums;
}
.tabela tr.adm-item td { background: var(--bg-card); }
.tabela tr.adm-item td.adm-item-id {
    padding-left: 2.5rem; /* indent visual pra mostrar que eh filha */
    color: var(--texto-fraco);
    font-size: .82rem;
}
/* `.td-loading` e `.td-vazio` são usadas em DUAS situações:
   1. Dentro de uma <td colspan="N"> de tabela — text-align: center funciona
      sozinho porque a célula já ocupa toda a largura.
   2. Dentro de containers `display: grid` (listagens em cards), onde sem
      `grid-column: 1 / -1` o div fica do lado esquerdo, ocupando 1 coluna.
   `grid-column` é silenciosamente ignorado em <td>, então a regra é segura
   pros dois casos. */
.td-loading,
.td-vazio {
    text-align: center;
    padding: 2rem;
    color: var(--texto-fraco);
    grid-column: 1 / -1;
}
.btn-acao {
    background: transparent; border: 0; padding: .35rem .5rem;
    color: var(--texto-fraco); cursor: pointer; border-radius: var(--raio);
}
.btn-acao:hover { background: #e5e7eb; color: var(--texto); }
.btn-acao.editar:hover { color: var(--info); }
.btn-acao.ativar:hover { color: var(--sucesso); }
.btn-acao.desativar:hover { color: var(--aviso); }
.btn-acao.excluir:hover { color: var(--erro); }
/* Quando o botão de ação é um <a> (ex.: pencil "Editar" que é link), o estilo
   global `a:focus { color: var(--primary) }` (0,1,1) vencia o `.btn-acao`
   (0,1,0) e o ícone ficava LARANJA FIXO depois do clique (mantém :focus).
   Reseta a cor do link-ação em TODOS os estados sem :hover, na especificidade
   certa; só o :hover é que pinta (regras acima). */
a.btn-acao:link, a.btn-acao:visited, a.btn-acao:focus, a.btn-acao:active {
    color: var(--texto-fraco);
}
a.btn-acao:hover { color: var(--texto); }
a.btn-acao.editar:hover { color: var(--info); }
a.btn-acao.ativar:hover { color: var(--sucesso); }
a.btn-acao.desativar:hover { color: var(--aviso); }
a.btn-acao.excluir:hover { color: var(--erro); }
/* Mesmo problema do `a:focus` laranja-fixo nos outros botões-ícone que são
   links (btn-icone, btn-icone-acao). Reseta a cor herdada do link nos estados
   sem hover, deixando o :hover/próprio estilo do componente mandar. */
a.btn-icone:link, a.btn-icone:visited, a.btn-icone:focus, a.btn-icone:active { color: var(--texto); }
a.btn-icone-acao:link, a.btn-icone-acao:visited, a.btn-icone-acao:focus, a.btn-icone-acao:active { color: inherit; }

.badge { display: inline-block; padding: .15rem .55rem; border-radius: 999px; font-size: .75rem; font-weight: 600; }
.badge i { font-size: .7em; margin-right: .15rem; }
.badge-ativo    { background: #d1fae5; color: #065f46; }
.badge-inativo  { background: #fee2e2; color: #991b1b; }
.badge-bloqueado{ background: #fef3c7; color: #92400e; }
/* v1.1.56 — Badges adicionais usados no pipeline ERP em /pedidos */
.badge-aviso    { background: #fed7aa; color: #9a3412; }
.badge-perigo   { background: #fee2e2; color: #991b1b; }
.badge-vazio    { background: var(--bg-hover); color: var(--texto-fraco); }
/* Padronização do visual de status (v1.2.x) — TODOS os módulos usam o mesmo
   verde/cinza/âmbar. Aliases pros nomes que surgiram soltos (badge-success,
   badge-muted, status-pill/is-*) caírem no MESMO estilo canônico — evita cada
   tela ter sua própria pílula. Não inventar variação nova: reusar estes. */
.badge-success  { background: #d1fae5; color: #065f46; }
.badge-muted    { background: var(--badge-neutro-bg); color: var(--badge-neutro-fg); }
.badge-warn     { background: #fef3c7; color: #92400e; }
.status-pill    { display: inline-block; padding: .15rem .55rem; border-radius: 999px; font-size: .75rem; font-weight: 600; }
.status-pill i  { font-size: .7em; margin-right: .15rem; }
.status-pill.is-success { background: #d1fae5; color: #065f46; }
.status-pill.is-warn    { background: #fef3c7; color: #92400e; }
.status-pill.is-muted   { background: var(--badge-neutro-bg); color: var(--badge-neutro-fg); }

/* Realce visual em linhas com revisao ERP pendente — chama atencao.
   Usa var(--primary-soft) pra adaptar ao tema (laranja claro em light,
   blurple-soft em dark) e mantém legibilidade. */
tr.is-pendente-revisao {
    background: linear-gradient(90deg, var(--primary-soft) 0%, var(--bg-card) 30%) !important;
    border-left: 3px solid var(--primary);
}
tr.is-pendente-revisao td:first-child { font-weight: 700; color: var(--primary); }

/* Variante "primario" do btn-acao — usado em "Enviar ERP" (chamativo verde) */
.btn-acao.btn-acao-primario {
    background: #16a34a;
    color: #fff;
    border-color: #15803d;
}
.btn-acao.btn-acao-primario:hover {
    background: #15803d;
    color: #fff;
}

/* ----- Modal ----- */
.modal {
    display: none;
    position: fixed; inset: 0; z-index: 1000;
    overflow-y: auto;          /* fallback: se o dialog ficar maior que a viewport, o modal inteiro rola */
    -webkit-overflow-scrolling: touch;
    overscroll-behavior: contain; /* evita scroll propagation no iOS */
}
.modal.aberto { display: block; }
.modal-overlay {
    position: fixed; inset: 0;
    background: rgba(0,0,0,.5);
    backdrop-filter: blur(2px);
    z-index: 0;
}
.modal-dialog {
    position: relative;
    max-width: 600px;
    margin: 3vh auto;          /* margem reduzida para aproveitar mais a viewport */
    padding: 0 1rem;
    z-index: 1;
}
/* Variantes (v1.1.29) — usadas via `class="modal-dialog modal-lg"` etc. */
.modal-dialog.modal-sm  { max-width: 440px; }
.modal-dialog.modal-lg  { max-width: 820px; }
.modal-dialog.modal-xl  { max-width: 1080px; }
.modal-content {
    background: var(--bg-card); border-radius: 12px; overflow: hidden;
    box-shadow: var(--sombra-lg);
    display: flex; flex-direction: column;
    max-height: 94vh;          /* deixa folga para a margem */
}
.modal-header {
    display: flex; align-items: center; justify-content: space-between;
    padding: 1rem 1.25rem; border-bottom: 1px solid var(--borda);
    flex-shrink: 0;
}
.modal-header h3 { margin: 0; font-size: 1.05rem; display: flex; align-items: center; gap: .5rem; }
.btn-fechar-modal {
    background: transparent; border: 0; cursor: pointer; padding: .25rem .5rem; border-radius: 6px;
    color: var(--texto-fraco);
}
.btn-fechar-modal:hover { background: var(--bg-hover); color: var(--texto); }

/* form herda o flex do .modal-content para body+footer ficarem corretos */
.modal-content > form {
    display: flex; flex-direction: column;
    flex: 1; min-height: 0;
    overflow: hidden;
}

.modal-body {
    padding: 1rem 1.25rem;     /* v1.1.29 — vertical mais enxuto */
    overflow-y: auto;          /* scroll interno do corpo */
    flex: 1; min-height: 0;    /* essencial para o scroll funcionar dentro do flex */
    scrollbar-width: thin;
}
.modal-body::-webkit-scrollbar { width: 8px; }
.modal-body::-webkit-scrollbar-thumb { background: var(--borda-forte); border-radius: 4px; }
.modal-body::-webkit-scrollbar-thumb:hover { background: var(--texto-fraco); }

/* ----- Preview de arquivos (preview.js) -----
   O modal-body do preview precisa de altura concreta pra o iframe do PDF
   (e imagem/vídeo/texto) ocupar a área toda. Sem isso o iframe colapsava
   pro tamanho intrínseco (~300x150) e o PDF aparecia minúsculo no meio
   de muito espaço em branco. Usa o .modal-content já com max-height:94vh;
   aqui só damos altura ao corpo e fazemos o conteúdo preencher. */
/* O modal de preview ocupa quase toda a viewport (PDF/imagem grandes precisam
   de espaço vertical). Em vez de fixar a altura no body (frágil — competia com
   o max-height:94vh do .modal-content e com a toolbar do leitor de PDF),
   fixamos a altura no PRÓPRIO .modal-content e o body só preenche o que sobra
   (flex). Assim o iframe do PDF sempre recebe ~toda a altura disponível. */
.preview-dialog .modal-content {
    height: 92vh;
    max-height: 92vh;
}
.preview-body {
    display: flex;
    flex-direction: column;
    padding: 0;                 /* o conteúdo (iframe/img) vai até a borda */
    flex: 1 1 auto;             /* preenche o que sobra após header + footer */
    min-height: 0;              /* permite o iframe interno crescer/rolar */
    background: var(--bg);
}
.preview-pdf,
.preview-text {
    flex: 1 1 auto;
    width: 100%;
    min-height: 0;
    border: 0;
    display: block;
    background: var(--bg-card);
}
.preview-img {
    flex: 1 1 auto;
    min-height: 0;
    width: 100%;
    object-fit: contain;        /* mantém proporção sem cortar */
    align-self: center;
}
.preview-video {
    flex: 1 1 auto;
    min-height: 0;
    width: 100%;
    background: #000;
}
.preview-audio-wrap {
    flex: 1 1 auto;
    display: flex; flex-direction: column;
    align-items: center; justify-content: center;
    gap: 1rem; padding: 2rem;
}
.preview-audio-icone { font-size: 3rem; color: var(--texto-fraco); }
.preview-audio { width: min(480px, 90%); }
/* Estados centralizados (loading / fallback / erro) */
.preview-loading,
.preview-fallback,
.preview-erro {
    flex: 1 1 auto;
    display: flex; flex-direction: column;
    align-items: center; justify-content: center;
    gap: .6rem; padding: 2rem; text-align: center;
    color: var(--texto-fraco);
}
.preview-loading i { font-size: 2rem; color: var(--primary); }
.preview-fallback-icone,
.preview-erro i { font-size: 3rem; color: var(--texto-fraco); }
.preview-erro i { color: #dc2626; }
.preview-fallback-mime,
.preview-erro-detalhe { font-size: .8rem; color: var(--texto-fraco); }
/* Em telas baixas usa quase toda a altura (95vh) — o header/footer são finos,
   então sobra espaço útil pro PDF mesmo em viewport curta. Ajusta no
   .modal-content (o body é flex e preenche sozinho). */
@media (max-height: 720px) {
    .preview-dialog .modal-content { height: 95vh; max-height: 95vh; }
}

.modal-footer {
    display: flex; justify-content: flex-end; gap: .5rem;
    padding: 1rem 1.25rem; border-top: 1px solid var(--borda); background: var(--bg-elevado);
    flex-shrink: 0;            /* footer sempre visível */
}

/* ----- Permissões / Funções / Setores — seções do formulário -----
   Sem fieldset border (não combina com o card do modal). O título +
   hint funcionam como separador visual; o conteúdo flui no fluxo
   normal do modal-body. */
.permissoes-bloco,
.funcoes-bloco,
.setores-bloco {
    border: 0; padding: 0;
    margin: 1.25rem 0 0;
    min-width: 0; /* fieldset reset pra não esticar grid pai */
}
.permissoes-bloco legend,
.funcoes-bloco legend,
.setores-bloco legend {
    padding: 0; margin: 0 0 .35rem;
    font-weight: 600; font-size: .9rem; color: var(--texto);
    display: flex; align-items: center; gap: .5rem;
}
.permissoes-bloco legend i,
.funcoes-bloco legend i,
.setores-bloco legend i { color: var(--cor-primaria, #FF6B00); font-size: .95rem; }
.permissoes-bloco .perm-hint,
.funcoes-bloco .perm-hint,
.setores-bloco .perm-hint {
    display: block; font-weight: 400; font-size: .78rem; color: var(--texto-fraco);
    margin: 0 0 .65rem; line-height: 1.4;
}
.permissoes-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(180px, 1fr)); gap: .5rem; }

/* Grid responsivo pras Funções (4 checkboxes) e lista de Setores (N). */
.funcoes-grid,
.setores-lista { display: grid; grid-template-columns: repeat(auto-fill, minmax(160px, 1fr)); gap: .5rem; }
/* Estados vazio/carregando ocupam a LINHA inteira do grid — senão a mensagem
   ("Nenhum setor cadastrado...") fica espremida numa célula de 160px e quebra feio. */
.setores-lista > .td-loading,
.setores-lista > .texto-info { grid-column: 1 / -1; }

/* Checkbox-pílula reutilizável (Funções, Setores) — chip com ícone + texto.
   Hover: realce sutil. Marcado: bg laranja claro + borda laranja. */
.chk-pill {
    display: inline-flex; align-items: center; gap: .55rem;
    padding: .55rem .75rem; border: 1px solid var(--borda); border-radius: 8px;
    background: var(--bg-card); cursor: pointer; font-size: .85rem; color: var(--texto);
    transition: background .15s, border-color .15s, box-shadow .15s;
    user-select: none; line-height: 1.2;
}
.chk-pill:hover { background: var(--bg-elevado); border-color: var(--borda-forte); }
.chk-pill > i { color: var(--texto-fraco); font-size: .95rem; flex-shrink: 0; }
.chk-pill > input[type=checkbox] {
    margin: 0; cursor: pointer; flex-shrink: 0;
    width: 16px; height: 16px; accent-color: var(--cor-primaria, #FF6B00);
}
.chk-pill > span { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.chk-pill:has(input:checked) {
    background: #fff4ee; border-color: var(--cor-primaria, #FF6B00);
    box-shadow: 0 0 0 1px var(--cor-primaria, #FF6B00);
}
.chk-pill:has(input:checked) > i { color: var(--cor-primaria, #FF6B00); }

/* === Ações em massa no topo da matriz === */
.permissoes-cabecalho-acoes {
    display: flex; gap: .4rem; flex-wrap: wrap;
    margin: 0 0 .6rem;
}
/* .btn-ghost consolidado acima (linha 123). Versão duplicada removida
   pra evitar override silencioso (font-size .78rem + padding pequeno
   estava forçando todo .btn-ghost a ficar mini). Use .btn-sm onde
   precisar de tamanho compacto. */
.btn-sm { padding: 4px 10px; font-size: .78rem; }

/* === Matriz Menu × Ação (Visualizar / Criar / Editar) === */
.permissoes-matriz {
    border: 1px solid var(--borda);
    border-radius: 8px;
    overflow: hidden;
    background: var(--bg-card);
}
.perm-matriz-linha {
    display: grid;
    grid-template-columns: 1fr 90px 90px 90px;
    align-items: center;
    border-bottom: 1px solid var(--borda);
    transition: background .12s;
}
.perm-matriz-linha:last-child { border-bottom: 0; }
.perm-matriz-linha:hover:not(.perm-matriz-cabecalho) { background: var(--bg-elevado); }

.perm-matriz-cabecalho {
    background: var(--bg-hover);
    font-weight: 700;
    font-size: .75rem;
    text-transform: uppercase;
    letter-spacing: .03em;
    color: var(--texto-fraco);
}
.perm-matriz-cabecalho .perm-cel-menu,
.perm-matriz-cabecalho .perm-cel-acao {
    padding: .5rem .75rem;
}

.perm-cel-menu {
    padding: .55rem .75rem;
    font-size: .88rem;
    color: var(--texto);
    display: flex; align-items: center; gap: .5rem;
    white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.perm-cel-menu i {
    color: var(--cor-primaria); width: 18px; text-align: center;
}
.perm-cel-acao {
    display: flex; align-items: center; justify-content: center;
    padding: .55rem .5rem;
    border-left: 1px solid var(--borda);
}
/* Cabeçalho das colunas de permissão: só ícone (Visualizar/Criar/Editar),
   texto vive no title/aria-label. Ícone centralizado e sutil. */
.perm-cab-col,
.perm-matriz-cabecalho .perm-cel-acao {
    display: flex; align-items: center; justify-content: center;
}
.perm-cab-col i,
.perm-matriz-cabecalho .perm-cel-acao i {
    font-size: .95rem; color: var(--texto-fraco);
}
.perm-matriz-cabecalho .perm-cel-acao { border-left: 1px solid var(--borda); }
.perm-matriz-linha:first-child .perm-cel-acao { border-left-color: var(--borda); }

/* Checkbox customizado: caixa arredondada, ícone aparece só quando marcado */
.perm-chk {
    position: relative;
    width: 30px; height: 30px;
    border-radius: 6px;
    border: 2px solid var(--borda);
    background: var(--bg-card);
    display: inline-flex; align-items: center; justify-content: center;
    cursor: pointer;
    transition: background .12s, border-color .12s, color .12s;
    color: transparent; /* ícone escondido por padrão */
}
.perm-chk input { position: absolute; opacity: 0; width: 100%; height: 100%; margin: 0; cursor: pointer; }
.perm-chk input:disabled { cursor: not-allowed; }
.perm-chk:hover { border-color: var(--cor-primaria); }
.perm-chk:has(input:checked) {
    background: var(--cor-primaria);
    border-color: var(--cor-primaria);
    color: #fff;
}
.perm-chk:has(input:disabled) {
    background: var(--bg-hover);
    border-color: var(--borda);
    cursor: not-allowed;
    opacity: .5;
}
.perm-chk i { font-size: .85rem; pointer-events: none; }

/* ----- Permissões: accordion por grupo (v1.1.64) ----- */
.perm-grupo {
    border: 1px solid var(--borda);
    border-radius: 10px;
    margin-bottom: .55rem;
    overflow: hidden;
    background: var(--bg-card);
}
.perm-grupo > summary {
    list-style: none;
    cursor: pointer;
    padding: .65rem .9rem;
    display: flex;
    align-items: center;
    gap: .55rem;
    background: var(--bg-elevado);
    user-select: none;
    transition: background .15s;
}
.perm-grupo > summary::-webkit-details-marker { display: none; }
.perm-grupo > summary::marker { content: ''; }
.perm-grupo > summary:hover { background: var(--bg-hover); }
.perm-grupo[open] > summary { border-bottom: 1px solid var(--borda); }
.perm-grupo-chev {
    color: var(--texto-fraco);
    font-size: .72rem;
    transition: transform .15s;
    width: 12px;
    flex-shrink: 0;
}
.perm-grupo[open] > summary .perm-grupo-chev { transform: rotate(90deg); }
.perm-grupo-icon { color: var(--cor-primaria, #FF6B00); font-size: .95rem; flex-shrink: 0; }
.perm-grupo-titulo { flex: 1; font-weight: 600; color: var(--texto); }
.perm-grupo-resumo {
    font-size: .72rem;
    color: var(--texto-fraco);
    background: var(--bg-card);
    border: 1px solid var(--borda);
    padding: 2px 8px;
    border-radius: 999px;
    font-variant-numeric: tabular-nums;
    flex-shrink: 0;
}
.perm-grupo-toggle-tudo {
    background: transparent;
    border: 1px solid var(--borda);
    color: var(--texto-fraco);
    padding: 2px 8px;
    border-radius: 6px;
    cursor: pointer;
    font-size: .8rem;
    flex-shrink: 0;
}
.perm-grupo-toggle-tudo:hover { background: #fff4ee; color: var(--cor-primaria, #FF6B00); border-color: #ffd5bf; }
.perm-grupo-body { padding: 0; }
.perm-grupo-body .perm-matriz-linha { border-radius: 0; }
/* Separador visual antes do grupo "Configurações": deixa claro onde acabam as
   abas de USO e começam os ajustes/integrações. */
.perm-grupo[data-grupo="configuracoes"] {
    margin-top: 1.25rem;
    position: relative;
}
.perm-grupo[data-grupo="configuracoes"]::before {
    content: attr(data-rotulo-divisor);
    display: block;
    margin: 0 0 .5rem;
    padding-top: 1rem;
    border-top: 1px dashed var(--borda);
    font-size: .68rem; font-weight: 700; letter-spacing: .06em; text-transform: uppercase;
    color: var(--texto-fraco);
}
.perm-grupo[data-grupo="configuracoes"] > summary { background: var(--bg-hover); }
.perm-grupo[data-grupo="configuracoes"] > summary .perm-grupo-icon { color: var(--texto-medio); }
/* Sub-seções dentro de um grupo (ex: Configurações com Conta/Comercial/...). */
.perm-subsecao { border-top: 1px solid var(--borda); }
.perm-subsecao:first-child { border-top: 0; }
.perm-subsecao-cab {
    display: flex; align-items: center; gap: .5rem;
    padding: .5rem .75rem;
    background: var(--bg-hover);
    border-bottom: 1px solid var(--borda);
}
.perm-subsecao-icon { color: var(--cor-primaria, #FF6B00); font-size: .85rem; flex-shrink: 0; }
.perm-subsecao-titulo {
    flex: 1; font-weight: 700; color: var(--texto-fraco);
    text-transform: uppercase; letter-spacing: .05em; font-size: .72rem;
}
.perm-subsecao-resumo {
    background: var(--bg-card); color: var(--texto-fraco);
    border: 1px solid var(--borda); border-radius: 999px;
    padding: 1px 7px; font-size: .68rem; font-variant-numeric: tabular-nums;
}

@media (max-width: 600px) {
    .perm-matriz-linha { grid-template-columns: 1fr 64px 64px 64px; }
    .perm-cel-menu { font-size: .8rem; }
    .perm-grupo-resumo { font-size: .65rem; padding: 1px 6px; }
}

/* ----- Dashboard cards ----- */
.dashboard-grid {
    display: grid; gap: 1rem;
    grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));
}
.dashboard-card {
    background: var(--bg-card); padding: 1.25rem; border-radius: var(--raio);
    box-shadow: var(--sombra);
}
.dashboard-card .icon {
    width: 42px; height: 42px; border-radius: 50%;
    background: rgba(255,107,0,.12); color: var(--primary);
    display: flex; align-items: center; justify-content: center;
    font-size: 1.1rem; margin-bottom: .75rem;
}
.dashboard-card .label { font-size: .8rem; color: var(--texto-fraco); margin: 0; }
.dashboard-card .valor { font-size: 1.5rem; font-weight: 700; margin: .25rem 0 0; }
.dashboard-loading { padding: 2rem; text-align: center; color: var(--texto-fraco); grid-column: 1/-1; }

/* ============================================================
   Brand tile — fallback visual quando o logo externo falha/404
   (usado em ERP, Viabilidade). Mostra iniciais da marca sobre
   gradiente da cor primária + ícone pequeno no canto.
   ============================================================ */
.brand-tile-wrap {
    width: 100%; display: flex; align-items: center; justify-content: center;
}
.brand-tile {
    width: 130px; height: 60px;
    border-radius: 10px;
    display: flex; align-items: center; justify-content: center;
    color: #fff;
    position: relative;
    box-shadow: 0 2px 8px rgba(0, 0, 0, .08);
    overflow: hidden;
}
.brand-tile .brand-initials {
    font-size: 1.6rem;
    font-weight: 800;
    letter-spacing: 1px;
    line-height: 1;
    z-index: 1;
    text-shadow: 0 1px 2px rgba(0, 0, 0, .2);
}
.brand-tile .brand-icon-fallback {
    position: absolute;
    right: 8px; bottom: 6px;
    font-size: 1rem;
    color: rgba(255, 255, 255, .55);
}

/* ============================================================
   Tabs de modal (usado em ERP, Viabilidade e outros módulos)
   ============================================================ */
.modal-tabs {
    display: flex; gap: 5px; margin-bottom: 1rem;
    border-bottom: 2px solid var(--borda);
}
.modal-tab {
    padding: 8px 16px; background: transparent; border: none;
    border-bottom: 2px solid transparent; color: var(--texto-fraco);
    cursor: pointer; transition: color .15s, border-color .15s;
    display: inline-flex; align-items: center; gap: .4rem;
    font-size: .9rem; font-weight: 500;
    font-family: inherit;
}
.modal-tab:hover { color: var(--texto); }
.modal-tab.ativo {
    color: var(--cor-primaria);
    border-bottom-color: var(--cor-primaria);
}
.modal-tab i { font-size: .9rem; }
.modal-tab-conteudo          { display: none; }
.modal-tab-conteudo.ativo    { display: block; }

/* ============================================================
   Loading Overlay (espelha o legado painel-adm/dashboard/styles.css)
   ============================================================ */
.loading-overlay {
    position: fixed; inset: 0;
    background: rgba(255, 255, 255, 0.92);
    backdrop-filter: blur(5px); -webkit-backdrop-filter: blur(5px);
    display: flex; align-items: center; justify-content: center;
    z-index: 99999;
    transition: opacity .25s ease;
    opacity: 1;
}
.loading-overlay.hidden { opacity: 0; pointer-events: none; }
.loading-content { text-align: center; max-width: 320px; padding: 2rem; }
.loading-spinner {
    width: 60px; height: 60px;
    border: 4px solid #e5e7eb;
    border-top-color: var(--cor-primaria);
    border-radius: 50%;
    animation: sv-spin .8s linear infinite;
    margin: 0 auto 1.5rem;
}
.loading-text    { font-size: 1.05rem; font-weight: 600; color: var(--texto); margin: 0 0 .35rem; }
.loading-subtext { font-size: .88rem;  color: var(--texto-fraco);  margin: 0; }

@keyframes sv-spin { to { transform: rotate(360deg); } }

/* Progress overlay (importação KML em massa, etc.) */
.progress-overlay {
    position: fixed; inset: 0;
    background: rgba(0, 0, 0, .65);
    backdrop-filter: blur(3px); -webkit-backdrop-filter: blur(3px);
    display: flex; align-items: center; justify-content: center;
    z-index: 99999;
}
.progress-overlay.hidden { display: none; }
.progress-container {
    background: var(--bg-card);
    padding: 1.75rem 1.75rem 1.5rem;
    border-radius: 16px;
    width: 420px; max-width: 92%;
    box-shadow: 0 18px 50px rgba(0,0,0,.35);
}
.progress-container h3 {
    margin: 0 0 1rem; text-align: center; font-size: 1.05rem;
    color: var(--cor-primaria);
}
.progress-bar-wrapper {
    width: 100%; height: 18px;
    background: #f1f3f5; border-radius: 10px; overflow: hidden;
    margin-bottom: .55rem;
}
.progress-bar-fill {
    height: 100%;
    background: linear-gradient(90deg, var(--cor-primaria) 0%, #ffae72 100%);
    border-radius: 10px;
    transition: width .25s ease;
}
.progress-info {
    display: flex; justify-content: space-between;
    font-size: .85rem; color: var(--texto-fraco); margin-bottom: .65rem;
}
.progress-current-item {
    background: rgba(255, 107, 0, .08);
    color: var(--cor-primaria);
    padding: .6rem .75rem; border-radius: 8px;
    font-size: .82rem; text-align: center; word-break: break-word;
    margin-top: .4rem;
}
.progress-current-item i { margin-right: .35rem; }

/* v1.1.56 — Sem `display:flex` direto: text-nodes entre <i> e <code>
   viravam flex-items anônimos e ganhavam o `gap`, criando aquele buraco
   visual onde "Senha padrão:" ficava em cima e "12345678" no meio.
   Agora a caixa é bloco padrão; o <i> inicial fica inline e empurra o
   texto naturalmente. Wrap com word-wrap pra URLs longas. */
.alerta-info {
    background: var(--primary-soft); color: #1e40af;
    padding: .75rem 1rem; border-radius: var(--raio);
    border-left: 4px solid var(--info);
    margin-bottom: 1rem;
    font-size: .875rem; line-height: 1.5;
    word-wrap: break-word; overflow-wrap: anywhere;
}
.alerta-info > i:first-child {
    margin-right: .5rem;
    vertical-align: -1px;
}
.alerta-info code {
    background: rgba(30, 64, 175, .1);
    color: #1e40af;
    padding: 1px 6px; border-radius: 4px;
    font-family: 'JetBrains Mono', 'SF Mono', Consolas, monospace;
    font-size: .85em; font-weight: 600;
}

/* ===== Skeleton/shimmer de tabela (window.Skeleton) =====
   Linhas placeholder animadas usadas no carregamento inicial das listas, no
   lugar do spinner cru. Barras com brilho deslizante sutil e profissional. */
.skel-row > td { padding: .7rem .85rem; }
.skel-bar {
    display: block; height: 12px; border-radius: 6px;
    background: linear-gradient(90deg,
        var(--bg-hover) 25%,
        color-mix(in srgb, var(--bg-hover) 55%, var(--borda-forte)) 37%,
        var(--bg-hover) 63%);
    background-size: 400% 100%;
    animation: skelShimmer 1.4s ease-in-out infinite;
}
@keyframes skelShimmer { 0% { background-position: 100% 0; } 100% { background-position: -100% 0; } }
@media (prefers-reduced-motion: reduce) { .skel-bar { animation: none; } }

/* ===== File input estilizado (substitui <input type=file> nativo) =====
   O input nativo continua no DOM (escondido); um botão + nome de arquivo dão
   a aparência consistente. Aplicado via window.FileInput a inputs .file-input. */
.file-input-native-hidden {
    position: absolute !important;
    width: 1px; height: 1px; padding: 0; margin: -1px;
    overflow: hidden; clip: rect(0 0 0 0); border: 0;
}
.file-input-wrap {
    display: flex; align-items: center; gap: .6rem; flex-wrap: wrap;
}
.file-input-btn {
    display: inline-flex; align-items: center; gap: .5rem;
    padding: .55rem .9rem;
    border: 1.5px solid var(--input-borda);
    border-radius: var(--raio);
    background: var(--bg-card);
    color: var(--texto);
    font-size: .88rem; font-weight: 600; font-family: inherit;
    cursor: pointer; white-space: nowrap;
    transition: border-color .15s ease, background .15s ease, color .15s ease;
}
.file-input-btn:hover:not(:disabled) { border-color: var(--primary); color: var(--primary); }
.file-input-btn:focus-visible { outline: none; border-color: var(--primary); box-shadow: 0 0 0 3px var(--primary-soft); }
.file-input-btn:disabled { opacity: .6; cursor: not-allowed; }
.file-input-btn i { font-size: .9em; }
.file-input-nome {
    font-size: .84rem; color: var(--texto-fraco);
    overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
    max-width: 100%; flex: 1 1 auto; min-width: 0;
}
.file-input-nome.tem-arquivo { color: var(--texto); font-weight: 500; }
.file-input-limpar {
    display: inline-flex; align-items: center; justify-content: center;
    width: 26px; height: 26px; flex-shrink: 0;
    border: none; border-radius: 50%;
    background: transparent; color: var(--texto-fraco);
    cursor: pointer; transition: background .15s ease, color .15s ease;
}
.file-input-limpar:hover { background: var(--bg-hover); color: var(--danger, #dc2626); }

/* ===== Custom Select (substitui visualmente <select.select-inline>) =====
   Visual alinhado ao design system: usa tokens de tema, sombras suaves,
   microinterações e destaque da cor primária. Claro + dark (Discord). */
.cs-wrapper { display: inline-block; position: relative; }
.cs-native-hidden {
    position: absolute !important;
    opacity: 0; pointer-events: none;
    width: 1px; height: 1px; margin: 0; padding: 0;
}
.cs-button {
    display: inline-flex; align-items: center; gap: .6rem;
    padding: .5rem .8rem;
    background: var(--bg-card);
    border: 1.5px solid var(--borda);
    border-radius: 10px;
    color: var(--texto); font-size: .875rem; font-weight: 500;
    line-height: 1.2;
    cursor: pointer;
    box-shadow: var(--sombra);
    transition: border-color .18s ease, box-shadow .18s ease, background .18s ease, transform .06s ease;
    min-width: 84px;
}
.cs-button:hover {
    border-color: color-mix(in srgb, var(--primary) 45%, var(--borda));
    background: color-mix(in srgb, var(--primary) 4%, var(--bg-card));
}
.cs-button:active { transform: translateY(.5px); }
.cs-button:focus-visible,
.cs-button[aria-expanded="true"] {
    outline: none;
    border-color: var(--primary);
    box-shadow: 0 0 0 3px var(--primary-soft), var(--sombra);
}
.cs-button-label {
    flex: 1; text-align: left; line-height: 1.2;
    white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.cs-button-arrow {
    color: var(--texto-fraco); display: inline-flex;
    transition: transform .2s cubic-bezier(.4,0,.2,1), color .18s ease;
    flex: none;
}
.cs-button:hover .cs-button-arrow,
.cs-button[aria-expanded="true"] .cs-button-arrow { color: var(--primary); }
.cs-button[aria-expanded="true"] .cs-button-arrow { transform: rotate(180deg); }

.cs-popup {
    position: fixed;
    background: var(--bg-card);
    border: 1px solid var(--borda);
    border-radius: 12px;
    box-shadow: var(--sombra-lg), var(--sombra-md);
    padding: .3rem;
    max-height: 288px;
    /* O scroll é do .cs-options (abaixo) — o popup é uma coluna flex com a
       busca FIXA no topo; as opções rolam por baixo dela sem fresta. */
    overflow: hidden;
    display: flex; flex-direction: column;
    opacity: 0; visibility: hidden;
    transform: translateY(-6px) scale(.97);
    transform-origin: top center;
    transition: opacity .16s ease, transform .16s cubic-bezier(.4,0,.2,1), visibility .16s;
    z-index: 1100;
    min-width: 96px;
    /* leve realce da borda superior com a cor primária */
    background-image: linear-gradient(var(--bg-card), var(--bg-card));
}
.cs-popup.aberto { opacity: 1; visibility: visible; transform: translateY(0) scale(1); }

/* Busca embutida do custom select (listas longas: cidades, UFs...) */
.cs-search {
    flex: none;
    padding: .25rem .25rem .35rem;
    background: var(--bg-card);
    border-bottom: 1px solid var(--borda);
    margin-bottom: .25rem;
}
.cs-options {
    overflow-y: auto;
    min-height: 0;              /* flexbox: permite encolher e rolar */
    overscroll-behavior: contain; /* fim da lista não vaza o scroll pra página */
}
.cs-options::-webkit-scrollbar { width: 8px; }
.cs-options::-webkit-scrollbar-thumb {
    background: var(--borda-forte); border-radius: 4px;
    border: 2px solid var(--bg-card); background-clip: content-box;
}
.cs-search input {
    width: 100%;
    padding: .45rem .65rem;
    border: 1px solid var(--borda-forte);
    border-radius: 8px;
    background: var(--bg-input, var(--bg-card));
    color: var(--texto);
    font-size: .88rem;
    outline: none;
}
.cs-search input:focus { border-color: var(--primary); }
.cs-option.cs-hidden { display: none; }
.cs-vazio { padding: .6rem .8rem; color: var(--texto-fraco); font-size: .85rem; }
.cs-popup::-webkit-scrollbar { width: 8px; }
.cs-popup::-webkit-scrollbar-thumb {
    background: var(--borda-forte); border-radius: 4px;
    border: 2px solid var(--bg-card); background-clip: content-box;
}

.cs-option {
    position: relative;
    padding: .55rem .8rem .55rem 2rem;
    border-radius: 8px;
    cursor: pointer;
    color: var(--texto);
    font-size: .875rem; font-weight: 500;
    display: flex; align-items: center;
    gap: .5rem;
    transition: background .12s ease, color .12s ease, padding-left .12s ease;
}
.cs-option::before {
    /* marcador de selecionado (aparece só no item ativo) */
    content: '';
    position: absolute; left: .7rem; top: 50%;
    width: 7px; height: 7px; border-radius: 50%;
    background: var(--primary);
    transform: translateY(-50%) scale(0);
    transition: transform .16s cubic-bezier(.34,1.56,.64,1);
}
.cs-option:hover,
.cs-option.realce {
    background: var(--bg-hover);
    color: var(--texto);
}
.cs-option.realce {
    box-shadow: inset 0 0 0 1.5px color-mix(in srgb, var(--primary) 40%, transparent);
}
.cs-option.ativo {
    background: var(--primary-soft);
    color: var(--primary);
    font-weight: 600;
}
.cs-option.ativo::before { transform: translateY(-50%) scale(1); }

/* Estado desabilitado (ex.: select de cidade antes de escolher a UF) */
.cs-button-disabled,
.cs-button:disabled {
    opacity: .55;
    cursor: not-allowed;
    background: var(--bg-hover);
    box-shadow: none;
}
.cs-button-disabled:hover {
    border-color: var(--borda);
    background: var(--bg-hover);
}
.cs-button-disabled:hover .cs-button-arrow { color: var(--texto-fraco); }

/* Largura em BARRAS DE FILTRO: colunas estreitas → botão ocupa 100% da coluna,
   como fazia o <select> nativo, mantendo o alinhamento da barra. */
.op-filtro .cs-wrapper,
.logs-filtros .cs-wrapper,
.logs-toolbar .cs-wrapper,
.customers-filtro .cs-wrapper,
.cs-wrapper.cs-block { display: block; width: 100%; }
.op-filtro .cs-button,
.logs-filtros .cs-button,
.logs-toolbar .cs-button,
.customers-filtro .cs-button,
.cs-wrapper.cs-block .cs-button { width: 100%; }

/* Largura em FORMULÁRIOS / MODAIS: o select acompanha o conteúdo (não estica
   como os inputs de texto). Fica curto e proporcional — ex.: "Ativo" pequeno.
   O JS reserva a largura da maior opção (--cs-w) pra não "pular" ao trocar. */
.form-group .cs-wrapper,
.modal-body .cs-wrapper { display: inline-flex; width: auto; max-width: 100%; }
.form-group .cs-button,
.modal-body .cs-button {
    width: auto;
    min-width: var(--cs-w, 8rem);
    max-width: 100%;
}

/* Nos filtros o botão herda a mesma altura/tipografia dos inputs vizinhos */
.op-filtro .cs-button { padding: .45rem .6rem; font-size: .9rem; }

/* ===== Inputs de data / hora — visual alinhado ao custom select =====
   Mantém o calendário nativo do browser, mas com moldura, cores do tema
   e ícone de calendário na cor primária. Cobre filtros e formulários. */
.op-filtro input[type="date"],
.op-filtro input[type="time"],
.op-filtro input[type="datetime-local"],
.form-group input[type="date"]:not(.no-polish),
.form-group input[type="time"]:not(.no-polish),
.logs-filtros input[type="date"],
.customers-filtro input[type="date"] {
    -webkit-appearance: none; appearance: none;
    padding: .5rem .8rem;
    background: var(--bg-card);
    border: 1.5px solid var(--borda);
    border-radius: 10px;
    color: var(--texto);
    font-size: .875rem; font-weight: 500;
    line-height: 1.2;
    box-shadow: var(--sombra);
    transition: border-color .18s ease, box-shadow .18s ease, background .18s ease;
    min-height: 0;
    font-family: inherit;
}
.op-filtro input[type="date"]:hover,
.op-filtro input[type="time"]:hover,
.form-group input[type="date"]:not(.no-polish):hover,
.logs-filtros input[type="date"]:hover,
.customers-filtro input[type="date"]:hover {
    border-color: color-mix(in srgb, var(--primary) 45%, var(--borda));
    background: color-mix(in srgb, var(--primary) 4%, var(--bg-card));
}
.op-filtro input[type="date"]:focus,
.op-filtro input[type="time"]:focus,
.form-group input[type="date"]:not(.no-polish):focus,
.logs-filtros input[type="date"]:focus,
.customers-filtro input[type="date"]:focus {
    outline: none;
    border-color: var(--primary);
    box-shadow: 0 0 0 3px var(--primary-soft), var(--sombra);
}
/* Ícone do calendário (WebKit/Chrome/Edge) na cor primária, maior e clicável */
.op-filtro input[type="date"]::-webkit-calendar-picker-indicator,
.op-filtro input[type="time"]::-webkit-calendar-picker-indicator,
.form-group input[type="date"]:not(.no-polish)::-webkit-calendar-picker-indicator,
.logs-filtros input[type="date"]::-webkit-calendar-picker-indicator,
.customers-filtro input[type="date"]::-webkit-calendar-picker-indicator {
    cursor: pointer;
    padding: 2px; margin-left: .35rem;
    border-radius: 5px;
    opacity: .65;
    transition: opacity .15s ease, background .15s ease;
    /* recolore o ícone preto/cinza padrão para a cor primária */
    filter: invert(48%) sepia(93%) saturate(1900%) hue-rotate(360deg) brightness(101%) contrast(105%);
}
.op-filtro input[type="date"]::-webkit-calendar-picker-indicator:hover,
.form-group input[type="date"]:not(.no-polish)::-webkit-calendar-picker-indicator:hover,
.logs-filtros input[type="date"]::-webkit-calendar-picker-indicator:hover {
    opacity: 1;
    background: var(--primary-soft);
}
/* Dark mode: ícone claro para contrastar no card escuro */
:root[data-theme="dark"] .op-filtro input[type="date"]::-webkit-calendar-picker-indicator,
:root[data-theme="dark"] .form-group input[type="date"]:not(.no-polish)::-webkit-calendar-picker-indicator,
:root[data-theme="dark"] .logs-filtros input[type="date"]::-webkit-calendar-picker-indicator {
    filter: invert(1) brightness(1.6);
}
/* Texto placeholder do date vazio um pouco mais suave */
.op-filtro input[type="date"]:in-range::-webkit-datetime-edit,
.op-filtro input[type="date"]::-webkit-datetime-edit { color: var(--texto); }
.op-filtro input[type="date"]:invalid::-webkit-datetime-edit,
.op-filtro input[type="date"]:placeholder-shown::-webkit-datetime-edit { color: var(--texto-fraco); }

/* ============================================================
   Módulo Funis — abas de funis + Kanban estilo PipeRun
   ============================================================ */

.funis-tabs {
    display: flex;
    align-items: center;
    gap: 1rem;
    margin: .5rem 0 1rem 0;
    padding: .4rem .5rem;
    background: var(--bg-card);    /* barra de cima BRANCA (não o cinza --bg-elevado) */
    border: 1px solid var(--borda);
    border-radius: 12px;
    box-shadow: 0 1px 3px rgba(0,0,0,.05);
}
/* v1.1.77 — wrapper que ancora as setas "tem mais" sobre as bordas da lista. */
.funis-tabs-scroll {
    position: relative;
    flex: 1;
    min-width: 0;                 /* deixa a lista encolher e gerar overflow */
}
.funis-tabs-list {
    display: flex;
    gap: .25rem;
    overflow-x: auto;
    scrollbar-width: thin;
    cursor: grab;                 /* dica de "arrastável" (drag-to-scroll) */
    -webkit-overflow-scrolling: touch;
}
/* Setas chevron sobrepostas nas bordas — só aparecem quando há overflow
   naquele lado (JS controla o atributo [hidden]). Fade pra "puxar o olho". */
.funis-tabs-seta {
    position: absolute; top: 0; bottom: 0; z-index: 2;
    width: 34px; border: 0; cursor: pointer;
    display: flex; align-items: center; justify-content: center;
    color: var(--cor-primaria); font-size: .85rem;
    background: linear-gradient(to var(--seta-dir, right),
                rgba(0,0,0,0), var(--bg-elevado) 55%);
}
.funis-tabs-seta.esquerda { left: 0;  --seta-dir: left; justify-content: flex-start; padding-left: 2px; }
.funis-tabs-seta.direita  { right: 0; --seta-dir: right; justify-content: flex-end;  padding-right: 2px; }
.funis-tabs-seta:hover { color: var(--texto); }
.funis-tabs-seta[hidden] { display: none; }
.funis-tabs-list.arrastando {
    cursor: grabbing;
    scroll-behavior: auto;        /* arrasto direto, sem suavização que atrapalha */
    user-select: none;            /* não seleciona texto das abas ao arrastar */
}
.funis-tabs-list.arrastando .funis-tab { cursor: grabbing; }
.funis-tab {
    display: inline-flex;
    align-items: center;
    gap: .4rem;
    padding: .5rem .9rem;
    border: 0;
    background: transparent;
    border-radius: 8px;
    cursor: pointer;
    color: var(--texto-medio);
    font-weight: 500;
    white-space: nowrap;
    transition: background .15s, color .15s;
}
.funis-tab:hover { background: var(--primary-soft); color: var(--cor-primaria); }
.funis-tab.ativa {
    background: var(--cor-primaria);
    color: #fff;
    box-shadow: 0 1px 3px rgba(0,0,0,.12);
}
.funis-tab.ativa .funis-tab-padrao { color: #fff; }
.funis-tab-padrao { color: #f59e0b; font-size: .8rem; }

.funis-tabs-acoes {
    display: flex;
    align-items: center;
    gap: .25rem;
    padding-right: .5rem;
}
/* ===== Search box padrão (v1.1.73) =====
   Container único pra inputs de busca/pesquisa/filtro: ícone de lupa + input
   transparente sem borda dentro de um wrapper com borda/raio/bg + anel de foco
   no primary. Substitui inputs "crus" espalhados pelos módulos. Uso:
     <div class="search-box"><i class="fa-solid fa-magnifying-glass"></i>
       <input type="search" ...></div>
   Variante .search-box--full ocupa a largura toda da linha. */
.search-box {
    display: inline-flex; align-items: center; gap: .5rem;
    border: 1px solid var(--input-borda); border-radius: 10px;
    background: var(--bg-card); padding: .5rem .75rem;
    min-width: 240px; max-width: 360px;
    transition: border-color .15s, box-shadow .15s;
}
.search-box--full { display: flex; max-width: none; width: 100%; }
.search-box:focus-within {
    border-color: var(--primary);
    box-shadow: 0 0 0 3px var(--primary-soft);
}
.search-box > i { color: var(--texto-fraco); font-size: .85rem; flex-shrink: 0; }
.search-box > input,
.search-box > input.form-control {
    flex: 1; width: 100%; border: none !important; outline: none;
    background: transparent !important; box-shadow: none !important;
    padding: 0 !important; min-height: 0 !important;
    font-size: .88rem; color: var(--texto);
}
.search-box > input::placeholder { color: var(--texto-fraco); }
.search-box > .search-box-clear {
    background: transparent; border: 0; cursor: pointer; color: var(--texto-fraco);
    padding: 2px 4px; border-radius: 6px; flex-shrink: 0; font-size: .8rem;
}
.search-box > .search-box-clear:hover { color: var(--erro, #dc2626); background: var(--bg-hover); }

/* Busca de Leads: placeholder mais longo ("Buscar por nome, e-mail ou telefone...")
   precisa de mais largura pra não cortar. */
.leads-search { min-width: 340px; max-width: 420px; }
/* Busca de Usuários: barra um pouco mais larga (mais respiro à direita).
   Só desktop — no mobile mantém o min-width base do .search-box (240px). */
@media (min-width: 769px) {
    .usuarios-search { min-width: 340px; max-width: 420px; }
    /* Busca de Empresas: placeholder mais longo ("nome, subdomínio, CNPJ, e-mail"). */
    .empresas-search { min-width: 380px; max-width: 460px; }
    /* Busca de Administradores: placeholder "nome, e-mail, empresa" cortava no
       max-width base (360px) — alarga p/ caber e dar respiro à direita. */
    .administradores-search { min-width: 380px; max-width: 460px; }
}

.funis-search {
    border: 1px solid var(--input-borda);
    border-radius: 8px;
    padding: .45rem .7rem;
    font-size: .9rem;
    width: 220px;
    outline: none;
    background: var(--bg-card);
}
.funis-search:focus { border-color: var(--cor-primaria); }
/* Busca de Tickets (aba Atendimentos): placeholder mais longo
   ("Buscar ticket (título / protocolo)...") precisa de mais largura.
   Só no desktop — no mobile (≤768px) a regra .funis-search full-width manda. */
@media (min-width: 769px) {
    #atdSearch.funis-search { width: 320px; }
}
.btn-icone-danger:hover { background: #fee2e2; color: #b91c1c; }
.funis-loading { padding: .5rem 1rem; color: var(--texto-fraco); }
.funis-loading.erro { color: #b91c1c; }
.funis-selo {
    font-size: .72rem;
    color: var(--texto-fraco);
    padding: .15rem .5rem;
    border-radius: 99px;
    background: var(--bg-hover);
    white-space: nowrap;
    user-select: none;
}

/* Kanban container — colunas horizontais */
/* PAINEL branco que embrulha o board (igual ao das Configurações). É o card
   visual; o SCROLL fica no .kanban-container interno (separar os dois evita o
   conteúdo ser cortado pela borda/cantos do painel ao rolar). */
.kanban-panel {
    background: var(--bg-card);
    border: 1px solid var(--borda);
    border-radius: 14px;
    box-shadow: 0 1px 3px rgba(0,0,0,.05);
    padding: 1.1rem;
    /* Limita a altura do painel ao viewport; o board rola POR DENTRO (x e y). */
    max-height: calc(100vh - 200px);
    overflow: hidden;          /* o scroll é no .kanban-container */
    display: flex;
}
.kanban-container {
    display: flex;
    gap: .9rem;
    flex: 1 1 auto;
    min-width: 0;
    /* Rola nos DOIS eixos por dentro do painel — não estoura nem corta quando há
       muitas colunas (x) ou muitos cards (y). */
    overflow: auto;
    align-items: flex-start;
    min-height: 50vh;
    /* "Segurar e arrastar" (kanban-drag-scroll.js) — cursor de mão na área vazia
       do board; vira "fechada" enquanto panela. */
    cursor: grab;
    /* Quando todas as colunas cabem na viewport, centraliza o conjunto;
       quando excede, cai pra flex-start e a scroll horizontal funciona normal. */
    justify-content: safe center;
}
.kanban-container.is-pan { cursor: grabbing; }
.kanban-container.is-pan * { cursor: grabbing !important; }
/* O header/área da coluna acompanha o "grab"; os CARDS têm cursor próprio
   (grab/move do drag deles) e os controles internos ficam normais. */
.kanban-cards { cursor: grab; }
.kanban-card { cursor: grab; }
.kanban-card a, .kanban-card button, .kanban-card input, .kanban-card .kanban-card-acao { cursor: pointer; }
/* Sem painel (compat): se o .kanban-container não estiver dentro de .kanban-panel
   ainda tem um respiro mínimo. */
.kanban-container:not(.kanban-panel > *) { scrollbar-width: thin; }
.kanban-vazio {
    flex: 1;
    text-align: center;
    color: var(--texto-fraco);
    padding: 3rem 1rem;
}
.kanban-vazio.erro { color: #b91c1c; }

.kanban-coluna {
    /* v1.1.56 — Mantém largura mínima e cresce quando há espaço.
       Antes era `flex:1 1 0; min-width:0` — colunas se espremiam quando
       havia muitas etapas, prejudicando a leitura dos cards. Agora:
       - flex-basis 260px (largura "alvo")
       - flex-shrink 0 (não encolhe abaixo do basis)
       - min-width 260px (defensivo contra flex-shrink herdado)
       - flex-grow 1 (com poucas etapas, ocupa o espaço todo proporcional)
       O container já tem overflow-x:auto, então scroll horizontal aparece
       automaticamente quando o total ultrapassa a viewport. */
    flex: 1 0 260px;
    min-width: 260px;
    /* Cap superior — em monitores largos com poucas etapas, evita que
       cada coluna estique até virar uma janela inteira, que descaracteriza
       a leitura tipo kanban. Com max-width definido, sobra espaço pro
       container fazer justify-content:safe center centralizar o conjunto. */
    max-width: 320px;
    /* Lane com leve definição (borda + tom suave) pra separar do fundo da
       página — antes era --bg-hover chapado, quase igual ao --bg, deixando o
       board com cara de "slab cinza cru". Só visual; não muda comportamento. */
    background: var(--bg-elevado);
    border: 1px solid var(--borda);
    border-radius: 12px;
    box-shadow: 0 1px 3px rgba(0,0,0,.04);
    display: flex;
    flex-direction: column;
    /* Altura limitada à do painel (o board já rola); a lista de cards rola por
       dentro da coluna. Sem cap em vh aqui — quem limita é o .kanban-panel. */
    max-height: 100%;
}
.kanban-coluna-header {
    padding: .75rem .85rem;
    border-bottom: 3px solid var(--etapa-cor, #6B7280);
    background: var(--bg-card);
    border-radius: 11px 11px 0 0;   /* nesta dentro da borda 12px da coluna */
    display: flex;
    justify-content: space-between;
    align-items: center;
}
.kanban-coluna-titulo {
    display: flex;
    align-items: center;
    gap: .5rem;
    font-size: .9rem;
}
.kanban-coluna-bolinha {
    width: 10px;
    height: 10px;
    border-radius: 50%;
    background: var(--etapa-cor, #6B7280);
    flex-shrink: 0;
}
.kanban-badge {
    background: #e5e7eb;
    color: var(--texto-medio);
    border-radius: 999px;
    padding: 0 .55rem;
    font-size: .75rem;
    font-weight: 600;
}
.kanban-coluna-total {
    color: #059669;
    font-weight: 600;
    font-size: .8rem;
}

.kanban-cards {
    padding: .5rem;
    flex: 1;
    overflow-y: auto;
    display: flex;
    flex-direction: column;
    gap: .5rem;
    min-height: 60px;
    transition: background .15s;
}
.kanban-cards.drag-over { background: #e0e7ff; }
.kanban-vazio-coluna {
    text-align: center;
    color: var(--texto-fraco);
    padding: 1rem;
    font-size: .8rem;
    border: 2px dashed #d1d5db;
    border-radius: 8px;
}

.kanban-card {
    background: var(--bg-card);
    border-radius: 8px;
    padding: .65rem .75rem;
    box-shadow: 0 1px 2px rgba(0,0,0,.05);
    border: 1px solid transparent;
    cursor: grab;
    transition: transform .12s, box-shadow .15s, border-color .15s;
    user-select: none;
}
.kanban-card:hover {
    border-color: var(--cor-primaria);
    box-shadow: 0 3px 10px rgba(0,0,0,.08);
}
.kanban-card.dragging {
    opacity: .55;
    transform: rotate(1.5deg);
    cursor: grabbing;
}
/* Cards em etapas terminais (ganha/perdida) — imutáveis */
.kanban-card.is-locked {
    cursor: not-allowed;
    background: var(--bg-elevado);
}
.kanban-card.is-locked:hover {
    border-color: transparent;
    box-shadow: 0 1px 2px rgba(0,0,0,.05);
    transform: none;
}
.kanban-card-lock {
    color: var(--texto-fraco);
    font-size: .75rem;
    flex-shrink: 0;
    margin-right: .25rem;
}
.kanban-card-header {
    display: flex;
    justify-content: space-between;
    align-items: flex-start;
    gap: .35rem;
    margin-bottom: .25rem;
}
.kanban-card-titulo {
    font-weight: 600;
    font-size: .9rem;
    color: var(--texto);
    line-height: 1.25;
    overflow-wrap: anywhere;
    flex: 1;
}
.kanban-card-badge {
    background: var(--primary-soft);
    color: #4338ca;
    border-radius: 4px;
    padding: .1rem .35rem;
    font-size: .65rem;
    font-weight: 600;
    flex-shrink: 0;
}
.kanban-card-valor {
    display: inline-block;
    background: rgba(16,185,129,.12);
    color: #059669;
    padding: .1rem .5rem;
    border-radius: 999px;
    font-size: .75rem;
    font-weight: 600;
    margin-bottom: .35rem;
}
.kanban-card-meta {
    display: flex;
    flex-direction: column;
    gap: .15rem;
}
.kanban-card-meta small {
    color: var(--texto-fraco);
    font-size: .75rem;
    display: flex;
    align-items: center;
    gap: .35rem;
}
.kanban-card-meta i { width: 12px; color: var(--texto-fraco); }

/* Modal de etapas */
.etapa-item {
    display: grid;
    grid-template-columns: 44px 1fr 130px auto auto;
    gap: .5rem;
    align-items: center;
    padding: .5rem;
    border-bottom: 1px solid #f1f5f9;
}
.etapa-item input[type="color"] {
    width: 44px; height: 36px; padding: 0; border: 1px solid var(--input-borda);
    border-radius: 6px; cursor: pointer; background: var(--bg-card);
}
.etapa-item input[type="text"], .etapa-item select {
    padding: .4rem .55rem;
    border: 1px solid var(--input-borda);
    border-radius: 6px;
    font-size: .9rem;
}
.etapas-vazio {
    padding: 1.5rem;
    text-align: center;
    color: var(--texto-fraco);
}
.etapa-form-inline {
    display: grid;
    grid-template-columns: 1fr 44px 140px auto;
    gap: .5rem;
    align-items: center;
    margin-top: 1rem;
    padding-top: 1rem;
    border-top: 1px solid #e5e7eb;
}
.etapa-form-inline input[type="text"], .etapa-form-inline select {
    padding: .5rem .65rem;
    border: 1px solid var(--input-borda);
    border-radius: 6px;
}
.etapa-form-inline input[type="color"] {
    width: 44px; height: 38px; padding: 0;
    border: 1px solid var(--input-borda); border-radius: 6px; cursor: pointer; background: var(--bg-card);
}

.btn-sm { padding: .35rem .55rem; font-size: .8rem; }

@media (max-width: 768px) {
    .funis-tabs { flex-direction: column; align-items: stretch; }
    .funis-tabs-acoes { justify-content: flex-end; }
    .funis-search, .funis-search-box { width: 100%; max-width: none; }
    .kanban-coluna { flex: 0 0 85vw; min-width: 85vw; }
    .etapa-item { grid-template-columns: 1fr; }
    .etapa-form-inline { grid-template-columns: 1fr; }
}

/* ----- Responsivo ----- */
@media (max-width: 768px) {
    /* Sidebar como drawer fullscreen com animação suave */
    .sidebar {
        position: fixed; z-index: 50; height: 100vh;
        transform: translateX(-100%);
        transition: transform .28s cubic-bezier(.4, 0, .2, 1);
        will-change: transform;
    }
    /* Abrir: slide-in da esquerda */
    .sidebar.aberta { transform: translateX(0); }
    /* Fechar: slide-out para a esquerda (.retraindo é adicionado pelo JS
       durante a animação; removido junto com .aberta ao final) */
    .sidebar.retraindo {
        transform: translateX(-100%);
        transition: transform .25s cubic-bezier(.4, 0, 1, 1);
    }
    .conteudo { padding: 1rem; }
}

/* ============================================================
   Kanban card — estilo "PipeRun" detalhado
   ============================================================
   Layout: corpo (esquerda) com título caps + lista vertical de
   campos icon+texto; lateral (direita) com avatar de iniciais
   e botão de ação (raio/lapis). Background tinge por status:
   aberta -> branco, ganha -> verde claro, perdida -> vermelho.
   Compartilhado entre /dashboard/funis e /dashboard/atendimentos.
   Histórico: regras estavam inline em funis.blade.php; foram
   trazidas pra cá para que atendimentos.blade.php tambem herde.
   ============================================================ */
.kanban-card-piperun {
    display: flex;
    align-items: stretch;
    gap: .6rem;
    padding: .65rem .65rem .65rem .8rem;
    border-left: 3px solid #e5e7eb;
    position: relative;
}
.kanban-card-piperun.is-ganha    { background: #ecfdf5; border-left-color: #10b981; }
.kanban-card-piperun.is-perdida  { background: #fef2f2; border-left-color: #ef4444; }
.kanban-card-piperun.is-aberta   { border-left-color: var(--cor-primaria, #FF6B00); }
.kanban-card-piperun.is-pendente { border-left-color: #f59e0b; }
.kanban-card-piperun.is-resolvido,
.kanban-card-piperun.is-concluido { background: #ecfdf5; border-left-color: #10b981; }
.kanban-card-piperun:hover {
    border-color: var(--cor-primaria, #FF6B00);
    box-shadow: 0 4px 12px rgba(0,0,0,.08);
}
.kanban-card-piperun.is-ganha:hover    { border-color: #10b981; }
.kanban-card-piperun.is-perdida:hover  { border-color: #ef4444; }
.kanban-card-piperun.is-congelada {
    background: var(--primary-soft);
    border-left-color: #2563eb;
    opacity: .85;
}
.kanban-card-piperun.is-congelada::after {
    content: "\f2dc"; /* fa-snowflake */
    font-family: "Font Awesome 6 Free";
    font-weight: 900;
    position: absolute;
    top: .5rem; right: .5rem;
    color: #2563eb;
    font-size: 1rem;
    opacity: .85;
}
.kanban-card-piperun.is-congelada:hover { border-color: #2563eb; }

/* Ticket encerrado no kanban — operador ainda vê o que fechou hoje,
   mas o card sai do fluxo: drag desligado, visual acinzentado, banner
   "Encerrado" no topo deixa o estado óbvio. Click no corpo continua
   abrindo a página de detalhe. */
.kanban-card-piperun.is-fechado {
    background: var(--bg-hover);
    border-left-color: var(--texto-fraco) !important;
    opacity: .82;
    cursor: pointer;
}
.kanban-card-piperun.is-fechado:hover { border-color: var(--texto-fraco); opacity: 1; }
.kanban-card-piperun.is-fechado .kanban-card-titulo {
    text-decoration: line-through;
    color: var(--texto-fraco);
}
.kanban-card-fechado-banner {
    display: flex;
    align-items: center;
    gap: .35rem;
    background: linear-gradient(135deg, #6b7280, #374151);
    color: #fff;
    padding: .25rem .55rem;
    border-radius: 6px 6px 0 0;
    margin: -.65rem -.65rem .5rem;
    font-size: .72rem;
    font-weight: 700;
    text-transform: uppercase;
    letter-spacing: .04em;
}
.kanban-card-fechado-banner i { font-size: .8rem; }

.kanban-card-corpo {
    flex: 1;
    min-width: 0;
    display: flex;
    flex-direction: column;
    gap: .4rem;
}
.kanban-card-piperun .kanban-card-titulo {
    font-weight: 700;
    font-size: .85rem;
    line-height: 1.2;
    color: var(--texto);
    text-transform: uppercase;
    letter-spacing: .01em;
    overflow: hidden;
    text-overflow: ellipsis;
    display: -webkit-box;
    -webkit-line-clamp: 2;
    -webkit-box-orient: vertical;
}
.kanban-card-campos {
    list-style: none;
    margin: 0;
    padding: 0;
    display: flex;
    flex-direction: column;
    gap: .2rem;
}
.kanban-card-campos li {
    display: flex;
    align-items: center;
    gap: .45rem;
    font-size: .76rem;
    color: var(--texto-medio);
    line-height: 1.25;
    min-width: 0;
}
.kanban-card-campos li i {
    width: 14px;
    color: var(--texto-fraco);
    font-size: .75rem;
    flex-shrink: 0;
}
.kanban-card-campos li span {
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
    flex: 1;
    min-width: 0;
}

.kanban-card-rodape {
    display: flex;
    align-items: center;
    gap: .35rem;
    flex-wrap: wrap;
    margin-top: .15rem;
    min-height: 0;
}
.kanban-card-rodape:empty { display: none; }

.kanban-card-lateral {
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: .35rem;
    flex-shrink: 0;
}
.kanban-card-avatar {
    width: 32px;
    height: 32px;
    border-radius: 50%;
    background: linear-gradient(135deg, var(--cor-primaria, #FF6B00), #f59e0b);
    color: #fff;
    display: flex;
    align-items: center;
    justify-content: center;
    font-size: .68rem;
    font-weight: 700;
    letter-spacing: .02em;
    flex-shrink: 0;
    box-shadow: 0 1px 3px rgba(0,0,0,.1);
}
.kanban-card-piperun.is-ganha .kanban-card-avatar    { background: linear-gradient(135deg, #10b981, #059669); }
.kanban-card-piperun.is-perdida .kanban-card-avatar  { background: linear-gradient(135deg, #ef4444, #b91c1c); }
.kanban-card-piperun.is-resolvido .kanban-card-avatar { background: linear-gradient(135deg, #10b981, #059669); }

.kanban-card-btn-acoes {
    appearance: none;
    background: var(--bg-card);
    border: 1px solid var(--borda);
    border-radius: 6px;
    width: 32px;
    height: 32px;
    padding: 0;
    font-size: .85rem;
    color: var(--texto-fraco);
    cursor: pointer;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    line-height: 1;
    transition: background-color .15s ease, color .15s ease, border-color .15s ease;
}
.kanban-card-btn-acoes:hover {
    background: rgba(255,107,44,.1);
    border-color: var(--cor-primaria, #FF6B00);
    color: var(--cor-primaria, #FF6B00);
}
.kanban-card.is-locked .kanban-card-btn-acoes {
    opacity: .45; cursor: not-allowed; pointer-events: none;
}

/* v1.1.56 — Variante "chat" do botao lateral (verde, igual marca do WhatsApp).
   Aplicado nos botoes que iniciam conversa do inbox a partir do kanban
   (oportunidades + tickets). */
.kanban-card-btn-chat {
    color: #25D366;
    border-color: rgba(37, 211, 102, .35);
}
.kanban-card-btn-chat:hover {
    background: rgba(37, 211, 102, .12);
    border-color: #25D366;
    color: #1da851;
}

/* Selo de aging — "X dias parado" no rodape. */
.kanban-card-parado {
    display: inline-flex;
    align-items: center;
    gap: .25rem;
    font-size: .68rem;
    padding: .1rem .4rem;
    border-radius: 99px;
    font-weight: 600;
    white-space: nowrap;
}
.kanban-card-parado.lvl-1 { background: #fef3c7; color: #92400e; }
.kanban-card-parado.lvl-2 { background: #fed7aa; color: #9a3412; }
.kanban-card-parado.lvl-3 { background: #fecaca; color: #991b1b; }

/* ============================================================
   Pill de prioridade / estado — usada no rodape do card
   ============================================================
   Substitui o pill antigo (bg solido + texto branco) que tinha
   contraste fraco em prioridade "Baixa" (#9CA3AF + #FFF, WCAG 2.6:1).
   Novo design: fundo claro tonalizado + texto escuro contrastante +
   icone colorido. Todas variantes >= 4.5:1 (WCAG AA pra texto normal).
   ============================================================ */
.kanban-card-pill {
    display: inline-flex;
    align-items: center;
    gap: .3rem;
    padding: .15rem .5rem;
    border-radius: 99px;
    font-size: .7rem;
    font-weight: 700;
    line-height: 1.2;
    letter-spacing: .01em;
    border: 1px solid transparent;
    white-space: nowrap;
}
.kanban-card-pill i { font-size: .75em; flex-shrink: 0; }

/* Variantes de prioridade (de baixa pra urgente) */
.kanban-card-pill.is-prio-low {
    background: var(--bg-hover);
    color: var(--texto-medio);
    border-color: var(--borda);
}
.kanban-card-pill.is-prio-low i { color: var(--texto-fraco); }

.kanban-card-pill.is-prio-normal {
    background: #dbeafe;
    color: #1e40af;
    border-color: #bfdbfe;
}
.kanban-card-pill.is-prio-normal i { color: #2563eb; }

.kanban-card-pill.is-prio-high {
    background: #ffedd5;
    color: #9a3412;
    border-color: color-mix(in srgb, var(--primary) 35%, transparent);
}
.kanban-card-pill.is-prio-high i { color: #ea580c; }

.kanban-card-pill.is-prio-urgent {
    background: #fee2e2;
    color: #991b1b;
    border-color: #fecaca;
}
.kanban-card-pill.is-prio-urgent i { color: #dc2626; }

/* Variante neutra (protocolo, etc.) */
.kanban-card-pill.is-neutro {
    background: var(--primary-soft);
    color: #3730a3;
    border-color: #c7d2fe;
}
.kanban-card-pill.is-neutro i { color: #4f46e5; }

/* v1.1.56 — Temperatura no card (FRIO/MORNO/QUENTE).
   Espelha cores do termometro nos detalhes (mesma identidade visual). */
.kanban-card-pill.is-temp-fria {
    background: #dbeafe;
    color: #1d4ed8;
    border-color: #93c5fd;
}
.kanban-card-pill.is-temp-fria i { color: #2563eb; }
.kanban-card-pill.is-temp-morna {
    background: #fef3c7;
    color: #92400e;
    border-color: #fcd34d;
}
.kanban-card-pill.is-temp-morna i { color: #d97706; }
.kanban-card-pill.is-temp-quente {
    background: #fee2e2;
    color: #991b1b;
    border-color: #fca5a5;
}
.kanban-card-pill.is-temp-quente i { color: #dc2626; }

/* ============================================================
   Seletor de idioma — card "Idioma" em /dashboard/configuracoes
   ============================================================ */
.config-item-expansivel {
    cursor: pointer;
    user-select: none;
}
.config-item-expansivel:hover {
    border-color: var(--cor-primaria, #FF6B00);
}
.config-item-expansivel .config-item-info {
    display: flex;
    flex-direction: column;
    line-height: 1.2;
}
.config-item-expansivel .config-item-info small {
    color: var(--texto-fraco);
    font-size: .78rem;
    margin-top: .1rem;
}
.config-item-chevron {
    margin-left: auto;
    color: var(--texto-fraco);
    transition: transform .2s ease;
    font-size: .8rem;
}
.config-item-expansivel.is-aberto .config-item-chevron {
    transform: rotate(180deg);
    color: var(--cor-primaria, #FF6B00);
}

.config-idioma-popover {
    margin-top: .5rem;
    background: var(--bg-card);
    border: 1px solid var(--borda);
    border-radius: 8px;
    padding: .65rem;
    box-shadow: 0 4px 12px rgba(0,0,0,.06);
    display: flex;
    flex-direction: column;
    gap: .25rem;
    animation: idiomaPopEntrada .15s ease;
}
.config-idioma-popover[hidden] { display: none; }
@keyframes idiomaPopEntrada {
    from { opacity: 0; transform: translateY(-4px); }
    to   { opacity: 1; transform: translateY(0); }
}
.config-idioma-help {
    color: var(--texto-fraco);
    font-size: .76rem;
    padding: 0 .25rem .35rem;
    border-bottom: 1px solid #f3f4f6;
    margin-bottom: .25rem;
}
.config-idioma-opcao {
    appearance: none;
    background: transparent;
    border: 1px solid transparent;
    border-radius: 6px;
    padding: .55rem .65rem;
    display: flex;
    align-items: center;
    gap: .6rem;
    font-size: .88rem;
    color: var(--texto);
    cursor: pointer;
    text-align: left;
    line-height: 1.2;
    transition: background-color .12s ease, border-color .12s ease;
}
.config-idioma-opcao:hover {
    background: var(--bg-elevado);
    border-color: var(--borda);
}
.config-idioma-opcao.is-ativa {
    background: var(--primary-soft);
    border-color: #c7d2fe;
    font-weight: 600;
    color: #3730a3;
}
.config-idioma-flag {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 28px;
    height: 20px;
    background: var(--bg-hover);
    border: 1px solid var(--borda);
    border-radius: 4px;
    font-size: .65rem;
    font-weight: 700;
    color: var(--texto-medio);
    letter-spacing: .03em;
    flex-shrink: 0;
}
.config-idioma-opcao.is-ativa .config-idioma-flag {
    background: #c7d2fe;
    border-color: #a5b4fc;
    color: #312e81;
}

/* Selo "Sistema" no card de funil (visivel na pagina de configuracao). */
.funil-config-badge-sistema {
    display: inline-flex;
    align-items: center;
    gap: .25rem;
    background: var(--primary-soft);
    color: #3730a3;
    border: 1px solid #c7d2fe;
    border-radius: 99px;
    padding: .15rem .55rem;
    font-size: .7rem;
    font-weight: 700;
    margin-left: .5rem;
    vertical-align: middle;
}
.funil-config-badge-sistema i { font-size: .8em; }
.funil-config-card.is-sistema {
    border: 1px solid #c7d2fe;
    box-shadow: 0 0 0 3px rgba(79, 70, 229, .08);
}
.funil-config-card.is-sistema .btn-card-danger {
    opacity: .35;
    cursor: not-allowed;
    pointer-events: none;
}

/* =============================================================
   MOBILE v1.1.59 — bloco único, sem duplicatas
   Só @media. Desktop (> 768px) intacto.
   ============================================================= */

/* ── SIDEBAR DRAWER fullscreen ─────────────────────────────── */
@media (max-width: 768px) {
    .sidebar {
        position: fixed; z-index: 400; height: 100vh;
        width: 100vw !important; max-width: 100vw !important;
        transform: translateX(-100%);
        transition: transform .28s cubic-bezier(.4,0,.2,1);
        will-change: transform;
    }
    .sidebar.aberta   { transform: translateX(0); }
    .sidebar.retraindo {
        transform: translateX(-100%);
        transition: transform .25s cubic-bezier(.4,0,1,1);
    }
    /* touch-action: manipulation garante que toque nos links é reconhecido
       como click em iOS Safari, mesmo com overflow-y:auto no sidebar-nav */
    .sidebar-nav a { touch-action: manipulation; }
    /* Header: logo + botão X */
    .sidebar.aberta .sidebar-header,
    .sidebar.aberta.colapsada .sidebar-header {
        display: flex !important;
        justify-content: space-between; align-items: center;
        padding: .9rem 1.25rem; min-height: 56px;
    }
    .sidebar.aberta .sidebar-app-name,
    .sidebar.aberta .sidebar-nav a span,
    .sidebar.aberta.colapsada .sidebar-app-name,
    .sidebar.aberta.colapsada .sidebar-nav a span { display: inline !important; }
    .sidebar.aberta .menu-secao span,
    .sidebar.aberta.colapsada .menu-secao span {
        position:static; background:transparent; padding:0;
        box-shadow:none; font-size:inherit; color:inherit;
    }
    /* Drawer mobile aberto: mostra a logo Entrega Jah! no header (mesmo colapsado). */
    .sidebar.aberta .sidebar-header,
    .sidebar.aberta.colapsada .sidebar-header { display:flex !important; }
    .sidebar.aberta.colapsada .sidebar-header::before { content:none; }
    /* Botão X */
    .sidebar-btn-fechar {
        display:flex; align-items:center; justify-content:center;
        width:40px; height:40px; border:0; border-radius:50%;
        background:var(--bg-hover); color:var(--texto);
        cursor:pointer; flex-shrink:0; font-size:1.1rem;
    }
    .sidebar-btn-fechar:active { background:var(--borda); }
    /* Links touch-friendly */
    .sidebar.aberta .sidebar-nav a,
    .sidebar.aberta.colapsada .sidebar-nav a {
        min-height:52px; padding:.8rem 1.25rem;
        font-size:1rem; border-left-width:4px;
    }
    .sidebar.aberta .sidebar-nav i,
    .sidebar.aberta.colapsada .sidebar-nav i { font-size:1.1rem; width:24px; }
    .sidebar.aberta .menu-secao,
    .sidebar.aberta.colapsada .menu-secao { padding:1rem 1.25rem .35rem; font-size:.7rem; }
    body:has(.layout-dashboard .sidebar.aberta)::before { content:none !important; }
    .conteudo { padding:1rem .75rem; }
}

/* ── TOPBAR ─────────────────────────────────────────────────── */
@media (max-width: 768px) {
    .topbar { padding:0 .75rem; height:56px; min-height:56px; gap:.4rem; flex-shrink:0; }
    #btnToggleSidebar {
        width:40px; height:40px; min-width:40px; padding:0; border-radius:10px;
        font-size:1.15rem; flex-shrink:0; display:flex; align-items:center; justify-content:center;
    }
    .topbar-title { font-size:.95rem; font-weight:600; flex:1; white-space:nowrap; overflow:hidden; text-overflow:ellipsis; min-width:0; }
    .topbar-actions { gap:.2rem; }
    .notif-trigger {
        width:40px; height:40px; padding:0; border-radius:10px;
        display:flex; align-items:center; justify-content:center; font-size:1.1rem;
    }
    .user-menu-nome, .user-menu-chevron { display:none !important; }
    .user-menu-trigger {
        width:40px; height:40px; padding:0; border-radius:50%;
        display:flex; align-items:center; justify-content:center;
    }
    .user-menu-trigger-avatar i { font-size:1.4rem; }
}
@media (max-width: 480px) {
    .topbar { padding:0 .5rem; gap:.3rem; }
    .topbar-title { font-size:.88rem; }
}

/* ── USER-MENU bottom-sheet ─────────────────────────────────── */
@media (max-width: 768px) {
    .user-menu-popup {
        position:fixed !important;
        top:auto !important; bottom:0 !important; left:0 !important; right:0 !important;
        width:100% !important; max-width:100% !important; min-width:0 !important;
        border-radius:20px 20px 0 0 !important;
        padding:0 0 env(safe-area-inset-bottom,16px) !important;
        z-index:300 !important;
        box-shadow:0 -4px 32px rgba(0,0,0,.18) !important;
        max-height:85vh; overflow-y:auto;
        transform:translateY(8px) !important;
        transition:transform .2s cubic-bezier(.2,.8,.2,1) !important;
    }
    .user-menu.aberto .user-menu-popup { transform:translateY(0) !important; }
    .user-menu-popup::before {
        content:''; display:block; width:36px; height:4px;
        background:var(--borda-forte); border-radius:2px; margin:10px auto 6px;
    }
    .user-menu-item { min-height:52px; padding:.85rem 1.25rem; font-size:.95rem; border-radius:0; }
    .user-menu-cabecalho { padding:.85rem 1.25rem 1rem; }
    .user-menu-sub-item  { padding-left:2rem; min-height:46px; }
}

/* ── NOTIFICAÇÕES bottom-sheet ──────────────────────────────── */
@media (max-width: 768px) {
    .notif-popup {
        position:fixed !important;
        top:auto !important; bottom:0 !important; left:0 !important; right:0 !important;
        width:100% !important; max-width:100% !important;
        border-radius:20px 20px 0 0 !important;
        max-height:80vh; overflow-y:auto;
        z-index:300 !important;
        box-shadow:0 -4px 32px rgba(0,0,0,.18) !important;
        padding-bottom:env(safe-area-inset-bottom,16px);
        transform:translateY(8px);
        transition:transform .2s cubic-bezier(.2,.8,.2,1);
    }
    .notif-menu.aberto .notif-popup { transform:translateY(0); }
    .notif-popup::before {
        content:''; display:block; width:36px; height:4px;
        background:var(--borda-forte); border-radius:2px; margin:10px auto 4px;
    }
    .notif-cabecalho { padding:.75rem 1.25rem; }
    .notif-item { padding:.8rem 1.25rem; min-height:64px; }
    .notif-btn-fechar { display:none; }
}

/* ── MODAIS bottom-sheet ────────────────────────────────────── */
@media (max-width: 768px) {
    .modal-dialog,
    .modal-dialog.modal-sm {
        position:fixed !important;
        bottom:0 !important; left:0 !important; right:0 !important; top:auto !important;
        max-width:100% !important; width:100% !important; margin:0 !important; padding:0 !important;
    }
    .modal-dialog .modal-content,
    .modal-dialog.modal-sm .modal-content {
        border-radius:20px 20px 0 0 !important; max-height:92vh !important;
        padding-bottom:env(safe-area-inset-bottom,0px);
    }
    .modal-dialog .modal-content::before,
    .modal-dialog.modal-sm .modal-content::before {
        content:''; display:block; flex-shrink:0;
        width:36px; height:4px; background:var(--borda-forte);
        border-radius:2px; margin:10px auto 2px;
    }
    .modal-dialog.modal-lg,
    .modal-dialog.modal-xl {
        position:fixed !important;
        top:4vh !important; bottom:0 !important; left:0 !important; right:0 !important;
        max-width:100% !important; width:100% !important; margin:0 !important; padding:0 !important;
    }
    .modal-dialog.modal-lg .modal-content,
    .modal-dialog.modal-xl .modal-content {
        border-radius:20px 20px 0 0 !important; max-height:96vh !important; height:96vh;
    }
    .modal-dialog.modal-lg .modal-content::before,
    .modal-dialog.modal-xl .modal-content::before { display:none; }
    .modal-header { padding:.85rem 1.25rem; }
    .modal-body { padding:.9rem 1.25rem; overscroll-behavior:contain; -webkit-overflow-scrolling:touch; }
    /* Preview: no bottom-sheet mobile o .modal-content já tem height:96vh,
       então o corpo só precisa preencher o que sobra (flex), sem altura fixa
       nem padding — o iframe/imagem encosta nas bordas. */
    .preview-body { height:auto; flex:1 1 auto; padding:0; min-height:0; }
    .modal-footer {
        padding:.75rem 1.25rem;
        padding-bottom:calc(.75rem + env(safe-area-inset-bottom,0px));
        flex-wrap:wrap; gap:.5rem;
    }
    .modal-footer .btn { flex:1 1 auto; min-height:46px; font-size:.95rem; }
    .modal-body input,
    .modal-body select,
    .modal-body textarea { font-size:16px !important; }
    .modal-body .form-row { grid-template-columns:1fr !important; }
    .modal-body .form-section-title { font-size:.85rem; margin:.9rem 0 .4rem; }
}

/* ── FORMULÁRIOS anti-zoom iOS ──────────────────────────────── */
@media (max-width: 768px) {
    .form-group input,
    .form-group select,
    .form-group textarea { font-size:16px; }
    .form-group label { font-size:.88rem; margin-bottom:.3rem; }
    .btn-toggle-senha { min-width:44px; min-height:44px; }
}

/* ══════════════════════════════════════════════════════════════
   PAGE HEADER: título + busca + ações
   ══════════════════════════════════════════════════════════════ */
@media (max-width: 768px) {
    .page-header { flex-direction:column; align-items:flex-start; gap:.5rem; margin-bottom:.85rem; }
    .page-header h2 { font-size:1.1rem; }
    /* Ações: coluna, full-width */
    .page-actions { display:flex; flex-direction:column; width:100%; gap:.45rem; }
    .page-actions input[type="search"],
    .page-actions .leads-search,
    .page-actions .customers-search {
        width:100% !important; min-width:0 !important;
        font-size:16px; min-height:44px; box-sizing:border-box;
    }
    /* v1.1.73 — search-box full-width + touch-friendly no mobile */
    .page-actions .search-box, .search-box--full {
        width:100% !important; min-width:0 !important; box-sizing:border-box;
    }
    .page-actions .search-box > input { font-size:16px; }
    .page-actions .btn { width:100%; justify-content:center; min-height:46px; font-size:.95rem; }
    /* Quando há só 2 botões de ação (sem search), ficam lado-a-lado */
    .page-actions:not(:has(input)) .btn { flex:1; }
    .page-actions:not(:has(input)) { flex-direction:row; flex-wrap:wrap; }
}

/* ══════════════════════════════════════════════════════════════
   TABELAS → CARDS (≤ 600px)
   ══════════════════════════════════════════════════════════════ */
@media (max-width: 600px) {
    .tabela thead { display:none; }
    .tabela tbody tr {
        display:block; border:1px solid var(--borda); border-radius:12px;
        margin-bottom:.7rem; background:var(--bg-card);
        box-shadow:var(--sombra); overflow:hidden;
    }
    .tabela tbody tr:has(.td-loading),
    .tabela tbody tr:has(.td-vazio) { border:0; box-shadow:none; background:transparent; }
    .tabela td {
        display:flex; align-items:flex-start; gap:.5rem;
        padding:.55rem .9rem; font-size:.88rem;
        border-bottom:1px solid var(--borda);
        border-left:0; border-right:0; border-top:0;
        word-break:break-word; min-height:44px;
    }
    .tabela td:last-child { border-bottom:0; }
    .tabela td[data-label]::before {
        content:attr(data-label); font-weight:600; font-size:.7rem;
        color:var(--texto-fraco); min-width:80px; flex-shrink:0;
        padding-top:.15rem; text-transform:uppercase; letter-spacing:.02em;
    }
    /* Primeira célula: cabeçalho do card */
    .tabela td:first-child {
        background:var(--bg-elevado); font-weight:600; font-size:.9rem;
        padding:.7rem .9rem; min-height:48px;
    }
    .tabela td:first-child::before { display:none; }
    /* Ações: rodapé */
    .tabela td.td-acoes {
        justify-content:flex-end; padding:.5rem .9rem;
        background:var(--bg-elevado); gap:.35rem;
    }
    .tabela td.td-acoes::before { display:none; }
    .tabela td.td-acoes .btn,
    .tabela td.td-acoes .btn-acao { min-height:38px; min-width:38px; border-radius:8px; }
}

/* ══════════════════════════════════════════════════════════════
   LEADS — search + botão lado a lado no mobile
   ══════════════════════════════════════════════════════════════ */
@media (max-width: 768px) {
    /* Search + botão ficam em linha (search cresce, botão fixo) */
    #leadsSearch + .btn, .leads-search + .btn {
        width: auto !important; flex-shrink: 0;
    }
    .page-actions:has(.leads-search) {
        flex-direction: row;
    }
    .page-actions:has(.leads-search) .leads-search {
        flex: 1; min-width: 0;
    }
    .page-actions:has(.leads-search) .btn {
        width: auto; flex-shrink: 0;
    }
}

/* ══════════════════════════════════════════════════════════════
   CUSTOMERS — search + filtros
   ══════════════════════════════════════════════════════════════ */
@media (max-width: 768px) {
    /* Search + botão em linha */
    .page-actions:has(.customers-search) { flex-direction:row; }
    .page-actions:has(.customers-search) .customers-search { flex:1; min-width:0; }
    .page-actions:has(.customers-search) .btn { width:auto; flex-shrink:0; }
    /* Filtros: wrap horizontal compacto */
    .customers-filtros { display:flex; flex-wrap:wrap; gap:.5rem; align-items:flex-end; padding:.75rem; }
    .customers-filtro { flex:1 1 140px; min-width:120px; display:flex; flex-direction:column; gap:.2rem; }
    .customers-filtro label { font-size:.8rem; font-weight:600; color:var(--texto-fraco); }
    .customers-filtro select { font-size:16px; width:100%; min-height:42px; }
    .customers-filtros .btn { flex:1 1 100%; min-height:42px; }
}

/* ══════════════════════════════════════════════════════════════
   CAMPANHAS — dois botões lado a lado
   ══════════════════════════════════════════════════════════════ */
@media (max-width: 768px) {
    /* Descrição da campanha: compacta */
    .page-header + p[data-i18n="campanhas_descricao"],
    .page-header + p { font-size:.85rem; margin-bottom:.75rem; }
}

/* ══════════════════════════════════════════════════════════════
   KANBAN (funis + atendimentos) — scroll-snap
   ══════════════════════════════════════════════════════════════ */
@media (max-width: 768px) {
    /* Abas funis */
    .funis-tabs { flex-direction:column; gap:.5rem; margin-bottom:.65rem; padding:.45rem; }
    .funis-tabs-list { overflow-x:auto; scroll-snap-type:x mandatory; -webkit-overflow-scrolling:touch; gap:.3rem; padding-bottom:.2rem; }
    .funis-tab { scroll-snap-align:start; padding:.45rem .7rem; font-size:.82rem; min-height:38px; white-space:nowrap; }
    /* Filtros funis: linha compacta */
    .funis-tabs-acoes { flex-wrap:wrap; gap:.4rem; width:100%; padding-right:0; }
    .funis-tabs-acoes .funis-search-box { flex:1; min-width:0; max-width:none; }
    .funis-tabs-acoes .funis-search-box > input { font-size:16px; }
    .funis-tabs-acoes .funis-periodo { font-size:16px; flex:1 1 120px; min-height:42px; }
    .funis-tabs-acoes .funis-toggle-concluidas { flex:0 0 auto; min-height:42px; padding:.4rem .7rem; font-size:.82rem; }
    .funis-tabs-acoes .funis-selo { display:none; }
    /* Período custom */
    .funis-periodo-custom { flex-wrap:wrap; gap:.4rem; margin-bottom:.5rem; }
    .funis-periodo-custom label { flex:1 1 140px; display:flex; flex-direction:column; gap:.2rem; font-size:.85rem; }
    .funis-periodo-custom input[type="date"] { font-size:16px; width:100%; min-height:42px; }
    .funis-periodo-custom .btn { flex:1 1 auto; min-height:42px; }
    /* Kanban: scroll-snap */
    .kanban-panel { padding:.6rem; max-height:none; overflow:visible; }   /* no mobile o painel não limita; a página rola */
    .kanban-container { gap:.65rem; scroll-snap-type:x mandatory; -webkit-overflow-scrolling:touch; }
    .kanban-coluna { flex:0 0 82vw; min-width:82vw; max-width:82vw; scroll-snap-align:start; max-height:calc(100vh - 210px); }
    /* Indicador scroll: primeiro card parcialmente visível */
    .kanban-container::after { content:''; flex:0 0 .5rem; }
}

/* ══════════════════════════════════════════════════════════════
   INBOX — layout 3 colunas → single-pane
   ══════════════════════════════════════════════════════════════ */
@media (max-width: 768px) {
    .omni-page { margin:-1rem -.75rem -.75rem -.75rem; height:calc(100vh - 56px); }
    .omni-header { padding:.6rem .9rem; flex-wrap:wrap; gap:.35rem; }
    .omni-title h2 { font-size:1rem; }
    .omni-subtitle { display:none; }
    .omni-acoes-bar { padding:.4rem .9rem; gap:.5rem; }
    .omni-layout { grid-template-columns:1fr; }
    .omni-lista { border-right:0; }
    .omni-filtros { width:calc(100vw - 1rem) !important; }
    .omni-item { padding:.65rem .9rem; gap:.5rem; }
    .omni-item-avatar { width:38px; height:38px; font-size:.82rem; }
}
@media (max-width: 480px) {
    .omni-page { margin:-.75rem -.5rem -.75rem -.5rem; }
}

/* ══════════════════════════════════════════════════════════════
   OPORTUNIDADES — filtros em grid 2 colunas
   ══════════════════════════════════════════════════════════════ */
@media (max-width: 768px) {
    .op-list-filtros .card-body { padding:.75rem; }
    .op-list-filtros-grid {
        grid-template-columns:1fr 1fr !important;
        gap:.5rem !important;
    }
    /* Busca ocupa linha inteira */
    .op-list-filtros-grid .form-group:first-child { grid-column:1/-1; }
    .op-list-filtros-grid .form-group input,
    .op-list-filtros-grid .form-group select { font-size:16px; min-height:42px; }
    /* Botão buscar: linha inteira */
    .op-list-filtros-grid + .btn,
    .op-list-buscar { width:100%; min-height:44px; margin-top:.35rem; }
}

/* ══════════════════════════════════════════════════════════════
   DASHBOARD HOME — KPI 2 colunas
   ══════════════════════════════════════════════════════════════ */
@media (max-width: 768px) {
    .dashboard-grid { grid-template-columns:repeat(2,1fr); gap:.6rem; }
    .dashboard-card { padding:.85rem .75rem; }
    .dashboard-card .icon { width:34px; height:34px; font-size:.9rem; margin-bottom:.45rem; }
    .dashboard-card .valor { font-size:1.2rem; }
    .dashboard-card .label { font-size:.73rem; }
    .dashboard-secao-charts,
    .dash-charts-row { flex-direction:column !important; gap:.6rem; }
    .dash-chart-col { width:100% !important; min-width:0; }
    /* Ações do dashboard: oculta texto, só ícone */
    .page-actions:has(#dashBtnAtualizar) { flex-direction:row; flex-wrap:wrap; }
    .page-actions:has(#dashBtnAtualizar) .btn { flex:1 1 auto; min-height:40px; font-size:.82rem; padding:.4rem .6rem; }
}
@media (max-width: 420px) {
    .dashboard-grid { grid-template-columns:1fr; }
}

/* ══════════════════════════════════════════════════════════════
   PERFIL — 1 coluna, avatar centralizado
   ══════════════════════════════════════════════════════════════ */
@media (max-width: 768px) {
    .perfil-grid { grid-template-columns:1fr !important; gap:.75rem; }
    .perfil-dados-header { flex-wrap:wrap; gap:.5rem; align-items:flex-start; }
    .perfil-foto-area { text-align:center; }
    .perfil-foto-area .perfil-avatar-preview { margin:0 auto; }
    .perfil-foto-acoes { justify-content:center; flex-wrap:wrap; gap:.4rem; }
    .perfil-foto-acoes .btn { flex:1 1 auto; min-height:42px; }
    .perfil-grid .form-row,
    .perfil-grid div[style*="grid-template-columns"] { grid-template-columns:1fr !important; }
}

/* ══════════════════════════════════════════════════════════════
   CONFIGURAÇÕES — 1 coluna, cards maiores
   ══════════════════════════════════════════════════════════════ */
@media (max-width: 768px) {
    .config-colunas { grid-template-columns:1fr !important; gap:.75rem; }
}

/* ══════════════════════════════════════════════════════════════
   APARÊNCIA — 1 coluna
   ══════════════════════════════════════════════════════════════ */
@media (max-width: 768px) {
    .aparencia-grid { grid-template-columns:1fr !important; }
    /* Botões salvar/remover lado a lado */
    .aparencia-grid div[style*="display:flex"][style*="gap"] { flex-wrap:wrap; }
    .aparencia-grid div[style*="display:flex"] .btn { flex:1 1 auto; min-height:44px; }
}

/* ══════════════════════════════════════════════════════════════
   PEDIDOS — tabela → cards
   ══════════════════════════════════════════════════════════════ */
@media (max-width: 600px) {
    /* pedidos tem colunas largas — card view já cuida via .tabela rules */
}

/* ══════════════════════════════════════════════════════════════
   OPORTUNIDADE DETALHE — painel lateral → inferior
   ══════════════════════════════════════════════════════════════ */
@media (max-width: 768px) {
    .oport-layout { flex-direction:column !important; }
    .oport-sidebar {
        width:100% !important; max-width:100% !important;
        border-left:0 !important; border-top:1px solid var(--borda);
    }
    .oport-tabs { overflow-x:auto; -webkit-overflow-scrolling:touch; white-space:nowrap; }
    .oport-tab { padding:.5rem .75rem; font-size:.85rem; min-height:42px; }
    /* Picker de lead dentro do modal */
    .lead-tabs { flex-wrap:wrap; gap:.35rem; }
    .lead-tab  { flex:1 1 auto; justify-content:center; min-height:42px; }
    .lead-resultados { max-height:180px; overflow-y:auto; }
}

/* ══════════════════════════════════════════════════════════════
   PICKER DE LEAD/CLIENTE (modal Nova oportunidade) — base desktop.
   Antes só tinha regra mobile: as abas ficavam sem cara de aba e o
   painel de busca grudava no campo seguinte (Nome). Damos respiro
   embaixo do painel e um visual de aba consistente. ────────────── */
.lead-tabs {
    display: flex;
    gap: .4rem;
    margin: .35rem 0 .6rem;
}
.lead-tab {
    display: inline-flex;
    align-items: center;
    gap: .4rem;
    padding: .45rem .8rem;
    border: 1.5px solid var(--input-borda);
    border-radius: var(--raio);
    background: var(--input-bg);
    color: var(--texto-fraco);
    font-size: .85rem;
    font-weight: 600;
    cursor: pointer;
    transition: border-color .15s ease, color .15s ease, background .15s ease;
}
.lead-tab:hover { border-color: var(--borda-forte); color: var(--texto); }
.lead-tab.ativa {
    border-color: var(--primary);
    color: var(--primary);
    background: var(--primary-soft);
}
/* O painel de busca não pode encostar no campo de baixo (Nome). */
.lead-painel { margin-bottom: 1rem; }
.lead-painel:last-child { margin-bottom: 0; }
.lead-resultados:not(:empty) { margin-top: .4rem; }
.lead-selecionado {
    display: flex;
    align-items: center;
    gap: .5rem;
    margin-top: .4rem;
    padding: .5rem .7rem;
    border: 1.5px solid var(--primary);
    border-radius: var(--raio);
    background: var(--primary-soft);
    font-size: .9rem;
}
.lead-selecionado .btn-icone { margin-left: auto; }

/* ══════════════════════════════════════════════════════════════
   CARDS / CARD-BODY
   ══════════════════════════════════════════════════════════════ */
@media (max-width: 768px) {
    .card-body  { padding:.85rem; }
    .card-header { padding:.75rem .85rem; }
}

/* ══════════════════════════════════════════════════════════════
   PAGINAÇÃO
   ══════════════════════════════════════════════════════════════ */
@media (max-width: 600px) {
    .crud-paginacao { flex-direction:column; align-items:flex-start; gap:.4rem; font-size:.8rem; }
    .crud-paginacao-controles { align-self:stretch; justify-content:space-between; }
    .crud-paginacao-controles .btn { min-height:38px; min-width:38px; }
}

/* ══════════════════════════════════════════════════════════════
   LOGIN
   ══════════════════════════════════════════════════════════════ */
@media (max-width: 768px) {
    .login-card input { font-size:16px; }
    .login-card .btn  { min-height:50px; font-size:1rem; font-weight:600; }
}
@media (max-width: 480px) {
    .login-card { padding:1.75rem 1.25rem; max-width:100%; }
    .login-container { padding:1rem .75rem; }
    .conteudo { padding:.75rem .5rem; }
}

/* ══════════════════════════════════════════════════════════════
   RELATÓRIOS
   ══════════════════════════════════════════════════════════════ */
@media (max-width: 768px) {
    .relatorio-presets { flex-wrap:wrap; gap:.35rem; }
    .relatorio-presets .btn { flex:1 1 80px; min-height:38px; font-size:.82rem; }
    .relatorio-form-row { grid-template-columns:1fr !important; }
}

/* =============================================================
   FIM MOBILE v1.1.59
   ============================================================= */

/* =============================================================
   MOBILE v1.1.60 — cobertura completa de todos os módulos
   Desktop (> 768px) intacto. Só @media abaixo.
   ============================================================= */

/* ══════════════════════════════════════════════════════════════
   GLOBAIS COMPLEMENTARES
   ══════════════════════════════════════════════════════════════ */
@media (max-width: 768px) {
    /* page-subtitle: compacta e não ocupa muito espaço vertical */
    .page-subtitle { font-size:.82rem !important; margin-top:.2rem !important; margin-bottom:.5rem !important; line-height:1.4; }

    /* btn-sm: touch target mínimo 38px sem quebrar visual */
    .btn-sm { min-height:38px; padding:.35rem .65rem; font-size:.82rem; }

    /* btn-acao (ícone inline nas tabelas): touch target */
    .btn-acao { min-height:38px; min-width:38px; }

    /* input-senha: botão de olho touch-friendly */
    .input-senha .btn-toggle-senha { min-width:44px; min-height:44px; }
    .input-senha input { padding-right:3rem; }

    /* chk-pill e check-inline: área de toque maior */
    .chk-pill,
    .check-inline { min-height:40px; display:flex; align-items:center; }

    /* alerta-info: padding confortável */
    .alerta-info { padding:.7rem .9rem; font-size:.88rem; gap:.5rem; }

    /* modal-tabs: scroll horizontal */
    .modal-tabs { overflow-x:auto; -webkit-overflow-scrolling:touch; white-space:nowrap; flex-wrap:nowrap; padding-bottom:2px; }
    .modal-tab   { flex-shrink:0; min-height:40px; padding:.45rem .8rem; font-size:.85rem; }

    /* progress overlay: texto legível */
    .progress-info { font-size:.85rem; }
    .progress-current-item { font-size:.78rem; }

    /* table-responsive: garante scroll lateral em tabelas não convertidas */
    .table-responsive { overflow-x:auto; -webkit-overflow-scrolling:touch; border-radius:var(--raio); }
}

/* ══════════════════════════════════════════════════════════════
   PERMISSÕES (cargos) — matriz colapsa para lista
   ══════════════════════════════════════════════════════════════ */
@media (max-width: 768px) {
    .permissoes-grid { grid-template-columns:1fr !important; }
    .permissoes-cabecalho-acoes { flex-wrap:wrap; gap:.4rem; }
    .permissoes-cabecalho-acoes .btn { flex:1 1 auto; min-height:40px; }
    .permissoes-bloco { overflow-x:auto; }
    /* Matriz: header fixo, colunas mínimas */
    .permissoes-matriz { min-width:480px; font-size:.8rem; }
    .perm-cel-menu  { min-width:130px; }
    .perm-cel-acao  { min-width:70px; text-align:center; }
    .perm-chk       { width:20px; height:20px; }
    /* Grupos: seta e resumo compactos */
    .perm-grupo-toggle { padding:.55rem .75rem; }
    .perm-grupo-titulo { font-size:.88rem; }
    .perm-grupo-resumo { font-size:.75rem; }
    /* Subseção: identação menor */
    .perm-subsecao-cab { padding:.45rem .75rem .45rem 1.5rem; }
    .perm-subsecao-titulo { font-size:.82rem; }
    .perm-matriz-linha { padding:.35rem .75rem; }
}

/* ══════════════════════════════════════════════════════════════
   SETORES / FUNÇÕES — blocos em coluna única
   ══════════════════════════════════════════════════════════════ */
@media (max-width: 768px) {
    .setores-lista  { gap:.5rem; }
    .setores-bloco  { padding:.75rem; }
    .funcoes-grid   { grid-template-columns:1fr 1fr !important; gap:.4rem; }
    .funcoes-bloco  { padding:.55rem .7rem; font-size:.85rem; min-height:40px; }
}

/* ══════════════════════════════════════════════════════════════
   ADMINISTRADORES — grupos accordion
   ══════════════════════════════════════════════════════════════ */
@media (max-width: 768px) {
    .adm-grupo-toggle { padding:.7rem .9rem; min-height:48px; }
    .adm-grupo-count  { font-size:.78rem; }
}

/* ══════════════════════════════════════════════════════════════
   PLANOS / SERVIÇOS — filtro pill-bar scroll horizontal
   ══════════════════════════════════════════════════════════════ */
@media (max-width: 768px) {
    /* Barra de filtro tipo (pills): scroll horizontal */
    [class*="filtro-tipo-bar"],
    .filtro-tipo-bar {
        overflow-x:auto; -webkit-overflow-scrolling:touch;
        white-space:nowrap; flex-wrap:nowrap;
        padding-bottom:4px; gap:.35rem; margin-bottom:.65rem;
    }
    [class*="filtro-tipo-pill"],
    .filtro-tipo-pill {
        flex-shrink:0; min-height:38px;
        padding:.35rem .75rem; font-size:.82rem;
    }
    [class*="filtro-tipo-badge"],
    .filtro-tipo-badge { font-size:.7rem; padding:.1rem .35rem; }
}
@media (max-width: 480px) {
    .filtro-tipo-label { display:none; }   /* só ícone + badge em telas muito pequenas */
}

/* ══════════════════════════════════════════════════════════════
   COMUNICAÇÃO — hub de cards + seções
   ══════════════════════════════════════════════════════════════ */
@media (max-width: 768px) {
    /* Hub cards empilhados */
    [class*="comunicacao-hub"],
    .comunicacao-hub { gap:.55rem; }
    [class*="com-hub-card"],
    .com-hub-card {
        padding:.85rem 1rem; border-radius:10px;
        min-height:64px; gap:.75rem; align-items:center;
    }
    [class*="com-hub-icone"],
    .com-hub-icone { width:40px; height:40px; border-radius:10px; font-size:1.1rem; flex-shrink:0; }
    [class*="com-hub-info"],
    .com-hub-info  { flex:1; min-width:0; }
    [class*="com-hub-resumo"],
    .com-hub-resumo{ font-size:.8rem; white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
    [class*="com-hub-seta"],
    .com-hub-seta  { flex-shrink:0; color:var(--texto-fraco); }
    /* Grid de seções internas: coluna única */
    [class*="comunicacao-grid"],
    .comunicacao-grid { grid-template-columns:1fr !important; gap:.65rem; }
}

/* ══════════════════════════════════════════════════════════════
   REDES SOCIAIS — tabs + feed de posts
   ══════════════════════════════════════════════════════════════ */
@media (max-width: 768px) {
    /* Tabs: scroll horizontal */
    [class*="redes-tabs"],
    .redes-tabs { overflow-x:auto; -webkit-overflow-scrolling:touch; white-space:nowrap; flex-wrap:nowrap; padding-bottom:4px; gap:.3rem; margin-bottom:.65rem; }
    [class*="redes-tab"]:not([class*="redes-tab-acoes"]),
    .redes-tab   { flex-shrink:0; min-height:38px; padding:.35rem .75rem; font-size:.85rem; }
    [class*="redes-tab-acoes"],
    .redes-tab-acoes { flex-shrink:0; display:flex; align-items:center; gap:.35rem; }
    .redes-tab-acoes .btn { min-height:38px; }
    /* Feed: 1 coluna */
    [class*="redes-feed"],
    .redes-feed  { grid-template-columns:1fr !important; gap:.65rem; }
    /* Card de post */
    [class*="redes-post-card"],
    .redes-post-card { border-radius:10px; }
    [class*="redes-post-midia"],
    .redes-post-midia { border-radius:8px 8px 0 0; max-height:200px; object-fit:cover; }
    [class*="redes-post-body"],
    .redes-post-body { padding:.75rem; }
    [class*="redes-post-acoes"],
    .redes-post-acoes { padding:.5rem .75rem; gap:.35rem; flex-wrap:wrap; }
    .redes-post-acoes .btn { flex:1 1 auto; min-height:38px; font-size:.82rem; }
}

/* ══════════════════════════════════════════════════════════════
   LOGS — dashboard de stats + filtros
   ══════════════════════════════════════════════════════════════ */
@media (max-width: 768px) {
    /* Stats: 2 colunas */
    [class*="logs-dashboard"],
    .logs-dashboard { display:grid !important; grid-template-columns:1fr 1fr; gap:.55rem; margin-bottom:.85rem; }
    [class*="logs-stat"],
    .logs-stat { padding:.7rem .85rem; border-radius:10px; gap:.5rem; }
    [class*="logs-stat-value"],
    .logs-stat-value { font-size:1.25rem; }
    [class*="logs-stat-label"],
    .logs-stat-label { font-size:.73rem; }
    [class*="logs-stat-icon"],
    .logs-stat-icon { width:32px; height:32px; font-size:.9rem; border-radius:8px; flex-shrink:0; }
    /* Toolbar: empilha linha por linha */
    [class*="logs-toolbar"],
    .logs-toolbar { flex-wrap:wrap; gap:.45rem; }
    .logs-toolbar input[type="search"],
    .logs-toolbar select { font-size:16px; min-height:42px; flex:1 1 140px; }
    .logs-toolbar .btn  { min-height:42px; }
    /* Filtros: coluna única */
    [class*="logs-filtros"],
    .logs-filtros { flex-wrap:wrap; gap:.4rem; }
    .logs-filtros select,
    .logs-filtros input { font-size:16px; flex:1 1 140px; min-height:42px; }
    /* Paginação logs */
    [class*="logs-paginacao"],
    .logs-paginacao { flex-direction:column; align-items:flex-start; gap:.4rem; font-size:.8rem; }
}
@media (max-width: 480px) {
    .logs-dashboard { grid-template-columns:1fr 1fr; }
}

/* ══════════════════════════════════════════════════════════════
   CONTA DA EMPRESA — grid 1 coluna
   ══════════════════════════════════════════════════════════════ */
@media (max-width: 768px) {
    [class*="conta-grid"],
    .conta-grid { grid-template-columns:1fr !important; gap:.65rem; }
    /* form-row dentro de conta: 1 coluna */
    .conta-grid .form-row,
    .conta-grid [style*="grid-template-columns"] { grid-template-columns:1fr !important; }
}

/* ══════════════════════════════════════════════════════════════
   NPS — tabs horizontais
   ══════════════════════════════════════════════════════════════ */
@media (max-width: 768px) {
    [class*="nps-tabs"],
    .nps-tabs { overflow-x:auto; -webkit-overflow-scrolling:touch; white-space:nowrap; flex-wrap:nowrap; gap:.3rem; padding-bottom:4px; }
    [class*="nps-tab"],
    .nps-tab  { flex-shrink:0; min-height:38px; padding:.35rem .8rem; font-size:.85rem; }
}

/* ══════════════════════════════════════════════════════════════
   KANBAN — melhorias complementares
   ══════════════════════════════════════════════════════════════ */
@media (max-width: 768px) {
    /* Cards: touch targets maiores */
    .kanban-card-btn-acoes,
    .kanban-card-btn-chat { min-width:36px; min-height:36px; border-radius:8px; }
    .kanban-card-avatar   { width:32px; height:32px; font-size:.78rem; border-radius:50%; }
    .kanban-card-titulo   { font-size:.88rem; line-height:1.35; }
    .kanban-card-campos li{ font-size:.78rem; }
    .kanban-card-pill     { font-size:.7rem; padding:.1rem .45rem; }
    /* Coluna header */
    .kanban-coluna-header { padding:.55rem .75rem; }
    .kanban-coluna-titulo { font-size:.88rem; gap:.4rem; }
    .kanban-badge         { font-size:.72rem; padding:.1rem .45rem; }
    /* Indicador de scroll: dot-stripe abaixo do container */
    .kanban-container::-webkit-scrollbar { height:4px; }
    .kanban-container::-webkit-scrollbar-thumb { background:var(--borda-forte); border-radius:2px; }
}

/* ══════════════════════════════════════════════════════════════
   FUNIL CONFIGURAÇÃO — etapas editáveis
   ══════════════════════════════════════════════════════════════ */
@media (max-width: 768px) {
    .etapa-item  { padding:.6rem .75rem; gap:.5rem; flex-wrap:wrap; }
    .etapa-form-inline { flex-wrap:wrap; gap:.4rem; }
    .etapa-form-inline input[type="text"],
    .etapa-form-inline select { font-size:16px; flex:1 1 140px; min-height:40px; }
    .etapa-form-inline input[type="color"] { width:40px; height:40px; }
    .etapa-form-inline .btn { min-height:40px; }
    .funil-config-badge-sistema { font-size:.7rem; }
    /* Cards de funil: touch */
    .funil-config-card { padding:.75rem .9rem; }
}

/* ══════════════════════════════════════════════════════════════
   OPORTUNIDADE DETALHE — header e campos
   ══════════════════════════════════════════════════════════════ */
@media (max-width: 768px) {
    /* Header topo: voltar + título empilhados */
    [class*="oport-header-topo"],
    .oport-header-topo { flex-wrap:wrap; gap:.5rem; align-items:flex-start; }
    .oport-header-topo h2 { font-size:1.05rem; flex:1 1 200px; }
    /* Rodapé do header: badges lado a lado com scroll */
    [class*="oport-header-rodape"],
    .oport-header-rodape { flex-wrap:wrap; gap:.4rem; padding:.5rem 0; }
    /* Etapa select: full-width */
    [class*="oport-etapa"],
    .oport-etapa { width:100% !important; min-height:42px; font-size:16px; }
    /* Seções: padding menor */
    [class*="oport-secao"],
    .oport-secao { padding:.65rem .75rem; }
    [class*="oport-campo"],
    .oport-campo { font-size:.88rem; }
    /* Linha de campo: wrap quando label longo */
    [class*="oport-linha"],
    .oport-linha { flex-wrap:wrap; gap:.25rem; }
    .oport-linha label { font-size:.78rem; }
    /* Badge temp (quente/frio) */
    [class*="oport-badge-temp"],
    .oport-badge-temp { font-size:.72rem; padding:.2rem .55rem; }
    /* Histórico: padding compacto */
    [class*="oport-hist"],
    .oport-hist-item { padding:.6rem .75rem; font-size:.85rem; }
    /* Botões do header: full-width no mobile */
    .oport-header .btn { flex:1 1 auto; min-height:42px; }
}

/* ══════════════════════════════════════════════════════════════
   INBOX / OMNI-CHAT — layout responsive
   ══════════════════════════════════════════════════════════════ */
@media (max-width: 768px) {
    /* Chat input: maior */
    [class*="omni-chat-input"],
    .omni-chat-input textarea { font-size:16px; min-height:44px; resize:none; }
    [class*="omni-chat-send"],
    .omni-chat-send { min-width:44px; min-height:44px; border-radius:50%; }
    /* Mensagens: bubble menor */
    [class*="omni-msg-bubble"],
    .omni-msg-bubble { font-size:.88rem; padding:.55rem .75rem; border-radius:14px; max-width:85vw; }
    [class*="omni-msg-meta"],
    .omni-msg-meta  { font-size:.7rem; }
    /* Barra de ferramentas do chat */
    [class*="omni-chat-toolbar"],
    .omni-chat-toolbar { gap:.3rem; padding:.4rem .75rem; flex-wrap:wrap; }
    .omni-chat-toolbar .btn-icone { min-width:40px; min-height:40px; }
    /* Header do ticket */
    [class*="omni-ticket-header"],
    .omni-ticket-header { padding:.6rem .9rem; flex-wrap:wrap; gap:.4rem; }
    /* Equipes/SLA/Tabulações: cards em coluna */
    [class*="omni-equipe-card"],
    [class*="omni-sla-card"],
    [class*="omni-tab-card"] { padding:.75rem; }
    .omni-equipe-card .btn,
    .omni-sla-card .btn,
    .omni-tab-card .btn { min-height:40px; }
}

/* ══════════════════════════════════════════════════════════════
   MAILINGS / CAMPANHAS — cards e filtros
   ══════════════════════════════════════════════════════════════ */
@media (max-width: 768px) {
    /* Mailing: cards de lista em coluna */
    [class*="mailing-lista-card"],
    [class*="mailing-card"] { padding:.75rem; border-radius:10px; }
    /* Campanha: stats row */
    [class*="campanha-stats"],
    .campanha-stats { flex-wrap:wrap; gap:.45rem; }
    [class*="campanha-stat"],
    .campanha-stat  { flex:1 1 80px; min-width:70px; padding:.55rem .7rem; border-radius:8px; text-align:center; }
    .campanha-stat strong { font-size:1.1rem; }
    .campanha-stat span   { font-size:.7rem; }
    /* Botões de ação da campanha: lado a lado */
    [class*="campanha-acoes"],
    .campanha-acoes { display:flex; flex-wrap:wrap; gap:.4rem; }
    .campanha-acoes .btn { flex:1 1 auto; min-height:40px; font-size:.85rem; }
}

/* ══════════════════════════════════════════════════════════════
   FLUXO DE CADASTRO — steps e config
   ══════════════════════════════════════════════════════════════ */
@media (max-width: 768px) {
    /* Steps horizontais: scroll */
    [class*="fluxo-steps"],
    .fluxo-steps { overflow-x:auto; -webkit-overflow-scrolling:touch; white-space:nowrap; padding-bottom:4px; }
    [class*="fluxo-step"],
    .fluxo-step  { flex-shrink:0; }
    /* Config panels: coluna */
    [class*="fluxo-config-grid"],
    .fluxo-config-grid { grid-template-columns:1fr !important; }
}

/* ══════════════════════════════════════════════════════════════
   VIABILIDADE — mapa + config
   ══════════════════════════════════════════════════════════════ */
@media (max-width: 768px) {
    /* Container do mapa: altura fixa menor */
    [class*="viabilidade-mapa"],
    .viabilidade-mapa { height:55vw !important; min-height:200px; max-height:340px; border-radius:10px; }
    /* Config: coluna */
    [class*="viabilidade-config"],
    .viabilidade-config { grid-template-columns:1fr !important; gap:.6rem; }
    .viabilidade-config .btn { min-height:42px; }
}

/* ══════════════════════════════════════════════════════════════
   AGENDA — calendário
   ══════════════════════════════════════════════════════════════ */
@media (max-width: 768px) {
    [class*="agenda-header"],
    .agenda-header { flex-wrap:wrap; gap:.5rem; }
    .agenda-header .btn { min-height:40px; }
    [class*="agenda-nav"],
    .agenda-nav h3 { font-size:.95rem; }
    [class*="agenda-grid"],
    .agenda-grid { font-size:.78rem; }
    /* Células do calendário: menores */
    [class*="agenda-cel"],
    .agenda-cel { min-height:52px; padding:.2rem .25rem; }
    [class*="agenda-evento"],
    .agenda-evento { font-size:.72rem; padding:.1rem .3rem; border-radius:4px; }
    /* Semana: coluna quando < 480px */
}
@media (max-width: 480px) {
    .agenda-grid { grid-template-columns:repeat(7,1fr) !important; }
    .agenda-cel  { min-height:40px; font-size:.7rem; }
}

/* ══════════════════════════════════════════════════════════════
   KML / COBERTURA — mapa full-width
   ══════════════════════════════════════════════════════════════ */
@media (max-width: 768px) {
    [class*="kml-mapa"],
    .kml-mapa { height:55vw !important; min-height:200px; max-height:340px; border-radius:10px; }
    [class*="kml-toolbar"],
    .kml-toolbar { flex-wrap:wrap; gap:.4rem; }
    .kml-toolbar .btn { flex:1 1 auto; min-height:42px; font-size:.85rem; }
    [class*="kml-info"],
    .kml-info { font-size:.85rem; padding:.6rem .75rem; }
}

/* ══════════════════════════════════════════════════════════════
   SISTEMA / SYSLOG — progresso e changelogs
   ══════════════════════════════════════════════════════════════ */
@media (max-width: 768px) {
    /* Seção de informações do sistema: coluna */
    [class*="sistema-info"],
    .sistema-info { flex-direction:column !important; gap:.5rem; }
    [class*="sistema-versao"],
    .sistema-versao { font-size:.85rem; }
    /* Botões de update: full-width */
    [class*="sistema-acoes"],
    .sistema-acoes { flex-wrap:wrap; gap:.4rem; }
    .sistema-acoes .btn { flex:1 1 auto; min-height:44px; font-size:.9rem; }
    /* Changelog: compacto */
    [class*="changelog-item"],
    .changelog-item { padding:.6rem .75rem; font-size:.85rem; }
    [class*="changelog-badge"],
    .changelog-badge { font-size:.72rem; }
    /* Pacotes: grid 1 coluna */
    [class*="sistema-pacotes-grid"],
    .sistema-pacotes-grid { grid-template-columns:1fr !important; gap:.65rem; }
}

/* ══════════════════════════════════════════════════════════════
   CONTRATOS — lista + editor
   ══════════════════════════════════════════════════════════════ */
@media (max-width: 768px) {
    [class*="contrato-card"],
    .contrato-card { padding:.75rem; border-radius:10px; }
    [class*="contrato-header"],
    .contrato-header { flex-wrap:wrap; gap:.4rem; }
    .contrato-header .btn { min-height:40px; }
    /* Editor de modelo: toolbar scroll */
    [class*="contrato-editor-toolbar"],
    .contrato-editor-toolbar { overflow-x:auto; -webkit-overflow-scrolling:touch; white-space:nowrap; flex-wrap:nowrap; gap:.2rem; padding:.35rem .5rem; }
    .contrato-editor-toolbar .btn { flex-shrink:0; min-height:34px; padding:.25rem .5rem; }
    /* Preview: menor em mobile */
    [class*="contrato-preview"],
    .contrato-preview { font-size:.85rem; padding:1rem; }
}

/* ══════════════════════════════════════════════════════════════
   PLANOS / CONTRATAÇÃO — wizard de steps
   ══════════════════════════════════════════════════════════════ */
@media (max-width: 768px) {
    [class*="planos-contratacao"],
    .planos-contratacao { padding:0 !important; }
    [class*="contratacao-steps"],
    .contratacao-steps { overflow-x:auto; white-space:nowrap; padding:.5rem .75rem; }
    [class*="contratacao-step"],
    .contratacao-step { flex-shrink:0; font-size:.8rem; gap:.3rem; }
    [class*="contratacao-body"],
    .contratacao-body { padding:1rem; }
    [class*="contratacao-nav"],
    .contratacao-nav { flex-wrap:wrap; gap:.5rem; padding:.75rem 1rem; }
    .contratacao-nav .btn { flex:1 1 auto; min-height:46px; font-size:.95rem; }
}

/* ══════════════════════════════════════════════════════════════
   ERP — config e testes
   ══════════════════════════════════════════════════════════════ */
@media (max-width: 768px) {
    [class*="erp-config-grid"],
    .erp-config-grid { grid-template-columns:1fr !important; gap:.6rem; }
    [class*="erp-metodo-item"],
    .erp-metodo-item { padding:.6rem .75rem; }
    [class*="erp-resultado"],
    .erp-resultado { font-size:.82rem; padding:.65rem .75rem; border-radius:8px; }
}

/* ══════════════════════════════════════════════════════════════
   PAGAMENTOS — config e histórico
   ══════════════════════════════════════════════════════════════ */
@media (max-width: 768px) {
    [class*="pagamento-config"],
    .pagamento-config { grid-template-columns:1fr !important; gap:.6rem; }
    [class*="pagamento-status"],
    .pagamento-status { font-size:.82rem; padding:.35rem .6rem; }
}

/* ══════════════════════════════════════════════════════════════
   BRAND-TILE (landing / empresa-aqui)
   ══════════════════════════════════════════════════════════════ */
@media (max-width: 768px) {
    .brand-tile-wrap { flex-direction:column; gap:.65rem; }
    .brand-tile { padding:.85rem 1rem; border-radius:12px; min-height:60px; }
}

/* ══════════════════════════════════════════════════════════════
   FUNIS-OPORTUNIDADE — detalhe em página própria
   ══════════════════════════════════════════════════════════════ */
@media (max-width: 768px) {
    /* Voltar + breadcrumb: compacto */
    .oport-voltar { font-size:.88rem; padding:.4rem .5rem; }
    /* Layout: sidebar vai para baixo do conteúdo principal */
    .oport-layout { flex-direction:column !important; gap:.65rem; }
    .oport-sidebar {
        width:100% !important; max-width:100% !important;
        border-left:0 !important; border-top:1px solid var(--borda);
        padding-top:.75rem;
    }
    /* Tabs de conteúdo: scroll horizontal */
    .oport-tabs { overflow-x:auto; -webkit-overflow-scrolling:touch; white-space:nowrap; flex-wrap:nowrap; border-bottom:1px solid var(--borda); }
    .oport-tab  { flex-shrink:0; padding:.5rem .85rem; font-size:.85rem; min-height:42px; white-space:nowrap; }
    .oport-tab-conteudo { padding:.75rem 0; }
    /* Proposta: botões empilham */
    [class*="proposta-acoes"],
    .proposta-acoes { flex-wrap:wrap; gap:.4rem; }
    .proposta-acoes .btn { flex:1 1 auto; min-height:42px; }
}

/* ══════════════════════════════════════════════════════════════
   AI / ANALYTICS — cards e gráficos
   ══════════════════════════════════════════════════════════════ */
@media (max-width: 768px) {
    [class*="analytics-grid"],
    .analytics-grid { grid-template-columns:1fr !important; gap:.6rem; }
    [class*="analytics-chart"],
    .analytics-chart { height:220px !important; }
    [class*="ai-response"],
    .ai-response { font-size:.88rem; padding:.75rem; border-radius:10px; }
    [class*="ai-actions"],
    .ai-actions { flex-wrap:wrap; gap:.4rem; }
    .ai-actions .btn { flex:1 1 auto; min-height:40px; }
}

/* ══════════════════════════════════════════════════════════════
   WHATSAPP TEMPLATES / EMAIL TEMPLATES
   ══════════════════════════════════════════════════════════════ */
@media (max-width: 768px) {
    [class*="template-preview"],
    .template-preview { font-size:.85rem; padding:.75rem; border-radius:10px; max-height:280px; overflow-y:auto; }
    [class*="template-vars"],
    .template-vars { flex-wrap:wrap; gap:.35rem; }
    [class*="template-var"],
    .template-var { flex:1 1 auto; min-height:38px; font-size:.82rem; }
}

/* ══════════════════════════════════════════════════════════════
   MODELOS DE DOCUMENTOS — editor
   ══════════════════════════════════════════════════════════════ */
@media (max-width: 768px) {
    [class*="doc-editor-wrap"],
    .doc-editor-wrap { flex-direction:column !important; }
    [class*="doc-editor-sidebar"],
    .doc-editor-sidebar { width:100% !important; border-left:0 !important; border-top:1px solid var(--borda); max-height:220px; overflow-y:auto; }
    [class*="doc-editor-toolbar"],
    .doc-editor-toolbar { overflow-x:auto; white-space:nowrap; flex-wrap:nowrap; gap:.25rem; padding:.35rem .5rem; }
    .doc-editor-toolbar .btn { flex-shrink:0; min-height:34px; }
}

/* ══════════════════════════════════════════════════════════════
   CAMPO BUSCA GLOBAL / INPUT-GROUP GENÉRICO
   ══════════════════════════════════════════════════════════════ */
@media (max-width: 768px) {
    /* Qualquer wrapper input-group: empilha botão abaixo */
    .input-group { flex-wrap:wrap; gap:.4rem; }
    .input-group input { flex:1 1 140px; font-size:16px; min-height:42px; }
    .input-group .btn  { flex-shrink:0; min-height:42px; }
    /* input com ícone à esquerda */
    .input-icon-wrap { position:relative; }
    .input-icon-wrap input { padding-left:2.25rem; font-size:16px; min-height:42px; }
}

/* ══════════════════════════════════════════════════════════════
   AJUSTES FINOS ≤ 480px (phones pequenos)
   ══════════════════════════════════════════════════════════════ */
@media (max-width: 480px) {
    /* Modais: handle sempre visível mesmo em modal-lg/xl */
    .modal-dialog.modal-lg .modal-content::before,
    .modal-dialog.modal-xl .modal-content::before {
        content:''; display:block; flex-shrink:0;
        width:36px; height:4px; background:var(--borda-forte);
        border-radius:2px; margin:8px auto 0;
    }
    /* Kanban: coluna quase full-width */
    .kanban-coluna { flex:0 0 94vw; min-width:94vw; max-width:94vw; }
    /* Badge no topbar: menor */
    .notif-badge { width:16px; height:16px; font-size:.6rem; }
    /* Tabela-card: labels mais estreitos */
    .tabela td[data-label]::before { min-width:64px; font-size:.68rem; }
    /* Botões de ação nas tabelas-card: menores */
    .tabela td.td-acoes .btn,
    .tabela td.td-acoes .btn-acao { min-height:34px; min-width:34px; font-size:.78rem; }
    /* Form-row sempre 1 coluna */
    .form-row { grid-template-columns:1fr !important; }
    /* Paginação: sem info de página, só prev/next */
    .crud-pag-info { display:none; }
    .crud-paginacao-controles { width:100%; justify-content:space-between; }
    /* Page header: oculta subtítulo se muito longo */
    .page-header h2 { font-size:1rem; }
    /* Modal footer: botões em coluna em phones muito pequenos */
    .modal-footer { flex-direction:column; }
    .modal-footer .btn { width:100%; flex:none; }
}

/* ══════════════════════════════════════════════════════════════
   SAFE AREA — notch / home indicator
   ══════════════════════════════════════════════════════════════ */
@media (max-width: 768px) {
    /* Topbar: espaço lateral para notch */
    .topbar { padding-left:max(.75rem, env(safe-area-inset-left)); padding-right:max(.75rem, env(safe-area-inset-right)); }
    /* Conteúdo: margem inferior para home-bar */
    .conteudo { padding-bottom:max(1rem, calc(1rem + env(safe-area-inset-bottom))); }
    /* Sidebar quando aberta: inclui safe-area topo */
    .sidebar.aberta { padding-top:env(safe-area-inset-top, 0px); }
}

/* =============================================================
   FIM MOBILE v1.1.60
   ============================================================= */

/* =============================================================
   NOTEBOOK / TELAS ESCALADAS (769–1100px) — v1.2.x
   Faixa entre o desktop largo e o mobile (≤768px). Cobre notebooks de
   1280/1366 a 125–150% de escala. NÃO converte pra mobile — só evita que
   barras de ação se toquem/sobreponham e que conteúdo largo estoure.
   Tudo > 1100px (desktop) fica intacto.
   ============================================================= */
@media (min-width: 769px) and (max-width: 1100px) {
    /* Um pouco menos de padding dá fôlego pro conteúdo sem virar mobile. */
    .conteudo { padding: 1.15rem; }

    /* Barras de cabeçalho/ações de página: deixam quebrar em vez de espremer
       ou sobrepor os botões (mantém a proporção, só vai pra 2 linhas). */
    .page-header, .card-header, .modal-header { flex-wrap: wrap; }

    /* Qualquer tabela larga rola lateralmente em vez de cortar/empurrar. */
    .table-responsive { overflow-x: auto; -webkit-overflow-scrolling: touch; }

    /* Travas anti-estouro nos containers de conteúdo (cards/tabela). NÃO mexe no
       editor de fluxo (.fb-wrap) nem no kanban — eles rolam por dentro. */
    .card, .card-body { min-width: 0; max-width: 100%; }
}


/* ══════════════════════════════════════════════════════════════
   AJUDA — badge lateral direito + dropdown (Wiki / Tutorial) e
   TOUR guiado (spotlight). Persistente entre navegações SPA.
   ────────────────────────────────────────────────────────────── */
.sv-ajuda {
    position: fixed;
    top: 50%; right: 0; transform: translateY(-50%);
    z-index: 980;                 /* abaixo de modal(1000)/loader, acima do conteúdo */
    display: flex; align-items: center;
    font-family: inherit;
}
/* A "aba" que fica espiando na borda direita. Recolhida = só o "?". */
.sv-ajuda-tab {
    display: flex; align-items: center; gap: .5rem;
    background: var(--primary); color: #fff;
    border: none; cursor: pointer;
    border-radius: 10px 0 0 10px;
    box-shadow: -4px 0 14px color-mix(in srgb, var(--primary) 35%, transparent);
    height: 46px; padding: 0 .9rem 0 1rem;
    /* Recolhida: empurra a maior parte pra fora, deixando ~o "?" visível. */
    transform: translateX(calc(100% - 42px));
    transition: transform .22s ease, box-shadow .22s ease;
    font-weight: 600; font-size: .9rem; white-space: nowrap;
}
.sv-ajuda-tab i { font-size: 1.1rem; flex-shrink: 0; }
.sv-ajuda-tab .sv-ajuda-label {
    opacity: 0; transition: opacity .18s ease .04s;
    max-width: 0; overflow: hidden;
}
/* Expandida no hover/foco/aberto: desliza pra dentro e revela "Ajuda". */
.sv-ajuda:hover .sv-ajuda-tab,
.sv-ajuda:focus-within .sv-ajuda-tab,
.sv-ajuda.is-aberto .sv-ajuda-tab {
    transform: translateX(0);
}
.sv-ajuda:hover .sv-ajuda-tab .sv-ajuda-label,
.sv-ajuda:focus-within .sv-ajuda-tab .sv-ajuda-label,
.sv-ajuda.is-aberto .sv-ajuda-tab .sv-ajuda-label {
    opacity: 1; max-width: 120px;
}
/* Dropdown que cai ao clicar/abrir. */
.sv-ajuda-menu {
    position: absolute; right: .6rem; top: calc(50% + 32px);
    min-width: 190px;
    background: var(--bg-card); color: var(--texto);
    border: 1px solid var(--borda); border-radius: 12px;
    box-shadow: var(--sombra-lg);
    padding: .35rem; overflow: hidden;
    opacity: 0; transform: translateY(-6px) scale(.98);
    pointer-events: none;
    transition: opacity .16s ease, transform .16s ease;
}
.sv-ajuda.is-aberto .sv-ajuda-menu { opacity: 1; transform: none; pointer-events: auto; }
.sv-ajuda-menu-item {
    display: flex; align-items: center; gap: .6rem; width: 100%;
    background: none; border: none; cursor: pointer; text-align: left;
    padding: .6rem .7rem; border-radius: 8px;
    color: var(--texto); font-size: .9rem; font-family: inherit; font-weight: 500;
    text-decoration: none;
}
.sv-ajuda-menu-item:hover { background: var(--bg-hover); }
.sv-ajuda-menu-item i { width: 18px; text-align: center; color: var(--primary); }
.sv-ajuda-menu-item small { display: block; color: var(--texto-fraco); font-weight: 400; font-size: .76rem; }

@media (max-width: 768px) {
    .sv-ajuda-tab { transform: translateX(calc(100% - 38px)); height: 42px; }
}

/* ── TOUR (spotlight) ─────────────────────────────────────────── */
/* Overlay escuro com "buraco" no elemento destacado, feito por 4 painéis
   (cima/baixo/esq/dir) em vez de box-shadow — funciona com scroll e é nítido. */
.sv-tour-painel {
    position: fixed; z-index: 100000;
    background: rgba(15, 17, 21, .62);
    /* Só o FADE de opacidade anima. Geometria (left/top/width/height) NUNCA
       interpola: os 4 painéis formam a moldura do buraco e, se cada um animar
       por conta própria, abrem frestas/sobras de luz nos cantos no meio da
       transição (o "bug visual" ao mover entre alvos). A moldura salta inteira
       num frame só; quem dá a sensação de movimento suave é o anel. */
    transition: opacity .2s ease;
    will-change: top, left, width, height;
}
:root[data-theme="dark"] .sv-tour-painel { background: rgba(0,0,0,.72); }
/* Anel de realce ao redor do elemento em foco. */
.sv-tour-anel {
    position: fixed; z-index: 100001; pointer-events: none;
    border-radius: 10px;
    box-shadow: 0 0 0 3px var(--primary), 0 0 0 9px color-mix(in srgb, var(--primary) 30%, transparent);
    /* Anima posição/tamanho (desliza suave entre alvos) mas NÃO o box-shadow,
       senão o realce "pisca" de espessura durante a interpolação. */
    transition: top .25s ease, left .25s ease, width .25s ease, height .25s ease;
    will-change: top, left, width, height;
}
/* Balão de explicação. */
.sv-tour-balao {
    position: fixed; z-index: 100002;
    width: min(340px, calc(100vw - 32px));
    background: var(--bg-card); color: var(--texto);
    border: 1px solid var(--borda); border-radius: 14px;
    box-shadow: var(--sombra-lg);
    padding: 1.1rem 1.15rem 1rem;
    transition: top .25s ease, left .25s ease;
}
.sv-tour-balao-topo { display: flex; align-items: center; justify-content: space-between; gap: .5rem; margin-bottom: .35rem; }
.sv-tour-balao-titulo { font-size: 1rem; font-weight: 700; color: var(--texto); margin: 0; display: flex; align-items: center; gap: .5rem; }
.sv-tour-balao-titulo i { color: var(--primary); }
.sv-tour-fechar {
    background: none; border: none; cursor: pointer; color: var(--texto-fraco);
    font-size: 1.05rem; line-height: 1; padding: .25rem; border-radius: 6px; flex-shrink: 0;
}
.sv-tour-fechar:hover { background: var(--bg-hover); color: var(--texto); }
.sv-tour-balao-texto { font-size: .9rem; line-height: 1.5; color: var(--texto); margin: 0 0 .9rem; }
.sv-tour-balao-rodape { display: flex; align-items: center; justify-content: space-between; gap: .75rem; }
.sv-tour-passo-num { font-size: .78rem; color: var(--texto-fraco); font-variant-numeric: tabular-nums; }
.sv-tour-acoes { display: flex; gap: .5rem; }
.sv-tour-acoes .btn { padding: .4rem .8rem; font-size: .85rem; }
/* Setinha do balão apontando pro elemento. */
.sv-tour-balao::before {
    content: ''; position: absolute; width: 12px; height: 12px;
    background: var(--bg-card); border: 1px solid var(--borda);
    transform: rotate(45deg); display: none;
}
.sv-tour-balao[data-seta="cima"]::before   { display: block; top: -7px;  left: var(--seta-x, 24px); border-right: 0; border-bottom: 0; }
.sv-tour-balao[data-seta="baixo"]::before  { display: block; bottom: -7px; left: var(--seta-x, 24px); border-left: 0; border-top: 0; }
.sv-tour-balao[data-seta="esq"]::before    { display: block; left: -7px;  top: var(--seta-y, 24px); border-top: 0; border-right: 0; }
.sv-tour-balao[data-seta="dir"]::before    { display: block; right: -7px; top: var(--seta-y, 24px); border-bottom: 0; border-left: 0; }
/* Trava o scroll do fundo enquanto o tour roda. */
body.sv-tour-ativo { overflow: hidden; }
/* Camada que CAPTURA todo clique/toque durante o tour — nada da página
   responde (nem o elemento em destaque), só o balão. Fica acima dos painéis
   e do anel, abaixo do balão. Transparente. (Pedido do dono: não bugar.) */
.sv-tour-bloqueio {
    position: fixed; inset: 0; z-index: 100001;
    background: transparent; cursor: not-allowed;
}
/* Botão "?" de ajuda dentro do cabeçalho do modal (ao lado do fechar). */
.sv-modal-ajuda {
    background: none; border: none; cursor: pointer;
    color: var(--texto-fraco); font-size: 1rem; line-height: 1;
    padding: .25rem; border-radius: 6px; flex-shrink: 0;
    transition: color .15s, background .15s;
    /* O .modal-header é justify-content:space-between. Sem isto, inserir o "?"
       como 3º filho (entre o título e o X) joga ele pro MEIO. O margin-left:auto
       faz o "?" absorver todo o espaço livre → ele cola no X, à direita, e o
       título fica sozinho à esquerda. O gap separa "?" do X. */
    margin-left: auto;
    margin-right: .15rem;
}
.sv-modal-ajuda:hover { color: var(--primary); background: var(--bg-hover); }

/* ══════════════════════════════════════════════════════════════
   EDITOR VISUAL (window.EmailEditor) — estilos GLOBAIS.
   Antes ficavam só no blade de email-templates (escopo da view), então em
   outras telas que reusam o EmailEditor (ex.: editor de modelos de documento)
   a toolbar saía CRUA (botões default do browser). Movido pra cá pra ficar
   consistente em todo o sistema. Alinhado ao design system (raio, vars, hover).
   ────────────────────────────────────────────────────────────── */
.email-editor { border: 1px solid var(--borda); border-radius: var(--raio); overflow: visible; background: var(--bg-card); }
.ee-toolbar {
    display: flex; flex-wrap: wrap; align-items: center; gap: .15rem; position: relative;
    padding: .4rem .45rem; border-bottom: 1px solid var(--borda);
    background: var(--bg-elevado);
    border-radius: var(--raio) var(--raio) 0 0;
}
.ee-btn {
    width: 32px; height: 32px; border: 1px solid transparent; border-radius: 7px;
    background: transparent; color: var(--texto-medio, var(--texto-fraco)); cursor: pointer; font-size: .85rem;
    display: inline-flex; align-items: center; justify-content: center;
    transition: background .12s, color .12s, border-color .12s;
}
.ee-btn:hover { background: var(--bg-hover); color: var(--texto); }
.ee-btn:active { transform: translateY(1px); }
.ee-btn.is-on { background: var(--cor-primaria, #FF6B00); color: #fff; }
.ee-btn:disabled { opacity: .4; cursor: not-allowed; }
.ee-sep { width: 1px; height: 18px; background: var(--borda); margin: 0 .3rem; }
.ee-area {
    min-height: 240px; max-height: 460px; overflow-y: auto; padding: .85rem 1rem;
    font-size: .9rem; line-height: 1.55; color: var(--texto); background: #fff; outline: none;
    scrollbar-width: thin;
}
/* O corpo é renderizado claro (como num documento/e-mail), independente do tema. */
.ee-area, .ee-area * { color: #1a1a1a; }
.ee-area:empty::before { content: attr(data-ph); color: #9ca3af; }
.ee-area img { max-width: 100%; height: auto; }
.ee-area a { color: #2563eb; }
.ee-area h2 { font-size: 1.25rem; margin: .4rem 0; }
.ee-area table { border-collapse: collapse; max-width: 100%; }
.ee-area td, .ee-area th { border: 1px solid #d1d5db; padding: .35rem .5rem; }
/* Variáveis {{...}} destacadas como "chip" dentro do editor — só identificação
   visual; ao salvar viram texto {{token}} cru de novo (tirarChipsVar). É uma
   unidade atômica (contenteditable=false): seleciona/apaga inteira. */
/* Chip de variável {{...}} — OPACA e com TOM ADAPTÁVEL ao fundo. O JS
   (ajustarTomChips) mede a luminância do fundo atrás de cada chip e marca
   data-tone="light" (fundo claro) ou "dark" (fundo escuro). Antes era laranja
   fixo translúcido → sumia sobre fundos coloridos (ex.: verde do cabeçalho). */
.ee-area .ee-var-chip {
    display: inline-block;
    border-radius: 5px;
    padding: 0 .32rem;
    margin: 0 1px;
    font-size: .92em;
    font-family: ui-monospace, 'JetBrains Mono', monospace;
    white-space: nowrap;
    user-select: all;                 /* clicar seleciona a chip inteira */
    cursor: default;
    /* Fallback (sem data-tone ainda): tom claro. */
    background: #fff3ec !important;
    color: #b8430f !important;
    border: 1px solid #f0a878;
    box-shadow: 0 0 0 1px rgba(255,255,255,.35);   /* leve halo p/ separar do fundo */
}
/* Fundo CLARO → chip creme com texto quase-preto + borda âmbar (acento) — mais
   nítido e atrativo que o laranja sobre creme. */
.ee-area .ee-var-chip[data-tone="light"] {
    background: #fff3ec !important;
    color: #111827 !important;
    font-weight: 600;
    border-color: #f0a878;
}
/* Fundo ESCURO/COLORIDO (verde, azul...) → chip CLARA opaca, texto escuro.
   Funciona sobre qualquer cor porque é opaca e não deixa o fundo vazar. O aro
   (--ee-chip-ring, setado pelo JS) é um tom claro DA PRÓPRIA cor do fundo, então
   cada tag combina com o bloco onde está. */
.ee-area .ee-var-chip[data-tone="dark"] {
    background: #ffffff !important;
    color: #111827 !important;                       /* texto quase-preto: contraste máximo na pílula branca */
    font-weight: 600;
    border-color: var(--ee-chip-ring, rgba(255,255,255,.6));
    box-shadow: 0 0 0 2px color-mix(in srgb, var(--ee-chip-ring, #fff) 55%, transparent),
                0 1px 4px rgba(0,0,0,.4);            /* destaca a pílula do fundo escuro */
}
.ee-raw {
    width: 100%; min-height: 240px; max-height: 460px; border: 0; outline: none; resize: vertical;
    padding: .75rem 1rem; font-family: ui-monospace, monospace; font-size: .82rem;
    background: var(--bg-card); color: var(--texto); scrollbar-width: thin;
}
.ee-img-menu {
    position: absolute; z-index: 40; min-width: 200px;
    background: var(--bg-card); border: 1px solid var(--borda); border-radius: 8px;
    box-shadow: var(--sombra-lg, 0 6px 24px rgba(0,0,0,.18)); padding: .25rem; display: flex; flex-direction: column; gap: .1rem;
}
.ee-img-menu button {
    display: flex; align-items: center; gap: .5rem; width: 100%; text-align: left;
    background: transparent; border: 0; border-radius: 6px; padding: .5rem .6rem;
    cursor: pointer; color: var(--texto); font-size: .85rem;
}
.ee-img-menu button:hover { background: var(--bg-hover); }
/* Botão "Inserir variável": pílula à direita da toolbar. */
.ee-btn-var {
    width: auto; gap: .35rem; padding: 0 .7rem; height: 30px; font-size: .78rem;
    margin-left: auto; flex-shrink: 0;
    border: 1px solid var(--borda); border-radius: 999px;
    color: var(--texto-medio, var(--texto-fraco)); background: var(--bg-card);
}
.ee-btn-var:hover { background: var(--bg-hover); color: var(--texto); border-color: var(--cor-primaria, #FF6B00); }
.ee-btn-var i { color: var(--cor-primaria, #FF6B00); font-size: .72rem; }
.ee-btn-var-lbl { font-weight: 500; }
.ee-var-menu { min-width: 240px; max-height: 280px; overflow: auto; }
.ee-var-menu button { justify-content: space-between; gap: .75rem; }
.ee-var-menu code {
    font-family: ui-monospace, monospace; font-size: .72rem; color: var(--texto-fraco);
    background: var(--bg-hover); padding: .05rem .3rem; border-radius: 4px; flex-shrink: 0;
}
@media (max-width: 560px) { .ee-btn-var-lbl { display: none; } }

/* ── Ícone do DIP AI (símbolo SVG próprio, substitui o fa-robot) ──
   Duas formas:
   - `.dip-ai-ico`        → artwork completo em cor (header, boas-vindas, avatar).
   - `.dip-ai-ico-mono`   → silhueta TINGÍVEL via mask (currentColor) p/ a sidebar
                            e o tour, onde os ícones são monocromáticos e mudam de
                            cor por estado (hover/ativo). Usa o mesmo arquivo. */
/* O viewBox do SVG já é recortado no símbolo (sem padding), então `contain`
   preenche a caixa. Tamanho em em → acompanha o texto ao redor. */
/* ?v= = cache-bust manual (o proxy EA-Nginx/cPanel cacheia o SVG por URL e o
   url() do CSS não tem filemtime; bumpar o número ao trocar o arquivo). */
.dip-ai-ico {
    display: inline-block; vertical-align: -0.22em;
    width: 1.25em; height: 1.25em;
    background: url('/assets/img/dip-ai.svg?v=2') center/contain no-repeat;
}
.dip-ai-ico-mono {
    display: inline-block; vertical-align: -0.2em;
    width: 1.2em; height: 1.2em;
    background-color: currentColor;
    -webkit-mask: url('/assets/img/dip-ai.svg?v=2') center/contain no-repeat;
            mask: url('/assets/img/dip-ai.svg?v=2') center/contain no-repeat;
}
/* Na sidebar acompanham a largura-padrão dos ícones FA (18px), centralizado.
   O `.dip-ai-ico` (colorido) é o "robozinho" pedido; mantém as cores próprias
   mesmo no item ativo (não tinge). O mono fica disponível p/ quem quiser tingir. */
.sidebar-nav a .dip-ai-ico,
.sidebar-nav a .dip-ai-ico-mono { width: 18px; height: 20px; flex-shrink: 0; vertical-align: middle; }

/* ════════════════════════════════════════════════════════════════════════
   NAVEGAÇÃO MACRO NO TOPO (reimaginação UI/UX estilo Helena) — v1.2.x
   A sidebar lateral cheia é OCULTADA; a navegação vira grupos macro no topo
   (dropdowns). Conteúdo ocupa a largura toda. Só visual/markup — lógica intacta.
   ════════════════════════════════════════════════════════════════════════ */
/* 1) MODO HORIZONTAL (default): esconde a sidebar lateral, mostra a top-nav,
   conteúdo em largura total. MODO VERTICAL: o oposto (volta a sidebar antiga e
   esconde a top-nav). Gating por `<html data-menu-layout>` (pref por usuário). */
:root[data-menu-layout="horizontal"] .topnav { display: flex; }
:root[data-menu-layout="horizontal"] .topnav-brand { display: inline-flex; }
@media (min-width: 769px) {
    :root[data-menu-layout="horizontal"] .layout-dashboard > .sidebar { display: none !important; }
    :root[data-menu-layout="horizontal"] .topnav-burger { display: none; }
}
/* MODO VERTICAL — sidebar antiga visível, top-nav e brand do topo escondidos. */
:root[data-menu-layout="vertical"] .topnav,
:root[data-menu-layout="vertical"] .topnav-brand { display: none !important; }
:root[data-menu-layout="vertical"] .layout-dashboard > .sidebar { display: flex; }
/* No vertical o hambúrguer volta a recolher/abrir a sidebar (desktop) — mantém
   o comportamento legado; no mobile já era drawer. */
/* 2) Brand (logo) no canto esquerdo do topo. */
.topnav-brand {
    display: inline-flex; align-items: center; flex-shrink: 0;
    text-decoration: none; margin-right: .25rem; height: 34px;
}
.topnav-brand .entregajah-logo { height: 30px; max-width: 150px; }
.topnav-brand:hover { opacity: .85; }

/* 3) Barra de navegação macro. */
.topnav {
    display: flex; align-items: center; gap: .15rem;
    flex: 1 1 auto; min-width: 0; flex-wrap: nowrap; overflow: visible;
}
.topnav-link {
    display: inline-flex; align-items: center; gap: .5rem;
    padding: .5rem .8rem; border-radius: 10px;
    background: transparent; border: 0; cursor: pointer;
    color: var(--texto-medio, var(--texto)); font-size: .9rem; font-weight: 500;
    font-family: inherit; text-decoration: none; white-space: nowrap;
    transition: background-color .14s, color .14s;
}
/* IMPORTANTE: a regra GLOBAL `a, a:focus, a:visited { color: var(--primary) }`
   pintava estes links (que são <a>) de laranja/azul PRA SEMPRE após hover/focus.
   Resetamos os estados de link aqui; a cor só muda no :hover/ativo abaixo.
   (mesmo padrão do fix de .btn-acao — ver feedback). */
a.topnav-link:link, a.topnav-link:visited, a.topnav-link:focus, a.topnav-link:active {
    color: var(--texto-medio, var(--texto));
}
.topnav-link:hover,
a.topnav-link:hover { background: var(--bg-hover); color: var(--texto); text-decoration: none; }
.topnav-ico { font-size: .85em; opacity: .8; }
.topnav-caret { font-size: .6rem; opacity: .5; margin-left: .1rem; transition: transform .18s; }
/* Item solto "fim" (DIP AI): empurrado pra DIREITA, no fim da barra. */
.topnav-fim { margin-left: auto; }
@media (max-width: 768px) { .topnav-fim { margin-left: 0; } }  /* no drawer mobile vira item normal */
/* Ativo: pílula suave com a cor primária (laranja só no destaque — pedido do dono).
   Usa `a.topnav-solto.ativo` p/ ganhar do reset `a.topnav-link:link/...` acima. */
a.topnav-solto.ativo,
.topnav-solto.ativo,
.topnav-grupo.tem-ativo > .topnav-toggle {
    background: var(--primary-soft);
    color: var(--primary);
}
.topnav-grupo.tem-ativo > .topnav-toggle .topnav-ico { opacity: 1; color: var(--primary); }

/* 4) Dropdown de cada grupo. */
.topnav-grupo { position: relative; }
.topnav-grupo.aberto .topnav-caret { transform: rotate(180deg); }
.topnav-menu {
    position: absolute; top: calc(100% + 6px); left: 0; z-index: 120;
    min-width: 300px; max-width: 360px; padding: .4rem;
    background: var(--bg-card); border: 1px solid var(--borda); border-radius: 14px;
    box-shadow: 0 12px 34px rgba(0,0,0,.13);
    display: flex; flex-direction: column; gap: .15rem;
    animation: topnavMenuIn .14s ease;
}
.topnav-menu[hidden] { display: none; }
@keyframes topnavMenuIn { from { opacity: 0; transform: translateY(-4px); } to { opacity: 1; transform: none; } }
/* Sub-seção dentro do dropdown — dá hierarquia (em vez de lista crua). */
.topnav-sec { display: flex; flex-direction: column; gap: .1rem; }
.topnav-sec + .topnav-sec { margin-top: .15rem; padding-top: .2rem; border-top: 1px solid var(--borda); }
.topnav-subtitulo {
    font-size: .66rem; font-weight: 700; text-transform: uppercase; letter-spacing: .06em;
    color: var(--texto-fraco);
}
/* Sub-seção COLAPSÁVEL (sanfona): subtítulo vira botão clicável + chevron. */
.topnav-subtoggle {
    display: flex; align-items: center; justify-content: space-between; gap: .5rem;
    width: 100%; background: transparent; border: 0; cursor: pointer;
    padding: .4rem .65rem .25rem; border-radius: 7px;
    font: inherit; text-align: left;
}
.topnav-subtoggle:hover { background: var(--bg-hover); }
.topnav-subtoggle:hover .topnav-subtitulo { color: var(--texto); }
.topnav-sub-caret { font-size: .55rem; opacity: .5; transition: transform .18s; }
.topnav-sec-colapsavel.is-fechada .topnav-sub-caret { transform: rotate(-90deg); }
/* Wrapper dos itens da sub-seção — anima e some quando fechada. */
.topnav-sub-itens { display: flex; flex-direction: column; gap: .1rem; overflow: hidden; }
.topnav-sec-colapsavel.is-fechada .topnav-sub-itens { display: none; }
.topnav-item {
    display: flex; align-items: flex-start; gap: .65rem;
    padding: .5rem .65rem; border-radius: 9px;
    color: var(--texto); font-size: .88rem; text-decoration: none;
    transition: background-color .12s;
}
.topnav-item-txt { display: flex; flex-direction: column; gap: .05rem; min-width: 0; }
.topnav-item-rot { font-weight: 500; line-height: 1.2; }
.topnav-item-desc { font-size: .72rem; color: var(--texto-fraco); line-height: 1.25; white-space: normal; }
.topnav-item.ativo .topnav-item-desc { color: color-mix(in srgb, var(--primary) 70%, var(--texto-fraco)); }
/* Reset dos estados de link (não herdar o laranja global em focus/visited). */
a.topnav-item:link, a.topnav-item:visited, a.topnav-item:focus, a.topnav-item:active { color: var(--texto); }
.topnav-item:hover, a.topnav-item:hover { background: var(--bg-hover); color: var(--texto); text-decoration: none; }
/* Ativo vence (mais específico que os resets acima). */
a.topnav-item.ativo, .topnav-item.ativo { background: var(--primary-soft); color: var(--primary); }
.topnav-item i, .topnav-item .dip-ai-ico { width: 18px; text-align: center; color: var(--texto-fraco); flex-shrink: 0; margin-top: .12rem; }
.topnav-item.ativo i { color: var(--primary); }

/* 5) Topbar passa a hospedar a nav: ajusta o padding e mantém ações à direita. */
.topbar { padding: .55rem 1rem; gap: .6rem; }

/* 6) MOBILE: a topnav vira um menu vertical recolhido atrás do hambúrguer. */
@media (max-width: 768px) {
    .topnav-brand { margin-right: auto; }
    .topnav {
        position: fixed; top: 52px; left: 0; right: 0; z-index: 130;
        flex-direction: column; align-items: stretch; gap: .15rem;
        background: var(--bg-card); border-bottom: 1px solid var(--borda);
        box-shadow: 0 12px 24px rgba(0,0,0,.14);
        padding: .5rem; max-height: calc(100vh - 52px); overflow-y: auto;
        transform: translateY(-120%); transition: transform .2s ease;
    }
    .layout-dashboard.topnav-aberto .topnav { transform: translateY(0); }
    .topnav-link { width: 100%; justify-content: flex-start; }
    .topnav-grupo { position: static; }
    .topnav-menu { position: static; box-shadow: none; border: 0; padding: 0 0 .25rem 1.5rem; min-width: 0; }
    .topnav-caret { margin-left: auto; }
}

/* ===== Editor de tarefa reutilizável (window.TarefaEditor) =====
   Modal compartilhado pelas abas "Tarefas" do detalhe de Oportunidade/Ticket.
   Espelha o visual do drawer do módulo Tarefas (.drawer-grid). */
#modalTarefaEditor .te-grid { display:grid; grid-template-columns:128px 1fr; gap:.7rem .9rem; align-items:center; margin-bottom:.4rem; }
#modalTarefaEditor .te-grid > label { font-size:.82rem; color:var(--texto-fraco); font-weight:500; }
#modalTarefaEditor .te-acoes { display:flex; flex-wrap:wrap; gap:.5rem; margin-bottom:1rem; }
#modalTarefaEditor .te-dur { display:flex; align-items:center; gap:.45rem; }
/* Inputs de duração polidos como qualquer campo do sistema (sem aparência crua
   de type=number: largura fixa, borda/raio padrão e sem as setinhas do spinner). */
#modalTarefaEditor .te-dur input {
    width:68px; padding:.55rem .6rem; border:1px solid var(--borda); border-radius:8px;
    background:var(--bg-card); color:var(--texto); font-size:.9rem; text-align:center;
    transition:border-color .12s, box-shadow .12s; -moz-appearance:textfield; appearance:textfield;
}
#modalTarefaEditor .te-dur input:hover { border-color:var(--borda-forte, var(--primary)); }
#modalTarefaEditor .te-dur input:focus { outline:none; border-color:var(--primary); box-shadow:0 0 0 3px var(--primary-soft, rgba(37,99,235,.15)); }
#modalTarefaEditor .te-dur input::-webkit-outer-spin-button,
#modalTarefaEditor .te-dur input::-webkit-inner-spin-button { -webkit-appearance:none; margin:0; }
#modalTarefaEditor .te-dur span { font-size:.85rem; color:var(--texto-fraco); }
#modalTarefaEditor .te-sec { font-size:.8rem; font-weight:700; color:var(--texto-fraco); text-transform:uppercase; letter-spacing:.03em; margin:1rem 0 .5rem; }
#modalTarefaEditor .te-vazio { color:var(--texto-fraco); font-size:.82rem; }
#modalTarefaEditor .te-sub { display:flex; align-items:center; gap:.5rem; padding:.35rem 0; border-bottom:1px solid var(--borda); }
#modalTarefaEditor .te-sub:last-child { border-bottom:none; }
#modalTarefaEditor .te-sub-feita { text-decoration:line-through; color:var(--texto-fraco); }
#modalTarefaEditor .te-sub-add { display:flex; gap:.4rem; margin-top:.5rem; }
#modalTarefaEditor .modal-footer { display:flex; align-items:center; justify-content:space-between; gap:.5rem; }
#modalTarefaEditor .te-footer-dir { display:flex; gap:.5rem; margin-left:auto; }
@media (max-width:600px){
    #modalTarefaEditor .te-grid { grid-template-columns:1fr; gap:.3rem .9rem; }
    #modalTarefaEditor .te-grid > label { margin-top:.4rem; }
}

/* Tabela de tarefas vinculadas (abas Tarefas de Oportunidade/Ticket) */
.tv-toolbar { display:flex; justify-content:flex-end; margin-bottom:.75rem; }
.tv-tabela tbody tr.tv-row { cursor:pointer; }
.tv-titulo-cel { display:flex; align-items:center; gap:.55rem; }
.tv-titulo-txt { overflow:hidden; text-overflow:ellipsis; }
.tv-row.feita .tv-titulo-txt { text-decoration:line-through; color:var(--texto-fraco); }
.tv-prazo { display:block; margin-top:.15rem; margin-left:1.7rem; font-size:.72rem; color:var(--texto-fraco); }
/* check de status na linha (concluir/cancelado/pausado) */
.tv-check { width:18px; height:18px; border-radius:50%; border:2px solid var(--borda); background:none; cursor:pointer; flex-shrink:0;
    display:inline-flex; align-items:center; justify-content:center; padding:0; line-height:1; font-size:.55rem; color:#fff; transition:background .15s, border-color .15s; }
.tv-check:hover { border-color:#16a34a; }
.tv-check.on        { background:#16a34a; border-color:#16a34a; }
.tv-check.cancelada { background:#dc2626; border-color:#dc2626; }
.tv-check.pausada   { background:#d97706; border-color:#d97706; }
.tv-badge { display:inline-block; font-size:.72rem; font-weight:600; padding:.12rem .5rem; border-radius:10px; }
.tv-badge.aberta   { background:var(--primary-soft); color:var(--primary); }
.tv-badge.pausada  { background:#fef3c7; color:#92400e; }
.tv-badge.cancelada{ background:#fee2e2; color:#991b1b; }
.tv-badge.concluida{ background:#dcfce7; color:#166534; }

/* ── Logo Entrega Jah! (partial brand-logo) ─────────────────────────────
   O partial usa SVG inline; aqui só o dimensionamento por contexto
   (mesmos lugares que a logo antiga ocupava). */
.brand-logo svg { height: 30px; width: auto; display: block; }
.brand-logo-text { font-size: 1.02rem; color: var(--texto, #101522); white-space: nowrap; }
.login-logo .brand-logo svg { height: 54px; }
.login-logo .brand-logo-text { font-size: 1.35rem; }
.sidebar.colapsada .brand-logo-text { display: none; }

/* ===== Login: caixinha oficial animada (marca do V1) ===== */
.login-logo { flex-direction: column; align-items: center; }
.login-logo .login-box-img {
    width: 96px; height: auto; display: block; margin: 0 auto .5rem;
    filter: drop-shadow(0 14px 18px rgba(255,120,0,0.28));
    animation: loginBoxIn 0.7s cubic-bezier(.2,.8,.25,1) both,
               loginBoxFloat 4.5s ease-in-out 0.7s infinite;
}
@keyframes loginBoxIn {
    0%   { opacity: 0; transform: translateY(-34px) rotate(-10deg) scale(.85); }
    100% { opacity: 1; transform: translateY(0) rotate(0) scale(1); }
}
@keyframes loginBoxFloat {
    0%,100% { transform: translateY(0) rotate(-1deg); }
    50%     { transform: translateY(-8px) rotate(1.5deg); }
}
@media (prefers-reduced-motion: reduce) {
    .login-logo .login-box-img { animation: none; }
}
.login-logo .brand-wordmark {
    font-weight: 900; font-size: 2rem; letter-spacing: -0.02em; line-height: 1;
}
.login-logo .brand-wordmark .bw-1 { color: var(--texto, #0D1F3A); }
.login-logo .brand-wordmark .bw-2 { color: var(--primary, #FF6B00); }
.login-logo p { margin: .5rem 0 0; color: var(--texto-fraco, #6B7076); font-size: .92rem; }
