/* ╔══════════════════════════════════════════════════════════════════╗
   ║  Medic+ Clinic — Design System                                    ║
   ║  Estrutura e componentes PORTADOS do Lytte (mesmo layout, mesmos   ║
   ║  nomes de classe) com a MARCA da Medic+: azul #13173D e vermelho   ║
   ║  vitalidade #770600, tipografia Plus Jakarta Sans / Nunito Sans.   ║
   ║  Manter os nomes de classe iguais aos do Lytte e proposital: o     ║
   ║  que se aprende num sistema vale no outro, e correcao de layout    ║
   ║  feita la se aplica aqui sem traducao.                             ║
   ╚══════════════════════════════════════════════════════════════════╝ */

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

/* ── Tokens ─────────────────────────────────────────────────────────── */
/* Rede de seguranca: a paleta clara tambem no :root.
   Os tokens sao declarados em .lt-light/.lt-dark, que ficam em #app-root — e
   qualquer elemento colocado FORA desse elemento (um modal, um toast, um
   portal) herdaria `var(--surface)` sem valor e renderizaria transparente.
   Declarar aqui nao muda nada de quem esta dentro (a classe vence por
   especificidade); so garante que nada fique invisivel por estar fora. */
:root {
  --bg:#EEF1F8; --surface:#ffffff; --surface2:#F6F8FC; --raised:#ffffff;
  --border:#dde3f0; --border2:#e9edf6;
  --text:#13173D; --text2:#5A6196; --text3:#949cbb;
  --brand:#13173D; --brand2:#2A3163; --brandSoft:#EEF1F8; --brandLine:#d5dcee;
  --accent:#A11810; --accentSoft:rgba(161,24,16,.10);
  --shadow:0 1px 2px rgba(19,23,61,.06),0 1px 3px rgba(19,23,61,.04);
  --shadowLg:0 10px 30px rgba(19,23,61,.13);
  --ok:#15935a; --okBg:rgba(21,147,90,.12);
  --warn:#c07807; --warnBg:rgba(192,120,7,.13);
  --info:#2563cf; --infoBg:rgba(37,99,207,.12);
  --bad:#A11810; --badBg:rgba(161,24,16,.12);
}

.lt-light {
  /* Paleta do manual da marca Medic+ (v2.0): Azul Gelo #EEF1F8,
     Branco Clinico #F6F8FC, Azul Medic+ #13173D, Azul Medio #2A3163,
     Azul Suave #5A6196, Vermelho Vitalidade #770600, Vermelho Ativo #A11810. */
  --bg:#EEF1F8; --surface:#ffffff; --surface2:#F6F8FC; --raised:#ffffff;
  --border:#dde3f0; --border2:#e9edf6;
  --text:#13173D; --text2:#5A6196; --text3:#949cbb;
  --brand:#13173D; --brand2:#2A3163; --brandSoft:#EEF1F8; --brandLine:#d5dcee;
  /* Vermelho da marca: acao de destaque e alerta. NAO e o brand — em clinica,
     vermelho em botao comum vira ruido e some quando importa. */
  --accent:#A11810; --accentSoft:rgba(161,24,16,.10);
  --shadow:0 1px 2px rgba(19,23,61,.06),0 1px 3px rgba(19,23,61,.04);
  --shadowLg:0 10px 30px rgba(19,23,61,.13);
  --ok:#15935a; --okBg:rgba(21,147,90,.12);
  --warn:#c07807; --warnBg:rgba(192,120,7,.13);
  --info:#2563cf; --infoBg:rgba(37,99,207,.12);
  --bad:#A11810; --badBg:rgba(161,24,16,.12);
}
.lt-dark {
  /* Escuro ancorado no Azul Profundo #0B0E26 do manual. */
  --bg:#0B0E26; --surface:#13173D; --surface2:#1a1f4a; --raised:#1e2352;
  --border:#2f3663; --border2:#262c52;
  --text:#EEF1F8; --text2:#a8b0cf; --text3:#727aa0;
  --brand:#7d8ac4; --brand2:#9aa5d8; --brandSoft:#1a1f4a; --brandLine:#333a6b;
  --accent:#e0685c; --accentSoft:rgba(224,104,92,.14);
  --shadow:0 1px 2px rgba(0,0,0,.4); --shadowLg:0 16px 40px rgba(0,0,0,.5);
  --ok:#37c98a; --okBg:rgba(55,201,138,.14);
  --warn:#e1a23f; --warnBg:rgba(225,162,63,.15);
  --info:#5f9bf0; --infoBg:rgba(95,155,240,.15);
  --bad:#e0685c; --badBg:rgba(224,104,92,.15);
}

html, body { height: 100%; }
body {
  font-family: 'Nunito Sans', system-ui, -apple-system, sans-serif;
  -webkit-font-smoothing: antialiased;
}
.disp { font-family: 'Plus Jakarta Sans', 'Nunito Sans', sans-serif; }

@keyframes ltFade { from { opacity:0; transform:translateY(6px); } to { opacity:1; transform:none; } }
@keyframes ltScale { from { opacity:0; transform:translateY(8px) scale(.98); } to { opacity:1; transform:none; } }
@keyframes ltOverlay { from { opacity:0; } to { opacity:1; } }

.lt-scroll::-webkit-scrollbar { width:9px; height:9px; }
.lt-scroll::-webkit-scrollbar-thumb { background:var(--border); border-radius:8px; border:2px solid transparent; background-clip:padding-box; }
.lt-scroll::-webkit-scrollbar-track { background:transparent; }

/* ── App shell ──────────────────────────────────────────────────────── */
.lt-app {
  display:flex; min-height:100vh; width:100%;
  background:var(--bg); color:var(--text);
}

