:root {
  --roxo: #7C3AED;
  --ciano: #22d3ee;
  --bg: #f0efff;
  --card: #ffffff;
  --borda: #e4e2f8;
  --txt: #1e1b4b;
  --muted: #6b7280;
  --erro: #dc2626;
  --sucesso: #16a34a;
  --botao-primario-bg: #7C3AED;
  --botao-primario-txt: #ffffff;
  --botao-secundario-bg: #ffffff;
  --botao-secundario-txt: #7C3AED;
  --botao-secundario-borda: #7C3AED;
}

* { box-sizing: border-box; }

/* .form-hint (display:block) tem a mesma especificidade do [hidden] nativo do
   navegador e vem depois no CSS — sem isso, elementos com o atributo hidden
   (ex.: mensagem de erro do e-mail) apareceriam mesmo escondidos via JS. */
[hidden] { display: none !important; }

body {
  margin: 0;
  padding-top: 64px;
  background: var(--bg);
  color: var(--txt);
  font-family: 'Segoe UI', Arial, sans-serif;
}

a { color: inherit; text-decoration: none; }

/* Topo */
.topo-fixo {
  position: fixed;
  top: 0; left: 0; right: 0;
  height: 64px;
  background: #fff;
  border-bottom: 1px solid var(--borda);
  box-shadow: 0 1px 6px rgba(30, 27, 75, .06);
  z-index: 100;
  transition: transform .25s ease;
}

/* Some ao rolar pra baixo (só mobile, ver <script> em includes/topo.php) —
   depois que a faixa de ícones (.sub-nav) já sumiu, continuar rolando some
   também com o cabeçalho inteiro, liberando a tela toda pro post (post
   full-screen, tipo Reels). O espaço reservado no layout (padding-top do
   body) não muda, só desliza pra fora por cima do conteúdo — mesmo truque
   de .sub-nav.escondida. */
.topo-fixo.escondida {
  transform: translateY(-100%);
}

.topo-conteudo {
  position: relative;
  max-width: 1000px;
  height: 100%;
  margin: 0 auto;
  padding: 0 20px;
  display: flex;
  align-items: center;
  justify-content: space-between;
}

/* Badge de glicemia (Nightscout, includes/saude.php) — centralizado no meio
   do cabeçalho (entre a logo e os ícones), independente de quanto espaço a
   logo/nav ocupam nas pontas: position:absolute + left:50% relativo a
   .topo-conteudo (que já é position:relative acima) cobre isso sem precisar
   calcular nada em JS. Só existe no DOM quando o usuário habilitou em
   /saude/saude.php E tem um endereço salvo — hidden até o 1º fetch confirmar
   que dá pra ler o Nightscout (ver script em includes/topo.php). */
/* .topo-glicemia-grupo é quem fica centralizado (badge + botão de pausar,
   ver includes/topo.php) — o badge em si (.topo-glicemia) não é mais
   posicionado sozinho, só flexbox normal dentro do grupo. */
.topo-glicemia-grupo {
  position: absolute;
  left: 50%;
  top: 50%;
  transform: translate(-50%, -50%);
  display: flex;
  align-items: center;
  gap: 8px;
  /* Sustenta a animação de deslizar (técnica FLIP em JS, ver includes/
     topo.php) — sem isso, limpar o transform inline no frame seguinte
     "pularia" direto pra posição final em vez de animar até ela. */
  transition: transform .25s ease;
}

/* Estado "flutuante" — quando o cabeçalho inteiro some ao rolar pra baixo
   (.topo-fixo.escondida, ver includes/topo.php), o badge é reparentado pra
   fora dele (vira filho direto do <body>) e ganha isso aqui: fixo no canto
   direito da tela, sempre visível, sem depender de o cabeçalho estar à
   mostra. Precisa ser reparentado (não só trocar position:absolute por
   fixed no lugar) porque um ancestral com "transform" (o próprio
   .topo-fixo.escondida) vira o container de referência de qualquer filho
   "position:fixed" dentro dele — sem sair de lá, o badge "fixo" continuaria
   preso à posição do cabeçalho escondido, fora da tela. A animação de
   deslizar até aqui é feita em JS (técnica FLIP), não por transition de
   left/right (o pulo de position:absolute pra fixed não anima sozinho). */
.topo-glicemia-grupo.topo-glicemia-flutuante {
  position: fixed;
  top: 14px;
  left: auto;
  right: 14px;
  transform: none;
  z-index: 150;
}

.topo-glicemia {
  display: flex;
  align-items: center;
  gap: 6px;
  font-size: 1.15rem;
  font-weight: 700;
  color: var(--txt);
  white-space: nowrap;
  text-decoration: none;
  cursor: pointer;
  /* Virou <button> (era <a>) pra abrir o painel de detalhes em vez de
     navegar — reset dos estilos padrão de botão do navegador, mantendo a
     mesma aparência de antes. */
  background: none;
  border: none;
  padding: 0;
  font-family: inherit;
}

.topo-glicemia-icone {
  width: 20px;
  height: 20px;
  flex-shrink: 0;
  color: var(--roxo);
}

.topo-glicemia-baixa {
  color: #ef4444;
}

.topo-glicemia-baixa .topo-glicemia-icone {
  color: #ef4444;
}

.topo-glicemia-alta {
  color: #f59e0b;
}

.topo-glicemia-alta .topo-glicemia-icone {
  color: #f59e0b;
}

/* Botão "pausar alerta sonoro por 30min" — só aparece do lado do badge
   enquanto o alarme está de fato tocando (ver JS), nunca por padrão. */
.topo-glicemia-pausar {
  display: flex;
  align-items: center;
  justify-content: center;
  width: 26px;
  height: 26px;
  flex-shrink: 0;
  border: none;
  border-radius: 50%;
  background: rgba(239, 68, 68, .12);
  color: #ef4444;
  cursor: pointer;
}

.topo-glicemia-pausar svg {
  width: 16px;
  height: 16px;
}

/* Painel de detalhes da glicemia (gráfico de tendência + insulina ativa) —
   abre ao clicar no badge (#topo-glicemia), ver JS em includes/topo.php.
   Posicionado como dropdown logo abaixo do grupo — .topo-glicemia-grupo já
   é "position:absolute" (ou "fixed" quando flutuante, ver acima), então já
   é o container de referência pra esse "position:absolute" sem precisar de
   nenhum ajuste extra quando o badge estiver flutuando no canto da tela. */
.topo-glicemia-painel {
  position: absolute;
  top: calc(100% + 10px);
  left: 50%;
  transform: translateX(-50%);
  width: 360px;
  max-width: calc(100vw - 24px);
  background: var(--card);
  border: 1px solid var(--borda);
  border-radius: 14px;
  box-shadow: 0 8px 24px rgba(30, 27, 75, .14);
  padding: 14px;
  z-index: 160;
  text-align: left;
  white-space: normal;
}

.topo-glicemia-painel-topo {
  display: flex;
  align-items: baseline;
  gap: 8px;
  margin-bottom: 8px;
}

.topo-glicemia-painel-valor {
  font-size: 1.3rem;
  font-weight: 900;
  color: var(--txt);
}

.topo-glicemia-painel-tendencia {
  font-size: 1rem;
  color: var(--muted);
}

.topo-glicemia-grafico {
  display: block;
  width: 100%;
  height: 160px;
}

.topo-glicemia-painel-legenda {
  display: flex;
  align-items: center;
  gap: 6px;
  margin: 6px 0 0;
  font-size: .72rem;
  color: var(--muted);
}

.topo-glicemia-painel-legenda-marca {
  display: inline-block;
  width: 8px;
  height: 8px;
  border-radius: 2px;
  background: var(--ciano);
}

.topo-glicemia-painel-status {
  margin: 6px 0 0;
  font-size: .78rem;
  color: var(--muted);
  text-align: center;
}

.topo-glicemia-painel-iob {
  margin: 10px 0 0;
  padding: 8px 10px;
  background: rgba(124, 58, 237, .08);
  border-radius: 8px;
  font-size: .85rem;
  color: var(--txt);
  text-align: center;
}

.topo-glicemia-painel-iob-nota {
  display: block;
  margin-top: 4px;
  font-size: .7rem;
  font-weight: 400;
  color: var(--muted);
}

.topo-glicemia-painel-config {
  display: block;
  margin: 12px auto 0;
  text-align: center;
}

/* Ícones de Timeline (esquerda) e Comunidades (direita) logo abaixo do
   topo-fixo — só quando logado (ver includes/topo.php). Não é uma "barra"
   visual cheia (sem fundo/borda no contêiner): fica sobreposta ao conteúdo
   que rola por baixo, então cada ícone tem seu próprio fundo claro em forma
   de "meia lua" encostada no canto da tela (ver .sub-nav-item abaixo), só
   pra não ficar flutuando sem contraste em cima de um post. A altura do
   contêiner é a MESMA dos itens (52px, ver .sub-nav-item) — se fosse menor
   (os itens "vazando" pra fora do contêiner), o `.escondida` abaixo (que
   translada pela altura do próprio contêiner) deixaria uma sobra visível
   do fundo dos ícones abaixo do topo-fixo ao invés de escondê-la por
   completo atrás dele. */
.sub-nav {
  position: fixed;
  top: 64px;
  left: 0;
  right: 0;
  height: 52px;
  z-index: 99;
  max-width: 1000px;
  margin: 0 auto;
  display: flex;
  justify-content: space-between;
  transition: transform .25s ease;
  /* O contêiner é transparente entre os 2 ícones, mas continua sendo uma
     caixa de verdade cobrindo a largura toda (left:0;right:0) — sem isso,
     esse vão "invisível" ainda captura clique, bloqueando o que está por
     baixo (o cabeçalho do PRIMEIRO post, que fica exatamente nessa faixa
     desde que o post sobe até embaixo do topo-fixo). pointer-events:none
     aqui + pointer-events:auto só nos ícones (.sub-nav-item) deixa o clique
     "atravessar" o vão e chegar no post; os ícones continuam clicáveis. */
  pointer-events: none;
}

/* Some ao rolar pra baixo, volta ao rolar pra cima — ver <script> em
   includes/topo.php. translateY(-100%) move pela altura do contêiner
   (52px) — como o `.topo-fixo` tem 64px e z-index maior (100 > 99), a
   barra transladada (nova posição: top 64-52=12px, fundo em 12+52=64px)
   fica inteiramente coberta por ele, escondida de verdade (não só uma
   sobra visível saindo por baixo do cabeçalho). */
.sub-nav.escondida {
  transform: translateY(-100%);
}

/* Estágio 2 do "esconder tudo" ao rolar (só mobile, ver <script> em
   includes/topo.php): quando o `.topo-fixo` TAMBÉM esconde, ele para de
   cobrir a `.sub-nav` (que só estava "escondida" por estar encoberta por
   ele, não por estar de fato fora da tela — ver comentário de
   `.sub-nav.escondida` acima) — sem isso, a faixa de ícones "vazaria" de
   volta na tela assim que o cabeçalho sumisse. `calc(-100% - 64px)` soma
   a própria altura da `.sub-nav` (a translação normal de -100%) com a
   altura do `.topo-fixo` (64px, fixo), então some de vez, sincronizada
   com o cabeçalho. */
.sub-nav.escondida-total {
  transform: translateY(calc(-100% - 64px));
}

/* Fundo em quarto-de-círculo encostado no canto: o truque é dar 100% de
   border-radius só no canto OPOSTO ao canto da tela que o ícone ocupa — o
   canto colado na tela fica reto (sem arredondar), e o resultado é um
   quarto de círculo com o centro nesse canto reto, curva voltada pro
   conteúdo. Item da esquerda: canto reto é o superior-esquerdo (arredonda
   só o inferior-direito). Item da direita: espelhado. */
.sub-nav-item {
  width: 52px;
  height: 52px;
  display: flex;
  align-items: flex-start;
  padding-top: 12px;
  background: var(--card);
  color: var(--muted);
  /* .sub-nav (pai) tem pointer-events:none pro vão transparente entre os
     ícones não bloquear clique no post por baixo — precisa reativar aqui,
     senão os próprios ícones também parariam de responder a clique. */
  pointer-events: auto;
}

.sub-nav-item svg {
  width: 22px;
  height: 22px;
}

.sub-nav-item:first-child {
  border-radius: 0 0 52px 0;
  justify-content: flex-start;
  padding-left: 12px;
}

.sub-nav-item:last-child {
  border-radius: 0 0 0 52px;
  justify-content: flex-end;
  padding-right: 12px;
}

.sub-nav-item.ativo {
  color: var(--roxo);
}

/* Propositalmente NÃO soma padding-top extra pros ícones de Timeline/
   Comunidades (diferente da antiga barra cheia) — o pedido é que o conteúdo
   suba e fique por baixo deles (só a área dos 2 fundos "meia lua" cobre o
   topo do primeiro post; o resto da faixa é transparente e deixa o post
   aparecer por baixo). .nav-lateral do desktop continua com seu próprio
   offset (ver media query 900px mais abaixo), independente disso. */

.topo-logo {
  font-size: 1.4rem;
  font-weight: 900;
  font-style: italic;
  letter-spacing: -1px;
  color: var(--roxo);
}

.topo-nav {
  display: flex;
  align-items: center;
  gap: 12px;
}

.topo-busca-link {
  display: flex;
  color: var(--txt);
}

.topo-busca-link svg {
  width: 24px;
  height: 24px;
}

.topo-notificacoes {
  position: relative;
  display: flex;
  color: var(--txt);
  background: none;
  border: none;
  padding: 0;
  cursor: pointer;
}

.topo-notificacoes svg {
  width: 24px;
  height: 24px;
}

.topo-notificacoes-ponto {
  position: absolute;
  top: -2px;
  right: -2px;
  width: 9px;
  height: 9px;
  border-radius: 50%;
  background: #e0245e;
  border: 2px solid #fff;
}

.topo-avatar {
  width: 32px;
  height: 32px;
  border-radius: 50%;
  flex-shrink: 0;
  background: var(--roxo);
  color: #fff;
  display: flex;
  align-items: center;
  justify-content: center;
  font-weight: 700;
  font-size: .9rem;
}

/* No mobile, o avatar do topo vira um botão de acesso à loja; no desktop
   (900px+, ver media query da .nav-lateral mais abaixo) volta a ser o
   avatar, já que a versão desktop não pediu essa troca. */
.topo-shop-link {
  display: flex;
  color: var(--txt);
}

.topo-shop-link svg {
  width: 24px;
  height: 24px;
}

.topo-avatar-link {
  display: none;
}

/* Botões */
.botao {
  display: inline-block;
  padding: 10px 20px;
  border-radius: 10px;
  font-weight: 700;
  font-size: .9rem;
  border: none;
  cursor: pointer;
}

.botao-primario {
  background: var(--botao-primario-bg);
  color: var(--botao-primario-txt);
}

.botao-secundario {
  background: var(--botao-secundario-bg);
  color: var(--botao-secundario-txt);
  border: 1px solid var(--botao-secundario-borda);
}

/* Layout */
.container {
  max-width: 600px;
  margin: 32px auto;
  padding: 0 16px;
}

/* Quando os ícones de Timeline/Comunidades estão presentes (.sub-nav, ver
   includes/topo.php), o conteúdo sobe até encostar no .topo-fixo (zera a
   margem superior do .container) — os ícones ficam por cima (fixed,
   z-index:99, pintam depois do fluxo normal da página independente do
   z-index interno do post) em vez de ganharem uma faixa reservada vazia. */
body.tem-sub-nav .container {
  margin-top: 0;
}

.feed-vazio {
  background: var(--card);
  border: 1px solid var(--borda);
  border-radius: 14px;
  padding: 48px 24px;
  text-align: center;
  color: var(--muted);
}

/* comunidades.php (grade) e comunidade.php (detalhe + mural) — ver
   includes/comunidades.php. Comunidades hoje só são CRIADAS pela ferramenta
   de povoamento (cp/povoar.php, área "Comunidades"), mas participar/sair e
   mandar mensagem no mural já são de verdade, pelo site. */
.comunidades-grade {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(240px, 1fr));
  gap: 16px;
}

.comunidade-card {
  background: var(--card);
  border: 1px solid var(--borda);
  border-radius: 14px;
  overflow: hidden;
}

.comunidade-card-foto {
  height: 120px;
  background: linear-gradient(135deg, var(--roxo), var(--ciano));
  background-size: cover;
  background-position: center;
}

.comunidade-card-corpo {
  padding: 14px 16px;
}

.comunidade-card-nome {
  font-size: 1rem;
  margin-bottom: 6px;
}

.comunidade-card-descricao {
  font-size: .85rem;
  color: var(--muted);
  line-height: 1.4;
  display: -webkit-box;
  -webkit-line-clamp: 3;
  -webkit-box-orient: vertical;
  overflow: hidden;
}

