/* ==========================================================================
   Suite Omnichannel — suite.css
   Folha nova, escrita para o layout aprovado (Suite Omnichannel.dc.html).
   Não foi evolução da folha antiga (aposentada na Etapa 8 Bloco 4): o vocabulário
   de classes é outro, porque a arquitetura de informação mudou (rail por papel,
   workspace de três colunas, diálogos).

   Fonte: Manrope (Google Fonts). Numerais tabulares ligados no body.
   White-label: a cor de destaque é --ac e derivadas. A ESTRUTURA da interface
   não depende dela — só elementos de ação. Emitir no <head> do layout:
     <style>:root{--ac:@cor;--ac-d:@corEscura;--ac-s:@corSuave;--ac-b:@corBorda}</style>
   ========================================================================== */

:root {
  /* destaque (sobrescrito pelo branding do tenant) */
  --ac: #6d28d9;
  --ac-d: #5b21b6;
  --ac-s: #f2ecfd;
  --ac-b: #ddd0fa;

  /* superfícies */
  --canvas: #f4f5f7;
  --surface: #ffffff;
  --surface-alt: #fafbfc;
  --rail: #101828;

  /* traços */
  --line: #e4e7ec;
  --line-soft: #f0f1f4;
  --line-softer: #f6f7f8;
  --line-strong: #d0d5dd;

  /* texto */
  --text: #101828;
  --text-2: #344054;
  --text-3: #475467;
  --text-muted: #667085;
  --text-faint: #98a2b3;
  --text-ghost: #c3c8d0;

  /* estados */
  --ok: #027a48;      --ok-bg: #ecfdf3;   --ok-dot: #12b76a;
  --warn: #b54708;    --warn-bg: #fffaeb; --warn-line: #fedf89; --warn-dot: #f79009;
  --bad: #b42318;     --bad-bg: #fef3f2;  --bad-line: #fecdca;  --bad-dot: #f04438;

  /* medidas */
  --h-header: 52px;
  /* Pedido do usuário 2026-08-31: barra virou só texto (sem ícone) — 64px (pensado pra um
     quadrado de ícone) deixava rótulos de duas palavras ("Credenciais OAuth") espremidos,
     quebrando em 2 linhas com altura desigual entre os itens (feio, "não ficou legal"). Alargado
     pra caber o rótulo mais longo numa linha só, com espaçamento uniforme item a item. */
  --w-rail: 132px;
  --w-panel: 296px;
  --w-cfgnav: 224px;

  --r-sm: 7px;
  --r: 8px;
  --r-md: 9px;
  --r-lg: 12px;
  --r-pill: 20px;

  --sh-sm: 0 1px 2px rgba(16, 24, 40, .05);
  --sh-md: 0 8px 24px rgba(16, 24, 40, .10);
  --sh-lg: 0 24px 60px rgba(16, 24, 40, .28);

  --font: Manrope, -apple-system, "Segoe UI", Roboto, Arial, sans-serif;
  --mono: ui-monospace, Menlo, Consolas, monospace;
}

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

body {
  margin: 0;
  background: var(--canvas);
  color: var(--text);
  font: 400 14px/1.5 var(--font);
  font-variant-numeric: tabular-nums;
  -webkit-font-smoothing: antialiased;
}

h1 { margin: 0 0 4px; font: 700 22px/1.2 var(--font); letter-spacing: -.02em; }
h2 { margin: 0; font: 700 13.5px/1.3 var(--font); }
h3 { margin: 0; font: 700 12.5px/1.3 var(--font); }
p  { margin: 0; }

a { color: var(--ac); text-decoration: none; }
a:hover { color: var(--ac-d); text-decoration: underline; }

.mono { font-family: var(--mono); }
.num { font-variant-numeric: tabular-nums; text-align: right; }
.spacer { flex: 1; min-width: 0; }
.truncate { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }

/* barra de "Entrar como" (TenantsController.Impersonate) — sempre visível enquanto ativo,
   independente de focusMode, pra nunca ficar preso na visão do tenant por engano */
.impersonate-bar {
  flex: none; display: flex; align-items: center; justify-content: center; gap: 12px;
  padding: 6px 14px;
  background: var(--warn-bg); border-bottom: 1px solid var(--warn-line);
  color: var(--warn); font: 600 12.5px/1 var(--font);
}
.impersonate-bar .btn { height: 26px; padding: 0 10px; font-size: 11.5px; }

/* ============================================================== shell ==== */

.app { height: 100vh; min-height: 640px; display: flex; flex-direction: column; overflow: hidden; }
.app-body { flex: 1; display: flex; min-height: 0; }

