/* =============================================================================
   Meeddy (med) — tema visual
   Portado do hub-theme.css do Ínsula Hub, que é a origem deste visual; aqui é
   CÓPIA INDEPENDENTE, com tudo no namespace do med (--med-*, .med-*, med-theme).
   Não editar esperando que o hub acompanhe, nem o contrário.
   Ver .specs/med/done/03-med-visual-padrao-hub.md.

   Carregado por último no header_med.html, então sobrescreve o tema base (Cuba)
   e o custom_med.css. Linguagem visual: superfícies quentes, tipografia sóbria,
   um único tom de destaque (o teal da marca) e muito espaço em branco.
   Suporta claro e escuro via [data-bs-theme] no <html>.
   ========================================================================== */

/* ----------------------------------------------------------------- tokens */
:root,
[data-bs-theme="light"] {
  --med-bg: #faf9f5;
  --med-surface: #ffffff;
  --med-surface-2: #f5f4ee;
  --med-sidebar: #f0eee6;
  --med-text: #1f1e1d;
  --med-text-soft: #55534d;
  --med-muted: #7c7a73;
  --med-border: #e6e3da;
  --med-border-soft: #efece3;
  /* Destaque: o teal da marca (#2AABC0) ESCURECIDO para o tema claro — puro
     ele dá 2,59:1 sobre o creme, o que reprova até em botão preenchido. No
     escuro a cor de marca entra como é (5,55:1 sobre #262624). */
  --med-accent: #178396;
  --med-accent-hover: #136B7C;
  --med-accent-soft: rgba(23, 131, 150, 0.12);
  --med-accent-contrast: #ffffff;
  --med-bubble-user: #f0eee6;
  --med-bubble-user-text: #1f1e1d;
  --med-shadow: 0 1px 2px rgba(31, 30, 29, .05), 0 4px 16px rgba(31, 30, 29, .04);
  --med-shadow-lg: 0 8px 32px rgba(31, 30, 29, .10);
  --med-radius: 12px;
  --med-radius-lg: 16px;
  --med-radius-pill: 999px;
}

[data-bs-theme="dark"] {
  --med-bg: #262624;
  --med-surface: #30302e;
  /* Estava #35353200 — alpha 00, ou seja, TRANSPARENTE. Tudo que usa esta
     superfície como fundo no escuro (chips, campos desabilitados, hovers)
     simplesmente não aparecia. */
  --med-surface-2: #353532;
  --med-sidebar: #1f1e1d;
  --med-text: #f5f4ef;
  --med-text-soft: #d6d3ca;
  --med-muted: #a19f96;
  --med-border: #3e3d39;
  --med-border-soft: #34332f;
  --med-accent: #2AABC0;
  --med-accent-hover: #3FBFD4;
  /* O destaque suave é usado em hover de menu, chips e realces; no escuro ele
     precisa aparecer — 18% é o mínimo que se enxerga sobre #262624. */
  --med-accent-soft: rgba(42, 171, 192, 0.18);
  --med-accent-contrast: #1f1e1d;
  --med-bubble-user: #3a3936;
  --med-bubble-user-text: #f5f4ef;
  --med-shadow: 0 1px 2px rgba(0, 0, 0, .28), 0 4px 16px rgba(0, 0, 0, .22);
  --med-shadow-lg: 0 8px 32px rgba(0, 0, 0, .38);
}

/* Alinha os tokens do Bootstrap e do chat base (ia-chat.css) aos do tema, para
   que os componentes herdados sigam a paleta sem precisar de override caso a caso */
:root,
[data-bs-theme="light"],
[data-bs-theme="dark"] {
  --bs-body-bg: var(--med-bg);
  --bs-body-color: var(--med-text);
  --bs-secondary-bg: var(--med-surface-2);
  --bs-tertiary-bg: var(--med-sidebar);
  --bs-border-color: var(--med-border);
  --bs-primary: var(--med-accent);
  --bs-link-color: var(--med-accent);
  --bs-link-hover-color: var(--med-accent-hover);
  --bs-emphasis-color: var(--med-text);
  --bs-secondary-color: var(--med-muted);

  --ia-chat-bg-body: var(--med-bg);
  --ia-chat-bg-main: var(--med-bg);
  --ia-chat-bg-sidebar: var(--med-sidebar);
  --ia-chat-bg-message-user: var(--med-bubble-user);
  --ia-chat-bg-message-assistant: transparent;
  --ia-chat-color-text: var(--med-text);
  --ia-chat-color-text-secondary: var(--med-muted);
  --ia-chat-color-border: var(--med-border);
  --ia-chat-input-bg: var(--med-surface);
  --ia-chat-input-border: var(--med-border);
  --ia-chat-input-focus: var(--med-accent);
  --ia-chat-scrollbar-thumb: var(--med-border);
  --ia-chat-scrollbar-track: transparent;
  --ia-chat-header-bg: var(--med-bg);
  --ia-chat-shadow: var(--med-shadow);
}

/* ------------------------------------------------------------ tipografia */
body,
.page-wrapper,
.btn,
.form-control,
.form-select,
input,
textarea,
select {
  font-family: "Inter", ui-sans-serif, -apple-system, "Segoe UI", Roboto, sans-serif;
  font-feature-settings: "cv02", "cv03", "cv04", "cv11";
}

body {
  background: var(--med-bg);
  color: var(--med-text);
  font-size: .9375rem;
  line-height: 1.6;
  letter-spacing: -.005em;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
}

h1, h2, h3, h4, h5, h6,
.h1, .h2, .h3, .h4, .h5, .h6 {
  color: var(--med-text);
  font-weight: 600;
  letter-spacing: -.018em;
}

small, .small { font-size: .8125rem; }
.text-muted { color: var(--med-muted) !important; }
hr { border-color: var(--med-border); opacity: 1; }

/* ------------------------------------------------------------- estrutura */
.app-container { background: var(--med-bg); }

/* A .main-area é o ÚNICO filho em fluxo do .app-container (flex) — a .sidebar é
   position:fixed. Com flex:1 e o min-width:auto padrão do flex, ela nunca encolhe
   abaixo da largura INTRÍNSECA do conteúdo: uma tabela de listagem com colunas
   nowrap e textos longos (nome de modelo, descrição) estica a área para além da
   viewport. Como a área ainda leva margin-left do tamanho da barra, TODO o
   conteúdo (barra de ações, botão "Novo agente", ações da linha) era empurrado
   para fora da borda direita — a tela "comida".
   min-width:0 faz a área respeitar a largura disponível; a tabela rola por dentro
   (.table-responsive) e a barra de ações quebra linha em vez de vazar. Em telas
   largas, onde já cabia, nada muda. */
.main-area { background: var(--med-bg); min-width: 0; }
.main-area .list-actions-btn { min-width: 0; }

.main-area .list-actions-btn .btns-pages {
  height: auto !important;
  flex-wrap: wrap;
  row-gap: .5rem;
  align-items: stretch;
}

/* `h-100` vem do markup de todas as telas e estica só quem o tem: o botão de
   cadastro ficava da altura da linha e o de recarregar, do tamanho do ícone. */
.main-area .list-actions-btn .btns-pages > .btn,
.main-area .list-actions-btn .btns-pages > a.btn,
.main-area .list-actions-btn .btns-pages > span > .btn { height: auto !important; }

/* Recarregar a listagem: fica ao lado do "Novo …" em todas as telas e é só o
   ícone — o rótulo está no tooltip. Discreto de propósito: é ação de apoio e não
   pode competir com a ação primária da barra. */
.main-area .btn-refresh {
  display: inline-flex !important;
  align-items: center;
  justify-content: center;
  width: 38px;
  /* Sem altura própria: o `stretch` da linha faz o botão acompanhar o de
     cadastro ao lado, seja qual for o tamanho dele. */
  padding: .375rem 0 !important;
  background: var(--med-surface) !important;
  border: 1px solid var(--med-border) !important;
  color: var(--med-text-soft) !important;
  border-radius: var(--med-radius) !important;
  box-shadow: none !important;
  transition: background .15s ease, color .15s ease, border-color .15s ease;
}

.main-area .btn-refresh:hover,
.main-area .btn-refresh:focus {
  background: var(--med-accent-soft) !important;
  border-color: var(--med-accent) !important;
  color: var(--med-accent) !important;
}

.main-area .btn-refresh i { font-size: .875rem; }

/* Gira enquanto o Ajax da listagem não volta (classe posta pelo
   `medUi.refreshList`), para a ação ter resposta visível mesmo quando os dados
   voltam iguais. */
.main-area .btn-refresh i.is-spinning { animation: med-refresh-spin .7s linear infinite; }

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

@media (prefers-reduced-motion: reduce) {
  .main-area .btn-refresh i.is-spinning { animation: none; opacity: .5; }
}

/* ------------------------------------------------------------- sidebar */
.sidebar {
  background: var(--med-sidebar) !important;
  border-right: 1px solid var(--med-border) !important;
}

.sidebar-header {
  background: transparent !important;
  /* Uma linha só: logo à esquerda, ações (busca/recolher) à direita. */
  display: flex !important;
  align-items: center;
  justify-content: space-between;
  gap: .5rem;
  padding: .75rem .75rem !important;
  border-bottom: 1px solid var(--med-border-soft);
}

.sidebar-header .sidebar-logo { flex: 1 1 auto; min-width: 0; }

.sidebar-header-actions {
  display: flex;
  align-items: center;
  gap: .15rem;
  flex: 0 0 auto;
}

/* Recolhida, a barra só tem espaço para a logo: as ações do topo saem e a busca
   continua alcançável pelo atalho e pela barra expandida. */
.sidebar:not(.expanded) .sidebar-header-actions { display: none; }

/* Sem as ações, o `space-between` deixava a logo encostada na esquerda —
   recolhida ela fica centralizada, alinhada com o "+" e os ícones do menu. */
.sidebar:not(.expanded) .sidebar-header {
  justify-content: center;
  padding-left: .35rem !important;
  padding-right: .35rem !important;
}

.sidebar:not(.expanded) .sidebar-header .sidebar-logo {
  flex: 0 0 auto;
  display: flex;
  justify-content: center;
  width: 100%;
}

.sidebar-icon-btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 32px;
  height: 32px;
  padding: 0;
  border: 0;
  border-radius: var(--med-radius);
  background: transparent;
  color: var(--med-muted);
  font-size: 1rem;
  transition: background .15s ease, color .15s ease;
}

.sidebar-icon-btn:hover {
  background: var(--med-accent-soft);
  color: var(--med-text);
}

/* A logo vinha com filtro para ficar branca sobre o gradiente antigo; agora o
   fundo é claro, então ela volta ao natural (e clareia no tema escuro). */
.sidebar-header #logo,
.sidebar-header #logo_icon { filter: none !important; }
/* No escuro também vai sem filtro: as duas artes já têm contraste próprio e o
   invert chapava as cores. */
[data-bs-theme="dark"] .sidebar-header #logo,
[data-bs-theme="dark"] .sidebar-header #logo_icon { filter: none !important; opacity: 1; }

/* Faixa de selos de contexto (Administrador / Conta de teste / Expert), logo
   abaixo do cabeçalho. Eram absolutos DENTRO do cabeçalho e, com ele virando uma
   linha só, caíam por cima da logo e do botão de novo atendimento. */
.sidebar-flags {
  display: flex;
  flex-wrap: wrap;
  gap: .3rem;
  padding: .1rem .75rem .5rem;
}

/* Recolhida, a barra tem 70px: "Administrador" sairia cortado no meio da
   palavra. É informação de contexto, não de navegação — some com a barra
   fechada e volta ao reabrir. */
.sidebar:not(.expanded) .sidebar-flags { display: none; }

.sidebar-flags .badge {
  font-size: .62rem !important;
  letter-spacing: .04em;
  text-transform: uppercase;
  border-radius: var(--med-radius-pill) !important;
  padding: .1rem .5rem !important;
  box-shadow: none !important;
}

.sidebar-flags .admin-info,
.sidebar-header .admin-info {
  background: var(--med-accent) !important;
  color: var(--med-accent-contrast) !important;
  font-size: .62rem;
  letter-spacing: .04em;
  text-transform: uppercase;
  border-radius: var(--med-radius-pill);
  padding: .1rem .5rem;
}

.sidebar-body { padding: .5rem 0 !important; }

.top-menu { gap: .15rem !important; padding: 0 .5rem; }

.menu-item {
  border-radius: var(--med-radius);
  color: var(--med-text-soft) !important;
  font-weight: 500;
  padding: .1rem .25rem !important;
  transition: background .15s ease, color .15s ease;
}

.sidebar.expanded .menu-item { padding: .5rem .65rem !important; }

.menu-item:hover {
  background: var(--med-accent-soft) !important;
  color: var(--med-text) !important;
}

.menu-item.active,
.menu-item[aria-current="page"] {
  background: var(--med-accent-soft) !important;
  color: var(--med-accent) !important;
}

.menu-icon { font-size: 1.05rem !important; width: 34px !important; height: 34px !important; }
.menu-text { font-size: .875rem !important; margin-left: .5rem !important; }

.menu-badge { border-color: var(--med-border) !important; color: var(--med-muted) !important; }

/* Botão "Nova conversa" */
.new-chat-btn {
  background: var(--med-accent) !important;
  color: var(--med-accent-contrast) !important;
  border-radius: var(--med-radius) !important;
  font-weight: 500 !important;
  font-size: .875rem !important;
  box-shadow: none !important;
  transition: background .15s ease;
}
.new-chat-btn:hover { background: var(--med-accent-hover) !important; }
.sidebar.expanded .new-chat-btn { width: calc(100% - 1rem) !important; margin: .25rem .5rem 1rem !important; }

/* Dica do atalho no botão "Nova conversa": só no hover, para não competir com o
   rótulo. Fora dela o botão fica idêntico ao de antes. */
.new-chat-btn {
  display: flex !important;
  align-items: center;
  justify-content: space-between !important;
  gap: .5rem;
}

.new-chat-btn .new-chat-label { display: inline-flex; align-items: center; }

.new-chat-kbd {
  background: rgba(255, 255, 255, .18);
  color: inherit;
  border-radius: .35rem;
  padding: .1rem .35rem;
  font-size: .66rem;
  font-weight: 600;
  white-space: nowrap;
  opacity: 0;
  transition: opacity .15s ease;
}

.new-chat-btn:hover .new-chat-kbd,
.new-chat-btn:focus-visible .new-chat-kbd { opacity: 1; }

/* Recolhida, só cabe o "+": rótulo e dica saem. O botão também encolhe — com
   42px ele destoava dos ícones do menu (28px) e virava o elemento dominante da
   barra. 34px o mantém em destaque sem competir com a logo. */
.sidebar:not(.expanded) .new-chat-btn {
  justify-content: center !important;
  width: 34px !important;
  height: 34px !important;
  min-height: 34px !important;
  margin: .1rem auto .6rem !important;
  font-size: 1rem !important;
}
.sidebar:not(.expanded) .new-chat-kbd { display: none; }

/* Conversas/Agentes: linha compacta, para o histórico começar mais acima. */
.top-menu-compact { margin-bottom: .35rem; }
.sidebar.expanded .top-menu-compact .menu-item { padding: .3rem .65rem !important; }
.top-menu-compact .menu-icon { width: 28px !important; height: 28px !important; font-size: .95rem !important; }
.top-menu-compact .menu-text { font-size: .8125rem !important; }

/* [removido do porte] Janela de busca de conversas (.chat-search-*).
   É um RECURSO, não estilo: depende de /ia/search-conversations, que não existe no med. A busca daqui é o #searchAttendance da barra lateral.
   Se a funcionalidade vier para o med, o bloco está no hub-theme.css. */

/* Conversa fixada: alfinete discreto ao lado do título no histórico */
.history-list .conv-pin-mark { font-size: .7rem; color: var(--med-muted); margin-left: .25rem; }

/* Histórico de conversas — lista compacta, com ícone de balão no lugar das iniciais */
.history-list { padding: 0 .4rem; }
.history-list ul li { margin: 0 !important; padding: 0 !important; }

.history-list li.fw-bold {
  color: var(--med-muted) !important;
  font-size: .6875rem !important;
  font-weight: 600 !important;
  text-transform: uppercase;
  letter-spacing: .06em;
  margin: .85rem 0 .2rem !important;
  padding: 0 .55rem !important;
}

.history-list .conv-item {
  display: flex;
  align-items: center;
  gap: .5rem;
  margin: 0 !important;
  padding: .3rem .55rem !important;
  border-radius: 8px;
  color: var(--med-text-soft) !important;
  font-size: .8125rem;
  line-height: 1.35;
  text-decoration: none;
  transition: background .15s ease;
}
.history-list .conv-item:hover { background: var(--med-accent-soft); color: var(--med-text) !important; }
.history-list .conv-item .title { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }

.history-list .conv-icon {
  flex: 0 0 auto;
  font-size: .8rem;
  color: var(--med-muted);
  opacity: .85;
}
.history-list .conv-item:hover .conv-icon { color: var(--med-accent); opacity: 1; }

/* Ações da conversa (renomear / excluir): o botão fica sobre o item, revelado
   no hover. Ele é IRMÃO do link, não filho — dentro do <a> o clique abriria a
   conversa junto do menu. */
.history-list .conv-row { position: relative; }
.history-list .conv-row .conv-item { padding-right: 1.9rem !important; }

.conv-actions {
  position: absolute;
  top: 50%;
  right: .25rem;
  transform: translateY(-50%);
}
.conv-actions-btn {
  width: 24px;
  height: 24px;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  padding: 0;
  border: 0;
  border-radius: 6px;
  background: transparent;
  color: var(--med-muted);
  font-size: .8rem;
  line-height: 1;
  opacity: 0;
  transition: opacity .15s ease, background .15s ease, color .15s ease;
}
.history-list .conv-row:hover .conv-actions-btn,
.conv-actions-btn:focus-visible,
.conv-actions.show .conv-actions-btn,
.conv-actions-btn[aria-expanded="true"] { opacity: 1; }
.conv-actions-btn:hover { background: var(--med-border); color: var(--med-text); }

/* Sem hover (toque), o menu precisa estar sempre alcançável. */
@media (hover: none) {
  .conv-actions-btn { opacity: 1; }
}

/* Menu recolhido: a lista some, então as ações não têm o que fazer. */
.sidebar:not(.expanded) .conv-actions { display: none; }