.comunidade-card-foto {
  display: block;
}

.comunidade-card-nome-link {
  color: var(--txt);
  text-decoration: none;
}

.comunidade-card-rodape {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 10px;
  margin-top: 12px;
}

.comunidade-card-membros {
  display: flex;
  align-items: center;
  gap: 8px;
  min-width: 0;
}

.comunidade-avatares-mini {
  display: flex;
  flex-shrink: 0;
}

.comunidade-avatar-mini {
  width: 24px;
  height: 24px;
  border-radius: 50%;
  border: 2px solid var(--card);
  margin-left: -8px;
  flex-shrink: 0;
  background: var(--roxo);
  color: #fff;
  display: flex;
  align-items: center;
  justify-content: center;
  font-weight: 700;
  font-size: .65rem;
}

.comunidade-avatar-mini:first-child {
  margin-left: 0;
}

.comunidade-card-membros-total {
  font-size: .78rem;
  color: var(--muted);
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}

.botao-participar {
  flex-shrink: 0;
  padding: 6px 14px;
  font-size: .85rem;
}

/* comunidade.php — detalhe */
.comunidade-capa {
  height: 160px;
  border-radius: 14px;
  background: linear-gradient(135deg, var(--roxo), var(--ciano));
  background-size: cover;
  background-position: center;
  margin-bottom: 16px;
}

.comunidade-cabecalho {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 12px;
  margin-bottom: 8px;
}

.comunidade-titulo {
  font-size: 1.3rem;
  margin-bottom: 4px;
}

.comunidade-membros-total {
  color: var(--muted);
  font-size: .85rem;
}

.comunidade-descricao {
  color: var(--txt);
  line-height: 1.5;
  margin-bottom: 24px;
}

.comunidade-secao {
  margin-bottom: 28px;
}

.comunidade-secao-titulo {
  font-size: 1.05rem;
  margin-bottom: 12px;
}

.comunidade-membros-lista {
  display: flex;
  flex-wrap: wrap;
  gap: 10px;
}

.comunidade-membro-item {
  display: flex;
  align-items: center;
  gap: 6px;
  padding: 6px 10px 6px 6px;
  background: var(--card);
  border: 1px solid var(--borda);
  border-radius: 999px;
  color: var(--txt);
  text-decoration: none;
  font-size: .85rem;
}

.comunidade-membro-avatar {
  width: 24px;
  height: 24px;
  border-radius: 50%;
  flex-shrink: 0;
  background: var(--roxo);
  color: #fff;
  display: flex;
  align-items: center;
  justify-content: center;
  font-weight: 700;
  font-size: .7rem;
}

.comunidade-mural {
  display: flex;
  flex-direction: column;
  gap: 14px;
  max-height: 420px;
  overflow-y: auto;
  padding: 4px;
  margin-bottom: 12px;
}

.comunidade-mural-vazio {
  color: var(--muted);
  font-size: .9rem;
}

.comunidade-mensagem {
  display: flex;
  gap: 10px;
}

.comunidade-mensagem-avatar {
  width: 34px;
  height: 34px;
  border-radius: 50%;
  flex-shrink: 0;
  background: var(--roxo);
  color: #fff;
  display: flex;
  align-items: center;
  justify-content: center;
  font-weight: 700;
  font-size: .85rem;
}

.comunidade-mensagem-corpo {
  background: var(--card);
  border: 1px solid var(--borda);
  border-radius: 12px;
  padding: 8px 12px;
  min-width: 0;
}

.comunidade-mensagem-usuario {
  display: block;
  font-weight: 700;
  font-size: .8rem;
  color: var(--roxo);
  text-decoration: none;
  margin-bottom: 2px;
}

.comunidade-mensagem-texto {
  font-size: .9rem;
  line-height: 1.4;
  word-break: break-word;
}

.comunidade-mensagem-tempo {
  font-size: .72rem;
  color: var(--muted);
}

.comunidade-mensagem-form {
  display: flex;
  align-items: center;
  gap: 8px;
}

.comunidade-mensagem-form input {
  flex: 1;
  border: 1px solid var(--borda);
  border-radius: 20px;
  padding: 10px 14px;
  font-size: .9rem;
  color: var(--txt);
}

.comunidade-mensagem-form input:focus {
  outline: none;
  border-color: var(--roxo);
}

.comunidade-mensagem-form button {
  border: none;
  background: none;
  color: var(--roxo);
  font-weight: 700;
  cursor: pointer;
  padding: 8px 4px;
}

/* perfil.php — carrossel de comunidades (acima dos depoimentos) + lista
   completa na aba "Comunidades", ver includes/comunidades.php
   listar_comunidades_participando(). */
.perfil-comunidades-carrossel-cabecalho {
  display: flex;
  align-items: center;
  justify-content: space-between;
  margin-bottom: 10px;
}

.perfil-comunidades-ver-mais {
  border: none;
  background: none;
  color: var(--roxo);
  font-weight: 700;
  font-size: .85rem;
  cursor: pointer;
  padding: 4px;
}

.perfil-comunidades-carrossel-lista {
  display: flex;
  gap: 16px;
  overflow-x: auto;
  padding-bottom: 4px;
  -webkit-overflow-scrolling: touch;
}

.perfil-comunidade-mini {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 6px;
  width: 76px;
  flex-shrink: 0;
  text-decoration: none;
  text-align: center;
}

.perfil-comunidade-mini-foto {
  width: 64px;
  height: 64px;
  border-radius: 50%;
  background: linear-gradient(135deg, var(--roxo), var(--ciano));
  background-size: cover;
  background-position: center;
  border: 2px solid var(--borda);
  flex-shrink: 0;
}

.perfil-comunidade-mini-nome {
  font-size: .75rem;
  color: var(--txt);
  line-height: 1.2;
  display: -webkit-box;
  -webkit-line-clamp: 2;
  -webkit-box-orient: vertical;
  overflow: hidden;
}

.perfil-comunidades-lista {
  display: flex;
  flex-direction: column;
  gap: 10px;
}

.perfil-comunidade-item {
  display: flex;
  align-items: center;
  gap: 12px;
  padding: 10px;
  background: var(--card);
  border: 1px solid var(--borda);
  border-radius: 12px;
  text-decoration: none;
  color: var(--txt);
}

.perfil-comunidade-item-foto {
  width: 52px;
  height: 52px;
  border-radius: 50%;
  background: linear-gradient(135deg, var(--roxo), var(--ciano));
  background-size: cover;
  background-position: center;
  flex-shrink: 0;
}

.perfil-comunidade-item-corpo {
  display: flex;
  flex-direction: column;
  gap: 2px;
  min-width: 0;
}

.perfil-comunidade-item-nome {
  font-size: .95rem;
}

