/* ============================================================
   LumeClínica — App CSS (visual próprio, paleta rosa/nude)
   Estrutura inspirada no padrão do LumeOS; identidade nova.
   ============================================================ */

* { box-sizing: border-box; margin: 0; padding: 0; }

html, body { height: 100%; }

body {
  font-family: var(--fonte);
  color: var(--texto);
  background: var(--fundo);
  font-size: 14px;
  line-height: 1.45;
  -webkit-font-smoothing: antialiased;
}

a { color: var(--marca); text-decoration: none; }
a:hover { color: var(--marca-escuro); }

/* ---------- Botões ---------- */
.btn {
  display: inline-flex; align-items: center; justify-content: center; gap: 8px;
  border: 1px solid transparent; border-radius: var(--raio-sm);
  padding: 9px 16px; font-size: 14px; font-weight: 600; font-family: inherit;
  cursor: pointer; transition: background .15s, border-color .15s, opacity .15s;
  white-space: nowrap;
}
.btn:disabled { opacity: .55; cursor: not-allowed; }
.btn-primary { background: var(--marca); color: #fff; }
.btn-primary:hover:not(:disabled) { background: var(--marca-escuro); }
.btn-secundario { background: var(--superficie); color: var(--texto); border-color: var(--borda-forte); }
.btn-secundario:hover:not(:disabled) { background: var(--superficie-2); }
.btn-ghost { background: transparent; color: var(--texto-2); }
.btn-ghost:hover:not(:disabled) { background: var(--marca-claro); color: var(--marca-escuro); }
/* Destaque intermediário: mais visível que o secundário, sem competir com o
   primário. Para ações de apoio que precisam ser encontradas — ex.: cadastrar
   profissionais, que fica na tela de Pacientes e não era óbvio. */
.btn-marca {
  background: var(--marca-claro); color: var(--marca-escuro);
  border-color: var(--marca); font-weight: 700;
}
.btn-marca:hover:not(:disabled) { background: var(--marca); color: #fff; }

/* Ícones de ação (editar/excluir) em tabelas */
.btn-icone-editar, .btn-icone-excluir {
  display: inline-flex; align-items: center; justify-content: center;
  width: 32px; height: 32px; border-radius: 8px; border: 1px solid var(--borda);
  background: var(--superficie); cursor: pointer; transition: all .15s;
}
.btn-icone-editar svg, .btn-icone-excluir svg { width: 16px; height: 16px; }
.btn-icone-editar { color: var(--marca); }
.btn-icone-editar:hover { background: var(--marca-claro); border-color: var(--marca); }
.btn-icone-excluir { color: var(--erro); }
.btn-icone-excluir:hover { background: var(--erro-bg); border-color: var(--erro); }

/* Botões de status (Agenda) e histórico (Pacientes) — mesmo formato dos ícones
   de ação. Ficam na coluna de ações, onde o usuário procura o que fazer com a
   linha; o nome clicável sozinho não se anuncia como caminho. */
.btn-icone-status, .btn-icone-historico, .btn-icone-agendar {
  display: inline-flex; align-items: center; justify-content: center;
  width: 32px; height: 32px; border-radius: 8px; border: 1px solid var(--borda);
  background: var(--superficie); cursor: pointer; transition: all .15s;
  color: var(--texto-2);
}
.btn-icone-status svg, .btn-icone-historico svg, .btn-icone-agendar svg { width: 16px; height: 16px; }
.btn-icone-status:hover { background: var(--superficie-2); border-color: var(--borda-forte); color: var(--texto); }
.btn-icone-historico:hover { background: var(--marca-claro); border-color: var(--marca); color: var(--marca-escuro); }
.btn-icone-agendar:hover { background: var(--marca-claro); border-color: var(--marca); color: var(--marca-escuro); }

/* Interruptor liga/desliga (modal de Profissionais).
   Bolinha à DIREITA + trilho na cor da marca = ativo; à ESQUERDA e cinza =
   inativo. A posição comunica o estado sem depender de ler texto — e o
   próprio controle é o botão que troca. */
.toggle {
  position: relative; flex-shrink: 0;
  width: 38px; height: 22px; padding: 0;
  border-radius: 999px; border: 1px solid var(--borda-forte);
  background: var(--superficie-2); cursor: pointer;
  transition: background .18s, border-color .18s;
}
.toggle-bola {
  position: absolute; top: 2px; left: 2px;
  width: 16px; height: 16px; border-radius: 50%;
  background: var(--texto-3);
  transition: transform .18s, background .18s;
}
.toggle.ligado { background: var(--marca-claro); border-color: var(--marca); }
.toggle.ligado .toggle-bola { transform: translateX(16px); background: var(--marca); }
.toggle:hover { border-color: var(--marca); }
.toggle:focus-visible { outline: 2px solid var(--marca); outline-offset: 2px; }

/* ---------- Formulários ---------- */
.field { display: flex; flex-direction: column; gap: 6px; margin-bottom: 14px; }
.field label { font-size: 12.5px; font-weight: 600; color: var(--texto-2); }
input, select, textarea {
  font-family: inherit; font-size: 14px; color: var(--texto);
  background: var(--superficie); border: 1px solid var(--borda-forte);
  border-radius: var(--raio-sm); padding: 9px 12px; width: 100%; transition: border-color .15s, box-shadow .15s;
}
input:focus, select:focus, textarea:focus {
  outline: none; border-color: var(--marca);
  box-shadow: 0 0 0 3px var(--marca-claro);
}
input::placeholder { color: var(--texto-3); }
.form-erro { color: var(--erro); font-size: 13px; min-height: 18px; margin-bottom: 8px; }

/* ---------- Login ---------- */
/* Fundo profundo rosé/vinho: base escura e quente que faz o card de vidro e os
   orbes de cor brilharem. Bem diferente do gradiente claro e chapado anterior. */
.login-body {
  display: flex; align-items: center; justify-content: center;
  min-height: 100vh; padding: 24px; position: relative; overflow: hidden;
  background:
    radial-gradient(1200px 800px at 15% 10%, #5a3644 0%, transparent 60%),
    radial-gradient(1000px 700px at 85% 90%, #47384f 0%, transparent 55%),
    linear-gradient(150deg, #3d2733 0%, #43333f 45%, #342a35 100%);
}

/* --- Fundo animado (orbes com blur + grão sutil) --- */
/* overflow: hidden AQUI, não só no body: no celular o overflow do body vaza
   para a viewport e os orbes (que passam da borda) criavam rolagem lateral. */
.login-fundo { position: absolute; inset: 0; z-index: 0; pointer-events: none; overflow: hidden; }
.login-fundo .orbe {
  position: absolute; border-radius: 50%; filter: blur(60px); opacity: .6;
  will-change: transform;
}
.orbe-1 {
  width: 460px; height: 460px; top: -120px; left: -80px;
  background: radial-gradient(circle, #d4577f 0%, rgba(212,87,127,0) 70%);
  animation: orbeFlutua1 18s ease-in-out infinite;
}
.orbe-2 {
  width: 520px; height: 520px; bottom: -160px; right: -120px;
  background: radial-gradient(circle, #c9a86a 0%, rgba(201,168,106,0) 70%);
  animation: orbeFlutua2 22s ease-in-out infinite;
}
.orbe-3 {
  width: 380px; height: 380px; top: 40%; left: 55%;
  background: radial-gradient(circle, #8e4560 0%, rgba(142,69,96,0) 70%);
  animation: orbeFlutua3 26s ease-in-out infinite;
}
/* Textura de grão bem leve — tira o aspecto "liso demais" do degradê. */
.login-grao {
  position: absolute; inset: 0; opacity: .04; mix-blend-mode: overlay;
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='120' height='120'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='2'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)'/%3E%3C/svg%3E");
}
@keyframes orbeFlutua1 {
  0%, 100% { transform: translate(0, 0) scale(1); }
  50% { transform: translate(60px, 40px) scale(1.12); }
}
@keyframes orbeFlutua2 {
  0%, 100% { transform: translate(0, 0) scale(1); }
  50% { transform: translate(-50px, -60px) scale(1.08); }
}
@keyframes orbeFlutua3 {
  0%, 100% { transform: translate(0, 0) scale(1); opacity: .5; }
  50% { transform: translate(-70px, 30px) scale(1.15); opacity: .7; }
}
@media (prefers-reduced-motion: reduce) {
  .login-fundo .orbe { animation: none; }
}

/* Dimensões e disposição seguem o padrão do LumeOS (wrap 440px, card e rodapé
   empilhados com gap); estilo de vidro e Playfair são a identidade daqui. */
.login-wrap {
  width: 100%; max-width: 440px; position: relative; z-index: 1;
  display: flex; flex-direction: column; align-items: center; gap: 1.3rem;
}

/* Card em vidro: translúcido sobre o fundo, com brilho fino na borda. */
.login-card {
  position: relative; width: 100%;
  background: rgba(255, 255, 255, 0.94);
  backdrop-filter: blur(18px) saturate(1.1);
  -webkit-backdrop-filter: blur(18px) saturate(1.1);
  border-radius: 24px;
  border: 1px solid rgba(255, 255, 255, 0.5);
  box-shadow:
    0 20px 60px rgba(20, 8, 14, 0.35),
    0 0 0 1px rgba(212, 87, 127, 0.08),
    inset 0 1px 0 rgba(255, 255, 255, 0.7);
  padding: 2.8rem 2.4rem;
  animation: cardEntra .7s cubic-bezier(.2, .8, .2, 1) both;
}
/* Fio dourado no topo do card — detalhe de acabamento. */
.login-card::before {
  content: ""; position: absolute; top: 0; left: 24px; right: 24px; height: 2px;
  border-radius: 2px;
  background: linear-gradient(90deg, transparent, var(--marca) 20%, var(--dourado) 80%, transparent);
  opacity: .85;
}
@keyframes cardEntra {
  from { opacity: 0; transform: translateY(16px); }
  to { opacity: 1; transform: translateY(0); }
}
@media (prefers-reduced-motion: reduce) {
  .login-card { animation: none; }
}

/* Logo: altura do LumeOS (84px). Marca em texto mantém a Playfair em degradê. */
.login-logo { display: flex; justify-content: center; margin-bottom: 1.6rem; }
.login-logo img { height: 84px; max-width: 260px; object-fit: contain; }
.login-logo .marca-texto {
  font-family: var(--fonte-marca);
  font-size: 38px; font-weight: 600; letter-spacing: .2px; line-height: 1.15;
  background: linear-gradient(120deg, var(--marca-escuro), var(--marca) 55%, var(--dourado));
  -webkit-background-clip: text; background-clip: text;
  -webkit-text-fill-color: transparent; color: var(--marca-escuro);
}
/* Título mantém a Playfair (identidade da clínica), tamanho do LumeOS (1.5rem). */
.login-card h1 {
  font-family: var(--fonte-marca); font-weight: 600; font-size: 1.5rem;
  text-align: center; color: var(--texto); letter-spacing: .1px;
}
.login-sub { text-align: center; color: var(--texto-2); font-size: 0.9rem; margin: 0.4rem 0 1.6rem; }
.login-card .field { margin-bottom: 1.1rem; }
/* Botão do login: largura moderada e centralizado (padrão LumeOS), com o
   degradê marca→dourado e brilho ao passar o mouse (identidade daqui). */
.login-card .btn-primary {
  display: flex; justify-content: center; margin: 0.2rem auto 0;
  min-width: 160px; padding: 12px 2rem;
  font-size: 14.5px; letter-spacing: .3px;
  background: linear-gradient(120deg, var(--marca-escuro), var(--marca) 60%, #d68a63);
  border: none; box-shadow: 0 8px 20px -8px rgba(168, 80, 110, .6);
  transition: transform .15s, box-shadow .2s, filter .2s;
}
.login-card .btn-primary:hover {
  filter: brightness(1.06); transform: translateY(-1px);
  box-shadow: 0 12px 26px -8px rgba(168, 80, 110, .7);
}
.login-card .btn-primary:active { transform: translateY(0); }

/* Campos do login — foco elegante com anel rosé. */
.login-card .form-erro { min-height: 1.2rem; margin-bottom: 0.6rem; }
.login-card .field label { font-size: 12.5px; color: var(--texto-2); font-weight: 600; }
.login-card input {
  padding: 11px 13px; border-radius: 12px; border: 1px solid var(--borda-forte);
  background: rgba(255,255,255,.7); transition: border-color .15s, box-shadow .15s;
}
.login-card input:focus {
  border-color: var(--marca); outline: none;
  box-shadow: 0 0 0 3px rgba(212, 87, 127, .18);
}

/* Rodapé agora sobre fundo escuro: texto claro e discreto. */
.login-rodape {
  text-align: center; margin-top: 22px; font-size: 12px;
  color: rgba(255, 255, 255, .8); letter-spacing: .3px;
  text-shadow: 0 1px 2px rgba(60, 40, 50, .3);
}

/* ---------- Layout com sidebar ---------- */
.layout { display: flex; height: 100vh; overflow: hidden; }

.sidebar {
  width: var(--sidebar-w); flex-shrink: 0;
  /* Degradê suave (out/2026): o menu fica centralizado na altura e sobram
     vãos acima de "Agenda" e abaixo de "Configurações". Dois brilhos bem
     claros — rosa no vão de cima, lilás no de baixo — dão textura a esses
     vãos sem acrescentar elemento nenhum. Opacidade baixa de propósito: é
     fundo, não pode competir com os itens nem com o item ativo.
     O de baixo era dourado e ficava atrás do "Clinic" da logo do rodapé
     (letras rosé): trocado por lilás, mais alto, e o rodapé tem fundo limpo. */
  background:
    radial-gradient(ellipse 120% 26% at 0% 24%, rgba(212, 87, 127, .09), transparent 70%),
    radial-gradient(ellipse 120% 20% at 100% 78%, rgba(150, 128, 200, .10), transparent 70%),
    linear-gradient(180deg, var(--superficie) 0%, #fdf7f7 100%);
  border-right: 1px solid var(--borda);
  display: flex; flex-direction: column;
}
.sidebar-marca {
  position: relative;
  display: flex; align-items: center; justify-content: center; gap: 10px;
  padding: 22px 18px 18px;
}
/* Separação sutil: uma linha curta e desvanecida no centro, em vez de uma
   borda reta que competiria com a linha da topbar. */
.sidebar-marca::after {
  content: ""; position: absolute; left: 18%; right: 18%; bottom: 0; height: 1px;
  background: linear-gradient(90deg, transparent, var(--borda) 25%, var(--borda) 75%, transparent);
}
.sidebar-marca img { max-height: 68px; max-width: 190px; object-fit: contain; }
.sidebar-marca .marca-texto {
  font-family: var(--fonte-marca);
  /* Mesmo tratamento do login (ver .login-logo .marca-texto). */
  font-size: 23px; font-weight: 600; color: var(--marca-escuro);
  letter-spacing: .1px; line-height: 1.15;
}
/* Menu compacto: as 10 telas cabem sem barra de rolagem, e o bloco fica
   centralizado na altura entre a conta (topo) e a logo de suporte (rodapé).
   `margin:auto` nas pontas em vez de `justify-content:center`: se um dia o
   conteúdo passar da área, `center` cortaria as duas extremidades. */
.sidebar-nav {
  flex: 1; padding: 10px; min-height: 0;
  display: flex; flex-direction: column; gap: 1px;
}
.sidebar-nav > .nav-grupo:first-child { margin-top: auto; }
.sidebar-nav > .nav-grupo:last-child  { margin-bottom: auto; }
.sidebar-nav a {
  /* `relative` é a referência da barra do item ativo (::before abaixo), que é
     posicionada de forma absoluta. Sem isto ela se ancoraria na sidebar e
     apareceria no lugar errado. */
  position: relative;
  display: flex; align-items: center;
  /* Tamanho e espaçamento do LumeOS (out/2026): antes 12,5px e ícone 16px,
     que o cliente achou miúdo e apertado. Item ~39px + 4px entre itens. */
  gap: 12px; padding: 10px 14px; border-radius: var(--raio-sm);
  color: var(--texto-2); font-weight: 500; font-size: 14.5px;
  letter-spacing: .01em; transition: background .15s, color .15s;
}
.sidebar-nav a svg { width: 19px; height: 19px; flex-shrink: 0; opacity: .8; }
.sidebar-nav a:hover { background: var(--superficie-2); color: var(--texto); }
.sidebar-nav a:hover svg { opacity: 1; }
.sidebar-nav a.ativo {
  background: var(--marca-claro); color: var(--marca-escuro); font-weight: 600;
}
.sidebar-nav a.ativo svg { opacity: 1; }
/* Barra vertical no item ativo: marca a posição atual mesmo de relance.
   O fundo sozinho é `--marca-claro` (#fae0e9), um rosa que quase some sobre
   branco em monitor claro ou com brilho alto. A barra usa a cor CHEIA da
   marca — pequena, mas de alto contraste. */
.sidebar-nav a.ativo::before {
  content: ""; position: absolute; left: 0; top: 50%; transform: translateY(-50%);
  /* 20px = metade da altura do item (~41px). Ao mudar o padding do item,
     refazer a conta — a proporção é que importa, não o número. */
  width: 3px; height: 20px; border-radius: 0 3px 3px 0;
  background: var(--marca);
}
/* Foco por teclado visível: quem navega por Tab precisa ver onde está. */
.sidebar-nav a:focus-visible { outline: 2px solid var(--marca); outline-offset: -2px; }

/* Grupos separados por uma divisória fina, sem rótulo de seção.
   Títulos em caixa-alta foram testados duas vezes e descartados: com 10 itens,
   três rótulos quebravam a lista em seis elementos e o menu lia como bagunça.
   Uma linha de 1px marca o mesmo agrupamento sem disputar atenção com os itens. */
.nav-grupo { display: flex; flex-direction: column; gap: 4px; position: relative; }
.nav-grupo + .nav-grupo { margin-top: 9px; padding-top: 9px; }
/* Linha desvanecida nas pontas, como a separação sob a marca — uma borda reta
   de ponta a ponta ficaria dura demais para o peso do resto da barra. */
.nav-grupo + .nav-grupo::before {
  content: ""; position: absolute; top: 0; left: 12px; right: 12px; height: 1px;
  background: linear-gradient(90deg, transparent, var(--borda) 20%, var(--borda) 80%, transparent);
}

/* Telas baixas: aperta o espaçamento, mas os títulos PERMANECEM — eles são a
   organização do menu, não um enfeite que se corta primeiro. A altura sai do
   padding dos itens, que sobra, e não do que dá sentido à lista. */
/* Telas baixas: a altura extra vem da marca e do rodapé, que têm folga de
   sobra — não do menu, que é a função principal da barra. */
@media (max-height: 760px) {
  .sidebar-nav { padding: 6px 10px; }
  .sidebar-nav a { padding: 5px 12px; }
  .nav-grupo { gap: 1px; }
  .nav-grupo + .nav-grupo { margin-top: 7px; padding-top: 7px; }

  .sidebar-marca { padding: 14px 18px 12px; }
  .sidebar-marca img { max-height: 50px; }
  .sidebar-marca .marca-texto { font-size: 19px; }
  .sidebar-suporte { padding: 8px 14px 10px; }
  .sidebar-suporte img { max-width: 116px; }
}
/* Conta (usuário + Sair) — fica ACIMA dos menus, logo abaixo da marca da
   clínica: separa "quem sou eu" de "para onde vou". Compacto de propósito, é
   apoio e não deve competir com a navegação. */
/* padding-left 26px alinha o nome com o ÍCONE dos itens do menu (12px do .nav
   + 14px do padding do <a>), criando um eixo vertical contínuo entre a conta e
   a navegação. Centralizar o nome quebraria esse eixo e ainda brigaria com o
   botão Sair, que é ancorado à direita. */
.sidebar-conta {
  position: relative; padding: 11px 15px 13px 26px;
  display: flex; align-items: center; justify-content: space-between; gap: 8px;
}
/* Separação sutil abaixo da conta — mesma linha curta e desvanecida da marca. */
.sidebar-conta::after {
  content: ""; position: absolute; left: 18%; right: 18%; bottom: 0; height: 1px;
  background: linear-gradient(90deg, transparent, var(--borda) 25%, var(--borda) 75%, transparent);
}
/* min-width:0 permite o ellipsis funcionar dentro do flex. */
.sidebar-usuario { min-width: 0; text-align: left; }
/* Nome discreto: fonte do sistema (não Playfair, que é da marca) e menor —
   é identificação de sessão, não título de tela. */
.sidebar-usuario strong {
  display: block; font-size: 12.5px; font-weight: 700; color: var(--texto);
  line-height: 1.2; white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.sidebar-usuario .usuario-papel {
  display: block; margin-top: 1px; font-size: 9px; font-weight: 600;
  color: var(--texto-3); text-transform: uppercase; letter-spacing: 1.1px;
}
/* Sair — só o ícone, com o rótulo lido por leitor de tela. Poupa a largura
   para o nome do usuário, que é a informação útil ali. */
.btn-sair {
  display: inline-flex; align-items: center; justify-content: center;
  width: 30px; height: 30px; flex-shrink: 0; padding: 0;
  border-radius: 50%; border: 1px solid var(--borda); background: transparent;
  color: var(--texto-2); cursor: pointer; transition: all .18s;
}
.btn-sair span { position: absolute; width: 1px; height: 1px; overflow: hidden; clip: rect(0 0 0 0); }
.btn-sair svg { width: 15px; height: 15px; }
.btn-sair:hover { background: var(--erro-bg); border-color: var(--erro); color: var(--erro); }
.btn-sair:focus-visible { outline: 2px solid var(--marca); outline-offset: 2px; }

/* Rodapé: logo LumeClínica fixa = botão de suporte técnico (WhatsApp).
   `margin-top: auto` cola no fim mesmo com poucos itens de menu. */
.sidebar-suporte {
  position: relative; margin-top: auto;
  display: flex; flex-direction: column; align-items: center; gap: 3px;
  padding: 11px 14px 13px; text-decoration: none;
  transition: background .18s;
  /* Fundo limpo atrás da logo: o brilho do degradê da .sidebar não pode passar
     por trás do "Clínica" (letras rosé), senão elas perdem contraste. Funde na
     cor-base do pé da sidebar (#fdf7f7) em vez de cortar seco. */
  background: linear-gradient(180deg, rgba(253, 247, 247, 0) 0, #fdf7f7 22px);
}
.sidebar-suporte::before {
  content: ""; position: absolute; left: 18%; right: 18%; top: 0; height: 1px;
  background: linear-gradient(90deg, transparent, var(--borda) 25%, var(--borda) 75%, transparent);
}
/* Assinatura do fornecedor: discreta de propósito — não deve competir com a
   marca da clínica (topo) nem com a navegação. */
.sidebar-suporte img {
  width: 100%; max-width: 140px; height: auto; display: block;
  opacity: .9; transition: opacity .18s, transform .18s;
}
/* Pílula em vez de texto solto: o texto cinza de 9,5px não parecia clicável.
   Ícone de robô (não o do WhatsApp) e sem o verde do WhatsApp, nem no hover:
   destoava da paleta rosé. A cor fica na marca. */
.suporte-cta {
  display: inline-flex; align-items: center; gap: 4px; margin-top: 3px;
  padding: 2px 8px;
  /* Centro ótico: o ícone pesa à esquerda da logo e o olho lê o meio no texto
     "LumeClínica"; centralizada pela caixa, a pílula parecia puxada para a esquerda. */
  transform: translateX(8px); border: 1px solid var(--borda); border-radius: 999px;
  background: var(--superficie);
  font-size: 9.5px; font-weight: 600; letter-spacing: .1px; line-height: 1.4;
  color: var(--texto-2); transition: color .18s, border-color .18s, background .18s;
}
.suporte-cta svg { width: 11px; height: 11px; flex-shrink: 0; color: var(--marca); }
.sidebar-suporte:hover img { opacity: 1; transform: translateY(-1px); }
.sidebar-suporte:hover .suporte-cta { color: var(--marca-escuro); border-color: var(--marca); background: var(--marca-claro); }
.sidebar-suporte:focus-visible { outline: 2px solid var(--marca); outline-offset: -2px; border-radius: var(--raio-sm); }

.main { flex: 1; display: flex; flex-direction: column; min-width: 0; overflow: hidden; }
.topbar {
  display: flex; align-items: center; justify-content: space-between;
  padding: 16px 28px; border-bottom: 1px solid var(--borda); background: var(--superficie);
  flex-shrink: 0;
}
.topbar h1 {
  position: relative; display: flex; align-items: center; gap: 14px;
  font-family: var(--fonte-titulo); font-weight: 700;
  font-size: 24px; letter-spacing: -0.01em; color: var(--texto);
}
/* Barra de realce à esquerda do título — cápsula com degradê rosa → dourado
   e um glow suave da cor da marca ao redor. */
.topbar h1::before {
  content: ""; width: 5px; height: 1.1em; border-radius: 999px; flex-shrink: 0;
  background: linear-gradient(180deg, var(--marca), var(--dourado));
  box-shadow: 0 0 12px rgba(212, 87, 127, .55);
}
.topbar .topbar-acoes { display: flex; gap: 10px; align-items: center; }
.content { flex: 1; display: flex; flex-direction: column; min-height: 0; padding: 22px 28px; overflow: hidden; }

/* Páginas que rolam normalmente (não é layout preenche-tela).
   Precisa desativar a cadeia flex: os filhos empilham na altura natural
   e quem rola é o próprio .content — senão o último bloco fica cortado. */
.content--scroll {
  display: block;
  overflow-y: auto;
  min-height: 0;
}
/* Dentro de uma página rolável a tabela não estica: assume a altura do conteúdo. */
.content--scroll .tabela-corp { flex: 0 0 auto; }
/* Respiro no fim da rolagem (padding-bottom do container é ignorado por alguns
   navegadores ao rolar até o fim, deixando o último bloco colado na borda). */
.content--scroll > :last-child { margin-bottom: 22px; }

/* ---------- Filtros ---------- */
.filtros {
  display: flex; flex-wrap: wrap; gap: 12px; align-items: flex-end;
  background: var(--superficie); border: 1px solid var(--borda);
  border-radius: var(--raio); padding: 16px; margin-bottom: 16px; flex-shrink: 0;
}
.filtros .field { margin-bottom: 0; min-width: 150px; flex: 1; }
.filtros .filtros-acoes { display: flex; gap: 8px; }

/* Filtros do dashboard: período à esquerda, atalhos à direita, sem vazar */
.filtros-dashboard { justify-content: space-between; }
.filtros-periodo { display: flex; flex-wrap: wrap; gap: 12px; align-items: flex-end; }
.filtros-periodo .field { flex: 0 0 auto; min-width: 150px; }
.filtros-atalhos { display: flex; flex-wrap: wrap; gap: 8px; align-items: flex-end; }
.filtros-atalhos .btn { white-space: nowrap; }

/* ---------- Tabela corporativa (.tabela-corp) ---------- */
.tabela-corp {
  display: flex; flex-direction: column; flex: 1; min-height: 0;
  background: var(--superficie); border: 1px solid var(--borda);
  border-radius: var(--raio); overflow: hidden; box-shadow: var(--sombra);
}
.tabela-corp-head {
  display: flex; align-items: baseline; justify-content: space-between; gap: 16px;
  padding: 16px 20px; border-bottom: 1px solid var(--borda); flex-shrink: 0;
}
.tabela-corp-head .tc-titulo { font-size: 16px; font-weight: 700; }
.tabela-corp-head .tc-sub { font-size: 12.5px; color: var(--texto-2); }
.tabela-corp-head .tc-contador { text-align: right; }
.tabela-corp-head .tc-contador .n { font-size: 20px; font-weight: 700; color: var(--marca); }
.tabela-corp-head .tc-contador .rotulo { font-size: 11px; color: var(--texto-3); text-transform: uppercase; letter-spacing: .5px; }

.panel-scroll { flex: 1; min-height: 0; overflow: auto; }
.panel-scroll table { width: 100%; border-collapse: collapse; }
.panel-scroll thead th {
  position: sticky; top: 0; z-index: 1;
  background: var(--superficie-2); color: var(--texto-2);
  font-size: 12px; font-weight: 700; text-transform: uppercase; letter-spacing: .4px;
  text-align: left; padding: 12px 16px; border-bottom: 1px solid var(--borda);
  white-space: nowrap;
}
/* Cabeçalho de coluna numérica alinha à direita como as células (.td-num),
   senão o título fica à esquerda e o número à direita — desencontrados. */
.panel-scroll thead th.td-num { text-align: right; }
.panel-scroll tbody td { padding: 13px 16px; border-bottom: 1px solid var(--borda); vertical-align: middle; }
.panel-scroll tbody tr:hover { background: var(--marca-claro); }
.panel-scroll tbody tr:last-child td { border-bottom: none; }
.panel-scroll .vazio { text-align: center; color: var(--texto-3); padding: 40px; }
.col-acoes { display: flex; gap: 6px; }
.td-num { text-align: right; font-variant-numeric: tabular-nums; }

/* Variante compacta — tabelas largas (muitas colunas) que precisam caber
   em primeira tela sem rolagem horizontal. Aplicada por página, no .tabela-corp. */
.tabela-corp.compacta .panel-scroll thead th { font-size: 11px; padding: 9px 10px; letter-spacing: .3px; }
.tabela-corp.compacta .panel-scroll tbody td { font-size: 12.5px; padding: 8px 10px; }
.tabela-corp.compacta .panel-scroll .badge { font-size: 11px; padding: 2px 7px; }
.tabela-corp.compacta .col-acoes { gap: 4px; }
.tabela-corp.compacta .btn-icone-editar,
.tabela-corp.compacta .btn-icone-excluir,
.tabela-corp.compacta .btn-icone-status,
.tabela-corp.compacta .btn-icone-historico,
.tabela-corp.compacta .btn-icone-agendar { width: 27px; height: 27px; border-radius: 6px; }
.tabela-corp.compacta .btn-icone-editar svg,
.tabela-corp.compacta .btn-icone-excluir svg,
.tabela-corp.compacta .btn-icone-status svg,
.tabela-corp.compacta .btn-icone-historico svg,
.tabela-corp.compacta .btn-icone-agendar svg { width: 15px; height: 15px; }

/* Badges de categoria */
.badge {
  display: inline-block; padding: 4px 10px; border-radius: 6px;
  font-size: 12px; font-weight: 600; white-space: nowrap;
}
.badge-novo  { background: #f7e2ea; color: var(--cat-novo); }
.badge-recor { background: #e4ecf7; color: var(--cat-recor); }
.badge-parc  { background: #f6eeda; color: #9c7c34; }
.badge-nao   { background: #ede8ea; color: var(--cat-nao); }

/* ---------- Cards (dashboard) ---------- */
.cards { display: grid; grid-template-columns: repeat(auto-fit, minmax(210px, 1fr)); gap: 16px; margin-bottom: 20px; }
.card {
  background: var(--superficie); border: 1px solid var(--borda);
  border-radius: var(--raio); padding: 20px; box-shadow: var(--sombra);
}
.card .card-rotulo { font-size: 12.5px; color: var(--texto-2); font-weight: 600; margin-bottom: 8px; }
.card .card-valor { font-size: 27px; font-weight: 700; color: var(--texto); }
.card .card-extra { font-size: 12px; color: var(--texto-3); margin-top: 4px; }

/* Cards de total numa página de listagem (layout preenche-tela): não podem
   roubar a altura da tabela nem crescer/encolher com ela. Compactos e fixos. */
.cards-cp {
  flex-shrink: 0; margin-bottom: 16px;
  grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); gap: 12px;
}
.cards-cp .card { padding: 12px 16px; }
.cards-cp .card .card-rotulo { margin-bottom: 3px; }
.cards-cp .card .card-valor { font-size: 22px; line-height: 1.15; }
.cards-cp .card .card-extra { margin-top: 1px; }
.card.destaque { border-top: 3px solid var(--marca); }

/* Cards de indicador da Visão Geral — Faturamento geral, Faturamento por
   status, Conversões e Comercial (set/2026).
   Medidos antes: 131px cada, contra 79px dos cards de consultas/produtos na
   mesma tela. A diferença não tinha motivo — são todos "rótulo + número +
   linha de apoio" — e deixava a página com três escalas competindo.

   Mais baixos e com o número um degrau menor. O valor continua sendo o que
   salta: o que encolheu foi o espaço em volta, não a informação. */
.cards-vg {
  grid-template-columns: repeat(auto-fit, minmax(190px, 1fr));
  gap: 12px; margin-bottom: 16px;
}
.cards-vg .card { padding: 13px 16px; }
.cards-vg .card .card-rotulo { font-size: 12px; margin-bottom: 4px; }
.cards-vg .card .card-valor { font-size: 23px; line-height: 1.15; }
.cards-vg .card .card-extra { font-size: 11.5px; margin-top: 3px; line-height: 1.35; }
.cards-vg .card.destaque { border-top-width: 2px; }

.graficos { display: grid; grid-template-columns: repeat(auto-fit, minmax(320px, 1fr)); gap: 16px; }
.grafico-card {
  background: var(--superficie); border: 1px solid var(--borda);
  border-radius: var(--raio); padding: 20px; box-shadow: var(--sombra);
}
.grafico-card h3 { font-size: 15px; font-weight: 700; margin-bottom: 14px; }
.grafico-card canvas { max-height: 280px; }

/* ---------- Dashboard "preenche-tela" ----------
   Tudo (filtros + cards + 4 gráficos) cabe sem rolar: os gráficos dividem a
   altura restante. Depende da cadeia flex .content → .graficos → .grafico-card. */
.content--dashboard { display: flex; flex-direction: column; min-height: 0; overflow: hidden; }
/* Filtros e cards enxutos: são apoio — a altura pertence aos gráficos. */
.content--dashboard .filtros { padding: 7px 12px; margin-bottom: 8px; gap: 8px; row-gap: 6px; }
.content--dashboard .filtros .field { gap: 2px; min-width: 128px; }
.content--dashboard .filtros .field label { font-size: 10.5px; }
.content--dashboard .filtros input,
.content--dashboard .filtros select { padding: 4px 9px; font-size: 12.5px; }
.content--dashboard .filtros .btn { padding: 4px 11px; font-size: 12px; }
.content--dashboard .cards { gap: 8px; margin-bottom: 8px; flex-shrink: 0; }
.content--dashboard .card { padding: 8px 13px; }
.content--dashboard .card.destaque { border-top-width: 2px; }
.content--dashboard .card .card-rotulo { font-size: 10.5px; margin-bottom: 1px; letter-spacing: .01em; }
.content--dashboard .card .card-valor { font-size: 19px; line-height: 1.1; }
.content--dashboard .card .card-extra { font-size: 10.5px; margin-top: 0; }
/* Os 4 gráficos em 2×2, ocupando toda a altura que sobrar. */
.content--dashboard .graficos {
  flex: 1; min-height: 0; gap: 10px;
  grid-template-columns: repeat(2, 1fr); grid-template-rows: repeat(2, 1fr);
}
.content--dashboard .grafico-card {
  display: flex; flex-direction: column; min-height: 0; padding: 12px 15px 13px;
}
.content--dashboard .grafico-card h3 { font-size: 12.5px; margin-bottom: 6px; flex-shrink: 0; }
/* O canvas preenche o que restou do card. `position:absolute` dentro de um pai
   com altura resolvida é o padrão do Chart.js para responsividade: sem isso o
   canvas empurra o container, que reexpande o canvas (o gráfico "cresce sozinho"). */
.content--dashboard .grafico-card .canvas-box { position: relative; flex: 1; min-height: 0; }
.content--dashboard .grafico-card canvas {
  position: absolute; inset: 0; width: 100% !important; height: 100% !important;
  max-height: none !important;
}

/* Comercial (classe segue `--redes`, nome antigo da tela): mesmo tratamento
   do dashboard, mas a página rola para
   alcançar a tabela de lançamentos abaixo. Os gráficos ocupam a 1ª tela;
   a altura vem de min-height (não de flex), senão encolheriam com a tabela. */
.content--redes { overflow-y: auto; }
/* .tela-cheia ocupa exatamente a altura visível do .content: filtros + cards +
   gráficos preenchem a 1ª tela e a tabela fica logo abaixo da dobra (aparece ao
   rolar). Altura vem do pai — sem estimativa de pixels. */
.content--redes .tela-cheia {
  /* +22px compensa o padding-bottom do .content, que senão deixa o topo da
     tabela assomar na 1ª tela. */
  height: calc(100% + 22px); flex-shrink: 0;
  display: flex; flex-direction: column; min-height: 0;
}
.content--redes .tela-cheia .graficos { flex: 1; min-height: 0; }
.content--redes .tabela-corp { flex: none; margin-top: 22px; }

/* Metas: mesmo padrão da tela Comercial — filtros + painel meta×realizado +
   referências ocupam a 1ª tela; a tabela de metas cadastradas fica abaixo da
   dobra (aparece ao rolar). */
.content--metas { overflow-y: auto; }
/* Conteúdo em fluxo natural: painel, referências e tabela empilham na altura
   real, sem esticar e sem vazio. A tabela fica logo abaixo das referências. */
.content--metas .tabela-corp { flex: none; margin-top: 16px; }

/* ---------- Painel de metas (meta × realizado) ---------- */
.meta-cards { display: grid; grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); gap: 16px; }
.meta-card {
  background: var(--superficie); border: 1px solid var(--borda);
  border-radius: var(--raio); padding: 20px; box-shadow: var(--sombra);
}
.meta-card .meta-titulo { font-size: 14px; font-weight: 700; margin-bottom: 12px; }
.meta-card .meta-linha { display: flex; justify-content: space-between; font-size: 13px; margin-bottom: 4px; }
.meta-card .meta-linha .rot { color: var(--texto-2); }
.meta-card .meta-linha .val { font-weight: 700; }
.meta-card .meta-realizado .val { color: var(--marca); }
.meta-barra { height: 12px; background: var(--superficie-2); border-radius: 20px; overflow: hidden; margin: 12px 0 8px; border: 1px solid var(--borda); }
.meta-barra > span { display: block; height: 100%; border-radius: 20px; transition: width .4s; background: var(--marca); }
.meta-barra.ok > span { background: var(--ok); }
.meta-pct { display: flex; align-items: center; gap: 8px; font-size: 13px; }
.meta-pct .badge { font-size: 11px; }
.meta-card .sem-meta { color: var(--texto-3); font-size: 13px; font-style: italic; }

/* ---------- Modal ---------- */
.modal-fundo {
  position: fixed; inset: 0; background: rgba(58, 47, 51, 0.45);
  display: none; align-items: center; justify-content: center; z-index: 50; padding: 20px;
}
.modal-fundo.aberto { display: flex; }
.modal {
  background: var(--superficie); border-radius: var(--raio);
  box-shadow: var(--sombra-forte); width: 100%; max-width: 560px;
  max-height: 92vh; overflow: auto;
}
.modal-head { display: flex; align-items: center; justify-content: space-between; padding: 16px 24px; border-bottom: 1px solid var(--borda); }
.modal-head h2 { font-size: 18px; font-weight: 700; }
.modal-fechar { background: none; border: none; font-size: 24px; color: var(--texto-3); cursor: pointer; line-height: 1; }
.modal-body { padding: 18px 24px; }
.modal-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 0 16px; }
.modal-grid .col-2 { grid-column: 1 / -1; }
/* Linha de contexto no topo do modal (ex.: de quem é o retorno a agendar). */
.modal-texto { font-size: 13px; color: var(--texto-2); margin-bottom: 14px; line-height: 1.5; }
.modal-texto strong { color: var(--texto); font-weight: 600; }
.modal-foot { display: flex; justify-content: flex-end; gap: 10px; padding: 14px 24px; border-top: 1px solid var(--borda); }

/* Campos mais compactos dentro do modal — para caber em 1 tela sem rolagem. */
.modal .field { gap: 4px; margin-bottom: 10px; }
.modal .field label { font-size: 12px; }
.modal input, .modal select, .modal textarea { padding: 7px 11px; font-size: 13.5px; }
.modal .form-erro { min-height: 0; margin-bottom: 4px; }

/* Campo travado (ex.: valor/forma quando "Não converteu"): visual apagado
   para deixar claro que não é editável. */
.modal input:disabled, .modal select:disabled {
  background: var(--superficie-2); color: var(--texto-3); cursor: not-allowed;
}
/* Aviso ancorado ao lado do rótulo — position:absolute para NÃO empurrar a
   altura da grade (senão o modal cresce e aparece a barra de rolagem). */
.aviso-flutuante {
  position: absolute; top: 1px; right: 0;
  font-size: 10.5px; font-style: italic; color: var(--marca-escuro);
}

/* ---------- Logo (configurações) ---------- */
.logo-preview {
  width: 180px; height: 100px; border: 1px dashed var(--borda-forte); border-radius: var(--raio-sm);
  display: flex; align-items: center; justify-content: center; background: var(--superficie-2); overflow: hidden;
}
.logo-preview img { max-width: 100%; max-height: 100%; object-fit: contain; }
.logo-vazia { color: var(--texto-3); font-size: 13px; }

/* ---------- Utilitários ---------- */
.hidden { display: none !important; }
.muted { color: var(--texto-2); }
.spacer { flex: 1; }
.toast {
  position: fixed; bottom: 24px; right: 24px; z-index: 100;
  background: var(--texto); color: #fff; padding: 12px 18px; border-radius: var(--raio-sm);
  box-shadow: var(--sombra-forte); font-size: 14px; opacity: 0; transform: translateY(10px);
  transition: opacity .2s, transform .2s; pointer-events: none;
}
.toast.mostra { opacity: 1; transform: translateY(0); }
.toast.erro { background: var(--erro); }
.toast.ok { background: var(--ok); }

/* ============================================================
   Botão hambúrguer + overlay do drawer
   (escondidos no desktop; ativados nas media queries mobile)
   ============================================================ */
.btn-menu {
  display: none; /* só aparece no mobile */
  align-items: center; justify-content: center;
  width: 40px; height: 40px; margin-right: 4px;
  border: 1px solid var(--borda-forte); border-radius: var(--raio-sm);
  background: var(--superficie); color: var(--texto); cursor: pointer;
  flex-shrink: 0; transition: background .15s;
}
.btn-menu:hover { background: var(--superficie-2); }
.btn-menu svg { width: 20px; height: 20px; }

.sidebar-overlay {
  display: none; position: fixed; inset: 0; z-index: 40;
  background: rgba(58, 47, 51, 0.45);
  opacity: 0; transition: opacity .2s;
}

/* ---------- Visão Geral (retrato do momento, sem filtros) ---------- */
.vg-subtitulo { color: var(--texto-2); font-size: 13px; margin-bottom: 18px; }
.vg-momento { font-size: 12.5px; color: var(--texto-3); }

.vg-secao {
  font-family: var(--fonte-titulo); font-size: 17px; font-weight: 700;
  color: var(--texto); margin: 22px 0 12px;
}
.vg-secao:first-of-type { margin-top: 0; }
.vg-secao-nota { font-weight: 500; font-size: 13.5px; color: var(--texto-3); }
/* Os blocos de faturamento que formam a 1ª tela respiram um pouco menos entre
   si que o resto da página, para o gráfico de evolução caber junto. Da
   "Meta anual" para baixo o espaçamento normal volta. */
.vg-secao--compacta { margin: 12px 0 8px; }

/* Gráfico de evolução (12 meses).

   A altura não é fixa: o gráfico recebe o que sobra da viewport, para fechar
   a 1ª tela junto com os blocos de faturamento acima. As duas variáveis são
   MEDIDAS no navegador, não estimadas somando o CSS — estimar erra por
   bordas, arredondamento de line-height e altura real da topbar. */
.vg-grafico-card {
  background: var(--superficie); border: 1px solid var(--borda);
  border-radius: var(--raio); padding: 18px 20px; box-shadow: var(--sombra);
  margin-bottom: 4px;
}
.vg-grafico-card .canvas-box {
  /* Aqui o gráfico NÃO cabe na 1ª tela, e isso é deliberado: à frente dele vêm
     quatro blocos de faturamento (atendimento, consultas, produtos e geral),
     que somam ~740px. Medido: só caberia num monitor 1920×1080+, e com o
     gráfico espremido no mínimo; num notebook de 1366×768 faltariam 278px.
     O cliente preferiu manter o agrupamento lógico — todo o faturamento
     junto, gráfico colado na Meta anual, que é a comparação natural dele —
     e rolar um pouco (set/2026).

     Como a altura da viewport não é o limite aqui, o gráfico usa a altura
     cheia; o clamp continua para telas muito baixas. */
  height: clamp(200px, 38vh, 300px);
}
.vg-grafico-card canvas { max-height: 100%; }

/* Compactação da 1ª tela: aqui a faixa de faturamento tem QUATRO blocos
   (atendimento, consultas, produtos e geral) antes do gráfico — bem mais que
   no projeto da Carol Bottura. Para tudo caber, os cards dessa faixa ficam um
   degrau mais baixos. Da seção Agendamentos para baixo nada muda. */
.content--scroll #vg-faturamento .vg-card { padding: 13px 16px; }
.content--scroll #vg-faturamento .vg-card-valor { font-size: 19px; }
.content--scroll #vg-cp-consultas .card,
.content--scroll #vg-cp-produtos .card,
.content--scroll #vg-total-geral .card { padding: 8px 14px; }
.content--scroll #vg-cp-consultas .card .card-valor,
.content--scroll #vg-cp-produtos .card .card-valor,
.content--scroll #vg-total-geral .card .card-valor { font-size: 19px; }
/* As três grades da faixa também cedem margem entre si. */
.content--scroll #vg-cp-consultas,
.content--scroll #vg-cp-produtos { margin-bottom: 10px; }
.content--scroll #vg-total-geral { margin-bottom: 10px; }
.content--scroll .vg-subsecao { margin-bottom: 6px; }



/* Subtítulo dentro de uma seção (ex.: Consultas / Produtos), quando o bloco
   tem duas linhas de cards que compartilham os mesmos períodos. */
.vg-subsecao {
  font-family: var(--fonte-titulo); font-size: 13px; font-weight: 700;
  text-transform: uppercase; letter-spacing: .04em;
  color: var(--texto-2); margin: 0 0 8px;
}
.cards-cp + .vg-subsecao { margin-top: 4px; }

.vg-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); gap: 16px; }
.vg-card {
  background: var(--superficie); border: 1px solid var(--borda);
  border-radius: var(--raio); padding: 18px 20px; box-shadow: var(--sombra);
}
.vg-card--largo { margin-bottom: 4px; }

/* Mesmo desenho dos .card de valor: rótulo, valor grande, meta como apoio. */
.vg-card-titulo { font-size: 15px; font-weight: 700; color: var(--texto); margin-bottom: 3px; }
.vg-card-valor {
  font-size: 22px; line-height: 1.15; font-weight: 700; color: var(--texto);
  font-variant-numeric: tabular-nums;
}
.vg-card-meta { font-size: 12px; color: var(--texto-3); margin: 2px 0 10px; font-variant-numeric: tabular-nums; }
.vg-card-meta:last-child { margin-bottom: 0; }

/* Barra de progresso meta × realizado. */
.vg-barra { height: 8px; border-radius: 999px; background: var(--marca-claro); overflow: hidden; }
.vg-barra-preenchida {
  height: 100%; border-radius: 999px;
  background: linear-gradient(90deg, var(--marca-escuro), var(--marca));
  transition: width .35s ease;
}
.vg-barra-preenchida.atingiu { background: linear-gradient(90deg, #2f8455, var(--ok)); }

.vg-card-rodape {
  display: flex; justify-content: space-between; gap: 12px;
  margin-top: 8px; font-size: 12.5px; color: var(--texto-2); font-variant-numeric: tabular-nums;
}
.vg-sem-meta { color: var(--texto-3); font-style: italic; }
.vg-nota { margin-top: 12px; font-size: 12.5px; color: var(--texto-2); line-height: 1.6; }
.vg-alerta { color: var(--dourado); font-weight: 600; }

/* Acabamento dos cards da Visão Geral (out/2026), inspirado no LumeOS:
   rótulo em caixa-alta espaçada, valor forte em Inter, card que sobe no hover
   e destaque com valor na cor da marca. Escopo só nesta tela (.content--vg):
   o Dashboard usa os mesmos .card, mas tem altura medida no pixel.
   Tamanhos de fonte/padding NÃO mudam aqui — a compactação da 1ª tela acima
   continua valendo. */
.content--vg .card,
.content--vg .vg-card {
  border-radius: 16px;
  transition: transform .2s ease, box-shadow .2s ease, border-color .2s ease;
}
.content--vg .card:hover,
.content--vg .vg-card:hover {
  transform: translateY(-2px);
  border-color: rgba(212, 87, 127, .35);
  box-shadow: var(--sombra-forte);
}
.content--vg .card .card-rotulo,
.content--vg .vg-card-titulo {
  font-size: 11px; font-weight: 700; color: var(--texto-2);
  text-transform: uppercase; letter-spacing: .07em;
}
.content--vg .card .card-valor,
.content--vg .vg-card-valor {
  font-family: var(--fonte-titulo); font-weight: 700;
  letter-spacing: -.01em; font-variant-numeric: tabular-nums;
}
/* Destaque: em vez do filete no topo, um véu rosado no canto e o valor na cor
   da marca — chama o olho sem pesar. */
.content--vg .card.destaque {
  border-top: 1px solid var(--borda);
  background: linear-gradient(135deg, var(--superficie) 55%, var(--marca-claro) 140%);
}
.content--vg .card.destaque .card-valor { color: var(--marca-escuro); }
.content--vg .vg-barra { height: 9px; }
.content--vg .vg-card-rodape { font-weight: 600; }

/* Ícone da seção (injetado pelo JS a partir de data-icone no <h2>). */
.content--vg .vg-secao { display: flex; align-items: center; gap: 10px; }
.content--vg .vg-secao-nota { margin-left: -4px; }
.vg-secao-icone {
  flex-shrink: 0; width: 28px; height: 28px; border-radius: 8px;
  display: inline-flex; align-items: center; justify-content: center;
  background: var(--marca-claro); color: var(--marca-escuro);
}
.vg-secao-icone svg { width: 15px; height: 15px; }

/* ============================================================
   Agenda e Pacientes (Fase 3)
   ============================================================ */

/* ---- Navegação por dia (topo da Agenda) ---- */
/* Mesmo visual do bloco .filtros, mas com as setas de dia à esquerda. */
.agenda-nav {
  display: flex; flex-wrap: wrap; gap: 12px; align-items: flex-end;
  background: var(--superficie); border: 1px solid var(--borda);
  border-radius: var(--raio); padding: 12px 16px; margin-bottom: 12px; flex-shrink: 0;
}
.agenda-nav .field { margin-bottom: 0; min-width: 140px; flex: 0 1 auto; }
.agenda-nav .spacer { flex: 1; min-width: 0; }

.btn-dia {
  display: flex; align-items: center; justify-content: center;
  width: 34px; height: 34px; flex-shrink: 0;
  border: 1px solid var(--borda-forte); border-radius: var(--raio-sm);
  background: var(--superficie); color: var(--texto-2); cursor: pointer;
  transition: background .15s, color .15s, border-color .15s;
}
.btn-dia:hover { background: var(--marca-claro); color: var(--marca-escuro); border-color: var(--marca); }
.btn-dia svg { width: 18px; height: 18px; }

/* O dia por extenso, acima da barra: é o título do que a tela mostra.
   Morava dentro de `.agenda-dia`, espremido sob o campo de data numa coluna de
   210px — texto como "Quarta-feira, 23 de setembro · hoje" era cortado com
   reticências justamente na parte que informa ("· hoje"). */
.agenda-dia-titulo {
  font-family: var(--fonte-titulo); font-size: 16px; font-weight: 700;
  color: var(--texto); margin-bottom: 10px;
}
/* Sem o rótulo embaixo, a coluna da data não precisa mais de 210px: o campo
   ocupa a largura natural e sobra espaço para os filtros na mesma linha. */
.agenda-dia { display: flex; flex-direction: column; gap: 2px; min-width: 150px; }
.agenda-dia input[type="date"] { padding: 6px 10px; font-size: 13px; }
/* Largura fixa no botão que alterna dia ↔ todas as datas: o rótulo troca entre
   "Ver tudo" e "Ver dia", e sem isso a barra inteira dança a cada clique. */
#btn-hoje { min-width: 88px; }
/* Modo busca: a data não vale (a busca varre todas as datas). Esmaece para
   sinalizar que está fora de uso — sem esconder, senão o usuário não entende
   por que o seletor sumiu. Clicar nas setas ou em "Hoje" volta ao modo dia. */
.agenda-dia.dia-inativo { opacity: .45; }
/* No modo busca o título vira "Todas as datas" (ver carregar() em agenda.js) —
   já diz por si que não é um dia específico, sem precisar de esmaecimento. */
/* Data ao lado do horário, só no modo busca — sem ela ficam horários soltos
   sem dia. */
.hora-data {
  display: block; font-size: 11px; font-weight: 600;
  color: var(--marca-escuro); line-height: 1.2;
}

/* ---- Resumo por status ---- */
.agenda-resumo { display: flex; flex-wrap: wrap; gap: 8px; margin-bottom: 12px; flex-shrink: 0; }
.agenda-resumo:empty { display: none; }
.resumo-item {
  font-size: 12.5px; padding: 5px 12px; border-radius: var(--raio-sm);
  background: var(--superficie); color: var(--texto-2); border: 1px solid var(--borda);
}
.resumo-item strong { font-weight: 700; color: var(--texto); margin-right: 3px; font-variant-numeric: tabular-nums; }

/* ---- Badges de status da agenda ----
   Mesmo padrão dos badges de categoria em Atendimentos: fundo suave, texto
   na cor correspondente. Sem pílula colorida chamativa. */
.badge-agendado   { background: #eef1f7; color: #5b6b8c; }
.badge-confirmado { background: #e4ecf7; color: var(--cat-recor); }
.badge-compareceu { background: var(--ok-bg); color: var(--ok); }
.badge-cancelado  { background: #ede8ea; color: var(--cat-nao); }
.badge-noshow     { background: var(--erro-bg); color: var(--erro); }

/* Selo de RETORNO (set/2026) — aparece ao lado do nome na agenda e no modal de
   agendamento pós-atendimento.
   Só o retorno é marcado: se toda linha tivesse selo, ele viraria ruído de
   fundo e o olho pararia de notar. Consulta é o estado normal, sem marcação.
   Dourado porque nenhum status usa essa cor — não se confunde com
   agendado/confirmado/compareceu. Menor que os badges de status: é um
   qualificador do nome, não o dado principal da linha. */
.badge-retorno {
  background: var(--aviso-bg); color: #9c7c34;
  font-size: 10.5px; padding: 2px 7px; margin-left: 6px;
  vertical-align: middle;
}

/* Cancelado/no-show continuam visíveis (histórico do dia), mas recuam. */
.linha-inativa td { opacity: .55; }
.linha-inativa:hover td { opacity: .85; }

/* Horário: tabular-nums para os dígitos alinharem coluna a coluna. */
.td-hora { white-space: nowrap; font-variant-numeric: tabular-nums; }
.td-dur  { color: var(--texto-2); font-variant-numeric: tabular-nums; }

.td-obs {
  max-width: 240px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
  color: var(--texto-2);
}

/* ---- Menu de status (Agenda) ----
   Some por padrão; abre ancorado ao botão da linha. Fecha ao clicar fora. */
.menu-status {
  position: fixed; z-index: 60; min-width: 168px;
  background: var(--superficie); border: 1px solid var(--borda);
  border-radius: var(--raio-sm); box-shadow: var(--sombra-forte);
  padding: 5px; display: none;
}
.menu-status.aberto { display: block; }
.menu-status button {
  display: flex; align-items: center; gap: 8px; width: 100%;
  padding: 7px 9px; border: none; background: none; cursor: pointer;
  font: inherit; font-size: 13px; color: var(--texto); text-align: left;
  border-radius: 6px;
}
.menu-status button:hover { background: var(--superficie-2); }
.menu-status button.ativo { color: var(--marca-escuro); font-weight: 600; }
.menu-status button .ponto {
  width: 8px; height: 8px; border-radius: 50%; flex-shrink: 0;
  background: currentColor; opacity: .55;
}
.menu-status .sep { height: 1px; background: var(--borda); margin: 4px 2px; }

/* ---- Link de texto dentro de tabela (nome do paciente, ações da lista) ---- */
.btn-link {
  background: none; border: none; padding: 0; cursor: pointer;
  color: var(--marca-escuro); font: inherit; text-align: left;
  border-bottom: 1px solid transparent;
}
.btn-link:hover { border-bottom-color: var(--marca); }

.link-zap { color: var(--texto); text-decoration: none; border-bottom: 1px dotted var(--borda-forte); }
.link-zap:hover { color: var(--ok); border-bottom-color: var(--ok); }

/* ---- Campo + botão lado a lado (paciente + "novo") ---- */
.campo-com-botao { display: flex; gap: 8px; align-items: stretch; }
.campo-com-botao select { flex: 1; min-width: 0; }
.campo-com-botao .autocomplete { flex: 1; min-width: 0; }
.campo-com-botao .btn { flex-shrink: 0; white-space: nowrap; }

/* ---- Autocomplete (busca por digitação) ----
   Usado no campo Paciente da Agenda. A lista é absoluta sobre o modal; por
   isso o .field que a contém não pode ter overflow escondido. */
.autocomplete { position: relative; }
.autocomplete-lista {
  display: none;
  position: absolute; top: calc(100% + 4px); left: 0; right: 0;
  background: var(--superficie);
  border: 1px solid var(--borda);
  border-radius: 8px;
  box-shadow: var(--sombra-forte);
  max-height: 240px; overflow-y: auto;
  z-index: 30;
}
.autocomplete-lista.aberto { display: block; }
.autocomplete-item { padding: 8px 12px; cursor: pointer; font-size: 13px; }
.autocomplete-item:hover,
.autocomplete-item.ativo { background: var(--superficie-2); }
.autocomplete-item .sub { font-size: 11.5px; color: var(--texto-3); margin-top: 1px; }
.autocomplete-vazio { padding: 10px 12px; font-size: 12.5px; color: var(--texto-3); }

.check-linha { display: flex; align-items: center; gap: 8px; font-size: 12.5px; color: var(--texto-2); cursor: pointer; }
.check-linha input { width: auto; margin: 0; }

/* ---- Aviso de paciente duplicado (paciente-duplicado.js) ----
   Abre POR CIMA do modal de cadastro, que continua aberto atrás para o
   usuário voltar e corrigir: por isso o z-index acima do .modal-fundo (50). */
.modal-sobre { z-index: 55; }
.dup-intro { font-size: 13px; color: var(--texto-2); margin: 0 0 12px; line-height: 1.5; }
.dup-lista { list-style: none; margin: 0; padding: 0; max-height: 46vh; overflow-y: auto; }
.dup-item {
  display: flex; align-items: center; gap: 12px;
  padding: 10px 12px; border: 1px solid var(--borda); border-radius: var(--raio-sm);
}
.dup-item + .dup-item { margin-top: 8px; }
.dup-dados { flex: 1; min-width: 0; }
.dup-nome { font-weight: 600; font-size: 14px; }
.dup-info { font-size: 12.5px; margin-top: 2px; }
.dup-aviso { font-size: 12px; color: var(--texto-2); margin-top: 6px; font-style: italic; }
.dup-item .btn { flex-shrink: 0; }
@media (max-width: 520px) {
  .dup-item { flex-direction: column; align-items: stretch; }
}

/* ---- Histórico do paciente (linha do tempo) ---- */
.modal-largo { max-width: 680px; }

/* ---------- Seletor de dia + horário (seletor-horarios.js, out/2026) ----------
   Estilo "site de viagem" nos modais de retorno/agendar: calendário à esquerda
   (dia lotado = cinza, sem clique) e grade de horários à direita (ocupado =
   riscado, sem clique). Não clicável é <span>, não <button disabled>: some do
   Tab e não parece botão quebrado. */
.seletor-horarios {
  display: grid; grid-template-columns: 250px 1fr; gap: 16px;
  border: 1px solid var(--borda); border-radius: var(--raio-sm);
  padding: 12px; background: var(--superficie);
}
.sh-calendario.sh-desligado { opacity: .45; pointer-events: none; }
.sh-mes {
  display: flex; align-items: center; justify-content: space-between;
  font-weight: 700; font-size: 13.5px; text-transform: capitalize; margin-bottom: 6px;
}
.sh-nav {
  width: 28px; height: 28px; border-radius: 8px; border: 1px solid var(--borda);
  background: var(--superficie); color: var(--texto); font-size: 16px; line-height: 1; cursor: pointer;
}
.sh-nav:hover:not(:disabled) { border-color: var(--marca); color: var(--marca-escuro); }
.sh-nav:disabled { opacity: .35; cursor: default; }
.sh-semana, .sh-dias { display: grid; grid-template-columns: repeat(7, 1fr); gap: 3px; }
.sh-semana span { text-align: center; font-size: 10.5px; font-weight: 700; color: var(--texto-3); padding: 2px 0; }
.sh-dia {
  height: 31px; border-radius: 8px; border: 1px solid transparent; background: none;
  font: inherit; font-size: 12.5px; font-variant-numeric: tabular-nums; color: var(--texto);
  display: flex; align-items: center; justify-content: center; position: relative;
}
button.sh-dia { cursor: pointer; }
button.sh-dia:hover { background: var(--marca-claro); }
.sh-dia.sh-hoje { border-color: var(--borda-forte); font-weight: 700; }
/* Ponto = dia que já tem agenda mas ainda tem horário livre. */
.sh-dia.sh-parcial::after {
  content: ""; position: absolute; bottom: 3px; width: 4px; height: 4px; border-radius: 50%;
  background: var(--dourado);
}
.sh-dia.sh-lotado {
  color: var(--texto-3); background: repeating-linear-gradient(135deg, var(--superficie-2) 0 4px, var(--borda) 4px 5px);
  text-decoration: line-through; cursor: not-allowed;
}
.sh-dia.sh-passado { color: var(--borda-forte); cursor: default; }
.sh-dia.sh-escolhido { background: var(--marca); color: #fff; font-weight: 700; }
.sh-dia.sh-escolhido::after { background: #fff; }
.sh-legenda {
  display: flex; align-items: center; gap: 5px; flex-wrap: wrap;
  margin-top: 8px; font-size: 11px; color: var(--texto-2);
}
.sh-l { width: 10px; height: 10px; border-radius: 3px; display: inline-block; margin-left: 4px; }
.sh-l:first-child { margin-left: 0; }
.sh-l-livre { border: 1px solid var(--borda-forte); }
.sh-l-parcial { background: var(--dourado); border-radius: 50%; width: 6px; height: 6px; }
.sh-l-lotado { background: repeating-linear-gradient(135deg, var(--superficie-2) 0 3px, var(--borda-forte) 3px 4px); }
/* "Não cabe" confundia com ocupado (cliente, 03/10: "8:15 sem agendamento e
   não selecionável"). A legenda só aparece quando há tracejado na grade. */
.sh-l-naocabe { border: 1px dashed var(--borda-forte); }
.sh-legenda-horas { margin-top: 6px; flex-wrap: nowrap; white-space: nowrap; }

.sh-horarios { min-width: 0; }
.sh-aviso { font-size: 12.5px; color: var(--texto-2); padding: 8px 2px; }
.sh-aviso.sh-erro { color: var(--erro); }
.sh-dia-titulo { font-size: 12px; font-weight: 700; color: var(--texto-2); margin-bottom: 6px; }
.sh-grade {
  /* Sem rolagem interna (pedido do cliente): os 60 horários (15 em 15 min)
     cabem em 8 linhas de 8, na mesma altura do calendário ao lado. */
  display: grid; grid-template-columns: repeat(8, minmax(0, 1fr)); gap: 4px;
}
.sh-hora {
  height: 28px; border-radius: 7px; border: 1px solid var(--borda-forte); background: var(--superficie);
  font: inherit; font-size: 11.5px; font-variant-numeric: tabular-nums; color: var(--texto);
  display: flex; align-items: center; justify-content: center;
}
button.sh-hora { cursor: pointer; }
button.sh-hora:hover { border-color: var(--marca); color: var(--marca-escuro); background: var(--marca-claro); }
.sh-hora.sh-escolhido { background: var(--marca); border-color: var(--marca); color: #fff; font-weight: 700; }
/* Ocupado: riscado (tem alguém). Não cabe / passou: só apagado. */
.sh-hora.sh-ocupado {
  color: var(--texto-3); text-decoration: line-through; cursor: not-allowed;
  background: repeating-linear-gradient(135deg, var(--superficie-2) 0 4px, var(--borda) 4px 5px);
  border-color: var(--borda);
}
.sh-hora.sh-nao-cabe, .sh-hora.sh-passou {
  color: var(--texto-3); border-style: dashed; border-color: var(--borda); cursor: not-allowed; opacity: .7;
}
/* Sem barra de rolagem DENTRO do modal (pedido do cliente). Cabe inteiro até
   720px de altura; quando não cabe (notebook baixo, celular), quem rola é o
   fundo escuro — o modal fica inteiro, sem barra própria. `margin: auto` num
   filho de flex centraliza quando cabe e encosta no topo quando transborda
   (com align-items: center o topo ficaria cortado e inalcançável). */
/* Faixa de aviso (tela Comercial: conversa não lançada). Compacta e flex-shrink
   0: a 1ª tela do Comercial é medida, e o aviso não pode espremer os gráficos
   mais que uma linha. Só aparece quando há o que avisar. */
.aviso-faixa {
  flex-shrink: 0; display: flex; align-items: center; gap: 10px;
  margin-bottom: 12px; padding: 8px 14px; border-radius: var(--raio-sm);
  background: var(--aviso-bg); border: 1px solid #efd6a6; color: #7a5410;
  font-size: 12.5px; line-height: 1.4;
}
.aviso-faixa[hidden] { display: none; }
.aviso-icone {
  flex-shrink: 0; width: 20px; height: 20px; border-radius: 50%;
  background: var(--aviso); color: #fff; font-weight: 800; font-size: 12px;
  display: inline-flex; align-items: center; justify-content: center;
}

/* Linha de 4 campos curtos dentro do .modal-grid (modal da Agenda). */
.modal-linha-4 { display: grid; grid-template-columns: 1.4fr 1fr 1fr 1fr; gap: 0 12px; }
@media (max-width: 600px) { .modal-linha-4 { grid-template-columns: 1fr 1fr; } }
.modal-fundo:has(.seletor-horarios) { overflow-y: auto; }
.modal-fundo:has(.seletor-horarios) .modal { max-height: none; overflow: visible; margin: auto; }
/* Notebook (até 800px de altura): aperta calendário, grade e respiros para o
   modal caber inteiro — nem barra no modal, nem fundo rolando. Medido em
   1366×768, 1280×720 e 1366×680. */
@media (max-height: 800px) {
  .modal:has(.seletor-horarios) .modal-head { padding-top: 12px; padding-bottom: 12px; }
  .modal:has(.seletor-horarios) .modal-body { padding-top: 10px; padding-bottom: 8px; }
  .modal:has(.seletor-horarios) .modal-foot { padding-top: 10px; padding-bottom: 10px; }
  .modal:has(.seletor-horarios) .modal-texto { margin-bottom: 6px; }
  .modal:has(.seletor-horarios) .field { margin-bottom: 8px; }
  .seletor-horarios { padding: 8px 10px; }
  .sh-mes { margin-bottom: 2px; }
  .sh-dia { height: 25px; }
  .sh-dia.sh-parcial::after { bottom: 1px; }   /* não encostar no número */
  .sh-hora { height: 24px; }
  .sh-legenda { margin-top: 4px; }
}
@media (max-width: 600px) {
  .seletor-horarios { grid-template-columns: 1fr; }
  .sh-grade { grid-template-columns: repeat(5, minmax(0, 1fr)); }
  .sh-hora { height: 32px; font-size: 12.5px; }
}

.hist-form { display: flex; gap: 8px; margin-bottom: 10px; }
.hist-form input { flex: 1; min-width: 0; }
.hist-form .btn { flex-shrink: 0; }

.linha-tempo { list-style: none; margin: 0; padding: 0; max-height: 46vh; overflow-y: auto; }
.linha-tempo .vazio { text-align: center; color: var(--texto-3); padding: 28px; font-size: 13px; }
.lt-item {
  border-left: 2px solid var(--borda-forte);
  padding: 8px 0 10px 14px; margin-left: 4px; position: relative;
}
.lt-item::before {
  content: ""; position: absolute; left: -5px; top: 13px;
  width: 8px; height: 8px; border-radius: 50%;
  background: var(--borda-forte); border: 2px solid var(--superficie);
}
.lt-item.lt-status::before      { background: var(--marca); }
.lt-item.lt-agendamento::before { background: var(--cat-recor); }
.lt-topo { display: flex; align-items: center; gap: 8px; margin-bottom: 3px; }
.lt-topo .muted { font-size: 11.5px; }
.lt-desc { font-size: 13px; color: var(--texto); line-height: 1.5; }

/* ---- Lista simples (profissionais) ---- */
.lista-simples { list-style: none; margin: 0; padding: 0; max-height: 46vh; overflow-y: auto; }
.lista-simples li {
  display: flex; align-items: center; justify-content: space-between; gap: 12px;
  padding: 6px 2px; border-bottom: 1px solid var(--borda); font-size: 13.5px;
}
/* Nome longo não empurra os botões para fora da linha. */
.lista-simples li > span:first-child { min-width: 0; overflow-wrap: anywhere; }
.lista-simples .col-acoes { flex-shrink: 0; }
.lista-simples li:last-child { border-bottom: none; }
/* Inativo: só o NOME esmaece. Os controles seguem legíveis — é por eles que
   se reativa, e um toggle apagado não convidaria ao clique. */
.lista-simples li.inativo > span:first-child { color: var(--texto-3); }
.lista-simples .vazio { justify-content: center; color: var(--texto-3); padding: 24px; font-size: 13px; }

/* ============================================================
   Responsividade
   ============================================================ */

/* ---- Tablet (≤1024px): sidebar mais estreita, paddings menores ---- */
@media (max-width: 1024px) {
  :root { --sidebar-w: 224px; }
  .topbar { padding: 14px 20px; }
  .content { padding: 18px 20px; }
  /* Sidebar mais estreita: recuo e fonte encolhem um degrau para "Consultas e
     Produtos" caber numa linha (com 14,5px quebrava em duas). A altura dos
     itens é a mesma do desktop. */
  .sidebar-nav a { padding-left: 10px; padding-right: 10px; font-size: 13.5px; gap: 10px; white-space: nowrap; }
  .sidebar-nav a svg { width: 18px; height: 18px; }
}

/* ---- Mobile (≤768px): sidebar vira drawer deslizante ---- */
@media (max-width: 768px) {
  .btn-menu { display: inline-flex; }

  /* Sidebar sai do fluxo e desliza por cima do conteúdo */
  .sidebar {
    position: fixed; top: 0; left: 0; bottom: 0; z-index: 45;
    width: 264px; max-width: 84vw;
    transform: translateX(-100%);
    transition: transform .25s ease;
    box-shadow: var(--sombra-forte);
  }
  body.menu-aberto .sidebar { transform: translateX(0); }
  body.menu-aberto .sidebar-overlay { display: block; opacity: 1; }

  /* No drawer sobra altura e quem toca é o dedo: itens voltam a ser maiores
     que no desktop, onde a restrição é caber tudo sem rolar. */
  .sidebar-nav { justify-content: flex-start; padding: 14px 12px; gap: 2px; }
  .sidebar-nav a { padding: 11px 14px; font-size: 14px; }
  .sidebar-nav a svg { width: 18px; height: 18px; }
  .nav-grupo + .nav-grupo { margin-top: 14px; }

  .main { width: 100%; }
  .topbar { padding: 12px 16px; }
  .topbar h1 { font-size: 21px; gap: 10px; }
  .content { padding: 14px 16px; }

  /* Filtros empilham; ações ocupam a linha inteira */
  .filtros { padding: 14px; gap: 10px; }
  .filtros .field { min-width: 0; flex: 1 1 100%; }
  .filtros .filtros-acoes { width: 100%; }
  .filtros .filtros-acoes .btn { flex: 1; }

  /* Agenda: navegação de dia fica na 1ª linha (setas + data + Hoje) e os
     filtros empilham abaixo — no celular a recepção anda entre dias mais
     do que filtra. */
  .agenda-nav { padding: 12px; gap: 10px; }
  .agenda-nav .spacer { display: none; }
  .agenda-nav .agenda-dia { flex: 1; min-width: 0; }
  .agenda-nav .field { flex: 1 1 100%; min-width: 0; }
  .agenda-nav .filtros-acoes { width: 100%; }
  .agenda-nav .filtros-acoes .btn { flex: 1; }
  .td-obs { max-width: 150px; }

  .filtros-dashboard { flex-direction: column; align-items: stretch; }
  .filtros-periodo, .filtros-atalhos { width: 100%; }
  .filtros-periodo .field { flex: 1 1 100%; min-width: 0; }
  .filtros-atalhos .btn { flex: 1; }

  /* Tablet: cards em duas colunas e filtros dois por linha — uma coluna só
     deixava a tela comprida demais (10 cards empilhados no Dashboard).
     Gráficos seguem em uma coluna. O celular (≤480px) volta a uma coluna. */
  .cards, .meta-cards, .vg-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .graficos { grid-template-columns: 1fr; }
  .filtros .field, .filtros-periodo .field { flex: 1 1 calc(50% - 10px); }
  /* O campo de busca por nome tem `style="flex:1.4"` (ou 2) no HTML para ser
     mais largo no desktop; inline vence o CSS, e aqui ele espremia e estourava
     a tela em 17px. No tablet/celular ele ganha a linha inteira. */
  .filtros .field[style^="flex:1"], .filtros .field[style^="flex:2"] { flex: 1 1 100% !important; }

  /* Dashboard no mobile: volta a rolar (não cabe tudo em 1 tela pequena).
     Altura fixa por card (não min-height) para não realimentar o resize. */
  .content--dashboard { overflow-y: auto; }
  .content--dashboard .graficos { grid-template-rows: none; flex: none; height: auto; }
  .content--dashboard .grafico-card { height: 280px; }
  /* No mobile o bloco não trava em 1 tela: tudo empilha e rola. */
  .content--redes .tela-cheia { height: auto; display: block; }
  .content--redes .tela-cheia .graficos { flex: none; }

  /* Modal quase full-width, grid em coluna única */
  .modal { max-width: 100%; max-height: 94vh; }
  .modal-grid { grid-template-columns: 1fr; }
  .modal-head { padding: 16px 18px; }
  .modal-body { padding: 18px; }
  .modal-foot { padding: 14px 18px; }
  .modal-foot .btn { flex: 1; }

  /* Layout "preenche-tela" destravado no mobile: a página rola normalmente,
     senão a tabela fica com altura mínima com os filtros empilhados. */
  .layout { height: auto; min-height: 100vh; overflow: visible; }
  .main { overflow: visible; }
  .content { overflow: visible; }
  .tabela-corp { flex: none; }
  .panel-scroll { max-height: 70vh; }

  /* Tabelas: rolagem horizontal para não espremer colunas */
  .panel-scroll { overflow: auto; }
  .panel-scroll table { min-width: 640px; }
  .tabela-corp-head { padding: 14px 16px; }

  /* Topbar: título + ação podem quebrar sem estourar */
  .topbar-acoes .btn { padding: 8px 12px; font-size: 13px; }
}

/* ---- Celular pequeno (≤480px): ajustes finos ---- */
@media (max-width: 480px) {
  body { font-size: 13.5px; }
  .topbar { flex-wrap: wrap; gap: 10px; }
  .topbar-acoes { width: 100%; }
  .topbar-acoes .btn { width: 100%; }
  .content { padding: 12px; }
  .card .card-valor { font-size: 23px; }
  .login-card { padding: 30px 22px 26px; }
  .cards, .meta-cards, .vg-grid { grid-template-columns: 1fr; }
  .filtros .field, .filtros-periodo .field { flex: 1 1 100%; }
}