/* Enquanto o menu está aberto, a caixa de ações precisa subir acima das linhas
   seguintes. O transform em .conv-actions cria um stacking context próprio, então
   o z-index que o Bootstrap dá ao .dropdown-menu fica preso ali dentro — as
   conversas renderizadas DEPOIS no DOM pintavam por cima e o texto atravessava o
   menu. Cobrimos os dois jeitos de o Bootstrap sinalizar "aberto": .show no
   wrapper e o botão com aria-expanded. */
.conv-actions.show,
.conv-actions:has(.dropdown-menu.show),
.conv-actions:has(.conv-actions-btn[aria-expanded="true"]) { z-index: 1080; }

/* Menu de opções da conversa (Renomear / Excluir). Estilo próprio, NÃO herdado
   de #sidebar .dropdown-menu: o Bootstrap pode reposicionar o dropdown e ele
   escapava daquele seletor, ficando sem fundo — a lista aparecia ATRAVÉS do
   menu. Fundo opaco e cores sólidas, independentes de onde ele for renderizado. */
.conv-actions-menu.dropdown-menu {
  min-width: 172px;
  padding: .35rem !important;
  background-color: var(--med-surface) !important;
  border: 1px solid var(--med-border) !important;
  border-radius: var(--med-radius-lg) !important;
  box-shadow: var(--med-shadow-lg) !important;
}
.conv-actions-menu .dropdown-item {
  display: flex;
  align-items: center;
  border-radius: 8px;
  padding: .5rem .6rem;
  font-size: .875rem;
  color: var(--med-text) !important;
  background: transparent;
}
.conv-actions-menu .dropdown-item:hover,
.conv-actions-menu .dropdown-item:focus {
  background-color: var(--med-accent-soft) !important;
  color: var(--med-text) !important;
}
.conv-actions-menu .dropdown-item.conv-delete,
.conv-actions-menu .dropdown-item.conv-delete i { color: var(--med-danger, #d33) !important; }
.conv-actions-menu .dropdown-item.conv-delete:hover { background-color: rgba(211, 51, 51, .1) !important; }

/* Rodapé do usuário */
.sidebar-footer { border-top: 1px solid var(--med-border-soft); padding: .5rem; }
.user-area { border-radius: var(--med-radius); padding: .4rem; transition: background .15s ease; }
.user-area:hover { background: var(--med-accent-soft); }

/* Menu RECOLHIDO: o caret do dropdown continuava ocupando espaço na linha do
   usuário mesmo sem o nome ao lado, empurrando as iniciais para fora do centro
   e contra a borda lateral da barra. Sem o caret, os 34px do avatar ficam
   realmente centrados nos 70px da barra recolhida. */
.sidebar:not(.expanded) .sidebar-footer .dropdown-toggle::after { display: none !important; }
.sidebar:not(.expanded) .sidebar-footer .user-area {
  justify-content: center !important;
  width: 100% !important;
  padding: 0 !important;
}
.sidebar:not(.expanded) .sidebar-footer { padding-left: .35rem; padding-right: .35rem; }
.user-name .fw-bold { font-size: .875rem; font-weight: 500 !important; color: var(--med-text); }

.avatar-circle,
.med-user-initials {
  background: var(--med-accent) !important;
  color: var(--med-accent-contrast) !important;
  font-weight: 600 !important;
  font-size: .8rem !important;
  letter-spacing: .01em;
  width: 34px !important; height: 34px !important;
  min-width: 34px !important; min-height: 34px !important;
  max-width: 34px !important; max-height: 34px !important;
  border-radius: 9px !important;
  display: flex; align-items: center; justify-content: center;
  text-transform: uppercase;
}

#sidebar .dropdown-menu {
  background: var(--med-surface) !important;
  border: 1px solid var(--med-border) !important;
  border-radius: var(--med-radius-lg) !important;
  box-shadow: var(--med-shadow-lg) !important;
  padding: .35rem !important;
}
#sidebar .dropdown-item {
  border-radius: 8px;
  color: var(--med-text-soft) !important;
  font-size: .875rem;
  padding: .5rem .6rem;
}
#sidebar .dropdown-item:hover { background: var(--med-accent-soft) !important; color: var(--med-text) !important; }
#sidebar .dropdown-item i { color: var(--med-muted); font-size: 1rem !important; }

/* =============================================================================
   Menu do usuário (avatar do rodapé da barra lateral)

   Abre COM A BARRA RECOLHIDA, ao lado da trilha — antes o clique no avatar
   expandia a barra só para o menu caber, desfazendo o layout escolhido. Com a
   barra recolhida o nome não aparece em lugar nenhum da tela, então o topo do
   próprio menu passou a ser o cartão de quem está logado.
   ============================================================================= */

/* Largura FIXA, não min-width: o e-mail do cartão tem ellipsis, que só atua com
   largura limitada. Com min-width o menu esticava até caber o endereço inteiro
   (~330px), ficava mais largo que a barra de 260px e vazava para fora da tela. */
.med-user-menu {
  --med-user-menu-width: 15.5rem;
  width: var(--med-user-menu-width);
  min-width: var(--med-user-menu-width);
  max-width: calc(100vw - 1rem);
  padding: .35rem !important;
  max-height: calc(100vh - 5rem);
  overflow-y: auto;
  /* Acima do conteúdo quando escapa da barra (que já está em z-index 1050). */
  z-index: 1060;
}

/* POSIÇÃO — pelo id de propósito.
   Com data-bs-display="static" o Bootstrap carimba data-bs-popper="static" no
   menu, e o CSS dele traz `.dropdown-menu[data-bs-popper] { top: 100% }`, que é
   mais específico (0,2,0) do que uma classe: o menu descia e sumia embaixo da
   tela com a barra ABERTA. O #user-menu (1,0,0) vence sem precisar de
   !important em cada propriedade.

   Barra aberta: sobe a partir do avatar, ancorado pela ESQUERDA. Pela direita
   ele crescia para fora da tela quando ficava mais largo que a barra; pela
   esquerda o excesso passa por cima do conteúdo, que é o que a referência faz. */
#user-menu.med-user-menu {
  position: absolute;
  top: auto;
  right: auto;
  bottom: calc(100% + .4rem);
  left: 0;
  margin: 0;
}

/* ---- superfície do menu ----
   Escrita pelo id porque o tema base pinta os dropdowns por vários caminhos
   (style.css, custom.css, form-custom.css) e o resultado no escuro ficava com
   contraste baixo e linha em volta de cada item. */
#user-menu.med-user-menu {
  background: var(--med-surface) !important;
  border: 1px solid var(--med-border) !important;
  border-radius: 14px !important;
  box-shadow: 0 10px 32px rgba(0, 0, 0, .16) !important;
}

[data-bs-theme="dark"] #user-menu.med-user-menu {
  background: #2f2f2d !important;
  border-color: rgba(255, 255, 255, .09) !important;
  box-shadow: 0 12px 36px rgba(0, 0, 0, .5) !important;
}

/* ---- itens: sem contorno, sem linha, sem quina ----
   O que estava desenhando um retângulo em volta de cada linha do menu vinha do
   tema base; aqui os itens são zerados e redesenhados. Ícone e rótulo em
   colunas para o rótulo de duas linhas ("Convites de colaboração") não quebrar
   por baixo do ícone. */
#user-menu.med-user-menu li { border: 0 !important; background: none !important; }

/* Separador desenhado por pseudo-elemento também some: era isso que punha uma
   linha em volta de cada item, e a origem muda conforme a folha do tema base
   que ganha a disputa. O <hr> dos divisores é elemento real e não é afetado. */
#user-menu.med-user-menu li::before,
#user-menu.med-user-menu li::after,
#user-menu.med-user-menu .dropdown-item::before,
#user-menu.med-user-menu .dropdown-item::after {
  content: none !important;
  display: none !important;
}

#user-menu.med-user-menu .dropdown-item {
  display: flex;
  align-items: center;
  gap: .6rem;
  padding: .5rem .6rem;
  border: 0 !important;
  border-radius: 8px;
  box-shadow: none !important;
  font-size: .875rem;
  /* O texto herdava um cinza claro do tema base e ficava difícil de ler no
     modo claro; aqui é a cor de texto do tema, cheia. */
  color: var(--med-text) !important;
}

#user-menu.med-user-menu .dropdown-item i {
  flex: 0 0 1.05rem;
  text-align: center;
  font-size: 1rem !important;
  color: var(--med-muted) !important;
}

/* Hover neutro, não colorido: o accent tingia a linha inteira e competia com o
   conteúdo. */
#user-menu.med-user-menu .dropdown-item:hover,
#user-menu.med-user-menu .dropdown-item:focus {
  background: var(--med-surface-2) !important;
  color: var(--med-text) !important;
}

#user-menu.med-user-menu .dropdown-item:hover i { color: var(--med-text) !important; }

[data-bs-theme="dark"] #user-menu.med-user-menu .dropdown-item:hover,
[data-bs-theme="dark"] #user-menu.med-user-menu .dropdown-item:focus {
  background: rgba(255, 255, 255, .07) !important;
}

#user-menu.med-user-menu .dropdown-header {
  padding: .5rem .6rem .2rem;
  font-size: .68rem;
  font-weight: 600;
  text-transform: uppercase;
  letter-spacing: .05em;
  color: var(--med-muted) !important;
  background: none !important;
}

#user-menu.med-user-menu .dropdown-divider {
  margin: .3rem .35rem;
  border-top: 1px solid var(--med-border-soft) !important;
  opacity: 1;
}

[data-bs-theme="dark"] #user-menu.med-user-menu .dropdown-divider {
  border-top-color: rgba(255, 255, 255, .08) !important;
}

/* ---- cartão de quem está logado, no topo do menu ---- */
#user-menu .med-user-card {
  display: flex;
  align-items: center;
  gap: .6rem;
  padding: .55rem .6rem;
  border: 0 !important;
}

/* min-width:0 + overflow:hidden: sem os dois, o item flex adota a largura do
   conteúdo (o e-mail inteiro) e o ellipsis nunca aparece. */
#user-menu .med-user-card-info { flex: 1 1 auto; min-width: 0; overflow: hidden; }

#user-menu .med-user-card-name {
  font-size: .875rem;
  font-weight: 600;
  color: var(--med-text) !important;
  line-height: 1.25;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

#user-menu .med-user-card-mail {
  font-size: .75rem;
  color: var(--med-muted) !important;
  line-height: 1.3;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

/* O avatar do cartão é menor que o do rodapé (que precisa ser alvo de clique):
   aqui ele só identifica a conta. */
#user-menu .med-user-initials {
  width: 30px !important; height: 30px !important;
  min-width: 30px !important; min-height: 30px !important;
  max-width: 30px !important; max-height: 30px !important;
  border-radius: 50% !important;
  font-size: .72rem !important;
}

/* As mesmas seções no menu do shell genérico (templates com barra superior, que
   incluem partial/menu_user.html e não têm as classes do dropdown do Bootstrap). */
.profile-dropdown .dropdown-header {
  padding: .5rem .75rem .25rem;
  margin: 0;
  font-size: .7rem;
  font-weight: 600;
  text-transform: uppercase;
  letter-spacing: .04em;
  color: var(--med-muted);
}

.profile-dropdown .dropdown-divider {
  margin: .3rem .5rem;
  border-color: var(--med-border-soft);
  opacity: 1;
}

/* ---- sair: última ação e a única destrutiva do menu ---- */
#user-menu .med-user-menu-exit,
#user-menu .med-user-menu-exit i { color: #c74a3c !important; }

#user-menu .med-user-menu-exit:hover,
#user-menu .med-user-menu-exit:hover i {
  background: rgba(199, 74, 60, .1) !important;
  color: #c74a3c !important;
}

#user-menu .med-user-menu-exit:hover i { background: none !important; }

[data-bs-theme="dark"] #user-menu .med-user-menu-exit,
[data-bs-theme="dark"] #user-menu .med-user-menu-exit i,
[data-bs-theme="dark"] #user-menu .med-user-menu-exit:hover,
[data-bs-theme="dark"] #user-menu .med-user-menu-exit:hover i { color: #ef8b7d !important; }

[data-bs-theme="dark"] #user-menu .med-user-menu-exit:hover {
  background: rgba(239, 139, 125, .12) !important;
}

/* ---- barra RECOLHIDA: o menu sai para o LADO ----
   Na trilha o avatar tem 34px: subir por cima dele deixaria o menu quase todo
   fora da barra. Ao lado, ele nasce alinhado pelo pé, como no padrão que a
   referência usa. */
.sidebar:not(.expanded) #user-menu.med-user-menu {
  top: auto;
  right: auto;
  bottom: 0;
  left: calc(100% + .5rem);
}

/* A barra tem overflow:hidden (para a largura não vazar durante a transição),
   o que cortaria o menu aberto ao lado. A classe é posta pelo JS do shell só
   enquanto ele está aberto — deixar visível o tempo todo faria a trilha vazar
   na animação de abrir/recolher. */
.sidebar.user-menu-open { overflow: visible !important; }
.sidebar.user-menu-open .sidebar-footer,
.sidebar.user-menu-open .sidebar-footer .dropdown { overflow: visible; }

/* No celular a barra recolhida cobre a tela inteira, então sair pela direita
   jogaria o menu para fora da viewport: ele volta a subir pelo avatar. */
@media (max-width: 767.98px) {
  .sidebar:not(.expanded) #user-menu.med-user-menu {
    right: 0;
    bottom: calc(100% + .4rem);
    left: auto;
  }
}

/* --------------------------------------------------------------- topbar */
header#pageWrapper .page-header {
  background: transparent !important;
  border-bottom: 1px solid var(--med-border-soft);
  padding: .55rem .25rem !important;
  box-shadow: none !important;
}

#conv-title { font-size: 1rem !important; font-weight: 600; letter-spacing: -.015em; color: var(--med-text); }

/* Topo em UMA linha: o subtítulo vazio reservava uma segunda linha de altura
   (ex.: "Nova conversa" sem descrição). Sem conteúdo ele some, e as colunas do
   cabeçalho ficam centradas verticalmente na mesma linha. */
header#pageWrapper .page-header { align-items: center; }
.page-header .med-title-block .text-success:empty { display: none; }

/* O título estava colado na borda esquerda da tela */
.page-header .med-page-title { padding-left: 1rem !important; }

@media (max-width: 767.98px) {
  .page-header .med-page-title { padding-left: .5rem !important; }
}

/* Barra lateral RECOLHIDA no desktop: a barra flutuante (recolher + buscar) fica
   sobre o começo da .main-area, e o título nascia por baixo dela. A reserva é a
   largura da flutuante (2 botões de 32px + espaçamentos) mais uma folga. */
@media (min-width: 992px) {
  .sidebar:not(.expanded) ~ .main-area .page-header .med-page-title {
    padding-left: 6.5rem !important;
  }
}

/* ===== TOPO: título fluido =====
   O bloco do título tinha width:70% fixo e a coluna de ações era `col`. Em
   notebook (1280-1440) com o menu expandido as duas não cabiam na mesma linha e
   o topo quebrava. Agora o título é elástico e trunca; as ações têm largura
   natural e ficam encostadas à direita. */
.page-header .med-page-title { min-width: 0; overflow: hidden; }
.page-header .med-title-wrap { min-width: 0; }
.page-header .med-title-block { min-width: 0; flex: 1 1 auto; }
.page-header .med-title-line {
  display: flex;
  align-items: center;
  gap: .4rem;
  min-width: 0;
}
.page-header .med-conv-title {
  min-width: 0;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
/* O tema base define `.page-wrapper .page-header .header-wrapper { width: 100% }`
   e essa regra (3 classes) vence o `col-auto` do Bootstrap: a coluna dos ícones
   ocupava a linha inteira e caía embaixo do título. Aqui ela volta a ter largura
   de conteúdo e fica ao lado do título, na mesma linha. */
header#pageWrapper .page-header { flex-wrap: nowrap; }
header#pageWrapper .page-header .header-wrapper {
  min-width: 0;
  width: auto !important;
  flex: 0 0 auto;
}
/* O .nav-right carrega larguras de grid (col-xxl-8 / col-xl-6 / col-md-7): dentro
   do cabeçalho de largura natural, o col-xl-6 reservava 50% e a linha estourava
   no notebook — o ícone de relatório descolava para o canto. Aqui o cluster passa
   a ter largura de CONTEÚDO, numa linha só, encostado à direita. */
.page-header .header-wrapper > .row { flex-wrap: nowrap; margin: 0; width: auto; }
.page-header .nav-right {
  width: auto !important;
  max-width: none !important;
  flex: 0 0 auto !important;
}
.page-header .nav-menus { flex-wrap: nowrap; }

/* ===== TÍTULO EDITÁVEL ===== */
.med-conv-title-input {
  min-width: 0;
  width: 100%;
  max-width: 460px;
  padding: .1rem .45rem;
  font-size: 1rem !important;
  font-weight: 600;
  letter-spacing: -.015em;
  color: var(--med-text);
  background: var(--med-surface);
  border: 1px solid var(--med-accent);
  border-radius: 8px;
  outline: none;
}
.med-conv-rename-btn {
  flex: 0 0 auto;
  width: 26px;
  height: 26px;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  border: 0;
  border-radius: 7px;
  background: transparent;
  color: var(--med-muted);
  font-size: .8rem;
  opacity: 0;
  transition: opacity .15s ease, background .15s ease, color .15s ease;
}
/* O lápis só aparece ao passar o mouse pelo topo — no toque ele fica sempre
   visível, já que não existe hover. */
.page-header .med-title-wrap:hover .med-conv-rename-btn { opacity: 1; }
.med-conv-rename-btn:hover { background: var(--med-accent-soft); color: var(--med-accent); }
.med-conv-rename-btn:focus-visible { opacity: 1; outline: 2px solid var(--med-accent); }

@media (hover: none) {
  .med-conv-rename-btn { opacity: 1; }
}

/* ===== TOPO NO CELULAR =====
   O menu-sanduíche (.btn-expand) fica fixo no canto superior esquerdo; sem uma
   reserva o título nasce embaixo dele. E o input de edição não pode ter os
   460px do desktop numa tela estreita. */
@media (max-width: 767.98px) {
  .page-header .med-page-title { padding-left: 3.2rem !important; }
  .med-conv-title-input { max-width: 100%; }
  /* Numa tela de toque o lápis some quando o input abre, para não competir com
     o teclado; a edição continua acessível pelo duplo toque no título e pela
     opção "Renomear" da lista. */
}

@media (max-width: 575.98px) {
  #conv-title, .page-header .med-conv-title, .med-conv-title-input { font-size: .9375rem !important; }
  .page-header .text-success { font-size: .7rem; }
}