.perfil-comunidade-item-descricao {
  font-size: .8rem;
  color: var(--muted);
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.perfil-comunidade-item-membros {
  font-size: .75rem;
  color: var(--muted);
}

.post-card {
  background: var(--card);
  border: 1px solid var(--borda);
  border-radius: 14px;
  overflow: hidden;
  margin-bottom: 20px;
}

/* Mobile: post ocupa 100% da largura da tela, sem a margem lateral de
   16px do .container (compensada com margem negativa) nem cantos
   arredondados/bordas laterais, ficando "de ponta a ponta" como o
   feed do Instagram — só o post-card, o resto do .container (formulários
   de login/cadastro etc.) continua com o respiro normal. */
@media (max-width: 640px) {
  .post-card {
    margin-left: -16px;
    margin-right: -16px;
    border-left: none;
    border-right: none;
    border-radius: 0;
  }

  /* O cabeçalho do PRIMEIRO post do feed começa colado no canto superior
     esquerdo da tela (post de ponta a ponta + .container sem margem
     superior, ver body.tem-sub-nav acima) — exatamente onde fica o fundo
     "meia lua" do ícone de Timeline. Sem esse respiro a mais, avatar+
     @usuario ficariam escondidos atrás do ícone. Só o primeiro post
     precisa: os demais já rolam abaixo da faixa dos ícones. */
  body.tem-sub-nav .post-card:first-child .post-header,
  body.tem-sub-nav .post-card:first-child .post-midias-overlay-header {
    padding-left: 64px;
  }
}

.post-header {
  display: flex;
  align-items: center;
  gap: 10px;
  padding: 14px 16px;
  font-weight: 700;
  color: var(--txt);
}

.post-header-link {
  display: flex;
  align-items: center;
  gap: 10px;
  color: inherit;
  min-width: 0;
}

.post-video-link {
  display: flex;
  align-items: center;
  gap: 8px;
  color: inherit;
  min-width: 0;
}

/* Botão discreto de seguir no cabeçalho do post (feed) — some assim que o
   clique tem sucesso (ver JS), não vira "Seguindo" aqui (isso só existe na
   página de perfil). Fica dentro de .post-header-acoes/.post-midias-overlay-acoes
   junto do botão de 3 pontinhos — o wrapper (não o botão) leva margin-left:auto,
   pra empurrar os dois juntos pra ponta direita sem abrir um vão entre eles
   quando os dois tivessem margem própria. */
.post-header-acoes,
.post-midias-overlay-acoes {
  margin-left: auto;
  flex-shrink: 0;
  display: flex;
  align-items: center;
  gap: 8px;
}

.post-seguir {
  flex-shrink: 0;
  background: none;
  border: 1px solid var(--roxo);
  color: var(--roxo);
  border-radius: 8px;
  padding: 4px 12px;
  font-size: .78rem;
  font-weight: 700;
  cursor: pointer;
}

.post-seguir-video {
  border-color: #fff;
  color: #fff;
}

/* Botão de 3 pontinhos (menu "editar/catálogo/reportar/excluir") no canto
   superior direito de cada post — abre .post-menu-modal, ver mais abaixo.
   Ícone vertical (⋮), diferente do "mais" horizontal da nav inferior, pra
   não confundir os dois padrões visuais. */
.post-menu-abrir {
  flex-shrink: 0;
  background: none;
  border: none;
  color: var(--muted);
  padding: 2px;
  cursor: pointer;
  display: flex;
}

.post-menu-abrir-video {
  color: #fff;
}

.post-menu-abrir svg {
  width: 20px;
  height: 20px;
}

.post-header-avatar {
  width: 32px;
  height: 32px;
  border-radius: 50%;
  flex-shrink: 0;
  background: var(--roxo);
  color: #fff;
  display: flex;
  align-items: center;
  justify-content: center;
  font-weight: 700;
  font-size: .9rem;
}

.post-header-tempo {
  font-size: .8rem;
  font-weight: 400;
  color: var(--muted);
}

/* Post cujo slide ativo é vídeo: header normal some e um header sobreposto
   (estilo Reels) aparece em cima do vídeo — ver .video-em-foco abaixo. */
.post-card.video-em-foco .post-header {
  display: none;
}

.post-midias-principal {
  position: relative;
  aspect-ratio: 4 / 5;
  max-height: 600px;
  margin: 0 auto;
  background: #000;
  overflow: hidden;
  touch-action: pan-y;
}

.post-midias-overlay-header {
  display: none;
  position: absolute;
  top: 0;
  left: 0;
  right: 0;
  z-index: 3;
  align-items: center;
  gap: 8px;
  padding: 12px;
  background: linear-gradient(180deg, rgba(0, 0, 0, .6), rgba(0, 0, 0, 0));
  color: #fff;
}

.post-card.video-em-foco .post-midias-overlay-header {
  display: flex;
}

.post-video-avatar {
  width: 30px;
  height: 30px;
  border-radius: 50%;
  flex-shrink: 0;
  background: var(--roxo);
  color: #fff;
  display: flex;
  align-items: center;
  justify-content: center;
  font-weight: 700;
  font-size: .85rem;
}

.post-video-usuario {
  font-weight: 700;
  font-size: .9rem;
}

.post-video-tempo {
  font-size: .8rem;
  opacity: .85;
}

.post-midias-slide {
  display: none;
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
  /* Sem isso, o navegador (mouse/desktop) interpreta o arrasto como um
     "arrastar imagem" nativo (drag-and-drop de <img>) assim que o botão é
     pressionado sobre a foto — isso sequestra os eventos de ponteiro no meio
     do gesto, então pointermove/pointerup customizados (trocar de slide)
     param de disparar. -webkit-user-drag:none desliga esse comportamento
     nativo; user-select evita selecionar texto/imagem sem querer durante o
     arrasto. */
  -webkit-user-drag: none;
  user-select: none;
}

.post-midias-slide.ativo {
  display: block;
}

.post-midias-seta {
  position: absolute;
  top: 50%;
  transform: translateY(-50%);
  z-index: 2;
  width: 34px;
  height: 34px;
  border: none;
  border-radius: 50%;
  background: rgba(0, 0, 0, .45);
  color: #fff;
  display: flex;
  align-items: center;
  justify-content: center;
  cursor: pointer;
}

.post-midias-seta:disabled {
  opacity: 0;
  pointer-events: none;
}

.post-midias-seta svg {
  width: 18px;
  height: 18px;
}

.post-midias-seta-anterior {
  left: 10px;
}

.post-midias-seta-proxima {
  right: 10px;
}

/* Botão de som (canto inferior direito, estilo Reels do Instagram) — só
   aparece quando o slide ativo é vídeo (.post-card.video-em-foco, mesma
   classe do header sobreposto). */
.post-midias-som {
  display: none;
  position: absolute;
  right: 10px;
  bottom: 10px;
  z-index: 3;
  width: 30px;
  height: 30px;
  border: none;
  border-radius: 50%;
  background: rgba(0, 0, 0, .45);
  color: #fff;
  align-items: center;
  justify-content: center;
  cursor: pointer;
}

.post-card.video-em-foco .post-midias-som {
  display: flex;
}

.post-midias-som svg {
  width: 16px;
  height: 16px;
}

.post-midias-miniaturas {
  display: flex;
  justify-content: center;
  gap: 6px;
  padding: 8px;
  overflow-x: auto;
}

.post-midias-miniatura {
  flex-shrink: 0;
  width: 56px;
  height: 56px;
  padding: 0;
  border: 2px solid transparent;
  border-radius: 8px;
  overflow: hidden;
  background: none;
  cursor: pointer;
}

.post-midias-miniatura.ativo {
  border-color: var(--roxo);
}

.post-midias-miniatura img,
.post-midias-miniatura video {
  width: 100%;
  height: 100%;
  object-fit: cover;
  display: block;
  pointer-events: none;
}

.post-legenda-bloco {
  padding: 12px 16px 0;
}

.post-conteudo {
  color: var(--txt);
  line-height: 1.4;
  /* white-space:pre-wrap preserva quebra de linha sem precisar de nl2br()
     (que insere <br>) — o mesmo texto com <br> dentro de um
     -webkit-line-clamp mostrava uma linha a mais "vazando" abaixo das
     reticências em alguns navegadores/Android (bug reportado 2026-08-14);
     .depoimento-texto (perfil.php) já usava esse padrão sem esse problema. */
  white-space: pre-wrap;
}

/* Legenda truncada em 2 linhas — NÃO usa mais -webkit-line-clamp (o "Ver
   mais" precisa ficar exatamente do lado das reticências, e o navegador não
   dá nenhum jeito de saber onde ele desenhou o "...", só de "cobrir" um
   pedaço de tamanho fixo por cima, o que fica errado quando a última linha
   visível não enche a largura toda). Em vez disso, o JS mede a altura de 2
   linhas e vai cortando o texto (busca binária) até "...Ver mais" caber —
   ver aplicarTruncamentoLegenda() em index.php. Enquanto isso, "Ver mais" é
   movido pra dentro de `.post-conteudo-truncado`, como o ÚLTIMO PEDAÇO DE
   TEXTO (não um elemento sobreposto) — fica "do lado" das reticências porque
   literalmente É o próximo conteúdo depois delas no fluxo normal do HTML. */
.post-conteudo-truncado {
  overflow: hidden;
}

.post-conteudo-ver-mais {
  display: inline;
  background: none;
  border: none;
  padding: 0;
  margin: 0;
  font-size: .8rem;
  font-weight: 700;
  color: var(--roxo);
  cursor: pointer;
}

/* Estado expandido ("Ver menos"): o JS move o botão pra ser filho DIRETO de
   `.post-legenda-bloco` (não mais aninhado dentro de `.post-conteudo-
   truncado`) — o seletor de filho direto (>) diferencia os dois estados sem
   precisar de nenhuma classe extra: numa linha normal, abaixo do texto
   completo, em vez de grudado ao final de um texto truncado. */
.post-legenda-bloco > .post-conteudo-ver-mais {
  display: block;
  margin-top: 2px;
}

/* Data de publicação abaixo da legenda (post_tempo_publicacao(),
   includes/funcoes.php) — diferente de .post-header-tempo (cabeçalho, sempre
   curto tipo "9 h"): aqui vira data por extenso a partir de 1 mês. */
.post-tempo {
  padding: 6px 16px 16px;
  font-size: .74rem;
  color: var(--muted);
}

/* @menção/#hashtag dentro de legenda/comentário (linkificar_texto(),
   includes/funcoes.php) — cor da marca pra se destacar do texto normal. */
.texto-mencao,
.texto-hashtag {
  color: var(--roxo);
  font-weight: 600;
}

.post-acoes {
  display: flex;
  align-items: center;
  justify-content: space-between;
  padding: 10px 16px 0;
}

.post-acoes-esquerda {
  display: flex;
  align-items: center;
  gap: 18px;
}

.post-acao {
  display: flex;
  align-items: center;
  gap: 6px;
  background: none;
  border: none;
  padding: 4px;
  cursor: pointer;
  color: var(--txt);
  font-size: .85rem;
  font-weight: 600;
}

.post-acao svg {
  width: 24px;
  height: 24px;
}

/* Discreta de propósito (2026-08-18, pedido explícito) — some no meio dos
   ícones principais de ação (curtir/comentar/compartilhar), então usa ícone
   bem menor + opacidade reduzida, e fica isolada do lado direito de
   .post-acoes (justify-content:space-between acima) em vez de dentro de
   .post-acoes-esquerda, pra não competir visualmente com os botões de
   verdade. */
.post-visualizacoes {
  display: flex;
  align-items: center;
  gap: 3px;
  cursor: default; /* só exibe contagem, diferente dos outros .post-acao que são botões clicáveis */
  color: var(--muted);
  font-size: .72rem;
  font-weight: 500;
  opacity: .75;
  flex-shrink: 0;
}

.post-visualizacoes svg {
  width: 15px;
  height: 15px;
}

.post-curtir.curtido {
  color: #e0245e;
}

/* Avatares em miniatura de "quem curtiu" (mesmo espírito de
   .comunidade-avatares-mini/.comunidade-avatar-mini) — só aparece quando o
   post tem pelo menos 1 curtida (ver listar_curtidas_preview_post()). Fica
   na PRÓPRIA LINHA, logo abaixo de .post-acoes (pedido explícito do
   usuário) — não mais dentro de .post-acoes-esquerda, junto dos botões de
   curtir/comentar/compartilhar. Clicar abre .post-curtidas-popover (abaixo)
   ancorado perto do botão. */
.post-curtidas-avatares {
  display: flex;
  align-items: center;
  background: none;
  border: none;
  padding: 2px 16px 0;
  margin-top: 2px;
  cursor: pointer;
  flex-shrink: 0;
}

.post-curtidas-avatar-mini {
  width: 22px;
  height: 22px;
  border-radius: 50%;
  border: 2px solid var(--card);
  margin-left: -8px;
  flex-shrink: 0;
  background: var(--roxo);
  color: #fff;
  display: flex;
  align-items: center;
  justify-content: center;
  font-weight: 700;
  font-size: .62rem;
}

.post-curtidas-avatar-mini:first-child {
  margin-left: 0;
}

/* Painel pequeno (não é modal de tela cheia) que abre ancorado perto do
   botão de avatares — position:fixed, posicionado via JS com
   getBoundingClientRect() do botão clicado (mesma técnica do dropdown de
   menção "@usuario"). */
.post-curtidas-popover {
  position: fixed;
  z-index: 250;
  width: 220px;
  max-height: 280px;
  overflow-y: auto;
  background: var(--card);
  border: 1px solid var(--borda);
  border-radius: 12px;
  box-shadow: 0 8px 24px rgba(0, 0, 0, .18);
  padding: 6px;
}

.post-curtidas-popover-status {
  color: var(--muted);
  font-size: .82rem;
  text-align: center;
  padding: 10px 4px;
  margin: 0;
}

.post-curtidas-popover-item {
  display: flex;
  align-items: center;
  gap: 8px;
  padding: 6px;
  border-radius: 8px;
  text-decoration: none;
  color: var(--txt);
}

.post-curtidas-popover-item:hover {
  background: var(--bg);
}

.post-curtidas-popover-avatar {
  width: 30px;
  height: 30px;
  border-radius: 50%;
  flex-shrink: 0;
  background: var(--roxo);
  color: #fff;
  display: flex;
  align-items: center;
  justify-content: center;
  font-weight: 700;
  font-size: .8rem;
}

.post-curtidas-popover-nome {
  display: flex;
  flex-direction: column;
  line-height: 1.3;
  min-width: 0;
}

.post-curtidas-popover-nome strong {
  font-size: .82rem;
}

.post-curtidas-popover-nome span {
  font-size: .74rem;
  color: var(--muted);
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

/* Spinner do fim da lista do feed, mostrado durante a rolagem infinita
   (publicar/feed_carregar.php) — enquanto o próximo lote de posts carrega. */
.feed-carregando {
  display: flex;
  justify-content: center;
  padding: 24px 0;
}

.feed-carregando-spinner {
  width: 28px;
  height: 28px;
  border: 3px solid var(--bg);
  border-top-color: var(--roxo);
  border-radius: 50%;
  animation: feed-carregando-girar .7s linear infinite;
}

@keyframes feed-carregando-girar {
  to { transform: rotate(360deg); }
}

/* Botão "voltar ao topo" — some/aparece conforme a rolagem (index.php),
   ancorado no lado direito da tela (pedido explícito do usuário), acima da
   nav inferior no mobile pra não sobrepor.
   Bug corrigido (2026-08-16): no mobile, `right:16px` deixava o botão
   EXATAMENTE empilhado em cima do ícone "mais" da `.nav-inferior` — os 5
   itens da nav usam `justify-content:space-around` (5 × 44px), o que
   posiciona o centro do último ícone ("mais") a ~38-39px da borda direita
   da tela em praticamente qualquer largura de celular comum; `right:16px`
   com 44px de largura própria também centraliza por volta desses mesmos
   ~38px — os dois ficavam na mesma coluna vertical. `right:90px` no mobile
   desloca o botão pro vão entre os ícones "mensagens" e "mais" (ainda do
   lado direito da tela, só não mais em cima de nenhum ícone específico da
   nav); no desktop não existe esse problema (a nav ali é lateral, à
   esquerda), então mantém coladinho na borda (`right:16px`). */
.btn-topo {
  position: fixed;
  right: 90px;
  bottom: 76px;
  width: 44px;
  height: 44px;
  border: none;
  border-radius: 50%;
  background: var(--roxo);
  color: #fff;
  display: flex;
  align-items: center;
  justify-content: center;
  box-shadow: 0 2px 10px rgba(0, 0, 0, .3);
  cursor: pointer;
  z-index: 150;
}

.btn-topo svg {
  width: 22px;
  height: 22px;
}

@media (min-width: 900px) {
  .btn-topo {
    right: 16px;
    bottom: 24px;
  }
}

.post-curtir.curtido svg {
  fill: currentColor;
}

/* Visualizador em tela cheia (visualizar.php) — página própria (não modal),
   aberta com 1 clique numa mídia do feed. Arrastar horizontal troca a mídia
   dentro do post (como a galeria pequena); arrastar vertical troca de post
   inteiro. body.visualizar-corpo-pagina zera o padding-top de 64px do
   topo-fixo (essa página não inclui includes/topo.php), mesmo padrão de
   body.publicar-corpo-pagina. */
body.visualizar-corpo-pagina {
  padding-top: 0;
  overflow: hidden;
}

.visualizar-tela {
  position: fixed;
  inset: 0;
  z-index: 500;
  background: #000;
  color: #fff;
  touch-action: none;
}

.visualizar-conteudo {
  position: absolute;
  inset: 0;
  display: flex;
  align-items: center;
  justify-content: center;
}

.visualizar-midia {
  max-width: 100%;
  max-height: 100%;
  object-fit: contain;
  /* Mesmo motivo de .post-midias-slide (ver comentário lá) — sem isso, o
     "arrastar imagem" nativo do navegador sequestra o gesto de arrastar pra
     cima/baixo (trocar de post) assim que o mouse é pressionado sobre a
     foto. */
  -webkit-user-drag: none;
  user-select: none;
}

/* Overlay mostrado enquanto publicar/visualizar_carregar.php busca mais
   posts (arrastar pra cima/baixo nunca "para" no fim/começo da lista já
   carregada, ver comentário no JS de visualizar.php). */
.visualizar-carregando {
  position: absolute;
  inset: 0;
  z-index: 3;
  display: flex;
  align-items: center;
  justify-content: center;
  background: rgba(0, 0, 0, .35);
  pointer-events: none;
}

.visualizar-carregando-spinner {
  width: 34px;
  height: 34px;
  border: 3px solid rgba(255, 255, 255, .3);
  border-top-color: #fff;
  border-radius: 50%;
  animation: feed-carregando-girar .7s linear infinite;
}

.visualizar-voltar {
  position: absolute;
  top: max(16px, env(safe-area-inset-top));
  left: 16px;
  z-index: 2;
  width: 36px;
  height: 36px;
  border-radius: 50%;
  background: rgba(0, 0, 0, .4);
  color: #fff;
  display: flex;
  align-items: center;
  justify-content: center;
}

.visualizar-voltar svg {
  width: 20px;
  height: 20px;
}

/* Espelha .visualizar-voltar, mas no canto superior direito — abre o mesmo
   .post-menu-modal usado no feed (editar/catálogo/reportar/excluir). */
.visualizar-menu {
  position: absolute;
  top: max(16px, env(safe-area-inset-top));
  right: 16px;
  z-index: 2;
  width: 36px;
  height: 36px;
  border: none;
  border-radius: 50%;
  background: rgba(0, 0, 0, .4);
  color: #fff;
  display: flex;
  align-items: center;
  justify-content: center;
  cursor: pointer;
}

.visualizar-menu svg {
  width: 20px;
  height: 20px;
}

.visualizar-pontos {
  position: absolute;
  left: 0;
  right: 0;
  top: max(16px, env(safe-area-inset-top));
  z-index: 2;
  display: flex;
  justify-content: center;
  gap: 6px;
}

.visualizar-ponto {
  width: 6px;
  height: 6px;
  border-radius: 50%;
  background: rgba(255, 255, 255, .4);
}

.visualizar-ponto.ativo {
  background: #fff;
}

/* Rodapé (avatar/usuário + legenda) — gradiente escuro por baixo pra
   legibilidade sobre qualquer mídia, mesmo espírito do
   .post-midias-overlay-header do feed. */
.visualizar-rodape {
  position: absolute;
  left: 0;
  right: 0;
  bottom: 0;
  z-index: 2;
  padding: 40px 16px max(16px, env(safe-area-inset-bottom));
  background: linear-gradient(0deg, rgba(0, 0, 0, .75), rgba(0, 0, 0, 0));
}

.visualizar-rodape-linha {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 12px;
  margin-bottom: 6px;
}

.visualizar-rodape-usuario {
  display: flex;
  align-items: center;
  gap: 8px;
  color: #fff;
  min-width: 0;
}

/* Botão de som (visualizar.php) — mesma posição relativa/estilo do
   .post-midias-som do feed, mas alinhado na linha do usuário aqui (o rodapé
   é bottom-anchored com altura variável por causa da legenda, então um
   posicionamento absoluto isolado desalinharia dependendo do tamanho dela). */
.visualizar-som {
  flex-shrink: 0;
  width: 34px;
  height: 34px;
  border: none;
  border-radius: 50%;
  background: rgba(0, 0, 0, .4);
  color: #fff;
  display: flex;
  align-items: center;
  justify-content: center;
  cursor: pointer;
}

.visualizar-som svg {
  width: 18px;
  height: 18px;
}

.visualizar-visualizacoes {
  display: flex;
  align-items: center;
  gap: 4px;
  flex-shrink: 0;
  color: #fff;
  opacity: .85;
  font-size: .8rem;
  font-weight: 600;
}

.visualizar-visualizacoes svg {
  width: 16px;
  height: 16px;
}

.visualizar-rodape-avatar {
  width: 30px;
  height: 30px;
  border-radius: 50%;
  flex-shrink: 0;
  background: var(--roxo);
  color: #fff;
  display: flex;
  align-items: center;
  justify-content: center;
  font-weight: 700;
  font-size: .85rem;
}

.visualizar-legenda {
  margin: 0;
  font-size: .88rem;
  line-height: 1.4;
  color: #fff;
  cursor: pointer;
}

.visualizar-legenda-truncada {
  display: -webkit-box;
  -webkit-line-clamp: 2;
  -webkit-box-orient: vertical;
  overflow: hidden;
}

.visualizar-legenda-truncada.visualizar-legenda-expandida {
  -webkit-line-clamp: unset;
  overflow: visible;
}

/* Modal de comentários — painel deslizando de baixo até metade da tela,
   compartilhado por todos os posts do feed (só um aberto por vez). */
.comentarios-modal {
  position: fixed;
  inset: 0;
  z-index: 200;
}

.comentarios-fundo {
  position: absolute;
  inset: 0;
  background: rgba(0, 0, 0, .5);
}

.comentarios-painel {
  position: absolute;
  left: 0;
  right: 0;
  bottom: 0;
  height: 50vh;
  background: var(--card);
  border-radius: 16px 16px 0 0;
  display: flex;
  flex-direction: column;
  transform: translateY(100%);
  transition: transform .25s ease;
}

.comentarios-modal.aberto .comentarios-painel {
  transform: translateY(0);
}

.comentarios-cabecalho {
  display: flex;
  align-items: center;
  justify-content: space-between;
  padding: 14px 16px;
  border-bottom: 1px solid var(--borda);
  font-weight: 700;
  color: var(--txt);
  flex-shrink: 0;
}

.comentarios-cabecalho button {
  background: none;
  border: none;
  cursor: pointer;
  color: var(--txt);
  padding: 4px;
}

.comentarios-cabecalho svg {
  width: 20px;
  height: 20px;
}

.comentarios-lista {
  flex: 1;
  overflow-y: auto;
  padding: 12px 16px;
}

.comentario-thread {
  margin-bottom: 14px;
}

.comentario-linha {
  display: flex;
  align-items: flex-start;
  justify-content: space-between;
  gap: 10px;
}

.comentario-item-resposta {
  margin-left: 34px;
  margin-top: 10px;
}

.comentario-avatar {
  width: 28px;
  height: 28px;
  border-radius: 50%;
  flex-shrink: 0;
  background: var(--roxo);
  color: #fff;
  display: flex;
  align-items: center;
  justify-content: center;
  font-weight: 700;
  font-size: .8rem;
}

.comentario-corpo {
  flex: 1;
  line-height: 1.4;
  color: var(--txt);
}

.comentario-corpo strong {
  margin-right: 6px;
}

.comentario-meta {
  margin-top: 2px;
}

.comentario-responder {
  background: none;
  border: none;
  padding: 0;
  font-size: .75rem;
  font-weight: 700;
  color: var(--muted);
  cursor: pointer;
}

.comentario-ver-respostas {
  display: block;
  margin: 6px 0 0 34px;
  background: none;
  border: none;
  padding: 0;
  font-size: .8rem;
  font-weight: 700;
  color: var(--muted);
  cursor: pointer;
}

.comentario-respostas:not([hidden]) {
  margin-top: 4px;
}

.comentario-curtir {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 2px;
  flex-shrink: 0;
  background: none;
  border: none;
  cursor: pointer;
  color: var(--muted);
  padding: 2px;
}

.comentario-curtir svg {
  width: 14px;
  height: 14px;
}

.comentario-curtir.curtido {
  color: #e0245e;
}

.comentario-curtir.curtido svg {
  fill: currentColor;
}

.comentario-curtidas-total {
  font-size: .7rem;
}

.comentarios-vazio,
.comentarios-carregando {
  color: var(--muted);
  text-align: center;
  margin-top: 20px;
}

.comentarios-respondendo {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 8px;
  padding: 8px 16px;
  background: var(--bg);
  border-top: 1px solid var(--borda);
  font-size: .8rem;
  color: var(--txt);
  flex-shrink: 0;
}

.comentarios-respondendo button {
  background: none;
  border: none;
  cursor: pointer;
  color: var(--muted);
  padding: 2px;
}

.comentarios-respondendo svg {
  width: 14px;
  height: 14px;
}

.comentarios-form {
  display: flex;
  align-items: center;
  gap: 8px;
  padding: 10px 16px;
  border-top: 1px solid var(--borda);
  flex-shrink: 0;
}

.comentarios-form input {
  flex: 1;
  border: 1px solid var(--borda);
  border-radius: 20px;
  padding: 8px 14px;
  font-size: .9rem;
}

.comentarios-form button {
  border: none;
  background: none;
  color: var(--roxo);
  font-weight: 700;
  cursor: pointer;
}

.comentarios-emoji-wrap {
  position: relative;
  flex-shrink: 0;
}

#comentarios-emoji-botao {
  font-size: 1.2rem;
  line-height: 1;
  padding: 4px;
}

.comentarios-emoji-picker {
  position: absolute;
  bottom: 40px;
  left: 0;
  width: 220px;
  display: grid;
  grid-template-columns: repeat(6, 1fr);
  gap: 4px;
  background: var(--card);
  border: 1px solid var(--borda);
  border-radius: 10px;
  padding: 8px;
  box-shadow: 0 4px 16px rgba(0, 0, 0, .15);
  z-index: 5;
}

.comentarios-emoji-picker button {
  font-size: 1.1rem;
  padding: 4px;
  color: var(--txt);
}

.comentarios-login-aviso {
  padding: 12px 16px;
  text-align: center;
  color: var(--muted);
  flex-shrink: 0;
}

.comentarios-login-aviso a {
  color: var(--roxo);
  font-weight: 700;
}

/* Feed de notificações (notificacoes.php) — agrupado por dia/semana/mês
   (grupo_data() em includes/funcoes.php), com scroll infinito carregando mais
   via notificacoes_carregar.php. */
.notificacoes-lista {
  background: var(--card);
  border: 1px solid var(--borda);
  border-radius: 14px;
  overflow: hidden;
}

.notificacoes-grupo {
  padding: 12px 16px 6px;
  font-size: .75rem;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: .04em;
  color: var(--muted);
}

.notificacao-item {
  display: flex;
  align-items: center;
  gap: 10px;
  padding: 10px 16px;
  border-bottom: 1px solid var(--borda);
}

.notificacao-item:last-child {
  border-bottom: none;
}

.notificacao-avatar {
  width: 36px;
  height: 36px;
  font-size: .95rem;
}

.notificacao-texto {
  flex: 1;
  font-size: .9rem;
  line-height: 1.4;
  color: var(--txt);
}

.notificacao-tempo {
  flex-shrink: 0;
  font-size: .75rem;
  color: var(--muted);
}

.notificacoes-carregando {
  text-align: center;
  color: var(--muted);
  padding: 16px;
}

/* Painel de notificações (bottom sheet acionado pelo sino do topo, ver
   includes/topo.php) — mesmo padrão visual do modal de comentários, mas com
   o scroll infinito escutando a rolagem da própria lista (.notificacoes-modal-lista),
   não da janela, já que aqui a lista fica dentro de um painel de altura fixa
   em vez de ocupar a página inteira (diferente de notificacoes.php). */
.notificacoes-modal {
  position: fixed;
  inset: 0;
  z-index: 300;
}

.notificacoes-modal-fundo {
  position: absolute;
  inset: 0;
  background: rgba(0, 0, 0, .5);
}

.notificacoes-modal-painel {
  position: absolute;
  left: 0;
  right: 0;
  bottom: 0;
  height: 70vh;
  display: flex;
  flex-direction: column;
  background: var(--card);
  border-radius: 16px 16px 0 0;
  transform: translateY(100%);
  transition: transform .25s ease;
}

.notificacoes-modal.aberto .notificacoes-modal-painel {
  transform: translateY(0);
}

.notificacoes-modal-cabecalho {
  display: flex;
  align-items: center;
  justify-content: space-between;
  padding: 14px 16px;
  border-bottom: 1px solid var(--borda);
  font-weight: 700;
  color: var(--txt);
  flex-shrink: 0;
}

.notificacoes-modal-cabecalho button {
  background: none;
  border: none;
  cursor: pointer;
  color: var(--txt);
  padding: 4px;
}

.notificacoes-modal-cabecalho svg {
  width: 20px;
  height: 20px;
}

.notificacoes-modal-lista {
  flex: 1;
  overflow-y: auto;
}

/* Perfil público (perfil.php) — capa em largura total, avatar+nome por cima
   da borda de baixo dela, depois seções em "quadros de janelas" (posts,
   produtos, comunidades). */
.perfil-pagina {
  padding-bottom: 32px;
}

.perfil-topo-capa {
  position: relative;
}

.perfil-capa {
  position: relative;
  height: 200px;
  background: linear-gradient(135deg, var(--roxo), var(--ciano));
  background-size: cover;
  background-position: center;
  overflow: hidden;
}

.perfil-capa-editar {
  position: absolute;
  right: 16px;
  bottom: 16px;
  width: 36px;
  height: 36px;
  border-radius: 50%;
  background: rgba(0, 0, 0, .45);
  color: #fff;
  display: flex;
  align-items: center;
  justify-content: center;
  z-index: 2;
}

.perfil-capa-editar svg {
  width: 18px;
  height: 18px;
}

.perfil-conteudo {
  margin-top: 0;
}

/* Avatar sobreposto à capa: metade dentro da imagem, metade abaixo dela —
   por isso é posicionado absoluto dentro de .perfil-topo-capa (não dentro de
   .perfil-cabecalho, que fica depois, já fora da capa). */
.perfil-avatar {
  position: absolute;
  left: 20px;
  bottom: -42px;
  z-index: 3;
  width: 84px;
  height: 84px;
  border-radius: 50%;
  border: 4px solid var(--bg);
  flex-shrink: 0;
  background: var(--roxo);
  color: #fff;
  display: flex;
  align-items: center;
  justify-content: center;
  font-weight: 700;
  font-size: 2rem;
}

.perfil-cabecalho {
  display: flex;
  align-items: flex-start;
  justify-content: space-between;
  gap: 14px;
  padding: 52px 0 16px;
}

.perfil-identidade {
  display: flex;
  flex-direction: column;
  gap: 2px;
}

.perfil-identidade strong {
  font-size: 1.1rem;
  color: var(--txt);
}

.perfil-identidade span {
  font-size: .85rem;
  color: var(--muted);
}

.perfil-sobre {
  margin: 6px 0 0;
  font-size: .9rem;
  color: var(--txt);
  line-height: 1.4;
}

.perfil-sobre ul {
  margin: 4px 0;
  padding-left: 20px;
}

.perfil-site {
  margin-top: 4px;
  font-size: .85rem;
  color: var(--roxo);
  font-weight: 600;
}

.perfil-editar-link {
  flex-shrink: 0;
  font-size: .8rem;
  font-weight: 700;
  color: var(--muted);
  padding: 6px 12px;
  border: 1px solid var(--borda);
  border-radius: 8px;
}

.perfil-secao {
  margin-top: 24px;
}

.perfil-secao-titulo {
  font-size: 1rem;
  font-weight: 700;
  color: var(--txt);
  margin: 0 0 10px;
}

.perfil-grade {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 2px;
}

/* Abas Seguindo/Seguidores (seguindo.php) — mesmo padrão de troca via JS do
   .perfil-abas abaixo, mas com texto (+ contador) em vez de ícone. */
.seguindo-abas {
  display: flex;
  border-bottom: 1px solid var(--borda);
  margin-bottom: 16px;
}

.seguindo-aba {
  flex: 1;
  padding: 12px 0;
  background: none;
  border: none;
  border-bottom: 2px solid transparent;
  font-weight: 700;
  font-size: .9rem;
  color: var(--muted);
  cursor: pointer;
}

.seguindo-aba.ativo {
  color: var(--roxo);
  border-bottom-color: var(--roxo);
}

/* Abas de categoria do perfil (Publicações/Shop/Comunidades/Catálogo) —
   ícones lado a lado, clicar troca qual .perfil-secao-aba fica visível (só
   uma por vez, ver JS de perfil.php). */
.perfil-abas {
  display: flex;
  justify-content: space-around;
  border-top: 1px solid var(--borda);
  border-bottom: 1px solid var(--borda);
  margin-top: 20px;
}

.perfil-aba {
  flex: 1;
  display: flex;
  align-items: center;
  justify-content: center;
  padding: 12px 0;
  background: none;
  border: none;
  border-top: 2px solid transparent;
  color: var(--muted);
  cursor: pointer;
}

.perfil-aba svg {
  width: 22px;
  height: 22px;
}

.perfil-aba.ativo {
  color: var(--roxo);
  border-top-color: var(--roxo);
}

.perfil-secao-aba {
  margin-top: 12px;
}

.perfil-janela {
  position: relative;
  aspect-ratio: 1;
  background: #000;
  overflow: hidden;
}

/* Aba Catálogo usa <button> em vez de <a> (clique abre um lightbox, não
   navega) — reset dos estilos padrão de botão do navegador; o resto do
   visual (tamanho/borda/mídia) vem de .perfil-janela normalmente. */
.perfil-janela-catalogo {
  display: block;
  width: 100%;
  padding: 0;
  border: none;
  font: inherit;
  cursor: pointer;
}

.perfil-janela img,
.perfil-janela video {
  width: 100%;
  height: 100%;
  object-fit: cover;
}

.perfil-janela-video {
  position: absolute;
  top: 8px;
  right: 8px;
  color: #fff;
  filter: drop-shadow(0 1px 2px rgba(0, 0, 0, .6));
}

.perfil-janela-video svg {
  width: 16px;
  height: 16px;
}

/* Depoimentos — cartões (perfil.php destaque, perfil_depoimentos.php lista
   completa, depoimentos.php moderação do dono) compartilham a mesma
   estrutura visual de card. */
.perfil-depoimentos-cabecalho {
  display: flex;
  align-items: center;
  justify-content: space-between;
  margin-bottom: 10px;
}

.perfil-depoimentos-cabecalho .perfil-secao-titulo,
.perfil-depoimentos-cabecalho .form-titulo {
  margin: 0;
}

.perfil-depoimentos-acoes {
  display: flex;
  align-items: center;
  gap: 8px;
  flex-shrink: 0;
}

/* Link "N pendente(s)" — só o DONO do perfil vê, só quando N > 0 (ver PHP).
   Cor âmbar (não tem variável própria pra "aviso" no projeto, mesmo espírito
   de outras cores literais pontuais como o vermelho de curtir). */
.perfil-depoimentos-pendentes {
  display: flex;
  align-items: center;
  gap: 4px;
  font-size: .78rem;
  font-weight: 700;
  color: #d97706;
  white-space: nowrap;
}

.perfil-depoimentos-pendentes svg {
  width: 15px;
  height: 15px;
}

/* Botão "meu depoimento" (visitante que já escreveu um depoimento nesse
   perfil) — substitui o "+" de escrever enquanto existir um. Relógio =
   pendente (âmbar), check = aprovado (roxo, mesma cor de destaque do site). */
.perfil-depoimento-meu {
  width: 32px;
  height: 32px;
  border-radius: 50%;
  border: none;
  background: var(--roxo);
  color: #fff;
  display: flex;
  align-items: center;
  justify-content: center;
  cursor: pointer;
  flex-shrink: 0;
}

.perfil-depoimento-meu svg {
  width: 16px;
  height: 16px;
}

.perfil-depoimento-meu-pendente {
  background: #d97706;
}

.perfil-depoimento-escrever {
  width: 32px;
  height: 32px;
  border-radius: 50%;
  border: none;
  background: var(--roxo);
  color: #fff;
  display: flex;
  align-items: center;
  justify-content: center;
  cursor: pointer;
  box-shadow: 0 2px 8px rgba(124, 58, 237, .35);
  flex-shrink: 0;
}

.perfil-depoimento-escrever svg {
  width: 16px;
  height: 16px;
}

.depoimentos-secao {
  margin-top: 20px;
}

.depoimentos-lista {
  display: flex;
  flex-direction: column;
  gap: 10px;
}

.depoimentos-lista-destaque {
  display: grid;
  grid-template-columns: repeat(2, 1fr);
  gap: 10px;
  margin-bottom: 10px;
}

@media (max-width: 480px) {
  .depoimentos-lista-destaque {
    grid-template-columns: 1fr;
  }
}

.depoimento-card {
  border: 1px solid var(--borda);
  border-radius: 12px;
  padding: 12px;
  background: var(--card);
}

.depoimento-cabecalho {
  display: flex;
  align-items: center;
  gap: 8px;
  margin-bottom: 8px;
}

/* Avatar + @usuario de quem ESCREVEU o depoimento — antes era texto solto
   sem link nenhum; agora leva pro perfil do autor, mesmo padrão de
   .post-header-link nos posts. */
.depoimento-autor-link {
  display: flex;
  align-items: center;
  gap: 8px;
  color: inherit;
  min-width: 0;
}

.depoimento-avatar {
  width: 32px;
  height: 32px;
  border-radius: 50%;
  flex-shrink: 0;
  background: var(--roxo);
  color: #fff;
  display: flex;
  align-items: center;
  justify-content: center;
  font-weight: 700;
  font-size: .85rem;
}

.depoimento-autor {
  display: flex;
  flex-direction: column;
  line-height: 1.25;
}

.depoimento-autor strong {
  font-size: .85rem;
  color: var(--txt);
}

.depoimento-autor span {
  font-size: .72rem;
  color: var(--muted);
}

.depoimento-texto {
  margin: 0 0 8px;
  font-size: .88rem;
  color: var(--txt);
  line-height: 1.4;
  white-space: pre-wrap;
}

.depoimento-texto-truncado {
  display: -webkit-box;
  -webkit-line-clamp: 3;
  -webkit-box-orient: vertical;
  overflow: hidden;
}

.depoimento-texto-truncado.depoimento-texto-expandido {
  -webkit-line-clamp: unset;
  overflow: visible;
}

.depoimento-ver-mais {
  display: block;
  background: none;
  border: none;
  padding: 0;
  margin: -4px 0 8px;
  font-size: .78rem;
  font-weight: 700;
  color: var(--roxo);
  cursor: pointer;
}

.depoimento-curtir {
  display: flex;
  align-items: center;
  gap: 4px;
  background: none;
  border: none;
  padding: 0;
  color: var(--muted);
  cursor: pointer;
  font-size: .8rem;
}

.depoimento-curtir svg {
  width: 18px;
  height: 18px;
}

.depoimento-curtir.curtido {
  color: #e0245e;
}

.depoimento-acoes-moderacao {
  display: flex;
  gap: 8px;
  margin-top: 4px;
}

.depoimento-preferencial.ativo {
  color: var(--roxo);
  border-color: var(--roxo);
}

/* Modal "escrever depoimento" — mesmo padrão bottom-sheet do modal de
   comentários (.comentarios-modal em index.php), mas com um <textarea> em
   vez de lista/rolagem. */
.depoimento-escrever-modal {
  position: fixed;
  inset: 0;
  z-index: 200;
}

.depoimento-escrever-fundo {
  position: absolute;
  inset: 0;
  background: rgba(0, 0, 0, .5);
}

.depoimento-escrever-painel {
  position: absolute;
  left: 0;
  right: 0;
  bottom: 0;
  background: var(--card);
  border-radius: 16px 16px 0 0;
  padding: 16px;
  transform: translateY(100%);
  transition: transform .25s ease;
}

.depoimento-escrever-modal.aberto .depoimento-escrever-painel {
  transform: translateY(0);
}

.depoimento-escrever-cabecalho {
  display: flex;
  align-items: center;
  justify-content: space-between;
  font-weight: 700;
  color: var(--txt);
  margin-bottom: 12px;
}

.depoimento-escrever-cabecalho button {
  background: none;
  border: none;
  cursor: pointer;
  color: var(--txt);
  padding: 4px;
}

.depoimento-escrever-cabecalho svg {
  width: 20px;
  height: 20px;
}

#depoimento-escrever-texto {
  width: 100%;
  border: 1px solid var(--borda);
  border-radius: 8px;
  padding: 10px 12px;
  font-size: .9rem;
  color: var(--txt);
  background: var(--bg);
  resize: vertical;
  font-family: inherit;
}

