/* ==========================================================================
   Foco em Promo - folha de estilo unica, mobile-first.
   Sem framework: o CSS carrega em um request e nao bloqueia a renderizacao.
   ========================================================================== */

:root {
  --bg:            #f1f5f9;
  --surface:       #ffffff;
  --surface-alt:   #f8fafc;
  --border:        #e2e8f0;
  --border-strong: #cbd5e1;

  --text:          #0f172a;
  --text-soft:     #475569;
  --text-muted:    #64748b;

  --brand:         #0f172a;
  --accent:        #ea580c;
  --accent-soft:   #ffedd5;
  --accent-light:  #fbbf24;
  --accent-ink:    #9a3412;
  --primary:       #1d4ed8;
  --primary-dark:  #1e40af;
  --primary-fade:  rgba(29, 78, 216, .12);
  --success:       #047857;
  --success-soft:  #d1fae5;
  --success-ink:   #065f46;
  --warning-soft:  #fef3c7;
  --warning-ink:   #92400e;

  /* Texto legivel sobre cada cor cheia. O painel de Aparencia recalcula
     estes valores sozinho quando o admin troca a paleta. */
  --on-brand:      #ffffff;
  --on-primary:    #ffffff;
  --on-accent:     #ffffff;
  --on-success:    #ffffff;

  --header-muted:    #cbd5e1;
  --header-input-bg: rgba(255, 255, 255, .12);
  --header-input-hover: rgba(255, 255, 255, .18);
  --header-line-forte: rgba(255, 255, 255, .28);
  --header-line:     rgba(255, 255, 255, .14);
  --header-nav-bg:   rgba(0, 0, 0, .16);
  --hero-from:       #0f172a;
  --hero-to:         #1e3a8a;
  --hero-btn:        #1d4ed8;
  --on-hero-btn:     #ffffff;
  --warn:          #b45309;
  --warn-soft:     #fef3c7;
  --danger:        #b91c1c;
  --danger-soft:   #fee2e2;
  --danger-ink:    #991b1b;

  --radius-sm: 6px;
  --radius:    10px;
  --radius-lg: 14px;
  --shadow:    0 1px 2px rgba(15, 23, 42, .06), 0 1px 3px rgba(15, 23, 42, .08);
  --shadow-lg: 0 4px 16px rgba(15, 23, 42, .10);

  --space-1: .25rem;
  --space-2: .5rem;
  --space-3: .75rem;
  --space-4: 1rem;

  --max: 1180px;
  --font: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
}

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

html {
  height: 100%;
  -webkit-text-size-adjust: 100%;
  scroll-behavior: smooth;
}

body {
  min-height: 100%;
  min-height: 100vh;
  min-height: 100dvh;
  display: flex;
  flex-direction: column;
  margin: 0;
  font-family: var(--font);
  font-size: 15px;
  line-height: 1.55;
  color: var(--text);
  background: var(--bg);
  -webkit-font-smoothing: antialiased;
}

img { max-width: 100%; height: auto; }
a { color: var(--primary); text-decoration: none; }
a:hover { text-decoration: underline; }

h1, h2, h3 { line-height: 1.25; margin: 0 0 .5em; font-weight: 700; letter-spacing: -.01em; }
h1 { font-size: 1.55rem; }
h2 { font-size: 1.2rem; }
h3 { font-size: 1rem; }

p { margin: 0 0 1em; }

code, .mono { font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; font-size: .9em; }

.muted { color: var(--text-muted); }
.small { font-size: .82rem; }
.nowrap { white-space: nowrap; }
.break-all { word-break: break-all; }
.grow { flex: 1 1 260px; }

.sr-only {
  position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px;
  overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; border: 0;
}

.skip-link {
  position: absolute; left: -9999px; top: 0; z-index: 100;
  background: var(--brand); color: #fff; padding: .6rem 1rem;
}
.skip-link:focus { left: 0; }

:focus-visible { outline: 2px solid var(--primary); outline-offset: 2px; border-radius: 4px; }

/* ==========================================================================
   Cabecalho
   ========================================================================== */

.site-header {
  background: var(--brand);
  color: var(--on-brand);
  position: sticky; top: 0; z-index: 40;
  box-shadow: var(--shadow);
}

.header-inner {
  max-width: var(--max); margin: 0 auto;
  display: flex; align-items: center; gap: .75rem;
  padding: .6rem 1rem;
  flex-wrap: wrap;
}

.brand { display: flex; align-items: center; gap: .5rem; color: var(--on-brand); font-weight: 800; }
.brand:hover { text-decoration: none; }
.brand-mark {
  width: 50px; height: 50px; flex: none;
  display: block; line-height: 0;
}
/* O icone nao tem fundo proprio: o cabecalho ja e da cor da marca.
   O respiro a mais vem do desenho, que nao encosta na borda do viewBox. */
.brand-mark svg { width: 100%; height: 100%; display: block; overflow: visible; }
.brand-mark img { width: 100%; height: 100%; display: block; border-radius: 12px; object-fit: contain; }
.brand-name { font-size: 1.05rem; letter-spacing: -.02em; }

.header-search { flex: 1 1 260px; display: flex; gap: .35rem; order: 3; }
.header-search input {
  flex: 1; min-width: 0;
  padding: .5rem .75rem;
  border: 1px solid transparent; border-radius: var(--radius);
  background: var(--header-input-bg); color: var(--on-brand); font-size: .92rem;
}
.header-search input::placeholder { color: var(--header-muted); }
.header-search input:focus { background: var(--surface); color: var(--text); }
.header-search button {
  padding: .5rem .85rem; border: 0; border-radius: var(--radius);
  background: var(--accent); color: var(--on-accent); font-weight: 600; cursor: pointer;
}

.header-actions { display: flex; align-items: center; gap: .4rem; margin-left: auto; }

/* --------------------------------------------------------------------------
   O cabeçalho no celular
   --------------------------------------------------------------------------
   MEDIDO ANTES DE MEXER, num Android de 360x640: o cabeçalho ocupava 217px --
   34% da primeira tela -- e a primeira promoção só começava em 763px. Ou seja:
   mais de uma tela inteira de rolagem, num site de promoções, antes de ver uma
   promoção.

   Três coisas somavam para isso:

     1. os botões não cabiam ao lado do logo escritos por extenso, então o
        `flex-wrap` os jogava para uma linha só deles, encostados na direita,
        com uns 230px vazios do lado do logo;
     2. a busca ficava numa terceira linha;
     3. o banner azul repetia a MESMA busca, logo abaixo.

   Aqui some a repetição e os botões voltam para a linha do logo, como ícone.
   O texto continua no HTML e volta a aparecer a partir de 640px.
   -------------------------------------------------------------------------- */

.btn-enviar { display: inline-flex; align-items: center; gap: .4rem; }
.header-acao-icone { display: inline-flex; align-items: center; gap: .4rem; }
.header-acao .icone, .btn-enviar .icone { flex: none; }

/* Nas telas largas o ícone não acrescenta nada -- o texto já diz tudo. */
@media (min-width: 640px) {
  .header-acao .icone, .btn-enviar .icone { display: none; }
  .btn-enviar .rotulo-curto { display: none; }
}

@media (max-width: 639.98px) {
  /* O logo não pode encolher a ponto de quebrar em três linhas ("Foco / em /
     Promo"), que foi o que aconteceu na primeira tentativa. */
  .brand { flex: 0 1 auto; min-width: 0; }
  .brand-name { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }

  /* `flex-wrap: wrap`, e NÃO `nowrap` -- eu tentei `nowrap` primeiro e o site
     passou a rolar para o lado. O motivo: a busca abaixo tem `flex-basis: 100%`
     para ganhar a linha inteira, e com `nowrap` esse 100% soma com o logo e os
     botões na MESMA linha. A largura mínima da página virou 487px num aparelho
     de 360px, e o navegador encolheu tudo para caber.
     A quebra precisa continuar ligada: é ela que manda a busca para a segunda
     linha. O que mudou é que agora os botões cabem na primeira, porque viraram
     ícone. */
  .header-inner { gap: .5rem; padding: .5rem .75rem; flex-wrap: wrap; }

  /* O SINO fica só com o ícone: sino com bolinha vermelha é convenção que
     qualquer pessoa já leu mil vezes. O BOTÃO DE ENVIAR, não: um "+" sozinho,
     ao lado de "Entrar", não diz o que faz -- foi assim que ficou na primeira
     tentativa, e botão que ninguém entende é pior do que botão grande. Ele
     mantém um rótulo, só que o curto.

     Os dois rótulos vivem no HTML, e não num `content:` do CSS: texto que a
     pessoa lê não pertence à folha de estilo -- ninguém procura uma palavra da
     interface dentro de um arquivo .css. */
  .header-acao .rotulo,
  .btn-enviar .rotulo-longo {
    position: absolute; width: 1px; height: 1px;
    padding: 0; margin: -1px; overflow: hidden;
    clip: rect(0 0 0 0); white-space: nowrap; border: 0;
  }

  .header-acao { padding: .38rem .55rem; }
  .btn-enviar { padding: .38rem .7rem; }
}

/* Abaixo de 400px o nome escrito não cabe junto com os dois botões: medi, e
   falta perto de 25px. O flexbox resolve isso quebrando a linha -- e a linha
   quebrada é exatamente o que o Tiago estranhou ao abrir o site no celular:
   dois botões encostados na direita, com um vazio grande do lado do logo.

   Então, só nessa faixa, o nome sai e fica o ícone. Não é perda de marca: o
   ícone é o mesmo, continua sendo o link para a home, o nome está no título da
   aba, no rodapé e na primeira linha de toda página compartilhada. Aparelho
   dessa largura é onde cada pixel decide se a promoção aparece ou não. */
@media (max-width: 399.98px) {
  .brand-name {
    position: absolute; width: 1px; height: 1px;
    padding: 0; margin: -1px; overflow: hidden;
    clip: rect(0 0 0 0); white-space: nowrap; border: 0;
  }

  /* A busca do cabeçalho ganha a linha inteira -- e é a ÚNICA do site, porque
     a do banner sai (ver `.hero-search` mais abaixo). A do cabeçalho é a que
     fica: ela existe em toda página, e a do banner só na home. */
  .header-search { order: 3; flex: 1 0 100%; }
  .header-search button { padding: .5rem .7rem; }
}

/* "Avisos" e "Entrar" sao ACOES, e estavam desenhadas como texto solto ao lado
   de um botao cheio -- o olho passava batido. Ganharam superficie propria: a
   mesma do campo de busca, que ja e clara sobre a cor da marca em qualquer
   paleta. O texto vai no tom cheio (--on-brand), nao no mudo. */
.header-acao {
  color: var(--on-brand);
  background: var(--header-input-bg);
  border: 1px solid var(--header-line);
  border-radius: 999px;
  font-size: .85rem; font-weight: 600;
  padding: .38rem .75rem;
  position: relative;
  transition: background .15s ease, border-color .15s ease;
}
.header-acao:hover {
  color: var(--on-brand);
  background: var(--header-input-hover);
  border-color: var(--header-line-forte);
  text-decoration: none;
}

.badge-count {
  display: inline-block; min-width: 17px; padding: 0 4px;
  margin-left: 4px; border-radius: 9px;
  background: var(--accent); color: var(--on-accent);
  font-size: .72rem; font-weight: 700; text-align: center; line-height: 17px;
}

.avatar {
  display: inline-flex; align-items: center; justify-content: center;
  width: 30px; height: 30px; border-radius: 50%;
  color: #fff; font-weight: 700; font-size: .82rem; flex: none;
}
.avatar.small { width: 24px; height: 24px; font-size: .7rem; }
.avatar.xl { width: 62px; height: 62px; font-size: 1.5rem; }

.menu { position: relative; }
.menu summary { list-style: none; cursor: pointer; }
.menu summary::-webkit-details-marker { display: none; }
.menu-panel {
  position: absolute; right: 0; top: calc(100% + .5rem);
  background: var(--surface); color: var(--text);
  border: 1px solid var(--border); border-radius: var(--radius);
  box-shadow: var(--shadow-lg);
  min-width: 190px; padding: .6rem; z-index: 50;
  display: flex; flex-direction: column; gap: .15rem;
}
.menu-panel a, .menu-panel .linklike { padding: .35rem .3rem; border-radius: 6px; font-size: .9rem; }
.menu-panel a:hover { background: var(--surface-alt); text-decoration: none; }
.menu-panel strong { padding: 0 .3rem; }
.menu-panel .muted { padding: 0 .3rem .4rem; font-size: .78rem; border-bottom: 1px solid var(--border); margin-bottom: .3rem; }

.header-nav { background: var(--header-nav-bg); }
/* --------------------------------------------------------------------------
   A barra de secoes, e a pista de que ela rola
   --------------------------------------------------------------------------
   MEDIDO NO SITE NO AR, 25/09: 538px de conteudo em 375px de tela. "Cupons" e
   "Desconto e real?" ficam cortados, e nada diz que da para arrastar. Barra de
   rolagem escondida e boa para o visual e pessima para a descoberta: quem nao
   sabe que rola, nao rola -- e o item cortado e justamente o diferencial do
   site.

   A sombra a direita aparece SO quando ha conteudo escondido: ela e presa ao
   fim do conteudo (`background-attachment: local` na camada de cima cobre a
   sombra quando a barra chega ao fim). E CSS puro -- sem JavaScript, sem ouvir
   rolagem, e ja funciona com a pagina carregando.

   A capa precisa ser OPACA e da mesma cor que se ve atras dela. Ela era so a
   camada translucida da barra (--header-nav-bg): a sombra passava por ela, e no
   computador -- onde nada rola -- ficava um quadrado escuro fixo no fim da
   barra. Agora ela repete o que esta atras: a cor da marca com a mesma camada.
   -------------------------------------------------------------------------- */
.header-nav-inner {
  max-width: var(--max); margin: 0 auto; padding: 0 1rem;
  display: flex; gap: .25rem; overflow-x: auto; scrollbar-width: none;

  background-image: linear-gradient(var(--header-nav-bg), var(--header-nav-bg)),
                    linear-gradient(var(--brand), var(--brand)),
                    linear-gradient(to left, rgba(0, 0, 0, .38), rgba(0, 0, 0, 0));
  background-position: right center, right center, right center;
  background-size: 30px 100%, 30px 100%, 30px 100%;
  background-repeat: no-repeat;
  background-attachment: local, local, scroll;
}
.header-nav-inner::-webkit-scrollbar { display: none; }
.header-nav a {
  color: var(--header-muted); padding: .55rem .7rem; font-size: .88rem;
  white-space: nowrap; border-bottom: 2px solid transparent;
}
.header-nav a:hover { color: var(--on-brand); text-decoration: none; }
.header-nav a.active { color: var(--on-brand); border-bottom-color: var(--accent); font-weight: 600; }

/* ==========================================================================
   Layout
   ========================================================================== */

.main { max-width: var(--max); width: 100%; margin: 0 auto; padding: 1rem; flex: 1 0 auto; }

.page-head { margin-bottom: 1rem; }
.page-head h1 { margin-bottom: .25rem; }

.section-header {
  display: flex; align-items: flex-end; justify-content: space-between;
  gap: 1rem; margin: 1.6rem 0 .75rem;
}
.section-header h2 { margin: 0; }
.section-link { font-size: .86rem; font-weight: 600; white-space: nowrap; }

/* No celular o subtítulo da seção quebra em duas linhas, e o `align-items:
   flex-end` empurrava o "Ver todas" para a altura da ÚLTIMA linha dele -- longe
   do título, no meio do nada. Alinhado pelo topo, o link fica ao lado do título,
   que é a coisa com que ele tem relação. */
@media (max-width: 639.98px) {
  .section-header { align-items: flex-start; margin: 1.2rem 0 .6rem; }
}

.card {
  background: var(--surface); border: 1px solid var(--border);
  border-radius: var(--radius-lg); padding: 1.1rem; margin-bottom: 1.1rem;
}
.card h2 { margin-top: 0; }

/* ==========================================================================
   Hero
   ========================================================================== */

.hero {
  background: linear-gradient(140deg, var(--hero-from), var(--hero-to));
  color: var(--on-brand); border-radius: var(--radius-lg);
  padding: 1.75rem 1.25rem; text-align: center; margin-bottom: 1.25rem;
}
.hero h1 { font-size: 1.5rem; margin-bottom: .4rem; }
.hero-sub { color: var(--header-muted); max-width: 46ch; margin: 0 auto 1.1rem; font-size: .95rem; }
.hero-search { display: flex; gap: .4rem; max-width: 520px; margin: 0 auto 1rem; }
.hero-search input {
  flex: 1; min-width: 0; padding: .7rem .9rem; font-size: 1rem;
  border: 0; border-radius: var(--radius);
  background: var(--surface); color: var(--text);
}
/* O botao do banner tem cor propria: a cor de acao pode ser parecida demais
   com a da marca e sumir no fundo. Ver heroButton() em src/lib/theme.js. */
.hero-search .btn-primary { background: var(--hero-btn); color: var(--on-hero-btn); }
.hero-search .btn-primary:hover { filter: brightness(1.08); }

.hero-stats {
  display: flex; gap: 1.25rem; justify-content: center; flex-wrap: wrap;
  font-size: .82rem; color: var(--header-muted);
}
.hero-stats strong { color: var(--on-brand); }

/* --------------------------------------------------------------------------
   O banner no celular
   --------------------------------------------------------------------------
   Ele custava uns 340px: título em quatro linhas, subtítulo em mais quatro, a
   segunda busca da tela, e as estatísticas. Tudo isso ANTES da primeira
   promoção.

   O que fica: o título (que diz o que o site é) e as estatísticas (que provam
   que ele está vivo -- "12 promoções ativas, 8 novas hoje" é a coisa mais
   persuasiva ali, e é a que ocupa menos espaço).

   O que sai: a busca, porque já existe uma no cabeçalho a 50px dali; e o
   subtítulo, que repete em outras palavras o que o título já disse.

   Nada disso vale no computador, onde a tela comporta e o banner cumpre o
   papel de apresentar o site.
   -------------------------------------------------------------------------- */
@media (max-width: 639.98px) {
  .hero { padding: 1.1rem .9rem; margin-bottom: 1rem; }
  .hero h1 { font-size: 1.25rem; line-height: 1.25; margin-bottom: .55rem; }
  .hero-sub { display: none; }
  .hero-search { display: none; }
  .hero-stats { gap: .4rem 1rem; font-size: .8rem; }
}

/* ==========================================================================
   Card de oferta
   ========================================================================== */

.offer-grid {
  display: grid; gap: .85rem;
  grid-template-columns: repeat(auto-fill, minmax(240px, 1fr));
}