/* Botão que abre o consumo da conversa, ao lado do título */
.med-conv-usage-btn {
  width: 30px;
  height: 30px;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  border: 1px solid var(--med-border);
  border-radius: 8px;
  background: transparent;
  color: var(--med-muted);
  font-size: .9rem;
  transition: background .15s ease, color .15s ease, border-color .15s ease;
}
.med-conv-usage-btn:hover {
  background: var(--med-accent-soft);
  border-color: var(--med-accent);
  color: var(--med-accent);
}

/* Subtítulo da página (vinha em verde de sucesso) */
.page-header .text-success { color: var(--med-muted) !important; font-weight: 400; }

/* Ícone de tela cheia: o sprite usa fill/stroke do tema base */
.page-header .fullscreen-body svg { stroke: currentColor !important; fill: none !important; }

.page-header .nav-menus { align-items: center; gap: .35rem; }

/* O tema base pinta cada item do topo com um "chip" claro fixo (#f4f7f9) —
   no tema escuro isso vira uma bolha branca. Aqui os itens ficam transparentes
   e o realce é só no hover. */
.page-header .nav-menus > li {
  padding: 0 !important;
  background: transparent !important;
  border-radius: var(--med-radius) !important;
  box-shadow: none !important;
}

/* Seletor de organização: era um bloco azul com gradiente inline */
#navOrganizations {
  background-image: none !important;
  background: transparent !important;
  border: 1px solid var(--med-border) !important;
  border-radius: var(--med-radius-pill) !important;
  box-shadow: none !important;
  padding: .15rem .7rem .15rem .2rem !important;
}
#navOrganizations:hover { background: var(--med-accent-soft) !important; }
#navOrganizations .text-white-force,
#navOrganizations p,
#navOrganizations span,
#navOrganizations i { color: var(--med-text) !important; }

/* Iniciais coloridas por letra (gradiente inline) em toda a interface:
   organização no topo, avatar do usuário e avatar do cabeçalho da conversa. */
#navOrganizations div[style*="linear-gradient"],
.sidebar-footer div[style*="linear-gradient"],
.avatar-ai-header div[style*="linear-gradient"] {
  background-image: none !important;
  background: var(--med-accent) !important;
  color: var(--med-accent-contrast) !important;
  border-radius: 8px !important;
  box-shadow: none !important;
}

/* Ícones do topo (tela cheia, notificações, tema).
   `div.notification-box` de propósito: a LISTA de notificações usa a mesma
   classe num <ul>, e pegá-la aqui reduzia a lista a um quadrado de 36px. */
.page-header .nav-menus > li > span,
.page-header div.notification-box,
.med-theme-toggle {
  width: 36px; height: 36px;
  display: inline-flex; align-items: center; justify-content: center;
  border-radius: var(--med-radius);
  color: var(--med-text-soft);
  transition: background .15s ease, color .15s ease;
  cursor: pointer;
}
.page-header .nav-menus > li > span:hover,
.page-header div.notification-box:hover,
.med-theme-toggle:hover { background: var(--med-accent-soft); color: var(--med-text); }
.page-header svg { stroke: currentColor; width: 18px; height: 18px; }

/* Botão de tema */
.med-theme-toggle {
  background: transparent;
  border: 1px solid transparent;
  padding: 0;
  font-size: 1rem;
  line-height: 1;
}
.med-theme-toggle .bi { font-size: 1.05rem; }
.med-theme-toggle .med-icon-sun { display: none; }
.med-theme-toggle .med-icon-moon { display: inline-block; }
[data-bs-theme="dark"] .med-theme-toggle .med-icon-sun { display: inline-block; }
[data-bs-theme="dark"] .med-theme-toggle .med-icon-moon { display: none; }

/* ------------------------------------------------------- notificações
   O seletor longo é proposital: o tema base fixa `right: -20px !important` num
   seletor de 5 classes, e a caixa saía pela borda da tela. */
.page-wrapper .page-header .header-wrapper .nav-right .notification-dropdown,
.page-wrapper .page-header .header-wrapper .nav-right > ul > li .notification-dropdown,
.notification-dropdown {
  background: var(--med-surface) !important;
  border: 1px solid var(--med-border) !important;
  border-radius: var(--med-radius-lg) !important;
  box-shadow: var(--med-shadow-lg) !important;
  width: 340px !important;
  max-width: calc(100vw - 2rem) !important;
  right: 8px !important;
  left: unset !important;
  top: 46px !important;
  padding: .6rem !important;
  overflow: hidden;
}

.notification-dropdown .dropdown-title {
  font-size: .8125rem !important;
  font-weight: 600 !important;
  color: var(--med-text) !important;
  padding: .25rem .35rem .5rem !important;
  margin: 0 !important;
  border-bottom: 1px solid var(--med-border-soft);
}

.notification-dropdown ul,
.notification-dropdown .notification-box {
  list-style: none;
  margin: 0 !important;
  padding: 0 !important;
  max-height: 340px;
  overflow-y: auto;
}

/* Os itens vinham com fundo claro fixo (#f9f9f9) e padding do tema base */
.page-wrapper .page-header .header-wrapper .nav-right .notification-dropdown li,
.page-wrapper .page-header .header-wrapper .nav-right > ul > li .notification-dropdown li,
.notification-dropdown li {
  background-color: transparent !important;
  border-radius: 8px !important;
  box-shadow: none !important;
  padding: .5rem .35rem !important;
  color: var(--med-text-soft) !important;
  width: auto !important;
  display: block;
}

.notification-dropdown .notification-item {
  border-bottom: 1px solid var(--med-border-soft) !important;
  padding: .55rem .35rem !important;
  gap: .1rem;
  display: flex !important;
}
.notification-dropdown .notification-item:last-of-type { border-bottom: none !important; }
.notification-dropdown .notification-item h6 {
  font-size: .8125rem !important;
  font-weight: 600;
  color: var(--med-text) !important;
  margin-bottom: .1rem !important;
}
.notification-dropdown .notification-item p,
.notification-dropdown .notification-item small {
  font-size: .75rem !important;
  color: var(--med-muted) !important;
  line-height: 1.45;
}
.notification-dropdown .notification-item .btn { color: var(--med-muted) !important; }
.notification-dropdown .notification-item .btn:hover { color: var(--med-accent) !important; }

/* Rodapé "Ver todas": era um <li> com o botão estourando a caixa */
.notification-dropdown > ul > li:last-child,
.notification-dropdown .notification-box > li:last-child {
  padding: .5rem .1rem 0 !important;
  border-top: 1px solid var(--med-border-soft);
  background: transparent !important;
}
.notification-dropdown .btn-primary,
.notification-dropdown a.btn {
  display: block !important;
  width: 100% !important;
  height: auto !important;
  padding: .45rem .75rem !important;
  font-size: .8125rem !important;
  font-weight: 500 !important;
  line-height: 1.4 !important;
  white-space: nowrap;
  text-align: center;
  background: var(--med-accent) !important;
  color: var(--med-accent-contrast) !important;
  border-radius: var(--med-radius) !important;
}

/* Contador no sino: estava solto no canto da tela */
.page-header div.notification-box { position: relative; }
.page-header div.notification-box .badge {
  position: absolute !important;
  top: 2px !important;
  right: 2px !important;
  min-width: 15px;
  height: 15px;
  padding: 0 3px !important;
  display: flex;
  align-items: center;
  justify-content: center;
  font-size: .625rem !important;
  font-weight: 600;
  line-height: 1;
  border-radius: 999px;
  background: var(--med-accent) !important;
  color: var(--med-accent-contrast) !important;
}
/* Sem notificações não lidas, o selo some (antes ficava um "0") */
.page-header div.notification-box .badge:empty { display: none; }

/* ----------------------------------------------------------------- chat */
.chat-ia-box,
.chat-ia-main { background: var(--med-bg) !important; }

.chat-ia-main-body { background: var(--med-bg) !important; }

#messages { max-width: 760px; margin: 0 auto; padding: 1.25rem 1rem 0; }

/* Separador de dia */
.ia-day-separator span {
  background: var(--med-surface-2) !important;
  color: var(--med-muted) !important;
  border: 1px solid var(--med-border);
  box-shadow: none !important;
  font-weight: 600 !important;
  letter-spacing: .06em;
}
.ia-day-separator::before,
.ia-day-separator::after { background: var(--med-border) !important; }

/* Mensagem do usuário: cartão discreto, alinhado à direita e do tamanho do texto */
.message.user .bubble,
.bubble.user {
  background: var(--med-bubble-user) !important;
  color: var(--med-bubble-user-text) !important;
  border: none !important;
  border-radius: var(--med-radius-lg) !important;
  padding: .7rem 1rem !important;
  box-shadow: none !important;
  font-size: .9375rem;
  max-width: 72% !important;
  width: fit-content !important;
  margin-left: auto !important;
}
.message.user .bubble .message-content,
.bubble.user .message-content { color: var(--med-bubble-user-text) !important; }

/* Editar a mensagem: o balão continua sendo o MESMO balão, só que agora escrevível.
   O editor herdava do custom_med.css um cartão branco de 360×140 com borda — no
   lugar da mensagem aparecia uma caixa que não se parecia com nada do resto da
   tela. Aqui ele fica invisível: fundo, cor, fonte e espaçamento são os do balão,
   e a altura acompanha o texto (autoSizeEditor). A largura mínima é fixada em JS
   com a largura que o texto tinha, para o balão não encolher ao entrar em edição. */
.bubble > div[id^="textarea_"] {
  width: auto !important;
  max-width: 100% !important;
}
.textarea-edit {
  background: transparent !important;
  border: none !important;
  border-radius: 0 !important;
  box-shadow: none !important;
  outline: none !important;
  color: inherit !important;
  font: inherit !important;
  line-height: inherit !important;
  padding: 0 !important;
  margin: 0 !important;
  width: 100% !important;
  min-width: 0 !important;
  min-height: 0 !important;
  max-height: 320px !important;
  overflow-y: auto;
  resize: none !important;
  display: block;
}
.textarea-edit:focus { outline: none !important; box-shadow: none !important; }

.textarea-actions {
  display: flex;
  justify-content: flex-end;
  gap: 6px;
  margin-top: 10px;
}
.textarea-save,
.textarea-cancel {
  border: 1px solid transparent;
  border-radius: 8px;
  padding: 4px 12px;
  font-size: .8125rem;
  font-weight: 500;
  line-height: 1.5;
  cursor: pointer;
  transition: background .15s ease, border-color .15s ease;
}
.textarea-save {
  background: var(--med-accent);
  color: var(--med-accent-contrast);
}
.textarea-save:hover { background: var(--med-accent-hover); }
.textarea-cancel {
  background: transparent;
  color: var(--med-text);
  border-color: var(--med-border);
}
.textarea-cancel:hover { background: var(--med-surface); }

/* Resposta da IA: sem "balão", texto direto sobre o fundo (como no Claude) */
.message.assistant .bubble,
.bubble.assistant {
  background: transparent !important;
  border: none !important;
  box-shadow: none !important;
  color: var(--med-text) !important;
  padding: .35rem 0 .35rem .75rem !important;
  font-size: .9375rem;
  line-height: 1.72;
  max-width: calc(100% - 40px);
}

/* Respiro entre o avatar e o texto/cartão */
.message { gap: .5rem; }

/* O markdown renderizado traz cores próprias do tema base (cinza escuro fixo),
   que somem no tema escuro. Aqui todo o texto da resposta herda a cor do tema —
   links e código continuam com o tom de destaque. */
.bubble.assistant,
.bubble.assistant p,
.bubble.assistant li,
.bubble.assistant span,
.bubble.assistant div,
.bubble.assistant td,
.bubble.assistant th,
.bubble.assistant strong,
.bubble.assistant b,
.bubble.assistant em,
.bubble.assistant h1,
.bubble.assistant h2,
.bubble.assistant h3,
.bubble.assistant h4,
.bubble.assistant h5,
.bubble.assistant h6,
.message.assistant .message-content,
.message.assistant .message-content > * { color: var(--med-text) !important; }

.bubble.assistant a { color: var(--med-accent) !important; text-decoration: underline; text-underline-offset: 2px; }
.bubble.assistant blockquote {
  border-left: 3px solid var(--med-border);
  padding-left: .9rem;
  color: var(--med-muted) !important;
  margin: 0 0 .9rem;
}

.bubble.assistant p { margin-bottom: .9rem; }
.bubble.assistant ul,
.bubble.assistant ol { margin-bottom: .9rem; padding-left: 1.25rem; }
.bubble.assistant li { margin-bottom: .3rem; }
.bubble.assistant h1,
.bubble.assistant h2,
.bubble.assistant h3 { margin: 1.4rem 0 .6rem; font-size: 1.05rem; }
.bubble.assistant code {
  background: var(--med-surface-2);
  border: 1px solid var(--med-border-soft);
  border-radius: 6px;
  padding: .1rem .35rem;
  font-size: .85em;
  color: var(--med-accent);
}
.bubble.assistant pre {
  background: var(--med-surface-2) !important;
  border: 1px solid var(--med-border);
  border-radius: var(--med-radius);
  padding: .9rem 1rem;
}
.bubble.assistant pre code { background: none; border: none; color: inherit; padding: 0; }
.bubble.assistant table {
  border-collapse: collapse;
  width: 100%;
  margin-bottom: 1rem;
  font-size: .875rem;
}
.bubble.assistant th,
.bubble.assistant td { border: 1px solid var(--med-border); padding: .5rem .65rem; }
.bubble.assistant th { background: var(--med-surface-2); font-weight: 600; }

.bubble.bubble-error {
  background: var(--med-surface) !important;
  border: 1px solid var(--med-border) !important;
  color: var(--med-text) !important;
}

/* Avatares das mensagens */
.avatar.avatar-ai,
.message .avatar {
  background: var(--med-accent) !important;
  color: var(--med-accent-contrast) !important;
  border: none !important;
  width: 28px !important; height: 28px !important;
  border-radius: 8px !important;
  display: flex; align-items: center; justify-content: center;
}
.message .avatar svg,
.message .avatar i { width: 15px; height: 15px; color: var(--med-accent-contrast) !important; }
.message.user .avatar { background: var(--med-surface-2) !important; }
.message.user .avatar svg { color: var(--med-muted) !important; }

/* O raio da resposta abre o balão de consumo da IA */
.message .avatar.avatar-ai { cursor: help; }

/* Balão de consumo da resposta (fornecedor, modelo, tokens e custo) */
.ia-usage-tip {
  position: absolute;
  z-index: 1080;
  min-width: 300px;
  max-width: 360px;
  padding: .7rem .8rem;
  background: var(--med-surface);
  border: 1px solid var(--med-border);
  border-radius: var(--med-radius);
  box-shadow: var(--med-shadow-lg);
  color: var(--med-text);
  font-size: .75rem;
  line-height: 1.45;
  pointer-events: none;
}

.ia-usage-tip .ia-usage-head {
  display: flex;
  align-items: baseline;
  gap: .4rem;
  margin-bottom: .45rem;
  padding-bottom: .4rem;
  border-bottom: 1px solid var(--med-border-soft);
}

.ia-usage-tip .ia-usage-supplier {
  font-weight: 600;
  text-transform: capitalize;
  color: var(--med-accent);
}

.ia-usage-tip .ia-usage-model {
  color: var(--med-muted);
  font-size: .6875rem;
  word-break: break-all;
}

.ia-usage-tip .ia-usage-table { width: 100%; border-collapse: collapse; }
.ia-usage-tip .ia-usage-table th,
.ia-usage-tip .ia-usage-table td { padding: .12rem .2rem; text-align: right; white-space: nowrap; }
.ia-usage-tip .ia-usage-table th { color: var(--med-muted); font-weight: 500; font-size: .6875rem; }
.ia-usage-tip .ia-usage-table th:first-child,
.ia-usage-tip .ia-usage-table td:first-child { text-align: left; color: var(--med-text-soft); }
.ia-usage-tip .ia-usage-table tr td:last-child { font-weight: 600; }

.ia-usage-tip .ia-usage-cache,
.ia-usage-tip .ia-usage-empty { color: var(--med-muted); font-size: .6875rem; }
.ia-usage-tip .ia-usage-cache { margin-top: .4rem; padding-top: .35rem; border-top: 1px solid var(--med-border-soft); }

.msg-time { color: var(--med-muted) !important; font-size: .6875rem !important; }

/* Origem da resposta: o que a IA consultou naquele turno (índice e/ou banco).
   Discreto de propósito — é informação de rodapé, não parte da resposta. Só
   aparece o que foi usado, então a ausência do ícone também diz algo. */
.msg-sources { display: flex; gap: .3rem; align-items: center; line-height: 1; }

.msg-source {
  color: var(--med-muted);
  font-size: .6875rem;
  cursor: help;
  opacity: .65;
  transition: opacity .15s ease, color .15s ease;
}

.msg-source:hover { opacity: 1; color: var(--med-accent); }

/* O banco ganha cor própria: consultar a fonte ao vivo é o evento incomum, e
   é o que alguém procura ao conferir de onde saiu um número. */