.perfil-editar-preview {
  height: 160px;
  border-radius: 10px;
  background: linear-gradient(135deg, var(--roxo), var(--ciano));
  background-size: cover;
  background-position: center;
  margin-bottom: 20px;
}

/* renderizar_avatar() (includes/funcoes.php) gera <img class="{contexto} avatar-foto">
   ou <span class="{contexto} avatar-letra">; a classe de contexto (ex.:
   .topo-avatar, .perfil-avatar, .post-video-avatar) já define tamanho/borda/
   posição — aqui só o que muda entre as duas variantes. */
.avatar-foto {
  object-fit: cover;
}

.perfil-editar-foto-linha {
  display: flex;
  align-items: center;
  gap: 16px;
  margin-bottom: 20px;
}

.perfil-editar-foto-preview {
  width: 72px;
  height: 72px;
  border-radius: 50%;
  flex-shrink: 0;
  background: var(--roxo);
  background-size: cover;
  background-position: center;
  color: #fff;
  display: flex;
  align-items: center;
  justify-content: center;
  font-weight: 700;
  font-size: 1.6rem;
}

/* Editor "Sobre" (editar_perfil.php) — negrito/itálico/tópico/emoji via
   execCommand num <div contenteditable>, sem lib externa (ver comentário no
   JS de editar_perfil.php). */
.editor-toolbar {
  display: flex;
  align-items: center;
  gap: 4px;
  padding: 6px;
  border: 1px solid var(--borda);
  border-bottom: none;
  border-radius: 8px 8px 0 0;
  background: var(--bg);
}

