/* ==========================================================
   WINE - Sistema de design
   Reskin do Bootstrap 5.3 via variaveis CSS (theming nativo):
   ao sobrescrever --bs-primary, --bs-body-bg, --bs-border-radius etc,
   todo componente Bootstrap (botoes, links, foco de formulario,
   badges) se atualiza automaticamente, sem precisar trocar classe
   por classe em cada tela.
   ========================================================== */

:root {
  /* Paleta */
  --wine-primary: #7A1F3D;
  --wine-primary-dark: #4C1226;
  --wine-primary-darker: #350B1A;
  --wine-primary-rgb: 122, 31, 61;
  --wine-ink: #21252B;
  --wine-muted: #6B7280;
  --wine-bg: #F6F6F8;
  --wine-surface: #FFFFFF;
  --wine-border: #E3E5E8;
  --sidebar-width: 232px;

  /* Reskin do Bootstrap */
  --bs-primary: var(--wine-primary);
  --bs-primary-rgb: var(--wine-primary-rgb);
  --bs-link-color: var(--wine-primary);
  --bs-link-color-rgb: var(--wine-primary-rgb);
  --bs-link-hover-color: var(--wine-primary-dark);
  --bs-body-bg: var(--wine-bg);
  --bs-body-color: var(--wine-ink);
  --bs-body-font-family: 'Inter', system-ui, -apple-system, sans-serif;
  --bs-border-radius: .5rem;
  --bs-border-radius-sm: .375rem;
  --bs-border-radius-lg: .625rem;
  --bs-border-color: var(--wine-border);
  --bs-secondary-color: var(--wine-muted);
}

body {
  font-feature-settings: "cv02", "cv03", "cv04", "cv11";
}

h1, h2, h3, .sidebar-brand, .brand-serif {
  font-family: 'Fraunces', Georgia, serif;
  font-weight: 600;
  letter-spacing: -0.01em;
}

h3 { margin-bottom: 1.25rem; }

a { text-decoration: none; }
a:hover { text-decoration: underline; }

/* ================================================================
   ESTRUTURA GERAL: sidebar fixa + topbar fina + conteudo
   ================================================================ */
.app-shell {
  display: flex;
  min-height: 100vh;
}

.sidebar-toggle-checkbox { display: none; }
.sidebar-overlay { display: none; }

.app-sidebar {
  width: var(--sidebar-width);
  flex-shrink: 0;
  background: var(--wine-primary-darker);
  color: rgba(255,255,255,.85);
  display: flex;
  flex-direction: column;
  padding: 1.25rem 1rem;
  position: sticky;
  top: 0;
  height: 100vh;
  overflow-y: auto;
}

.sidebar-brand {
  color: #fff;
  font-size: 1.5rem;
  font-style: italic;
  text-decoration: none;
  display: block;
  margin: .25rem 0 1.75rem .5rem;
}
.sidebar-brand-img {
  background: #fff;
  padding: .5rem .85rem;
  border-radius: 10px;
  max-width: 100%;
  height: auto;
  display: block;
}

.sidebar-nav {
  display: flex;
  flex-direction: column;
  gap: .1rem;
  flex: 1;
}

