/* WellSystem — paleta teal/slate, tema claro/escuro, 100% responsivo. */
:root{
  /* Marca: vinho/bordô suave (aplicado com sutileza). Vermelho vivo fica só p/ alertas. */
  --brand:#9E2A3B; --brand-2:#7f2230; --brand-3:#b23c4d;
  --bg:#F8FAFC; --surface:#FFFFFF; --surface-2:#fdfbfb; --border:#e6e2e3;
  --text:#1a1416; --muted:#6b6167;
  --ok:#16A34A; --err:#DC2626; --warn:#D97706; --info:#0284C7;
  --shadow:0 1px 3px rgba(26,20,22,.07);
  --shadow-lg:0 10px 30px -12px rgba(158,42,59,.20);
  --grad:linear-gradient(160deg,#f8f9fb 0%,#eef0f4 55%,#e7eaef 100%);
  --grad-brand:linear-gradient(135deg,#9e2a3b 0%,#b23c4d 55%,#7f2230 100%);
  /* Degradê do topo: mais fechado e um pouco mais escuro que a versão anterior
     (era .96 de branco quase puro descendo para #e4e7ec, quase plano). Clareado depois de um
     primeiro ajuste que ficou pesado demais: o contraste separa o topo do conteúdo sem
     escurecer a barra. */
  --top-bg:linear-gradient(180deg,rgba(242,244,248,.97) 0%,rgba(221,225,233,.97) 100%);
}
@media (prefers-color-scheme:dark){
  :root{
    --brand:#E0687A; --brand-2:#c94f63; --brand-3:#eb8496;
    --bg:#14100F; --surface:#211A1C; --surface-2:#2a2124; --border:#3a2f32;
    --text:#ECE6E7; --muted:#a3979b;
    --ok:#22C55E; --err:#EF4444; --warn:#F59E0B; --info:#38BDF8;
    --shadow:0 1px 3px rgba(0,0,0,.45);
    --shadow-lg:0 12px 34px -14px rgba(0,0,0,.6);
    --grad:linear-gradient(135deg,#140d0f 0%,#181113 55%,#1b1215 100%);
    --grad-brand:linear-gradient(135deg,#e0687a 0%,#c94f63 55%,#eb8496 100%);
    --top-bg:linear-gradient(180deg,rgba(26,19,21,.90) 0%,rgba(17,12,14,.90) 100%);
  }
}
/* Temas de COR (troca a marca) — aplicados via data-cor no <html> */
:root[data-cor="azul"]{--brand:#1d4ed8;--brand-2:#1e40af;--brand-3:#3b82f6;--grad-brand:linear-gradient(135deg,#1d4ed8 0%,#3b82f6 55%,#0ea5e9 100%);--shadow-lg:0 10px 30px -12px rgba(29,78,216,.22)}
:root[data-cor="preto"]{--brand:#111827;--brand-2:#000000;--brand-3:#374151;--grad-brand:linear-gradient(135deg,#111827 0%,#374151 55%,#0b0f19 100%);--shadow-lg:0 10px 30px -12px rgba(0,0,0,.3)}
:root[data-cor="verde"]{--brand:#16a34a;--brand-2:#15803d;--brand-3:#22c55e;--grad-brand:linear-gradient(135deg,#16a34a 0%,#22c55e 55%,#4ade80 100%);--shadow-lg:0 10px 30px -12px rgba(22,163,74,.22)}
/* Modo CLARO/ESCURO manual (sobrepõe o do sistema) */
:root[data-theme="dark"]{--bg:#14100F;--surface:#211A1C;--surface-2:#2a2124;--border:#3a2f32;--text:#ECE6E7;--muted:#a3979b;--grad:linear-gradient(135deg,#140d0f 0%,#181113 55%,#1b1215 100%);--top-bg:linear-gradient(180deg,rgba(26,19,21,.90) 0%,rgba(17,12,14,.90) 100%);--shadow:0 1px 3px rgba(0,0,0,.45)}
:root[data-theme="light"]{--bg:#F8FAFC;--surface:#FFFFFF;--surface-2:#fdfbfb;--border:#e6e2e3;--text:#1a1416;--muted:#6b6167;--grad:linear-gradient(160deg,#f8f9fb 0%,#eef0f4 55%,#e7eaef 100%);--top-bg:linear-gradient(180deg,rgba(242,244,248,.97) 0%,rgba(221,225,233,.97) 100%);--shadow:0 1px 3px rgba(26,20,22,.07)}
/* Controle de tema no topo */
.ws-tema{display:inline-flex;align-items:center;position:relative;flex-shrink:0}
.ws-tema-btn{background:none;border:1px solid var(--border);border-radius:8px;cursor:pointer;font-size:14px;padding:5px 8px;color:var(--text);line-height:1}
.ws-tema-btn:hover{border-color:var(--brand)}
.ws-tema-pop{display:none;position:absolute;top:calc(100% + 6px);right:0;background:var(--surface);border:1px solid var(--border);
  border-radius:10px;padding:8px;gap:6px;align-items:center;box-shadow:var(--shadow-lg);z-index:9999}
.ws-tema.open .ws-tema-pop{display:flex}
.ws-tema-pop b{width:16px;height:16px;border-radius:50%;cursor:pointer;border:2px solid transparent;display:inline-block}
.ws-tema-pop b.on{border-color:var(--text)}
.ws-tema-pop .c-vinho{background:#9E2A3B}.ws-tema-pop .c-azul{background:#1d4ed8}.ws-tema-pop .c-preto{background:#111827}.ws-tema-pop .c-verde{background:#16a34a}
.ws-tema-pop .ws-tema-claroescuro{background:none;border:1px solid var(--border);border-radius:8px;cursor:pointer;font-size:14px;padding:2px 6px;color:var(--text);margin-left:2px}

*{box-sizing:border-box}
/* Rede de segurança 100% responsiva: nada (header, tabela, modal, imagem esquecida) consegue
   forçar rolagem horizontal na página, em nenhuma tela de celular. */
html,body{max-width:100%;overflow-x:hidden}
img,svg,video{max-width:100%}
html{min-height:100%;
  /* CORPO FIXO — sem pulo lateral. Ao abrir/fechar algo na tela o conteudo muda de
     altura; quando isso faz a barra de rolagem vertical aparecer ou sumir, a largura
     util muda e a pagina INTEIRA salta para o lado. scrollbar-gutter reserva esse
     espaco de uma vez, entao a largura nunca muda e nada se desloca. */
  scrollbar-gutter:stable}
body{margin:0;font-family:system-ui,-apple-system,Segoe UI,Roboto,sans-serif;color:var(--text);font-size:15px;
  background:var(--grad) fixed;min-height:100vh}
a{color:var(--brand);text-decoration:none}
a:hover{text-decoration:underline}
code{background:rgba(125,125,125,.15);padding:1px 5px;border-radius:4px;font-size:.9em}

/* Marca */
.ws-brand{font-size:30px;font-weight:800;letter-spacing:-.5px;margin:0 0 4px}
.ws-brand span,.ws-brand-sm span{background:var(--grad-brand);-webkit-background-clip:text;background-clip:text;-webkit-text-fill-color:transparent}
.ws-brand-sm{font-size:20px;font-weight:800}
.ws-brand-sm span{background:var(--grad-brand);-webkit-background-clip:text;background-clip:text;-webkit-text-fill-color:transparent}
.ws-logo{height:56px;width:auto;max-width:250px;display:block;object-fit:contain;flex:none}
.ws-logo-lg{max-height:70px;max-width:100%;width:auto;display:block;margin:0 auto 8px;object-fit:contain}
.ws-muted{color:var(--muted)}

/* Topo / nav — logo à esquerda, menu no centro, usuário à direita (ORIGINAL). */
.ws-top{display:flex;align-items:center;gap:10px;padding:8px 18px;background:var(--top-bg);
  backdrop-filter:saturate(160%) blur(10px);-webkit-backdrop-filter:saturate(160%) blur(10px);
  border-bottom:1px solid var(--border);box-shadow:0 1px 0 rgba(158,42,59,.07),var(--shadow);
  flex-wrap:wrap;position:sticky;top:0;z-index:20}
.ws-top::before{content:"";position:absolute;left:0;right:0;top:0;height:3px;background:var(--grad-brand)}

/* Cabeçalho em 2 linhas — linha 1 discreta (selo pequeno + utilidades), linha 2 = marca + MENU
   verdadeiramente centralizado na página (grid de 3 colunas: marca | menu centrado | espaço). */
.ws-top-wrap{position:sticky;top:0;z-index:5000;background:var(--top-bg);
  backdrop-filter:saturate(160%) blur(10px);-webkit-backdrop-filter:saturate(160%) blur(10px);
  border-bottom:1px solid var(--border);box-shadow:0 1px 0 rgba(158,42,59,.07),var(--shadow)}
.ws-top-wrap::before{content:"";display:block;height:3px;background:var(--grad-brand)}
/* Linha da MARCA na base do topo — separa o cabeçalho do conteúdo (acima dos cards). Segue a cor do tema/white-label. */
.ws-top-wrap::after{content:"";display:block;height:3px;background:var(--grad-brand);opacity:.9}
.ws-top-l1{display:flex;align-items:center;gap:10px;padding:5px 18px;border-bottom:1px dashed var(--border);
  font-size:12.5px;flex-wrap:wrap;row-gap:6px;
  /* Degradê suave na cor do TEMA (theme-aware) — elegante e sem prejudicar a leitura (tinta baixa). */
  background:linear-gradient(180deg,color-mix(in srgb,var(--brand) 12%,transparent) 0%,transparent 78%)}
/* Preenchimento elástico da linha 1 do topo — em telas largas empurra os ícones/seletor/usuário pra
   direita; em telas estreitas vira "quebra de linha" forçada (flex-basis:100%), pra não espremer
   nem estourar a largura da tela com tudo numa linha só. */
.ws-top-fill{flex:1 1 auto}
@media(max-width:640px){
  .ws-top-fill{flex-basis:100%;height:0}
  .ws-top-l1 .ws-nav-cidade{flex:1 1 100%;width:100%;margin-top:2px}
  .ws-top-l1 .ws-user{flex:1 1 100%;width:100%;justify-content:flex-end;margin-top:2px}
}
.ws-top-selo{display:inline-flex;flex:none;opacity:.9;transition:opacity .15s}
.ws-top-selo:hover{opacity:1}
.ws-top-selo img{width:24px;height:24px;object-fit:contain;border-radius:6px;display:block}
.ws-top-l2{display:grid;grid-template-columns:auto 1fr auto;align-items:center;gap:14px;padding:10px 18px 12px}
.ws-top-marca{display:flex;justify-self:start;align-items:center;padding:8px 0 0 18px;filter:drop-shadow(0 2px 6px rgba(0,0,0,.18))}
.ws-top-l2 .ws-nav{flex:none;justify-content:flex-start;justify-self:start;margin-left:clamp(40px,6vw,95px);margin-right:0}
.ws-top-spacer{justify-self:end}
@media(max-width:900px){
  .ws-top-l2{grid-template-columns:auto 1fr}
  .ws-top-spacer{display:none}
  .ws-top-l2 .ws-nav{justify-self:start;overflow-x:auto;max-width:100%;margin-left:10px}
}

.ws-nav{display:flex;gap:2px;flex:1;flex-wrap:nowrap;justify-content:flex-start;align-items:center;min-width:0;overflow:visible;
  font-family:"Segoe UI Variable Text","Segoe UI",Inter,system-ui,-apple-system,sans-serif}
.ws-nav a{padding:9px 11px;border-radius:8px;color:var(--text);font-weight:600;font-size:14.5px;letter-spacing:.2px;
  transition:.15s;white-space:nowrap;flex:0 0 auto}
.ws-nav a.on,.ws-nav a:hover{background:var(--grad-brand);color:#fff;text-decoration:none;box-shadow:var(--shadow-lg)}
/* Menu agrupado (dropdown por correlação) */
.ws-grp{position:relative;display:flex;flex-direction:column;align-items:flex-start}
.ws-grp-lbl{padding:9px 12px;border-radius:8px;color:var(--text);font-weight:600;font-size:15px;background:none;border:0;cursor:pointer;white-space:nowrap;display:flex;align-items:center;gap:3px;transition:.15s}
.ws-grp-lbl::after{content:"▾";font-size:10px;opacity:.7;transition:transform .15s}
.ws-grp.open .ws-grp-lbl::after,.ws-grp:hover .ws-grp-lbl::after{transform:rotate(180deg)}
/* "Página atual" (persistente) x hover (passageiro) usam sinais visuais DIFERENTES de propósito —
   ninguém confunde mais "ainda marcado" com "travou": current = fundo sólido; hover = só contorno. */
.ws-grp-lbl.on{background:var(--grad-brand);color:#fff}
.ws-grp-lbl:hover{background:rgba(158,42,59,.12);color:var(--text)}
.ws-grp-lbl.on:hover{background:var(--grad-brand);color:#fff}
/* Submenu em "degraus": abre EMPILHADO (um item abaixo do outro) logo abaixo do próprio
   botão do grupo, mas flutuando POR CIMA do conteúdo (position:absolute) — não deve empurrar
   nem alargar o layout da página. O <.ws-grp> pai é o ancoradouro (position:relative).
   Abre no HOVER (desktop) — fecha sozinho ao tirar o mouse, nunca fica "preso" aberto — E também
   no click (toque/mobile, via JS adicionando .open), com pequeno atraso pra não fechar sozinho
   ao passar o mouse de um item pro outro dentro do próprio menu. */
.ws-sub{position:absolute;top:100%;left:0;display:none;flex-direction:column;min-width:190px;
  background:var(--surface-2,var(--surface));border:1px solid var(--border);border-radius:9px;
  padding:9px 5px 5px;gap:1px;margin:0;box-shadow:var(--shadow-lg);z-index:9999}
.ws-grp.open .ws-sub,.ws-grp:hover .ws-sub{display:flex}
.ws-grp.ws-flip .ws-sub{left:auto;right:0} /* JS marca .ws-flip quando o menu estouraria a borda direita da tela */
.ws-sub a{padding:8px 12px;border-radius:7px;color:var(--text);font-size:13.5px;font-weight:500;white-space:nowrap}
.ws-sub a.on{background:var(--grad-brand);color:#fff}
.ws-sub a:hover{background:rgba(158,42,59,.12);color:var(--text);text-decoration:none}
.ws-sub a.on:hover{background:var(--grad-brand);color:#fff}
/* Mega-menu: várias colunas lado a lado, cada uma com um título de categoria (ex.: Financeiro
   com Títulos / Carnês / Caixa / Cobrança). display:flex no .ws-sub já existe acima (herdado); só
   precisa virar "row" em vez de "column" e ganhar largura maior + colunas internas. */
.ws-sub.ws-mega{flex-direction:row;align-items:flex-start;min-width:auto;padding:14px;gap:22px}
.ws-mega-col{display:flex;flex-direction:column;gap:1px;min-width:170px}
.ws-mega-titulo{font-size:10.5px;font-weight:800;text-transform:uppercase;letter-spacing:.4px;color:var(--muted);
  padding:4px 12px 8px;border-bottom:1px solid var(--border);margin-bottom:4px}
@media(max-width:820px){
  .ws-sub.ws-mega{flex-direction:column;flex-wrap:nowrap;max-height:70vh;overflow-y:auto}
  .ws-mega-col{min-width:0}
}
.ws-user{color:var(--muted);font-size:13px;white-space:nowrap}
/* Chip do operador logado: foto (ou inicial) + nome + ponto "online" verde + sair. */
.ws-user-chip{display:inline-flex;align-items:center;gap:8px}
.ws-user-foto{width:30px;height:30px;border-radius:50%;object-fit:cover;border:1.5px solid var(--border);flex:none}
.ws-user-ini{display:inline-flex;align-items:center;justify-content:center;background:var(--grad-brand);color:#fff;font-weight:800;font-size:13px}
.ws-user-nome{display:inline-flex;align-items:center;gap:6px;font-weight:600;color:var(--text)}
.ws-user-saudacao{font-weight:700;color:var(--brand);-webkit-text-fill-color:var(--brand);margin-right:-2px}
@media(max-width:640px){.ws-user-saudacao{display:none}}
.ws-online-dot{width:8px;height:8px;border-radius:50%;background:#22c55e;box-shadow:0 0 0 2px rgba(34,197,94,.25);flex:none}
.ws-brand-sm,.ws-brand{flex-shrink:0}
/* Botão hambúrguer: escondido no desktop, aparece no mobile/tablet. */
.ws-nav-toggle{display:none;align-items:center;gap:7px;background:none;border:1px solid var(--border);color:var(--text);font-weight:700;font-size:14px;padding:8px 12px;border-radius:10px;cursor:pointer}
.ws-nav-toggle:hover{background:color-mix(in srgb,var(--brand) 10%,transparent)}
.ws-nav-backdrop{display:none}

@media(max-width:900px){
  .ws-top{flex-wrap:wrap}
  .ws-nav-toggle{display:inline-flex;justify-self:end}
  /* l2 vira uma linha limpa: marca à esquerda, hambúrguer à direita. */
  .ws-top-l2{gap:8px}
  .ws-nav-right{display:none}
  /* IMPORTANTE: o backdrop-filter do cabeçalho faz um elemento position:fixed se ancorar NELE (e não
     no viewport), o que deixava o menu estreito/torto. No mobile removemos o filtro pra o menu ocupar
     a tela inteira corretamente. */
  .ws-top-wrap{backdrop-filter:none!important;-webkit-backdrop-filter:none!important}
  /* MENU MOBILE: painel em COLUNA, ocupando a tela toda abaixo do topo, rolável. Escondido por
     padrão; abre com o hambúrguer (.open). Selector .ws-top-l2 .ws-nav p/ vencer as regras base. */
  .ws-top-l2 .ws-nav{
    position:fixed; left:0; right:auto; top:var(--ws-top-h,96px); bottom:0; z-index:9998;
    display:none; flex-direction:column; align-items:stretch; gap:2px; width:100vw; max-width:100vw; margin:0;
    background:var(--bg,#14100F); border-top:1px solid var(--border);
    padding:10px 12px calc(90px + env(safe-area-inset-bottom,0px)); overflow-y:auto; overflow-x:hidden; -webkit-overflow-scrolling:touch;
  }
  .ws-top-l2 .ws-nav.open{display:flex}
  .ws-nav>a, .ws-nav .ws-grp{width:100%;flex:0 0 auto;align-items:stretch}
  .ws-nav>a{padding:14px 14px;font-size:16px;border-bottom:1px solid var(--border)}
  .ws-grp-lbl{width:100%;justify-content:space-between;padding:14px 14px;font-size:16px;border-bottom:1px solid var(--border)}
  /* Submenu no mobile: EM FLUXO (accordion), aparece só quando o grupo está .open. */
  .ws-sub, .ws-sub.ws-mega{
    position:static!important; display:none; flex-direction:column!important; min-width:0; width:100%;
    box-shadow:none; border:0; background:transparent; padding:4px 0 8px 6px; gap:2px; max-height:none;
  }
  .ws-grp.open > .ws-sub{display:flex!important}
  .ws-grp:hover > .ws-sub{display:none} /* no toque, quem manda é o .open (click), não o hover */
  .ws-grp.open:hover > .ws-sub{display:flex!important}
  .ws-mega-col{min-width:0;width:100%;padding:2px 0}
  .ws-mega-titulo{padding:8px 10px 4px}
  .ws-sub a{padding:12px 12px;font-size:14.5px;border-radius:8px}
  /* Backdrop escurecido atrás do menu aberto. */
  .ws-nav-backdrop.open{display:block;position:fixed;inset:0;top:var(--ws-top-h,96px);background:rgba(0,0,0,.35);z-index:9997}
}
/* padding-bottom = altura REAL do rodapé fixo (~44px) + uma folga curta.
   Eram 92px, quase o dobro do necessário: com o seletor de página no fim da lista, sobrava uma
   faixa branca visível entre ele e o rodapé. Reduzir sem medir arriscaria esconder conteúdo atrás
   do rodapé — por isso 56px, que cobre o rodapé e encosta o conteúdo nele sem folga inútil. */
.ws-main{max-width:none;margin:12px auto;padding:0 clamp(14px,2vw,32px) 56px;width:100%}

/* Cards / login / install */
/* ---- TELAS DE ENTRADA (login, ativação, primeiro acesso, instalação) -----------------------
   CENTRALIZAÇÃO QUE NÃO QUEBRA EM TELA BAIXA.
   O cartão era centralizado por "margin: 12vh auto" — uma folga fixa proporcional à altura. Em
   celular deitado, ou com o teclado virtual aberto (que reduz a área visível pela metade), essa
   folga empurra o formulário para fora e o botão fica inalcançável, sem rolagem aparente.
   Com flex + min-height, o cartão fica no MEIO quando cabe e rola naturalmente quando não cabe.
   O "auto" nas margens verticais neutraliza o vh que vem no atributo style das telas antigas. */
.ws-install{display:flex;align-items:center;justify-content:center;
            min-height:100vh;min-height:100dvh;padding:16px;box-sizing:border-box}
.ws-install > .ws-card{margin-top:auto!important;margin-bottom:auto!important;width:100%}
/* Telas muito baixas (celular deitado): encosta no topo e rola, em vez de cortar o conteúdo. */
@media (max-height:560px){
  .ws-install{align-items:flex-start}
  .ws-install > .ws-card{margin-top:12px!important;margin-bottom:12px!important}
}
/* Telas estreitas: o cartão usa a largura toda menos a folga lateral, e o respiro interno diminui
   — 26px de padding num aparelho de 320px consome um quinto da tela. */
@media (max-width:420px){
  .ws-install{padding:10px}
  .ws-install > .ws-card{padding:18px 16px;border-radius:14px}
}
.ws-install .ws-card{position:relative;overflow:hidden;box-shadow:var(--shadow-lg)}
.ws-install .ws-card::before{content:"";position:absolute;left:0;right:0;top:0;height:4px;background:var(--grad-brand)}
.ws-card{background:var(--surface);border:1px solid var(--border);border-radius:16px;padding:26px;box-shadow:var(--shadow)}
.ws-card:hover{box-shadow:var(--shadow-lg)}

/* Botões */
/* Botões globais — menores, mais suaves e discretos (menos sombra, tons macios, hover leve). */
.ws-btn{display:inline-block;padding:7px 13px;border:1px solid var(--border);border-radius:8px;
  background:var(--surface);color:var(--text);font-weight:600;cursor:pointer;font-size:13px;line-height:1.25;transition:.15s}
.ws-btn:hover{border-color:var(--brand);text-decoration:none}
.ws-btn.primary{background:var(--grad-brand);border-color:transparent;color:#fff;box-shadow:0 1px 3px rgba(0,0,0,.10)}
.ws-btn.primary:hover{filter:brightness(1.04);border-color:transparent}
.ws-btn.danger{background:#e06673;border-color:#e06673;color:#fff;box-shadow:none}
.ws-btn.danger:hover{filter:brightness(1.04);border-color:#e06673}
.ws-btn.verde{background:#35b06e;border-color:#35b06e;color:#fff;box-shadow:none}
.ws-btn.verde:hover{filter:brightness(1.04);border-color:#35b06e}
.ws-btn.verde:hover{filter:brightness(1.06)}
button.verde,input[type=submit].verde{background:var(--ok)!important;border-color:var(--ok)!important;color:#fff!important}
.ws-btn:active{transform:translateY(1px)}

/* Alertas */
.ws-alert{padding:11px 15px;border-radius:9px;margin:12px 0;font-size:14px}
/* Botão flutuante "voltar ao topo" (global) — pequeno, cor do tema, só aparece ao rolar a página. */
.ws-gotop{position:fixed;right:18px;bottom:64px;z-index:1000001;width:38px;height:38px;border-radius:50%;
  border:none;cursor:pointer;background:var(--grad-brand,#9e2a3b);color:#fff;display:flex;align-items:center;justify-content:center;
  box-shadow:0 6px 16px rgba(0,0,0,.28);opacity:0;visibility:hidden;transform:translateY(8px);
  transition:opacity .2s ease,transform .2s ease,visibility .2s ease}
.ws-gotop.on{opacity:.92;visibility:visible;transform:translateY(0)}
.ws-gotop:hover{opacity:1;transform:translateY(-2px)}
@media print{.ws-gotop{display:none!important}}
/* Flash vira toast flutuante (visível em qualquer rolagem) — fica 10s, fecha no clique. */
.ws-flash-toast{position:fixed;top:14px;left:50%;transform:translateX(-50%);z-index:100000;margin:0;min-width:260px;max-width:92vw;
  box-shadow:0 12px 34px -8px rgba(0,0,0,.35);cursor:pointer;animation:wsFlashIn .25s ease}
@keyframes wsFlashIn{from{opacity:0;transform:translate(-50%,-12px)}to{opacity:1;transform:translate(-50%,0)}}
.ws-flash-toast.hide{opacity:0;transition:opacity .4s}
.ws-alert.ok{background:rgba(22,163,74,.12);color:var(--ok);border:1px solid var(--ok)}
.ws-alert.err{background:rgba(220,38,38,.12);color:var(--err);border:1px solid var(--err)}

/* Cabeçalho de seção */
.ws-head-row{display:flex;align-items:center;justify-content:space-between;gap:12px;flex-wrap:wrap;margin:8px 0 14px}
.ws-head-row h2,.ws-head-row h3{margin:0}

/* Stats do painel */
.ws-cards{display:grid;grid-template-columns:repeat(auto-fit,minmax(170px,1fr));gap:16px;margin:16px 0}
/* Cards compactos estilo MK-Auth (painel) */
.ws-mkcards{display:grid;grid-template-columns:repeat(auto-fit,minmax(120px,1fr));gap:10px;margin:16px 0}
.ws-mk{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:2px;padding:12px 8px;border-radius:12px;
  color:#fff;text-decoration:none;box-shadow:var(--shadow);transition:.15s;min-height:88px}
.ws-mk:hover{transform:translateY(-2px);box-shadow:var(--shadow-lg);text-decoration:none;filter:brightness(1.05)}
.ws-mk-lbl{font-size:12px;font-weight:700;opacity:.95;text-transform:uppercase;letter-spacing:.3px}
.ws-mk-num{font-size:30px;font-weight:800;line-height:1.05}
.ws-mk-pct{font-size:11px;opacity:.85;font-weight:600}
.ws-mk-azul{background:linear-gradient(135deg,#2563eb,#1d4ed8)}
.ws-mk-roxo{background:linear-gradient(135deg,#7c3aed,#6d28d9)}
.ws-mk-ciano{background:linear-gradient(135deg,#0891b2,#06b6d4)}
.ws-mk-amarelo{background:linear-gradient(135deg,#d97706,#f59e0b)}
.ws-mk-vermelho{background:linear-gradient(135deg,#dc2626,#b91c1c)}
.ws-mk-laranja{background:linear-gradient(135deg,#ea580c,#f97316)}
.ws-mk-verde{background:linear-gradient(135deg,#16a34a,#15803d)}
.ws-mk-preto{background:linear-gradient(135deg,#374151,#111827)}
.ws-mk-cinza{background:linear-gradient(135deg,#6b7280,#4b5563)}
.ws-stat{position:relative;display:block;background:var(--surface);border:1px solid var(--border);border-radius:14px;padding:20px 18px;text-align:center;box-shadow:var(--shadow);overflow:hidden;transition:.15s;color:inherit;text-decoration:none}
a.ws-stat{cursor:pointer}
.ws-stat:hover{box-shadow:var(--shadow-lg);transform:translateY(-2px);text-decoration:none}
.ws-stat::before{content:"";position:absolute;left:0;top:0;bottom:0;width:4px;background:var(--grad-brand)}
.ws-stat span{font-size:32px;font-weight:800;background:var(--grad-brand);-webkit-background-clip:text;background-clip:text;-webkit-text-fill-color:transparent;display:block;line-height:1.15}
.ws-stat label{color:var(--muted);font-size:13px}

/* Busca */
.ws-search{display:flex;gap:8px;margin-bottom:14px;flex-wrap:wrap}
.ws-search input[type=text],.ws-search input[type=search],.ws-search input:not([type]){flex:0 1 260px;max-width:260px}
.ws-search input.ws-busca-grande{flex:1 1 320px!important;max-width:none!important;min-height:44px;font-size:16px;padding:10px 14px}
.ws-nav-hist{display:inline-flex;gap:4px;margin-right:2px}
.ws-nav-hist a, .ws-nav-hist button{background:transparent;cursor:pointer;font-family:inherit;padding:6px 14px;border-radius:8px;text-decoration:none;opacity:.85;color:var(--brand);-webkit-text-fill-color:var(--brand);font-weight:800;font-size:15px;border:1px solid var(--border);line-height:1}
.ws-nav-hist a:hover, .ws-nav-hist button:hover{opacity:1;background:var(--grad-brand);color:#fff;-webkit-text-fill-color:#fff;border-color:transparent}
.ws-nav-cidade{font-size:12px;padding:5px 8px;border-radius:8px;border:1px solid var(--border);background:var(--surface);color:var(--text)}
.ws-btn-tema-top{background:var(--surface);border:1px solid var(--border);border-radius:8px;cursor:pointer;font-size:16px;line-height:1;padding:4px 8px;color:var(--text);display:inline-flex;align-items:center;justify-content:center;height:30px;width:34px;margin-right:8px;vertical-align:middle;transition:.15s}
.ws-btn-tema-top:hover{border-color:var(--brand);box-shadow:var(--shadow)}
.ws-tema-txt{display:none} /* texto removido do botão (só ícone) — classe mantida por compatibilidade */
/* Ícone de tema moderno (linha fina, sol/lua) — troca sozinho conforme o tema ativo, sem depender de emoji */
.ws-btn-tema-top svg{width:17px;height:17px;display:block}
.ws-btn-tema-top .ws-ico-lua{display:none}
:root[data-theme="dark"] .ws-btn-tema-top .ws-ico-sol{display:none}
:root[data-theme="dark"] .ws-btn-tema-top .ws-ico-lua{display:block}
@media(prefers-color-scheme:dark){
  :root:not([data-theme="light"]) .ws-btn-tema-top .ws-ico-sol{display:none}
  :root:not([data-theme="light"]) .ws-btn-tema-top .ws-ico-lua{display:block}
}
/* Ícones modernos (ws_icon() em config.php) — linha fina, herdam a cor do texto ao redor */
.ws-ico{width:15px;height:15px;display:inline-block;vertical-align:-3px;flex:none}
.ws-btn .ws-ico{margin-right:2px}
.ws-olt-grid .ws-ico{width:14px;height:14px;vertical-align:-2px}
a .ws-ico,button .ws-ico{color:inherit}
.ws-btn-reflexo-top{border:1px solid var(--border);border-radius:8px;text-decoration:none;padding:4px 8px;display:inline-flex;align-items:center;justify-content:center;height:30px;width:34px;margin-right:8px;vertical-align:middle;transition:.15s}
.ws-btn-reflexo-top:hover{border-color:var(--ok);box-shadow:var(--shadow)}
.ws-btn-reflexo-top svg{width:17px;height:17px;display:block}
/* Botão "Aparência do sistema" (cor do tema), ao lado do botão claro/escuro no topo */
.ws-btn-cor-top{background:var(--surface);border:1px solid var(--border);border-radius:8px;cursor:pointer;padding:4px 8px;color:var(--text);display:inline-flex;align-items:center;justify-content:center;height:30px;width:34px;margin-right:8px;vertical-align:middle;transition:.15s;position:relative}
.ws-btn-cor-top:hover{border-color:var(--brand);box-shadow:var(--shadow)}
.ws-btn-cor-top svg{width:17px;height:17px;display:block}
.ws-cor-pop{display:none;position:absolute;top:calc(100% + 6px);right:0;background:var(--surface);border:1px solid var(--border);border-radius:10px;padding:8px;gap:6px;align-items:center;box-shadow:0 8px 24px rgba(0,0,0,.18);z-index:9999;flex-wrap:wrap;min-width:160px}
.ws-cor-pop.open{display:flex}
.ws-pagina-atual{font-weight:700;font-size:12px;letter-spacing:.3px;padding:4px 14px;border-radius:14px;background:var(--grad-brand);color:#fff;white-space:nowrap;box-shadow:var(--shadow);display:inline-flex;align-items:center;gap:6px}
/* Barra com o nome do Menu em execução: centralizada de fato na largura TOTAL do topo (ocupa as
   3 colunas do grid .ws-top-l2), assim fica no meio verdadeiro da página — alinhada com o centro
   do conteúdo/colunas abaixo (cards do Painel, tabelas de Estoque/Rede/etc.) em vez de só centrar
   dentro da 1ª coluna (que ficava estreita, do tamanho da marca). */
.ws-titulo-pagina{grid-column:1/-1;order:9;display:flex;justify-content:center;align-items:center;padding:5px clamp(14px,2vw,32px) 0;margin-top:2px;border-top:1px dashed var(--border)}
.ws-secao{border-top:1px solid rgba(0,0,0,.12);padding:10px 10px 8px;margin-top:16px;font-weight:800;font-size:12px;letter-spacing:.06em;text-transform:uppercase;color:color-mix(in srgb,var(--brand) 80%,#000);
  background:linear-gradient(90deg,rgba(122,31,43,.12),rgba(122,31,43,0));border-left:3px solid color-mix(in srgb,var(--brand) 82%,#000);border-radius:6px}
.ws-secao:first-of-type{border-top:none;margin-top:0;padding-top:0}

/* Dashboard moderno de gráficos */
.ws-dashboard-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(330px,1fr));gap:16px;margin:16px 0}
.ws-chart-box{background:var(--surface);border:1px solid var(--border);border-radius:16px;padding:20px;box-shadow:var(--shadow);transition:transform .15s ease,box-shadow .15s ease;display:flex;flex-direction:column}
.ws-chart-box:hover{transform:translateY(-2px);box-shadow:var(--shadow-lg)}
.ws-chart-box h3{margin:0 0 12px;font-size:14px;font-weight:700;color:var(--text);display:flex;align-items:center;justify-content:space-between}
.ws-chart-box h3 span.badge{font-size:11px;font-weight:600;padding:2px 8px;border-radius:12px;background:rgba(125,125,125,.12);color:var(--muted)}

/* Destaque visual para campos com inconsistência/erro */
.ws-campo-erro,input.ws-campo-erro,select.ws-campo-erro,textarea.ws-campo-erro{border:1.5px solid var(--err) !important;background:rgba(220,38,38,.06) !important;outline:none}
.ws-erro-tag{display:inline-flex;align-items:center;gap:4px;font-size:11px;color:var(--err);font-weight:700;margin-top:2px}
.ws-badge-erro{display:inline-block;padding:2px 6px;border-radius:4px;background:rgba(220,38,38,.15);color:var(--err);font-size:11px;font-weight:700;margin-left:6px}

/* Ações na OLT — grade organizada, botões com cor por categoria (não sobrepõe/desalinha) */
.ws-olt-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(130px,1fr));gap:6px}
.ws-olt-grid .ws-btn{display:flex;align-items:center;justify-content:center;gap:5px;text-align:center;white-space:normal;line-height:1.15;font-size:12px;padding:7px 8px;font-weight:600;min-height:0}
.ws-olt-grid .ws-btn span{display:inline}
.olt-neutro{border-color:var(--border);color:var(--text)}
.olt-reiniciar{border-color:#2563eb;color:#2563eb;background:rgba(37,99,235,.08)}
.olt-resync{border-color:#0891b2;color:#0891b2;background:rgba(8,145,178,.08)}
.olt-reiniciar:hover,.olt-resync:hover{filter:brightness(1.08);transform:translateY(-1px)}
.olt-modo{border-color:#d97706;color:#d97706;background:rgba(217,119,6,.08)}
.olt-ativar{border-color:var(--ok);color:var(--ok);background:rgba(22,163,74,.08)}
.olt-desativar{border-color:#ea580c;color:#ea580c;background:rgba(234,88,12,.08)}
.olt-deletar{border-color:var(--err);color:var(--err);background:rgba(220,38,38,.08)}
.olt-neutro:hover{border-color:var(--brand);color:var(--brand)}
.olt-modo:hover,.olt-ativar:hover,.olt-desativar:hover,.olt-deletar:hover{filter:brightness(1.08);transform:translateY(-1px)}
@media(max-width:640px){.ws-olt-grid{grid-template-columns:1fr 1fr}}
.ws-paginacao{background:var(--surface-2);border:1px solid var(--border);border-radius:10px;padding:10px 14px}
.ws-paginacao select{border:1px solid var(--border);border-radius:6px;background:var(--surface);color:var(--text);padding:3px 6px}

/* Tabelas */
.ws-table{width:100%;border-collapse:collapse;background:var(--surface);border:1px solid var(--border);
  border-radius:12px;overflow:hidden;box-shadow:var(--shadow)}
/* Toda tabela do sistema: título (th) E dado (td) centralizados JUNTOS — o título fica sempre no
   meio da própria coluna, alinhado com o conteúdo dela. !important pq várias páginas têm
   style="text-align:right/left" direto no HTML de cada célula (herdado de antes de todo esse
   ajuste) — sem isso, o inline vence e quebra a centralização só nessas colunas específicas. */
.ws-table th,.ws-table td{padding:10px 12px;text-align:center!important;border-bottom:1px solid var(--border);font-size:14px;white-space:nowrap}
/* EXCEÇÃO: coluna com conteúdo "rico" (nome + selo + sublinha + ícone, tipo a lista de Clientes) —
   fica à esquerda mesmo, título e dado, porque centralizar bagunça esse tipo de bloco.
   Use .ws-th-esq em qualquer outra coluna parecida noutra página, o mesmo CSS já resolve. */
.ws-table th.ws-th-esq,.ws-table td.ws-th-esq{text-align:left!important;white-space:normal}
/* Título da coluna (tarja) CENTRALIZADO em relação à própria coluna abaixo — só o cabeçalho;
   o conteúdo da célula (td) continua alinhado à esquerda/direita como cada página define, que é
   o mais legível pra dados/números. !important pq várias páginas têm style="text-align:right/left"
   direto no <th> (herdado de antes) — sem isso, o inline vence e some parte da centralização. */
/* Cabeçalho de tabela = tarja na cor do TEMA (var --grad-brand); muda junto com a paleta. */
.ws-table th{background:var(--grad-brand,var(--brand));font-weight:700;color:#fff;text-transform:uppercase;font-size:11px;letter-spacing:.4px;text-align:center!important;border-bottom:none}
.ws-table thead th:first-child{border-top-left-radius:8px;border-bottom-left-radius:8px}
.ws-table thead th:last-child{border-top-right-radius:8px;border-bottom-right-radius:8px}
.ws-table tbody tr{transition:background .12s}
.ws-table tbody tr:hover{background:rgba(158,42,59,.045)}
/* Nomes/links dentro das tabelas em preto/cinza (não no vinho); só o hover puxa a marca. */
.ws-table td a{color:var(--text)}
.ws-table td a:hover{color:var(--brand)}
.ws-table tr:last-child td{border-bottom:none}

/* Tags de status */
.ws-tag{padding:2px 10px;border-radius:20px;font-size:12px;font-weight:700;text-transform:capitalize}
.ws-tag.ativo{background:rgba(22,163,74,.15);color:var(--ok)}
.ws-tag.inativo{background:rgba(100,116,139,.15);color:var(--muted)}
/* "Aberto" em VERDE: e fatura viva, a receber — nao um estado neutro. O cinza a igualava a
   "cancelada" aos olhos de quem passa a vista pela lista. Vencida segue vermelha e paga verde
   solido, entao os tres continuam distinguiveis. */
.ws-tag.aberto{background:rgba(22,163,74,.13);color:#15803d}
.ws-tag.bloqueado,.ws-tag.cancelado{background:rgba(220,38,38,.15);color:var(--err)}
.ws-tag.suspenso{background:rgba(217,119,6,.15);color:var(--warn)}
.ws-tag.confianca,.ws-tag.adicional{background:rgba(147,51,234,.14);color:#9333ea}
/* Status na lista de Clientes SEM tarja de fundo — só o NOME é colorido:
   bloqueado = vermelho, confiança = lilás, observação = magenta. */
.ws-row-bloqueado .ws-nome b{color:#dc2626 !important}
.ws-row-confianca .ws-nome b{color:#9333ea !important}
.ws-row-observacao .ws-nome b{color:#c026d3 !important}
/* Sub-linha abaixo do nome do titular: nome resumido + qual concentrador (CNC-1/CNC-2) está
   logado + ícone rápido de bloqueio/confiança, clicável direto na lista (sem abrir a ficha). */
.ws-sub-nome{display:flex;align-items:center;gap:6px;margin-top:2px;font-size:11px}
/* CNC-1 = azul forte (principal) · CNC-2 = azul claro (secundário). A cor é o que diferencia
   os dois de relance numa sub-linha de 10px; o texto sozinho exigiria ler o número. */
/* ETIQUETA DO CONCENTRADOR — discreta de verdade.
   Era um retângulo azul CHEIO em cada linha da lista: 25 linhas viravam 25 manchas competindo
   com o nome do cliente, que é o que importa ali. Agora é só o texto na cor do concentrador,
   sem fundo, com um traço fino embaixo indicando que é clicável. O fundo aparece no hover — o
   suficiente para dizer "isto leva a algum lugar" sem gritar o tempo todo.
   CNC-1 = azul forte · CNC-2 = azul claro: a cor continua separando os dois de relance. */
.ws-tag-cnc{background:transparent;font-size:9.5px;font-weight:800;padding:0 3px;
            border-radius:4px;text-decoration:none;letter-spacing:.02em;
            border-bottom:1px dotted currentColor;opacity:.75;
            transition:opacity .12s ease,background .12s ease}
a.ws-tag-cnc:hover{opacity:1;text-decoration:none;border-bottom-color:transparent}
a.ws-tag-cnc:focus-visible{opacity:1;outline:2px solid var(--brand);outline-offset:2px}
.ws-tag-cnc.c1{color:#1d4ed8}
.ws-tag-cnc.c2{color:#0284c7}
.ws-tag-cnc.c3{color:#6366f1}
.ws-tag-cnc.c4{color:#0891b2}
/* No hover o fundo assume a cor do concentrador; o texto precisa virar claro para continuar
   legível — daí o par de regras abaixo, uma por concentrador. */
a.ws-tag-cnc.c1:hover{background:#1d4ed8;color:#fff}
a.ws-tag-cnc.c2:hover{background:#0284c7;color:#fff}
a.ws-tag-cnc.c3:hover{background:#6366f1;color:#fff}
a.ws-tag-cnc.c4:hover{background:#0891b2;color:#fff}
/* Tema escuro: os mesmos azuis ficam apagados no fundo escuro — sobem um tom. */
body.dark-mode .ws-tag-cnc.c1,html[data-theme="dark"] .ws-tag-cnc.c1{color:#60a5fa}
body.dark-mode .ws-tag-cnc.c2,html[data-theme="dark"] .ws-tag-cnc.c2{color:#38bdf8}
/* IP DINÂMICO DO CLIENTE — dois estados opostos, lidos de relance (lista de Clientes e demais
   telas que mostram IP). ONLINE: verde vivo, é o endereço que vale agora. OFFLINE: o ÚLTIMO IP
   conhecido, cinza e riscado, com cara de campo desabilitado — continua legível para conferência
   de log/faixa, mas não se confunde com conexão ativa. */
.ws-ip{display:inline-block;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;
       font-size:12px;font-weight:700;padding:2px 8px;border-radius:7px;white-space:nowrap;
       text-decoration:none}
.ws-ip.on{color:var(--ok);background:rgba(22,163,74,.14);border:1px solid rgba(22,163,74,.32)}
.ws-ip.on:hover{background:rgba(22,163,74,.24)}
.ws-ip.off{color:var(--muted);background:transparent;border:1px dashed var(--border);
           text-decoration:line-through;opacity:.62;font-weight:600;cursor:default}
.ws-icone-bloqueio{text-decoration:none;font-size:13px;line-height:1;padding:1px 4px;border-radius:5px}
/* Cadeado do cliente BLOQUEADO: ícone em vermelho (não só o fundo) pra leitura imediata na lista. */
.ws-icone-vermelho{background:rgba(220,38,38,.15);color:#dc2626}
.ws-icone-vermelho svg{color:#dc2626;stroke:#dc2626}
.ws-icone-vermelho:hover{background:rgba(220,38,38,.3)}
.ws-icone-lilas{background:rgba(147,51,234,.15)}
.ws-icone-lilas:hover{background:rgba(147,51,234,.3)}
/* Tabela de "Títulos do cliente" (boletos) — o cabeçalho na cor da marca já vem do global .ws-table th. */
.ws-table-titulos tbody tr:not(.ws-linha-acoes):hover{background:rgba(158,42,59,.045)}
.ws-linha-acoes td{padding:2px 12px 10px;border-bottom:1px solid var(--border);font-size:12.5px;text-align:left!important}
.ws-linha-acoes a{color:var(--brand);font-weight:600;text-decoration:none}
.ws-linha-acoes a:hover{text-decoration:underline}
/* Barra de ícones de ação em lote, no rodapé da tabela de títulos. */
/* Barra de ações dos selecionados — versão pequena e discreta, com cor própria por ação. */
/* (+) discreto pra criar boleto/carnê — vermelho claro; no hover ESCURECE e mostra "Criar Boleto e Carnê".
   O texto é um tooltip ABSOLUTO (não empurra o layout — seguro dentro de cabeçalhos de tabela estreitos). */
.ws-mais-boleto{position:relative;height:26px;min-width:26px;padding:0 7px;line-height:1;font-weight:900;cursor:pointer;
  color:#fff;background:#e0576a;border:1px solid #cf3f52;border-radius:8px;box-shadow:0 1px 3px rgba(0,0,0,.18);
  display:inline-flex;align-items:center;justify-content:center;text-decoration:none;transition:.18s}
.ws-mais-boleto .pl{font-size:18px;line-height:1}
.ws-mais-boleto .tx{position:absolute;top:calc(100% + 5px);left:50%;transform:translateX(-50%);
  background:#b93f4c;color:#fff;padding:4px 9px;border-radius:6px;font-size:12px;font-weight:700;white-space:nowrap;
  opacity:0;pointer-events:none;box-shadow:0 4px 12px rgba(0,0,0,.2);transition:opacity .15s;z-index:30}
.ws-mais-boleto:hover{color:#fff;background:#c33547;border-color:#b02e3f}
.ws-mais-boleto:hover .tx,.ws-mais-boleto:focus-visible .tx{opacity:1}
/* "+" simples e pequeno ao lado do checkbox "todos" (cabeçalho vinho) — só o sinal, sem caixa. */
.ws-mais-simples{display:inline-block;color:#fff;font-size:15px;font-weight:800;line-height:1;text-decoration:none;cursor:pointer;
  padding:0 2px;opacity:.85;transition:opacity .15s,color .15s}
.ws-mais-simples:hover{opacity:1;color:#ffe0e4;text-decoration:none}
/* Marcas transitórias de título recém-criado. */
.ws-badge-novo{display:inline-block;background:#2563eb;color:#fff;font-size:10px;font-weight:700;line-height:1;
  padding:2px 6px;border-radius:10px;text-transform:uppercase;letter-spacing:.03em;vertical-align:middle;margin-left:5px}
.ws-badge-pix{display:inline-block;background:#f59e0b;color:#3a2600;font-size:10px;font-weight:700;line-height:1;
  padding:2px 6px;border-radius:10px;letter-spacing:.02em;vertical-align:middle;margin-left:5px}
/* PIX/QR já consolidado (não é mais recém-gerado): pílula cinza maior e suave. */
/* PIX/QR em VERDE: a etiqueta indica que a fatura tem cobranca por PIX disponivel — informacao
   util, nao rodape. No cinza ela se perdia no meio da linha e o operador nao a enxergava. */
.ws-badge-pix-cinza{display:inline-block;background:rgba(22,163,74,.15);color:#15803d;font-size:11px;font-weight:700;line-height:1;
  padding:4px 10px;border-radius:14px;letter-spacing:.02em;vertical-align:middle;margin-left:6px}
/* Overlay "Processando…" — cobre a transição do POST pra não dar aquele blink de reload. */
.ws-proc-ov{position:fixed;inset:0;background:rgba(20,13,15,.45);backdrop-filter:blur(2px);z-index:99999;
  display:none;align-items:center;justify-content:center}
.ws-proc-ov.on{display:flex}
.ws-proc-card{background:var(--surface);color:var(--text);border:1px solid var(--border);border-radius:14px;
  padding:22px 26px;box-shadow:0 12px 40px rgba(0,0,0,.35);display:flex;align-items:center;gap:14px;font-weight:700;font-size:15px}
.ws-proc-spin{width:22px;height:22px;border:3px solid var(--border);border-top-color:var(--brand);border-radius:50%;animation:wsspin .7s linear infinite}
@keyframes wsspin{to{transform:rotate(360deg)}}
.ws-toolbar-mini{display:flex;gap:7px;margin-top:10px}
.ws-toolbar-mini .ico{width:30px;height:30px;border-radius:9px;border:1px solid var(--border);background:var(--surface);
  color:var(--muted);font-size:15px;line-height:1;cursor:pointer;display:inline-flex;align-items:center;justify-content:center;transition:.15s}
.ws-toolbar-mini .ico:hover{transform:translateY(-1px);box-shadow:var(--shadow)}
.ws-toolbar-mini .ico.retorno{color:#2563eb;border-color:rgba(37,99,235,.35)}
.ws-toolbar-mini .ico.retorno:hover{background:rgba(37,99,235,.10)}
.ws-toolbar-mini .ico.enviar{color:#9333ea;border-color:rgba(147,51,234,.35)}
.ws-toolbar-mini .ico.enviar:hover{background:rgba(147,51,234,.10)}
.ws-toolbar-mini .ico.excluir{color:#dc2626;border-color:rgba(220,38,38,.35)}
.ws-toolbar-mini .ico.excluir:hover{background:rgba(220,38,38,.10)}
/* Barra grande agora no mesmo padrão discreto (contorno + tinta), menor e elegante, cada ação com sua cor. */
.ws-toolbar-icones{display:flex;gap:8px;margin-top:12px}
.ws-toolbar-icones .ico{width:32px;height:32px;border-radius:10px;border:1px solid var(--border);background:var(--surface);
  color:var(--muted);font-size:16px;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:.15s;position:relative}
.ws-toolbar-icones .ico:hover{transform:translateY(-1px);box-shadow:var(--shadow)}
.ws-toolbar-icones .ico:active{transform:translateY(0) scale(.97)}
.ws-toolbar-icones .ico.verde{color:#16a34a;border-color:rgba(22,163,74,.4)}
.ws-toolbar-icones .ico.verde:hover{background:rgba(22,163,74,.10)}
.ws-toolbar-icones .ico.vermelho{color:#dc2626;border-color:rgba(220,38,38,.4)}
.ws-toolbar-icones .ico.vermelho:hover{background:rgba(220,38,38,.10)}
.ws-toolbar-icones .ico.azul{color:#2563eb;border-color:rgba(37,99,235,.4)}
.ws-toolbar-icones .ico.azul:hover{background:rgba(37,99,235,.10)}
.ws-toolbar-icones .ico.laranja{color:#d97706;border-color:rgba(217,119,6,.4)}
.ws-toolbar-icones .ico.laranja:hover{background:rgba(217,119,6,.10)}
.ws-toolbar-icones .ico.roxo{color:#9333ea;border-color:rgba(147,51,234,.4)}
.ws-toolbar-icones .ico.roxo:hover{background:rgba(147,51,234,.10)}
.ws-badge-add{display:inline-block;margin-left:6px;padding:1px 7px;border-radius:20px;font-size:10px;font-weight:700;background:rgba(147,51,234,.14);color:#9333ea;vertical-align:middle}
/* Contador de boletos em aberto ao lado do nome (verde, como no MK-Auth) */
.ws-badge-bol{display:inline-flex;align-items:center;justify-content:center;min-width:19px;height:19px;margin-left:7px;
  padding:0 5px;border-radius:20px;font-size:11px;font-weight:800;background:var(--ok);color:#fff;vertical-align:middle}
/* Nome do cliente na cor de texto (não no vinho); hover discreto */
.ws-nome b{color:#6d4b2f}
:root[data-theme="dark"] .ws-nome b,:root:not([data-theme="light"]) .ws-nome b{color:var(--text)}
@media(prefers-color-scheme:dark){:root:not([data-theme="light"]) .ws-nome b{color:var(--text)}}

/* Formulários */
.ws-form{display:flex;flex-direction:column;gap:12px;max-width:520px}
.ws-form.grid{display:grid;grid-template-columns:repeat(4,1fr);gap:12px 14px;max-width:none;background:var(--surface);
  border:1px solid var(--border);border-radius:12px;padding:20px;box-shadow:var(--shadow)}
.ws-form label{display:flex;flex-direction:column;gap:5px;font-size:13px;color:var(--muted);font-weight:600;justify-content:flex-start}
.ws-form label>input,.ws-form label>select,.ws-form label>span{margin-top:auto}
/* Campo Concentrador: título + checkbox "Sair por TODOS" + link "criar" na MESMA linha do topo,
   pra o checkbox não empurrar/sobrepor nada; o select fica na base, alinhado com os vizinhos. */
.conc-lbl>.conc-head{margin-top:0!important;display:flex;align-items:center;gap:8px;flex-wrap:nowrap;width:100%;white-space:nowrap}
.conc-head .conc-criar{font-size:11px;color:var(--brand);margin-left:auto}
/* Checkbox "Sair por TODOS" fica logo abaixo do título, com a MARCAÇÃO NA FRENTE do texto;
   o select vai pra base (margin-top:auto global) e alinha com os campos vizinhos. */
.conc-lbl>.conc-chk{margin-top:3px!important;font-size:10.5px;font-weight:600;color:var(--muted);display:flex;align-items:center}
.conc-lbl>.conc-chk input{flex:none;margin:0 5px 0 0}
/* Clique-para-copiar (lista de clientes): realce no hover + confirmação verde ao copiar. */
.ws-copy{cursor:copy;border-radius:4px;padding:0 2px;transition:background .15s}
.ws-copy:hover{background:rgba(158,42,59,.10)}
.ws-copied{background:rgba(16,185,129,.22)!important}
/* Menu de ações rápidas do cliente — some por padrão, aparece ao marcar a caixa de seleção (tr.ws-sel). */
.ws-cli-menu{display:none;margin-top:5px;gap:4px 12px;flex-wrap:wrap;font-size:11.5px}
.ws-cli-menu a{color:var(--brand);text-decoration:none;white-space:nowrap;font-weight:600}
.ws-cli-menu a:hover{text-decoration:underline}
tr.ws-sel .ws-cli-menu{display:flex}
tr.ws-sel{background:rgba(158,42,59,.06)}
/* start (não stretch): cada célula fica na altura natural, com o título logo acima do campo —
   sem o vão que aparecia quando uma célula alta (ex.: Concentrador c/ checkbox) esticava a linha. */
.ws-form.grid{align-items:start}
.ws-form.grid>label{display:flex;flex-direction:column;position:relative}
/* "criar" (link no canto do rótulo) flutua no topo/direita e NÃO empurra o campo pra baixo,
   pra não desalinhar a linha. */
.ws-form.grid>label>span[style*="float"]{position:absolute;top:0;right:0;float:none;margin:0}
/* Concentrador: o SELECT sobe pra logo abaixo do título (alinhado com os demais campos da linha)
   e o checkbox "Sair por TODOS" desce pra baixo dele. */
.ws-form.grid .conc-lbl>select{order:2}
.ws-form.grid .conc-lbl>.conc-chk{order:3;margin-top:4px!important}
.ws-form.grid input,.ws-form.grid select{height:38px;box-sizing:border-box}
.ws-form.grid textarea{height:auto}
.ws-form.grid label>span.ws-wa-wrap,.ws-form.grid label>span[style*="position:relative"]{display:block;height:38px}
.ws-form.grid label>span[style*="position:relative"] input{height:38px}
.ws-form.grid .c2{grid-column:span 2}.ws-form.grid .c4{grid-column:span 4}
.ws-form input,.ws-form select,.ws-form textarea{padding:9px 11px;border:1px solid var(--border);border-radius:8px;
  background:var(--bg);color:var(--text);font-size:14px;font-family:inherit}
.ws-form input:focus,.ws-form select:focus,.ws-form textarea:focus{outline:2px solid var(--brand);border-color:var(--brand)}
.ws-form textarea{min-height:64px;resize:vertical}
.ws-chk{flex-direction:row!important;align-items:center;gap:8px}
/* Campo de valor em R$ — rótulo fixo do lado esquerdo, mesmo estilo em todo o sistema. */
.ws-money-wrap{display:inline-flex;align-items:stretch;width:100%;border:1px solid var(--border);border-radius:8px;
  background:var(--bg);overflow:hidden;transition:.15s}
.ws-money-wrap:focus-within{outline:2px solid var(--brand);border-color:var(--brand)}
.ws-money-pre{display:flex;align-items:center;padding:0 10px;background:rgba(125,125,125,.10);color:var(--muted);
  font-weight:700;font-size:13px;white-space:nowrap;border-right:1px solid var(--border)}
.ws-money-wrap input{border:0!important;border-radius:0!important;background:transparent!important;flex:1;min-width:0;
  text-align:right;font-variant-numeric:tabular-nums}
.ws-money-wrap input:focus{outline:0!important}
.ws-two{display:grid;grid-template-columns:1.4fr 1fr;gap:22px;align-items:start}

/* Navegação no topo: Voltar + Início (moderna) */
.ws-topnav{display:flex;align-items:center;gap:6px;margin-right:6px}
.ws-topbtn{display:inline-flex;align-items:center;gap:5px;padding:7px 13px;border:1px solid var(--border);
  border-radius:999px;background:var(--surface);color:var(--text);font-weight:600;font-size:13.5px;cursor:pointer;
  text-decoration:none;transition:.15s;line-height:1}
.ws-topbtn span{font-size:18px;font-weight:800;line-height:1}
.ws-topbtn.ws-ico{width:36px;height:36px;padding:0;justify-content:center;border-radius:50%;
  background:var(--grad-brand);color:#fff;border:0;box-shadow:0 4px 12px -3px rgba(158,42,59,.5);line-height:0;transition:.18s}
.ws-topbtn.ws-ico svg{display:block}
.ws-topbtn.ws-ico:hover{color:#fff;filter:brightness(1.1);transform:translateY(-2px);box-shadow:0 8px 18px -4px rgba(158,42,59,.6)}
.ws-topbtn.ws-ico:active{transform:translateY(0)}
.ws-topnav-r{margin-left:auto;margin-right:6px}
.ws-topbtn:hover{border-color:var(--brand);color:var(--brand);background:rgba(158,42,59,.06);transform:translateY(-1px);text-decoration:none}
@media(max-width:640px){.ws-topbtn{padding:7px 10px}}

/* Rodapé elegante — FIXO, sempre visível no rodapé da tela em TODAS as páginas (obrigatório).
   A causa real do "sumiço" no Painel não era a posição fixa — era o <script> antigo do seletor
   de cor (removido) que ficava embutido no meio do conteúdo do Dashboard e podia quebrar o HTML
   antes do rodapé ser impresso. Com aquele script fora dali (o controle agora mora no topo),
   o rodapé volta a imprimir normalmente — e continua fixo, como em todas as outras páginas. */
.ws-rodape{margin-top:40px;background:var(--top-bg);background:color-mix(in srgb,var(--top-bg) 88%,transparent);backdrop-filter:saturate(160%) blur(14px);-webkit-backdrop-filter:saturate(160%) blur(14px);border-top:1px solid var(--border);position:fixed!important;left:0!important;right:0!important;bottom:0!important;top:auto!important;z-index:99999!important;visibility:visible!important;opacity:1!important;box-shadow:0 -8px 28px -10px rgba(0,0,0,.25)}
.ws-rodape::before{content:"";position:absolute;left:0;right:0;top:-1px;height:2.5px;background:var(--grad-brand)}
.ws-rodape-in{max-width:none;margin:0 auto;padding:10px clamp(14px,2vw,32px);display:flex;align-items:center;
  justify-content:space-between;flex-wrap:wrap;gap:10px}
.ws-rodape-marca{font-weight:800;font-size:14.5px;letter-spacing:.2px;display:inline-flex;align-items:center;gap:8px}
.ws-rodape-marca b{font-weight:800;white-space:nowrap}
.ws-rodape-selo{width:22px;height:22px;object-fit:contain;border-radius:6px;flex:none;box-shadow:0 1px 4px rgba(0,0,0,.25)}
.ws-rodape-marca span{background:var(--grad-brand);-webkit-background-clip:text;background-clip:text;-webkit-text-fill-color:transparent}
.ws-rodape-mid{color:var(--muted);font-size:12px;letter-spacing:.15px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.ws-rodape-meta{color:var(--muted);font-size:11.5px;letter-spacing:.3px;opacity:.85;white-space:nowrap}
.ws-rodape-mid i,.ws-rodape-meta i{font-style:normal;opacity:.5;margin:0 6px}
/* ---- SELETOR DE PÁGINA DO RODAPÉ (obs4) ----------------------------------------------------
   O rodapé usa AGORA o mesmo componente .ws-pag das listas (números, primeira/última, "…" e
   setas desabilitadas nas pontas). Aqui ficam só os ajustes de contexto: ele mora dentro do
   rodapé, então perde a margem da versão de lista e ganha a linha tracejada de separação.
   Os modelos antigos (.ws-rodape-pager) continuam estilizados por compatibilidade, mas nenhuma
   tela do sistema os monta mais.                                                              */
.ws-pag-rodape{margin:0;padding:8px clamp(14px,2vw,32px);border-bottom:1px dashed var(--border)}
.ws-rodape-pager{display:flex;align-items:center;justify-content:center;gap:6px;padding:6px clamp(14px,2vw,32px) 0;border-bottom:1px dashed var(--border)}
.ws-rodape-pager a{padding:4px 10px;border-radius:7px;font-size:12px;font-weight:700;color:var(--text);background:var(--surface);border:1px solid var(--border)}
.ws-rodape-pager a:hover{background:var(--grad-brand);color:#fff;text-decoration:none}
.ws-rodape-pg-atual{font-size:12px;font-weight:700;color:var(--muted);padding:0 4px}
@media(max-width:760px){.ws-rodape-meta{display:none}}
@media(max-width:520px){.ws-rodape-mid{display:none}}
/* Rodapé EXCLUSIVO do PAINEL: some do modo fixo (que fica flutuando por cima do conteúdo em toda
   página) e passa a ficar no FINAL da própria página, dentro do fluxo normal — só aqui, via a
   classe do <body> que só o Painel recebe. Nenhuma outra página é tocada por esta regra. */
body.pg-painel .ws-rodape{position:static!important;left:auto!important;right:auto!important;bottom:auto!important;top:auto!important;z-index:auto!important;box-shadow:none;margin-top:40px}
body.pg-painel .ws-main{padding-bottom:0}

/* Financeiro — alinha títulos e células centralizadas com suas respectivas colunas (Comp./Vencimento/Tipo/Nosso nº) */
.ws-boletos th:nth-child(3),.ws-boletos td:nth-child(3),
.ws-boletos th:nth-child(4),.ws-boletos td:nth-child(4),
.ws-boletos th:nth-child(5),.ws-boletos td:nth-child(5),
.ws-boletos th:nth-child(6),.ws-boletos td:nth-child(6){text-align:center}
.ws-boletos td:nth-child(4) .ws-tag{margin-left:6px}

/* Checkbox de seleção na tabela */
.ws-table td.sel,.ws-table th.sel{width:34px;text-align:center}
.ws-selbar{display:flex;align-items:center;gap:10px;background:var(--surface);border:1px solid var(--border);
  border-radius:10px;padding:8px 12px;margin:10px 0;box-shadow:var(--shadow);font-size:14px}
.ws-selbar.hidden{display:none}

/* Galeria de anexos */
.ws-galeria{display:grid;grid-template-columns:repeat(auto-fill,minmax(120px,1fr));gap:12px;margin-top:14px}
.ws-anexo{background:var(--surface);border:1px solid var(--border);border-radius:10px;overflow:hidden;box-shadow:var(--shadow)}
.ws-anexo img{width:100%;height:110px;object-fit:cover;display:block}
.ws-anexo-pdf{height:110px;display:flex;align-items:center;justify-content:center;background:rgba(125,125,125,.1);font-weight:800;color:var(--muted)}
.ws-anexo-meta{display:flex;justify-content:space-between;align-items:center;padding:6px 8px;font-size:12px;color:var(--muted)}
.ws-anexo-x{color:var(--err);font-weight:700;text-decoration:none}
.ws-panel{background:var(--surface);border:1px solid var(--border);border-radius:14px;padding:18px 20px;box-shadow:var(--shadow);margin-top:8px}
/* Modal genérico (diálogo de confiança etc.) */
/* z-index ACIMA do topo fixo (.ws-top-wrap usa 5000). Estava em 200: a barra de menus passava
   por cima do formulário, cobrindo os primeiros campos — dava para ver o modal, não para usá-lo. */
.ws-modal-ov{position:fixed;inset:0;background:rgba(0,0,0,.5);z-index:6000;display:flex;align-items:center;justify-content:center;padding:16px}
.ws-modal{background:var(--surface);color:var(--text);border:1px solid var(--border);border-radius:16px;box-shadow:var(--shadow-lg);padding:22px;max-width:380px;width:100%;
          max-height:calc(100vh - 32px);overflow:auto;position:relative}

/* ---- JANELA: mover, maximizar, minimizar (ws_modal_janela em js/wellsystem.js) --------------
   Formulário longo dentro de caixa centralizada obriga a rolar às cegas quando a tela é baixa.
   Com estes três controles o operador põe a janela onde quiser, abre em tela cheia para
   preencher, ou encolhe para consultar a lista atrás sem perder o que já digitou.            */
.ws-modal-cab{display:flex;align-items:center;gap:8px;margin:-6px -6px 8px;cursor:move;
              user-select:none;touch-action:none}
.ws-modal-cab h3{margin:0;flex:1 1 auto;font-size:16px}
.ws-modal-btn{width:26px;height:26px;flex:0 0 auto;display:inline-flex;align-items:center;
              justify-content:center;border:1px solid var(--border);background:var(--bg);
              color:var(--text);border-radius:7px;cursor:pointer;font-size:13px;line-height:1;
              font-weight:800;transition:background .12s ease,color .12s ease}
.ws-modal-btn:hover{background:var(--brand);color:#fff;border-color:transparent}
/* Arrastada: sai do centro do flex e passa a valer a posição definida pelo mouse. */
.ws-modal-ov.solta{display:block}
.ws-modal-ov.solta > .ws-modal{position:absolute;margin:0}
/* Maximizada: TELA CHEIA de verdade. Estava com inset:10px, que deixava uma moldura e não era
   "tela completa"; num formulário longo esses 20px ainda custavam uma linha de campo. */
/* !important aqui é necessário, não preguiça: cada modal traz o seu tamanho no atributo style
   (ex.: style="max-width:520px"), e estilo inline vence CSS externo. Sem o !important a janela
   "maximizava" e continuava com 520px de largura — que foi exatamente o que aconteceu. */
.ws-modal-ov.max{padding:0}
.ws-modal-ov.max > .ws-modal{position:fixed!important;inset:0!important;
                             max-width:none!important;width:auto!important;max-height:none!important;
                             margin:0!important;border-radius:0;border:0}
/* Minimizada: fica só a barra de título, e o fundo escuro some para a lista continuar visível. */
.ws-modal-ov.min{background:transparent;pointer-events:none}
.ws-modal-ov.min > .ws-modal{pointer-events:auto;position:fixed;left:auto;right:16px;top:auto;
                             bottom:16px;width:min(320px,90vw);max-width:none;padding:10px 12px;
                             max-height:none;overflow:hidden;box-shadow:var(--shadow-lg)}
.ws-modal-ov.min > .ws-modal > *:not(.ws-modal-cab){display:none!important}
.ws-modal-ov.min .ws-modal-cab{margin:0;cursor:default}
/* Formulário em grade DENTRO de um modal (janela pop-up): o modal é estreito, então usa só 2
   colunas (em vez das 4 da tela cheia) — senão cada campo fica espremido/minúsculo. */
.ws-modal .ws-form.grid{grid-template-columns:repeat(2,1fr)}
.ws-modal .ws-form.grid .c2{grid-column:span 1}
.ws-modal .ws-form.grid .c4{grid-column:span 2}
.ws-modal h3{margin:0 0 4px}
.ws-modal input,.ws-modal select{width:100%;padding:9px 11px;border:1px solid var(--border);border-radius:8px;background:var(--bg);color:var(--text);margin-top:4px}
/* Ficha do cliente dentro do modal de Desbloqueio em confiança — MESMO card nas duas telas
   (Menu Clientes/Todos e Menu Servidores/Painel dos Concentradores, ambos via js/ws_confianca.js). */
.ws-ficha-confianca{background:rgba(147,51,234,.10);border:1px solid rgba(147,51,234,.28);border-radius:10px;padding:10px 14px;margin:10px 0 4px;font-size:13.5px;line-height:1.6}
.ws-ficha-confianca b{color:#9333ea}
.ws-ficha-confianca .ws-ja-conf{display:block;margin-top:6px;font-size:12.5px;color:#9333ea;font-weight:700}
/* Lista de boletos estilo intuitivo: ações em pílulas abaixo de cada título */
.ws-boletos tr.b-main td{border-bottom:none;padding-bottom:4px}
.ws-boletos tr.b-acoes td{padding-top:0;padding-bottom:12px}
.ws-boletos tr.b-acoes:hover{background:transparent}
.ws-boleto-acoes{display:flex;flex-wrap:wrap;gap:8px}
.ws-boleto-acoes a{display:inline-flex;align-items:center;gap:4px;padding:5px 12px;border:1px solid var(--border);
  border-radius:999px;font-size:12.5px;font-weight:600;background:var(--surface);color:var(--text);transition:.15s}
.ws-boleto-acoes a:hover{border-color:var(--brand);background:rgba(158,42,59,.06);text-decoration:none;transform:translateY(-1px)}
/* Ações compactas em pílula (editar/receber/excluir de qualquer tabela) */
.ws-acoes{display:inline-flex;flex-wrap:wrap;gap:6px}
.ws-acoes a{padding:4px 10px;border:1px solid var(--border);border-radius:999px;font-size:12.5px;font-weight:600}
.ws-acoes a:hover{border-color:var(--brand);text-decoration:none}
.ws-galeria-item{margin:0;background:var(--surface);border:1px solid var(--border);border-radius:10px;overflow:hidden;box-shadow:var(--shadow)}
.ws-galeria-item img{width:100%;height:110px;object-fit:cover;display:block}
.ws-arq-icon{height:110px;display:flex;align-items:center;justify-content:center;background:rgba(125,125,125,.1);font-weight:800;color:var(--muted);text-decoration:none}
.ws-galeria-item figcaption{display:flex;flex-direction:column;gap:2px;padding:6px 8px;font-size:11px;color:var(--muted)}
.ws-galeria-item figcaption span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}

/* Gráficos SVG simples */
.ws-chart{background:var(--surface);border:1px solid var(--border);border-radius:12px;padding:16px;box-shadow:var(--shadow);margin:16px 0}
.ws-chart h3{margin:0 0 10px;font-size:15px}
.ws-chart svg{width:100%;height:auto;display:block}

/* Kanban comercial */
.ws-kanban{display:grid;grid-template-columns:repeat(6,minmax(150px,1fr));gap:10px;overflow-x:auto}
.ws-col{background:rgba(125,125,125,.06);border:1px solid var(--border);border-radius:10px;padding:8px;min-width:150px}
.ws-col-h{font-weight:700;font-size:13px;margin-bottom:8px;display:flex;justify-content:space-between}
.ws-col-h span{background:var(--brand);color:#fff;border-radius:10px;padding:0 8px;font-size:12px}
.ws-lead{background:var(--surface);border:1px solid var(--border);border-radius:8px;padding:8px;margin-bottom:8px;box-shadow:var(--shadow)}
.ws-lead-acts{margin-top:6px;font-size:12px}
@media(max-width:820px){.ws-kanban{grid-template-columns:repeat(6,80vw)}}

/* Timeline */
.ws-timeline{border-left:2px solid var(--border);margin-left:8px;padding-left:4px}
.ws-tl-item{display:flex;gap:10px;align-items:flex-start;padding:8px 0 8px 12px;position:relative}
.ws-tl-ico{flex:0 0 26px;height:26px;width:26px;display:flex;align-items:center;justify-content:center;background:var(--surface);border:1px solid var(--border);border-radius:50%;margin-left:-23px;font-size:13px}
.ws-tl-item[onclick]:hover{background:var(--surface);border-radius:8px}
.ws-hist-l{display:flex;justify-content:space-between;gap:12px;border-bottom:1px dashed var(--border);padding:8px 0}
.ws-hist-l b{color:var(--brand);white-space:nowrap}
.ws-hist-l span{text-align:right}
/* Campo Data e Hora com o "h" DENTRO da moldura (o input fica sem borda; a caixa é a moldura) */
.ws-dt-h{display:inline-flex;align-items:center;gap:2px;border:1px solid var(--border);border-radius:8px;padding:6px 9px;background:var(--surface);width:max-content}
/* datetime-local tem layout FIXO (dd/mm/aaaa hh:mm) — fixo a largura exata pro "h" colar no fim da hora. */
.ws-dt-h input[type=datetime-local]{border:0;background:transparent;padding:0;margin:0;color:var(--text);font:inherit;outline:none;min-width:0;width:9em;field-sizing:content}
.ws-dt-h input[type=datetime-local]::-webkit-calendar-picker-indicator{display:none;-webkit-appearance:none;appearance:none;width:0;padding:0;margin:0}
.ws-dt-h b{color:var(--brand);font-weight:700;margin-left:0}

/* Indicador online/offline */
.ws-dot{display:inline-block;width:10px;height:10px;border-radius:50%}
.ws-dot.on{background:var(--ok);box-shadow:0 0 0 3px rgba(22,163,74,.2)}
.ws-dot.off{background:#94a3b8}

/* Responsivo */
@media(max-width:820px){
  .ws-form.grid{grid-template-columns:repeat(2,1fr)}
  .ws-form.grid .c2,.ws-form.grid .c4{grid-column:span 2}
  .ws-two{grid-template-columns:1fr}
  .ws-table{display:block;overflow-x:auto;white-space:nowrap}
  .ws-main{overflow-x:hidden} /* rede de segurança: nenhuma tabela/tabela esquecida derruba a largura da página inteira */
  .ws-mkcards{grid-template-columns:repeat(auto-fit,minmax(96px,1fr))}
  .ws-cards{grid-template-columns:repeat(auto-fit,minmax(140px,1fr))}
}
@media(max-width:520px){
  .ws-form.grid{grid-template-columns:1fr}
  .ws-form.grid .c2,.ws-form.grid .c4{grid-column:span 1}
  .ws-top{gap:8px}
  .ws-nav-right{width:100%;order:4;flex-wrap:wrap;margin-left:0}
  .ws-head-row{gap:8px}
  .ws-head-row>div{width:100%;display:flex;flex-wrap:wrap;gap:6px}
  .ws-head-row .ws-btn,.ws-head-row a.ws-btn{flex:1 1 auto;text-align:center}
  .ws-search input[type=text],.ws-search input[type=search],.ws-search input:not([type]){max-width:none;flex:1 1 100%}
  .ws-modal{max-width:none;width:calc(100% - 8px);padding:16px;border-radius:12px}
  .ws-mkcards{grid-template-columns:repeat(2,1fr)}
  .ws-cards{grid-template-columns:1fr 1fr}
  .ws-galeria{grid-template-columns:repeat(auto-fill,minmax(96px,1fr))}
  .ws-sub{min-width:160px;left:auto;right:0} /* dropdown some pra dentro da tela em vez de vazar pela direita */
  .ws-titulo-pagina{font-size:12px}
  /* Linha de ações dos títulos (boletos) — quebra em várias linhas com espaçamento tocável no celular. */
  .ws-linha-acoes td{white-space:normal;line-height:1.9}
  .ws-linha-acoes a{display:inline-block;padding:2px 0}
  /* Chips de adicionais e barra de ícones não estouram a largura da tela. */
  .ws-toolbar-icones{flex-wrap:wrap}
  /* Campo de dinheiro com rótulo R$ continua confortável de tocar mesmo estreito. */
  .ws-money-pre{padding:0 8px;font-size:12px}
}
@media(max-width:380px){
  .ws-mkcards{grid-template-columns:1fr 1fr}
  .ws-mk-num{font-size:18px}
  .ws-stat span{font-size:18px!important}
}

/* ===== Refino visual (degradê sofisticado, zebra suave, hover do menu) — só aparência, sem mexer em função ===== */
/* Zebra sutil (degradê horizontal quase imperceptível) separando uma linha da outra nas tabelas de dados. */
.ws-table tbody tr:nth-child(even):not(.ws-linha-acoes){background:linear-gradient(90deg,color-mix(in srgb,var(--brand) 4%,transparent),color-mix(in srgb,var(--brand) 1%,transparent))}
.ws-table tbody tr:not(.ws-linha-acoes){transition:background .15s ease}
.ws-table tbody tr:not(.ws-linha-acoes):hover{background:color-mix(in srgb,var(--brand) 8%,transparent)}
/* Linha de TOTAIS/subtotal: leve degradê p/ destacar e manter os valores "juntos" à direita. */
.ws-table tbody tr[style*="font-weight:800"]{background:linear-gradient(90deg,transparent,color-mix(in srgb,var(--brand) 9%,transparent))}
/* Rodapé: a tagline ao lado da marca. */
.ws-rodape-tagline{color:var(--muted);font-weight:500;font-size:12.5px}
/* "Versao Master Wellsystem" no rodape: vermelho e um pouco mais forte que o resto da linha.
   Cor fixa de proposito - e a identidade da versao, nao segue o tema claro/escuro. */
.ws-rodape-versao{color:#cf1f1f;font-weight:800}
@media(max-width:600px){.ws-rodape-tagline{display:none}}
/* Menu do topo: hover elegante e discreto (fundo suave + leve realce), sem alterar comportamento. */
.ws-nav>a,.ws-nav .ws-grp>.ws-grp-lbl{transition:background .16s ease,color .16s ease,box-shadow .16s ease;border-radius:8px}
.ws-nav>a:hover,.ws-nav .ws-grp:hover>.ws-grp-lbl{background:color-mix(in srgb,var(--brand) 12%,transparent);color:var(--brand)}
/* Badge/etiqueta da forma de pagamento com um leve degradê. */
.ws-forma-badge{background-image:linear-gradient(180deg,rgba(255,255,255,.10),transparent)}
/* Campos autopreenchidos pelo sistema: leve marca visual (borda/gota) — item "exibir o que é automático". */
.ws-auto-fill{position:relative}
/* Selo "auto" FORA DO FLUXO (absoluto no canto do rótulo) — não empurra o campo pra baixo, então
   os campos com e sem selo ficam ALINHADOS na mesma linha da grade. */
.ws-form label{position:relative}
.ws-auto-badge{position:absolute;top:1px;right:2px;font-size:8.5px;font-weight:800;letter-spacing:.3px;color:#fff;background:linear-gradient(135deg,var(--brand),color-mix(in srgb,var(--brand) 60%,#000));padding:1px 6px;border-radius:20px;text-transform:uppercase;opacity:.85;pointer-events:none;z-index:1}
/* IP DINÂMICO abaixo do campo "IP fixo" — informativo, nunca editável.
   Peso visual baixo de propósito: precisa ser lido, não confundido com um campo. O tracejado e o
   cursor de ajuda reforçam que ali não se digita; quem quer fixar um IP usa o campo acima. */
/* DICA COM RELÓGIO — substitui o title do navegador onde o texto precisa mudar enquanto está
   aberto. O title é desenhado uma vez e não se atualiza; esta é um elemento da página, reescrita a
   cada segundo. z-index acima do topo fixo para não ser cortada perto do menu. */
.ws-tip-live{position:absolute;display:none;z-index:6100;pointer-events:none;
             background:#111827;color:#fff;font-size:12px;font-weight:600;line-height:1.35;
             padding:6px 10px;border-radius:8px;max-width:320px;white-space:nowrap;
             box-shadow:0 8px 24px rgba(0,0,0,.28)}
/* Sinaliza que aquele item tem informação extra ao passar o mouse. */
[data-tip-live]{cursor:help}

/* CAMPO DE DINHEIRO — alinhado à DIREITA, que é como valor se lê e se confere: os centavos
   sempre na mesma coluna, e o cursor já no fim, onde o próximo dígito entra. */
input.ws-moeda{text-align:right;font-variant-numeric:tabular-nums;
               font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;letter-spacing:.02em}

.ws-ip-dinamico{display:block;margin-top:4px;font-size:11px;color:var(--muted);
                font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;
                border-top:1px dashed var(--border);padding-top:4px;cursor:help;
                white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.ws-ip-dinamico b{color:var(--text);font-weight:700}

/* Linha destacada (pulsando vermelho) ao chegar pelo alerta de bloqueio manual. */
@keyframes wsRowPulse{0%,100%{background:transparent}50%{background:rgba(220,38,38,.18)}}
.ws-table tbody tr.ws-pulse-alert{animation:wsRowPulse 1.1s ease-in-out 6}
.ws-table tbody tr.ws-pulse-alert td:first-child{box-shadow:inset 3px 0 0 #dc2626}
/* Lupa de busca global no topo — discreta: só o ícone; ao clicar, expande o campo. */
.ws-lupa-wrap{display:inline-flex;align-items:center;gap:0}
.ws-lupa-btn{background:transparent;border:none;color:var(--muted);cursor:pointer;padding:5px;border-radius:8px;display:inline-flex;align-items:center}
.ws-lupa-btn:hover{color:var(--brand);background:color-mix(in srgb,var(--brand) 10%,transparent)}
.ws-lupa-input{width:0;padding:0;border:1px solid transparent;background:transparent;opacity:0;transition:width .18s,opacity .18s,padding .18s;font-size:13px;color:var(--text);border-radius:8px}
.ws-lupa-wrap.open .ws-lupa-input{width:min(230px,40vw);opacity:1;padding:6px 10px;border-color:var(--border);background:var(--surface)}
.ws-lupa-wrap{position:relative}
.ws-lupa-res{display:none;position:absolute;top:calc(100% + 4px);right:0;min-width:260px;max-width:340px;max-height:60vh;overflow:auto;background:var(--surface);border:1px solid var(--border);border-radius:10px;box-shadow:0 12px 34px -10px rgba(0,0,0,.4);z-index:100000}
.ws-lupa-res a{display:block;padding:9px 12px;color:var(--text);text-decoration:none;border-bottom:1px solid var(--border);font-size:13px}
.ws-lupa-res a:last-child{border-bottom:none}
.ws-lupa-res a:hover{background:color-mix(in srgb,var(--brand) 10%,transparent)}
@media(max-width:520px){.ws-lupa-wrap.open .ws-lupa-input{width:150px}.ws-lupa-res{min-width:210px}}
/* Galeria de fotos de equipamentos (Estoque / Comodato) — miniatura (grade) e detalhes (lista). */
.ws-gal-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(150px,1fr));gap:12px;max-height:70vh;overflow:auto}
.ws-gal-item img{width:100%;height:130px;object-fit:contain;background:rgba(125,125,125,.06);border:1px solid var(--border);border-radius:10px;display:block}
.ws-gal-item figcaption{font-size:12px;margin-top:5px;line-height:1.35}
.ws-gal-item .ws-gal-det{display:block;color:var(--muted);font-size:11px}
.ws-gal-grid.det{grid-template-columns:1fr}
.ws-gal-grid.det .ws-gal-item{display:flex;gap:12px;align-items:center;border-bottom:1px solid var(--border);padding-bottom:8px}
.ws-gal-grid.det .ws-gal-item img{width:120px;height:88px;flex:0 0 120px;object-fit:contain}
@media(max-width:520px){.ws-gal-grid{grid-template-columns:repeat(auto-fill,minmax(120px,1fr))}}
/* Botão flutuante de ALERTA do sistema — discreto, pulsa em vermelho, canto inferior direito. */
@keyframes wsPulseRed{0%{box-shadow:0 0 0 0 rgba(220,38,38,.55)}70%{box-shadow:0 0 0 12px rgba(220,38,38,0)}100%{box-shadow:0 0 0 0 rgba(220,38,38,0)}}
.ws-alert-fab{position:fixed;right:18px;bottom:78px;z-index:99998;display:inline-flex;align-items:center;gap:8px;background:linear-gradient(135deg,#ef4444,#b91c1c);color:#fff;border:none;border-radius:28px;padding:11px 16px;font-size:13px;font-weight:700;cursor:pointer;text-decoration:none;box-shadow:0 6px 20px -6px rgba(220,38,38,.6);animation:wsPulseRed 1.8s infinite}
.ws-alert-fab:hover{filter:brightness(1.05)}
.ws-alert-fab .n{background:#fff;color:#b91c1c;border-radius:20px;padding:0 7px;font-size:12px;font-weight:800}
.ws-alert-pop{position:fixed;right:18px;top:96px;z-index:99998;background:var(--surface);border:1px solid var(--border);border-radius:12px;box-shadow:0 12px 34px -10px rgba(0,0,0,.4);min-width:250px;max-width:330px;overflow:hidden}
.ws-alert-pop-h{display:flex;align-items:center;justify-content:space-between;gap:8px;padding:9px 12px;font-size:13px;font-weight:800;color:#fff;background:linear-gradient(135deg,#ef4444,#b91c1c);cursor:move;user-select:none}
.ws-alert-pop-h .n{background:#fff;color:#b91c1c;border-radius:20px;padding:0 7px;font-size:11px;font-weight:800;margin-left:4px}
.ws-alert-x{background:transparent;border:none;color:#fff;font-size:15px;cursor:pointer;line-height:1;padding:2px 4px;border-radius:6px}
.ws-alert-x:hover{background:rgba(255,255,255,.2)}
.ws-alert-pop a{display:flex;align-items:center;gap:8px;padding:11px 14px;color:var(--text);text-decoration:none;border-bottom:1px solid var(--border);font-size:13px}
.ws-alert-pop a:last-child{border-bottom:none}
.ws-alert-pop a:hover{background:color-mix(in srgb,#ef4444 10%,transparent)}
@media(max-width:520px){.ws-alert-fab{right:12px;bottom:70px;padding:9px 13px}.ws-alert-pop{right:8px;left:8px;top:70px;max-width:none}}

/* Green Pulse Animation */
@keyframes wsPulseGreen {
  0% {
    box-shadow: 0 0 0 0 rgba(34, 197, 94, 0.7);
  }
  70% {
    box-shadow: 0 0 0 6px rgba(34, 197, 94, 0);
  }
  100% {
    box-shadow: 0 0 0 0 rgba(34, 197, 94, 0);
  }
}
.ws-online-dot, .ws-dot.on {
  animation: wsPulseGreen 2s infinite;
}

/* Modern Dashboard Grid Layout */
.ws-dashboard-grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(340px, 1fr));
  gap: 16px;
  margin-top: 16px;
}
.ws-dashboard-grid .ws-chart {
  margin: 0;
  transition: transform 0.2s ease, box-shadow 0.2s ease;
}
.ws-dashboard-grid .ws-chart:hover {
  transform: translateY(-2px);
  box-shadow: 0 4px 20px rgba(0, 0, 0, 0.05);
}

/* Logo adaptable to dark theme */
.ws-logo {
  max-height: 56px;
  max-width: 200px;
  object-fit: contain;
  transition: filter 0.3s ease, background 0.3s ease;
  border-radius: 6px;
  padding: 4px;
}
:root[data-theme="dark"] .ws-logo {
  filter: invert(1) hue-rotate(180deg) brightness(0.95);
  background: transparent;
}
:root[data-theme="dark"] .ws-top-marca {
  background: transparent;
}

/* Highlighting validation errors */
.ws-field-error {
  border: 1px solid var(--err) !important;
  background-color: rgba(220, 38, 38, 0.05) !important;
  box-shadow: 0 0 0 3px rgba(220, 38, 38, 0.15) !important;
}

/* ===== BLINDAGEM MOBILE — garante 100% responsivo em QUALQUER tela, sem overflow horizontal ===== */
*{ box-sizing:border-box }
img,svg,video,canvas{ max-width:100% }
@media(max-width:820px){
  /* Gráficos do painel empilham (não estouram a largura). */
  .ws-dashboard-grid{ grid-template-columns:1fr }
  /* Itens de grade/flex podem encolher (min-width:auto causa vazamento com conteúdo longo). */
  .ws-form.grid>label, .ws-form.grid>div, .ws-two>*, .ws-cards>*, .ws-mkcards>*{ min-width:0 }
  /* Qualquer painel/cartão com conteúdo largo rola dentro de si, nunca empurra a página. */
  .ws-panel, .ws-card, .ws-chart, .ws-chart-box{ overflow-x:auto }
  input, select, textarea{ max-width:100% }
}
/* Filtros de status dos Clientes (Todos/Ativos/Bloqueados…): no celular viram uma GRADE alinhada
   em colunas iguais, em vez de quebrar torto numa fileira flex. */
@media(max-width:640px){
  .ws-cli-filtros{ display:grid; grid-template-columns:repeat(2,1fr); gap:8px }
  .ws-cli-filtros .ws-btn{ width:100%; text-align:center; justify-content:center; padding:11px 8px }
}
@media(max-width:600px){
  /* Trava final: nada rola a página inteira na horizontal no celular. */
  html, body{ overflow-x:hidden }
  /* Títulos longos quebram em vez de esticar a tela. */
  h1,h2,h3{ overflow-wrap:anywhere }
  .ws-cards{ grid-template-columns:1fr 1fr }
  /* Modais e dropdowns nunca passam da borda. */
  .ws-modal, .ws-modal-ov > .ws-modal{ width:calc(100% - 16px); max-width:calc(100% - 16px) }
}

/* ===== Modo de recebimento / modal Receber colorido (item C+D) ===== */
.ws-forma-sel{font-weight:700}
.ws-rc{padding:0;overflow:hidden}
/* Vinho mais ESCURO: o tom anterior (#7a1f2b -> #a83246) clareava demais no meio do gradiente
   e, com o texto branco por cima, o contraste caia abaixo do confortavel em tela clara. */
.ws-rc-head{background:linear-gradient(135deg,#5e1622,#7d2533);color:#fff;padding:14px 16px}
.ws-rc-head h3{color:#fff}
.ws-rc-row{display:flex;flex-wrap:nowrap;align-items:flex-end;gap:8px;margin-bottom:8px;border-radius:10px;padding:6px;transition:background .15s,opacity .15s}
.ws-rc-row>label:first-child{min-width:0}
.ws-rc-row .ws-rc-zero{flex:0 0 auto;margin:0 0 6px;white-space:nowrap;font-size:13px;color:var(--err,#dc2626);cursor:pointer;display:flex;align-items:center;gap:5px}
.ws-rc-row .ws-rc-zero input{margin:0}
.ws-rc-row.off{background:rgba(220,38,38,.08);opacity:.75}
.ws-rc-row.off input{text-decoration:line-through}
.ws-rc-total input{font-weight:800;font-size:17px;background:rgba(22,163,74,.10);border-color:rgba(22,163,74,.45)}
.ws-rc .ws-btn.verde{background:linear-gradient(135deg,#16a34a,#0f8a3f);border:none;color:#fff}
/* checkbox SEMPRE à frente da frase, alinhado à esquerda */
.ws-rc .ws-chk{display:flex;flex-direction:row;align-items:center;justify-content:flex-start;gap:8px;text-align:left}
/* Gerar boleto: cabeçalho VERMELHO (vinho), igual ao Receber */
.ws-bol-head{background:linear-gradient(135deg,#5e1622,#7d2533)}

/* ===== Lista de Equipamentos cadastrados: EMPILHADA no celular (item a item, rótulos) ===== */
@media (max-width:640px){
  .ws-equip-tab thead{ display:none }
  .ws-equip-tab, .ws-equip-tab tbody, .ws-equip-tab tr, .ws-equip-tab td{ display:block; width:100% }
  .ws-equip-tab tr{ border:1px solid var(--border); border-radius:12px; margin-bottom:10px; padding:8px 10px; background:var(--surface) }
  .ws-equip-tab td{ border:none; padding:5px 2px; display:flex; align-items:center; justify-content:space-between; gap:12px; text-align:right }
  .ws-equip-tab td[data-lb]:not([data-lb=""])::before{ content:attr(data-lb); font-weight:700; color:var(--muted); text-align:left; font-size:12px; letter-spacing:.02em }
  .ws-equip-tab td[data-lb="Modelo"]{ font-weight:700; font-size:15px; flex-wrap:wrap }
  .ws-equip-tab td[data-lb=""]{ justify-content:flex-start }
  .ws-equip-tab .ws-acoes{ display:flex; gap:14px }
}

/* ===== Titulos dos campos dos modais Receber e Gerar boleto =====
   Mesmo vinho da barra de titulo (#5e1622), e nao um tom claro: com o cabecalho escuro, o rotulo
   claro ficava com contraste fraco sobre o fundo branco do formulario e destoava do conjunto. */
.ws-rc form label:not(.ws-chk), .ws-rc .ws-rc-row > label:first-child,
.ws-bol form label, #rcOv form label:not(.ws-chk){ color:#5e1622; font-weight:700 }
:root:not([data-theme="light"]) .ws-rc form label:not(.ws-chk),
:root:not([data-theme="light"]) .ws-bol form label,
:root:not([data-theme="light"]) #rcOv form label:not(.ws-chk){ color:#e4a9b2 }
@media (prefers-color-scheme: dark){
  :root:not([data-theme="light"]) .ws-rc form label:not(.ws-chk),
  :root:not([data-theme="light"]) .ws-bol form label,
  :root:not([data-theme="light"]) #rcOv form label:not(.ws-chk){ color:#e4a9b2 }
}

/* ===== Botão "Boleto / Carnê" refinado (elegante, suave) ===== */
.ws-btn-boleto{ background:linear-gradient(135deg,#ffffff,#f7edef); color:#a3283b; border:1px solid rgba(163,40,59,.35)!important;
  font-weight:700; border-radius:10px; box-shadow:0 2px 8px -3px rgba(163,40,59,.30); transition:transform .12s, box-shadow .12s, background .12s }
.ws-btn-boleto:hover{ background:linear-gradient(135deg,#a3283b,#7a1f2b); color:#fff; transform:translateY(-1px); box-shadow:0 8px 18px -8px rgba(163,40,59,.6) }
:root:not([data-theme="light"]) .ws-btn-boleto{ background:rgba(163,40,59,.16); color:#e9aeb6 }

/* ===== Tarja colorida de título de bloco (ficha do cliente) ===== */
.ws-tarja{ margin-top:26px; padding:11px 14px;
  background:linear-gradient(90deg,rgba(122,31,43,.14),rgba(122,31,43,.03));
  border-left:4px solid var(--brand); border-radius:8px; box-shadow:0 1px 3px rgba(0,0,0,.06) }
.ws-tarja h3{ margin:0 }
/* ================================================================================================
   PAGINAÇÃO — barra de topo (contagem + "por página") e paginador de rodapé.
   O seletor "por página" ficava só no rodapé: para trocar de 25 para 100 era preciso rolar a
   lista inteira. Agora ele fica ACIMA da tabela, e o rodapé cuida só da navegação.
   ============================================================================================= */
.ws-pag-topo{display:flex;align-items:center;justify-content:space-between;gap:12px;flex-wrap:wrap;
             margin:0 0 10px;padding:8px 12px;border:1px solid var(--border);border-radius:10px;
             background:var(--surface)}
.ws-pag-tot{font-size:13px;color:var(--text)}
.ws-pag-tot b{font-weight:800}
.ws-pag-fatia{color:var(--muted);font-weight:400}
.ws-pag-form{display:inline-flex;align-items:center;gap:8px;margin:0}
.ws-pag-lbl{font-size:12.5px;color:var(--muted);font-weight:600}
.ws-pag-pills{display:inline-flex;border:1px solid var(--border);border-radius:9px;overflow:hidden}
.ws-pag-pill{padding:5px 12px;font-size:12.5px;font-weight:700;text-decoration:none;
             color:var(--text);background:transparent;border-right:1px solid var(--border);
             transition:background .12s ease,color .12s ease}
.ws-pag-pill:last-child{border-right:0}
.ws-pag-pill:hover{background:var(--surface-2,rgba(127,127,127,.10))}
.ws-pag-pill.ativo{background:var(--grad-brand,var(--brand));color:#fff;-webkit-text-fill-color:#fff}

.ws-pag{display:flex;align-items:center;justify-content:center;gap:4px;flex-wrap:wrap;margin:14px 0 0}
.ws-pag-btn{min-width:34px;height:34px;padding:0 9px;display:inline-flex;align-items:center;
            justify-content:center;border:1px solid var(--border);border-radius:9px;
            font-size:13px;font-weight:700;text-decoration:none;color:var(--text);
            background:var(--surface);transition:transform .12s ease,border-color .12s ease,background .12s ease}
.ws-pag-btn:hover{border-color:var(--brand);color:var(--brand);transform:translateY(-1px)}
.ws-pag-btn.ativo{background:var(--grad-brand,var(--brand));border-color:transparent;color:#fff;
                  -webkit-text-fill-color:#fff;box-shadow:0 4px 12px -6px rgba(0,0,0,.45)}
.ws-pag-btn.off{opacity:.35;pointer-events:none}
.ws-pag-gap{padding:0 4px;color:var(--muted);font-weight:700;align-self:center}
.ws-pag-info{font-size:12.5px;color:var(--muted);margin-left:8px;align-self:center}
/* "Ir para a página" (obs4) — aparece só em lista longa (mais de 8 páginas), onde clicar número
   a número deixa de compensar. No celular some: o teclado numérico atrapalha mais que ajuda. */
.ws-pag-ir{display:inline-flex;align-items:center;gap:6px;margin-left:10px;
           font-size:11.5px;color:var(--muted);font-weight:600}
.ws-pag-ir input{width:62px;height:34px;padding:0 8px;border-radius:9px;text-align:center;
                 font-size:12.5px;font-weight:700;color:var(--text);
                 background:var(--surface);border:1px solid var(--border)}
.ws-pag-ir input:focus{outline:2px solid var(--brand);outline-offset:1px}
/* "de 16" logo depois do campo: o total sem repetir a página atual, que já está no campo. */
.ws-pag-de{font-size:11.5px;color:var(--muted);font-weight:600;white-space:nowrap}
@media(max-width:560px){
  .ws-pag-ir{display:none}
  .ws-pag-btn{min-width:30px;height:30px;padding:0 7px;font-size:12px}
}

@media(max-width:640px){
  .ws-pag-topo{flex-direction:column;align-items:stretch}
  .ws-pag-form{justify-content:space-between}
  .ws-pag-pills{flex:1;justify-content:stretch}
  .ws-pag-pill{flex:1;text-align:center}
  /* No celular, só os controles essenciais: extremos e vizinhas imediatas. */
  .ws-pag-info{width:100%;text-align:center;margin:6px 0 0}
}

/* ---- Radius › Usuários: ações em massa e rolagem da tabela ---------------------------------
   Os botões de exclusão em massa ficavam na mesma linha da busca, com o mesmo peso visual do
   "Buscar" — dois botões vermelhos de exclusão colados num campo de pesquisa. Agora são um
   bloco próprio, rotulado e destacado como destrutivo. */
.ws-rad-lote{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin:0 0 10px;
             padding:8px 12px;border:1px solid rgba(220,38,38,.30);border-radius:10px;
             background:rgba(220,38,38,.04)}
.ws-rad-lote-rot{font-size:11.5px;font-weight:800;color:#dc2626;white-space:nowrap}
.ws-rad-b{font-size:12px;padding:5px 11px}
/* Tabela larga rola dentro do próprio bloco — a PÁGINA nunca rola de lado. */
.ws-tab-wrap{overflow-x:auto;-webkit-overflow-scrolling:touch;border-radius:10px}
@media(max-width:640px){
  .ws-rad-lote{flex-direction:column;align-items:stretch}
  .ws-rad-lote .ws-rad-b{width:100%}
  .ws-rad-lote #radLoteCount{margin:4px 0 0!important;text-align:center}
}

/* ---- Manutenção › comandos de terminal ------------------------------------------------------
   Cada comando é um cartão com o que faz escrito ao lado, e um botão de copiar. O comando em si
   fica em fonte monoespaçada, com quebra — comando de terminal cortado no fim é inútil. */
.mnt-cmds{display:grid;grid-template-columns:repeat(auto-fit,minmax(340px,1fr));gap:10px}
.mnt-cmd{border:1px solid var(--border);border-radius:10px;padding:10px 12px;background:var(--surface)}
.mnt-cmd-top{display:flex;align-items:center;justify-content:space-between;gap:8px;margin-bottom:4px}
.mnt-cmd-top b{font-size:13px}
.mnt-cmd-copiar{font-size:11.5px;padding:3px 9px;white-space:nowrap}
.mnt-cmd .oque{font-size:12px;color:var(--muted);line-height:1.5;margin-bottom:8px}
/* CAIXA DO COMANDO — cor FIXA, nunca herdada do tema.
   Estava "background:var(--bg,#0b0f19)": no tema claro --bg é claro e o texto é #e6edf3
   (quase branco), então o comando ficava branco sobre branco, ilegível. O fallback #0b0f19 só
   valeria se --bg não existisse — e ele existe. A regra corretiva abaixo só agia com
   data-theme="light" EXPLÍCITO; no padrão (tema do sistema) não há esse atributo e ela nunca
   entrava. Uma caixa de terminal é escura em qualquer tema: cor fixa resolve e não volta a
   quebrar quando alguém mexer na paleta. */
.mnt-cmd-txt{display:block;background:#0d1117;color:#e6edf3;border:1px solid #30363d;
             border-radius:8px;padding:9px 11px;font-family:ui-monospace,Menlo,Consolas,monospace;
             font-size:12px;line-height:1.65;white-space:pre-wrap;word-break:break-all;
             -webkit-user-select:all;user-select:all;
             text-shadow:none;opacity:1}
@media(max-width:640px){
  .mnt-cmds{grid-template-columns:1fr}
  .mnt-cmd-top{flex-direction:column;align-items:flex-start}
  .mnt-cmd-copiar{width:100%}
}

/* ================================================================================================
   BARRA DE BUSCA UNIFICADA (Clientes).
   Eram três controles independentes lado a lado — select, input e botão — cada um com sua borda
   e sua altura, parecendo três campos sem relação. Aqui viram UMA peça: moldura única, divisórias
   internas em vez de bordas externas, e um anel de foco que acende a barra inteira quando o
   operador clica no texto. Também ganhou lupa e um ✕ para limpar a busca sem apagar à mão.
   ============================================================================================= */
.ws-busca-bar{display:flex;align-items:stretch;gap:0;margin-bottom:14px;
              border:1px solid var(--border);border-radius:12px;background:var(--surface);
              box-shadow:var(--shadow);overflow:hidden;
              transition:border-color .15s ease,box-shadow .15s ease}
/* :focus-within acende a barra toda, não só o campo interno. */
.ws-busca-bar:focus-within{border-color:var(--brand);
                           /* fallback primeiro: color-mix é recente e, se o navegador não
                              entender, a declaração inteira seria descartada. */
                           box-shadow:0 0 0 3px rgba(158,42,59,.18),var(--shadow);
                           box-shadow:0 0 0 3px color-mix(in srgb,var(--brand) 18%,transparent),var(--shadow)}

.ws-busca-campo{display:flex;align-items:center;border-right:1px solid var(--border);background:var(--surface-2,transparent)}
.ws-busca-campo select{border:0!important;background:transparent!important;box-shadow:none!important;
                       height:46px;padding:0 34px 0 14px;font-size:13.5px;font-weight:700;
                       color:var(--text);cursor:pointer;outline:none;
                       -webkit-appearance:none;appearance:none;
                       background-image:linear-gradient(45deg,transparent 50%,currentColor 50%),
                                        linear-gradient(135deg,currentColor 50%,transparent 50%)!important;
                       background-position:calc(100% - 18px) 21px,calc(100% - 13px) 21px!important;
                       background-size:5px 5px,5px 5px!important;background-repeat:no-repeat!important}

.ws-busca-lupa{display:flex;align-items:center;padding:0 0 0 13px;color:var(--muted);flex:0 0 auto}
.ws-busca-bar:focus-within .ws-busca-lupa{color:var(--brand)}

.ws-busca-txt{flex:1 1 auto;min-width:0;border:0!important;background:transparent!important;
              box-shadow:none!important;outline:none!important;height:46px;padding:0 12px;
              font-size:15px;color:var(--text)}
.ws-busca-txt::placeholder{color:var(--muted);opacity:.85}

.ws-busca-limpar{display:flex;align-items:center;justify-content:center;width:30px;flex:0 0 auto;
                 color:var(--muted);font-size:21px;line-height:1;text-decoration:none;
                 transition:color .12s ease}
.ws-busca-limpar:hover{color:var(--err,#dc2626)}

/* VOLTAR (obs1) — seta discreta antes da lupa, o caminho de volta à lista inteira depois de
   pesquisar ou filtrar. Discreto de propósito: opacidade baixa em repouso, cor da marca no
   hover. Só é renderizado quando existe busca ou filtro ativo. */
/* Mesmo desenho do botão de voltar do Painel dos Concentradores: caixinha arredondada de borda
   fina com a seta ↺ na cor da marca. Um só modelo de "voltar" em todo o sistema. */
/* align-self:center é obrigatório aqui: a barra usa align-items:stretch, e um item com altura
   fixa dentro de "stretch" encosta no TOPO — era o que deixava o ícone desalinhado na linha. */
.ws-busca-voltar{display:inline-flex;align-items:center;justify-content:center;align-self:center;
                 width:32px;height:32px;flex:0 0 auto;margin-left:9px;
                 font-size:16px;line-height:1;text-decoration:none;
                 color:var(--err,#c0392b);background:var(--surface);
                 border:1px solid var(--border);border-radius:9px;opacity:.85;
                 transition:opacity .12s ease,background .12s ease,transform .12s ease}
.ws-busca-voltar:hover{opacity:1;background:rgba(192,57,43,.10);transform:translateY(-1px)}
.ws-busca-voltar:focus-visible{opacity:1;outline:2px solid var(--brand);outline-offset:2px}

.ws-busca-btn{flex:0 0 auto;border:0;border-radius:0;padding:0 24px;height:46px;cursor:pointer;
              font-size:14px;font-weight:700;letter-spacing:.2px;
              background:var(--grad-brand,var(--brand));color:#fff;-webkit-text-fill-color:#fff;
              transition:filter .12s ease}
.ws-busca-btn:hover{filter:brightness(1.07)}
.ws-busca-btn:active{filter:brightness(.95)}

/* Celular: seletor e botão em cima, campo de texto ocupando a linha toda embaixo. */
@media(max-width:640px){
  .ws-busca-bar{flex-wrap:wrap}
  .ws-busca-campo{flex:1 1 auto;border-right:0;border-bottom:1px solid var(--border)}
  .ws-busca-campo select{width:100%}
  .ws-busca-btn{flex:0 0 auto;border-bottom:1px solid var(--border)}
  .ws-busca-lupa{padding-left:12px;border-top:0}
  .ws-busca-txt{flex:1 1 100%;order:9;height:44px}
  /* A seta de voltar acompanha a lupa na linha do campo de texto, não a do seletor. */
  .ws-busca-voltar{order:8;margin-left:4px}
  .ws-busca-lupa{order:8}
}

/* ---- Filtros de situação (Clientes) --------------------------------------------------------
   Eram botões avulsos com a contagem colada no rótulo — "Todos (770)". Viram um controle
   segmentado: o selecionado tem o degradê da marca, e a contagem vira um badge separado, que se
   lê como número e não como parte do nome. */
.ws-cli-filtros{gap:6px}
.ws-cli-filtros .ws-btn{border-radius:10px;font-size:13px;font-weight:700;padding:7px 14px;
                        transition:transform .12s ease,border-color .12s ease,background .12s ease}
.ws-cli-filtros .ws-btn:hover{transform:translateY(-1px);border-color:var(--brand)}
.ws-cli-filtros .ws-btn.primary{box-shadow:0 4px 12px -6px rgba(0,0,0,.4)}
@media(max-width:640px){
  .ws-cli-filtros{overflow-x:auto;flex-wrap:nowrap;-webkit-overflow-scrolling:touch;
                  padding-bottom:4px;scrollbar-width:thin}
  .ws-cli-filtros .ws-btn{flex:0 0 auto}
}

/* ================================================================================================
   GERÊNCIA OLT — modo aplicativo.
   O gerenciador nativo (olt/olt.php) roda embutido, mas dentro da moldura do WellSystem. Três
   ajustes, todos consequência de embutir uma página inteira:
     LARGURA  — ocupa a tela toda; o container padrão espremia uma tela de aprovisionamento.
     ROLAGEM  — a página EXTERNA não rola. Antes, clicar em algo dentro do iframe fazia o
                navegador rolar a página de fora, e a tela "pulava" a cada clique.
     RODAPÉ   — a altura desconta topo e rodapé, então a última linha nunca fica escondida
                atrás do rodapé fixo.
   ============================================================================================= */


/* Nome do cliente na lista do RADIUS: link para a ficha. Sublinha só no hover para a coluna não
   virar um bloco azul — a tabela já tem muita informação por linha. */
.ws-rad-nome{color:inherit;text-decoration:none;font-weight:600;border-bottom:1px solid transparent;
             transition:color .12s ease,border-color .12s ease}
.ws-rad-nome:hover{color:var(--brand);border-bottom-color:currentColor}

/* Lupa: aviso quando nenhuma tela casa com o termo (a busca de clientes continua oferecida). */
.ws-lupa-vazio{padding:9px 12px;font-size:12.5px;color:var(--muted);font-style:italic}




/* ================================================================================================
   GERENCIADOR DA OLT aberto pelo Painel dos Concentradores (Servidores › Menu › OLT).
   Ali o módulo roda dentro do servidores.php, então precisa das mesmas travas que a tela do
   Menu OLT já tem embutidas: botões alinhados na fileira e colunas paradas ao passar o mouse.
   ============================================================================================= */

/* Fileiras de botões do gerenciador: mesma altura e alinhamento, independentemente do texto. */
#oltWin [style*="grid-template-columns"] > div,
#oltApWin [style*="grid-template-columns"] > div{
  display:flex!important; flex-direction:column!important; justify-content:flex-end!important;
}
#oltWin label, #oltApWin label{
  min-height:28px!important; display:flex!important; align-items:flex-end!important;
  line-height:1.2!important; margin:0 0 4px!important;
}
#oltWin input[type="text"], #oltWin select,
#oltApWin input[type="text"], #oltApWin select{
  height:36px!important; box-sizing:border-box!important;
  padding-top:0!important; padding-bottom:0!important;
}
/* Botões do gerenciador na mesma altura — os de texto longo cresciam e desalinhavam a fileira. */
#oltWin button, #oltApWin button{ vertical-align:middle }

/* Colunas paradas: largura fixa e realce só por cor (ver explicação em olt_erp.php). */
#oltWin table{ table-layout:fixed!important; width:100%!important }
#oltWin td, #oltWin th{ overflow:hidden; text-overflow:ellipsis }
#oltWin tr:hover td, #oltWin tr:hover th{
  font-weight:inherit!important; transform:none!important;
  padding:inherit!important; border-width:inherit!important; letter-spacing:inherit!important;
}
#oltWin tr:hover{ background:rgba(0,0,0,.035)!important }
#oltWin tr:hover td{ text-shadow:0 0 .35px currentColor }
#oltWin tr, #oltWin td{ transition:background-color .12s ease!important }
/* Clique no serial não desloca a tela (o foco do "copiar" fazia rolar na horizontal). */
#oltWin{ overflow-x:hidden!important }

/* ================================================================================================
   ALINHAMENTO DOS CAMPOS DO GERENCIADOR DA OLT — vale em QUALQUER tela onde ele abra
   (Servidores › Menu › OLT e Menu OLT).

   Cada campo é <label> em cima do <input>/<select>. Rótulos como "PORTA PON (AUTO · PODE TROCAR)"
   e "PERFIL ONU/ONT (CADASTRADO)" ocupam DUAS linhas enquanto "Placa", "VLAN", "Tipo" e "Zona"
   ocupam uma — e o campo do rótulo maior descia, torcendo a fileira inteira.

   O seletor usa :has(> label) e não o style inline do grid: a versão anterior dependia de casar
   com "grid-template-columns" no atributo style e não pegava nesta tela, onde o container é
   montado de outro jeito. Ancorando no PRÓPRIO RÓTULO, funciona em qualquer container.
   ============================================================================================= */
#oltWin div:has(> label), #oltApWin div:has(> label),
[id^="oltWin"] div:has(> label), [id^="oltAp"] div:has(> label){
  display:flex!important; flex-direction:column!important; justify-content:flex-end!important;
}
#oltWin label, #oltApWin label, [id^="oltWin"] label, [id^="oltAp"] label{
  min-height:28px!important; display:flex!important; align-items:flex-end!important;
  line-height:1.2!important; margin:0 0 4px!important;
}
#oltWin input[type="text"], #oltWin select, #oltApWin input[type="text"], #oltApWin select,
[id^="oltWin"] input[type="text"], [id^="oltWin"] select,
[id^="oltAp"] input[type="text"], [id^="oltAp"] select{
  height:36px!important; box-sizing:border-box!important;
  padding-top:0!important; padding-bottom:0!important;
}

/* ============================================================================================
   EMERGÊNCIA DO RADIUS (Manutenção) — mesma tela que existe no módulo da OLT.
   RESPONSIVO DE VERDADE: no desktop cada painel é UMA linha; no tablet quebra em duas colunas;
   no celular vira uma coluna com os campos empilhados e os botões ocupando a largura toda.
   A tela original da OLT usa largura fixa e fica inutilizável no telefone — aqui não.
   ========================================================================================== */
.mnt-emerg-aviso{margin:10px 0 12px;padding:12px 14px;border-radius:10px;
  border:1px solid #b71c1c;background:linear-gradient(180deg,#d32f2f,#a31515);
  color:#fff;font-size:13px;line-height:1.45}
.mnt-emerg-aviso b{color:#ffe08a}

.mnt-emerg-botoes{display:grid;grid-template-columns:1fr 1fr;gap:10px;margin-bottom:16px}
.mnt-emerg-botoes form{margin:0}
.mnt-emerg-bt{width:100%;cursor:pointer;padding:14px;border-radius:10px;border:none;
  color:#fff;font-weight:800;font-size:14px;letter-spacing:.2px}
.mnt-emerg-bt.vermelho{background:linear-gradient(180deg,#e53935,#b71c1c)}
.mnt-emerg-bt.verde{background:linear-gradient(180deg,#22a35a,#15803d)}
.mnt-emerg-bt:hover{filter:brightness(1.06)}

.mnt-emerg-cab{display:flex;align-items:center;justify-content:space-between;
  gap:8px;margin:4px 0 8px;font-weight:800;font-size:13px}

/* Uma linha = um painel. As duas primeiras colunas (aplicar/apelido) e as ações ficam na 1ª faixa;
   usuário/senha/dmco/inter/velocidade na 2ª. auto-fit deixa o navegador decidir onde quebrar. */
.mnt-emerg-linha{display:grid;gap:8px;margin-bottom:10px;padding:10px;
  border:1px solid var(--border);border-radius:10px;background:var(--surface);
  grid-template-columns:auto minmax(150px,1fr) minmax(200px,1.4fr) auto auto}
.mnt-emerg-linha input,.mnt-emerg-linha select{width:100%;box-sizing:border-box;
  padding:8px 10px;border:1px solid var(--border);border-radius:8px;
  background:var(--surface);color:var(--text);font-size:13px}
.mnt-emerg-linha .p-user,.mnt-emerg-linha .p-pass,.mnt-emerg-linha .p-dmco,
.mnt-emerg-linha .p-inter,.mnt-emerg-linha .p-defrat{grid-column:span 1}
.mnt-emerg-apl{display:inline-flex;align-items:center;gap:5px;white-space:nowrap;
  font-size:12.5px;font-weight:700}
.mnt-emerg-abrir,.mnt-emerg-del{font-size:12px;padding:6px 10px;white-space:nowrap}
.mnt-emerg-del{border-color:rgba(220,38,38,.45);color:#dc2626}
.mnt-emerg-dica{font-size:11.5px;color:var(--muted);margin:6px 0 12px;line-height:1.5}

@media(max-width:1000px){
  .mnt-emerg-linha{grid-template-columns:repeat(2,minmax(0,1fr))}
  .mnt-emerg-apl{grid-column:1/-1}
}
@media(max-width:600px){
  .mnt-emerg-botoes{grid-template-columns:1fr}
  .mnt-emerg-linha{grid-template-columns:1fr}
  .mnt-emerg-abrir,.mnt-emerg-del{width:100%;text-align:center}
  .mnt-emerg-cab{flex-wrap:wrap}
}