.editor-botao {
  width: 30px;
  height: 30px;
  border: none;
  border-radius: 6px;
  background: none;
  color: var(--txt);
  cursor: pointer;
  font-size: .9rem;
}

.editor-botao:hover {
  background: var(--card);
}

.editor-toolbar-separador {
  width: 1px;
  height: 18px;
  background: var(--borda);
  margin: 0 2px;
}

.editor-emoji-wrap {
  position: relative;
}

.editor-emoji-picker {
  position: absolute;
  top: 36px;
  left: 0;
  width: 220px;
  display: grid;
  grid-template-columns: repeat(6, 1fr);
  gap: 4px;
  background: var(--card);
  border: 1px solid var(--borda);
  border-radius: 10px;
  padding: 8px;
  box-shadow: 0 4px 16px rgba(0, 0, 0, .15);
  z-index: 5;
}

.editor-emoji-picker button {
  font-size: 1.1rem;
  padding: 4px;
  color: var(--txt);
}

.editor-area {
  min-height: 90px;
  border: 1px solid var(--borda);
  border-radius: 0 0 8px 8px;
  padding: 10px 12px;
  font-size: .95rem;
  color: var(--txt);
  line-height: 1.4;
  transition: min-height .2s ease;
}

.editor-area:focus {
  outline: none;
  border-color: var(--roxo);
}

/* Expande ao focar (facilita digitar/formatar), volta ao normal ao sair —
   classe alternada no JS de editar_perfil.php. */
.editor-area-expandido {
  min-height: 220px;
}

.editor-area ul {
  margin: 4px 0;
  padding-left: 20px;
}

.editor-area:empty:before {
  content: attr(data-placeholder);
  color: var(--muted);
}

/* Autocomplete de "@usuario" nos editores de legenda (publicar/index.php,
   modal "Editar" de index.php/visualizar.php) — dropdown flutuante
   posicionado via JS (position:fixed, ver ativarAutocompleteMencao() em cada
   página) logo abaixo do cursor, com os usuários que começam com o que foi
   digitado depois do "@" (usuarios_buscar.php). z-index acima até de
   .post-editar-modal (600), porque pode abrir DENTRO desse modal. */
.mencao-dropdown {
  position: fixed;
  z-index: 700;
  background: var(--card);
  border: 1px solid var(--borda);
  border-radius: 10px;
  box-shadow: 0 4px 16px rgba(0, 0, 0, .18);
  max-height: 220px;
  overflow-y: auto;
  min-width: 220px;
  max-width: 280px;
}

.mencao-dropdown-item {
  display: flex;
  align-items: center;
  gap: 8px;
  width: 100%;
  padding: 8px 12px;
  background: none;
  border: none;
  text-align: left;
  cursor: pointer;
  color: var(--txt);
}

.mencao-dropdown-item:hover {
  background: var(--bg);
}

.mencao-dropdown-item img,
.mencao-dropdown-item .avatar-letra {
  width: 28px;
  height: 28px;
  border-radius: 50%;
  flex-shrink: 0;
  object-fit: cover;
}

.mencao-dropdown-item .avatar-letra {
  display: flex;
  align-items: center;
  justify-content: center;
  background: var(--roxo);
  color: #fff;
  font-weight: 700;
  font-size: .8rem;
}

.mencao-dropdown-item-nome {
  display: flex;
  flex-direction: column;
  overflow: hidden;
}

.mencao-dropdown-item-usuario {
  font-weight: 700;
  font-size: .85rem;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}

.mencao-dropdown-item-completo {
  font-size: .75rem;
  color: var(--muted);
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}

/* Editor de links externos (editar_perfil.php) — lista dinâmica de linhas,
   cada uma com rádio "principal" + nome + endereço + remover. */
.links-editor {
  display: flex;
  flex-direction: column;
  gap: 8px;
  margin-bottom: 10px;
}

.links-editor-linha {
  display: flex;
  align-items: center;
  gap: 8px;
}

.links-editor-radio {
  flex-shrink: 0;
  accent-color: var(--roxo);
  width: 16px;
  height: 16px;
}

.links-editor-titulo {
  width: 40%;
}

.links-editor-url {
  flex: 1;
}

.links-editor-remover {
  flex-shrink: 0;
  width: 28px;
  height: 28px;
  border: none;
  border-radius: 6px;
  background: var(--bg);
  color: var(--muted);
  font-size: 1.1rem;
  cursor: pointer;
  line-height: 1;
}

.links-editor-remover:hover {
  background: var(--card);
  color: var(--txt);
}

/* Exibição do(s) link(s) na página de perfil — link principal + setinha que
   expande revelando os demais, sem recarregar a página. */
.perfil-links {
  position: relative;
  display: flex;
  align-items: center;
  gap: 4px;
}

.perfil-links-expandir {
  display: flex;
  align-items: center;
  justify-content: center;
  width: 20px;
  height: 20px;
  border: none;
  background: none;
  color: var(--muted);
  cursor: pointer;
  padding: 0;
}

.perfil-links-expandir svg {
  width: 14px;
  height: 14px;
  transition: transform .15s ease;
}

.perfil-links-expandir-aberto svg {
  transform: rotate(180deg);
}

.perfil-links-demais {
  position: absolute;
  top: 100%;
  left: 0;
  margin-top: 4px;
  display: flex;
  flex-direction: column;
  gap: 4px;
  background: var(--card);
  border: 1px solid var(--borda);
  border-radius: 8px;
  padding: 8px 12px;
  box-shadow: 0 4px 16px rgba(0, 0, 0, .15);
  z-index: 5;
  min-width: 160px;
}

/* Campos só leitura (WhatsApp/e-mail em editar_perfil.php) — texto simples,
   não input desabilitado. */
.perfil-campo-leitura {
  margin: 0;
  padding: 10px 14px;
  border: 1px solid var(--borda);
  border-radius: 8px;
  background: var(--bg);
  color: var(--muted);
  font-size: .95rem;
}

/* Formulários */
.form-card {
  max-width: 420px;
  margin: 32px auto;
  background: var(--card);
  border: 1px solid var(--borda);
  border-radius: 14px;
  padding: 32px;
}

.form-titulo {
  font-size: 1.3rem;
  font-weight: 900;
  margin: 0 0 24px;
  color: var(--txt);
}

.form-grupo {
  margin-bottom: 16px;
  position: relative;
}

.form-grupo label {
  display: block;
  font-size: .85rem;
  font-weight: 700;
  color: var(--muted);
  margin-bottom: 6px;
}

.form-grupo input[type="text"],
.form-grupo input[type="password"],
.form-grupo input[type="email"],
.form-grupo input[type="tel"],
.form-grupo input[type="number"],
.form-grupo input[type="date"],
.form-grupo select {
  width: 100%;
  padding: 11px 14px;
  border: 1px solid var(--borda);
  border-radius: 10px;
  font-size: .95rem;
  background: #fff;
  color: var(--txt);
}

.form-grupo input:focus,
.form-grupo select:focus {
  outline: none;
  border-color: var(--roxo);
}

/* input[type="date"] sem estilo próprio ficava com a aparência crua do
   navegador (sem borda/padding consistente com os demais campos) — o
   seletor acima já resolve isso. Aqui só o ícone de calendário nativo:
   cursor de ponteiro (indica que é clicável) e tingido na cor da marca em
   navegadores baseados em Chromium (o filtro CSS é o único jeito de colorir
   esse ícone nativo, que por padrão sai cinza/preto sem seguir a paleta do
   site); em navegadores sem suporte ao filtro, o ícone só fica com a cor
   padrão do navegador — degrada bem, sem quebrar nada. */
.form-grupo input[type="date"]::-webkit-calendar-picker-indicator {
  cursor: pointer;
  filter: invert(35%) sepia(69%) saturate(3352%) hue-rotate(247deg) brightness(94%) contrast(101%);
}

.campo-senha {
  position: relative;
}

.campo-senha input {
  padding-right: 44px !important;
}

.botao-olho {
  position: absolute;
  top: 50%;
  right: 6px;
  transform: translateY(-50%);
  display: flex;
  align-items: center;
  justify-content: center;
  width: 32px;
  height: 32px;
  padding: 0;
  border: none;
  background: none;
  color: var(--muted);
  cursor: pointer;
  border-radius: 8px;
}

.botao-olho:hover {
  color: var(--roxo);
  background: var(--bg);
}

.botao-olho svg {
  width: 20px;
  height: 20px;
}

.form-checkbox {
  display: flex;
  align-items: flex-start;
  gap: 8px;
  font-size: .85rem;
  color: var(--muted);
  margin-bottom: 20px;
}

.form-checkbox input { margin-top: 3px; }

.form-checkbox-invalido {
  color: var(--erro);
  background: #fef2f2;
  border: 1px solid #fecaca;
  border-radius: 10px;
  padding: 10px 12px;
  margin-bottom: 4px;
}

#termos-erro {
  margin-bottom: 16px;
}

.form-hint {
  display: block;
  font-size: .78rem;
  margin-top: 4px;
}

.form-erro-campo {
  color: var(--erro);
}

.campo-invalido {
  border-color: var(--erro) !important;
}

.form-erro {
  background: #fef2f2;
  border: 1px solid #fecaca;
  color: var(--erro);
  border-radius: 10px;
  padding: 10px 14px;
  font-size: .85rem;
  margin-bottom: 16px;
}

.form-rodape {
  margin-top: 18px;
  font-size: .85rem;
  color: var(--muted);
  text-align: center;
}

.botao-full {
  width: 100%;
  text-align: center;
}

/* Modificador de tamanho pra botão dentro de uma linha de lista (ex.:
   seguindo.php) — o .botao base é grande demais (10px 20px) pra caber ao
   lado de um avatar numa linha compacta. */
.botao-pequeno {
  padding: 6px 14px;
  font-size: .8rem;
  border-radius: 8px;
}

/* Sugestões de usuário */
.sugestoes {
  display: flex;
  flex-wrap: wrap;
  gap: 6px;
  margin-top: 8px;
}

.sugestao-chip {
  background: #f7f7ff;
  border: 1px solid var(--borda);
  color: var(--roxo);
  border-radius: 999px;
  padding: 5px 12px;
  font-size: .8rem;
  cursor: pointer;
}

.sugestao-chip:hover {
  background: var(--roxo);
  color: #fff;
}

.form-sucesso {
  background: #f0fdf4;
  border: 1px solid #bbf7d0;
  color: var(--sucesso);
  border-radius: 10px;
  padding: 10px 14px;
  font-size: .85rem;
  margin-bottom: 16px;
}

/* Logo configurável (topo do site) */
.topo-logo-img {
  display: block;
  height: 32px;
  width: auto;
}

/* Painel admin (/cp) */
.cp-corpo {
  padding-top: 0;
}

.cp-login-pagina {
  min-height: 100vh;
  display: flex;
  align-items: center;
  justify-content: center;
  padding: 16px;
}

.cp-layout {
  display: flex;
  min-height: 100vh;
}

.cp-sidebar {
  width: 220px;
  flex-shrink: 0;
  background: #fff;
  border-right: 1px solid var(--borda);
  display: flex;
  flex-direction: column;
  padding: 20px 16px;
  position: sticky;
  top: 0;
  height: 100vh;
}

.cp-sidebar-logo {
  font-size: 1.1rem;
  font-weight: 900;
  font-style: italic;
  color: var(--roxo);
  margin-bottom: 24px;
}

.cp-sidebar-badge {
  font-style: normal;
  font-weight: 700;
  font-size: .7rem;
  color: var(--muted);
  text-transform: uppercase;
  margin-left: 4px;
}

.cp-menu {
  display: flex;
  flex-direction: column;
  gap: 4px;
  flex: 1;
}

.cp-menu-item {
  padding: 10px 12px;
  border-radius: 10px;
  font-weight: 700;
  font-size: .9rem;
  color: var(--txt);
}

.cp-menu-item:hover {
  background: var(--bg);
}

.cp-menu-item.ativo {
  background: var(--roxo);
  color: #fff;
}

.cp-sidebar-rodape {
  border-top: 1px solid var(--borda);
  padding-top: 12px;
  margin-top: 12px;
}

.cp-sidebar-usuario {
  display: block;
  font-size: .8rem;
  color: var(--muted);
  padding: 0 12px 8px;
}

.cp-menu-sair {
  color: var(--erro);
}

.cp-conteudo {
  flex: 1;
  padding: 32px 40px;
  max-width: 900px;
}

.cp-titulo {
  font-size: 1.5rem;
  font-weight: 900;
  margin: 0 0 20px;
}

.cp-card {
  background: var(--card);
  border: 1px solid var(--borda);
  border-radius: 14px;
  padding: 24px;
  margin-bottom: 20px;
}

.cp-card-titulo {
  font-size: 1.05rem;
  font-weight: 900;
  margin: 0 0 6px;
}

.cp-card-descricao {
  font-size: .85rem;
  color: var(--muted);
  margin: 0 0 20px;
}

/* Grade de números do dashboard (/cp), ver cp/index.php. */
.cp-stats-grade {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(130px, 1fr));
  gap: 14px;
}

.cp-stat-card {
  display: flex;
  flex-direction: column;
  gap: 4px;
  background: var(--bg);
  border: 1px solid var(--borda);
  border-radius: 10px;
  padding: 14px 16px;
}

.cp-stat-numero {
  font-size: 1.6rem;
  font-weight: 900;
  color: var(--roxo);
  line-height: 1.1;
}

.cp-stat-rotulo {
  font-size: .8rem;
  color: var(--muted);
}

.cp-stat-card-clicavel {
  cursor: pointer;
  text-align: left;
  font-family: inherit;
  transition: border-color .15s ease, transform .1s ease;
}

.cp-stat-card-clicavel:hover {
  border-color: var(--roxo);
}

.cp-stat-card-clicavel:active {
  transform: scale(.98);
}

/* Modal (bottom sheet) com a lista de usuários dos cartões clicáveis do
   dashboard (cp/index.php) — mesmo padrão visual de .seguidores-modal, mas
   com classes próprias pra não acoplar o painel admin ao site público. */
.cp-usuarios-modal {
  position: fixed;
  inset: 0;
  z-index: 300;
}

.cp-usuarios-modal-fundo {
  position: absolute;
  inset: 0;
  background: rgba(0, 0, 0, .5);
}

.cp-usuarios-modal-painel {
  position: absolute;
  left: 0;
  right: 0;
  bottom: 0;
  height: 70vh;
  max-width: 480px;
  margin: 0 auto;
  display: flex;
  flex-direction: column;
  background: var(--card);
  border-radius: 16px 16px 0 0;
  transform: translateY(100%);
  transition: transform .25s ease;
}

.cp-usuarios-modal.aberto .cp-usuarios-modal-painel {
  transform: translateY(0);
}

.cp-usuarios-modal-cabecalho {
  display: flex;
  align-items: center;
  justify-content: space-between;
  padding: 14px 16px;
  border-bottom: 1px solid var(--borda);
  font-weight: 700;
  color: var(--txt);
  flex-shrink: 0;
}

.cp-usuarios-modal-cabecalho button {
  background: none;
  border: none;
  cursor: pointer;
  color: var(--txt);
  padding: 4px;
}

.cp-usuarios-modal-cabecalho svg {
  width: 20px;
  height: 20px;
}

.cp-usuarios-modal-lista {
  flex: 1;
  overflow-y: auto;
  padding: 8px 16px;
}

.cp-usuarios-modal-carregando {
  color: var(--muted);
  font-size: .85rem;
  padding: 16px 0;
  text-align: center;
}

.cp-usuarios-item {
  display: flex;
  align-items: center;
  gap: 10px;
  padding: 8px 0;
  text-decoration: none;
  border-bottom: 1px solid var(--borda);
}

.cp-usuarios-item:last-child {
  border-bottom: none;
}

.cp-usuarios-avatar {
  width: 36px;
  height: 36px;
  border-radius: 50%;
  flex-shrink: 0;
  background: var(--roxo);
  color: #fff;
  display: flex;
  align-items: center;
  justify-content: center;
  font-weight: 700;
  font-size: .9rem;
}

.cp-usuarios-item-info {
  display: flex;
  flex-direction: column;
  line-height: 1.35;
  min-width: 0;
}

.cp-usuarios-item-info strong {
  font-size: .88rem;
  color: var(--txt);
}

