/* Mensagens da Comunidade Real (chat interno).
   Parte 1: bolha/painel flutuante (global, carregada pelo base.html).
   Parte 2: pagina e iframe de mensagens (mural/mensagens.html linka este
   arquivo no head; era <style> embutido no template). Avatares .av0-5
   continuam centralizados em mural.css. */
.dm-bolha {
  position: fixed; bottom: 1.5rem; right: 1.5rem; z-index: 1050; width: 56px; height: 56px; border-radius: var(--radius-pill);
  background: var(--cor-primaria); color: #fff; border: none; box-shadow: var(--shadow-lg); cursor: pointer;
  display: flex; align-items: center; justify-content: center; font-size: 1.4rem;
  transition: transform var(--dur-base) var(--ease-out), box-shadow var(--dur-base) var(--ease-out);
  /* Sem isto o navegador entende o toque como rolagem e o arraste nunca começa. */
  touch-action: none;
}
.dm-bolha:hover { transform: scale(1.08); box-shadow: var(--shadow-xl); }
.dm-bolha-badge {
  position: absolute; top: -3px; right: -3px; background: var(--cor-destaque); color: #fff;
  font-size: var(--fs-xs); font-weight: 700; min-width: 20px; height: 20px; padding: 0 5px; border-radius: var(--radius-pill);
  display: flex; align-items: center; justify-content: center; border: 2px solid var(--cor-surface);
}
/* Toast de mensagem nova: sobe ao lado da bolha, some sozinho em 8s. */
.dm-toast {
  position: fixed; bottom: 5.5rem; right: 1.5rem; z-index: 1051; width: 340px; max-width: calc(100vw - 2rem);
  background: var(--cor-surface); border: 1px solid var(--cor-border); border-left: 4px solid var(--cor-primaria);
  border-radius: var(--radius-md, .5rem); box-shadow: var(--shadow-xl);
  display: flex; align-items: stretch; gap: .25rem; padding: .35rem .5rem;
  animation: dmToastEntra var(--dur-base, .18s) var(--ease-out, ease-out);
}
@keyframes dmToastEntra { from { opacity: 0; transform: translateY(.5rem); } to { opacity: 1; transform: none; } }
@media (prefers-reduced-motion: reduce) { .dm-toast { animation: none; } }
.dm-toast-corpo {
  flex: 1; display: flex; align-items: center; gap: .5rem; min-width: 0;
  border: 0; background: none; text-align: left; padding: .3rem; cursor: pointer; color: inherit;
}
.dm-toast-corpo i { color: var(--cor-primaria); font-size: 1.1rem; }
.dm-toast-txt { min-width: 0; display: flex; flex-direction: column; line-height: 1.2; }
.dm-toast-txt strong { font-size: var(--fs-sm, .875rem); }
.dm-toast-txt span { font-size: var(--fs-xs, .75rem); color: var(--cor-texto-suave, #6c757d); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.dm-toast-x { border: 0; background: none; color: var(--cor-texto-suave, #6c757d); padding: 0 .25rem; cursor: pointer; opacity: .7; }
.dm-toast-x:hover { opacity: 1; }

/* Convite de permissão de notificação: barra discreta no rodapé. */
.dm-push-convite {
  position: fixed; bottom: 0; left: 0; right: 0; z-index: 1052;
  background: var(--cor-surface); border-top: 1px solid var(--cor-border); box-shadow: var(--shadow-lg);
  padding: .6rem 1rem; display: flex; align-items: center; justify-content: center; gap: .75rem; flex-wrap: wrap;
  font-size: var(--fs-sm, .875rem);
}
.dm-push-convite-acoes { display: flex; align-items: center; gap: .5rem; }
@media (max-width: 576px) { .dm-push-convite { justify-content: space-between; text-align: left; } }

/* Largura FLUIDA, não fixa: com `width:400px` numa janela estreitada pra faixa
   dos 400-480px o painel ficava do tamanho da viewport e o conteúdo saía do
   lugar. min() resolve em qualquer largura, sem depender de breakpoint. */
/* --dm-w/--dm-h saem do tamanho que a pessoa deixou pela alça (salvo no
   navegador); sem preferência valem os padrões fluidos acima. */
.dm-painel {
  position: fixed; bottom: 5.5rem; right: 1.5rem; z-index: 1049;
  width: var(--dm-w, min(400px, calc(100vw - 2rem)));
  height: var(--dm-h, 560px); max-height: calc(100vh - 8rem); background: var(--cor-surface); border: 1px solid var(--cor-border);
  border-radius: var(--radius-lg); box-shadow: var(--shadow-xl); display: flex; flex-direction: column; overflow: hidden;
  opacity: 0; transform: translateY(16px) scale(.98); pointer-events: none;
  transition: opacity var(--dur-base) var(--ease-out), transform var(--dur-base) var(--ease-out);
}
.dm-painel.show { opacity: 1; transform: translateY(0) scale(1); pointer-events: auto; }
.dm-painel-head { display: flex; align-items: center; justify-content: space-between; padding: var(--sp-2) var(--sp-4); background: var(--cor-primaria); color: #fff; font-weight: 700; flex: 0 0 auto; }
.dm-painel-acoes { display: inline-flex; gap: .15rem; align-items: center; }
.dm-painel-x { background: none; border: none; color: #fff; cursor: pointer; font-size: 1.05rem; line-height: 1; padding: .25rem .4rem; border-radius: var(--radius-sm); }
.dm-painel-x:hover { background: rgba(255, 255, 255, .15); }
.dm-painel iframe { flex: 1 1 auto; width: 100%; border: none; }
/* Alça de redimensionar, no canto que cresce (o painel ancora embaixo/direita).
   Fica sobre o cabeçalho azul, por isso o traço é branco. */
.dm-resize {
  position: absolute; top: 0; left: 0; width: 20px; height: 20px; z-index: 2;
  cursor: nwse-resize; touch-action: none;
}
.dm-resize::before {
  content: ''; position: absolute; top: 6px; left: 6px; width: 8px; height: 8px;
  border-top: 2px solid rgba(255, 255, 255, .55); border-left: 2px solid rgba(255, 255, 255, .55);
  border-radius: 3px 0 0 0;
}
.dm-resize:hover::before { border-color: #fff; }
/* Arrastando: o iframe não pode comer o mousemove, senão o painel "solta" o
   redimensionamento assim que o ponteiro entra na conversa. */
.dm-painel.dm-redim { transition: none; }
.dm-painel.dm-redim iframe { pointer-events: none; }
/* 560, não 480: entre 480 e 560 sobrava um painel quase do tamanho da janela,
   colado nas bordas, que é onde a tela quebrava. Tela cheia antes disso. */
@media (max-width: 560px) {
  /* z-index 1051, nao 1049: a bottom-nav (1050) ficava POR CIMA do painel em
     tela cheia e cobria o campo de escrever do iframe - o chat abria "sem onde
     digitar". O padding-bottom afasta o composer da faixa de gestos do iPhone:
     safe-area dentro do iframe vale 0, quem reserva e o painel. */
  .dm-painel {
    inset: 0; width: 100%; max-width: 100%; height: 100%; max-height: 100%;
    border-radius: 0; z-index: 1051;
    padding-bottom: env(safe-area-inset-bottom, 0px);
  }
  /* O toast sobe junto com a bolha: em 5.5rem ele sentava em cima dela. */
  .dm-toast { bottom: calc(140px + env(safe-area-inset-bottom, 0px)); right: 1rem; }
  /* Em tela cheia não há o que redimensionar. */
  .dm-resize { display: none; }
}
/* Ate 991px (toda a faixa em que a bottom-nav existe), nao so ate 560px. */
@media (max-width: 991.98px) {
  /* A bolha sobe pra cima da barra inferior: no lugar de antes ela cobria o
     "Menu", que é o item mais à direita e o caminho pro resto do app. Em
     tablet (561-991px) ela empatava no z-index e tapava o "Perfil". */
  .dm-bolha { bottom: calc(70px + env(safe-area-inset-bottom, 0px)); right: 1rem; }
  /* O convite de push colado no bottom:0 cobria a barra de navegação inteira. */
  .dm-push-convite { bottom: calc(62px + env(safe-area-inset-bottom, 0px)); }
}
/* Bolha solta: quem trabalha no RealChat tinha o microfone do composer tapado
   pela bolha. Arrastando, cada um escolhe onde ela mora, e a escolha fica salva
   no navegador da pessoa. Duas classes (0,2,0) de propósito: precisam ganhar do
   `bottom`/`right` que as media queries acima dão pra .dm-bolha. */
.dm-bolha.dm-solta {
  right: auto; bottom: auto;
  left: var(--dm-bolha-x, 1.5rem); top: var(--dm-bolha-y, 50vh);
}
/* Enquanto arrasta não há animação: a bolha tem que colar no dedo/ponteiro. */
.dm-bolha.dm-movendo { transition: none; cursor: grabbing; transform: scale(1.08); }
/* O painel e o toast passam a ser posicionados pelo JS (lado da bolha), então
   as âncoras do CSS saem do caminho. */
.dm-painel.dm-ancorado, .dm-toast.dm-ancorado { right: auto; bottom: auto; }
/* Dark: --cor-primaria clareia como texto, mas como FUNDO com texto branco
   perde contraste. Superficies primarias usam o navy vivo fixo. */
[data-theme="dark"] .dm-bolha,
[data-theme="dark"] .dm-painel-head { background: var(--blue-500); }
@media (prefers-reduced-motion: reduce) {
  .dm-bolha, .dm-painel { transition: none; }
}

/* Alarme: trava a tela ate a ciencia. z-index acima da bolha (1050), do
   painel (1049) e do modal do Bootstrap (1055). */
.dm-alarme {
  position: fixed; inset: 0; z-index: 2000; background: rgba(0, 0, 0, .72);
  display: flex; align-items: center; justify-content: center; padding: var(--sp-4);
}
.dm-alarme[hidden] { display: none; }
.dm-alarme-caixa {
  background: var(--cor-surface); border-radius: var(--radius-lg); box-shadow: var(--shadow-xl);
  padding: var(--sp-6) var(--sp-5); max-width: 420px; width: 100%; text-align: center;
  border-top: 6px solid var(--cor-destaque);
}
.dm-alarme-icone { font-size: 3rem; color: var(--cor-destaque); animation: dm-alarme-pulsa 1s ease-in-out infinite; }
.dm-alarme-titulo { font-size: var(--fs-lg); font-weight: 800; margin: var(--sp-3) 0 var(--sp-2); color: var(--cor-text); }
.dm-alarme-de { color: var(--cor-text); margin-bottom: var(--sp-2); }
.dm-alarme-motivo {
  background: var(--cor-surface-raised); border-radius: var(--radius-sm); padding: var(--sp-3);
  color: var(--cor-text); font-weight: 600; margin-bottom: var(--sp-3); word-break: break-word;
}
.dm-alarme-btn {
  width: 100%; padding: var(--sp-3); border: none; border-radius: var(--radius-pill);
  /* Era var(--fs-base), token que nao existe na escala (--fs-2xs..--fs-3xl) e
     sem fallback: a declaracao era invalida e o font-size nao aplicava. */
  background: var(--cor-destaque); color: #fff; font-weight: 700; font-size: var(--fs-md); cursor: pointer;
}
.dm-alarme-btn:hover { filter: brightness(1.08); }
.dm-alarme-btn:disabled { opacity: .6; cursor: wait; }
@keyframes dm-alarme-pulsa { 50% { transform: scale(1.12); } }
@media (prefers-reduced-motion: reduce) {
  .dm-alarme-icone { animation: none; }
}

/* ==========================================================================
   Pagina / iframe de mensagens (mural/mensagens.html)
   ========================================================================== */
.dm-wrap { max-width: 920px; margin: 0 auto; }
/* min-width:0 é o que permite o text-truncate encolher: item flex tem largura
   mínima automática, então sem isso um nome longo empurra os botões pra fora e
   estica a coluna inteira (foi o que cortou o pop-up do grupo). */
.dm-head { display: flex; align-items: center; gap: .6rem; margin-bottom: 1rem; min-width: 0; }
.dm-head-nome { flex: 1 1 auto; min-width: 0; }
.dm-head > .dm-av, .dm-head > .btn, .dm-head > form, .dm-head > div:not(.dm-head-nome) { flex: 0 0 auto; }
.dm-head h4 { font-family: var(--font-display); font-weight: 800; letter-spacing: -.02em; margin: 0; }

.dm-grid { display: grid; grid-template-columns: 300px minmax(0, 1fr); gap: 1rem; align-items: start; }
.dm-card { border: 1px solid var(--cor-border); border-radius: 1rem; background: var(--cor-surface); overflow: hidden; }

/* Lista de conversas: linha com avatar + nome + snippet truncado + nao lidas */
.dm-lista { max-height: 72vh; overflow-y: auto; }
.dm-lista--curta { max-height: 32vh; }
.dm-lista--alta { max-height: 60vh; }
.dm-conv {
  display: flex; gap: .6rem; align-items: center; padding: .6rem .8rem;
  text-decoration: none; color: var(--cor-text); border-bottom: 1px solid var(--cor-border);
  transition: background var(--dur-fast) var(--ease-out);
}
/* Escolher quem entra no grupo: lista rolável de checkbox, densa de propósito
   (a base tem centenas de pessoas e a busca acima é que faz o trabalho) */
.dm-membros-lista {
  max-height: 30vh; overflow-y: auto;
  border: 1px solid var(--cor-border); border-radius: .6rem;
}
.dm-membro {
  display: flex; gap: .5rem; align-items: center;
  padding: .35rem .6rem; margin: 0; cursor: pointer;
  border-bottom: 1px solid var(--cor-border); font-size: .85rem;
}
.dm-membro:last-child { border-bottom: 0; }
.dm-membro:hover { background: var(--cor-surface-raised); }

.dm-conv:last-child { border-bottom: 0; }
.dm-conv:hover { background: var(--cor-surface-raised); }
.dm-conv:focus-visible { outline: 2px solid var(--cor-border-focus); outline-offset: -2px; }
.dm-conv.on { background: color-mix(in srgb, var(--cor-primaria) 10%, transparent); box-shadow: inset 3px 0 0 var(--cor-primaria); }
.dm-conv .corpo { flex: 1; min-width: 0; }
.dm-conv .n { font-weight: 700; font-size: .86rem; line-height: 1.2; }
.dm-conv .snippet { font-size: .76rem; color: var(--cor-text-muted); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.dm-conv .quando { font-size: .68rem; color: var(--cor-text-subtle); flex: 0 0 auto; align-self: flex-start; }
.dm-badge {
  background: var(--cor-primaria); color: #fff; font-size: .68rem; font-weight: 700;
  min-width: 18px; height: 18px; padding: 0 5px; border-radius: 9px;
  display: flex; align-items: center; justify-content: center;
}
[data-theme="dark"] .dm-badge { background: var(--blue-500); }

.dm-av {
  width: 40px; height: 40px; border-radius: 50%; flex: 0 0 auto; display: flex; align-items: center;
  justify-content: center; font-weight: 800; color: #fff; font-size: .9rem; overflow: hidden;
}
.dm-av img { width: 100%; height: 100%; object-fit: cover; }
/* Tons dos avatares (.av0-.av5) vem centralizados de mural.css. */

/* Thread */
/* min-width:0 pelo mesmo motivo do .dm-head: dentro do pop-up (flex column) a
   thread não pode ser mais larga que a janelinha. */
.dm-thread { display: flex; flex-direction: column; height: 72vh; min-width: 0; }
.dm-thread-head { display: flex; align-items: center; gap: .6rem; padding: .7rem .9rem; border-bottom: 1px solid var(--cor-border); }
.dm-msgs { flex: 1; overflow-y: auto; padding: 1rem .9rem; display: flex; flex-direction: column; gap: .4rem; }
.dm-msg { max-width: 80%; width: fit-content; padding: .45rem .7rem; border-radius: 1.1rem; font-size: .9rem; line-height: 1.35; word-break: break-word; }
.dm-txt { white-space: pre-wrap; }
.dm-msg .quando { font-size: .66rem; opacity: .7; }
.dm-msg .rodape { display: flex; align-items: center; justify-content: flex-end; gap: .15rem; margin-top: .1rem; }

/* Lixeira de moderação: discreta no repouso, sai do caminho da leitura. */
.dm-apagar { border: 0; background: none; padding: 0 .1rem; line-height: 1; color: inherit; opacity: .35; cursor: pointer; transition: opacity .15s ease, color .15s ease; }
.dm-apagar:hover, .dm-apagar:focus-visible { opacity: 1; color: var(--cor-perigo, #dc3545); }
.dm-apagar:disabled { opacity: .2; cursor: default; }
/* A bolha recebida precisa LER como bolha: com --cor-surface-raised (#f6f8fd)
   sobre o card branco (#ffffff) a diferenca era ~3% de luminancia e nao dava pra
   ver onde ela comecava e terminava. Sobe um degrau de superficie (o mesmo que o
   tema escuro ja fazia com --cor-surface-overlay) e ganha um fio de contorno. */
.dm-msg.deles {
  align-self: flex-start; background: var(--cor-surface-overlay);
  border: 1px solid var(--cor-border); border-bottom-left-radius: .3rem;
}
.dm-msg.minha { align-self: flex-end; background: var(--cor-primaria); color: #fff; border-bottom-right-radius: .3rem; }
/* Dark: bolha "minha" com navy vivo fixo (o token clareado zoava o contraste
   do texto branco); "deles" ganha um passo de superficie pra separar do fundo. */
[data-theme="dark"] .dm-msg.minha { background: var(--blue-500); }
[data-theme="dark"] .dm-msg.deles { background: var(--cor-surface-overlay); }
@keyframes dmMsgIn { from { opacity: 0; transform: translateY(7px) scale(.97); } to { opacity: 1; transform: none; } }
.dm-msg.dm-in { animation: dmMsgIn .18s var(--ease-out, ease); }
.dm-msg img, .dm-msg video { max-width: 100%; border-radius: .55rem; display: block; margin-top: .25rem; }
.dm-msg audio { width: 230px; max-width: 100%; margin-top: .25rem; }
.dm-tique { font-size: .8rem; opacity: .85; }
.dm-tique.lido { color: var(--cor-primaria); }
.dm-msg.minha .dm-tique { color: rgba(255, 255, 255, .8); }
.dm-msg.minha .dm-tique.lido { color: #8fd0ff; opacity: 1; }

/* Composer */
.dm-form { display: flex; align-items: center; gap: .35rem; padding: .6rem .7rem; border-top: 1px solid var(--cor-border); }
.dm-input {
  flex: 1 1 auto; min-width: 0; border-radius: 2rem !important;
  background: var(--cor-surface-raised); border: 1px solid var(--cor-border);
  transition: border-color .15s, background .15s, box-shadow .15s;
}
.dm-input:focus { border-color: var(--cor-primaria); box-shadow: 0 0 0 3px rgba(91, 143, 245, .15); }
.dm-acao {
  width: 40px; height: 40px; flex: 0 0 40px; border-radius: 50%; border: 1px solid var(--cor-border);
  background: var(--cor-surface); color: var(--cor-text-muted); display: inline-flex; align-items: center;
  justify-content: center; cursor: pointer; margin: 0; padding: 0; font-size: 1.05rem;
  transition: background .15s, color .15s, border-color .15s, transform .12s var(--ease-out, ease);
}
.dm-acao:hover { color: var(--cor-primaria); border-color: var(--cor-primaria); }
.dm-acao:active { transform: scale(.9); }
.dm-acao:focus-visible { outline: 2px solid var(--cor-border-focus); outline-offset: 2px; }
.dm-acao-pri { background: var(--cor-primaria); border-color: var(--cor-primaria); color: #fff; }
.dm-acao-pri:hover { color: #fff; filter: brightness(1.08); }
[data-theme="dark"] .dm-acao-pri { background: var(--blue-500); border-color: var(--blue-500); }
.dm-rec { display: none; align-items: center; gap: .5rem; flex: 1 1 auto; min-width: 0; color: var(--cor-destaque); font-size: .85rem; font-weight: 600; }
.dm-rec #dmRecT { margin-right: auto; }
.dm-rec.show { display: flex; }
.dm-rec .ponto { width: 10px; height: 10px; border-radius: 50%; background: var(--cor-destaque); animation: dmPulse 1s infinite; }
@keyframes dmPulse { 0%, 100% { opacity: 1; } 50% { opacity: .3; } }

/* Nova conversa (busca + criar grupo) */
.dm-novo h6 {
  font-size: .74rem; font-weight: 800; text-transform: uppercase; letter-spacing: .04em;
  color: var(--cor-text-muted); margin: 0; padding: .6rem .8rem; border-bottom: 1px solid var(--cor-border);
  display: flex; align-items: center; justify-content: space-between;
}
.dm-novo-corpo { display: flex; flex-direction: column; align-items: flex-start; gap: .5rem; padding: .6rem .8rem; }
.dm-novo-corpo > .form-control { align-self: stretch; }
/* Form de criar grupo: painel revelado, com respiro proprio */
.grupo-criar-form-novo {
  display: flex; flex-direction: column; gap: .45rem; align-self: stretch;
  background: var(--cor-surface-raised); border: 1px solid var(--cor-border);
  border-radius: var(--radius-md); padding: .6rem;
}
.grupo-criar-form-novo[hidden] { display: none; }
.grupo-criar-form-novo .form-check { margin: 0; }
.grupo-criar-form-novo .btn { align-self: flex-start; }
@media (prefers-reduced-motion: no-preference) {
  .grupo-criar-form-novo:not([hidden]) { animation: dmReveal .18s var(--ease-out, ease) both; }
  @keyframes dmReveal { from { opacity: 0; transform: translateY(-4px); } to { opacity: 1; transform: none; } }
}

/* Estados vazios */
.dm-vazio { text-align: center; color: var(--cor-text-muted); padding: 3rem 1rem; overflow-wrap: anywhere; }
.dm-vazio--compacto { padding: 1.2rem 1rem; }
.dm-vazio--compacto > i { font-size: 1.6rem; }
.dm-vazio--tela { height: 72vh; display: flex; flex-direction: column; align-items: center; justify-content: center; }
.dm-vazio--tela > i { font-size: 2.2rem; }

/* Grupos por regional */
.dm-grupo-av { background: var(--cor-primaria-light); color: var(--cor-primaria); font-size: 1.05rem; overflow: hidden; }
/* Foto do grupo preenche o círculo do avatar sem distorcer */
.dm-grupo-av img { width: 100%; height: 100%; object-fit: cover; }

/* Editar grupo: form curto embaixo do cabeçalho da conversa */
.dm-grupo-editar {
  display: flex; flex-wrap: wrap; gap: .5rem; align-items: center;
  padding: .6rem .8rem; border-bottom: 1px solid var(--cor-border);
  background: var(--cor-surface-raised);
}
.dm-grupo-editar input[type="text"] { flex: 1 1 12rem; }
.dm-grupo-editar input[type="file"] { flex: 1 1 14rem; }
.dm-msg .autor-nome { display: block; font-size: .7rem; font-weight: 800; color: var(--cor-primaria); margin-bottom: .1rem; }
.dm-msg.minha .autor-nome { color: rgba(255, 255, 255, .85); }
.dm-msg.lembrete { align-self: stretch; max-width: 100%; background: var(--cor-destaque-light); border: 1px solid var(--cor-destaque); color: var(--cor-text); border-radius: .7rem; }
.dm-msg.lembrete .lembrete-tag { display: inline-flex; align-items: center; gap: .3rem; font-size: .68rem; font-weight: 800; text-transform: uppercase; letter-spacing: .04em; color: var(--cor-destaque-dark, var(--cor-destaque)); margin-bottom: .15rem; }
[data-theme="dark"] .dm-msg.lembrete .lembrete-tag { color: var(--cor-destaque-mid, var(--cor-destaque)); }
.dm-lembrete-toggle.on { background: var(--cor-destaque); border-color: var(--cor-destaque); color: #fff; }

@media (max-width: 820px) {
  .dm-grid { grid-template-columns: 1fr; }
  .dm-grid.tem-ativo .dm-coluna-lista { display: none; }
  .dm-thread { height: 70vh; }
}

/* Painel de alarme (monitoramento) */
.alarme-painel {
  padding: var(--sp-2) var(--sp-3); border-top: 1px solid var(--cor-border);
  /* Tokens de status locais (fora de .dept-scope): mesmo mapa da fundacao */
  --st-ok: #12805c; --st-warn: #b7791f;
}
[data-theme="dark"] .alarme-painel { --st-ok: #34d399; --st-warn: #fbbf5a; }
.alarme-form { margin-top: var(--sp-2); }
.alarme-lista { margin-top: var(--sp-2); max-height: 180px; overflow-y: auto; font-size: var(--fs-xs); }
.alarme-item { padding: var(--sp-2) 0; border-bottom: 1px solid var(--cor-border); }
.alarme-item .ok { color: var(--st-ok); font-weight: 700; }
.alarme-item .aguardando { color: var(--st-warn); font-weight: 700; }

/* ── Ver quem está no grupo ───────────────────────────────────────────────── */
/* Folha sobre a conversa, não modal: dentro do iframe do pop-up um modal do
   Bootstrap centraliza no iframe e sobra um cartão espremido. */
.dm-membros {
  position: fixed; inset: 0; z-index: 1200; background: rgba(0, 0, 0, .45);
  display: flex; align-items: flex-end; justify-content: center;
}
.dm-membros[hidden] { display: none; }
.dm-membros-cartao {
  width: 100%; max-width: 420px; max-height: 78vh; display: flex; flex-direction: column;
  background: var(--cor-surface); border-radius: var(--radius-lg) var(--radius-lg) 0 0;
  box-shadow: var(--shadow-xl); overflow: hidden;
  /* A folha ancora no fundo da tela: sem a folga, o home indicator do iPhone
     senta em cima dos últimos nomes da lista. */
  padding-bottom: env(safe-area-inset-bottom, 0px);
}
/* Em tela larga a folha vira cartão centrado; no pop-up estreito sobe de baixo,
   que é o gesto que o dedo e o olho esperam num painel desse tamanho. */
@media (min-width: 700px) {
  .dm-membros { align-items: center; }
  .dm-membros-cartao { border-radius: var(--radius-lg); }
}
.dm-membros-cartao > header {
  display: flex; align-items: center; justify-content: space-between; gap: .5rem;
  padding: var(--sp-3) var(--sp-4); border-bottom: 1px solid var(--cor-border);
}
.dm-membros-cartao .titulo { min-width: 0; display: flex; flex-direction: column; line-height: 1.25; }
.dm-membros-lista { overflow-y: auto; padding: var(--sp-2) 0; }
.dm-membro {
  display: flex; align-items: center; gap: .6rem; padding: .4rem var(--sp-4); min-width: 0;
}
.dm-membro .nome { flex: 1 1 auto; min-width: 0; font-size: .88rem; }
.dm-membro .tag {
  flex: 0 0 auto; font-size: .64rem; font-weight: 800; text-transform: uppercase;
  letter-spacing: .04em; padding: .1rem .4rem; border-radius: var(--radius-pill);
  background: color-mix(in srgb, var(--cor-primaria) 14%, transparent); color: var(--cor-primaria);
}

/* ── Responder citando e reagir ───────────────────────────────────────────── */
/* A bolha vira âncora: ações e reações se posicionam por ela. */
.dm-msg { position: relative; }

/* Citação dentro da bolha: barra lateral + autor, o padrão que todo mundo já
   lê como "isto é resposta a". Clicável pra pular pra original. */
/* `color: inherit` NAO e cosmetico. Isto e um <button>, e o reboot do Bootstrap
   herda margin/font pro botao mas NAO herda `color`: sem esta linha ele cai no
   ButtonText do navegador (escuro). Como fundo e barra lateral saem de
   `currentColor`, o bloco inteiro escurecia junto. Na bolha "deles" (clara)
   passava despercebido; na "minha" (navy com texto branco) virava escuro sobre
   escuro e a citacao sumia. */
.dm-citacao {
  display: block; width: 100%; text-align: left; border: 0; cursor: pointer;
  color: inherit;
  background: color-mix(in srgb, currentColor 10%, transparent);
  border-left: 3px solid color-mix(in srgb, currentColor 55%, transparent);
  border-radius: var(--radius-sm);
  padding: .3rem .55rem; margin-bottom: .35rem; font-size: .76rem; line-height: 1.3;
  transition: background var(--dur-fast, .12s) var(--ease-out);
}
.dm-citacao:hover { background: color-mix(in srgb, currentColor 18%, transparent); }
/* Opacidade por elemento, nao no bloco todo: com `opacity` no container o autor
   embaçava junto com o trecho. Assim o autor continua legivel e so o trecho recua. */
.dm-citacao .autor { display: block; font-weight: 800; opacity: .95; }
.dm-citacao .trecho { display: block; opacity: .75; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }

/* Ações só no hover/foco: a thread fica limpa e o botão aparece onde o olho
   já está. No toque não há hover, então o :focus-within segura. */
.dm-msg-acoes {
  position: absolute; top: -.55rem; z-index: 2; display: flex; gap: .15rem;
  opacity: 0; transition: opacity var(--dur-fast, .12s) var(--ease-out);
}
.dm-msg.minha .dm-msg-acoes { left: -.4rem; }
.dm-msg.deles .dm-msg-acoes, .dm-msg.lembrete .dm-msg-acoes { right: -.4rem; }
.dm-msg:hover .dm-msg-acoes, .dm-msg:focus-within .dm-msg-acoes { opacity: 1; }
.dm-msg-acao {
  border: 1px solid var(--cor-border); background: var(--cor-surface); color: var(--cor-text-muted);
  width: 24px; height: 24px; border-radius: 50%; font-size: .68rem; cursor: pointer;
  display: inline-flex; align-items: center; justify-content: center; box-shadow: var(--shadow-sm);
}
.dm-msg-acao:hover { color: var(--cor-primaria); border-color: var(--cor-primaria); }

/* Bolhas de reação penduradas na borda de baixo: contam sem roubar a linha. */
.dm-reacoes { display: flex; flex-wrap: wrap; gap: .2rem; margin-top: .25rem; }
.dm-chip {
  position: relative;
  display: inline-flex; align-items: center; gap: .2rem; cursor: pointer;
  border: 1px solid var(--cor-border); background: var(--cor-surface);
  color: var(--cor-text-muted); border-radius: var(--radius-pill);
  padding: .05rem .35rem; font-size: .68rem; font-weight: 700; line-height: 1.4;
}
/* Quem reagiu, no hover e no foco de teclado. Tooltip proprio em vez do `title`
   nativo, que so aparece depois de ~1s, tem a cara do sistema operacional e nao
   responde a foco. O conteudo vem de data-quem (ver macro chips_reacao e o
   espelho reacoesHtml em mural/mensagens.html); aria-label leva o mesmo texto pro
   leitor de tela. Cores invertidas em relacao a superficie, entao funciona igual
   nos dois temas e sobre a bolha navy. */
.dm-chip::after {
  content: attr(data-quem);
  position: absolute; bottom: calc(100% + .3rem);
  /* Ancorado pelo lado da bolha, nao centralizado no chip: centralizado, um chip
     encostado na borda jogava metade do tooltip pra fora da conversa. Assim ele
     sempre cresce pra dentro. */
  left: 0; right: auto;
  z-index: 3; width: max-content; max-width: min(240px, 60vw);
  /* Quebra linha em vez de cortar: a lista de nomes E o conteudo util aqui. */
  white-space: normal; overflow-wrap: anywhere;
  background: var(--cor-text); color: var(--cor-surface);
  padding: .25rem .45rem; border-radius: var(--radius-sm); text-align: left;
  font-size: .68rem; font-weight: 600; line-height: 1.35; box-shadow: var(--shadow-lg);
  opacity: 0; pointer-events: none;
  transition: opacity var(--dur-fast, .12s) var(--ease-out);
}
.dm-msg.minha .dm-chip::after { left: auto; right: 0; }
.dm-chip:hover::after, .dm-chip:focus-visible::after { opacity: 1; }
/* Sem lista de nomes nao ha o que mostrar: evita a caixinha preta vazia. */
.dm-chip:not([data-quem])::after, .dm-chip[data-quem=""]::after { content: none; }
.dm-chip.minha { border-color: var(--cor-primaria); color: var(--cor-primaria); background: color-mix(in srgb, var(--cor-primaria) 10%, transparent); }
/* Dentro da bolha "minha" o chip era navy sobre navy: borda, texto e fundo saiam
   todos de --cor-primaria, a mesma cor do fundo da bolha. Aqui ele passa a se
   apoiar no branco do proprio texto da bolha, e a variante ".minha" (reagi eu)
   fica um passo mais forte que a dos outros. Mesmo padrao do .autor-nome acima. */
.dm-msg.minha .dm-chip {
  border-color: color-mix(in srgb, #fff 40%, transparent);
  background: color-mix(in srgb, #fff 14%, transparent); color: #fff;
}
.dm-msg.minha .dm-chip.minha {
  border-color: color-mix(in srgb, #fff 85%, transparent);
  background: color-mix(in srgb, #fff 26%, transparent);
}

.dm-reagir-menu {
  position: fixed; z-index: 1300; display: flex; gap: .1rem; padding: .2rem;
  background: var(--cor-surface); border: 1px solid var(--cor-border);
  border-radius: var(--radius-pill); box-shadow: var(--shadow-xl);
}
.dm-reagir-menu[hidden] { display: none; }
.dm-reagir-menu button {
  border: 0; background: none; cursor: pointer; width: 30px; height: 30px; border-radius: 50%;
  color: var(--cor-text-muted); font-size: .95rem;
}
.dm-reagir-menu button:hover { background: var(--cor-surface-raised); color: var(--cor-primaria); transform: scale(1.12); }

/* Barra "respondendo a", acima do campo de escrever. */
.dm-respondendo {
  display: flex; align-items: center; gap: .5rem; padding: .35rem .6rem;
  border-top: 1px solid var(--cor-border); background: var(--cor-surface-raised);
  font-size: .76rem; line-height: 1.25;
}
.dm-respondendo[hidden] { display: none; }
.dm-respondendo .alvo { flex: 1 1 auto; min-width: 0; border-left: 3px solid var(--cor-primaria); padding-left: .45rem; }
.dm-respondendo .autor { display: block; font-weight: 800; color: var(--cor-primaria); }
.dm-respondendo .trecho { display: block; color: var(--cor-text-muted); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }

/* Pulo pra mensagem citada: pisca pra achar de relance sem mudar layout.
   O pisca vai no box-shadow, NAO no background: animacao vence a declaracao
   normal, entao mexer no fundo fazia a bolha "minha" perder o navy no meio do
   keyframe e virar texto branco sobre lavanda claro. Halo funciona igual nos
   dois tipos de bolha e nao mexe em contraste de texto. */
.dm-msg.piscando { animation: dmPisca .6s ease-in-out 2; }
@keyframes dmPisca { 50% { box-shadow: 0 0 0 3px color-mix(in srgb, var(--cor-primaria) 45%, transparent); } }
@media (prefers-reduced-motion: reduce) {
  .dm-msg.piscando { animation: none; outline: 2px solid var(--cor-primaria); }
  .dm-reagir-menu button:hover { transform: none; }
}