/* header escuro, 52px */
.topbar {
  flex: none; height: var(--h-header);
  display: flex; align-items: center; gap: 12px;
  padding: 0 14px;
  background: var(--rail); color: #fff;
}
.topbar .brand { display: flex; align-items: center; gap: 9px; flex: none; color: #fff; text-decoration: none; }
.topbar .brand:hover { text-decoration: none; }
.topbar .brand-mark {
  width: 26px; height: 26px; border-radius: var(--r);
  background: var(--ac); display: grid; place-items: center;
  font: 700 12px/1 var(--font);
}
.topbar .brand-name { font: 700 14px/1 var(--font); letter-spacing: -.01em; white-space: nowrap; }
.topbar .divider { width: 1px; height: 20px; background: rgba(255, 255, 255, .14); flex: none; }

.topbar .tenant {
  display: flex; align-items: center; gap: 8px;
  height: 30px; padding: 0 10px; max-width: 210px;
  background: rgba(255, 255, 255, .07);
  border: 1px solid rgba(255, 255, 255, .12);
  border-radius: var(--r);
  color: rgba(255, 255, 255, .9);
  font: 500 12.5px/1 var(--font); cursor: pointer;
  text-decoration: none;
}
/* achado 2026-08-28: virou <a> na visão de plataforma (antes só <button>) — sem isso, o
   a:hover global (sublinha + cor de destaque) vazava por cima do tema escuro do topbar. */
.topbar .tenant:hover, .topbar a.tenant:hover { background: rgba(255, 255, 255, .13); color: rgba(255, 255, 255, .9); text-decoration: none; }
.topbar .tenant .dot { width: 5px; height: 5px; flex: none; border-radius: 50%; background: var(--ok-dot); }

/* pílula de status do agente — Fase 2 da Etapa 0, no topbar global (não só no Workspace: um
   agente pode querer se pausar de qualquer tela) */
.agent-status {
  position: relative;
  display: flex; align-items: center; gap: 14px;
  height: 30px; padding: 0 14px;
  background: rgba(255, 255, 255, .07); border-radius: var(--r);
  font-size: 12.5px;
}
.agent-status .sep { color: rgba(255, 255, 255, .4); }
.agent-status .muted { color: rgba(255, 255, 255, .72); }
.agent-status .live {
  display: flex; align-items: center; gap: 7px; font-weight: 600;
  background: transparent; border: 0; padding: 0; color: inherit; font: inherit; cursor: pointer;
}
.agent-status .live::before { content: ""; width: 6px; height: 6px; border-radius: 50%; background: var(--ok-dot); }

.agent-status-menu {
  position: absolute; top: calc(100% + 6px); left: 0; z-index: 40;
  min-width: 140px; padding: 5px;
  background: #fff;
  border: 1px solid #e4e7ec; border-radius: 10px;
  box-shadow: 0 12px 32px rgba(16, 24, 40, .18);
}
.agent-status-menu[hidden] { display: none; }

.agent-status-item {
  display: block; width: 100%; padding: 8px 9px;
  background: transparent; border: 0; border-radius: 7px;
  color: #344054; font: 500 12.5px/1.25 var(--font);
  text-align: left; cursor: pointer;
}
.agent-status-item:hover { background: #f4f5f7; color: #101828; }
.agent-status-item[aria-current="true"] { background: var(--ac-s); color: var(--ac-d); font-weight: 700; }

.topbar .icon-btn {
  position: relative; width: 30px; height: 30px; flex: none;
  display: grid; place-items: center;
  background: transparent; border: 0; border-radius: var(--r);
  color: rgba(255, 255, 255, .65); cursor: pointer;
}
.topbar .icon-btn:hover { background: rgba(255, 255, 255, .1); color: #fff; }
.topbar .icon-btn svg { width: 16px; height: 16px; fill: none; stroke: currentColor; stroke-width: 1.8; stroke-linecap: round; }
.topbar .icon-btn .badge-dot {
  position: absolute; top: 5px; right: 6px;
  width: 6px; height: 6px; border-radius: 50%;
  background: var(--bad-dot); border: 1.5px solid var(--rail);
}

.topbar .me {
  display: flex; align-items: center; gap: 8px;
  height: 34px; padding: 0 8px 0 3px;
  background: transparent; border: 0; border-radius: var(--r-md);
  color: #fff; cursor: pointer;
}
.topbar .me:hover { background: rgba(255, 255, 255, .1); }
.topbar .me .avatar { background: var(--ac); color: #fff; }
.topbar .me .id { text-align: left; line-height: 1.2; min-width: 0; }
.topbar .me .name { display: block; font: 600 12.5px/1.2 var(--font); }
.topbar .me .role { display: block; font: 400 10.5px/1.2 var(--font); color: rgba(255, 255, 255, .55); }
@media (max-width: 760px) { .topbar .me .id, .topbar .tenant { display: none; } }

/* rail de navegação por área — pedido do usuário 2026-08-31: era ícone + rótulo curto embaixo
   (largura pensada pro ícone); virou só texto, então trocado pro mesmo padrão de lista vertical
   já usado em .cfg-nav (linha inteira, texto alinhado à esquerda, altura uniforme item a item —
   nada de quebra de linha desigual deixando a barra com ritmo mal-espaçado). */
.rail {
  flex: none; width: var(--w-rail);
  background: var(--rail);
  border-right: 1px solid rgba(255, 255, 255, .07);
  display: flex; flex-direction: column;
  padding: 10px 8px; gap: 1px;
}
.rail a, .rail button {
  position: relative; width: 100%;
  display: flex; align-items: center;
  padding: 9px 10px;
  background: transparent; border: 0; border-radius: var(--r-sm);
  color: rgba(255, 255, 255, .6);
  text-decoration: none; cursor: pointer; text-align: left;
}
.rail a:hover, .rail button:hover { background: rgba(255, 255, 255, .09); color: #fff; text-decoration: none; }
.rail a.active, .rail button.active { background: var(--ac); color: #fff; }
.rail .label { font: 600 12px/1.3 var(--font); letter-spacing: .003em; white-space: nowrap; }
.rail .count {
  position: absolute; top: 4px; right: 6px;
  min-width: 15px; height: 15px; padding: 0 4px;
  border-radius: 8px; background: var(--bad-dot); color: #fff;
  font: 700 9.5px/1 var(--font); display: grid; place-items: center;
}
.rail .push { flex: 1; }

/* modo foco (pedido do usuário, 2026-08-28) — troca o rail de ícones por uma árvore de texto
   de uma frente só, enquanto o resto do menu fica escondido. Ver _RailPartial.cshtml. */
.rail-tree {
  width: var(--w-cfgnav);
  align-items: stretch;
  padding: 14px 10px;
  gap: 1px;
}
.rail-tree-group {
  padding: 4px 9px 10px;
  font: 700 11px/1.3 var(--font); letter-spacing: .04em;
  text-transform: uppercase; color: rgba(255, 255, 255, .55);
}
.rail-tree a {
  width: auto; height: auto; flex-direction: row; justify-content: flex-start;
  padding: 8px 9px 8px 20px; border-radius: var(--r-sm);
  font: 500 13px/1.35 var(--font); color: rgba(255, 255, 255, .8);
}
.rail-tree a .label { display: none; }
.rail-tree a.active { background: var(--ac); color: #fff; }
.rail-tree-logout {
  width: 100%; padding: 8px 9px; margin-top: 8px;
  background: transparent; border: 0; border-top: 1px solid rgba(255, 255, 255, .1);
  color: rgba(255, 255, 255, .55); font: 500 12.5px/1 var(--font); text-align: left; cursor: pointer;
}
.rail-tree-logout:hover { color: #fff; }

/* área de conteúdo */
.main { flex: 1; min-width: 0; overflow-y: auto; padding: 20px 22px; }
.main > .wrap { max-width: 1180px; margin: 0 auto; }
.main.wide > .wrap { max-width: 1240px; }
.main.narrow > .wrap { max-width: 1000px; }
@media (max-width: 760px) { .main { padding: 16px 14px 28px; } }

/* ====================================================== page-header ===== */

.page-header {
  display: flex; flex-wrap: wrap; align-items: flex-end; gap: 14px;
  margin-bottom: 18px;
}
.page-header .titles { min-width: 0; }
.page-header .eyebrow {
  font: 700 11px/1 var(--font); letter-spacing: .06em;
  text-transform: uppercase; color: var(--text-faint); margin-bottom: 6px;
}
.page-header .subtitle { font-size: 13.5px; color: var(--text-muted); }
.page-header .actions { margin-left: auto; display: flex; flex-wrap: wrap; gap: 7px; }
@media (max-width: 760px) { .page-header .actions { margin-left: 0; width: 100%; } }

/* ============================================================ botões ==== */

.btn {
  display: inline-flex; align-items: center; justify-content: center; gap: 8px;
  height: 34px; padding: 0 15px;
  background: var(--ac); border: 0; border-radius: var(--r);
  color: #fff; font: 600 13px/1 var(--font);
  cursor: pointer; white-space: nowrap; text-decoration: none;
  transition: background .12s ease;
}
.btn:hover { background: var(--ac-d); color: #fff; text-decoration: none; }
.btn:focus-visible { outline: 2px solid var(--ac); outline-offset: 2px; }
.btn[disabled] { background: #eef0f3; color: var(--text-ghost); cursor: not-allowed; }

.btn-sec { background: var(--surface); border: 1px solid var(--line-strong); color: var(--text-3); font-weight: 600; }
.btn-sec:hover { background: var(--canvas); border-color: #b9c0cc; color: var(--text-3); }

.btn-danger { background: var(--surface); border: 1px solid var(--bad-line); color: var(--bad); }
.btn-danger:hover { background: var(--bad-bg); color: var(--bad); }

.btn-sm { height: 28px; padding: 0 10px; font-size: 11.5px; border-radius: var(--r-sm); }
.btn-lg { height: 44px; padding: 0 18px; font-size: 14px; border-radius: var(--r-md); }

.btn svg { width: 15px; height: 15px; fill: none; stroke: currentColor; stroke-width: 1.8; stroke-linecap: round; stroke-linejoin: round; }

/* pílulas de filtro (abas de fila, canais, abas de relatório) */
.pill {
  display: inline-flex; align-items: center;
  height: 26px; padding: 0 10px;
  background: var(--surface); border: 1px solid var(--line); border-radius: var(--r-pill);
  color: var(--text-muted); font: 600 11.5px/1 var(--font);
  cursor: pointer; white-space: nowrap; text-decoration: none;
}
.pill:hover { background: var(--canvas); text-decoration: none; color: var(--text-muted); }
.pill.active { background: var(--rail); border-color: transparent; color: #fff; }
.pill-row { display: flex; flex-wrap: wrap; gap: 5px; }

/* ====================================================== cards e KPI ===== */

.card {
  background: var(--surface);
  border: 1px solid var(--line);
  border-radius: var(--r-lg);
  overflow: hidden;
}
.card + .card { margin-top: 12px; }
.card > .card-head {
  display: flex; flex-wrap: wrap; align-items: center; gap: 10px;
  padding: 13px 16px; border-bottom: 1px solid var(--line-soft);
  font: 700 13.5px/1 var(--font);
}
/* Etapa 8B — descendente, não filho direto: um <form> envolvendo .card-body+.card-foot
   como uma unidade (a forma natural de escrever esse HTML) quebrava o filho direto sem
   nenhum ganho real — achado 22 vezes em 18 arquivos numa varredura repo-wide. Seletor
   descendente é estritamente mais permissivo que filho direto (todo caso que já
   casava continua casando), então não há regressão possível nos usos já corretos. */
.card .card-body { padding: 16px; }
.card .card-foot {
  display: flex; flex-wrap: wrap; justify-content: flex-end; gap: 7px;
  padding: 12px 16px; background: var(--surface-alt); border-top: 1px solid var(--line-soft);
}
.card-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(320px, 1fr)); gap: 12px; align-items: start; }
.card-grid.tight { grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); }
/* achado real 2026-08-29: ".card + .card { margin-top: 12px }" (acima) é pra empilhar cards em
   coluna única — mas cards lado a lado dentro de um .card-grid também são irmãos adjacentes no
   DOM, então a regra batia neles também e empurrava o 2º card pra baixo (o gap do grid já cobre
   o espaçamento; a margem era pura sobra, nunca visível numa coluna única onde os dois efeitos
   coincidem, só ficou visível com 2+ cards na mesma linha). */
.card-grid > .card + .card { margin-top: 0; }

/* seção de canal (Canais & conexões) — agrupa cartões por canal em vez de uma lista só */
.channel-group + .channel-group { margin-top: 28px; }
.channel-group-head { display: flex; align-items: center; gap: 9px; margin-bottom: 10px; }
.channel-group-head h2 { font: 700 14px/1 var(--font); color: var(--text); text-transform: none; letter-spacing: 0; }
.channel-group-head .channel-group-count {
  font: 600 11px/1 var(--font); color: var(--text-faint);
  background: var(--surface-alt); border: 1px solid var(--line); border-radius: var(--r-pill);
  padding: 2px 8px;
}

.kpi-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(196px, 1fr)); gap: 12px; margin-bottom: 12px; }
.kpi { background: var(--surface); border: 1px solid var(--line); border-radius: var(--r-lg); padding: 14px 16px; }
.kpi .kpi-label { display: flex; align-items: center; gap: 7px; font: 600 11.5px/1 var(--font); color: var(--text-muted); margin-bottom: 9px; }
.kpi .kpi-value { font: 700 23px/1 var(--font); letter-spacing: -.025em; }
.kpi .kpi-value.lg { font-size: 25px; }
.kpi .kpi-hint { margin-top: 7px; font: 400 11.5px/1.4 var(--font); color: var(--text-faint); }
.kpi .kpi-delta { margin-top: 7px; font: 600 11.5px/1 var(--font); }
.kpi .kpi-delta.up { color: var(--ok); }
.kpi .kpi-delta.down { color: var(--bad); }
.kpi .kpi-delta.warn { color: var(--warn); }

/* ================================================ listas em flex ======== */
/* Tabela sem <table>: uma linha de cabeçalho + N linhas, dentro de um
   .scroller com min-width no filho para cabeçalho e corpo ficarem alinhados.
   SEMPRE envolver em .scroller — sem isso a última coluna é cortada. */

.scroller { overflow-x: auto; -webkit-overflow-scrolling: touch; }
.scroller > .rows { min-width: 700px; }
/* achado real 2026-08-28: cartão "Serviços"/"Filas de envio" do Painel de Saúde usa esse mesmo
   padrão de tabela (.scroller > .rows) dentro de um .card-grid de 2 colunas — cada cartão nunca
   chega perto de 700px, então a barra de rolagem lateral aparecia sempre, em qualquer tela.
   .rows-fit cancela o mínimo pra tabelas curtas (poucas colunas) que cabem no próprio cartão. */
.scroller > .rows.rows-fit { min-width: 0; }

.rows .row-head,
.rows .row {
  display: flex; align-items: center; gap: 12px;
  padding: 11px 16px;
}
.rows .row-head {
  padding: 9px 16px;
  background: var(--surface-alt); border-bottom: 1px solid var(--line-soft);
  font: 700 10.5px/1 var(--font); letter-spacing: .05em;
  text-transform: uppercase; color: var(--text-faint);
}
.rows .row { border-bottom: 1px solid var(--line-softer); font-size: 12.5px; color: var(--text-2); }
.rows .row:hover { background: var(--surface-alt); }
.rows .row.selected { background: var(--ac-s); }
.rows .strong { font-weight: 600; color: var(--text); }
.rows .muted { color: var(--text-faint); font-size: 12px; }
.rows .end { display: flex; justify-content: flex-end; }

/* toolbar de busca e filtros no topo do card */
.toolbar {
  display: flex; flex-wrap: wrap; align-items: center; gap: 9px;
  padding: 11px 14px; border-bottom: 1px solid var(--line-soft);
}
.toolbar input[type="search"], .toolbar input[type="text"], .toolbar select {
  height: 34px; padding: 0 11px;
  background: var(--surface); border: 1px solid var(--line-strong); border-radius: var(--r);
  font: 400 12.5px/1 var(--font); color: var(--text); outline: none;
}
.toolbar input { flex: 1; min-width: 170px; }
.toolbar select { padding: 0 8px; }
.toolbar input:focus, .toolbar select:focus { border-color: var(--ac); box-shadow: 0 0 0 3.5px var(--ac-s); }

.table-foot {
  display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: 10px;
  padding: 12px 16px; border-top: 1px solid var(--line-soft);
  font-size: 12.5px; color: var(--text-muted);
}
.total-row {
  display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: 10px;
  padding: 13px 16px; background: var(--surface-alt); border-top: 1px solid var(--line);
}
.total-row .value { font: 700 17px/1 var(--font); letter-spacing: -.02em; }

/* ==================================================== badges e canais === */

.badge {
  display: inline-block; padding: 2px 8px; border-radius: 6px;
  background: #f2f4f7; color: var(--text-3);
  font: 700 10.5px/1.5 var(--font); white-space: nowrap;
}
.badge-ok { background: var(--ok-bg); color: var(--ok); }
.badge-warn { background: var(--warn-bg); color: var(--warn); }
.badge-bad { background: var(--bad-bg); color: var(--bad); }

/* etiqueta de canal — 9 canais */
.chan {
  flex: none; display: inline-block; padding: 2px 6px; border-radius: 5px;
  font: 700 9.5px/1.6 var(--font); letter-spacing: .03em; white-space: nowrap;
}
.chan-voz       { background: #fffaeb; color: #b54708; }
.chan-whatsapp  { background: #ecfdf3; color: #027a48; }
.chan-email     { background: #eff4ff; color: #3538cd; }
.chan-sms       { background: #f4f3ff; color: #5925dc; }
.chan-rcs       { background: #ecfdff; color: #0e7090; }
.chan-telegram  { background: #eff8ff; color: #175cd3; }
.chan-instagram { background: #fdf2fa; color: #c11574; }
.chan-facebook  { background: #eef4ff; color: #2d31a6; }
.chan-linkedin  { background: #eef6fc; color: #0b4a6f; }

.status-dot { width: 8px; height: 8px; flex: none; border-radius: 50%; display: inline-block; background: var(--ok-dot); }
.status-dot.warn { background: var(--warn-dot); }
.status-dot.bad { background: var(--bad-dot); }

.avatar {
  width: 30px; height: 30px; flex: none; border-radius: 50%;
  background: #eef0f3; color: var(--text-3);
  display: inline-grid; place-items: center;
  font: 700 11px/1 var(--font);
}
.avatar-sm { width: 26px; height: 26px; font-size: 10.5px; }
.avatar-lg { width: 38px; height: 38px; font-size: 13px; }
.avatar-ac { background: var(--ac-s); color: var(--ac-d); }

/* =========================================================== campos ==== */

.field { display: block; margin-bottom: 14px; }
.field > label, .field > .label { display: block; font: 600 12.5px/1 var(--font); color: var(--text-2); margin-bottom: 6px; }
.field input[type="text"], .field input[type="email"], .field input[type="password"],
.field input[type="number"], .field input[type="tel"], .field input[type="url"],
.field input[type="date"], .field select, .field textarea {
  width: 100%; height: 36px; padding: 0 11px;
  background: var(--surface); border: 1px solid var(--line-strong); border-radius: var(--r);
  font: 400 13px/1 var(--font); color: var(--text); outline: none;
  transition: border-color .12s ease, box-shadow .12s ease;
}
.field select { padding: 0 8px; }
.field textarea { height: auto; min-height: 92px; padding: 10px 11px; line-height: 1.5; resize: vertical; }
.field input:focus, .field select:focus, .field textarea:focus { border-color: var(--ac); box-shadow: 0 0 0 3.5px var(--ac-s); }
.field input::placeholder, .field textarea::placeholder { color: var(--text-faint); }
.field .hint { display: block; margin-top: 6px; font: 400 11.5px/1.45 var(--font); color: var(--text-muted); }
/* Ícone "i" dentro do <label> — hover/foco mostra onde achar o valor do campo (ex.: em qual
   painel/tela externa procurar uma credencial). Pedido do usuário 2026-08-30, primeira tela:
   Conector WhatsApp Não Oficial. Reaproveitável em qualquer <label> do app. */
.hint-icon { position: relative; display: inline-flex; vertical-align: middle; margin-left: 5px; color: var(--text-faint); cursor: help; }
.hint-icon svg { width: 14px; height: 14px; display: block; }
.hint-icon:hover, .hint-icon:focus-visible { color: var(--ac); outline: none; }
.hint-icon-tip {
  display: none; position: absolute; z-index: 20; bottom: calc(100% + 8px); left: 0;
  width: 230px; padding: 8px 10px; background: var(--text); color: #fff;
  border-radius: var(--r); font: 400 11.5px/1.45 var(--font); text-transform: none;
  box-shadow: 0 4px 14px rgba(0,0,0,.18);
}
.hint-icon-tip::after {
  content: ""; position: absolute; top: 100%; left: 5px;
  border: 5px solid transparent; border-top-color: var(--text);
}
.hint-icon:hover .hint-icon-tip, .hint-icon:focus-visible .hint-icon-tip { display: block; }
/* Campo de senha com botão "olho" — pedido do usuário 2026-08-30, tela de Editar conector
   (WhatsApp Não Oficial): campos de credencial nessa tela vêm pré-preenchidos com o valor
   decriptado de propósito (só o SuperAdmin chega aqui — mesma decisão já usada em Credenciais
   OAuth), então precisa de um jeito de revelar o texto sem depender do "olho" nativo do navegador
   (nem todo navegador mostra um). Reaproveitável em qualquer <input type="password"> do app. */
.pw-field { position: relative; }
.pw-field input[type="password"], .pw-field input[type="text"] { padding-right: 38px; }
.pw-toggle {
  position: absolute; top: 0; right: 0; height: 36px; width: 36px;
  display: grid; place-items: center; background: transparent; border: 0;
  color: var(--text-faint); cursor: pointer; padding: 0;
}
.pw-toggle:hover, .pw-toggle:focus-visible { color: var(--ac); outline: none; }
.pw-toggle svg { width: 16px; height: 16px; display: block; }
.pw-toggle .pw-icon-off { display: none; }
.pw-field.is-visible .pw-icon-on { display: none; }
.pw-field.is-visible .pw-icon-off { display: block; }
/* Barra de formatação de texto do WhatsApp — pedido do usuário 2026-08-30, campo Texto da
   mensagem em Campanhas. Não é um editor rich-text/contenteditable (WhatsApp não renderiza HTML,
   só os marcadores de texto puro que os botões inserem) — só uma fileira de botões pequenos acima
   do <textarea>, mesma ideia visual do editor de Proposta do CRM Vendas adaptada a este design
   system. Reaproveitável em qualquer <textarea> do app que precise dos mesmos marcadores. */
.wa-text-toolbar { display: flex; align-items: center; gap: 3px; margin-bottom: 6px; }
.wa-text-toolbar-btn {
  width: 28px; height: 28px; flex: none;
  display: grid; place-items: center;
  background: var(--surface); border: 1px solid var(--line-strong); border-radius: var(--r);
  color: var(--text-2); font: 600 12.5px/1 var(--font); cursor: pointer;
}
.wa-text-toolbar-btn:hover, .wa-text-toolbar-btn:focus-visible { border-color: var(--ac); color: var(--ac); outline: none; }
.wa-text-toolbar-divider { width: 1px; height: 18px; background: var(--line-strong); margin: 0 3px; }
/* Layout de duas colunas (formulário + prévia/teste) e o "balão" de prévia — pedido do usuário
   2026-08-30, tela de Editar campanha. Cores do balão (#d9fdd3 verde / #e5ddd5 fundo) imitam o
   WhatsApp Web de propósito — é uma aproximação visual, não precisa de token de tema.
   Achado ao vivo 2026-08-30: a primeira versão usava flex-wrap:wrap com flex-basis (480px+300px) —
   coube ao lado em telas bem largas, mas qualquer largura mais apertada (rail + padding do .main
   comendo espaço) já bastava pra coluna da direita quebrar pra baixo, virando duas seções
   empilhadas em vez de lado a lado. Grid com coluna direita de largura fixa não quebra assim —
   só vira uma coluna só de propósito, abaixo de 900px (tela realmente estreita/celular). */
.wa-campaign-layout { display: grid; grid-template-columns: minmax(0, 1fr) 320px; gap: 16px; align-items: start; }
.wa-campaign-main { min-width: 0; }
.wa-campaign-side { display: flex; flex-direction: column; gap: 14px; position: sticky; top: 16px; }
@media (max-width: 900px) {
  .wa-campaign-layout { grid-template-columns: 1fr; }
  .wa-campaign-side { position: static; }
}
.wa-preview-chat { background: #e5ddd5; border-radius: var(--r); padding: 16px; display: flex; justify-content: flex-end; }
.wa-preview-bubble { background: #d9fdd3; border-radius: 10px 10px 2px 10px; padding: 8px 10px; max-width: 260px; box-shadow: 0 1px 1px rgba(0,0,0,.15); }
.wa-preview-media img, .wa-preview-media video { width: 100%; border-radius: 6px; margin-bottom: 4px; display: block; }
.wa-preview-text { font: 400 13.5px/1.4 var(--font); color: #111b21; white-space: pre-wrap; word-break: break-word; }
.wa-preview-text:empty::before { content: "Sua mensagem aparece aqui"; color: #667781; }
.wa-preview-buttons { margin-top: 8px; display: flex; flex-direction: column; gap: 1px; }
.wa-preview-button { text-align: center; padding: 7px; border-top: 1px solid rgba(0,0,0,.08); color: #00a5f4; font: 600 13px/1 var(--font); }
/* Seletor de país (bandeira + DDI) ao lado do campo de telefone — pedido do usuário 2026-08-30,
   Enviar teste da campanha. Ver _PhoneCountrySelect.cshtml (reaproveitável em qualquer campo de
   telefone). Pedido do usuário 2026-08-31: o código do país fica "reservado" — sem editar dentro
   do campo de número. Um bloco fixo extra (.wa-phone-prefix) chegou a existir aqui pra mostrar o
   código de novo, mas o usuário apontou que é redundante: o próprio <select> já mostra o código
   escolhido na opção selecionada. Removido — só select + campo de número. */
.wa-phone-row { display: flex; gap: 6px; }
.wa-phone-row .wa-phone-country { flex: none; width: auto; min-width: 92px; padding: 0 6px; }
.wa-phone-row input[type="text"], .wa-phone-row input[type="tel"] { flex: 1; min-width: 0; }
/* Linhas dinâmicas de botão/opção (Botões/Lista de opções da campanha) — pedido do usuário
   2026-08-30: "escolher e ir adicionando", mesmo padrão de "Adicionar linha" do editor de
   Proposta do CRM Vendas, em vez de sempre mostrar um número fixo de campos vazios. */
.wa-dyn-row { display: flex; gap: 6px; margin-bottom: 6px; align-items: center; }
.wa-dyn-row input { flex: 1; min-width: 0; }
.wa-dyn-row-pair input { flex: 1; }
.wa-dyn-remove { flex: none; width: 34px; padding: 0; font-size: 16px; line-height: 1; color: var(--bad); }
.field.has-error input, .field.has-error select, .field.has-error textarea { border-color: var(--bad-line); background: #fffafa; }
/* Avatar da foto de perfil no card de Canais & conexões — pedido do usuário 2026-08-30. Nasce
   hidden (ver .wa-avatar no Channels.cshtml); o JS só tira o hidden depois que a imagem carrega
   com sucesso, então uma conta sem foto (ou provedor lento/fora do ar) nunca mostra ícone quebrado. */
.wa-avatar { width: 22px; height: 22px; border-radius: 50%; object-fit: cover; flex: none; }
.field-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(220px, 1fr)); gap: 14px 18px; }
.field-grid .field { margin-bottom: 0; }
.field-grid .field.full { grid-column: 1 / -1; }

.error, .field-validation-error { display: block; margin-top: 6px; font: 600 11.5px/1.45 var(--font); color: var(--bad); }
.validation-summary-errors { padding: 14px 15px; border: 1px solid var(--bad-line); background: var(--bad-bg); border-radius: 10px; color: var(--bad); font-size: 13px; margin-bottom: 14px; }
.validation-summary-errors ul { margin: 8px 0 0; padding-left: 18px; line-height: 1.7; }
.validation-summary-valid { display: none; }

/* cartão de opção (provedor, integração, tipo de conexão) */
.option-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); gap: 10px; }
.option {
  display: flex; align-items: flex-start; gap: 9px;
  padding: 11px 12px; border-radius: 10px;
  background: var(--surface); border: 1.5px solid var(--line);
  cursor: pointer; text-align: left;
}
.option:hover { border-color: var(--ac-b); }
.option.selected { border-color: var(--ac); background: #f9f7fe; }
.option .option-title { display: block; font: 700 13px/1.3 var(--font); color: var(--text); }
.option .option-hint { display: block; margin-top: 2px; font: 400 11.5px/1.4 var(--font); color: var(--text-muted); }

/* toggle (jornada de atendimento) */
.toggle { width: 34px; height: 20px; flex: none; border-radius: 12px; position: relative; background: var(--line-strong); border: 0; cursor: pointer; padding: 0; }
.toggle::after { content: ""; position: absolute; top: 2px; left: 2px; width: 16px; height: 16px; border-radius: 50%; background: #fff; transition: left .14s ease; }
.toggle.on { background: var(--ac); }
.toggle.on::after { left: 16px; }

/* dropzone */
.dropzone {
  border: 1.5px dashed var(--line-strong); border-radius: 11px;
  padding: 22px 16px; text-align: center; background: var(--surface-alt);
}
.dropzone .dz-icon { width: 38px; height: 38px; margin: 0 auto 11px; border-radius: 10px; background: var(--ac-s); color: var(--ac); display: grid; place-items: center; }
.dropzone .dz-title { font: 700 13px/1.3 var(--font); margin-bottom: 4px; }
.dropzone .dz-hint { font: 400 12px/1.45 var(--font); color: var(--text-muted); }

/* ========================================================== avisos ====== */

.alert { display: flex; flex-wrap: wrap; align-items: center; gap: 10px; padding: 11px 14px; border-radius: 11px; font-size: 13px; margin-bottom: 14px; }
.alert svg { width: 16px; height: 16px; flex: none; fill: none; stroke: currentColor; stroke-width: 2; stroke-linecap: round; }
.alert .alert-text { flex: 1; min-width: 0; line-height: 1.5; }
.alert-ok { background: var(--ok-bg); border: 1px solid #a6f4c5; color: #05603a; }
.alert-warn { background: var(--warn-bg); border: 1px solid var(--warn-line); color: #93370d; }
.alert-bad { background: var(--bad-bg); border: 1px solid var(--bad-line); color: #912018; }
.alert-info { background: var(--ac-s); border: 1px solid var(--ac-b); color: var(--ac-d); }

.empty {
  background: var(--surface); border: 1px solid var(--line); border-radius: var(--r-lg);
  padding: 48px 26px; text-align: center;
}
.empty .empty-icon { width: 44px; height: 44px; margin: 0 auto 14px; border-radius: var(--r-lg); background: #f2f4f7; color: var(--text-faint); display: grid; place-items: center; }
.empty h2 { font-size: 15px; margin-bottom: 7px; }
.empty p { max-width: 380px; margin: 0 auto 16px; font-size: 13px; line-height: 1.55; color: var(--text-muted); }

.no-results { margin: 0; padding: 28px 16px; text-align: center; font-size: 13px; color: var(--text-muted); }

/* ====================================================== progresso ======= */

.progress { height: 5px; border-radius: 3px; background: #eef0f3; overflow: hidden; display: flex; }
.progress.lg { height: 8px; border-radius: 5px; }
.progress .bar { height: 100%; background: var(--ac); }
.progress .bar-ok { background: var(--ok-dot); }
.progress .bar-warn { background: var(--warn-dot); }
.progress .bar-bad { background: var(--bad-dot); }
.progress-legend { display: flex; flex-wrap: wrap; gap: 18px 26px; margin-top: 12px; font-size: 12.5px; color: var(--text-muted); }

.timeline { list-style: none; margin: 0; padding: 0; }
.timeline li { display: flex; gap: 12px; }
.timeline .marker { display: flex; flex-direction: column; align-items: center; flex: none; width: 14px; }
.timeline .marker .dot { width: 10px; height: 10px; border-radius: 50%; margin-top: 4px; background: var(--ac); }
.timeline li.pending .marker .dot { background: #fff; border: 2px solid var(--line-strong); box-sizing: content-box; }
.timeline li.warn .marker .dot { background: var(--warn-dot); }
.timeline .marker .line { flex: 1; width: 2px; background: var(--line); }
.timeline li:last-child .marker .line { display: none; }
.timeline .content { padding-bottom: 16px; min-width: 0; }
.timeline .content .label { font: 600 12.5px/1.35 var(--font); color: var(--text); }
.timeline .content .when { margin-top: 2px; font: 400 12px/1.4 var(--font); color: var(--text-faint); }

/* ==================================================== configuração ====== */

.cfg { flex: 1; display: flex; min-width: 0; min-height: 0; }
.cfg-nav {
  flex: none; width: var(--w-cfgnav);
  background: var(--surface); border-right: 1px solid var(--line);
  padding: 14px 10px; overflow-y: auto;
}
.cfg-nav .nav-title { padding: 0 8px 10px; font: 700 11px/1 var(--font); letter-spacing: .06em; text-transform: uppercase; color: var(--text-faint); }
.cfg-nav .nav-group { padding: 12px 8px 5px; font: 700 10.5px/1 var(--font); letter-spacing: .05em; text-transform: uppercase; color: var(--text-ghost); }
.cfg-nav a {
  display: block; padding: 7px 9px; margin-bottom: 1px;
  border-radius: var(--r-sm);
  font: 500 12.5px/1.35 var(--font); color: var(--text-3);
  text-decoration: none;
}
.cfg-nav a:hover { background: var(--canvas); text-decoration: none; color: var(--text-3); }
.cfg-nav a.active { background: var(--ac-s); color: var(--ac-d); font-weight: 700; }
@media (max-width: 900px) {
  .cfg { flex-direction: column; }
  .cfg-nav { width: 100%; border-right: 0; border-bottom: 1px solid var(--line); padding: 10px; display: flex; gap: 6px; overflow-x: auto; }
  .cfg-nav .nav-title, .cfg-nav .nav-group { display: none; }
  .cfg-nav a { white-space: nowrap; }
}

/* cartão de conexão de canal */
.conn-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); gap: 12px; }
.conn { background: var(--surface); border: 1px solid var(--line); border-radius: var(--r-lg); padding: 15px 16px; }
.conn .conn-head { display: flex; align-items: flex-start; gap: 10px; margin-bottom: 12px; }
.conn .conn-icon { width: 34px; height: 34px; flex: none; border-radius: var(--r-md); display: grid; place-items: center; font: 700 11px/1 var(--font); }
.conn .conn-name { font: 700 13.5px/1.3 var(--font); letter-spacing: -.01em; }
.conn .conn-provider { font: 400 11.5px/1.3 var(--font); color: var(--text-faint); margin-top: 2px; }
.conn .conn-metrics { display: flex; flex-wrap: wrap; gap: 14px; padding: 10px 0; border-top: 1px solid var(--line-softer); font: 400 11.5px/1.4 var(--font); color: var(--text-muted); }
.conn .conn-actions { display: flex; gap: 5px; margin-top: 4px; }
.conn-add {
  border: 1.5px dashed var(--line-strong); border-radius: var(--r-lg);
  padding: 15px 16px; min-height: 132px; background: var(--surface-alt);
  display: flex; flex-direction: column; align-items: flex-start; justify-content: center; gap: 7px;
}

/* carteira */
.wallet { background: var(--surface); border: 1px solid var(--line); border-radius: var(--r-lg); padding: 15px 16px; }
.wallet .wallet-head { display: flex; align-items: center; gap: 10px; margin-bottom: 12px; }
.wallet .criteria { display: flex; flex-wrap: wrap; gap: 4px; margin-bottom: 12px; }
.wallet .criteria .tag { padding: 2px 7px; border-radius: 5px; background: var(--canvas); color: var(--text-3); font: 600 10.5px/1.5 var(--font); }
.wallet .figures { display: flex; flex-wrap: wrap; gap: 14px; padding: 10px 0; border-top: 1px solid var(--line-softer); border-bottom: 1px solid var(--line-softer); margin-bottom: 10px; font-size: 11.5px; color: var(--text-muted); }
.wallet .figures strong { font-weight: 700; color: var(--text); }
.wallet .goal { display: flex; align-items: baseline; justify-content: space-between; margin-bottom: 6px; font-size: 11.5px; color: var(--text-muted); }

/* regra de roteamento */
.rule {
  display: flex; flex-wrap: wrap; align-items: center; gap: 10px;
  padding: 11px 12px; border: 1px solid var(--line-soft); border-radius: var(--r-md);
  background: var(--surface-alt); margin-bottom: 7px;
}
.rule .n { width: 20px; height: 20px; flex: none; border-radius: 6px; background: #eef0f3; display: grid; place-items: center; font: 700 10.5px/1 var(--font); color: var(--text-3); }
.rule .cond { flex: 1; min-width: 170px; font-size: 12.5px; color: var(--text-2); }
.rule .arrow { color: var(--text-faint); font-size: 11.5px; }
.rule .target { font: 600 12.5px/1 var(--font); color: var(--ac-d); }

/* =========================================================== diálogo === */

.overlay { position: fixed; inset: 0; z-index: 60; background: rgba(16, 24, 40, .45); }
.dialog {
  position: fixed; z-index: 61; top: 50%; left: 50%; transform: translate(-50%, -50%);
  width: 520px; max-width: 92vw; max-height: 86vh;
  display: flex; flex-direction: column;
  background: var(--surface); border-radius: 14px; box-shadow: var(--sh-lg); overflow: hidden;
}
.dialog.wide { width: 720px; }
.dialog > .dialog-head { flex: none; display: flex; align-items: flex-start; gap: 12px; padding: 16px 18px; border-bottom: 1px solid var(--line-soft); }
.dialog .dialog-title { font: 700 15px/1.3 var(--font); letter-spacing: -.01em; }
.dialog .dialog-sub { font: 400 12.5px/1.45 var(--font); color: var(--text-muted); margin-top: 3px; }
.dialog .dialog-close { width: 28px; height: 28px; flex: none; display: grid; place-items: center; background: transparent; border: 0; border-radius: var(--r-sm); color: var(--text-muted); font-size: 16px; line-height: 1; cursor: pointer; }
.dialog .dialog-close:hover { background: var(--canvas); }
.dialog > .dialog-body { flex: 1; overflow-y: auto; min-height: 0; padding: 16px 18px; }
.dialog > .dialog-foot { flex: none; display: flex; flex-wrap: wrap; justify-content: flex-end; gap: 7px; padding: 13px 18px; background: var(--surface-alt); border-top: 1px solid var(--line-soft); }

/* lista selecionável dentro do diálogo */
.pick { display: flex; align-items: center; gap: 10px; padding: 11px 13px; border: 1px solid var(--line-soft); background: var(--surface); border-radius: var(--r-md); margin-bottom: 6px; cursor: pointer; }
.pick:hover { border-color: var(--ac-b); }
.pick.selected { border-color: var(--ac-b); background: var(--ac-s); }
.pick .pick-label { display: block; font: 600 12.5px/1.35 var(--font); color: var(--text); }
.pick .pick-meta { display: block; font: 400 11.5px/1.4 var(--font); color: var(--text-faint); margin-top: 2px; }

/* ============================================================= login === */

.auth { min-height: 100vh; display: flex; background: var(--surface); }
.auth-form { flex: 1; display: flex; align-items: center; justify-content: center; padding: 48px 32px; }
.auth-form .box { width: 100%; max-width: 352px; }
.auth-form h1 { font-size: 24px; }
.auth-form .lede { color: var(--text-muted); font-size: 14px; margin-bottom: 28px; }
.auth-form .field input { height: 42px; border-radius: var(--r-md); font-size: 14px; }
.auth-form .btn { width: 100%; height: 44px; font-size: 14.5px; border-radius: var(--r-md); }
.auth-aside {
  flex: none; width: 44%; background: var(--rail);
  padding: 48px; display: flex; flex-direction: column; justify-content: flex-end; gap: 22px;
}
.auth-aside .chips { display: flex; flex-wrap: wrap; gap: 8px; }
.auth-aside .chips span {
  min-width: 34px; height: 30px; padding: 0 8px;
  border-radius: var(--r-md); background: rgba(255, 255, 255, .08);
  border: 1px solid rgba(255, 255, 255, .14);
  display: grid; place-items: center;
  color: rgba(255, 255, 255, .72); font: 700 9.5px/1 var(--font); letter-spacing: .03em;
}
.auth-aside .claim { font: 700 22px/1.35 var(--font); color: #fff; letter-spacing: -.02em; max-width: 420px; }
.auth-aside .sub { font: 400 14px/1.6 var(--font); color: rgba(255, 255, 255, .6); max-width: 400px; }
@media (max-width: 900px) { .auth-aside { display: none; } }

/* =========================================================== impressão = */

@media print {
  .topbar, .rail, .cfg-nav, .toolbar, .page-header .actions, .overlay, .dialog { display: none !important; }
  .main { padding: 0; overflow: visible; }
  .card { border-color: #ccc; break-inside: avoid; }
}

/* ============================================================
   Seletor de idioma — anexar ao fim de suite.css
   Segue o mesmo vocabulário do topbar (.tenant, .me, .icon-btn)
   ============================================================ */

.lang { position: relative; flex: none; }

.lang-btn {
  display: flex; align-items: center; gap: 7px;
  height: 30px; padding: 0 9px;
  background: rgba(255, 255, 255, .07);
  border: 1px solid rgba(255, 255, 255, .12);
  border-radius: 8px;
  color: rgba(255, 255, 255, .9);
  font: 500 12.5px/1 inherit;
  cursor: pointer;
}
.lang-btn:hover { background: rgba(255, 255, 255, .13); }
.lang-btn[aria-expanded="true"] { background: rgba(255, 255, 255, .15); }
.lang-btn .flag { width: 17px; height: 12px; flex: none; border-radius: 2px; display: block; }
.lang-btn .code { letter-spacing: .03em; font-weight: 600; }
.lang-btn .caret { opacity: .5; font-size: 9px; }

.lang-menu {
  position: absolute; top: calc(100% + 6px); right: 0; z-index: 40;
  min-width: 188px; padding: 5px;
  background: #fff;
  border: 1px solid #e4e7ec; border-radius: 10px;
  box-shadow: 0 12px 32px rgba(16, 24, 40, .18);
}
.lang-menu[hidden] { display: none; }

.lang-item {
  display: flex; align-items: center; gap: 9px;
  width: 100%; padding: 8px 9px;
  background: transparent; border: 0; border-radius: 7px;
  color: #344054; font: 500 12.5px/1.25 inherit;
  text-align: left; text-decoration: none;
  cursor: pointer;
}
.lang-item:hover { background: #f4f5f7; color: #101828; text-decoration: none; }
.lang-item .flag { width: 19px; height: 14px; flex: none; border-radius: 2px; display: block; }
.lang-item .name { flex: 1; min-width: 0; }
.lang-item .tick { flex: none; font-size: 11px; font-weight: 700; opacity: 0; }

.lang-item[aria-current="true"] {
  background: var(--ac-s);
  color: var(--ac-d);
  font-weight: 700;
}
.lang-item[aria-current="true"] .tick { opacity: 1; }

/* ============================================================
   Matriz de permissões — anexar ao fim de suite.css
   Única tabela <table> do sistema na chrome nova (33 telas × 4 ações).
   Tokens do suite.css; os --row-py/--row-px que a folha antiga (aposentada na
   Etapa 8 Bloco 4) tinha (10px 16px) entram aqui como valores literais, já que
   não existem neste arquivo.
   ============================================================ */

.permission-matrix { width: 100%; min-width: 560px; border-collapse: collapse; }

.permission-matrix th {
  padding: 10px;
  background: var(--surface-alt);
  font: 600 11.5px/1 var(--font);
  letter-spacing: .04em;
  text-transform: uppercase;
  color: var(--text-faint);
  text-align: center;
  white-space: nowrap;
}
.permission-matrix th:first-child { text-align: left; padding-left: 16px; }

.permission-matrix td {
  padding: 10px;
  border-top: 1px solid var(--line-softer);
  text-align: center;
  font-size: 13.5px;
  color: var(--text-2);
}
.permission-matrix td:first-child { text-align: left; padding-left: 16px; }

.permission-matrix tbody tr:hover { background: var(--surface-alt); }

.permission-matrix input[type="checkbox"] {
  width: 18px; height: 18px;
  accent-color: var(--ac);
  cursor: pointer;
}