.cp-usuarios-item-info span {
  font-size: .78rem;
  color: var(--muted);
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.cp-usuarios-item-email {
  font-size: .72rem !important;
}

.cp-logo-preview {
  border: 1px dashed var(--borda);
  border-radius: 10px;
  padding: 20px;
  margin-bottom: 20px;
  display: flex;
  align-items: center;
  justify-content: center;
  min-height: 80px;
}

.cp-logo-preview img {
  max-height: 60px;
  max-width: 100%;
}

.cp-logo-preview-vazio {
  font-size: .85rem;
  color: var(--muted);
  text-align: center;
}

.cp-logo-preview .logo-texto {
  font-size: 1.8rem;
  letter-spacing: -1px;
}

.cp-logo-preview-pequeno {
  min-height: 50px;
  padding: 12px;
}

.cp-logo-opcoes {
  display: flex;
  gap: 20px;
  margin-bottom: 16px;
}

.cp-checkbox {
  display: flex;
  align-items: center;
  gap: 8px;
  font-size: .9rem;
  font-weight: 700;
  color: var(--txt);
  margin-bottom: 16px;
  cursor: pointer;
}

.cp-checkbox input {
  width: 16px;
  height: 16px;
  cursor: pointer;
}

.form-grupo input[type="color"] {
  width: 60px;
  height: 40px;
  padding: 2px;
  border: 1px solid var(--borda);
  border-radius: 10px;
  cursor: pointer;
  background: #fff;
}

.cp-cores-grade {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(140px, 1fr));
  gap: 16px;
  margin-bottom: 20px;
}

.cp-cores-subtitulo {
  font-size: .9rem;
  font-weight: 700;
  color: var(--muted);
  margin: 4px 0 12px;
}

.cp-botoes-preview {
  display: flex;
  gap: 12px;
  padding: 16px;
  border: 1px dashed var(--borda);
  border-radius: 10px;
  margin-bottom: 20px;
}

.cp-presets-grade {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(150px, 1fr));
  gap: 12px;
  margin-bottom: 24px;
}

.cp-preset-botao {
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  gap: 10px;
  background: var(--card);
  border: 1px solid var(--borda);
  border-radius: 12px;
  padding: 12px;
  cursor: pointer;
  text-align: left;
  transition: border-color .15s, transform .1s;
}

.cp-preset-botao:hover {
  border-color: var(--roxo);
}

.cp-preset-botao:active {
  transform: scale(.97);
}

.cp-preset-botao:disabled {
  opacity: .6;
  cursor: default;
}

.cp-preset-swatches {
  display: flex;
  gap: 6px;
}

.cp-preset-swatch {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 40px;
  height: 28px;
  border-radius: 8px;
  font-size: .75rem;
  font-weight: 700;
  border: 1px solid transparent;
}

.cp-preset-swatch-secundario {
  border-width: 1px;
  border-style: solid;
}

.cp-preset-nome {
  font-size: .8rem;
  font-weight: 700;
  color: var(--txt);
}

/* Navegação do app (usuário logado): includes/nav_app.php.
   Mobile: barra fixa embaixo. Desktop: trilho de ícones à esquerda que
   expande no hover. Mesmos itens, um só é exibido por vez via media query. */

.nav-inferior {
  position: fixed;
  left: 0;
  right: 0;
  bottom: 0;
  height: 56px;
  background: var(--card);
  border-top: 1px solid var(--borda);
  display: flex;
  align-items: center;
  justify-content: space-around;
  z-index: 100;
}

.nav-inferior-item {
  position: relative;
  display: flex;
  align-items: center;
  justify-content: center;
  width: 44px;
  height: 44px;
  color: var(--txt);
  /* Transição suave de cor — é só isso que marca o ícone selecionado agora
     (nada de "bolha"/ícone subindo, revertido a pedido do usuário). */
  transition: color .2s ease;
}

/* .nav-inferior-item/.nav-lateral-item também são usadas em <button>
   (item "mais", que abre o menu em vez de navegar — ver includes/nav_app.php)
   — reset dos estilos padrão de botão do navegador. */
.nav-inferior-item,
.nav-lateral-item {
  background: none;
  border: none;
  font: inherit;
  cursor: pointer;
}

.nav-inferior-item svg {
  width: 26px;
  height: 26px;
}

.nav-inferior-item.ativo {
  color: var(--roxo);
}

.nav-inferior-item-criar svg {
  width: 30px;
  height: 30px;
}

/* Ampulheta que substitui o ícone clicado até a página trocar (a nav não é
   SPA — todo clique recarrega, então isso é só feedback de "carregando" pro
   tempo entre o clique e o navegador terminar de trocar de página). */
.nav-inferior-item.carregando svg,
.nav-inferior-item.carregando .nav-avatar-icone {
  visibility: hidden;
}

.nav-inferior-item.carregando::after {
  content: "";
  position: absolute;
  top: 50%;
  left: 50%;
  width: 18px;
  height: 18px;
  margin: -9px 0 0 -9px;
  border: 2px solid var(--borda);
  border-top-color: var(--roxo);
  border-radius: 50%;
  animation: nav-inferior-girar .6s linear infinite;
}

@keyframes nav-inferior-girar {
  to {
    transform: rotate(360deg);
  }
}

/* Ícone do item "mais" (bottom sheet) — em vez do SVG de 3 pontinhos, é o
   avatar do próprio usuário logado (foto ou inicial), ver nav_app_item()
   em includes/nav_app.php. */
.nav-avatar-icone {
  width: 26px;
  height: 26px;
  border-radius: 50%;
  flex-shrink: 0;
  background: var(--roxo);
  color: #fff;
  display: flex;
  align-items: center;
  justify-content: center;
  font-weight: 700;
  font-size: .78rem;
}

.nav-lateral-item .nav-avatar-icone {
  width: 24px;
  height: 24px;
}

.nav-lateral {
  display: none;
}

/* Menu "Mais" (bottom sheet acionado pelo item de 3 pontinhos da nav, ver
   includes/nav_app.php) — mesmo padrão do modal de comentários de index.php
   (fundo escurecido + painel deslizando de baixo), mas com altura livre até
   70vh: a lista cresce com o conteúdo e só rola (.mais-menu-lista) se passar
   disso, em vez de ocupar sempre metade da tela como o de comentários. */
.mais-menu-modal {
  position: fixed;
  inset: 0;
  z-index: 300;
}

.mais-menu-fundo {
  position: absolute;
  inset: 0;
  background: rgba(0, 0, 0, .5);
}

.mais-menu-painel {
  position: absolute;
  left: 0;
  right: 0;
  bottom: 0;
  max-height: 70vh;
  display: flex;
  flex-direction: column;
  background: var(--card);
  border-radius: 16px 16px 0 0;
  transform: translateY(100%);
  transition: transform .25s ease;
}

.mais-menu-modal.aberto .mais-menu-painel {
  transform: translateY(0);
}

.mais-menu-alca {
  width: 40px;
  height: 4px;
  border-radius: 999px;
  background: var(--borda);
  margin: 10px auto;
  flex-shrink: 0;
}

.mais-menu-lista {
  overflow-y: auto;
  padding-bottom: 16px;
}

.mais-menu-item {
  display: block;
  padding: 14px 24px;
  color: var(--txt);
  font-weight: 600;
  border-bottom: 1px solid var(--borda);
}

.mais-menu-item:last-child {
  border-bottom: none;
}

.mais-menu-sair {
  color: var(--erro);
}

/* Menu "..." de um post (index.php/visualizar.php) — Editar/Adicionar ou
   Remover do catálogo/Reportar/Excluir. Mesmo padrão bottom-sheet de
   .mais-menu-modal (fundo escurecido + painel deslizando de baixo), classes
   próprias (não reaproveita .mais-menu-* direto) só pra não acoplar duas
   funcionalidades sem relação — mesmo espírito de .perfil-seguir-menu-* já
   ser separado de .mais-menu-* no projeto. */
.post-menu-modal {
  position: fixed;
  inset: 0;
  /* 600, não 300 como os demais bottom sheets do site — em visualizar.php
     esse modal precisa ficar por CIMA de .visualizar-tela (z-index:500,
     tela cheia preta); com 300 ele abria (classList "aberto" aplicada) mas
     ficava escondido atrás da tela, invisível mesmo "aberto". */
  z-index: 600;
}

.post-menu-fundo {
  position: absolute;
  inset: 0;
  background: rgba(0, 0, 0, .5);
}

.post-menu-painel {
  position: absolute;
  left: 0;
  right: 0;
  bottom: 0;
  background: var(--card);
  border-radius: 16px 16px 0 0;
  padding-bottom: max(8px, env(safe-area-inset-bottom));
  transform: translateY(100%);
  transition: transform .25s ease;
}

.post-menu-modal.aberto .post-menu-painel {
  transform: translateY(0);
}

.post-menu-alca {
  width: 40px;
  height: 4px;
  border-radius: 999px;
  background: var(--borda);
  margin: 10px auto;
}

.post-menu-item {
  display: block;
  width: 100%;
  background: none;
  border: none;
  text-align: left;
  padding: 14px 24px;
  color: var(--txt);
  font-weight: 600;
  font-size: .95rem;
  border-bottom: 1px solid var(--borda);
  cursor: pointer;
}

.post-menu-item:last-child {
  border-bottom: none;
}

.post-menu-item-perigo {
  color: var(--erro);
}

/* Editar legenda (index.php/visualizar.php) — mesmo padrão de
   .depoimento-escrever-modal (bottom sheet com textarea + botão salvar). */
.post-editar-modal {
  position: fixed;
  inset: 0;
  /* mesmo motivo do z-index de .post-menu-modal acima — precisa ficar por
     cima de .visualizar-tela (z-index:500) em visualizar.php. */
  z-index: 600;
}

.post-editar-fundo {
  position: absolute;
  inset: 0;
  background: rgba(0, 0, 0, .5);
}

.post-editar-painel {
  position: absolute;
  left: 0;
  right: 0;
  bottom: 0;
  background: var(--card);
  border-radius: 16px 16px 0 0;
  padding: 16px;
  padding-bottom: max(16px, env(safe-area-inset-bottom));
  transform: translateY(100%);
  transition: transform .25s ease;
}

.post-editar-modal.aberto .post-editar-painel {
  transform: translateY(0);
}

.post-editar-cabecalho {
  display: flex;
  align-items: center;
  justify-content: space-between;
  font-weight: 700;
  color: var(--txt);
  margin-bottom: 12px;
}

.post-editar-cabecalho button {
  background: none;
  border: none;
  cursor: pointer;
  color: var(--txt);
  padding: 4px;
}

.post-editar-cabecalho svg {
  width: 20px;
  height: 20px;
}

/* Seguir/seguidores (perfil.php) — botão Seguir/Seguindo, menu "Seguindo ▼"
   (mesmo padrão bottom-sheet de .mais-menu-modal) e modal com a lista de
   seguidores (mesmo padrão de .notificacoes-modal). */
.perfil-seguidores-abrir {
  align-self: flex-start;
  margin: 2px 0 0;
  background: none;
  border: none;
  padding: 0;
  font-size: .82rem;
  color: var(--muted);
  cursor: pointer;
}

.perfil-seguidores-abrir strong {
  color: var(--txt);
}

.perfil-seguir-botao {
  display: inline-flex;
  align-items: center;
  gap: 4px;
  flex-shrink: 0;
}

.perfil-seguir-botao svg {
  width: 14px;
  height: 14px;
}

.perfil-seguir-menu-modal {
  position: fixed;
  inset: 0;
  z-index: 300;
}

.perfil-seguir-menu-fundo {
  position: absolute;
  inset: 0;
  background: rgba(0, 0, 0, .5);
}

.perfil-seguir-menu-painel {
  position: absolute;
  left: 0;
  right: 0;
  bottom: 0;
  display: flex;
  flex-direction: column;
  background: var(--card);
  border-radius: 16px 16px 0 0;
  transform: translateY(100%);
  transition: transform .25s ease;
}

.perfil-seguir-menu-modal.aberto .perfil-seguir-menu-painel {
  transform: translateY(0);
}

.perfil-seguir-menu-alca {
  width: 40px;
  height: 4px;
  border-radius: 999px;
  background: var(--borda);
  margin: 10px auto;
  flex-shrink: 0;
}

.perfil-seguir-menu-item {
  display: block;
  width: 100%;
  background: none;
  border: none;
  text-align: left;
  padding: 14px 24px;
  padding-bottom: max(14px, env(safe-area-inset-bottom));
  color: var(--txt);
  font-weight: 600;
  font-size: .95rem;
  border-bottom: 1px solid var(--borda);
  cursor: pointer;
}

.perfil-seguir-menu-item:last-child {
  border-bottom: none;
}

.perfil-seguir-menu-deixar {
  color: var(--erro);
}

/* Lightbox da aba Catálogo (perfil.php) — expande a mídia clicada em tela
   cheia, fundo escuro, com o botão de WhatsApp (se o dono permitiu, ver
   /configuracoes.php) fixo embaixo. */
.catalogo-item-modal {
  position: fixed;
  inset: 0;
  z-index: 300;
}

.catalogo-item-fundo {
  position: absolute;
  inset: 0;
  background: rgba(0, 0, 0, .9);
}

.catalogo-item-painel {
  position: absolute;
  inset: 0;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  gap: 16px;
  padding: 24px 16px max(24px, env(safe-area-inset-bottom));
}

.catalogo-item-fechar {
  position: absolute;
  top: max(16px, env(safe-area-inset-top));
  right: 16px;
  background: rgba(255, 255, 255, .15);
  border: none;
  border-radius: 50%;
  width: 36px;
  height: 36px;
  display: flex;
  align-items: center;
  justify-content: center;
  color: #fff;
  cursor: pointer;
}

.catalogo-item-midia {
  max-width: 100%;
  max-height: 75vh;
  display: flex;
  align-items: center;
  justify-content: center;
}

.catalogo-item-midia img,
.catalogo-item-midia video {
  max-width: 100%;
  max-height: 75vh;
  border-radius: 8px;
  object-fit: contain;
}

.catalogo-item-whatsapp {
  max-width: 400px;
}

/* Seletor de mídias pra importar pro catálogo (visualizar.php) — bottom
   sheet, mesmo padrão visual de .seguidores-modal abaixo, com uma grade de
   miniaturas marcáveis (checkbox) em vez de uma lista. */
.catalogo-picker-modal {
  position: fixed;
  inset: 0;
  /* mesmo motivo do z-index de .post-menu-modal — precisa ficar por cima de
     .visualizar-tela (z-index:500) em visualizar.php, único lugar onde esse
     modal é usado. */
  z-index: 600;
}

.catalogo-picker-fundo {
  position: absolute;
  inset: 0;
  background: rgba(0, 0, 0, .5);
}

.catalogo-picker-painel {
  position: absolute;
  left: 0;
  right: 0;
  bottom: 0;
  max-height: 80vh;
  display: flex;
  flex-direction: column;
  background: var(--card);
  border-radius: 16px 16px 0 0;
  padding: 0 16px max(16px, env(safe-area-inset-bottom));
  transform: translateY(100%);
  transition: transform .25s ease;
}

.catalogo-picker-modal.aberto .catalogo-picker-painel {
  transform: translateY(0);
}

.catalogo-picker-cabecalho {
  display: flex;
  align-items: center;
  justify-content: space-between;
  padding: 14px 0;
  border-bottom: 1px solid var(--borda);
  font-weight: 700;
  color: var(--txt);
  flex-shrink: 0;
}

.catalogo-picker-cabecalho button {
  background: none;
  border: none;
  cursor: pointer;
  color: var(--txt);
  padding: 4px;
}

.catalogo-picker-grade {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 8px;
  padding: 16px 0;
  overflow-y: auto;
}

.catalogo-picker-item {
  position: relative;
  aspect-ratio: 1;
  border-radius: 8px;
  overflow: hidden;
  background: #000;
  display: block;
}

.catalogo-picker-item img,
.catalogo-picker-item video {
  width: 100%;
  height: 100%;
  object-fit: cover;
}

.catalogo-picker-item input {
  position: absolute;
  top: 6px;
  right: 6px;
  width: 20px;
  height: 20px;
  z-index: 1;
}

.seguidores-modal {
  position: fixed;
  inset: 0;
  z-index: 300;
}

.seguidores-modal-fundo {
  position: absolute;
  inset: 0;
  background: rgba(0, 0, 0, .5);
}

.seguidores-modal-painel {
  position: absolute;
  left: 0;
  right: 0;
  bottom: 0;
  height: 70vh;
  display: flex;
  flex-direction: column;
  background: var(--card);
  border-radius: 16px 16px 0 0;
  transform: translateY(100%);
  transition: transform .25s ease;
}

.seguidores-modal.aberto .seguidores-modal-painel {
  transform: translateY(0);
}

.seguidores-modal-cabecalho {
  display: flex;
  align-items: center;
  justify-content: space-between;
  padding: 14px 16px;
  border-bottom: 1px solid var(--borda);
  font-weight: 700;
  color: var(--txt);
  flex-shrink: 0;
}

.seguidores-modal-cabecalho button {
  background: none;
  border: none;
  cursor: pointer;
  color: var(--txt);
  padding: 4px;
}

.seguidores-modal-cabecalho svg {
  width: 20px;
  height: 20px;
}