.msg-source-db:hover { color: var(--bs-success, #198754); }

/* O "i" abre o detalhe (quais bases responderam). Fica um pouco mais visível que
   os outros dois: os demais são estado, este é ação. */
.msg-source-info { cursor: pointer; opacity: .8; }
.msg-sources[data-sources]:hover .msg-source { opacity: 1; }

/* Alvo maior do que os dois ícones minúsculos: a folga é o que faz o balão abrir
   na primeira passada do mouse. As margens negativas devolvem o espaço, para o
   selo continuar ocupando o mesmo lugar ao lado da hora. */
.msg-sources[data-sources] {
  cursor: pointer;
  display: inline-flex;
  align-items: center;
  gap: .3rem;
  padding: .3rem .35rem;
  margin: -.3rem -.35rem;
}

/* Balão "de onde veio a resposta": mesma caixa do balão de consumo, com a lista
   das bases. Uma base por bloco, e sob cada uma o que veio dela. */
/* `fixed`, e não `absolute` como o balão de consumo: as mensagens rolam DENTRO
   do painel, não na página, então converter a posição do ícone para coordenada
   de documento errava — e o erro crescia conforme o ícone descia na conversa.
   Em coordenada de janela, o que o getBoundingClientRect devolve já é o lugar. */
.ia-source-tip {
  position: fixed;
  min-width: 240px;
  max-width: 320px;
}

.ia-source-tip .ia-source-title {
  font-weight: 600;
  color: var(--med-text-soft);
  margin-bottom: .45rem;
  padding-bottom: .4rem;
  border-bottom: 1px solid var(--med-border-soft);
}

.ia-source-tip .ia-source-base + .ia-source-base {
  margin-top: .5rem;
  padding-top: .5rem;
  border-top: 1px dashed var(--med-border-soft);
}

.ia-source-tip .ia-source-name {
  font-weight: 600;
  color: var(--med-text);
  margin-bottom: .15rem;
}

.ia-source-tip .ia-source-name i { color: var(--med-accent); margin-right: .25rem; }

.ia-source-tip .ia-source-src {
  color: var(--med-text-soft);
  padding-left: 1.05rem;
}

.ia-source-tip .ia-source-src i { margin-right: .3rem; opacity: .7; }

/* Por que a consulta ao banco não aconteceu. Cor de aviso: é o único item do
   balão que fala de algo que FALTOU na resposta. */
.ia-source-tip .ia-source-note {
  margin-top: .5rem;
  padding-top: .45rem;
  border-top: 1px solid var(--med-border-soft);
  color: var(--bs-warning-text-emphasis, #997404);
}

.ia-source-tip .ia-source-note i { margin-right: .3rem; }

/* Lápis de editar a própria mensagem */
.edit-message { color: var(--med-muted) !important; opacity: 0; transition: opacity .15s ease; }
.message-content-box:hover .edit-message { opacity: .75; }
.edit-message:hover { color: var(--med-accent) !important; opacity: 1 !important; }

/* ------------------------------------------------------- caixa de envio */
/* A caixa e o aviso ficam empilhados: o aviso é irmão de .chat-ia-form. */
.chat-ia-main-footer {
  background: transparent !important;
  flex-direction: column;
  align-items: center;
  /* No med o aviso é in-flow (position:static), então NÃO precisa do
     padding-bottom de 26px que a ia-chat.css reserva para o aviso absoluto dos
     outros programas — aquele espaço extra empurrava a caixa para cima e ela
     encostava na última mensagem. */
  padding: 6px 8px 10px !important;
}

/* Como o aviso empilhado abaixo da caixa ocupa a sua própria altura, a área de
   mensagens reserva um pouco mais de espaço no rodapé para a caixa não sobrepor
   a última mensagem. */
.chat-ia-main-body {
  /* --ia-warn-h: altura do aviso de créditos, que entra ACIMA daqui (o JS grava a
     medida no .chat-ia-main). Sem descontá-la, o aviso empurrava a área rolável para
     baixo e os botões de imprimir/editar da última resposta iam parar atrás da caixa
     de texto. */
  max-height: calc(100% - 200px - var(--ia-warn-h, 0px)) !important;
  height: calc(100% - 200px - var(--ia-warn-h, 0px)) !important;
}

/* A caixa é o container (.chat-ia-form); o <form> interno não tem moldura,
   senão aparecem duas bordas concêntricas. */
.chat-ia-form {
  max-width: 780px !important;
  width: 100% !important;
  background: var(--med-surface) !important;
  border: 1px solid var(--med-border) !important;
  border-radius: 20px !important;
  box-shadow: var(--med-shadow) !important;
  padding: .9rem 1rem 2.1rem !important;
  transition: border-color .15s ease, box-shadow .15s ease;
}
.chat-ia-form:focus-within {
  border-color: var(--med-accent) !important;
  box-shadow: 0 0 0 3px var(--med-accent-soft), var(--med-shadow) !important;
}

#chat-form {
  background: transparent !important;
  border: none !important;
  box-shadow: none !important;
  padding: 0 !important;
}

#prompt {
  background: transparent !important;
  border: none !important;
  box-shadow: none !important;
  color: var(--med-text) !important;
  font-size: .9375rem !important;
  padding: .25rem .1rem !important;
  resize: none;
}
#prompt::placeholder { color: var(--med-muted) !important; }
#prompt:focus { outline: none !important; box-shadow: none !important; }

.btn-anexo { color: var(--med-muted) !important; font-size: 1.15rem !important; transition: color .15s ease; }
.btn-anexo:hover { color: var(--med-text) !important; }

/* O botão de enviar é posicionado (absolute) pelo CSS base; aqui só o visual */
.btn-send,
#send-btn {
  background: var(--med-accent) !important;
  border: none !important;
  color: var(--med-accent-contrast) !important;
  width: 36px !important; height: 36px !important;
  min-width: 36px !important; min-height: 36px !important;
  max-width: 36px !important; max-height: 36px !important;
  right: 10px !important;
  bottom: 10px !important;
  border-radius: 10px !important;
  transform: none !important;
  display: inline-flex; align-items: center; justify-content: center;
  transition: background .15s ease, opacity .15s ease;
}
.btn-send:hover:not(:disabled),
#send-btn:hover:not(:disabled) { background: var(--med-accent-hover) !important; transform: none !important; }
.btn-send:disabled,
#send-btn:disabled { background: var(--med-accent) !important; opacity: .3 !important; }

/* Parar a resposta. Herda .btn-send (mesmo tamanho e mesma posição absoluta), então
   ele nasce exatamente onde o enviar estava — a troca não desloca nada no rodapé.
   Neutro de propósito: interromper não é a ação que a barra promove, e pintá-lo com
   o accent faria o rodapé parecer que ganhou um segundo botão de enviar. */
#stop-btn {
  background: var(--med-surface) !important;
  border: 1px solid var(--med-border) !important;
  color: var(--med-text) !important;
}
#stop-btn:hover { background: var(--med-accent-soft) !important; border-color: var(--med-accent) !important; }

/* Microfone e enviar precisam viver na MESMA caixa: o enviar é absoluto (canto
   inferior direito, pelo CSS base) e o microfone ficava no fluxo da linha, então
   a distância entre os dois era o que sobrasse da largura — encostava um no
   outro e mudava conforme o rodapé. Agora os dois são absolutos, 36×36, com 8px
   de folga: 10 (margem do enviar) + 36 (largura dele) + 8. */
.record-btn,
.record-btn-off {
  position: absolute !important;
  right: 54px !important;
  bottom: 10px !important;
  width: 36px !important;
  height: 36px !important;
  min-width: 36px !important;
  min-height: 36px !important;
  max-width: 36px !important;
  max-height: 36px !important;
  margin: 0 !important;
  padding: 0 !important;
  border-radius: 10px !important;
}
.record-btn {
  background: transparent !important;
  border: 1px solid var(--med-border) !important;
  color: var(--med-text-soft) !important;
  display: inline-flex;
  align-items: center;
  justify-content: center;
}
/* Sem chave de transcrição quem se posiciona é o <span> do tooltip (regra acima);
   o botão dentro dele volta ao fluxo para preencher o pai. */
.record-btn-off > .record-btn {
  position: static !important;
  right: auto !important;
  bottom: auto !important;
  width: 100% !important;
  height: 100% !important;
}
.record-btn:hover { background: var(--med-accent-soft) !important; color: var(--med-text) !important; }

/* Aviso de gravação: era um pill absoluto no MESMO canto dos botões, com 3rem de
   padding à direita para "caber" embaixo de um deles — com dois botões o texto
   ficava coberto. Sobe para cima da linha, onde não disputa espaço com ninguém. */
#recordStatus {
  right: 10px !important;
  bottom: 56px !important;
  left: auto !important;
  padding: 5px 12px !important;
  margin: 0 !important;
  font-size: .75rem !important;
  line-height: 1.4 !important;
  white-space: nowrap;
  border: 1px solid var(--med-border) !important;
  border-radius: var(--med-radius-pill) !important;
  background: var(--med-text) !important;
  color: var(--med-bg) !important;
  box-shadow: var(--med-shadow);
}

/* Microfone sem transcrição disponível (BYOK sem chave da OpenAI).
   O ia-chat.js reabilita #recordBtn em vários pontos do fluxo da conversa
   (enableChat, fim de turno, troca de agente...) e ainda força opacity inline —
   por isso o estado desligado vive no PAI (.record-btn-off, renderizado só
   quando não dá para transcrever) e usa !important: assim o botão continua
   apagado e inerte independentemente do que o JS faça com ele. O tooltip com o
   motivo fica no próprio .record-btn-off, que segue recebendo o hover. */
.record-btn-off { display: inline-block; cursor: not-allowed; }
.record-btn-off > .record-btn { pointer-events: none !important; opacity: .4 !important; }

/* A faixa de ferramentas da conversa (.chat-ia-topbar: filtro de dia + consumo)
   é estilizada no <style> inline de med/dashboard/chat.html (fonte única). */

/* Seletor de agente e filtro de datas */
.chat-tools { margin-top: .6rem; gap: .5rem !important; }

.chat-tools .ia-spec-btn,
.ia-date-nav-select {
  background: transparent !important;
  border: 1px solid var(--med-border) !important;
  border-radius: var(--med-radius-pill) !important;
  color: var(--med-text-soft) !important;
  height: 32px !important; min-height: 32px !important;
  font-size: .8125rem !important;
  transition: background .15s ease, border-color .15s ease;
}
.ia-date-nav-select:hover { background: var(--med-accent-soft) !important; border-color: var(--med-accent) !important; }

/* Borda do botão do agente na COR DO TIPO (cai no destaque quando o tipo é
   desconhecido). Estas regras precisam morar AQUI, e não no custom_med.css:
   este arquivo é carregado depois e usa !important, então venceria a outra. */
.chat-tools .ia-spec-btn:hover {
  background: var(--med-mode-soft, var(--med-accent-soft)) !important;
  border-color: var(--med-mode-color, var(--med-accent)) !important;
}
.chat-tools .ia-spec-btn.has-value {
  color: var(--med-text) !important;
  border-color: var(--med-mode-color, var(--med-accent)) !important;
}

/* Iniciais do agente no botão: na cor do TIPO (nunca a cor por letra) */
.ia-spec-badge-sm {
  background: var(--med-mode-color, var(--med-accent)) !important;
  color: #fff !important;
  border-radius: 6px !important;
  font-weight: 600;
}

/* (Sem emblema de tipo no botão do agente: o espaço é curto e a tag comia o
   nome. O tipo é comunicado pela COR das iniciais e da borda.) */

/* Rodapé da caixa: só os créditos ficam dentro dela (canto esquerdo).
   O aviso saiu do form e agora fica abaixo da caixa. */
#iaCreditsInfo {
  color: var(--med-muted) !important;
  font-size: .6875rem !important;
  left: 16px !important;
  bottom: 9px !important;
  gap: 5px !important;
  max-width: 48%;
  white-space: nowrap;
}

/* Aviso abaixo da caixa de escrita, centralizado — sem sobrepor os créditos
   nem os botões de enviar/gravar (que continuam dentro da caixa). */
.notice-ia {
  color: var(--med-muted) !important;
  font-size: .6875rem !important;
  position: static !important;
  width: 100% !important;
  max-width: 780px;
  margin: .5rem auto 0 !important;
  padding: 0 1rem;
  text-align: center !important;
  line-height: 1.35;
  white-space: normal;
}

@media (max-width: 900px) {
  .notice-ia { font-size: .625rem !important; }
}

/* ------------------------------------------- modal de agentes / genéricos */
.modal-content {
  background: var(--med-surface) !important;
  border: 1px solid var(--med-border) !important;
  border-radius: var(--med-radius-lg) !important;
  box-shadow: var(--med-shadow-lg) !important;
  color: var(--med-text);
}
.modal-header,
.modal-footer { border-color: var(--med-border-soft) !important; }
.modal-title { font-size: 1rem; font-weight: 600; }

.ia-spec-card,
#specialtyGrid > * {
  background: var(--med-surface) !important;
  border: 1px solid var(--med-border) !important;
  border-radius: var(--med-radius) !important;
  box-shadow: none !important;
  transition: border-color .15s ease, background .15s ease;
}
.ia-spec-card:hover { border-color: var(--med-accent) !important; background: var(--med-accent-soft) !important; }
.ia-spec-card-desc { color: var(--med-muted) !important; }
.ia-spec-empty { color: var(--med-muted) !important; }

/* ------------------------------------------------ formulários e botões */
/* background-COLOR de propósito: o shorthand `background` apagaria o
   background-image do <select>, que é a setinha do dropdown. */
.form-control,
.form-select {
  background-color: var(--med-surface) !important;
  border: 1px solid var(--med-border) !important;
  border-radius: var(--med-radius) !important;
  color: var(--med-text) !important;
  font-size: .875rem !important;
}

/* Seta do select, na cor do tema (o SVG do Bootstrap é fixo em cinza-escuro e
   some no tema escuro) */
.form-select,
select.form-control {
  background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%237c7a73' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e") !important;
  background-repeat: no-repeat !important;
  background-position: right .75rem center !important;
  background-size: 15px 11px !important;
  padding-right: 2.25rem !important;
  appearance: none;
  -webkit-appearance: none;
}

[data-bs-theme="dark"] .form-select,
[data-bs-theme="dark"] select.form-control {
  background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23a19f96' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e") !important;
}

/* Opções do dropdown seguem o tema (no escuro ficavam brancas) */
.form-select option,
select.form-control option {
  background-color: var(--med-surface);
  color: var(--med-text);
}
.form-control:focus,
.form-select:focus {
  border-color: var(--med-accent) !important;
  box-shadow: 0 0 0 3px var(--med-accent-soft) !important;
}
.form-control::placeholder { color: var(--med-muted) !important; }
.form-label, label { color: var(--med-text-soft); font-size: .8125rem; font-weight: 500; }

.btn { border-radius: var(--med-radius) !important; font-weight: 500; font-size: .875rem; }
.btn-primary,
.btn-success {
  background: var(--med-accent) !important;
  border-color: var(--med-accent) !important;
  color: var(--med-accent-contrast) !important;
}
.btn-primary:hover,
.btn-success:hover { background: var(--med-accent-hover) !important; border-color: var(--med-accent-hover) !important; }
.btn-light,
.btn-outline-dark {
  background: var(--med-surface) !important;
  border-color: var(--med-border) !important;
  color: var(--med-text) !important;
}
.btn-light:hover,
.btn-outline-dark:hover { background: var(--med-surface-2) !important; }

/* ---------------------------------------------------- listagens e cards */
.card {
  background: var(--med-surface) !important;
  border: 1px solid var(--med-border) !important;
  border-radius: var(--med-radius-lg) !important;
  box-shadow: none !important;
}
.card-header { background: transparent !important; border-color: var(--med-border-soft) !important; }

/* ------------------------------------------------- cards dos agentes de IA */
.card .med-agent-desc {
  border: 1px solid var(--med-border-soft);
  background: var(--med-surface-2);
  color: var(--med-text-soft);
  padding: .65rem .75rem;
  border-radius: var(--med-radius);
  font-size: .8125rem;
  line-height: 1.55;
  margin: 1rem 0;
  height: 110px;
  max-height: 110px;
  overflow: auto;
}
[data-bs-theme="dark"] .card .med-agent-desc { background: rgba(255, 255, 255, .03); }
.card .med-agent-desc b,
.card .med-agent-desc strong { color: var(--med-text); }

.med-agent-tag {
  left: 9px;
  bottom: -17px;
  display: flex;
  align-items: center;
  gap: .3rem;
  width: auto;
  max-width: 165px;
  border-radius: var(--med-radius-pill);
  padding: .3rem .7rem;
  font-size: .7rem;
  font-weight: 600;
  white-space: nowrap;
}
.med-agent-tag-own {
  background: var(--med-surface-2);
  border: 1px solid var(--med-border);
  color: var(--med-text-soft);
}
.med-agent-tag-system {
  background: var(--med-accent-soft);
  border: 1px solid transparent;
  color: var(--med-accent);
}
[data-bs-theme="dark"] .med-agent-tag-own { background: rgba(255, 255, 255, .05); }

/* Listagem de agentes em TABELA: a tag de origem sai do card (onde era
   position-absolute) e passa a ser inline dentro da célula. */
.datatable-table .med-agent-tag {
  display: inline-flex;
  left: auto;
  bottom: auto;
}

/* ---- autoria: quem criou o agente ----
   Iniciais à esquerda, nome e e-mail empilhados. O e-mail entra porque em time
   grande há homônimo — o nome sozinho não identifica a pessoa. */
.med-author {
  display: flex;
  align-items: center;
  gap: .5rem;
  min-width: 0;
}

.med-author-info {
  display: flex;
  flex-direction: column;
  min-width: 0;
  line-height: 1.25;
}

.med-author-name {
  font-size: .8125rem;
  font-weight: 600;
  color: var(--med-text);
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  max-width: 15rem;
}

.med-author-mail {
  font-size: .72rem;
  color: var(--med-muted);
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  max-width: 15rem;
}

/* O helper createInitials devolve um bloco com margin própria, pensado para o
   card; na linha da tabela ela desalinha o avatar do texto. */
.med-author > div:first-child { margin: 0 !important; flex: 0 0 auto; }

/* =============================================================================
   Chips do agente: tipo (automático/híbrido/único) e o que ele tem de base
   (anexos de treinamento / banco RAG). Definidos AQUI porque as duas telas que
   os usam carregam este arquivo: a listagem do cadastro (template.html) e o
   seletor de agente do chat (que também carrega o custom_med.css).
   ========================================================================== */
.med-chip {
  display: inline-flex;
  align-items: center;
  gap: 3px;
  flex-shrink: 0;
  padding: 2px 7px;
  border-radius: 999px;
  font-size: .66rem;
  font-weight: 600;
  white-space: nowrap;
  border: 1px solid transparent;
  line-height: 1.5;
}

/* A COR DO TIPO como variável: quem carrega é o data-agent-mode do elemento
   (card do seletor, célula da listagem e botão do agente no chat). Assim
   iniciais, borda, chip e emblema saem todos da MESMA fonte. */
