/* Modo claro/escuro: mesmo mecanismo do admin do Django (data-theme no
   <html>, guardado em localStorage sob a chave "theme") — continuamos
   reaproveitando o admin/js/theme.js dele pra aplicar o tema, sem
   reescrever essa parte. Só dois modos (claro/escuro, sem "auto"/sistema)
   e o padrão é escuro — por isso o bloco escuro é o que casa com :root
   (sem data-theme definido cai no escuro), e "light" é a exceção
   explícita. A escolha em si mora no menu de engrenagem
   (core/_cabecalho.html), não num botão solto no cabeçalho. */
html[data-theme="dark"],
:root {
  --cor-primaria: #5B9BE0;
  --cor-primaria-clara: #7FB1E8;
  --cor-secundaria: #5B9BE0;
  --cor-fundo: #12181F;
  --cor-secao: #1B222C;
  --cor-borda: #2B3543;
  --cor-texto: #E7ECF2;
  --cor-texto-suave: #9AA7B5;
  --cor-erro: #E5837B;
  --cor-sucesso: #6FCB84;
  /* Âmbar de "atenção" (ex.: prazo que vence hoje) — tom claro pro fundo
     escuro. */
  --cor-aviso: #E0B25B;
  /* Campos de preenchimento (pedido #105): fundo/borda PRÓPRIOS pros
     inputs, distintos do fundo da página E do fundo de seção, pra o campo
     não sumir. No escuro, um tom mais claro que os dois. */
  --cor-campo: #222B37;
  --cor-borda-campo: #3C4A5C;
  --fonte: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
  --raio: 6px;
  color-scheme: dark;
}

html[data-theme="light"] {
  --cor-primaria: #0B1F3A;
  --cor-primaria-clara: #132C4D;
  --cor-secundaria: #1E73BE;
  --cor-fundo: #FFFFFF;
  --cor-secao: #F4F6F8;
  --cor-borda: #E1E5EA;
  --cor-texto: #1F2933;
  --cor-texto-suave: #5A6672;
  --cor-erro: #B3261E;
  --cor-sucesso: #1E7B34;
  /* Âmbar de "atenção" no modo claro: mais escuro pra manter contraste
     de texto sobre fundo branco. */
  --cor-aviso: #9A6A00;
  /* Campos de preenchimento (pedido #105) no modo claro: fundo branco com
     borda nítida — o campo se destaca tanto sobre a página quanto sobre um
     painel cinza-claro (--cor-secao). */
  --cor-campo: #FFFFFF;
  --cor-borda-campo: #B6C0CB;
  color-scheme: light;
}

* {
  box-sizing: border-box;
}

/* O atributo `hidden` do HTML tem que VENCER (issue #281). O navegador o
   aplica como `display:none` na folha do próprio navegador, que perde de
   qualquer classe nossa com `display` (flex, grid, block) — foi assim que
   dois painéis do Propoutmos nasceram abertos. Com esta regra, marcar
   `hidden` no HTML esconde de verdade em todo o sistema, e ninguém
   precisa lembrar de escrever `.minha-classe[hidden]` caso a caso.
   `!important` é proposital: é a mesma solução do normalize.css. */
[hidden] {
  display: none !important;
}

/* Texto só para leitor de tela: some da vista sem sumir da acessibilidade.
   Serve a cabeçalho de coluna de AÇÕES e a rótulo de campo que a tela já
   explica visualmente — o leitor de tela precisa da palavra, o olho não.

   A classe já era usada em três telas (Permissões do CLM, Carteiras e agora
   o Catálogo) sem nunca ter sido definida, então o texto "Ações" aparecia na
   tela como um cabeçalho solto. `clip-path` em vez de `display:none` porque
   o segundo esconde de todo mundo, inclusive do leitor de tela. */
.visualmente-oculto {
  position: absolute;
  width: 1px;
  height: 1px;
  margin: -1px;
  padding: 0;
  overflow: hidden;
  clip-path: inset(50%);
  white-space: nowrap;
  border: 0;
}

body {
  margin: 0;
  font-family: var(--fonte);
  color: var(--cor-texto);
  background: var(--cor-fundo);
  line-height: 1.5;
}

header.topo {
  display: flex;
  align-items: center;
  justify-content: space-between;
  padding: 1rem 2rem;
  border-bottom: 1px solid var(--cor-borda);
}

/* Só o LOGO precisa disto: inline-flex + line-height 0 matam o vão que a
   linha de texto deixa embaixo de um <img> inline.

   Era `header.topo a` — todo link do cabeçalho —, e isso alcançava os itens
   do menu do usuário e do sino, vencendo o `display` que cada um declara
   (mais específico que a classe deles). Com line-height 0, item que quebra
   em duas linhas empilha as duas NO MESMO LUGAR: foi o que aconteceu com
   "Permissões do CLM" sobre "Administração" (reporte do dono, 2026-08-05).
   Os <button> do mesmo menu nunca sofreram — a regra não os alcançava —, e
   é por isso que "Quem está no sistema" sempre quebrou certo.

   Mesma família da regra "nunca metade" do CLAUDE.md: regra global que
   decide layout de um elemento por tabela alcança elementos que ela nunca
   quis governar. */
header.topo a.topo-logo {
  display: inline-flex;
  line-height: 0;
}

.topo-direita {
  display: flex;
  align-items: center;
  gap: 0.5rem;
}

header.topo img {
  height: 32px;
}

/* Logo troca de versão conforme o tema — mesma lógica de data-theme das
   cores acima. Os dois <img> ficam sempre no DOM, só a visibilidade muda. */
header.topo img.logo-escuro { display: block; }
header.topo img.logo-claro { display: none; }

@media (prefers-color-scheme: dark) {
  header.topo img.logo-escuro { display: none; }
  header.topo img.logo-claro { display: block; }
}

html[data-theme="dark"] header.topo img.logo-escuro { display: none; }
html[data-theme="dark"] header.topo img.logo-claro { display: block; }
html[data-theme="light"] header.topo img.logo-escuro { display: block; }
html[data-theme="light"] header.topo img.logo-claro { display: none; }

/* Bem-vindo + contador de conquistas (issue #429): duas linhas empilhadas
   e alinhadas à direita, encostadas no sino. */
.topo-boasvindas {
  display: flex;
  flex-direction: column;
  align-items: flex-end;
  gap: 0.05rem;
}

.topo-bemvindo {
  font-size: 0.9rem;
  color: var(--cor-texto-suave);
  white-space: nowrap;
}

/* A linha do contador é o gatilho da janelinha de conquistas — cara de
   link, não de botão. Cores declaradas por inteiro nos dois estados
   (regra "nunca metade" do CLAUDE.md); hover só sublinha, sem trocar
   fundo. */
.topo-conquistas {
  position: relative;
}

.conquistas-linha {
  list-style: none;
  cursor: pointer;
  font-size: 0.78rem;
  color: var(--cor-secundaria);
  background: transparent;
  white-space: nowrap;
}

.conquistas-linha::-webkit-details-marker {
  display: none;
}

.conquistas-linha:hover,
.conquistas-linha:focus-visible {
  color: var(--cor-secundaria);
  background: transparent;
  text-decoration: underline;
}

/* Janelinha de conquistas: mesmo desenho do painel do sino — interface
   flutuante declara as PRÓPRIAS cores (fundo, texto e texto suave), nos
   dois temas, pra não herdar nada da área que cobre. */
.conquistas-painel {
  position: absolute;
  top: calc(100% + 0.5rem);
  right: 0;
  z-index: 60;
  width: min(17rem, calc(100vw - 2rem));
  border: 1px solid var(--cor-borda);
  border-radius: 0.6rem;
  background: var(--cor-fundo);
  color: var(--cor-texto);
  box-shadow: 0 0.6rem 1.6rem rgba(0, 0, 0, 0.22);
  padding: 0.8rem 1rem;
}

.conquistas-titulo {
  margin: 0 0 0.6rem;
  font-size: 0.9rem;
  font-weight: 600;
  color: var(--cor-texto);
}

.conquistas-lista {
  margin: 0;
  display: flex;
  flex-direction: column;
  gap: 0.45rem;
}

/* Rótulo apagado, valor com a cor cheia (regra "rótulo e valor se
   distinguem de relance"). */
.conquistas-item {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  gap: 0.8rem;
}

.conquistas-item dt {
  font-size: 0.82rem;
  color: var(--cor-texto-suave);
}

.conquistas-item dd {
  margin: 0;
  font-size: 0.95rem;
  font-weight: 600;
  color: var(--cor-texto);
}

/* Menu do usuário (avatar/iniciais), canto superior direito — mesmo
   dropdown <details>/<summary> do menu de engrenagem, só que o "resumo"
   é redondo (foto ou iniciais) em vez de um ícone. "Sair" mora dentro
   dele agora, junto com o resto (regra do Daniel: um botão só). */
.menu-usuario {
  position: relative;
}

.menu-usuario summary {
  list-style: none;
  cursor: pointer;
  user-select: none;
  display: block;
  border-radius: 50%;
}

.menu-usuario summary::-webkit-details-marker {
  display: none;
}

.menu-usuario-avatar {
  width: 2rem;
  height: 2rem;
  border-radius: 50%;
  object-fit: cover;
  display: block;
}

.menu-usuario-iniciais {
  width: 2rem;
  height: 2rem;
  border-radius: 50%;
  background: var(--cor-secundaria);
  color: #FFFFFF;
  display: flex;
  align-items: center;
  justify-content: center;
  font-size: 0.8rem;
  font-weight: 600;
}

.menu-usuario summary:hover .menu-usuario-iniciais,
.menu-usuario[open] .menu-usuario-iniciais {
  background: var(--cor-primaria);
}

.menu-usuario summary:hover .menu-usuario-avatar,
.menu-usuario[open] .menu-usuario-avatar {
  outline: 2px solid var(--cor-secundaria);
  outline-offset: 1px;
}

.menu-usuario .menu-engrenagem-itens form {
  margin: 0;
}

/* Menu de engrenagem (Administração / Saúde), canto superior direito.
   <details>/<summary> dá um dropdown nativo, sem precisar de JavaScript. */
.menu-engrenagem {
  position: relative;
}

.menu-engrenagem summary {
  list-style: none;
  cursor: pointer;
  font-size: 1.3rem;
  line-height: 1;
  padding: 0.4rem 0.6rem;
  border-radius: var(--raio);
  user-select: none;
}

.menu-engrenagem summary::-webkit-details-marker {
  display: none;
}

.menu-engrenagem summary:hover,
.menu-engrenagem[open] summary {
  background: var(--cor-secao);
}

.menu-engrenagem-itens {
  position: absolute;
  right: 0;
  top: 100%;
  margin-top: 0.4rem;
  background: var(--cor-fundo);
  border: 1px solid var(--cor-borda);
  border-radius: var(--raio);
  min-width: 160px;
  /* O painel é absoluto dentro de um <details> do tamanho do avatar (2rem),
     então a largura "disponível" para ele é ~2rem e o encolhimento levava
     todo item mais largo que o piso de 160px a quebrar em duas linhas
     ("Quem está no sistema" sempre quebrou assim). max-content faz o painel
     acompanhar o item mais largo; o max-width impede que um rótulo longo o
     jogue para fora da tela num celular. */
  width: max-content;
  max-width: min(90vw, 22rem);
  box-shadow: 0 4px 12px rgba(0, 0, 0, 0.08);
  overflow: hidden;
  z-index: 10;
}

.menu-engrenagem-itens a,
.menu-engrenagem-itens button {
  display: block;
  width: 100%;
  text-align: left;
  padding: 0.6rem 1rem;
  background: transparent;
  border: none;
  color: var(--cor-texto);
  text-decoration: none;
  font-size: 0.9rem;
  cursor: pointer;
}

.menu-engrenagem-itens a:hover,
.menu-engrenagem-itens button:hover {
  background: var(--cor-secao);
  color: var(--cor-texto);
}

/* Layout com barra lateral, usado em toda tela pós-login/2FA. */
.layout {
  display: flex;
  /* stretch (não flex-start): a barra lateral acompanha a altura da coluna
     mais alta (o conteúdo), então o número da versão — jogado pro pé da
     barra por margin-top:auto — fica sempre no RODAPÉ da barra, e não no
     meio quando o conteúdo é mais alto que ela (issue #144). */
  align-items: stretch;
}

/* Casca de aplicativo (issue #214): a janela inteira é o sistema — cabeçalho
   em cima, e o resto da altura dividido entre barra lateral e conteúdo, cada
   um rolando POR DENTRO. Antes a barra lateral crescia com a lista de
   projetos e esticava a PÁGINA: quem tinha muitos projetos ganhava uma página
   alta com um quadro curto no canto, porque o quadro se dimensiona pela
   altura da JANELA (issue #41), não pela da página. Sem número mágico de
   altura de cabeçalho aqui: o flex mede o que sobrou. Vale só nas telas com
   a classe "casca" (core/base.html): login/2FA seguem sendo um cartão
   centralizado numa página normal, e o /admin/ monta a própria página. */
body.casca {
  display: flex;
  flex-direction: column;
  height: 100vh;
}

body.casca .layout {
  flex: 1;
  /* min-height:0 é o que permite os filhos rolarem por dentro em vez de
     empurrar a casca pra fora da janela (padrão de item flex). */
  min-height: 0;
}

body.casca .conteudo-principal {
  overflow-y: auto;
}

/* Impressão: a casca volta a ser uma página normal, senão o navegador
   imprimiria só a primeira tela e cortaria o resto do conteúdo. */
@media print {
  body.casca,
  body.casca .layout,
  body.casca .conteudo-principal,
  body.casca .barra-lateral {
    display: block;
    height: auto;
    overflow: visible;
  }
}

.barra-lateral {
  /* Largura ajustável arrastando a borda (issue #231): o valor mora numa
     variável CSS pro tema do admin (margin-left do #container) acompanhar
     a mesma preferência sem regra duplicada. */
  width: var(--largura-barra-lateral, 220px);
  flex-shrink: 0;
  position: relative;
  border-right: 1px solid var(--cor-borda);
  padding: 1.5rem 1rem;
  /* Lista comprida de projetos rola aqui dentro (issue #214). O
     overflow-x continua escondido: é ele que corta o texto dos links
     durante a animação de encolher a barra. */
  overflow-y: auto;
  overflow-x: hidden;
  transition: width 0.15s ease;
  /* Flex-column pra a versão (margin-top:auto) cair no rodapé DA BARRA e
     não virar uma coluna vazia ao lado dela (issue #102). */
  display: flex;
  flex-direction: column;
}

.barra-lateral.encolhida {
  width: 44px;
  padding: 1.5rem 0.5rem;
}

/* Alça de ajuste de largura (issue #231): um fio na borda direita, quase
   invisível até o hover; some com a barra encolhida (lá a largura é fixa).
   Durante o arrasto, a classe "ajustando" desliga as transições de
   largura — senão a barra "persegue" o mouse com atraso. */
.barra-lateral-ajuste {
  position: absolute;
  top: 0;
  right: -3px;
  bottom: 0;
  width: 7px;
  cursor: col-resize;
  z-index: 40;
  touch-action: none;
}
.barra-lateral-ajuste:hover,
.barra-lateral-ajuste.arrastando {
  background: color-mix(in srgb, var(--cor-acento, #2563eb) 45%, transparent);
}
.barra-lateral.encolhida .barra-lateral-ajuste { display: none; }
body.ajustando-barra-lateral .barra-lateral,
body.ajustando-barra-lateral #container {
  transition: none !important;
}
/* Sem seleção acidental de texto enquanto se arrasta a alça. */
body.ajustando-barra-lateral { user-select: none; }

.barra-lateral.encolhida .barra-lateral-links {
  display: none;
}

.barra-lateral-toggle {
  display: block;
  background: none;
  border: none;
  cursor: pointer;
  font-size: 1rem;
  color: var(--cor-texto-suave);
  padding: 0.3rem 0.5rem;
  margin-bottom: 1rem;
  border-radius: var(--raio);
}

.barra-lateral-toggle:hover {
  background: var(--cor-secao);
}

.barra-lateral a {
  display: block;
  padding: 0.5rem 0.75rem;
  border-radius: var(--raio);
  color: var(--cor-texto);
  text-decoration: none;
  font-size: 0.95rem;
  margin-bottom: 0.2rem;
  white-space: nowrap;
}

.barra-lateral a:hover {
  background: var(--cor-secao);
}

/* Contador ao lado de um item da barra lateral (ex.: "Empresas repetidas 84").
   Mora AQUI, no CSS global, e não na folha do módulo: a barra lateral aparece
   em TODA tela do sistema, e a folha do CRM só é carregada nas telas do CRM —
   fora dele o número saía como texto solto, sem pílula nenhuma.
   Declara fundo E cor do texto juntos (regra dos dois temas): o :hover do link
   troca o fundo em volta, e sem a cor própria o número seguiria a herança.

   Vale para o contador de qualquer módulo: o CRM estreou o desenho e o Caloi
   ("Aprovações 3") passou a usá-lo. Cada módulo traz a sua classe para esta
   lista em vez de repetir a regra — assim os contadores da barra continuam
   idênticos entre si, que é o ponto de eles morarem aqui. */
.barra-lateral a .crm-pill,
.barra-lateral a .caloi-pill {
  display: inline-block;
  /* O respiro entre o rótulo e o número: sem ele os dois encostam e "Empresas
     repetidas 84" é lido como uma coisa só. Casa com o 0.35rem do ícone. */
  margin-left: 0.4rem;
  padding: 0.12rem 0.6rem;
  border-radius: 999px;
  font-size: 0.82em;
  background: var(--cor-pill-fundo, rgba(120, 140, 255, 0.16));
  color: var(--cor-pill-texto, var(--cor-texto));
  white-space: nowrap;
}

/* Módulos com sub-menu (<details name="barra-lateral-modulos">) — ver
   comentário em _barra_lateral.html com o padrão a copiar. */
.barra-lateral-links summary {
  display: block;
  padding: 0.5rem 0.75rem;
  border-radius: var(--raio);
  color: var(--cor-texto);
  cursor: pointer;
  font-size: 0.95rem;
  list-style: none;
  user-select: none;
  white-space: nowrap;
}

.barra-lateral-links summary::-webkit-details-marker {
  display: none;
}

.barra-lateral-links summary::before {
  content: '▸';
  display: inline-block;
  width: 1em;
  transition: transform 0.1s ease;
}

.barra-lateral-links details[open] summary::before {
  transform: rotate(90deg);
}

.barra-lateral-links summary:hover {
  background: var(--cor-secao);
}

.barra-lateral-links .submenu {
  padding-left: 1.3rem;
}

.barra-lateral-links .submenu a {
  font-size: 0.88rem;
  /* #32: nomes de quadro compridos QUEBRAM em vez de estourar a barra.
     O flex mantém o ícone fixo à esquerda (flex-shrink:0) e o rótulo numa
     coluna própria; min-width:0 deixa o link encolher, white-space:normal
     desfaz o nowrap herdado de ".barra-lateral a", e overflow-wrap:anywhere
     quebra até nomes longos sem espaço. */
  display: flex;
  align-items: center;
  min-width: 0;
  white-space: normal;
  overflow-wrap: anywhere;
}

/* Barra lateral organizável (issues #203 e #205): categorias pessoais e
   projetos arrastáveis. Segue as diretrizes de UI do projeto — rótulos em
   caixa alta e baixa, ação destrutiva como ícone discreto que só aparece
   no hover mas SEMPRE alcançável pelo teclado, criação inline sem botão
   fixo, e respiro em vez de caixas com fundo marcado. */
.barra-lateral-links .categoria-projetos > summary {
  display: flex;
  align-items: center;
  gap: 0.4rem;
  font-size: 0.82rem;
  color: var(--cor-texto-suave);
  padding: 0.35rem 0.75rem;
}

.barra-lateral-links .categoria-projetos > summary .categoria-nome {
  flex: 1;
  min-width: 0;
  overflow-wrap: anywhere;
  white-space: normal;
}

/* O ✕ da categoria: invisível até o hover na linha ou o foco por teclado
   (nunca display:none, senão sumiria da navegação por Tab). */
.categoria-apagar {
  background: none;
  border: 0;
  color: var(--cor-texto-suave);
  cursor: pointer;
  font-size: 0.8rem;
  line-height: 1;
  padding: 0.15rem 0.3rem;
  border-radius: var(--raio);
  opacity: 0;
  transition: opacity 0.1s ease;
}

.categoria-projetos > summary:hover .categoria-apagar,
.categoria-apagar:focus {
  opacity: 1;
}

.categoria-apagar:hover,
.categoria-apagar:focus {
  color: var(--cor-erro);
  background: var(--cor-secao);
}

.categoria-projetos-lista {
  border-radius: var(--raio);
}

/* Altura mínima pra lista VAZIA aceitar um projeto arrastado — mas só
   ENQUANTO um projeto está sendo arrastado (classe posta pelo JS no
   dragstart). Fora do arrasto ela colapsa a zero: era essa reserva
   permanente que deixava um espaço morto entre a última categoria
   minimizada e o "+ Novo projeto" (issue #441). */
.projetos-da-barra.arrastando-projeto .categoria-projetos-lista {
  min-height: 0.9rem;
}

.categoria-projetos-lista.alvo-ativo {
  background: var(--cor-secao);
  outline: 1px dashed var(--cor-borda);
}

.barra-lateral a.projeto-arrastando {
  opacity: 0.4;
}

.barra-lateral a[data-projeto] {
  cursor: grab;
}

/* Categoria arrastável (issue #440): o título é a alça — mesmo cursor e
   mesmo esmaecimento do arraste de projeto. */
.barra-lateral-links .categoria-projetos > summary {
  cursor: grab;
}

.categoria-projetos.categoria-arrastando {
  opacity: 0.4;
}

/* Conteúdo da seção "Todos os projetos": RECUADO, com um fio guia à
   esquerda ligando os projetos ao título que os contém. Sem isto os
   filhos ficavam mais à esquerda que o pai e a hierarquia lia ao
   contrário — o "está feio" que o Daniel reportou em 2026-07-29. */
.projetos-da-barra {
  margin-left: 0.85rem;
  padding-left: 0.55rem;
  border-left: 1px solid var(--cor-borda);
}

/* Criar categoria: em repouso é uma LINHA (um "+" e um rótulo apagado),
   no mesmo ritmo dos projetos — nada de caixa. Só o foco desenha o
   campo. Antes isto era um input com borda e fundo, gêmeo da busca logo
   abaixo, e era lido como um segundo campo de busca. */
.nova-categoria-linha {
  display: flex;
  align-items: center;
  gap: 0.1rem;
  margin-top: 0.1rem;
}

/* "Novo projeto" (issue #436): a AÇÃO que as pessoas procuram no fim da
   lista — fica com o "+" e com a cor de destaque, pra não ser confundida
   com a criação de categoria logo abaixo (que é só organização da barra).
   Fundo e cor do texto declarados JUNTOS nos dois estados (regra "nunca
   metade" do CLAUDE.md). */
.barra-lateral a.novo-projeto-linha {
  display: flex;
  align-items: center;
  gap: 0.35rem;
  margin-top: 0.35rem;
  padding: 0.3rem 0.4rem 0.3rem 0.75rem;
  font-size: 0.85rem;
  border-radius: var(--raio);
  background: transparent;
  color: var(--cor-primaria);
  text-decoration: none;
}

.barra-lateral a.novo-projeto-linha:hover,
.barra-lateral a.novo-projeto-linha:focus-visible {
  background: var(--cor-secao);
  color: var(--cor-primaria);
}

.novo-projeto-mais {
  flex: none;
  font-size: 1rem;
  line-height: 1;
}

/* Ícone de pasta da linha de categoria (issue #436): mesmo comportamento
   do antigo "+" — apagado em repouso, firme no hover/foco da linha. */
.nova-categoria-pasta {
  flex: none;
  width: 0.9rem;
  height: 0.9rem;
  margin-left: 0.75rem;
  color: var(--cor-texto-suave);
}

.nova-categoria-linha:hover .nova-categoria-pasta,
.nova-categoria-linha:focus-within .nova-categoria-pasta {
  color: var(--cor-texto);
}

/* Especificidade acima de input[type="text"] (regra global de formulário,
   base.css): sem os dois seletores ela vence e devolve borda e fundo de
   campo ao repouso — foi exatamente o que aconteceu na primeira tentativa
   de deixar este campo discreto. */
.barra-lateral input.nova-categoria {
  flex: 1;
  min-width: 0;
  width: auto;
  margin: 0;
  padding: 0.3rem 0.4rem;
  font-size: 0.85rem;
  font-family: inherit;
  color: var(--cor-texto);
  background: transparent;
  background-color: transparent;
  border: 1px solid transparent;
  border-radius: var(--raio);
}

.barra-lateral input.nova-categoria::placeholder {
  color: var(--cor-texto-suave);
}

.barra-lateral input.nova-categoria:focus {
  outline: none;
  background-color: var(--cor-campo);
  border-color: var(--cor-borda-campo);
}

.conteudo-principal {
  flex: 1;
  padding: 2rem;
  /* Issue #60: sem isto, o quadro largo ALARGA a página inteira (item
     flex tem min-width:auto por padrão) e a rolagem horizontal vira da
     tela toda — o overflow-x do .abana-quadro nunca era acionado. */
  min-width: 0;
}

/* Sem sessão autenticada+verificada (login, 2FA): sem barra lateral,
   volta a ser um cartão único centralizado — só troca via CSS, o HTML é
   o mesmo em toda tela (ver base.html). */
body:not(.logado) .barra-lateral {
  display: none;
}

body:not(.logado) .conteudo-principal {
  flex: none;
  width: 100%;
  max-width: 480px;
  margin: 3rem auto;
  padding: 0 1.5rem;
}

.grade-metricas {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));
  gap: 1rem;
  margin-top: 1.5rem;
}

.grade-metricas h2 {
  font-size: 1rem;
  color: var(--cor-primaria);
  margin: 0 0 0.5rem;
}

.grade-metricas p {
  margin: 0.2rem 0;
}

h1 {
  font-size: 1.5rem;
  font-weight: 700;
  color: var(--cor-texto);
  margin-bottom: 0.5rem;
}

/* Tabelas de listagem (projetos, membros etc.) — nenhuma tinha estilo
   próprio até aqui, só o padrão sem formatação do navegador. */
table {
  width: 100%;
  border-collapse: collapse;
  margin-bottom: 1.5rem;
}

th,
td {
  text-align: left;
  padding: 0.65rem 0.9rem;
  border-bottom: 1px solid var(--cor-borda);
}

th {
  color: var(--cor-texto-suave);
  font-weight: 600;
  font-size: 0.8rem;
}

/* Caixa alta SÓ em cabeçalho de COLUNA (thead) — célula-cabeçalho de
   LINHA (<th scope="row">) carrega DADOS (ex.: e-mails na tela de
   adicionar vários usuários) e não pode ser transformada (issue #14). */
thead th {
  text-transform: uppercase;
  letter-spacing: 0.03em;
}

tbody tr:hover {
  background: var(--cor-secao);
}

p {
  color: var(--cor-texto-suave);
}

.cartao {
  background: var(--cor-fundo);
  border: 1px solid var(--cor-borda);
  border-radius: var(--raio);
  padding: 1.5rem;
  /* Nomes de arquivo (ex.: do último backup) não têm espaço pra quebrar
     naturalmente — sem isso, uma string longa empurra a borda do cartão. */
  overflow-wrap: break-word;
  min-width: 0;
}

label {
  display: block;
  font-size: 0.9rem;
  color: var(--cor-texto);
  margin-bottom: 0.3rem;
}

/* Rótulo que ENVOLVE uma caixa de seleção (issue #238): caixa e texto na
   mesma linha, alinhados — o display:block do rótulo global os separava
   em duas linhas. Clicar no texto alterna a caixa (é o mesmo label). */
.rotulo-caixa {
  display: inline-flex;
  align-items: center;
  gap: 0.4rem;
  margin-bottom: 0;
  cursor: pointer;
}

input[type="text"],
input[type="email"],
input[type="password"] {
  width: 100%;
  padding: 0.6rem 0.75rem;
  border: 1px solid var(--cor-borda-campo);
  border-radius: var(--raio);
  font-family: inherit;
  font-size: 1rem;
  margin-bottom: 1rem;
  background-color: var(--cor-campo);
  color: var(--cor-texto);
}

/* Contraste E forma dos campos de preenchimento (pedido #105 + issue #159):
   dar fundo, borda, cantos, fonte e espaçamento PRÓPRIOS aos controles de
   formulário reais — que antes herdavam o fundo da página (sumiam) e, no
   caso de <textarea>/<select> crus, a fonte monospace e a borda default do
   navegador (saíam "fora do padrão"). Regra base (baixa especificidade) de
   propósito: os campos de edição inline do Abana (título de tarefa/painel,
   seletores-pílula) definem o próprio visual por classe e continuam passando
   por cima disto — só os formulários de verdade ganham este tratamento.
   background-COLOR (não background) preserva a setinha dos <select>. */
input[type="search"],
input[type="number"],
input[type="tel"],
input[type="url"],
input[type="date"],
input[type="time"],
input[type="datetime-local"],
textarea,
select {
  padding: 0.6rem 0.75rem;
  border: 1px solid var(--cor-borda-campo);
  border-radius: var(--raio);
  font-family: inherit;
  font-size: 1rem;
  background-color: var(--cor-campo);
  color: var(--cor-texto);
}

/* Textarea cru redimensiona só na vertical (o horizontal quebraria o
   layout das linhas do construtor de automação). */
textarea {
  resize: vertical;
}

input:focus,
textarea:focus,
select:focus {
  outline: 2px solid var(--cor-secundaria);
  outline-offset: 1px;
}

button,
.botao {
  display: inline-block;
  padding: 0.35rem 0.9rem;
  border-radius: var(--raio);
  font-size: 0.9rem;
  font-family: inherit;
  cursor: pointer;
  border: 1px solid var(--cor-secundaria);
  background: var(--cor-secundaria);
  color: #FFFFFF;
  text-decoration: none;
}

button:hover,
.botao:hover {
  background: var(--cor-primaria);
  border-color: var(--cor-primaria);
  /* A cor do TEXTO anda junto com o fundo (regra do CLAUDE.md, reforçada
     em 2026-08-01): sem isto, todo botão "fantasma" (fundo transparente +
     texto de acento) que não declarasse o próprio hover virava acento
     sobre acento — texto invisível. Quem quiser outro hover declara os
     três (fundo, borda e cor) na própria classe. */
  color: #FFFFFF;
}

/* Reason why a control is disabled (issue #666).

   It rides the same balloon the ⓘ tips use (.dica / .dica-balao): the reason
   appears on hover and on focus instead of sitting on the screen for good.
   The owner asked for that on 2026-08-31 — a faded button, a blocked cursor
   and a reason on hover already say everything, and a permanent line of grey
   text next to every blocked control is clutter.

   It is NOT a retreat to the browser's `title`, which is what the rule
   forbids: `title` on a disabled element is simply never drawn, so the reason
   reached nobody. This balloon is ours and it does appear.

   The wrapper carries `tabindex` because a disabled button takes no focus —
   without it `:focus-within` could never fire and a keyboard user would have
   no way to reveal the reason at all. */
.acao-bloqueada {
  border-radius: var(--raio, 6px);
  /* O ⓘ nasce com um respiro à esquerda porque vem depois de um título; aqui
     a peça É o controle, então ela não desloca nada. */
  margin-left: 0;
}

.acao-bloqueada:focus-visible {
  outline: 2px solid var(--cor-secundaria);
  outline-offset: 2px;
}

/* Every OTHER disabled button — the ones that are not .botao (issue #666).

   The rule below gives .botao its own muted palette, but the system is full
   of buttons that are not .botao: the discrete row icons (🗑), menu rows,
   batch-apply buttons. Those kept looking, and behaving, exactly like a
   working control — the CRM delete icon still lit up red under the mouse
   while disabled (reported by the owner).

   Two declarations do the whole job:

   - `opacity` so the control reads as inert at a glance;
   - `pointer-events: none` so `:hover` never matches in the first place.
     Undoing each class's hover from here would mean guessing the background
     and text colour it painted — precisely the "half a rule" the project
     forbids. Making the hover unreachable needs no guess, and nothing is
     lost: the control was already unclickable.

   Specificity is (0,2,1), which beats the (0,1,0) of a `.classe { opacity }`
   — that is what lets it override the "always visible" opacity that detail
   screens give their row icons. */
button:disabled:not(.botao),
button[disabled]:not(.botao) {
  opacity: 0.5;
  pointer-events: none;
}

/* Disabled primary button (issue #666).

   The guideline keeps the primary action VISIBLE when unavailable, but it
   has to LOOK unavailable: without this rule a disabled .botao kept the
   accent background and the white text, so the only hint that it did not
   work was the click doing nothing.

   Background, border AND text colour are declared together — the project's
   "never half a rule". The hover twin is declared too, otherwise
   .botao:hover repaints the accent background over a button that cannot be
   pressed. */
.botao:disabled,
.botao[disabled] {
  background: var(--cor-secao);
  border-color: rgba(128, 128, 128, 0.28);
  color: var(--cor-texto-suave);
  cursor: not-allowed;
}

.botao:disabled:hover,
.botao[disabled]:hover {
  background: var(--cor-secao);
  border-color: rgba(128, 128, 128, 0.28);
  color: var(--cor-texto-suave);
}

/* Linha [Salvar configuração] [Enviar agora] da tela de Backup (issue #171):
   os dois botões lado a lado, cada um apontando pro seu <form> via form=. */
.backup-botoes {
  display: flex;
  gap: 0.5rem;
  flex-wrap: wrap;
  align-items: center;
  margin-top: 0.25rem;
}

.botao-secundario {
  background: var(--cor-fundo);
  color: var(--cor-secundaria);
}

.botao-secundario:hover {
  background: var(--cor-secao);
  color: var(--cor-primaria);
}

/* Botão só com o logotipo (sem texto) — pedido do Daniel, mesmo padrão
   visual do ícone "G" oficial do Google, num botão quadrado/arredondado
   compacto, centralizado, em vez do botão de largura total com texto. */
.botao-google {
  display: flex;
  align-items: center;
  justify-content: center;
  width: 3rem;
  height: 3rem;
  margin: 0 auto 1rem;
  border-radius: var(--raio);
  border: 1px solid var(--cor-borda);
  background: #FFFFFF;
  text-decoration: none;
}

.botao-google:hover {
  background: var(--cor-secao);
  color: var(--cor-texto);
}

.login-separador {
  display: flex;
  align-items: center;
  gap: 0.6rem;
  margin: 1rem 0;
  color: var(--cor-texto-suave);
  font-size: 0.85rem;
}

.login-separador::before,
.login-separador::after {
  content: '';
  flex: 1;
  height: 1px;
  background: var(--cor-borda);
}

/* Issue #31: formulário de e-mail/senha recolhido atrás de um link
   discreto — o Google é o caminho principal. Cores só por variáveis,
   valendo igual nos dois temas. */
.login-detalhes summary {
  cursor: pointer;
  text-align: center;
  color: var(--cor-texto-suave);
  font-size: 0.9rem;
  list-style: none;
}

.login-detalhes summary::-webkit-details-marker {
  display: none;
}

.login-detalhes summary:hover,
.login-detalhes summary:focus-visible {
  color: var(--cor-primaria);
  text-decoration: underline;
}

.login-detalhes[open] summary {
  margin-bottom: 0.8rem;
}

/* Aviso dentro do formulário recolhido (pedido do Daniel, 2026-07-21):
   quase ninguém tem senha local — quem expandir por engano é orientado
   de volta pro Google. */
.login-aviso {
  margin: 0 0 0.8rem;
  padding: 0.6rem 0.8rem;
  border: 1px solid var(--cor-borda);
  border-radius: var(--raio);
  color: var(--cor-texto-suave);
  font-size: 0.85rem;
}

.abana-excluir-projeto {
  background: var(--cor-fundo);
  border-color: var(--cor-erro);
  color: var(--cor-erro);
}

.abana-excluir-projeto:hover {
  background: var(--cor-erro);
  border-color: var(--cor-erro);
  color: #FFFFFF;
}

.abana-excluir-projeto-discreto {
  padding: 0.3rem 0.7rem;
  font-size: 0.8rem;
}

/* Abas das configurações do projeto (Geral / Membros e Permissões) —
   páginas separadas de verdade (URLs distintas), isto aqui é só a
   navegação entre elas. */
.abana-abas-config {
  display: flex;
  gap: 1.5rem;
  border-bottom: 1px solid var(--cor-borda);
  margin-bottom: 1.5rem;
}

.abana-abas-config a {
  display: inline-block;
  padding: 0.6rem 0;
  color: var(--cor-texto-suave);
  text-decoration: none;
  border-bottom: 2px solid transparent;
  font-size: 0.95rem;
}

.abana-abas-config a:hover {
  color: var(--cor-texto);
}

.abana-abas-config a.ativa {
  color: var(--cor-texto);
  border-bottom-color: var(--cor-secundaria);
  font-weight: 600;
}

/* Audiência de um campo reservado (issue #456): as duas listas de quem vê,
   dentro do editor de campos. Painel rolável em vez de uma coluna infinita
   de caixinhas — num projeto com trinta pessoas a lista empurraria o botão
   Salvar para fora da tela.
   Só LAYOUT: nenhuma regra aqui mexe em fundo ou cor de texto num estado,
   então não há metade a declarar (regra "nunca metade" do CLAUDE.md). */
.abana-audiencia-lista {
  margin-top: 0.6rem;
}

.abana-audiencia-lista ul {
  list-style: none;
  margin: 0.3rem 0 0;
  padding: 0.3rem 0.5rem;
  max-height: 12rem;
  overflow-y: auto;
  border: 1px solid var(--cor-borda);
  border-radius: var(--raio);
}

.abana-audiencia-lista li {
  padding: 0.15rem 0;
}

.abana-audiencia-lista label {
  display: inline-flex;
  align-items: center;
  gap: 0.4rem;
  font-weight: 400;
}

/* Barra do Salvar da tabela de acesso ao projeto (issue #631). A tela toda
   é um formulário só: enquanto houver mudança por gravar, o aviso aparece
   ao lado do botão — nunca só uma cor, sempre com texto. */
.abana-barra-salvar {
  display: flex;
  align-items: center;
  gap: 1rem;
  flex-wrap: wrap;
  margin-top: 1.1rem;
}

.abana-pendente {
  margin: 0;
  font-size: 0.88rem;
  color: var(--cor-aviso);
}

/* Link discreto que descarta o que está na tela (recarrega a página).
   Declara a cor do texto em TODOS os estados — nenhum deles muda o fundo,
   então nenhum pode deixar a cor por herdar (regra "nunca metade"). */
.abana-cancelar-acesso {
  color: var(--cor-texto-suave);
  text-decoration: underline;
  font-size: 0.9rem;
}

.abana-cancelar-acesso:hover,
.abana-cancelar-acesso:focus-visible {
  color: var(--cor-texto);
}

/* Linha de papel em lote (issue #438): uma por seção, colada na tabela
   dela, lendo como frase ("Marque as caixinhas..."). O botão continua
   visível quando desabilitado (com o porquê no title), só apagado.
   Layout apenas — as cores de botão/select vêm das regras globais, que
   já declaram fundo e texto juntos nos dois temas. */
.abana-lote-linha {
  display: flex;
  align-items: center;
  gap: 0.5rem;
  flex-wrap: wrap;
  margin: 0.3rem 0 0.6rem;
  font-size: 0.9rem;
  color: var(--cor-texto-suave);
}

.abana-lote-contagem {
  color: var(--cor-texto-suave);
  font-size: 0.9rem;
}

/* Tabelas de membros: coluna estreita das caixas de seleção e ícone de
   remoção discreto que a LINHA revela no hover (o padrão .abana-icone-acao
   revela por foco sozinho; aqui o ícone mora fundo na árvore da linha,
   então a regra genérica ':hover >' não o alcança). */
.abana-tabela-membros .abana-coluna-selecao {
  width: 2rem;
  text-align: center;
}

.abana-tabela-membros .abana-coluna-acao {
  width: 2.5rem;
  text-align: center;
}

.abana-tabela-membros tr:hover .abana-icone-acao {
  opacity: 1;
}

/* --- Tela de acesso ao projeto (epic #447) ---------------------------------
   Uma lista só, com linhas de PESSOA e de EQUIPE misturadas. Respiro entre
   seções em vez de caixas cinzas (diretriz de UI); divisórias finas.
   Toda regra que mexe em FUNDO num estado declara junto a COR DO TEXTO (e
   vice-versa) — a "regra nunca metade" do CLAUDE.md, conferida pelo
   core/lint_contraste.py. */
.abana-secao-acesso {
  margin: 2rem 0;
  padding-top: 1.2rem;
  border-top: 1px solid var(--cor-borda);
}

.abana-secao-acesso:first-of-type {
  border-top: none;
  padding-top: 0;
}

.abana-descricao-secao {
  color: var(--cor-texto-suave);
  font-size: 0.9rem;
  max-width: 60ch;
}

/* O nome de quem tem acesso é o VALOR da linha: cor cheia do texto, para
   se distinguir do rótulo/pílula ao lado (diretriz "rótulo e valor"). */
.abana-nome-do-acesso {
  color: var(--cor-texto);
}

/* Gatilho que expande a linha de equipe: parece texto, não botão. Declara
   fundo E cor do texto nos três estados, sem herdar nada da regra global
   de <button> (que é fundo azul + texto branco). */
.abana-linha-equipe {
  display: inline-flex;
  align-items: center;
  gap: 0.45rem;
  background: transparent;
  color: var(--cor-texto);
  border: 1px solid transparent;
  border-radius: var(--raio);
  padding: 0.15rem 0.4rem;
  font: inherit;
  cursor: pointer;
  text-align: left;
}

.abana-linha-equipe:hover,
.abana-linha-equipe:focus-visible {
  background: var(--cor-secao);
  color: var(--cor-texto);
  border-color: var(--cor-borda);
}

/* A setinha diz se a linha está aberta, sem depender só do aria-expanded. */
.abana-linha-equipe::before {
  content: '▸';
  color: var(--cor-texto-suave);
  font-size: 0.8rem;
}

.abana-linha-equipe[aria-expanded="true"]::before {
  content: '▾';
}

.abana-pill-equipe {
  display: inline-flex;
  align-items: center;
  gap: 0.25rem;
  font-size: 0.7rem;
  padding: 0.05rem 0.5rem;
  background: var(--cor-secao);
  color: var(--cor-texto-suave);
  border: 1px solid var(--cor-borda);
  border-radius: 999px;
}

.abana-contagem-da-equipe,
.abana-papel-herdado,
.abana-vazio-da-equipe {
  color: var(--cor-texto-suave);
  font-size: 0.85rem;
}

.abana-lista-pessoas-da-equipe {
  list-style: none;
  margin: 0.2rem 0 0.2rem 1.6rem;
  padding: 0;
}

.abana-lista-pessoas-da-equipe li {
  display: flex;
  align-items: center;
  gap: 0.6rem;
  padding: 0.3rem 0;
  border-bottom: 1px solid var(--cor-borda);
}

.abana-lista-pessoas-da-equipe li:last-child {
  border-bottom: none;
}

/* O ✕ de cada pessoa dentro da equipe some até o hover/foco da própria
   linha — mesma diretriz das ações destrutivas do resto do sistema. */
.abana-lista-pessoas-da-equipe .abana-icone-acao {
  opacity: 0;
}

.abana-lista-pessoas-da-equipe li:hover .abana-icone-acao,
.abana-lista-pessoas-da-equipe .abana-icone-acao:focus-visible {
  opacity: 1;
}

/* Janelinha do "Adicionar": ancorada no botão, com cores PRÓPRIAS (não
   herda a região que cobre — diretriz da interface flutuante). */
.abana-adicionar-acesso {
  position: relative;
  display: inline-block;
  margin-top: 0.8rem;
}

.abana-adicionar-acesso .abana-popover {
  position: absolute;
  z-index: 40;
  top: calc(100% + 0.35rem);
  left: 0;
  width: 22rem;
  max-width: calc(100vw - 2rem);
  padding: 0.9rem;
  background: var(--cor-secao);
  color: var(--cor-texto);
  border: 1px solid var(--cor-borda);
  border-radius: var(--raio);
  box-shadow: 0 8px 24px rgba(0, 0, 0, 0.18);
}

.abana-rotulo-busca {
  display: block;
  margin: 0.5rem 0 0.2rem;
  font-size: 0.85rem;
  color: var(--cor-texto-suave);
}

.abana-busca-acesso {
  width: 100%;
  background: var(--cor-campo);
  color: var(--cor-texto);
  border: 1px solid var(--cor-borda-campo);
  border-radius: var(--raio);
  padding: 0.35rem 0.5rem;
}

.abana-opcoes-acesso {
  max-height: 14rem;
  overflow-y: auto;
  margin: 0.4rem 0;
  border: 1px solid var(--cor-borda);
  border-radius: var(--raio);
  padding: 0.3rem;
}

.abana-grupo-de-opcoes {
  margin: 0.3rem 0 0.2rem;
  font-size: 0.75rem;
  text-transform: none;
  color: var(--cor-texto-suave);
}

.abana-opcao-acesso {
  display: flex;
  align-items: center;
  gap: 0.45rem;
  padding: 0.25rem 0.3rem;
  border-radius: var(--raio);
  color: var(--cor-texto);
  cursor: pointer;
}

.abana-opcao-acesso:hover,
.abana-opcao-acesso:focus-within {
  /* A janelinha já é --cor-secao; o realce da opção precisa de um tom
     DIFERENTE dela, senão o hover não aparece. --cor-campo é mais claro
     que --cor-secao nos dois temas. A cor do texto vai declarada junto
     (regra "nunca metade" do CLAUDE.md). */
  background: var(--cor-campo);
  color: var(--cor-texto);
}

/* Mensagens do framework messages do Django (django.contrib.messages) —
   a cor segue message.tags (success/error/warning/info), não é sempre
   vermelho: antes disso era um bug (base.html usava sempre a mesma classe
   "erro" pra qualquer mensagem, inclusive as de sucesso). */
.mensagem {
  border-radius: var(--raio);
  padding: 0.6rem 0.9rem;
  margin-bottom: 1rem;
  font-size: 0.9rem;
  border: 1px solid;
}

/* As cores de TEXTO destas três são fixas, e não var(--cor-erro)/
   var(--cor-sucesso), pelo mesmo motivo que a ".mensagem-warning" sempre
   foi fixa: o FUNDO delas é claro nos dois temas. Variável de tema num
   fundo fixo é meia regra — no modo escuro o verde de --cor-sucesso
   (#6FCB84, pensado para fundo escuro) caía sobre #EAF7ED e a frase de
   sucesso ficava quase ilegível. Os valores abaixo são os do tema claro,
   que é o tema do fundo. */
.mensagem-error {
  background: #FBEAE9;
  color: #B3261E;
  border-color: #B3261E;
}

.mensagem-success {
  background: #EAF7ED;
  color: #1E7B34;
  border-color: #1E7B34;
}

.mensagem-warning {
  background: #FFF6E5;
  color: #8A6300;
  border-color: #8A6300;
}

.mensagem-info {
  background: var(--cor-secao);
  color: var(--cor-texto);
  border-color: var(--cor-borda);
}

/* Link dentro de um aviso (issue #660): o de contrato criado leva à ficha.
   Herda a cor da própria caixa — que é a única garantidamente legível
   naquele fundo — em vez da cor global de link, que é pensada para o fundo
   da página e muda com o tema. O sublinhado é o que o faz parecer link
   sendo da mesma cor do texto ao redor; no hover ele sai, e a cor
   continua declarada (regra "nunca metade" do CLAUDE.md). */
.mensagem a {
  color: inherit;
  font-weight: 600;
  text-decoration: underline;
}

.mensagem a:hover,
.mensagem a:focus-visible {
  color: inherit;
  text-decoration: none;
}

/* Erros de campo dos formulários do Django (ex.: senha atual errada) —
   mesmo estilo do .erro acima, só que o Django gera isso sozinho como
   <ul class="errorlist">, então precisa de uma regra própria. */
.errorlist {
  list-style: none;
  background: #FBEAE9;
  color: var(--cor-erro);
  border: 1px solid var(--cor-erro);
  border-radius: var(--raio);
  padding: 0.6rem 0.9rem;
  margin: 0 0 0.5rem;
  font-size: 0.9rem;
}

.errorlist li {
  margin: 0;
}

code {
  background: var(--cor-secao);
  padding: 0.2rem 0.4rem;
  border-radius: 4px;
  font-size: 0.9rem;
}

.foto-perfil-atual {
  max-width: 120px;
  border-radius: 50%;
  border: 1px solid var(--cor-borda);
}

ul {
  padding-left: 1.2rem;
}

a {
  color: var(--cor-secundaria);
}

/* Quadro Kanban do Abana — renderizado em React (abana/frontend), estas
   classes são compartilhadas com o CSS puro do resto do sistema de
   propósito (mesmos tokens --cor-*, sem CSS duplicado no bundle do React).
   Reordenar é por @dnd-kit: mouse/toque na alça (.abana-alca-arrastar) OU
   teclado (Tab até a alça, Espaço pra pegar, setas pra mover, Espaço pra
   soltar) — a alternativa acessível ao arrastar vem de graça da lib. */
.abana-cabecalho-quadro {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 1rem;
}

.abana-cabecalho-quadro h1 {
  margin-bottom: 0;
}

/* Menu "Configurações" do quadro: mesmo .menu-engrenagem do cabeçalho
   global, mas discreto (texto, não emoji) — pedido explícito de não
   ficar chamativo do lado do título. */
.abana-cabecalho-quadro .menu-engrenagem summary {
  font-size: 0.85rem;
  color: var(--cor-texto-suave);
  border: 1px solid var(--cor-borda);
  padding: 0.4rem 0.8rem;
}

.abana-cabecalho-quadro .menu-engrenagem summary:hover,
.abana-cabecalho-quadro .menu-engrenagem[open] summary {
  color: var(--cor-texto);
}

.abana-quadro {
  display: flex;
  gap: 1rem;
  align-items: flex-start;
  overflow-x: auto;
  padding-bottom: 1rem;
}

/* Espaço lateral enxuto na tela do quadro (pedido #102): as 2rem de
   padding do conteúdo principal deixavam uma faixa vazia entre a barra
   lateral e a primeira coluna. Na página do quadro (marcada com
   data-quadro no <main>) o padding horizontal encolhe bastante pra sobrar
   largura pras colunas; o topo continua com respiro pro título e as abas. */
.conteudo-principal[data-quadro] {
  /* Gutter enxuto no quadro (pedido #102): a faixa larga e inútil era a
     coluna da versão (corrigida na barra lateral); aqui fica só um respiro
     pequeno pra as colunas não colarem na borda. O topo mantém o respiro
     pro banner/título. */
  padding-left: 0.75rem;
  padding-right: 0.75rem;
}

.abana-coluna {
  background: var(--cor-secao);
  border: 1px solid var(--cor-borda);
  border-radius: var(--raio);
  padding: 0.8rem;
  /* Largura FIXA (issue #55, referência Asana): sem ela a coluna
     esticava pra caber a pílula/título mais compridos e o quadro
     inteiro transbordava na horizontal — o conteúdo é quem quebra
     linha, não a coluna que cresce. */
  width: 300px;
  min-width: 300px;
  flex-shrink: 0;
  cursor: grab;
  /* Âncora da alça de largura (issue #431). */
  position: relative;
}

/* Alça de ajuste de largura (issue #431, Pedido #79): faixa fina na borda
   direita da coluna, invisível até o hover — aí acende uma linha na cor
   de destaque. Sem texto, então a regra de contraste não se aplica; o
   duplo clique (voltar ao padrão) está descrito no title. */
.abana-alca-largura {
  position: absolute;
  top: 0;
  right: -0.45rem;
  width: 0.9rem;
  height: 100%;
  cursor: col-resize;
  z-index: 5;
  /* Sem isso, o navegador rouba o arrasto pra rolagem em tela de toque. */
  touch-action: none;
}

.abana-alca-largura::after {
  content: '';
  position: absolute;
  top: 0.4rem;
  bottom: 0.4rem;
  left: 50%;
  width: 3px;
  margin-left: -1.5px;
  border-radius: 2px;
  background: transparent;
}

.abana-alca-largura:hover::after,
.abana-alca-largura:active::after {
  background: var(--cor-secundaria);
}

.abana-coluna:active {
  cursor: grabbing;
}

.abana-coluna-vazia {
  color: var(--cor-texto-suave);
  font-size: 0.9rem;
}

/* Último item da fileira do quadro — mesmo tamanho de uma coluna, pra
   ficar visualmente na mesma fileira em vez de um formulário separado
   embaixo do quadro. */
.abana-adicionar-secao {
  min-width: 220px;
  flex-shrink: 0;
  align-self: flex-start;
}

button.abana-adicionar-secao {
  background: transparent;
  border: 1px dashed var(--cor-borda);
  border-radius: var(--raio);
  color: var(--cor-texto-suave);
  padding: 0.8rem;
  text-align: left;
  cursor: pointer;
  font-size: 0.9rem;
}

button.abana-adicionar-secao:hover,
button.abana-adicionar-secao:focus {
  background: var(--cor-secao);
  color: var(--cor-texto);
  outline: none;
}

.abana-adicionar-secao-editando input {
  width: 100%;
  box-sizing: border-box;
  padding: 0.75rem;
  border: 1px solid var(--cor-borda);
  border-radius: var(--raio);
  background: var(--cor-secao);
  color: var(--cor-texto);
  font-size: 0.9rem;
}

/* Cartões de tarefa dentro da coluna. */
.abana-lista-tarefas {
  display: flex;
  flex-direction: column;
  gap: 0.5rem;
  margin: 0.6rem 0;
}

/* O cartão empilha linhas (linha principal, rodapé com prazo/subtarefas,
   lista expandida de subtarefas) — a linha principal é .abana-tarefa-linha. */
.abana-tarefa {
  display: flex;
  flex-direction: column;
  gap: 0.3rem;
  background: var(--cor-fundo);
  border: 1px solid var(--cor-borda);
  border-radius: var(--raio);
  padding: 0.5rem 0.6rem;
  cursor: grab;
  /* Issue #26: sem isto, no toque o navegador dispara zoom de duplo
     toque e atrapalha o pressionar-e-segurar que inicia o arraste.
     "manipulation" mantém a rolagem normal e só corta esses atalhos. */
  touch-action: manipulation;
}

/* Issue #506: contorno destacado ao passar o mouse (referência: Trello) —
   só a COR DA BORDA muda; fundo e texto ficam como estão, então nenhum
   par fundo/texto é quebrado. O foco por teclado ganha o mesmo destaque. */
.abana-tarefa:hover,
.abana-tarefa:focus-within {
  border-color: var(--cor-primaria);
}

.abana-tarefa-linha {
  display: flex;
  align-items: center;
  gap: 0.3rem;
}

/* Alinhamento vertical explícito de tudo dentro da linha (check, título,
   selo do responsável, menu ⋮) — Daniel reportou o check desalinhado do
   título; além do align-items do pai, cada filho declara o próprio
   align-self pra nenhum estilo futuro (ou de user-agent) desalinhar de
   novo sem ser de propósito. */
.abana-tarefa-linha > * {
  align-self: center;
  margin-top: 0;
  margin-bottom: 0;
}

/* Rodapé do cartão: prazo à esquerda, indicador de subtarefas à direita
   (como no Asana de referência do Daniel). */
.abana-rodape-tarefa {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 0.4rem;
  min-height: 1.2rem;
}

.abana-prazo-mini {
  display: inline-flex;
  align-items: center;
  gap: 0.25rem;
  background: transparent;
  border: none;
  color: var(--cor-texto-suave);
  font-size: 0.75rem;
  cursor: pointer;
  padding: 0.1rem 0.2rem;
}

.abana-prazo-mini.vazio {
  border: 1px dashed var(--cor-borda);
  border-radius: 50%;
  padding: 0.25rem;
}

.abana-prazo-mini:hover {
  color: var(--cor-texto);
  border-color: var(--cor-texto-suave);
}

/* Destaque de urgência do prazo no cartão (pedido #79/#97, referência
   Asana): atraso em vermelho, vence hoje em âmbar — dá pra escanear a
   coluna e ver as urgências sem ler cada data. Pílula suave (fundo de
   baixa opacidade da própria cor) pra não pesar o cartão; a cor vence o
   cinza padrão inclusive no hover. Só aparece em tarefa não concluída
   (o JS já zera a classe quando concluída). */
.abana-prazo-mini.abana-prazo-atrasado,
.abana-prazo-mini.abana-prazo-atrasado:hover {
  color: var(--cor-erro);
  background: color-mix(in srgb, var(--cor-erro) 14%, transparent);
  border-radius: 10px;
  font-weight: 600;
}

.abana-prazo-mini.abana-prazo-hoje,
.abana-prazo-mini.abana-prazo-hoje:hover {
  color: var(--cor-aviso);
  background: color-mix(in srgb, var(--cor-aviso) 18%, transparent);
  border-radius: 10px;
  font-weight: 600;
}

.abana-chip-comentarios,
.abana-chip-subtarefas {
  display: inline-flex;
  align-items: center;
  gap: 0.25rem;
  background: transparent;
  border: none;
  color: var(--cor-texto-suave);
  font-size: 0.75rem;
  cursor: pointer;
  padding: 0.1rem 0.2rem;
}

.abana-chip-comentarios:hover,
.abana-chip-subtarefas:hover {
  color: var(--cor-texto);
}

.abana-cadeado-mini {
  display: inline-flex;
  color: var(--cor-erro);
  flex-shrink: 0;
}

/* Lista de subtarefas expandida dentro do cartão. */
.abana-subtarefas-expandido {
  display: flex;
  flex-direction: column;
  gap: 0.3rem;
  border-top: 1px solid var(--cor-borda);
  padding-top: 0.4rem;
  cursor: default;
}

.abana-linha-subtarefa {
  display: flex;
  align-items: center;
  gap: 0.4rem;
}

.abana-linha-subtarefa .abana-painel-subtarefa-titulo {
  flex: 1;
}

/* Sugestões de menção (@) nos comentários. */
.abana-mencoes {
  position: relative;
}

.abana-mencoes-sugestoes {
  position: absolute;
  left: 0;
  right: 0;
  top: 100%;
  z-index: 10;
  list-style: none;
  margin: 0.1rem 0 0;
  padding: 0.2rem;
  background: var(--cor-fundo);
  border: 1px solid var(--cor-borda);
  border-radius: var(--raio);
  box-shadow: 0 4px 10px rgba(0, 0, 0, 0.25);
  max-height: 10rem;
  overflow-y: auto;
}

.abana-mencoes-sugestoes button {
  display: block;
  width: 100%;
  text-align: left;
  background: transparent;
  border: none;
  color: var(--cor-texto);
  font-size: 0.9rem;
  padding: 0.35rem 0.5rem;
  border-radius: var(--raio);
  cursor: pointer;
}

.abana-mencoes-sugestoes button:hover,
.abana-mencoes-sugestoes button.ativa {
  background: var(--cor-secao);
}

.abana-tarefa .abana-titulo-tarefa,
.abana-tarefa .abana-titulo-tarefa-texto {
  line-height: 1.2;
}

.abana-tarefa:active {
  cursor: grabbing;
}

.abana-tarefa-completa .abana-titulo-tarefa-texto,
.abana-tarefa-completa .abana-titulo-tarefa {
  text-decoration: line-through;
  color: var(--cor-texto-suave);
}

.abana-titulo-tarefa-texto {
  flex: 1;
  font-size: 0.9rem;
}

.abana-titulo-tarefa {
  flex: 1;
  width: 100%;
  box-sizing: border-box;
  border: 1px solid transparent;
  background: transparent;
  color: var(--cor-texto);
  border-radius: var(--raio);
  padding: 0.3rem 0.4rem;
  font-size: 0.9rem;
  cursor: text;
}

.abana-titulo-tarefa:hover,
.abana-titulo-tarefa:focus {
  border-color: var(--cor-borda);
  background: var(--cor-secao);
  outline: none;
}

/* Fora da edição (readonly), o título é área de "pega" do arraste
   (2026-07-20): a mãozinha avisa que dá pra arrastar dali; o cursor de
   texto volta quando a edição liga (foco). */
.abana-titulo-tarefa[readonly] {
  cursor: grab;
}

/* Pé da coluna com carregamento parcial (issue #54): traz o próximo
   lote de cartões. Discreto como o "+ Adicionar tarefa", mas
   centralizado — é continuação da lista, não criação. */
.abana-mostrar-mais {
  display: block;
  width: 100%;
  background: transparent;
  border: 1px dashed var(--cor-borda);
  border-radius: var(--raio);
  color: var(--cor-texto-suave);
  text-align: center;
  padding: 0.4rem 0.2rem;
  cursor: pointer;
  font-size: 0.8rem;
  margin-top: 0.4rem;
}

.abana-mostrar-mais:hover,
.abana-mostrar-mais:focus {
  color: var(--cor-texto);
  background: var(--cor-secao);
  outline: none;
}

.abana-adicionar-tarefa {
  display: block;
  width: 100%;
  background: transparent;
  border: none;
  color: var(--cor-texto-suave);
  text-align: left;
  padding: 0.4rem 0.2rem;
  cursor: pointer;
  font-size: 0.85rem;
  margin-top: 0.4rem;
}

.abana-adicionar-tarefa:hover,
.abana-adicionar-tarefa:focus {
  color: var(--cor-texto);
  outline: none;
}

.abana-menu-titulo {
  display: block;
  padding: 0.5rem 1rem 0.2rem;
  color: var(--cor-texto-suave);
  font-size: 0.75rem;
  font-weight: 600;
}

/* Só indicador visual agora — a coluna/tarefa inteira é que arrasta (ver
   useSortable em SortableColumn.jsx/TaskCard.jsx), não só esta alcinha. */
.abana-alca-arrastar {
  color: var(--cor-texto-suave);
  font-size: 1rem;
  padding: 0.1rem 0.2rem;
  /* Mãozinha de arrastar (reporte do dono, 2026-08-15): a alça fica
     colada no campo de texto do nome da coluna, e sem cursor próprio ela
     herdava a setinha comum — pior, ao lado do I-beam do campo, a leitura
     era "aqui se edita", não "aqui se arrasta". Todas as alças ⠿ do
     sistema usam o mesmo par grab/grabbing; esta era a única de fora. */
  cursor: grab;
}

.abana-alca-arrastar:active {
  cursor: grabbing;
}

/* Selo do responsável — foto (se tiver) ou iniciais, pequeno e discreto
   de propósito: não deve competir visualmente com o título do cartão. */
.abana-responsavel {
  width: 1.1rem;
  height: 1.1rem;
  min-width: 1.1rem;
  border-radius: 50%;
  flex-shrink: 0;
  object-fit: cover;
}

.abana-responsavel-iniciais {
  background: var(--cor-secao);
  border: 1px solid var(--cor-borda);
  color: var(--cor-texto-suave);
  display: flex;
  align-items: center;
  justify-content: center;
  font-size: 0.55rem;
  font-weight: 600;
  letter-spacing: 0.02em;
}

/* Presença no cabeçalho do quadro (issue #62): avatares de quem mais está
   com o projeto aberto, levemente sobrepostos (estilo Asana). */
.abana-presenca {
  display: inline-flex;
  align-items: center;
  flex-shrink: 0;
}

.abana-presenca-avatar {
  width: 1.5rem;
  height: 1.5rem;
  min-width: 1.5rem;
  font-size: 0.62rem;
  /* Anel na cor do fundo pra separar os avatares sobrepostos, nos dois
     temas (o fundo do cabeçalho é --cor-fundo). */
  box-shadow: 0 0 0 2px var(--cor-fundo);
  margin-left: -0.4rem;
}

.abana-presenca-avatar:first-child {
  margin-left: 0;
}

/* Botão de concluir tarefa. Preenche e ganha uma "pulsada" ao concluir —
   feedback visual imediato e otimista (regra do briefing: não pedir
   confirmação pra conclusão comum, e mostrar o resultado na hora). */
.abana-check-tarefa {
  width: 1.4rem;
  height: 1.4rem;
  min-width: 1.4rem;
  border-radius: 50%;
  border: 2px solid var(--cor-borda);
  background: transparent;
  color: transparent;
  cursor: pointer;
  padding: 0;
  display: flex;
  align-items: center;
  justify-content: center;
  font-size: 0.8rem;
  line-height: 1;
  position: relative;
  transition: background 0.2s ease, border-color 0.2s ease, color 0.2s ease;
}

.abana-check-tarefa:hover {
  border-color: var(--cor-sucesso);
}

.abana-check-tarefa.concluida {
  background: var(--cor-sucesso);
  border-color: var(--cor-sucesso);
  color: #FFFFFF;
  animation: abana-check-pop 0.35s ease;
}

.abana-check-tarefa.concluida::after {
  content: '';
  position: absolute;
  inset: -6px;
  border-radius: 50%;
  border: 2px solid var(--cor-sucesso);
  opacity: 0;
  animation: abana-check-anel 0.5s ease-out;
}

@keyframes abana-check-pop {
  0% { transform: scale(0.6); }
  60% { transform: scale(1.3); }
  100% { transform: scale(1); }
}

@keyframes abana-check-anel {
  0% { opacity: 0.6; transform: scale(0.5); }
  100% { opacity: 0; transform: scale(1.7); }
}

@media (prefers-reduced-motion: reduce) {
  .abana-check-tarefa.concluida,
  .abana-check-tarefa.concluida::after {
    animation: none;
  }
}

/* Botão VERMELHO de falha (pedido do Daniel, 2026-07-24): espelha o check
   de sucesso, trocando verde por vermelho. Declara fundo + borda + cor do
   texto nos dois estados e conta com --cor-erro (definida nos dois temas),
   pra o "✕" nunca sumir no claro. O hover vermelho mora junto do hover
   genérico do check (mais abaixo no arquivo), pra vencer por ordem. */
.abana-check-falha.falha {
  background: var(--cor-erro);
  border-color: var(--cor-erro);
  color: #FFFFFF;
  animation: abana-check-pop 0.35s ease;
}

.abana-check-falha.falha::after {
  content: '';
  position: absolute;
  inset: -6px;
  border-radius: 50%;
  border: 2px solid var(--cor-erro);
  opacity: 0;
  animation: abana-check-anel 0.5s ease-out;
}

@media (prefers-reduced-motion: reduce) {
  .abana-check-falha.falha,
  .abana-check-falha.falha::after {
    animation: none;
  }
}

/* Tarefa fechada como falha: além do risco (herdado de -completa), o
   título ganha o tom de erro pra distinguir de uma conclusão bem-sucedida. */
.abana-tarefa-falha .abana-titulo-tarefa-texto,
.abana-tarefa-falha .abana-titulo-tarefa {
  color: var(--cor-erro);
}

/* Campo de nome da coluna: parece texto normal até ganhar foco/hover —
   é o que fica editável direto, sem precisar de botão de confirmar. */
.abana-nome-coluna {
  font-weight: bold;
  font-size: 1rem;
  width: 100%;
  border: 1px solid transparent;
  background: transparent;
  color: var(--cor-texto);
  border-radius: var(--raio);
  padding: 0.2rem 0.3rem;
  box-sizing: border-box;
  cursor: text;
}

.abana-nome-coluna:hover,
.abana-nome-coluna:focus {
  border-color: var(--cor-borda);
  background: var(--cor-fundo);
  outline: none;
}

.abana-coluna-cabecalho {
  display: flex;
  align-items: center;
  gap: 0.2rem;
}

.abana-coluna-cabecalho .abana-nome-coluna {
  flex: 1;
}

/* Menu de ações da coluna (mover, clonar, excluir) — mesmo padrão
   <details>/<summary> do menu de engrenagem do cabeçalho global
   (.menu-engrenagem), só que com <button> em vez de <a> porque os itens
   disparam ações, não navegação. */
.abana-menu-coluna {
  position: relative;
  flex-shrink: 0;
}

.abana-menu-coluna summary {
  list-style: none;
  cursor: pointer;
  font-size: 1rem;
  line-height: 1;
  padding: 0.2rem 0.5rem;
  border-radius: var(--raio);
  color: var(--cor-texto-suave);
  user-select: none;
}

.abana-menu-coluna summary::-webkit-details-marker {
  display: none;
}

.abana-menu-coluna summary:hover,
.abana-menu-coluna[open] summary {
  background: var(--cor-fundo);
  color: var(--cor-texto);
}

.abana-menu-coluna-itens {
  /* position: fixed, não absolute — renderizado via portal em <body>
     (SortableColumn.jsx), com top/left calculados em JS na abertura, pra
     escapar do "overflow-x: auto" de .abana-quadro (ver comentário lá). */
  position: fixed;
  background: var(--cor-fundo);
  border: 1px solid var(--cor-borda);
  border-radius: var(--raio);
  min-width: 180px;
  box-shadow: 0 4px 12px rgba(0, 0, 0, 0.08);
  overflow: hidden;
  z-index: 10;
  display: flex;
  flex-direction: column;
}

.abana-menu-coluna-itens button,
.abana-menu-coluna-itens a {
  display: block;
  width: 100%;
  text-align: left;
  padding: 0.6rem 1rem;
  background: transparent;
  border: none;
  color: var(--cor-texto);
  text-decoration: none;
  font-size: 0.9rem;
  cursor: pointer;
  box-sizing: border-box;
}

.abana-menu-coluna-itens button:hover:not(:disabled),
.abana-menu-coluna-itens a:hover {
  background: var(--cor-secao);
}

.abana-menu-coluna-itens button:disabled {
  color: var(--cor-texto-suave);
  cursor: not-allowed;
}

/* Item de menu que tira você de algum lugar (issue #236: "Sair do
   projeto"). Separado do resto por uma divisória fina e escrito na cor de
   perigo, pra não se misturar aos links de configuração logo acima — mas
   sem virar botão vermelho: a saída é uma escolha legítima, não um susto.
   Fundo e cor declarados juntos nos dois estados (regra "nunca metade"). */
.abana-menu-coluna-itens .abana-item-menu-perigo {
  border-top: 1px solid var(--cor-borda);
  background: transparent;
  color: var(--cor-perigo, hsl(0, 60%, 50%));
}

.abana-menu-coluna-itens .abana-item-menu-perigo:hover,
.abana-menu-coluna-itens .abana-item-menu-perigo:focus-visible {
  background: var(--cor-secao);
  color: var(--cor-perigo, hsl(0, 60%, 50%));
}

/* Cartão selecionado (painel de detalhes aberto pra ele) — contorno na
   cor de destaque, pra achar fácil qual tarefa está aberta no painel ao
   lado (pedido explícito do Daniel, com print de referência). */
.abana-tarefa-selecionada {
  outline: 2px solid var(--cor-primaria);
  outline-offset: -1px;
}

/* Painel de detalhes da tarefa (título, responsável, projeto, descrição)
   — CENTRALIZADO, estilo Trello (issue #505, substituindo o lateral do
   Asana): mais espaço pra edição, com o quadro escurecido atrás. Fecha
   ao clicar fora, apertar Esc ou no ✕. */
.abana-painel-fundo {
  position: fixed;
  inset: 0;
  background: rgba(0, 0, 0, 0.4);
  display: flex;
  justify-content: center;
  align-items: center;
  z-index: 100;
}

.abana-painel-detalhe {
  background: var(--cor-fundo);
  border: 1px solid var(--cor-borda);
  border-radius: var(--raio);
  box-shadow: 0 4px 24px rgba(0, 0, 0, 0.3);
  width: min(980px, 96vw);
  /* Altura pelo conteúdo: tarefa curta gera janela curta. O PAINEL não
     rola (ajuste do Daniel na issue #505): cabeçalho e título ficam
     fixos e cada COLUNA rola sozinha — ver .abana-painel-coluna-*. */
  max-height: 92vh;
  display: flex;
  flex-direction: column;
  overflow-y: hidden;
  /* O painel é o "recipiente" dos @container abaixo: o empilhar das
     colunas segue a largura DELE (que o usuário arrasta), não a da
     janela. */
  container-type: inline-size;
  padding: 1.25rem 1.5rem;
  box-sizing: border-box;
}

/* Cabeçalho, título e chips NÃO encolhem: sem isto, quando a área das
   colunas disputa a altura do painel, o flex espreme o textarea do
   título e as palavras aparecem cortadas ao meio (reporte do Daniel,
   2026-08-13). Só a área das colunas cede — é ela que rola. */
.abana-painel-detalhe > :not(.abana-painel-colunas) {
  flex-shrink: 0;
  transition: width 0.15s ease;
}

/* Issues #604 e #612 (reportes do Denis): nada no painel fica sem quebra
   de linha — palavra, URL ou citação comprida quebra em vez de estourar
   pro lado.

   A regra é do PAINEL INTEIRO, não só dos filhos diretos. Ela nasceu na
   issue #38 (também do Denis) presa a
   ".abana-painel-detalhe > :not(.abana-painel-colunas)", e a issue #505
   mudou o painel para duas colunas: descrição e comentários passaram a
   morar DENTRO de .abana-painel-colunas, que é exatamente o que aquele
   seletor exclui. O conserto de 2026 deixou de alcançar o texto — e os
   dois reportes voltaram.

   `anywhere` (não `break-word`): `break-word` só parte a palavra depois
   de tentar empurrá-la para a linha seguinte, e uma URL sozinha numa
   linha continua estourando. `anywhere` parte onde precisar. */
.abana-painel-detalhe,
.abana-painel-detalhe * {
  overflow-wrap: anywhere;
}

/* ...com uma exceção: o que rola sozinho de propósito. Um bloco de
   código preserva os espaços e tem barra horizontal própria
   (.abana-descricao-rica pre) — quebrar as linhas dele à força
   desmontaria o alinhamento que é a razão de ele existir. */
.abana-painel-detalhe pre {
  overflow-wrap: normal;
}

/* Item flexível nasce com min-width:auto, que é "não encolha abaixo do
   seu conteúdo" — então um comentário com uma URL comprida empurrava a
   coluna inteira para o lado, mesmo com a quebra ligada acima. O
   min-width:0 é o que autoriza o encolhimento; sem ele a regra de quebra
   nunca chega a valer, porque a caixa cresce em vez de apertar o texto.
   As duas colunas do painel já tinham o seu (issue #505); faltava o
   corpo do comentário, que é o filho flexível de .abana-comentario. */
.abana-comentario-corpo {
  min-width: 0;
}

/* Issue #39 (pedido do Denis): painel expansível, estilo Asana — o
   botão ⤢ do cabeçalho alarga pra quase a tela toda e a escolha fica
   guardada (localStorage). */
.abana-painel-detalhe.expandido {
  width: min(1280px, 92vw);
}

/* Duas colunas do painel (issue #505, referência Trello): a principal
   (descrição e atributos) e a de conversa (comentários + atividade).
   flex-wrap empilha sozinho quando o painel fica estreito — a conversa
   cai pra baixo, que era a ordem antiga. A área das colunas ocupa o que
   sobra do painel (que não rola), e CADA coluna rola sozinha — a barra
   da conversa é dela, não do painel (ajuste do Daniel, 2026-08-13). */
.abana-painel-colunas {
  display: flex;
  /* NOWRAP de propósito: com wrap, a linha flex se dimensiona pelo
     CONTEÚDO e as colunas nunca encolhem pra altura do painel — medido
     ao vivo em 2026-08-13: colunas de 8173px dentro de uma área de
     769px, e nenhuma barra individual aparecia. Sem wrap, min-height: 0
     deixa cada coluna encolher e rolar. O empilhar em painel estreito
     vem do @container logo abaixo. */
  flex-wrap: nowrap;
  gap: 0 1.5rem;
  flex: 1 1 auto;
  min-height: 0;
}

/* Painel estreito (arrastado fino ou tela pequena): as colunas empilham
   e a área delas vira UMA rolagem só — cabeçalho e título continuam
   fixos. Consulta pelo recipiente (o painel), porque a largura dele é
   escolhida pelo usuário, não pela janela. */
@container (max-width: 700px) {
  .abana-painel-colunas {
    display: block;
    overflow-y: auto;
  }

  .abana-painel-coluna-principal,
  .abana-painel-coluna-conversa {
    overflow-y: visible;
    padding-right: 0;
  }

  .abana-painel-coluna-conversa {
    margin-top: 1rem;
  }
}

.abana-painel-coluna-principal {
  flex: 2 1 420px;
  min-width: 0;
  min-height: 0;
  overflow-y: auto;
  /* Respiro entre o texto e a barra de rolagem da própria coluna. */
  padding-right: 0.75rem;
}

/* A coluna de conversa se distingue do papel do painel (ajuste do Daniel
   na issue #505, como o Trello): fundo no tom de seção — FUNDO E TEXTO
   declarados juntos (regra do nunca metade), variáveis que trocam nos
   dois temas. Esticada até o pé do painel, como o trilho do Trello. */
.abana-painel-coluna-conversa {
  flex: 1 1 280px;
  min-width: 0;
  min-height: 0;
  overflow-y: auto;
  background: var(--cor-secao);
  color: var(--cor-texto);
  border: 1px solid var(--cor-borda);
  border-radius: var(--raio);
  padding: 0.4rem 1rem 0.9rem;
  box-sizing: border-box;
}

/* Dentro da coluna principal, as seções empilham mais juntas do que no
   painel antigo de coluna única — era o "espaço gigante inutilizado" do
   reporte: 1.75rem de margem + 1.1rem de padding por seção fechada. */
.abana-painel-coluna-principal .abana-painel-secao {
  margin-top: 0.9rem;
  padding-top: 0.55rem;
}

/* Os quatro atributos principais (Responsável, Prazo, Recorrência,
   Pausa) em grade — duas colunas quando a largura dá, uma quando não —
   pra usar a largura da coluna em vez de deixar um vão à direita. */
.abana-painel-grade-campos {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
  gap: 0.35rem 1.25rem;
  margin-top: 0.9rem;
}

.abana-painel-grade-campos .abana-painel-campo {
  margin-bottom: 0.25rem;
  /* Issue #728: o item de uma grade nasce com `min-width: auto`, ou seja,
     ele não encolhe abaixo do min-content do que carrega. A célula da
     Recorrência carrega o histórico de ciclos, cujas linhas são todas
     `nowrap` — então ela empurrava a coluna para além do painel: barra de
     rolagem horizontal, aviso amarelo cortado no meio da frase e a data
     picada em três linhas. `min-width: 0` devolve à célula o direito de
     encolher, e quem se ajusta é o conteúdo (abaixo). */
  min-width: 0;
}

.abana-painel-grade-campos .abana-painel-campo .abana-painel-rotulo {
  min-width: 88px;
}

/* Feed de atividades da tarefa (issue #505): linhas curtas, "quem fez o
   quê" com o quando embaixo, no tom suave — leitura, não formulário. */
.abana-painel-atividades {
  list-style: none;
  margin: 0;
  padding: 0;
  display: flex;
  flex-direction: column;
  gap: 0.6rem;
  font-size: 0.85rem;
}

.abana-painel-atividades li {
  display: flex;
  flex-direction: column;
  gap: 0.1rem;
}

/* Alça de largura do painel (issue #209, pedido da Ana): faixa fina na
   borda esquerda do painel que se arrasta pra escolher quanto da tela a
   tarefa ocupa. Discreta em repouso, vira uma linha de acento no hover/foco
   — a "linha azul" do Asana que ela citou. */
.abana-painel-alca {
  flex-shrink: 0;
  width: 10px;
  align-self: stretch;
  cursor: col-resize;
  /* Invisível em repouso: a faixa é larga pra ser fácil de agarrar, mas
     nada é desenhado até o mouse chegar (ou o foco pousar). */
  background: transparent;
  touch-action: none;
}

/* A linha fica no MEIO da faixa larga — faixa grossa pra pegar, linha fina
   pra não pesar na tela. */
.abana-painel-alca:hover,
.abana-painel-alca:focus-visible,
body.arrastando-largura .abana-painel-alca {
  background: linear-gradient(
    to right,
    transparent calc(50% - 1.5px),
    var(--cor-primaria-clara) calc(50% - 1.5px),
    var(--cor-primaria-clara) calc(50% + 1.5px),
    transparent calc(50% + 1.5px)
  );
  outline: none;
}

/* Durante o arrasto: sem animação de largura (senão o painel corre atrás do
   ponteiro) e sem seleção de texto acidental na página. */
body.arrastando-largura {
  user-select: none;
  cursor: col-resize;
}

body.arrastando-largura .abana-painel-detalhe {
  transition: none;
}

.abana-painel-cabecalho {
  display: flex;
  align-items: center;
  justify-content: space-between;
  margin-bottom: 1rem;
}

.abana-painel-concluir {
  border: 1px solid var(--cor-borda);
  background: var(--cor-secao);
  color: var(--cor-texto);
  border-radius: var(--raio);
  padding: 0.4rem 0.8rem;
  font-size: 0.85rem;
  cursor: pointer;
}

.abana-painel-concluir.concluida {
  border-color: var(--cor-sucesso);
  color: var(--cor-sucesso);
}

/* Botão de falha no painel (pedido do Daniel, 2026-07-24): mesma roupagem
   neutra do "Marcar como concluída", vermelho quando a falha está ativa. */
.abana-painel-falha.falha {
  border-color: var(--cor-erro);
  color: var(--cor-erro);
}

.abana-painel-fechar {
  background: transparent;
  border: none;
  color: var(--cor-texto-suave);
  font-size: 1.1rem;
  cursor: pointer;
  padding: 0.2rem 0.5rem;
}

.abana-painel-fechar:hover {
  color: var(--cor-texto);
}

h2.abana-painel-titulo {
  margin: 0 0 1rem 0;
}

/* Issue #38: o título editável virou textarea de altura automática pra
   títulos longos quebrarem linha (o input antigo cortava o texto). */
input.abana-painel-titulo,
textarea.abana-painel-titulo {
  display: block;
  width: 100%;
  box-sizing: border-box;
  margin: 0 0 1rem 0;
  border: 1px solid transparent;
  background: transparent;
  color: var(--cor-texto);
  font-size: 1.2rem;
  font-weight: bold;
  padding: 0.3rem 0.4rem;
  border-radius: var(--raio);
  font-family: inherit;
  resize: none;
  overflow: hidden;
  line-height: 1.3;
}

input.abana-painel-titulo:hover,
input.abana-painel-titulo:focus,
textarea.abana-painel-titulo:hover,
textarea.abana-painel-titulo:focus {
  border-color: var(--cor-borda);
  background: var(--cor-secao);
  outline: none;
}

.abana-painel-campo {
  display: flex;
  align-items: center;
  flex-wrap: wrap;
  gap: 0.6rem;
  margin-bottom: 0.6rem;
}

.abana-painel-campo .abana-painel-rotulo {
  margin: 0;
  min-width: 110px;
}

.abana-painel-valor {
  color: var(--cor-texto);
  font-size: 0.9rem;
}

/* Campos "Responsável"/"Projetos" clicáveis (viram seletor ao clicar) —
   mesmo visual do texto normal até passar o mouse, pra dar a dica de que
   é clicável sem parecer um botão comum. */
button.abana-painel-valor-editavel {
  background: transparent;
  border: 1px dashed transparent;
  border-radius: var(--raio);
  padding: 0.15rem 0.4rem;
  cursor: pointer;
  text-align: left;
}

button.abana-painel-valor-editavel:hover,
button.abana-painel-valor-editavel:focus {
  border-color: var(--cor-borda);
  background: var(--cor-secao);
  color: var(--cor-texto);
  outline: none;
}

.abana-painel-mover-projeto {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 0.5rem;
}

.abana-painel-mover-projeto-acoes {
  display: flex;
  gap: 0.4rem;
}

/* Listas do painel: projetos onde a tarefa está (com dropdown de status)
   e lembretes de prazo — mesma anatomia: linha flexível, texto à
   esquerda, controles à direita. */
.abana-painel-projetos,
.abana-painel-lembretes {
  list-style: none;
  margin: 0 0 0.5rem;
  padding: 0;
  display: flex;
  flex-direction: column;
  gap: 0.4rem;
}

.abana-painel-projetos li,
.abana-painel-lembretes li {
  display: flex;
  align-items: center;
  gap: 0.6rem;
  font-size: 0.9rem;
  color: var(--cor-texto);
}

.abana-painel-projetos li .abana-painel-valor {
  flex: 1;
}

.abana-painel-novo-lembrete {
  display: flex;
  align-items: center;
  gap: 0.4rem;
}

.abana-painel-novo-lembrete input[type="number"] {
  width: 5rem;
}

/* Botão "Adicionar lembrete" pequenininho, no mesmo espírito discreto do
   "Remover" das listas do painel (pedido do Daniel, com print). */
.abana-painel-novo-lembrete button {
  background: transparent;
  border: none;
  color: var(--cor-texto-suave);
  cursor: pointer;
  font-size: 0.8rem;
  padding: 0.2rem 0.3rem;
}

.abana-painel-novo-lembrete button:hover {
  color: var(--cor-texto);
}

/* Link discreto no cabeçalho do quadro (ex.: "Ver em lista" no quadro
   pessoal) — mesmo peso visual do "Configurações" do quadro de projeto. */
/* Link discreto — usado tanto em <a> quanto em <button>. AUTOSSUFICIENTE
   de propósito (fundo, borda e cor declarados nos dois estados): botão
   que herda metade da regra global de botão (fundo azul) vira texto
   invisível no modo claro — diretriz do CLAUDE.md. */
.abana-link-discreto {
  background: transparent;
  border: none;
  padding: 0.15rem 0.3rem;
  color: var(--cor-texto-suave);
  font-size: 0.85rem;
  text-decoration: none;
  cursor: pointer;
}

.abana-link-discreto:hover,
.abana-link-discreto:focus-visible {
  background: transparent;
  border: none;
  color: var(--cor-texto);
  text-decoration: underline;
}

/* Selo de tarefa bloqueada por dependência — no cartão do quadro e no
   topo do painel de detalhes. */
.abana-chip-bloqueada {
  color: var(--cor-erro);
  border: 1px solid var(--cor-erro);
  border-radius: var(--raio);
  padding: 0.1rem 0.4rem;
  font-size: 0.75rem;
  white-space: nowrap;
}

p.abana-chip-bloqueada {
  display: inline-block;
  white-space: normal;
  margin: 0 0 0.8rem;
}

/* Aviso de edição travada por campo obrigatório (issue #91): bloqueante
   como o de dependência (borda/texto em erro), mas com um fundo suave pra
   se destacar como o MOTIVO de a edição não pegar. Legível nos dois
   temas — a cor do texto e da borda saem da mesma variável. */
p.abana-chip-travada {
  display: block;
  color: var(--cor-erro);
  border: 1px solid var(--cor-erro);
  background: color-mix(in srgb, var(--cor-erro) 12%, transparent);
  border-radius: var(--raio);
  padding: 0.4rem 0.6rem;
  font-size: 0.8rem;
  margin: 0 0 0.8rem;
}

/* Selo/ícone de tarefa pausada (2026-07-20): discreto no cartão (só o
   ícone) e aviso no topo do painel — tom neutro, não é erro. */
.abana-pause-mini {
  display: inline-flex;
  color: var(--cor-texto-suave);
  flex-shrink: 0;
}

/* --- Dica: o balão de explicação do ⓘ (issue #661) -----------------------
   Pedido do dono em 2026-08-31: as explicações que ficavam para sempre na
   tela do CLM passam a viver aqui, atrás de um ⓘ discreto ao lado do
   título ou do rótulo.

   Quem ABRE o balão é este CSS, por :hover e :focus-within — sem depender
   de JavaScript. O core/js/dica.js só acrescenta o Esc, o toque no celular
   e a ligação com o leitor de tela.

   O balão é interface FLUTUANTE: pela diretriz do CLAUDE.md ele declara as
   próprias cores (fundo, borda e texto) em vez de herdar as da região que
   cobre, e usa variáveis de tema — então lê igual no claro e no escuro. */
.dica {
  position: relative;
  display: inline-flex;
  vertical-align: middle;
  /* Não estica dentro de um flex/grid: o ⓘ tem o tamanho do ⓘ. */
  flex: 0 0 auto;
  margin-left: 0.35rem;
}

/* O gatilho declara fundo, borda E cor nos dois estados (regra "nunca
   metade" do CLAUDE.md): sem isso ele herdaria metade da regra global de
   <button> — fundo azul e texto branco — e viraria um botão gordo no meio
   de um título. */
.dica-gatilho {
  appearance: none;
  -webkit-appearance: none;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  box-sizing: border-box;
  width: 1.15em;
  height: 1.15em;
  min-width: 0;
  padding: 0;
  margin: 0;
  border: 1px solid var(--cor-borda-campo);
  border-radius: 50%;
  background: transparent;
  color: var(--cor-texto-suave);
  font-family: inherit;
  font-size: 0.78rem;
  font-weight: 700;
  font-style: italic;
  line-height: 1;
  cursor: help;
}

.dica-gatilho:hover,
.dica-gatilho:focus-visible {
  background: transparent;
  border-color: var(--cor-texto);
  color: var(--cor-texto);
}

.dica-balao {
  position: absolute;
  top: calc(100% + 0.45rem);
  left: 50%;
  /* Centralizado no ⓘ, mais o desvio que o script põe quando o balão não
     cabe (issue #665). O desvio nasce em zero: sem JavaScript o balão
     continua centralizado, como era. */
  transform: translateX(calc(-50% + var(--dica-desvio, 0px)));
  z-index: 60;
  box-sizing: border-box;
  width: max-content;
  /* --dica-largura-max é a largura da caixa onde o balão tem de caber, e
     também vem do script. Sem ele, só os dois tetos de sempre. */
  max-width: min(24rem, 78vw, var(--dica-largura-max, 100vw));
  padding: 0.6rem 0.75rem;
  border: 1px solid var(--cor-borda);
  border-radius: var(--raio, 6px);
  background: var(--cor-secao);
  color: var(--cor-texto);
  box-shadow: 0 6px 18px rgba(0, 0, 0, 0.18);
  /* Declarados um a um porque o ⓘ mora dentro de <h2> e de <label>, e
     herdaria o tamanho, o peso e o alinhamento deles. */
  font-size: 0.85rem;
  font-weight: 400;
  font-style: normal;
  line-height: 1.55;
  text-align: left;
  text-transform: none;
  letter-spacing: normal;
  white-space: normal;
  visibility: hidden;
  opacity: 0;
  pointer-events: none;
  transition: opacity 0.12s ease;
}

/* Ponte invisível sobre a folga entre o ⓘ e o balão: sem ela o ponteiro
   "cai" no caminho e o balão fecha antes de dar para ler — ou para clicar
   num link de dentro dele. */
.dica-balao::before {
  content: '';
  position: absolute;
  top: -0.5rem;
  left: 0;
  right: 0;
  height: 0.5rem;
}

.dica:hover > .dica-balao,
.dica:focus-within > .dica-balao {
  visibility: visible;
  opacity: 1;
  pointer-events: auto;
}

/* Abre para CIMA quando não cabe embaixo — o script decide e põe a classe
   (issue #665). A ponte invisível troca de lado junto, senão o ponteiro
   volta a cair na folga no caminho do ⓘ para o balão. */
.dica.dica-acima > .dica-balao {
  top: auto;
  bottom: calc(100% + 0.45rem);
}

.dica.dica-acima > .dica-balao::before {
  top: auto;
  bottom: -0.5rem;
}

/* Link dentro do balão (a dica de Carteiras aponta para Permissões do CLM):
   declara a própria cor nos dois estados, como todo o resto do balão. */
.dica-balao a {
  color: var(--cor-secundaria);
  text-decoration: underline;
}

.dica-balao a:hover,
.dica-balao a:focus-visible {
  color: var(--cor-secundaria);
  text-decoration: none;
}

/* Rótulo de campo + ⓘ na MESMA linha. Na tela de contrato o <label> é
   `display: block`, então o ⓘ solto depois dele cairia numa linha própria,
   entre o rótulo e o campo. */
.clm-rotulo-linha {
  display: flex;
  align-items: center;
  margin-bottom: 0.3rem;
}

.clm-form .clm-rotulo-linha label {
  margin-bottom: 0;
}

/* Development-environment strip (issue #13): loud on purpose, present
   on every page of the dev instance only. */
.faixa-ambiente-dev {
  background: var(--cor-erro);
  color: #FFFFFF;
  text-align: center;
  font-size: 0.8rem;
  font-weight: 600;
  padding: 0.25rem 0.5rem;
}

/* Pedidos (issue #18): lista com saldo de votos à esquerda, pílula de
   status à direita; votos ▲/▼ com estado ativo declarando fundo, borda
   E cor nos dois temas (regra do CLAUDE.md). */
.pedidos-barra {
  display: flex;
  align-items: center;
  gap: 0.75rem;
  margin: 1.25rem 0;
}

/* Botão de novo pedido: declara fundo, borda E cor nos dois estados e
   nos dois temas (regra do CLAUDE.md contra herdar metade do estilo). */
.pedido-botao-novo {
  display: inline-block;
  background: var(--cor-secundaria);
  border: 1px solid var(--cor-secundaria);
  color: #FFFFFF;
  border-radius: var(--raio);
  padding: 0.45rem 1rem;
  text-decoration: none;
  font-weight: 600;
}

.pedido-botao-novo:hover,
.pedido-botao-novo:focus-visible {
  background: var(--cor-secundaria);
  border-color: var(--cor-secundaria);
  color: #FFFFFF;
  filter: brightness(1.1);
}

.pedidos-filtros {
  display: flex;
  gap: 0.5rem;
  margin-left: auto;
}

.pedidos-filtros select {
  min-width: 9rem;
}

/* Campo de busca de pedidos (#104) alinhado aos seletores de filtro. */
.pedidos-filtros input[type="search"] {
  min-width: 12rem;
  padding: 0.3rem 0.6rem;
  border: 1px solid var(--cor-borda-campo);
  border-radius: var(--raio);
  font-size: 0.9rem;
}

.pedidos-lista {
  display: flex;
  flex-direction: column;
  gap: 0.6rem;
}

.pedido-linha {
  display: flex;
  align-items: center;
  gap: 1.1rem;
}

.pedido-linha:hover {
  border-color: var(--cor-secundaria);
}

/* Bloco de votos à esquerda, estilo placar — número grande, rótulo
   pequeno embaixo. */
.pedido-votos-bloco {
  display: flex;
  flex-direction: column;
  align-items: center;
  padding: 0.3rem 0.4rem;
  border: 1px solid var(--cor-borda);
  border-radius: var(--raio);
  background: var(--cor-secao);
  flex-shrink: 0;
}

/* Issue #227: o bloco deixou de ser um placar de saldo e virou dois
   contadores (👍 e 👎), então some a folga que existia pro número
   grande — quem manda na largura agora são os próprios botões. */

.pedido-corpo {
  display: flex;
  flex-direction: column;
  gap: 0.3rem;
  min-width: 0;
  flex: 1;
}

.pedido-titulo {
  font-weight: 600;
  font-size: 1.02rem;
  color: var(--cor-texto);
  text-decoration: none;
}

.pedido-titulo:hover {
  color: var(--cor-secundaria);
  text-decoration: underline;
}

/* Número do pedido (issue #75): identificador único e discreto, no
   mesmo espírito do "#123" das issues do GitHub — só que este é o número
   do próprio pedido no SabedorIA. */
.pedido-numero {
  font-weight: 600;
  color: var(--cor-texto-suave);
}

.pedido-meta {
  font-size: 0.8rem;
  color: var(--cor-texto-suave);
  display: flex;
  align-items: center;
  gap: 0.35rem;
  flex-wrap: wrap;
}

.pedido-tipo-ideia { color: var(--cor-secundaria); border-color: var(--cor-secundaria); }
.pedido-tipo-problema { color: var(--cor-erro); border-color: var(--cor-erro); }

.pedido-pill {
  flex-shrink: 0;
  border-radius: 999px;
  padding: 0.1rem 0.6rem;
  font-size: 0.75rem;
  border: 1px solid var(--cor-borda);
  color: var(--cor-texto-suave);
  background: var(--cor-secao);
}

/* Só a pílula de STATUS da linha (última filha direta) cola à direita. */
.pedido-linha > .pedido-pill {
  margin-left: auto;
}

/* Issue #368: pílula da parte do sistema. Fundo e cor declarados juntos
   (regra "nunca metade"), com a borda de acento pra não se confundir com
   a pílula de tipo, que fica ao lado. */
.pedido-modulo {
  background: var(--cor-secao);
  color: var(--cor-texto);
  border-color: var(--cor-secundaria);
}

.pedido-concluido { color: var(--cor-sucesso); border-color: var(--cor-sucesso); }
.pedido-recusado { color: var(--cor-erro); border-color: var(--cor-erro); }
.pedido-github { margin-left: 0.3rem; }

.pedido-acoes {
  display: flex;
  align-items: center;
  gap: 1rem;
  margin-top: 1rem;
}

.pedido-votar {
  display: flex;
  align-items: center;
  gap: 0.4rem;
}

/* Clone do cartão em arraste (issue #57): desenhado pelo DragOverlay,
   fora dos contêineres roláveis — nunca cortado, sempre sob o cursor. */
.abana-tarefa-em-arraste {
  cursor: grabbing;
  box-shadow: 0 6px 18px rgba(0, 0, 0, 0.35);
  font-size: 0.9rem;
}

/* Convidados de cartão (issue #48): lista discreta + busca de convite.
   Cores sempre por variáveis — vale nos dois temas. */
.abana-painel-lista {
  list-style: none;
  margin: 0;
  padding: 0;
  display: flex;
  flex-direction: column;
  gap: 0.35rem;
}

.abana-convidado-linha {
  display: flex;
  align-items: center;
  gap: 0.5rem;
}

.abana-pill-suave {
  background: var(--cor-secao);
  border: 1px solid var(--cor-borda);
  color: var(--cor-texto-suave);
  border-radius: 999px;
  padding: 0.05rem 0.6rem;
  font-size: 0.78rem;
}

.abana-convidar {
  margin-top: 0.5rem;
  display: flex;
  flex-direction: column;
  gap: 0.4rem;
}

.abana-convidar-sugestoes button {
  background: none;
  border: none;
  color: var(--cor-texto);
  cursor: pointer;
  padding: 0.25rem 0.3rem;
  border-radius: var(--raio);
  text-align: left;
  width: 100%;
}

.abana-convidar-sugestoes button:hover,
.abana-convidar-sugestoes button:focus-visible {
  background: var(--cor-secao);
  color: var(--cor-texto);
}

.abana-convidar-papel {
  display: flex;
  align-items: center;
  gap: 0.5rem;
  flex-wrap: wrap;
}

/* Setas de voto na LISTA de pedidos (issue #36) — mesmos botões da
   página do pedido, empilhados verticalmente no bloco de votos. */
.pedido-voto-form {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 0.15rem;
}

/* Issue #227: cada botão carrega o emoji e a contagem daquele lado.
   Flex pra emoji e número ficarem na mesma linha de base. */
.pedido-voto {
  display: inline-flex;
  align-items: center;
  gap: 0.35rem;
  background: var(--cor-secao);
  border: 1px solid var(--cor-borda);
  color: var(--cor-texto-suave);
  border-radius: var(--raio);
  padding: 0.2rem 0.55rem;
  cursor: pointer;
  min-width: 3.4rem;
  justify-content: center;
}

/* O emoji não herda cor de texto (é colorido por natureza) — quem muda
   de cor nos estados é a CONTAGEM, e ela vem sempre junto do fundo na
   mesma regra (diretriz "nunca metade" do CLAUDE.md). */
.pedido-voto-emoji {
  font-size: 0.95rem;
  line-height: 1;
}

.pedido-voto-contagem {
  font-weight: 600;
  font-size: 0.9rem;
  font-variant-numeric: tabular-nums;
}

.pedido-voto:hover,
.pedido-voto:focus-visible {
  background: var(--cor-secao);
  border-color: var(--cor-secundaria);
  color: var(--cor-texto);
}

.pedido-voto.ativo {
  background: var(--cor-secundaria);
  border-color: var(--cor-secundaria);
  color: #FFFFFF;
}

.pedido-voto.ativo:hover,
.pedido-voto.ativo:focus-visible {
  background: var(--cor-secundaria);
  border-color: var(--cor-secundaria);
  color: #FFFFFF;
}

/* Seta a favor desabilitada no próprio pedido (issue #53) — visível,
   mas apagada e com o porquê no title (diretriz: ação primária nunca
   some, se desabilita explicando). */
.pedido-voto:disabled {
  opacity: 0.45;
  cursor: default;
}

.pedido-voto:disabled:hover {
  background: var(--cor-secao);
  border-color: var(--cor-borda);
  color: var(--cor-texto-suave);
}

/* Issue #227: o saldo virou informação de apoio — quem responde "quanta
   gente votou" agora são os dois contadores. Fica apagado e pequeno, no
   padrão rótulo-apagado do CLAUDE.md. */
.pedido-saldo {
  font-size: 0.8rem;
  color: var(--cor-texto-suave);
  white-space: nowrap;
}

.pedido-anexo-linha {
  display: flex;
  align-items: center;
  gap: 0.6rem;
  padding: 0.35rem 0;
  border-bottom: 1px solid var(--cor-borda);
}

.pedido-anexo-linha:last-of-type {
  border-bottom: none;
}

.pedido-remover-anexo {
  margin-left: auto;
}

.pedido-anexar {
  display: flex;
  align-items: center;
  gap: 0.6rem;
  margin-top: 0.9rem;
}

.pedido-comentario {
  border-bottom: 1px solid var(--cor-borda);
  padding: 0.6rem 0;
}

.pedido-comentario:last-of-type {
  border-bottom: none;
}

.pedido-comentar textarea {
  display: block;
  width: 100%;
  box-sizing: border-box;
  margin: 0.75rem 0 0.5rem;
}

/* Edição inline da descrição (issue #107): o lápis nasce discreto e o
   hover no bloco o revela (padrão .abana-icone-acao). Edição/resposta não
   são ações destrutivas, então o hover NÃO fica vermelho como o ✕. */
.pedido-descricao-bloco {
  position: relative;
}

.pedido-descricao-bloco:hover .abana-icone-acao,
.pedido-comentario:hover .abana-icone-acao {
  opacity: 1;
}

.pedido-editar-descricao:hover,
.pedido-responder:hover {
  color: var(--cor-primaria);
}

.pedido-editar-descricao-form textarea {
  display: block;
  width: 100%;
  box-sizing: border-box;
}

.pedido-editar-dica {
  margin: 0.25rem 0 0;
}

.pedido-editado {
  margin-top: 0.35rem;
}

.pedido-comentario-cabecalho {
  display: flex;
  align-items: center;
  gap: 0.6rem;
}

.pedido-comentario-autor {
  min-width: 0;
}

.pedido-responder {
  margin-left: auto;
}

/* Seletor de menção (@) do campo de comentário (issue #108): janelinha
   ancorada ao campo, estilo popover do sistema (lista curta, cor suave). */
.pedido-comentar-campo {
  position: relative;
}

.pedido-mencao-lista {
  position: absolute;
  left: 0;
  right: 0;
  top: 100%;
  margin: 0.2rem 0 0;
  padding: 0.25rem;
  list-style: none;
  z-index: 20;
  max-height: 14rem;
  overflow-y: auto;
  background: var(--cor-fundo);
  border: 1px solid var(--cor-borda);
  border-radius: 0.5rem;
  box-shadow: 0 6px 20px rgba(0, 0, 0, 0.12);
}

.pedido-mencao-lista li {
  padding: 0.4rem 0.6rem;
  border-radius: 0.35rem;
  cursor: pointer;
}

.pedido-mencao-lista li.ativo,
.pedido-mencao-lista li:hover {
  background: var(--cor-secao);
}

.pedido-form label {
  display: block;
  margin-bottom: 0.25rem;
}

.pedido-form input[type="text"],
.pedido-form textarea,
.pedido-form select {
  width: 100%;
  max-width: 40rem;
  box-sizing: border-box;
}

/* Tokens de API (issue #6): valor do token recém-criado em destaque
   copiável; lista de tokens com linhas finas e revogação discreta no
   hover (padrão de ações destrutivas do CLAUDE.md). */
.token-valor {
  display: block;
  padding: 0.6rem 0.8rem;
  background: var(--cor-secao);
  border: 1px solid var(--cor-borda);
  border-radius: var(--raio);
  word-break: break-all;
  user-select: all;
}

.lista-de-tokens {
  list-style: none;
  margin: 0;
  padding: 0;
}

.lista-de-tokens li {
  display: flex;
  align-items: center;
  gap: 0.75rem;
  padding: 0.5rem 0;
  border-bottom: 1px solid var(--cor-borda);
}

.lista-de-tokens li:last-child {
  border-bottom: none;
}

.lista-de-tokens .token-nome {
  font-weight: 600;
}

.lista-de-tokens .form-revogar {
  margin-left: auto;
}

.token-vencido {
  color: var(--cor-erro);
}

/* Pílula de escopo do token (epic #193): informação categórica vira
   pílula, tokens do tema pra valer nos dois modos. */
.token-escopo {
  font-size: 0.72rem;
  padding: 0.1rem 0.55rem;
  border-radius: 999px;
  background: var(--cor-secao);
  border: 1px solid var(--cor-borda);
  color: var(--cor-texto-suave);
  white-space: nowrap;
}

.form-criar-token label {
  display: inline-block;
  min-width: 5.5rem;
}

/* Barra de progresso das subtarefas no cartão (issue #3, 2026-07-20):
   contagem à esquerda, trilho no meio, porcentagem à direita — layout do
   print do GitHub. Tokens do tema nos dois modos: trilho sutil sobre
   --cor-secao com borda fina, preenchimento no azul de destaque
   (--cor-secundaria: #5B9BE0 no escuro, #1E73BE no claro) e verde de
   sucesso quando chega em 100%. */
.abana-progresso-subtarefas {
  display: flex;
  align-items: center;
  gap: 0.5rem;
  font-size: 0.75rem;
  color: var(--cor-texto-suave);
  cursor: default;
}

.abana-progresso-contagem,
.abana-progresso-porcentagem {
  font-variant-numeric: tabular-nums;
  flex-shrink: 0;
}

.abana-progresso-trilho {
  flex: 1;
  height: 6px;
  border-radius: 3px;
  background: var(--cor-secao);
  border: 1px solid var(--cor-borda);
  overflow: hidden;
}

.abana-progresso-preenchimento {
  display: block;
  height: 100%;
  background: var(--cor-secundaria);
  border-radius: 3px;
  transition: width 0.25s ease;
}

.abana-progresso-preenchimento.completo {
  background: var(--cor-sucesso);
}

/* Símbolo de dependência (2026-07-20): neutro quando as dependências já
   foram concluídas — o estado bloqueado usa o cadeado vermelho de
   sempre (.abana-cadeado-mini). */
.abana-dep-mini {
  display: inline-flex;
  color: var(--cor-texto-suave);
  flex-shrink: 0;
}

/* Selo de recorrência no cartão (issue #426): o infinito. Discreto como os
   outros selos — cor de texto suave, que já troca com o tema sozinha. */
.abana-recorrencia-mini {
  display: inline-flex;
  color: var(--cor-texto-suave);
  flex-shrink: 0;
}

/* Último ciclo virou sem conclusão: o mesmo recado que o painel dá por
   escrito, aqui em cor. `--cor-erro` é definida nos dois temas. */
.abana-recorrencia-mini.atrasado {
  color: var(--cor-erro);
}

p.abana-chip-pausada {
  display: inline-block;
  color: var(--cor-texto-suave);
  border: 1px solid var(--cor-borda);
  border-radius: var(--raio);
  padding: 0.1rem 0.4rem;
  font-size: 0.75rem;
  margin: 0 0 0.8rem;
}

/* Cabeçalho das seções colapsáveis do painel (2026-07-20): botão que
   parece o rótulo de sempre, com a setinha na frente. Declara fundo,
   borda E cor nos dois estados — regra do CLAUDE.md contra herdar metade
   do estilo global de botão (fundo azul + texto invisível). */
.abana-secao-cabecalho {
  display: flex;
  align-items: center;
  gap: 0.4rem;
  width: 100%;
  background: transparent;
  border: none;
  padding: 0;
  color: var(--cor-texto-suave);
  cursor: pointer;
  text-align: left;
}

.abana-secao-cabecalho:hover,
.abana-secao-cabecalho:focus-visible {
  background: transparent;
  border: none;
  color: var(--cor-texto);
}

.abana-secao-cabecalho:hover .abana-painel-rotulo,
.abana-secao-cabecalho:focus-visible .abana-painel-rotulo {
  color: var(--cor-texto);
}

.abana-secao-cabecalho .abana-painel-rotulo {
  margin: 0;
}

.abana-secao-seta {
  font-size: 0.7rem;
  color: var(--cor-texto-suave);
  width: 0.8rem;
}

.abana-secao-contagem {
  font-size: 0.75rem;
  color: var(--cor-texto-suave);
  border: 1px solid var(--cor-borda);
  border-radius: 999px;
  padding: 0 0.4rem;
  line-height: 1.3;
}

.abana-secao-corpo,
.abana-secao-colapsavel .abana-secao-corpo {
  margin-top: 0.6rem;
}

/* Config de pausa dentro do painel: linhas empilhadas com respiro. */
.abana-painel-config-pausa {
  display: flex;
  flex-direction: column;
  gap: 0.5rem;
}

.abana-pausa-opcao {
  display: flex;
  align-items: center;
  gap: 0.4rem;
  cursor: pointer;
}

/* Lista de subtarefas do painel — check pequeno + título clicável (abre
   o painel da subtarefa). */
.abana-painel-subtarefas {
  list-style: none;
  margin: 0 0 0.5rem;
  padding: 0;
  display: flex;
  flex-direction: column;
  gap: 0.4rem;
}

.abana-painel-subtarefas li {
  display: flex;
  align-items: center;
  gap: 0.5rem;
}

/* Issue #240: nome, responsável e prazo resolvidos na própria linha.
   Os controles seguem o padrão de ação de linha do sistema — apagados até
   o hover ou o foco, nunca escondidos do teclado. O que já TEM valor
   (um nome, uma data) fica sempre legível: apagar um dado que existe
   seria esconder informação, não enxugar a tela. */
.abana-subtarefa-acao {
  flex-shrink: 0;
  background: transparent;
  border: 1px solid transparent;
  border-radius: var(--raio);
  color: var(--cor-texto-suave);
  font-size: 0.78rem;
  padding: 0.05rem 0.35rem;
  cursor: pointer;
  opacity: 0.4;
  max-width: 9rem;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.abana-painel-subtarefas li:hover .abana-subtarefa-acao,
.abana-subtarefa-acao:focus-visible {
  opacity: 1;
}

/* Fundo e cor sempre declarados juntos (regra "nunca metade"). */
.abana-subtarefa-acao:hover,
.abana-subtarefa-acao:focus-visible {
  background: var(--cor-secao);
  border-color: var(--cor-borda);
  color: var(--cor-texto);
  opacity: 1;
}

/* Campo de renomear inline: parece o texto até receber foco. */
.abana-subtarefa-titulo-editavel {
  flex: 1;
  min-width: 0;
  font: inherit;
  padding: 0.1rem 0.3rem;
  border: 1px solid var(--cor-secundaria);
  border-radius: var(--raio);
  background: var(--cor-campo);
  color: var(--cor-texto);
}

/* Pega de arraste da subtarefa (issue #78): discreta, só ganha cor no
   hover da linha ou no foco; o cursor indica que dá pra mover. */
.abana-arrastar-subtarefa {
  flex-shrink: 0;
  background: transparent;
  border: none;
  color: var(--cor-texto-suave);
  cursor: grab;
  opacity: 0.35;
  padding: 0 0.15rem;
  font-size: 1rem;
  line-height: 1;
  touch-action: none;
}
.abana-painel-subtarefas li:hover .abana-arrastar-subtarefa,
.abana-arrastar-subtarefa:focus-visible {
  opacity: 1;
}
.abana-arrastar-subtarefa:active {
  cursor: grabbing;
}

/* Asterisco de campo obrigatório (issue #91). */
.abana-campo-obrigatorio {
  color: var(--cor-erro);
  font-weight: 700;
}

/* Issue #38: o título ocupa o espaço da linha e QUEBRA — sem ele as
   linhas flex não encolhiam (min-width automático) e o texto sumia. */
.abana-painel-subtarefas li .abana-painel-subtarefa-titulo {
  flex: 1;
  min-width: 0;
}

.abana-painel-subtarefa-titulo {
  background: transparent;
  border: none;
  color: var(--cor-texto);
  font-size: 0.9rem;
  text-align: left;
  cursor: pointer;
  padding: 0.1rem 0.2rem;
  white-space: normal;
  overflow-wrap: anywhere;
}

.abana-painel-subtarefa-titulo:hover {
  text-decoration: underline;
}

.abana-painel-subtarefa-titulo.concluida {
  text-decoration: line-through;
  color: var(--cor-texto-suave);
}

.abana-painel-nova-subtarefa {
  display: flex;
  align-items: center;
  gap: 0.4rem;
}

.abana-painel-nova-subtarefa input {
  flex: 1;
}

.abana-painel-info {
  color: var(--cor-texto-suave);
  font-size: 0.8rem;
}

.abana-painel-secao {
  margin-top: 1.75rem;
  padding-top: 1.1rem;
  border-top: 1px solid var(--cor-borda);
}

.abana-painel-rotulo {
  display: block;
  margin: 0 0 0.3rem;
  color: var(--cor-texto-suave);
  font-size: 0.8rem;
  font-weight: 600;
}

.abana-painel-descricao {
  display: block;
  width: 100%;
  box-sizing: border-box;
  resize: vertical;
  border: 1px solid transparent;
  background: transparent;
  color: var(--cor-texto);
  border-radius: var(--raio);
  padding: 0.5rem 0.6rem;
  /* Sem margem negativa EMBAIXO (issue #50): a caixa pintada no
     hover/foco (ou redimensionada) cobria a linha seguinte. */
  margin: -0.5rem -0.6rem 0;
  font-family: inherit;
  font-size: 0.9rem;
}

.abana-painel-descricao:hover,
.abana-painel-descricao:focus {
  border-color: var(--cor-borda);
  background: var(--cor-secao);
  outline: none;
}

.abana-painel-descricao-texto {
  white-space: pre-wrap;
  color: var(--cor-texto);
  font-size: 0.9rem;
}

/* ——— Editor de descrição (issue #44, TipTap) ————————————————————
   Mesmo espírito de edição inline do resto do painel: parece texto até
   ganhar foco; a barra de formatação é discreta. As cores vêm SEMPRE
   das variáveis do tema — conferido no claro e no escuro. */
.abana-editor-descricao {
  position: relative;
}

.abana-editor-barra {
  display: flex;
  align-items: center;
  flex-wrap: wrap;
  gap: 0.15rem;
  margin-bottom: 0.3rem;
  /* Âncora dos popovers da barra (ajuda "?" e link): posicionados em
     relação à BARRA, não ao botão — senão, quando a barra quebra linha
     num painel estreito, o balão alinhado ao botão estoura pra fora da
     tela (reporte do Daniel, 2026-07-23). */
  position: relative;
}

.abana-editor-botao {
  background: transparent;
  border: 1px solid transparent;
  border-radius: var(--raio);
  color: var(--cor-texto-suave);
  font-size: 0.85rem;
  min-width: 1.7rem;
  padding: 0.2rem 0.35rem;
  cursor: pointer;
  line-height: 1.2;
}

.abana-editor-botao:hover,
.abana-editor-botao:focus {
  border-color: var(--cor-borda);
  background: var(--cor-secao);
  color: var(--cor-texto);
  outline: none;
}

.abana-editor-botao.ativo {
  background: var(--cor-secao);
  border-color: var(--cor-borda);
  color: var(--cor-texto);
}

.abana-editor-separador {
  width: 1px;
  align-self: stretch;
  margin: 0.15rem 0.25rem;
  background: var(--cor-borda);
}

/* Balão de ajuda com os atalhos (issue #34): o span âncora fica ESTÁTICO
   de propósito — o balão absoluto resolve contra a barra (position:
   relative acima) e nunca escapa da largura do editor. */
.abana-editor-ajuda-ancora {
  display: inline-flex;
}

.abana-editor-ajuda {
  position: absolute;
  top: calc(100% + 0.25rem);
  right: 0;
  z-index: 30;
  min-width: 15rem;
  max-width: 100%;
  padding: 0.6rem 0.75rem;
  background: var(--cor-fundo);
  border: 1px solid var(--cor-borda);
  border-radius: var(--raio);
  box-shadow: 0 6px 20px rgba(0, 0, 0, 0.25);
}

.abana-editor-ajuda-titulo {
  margin: 0 0 0.4rem;
  font-size: 0.8rem;
  font-weight: 600;
  color: var(--cor-texto);
}

.abana-editor-ajuda dl {
  margin: 0;
  display: grid;
  grid-template-columns: auto 1fr;
  gap: 0.25rem 0.6rem;
}

.abana-editor-ajuda dl > div {
  display: contents;
}

.abana-editor-ajuda dt {
  margin: 0;
}

.abana-editor-ajuda dd {
  margin: 0;
  font-size: 0.8rem;
  color: var(--cor-texto-suave);
  align-self: center;
}

.abana-editor-ajuda kbd {
  display: inline-block;
  padding: 0.05rem 0.35rem;
  font-family: inherit;
  font-size: 0.72rem;
  color: var(--cor-texto);
  background: var(--cor-secao);
  border: 1px solid var(--cor-borda);
  border-radius: 4px;
  white-space: nowrap;
}

/* Janelinha de link (issue #34): mesma regra do balão de ajuda — âncora
   estática, popover posicionado contra a barra pra não escapar da tela. */
.abana-editor-link-ancora {
  display: inline-flex;
}

.abana-editor-link {
  position: absolute;
  top: calc(100% + 0.25rem);
  left: 0;
  z-index: 30;
  width: 17rem;
  max-width: 100%;
  padding: 0.5rem;
  display: flex;
  flex-direction: column;
  gap: 0.4rem;
  background: var(--cor-fundo);
  border: 1px solid var(--cor-borda);
  border-radius: var(--raio);
  box-shadow: 0 6px 20px rgba(0, 0, 0, 0.25);
}

.abana-editor-link-campo {
  width: 100%;
  padding: 0.35rem 0.5rem;
  font-size: 0.85rem;
  color: var(--cor-texto);
  background: var(--cor-fundo);
  border: 1px solid var(--cor-borda);
  border-radius: var(--raio);
}

.abana-editor-link-campo:focus {
  outline: 2px solid var(--cor-secundaria);
  outline-offset: 0;
}

.abana-editor-link-acoes {
  display: flex;
  justify-content: flex-end;
  gap: 0.4rem;
}

.abana-editor-link-aplicar,
.abana-editor-link-remover {
  padding: 0.25rem 0.7rem;
  font-size: 0.8rem;
  border-radius: var(--raio);
  cursor: pointer;
}

.abana-editor-link-aplicar {
  color: #fff;
  background: var(--cor-secundaria);
  border: 1px solid var(--cor-secundaria);
}

.abana-editor-link-remover {
  color: var(--cor-texto-suave);
  background: transparent;
  border: 1px solid var(--cor-borda);
}

.abana-editor-conteudo {
  border: 1px solid transparent;
  border-radius: var(--raio);
  padding: 0.5rem 0.6rem;
  min-height: 4.5rem;
  font-size: 0.9rem;
  color: var(--cor-texto);
}

.abana-editor-conteudo:hover,
.abana-editor-conteudo:focus-within,
.abana-editor-conteudo:focus {
  border-color: var(--cor-borda);
  background: var(--cor-secao);
  outline: none;
}

/* Campo de ESCREVER COMENTÁRIO: fundo de campo já em repouso (issue #409).
   A edição inline do painel — "parece texto até ganhar foco" — é certa pra
   DESCRIÇÃO, que é um texto existente que se edita; mas o compositor de
   comentário é um lugar vazio onde se começa a escrever, e sem fundo ele
   não se anuncia como campo. Fica igual aos campos de "Convidado" e
   "Vincular uma proposta", que o usuário citou como referência.
   Escopado no pai .abana-painel-novo-comentario pra NÃO atingir a
   descrição nem a edição de um comentário já publicado, que dividem a
   mesma classe. Precisa vir depois da regra de :hover acima: a
   especificidade é a mesma (0,2,0) e, antes dela, o hover venceria e o
   campo pareceria piscar ao contrário. Fundo e cor do texto declarados
   juntos, nos dois estados, como manda a regra dos dois temas. */
.abana-painel-novo-comentario .abana-editor-conteudo {
  background: var(--cor-campo);
  border-color: var(--cor-borda-campo);
  color: var(--cor-texto);
}

.abana-painel-novo-comentario .abana-editor-conteudo:hover,
.abana-painel-novo-comentario .abana-editor-conteudo:focus-within,
.abana-painel-novo-comentario .abana-editor-conteudo:focus {
  background: var(--cor-campo);
  border-color: var(--cor-secundaria);
  color: var(--cor-texto);
}

/* --- Revisão do Daniel no painel (2026-08-13, prints do Trello) ------- */

/* Dentro do PAINEL, a barra de formatação só aparece quando o campo está
   em edição (foco dentro do editor) — descrição e comentários. Fora do
   painel (telas de template) a barra continua fixa, porque lá a edição
   é a atividade principal da tela. */
.abana-painel-detalhe .abana-editor-barra {
  display: none;
}

.abana-painel-detalhe .abana-editor-descricao:focus-within .abana-editor-barra {
  display: flex;
}

/* Botões de formatação menores na coluna de conversa — a barra inteira
   cabe numa linha do trilho, em vez de quebrar em três. */
.abana-painel-coluna-conversa .abana-editor-botao {
  font-size: 0.72rem;
  min-width: 1.35rem;
  padding: 0.1rem 0.25rem;
}

/* A DESCRIÇÃO tem borda sempre (a parte editável se anuncia, como no
   Trello) e fica com o contorno na cor de acento enquanto se edita. A
   caixa é o embrulho do editor (barra + campo); o miolo devolve a borda
   e o fundo próprios pra não desenhar caixa dentro de caixa — fundo e
   texto declarados juntos, como manda a regra. */
.abana-painel-coluna-principal .abana-editor-descricao {
  border: 1px solid var(--cor-borda);
  border-radius: var(--raio);
  padding: 0.35rem 0.45rem;
}

.abana-painel-coluna-principal .abana-editor-descricao:focus-within {
  border-color: var(--cor-primaria);
}

.abana-painel-coluna-principal .abana-editor-descricao .abana-editor-conteudo,
.abana-painel-coluna-principal .abana-editor-descricao .abana-editor-conteudo:hover,
.abana-painel-coluna-principal .abana-editor-descricao .abana-editor-conteudo:focus-within,
.abana-painel-coluna-principal .abana-editor-descricao .abana-editor-conteudo:focus {
  border-color: transparent;
  background: transparent;
  color: var(--cor-texto);
}

/* O compositor (e a edição) de comentário também fica com o contorno de
   acento em edição — coerente com a descrição e com o print do Trello. */
.abana-painel-coluna-conversa .abana-editor-conteudo:focus-within,
.abana-painel-coluna-conversa .abana-editor-conteudo:focus {
  border-color: var(--cor-primaria);
}

/* Área de escrita — âncora do placeholder (issue #93: antes ele se
   prendia ao editor inteiro e escapava por cima da barra). */
.abana-editor-campo {
  position: relative;
}

.abana-editor-placeholder {
  position: absolute;
  top: 0.5rem;    /* alinha com o padding-top de .abana-editor-conteudo */
  left: 0.6rem;   /* idem, padding-left */
  pointer-events: none;
  color: var(--cor-texto-suave);
  font-size: 0.9rem;
}

/* O "D" de Destaque na barra é um <mark>: neutraliza o amarelo nativo do
   navegador pra ele não parecer sempre ativo (issue #93). O estado ativo
   de verdade vem do fundo do botão (.ativo), igual aos outros. */
.abana-editor-botao mark {
  background: transparent;
  color: inherit;
  padding: 0;
}

/* Conteúdo rico da descrição — vale pro editor E pra leitura. */
.abana-descricao-rica {
  white-space: normal;
  /* Issues #604 e #612: a quebra viaja com a CLASSE, não só com o painel.
     O painel tem a sua regra própria (ver .abana-painel-detalhe *), mas
     este mesmo conteúdo rico também é desenhado fora dele — no editor
     embutido nas telas Django (abana/forms.py) — e lá não havia nada
     segurando uma URL comprida. */
  overflow-wrap: anywhere;
}

/* Citação (issue #612, reporte do Denis): a citação estava "atravessando
   a página". O texto de dentro já quebra pelas regras acima; este
   max-width fecha o outro caminho — a própria caixa da citação esticar
   além de quem a contém quando o conteúdo dela não puder ser quebrado. */
.abana-descricao-rica blockquote {
  max-width: 100%;
}

.abana-descricao-rica p {
  margin: 0 0 0.4rem;
}

.abana-descricao-rica ul,
.abana-descricao-rica ol {
  margin: 0 0 0.4rem;
  padding-left: 1.4rem;
}

.abana-descricao-rica blockquote {
  margin: 0 0 0.4rem;
  padding-left: 0.7rem;
  border-left: 3px solid var(--cor-borda);
  color: var(--cor-texto-suave);
}

.abana-descricao-rica code {
  background: var(--cor-secao);
  border: 1px solid var(--cor-borda);
  border-radius: 3px;
  padding: 0 0.25rem;
  font-size: 0.85em;
}

.abana-descricao-rica pre {
  background: var(--cor-secao);
  border: 1px solid var(--cor-borda);
  border-radius: var(--raio);
  padding: 0.5rem 0.6rem;
  overflow-x: auto;
  margin: 0 0 0.4rem;
}

.abana-descricao-rica pre code {
  background: transparent;
  border: none;
  padding: 0;
}

/* Destaque e link usam a cor SECUNDÁRIA: a primária do tema claro é
   azul-marinho quase preto e sumiria como cor de realce. */
.abana-descricao-rica mark {
  background: color-mix(in srgb, var(--cor-secundaria) 30%, transparent);
  color: inherit;
  border-radius: 2px;
  padding: 0 0.1rem;
}

.abana-descricao-rica a {
  color: var(--cor-secundaria);
}

/* Dentro do EDITOR a área é contenteditable, então o cursor padrão é o de
   texto e o link fica com cara de enfeite colorido. Agora que o clique
   abre o link (issue #379), a setinha é o aviso de que ele é clicável —
   sem ela, "não é clicável" continuaria sendo a impressão de quem olha. */
.abana-editor-conteudo a {
  cursor: pointer;
}

/* Dropdown de sugestões do editor (@ e /): flutua no body, posicionado
   pelo próprio editor — herda o visual das sugestões de menção. */
.abana-sugestoes-flutuantes {
  position: fixed;
  z-index: 130;
  min-width: 12rem;
}

/* Paginação do feed de atividades do projeto (issue #68). */
.abana-paginacao {
  display: flex;
  align-items: center;
  gap: 1rem;
  margin: 0.8rem 0 0;
}

.abana-painel-comentarios {
  list-style: none;
  margin: 0;
  padding: 0;
  display: flex;
  flex-direction: column;
  gap: 0.8rem;
}

.abana-comentario {
  display: flex;
  gap: 0.5rem;
  align-items: flex-start;
}

.abana-comentario-corpo {
  flex: 1;
  padding: 0.1rem 0;
}

.abana-comentario-cabecalho {
  display: flex;
  align-items: center;
  gap: 0.5rem;
  margin-bottom: 0.2rem;
  font-size: 0.85rem;
}

.abana-comentario-cabecalho strong {
  color: var(--cor-texto);
}

.abana-comentario-corpo p {
  margin: 0;
  white-space: pre-wrap;
  color: var(--cor-texto);
  font-size: 0.9rem;
}

/* Issue #93: comentário exibido como texto formatado (rich text) — herda
   o visual de .abana-descricao-rica; aqui só o tamanho de fonte e o
   último parágrafo sem margem sobrando. */
.abana-comentario-texto {
  font-size: 0.9rem;
}

.abana-comentario-texto > *:last-child {
  margin-bottom: 0;
}

/* Comentário do próprio autor: parece texto normal até ganhar foco —
   mesmo padrão de clique-e-digite de CampoTituloDaTarefa/CampoNomeDaColuna
   (TaskCard.jsx/SortableColumn.jsx), sem precisar de um botão "Editar". */
.abana-comentario-texto-editavel {
  display: block;
  box-sizing: border-box;
  width: 100%;
  resize: vertical;
  border: 1px solid transparent;
  background: transparent;
  color: var(--cor-texto);
  border-radius: var(--raio);
  padding: 0.3rem 0.4rem;
  margin: -0.3rem -0.4rem 0;  /* mesma regra da descrição (issue #50) */
  font-family: inherit;
  font-size: 0.9rem;
  cursor: text;
}

.abana-comentario-texto-editavel:hover,
.abana-comentario-texto-editavel:focus {
  border-color: var(--cor-borda);
  background: var(--cor-fundo);
  outline: none;
}

.abana-painel-novo-comentario {
  display: flex;
  flex-direction: column;
  gap: 0.4rem;
  margin-top: 0.8rem;
}

/* (As regras de .abana-painel-novo-comentario textarea saíram na issue
   #409: não há <textarea> aqui desde a issue #44, que trocou o campo pelo
   editor de texto rico. Elas não pegavam em nada e faziam parecer que o
   fundo do campo se resolvia por aqui.) */

.abana-painel-novo-comentario button {
  align-self: flex-end;
  border: 1px solid var(--cor-borda);
  background: var(--cor-secao);
  color: var(--cor-texto);
  border-radius: var(--raio);
  padding: 0.35rem 0.9rem;
  cursor: pointer;
}

.abana-painel-novo-comentario button:disabled {
  color: var(--cor-texto-suave);
  cursor: not-allowed;
}


/* Ação destrutiva de linha (X discreto): invisível até o hover da linha
   ou o foco por teclado — diretriz de UI do CLAUDE.md. Em telas de toque
   (sem hover) fica meio visível, senão seria inalcançável. */
.abana-icone-acao {
  display: inline-flex;
  align-items: center;
  background: transparent;
  border: none;
  color: var(--cor-texto-suave);
  cursor: pointer;
  padding: 0.2rem;
  opacity: 0;
  transition: opacity 0.12s ease;
}

/* Revelação GENÉRICA (issue #51): qualquer linha que contenha o ícone
   direto o revela no hover — a lista enumerada continua só pros casos em
   que o ícone fica mais fundo na árvore. Enumerar linha a linha foi o que
   deixou convidados e anexos pendentes sem botão visível. */
:hover > .abana-icone-acao,
.abana-painel-lembretes li:hover .abana-icone-acao,
.abana-painel-projetos li:hover .abana-icone-acao,
.abana-painel-subtarefas li:hover .abana-icone-acao,
.abana-linha-subtarefa:hover .abana-icone-acao,
.abana-comentario:hover .abana-icone-acao,
/* Revogar token: o ✕ mora dentro de um <form> aninhado no <li>, então o
   ':hover > ' genérico não pegava a linha inteira — passar o mouse no
   token não revelava o botão (parecia não existir). Revela pela linha. */
.lista-de-tokens li:hover .abana-icone-acao,
.abana-icone-acao:focus-visible {
  opacity: 1;
}

.abana-icone-acao:hover {
  color: var(--cor-erro);
}

/* No cabeçalho do comentário, o X vai pro canto direito da linha. */
.abana-comentario-cabecalho .abana-icone-acao {
  margin-left: auto;
}

@media (hover: none) {
  .abana-icone-acao {
    opacity: 0.5;
  }
}

/* Pílulas (tags) — projeto e status no painel: categórico bate no olho,
   sem cara de dropdown padrão (diretriz de UI do CLAUDE.md). A cor de
   fundo/borda do projeto vem inline do React (matiz estável por id). */
.abana-pill {
  display: inline-flex;
  align-items: center;
  border: 1px solid var(--cor-borda);
  background: var(--cor-secao);
  color: var(--cor-texto);
  border-radius: 999px;
  padding: 0.15rem 0.7rem;
  font-size: 0.8rem;
  white-space: nowrap;
}

select.abana-pill-seletor {
  appearance: none;
  -webkit-appearance: none;
  cursor: pointer;
  padding-right: 1.4rem;
  background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23888' stroke-width='2'%3E%3Cpath d='M6 9l6 6 6-6'/%3E%3C/svg%3E");
  background-repeat: no-repeat;
  background-position: right 0.45rem center;
  background-size: 0.7rem;
}

select.abana-pill-seletor:hover {
  border-color: var(--cor-texto-suave);
}

/* O campo de nova subtarefa do painel também é inline: transparente até
   hover/foco, Enter confirma. */
.abana-painel-nova-subtarefa input {
  border: 1px solid transparent;
  background: transparent;
  color: var(--cor-texto);
  border-radius: var(--raio);
  padding: 0.3rem 0.4rem;
  font-size: 0.9rem;
  width: 100%;
}

.abana-painel-nova-subtarefa input:hover,
.abana-painel-nova-subtarefa input:focus {
  border-color: var(--cor-borda);
  background: var(--cor-secao);
  outline: none;
}

/* Ícones da barra lateral/listas: visões fixas têm SVG próprio
   (icone-menu); cada projeto tem um quadradinho com cor estável por id
   (--matiz vem do template, mesma matiz da pílula do projeto no painel). */
.icone-menu {
  width: 0.85rem;
  height: 0.85rem;
  flex-shrink: 0;
  vertical-align: -0.1em;
  margin-right: 0.35rem;
  color: var(--cor-texto-suave);
}

.icone-projeto {
  display: inline-block;
  width: 0.65rem;
  height: 0.65rem;
  flex-shrink: 0;
  border-radius: 3px;
  margin-right: 0.4rem;
  vertical-align: -0.05em;
  background: hsla(var(--matiz), 65%, 50%, 0.85);
}

.abana-titulo-quadro {
  display: flex;
  align-items: center;
  gap: 0.5rem;
}

.abana-titulo-quadro .icone-projeto {
  width: 0.85rem;
  height: 0.85rem;
  margin-right: 0;
}

/* Busca do Abana na barra lateral. */
.busca-lateral {
  margin: 0.3rem 0 0.2rem;
  padding: 0 0.75rem;
}

.busca-lateral input {
  width: 100%;
  box-sizing: border-box;
  border: 1px solid var(--cor-borda-campo);
  background-color: var(--cor-campo);
  color: var(--cor-texto);
  border-radius: var(--raio);
  padding: 0.3rem 0.5rem;
  font-size: 0.85rem;
}

.abana-lista-atualizacoes {
  list-style: none;
  margin: 0;
  padding: 0;
  display: flex;
  flex-direction: column;
  gap: 0.6rem;
}

/* Paleta de cores do projeto (aba Geral): cada opção é uma bolinha; a
   selecionada ganha anel. O input rádio real fica invisível mas
   focável/clicável (acessível por teclado). */
.paleta-de-cores {
  display: flex;
  align-items: center;
  gap: 0.5rem;
  flex-wrap: wrap;
}

.bolinha-de-cor {
  width: 1.4rem;
  height: 1.4rem;
  border-radius: 50%;
  background: hsla(var(--matiz), 65%, 50%, 0.9);
  cursor: pointer;
  display: inline-flex;
  align-items: center;
  justify-content: center;
}

.bolinha-de-cor input {
  appearance: none;
  -webkit-appearance: none;
  width: 100%;
  height: 100%;
  margin: 0;
  border-radius: 50%;
  cursor: pointer;
}

.bolinha-de-cor input:checked {
  outline: 2px solid var(--cor-texto);
  outline-offset: 2px;
}

.bolinha-de-cor input:focus-visible {
  outline: 2px solid var(--cor-primaria);
  outline-offset: 2px;
}

/* Lápis de abrir detalhes no cartão: mesmo padrão discreto dos ícones de
   ação — aparece no hover do cartão (ou foco). */
.abana-tarefa:hover .abana-editar-cartao,
.abana-editar-cartao:focus-visible {
  opacity: 1;
}

/* Check de conclusão mais minimalista (pedido do Daniel): menor e com
   traço mais fino. */
.abana-check-tarefa {
  width: 1.1rem;
  height: 1.1rem;
  min-width: 1.1rem;
  border-width: 1.5px;
  font-size: 0.65rem;
}

.abana-tags-cartao {
  display: flex;
  flex-wrap: wrap;
  gap: 0.25rem;
}

.abana-pill-mini {
  font-size: 0.7rem;
  padding: 0.05rem 0.5rem;
}

/* Pílula que mostra "Nome: valor" (campo com "exibir título no cartão").
   Pode ser longa, então quebra linha em vez de esticar o cartão: cantos
   menos arredondados (um "999px" quebrado em duas linhas fica estranho),
   largura limitada à do cartão e alinhamento à esquerda. O nome vai em
   cor suave pra pesar menos na leitura. */
.abana-pill-com-nome {
  white-space: normal;
  border-radius: var(--raio);
  max-width: 100%;
  text-align: left;
  overflow-wrap: anywhere;
}

.abana-pill-nome {
  color: var(--cor-texto-suave);
  /* Espaço do "Nome: valor" — a pílula é inline-flex e um espaço de texto
     solto entre os itens colapsaria, então o respiro vem da margem. */
  margin-right: 0.3em;
}

.abana-curtir {
  background: transparent;
  border: none;
  cursor: pointer;
  font-size: 0.85rem;
  color: var(--cor-texto-suave);
  padding: 0.2rem 0.3rem;
}

.abana-curtir.curtido {
  color: var(--cor-texto);
}

/* Reações a comentário (issue #605, pedido #109 do Denis) — o botão que
   abre a paleta. Discreto no cabeçalho do comentário, como os outros
   ícones de linha: aparece de leve e ganha contorno ao hover/foco.
   FUNDO, BORDA E COR declarados nos dois estados (regra do "nunca
   metade"), conferidos nos dois temas. */
.abana-reagir {
  display: inline-flex;
  align-items: center;
  background: transparent;
  border: 1px solid transparent;
  border-radius: var(--raio);
  color: var(--cor-texto-suave);
  cursor: pointer;
  padding: 0.15rem 0.25rem;
}

.abana-reagir:hover,
.abana-reagir:focus-visible {
  color: var(--cor-texto);
  border-color: var(--cor-borda);
  background: var(--cor-secao);
  outline: none;
}

/* A fileira de pílulas com as reações que já existem, abaixo do
   cabeçalho do comentário. */
.abana-reacoes {
  display: flex;
  flex-wrap: wrap;
  gap: 0.25rem;
  margin: 0.15rem 0 0.3rem;
}

/* Cada pílula: emoji + quantas pessoas. "minha" = eu estou entre elas,
   e aí ela ganha a cor de acento — é como se sabe, de relance, no que
   já se clicou. Os dois estados declaram fundo, borda E cor do texto. */
.abana-reacao {
  display: inline-flex;
  align-items: center;
  gap: 0.2rem;
  background: var(--cor-secao);
  border: 1px solid var(--cor-borda);
  border-radius: 999px;
  color: var(--cor-texto-suave);
  cursor: pointer;
  padding: 0.05rem 0.4rem;
  font-size: 0.8rem;
  line-height: 1.5;
}

.abana-reacao:hover,
.abana-reacao:focus-visible {
  background: var(--cor-fundo);
  border-color: var(--cor-secundaria);
  color: var(--cor-texto);
  outline: none;
}

.abana-reacao.minha {
  background: color-mix(in srgb, var(--cor-secundaria) 18%, transparent);
  border-color: var(--cor-secundaria);
  color: var(--cor-texto);
}

.abana-reacao.minha:hover,
.abana-reacao.minha:focus-visible {
  background: color-mix(in srgb, var(--cor-secundaria) 30%, transparent);
  border-color: var(--cor-secundaria);
  color: var(--cor-texto);
}

/* A janelinha da paleta: seis emojis numa linha, sem a largura das
   janelinhas de lista. `width: auto` vence a largura fixa de
   .abana-janelinha (17.5rem), que deixaria a paleta com um vão à
   direita. */
.abana-janelinha-reacoes {
  width: auto;
}

.abana-paleta-de-reacoes {
  display: flex;
  gap: 0.2rem;
}

/* Na paleta a pílula é só o emoji, um pouco maior: ali se ESCOLHE, e
   alvo pequeno demais erra o clique. */
.abana-paleta-de-reacoes .abana-reacao {
  font-size: 1.05rem;
  padding: 0.2rem 0.35rem;
}

.abana-botoes-sociais {
  display: inline-flex;
  align-items: center;
  gap: 0.3rem;
}

.abana-enviar-anexo {
  cursor: pointer;
}

.abana-tirar-tag {
  opacity: 0.6;
  margin-left: 0.2rem;
  padding: 0;
}

.abana-pill:hover .abana-tirar-tag {
  opacity: 1;
}

/* Curtir no estilo do print do Daniel: contagem à esquerda do joinha;
   curtido = azul de destaque, senão discreto. */
.abana-curtir {
  display: inline-flex;
  align-items: center;
  gap: 0.25rem;
  font-size: 0.75rem;
}

.abana-curtir.curtido {
  color: var(--cor-secundaria);
}

.abana-rodape-direita {
  display: inline-flex;
  align-items: center;
  gap: 0.4rem;
}

/* Busca inline (quadros e página de busca): campo pequeno, Enter envia,
   sem botão — diretriz de UI. */
.abana-form-busca {
  display: flex;
  align-items: center;
  gap: 0.4rem;
}

.abana-form-busca input[type="search"] {
  border: 1px solid var(--cor-borda-campo);
  background-color: var(--cor-campo);
  color: var(--cor-texto);
  border-radius: var(--raio);
  padding: 0.3rem 0.6rem;
  font-size: 0.85rem;
  min-width: 12rem;
}

.abana-form-busca select {
  font-size: 0.8rem;
  padding: 0.25rem 0.4rem;
}

/* Filtro "só não concluídas" (pedido #103): checkbox + rótulo alinhados
   na mesma linha da busca, rótulo em caixa alta e baixa (diretriz de UI). */
.abana-busca-filtro {
  display: inline-flex;
  align-items: center;
  gap: 0.35rem;
  font-size: 0.85rem;
  color: var(--cor-texto-suave);
  white-space: nowrap;
  cursor: pointer;
}

.abana-busca-quadro {
  margin-left: auto;
  margin-right: 0.8rem;
}

/* Busca do cabeçalho do quadro (issue #633, pedido #113 do Matheus):
   digitar PENEIRA o quadro — só ficam os cartões que casam. A janelinha de
   sugestões da issue #210 saiu junto com as regras dela
   (.abana-busca-resultados, -linha, -titulo, -vazia, -ver-tudo): o
   resultado agora é o próprio quadro.

   .abana-busca-contexto e .abana-busca-prazo FICARAM: quem as usa é a
   página de busca completa (abana/templates/abana/busca.html), que
   continua existindo. */
.abana-busca-instantanea {
  position: relative;
  display: inline-flex;
  align-items: center;
  gap: 0.35rem;
}

/* Campo filtrando: destaque de acento, pela diretriz "controle que aplica
   filtro indica quando está ativo". FUNDO, BORDA E COR juntos — a regra
   do "nunca metade" vale aqui como em qualquer estado que pinta fundo. */
.abana-busca-instantanea input.filtrando {
  background: color-mix(in srgb, var(--cor-secundaria) 12%, var(--cor-fundo));
  border-color: var(--cor-secundaria);
  color: var(--cor-texto);
}

/* Quantos cartões sobraram. Sem este número, uma busca que não acha nada
   deixa o quadro vazio e mudo — e quadro vazio sem explicação se lê como
   tela quebrada. */
.abana-busca-quantos {
  white-space: nowrap;
  font-size: 0.78rem;
  color: var(--cor-texto-suave);
}

/* Prazo atrasado/de hoje na cor do selo do cartão — mesma leitura sem ter
   de comparar datas na cabeça (issues #79/#97). */
.abana-busca-prazo.prazo-atrasado {
  color: var(--cor-erro);
  font-weight: 600;
}

.abana-busca-prazo.prazo-hoje {
  color: var(--cor-aviso);
  font-weight: 600;
}

/* Lista da busca completa (/abana/busca/): título na linha de cima,
   contexto embaixo. Respiro em vez de caixas (diretriz de UI): divisórias
   finas, sem fundo cinza por item. */
.abana-busca-lista {
  list-style: none;
  padding: 0;
  margin: 0.5rem 0 1.5rem;
}

.abana-busca-lista li {
  padding: 0.5rem 0;
  border-bottom: 1px solid var(--cor-borda);
}

.abana-busca-lista li:last-child {
  border-bottom: none;
}

.abana-filtro-tags {
  display: flex;
  align-items: center;
  flex-wrap: wrap;
  gap: 0.35rem;
  margin: 0.4rem 0 0.8rem;
}

.abana-pill-clicavel {
  cursor: pointer;
}

.abana-pill-clicavel.ativa {
  font-weight: 600;
}

/* ============================================================
   Lote: filtro do quadro, check sutil e seletores só-no-hover
   ============================================================ */

/* Check de conclusão ainda menor e mais sutil (print do Daniel):
   círculo fino na cor da borda, verde só no hover e quando concluído.
   Este bloco vem por último de propósito — vence os tamanhos antigos. */
.abana-check-tarefa {
  width: 1rem;
  height: 1rem;
  min-width: 1rem;
  border-width: 1.5px;
  border-color: var(--cor-borda);
  font-size: 0.55rem;
  line-height: 1;
}

/* Alinhamento check × título: o input do título tem padding vertical
   igual em cima e embaixo e line-height fixo, pro centro óptico do texto
   bater com o centro do círculo (Daniel reportou desalinhamento). */
.abana-tarefa-linha .abana-titulo-tarefa {
  padding-top: 0.2rem;
  padding-bottom: 0.2rem;
  line-height: 1.3;
}

/* Botão do filtro (funil) ao lado da busca; ponto azul indica filtro
   ativo mesmo com o painel fechado. */
.abana-filtro {
  position: relative;
  display: inline-flex;
}

/* Funil por coluna (issue #136): no cabeçalho da coluna, alinhado aos
   outros ícones. O painel reaproveita .abana-filtro-painel — que desde a
   issue #387 sai num portal em <body> com posição calculada, justamente
   porque AQUI, dentro da coluna, ele era cortado pelo quadro. */
.abana-filtro-coluna {
  display: inline-flex;
  align-items: center;
}

.abana-filtro-botao {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  background: transparent;
  border: 1px solid transparent;
  border-radius: var(--raio);
  color: var(--cor-texto-suave);
  cursor: pointer;
  padding: 0.3rem 0.4rem;
  position: relative;
}

.abana-filtro-botao:hover,
.abana-filtro-botao.ativo {
  color: var(--cor-texto);
  border-color: var(--cor-borda);
  background: var(--cor-secao);
}

.abana-filtro-indicador {
  position: absolute;
  top: 0.15rem;
  right: 0.15rem;
  width: 0.4rem;
  height: 0.4rem;
  border-radius: 50%;
  background: var(--cor-secundaria);
}

/* Painel suspenso do filtro.
   position: fixed, não absolute — renderizado via portal em <body>
   (FiltroDoQuadro.jsx), com top/left calculados em JS na abertura. Era
   "absolute" dentro do funil, e por isso o painel do filtro POR COLUNA
   nascia dentro de ".abana-quadro", que tem "overflow-x: auto" e, por
   regra do CSS, corta (clip) o que vaza dele — o painel abria fora da
   parte visível e parecia que o clique não tinha funcionado (issue #387).
   Mesmo remédio já usado no menu da coluna (.abana-menu-coluna-itens).
   O z-index fica acima dos cartões arrastáveis. */
.abana-filtro-painel {
  position: fixed;
  z-index: 40;
  min-width: 16rem;
  /* Largura MÁXIMA declarada (issue #424). Ela nunca existiu, e até a
     #387 isso não aparecia por acaso: sendo "absolute" dentro do funil,
     quem decidia a largura era o funil — poucos pixels —, então o painel
     encolhia sozinho até o min-width. Com "fixed" a referência passou a
     ser a JANELA, e o painel cresceu até caber o conteúdo mais largo (a
     largura de um <select> é ditada pela sua opção mais comprida, e um
     quadro com campos personalizados tem opções longas). Quem depende do
     acaso para não crescer precisa declarar o próprio limite. */
  max-width: min(20rem, calc(100vw - 2rem));
  background: var(--cor-fundo);
  border: 1px solid var(--cor-borda);
  border-radius: var(--raio);
  box-shadow: 0 6px 18px rgba(0, 0, 0, 0.15);
  padding: 0.7rem 0.8rem;
  display: flex;
  flex-direction: column;
  gap: 0.6rem;
}

.abana-filtro-grupo {
  display: flex;
  flex-direction: column;
  gap: 0.3rem;
}

.abana-filtro-grupo select {
  font-size: 0.8rem;
  padding: 0.25rem 0.4rem;
  /* Deixa o seletor caber na largura do painel em vez de esticá-lo pela
     opção mais comprida (issue #424) — o próprio <select> corta o texto
     longo com reticências, que é o comportamento nativo dele. */
  min-width: 0;
  max-width: 100%;
}

/* As etiquetas dentro do painel não precisam da margem da antiga barra
   de filtro que ficava solta no cabeçalho. */
.abana-filtro-painel .abana-filtro-tags {
  margin: 0;
}

/* Grupos de condições (issue #381): cada grupo é um bloco com divisória
   fina (respiro em vez de caixa), condições em linha e ações discretas. */
.abana-filtro-grupo-condicoes {
  display: flex;
  flex-direction: column;
  gap: 0.3rem;
  padding: 0.35rem 0 0.45rem;
  border-top: 1px solid var(--cor-borda);
}

.abana-filtro-condicao {
  display: flex;
  align-items: center;
  gap: 0.25rem;
}

.abana-filtro-condicao select,
.abana-filtro-condicao input {
  font-size: 0.8rem;
  padding: 0.25rem 0.4rem;
  min-width: 0;
  flex: 1 1 0;
}

/* O ✕ de condição segue o padrão de ícone discreto, mas dentro do painel
   de filtro não há "linha com hover" — fica sempre alcançável. */
.abana-filtro-condicao .abana-icone-acao {
  opacity: 0.6;
  flex: 0 0 auto;
}

.abana-filtro-condicao .abana-icone-acao:hover,
.abana-filtro-condicao .abana-icone-acao:focus-visible {
  opacity: 1;
}

.abana-filtro-grupo-acoes {
  display: flex;
  gap: 0.75rem;
}

/* Filtro por projetos (issue #381, reformulado a pedido do dono em
   2026-08-06): gatilho com cara de seletor + lista suspensa de caixas.
   Estados declaram fundo E cor do texto — regra "nunca metade". */
.abana-filtro-projetos-gatilho {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 0.4rem;
  width: 100%;
  font-size: 0.8rem;
  padding: 0.25rem 0.4rem;
  background: transparent;
  border: 1px solid var(--cor-borda);
  border-radius: var(--raio);
  color: var(--cor-texto);
  cursor: pointer;
}

.abana-filtro-projetos-gatilho:hover,
.abana-filtro-projetos-gatilho:focus-visible {
  background: var(--cor-secao);
  color: var(--cor-texto);
}

/* O rótulo corta no CONTEÚDO, não na borda — a seta tem lugar próprio. */
.abana-filtro-projetos-gatilho .rotulo {
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.abana-filtro-projetos-lista {
  display: flex;
  flex-direction: column;
  gap: 0.25rem;
  padding: 0.35rem 0.1rem 0.1rem;
  max-height: 11rem;
  overflow-y: auto;
}

/* Seletores VAZIOS (prazo/responsável tracejados) só aparecem ao passar
   o mouse (ou focar via teclado) — pedido do Daniel. O prazo com data
   preenchida agora fica SEMPRE visível (pedido #79/#97: antes só aparecia
   no hover e atrapalhava enxergar as urgências de longe). O responsável
   do cartão principal é o selo na linha do título e nunca some. */
.abana-linha-subtarefa .abana-prazo-mini.vazio,
.abana-rodape-esquerda .abana-prazo-mini.vazio {
  opacity: 0;
  transition: opacity 0.15s ease;
}

.abana-tarefa:hover .abana-prazo-mini.vazio,
.abana-tarefa:focus-within .abana-prazo-mini.vazio,
.abana-linha-subtarefa:hover .abana-prazo-mini.vazio,
.abana-linha-subtarefa:focus-within .abana-prazo-mini.vazio {
  opacity: 1;
}

/* Formulário de automações: três blocos (gatilho / condições / ação)
   com borda fininha de baixo contraste — respiro, não caixas pesadas
   (diretriz de UI do CLAUDE.md). */
.abana-form-automacao {
  display: flex;
  flex-direction: column;
  gap: 1rem;
  max-width: 34rem;
}

.abana-grupo-automacao {
  border: 1px solid var(--cor-borda);
  border-radius: var(--raio);
  padding: 0.8rem 1rem 0.6rem;
}

.abana-grupo-automacao legend {
  font-weight: 600;
  padding: 0 0.4rem;
}

.abana-grupo-automacao label {
  display: block;
  margin-bottom: 0.2rem;
}

/* Bloco recolhível (issue #369): mesmo desenho do fieldset ao lado, só
   que num <details>, com o cabeçalho no <summary>. */
.abana-grupo-recolhivel > .abana-grupo-resumo {
  font-weight: 600;
  cursor: pointer;
  padding: 0.1rem 0.2rem;
  border-radius: var(--raio);
  background: transparent;
  color: var(--cor-texto);
  display: flex;
  align-items: center;
  gap: 0.5rem;
}

/* Regra de fundo declara a cor do texto junto — nos dois sentidos e nos
   dois temas (diretriz "nunca metade" do CLAUDE.md). */
.abana-grupo-recolhivel > .abana-grupo-resumo:hover,
.abana-grupo-recolhivel > .abana-grupo-resumo:focus-visible {
  background: var(--cor-secao);
  color: var(--cor-secundaria);
}

/* Recolhido some com o espaço de baixo; aberto o devolve. */
.abana-grupo-recolhivel:not([open]) {
  padding-bottom: 0.2rem;
}

/* Marca de "tem filtro aqui dentro" — o usuário precisa saber que a regra
   está filtrada mesmo com o bloco fechado. */
.abana-marca-filtro {
  font-size: 0.72rem;
  font-weight: 500;
  border-radius: 999px;
  padding: 0.05rem 0.5rem;
  border: 1px solid var(--cor-secundaria);
  background: var(--cor-secao);
  color: var(--cor-secundaria);
}

/* Texto de apoio pequeno embaixo de cada campo (o mesmo texto vira
   tooltip via title). */
.abana-ajuda-campo {
  display: block;
  font-size: 0.75rem;
  color: var(--cor-texto-suave);
  margin-top: 0.2rem;
}

/* Janelinhas (popovers estilo Asana): painel pequeno flutuante pra UMA
   escolha (responsável, coluna, template), aberto a partir dos menus. */
.abana-janelinha {
  position: fixed;
  z-index: 120;
  width: 17.5rem;
  background: var(--cor-fundo);
  border: 1px solid var(--cor-borda);
  border-radius: var(--raio);
  box-shadow: 0 8px 24px rgba(0, 0, 0, 0.25);
  padding: 0.6rem 0.7rem;
  display: flex;
  flex-direction: column;
  gap: 0.5rem;
}

.abana-janelinha-cabecalho {
  display: flex;
  align-items: center;
  justify-content: space-between;
  font-size: 0.8rem;
  color: var(--cor-texto-suave);
}

.abana-janelinha-busca {
  display: flex;
  align-items: center;
  gap: 0.4rem;
}

.abana-janelinha-busca input[type="search"] {
  flex: 1;
  min-width: 0;
  border: 1px solid var(--cor-borda);
  background: var(--cor-fundo);
  color: var(--cor-texto);
  border-radius: var(--raio);
  padding: 0.3rem 0.5rem;
  font-size: 0.85rem;
}

.abana-janelinha-busca button {
  white-space: nowrap;
}

/* Lista de opções: botões de linha inteira, discretos, com rolagem
   própria quando a lista é longa. */
.abana-janelinha-lista {
  display: flex;
  flex-direction: column;
  max-height: 16rem;
  overflow-y: auto;
}

.abana-janelinha-lista button {
  display: flex;
  align-items: center;
  gap: 0.5rem;
  width: 100%;
  text-align: left;
  background: transparent;
  border: none;
  border-radius: var(--raio);
  color: var(--cor-texto);
  padding: 0.35rem 0.4rem;
  cursor: pointer;
}

.abana-janelinha-lista button:hover:not(:disabled),
.abana-janelinha-lista button:focus-visible {
  background: var(--cor-secao);
  color: var(--cor-texto);
}

.abana-janelinha-lista button:disabled {
  opacity: 0.5;
  cursor: default;
}

/* Marca de "opção marcada" na janelinha de múltipla escolha (issue #457).
   Vai encostada à direita, longe do nome da opção.

   A cor é declarada AQUI e vence o hover do botão de propósito: a regra
   de hover acima muda fundo e cor do botão inteiro, e sem esta declaração
   o ✓ herdaria a cor do texto comum — que é justamente o que faz um
   indicador de estado sumir quando o mouse passa por cima dele.
   --cor-secundaria é definida nos DOIS temas e contrasta com o fundo de
   hover (--cor-secao) em ambos. */
.abana-janelinha-lista button .abana-janelinha-marca {
  margin-left: auto;
  color: var(--cor-secundaria);
  font-weight: 600;
}

.abana-janelinha-lista button:hover .abana-janelinha-marca,
.abana-janelinha-lista button:focus-visible .abana-janelinha-marca {
  color: var(--cor-secundaria);
}

/* Lista "Gerenciar automações": cada regra numa linha com divisória fina;
   os ícones de editar/excluir aparecem no hover da linha (e no foco por
   teclado, como os outros ícones de ação do sistema). */
.abana-lista-regras {
  list-style: none;
  padding: 0;
  margin: 0.4rem 0 0;
}

.abana-lista-regras li {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  gap: 0.6rem;
  padding: 0.45rem 0.2rem;
  border-bottom: 1px solid var(--cor-borda);
}

.abana-lista-regras li:last-child {
  border-bottom: none;
}

.abana-lista-regras li.em-edicao {
  background: var(--cor-secao);
  border-radius: var(--raio);
}

.abana-lista-regras li:hover .abana-icone-acao {
  opacity: 1;
}

.abana-acoes-regra {
  display: inline-flex;
  align-items: center;
  gap: 0.2rem;
  flex-shrink: 0;
}

.abana-acoes-regra a.abana-icone-acao {
  text-decoration: none;
}

/* O ✕ das janelinhas usa .abana-icone-acao, que nasce invisível (padrão
   revelar-no-hover das linhas) — aqui ele fica sempre visível, senão a
   janelinha parece não ter como fechar (bug reportado pelo Daniel). */
.abana-janelinha-cabecalho .abana-icone-acao {
  opacity: 1;
}

/* Calendário da janelinha de prazo (print do Asana como referência). */
.abana-calendario-cabecalho {
  display: flex;
  align-items: center;
  justify-content: space-between;
  font-size: 0.85rem;
}

.abana-calendario-cabecalho button {
  background: transparent;
  border: none;
  color: var(--cor-texto-suave);
  cursor: pointer;
  font-size: 1rem;
  padding: 0.1rem 0.5rem;
}

.abana-calendario-cabecalho button:hover {
  color: var(--cor-texto);
}

.abana-calendario-grade {
  display: grid;
  grid-template-columns: repeat(7, 1fr);
  gap: 0.1rem;
  text-align: center;
}

.abana-calendario-semana {
  font-size: 0.7rem;
  color: var(--cor-texto-suave);
  padding: 0.2rem 0;
}

.abana-calendario-dia {
  background: transparent;
  border: 1px solid transparent;
  border-radius: 50%;
  color: var(--cor-texto);
  cursor: pointer;
  font-size: 0.8rem;
  width: 1.9rem;
  height: 1.9rem;
  padding: 0;
  margin: 0 auto;
  display: flex;
  align-items: center;
  justify-content: center;
}

.abana-calendario-dia:hover {
  background: var(--cor-secao);
}

.abana-calendario-dia.fora {
  color: var(--cor-texto-suave);
  opacity: 0.6;
}

.abana-calendario-dia.hoje {
  border-color: var(--cor-secundaria);
}

.abana-calendario-dia.selecionado {
  background: var(--cor-secundaria);
  color: #FFFFFF;
}

.abana-calendario-rodape {
  display: flex;
  align-items: center;
  justify-content: space-between;
  border-top: 1px solid var(--cor-borda);
  padding-top: 0.5rem;
}

.abana-calendario-hora {
  display: inline-flex;
  align-items: center;
  gap: 0.4rem;
}

.abana-calendario-hora input[type="time"] {
  border: 1px solid var(--cor-borda);
  background: var(--cor-fundo);
  color: var(--cor-texto);
  border-radius: var(--raio);
  padding: 0.2rem 0.4rem;
  font-size: 0.8rem;
}

/* Grupo esquerdo do rodapé do cartão (prazo + responsável vazio). */
.abana-rodape-esquerda {
  display: inline-flex;
  align-items: center;
  gap: 0.3rem;
}

/* Selo do responsável clicável (abre a janelinha de responsável). */
.abana-responsavel-botao {
  display: inline-flex;
  background: transparent;
  border: none;
  padding: 0;
  cursor: pointer;
}

.abana-responsavel-botao:disabled {
  cursor: default;
}

/* Ícones de ação dentro dos campos do painel (ex.: remover recorrência)
   aparecem ao passar o mouse no campo — mesma regra das listas. */
.abana-painel-campo:hover .abana-icone-acao {
  opacity: 1;
}

/* Selects com a mesma cara das janelinhas (pedido do Daniel): sem a
   roupagem nativa, borda fina, seta própria em cinza neutro (funciona
   nos dois temas). A lista aberta continua a nativa do navegador. */
select {
  appearance: none;
  -webkit-appearance: none;
  background-color: var(--cor-fundo);
  color: var(--cor-texto);
  border: 1px solid var(--cor-borda);
  border-radius: var(--raio);
  padding: 0.3rem 1.7rem 0.3rem 0.6rem;
  font-size: 0.85rem;
  cursor: pointer;
  background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23888888' stroke-width='2'><path d='M6 9l6 6 6-6'/></svg>");
  background-repeat: no-repeat;
  background-position: right 0.5rem center;
  background-size: 0.75rem;
}

select:hover {
  border-color: var(--cor-texto-suave);
}

select:focus {
  outline: none;
  border-color: var(--cor-secundaria);
}

/* Toast do rodapé ("Tarefa concluída — Desfazer"): flutua embaixo, some
   sozinho em alguns segundos. */
.abana-toast {
  position: fixed;
  bottom: 1.2rem;
  left: 50%;
  transform: translateX(-50%);
  z-index: 130;
  display: flex;
  align-items: center;
  gap: 0.7rem;
  background: var(--cor-fundo);
  border: 1px solid var(--cor-borda);
  border-radius: var(--raio);
  box-shadow: 0 8px 24px rgba(0, 0, 0, 0.25);
  padding: 0.5rem 0.9rem;
  font-size: 0.85rem;
}

.abana-toast-fechar {
  background: transparent;
  border: none;
  color: var(--cor-texto-suave);
  cursor: pointer;
  padding: 0.1rem 0.2rem;
}

/* Notificação estilizada (issue #91): faixa no topo, no lugar do alert cru
   do navegador. A variante de erro ganha a borda/realce na cor de erro.
   Funciona nos dois temas (usa as variáveis). */
.abana-notificacao {
  position: fixed;
  top: 1.2rem;
  left: 50%;
  transform: translateX(-50%);
  z-index: 140;
  display: flex;
  align-items: center;
  gap: 0.75rem;
  max-width: min(90vw, 520px);
  background: var(--cor-fundo);
  border: 1px solid var(--cor-borda);
  border-left: 4px solid var(--cor-secundaria);
  border-radius: var(--raio);
  box-shadow: 0 8px 24px rgba(0, 0, 0, 0.25);
  padding: 0.7rem 1rem;
  font-size: 0.9rem;
  color: var(--cor-texto);
}
.abana-notificacao-erro {
  border-left-color: var(--cor-erro);
}
.abana-notificacao-fechar {
  flex-shrink: 0;
  background: transparent;
  border: none;
  color: var(--cor-texto-suave);
  cursor: pointer;
  padding: 0.1rem 0.3rem;
  font-size: 0.9rem;
  line-height: 1;
}
.abana-notificacao-fechar:hover,
.abana-notificacao-fechar:focus-visible {
  color: var(--cor-texto);
}

/* Abas Início/Conclusão do calendário (print do Asana). */
.abana-calendario-abas {
  display: flex;
  gap: 0.4rem;
}

.abana-calendario-abas button {
  flex: 1;
  background: transparent;
  border: 1px solid transparent;
  border-radius: var(--raio);
  color: var(--cor-texto-suave);
  cursor: pointer;
  font-size: 0.8rem;
  padding: 0.3rem 0.4rem;
}

.abana-calendario-abas button.ativa {
  border-color: var(--cor-borda);
  color: var(--cor-texto);
  font-weight: 600;
}

/* Anexos de comentário: pendentes no compositor e prontos no comentário. */
.abana-anexos-pendentes,
.abana-anexos-do-comentario {
  list-style: none;
  margin: 0.3rem 0 0;
  padding: 0;
  font-size: 0.8rem;
  display: flex;
  flex-direction: column;
  gap: 0.15rem;
}

.abana-anexos-pendentes li {
  display: flex;
  align-items: center;
  gap: 0.3rem;
}

.abana-anexos-pendentes li:hover .abana-icone-acao {
  opacity: 1;
}

.abana-comentario-acoes {
  display: flex;
  align-items: center;
  justify-content: flex-end;
  gap: 0.5rem;
}

/* O 📎 do compositor fica sempre visível (é uma ação primária ali, não
   um ícone de linha). */
.abana-comentario-acoes .abana-icone-acao {
  opacity: 1;
  cursor: pointer;
}

/* Correção de contraste (bug do Daniel, modo claro): estes botões zeram
   o fundo mas herdavam o color #FFFFFF da regra global de button —
   texto branco invisível sobre fundo claro. */
button.abana-painel-valor-editavel,
.abana-responsavel-botao {
  color: var(--cor-texto);
}

/* Botão "Ver quadro" das configurações do projeto: pílula com destaque,
   em vez de um link solto. */
.abana-ver-quadro {
  display: inline-flex;
  align-items: center;
  gap: 0.35rem;
  background: var(--cor-secundaria);
  color: #FFFFFF;
  border: 1px solid var(--cor-secundaria);
  border-radius: 999px;
  padding: 0.3rem 0.9rem;
  font-size: 0.85rem;
  font-weight: 600;
  text-decoration: none;
  transition: filter 0.15s ease;
}

.abana-ver-quadro:hover,
.abana-ver-quadro:focus-visible {
  filter: brightness(1.15);
  text-decoration: none;
}

/* Prazo vencido no Resumo. */
.abana-prazo-vencido {
  color: var(--cor-erro);
  font-size: 0.8rem;
  font-weight: 600;
}

/* Imagem da página inicial editável. */
.imagem-pagina-inicial {
  max-width: 100%;
  max-height: 320px;
  border-radius: var(--raio);
  margin: 0.5rem 0 1rem;
}

/* Listas de checkbox dos formulários de template (etiquetas e
   participantes do rodízio): horizontais, com respiro. */
.abana-form-automacao ul {
  list-style: none;
  margin: 0.2rem 0;
  padding: 0;
  display: flex;
  flex-wrap: wrap;
  gap: 0.2rem 1rem;
}

.abana-form-automacao ul li label {
  font-weight: normal;
}

/* Issue #159: pool do rodízio nas ações de automação (pessoas ou opções) —
   caixas de seleção que quebram em várias linhas, no mesmo tom das listas. */
.campodin-caixas {
  display: flex;
  flex-wrap: wrap;
  gap: 0.2rem 1rem;
  margin: 0.2rem 0;
}

.campodin-caixas label {
  font-weight: normal;
  display: inline-flex;
  align-items: center;
  gap: 0.3rem;
}

/* Lista "Todos os projetos" (pedido do Daniel): nome como link forte e
   limpo, divisórias finas, ações da linha como ícones discretos que
   aparecem no hover (padrão do sistema). */
.abana-tabela-projetos {
  border-collapse: collapse;
  width: 100%;
}

.abana-tabela-projetos th {
  text-align: left;
  font-size: 0.75rem;
  font-weight: 600;
  color: var(--cor-texto-suave);
  padding: 0.4rem 0.6rem;
  border-bottom: 1px solid var(--cor-borda);
}

.abana-tabela-projetos td {
  padding: 0.55rem 0.6rem;
  border-bottom: 1px solid var(--cor-borda);
  font-size: 0.9rem;
}

.abana-tabela-projetos tr:hover td {
  background: var(--cor-secao);
}

.abana-tabela-projetos tr:hover .abana-icone-acao,
.abana-tabela-projetos .abana-icone-acao:focus-visible {
  opacity: 1;
}

.abana-link-projeto {
  display: inline-flex;
  align-items: center;
  gap: 0.5rem;
  color: var(--cor-texto);
  font-weight: 600;
  text-decoration: none;
}

.abana-link-projeto:hover {
  color: var(--cor-secundaria);
  text-decoration: none;
}

.abana-celula-acoes {
  text-align: right;
  white-space: nowrap;
}

.abana-icone-perigo:hover {
  color: var(--cor-erro);
}

/* Tela Resumo (pedido do Daniel): linhas com divisória fina, contadores
   nas seções e pílulas de atraso/prazo — vermelho só onde é urgência. */
.abana-titulo-resumo {
  display: flex;
  align-items: center;
  gap: 0.5rem;
}

.abana-contador {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  min-width: 1.5rem;
  height: 1.5rem;
  padding: 0 0.4rem;
  border-radius: 999px;
  background: var(--cor-secao);
  color: var(--cor-texto-suave);
  font-size: 0.8rem;
  font-weight: 600;
}

.abana-contador-vermelho {
  background: hsla(0, 70%, 50%, 0.15);
  color: var(--cor-erro);
}

.abana-lista-resumo {
  list-style: none;
  margin: 0.4rem 0 0;
  padding: 0;
}

.abana-linha-resumo {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 0.8rem;
  padding: 0.55rem 0.2rem;
  border-bottom: 1px solid var(--cor-borda);
}

.abana-linha-resumo:last-child {
  border-bottom: none;
}

/* Filete vermelho à esquerda nas atrasadas — urgência visível sem
   transformar a lista num bloco pesado. */
.abana-linha-atrasada {
  border-left: 3px solid var(--cor-erro);
  padding-left: 0.6rem;
}

.abana-resumo-principal {
  display: inline-flex;
  align-items: center;
  flex-wrap: wrap;
  gap: 0.5rem;
  min-width: 0;
}

.abana-resumo-meta {
  display: inline-flex;
  align-items: center;
  gap: 0.5rem;
  flex-shrink: 0;
}

.abana-pill-atraso {
  background: hsla(0, 70%, 50%, 0.15);
  border: 1px solid hsla(0, 70%, 50%, 0.4);
  color: var(--cor-erro);
  font-weight: 600;
}

.abana-pill-prazo {
  background: hsla(40, 90%, 50%, 0.15);
  border: 1px solid hsla(40, 90%, 50%, 0.45);
}

.abana-pill-projeto {
  background: hsla(var(--matiz), 65%, 50%, 0.18);
  border: 1px solid hsla(var(--matiz), 65%, 50%, 0.45);
}

/* Campo "Escolha múltipla" no painel da tarefa (issue #457): as opções
   marcadas como pílulas, e o botão de acrescentar na mesma linha, com
   quebra quando não couber. */
.abana-campo-multi {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 0.3rem;
}

/* O ✕ que tira uma opção da pílula. Ação destrutiva de linha: quase
   invisível em repouso, cheia no hover da pílula e SEMPRE no foco por
   teclado — quem navega sem mouse não pode ficar sem ela.

   As três regras declaram fundo E cor juntos (regra "nunca metade" do
   CLAUDE.md): o fundo da pílula é colorido pela matiz da opção, então
   deixar a cor do ✕ para a herança é como o texto some. */
.abana-pill-remover {
  background: transparent;
  border: none;
  margin-left: 0.25rem;
  padding: 0;
  color: var(--cor-texto);
  opacity: 0.35;
  font-size: 0.75rem;
  line-height: 1;
  cursor: pointer;
}

.abana-pill:hover .abana-pill-remover {
  background: transparent;
  color: var(--cor-texto);
  opacity: 1;
}

.abana-pill-remover:focus-visible {
  background: transparent;
  color: var(--cor-texto);
  opacity: 1;
  outline: 2px solid var(--cor-secundaria);
  outline-offset: 1px;
}

/* Tela "Minha foto": foto redonda grande (clicável pra ver em tamanho
   real), iniciais quando não há foto, e o seletor de arquivo escondido
   atrás de um rótulo-botão (escolheu, salvou — sem botão Salvar). */
.perfil-foto-linha {
  display: flex;
  align-items: center;
  gap: 1.5rem;
  flex-wrap: wrap;
}

.perfil-foto-grande {
  width: 8rem;
  height: 8rem;
  border-radius: 50%;
  object-fit: cover;
  border: 2px solid var(--cor-borda);
  transition: filter 0.15s ease;
}

a:hover .perfil-foto-grande {
  filter: brightness(1.08);
  border-color: var(--cor-secundaria);
}

.perfil-foto-iniciais {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  background: var(--cor-secao);
  color: var(--cor-texto-suave);
  font-size: 2.4rem;
  font-weight: 600;
}

.perfil-foto-acoes {
  display: flex;
  flex-direction: column;
  gap: 0.5rem;
  align-items: flex-start;
}

.perfil-escolher-foto {
  cursor: pointer;
}

.perfil-escolher-foto input[type="file"] {
  display: none;
}

/* Foto expandida num <dialog> (pedido do Daniel: sem botões na tela —
   ampliar, substituir e apagar moram no diálogo). */
.perfil-foto-botao {
  background: transparent;
  border: none;
  padding: 0;
  cursor: zoom-in;
  display: inline-flex;
}

.perfil-foto-dialogo {
  border: 1px solid var(--cor-borda);
  border-radius: var(--raio);
  background: var(--cor-fundo);
  color: var(--cor-texto);
  padding: 1rem;
  max-width: min(26rem, 90vw);
}

.perfil-foto-dialogo::backdrop {
  background: rgba(0, 0, 0, 0.55);
}

.perfil-foto-expandida {
  display: block;
  width: 100%;
  max-height: 60vh;
  object-fit: contain;
  border-radius: var(--raio);
}

.perfil-foto-dialogo-acoes {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 0.8rem;
  margin-top: 0.8rem;
}

/* Os três botões do diálogo da foto: pílulas iguais em forma e tamanho,
   minimalistas (contorno fino, fundo transparente), cada uma com sua cor
   semântica — azul de destaque, vermelho destrutivo, neutro — e o
   preenchimento só no hover. */
.perfil-botao-dialogo {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  min-width: 6.5rem;
  padding: 0.35rem 1rem;
  border-radius: 999px;
  font-size: 0.85rem;
  font-weight: 600;
  cursor: pointer;
  background: transparent;
  border: 1px solid var(--cor-borda);
  color: var(--cor-texto-suave);
  transition: background 0.15s ease, color 0.15s ease, border-color 0.15s ease;
}

.perfil-botao-dialogo:hover,
.perfil-botao-dialogo:focus-visible {
  background: var(--cor-secao);
  color: var(--cor-texto);
}

.perfil-botao-dialogo.destaque {
  border-color: var(--cor-secundaria);
  color: var(--cor-secundaria);
}

.perfil-botao-dialogo.destaque:hover,
.perfil-botao-dialogo.destaque:focus-visible {
  background: var(--cor-secundaria);
  color: #FFFFFF;
}

.perfil-botao-dialogo.perigo {
  border-color: var(--cor-erro);
  color: var(--cor-erro);
}

.perfil-botao-dialogo.perigo:hover,
.perfil-botao-dialogo.perigo:focus-visible {
  background: var(--cor-erro);
  color: #FFFFFF;
}

/* Lápis sutil da página inicial: quase invisível até pousar o mouse no
   título (padrão dos ícones de ação), sempre alcançável por teclado. */
.titulo-editavel {
  display: flex;
  align-items: center;
  gap: 0.5rem;
}

.titulo-editavel .abana-icone-acao {
  font-size: 1rem;
  text-decoration: none;
}

.titulo-editavel:hover .abana-icone-acao,
.titulo-editavel .abana-icone-acao:focus-visible {
  opacity: 1;
}

/* Campos de formulário server-rendered (templates, página inicial):
   rótulo em cima, respiro entre campos. */
.abana-campo-formulario {
  margin: 0 0 0.7rem;
}

.abana-campo-formulario label {
  display: block;
  margin-bottom: 0.2rem;
}

.abana-campo-formulario textarea,
.abana-campo-formulario input[type="text"],
.abana-campo-formulario input[type="number"] {
  width: 100%;
  max-width: 34rem;
  box-sizing: border-box;
}

/* Correção sistêmica do "blob escuro" no hover (bug do Daniel, modo
   claro): a regra global button:hover pinta o fundo com --cor-primaria,
   e todo botão-ícone transparente que não declarava o próprio fundo de
   hover herdava isso — pílula/ícone viravam um borrão escuro com texto
   ilegível. Aqui, TODOS os botões de roupagem transparente ganham hover
   neutro (fundo suave da seção); os que já definem o próprio hover
   continuam vencendo por virem com mais especificidade ou depois. */
.abana-adicionar-tarefa:hover,
.abana-calendario-abas button:hover,
.abana-calendario-cabecalho button:hover,
.abana-chip-comentarios:hover,
.abana-chip-subtarefas:hover,
.abana-curtir:hover,
.abana-icone-acao:hover,
.abana-janelinha-lista button:hover,
.abana-menu-coluna-itens button:hover,
.abana-painel-fechar:hover,
.abana-painel-novo-lembrete button:hover,
.abana-painel-subtarefa-titulo:hover,
.abana-prazo-mini:hover,
.abana-responsavel-botao:hover,
.abana-toast-fechar:hover,
.perfil-foto-botao:hover {
  background: var(--cor-secao);
  border-color: transparent;
}

/* Exceções: o check de conclusão e o prazo tracejado mantêm o próprio
   contorno no hover (o fundo continua neutro). */
.abana-check-tarefa:hover {
  background: transparent;
  border-color: var(--cor-sucesso);
}

/* O botão de falha precisa vir DEPOIS do hover genérico acima (mesma
   especificidade), senão herda o contorno verde. Fundo neutro + borda
   vermelha no hover. */
.abana-check-falha:hover {
  background: transparent;
  border-color: var(--cor-erro);
}

.abana-prazo-mini.vazio:hover {
  border-color: var(--cor-texto-suave);
}

/* Versão do sistema no pé da barra lateral — quase invisível, mas lá. */
/* Escopado em .barra-lateral pra vencer a regra genérica ".barra-lateral a"
   (mais específica que ".versao-do-sistema" sozinha) e manter o tom dim/
   pequeno da versão agora que ela vive DENTRO da barra. */
.barra-lateral .versao-do-sistema {
  display: block;
  margin-top: auto;
  padding: 0.6rem 0.75rem;
  font-size: 0.7rem;
  color: var(--cor-texto-suave);
  opacity: 0.7;
  text-decoration: none;
}

.versao-do-sistema:hover {
  opacity: 1;
  color: var(--cor-texto);
  text-decoration: underline;
}

/* Bolinha de novidades não vistas (issue #8) ao lado da versão. */
.bolinha-novidades {
  display: inline-block;
  width: 7px;
  height: 7px;
  border-radius: 50%;
  background: var(--cor-secundaria);
  margin-left: 0.3rem;
  vertical-align: middle;
}

/* Banner-link de atualização (issue #8): discreto, some sozinho ao
   visitar as Novidades. Declara fundo, borda E cor nos dois estados —
   regra do CLAUDE.md. */
.banner-novidades {
  display: block;
  margin: 0 0 1rem;
  padding: 0.5rem 0.9rem;
  border: 1px solid var(--cor-borda);
  border-radius: var(--raio);
  background: var(--cor-secao);
  color: var(--cor-texto);
  font-size: 0.85rem;
  text-decoration: none;
}

.banner-novidades:hover,
.banner-novidades:focus-visible {
  background: var(--cor-secao);
  border-color: var(--cor-secundaria);
  color: var(--cor-texto);
  text-decoration: underline;
}

.novidade-versao ul {
  margin: 0.4rem 0 0;
  padding-left: 1.2rem;
}

.novidade-versao li {
  margin-bottom: 0.35rem;
}

.barra-lateral.encolhida .versao-do-sistema {
  display: none;
}

/* Central de Ajuda (issue #146): página de leitura longa — largura de
   texto confortável, respiro entre seções e divisórias finas (diretriz
   "respiro em vez de caixas"). Cores só das variáveis do tema, sem
   estado que troque fundo ou texto pela metade. */
.ajuda-pagina {
  max-width: 46rem;
}

.ajuda-introducao {
  color: var(--cor-texto-suave);
}

.ajuda-sumario {
  margin: 1.2rem 0 2rem;
  padding: 0.9rem 1.2rem;
  border: 1px solid var(--cor-borda);
  border-radius: var(--raio);
  background: var(--cor-secao);
  color: var(--cor-texto);
  font-size: 0.9rem;
}

.ajuda-sumario ul {
  margin: 0.4rem 0 0;
  padding-left: 1.2rem;
}

.ajuda-sumario li {
  margin-bottom: 0.2rem;
}

.ajuda-pagina section {
  margin-bottom: 2.4rem;
  padding-top: 0.4rem;
  border-top: 1px solid var(--cor-borda);
}

.ajuda-pagina h3 {
  margin-top: 1.6rem;
}

.ajuda-pagina li {
  margin-bottom: 0.35rem;
}

.ajuda-rodape {
  color: var(--cor-texto-suave);
  font-size: 0.9rem;
}

/* Pontinho de cor nas listas de janelinha (opções de seleção). */
.abana-ponto-de-cor {
  display: inline-block;
  width: 0.6rem;
  height: 0.6rem;
  border-radius: 50%;
  flex-shrink: 0;
}

/* O painel de filtro cresceu (campos dinâmicos + critérios extras):
   rola por dentro em vez de estourar a tela. */
.abana-filtro-painel {
  max-height: 70vh;
  overflow-y: auto;
}

.abana-filtro-criterio {
  display: flex;
  align-items: center;
  gap: 0.4rem;
  font-size: 0.85rem;
  font-weight: normal;
}

.abana-filtro-faixa {
  display: flex;
  align-items: center;
  gap: 0.3rem;
}

.abana-filtro-faixa input {
  width: 6.5rem;
  min-width: 0;
}

/* Título do cartão como textarea elástico: sem barra própria, cresce
   junto com o texto (o JS ajusta a altura ao conteúdo). */
.abana-tarefa-linha textarea.abana-titulo-tarefa {
  resize: none;
  overflow: hidden;
  min-height: 1.6rem;
  font-family: inherit;
}

/* O check e as ações alinham pelo TOPO quando o título quebra linha —
   centralizar num cartão de 3 linhas deixava tudo flutuando no meio.
   (O align-self vence a regra antiga ".abana-tarefa-linha > *" que
   centralizava cada filho.) */
.abana-tarefa-linha {
  align-items: flex-start;
}

.abana-tarefa-linha > * {
  align-self: flex-start;
}

.abana-tarefa-linha > .abana-check-tarefa,
.abana-tarefa-linha > .abana-icone-acao,
.abana-tarefa-linha > .abana-responsavel-botao,
.abana-tarefa-linha > details {
  margin-top: 0.25rem;
}

/* Scroll por coluna (pedido do Daniel, exemplo do Asana): o quadro ocupa
   a altura útil da janela e cada coluna rola por dentro — a página não
   rola mais inteira por causa de uma coluna cheia.
   Issue #41: a altura exata é calculada pelo Board.jsx a partir da
   posição real do quadro (banner de dev, aviso de novidades, título em
   duas linhas etc. mudam o topo) — o valor abaixo é só o ponto de
   partida até o JS medir. */
.abana-quadro {
  height: calc(100vh - 205px);
  min-height: 320px;
  align-items: stretch;
}

.abana-coluna {
  display: flex;
  flex-direction: column;
  max-height: 100%;
}

.abana-coluna .abana-lista-tarefas {
  overflow-y: auto;
  flex: 1;
  min-height: 2rem;
  scrollbar-width: thin;
}

/* Editor de opções da seleção única (aba Campos): linhas limpas com a
   bolinha de cor redonda de verdade — a .bolinha-de-cor original é um
   rótulo de radio da paleta do projeto e ficava disforme como botão. */
.abana-lista-opcoes {
  list-style: none;
  margin: 0.2rem 0 0.4rem;
  padding: 0;
  display: flex;
  flex-direction: column;
  gap: 0.2rem;
  max-width: 24rem;
}

/* Nas automações, as linhas de condição/ação usam a largura toda do
   formulário (dois seletores por linha cabem lado a lado) — issue #159. */
.abana-form-automacao .abana-lista-opcoes {
  max-width: 100%;
}

.abana-lista-opcoes li {
  display: flex;
  align-items: center;
  flex-wrap: wrap;
  gap: 0.3rem 0.6rem;
  padding: 0.25rem 0.3rem;
  border-radius: var(--raio);
}

/* Issue #176: o nome da opção ocupa a sobra da linha, empurrando as ações
   (↑ ↓ ✕) pra a direita — sem isso elas ficavam grudadas no texto e a
   coluna de ícones não alinhava entre as opções. */
.abana-opcao-nome {
  flex: 1;
  min-width: 4rem;
}

/* Issue #530: o nome da opção virou campo editável, e ele deve PARECER
   texto comum (diretriz de edição inline do CLAUDE.md) — a caixa só
   aparece ao passar o mouse ou ao focar. As três regras declaram fundo E
   cor do texto juntos, nos dois temas, porque é regra de estado mexendo
   em fundo (a "nunca metade" do CLAUDE.md, conferida por
   core/lint_contraste.py). */
.abana-lista-opcoes li > input.abana-opcao-nome-editavel {
  background: transparent;
  color: var(--cor-texto);
  border: 1px solid transparent;
  border-radius: var(--raio);
  padding: 0.1rem 0.3rem;
  font: inherit;
  flex: 1 1 6rem;
}

.abana-lista-opcoes li > input.abana-opcao-nome-editavel:hover {
  background: var(--cor-campo);
  color: var(--cor-texto);
  border-color: var(--cor-borda);
}

.abana-lista-opcoes li > input.abana-opcao-nome-editavel:focus {
  background: var(--cor-campo);
  color: var(--cor-texto);
  border-color: var(--cor-borda-campo);
  outline: none;
}

/* Issue #529: pegador de arraste da opção. Discreto o tempo todo (é
   affordance, não ação destrutiva) e cheio quando o mouse chega à linha —
   o mesmo comportamento dos ícones de ação ao lado. */
.abana-pegador {
  cursor: grab;
  color: var(--cor-texto-suave);
  opacity: 0.45;
  user-select: none;
  line-height: 1;
}

.abana-lista-opcoes li:hover .abana-pegador {
  opacity: 1;
}

.abana-pegador:active,
.abana-opcao-linha.arrastando .abana-pegador {
  cursor: grabbing;
}

/* A linha que está sendo arrastada: apagada, para o lugar de destino (o
   vão que ela abre entre as outras) ser o que chama atenção. */
.abana-opcao-linha.arrastando {
  opacity: 0.4;
}

/* Recado do editor de opções (nome repetido, nome vazio) — some assim que
   a pessoa corrige. */
.abana-erro-inline {
  display: block;
  color: var(--cor-erro);
  font-size: 0.85rem;
  margin-top: 0.2rem;
}

/* Os seletores/campos das linhas do construtor precisam ENCOLHER (min-width:0)
   para não estourar a caixa quando a opção é longa — ex.: "Definir o
   responsável igual a um campo de Pessoa" — e QUEBRAR para a linha de baixo
   quando não couberem lado a lado (issue #159). O pool de caixas do rodízio
   ocupa a linha inteira. */
.abana-lista-opcoes li > select,
.abana-lista-opcoes li > input,
.abana-lista-opcoes li > textarea {
  min-width: 0;
  max-width: 100%;
  flex: 1 1 10rem;
}

.abana-lista-opcoes li > .campodin-caixas {
  flex: 1 1 100%;
}

.abana-lista-opcoes li:hover {
  background: var(--cor-secao);
}

.abana-lista-opcoes li:hover .abana-icone-acao {
  opacity: 1;
}

.abana-lista-opcoes li .abana-icone-acao {
  margin-left: auto;
}

.bolinha-editor {
  width: 1.15rem;
  height: 1.15rem;
  min-width: 1.15rem;
  border-radius: 50%;
  border: 2px solid transparent;
  background: hsl(var(--matiz, 210), 65%, 50%);
  cursor: pointer;
  padding: 0;
  transition: transform 0.12s ease, border-color 0.12s ease;
}

.bolinha-editor:hover,
.bolinha-editor:focus-visible {
  transform: scale(1.15);
  border-color: var(--cor-texto-suave);
  background: hsl(var(--matiz, 210), 65%, 50%);
}

/* Issue #179: janelinha com TODAS as cores da paleta, aberta pela bolinha.
   Antes cada clique avançava uma cor e era preciso clicar até chegar na
   desejada. As bolinhas de dentro reaproveitam .bolinha-editor, que já
   declara fundo, borda e hover por conta própria — regra do CLAUDE.md:
   botão com roupagem própria não herda metade do estilo global. */
.paleta-popover {
  position: fixed;
  display: grid;
  grid-template-columns: repeat(4, 1.5rem);
  gap: 0.5rem;
  padding: 0.6rem;
  background: var(--cor-fundo);
  border: 1px solid var(--cor-borda);
  border-radius: var(--raio);
  box-shadow: 0 4px 12px rgba(0, 0, 0, 0.18);
  z-index: 1000;
}

.paleta-popover .bolinha-editor {
  width: 1.5rem;
  height: 1.5rem;
  min-width: 1.5rem;
}

/* A cor que está valendo agora fica anelada, pra achar de relance. */
.paleta-popover .bolinha-editor.escolhida {
  border-color: var(--cor-texto);
}

.abana-nova-opcao {
  display: flex;
  align-items: center;
  gap: 0.6rem;
  max-width: 24rem;
}

.abana-nova-opcao input {
  flex: 1;
}

/* --- "O que não conta como interação" (issue #452) --------------------------
   Cardápio de sugestões da regra do Monitoramento do Znuny: o que o
   monitoramento viu se repetindo na fila, a um clique de virar exclusão.
   Cada chip declara fundo, borda E cor do texto nos DOIS estados e nos
   DOIS temas — a "regra nunca metade" do CLAUDE.md (o
   core/lint_contraste.py confere). */
.abana-sugestoes-avisos {
  display: flex;
  flex-wrap: wrap;
  gap: 0.4rem;
  margin-top: 0.4rem;
}

/* O parágrafo de apoio ocupa a linha inteira, para os chips começarem
   embaixo dele e não ao lado. */
.abana-sugestoes-avisos .abana-ajuda-campo {
  flex: 1 0 100%;
  margin: 0;
}

.abana-sugestao-aviso {
  display: inline-flex;
  align-items: baseline;
  gap: 0.4rem;
  font-size: 0.78rem;
  font-weight: 400;
  padding: 0.2rem 0.6rem;
  border-radius: 999px;
  border: 1px dashed var(--cor-borda);
  background: var(--cor-secao);
  color: var(--cor-texto);
  cursor: pointer;
  max-width: 100%;
}

.abana-sugestao-aviso:hover,
.abana-sugestao-aviso:focus-visible {
  border-color: var(--cor-secundaria);
  border-style: solid;
  background: var(--cor-campo);
  color: var(--cor-texto);
}

/* A contagem explica POR QUE o assunto está sendo sugerido; fica apagada
   para o trecho do assunto continuar sendo o que se lê primeiro. */
.abana-sugestao-conta {
  font-size: 0.7rem;
  color: var(--cor-texto-suave);
}

/* Coluna no estilo do Asana (pedido do Daniel): o CABEÇALHO é uma barra
   própria, destacada; o corpo da coluna fica transparente e os cartões
   carregam o tom elevado. Estas regras vencem as antigas por virem
   depois com a mesma especificidade. */
.abana-coluna {
  background: transparent;
  border: none;
  padding: 0 0.2rem;
}

.abana-coluna-cabecalho {
  background: var(--cor-secao);
  border: 1px solid var(--cor-borda);
  border-radius: var(--raio);
  padding: 0.45rem 0.7rem;
  margin-bottom: 0.6rem;
}

.abana-tarefa {
  background: var(--cor-secao);
}

/* Contador de tarefas ao lado do nome (como no print do Asana). */
.abana-contador-coluna {
  color: var(--cor-texto-suave);
  font-size: 0.8rem;
  font-weight: 600;
  padding: 0 0.3rem;
}

/* ⚡ da ordenação automática no cabeçalho da coluna. */
.abana-raio-ordenacao {
  font-size: 0.8rem;
  cursor: default;
}

/* Somatórios dos campos "somar no quadro" (issue #118): faixa discreta
   entre o título e os cartões — uma linha por campo, rótulo suave à
   esquerda e total em destaque à direita. Sem caixa pesada: fundo tênue
   e divisória fina, no espírito "respiro" das diretrizes de UI. */
.abana-somas-coluna {
  display: flex;
  flex-direction: column;
  gap: 0.15rem;
  margin-bottom: 0.6rem;
  padding: 0.35rem 0.6rem;
  background: color-mix(in srgb, var(--cor-secao) 55%, var(--cor-fundo));
  border: 1px solid var(--cor-borda);
  border-radius: var(--raio);
}

.abana-soma-campo {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  gap: 0.5rem;
  font-size: 0.8rem;
}

.abana-soma-rotulo {
  color: var(--cor-texto-suave);
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.abana-soma-valor {
  font-weight: 700;
  white-space: nowrap;
}

/* Previsão ponderada da etapa (issues #716/#717): faixa logo abaixo da soma
   bruta da coluna. Mesma forma da soma — rótulo apagado, valor firme — para
   as duas se lerem como a mesma pergunta respondida de dois jeitos. Cores
   declaradas aqui, nunca herdadas: a faixa é desenhada por cima do fundo do
   quadro, que pode ser de qualquer matiz. */
/* A faixa leva a classe `dica` junto, para herdar o BALÃO do sistema (o
   mesmo do ⓘ) com a explicação inteira — a coluna tem 300px e o texto não
   cabe. Estas duas regras vêm DEPOIS de `.dica` no arquivo e por isso
   vencem o `display: inline-flex` e a margem dela, que são do ⓘ. */
.abana-previsao-coluna.dica {
  display: flex;
  margin: -0.4rem 0 0.6rem;
}

.abana-previsao-coluna {
  position: relative;
  display: flex;
  justify-content: space-between;
  align-items: baseline;
  gap: 0.4rem;
  margin: -0.4rem 0 0.6rem;
  padding: 0.3rem 0.6rem;
  background: color-mix(in srgb, var(--cor-secao) 55%, var(--cor-fundo));
  border: 1px solid var(--cor-borda);
  border-radius: var(--raio);
  color: var(--cor-texto);
  font-size: 0.82rem;
  /* A faixa recebe foco (é ela que abre o balão pelo teclado), então o
     anel de foco declara as duas cores, como manda a regra "nunca
     metade". */
  cursor: help;
}

.abana-previsao-coluna:focus-visible {
  outline: 2px solid var(--cor-primaria);
  outline-offset: 1px;
  background: color-mix(in srgb, var(--cor-secao) 55%, var(--cor-fundo));
  color: var(--cor-texto);
}

/* O balão da faixa é mais largo que o do ⓘ: a explicação tem três frases,
   e uma coluna de 300px espremeria tudo em oito linhas. */
.abana-previsao-coluna > .dica-balao {
  width: 20rem;
  max-width: min(20rem, 90vw);
  white-space: normal;
}

/* Abas de painéis (epic #140, fatia 4c): um projeto tem vários painéis
   (compartilhados e privados). Divisória fina de baixo contraste, sem caixas —
   a aba ativa marca com uma linha embaixo (estilo Asana). */
.abana-painel-abas {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 0.25rem;
  border-bottom: 1px solid var(--cor-borda);
  margin-bottom: 1rem;
}

.abana-painel-aba {
  background: none;
  border: none;
  border-bottom: 2px solid transparent;
  color: var(--cor-texto-suave);
  padding: 0.5rem 0.8rem;
  margin-bottom: -1px; /* a linha ativa cobre a divisória */
  border-radius: 0;
  font-size: 0.95rem;
  cursor: pointer;
  white-space: nowrap;
}
.abana-painel-aba:hover { color: var(--cor-texto); background: var(--cor-secao); }
.abana-painel-aba.ativa {
  color: var(--cor-texto);
  border-bottom-color: var(--cor-primaria);
  font-weight: 600;
}
.abana-painel-aba-cadeado { margin-right: 0.3rem; font-size: 0.8em; }
.abana-painel-aba-nova { color: var(--cor-primaria); font-weight: 600; }

/* Formulário de novo painel: nome + escolha de visibilidade. */
.abana-painel-novo { display: grid; gap: 0.75rem; margin-bottom: 1rem; }
.abana-painel-campo { display: grid; gap: 0.3rem; }
.abana-painel-vis { display: flex; flex-wrap: wrap; gap: 1rem; }
.abana-painel-vis label { display: inline-flex; align-items: center; gap: 0.35rem; font-weight: 400; }
.abana-painel-novo-acoes { display: flex; gap: 0.5rem; }

/* Barra de gestão do painel ativo: nome editável inline (revela borda só no
   hover/foco), pílula de visibilidade e excluir discreto. */
.abana-painel-config {
  display: flex;
  align-items: center;
  gap: 0.6rem;
  margin-bottom: 0.75rem;
}
.abana-painel-nome-edit {
  background: none;
  border: 1px solid transparent;
  border-radius: var(--raio);
  color: var(--cor-texto);
  font-size: 1.05rem;
  font-weight: 600;
  padding: 0.2rem 0.4rem;
  max-width: 22rem;
}
.abana-painel-nome-edit:hover { border-color: var(--cor-borda); }
.abana-painel-nome-edit:focus { border-color: var(--cor-primaria); outline: none; }

/* Pílula de visibilidade: cor suave, arredondada; clique alterna o estado. */
.abana-pilula-vis {
  border: none;
  border-radius: 999px;
  padding: 0.2rem 0.7rem;
  font-size: 0.8rem;
  font-weight: 600;
  cursor: pointer;
}
.abana-pilula-vis.compartilhado {
  background: hsl(145, 45%, 88%);
  color: hsl(145, 55%, 25%);
}
.abana-pilula-vis.privado {
  background: hsl(35, 70%, 88%);
  color: hsl(35, 70%, 28%);
}
.abana-pilula-vis:disabled { opacity: 0.6; cursor: not-allowed; }
:root[data-theme="dark"] .abana-pilula-vis.compartilhado { background: hsl(145, 30%, 25%); color: hsl(145, 55%, 82%); }
:root[data-theme="dark"] .abana-pilula-vis.privado { background: hsl(35, 35%, 28%); color: hsl(35, 70%, 82%); }
@media (prefers-color-scheme: dark) {
  :root:not([data-theme="light"]) .abana-pilula-vis.compartilhado { background: hsl(145, 30%, 25%); color: hsl(145, 55%, 82%); }
  :root:not([data-theme="light"]) .abana-pilula-vis.privado { background: hsl(35, 35%, 28%); color: hsl(35, 70%, 82%); }
}

/* Pílula de SITUAÇÃO (não clicável): usada na tela de Saúde para o estado de
   cada destino de backup. Mesma roupagem da pílula de visibilidade, sem o
   cursor de clique. Cada variante declara FUNDO E COR DO TEXTO nos dois
   temas — regra do CLAUDE.md: metade da regra é o que já fez texto sumir. */
.abana-pilula {
  display: inline-block;
  border: none;
  border-radius: 999px;
  padding: 0.2rem 0.7rem;
  font-size: 0.8rem;
  font-weight: 600;
}
.abana-pilula-ok { background: hsl(145, 45%, 88%); color: hsl(145, 55%, 25%); }
.abana-pilula-alerta { background: hsl(5, 70%, 90%); color: hsl(5, 60%, 30%); }
.abana-pilula-neutra { background: hsl(210, 15%, 90%); color: hsl(210, 12%, 32%); }
:root[data-theme="dark"] .abana-pilula-ok { background: hsl(145, 30%, 25%); color: hsl(145, 55%, 82%); }
:root[data-theme="dark"] .abana-pilula-alerta { background: hsl(5, 40%, 30%); color: hsl(5, 75%, 85%); }
:root[data-theme="dark"] .abana-pilula-neutra { background: hsl(210, 12%, 28%); color: hsl(210, 15%, 80%); }
@media (prefers-color-scheme: dark) {
  :root:not([data-theme="light"]) .abana-pilula-ok { background: hsl(145, 30%, 25%); color: hsl(145, 55%, 82%); }
  :root:not([data-theme="light"]) .abana-pilula-alerta { background: hsl(5, 40%, 30%); color: hsl(5, 75%, 85%); }
  :root:not([data-theme="light"]) .abana-pilula-neutra { background: hsl(210, 12%, 28%); color: hsl(210, 15%, 80%); }
}
/* "Salvar como template": botão-texto discreto (declara fundo/borda/cor nos
   dois estados e temas — não herda a regra global de botão azul). */
.abana-painel-link-acao {
  background: none;
  border: none;
  color: var(--cor-primaria);
  padding: 0.2rem 0.3rem;
  font-size: 0.85rem;
  cursor: pointer;
  white-space: nowrap;
}
.abana-painel-link-acao:hover:not(:disabled) { background: none; text-decoration: underline; }
.abana-painel-link-acao:disabled { color: var(--cor-texto-suave); cursor: not-allowed; opacity: 0.7; }

.abana-painel-tpl-desc { margin: -0.25rem 0 0; font-size: 0.85rem; }

/* "Gerenciar templates" fica à direita, separado das abas de painel. */
.abana-painel-gerenciar-tpl { margin-left: auto; }

/* Lista do gerenciador de templates: linhas com respiro, divisória fina. */
.abana-tpl-lista { list-style: none; margin: 0.5rem 0 0; padding: 0; }
.abana-tpl-lista > li { border-top: 1px solid var(--cor-borda); }
.abana-tpl-lista > li:first-child { border-top: none; }
.abana-tpl-linha {
  display: flex;
  align-items: center;
  flex-wrap: wrap;
  gap: 0.5rem;
  padding: 0.5rem 0;
}
.abana-tpl-nome { flex: 1 1 12rem; }
.abana-tpl-nome-ro { flex: 1 1 12rem; font-weight: 600; }
.abana-tpl-meta { color: var(--cor-texto-suave); font-size: 0.82rem; white-space: nowrap; }

.abana-painel-excluir { color: var(--cor-perigo, hsl(0, 60%, 50%)); margin-left: auto; }

/* Painel do projeto (issue #119): grade de indicadores. Cada cartão traz
   um número grande (o total) e, opcionalmente, a quebra por etapa. */
.abana-painel-cartoes {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(15rem, 1fr));
  gap: 1rem;
  margin: 1rem 0;
}

.abana-painel-cartao {
  background: var(--cor-secao);
  border: 1px solid var(--cor-borda);
  border-radius: var(--raio);
  padding: 0.9rem 1rem;
  /* Âncora da alça de redimensionar (canto inferior direito). */
  position: relative;
}

/* Alça de arrastar (⠿) pra reordenar; alça de redimensionar (⤡) no canto. */
.abana-painel-arrastar { cursor: grab; }

.abana-painel-redimensionar {
  position: absolute;
  right: 3px;
  bottom: 2px;
  cursor: ew-resize;
  color: var(--cor-texto-suave);
  opacity: 0.45;
  font-size: 0.9rem;
  line-height: 1;
  padding: 2px;
  user-select: none;
  touch-action: none;
}
.abana-painel-cartao:hover .abana-painel-redimensionar { opacity: 1; }

/* Indicador maximizado (⛶): overlay escuro + caixa grande centralizada. */
.abana-painel-modal {
  position: fixed;
  inset: 0;
  z-index: 100;
  background: rgba(0, 0, 0, 0.55);
  display: flex;
  align-items: center;
  justify-content: center;
  padding: 2rem;
}

.abana-painel-modal-conteudo {
  background: var(--cor-secao);
  border: 1px solid var(--cor-borda);
  border-radius: var(--raio);
  padding: 1rem 1.2rem;
  width: min(1100px, 95vw);
  max-height: 92vh;
  overflow: auto;
}

/* Drill-down: clicar num número/barra/fatia mostra os itens por trás. */
.abana-painel-clicavel { cursor: pointer; }
.abana-drill { width: min(720px, 95vw); }

.abana-drill-lista {
  list-style: none;
  margin: 0.6rem 0 0;
  padding: 0;
}
.abana-drill-lista li {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  gap: 0.8rem;
  padding: 0.35rem 0.2rem;
  border-bottom: 1px solid var(--cor-borda);
}
.abana-drill-titulo { color: var(--cor-texto); text-decoration: none; }
.abana-drill-titulo:hover { text-decoration: underline; }
.abana-drill-meta {
  display: inline-flex;
  align-items: baseline;
  gap: 0.6rem;
  color: var(--cor-texto-suave);
  font-size: 0.85rem;
  white-space: nowrap;
}
.abana-drill-ganho { color: hsl(145, 55%, 45%); }
.abana-drill-perda { color: hsl(0, 65%, 58%); }

.abana-painel-cartao-topo {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  gap: 0.5rem;
}

.abana-painel-cartao-titulo {
  color: var(--cor-texto-suave);
  font-size: 0.85rem;
}

/* As ações (mover/remover) só aparecem ao passar o mouse ou focar —
   ícones discretos, como nas outras listas do sistema. */
.abana-painel-cartao .abana-acoes-regra {
  display: inline-flex;
  gap: 0.1rem;
}

/* No Painel a edição precisa ser DESCOBRÍVEL. O .abana-icone-acao é
   opacity:0 por padrão no resto do sistema (revelado só no hover da linha);
   aqui as ações ficam SEMPRE visíveis (discretas) e destacam no hover.
   Mirar o ícone, não o container — senão a opacity:0 do ícone vence. */
.abana-painel-cartao .abana-icone-acao {
  opacity: 0.6;
}
.abana-painel-cartao:hover .abana-icone-acao,
.abana-painel-cartao .abana-icone-acao:focus-visible {
  opacity: 1;
}

.abana-painel-cartao .abana-acoes-regra form { display: inline; }
.abana-painel-cartao:hover .abana-acoes-regra,
.abana-painel-cartao:focus-within .abana-acoes-regra {
  opacity: 1;
}

.abana-painel-cartao-total {
  font-size: 1.7rem;
  font-weight: 700;
  margin: 0.2rem 0 0.4rem;
}

.abana-painel-quebra {
  list-style: none;
  margin: 0;
  padding: 0.4rem 0 0;
  border-top: 1px solid var(--cor-borda);
  display: flex;
  flex-direction: column;
  gap: 0.2rem;
}

.abana-painel-quebra li {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  gap: 0.5rem;
  font-size: 0.85rem;
}

.abana-painel-quebra-nome {
  color: var(--cor-texto-suave);
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.abana-painel-quebra-valor {
  font-weight: 600;
  white-space: nowrap;
}

/* Resumo dos filtros ativos no rodapé do cartão do painel. */
.abana-painel-filtros {
  display: block;
  margin-top: 0.4rem;
}

/* Bloco de filtros no formulário de adicionar indicador — agrupado, com
   respiro, sem a moldura crua do <fieldset> do navegador. */
.abana-painel-filtros-form {
  border: 1px solid var(--cor-borda);
  border-radius: var(--raio);
  padding: 0.6rem 0.8rem 0.8rem;
  margin: 0.6rem 0;
}

.abana-painel-filtros-form legend {
  padding: 0 0.4rem;
  color: var(--cor-texto-suave);
  font-size: 0.85rem;
}

/* Painel React (epic #140): total menor por cima do gráfico (o KPI usa o
   .abana-painel-cartao-total grande), e as ações do formulário. */
.abana-painel-total-pequeno {
  font-size: 1.05rem;
  margin: 0 0 0.3rem;
}

.abana-painel-form-acoes {
  display: flex;
  align-items: center;
  gap: 0.8rem;
  margin-top: 0.6rem;
}

/* Corpo da coluna com fundo próprio (referência do Asana, pedido do
   Daniel): um painel contínuo atrás dos cartões, do cabeçalho ao
   "+ Adicionar tarefa" — o scroll continua por dentro. */
.abana-corpo-coluna {
  background: color-mix(in srgb, var(--cor-secao) 55%, var(--cor-fundo));
  border: 1px solid var(--cor-borda);
  border-radius: var(--raio);
  padding: 0.5rem;
  display: flex;
  flex-direction: column;
  flex: 1;
  min-height: 0;
}

.abana-corpo-coluna .abana-lista-tarefas {
  margin: 0 0 0.3rem;
}

/* O campo de criar tarefa NÃO estica: o flex:1 de .abana-titulo-tarefa é
   do layout do cartão, e aqui (filho do corpo flex vertical) fazia o
   campo crescer pra preencher a coluna — o "título gigante" do print. */
.abana-corpo-coluna > .abana-titulo-tarefa {
  flex: 0 0 auto;
}

/* Linha de montagem de condição das automações. */
.abana-nova-condicao {
  display: flex;
  align-items: center;
  gap: 0.4rem;
  flex-wrap: wrap;
  margin: 0.4rem 0;
}

/* Campo de criar tarefa: mesmo elástico do título do cartão. */
textarea.abana-titulo-novo {
  resize: none;
  overflow: hidden;
  min-height: 1.8rem;
  font-family: inherit;
}

/* Nos construtores (opções/condições) o ✕ fica SEMPRE visível — regra
   do CLAUDE.md: ação primária não se esconde (Daniel não achava como
   apagar condições). */
.abana-lista-opcoes .abana-icone-acao {
  opacity: 1;
}

/* Sugestões de @ no comentário da automação. */
.abana-mencao-automacao {
  position: relative;
}

.abana-mencao-automacao .sugestoes {
  position: absolute;
  left: 0;
  right: 0;
  top: 100%;
  z-index: 50;
  background: var(--cor-fundo);
  border: 1px solid var(--cor-borda);
  border-radius: var(--raio);
  box-shadow: 0 6px 18px rgba(0, 0, 0, 0.2);
  max-height: 12rem;
  overflow-y: auto;
  display: flex;
  flex-direction: column;
}

/* `display: flex` acima vence o `display: none` que o navegador dá a
   [hidden] — sem esta linha a caixa de sugestões fica SEMPRE na tela,
   vazia, por baixo do campo de texto. */
.abana-mencao-automacao .sugestoes[hidden] {
  display: none;
}

.abana-mencao-automacao .sugestoes button {
  background: transparent;
  border: none;
  color: var(--cor-texto);
  text-align: left;
  padding: 0.35rem 0.6rem;
  cursor: pointer;
}

/* Hover, foco E a linha escolhida pelas setas do teclado (.ativa) pintam
   igual — e as três declaram fundo E cor do texto, nunca metade (regra
   do CLAUDE.md). */
.abana-mencao-automacao .sugestoes button:hover,
.abana-mencao-automacao .sugestoes button:focus-visible,
.abana-mencao-automacao .sugestoes button.ativa {
  background: var(--cor-secao);
  color: var(--cor-texto);
}

/* Linhas do construtor de condições: controles agrupados à esquerda,
   quebrando com respiro — antes o ✕ herdava margin-left:auto da lista
   de opções e voava pra borda direita do fieldset (print do Daniel). */
#lista-de-condicoes li {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 0.4rem;
  max-width: 100%;
}

#lista-de-condicoes li .abana-icone-acao {
  margin-left: 0;
}

#lista-de-condicoes input[type="number"],
#lista-de-condicoes input[type="text"] {
  width: 7rem;
}

/* Campo de tempo (número + unidade) e botão de data do construtor. */
.abana-campo-de-tempo {
  display: inline-flex;
  align-items: center;
  gap: 0.3rem;
}

.abana-campo-de-tempo input[type="number"] {
  width: 4.5rem;
}

button.abana-botao-data {
  background: transparent;
  border: 1px dashed var(--cor-borda);
  border-radius: var(--raio);
  color: var(--cor-texto);
  cursor: pointer;
  padding: 0.25rem 0.6rem;
  font-size: 0.85rem;
}

button.abana-botao-data:hover {
  background: var(--cor-secao);
  color: var(--cor-texto);
  border-color: var(--cor-texto-suave);
}

/* Documentação da API/CLI dentro da página de Tokens (issue: manual do
   token): a doc completa vem de um .md e pode ter tabelas largas — a
   rolagem horizontal fica SÓ na caixa, nunca na página. Cores pelo tema
   (conferido no claro e no escuro). Os exemplos curtos usam o mesmo
   visual, mais compacto. */
.doc-markdown,
.doc-exemplo {
  background: var(--cor-secao);
  border: 1px solid var(--cor-borda);
  border-radius: var(--raio);
  color: var(--cor-texto);
  padding: 0.8rem 1rem;
  overflow-x: auto;
  white-space: pre;
  font-size: 0.85rem;
  line-height: 1.5;
  tab-size: 2;
}

.doc-markdown {
  max-height: 70vh;
  overflow-y: auto;
}

.doc-exemplo {
  margin: 0.3rem 0 0.8rem;
}

/* Overlay de ajuda dos atalhos de teclado (issue #34) — modal simples,
   centralizado, visível nos dois temas. */
.atalhos-overlay {
  position: fixed;
  inset: 0;
  z-index: 1000;
  display: flex;
  align-items: center;
  justify-content: center;
  padding: 1rem;
  background: rgba(0, 0, 0, 0.5);
}

.atalhos-overlay[hidden] {
  display: none;
}

.atalhos-caixa {
  width: min(28rem, 100%);
  max-height: 85vh;
  overflow-y: auto;
  padding: 1.1rem 1.3rem 1.3rem;
  background: var(--cor-fundo);
  border: 1px solid var(--cor-borda);
  border-radius: var(--raio);
  box-shadow: 0 10px 30px rgba(0, 0, 0, 0.35);
}

.atalhos-cabecalho {
  display: flex;
  align-items: center;
  justify-content: space-between;
  margin-bottom: 0.6rem;
}

.atalhos-cabecalho h2 {
  margin: 0;
  font-size: 1rem;
  color: var(--cor-texto);
}

.atalhos-fechar {
  background: transparent;
  border: none;
  color: var(--cor-texto-suave);
  font-size: 1.4rem;
  line-height: 1;
  cursor: pointer;
  padding: 0 0.2rem;
}

.atalhos-fechar:hover,
.atalhos-fechar:focus {
  color: var(--cor-texto);
  outline: none;
}

.atalhos-secao-titulo {
  margin: 0.9rem 0 0.4rem;
  font-size: 0.78rem;
  font-weight: 600;
  text-transform: none;
  color: var(--cor-texto-suave);
}

.atalhos-lista {
  margin: 0;
  display: grid;
  grid-template-columns: auto 1fr;
  gap: 0.3rem 0.7rem;
}

.atalhos-lista > div {
  display: contents;
}

.atalhos-lista dt {
  margin: 0;
}

.atalhos-lista dd {
  margin: 0;
  font-size: 0.85rem;
  color: var(--cor-texto);
  align-self: center;
}

.atalhos-lista kbd {
  display: inline-block;
  padding: 0.08rem 0.4rem;
  font-family: inherit;
  font-size: 0.75rem;
  color: var(--cor-texto);
  background: var(--cor-secao);
  border: 1px solid var(--cor-borda);
  border-radius: 4px;
  white-space: nowrap;
}

/* ===== Fundo personalizável do quadro (issue #37) =====================
   A matiz efetiva (do projeto ou pessoal) chega em --fundo-matiz no <main>
   da página do quadro, marcado por [data-fundo]. O tom é suave de propósito
   (o quadro tem que continuar legível) e vem em DUAS calibragens: escuro
   (padrão, casa com :root) e claro (html[data-theme="light"]). As colunas
   mantêm o próprio fundo (--cor-secao), então o tom aparece atrás e nas
   frestas. A matiz é a mesma paleta dos ícones de projeto. */
.conteudo-principal[data-fundo] {
  /* Gradiente de DUAS cores (pedido #106): em vez de dois tons da mesma
     matiz, o degradê vai da cor escolhida (--fundo-matiz) a uma segunda
     cor harmônica, deslocada +45° no círculo de cores — dá aquele efeito
     de "azul → roxo" do exemplo do Daniel, seja qual for a cor escolhida.
     As colunas mantêm --cor-secao por cima, então o texto continua
     legível; o gradiente aparece atrás, no topo e nas frestas. */
  background: linear-gradient(140deg,
    hsl(var(--fundo-matiz) 70% 30%),
    hsl(calc(var(--fundo-matiz) + 70) 60% 12%));
  background-attachment: fixed;
}

html[data-theme="light"] .conteudo-principal[data-fundo] {
  background: linear-gradient(140deg,
    hsl(var(--fundo-matiz) 90% 93%),
    hsl(calc(var(--fundo-matiz) + 70) 75% 78%));
  background-attachment: fixed;
}

/* Bolinha "Padrão" (sem cor) na paleta de fundo: neutra, com um risco
   diagonal indicando "nenhuma". Reaproveita .bolinha-de-cor. */
.bolinha-de-cor.bolinha-padrao {
  background:
    linear-gradient(to top right,
      transparent calc(50% - 1px), var(--cor-erro) calc(50% - 1px),
      var(--cor-erro) calc(50% + 1px), transparent calc(50% + 1px)),
    var(--cor-secao);
  border: 1px solid var(--cor-borda);
}

/* Avisos na tela para todos (issue #85): faixa efêmera, dispensável, no
   topo do conteúdo. Cores vêm das variáveis de tema, então funciona em
   claro e escuro. O tom "alerta" puxa a cor de erro; "info", a secundária. */
.avisos-globais {
  display: flex;
  flex-direction: column;
  gap: 0.5rem;
}
.aviso-global {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 0.75rem;
  padding: 0.6rem 0.9rem;
  border-radius: 8px;
  border: 1px solid var(--cor-borda);
  border-left: 4px solid var(--cor-secundaria);
  background: var(--cor-secao);
  color: var(--cor-texto);
  font-size: 0.95rem;
}
.aviso-global-alerta {
  border-left-color: var(--cor-erro);
}

/* Aviso de valores iguais entre campos personalizados (issue #502) — o
   mesmo desenho do aviso global, no tom "aviso"; fundo E texto declarados
   juntos (regra do nunca metade), e as variáveis já trocam nos dois
   temas. O "Saber mais" é um details nativo. */
.abana-aviso-campos {
  padding: 0.6rem 0.9rem;
  margin: 0.5rem 0 0.75rem;
  border-radius: 8px;
  border: 1px solid var(--cor-borda);
  border-left: 4px solid var(--cor-aviso);
  background: var(--cor-secao);
  color: var(--cor-texto);
  font-size: 0.9rem;
}

.abana-aviso-campos p {
  margin: 0.3rem 0;
}

.abana-aviso-campos summary {
  cursor: pointer;
  color: var(--cor-primaria);
}

/* O exemplo fictício de cartão ambíguo fica com cara de citação, pra não
   se confundir com um aviso sobre dados reais do projeto. */
.abana-aviso-campos-exemplo {
  border-left: 3px solid var(--cor-borda);
  padding-left: 0.75rem;
  color: var(--cor-texto-suave);
}
.aviso-global-fechar {
  flex-shrink: 0;
  background: transparent;
  border: none;
  color: var(--cor-texto-suave);
  cursor: pointer;
  font-size: 0.9rem;
  line-height: 1;
  padding: 0.2rem 0.35rem;
}
.aviso-global-fechar:hover,
.aviso-global-fechar:focus {
  color: var(--cor-texto);
}

/* Alvo de comunicado (issue "escolher quem recebe"): caixas de seleção de
   grupos/usuários na página Comunicados — claras e empilhadas, sem o
   <select multiple> cru. */
.comunicado-alvo {
  border: 1px solid var(--cor-borda);
  border-radius: 8px;
  padding: 0.75rem 1rem;
  margin: 0.75rem 0;
}
.comunicado-alvo legend {
  padding: 0 0.4rem;
  font-weight: 600;
}
.comunicado-alvo-coluna {
  margin-top: 0.6rem;
}
.comunicado-alvo-titulo {
  display: block;
  font-weight: 600;
  margin-bottom: 0.25rem;
}
.comunicado-alvo-opcao {
  display: flex;
  align-items: center;
  gap: 0.4rem;
  padding: 0.15rem 0;
  font-weight: 400;
}

/* ==========================================================================
   Comemoração ao concluir tarefa (issue #98, pedido #31 da Ana)
   Overlay leve, sem captura de clique, que sobe uma criatura a cada tarefa
   concluída. Some sozinho (JS) e respeita prefers-reduced-motion (no fim).
   ========================================================================== */
.abana-comemoracao {
  position: fixed;
  inset: 0;
  z-index: 2000;            /* acima do painel de detalhe e de tudo mais */
  pointer-events: none;     /* NUNCA rouba clique — é só enfeite */
  display: flex;
  align-items: center;
  justify-content: center;
  overflow: hidden;
}
.abana-comemoracao.saindo { opacity: 0; transition: opacity 0.5s ease; }

.abana-comemoracao-palco {
  position: relative;
  display: flex;
  align-items: center;
  justify-content: center;
}

/* A criatura (nomodo.png no sucesso, matheus.jpg na centena). */
.abana-comemoracao-figura {
  width: min(38vw, 240px);
  height: auto;
  filter: drop-shadow(0 14px 30px rgba(0, 0, 0, 0.35));
  animation: abana-comemoracao-subir 2.2s ease-out forwards;
}
.abana-comemoracao-centena .abana-comemoracao-figura {
  width: min(52vw, 340px);
  border-radius: 18px;
  animation: abana-comemoracao-centena 3.4s cubic-bezier(0.2, 0.7, 0.2, 1) forwards;
}

@keyframes abana-comemoracao-subir {
  0%   { transform: translateY(42vh) scale(0.35); opacity: 0; }
  18%  { transform: translateY(6vh) scale(1.05); opacity: 1; }
  30%  { transform: translateY(0) scale(1); }
  72%  { transform: translateY(-8vh) scale(1); opacity: 1; }
  100% { transform: translateY(-34vh) scale(0.9); opacity: 0; }
}
@keyframes abana-comemoracao-centena {
  0%   { transform: translateY(46vh) scale(0.3) rotate(-6deg); opacity: 0; }
  16%  { transform: translateY(4vh) scale(1.12) rotate(3deg); opacity: 1; }
  28%  { transform: translateY(0) scale(1) rotate(0deg); }
  45%  { transform: translateY(-2vh) scale(1.03) rotate(-2deg); }
  60%  { transform: translateY(0) scale(1) rotate(2deg); }
  80%  { transform: translateY(-6vh) scale(1) rotate(0deg); opacity: 1; }
  100% { transform: translateY(-36vh) scale(0.92); opacity: 0; }
}

/* Selo "100!" da centena. */
.abana-comemoracao-selo {
  position: absolute;
  top: -14px;
  right: -18px;
  background: var(--cor-sucesso, #2e9e5b);
  color: #fff;
  font-weight: 800;
  font-size: 1.4rem;
  padding: 0.35rem 0.75rem;
  border-radius: 999px;
  box-shadow: 0 6px 16px rgba(0, 0, 0, 0.3);
  transform: rotate(8deg);
  animation: abana-comemoracao-selo 3.4s ease-out forwards;
}
@keyframes abana-comemoracao-selo {
  0%, 14%  { transform: rotate(8deg) scale(0); opacity: 0; }
  22%      { transform: rotate(8deg) scale(1.3); opacity: 1; }
  30%      { transform: rotate(8deg) scale(1); }
  85%      { opacity: 1; }
  100%     { opacity: 0; }
}

/* Rostinho triste da falha — desenhado, herda a cor do tema. */
.abana-comemoracao-triste {
  width: min(30vw, 180px);
  height: auto;
  color: var(--cor-texto-suave, #8a94a6);
  animation: abana-comemoracao-triste 2.2s ease-out forwards;
}
.abana-comemoracao-triste-cara { fill: none; stroke: currentColor; stroke-width: 5; }
.abana-comemoracao-triste-olho { fill: currentColor; }
.abana-comemoracao-triste-boca { fill: none; stroke: currentColor; stroke-width: 5; stroke-linecap: round; }
.abana-comemoracao-triste-lagrima { fill: #5aa8e6; }
@keyframes abana-comemoracao-triste {
  0%   { transform: translateY(24vh) scale(0.5) rotate(-4deg); opacity: 0; }
  20%  { transform: translateY(0) scale(1) rotate(0deg); opacity: 1; }
  35%  { transform: translateY(0) rotate(-3deg); }
  50%  { transform: translateY(0) rotate(3deg); }
  65%  { transform: translateY(0) rotate(0deg); }
  85%  { opacity: 1; }
  100% { transform: translateY(6vh) scale(0.95); opacity: 0; }
}

/* Brilhos que espalham do centro — puro enfeite. */
.abana-comemoracao-brilhos { position: absolute; inset: 0; }
.abana-comemoracao-brilhos i {
  position: absolute;
  top: 50%;
  left: 50%;
  width: 12px;
  height: 12px;
  margin: -6px 0 0 -6px;
  border-radius: 50%;
  background: var(--cor-sucesso, #2e9e5b);
  opacity: 0;
  animation: abana-comemoracao-brilho 2.2s ease-out forwards;
}
.abana-comemoracao-centena .abana-comemoracao-brilhos i { background: #f2b705; }
.abana-comemoracao-brilhos i:nth-child(1) { --ang: 0deg; }
.abana-comemoracao-brilhos i:nth-child(2) { --ang: 60deg; }
.abana-comemoracao-brilhos i:nth-child(3) { --ang: 120deg; }
.abana-comemoracao-brilhos i:nth-child(4) { --ang: 180deg; }
.abana-comemoracao-brilhos i:nth-child(5) { --ang: 240deg; }
.abana-comemoracao-brilhos i:nth-child(6) { --ang: 300deg; }
@keyframes abana-comemoracao-brilho {
  0%, 20%  { transform: rotate(var(--ang)) translateY(0) scale(0.4); opacity: 0; }
  35%      { opacity: 1; }
  100%     { transform: rotate(var(--ang)) translateY(-160px) scale(1); opacity: 0; }
}

/* Botão "copiar link da tarefa" (issue #145): confirma em verde ao copiar. */
.abana-painel-copiar-link.copiado { color: var(--cor-sucesso, #2e9e5b); }

/* Menos animação por quem pediu: mostra e some, sem voar pela tela. */
@media (prefers-reduced-motion: reduce) {
  .abana-comemoracao-figura,
  .abana-comemoracao-triste,
  .abana-comemoracao-selo {
    animation: abana-comemoracao-esmaece 2.0s ease-out forwards;
  }
  .abana-comemoracao-brilhos { display: none; }
  @keyframes abana-comemoracao-esmaece {
    0%   { transform: none; opacity: 0; }
    15%  { opacity: 1; }
    80%  { opacity: 1; }
    100% { opacity: 0; }
  }
}

/* ==========================================================================
   Erros do sistema (issue #158) — tela de administração.
   Cores derivadas das variáveis de tema (--cor-*), então funciona igual no
   modo claro e no escuro. Pílulas e destaques usam borda + cor de texto (não
   fundo preenchido) pra nunca cair no texto invisível de um dos temas.
   ========================================================================== */
.erros-intro {
  color: var(--cor-texto-suave);
  max-width: 70ch;
  margin-bottom: 1.5rem;
}

/* Controles de notificação por categoria */
.erros-linha-notificacao {
  display: flex;
  align-items: center;
  gap: 0.6rem;
  padding: 0.5rem 0;
  border-bottom: 1px solid var(--cor-borda);
  cursor: pointer;
}
.erros-linha-notificacao:last-of-type { border-bottom: none; }
.erros-linha-notificacao input[type="checkbox"] { flex: none; }
.erros-linha-notificacao > span:first-of-type { flex: 1; }
.erros-contagem { color: var(--cor-texto-suave); font-size: 0.85em; }

/* Filtro por categoria (pílulas). A ativa fica destacada com a cor de
   acento — indicador de filtro aplicado. */
.erros-filtros {
  display: flex;
  flex-wrap: wrap;
  gap: 0.5rem;
  margin: 1.25rem 0;
}
.erros-pilula-filtro {
  display: inline-block;
  padding: 0.25rem 0.75rem;
  border-radius: 999px;
  border: 1px solid var(--cor-borda);
  color: var(--cor-texto-suave);
  text-decoration: none;
  font-size: 0.85em;
}
.erros-pilula-filtro:hover { border-color: var(--cor-secundaria); }
.erros-pilula-filtro.ativa {
  border-color: var(--cor-secundaria);
  color: var(--cor-secundaria);
  font-weight: 600;
}

/* Lista de erros */
.erros-lista { list-style: none; padding: 0; margin: 0; }
.erros-item {
  padding: 1rem 0;
  border-bottom: 1px solid var(--cor-borda);
}
.erros-item-cabecalho {
  display: flex;
  align-items: center;
  gap: 0.6rem;
  flex-wrap: wrap;
  margin-bottom: 0.4rem;
}
.erros-item-titulo { font-weight: 600; }
.erros-badge-ocorrencias {
  font-size: 0.8em;
  color: var(--cor-texto-suave);
  border: 1px solid var(--cor-borda);
  border-radius: 999px;
  padding: 0.05rem 0.5rem;
}

/* Pílula da categoria (borda colorida por tipo, texto na mesma cor) */
.erros-pilula {
  display: inline-block;
  padding: 0.1rem 0.6rem;
  border-radius: 999px;
  font-size: 0.78em;
  font-weight: 600;
  border: 1px solid var(--cor-borda);
  color: var(--cor-texto-suave);
  white-space: nowrap;
}
.erros-pilula-erro_interno { border-color: var(--cor-erro); color: var(--cor-erro); }
.erros-pilula-seguranca { border-color: var(--cor-aviso); color: var(--cor-aviso); }
.erros-pilula-host_invalido { border-color: var(--cor-borda); color: var(--cor-texto-suave); }
.erros-pilula-outro { border-color: var(--cor-secundaria); color: var(--cor-secundaria); }

.erros-item-explicacao { margin: 0.2rem 0; }
.erros-item-meta {
  color: var(--cor-texto-suave);
  font-size: 0.85em;
  margin: 0.5rem 0 0;
}
.erros-item-meta code {
  background: var(--cor-secao);
  border-radius: 4px;
  padding: 0.05rem 0.3rem;
  word-break: break-all;
}

/* Detalhe técnico (log cru) */
.erros-detalhe-tecnico { margin-top: 0.6rem; }
.erros-detalhe-tecnico summary {
  cursor: pointer;
  color: var(--cor-secundaria);
  font-size: 0.9em;
}
.erros-detalhe-tecnico code { word-break: break-all; }
.erros-traceback {
  background: var(--cor-secao);
  border: 1px solid var(--cor-borda);
  border-radius: var(--raio);
  padding: 0.75rem;
  overflow-x: auto;
  font-size: 0.8em;
  white-space: pre;
}
.erros-vazio { color: var(--cor-texto-suave); }

/* Painelzinho "quem está no sistema" (issue #86): janelinha flutuante no
   canto inferior direito, pequena e minimizada por padrão. Temas claro e
   escuro saem das variáveis; os pontos de status têm cor própria (verde =
   online, âmbar = ausente, cinza = deslogado) — leem igual nos dois temas. */
.presenca-widget {
  position: fixed;
  /* Issue #178: nasce no canto inferior ESQUERDO. No DIREITO ela cobria o
     botão de enviar comentário do painel da tarefa. A partir do primeiro
     arraste o JS passa a mandar em left/top (e zera bottom). */
  left: 1rem;
  bottom: 1rem;
  width: 230px;
  max-width: calc(100vw - 2rem);
  background: var(--cor-fundo);
  border: 1px solid var(--cor-borda);
  border-radius: var(--raio);
  box-shadow: 0 6px 20px rgba(0, 0, 0, 0.18);
  z-index: 900;
  font-size: 0.9rem;
  overflow: hidden;
}

/* Enquanto arrasta: sem transição e sem seleção de texto acidental. */
.presenca-widget.presenca-arrastando {
  user-select: none;
  cursor: grabbing;
}

.presenca-barra-linha {
  display: flex;
  align-items: stretch;
  background: var(--cor-secao);
}

.presenca-barra {
  display: flex;
  align-items: center;
  gap: 0.5rem;
  flex: 1;
  min-width: 0;
  padding: 0.5rem 0.25rem 0.5rem 0.75rem;
  background: var(--cor-secao);
  border: none;
  border-radius: 0;
  color: var(--cor-texto);
  /* "grab": a barra é a pega de arraste da janelinha (issue #178). */
  cursor: grab;
  text-align: left;
  touch-action: none;  /* o arraste é nosso, não a rolagem da página */
}

.presenca-barra:hover {
  background: var(--cor-secao);
  border: none;
}

.presenca-widget.presenca-arrastando .presenca-barra {
  cursor: grabbing;
}

/* ✕ que oculta a janelinha — discreto, mas sempre alcançável pelo teclado
   (o foco o destaca). O caminho de volta é o item "Quem está no sistema"
   do menu de engrenagem. */
.presenca-ocultar {
  flex: none;
  padding: 0 0.6rem;
  background: var(--cor-secao);
  border: none;
  border-radius: 0;
  color: var(--cor-texto-suave);
  cursor: pointer;
  font-size: 0.85rem;
  line-height: 1;
}

.presenca-ocultar:hover,
.presenca-ocultar:focus-visible {
  background: var(--cor-secao);
  border: none;
  color: var(--cor-texto);
}

.presenca-rotulo { flex: 1; }

.presenca-contagem {
  min-width: 1.4rem;
  padding: 0 0.4rem;
  border-radius: 999px;
  background: var(--cor-secundaria);
  color: #FFFFFF;
  font-size: 0.8rem;
  text-align: center;
}

.presenca-corpo {
  max-height: 40vh;
  overflow-y: auto;
}

.presenca-widget.presenca-minimizada .presenca-corpo {
  display: none;
}

/* Minimizada = CÍRCULO (issue #191). Como barra retangular ela encostava
   na barra lateral e parecia um erro de formatação — um círculo flutuante
   lê como janelinha recolhida, não como pedaço de layout fora do lugar.
   Aberta, a janelinha continua retangular exatamente como antes. */
.presenca-widget.presenca-minimizada {
  width: auto;
  border-radius: 999px;
  /* visible: o ✕ vira um selinho na borda do círculo e não pode ser
     cortado pelo overflow:hidden que a janelinha usa quando aberta. */
  overflow: visible;
}

.presenca-widget.presenca-minimizada .presenca-barra-linha {
  background: transparent;
}

.presenca-widget.presenca-minimizada .presenca-barra {
  width: 3rem;
  height: 3rem;
  padding: 0;
  gap: 0.25rem;
  justify-content: center;
  border-radius: 50%;
  background: transparent;
}

/* "No sistema" não cabe no círculo — some da vista, mas segue no HTML
   pra quem usa leitor de tela (o title do botão também descreve). */
.presenca-widget.presenca-minimizada .presenca-rotulo {
  position: absolute;
  width: 1px;
  height: 1px;
  overflow: hidden;
  clip-path: inset(50%);
  white-space: nowrap;
}

/* Dentro do círculo a contagem é só o número, sem a pílula azul: a
   pílula dentro do círculo virava "bolha na bolha". */
.presenca-widget.presenca-minimizada .presenca-contagem {
  min-width: auto;
  padding: 0;
  background: transparent;
  color: var(--cor-texto);
  font-size: 0.95rem;
}

/* O ✕ sai da linha e vira selinho na borda, discreto: invisível até o
   hover no círculo ou o foco por teclado — nunca some de vez, senão
   ocultar a janelinha viraria caminho sem volta enquanto minimizada. */
.presenca-widget.presenca-minimizada .presenca-ocultar {
  position: absolute;
  top: -0.35rem;
  right: -0.35rem;
  width: 1.25rem;
  height: 1.25rem;
  padding: 0;
  border: 1px solid var(--cor-borda);
  border-radius: 50%;
  background: var(--cor-fundo);
  opacity: 0;
  transition: opacity 0.1s ease;
}

.presenca-widget.presenca-minimizada:hover .presenca-ocultar,
.presenca-widget.presenca-minimizada .presenca-ocultar:focus-visible {
  opacity: 1;
}

.presenca-lista {
  list-style: none;
  margin: 0;
  padding: 0.25rem 0;
}

.presenca-item {
  display: flex;
  align-items: center;
  gap: 0.5rem;
  padding: 0.35rem 0.75rem;
}

.presenca-nome {
  flex: 1;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}

.presenca-estado {
  color: var(--cor-texto-suave);
  font-size: 0.8rem;
}

/* Pessoas deslogadas ficam mais discretas na lista. */
.presenca-item-offline .presenca-nome { color: var(--cor-texto-suave); }

.presenca-ponto {
  flex: none;
  width: 9px;
  height: 9px;
  border-radius: 50%;
  background: #9AA0A6;  /* deslogado (padrão) */
}

.presenca-ponto-online { background: #2E9E5B; }
.presenca-ponto-afk { background: #D99A20; }
.presenca-ponto-offline { background: #9AA0A6; }

/* Campo de texto COM FORMATAÇÃO das telas Django (epic #508): a barra de
   negrito/itálico/listas sobre um contenteditable. Segue a diretriz de
   edição inline — parece texto comum sobre o fundo e só revela a caixa no
   hover ou no foco.

   Toda regra que muda o fundo aqui declara a cor do texto junto (e
   vice-versa), como manda a regra "nunca metade" do CLAUDE.md. */
.texto-rico {
  display: flex;
  flex-direction: column;
  gap: 0.25rem;
}

.texto-rico-barra {
  display: flex;
  gap: 0.15rem;
}

.texto-rico-botao {
  padding: 0.1rem 0.4rem;
  min-width: 1.8rem;
  font-size: 0.85rem;
  font-family: inherit;
  line-height: 1.4;
  color: var(--cor-texto-suave);
  background-color: transparent;
  border: 1px solid transparent;
  border-radius: var(--raio);
  cursor: pointer;
}

.texto-rico-negrito { font-weight: 700; }
.texto-rico-italico { font-style: italic; }

.texto-rico-botao:hover,
.texto-rico-botao:focus-visible {
  color: var(--cor-texto);
  background-color: var(--cor-secao);
  border-color: var(--cor-borda);
}

/* Formato ativo onde o cursor está: aceso, mas ainda discreto. */
.texto-rico-botao.ativo,
.texto-rico-botao[aria-pressed="true"] {
  color: var(--cor-acento);
  background-color: var(--cor-secao);
  border-color: var(--cor-borda);
}

.texto-rico-area {
  min-height: 3.5rem;
  padding: 0.35rem 0.45rem;
  font-size: 0.92rem;
  font-family: inherit;
  line-height: 1.45;
  color: var(--cor-texto);
  background-color: transparent;
  border: 1px solid transparent;
  border-radius: var(--raio);
  /* A área CRESCE com o texto (pedido #97: "que o espaço para a descrição
     seja no mesmo tamanho do texto existente lá") — contenteditable já se
     estica sozinho, então basta não travar a altura. */
  overflow-wrap: anywhere;
}

.texto-rico-area:hover {
  border-color: var(--cor-borda);
  color: var(--cor-texto);
}

.texto-rico-area:focus {
  outline: none;
  background-color: var(--cor-campo);
  border-color: var(--cor-borda-campo);
  color: var(--cor-texto);
}

/* O conteúdo formatado por dentro do editor.

   Estas regras declaram TUDO que desenha uma lista — marcador, display,
   recuo e margem — e com especificidade de sobra (.texto-rico + a área).
   Não é capricho: o editor mora dentro de formulários que já têm regra
   própria para <ul> (as listas de caixinhas de `.abana-form-automacao`
   são `list-style: none` + `display: flex`), e essa regra alcançava a
   lista que o usuário DIGITA — que só está ali por acaso do DOM. O
   resultado foi o pedido #97 voltar com "os tópicos estão quebrados":
   itens lado a lado, sem marcador. Mesma lição do `.papel p` do
   Propoutmos, registrada no CLAUDE.md: quem desenha conteúdo de usuário
   dentro de área alheia declara o próprio desenho por inteiro. */
.texto-rico .texto-rico-area ul,
.texto-rico .texto-rico-area ol {
  display: block;
  margin: 0.2rem 0;
  padding-left: 1.5rem;
  gap: 0;
}

.texto-rico .texto-rico-area ul { list-style: disc outside; }
.texto-rico .texto-rico-area ol { list-style: decimal outside; }

/* Lista dentro de lista continua legível: o marcador muda, como no
   resto do mundo. */
.texto-rico .texto-rico-area ul ul { list-style-type: circle; }
.texto-rico .texto-rico-area ul ul ul { list-style-type: square; }

.texto-rico .texto-rico-area li {
  display: list-item;
  margin: 0;
  padding: 0;
  border: 0;
  background: none;
  color: inherit;
}

.texto-rico-area p {
  margin: 0 0 0.3rem;
}

.texto-rico-area p:last-child {
  margin-bottom: 0;
}

/* Anexos do molde e de cada subtarefa (epic #508). Pílula com o nome do
   arquivo e um ✕ que só marca a remoção — o anexo some quando o template
   for salvo, junto com o resto. */
.template-anexos,
.subtarefa-anexos {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 0.4rem;
  margin: 0.25rem 0;
}

.subtarefa-anexo {
  display: inline-flex;
  align-items: center;
  gap: 0.3rem;
  padding: 0.15rem 0.5rem;
  font-size: 0.82rem;
  color: var(--cor-texto);
  background-color: var(--cor-secao);
  border: 1px solid var(--cor-borda);
  border-radius: 999px;
}

.subtarefa-anexo a {
  color: var(--cor-texto);
  text-decoration: none;
}

.subtarefa-anexo a:hover {
  color: var(--cor-acento);
  text-decoration: underline;
}

.subtarefa-anexo-remover {
  display: inline-flex;
  align-items: center;
  gap: 0.15rem;
  font-size: 0.78rem;
  color: var(--cor-texto-suave);
  cursor: pointer;
}

.subtarefa-anexo-remover:hover {
  color: var(--cor-erro);
}

/* Quando a remoção está marcada, a pílula mostra que aquele anexo vai
   embora no salvamento — texto riscado, e não um sumiço silencioso. */
.subtarefa-anexo:has(input:checked) a {
  color: var(--cor-texto-suave);
  text-decoration: line-through;
}

.subtarefa-anexo-entrada {
  font-size: 0.8rem;
  color: var(--cor-texto-suave);
}

/* Alça de arrastar a subtarefa (epic #508, pedido do dono em 2026-08-13:
   arrastar em vez de setinhas). É um <button> de verdade — pega foco e
   responde às setas ↑/↓ —, então quem usa teclado reordena igual. */
.subtarefa-arrastar {
  flex: none;
  padding: 0 0.25rem;
  font-size: 0.95rem;
  line-height: 1;
  color: var(--cor-texto-suave);
  background-color: transparent;
  border: 1px solid transparent;
  border-radius: var(--raio);
  cursor: grab;
  /* Sem isto o navegador entende o arrasto do dedo como rolagem da
     página e a linha nunca se move no celular. */
  touch-action: none;
}

.subtarefa-arrastar:hover,
.subtarefa-arrastar:focus-visible {
  color: var(--cor-texto);
  background-color: var(--cor-secao);
  border-color: var(--cor-borda);
}

.subtarefa-arrastar:active {
  cursor: grabbing;
  color: var(--cor-texto);
  background-color: var(--cor-secao);
  border-color: var(--cor-borda);
}

/* A linha na mão: sai do fluxo e acompanha o ponteiro (a posição é
   calculada no JS). Fica levantada da página — sombra e uma inclinação
   de um grau — pra se ver de relance qual está sendo movida. */
.subtarefa-linha.arrastando {
  color: var(--cor-texto);
  background-color: var(--cor-fundo);
  border-color: var(--cor-borda-campo);
  box-shadow: 0 8px 20px rgba(0, 0, 0, 0.28);
  transform: rotate(-1deg);
  opacity: 0.97;
  cursor: grabbing;
}

/* O buraco: o espaço que a linha vai ocupar se for solta agora. É o que
   responde "para onde estou levando isto?" enquanto o mouse anda. */
.subtarefa-buraco {
  border: 1px dashed var(--cor-borda-campo);
  border-radius: var(--raio);
  background-color: var(--cor-secao);
}

/* Editor visual de subtarefas do template (issue #188, 2ª rodada — o
   Daniel pediu campo de verdade no lugar da sintaxe "Título | descrição").
   Cada subtarefa é uma linha com título, descrição e parâmetros próprios;
   o ✕ segue a diretriz das ações destrutivas — discreto até o hover, mas
   sempre alcançável pelo teclado. */
.subtarefas-editor {
  display: flex;
  flex-direction: column;
  gap: 0.4rem;
}

.subtarefas-lista {
  display: flex;
  flex-direction: column;
  gap: 0.4rem;
}

.subtarefa-linha {
  display: flex;
  flex-direction: column;
  gap: 0.3rem;
  padding: 0.5rem 0.6rem;
  border: 1px solid var(--cor-borda);
  border-radius: var(--raio);
}

.subtarefa-cabecalho {
  display: flex;
  align-items: center;
  gap: 0.4rem;
}

.subtarefa-linha input.subtarefa-titulo {
  flex: 1;
  min-width: 0;
  width: auto;
  margin: 0;
  padding: 0.3rem 0.4rem;
  font-size: 0.95rem;
  font-family: inherit;
  color: var(--cor-texto);
  background-color: transparent;
  border: 1px solid transparent;
  border-radius: var(--raio);
}

.subtarefa-linha input.subtarefa-titulo:hover {
  border-color: var(--cor-borda);
}

.subtarefa-linha input.subtarefa-titulo:focus {
  outline: none;
  background-color: var(--cor-campo);
  border-color: var(--cor-borda-campo);
}

.subtarefa-remover {
  flex: none;
  padding: 0.15rem 0.35rem;
  background: none;
  border: 0;
  border-radius: var(--raio);
  color: var(--cor-texto-suave);
  cursor: pointer;
  font-size: 0.85rem;
  line-height: 1;
  opacity: 0;
  transition: opacity 0.1s ease;
}

.subtarefa-linha:hover .subtarefa-remover,
.subtarefa-remover:focus {
  opacity: 1;
}

.subtarefa-remover:hover,
.subtarefa-remover:focus {
  background: var(--cor-secao);
  border: 0;
  color: var(--cor-erro);
}

/* A descrição da subtarefa virou campo de texto rico no epic #508 (era um
   <textarea>): a aparência vem de .texto-rico, e aqui fica só o ajuste de
   tamanho para ela caber na linha sem dominá-la. A altura mínima é menor
   que a do campo principal — uma descrição de subtarefa costuma ser uma
   frase — mas cresce com o conteúdo, que era o pedido da Ana. */
.subtarefa-linha .subtarefa-descricao .texto-rico-area {
  min-height: 2.2rem;
  font-size: 0.88rem;
}

.subtarefa-linha .subtarefa-descricao .texto-rico-botao {
  font-size: 0.78rem;
  min-width: 1.6rem;
}

.subtarefa-parametros {
  display: flex;
  flex-wrap: wrap;
  gap: 0.75rem;
}

.subtarefa-parametro {
  display: flex;
  align-items: center;
  gap: 0.35rem;
  font-size: 0.8rem;
  color: var(--cor-texto-suave);
}

.subtarefa-parametro select,
.subtarefa-parametro input[type="number"] {
  width: auto;
  margin: 0;
  padding: 0.2rem 0.35rem;
  font-size: 0.82rem;
  font-family: inherit;
  color: var(--cor-texto);
  background-color: var(--cor-campo);
  border: 1px solid var(--cor-borda-campo);
  border-radius: var(--raio);
}

.subtarefa-parametro input[type="number"] {
  width: 6.5rem;
}

/* Linha de adicionar: mesmo padrão discreto da "Nova categoria" da barra
   lateral — um "+" e um rótulo apagado, caixa só no foco. */
.subtarefa-nova-linha {
  display: flex;
  align-items: center;
  gap: 0.1rem;
}

.subtarefa-mais {
  flex: none;
  padding-left: 0.15rem;
  font-size: 0.95rem;
  line-height: 1;
  color: var(--cor-texto-suave);
}

.subtarefas-editor input.subtarefa-nova {
  flex: 1;
  min-width: 0;
  width: auto;
  margin: 0;
  padding: 0.35rem 0.4rem;
  font-size: 0.9rem;
  font-family: inherit;
  color: var(--cor-texto);
  background-color: transparent;
  border: 1px solid transparent;
  border-radius: var(--raio);
}

.subtarefas-editor input.subtarefa-nova::placeholder {
  color: var(--cor-texto-suave);
}

.subtarefas-editor input.subtarefa-nova:hover {
  border-color: var(--cor-borda);
}

.subtarefas-editor input.subtarefa-nova:focus {
  outline: none;
  background-color: var(--cor-campo);
  border-color: var(--cor-borda-campo);
}

.subtarefa-nova-linha:hover .subtarefa-mais,
.subtarefa-nova-linha:focus-within .subtarefa-mais {
  color: var(--cor-texto);
}

/* Seção "Propostas comerciais" do painel da tarefa (ponte Abana↔
   Propoutmos, 2026-08-01). Só aparece pra quem tem o módulo. */
.abana-propostas { display: flex; flex-direction: column; gap: .4rem; }
.abana-proposta-linha { display: flex; align-items: center; gap: .5rem; flex-wrap: wrap; }
.abana-proposta-linha a { text-decoration: none; }
.abana-proposta-linha a:hover { text-decoration: underline; }
.abana-proposta-meta { color: var(--cor-texto-suave); font-size: .85em; }
.abana-proposta-busca { position: relative; margin-top: .3rem; }
.abana-proposta-busca input { width: 100%; box-sizing: border-box; padding: .35rem .5rem; }
.abana-proposta-sugestoes { position: absolute; z-index: 50; top: calc(100% + 3px); left: 0; right: 0; background: var(--cor-fundo); border: 1px solid var(--cor-borda); border-radius: var(--raio); box-shadow: 0 10px 28px rgba(0,0,0,.28); padding: .3rem; max-height: 14rem; overflow-y: auto; }
.abana-proposta-sugestoes button { display: block; width: 100%; text-align: left; border: 0; background: transparent; color: var(--cor-texto); padding: .4rem .6rem; border-radius: 6px; cursor: pointer; font: inherit; }
.abana-proposta-sugestoes button:hover, .abana-proposta-sugestoes button:focus { background: var(--cor-secao); color: var(--cor-texto); outline: none; }
.abana-proposta-sugestoes small { display: block; color: var(--cor-texto-suave); font-size: .82em; }

/* Seção "Questões comerciais" (pedido do dono, 2026-08-19): itens do negócio
   e propostas juntos, só em quadro de funil de vendas. */
.abana-questoes-comerciais { display: flex; flex-direction: column; }
/* Rótulo de sub-seção. Precisa LER como título, e não como mais uma linha
   de conteúdo — foi essa confusão que o dono reportou em 2026-08-19:
   "Itens do negócio" e "Nenhuma proposta vinculada" pareciam a mesma coisa.
   O que o separa é respiro e uma divisória fina (diretriz "respiro em vez
   de caixas"), com a cor CHEIA do texto: rótulo apagado é para valor ao
   lado, não para título de bloco. Em caixa alta e baixa, sempre. */
.abana-subsecao-rotulo {
  margin: 1.1rem 0 .4rem; padding-top: .8rem;
  border-top: 1px solid var(--cor-borda);
  font-size: .95em; font-weight: 600; color: var(--cor-texto); letter-spacing: 0;
}
/* Um pouco mais de ar antes de cada bloco seguinte, pela mesma razão. */
.abana-questoes-comerciais > .abana-subsecao-rotulo { margin-top: 1.4rem; }
/* O primeiro não leva divisória (o cabeçalho da seção já o separa), mas
   leva RESPIRO: colado no cabeçalho, "Itens do negócio" se lia como parte
   dele, e não como o título do bloco de baixo (reporte do dono). */
.abana-questoes-comerciais > .abana-subsecao-rotulo:first-child {
  margin-top: .35rem; padding-top: 0; border-top: 0;
}
/* Estado vazio que se resolve num clique: parece texto, não botão, mas se
   comporta como ação. Fundo E cor declarados nos dois estados. */
.abana-vazio-acionavel {
  align-self: flex-start; text-align: left;
  background: transparent; color: var(--cor-texto-suave);
  border: 0; border-radius: 6px; padding: .2rem 0;
  cursor: pointer; font: inherit; font-size: .9em;
}
.abana-vazio-acionavel:hover, .abana-vazio-acionavel:focus-visible {
  background: transparent; color: var(--cor-secundaria);
  text-decoration: underline; outline: none;
}
.abana-vazio-acionavel:focus-visible {
  outline: 2px solid var(--cor-secundaria); outline-offset: 2px;
}

/* Seção "Itens do negócio" do painel do cartão (issue #600). Só existe em
   quadro com a chave de funil de vendas ligada — quem decide é o servidor.
   Cada linha é um serviço do catálogo com o seu valor; o valor é edição
   inline (parece texto, revela a caixa no hover/foco), como o resto do
   sistema. */
.abana-itens-negocio { display: flex; flex-direction: column; gap: .25rem; }
/* GRADE, não flex: o campo de valor é um <input>, que tem largura natural
   própria e não encolhe — em flex ele empurrava a coluna do nome até uma
   letra por linha (reporte do dono, 2026-08-19). Com a grade, o nome fica
   com "todo o resto" (minmax(0, 1fr) permite encolher de verdade) e as
   outras duas colunas têm o tamanho do seu conteúdo. */
.abana-item-negocio {
  display: grid;
  grid-template-columns: minmax(0, 1fr) auto auto;
  column-gap: .5rem;
  align-items: baseline;
  padding: .2rem 0;
  border-bottom: 1px solid var(--cor-borda-suave, var(--cor-borda));
}
.abana-item-negocio:last-of-type { border-bottom: 0; }
.abana-item-negocio-nome {
  min-width: 0; color: var(--cor-texto); overflow-wrap: break-word;
}
/* Rótulo e VALOR se distinguem de relance (diretriz de 2026-08-02): a dica
   é menor e apagada; o valor tem a cor cheia do texto. */
.abana-item-negocio-dica {
  display: block; color: var(--cor-texto-suave); font-size: .82em;
}
.abana-item-negocio-valor {
  text-align: right; color: var(--cor-texto);
  font-variant-numeric: tabular-nums; white-space: nowrap;
}
/* Edição inline: parece texto comum e só revela a borda no hover ou no
   foco. Largura FIXA — sem ela o <input> reserva as ~20 letras do padrão do
   navegador e come a coluna do nome. Fundo E cor do texto declarados juntos
   nos dois estados (regra "nunca metade"). */
input.abana-item-negocio-valor {
  width: 7.5rem; max-width: 100%; box-sizing: border-box;
  border: 1px solid transparent; background: transparent; color: var(--cor-texto);
  border-radius: 6px; padding: .15rem .35rem; font: inherit;
}
input.abana-item-negocio-valor::placeholder { color: var(--cor-texto-suave); }
input.abana-item-negocio-valor:hover,
input.abana-item-negocio-valor:focus {
  background: var(--cor-fundo); color: var(--cor-texto);
  border-color: var(--cor-borda); outline: none;
}
/* Em painel estreito a linha vira duas: nome em cima, valor embaixo, à
   direita — melhor que espremer os dois lado a lado. */
@media (max-width: 520px) {
  .abana-item-negocio { grid-template-columns: minmax(0, 1fr) auto; }
  .abana-item-negocio-valor { grid-column: 1 / 2; text-align: left; }
}
.abana-item-negocio-total {
  display: flex; justify-content: space-between; align-items: baseline;
  margin-top: .35rem; padding-top: .35rem;
  border-top: 1px solid var(--cor-borda); color: var(--cor-texto);
}
.abana-item-negocio-total strong { font-variant-numeric: tabular-nums; }
.abana-item-negocio-erro { color: var(--cor-perigo, #d14); font-size: .85em; }
/* Gatilho de ação de um bloco da seção comercial — vale para "Adicionar
   item" E para "Vincular proposta": os dois blocos precisam ter a MESMA
   forma para a mesma ação (reporte do dono, 2026-08-19). Ação primária
   VISÍVEL (diretriz do projeto): não some, e declara fundo, borda e cor do
   texto nos dois estados e nos dois temas. */
.abana-secao-acao {
  align-self: flex-start; margin-top: .3rem;
  background: transparent; color: var(--cor-secundaria);
  border: 1px solid var(--cor-borda); border-radius: 6px;
  padding: .25rem .6rem; cursor: pointer; font: inherit;
}
.abana-secao-acao:hover,
.abana-secao-acao:focus-visible {
  background: var(--cor-secao); color: var(--cor-secundaria);
  border-color: var(--cor-secundaria); outline: none;
}
.abana-item-negocio-busca { position: relative; margin-top: .3rem; }
.abana-item-negocio-busca input { width: 100%; box-sizing: border-box; padding: .35rem .5rem; }
.abana-item-sugestoes {
  position: absolute; z-index: 50; top: calc(100% + 3px); left: 0; right: 0;
  background: var(--cor-fundo); color: var(--cor-texto);
  border: 1px solid var(--cor-borda); border-radius: var(--raio);
  box-shadow: 0 10px 28px rgba(0,0,0,.28); padding: .3rem;
  max-height: 14rem; overflow-y: auto;
}
.abana-item-sugestoes button {
  display: block; width: 100%; text-align: left; border: 0; background: transparent;
  color: var(--cor-texto); padding: .4rem .6rem; border-radius: 6px;
  cursor: pointer; font: inherit;
}
.abana-item-sugestoes button:hover, .abana-item-sugestoes button:focus {
  background: var(--cor-secao); color: var(--cor-texto); outline: none;
}
.abana-item-sugestoes small { display: block; color: var(--cor-texto-suave); font-size: .82em; }

/* Árvore de serviços do catálogo (issue #599): o genérico recolhe e expande
   as próprias variantes. A hierarquia é mostrada pela FORMA — gatilho, recuo
   e traço —, não por uma frase repetida em cada linha. */
.cfg-arvore-gatilho {
  display: inline-flex; align-items: center; gap: .2rem;
  border: 0; background: transparent; color: var(--cor-texto-suave);
  padding: 0 .3rem 0 0; margin-right: .1rem; cursor: pointer; font: inherit;
  border-radius: 4px;
}
/* Fundo E cor do texto declarados juntos nos dois estados — a regra "nunca
   metade" do CLAUDE.md, conferida pelo lint de contraste. */
.cfg-arvore-gatilho:hover, .cfg-arvore-gatilho:focus-visible {
  background: var(--cor-secao); color: var(--cor-secundaria); outline: none;
}
.cfg-arvore-gatilho:focus-visible { outline: 2px solid var(--cor-secundaria); outline-offset: 1px; }
.cfg-arvore-seta { display: inline-block; width: .8em; }
/* Quantas variantes estão escondidas ali embaixo: sem o número, recolher
   esconde sem dizer o quê. */
.cfg-arvore-conta {
  font-size: .78em; color: var(--cor-texto-suave);
  background: var(--cor-secao); border-radius: 999px; padding: 0 .35rem;
}
/* Recuo da variante: o traço e o espaço do gatilho, para os nomes alinharem. */
.cfg-arvore-traco { display: inline-block; width: 1.4em; color: var(--cor-texto-suave); }
.cfg-arvore-vazio { display: inline-block; width: 1.4em; }
.cfg-linha-variante > td:first-child { padding-left: 1.1rem; }
/* Recolher usa CLASSE, nunca o atributo `hidden`: quem manda em `hidden`
   nesta tabela é o filtro de coluna, e dois donos do mesmo interruptor
   deixariam a linha invisível depois de filtrar. */
tr.cfg-variante-oculta { display: none; }

/* --- Tabelas de listagem: ordenar e filtrar por coluna (#282, #283) ------
   Comportamento em core/static/core/js/tabela.js; a tabela só precisa da
   classe "tabela-sistema". */
table.tabela-sistema th { position: relative; }
.tabela-ordenar {
  border: 0; background: transparent; color: inherit; font: inherit;
  padding: 0; cursor: pointer; text-align: left;
}
.tabela-ordenar:hover, .tabela-ordenar:focus-visible {
  /* Declara os três (fundo, borda e cor): o cabeçalho é um <button> e,
     sem isto, herdava o fundo de acento da regra global — acento sobre
     acento, ilegível (reporte do dono, 2026-08-01). */
  background: transparent; border: 0; color: var(--cor-secundaria);
}
.tabela-ordenar:focus-visible { outline: 2px solid var(--cor-secundaria); outline-offset: 2px; }
/* Seta de ordenação: só aparece na coluna que está ordenando. */
table.tabela-sistema th[aria-sort="ascending"] .tabela-ordenar::after { content: ' ↑'; color: var(--cor-secundaria); }
table.tabela-sistema th[aria-sort="descending"] .tabela-ordenar::after { content: ' ↓'; color: var(--cor-secundaria); }
.tabela-filtro { position: relative; display: inline-block; margin-left: .3rem; }
.tabela-filtro-gatilho {
  border: 0; background: transparent; color: var(--cor-texto-suave); cursor: pointer;
  padding: 0 .2rem; border-radius: 4px; font-size: .9em; opacity: .5;
}
th:hover .tabela-filtro-gatilho { opacity: 1; }
.tabela-filtro-gatilho:hover, .tabela-filtro-gatilho:focus {
  opacity: 1; background: transparent; border: 0; color: var(--cor-secundaria);
}
/* Coluna com filtro aplicado fica marcada — o usuário precisa saber por
   que a lista encolheu (diretriz do projeto). */
th.tabela-filtrada .tabela-filtro-gatilho { opacity: 1; color: var(--cor-secundaria); }
th.tabela-filtrada .tabela-ordenar { color: var(--cor-secundaria); }
/* position: fixed, não absolute — o wrapper da tabela tem "overflow-x:
   auto" (rolagem horizontal) e, por regra do CSS, isso corta o que vaza
   dele: nas primeiras colunas o painel abria pra fora e sumia da tela
   (issue #387). O top/left vem do JS na abertura (core/js/tabela.js). */
.tabela-filtro-painel {
  /* max-width pelo mesmo motivo da issue #424: com "fixed" quem resolve a
     largura passa a ser a janela, não mais o cabeçalho da coluna. */
  position: fixed; z-index: 60; max-width: calc(100vw - 2rem);
  background: var(--cor-fundo); border: 1px solid var(--cor-borda);
  border-radius: var(--raio); box-shadow: 0 10px 28px rgba(0,0,0,.28);
  padding: .4rem;
}
.tabela-filtro-painel input {
  padding: .35rem .5rem; font-size: .9rem; min-width: 11rem;
  background-color: var(--cor-campo); color: var(--cor-texto);
  border: 1px solid var(--cor-borda-campo); border-radius: 6px;
}
.tabela-sem-resultado { color: var(--cor-texto-suave); padding: .8rem .3rem; margin: 0; }

/* ==========================================================================
   Sino da central de notificações (issue #189, epic #71).

   É INTERFACE FLUTUANTE: o painel se desenha por cima de qualquer módulo,
   inclusive de regiões com esquema de cor próprio (o "papel" da proposta,
   um preview). Por isso declara as PRÓPRIAS cores — fundo, texto e texto
   suave — em vez de herdar da área que cobre (regra do CLAUDE.md,
   2026-08-02). Toda regra de estado abaixo declara fundo E cor do texto
   juntos, nunca metade.
   ========================================================================== */

.sino {
  position: relative;
}

.sino summary {
  list-style: none;
  cursor: pointer;
  user-select: none;
  display: flex;
  align-items: center;
  justify-content: center;
  position: relative;
  width: 2rem;
  height: 2rem;
  border-radius: 50%;
  /* Estado de repouso declarado por inteiro, pro hover ter de onde sair. */
  background: transparent;
  color: var(--cor-texto-suave);
}

.sino summary::-webkit-details-marker {
  display: none;
}

.sino summary:hover,
.sino summary:focus-visible,
.sino[open] summary {
  /* Verniz translúcido + cor do texto declarada junto. */
  background: rgba(127, 145, 165, 0.16);
  color: var(--cor-texto);
}

.sino-icone {
  width: 1.15rem;
  height: 1.15rem;
  fill: currentColor;
  display: block;
}

/* Contador de não-lidas: fundo de acento com texto branco fixo — os dois
   declarados aqui, porque o branco não vem de variável de tema. */
.sino-contador {
  position: absolute;
  top: -0.1rem;
  right: -0.1rem;
  min-width: 1.05rem;
  height: 1.05rem;
  padding: 0 0.25rem;
  border-radius: 999px;
  background: var(--cor-erro);
  color: #FFFFFF;
  font-size: 0.65rem;
  font-weight: 700;
  line-height: 1.05rem;
  text-align: center;
}

/* O sino "com novidade" ganha a cor cheia do texto mesmo parado, pra
   diferença ser perceptível sem depender só do número. */
.sino.sino-com-novidade summary {
  background: transparent;
  color: var(--cor-texto);
}

.sino-painel {
  position: absolute;
  top: calc(100% + 0.5rem);
  right: 0;
  z-index: 60;
  width: min(22rem, calc(100vw - 2rem));
  border: 1px solid var(--cor-borda);
  border-radius: 0.6rem;
  background: var(--cor-fundo);
  color: var(--cor-texto);
  box-shadow: 0 0.6rem 1.6rem rgba(0, 0, 0, 0.22);
  overflow: hidden;
}

.sino-cabecalho {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 0.5rem;
  padding: 0.6rem 0.75rem;
  border-bottom: 1px solid var(--cor-borda);
}

.sino-titulo {
  font-weight: 600;
  font-size: 0.9rem;
  color: var(--cor-texto);
}

/* Botão de texto discreto: declara fundo E cor nos dois estados, em vez de
   herdar metade da regra global de <button> (fundo azul + texto branco) —
   foi essa herança que fez sumir texto três vezes no modo claro. */
.sino-marcar-lidas {
  background: transparent;
  color: var(--cor-secundaria);
  border: 0;
  padding: 0.15rem 0.3rem;
  border-radius: 0.3rem;
  font-size: 0.75rem;
  cursor: pointer;
}

.sino-marcar-lidas:hover,
.sino-marcar-lidas:focus-visible {
  background: rgba(127, 145, 165, 0.16);
  color: var(--cor-texto);
}

.sino-lista {
  max-height: 22rem;
  overflow-y: auto;
}

.sino-item {
  display: flex;
  flex-direction: column;
  gap: 0.15rem;
  padding: 0.6rem 0.75rem;
  border-bottom: 1px solid var(--cor-borda);
  text-decoration: none;
  background: transparent;
  color: var(--cor-texto);
}

.sino-item:last-child {
  border-bottom: 0;
}

.sino-item:hover,
.sino-item:focus-visible {
  background: rgba(127, 145, 165, 0.16);
  color: var(--cor-texto);
}

/* Não-lida: marca de leitura à esquerda, sem trocar o fundo (o fundo é o
   que o hover usa — dois sinais no mesmo canal se anulariam). */
.sino-item-nova {
  border-left: 3px solid var(--cor-secundaria);
  padding-left: calc(0.75rem - 3px);
}

.sino-item-texto {
  font-size: 0.85rem;
  line-height: 1.35;
  color: var(--cor-texto);
}

.sino-item-rodape,
.sino-vazio {
  font-size: 0.72rem;
  color: var(--cor-texto-suave);
}

.sino-vazio {
  margin: 0;
  padding: 1.2rem 0.75rem;
  text-align: center;
}

.sino-ver-tudo {
  display: block;
  padding: 0.55rem 0.75rem;
  border-top: 1px solid var(--cor-borda);
  text-align: center;
  font-size: 0.8rem;
  text-decoration: none;
  background: transparent;
  color: var(--cor-secundaria);
}

.sino-ver-tudo:hover,
.sino-ver-tudo:focus-visible {
  background: rgba(127, 145, 165, 0.16);
  color: var(--cor-texto);
}

/* ---- Tela cheia da central (core/templates/core/notificacoes.html) ---- */

.notificacoes-filtro {
  display: flex;
  align-items: center;
  gap: 0.6rem;
  margin-bottom: 1rem;
  flex-wrap: wrap;
}

/* "Escolher do que ser avisado" (issue #378): empurrado pra ponta direita
   da barra de filtro — é uma saída pra outra tela, não mais um filtro. */
.notificacoes-link-preferencias {
  margin-left: auto;
  font-size: 0.85rem;
}

.notificacoes-lista {
  display: flex;
  flex-direction: column;
}

/* Mesma linguagem visual do sino, em tamanho de página: divisória fina de
   baixo contraste em vez de caixa com fundo (regra "respiro em vez de
   caixas"). */
.notificacao-linha {
  /* Mesma arrumação do sino: frase em cima, "quem • quando" embaixo. */
  display: flex;
  flex-direction: column;
  gap: 0.15rem;
  padding: 0.7rem 0.5rem;
  border-bottom: 1px solid var(--cor-borda);
  text-decoration: none;
  background: transparent;
  color: var(--cor-texto);
}

.notificacao-linha:hover,
.notificacao-linha:focus-visible {
  background: rgba(127, 145, 165, 0.16);
  color: var(--cor-texto);
}

.notificacao-linha-nova {
  border-left: 3px solid var(--cor-secundaria);
  padding-left: calc(0.5rem - 3px);
}

.notificacao-texto {
  color: var(--cor-texto);
}

.notificacao-meta {
  font-size: 0.75rem;
  color: var(--cor-texto-suave);
}

/* --- Preferências de notificação: a grade tipo × canal (issue #378) ---
   Segue as diretrizes de UI do projeto: rótulos em caixa alta e baixa,
   divisórias finas em vez de caixas com fundo, e nenhuma regra "pela
   metade" — todo estado que mexe no fundo declara também a cor do texto
   (é o que o lint de contraste confere na suíte). */

.pref-aviso-explicacao {
  color: var(--cor-texto-suave);
  margin-bottom: 1.2rem;
}

/* A grade pode ficar mais larga que a tela num celular: a rolagem
   horizontal acontece AQUI dentro, nunca no corpo da página. */
.pref-aviso-rolagem {
  overflow-x: auto;
}

.pref-aviso-grade {
  border-collapse: collapse;
  width: 100%;
  min-width: 34rem;
}

.pref-aviso-grade th,
.pref-aviso-grade td {
  padding: 0.6rem 0.7rem;
  border-bottom: 1px solid var(--cor-borda);
  text-align: left;
}

.pref-aviso-grade thead th {
  font-size: 0.8rem;
  font-weight: 600;
  color: var(--cor-texto-suave);
  white-space: nowrap;
}

/* Coluna dos canais: o quadradinho fica centralizado sob o rótulo. */
.pref-aviso-grade thead th:not(:first-child),
.pref-aviso-grade td {
  text-align: center;
}

.pref-aviso-grade tbody th {
  font-weight: 400;
  color: var(--cor-texto);
}

/* "chamado direto a você" — o aviso discreto nas linhas de menção e
   convite, que dá pra desligar mas convém pensar duas vezes. */
.pref-aviso-nota {
  display: block;
  font-size: 0.72rem;
  color: var(--cor-texto-suave);
}

.pref-aviso-celula {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  padding: 0.25rem;
  border-radius: 0.3rem;
  cursor: pointer;
}

.pref-aviso-celula:hover,
.pref-aviso-celula:focus-within {
  background: rgba(127, 145, 165, 0.16);
  color: var(--cor-texto);
}

.pref-aviso-celula input {
  cursor: pointer;
  /* Deixa o navegador pintar a caixa marcada com a cor do sistema, nos
     dois temas, em vez de inventar uma cor fixa aqui. */
  accent-color: var(--cor-secundaria);
}

/* Rótulo só pra leitor de tela: o quadradinho precisa dizer o que
   liga/desliga sem depender de ler a linha e a coluna. */
.pref-aviso-oculto {
  position: absolute;
  width: 1px;
  height: 1px;
  overflow: hidden;
  clip: rect(0 0 0 0);
  white-space: nowrap;
}

.pref-aviso-rodape {
  min-height: 1.2rem;
  margin-top: 0.9rem;
  font-size: 0.8rem;
  color: var(--cor-texto-suave);
}

/* --- Resumo diário: a agenda de quando o e-mail sai (issue #4) ---
   Mesma linguagem da grade acima. As pílulas dos dias seguem o padrão de
   pílula clicável da casa (.pedido-voto): todo estado que muda o fundo
   declara junto a cor do texto — inclusive o combinado "ativo + hover",
   que é o buraco por onde o texto já sumiu três vezes. */

.resumo-ligar {
  display: inline-flex;
  align-items: center;
  gap: 0.5rem;
  cursor: pointer;
  color: var(--cor-texto);
}

.resumo-ligar input {
  cursor: pointer;
  accent-color: var(--cor-secundaria);
}

.resumo-agenda {
  display: flex;
  flex-wrap: wrap;
  gap: 1.6rem;
  margin-top: 1.2rem;
}

/* Desligado: os controles continuam à vista, só apagados — some
   parece funcionalidade faltando (diretriz de UI/UX do projeto). */
.resumo-agenda.desligada {
  opacity: 0.5;
}

.resumo-campo {
  display: flex;
  flex-direction: column;
  gap: 0.45rem;
}

/* Rótulo menor e apagado, valor com a cor cheia: os dois têm de se
   distinguir de relance (diretriz de 2026-08-02). */
.resumo-rotulo {
  font-size: 0.8rem;
  color: var(--cor-texto-suave);
}

.resumo-dias {
  display: flex;
  flex-wrap: wrap;
  gap: 0.3rem;
}

.resumo-dia {
  background: transparent;
  border: 1px solid var(--cor-borda);
  border-radius: 999px;
  color: var(--cor-texto);
  cursor: pointer;
  font-size: 0.85rem;
  padding: 0.3rem 0.7rem;
}

.resumo-dia:hover,
.resumo-dia:focus-visible {
  background: var(--cor-secao);
  border-color: var(--cor-secundaria);
  color: var(--cor-texto);
}

.resumo-dia.ativo {
  background: var(--cor-secundaria);
  border-color: var(--cor-secundaria);
  color: #FFFFFF;
}

.resumo-dia.ativo:hover,
.resumo-dia.ativo:focus-visible {
  background: var(--cor-secundaria);
  border-color: var(--cor-secundaria);
  color: #FFFFFF;
}

.resumo-dia:disabled {
  cursor: default;
}

.resumo-horario {
  background: var(--cor-campo);
  border: 1px solid var(--cor-borda);
  border-radius: var(--raio);
  color: var(--cor-texto);
  font-size: 0.95rem;
  padding: 0.35rem 0.5rem;
}

.resumo-fuso {
  margin-top: 1rem;
  font-size: 0.8rem;
  color: var(--cor-texto-suave);
}

/* --- Avisos no aparelho: a lista de aparelhos ativados (issue #2) ---
   Mesma linguagem da grade acima: divisórias finas em vez de caixas, o
   ✕ da linha discreto até o hover (mas sempre alcançável por teclado), e
   nenhuma regra pela metade — todo estado que mexe no fundo declara
   também a cor do texto. */

.push-acao {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 0.9rem;
  margin-bottom: 1rem;
}

/* Botão que muda a roupagem: declara fundo, borda E cor do texto por
   conta própria, nos dois estados, em vez de herdar metade da regra
   global de botão (a causa dos textos invisíveis já corrigidos). */
.push-ativar {
  padding: 0.5rem 1rem;
  border: 1px solid var(--cor-secundaria);
  border-radius: var(--raio);
  background: var(--cor-secundaria);
  color: #FFFFFF;
  font-size: 0.9rem;
  cursor: pointer;
}

.push-ativar:hover:not(:disabled),
.push-ativar:focus-visible:not(:disabled) {
  background: var(--cor-primaria-clara);
  color: #FFFFFF;
  border-color: var(--cor-primaria-clara);
}

/* Indisponível continua LEGÍVEL e à vista, com o motivo no title — botão
   que some parece funcionalidade faltando. */
.push-ativar:disabled {
  background: var(--cor-campo);
  color: var(--cor-texto-suave);
  border-color: var(--cor-borda-campo);
  cursor: not-allowed;
}

.push-estado {
  margin: 0;
  font-size: 0.8rem;
  color: var(--cor-texto-suave);
}

.push-aparelhos {
  list-style: none;
  margin: 0;
  padding: 0;
}

.push-aparelho {
  display: flex;
  align-items: center;
  gap: 0.6rem;
  padding: 0.6rem 0.2rem;
  border-bottom: 1px solid var(--cor-borda);
}

.push-aparelho-nome {
  color: var(--cor-texto);
}

/* Informação categórica vira pílula (diretriz de UI/UX): "este aparelho"
   é o rótulo que diz em qual das linhas a pessoa está agora. */
.push-aparelho-aqui {
  padding: 0.1rem 0.55rem;
  border-radius: 999px;
  background: rgba(110, 190, 130, 0.18);
  color: var(--cor-sucesso);
  font-size: 0.72rem;
}

/* Rótulo apagado, valor com a cor cheia: a data fica secundária ao nome
   do aparelho, que é o que a pessoa procura na lista. */
.push-aparelho-quando {
  margin-left: auto;
  font-size: 0.78rem;
  color: var(--cor-texto-suave);
}

.push-remover {
  border: 0;
  background: transparent;
  color: var(--cor-texto-suave);
  border-radius: var(--raio);
  padding: 0.15rem 0.4rem;
  font-size: 0.9rem;
  line-height: 1;
  cursor: pointer;
  /* Discreto até o hover na linha — mas o foco por teclado o revela. */
  opacity: 0;
}

.push-aparelho:hover .push-remover,
.push-remover:focus-visible {
  opacity: 1;
}

.push-remover:hover,
.push-remover:focus-visible {
  background: rgba(179, 38, 30, 0.14);
  color: var(--cor-erro);
}

.push-vazio {
  padding: 0.6rem 0.2rem;
  color: var(--cor-texto-suave);
  font-size: 0.88rem;
}

/* Botão de teste do push: secundário ao lado do primário, e declara as
   próprias cores nos dois estados (a regra "nunca metade"). */
.push-testar {
  padding: 0.5rem 1rem;
  border: 1px solid var(--cor-borda-campo);
  border-radius: var(--raio);
  background: var(--cor-campo);
  color: var(--cor-texto);
  font-size: 0.9rem;
  cursor: pointer;
}

.push-testar:hover:not(:disabled),
.push-testar:focus-visible:not(:disabled) {
  background: var(--cor-secao);
  color: var(--cor-texto);
  border-color: var(--cor-secundaria);
}

.push-testar:disabled {
  background: var(--cor-campo);
  color: var(--cor-texto-suave);
  border-color: var(--cor-borda-campo);
  cursor: not-allowed;
}

/* ------------------------------------------------------------------ */
/* Recorrência (issue #426): a janelinha de configuração, o aviso de   */
/* check atrasado e o histórico de ciclos.                             */
/*                                                                     */
/* Toda variante de pílula abaixo declara FUNDO E COR DO TEXTO nos dois */
/* temas — regra do CLAUDE.md, conferida por core/lint_contraste.py:    */
/* metade da regra é o que já fez texto sumir três vezes no sistema.    */
/* ------------------------------------------------------------------ */

/* Corpo da janelinha: campos empilhados com respiro, sem caixas de
   fundo cinza (diretriz de UI: respiro em vez de caixas). */
.abana-janelinha-corpo {
  display: flex;
  flex-direction: column;
  gap: 0.7rem;
}

.abana-janelinha-campo {
  display: flex;
  flex-direction: column;
  gap: 0.25rem;
  font-size: 0.85rem;
  color: var(--cor-texto);
}

/* Rótulo do campo: menor e apagado, para o VALOR ter a cor cheia e os
   dois se distinguirem de relance (diretriz de 2026-08-02). */
.abana-janelinha-campo > span:first-child {
  font-size: 0.78rem;
  color: var(--cor-texto-suave);
}

.abana-janelinha-campo select,
.abana-janelinha-campo input[type="number"],
.abana-janelinha-campo input[type="time"] {
  background: var(--cor-campo);
  color: var(--cor-texto);
  border: 1px solid var(--cor-borda);
  border-radius: var(--raio);
  padding: 0.3rem 0.45rem;
  font-size: 0.85rem;
}

/* Número + unidade lado a lado ("a cada 2 dias"). */
.abana-janelinha-dupla {
  display: flex;
  gap: 0.4rem;
}

.abana-janelinha-dupla input[type="number"] {
  width: 4.5rem;
}

/* Escolha entre os dois modos: o rádio à esquerda, o nome em destaque e a
   explicação abaixo — a diferença entre os modos fica dita na tela, não
   só no tooltip. */
.abana-janelinha-escolha {
  display: flex;
  align-items: flex-start;
  gap: 0.45rem;
  padding: 0.35rem 0.3rem;
  border-radius: var(--raio);
  cursor: pointer;
  color: var(--cor-texto);
}

.abana-janelinha-escolha:hover,
.abana-janelinha-escolha:focus-within {
  background: var(--cor-secao);
  color: var(--cor-texto);
}

.abana-janelinha-escolha > span {
  display: flex;
  flex-direction: column;
  gap: 0.1rem;
}

.abana-janelinha-escolha strong {
  font-size: 0.85rem;
  font-weight: 600;
}

/* Aviso de que o último check ficou para trás — texto do dono, ao pé da
   letra. Tom de atenção, não de erro: a mensagem é encorajadora. */
.abana-recorrencia-aviso {
  margin: 0.5rem 0 0;
  padding: 0.5rem 0.65rem;
  /* Issue #728: a frase inteira, quebrando onde precisar — ela ficava
     cortada na borda da coluna quando a grade transbordava. */
  overflow-wrap: break-word;
  border-radius: var(--raio);
  border-left: 3px solid hsl(35, 80%, 55%);
  background: hsl(35, 85%, 94%);
  color: hsl(35, 60%, 25%);
  font-size: 0.85rem;
  line-height: 1.45;
}

:root[data-theme="dark"] .abana-recorrencia-aviso {
  background: hsl(35, 30%, 20%);
  color: hsl(35, 70%, 85%);
}

@media (prefers-color-scheme: dark) {
  :root:not([data-theme="light"]) .abana-recorrencia-aviso {
    background: hsl(35, 30%, 20%);
    color: hsl(35, 70%, 85%);
  }
}

/* Histórico: divisória fina em cima, sem bloco de fundo. */
.abana-recorrencia-historico {
  margin-top: 0.6rem;
  padding-top: 0.5rem;
  border-top: 1px solid var(--cor-borda);
}

.abana-recorrencia-historico-titulo {
  margin: 0.4rem 0 0.25rem;
  font-size: 0.78rem;
  font-weight: 600;
  color: var(--cor-texto-suave);
}

.abana-recorrencia-lista {
  list-style: none;
  margin: 0;
  padding: 0;
  display: flex;
  flex-direction: column;
  gap: 0.2rem;
}

.abana-recorrencia-item {
  display: flex;
  align-items: center;
  gap: 0.5rem;
  font-size: 0.82rem;
  color: var(--cor-texto);
  /* Issue #728: numa coluna estreita a linha QUEBRA em duas em vez de
     espremer as peças. Sem isto, a data era o único pedaço que cedia — e
     cedia letra por letra ("09/0 / 9/20 / 26, 09:0 / 0"). */
  flex-wrap: wrap;
}

.abana-recorrencia-item-data {
  color: var(--cor-texto);
  /* Data é um número: ou cabe inteira, ou a linha quebra antes dela.
     Nunca no meio ("09/0" numa linha, "9/2026" na seguinte). */
  white-space: nowrap;
}

.abana-recorrencia-item-quem {
  color: var(--cor-texto-suave);
  font-size: 0.78rem;
}

/* Corrigir o desfecho de um ciclo passado (issue #691). Encosta no fim da
   linha para não empurrar a data e o nome, e não declara cor nenhuma de
   propósito: quem manda nas cores é .abana-link-discreto, que já traz
   fundo E texto nos dois estados (a regra "nunca metade"). */
.abana-recorrencia-corrigir {
  margin-left: auto;
  font-size: 0.78rem;
  white-space: nowrap;
}

.abana-recorrencia-pilula {
  border-radius: 999px;
  padding: 0.1rem 0.55rem;
  font-size: 0.72rem;
  font-weight: 600;
  white-space: nowrap;
}

.abana-recorrencia-pilula.concluido {
  background: hsl(145, 45%, 88%);
  color: hsl(145, 55%, 25%);
}

.abana-recorrencia-pilula.atrasado {
  background: hsl(5, 70%, 90%);
  color: hsl(5, 60%, 30%);
}

.abana-recorrencia-pilula.futuro {
  background: hsl(210, 15%, 90%);
  color: hsl(210, 12%, 32%);
}

:root[data-theme="dark"] .abana-recorrencia-pilula.concluido {
  background: hsl(145, 30%, 25%);
  color: hsl(145, 55%, 82%);
}

:root[data-theme="dark"] .abana-recorrencia-pilula.atrasado {
  background: hsl(5, 35%, 28%);
  color: hsl(5, 70%, 85%);
}

:root[data-theme="dark"] .abana-recorrencia-pilula.futuro {
  background: hsl(210, 12%, 28%);
  color: hsl(210, 15%, 82%);
}

@media (prefers-color-scheme: dark) {
  :root:not([data-theme="light"]) .abana-recorrencia-pilula.concluido {
    background: hsl(145, 30%, 25%);
    color: hsl(145, 55%, 82%);
  }
  :root:not([data-theme="light"]) .abana-recorrencia-pilula.atrasado {
    background: hsl(5, 35%, 28%);
    color: hsl(5, 70%, 85%);
  }
  :root:not([data-theme="light"]) .abana-recorrencia-pilula.futuro {
    background: hsl(210, 12%, 28%);
    color: hsl(210, 15%, 82%);
  }
}

/* Botão de ação DESTRUTIVA (issue #380: "apagar a coluna e as N tarefas").
   Declara fundo, borda E cor do texto nos estados normal e hover/foco —
   regra do CLAUDE.md, conferida por core/lint_contraste.py. O vermelho é
   escuro o suficiente para carregar texto branco nos DOIS temas, então não
   precisa de variante por tema: a mesma regra serve aos dois. */
.abana-botao-perigo {
  background: hsl(5, 65%, 42%);
  border: 1px solid hsl(5, 65%, 42%);
  color: #FFFFFF;
}

.abana-botao-perigo:hover,
.abana-botao-perigo:focus-visible {
  background: hsl(5, 65%, 34%);
  border-color: hsl(5, 65%, 34%);
  color: #FFFFFF;
}

/* Ação primária indisponível continua VISÍVEL, com o porquê no title
   (diretriz de UI) — apagada, não escondida. */
.abana-janelinha-corpo button:disabled {
  opacity: 0.5;
  cursor: not-allowed;
}

/* Lista de sugestões desenhada num PORTAL em <body> (issue #423).
   O contêiner externo (.abana-sugestoes-flutuantes) é quem posiciona, com
   as coordenadas medidas na abertura; esta classe neutraliza o
   posicionamento que a lista tinha quando morava dentro do campo. Sem
   isto, o `position: absolute` + `left/right: 0` das regras originais
   esticaria a lista de ponta a ponta da tela. */
.abana-sugestoes-ancoradas {
  position: static;
  top: auto;
  left: auto;
  right: auto;
  width: 100%;
  margin: 0;
  /* A sombra e a borda passam a ser desta lista, que é o que se vê. */
  box-shadow: 0 10px 28px rgba(0, 0, 0, 0.28);
}

/* ==========================================================================
   RESPONSIVO — epic #442 (pedido #80 do Murilo, issue #434)
   O sistema inteiro se adapta à tela estreita (celular e tablet em pé).
   Decisões do dono (2026-08-10): a barra lateral vira GAVETA aberta pelo
   botão ☰ do cabeçalho; listagem continua TABELA, com rolagem lateral;
   o quadro do Abana rola de lado com colunas mais estreitas.
   Tudo aqui é roupagem: nenhuma funcionalidade some no celular — o que
   não cabe passa a rolar, nunca a desaparecer.
   ========================================================================== */

/* Altura da casca em unidade dinâmica: 100vh no celular inclui a barra de
   endereço do navegador, então o rodapé ficava escondido atrás dela.
   100dvh mede o que está VISÍVEL de fato; navegadores antigos seguem no
   100vh declarado lá na regra original de body.casca. */
@supports (height: 100dvh) {
  body.casca {
    height: 100dvh;
  }
}

/* O botão ☰ (em _cabecalho.html) existe no DOM de toda tela logada, mas só
   aparece em tela estreita (media query abaixo). Cores declaradas por
   inteiro nos dois estados — regra "nunca metade" do CLAUDE.md. */
.topo-menu-celular {
  display: none;
  background: transparent;
  border: none;
  color: var(--cor-texto);
  padding: 0.3rem;
  cursor: pointer;
  line-height: 0;
}

.topo-menu-celular:hover,
.topo-menu-celular:focus-visible {
  background: var(--cor-secao);
  color: var(--cor-texto);
  border-radius: 0.4rem;
}

.topo-menu-celular svg {
  width: 24px;
  height: 24px;
}

/* Véu atrás da gaveta (o <div> em _barra_lateral.html): invisível fora do
   celular; a media query abaixo o exibe quando a gaveta abre. */
.veu-menu-celular {
  display: none;
  position: fixed;
  inset: 0;
  z-index: 85;
  background: rgba(0, 0, 0, 0.45);
}

@media (max-width: 768px) {
  /* --- Cabeçalho compacto ---------------------------------------------- */
  header.topo {
    padding: 0.55rem 0.9rem;
    gap: 0.5rem;
  }

  header.topo img {
    height: 26px;
  }

  /* O "Bem-vindo(a)" (e o contador de conquistas pendurado nele) não cabe
     ao lado do sino e do avatar numa tela de celular — some; a informação
     mora no menu do avatar e nas telas do Abana. */
  .topo-boasvindas {
    display: none;
  }

  .topo-menu-celular {
    display: inline-flex;
  }

  /* --- Barra lateral vira gaveta --------------------------------------- */
  /* Fora da tela por padrão; body.menu-celular-aberto (JS no fim de
     _barra_lateral.html) a desliza pra dentro, POR CIMA do conteúdo.
     A preferência de desktop "encolhida" (44px, só ícones) não faz
     sentido numa gaveta — as duas variantes recebem a mesma largura,
     e os links escondidos pelo modo encolhido voltam a aparecer. */
  .barra-lateral,
  .barra-lateral.encolhida {
    position: fixed;
    top: 0;
    bottom: 0;
    left: 0;
    z-index: 90;
    width: min(20rem, 85vw);
    padding: 1.25rem 1rem;
    transform: translateX(-105%);
    transition: transform 0.2s ease;
    background: var(--cor-fundo);
    box-shadow: 0.4rem 0 1.6rem rgba(0, 0, 0, 0.25);
  }

  body.menu-celular-aberto .barra-lateral {
    transform: translateX(0);
  }

  .barra-lateral.encolhida .barra-lateral-links {
    display: flex;
    flex-direction: column;
  }

  /* Encolher (botão «) e ajustar largura arrastando são gestos de
     desktop — na gaveta não existem. */
  .barra-lateral-toggle,
  .barra-lateral-ajuste {
    display: none;
  }

  body.menu-celular-aberto .veu-menu-celular {
    display: block;
  }

  /* --- Conteúdo -------------------------------------------------------- */
  /* Com a barra fora do fluxo (fixed), o conteúdo ocupa a tela toda;
     o respiro de 2rem do desktop vira um respiro de celular. */
  .conteudo-principal {
    padding: 1.1rem 0.8rem;
  }

  /* Login/2FA: o cartão centralizado encosta menos nas bordas e perde a
     margem alta de desktop. */
  body:not(.logado) .conteudo-principal {
    margin: 1.25rem auto;
    padding: 0 1rem;
  }

  /* --- Campos de formulário -------------------------------------------- */
  /* iPhone/iPad dão ZOOM automático em campo focado com fonte menor que
     16px — a tela "pula" a cada toque. Garantir 16px no celular desarma o
     zoom; max() preserva quem já é maior. Só em tela estreita: no desktop
     os tamanhos originais ficam como estão. */
  input,
  select,
  textarea {
    font-size: max(16px, 1em);
  }

  /* --- Listagens: tabela com rolagem lateral --------------------------- */
  /* Decisão do dono (2026-08-10): listagem CONTINUA tabela no celular —
     desliza de lado com o dedo, cabeçalho/ordenação/filtros intactos.
     display:block faz a própria tabela ser o contêiner de rolagem (as
     linhas viram uma caixa de tabela anônima por dentro, o desenho não
     muda); assim nenhum template precisa de um embrulho novo. */
  table.tabela-sistema {
    display: block;
    overflow-x: auto;
    -webkit-overflow-scrolling: touch;
  }

  /* --- Abana: quadro e painel de detalhe ------------------------------- */
  /* Colunas mais estreitas, rolagem lateral livre (decisão do dono).
     !important é proposital e raro: a largura PESSOAL da coluna (issue
     #431) chega como style inline do React, e no celular ela não vale —
     coluna maior que a tela quebraria o quadro inteiro. */
  .abana-coluna {
    width: min(85vw, 320px) !important;
    min-width: min(85vw, 320px) !important;
  }

  /* Arrastar a borda pra mudar largura é gesto de desktop; no toque ele
     briga com a rolagem do quadro. */
  .abana-alca-largura {
    display: none;
  }

  /* Tarefa aberta ocupa a tela inteira (não sobra tela pra dividir). O
     "expandido" (issue #39) já é o estado natural aqui — e a janela
     centralizada do desktop (issue #505) vira folha cheia, sem cantos
     arredondados nem folga em volta. */
  .abana-painel-detalhe,
  .abana-painel-detalhe.expandido {
    width: 100vw;
    height: 100%;
    max-height: 100vh;
    border-radius: 0;
  }

  /* Empilhadas no celular, as colunas voltam a rolar JUNTO com o painel
     — duas áreas de rolagem empilhadas brigariam com o dedo. Também
     desfaz a rolagem própria da área de colunas do @container. */
  .abana-painel-detalhe {
    display: block;
    overflow-y: auto;
  }

  .abana-painel-colunas {
    display: block;
    overflow-y: visible;
  }

  .abana-painel-coluna-principal,
  .abana-painel-coluna-conversa {
    overflow-y: visible;
  }

  .abana-painel-alca {
    display: none;
  }

  /* --- Janelinhas e popovers ------------------------------------------- */
  /* Rede de segurança: nenhuma janelinha ancorada pode ser mais larga que
     a tela (as principais já se limitam com min(); esta regra cobre as
     que confiavam na largura farta do desktop). */
  .abana-janelinha,
  .sino-painel,
  .conquistas-painel,
  .menu-engrenagem-itens {
    max-width: calc(100vw - 1rem);
  }
}

/* Janelinha LARGA (issue #491): a largura padrão de 17,5rem foi desenhada
   para nomes de pessoa. Razão social não cabe nela — na tela estreita do
   Setup da proposta os nomes chegaram a virar "A…". Piso em rem, teto na
   viewport para não estourar no celular. */
.abana-janelinha.abana-janelinha-larga {
  width: min(26rem, 88vw);
}

/* O nome corta com reticências DENTRO da linha, deixando o código do
   cliente sempre visível à direita — é ele que desempata dois clientes de
   nome parecido, então é a última coisa que pode sumir. */
.abana-janelinha-nome {
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  min-width: 0;
}

/* Seletor de ficha do CRM (issue #480, pedido #95) — o gatilho que abre a
   janelinha de busca, no lugar do <select> nativo com a base inteira.

   Segue a diretriz de edição inline: parece texto comum sobre o fundo e só
   revela a borda no hover/foco. Fundo E cor do texto são declarados nos
   DOIS estados, nunca metade (regra do CLAUDE.md). */
.abana-gatilho-ficha {
  display: inline-flex;
  align-items: center;
  gap: 0.4rem;
  max-width: 100%;
  background: transparent;
  border: 1px solid transparent;
  border-radius: var(--raio);
  color: var(--cor-texto);
  padding: 0.2rem 0.4rem;
  font: inherit;
  text-align: left;
  cursor: pointer;
}

.abana-gatilho-ficha:hover,
.abana-gatilho-ficha:focus-visible {
  background: var(--cor-secao);
  border-color: var(--cor-borda);
  color: var(--cor-texto);
}

/* O rótulo corta no CONTEÚDO, não na borda do botão (regra do CLAUDE.md:
   gatilho com ícone/espaço à direita corta tarde demais se o overflow
   ficar no próprio botão). */
.abana-gatilho-ficha-rotulo {
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

/* Código de 4 caracteres do cliente ao lado do nome, na lista de sugestões:
   é ele que distingue dois clientes de nome parecido. Discreto, porque o
   nome é que se lê primeiro — mas legível nos dois temas. */
.abana-pilula-codigo {
  margin-left: auto;
  flex: none;
  background: var(--cor-secao);
  color: var(--cor-texto-suave);
  border-radius: 999px;
  padding: 0.05rem 0.45rem;
  font-size: 0.75rem;
  font-variant-numeric: tabular-nums;
}

/* Dentro de uma linha destacada (hover/foco/teclado), a pílula acompanha o
   contraste em vez de sumir no fundo que acabou de mudar. */
.abana-janelinha-lista button:hover:not(:disabled) .abana-pilula-codigo,
.abana-janelinha-lista button:focus-visible .abana-pilula-codigo {
  background: var(--cor-fundo);
  color: var(--cor-texto);
}

/* Busca ancorada (issue #487) — o seletor por busca dos formulários
   Django, irmão da "janelinha" do Abana. As cores são declaradas aqui e
   não herdadas: este painel FLUTUA sobre regiões que às vezes têm esquema
   próprio (o "papel" da proposta, por exemplo), e a regra do CLAUDE.md é
   que interface flutuante declara o próprio fundo, texto e campos. */
.busca-ancorada {
  position: relative;
  /* Ocupa a largura que a célula oferece (issue #491). Sem isto, dentro de
     um contêiner flexível — como a grade de campos do Setup da proposta —
     o controle encolhia até o tamanho do próprio gatilho, e um gatilho
     escrito "Sem empresa" é curtíssimo. `min-width: 0` é o par obrigatório
     de `flex: 1`: sem ele o conteúdo impede o encolhimento em tela
     estreita. */
  flex: 1 1 auto;
  min-width: 0;
}

.busca-ancorada-gatilho {
  display: inline-flex;
  align-items: center;
  width: 100%;
  background: var(--cor-fundo);
  border: 1px solid var(--cor-borda);
  border-radius: var(--raio);
  color: var(--cor-texto);
  padding: 0.4rem 0.6rem;
  font: inherit;
  text-align: left;
  cursor: pointer;
}

.busca-ancorada-gatilho:hover,
.busca-ancorada-gatilho:focus-visible {
  background: var(--cor-secao);
  border-color: var(--cor-acento);
  color: var(--cor-texto);
}

/* O rótulo corta no CONTEÚDO, não na borda do botão. */
.busca-ancorada-rotulo {
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.busca-ancorada-painel {
  position: absolute;
  z-index: 60;
  top: calc(100% + 3px);
  left: 0;
  right: 0;
  /* Largura MÍNIMA própria (issue #491): o painel é interface flutuante e
     não pode depender do tamanho de quem o abriu — foi assim que os nomes
     das empresas viraram "A…" numa célula estreita. O `min()` impede que a
     largura mínima estoure a tela no celular. Só piso: onde o campo é
     largo, o painel acompanha o campo. */
  min-width: min(22rem, 88vw);
  background: var(--cor-fundo);
  border: 1px solid var(--cor-borda);
  border-radius: var(--raio);
  box-shadow: 0 10px 28px rgba(0, 0, 0, 0.28);
  padding: 0.4rem;
}

/* `position: absolute` acima venceria o display:none de [hidden]; sem esta
   linha o painel fica sempre aberto. */
.busca-ancorada-painel[hidden] {
  display: none;
}

/* O campo de busca declara as próprias cores pelo motivo do comentário do
   bloco: dentro de uma região com esquema próprio, herdar deixa quem
   digita sem enxergar o que digitou. */
.busca-ancorada-campo {
  width: 100%;
  background: var(--cor-fundo);
  border: 1px solid var(--cor-borda);
  border-radius: var(--raio);
  color: var(--cor-texto);
  padding: 0.35rem 0.5rem;
  font: inherit;
}

.busca-ancorada-lista {
  display: flex;
  flex-direction: column;
  max-height: 15rem;
  overflow-y: auto;
  margin-top: 0.3rem;
}

.busca-ancorada-lista button {
  display: flex;
  align-items: center;
  gap: 0.5rem;
  width: 100%;
  background: transparent;
  border: none;
  border-radius: var(--raio);
  color: var(--cor-texto);
  padding: 0.35rem 0.45rem;
  font: inherit;
  text-align: left;
  cursor: pointer;
}

.busca-ancorada-lista button:hover,
.busca-ancorada-lista button:focus-visible,
.busca-ancorada-lista button.ativa {
  background: var(--cor-secao);
  color: var(--cor-texto);
}

.busca-ancorada-nome {
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.busca-ancorada-codigo {
  margin-left: auto;
  flex: none;
  background: var(--cor-secao);
  color: var(--cor-texto-suave);
  border-radius: 999px;
  padding: 0.05rem 0.45rem;
  font-size: 0.75rem;
  font-variant-numeric: tabular-nums;
}

.busca-ancorada-lista button:hover .busca-ancorada-codigo,
.busca-ancorada-lista button:focus-visible .busca-ancorada-codigo,
.busca-ancorada-lista button.ativa .busca-ancorada-codigo {
  background: var(--cor-fundo);
  color: var(--cor-texto);
}

/* Estado vazio e "Carregando…" — dizem o que houve, em texto visível. */
.busca-ancorada-vazio {
  color: var(--cor-texto-suave);
  padding: 0.4rem 0.45rem;
  margin: 0;
  font-size: 0.85rem;
}

/* "Mostrar mais 20" (issue #581): continua a lista sem obrigar a digitar.
   Fundo e cor declarados nos dois estados — regra "nunca metade". */
.busca-ancorada-mais {
  display: block;
  width: 100%;
  text-align: left;
  padding: 0.45rem 0.45rem;
  margin-top: 0.2rem;
  border: 0;
  border-top: 1px solid var(--cor-borda-suave, rgba(128, 128, 128, 0.18));
  border-radius: 0;
  background: transparent;
  color: var(--cor-secundaria);
  font-size: 0.85rem;
  cursor: pointer;
}

.busca-ancorada-mais:hover,
.busca-ancorada-mais:focus-visible {
  background: var(--cor-secao);
  color: var(--cor-secundaria);
}

/* ==========================================================================
   Reforma de UX do cartão do Abana — epic #492 (issues #493 a #499).
   Vale nos dois quadros (projeto e "Minhas tarefas"), que usam o mesmo
   cartão.
   ========================================================================== */

/* Issue #495 — o título é o elemento principal do cartão. Ele já estava
   no tamanho certo (~14 px); o que faltava era PESO e ar entre as linhas:
   com line-height 1.2 as três linhas viravam um bloco só. Metadados e
   informações auxiliares continuam em 0.75rem (12 px), abaixo dele. */
.abana-tarefa .abana-titulo-tarefa,
.abana-tarefa .abana-titulo-tarefa-texto {
  font-weight: 600;
  line-height: 1.4;
}

/* Issue #497 — respiro entre os blocos do cartão. A densidade da coluna
   não muda (o cartão não fica muito maior); o que muda é a separação
   entre título, pílulas, progresso e rodapé, que antes era a mesma de
   dentro de cada bloco — e por isso não se lia onde um acabava. */
.abana-tarefa {
  gap: 0.55rem;
}

/* Issue #496 — o título ocupa no máximo 3 linhas fora da edição. O texto
   inteiro fica na dica do mouse e volta por completo ao clicar (que é o
   que abre a edição). O bloco parece texto comum, como manda a edição
   inline: a borda só aparece ao passar o mouse ou ao focar pelo teclado,
   igual ao campo que ele substitui. */
.abana-titulo-limitado {
  display: -webkit-box;
  -webkit-box-orient: vertical;
  -webkit-line-clamp: 3;
  line-clamp: 3;
  overflow: hidden;
  /* Título comprido sem espaço (link, nome de arquivo) não pode esticar
     a coluna — quebra dentro da largura do cartão. */
  overflow-wrap: anywhere;
  /* Fora da edição o título é área de "pega" do arraste (2026-07-20). */
  cursor: grab;
  /* O bloco não é <textarea>: declara o texto que antes vinha do campo. */
  color: var(--cor-texto);
  white-space: pre-wrap;
}

/* Quem só LÊ o quadro vê o título num <span> (não há o que editar), e ele
   precisa do mesmo limite — senão o cartão volta a esticar exatamente pra
   quem tem menos controle sobre ele. Sem estado de hover: não é clicável. */
.abana-tarefa .abana-titulo-tarefa-texto {
  display: -webkit-box;
  -webkit-box-orient: vertical;
  -webkit-line-clamp: 3;
  line-clamp: 3;
  overflow: hidden;
  overflow-wrap: anywhere;
}

.abana-tarefa-compacto .abana-titulo-tarefa-texto {
  -webkit-line-clamp: 1;
  line-clamp: 1;
}

.abana-titulo-limitado:hover,
.abana-titulo-limitado:focus-visible {
  border-color: var(--cor-borda);
  background: var(--cor-secao);
  color: var(--cor-texto);
  outline: none;
}

/* Issue #498 — "amanhã" é o destaque LEVE da escala: só engrossa o texto.
   Cor fica reservada a atraso (vermelho) e hoje (âmbar), que já existem
   acima: cor significa alguma coisa, não enfeita. Declara a cor junto do
   peso pra não herdar meia regra. */
.abana-prazo-mini.abana-prazo-amanha,
.abana-prazo-mini.abana-prazo-amanha:hover {
  color: var(--cor-texto);
  font-weight: 600;
}

/* Issue #494 — joinha sem nenhuma curtida só aparece ao passar o mouse no
   cartão (ou ao chegar nele pelo teclado), como o prazo e o responsável
   vazios já faziam. Com curtida ele não recebe esta classe e fica sempre
   visível, porque aí conta uma informação. */
.abana-curtir-zerado {
  opacity: 0;
  transition: opacity 0.15s ease;
}

.abana-tarefa:hover .abana-curtir-zerado,
.abana-tarefa:focus-within .abana-curtir-zerado,
.abana-curtir-zerado:focus-visible {
  opacity: 1;
}

/* Em tela de TOQUE não existe passar o mouse: o botão ficaria
   inalcançável. Lá ele fica sempre visível (decisão do dono, 2026-08-13).
   Mesmo cuidado vale pros seletores vazios de prazo e responsável, que
   sofriam do mesmo problema desde antes. */
@media (hover: none) {
  .abana-curtir-zerado,
  .abana-linha-subtarefa .abana-prazo-mini.vazio,
  .abana-rodape-esquerda .abana-prazo-mini.vazio {
    opacity: 1;
  }
}

/* Issue #499 — densidade dos cartões. */

/* Gatilho no cabeçalho do quadro: mesmo desenho do botão de filtro, e
   igualmente destacado quando o quadro NÃO está no nível padrão — quem
   olha entende por que o cartão está mais enxuto sem abrir nada. Declara
   fundo E cor do texto em todos os estados. */
.abana-botao-densidade {
  display: inline-flex;
  align-items: center;
  background: transparent;
  border: 1px solid transparent;
  border-radius: var(--raio);
  color: var(--cor-texto-suave);
  cursor: pointer;
  padding: 0.15rem 0.45rem;
  font-size: 0.85rem;
}

.abana-botao-densidade:hover,
.abana-botao-densidade:focus-visible,
.abana-botao-densidade.ativo {
  color: var(--cor-texto);
  border-color: var(--cor-borda);
  background: var(--cor-secao);
  outline: none;
}

/* Notas do quadro (issue #597, pedido #107 do André): o botão que abre a
   descrição do quadro, ao lado dos outros controles discretos do
   cabeçalho. Mesma roupagem do botão de densidade — e, como ele, declara
   FUNDO, BORDA E COR DO TEXTO nos dois estados, sem herdar metade da
   regra global de botão (regra do "nunca metade" do CLAUDE.md). */
.abana-botao-notas {
  display: inline-flex;
  align-items: center;
  background: transparent;
  border: 1px solid transparent;
  border-radius: var(--raio);
  color: var(--cor-texto-suave);
  cursor: pointer;
  padding: 0.15rem 0.45rem;
  font-size: 0.85rem;
}

.abana-botao-notas:hover,
.abana-botao-notas:focus-visible {
  color: var(--cor-texto);
  border-color: var(--cor-borda);
  background: var(--cor-secao);
  outline: none;
}

/* A janelinha das notas é mais larga que a de escolher uma opção: aqui se
   LÊ um texto, não se clica numa lista curta. Rola quando a nota é longa,
   em vez de esticar até fora da tela. */
.abana-janelinha-notas {
  width: min(24rem, calc(100vw - 2rem));
}

/* Texto simples com as quebras de linha que a pessoa escreveu. Cor
   declarada aqui, não herdada: a janelinha é interface FLUTUANTE e pode
   ser desenhada por cima de região com esquema de cor próprio — a regra
   do CLAUDE.md sobre painel flutuante que não herda a área que cobre. */
.abana-notas-do-quadro {
  margin: 0;
  max-height: 50vh;
  overflow-y: auto;
  white-space: pre-wrap;
  overflow-wrap: anywhere;
  color: var(--cor-texto);
  font-size: 0.9rem;
  line-height: 1.45;
}

/* Compacto: uma linha de título e menos ar entre os blocos que sobraram —
   é o modo de quem tem dezenas de cartões na tela ao mesmo tempo. */
.abana-tarefa-compacto {
  gap: 0.3rem;
}

.abana-tarefa-compacto .abana-titulo-limitado {
  -webkit-line-clamp: 1;
  line-clamp: 1;
}

/* Progresso curto do compacto ("· 93%"), no lugar da barra. */
.abana-progresso-curto {
  color: var(--cor-texto-suave);
  font-size: 0.75rem;
  font-variant-numeric: tabular-nums;
}

/* ==========================================================================
   Visualizador de anexo (issue #512, pedido #101)
   Print e PDF abrem por cima do painel, sem baixar. Interface FLUTUANTE:
   declara todas as próprias cores (regra do CLAUDE.md) — e aqui elas são
   fixas de propósito, escuras nos DOIS temas, como todo lightbox: o fundo
   escurecido é o que destaca a imagem, não o tema do sistema.
   ========================================================================== */
.abana-visualizador-fundo {
  position: fixed;
  inset: 0;
  /* Acima do painel de detalhe (100) e das janelinhas (até 140); abaixo
     só da comemoração (2000), que não captura clique. */
  z-index: 1500;
  background: rgba(0, 0, 0, 0.78);
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  padding: 3.5rem 1rem 1rem;
  box-sizing: border-box;
}

.abana-visualizador-cabecalho {
  position: absolute;
  top: 0;
  left: 0;
  right: 0;
  display: flex;
  align-items: center;
  gap: 0.75rem;
  padding: 0.55rem 1rem;
  background: rgba(15, 15, 15, 0.92);
  color: #fff;
}

/* O nome corta no CONTEÚDO (elemento próprio com ellipsis), nunca por
   baixo dos botões ao lado. */
.abana-visualizador-nome {
  flex: 1;
  min-width: 0;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  color: #fff;
}

.abana-visualizador-baixar {
  color: #fff;
  background: transparent;
  border: 1px solid rgba(255, 255, 255, 0.55);
  border-radius: var(--raio);
  padding: 0.15rem 0.65rem;
  text-decoration: none;
  flex-shrink: 0;
}

.abana-visualizador-baixar:hover,
.abana-visualizador-baixar:focus {
  background: #fff;
  color: #111;
  border-color: #fff;
}

.abana-visualizador-fechar {
  background: transparent;
  border: none;
  color: #fff;
  font-size: 1.05rem;
  line-height: 1;
  cursor: pointer;
  padding: 0.3rem 0.5rem;
  border-radius: var(--raio);
  flex-shrink: 0;
}

.abana-visualizador-fechar:hover,
.abana-visualizador-fechar:focus {
  background: rgba(255, 255, 255, 0.22);
  color: #fff;
}

.abana-visualizador-imagem {
  max-width: 100%;
  max-height: 100%;
  object-fit: contain;
  border-radius: var(--raio);
  box-shadow: 0 10px 44px rgba(0, 0, 0, 0.55);
}

/* O PDF rola dentro do visualizador do próprio navegador. Fundo branco
   fixo: é a cor do "papel", igual nos dois temas. */
.abana-visualizador-pdf {
  width: min(920px, 100%);
  height: 100%;
  border: none;
  border-radius: var(--raio);
  background: #fff;
}

/* --- Modelos de e-mail do Abana (issue #519) -----------------------------
   Menu de inserção de variável, pílulas de quem alcança o modelo e as
   listas de escolha do "Adicionar acesso".

   Toda regra abaixo que mexe no FUNDO declara junto a COR DO TEXTO (e
   vice-versa), inclusive nos estados de hover e foco — a regra do
   "nunca metade" do CLAUDE.md, conferida por core/lint_contraste.py. */

.abana-menu-variaveis {
  margin: 0.2rem 0 0.8rem;
  position: relative;
}

.abana-menu-variaveis > summary {
  display: inline-block;
  cursor: pointer;
  padding: 0.3rem 0.7rem;
  border-radius: var(--raio);
  border: 1px solid var(--cor-borda);
  background: var(--cor-campo);
  color: var(--cor-texto);
  font-size: 0.9rem;
  list-style: none;
}

.abana-menu-variaveis > summary:hover,
.abana-menu-variaveis > summary:focus-visible {
  background: var(--cor-secao);
  color: var(--cor-texto);
  border-color: var(--cor-acento);
}

/* O painel é FLUTUANTE: desenha as próprias cores em vez de herdar o que
   estiver embaixo dele, como manda a diretriz de interface flutuante. */
.abana-menu-variaveis-lista {
  position: absolute;
  z-index: 30;
  margin-top: 0.3rem;
  max-height: 22rem;
  overflow-y: auto;
  padding: 0.6rem;
  min-width: min(28rem, 90vw);
  border-radius: var(--raio);
  border: 1px solid var(--cor-borda);
  background: var(--cor-fundo);
  color: var(--cor-texto);
  box-shadow: 0 8px 24px hsla(0, 0%, 0%, 0.18);
}

.abana-variavel {
  display: block;
  width: 100%;
  text-align: left;
  margin: 0.15rem 0;
  padding: 0.3rem 0.5rem;
  border-radius: var(--raio);
  border: 1px solid transparent;
  background: transparent;
  color: var(--cor-texto);
  cursor: pointer;
  font-size: 0.9rem;
}

.abana-variavel:hover,
.abana-variavel:focus-visible {
  background: var(--cor-secao);
  color: var(--cor-texto);
  border-color: var(--cor-acento);
}

.abana-variavel code {
  color: var(--cor-texto-suave);
}

.abana-pilulas-acesso {
  display: flex;
  flex-wrap: wrap;
  gap: 0.4rem;
  margin: 0.5rem 0 1rem;
}

.abana-pill-acesso {
  display: inline-flex;
  align-items: center;
  gap: 0.3rem;
  padding: 0.2rem 0.55rem;
  border-radius: 999px;
  border: 1px solid var(--cor-borda);
  background: var(--cor-secao);
  color: var(--cor-texto);
  font-size: 0.88rem;
}

/* O ✕ da pílula segue o padrão do sistema: discreto até o hover/foco da
   própria pílula, mas sempre alcançável por teclado. */
.abana-pill-acesso .abana-icone-acao {
  opacity: 0.35;
}

.abana-pill-acesso:hover .abana-icone-acao,
.abana-pill-acesso .abana-icone-acao:focus-visible {
  opacity: 1;
}

.abana-escolha-acesso {
  margin: 0.4rem 0;
  border-bottom: 1px solid var(--cor-borda);
  padding-bottom: 0.4rem;
}

.abana-escolha-acesso > summary {
  cursor: pointer;
  padding: 0.25rem 0;
  color: var(--cor-texto);
}

.abana-escolha-acesso > summary:hover,
.abana-escolha-acesso > summary:focus-visible {
  color: var(--cor-acento);
}

/* --- Seção "E-mail" do painel da tarefa (issues #521 e #523) -------------
   Envio pelo cartão e histórico do que já saiu. Rótulo apagado e valor
   com a cor cheia (diretriz "rótulo e valor se distinguem de relance"),
   e toda regra de estado declara fundo E cor do texto. */

.abana-email-envio {
  display: flex;
  flex-direction: column;
  gap: 0.4rem;
}

.abana-email-rotulo {
  font-size: 0.8rem;
  color: var(--cor-texto-suave);
}

.abana-email-valor {
  color: var(--cor-texto);
}

.abana-email-destino {
  display: flex;
  flex-direction: column;
  gap: 0.1rem;
  margin: 0.2rem 0;
}

.abana-email-enviar {
  align-self: flex-start;
}

/* O porquê de o botão desabilitado — texto visível, nunca só no title. */
.abana-email-motivo {
  margin: 0;
  font-size: 0.85rem;
  color: var(--cor-texto-suave);
}

.abana-email-aviso {
  margin: 0;
  font-size: 0.85rem;
  color: var(--cor-acento);
}

.abana-email-historico {
  list-style: none;
  padding: 0;
  margin: 0.8rem 0 0;
}

.abana-email-linha {
  display: flex;
  flex-direction: column;
  gap: 0.1rem;
  padding: 0.4rem 0;
  border-top: 1px solid var(--cor-borda);
}

.abana-email-linha-topo {
  display: flex;
  justify-content: space-between;
  gap: 0.6rem;
  color: var(--cor-texto);
}

.abana-email-quando,
.abana-email-linha-meta {
  font-size: 0.82rem;
  color: var(--cor-texto-suave);
}

/* Envio que NÃO saiu fica marcado no próprio texto, não só por cor — cor
   sozinha não é informação pra quem não a distingue. */
.abana-email-linha-erro {
  font-size: 0.82rem;
  color: var(--cor-erro);
}

/* --- Histórico de e-mails de um modelo (issue #523) ----------------------
   Tabela com colunas: o cabeçalho ordena, a linha logo abaixo filtra.
   A tabela rola DENTRO do próprio contêiner — a página nunca rola na
   horizontal. */

.abana-tabela-rolagem {
  overflow-x: auto;
}

.abana-tabela-envios {
  width: 100%;
  border-collapse: collapse;
  margin-top: 0.6rem;
}

.abana-tabela-envios th,
.abana-tabela-envios td {
  text-align: left;
  padding: 0.4rem 0.6rem;
  border-bottom: 1px solid var(--cor-borda);
  vertical-align: top;
}

.abana-tabela-envios thead th {
  color: var(--cor-texto);
  font-size: 0.85rem;
}

/* Cabeçalho clicável: declara fundo E cor do texto nos dois estados, e a
   coluna que está ordenando fica marcada com a cor de acento. */
.abana-cabecalho-ordenavel {
  display: inline-block;
  padding: 0.15rem 0.3rem;
  border-radius: var(--raio);
  background: transparent;
  color: var(--cor-texto);
  text-decoration: none;
}

.abana-cabecalho-ordenavel:hover,
.abana-cabecalho-ordenavel:focus-visible {
  background: var(--cor-secao);
  color: var(--cor-texto);
}

.abana-cabecalho-ordenavel.ordenando {
  background: transparent;
  color: var(--cor-acento);
  font-weight: 600;
}

.abana-linha-de-filtros th {
  padding-top: 0;
}

.abana-linha-de-filtros input,
.abana-linha-de-filtros select {
  width: 100%;
  min-width: 6rem;
  font-size: 0.85rem;
}

/* --- Editor do corpo de e-mail (issue #525) ------------------------------
   Barra estendida (cor, tamanho, alinhamento, link, imagem, botão) sobre
   o mesmo contenteditable do editor de texto rico do sistema.

   A ÁREA DE EDIÇÃO é branca nos dois temas, de propósito: ela é o
   "papel" do e-mail, e e-mail chega em fundo claro em praticamente todo
   cliente. Editar texto azul-escuro sobre fundo escuro e ver o cliente
   receber azul-escuro sobre branco seria mentir para quem escreve — a
   mesma razão do papel fixo da proposta no Propoutmos.

   Em compensação, tudo que FLUTUA por cima dela (os menus da barra)
   declara as próprias cores e segue o tema do SISTEMA, como manda a
   diretriz de interface flutuante. */

.texto-rico-area-email {
  background: #ffffff;
  color: #1f2933;
  min-height: 14rem;
  padding: 1rem;
}

.texto-rico-area-email a {
  color: #2563eb;
}

.texto-rico-area-email img {
  max-width: 100%;
  height: auto;
}

.texto-rico-menu {
  position: relative;
  display: inline-block;
}

.texto-rico-menu > summary {
  list-style: none;
  cursor: pointer;
}

.texto-rico-menu > summary::-webkit-details-marker {
  display: none;
}

/* Painel flutuante: cores próprias, porque ele é desenhado por cima do
   papel branco e não pode herdar nem o papel nem o tema do que estiver
   embaixo. */
.texto-rico-menu-painel {
  position: absolute;
  z-index: 40;
  top: calc(100% + 0.25rem);
  left: 0;
  min-width: 9rem;
  padding: 0.4rem;
  display: flex;
  flex-wrap: wrap;
  gap: 0.25rem;
  border-radius: var(--raio);
  border: 1px solid var(--cor-borda);
  background: var(--cor-fundo);
  color: var(--cor-texto);
  box-shadow: 0 8px 24px hsla(0, 0%, 0%, 0.18);
}

.texto-rico-cor {
  width: 1.4rem;
  height: 1.4rem;
  border-radius: 50%;
  border: 1px solid var(--cor-borda);
  cursor: pointer;
  /* A cor do fundo vem do style embutido (é a amostra em si); o texto é
     irrelevante porque o botão não tem texto — mas a regra declara as
     duas pontas para não ficar pela metade. */
  color: transparent;
}

/* O hover NÃO mexe em fundo nem em texto — só desenha um anel de foco em
   volta da amostra. Por isso não repete `color` aqui: repetir seria
   declarar meia regra de estado sem estado de cor nenhum. */
.texto-rico-cor:hover,
.texto-rico-cor:focus-visible {
  outline: 2px solid var(--cor-acento);
}

.texto-rico-item-menu {
  display: block;
  width: 100%;
  text-align: left;
  padding: 0.25rem 0.5rem;
  border: 1px solid transparent;
  border-radius: var(--raio);
  background: transparent;
  color: var(--cor-texto);
  cursor: pointer;
}

.texto-rico-item-menu:hover,
.texto-rico-item-menu:focus-visible {
  background: var(--cor-secao);
  color: var(--cor-texto);
  border-color: var(--cor-acento);
}

/* --- Guias (abas) do layout-base (issue #404) ------------------------------
   Nasceram na ficha da empresa do CRM e valem para qualquer tela que
   precise de seções alternáveis (core/templates/core/_guias.html). Cada
   estado declara fundo E cor do texto juntos — regra "nunca metade". */
.guias {
  display: flex;
  gap: 0.2rem;
  flex-wrap: wrap;
  border-bottom: 1px solid var(--cor-borda);
  margin: 1rem 0 1.4rem;
}

.guias .guia {
  padding: 0.5rem 0.9rem;
  text-decoration: none;
  background: transparent;
  color: var(--cor-texto-suave);
  border-bottom: 2px solid transparent;
  margin-bottom: -1px;
}

.guias .guia:hover,
.guias .guia:focus-visible {
  background: transparent;
  color: var(--cor-texto);
  text-decoration: none;
}

.guias .guia-ativa,
.guias .guia-ativa:hover,
.guias .guia-ativa:focus-visible {
  background: transparent;
  color: var(--cor-texto);
  font-weight: 600;
  border-bottom-color: var(--cor-secundaria);
}

/* --- Campo com sugestões (issue #587) --------------------------------------
   Texto LIVRE com uma janelinha de opções — o par da busca ancorada, para
   quando o valor não precisa existir na lista (categoria nova, por exemplo).
   Substitui o <datalist> nativo, que não aceita estilo e aparecia como texto
   cru fora do visual do sistema.

   Como todo painel flutuante do sistema, ele declara as PRÓPRIAS cores —
   fundo, texto e estados —, para não herdar a região que cobre. Cada estado
   que muda o fundo declara junto a cor do texto (regra "nunca metade"). */
.campo-sugestoes {
  position: relative;
  display: block;
  flex: 1 1 auto;
  min-width: 0;
}

.campo-sugestoes > input[type="text"] {
  width: 100%;
  /* Espaço para a seta, reservado no PADDING: o texto passa por baixo dela
     sem isto (mesma regra do gatilho com ícone à direita). */
  padding-right: 2rem;
  box-sizing: border-box;
}

.campo-sugestoes-seta {
  position: absolute;
  top: 0;
  right: 0;
  height: 100%;
  width: 2rem;
  display: flex;
  align-items: center;
  justify-content: center;
  border: 0;
  border-radius: 0 var(--raio) var(--raio) 0;
  background: transparent;
  color: var(--cor-texto-suave);
  font-size: 0.8rem;
  line-height: 1;
  cursor: pointer;
}

.campo-sugestoes-seta:hover,
.campo-sugestoes-seta:focus-visible {
  background: transparent;
  color: var(--cor-texto);
}

.campo-sugestoes-painel {
  position: absolute;
  z-index: 60;
  top: calc(100% + 3px);
  left: 0;
  right: 0;
  min-width: min(18rem, 88vw);
  background: var(--cor-fundo);
  color: var(--cor-texto);
  border: 1px solid var(--cor-borda);
  border-radius: var(--raio);
  box-shadow: 0 10px 28px rgba(0, 0, 0, 0.28);
  padding: 0.4rem;
}

/* `position: absolute` venceria o display:none de [hidden]; sem esta linha
   o painel fica sempre aberto. */
.campo-sugestoes-painel[hidden] {
  display: none;
}

.campo-sugestoes-lista {
  display: flex;
  flex-direction: column;
  max-height: 15rem;
  overflow-y: auto;
}

.campo-sugestoes-item {
  display: block;
  width: 100%;
  background: transparent;
  border: none;
  border-radius: var(--raio);
  color: var(--cor-texto);
  padding: 0.35rem 0.45rem;
  font: inherit;
  text-align: left;
  cursor: pointer;
}

.campo-sugestoes-item:hover,
.campo-sugestoes-item:focus-visible,
.campo-sugestoes-item.ativa {
  background: var(--cor-secao);
  color: var(--cor-texto);
}

.campo-sugestoes-item.escolhida {
  color: var(--cor-secundaria);
  font-weight: 600;
}

/* Estado vazio: diz o que houve, em texto visível. */
.campo-sugestoes-vazio {
  color: var(--cor-texto-suave);
  padding: 0.4rem 0.45rem;
  margin: 0;
  font-size: 0.85rem;
}

/* "Criar novo" no campo com sugestões (issue #589): a linha que diz, antes
   de salvar, que o texto escrito ainda não existe e será criado. Fundo e
   cor declarados juntos em cada estado — regra "nunca metade". */
.campo-sugestoes-novo {
  display: flex;
  align-items: center;
  gap: 0.5rem;
}

.campo-sugestoes-novo-nome {
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  font-weight: 600;
}

.campo-sugestoes-selo {
  margin-left: auto;
  flex: none;
  background: var(--cor-secao);
  color: var(--cor-texto-suave);
  border: 1px dashed var(--cor-borda-campo);
  border-radius: 999px;
  padding: 0.05rem 0.5rem;
  font-size: 0.75rem;
  font-weight: 400;
}

.campo-sugestoes-novo:hover .campo-sugestoes-selo,
.campo-sugestoes-novo:focus-visible .campo-sugestoes-selo,
.campo-sugestoes-novo.ativa .campo-sugestoes-selo {
  background: var(--cor-fundo);
  color: var(--cor-texto);
}

/* Enquanto o texto for inédito, a borda do campo avisa — assim a dica
   existe mesmo com o painel fechado. Só a borda muda: fundo e texto
   continuam os do campo. */
.campo-sugestoes-tem-novo > input[type="text"] {
  border-color: var(--cor-secundaria);
}

/* ---------------------------------------------------------------
   Composição do nome dos cartões (Abana, issue #607)

   A composição é uma fila de PÍLULAS ligadas por "+", com o exemplo
   do nome logo abaixo. Cada pílula traz as próprias ações (mover para
   antes/depois, remover), discretas até o hover ou o foco — padrão de
   ação destrutiva de linha do sistema.

   Todo estado que mexe no FUNDO declara junto a COR DO TEXTO (regra
   "nunca metade" do CLAUDE.md), nos dois temas.
   --------------------------------------------------------------- */
.abana-composicao {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 0.4rem;
  margin: 0.5rem 0;
}

.abana-composicao-mais {
  color: var(--cor-texto-suave);
  font-weight: 600;
}

.abana-pilula-parte {
  gap: 0.15rem;
  padding-right: 0.3rem;
}

/* As ações da pílula ficam quase apagadas até o mouse chegar — mas o
   foco de teclado SEMPRE as revela, senão elas não existiriam para quem
   navega sem mouse. */
.abana-pilula-parte .abana-icone-acao {
  opacity: 0.35;
  padding: 0 0.15rem;
  font-size: 0.85rem;
  background: transparent;
  color: var(--cor-texto);
}

.abana-pilula-parte:hover .abana-icone-acao,
.abana-pilula-parte .abana-icone-acao:focus-visible {
  opacity: 1;
  background: transparent;
  color: var(--cor-texto);
}

.abana-pilula-parte .abana-icone-acao:disabled {
  opacity: 0.15;
  background: transparent;
  color: var(--cor-texto);
}

.abana-exemplo-do-nome {
  margin: 0.5rem 0 1rem;
  padding: 0.5rem 0.8rem;
  border-left: 3px solid var(--cor-primaria);
  background: var(--cor-secao);
  color: var(--cor-texto);
  border-radius: 6px;
}

.abana-exemplo-do-nome strong {
  font-size: 1.05rem;
  color: var(--cor-texto);
}

.abana-acoes-da-receita {
  display: flex;
  flex-wrap: wrap;
  gap: 0.5rem;
  align-items: center;
}

/* Exemplos REAIS na tela de nomes de cartão (issue #607): "nome de hoje →
   nome novo", buscados no servidor enquanto a composição é montada. */
#exemplos-reais ul {
  margin: 0.35rem 0 0;
  padding-left: 1.1rem;
}

#exemplos-reais li {
  font-size: 0.9rem;
  color: var(--cor-texto);
  margin: 0.2rem 0;
}

.abana-exemplo-antes {
  color: var(--cor-texto-suave);
}

/* Aviso de "a renomeação está rodando" (Abana, issue #607).

   Ostensivo de propósito, mas SEM roda girando: o trabalho acontece no
   servidor, e uma roda diria "espere aqui" — que é o contrário do que
   vale. O texto diz que a pessoa pode fechar a tela. Declara fundo E cor
   do texto, como toda regra de estado do sistema. */
.abana-aplicando {
  display: flex;
  align-items: center;
  gap: 0.7rem;
  margin: 0.75rem 0;
  padding: 0.8rem 1rem;
  border: 1px solid var(--cor-borda);
  border-left: 4px solid var(--cor-primaria);
  border-radius: 8px;
  background: var(--cor-secao);
  color: var(--cor-texto);
  font-size: 0.95rem;
}

}


/* ---------------------------------------------------------------------------
   Funil de vendas (epic #699)
   --------------------------------------------------------------------------- */

/* Dias na etapa (issue #703): pílula discreta no cartão de quadro de funil.
   Declara fundo + cor nos dois estados, como toda pílula do sistema; a
   variante `esfriou` usa --cor-erro, que existe nos dois temas. */
/* Pedido do dono (2026-09-09, item 14): a MESMA roupagem do selo "Falta:"
   — pílula oval, fonte menor, borda fina — mantendo o vermelho do negócio
   parado. Os três selos do funil (etapa, próximo passo, falta) partilham
   este molde; só a cor muda com o estado. */
.abana-etapa-mini {
  display: inline-flex;
  align-items: center;
  font-size: 0.66rem;
  line-height: 1;
  padding: 0.15rem 0.45rem;
  border: 1px solid color-mix(in srgb, var(--cor-texto-suave) 35%, transparent);
  border-radius: 999px;
  background: color-mix(in srgb, var(--cor-texto-suave) 12%, transparent);
  color: var(--cor-texto-suave);
  font-weight: 500;
  white-space: nowrap;
  cursor: default;
}

.abana-etapa-mini.esfriou {
  background: color-mix(in srgb, var(--cor-erro) 14%, transparent);
  border-color: color-mix(in srgb, var(--cor-erro) 55%, transparent);
  color: var(--cor-erro);
  font-weight: 600;
}

/* Janelinha do motivo da perda (issue #702). A lista reaproveita
   .abana-janelinha-lista; aqui só a marca do escolhido, o detalhe e o botão. */
.abana-janelinha-motivo {
  width: 20rem;
}

.abana-motivo-opcoes button.escolhido,
.abana-motivo-opcoes button.escolhido:hover,
.abana-motivo-opcoes button.escolhido:focus-visible {
  background: color-mix(in srgb, var(--cor-primaria) 18%, transparent);
  color: var(--cor-texto);
  font-weight: 600;
}

.abana-motivo-detalhe {
  margin-top: 0.6rem;
}

.abana-motivo-detalhe textarea {
  background: var(--cor-campo);
  color: var(--cor-texto);
  border: 1px solid var(--cor-borda);
  border-radius: var(--raio);
  padding: 0.3rem 0.45rem;
  font: inherit;
  font-size: 0.85rem;
  resize: vertical;
}

.abana-motivo-acoes {
  display: flex;
  justify-content: flex-end;
  margin-top: 0.6rem;
}

/* O botão que fecha como perdido: vermelho, texto branco, nos dois estados
   e nos dois temas — regra "nunca metade" do CLAUDE.md. Desabilitado fica
   esmaecido, ainda legível. */
.abana-botao-perdido,
.abana-botao-perdido:hover,
.abana-botao-perdido:focus-visible {
  background: var(--cor-erro);
  border: 1px solid var(--cor-erro);
  color: #FFFFFF;
  border-radius: var(--raio);
  padding: 0.35rem 0.8rem;
  font-size: 0.85rem;
  cursor: pointer;
}

.abana-botao-perdido:hover:not(:disabled),
.abana-botao-perdido:focus-visible:not(:disabled) {
  filter: brightness(1.1);
}

.abana-botao-perdido:disabled {
  opacity: 0.5;
  cursor: not-allowed;
}

/* ------------------------------------------------------------------------
   Atividades do negócio — o contato com o cliente no cartão de funil
   (issues #713 e #714).

   Toda regra que muda o FUNDO declara junto a COR DO TEXTO, nos dois
   estados e nos dois temas (regra "nunca metade" do CLAUDE.md, conferida
   por core/lint_contraste.py).
   ------------------------------------------------------------------------ */
.abana-atividades-negocio {
  display: flex;
  flex-direction: column;
  gap: 0.35rem;
}

/* Rótulo x VALOR se distinguem de relance (diretriz de 2026-08-02): o
   rótulo é menor e apagado, o valor tem a cor cheia do texto. */
.abana-atividade-rotulo {
  color: var(--cor-texto-suave);
  font-size: 0.82em;
}

.abana-ultimo-contato,
.abana-proximo-passo {
  display: flex;
  flex-wrap: wrap;
  align-items: baseline;
  gap: 0.4rem;
  padding: 0.25rem 0;
}

.abana-ultimo-contato-valor,
.abana-proximo-passo-quando {
  color: var(--cor-texto);
  font-variant-numeric: tabular-nums;
}

/* Próximo passo ATRASADO: o mesmo vermelho e o mesmo peso do "negócio
   parado" do cartão (issue #703), para os dois avisos do funil se lerem
   como a mesma família de alerta. */
.abana-proximo-passo.atrasado .abana-proximo-passo-quando,
.abana-proximo-passo-atraso {
  color: var(--cor-erro);
  font-weight: 600;
}

.abana-atividade-linha {
  display: flex;
  flex-wrap: wrap;
  align-items: baseline;
  gap: 0.4rem;
  padding: 0.25rem 0;
  border-bottom: 1px solid var(--cor-borda-suave, var(--cor-borda));
}

.abana-atividade-linha:last-of-type { border-bottom: 0; }

.abana-atividade-quando {
  color: var(--cor-texto);
  font-variant-numeric: tabular-nums;
  white-space: nowrap;
}

.abana-atividade-duracao,
.abana-atividade-autor,
.abana-atividade-dica {
  color: var(--cor-texto-suave);
  font-size: 0.82em;
}

.abana-atividade-autor { margin-left: auto; }

.abana-atividade-resumo {
  min-width: 0;
  color: var(--cor-texto);
  overflow-wrap: break-word;
}

.abana-atividade-erro {
  color: var(--cor-erro);
  font-size: 0.85em;
}

/* Pílula do TIPO: informação categórica vira pílula (diretriz do
   projeto), com cor suave. A do passo PENDENTE é de outra matiz para o
   histórico e o compromisso não se confundirem. */
.abana-pilula-atividade {
  display: inline-block;
  padding: 0.05rem 0.5rem;
  border-radius: 999px;
  background: hsl(210, 45%, 90%);
  color: hsl(210, 55%, 25%);
  font-size: 0.78em;
  white-space: nowrap;
}

.abana-pilula-atividade.pendente {
  background: hsl(35, 55%, 88%);
  color: hsl(35, 60%, 24%);
}

:root[data-theme="dark"] .abana-pilula-atividade {
  background: hsl(210, 32%, 26%);
  color: hsl(210, 60%, 84%);
}

:root[data-theme="dark"] .abana-pilula-atividade.pendente {
  background: hsl(35, 35%, 26%);
  color: hsl(35, 70%, 84%);
}

@media (prefers-color-scheme: dark) {
  :root:not([data-theme="light"]) .abana-pilula-atividade {
    background: hsl(210, 32%, 26%);
    color: hsl(210, 60%, 84%);
  }
  :root:not([data-theme="light"]) .abana-pilula-atividade.pendente {
    background: hsl(35, 35%, 26%);
    color: hsl(35, 70%, 84%);
  }
}

/* Formulário de registro (Salvar explícito: é um CONJUNTO de escolhas). */
.abana-atividade-form {
  display: flex;
  flex-direction: column;
  gap: 0.4rem;
  margin-top: 0.4rem;
  padding-top: 0.5rem;
  border-top: 1px solid var(--cor-borda);
  /* Respiro antes da linha do tempo (pedido do dono, 2026-09-09, item
     21): os botões ficavam colados no primeiro item da lista. */
  margin-bottom: 1rem;
  padding-bottom: 0.6rem;
  border-bottom: 1px solid var(--cor-borda);
}

/* Os dois editores do formulário com a MESMA roupagem do compositor de
   comentário (item 18): campo com fundo, que se anuncia como lugar de
   escrever. Fundo e cor do texto declarados juntos, nos dois estados. */
.abana-atividade-form .abana-editor-conteudo {
  background: var(--cor-campo);
  border-color: var(--cor-borda-campo);
  color: var(--cor-texto);
}

.abana-atividade-form .abana-editor-conteudo:hover,
.abana-atividade-form .abana-editor-conteudo:focus-within,
.abana-atividade-form .abana-editor-conteudo:focus {
  background: var(--cor-campo);
  border-color: var(--cor-secundaria);
  color: var(--cor-texto);
}

/* O botão principal do formulário igual ao "Comentar" do compositor
   (mesma regra que .abana-painel-novo-comentario button). */
.abana-atividade-form .abana-comentario-acoes > button,
.abana-atividade-form .abana-comentario-acoes .dica > button {
  border: 1px solid var(--cor-borda);
  background: var(--cor-secao);
  color: var(--cor-texto);
  border-radius: var(--raio);
  padding: 0.35rem 0.9rem;
  cursor: pointer;
}

.abana-atividade-form .abana-comentario-acoes > button:disabled,
.abana-atividade-form .abana-comentario-acoes .dica > button:disabled {
  background: var(--cor-secao);
  color: var(--cor-texto-suave);
  cursor: not-allowed;
}

.abana-atividade-form-linha {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 0.4rem;
}

.abana-atividade-minutos {
  display: inline-flex;
  align-items: center;
  gap: 0.3rem;
  color: var(--cor-texto-suave);
  font-size: 0.82em;
}

.abana-atividade-minutos input {
  width: 4.5rem;
  padding: 0.2rem 0.35rem;
  font: inherit;
  background: var(--cor-fundo);
  color: var(--cor-texto);
  border: 1px solid var(--cor-borda);
  border-radius: 6px;
}

.abana-atividade-com-proximo {
  display: inline-flex;
  align-items: center;
  gap: 0.35rem;
  color: var(--cor-texto);
  font-size: 0.88em;
}

.abana-atividade-form-acoes {
  gap: 0.6rem;
}

.abana-atividade-acoes {
  display: inline-flex;
  align-items: center;
  gap: 0.3rem;
  margin-left: auto;
}

/* Gatilho em forma de pílula (tipo e data do formulário): o rótulo mora
   num elemento próprio, e é ELE que corta o texto — cortar na borda do
   botão passaria por baixo de qualquer ícone (diretriz de 2026-08-02). */
.abana-gatilho-pilula {
  display: inline-flex;
  align-items: center;
  max-width: 14rem;
  padding: 0.15rem 0.6rem;
  border: 1px solid var(--cor-borda);
  border-radius: 999px;
  background: var(--cor-fundo);
  color: var(--cor-texto);
  font: inherit;
  font-size: 0.85em;
  cursor: pointer;
}

.abana-gatilho-pilula:hover,
.abana-gatilho-pilula:focus-visible {
  background: var(--cor-fundo-suave, var(--cor-fundo));
  color: var(--cor-texto);
  border-color: var(--cor-secundaria);
  outline: none;
}

.abana-gatilho-rotulo {
  min-width: 0;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

/* Entrada de DIAS da condição "sem contato com o cliente" (issue #713):
   estreita, para não empurrar os operadores da linha da condição para
   fora. Fundo e cor do texto declarados juntos, como em todo campo. */
.abana-condicao-dias {
  width: 4.5rem;
  padding: 0.2rem 0.35rem;
  font: inherit;
  background: var(--cor-fundo);
  color: var(--cor-texto);
  border: 1px solid var(--cor-borda);
  border-radius: 6px;
}

/* Selo do PRÓXIMO PASSO no cartão de funil (issue #714). Mesma forma e
   mesmas cores do selo de "negócio parado" (.abana-etapa-mini): os dois
   avisos do funil precisam se ler como a mesma família. Fundo e cor do
   texto sempre juntos, nos dois estados. */
.abana-passo-mini {
  display: inline-flex;
  align-items: center;
  font-size: 0.66rem;
  line-height: 1;
  padding: 0.15rem 0.45rem;
  border: 1px solid color-mix(in srgb, var(--cor-texto-suave) 35%, transparent);
  border-radius: 999px;
  background: color-mix(in srgb, var(--cor-texto-suave) 12%, transparent);
  color: var(--cor-texto-suave);
  font-weight: 500;
  white-space: nowrap;
  cursor: default;
}

.abana-passo-mini.atrasado {
  background: color-mix(in srgb, var(--cor-erro) 14%, transparent);
  border-color: color-mix(in srgb, var(--cor-erro) 55%, transparent);
  color: var(--cor-erro);
  font-weight: 600;
}

/* Números do funil na barra do quadro (issue #714): "12 sem próximo
   passo · 3 atrasados". Cada um é um botão que aplica o filtro
   correspondente e fica destacado enquanto ele estiver valendo.

   Fundo, borda e cor do texto declarados na própria classe, nos três
   estados (normal, hover/foco e ativo) e nos dois temas — a regra "nunca
   metade" do CLAUDE.md, que é o que impede o texto de sumir no claro. */
.abana-funil-numeros {
  display: inline-flex;
  align-items: center;
  gap: 0.35rem;
}

.abana-funil-numero {
  padding: 0.2rem 0.55rem;
  border: 1px solid var(--cor-borda);
  border-radius: 999px;
  background: var(--cor-fundo);
  color: var(--cor-texto-suave);
  font: inherit;
  font-size: 0.8rem;
  line-height: 1.2;
  cursor: pointer;
  white-space: nowrap;
}

.abana-funil-numero:hover,
.abana-funil-numero:focus-visible {
  background: var(--cor-fundo);
  color: var(--cor-texto);
  border-color: var(--cor-secundaria);
  outline: none;
}

/* A previsão do quadro (issue #717): mesma pílula dos números do funil, mas
   é TEXTO, não botão — não há filtro por trás dela. Sem cursor de clique e
   sem estado de hover, para ninguém tentar clicar. Cores declaradas aqui,
   como manda a diretriz: a barra é desenhada sobre o fundo do quadro. */
.abana-funil-previsao {
  padding: 0.2rem 0.55rem;
  border: 1px solid var(--cor-borda);
  border-radius: 999px;
  background: var(--cor-fundo);
  color: var(--cor-texto);
  font-size: 0.8rem;
  line-height: 1.2;
  white-space: nowrap;
}

.abana-funil-numero.atrasado {
  color: var(--cor-erro);
  border-color: color-mix(in srgb, var(--cor-erro) 45%, var(--cor-borda));
}

.abana-funil-numero.atrasado:hover,
.abana-funil-numero.atrasado:focus-visible {
  background: color-mix(in srgb, var(--cor-erro) 12%, var(--cor-fundo));
  color: var(--cor-erro);
  border-color: var(--cor-erro);
}

/* Filtro aplicado: cor de acento e o ponto indicador, o mesmo par que o
   resto do sistema usa para dizer "esta lista está filtrada". */
.abana-funil-numero.ativo,
.abana-funil-numero.ativo:hover,
.abana-funil-numero.ativo:focus-visible {
  background: color-mix(in srgb, var(--cor-secundaria) 16%, var(--cor-fundo));
  color: var(--cor-texto);
  border-color: var(--cor-secundaria);
  font-weight: 600;
}

.abana-funil-numero.ativo::after {
  content: " •";
}

/* Janelinha das EXIGÊNCIAS de uma etapa (issue #712) — a de configurar
   (menu ⋮ da coluna) e a de preencher o que falta antes de mover. As duas
   têm a mesma forma de propósito: quem configurou reconhece o que a
   equipe vai ver. */
.abana-janelinha-exigencias {
  width: 24rem;
  max-width: calc(100vw - 2rem);
}

.abana-exigencias-lista {
  display: flex;
  flex-direction: column;
  gap: 0.45rem;
  max-height: 18rem;
  overflow-y: auto;
}

.abana-exigencia-linha {
  display: flex;
  flex-direction: column;
  gap: 0.15rem;
}

/* Rótulo menor e apagado, valor com a cor cheia (diretriz de 2026-08-02). */
.abana-exigencia-rotulo {
  color: var(--cor-texto-suave);
  font-size: 0.82em;
}

.abana-exigencia-linha input,
.abana-exigencia-linha select {
  width: 100%;
  box-sizing: border-box;
  padding: 0.3rem 0.4rem;
  font: inherit;
  background: var(--cor-fundo);
  color: var(--cor-texto);
  border: 1px solid var(--cor-borda);
  border-radius: 6px;
}

.abana-exigencia-escolha {
  display: flex;
  align-items: center;
  gap: 0.4rem;
  color: var(--cor-texto);
}

.abana-exigencia-opcoes {
  display: flex;
  flex-wrap: wrap;
  gap: 0.5rem;
  color: var(--cor-texto);
}

.abana-exigencia-dica {
  color: var(--cor-texto-suave);
  font-size: 0.85em;
  margin: 0.5rem 0 0;
}

/* Aviso de pendência do Salvar explícito: precisa ser lido, então tem a
   cor de atenção do sistema — e não o cinza de uma dica qualquer. */
.abana-exigencia-pendente {
  color: var(--cor-aviso, var(--cor-erro));
  font-size: 0.85em;
  margin: 0.5rem 0 0;
}

.abana-exigencia-acoes {
  display: flex;
  align-items: center;
  gap: 0.6rem;
  margin-top: 0.7rem;
}

/* ------------------------------------------------------------------------
   Arquivar cartões (issue #684): o botão do arquivo, a faixa do modo, a
   barra da seleção em lote, a caixinha do cartão e o selo de arquivado.

   Cada regra que muda o FUNDO declara junto a COR DO TEXTO, nos dois
   estados e nos dois temas (regra "nunca metade" do CLAUDE.md).
   ------------------------------------------------------------------------ */
.abana-botao-arquivados,
.abana-botao-selecao {
  padding: 0.2rem 0.6rem;
  border: 1px solid var(--cor-borda);
  border-radius: 999px;
  background: var(--cor-fundo);
  color: var(--cor-texto-suave);
  font: inherit;
  font-size: 0.8rem;
  line-height: 1.2;
  cursor: pointer;
  white-space: nowrap;
}

.abana-botao-arquivados:hover,
.abana-botao-arquivados:focus-visible,
.abana-botao-selecao:hover,
.abana-botao-selecao:focus-visible {
  background: var(--cor-fundo);
  color: var(--cor-texto);
  border-color: var(--cor-secundaria);
  outline: none;
}

/* Modo ligado: cor de acento e o ponto indicador, como todo controle que
   muda o que a lista mostra. */
.abana-botao-arquivados.ativo,
.abana-botao-arquivados.ativo:hover,
.abana-botao-arquivados.ativo:focus-visible,
.abana-botao-selecao.ativo,
.abana-botao-selecao.ativo:hover,
.abana-botao-selecao.ativo:focus-visible {
  background: color-mix(in srgb, var(--cor-secundaria) 16%, var(--cor-fundo));
  color: var(--cor-texto);
  border-color: var(--cor-secundaria);
  font-weight: 600;
}

.abana-botao-arquivados.ativo::after,
.abana-botao-selecao.ativo::after {
  content: " •";
}

.abana-faixa-arquivados {
  margin: 0 0 0.6rem;
  padding: 0.5rem 0.75rem;
  border-radius: var(--raio, 6px);
  border: 1px solid var(--cor-borda);
  background: color-mix(in srgb, var(--cor-texto-suave) 10%, var(--cor-fundo));
  color: var(--cor-texto);
  font-size: 0.88rem;
}

.abana-barra-selecao {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 0.7rem;
  margin: 0 0 0.6rem;
  padding: 0.45rem 0.75rem;
  border-radius: var(--raio, 6px);
  border: 1px solid var(--cor-secundaria);
  background: color-mix(in srgb, var(--cor-secundaria) 10%, var(--cor-fundo));
  color: var(--cor-texto);
  font-size: 0.88rem;
}

/* Caixinha da seleção no cartão: do tamanho do check de conclusão que ela
   substitui, para a linha do título não dançar ao entrar no modo. */
.abana-marcar-cartao {
  flex: 0 0 auto;
  width: 1rem;
  height: 1rem;
  margin: 0.1rem 0.1rem 0 0;
  cursor: pointer;
}

/* Selo "arquivado" no cartão — a mesma forma dos outros selos mini do
   cartão, em tom neutro: é um estado, não um alerta. */
.abana-arquivado-mini {
  display: inline-flex;
  align-items: center;
  font-size: 0.7rem;
  line-height: 1;
  padding: 0.15rem 0.4rem;
  border-radius: 10px;
  background: color-mix(in srgb, var(--cor-texto-suave) 18%, transparent);
  color: var(--cor-texto-suave);
  white-space: nowrap;
  cursor: default;
}

/* Busca do Abana — rótulos e pílulas de situação (reporte do dono,
   2026-09-09: "ARQUIVO Funil · Reunião Agendada arquivado" não dizia o
   que era o quê). Rótulo apagado e menor, valor na cor cheia; situação
   como pílula — fundo E cor declarados juntos, nos dois temas. */
.abana-busca-rotulo {
  color: var(--cor-texto-suave);
  font-size: 0.78em;
  margin-right: 0.15rem;
}

.abana-busca-situacao {
  display: inline-block;
  padding: 0.05rem 0.5rem;
  border-radius: 999px;
  font-size: 0.78em;
  white-space: nowrap;
  background: color-mix(in srgb, var(--cor-texto-suave) 18%, transparent);
  color: var(--cor-texto);
}

.abana-busca-situacao.concluida {
  background: hsl(145, 45%, 88%);
  color: hsl(145, 55%, 25%);
}

.abana-busca-situacao.falha {
  background: hsl(5, 60%, 90%);
  color: hsl(5, 60%, 30%);
}

:root[data-theme="dark"] .abana-busca-situacao.concluida { background: hsl(145, 30%, 25%); color: hsl(145, 55%, 82%); }
:root[data-theme="dark"] .abana-busca-situacao.falha { background: hsl(5, 35%, 26%); color: hsl(5, 70%, 84%); }
@media (prefers-color-scheme: dark) {
  :root:not([data-theme="light"]) .abana-busca-situacao.concluida { background: hsl(145, 30%, 25%); color: hsl(145, 55%, 82%); }
  :root:not([data-theme="light"]) .abana-busca-situacao.falha { background: hsl(5, 35%, 26%); color: hsl(5, 70%, 84%); }
}

/* Conversa do cartão com DOIS modos (pedido do dono, 2026-09-09): comentar
   e registrar atividade, na mesma caixa. Pílulas de aba — fundo, borda e
   cor declarados juntos nos três estados e nos dois temas ("nunca
   metade"). */
.abana-conversa-modos {
  display: inline-flex;
  gap: 0.35rem;
  margin: 0.4rem 0 0.5rem;
}

.abana-conversa-modo {
  padding: 0.2rem 0.7rem;
  border: 1px solid var(--cor-borda);
  border-radius: 999px;
  background: var(--cor-fundo);
  color: var(--cor-texto-suave);
  font: inherit;
  font-size: 0.82rem;
  cursor: pointer;
}

.abana-conversa-modo:hover,
.abana-conversa-modo:focus-visible {
  background: var(--cor-fundo);
  color: var(--cor-texto);
  border-color: var(--cor-secundaria);
  outline: none;
}

.abana-conversa-modo.ativo,
.abana-conversa-modo.ativo:hover,
.abana-conversa-modo.ativo:focus-visible {
  background: color-mix(in srgb, var(--cor-secundaria) 16%, var(--cor-fundo));
  color: var(--cor-texto);
  border-color: var(--cor-secundaria);
  font-weight: 600;
}

/* Contato feito na linha do tempo: a mesma forma de um comentário, com
   uma faixa à esquerda na matiz da pílula do tipo — é o que faz o olho
   separar "aconteceu com o cliente" de "alguém escreveu" sem ler. */
.abana-atividade-linha-do-tempo {
  border-left: 3px solid hsl(210, 45%, 60%);
  padding-left: 0.6rem;
}

.abana-atividade-linha-do-tempo .abana-comentario-cabecalho {
  display: flex;
  flex-wrap: wrap;
  align-items: baseline;
  gap: 0.4rem;
}

/* Selos do FUNIL no rodapé do cartão (pedido do dono, 2026-09-09, item
   20): uma linha divisória separa os parâmetros do cartão (em cima) do
   que é do funil (embaixo). Os selos têm a largura do cartão e quebram
   ENTRE eles, nunca dentro do texto. */
.abana-funil-selos {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 0.3rem;
  margin-top: 0.15rem;
  padding-top: 0.4rem;
  border-top: 1px solid var(--cor-borda);
}

/* Um molde só para os três selos (dias na etapa, próximo passo, o que
   falta): mesma fonte, mesmo respiro, mesma forma oval. As classes de
   cada selo só dizem a COR do estado — o tamanho mora aqui, para nenhum
   deles poder destoar dos outros. */
.abana-funil-selos > * {
  white-space: nowrap;
  flex: 0 0 auto;
  font-size: 0.66rem;
  line-height: 1;
  padding: 0.15rem 0.45rem;
  border-radius: 999px;
  border-width: 1px;
  border-style: solid;
}

/* "Falta: Valor do negócio" — o que a etapa exige e o cartão não tem
   (issue #712, criar é livre e o cartão sinaliza). Tom de atenção, não de
   erro: é pendência, não defeito. Fundo, borda e cor declarados nos dois
   estados. */
.abana-falta-mini {
  display: inline-flex;
  align-items: center;
  font: inherit;
  font-size: 0.66rem;
  line-height: 1;
  padding: 0.15rem 0.45rem;
  border: 1px solid color-mix(in srgb, var(--cor-aviso) 55%, transparent);
  border-radius: 999px;
  background: color-mix(in srgb, var(--cor-aviso) 16%, transparent);
  color: var(--cor-aviso);
  font-weight: 600;
  cursor: pointer;
  max-width: 100%;
  overflow: hidden;
  text-overflow: ellipsis;
}

.abana-falta-mini:hover,
.abana-falta-mini:focus-visible {
  background: color-mix(in srgb, var(--cor-aviso) 28%, transparent);
  color: var(--cor-texto);
  border-color: var(--cor-aviso);
  outline: none;
}

.abana-busca-separador {
  color: var(--cor-texto-suave);
  margin: 0 0.25rem;
}

/* (Os anexos do formulário de atividade usam .abana-anexos-pendentes e
   .abana-comentario-acoes, as mesmas regras do compositor de comentário —
   item 18 do dono, 2026-09-09.) */

/* --- Metas de venda do quadro (issue #718) --------------------------------
   Tabela de uma linha por pessoa: nome à esquerda, dinheiro à direita. Os
   números ficam alinhados pela direita porque é assim que se comparam
   valores de cima a baixo — a mesma escolha da tela de metas do Caloi. */

.abana-tabela-metas {
  width: 100%;
  border-collapse: collapse;
}

.abana-tabela-metas th,
.abana-tabela-metas td {
  padding: 0.45rem 0.6rem;
  border-bottom: 1px solid var(--cor-borda);
  vertical-align: top;
}

.abana-tabela-metas th[data-tipo="numero"],
.abana-metas-numero {
  text-align: right;
  white-space: nowrap;
}

/* O rodapé é o total do quadro: mesma cor de texto das linhas, só mais
   firme — não é um estado, é um resumo. */
.abana-tabela-metas tfoot th,
.abana-tabela-metas tfoot td {
  font-weight: 600;
  color: var(--cor-texto);
  border-top: 2px solid var(--cor-borda);
}

/* Navegação de mês: dois links soltos, com respiro entre eles. */
.abana-metas-meses {
  display: flex;
  gap: 0.6rem;
  align-items: baseline;
}

/* ------------------------------------------------------------------------
   Itens do negócio com TIPO DE COBRANÇA (epic #732, issue #733). O item
   deixou de ser uma linha de três colunas e virou um bloco: cabeçalho
   (nome, pílula do tipo, remover) e uma linha por parte — valor único,
   recorrência — mais o resumo calculado pelo servidor. Cores declaradas
   sempre em par (fundo + texto), nos dois temas, como manda a regra
   "nunca metade". */
.abana-item-negocio {
  display: flex; flex-direction: column; gap: .2rem;
  padding: .35rem 0;
}
.abana-item-negocio.pendente {
  /* Marca discreta do item com valor e sem tipo: uma linha à esquerda no
     tom de aviso, sem virar um bloco pintado. */
  border-left: 3px solid color-mix(in srgb, var(--cor-aviso) 65%, transparent);
  padding-left: .5rem;
}
.abana-item-negocio-cabecalho {
  display: flex; align-items: baseline; gap: .5rem;
}
.abana-item-negocio-cabecalho .abana-item-negocio-nome { flex: 1 1 auto; }
.abana-item-negocio-linha {
  /* Pela BASE do texto, não pelo centro: rótulo, símbolo, campo e pílula
     têm alturas diferentes, e centralizar deixava o número flutuando acima
     do "R$" (reporte do dono, 2026-09-10). */
  display: flex; flex-wrap: wrap; align-items: baseline; gap: .35rem .5rem;
  padding-left: .25rem;
}
.abana-item-negocio-rotulo {
  color: var(--cor-texto-suave); font-size: .82em; min-width: 5.5rem;
}
.abana-item-negocio-campo {
  display: inline-flex; align-items: baseline; gap: .15rem;
}
.abana-item-negocio-simbolo { color: var(--cor-texto-suave); font-size: .85em; }
/* Dentro do bloco do item o número fica COLADO ao símbolo: alinhado à
   esquerda e com a largura do que cabe — a regra geral (7,5rem à direita)
   deixava um vão entre "R$" e o valor, que se lia como espaços perdidos
   (reporte do dono, 2026-09-10). */
.abana-item-negocio-campo input.abana-item-negocio-valor {
  width: 6.5rem; text-align: left; padding: .05rem .25rem;
  /* Mesmo tamanho de letra do resto da linha — herdar a fonte cheia
     deixava o número maior e deslocado em relação ao "R$". */
  font-size: .92em; line-height: 1.3;
}
/* A dica do item sem tipo vai numa linha só dela, abaixo dos campos, em vez
   de se espremer entre o número e a borda. */
.abana-item-negocio-linha > .abana-item-negocio-dica { flex: 1 0 100%; }
/* A pílula-seletor do tipo e da frequência: a roupagem é a da pílula do
   sistema; o <select> fica por baixo. A que ainda não tem resposta veste o
   tom de AVISO — é a pendência que o cartão do quadro também aponta. */
select.abana-item-negocio-seletor {
  font: inherit; font-size: .78rem; color: var(--cor-texto);
  background-color: var(--cor-secao);
}
select.abana-item-negocio-seletor:hover,
select.abana-item-negocio-seletor:focus-visible {
  background-color: var(--cor-fundo); color: var(--cor-texto);
  border-color: var(--cor-texto-suave); outline: none;
}
.abana-item-negocio-sem-tipo,
select.abana-item-negocio-sem-tipo {
  background-color: color-mix(in srgb, var(--cor-aviso) 16%, transparent);
  border-color: color-mix(in srgb, var(--cor-aviso) 55%, transparent);
  color: var(--cor-aviso); font-weight: 600;
}
select.abana-item-negocio-sem-tipo:hover,
select.abana-item-negocio-sem-tipo:focus-visible {
  background-color: color-mix(in srgb, var(--cor-aviso) 28%, transparent);
  color: var(--cor-texto); border-color: var(--cor-aviso);
}
/* As OPÇÕES do dropdown nativo não herdam a roupagem da pílula: sem isto o
   navegador pinta a lista com o fundo claro dele e o texto no tom de aviso
   da pílula, e nada se lê (reporte do dono, 2026-09-10). Fundo e texto
   declarados juntos, no tema do sistema. */
select.abana-item-negocio-seletor option {
  background: var(--cor-fundo); color: var(--cor-texto); font-weight: 400;
}
.abana-item-negocio-outro,
.abana-item-negocio-prazo {
  display: inline-flex; align-items: center; gap: .3rem;
  color: var(--cor-texto-suave); font-size: .85em;
}
.abana-item-negocio-prazo strong { color: var(--cor-texto); }
/* Número pequeno (prazo, "a cada N"): mesma edição inline do valor. */
input.abana-item-negocio-numero {
  width: 3.4rem; box-sizing: border-box; text-align: right;
  border: 1px solid transparent; background: transparent; color: var(--cor-texto);
  border-radius: 6px; padding: .05rem .3rem; font: inherit; font-size: 1em; line-height: 1.3;
}
input.abana-item-negocio-numero:hover,
input.abana-item-negocio-numero:focus {
  background: var(--cor-fundo); color: var(--cor-texto);
  border-color: var(--cor-borda); outline: none;
}
.abana-item-negocio-resumo {
  display: flex; flex-wrap: wrap; gap: .25rem 1rem;
  padding-left: .25rem; color: var(--cor-texto-suave); font-size: .82em;
}
.abana-item-negocio-resumo strong {
  color: var(--cor-texto); font-variant-numeric: tabular-nums;
}
/* O total do cartão vira uma grade de dois pares (Total esperado / MRC). */
.abana-item-negocio-total {
  display: grid; grid-template-columns: auto 1fr auto auto;
  gap: .25rem .6rem; align-items: baseline;
}
.abana-item-negocio-total small { color: var(--cor-texto-suave); font-weight: 400; }
@media (max-width: 520px) {
  .abana-item-negocio-total { grid-template-columns: auto 1fr; }
}

/* Pílulas do VALOR DO NEGÓCIO no cartão do quadro (epic #732): total
   esperado e MRC, com a roupagem neutra da pílula — informação, não
   estado. Fundo e texto declarados juntos. */
.abana-pill-negocio {
  background: var(--cor-secao); color: var(--cor-texto);
  border-color: var(--cor-borda); font-variant-numeric: tabular-nums;
}
/* Selo "Tipo de cobrança?" no rodapé do funil: mesma família do "Falta:",
   mas não é botão — o clique no cartão já abre o painel. */
.abana-tipo-pendente { cursor: default; }
/* Contagem de itens sem tipo ao lado do MRC da coluna (issue #735). */
.abana-soma-pendentes {
  color: var(--cor-aviso); font-weight: 600; font-size: .85em;
}

/* O NOME do item é o gatilho para trocar o serviço (issue #736): parece
   texto comum e só se revela clicável no hover/foco — a mesma edição inline
   do resto da linha. Fundo e cor do texto declarados nos dois estados. */
button.abana-item-negocio-nome-trocavel {
  background: transparent; color: var(--cor-texto);
  border: 1px solid transparent; border-radius: 6px;
  padding: .1rem .3rem; margin-left: -.3rem; text-align: left;
  font: inherit; cursor: pointer;
}
button.abana-item-negocio-nome-trocavel:hover,
button.abana-item-negocio-nome-trocavel:focus-visible {
  background: var(--cor-fundo); color: var(--cor-texto);
  border-color: var(--cor-borda); outline: none;
}
button.abana-item-negocio-nome-trocavel .abana-item-negocio-dica { color: var(--cor-texto-suave); }