.seguidores-modal-lista {
  flex: 1;
  overflow-y: auto;
  padding: 8px 16px;
}

.seguidor-item {
  display: flex;
  align-items: center;
  gap: 10px;
  padding: 8px 0;
}

.seguidor-nome {
  display: flex;
  flex-direction: column;
  line-height: 1.3;
}

.seguidor-nome strong {
  font-size: .88rem;
  color: var(--txt);
}

.seguidor-nome span {
  font-size: .78rem;
  color: var(--muted);
}

/* Linhas de seguindo.php — mesma .seguidor-item de base, mas com botões de
   seguir/favoritar do lado direito (por isso vira space-between: o link do
   perfil ocupa o espaço disponível à esquerda, os botões ficam colados na
   ponta). O link do perfil aqui NÃO é a linha inteira (diferente do resto
   do site) porque não dá pra aninhar <button> dentro de <a> — por isso só
   avatar+nome ficam no link, os botões são irmãos dele. */
.seguindo-linha {
  justify-content: space-between;
}

.seguindo-item-perfil {
  display: flex;
  align-items: center;
  gap: 10px;
  color: inherit;
  min-width: 0;
  flex: 1;
}

.seguindo-linha-acoes {
  display: flex;
  align-items: center;
  gap: 6px;
  flex-shrink: 0;
}

.seguindo-botao-favoritar {
  flex-shrink: 0;
  width: 32px;
  height: 32px;
  border: none;
  background: none;
  color: var(--muted);
  display: flex;
  align-items: center;
  justify-content: center;
  cursor: pointer;
}

.seguindo-botao-favoritar svg {
  width: 20px;
  height: 20px;
}

.seguindo-botao-favoritar.ativo {
  color: #f5a623;
}

@media (max-width: 899px) {
  body.tem-nav-app {
    padding-bottom: 56px;
  }

  /* Barra de instalar sozinha (visitante deslogado, sem .nav-inferior). */
  body.tem-instalar-barra {
    padding-bottom: 56px;
  }

  /* Barra de instalar empilhada sobre a .nav-inferior (usuário logado). */
  body.tem-nav-app.tem-instalar-barra {
    padding-bottom: 100px;
  }
}

/* Barra de instalação do PWA e popup de progresso — independente de login,
   includes/pwa_instalar.php controla exibição via JS (beforeinstallprompt/
   iOS/Samsung Internet). Fica colada no rodapé (bottom: 0) por padrão; se
   houver .nav-inferior (usuário logado, includes/nav_app.php) sobe pra cima
   dela via a regra body.tem-nav-app abaixo. */

.instalar-app-barra {
  position: fixed;
  left: 0;
  right: 0;
  bottom: 0;
  z-index: 99;
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 12px;
  padding: 10px 16px;
  background: var(--roxo);
  color: #FFFFFF;
}

.instalar-app-texto {
  font-size: .85rem;
  font-weight: 600;
}

.instalar-app-botao {
  flex-shrink: 0;
  padding: 6px 16px;
  border: none;
  border-radius: 999px;
  background: #FFFFFF;
  color: var(--roxo);
  font-weight: 700;
  font-size: .85rem;
}

@media (max-width: 899px) {
  body.tem-nav-app .instalar-app-barra {
    bottom: 56px;
  }
}

@media (min-width: 900px) {
  .instalar-app-barra {
    display: none;
  }
}

.instalar-app-popup {
  position: fixed;
  inset: 0;
  z-index: 200;
  display: flex;
  align-items: center;
  justify-content: center;
  background: rgba(0, 0, 0, .5);
  padding: 24px;
}

.instalar-app-popup-caixa {
  background: var(--card);
  color: var(--txt);
  border-radius: 16px;
  padding: 32px 24px;
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 16px;
  max-width: 320px;
  text-align: center;
}

.instalar-app-spinner {
  width: 36px;
  height: 36px;
  border: 4px solid var(--bg);
  border-top-color: var(--roxo);
  border-radius: 50%;
  animation: instalar-app-girar .8s linear infinite;
}

@keyframes instalar-app-girar {
  to {
    transform: rotate(360deg);
  }
}

@media (min-width: 900px) {
  .nav-inferior {
    display: none;
  }

  .topo-shop-link {
    display: none;
  }

  .topo-avatar-link {
    display: flex;
  }

  body.tem-sub-nav .nav-lateral {
    top: 108px;
  }

  /* No desktop, os ícones de Timeline/Comunidades saem dos dois cantos
     opostos (padrão mobile) e vão JUNTOS pro canto superior direito —
     no mobile eles ficam nas pontas porque não tem mais nada ali, mas no
     desktop o canto esquerdo já é ocupado pelo trilho `.nav-lateral`
     (Início/Seguindo/Criar/...), então duplicar um ícone ali ficaria
     redundante/confuso. O fundo em "meia lua" (pensado pra ficar colado
     exatamente na borda real da tela, ver comentário de `.sub-nav-item`
     acima) não faz sentido flutuando longe da borda — vira um círculo
     comum. `padding-right: 20px` casa com o padding direito de
     `.topo-conteudo` (mesmo `max-width: 1000px`), então os ícones ficam
     alinhados embaixo do sino/avatar do cabeçalho. */
  .sub-nav {
    justify-content: flex-end;
    gap: 12px;
    padding-right: 20px;
  }

  .sub-nav-item,
  .sub-nav-item:first-child,
  .sub-nav-item:last-child {
    border-radius: 50%;
    align-items: center;
    justify-content: center;
    padding: 0;
  }

  .nav-lateral {
    display: flex;
    flex-direction: column;
    gap: 4px;
    position: fixed;
    top: 64px;
    left: 0;
    bottom: 0;
    width: 72px;
    padding: 16px 0;
    background: var(--card);
    border-right: 1px solid var(--borda);
    overflow: hidden;
    transition: width .15s ease;
    z-index: 90;
  }

  .nav-lateral:hover {
    width: 220px;
  }

  .nav-lateral-item {
    display: flex;
    align-items: center;
    gap: 16px;
    padding: 12px 24px;
    margin: 0 8px;
    border-radius: 10px;
    color: var(--txt);
    white-space: nowrap;
  }

  .nav-lateral-item:hover {
    background: var(--bg);
  }

  .nav-lateral-item.ativo {
    color: var(--roxo);
    font-weight: 700;
  }

  .nav-lateral-item svg {
    width: 24px;
    height: 24px;
    flex-shrink: 0;
  }

  .nav-lateral-item .rotulo {
    opacity: 0;
    transition: opacity .1s;
  }

  .nav-lateral:hover .rotulo {
    opacity: 1;
  }

  body.tem-nav-app {
    padding-left: 72px;
  }
}

/* Tela de nova publicação (publicar/index.php) — ocupa a tela inteira por cima de
   tudo, sem topo-fixo/nav-app (não inclui includes/topo.php), igual ao fluxo
   de criação do Instagram. body.publicar-corpo-pagina zera o padding-top de
   64px do topo-fixo (que não existe nessa página) e trava o scroll do body
   por trás da tela fixa.

   Tema escuro fixo (cores literais, não as var(--bg)/var(--card) do resto do
   site) pra imitar visualmente a tela de "Novo post" do Instagram — a grade
   de fotos "Recentes" em si é sempre desenhada pelo seletor nativo do
   SO/navegador (não existe API web pra listar a galeria dentro da própria
   página), então esse tema escuro só cobre o que fica sob nosso controle:
   nossa própria grade de itens já selecionados e a tela de legenda. */
body.publicar-corpo-pagina {
  padding-top: 0;
  overflow: hidden;
}

.publicar-tela {
  position: fixed;
  inset: 0;
  z-index: 500;
  display: flex;
  flex-direction: column;
  background: #000;
  color: #fff;
}

.publicar-topo {
  flex-shrink: 0;
  display: flex;
  align-items: center;
  justify-content: space-between;
  height: 56px;
  padding: 0 8px 0 4px;
  border-bottom: 1px solid #262626;
}

.publicar-fechar {
  display: flex;
  align-items: center;
  justify-content: center;
  width: 44px;
  height: 44px;
  background: none;
  border: none;
  color: #fff;
  cursor: pointer;
}

.publicar-fechar svg {
  width: 24px;
  height: 24px;
}

.publicar-titulo {
  font-weight: 700;
  font-size: 1rem;
  color: #fff;
}

.publicar-avancar {
  padding: 8px 12px;
  border: none;
  border-radius: 8px;
  background: none;
  color: var(--roxo);
  font-weight: 700;
  font-size: .95rem;
  cursor: pointer;
}

.publicar-avancar:disabled {
  color: #363636;
  cursor: default;
}

.publicar-corpo {
  flex: 1;
  min-height: 0;
  overflow-y: auto;
  display: flex;
  flex-direction: column;
}

.publicar-dica {
  flex-shrink: 0;
  padding: 14px 20px;
  text-align: center;
  font-size: .85rem;
  color: #a8a8a8;
  background: #000;
  border-top: 1px solid #262626;
}

.publicar-vazio {
  flex: 1;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  gap: 20px;
  padding: 24px;
  text-align: center;
  color: #a8a8a8;
}

.publicar-vazio svg {
  width: 64px;
  height: 64px;
  color: #a8a8a8;
}

.publicar-selecionar {
  display: inline-block;
  padding: 10px 22px;
  border-radius: 10px;
  background: var(--roxo);
  color: #fff;
  font-weight: 700;
  font-size: .9rem;
  cursor: pointer;
}

.publicar-input-arquivo {
  position: absolute;
  width: 1px;
  height: 1px;
  overflow: hidden;
  opacity: 0;
}

.publicar-grade {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 2px;
  padding: 2px;
}

.publicar-grade-item {
  position: relative;
  aspect-ratio: 1;
  background: #121212;
  overflow: hidden;
}

.publicar-grade-item img,
.publicar-grade-item video {
  width: 100%;
  height: 100%;
  object-fit: cover;
  display: block;
}

.publicar-grade-remover {
  position: absolute;
  top: 4px;
  right: 4px;
  width: 24px;
  height: 24px;
  display: flex;
  align-items: center;
  justify-content: center;
  border: none;
  border-radius: 50%;
  background: rgba(0, 0, 0, .6);
  color: #fff;
  cursor: pointer;
}

.publicar-grade-adicionar {
  display: flex;
  align-items: center;
  justify-content: center;
  aspect-ratio: 1;
  background: #121212;
  border: none;
  color: #a8a8a8;
  cursor: pointer;
}

.publicar-grade-adicionar svg {
  width: 28px;
  height: 28px;
}

.publicar-passo {
  display: flex;
  flex-direction: column;
  min-height: 100%;
}

.publicar-resumo {
  display: flex;
  gap: 8px;
  overflow-x: auto;
  padding: 12px;
}

.publicar-resumo-item {
  flex-shrink: 0;
  width: 88px;
  height: 88px;
  border-radius: 8px;
  overflow: hidden;
  background: #121212;
}

.publicar-resumo-item img,
.publicar-resumo-item video {
  width: 100%;
  height: 100%;
  object-fit: cover;
  display: block;
}

/* Editor de legenda (negrito/itálico/sublinhado/emoji) — reaproveita os
   componentes genéricos .editor-* (mesmos de editar_perfil.php/"Sobre"),
   só recoloridos aqui pro tema escuro fixo desta tela (ver nota "Tema
   escuro fixo" mais acima: essa página não usa as var(--bg)/var(--card) do
   resto do site de propósito). */
.publicar-tela .editor-toolbar {
  margin: 0 12px;
  border-color: #262626;
  background: #000;
}

.publicar-tela .editor-botao {
  color: #fff;
}

.publicar-tela .editor-botao:hover {
  background: #262626;
}

.publicar-tela .editor-toolbar-separador {
  background: #262626;
}

.publicar-tela .editor-emoji-picker {
  background: #000;
  border-color: #262626;
}

.publicar-tela .editor-emoji-picker button {
  color: #fff;
}

.publicar-tela .mencao-dropdown {
  background: #000;
  border-color: #262626;
}

.publicar-tela .mencao-dropdown-item {
  color: #fff;
}

.publicar-tela .mencao-dropdown-item:hover {
  background: #262626;
}

.publicar-tela .mencao-dropdown-item-completo {
  color: #a8a8a8;
}

.publicar-tela .editor-area {
  flex: 1;
  min-height: 140px;
  margin: 0 12px 12px;
  border-color: #262626;
  background: #000;
  color: #fff;
  font-size: .95rem;
}

.publicar-tela .editor-area:empty:before {
  color: #a8a8a8;
}

.publicar-tela .editor-area:focus {
  border-color: var(--roxo);
}

/* Área /jogos (jogos/jogos.php) — seleção de jogo/tema + ranking social.
   Alcançada pelo item "Jogos" do menu "Mais", ver includes/nav_app.php. */
.jogos-lista {
  display: flex;
  flex-direction: column;
  gap: 12px;
  margin-bottom: 28px;
}

.jogos-card {
  display: flex;
  align-items: center;
  gap: 14px;
  padding: 16px;
  background: var(--card);
  border: 1px solid var(--borda);
  border-radius: 14px;
  text-align: left;
  cursor: pointer;
  color: var(--txt);
}