/* ── Sidebar ────────────────────────────────────────────────────────── */
.sidebar {
  width:252px; flex:none; display:flex; flex-direction:column;
  background:linear-gradient(185deg,#2A3163 0%,#13173D 58%,#0B0E26 100%);
  color:#fff; position:sticky; top:0; height:100vh;
  /* O menu tem mais itens do que cabe numa tela de notebook (Operação,
     Financeiro e Administração): ele rola sozinho dentro da faixa escura.
     Sem isto, o que passava de 100vh vazava para baixo do fundo, e ao rolar
     a página sobrava uma faixa branca com os últimos itens inalcançáveis. */
  overflow-y:auto; overscroll-behavior:contain;
  scrollbar-width:thin; scrollbar-color:rgba(255,255,255,.22) transparent;
}
.sidebar::-webkit-scrollbar { width:8px; }
.sidebar::-webkit-scrollbar-thumb { background:rgba(255,255,255,.22); border-radius:8px; border:2px solid transparent; background-clip:padding-box; }
.sidebar::-webkit-scrollbar-thumb:hover { background:rgba(255,255,255,.35); border:2px solid transparent; background-clip:padding-box; }
.sidebar::-webkit-scrollbar-track { background:transparent; }
.sidebar-brand { display:flex; align-items:center; gap:10px; padding:18px 18px 16px; }
.sidebar-word { font-family:'Plus Jakarta Sans',sans-serif; font-weight:800; font-size:22px; letter-spacing:-.02em; }
.sidebar-badge {
  margin-left:auto; font-size:9px; font-weight:700; letter-spacing:.08em;
  color:rgba(255,255,255,.5); border:1px solid rgba(255,255,255,.18);
  padding:2px 6px; border-radius:4px;
}
.sidebar-section {
  padding:4px 12px 6px; font-size:10.5px; font-weight:700; letter-spacing:.1em;
  color:rgba(255,255,255,.4); text-transform:uppercase;
}
.sidebar-nav { display:flex; flex-direction:column; gap:2px; padding:0 12px; }
.nav-btn {
  display:flex; align-items:center; gap:11px; padding:9px 11px;
  border:0; border-radius:7px; cursor:pointer; font-family:inherit;
  font-size:13.5px; font-weight:600; text-align:left; width:100%;
  background:transparent; color:rgba(255,255,255,.72); transition:background .15s,color .15s;
}
.nav-btn:hover { background:rgba(255,255,255,.08); color:#fff; }
.nav-btn.active { background:rgba(255,255,255,.13); color:#fff; }
.nav-btn svg { flex:none; }
.nav-badge {
  margin-left:auto; font-size:10.5px; font-weight:700; background:var(--brand2);
  color:#fff; padding:1px 7px; border-radius:20px;
}
.sidebar-foot { margin-top:auto; padding:14px; }
.sidebar-card {
  background:rgba(255,255,255,.07); border:1px solid rgba(255,255,255,.12);
  border-radius:10px; padding:13px;
}
.sidebar-card-title { font-size:12px; font-weight:700; margin-bottom:4px; }
.sidebar-card-sub { font-size:11px; color:rgba(255,255,255,.6); line-height:1.45; }

/* ── Main / Topbar ──────────────────────────────────────────────────── */
.main { flex:1; min-width:0; display:flex; flex-direction:column; }
.topbar {
  position:sticky; top:0; z-index:30; display:flex; align-items:center; gap:16px;
  padding:0 22px; height:60px; background:var(--surface); border-bottom:1px solid var(--border);
}
.topbar-title { min-width:0; flex-shrink:0; }
.topbar-h { font-family:'Plus Jakarta Sans',sans-serif; font-weight:700; font-size:18px; letter-spacing:-.01em; line-height:1.1; white-space:nowrap; }
.topbar-sub { font-size:11.5px; color:var(--text3); font-weight:500; white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }

.topbar-operador {
  margin-left:auto; display:flex; align-items:center; gap:9px;
  background:var(--surface2); border:1px solid var(--border); border-radius:8px;
  padding:8px 12px; width:300px; max-width:32vw; color:var(--text3);
}
.topbar-operador input {
  border:0; outline:0; background:transparent; font-family:inherit; font-size:13px;
  color:var(--text); width:100%;
}
.icon-btn {
  flex:none; display:grid; place-items:center; width:38px; height:38px;
  border:1px solid var(--border); background:var(--surface2); border-radius:8px;
  cursor:pointer; color:var(--text2); transition:border-color .15s,color .15s;
}
.icon-btn:hover { border-color:var(--brand2); color:var(--brand); }

/* ── Scroll area / views ────────────────────────────────────────────── */
.scroll { flex:1; overflow:auto; padding:22px; }
.view { display:none; max-width:1360px; margin:0 auto; }
.view.active { display:block; animation:ltFade .3s ease; }
.view-actions { display:flex; justify-content:flex-end; margin-bottom:14px; }

/* ── Cards ──────────────────────────────────────────────────────────── */
.card {
  background:var(--surface); border:1px solid var(--border); border-radius:10px;
  padding:17px; box-shadow:var(--shadow); margin-bottom:14px;
}
.card-title { font-family:'Plus Jakarta Sans',sans-serif; font-size:15px; font-weight:700; margin-bottom:14px; }
.ok-title { color:var(--ok); }

/* ── Stat cards ─────────────────────────────────────────────────────── */
.stat-grid { display:grid; grid-template-columns:repeat(4,1fr); gap:14px; margin-bottom:16px; }
.stat-card {
  background:var(--surface); border:1px solid var(--border); border-radius:10px;
  padding:15px; box-shadow:var(--shadow);
}
.stat-head { display:flex; align-items:center; justify-content:space-between; margin-bottom:11px; }
.stat-label { font-size:12px; font-weight:600; color:var(--text2); }
.stat-ic { display:grid; place-items:center; width:30px; height:30px; border-radius:8px; background:var(--brandSoft); color:var(--brand); }
.stat-num { font-family:'Plus Jakarta Sans',sans-serif; font-size:27px; font-weight:700; letter-spacing:-.02em; }
.stat-foot { font-size:11.5px; font-weight:600; margin-top:3px; color:var(--text3); }

/* ── Buttons ────────────────────────────────────────────────────────── */
.btn-primary, .btn-outline, .btn-ghost {
  display:inline-flex; align-items:center; justify-content:center; gap:7px;
  font-family:inherit; font-weight:700; cursor:pointer; border-radius:8px;
  padding:9px 16px; font-size:13px; border:1px solid transparent; transition:filter .15s,background .15s,border-color .15s;
}
.btn-primary { color:#fff; background:linear-gradient(120deg,#13173D,#2A3163); box-shadow:0 3px 10px rgba(19,23,61,.28); }
.btn-primary:hover { filter:brightness(1.06); }
.btn-outline { background:var(--surface); border-color:var(--border); color:var(--text2); }
.btn-outline:hover { border-color:var(--brand2); color:var(--brand); }
.btn-ghost { background:transparent; color:var(--brand); }
.btn-ghost:hover { background:var(--brandSoft); }
.btn-sm { padding:7px 12px; font-size:12px; }
button:disabled { opacity:.5; cursor:not-allowed; filter:none; }

/* ── Pills / badges ─────────────────────────────────────────────────── */
.badge { display:inline-flex; align-items:center; gap:6px; font-size:11px; font-weight:700; padding:3px 9px; border-radius:20px; white-space:nowrap; }
.badge-dot { width:6px; height:6px; border-radius:50%; flex:none; }

/* Chip de situação. Existe como primitivo (e não solto na agenda) porque a
   recepção, os repasses e os relatórios mostram os MESMOS estados: uma paleta
   por tela faria "atendido" ser um verde aqui e outro ali. */
.chip { display:inline-flex; align-items:center; gap:5px; font-size:10.5px; font-weight:700;
        padding:2px 8px; border-radius:20px; white-space:nowrap; border:1px solid transparent; }
.chip-ok   { background:var(--okBg);   color:var(--ok);   border-color:color-mix(in srgb, var(--ok) 26%, transparent); }
.chip-warn { background:var(--warnBg); color:var(--warn); border-color:color-mix(in srgb, var(--warn) 26%, transparent); }
.chip-info { background:var(--infoBg); color:var(--info); border-color:color-mix(in srgb, var(--info) 26%, transparent); }
.chip-bad  { background:var(--badBg);  color:var(--bad);  border-color:color-mix(in srgb, var(--bad) 26%, transparent); }
.chip-mut  { background:var(--surface2); color:var(--text3); border-color:var(--border); }

/* ── Acessibilidade: foco visível por teclado ───────────────────────── */
:focus-visible { outline:2px solid var(--brand2); outline-offset:2px; border-radius:6px; }
.nav-btn:focus-visible { outline-offset:-2px; }

/* ── Estado vazio com chamada à ação ────────────────────────────────── */
.empty-state { text-align:center; padding:40px 20px; }
.empty-state .empty-ic {
  width:46px; height:46px; margin:0 auto 12px; display:grid; place-items:center;
  border-radius:14px; background:var(--brandSoft); color:var(--brand);
}
.empty-state .empty-title { font-weight:700; font-size:15px; margin-bottom:4px; }
.empty-state .empty-sub { color:var(--text3); font-size:12.5px; margin-bottom:14px; }

/* ── Tables (grid rows) ─────────────────────────────────────────────── */
.tbl { background:var(--surface); border:1px solid var(--border); border-radius:10px; box-shadow:var(--shadow); overflow:hidden; }
.tbl-head, .tbl-row { display:grid; gap:12px; align-items:center; padding:11px 16px; }
.tbl-head {
  background:var(--surface2); border-bottom:1px solid var(--border);
  font-size:11px; font-weight:700; letter-spacing:.03em; text-transform:uppercase; color:var(--text3);
}
.tbl-row { border-bottom:1px solid var(--border2); font-size:12.5px; }
.tbl-row:last-child { border-bottom:0; }
.tbl-row:hover { background:var(--surface2); }
/* Folha aguardando assinatura há 48h+ — o operador deve contatar o médico */
.tbl-row.tbl-atraso { background:var(--warnBg); box-shadow:inset 3px 0 0 var(--warn); }
.tbl-row.tbl-atraso:hover { background:var(--warnBg); filter:brightness(.97); }
.cell-atraso { color:var(--warn); font-weight:700; white-space:nowrap; }
.cell-strong { font-weight:600; color:var(--text); }
.cell-mut { color:var(--text3); }

/* ── Médicos: alternador de visão (Cards/Lista) + tabela ────────────── */
.seg { display:inline-flex; flex:none; border:1px solid var(--border); border-radius:9px; overflow:hidden; }
.seg-btn {
  padding:8px 12px; font-size:12.5px; font-weight:600; white-space:nowrap; cursor:pointer;
  background:var(--surface); color:var(--text3); border:0; transition:background .15s,color .15s;
}
.seg-btn + .seg-btn { border-left:1px solid var(--border); }
.seg-btn:hover { color:var(--brand); }
.seg-btn.active { background:var(--brand); color:#fff; }
.med-tbl { background:var(--surface); border:1px solid var(--border); border-radius:10px; box-shadow:var(--shadow); overflow:hidden; }
.med-tbl .btn-sm { padding:5px 10px; font-size:11.5px; }

/* ── Painel — filtro de status em chips toggláveis ───────────────────── */
.st-chips { display:flex; flex-wrap:wrap; gap:8px; }
.st-chip {
  display:inline-flex; align-items:center; gap:7px; cursor:pointer; white-space:nowrap;
  font-size:12px; font-weight:600; padding:6px 12px; border-radius:20px;
  border:1px solid var(--border); background:var(--surface); color:var(--text3);
  transition:background .15s, color .15s, border-color .15s, opacity .15s;
}
.st-chip:hover { border-color:var(--brand2); }
.st-chip:not(.on) { opacity:.5; }
.st-chip:not(.on):hover { opacity:.85; }
.st-dot { width:8px; height:8px; border-radius:50%; flex:none; }

/* ── Doctor cards ───────────────────────────────────────────────────── */
.doc-grid { display:grid; grid-template-columns:repeat(3,1fr); gap:14px; }
.doc-card {
  background:var(--surface); border:1px solid var(--border); border-radius:10px;
  padding:16px; box-shadow:var(--shadow); transition:border-color .15s,box-shadow .15s;
}
.doc-card:hover { border-color:var(--brand2); box-shadow:var(--shadowLg); }
.doc-top { display:flex; align-items:center; gap:12px; margin-bottom:13px; }
.avatar {
  flex:none; display:grid; place-items:center; border-radius:11px;
  background:linear-gradient(135deg,#13173D,#2A3163); color:#fff; font-weight:700;
}
.avatar.av-46 { width:46px; height:46px; font-size:16px; }
.avatar.av-34 { width:34px; height:34px; font-size:13px; border-radius:9px; }
.doc-name { font-size:14px; font-weight:700; white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
.doc-crm { font-size:12px; color:var(--brand); font-weight:600; }
.doc-info { display:flex; flex-direction:column; gap:7px; font-size:12px; color:var(--text2); padding-top:13px; border-top:1px solid var(--border2); }
.doc-info .row { display:flex; align-items:center; gap:8px; }
.doc-info svg { flex:none; }
.doc-actions { display:flex; gap:8px; margin-top:14px; }

/* ── Alerts ─────────────────────────────────────────────────────────── */
.alert { padding:10px 13px; border-radius:8px; margin-bottom:10px; font-size:12.5px; line-height:1.5; border:1px solid transparent; }
.alert-info { background:var(--infoBg); color:var(--info); border-color:color-mix(in srgb,var(--info) 25%,transparent); }
.alert-warn { background:var(--warnBg); color:var(--warn); }
.alert-bad  { background:var(--badBg);  color:var(--bad); }
.alert-ok   { background:var(--okBg);   color:var(--ok); }

/* ── Portões ────────────────────────────────────────────────────────── */
.portao-box { background:var(--brandSoft); border:1px solid var(--brandLine); border-radius:10px; padding:15px 17px; margin-top:18px; }
.portao-ok { background:var(--okBg); border-color:color-mix(in srgb,var(--ok) 30%,transparent); }
.portao-head { font-size:13.5px; font-weight:700; margin-bottom:6px; display:flex; align-items:center; gap:8px; }
.portao-tag { font-size:11px; font-weight:700; background:var(--brand); color:#fff; padding:2px 8px; border-radius:6px; }
.portao-tag.tag-ok { background:var(--ok); }
.portao-box p { font-size:12.5px; color:var(--text2); margin-bottom:11px; line-height:1.5; }

/* ── Upload dropzone ────────────────────────────────────────────────── */
.upload-area {
  border:2px dashed var(--border); border-radius:10px; padding:30px; text-align:center;
  cursor:pointer; color:var(--text3); transition:border-color .2s,background .2s; margin-bottom:14px;
  display:flex; flex-direction:column; align-items:center; gap:12px;
}
.upload-area:hover, .upload-area.drag-over { border-color:var(--brand2); background:var(--brandSoft); color:var(--brand); }

/* ── Competência cards ──────────────────────────────────────────────── */
.comp { margin-bottom:14px; }
.comp-head {
  display:flex; align-items:center; gap:12px; padding:13px 16px; cursor:pointer; user-select:none;
  background:linear-gradient(120deg,#13173D,#2A3163); color:#fff; border-radius:10px 10px 0 0;
}
.comp-head.collapsed { border-radius:10px; }
.comp-title { font-family:'Plus Jakarta Sans',sans-serif; font-size:15px; font-weight:700; flex:1; }
.comp-mini { display:flex; gap:14px; }
.comp-mini .m { text-align:center; }
.comp-mini .m b { display:block; font-size:15px; font-weight:800; }
.comp-mini .m span { font-size:9px; opacity:.8; text-transform:uppercase; letter-spacing:.04em; }
/* Contador "+48h" no cabeçalho roxo da competência */
.comp-mini .m-atraso { background:rgba(255,255,255,.16); border:1px solid rgba(255,255,255,.4); border-radius:8px; padding:2px 8px; }
.comp-mini .m-atraso span { opacity:1; }
.comp-body { background:var(--surface); border:1px solid var(--border); border-top:0; border-radius:0 0 10px 10px; padding:16px; }

.mini-stat-grid { display:grid; grid-template-columns:repeat(auto-fit,minmax(90px,1fr)); gap:10px; margin-bottom:16px; }
.mini-stat { text-align:center; padding:11px 8px; background:var(--surface2); border:1px solid var(--border); border-radius:9px; }
.mini-stat b { display:block; font-family:'Plus Jakarta Sans',sans-serif; font-size:22px; font-weight:700; }
.mini-stat span { font-size:10px; text-transform:uppercase; letter-spacing:.04em; color:var(--text3); }
/* Sub-legenda do card: explicita a ETAPA (os contadores são mutuamente exclusivos) */
.mini-stat small { display:block; font-size:9.5px; color:var(--text3); opacity:.85; margin-top:1px; }
.section-label { font-size:11px; font-weight:700; text-transform:uppercase; letter-spacing:.05em; color:var(--text3); margin-bottom:8px; }

/* ── Revisão do casamento de médicos (carga de plantões) ───────────────── */
.match-card { background:var(--surface2); border:1px solid var(--border); border-radius:10px; padding:12px 14px; margin-bottom:10px; }
.match-head { display:flex; justify-content:space-between; gap:8px; font-size:12.5px; margin-bottom:8px; flex-wrap:wrap; }
.match-opt { display:flex; align-items:flex-start; gap:8px; font-size:12.5px; padding:5px 0; cursor:pointer; color:var(--text2); }
.match-opt input { margin-top:2px; flex:none; }

/* ── Modal ──────────────────────────────────────────────────────────── */
/* Fundo mais forte e desfoque: a agenda e uma grade densa e colorida, e um
   veu de 45% deixava as linhas legiveis ATRAVES da caixa. O desfoque resolve
   o que a opacidade sozinha nao resolve — e quem nao suporta backdrop-filter
   ainda fica com o veu mais escuro. */
.modal { position:fixed; inset:0; background:rgba(11,14,38,.62); display:flex;
         align-items:center; justify-content:center; z-index:200;
         animation:ltOverlay .2s ease; backdrop-filter:blur(3px); }
.modal.hidden { display:none; }
/* `background` com cor literal de reserva antes da variavel: se o token nao
   resolver, a caixa ainda tem fundo — nunca transparente sobre a tela. */
.modal-box { background:#ffffff; background:var(--surface, #ffffff);
             color:var(--text, #13173D);
             border:1px solid var(--border, #dde3f0); border-radius:12px;
             padding:22px 24px; width:480px; max-width:94vw; max-height:92vh;
             overflow-y:auto; position:relative; animation:ltScale .22s ease;
             box-shadow:0 24px 60px rgba(11,14,38,.35), 0 2px 8px rgba(11,14,38,.18); }
.lt-dark .modal-box { box-shadow:0 24px 60px rgba(0,0,0,.6), 0 0 0 1px var(--border); }
/* O X ficava sem area de clique e quase invisivel sobre o conteudo; agora tem
   alvo de 30px e fundo proprio. */
.modal-close { position:absolute; top:10px; right:12px; width:30px; height:30px;
               display:grid; place-items:center; border-radius:8px;
               background:var(--surface2, #F6F8FC); border:1px solid var(--border, #dde3f0);
               font-size:15px; line-height:1; cursor:pointer; color:var(--text2, #5A6196); }
.modal-close:hover { background:var(--badBg); color:var(--bad); border-color:var(--bad); }
.modal.forcado .modal-close { display:none; }   /* troca de senha obrigatória — não dá pra fechar */
.modal-title { font-family:'Plus Jakarta Sans',sans-serif; font-size:16px; font-weight:700; margin-bottom:14px; }
.field-label { font-size:12px; font-weight:600; color:var(--text2); display:block; margin-bottom:5px; }
.field-input {
  width:100%; padding:9px 12px; border:1px solid var(--border); border-radius:8px; margin-bottom:14px;
  font-family:inherit; font-size:13px; background:var(--surface2); color:var(--text); outline:none;
}
.field-input:focus { border-color:var(--brand2); }

/* ── Misc ───────────────────────────────────────────────────────────── */
.hidden { display:none !important; }
.loading { color:var(--text3); font-style:italic; padding:18px 0; }

/* ── Stepper do ciclo de vida (Gerado · Enviado · Assinado · Arquivado) ── */
.stepper { display:flex; gap:4px; }
.step { height:5px; width:16px; border-radius:3px; background:var(--border); flex:none; }
.step.done { background:var(--brand); }
.step.fail { background:var(--bad); }

/* ── Skeleton loaders ───────────────────────────────────────────────── */
@keyframes ltShimmer { from { background-position:-340px 0; } to { background-position:340px 0; } }
.skel { background:linear-gradient(90deg,var(--surface2) 25%,var(--border2) 37%,var(--surface2) 63%);
  background-size:680px 100%; animation:ltShimmer 1.2s infinite linear; border-radius:10px; }
.skel-card { height:84px; margin-bottom:14px; }

/* ── Acento no item ativo da sidebar ────────────────────────────────── */
.nav-btn.active { box-shadow: inset 3px 0 0 var(--brand2); }
.empty { color:var(--text3); text-align:center; padding:30px 0; }
.mt-8 { margin-top:8px; } .mt-12 { margin-top:12px; }
details summary { cursor:pointer; }

/* ── Avisos do sistema (toast) ──────────────────────────────────────── */
/* Os contêineres vivem no <body>, fora de #app-root, e recebem a classe de
   tema (.lt-light/.lt-dark) por JS — é nela que as variáveis de cor vivem.
   z-index acima da tela de login (500): "Sessão expirada" precisa aparecer. */
.lt-avisos {
  position:fixed; right:20px; bottom:20px; z-index:700; display:flex; flex-direction:column;
  gap:10px; width:min(440px, calc(100vw - 40px)); pointer-events:none;
}
.lt-aviso {
  --c:var(--info); --cbg:var(--infoBg);
  pointer-events:auto; position:relative; overflow:hidden;
  display:grid; grid-template-columns:auto 1fr auto; gap:12px; align-items:start;
  background:var(--surface); color:var(--text); border:2px solid var(--c); border-radius:12px;
  padding:12px 10px 14px 14px; font-size:13.5px; line-height:1.45;
  box-shadow:var(--shadowLg), 0 0 0 4px var(--cbg); animation:ltScale .2s ease;
}
.lt-aviso-ok   { --c:var(--ok);   --cbg:var(--okBg); }
.lt-aviso-warn { --c:var(--warn); --cbg:var(--warnBg); }
.lt-aviso-info { --c:var(--info); --cbg:var(--infoBg); }
.lt-aviso-ic { width:30px; height:30px; border-radius:9px; background:var(--cbg); color:var(--c); display:grid; place-items:center; }
.lt-aviso-ic svg { width:17px; height:17px; }
.lt-aviso-txt { min-width:0; }
.lt-aviso-tt { font-family:'Plus Jakarta Sans',sans-serif; font-weight:700; font-size:13.5px; color:var(--c); letter-spacing:-.005em; }
.lt-aviso-ms { margin-top:2px; overflow-wrap:anywhere; }
.lt-aviso-x {
  border:0; background:transparent; color:var(--text3); width:26px; height:26px; border-radius:7px;
  cursor:pointer; font-size:17px; line-height:1; display:grid; place-items:center; font-family:inherit;
}
.lt-aviso-x:hover { background:var(--surface2); color:var(--text); }
.lt-aviso-x:focus-visible { outline:2px solid var(--brand); outline-offset:1px; }
.lt-aviso-barra {
  position:absolute; left:0; bottom:0; height:3px; width:100%; background:var(--c);
  transform-origin:left; animation:ltAvisoBarra var(--dur, 6s) linear forwards;
}
@media (hover: hover) { .lt-aviso:hover .lt-aviso-barra { animation-play-state:paused; } }
@keyframes ltAvisoBarra { from { transform:scaleX(1); } to { transform:scaleX(0); } }

/* Erro: cartão no centro da tela, fica até ser fechado. */
.lt-erro {
  position:fixed; inset:0; z-index:710; display:flex; align-items:center; justify-content:center;
  padding:20px; background:rgba(20,10,40,.45); animation:ltOverlay .2s ease;
}
.lt-erro[hidden] { display:none; }
.lt-erro-card {
  --c:var(--bad); --cbg:var(--badBg);
  position:relative; width:min(480px, 100%);
  display:grid; grid-template-columns:auto 1fr auto; gap:12px 14px; align-items:start;
  background:var(--surface); color:var(--text); border:2px solid var(--c); border-radius:14px;
  padding:18px 16px 16px 18px; font-size:14px; line-height:1.5;
  box-shadow:var(--shadowLg), 0 0 0 5px var(--cbg); animation:ltScale .2s ease;
}
.lt-erro-card:focus { outline:none; }
.lt-erro-card .lt-aviso-ic { width:36px; height:36px; border-radius:11px; }
.lt-erro-card .lt-aviso-ic svg { width:20px; height:20px; }
.lt-erro-card .lt-aviso-tt { font-size:16px; }
/* Só a MENSAGEM rola: ✕ e Entendi ficam sempre à vista, por mais longo que
   seja o texto do servidor. */
.lt-erro-card .lt-aviso-ms { max-height:min(50vh, 420px); overflow:auto; padding-right:4px; }
.lt-erro-acoes { grid-column:1 / -1; display:flex; justify-content:flex-end; margin-top:4px; }
.lt-erro-ok { padding:9px 18px; font-size:13px; }
@media (prefers-reduced-motion: reduce) { .lt-aviso, .lt-erro, .lt-erro-card { animation:none; } }
/* Celular: a barra lateral vira barra fixa no rodapé (≤820px, ~58px + safe
   area); a pilha sobe para não cobri-la. */
@media (max-width: 820px) { .lt-avisos { bottom:calc(78px + env(safe-area-inset-bottom)); } }
@media (max-width: 640px) { .lt-avisos { right:12px; left:12px; width:auto; } }

/* ── Conversas (inbox WhatsApp · Sprint 2) ──────────────────────────── */
.avatar.av-40 { width:40px; height:40px; font-size:14px; border-radius:10px; }

.cv-wrap {
  display:grid; grid-template-columns:340px 1fr; gap:16px;
  height:calc(100vh - 128px); min-height:460px;
}
.cv-list-pane, .cv-conv-pane {
  background:var(--surface); border:1px solid var(--border); border-radius:11px;
  box-shadow:var(--shadow); display:flex; flex-direction:column; overflow:hidden; min-width:0;
}

/* Filtros */
.cv-filters { padding:12px; border-bottom:1px solid var(--border); display:flex; flex-direction:column; gap:9px; flex:none; }
.cv-search-box {
  display:flex; align-items:center; gap:8px; padding:8px 11px;
  background:var(--surface2); border:1px solid var(--border); border-radius:8px; color:var(--text3);
}
.cv-search-box input { border:0; outline:0; background:transparent; font-family:inherit; font-size:13px; color:var(--text); width:100%; }
.cv-select {
  padding:8px 10px; border:1px solid var(--border); border-radius:8px; background:var(--surface2);
  color:var(--text); font-family:inherit; font-size:12.5px; outline:none; cursor:pointer;
}
.cv-select:focus, .cv-search-box:focus-within { border-color:var(--brand2); }
.cv-chips { display:flex; flex-wrap:wrap; gap:6px; }
.cv-chip {
  border:1px solid var(--border); background:var(--surface2); color:var(--text2);
  font-family:inherit; font-size:11.5px; font-weight:600; padding:5px 11px; border-radius:20px; cursor:pointer;
  transition:background .15s,color .15s,border-color .15s;
}
.cv-chip:hover { border-color:var(--brand2); color:var(--brand); }
.cv-chip.active { background:var(--brand); border-color:var(--brand); color:#fff; }

/* Lista */
.cv-list { flex:1; overflow:auto; }
.cv-item {
  display:flex; gap:11px; align-items:flex-start; width:100%; text-align:left;
  padding:11px 13px; border:0; border-bottom:1px solid var(--border2); border-left:3px solid transparent;
  background:transparent; cursor:pointer; font-family:inherit; transition:background .12s;
}
.cv-item:hover { background:var(--surface2); }
.cv-item.selected { background:var(--brandSoft); border-left-color:var(--brand); }
.cv-item-main { min-width:0; flex:1; }
.cv-item-top { display:flex; align-items:center; gap:8px; }
.cv-item-name { font-size:13.5px; font-weight:700; color:var(--text); white-space:nowrap; overflow:hidden; text-overflow:ellipsis; flex:1; }
.cv-item-time { font-size:10.5px; color:var(--text3); flex:none; }
.cv-item-prev { font-size:12px; color:var(--text2); white-space:nowrap; overflow:hidden; text-overflow:ellipsis; margin:2px 0 6px; }
.cv-item-foot { display:flex; align-items:center; gap:7px; }
.cv-agg { font-size:10.5px; font-weight:700; padding:2px 8px; border-radius:20px; white-space:nowrap; }
.cv-unread {
  margin-left:auto; flex:none; min-width:18px; height:18px; padding:0 5px; border-radius:20px;
  background:var(--brand2); color:#fff; font-size:10.5px; font-weight:700;
  display:grid; place-items:center;
}

/* Conversa */
.cv-empty {
  flex:1; display:flex; flex-direction:column; align-items:center; justify-content:center;
  gap:12px; color:var(--text3); font-size:13px; padding:30px; text-align:center;
}
.cv-conv-head { display:flex; align-items:center; gap:11px; padding:13px 16px; border-bottom:1px solid var(--border); flex:none; }
.cv-conv-head-main { min-width:0; flex:1; }
.cv-conv-name { font-size:14.5px; font-weight:700; white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
.cv-conv-sub { font-size:12px; color:var(--text3); }
.cv-ctx { display:flex; flex-wrap:wrap; gap:14px; padding:9px 16px; border-bottom:1px solid var(--border2); background:var(--surface2); font-size:12px; color:var(--text2); flex:none; }
.cv-ctx-link { color:var(--brand); font-weight:600; text-decoration:none; }
.cv-ctx-link:hover { text-decoration:underline; }

.cv-timeline { flex:1; overflow:auto; padding:16px; background:var(--bg); display:flex; flex-direction:column; gap:8px; }
.cv-day { align-self:center; font-size:10.5px; font-weight:700; color:var(--text3); background:var(--surface); border:1px solid var(--border); padding:3px 11px; border-radius:20px; margin:6px 0; }
.cv-bubble-row { display:flex; }
.cv-bubble-row.in { justify-content:flex-start; }
.cv-bubble-row.out { justify-content:flex-end; }
.cv-bubble { max-width:78%; padding:8px 12px; border-radius:12px; box-shadow:var(--shadow); }
.cv-bubble-row.in .cv-bubble { background:var(--surface); border:1px solid var(--border); border-bottom-left-radius:4px; }
.cv-bubble-row.out .cv-bubble { background:var(--brandSoft); border:1px solid var(--brandLine); border-bottom-right-radius:4px; }
.cv-bubble-body { font-size:13px; line-height:1.45; color:var(--text); white-space:pre-wrap; word-break:break-word; }
.cv-bubble-meta { display:flex; align-items:center; justify-content:flex-end; gap:5px; font-size:10.5px; color:var(--text3); margin-top:3px; }
.cv-stic { font-weight:700; }
.cv-tpl { display:block; font-size:10px; font-weight:700; text-transform:uppercase; letter-spacing:.04em; color:var(--text3); margin-bottom:3px; }
.cv-tpl-portal { text-transform:none; letter-spacing:0; color:var(--info); }
.cv-dica { font-size:10.5px; color:var(--text3); font-weight:600; }
/* Portal e WhatsApp convivem na MESMA linha do tempo; sem distinção visual o
   operador supõe que tudo saiu pelo WhatsApp. Fundo neutro (o do WhatsApp é a
   cor da marca) + tarja do canal na borda. */
.cv-bubble-row.out .cv-bubble-portal { background:var(--surface2); border:1px solid var(--border);
  border-right:3px solid var(--info); }
.cv-anexo { font-style:italic; color:var(--text2); }
.cv-op { color:var(--brand); font-weight:600; margin-right:auto; }
.cv-cap { font-size:12.5px; color:var(--text); margin-top:5px; }
.cv-media-img { max-width:220px; max-height:220px; border-radius:8px; cursor:pointer; display:block; }

/* Badge da janela de 24h */
.cv-win { font-size:10.5px; font-weight:700; padding:3px 9px; border-radius:20px; white-space:nowrap; }
.cv-win-open { background:var(--okBg); color:var(--ok); }
.cv-win-closed { background:var(--surface2); color:var(--text3); border:1px solid var(--border); }

/* Caixa de resposta */
.cv-reply { flex:none; display:flex; gap:9px; align-items:flex-end; padding:11px 14px; border-top:1px solid var(--border); background:var(--surface); }
.cv-reply textarea {
  flex:1; resize:none; min-height:38px; max-height:120px; padding:9px 12px;
  border:1px solid var(--border); border-radius:9px; background:var(--surface2);
  font-family:inherit; font-size:13px; color:var(--text); outline:none;
}
.cv-reply textarea:focus { border-color:var(--brand2); }
.cv-reply-closed { flex-direction:column; align-items:stretch; gap:8px; }
.cv-reply-note { font-size:12px; color:var(--text2); }
.cv-reply-row { display:flex; gap:9px; }
.cv-reply-row .cv-select { flex:1; }

/* ── Responsivo ─────────────────────────────────────────────────────── */
/* TABLET / MOBILE (≤820px): sidebar vira barra de navegação INFERIOR fixa;
   tabelas densas rolam horizontalmente dentro do próprio cartão (o corpo da
   página nunca rola de lado); modais e conversa ganham layout vertical. */
@media (max-width: 820px) {
  .lt-app { flex-direction:column; }

  /* Sidebar → barra inferior fixa (menu de app) */
  .sidebar {
    position:fixed; bottom:0; left:0; right:0; top:auto;
    width:100%; height:auto; z-index:40; flex-direction:row;
    background:linear-gradient(0deg,#0B0E26 0%,#13173D 100%);
    border-top:1px solid rgba(255,255,255,.12);
    padding-bottom:env(safe-area-inset-bottom); /* notch do iPhone */
    overflow-x:auto; -webkit-overflow-scrolling:touch;
  }
  .sidebar-brand, .sidebar-section, .sidebar-foot { display:none; }
  /* Especificidade (0,4,0) para vencer as regras de papel (0,3,0) que
     reexibem o rótulo "Administração" — na barra inferior não há seções. */
  .lt-app .sidebar .sidebar-section.admin { display:none; }
  .sidebar-nav { flex-direction:row; flex:1 0 auto; gap:2px; padding:5px 8px; }
  .nav-btn {
    flex-direction:column; gap:3px; min-width:64px; padding:7px 6px;
    font-size:10.5px; font-weight:600; text-align:center; line-height:1.1;
    border-radius:9px;
  }
  .nav-btn svg { width:19px; height:19px; }
  .nav-badge { position:absolute; top:3px; right:10px; margin:0; }
  .nav-btn { position:relative; }

  /* Área de conteúdo: folga para a barra inferior */
  .main { padding-bottom:0; }
  .scroll { padding:16px 14px calc(78px + env(safe-area-inset-bottom)); }

  /* Topbar compacta */
  .topbar { height:54px; padding:0 14px; gap:10px; }
  .topbar-sub { display:none; }
  .topbar-h { font-size:16px; }
  .topbar-user-info { display:none; }        /* mantém só o avatar */
  .topbar-operador { display:none; }

  /* Tabelas densas: rolam de lado dentro do cartão (colunas legíveis) */
  .tbl { overflow-x:auto; -webkit-overflow-scrolling:touch; }
  .tbl-head, .tbl-row { min-width:640px; }

  .stat-grid { grid-template-columns:repeat(2,1fr); gap:10px; }
  .doc-grid { grid-template-columns:1fr; }

  /* Conversas em coluna única */
  .cv-wrap { grid-template-columns:1fr; height:auto; }
  .cv-list-pane { max-height:46vh; }
  .cv-conv-pane { min-height:58vh; }
}

/* CELULAR (≤560px): modais em tela cheia; ainda mais compacto */
@media (max-width: 560px) {
  .modal { align-items:stretch; justify-content:stretch; }
  .modal-box {
    width:100%; max-width:100%; height:100%; max-height:100%;
    border-radius:0; padding:20px 16px calc(24px + env(safe-area-inset-bottom));
  }
  .stat-grid { grid-template-columns:1fr 1fr; }
  .login-card { padding:22px 18px; }
  .view-actions { flex-wrap:wrap; }
}

/* ── Login & usuário (auth · Sprint 4) ──────────────────────────────── */
.login-screen {
  position:fixed; inset:0; z-index:500; display:flex; align-items:center; justify-content:center;
  background:var(--bg); padding:20px;
}
.login-card {
  width:380px; max-width:94vw; background:var(--surface); border:1px solid var(--border);
  border-radius:14px; padding:28px; box-shadow:var(--shadowLg);
}
.login-brand { display:flex; align-items:center; gap:10px; margin-bottom:18px; }
.login-word { font-family:'Plus Jakarta Sans',sans-serif; font-weight:800; font-size:24px; color:var(--text); }
.login-title { font-family:'Plus Jakarta Sans',sans-serif; font-size:19px; font-weight:700; color:var(--text); }
.login-sub { font-size:12.5px; color:var(--text3); margin:4px 0 18px; }
.login-erro { background:var(--badBg); color:var(--bad); font-size:12.5px; padding:9px 12px; border-radius:8px; margin-bottom:12px; }
/* Confirmação neutra da recuperação de senha ("se existir uma conta…"). */
.login-aviso { background:var(--okBg,#e8f6ee); color:var(--ok,#1d7a45); font-size:12.5px; padding:9px 12px; border-radius:8px; margin-bottom:12px; }
/* "Esqueci minha senha" / "Voltar ao login": <button> de verdade (foco e teclado
   de graça), com aparência de link — não um <a href="#"> que navega. */
.login-link {
  display:block; width:100%; margin-top:12px; padding:6px; background:none; border:0;
  font-size:12.5px; color:var(--brand); cursor:pointer; text-align:center; font-family:inherit;
}
.login-link:hover { text-decoration:underline; }

.topbar-user { margin-left:auto; display:flex; align-items:center; gap:10px; }
.topbar-user-info { display:flex; flex-direction:column; line-height:1.15; }
.topbar-user-nome { font-size:13px; font-weight:600; color:var(--text); white-space:nowrap; }
.user-papel { font-size:10px; font-weight:700; letter-spacing:.04em; color:var(--brand); text-transform:uppercase; }
/* A regra do celular ".topbar-user-info { display:none }" (no @media de 820px
   mais acima) perdia para a de cima, declarada DEPOIS com a mesma
   especificidade: o nome e o papel apareciam e empurravam o "Sair" para fora
   da tela — rolagem lateral em toda tela a 375px. Repetida aqui, depois da
   regra base, para valer o que a de lá já dizia: no celular, só o avatar. */
@media (max-width: 820px) { .topbar-user-info { display:none; } }

/* RBAC: Auditor (somente leitura) não vê o Upload */
.role-auditor .nav-btn[data-view="upload"] { display:none; }
/* Itens de Supervisor — o ADMINISTRADOR é superconjunto e também os vê */
.nav-supervisor { display:none; }
[data-papel="SUPERVISOR"] .nav-supervisor,
[data-papel="ADMINISTRADOR"] .nav-supervisor { display:flex; }
/* Configurações: EXCLUSIVO do Administrador (espec §5). Isto aqui é
   conveniência — quem restringe de verdade é a API (src/api/config.py), porque
   esconder no front nunca impediu ninguém de chamar a rota. */
.nav-admin { display:none; }
[data-papel="ADMINISTRADOR"] .nav-admin { display:flex; }
/* Documentação: Operador, Supervisor e Administrador (o Auditor não entra —
   decisão do produto). A faixa RESTRITA de documentos (infraestrutura,
   auditorias de segurança) é filtrada pela API, não por CSS. */
.nav-doc { display:none; }
[data-papel="OPERADOR"] .nav-doc,
[data-papel="SUPERVISOR"] .nav-doc,
[data-papel="ADMINISTRADOR"] .nav-doc { display:flex; }
/* Configurações: Administrador gere; o AUDITOR entra para LER o card
   Financeiro (Q4 da análise de contratos) — os demais blocos devolvem 403
   na API e nem renderizam. */
.nav-config { display:none; }
[data-papel="ADMINISTRADOR"] .nav-config,
[data-papel="AUDITOR"] .nav-config { display:flex; }
/* Menu Auditoria aparece para Supervisor, Administrador e Auditor */
.nav-oversight { display:none; }
[data-papel="SUPERVISOR"] .nav-oversight,
[data-papel="ADMINISTRADOR"] .nav-oversight,
[data-papel="AUDITOR"] .nav-oversight { display:flex; }
/* Cabeçalho da seção Administração: visível para quem tem algum item admin */
.sidebar-section.admin { display:none; }
[data-papel="SUPERVISOR"] .sidebar-section.admin,
[data-papel="ADMINISTRADOR"] .sidebar-section.admin,
[data-papel="AUDITOR"] .sidebar-section.admin { display:block; }

/* ── Gráfico de evolução da análise (RF-15) — paleta categórica validada
   (dataviz reference; CVD-checked). Cor segue a MÉTRICA, ordem fixa, nunca
   ciclada; séries 9-11 reutilizam hue com traço (encoding composto). ── */
.lt-app{
  --ch-1:#2a78d6; --ch-2:#eb6834; --ch-3:#1baf7a; --ch-4:#eda100;
  --ch-5:#e87ba4; --ch-6:#008300; --ch-7:#4a3aa7; --ch-8:#e34948;
}
.lt-dark{
  --ch-1:#3987e5; --ch-2:#d95926; --ch-3:#199e70; --ch-4:#c98500;
  --ch-5:#d55181; --ch-6:#008300; --ch-7:#9085e9; --ch-8:#e66767;
}

/* ── Análise Financeira (espec AF, Fase 1) — tiles da Visão executiva ── */
.af-tiles{
  display:grid; grid-template-columns:repeat(auto-fill,minmax(210px,1fr));
  gap:12px; margin-top:14px;
}
.af-tile{
  background:var(--surface2); border:1px solid var(--border); border-radius:10px;
  padding:12px 14px; display:flex; flex-direction:column; gap:4px;
}
.af-tile-rot{
  font-size:12px; color:var(--text3); display:flex; align-items:center; gap:6px;
}
.af-tile-rot i{ width:10px; height:10px; border-radius:3px; display:inline-block; }
.af-tile b{
  font-family:'Plus Jakarta Sans',sans-serif; font-size:20px; font-weight:700;
  font-variant-numeric:tabular-nums;
}
.af-tile-delta{ font-size:12px; min-height:16px; font-variant-numeric:tabular-nums; }
.af-aviso{
  margin-top:10px; padding:8px 12px; border-radius:8px; font-size:12.5px;
  background:var(--warnBg); color:var(--warn);
}
/* DRE mês a mês (AF-04) */
.af-dre{ border-collapse:collapse; font-size:12.5px; min-width:100%; }
.af-dre th{
  text-align:right; padding:6px 10px; font-size:11px; color:var(--text3);
  border-bottom:2px solid var(--border); white-space:nowrap;
}
.af-dre th:first-child, .af-dre td:first-child{ text-align:left; }
.af-dre td{
  text-align:right; padding:6px 10px; border-bottom:1px solid var(--surface2);
  font-variant-numeric:tabular-nums; white-space:nowrap; vertical-align:top;
}
.af-ah{ display:inline-flex; align-items:center; gap:3px; font-size:10px; }
.af-ah i{ display:inline-block; height:7px; border-radius:2px; min-width:2px; }
/* Heatmap de margem (AF-09) */
.af-hm{ text-align:center !important; min-width:52px; font-size:11.5px; }
/* Linha do tempo de reajustes (AF-25) */
.af-marcos{ display:inline-flex; gap:3px; align-items:center; }
.af-marcos i{ width:9px; height:9px; border-radius:50%; display:inline-block; }

/* ── Solicitações dos Médicos (Portal — Fase B3) ── */
.sl-card{
  background:var(--surface); border:1px solid var(--border); border-radius:12px;
  padding:16px 18px; margin-bottom:12px; box-shadow:var(--shadow);
}
.sl-card.resolvida{opacity:.75}
.sl-top{display:flex; align-items:center; gap:10px; flex-wrap:wrap; margin-bottom:8px}
.sl-turno{
  font-size:12.5px; color:var(--text2); background:var(--surface2);
  border:1px solid var(--border2); border-radius:8px; padding:7px 10px; margin:6px 0;
}
.sl-texto{font-size:13.5px; color:var(--text); line-height:1.55; margin:8px 0 12px; white-space:pre-wrap}
.sl-resolucao{font-size:12.5px; color:var(--ok); line-height:1.5; margin-top:4px}

/* ── Painel: escopo (competência) separado da exibição (status) ── */
.painel-toolbar { display:flex; align-items:center; justify-content:space-between; gap:10px; flex-wrap:wrap; margin-bottom:12px; }
.toolbar-label { font-size:11px; font-weight:700; letter-spacing:.06em; text-transform:uppercase; color:var(--text3); }
.comp-scope {
  display:inline-flex; align-items:center; gap:8px; cursor:pointer;
  border:1.5px solid var(--border); background:var(--surface); border-radius:10px;
  padding:6px 12px; transition:border-color .15s, background .15s;
}
.comp-scope:hover { border-color:var(--brand2); }
.comp-scope svg { color:var(--brand); flex:none; }
.comp-scope select {
  border:0; background:transparent; font:inherit; font-size:13px; font-weight:700;
  color:var(--text); outline:none; cursor:pointer; max-width:230px;
}
.comp-scope.ativo { border-color:var(--brand); background:var(--brandSoft); }
.comp-scope.ativo select { color:var(--brand); }
.status-bar {
  display:flex; align-items:center; gap:10px; flex-wrap:wrap;
  padding:2px 2px 10px; border-bottom:1px solid var(--border2); margin-bottom:14px;
}
.status-bar .st-chips { flex:1; min-width:0; }
.status-presets { display:flex; align-items:center; gap:2px; color:var(--text3); font-size:12px; flex:none; }
.link-preset { background:none; border:0; color:var(--brand); font-size:12.5px; font-weight:600; cursor:pointer; padding:2px 5px; }
.link-preset:hover { text-decoration:underline; }

/* Dropdown de competências (múltipla seleção) do escopo do painel */
.comp-wrap { position:relative; }
.comp-scope .comp-rotulo { font-size:13px; font-weight:700; }
.comp-pop {
  position:absolute; right:0; top:calc(100% + 6px); z-index:60;
  min-width:240px; max-width:320px; background:var(--surface);
  border:1px solid var(--border); border-radius:12px;
  box-shadow:0 10px 30px rgba(34,18,66,.16); padding:8px;
}
.comp-pop-itens { max-height:260px; overflow:auto; }
.comp-item {
  display:flex; align-items:center; gap:9px; padding:7px 9px;
  border-radius:8px; font-size:13px; color:var(--text); cursor:pointer;
}
.comp-item:hover { background:var(--brandSoft); }
.comp-item input { accent-color:var(--brand); width:15px; height:15px; flex:none; }
.comp-pop-rodape {
  border-top:1px solid var(--border2); margin-top:6px; padding:7px 4px 2px;
  display:flex; justify-content:center;
}
@media (max-width:560px) { .comp-pop { right:auto; left:0; min-width:210px; } }

/* ── Turnos: toggle Lista|Escala + grade da escala (somente leitura) ── */
.seg-toggle { display:inline-flex; border:1px solid var(--border); border-radius:9px; overflow:hidden; background:var(--surface); }
.seg-btn { border:0; background:transparent; padding:6px 14px; font:inherit; font-size:12.5px; font-weight:700; color:var(--text2); cursor:pointer; }
.seg-btn:hover { color:var(--brand); }
.seg-btn.on { background:var(--brand); color:#fff; }
.esc-scroll { overflow:auto; max-height:calc(100vh - 300px); border:1px solid var(--border); border-radius:12px; background:var(--surface); }
.esc-grid { display:grid; min-width:max-content; }
.esc-h { position:sticky; top:0; z-index:3; background:var(--surface); font-size:10.5px; color:var(--text3); text-align:center; padding:6px 2px 5px; border-bottom:1px solid var(--border); }
.esc-h b { display:block; font-size:13px; color:var(--text); }
.esc-h.esc-wk { background:var(--surface2); }
.esc-head-corner { position:sticky; top:0; z-index:5 !important; border-bottom:1px solid var(--border); color:var(--text3); font-size:11px; text-transform:uppercase; letter-spacing:.04em; font-weight:700; }
.esc-name { position:sticky; left:0; z-index:2; background:var(--surface); font-size:12.5px; font-weight:600; color:var(--text); padding:8px 10px; border-bottom:1px solid var(--border2); border-right:1px solid var(--border); display:flex; align-items:center; overflow:hidden; white-space:nowrap; text-overflow:ellipsis; }
/* Setor: nomes longos ("MÉDICO PEDIATRIA / NEONATOLOGIA") quebram em até 3
   linhas em vez de cortar com "…". A linha da grade cresce para acomodar. */
.esc-name-wrap { white-space:normal; text-overflow:clip; line-height:1.25; font-size:11.5px; word-break:break-word;
  display:-webkit-box; -webkit-line-clamp:3; -webkit-box-orient:vertical; }
.esc-cell { border-bottom:1px solid var(--border2); border-left:1px solid var(--border2); padding:4px; display:flex; flex-direction:column; gap:3px; min-height:42px; }
.esc-cell.esc-wk { background:var(--surface2); }
.esc-cell.esc-furo { background:var(--warnBg); }
.esc-furo-amostra { display:inline-block; width:26px; height:13px; background:var(--warnBg); border:1px solid var(--warn); border-radius:4px; vertical-align:-2px; margin-left:6px; }
.esc-tot { border-bottom:1px solid var(--border2); border-left:1px solid var(--border); padding:4px 6px; display:flex; align-items:center; justify-content:flex-end; font-size:12px; font-weight:700; color:var(--text2); background:var(--surface); }
.esc-chip { border:0; border-radius:6px; padding:2px 6px; font:inherit; font-size:10.5px; font-weight:700; line-height:1.3; cursor:pointer; text-align:left; }
.esc-chip.esc-d { background:var(--warnBg); color:var(--warn); }
.esc-chip.esc-n { background:#3b2b6e; color:#fff; }
.lt-dark .esc-chip.esc-n { background:#4a3a85; }
.esc-chip.esc-emd { outline:1.5px solid var(--info); outline-offset:-1px; }
.esc-chip.esc-conf { outline:1.5px solid var(--bad); outline-offset:-1px; }
.esc-chip:hover { filter:brightness(1.08); }
.esc-mais1 { opacity:.75; font-weight:600; font-size:9.5px; }

/* ── Turnos: controles de ordenação/agrupamento + cabeçalho de grupo ── */
.tur-ord { display:flex; align-items:center; gap:7px; flex-wrap:wrap; margin:0 0 14px; padding:2px; }
.tur-ord-lbl { font-size:11px; font-weight:700; letter-spacing:.04em; text-transform:uppercase; color:var(--text3); }
.tur-ord-sel { width:auto; min-width:104px; height:32px; padding:4px 8px; font-size:12.5px; }
.tur-ord-dir { width:32px; height:32px; font-size:15px; font-weight:800; }
.tur-grupo {
  display:flex; align-items:baseline; gap:10px; flex-wrap:wrap;
  padding:9px 12px; margin:2px 0 0; background:var(--brandSoft);
  border-top:1px solid var(--brandLine); border-bottom:1px solid var(--brandLine);
  position:sticky; top:0; z-index:1;
}
.tur-grupo:first-child { border-top:0; }
.tur-grupo-nome { font-family:'Plus Jakarta Sans',sans-serif; font-weight:700; font-size:13.5px; color:var(--brand); }
.tur-grupo-meta { font-size:11.5px; color:var(--text3); font-weight:600; }

/* ── Campanha de migração da adesão SCP (F6) ── */
.funil{display:flex;gap:8px;flex-wrap:wrap}
.funil-item{flex:1;min-width:92px;background:var(--surface2);border:1px solid var(--border);
  border-radius:11px;padding:10px 8px;text-align:center}
.funil-num{font-family:'Plus Jakarta Sans',sans-serif;font-size:20px;font-weight:800;line-height:1.1}
.funil-rot{font-size:11px;color:var(--text3);margin-top:2px}
.eleg-box{margin-top:12px;border:1px solid var(--border);border-radius:11px;padding:10px 12px}
.eleg-box summary{font-size:13px;font-weight:600;color:var(--text);cursor:pointer}
.eleg-lista{max-height:260px;overflow-y:auto;margin-top:8px;border-top:1px solid var(--border)}
.eleg-item{display:flex;align-items:center;gap:8px;padding:6px 2px;font-size:12.5px;
  border-bottom:1px solid var(--border);cursor:pointer}
.eleg-item:last-child{border-bottom:0}

/* ── Central de Documentação ─────────────────────────────────────────────── */
.doc-wrap { display:grid; grid-template-columns:290px 1fr; gap:16px; align-items:start; }
.doc-nav { background:var(--surface); border:1px solid var(--border); border-radius:12px; padding:12px; position:sticky; top:12px; max-height:calc(100vh - 120px); overflow:auto; }
.doc-busca { width:100%; margin-bottom:10px; }
.doc-cat { font-size:10.5px; font-weight:700; text-transform:uppercase; letter-spacing:.06em; color:var(--text3); margin:12px 0 6px; }
.doc-cat:first-child { margin-top:0; }
/* A linha carrega o realce (hover/ativo) porque agora tem dois botões dentro:
   abrir o documento e baixá-lo em PDF. */
.doc-linha { display:flex; align-items:center; border-radius:8px; }
.doc-linha:hover { background:var(--surface2); }
.doc-linha.ativo { background:var(--brandSoft); }
.doc-linha.ativo .doc-item { color:var(--brand); font-weight:600; }
.doc-item { flex:1; min-width:0; text-align:left; background:none; border:none; border-radius:8px 0 0 8px; padding:7px 4px 7px 9px; font-size:13px; color:var(--text2); cursor:pointer; line-height:1.35; }
.doc-linha:hover .doc-item { color:var(--text); }
/* Fica visível o tempo todo (e não só no hover): o download é o motivo de o
   ícone existir — escondê-lo derrota o propósito, e no toque não há hover. */
/* Repouso em --text2 e opacidade cheia: --text3 a 55% ficava abaixo do contraste
   mínimo de 4,5:1 nos dois temas, e um ícone que ninguém enxerga não cumpre o
   papel de oferecer o download. */
.doc-baixar { flex:none; background:none; border:none; border-radius:0 8px 8px 0; padding:6px 9px; font-size:15px; line-height:1; color:var(--text2); cursor:pointer; }
.doc-linha:hover .doc-baixar, .doc-baixar:focus-visible { color:var(--brand); }
.doc-baixar:hover { background:var(--brandSoft); color:var(--brand); opacity:1; }
.doc-item .doc-tag { font-size:9px; font-weight:700; text-transform:uppercase; letter-spacing:.04em; color:var(--warn); background:var(--warnBg); border-radius:4px; padding:1px 4px; margin-left:5px; vertical-align:1px; }
.doc-vazio { font-size:12.5px; color:var(--text3); padding:8px 9px; }

.doc-body { background:var(--surface); border:1px solid var(--border); border-radius:12px; padding:26px 30px; min-width:0; overflow-wrap:break-word; }
.doc-body h1 { font-family:'Plus Jakarta Sans',sans-serif; font-size:25px; font-weight:800; margin:0 0 6px; }
.doc-body h2 { font-family:'Plus Jakarta Sans',sans-serif; font-size:19px; font-weight:700; margin:26px 0 8px; padding-top:14px; border-top:1px solid var(--border); }
.doc-body h3 { font-size:15.5px; font-weight:700; margin:20px 0 6px; }
.doc-body h4 { font-size:14px; font-weight:700; margin:16px 0 4px; color:var(--text2); }
.doc-body p { font-size:14px; line-height:1.65; margin:0 0 11px; }
.doc-body ul, .doc-body ol { margin:0 0 12px; padding-left:22px; }
.doc-body li { font-size:14px; line-height:1.6; margin-bottom:4px; }
.doc-body a { color:var(--brand); text-decoration:none; border-bottom:1px solid transparent; cursor:pointer; }
.doc-body a:hover { border-bottom-color:var(--brand); }
.doc-body code { font-family:ui-monospace,'Cascadia Code',Consolas,monospace; font-size:12.5px; background:var(--surface2); border:1px solid var(--border); border-radius:5px; padding:1px 5px; }
.doc-body pre { background:var(--surface2); border:1px solid var(--border); border-radius:9px; padding:12px 14px; overflow-x:auto; margin:0 0 13px; }
.doc-body pre code { background:none; border:none; padding:0; font-size:12px; line-height:1.55; }
.doc-body blockquote { margin:0 0 13px; padding:9px 14px; border-left:3px solid var(--brand); background:var(--brandSoft); border-radius:0 8px 8px 0; }
.doc-body blockquote p { margin:0; font-size:13.5px; }
.doc-body table { width:100%; border-collapse:collapse; font-size:13px; margin:0 0 14px; display:block; overflow-x:auto; }
.doc-body th { text-align:left; font-weight:700; padding:7px 10px; background:var(--surface2); border:1px solid var(--border); white-space:nowrap; }
.doc-body td { padding:7px 10px; border:1px solid var(--border); vertical-align:top; }
.doc-body hr { border:none; border-top:1px solid var(--border); margin:22px 0; }
.doc-body .doc-img { font-size:12px; color:var(--text3); font-style:italic; }
.doc-head { display:flex; align-items:center; justify-content:space-between; gap:12px; flex-wrap:wrap; margin-bottom:14px; }
.doc-restrito { font-size:11px; font-weight:700; color:var(--warn); background:var(--warnBg); border-radius:6px; padding:3px 8px; }
@media (max-width:900px) {
  .doc-wrap { grid-template-columns:1fr; }
  .doc-nav { position:static; max-height:none; }
  .doc-body { padding:20px 18px; }
}


/* Compositor do Portal do Médico (etapa 2): canal sem janela de 24h.
   `.cv-reply` é flex em LINHA (textarea + botão lado a lado). Reaproveitá-la
   sem trocar a direção espremia os três blocos em colunas e reduzia o campo de
   texto a um quadradinho — relatado na primeira vez que a tela foi usada. Aqui
   o empilhamento é vertical, como em `.cv-reply-closed`. */
.cv-portal{flex-direction:column; align-items:stretch; gap:8px;
  background:var(--surface2); border-top:1px solid var(--border)}
/* Canal de texto livre: o campo precisa caber uma mensagem de verdade, não uma
   linha. Cresce até 180px conforme se digita. */
/* Fundo BRANCO, e não o `--surface2` herdado de `.cv-reply textarea`: o bloco
   inteiro é --surface2, e campo e bloco da mesma cor deixariam o campo
   dependendo só da borda (que é bem clara) para existir. Branco sobre o bloco
   tingido é o mesmo contraste que o seletor de template já tem logo acima. */
.cv-portal textarea{width:100%; min-height:66px; max-height:180px;
  background:var(--surface)}
.cv-avisos{display:flex; gap:14px; align-items:center; flex-wrap:wrap}
.cv-avisos-rotulo{font-size:12px; color:var(--text3); font-weight:700;
  text-transform:uppercase; letter-spacing:.04em}
.cv-avisos label{display:inline-flex; align-items:center; gap:5px; font-size:12.5px;
  color:var(--text2); font-weight:600; cursor:pointer}
.cv-avisos input[type=checkbox]{accent-color:var(--brand); width:15px; height:15px}
.cv-avisos .btn-primary{margin-left:auto}

/* ── Complementos do Medic+ (não existiam no CSS do Lytte) ───────────── */

/* Login: só o que faltava — .login-screen/.login-card/.login-brand/.login-word/
   .login-sub/.login-erro/.field-input vieram do CSS do Lytte e continuam valendo. */
.login-plus { color:var(--accent); }
.field-lab { display:block; font-size:11.5px; font-weight:700; color:var(--text2); margin:11px 0 5px; }
.login-btn { width:100%; justify-content:center; margin-top:4px; }
/* Tela "Defina a sua senha" (D31): a regra da senha, logo abaixo dos campos. */
.login-regra { font-size:11.5px; line-height:1.45; color:var(--text3); margin:10px 0 12px; }

/* Campo de formulário */
.fld { display:flex; flex-direction:column; gap:5px; }
.fld[hidden] { display:none; }   /* o display:flex acima anulava o atributo hidden */
.fld-lab { font-size:11.5px; font-weight:700; color:var(--text2); letter-spacing:.02em; }
.fld input, .fld select, .fld textarea {
  font-family:inherit; font-size:13.5px; color:var(--text);
  background:var(--surface2); border:1px solid var(--border);
  border-radius:8px; padding:10px 12px; outline:0; width:100%;
  transition:border-color .15s, box-shadow .15s;
}
.fld input:focus, .fld select:focus, .fld textarea:focus {
  border-color:var(--brand2); box-shadow:0 0 0 3px var(--brandSoft);
}

/* Avisos efêmeros. Sempre via textContent — nunca innerHTML. */
.toast-wrap {
  position:fixed; right:18px; bottom:18px; z-index:200;
  display:flex; flex-direction:column; gap:8px; pointer-events:none;
}
.toast {
  min-width:240px; max-width:380px; padding:11px 14px; border-radius:9px;
  font-size:13px; font-weight:600; color:#fff; background:var(--text);
  box-shadow:var(--shadowLg); animation:ltFade .2s ease both;
}
.toast-bad  { background:var(--bad); }
.toast-warn { background:var(--warn); }
.toast-ok   { background:var(--ok); }
.toast-info { background:var(--info); }

/* ══ Agenda — 3 visões + tabela ══════════════════════════════════════════════
   As cores de situação saem dos MESMOS tokens do resto do sistema (--ok, --warn,
   --info, --bad). Definir uma paleta só da agenda faria "atendido" ser verde
   aqui e outro verde na recepção — e é assim que o operador perde a referência.
   Cada situação tem cor E posição/rótulo: cor sozinha exclui quem não a
   distingue, e no balcão isso é gente atendida fora de ordem. */

.ag-barra { display:flex; align-items:center; gap:10px; flex-wrap:wrap; margin-bottom:12px; }
.ag-dia { font-size:12.5px; color:var(--text3); font-weight:600; }

/* ── chip do agendamento (comum à grade e à lista) ───────────────────────── */
.ag-chip {
  display:flex; align-items:baseline; gap:5px; width:100%; text-align:left; cursor:pointer;
  border:1px solid var(--border); border-left-width:3px; border-radius:6px;
  background:var(--surface); color:var(--text);
  padding:3px 6px; font-size:11.5px; line-height:1.3; font-family:inherit;
  margin-bottom:2px; transition:box-shadow .12s, transform .12s;
}
.ag-chip:last-child { margin-bottom:0; }
.ag-chip:hover { box-shadow:var(--shadow); transform:translateY(-1px); }
.ag-chip:focus-visible { outline:2px solid var(--info); outline-offset:1px; }
/* UMA linha por paciente. O chip de duas linhas empurrava a altura da linha
   para ~76px e a grade do dia deixava de caber na tela — perdendo o motivo de
   ela existir. Hora e situação completas ficam no title (hover). */
.ag-chip b { flex:1 1 auto; min-width:0; font-weight:700;
             overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.ag-chip i { flex:none; font-style:normal; color:var(--text3); font-size:10px;
             font-variant-numeric:tabular-nums; }
/* Na LISTA há largura de sobra: ali o chip volta a ter a segunda linha. */
.ag-slot .ag-chip { display:block; padding:4px 8px; }
.ag-slot .ag-chip i { display:block; font-size:10.5px; margin-top:1px; }
/* Situação: a borda esquerda é o sinal rápido; o rótulo textual vai dentro. */
.ag-s-ok   { border-left-color:var(--ok);   background:var(--okBg); }
.ag-s-warn { border-left-color:var(--warn); background:var(--warnBg); }
.ag-s-info { border-left-color:var(--info); background:var(--infoBg); }
.ag-s-bad  { border-left-color:var(--bad);  background:var(--badBg); opacity:.72; }

/* ── visão GRADE: horário × profissional ─────────────────────────────────── */
.ag-scroll { overflow:auto; max-height:calc(100vh - 290px); border:1px solid var(--border);
             border-radius:10px; background:var(--surface); box-shadow:var(--shadow); }
.ag-grid { display:grid; min-width:max-content; }
.ag-grid > div { border-bottom:1px solid var(--border2); border-right:1px solid var(--border2); }
.ag-h {
  position:sticky; top:0; z-index:3; background:var(--surface2);
  padding:8px 10px; font-size:11.5px; font-weight:700; color:var(--text2);
  border-bottom:1px solid var(--border); text-align:left;
}
.ag-h small { display:block; font-weight:600; color:var(--text3); font-size:10.5px; }
/* Canto: sticky nos DOIS eixos, z acima das duas faixas — sem isto o rótulo
   "Horário" passa por baixo do cabeçalho ao rolar na diagonal. */
.ag-corner { position:sticky; left:0; top:0; z-index:4; }
.ag-hora {
  position:sticky; left:0; z-index:2; background:var(--surface2);
  padding:6px 10px; font-size:11.5px; font-weight:700; color:var(--text2);
  font-variant-numeric:tabular-nums; border-right:1px solid var(--border);
}
.ag-cel { padding:3px; min-height:26px; background:var(--surface); }
.ag-cel.ag-vago { background:var(--surface2); }
.ag-vago-btn {
  width:100%; min-height:26px; border:1px dashed var(--border); border-radius:6px;
  background:transparent; color:var(--text3); font-size:10.5px; cursor:pointer;
  font-family:inherit; opacity:0; transition:opacity .12s;
}
.ag-cel:hover .ag-vago-btn { opacity:1; }
.ag-vago-btn:hover { border-color:var(--info); color:var(--info); }
.ag-vago-btn:focus-visible { opacity:1; outline:2px solid var(--info); }

/* ── visão CARDS: uma coluna por profissional ────────────────────────────── */
.ag-cols { display:grid; gap:12px; grid-template-columns:repeat(auto-fill, minmax(255px,1fr)); align-items:start; }
.ag-col { background:var(--surface); border:1px solid var(--border); border-radius:10px;
          box-shadow:var(--shadow); overflow:hidden; }
.ag-col-head { padding:9px 12px; background:var(--surface2); border-bottom:1px solid var(--border);
               display:flex; align-items:baseline; justify-content:space-between; gap:8px; }
.ag-col-head b { font-size:12.5px; font-weight:700; }
.ag-col-head span { font-size:11px; color:var(--text3); font-weight:600; white-space:nowrap; }
.ag-col-body { padding:8px; display:flex; flex-direction:column; gap:6px; max-height:62vh; overflow:auto; }
.ag-card { border:1px solid var(--border); border-left-width:3px; border-radius:8px;
           padding:7px 9px; cursor:pointer; background:var(--surface); text-align:left;
           font-family:inherit; color:var(--text); width:100%; }
.ag-card:hover { box-shadow:var(--shadow); }
.ag-card:focus-visible { outline:2px solid var(--info); outline-offset:1px; }
.ag-card-top { display:flex; align-items:center; gap:7px; margin-bottom:2px; }
.ag-card-hora { font-size:12px; font-weight:700; font-variant-numeric:tabular-nums; }
.ag-card-nome { font-size:12.5px; font-weight:700; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.ag-card-sub { font-size:11px; color:var(--text3); overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }

/* ── visão LISTA: mini-calendário + horários do dia ──────────────────────── */
.ag-split { display:grid; gap:14px; grid-template-columns:232px 1fr; align-items:start; }
@media (max-width:900px) { .ag-split { grid-template-columns:1fr; } }
.ag-cal { background:var(--surface); border:1px solid var(--border); border-radius:10px;
          box-shadow:var(--shadow); padding:10px; }
.ag-cal-head { display:flex; align-items:center; justify-content:space-between; margin-bottom:8px; }
.ag-cal-mes { font-size:12.5px; font-weight:700; text-transform:capitalize; }
.ag-cal-grid { display:grid; grid-template-columns:repeat(7,1fr); gap:2px; }
.ag-cal-dsem { font-size:10px; color:var(--text3); text-align:center; font-weight:700; padding-bottom:3px; }
.ag-cal-dia {
  aspect-ratio:1; border:1px solid transparent; border-radius:6px; background:transparent;
  font-size:11px; font-family:inherit; color:var(--text2); cursor:pointer;
  display:flex; flex-direction:column; align-items:center; justify-content:center; gap:1px;
}
.ag-cal-dia:hover { background:var(--surface2); }
.ag-cal-dia.fora { color:var(--text3); opacity:.45; }
.ag-cal-dia.hoje { border-color:var(--info); font-weight:700; }
.ag-cal-dia.on { background:var(--brand); color:#fff; font-weight:700; }
.ag-cal-dia.on .ag-cal-pt { background:#fff; }
/* Ponto = tem movimento. O tamanho acompanha o volume, então o mês inteiro
   mostra de relance onde a clínica esteve cheia. */
.ag-cal-pt { width:4px; height:4px; border-radius:50%; background:var(--info); }
.ag-cal-pt.m { width:6px; height:6px; }
.ag-cal-pt.g { width:8px; height:8px; }
.ag-slot { display:grid; grid-template-columns:62px 1fr; gap:10px; padding:5px 10px;
           border-bottom:1px solid var(--border2); align-items:start; }
.ag-slot:last-child { border-bottom:0; }
.ag-slot-hora { font-size:12px; font-weight:700; color:var(--text2);
                font-variant-numeric:tabular-nums; padding-top:4px; }
.ag-slot.agora { background:var(--infoBg); }
.ag-slot.agora .ag-slot-hora { color:var(--info); }
.ag-slot-vago { font-size:11.5px; color:var(--text3); padding:5px 0; font-style:italic; }
/* Linha de intervalo livre na grade: fina e discreta, mas presente — é o
   buraco de agenda, o número que a clínica quer diminuir. */
.ag-livre {
  background:var(--surface2); color:var(--text3); font-size:10.5px; font-style:italic;
  padding:3px 10px; display:flex; align-items:center; min-height:16px;
}

/* ── Recepção: linha da fila ─────────────────────────────────────────────── */
.rc-item {
  display:grid; grid-template-columns:54px 1fr auto auto; gap:12px; align-items:center;
  padding:7px 0; border-bottom:1px solid var(--border2);
}
.rc-item:last-child { border-bottom:0; }
.rc-hora { font-size:12.5px; font-weight:700; color:var(--text2); font-variant-numeric:tabular-nums; }
.rc-quem { min-width:0; }
.rc-quem b { display:block; font-size:13px; font-weight:700;
             overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.rc-quem span { display:block; font-size:11.5px; color:var(--text3);
                overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.rc-sit { display:flex; gap:4px; flex-wrap:wrap; justify-content:flex-end; }
.rc-acoes { display:flex; gap:6px; }
.rc-acoes .btn { padding:5px 11px; font-size:12px; }
@media (max-width:760px) {
  .rc-item { grid-template-columns:48px 1fr; row-gap:6px; }
  .rc-sit, .rc-acoes { grid-column:2; justify-content:flex-start; }
}

/* ══ Cartão de pessoa (pacientes, e reaproveitável por profissionais) ═══════
   Mesma anatomia da tela de médicos da Lytte: avatar com iniciais, nome, linha
   de identificação, bloco de informações com ícone e faixa de selos. */
/* minmax(0,1fr) e nao 1fr: `1fr` tem piso de min-content, entao um nome longo
   sem espaco alarga a propria coluna e as tres deixam de ter a mesma largura —
   alem de impedir o `text-overflow:ellipsis` de agir. */
.pgrid { display:grid; grid-template-columns:repeat(3,minmax(0,1fr)); gap:14px; }
@media (max-width:1180px) { .pgrid { grid-template-columns:repeat(2,minmax(0,1fr)); } }
@media (max-width:720px)  { .pgrid { grid-template-columns:minmax(0,1fr); } }

.pcard {
  background:var(--surface); border:1px solid var(--border); border-radius:10px;
  padding:15px; box-shadow:var(--shadow); cursor:pointer; text-align:left;
  font-family:inherit; color:var(--text); width:100%;
  transition:border-color .15s, box-shadow .15s;
}
.pcard:hover { border-color:var(--brand2); box-shadow:var(--shadowLg); }
.pcard:focus-visible { outline:2px solid var(--brand2); outline-offset:2px; }
.pcard-top { display:flex; align-items:center; gap:11px; margin-bottom:12px; }
.avatar {
  flex:none; display:grid; place-items:center; border-radius:11px;
  background:linear-gradient(135deg,var(--brand2),var(--accent)); color:#fff; font-weight:700;
}
.avatar.av-44 { width:44px; height:44px; font-size:15px; }
.avatar.av-34 { width:34px; height:34px; font-size:13px; border-radius:9px; }
.pcard-nome { font-size:13.5px; font-weight:700; white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
.pcard-sub  { font-size:11.5px; color:var(--brand2); font-weight:600;
              white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
.pcard-info { display:flex; flex-direction:column; gap:6px; font-size:12px; color:var(--text2);
              padding-top:11px; border-top:1px solid var(--border2); }
.pcard-info .row { display:flex; align-items:center; gap:8px; min-width:0; }
.pcard-info .row span { overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.pcard-info svg { flex:none; color:var(--text3); }
.pcard-selos { display:flex; gap:5px; flex-wrap:wrap; margin-top:11px; }

/* Linha da visão em lista — grid, para as colunas ficarem alinhadas sem <table> */
.plista { background:var(--surface); border:1px solid var(--border); border-radius:10px;
          box-shadow:var(--shadow); overflow:hidden; }
/* `border:0` explicito: a linha e um <button>, e a borda lateral que o
   navegador da de brinde desalinha as colunas em 2px do cabecalho, que e uma
   <div>. Dois pixels bastam para a coluna nao bater com o titulo. */
.plinha { display:grid; gap:12px; align-items:center; padding:9px 14px;
          border:0; border-bottom:1px solid var(--border2); cursor:pointer;
          font-family:inherit; color:var(--text); text-align:left; width:100%;
          background:var(--surface); font-size:12.5px; }
.plinha:last-child { border-bottom:0; }
.plinha:hover { background:var(--surface2); }
.plinha:focus-visible { outline:2px solid var(--brand2); outline-offset:-2px; }
.phead { display:grid; gap:12px; padding:9px 14px; background:var(--surface2);
         border-bottom:1px solid var(--border); font-size:11px; font-weight:700;
         letter-spacing:.03em; text-transform:uppercase; color:var(--text3); }
@media (max-width:820px) { .plinha, .phead { grid-template-columns:1fr !important; }
                           .phead { display:none; } }

/* Chip que funciona como FILTRO: o estado "desligado" precisa ser visivel sem
   depender so da cor, porque a cor ja carrega a situacao (verde/ambar/vermelho)
   e nao sobra contraste para carregar tambem o ligado/desligado. */
.ag-filtro { cursor:pointer; font-family:inherit; }
.ag-filtro:hover { filter:brightness(.94); }
.ag-filtro.off { opacity:.42; text-decoration:line-through;
                 background:var(--surface2); border-color:var(--border); }
.ag-filtro:focus-visible { outline:2px solid var(--brand2); outline-offset:1px; }


/* ══ Área do Médico, documentos clínicos e histórico ════════════════════
   Blocos entregues pelas três frentes da área do médico. Mantidos juntos
   aqui, e não em arquivos separados, porque o painel é servido sem build:
   cada <link> a mais é uma ida à rede antes de a tela pintar. */

/* ── Histórico clínico (historico.js) ────────────────────────────────────── */
/* A linha do tempo põe DUAS origens na mesma lista — o encontro com prontuário
   e a consulta que só a agenda registra — e quem distingue as duas é o MARCO à
   esquerda: cheio para o prontuário, vazado para a agenda. A forma carrega a
   informação porque a cor sozinha não carrega: num daltônico, duas tonalidades
   de azul viram a mesma coisa, e "tem prontuário" deixaria de ser legível. */

.hx-topo { display:flex; align-items:center; gap:14px; flex-wrap:wrap; }
.hx-nome { font-family:'Plus Jakarta Sans',sans-serif; font-size:19px;
           font-weight:700; letter-spacing:-.01em; }
.hx-sub { font-size:12.5px; color:var(--text2); margin:2px 0 7px; }
.hx-acoes { display:flex; gap:8px; flex-wrap:wrap; }
.hx-mut { color:var(--text3); font-size:11.5px; }
.hx-busca-nota { display:block; margin-top:10px; }

/* Condição ativa é o que muda a conduta (o diabético, a gestante, o
   anticoagulado): fica em destaque de alerta, e não em texto corrido. */
.hx-cond { display:flex; flex-direction:column; gap:8px; }
.hx-cond-item {
  display:flex; align-items:center; gap:8px; flex-wrap:wrap; font-size:13px;
  padding:8px 10px; border-radius:8px; background:var(--warnBg);
  border:1px solid color-mix(in srgb, var(--warn) 22%, transparent);
}

.hx-profs { display:flex; flex-wrap:wrap; gap:10px 18px; }
.hx-prof { display:inline-flex; align-items:center; gap:8px; font-size:12.5px; }
.hx-prof .hx-mut { display:block; }

/* ── a linha do tempo ────────────────────────────────────────────────────── */
/* O fio é pseudo-elemento de CADA item, e não um traço no container: o item
   expandido cresce, e um fio só, desenhado no container, sobraria abaixo da
   última linha ou ficaria curto na primeira conforme o conteúdo aberto. */
.hx-tl { position:relative; }
.hx-item { position:relative; display:flex; gap:12px; padding:0 0 12px; }
.hx-item::before {
  content:''; position:absolute; left:5px; top:17px; bottom:0; width:2px;
  background:var(--border2);
}
.hx-item:last-child::before { display:none; }
.hx-marco {
  position:relative; z-index:1; flex:0 0 12px; width:12px; height:12px;
  margin-top:6px; border-radius:50%; background:var(--brand);
  border:2px solid var(--surface); box-shadow:0 0 0 2px var(--brandLine);
}
.hx-marco-agenda { background:var(--surface); box-shadow:0 0 0 2px var(--border); }
.hx-corpo {
  flex:1; min-width:0; border:1px solid var(--border); border-radius:10px;
  background:var(--surface); padding:10px 12px;
}
.hx-aberto > .hx-corpo { border-color:var(--brandLine); box-shadow:var(--shadow); }

.hx-cab { display:grid; grid-template-columns:132px 1fr auto; gap:10px;
          align-items:center; }
.hx-cab[role="button"] { cursor:pointer; }
.hx-quando b { display:block; font-family:'Plus Jakarta Sans',sans-serif;
               font-size:13px; font-weight:700; }
.hx-quando .hx-mut { display:block; }
.hx-quem { min-width:0; }
.hx-quem b { display:block; font-size:13px; font-weight:700;
             overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.hx-quem .hx-mut { display:block; overflow:hidden; text-overflow:ellipsis;
                   white-space:nowrap; }
.hx-sel { display:flex; align-items:center; justify-content:flex-end; gap:6px;
          flex-wrap:wrap; }
.hx-seta { width:14px; text-align:center; font-size:12px; color:var(--text3); }
.hx-resumo { margin-top:6px; }
/* A nota da consulta sem prontuário e o motivo do cancelamento: texto do
   sistema sobre a linha, e não conteúdo clínico — por isso recuado e discreto. */
.hx-nota {
  margin-top:7px; padding:7px 9px; font-size:11.5px; color:var(--text2);
  background:var(--surface2); border-left:3px solid var(--border);
  border-radius:0 6px 6px 0;
}

/* ── o detalhe aberto ────────────────────────────────────────────────────── */
.hx-det { margin-top:11px; padding-top:11px; border-top:1px dashed var(--border); }
.hx-reg { margin-bottom:11px; }
.hx-reg-tit {
  display:flex; align-items:center; gap:7px; margin-bottom:5px;
  font-size:11px; font-weight:700; text-transform:uppercase;
  letter-spacing:.05em; color:var(--text3);
}
.hx-reg-corpo { display:flex; flex-direction:column; gap:5px;
                font-size:12.5px; line-height:1.55; }
.hx-sub-reg { padding:8px 10px; border:1px solid var(--border2);
              border-radius:8px; background:var(--surface2); }
.hx-ul { margin:5px 0 0 17px; }
.hx-ul li { margin-bottom:3px; }
.hx-rot {
  margin-right:5px; font-size:10.5px; font-weight:700; text-transform:uppercase;
  letter-spacing:.04em; color:var(--text3);
}
/* Adendo é a ÚNICA correção possível depois da assinatura. Ele é marcado para
   que ninguém leia o registro original achando que nunca foi corrigido. */
.hx-adendo {
  padding:9px 11px; background:var(--warnBg); border-left:3px solid var(--warn);
  border-radius:0 8px 8px 0;
}

/* ── o prontuário completo, no modal ─────────────────────────────────────── */
.hx-campo { margin-bottom:10px; font-size:13px; line-height:1.55; }
.hx-svs { display:flex; flex-wrap:wrap; gap:7px; margin-bottom:13px; }
.hx-sv {
  padding:4px 9px; font-size:11.5px; color:var(--text2);
  background:var(--surface2); border:1px solid var(--border); border-radius:7px;
}

/* ── a trilha do titular ─────────────────────────────────────────────────── */
/* Rola DENTRO do modal: a resposta ao titular pode ter 250 linhas, e uma lista
   que empurra os botões de paginação para fora da tela deixa de ser legível
   justamente na investigação que a motivou. */
.hx-trilha { display:flex; flex-direction:column; gap:7px;
             max-height:48vh; overflow:auto; }
.hx-trilha-linha { padding:8px 10px; font-size:12.5px;
                   border:1px solid var(--border); border-radius:8px; }
.hx-trilha-just { margin-top:5px; padding-left:8px; font-size:11.5px;
                  color:var(--text2); border-left:3px solid var(--warn); }
.hx-trilha-pe { display:flex; align-items:center; gap:8px; flex-wrap:wrap;
                margin-top:12px; }

/* No telefone as três colunas do cabeçalho da linha não cabem: viram três
   faixas empilhadas, e os selos voltam para a esquerda — alinhados à direita
   numa coluna só, eles pareceriam pertencer à linha de baixo. */
@media (max-width:760px) {
  .hx-cab { grid-template-columns:1fr; gap:4px; }
  .hx-sel { justify-content:flex-start; }
  .hx-topo { align-items:flex-start; }
  .hx-acoes { width:100%; }
}

/* ══ Área do Médico — agenda, pacientes e produção do profissional ═══════════
   Sem paleta nova: situação usa os mesmos --ok/--warn/--info/--bad do resto do
   sistema. Um verde só desta tela faria "atendido" ter duas cores no mesmo
   sistema, e é assim que o operador perde a referência. */

/* Cabeçalho: avatar, identificação e — para o gestor — o seletor de
   profissional. `flex-wrap` porque o aviso de "você está vendo a área de outra
   pessoa" mora na MESMA caixa: sem quebrar linha, ele espreme o nome até
   ninguém mais ler de quem é a agenda. */
.md-cab { display:flex; align-items:center; gap:14px; flex-wrap:wrap; }
.md-cab-nome { font-family:'Plus Jakarta Sans',sans-serif; font-size:17px; font-weight:800;
               overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.md-cab-sub { font-size:12px; color:var(--text2); margin-top:3px; }
/* O aviso ocupa a faixa inteira, abaixo do nome — nunca ao lado dele. */
.md-cab .alert { flex-basis:100%; }

/* ── aba 1: agenda do dia ────────────────────────────────────────────────── */
/* A última coluna é FIXA: é onde mora o botão de iniciar atendimento, e uma
   coluna elástica o encolhe até duas palavras quebradas quando o nome do
   procedimento é longo — justamente na linha do paciente que já está na sala. */
.md-linha { grid-template-columns:82px minmax(120px,1.25fr) minmax(140px,1.5fr)
            minmax(118px,.85fr) 172px; }
/* Quem JÁ ESTÁ na clínica. A barra à esquerda é o sinal rápido, mas nunca o
   único: a linha também traz o chip com o rótulo da situação. Cor sozinha
   exclui quem não a distingue, e aqui isso é paciente atendido fora de ordem. */
.md-entrou { background:var(--okBg); box-shadow:inset 3px 0 0 var(--ok); }
.md-entrou:hover { background:var(--okBg); filter:brightness(.97); }
/* O nome do paciente é BOTÃO (abre a ficha) e precisa continuar parecendo
   texto: com cara de `.btn`, cada linha da agenda vira uma barra de ações. */
.md-nome { display:block; max-width:100%; border:0; background:none; padding:0;
           font:inherit; font-size:13px; font-weight:700; color:var(--text);
           text-align:left; cursor:pointer;
           overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.md-nome:hover { color:var(--brand2); text-decoration:underline; }
.md-nome:focus-visible { outline:2px solid var(--brand2); outline-offset:2px; border-radius:4px; }

/* ── aba 2: ficha do paciente ────────────────────────────────────────────── */
/* Cadastro à esquerda, em largura contida (é leitura de campo curto); o
   histórico à direita, que é onde o olho do médico fica. */
.md-duas { display:grid; gap:14px; grid-template-columns:minmax(0,340px) minmax(0,1fr);
           align-items:start; }
.md-campo { display:grid; grid-template-columns:96px minmax(0,1fr); gap:10px;
            padding:6px 0; font-size:12.5px;
            border-bottom:1px dashed var(--border2); overflow-wrap:anywhere; }
.md-campo:last-of-type { border-bottom:0; }
.md-campo-rot { font-size:11.5px; font-weight:700; color:var(--text3); }
/* Linha do tempo: data à esquerda, o que houve no meio, o acesso ao prontuário
   à direita. */
.md-ev { display:grid; grid-template-columns:74px minmax(0,1fr) auto; gap:10px;
         align-items:start; padding:9px 0; border-bottom:1px solid var(--border2); }
.md-ev:last-child { border-bottom:0; }
.md-ev-data { font-size:12px; font-weight:700; color:var(--text2);
              font-variant-numeric:tabular-nums; }
.md-ev-corpo { min-width:0; font-size:12.5px; overflow-wrap:anywhere; }

/* Nota de rodapé: explica a REGRA que a tela acabou de aplicar (quem move a
   agenda, o que "produção" conta, por que o resumo não bate com a lista).
   Discreta de propósito — é para ser lida na dúvida, não a cada visita. */
.md-nota { margin:12px 0 0; font-size:11.5px; line-height:1.55; color:var(--text3); }
.md-rot { font-size:12px; font-weight:700; color:var(--text2); }

/* ── aba 3: produção ─────────────────────────────────────────────────────── */
/* A tabela de produção NÃO empilha no telefone: uma linha sem os números lado a
   lado deixa de ser tabela. Ela rola na horizontal dentro do cartão, e a
   largura mínima vem do JS, derivada das mesmas colunas. */
.md-rolar { overflow-x:auto; -webkit-overflow-scrolling:touch; }

@media (max-width:980px) { .md-duas { grid-template-columns:minmax(0,1fr); } }
@media (max-width:760px) {
  /* A agenda empilha: hora e paciente na primeira faixa, o resto abaixo. O
     cabeçalho some porque rótulo de coluna sobre linha empilhada rotula a
     coisa errada — e rótulo errado é pior do que rótulo nenhum. */
  .md-linha { grid-template-columns:70px minmax(0,1fr); row-gap:6px; }
  .tbl-head.md-linha { display:none; }
  .md-linha > span:nth-child(n+3) { grid-column:2; }
  .md-linha > span:last-child { text-align:left !important; }
  .md-ev { grid-template-columns:66px minmax(0,1fr); }
  .md-ev > div:last-child { grid-column:2; text-align:left !important; }
  .md-campo { grid-template-columns:minmax(0,1fr); gap:2px; }
}

/* ── Atendimento (prontuário) ──────────────────────────────────────────────
   O prontuário é a tela mais densa do sistema: cabeçalho do paciente, fluxo
   obrigatório, abas e emissão de documento dividem a mesma rolagem. Por isso
   as molduras daqui são de BAIXO contraste — o destaque fica para o que muda
   decisão (alergia, etapa pendente, selo de assinatura), não para a caixa em
   volta. Nenhuma cor nova: tudo sai dos tokens da marca já declarados acima.

   ATENÇÃO: style.css ainda NÃO tem nenhuma destas regras, e a tela já as usa
   desde a entrega original de static/atendimento.js. Este é o bloco ACUMULADO
   da frente — deve SUBSTITUIR qualquer bloco `at-*` anterior, nunca somar-se
   a ele. */

.at-cabecalho { padding:15px 17px; }

.at-pac { display:flex; align-items:center; gap:12px; }
.at-pac-nome {
  font-family:'Plus Jakarta Sans',sans-serif; font-size:16.5px; font-weight:700;
  letter-spacing:-.01em; overflow:hidden; text-overflow:ellipsis; white-space:nowrap;
}

/* Linha de comorbidades. `align-items:center` e não `baseline`: os chips têm
   altura própria e o ícone dançaria a cada comorbidade a mais. */
.at-linha { display:flex; align-items:center; gap:8px; flex-wrap:wrap; color:var(--text2); }
.at-linha svg { flex:none; }

.at-meta {
  display:grid; grid-template-columns:repeat(auto-fit,minmax(130px,1fr)); gap:10px 14px;
  margin-top:12px; padding-top:12px; border-top:1px solid var(--border2);
}

/* ── Fluxo obrigatório ───────────────────────────────────────────────── */
/* `auto-fit` com mínimo generoso: são 5 etapas, e no consultório (tela
   estreita) elas precisam virar 2 colunas sem quebrar o rótulo no meio. */
.at-fluxo { display:grid; grid-template-columns:repeat(auto-fit,minmax(150px,1fr)); gap:9px; }

/* Etapa PENDENTE é âmbar, nunca vermelha: ainda não é erro, é o que falta.
   Vermelho aqui faria o fluxo normal de todo atendimento parecer incidente. */
.at-etapa {
  display:flex; flex-direction:column; gap:3px; padding:10px 12px; border-radius:9px;
  background:var(--surface2); border:1px solid var(--border);
  border-left:3px solid var(--warn); font-size:12.5px;
}
.at-etapa b { font-size:12.5px; }
.at-etapa span { font-size:11px; color:var(--text3); }

.at-etapa-ok { border-left-color:var(--ok); background:var(--okBg); }
.at-etapa-ok span { color:var(--ok); }

/* DISPENSADA não é cumprida nem pendente: é uma decisão registrada. Cor
   própria para que "decidiu não prescrever" não se leia como "prescreveu" —
   é essa distinção que o registro explícito de dispensa existe para guardar. */
.at-etapa-disp { border-left-color:var(--info); background:var(--infoBg); }
.at-etapa-disp span { color:var(--info); }

/* ── Sinais vitais e grades de campo curto ───────────────────────────── */
.at-vitais { display:grid; grid-template-columns:repeat(auto-fit,minmax(115px,1fr)); gap:10px; }

/* ── Item de registro (medicamento, item de pedido, adendo, anexo) ───── */
.at-item {
  padding:9px 11px; border-radius:8px; background:var(--surface2);
  border:1px solid var(--border2); font-size:12.5px; margin-bottom:7px;
}
.at-item:last-child { margin-bottom:0; }

/* ── Resultado de busca em catálogo (CID-10, procedimento) ───────────── */
/* É <button> de propósito, e o CSS acompanha: escolher um CID pelo teclado é
   o caminho normal de quem digita rápido, e <div> com onclick não recebe foco. */
.at-opcao {
  display:block; width:100%; text-align:left; cursor:pointer; font-family:inherit;
  font-size:12.5px; color:var(--text); padding:8px 11px; border-radius:8px;
  background:var(--surface); border:1px solid var(--border); margin-bottom:5px;
}
.at-opcao:hover, .at-opcao:focus-visible { border-color:var(--brand2); background:var(--brandSoft); }
.at-opcao b { font-family:'Plus Jakarta Sans',sans-serif; margin-right:6px; }

@media (max-width:760px) {
  .at-pac { flex-wrap:wrap; }
  .at-fluxo { grid-template-columns:repeat(auto-fit,minmax(130px,1fr)); }
  .at-vitais { grid-template-columns:repeat(auto-fit,minmax(96px,1fr)); }
}


/* ══ Conciliação e Relatórios ═══════════════════════════════════════════
   Entregue pelas telas correspondentes. As regras de Atendimento vieram
   junto mas ficaram DE FORA: elas já existem acima, com valores diferentes,
   e manter as duas produziria um híbrido — as propriedades presentes só na
   versão antiga continuariam valendo por baixo da nova. As duas cobrem as
   mesmas 9 classes que o JS usa; a diferença é cosmética. */

/* ── Conciliação: banco × sistema, taxa cobrada × contrato ──────────── */

/* DUAS COLUNAS, e não uma lista de pendências: conciliar é comparar dois
   lados. Uma lista mostra só o que o sistema já decidiu; as colunas deixam o
   operador ver o que ele NÃO conseguiu casar — que é onde mora o erro. */
.cc-duas { display:grid; grid-template-columns:1fr 1fr; gap:14px; align-items:start; } .cc-duas { grid-template-columns:1fr; }

.cc-col {
  background:var(--surface); border:1px solid var(--border); border-radius:10px;
  box-shadow:var(--shadow); overflow:hidden;
}
.cc-col-head {
  display:flex; align-items:center; justify-content:space-between; gap:10px;
  padding:10px 14px; background:var(--surface2); border-bottom:1px solid var(--border);
  font-size:11px; font-weight:700; letter-spacing:.03em; text-transform:uppercase;
  color:var(--text3);
}

.cc-linha {
  padding:11px 14px; border-bottom:1px solid var(--border2); cursor:pointer;
  /* Barra INTERNA à esquerda (inset), não borda: borda de verdade empurraria o
     conteúdo 3px e as duas colunas deixariam de casar na horizontal justamente
     na linha destacada — que é a que se está comparando. */
  box-shadow:inset 3px 0 0 transparent; transition:background .12s ease;
}
.cc-linha:last-child { border-bottom:0; }
/* O hover não pode apagar o destaque de seleção nem o do par sugerido: sem o
   `:not()` ele vence por especificidade e o par pisca de volta ao normal
   embaixo do cursor, bem quando o operador vai conferir. */
.cc-linha:not(.cc-sel):not(.cc-par):hover { background:var(--surface2); }
.cc-sel { background:var(--brandSoft); box-shadow:inset 3px 0 0 var(--brand); }
.cc-par { background:var(--okBg); box-shadow:inset 3px 0 0 var(--ok); }

.cc-topo { display:flex; align-items:baseline; justify-content:space-between; gap:10px; }
/* `tabular-nums`: os dois valores são lidos em par, um ao lado do outro. Com
   largura de dígito variável, R$ 1.119,00 e R$ 1.191,00 ocupam o mesmo espaço
   e a diferença some — na única tela cuja tarefa é justamente achá-la. */
.cc-val { font-weight:700; font-variant-numeric:tabular-nums; white-space:nowrap; }

.cc-meta {
  display:flex; align-items:center; flex-wrap:wrap; gap:6px 10px;
  margin-top:6px; font-size:11.5px; color:var(--text3);
}
.cc-acoes { display:flex; flex-wrap:wrap; gap:8px; margin-top:10px; }
.cc-vazio {
  padding:22px 16px; text-align:center; font-size:12.5px; line-height:1.5;
  color:var(--text3);
}

/* Linha de taxa fora do contrato: mesmo desenho do atraso na tabela de folhas
   — tinta de fundo MAIS barra à esquerda. A posição informa junto com a cor,
   então o destaque sobrevive ao daltonismo e à impressão em preto e branco. */
.tbl-row.cc-diverge { background:var(--badBg); box-shadow:inset 3px 0 0 var(--bad); }
.tbl-row.cc-diverge:hover { background:var(--badBg); filter:brightness(.97); }

/* Checklist do estado vazio: o que falta para EXISTIR conciliação. Uma base
   recém-carregada do Feegow tem agenda e cadastro, não extrato bancário — a
   tela vazia está certa e precisa dizer o que falta, não parecer quebrada. */
.cc-pre {
  display:flex; align-items:flex-start; gap:9px;
  font-size:12.5px; line-height:1.45; margin-bottom:9px;
}
.cc-pre-ic {
  flex:none; width:18px; height:18px; margin-top:1px; border-radius:50%;
  display:grid; place-items:center; font-size:11px; font-weight:700;
}
.cc-pre-ok { background:var(--okBg); color:var(--ok); }
.cc-pre-falta { background:var(--warnBg); color:var(--warn); }


/* ── Relatórios: barra de participação, cabeçalho ordenável, mapa de calor ──
   Cinco classes, todas a serviço da mesma exigência: o número tem de ser
   conferível de relance. O resto da tela (cartões, tabela, selos, avisos)
   reaproveita o que já existe — paleta nova aqui seria um segundo vocabulário
   visual para dizer o que o primeiro já diz. */

/* Cabeçalho clicável da tabela ordenável. É um <span role="button"> e não um
   <button> porque ele mora dentro de um grid de larguras fixas: o <button>
   traz box model próprio e quebra o alinhamento com as células de baixo, que
   é o que faz a coluna parecer torta. O foco visível vem do `:focus-visible`
   global — ordenar pelo teclado é o caminho de quem confere com as duas mãos
   na planilha. */
.rl-ord { cursor:pointer; user-select:none; white-space:nowrap;
          overflow:hidden; text-overflow:ellipsis; }
.rl-ord:hover { color:var(--brand); }

/* Barra de participação. Uma cor só, variando em COMPRIMENTO: participação é
   grandeza, não categoria, e pintar cada linha de uma cor inventaria uma
   classificação que o dado não tem. O trilho fica visível mesmo com 0% para a
   linha não sumir — "zero" e "sem barra" precisam parecer diferentes. */
.rl-bar { display:block; flex:1; min-width:40px; height:7px; border-radius:20px;
          background:var(--surface2); border:1px solid var(--border2);
          overflow:hidden; }
.rl-bar > i { display:block; height:100%; background:var(--brand);
              border-radius:inherit; }

/* Mapa de calor: 7 linhas (dias) × N faixas de hora. O
   `grid-template-columns` vem inline do JS porque N depende do período — a
   régua vai do primeiro ao último horário COM movimento, e não de 0h a 23h
   fixo. Cabeçalho, linhas e rodapé de totais usam a mesma classe e o mesmo
   template justamente para não saírem desalinhados quando a tabela rola na
   horizontal. */
.rl-hm-linha { display:grid; gap:4px; align-items:center; margin-bottom:4px; }
.rl-hm-rot { font-size:11px; font-weight:700; color:var(--text3);
             text-align:center; font-variant-numeric:tabular-nums; }
/* A célula recebe fundo e cor inline (color-mix sobre a cor da marca): a
   intensidade é dado, muda a cada carga, e não caberia numa classe. Aqui fica
   só a forma. `tabular-nums` para os números ficarem em coluna de verdade. */
.rl-hm-cel { display:flex; align-items:center; justify-content:center;
             height:30px; border-radius:6px; font-size:11.5px; font-weight:700;
             font-variant-numeric:tabular-nums; }

/* ══ Atendimento (prontuario) ══════════════════════════════════════════════
   Duas familias, com publicos diferentes:

     .at-*   e a TELA — herda os tokens do tema (claro/escuro) como o resto do
             sistema;
     .imp-*  e o PAPEL — branco com texto quase-preto, medida em milimetro,
             sem token de tema. Atestado impresso no tema escuro sairia com
             fundo chumbo: gasta toner e volta do balcao.

   A folha (#imp-ov) e pendurada no <body>, FORA de #app-root, porque a regra
   de impressao esconde os IRMAOS DIRETOS do body. E por isso que a paleta
   clara existe tambem no :root (ver o comentario do topo deste arquivo): se
   os tokens so vivessem em .lt-light, a moldura da folha sairia transparente. */

/* ── Cabecalho do paciente ──────────────────────────────────────────────
   A borda esquerda existe para este cartao nao se confundir com os cards
   comuns: e o unico bloco que o medico le ANTES de prescrever, porque alergia
   e comorbidade moram nele. */
  .at-pac > :last-child { width:100%; text-align:left !important; }

/* Linha de comorbidades: icone + rotulo + selos, com os selos quebrando para a
   linha de baixo em vez de espremerem o rotulo. */

/* Fatos administrativos do encontro (procedimento, quem paga, espera). O
   auto-fit cabe em cinco colunas no desktop e empilha no celular sem precisar
   de media query propria. */

/* ── Fluxo obrigatorio ──────────────────────────────────────────────────
   Tres caixas, uma por etapa. O estado e dito pela borda E pelo texto da nota
   ("cumprida 14:20", "dispensada: quadro leve", "pendente") — nunca so pela
   cor: "dispensada" e "cumprida" sao fatos diferentes, e dois tons de verde
   nao contam essa diferenca a quem nao distingue cor. */
/* Ambar, e nao verde: a etapa esta CUMPRIDA, mas por escape explicito. Pintar
   igual a cumprida apagaria justamente o que o escape existe para registrar. */

/* Grade de campos curtos. Serve aos oito sinais vitais e tambem aos pares
   (lado/quantidade, principio/duracao) dentro dos modais — dai o auto-fit: a
   mesma regra se adapta ao card largo e a caixa estreita do modal. */

/* Item de lista clinica: medicamento da receita, exame do pedido, adendo,
   anexo. Separador por linha, e nao por card: sao muitos, e cada um no seu
   quadro viraria uma escada. */
.at-item .chip { margin-left:6px; vertical-align:middle; }

/* Resultado de busca (CID, procedimento): botao de largura inteira. */

/* ══ Documento impresso: atestado, pedido de exame e laudo ═════════════════
   A previa na tela JA e o papel: o medico ve exatamente o que o paciente leva
   na mao, e nao uma versao "de tela" que muda no Ctrl+P.

   A sobreposicao inteira sai CLARA mesmo com o tema escuro ligado, e isso nao
   e descuido: ela e pendurada no <body>, fora de #app-root, e .lt-dark vive
   dentro de #app-root — entao os `var(--*)` aqui resolvem pelo :root, que e a
   paleta clara. O efeito e o certo: o que esta na tela e uma folha de papel,
   e papel nao tem modo escuro. A moldura clara em volta dela e coerente com
   isso; seguir o tema deixaria uma barra chumbo colada numa folha branca. */

.imp-ov {
  position:fixed; inset:0; z-index:400;   /* acima do modal (200), abaixo do toast (700) */
  background:var(--bg); overflow:auto;
  padding:0 0 40px; animation:ltFade .16s ease;
}
.imp-barra {
  position:sticky; top:0; z-index:2;
  display:flex; align-items:center; gap:10px; flex-wrap:wrap;
  padding:10px 16px; background:var(--surface);
  border-bottom:1px solid var(--border); box-shadow:var(--shadow);
}
.imp-nota { max-width:820px; margin:14px auto 0; padding:0 16px; }

/* A folha em 21cm, encolhendo para caber no celular: o medico confere o
   documento no telefone e manda imprimir da recepcao. O `calc(100% - 32px)`
   guarda uma folga lateral em QUALQUER largura — sem ela, entre o tablet e o
   desktop a folha encosta nas bordas e deixa de parecer uma folha. */
.imp-folha {
  width:21cm; max-width:calc(100% - 32px); min-height:27cm;
  margin:18px auto; padding:22mm 18mm;
  background:#ffffff; color:#111319;
  border:1px solid var(--border); box-shadow:var(--shadowLg);
  font-family:'Nunito Sans', system-ui, sans-serif;
  font-size:13px; line-height:1.65;
}

.imp-cab { text-align:center; border-bottom:2px solid #111319; padding-bottom:10px; }
.imp-cab-nome {
  font-family:'Plus Jakarta Sans',sans-serif;
  font-size:17px; font-weight:800; letter-spacing:.01em; color:#13173D;
}
.imp-cab-sub { font-size:11.5px; color:#4a4f63; margin-top:2px; }
.imp-cab-sub:empty { display:none; }   /* unidade sem endereco nao deixa linha vazia no papel */

.imp-tit {
  font-family:'Plus Jakarta Sans',sans-serif;
  font-size:16px; font-weight:800; text-align:center;
  text-transform:uppercase; letter-spacing:.06em;
  margin:22px 0 18px;
}

/* Bloco de dados: rotulo a esquerda, valor a direita, uma linha por campo.
   Impresso, e o que o RH e o laboratorio conferem antes de aceitar o papel. */
.imp-bloco {
  border:1px solid #d6dae6; border-radius:6px;
  padding:10px 12px; margin:14px 0;
  background:#fbfcfe;
}
.imp-linha {
  display:flex; gap:12px; justify-content:space-between;
  padding:3px 0; font-size:12.5px;
}
.imp-linha + .imp-linha { border-top:1px dashed #e4e8f1; }
.imp-linha span { color:#5a6072; white-space:nowrap; }
.imp-linha b { text-align:right; font-weight:700; overflow-wrap:anywhere; }
.imp-sub {
  font-family:'Plus Jakarta Sans',sans-serif;
  font-size:11px; font-weight:700; text-transform:uppercase;
  letter-spacing:.06em; color:#5a6072; margin-bottom:4px;
}

/* Texto do documento: recuo e justificado, como se espera de um atestado.
   `text-align:justify` sem hifenizacao abre rios no meio do paragrafo; por isso
   `hyphens:auto` junto — o papel e estreito e a frase e longa. */
.imp-par {
  margin:12px 0; text-align:justify; hyphens:auto;
  text-indent:1.2em; font-size:13.5px; line-height:1.85;
  white-space:pre-wrap; overflow-wrap:anywhere;
}
.imp-bloco .imp-par { text-indent:0; margin:4px 0 0; }

.imp-itens { width:100%; border-collapse:collapse; margin:14px 0; font-size:12.5px; }
.imp-itens th {
  text-align:left; font-size:10.5px; text-transform:uppercase;
  letter-spacing:.05em; color:#5a6072; font-weight:700;
  border-bottom:1.5px solid #111319; padding:6px 8px;
}
.imp-itens td { padding:7px 8px; border-bottom:1px solid #e4e8f1; vertical-align:top; }
.imp-itens th:first-child, .imp-itens td:first-child { width:28px; color:#5a6072; }
.imp-itens th:nth-child(3), .imp-itens td:nth-child(3) { width:90px; }
.imp-itens th:last-child, .imp-itens td:last-child { width:52px; text-align:right; }
.imp-obs { font-size:11.5px; color:#5a6072; margin-top:2px; }

.imp-local { margin:26px 0 0; text-align:right; font-size:12.5px; }

/* O bloco de assinatura nao se separa do texto: `break-inside:avoid` impede que
   a folha quebre entre a linha e o nome, que e como se imprime um documento com
   uma assinatura orfa na pagina 2. */
.imp-ass {
  margin:34px auto 0; max-width:340px; text-align:center;
  break-inside:avoid; page-break-inside:avoid;
}
.imp-ass-linha { border-top:1px solid #111319; margin-bottom:6px; }
.imp-ass-nome { font-weight:700; font-size:13px; }
.imp-ass-reg { font-size:11.5px; color:#4a4f63; }

/* No celular a folha vira tela: a margem de papel so atrapalha. */
@media (max-width:760px) {
  .imp-folha { padding:16px 14px; margin:10px auto; min-height:0;
               max-width:calc(100% - 16px); }
  .imp-linha { flex-direction:column; gap:0; }
  .imp-linha span { white-space:normal; }
  .imp-linha b { text-align:left; }
}

/* IMPRESSAO. Estas duas aberturas (`@media (max-width:760px)` acima e
   `@media print` aqui) foram PERDIDAS em a976023, quando o script que juntava o
   CSS dos agentes tratou as linhas repetidas como duplicata. O resultado ficou
   invisivel no teste e visivel na tela: sem o `@media print`, a regra
   `body:has(.imp-ov) > *:not(.imp-ov) { display:none }` valia no MONITOR — abrir
   a previa de impressao apagava o resto do app —, e a folha perdia borda,
   sombra e margem porque as regras de papel ja estavam aplicadas. */
@media print {
  @page { size:A4; margin:14mm 12mm; }

  body:has(.imp-ov) > *:not(.imp-ov) { display:none !important; }

  .imp-ov { position:static; overflow:visible; background:#ffffff; padding:0; }
  .imp-barra, .imp-nota { display:none !important; }

  .imp-folha {
    width:auto; max-width:none; min-height:0;
    margin:0; padding:0; border:0; box-shadow:none;
    /* Garante o preto no papel mesmo com o tema escuro ativo na tela. */
    background:#ffffff; color:#000000;
  }
  .imp-bloco { background:#ffffff; }
  /* Nada do que o papel prova pode ser partido entre duas paginas: um bloco de
     dados do paciente pela metade e o que faz o RH devolver o atestado. */
  .imp-bloco, .imp-itens tr { break-inside:avoid; page-break-inside:avoid; }
  .imp-cab, .imp-tit { break-after:avoid; page-break-after:avoid; }
  .gt-grade, .gt-tabela tr, .gt-ass { break-inside:avoid; page-break-inside:avoid; }
}
/* ══ Guia TISS no papel (onda 4): os campos da ANS em caixas numeradas ══════
   Mesma folha `imp-*` do recibo; o formulario da ANS e uma grade de caixas com
   o numero do campo, e e isso que o faturista confere contra o portal. */
.gt-cab { text-align:center; border-bottom:2px solid #111319; padding-bottom:8px; margin-bottom:6px; }
.gt-conv { font-size:11.5px; font-weight:700; letter-spacing:.04em; text-transform:uppercase; color:#4a4f63; }
.gt-padrao { font-size:10.5px; color:#5a6072; }
.gt-folha .imp-tit { margin:6px 0 2px; font-size:15px; }
.gt-bloco-tit {
  font-size:10.5px; font-weight:700; text-transform:uppercase; letter-spacing:.04em;
  margin:10px 0 4px; color:#111319;
}
.gt-grade { display:grid; grid-template-columns:repeat(4, minmax(0, 1fr)); gap:4px; }
.gt-campo {
  border:1px solid #9aa0b2; border-radius:3px; padding:3px 6px; min-height:34px;
  display:flex; flex-direction:column; gap:1px; min-width:0;
}
.gt-largo { grid-column:span 2; }
.gt-rot { font-size:9.5px; color:#4a4f63; line-height:1.2; }
.gt-val { font-size:12px; font-weight:600; color:#111319; overflow-wrap:anywhere; }
.gt-tabela { width:100%; border-collapse:collapse; margin:10px 0; font-size:11px; }
.gt-tabela th, .gt-tabela td { border:1px solid #9aa0b2; padding:4px 6px; text-align:left; vertical-align:top; }
.gt-tabela th { font-size:9.5px; color:#4a4f63; font-weight:600; }
.gt-ass { display:grid; grid-template-columns:repeat(auto-fit, minmax(170px, 1fr)); gap:16px; margin-top:30px; }
.gt-ass-linha { border-top:1px solid #111319; margin-bottom:4px; }
.gt-ass span { font-size:10.5px; color:#4a4f63; }
.gt-msg {
  background:var(--surface2); border:1px solid var(--border); border-radius:8px;
  padding:8px 10px; font-size:12.5px; color:var(--text); line-height:1.45;
}
.gt-aguardando { border-left:3px solid var(--bad); }
.gt-falta { margin:4px 0 0; padding-left:18px; font-size:12px; }
.gt-lista { display:grid; gap:4px; max-height:190px; overflow:auto; margin-top:6px; }
.gt-lista:empty { display:none; }
.gt-opcao {
  display:flex; flex-direction:column; align-items:flex-start; gap:1px; text-align:left;
  white-space:normal; height:auto; padding:6px 10px; font-size:12.5px;
}
.gt-opcao .cell-mut, .gt-escolhido .cell-mut { font-size:11px; }
.gt-escolhido {
  display:flex; flex-wrap:wrap; align-items:center; gap:4px 10px; font-size:12.5px;
  background:var(--surface2); border:1px solid var(--border); border-radius:8px; padding:6px 10px;
}
@media (max-width: 640px) {
  .gt-grade { grid-template-columns:repeat(2, minmax(0, 1fr)); }
}
/* ══ Fila, senha e chamada (sala de espera + configuração da TV) ═══════════
   Mesma anatomia de linha da Recepção (.rc-item): quem aprende uma tela lê a
   outra. A diferença é a primeira coluna — aqui é a SENHA, em fonte grande,
   porque é por ela que o balcão confere quem está na frente e é o que o
   paciente tem na mão. */
.fl-item {
  display:grid; grid-template-columns:86px minmax(0,1fr) auto auto; gap:12px;
  align-items:center; padding:9px 0; border-bottom:1px solid var(--border2);
}
.fl-item:last-child { border-bottom:0; }
.fl-item-simples { padding:7px 0; }
/* Quem já foi chamado e não apareceu CONTINUA na lista, marcado: some da fila
   só quando entra ou vira falta. Sem a marca, o operador chama de novo sem
   saber que já chamou. */
.fl-chamado { background:var(--warnBg); border-radius:8px; padding:9px 8px; }

.fl-senha {
  font-family:'Plus Jakarta Sans',sans-serif; font-size:21px; font-weight:800;
  letter-spacing:-.02em; font-variant-numeric:tabular-nums;
  color:var(--brand); text-align:center;
}
/* Fila preferencial no vermelho da marca: é a única distinção que a tela faz
   entre as duas filas — o MOTIVO da prioridade é dado de saúde e fica no
   selo, não no número. */
.fl-senha-pri { color:var(--accent); }
.fl-senha-vazia { font-size:13px; font-weight:700; color:var(--text3); }
/* A senha do comprovante é lida em voz alta e anotada na hora: tem de ser
   legível do outro lado do balcão. */
.fl-senha-grande {
  font-family:'Plus Jakarta Sans',sans-serif; font-size:64px; font-weight:800;
  letter-spacing:-.03em; font-variant-numeric:tabular-nums;
  color:var(--brand); text-align:center; padding:6px 0 16px;
}

.fl-quem { min-width:0; }
.fl-quem b { display:block; font-size:13px; font-weight:700;
             overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.fl-quem span { display:block; font-size:11.5px; color:var(--text3);
                overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.fl-selos { display:flex; gap:4px; flex-wrap:wrap; margin-top:4px; }
.fl-tempo { display:flex; justify-content:flex-end; }
.fl-acoes { display:flex; gap:6px; }
.fl-acoes .btn { padding:6px 12px; font-size:12px; }

/* Configuração do painel: pares rótulo+controle que quebram sozinhos. A
   recepção costuma rodar em tela pequena, e coluna fixa cortaria o rótulo. */
.fl-cfg { display:flex; flex-wrap:wrap; gap:10px 18px; align-items:center;
          font-size:12px; color:var(--text2); }
.fl-cfg label { display:inline-flex; align-items:center; gap:6px; }

/* Nota de campo. Existe porque o aviso precisa estar ONDE se digita: o
   destino ("Guichê 2") aparece na TV pública e é lido em voz alta, e quem
   digita é a recepção — não quem abre a aba de configuração da TV. */
.fl-nota { font-size:11.5px; color:var(--text3); margin:4px 0 0; line-height:1.45; }

/* Mídias do modo ocioso (o rodízio da TV entre uma chamada e outra). */
.fl-midias { display:flex; flex-direction:column; gap:6px; margin-top:6px; }
.fl-midia {
  display:flex; align-items:center; gap:8px; flex-wrap:wrap;
  padding:7px 9px; border:1px solid var(--border2); border-radius:8px;
  background:var(--surface2); font-size:12px;
}
/* Desligada: fora do rodízio, mas o arquivo continua no servidor — a campanha
   volta no mês seguinte sem ninguém subir de novo. */
.fl-midia-off { opacity:.55; }
.fl-midia-nome { flex:1; min-width:120px; font-weight:600;
                 overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.fl-midia-dur { display:inline-flex; align-items:center; gap:5px;
                font-size:11px; color:var(--text3); }
.fl-midia .btn { padding:5px 10px; font-size:11.5px; }

@media (max-width:760px) {
  .fl-item { grid-template-columns:70px minmax(0,1fr); row-gap:6px; }
  .fl-tempo, .fl-acoes { grid-column:2; justify-content:flex-start; }
}

/* ══════════════════════════════════════════════════════════════════════
   Faturamento de convênio — trilha da glosa e listas de valor
   (usadas só por static/faturamento.js)
   ══════════════════════════════════════════════════════════════════════ */

/* A TRILHA É A PROVA DO PRAZO: cada etapa da glosa com o dia em que
   aconteceu, na ordem do ciclo. Rola no eixo X em vez de quebrar linha —
   quebrada, a ordem das etapas deixa de ser a ordem em que aconteceram, que
   é a única coisa que a trilha tem a dizer. */
.fat-trilha {
  display:flex; align-items:stretch; gap:10px; overflow-x:auto;
  padding:10px 12px; margin-bottom:12px;
  background:var(--surface2); border:1px solid var(--border2); border-radius:10px;
}
.fat-etapa { display:flex; flex-direction:column; gap:4px; flex:0 0 auto; font-size:11px; }
.fat-etapa + .fat-etapa { padding-left:10px; border-left:1px solid var(--border); }

/* Rótulo à esquerda, dinheiro à direita. O alinhamento à direita (com
   tabular-nums no próprio <b>) é o que permite comparar duas linhas sem ler
   os dois valores inteiros. */
.fat-valores { display:flex; flex-direction:column; }
.fat-valor {
  display:flex; align-items:center; justify-content:space-between; gap:12px;
  padding:7px 0; font-size:12.5px; border-bottom:1px solid var(--border2);
}
.fat-valor:last-child { border-bottom:0; }
.fat-valor > b { white-space:nowrap; }

@media (max-width: 560px) {
  /* No modal em tela cheia o rótulo pode ocupar duas linhas; o valor não
     pode encolher, senão vira "R$ 1.2…". */
  .fat-valor { align-items:flex-start; gap:8px; }
  .fat-valor > b { flex:0 0 auto; }
}

/* ── Fluxo de caixa: projetado, realizado, custo fixo e endividamento ──────
   Nenhuma cor nova: tudo sai dos tokens do tema, para as quatro abas e os
   gráficos SVG acompanharem claro/escuro sem uma segunda paleta. */

/* Gráfico (SVG inline — não há build e a CSP só aceita script self) */
.fx-chart { padding-bottom:10px; }
.fx-legenda { display:flex; gap:16px; flex-wrap:wrap; margin-top:6px; font-size:11.5px; color:var(--text3); }
.fx-legenda span { display:inline-flex; align-items:center; gap:6px; }
.fx-legenda i { width:10px; height:10px; border-radius:3px; display:inline-block; }

/* Semana a semana: cabeçalho clicável que abre os eventos */
.fx-sem { border-bottom:1px solid var(--border2); }
.fx-sem:last-child { border-bottom:0; }
.fx-sem-head {
  display:grid; grid-template-columns:1fr 118px 118px 118px 128px 52px;
  gap:10px; align-items:center; width:100%; padding:11px 14px;
  background:none; border:0; color:var(--text); font:inherit; font-size:12.5px;
  text-align:right; cursor:pointer;
}
.fx-sem-head:hover { background:var(--surface2); }
.fx-sem-cab {
  cursor:default; font-size:10.5px; text-transform:uppercase; letter-spacing:.04em;
  color:var(--text3); font-weight:700; background:var(--surface2);
  border-bottom:1px solid var(--border);
}
.fx-sem-cab:hover { background:var(--surface2); }
.fx-sem-tt { display:flex; flex-direction:column; gap:2px; text-align:left; min-width:0; }
.fx-sem-num { font-variant-numeric:tabular-nums; white-space:nowrap; }
.fx-sem-qtd { color:var(--text3); font-size:11.5px; }
/* Semana de saldo negativo: é o único aviso que não pode passar batido. */
.fx-sem-neg { box-shadow:inset 3px 0 0 var(--bad); background:var(--badBg); }

.fx-evt-lista { padding:2px 14px 12px; }
.fx-evt {
  display:grid; grid-template-columns:52px 1fr auto; gap:10px; align-items:center;
  padding:8px 0; border-top:1px dashed var(--border2);
}
.fx-evt-dia { font-size:11.5px; font-weight:700; color:var(--text3); font-variant-numeric:tabular-nums; }
.fx-evt-txt { min-width:0; }
.fx-evt-txt .cell-strong { overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.fx-evt-val { font-weight:700; white-space:nowrap; font-variant-numeric:tabular-nums; }

/* Barras por grupo (orçado × realizado) e por fatia (conta, forma) */
.fx-grupos { display:grid; gap:13px; }
.fx-grupo-top { display:flex; justify-content:space-between; gap:12px; margin-bottom:5px; font-size:12.5px; }
.fx-grupo-barra { height:8px; border-radius:6px; background:var(--surface2); border:1px solid var(--border2); overflow:hidden; }
.fx-grupo-barra i { display:block; height:100%; background:var(--brand2); }
/* A segunda barra é o REAL: fica embaixo do orçado, na mesma escala, para a
   comparação ser visual e não aritmética. */
.fx-grupo-real { margin-top:4px; }
.fx-grupo-real i { background:var(--ok); }

/* Linhas de lista com colunas próprias */
.fx-item { grid-template-columns:2fr 110px 1.3fr 120px 160px; }
.fx-parc { grid-template-columns:40px 1.3fr 108px 108px 100px 110px 96px 104px; }
.fx-yoy { grid-template-columns:1fr 140px 140px 120px; }
.fx-comp { grid-template-columns:1fr 130px 130px 130px 110px; min-width:600px; }

/* Formulário de funcionário: um bloco por vínculo, e só o do vínculo
   escolhido fica visível — o cálculo lê apenas os campos daquele vínculo. */
.fx-bloco { border:1px solid var(--border); border-radius:10px; padding:12px 13px 13px; }
.fx-bloco legend { padding:0 6px; font-size:11px; font-weight:700; text-transform:uppercase; letter-spacing:.04em; color:var(--text3); }

/* Matriz linha × mês do realizado. É TABELA de propósito: a tarefa aqui é
   conferir número contra extrato, e coluna alinhada ganha de card. */
.fx-rolagem { overflow-x:auto; -webkit-overflow-scrolling:touch; }
/* A barra de abas rola dentro do próprio invólucro em vez de esticar a página:
   quatro abas não cabem em 375px, e uma página que rola de lado esconde o
   conteúdo em vez de esconder o menu. */
.fx-rolagem > .seg-toggle { width:max-content; min-width:100%; }
/* `.tbl` corta o que passa da largura (`overflow:hidden`), e a matriz de 12
   meses passa sempre. Quem rola é o invólucro; a tabela cresce até o conteúdo
   para a borda e o zebrado acompanharem as colunas escondidas. */
.fx-rolagem > .tbl { overflow:visible; width:max-content; min-width:100%; }
/* Sem recuo à esquerda na LINHA: o recuo vai para dentro da célula, senão a
   coluna presa (abaixo) fica 16px à frente da própria coluna e deixa um naco
   do mês seguinte aparecendo ao lado dela. */
.fx-mtz { min-width:720px; padding-left:0; }
.fx-cel { font-variant-numeric:tabular-nums; text-align:right; white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
/* A coluna da LINHA fica presa na rolagem: sem ela, quem arrasta até dezembro
   perde a única informação que diz o que cada número é. */
.fx-mtz > .fx-cel:first-child {
  text-align:left; position:sticky; left:0; z-index:1;
  background:var(--surface); padding:0 10px 0 16px;
  /* A emenda com a coluna que passa por baixo tem de parecer proposital. */
  box-shadow:1px 0 0 var(--border);
}
.tbl-head.fx-mtz > .fx-cel:first-child { background:var(--surface2); }

/* Indicador: valor grande, referência, e SEMPRE a base de cálculo. */
.fx-ind { gap:6px; }
.fx-ind .stat-num { font-size:26px; line-height:1.1; margin:2px 0 4px; }
.fx-base { font-size:11px; line-height:1.45; border-top:1px solid var(--border2); padding-top:7px; margin-top:4px; }

/* Filtro de pessoas desligadas: desligar tem volta, e a tela precisa dizer. */
.fx-inativos { display:flex; align-items:center; gap:8px; margin-bottom:12px; font-size:12.5px; color:var(--text2); cursor:pointer; }

/* `:nth-child` e não `:nth-of-type`: as seis células da linha da semana são
   todas <span>, então contar por TIPO esconderia a coluna errada. */
@media (max-width:1100px) {
  /* Cai o "Líquido": ele é a diferença de duas colunas que continuam ali. */
  .fx-sem-head { grid-template-columns:1fr 100px 100px 110px 44px; }
  .fx-sem-head > :nth-child(4) { display:none; }
  /* Cai a "Vigência" do item de orçamento. */
  .fx-item { grid-template-columns:2fr 110px 120px 150px; }
  .fx-item > :nth-child(3) { display:none; }
}
@media (max-width:760px) {
  /* Valor de sete dígitos tem min-content de ~200px: sem `min-width:0` a
     coluna `1fr` do grid respeita esse mínimo e a PÁGINA rola de lado. O
     escopo é a tela, para não mexer no cartão de nenhuma outra. */
  #fluxocaixa-content .stat-grid { grid-template-columns:1fr 1fr; }
  #fluxocaixa-content .stat-grid > * { min-width:0; }
  #fluxocaixa-content .stat-num { font-size:20px; }
  #fluxocaixa-content .pgrid { grid-template-columns:1fr; }
  /* Sobram o período, o líquido da semana e o SALDO — que é o número que
     responde "dá para pagar a folha". Entradas e saídas somem primeiro. */
  .fx-sem-head { grid-template-columns:1fr 106px 116px; }
  .fx-sem-head > :nth-child(2),
  .fx-sem-head > :nth-child(3),
  .fx-sem-head > :nth-child(6) { display:none; }
  /* O "Líquido" volta: a regra de 1100px o escondeu, e ela também vale aqui.
     Sem esta linha sobra uma coluna vazia e o gestor perde o número que diz
     se a semana entrou mais do que saiu. */
  .fx-sem-head > :nth-child(4) { display:block; }
  .fx-item { grid-template-columns:1fr 104px 132px; }
  .fx-item > :nth-child(2), .fx-item > :nth-child(3) { display:none; }
  .fx-yoy { grid-template-columns:1fr 112px 88px; }
  .fx-yoy > :nth-child(2) { display:none; }
  .fx-parc { min-width:700px; }
  .fx-evt { grid-template-columns:44px 1fr; }
  .fx-evt-val { grid-column:2; text-align:left; }
}
@media (max-width:560px) {
  /* Uma coluna: duas não cabem sem quebrar "R$ 1.193.824,37" no meio, e valor
     de dinheiro partido em duas linhas deixa de ser legível como valor. */
  #fluxocaixa-content .stat-grid { grid-template-columns:1fr; }
  #fluxocaixa-content .stat-num { font-size:24px; }
}

/* ── Precificação, DRE e ponto de equilíbrio ────────────────────────── */
/* Tudo aqui é prefixo `pr-`. O resto da tela usa as classes do design system
   (.card .tbl .stat .chip .alert .btn .fld .seg-toggle): a única coisa que este
   bloco acrescenta é a GRADE de cada lista e os poucos elementos que não
   existem em lugar nenhum — a barra de margem, a tabela da DRE e a memória de
   cálculo. Nenhuma cor literal: só tokens, para o escuro sair de graça. */

.pr-abas { margin-bottom: 14px; }

/* Texto de apoio: a tela inteira explica POR QUE cada número é o que é, e
   isso só funciona se o texto de apoio não competir com o número. */
.pr-nota { font-size: 11.5px; color: var(--text3); line-height: 1.55; margin-top: 8px; }
.pr-sub { font-size: 11.5px; color: var(--text3); }
.pr-rot { font-size: 11px; font-weight: 700; letter-spacing: .03em;
          text-transform: uppercase; color: var(--text3); }
.pr-stat-sub { font-size: 11.5px; font-weight: 600; margin-top: 3px; color: var(--text3); }
.pr-contagem { margin-left: auto; font-size: 12px; font-weight: 600; color: var(--text3); }
.pr-click { cursor: pointer; }
.pr-acoes { display: flex; flex-wrap: wrap; gap: 8px; margin-top: 14px; }
.pr-paginacao { display: flex; gap: 8px; justify-content: flex-end; margin-top: 12px; }
.pr-check { display: inline-flex; align-items: center; gap: 6px;
            font-size: 12.5px; font-weight: 600; color: var(--text2); }
.pr-form-linha { display: grid; grid-template-columns: 1fr 1fr; gap: 12px; margin-top: 10px; }

/* Grades das listas. A primeira coluna carrega nome + subtítulo e por isso é a
   única elástica; as de dinheiro têm largura fixa para alinhar à direita entre
   linhas — número que dança de coluna não se compara de bater o olho. */
.pr-grid-preco   { grid-template-columns: minmax(200px,2.2fr) 92px 110px 88px 88px 88px 110px 74px; }
.pr-grid-critico { grid-template-columns: minmax(180px,2fr) minmax(120px,1fr) 92px 110px 110px 116px 74px; }
.pr-grid-cenario { grid-template-columns: minmax(200px,2.2fr) 100px 100px 90px 150px 120px; }
.pr-grid-canal   { grid-template-columns: minmax(160px,1.6fr) 110px 150px 150px 150px 90px; }
.pr-grid-preco > div, .pr-grid-critico > div,
.pr-grid-cenario > div, .pr-grid-canal > div { min-width: 0; }

/* Margem por canal: cartões, não tabela — é a preferência do cliente, e aqui
   ela também ajuda, porque cada canal carrega texto (o que incide sobre ele). */
.pr-canais { display: grid; grid-template-columns: repeat(auto-fill, minmax(320px, 1fr)); gap: 12px; }
.pr-canal { border: 1px solid var(--border); border-radius: 10px;
            background: var(--surface2); padding: 13px 14px; }
.pr-canal-top { display: flex; align-items: center; gap: 7px; flex-wrap: wrap; }
.pr-canal-sub { font-size: 11.5px; color: var(--text3); margin-top: 6px; line-height: 1.5; }

/* Barra de margem. Largura vem do `style` inline (é dado, não tema); aqui só a
   calha. `overflow:hidden` porque a MC pode passar de 100% num canal sem
   repasse informado, e a barra transbordaria o cartão. */
.pr-bar { height: 6px; border-radius: 4px; background: var(--border); overflow: hidden; margin-top: 9px; }
.pr-bar-fill { height: 100%; border-radius: 4px; transition: width .2s; }

/* DRE: a ÚNICA tabela de verdade desta tela, porque é conferência de número
   com o contador — linha a linha, mês a mês, na ordem que a clínica usa. */
.pr-rolagem { overflow-x: auto; }
.pr-dre { width: 100%; border-collapse: collapse; font-size: 12.5px; white-space: nowrap; }
.pr-dre th, .pr-dre td { padding: 8px 10px; text-align: right; border-bottom: 1px solid var(--border2); }
.pr-dre th:first-child, .pr-dre td:first-child { text-align: left; position: sticky; left: 0;
  background: var(--surface); }
.pr-dre thead th { font-size: 11px; font-weight: 700; letter-spacing: .03em;
  text-transform: uppercase; color: var(--text3); background: var(--surface2); }
.pr-dre thead th:first-child { background: var(--surface2); }
.pr-dre-total td { font-weight: 700; background: var(--surface2); }
.pr-dre-total td:first-child { background: var(--surface2); }
.pr-dre-pct td { font-size: 11.5px; color: var(--text3); }

/* Receita mensal contra o equilíbrio. */
.pr-meses { display: grid; grid-template-columns: repeat(auto-fill, minmax(190px, 1fr)); gap: 10px; }
.pr-mes { border: 1px solid var(--border); border-radius: 9px; padding: 10px 12px; background: var(--surface2); }
.pr-mes-rot { font-size: 12px; font-weight: 700; }

/* Cenários de lucro e cenários de reajuste. */
.pr-cenarios { display: grid; gap: 10px; }
.pr-cenario { border: 1px solid var(--border); border-radius: 9px; padding: 11px 13px; background: var(--surface2); }
.pr-cenario-top { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }
.pr-cenario-card { margin-bottom: 10px; }
.pr-cenario-card:hover { border-color: var(--brandLine); }

/* As quatro aberturas da receita, lado a lado. Colunas, e NÃO uma tabela só:
   elas não se somam entre si, e juntá-las numa grade convidaria a somar. */
.pr-colunas { display: grid; grid-template-columns: repeat(auto-fit, minmax(240px, 1fr)); gap: 14px; }
.pr-coluna { border: 1px solid var(--border); border-radius: 9px; padding: 12px; background: var(--surface2); }
.pr-linha-receita { display: grid; grid-template-columns: 1fr auto; gap: 2px 10px;
  padding: 7px 0; border-bottom: 1px solid var(--border2); font-size: 12.5px; }
.pr-linha-receita:last-child { border-bottom: 0; }
.pr-linha-receita span:first-child { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.pr-linha-receita .cell-mut { grid-column: 1 / -1; font-size: 11px; }
.pr-pos { display: inline-grid; place-items: center; width: 20px; height: 20px; flex: none;
  border-radius: 6px; background: var(--brandSoft); color: var(--brand);
  font-size: 11px; font-weight: 700; }

/* As DUAS margens lado a lado: é o ponto da tela. A direta é a que o sócio tem
   na cabeça, a de contribuição é a verdadeira — mostrar só uma trava a conversa
   sobre a Pneumologia, e por isso elas dividem a mesma linha. */
.pr-duas-margens { display: grid; grid-template-columns: 1fr 1fr; gap: 12px; margin: 12px 0; }
.pr-duas-margens > div { border: 1px solid var(--border); border-radius: 9px;
  padding: 11px 13px; background: var(--surface2); display: grid; gap: 3px; }
.pr-duas-margens b { font-family: 'Plus Jakarta Sans', sans-serif; font-size: 19px; }

/* Memória de cálculo: monoespaçada de propósito — são linhas que se conferem
   uma embaixo da outra, e fonte proporcional desalinha os valores. */
.pr-memoria { font-family: ui-monospace, 'Cascadia Mono', Consolas, monospace;
  font-size: 12px; line-height: 1.85; color: var(--text2);
  background: var(--surface2); border: 1px solid var(--border2);
  border-radius: 8px; padding: 11px 13px; overflow-x: auto; }

/* Vigências do par e parâmetros: linhas de leitura, não formulário. */
.pr-hist { display: flex; align-items: center; gap: 10px; flex-wrap: wrap;
  padding: 8px 0; border-bottom: 1px solid var(--border2); font-size: 12.5px; }
.pr-hist:last-child { border-bottom: 0; }
.pr-parametro { display: flex; align-items: center; justify-content: space-between;
  gap: 12px; padding: 10px 0; border-bottom: 1px solid var(--border2); }
.pr-parametro:last-of-type { border-bottom: 0; }
.pr-parametro b { font-family: 'Plus Jakarta Sans', sans-serif; font-size: 15px; white-space: nowrap; }

/* Busca de procedimento: 534 não cabem num <select>, e id digitado à mão é o
   caminho mais curto para cadastrar o preço no procedimento errado. */
.pr-sugestoes { display: grid; max-height: 190px; overflow-y: auto; }
.pr-sugestoes:empty { display: none; }
.pr-sugestao { text-align: left; font-family: inherit; font-size: 13px; color: var(--text);
  background: var(--surface2); border: 1px solid var(--border); border-top: 0;
  padding: 9px 11px; cursor: pointer; }
.pr-sugestao:first-child { border-top: 1px solid var(--border); border-radius: 8px 8px 0 0; }
.pr-sugestao:last-child { border-radius: 0 0 8px 8px; }
.pr-sugestao:hover { background: var(--brandSoft); }

@media (max-width: 900px) {
  /* No celular a grade vira lista: uma tabela de 8 colunas em 375px não se lê,
     e rolar na horizontal para comparar margem é pior do que empilhar. */
  .pr-grid-preco, .pr-grid-critico, .pr-grid-cenario, .pr-grid-canal {
    grid-template-columns: 1fr 1fr; gap: 6px 10px;
  }
  .pr-grid-preco > div:first-child, .pr-grid-critico > div:first-child,
  .pr-grid-cenario > div:first-child, .pr-grid-canal > div:first-child { grid-column: 1 / -1; }
  .pr-form-linha, .pr-duas-margens { grid-template-columns: 1fr; }
  .pr-dre th:first-child, .pr-dre td:first-child { position: static; }
}

/* ══ Diárias (static/diarias.js) — prefixo .dr- ══════════════════════════════
   CARTÕES E LISTAS, NUNCA TABELA: preferência declarada do dono, e no celular
   uma linha que quebra ainda se lê — seis colunas espremidas, não. Cores só
   dos tokens do sistema: "desatualizado" é o mesmo --warn da agenda e dos
   repasses, para o olho não precisar reaprender o que cada cor quer dizer. */

.dr-barra { display: flex; flex-wrap: wrap; align-items: flex-end; gap: 12px 16px; }
.dr-fld-prof { flex: 1 1 260px; min-width: 0; }
.dr-fld-dia { flex: 0 1 auto; }
.dr-dia-nav { display: flex; align-items: center; gap: 6px; flex-wrap: wrap; }
/* Mesma especificidade de `.fld input` e declarada depois: vence. Sem isto o
   calendário ocupa a largura toda e empurra as setas para a linha de baixo. */
.dr-dia-nav input { width: auto; min-width: 150px; }
.dr-quem { flex: 1 1 260px; min-width: 0; }
.dr-quem-nome { font-family: 'Plus Jakarta Sans', sans-serif; font-weight: 700; font-size: 15px; }
.dr-aviso-lista { font-size: 12px; color: var(--text3); margin: -6px 0 12px; }

.dr-p { font-size: 13px; line-height: 1.55; margin: 0 0 8px; }
.dr-nota { display: block; font-size: 11.5px; color: var(--text3); line-height: 1.5; margin: 4px 0 0; }
.dr-sub { font-size: 11px; font-weight: 700; color: var(--text2); text-transform: uppercase;
  letter-spacing: .04em; margin: 14px 0 6px; }

/* Cabeçalho do dia: quem, quando, e os quatro números que a API mandou. */
.dr-cab { padding-bottom: 14px; }
.dr-cab-top { display: flex; justify-content: space-between; align-items: flex-start;
  gap: 10px; flex-wrap: wrap; margin-bottom: 12px; }
.dr-titulo { font-family: 'Plus Jakarta Sans', sans-serif; font-size: 17px; font-weight: 700; }
.dr-chips { display: flex; gap: 6px; flex-wrap: wrap; }
/* 130px, e não mais: no celular (375px) cabem DUAS por linha — uma por linha
   empurrava a divisão, que é o que se abriu a tela para ver, para fora da tela. */
.dr-stats { display: grid; grid-template-columns: repeat(auto-fit, minmax(130px, 1fr)); gap: 10px; }
.dr-stat { background: var(--surface2); border: 1px solid var(--border); border-radius: 9px;
  padding: 10px 12px; min-width: 0; }
.dr-stat-rot { font-size: 10.5px; font-weight: 700; color: var(--text3); text-transform: uppercase;
  letter-spacing: .04em; }
.dr-stat-num { font-family: 'Plus Jakarta Sans', sans-serif; font-size: 20px; font-weight: 700;
  font-variant-numeric: tabular-nums; margin-top: 2px; overflow-wrap: anywhere; }
.dr-stat-num.dr-alerta { color: var(--warn); }
.dr-stat-pe { font-size: 11px; color: var(--text3); margin-top: 2px; }
.dr-banner { display: flex; align-items: center; justify-content: space-between;
  gap: 10px 14px; flex-wrap: wrap; margin: 12px 0 0; }
.dr-banner > div:first-child { flex: 1 1 320px; }
.dr-alerta-motor { margin: 10px 0 0; }
/* E2: duas ou mais diárias sem turno no dia — junto do "Excluir". O texto é o
   do motor (lista as diárias com os valores): quebra onde precisar. */
.dr-sem-turno { margin: 0 0 10px; overflow-wrap: anywhere; }
.dr-sem-turno .dr-nota { color: inherit; opacity: .85; }
/* Revisão da etapa 3: a escrita recusada porque o dia mudou — no topo do
   dia, com o que a tela mostrava, o que há agora e a resposta do servidor. */
.dr-aviso { margin: 0 0 12px; overflow-wrap: anywhere; }
.dr-aviso .dr-nota { color: inherit; opacity: .85; }
.dr-aviso .btn { margin-top: 6px; }

/* Duas colunas: o dia à esquerda, as diárias e o lançamento à direita. */
.dr-grid { display: grid; grid-template-columns: minmax(0, 1fr) minmax(280px, 360px);
  gap: 14px; align-items: start; }
.dr-principal { grid-column: 1; grid-row: 1; min-width: 0; }
.dr-lado { grid-column: 2; grid-row: 1; min-width: 0; }

/* A divisão: "R$ 600,00 ÷ 7 atendimentos" e as parcelas em pílulas. */
.dr-conta { display: flex; align-items: baseline; gap: 10px; flex-wrap: wrap; margin-bottom: 8px; }
.dr-conta-total { font-family: 'Plus Jakarta Sans', sans-serif; font-size: 24px; font-weight: 800;
  font-variant-numeric: tabular-nums; }
.dr-conta-op { font-size: 20px; color: var(--text3); }
.dr-conta-n { font-size: 15px; font-weight: 700; color: var(--text2); }
.dr-linha { display: flex; align-items: center; gap: 8px 12px; flex-wrap: wrap; padding: 7px 0;
  border-top: 1px solid var(--border2); font-size: 12.5px; }
.dr-linha-rot { color: var(--text2); font-weight: 600; min-width: 150px; }
.dr-parcelas { display: inline-flex; align-items: center; gap: 6px; flex-wrap: wrap; }
.dr-parcela { display: inline-flex; align-items: baseline; gap: 4px; padding: 3px 10px; border-radius: 20px;
  background: var(--brandSoft); border: 1px solid var(--brandLine); font-variant-numeric: tabular-nums; }
.dr-parcela b { font-size: 13.5px; }
.dr-e { font-size: 12px; color: var(--text3); }

/* Listas: um item por linha, separadas por fio — a base de toda lista da tela. */
.dr-lista { list-style: none; margin: 0; padding: 0; }
.dr-lista > li { padding: 10px 0; border-top: 1px solid var(--border2); }
.dr-lista > li:first-child { border-top: 0; padding-top: 2px; }

.dr-fora-item { display: flex; flex-wrap: wrap; align-items: center; gap: 4px 8px; font-size: 12.5px; }
.dr-fora-quem { font-weight: 600; }
.dr-fora-porque { flex-basis: 100%; color: var(--text2); }

/* Memória de cálculo: monoespaçada, como a da Precificação — são linhas que
   se conferem uma embaixo da outra. Quebra em vez de rolar: no celular, rolar
   para o lado para ler a conta é pior do que ler em duas linhas. */
.dr-det { margin-top: 12px; }
.dr-det summary { cursor: pointer; font-size: 12px; font-weight: 700; color: var(--text2); }
.dr-memoria { font-family: ui-monospace, 'Cascadia Mono', Consolas, monospace; font-size: 11.5px;
  line-height: 1.7; color: var(--text2); background: var(--surface2); border: 1px solid var(--border2);
  border-radius: 8px; padding: 10px 12px; margin: 8px 0 0; white-space: pre-wrap; overflow-wrap: anywhere; }

/* O dia contado em dobro: faixa de --warn na borda, para não passar batido. */
.dr-conflito { border-left: 3px solid var(--warn); }
.dr-lista > li.dr-conf-item { padding: 12px 0; }
.dr-lista > li.dr-conf-item:first-child { padding-top: 2px; }
.dr-conf-quem { display: flex; flex-wrap: wrap; align-items: center; gap: 4px 8px; font-size: 13px; }
.dr-conf-frase { font-size: 12.5px; margin: 5px 0 8px; color: var(--text); }

.dr-diaria { display: flex; align-items: center; justify-content: space-between; gap: 10px; }
.dr-diaria-corpo { min-width: 0; display: flex; flex-direction: column; align-items: flex-start; gap: 2px; }
.dr-diaria-valor { font-family: 'Plus Jakarta Sans', sans-serif; font-size: 16px; font-variant-numeric: tabular-nums; }
.dr-lista > li.dr-diaria-nova { background: var(--okBg); border-radius: 8px; padding-left: 8px; padding-right: 8px; }

.dr-form .fld { margin-bottom: 10px; }
.dr-form-para { margin: -6px 0 10px; }
.dr-ref { border: 1px dashed var(--border); border-radius: 8px; padding: 8px 10px; margin: -2px 0 10px; font-size: 12px; }
.dr-ref-tit { font-size: 10.5px; font-weight: 700; color: var(--text3); text-transform: uppercase;
  letter-spacing: .04em; margin-bottom: 3px; }
.dr-ref-linha { font-variant-numeric: tabular-nums; }
/* O aviso de excedente fica DENTRO da referência do acordo, logo abaixo da
   linha do pacote a que se refere: fora dela, pareceria aviso do dia. */
.dr-ref-aviso { margin: 5px 0 6px; padding: 6px 8px; font-size: 12px; line-height: 1.45; }
.dr-check { display: flex; align-items: center; gap: 7px; font-size: 12.5px; margin: 2px 0 12px; cursor: pointer; }
.dr-lancar { width: 100%; }

/* Atendimento do dia: hora, quem, e o custo que ele tem — tudo numa linha que
   QUEBRA em tela estreita, em vez de encolher até ficar ilegível. */
.dr-at { display: flex; align-items: center; gap: 6px 12px; flex-wrap: wrap; }
.dr-at-hora { font-weight: 700; font-variant-numeric: tabular-nums; width: 44px; flex: none; }
.dr-at-quem { flex: 1 1 200px; min-width: 0; display: flex; flex-direction: column; font-size: 12.5px; }
.dr-at-nome { font-weight: 600; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.dr-at-custo { display: flex; align-items: center; gap: 6px; flex-wrap: wrap; justify-content: flex-end;
  margin-left: auto; font-size: 12.5px; }
.dr-at-valor { font-weight: 700; font-variant-numeric: tabular-nums; }
.dr-muda { font-size: 11.5px; font-weight: 700; color: var(--warn); }
.dr-at-excluido { opacity: .6; }
.dr-at-excluido .dr-at-nome { text-decoration: line-through; }
.dr-at-conflito .dr-at-hora { color: var(--warn); }
/* D31(3)/D35: o valor gravado por conta ligada a quem trabalhou. MARCA, não
   trava — o chip e o porquê do servidor, numa linha própria abaixo da linha
   do atendimento (e dentro da diária), que quebra em tela estreita. */
.dr-at-marca { flex-basis: 100%; margin-left: 56px; min-width: 0; display: flex; flex-wrap: wrap;
  align-items: center; gap: 4px 8px; font-size: 12px; }
.dr-marca { color: var(--warn); overflow-wrap: anywhere; }
.dr-at-marca .dr-marca { margin: 0; flex-basis: 100%; }
.dr-conf-marca { display: flex; flex-wrap: wrap; align-items: center; gap: 4px 8px; margin: 0 0 8px; }
.dr-conf-marca .dr-marca { margin: 0; flex-basis: 100%; }
.dr-ligado { overflow-wrap: anywhere; }
.dr-ligado .dr-nota { color: inherit; opacity: .85; }
.dr-ligado .dr-det { margin-top: 6px; }
.dr-ligado-lista { margin: 6px 0 0; padding-left: 18px; font-size: 12px; line-height: 1.5; }
.dr-ligado-lista li + li { margin-top: 4px; }

.dr-just { margin-top: 10px; }
.dr-modal-acoes { display: flex; gap: 8px; flex-wrap: wrap; margin-top: 12px; }

@media (max-width: 900px) {
  /* Uma coluna só, com as diárias e o lançamento PRIMEIRO: é o que se abre a
     tela para fazer — e, para o profissional, é "as minhas diárias". */
  .dr-grid { grid-template-columns: minmax(0, 1fr); }
  .dr-lado, .dr-principal { grid-column: 1; grid-row: auto; }
}
@media (max-width: 560px) {
  .dr-at-custo { margin-left: 56px; justify-content: flex-start; }
  .dr-linha-rot { min-width: 0; flex-basis: 100%; }
  .dr-conta-total { font-size: 21px; }
  .dr-banner .btn-outline { width: 100%; }
}

/* ══ Custo repassado (static/custos.js) — prefixo .cs- ══════════════════════
   O custo POR ATENDIMENTO, informado pela administração (D7/D23). CARTÕES E
   LISTAS, NUNCA TABELA (D13): cada atendimento é um cartão que quebra linha em
   tela estreita. As cores são as dos tokens do sistema — "você participou" é
   o mesmo --info dos avisos, "aguarda a diária" o mesmo --warn de Diárias. */

.cs-barra { display: flex; flex-direction: column; gap: 12px; }
.cs-abas { align-self: flex-start; }
.cs-filtros { display: flex; flex-wrap: wrap; align-items: flex-end; gap: 10px 14px; }
.cs-fld-data { flex: 0 1 170px; min-width: 0; }
.cs-fld-prof { flex: 1 1 240px; min-width: 0; }
.cs-nota { display: block; font-size: 11.5px; color: var(--text3); line-height: 1.5; margin: 4px 0 0; }
.cs-p { font-size: 13px; line-height: 1.55; margin: 0 0 8px; }

/* O número da lista e o período a que ele se refere. */
.cs-resumo { display: flex; align-items: center; gap: 12px; margin: 2px 2px 12px; }
.cs-resumo-num { font-family: 'Plus Jakarta Sans', sans-serif; font-size: 26px; font-weight: 800;
  font-variant-numeric: tabular-nums; flex: none; }
.cs-resumo-txt { min-width: 0; }
.cs-resumo-rot { font-weight: 700; font-size: 14px; }

/* A lista: um cartão por atendimento. */
.cs-lista { list-style: none; margin: 0; padding: 0; }
.cs-item { padding: 14px 16px; }
.cs-item-aberto { border-color: var(--brand2); }
.cs-item-seu { border-left: 3px solid var(--info); }
/* O atendimento que o prontuário mandou abrir ("Abrir em Custo repassado"). */
.cs-item-foco { box-shadow: 0 0 0 2px var(--brand2); background: var(--brandSoft); }
.cs-item-topo { display: flex; justify-content: space-between; align-items: flex-start; gap: 8px 12px; flex-wrap: wrap; }
.cs-item-quem { flex: 1 1 220px; min-width: 0; }
.cs-item-paciente { font-weight: 700; font-size: 14px; overflow-wrap: anywhere; }
.cs-item-sub { font-size: 12px; color: var(--text2); margin-top: 2px; overflow-wrap: anywhere; }
.cs-valor { font-family: 'Plus Jakarta Sans', sans-serif; font-size: 18px; font-weight: 800;
  font-variant-numeric: tabular-nums; }
.cs-chips { display: flex; gap: 6px; flex-wrap: wrap; margin-top: 8px; }
.cs-acoes { display: flex; gap: 8px; flex-wrap: wrap; margin-top: 10px; }
.cs-explica { font-size: 12.5px; color: var(--text2); line-height: 1.5; margin: 8px 0 0; overflow-wrap: anywhere; }
.cs-linha { display: block; }
.cs-linha + .cs-linha { margin-top: 4px; }
/* Sem ação para quem pergunta: o porquê do servidor, em destaque discreto. */
.cs-motivo { margin-top: 10px; font-size: 12.5px; line-height: 1.5; color: var(--text2);
  background: var(--surface2); border: 1px solid var(--border2); border-radius: 8px; padding: 8px 10px;
  overflow-wrap: anywhere; }

/* O cartão aberto: o campo à esquerda e a sugestão AO LADO dele. Duas áreas,
   não colunas de dados — no celular uma fica embaixo da outra. */
.cs-painel { margin-top: 12px; padding-top: 12px; border-top: 1px solid var(--border2); }
.cs-editor { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); gap: 14px; align-items: start; }
.cs-editor-campo { min-width: 0; }
.cs-editor-campo .fld { margin-bottom: 10px; }
.cs-sug { min-width: 0; border: 1px dashed var(--border); border-radius: 8px; padding: 10px 12px; font-size: 12.5px; }
.cs-sug-tit { font-size: 10.5px; font-weight: 700; color: var(--text3); text-transform: uppercase; letter-spacing: .04em; }
.cs-sug-valor { font-family: 'Plus Jakarta Sans', sans-serif; font-size: 18px; font-weight: 800;
  font-variant-numeric: tabular-nums; margin: 2px 0 6px; }
.cs-usar { margin-top: 10px; }

.cs-just { margin-top: 10px; }
.cs-modal-acoes { display: flex; gap: 8px; flex-wrap: wrap; margin-top: 12px; }

/* Etapa 3. O custo que MUDOU entre o que a tela mostrou e a gravação (E5a):
   o aviso fica no cartão, com o antes e o agora do servidor. */
.cs-mudou { margin: 10px 0 0; overflow-wrap: anywhere; }
.cs-mudou .cs-nota { color: inherit; opacity: .85; }
.cs-mudou .cs-acoes { margin-top: 6px; }
/* O valor gravado x a sugestão de agora (E5c) — a diferença vem do servidor. */
.cs-diverge { margin-top: 8px; font-size: 12.5px; line-height: 1.5; color: var(--warn);
  background: var(--warnBg); border-radius: 8px; padding: 8px 10px; overflow-wrap: anywhere; }
.cs-diverge-tit { display: block; font-size: 10.5px; font-weight: 700; text-transform: uppercase; letter-spacing: .04em; }
/* D31(3)/D35: o valor gravado por conta ligada a quem participou. É MARCA, não
   trava: o texto do servidor, no cartão e na conferência, no tom de atenção. */
.cs-marca { margin-top: 8px; font-size: 12.5px; line-height: 1.5; color: var(--warn);
  background: var(--warnBg); border-radius: 8px; padding: 8px 10px; overflow-wrap: anywhere; }
.cs-marca-alerta { overflow-wrap: anywhere; }
/* D46(2): o aviso a quem foi RETIRADO da equipe do atendimento — o que gravar
   sai marcado. Aviso, não trava: tom de informação, texto do servidor. */
.cs-esteve { margin-top: 8px; font-size: 12.5px; line-height: 1.5; color: var(--info);
  background: var(--infoBg); border-radius: 8px; padding: 8px 10px; overflow-wrap: anywhere; }
/* D30: pago por período, à parte e só leitura. */
.cs-periodo { margin-top: 18px; padding-top: 12px; border-top: 1px dashed var(--border); }
.cs-periodo-cab { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; margin: 0 2px; }
.cs-periodo-tit { font-weight: 700; font-size: 14px; }
.cs-periodo > .cs-explica, .cs-periodo > .cs-nota { margin: 4px 2px 10px; }
.cs-item-periodo { background: var(--surface2); }
.cs-periodo-aviso { margin-top: 14px; }

@media (max-width: 760px) {
  .cs-editor { grid-template-columns: minmax(0, 1fr); }
}
@media (max-width: 560px) {
  .cs-fld-data { flex: 1 1 130px; }
  .cs-item { padding: 12px; }
  .cs-acoes .btn { flex: 1 1 auto; justify-content: center; }
}

/* ══ Equipe do atendimento (static/equipe.js) — prefixo .eq- ════════════════
   Janela aberta da Agenda e da Recepção (D2, D45). Lista de cartões, nunca
   tabela (D13). */
.eq-janela { display: block; }
.eq-cab { font-size: 12px; color: var(--text3); margin: 0 0 12px; }
.eq-lista { list-style: none; margin: 0 0 12px; padding: 0; display: flex; flex-direction: column; gap: 8px; }
.eq-item { display: flex; align-items: flex-start; justify-content: space-between; gap: 10px;
  padding: 10px 12px; border: 1px solid var(--border); border-radius: 10px; background: var(--surface); }
.eq-item-fora { background: var(--surface2); opacity: .85; }
.eq-item-fora .eq-nome { text-decoration: line-through; color: var(--text3); }
.eq-item-txt { min-width: 0; display: flex; flex-direction: column; align-items: flex-start; gap: 3px; }
.eq-nome { font-weight: 700; font-size: 13px; overflow-wrap: anywhere; }
.eq-sub { font-size: 12px; color: var(--text2); }
.eq-obs { font-size: 12px; color: var(--text2); font-style: italic; overflow-wrap: anywhere; }
.eq-quem { font-size: 11px; color: var(--text3); }
.eq-marca { font-size: 11.5px; color: var(--text2); line-height: 1.45; overflow-wrap: anywhere; }
.eq-vazio { font-size: 12.5px; color: var(--text3); margin: 0 0 12px; }
.eq-form { display: flex; flex-direction: column; gap: 10px; padding-top: 12px; border-top: 1px solid var(--border2); }
.eq-form .btn { align-self: flex-start; }
.eq-nota { font-size: 11.5px; color: var(--text3); line-height: 1.5; margin: 4px 0 0; }
.eq-hist { margin-top: 14px; font-size: 12.5px; }
.eq-hist summary { cursor: pointer; color: var(--text2); font-weight: 600; margin-bottom: 8px; }
@media (max-width: 560px) {
  .eq-item { flex-direction: column; }
  .eq-form .btn { align-self: stretch; justify-content: center; }
}

/* ══ Cadastros: criar e editar (static/cadastros_edicao.js) — prefixo .ce- ══
   D52. Formulário único para as seis abas. */
.ce-janela { display: block; }
.ce-form { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 10px 14px; }
.ce-form .fld { min-width: 0; }
.ce-bool { display: flex; align-items: center; gap: 7px; font-size: 13px; color: var(--text2); cursor: pointer; }
.ce-multi { display: flex; flex-direction: column; gap: 4px; max-height: 160px; overflow: auto;
  padding: 6px 8px; border: 1px solid var(--border); border-radius: 8px; }
.ce-nota { font-size: 12px; color: var(--text3); margin: 0 0 10px; }
.ce-aviso { margin-top: 12px; padding: 10px 12px; border-radius: 8px; background: var(--warnBg);
  color: var(--warn); font-size: 13px; display: flex; flex-direction: column; gap: 8px; }
.ce-aviso[hidden] { display: none; }
.ce-acoes { display: flex; gap: 8px; margin-top: 14px; }
@media (max-width: 560px) {
  .ce-form { grid-template-columns: 1fr; }
  .ce-acoes .btn { flex: 1 1 auto; justify-content: center; }
}

/* ── Escala (D58): janela da escala e horarios na marcacao ───────────── */
.es-janela { display: flex; flex-direction: column; gap: 8px; }
.es-linha { display: flex; align-items: center; justify-content: space-between; gap: 10px; flex-wrap: wrap;
  padding: 8px 10px; border: 1px solid var(--border2); border-radius: 8px; }
.es-inativa { opacity: .6; }
.es-principal { font-size: 13px; min-width: 0; flex: 1; }
.es-msg { flex-basis: 100%; font-size: 12px; color: var(--warn); font-weight: 600; }
.es-origem { flex-basis: 100%; font-size: 11px; }
.es-secao { margin-top: 10px; }
.es-ajuda { font-size: 12px; margin: 0; }
.es-dur-form { display: flex; gap: 8px; flex-wrap: wrap; align-items: center; }
.es-dur-form select { flex: 1; min-width: 180px; }
.es-dur-form input { width: 90px; }
.es-form { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 10px 14px; }
.es-form .fld { min-width: 0; }
.es-bool { display: flex; align-items: center; gap: 7px; font-size: 13px; color: var(--text2); cursor: pointer; }
.es-botoes { display: flex; gap: 8px; margin-top: 12px; }
@media (max-width: 560px) { .es-form { grid-template-columns: 1fr; } }
.ag-horarios { display: flex; flex-wrap: wrap; gap: 6px; margin: 2px 0 10px; }
.ag-horarios .alert { flex-basis: 100%; margin: 0; }
.ag-horarios-nota { font-size: 12px; color: var(--text3); margin: 0; }
.ag-slot { font: inherit; font-size: 12px; font-weight: 600; padding: 4px 9px; border-radius: 6px; cursor: pointer;
  border: 1px solid var(--border); background: var(--surface, transparent); color: var(--text); }
.ag-slot:hover { border-color: var(--accent, var(--ok)); }
.ag-slot-ocupado { opacity: .45; cursor: not-allowed; text-decoration: line-through; }
.ag-slot-escolhido { background: var(--okBg); color: var(--ok); border-color: var(--ok); }
.ag-preco { font-size: 12px; color: var(--text2); margin-top: 4px; }
.ag-convs { font-size: 12px; color: var(--text2); margin-top: 4px; }

/* ── Cancelar, remarcar e editar agendamento (agendamento_acoes.js) ───── */
.aa-motivo { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 10px 14px; }
.aa-detalhe { grid-column: 1 / -1; }
.aa-grade { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 10px 14px; align-items: end; }
.aa-grade .fld, .aa-motivo .fld { min-width: 0; }
.aa-bool { display: flex; align-items: center; gap: 7px; font-size: 13px; color: var(--text2); cursor: pointer; }
.aa-nota { font-size: 12px; color: var(--text3); margin: 6px 0 10px; }
.aa-horarios { display: flex; flex-wrap: wrap; gap: 6px; margin: 8px 0 12px; }
.aa-slot { font: inherit; font-size: 12px; font-weight: 600; padding: 4px 9px; border-radius: 6px; cursor: pointer;
  border: 1px solid var(--border); background: var(--surface); color: var(--text); }
.aa-slot-ocupado { opacity: .45; cursor: not-allowed; text-decoration: line-through; }
@media (max-width: 560px) { .aa-motivo, .aa-grade { grid-template-columns: 1fr; } }

/* ── Impressão: receita (2 vias no controle especial) e encaminhamento ─── */
.imp-rx { margin: 10px 0 14px 18px; padding: 0; font-size: 13px; }
.imp-rx li { margin-bottom: 8px; }
.imp-via { text-align: right; font-size: 11px; font-weight: 700; letter-spacing: .04em; text-transform: uppercase; color: #555; }
.imp-duplo { display: grid; grid-template-columns: 1fr 1fr; gap: 12px; margin: 14px 0; }
.imp-caixa { border: 1px solid #999; border-radius: 4px; padding: 8px 10px; }
.imp-branco { border-bottom: 1px solid #bbb; min-height: 20px; margin-top: 6px; font-size: 11px; color: #555; }
@media print { .imp-folha + .imp-folha { page-break-before: always; } }

/* ── Balcão (static/balcao.js): entrada com cobrança, conta do paciente ── */
.bc-grade { display:grid; grid-template-columns:repeat(auto-fit, minmax(150px, 1fr)); gap:10px; margin-bottom:8px; }
.bc-parte { border:1px solid var(--border); border-radius:10px; padding:10px 12px; margin:0 0 8px; background:var(--surface2); }
.bc-parte-pe { display:flex; align-items:center; justify-content:space-between; gap:8px; }
.bc-previa { margin:10px 0 0; padding:8px 10px; border-radius:8px; font-size:13px; }
.bc-previa.bc-ok { background:var(--okBg); color:var(--ok); }
.bc-previa.bc-falta { background:var(--warnBg); color:var(--warn); }
.bc-item { display:flex; align-items:center; gap:8px; flex-wrap:wrap; padding:8px 0; border-bottom:1px solid var(--border2); }
.bc-item:last-child { border-bottom:0; }
.bc-item-quem { flex:1; min-width:200px; display:flex; flex-direction:column; gap:2px; font-size:12.5px; }
.bc-item-quem span { font-size:11.5px; color:var(--text3); }
/* Desconto no balcão (onda 3 A3): bloco na cobrança e a lista de aprovação */
.bc-desc { border:1px dashed var(--border); border-radius:10px; padding:10px 12px 2px; margin:0 0 10px; }
.bc-desc-ok { color:var(--ok); }
.bc-aprov-dec summary { cursor:pointer; font-size:12px; color:var(--text2); font-weight:600; margin-top:8px; }
/* ── Caixa: rotina do turno (static/caixa.js, onda 3 A2) e cancelar entrada ── */
.cx-nota { font-size:12px; color:var(--text3); margin:0 0 10px; }
.cx-filtros { display:flex; gap:8px; flex-wrap:wrap; align-items:center; }
.cx-filtros select, .cx-filtros input { min-width:0; }
.cx-rot { display:flex; gap:6px; align-items:center; font-size:12px; color:var(--text2); font-weight:600; }
.cx-periodos { display:grid; grid-template-columns:repeat(auto-fill, minmax(260px, 1fr)); gap:10px; }
.cx-periodo { border:1px solid var(--border); border-radius:10px; padding:10px 12px; background:var(--surface2); }
.cx-periodo.cx-total { border-color:var(--primary, var(--border)); background:var(--surface); }
.cx-periodo-tit { font-weight:700; font-size:13px; margin-bottom:6px; }
.cx-periodo-linha { display:flex; justify-content:space-between; gap:10px; font-size:12px; padding:3px 0; border-top:1px dashed var(--border2); }
.cx-periodo-linha span { color:var(--text3); }
.bc-desfazer ul { margin:6px 0 0 18px; padding:0; }
.bc-desfazer li { margin:2px 0; }
@media (max-width:560px) { .cx-periodos { grid-template-columns:1fr; } }
/* ── Tabelas de preço e vigências (cadastros_edicao.js) ──────────────── */
.ce-tabela { display: flex; justify-content: space-between; align-items: center; gap: 10px; flex-wrap: wrap;
  padding: 8px 10px; border: 1px solid var(--border2); border-radius: 8px; margin-bottom: 6px; }
.ce-tabela-acoes { display: flex; gap: 6px; }
/* ── Estoque (estoque.js, D60) — prefixo eo- ─────────────────────────── */
.eo-resumo { display:grid; grid-template-columns:repeat(auto-fit,minmax(170px,1fr)); gap:12px; margin-bottom:14px; }
.eo-tile { padding:14px 16px; }
.eo-rot { font-size:11px; font-weight:700; letter-spacing:.05em; text-transform:uppercase; color:var(--text3); margin-right:6px; }
.eo-num { font-size:22px; font-weight:800; margin-top:4px; }
.eo-pe, .eo-mut { font-size:12px; color:var(--text2); }
.eo-aviso { display:flex; gap:10px; align-items:center; flex-wrap:wrap; margin-bottom:12px; }
.eo-barra { display:flex; gap:8px; align-items:center; flex-wrap:wrap; margin-bottom:12px; }
.eo-barra .field-input { width:auto; min-width:150px; }
.eo-busca { flex:1 1 220px; }
.eo-check { display:inline-flex; gap:6px; align-items:center; font-size:12.5px; color:var(--text2); margin:8px 0; }
.eo-lista { display:grid; gap:10px; }
.eo-item { padding:12px 14px; }
.eo-item-topo { display:flex; justify-content:space-between; gap:8px; align-items:center; }
.eo-item-linha { display:flex; gap:14px; flex-wrap:wrap; margin:6px 0; font-size:13px; }
.eo-chips { display:flex; gap:6px; flex-wrap:wrap; margin:4px 0; }
.eo-link { background:none; border:0; padding:0; color:var(--brand); font:inherit; font-weight:700; cursor:pointer; text-align:left; }
.eo-nome { font-size:14.5px; }
.eo-alertas { margin-bottom:14px; }
.eo-alerta-sec { margin-bottom:10px; }
.eo-alerta-tit { font-size:12px; font-weight:700; color:var(--text2); margin-bottom:4px; }
.eo-alerta { font-size:13px; padding:3px 0; }
.eo-ficha h3, .eo-form h3 { margin:0 0 8px; }
.eo-grade { display:grid; grid-template-columns:repeat(auto-fit,minmax(200px,1fr)); gap:6px 14px; margin:10px 0; font-size:13px; }
.eo-sec { font-size:12px; font-weight:800; letter-spacing:.05em; text-transform:uppercase; color:var(--text3); margin:16px 0 6px; }
.eo-lote, .eo-mov { border:1px solid var(--border2); border-radius:8px; padding:8px 10px; margin-bottom:6px; font-size:13px; }
.eo-mov-estornada { opacity:.6; }
.eo-acoes { display:flex; gap:6px; flex-wrap:wrap; margin-top:6px; }
.eo-campo { display:block; margin-bottom:8px; }
.eo-duas { display:grid; grid-template-columns:1fr 1fr; gap:8px; }
.eo-item-form { padding:10px 12px; margin-bottom:8px; }
.eo-erro { color:var(--bad); font-size:12.5px; margin:8px 0; }
@media (max-width:560px) { .eo-duas { grid-template-columns:1fr; } }

/* ── Numeração SNCR — receita controlada, D64 (sncr.js) ─────────────────── */
.sncr-amb { display: flex; flex-wrap: wrap; gap: 4px 10px; align-items: baseline; padding: 9px 13px;
  border-radius: 8px; margin-bottom: 12px; font-size: 12.5px; }
.sncr-amb-teste { background: var(--warnBg); color: var(--warn); border: 1px dashed var(--warn); }
.sncr-amb-teste b { text-transform: uppercase; letter-spacing: .03em; }
.sncr-amb > span { flex: 1 1 260px; min-width: 0; }
.sncr-amb-prod { background: var(--surface2); color: var(--text2); border: 1px solid var(--border); }
.sncr-nota { font-size: 12px; line-height: 1.55; color: var(--text3); margin: 6px 0; }
.sncr-acoes { display: flex; flex-wrap: wrap; gap: 8px; margin-top: 10px; }
.sncr-badge { margin-top: 5px; align-self: flex-start; }
.sncr-rx-badge:empty { display: none; }
.sncr-desligado .empty-title { color: var(--text2); }
.sncr-painel { min-width: 0; }
.sncr-fluxo, .sncr-pedido { max-width: 560px; }
.sncr-fluxo-msg, .sncr-pedido-erro { margin-top: 10px; }
.sncr-hist { margin-top: -4px; }
.sncr-lotes .sncr-lote:last-child { margin-bottom: 0; }

.sncr-tipos { display: grid; grid-template-columns: repeat(auto-fill, minmax(190px, 1fr)); gap: 12px; margin-bottom: 14px; }
.sncr-tipo { display: flex; flex-direction: column; gap: 3px; padding: 14px; background: var(--surface);
  border: 1px solid var(--border); border-radius: 10px; box-shadow: var(--shadow); min-width: 0; }
.sncr-tipo .btn { margin-top: 8px; align-self: flex-start; }
.sncr-tipo-incerta { border-color: var(--bad); box-shadow: inset 3px 0 0 var(--bad); }
.sncr-tipo-cab { display: flex; align-items: baseline; gap: 7px; min-width: 0; }
.sncr-sigla { font-weight: 800; font-size: 13px; color: var(--brand); }
.sncr-tipo-nome { font-size: 11.5px; color: var(--text2); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.sncr-tipo-num { font-family: 'Plus Jakarta Sans', sans-serif; font-size: 26px; font-weight: 700; letter-spacing: -.02em; margin-top: 4px; }
.sncr-tipo-rot { font-size: 11px; font-weight: 700; color: var(--text3); text-transform: uppercase; letter-spacing: .04em; }
.sncr-tipo-det { font-size: 11.5px; color: var(--text3); }
.sncr-cota { font-size: 12px; font-weight: 700; color: var(--text2); }
.sncr-trava { font-size: 11.5px; color: var(--bad); }

.sncr-incerta { background: var(--badBg); color: var(--bad); border: 1px solid var(--bad);
  box-shadow: inset 4px 0 0 var(--bad); border-radius: 8px; padding: 11px 14px; margin-bottom: 12px; font-size: 12.5px; }
.sncr-incerta p { margin: 5px 0; }
.sncr-incerta-tit { font-weight: 800; }
.sncr-incerta-det { color: var(--text2); font-size: 12px; }
.sncr-incerta-msg { font-weight: 700; }
.sncr-resolver { margin-top: 8px; color: var(--text); }
.sncr-resolver summary { cursor: pointer; font-weight: 700; color: var(--bad); }
.sncr-resolver .fld { margin-top: 8px; }
.sncr-check { display: flex; gap: 7px; align-items: center; margin-top: 10px; font-size: 12.5px; }
.sncr-faixa { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 0 12px; }

.sncr-secao .card-title { margin-bottom: 10px; }
.sncr-lote { border: 1px solid var(--border2); border-radius: 8px; padding: 9px 11px; margin-bottom: 8px; }
.sncr-lote-cab { display: flex; flex-wrap: wrap; align-items: center; gap: 6px 10px; font-size: 12.5px; }
.sncr-lote-faixa { font-family: ui-monospace, 'Cascadia Mono', Consolas, monospace; font-weight: 700; }
.sncr-lote-disp { margin-left: auto; }
.sncr-lote-msg { font-size: 11.5px; margin-top: 4px; }
.sncr-lote-corpo { margin-top: 10px; border-top: 1px solid var(--border2); padding-top: 10px; }
.sncr-lote-filtro { display: flex; align-items: center; gap: 8px; margin-bottom: 8px; }
.sncr-lote-filtro select { width: auto; }
.sncr-nums { max-height: 360px; overflow-y: auto; }
.sncr-num { display: flex; flex-wrap: wrap; align-items: center; gap: 6px 10px; padding: 5px 2px;
  border-bottom: 1px solid var(--border2); font-size: 12.5px; }
.sncr-num:last-child { border-bottom: 0; }
.sncr-num-val { font-family: ui-monospace, 'Cascadia Mono', Consolas, monospace; min-width: 110px; }
.sncr-num-det { flex: 1; min-width: 0; font-size: 11.5px; overflow-wrap: anywhere; }
.sncr-inut { display: flex; flex-wrap: wrap; gap: 6px; align-items: center; }
.sncr-inut input { min-width: 220px; }

.sncr-hist-linha { display: grid; grid-template-columns: 60px 150px 150px 120px minmax(0, 1fr) auto; gap: 10px;
  align-items: center; padding: 7px 0; border-bottom: 1px solid var(--border2); font-size: 12.5px; }
.sncr-hist-linha:last-child { border-bottom: 0; }
.sncr-hist-id { font-weight: 700; color: var(--text2); }
.sncr-hist-msg { font-size: 11.5px; color: var(--text3); overflow-wrap: anywhere; }

.sncr-govbr { display: flex; flex-wrap: wrap; align-items: center; gap: 10px; margin: 12px 0; }
.sncr-btn-govbr { font-size: 14px; padding: 10px 20px; }
.sncr-tempo { font-size: 12.5px; font-weight: 700; color: var(--text2); font-variant-numeric: tabular-nums; }
.sncr-qtd { margin-bottom: 10px; max-width: 220px; }

@media (max-width: 720px) {
  .sncr-hist-linha { grid-template-columns: 60px minmax(0, 1fr); row-gap: 3px; }
  .sncr-hist-linha > span:nth-child(n+3) { grid-column: 2; }
  .sncr-faixa { grid-template-columns: 1fr; }
  .sncr-lote-disp { margin-left: 0; }
}

/* ── Tarja de ambiente (BANNER_AMBIENTE · static/env-banner.js) ─────── */
/* Só existe na homologação: a faixa é fixa no topo e o env-banner.js mede a
   altura dela em --tarja-h (no celular o texto quebra em duas linhas). A
   barra lateral e a barra do topo são sticky em top:0 — sem isto passariam
   POR BAIXO da faixa. Em produção a classe nunca aparece. */
body.com-tarja .lt-app { min-height: calc(100vh - var(--tarja-h, 30px)); }
body.com-tarja .sidebar { top: var(--tarja-h, 30px); height: calc(100vh - var(--tarja-h, 30px)); }
body.com-tarja .topbar { top: var(--tarja-h, 30px); }
body.com-tarja .login-screen { top: var(--tarja-h, 30px); }
@media (max-width: 820px) {
  /* No celular a barra lateral vira a barra INFERIOR fixa: fica onde está. */
  body.com-tarja .sidebar { top: auto; height: auto; }
}

/* ── Receita eletrônica — emissão, D64 etapa 9 (atendimento.js) ─────────── */
.rxe-meio-nota { font-size: 11.5px; line-height: 1.45; color: var(--warn); margin-top: 3px; }
.rxe-modal { margin-bottom: 10px; }
.rxe-modal .alert { margin-bottom: 8px; }
.rxe-sem-numero .rxe-acoes-linha { margin-top: 8px; }
.rxe-acoes-linha { display: flex; flex-wrap: wrap; gap: 8px; margin-top: 10px; }
.rxe-nota { font-size: 12px; line-height: 1.55; color: var(--text3); margin: 6px 0 10px; }
.rxe-check { display: flex; gap: 8px; align-items: flex-start; font-size: 12.5px; margin: 4px 0 8px; }
.rxe-check input { margin-top: 2px; }
.rxe-cab { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; margin-bottom: 8px; }
.rxe-acoes { margin-left: auto; display: flex; flex-wrap: wrap; gap: 6px; align-items: center; }
.rxe-selo { white-space: normal; }
.rxe-num { display: flex; flex-wrap: wrap; align-items: baseline; gap: 4px 10px; margin: 0 0 10px; }
.rxe-rot { font-size: 11px; font-weight: 700; letter-spacing: .03em; text-transform: uppercase; color: var(--text3); }
.rxe-numero { font-family: ui-monospace, 'Cascadia Mono', Consolas, monospace; font-size: 16px; font-weight: 700;
  color: var(--text); overflow-wrap: anywhere; user-select: all; }
.rxe-aviso { margin: 0 0 10px; }
.rxe-card { min-width: 0; }
.rxe-so-agora { margin: 0 0 10px; }
.rxe-pend { margin: 6px 0 0 18px; padding: 0; }
.rxe-pend li { margin: 2px 0; }
.rxe-entrega { margin-top: 12px; padding: 12px 14px; border: 1px solid var(--border); border-radius: 10px;
  background: var(--surface2); }
.rxe-entrega-cab { display: flex; align-items: center; gap: 8px; justify-content: space-between; margin-bottom: 8px; }
.rxe-entrega-erro { margin-top: 12px; }
.rxe-entrega-grade { display: grid; grid-template-columns: minmax(0, 1fr) auto; gap: 10px 16px; align-items: end; }
.rxe-campo { display: flex; flex-direction: column; gap: 4px; min-width: 0; }
.rxe-link-linha { display: flex; gap: 6px; min-width: 0; }
.rxe-link { flex: 1; min-width: 0; font-family: ui-monospace, 'Cascadia Mono', Consolas, monospace; font-size: 12px;
  padding: 7px 9px; border: 1px solid var(--border); border-radius: 7px; background: var(--surface); color: var(--text); }
.rxe-codigo { font-family: ui-monospace, 'Cascadia Mono', Consolas, monospace; font-size: 22px; font-weight: 700;
  letter-spacing: .12em; color: var(--text); user-select: all; }
.rxe-canais { display: flex; flex-wrap: wrap; gap: 6px 16px; margin-top: 8px; font-size: 12px; color: var(--text2); }
.rxe-canais .chip { margin-left: 4px; white-space: normal; }

@media (max-width: 560px) {
  .rxe-entrega-grade { grid-template-columns: 1fr; }
  .rxe-acoes { margin-left: 0; }
}