[data-agent-mode="auto"]   { --med-mode-color: #7c3aed; --med-mode-soft: rgba(124, 58, 237, .12); }
[data-agent-mode="hybrid"] { --med-mode-color: #0284c7; --med-mode-soft: rgba(2, 132, 199, .12); }
[data-agent-mode="single"] { --med-mode-color: #475569; --med-mode-soft: rgba(71, 85, 105, .12); }

[data-bs-theme="dark"] [data-agent-mode="auto"]   { --med-mode-color: #a78bfa; --med-mode-soft: rgba(124, 58, 237, .22); }
[data-bs-theme="dark"] [data-agent-mode="hybrid"] { --med-mode-color: #38bdf8; --med-mode-soft: rgba(2, 132, 199, .22); }
[data-bs-theme="dark"] [data-agent-mode="single"] { --med-mode-color: #94a3b8; --med-mode-soft: rgba(148, 163, 184, .18); }

/* Iniciais na cor do tipo — na listagem do cadastro. O helper createInitials
   escreve um gradiente inline; aqui ele é substituído pela cor do tipo. */
.med-avatar { display: inline-flex; flex-shrink: 0; }

.med-avatar > div[style*="linear-gradient"] {
  background-image: none !important;
  background: var(--med-mode-color, var(--med-accent)) !important;
  color: #fff !important;
  border-radius: var(--med-radius) !important;
  font-weight: 600 !important;
}

/* COR PADRÃO POR TIPO DE AGENTE — a mesma no seletor do chat e na listagem.
   A classe vem do PromptModel::decorateAgents(), então os dois fronts não têm
   como divergir. As três se distinguem entre si e dos chips de base
   (Treinamento = verde, RAG = âmbar).
     Automático → violeta (o sistema escolhe: o "mágico")
     Híbrido    → azul    (dois modelos se revezando)
     Único      → ardósia (um modelo só: simples e previsível) */
/* O chip do tipo lê a MESMA variável das iniciais/bordas (vinda do
   data-agent-mode no próprio chip), então trocar a cor no White Label muda
   tudo de uma vez. Sem tipo conhecido, cai no destaque da conta. */
.med-chip-auto,
.med-chip-hybrid,
.med-chip-single,
.med-chip-mode {
  background: var(--med-mode-soft, var(--med-accent-soft));
  color: var(--med-mode-color, var(--med-accent));
}

/* Estrela do agente PADRÃO da organização, na coluna de ações. Ela ocupa sempre
   a mesma posição — cheia no padrão, vazia (clicável) nos demais — para as ações
   das linhas não desalinharem. */
.med-default-star { color: var(--med-muted); }
.med-default-star:hover { color: #f59e0b; }

/* A do agente que JÁ é o padrão é só indicativa: destacada e sem ação. */
.med-default-star.is-default {
  color: #f59e0b;
  cursor: default;
  pointer-events: none;
}
[data-bs-theme="dark"] .med-default-star.is-default { color: #fbbf24; }

.med-chip-kb   { background: rgba(25, 135, 84, .12); color: #198754; }
.med-chip-rag  { background: rgba(255, 153, 0, .16); color: #b26b00; }

[data-bs-theme="dark"] .med-chip-kb  { color: #4ade80; }
[data-bs-theme="dark"] .med-chip-rag { color: #fbbf24; }

/* Linha de IAs/modelos abaixo dos chips, na listagem */
.med-agent-models {
  display: block;
  margin-top: 3px;
  max-width: 260px;
  font-size: .68rem;
  color: var(--med-text-soft);
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}

/* Célula do agente (iniciais + nome). A descrição tem coluna própria. */
.med-agent-cell {
  min-width: 0;
  max-width: 280px;
}

/* Nome também em uma linha: um nome longo quebrando desfaria a altura padrão */
.med-agent-cell .user-name {
  display: block;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}

/* Descrição (coluna própria): UMA linha com reticências, para a listagem ficar
   na altura padrão dos outros módulos mesmo com instrução longa. */
.med-agent-desc-cell {
  display: block;
  max-width: 460px;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
  color: var(--med-text-soft);
  line-height: 1.4;
}

/* A descrição vem com HTML (o nome do agente entra em <b>): dentro da célula ela
   é texto corrido, senão um bloco interno quebraria o corte com reticências. */
.med-agent-desc-cell * {
  display: inline;
  font-weight: inherit;
  margin: 0;
}

/* (As iniciais na tabela são pintadas pela cor do TIPO — ver .med-avatar) */

/* Iniciais do agente: neutras, sem a cor por letra */
.card-body > .d-flex > div[style*="linear-gradient"] {
  background-image: none !important;
  background: var(--med-accent-soft) !important;
  color: var(--med-accent) !important;
  border-radius: var(--med-radius) !important;
  font-weight: 600 !important;
}

.med-empty {
  background: var(--med-surface) !important;
  border: 1px dashed var(--med-border);
  border-radius: var(--med-radius-lg);
  color: var(--med-muted) !important;
}

/* Selos de status */
.badge.bg-success { background: rgba(63, 158, 110, .15) !important; color: #3f9e6e !important; }
.badge.bg-warning { background: rgba(217, 164, 65, .18) !important; color: #b98527 !important; }
[data-bs-theme="dark"] .badge.bg-warning { color: #d9a441 !important; }

.table { color: var(--med-text) !important; }
.table > :not(caption) > * > * { background: transparent !important; border-color: var(--med-border-soft) !important; }
.datatable-table thead th { color: var(--med-muted) !important; font-size: .75rem; text-transform: uppercase; letter-spacing: .04em; }

/* ------------------------------------------------------------- scrollbar */
* { scrollbar-width: thin; scrollbar-color: var(--med-border) transparent; }
::-webkit-scrollbar { width: 10px; height: 10px; }
::-webkit-scrollbar-track { background: transparent; }
::-webkit-scrollbar-thumb { background: var(--med-border); border-radius: 999px; border: 3px solid transparent; background-clip: content-box; }
::-webkit-scrollbar-thumb:hover { background: var(--med-muted); background-clip: content-box; border: 3px solid transparent; }

/* ------------------------------------------------------- tema escuro extra */
[data-bs-theme="dark"] .sidebar-flags .admin-info,
[data-bs-theme="dark"] .sidebar-header .admin-info { color: #1f1e1d !important; }

/* Painéis brancos herdados (cobrança, cartão, faturas, offcanvas, modais e as
   listas vazias dos templates): as telas antigas fixam .bg-white/.bg-light do
   Bootstrap, o que no escuro deixava texto claro sobre fundo branco.
   background-COLOR de propósito, para não apagar o background-image de quem
   tem seta/ícone. */
/* .bg-white é sempre o painel externo (fundo da página, delimitado pelo
   .border); .bg-light é o bloco interno, que precisa se destacar dele. */
[data-bs-theme="dark"] .bg-white { background-color: var(--med-bg) !important; }
[data-bs-theme="dark"] .bg-light { background-color: var(--med-surface) !important; }

/* Campos e botões que carregam .bg-white (dropdowns dos components, botões
   "Cancelar") continuam na cor de superfície, como os demais controles. */
[data-bs-theme="dark"] .form-control.bg-white,
[data-bs-theme="dark"] .form-select.bg-white,
[data-bs-theme="dark"] .btn.bg-white { background-color: var(--med-surface) !important; }

/* Texto fixado em escuro (.text-dark/.text-black) vinha junto desses painéis.
   Fora badges e alertas, que têm fundo claro próprio. */
[data-bs-theme="dark"] .text-dark:not(.badge):not(.alert),
[data-bs-theme="dark"] .text-black:not(.badge):not(.alert) { color: var(--med-text) !important; }

[data-bs-theme="dark"] .ia-day-separator span { background: var(--med-surface) !important; }

/* Blocos de status/carregamento do chat vinham com azul/verde fixos */
[data-bs-theme="dark"] .ia-progress-loader {
  background: var(--med-surface) !important;
  border-left-color: var(--med-accent) !important;
}
[data-bs-theme="dark"] .ia-progress-step { color: var(--med-text) !important; }
[data-bs-theme="dark"] .ia-elapsed-time { color: var(--med-muted) !important; }
[data-bs-theme="dark"] .ia-progress-bar-wrap { background: var(--med-border) !important; }
[data-bs-theme="dark"] .ia-error-block { background: rgba(220, 53, 69, .12) !important; }
[data-bs-theme="dark"] .ia-error-content p { color: var(--med-muted) !important; }

[data-bs-theme="dark"] .swal2-popup {
  background: var(--med-surface) !important;
  color: var(--med-text) !important;
}
[data-bs-theme="dark"] .swal2-title,
[data-bs-theme="dark"] .swal2-html-container { color: var(--med-text) !important; }

/* Loader "pensando": o gradiente do texto era fixo em cinza/preto */
.ia-thinking-phrase {
  background: linear-gradient(90deg, var(--med-muted), var(--med-text), var(--med-muted)) !important;
  background-size: 200% 100% !important;
  -webkit-background-clip: text !important;
  background-clip: text !important;
  -webkit-text-fill-color: transparent !important;
}
.ia-thinking-spark { color: var(--med-accent) !important; }
.ia-thinking-time { color: var(--med-muted) !important; }

/* ------------------------------------------------- iniciais / avatares
   O sistema pinta as iniciais com uma cor por letra (ALPHABET_COLORS). No med
   isso vira ruído visual: as iniciais ficam neutras e só a organização e o
   usuário atual usam o tom de destaque. */
.history-list .conv-item > div[style],
.history-list .conv-item span[style*="background"] {
  background-image: none !important;
  background: var(--med-surface-2) !important;
  color: var(--med-muted) !important;
  border: 1px solid var(--med-border) !important;
  border-radius: 6px !important;
  font-weight: 600 !important;
  box-shadow: none !important;
}

/* As LISTAGENS têm o mesmo avatar por letra (paciente, colaborador, perfil,
   organização, agendamento...). Numa tabela de 20 linhas viram 20 círculos
   saturados disputando a atenção com o dado — que é o nome ao lado. Ficam
   neutros como os do histórico; a linha inteira já é o alvo do clique.
   `.search-items` é a classe da linha de listagem em todo o sistema. */
tr.search-items div[style*="linear-gradient"],
tr.search-items span[style*="linear-gradient"] {
  background-image: none !important;
  background: var(--med-surface-2) !important;
  color: var(--med-muted) !important;
  border: 1px solid var(--med-border) !important;
  font-weight: 600 !important;
  box-shadow: none !important;
}

.avatar-ai-header span[style*="background"] {
  background: var(--med-accent) !important;
  color: var(--med-accent-contrast) !important;
  box-shadow: none !important;
}

/* Barra de créditos: verde/cinza fixos */
#iaCreditsBarWrap { background: var(--med-border) !important; }
#iaCreditsBar { background: var(--med-accent) !important; }
#iaCreditsInfo .bi-coin { color: var(--med-muted) !important; }

/* --------------------------------------------------------------- ajustes */
@media (max-width: 768px) {
  #messages { padding: 1rem .75rem 0; }
  .chat-ia-form { border-radius: 16px !important; }
}

/* [removido do porte] Cadastro de agentes do hub (.med-type-card, .med-chip-*, .med-ia-*, .med-kb-*, .med-knowledge-*).
   Os Experts do med são um CRUD comum (application/prompt), com outro markup. Os CARDS de agente continuam aqui — são o que as telas de Experts e Ferramentas usam.
   Se a funcionalidade vier para o med, o bloco está no hub-theme.css. */

/* Preservado do bloco acima: vale para QUALQUER modal empilhada, e o med
   empilha (o cadastro de paciente abre por cima do seletor de paciente). */
.modal-backdrop + .modal-backdrop { z-index: 1085; }

/* [removido do porte] Modal "Consumo da conversa" (.ia-usage-*), tela "Uso de IA" (.med-usage-*) e popover de ritmo (.ia-status-*).
   São do ia-chat.js PRÓPRIO do hub; o med usa o compartilhado, que não emite nenhuma dessas classes, e não tem a rota /ia-usage.
   Se a funcionalidade vier para o med, o bloco está no hub-theme.css. */

/* [removido do porte] Tela "Meu White Label" e Embedding (.wl-*).
   O med não tem White Label: o setProgramVars() daqui não define WL_* e não há rota /white-label.
   Se a funcionalidade vier para o med, o bloco está no hub-theme.css. */

/* ================= Barra flutuante do topo (barra lateral recolhida) =========
   Inspirada no DeepSeek: com a barra lateral fechada, as ações essenciais
   (abrir, buscar, nova conversa) ficam num "pill" no canto da área principal —
   antes, fechada, não havia como reabrir. */
/* A barra lateral é `position: fixed` com z-index 1050; esta barra é absoluta
   dentro do .app-container, com z-index 10. Em `left: .6rem` ela nascia DEBAIXO
   da barra recolhida (70px) e aparecia cortada pela metade. Por isso ela começa
   depois da largura da barra recolhida. */
.chat-quick-bar {
  position: absolute;
  top: .6rem;
  left: calc(var(--sidebar-collapsed-desktop, 70px) + .6rem);
  z-index: 10;
  display: inline-flex;
  align-items: center;
  gap: .1rem;
  padding: .2rem;
  background: var(--med-surface);
  border: 1px solid var(--med-border);
  border-radius: var(--med-radius-pill);
  box-shadow: var(--med-shadow);
}

/* Barra lateral aberta no desktop: as mesmas ações já estão no cabeçalho dela.
   O seletor de irmão funciona porque as duas ficam dentro de .app-container. */
.sidebar.expanded ~ .chat-quick-bar { display: none; }

.chat-quick-bar .quick-bar-btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 32px;
  height: 32px;
  padding: 0;
  border: 0;
  background: transparent;
  color: var(--med-muted);
  border-radius: var(--med-radius-pill);
  font-size: 1rem;
  transition: background .15s ease, color .15s ease;
}

.chat-quick-bar .quick-bar-btn:hover {
  background: var(--med-accent-soft);
  color: var(--med-text);
}

/* O menu-sanduíche do celular ganha aqui a mesma aparência dos vizinhos: o
   custom_med.css o desenha como btn-outline-secondary solto na tela.

   O !important em cor e fundo não é preguiça: .btn-outline-secondary do
   style.css (compartilhado por todos os programas) fixa o azul #48A3D7 e usa
   !important no hover. Sem estas regras o botão ficava azul mesmo numa conta
   com White Label vermelho — ele era o único da barra que não seguia a marca. */
.chat-quick-bar .btn-expand {
  display: inline-flex !important;
  position: static !important;
  margin: 0 !important;
  border: 0 !important;
  color: var(--med-muted) !important;
  background: transparent !important;
}

.chat-quick-bar .btn-expand:hover,
.chat-quick-bar .btn-expand:active,
.chat-quick-bar .btn-expand:focus {
  color: var(--med-text) !important;
  background: var(--med-accent-soft) !important;
  border-color: transparent !important;
  box-shadow: none !important;
}

/* Foco pelo teclado continua visível — e no tom da marca. */
.chat-quick-bar .quick-bar-btn:focus-visible,
.chat-quick-bar .btn-expand:focus-visible {
  outline: 2px solid var(--med-accent);
  outline-offset: 1px;
}

/* Botão só do celular: no desktop a trilha recolhida já mostra "nova conversa". */
.chat-quick-bar .quick-bar-btn-mobile { display: none; }

/* No celular a barra lateral cobre a tela inteira; a flutuante fica fixa no
   topo e o título da página já reserva espaço para ela (regra mais abaixo). */
@media (max-width: 767.98px) {
  .chat-quick-bar { position: fixed; top: .4rem; left: .4rem; }
  /* Aberta em cima do conteúdo, a barra lateral não deve conviver com o pill. */
  .sidebar.expanded ~ .chat-quick-bar { display: none; }
  /* Aqui a barra some por inteiro, então o "+" precisa existir na flutuante. */
  .chat-quick-bar .quick-bar-btn-mobile { display: inline-flex; }
}

/* =============================================================================
   TEMA ESCURO — legibilidade das telas de cadastro (listagens, menus, faturas)
   Estas telas usam o CSS do template base, pensado para fundo claro: as linhas
   zebradas nasciam CLARAS sobre texto claro e o menu do usuário ficava cinza
   sobre cinza. Este arquivo é o último a carregar, então é aqui que o escuro
   fica legível.
   ========================================================================== */

/* Tabelas: primeiro pelas variáveis do Bootstrap (é como .table-striped e
   :hover se pintam), e a seguir o reforço direto, porque o template base
   também pinta a própria <tr>. */
[data-bs-theme="dark"] .table {
  --bs-table-color: var(--med-text);
  --bs-table-bg: transparent;
  --bs-table-border-color: var(--med-border-soft);
  --bs-table-striped-color: var(--med-text);
  --bs-table-striped-bg: rgba(255, 255, 255, .04);
  --bs-table-hover-color: var(--med-text);
  --bs-table-hover-bg: rgba(255, 255, 255, .07);
  --bs-table-active-color: var(--med-text);
  --bs-table-active-bg: rgba(255, 255, 255, .07);
  color: var(--med-text) !important;
}

[data-bs-theme="dark"] .table > tbody > tr,
[data-bs-theme="dark"] .table-striped > tbody > tr:nth-of-type(odd),
[data-bs-theme="dark"] .table-striped > tbody > tr:nth-of-type(even) {
  background-color: transparent !important;
  color: var(--med-text) !important;
}

[data-bs-theme="dark"] .table-striped > tbody > tr:nth-of-type(odd) {
  background-color: rgba(255, 255, 255, .04) !important;
}

[data-bs-theme="dark"] .table > tbody > tr:hover {
  background-color: rgba(255, 255, 255, .07) !important;
}

/* As células vinham com `background: transparent !important` (regra mais acima),
   então quem precisa de cor legível é o texto dentro delas. */
[data-bs-theme="dark"] .table > tbody > tr > td,
[data-bs-theme="dark"] .table > tbody > tr > th { color: var(--med-text) !important; }

[data-bs-theme="dark"] .table a:not(.btn) { color: var(--med-accent) !important; }

/* Texto secundário: o cinza do tema claro fica ilegível sobre fundo escuro. */
[data-bs-theme="dark"] .table .text-muted,
[data-bs-theme="dark"] .table small,
[data-bs-theme="dark"] .table .user-name + br + small { color: var(--med-muted) !important; }

/* Menu do usuário (rodapé da barra lateral) e demais dropdowns */
[data-bs-theme="dark"] .dropdown-menu {
  background-color: var(--med-surface) !important;
  border-color: var(--med-border) !important;
  box-shadow: var(--med-shadow);
}

[data-bs-theme="dark"] .dropdown-item {
  color: var(--med-text) !important;
  background-color: transparent !important;
}

[data-bs-theme="dark"] .dropdown-item:hover,
[data-bs-theme="dark"] .dropdown-item:focus {
  background-color: var(--med-accent-soft) !important;
  color: var(--med-text) !important;
}

[data-bs-theme="dark"] .dropdown-divider { border-color: var(--med-border-soft) !important; }

/* Cartões/painéis das telas de cadastro (faturas, plano, organizações) */
[data-bs-theme="dark"] .card,
[data-bs-theme="dark"] .widget-content .card {
  background-color: var(--med-surface) !important;
  border-color: var(--med-border-soft) !important;
  color: var(--med-text) !important;
}

/* Abas (Informações do plano / Créditos / Cartão / Faturas) */
[data-bs-theme="dark"] .nav-tabs { border-color: var(--med-border) !important; }
[data-bs-theme="dark"] .nav-tabs .nav-link { color: var(--med-text-soft) !important; }
[data-bs-theme="dark"] .nav-tabs .nav-link.active {
  background-color: var(--med-surface) !important;
  border-color: var(--med-border) var(--med-border) var(--med-surface) !important;
  color: var(--med-text) !important;
}

/* [removido do porte] Barra de gravação do White Label (.wl-save-bar).
   O med não tem tela de White Label.
   Se a funcionalidade vier para o med, o bloco está no hub-theme.css. */

/* [removido do porte] Configurações de API (.ac-*) e todo o RAG (.med-ds-*, .med-rag-*, .med-setup-*, .med-ia-*).
   O med não tem /api-config nem bases de conhecimento — nenhuma dessas classes aparece em view, JS ou PHP daqui.
   Se a funcionalidade vier para o med, o bloco está no hub-theme.css. */

/* =============================================================================
   Barra de filtros das listagens

   Mesmo padrão que o Flow estreou e que o Hub e o Build adotaram: os filtros
   se ACUMULAM como pastilhas — campo, operador e valor, cada uma com o seu
   "×". O "+" abre a lista de campos e, em seguida, o valor. Substituiu o par
   "campo de busca + caixas de status + Redefinir busca + Filtrar", que ocupava
   duas linhas antes de qualquer lista.

   O seletor é `.flow-filter-bar` porque é a classe que o componente escreve
   (`med.filter-bar.js` mantém o nome do Flow para ser encontrado pelas telas
   compartilhadas — ver o cabeçalho daquele arquivo). As CORES são as do Meeddy.
   ========================================================================== */
.flow-filter-bar {
  position: relative;
  min-width: 0;
}

.flow-filter-bar .ff-chips {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: .35rem;
}

/* Pastilha: um botão (abre o editor daquele filtro) colado ao "×". O par usa a
   mesma borda, então parecem uma peça só. */
.flow-filter-bar .ff-chip,
.flow-filter-bar .ff-chip-remove {
  border: 1px solid var(--med-border);
  background: var(--med-surface);
  color: var(--med-text);
  padding: .35rem .6rem;
  font-size: .8125rem;
  line-height: 1.4;
  transition: background .12s ease, border-color .12s ease;
}

.flow-filter-bar .ff-chip {
  display: inline-flex;
  align-items: baseline;
  gap: .35rem;
  border-right: 0;
  border-radius: var(--med-radius) 0 0 var(--med-radius);
  max-width: 420px;
}

.flow-filter-bar .ff-chip-remove {
  border-left: 0;
  border-radius: 0 var(--med-radius) var(--med-radius) 0;
  color: var(--med-muted);
  font-size: 1rem;
  line-height: 1.15;
  padding: .35rem .5rem;
}

.flow-filter-bar .ff-chip:hover,
.flow-filter-bar .ff-chip:hover + .ff-chip-remove {
  background: var(--med-surface-2);
}

.flow-filter-bar .ff-chip-remove:hover {
  background: rgba(192, 57, 43, .12);
  color: #c0392b;
  border-color: rgba(192, 57, 43, .3);
}

/* Campo em peso normal, operador mudo, valor em destaque — é o valor que se lê. */
.flow-filter-bar .ff-chip-label { color: var(--med-text-soft); }
.flow-filter-bar .ff-chip-op { color: var(--med-muted); font-size: .78rem; }
.flow-filter-bar .ff-chip-value {
  font-weight: 600;
  color: var(--med-text);
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

/* Botão de adicionar: tracejado, para ler como "espaço vazio a preencher". */
.flow-filter-bar .ff-add {
  display: inline-flex;
  align-items: center;
  gap: .4rem;
  border: 1px dashed var(--med-border);
  background: transparent;
  color: var(--med-muted);
  border-radius: var(--med-radius);
  padding: .35rem .6rem;
  font-size: .8125rem;
  transition: border-color .12s ease, color .12s ease, background .12s ease;
}

.flow-filter-bar .ff-add:hover {
  border-color: var(--med-accent);
  color: var(--med-accent);
  background: var(--med-accent-soft);
}

.flow-filter-bar .ff-clear {
  display: inline-flex;
  align-items: center;
  border: 0;
  background: transparent;
  color: var(--med-muted);
  font-size: .78rem;
  padding: .35rem .4rem;
  margin-left: .15rem;
}

.flow-filter-bar .ff-clear:hover { color: #c0392b; }

/* ------------------------------------------------------------------ painel */
.flow-filter-bar .ff-panel {
  position: absolute;
  z-index: 30;
  top: calc(100% + .35rem);
  left: 0;
  min-width: 260px;
  max-width: 340px;
  background: var(--med-surface);
  border: 1px solid var(--med-border);
  border-radius: var(--med-radius-lg);
  box-shadow: var(--med-shadow-lg);
  padding: .35rem;
}

.flow-filter-bar .ff-panel-list {
  display: flex;
  flex-direction: column;
  max-height: 300px;
  overflow-y: auto;
}

.flow-filter-bar .ff-panel-item {
  display: flex;
  align-items: center;
  gap: .5rem;
  border: 0;
  background: transparent;
  text-align: left;
  color: var(--med-text);
  font-size: .8125rem;
  padding: .5rem .6rem;
  border-radius: var(--med-radius);
}

.flow-filter-bar .ff-panel-item i { color: var(--med-muted); font-size: .9rem; }
.flow-filter-bar .ff-panel-item:hover { background: var(--med-surface-2); }

.flow-filter-bar .ff-panel-editor { padding: .5rem .6rem .6rem; }

.flow-filter-bar .ff-panel-title {
  font-size: .8125rem;
  font-weight: 600;
  color: var(--med-text);
  margin-bottom: .6rem;
}

.flow-filter-bar .ff-panel-op { font-weight: 400; color: var(--med-muted); }

.flow-filter-bar .ff-options {
  display: flex;
  flex-direction: column;
  gap: .15rem;
  max-height: 240px;
  overflow-y: auto;
}

.flow-filter-bar .ff-option {
  display: flex;
  align-items: center;
  gap: .5rem;
  font-size: .8125rem;
  color: var(--med-text-soft) !important;
  padding: .3rem .35rem;
  border-radius: var(--med-radius);
  cursor: pointer;
  margin: 0;
}

.flow-filter-bar .ff-option:hover { background: var(--med-surface-2); }
.flow-filter-bar .ff-option input { accent-color: var(--med-accent); margin: 0; }

.flow-filter-bar .ff-dates {
  display: flex;
  align-items: center;
  gap: .4rem;
}

.flow-filter-bar .ff-dates-sep { font-size: .78rem; color: var(--med-muted); }

.flow-filter-bar .ff-panel-actions {
  display: flex;
  justify-content: flex-end;
  gap: .4rem;
  margin-top: .75rem;
}

/* A barra de ações da listagem passa a ser uma linha só: filtros à esquerda,
   botão de cadastro à direita. Sem o formulário de busca não há mais o bloco de
   dois andares que empurrava a tabela para baixo. */
.main-area .list-actions { align-items: flex-start; flex-wrap: wrap; }
.main-area .list-actions-filters { display: flex; align-items: center; min-width: 0; }

/* =============================================================================
   Listagens

   O tema base desenha as tabelas com zebra forte, linhas apertadas e cabeçalho
   pesado — destoa da linguagem do resto (superfícies quentes, muito espaço em
   branco, um único tom de destaque). Aqui elas viram listas calmas: sem zebra
   do Bootstrap, separadas por um fio suave, com respiro por linha e realce só
   no hover. Mesmas regras que o Build, com os tokens do Meeddy.
   ========================================================================== */

/* O cartão que embrulha a listagem não tem padding próprio: quem respira é a
   célula. Com os dois, o texto ficava a quase 2rem da borda e a linha do
   cabeçalho não alcançava as pontas do cartão. */
.main-area .widget-content.list > .card.card-body {
  padding: 0 !important;
  overflow: hidden;
}

/* A paginação vive dentro do mesmo cartão e precisa do respiro que a tabela
   resolve por célula. */
.main-area .widget-content.list > .card.card-body > .row {
  margin: 0 !important;
  padding: .6rem 1.1rem;
  border-top: 1px solid var(--med-border-soft);
}

.main-area .table {
  --bs-table-bg: transparent;
  margin-bottom: 0 !important;
  font-size: .8125rem;
  color: var(--med-text) !important;
}

/* ------------------------------------------------------------- cabeçalho */
/* Faixa preenchida em vez de linha de micro-rótulos soltos: é o que separa o
   cabeçalho do corpo sem precisar de um fio forte, e dá à tabela a mesma cara de
   bloco que os cartões do resto da tela têm. Caixa alta saiu junto — em rótulos
   longos ("Convites de colaboração") ela vira um paredão de letras. */
.main-area .table > thead > tr > th,
.main-area .table thead.header-item th,
.main-area .datatable-table thead th {
  background: var(--med-surface-2) !important;
  border: 0 !important;
  border-bottom: 1px solid var(--med-border-soft) !important;
  color: var(--med-text-soft) !important;
  font-size: .75rem !important;
  font-weight: 600 !important;
  text-transform: none;
  letter-spacing: 0;
  padding: .7rem .9rem !important;
  white-space: nowrap;
  vertical-align: middle;
}

/* ----------------------------------------------------------------- linhas */
/* Respiro por linha: o conteúdo da célula (selo, botão, avatar) tem altura
   própria, e com o padding antigo as linhas encostavam umas nas outras. */
.main-area .table > tbody > tr > td {
  background: var(--med-surface) !important;
  border: 0 !important;
  border-bottom: 1px solid var(--med-border-soft) !important;
  padding: .7rem .9rem !important;
  vertical-align: middle;
  line-height: 1.4;
}

/* Fim da lista sem fio solto embaixo — o cartão já fecha o bloco. */
.main-area .table > tbody > tr:last-child > td { border-bottom: 0 !important; }

/* ------------------------------------------------------------------ zebra */
/* A zebra do Bootstrap 5.3 não é `background`: é um `box-shadow: inset` de
   9999px com `--bs-table-bg-type`. Aqui a dele é desligada na origem e a nossa é
   feita com os tons da rampa: linha ímpar na superfície do cartão, par um degrau
   abaixo, no fundo da página. É diferença de CLARIDADE, não de cor. */
.main-area .table {
  --bs-table-bg-type: transparent;
  --bs-table-accent-bg: transparent;
  --bs-table-striped-bg: transparent;
}

.main-area .table > tbody > tr > * { box-shadow: none !important; }

.main-area .table-striped > tbody > tr:nth-of-type(odd) > *,
.main-area .table-striped > tbody > tr:nth-of-type(even) > * {
  color: var(--med-text) !important;
}

.main-area .table > tbody > tr:nth-of-type(even) > td {
  background: var(--med-bg) !important;
}

/* No escuro o degrau vai para CIMA (a superfície secundária é mais clara que o
   cartão): descer levaria a linha par para o preto e a lista ficaria pesada. */
[data-bs-theme="dark"] .main-area .table > tbody > tr:nth-of-type(even) > td {
  background: var(--med-surface-2) !important;
}

.main-area .table > tbody > tr {
  transition: background .12s ease;
}

.main-area .table > tbody > tr:hover > td {
  background: var(--med-surface-2) !important;
}

/* Opaco, e não um branco a 4% de opacidade: translúcido ele compunha com o
   CARTÃO, então na linha par (mais clara que o cartão) o hover escurecia a
   linha. Aqui ele é sempre um passo acima das duas faixas. */
[data-bs-theme="dark"] .main-area .table > tbody > tr:hover > td {
  background: color-mix(in srgb, #ffffff 8%, var(--med-surface)) !important;
}

/* A primeira coluna é o "nome" do registro: é ela que a pessoa procura — fica um
   passo maior que o resto da linha, que é informação de apoio. */
.main-area .table > tbody > tr > td:first-child {
  font-weight: 600;
  font-size: .875rem;
}

.main-area .table .user-name,
.main-area .table h6.user-name {
  font-size: .875rem !important;
  font-weight: 600 !important;
  color: var(--med-text) !important;
  margin: 0;
  line-height: 1.35;
}

.main-area .table small,
.main-area .table .text-muted {
  font-size: .78rem !important;
  color: var(--med-muted) !important;
}

/* ------------------------------------------------------------------ selos */
/* UMA linguagem de selo para a lista inteira: pílula de fundo tingido, fio de
   1px do mesmo matiz e texto na cor cheia. Os matizes são calibrados por tema:
   escuros no claro (texto sobre fundo tingido) e claros no escuro. */
.main-area .table,
.main-area .dropdown-menu {
  --selo-verde: #15803D;
  --selo-ambar: #B45309;
  --selo-vermelho: #CE3226;
  --selo-azul: #2563EB;
  --selo-violeta: #7C3AED;
  --selo-neutro: var(--med-text-soft);
  --selo-marca: #1E63A8;
  /* Selo sem variante conhecida cai no neutro em vez de ficar sem fundo. */
  --selo: var(--selo-neutro);
}

[data-bs-theme="dark"] .main-area .table,
[data-bs-theme="dark"] .main-area .dropdown-menu {
  --selo-verde: #55C482;
  --selo-ambar: #DDA62F;
  --selo-vermelho: #EE8378;
  --selo-azul: #60A5FA;
  --selo-violeta: #A78BFA;
  --selo-marca: var(--med-accent);
}

.main-area .table .badge {
  display: inline-flex;
  align-items: center;
  gap: .25rem;
  border-radius: var(--med-radius-pill) !important;
  font-size: .6875rem !important;
  font-weight: 600 !important;
  letter-spacing: .01em;
  padding: .22rem .55rem !important;
  line-height: 1.3;
  background: color-mix(in srgb, var(--selo) 12%, transparent) !important;
  border: 1px solid color-mix(in srgb, var(--selo) 26%, transparent) !important;
  color: color-mix(in srgb, var(--selo) 85%, #000000) !important;
}

.main-area .table .badge.bg-success   { --selo: var(--selo-verde); }
.main-area .table .badge.bg-warning   { --selo: var(--selo-ambar); }
.main-area .table .badge.bg-danger    { --selo: var(--selo-vermelho); }
.main-area .table .badge.bg-info      { --selo: var(--selo-azul); }
.main-area .table .badge.bg-primary   { --selo: var(--selo-marca); }
.main-area .table .badge.bg-violet    { --selo: var(--selo-violeta); }
.main-area .table .badge.bg-secondary,
.main-area .table .badge.bg-gray      { --selo: var(--selo-neutro); }

/* Os chips do agente (tipo, treinamento, RAG) têm cor própria vinda do
   data-agent-mode e NÃO entram nessa linguagem: eles distinguem categoria, não
   estado. Ficam de fora porque não são .badge. */

/* --------------------------------------------------- selos de validação */
/* São `<span class="btn btn-outline-*">` no Handlebars, não botões de verdade:
   nada acontece ao clicar, é estado. Ganham a MESMA pílula dos selos acima.
   O seletor é `span.btn`, e não `.btn`: dentro da tabela existem <button> de
   verdade com btn-outline-*, que viraria uma pílula de 11px. */
.main-area .table span.btn[class*="btn-outline-"],
.main-area .dropdown-menu span.btn[class*="btn-outline-"] {
  display: inline-flex !important;
  align-items: center;
  justify-content: center;
  gap: .25rem;
  width: auto !important;
  min-width: 0 !important;
  padding: .25rem .6rem !important;
  border-radius: var(--med-radius-pill) !important;
  font-size: .6875rem !important;
  font-weight: 600 !important;
  line-height: 1.3;
  cursor: default;
  background: color-mix(in srgb, var(--selo) 12%, transparent) !important;
  border: 1px solid color-mix(in srgb, var(--selo) 26%, transparent) !important;
  color: color-mix(in srgb, var(--selo) 85%, #000000) !important;
}

.main-area span.btn.btn-outline-success { --selo: var(--selo-verde); }
.main-area span.btn.btn-outline-warning { --selo: var(--selo-ambar); }
.main-area span.btn.btn-outline-danger  { --selo: var(--selo-vermelho); }
.main-area span.btn.btn-outline-info    { --selo: var(--selo-azul); }
.main-area span.btn.btn-outline-primary { --selo: var(--selo-marca); }

/* ------------------------------------------------------------------ ações */
/* Ícones de ação sem moldura: aparecem no hover da linha e ganham um alvo
   redondo só ao passar o mouse. Antes eram botões com borda, um ao lado do
   outro, puxando o olho para a ponta da linha. */
.main-area .table .action-btn.btn-group { gap: .15rem; }

.main-area .table .btn-list {
  display: inline-flex !important;
  align-items: center;
  justify-content: center;
  width: 28px;
  height: 28px;
  padding: 0 !important;
  border: 0 !important;
  border-radius: var(--med-radius) !important;
  background: transparent !important;
  color: var(--med-muted) !important;
  font-size: .8125rem;
  transition: background .15s ease, color .15s ease;
}

/* Alvo neutro no hover: são muitos ícones por linha e, tingidos com a cor de
   destaque, a tabela ficava salpicada. */
.main-area .table .btn-list:hover {
  background: var(--med-surface-2) !important;
  color: var(--med-text) !important;
}

[data-bs-theme="dark"] .main-area .table .btn-list:hover {
  background: rgba(255, 255, 255, .06) !important;
}

.main-area .table .btn-list.btn-delete:hover,
.main-area .table .btn-delete:hover {
  background: rgba(192, 57, 43, .12) !important;
  color: #c0392b !important;
}

/* A estrela do agente padrão é estado, não ação: mantém a cor própria mesmo
   dentro do alvo neutro dos ícones de ação. */
.main-area .table .btn-list .med-default-star.is-default,
.main-area .table .med-default-star.is-default { color: #f59e0b !important; }

/* ------------------------------------------------------------- paginação */
.main-area .pagination { gap: .2rem; }

.main-area .pagination .page-link {
  border: 0 !important;
  border-radius: var(--med-radius) !important;
  color: var(--med-text-soft) !important;
  background: transparent !important;
  font-size: .8125rem;
  padding: .4rem .7rem;
}

.main-area .pagination .page-link:hover {
  background: var(--med-surface-2) !important;
  color: var(--med-text) !important;
}

.main-area .pagination .active > .page-link,
.main-area .pagination .page-item.active .page-link {
  background: var(--med-accent) !important;
  color: var(--med-accent-contrast) !important;
}

#pagination-text { font-size: .8125rem; color: var(--med-muted); }

/* Lista vazia: mensagem centrada e mais leve que o corpo da tabela. */
.main-area .table .text-center.text-secondary p {
  color: var(--med-muted) !important;
  font-size: .9rem;
}

/* ------------------------------------------------- listagem: ajuste fino */
/* A linha é informação densa: qualquer controle dentro dela acompanha a altura
   do texto, em vez de esticar a linha inteira. */
.main-area .table td .btn,
.main-area .table td .dropdown-toggle {
  font-size: .8125rem !important;
  padding: .25rem .55rem !important;
  line-height: 1.35;
}

.main-area .table td .dropdown-toggle {
  background: transparent !important;
  color: var(--med-text-soft) !important;
  border: 1px solid var(--med-border) !important;
  border-radius: var(--med-radius) !important;
}

.main-area .table td .dropdown-toggle:hover {
  background: var(--med-surface-2) !important;
  color: var(--med-text) !important;
}

/* Controles soltos na célula (selects de status, campos de ordenação). */
.main-area .table td .form-control,
.main-area .table td .form-select {
  padding: .25rem .5rem !important;
  font-size: .8125rem !important;
  min-height: 0;
}

/* ==========================================================================
   A grade comum de TODAS as telas de tabela

   Cada módulo desenhava a sua própria tabela: o nome do registro vinha
   embrulhado num `.row > .col-9` herdado do gerador de CRUD — grade do Bootstrap
   dentro de uma célula, que reservava 25% da coluna para nada — e as colunas de
   apoio se viravam com o atributo `nowrap` no markup. Sobrava vão no meio e
   faltava espaço nas pontas: "25/03/26 16:43" quebrava em duas linhas, o
   registro do conselho partia no meio e um e-mail longo mandava na largura da
   tabela inteira.

   A regra é uma só: a tabela tem UMA coluna elástica (`col-main`, a que
   identifica o registro) e todas as outras encolhem até o conteúdo
   (`width: 1%` + `nowrap` — o truque clássico de tabela HTML: o navegador honra
   a proporção e joga a sobra toda na coluna de 100%).

   As classes vão no <th> E no <td> correspondentes, para o alinhamento do
   cabeçalho acompanhar o da célula. Mesma grade do Flow, com os tokens do
   Meeddy.
   ========================================================================== */

/* ------------------------------------------------------------ as colunas */
/* A elástica. `min-width` evita que ela seja esmagada quando a tela é estreita
   e há muitas colunas de apoio — aí a tabela rola na horizontal. */
.main-area .table > thead > tr > th.col-main,
.main-area .table > tbody > tr > td.col-main { width: 100%; min-width: 200px; white-space: normal; }

.main-area .table > thead > tr > th.col-code,
.main-area .table > thead > tr > th.col-meta,
.main-area .table > thead > tr > th.col-num,
.main-area .table > thead > tr > th.col-status,
.main-area .table > thead > tr > th.col-actions,
.main-area .table > tbody > tr > td.col-code,
.main-area .table > tbody > tr > td.col-meta,
.main-area .table > tbody > tr > td.col-num,
.main-area .table > tbody > tr > td.col-status,
.main-area .table > tbody > tr > td.col-actions { width: 1%; white-space: nowrap; }

/* Números (sessões, encaixes, linhas) à direita e em algarismos de largura
   fixa: assim a coluna alinha na unidade e dá para comparar de relance. */
.main-area .table .col-num { text-align: right; font-variant-numeric: tabular-nums; }

.main-area .table .col-actions { text-align: right; }

/* O código do registro é referência, não título: fica em tom de apoio e NUNCA
   quebra — um código partido no hífen deixa de ser um código. Vale também
   quando ele é a PRIMEIRA célula, que por padrão leva a ênfase de nome. */
.main-area .table .col-code,
.main-area .table > tbody > tr > td:first-child.col-code {
  color: var(--med-text-soft) !important;
  font-weight: 500;
  font-size: .8125rem;
  letter-spacing: .01em;
}

/* --------------------------------------------------------- o conteúdo */
/* Identificação do registro: título e, quando existe, uma segunda linha de
   apoio (e-mail, especialidade, telefone). Substitui o `.row > .col-9 > .ms-3`
   que vinha do gerador de CRUD e que só servia para desalinhar. */
.list-title {
  display: block;
  margin: 0;
  font-size: .875rem;
  font-weight: 600;
  line-height: 1.35;
  color: var(--med-text) !important;
}

/* Peso próprio: a primeira célula da linha é negrito por regra, e sem isto a
   segunda linha sairia tão pesada quanto o nome. */
.list-sub {
  display: block;
  margin-top: .1rem;
  font-size: .78rem;
  font-weight: 400;
  line-height: 1.35;
  color: var(--med-muted) !important;
}

/* Registro com avatar (paciente, membro do time, organização): as iniciais e o
   texto lado a lado, sem grade do Bootstrap dentro da célula. */
.list-identity { display: flex; align-items: center; gap: .6rem; }
.list-identity > div:first-child { flex: 0 0 auto; }
.list-identity-body { min-width: 0; }

/* Nome longo quebra dentro de uma medida de leitura em vez de esticar a coluna
   (e-mail sem espaço não tem onde quebrar sozinho). */
.main-area .table .col-main .list-title,
.main-area .table .col-main .list-sub { max-width: 56ch; overflow-wrap: anywhere; }

/* Data + hora numa linha só. O helper `dateTimeFormat` já devolve a hora em
   `.text-muted`; aqui ela só encolhe para o dia ter mais peso. */
.list-date { white-space: nowrap; font-size: .8125rem; color: var(--med-text-soft) !important; }
.list-date .text-muted { font-size: .78rem; }

/* URL/token/e-mail: uma linha com reticências e o valor inteiro no `title`. Sem
   isto o token (40+ caracteres) mandava na largura da tabela. */
.list-url {
  display: inline-block;
  max-width: 380px;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  vertical-align: middle;
  font-size: .8125rem;
  color: var(--med-text-soft) !important;
}

/* Texto corrido numa célula de apoio (regra de disponibilidade, motivo do
   bloqueio). Quebra dentro de uma medida fixa em vez de esticar a tabela. */
.list-schedule {
  display: inline-block;
  max-width: 240px;
  white-space: normal;
  font-size: .8125rem;
  line-height: 1.4;
  color: var(--med-text-soft) !important;
}

/* Etiquetas do registro, embaixo do nome. Antes era um rótulo + <br> + os selos
   — três linhas para dizer o que um selo já diz. */
.list-tags { display: flex; flex-wrap: wrap; gap: .25rem; margin-top: .35rem; }
.list-tags .badge { margin: 0 !important; font-weight: 500; }

/* Recado curto embaixo do selo de status (motivo do cancelamento, erro do
   agendamento). Duas linhas no máximo, resto no `title`. */
.list-note {
  display: -webkit-box;
  -webkit-line-clamp: 2;
  -webkit-box-orient: vertical;
  overflow: hidden;
  max-width: 260px;
  margin-top: .25rem;
  white-space: normal;
  font-size: .75rem;
  line-height: 1.35;
  color: var(--med-muted) !important;
}

.list-note.is-error { color: #c0392b !important; }
[data-bs-theme="dark"] .list-note.is-error { color: #e8827a !important; }

/* --------------------------------------------------------- "Mais ações" */
/* Visível na linha fica só o que EXISTE em qualquer listagem: editar, duplicar
   e remover. O que é específico da tela (agenda, bloqueios, histórico, link de
   agendamento, reenviar convite...) vai para este menu — com tudo à mostra, a
   linha de um profissional chegava a seis ícones, uma fileira que não se lê e
   em que a lixeira muda de lugar conforme o status do registro. */
.main-area .table .action-btn .dropdown { display: inline-flex; }

/* Sem a setinha do Bootstrap: as reticências já são o "tem mais aqui". */
.main-area .table .btn-more::after { display: none !important; }

.list-more-menu {
  --bs-dropdown-min-width: 13rem;
  padding: .35rem;
  border: 1px solid var(--med-border) !important;
  border-radius: var(--med-radius) !important;
  background: var(--med-surface) !important;
  box-shadow: var(--med-shadow-lg) !important;
}

.list-more-menu .dropdown-item {
  display: flex;
  align-items: center;
  gap: .55rem;
  padding: .45rem .6rem;
  border-radius: calc(var(--med-radius) - 4px);
  font-size: .8125rem;
  color: var(--med-text) !important;
  white-space: nowrap;
}

.list-more-menu .dropdown-item:hover,
.list-more-menu .dropdown-item:focus {
  background: var(--med-surface-2) !important;
  color: var(--med-text) !important;
}

/* Ícone com largura fixa: os rótulos alinham em coluna. */
.list-more-menu .dropdown-item i { width: 1rem; text-align: center; color: var(--med-muted); }
.list-more-menu .dropdown-item:hover i { color: inherit; }

/* Ação de risco também dentro do menu (cancelar um agendamento confirmado). */
.list-more-menu .dropdown-item.is-danger { color: #c0392b !important; }
.list-more-menu .dropdown-item.is-danger i { color: inherit; }
.list-more-menu .dropdown-item.is-danger:hover { background: rgba(192, 57, 43, .10) !important; }

/* Sem item nenhum (todas as ações extras dependiam do status), o menu não abre
   uma caixa vazia — o JS esconde o botão; ver medUi.hideEmptyMoreMenus. */
.main-area .table .btn-more.is-empty { display: none !important; }

/* ------------------------------------------------------- estado vazio */
/* Uma caixa só, igual em todas as telas: o que falta e o botão que resolve.
   Antes cada listagem inventava a sua, com `bg-white` fixo — que no tema escuro
   virava um bloco branco no meio da lista. */
.main-area .table .list-empty-cell {
  padding: .5rem !important;
  background: transparent !important;
  border-bottom: 0 !important;
}

.list-empty {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: .85rem;
  padding: 2.75rem 1.5rem;
  border: 1px dashed var(--med-border);
  border-radius: var(--med-radius-lg);
  background: var(--med-surface-2);
  color: var(--med-muted) !important;
  text-align: center;
}

.list-empty-icon {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 46px;
  height: 46px;
  border-radius: 50%;
  background: var(--med-accent-soft);
  color: var(--med-accent) !important;
  font-size: 1.15rem;
}

.list-empty p { margin: 0; max-width: 46ch; color: var(--med-muted) !important; }

/* A linha vazia não recebe o realce de hover: não há registro para apontar. */
.main-area .table > tbody > tr:hover > td.list-empty-cell { background: transparent !important; }

/* ------------------------------------------------- legado (sem as classes) */
/* As telas que ainda não passaram pela grade (faturas, master, usuários da
   conta) marcam as colunas de apoio com o atributo `nowrap` no markup. Enquanto
   existirem, a regra antiga continua valendo para elas. */
.main-area .table th[nowrap],
.main-area .table td[nowrap] { width: 1%; }

/* A primeira coluna absorve a sobra — a menos que ela seja da grade nova, que
   já diz sozinha quem estica. */
.main-area .table > thead > tr > th:first-child:not([class*="col-"]) { width: auto; }

/* Linhas sem "respiro" extra vindo do markup: várias listagens embrulham a
   célula em .row/.d-flex com margens próprias, que somavam à altura. */
.main-area .table td > .row { margin: 0 !important; }
.main-area .table td > .row > [class*="col"] { padding-left: 0 !important; }
.main-area .table td .ms-3 { margin-left: .6rem !important; }
.main-area .table td .user-meta-info small { line-height: 1.3; }

/* Selo secundário na mesma linha do nome: acompanha o texto em vez de flutuar. */
.main-area .table td .badge + .badge { margin-left: .25rem; }

/* Avatar/iniciais dentro da listagem no tamanho da linha compacta. */
.main-area .table td .img-40,
.main-area .table td .avatar-circle {
  width: 28px !important;
  height: 28px !important;
  min-width: 28px !important;
  min-height: 28px !important;
  font-size: .6875rem !important;
}

/* =============================================================================
   Telas clínicas do med — o que não existe no hub e por isso não veio no porte.
   ========================================================================== */

/* ---------------------------------------------- ação "Novo paciente" na barra
   Segunda ação da barra lateral, abaixo de "Novo atendimento": mesma forma,
   peso menor (contorno em vez de preenchimento), para ficar claro qual das duas
   é a principal. */
.new-patient-btn {
  display: flex !important;
  align-items: center;
  justify-content: center !important;
  gap: .5rem;
  background: transparent !important;
  color: var(--med-accent) !important;
  border: 1px solid var(--med-border) !important;
  border-radius: var(--med-radius) !important;
  font-weight: 500 !important;
  font-size: .8125rem !important;
  box-shadow: none !important;
  transition: background .15s ease, border-color .15s ease;
}

.new-patient-btn:hover,
.new-patient-btn:focus-visible {
  background: var(--med-accent-soft) !important;
  border-color: var(--med-accent) !important;
  color: var(--med-accent) !important;
}

/* O "Novo atendimento" reservava 1rem embaixo para separar do menu; com o
   segundo botão no meio, a folga passa para depois dele. */
.sidebar.expanded .new-chat-btn { margin-bottom: .35rem !important; }

.sidebar.expanded .new-patient-btn {
  width: calc(100% - 1rem) !important;
  margin: 0 .5rem 1rem !important;
}

/* Recolhida, só cabe o ícone — mesmo tamanho do "+" logo acima. */
.sidebar:not(.expanded) .new-patient-btn {
  width: 34px !important;
  height: 34px !important;
  min-height: 34px !important;
  margin: 0 auto .6rem !important;
  font-size: 1rem !important;
}

/* ------------------------------------------------------------------ avisos
   O tema base pinta .alert com o azul/ciano cheio do Bootstrap e texto branco:
   na agenda, a faixa "Conecte a sua agenda do Google" ficava branco sobre ciano
   (≈1,9:1) no claro e um bloco berrante no escuro. Aqui eles viram tinta suave
   com texto legível, como o resto do visual. */
.alert {
  border-radius: var(--med-radius) !important;
  border: 1px solid var(--med-border) !important;
  background: var(--med-surface) !important;
  color: var(--med-text) !important;
  box-shadow: none !important;
}

.alert-info {
  background: var(--med-accent-soft) !important;
  border-color: var(--med-accent) !important;
  color: var(--med-text) !important;
}

.alert-success { background: rgba(63, 158, 110, .12) !important; border-color: rgba(63, 158, 110, .45) !important; }
.alert-warning { background: rgba(217, 164, 65, .14) !important; border-color: rgba(217, 164, 65, .45) !important; }
.alert-danger  { background: rgba(199, 74, 60, .12) !important; border-color: rgba(199, 74, 60, .45) !important; }

.alert .alert-link,
.alert a:not(.btn) { color: var(--med-accent) !important; text-decoration: underline; }

/* ------------------------------------------------------- agenda: Dia/Semana/Mês
   A view fixa `.schedule-view-btn.active { background: var(--bs-primary); color: #fff }`
   — sem !important, então quem ganhava era o
   `.btn-light:not([disabled]):not(.disabled).active.active` do style.css: o
   botão ativo (Semana) ficava BRANCO como os inativos, sem nenhuma marca de
   qual período está selecionado.

   ⚠️ Os seletores repetem as classes de propósito: aquela regra do tema base
   tem peso 0-5-0 e !important — só um seletor mais específico a vence. */
.btn.btn-light.schedule-view-btn.active:not([disabled]):not(.disabled),
.btn.btn-light.schedule-view-btn.active:not([disabled]):not(.disabled):hover,
.btn.btn-light.schedule-view-btn.active:not([disabled]):not(.disabled):focus {
  background: var(--med-accent) !important;
  border-color: var(--med-accent) !important;
  color: var(--med-accent-contrast) !important;
}

/* --------------------------------------------------------------- outros selos
   O tema base já cobria .bg-success e .bg-warning; faltavam os que as telas
   clínicas usam para CLASSIFICAR (tipo de saída da ferramenta, contexto da
   conta). Cheios, eles eram blocos saturados de azul/ciano do COLORS antigo,
   brigando com o destaque e ilegíveis em texto branco. */
.badge.bg-secondary,
.badge.bg-primary,
.badge.bg-info {
  background: var(--med-accent-soft) !important;
  color: var(--med-accent) !important;
  font-weight: 600 !important;
}

.badge.bg-danger {
  background: rgba(199, 74, 60, .14) !important;
  color: #c74a3c !important;
  font-weight: 600 !important;
}
[data-bs-theme="dark"] .badge.bg-danger { color: #ef8b7d !important; }

/* No claro o verde do selo (#3f9e6e sobre tinta a 15%) fica em 3,4:1 — passa
   em selo de tabela, mas a faixa de contexto usa 0,62rem em CAIXA ALTA, que é
   texto pequeno. Ali ele ganha peso e um tom mais escuro. */
.sidebar-flags .badge.bg-success { color: #2f7a54 !important; font-weight: 700 !important; }
[data-bs-theme="dark"] .sidebar-flags .badge.bg-success { color: #6fc79b !important; }

/* ------------------------------------------- ações da mensagem (imprimir/editar)
   ⚠️ Vêm do ia-chat.css COMPARTILHADO, com fundo #f4f5f8 cravado e a variante
   escura presa a `body.dark-only` — classe que nada põe no <body>, porque o tema
   é aplicado por [data-bs-theme] no <html>. Resultado: no escuro os dois botões
   eram quadrados quase brancos com ícone quase branco dentro. Invisíveis.

   O conserto mora aqui, e não no ia-chat.css: aquele arquivo é dos quatro
   programas e mexer nele obrigaria a subir a versão de todos. */
.msg-action {
  color: var(--med-muted) !important;
  background: var(--med-surface-2) !important;
  border-color: var(--med-border) !important;
}

.msg-action:hover {
  color: var(--med-accent) !important;
  background: var(--med-accent-soft) !important;
  border-color: var(--med-accent) !important;
}

/* Edição de uma mensagem (o laudo é editado no próprio balão): o "Salvar" é
   .btn-dark, que no escuro fica com texto quase preto sobre superfície quase
   preta. */
.textarea-edit {
  background: var(--med-surface) !important;
  color: var(--med-text) !important;
  border: 1px solid var(--med-border) !important;
  border-radius: var(--med-radius) !important;
}

.btn.btn-dark.textarea-save {
  background: var(--med-accent) !important;
  border-color: var(--med-accent) !important;
  color: var(--med-accent-contrast) !important;
}

.btn.btn-outline-dark.textarea-cancel {
  background: var(--med-surface) !important;
  border-color: var(--med-border) !important;
  color: var(--med-text-soft) !important;
}

/* ----------------------------------------------------- utilitários de cor
   O tema já amarra --bs-primary ao destaque, mas as UTILITÁRIAS do Bootstrap
   (.text-primary, .bg-primary, .border-primary) leem --bs-primary-RGB, que é
   outra variável — por isso continuavam no azul do tema base em ~20 telas
   (ícone de editar das listagens, "17/08/2026 09:00" da agenda, links de
   faturas). Aqui o RGB é redeclarado junto, e as utilitárias acompanham. */
:root,
[data-bs-theme="light"] {
  --bs-primary-rgb: 23, 131, 150;
}

[data-bs-theme="dark"] {
  --bs-primary-rgb: 42, 171, 192;
}

.text-primary { color: var(--med-accent) !important; }
.border-primary { border-color: var(--med-accent) !important; }

/* =============================================================================
   MODAIS

   O tema base desenha a janela com o cabeçalho e o rodapé soltos (sem régua no
   pé), o "x" preto do Bootstrap — que no escuro fica preto sobre superfície
   escura — e o botão primário centralizado no rodapé, ao lado do secundário e
   com o mesmo peso. Aqui a modal ganha o mesmo ritmo do resto: superfície,
   borda de 1px, cantos generosos, cabeçalho e rodapé delimitados, e a ação
   principal à direita.
   ========================================================================== */

/* ------------------------------------------------------------------ moldura */
.modal-content {
  overflow: hidden;
}

/* O véu do tema base é preto a 50%: sobre o creme ele esverdeia e a tela de trás
   continua nítida demais, então a janela não "sobe". Um pouco mais firme e com o
   marrom do texto no lugar do preto puro. */
.modal-backdrop.show { opacity: 1 !important; }
.modal-backdrop { background-color: rgba(31, 30, 29, .55) !important; }
[data-bs-theme="dark"] .modal-backdrop { background-color: rgba(0, 0, 0, .68) !important; }

/* ---------------------------------------------------------------- cabeçalho */
.modal-header {
  align-items: center;
  gap: .75rem;
  padding: 1rem 1.25rem !important;
  border-bottom: 1px solid var(--med-border-soft) !important;
}

.modal-title {
  display: flex;
  align-items: center;
  gap: .5rem;
  min-width: 0;
  font-size: 1rem !important;
  font-weight: 600 !important;
  line-height: 1.3;
  color: var(--med-text) !important;
}

/* O ícone do título é decoração, não hierarquia: fica no tom de destaque e não
   compete com o texto. */
.modal-title > i,
.modal-title > .bi { color: var(--med-accent); font-size: 1.05rem; flex: 0 0 auto; }

/* `#windowTitle` recebe um <h4> montado por components.setTitle(): sem isto ele
   entrava com o tamanho de um título de página dentro da janela. */
.modal-title .window-title,
#windowTitle .window-title {
  margin: 0;
  font-size: 1rem;
  font-weight: 600;
  line-height: 1.3;
  color: var(--med-text);
}

/* ---- o "x" ----
   ⚠️ O .btn-close do Bootstrap é um SVG PRETO embutido em data-URI: no tema
   escuro ele ficava preto sobre a superfície escura, praticamente invisível. O
   `invert` é a única saída sem trocar o SVG. */
.modal-header .btn-close {
  width: 14px;
  height: 14px;
  padding: .5rem;
  margin: 0;
  box-sizing: content-box;
  border-radius: var(--med-radius);
  opacity: .55;
  transition: opacity .15s ease, background .15s ease;
}

.modal-header .btn-close:hover {
  opacity: 1;
  background-color: var(--med-accent-soft);
}

.modal-header .btn-close:focus {
  box-shadow: 0 0 0 3px var(--med-accent-soft);
  opacity: 1;
}

[data-bs-theme="dark"] .modal-header .btn-close { filter: invert(1) grayscale(100%) brightness(1.6); }

/* -------------------------------------------------------------------- corpo */
/* O tema base zera o padding de baixo (`16px 16px 0`): com rodapé o último campo
   encostava na régua, e sem rodapé encostava na borda da janela. */
.modal-body { padding: 1.25rem !important; }
.modal-header + .modal-body { padding-top: 1.25rem !important; }

/* Janela com corpo rolável: a régua do cabeçalho precisa ficar visível durante a
   rolagem, senão o conteúdo parece flutuar por cima do título. */
.modal-dialog-scrollable .modal-body { overscroll-behavior: contain; }

/* -------------------------------------------------------------------- rodapé */
.modal-footer {
  gap: .5rem;
  padding: .85rem 1.25rem !important;
  border-top: 1px solid var(--med-border-soft) !important;
  background: var(--med-surface-2);
}

[data-bs-theme="dark"] .modal-footer { background: rgba(255, 255, 255, .02); }

/* O rodapé do gerador de CRUD vem com os botões em `justify-content: center` e
   na ordem Salvar → Sair. Alinhados à direita e com o secundário ANTES do
   primário, a ação que confirma fica sempre no mesmo lugar — o canto. */
.modal-footer { justify-content: flex-end !important; }
.modal-footer > .btn { margin: 0 !important; }
.modal-footer > .btn.send,
.modal-footer > .btn[type="submit"],
.modal-footer > .btn-primary { order: 2; }
.modal-footer > .btn-light,
.modal-footer > .btn-secondary,
.modal-footer > [data-bs-dismiss="modal"] { order: 1; }

/* Salvar desabilitado é o estado NORMAL de várias telas (o botão só liga quando
   o formulário muda). Sem isto ele parecia meio apagado por engano. */
.modal-footer > .btn:disabled,
.modal-body .btn:disabled { opacity: .45 !important; cursor: not-allowed; }

/* ------------------------------------------------- modais empilhadas / z-index */
/* O seletor de paciente abre o cadastro por cima de si mesmo. */
.modal-backdrop + .modal-backdrop { z-index: 1085; }

/* ----------------------------------------------------------------- tooltips */
/* O tooltip do tema base é um retângulo lilás-claro com texto escuro, que sobra
   por cima de qualquer superfície. */
.tooltip-inner {
  background: var(--med-text) !important;
  color: var(--med-bg) !important;
  border-radius: var(--med-radius) !important;
  padding: .35rem .6rem !important;
  font-size: .78rem !important;
  box-shadow: var(--med-shadow) !important;
}

.tooltip .tooltip-arrow::before {
  border-top-color: var(--med-text) !important;
  border-bottom-color: var(--med-text) !important;
  border-left-color: var(--med-text) !important;
  border-right-color: var(--med-text) !important;
}

.tooltip { opacity: 1 !important; }


/* =============================================================================
   SELETOR DE ESPECIALIDADE E DE FERRAMENTA (modais de cards do chat)

   Montados em JavaScript pelo ia-chat.js (renderSpecialtyCards /
   renderToolCards) e desenhados no custom_med.css, que é anterior ao visual
   novo. Três defeitos apareciam com os dados reais:

   1. **Uma especialidade de nome longo esticava a LINHA inteira.** O grid é de
      três colunas e o nome não tinha limite de linhas: "Gerar Mapa do Rosto:
      Proporções, Rugas e Marcações de Tratamentos Estéticos" quebrava em seis
      linhas e os dois vizinhos viravam cartões enormes com o conteúdo boiando no
      meio.
   2. **As iniciais eram pintadas por letra**, em saturação máxima — vinte e
      poucos círculos vermelhos, amarelos, verde-limão e rosa numa janela só. É
      exatamente a cor por letra que o visual novo tirou do resto do sistema.
   3. **A descrição repete o título.** Ela vem do banco como "Consultor Médico
      especialista em <nome>. fornece informações…", com o nome logo acima. O
      texto não dá para mudar daqui, mas o corte em duas linhas com reticências
      deixa de ser aleatório.
   ========================================================================== */

.ia-spec-modal .modal-content { border: 1px solid var(--med-border) !important; }

.ia-spec-modal .modal-title { color: var(--med-text) !important; font-size: 1rem !important; }

/* ---- campo de busca ---- */
.ia-spec-search > i { color: var(--med-muted); }

.ia-spec-search input {
  height: 44px;
  border-radius: var(--med-radius) !important;
  border: 1px solid var(--med-border) !important;
  background: var(--med-surface) !important;
  color: var(--med-text) !important;
}

.ia-spec-search input:focus {
  border-color: var(--med-accent) !important;
  box-shadow: 0 0 0 3px var(--med-accent-soft) !important;
}

/* ---- grade: todas as linhas com a MESMA altura ----
   `1fr` nas linhas iguala a altura de tudo pela linha mais alta; o clamp do
   nome e da descrição (abaixo) é o que impede essa altura de explodir. */
.ia-spec-grid {
  grid-auto-rows: 1fr;
  gap: .6rem;
}

/* ---- cartão ---- */
.ia-spec-card {
  position: relative;
  align-items: flex-start !important;
  gap: .7rem !important;
  min-height: 78px;
  padding: .8rem .9rem !important;
  /* Espaço reservado para o selo de escolhido, que agora é absoluto: sem ele o
     "✓" cobriria a última letra do nome. */
  padding-right: 2.1rem !important;
  background: var(--med-surface) !important;
  border: 1px solid var(--med-border) !important;
  border-radius: var(--med-radius) !important;
  box-shadow: none !important;
}

/* Sem levantar e sem sombra: o realce do visual novo é a borda no tom de
   destaque e a tinta de fundo. */
.ia-spec-card:hover {
  transform: none !important;
  box-shadow: none !important;
  border-color: var(--med-accent) !important;
  background: var(--med-accent-soft) !important;
}

.ia-spec-card.active {
  border-color: var(--med-accent) !important;
  background: var(--med-accent-soft) !important;
}

.ia-spec-card:focus-visible {
  outline: 2px solid var(--med-accent);
  outline-offset: 1px;
}

/* ---- iniciais ----
   O !important na cor de fundo é obrigatório: o ia-chat.js grava a cor por letra
   num `style` inline no próprio elemento. */
.ia-spec-card .ia-spec-badge {
  width: 34px !important;
  height: 34px !important;
  min-width: 34px !important;
  margin-top: .1rem;
  border-radius: 8px !important;
  background: var(--med-surface-2) !important;
  border: 1px solid var(--med-border);
  color: var(--med-muted) !important;
  font-size: .72rem !important;
  font-weight: 600 !important;
}

/* A escolhida é a única com o tom de destaque — é o que se procura de relance. */
.ia-spec-card.active .ia-spec-badge {
  background: var(--med-accent) !important;
  border-color: var(--med-accent);
  color: var(--med-accent-contrast) !important;
}

/* ---- textos ---- */
.ia-spec-card-info { gap: .15rem; }

.ia-spec-card-name {
  display: -webkit-box;
  -webkit-line-clamp: 2;
  -webkit-box-orient: vertical;
  overflow: hidden;
  font-size: .875rem !important;
  font-weight: 600 !important;
  line-height: 1.3 !important;
  color: var(--med-text) !important;
}

.ia-spec-card-desc {
  -webkit-line-clamp: 2;
  font-size: .75rem !important;
  line-height: 1.4;
  color: var(--med-muted) !important;
}

/* ⚠️ Uma linha só nas ESPECIALIDADES, duas nas FERRAMENTAS.
   Não é capricho: as trinta e poucas especialidades de fábrica têm a MESMA
   descrição ("Fornece informações técnicas, precisas e baseadas exclusivamente
   em evidências…"), então duas linhas idênticas repetidas trinta vezes só
   empurram o nome — que é o que se procura — para longe. Com uma linha cabe
   quase o dobro de especialidades na tela.
   As ferramentas têm descrição própria e diferente em cada uma; ali as duas
   linhas informam de verdade. */
#specialtyModal .ia-spec-card-desc { -webkit-line-clamp: 1; }
#specialtyModal .ia-spec-card { min-height: 62px; }

/* A descrição repete o nome da especialidade em negrito logo abaixo do título,
   que já o mostra. Aqui ela deixa de ser negrito para não competir. */
.ia-spec-card-desc b,
.ia-spec-card-desc strong { font-weight: 500; color: inherit; }

/* ---- selo de escolhido: canto superior direito, fora do fluxo ---- */
.ia-spec-card-check {
  position: absolute;
  top: .55rem;
  right: .55rem;
  font-size: 1rem !important;
  color: var(--med-accent) !important;
}

/* ---- estados ---- */
.ia-spec-loading,
.ia-spec-empty { color: var(--med-muted) !important; }

/* ---- celular: uma coluna, cartão mais baixo ---- */
@media (max-width: 575.98px) {
  .ia-spec-card { min-height: 0; }
  .ia-spec-grid { grid-auto-rows: auto; }
}

/* ---- botão que abre os seletores (rodapé do compositor) ---- */
.ia-spec-btn { border-radius: var(--med-radius) !important; }
.ia-spec-btn:hover { border-color: var(--med-accent) !important; box-shadow: none !important; }
.ia-spec-btn.has-value { border-color: var(--med-accent) !important; }
.ia-spec-btn-icon { color: var(--med-accent) !important; }
.ia-spec-btn-caret,
.ia-spec-btn-clear { color: var(--med-muted) !important; }

/* As iniciais do botão seguem as do cartão — mesma regra, mesmo motivo. */
.ia-spec-badge-sm {
  background: var(--med-accent) !important;
  color: var(--med-accent-contrast) !important;
  border-radius: 7px !important;
}

/* =============================================================================
   CAIXAS DE CONFIRMAÇÃO E AVISO (SweetAlert)

   São as janelas de "tem certeza?", de erro e de sucesso — aparecem em toda
   listagem e em todo formulário, e eram o último pedaço com a cara antiga:
   retângulo cinza sem borda, sem a sombra do tema e com os botões quadrados.

   ⚠️ A COR do botão de confirmar continua vindo de quem chamou: o código passa
   `confirmButtonColor` no Swal.fire() — `#d33` quando a ação DESTRÓI e um tom
   neutro quando não. Isso é semântica, não estilo: achatar tudo no tom da marca
   apagaria o único aviso de que a ação não tem volta. Aqui só a FORMA é
   uniformizada.
   ========================================================================== */

.swal2-container { backdrop-filter: none; }

.swal2-container.swal2-backdrop-show,
.swal2-container.swal2-shown { background: rgba(31, 30, 29, .55) !important; }

[data-bs-theme="dark"] .swal2-container.swal2-backdrop-show,
[data-bs-theme="dark"] .swal2-container.swal2-shown { background: rgba(0, 0, 0, .68) !important; }

.swal2-popup {
  background: var(--med-surface) !important;
  color: var(--med-text) !important;
  border: 1px solid var(--med-border) !important;
  border-radius: var(--med-radius-lg) !important;
  box-shadow: var(--med-shadow-lg) !important;
  padding: 1.75rem 1.5rem 1.25rem !important;
}

.swal2-title {
  color: var(--med-text) !important;
  font-size: 1.15rem !important;
  font-weight: 600 !important;
  padding: 0 !important;
  margin: .25rem 0 .5rem !important;
}

.swal2-html-container {
  color: var(--med-text-soft) !important;
  font-size: .9rem !important;
  margin: 0 !important;
  padding: 0 .5rem !important;
}

/* Os ícones do SweetAlert são desenhados com border-color própria; só o tom
   muda para o da paleta, mantendo o significado de cada um. */
.swal2-icon { border-color: currentColor !important; margin: .5rem auto 1rem !important; }
.swal2-icon.swal2-warning { color: #b98527 !important; }
.swal2-icon.swal2-error { color: #c74a3c !important; }
.swal2-icon.swal2-success { color: #3f9e6e !important; }
.swal2-icon.swal2-question,
.swal2-icon.swal2-info { color: var(--med-accent) !important; }
[data-bs-theme="dark"] .swal2-icon.swal2-warning { color: #d9a441 !important; }
[data-bs-theme="dark"] .swal2-icon.swal2-error { color: #ef8b7d !important; }

.swal2-actions { gap: .5rem; margin: 1.25rem 0 0 !important; }

.swal2-styled {
  border-radius: var(--med-radius) !important;
  padding: .5rem 1.1rem !important;
  font-size: .9rem !important;
  font-weight: 500 !important;
  box-shadow: none !important;
  margin: 0 !important;
}

.swal2-styled:focus,
.swal2-styled:focus-visible { box-shadow: 0 0 0 3px var(--med-accent-soft) !important; }

/* ---- confirmar ----
   O `confirmButtonColor` que o código passa no Swal.fire() (`#d33` quando a
   ação DESTRÓI) nunca chegou a aparecer: o style.css do tema base tem
   `.swal2-container .swal2-actions .swal2-confirm { background-color:
   var(--theme-default) !important }`, que vence o estilo inline. Ou seja,
   "Remover" saía com a MESMA cor de "Salvar", numa janela que diz que a ação
   não pode ser desfeita.

   O padrão vira o tom de destaque (é o que já acontecia, agora de propósito) e
   o VERMELHO volta onde tem significado: janela com ícone de aviso E botão de
   cancelar ao lado — ou seja, uma ESCOLHA, não um recado. Um aviso sem escolha
   (só "OK") continua neutro. */
.swal2-container .swal2-actions .swal2-confirm {
  background-color: var(--med-accent) !important;
  color: var(--med-accent-contrast) !important;
}

.swal2-popup:has(.swal2-icon.swal2-warning):has(.swal2-cancel) .swal2-confirm,
.swal2-popup:has(.swal2-icon.swal2-error):has(.swal2-cancel) .swal2-confirm {
  background-color: #c74a3c !important;
  color: #ffffff !important;
}

/* "Cancelar" é a saída, não uma segunda ação: contorno, e não preenchimento. */
.swal2-styled.swal2-cancel {
  background: var(--med-surface) !important;
  border: 1px solid var(--med-border) !important;
  color: var(--med-text-soft) !important;
}

.swal2-styled.swal2-cancel:hover {
  background: var(--med-surface-2) !important;
  color: var(--med-text) !important;
}

/* Campo de texto das caixas que perguntam algo (Swal.fire com input). */
.swal2-input,
.swal2-textarea,
.swal2-select {
  background: var(--med-surface) !important;
  border: 1px solid var(--med-border) !important;
  border-radius: var(--med-radius) !important;
  color: var(--med-text) !important;
  box-shadow: none !important;
}

.swal2-input:focus,
.swal2-textarea:focus,
.swal2-select:focus {
  border-color: var(--med-accent) !important;
  box-shadow: 0 0 0 3px var(--med-accent-soft) !important;
}

.swal2-validation-message {
  background: rgba(199, 74, 60, .12) !important;
  color: #c74a3c !important;
  border-radius: var(--med-radius) !important;
}
[data-bs-theme="dark"] .swal2-validation-message { color: #ef8b7d !important; }