.jogos-card-icone {
  flex-shrink: 0;
  width: 52px;
  height: 52px;
  border-radius: 12px;
  display: flex;
  align-items: center;
  justify-content: center;
  background: linear-gradient(135deg, var(--roxo), #22d3ee);
  color: #fff;
}

.jogos-card-icone svg {
  width: 28px;
  height: 28px;
}

.jogos-card-texto {
  display: flex;
  flex-direction: column;
  gap: 2px;
}

.jogos-card-texto strong {
  font-size: 1rem;
}

.jogos-card-texto span {
  font-size: .82rem;
  color: var(--muted);
}

/* Bottom sheet de escolha de tema — mesmo padrão visual de .mais-menu-modal. */
.jogos-temas-modal {
  position: fixed;
  inset: 0;
  z-index: 300;
}

.jogos-temas-fundo {
  position: absolute;
  inset: 0;
  background: rgba(0, 0, 0, .5);
}

.jogos-temas-painel {
  position: absolute;
  left: 0;
  right: 0;
  bottom: 0;
  padding: 0 16px max(20px, env(safe-area-inset-bottom));
  background: var(--card);
  border-radius: 16px 16px 0 0;
  transform: translateY(100%);
  transition: transform .25s ease;
}

.jogos-temas-modal.aberto .jogos-temas-painel {
  transform: translateY(0);
}

.jogos-temas-alca {
  width: 40px;
  height: 4px;
  border-radius: 999px;
  background: var(--borda);
  margin: 10px auto;
}

.jogos-temas-grade {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 12px;
  margin-top: 12px;
}

.jogos-tema-item {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 8px;
  color: var(--txt);
  font-size: .8rem;
  font-weight: 600;
  text-align: center;
}

.jogos-tema-amostra {
  width: 100%;
  aspect-ratio: 1;
  border-radius: 14px;
  border: 1px solid var(--borda);
}

.jogos-ranking-minha {
  background: var(--bg);
  border: 1px solid var(--borda);
  border-radius: 10px;
  padding: 10px 14px;
  margin-bottom: 12px;
  font-size: .88rem;
  color: var(--txt);
}

.jogos-ranking-lista {
  list-style: none;
  margin: 0;
  padding: 0;
  display: flex;
  flex-direction: column;
  gap: 4px;
}

.jogos-ranking-item {
  display: flex;
  align-items: center;
  gap: 10px;
  padding: 8px 10px;
  border-radius: 10px;
}

.jogos-ranking-item-eu {
  background: var(--bg);
  border: 1px solid var(--roxo);
}

.jogos-ranking-posicao {
  flex-shrink: 0;
  width: 32px;
  text-align: center;
  font-weight: 700;
  color: var(--muted);
}

.jogos-ranking-perfil {
  flex: 1;
  display: flex;
  align-items: center;
  gap: 8px;
  min-width: 0;
  color: var(--txt);
  font-weight: 600;
  font-size: .9rem;
  overflow: hidden;
}

.jogos-ranking-perfil span {
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.jogos-ranking-avatar {
  width: 32px;
  height: 32px;
  border-radius: 50%;
  flex-shrink: 0;
}

.jogos-ranking-pontos {
  flex-shrink: 0;
  font-weight: 700;
  color: var(--roxo);
  font-size: .85rem;
}

/* Snake em tela cheia (jogos/snake.php) — mesmo espírito de tela cheia de
   .publicar-tela (body.publicar-corpo-pagina), fundo definido inline via PHP
   (cor do tema escolhido, ver JOGOS_TEMAS em includes/jogos.php). */
body.jogos-corpo-pagina {
  padding-top: 0;
  overflow: hidden;
}

.jogos-tela {
  position: fixed;
  inset: 0;
  z-index: 500;
  display: flex;
  flex-direction: column;
  color: #fff;
}

.jogos-tela-topo {
  flex-shrink: 0;
  height: 56px;
  display: flex;
  align-items: center;
  justify-content: space-between;
  padding: 0 16px;
  background: rgba(0, 0, 0, .3);
}

.jogos-tela-voltar {
  display: flex;
  align-items: center;
  justify-content: center;
  width: 40px;
  height: 40px;
  color: #fff;
  flex-shrink: 0;
}

.jogos-tela-voltar svg {
  width: 22px;
  height: 22px;
}

.jogos-tela-pontuacao {
  font-weight: 700;
}

.jogos-tela-tema {
  font-size: .8rem;
  opacity: .75;
}

#jogos-canvas {
  flex: 1;
  display: block;
  width: 100%;
  touch-action: none;
}

/* D-pad flutuante por cima do canvas (controle principal no celular — ver
   "Bug corrigido" no CLAUDE.md: sem isso, o único controle era arrastar o
   dedo, e não tinha nenhuma pista visual de que isso era possível). Grid 3x3
   em cruz, só as 4 células das pontas preenchidas. */
.jogos-dpad {
  position: absolute;
  left: 50%;
  bottom: max(16px, env(safe-area-inset-bottom));
  transform: translateX(-50%);
  z-index: 5;
  display: grid;
  grid-template-columns: repeat(3, 52px);
  grid-template-rows: repeat(3, 52px);
  gap: 4px;
}

.jogos-dpad-botao {
  display: flex;
  align-items: center;
  justify-content: center;
  background: rgba(255, 255, 255, .12);
  border: 1px solid rgba(255, 255, 255, .25);
  border-radius: 10px;
  color: #fff;
  cursor: pointer;
}

.jogos-dpad-botao svg {
  width: 24px;
  height: 24px;
}

.jogos-dpad-cima     { grid-column: 2; grid-row: 1; }
.jogos-dpad-esquerda { grid-column: 1; grid-row: 2; }
.jogos-dpad-direita  { grid-column: 3; grid-row: 2; }
.jogos-dpad-baixo    { grid-column: 2; grid-row: 3; }

/* No Tetris, esquerda/direita são os botões mais usados (move a peça a cada
   toque, sem gesto de arrastar como no Snake) — pedido explícito do usuário
   pra ficarem maiores e mais afastados do centro, facilitando o toque sem
   errar no "girar"/"descer" do meio. Só a LARGURA das colunas das pontas e a
   ALTURA da linha do meio mudam (linhas de cima/baixo continuam 52px, then
   cima/baixo não ficam gigantes à toa) — como os botões preenchem a célula
   inteira do grid por padrão, aumentar a célula já aumenta o botão. */
.jogos-dpad-tetris {
  grid-template-columns: 76px 52px 76px;
  grid-template-rows: 52px 68px 52px;
  gap: 10px;
}

.jogos-dpad-tetris .jogos-dpad-esquerda svg,
.jogos-dpad-tetris .jogos-dpad-direita svg {
  width: 30px;
  height: 30px;
}

@media (min-width: 640px) {
  /* Em telas maiores (desktop/tablet) o teclado já é o controle natural —
     o D-pad continua funcionando se clicado, mas não precisa ocupar espaço
     por padrão. */
  .jogos-dpad {
    opacity: .55;
    transition: opacity .15s ease;
  }
  .jogos-dpad:hover {
    opacity: 1;
  }
}

.jogos-gameover-modal {
  position: fixed;
  inset: 0;
  z-index: 10;
  display: flex;
  align-items: center;
  justify-content: center;
  background: rgba(0, 0, 0, .6);
  padding: 24px;
}

.jogos-gameover-caixa {
  background: var(--card);
  color: var(--txt);
  border-radius: 16px;
  padding: 28px 24px;
  text-align: center;
  max-width: 320px;
}

.jogos-gameover-acoes {
  display: flex;
  gap: 10px;
  margin-top: 16px;
  justify-content: center;
}

/* Candy Match (jogos/candy.php) — visual fixo "doce" (fundo rosa/roxo em
   gradiente, texto branco), diferente do resto de /jogos que herda o tema
   escolhido (JOGOS_TEMAS). Não reaproveita .jogos-tela porque a estrutura do
   HUD (perfil/nível/objetivo em 2 linhas) é bem mais rica que o topo simples
   de Snake/Tetris — reaproveita só body.jogos-corpo-pagina (zera padding-top,
   sem topo-fixo) e .jogos-gameover-acoes/.jogos-dpad-botao-like nos modais.
   2026-08-15: layout/efeitos refeitos pra um acabamento mais "profissional" —
   fundo com blobs radiais lentos (profundidade sem custar nada de canvas),
   painéis do HUD em vidro fosco (backdrop-filter), barra de objetivo com
   brilho passando por cima, entrada animada de modal/toast. Toda a animação
   do TABULEIRO em si (troca, queda, remoção, partículas, combo, seleção
   pulsante) é feita no canvas via JS, ver jogos/candy.php. */
.candy-tela {
  position: fixed;
  inset: 0;
  z-index: 500;
  display: flex;
  flex-direction: column;
  color: #fff;
  background:
    radial-gradient(ellipse 60% 45% at 15% 12%, rgba(244, 114, 182, .35), transparent 60%),
    radial-gradient(ellipse 55% 40% at 88% 20%, rgba(34, 211, 238, .18), transparent 60%),
    radial-gradient(ellipse 70% 50% at 50% 100%, rgba(124, 58, 237, .4), transparent 65%),
    linear-gradient(160deg, #db2777, #7c3aed 55%, #4c1d95);
  background-size: 140% 140%, 140% 140%, 140% 140%, 100% 100%;
  animation: candy-fundo-flutuar 22s ease-in-out infinite;
}

@keyframes candy-fundo-flutuar {
  0%, 100% { background-position: 0% 0%, 100% 0%, 50% 100%, 0 0; }
  50% { background-position: 8% 10%, 92% 12%, 46% 96%, 0 0; }
}

@media (prefers-reduced-motion: reduce) {
  .candy-tela { animation: none; }
}

.candy-sair {
  position: absolute;
  top: max(10px, env(safe-area-inset-top));
  right: 10px;
  z-index: 20;
  width: 36px;
  height: 36px;
  display: flex;
  align-items: center;
  justify-content: center;
  background: rgba(255, 255, 255, .18);
  border: 1px solid rgba(255, 255, 255, .25);
  border-radius: 50%;
  color: #fff;
  transition: background .15s ease, transform .15s ease;
}

.candy-sair:active {
  transform: scale(.92);
  background: rgba(255, 255, 255, .3);
}

.candy-sair svg {
  width: 18px;
  height: 18px;
}

.candy-hud {
  flex-shrink: 0;
  padding: max(10px, env(safe-area-inset-top)) 52px 10px 12px;
  display: flex;
  flex-direction: column;
  gap: 8px;
  background: rgba(17, 8, 36, .32);
  backdrop-filter: blur(14px) saturate(1.3);
  -webkit-backdrop-filter: blur(14px) saturate(1.3);
  border-bottom: 1px solid rgba(255, 255, 255, .1);
  box-shadow: 0 8px 24px rgba(0, 0, 0, .18);
  position: relative;
  z-index: 15;
}

.candy-hud-linha {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 10px;
  flex-wrap: wrap;
}

.candy-hud-perfil {
  display: flex;
  align-items: center;
  gap: 8px;
  min-width: 0;
}

.candy-hud-avatar {
  flex-shrink: 0;
  width: 36px;
  height: 36px;
  border-radius: 50%;
  display: flex;
  align-items: center;
  justify-content: center;
  background: #fff;
  color: #a855f7;
  font-weight: 700;
  font-size: .95rem;
  border: 2px solid rgba(255, 255, 255, .6);
  box-shadow: 0 2px 8px rgba(0, 0, 0, .25);
}

.candy-hud-perfil-texto {
  display: flex;
  flex-direction: column;
  min-width: 0;
  line-height: 1.25;
}

.candy-hud-perfil-texto strong {
  font-size: .85rem;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  max-width: 34vw;
}

.candy-hud-pontos-total {
  font-size: .78rem;
  opacity: .9;
}

.candy-hud-nivel {
  display: flex;
  align-items: center;
  gap: 6px;
  flex-shrink: 0;
}

.candy-hud-nivel-pill {
  background: rgba(255, 255, 255, .2);
  border: 1px solid rgba(255, 255, 255, .3);
  border-radius: 999px;
  padding: 4px 10px;
  font-size: .72rem;
  font-weight: 700;
  letter-spacing: .04em;
}

.candy-hud-nivel strong {
  font-size: 1.1rem;
  line-height: 1;
}

.candy-hud-nivel-label {
  font-size: .68rem;
  opacity: .85;
}

.candy-hud-objetivo {
  display: flex;
  align-items: center;
  gap: 8px;
  flex: 1;
  min-width: 0;
}

.candy-objetivo-icone {
  flex-shrink: 0;
  width: 22px;
  height: 22px;
  border-radius: 50%;
  border: 2px solid rgba(255, 255, 255, .7);
  box-shadow: inset 0 0 0 2px rgba(0, 0, 0, .08), 0 0 6px rgba(255, 255, 255, .35);
  transition: background .2s ease;
}

.candy-objetivo-numeros {
  flex-shrink: 0;
  font-weight: 700;
  font-size: .82rem;
  font-variant-numeric: tabular-nums;
}

.candy-objetivo-barra {
  position: relative;
  flex: 1;
  height: 9px;
  min-width: 60px;
  border-radius: 999px;
  background: rgba(255, 255, 255, .2);
  box-shadow: inset 0 1px 3px rgba(0, 0, 0, .25);
  overflow: hidden;
}

.candy-objetivo-barra-preenchida {
  display: block;
  position: relative;
  height: 100%;
  width: 0%;
  background: linear-gradient(90deg, #fbbf24, #facc15 60%, #fde68a);
  border-radius: 999px;
  transition: width .35s cubic-bezier(.34, 1.56, .64, 1);
  overflow: hidden;
}

/* Brilho passando por cima da barra continuamente — detalhe "profissional"
   barato (CSS puro, sem custo de canvas), reforça que o objetivo está vivo. */
.candy-objetivo-barra-preenchida::after {
  content: "";
  position: absolute;
  inset: 0;
  background: linear-gradient(115deg, transparent 20%, rgba(255, 255, 255, .55) 40%, transparent 60%);
  background-size: 200% 100%;
  animation: candy-barra-brilho 2.2s ease-in-out infinite;
}

@keyframes candy-barra-brilho {
  0% { background-position: 140% 0; }
  100% { background-position: -40% 0; }
}

.candy-hud-fase-pontos {
  flex-shrink: 0;
  display: flex;
  align-items: center;
  gap: 6px;
  font-size: .85rem;
  font-weight: 700;
}

.candy-hud-estrelas,
.candy-modal-estrelas {
  display: flex;
  gap: 2px;
  color: rgba(255, 255, 255, .35);
}

.candy-modal-estrelas {
  justify-content: center;
  color: var(--borda);
  margin: 8px 0;
}

.candy-hud-estrelas svg,
.candy-modal-estrelas svg {
  width: 16px;
  height: 16px;
}

.candy-modal-estrelas svg {
  width: 28px;
  height: 28px;
}

.candy-estrela-cheia {
  color: #facc15;
  fill: #facc15;
}

.candy-area {
  position: relative;
  flex: 1;
  min-height: 0;
}

#candy-canvas {
  display: block;
  width: 100%;
  height: 100%;
  touch-action: none;
}

.candy-toast {
  position: absolute;
  top: 14px;
  left: 50%;
  transform: translateX(-50%);
  background: rgba(17, 8, 36, .72);
  backdrop-filter: blur(6px);
  -webkit-backdrop-filter: blur(6px);
  border: 1px solid rgba(255, 255, 255, .15);
  color: #fff;
  padding: 7px 16px;
  border-radius: 999px;
  font-size: .8rem;
  font-weight: 700;
  z-index: 5;
  box-shadow: 0 6px 18px rgba(0, 0, 0, .3);
  animation: candy-toast-entrar .25s cubic-bezier(.34, 1.56, .64, 1);
}

@keyframes candy-toast-entrar {
  from { opacity: 0; transform: translate(-50%, -8px) scale(.9); }
  to { opacity: 1; transform: translate(-50%, 0) scale(1); }
}

.candy-modal {
  position: fixed;
  inset: 0;
  z-index: 10;
  display: flex;
  align-items: center;
  justify-content: center;
  background: rgba(10, 4, 20, .68);
  backdrop-filter: blur(3px);
  -webkit-backdrop-filter: blur(3px);
  padding: 24px;
  animation: candy-modal-fundo-entrar .25s ease;
}

@keyframes candy-modal-fundo-entrar {
  from { opacity: 0; }
  to { opacity: 1; }
}

.candy-modal-caixa {
  background: var(--card);
  color: var(--txt);
  border-radius: 20px;
  padding: 28px 24px;
  text-align: center;
  max-width: 320px;
  box-shadow: 0 20px 60px rgba(0, 0, 0, .4);
  animation: candy-modal-caixa-entrar .35s cubic-bezier(.34, 1.56, .64, 1);
}

@keyframes candy-modal-caixa-entrar {
  from { opacity: 0; transform: scale(.85) translateY(12px); }
  to { opacity: 1; transform: scale(1) translateY(0); }
}

/* Página /saude/saude.php — só o título principal fica centralizado (pedido
   explícito do usuário); .form-titulo em si continua alinhado à esquerda por
   padrão nas outras páginas que o usam (depoimentos.php etc.), então esse
   ajuste é escopado só aqui, não no .form-titulo genérico. */
.saude-titulo {
  text-align: center;
}

.saude-alvo-linha {
  display: flex;
  gap: 12px;
}

.saude-alvo-linha .form-grupo {
  flex: 1;
}

.saude-alertas-titulo {
  display: block;
  margin-top: 20px;
}

/* Aviso mostrado no lugar da seção de alertas (#saude-alertas-secao) quando
   "Mostrar minha glicemia no topo" está desmarcado — ver JS em
   saude/saude.php, atualizarVisibilidadeSecaoAlertas(). */
.saude-alertas-desativado-aviso {
  margin: 20px 0 16px;
}

.saude-alerta-linha {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 12px;
  margin-bottom: 12px;
}

.saude-alerta-checkbox {
  margin-bottom: 0;
}

#nightscout-desabilitar-alertas {
  margin-bottom: 16px;
}

/* Quadro em destaque do "pausar alerta sonoro" — só aparece quando o
   checkbox "Som de alerta" está marcado (ver JS em saude/saude.php,
   atualizarVisibilidadePausaSom()): reúne o status "pausado até HH:MM" +
   "Cancelar pausa" (.saude-pausa-bloco, aninhado aqui dentro) e o seletor de
   duração (30min a 24h) + botão "Aplicar" num único cartão com borda na cor
   da marca, pra se destacar visualmente do resto do formulário. */
.saude-pausa-destaque {
  /* Fundo com tingimento roxo (não var(--bg)/var(--card) puro, que ficam
     parecidos com o resto da página/cartão e não destacam nada — ver
     CLAUDE.md, "quadro em destaque na mesma cor do resto da página") pra
     esse quadro realmente se diferenciar visualmente como um aviso/destaque,
     não só mais uma seção comum do formulário. */
  background: rgba(124, 58, 237, .08);
  border: 2px solid var(--roxo);
  border-radius: 12px;
  padding: 16px;
  margin-bottom: 16px;
}

.saude-pausa-destaque-titulo {
  margin: 0 0 12px;
  font-size: 1rem;
  color: var(--roxo);
}

.saude-pausa-destaque .form-grupo {
  margin-bottom: 10px;
}

.saude-pausa-destaque .form-hint {
  margin: 10px 0 0;
}

.saude-pausa-bloco {
  background: var(--card);
  border: 1px solid var(--borda);
  border-radius: 10px;
  padding: 12px 14px;
  margin-bottom: 16px;
}

.saude-pausa-bloco .form-hint {
  margin: 0 0 10px;
}

/* Botão de teste temporário (resetar dedup do alerta de push, ver
   saude/saude.php e "Passo manual pendente" no CLAUDE.md) — antes vinha
   dentro de um .form-card com título/parágrafo explicando; virou só um link
   discreto no rodapé da página, sem card/fundo, a pedido do usuário. Remover
   junto com o cartão inteiro quando o botão não for mais necessário. */
.saude-teste-discreto {
  max-width: 420px;
  margin: 24px auto 0;
  text-align: center;
}

.botao-discreto {
  display: inline-block;
  background: none;
  border: none;
  padding: 6px 4px;
  font-size: .78rem;
  color: var(--muted);
  cursor: pointer;
  text-decoration: underline;
}

.botao-discreto:hover {
  color: var(--roxo);
}