.sidebar-link {
  display: flex;
  align-items: center;
  gap: .65rem;
  color: rgba(255,255,255,.72);
  text-decoration: none;
  padding: .6rem .75rem;
  border-radius: 8px;
  font-size: .9rem;
  font-weight: 500;
  transition: background .12s ease, color .12s ease;
}
.sidebar-link svg { flex-shrink: 0; opacity: .85; }
.sidebar-link:hover { background: rgba(255,255,255,.07); color: #fff; text-decoration: none; }
.sidebar-link.active { background: var(--wine-primary); color: #fff; }

.sidebar-link-sm {
  font-size: .84rem;
  padding: .45rem .75rem .45rem 1.65rem;
  font-weight: 400;
}

.sidebar-section-label {
  text-transform: uppercase;
  font-size: .68rem;
  font-weight: 600;
  letter-spacing: .06em;
  color: rgba(255,255,255,.4);
  margin: 1.25rem 0 .35rem .75rem;
}

.sidebar-footer {
  border-top: 1px solid rgba(255,255,255,.1);
  padding-top: .85rem;
  margin-top: .75rem;
  display: flex;
  flex-direction: column;
  padding-left: .5rem;
}
.sidebar-user { color: #fff; font-size: .85rem; font-weight: 600; }
.sidebar-user-perfil { color: rgba(255,255,255,.5); font-size: .75rem; text-transform: capitalize; }

.app-main {
  flex: 1;
  min-width: 0;
  display: flex;
  flex-direction: column;
}

.app-topbar {
  height: 58px;
  display: flex;
  align-items: center;
  padding: 0 1.5rem;
  background: var(--wine-surface);
  border-bottom: 1px solid var(--bs-border-color);
  position: sticky;
  top: 0;
  z-index: 20;
}
.topbar-spacer { flex: 1; }
/* 2.8.42 - Faixa de dicas rotativas (public/js/dicas-topo.js): ocupa o
   espaco entre a busca e o nome do usuario; texto de uma linha, cortado com
   "..." quando nao cabe (a dica inteira aparece no balao ao passar o mouse).
   Some em tela estreita (celular/tablet em pe), onde o topo ja fica apertado. */
.topbar-dicas {
  flex: 0 1 760px; min-width: 0; margin: 0 1rem;
  display: flex; align-items: center; justify-content: center; gap: .55rem;
  padding: .3rem .75rem; border-radius: 999px;
  background: rgba(var(--wine-primary-rgb), .06);
  border: 1px solid rgba(var(--wine-primary-rgb), .14);
  color: var(--wine-ink); font-size: .82rem; cursor: pointer;
  transition: background .2s;
}
.topbar-dicas[hidden] { display: none; }
.topbar-dicas:hover, .topbar-dicas:focus { background: rgba(var(--wine-primary-rgb), .11); outline: none; }
.topbar-dicas:focus-visible { outline: 2px solid var(--wine, #B3222E); outline-offset: 2px; } /* 2.8.71 (revisão T06): contorno visível no teclado */
.topbar-dicas-rotulo {
  flex-shrink: 0; display: inline-flex; align-items: center; gap: .25rem;
  color: var(--wine-primary); font-weight: 600; font-size: .72rem;
  text-transform: uppercase; letter-spacing: .04em;
}
.topbar-dicas-texto {
  min-width: 0; white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
  transition: opacity .25s;
}
.topbar-dicas.trocando .topbar-dicas-texto { opacity: 0; }
/* 2.8.44: o espaco flexivel (topbar-spacer) continua empurrando nome, sino
   e perfil pro canto DIREITO da tela - antes ele era zerado aqui e esses
   itens ficavam no meio em tela larga. */
@media (max-width: 991.98px) { .topbar-dicas { display: none !important; } }
/* 2.8.45 - Pedido do Fernando: dica CENTRALIZADA entre a busca e o nome.
   Em tela larga a faixa usa margem automatica dos dois lados (fica no meio
   do espaco livre) e o espacador some - a margem da direita e que continua
   empurrando nome, sino e perfil pro canto direito. So vale >= 992px: abaixo
   disso a faixa nao aparece e o espacador continua fazendo o trabalho dele. */
@media (min-width: 992px) {
  .topbar-dicas:not([hidden]) { margin-left: auto; margin-right: auto; }
  .topbar-dicas:not([hidden]) + .topbar-spacer { display: none; }
  /* folga minima entre a dica e os vizinhos quando a tela e mais estreita */
  .topbar-busca { margin-right: 1rem; }
  .topbar-actions { margin-left: 1rem; }
}
.topbar-busca { width: 260px; margin-left: 1rem; flex-shrink: 0; }
@media (max-width: 575.98px) { .topbar-busca { display: none; } }
.topbar-menu-btn {
  display: none;
  color: var(--wine-ink);
  cursor: pointer;
  padding: .3rem;
}
.topbar-actions { display: flex; align-items: center; gap: .35rem; }
.topbar-icon-btn {
  color: var(--wine-ink);
  position: relative;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 36px;
  height: 36px;
  border-radius: 999px;
  text-decoration: none;
}
.topbar-icon-btn:hover { background: var(--wine-bg); }

.app-content {
  padding: 1.75rem 2rem 3rem;
  flex: 1;
  max-width: 1600px;
  width: 100%;
}

/* Sidebar responsiva: escondida em telas menores, aberta via checkbox */
@media (max-width: 991.98px) {
  .app-sidebar {
    position: fixed;
    left: calc(-1 * var(--sidebar-width));
    top: 0;
    z-index: 1050;
    transition: left .2s ease;
  }
  #sidebar-toggle:checked ~ .app-sidebar { left: 0; }
  #sidebar-toggle:checked ~ .sidebar-overlay {
    display: block;
    position: fixed;
    inset: 0;
    background: rgba(0,0,0,.35);
    z-index: 1040;
  }
  .topbar-menu-btn { display: inline-flex; }
  .app-content { padding: 1.25rem 1rem 2.5rem; }
}

/* ---------------- Auth (login) ---------------- */
.auth-shell {
  min-height: 100vh;
  display: flex;
  align-items: center;
  justify-content: center;
  padding: 1.5rem;
}

/* ---------------- Notificacoes ---------------- */
.badge-sininho {
  display: inline-block;
  background: #B3222E;
  color: #fff;
  border-radius: 999px;
  font-size: .63rem;
  font-weight: 700;
  padding: .05em .4em;
  position: absolute;
  top: 2px;
  right: 2px;
  line-height: 1.3;
  border: 1.5px solid #fff;
}
.dropdown-toggle-no-caret::after { display: none; }
.dropdown-notificacoes {
  width: 340px;
  max-height: 420px;
  overflow-y: auto;
}
.notif-item {
  white-space: normal;
  border-left: 3px solid transparent;
}
.notif-item.notif-nao-lida {
  background: #FBF6F0;
  border-left-color: var(--wine-primary);
}
.dropdown-menu {
  border: 1px solid var(--bs-border-color);
  box-shadow: 0 8px 24px rgba(20,10,15,.1);
}

/* ---------------- Tabelas largas sem quebra feia ---------------- */
.table td, .table th { white-space: nowrap; }
.table td.celula-descricao { white-space: normal; max-width: 320px; }

/* Tabela "Informacoes do chamado" - a descricao pode ser bem longa
   (link/texto colado sem espaco), sem quebra isso estourava a largura da
   tela inteira e empurrava o painel de Acoes pra baixo. */
.resumo-chamado-info table { table-layout: fixed; width: 100%; }
.resumo-chamado-info table td { white-space: normal; word-break: break-word; overflow-wrap: break-word; }
.resumo-chamado-info table th { width: 130px; white-space: nowrap; }

/* ---------------- Manual de uso (conteudo vindo de Markdown) ---------------- */
.manual-conteudo { max-width: 860px; }
.manual-conteudo h1 { font-size: 1.75rem; margin-bottom: 1rem; }
.manual-conteudo h2 { font-size: 1.35rem; margin-top: 2rem; border-bottom: 1px solid var(--bs-border-color); padding-bottom: .4rem; }
.manual-conteudo h3 { font-size: 1.1rem; margin-top: 1.5rem; }
.manual-conteudo p, .manual-conteudo li { line-height: 1.6; }
.manual-conteudo code { background: #EEEFF1; padding: .1em .35em; border-radius: 4px; font-size: .9em; }
.manual-conteudo pre { background: #F5F5F5; border: 1px solid var(--bs-border-color); border-radius: 6px; padding: 1rem; overflow-x: auto; }
.manual-conteudo hr { margin: 2rem 0; }
.manual-conteudo table { width: 100%; margin-bottom: 1.5rem; }
.manual-conteudo table, .manual-conteudo th, .manual-conteudo td { border: 1px solid var(--bs-border-color); border-collapse: collapse; }
.manual-conteudo th, .manual-conteudo td { padding: .5rem .75rem; }

/* ---------------- Cards / tabelas ---------------- */
.card {
  box-shadow: 0 1px 2px rgba(20,10,15,.04);
  border: 1px solid var(--bs-border-color);
}

.table {
  --bs-table-bg: transparent;
}
.table th {
  font-size: .78rem;
  text-transform: none;
  color: var(--wine-muted);
  font-weight: 600;
  border-bottom-width: 1px;
}

/* ---------------- Cards do Dashboard (com icone) ---------------- */
.stat-card {
  border: 1px solid var(--bs-border-color);
  border-radius: var(--bs-border-radius-lg);
  background: var(--wine-surface);
  padding: 1.1rem 1.25rem;
  display: flex;
  align-items: center;
  gap: .9rem;
  height: 100%;
}
.stat-card-icon {
  width: 42px;
  height: 42px;
  border-radius: 10px;
  display: flex;
  align-items: center;
  justify-content: center;
  flex-shrink: 0;
  background: #EAE6F3;
  color: var(--wine-primary);
}
.stat-card-icon.icon-danger { background: #FBE7E9; color: #B3222E; }
.stat-card-icon.icon-success { background: #E4F3EA; color: #1E7A46; }
.stat-card-icon.icon-info { background: #E7F0FB; color: #1D5BA6; }
.stat-card-icon.icon-warning { background: #FBF0DC; color: #8A5A00; }
.stat-card-label { color: var(--wine-muted); font-size: .8rem; margin-bottom: .1rem; }
.stat-card-value { font-size: 1.6rem; font-weight: 700; line-height: 1.15; font-family: 'Fraunces', Georgia, serif; }
.stat-card.stat-card-alerta { border-color: #F3C6CB; }
.stat-card.stat-card-alerta .stat-card-value { color: #B3222E; }

/* Container de altura fixa pro Chart.js - sem isso, o grafico cresce sem
   limite e fica desalinhado com os outros cards da mesma linha. */
.chart-box { position: relative; height: 260px; width: 100%; }

/* ---------------- Badges de status (tons abafados, nao o padrao saturado do Bootstrap) ---------------- */
.badge-status {
  display: inline-block;
  padding: .3em .65em;
  border-radius: 999px;
  font-size: .78rem;
  font-weight: 600;
}
.badge-status.status-aberto       { background: #EEEFF1; color: #52565C; }
.badge-status.status-direcionado  { background: #E7F0FB; color: #1D5BA6; }
.badge-status.status-aceito       { background: #EAE6F3; color: var(--wine-primary); }
.badge-status.status-recusado     { background: #FBE7E9; color: #B3222E; }
.badge-status.status-em_deslocamento { background: #FDF1E3; color: #A15C00; }
.badge-status.status-no_local     { background: #E3F1FB; color: #0C6690; }
.badge-status.status-em_atendimento { background: #E4F3EA; color: #1E7A46; }
.badge-status.status-interrompido { background: #FBF0DC; color: #8A5A00; }
.badge-status.status-concluido    { background: #EAE6F3; color: var(--wine-primary-dark); }
.badge-status.status-cancelado    { background: #F1F1F1; color: #8A8D93; }

.badge-criticidade {
  display: inline-block;
  padding: .3em .65em;
  border-radius: 999px;
  font-size: .78rem;
  font-weight: 600;
  background: #EEEFF1;
  color: #52565C;
}
.badge-criticidade.crit-alta,
.badge-criticidade.crit-critica {
  background: #FBE7E9;
  color: #B3222E;
}

/* ---------------- Login ---------------- */
.login-card {
  background: var(--wine-surface);
  border: 1px solid var(--bs-border-color);
  border-radius: var(--bs-border-radius-lg);
  padding: 2.5rem 2rem;
  box-shadow: 0 12px 32px rgba(20,10,15,.08);
  width: 100%;
  max-width: 380px;
}
/* 2.8.46: logo oficial no topo do cartão de login */
.login-card .login-logo { margin: 0; line-height: 1; }
.login-card .login-logo img { max-width: 220px; width: 100%; height: auto; display: inline-block; }
.login-card h2 {
  font-style: italic;
  color: var(--wine-primary-dark);
}

/* ---------------- Assinatura ---------------- */
canvas.assinatura {
  touch-action: none;
  cursor: crosshair;
  border: 1px solid var(--bs-border-color);
  border-radius: var(--bs-border-radius);
  background: #fff;
  max-width: 100%;
}

/* ---------------- Utilidades ---------------- */
.btn { font-weight: 500; }
.btn-teal { background: #0d9488; border-color: #0d9488; color: #fff; }
.btn-teal:hover { background: #0f766e; border-color: #0f766e; color: #fff; }
.btn-roxo { background: #6f42c1; border-color: #6f42c1; color: #fff; }
.btn-roxo:hover { background: #5a34a0; border-color: #5a34a0; color: #fff; }

/* Icone de ajuda (?) - fica do lado de rotulos de campo, com o texto explicativo no title */
.ajuda-icone {
  display: inline-flex; align-items: center; justify-content: center;
  width: 16px; height: 16px; border-radius: 50%;
  background: var(--wine-bg); color: var(--wine-muted);
  font-size: .7rem; font-weight: 700; cursor: help;
  border: 1px solid var(--bs-border-color); margin-left: .3rem;
  font-style: italic; font-family: Georgia, 'Times New Roman', serif;
  vertical-align: middle; user-select: none; flex-shrink: 0;
  /* 2.8.41: o "i" virou tocavel (celular) - area de toque maior sem
     aumentar o desenho, e destaque ao focar/passar o mouse */
  position: relative;
}
.ajuda-icone::after { content: ''; position: absolute; inset: -8px; }
.ajuda-icone:hover, .ajuda-icone:focus {
  color: #fff; background: var(--wine-primary); border-color: var(--wine-primary); outline: none;
}
/* "i" de campo sem rotulo (so tem o texto de exemplo dentro): fica DENTRO
   do campo, no canto direito (ver colocarDentro em ajuda-campos.js) */
.ajuda-dentro { position: relative; }
.ajuda-dentro > .ajuda-icone {
  position: absolute; right: .55rem; top: 50%; transform: translateY(-50%);
  margin: 0; z-index: 3; background: #fff;
}
.ajuda-dentro.ajuda-dentro-topo > .ajuda-icone { top: .6rem; transform: none; }
.ajuda-dentro.ajuda-dentro-select > .ajuda-icone { right: 2.2rem; }
.com-ajuda-dentro { padding-right: 2rem !important; }
.ajuda-dentro-select > .com-ajuda-dentro { padding-right: 3.6rem !important; }
/* caixas coladas (input-group): o "i" fica logo depois, na mesma linha */
.ajuda-solto { margin-left: .35rem; align-self: center; }

/* Botao de evidencia com largura fixa - assim a coluna de acoes fica alinhada
   quer o chamado tenha foto ou nao */
.btn-evidencia { min-width: 58px; }

/* ---------------- Busca livre (Equipamento/Fabricante/Modelo) ---------------- */
.busca-livre-wrapper { position: relative; }
[data-multi-select] { position: relative; }
.multi-select-menu {
  position: absolute;
  top: 100%; left: 0; right: 0;
  z-index: 50;
  background: #fff;
  border: 1px solid var(--bs-border-color);
  border-radius: var(--bs-border-radius);
  box-shadow: 0 8px 20px rgba(20,10,15,.12);
  padding: .5rem;
  max-height: 260px;
  overflow-y: auto;
}
.multi-select-menu label {
  display: block;
  padding: .35rem .5rem;
  border-radius: 6px;
  font-size: .9rem;
  cursor: pointer;
}
.multi-select-menu label:hover { background: var(--wine-bg); }
.multi-select-menu input[type=checkbox] { margin-right: .5rem; }

/* ---------------- Aviso de tecnico em pausa ---------------- */
.aviso-pausa {
  background: #FDF1E3;
  color: #8A5A00;
  border-bottom: 1px solid #F3D9A8;
  padding: .5rem 1.5rem;
  font-size: .85rem;
  text-align: center;
}

/* ---------------- Flatpickr (calendarios) - modelo claro e simples ---------------- */
.flatpickr-calendar {
  box-shadow: 0 8px 24px rgba(20,10,15,.15);
  border-radius: 10px;
  border: 1px solid var(--bs-border-color);
}
.flatpickr-day.selected, .flatpickr-day.selected:hover {
  background: var(--wine-primary);
  border-color: var(--wine-primary);
  color: #fff;
}
.flatpickr-day.today { border-color: var(--wine-primary); }
.flatpickr-day:hover { background: var(--wine-bg); }
.flatpickr-time input:hover, .flatpickr-time .flatpickr-am-pm:hover { background: var(--wine-bg); }
/* Cabecalho claro (nao mais vermelho-escuro) - texto normal, so o mes/ano em destaque */
.flatpickr-months { padding-top: .4rem; }
.flatpickr-current-month input.cur-year,
.flatpickr-current-month .flatpickr-monthDropdown-months,
.flatpickr-months .flatpickr-month { color: var(--bs-body-color); font-weight: 600; }
.flatpickr-months .flatpickr-prev-month, .flatpickr-months .flatpickr-next-month { fill: var(--wine-primary); }
span.flatpickr-weekday { color: var(--wine-muted); font-weight: 600; }

/* ---------------- Select buscavel (loja, tecnico etc) ---------------- */
.select-buscavel-wrapper { position: relative; }
.select-buscavel-lista {
  position: absolute;
  top: 100%;
  left: 0;
  right: 0;
  z-index: 50;
  background: #fff;
  border: 1px solid var(--bs-border-color);
  border-radius: var(--bs-border-radius);
  box-shadow: 0 8px 20px rgba(20,10,15,.12);
  max-height: 220px;
  overflow-y: auto;
  margin-top: 2px;
}
.select-buscavel-item {
  display: block;
  width: 100%;
  text-align: left;
  padding: .5rem .75rem;
  border: none;
  background: none;
  font-size: .9rem;
}
.select-buscavel-item:hover { background: var(--wine-bg); }
.select-buscavel-item-desabilitada {
  text-decoration: line-through;
  color: var(--wine-muted);
  cursor: not-allowed;
}
.select-buscavel-item-desabilitada:hover { background: none; }

/* ---------------- Linha de tabela clicavel ---------------- */
.linha-clicavel { cursor: pointer; }
.linha-clicavel:hover { background: var(--wine-bg); }

/* ---------------- Timeline de historico ---------------- */
.timeline-item { font-size: .82rem; padding: .4rem 0; border-bottom: 1px dashed var(--bs-border-color); }
.timeline-item:last-child { border-bottom: none; }
.timeline-item .timeline-acao { font-weight: 600; }
.timeline-item .timeline-data { color: var(--wine-muted); font-size: .75rem; }

/* ---------------- Botoes flutuantes (atalhos) ---------------- */
.fab-container {
  position: fixed;
  right: 1.5rem;
  bottom: 1.5rem;
  display: flex;
  flex-direction: column;
  gap: .75rem;
  z-index: 900;
}
.fab-btn {
  width: 52px;
  height: 52px;
  border-radius: 50%;
  display: flex;
  align-items: center;
  justify-content: center;
  box-shadow: 0 6px 18px rgba(20,10,15,.22);
  text-decoration: none;
  transition: transform .12s ease;
}
.fab-btn:hover { transform: translateY(-2px); text-decoration: none; }
.fab-btn-primary { background: var(--wine-primary); color: #fff; }
.fab-btn-secundario { background: #fff; color: var(--wine-primary); border: 1px solid var(--bs-border-color); }
@media (max-width: 575.98px) {
  .fab-container { right: 1rem; bottom: 1rem; }
  .fab-btn { width: 48px; height: 48px; }
}

/* Campo de busca dentro do multi-select (Causa do Defeito, Pendente Aguardando) */
.multi-select-busca { margin-bottom: .5rem; }

/* ==========================================================================
   BASE RESPONSIVA - celular e tablet                            (2.5.14)
   --------------------------------------------------------------------------
   Este bloco fica NO FIM do arquivo de proposito: ele so ACRESCENTA regras
   e nao reescreve nada do que ja existia acima. Assim, se algo aqui
   incomodar, da pra apagar o bloco inteiro e o sistema volta exatamente ao
   que era.

   As tres larguras usadas como referencia (as mesmas da bateria de teste):
     390px  celular  (iPhone 12/13/14, Galaxy S)
     820px  tablet   (iPad em pe)
     1366px monitor  (notebook)
   ========================================================================== */

/* ---------------------------------------------------------------- 1) TABELA
   A regra ".table td, .table th { white-space: nowrap }" la de cima existe
   pra tabela nao ficar com palavra quebrada no meio - e isso esta certo no
   monitor. Num celular de 390px, porem, a mesma regra faz a tabela ficar
   mais larga que a tela: media 552px a mais na de Pendencias e 694px na de
   Auditoria.

   A saida NAO e apertar a tabela (as colunas se sobrepoem e viram aquela
   papa ilegivel). E dar a ela uma CAIXA COM ROLAGEM PROPRIA: a pagina fica
   parada e so a tabela desliza pro lado com o dedo. Quem cria essa caixa em
   volta de cada tabela e um pedacinho de JavaScript no rodape - assim vale
   pras 50 telas de uma vez, e as telas novas ja nascem certas. */
.table-rolavel {
  width: 100%;
  overflow-x: auto;
  -webkit-overflow-scrolling: touch;   /* rolagem com inercia no iPhone */
}
/* A sombrinha na borda direita avisa que tem mais coisa pro lado - sem ela
   muita gente nao descobre que da pra arrastar. */
.table-rolavel.tem-mais-a-direita {
  background-image: linear-gradient(to left, rgba(20,10,15,.10), rgba(20,10,15,0) 26px);
  background-position: right center;
  background-repeat: no-repeat;
  background-size: 26px 100%;
}
.table-rolavel > .table { margin-bottom: .5rem; }

@media (max-width: 991.98px) {
  /* Dentro da caixa, a tabela pode voltar a ter a largura natural dela.
     Sem isso, "table-layout: fixed" + "width: 100%" continuariam espremendo
     as colunas ate elas se sobreporem - a rolagem existiria e nao serviria
     pra nada. O minimo real e calculado por coluna la no rodape. */
  .table-rolavel > .table { width: auto; min-width: 100%; }
}

/* ------------------------------------------------------- 2) ALVO DE TOQUE
   Dedo nao e ponteiro de mouse. O minimo recomendado e 44px de altura; o
   sistema tinha 36 botoes abaixo de 38px so na lista de chamados.
   Vale por LARGURA, nao por "pointer: coarse". A primeira versao usava o
   pointer, que e o jeito mais correto no papel - so que so aparelho de
   verdade reporta isso, entao a bateria de teste nao conseguia PROVAR que a
   regra pegou, e regra que o teste nao alcanca e regra que quebra calada.
   Abaixo de 992px o menu lateral ja vira gaveta, ou seja, o sistema ja
   esta tratando aquilo como tela de toque - a largura basta. */
@media (max-width: 991.98px) {
  .btn, .form-control, .form-select, .page-link {
    min-height: 44px;
  }
  .btn-sm, .form-control-sm, .form-select-sm {
    min-height: 40px;                 /* os pequenos continuam menores, mas alcancaveis */
    padding-top: .35rem; padding-bottom: .35rem;
  }
  /* Botao so de icone dentro de tabela: quadrado, nao esticado. */
  .btn-sm.py-0 { min-height: 38px; }
  /* Barra do topo: sino e perfil tinham 36px. */
  .topbar-icon-btn { width: 44px; height: 44px; }

  /* CAIXA DE MARCAR: as da lista de chamados sao <input type=checkbox> puro,
     sem a classe do Bootstrap, e mediam 13x13px - alvo impossivel de acertar
     com o dedo. O desenho cresce um pouco e o ALVO cresce bem mais, por
     causa do recheio invisivel em volta. */
  .form-check-input,
  input[type=checkbox], input[type=radio] {
    width: 20px; height: 20px;
    /* O recheio aumenta a area de toque; a margem negativa devolve o espaco
       pro layout, entao nada se mexe de lugar na tela. */
    padding: 10px; margin: -10px;
    background-clip: content-box;
  }
  /* Dentro de um .form-check (radio/checkbox COM rotulo do Bootstrap), a
     margem acima apagava a margem negativa que o Bootstrap usa pra encaixar
     a caixinha a esquerda do texto (-1.5em) e alinhar na altura (.25em) -
     no celular a bolinha ficava acima/fora do rotulo ("Contrato/Projeto",
     "Sem identificacao"). Repoe as duas, ja descontando o recheio. (2.8.15) */
  .form-check .form-check-input {
    margin: calc(.5em - 10px) -10px -10px calc(-1.5em - 10px);
  }
  /* Caixa de marcar DENTRO de tabela (lista de chamados, "marcar todos"): a
     margem negativa da esquerda empurrava a caixinha pra fora da area rolavel
     da tabela e ela aparecia cortada ao meio no celular. Nas celulas, a
     margem horizontal fica zero - a celula ja tem espaco de sobra. (2.8.21) */
  td > input[type=checkbox], th > input[type=checkbox] {
    margin-left: 0; margin-right: 0;
  }
  .form-check { padding-top: .25rem; padding-bottom: .25rem; }

  /* LINK DENTRO DE TABELA: sao os numeros de chamado, as lojas, os "ver
     mais". Tinham 15 a 24px de altura. Nao da pra deixa-los com 44px - a
     linha da tabela dobraria de altura e a lista viraria um rolo sem fim.
     O truque e o mesmo das caixas de marcar: recheio pra cima e pra baixo
     aumenta a AREA DE TOQUE, e a margem negativa devolve o espaco, entao a
     tabela continua com a mesma altura de antes.
     (A lista de chamados vai ganhar um formato de cartao proprio pro
     celular na proxima entrega - isto aqui e o que melhora ja.) */
  .table a, .card-body > a.small, .stat-card a, a.text-decoration-none.d-block {
    display: inline-block;
    padding-top: .45rem; padding-bottom: .45rem;
    margin-top: -.45rem; margin-bottom: -.45rem;
  }
}

/* ------------------------------------------- 3) CAMPO QUE DA ZOOM SOZINHO
   O Safari do iPhone DA ZOOM na pagina toda quando o dedo toca um campo com
   fonte menor que 16px - e depois a pessoa tem que pinçar pra voltar. Era o
   caso de 15 campos so na lista de chamados. Subir a fonte pra 16px no
   celular resolve na origem; no monitor nada muda. */
@media (max-width: 991.98px) {
  .form-control, .form-select, .form-control-sm, .form-select-sm,
  input[type=text], input[type=search], input[type=number], input[type=date],
  input[type=password], input[type=email], input[type=tel], select, textarea {
    font-size: 16px;
  }
}

/* --------------------------------------------- 4) O GRUPO DE BOTOES REDONDOS
   Tres botoes empilhados no canto de baixo a direita. No celular eles
   encolhem e chegam mais perto da borda; a area segura do iPhone (a faixa
   da barra de gestos) entra na conta pra eles nao ficarem embaixo dela. */
.fab-container {
  padding-bottom: env(safe-area-inset-bottom, 0px);
  padding-right: env(safe-area-inset-right, 0px);
}
#fab-sugestao { border: 1px solid var(--bs-border-color); cursor: pointer; padding: 0; }

/* OS BOTOES SAEM DA FRENTE NO CELULAR.
   Tres botoes redondos parados em cima do conteudo funcionam bem num
   monitor, onde sobra tela. Num celular de 390px eles ficam POR CIMA da
   borda direita dos campos - na tela da RAT davam justamente em cima de
   "Fabricante" e "Modelo", e o dedo batia no botao em vez do campo.
   Entao, no celular:
     - rolando pra BAIXO (lendo, preenchendo), eles somem;
     - rolando pra CIMA, ou chegando ao topo/fim da pagina, eles voltam;
     - com um campo em foco (teclado aberto), eles somem tambem.
   No monitor nada disso vale: os botoes ficam sempre onde estao. */
@media (max-width: 991.98px) {
  .fab-container {
    transition: transform .22s ease, opacity .22s ease;
  }
  .fab-container.fab-escondido {
    transform: translateY(140%);
    opacity: 0;
    pointer-events: none;
  }
}

/* Espaco no fim da pagina pra que o ultimo botao/campo da tela nunca fique
   permanentemente embaixo do grupo flutuante. */
.app-content { padding-bottom: 5.5rem; }
@media (max-width: 991.98px) {
  .app-content { padding-bottom: 6.5rem; }
}

/* ------------------------------------------------------- 5) AREA SEGURA
   iPhone com recorte na tela: em pe sobra a faixa de baixo; deitado, as
   laterais. Sem isto o conteudo passa por baixo do recorte. */
@media (max-width: 991.98px) {
  .app-topbar { padding-left: max(1rem, env(safe-area-inset-left)); padding-right: max(1rem, env(safe-area-inset-right)); }
  .app-content {
    padding-left: max(1rem, env(safe-area-inset-left));
    padding-right: max(1rem, env(safe-area-inset-right));
  }
}

/* ------------------------------------------------------------- 6) TABLET
   Entre 768 e 991px o menu lateral ja sai de cena (vira o botao de tres
   riscos), entao sobra largura: da pra respirar mais que no celular sem
   chegar ao espacamento do monitor. */
@media (min-width: 768px) and (max-width: 991.98px) {
  .app-content { padding: 1.5rem 1.5rem 6.5rem; }
  .app-sidebar { width: 300px; }          /* dedo abre o menu: itens mais largos */
}

/* --------------------------------------------------- 7) JANELAS (modais)
   No celular a janela ocupava so um pedaco da tela e o conteudo dela rolava
   dentro de uma caixinha. Melhor ela subir do rodape e ocupar a largura
   toda - e o formato que todo aplicativo usa. */
@media (max-width: 575.98px) {
  .modal-dialog {
    margin: .5rem;
    max-width: calc(100% - 1rem);
  }
  .modal-dialog-centered { min-height: calc(100% - 1rem); }
  .modal-body { max-height: 70vh; overflow-y: auto; }
  .modal-footer .btn { flex: 1 1 auto; }   /* botoes lado a lado ocupam a linha */
}

/* ------------------------------------------------- 8) BUSCA NO CELULAR
   A busca do topo estava escondida abaixo de 576px - ou seja, no celular
   nao havia busca nenhuma. Ela volta, em uma linha propria embaixo da barra
   do topo, ocupando a largura toda. */
@media (max-width: 575.98px) {
  .app-topbar { flex-wrap: wrap; height: auto; padding-top: .5rem; padding-bottom: .5rem; row-gap: .5rem; }
  .topbar-busca { display: block; order: 10; width: 100%; margin-left: 0; }
  .topbar-spacer { order: 5; }
  /* 2.8.45: sino e perfil DEPOIS do espacador - antes ficavam grudados no
     botao de menu, a esquerda, em vez de no canto direito */
  .topbar-actions { order: 6; }
}

/* ------------------------------------------------------ 9) TEXTO COMPRIDO
   Numero de serie, link e codigo colados sem espaco estouravam a largura da
   tela no celular. */
@media (max-width: 991.98px) {
  .card-body, .timeline-item, .manual-conteudo { overflow-wrap: break-word; }

  /* Comando escrito no meio da frase do manual (o <code>) nao quebra
     sozinho: "cd /opt/wine && node scripts/listar-taxonomia.js" e uma
     palavra so pro navegador, e passava 15px da borda no celular. Foi a
     bateria que pegou - o texto novo do manual e que trouxe o caso. */
  .manual-conteudo :not(pre) > code { overflow-wrap: anywhere; word-break: break-word; }
  /* O bloco de comando (o <pre>) ja rola sozinho; so garante que ele nao
     empurre a pagina. */
  .manual-conteudo pre { max-width: 100%; }
}

/* 2.8.47: abas da lista de chamados (7 abas). No celular/tablet ficam numa
   linha só com rolagem lateral, em vez de quebrar em 3 linhas. */
@media (max-width: 991.98px) {
  .abas-chamados { flex-wrap: nowrap; overflow-x: auto; overflow-y: hidden; scrollbar-width: thin; }
  .abas-chamados .nav-link { white-space: nowrap; }
}

/* =====================================================================
   2.8.47 - PAINEL PERSONALIZAVEL (dashboard): grade de 12 colunas com
   blocos que a pessoa reorganiza e redimensiona (public/js/painel-blocos.js)
   ===================================================================== */
.painel-grade {
  display: grid;
  grid-template-columns: repeat(12, minmax(0, 1fr));
  gap: 1rem;
  margin-bottom: 1rem;
  align-items: start;
}
.painel-bloco { grid-column: span 12; min-width: 0; position: relative; }
.painel-bloco[data-span="3"]  { grid-column: span 3; }
.painel-bloco[data-span="4"]  { grid-column: span 4; }
.painel-bloco[data-span="6"]  { grid-column: span 6; }
.painel-bloco[data-span="8"]  { grid-column: span 8; }
.painel-bloco[data-span="9"]  { grid-column: span 9; }
.painel-bloco[data-span="12"] { grid-column: span 12; }
/* Tablet: blocos pequenos viram meia tela, os grandes tela inteira */
@media (max-width: 991.98px) {
  .painel-bloco[data-span="3"], .painel-bloco[data-span="4"], .painel-bloco[data-span="6"] { grid-column: span 6; }
  .painel-bloco[data-span="8"], .painel-bloco[data-span="9"] { grid-column: span 12; }
}
/* Celular: um embaixo do outro (a ordem escolhida continua valendo) */
@media (max-width: 767.98px) {
  .painel-grade .painel-bloco[data-span] { grid-column: 1 / -1; }
  .painel-grade .painel-bloco[data-span="3"], .painel-grade .painel-bloco[data-span="4"] { grid-column: span 6; }
}
@media (max-width: 575.98px) {
  .painel-grade .painel-bloco[data-span="3"], .painel-grade .painel-bloco[data-span="4"] { grid-column: 1 / -1; }
}
/* O bloco ocupa a altura toda da sua celula; margens de baixo internas
   saem (quem separa os blocos e o "gap" da grade). */
.painel-bloco > .card, .painel-bloco > .stat-card, .painel-bloco > .alert { height: 100%; margin-bottom: 0 !important; }
.painel-bloco > .row { margin-bottom: 0 !important; }
/* Altura escolhida pela pessoa: o conteudo rola por dentro e o grafico
   estica para ocupar o espaco. */
.painel-bloco.altura-livre { overflow: hidden; }
.painel-bloco.altura-livre > .card { display: flex; flex-direction: column; }
.painel-bloco.altura-livre > .card > .card-body { flex: 1 1 auto; min-height: 0; overflow: auto; display: flex; flex-direction: column; }
.painel-bloco.altura-livre .chart-box { flex: 1 1 auto; height: auto; min-height: 120px; }

/* Barra do painel (Personalizar / Restaurar / Concluir) */
.painel-acoes { display: flex; align-items: center; gap: .5rem; flex-wrap: wrap; }

/* Modo de edicao */
body.painel-editando .painel-bloco {
  outline: 2px dashed rgba(179, 34, 46, .45);
  outline-offset: 3px;
  border-radius: var(--bs-border-radius-lg);
  padding-top: 34px;
}
.painel-barra-bloco {
  position: absolute; top: 0; left: 0; right: 0; height: 30px;
  display: flex; align-items: center; justify-content: space-between; gap: .25rem;
  background: #fbeff1; border: 1px solid #ecc7cd; border-radius: 8px;
  padding: 0 .25rem; z-index: 5; font-size: .78rem;
}
.painel-barra-bloco button {
  border: 0; background: transparent; color: #7A1F3D; border-radius: 6px;
  padding: 2px 6px; line-height: 1.2; font-size: .8rem; cursor: pointer;
}
.painel-barra-bloco button:hover, .painel-barra-bloco button:focus-visible { background: #f3d6db; outline: none; }
.painel-barra-bloco button:focus-visible { outline: 2px solid var(--wine, #B3222E); outline-offset: 2px; } /* 2.8.71 (revisão T06): contorno visível no teclado */
.painel-alca { cursor: grab !important; display: inline-flex; align-items: center; gap: .35rem; min-width: 0; touch-action: none; }
.painel-alca .painel-nome { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; max-width: 16ch; font-weight: 600; }
@media (min-width: 992px) { .painel-bloco[data-span="8"] .painel-nome, .painel-bloco[data-span="9"] .painel-nome, .painel-bloco[data-span="12"] .painel-nome { max-width: 40ch; } }
.painel-botoes { display: inline-flex; align-items: center; gap: 1px; flex-shrink: 0; }
.painel-largura { min-width: 3.4em; text-align: center; color: #555; }
.painel-canto {
  position: absolute; right: 2px; bottom: 2px; width: 18px; height: 18px; z-index: 6;
  cursor: nwse-resize; touch-action: none;
  background: linear-gradient(135deg, transparent 50%, #B3222E 50%, #B3222E 60%, transparent 60%, transparent 70%, #B3222E 70%, #B3222E 80%, transparent 80%);
  border-radius: 0 0 6px 0;
}
.painel-arrastando { opacity: .55; }
.painel-arrastando .painel-alca { cursor: grabbing !important; }
.painel-redimensionando { outline-style: solid !important; }
@media (max-width: 575.98px) {
  .painel-alca .painel-nome { max-width: 9ch; }
  .painel-barra-bloco [data-acao="auto"] { display: none; }
}

/* Bloco "Em atendimento agora" */
.agora-etapa { white-space: nowrap; }
.agora-tempo-longo, .table > :not(caption) > * > .agora-tempo-longo { color: #B3222E; font-weight: 600; }

/* 2.8.51 - Busca do topo com resultados enquanto digita (public/js/busca-topo.js) */
.busca-topo-wrap { position: relative; }
.busca-topo-lista {
  position: absolute; top: calc(100% + 4px); left: 0; width: max(100%, 380px); max-width: calc(100vw - 24px);
  max-height: 70vh; overflow-y: auto; z-index: 1060;
  background: #fff; border: 1px solid var(--bs-border-color); border-radius: 10px;
  box-shadow: 0 10px 30px rgba(20,10,15,.14); padding: .25rem;
}
.busca-topo-item, .busca-topo-todos {
  display: block; padding: .45rem .6rem; border-radius: 8px; text-decoration: none; color: inherit;
}
.busca-topo-item:hover, .busca-topo-item.ativo, .busca-topo-todos:hover, .busca-topo-todos.ativo { background: #fbeff1; }
.busca-topo-linha1 { display: flex; align-items: center; gap: .3rem; font-size: .88rem; }
.busca-topo-linha1 .badge { font-size: .66rem; font-weight: 600; }
.busca-topo-linha2 { display: block; font-size: .76rem; color: #6c6c6c; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.busca-topo-item mark { background: #ffe8a3; padding: 0 1px; border-radius: 2px; }
.busca-topo-todos { font-size: .8rem; color: var(--wine-primary, #7A1F3D); border-top: 1px solid #eee; margin-top: .2rem; }
.busca-topo-vazio { padding: .6rem; font-size: .82rem; color: #6c6c6c; }
/* 2.8.66: separador entre os chamados e as peças do estoque na busca do topo.
   Não tem as classes .busca-topo-item/.busca-topo-todos de propósito - assim
   as setas do teclado passam direto por ele. */
.busca-topo-grupo {
  padding: .35rem .6rem .15rem; font-size: .72rem; font-weight: 600;
  text-transform: uppercase; letter-spacing: .04em; color: #8a8a8a;
  border-top: 1px solid #eee; margin-top: .2rem;
}
/* 2.8.89: "Criar o chamado <número>" - o número buscado não existe */
.busca-topo-criar { border: 1px dashed #198754; background: #f1faf4; margin-bottom: .2rem; }
.busca-topo-criar .busca-topo-linha1 { color: #146c43; }
.busca-topo-criar:hover, .busca-topo-criar.ativo { background: #dff3e6 !important; }
.busca-topo-criar .busca-topo-linha2 { white-space: normal; }
@media (max-width: 991.98px) { .busca-topo-lista { width: 100%; } }

/* ------------------------------------------------- SELETORES DE HORA E DATA (2.8.52/2.8.53)
   Janelas próprias (public/js/seletor-hora.js e seletor-data.js), no lugar
   das listinhas do flatpickr. 2.8.53: tudo em vinho (Fernando: "deixe
   apenas a parte vinho com digitação"), com a data/hora grande digitável. */
.sh-campo { cursor: pointer; background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='%237A1F3D' viewBox='0 0 16 16'%3E%3Cpath d='M8 3.5a.5.5 0 0 0-1 0V9a.5.5 0 0 0 .252.434l3.5 2a.5.5 0 0 0 .496-.868L8 8.71z'/%3E%3Cpath d='M8 16A8 8 0 1 0 8 0a8 8 0 0 0 0 16m7-8A7 7 0 1 1 1 8a7 7 0 0 1 14 0'/%3E%3C/svg%3E");
  background-repeat: no-repeat; background-position: right .75rem center; background-size: 16px; padding-right: 2.25rem; }
.sd-campo { cursor: pointer; background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='%237A1F3D' viewBox='0 0 16 16'%3E%3Cpath d='M3.5 0a.5.5 0 0 1 .5.5V1h8V.5a.5.5 0 0 1 1 0V1h1a2 2 0 0 1 2 2v11a2 2 0 0 1-2 2H2a2 2 0 0 1-2-2V3a2 2 0 0 1 2-2h1V.5a.5.5 0 0 1 .5-.5M1 4v10a1 1 0 0 0 1 1h12a1 1 0 0 0 1-1V4z'/%3E%3C/svg%3E");
  background-repeat: no-repeat; background-position: right .75rem center; background-size: 15px; padding-right: 2.25rem; }
.sh-campo:disabled, .sd-campo:disabled { cursor: not-allowed; }
.seletor-vinho .sh-dialogo { max-width: 360px; }
.seletor-vinho.seletor-data .sh-dialogo { max-width: 380px; }
.seletor-vinho .sh-conteudo { border: 0; border-radius: 20px; overflow: hidden; box-shadow: 0 24px 60px rgba(33, 37, 43, .35); }
.seletor-vinho .sh-topo { position: relative; background: linear-gradient(150deg, #8E2748 0%, var(--wine-primary) 45%, var(--wine-primary-dark) 100%); color: #fff; padding: 1.1rem 1.25rem 1.2rem; text-align: center; }
.seletor-vinho .sh-topo .btn-close { position: absolute; top: .9rem; right: .95rem; }
.seletor-vinho .sh-titulo { font-size: .76rem; text-transform: uppercase; letter-spacing: .09em; opacity: .85; padding: 0 1.75rem; }
.seletor-vinho .sh-visor { display: flex; align-items: center; justify-content: center; gap: .3rem; margin: .5rem 0 .15rem; }
.seletor-vinho .sh-num { width: 5.4rem; font-size: 3.2rem; font-weight: 700; line-height: 1; text-align: center; color: #fff; caret-color: #fff;
  background: rgba(255, 255, 255, .12); border: 2px solid transparent; border-radius: 14px; padding: .4rem 0; font-variant-numeric: tabular-nums; transition: background .12s, border-color .12s; }
.seletor-vinho .sh-num:focus { outline: none; border-color: rgba(255, 255, 255, .9); background: rgba(255, 255, 255, .22); }
.seletor-vinho .sh-dois-pontos { font-size: 2.8rem; font-weight: 700; opacity: .8; margin-top: -.3rem; }
.seletor-vinho .sh-legenda { font-size: .76rem; opacity: .75; margin-bottom: .75rem; }
.seletor-vinho .sh-ajuste { display: flex; justify-content: center; flex-wrap: wrap; gap: .45rem; }
.seletor-vinho .sh-passo { border: 1px solid rgba(255, 255, 255, .45); background: transparent; color: #fff; border-radius: 999px; padding: .28rem .85rem; font-size: .84rem; transition: background .12s; }
.seletor-vinho .sh-passo:hover, .seletor-vinho .sh-passo:focus-visible { background: rgba(255, 255, 255, .18); outline: none; }
.seletor-vinho .sh-passo:focus-visible { outline: 2px solid #fff; outline-offset: 2px; } /* 2.8.71 (revisão T06): contorno visível no teclado - branco, porque o fundo aqui é vinho */
.seletor-vinho .sh-agora { background: #fff; color: var(--wine-primary); border-color: #fff; font-weight: 600; }
.seletor-vinho .sh-agora:hover, .seletor-vinho .sh-agora:focus-visible { background: #F6E9EE; color: var(--wine-primary-dark); }
.seletor-vinho .sh-aviso { margin-top: .85rem; font-size: .82rem; color: #fff; background: rgba(0, 0, 0, .25); border: 1px solid rgba(255, 255, 255, .35); border-radius: 10px; padding: .45rem .6rem; }
.seletor-vinho .sh-rodape { display: flex; gap: .6rem; margin-top: 1.1rem; }
.seletor-vinho .sh-botao { flex: 1 1 0; border-radius: 12px; padding: .6rem; font-weight: 600; font-size: .95rem; border: 1px solid rgba(255, 255, 255, .55); transition: background .12s, opacity .12s; }
.seletor-vinho .sh-cancelar { background: transparent; color: #fff; }
.seletor-vinho .sh-cancelar:hover { background: rgba(255, 255, 255, .12); }
.seletor-vinho .sh-confirmar { background: #fff; color: var(--wine-primary); border-color: #fff; }
.seletor-vinho .sh-confirmar:hover, .seletor-vinho .sh-confirmar:focus-visible { background: #F6E9EE; outline: none; }
.seletor-vinho .sh-confirmar:disabled { opacity: .45; cursor: not-allowed; }
.seletor-vinho .sh-limpar { background: transparent; color: #fff; border-style: dashed; }
/* calendário (datas) */
.seletor-data .sd-visor .sh-num { width: 3.6rem; font-size: 2.4rem; }
.seletor-data .sd-visor .sd-ano { width: 5.6rem; }
.seletor-data .sd-visor .sh-dois-pontos { font-size: 2.2rem; }
.seletor-data .sd-semana { font-size: .86rem; opacity: .85; margin-bottom: .75rem; text-transform: capitalize; min-height: 1.2em; }
.seletor-data .sd-mes { display: flex; align-items: center; justify-content: space-between; margin: .9rem 0 .4rem; }
.seletor-data .sd-mes-nome { font-weight: 600; text-transform: capitalize; }
.seletor-data .sd-nav { width: 2.1rem; height: 2.1rem; border-radius: 50%; border: 1px solid rgba(255, 255, 255, .4); background: transparent; color: #fff; font-size: 1.1rem; line-height: 1; }
.seletor-data .sd-nav:hover, .seletor-data .sd-nav:focus-visible { background: rgba(255, 255, 255, .18); outline: none; }
.seletor-data .sd-grade { display: grid; grid-template-columns: repeat(7, 1fr); gap: .2rem; }
.seletor-data .sd-dia-semana { font-size: .7rem; text-transform: uppercase; opacity: .65; font-weight: 600; padding: .2rem 0; }
.seletor-data .sd-dia { aspect-ratio: 1; border: 0; border-radius: 50%; background: transparent; color: #fff; font-weight: 500; font-size: .9rem; font-variant-numeric: tabular-nums; transition: background .1s, transform .08s; }
.seletor-data .sd-dia:hover:not(:disabled) { background: rgba(255, 255, 255, .18); }
.seletor-data .sd-dia:focus-visible { outline: 2px solid #fff; outline-offset: 1px; }
.seletor-data .sd-dia.fora { opacity: .35; }
.seletor-data .sd-dia.hoje { box-shadow: inset 0 0 0 1.5px rgba(255, 255, 255, .75); }
.seletor-data .sd-dia.ativo { background: #fff; color: var(--wine-primary); font-weight: 700; box-shadow: 0 4px 12px rgba(0, 0, 0, .25); }
.seletor-data .sd-dia:disabled { opacity: .2; cursor: not-allowed; text-decoration: line-through; }
@media (max-width: 575.98px) {
  .seletor-vinho .sh-dialogo { margin: .5rem auto; max-width: calc(100% - 1rem); }
  .seletor-vinho .sh-num { width: 4.8rem; font-size: 2.8rem; }
  .seletor-data .sd-visor .sh-num { width: 3.2rem; font-size: 2.1rem; }
  .seletor-data .sd-visor .sd-ano { width: 5rem; }
}

/* ------------------------------------------------- DASHBOARD DA GESTÃO (2.8.52)
   Reorganizado para não repetir informação: números no topo, atenção só com
   destaque quando há exceção, "Em campo agora" numa tabela só e a "Fila de
   trabalho" em abas. Cartões sem borda, cantos arredondados e sombra leve. */
.painel-card { border: 1px solid #ECECF1; border-radius: 14px; box-shadow: 0 1px 2px rgba(33, 37, 43, .04), 0 4px 14px rgba(33, 37, 43, .04); }
.painel-card > .card-body { padding: 1rem 1.15rem; }
.painel-titulo { font-size: .98rem; font-weight: 600; margin-bottom: .75rem; display: flex; flex-wrap: wrap; align-items: center; gap: .35rem; }
.painel-subtitulo { font-size: .8rem; font-weight: 400; color: var(--wine-muted); margin-left: .25rem; }
.tabela-painel thead th { font-size: .74rem; text-transform: uppercase; letter-spacing: .04em; color: var(--wine-muted); font-weight: 600; border-bottom-width: 1px; white-space: nowrap; }
.tabela-painel td { padding-top: .55rem; padding-bottom: .55rem; }
.tabela-painel tbody tr:last-child td { border-bottom: 0; }
.linha-sem-chamado td { background: #FAFAFC; }

/* 1) faixa de números */
.kpi-faixa { display: grid; grid-template-columns: repeat(auto-fit, minmax(140px, 1fr)); gap: .75rem; }
.kpi { position: relative; display: flex; flex-direction: column; gap: .15rem; padding: .85rem 1rem; border-radius: 14px; background: #fff;
  border: 1px solid #ECECF1; text-decoration: none; color: var(--wine-ink); box-shadow: 0 1px 2px rgba(33, 37, 43, .04);
  transition: transform .12s, box-shadow .12s, border-color .12s; overflow: hidden; }
.kpi::before { content: ''; position: absolute; left: 0; top: 0; bottom: 0; width: 4px; background: #C9C9D3; }
.kpi:hover { transform: translateY(-2px); box-shadow: 0 8px 20px rgba(33, 37, 43, .08); border-color: #DADAE3; color: var(--wine-ink); }
.kpi-rotulo { font-size: .78rem; color: var(--wine-muted); font-weight: 500; display: flex; align-items: center; gap: .25rem; }
.kpi-valor { font-size: 1.9rem; font-weight: 700; line-height: 1.1; font-variant-numeric: tabular-nums; }
.kpi-extra { font-size: .74rem; color: var(--wine-muted); }
.kpi-info::before { background: #1D5BA6; }
.kpi-ok::before { background: #1E7A46; }
.kpi-aviso::before { background: #E0A100; }
.kpi-aviso .kpi-valor { color: #9A6A00; }
.kpi-perigo::before { background: #B3222E; }
.kpi-perigo { background: #FFF6F6; border-color: #F3C9CC; }
.kpi-perigo .kpi-valor { color: #B3222E; }

/* 2) atenção */
.atencao-ok { display: flex; align-items: center; gap: .5rem; padding: .6rem .95rem; border-radius: 12px; background: #EEF8F2; color: #1E6B40; border: 1px solid #CFEBD9; font-size: .92rem; }
.atencao-card { border-color: #F3C9CC; background: #FFFBFB; }
.atencao-itens { display: grid; grid-template-columns: repeat(auto-fill, minmax(260px, 1fr)); gap: .5rem; }
.atencao-item { display: flex; align-items: center; gap: .6rem; padding: .55rem .75rem; border-radius: 10px; background: #fff; border: 1px solid #ECECF1; text-decoration: none; color: var(--wine-ink); font-size: .9rem; transition: border-color .12s, box-shadow .12s; }
.atencao-item:hover { border-color: #D6D6DF; box-shadow: 0 4px 12px rgba(33, 37, 43, .06); color: var(--wine-ink); }
.atencao-qtd { min-width: 2rem; height: 2rem; border-radius: 8px; display: inline-flex; align-items: center; justify-content: center; font-weight: 700; color: #fff; background: #6C757D; }
.atencao-danger .atencao-qtd { background: #B3222E; }
.atencao-warning .atencao-qtd { background: #E0A100; color: #2B2100; }
.atencao-seta { color: var(--wine-muted); font-size: 1.2rem; line-height: 1; }

/* 4) abas da fila de trabalho */
.abas-painel { display: inline-flex; flex-wrap: wrap; gap: .25rem; background: #F1F1F5; padding: .25rem; border-radius: 10px; }
.aba-painel { border: 0; background: transparent; border-radius: 8px; padding: .3rem .7rem; font-size: .86rem; color: var(--wine-muted); font-weight: 500; display: inline-flex; align-items: center; gap: .35rem; }
.aba-painel:hover { color: var(--wine-ink); }
.aba-painel.ativa { background: #fff; color: var(--wine-ink); box-shadow: 0 1px 3px rgba(33, 37, 43, .12); }

/* "Em aberto por técnico" em barras */
.barras-tecnico { display: flex; flex-direction: column; gap: .5rem; }
.barra-linha { display: grid; grid-template-columns: minmax(90px, 38%) 1fr 2rem; align-items: center; gap: .6rem; font-size: .88rem; }
.barra-nome { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.barra-trilho { height: 8px; background: #F1F1F5; border-radius: 999px; overflow: hidden; }
.barra-cheia { display: block; height: 100%; background: var(--wine-primary); border-radius: 999px; min-width: 2px; }
.barra-valor { text-align: right; font-variant-numeric: tabular-nums; }
@media (max-width: 575.98px) {
  .kpi-faixa { grid-template-columns: repeat(2, 1fr); gap: .5rem; }
  .kpi { padding: .7rem .8rem; }
  .kpi-valor { font-size: 1.6rem; }
  .atencao-itens { grid-template-columns: 1fr; }
}
/* 2.8.52: nas grades da gestão, cartões lado a lado ficam com a MESMA altura
   (antes um cartão curto ao lado de um gráfico deixava um buraco em branco). */
.painel-grade[data-grade="operacao"], .painel-grade[data-grade="estrategico"] { align-items: stretch; }
/* números do topo sempre alinhados, mesmo com rótulo em duas linhas */
.kpi-rotulo { min-height: 2.3em; align-items: flex-start; line-height: 1.15; padding-right: .9rem; }
.kpi-rotulo .ajuda-icone { position: absolute; top: .7rem; right: .6rem; }
.kpi-faixa .kpi { justify-content: flex-start; }
.painel-grade[data-grade="operacao"] .chart-box { height: 230px; }
@media (max-width: 575.98px) { .kpi-faixa .kpi:last-child:nth-child(odd) { grid-column: 1 / -1; } }
/* lista de chamados do painel do técnico (2.8.52): uma linha por chamado,
   boa de tocar no celular */
.lista-painel { display: flex; flex-direction: column; }
.lista-painel-item { display: flex; align-items: center; gap: .75rem; padding: .65rem .25rem; border-bottom: 1px solid #F0F0F4; text-decoration: none; color: var(--wine-ink); }
.lista-painel-item:last-child { border-bottom: 0; }
.lista-painel-item:hover { background: #FAFAFC; color: var(--wine-ink); }
.lista-painel-principal { flex: 1 1 auto; min-width: 0; }
.lista-painel-principal strong { color: var(--wine-primary); }
.lista-painel-sub { display: block; font-size: .84rem; color: var(--wine-muted); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.lista-painel-lado { display: flex; flex-direction: column; align-items: flex-end; gap: .25rem; flex-shrink: 0; }
div.kpi { cursor: default; }
div.kpi:hover { transform: none; box-shadow: 0 1px 2px rgba(33, 37, 43, .04); }
.lista-painel-item, .lista-painel-item:hover, .lista-painel-item:focus, .kpi, .kpi:hover, .atencao-item, .atencao-item:hover { text-decoration: none !important; }
/* seletores: seleção do texto e "dd/mm/aaaa" vazio no tom da janela */
.seletor-vinho .sh-num::selection { background: rgba(255, 255, 255, .35); color: #fff; }
.seletor-vinho .sh-num::placeholder { color: rgba(255, 255, 255, .38); font-size: .5em; font-weight: 600; letter-spacing: .05em; }
.seletor-data .sd-mes-nome { text-transform: none; }
/* 2.8.54 (Fernando: "o ano está muito grande"): data do calendário um pouco menor */
.seletor-data .sd-visor .sh-num { width: 3.1rem; font-size: 1.9rem; padding: .35rem 0; border-radius: 12px; }
.seletor-data .sd-visor .sd-ano { width: 4.9rem; }
.seletor-data .sd-visor .sh-dois-pontos { font-size: 1.7rem; margin-top: 0; }
.seletor-data .sd-semana { text-transform: none; }
@media (max-width: 575.98px) {
  .seletor-data .sd-visor .sh-num { width: 2.9rem; font-size: 1.75rem; }
  .seletor-data .sd-visor .sd-ano { width: 4.6rem; }
}
.seletor-data .sd-visor .sh-num { padding-left: 0; padding-right: 0; letter-spacing: -.01em; }
.seletor-data .sd-visor .sd-ano { width: 5.6rem; }
@media (max-width: 575.98px) { .seletor-data .sd-visor .sd-ano { width: 5.2rem; } }

/* ==========================================================
   MODO ESCURO (2.8.61)
   Ligado em Meu Perfil > Minhas preferências; o header põe
   data-tema="escuro" no <body>. Como o sistema inteiro é
   pintado por variáveis (as --wine-* e as --bs-* do Bootstrap),
   basta trocar as cores aqui: todas as telas acompanham.
   O bordô fica um tom mais claro no escuro, senão some no fundo.
   ========================================================== */
body[data-tema="escuro"] {
  --wine-primary: #E0607F;
  --wine-primary-dark: #F090A6;
  --wine-primary-darker: #F5B3C2;
  --wine-primary-rgb: 224, 96, 127;
  --wine-ink: #E8EAED;
  --wine-muted: #A6ADBA;
  --wine-bg: #14161A;
  --wine-surface: #1D2026;
  --wine-border: #2E323A;

  --bs-body-bg: var(--wine-bg);
  --bs-body-color: var(--wine-ink);
  --bs-border-color: var(--wine-border);
  --bs-secondary-color: var(--wine-muted);
  --bs-emphasis-color: var(--wine-ink);
  --bs-tertiary-bg: #22262D;
  --bs-secondary-bg: #22262D;
  color-scheme: dark;
}

/* Superfícies: tudo que era branco fixo passa a usar a superfície do tema */
body[data-tema="escuro"] .card,
body[data-tema="escuro"] .modal-content,
body[data-tema="escuro"] .dropdown-menu,
body[data-tema="escuro"] .list-group-item,
body[data-tema="escuro"] .accordion-item,
body[data-tema="escuro"] .offcanvas,
body[data-tema="escuro"] .kpi,
body[data-tema="escuro"] .painel-bloco,
body[data-tema="escuro"] .km-linha,
body[data-tema="escuro"] .km-semana,
body[data-tema="escuro"] .fech-ciclo,
body[data-tema="escuro"] .select-buscavel-lista,
body[data-tema="escuro"] .busca-topo-resultados {
  background-color: var(--wine-surface);
  border-color: var(--wine-border);
  color: var(--wine-ink);
}

/* Campos */
body[data-tema="escuro"] .form-control,
body[data-tema="escuro"] .form-select,
body[data-tema="escuro"] .input-group-text {
  background-color: #22262D;
  border-color: var(--wine-border);
  color: var(--wine-ink);
}
body[data-tema="escuro"] .form-control::placeholder { color: #7C848F; }
body[data-tema="escuro"] .form-control:disabled,
body[data-tema="escuro"] .form-control[readonly] { background-color: #191C21; color: var(--wine-muted); }

/* Tabelas */
body[data-tema="escuro"] .table { --bs-table-bg: transparent; --bs-table-color: var(--wine-ink); --bs-table-border-color: var(--wine-border); }
body[data-tema="escuro"] .table-hover > tbody > tr:hover > * { --bs-table-accent-bg: #23272E; color: var(--wine-ink); }
body[data-tema="escuro"] thead th { color: var(--wine-muted); }

/* Botões claros do Bootstrap ficariam brancos no escuro */
body[data-tema="escuro"] .btn-light,
body[data-tema="escuro"] .btn-outline-secondary {
  background-color: #262A31; border-color: var(--wine-border); color: var(--wine-ink);
}
body[data-tema="escuro"] .btn-light:hover,
body[data-tema="escuro"] .btn-outline-secondary:hover { background-color: #2F343C; color: #fff; }
body[data-tema="escuro"] .btn-primary { color: #1A0A10; }

/* Avisos (alert) e "badges" claros */
body[data-tema="escuro"] .alert { border-color: var(--wine-border); }
body[data-tema="escuro"] .alert-info { background-color: #16303B; color: #CBE7F3; }
body[data-tema="escuro"] .alert-warning { background-color: #3A2F14; color: #F2DFA8; }
body[data-tema="escuro"] .alert-success { background-color: #16301F; color: #BFE8CC; }
body[data-tema="escuro"] .alert-danger { background-color: #3A1A1D; color: #F3C7CB; }
body[data-tema="escuro"] .text-bg-light { background-color: #262A31 !important; color: var(--wine-ink) !important; }
body[data-tema="escuro"] .bg-light { background-color: #22262D !important; }
body[data-tema="escuro"] .text-muted { color: var(--wine-muted) !important; }
body[data-tema="escuro"] .border { border-color: var(--wine-border) !important; }

/* A faixa de dicas e a busca do topo */
body[data-tema="escuro"] .topbar { background-color: var(--wine-surface); border-color: var(--wine-border); }
body[data-tema="escuro"] .topbar-dicas { background-color: #2A1A20; color: #F0C9D4; }

/* O menu lateral é pintado com o bordô escuro; como no tema escuro o bordô
   clareia (pra ler no fundo preto), o menu precisa da cor própria dele */
body[data-tema="escuro"] .app-sidebar { background: #16181C; color: rgba(255,255,255,.85); }
body[data-tema="escuro"] .sidebar-link { color: rgba(255,255,255,.75); }
body[data-tema="escuro"] .sidebar-link:hover { background: rgba(255,255,255,.08); color: #fff; }
body[data-tema="escuro"] .sidebar-link.active { background: #7A1F3D; color: #fff; }
body[data-tema="escuro"] .sidebar-section-label { color: rgba(255,255,255,.45); }

/* ---------------------------------------------------------------------------
   Cores "-emphasis" do Bootstrap no tema escuro (2.8.67)

   O Bootstrap calcula os tons "-emphasis" para fundo CLARO: são versões
   escurecidas da cor. Jogados sobre o fundo escuro do Wine eles ficam quase
   da cor do fundo (o "text-warning-emphasis" dava 2,27:1, ilegível).

   Aqui eles voltam a ser a versão CLARA da mesma cor. O :not(.bg-*-subtle)
   deixa de fora os badges que já nascem em par (fundo suave + texto escuro),
   onde o contraste sempre foi bom. O !important é necessário porque a própria
   utilitária do Bootstrap já vem com !important - sem ele, esta regra perde.
--------------------------------------------------------------------------- */
body[data-tema="escuro"] .text-warning-emphasis:not([class*="bg-"]) { color: #FFD666 !important; }
body[data-tema="escuro"] .text-success-emphasis:not([class*="bg-"]) { color: #6FD69A !important; }
body[data-tema="escuro"] .text-danger-emphasis:not([class*="bg-"]) { color: #FF9AA2 !important; }
body[data-tema="escuro"] .text-info-emphasis:not([class*="bg-"]) { color: #7ED6E8 !important; }
body[data-tema="escuro"] .text-primary-emphasis:not([class*="bg-"]) { color: #8FB6FF !important; }
body[data-tema="escuro"] .text-secondary-emphasis:not([class*="bg-"]) { color: #C3CAD4 !important; }

/* Texto secundário: no escuro, cinza claro demais some - sobe o contraste */
body[data-tema="escuro"] thead th,
body[data-tema="escuro"] .table thead th { color: #C3CAD4; }
body[data-tema="escuro"] .text-muted,
body[data-tema="escuro"] .form-text,
body[data-tema="escuro"] small.text-muted { color: #9BA3AE !important; }

/* ==========================================================
   BOTÕES NOVOS DO TOPO (2.8.62): voltar e sol/lua
   ========================================================== */
/* Os dois são <button>, e <button> vem com fundo e borda do navegador -
   sem isso, a seta de voltar aparece dentro de um retângulo cinza. */
.topbar-voltar, #btn-tema {
  border: 0; background: transparent; padding: 0; color: inherit; appearance: none;
}
.topbar-voltar { margin-left: .35rem; flex-shrink: 0; }
#btn-tema .icone-sol { display: none; }
.topbar-voltar:hover, #btn-tema:hover { background: var(--wine-bg); }
body[data-tema="escuro"] .topbar-voltar,
body[data-tema="escuro"] #btn-tema { color: var(--wine-ink); }
body[data-tema="escuro"] .topbar-voltar:hover,
body[data-tema="escuro"] #btn-tema:hover { background: #23272E; }

/* ==========================================================
   ALVO DE TOQUE NO CELULAR (2.8.62)
   O Fernando relatou caixinha que "não marca" no celular. A caixa tinha
   ~20px de lado e o dedo cobre uns 45px: encostar um pouco fora fazia o
   toque cair na LINHA da tabela (que abre o chamado) em vez da caixinha.
   Agora, em tela de toque, a caixinha é maior e a célula inteira ao redor
   dela vale como área de toque.
   ========================================================== */
/* A célula da caixinha vira área de toque: mais larga e com o cursor certo */
.celula-marcar { cursor: pointer; min-width: 38px; }
.celula-marcar:hover { background: rgba(0,0,0,.03); }
body[data-tema="escuro"] .celula-marcar:hover { background: rgba(255,255,255,.05); }
.celula-marcar input[disabled] { cursor: not-allowed; opacity: .35; }

@media (hover: none) and (pointer: coarse) {
  .form-check-input { width: 1.35rem; height: 1.35rem; margin-top: .1rem; }
  .celula-marcar { min-width: 46px; }
  .form-check-label { padding-left: .15rem; }
  td > .check-chamado, td > input[type="checkbox"] {
    width: 1.35rem; height: 1.35rem;
    /* área invisível ao redor: o toque "quase em cima" ainda marca */
    outline-offset: 0; position: relative; z-index: 2;
  }
  td > input[type="checkbox"]::before {
    content: ''; position: absolute; inset: -12px;
  }
}

/* Abas da lista de chamados: o bordô escuro do tema claro some no fundo
   preto (contraste de 1,6:1, ilegível). No escuro elas usam o rosa do tema. */
body[data-tema="escuro"] .nav-tabs .nav-link { color: var(--wine-primary); }
body[data-tema="escuro"] .nav-tabs .nav-link:hover { color: var(--wine-primary-dark); border-color: var(--wine-border); }
body[data-tema="escuro"] .nav-tabs { border-bottom-color: var(--wine-border); }
body[data-tema="escuro"] .nav-tabs .nav-link.active {
  background-color: var(--wine-surface); border-color: var(--wine-border) var(--wine-border) var(--wine-surface); color: var(--wine-ink);
}

/* Nome de quem está logado, no topo (o #333 fixo do header some no escuro) */
body[data-tema="escuro"] .topbar-usuario-nome { color: var(--wine-ink); }
body[data-tema="escuro"] .topbar-usuario-perfil { color: #9BA3AE; }

/* Etiquetas de situação e "chips" com fundo claro fixo */
body[data-tema="escuro"] .sit-chip { background-color: #22262D; border-color: var(--wine-border); color: var(--wine-ink); }
body[data-tema="escuro"] .sit-chip:hover { border-color: #444A54; color: #fff; }
body[data-tema="escuro"] .sit-grupo-label { color: #9BA3AE; }
body[data-tema="escuro"] .filtro-salvo { background-color: #22262D; border-color: var(--wine-border); color: var(--wine-ink); }

/* Botões redondos do canto e ícones das Ações */
body[data-tema="escuro"] .btn-outline-primary { color: var(--wine-primary); border-color: var(--wine-primary); }
body[data-tema="escuro"] .btn-outline-primary:hover { background: var(--wine-primary); color: #1A0A10; }

/* ==========================================================
   CORREÇÕES DE LEGIBILIDADE DO TEMA ESCURO (2.8.62)
   Varredura de contraste (scratchpad/ver-contraste2.js) em 19 telas: tudo
   abaixo de 3,2:1 entrou aqui. Eram cores FIXAS do tema claro (bordô,
   #fff, #333) que sobraram no escuro, mais as variáveis de link do
   Bootstrap - que são resolvidas onde foram DECLARADAS (:root), e por isso
   não acompanhavam a troca feita no body.
   ========================================================== */

/* Links: eram o bordô escuro (#7A1F3D) sobre fundo preto - 1,6:1 */
body[data-tema="escuro"] {
  --bs-link-color: #F0899F;
  --bs-link-color-rgb: 240, 137, 159;
  --bs-link-hover-color: #F7B3C2;
}
body[data-tema="escuro"] a:not(.btn):not(.sidebar-link):not(.dropdown-item):not(.nav-link):not(.page-link) { color: #F0899F; }
body[data-tema="escuro"] a:not(.btn):not(.sidebar-link):not(.dropdown-item):not(.nav-link):not(.page-link):hover { color: #F7B3C2; }
/* cabeçalho clicável da lista (ordenar): era .text-dark, quase invisível */
body[data-tema="escuro"] a.text-dark { color: #D7DCE3 !important; }

/* Abas do painel (Meus chamados / Na fila): a aba ativa tinha fundo BRANCO
   fixo com texto claro por cima - ilegível */
body[data-tema="escuro"] .abas-painel { background: #23272E; }
body[data-tema="escuro"] .aba-painel { color: #B9C1CC; }
body[data-tema="escuro"] .aba-painel:hover { color: #fff; }
body[data-tema="escuro"] .aba-painel.ativa { background: #343A44; color: #fff; box-shadow: none; }

/* Botões de contorno: a cor da borda servia de texto e sumia no escuro */
body[data-tema="escuro"] .btn-outline-primary { color: #F0899F; border-color: #C9556F; }
body[data-tema="escuro"] .btn-outline-primary:hover,
body[data-tema="escuro"] .btn-outline-primary.active { background: #C9556F; border-color: #C9556F; color: #fff; }
body[data-tema="escuro"] .btn-outline-danger { color: #F08090; border-color: #B8505F; }
body[data-tema="escuro"] .btn-outline-danger:hover { background: #B8505F; color: #fff; }
body[data-tema="escuro"] .btn-outline-success { color: #79D18F; border-color: #4E8C5E; }
body[data-tema="escuro"] .btn-outline-success:hover { background: #4E8C5E; color: #fff; }
body[data-tema="escuro"] .btn-outline-warning { color: #EBC15C; border-color: #97803C; }
body[data-tema="escuro"] .btn-outline-warning:hover { background: #97803C; color: #1A1400; }
body[data-tema="escuro"] .btn-outline-info { color: #6FC7E0; border-color: #45808F; }
body[data-tema="escuro"] .btn-outline-info:hover { background: #45808F; color: #fff; }

/* Vermelho de alerta fixo (#B3222E) dentro de tabela/aviso */
body[data-tema="escuro"] .agora-tempo-longo,
body[data-tema="escuro"] .table > :not(caption) > * > .agora-tempo-longo,
body[data-tema="escuro"] .km-aviso-km,
body[data-tema="escuro"] .text-danger { color: #FF8A98 !important; }

/* Etiquetas claras fixas (badge bg-light / text-bg-light) */
body[data-tema="escuro"] .badge.bg-light,
body[data-tema="escuro"] .badge.text-bg-light { background-color: #343A44 !important; color: #E8EAED !important; }

/* Texto secundário: a barra de 3:1 pedia um passo a mais */
body[data-tema="escuro"] .lista-painel-sub,
body[data-tema="escuro"] .text-muted,
body[data-tema="escuro"] .form-text,
body[data-tema="escuro"] small.text-muted,
body[data-tema="escuro"] .table td .text-muted { color: #AEB6C2 !important; }
body[data-tema="escuro"] td { color: var(--wine-ink); }

/* Ícones da coluna Ações (lupa, câmera, lápis...) */
body[data-tema="escuro"] td .btn.btn-sm { color: #D7DCE3; }
body[data-tema="escuro"] td .btn.btn-sm:hover { color: #fff; }

/* Fundo claro fixo dentro do alerta do dashboard */
body[data-tema="escuro"] .alert .badge { color: #1A1A1A; }

/* Data de abertura na lista (era color:#666 fixo dentro do HTML) */
.col-aberto-em { color: #666; }
body[data-tema="escuro"] .col-aberto-em { color: #AEB6C2; }

/* Linha de SLA estourado: o .table-danger do Bootstrap é um rosa CLARO fixo.
   No escuro o texto virou claro e sumiu dentro dela - aqui a linha vira um
   vinho escuro e tudo dentro dela volta a ser legível. */
body[data-tema="escuro"] .table > :not(caption) > tr.table-danger > *,
body[data-tema="escuro"] tr.table-danger > * {
  --bs-table-bg: #3A1A1F; --bs-table-color: #F5DDE1;
  background-color: #3A1A1F !important; color: #F5DDE1 !important;
}
body[data-tema="escuro"] tr.table-danger a,
body[data-tema="escuro"] tr.table-danger .btn { color: #FFD7DD !important; }
body[data-tema="escuro"] tr.table-danger .col-aberto-em { color: #E0B9BF !important; }

/* Link dentro de alerta colorido: o rosa dos links some no fundo do alerta */
body[data-tema="escuro"] .alert a:not(.btn),
body[data-tema="escuro"] .alert span:not(.badge) { color: inherit; }
body[data-tema="escuro"] .alert a:not(.btn) { text-decoration: underline; }

/* Itens de lista do painel (dashboard) */
body[data-tema="escuro"] .lista-painel-item { border-bottom-color: #2E323A; color: var(--wine-ink); }
body[data-tema="escuro"] .lista-painel-item:hover { background: #23272E; color: #fff; }
body[data-tema="escuro"] .lista-painel-sub,
body[data-tema="escuro"] .painel-bloco .text-muted,
body[data-tema="escuro"] .painel-bloco small { color: #C2C9D4 !important; }

/* Ícones da coluna Ações quando o botão não tem cor própria.
   2.8.65: os :not() são a correção de um efeito colateral desta regra. Ela
   pintava TODO botão pequeno dentro de uma tabela - inclusive os de fundo
   sólido, que já trazem o texto certo do Bootstrap. O "Imprimir" azul do
   relatório de Declarações ficava com texto cinza-claro sobre azul (2,9:1).
   Botão de contorno (btn-outline-*) e botão sem variante continuam valendo. */
body[data-tema="escuro"] td .btn.btn-sm:not(.btn-primary):not(.btn-secondary):not(.btn-success):not(.btn-danger):not(.btn-warning):not(.btn-info):not(.btn-light):not(.btn-dark):not(.btn-roxo),
body[data-tema="escuro"] td span.btn.btn-sm:not(.btn-primary):not(.btn-secondary):not(.btn-success):not(.btn-danger):not(.btn-warning):not(.btn-info):not(.btn-light):not(.btn-dark):not(.btn-roxo) { color: #C9D0DA; }

/* Bloco "Precisa de atenção agora": o cartão tinha fundo branco fixo */
body[data-tema="escuro"] .atencao-item { background: var(--wine-surface); border-color: var(--wine-border); color: var(--wine-ink); }
body[data-tema="escuro"] .atencao-item:hover { border-color: #444A54; box-shadow: none; color: #fff; }
body[data-tema="escuro"] .atencao-item span:not(.atencao-qtd) { color: var(--wine-ink); }
body[data-tema="escuro"] .atencao-danger .atencao-qtd { background: #A8323F; }

/* Ícone de "sem evidência" na lista: cinza-claro sobre branco, cores fixas
   dentro do próprio HTML - aqui elas são refeitas para o escuro */
body[data-tema="escuro"] td span.btn.btn-sm[title*="Sem evid"],
body[data-tema="escuro"] td span.btn.btn-sm[title*="não disponível"],
body[data-tema="escuro"] td span.btn.btn-sm[title*="Sem Declara"] {
  color: #8B949F !important; border-color: #3A404A !important; background: #22262D !important;
}
body[data-tema="escuro"] tr.table-danger span.btn.btn-sm[title*="Sem evid"] {
  color: #C7A7AD !important; border-color: #5A343A !important; background: #2E1418 !important;
}

/* Lista de frases prontas da RAT (2.8.62): item destacado pelo teclado e
   o grifo do que foi encontrado na busca */
.frase-item.ativo { background: var(--wine-bg); }
.frase-item mark { background: #FFE9A8; color: inherit; padding: 0 .1em; border-radius: 2px; }
body[data-tema="escuro"] .frase-item.ativo { background: #2A2F37; }
body[data-tema="escuro"] .frase-item mark { background: #6A5418; color: #FFF3D0; }
#frases-lista { max-height: 46vh; overflow-y: auto; }

/* ==========================================================
   SEGUNDA VARREDURA DO TEMA ESCURO (2.8.63)
   A primeira (2.8.62) cobriu 19 telas com o menu de notificações
   FECHADO e sem passar pela Passagem de turno. Agora o auditor
   (scratchpad/auditar-telas.js) abre as 48 telas COM o sino aberto -
   e achou o resto: o menu de notificações, o hover das tabelas
   (o Bootstrap 5.3 usa --bs-table-hover-bg, não a variável antiga
   que eu tinha trocado), a Passagem de turno inteira e os blocos
   de código do Manual.
   ========================================================== */

/* --- Menu de notificações (aparece em TODA tela) --- */
body[data-tema="escuro"] .dropdown-menu { background-color: var(--wine-surface); border-color: var(--wine-border); }
body[data-tema="escuro"] .dropdown-item { color: var(--wine-ink); }
body[data-tema="escuro"] .dropdown-item:hover,
body[data-tema="escuro"] .dropdown-item:focus { background-color: #2A2F37; color: #fff; }
body[data-tema="escuro"] .dropdown-header { color: #AEB6C2; }
body[data-tema="escuro"] .dropdown-divider { border-top-color: var(--wine-border); }
body[data-tema="escuro"] .notif-item { color: var(--wine-ink); }
body[data-tema="escuro"] .notif-item.notif-nao-lida { background: #2E2126; border-left-color: var(--wine-primary); }
body[data-tema="escuro"] .notif-item .text-muted,
body[data-tema="escuro"] .notif-item .small { color: #AEB6C2 !important; }
body[data-tema="escuro"] .dropdown-item-text { color: #AEB6C2; }

/* --- Tabelas: o Bootstrap 5.3 pinta hover/zebra por estas variáveis --- */
body[data-tema="escuro"] .table {
  --bs-table-bg: transparent;
  --bs-table-color: var(--wine-ink);
  --bs-table-border-color: var(--wine-border);
  --bs-table-hover-bg: #262B33;
  --bs-table-hover-color: #fff;
  --bs-table-striped-bg: #1F232A;
  --bs-table-striped-color: var(--wine-ink);
  --bs-table-active-bg: #2A2F37;
  --bs-table-active-color: #fff;
}
body[data-tema="escuro"] .linha-sem-chamado td { background: #1B1F25; }

/* --- Passagem de turno (o CSS dela mora dentro da própria tela) --- */
body[data-tema="escuro"] .pt-emissao { background: #2E1A20; border-color: #543039; }
body[data-tema="escuro"] .pt-card,
body[data-tema="escuro"] .pt-secao { background: var(--wine-surface); border-color: var(--wine-border); color: var(--wine-ink); }
body[data-tema="escuro"] .pt-tabela th { background: #262B33; color: #C3CAD4; }
body[data-tema="escuro"] .pt-tabela tbody tr:nth-child(even) td { background: #1F232A; }
body[data-tema="escuro"] .pt-contador.zero { background: #343A44; color: #C3CAD4; }
body[data-tema="escuro"] .pt-secao h6,
body[data-tema="escuro"] .pt-card h6 { color: var(--wine-ink); }

/* --- Manual: blocos de comando --- */
body[data-tema="escuro"] .manual-conteudo pre,
body[data-tema="escuro"] pre { background: #14171C; border-color: var(--wine-border); color: #D7DCE3; }
body[data-tema="escuro"] code { background: #262B33; color: #F0C7D2; border-radius: 4px; padding: 0 .25em; }
body[data-tema="escuro"] pre code { background: transparent; color: #D7DCE3; padding: 0; }

/* --- Cartões e blocos do painel com fundo branco fixo --- */
body[data-tema="escuro"] .kpi,
body[data-tema="escuro"] .painel-card,
body[data-tema="escuro"] .busca-topo-resultados,
body[data-tema="escuro"] .fab-btn-secundario { background: var(--wine-surface); border-color: var(--wine-border); color: var(--wine-ink); }
body[data-tema="escuro"] .kpi-perigo { background: #2E1A1D; border-color: #5A3036; }
body[data-tema="escuro"] .atencao-card { background: #241B1D; border-color: #5A3036; }
body[data-tema="escuro"] .barra-trilho { background: #2A2F37; }
body[data-tema="escuro"] .busca-topo-item:hover,
body[data-tema="escuro"] .busca-topo-item.ativo,
body[data-tema="escuro"] .busca-topo-todos:hover,
body[data-tema="escuro"] .busca-topo-todos.ativo { background: #2E2126; color: #fff; }
body[data-tema="escuro"] .busca-topo-item mark { background: #6A5418; color: #FFF3D0; }
body[data-tema="escuro"] .busca-topo-grupo { color: #AEB6C2; border-top-color: var(--wine-border); }
/* 2.8.89: a caixa da busca do topo ficava BRANCA no tema escuro */
body[data-tema="escuro"] .busca-topo-lista { background: var(--wine-surface); border-color: var(--wine-border); box-shadow: 0 10px 30px rgba(0,0,0,.45); }
body[data-tema="escuro"] .busca-topo-linha2,
body[data-tema="escuro"] .busca-topo-vazio { color: var(--wine-muted); }
body[data-tema="escuro"] .busca-topo-todos { border-top-color: var(--wine-border); }
body[data-tema="escuro"] .busca-topo-criar { background: #16271D; border-color: #3FA56B; }
body[data-tema="escuro"] .busca-topo-criar .busca-topo-linha1 { color: #8FD9AE; }
body[data-tema="escuro"] .busca-topo-criar:hover,
body[data-tema="escuro"] .busca-topo-criar.ativo { background: #1E3528 !important; color: #fff; }
body[data-tema="escuro"] .painel-barra-bloco { background: #2E1A20; border-color: #543039; }
body[data-tema="escuro"] .painel-barra-bloco button:hover { background: #40242C; }

/* --- Etiquetas de situação com fundo pastel fixo --- */
body[data-tema="escuro"] .stat-card-icon.icon-danger { background: #3A1A1D; color: #FF8A98; }
body[data-tema="escuro"] .stat-card-icon.icon-warning { background: #3A2F14; color: #EBC15C; }

/* --- Grupo de situação escolhido: texto branco sobre o vinho/azul/verde.
       Precisa de !important porque a regra geral dos links no escuro usa
       vários :not(), o que lhe dá especificidade alta. --- */
.sit-grupo-link.ativo,
body[data-tema="escuro"] .sit-grupo-link.ativo { color: #fff !important; }
body[data-tema="escuro"] .sit-chip.ativo { color: #fff !important; }

/* --- Passagem de turno: os textos do carimbo "Emitido em" e os rótulos
       cinza-claro tinham cor fixa dentro da própria tela --- */
body[data-tema="escuro"] .pt-emissao-rotulo { color: #F0899F; }
body[data-tema="escuro"] .pt-emissao-quando { color: var(--wine-ink); }
body[data-tema="escuro"] .pt-emissao-por,
body[data-tema="escuro"] .pt-card-rot,
body[data-tema="escuro"] .pt-selo.pt-cinza { color: #AEB6C2; }

/* --- .text-body do Bootstrap (usado nos links dos gráficos do painel) --- */
body[data-tema="escuro"] .text-body,
body[data-tema="escuro"] a.text-body { color: var(--wine-ink) !important; }
body[data-tema="escuro"] a.text-body:hover { color: #fff !important; }

/* ==========================================================
   TERCEIRA PASSADA (2.8.63) - o que só aparece com dados
   A varredura anterior rodou num banco quase vazio. Com o
   laboratório reconstruído (fila de triagem cheia, relatório
   por técnico com a linha de média, passagem de turno com
   atendimento em andamento e a caixa "nada aqui ainda"), o
   auditor achou mais 10 pontos. Todos tinham a mesma raiz:
   fundo CLARO fixo - ou no CSS do Bootstrap, ou escrito no
   próprio elemento com style="".
   ========================================================== */

/* --- Fila de triagem: as cores saíram do style="" e vieram pra cá --- */
.triagem-cartao { border: 1px solid #dee2e6; }
.triagem-topo { background: #f8f9fa; border-bottom: 1px solid #dee2e6; }
.triagem-num { color: #6b0d23; }
.triagem-acoes { background: #f0f4f8; border-top: 1px solid #dee2e6; }
.triagem-descricao {
  font-size: .9rem; color: #333; background: #fff8f0;
  border-left: 3px solid #fd7e14; padding: 8px 12px; border-radius: 0 4px 4px 0;
}
body[data-tema="escuro"] .triagem-cartao { border-color: var(--wine-border); }
body[data-tema="escuro"] .triagem-topo { background: #262B33; border-bottom-color: var(--wine-border); }
body[data-tema="escuro"] .triagem-num { color: #F0899F; }
body[data-tema="escuro"] .triagem-acoes { background: #1F232A; border-top-color: var(--wine-border); }
body[data-tema="escuro"] .triagem-descricao { color: #E4E7EB; background: #2A2016; border-left-color: #C86A14; }

/* --- Etiqueta "chamado recente na loja": é um <a> DENTRO de um badge.
       A regra geral dos links no escuro pintava o texto de claro em cima
       do ciano do Bootstrap (1,4:1). Link dentro de badge mantém a cor
       do próprio badge. --- */
a.badge.text-dark,
body[data-tema="escuro"] a.badge.text-dark,
body[data-tema="escuro"] a.badge.bg-info,
body[data-tema="escuro"] a.badge.bg-warning { color: #212529 !important; }
body[data-tema="escuro"] a.badge.bg-dark,
body[data-tema="escuro"] a.badge.bg-primary,
body[data-tema="escuro"] a.badge.bg-danger,
body[data-tema="escuro"] a.badge.bg-secondary,
body[data-tema="escuro"] a.badge.bg-success { color: #fff !important; }

/* --- Cabeçalho e rodapé de cartão do próprio Bootstrap --- */
body[data-tema="escuro"] .card-header,
body[data-tema="escuro"] .card-footer {
  background-color: #262B33; border-color: var(--wine-border); color: var(--wine-ink);
}

/* --- Linha destacada de tabela (.table-light): é a linha de TOTAL/MÉDIA
       do relatório por técnico. O Bootstrap 5.3 monta a cor dela com
       --bs-table-bg + --bs-table-color. --- */
body[data-tema="escuro"] .table-light,
body[data-tema="escuro"] .table > :not(caption) > * > .table-light,
body[data-tema="escuro"] tr.table-light > * {
  --bs-table-bg: #262B33;
  --bs-table-color: var(--wine-ink);
  background-color: #262B33; color: var(--wine-ink);
}

/* --- Avisos claros (alert-light / alert-secondary): a caixa "Nada aqui
       ainda" das Sugestões e as mensagens de lista vazia --- */
body[data-tema="escuro"] .alert-light,
body[data-tema="escuro"] .alert-secondary {
  background-color: #262B33; border-color: var(--wine-border); color: var(--wine-ink);
}
body[data-tema="escuro"] .alert-light .text-muted,
body[data-tema="escuro"] .alert-secondary .text-muted { color: #AEB6C2 !important; }

/* --- Passagem de turno: os selos coloridos têm cor de texto fixa e escura
       (o fundo deles é transparente, só a borda é colorida) --- */
body[data-tema="escuro"] .pt-selo.pt-azul { color: #7FB4F0; }
body[data-tema="escuro"] .pt-selo.pt-vermelho { color: #FF8A98; }
body[data-tema="escuro"] .pt-selo.pt-laranja { color: #EBAF5C; }
body[data-tema="escuro"] .pt-vazio { color: #AEB6C2; }
body[data-tema="escuro"] .pt-tabela th,
body[data-tema="escuro"] .pt-tabela td { border-bottom-color: var(--wine-border); }

/* Impressão sempre no claro (papel é branco) */
@media print {
  body[data-tema="escuro"] { --wine-bg: #fff; --wine-surface: #fff; --wine-ink: #000; --bs-body-bg: #fff; --bs-body-color: #000; color-scheme: light; }
}

/* 2.8.72 (anexo 2 do Fernando): selo "Aprovado / Aguardando" do estoque na
   LINHA DO RÓTULO, acima do campo. Altura fixa: com ou sem selo, os campos
   da linha ficam alinhados - antes o selo aparecia embaixo e empurrava o
   campo para baixo, quebrando a fileira. */
.rotulo-com-selo { display: flex; align-items: center; gap: .35rem; height: 1.3125rem; margin-bottom: .25rem; white-space: nowrap; }
.rotulo-com-selo > label { flex: 0 1 auto; min-width: 0; overflow: hidden; text-overflow: ellipsis; }
/* O selo é uma ETIQUETA PRESA NA BORDA DE CIMA DO CAMPO, à direita. Numa
   coluna estreita (notebook 1366px) rótulo + "i" de ajuda + selo não cabiam
   na mesma linha e o selo aparecia cortado ("⏳ Agu"). Presa na borda, ela
   não ocupa espaço de ninguém: não corta, não quebra e não empurra campo. */
div:has(> .rotulo-com-selo) { position: relative; }
.rotulo-com-selo [data-selo-cascata] { position: absolute; top: calc(1.5625rem - .45rem); right: calc(var(--bs-gutter-x, 1.5rem) * .5 + .35rem); z-index: 3; line-height: 0; pointer-events: auto; }
.rotulo-com-selo .selo-curto { font-size: .64rem; font-weight: 600; padding: .2em .45em; line-height: 1.1; box-shadow: 0 0 0 2px var(--bs-body-bg, #fff); }

/* 2.8.72 (anexo 3): modal "scrollable" cujo conteúdo está dentro de um
   <form> (Editar Declaração de Transporte e outros). O Bootstrap só rola o
   .modal-body quando ele é filho DIRETO do .modal-content; com o <form> no
   meio, o corpo crescia além da tela e não havia barra de rolagem. */
.modal-dialog-scrollable .modal-content > form { display: flex; flex-direction: column; max-height: 100%; overflow: hidden; min-height: 0; }
.modal-dialog-scrollable .modal-content > form > .modal-body { overflow-y: auto; }

/* 2.8.72: botões de cada visita (tela do chamado) numa fileira própria,
   mesma altura, alinhados à esquerda embaixo do "RAT n". */
.acoes-visita { display: flex; flex-wrap: wrap; gap: .3rem; margin-top: .5rem; align-items: stretch; }
.acoes-visita .btn { display: inline-flex; align-items: center; justify-content: center; line-height: 1.2; min-height: 1.9rem; }

/* 2.8.73: busca inteligente nas listas de sugestão (select-buscavel.js e
   busca-livre.js) - trecho achado grifado, item escolhido pelo teclado,
   "Nada encontrado" e o "+ Outro (digitar nova)" separado no fim. */
.select-buscavel-item mark { background: rgba(179, 34, 46, .16); color: inherit; padding: 0 1px; border-radius: 2px; font-weight: 600; }
.select-buscavel-item.ativo { background: var(--wine-bg, #f6e9eb); outline: 2px solid rgba(179, 34, 46, .35); outline-offset: -2px; }
.select-buscavel-vazio { padding: .45rem .75rem; font-size: .85rem; color: var(--wine-muted, #6c757d); font-style: italic; }
.select-buscavel-item-especial { border-top: 1px solid var(--bs-border-color, #dee2e6); font-weight: 600; color: var(--wine, #B3222E); }
body[data-tema="escuro"] .select-buscavel-item mark { background: rgba(240, 137, 159, .28); }
body[data-tema="escuro"] .select-buscavel-item.ativo { background: rgba(255, 255, 255, .08); outline-color: rgba(240, 137, 159, .5); }
body[data-tema="escuro"] .select-buscavel-item-especial { color: #F0899F; }