.offer-card {
  background: var(--surface); border: 1px solid var(--border);
  border-radius: var(--radius-lg); overflow: hidden;
  display: flex; flex-direction: column; position: relative;
  box-shadow: var(--shadow);
  transition: box-shadow .18s ease, transform .18s ease, border-color .18s ease;
}
.offer-card:hover { box-shadow: var(--shadow-lg); border-color: var(--border-strong); transform: translateY(-2px); }
.offer-card.sponsored { border-color: color-mix(in srgb, #d97706 45%, var(--surface)); box-shadow: inset 0 3px 0 #f59e0b, var(--shadow); }

.sponsored-flag {
  position: absolute; top: .5rem; left: .5rem; z-index: 2;
  --tom: #d97706;
  font-size: .66rem; font-weight: 700; text-transform: uppercase;
  letter-spacing: .04em; padding: .18rem .45rem; border-radius: 4px;
  border: 1px solid;
}

.offer-image {
  position: relative; display: block; aspect-ratio: 4 / 3;
  background: var(--surface-alt); overflow: hidden;
}
.offer-image img { width: 100%; height: 100%; object-fit: contain; padding: .5rem; }

.offer-card.is-expired .offer-image img,
.offer-card.is-expired .offer-image .image-fallback,
.offer-detail.is-expired .offer-detail-media img,
.offer-detail.is-expired .offer-detail-media .image-fallback {
  filter: grayscale(100%);
  opacity: 0.72;
}

.expired-badge-overlay {
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
  background: rgba(15, 23, 42, 0.88);
  color: #f8fafc;
  font-size: 0.76rem;
  font-weight: 700;
  letter-spacing: 0.04em;
  padding: 0.35rem 0.65rem;
  border-radius: 6px;
  border: 1px solid rgba(255, 255, 255, 0.25);
  pointer-events: none;
  z-index: 2;
  box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3);
  white-space: nowrap;
  text-align: center;
}

.btn-repost {
  margin-top: 0.35rem;
  font-size: 0.78rem;
  padding: 0.38rem 0.5rem;
  text-align: center;
  width: 100%;
}

.image-fallback {
  display: flex; align-items: center; justify-content: center;
  width: 100%; height: 100%;
  color: var(--primary); font-weight: 800; font-size: 1.5rem;
  background: radial-gradient(circle at 50% 42%, var(--surface) 0, var(--surface-alt) 65%, var(--primary-fade) 100%);
}
/* `height: auto` deixa o aspect-ratio valer: com o 100% herdado do cartão, o
   quadro da página da oferta esticava até a altura da coluna inteira. */
.image-fallback.large { aspect-ratio: 1; height: auto; border-radius: var(--radius-lg); font-size: 3rem; }

.discount-flag {
  position: absolute; bottom: .5rem; right: .5rem;
  background: var(--success); color: var(--on-success);
  font-size: .78rem; font-weight: 700; padding: .12rem .4rem; border-radius: 5px;
}
.discount-flag.inline { position: static; display: inline-block; }

.offer-body { padding: .7rem .8rem .8rem; display: flex; flex-direction: column; gap: .5rem; flex: 1; }

.offer-meta-top { display: flex; align-items: center; gap: .5rem; flex-wrap: wrap; }
.offer-time { font-size: .75rem; color: var(--text-muted); }

.offer-title {
  font-size: .94rem;
  font-weight: 600;
  margin: 0;
  line-height: 1.35;
  height: 2.7em;
  display: -webkit-box;
  -webkit-box-orient: vertical;
  -webkit-line-clamp: 2;
  overflow: hidden;
  text-overflow: ellipsis;
}
.offer-title a { color: var(--text); }

.offer-prices {
  display: flex;
  align-items: baseline;
  gap: .45rem;
  flex-wrap: wrap;
  min-height: 2.5rem;
  align-content: flex-start;
}
.price-now { font-size: 1.15rem; font-weight: 800; color: var(--success); }
.price-now.big { font-size: 1.8rem; }
.price-now.price-na { font-size: .95rem; color: var(--text-soft); font-weight: 600; }
.price-old { color: var(--text-muted); font-size: .84rem; }
.installments { font-size: .76rem; color: var(--text-muted); width: 100%; }

.offer-tags {
  display: flex;
  gap: .3rem;
  flex-wrap: wrap;
  align-items: center;
  min-height: 1.6rem;
}

.tag {
  font-size: .75rem; padding: .12rem .42rem; border-radius: 5px;
  background: var(--surface-alt); border: 1px solid var(--border); color: var(--text-soft);
}
.tag-coupon   { background: var(--accent-soft); border-color: var(--accent); color: var(--accent-ink); }
.tag-shipping { background: var(--success-soft); border-color: var(--success); color: var(--success-ink); }
.tag-action   { --tom: #4f46e5; }

.store-chip {
  display: inline-flex; align-items: center; gap: .3rem;
  font-size: .76rem; color: var(--text-soft); font-weight: 600;
}
.store-chip.big { font-size: .9rem; }
.store-logo {
  display: inline-flex; align-items: center; justify-content: center;
  width: 20px; height: 20px; border-radius: 5px;
  color: #fff; font-size: .72rem; font-weight: 800; flex: none;
}
.store-logo.big { width: 46px; height: 46px; font-size: 1.1rem; border-radius: 10px; }

.verified-seal {
  display: inline-flex; align-items: center; justify-content: center;
  width: 14px; height: 14px; margin-left: .2rem; border-radius: 50%;
  background: var(--primary); color: var(--on-primary); font-size: .62rem; cursor: help;
}

.offer-footer { margin-top: auto; display: flex; flex-direction: column; gap: .4rem; }
.offer-stats {
  display: flex; align-items: center; gap: .6rem; min-width: 0;
  font-size: .78rem; color: var(--text-muted);
  flex-wrap: nowrap; white-space: nowrap; overflow: hidden;
}
.offer-stats > * { flex: 0 0 auto; }
.offer-stats .stat { color: var(--text-muted); }
.offer-author { min-width: 0; color: var(--text-muted); font-size: .75rem; white-space: nowrap; }
.offer-author a { display: inline-block; max-width: 100%; overflow: hidden; text-overflow: ellipsis; vertical-align: bottom; }

/* Votos Achado / Cilada e classificação da comunidade */
.community-rating { display: flex; flex-direction: column; gap: .35rem; min-width: 0; max-width: 100%; }
.offer-card .community-rating { width: 100%; }
.community-votes { display: flex; align-items: center; flex-wrap: wrap; gap: .35rem; }
.vote-form { display: inline-flex; margin: 0; min-width: 0; }
.community-vote {
  display: inline-flex; align-items: center; justify-content: center; gap: .3rem;
  min-width: 44px; min-height: 44px; max-width: 100%; padding: .35rem .55rem;
  border: 0; border-radius: 8px;
  background: transparent; color: var(--text-soft); font: inherit; font-size: .75rem; font-weight: 650;
  line-height: 1.3; white-space: nowrap;
}
button.community-vote, a.community-vote { cursor: pointer; }
.community-vote strong { font-variant-numeric: tabular-nums; }
.community-vote:hover { text-decoration: none; }
.community-vote:focus-visible { outline: 2px solid var(--primary); outline-offset: 3px; }
.community-vote:disabled { cursor: wait; opacity: .65; }
.community-vote .community-vote-icon { display: block; width: 1.5em; height: 1.5em; flex: none; transform: scale(1); }
.vote-achado .community-vote-icon { color: var(--link-ink, var(--primary)); }
.vote-cilada .community-vote-icon { color: var(--accent-ink); }
.community-vote.active .community-vote-icon { transform: scale(1.5); }
.community-verdict {
  display: inline-flex; align-items: center; flex-wrap: wrap; gap: .25rem;
  align-self: flex-start; max-width: 100%; border-radius: 7px;
  padding: .25rem .45rem; font-size: .72rem; font-weight: 700; line-height: 1.4;
}
.rating-percentage { font-weight: 500; font-variant-numeric: tabular-nums; }
.rating-imperdivel { --tom: #ca8a04; }
.rating-otima { --tom: #ea580c; }
.rating-boa { --tom: #16a34a; }
.rating-dividida { --tom: #64748b; }
.rating-cuidado { --tom: #dc2626; }

/* --------------------------------------------------------------------------
   Selos coloridos: avaliação da comunidade, nível do usuário, "Comprei",
   "Patrocinado". Cada um declara só o TOM (--tom); fundo, texto e borda saem
   da mistura desse tom com as cores da paleta.

   Eram cores fixas de tema claro. Na paleta Escura, "Ótima promoção" virava
   um retângulo creme aceso em cada cartão, e o selo "Novato" ficava cinza
   claro sobre cinza claro. Misturando com --surface e --text, o mesmo selo
   sai claro na paleta clara e escuro na escura, sempre com contraste acima
   de 5:1 (conferido nas sete paletas).
   -------------------------------------------------------------------------- */
:is(.rating-imperdivel, .rating-otima, .rating-boa, .rating-dividida, .rating-cuidado,
    .level-chip, .tag-action, .sponsored-flag, .sponsored-note) {
  background: color-mix(in srgb, var(--tom, #64748b) 16%, var(--surface));
  color: color-mix(in srgb, var(--tom, #64748b) 50%, var(--text));
  border-color: color-mix(in srgb, var(--tom, #64748b) 40%, var(--surface));
}

.status-pill {
  display: inline-flex; align-items: center; gap: .4rem;
  font-size: .72rem; font-weight: 750; text-transform: uppercase;
  letter-spacing: .035em; line-height: 1.25;
  padding: .28rem .6rem; border-radius: 999px; white-space: nowrap;
  background: var(--surface-alt); border: 1px solid var(--border); color: var(--text-soft);
}
.status-pill::before {
  content: ""; width: .4rem; height: .4rem; border-radius: 50%;
  flex: none; background: currentColor;
}
/* Cores das variáveis da paleta (o painel de Aparência recalcula todas). Estas
   regras existiam duas vezes: aqui com cores fixas e, no fim do arquivo, com as
   variáveis -- a de baixo sempre ganhava, e a de cima era só ruído. */
.status-publicada, .status-ativo { background: var(--success-soft); color: var(--success-ink); border-color: var(--success-ink); }
.status-pendente, .pill-warn { background: var(--warning-soft); color: var(--warning-ink); border-color: var(--warning-ink); }
.status-em_verificacao, .pill-info { background: var(--info-soft, #dbeafe); color: var(--info-ink, #1e40af); border-color: var(--info-ink, #1e40af); }
.status-rejeitada, .status-rejeitado, .pill-danger { background: var(--danger-soft); color: var(--danger-ink); border-color: var(--danger); }
.status-expirada, .status-encerrado, .pill-muted { background: var(--surface-alt); color: var(--text-soft); border-color: var(--border-strong); }

/* ==========================================================================
   Botoes
   ========================================================================== */

.btn {
  display: inline-flex; align-items: center; justify-content: center; gap: .35rem;
  padding: .55rem 1rem; border-radius: var(--radius); border: 1px solid transparent;
  font-size: .9rem; font-weight: 600; cursor: pointer; text-align: center;
  font-family: inherit; line-height: 1.2;
  transition: background-color .18s ease, border-color .18s ease, box-shadow .18s ease, transform .18s ease;
}
.btn:hover { text-decoration: none; transform: translateY(-1px); box-shadow: var(--shadow); }
.btn:active { transform: translateY(0); box-shadow: none; }
.btn:disabled { opacity: .5; cursor: not-allowed; transform: none; box-shadow: none; }
.btn-primary   { background: var(--primary); color: var(--on-primary); }
.btn-primary:hover { background: var(--primary-dark); }
.btn-secondary { background: var(--surface); color: var(--text); border-color: var(--border-strong); }
.btn-secondary:hover { background: var(--surface-alt); }
.btn-ghost     { background: transparent; color: var(--text-soft); border-color: transparent; }
.btn-ghost:hover { background: var(--surface-alt); }
.btn-ghost.danger { color: var(--danger); }
.btn-success { background: var(--success); color: var(--on-success); }
.btn-success:hover { filter: brightness(.9); }
.btn-warning-soft { background: var(--warning-soft); color: var(--warning-ink); border-color: var(--border-strong); }
.btn-warning-soft:hover { background: var(--warning-soft); border-color: var(--warning-ink); }
.btn-danger-soft { background: var(--danger-soft); color: var(--danger-ink); border-color: var(--border-strong); }
.btn-danger-soft:hover { background: var(--danger-soft); border-color: var(--danger); }
.btn-sm    { padding: .35rem .7rem; font-size: .82rem; }
.btn-large { padding: .8rem 1.2rem; font-size: 1.02rem; width: 100%; }
.btn-block { width: 100%; }
.btn-cta   { width: 100%; }

.linklike {
  background: none; border: 0; padding: 0; margin: 0;
  color: var(--primary); font: inherit; font-size: .84rem; cursor: pointer; text-align: left;
}
.linklike:hover { text-decoration: underline; }

/* ==========================================================================
   Filtros e paginacao
   ========================================================================== */

.filter-bar {
  background: var(--surface); border: 1px solid var(--border);
  border-radius: var(--radius-lg); padding: .7rem .8rem; margin-bottom: 1rem;
  display: flex; flex-direction: column; gap: .55rem;
}
.filter-sorts, .filter-toggles { display: flex; gap: .35rem; flex-wrap: wrap; }

.chip {
  display: inline-block; padding: .3rem .7rem; border-radius: 999px;
  border: 1px solid var(--border-strong); background: var(--surface);
  color: var(--text-soft); font-size: .82rem; font-weight: 500;
}
.chip:hover { background: var(--surface-alt); text-decoration: none; }
.chip.active { background: var(--brand); border-color: var(--brand); color: var(--on-brand); font-weight: 600; }
.chip-action { cursor: pointer; font-family: inherit; }

.filter-advanced summary { cursor: pointer; font-size: .84rem; color: var(--text-soft); }
.filter-form { display: flex; gap: .6rem; flex-wrap: wrap; align-items: flex-end; margin-top: .6rem; }
.filter-form label { display: flex; flex-direction: column; gap: .2rem; font-size: .78rem; }

.chip-grid {
  display: grid; gap: .6rem;
  grid-template-columns: repeat(auto-fill, minmax(150px, 1fr));
}
.chip-grid.large { grid-template-columns: repeat(auto-fill, minmax(180px, 1fr)); }
.chip-card {
  background: var(--surface); border: 1px solid var(--border);
  border-radius: var(--radius); padding: .7rem;
  display: flex; flex-direction: column; gap: .25rem; align-items: flex-start;
  color: var(--text);
}
.chip-card:hover { border-color: var(--border-strong); text-decoration: none; box-shadow: var(--shadow); }

.pagination { display: flex; gap: .3rem; justify-content: center; margin: 1.5rem 0; flex-wrap: wrap; }
.page-link {
  padding: .4rem .7rem; border-radius: var(--radius);
  border: 1px solid var(--border); background: var(--surface);
  color: var(--text-soft); font-size: .85rem;
}
.page-link:hover { background: var(--surface-alt); text-decoration: none; }
.page-link.active { background: var(--primary); border-color: var(--primary); color: var(--on-primary); font-weight: 600; }

.breadcrumbs { margin-bottom: .75rem; font-size: .8rem; }
.breadcrumbs ol { list-style: none; display: flex; gap: .3rem; flex-wrap: wrap; margin: 0; padding: 0; }
.breadcrumbs li:not(:last-child)::after { content: "›"; margin-left: .3rem; color: var(--text-muted); }
.breadcrumbs span { color: var(--text-muted); }

/* ==========================================================================
   Pagina da oferta
   ========================================================================== */

.offer-detail {
  display: grid; gap: 1.25rem;
  background: var(--surface); border: 1px solid var(--border);
  border-radius: var(--radius-lg); padding: 1.1rem; margin-bottom: 1.1rem;
}
.offer-detail-media img {
  width: 100%; aspect-ratio: 1; object-fit: contain;
  background: var(--surface-alt); border-radius: var(--radius);
}
.offer-detail-main h1 { font-size: 1.3rem; }
.offer-detail-top { display: flex; align-items: flex-start; gap: .6rem; flex-wrap: wrap; margin-bottom: .5rem; }
/* Data e visualizações na altura dos botões de voto (44px), e não no meio do
   bloco de avaliação, que tem a faixa "Ótima promoção" embaixo. */
.offer-detail-top > :not(.community-rating) { display: inline-flex; align-items: center; min-height: 44px; }
.offer-detail-store { display: flex; gap: .75rem; align-items: center; flex-wrap: wrap; margin-bottom: .9rem; }

.price-block { margin-bottom: .9rem; }
.price-context { display: flex; gap: .5rem; align-items: center; color: var(--text-muted); }
.lowest-price {
  margin-top: .4rem; font-size: .84rem; font-weight: 600; color: var(--success-ink);
  background: var(--success-soft); padding: .3rem .55rem; border-radius: 6px; display: inline-block;
}

.offer-conditions { list-style: none; padding: 0; margin: 0 0 1rem; display: flex; flex-direction: column; gap: .2rem; font-size: .88rem; }
.offer-conditions .cond-ok { color: var(--success); font-weight: 600; }

.coupon-block {
  display: flex; align-items: center; gap: .5rem; flex-wrap: wrap;
  background: var(--accent-soft); border: 1px dashed var(--accent);
  border-radius: var(--radius); padding: .6rem .75rem; margin-bottom: .9rem;
}
.coupon-label { font-size: .72rem; font-weight: 700; text-transform: uppercase; color: var(--accent-ink); }
.coupon-code {
  font-size: 1.05rem; font-weight: 800; letter-spacing: .06em;
  background: var(--surface); padding: .25rem .6rem; border-radius: 6px; border: 1px solid var(--accent);
}
.hidden-form { display: none; }

.outbound-note { margin-top: .5rem; }
.sponsored-note {
  --tom: #d97706;
  margin-top: .6rem; font-size: .78rem;
  padding: .5rem .6rem; border-radius: 6px;
}

.offer-description { margin: 1rem 0; }
.offer-description h2 { font-size: 1rem; }

.quick-actions { display: flex; gap: .35rem; flex-wrap: wrap; align-items: center; margin-top: 1rem; }
.quick-actions form { display: inline; }
.login-hint { margin-top: 1rem; }

/* Grafico de preco */
.price-chart {
  background: var(--surface); border: 1px solid var(--border);
  border-radius: var(--radius-lg); padding: 1rem; margin: 0 0 1.1rem;
}
.price-chart figcaption { font-weight: 700; margin-bottom: .6rem; display: flex; flex-direction: column; gap: .15rem; }
.price-chart svg { width: 100%; height: auto; }
.price-chart .grid { stroke: var(--border); stroke-width: 1; }
.price-chart .axis { fill: var(--text-muted); font-size: 11px; font-family: var(--font); }
.price-chart .line { fill: none; stroke: var(--primary); stroke-width: 2.2; stroke-linejoin: round; }
.price-chart .area { fill: var(--primary-fade); stroke: none; }
.price-chart .dot { fill: var(--primary); }
.price-chart .dot-current { fill: var(--accent); stroke: #fff; stroke-width: 2; }
.chart-note { margin: .5rem 0 0; }

/* Comentarios */
.comments { background: var(--surface); border: 1px solid var(--border); border-radius: var(--radius-lg); padding: 1.1rem; margin-bottom: 1.1rem; }
.comment-form { display: flex; flex-direction: column; gap: .5rem; margin-bottom: 1.2rem; }
.comment-form textarea { width: 100%; }
.comment-form-actions { display: flex; gap: .5rem; align-items: center; }
.comment-list { list-style: none; padding: 0; margin: 0; display: flex; flex-direction: column; gap: .9rem; }
.comment-actions { display: flex; flex-direction: column; gap: .65rem; margin-top: .75rem; }
.comment-actions > details { max-width: 560px; }
.comment-actions summary { color: var(--text-soft); font-size: .85rem; padding-block: .35rem; }
.comment-action-panel { display: grid; gap: 1rem; margin-top: .6rem; padding: 1rem; border: 1px solid var(--border); border-radius: var(--radius); background: var(--surface-alt); }
.comment-moderated .comment-body { color: var(--text-muted); font-style: italic; }
.comment { border-top: 1px solid var(--border); padding-top: .8rem; }
.comment:first-child { border-top: 0; padding-top: 0; }
.comment-head { display: flex; align-items: center; gap: .4rem; flex-wrap: wrap; font-size: .82rem; margin-bottom: .3rem; }
.comment-head time { color: var(--text-muted); margin-left: auto; }
.comment-body { margin: 0; font-size: .92rem; white-space: pre-wrap; }
.comment-tagged { background: var(--surface-alt); border-radius: var(--radius); padding: .7rem; border-top: 0; }

.report-block { background: var(--surface); border: 1px solid var(--border); border-radius: var(--radius-lg); padding: .8rem 1.1rem; margin-bottom: 1.1rem; }
.report-block summary { cursor: pointer; font-size: .88rem; color: var(--text-soft); }
.report-form { display: flex; gap: .6rem; flex-wrap: wrap; align-items: flex-end; margin-top: .7rem; }
.report-form label { display: flex; flex-direction: column; gap: .2rem; font-size: .8rem; }

/* ==========================================================================
   Formularios
   ========================================================================== */

label { font-size: .85rem; font-weight: 500; }
label > span { display: block; margin-bottom: .2rem; }

input:not([type]), input[type="text"], input[type="email"], input[type="password"], input[type="url"],
input[type="search"], input[type="number"], input[type="date"], select, textarea {
  width: 100%; padding: .5rem .65rem; font-size: .92rem; font-family: inherit;
  border: 1px solid var(--border-strong); border-radius: var(--radius);
  background: var(--surface); color: var(--text);
}
input:focus, select:focus, textarea:focus { border-color: var(--primary); outline: none; box-shadow: 0 0 0 3px var(--primary-fade); }
/* Caixa de seleção e botão de opção não têm borda que mude de cor: sem o
   contorno, o foco delas era só o anel de 12% acima -- invisível. */
input:is([type="checkbox"], [type="radio"]):focus-visible { outline: 2px solid var(--primary); outline-offset: 2px; }
textarea { resize: vertical; min-height: 70px; }
input[type="color"] { padding: .15rem; height: 38px; }

.checkbox { display: flex; align-items: flex-start; gap: .45rem; font-weight: 400; font-size: .85rem; }
.checkbox input { width: auto; margin-top: .2rem; }
.checkbox span { margin: 0; }

.form-row { display: flex; gap: .75rem; flex-wrap: wrap; margin-bottom: .75rem; }
.form-row > label { flex: 1 1 200px; }
.form-row.checks { gap: 1rem; }
.feed-news { position: fixed; bottom: 1.25rem; left: 50%; transform: translateX(-50%); z-index: 100; display: flex; align-items: center; justify-content: center; gap: .75rem; width: max-content; max-width: calc(100% - 2rem); padding: .75rem 1rem; border: 1px solid var(--border); border-radius: 1rem; background: var(--surface); color: var(--text); box-shadow: 0 8px 30px #0003; flex-wrap: wrap; text-align: center; }
.feed-news[hidden] { display: none; }
.form-actions { display: flex; gap: .5rem; flex-wrap: wrap; margin-top: .5rem; }

.offer-form { display: flex; flex-direction: column; gap: .3rem; }
.offer-form > label { margin-bottom: .75rem; }

.preco-manual-list { display: grid; gap: .65rem; }
.preco-manual-item {
  display: grid; grid-template-columns: minmax(0, 1fr) minmax(280px, 1.4fr);
  gap: .8rem; align-items: center; padding: .8rem;
  border: 1px solid var(--border); border-radius: var(--radius); background: var(--surface);
}
.preco-manual-resumo { display: flex; flex-direction: column; gap: .2rem; min-width: 0; }
.preco-manual-form { display: grid; grid-template-columns: minmax(110px, .7fr) minmax(150px, 1fr) auto; gap: .5rem; align-items: end; }
.preco-manual-form label { min-width: 0; font-size: .78rem; }
.preco-manual-form input { width: 100%; }
.preco-manual-acoes { display: flex; flex-direction: column; gap: .4rem; }
.preco-manual-fora-estoque { display: flex; justify-content: flex-end; }

@media (max-width: 760px) {
  .preco-manual-item { grid-template-columns: 1fr; }
  .preco-manual-form { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .preco-manual-form button { grid-column: 1 / -1; }
}

.auth-card, .submit-card {
  max-width: 440px; margin: 1.5rem auto;
  background: var(--surface); border: 1px solid var(--border);
  border-radius: var(--radius-lg); padding: 1.5rem;
}
.submit-card.wide { max-width: 760px; }
.auth-card form { display: flex; flex-direction: column; gap: .85rem; }
.auth-alt { margin: 1rem 0 0; font-size: .86rem; text-align: center; }

.submit-url-form { display: flex; flex-direction: column; gap: .75rem; margin-bottom: 1.5rem; }
.submit-tips { border-top: 1px solid var(--border); padding-top: 1rem; }
.submit-tips h2 { font-size: .92rem; }
.submit-tips ul { margin: 0; padding-left: 1.1rem; font-size: .85rem; color: var(--text-soft); }

.duplicate-warning {
  background: var(--warn-soft); border: 1px solid color-mix(in srgb, var(--warn) 40%, transparent);
  border-radius: var(--radius); padding: .8rem; margin-bottom: 1rem;
}
.duplicate-warning h2 { font-size: .95rem; margin-bottom: .3rem; }
.duplicate-warning ul { margin: .5rem 0 0; padding-left: 1.1rem; font-size: .85rem; }

.image-preview { margin: .5rem 0; }
.image-preview img { max-height: 180px; border-radius: var(--radius); border: 1px solid var(--border); }

/* ==========================================================================
   Mensagens e estados
   ========================================================================== */

.flash {
  padding: .65rem .85rem; border-radius: var(--radius);
  margin-bottom: 1rem; font-size: .88rem; border: 1px solid;
}
.flash-ok    { background: var(--success-soft); border-color: var(--success); color: var(--success-ink); }
.flash-aviso { background: var(--warn-soft);    border-color: color-mix(in srgb, var(--warn) 40%, transparent); color: var(--warn); }
.flash-erro  { background: var(--danger-soft);  border-color: color-mix(in srgb, var(--danger) 45%, transparent); color: var(--danger-ink); }
/* Link dentro de um aviso: a mesma cor do aviso, sublinhado. Com a cor de link
   normal, o azul sobre o fundo amarelo-escuro da paleta Escura ficava abaixo
   do contraste mínimo. */
:is(.flash, .duplicate-warning, .fila-sem-loja, .kpi-warn, .kpi-danger, .danger-zone > form) {
  --link-ink: currentColor;
}
:is(.flash, .duplicate-warning, .fila-sem-loja, .danger-zone > form) a:not(.btn) { text-decoration: underline; }
.flash.small { font-size: .8rem; padding: .4rem .6rem; }

.empty-state {
  background: var(--surface); border: 1px dashed var(--border-strong);
  border-radius: var(--radius-lg); padding: 2rem 1rem; text-align: center; color: var(--text-muted);
}
.empty-state.large { padding: 4rem 1rem; }
.empty-state.large h1 { font-size: 3rem; color: var(--border-strong); }

/* ==========================================================================
   Perfil, ranking, medalhas, alertas, notificacoes
   ========================================================================== */

.profile-head {
  display: flex; gap: 1rem; align-items: flex-start; flex-wrap: wrap;
  background: var(--surface); border: 1px solid var(--border);
  border-radius: var(--radius-lg); padding: 1.1rem; margin-bottom: 1.1rem;
}
.profile-head h1 { font-size: 1.25rem; }

.level-chip {
  display: inline-block; font-size: .72rem; font-weight: 700;
  text-transform: uppercase; letter-spacing: .03em;
  padding: .1rem .4rem; border-radius: 4px; vertical-align: middle;
}
/* As cores vêm dos selos coloridos (procure "--tom"). */
.level-novato       { --tom: #64748b; }
.level-contribuidor { --tom: #2563eb; }
.level-cacador      { --tom: #ea580c; }
.level-elite        { --tom: #7c3aed; }

.level-progress { display: flex; align-items: center; gap: .5rem; margin: .4rem 0; flex-wrap: wrap; }
.level-bar { width: 180px; height: 7px; background: var(--border); border-radius: 4px; overflow: hidden; }
.level-bar span { display: block; height: 100%; background: var(--accent); }

.ranking-list { list-style: none; padding: 0; margin: 0; display: flex; flex-direction: column; gap: .4rem; }
.ranking-list li {
  display: flex; align-items: center; gap: .6rem; flex-wrap: wrap;
  background: var(--surface); border: 1px solid var(--border);
  border-radius: var(--radius); padding: .6rem .8rem;
}
.rank-position { font-weight: 800; color: var(--text-muted); min-width: 24px; }

.badge-list { list-style: none; padding: 0; margin: 0; display: flex; gap: .5rem; flex-wrap: wrap; }
.badge-list li {
  background: var(--surface); border: 1px solid var(--border);
  border-radius: 999px; padding: .3rem .7rem; font-size: .82rem;
}
.badge-icon {
  display: inline-flex; align-items: center; justify-content: center;
  width: 20px; height: 20px; border-radius: 50%;
  background: var(--brand); color: var(--on-brand); font-size: .62rem; font-weight: 800;
}
.badge-icon.big { width: 42px; height: 42px; font-size: .9rem; }

.badge-grid { display: grid; gap: .7rem; grid-template-columns: repeat(auto-fill, minmax(160px, 1fr)); }
.badge-card {
  background: var(--surface); border: 1px solid var(--border); border-radius: var(--radius);
  padding: .9rem; text-align: center; display: flex; flex-direction: column; gap: .35rem; align-items: center;
}
.badge-card.locked { opacity: .45; }
.badge-card.earned { border-color: var(--accent); }

.alert-form { display: flex; flex-direction: column; gap: .3rem; }
.alert-list { list-style: none; padding: 0; margin: 0; display: flex; flex-direction: column; gap: .5rem; }
.alert-item {
  display: flex; justify-content: space-between; gap: 1rem; flex-wrap: wrap; align-items: center;
  background: var(--surface); border: 1px solid var(--border);
  border-radius: var(--radius); padding: .7rem .85rem;
}
.alert-item.paused { opacity: .6; }
.alert-item span { display: block; }
.alert-actions { display: flex; gap: .3rem; }

.notification-list { list-style: none; padding: 0; margin: 0; display: flex; flex-direction: column; gap: .4rem; }
.notification-list li {
  background: var(--surface); border: 1px solid var(--border); border-left-width: 3px;
  border-radius: var(--radius); padding: .65rem .8rem; display: flex; flex-direction: column; gap: .15rem;
}
.notification-list li.unread { border-left-color: var(--accent); background: var(--accent-soft); }
.notification-list time { font-size: .75rem; color: var(--text-muted); }

.coupon-list { list-style: none; padding: 0; margin: 0; display: flex; flex-direction: column; gap: .4rem; }
.coupon-list li { display: flex; gap: .6rem; align-items: center; flex-wrap: wrap; background: var(--surface); border: 1px solid var(--border); border-radius: var(--radius); padding: .5rem .7rem; }
.coupon-list code { background: var(--accent-soft); color: var(--accent-ink); padding: .15rem .45rem; border-radius: 5px; font-weight: 700; }

.store-head {
  display: flex; gap: 1rem; align-items: flex-start; flex-wrap: wrap;
  background: var(--surface); border: 1px solid var(--border);
  border-radius: var(--radius-lg); padding: 1.1rem; margin-bottom: 1.1rem;
}
.verified-note { max-width: 60ch; }

/* ==========================================================================
   Publicidade
   ========================================================================== */

.ad-slot {
  background: var(--surface-alt); border: 1px dashed var(--border-strong);
  border-radius: var(--radius); padding: .6rem; margin: 1rem 0; text-align: center;
}
.ad-label {
  display: block; font-size: .66rem; text-transform: uppercase;
  letter-spacing: .06em; color: var(--text-muted); margin-bottom: .3rem;
}
.ad-body { min-height: 80px; display: flex; align-items: center; justify-content: center; }

/* ==========================================================================
   Conteudo textual
   ========================================================================== */

.prose {
  background: var(--surface); border: 1px solid var(--border);
  border-radius: var(--radius-lg); padding: 1.5rem;
  max-width: 72ch; margin: 0 auto;
}
.prose h2 { margin-top: 1.6rem; font-size: 1.05rem; }
.prose ul { padding-left: 1.2rem; }
.prose li { margin-bottom: .35rem; }
.contact-email { font-size: 1.1rem; }

.data-table {
  width: 100%; border-collapse: collapse; font-size: .85rem;
  /* `display: block` faz a tabela virar uma caixa que rola sozinha. Sem isto,
     uma tabela de oito colunas arrasta a PAGINA inteira para o lado no
     celular -- e a pessoa perde o cabecalho do site de vista enquanto tenta
     ler uma linha. As colunas continuam alinhadas: as linhas seguem sendo
     table-row por dentro. */
  display: block; overflow-x: auto;
}
.data-table th, .data-table td {
  text-align: left; padding: .45rem .55rem; border-bottom: 1px solid var(--border);
  vertical-align: middle;
}
.data-table th { font-weight: 700; color: var(--text-soft); background: var(--surface-alt); }
.data-table tr.highlight { background: var(--accent-soft); }
.data-table td.row-actions { display: table-cell; vertical-align: middle; }
.row-actions { display: flex; gap: .5rem; flex-wrap: wrap; align-items: center; }
.row-actions form { margin: 0; display: inline-flex; }
.admin-body .data-table {
  border: 1px solid var(--border); border-radius: var(--radius-lg);
  background-color: var(--surface); box-shadow: var(--shadow);
}
.admin-body .data-table th, .admin-body .data-table td {
  padding: .7rem .75rem;
  border-bottom: 1px solid var(--border);
  vertical-align: middle;
}
.admin-body .data-table th {
  color: var(--text-muted); font-size: .71rem;
  text-transform: uppercase; letter-spacing: .055em;
}
.admin-body .data-table tbody tr:hover td { background: var(--surface-alt); }
.admin-body .data-table tbody tr:last-child td { border-bottom: 0; }
.admin-offers-table td:nth-child(2) { min-width: 215px; max-width: 330px; line-height: 1.4; font-weight: 650; }
.admin-offers-table td:nth-child(2) a { color: var(--text); }
.admin-offers-table td:nth-child(2) a:hover { color: var(--primary); }
.admin-offers-table td:last-child { min-width: 230px; }
.admin-coupons-table td:nth-child(2) code {
  display: inline-block; padding: .3rem .55rem;
  background: var(--primary-fade); color: var(--primary);
  border: 1px dashed var(--primary); border-radius: var(--radius-sm);
  font-size: .9rem; font-weight: 800; letter-spacing: .04em;
}

/* ==========================================================================
   Rodape
   ========================================================================== */

.site-footer { background: var(--brand); color: var(--header-muted); margin-top: auto; padding: 2.5rem 1rem 1.5rem; }
.footer-inner {
  max-width: var(--max); margin: 0 auto;
  display: grid; gap: 1.5rem; grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
}
.footer-col { display: flex; flex-direction: column; gap: .3rem; }
.footer-col strong { color: var(--on-brand); margin-bottom: .2rem; }
.footer-col a { color: var(--header-muted); font-size: .86rem; }
.footer-col a:hover { color: var(--on-brand); }
.footer-col p { font-size: .82rem; margin: 0; }
.footer-bottom {
  max-width: var(--max); margin: 1.5rem auto 0; padding-top: 1rem;
  border-top: 1px solid var(--header-line); font-size: .78rem; text-align: center;
}

/* ==========================================================================
   Painel administrativo
   ========================================================================== */

.admin-body { background: var(--bg); }
.admin { display: grid; gap: 1.2rem; grid-template-columns: minmax(0, 1fr); align-items: start; }

.admin-nav {
  display: flex; gap: .3rem; overflow-x: auto; scrollbar-width: thin;
  background: var(--surface); border: 1px solid var(--border);
  border-radius: var(--radius-lg); padding: .4rem;
  box-shadow: var(--shadow);
}
.admin-nav::-webkit-scrollbar { height: 5px; }
.admin-nav::-webkit-scrollbar-thumb { background: var(--border-strong); border-radius: 9px; }
.admin-nav a {
  display: inline-flex; align-items: center; justify-content: space-between; gap: .4rem;
  padding: .55rem .75rem; border-radius: 8px; font-size: .84rem;
  color: var(--text-soft); white-space: nowrap; font-weight: 550;
  transition: background-color .18s ease, color .18s ease;
}
.admin-nav a:hover { background: var(--surface-alt); text-decoration: none; }
.admin-nav a.active {
  /* Azul da paleta puxado para a cor do texto: na paleta Escura o azul puro
     sobre o próprio fundo azulado ficava abaixo de 4,5:1. */
  background: var(--primary-fade); color: color-mix(in srgb, var(--primary) 70%, var(--text)); font-weight: 750;
  box-shadow: inset 0 0 0 1px var(--primary);
}
.admin-nav a.active:hover { background: var(--primary-fade); }
.admin-nav .badge-count { margin-left: auto; }

.admin-content { min-width: 0; }
.admin-content > h1 { margin: .2rem 0 1rem; letter-spacing: -.035em; }
.admin-topline {
  display: flex; align-items: center; justify-content: space-between; gap: .5rem;
  margin-bottom: .4rem; color: var(--text-muted);
  font-size: .74rem; font-weight: 750; letter-spacing: .12em; text-transform: uppercase;
}
.admin-topline a { color: var(--primary); font-size: .76rem; letter-spacing: 0; text-transform: none; }
.admin-page-heading {
  display: flex; justify-content: space-between; align-items: flex-end;
  gap: .75rem 1.25rem; flex-wrap: wrap; margin: .15rem 0 1.15rem;
}
.admin-page-heading h1 { margin: 0 0 .25rem; letter-spacing: -.035em; }
.admin-page-heading h1 .status-pill { vertical-align: middle; margin-left: .35rem; }
.admin-page-heading p { margin: 0; font-size: .88rem; }
.admin-page-actions { display: flex; gap: .45rem; flex-wrap: wrap; }
.admin-back-link { display: inline-block; margin-bottom: .3rem; font-size: .82rem; font-weight: 650; }
.admin-body .filter-sorts { margin-bottom: 1rem; }
.admin-body .card {
  border-color: var(--border); box-shadow: var(--shadow);
  padding: clamp(1rem, 2vw, 1.4rem);
}
.admin-columns { display: grid; gap: 1rem; grid-template-columns: 1fr; }
.admin-filters {
  display: flex; gap: .65rem; flex-wrap: wrap; align-items: center;
  margin-bottom: 1rem; padding: .85rem;
  border: 1px solid var(--border); border-radius: var(--radius-lg);
  background: var(--surface); box-shadow: var(--shadow);
}
.admin-filters input, .admin-filters select { width: auto; flex: 1 1 170px; }

.kpi-grid { display: grid; gap: .8rem; grid-template-columns: repeat(auto-fit, minmax(140px, 1fr)); margin-bottom: 1.25rem; }
.kpi {
  background: var(--surface); border: 1px solid var(--border); border-radius: var(--radius);
  padding: 1rem; display: flex; flex-direction: column; gap: .28rem;
  box-shadow: var(--shadow); border-top: 3px solid var(--primary);
}
.kpi-value { font-size: 1.75rem; font-weight: 800; line-height: 1.1; letter-spacing: -.04em; }
.kpi-label { font-size: .78rem; color: var(--text-muted); }
.kpi-warn   { border-color: color-mix(in srgb, var(--warning-ink) 35%, transparent); border-top-color: var(--warning-ink); background: var(--warning-soft); color: var(--warning-ink); }
.kpi-danger { border-color: color-mix(in srgb, var(--danger) 40%, transparent); border-top-color: var(--danger); background: var(--danger-soft); color: var(--danger-ink); }
.kpi-warn .kpi-label { color: var(--warning-ink); }
.kpi-danger .kpi-label { color: var(--danger-ink); }

.bar-chart { width: 100%; height: auto; }
.bar-chart .bar { fill: var(--primary); }
.bar-chart .grid { stroke: var(--border); }
.bar-chart .axis { fill: var(--text-muted); font-size: 10px; font-family: var(--font); }

.moderation-list { display: flex; flex-direction: column; gap: .8rem; }
.moderation-item {
  display: grid; gap: .8rem; grid-template-columns: 1fr;
  background: var(--surface); border: 1px solid var(--border);
  border-radius: var(--radius-lg); padding: 1rem; box-shadow: var(--shadow);
}
.mod-media img { width: 100%; max-width: 130px; aspect-ratio: 1; object-fit: contain; background: var(--surface-alt); border-radius: var(--radius); }
.mod-media .image-fallback { max-width: 130px; aspect-ratio: 1; border-radius: var(--radius); }
.mod-heading { display: flex; align-items: flex-start; justify-content: space-between; flex-wrap: wrap; gap: .3rem .7rem; }
.mod-body h3 { font-size: 1rem; margin-bottom: .25rem; }
.mod-body p { margin-bottom: .35rem; }
.mod-actions { display: flex; gap: .45rem; flex-wrap: wrap; align-items: flex-start; align-content: flex-start; }
.mod-actions form { margin: 0; }
.mod-actions details { position: relative; }
.mod-actions summary { list-style: none; }
.mod-actions summary::-webkit-details-marker { display: none; }
.reject-form {
  display: flex; gap: .3rem; flex-direction: column; margin-top: .4rem;
  background: var(--surface-alt); padding: .5rem; border-radius: var(--radius);
  border: 1px solid var(--border); min-width: 220px;
}

.weight-group { border: 1px solid var(--border); border-radius: var(--radius); padding: .8rem; margin-bottom: .8rem; }
.weight-group legend { font-weight: 700; font-size: .85rem; padding: 0 .4rem; }
.weight-grid { display: grid; gap: .6rem; grid-template-columns: repeat(auto-fill, minmax(170px, 1fr)); }
.weight-grid label { font-size: .76rem; }
.weight-grid small { display: block; margin-top: .1rem; }

/* ==========================================================================
   Painel de Aparencia (tema configuravel)
   ========================================================================== */

.preset-grid {
  display: grid; gap: .7rem;
  grid-template-columns: repeat(auto-fill, minmax(190px, 1fr));
  margin-bottom: 1rem;
}
.preset-card {
  border: 2px solid var(--border); border-radius: var(--radius);
  background: var(--surface); padding: .7rem; text-align: left;
  font: inherit; cursor: pointer; display: flex; flex-direction: column; gap: .4rem;
}
.preset-card:hover { border-color: var(--border-strong); }
.preset-card.active { border-color: var(--primary); }
.preset-card strong { font-size: .9rem; }
.preset-card span { font-size: .76rem; color: var(--text-muted); line-height: 1.4; }
.preset-swatches { display: flex; gap: 4px; }
.preset-swatches i {
  width: 22px; height: 22px; border-radius: 5px;
  border: 1px solid rgba(0, 0, 0, .12);
}

.color-grid {
  display: grid; gap: .8rem;
  grid-template-columns: repeat(auto-fill, minmax(230px, 1fr));
}
.color-field {
  border: 1px solid var(--border); border-radius: var(--radius);
  padding: .6rem .7rem; background: var(--surface);
  display: flex; flex-direction: column; gap: .3rem;
}
.color-field > span:first-child { font-weight: 600; font-size: .86rem; margin: 0; }
.color-field small { color: var(--text-muted); font-size: .78rem; line-height: 1.4; }
.color-inputs { display: flex; gap: .4rem; align-items: center; }
.color-inputs input[type="color"] {
  width: 46px; height: 36px; padding: 2px; flex: none; cursor: pointer;
  border: 1px solid var(--border-strong); border-radius: 8px; background: none;
}
.color-inputs input[type="text"] {
  flex: 1; min-width: 0; font-family: ui-monospace, Menlo, Consolas, monospace;
  font-size: .84rem; text-transform: lowercase;
}

/* Previa: um mini site isolado, com as variaveis aplicadas so aqui dentro */
.theme-preview {
  border: 1px solid var(--border); border-radius: var(--radius-lg);
  overflow: hidden; background: var(--pv-bg); color: var(--pv-text);
  font-size: 13px; line-height: 1.5;
}
.pv-header {
  background: var(--pv-brand); color: var(--pv-on-brand);
  padding: .55rem .8rem; display: flex; align-items: center; gap: .5rem;
}
.pv-mark { width: 16px; height: 16px; border-radius: 5px; background: var(--pv-accent); flex: none; }
.pv-name { font-weight: 800; }
.pv-search {
  flex: 1; background: var(--pv-header-input-bg); border-radius: 6px;
  padding: .25rem .5rem; font-size: 11px; color: var(--pv-header-muted);
  min-width: 60px; overflow: hidden; white-space: nowrap;
}
.pv-btn-accent {
  background: var(--pv-accent); color: var(--pv-on-accent);
  padding: .25rem .55rem; border-radius: 6px; font-size: 11px; font-weight: 600;
}
.pv-nav {
  background: var(--pv-header-nav-bg); color: var(--pv-header-muted);
  padding: .35rem .8rem; display: flex; gap: .8rem; font-size: 11px;
}
.pv-nav b { color: var(--pv-on-brand); font-weight: 600; }
.pv-body { padding: .8rem; display: grid; gap: .7rem; grid-template-columns: 1fr 1fr; }
.pv-card {
  background: var(--pv-surface); border: 1px solid var(--pv-border);
  border-radius: 10px; padding: .6rem; display: flex; flex-direction: column; gap: .4rem;
}
.pv-thumb {
  background: var(--pv-surface-alt); border-radius: 6px; height: 54px;
  display: flex; align-items: center; justify-content: center;
  color: var(--pv-text-muted); font-weight: 800; font-size: 14px; position: relative;
}
.pv-off {
  position: absolute; right: 5px; bottom: 5px;
  background: var(--pv-success); color: var(--pv-on-success);
  font-size: 10px; font-weight: 700; padding: 1px 5px; border-radius: 4px;
}
.pv-title { font-weight: 600; font-size: 12px; }
.pv-price { color: var(--pv-success); font-weight: 800; font-size: 15px; }
.pv-price s { color: var(--pv-text-muted); font-weight: 400; font-size: 11px; margin-left: 4px; }
.pv-tags { display: flex; gap: 4px; flex-wrap: wrap; }
.pv-tag {
  font-size: 10px; padding: 1px 5px; border-radius: 4px;
  background: var(--pv-accent-soft); color: var(--pv-accent-ink);
  border: 1px solid var(--pv-accent);
}
.pv-tag.ship {
  background: var(--pv-success-soft); color: var(--pv-success-ink);
  border-color: var(--pv-success);
}
.pv-cta {
  background: var(--pv-primary); color: var(--pv-on-primary);
  text-align: center; padding: .35rem; border-radius: 6px;
  font-size: 11px; font-weight: 600;
}
.pv-muted { color: var(--pv-text-muted); font-size: 11px; }
.pv-footer {
  background: var(--pv-brand); color: var(--pv-header-muted);
  padding: .5rem .8rem; font-size: 11px;
}

.contrast-warnings { margin: 0; padding-left: 1.1rem; font-size: .84rem; }
.contrast-warnings li { margin-bottom: .2rem; }

/* ==========================================================================
   Comparador de precos
   ========================================================================== */

.compare-table td { vertical-align: middle; }
.compare-table input[type="radio"] { width: auto; }
.compare-table .linha-cheapest { background: var(--success-soft); }
.compare-table .row-erro { background: var(--danger-soft); }
.compare-table .price-now { font-size: 1rem; }

/* Bloco publico "Comparar lojas" na pagina da oferta */
.store-compare .compare-list { list-style: none; padding: 0; margin: 0; display: flex; flex-direction: column; gap: .4rem; }
.store-compare .compare-list li {
  display: flex; align-items: center; gap: .7rem; flex-wrap: wrap;
  padding: .55rem .7rem; border: 1px solid var(--border); border-radius: var(--radius);
  background: var(--surface-alt);
}
.store-compare .compare-list li.melhor { border-color: var(--success); background: var(--success-soft); }
.compare-store { display: flex; align-items: center; gap: .4rem; flex: 1 1 180px; font-weight: 600; font-size: .9rem; }
.compare-price { display: flex; align-items: center; gap: .4rem; }
.compare-price strong { font-size: 1.05rem; color: var(--success); }

/* ==========================================================================
   Fontes de feed e fila de revisao
   ========================================================================== */

.regra-feed p { margin: .4rem 0 0; }
.regra-feed p:first-of-type { margin-top: .3rem; }

.linha-pausada { opacity: .6; }
.erro-texto { color: var(--danger); }
.linklike.danger { color: var(--danger); }

.fila-lista { display: flex; flex-direction: column; gap: .9rem; }

.fila-item {
  background: var(--surface); border: 1px solid var(--border);
  border-radius: var(--radius-lg); padding: .9rem;
}
.fila-item.sem-loja { border-left: 3px solid var(--warn); }

.fila-topo { display: flex; align-items: center; gap: .6rem; flex-wrap: wrap; margin-bottom: .5rem; }

.fila-titulo-feed {
  margin: 0 0 .6rem; font-size: .92rem;
  padding: .45rem .6rem; background: var(--surface-alt);
  border-radius: var(--radius); border: 1px dashed var(--border-strong);
}
.fila-titulo-feed a { margin-left: .4rem; }

.fila-sem-loja {
  background: var(--warn-soft); border: 1px solid color-mix(in srgb, var(--warn) 40%, transparent);
  border-radius: var(--radius); padding: .6rem; margin-bottom: .6rem;
}
.fila-sem-loja p { margin: 0 0 .4rem; }
/* Texto de apoio no aviso amarelo: a cor do aviso, e não o cinza de .muted,
   que ficava abaixo do contraste mínimo sobre esse fundo. */
.fila-sem-loja .muted { color: var(--warn); }
.fila-url-form { display: flex; gap: .4rem; flex-wrap: wrap; }
.fila-url-form input { flex: 1 1 280px; }

.fila-corpo { display: grid; gap: .8rem; grid-template-columns: 1fr; }
.fila-imagem {
  background: var(--surface-alt); border-radius: var(--radius);
  aspect-ratio: 1; max-width: 150px; overflow: hidden;
  display: flex; align-items: center; justify-content: center;
}
.fila-imagem img { width: 100%; height: 100%; object-fit: contain; padding: .4rem; }
.fila-campos { min-width: 0; display: flex; flex-direction: column; gap: .2rem; }
.fila-acoes { display: flex; gap: .5rem; margin-top: .3rem; }

.fila-descartar {
  display: flex; gap: .4rem; align-items: center; flex-wrap: wrap;
  margin-top: .6rem; padding-top: .6rem; border-top: 1px solid var(--border);
}
.fila-descartar input { flex: 1 1 200px; }

@media (min-width: 720px) {
  .fila-corpo { grid-template-columns: 150px minmax(0, 1fr); }
}

/* ==========================================================================
   Responsivo
   ========================================================================== */

@media (min-width: 640px) {
  body { font-size: 15.5px; }
  h1 { font-size: 1.8rem; }
  .hero { padding: 2.5rem 2rem; }
  .hero h1 { font-size: 2rem; }
  .header-search { order: 0; }
  .offer-detail { grid-template-columns: minmax(0, 300px) minmax(0, 1fr); }
  .moderation-item { grid-template-columns: 130px minmax(0, 1fr) auto; }
  .admin-columns { grid-template-columns: 1fr 1fr; }
  .filter-bar { flex-direction: row; align-items: center; flex-wrap: wrap; }
  .filter-advanced { margin-left: auto; }
}

@media (min-width: 900px) {
  .main { padding: 1.5rem 1rem; }
  .offer-detail { grid-template-columns: minmax(0, 360px) minmax(0, 1fr); padding: 1.5rem; }
  .admin { grid-template-columns: 220px minmax(0, 1fr); gap: 1.4rem; }
  .admin-nav {
    flex-direction: column; align-self: start; position: sticky; top: 90px;
    max-height: calc(100vh - 110px); overflow-x: hidden; overflow-y: auto;
    padding: .65rem; gap: .1rem;
  }
  .admin-nav a { width: 100%; white-space: normal; }
}

@media (max-width: 719.98px) {
  .admin-coupons-table { border: 0 !important; background: transparent !important; box-shadow: none !important; overflow: visible; }
  .admin-coupons-table thead { display: none; }
  .admin-coupons-table tbody { display: grid; gap: .8rem; }
  .admin-coupons-table tbody tr {
    display: grid; grid-template-columns: repeat(2, minmax(0, 1fr));
    gap: .6rem 1rem; padding: 1rem;
    background: var(--surface); border: 1px solid var(--border);
    border-radius: var(--radius-lg); box-shadow: var(--shadow);
  }
  .admin-coupons-table td { display: block; min-width: 0; padding: 0 !important; border: 0 !important; }
  .admin-coupons-table td::before {
    content: attr(data-label); display: block; margin-bottom: .12rem;
    color: var(--text-muted); font-size: .68rem; font-weight: 750;
    letter-spacing: .07em; text-transform: uppercase;
  }
  .admin-coupons-table td:nth-child(2) { grid-column: 1 / -1; grid-row: 1; font-weight: 750; }
  .admin-coupons-table td:nth-child(2) code { overflow-wrap: anywhere; }
  .admin-coupons-table td:nth-child(3), .admin-coupons-table td:last-child { grid-column: 1 / -1; }
  .admin-coupons-table td:last-child {
    display: flex; gap: .45rem; flex-wrap: wrap;
    padding-top: .7rem !important; border-top: 1px solid var(--border) !important;
  }
  .admin-coupons-table .row-actions::before { display: none; }
  .admin-body .admin-coupons-table tbody tr:hover td,
  .admin-body .admin-offers-table tbody tr:hover td { background: transparent; }
  .admin-offers-table { border: 0 !important; background: transparent !important; box-shadow: none !important; overflow: visible; }
  .admin-offers-table thead { display: none; }
  .admin-offers-table tbody { display: grid; gap: .8rem; }
  .admin-offers-table tbody tr {
    display: grid; grid-template-columns: repeat(2, minmax(0, 1fr));
    gap: .65rem 1rem; padding: 1rem;
    background: var(--surface); border: 1px solid var(--border);
    border-radius: var(--radius-lg); box-shadow: var(--shadow);
  }
  .admin-offers-table td {
    display: block; min-width: 0 !important; max-width: none !important;
    padding: 0 !important; border: 0 !important;
  }
  .admin-offers-table td::before {
    content: attr(data-label); display: block; margin-bottom: .12rem;
    color: var(--text-muted); font-size: .68rem; font-weight: 750;
    letter-spacing: .07em; text-transform: uppercase;
  }
.admin-offers-table td:first-child { display: block; grid-column: 1 / -1; }
  .admin-offers-table td:nth-child(2) { grid-column: 1 / -1; font-size: 1.02rem; }
  .admin-offers-table td:nth-child(2)::before, .admin-offers-table .row-actions::before { display: none; }
  .admin-offers-table td:last-child {
    grid-column: 1 / -1; display: flex; gap: .45rem;
    padding-top: .7rem !important; border-top: 1px solid var(--border) !important;
  }
}

@media print {
  .site-header, .site-footer, .filter-bar, .quick-actions, .comment-form { display: none; }
  body { background: #fff; }
}

@media (prefers-reduced-motion: reduce) {
  * { animation-duration: .01ms !important; transition-duration: .01ms !important; scroll-behavior: auto !important; }
}

/* --- Robo de precos ------------------------------------------------------ */
.inline-form {
  display: flex;
  flex-wrap: wrap;
  align-items: flex-end;
  gap: 12px;
}
.inline-form label {
  display: flex;
  flex-direction: column;
  gap: 4px;
  max-width: 260px;
}
.lista-simples {
  list-style: none;
  margin: 0;
  padding: 0;
  display: grid;
  gap: 6px;
}
.lista-simples li {
  padding: 6px 0;
  border-bottom: 1px solid var(--border);
}
.lista-simples li:last-child { border-bottom: 0; }
.preco-verificado {
  margin: 6px 0 0;
  font-size: .82rem;
  color: var(--text-muted);
}

/* --- Banner de consentimento --------------------------------------------- */
.consentimento {
  position: fixed;
  left: 50%;
  bottom: 16px;
  transform: translateX(-50%);
  width: min(720px, calc(100% - 24px));
  display: flex;
  align-items: center;
  gap: 18px;
  padding: 14px 18px;
  background: var(--surface);
  border: 1px solid var(--border-strong);
  border-radius: var(--radius-lg);
  box-shadow: 0 12px 32px rgba(0, 0, 0, .18);
  z-index: 60;
}
.consentimento-texto { flex: 1; min-width: 0; }
.consentimento-texto strong { display: block; font-size: .95rem; }
.consentimento-texto p { margin: 4px 0 0; font-size: .84rem; color: var(--text-muted); }
.consentimento-acoes { display: flex; gap: 8px; flex-shrink: 0; }

@media (max-width: 620px) {
  .consentimento { flex-direction: column; align-items: stretch; gap: 12px; }
  .consentimento-acoes { justify-content: stretch; }
  .consentimento-acoes .btn { flex: 1; }
}

/* --- Entrar com o Google -------------------------------------------------- */
.auth-ou {
  display: flex;
  align-items: center;
  gap: 10px;
  margin: 18px 0 14px;
  color: var(--text-muted);
  font-size: .8rem;
}
.auth-ou::before,
.auth-ou::after {
  content: "";
  flex: 1;
  height: 1px;
  background: var(--border);
}
.btn-google {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 10px;
  background: var(--surface);
  color: var(--text);
  border: 1px solid var(--border-strong);
  font-weight: 600;
}
.btn-google:hover { background: var(--surface-alt); }

/* Selos de estado curtos (e-mail confirmado ou nao) --------------------- */
.selo-ok, .selo-pendente {
  display: inline-block;
  margin-left: .4rem;
  padding: .1rem .5rem;
  border-radius: 999px;
  font-size: .72rem;
  font-weight: 600;
  vertical-align: middle;
}
.selo-ok      { background: var(--success-soft); color: var(--success-ink); }
.selo-pendente{ background: var(--warning-soft); color: var(--warning-ink); }

/* Icone da loja no painel ------------------------------------------------- */
.icone-loja {
  display: flex; align-items: flex-start; gap: .8rem; margin: .2rem 0 .6rem;
  /* O <input type="file"> tem uma largura mínima própria (o botão "Escolher
     arquivo" do sistema) e não encolhe abaixo dela. Numa tela de 320px ele
     empurrava a página inteira para o lado. */
  flex-wrap: wrap;
}
.icone-loja-previa {
  display: inline-flex; align-items: center; justify-content: center;
  width: 46px; height: 46px; flex: none;
  border: 1px solid var(--border); border-radius: 10px; background: var(--surface-alt);
}
.icone-loja-previa img { border-radius: 8px; object-fit: contain; }
.icone-tabela { vertical-align: middle; margin-right: .35rem; border-radius: 4px; object-fit: contain; }
/* O icone baixado da loja tem proporcao qualquer: `contain` evita que um
   favicon retangular apareca esticado dentro do quadrado do selo. */
img.store-logo { object-fit: contain; background: transparent; }

.icone-loja-acoes { display: flex; flex-direction: column; gap: .55rem; flex: 1 1 210px; min-width: 0; }
.icone-loja-acoes small { display: block; margin-top: .2rem; }
.icone-envio { display: block; margin-bottom: .35rem; }
.icone-envio input[type="file"] { display: block; margin-top: .2rem; font-size: .85rem; max-width: 100%; }

/* ==========================================================================
   Transição entre páginas (View Transitions)
   ========================================================================== */
/*
   Uma linha faz o navegador animar a troca de página inteira, sem o site virar
   SPA (Single Page Application -- aquela arquitetura em que o JavaScript passa
   a controlar a navegação). O HTML continua vindo pronto do servidor; o
   navegador é que tira uma foto do antes e do depois e interpola.

   Chrome e Safari fazem. O Firefox ainda não, e simplesmente navega como
   sempre: não há nada para detectar nem versão alternativa para manter.
*/
@view-transition { navigation: auto; }

@media (prefers-reduced-motion: no-preference) {
  ::view-transition-old(root) {
    animation: sai-desbotando .18s cubic-bezier(.4, 0, 1, 1) both;
  }
  ::view-transition-new(root) {
    animation: entra-subindo .26s cubic-bezier(0, 0, .2, 1) both;
  }

  /* A imagem do card e a imagem grande da promoção compartilham o nome
     `oferta-capa` (posto pelo app.js no card em que se clicou). Com o mesmo
     nome dos dois lados, o navegador entende que é o MESMO objeto e faz ela
     crescer até o lugar novo -- em vez de uma sumir e outra aparecer. */
  ::view-transition-group(oferta-capa) {
    animation-duration: .3s;
    animation-timing-function: cubic-bezier(.2, 0, 0, 1);
  }
  ::view-transition-old(oferta-capa),
  ::view-transition-new(oferta-capa) {
    /* Sem isto as duas imagens ficam sobrepostas e meio transparentes durante
       o caminho, o que dá aparência de defeito. */
    mix-blend-mode: normal;
    height: 100%;
    object-fit: cover;
  }
}

/* Quem pediu menos movimento no sistema recebe a troca instantânea. Não é
   preferência estética: para parte das pessoas, movimento na tela causa
   enjoo de verdade. */
@media (prefers-reduced-motion: reduce) {
  ::view-transition-group(*),
  ::view-transition-old(*),
  ::view-transition-new(*) { animation: none !important; }
}

@keyframes sai-desbotando {
  to { opacity: 0; }
}
@keyframes entra-subindo {
  from { opacity: 0; transform: translateY(8px); }
  to   { opacity: 1; transform: none; }
}

/* ==========================================================================
   Sugestões da busca
   ========================================================================== */

.header-search { position: relative; }

.sugestoes {
  position: absolute; z-index: 60; top: calc(100% + .35rem); left: 0; right: 0;
  background: var(--surface); color: var(--text);
  border: 1px solid var(--border); border-radius: var(--radius);
  box-shadow: 0 12px 32px rgba(15, 23, 42, .18);
  overflow: hidden;
}

.sugestao {
  display: flex; align-items: baseline; justify-content: space-between; gap: .75rem;
  padding: .6rem .85rem;
  color: var(--text); text-decoration: none;
  border-bottom: 1px solid var(--border);
}
.sugestao:last-child { border-bottom: none; }
.sugestao:hover,
.sugestao:focus { background: var(--surface-alt); text-decoration: none; outline: none; }
.sugestao:focus-visible { box-shadow: inset 0 0 0 2px var(--primary); }

.sugestao-titulo {
  flex: 1 1 auto;
  /* Título de promoção é longo por natureza; sem o corte, a caixa vira um
     parágrafo e some a sensação de lista. */
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.sugestao-lado { flex: 0 0 auto; font-size: .82rem; color: var(--text-muted); }
.sugestao-todos { font-weight: 600; color: var(--primary); background: var(--surface-alt); }

/* ==========================================================================
   Avisos no celular
   ========================================================================== */

.cartao-push {
  display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between;
  gap: 1rem; margin-bottom: 1.25rem;
}
.cartao-push-texto { flex: 1 1 22rem; }
.cartao-push-texto p { margin: .35rem 0 0; }
.cartao-push-acoes { display: flex; flex-wrap: wrap; gap: .5rem; }
.texto-erro { color: var(--accent-ink); }

/* ==========================================================================
   Compartilhar
   ========================================================================== */

.stat-compartilhar {
  display: inline-flex;
  align-items: center;
  gap: .35rem;
  font-weight: 600;
}
.stat-compartilhar svg {
  flex-shrink: 0;
}

.acoes-secundarias {
  display: flex;
  align-items: center;
  gap: .75rem;
  margin: 1rem 0 0;
}
.acoes-secundarias .stat-compartilhar {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: .5rem;
  padding: .65rem 1.25rem;
  background: var(--surface-alt);
  border: 1px solid var(--border);
  border-radius: var(--radius);
  color: var(--text);
  font-size: .92rem;
  font-weight: 600;
  text-decoration: none;
  box-shadow: 0 1px 2px rgba(0, 0, 0, .05);
  transition: all .15s ease;
  cursor: pointer;
}
.acoes-secundarias .stat-compartilhar:hover {
  background: var(--surface-alt);
  border-color: var(--primary);
  color: var(--primary);
  text-decoration: none;
  transform: translateY(-1px);
}
.acoes-secundarias .stat-compartilhar:active {
  transform: translateY(0);
}
.acoes-secundarias .stat-compartilhar svg {
  color: var(--primary);
  width: 18px;
  height: 18px;
}

.offer-stats .stat-compartilhar svg {
  width: 14px;
  height: 14px;
}

/* ==========================================================================
   [hidden] tem que esconder
   ========================================================================== */
/*
   O navegador traz `[hidden] { display: none }` na folha padrão dele — e
   QUALQUER regra nossa com `display` ganha dessa, porque a folha do site tem
   precedência sobre a do navegador. Um `.btn { display: inline-flex }` faz o
   atributo `hidden` virar enfeite.

   Isso apareceu de verdade aqui: os botões "Desligar" e "Mandar um teste"
   nasciam com `hidden` e apareciam na tela mesmo assim, para quem nem tinha
   ligado os avisos ainda.
*/
[hidden] { display: none !important; }

/* ==========================================================================
   Caber em qualquer tela
   ==========================================================================
   Tudo aqui saiu de uma auditoria feita com um navegador de verdade, passando
   por todas as páginas em 320, 360, 390, 414, 768, 1024, 1280 e 1920 px. Cada
   bloco corresponde a um defeito medido, não a uma precaução genérica.
   ========================================================================== */

/* --- 1. O zoom do iPhone ao tocar num campo ------------------------------
   O Safari do iPhone dá zoom na página inteira quando a pessoa toca num campo
   cuja fonte é menor que 16px. Os nossos estavam em 14,7px: entrar, buscar e
   enviar promoção davam zoom, e sair dele é manual. É o defeito mais visível
   do site num celular — e a correção é literalmente um número.

   16px só onde o dedo é o apontador. No desktop a fonte menor continua, que é
   onde ela foi desenhada para caber. */
@media (pointer: coarse) {
  input[type="text"], input[type="email"], input[type="password"],
  input[type="url"], input[type="search"], input[type="number"],
  input[type="date"], input[type="tel"], select, textarea,
  .header-search input {
    font-size: 16px;
  }
}

/* --- 2. Alvos que o dedo acerta ------------------------------------------
   A ponta do dedo cobre uns 9mm — perto de 44px numa tela de celular. Botões
   de 29px e campos de 35px obrigam a mirar, e errar um "Pegar promoção" é
   perder a venda.

   Fica de fora o que está dentro de tabela do painel: ali são muitos botões
   por linha, e 44px em cada um faria a linha virar um parágrafo. Essas
   tabelas rolam por dentro e são usadas de perto, no computador. */
@media (pointer: coarse) {
  .btn,
  .header-acao,
  .header-search input,
  .header-search button,
  .chip,
  .menu summary,
  input[type="text"], input[type="email"], input[type="password"],
  input[type="url"], input[type="search"], input[type="number"],
  input[type="date"], select {
    min-height: 44px;
  }
  .btn, .header-acao, .chip {
    display: inline-flex; align-items: center; justify-content: center;
  }
  .menu summary { display: flex; align-items: center; }

  /* A exceção explicada acima. Vale para tudo que é clicável dentro da
     tabela, não só para `.btn`: o "Sair"/"Bloquear" é um `.linklike`, e sem
     ele nesta lista a linha do painel ia de 83px para 107px. */
  .data-table .btn,
  .data-table .chip,
  .data-table .linklike,
  .data-table summary,
  .data-table input,
  .data-table select { min-height: 0; }
}

/* --- 3. Palavra comprida não arrasta a página ----------------------------
   Um e-mail ou um endereço de site é uma palavra só para o navegador: ele não
   quebra, e empurra a largura da página para fora da tela. Aconteceu em
   /contato, onde o endereço de e-mail sozinho fazia a página rolar a 320px. */
.prose, .contact-email, .data-table td, .offer-description,
.comment-body, .flash, .empty-state p {
  overflow-wrap: break-word;
}
/* `anywhere` quebra no meio da palavra quando não há outro jeito. Reservado
   para o que é endereço, onde quebrar no meio é melhor que estourar a tela. */
.contact-email, .data-table td a, code {
  overflow-wrap: anywhere;
}

/* --- 4. Imagem nunca maior que o espaço dela ----------------------------- */
img, svg, video, iframe { max-width: 100%; }

/* --- 5. `<small>` encolhendo em cima de texto já pequeno -----------------
   O padrão do navegador para <small> é 0.8em, e `em` multiplica: dentro de um
   `.small` (13px) ele virava 10,5px. Um tamanho fixo corta a multiplicação. */
small { font-size: .8125rem; }

/* --- 6. Linhas de ação que não cabem lado a lado ------------------------- */
.icone-loja-acoes, .acoes-secundarias, .cartao-push-acoes,
.filter-sorts, .offer-tags { flex-wrap: wrap; min-width: 0; }

/* --- 7. Texto que vem de fora ------------------------------------------
   Título de promoção e nome de loja são escritos por gente, e vêm de feeds de
   loja. Um código de produto de 60 caracteres sem espaço é uma palavra só
   para o navegador.

   Aqui a quebra é forçada -- e de propósito NÃO existe um `overflow-x: hidden`
   no <html> para varrer o resto para debaixo do tapete. Esconder a rolagem
   faria o próximo defeito desaparecer da tela e da auditoria ao mesmo tempo:
   o site pareceria certo e estaria errado. Melhor que estoure e apareça. */
.offer-title, .offer-detail-main h1, .store-chip, .sugestao-titulo,
.mod-body h3, .page-head h1 {
  overflow-wrap: break-word;
}

/* --- 8. Mais alvos que o dedo precisa acertar ----------------------------
   Segunda passada da auditoria, já com o navegador se comportando como um
   celular. Estes ficaram de fora da primeira porque não são `.btn`: são links
   e resumos de `<details>`, que por padrão têm a altura do texto — 19 a 21px.

   Aqui o texto NÃO cresce. O que cresce é a área que responde ao toque, com
   espaço em volta. Aumentar a fonte junto mudaria o desenho do card, que já
   está do tamanho certo para ler. */
@media (pointer: coarse) {
  summary,
  .menu-panel a,
  .menu-panel .linklike,
  .linklike,
  a.brand { min-height: 44px; display: flex; align-items: center; }

  .menu-panel a, .menu-panel .linklike { justify-content: flex-start; }

  /* Dentro do card: "Compartilhar", "N coment." e o nome da loja. Ganham
     respiro vertical sem empurrar o card, porque a linha deles já tinha
     espaço sobrando. */
  .offer-stats .stat,
  .offer-stats .stat-compartilhar,
  .store-chip {
    padding-block: .5rem;
    display: inline-flex; align-items: center;
  }
  .offer-stats { gap: .2rem .8rem; }

  /* "Ver todas" e os botões de votar: são ações de verdade,
     não texto de apoio. O termômetro é a mecânica central do site — errar o
     "+" com o dedo é errar o voto. */
  .section-link { padding-block: .6rem; display: inline-flex; align-items: center; }

  /* Caixa de marcar: 13px é menor que a ponta de um lápis. */
  input[type="checkbox"], input[type="radio"] { width: 22px; height: 22px; }
  .checkbox input { margin-top: 0; }
  .checkbox { align-items: center; }
}

/* --- 9. Dizer que a tabela rola -----------------------------------------
   A tabela passou a rolar por dentro, mas nada na tela avisa isso: o conteúdo
   simplesmente termina na borda, e parece que acabou.

   O truque abaixo resolve sem uma linha de JavaScript. São quatro fundos: dois
   `local` (rolam junto com o conteúdo) pintando a cor da superfície nas
   pontas, e dois `scroll` (ficam parados) com uma sombra. Quando a tabela está
   no começo, o fundo local cobre a sombra da esquerda; quando há conteúdo
   escondido à direita, a sombra de lá aparece. A dica surge e some sozinha,
   porque ela é a própria posição da rolagem desenhada. */
.data-table {
  background:
    linear-gradient(to right, var(--surface), transparent) left / 22px 100% no-repeat local,
    linear-gradient(to left, var(--surface), transparent) right / 22px 100% no-repeat local,
    radial-gradient(farthest-side at 0 50%, rgba(15, 23, 42, .16), transparent) left / 11px 100% no-repeat,
    radial-gradient(farthest-side at 100% 50%, rgba(15, 23, 42, .16), transparent) right / 11px 100% no-repeat;
}

/* A correção de busca é DECLARADA, nunca silenciosa: quem busca "gelaeira" e
   recebe geladeiras sem ser avisado começa a desconfiar do site na primeira vez
   que a correção erra o alvo. Por isso ela tem superfície própria, e não é uma
   linha cinza que passa batido. */
.busca-corrigida {
  background: var(--surface-alt);
  border-left: 3px solid var(--accent);
  border-radius: var(--radius);
  padding: .6rem .8rem;
  margin: .6rem 0 0;
  font-size: .92rem;
}

/* ---------------------------------------------------------------------------
   Selo de preço conferido
   ---------------------------------------------------------------------------
   É o que diferencia o site: em vez de só desenhar o gráfico, dizer o que ele
   significa. As três cores são semânticas e nunca sozinhas -- a frase diz o
   mesmo que a cor, para quem não distingue as duas. */
.selo-preco {
  margin: 0 0 var(--space-3);
  padding: var(--space-3) var(--space-4);
  border-radius: var(--radius);
  border-left: 4px solid var(--border-strong);
  background: var(--surface-alt);
  font-size: 0.95rem;
  line-height: 1.5;
}
.selo-preco strong { display: block; }
.selo-bom      { border-left-color: var(--success); background: var(--success-soft); color: var(--success-ink); }
.selo-atencao  { border-left-color: var(--accent);  background: var(--accent-soft);  color: var(--accent-ink); }
/* Cores do tema, como os outros selos. Antes eram fixas, com uma versão
   escura presa ao modo escuro do APARELHO -- só que o site não segue o modo do
   aparelho (quem escolhe claro ou escuro é a paleta do painel), e o aviso saía
   escuro no meio da página clara para quem usa o celular no modo noturno. */
.selo-alerta   { border-left-color: var(--danger); background: var(--danger-soft); color: var(--danger-ink); }
.selo-neutro   { color: var(--text-muted); }

/* ---------------------------------------------------------------------------
   Cupom de loja
   ---------------------------------------------------------------------------
   O código é o que a pessoa veio buscar, então ele é o elemento mais forte do
   cartão -- e é um <button>, não um <span> bonitinho: quem navega por teclado
   precisa alcançar e acionar a cópia. */
.cupom-lista { list-style: none; margin: 0; padding: 0; display: grid; gap: var(--space-3); }
.cupom-card {
  display: grid;
  grid-template-columns: minmax(0, 1fr) minmax(190px, auto);
  grid-template-areas: "loja acao" "corpo acao";
  gap: .65rem 1.5rem;
  align-items: center;
  padding: 1.15rem 1.35rem;
  background: var(--surface);
  border: 1px solid var(--border);
  border-radius: var(--radius-lg);
  box-shadow: var(--shadow);
}
.cupom-loja {
  grid-area: loja;
  min-width: 0;
  display: flex;
  align-items: center;
  gap: .65rem;
}
.cupom-loja a { color: var(--text); font-size: 1rem; }
.cupom-loja .store-logo { width: 58px; height: 58px; font-size: 1.25rem; border-radius: 14px; }
.cupom-loja img.store-logo { object-fit: contain; background: var(--surface-alt); padding: .25rem; }
.cupom-corpo { grid-area: corpo; min-width: 0; }
.cupom-titulo { margin: .3rem 0; font-size: 1.1rem; line-height: 1.35; }
.cupom-beneficio {
  display: inline-block;
  padding: .2rem .6rem;
  border-radius: 999px;
  background: var(--accent-soft);
  color: var(--accent-ink);
  font-weight: 700;
  font-size: .8rem;
}
.cupom-validade { margin: .45rem 0 0; }
.cupom-acao {
  grid-area: acao;
  display: grid;
  gap: .45rem;
  justify-items: stretch;
  align-content: center;
  text-align: center;
}
.cupom-codigo {
  font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
  letter-spacing: .07em;
  font-weight: 700;
  border-style: dashed;
}
.cupom-codigo-mini {
  font-size: 0.85rem;
  padding: 2px 8px;
  background: var(--surface-alt);
  border: 1px dashed var(--border-strong);
  border-radius: var(--radius-sm, 6px);
  color: var(--text);
  cursor: pointer;
}
@media (max-width: 560px) {
  .cupom-card {
    grid-template-columns: minmax(0, 1fr);
    grid-template-areas: "loja" "corpo" "acao";
    gap: .7rem;
    padding: .9rem;
  }
  .cupom-loja .store-logo { width: 52px; height: 52px; }
  .cupom-acao {
    display: flex;
    align-items: center;
    justify-content: flex-start;
    flex-wrap: wrap;
    text-align: left;
  }
}

.cupom-explicacao {
  display: grid;
  grid-template-columns: minmax(220px, .8fr) minmax(0, 2fr);
  align-items: center;
  gap: .8rem 1.5rem;
  padding: 1rem 1.25rem;
  margin-top: 1.25rem;
  background: var(--surface-alt);
  border-left: 4px solid var(--primary);
}
.cupom-explicacao h2 { margin: 0; font-size: 1.05rem; }
.cupom-explicacao-corpo p { margin: 0 0 .65rem; line-height: 1.5; }
@media (max-width: 639.98px) {
  .cupom-explicacao { grid-template-columns: 1fr; gap: .5rem; padding: .9rem; }
}

/* Gerador de postagens (admin) */
.postagem-cores { display: grid; gap: var(--space-2); grid-template-columns: repeat(auto-fit, minmax(120px, 1fr)); }
.postagem-cores input[type="color"] { width: 100%; height: 42px; padding: 2px; cursor: pointer; }
.postagem-grade { display: grid; gap: var(--space-4); grid-template-columns: repeat(auto-fit, minmax(min(100%, 320px), 1fr)); align-items: start; }
.postagem-previa { background: var(--surface-alt); border-radius: var(--radius); overflow: hidden; }
.postagem-previa svg { display: block; width: 100%; height: auto; }
.postagem-saida { width: 100%; font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size: 0.85rem; line-height: 1.5; }

/* Envio de cupom: duas colunas que viram uma no celular. */
.form-vertical > label { display: block; margin-bottom: var(--space-3); }
.form-linha { display: grid; gap: var(--space-3); grid-template-columns: repeat(auto-fit, minmax(160px, 1fr)); }

/* Selo de equipe nos comentários: tem que destoar dos chips de reputação, que
   qualquer pessoa alcança comentando. */
.tag-equipe { background: var(--brand); color: #fff; font-weight: 700; letter-spacing: .02em; }

/* Passo a passo da conexão com uma loja: numerado e com respiro entre passos. */

/* Navegação e navegação de ofertas em diferentes tamanhos de tela. */
.mobile-nav { display: none; }
.mobile-offer-action { display: none; }
.catalog-layout { display: grid; gap: 1.25rem; }
.catalog-results { min-width: 0; }
.catalog-sidebar { display: none; }
.filter-display { display: flex; gap: .35rem; align-items: center; }
.applied-filters { display: flex; align-items: center; flex-wrap: wrap; gap: .35rem; }
.applied-filters-label { color: var(--text-muted); font-size: .8rem; }
.applied-filter { padding: .2rem .55rem; border-radius: 999px; background: var(--primary-fade); color: var(--primary-dark); font-size: .78rem; }
.applied-filter:hover { text-decoration: none; }
.clear-filters { font-size: .8rem; font-weight: 600; }
.list-layout { grid-template-columns: 1fr; }
.list-layout .offer-card { flex-direction: row; min-height: 150px; }
.list-layout .offer-image { flex: 0 0 150px; aspect-ratio: 1; }
.list-layout .offer-body {
  display: grid; grid-template-columns: minmax(0, 1fr) auto;
  grid-template-areas: "meta prices" "title prices" ". rating" "tags footer";
  align-content: center; align-items: center; gap: .35rem .8rem; min-width: 0;
}
.list-layout .offer-meta-top { grid-area: meta; }
.list-layout .offer-title { grid-area: title; height: auto; -webkit-line-clamp: 2; }
.list-layout .offer-prices { grid-area: prices; flex-direction: column; flex-wrap: nowrap; align-items: flex-end; text-align: right; min-width: 0; min-height: 0; }
.list-layout .community-rating { grid-area: rating; width: auto; justify-self: end; }
.list-layout .offer-tags { grid-area: tags; min-height: 0; }
.list-layout .offer-footer { grid-area: footer; align-items: flex-end; }

@media (min-width: 900px) {
  .catalog-layout { grid-template-columns: 210px minmax(0, 1fr); align-items: start; }
  .catalog-sidebar {
    display: flex; flex-direction: column; gap: .25rem; position: sticky; top: 110px;
    max-height: calc(100vh - 130px); overflow-y: auto; padding: .85rem;
    border: 1px solid var(--border); border-radius: var(--radius-lg); background: var(--surface);
  }
  .catalog-sidebar h2 { font-size: .95rem; margin: 0 0 .4rem; }
  .catalog-category { display: flex; justify-content: space-between; gap: .5rem; padding: .42rem .5rem; border-radius: 6px; color: var(--text-soft); font-size: .84rem; }
  .catalog-category span { color: var(--text-muted); font-size: .75rem; }
  .catalog-category:hover, .catalog-category.active { background: var(--surface-alt); text-decoration: none; color: var(--text); }
  .catalog-category.active { font-weight: 700; }
  .catalog-all-categories { margin-top: .3rem; padding: .4rem .5rem; font-size: .82rem; font-weight: 600; }
}

@media (max-width: 639.98px) {
  .main { padding-bottom: calc(1.5rem + 4.25rem + env(safe-area-inset-bottom, 0px)); }
  body.has-mobile-offer-action .main { padding-bottom: calc(1.5rem + 8.5rem + env(safe-area-inset-bottom, 0px)); }
  .site-footer { padding-bottom: calc(2rem + 4.25rem + env(safe-area-inset-bottom, 0px)); }
  body.has-mobile-offer-action .site-footer { padding-bottom: calc(2rem + 8.5rem + env(safe-area-inset-bottom, 0px)); }
  .mobile-nav {
    position: fixed; z-index: 60; inset: auto 0 0; display: grid;
    grid-template-columns: repeat(4, 1fr); padding: .35rem .35rem calc(.35rem + env(safe-area-inset-bottom, 0px));
    border-top: 1px solid var(--border); background: var(--surface);
    box-shadow: 0 -3px 14px rgba(15, 23, 42, .10);
  }
  .mobile-nav a { display: flex; flex-direction: column; align-items: center; justify-content: center; gap: .08rem; min-height: 46px; color: var(--text-soft); font-size: .7rem; font-weight: 600; }
  .mobile-nav a:hover { text-decoration: none; }
  .mobile-nav a.active { color: var(--primary); }
  .mobile-nav-icon { font-size: 1.15rem; line-height: 1.1; }
  .filter-display { width: 100%; }
  .applied-filters { width: 100%; }
  .list-layout .offer-image { flex-basis: 96px; }
  .list-layout .offer-body { display: flex; align-items: stretch; gap: .35rem; }
  .list-layout .offer-title { font-size: .88rem; }
  .list-layout .offer-footer { align-items: stretch; }
  .mobile-offer-action {
    position: fixed; z-index: 55; inset: auto 0 calc(4.25rem + env(safe-area-inset-bottom, 0px));
    display: flex; align-items: center; justify-content: space-between; gap: .75rem;
    padding: .55rem .8rem; border-top: 1px solid var(--border); background: var(--surface);
    box-shadow: 0 -3px 14px rgba(15, 23, 42, .08);
  }
  .mobile-offer-action > div,
  .mobile-offer-info { display: flex; flex-direction: column; min-width: 0; }
  .mobile-offer-price { font-weight: 800; color: var(--success); line-height: 1.2; }
  .mobile-offer-price.is-expired { color: var(--text-muted); font-size: .78rem; }
  .mobile-offer-store { color: var(--text-muted); font-size: .72rem; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
  .mobile-offer-buttons { display: flex; align-items: center; gap: .5rem; flex-shrink: 0; }
  .mobile-offer-action .stat-compartilhar {
    display: inline-flex; align-items: center; justify-content: center;
    width: 38px; height: 38px; padding: 0;
    border-radius: var(--radius); background: var(--surface-alt);
    border: 1px solid var(--border); color: var(--text); flex-shrink: 0;
  }
  .mobile-offer-action .stat-compartilhar:hover,
  .mobile-offer-action .stat-compartilhar:active {
    background: var(--surface-alt); color: var(--primary);
  }
  .mobile-offer-action .stat-compartilhar .share-label { display: none; }
  .mobile-offer-action .stat-compartilhar svg { width: 18px; height: 18px; }
  .mobile-offer-action .btn { width: auto; flex: none; padding: .55rem .8rem; }

  /* Cards da home e do feed mais compactos: duas promoções lado a lado
     permitem comparar opções sem ocupar a tela inteira com uma só oferta. */
  .offer-grid:not(.list-layout) {
    grid-template-columns: repeat(2, minmax(0, 1fr));
    gap: .55rem;
  }
  .offer-grid:not(.list-layout) .offer-image { aspect-ratio: 8 / 5; }
  .offer-grid:not(.list-layout) .offer-body { padding: .48rem; gap: .35rem; }
  .offer-grid:not(.list-layout) .offer-title {
    font-size: .82rem;
    line-height: 1.3;
    height: 2.6em;
    display: -webkit-box;
    -webkit-box-orient: vertical;
    -webkit-line-clamp: 2;
    overflow: hidden;
    text-overflow: ellipsis;
  }
  .offer-grid:not(.list-layout) .offer-meta-top { gap: .25rem; }
  .offer-grid:not(.list-layout) .offer-time { font-size: .68rem; }
  .offer-grid:not(.list-layout) .offer-prices {
    min-height: 2.2rem;
    align-content: flex-start;
  }
  .offer-grid:not(.list-layout) .price-now { font-size: .98rem; }
  .offer-grid:not(.list-layout) .tag { font-size: .66rem; padding: .08rem .3rem; }
  .offer-grid:not(.list-layout) .store-chip { max-width: 100%; }
  .offer-grid:not(.list-layout) .offer-stats { gap: .1rem .35rem; font-size: .68rem; }
  .offer-grid:not(.list-layout) .offer-author { font-size: .66rem; }
  .offer-grid:not(.list-layout) .expired-badge-overlay {
    font-size: 0.68rem;
    padding: 0.25rem 0.45rem;
    max-width: 90%;
  }
  .offer-grid:not(.list-layout) .btn-repost {
    font-size: 0.68rem;
    line-height: 1.2;
    padding: 0.28rem 0.35rem;
    white-space: normal;
  }
  .offer-grid:not(.list-layout) .btn-cta {
    padding: .45rem .3rem;
    font-size: .78rem;
    white-space: nowrap;
  }
  .acoes-secundarias {
    width: 100%;
  }
  .acoes-secundarias .stat-compartilhar {
    width: 100%;
    min-height: 44px;
  }
}

@media (max-width: 480px) {
  .preco-manual-form { grid-template-columns: 1fr; }
  .preco-manual-fora-estoque { justify-content: stretch; }
  .preco-manual-fora-estoque button { width: 100%; }
}
.preco-manual-resumo .tag-coupon {
  word-break: break-word;
  white-space: normal;
}

/* Campos e indicadores administrativos permanecem legíveis em telas pequenas. */
.admin-offers-table td[data-label="Status"] small { display:block; margin-top:.35rem; line-height:1.4; }
.admin-filters label { display:flex; align-items:center; gap:.6rem; flex-wrap:wrap; }
.preco-manual-acoes .checkbox { font-size:.85rem; line-height:1.5; }
@media(max-width:600px) { .admin-body .muted.small { font-size:.82rem; line-height:1.55; } .preco-manual-acoes form { width:100%; } }

/* Ritmo comum nas páginas públicas, na conta e na administração.
   Grupos explícitos mantêm espaço inclusive quando as ações quebram de linha. */
.action-group { display: flex; align-items: center; flex-wrap: wrap; gap: .65rem; }
:is(.form-actions, .admin-page-actions, .row-actions, .mod-actions, .alert-actions,
    .quick-actions, .comment-form-actions) { gap: .65rem; flex-wrap: wrap; }
.action-group > form { margin: 0; }
.card > :last-child { margin-bottom: 0; }
.card + .card, .card + .data-table, .data-table + .card { margin-top: 1rem; }
.admin-columns > .card, .postagem-grade > .card { margin-block: 0; }
.card > :is(form, .action-group, .data-table) + :is(form, .action-group, .data-table) { margin-top: 1rem; }
.form-stack { display: flex; flex-direction: column; gap: 1rem; }
.form-stack > :is(p, label, .form-row, .form-actions) { margin: 0; }
.form-stack > :is(button, .btn) { align-self: flex-start; }
.form-stack > label:not(.checkbox) { display: flex; flex-direction: column; gap: .4rem; }
.form-stack > label.checkbox { flex-direction: row; }
.form-stack > label > :is(input, textarea, select) { min-width: 0; }
.card > form:not([class]) { display: flex; flex-direction: column; gap: .85rem; }
.card > form:not([class]) > .btn { align-self: flex-start; }
.card > form:not([class]) > label:not(.checkbox) { display: flex; flex-direction: column; gap: .4rem; }
.offer-form { gap: .65rem; }
.form-actions { padding-top: .5rem; }
.btn { max-width: 100%; white-space: normal; overflow-wrap: anywhere; text-align: center; }
.btn-sm { min-height: 36px; }
.btn-danger-soft, .btn-warning-soft { line-height: 1.4; }
.row-actions { min-width: 0; }
.row-actions > :is(a, form, details) { flex-shrink: 0; }
.row-actions > form { align-items: center; gap: .5rem; flex-wrap: wrap; }
.admin-filters > label { min-width: 0; }
.admin-filters :is(input, select) { max-width: 100%; }
.page-head > p:last-child { margin-bottom: 0; }
.section-header { flex-wrap: wrap; }
:is(.admin-columns, .catalog-results, .postagem-grade, .form-row) > * { min-width: 0; }
.card :is(code, .break-all) { overflow-wrap: anywhere; }
details > summary { cursor: pointer; }
.danger-zone { margin-top: 1rem; }
.danger-zone > summary { color: var(--danger); font-weight: 650; }
.danger-zone > form { margin-top: .85rem; padding: 1rem; border: 1px solid var(--danger); border-radius: var(--radius); background: var(--danger-soft); color: var(--danger-ink); }
.danger-zone .muted { color: inherit; }
.batch-selection { display: flex; align-items: center; gap: .5rem; margin: 0; }
.batch-selection input { flex: none; }
.batch-summary { margin: 0; color: var(--text-soft); font-size: .85rem; }
.admin-commission-empty { margin: 1rem 0; }
.preco-manual-acoes { gap: .75rem; }
.preco-manual-acoes > form:not(.preco-manual-form) { display: flex; flex-direction: column; gap: .55rem; }
.preco-manual-acoes > form > .checkbox { margin: 0; }
.preco-manual-form { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: .75rem; padding-block: .85rem; border-block: 1px solid var(--border); }
.preco-manual-form > label { min-width: 0; }
.preco-manual-form > label:last-of-type, .preco-manual-form > button { grid-column: 1 / -1; }
@media (max-width: 639.98px) {
  .card { padding: 1rem; }
  :is(.alert-actions, .comment-form-actions) { width: 100%; }
  .form-stack > :is(button, .btn) { align-self: stretch; }
  .admin-filters > label { width: 100%; }
  .admin-filters > :is(input, select) { width: 100%; min-width: 0; }
  .admin-filters > button { min-height: 44px; }
  .btn-sm { min-height: 44px; }
  .postagem-grade { grid-template-columns: minmax(0, 1fr); }
  .list-layout .offer-body { min-width: 0; }
  .action-group > .btn { flex: 1 1 150px; }
}
@media (max-width: 480px) { .preco-manual-form { grid-template-columns: minmax(0, 1fr); } }

/* ==========================================================================
   Ajustes de alinhamento, formulários e celular
   --------------------------------------------------------------------------
   Este bloco era o public/improvements.css, carregado DEPOIS deste arquivo.
   Fica no fim para manter a mesma ordem de cascata: as regras daqui continuam
   valendo sobre as de cima quando as duas têm o mesmo peso.
   ========================================================================== */

/* Navigation and forms */
/* Shared alignment, including unequal label lengths and wrapped actions. */
.form-row:not(.checks) {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(min(100%, 200px), 1fr));
  align-items: start;
  gap: 0.4rem 1rem;
}
.form-row:not(.checks) > label:not(.checkbox) {
  min-width: 0;
  display: flex;
  flex-direction: column;
  gap: 0.4rem;
}
.form-row:not(.checks) > label:not(.checkbox) > :is(input, select, textarea) {
  width: 100%;
  min-width: 0;
}
/* Shared tracks align controls even when titles or help text wrap. */
@supports (grid-template-rows: subgrid) {
  :is(
      .form-row:not(.checks),
      .weight-grid,
      .color-grid,
      .form-linha,
      .postagem-cores,
      .preco-manual-form
    )
    > label:not(.checkbox) {
    display: grid;
    grid-row: span 3;
    grid-template-rows: subgrid;
    align-items: start;
    gap: 0.4rem;
    min-width: 0;
  }
  :is(
      .form-row:not(.checks),
      .weight-grid,
      .color-grid,
      .form-linha,
      .postagem-cores,
      .preco-manual-form
    )
    > label:not(.checkbox)
    > :is(input, select, textarea, .color-inputs) {
    grid-row: 2;
  }
  :is(
      .form-row:not(.checks),
      .weight-grid,
      .color-grid,
      .form-linha,
      .postagem-cores,
      .preco-manual-form
    )
    > label
    > span:first-child {
    grid-row: 1;
    margin: 0;
  }
  :is(
      .form-row:not(.checks),
      .weight-grid,
      .color-grid,
      .form-linha,
      .postagem-cores,
      .preco-manual-form
    )
    > label
    > small {
    grid-row: 3;
    margin: 0;
  }
}
.form-row.checks > label.checkbox {
  flex-direction: row;
  align-items: flex-start;
  min-width: 0;
}
.enhancement-grid label.checkbox,
.form-stack > label.checkbox {
  display: flex;
  flex-direction: row;
  align-items: flex-start;
  gap: 0.5rem;
}
:is(.offer-form, .form-vertical, .postagem-grade > .card)
  > label:not(.checkbox) {
  display: flex;
  flex-direction: column;
  gap: 0.4rem;
  min-width: 0;
}
:is(.offer-form, .form-vertical, .postagem-grade > .card)
  > label
  > span:first-child {
  margin: 0;
}
:is(
    .form-row,
    .offer-form,
    .form-vertical,
    .form-stack,
    .inline-form,
    .admin-filters,
    .enhancement-actions,
    .form-linha,
    .weight-grid,
    .preco-manual-form,
    .filter-form,
    .report-form
  )
  :is(
    input:not([type="hidden"]):not([type="checkbox"]):not([type="radio"]):not(
        [type="file"]
      ),
    select
  ) {
  min-height: 40px;
}
.color-inputs > input[type="color"] {
  height: 40px;
}
:is(.weight-grid, .color-grid, .form-linha, .postagem-cores) {
  min-width: 0;
}
.color-grid {
  grid-template-columns: repeat(auto-fill, minmax(min(100%, 230px), 1fr));
}
.weight-grid {
  grid-template-columns: repeat(auto-fill, minmax(min(100%, 170px), 1fr));
}
.form-linha {
  grid-template-columns: repeat(auto-fit, minmax(min(100%, 160px), 1fr));
}
.admin-filters > label:not(.checkbox):not(.batch-selection) {
  display: flex;
  flex-direction: column;
  align-items: stretch;
  gap: 0.4rem;
  flex: 1 1 170px;
}
.admin-filters
  > label
  :is(input:not([type="checkbox"]):not([type="radio"]), select) {
  flex: none;
  width: 100%;
}
.form-actions {
  align-items: center;
}
:is(
    .form-actions,
    .inline-form,
    .admin-filters,
    .enhancement-actions,
    .filter-form,
    .report-form
  )
  > :is(.btn, button) {
  min-height: 40px;
  display: inline-flex;
  align-items: center;
  justify-content: center;
}
.row-actions > :is(form, details) {
  min-width: 0;
  max-width: 100%;
}
.reject-form {
  min-width: min(220px, 100%);
  max-width: 100%;
}
.postagem-grade > .card > :is(label, .postagem-cores) {
  margin-block: 0.75rem;
}
.postagem-cores input[type="color"] {
  border: 1px solid var(--border-strong);
  border-radius: var(--radius);
  background: var(--surface);
}
.admin-content .inline-form,
.admin-content .admin-filters {
  align-items: end;
  gap: 0.75rem;
}
.admin-content
  :is(.action-group, .reject-form, .form-actions, .preco-manual-acoes) {
  gap: 0.75rem;
}
.admin-content .data-table td {
  vertical-align: top;
}
.admin-content .data-table .action-group {
  align-items: center;
}
.preco-manual-form > :is(p, button) {
  grid-column: 1/-1;
}
.preco-manual-form > p {
  margin: 0.15rem 0;
}
.offer-grid:not(.list-layout) .offer-card {
  height: 100%;
}
.offer-grid:not(.list-layout) .offer-body {
  flex: 1;
}
.offer-stats {
  flex-wrap: wrap;
  overflow: visible;
  row-gap: 0.35rem;
}
.offer-footer > .btn {
  display: flex;
  justify-content: center;
  align-items: center;
  min-height: 40px;
}
.offer-conditions {
  display: flex;
  /* Em linha, quebrando quando não couber. Sem isto valia o `column` da regra
     de cima, e o `align-items: center` centralizava "Frete grátis" sozinho no
     meio do bloco de preço. */
  flex-direction: row;
  flex-wrap: wrap;
  gap: 0.5rem 1rem;
  align-items: center;
}
.admin-content .card :is(.action-group, .inline-form) + p {
  margin-top: 0.75rem;
}
@media (max-width: 639px) {
  .form-row:not(.checks) {
    grid-template-columns: 1fr;
  }
  .preco-manual-form {
    grid-template-columns: 1fr;
  }
  .admin-content .inline-form > label {
    max-width: none;
    flex: 1 1 100%;
  }
  .admin-content .inline-form > button {
    min-height: 44px;
  }
  :is(
      .form-actions,
      .inline-form,
      .admin-filters,
      .enhancement-actions,
      .filter-form,
      .report-form
    )
    > :is(.btn, button) {
    min-height: 44px;
  }
  .offer-detail .offer-conditions {
    align-items: flex-start;
  }
}
a:not(.btn):not(.chip):not(.store-chip):not(.active) {
  text-underline-offset: 0.2em;
}
.price-now,
.mobile-offer-price {
  color: var(--price-ink, var(--success));
}
main a:not(.btn):not(.chip):not(.store-chip):not(.tag):not(.active) {
  color: var(--link-ink, var(--primary));
}
input::placeholder,
textarea::placeholder {
  color: var(--text-muted);
  opacity: 1;
}
:focus-visible {
  outline: 3px solid var(--link-ink, var(--primary));
  outline-offset: 3px;
}
.admin-menu > summary {
  cursor: pointer;
  padding: 0.85rem;
  border: 1px solid var(--border);
  border-radius: 0.7rem;
  font-weight: 700;
  margin-bottom: 0.65rem;
}
.admin-menu {
  min-width: 0;
}
.admin-menu > summary {
  display: none;
}
.form-stack,
.admin-content form {
  gap: 0.7rem;
}
.admin-content .card + .card,
.admin-content details + section {
  margin-top: 1rem;
}
.admin-content .table-wrap:has(table) {
  border: 1px solid var(--border);
  border-radius: 0.7rem;
}
.table-hint {
  font-size: 0.8rem;
  color: var(--text-muted);
  margin: 0.4rem 0;
}
.enhancement-grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(min(100%, 260px), 1fr));
  gap: 1rem;
  margin: 1rem 0;
}
.enhancement-grid .card {
  margin: 0;
  padding: 1rem;
}
.admin-content
  :is(.enhancement-grid, .admin-columns, .postagem-grade)
  > .card
  + .card {
  margin-top: 0;
}
.enhancement-grid label {
  display: grid;
  gap: 0.4rem;
  margin: 0.6rem 0;
}
.enhancement-actions {
  display: flex;
  flex-wrap: wrap;
  gap: 0.6rem;
  align-items: center;
  margin: 0.7rem 0;
}
.enhancement-actions:has(> label) {
  align-items: flex-end;
}
.enhancement-actions > label {
  display: grid;
  gap: 0.4rem;
  min-width: 0;
  margin: 0;
}
.enhancement-actions.catalog-search {
  display: grid;
  grid-template-columns: minmax(0, 1fr) auto;
  align-items: end;
}
.catalog-search input {
  width: 100%;
  min-width: 0;
}
.history-diff {
  white-space: pre-wrap;
  overflow-wrap: anywhere;
  max-height: 22rem;
  overflow: auto;
}
.quality-number {
  font-size: 1.8rem;
  font-weight: 800;
}
@media (max-width: 900px) {
  .admin {
    display: block;
  }
  .admin-menu > summary {
    display: block;
  }
  .admin-menu .admin-nav {
    display: grid;
    grid-template-columns: repeat(2, minmax(0, 1fr));
    white-space: normal;
    overflow: visible;
    margin-bottom: 1rem;
    width: 100%;
    max-width: none;
  }
  .admin-menu .admin-nav a {
    padding: 0.65rem;
    white-space: normal;
  }
  .admin-content {
    min-width: 0;
    width: 100%;
  }
  .admin-responsive-table tr {
    display: grid;
    grid-template-columns: 1fr;
    gap: 0.4rem;
    border-bottom: 1px solid var(--border);
    padding: 0.7rem;
  }
  .admin-responsive-table thead {
    display: none;
  }
  .admin-responsive-table td {
    display: block;
    border: 0;
    overflow-wrap: anywhere;
    white-space: normal;
    padding: 0.3rem;
  }
  .admin-responsive-table td::before {
    content: attr(data-label);
    display: block;
    font-size: 0.75rem;
    color: var(--text-muted);
  }
}
@media (max-width: 639px) {
  :root {
    --mobile-nav-height: 58px;
    --mobile-action-height: 76px;
  }
  .offer-grid .offer-card .offer-tags {
    display: flex;
    flex-wrap: wrap;
    gap: 0.25rem;
    max-height: none;
    height: auto;
    overflow: visible;
    min-height: 0;
    align-items: center;
  }
  .offer-grid .offer-card .store-chip {
    flex-basis: 100%;
    min-width: 0;
    font-size: 0.72rem;
    white-space: normal;
    overflow: visible;
    text-overflow: clip;
  }
  .offer-grid .offer-card .offer-author {
    flex-basis: 100%;
    font-size: 0.67rem;
    overflow-wrap: anywhere;
  }
  .offer-grid .offer-card .offer-tags .tag {
    white-space: normal;
    font-size: 0.65rem;
    line-height: 1.3;
    padding: 0.15rem 0.3rem;
  }
  .offer-grid .offer-card .offer-stats {
    flex-wrap: wrap;
    gap: 0.45rem;
  }
  .mobile-nav {
    height: calc(var(--mobile-nav-height) + env(safe-area-inset-bottom));
    box-sizing: border-box;
  }
  .mobile-offer-action {
    bottom: calc(var(--mobile-nav-height) + env(safe-area-inset-bottom));
    min-height: var(--mobile-action-height);
    padding: 0.55rem 0.7rem;
    gap: 0.45rem;
  }
  .mobile-offer-action > .mobile-offer-info {
    flex-direction: column;
    flex: 1;
    min-width: 0;
  }
  .mobile-offer-action > .mobile-offer-buttons {
    flex-direction: row;
    flex: 0 0 auto;
    gap: 0.4rem;
  }
  .mobile-offer-buttons .btn {
    font-size: 0.8rem;
    padding: 0.65rem 0.7rem;
  }
  body main,
  body footer {
    padding-bottom: calc(
      var(--mobile-nav-height) + env(safe-area-inset-bottom) + 1rem
    );
  }
  body.has-mobile-offer-action main,
  body.has-mobile-offer-action footer {
    padding-bottom: calc(
      var(--mobile-nav-height) + var(--mobile-action-height) +
        env(safe-area-inset-bottom) + 1rem
    );
  }
  .comment-actions,
  .comment-form-actions {
    display: flex;
    flex-wrap: wrap;
    gap: 0.65rem;
  }
}

.pv-price {
  color: var(--pv-price-ink, var(--pv-success));
}
.filter-label {
  display: grid;
  gap: 0.25rem;
}
.filter-label > span {
  font-size: 0.8rem;
  color: var(--text-muted);
}
.admin-content details.card {
  padding: 1rem;
  margin: 0.7rem 0;
}
.admin-content details summary {
  cursor: pointer;
}
.coupon-feedback {
  grid-column: 1/-1;
  padding: 0.5rem 0;
  border-top: 1px solid var(--border);
}

/* Shared visual language for actions, with visible labels and decorative icons. */
.action-icon {
  display: inline-block;
  width: 1.1rem;
  height: 1.1rem;
  flex: 0 0 1.1rem;
  vertical-align: middle;
  pointer-events: none;
}
.btn:has(> .action-icon) { gap: .5rem; }
.btn > span { min-width: 0; }
.row-actions > a:has(> .action-icon) {
  display: inline-flex;
  align-items: center;
  gap: .45rem;
}
.btn:focus-visible,
:is(.report-block, .comment-actions > details) > summary:focus-visible {
  outline: 2px solid var(--primary);
  outline-offset: 3px;
}
.admin-nav a { gap: .65rem; }
.admin-nav a > .action-icon { opacity: .8; }
.admin-nav-text { flex: 1; min-width: 0; }
.admin-nav a.active > .action-icon { opacity: 1; }

.report-block { padding: 0; overflow: hidden; }
:is(.report-block, .comment-actions > details) > summary {
  display: flex;
  align-items: center;
  gap: .65rem;
  list-style: none;
  cursor: pointer;
  font-weight: 600;
}
:is(.report-block, .comment-actions > details) > summary::-webkit-details-marker {
  display: none;
}
.report-block > summary { padding: 1rem 1.1rem; }
.report-block > summary:focus-visible { outline-offset: -3px; }
.report-block > summary > .action-icon:first-child { color: var(--primary); }
.report-block > summary:hover { background: var(--surface-alt); }
.disclosure-chevron {
  margin-left: auto;
  color: var(--text-muted);
  transition: transform .18s ease;
}
details[open] > summary > .disclosure-chevron { transform: rotate(180deg); }
.report-block[open] > summary { border-bottom: 1px solid var(--border); }
.report-block > .report-form { margin: 0; padding: 1rem 1.1rem; gap: .85rem; }
.report-form > label { flex: 1 1 200px; min-width: 0; }
.report-form > label > :is(input, select) { width: 100%; }
.report-form > p { flex-basis: 100%; margin: 0; }
.comment-actions > details > summary {
  padding: .65rem .8rem;
  border: 1px solid var(--border);
  border-radius: var(--radius);
  background: var(--surface);
}
.comment-actions > details > summary:hover,
.comment-actions > details[open] > summary {
  border-color: var(--border-strong);
  background: var(--surface-alt);
}
.comment-action-panel .btn { justify-self: start; }
.report-page-heading { display: flex; align-items: flex-start; gap: 1rem; margin-bottom: 1.5rem; }
.report-page-heading h1 { margin: 0 0 .4rem; }
.report-page-heading p { margin: 0; }
.report-heading-icon {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  flex: 0 0 3rem;
  height: 3rem;
  border-radius: var(--radius-lg);
  background: var(--primary-fade);
  color: var(--primary);
}
.report-heading-icon > .action-icon,
.report-empty > .action-icon { width: 1.6rem; height: 1.6rem; }
.report-reason { display: inline-flex; align-items: flex-start; gap: .45rem; font-weight: 600; }
.report-reason > .action-icon { color: var(--text-muted); }
.report-empty > .action-icon { color: var(--success); margin-bottom: .5rem; }
.report-empty p { margin: .4rem 0; }
@media (max-width: 600px) {
  .report-block > summary,
  .report-block > .report-form { padding: .85rem; }
  .report-form > .btn { width: 100%; }
  .report-page-heading { gap: .75rem; }
}
@media (prefers-reduced-motion: reduce) {
  .disclosure-chevron { transition: none; }
}

/* Compact navigation and a consistent visual hierarchy across the site. */
/* Page snapshots can obscure sticky controls and stall links without scripts. */
@view-transition { navigation: none; }
.filter-bar { display: block; padding: .85rem; }
.filter-toolbar { display: flex; align-items: center; justify-content: space-between; gap: .8rem; flex-wrap: wrap; }
.filter-sort-mobile { display: none; }
.filter-display { display: flex; gap: .3rem; flex: 0 0 auto; width: auto; }
.filter-display .chip { display: inline-flex; align-items: center; gap: .35rem; }
.filter-options { margin-top: .75rem; border-top: 1px solid var(--border); padding-top: .5rem; }
.filter-options > summary,
:is(.postagem-aparencia, .postagem-rede, .footer-group) > summary {
  display: flex; align-items: center; gap: .6rem; list-style: none; cursor: pointer;
  font-weight: 650; min-height: 44px;
}
:is(.filter-options, .postagem-aparencia, .postagem-rede, .footer-group) > summary::-webkit-details-marker { display: none; }
.filter-count { background: var(--primary-fade); color: var(--link-ink); border-radius: 999px; padding: .15rem .5rem; font-size: .78rem; }
.filter-options .filter-toggles { margin: .65rem 0; gap: .45rem; }
.filter-options .filter-advanced { margin: 0; padding-top: .5rem; }
.filter-options .filter-form { gap: .8rem; }
.filter-form > label { flex: 1 1 150px; min-width: 0; }
.filter-form > label > :is(input, select) { width: 100%; }
.applied-filters { margin-top: .75rem; }
.filter-sorts .chip { min-height: 36px; display: inline-flex; align-items: center; }
main .offer-card .offer-title > a:not(.btn):not(.chip):not(.store-chip):not(.tag):not(.active),
main .catalog-product-row .catalog-product-title:not(.btn):not(.chip):not(.store-chip):not(.tag):not(.active) { color: var(--text); }
main .offer-card .offer-title > a:not(.btn):not(.chip):not(.store-chip):not(.tag):not(.active):hover,
main .catalog-product-row .catalog-product-title:not(.btn):not(.chip):not(.store-chip):not(.tag):not(.active):hover { color: var(--link-ink); }
.offer-prices { font-variant-numeric: tabular-nums; }
.offer-time, .offer-author { color: var(--text-muted); }
.offer-stats .stat { display: inline-flex; align-items: center; gap: .3rem; }
.offer-stats .action-icon { width: .9rem; height: .9rem; flex-basis: .9rem; }
.comment-more { margin-top: 1rem; }
.comment:target { border-radius: var(--radius); outline: 2px solid var(--primary); outline-offset: 4px; scroll-margin-top: 10rem; }
.comment:focus-visible { outline: 2px solid var(--primary); outline-offset: 3px; }

.catalog-overview { align-items: start; }
.catalog-product-list { list-style: none; padding: 0; margin: 0; }
.catalog-product-row { display: grid; gap: .65rem; padding: 1rem 0; border-bottom: 1px solid var(--border); }
.catalog-product-row:first-child { padding-top: .3rem; }
.catalog-product-row:last-child { border-bottom: 0; }
.catalog-product-title { font-weight: 700; }
.catalog-product-row p { margin: .3rem 0 0; }
.catalog-link-count { font-size: .8rem; color: var(--text-soft); }
.catalog-product-row .row-actions { gap: .5rem; }

.postagem-grade { display: block; }
.postagem-workspace { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 1rem; align-items: start; }
.postagem-editor { display: grid; gap: 1rem; min-width: 0; }
.postagem-editor > .card { margin: 0; }
.admin-content .postagem-editor > .card + .card { margin-top: 0; }
.postagem-editor > .card > label:not(.checkbox) { display: flex; flex-direction: column; gap: .4rem; margin: .85rem 0; }
.postagem-editor > .card > label:not(.checkbox) > :is(input, select, textarea) { width: 100%; min-width: 0; }
.postagem-editor > .card > label.checkbox { display: flex; align-items: flex-start; gap: .5rem; }
.postagem-editor > .card > label.checkbox > input { flex: none; }
.postagem-editor > .card input:not([type="checkbox"]),
.postagem-editor > .card select { min-height: 40px; }
.postagem-preview-card { position: sticky; top: 8rem; }
.postagem-preview-card .postagem-previa { max-width: 420px; margin-inline: auto; }
.postagem-preview-card > .form-actions { margin-top: 1rem; }
.postagem-textos { grid-column: 1 / -1; min-width: 0; }
.postagem-textos > h2 { margin: .5rem 0 1rem; }
.postagem-textos > .postagem-rede { margin: 0 0 .75rem; }
.postagem-rede > summary, .postagem-aparencia > summary { font-size: 1rem; }
.postagem-rede[open] > summary, .postagem-aparencia[open] > summary { margin-bottom: .85rem; }
.postagem-rede .postagem-saida { width: 100%; min-height: 160px; }
.postagem-rede > .form-actions { margin-top: .8rem; }
.footer-group { align-self: start; }
.footer-group > summary { min-height: auto; margin-bottom: .4rem; }
.footer-links { display: flex; flex-direction: column; gap: .4rem; }
.footer-group .disclosure-chevron { color: var(--header-muted); }
@media (min-width: 640px) {
  .footer-group .disclosure-chevron { display: none; }
}
@media (max-width: 900px) {
  .admin-compact-table { display: block; width: 100%; border: 0; background: transparent; box-shadow: none; overflow: visible; }
  .admin-compact-table thead { display: none; }
  .admin-compact-table tbody { display: grid; gap: .75rem; }
  .admin-compact-table tbody > tr {
    display: grid; grid-template-columns: minmax(0, 1fr); gap: .5rem;
    padding: .85rem; border: 1px solid var(--border); border-radius: var(--radius-lg);
    background: var(--surface); box-shadow: var(--shadow);
  }
  .admin-compact-table tbody > tr > td {
    display: block; padding: 0 !important; border: 0 !important;
    min-width: 0 !important; max-width: none !important; white-space: normal;
    overflow-wrap: anywhere; grid-column: 1 / -1;
  }
  .admin-compact-table td::before { content: attr(data-label); display: block; color: var(--text-muted); font-size: .78rem; margin-bottom: .2rem; }
  .admin-compact-table .admin-row-detail-cell::before { display: none; }
  .admin-row-details { border-top: 1px solid var(--border); padding-top: .35rem; }
  .admin-row-details > summary { cursor: pointer; color: var(--link-ink); font-weight: 600; min-height: 44px; }
  .admin-row-field { display: grid; gap: .3rem; padding: .65rem 0; border-top: 1px solid var(--border); }
  .admin-row-field-label { color: var(--text-muted); font-size: .8rem; }
  .admin-row-field > div { min-width: 0; }
  .postagem-workspace { grid-template-columns: minmax(0, 1fr); }
  .postagem-preview-card { position: static; grid-row: 1; }
  .postagem-preview-card .postagem-previa { max-width: 340px; }
}
@media (max-width: 639px) {
  .filter-toolbar { flex-wrap: nowrap; align-items: flex-end; gap: .6rem; }
  .filter-sort-mobile { display: block; flex: 1; min-width: 0; }
  .filter-sort-mobile label { display: grid; gap: .3rem; font-size: .8rem; color: var(--text-soft); }
  .filter-sort-mobile select { width: 100%; min-height: 44px; }
  .filter-sorts { display: none; }
  .filter-display .chip { min-height: 44px; padding: .4rem .5rem; border-radius: var(--radius); }
  .filter-display .chip > span { font-size: .78rem; }
  .filter-display .action-icon { width: 1rem; height: 1rem; flex-basis: 1rem; }
  .offer-grid:not(.list-layout) .offer-title { font-size: .875rem; height: 2.6em; }
  .offer-grid:not(.list-layout) .price-now { font-size: 1.08rem; letter-spacing: -.02em; }
  .offer-grid:not(.list-layout) .offer-time { font-size: .72rem; }
  .offer-grid .offer-card .offer-author { font-size: .72rem; }
  .offer-grid .offer-card .offer-tags .tag { font-size: .7rem; }
  .offer-grid .offer-card .offer-stats { font-size: .72rem; gap: .35rem; }
  .offer-grid .offer-card .installments { font-size: .75rem; }
  .footer-inner { gap: .6rem; }
  .footer-inner > .footer-col:first-child { margin-bottom: .6rem; }
  .footer-group { border-top: 1px solid var(--header-line); padding-top: .35rem; }
  .footer-group > summary { min-height: 44px; margin: 0; }
  .footer-links { padding: .3rem 0 .8rem; gap: .3rem; }
  .footer-links a { display: flex; align-items: center; min-height: 40px; }
  .site-footer { padding-top: 1.5rem; }
}
@media (max-width: 360px) {
  .filter-toolbar { flex-wrap: wrap; }
  .filter-sort-mobile { flex-basis: 100%; }
}
@media (prefers-reduced-motion: reduce) {
  .btn, .offer-card { transition: none; }
  .btn:hover, .offer-card:hover { transform: none; }
}

/* Shared visual hierarchy: navigation, content, actions and feedback. */
.admin-menu .admin-nav { display: flex; flex-direction: column; gap: .3rem; }
.admin-nav-group { width: 100%; min-width: 0; border-bottom: 1px solid var(--border); padding-bottom: .3rem; }
.admin-nav-group:last-child { border-bottom: 0; }
.admin-nav-group > summary {
  display: flex; align-items: center; justify-content: space-between; gap: .5rem;
  list-style: none; cursor: pointer; min-height: 44px; padding: .6rem .7rem;
  color: var(--text-soft); font-size: .75rem; font-weight: 750; border-radius: var(--radius);
}
.admin-nav-group > summary::-webkit-details-marker { display: none; }
.admin-nav-group > summary > span:first-child { flex: 1; }
.admin-nav-group > summary:focus-visible { outline: 2px solid var(--primary); outline-offset: -2px; }
.admin-nav-group > summary:hover { background: var(--surface-alt); }
.admin-nav-group > summary .action-icon { width: .9rem; height: .9rem; transform: rotate(-90deg); }
.admin-nav-group[open] > summary .action-icon { transform: rotate(0); }
.admin-nav-items { display: grid; gap: .2rem; padding-bottom: .4rem; }
.admin-nav-items > a { min-height: 42px; }
.admin-nav-group:has(a.active) > summary { color: var(--link-ink); }

.offer-grid:not(.list-layout) .offer-prices { min-height: 3.6rem; }
.offer-grid:not(.list-layout) .offer-tags { align-content: flex-start; }
.offer-footer .offer-stats {
  display: flex; justify-content: space-between; flex-wrap: wrap; gap: .2rem .4rem;
  border-top: 1px solid var(--border); padding-top: .25rem; overflow: visible;
}
.offer-footer .offer-stats > .stat {
  display: inline-flex; align-items: center; gap: .25rem;
  min-height: 36px; max-width: 100%; color: var(--text-soft);
}
.offer-footer .offer-stats .action-icon, .offer-footer .offer-stats .icone-share { width: .9rem; height: .9rem; flex: none; }
.offer-card .btn-cta { min-height: 42px; }
.offer-purchase { background: var(--surface-alt); border: 1px solid var(--border); border-radius: var(--radius-lg); padding: 1rem; margin: 1rem 0; }
.offer-purchase > .btn-large { width: 100%; }
.offer-purchase .price-block { margin-top: 0; }
.offer-purchase .outbound-note { margin-bottom: 0; }
.offer-information, .offer-price-section, .offer-community-section { scroll-margin-top: 9rem; }
.offer-community-section { background: var(--surface); border: 1px solid var(--border); border-radius: var(--radius-lg); padding: 1.1rem; margin: 1.25rem 0; }
.section-heading { display: flex; align-items: center; gap: .55rem; font-size: 1.1rem; }
.offer-community-section > .enhancement-actions { padding: .8rem; border-radius: var(--radius); background: var(--surface-alt); margin-bottom: 1.25rem; }
.offer-community-section > .enhancement-actions > label { min-width: 0; }
/* "Meus favoritos" na mesma linha de texto do botão ao lado. */
.enhancement-actions > a:not(.btn) { display: inline-flex; align-items: center; min-height: 40px; }
.offer-community-section > .comments { border: 0; border-radius: 0; padding: .5rem 0; }
.offer-community-section > .report-block { background: var(--surface-alt); margin-bottom: 0; }
.price-suggestion { margin-top: 1rem; padding: .85rem 1rem; border: 1px solid var(--border); border-radius: var(--radius); background: var(--surface-alt); scroll-margin-top: 9rem; }
.price-suggestion > summary { display: flex; align-items: center; gap: .55rem; cursor: pointer; font-weight: 650; color: var(--link-ink); list-style: none; min-height: 44px; }
.price-suggestion > summary::-webkit-details-marker { display: none; }
.price-suggestion > summary .disclosure-chevron { margin-left: auto; }
.price-suggestion[open] > summary .disclosure-chevron { transform: rotate(180deg); }
.price-suggestion > summary:focus-visible { outline: 2px solid var(--primary); outline-offset: 2px; }
.price-suggestion > p { margin: .5rem 0 .8rem; }
.price-suggestion .form-stack { gap: .75rem; }
.price-suggestion .form-stack > label { display: grid; gap: .3rem; }
.duplicate-result > p { line-height: 1.65; }
.duplicate-result .form-actions { margin: 1rem 0; }

.editor-section { display: grid; gap: .8rem; margin: 0; padding: 1rem; border: 1px solid var(--border); border-radius: var(--radius-lg); min-width: 0; }
.editor-section > legend { padding: 0 .5rem; color: var(--text); font-size: 1rem; font-weight: 750; }
.editor-section > p { margin: 0; }
.editor-section > label { display: grid; gap: .35rem; }
.editor-actions { justify-content: flex-start; border-top: 1px solid var(--border); padding-top: 1rem; }
.admin-content :is(.form-actions, .row-actions, .mod-actions) { align-items: center; }
.admin-content :is(.form-stack, .form-vertical) > label small { display: block; line-height: 1.5; margin-top: .3rem; }
.admin-content .data-table thead th { font-size: .75rem; color: var(--text-soft); background: var(--surface-alt); }
.admin-content .data-table tbody > tr:hover { background: var(--surface-alt); }
.admin-content .data-table :is(td, th) { vertical-align: middle; }
.admin-content .data-table td > :is(strong, a:first-child) { font-weight: 650; }
.admin-content .data-table td .muted { line-height: 1.5; }
.admin-content .data-table .pill { white-space: normal; text-align: center; }
.btn-primary { font-weight: 700; }
.btn-secondary, .btn-ghost { font-weight: 550; }
.btn-danger-soft { border-style: solid; }

.cupom-card { grid-template-areas: "loja acao" "corpo acao" "feedback feedback"; }
.cupom-card .cupom-acao { padding-top: .8rem; }
.cupom-card .cupom-codigo { display: inline-flex; flex-wrap: wrap; align-items: center; justify-content: center; gap: .5rem; min-height: 48px; max-width: 100%; }
.cupom-codigo > span:not(.cupom-copy-label) { overflow-wrap: anywhere; min-width: 0; }
.cupom-copy-label { border-left: 1px solid currentColor; padding-left: .5rem; font-family: var(--font); font-size: .75rem; letter-spacing: 0; }
.cupom-codigo-mini { display: inline-flex; align-items: center; flex-wrap: wrap; gap: .35rem; max-width: 100%; min-height: 40px; }
.cupom-card .cupom-validade { background: var(--surface-alt); border-radius: var(--radius); padding: .65rem .8rem; margin-top: .75rem; line-height: 1.6; }
.cupom-card .cupom-feedback { font-size: .85rem; }
.feedback-message { display: flex; align-items: flex-start; gap: .65rem; }
.feedback-message > .action-icon { margin-top: .15rem; flex: none; }
.feedback-message > span { min-width: 0; overflow-wrap: anywhere; }
.empty-state { border-radius: var(--radius-lg); background: var(--surface); }
.empty-state > .action-icon { width: 2rem; height: 2rem; margin: 0 auto .75rem; color: var(--link-ink); }
.empty-state > h2 { font-size: 1.1rem; margin: 0 0 .5rem; color: var(--text); }
.empty-state > p { max-width: 48ch; margin-inline: auto; }
.action-feedback {
  position: fixed; bottom: 1.25rem; left: 50%; transform: translateX(-50%);
  z-index: 100; width: max-content; max-width: calc(100vw - 2rem); pointer-events: none;
  border: 1px solid var(--success-ink); border-radius: var(--radius-lg); background: var(--success-soft);
  color: var(--success-ink); padding: .8rem 1rem; box-shadow: var(--shadow-lg);
  font-size: .9rem; font-weight: 600; opacity: 0; overflow-wrap: anywhere;
}
.action-feedback.is-visible { opacity: 1; }
.action-feedback.is-error { border-color: var(--danger-ink); background: var(--danger-soft); color: var(--danger-ink); }
@media (max-width: 900px) {
  .admin-nav-items { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .admin-compact-table tbody > tr > td:first-child { font-size: .95rem; }
  .admin-compact-table tbody > tr > td:first-child::before { font-size: .72rem; }
}
@media (max-width: 639px) {
  .offer-grid:not(.list-layout) .offer-prices { min-height: 3.3rem; }
  .offer-grid:not(.list-layout) .price-old { flex-basis: 100%; }
  /* O espaço que sobra em cada card fica antes dos votos: preço/condições
     variam entre ofertas, mas votos, loja, autor e ações seguem alinhados. */
  .offer-grid:not(.list-layout) .community-rating { margin-top: auto; }
  .offer-grid:not(.list-layout) .offer-footer { margin-top: 0; }
  .offer-grid .offer-card .offer-footer .offer-stats { flex-wrap: nowrap; gap: .2rem .4rem; }
  .offer-footer .offer-stats > .stat { min-height: 44px; font-size: .7rem; }
  .offer-footer .comment-count-label { display: none; }
  .offer-purchase { padding: .85rem; }
  .offer-community-section { padding: .8rem; }
  .cupom-card .cupom-codigo { width: 100%; }
  .editor-section { padding: .8rem; }
  .editor-actions > .btn { flex: 1; }
  .action-feedback { bottom: calc(var(--mobile-nav-height, 58px) + env(safe-area-inset-bottom) + 1rem); }
  body:has(.mobile-offer-action) .action-feedback { bottom: calc(var(--mobile-nav-height, 58px) + var(--mobile-action-height, 64px) + env(safe-area-inset-bottom) + 1rem); }
}
@media (max-width: 360px) {
  .admin-nav-items { grid-template-columns: 1fr; }
  .offer-footer .offer-stats > .stat { font-size: .65rem; gap: .15rem; }
}
/* Cartão no celular: o botão da loja divide a linha com compartilhar e
   comentários. Eram duas faixas só para isso, e o cartão ficava alto demais.
   Os toques continuam com 44px. Abaixo de 360px não sobra largura para os
   três e o rodapé segue em duas linhas. */
@media (min-width: 360px) and (max-width: 639px) {
  .offer-grid:not(.list-layout) .offer-card .offer-footer {
    flex-direction: row; flex-wrap: wrap; align-items: center; gap: .35rem .15rem;
  }
  .offer-grid:not(.list-layout) .offer-card .offer-footer > .btn-cta {
    flex: 1 1 0; width: auto; min-width: 0; min-height: 44px;
  }
  .offer-grid:not(.list-layout) .offer-card .offer-footer > :not(.btn-cta, .offer-stats) { flex: 1 1 100%; }
  .offer-grid:not(.list-layout) .offer-card .offer-footer > .btn-repost { order: 1; }
  .offer-grid:not(.list-layout) .offer-card .offer-footer .offer-stats {
    flex: none; flex-wrap: nowrap; gap: 0; border-top: 0; padding-top: 0;
  }
  .offer-grid:not(.list-layout) .offer-card .offer-stats > .stat {
    min-width: 44px; justify-content: center; padding-inline: .2rem;
  }
  .offer-grid:not(.list-layout) .offer-card .share-label { display: none; }
  .offer-grid:not(.list-layout) .cta-complemento {
    position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px;
    overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; border: 0;
  }
}

/* Página da oferta no celular: nome, loja e preço aparecem sem rolar. A
   trilha vira uma linha só, a foto fica mais baixa e a avaliação desce para
   depois do preço, como já acontece no cartão. A ordem do HTML não muda. */
@media (max-width: 639px) {
  .breadcrumbs ol { flex-wrap: nowrap; overflow-x: auto; scrollbar-width: none; }
  .breadcrumbs li { flex: none; white-space: nowrap; }
  .breadcrumbs li:last-child { flex: 0 1 auto; min-width: 0; overflow: hidden; text-overflow: ellipsis; }
  .offer-detail { gap: .9rem; }
  .offer-detail-media img,
  .offer-detail-media .image-fallback.large {
    aspect-ratio: auto; width: 100%;
    height: 13rem; height: clamp(10rem, 28svh, 15rem);
  }
  .offer-detail-main { display: flex; flex-direction: column; }
  .offer-detail-main > .offer-detail-top { order: 1; margin: .25rem 0 .5rem; }
  .offer-detail-main > :is(.acoes-secundarias, .offer-information) { order: 2; }
}
@media (max-width: 560px) {
  .cupom-card { grid-template-areas: "loja" "corpo" "acao" "feedback"; }
  .cupom-card .cupom-acao { border-top: 1px solid var(--border); }
}

/* Consistent finishing across public pages, account screens and the panel. */
.page-head { padding-block: .35rem .75rem; margin-bottom: 1rem; }
.page-head h1, .admin-page-heading h1, .admin-content > h1 { text-wrap: balance; line-height: 1.2; }
.page-head > p { max-width: 68ch; line-height: 1.65; margin-bottom: .65rem; }
.section-header { align-items: flex-start; gap: .75rem; }
.section-header > div { min-width: 0; }
.section-header h2 { font-weight: 750; letter-spacing: -.025em; }
.section-header p { margin: .35rem 0 0; line-height: 1.55; }
.section-link { display: inline-flex; align-items: center; min-height: 40px; padding: .35rem .55rem; border-radius: var(--radius); }
.section-link:hover { background: var(--primary-fade); text-decoration: none; }
.home-section + .home-section { margin-top: 1.5rem; }
.card, .auth-card, .submit-card, .store-head, .profile-head, .cupom-card { box-shadow: var(--shadow); }
.card > h2, .auth-card > h1, .submit-card > h1 { letter-spacing: -.025em; }
.hero { border: 1px solid var(--header-line); }
.hero h1 { text-wrap: balance; letter-spacing: -.03em; }
.hero-stats { align-items: center; gap: .6rem 1.25rem; }
.chip-card { gap: .4rem; padding: .9rem; min-width: 0; }
.chip-card > strong { line-height: 1.4; }
.chip-card .store-logo { margin-bottom: .15rem; }
.chip-card:hover { background: var(--surface-alt); }
.offer-card .offer-image { border-bottom: 1px solid var(--border); }
.offer-card .offer-title { font-weight: 650; }
.offer-detail-media { min-width: 0; }
.offer-detail-media img { border-radius: var(--radius); }
.offer-detail-main h1 { line-height: 1.35; letter-spacing: -.025em; }
.offer-information { border-top: 1px solid var(--border); padding-top: 1rem; margin-top: .75rem; }
.offer-information:empty { display: none; }
.offer-description p { line-height: 1.7; }
.offer-purchase .price-context { margin-top: .3rem; }
.offer-community-section .comment-head { gap: .4rem .6rem; line-height: 1.5; }
.offer-community-section .comment-body { line-height: 1.65; }
.comment-action-panel { margin-bottom: .35rem; }
.pagination { gap: .45rem; }
.page-link { display: inline-flex; align-items: center; justify-content: center; min-width: 40px; min-height: 40px; font-weight: 600; }
.page-link.active { box-shadow: var(--shadow); }
.breadcrumbs { line-height: 1.7; }

main :is(input, select, textarea):focus {
  border-color: var(--primary); box-shadow: 0 0 0 3px var(--primary-fade);
}
main :is(input, select, textarea):disabled { background: var(--surface-alt); color: var(--text-soft); cursor: not-allowed; }
main :is(input[type="checkbox"], input[type="radio"]) { accent-color: var(--primary); }
.btn { line-height: 1.4; }
.btn:disabled { cursor: not-allowed; transform: none; box-shadow: none; }
.btn-ghost { border-color: transparent; }
.auth-card .auth-alt { padding-top: .85rem; border-top: 1px solid var(--border); }
.submit-tips { line-height: 1.65; }
.alert-item, .notification-list li, .ranking-list li { padding: .9rem 1rem; }
.notification-list { gap: .65rem; }
.notification-list li.unread { border-left-color: var(--primary); background: var(--primary-fade); }
.notification-list time { margin-top: .3rem; }
.notification-toolbar { display: flex; flex-wrap: wrap; align-items: center; gap: .5rem; }
.notification-toolbar form, .notification-remove { margin: 0; }
.notification-list li { flex-direction: row; align-items: flex-start; justify-content: space-between; gap: .75rem; }
.notification-content { display: flex; flex-direction: column; gap: .2rem; min-width: 0; overflow-wrap: anywhere; }
.notification-remove { flex: none; }
.notification-remove .btn { white-space: nowrap; }
.role-change-form { display: flex; flex-wrap: wrap; align-items: center; gap: .4rem; }
.badge-card { gap: .5rem; }
.badge-card.earned { background: var(--accent-soft); color: var(--accent-ink); }

.admin-topline { margin-bottom: .7rem; }
.admin-page-heading { margin-bottom: 1rem; }
.admin-back-link { display: inline-flex; align-items: center; min-height: 36px; margin-right: .75rem; }
.admin-filters { gap: .75rem; background: var(--surface-alt); box-shadow: none; }
.admin-content .data-table th { padding-block: .85rem; }
.admin-content .data-table td { padding-block: .85rem; line-height: 1.55; }
.kpi { padding: 1rem; display: flex; flex-direction: column; gap: .5rem; }
.kpi-value { font-variant-numeric: tabular-nums; }
.kpi-label { line-height: 1.5; }
.kpi-warn { background: var(--warning-soft); color: var(--warning-ink); border-color: var(--border); border-top-color: var(--warning-ink); }
.kpi-danger { background: var(--danger-soft); color: var(--danger-ink); border-color: var(--border); border-top-color: var(--danger-ink); }
.kpi-warn .kpi-label { color: var(--warning-ink); }
.kpi-danger .kpi-label { color: var(--danger-ink); }
.editor-section { background: var(--surface-alt); }
.editor-section > label { font-weight: 600; }
.editor-section .muted { font-weight: 400; }
.catalog-product-row { padding-block: 1rem; }
.site-footer .footer-links { gap: .5rem; }
.site-footer .muted { color: var(--footer-muted); }
/* --------------------------------------------------------------------------
   Foco nunca escondido atrás das barras fixas (WCAG 2.4.11)
   --------------------------------------------------------------------------
   O cabeçalho fica preso no topo e, no celular, a barra de navegação (e a da
   oferta) presas embaixo. Andando com Tab, o item focado parava inteiro atrás
   delas -- 9 vezes só na home do celular. Com a margem de rolagem, o item
   "ocupa" também a altura das barras, e o navegador rola até ele aparecer
   inteiro, fora delas. */
:root { --folga-topo: 8rem; --folga-base: 1rem; }
@media (max-width: 639.98px) {
  :root { --folga-topo: 10.75rem; --folga-base: calc(58px + env(safe-area-inset-bottom, 0px) + 1rem); }
  body.has-mobile-offer-action { --folga-base: calc(58px + 76px + env(safe-area-inset-bottom, 0px) + 1rem); }
}
:is(a, button, input, select, textarea, summary, [tabindex]):focus-visible {
  scroll-margin-top: var(--folga-topo);
  scroll-margin-bottom: var(--folga-base);
}
/* Tela muito baixa (zoom de 400% num notebook, celular deitado): com as barras
   presas sobravam 16px para o conteúdo -- na página da oferta, nada. Abaixo de
   500px de altura elas voltam ao fluxo normal da página. */
@media (max-height: 500px) {
  .site-header, .mobile-nav, .mobile-offer-action { position: static; }
  :root, body.has-mobile-offer-action { --folga-topo: 1rem; --folga-base: 1rem; }
  body.has-mobile-offer-action .main, .main { padding-bottom: 1.5rem; }
}
html:has(.admin-body) { scroll-behavior: auto; }
details.cupom-explicacao { display: block; }
details.cupom-explicacao > summary { cursor: pointer; font-weight: 700; }
details.cupom-explicacao[open] > summary { margin-bottom: .75rem; }
.job-details > summary, .dashboard-secondary > summary, .coupon-editor > summary { cursor: pointer; font-weight: 700; }
.job-details[open] > summary, .dashboard-secondary[open] > summary, .coupon-editor[open] > summary { margin-bottom: 1rem; }
.site-footer .footer-links a:hover { color: var(--on-brand); }
@media (max-width: 639px) {
  .page-head { padding-bottom: .4rem; }
  .section-header { gap: .5rem; }
  .section-link { padding-inline: .35rem; font-size: .8rem; }
  .home-section + .home-section { margin-top: 1.15rem; }
  .chip-card { padding: .75rem; }
  .offer-community-section .comment-head time { flex-basis: 100%; margin-left: 0; }
  .offer-information { padding-top: .8rem; }
  .pagination .page-link { min-width: 44px; min-height: 44px; }
  .auth-card, .submit-card { padding: 1.1rem; }
  .admin-filters { padding: .8rem; }
  .kpi { padding: .85rem; }
  .kpi-value { font-size: 1.5rem; }
  .alert-item, .notification-list li { padding: .8rem; }
}
/* Purchase restrictions must remain readable before a direct store click. */
.offer-price-conditions { display: block; width: 100%; font-size: .8125rem; line-height: 1.4; color: var(--text); overflow-wrap: anywhere; white-space: normal; }
.feedback-text { white-space: pre-wrap; overflow-wrap: anywhere; }
@media (max-width: 640px) {
  .offer-card .offer-title { -webkit-line-clamp: 3; }
}

/* Atalhos para criar alerta: busca vazia e página da oferta. */
.busca-vazia-acoes {
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
  gap: .5rem;
  margin-top: 1rem;
}
.busca-vazia-acoes .btn { display: inline-flex; align-items: center; gap: .4rem; }
.busca-vazia-acoes .action-icon { width: 1rem; height: 1rem; }
.acoes-secundarias { display: flex; flex-wrap: wrap; gap: .5rem; }
.acoes-secundarias .stat-alerta {
  display: inline-flex;
  align-items: center;
  gap: .4rem;
  padding: .45rem .8rem;
  border: 1px solid var(--border);
  border-radius: var(--radius);
  font-weight: 600;
  text-decoration: none;
}
.acoes-secundarias .stat-alerta .action-icon { width: 1rem; height: 1rem; }

/* Meu perfil: motivo da recusa no cartão da oferta do autor. */
.motivo-recusa {
  margin: 0 0 .4rem;
  font-size: .8rem;
  line-height: 1.4;
  color: var(--danger);
}

/* Respostas a comentários: um nível, recuadas sob o comentário respondido. */
.comment-replies {
  list-style: none;
  margin: .75rem 0 0;
  padding: 0 0 0 .9rem;
  border-left: 2px solid var(--border);
  display: flex;
  flex-direction: column;
  gap: .7rem;
}
.comment-reply { padding: .55rem .7rem; }
.comment-reply-box { margin-top: .5rem; }
.comment-reply-box > summary {
  display: inline-flex;
  align-items: center;
  gap: .35rem;
  cursor: pointer;
  font-weight: 600;
  font-size: .85rem;
  color: var(--link-ink, var(--primary));
  list-style: none;
}
.comment-reply-box > summary::-webkit-details-marker { display: none; }
.comment-reply-box > summary .action-icon { width: 1rem; height: 1rem; }
.comment-reply-box .comment-form { margin: .5rem 0 0; }

/* Painel do moderador: cada fila com o número em destaque. */
.fila-de-trabalho { margin: 1rem 0 1.25rem; }
.fila-de-trabalho > h2 { font-size: 1.05rem; margin: 0 0 .6rem; }
.fila-de-trabalho-grade {
  display: grid; gap: .7rem; grid-template-columns: repeat(auto-fill, minmax(min(100%, 190px), 1fr));
}
.fila-item { color: var(--text); min-height: 44px; }
.fila-item:hover { text-decoration: none; box-shadow: var(--shadow-lg); }
.fila-item:focus-visible { outline: 2px solid var(--primary); outline-offset: 2px; }
.fila-titulo { font-weight: 700; font-size: .92rem; }
.fila-vazia { border-top-color: var(--border); }
.fila-vazia .kpi-value { color: var(--text-muted); }

/* Recusa com motivos prontos: o texto do motivo é o que o autor recebe. */
.motivos-de-recusa { border: 0; margin: 0; padding: 0; display: grid; gap: .1rem; }
.motivos-de-recusa legend { font-weight: 700; font-size: .82rem; margin-bottom: .25rem; padding: 0; }
.motivos-de-recusa .radio {
  display: flex; align-items: flex-start; gap: .45rem; min-height: 36px; padding: .3rem 0;
  font-size: .82rem; line-height: 1.35; cursor: pointer;
}
.motivos-de-recusa .radio input { margin-top: .15rem; flex: none; }
.reject-form > label > span { display: block; font-size: .8rem; font-weight: 600; margin-bottom: .2rem; }
.mod-actions .reject-form { width: min(360px, calc(100vw - 3rem)); }
/* No computador o formulário abre por cima, como um menu: dentro da coluna
   de ações ele alargava a coluna e espremia o texto da oferta. */
@media (min-width: 640px) {
  .mod-actions details > .reject-form {
    position: absolute; right: 0; top: calc(100% + .3rem); z-index: 20;
    width: 360px; max-width: none;
    background: var(--surface); box-shadow: var(--shadow-lg);
  }
}

/* Lista de ofertas do painel no celular: a primeira tela era toda de filtro
   e ação em lote. Os filtros cabem numa linha (os campos já têm nome para
   leitor de tela) e a ação em lote só aparece, fixa embaixo, quando há
   oferta marcada. Sem JavaScript o formulário de lote continua no lugar. */
@media (max-width: 639px) {
  .admin-content .admin-filters.filtros-ofertas {
    display: grid; grid-template-columns: minmax(0, 1fr) 44px;
    align-items: center; gap: .4rem; padding: .5rem;
  }
  .admin-filters.filtros-ofertas > label { width: auto; margin: 0; }
  .admin-filters.filtros-ofertas > label:first-child { grid-column: 1 / -1; }
  .admin-filters.filtros-ofertas > label > span,
  .admin-filters.filtros-ofertas > button > span {
    position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px;
    overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; border: 0;
  }
  .admin-filters.filtros-ofertas :is(input, select) { width: 100%; min-height: 44px; }
  .admin-filters.filtros-ofertas > button { width: 44px; min-height: 44px; padding: 0; justify-content: center; }
  .admin-content .admin-filters.lote-dinamico:not(.com-selecao) { display: none; }
  .admin-content .admin-filters.lote-dinamico.com-selecao {
    position: fixed; left: .5rem; right: .5rem; z-index: 45;
    bottom: calc(var(--mobile-nav-height, 58px) + env(safe-area-inset-bottom, 0px) + .5rem);
    display: grid; grid-template-columns: minmax(0, 1fr) auto; align-items: center; gap: .4rem .5rem;
    padding: .6rem; background: var(--surface); border: 1px solid var(--border-strong);
    border-radius: var(--radius-lg); box-shadow: var(--shadow-lg);
  }
  .admin-filters.lote-dinamico.com-selecao > label { display: block; width: auto; margin: 0; font-size: .78rem; }
  .admin-filters.lote-dinamico.com-selecao > label > select { display: block; width: 100%; margin-top: .2rem; min-height: 44px; }
  .admin-filters.lote-dinamico.com-selecao > .batch-summary { grid-column: 1 / -1; grid-row: 2; font-size: .75rem; }
  .admin-filters.lote-dinamico.com-selecao > button { align-self: end; min-height: 44px; }
  body:has(.lote-dinamico.com-selecao) .admin-content { padding-bottom: 9rem; }
}

/* Tabela de usuários: menos colunas para as ações caberem sem quebrar
   "Bloquear" no meio nem cortar o seletor de papel. */
.tabela-usuarios .nowrap, .tabela-usuarios .btn { white-space: nowrap; }
.tabela-usuarios td[data-label="Usuário"] { overflow-wrap: anywhere; }
@media (min-width: 901px) {
  /* A coluna do usuário fica com a sobra, e a tabela ocupa o cartão todo. */
  .tabela-usuarios :is(th, td):first-child { width: 100%; }
}
.tabela-usuarios .role-change-form { flex-direction: column; align-items: stretch; gap: .3rem; }
.tabela-usuarios .role-change-form select { width: auto; min-width: 8.5rem; }

/* Configurações em abas: uma seção por vez. */
.abas-configuracao {
  display: flex; gap: .3rem; flex-wrap: wrap; margin: .25rem 0 1rem;
  border-bottom: 1px solid var(--border); padding-bottom: .5rem;
}
.abas-configuracao a {
  display: inline-flex; align-items: center; min-height: 40px; padding: .35rem .8rem;
  border-radius: var(--radius); color: var(--text-soft); font-weight: 600; font-size: .9rem;
}
.abas-configuracao a:hover { background: var(--surface-alt); text-decoration: none; }
.abas-configuracao a.active { background: var(--primary-fade); color: var(--link-ink, var(--primary)); }

/* O que falta configurar. */
.lista-configuracao > h2 { font-size: 1.05rem; }
.itens-configuracao { list-style: none; margin: .5rem 0; padding: 0; display: grid; gap: .6rem; }
.itens-configuracao > li { display: flex; gap: .6rem; align-items: flex-start; }
.itens-configuracao p { margin: .15rem 0 .1rem; }
.itens-configuracao .tag { margin-left: .35rem; font-size: .68rem; vertical-align: middle; }
.item-estado {
  flex: none; width: 1.5rem; height: 1.5rem; border-radius: 50%;
  display: inline-flex; align-items: center; justify-content: center; font-weight: 800; font-size: .8rem;
}
.item-pronto .item-estado { background: var(--success-soft); color: var(--success-ink); }
.item-faltando .item-estado { background: var(--warn-soft); color: var(--warn); }

/* Cartões lado a lado dividem as mesmas linhas: foto, data, título, preço,
   votos, loja/autor e botões. Antes a sobra de espaço ia toda para antes dos
   votos, o que só alinhava quando um único bloco mudava de altura; com
   "Pagamento no Pix" num cartão e "Cupom" no outro, as diferenças se
   compensavam e votos e loja saíam desalinhados. Com subgrid cada linha tem
   a altura da maior entre os cartões da mesma fileira. */
@supports (grid-template-rows: subgrid) {
  .offer-grid:not(.list-layout) > .offer-card {
    display: grid; grid-row: span 7; grid-template-rows: subgrid; row-gap: 0; height: auto;
  }
  .offer-grid:not(.list-layout) > .offer-card > .offer-body {
    display: grid; grid-row: span 6; grid-template-rows: subgrid;
  }
  .offer-grid:not(.list-layout) > .offer-card .community-rating { margin-top: 0; }
  /* Loja em cima e autor embaixo, mesmo quando um cartão tem etiqueta a mais. */
  .offer-grid:not(.list-layout) > .offer-card .offer-tags { align-content: space-between; }
  .offer-grid:not(.list-layout) > .offer-card .offer-author { flex-basis: 100%; }
  .offer-grid:not(.list-layout) > .offer-card .offer-tags > .store-chip { align-self: flex-start; }
}

/* Denunciar comentário: só a bandeira no canto do cabeçalho; o formulário
   abre por cima, como um menu, sem empurrar os comentários de baixo. */
.comment-report { position: relative; }
.comment-report > summary {
  list-style: none; cursor: pointer; display: inline-flex; align-items: center; justify-content: center;
  width: 36px; height: 36px; border-radius: 50%; color: var(--text-muted);
}
.comment-report > summary::-webkit-details-marker { display: none; }
.comment-report > summary:hover,
.comment-report[open] > summary { background: var(--surface-alt); color: var(--danger-ink, var(--danger)); }
.comment-report > summary:focus-visible { outline: 2px solid var(--primary); outline-offset: 2px; }
.comment-report > .comment-action-panel {
  position: absolute; right: 0; top: calc(100% + .3rem); z-index: 20;
  width: min(320px, calc(100vw - 2.5rem)); margin: 0;
  background: var(--surface); box-shadow: var(--shadow-lg); font-size: .9rem;
}
@media (max-width: 639px) {
  .comment-report > summary { width: 44px; height: 44px; }
}
/* Horário e bandeira andam juntos, sempre à direita, mesmo quando o
   cabeçalho quebra a linha no celular. */
.comment-head-fim { margin-left: auto; display: inline-flex; align-items: center; gap: .25rem; }
.comment-head-fim > time { margin-left: 0; }
.comment-report > summary { -webkit-tap-highlight-color: transparent; }
.comment-report > .comment-action-panel {
  scroll-margin-top: 1rem;
  scroll-margin-bottom: calc(var(--mobile-nav-height, 58px) + var(--mobile-action-height, 76px) + env(safe-area-inset-bottom, 0px) + 1rem);
}
