/* Fontes servidas do próprio site (19/09/2026, Fase A de segurança/LGPD).
   Antes vinham de fonts.googleapis.com / fonts.gstatic.com: o navegador de
   TODA visitante conectava no Google (entregando o IP dela) antes mesmo do
   banner de cookies, e o site dependia de um terceiro pra desenhar o texto.
   São as mesmas famílias, agora em assets/fonts/ — Montserrat (texto) e
   Playfair Display (títulos), ambas com licença aberta (SIL OFL). Só o
   subconjunto "latin", que cobre todo o português (acentos, cedilha, til).
   Cada arquivo é uma fonte variável: um único .woff2 atende todos os pesos
   declarados. Se um dia trocar um arquivo, mude também o nome dele — o cache
   é de 1 ano (ver .htaccess). */
@font-face {
  font-family: 'Montserrat';
  font-style: normal;
  font-weight: 400 700;
  font-display: swap;
  src: url('../fonts/montserrat-latin.woff2') format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
  font-family: 'Playfair Display';
  font-style: normal;
  font-weight: 500 700;
  font-display: swap;
  src: url('../fonts/playfair-display-latin.woff2') format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
  font-family: 'Playfair Display';
  font-style: italic;
  font-weight: 500 600;
  font-display: swap;
  src: url('../fonts/playfair-display-italic-latin.woff2') format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}

/*
 * estilo.css — folha de estilo única da loja OXUAI.
 *
 * Paleta extraída das logos que a lojista enviou em 01/09/2026 (fundo creme
 * e dourado em degradê, do bronze escuro ao dourado claro). Se a marca
 * ganhar um manual de marca mais formal depois, com códigos de cor
 * oficiais, é só trocar os valores aqui em cima — o resto do site todo usa
 * essas variáveis, não cor "chumbada" espalhada pelos arquivos.
 */

:root {
  /* Fundo e superfícies */
  --cor-fundo: #EBE7E4;         /* mesmo tom de fundo das logos */
  --cor-fundo-clara: #F7F5F2;   /* cards e blocos de conteúdo, mais clara que o fundo geral */
  --cor-branco: #FFFFFF;

  /* Texto */
  --cor-texto: #2E2A26;         /* quase preto, tom quente (não preto puro) */
  --cor-texto-suave: #6B6560;   /* legendas, texto secundário */

  /* Dourado da marca (degradê extraído das logos) */
  --cor-dourado-escuro: #8D5A1B;
  --cor-dourado: #A6712D;       /* uso sólido: preço, botão, links em destaque */
  --cor-dourado-claro: #D9B36B;
  --cor-dourado-brilho: #F4D78D; /* só pra detalhe pequeno/brilho, nunca texto grande */
  --degrade-dourado: linear-gradient(135deg, var(--cor-dourado-escuro), var(--cor-dourado) 55%, var(--cor-dourado-brilho));

  /* Bordas e divisores */
  --cor-borda: #DDD6CB;

  /* Estados */
  --cor-sucesso: #4B7A51;
  --cor-erro: #A64B3B;
  --cor-aviso-fundo: #F4E9D6;

  /* Tipografia */
  --fonte-base: 'Montserrat', system-ui, -apple-system, sans-serif;
  /* Fonte de destaque pros títulos (06/09/2026): uma serifada elegante,
     de traço fino/grosso, que conversa com o traçado manuscrito e dourado
     da logo da marca — a Montserrat (sem serifa, mais neutra) continua
     sendo usada no corpo do texto, menus e botões, seguindo a prática
     comum de e-commerce de moda de combinar 2 fontes: uma de destaque
     (títulos) e uma de trabalho (leitura/interface). */
  --fonte-display: 'Playfair Display', Georgia, 'Times New Roman', serif;

  /* Espaçamento (escala simples, múltiplos de 4px) */
  --esp-1: 4px; --esp-2: 8px; --esp-3: 12px; --esp-4: 16px;
  --esp-5: 24px; --esp-6: 32px; --esp-7: 48px; --esp-8: 64px;

  --raio: 10px;
  --raio-pequeno: 6px;
  --sombra: 0 2px 12px rgba(46, 42, 38, 0.08);
  --sombra-forte: 0 8px 28px rgba(46, 42, 38, 0.14);
}

* { box-sizing: border-box; }
html { scroll-behavior: smooth; }
body {
  margin: 0;
  font-family: var(--fonte-base);
  background: var(--cor-fundo);
  color: var(--cor-texto);
  line-height: 1.55;
  -webkit-font-smoothing: antialiased;
}
img { max-width: 100%; display: block; }
a { color: inherit; text-decoration: none; }
h1, h2, h3, h4 { margin: 0 0 var(--esp-3); font-family: var(--fonte-display); font-weight: 600; letter-spacing: -0.01em; line-height: 1.15; }
p { margin: 0 0 var(--esp-3); }
button { font-family: inherit; cursor: pointer; }
.container {
  max-width: 1180px;
  margin: 0 auto;
  padding: 0 var(--esp-4);
}

/* ------------------------------- Cabeçalho ------------------------------- */
.cabecalho {
  background: var(--cor-branco);
  border-bottom: 1px solid var(--cor-borda);
  position: sticky;
  top: 0;
  z-index: 50;
}
.cabecalho .container {
  display: flex;
  align-items: center;
  justify-content: space-between;
  padding-top: var(--esp-3);
  padding-bottom: var(--esp-3);
  gap: var(--esp-4);
}
.cabecalho .logo img { height: 32px; width: auto; } /* altura de logo comum em headers de e-commerce de moda (28–40px) */
.cabecalho .acoes { display: flex; align-items: center; gap: var(--esp-4); }
.cabecalho .busca-mobile,
.cabecalho .menu-mobile { display: none; }

/* Busca sempre visível (desktop) — campo + botão de lupa colados, no
   espaço entre a logo e os ícones da direita (07/09/2026). */
.cabecalho .busca-cabecalho {
  display: flex;
  flex: 1;
  max-width: 420px;
  margin: 0 var(--esp-5);
}
.cabecalho .busca-cabecalho input[type=search] {
  flex: 1;
  min-width: 0;
  padding: 9px 14px;
  border-radius: var(--raio-pequeno) 0 0 var(--raio-pequeno);
  border: 1px solid var(--cor-borda);
  border-right: none;
  background: var(--cor-fundo-clara);
  font-family: inherit;
  font-size: 13px;
  color: var(--cor-texto);
}
.cabecalho .busca-cabecalho button {
  display: flex;
  align-items: center;
  justify-content: center;
  padding: 9px 16px;
  border-radius: 0 var(--raio-pequeno) var(--raio-pequeno) 0;
  border: 1px solid var(--cor-borda);
  background: var(--cor-fundo-clara);
  color: var(--cor-texto); /* 11/09/2026: ícone de lupa (SVG) na cor da marca, no lugar do emoji 🔍 padrão do sistema */
}
.cabecalho .busca-cabecalho button:hover { color: var(--cor-dourado); }

/* Busca expandida do celular — mesma barra, some/aparece com [hidden]
   (mesmo padrão do menu mobile, ver .nav-mobile mais abaixo). */
.busca-mobile-expandida { display: none; padding: var(--esp-3) var(--esp-4); gap: var(--esp-2); border-top: 1px solid var(--cor-borda); }
.busca-mobile-expandida input[type=search] {
  flex: 1;
  padding: 10px 14px;
  border-radius: var(--raio-pequeno);
  border: 1px solid var(--cor-borda);
  font-family: inherit;
  /* 16px, não 14px (Fase A da auditoria mobile, 14/09/2026): abaixo de
     16px o Safari do iPhone dá zoom automático ao tocar no campo — mesma
     regra que .campo-formulario já segue no checkout. */
  font-size: 16px;
}
.busca-mobile-expandida button {
  display: flex;
  align-items: center;
  justify-content: center;
  padding: 0 16px;
  border-radius: var(--raio-pequeno);
  border: 1px solid var(--cor-borda);
  background: var(--cor-fundo-clara);
  color: var(--cor-texto);
}

/* Barra de categorias — segunda linha do cabeçalho. Fundo trocado em
   14/09/2026 (pedido da lojista: o preto/quase-preto de antes, var(--cor-texto),
   estava "muito pro preto", sem relação com a marca) pro dourado escuro do
   design system — branco continua com ótimo contraste em cima dele (~5,8:1,
   WCAG). Referência: menu da Stril Brand que a lojista mandou (Home, Ver
   Tudo, categorias uma a uma, Sale no fim). */
.cabecalho .nav-desktop {
  display: flex;
  align-items: center;
  justify-content: center; /* 14/09/2026 (pedido da lojista): menu centralizado, antes ficava alinhado à esquerda */
  flex-wrap: wrap;
  /* Nunca "overflow-x: auto" aqui: como o dropdown do "Ver Tudo" é
     posicionado abaixo desta barra (position: absolute), um scroll
     horizontal nela cortaria o dropdown pela metade (a regra do CSS: definir
     um eixo de overflow diferente de "visible" faz o outro eixo também
     deixar de ser "visible"). Categoria demais simplesmente quebra pra uma
     segunda linha (flex-wrap: wrap) em vez de cortar. */
  gap: var(--esp-2) var(--esp-5);
  font-size: 13px;
  letter-spacing: 0.04em;
  text-transform: uppercase;
  background: var(--cor-dourado-escuro);
  color: #fff;
  padding: var(--esp-1) var(--esp-4);
}
.cabecalho .nav-desktop a { display: inline-block; padding: var(--esp-3) 0; }
.cabecalho .nav-desktop a:hover { opacity: 0.8; }
.cabecalho .nav-desktop .link-sale { color: var(--cor-dourado-brilho); font-weight: 700; }

.item-ver-tudo { position: relative; }
.botao-ver-tudo {
  background: none;
  border: none;
  color: inherit;
  font-family: inherit;
  font-size: 13px;
  letter-spacing: 0.04em;
  text-transform: uppercase;
  cursor: pointer;
  padding: var(--esp-3) 0;
  display: flex;
  align-items: center;
  gap: 4px;
}
.botao-ver-tudo::after { content: '▾'; font-size: 9px; }
.dropdown-categorias {
  position: absolute;
  top: 100%;
  left: 0;
  margin-top: 1px;
  background: var(--cor-branco);
  border: 1px solid var(--cor-borda);
  border-radius: 0 0 var(--raio-pequeno) var(--raio-pequeno);
  box-shadow: var(--sombra-forte);
  min-width: 200px;
  padding: var(--esp-2) 0;
  display: flex;
  flex-direction: column;
  opacity: 0;
  visibility: hidden;
  transform: translateY(4px);
  transition: opacity 0.15s ease, transform 0.15s ease;
  z-index: 60;
}
.dropdown-categorias a {
  padding: var(--esp-2) var(--esp-4) !important;
  font-size: 13px;
  text-transform: none;
  letter-spacing: normal;
  color: var(--cor-texto);
}
.dropdown-categorias a:hover { background: var(--cor-fundo-clara); opacity: 1; }
.item-ver-tudo:hover .dropdown-categorias,
.item-ver-tudo:focus-within .dropdown-categorias,
.item-ver-tudo.aberto .dropdown-categorias {
  opacity: 1;
  visibility: visible;
  transform: translateY(0);
}

@media (max-width: 780px) {
  .cabecalho .busca-cabecalho { display: none; }
  .cabecalho .nav-desktop { display: none; }
  .busca-mobile-expandida:not([hidden]) { display: flex; }
  /* 12/09/2026: "inline-flex" (não "block") pra manter o ícone (lupa ou
     hambúrguer) centralizado dentro do botão — ver .cabecalho .acoes
     button.menu-mobile mais abaixo, que cuida do resto do estilo desse
     botão mas não pode mais definir o "display" (ver comentário lá). */
  .cabecalho .menu-mobile { display: inline-flex; }
  .cabecalho .logo img { height: 26px; }
}

/* --------------------------------- Botões --------------------------------- */
.botao {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: var(--esp-2);
  padding: 13px 28px;
  border-radius: 999px;
  font-size: 14px;
  font-weight: 600;
  letter-spacing: 0.04em;
  text-transform: uppercase;
  border: 1px solid transparent;
  transition: transform 0.15s ease, box-shadow 0.15s ease, opacity 0.15s ease;
}
.botao-primario {
  background: var(--degrade-dourado);
  color: #fff;
  box-shadow: var(--sombra);
}
.botao-primario:hover { transform: translateY(-1px); box-shadow: var(--sombra-forte); }
.botao-secundario {
  background: transparent;
  border-color: var(--cor-texto);
  color: var(--cor-texto);
}
.botao-secundario:hover { background: var(--cor-texto); color: #fff; }
.botao:disabled { opacity: 0.5; cursor: not-allowed; transform: none !important; }

/* --------------------------------- Selos/badges --------------------------------- */
.selo {
  display: inline-block;
  padding: 4px 10px;
  border-radius: 999px;
  font-size: 11px;
  font-weight: 700;
  letter-spacing: 0.05em;
  text-transform: uppercase;
}
.selo-urgencia { background: #F4E4C9; color: #8A5A12; }
.selo-esgotado { background: #ECE7E2; color: var(--cor-texto-suave); }
.selo-novo { background: var(--cor-texto); color: #fff; }
.selo-sale { background: var(--cor-erro); color: #fff; } /* 07/09/2026, página Sale do menu */

/* Preço original riscado + preço promocional em destaque (07/09/2026,
   página Sale do menu — mesmo padrão visual usado por lojas grandes: preço
   "de" pequeno e riscado, preço "por" grande e na cor de alerta). */
.preco-de-riscado { font-size: 12px; color: var(--cor-texto-suave); text-decoration: line-through; }
.cartao-produto .preco.preco-promocional,
.opcoes-produto .preco-grande.preco-promocional { color: var(--cor-erro); }

/* --------------------------------- Vitrine/Hero --------------------------------- */
.hero {
  background: var(--cor-fundo-clara);
  padding: var(--esp-8) 0;
  text-align: center;
}
.hero .subtitulo {
  font-size: 13px;
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: var(--cor-dourado);
  margin-bottom: var(--esp-3);
}
.hero h1 {
  font-size: clamp(32px, 6vw, 58px);
  font-weight: 600;
  max-width: 720px;
  margin-left: auto;
  margin-right: auto;
}
/* Palavra de destaque dentro do título (itálico + dourado), pra ecoar o
   traçado manuscrito da logo sem usar uma fonte de script inteira (que
   pesa a leitura em títulos grandes). */
.hero h1 em, .hero-conteudo h1 em {
  font-style: italic;
  font-weight: 500;
  color: var(--cor-dourado-escuro);
}
.hero-conteudo h1 em { color: var(--cor-dourado-brilho); }
.hero p.descricao {
  max-width: 520px;
  margin: 0 auto var(--esp-5);
  color: var(--cor-texto-suave);
  /* Mesma família de destaque do título (itálico, mais leve), pra soar
     como uma continuação do H1 em vez de um texto de corpo qualquer —
     igual estilo do "autenticamente você" logo acima. */
  font-family: var(--fonte-display);
  font-style: italic;
  font-weight: 500;
  font-size: clamp(17px, 2.4vw, 21px);
  line-height: 1.45;
}
.slogan-marca {
  font-style: italic;
  font-weight: 500;
  font-size: clamp(15px, 1.8vw, 19px);
  color: var(--cor-dourado);
  margin-bottom: var(--esp-4);
}
.hero-conteudo .slogan-marca { color: var(--cor-dourado-brilho); }

/* --------------------------------- Hero com foto (banner único ou carrossel) --------------------------------- */
.hero-com-foto { padding: 0; }
/* 11/09/2026: antes o carrossel tinha uma altura fixa em tela (62vh no
   celular, 68vh no desktop) e a foto era cortada (object-fit: cover) pra
   preencher essa altura — funcionava bem com fotos de modelo em retrato,
   mas cortava banners prontos com texto desenhado perto da borda. Trocado
   por uma altura calculada a partir da largura (aspect-ratio), na mesma
   proporção dos banners atuais (851x315), pra caber a imagem inteira, sem
   cortar nada, em qualquer largura de tela (celular ou desktop). Se um
   banner futuro vier numa proporção diferente, o `object-fit: contain`
   abaixo garante que ele aparece inteiro do mesmo jeito (só sobra uma
   faixinha da cor de fundo dos dois lados ou em cima/embaixo, em vez de
   cortar ou esticar a imagem). */
.hero-carrossel {
  position: relative;
  overflow: hidden;
  width: 100%;
  max-width: 1900px; /* 11/09/2026: trava a largura em telas de desktop muito grandes (ultrawide, TV como monitor etc.) — sem isso, o banner (foto de 1800px de largura) precisava esticar além do tamanho real dela pra preencher a tela toda, o que deixa a imagem borrada. Até 1900px de tela, continua ocupando 100% da largura, igual antes. */
  margin: 0 auto;
  aspect-ratio: 851 / 315;
  background: var(--cor-fundo-clara);
}
/* 12/09/2026: no celular, a caixa do carrossel vira vertical (proporção
   4:5, igual à foto vertical que a lojista mandou — ver 'arquivo_mobile'
   em hero_fotos.php), em vez da mesma proporção larga do desktop. Isso é
   o que faz o banner ocupar mais da metade da tela no celular (antes
   ficava bem curto). Acima de 700px de largura de tela (tablet/desktop),
   volta pra proporção larga de sempre. */
@media (max-width: 699px) {
  .hero-carrossel { aspect-ratio: 4 / 5; }
}

.hero-slides { position: absolute; inset: 0; }
.hero-slide {
  position: absolute;
  inset: 0;
  opacity: 0;
  transition: opacity 0.8s ease;
  pointer-events: none; /* 07/09/2026: só o slide "ativo" (visível) deve poder ser clicado — sem isso, o slide seguinte (invisível, esperando a vez) ficava por cima capturando o clique */
}
.hero-slide.ativo { opacity: 1; pointer-events: auto; }
.hero-slide img { width: 100%; height: 100%; object-fit: contain; object-position: 50% 50%; display: block; } /* 11/09/2026: trocado de "cover" (cortava) pra "contain" (mostra a imagem inteira, sem cortar nenhuma borda) — ver comentário em .hero-carrossel acima */
.hero-slide picture { display: block; width: 100%; height: 100%; } /* 11/09/2026: quando o banner tem foto diferente pro celular (ver arquivo_mobile em hero_fotos.php), a <img> vem dentro de uma <picture> — sem isso, o <picture> (inline por padrão) bagunçava a altura do slide */
.hero-slide a { display: block; width: 100%; height: 100%; } /* 07/09/2026: banner clicável (foto com link cadastrado em hero_fotos.php) */

/* Carrossel de "Linhas" (14/09/2026, Fase C do plano inspirado na Stril
   Brand; redesenhado no mesmo dia — a versão original era um slide único
   full-bleed, foto enorme demais na tela). Agora é o mesmo cartão visual
   dos 3 cards de subcategoria (.banner-vitrine, ver mais abaixo), só numa
   fileira que rola de lado — reaproveita a rolagem-com-setas que
   Novidades/Mais compradas já usam (.carrossel-horizontal-wrap/
   .carrossel-horizontal, JS em iniciarCarrosseisHorizontais). Cabem 4
   linhas lado a lado no desktop antes de precisar rolar/clicar na seta
   (ver breakpoints em .banner-vitrine-linha, mais abaixo). */
.carrossel-linhas {
  justify-content: center; /* centraliza quando não enche a fileira toda (1 a 4 linhas). Passou de 4 e precisou rolar, o navegador troca sozinho pro alinhamento padrão (começo), sem precisar de JS pra decidir isso — comportamento normal de flexbox com conteúdo maior que o container. */
}

/* 11/09/2026: o degradê escuro que ficava por cima da foto (só existia pra
   garantir que o texto branco sobreposto, ".hero-conteudo" logo abaixo,
   ficasse legível em qualquer imagem) e o próprio ".hero-conteudo" ficaram
   SEM USO no momento — os banners atuais já vêm com texto e botão prontos,
   desenhados na própria imagem, então nada fica sobreposto por cima deles.
   Mantidos aqui comentados, sem aplicar em nada, caso um dia a loja volte a
   usar fotos "cruas" (sem texto) no hero, precisando desse texto por cima
   de novo — nesse caso, é só voltar a incluir a div ".hero-conteudo" no
   index.php (ver comentário lá) e descomentar as regras abaixo.

.hero-carrossel::before {
  content: "";
  position: absolute;
  inset: 0;
  background: linear-gradient(180deg, rgba(46,42,38,0.15) 0%, rgba(46,42,38,0.55) 100%);
  z-index: 1;
  pointer-events: none;
}

.hero-conteudo {
  position: relative;
  z-index: 2;
  height: 100%;
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  justify-content: flex-end;
  padding-bottom: var(--esp-7);
  text-align: left;
  pointer-events: none;
}
.hero-conteudo a { pointer-events: auto; }
.hero-conteudo .subtitulo { color: var(--cor-dourado-brilho); }
.hero-conteudo h1 { color: var(--cor-branco); }
.hero-conteudo p.descricao { color: rgba(255,255,255,0.92); text-shadow: 0 1px 10px rgba(0,0,0,0.3); }
.hero-conteudo h1 { margin-left: 0; margin-right: 0; text-shadow: 0 2px 16px rgba(0,0,0,0.25); }
.hero-conteudo p.descricao { margin-left: 0; max-width: 480px; }
*/

.hero-seta {
  position: absolute;
  top: 50%;
  transform: translateY(-50%);
  z-index: 3;
  width: 40px;
  height: 40px;
  border-radius: 50%;
  border: none;
  background: rgba(255,255,255,0.85);
  color: var(--cor-texto);
  font-size: 22px;
  line-height: 1;
  cursor: pointer;
  display: flex;
  align-items: center;
  justify-content: center;
}
.hero-seta:hover { background: var(--cor-branco); }
.hero-seta-anterior { left: var(--esp-4); }
.hero-seta-proxima { right: var(--esp-4); }
/* 16/09/2026 (pedido da lojista): as setas agora aparecem também no
   celular — antes só existiam no desktop ("display:none" abaixo de
   640px), deixando quem estava no celular sem jeito nenhum de passar o
   banner manualmente além de esperar a troca automática. Um pouco
   menores nessa largura de tela pra sobrar mais espaço de foto. */
@media (max-width: 640px) {
  .hero-seta { width: 34px; height: 34px; font-size: 19px; }
  .hero-seta-anterior { left: var(--esp-3); }
  .hero-seta-proxima { right: var(--esp-3); }
}

.hero-pontos {
  position: absolute;
  z-index: 3;
  bottom: var(--esp-4);
  right: var(--esp-4);
  display: flex;
  gap: var(--esp-2);
}
.hero-ponto {
  width: 9px;
  height: 9px;
  border-radius: 50%;
  border: none;
  background: rgba(255,255,255,0.5);
  cursor: pointer;
  padding: 0;
}
.hero-ponto.ativo { background: var(--cor-branco); }

/* --------------------------------- Grade de produtos --------------------------------- */
.grade-produtos {
  display: grid;
  grid-template-columns: repeat(2, 1fr);
  gap: var(--esp-4);
}
@media (min-width: 640px) { .grade-produtos { grid-template-columns: repeat(3, 1fr); gap: var(--esp-5); } }
@media (min-width: 980px) { .grade-produtos { grid-template-columns: repeat(4, 1fr); } }

.cartao-produto {
  position: relative; /* 23/09/2026: âncora do botão de compra rápida (ver mais abaixo) */
  background: var(--cor-branco);
  border-radius: var(--raio);
  overflow: hidden;
  box-shadow: var(--sombra);
  transition: transform 0.18s ease, box-shadow 0.18s ease;
}
.cartao-produto:hover { transform: translateY(-3px); box-shadow: var(--sombra-forte); }
.cartao-produto .foto { aspect-ratio: 4 / 5; background: var(--cor-fundo-clara); overflow: hidden; position: relative; }
.cartao-produto .foto img { width: 100%; height: 100%; object-fit: cover; }
.cartao-produto .selo { position: absolute; top: var(--esp-2); left: var(--esp-2); z-index: 2; } /* 23/09/2026: acima da 2ª foto de hover, senão o selo Sale ficaria coberto */
.cartao-produto .info { padding: var(--esp-3) var(--esp-3) var(--esp-4); }
.cartao-produto .categoria { font-size: 11px; text-transform: uppercase; letter-spacing: 0.05em; color: var(--cor-texto-suave); }
.cartao-produto .nome { font-size: 15px; font-weight: 600; margin: 2px 0 6px; }
.cartao-produto .preco { color: var(--cor-dourado-escuro); font-weight: 700; font-size: 16px; }
.cartao-produto .avaliacao { font-size: 12px; color: var(--cor-texto-suave); margin-top: 2px; }
.cartao-produto .cores { display: flex; gap: 4px; margin-top: var(--esp-2); }
.cartao-produto .cor-swatch { width: 14px; height: 14px; border-radius: 50%; border: 1px solid rgba(0,0,0,0.12); }
/* 07/09/2026: o card deixou de ser um único <a> (pra caber o botão "Comprar"
   sem link aninhado dentro de link, que é inválido em HTML) — agora
   ".cartao-produto" é um <div>, ".cartao-produto-link" é o <a> que cobre a
   foto+informações (mesmo destino de sempre), e o botão fica como um
   segundo link, irmão do primeiro, só visível nos carrosséis novos. */
.cartao-produto-link { display: block; }
.botao-comprar-card {
  display: block;
  margin: 0 var(--esp-3) var(--esp-3);
  padding: 12px 0; /* 21/09/2026: era 8px (botão de 35px de altura) — 44px é o tamanho confortável pro polegar */
  border-radius: var(--raio-pequeno);
  background: var(--degrade-dourado);
  color: #fff;
  font-weight: 600;
  font-size: 12px;
  text-transform: uppercase;
  letter-spacing: 0.04em;
  text-align: center;
  transition: opacity 0.15s ease;
}
.botao-comprar-card:hover { opacity: 0.88; }

/* --------------------------------- Filtros --------------------------------- */
/* 14/09/2026 (Fase A do plano de filtros inspirado na Stril Brand): a
   barra horizontal de <select> abaixo foi substituída pelo painel lateral
   .filtros-catalogo/.pagina-catalogo (mais abaixo). Regras mantidas sem
   uso, mesmo padrão já seguido com .selos-confianca-home/.faixa-marca —
   nada além de catalogo.php referenciava .barra-filtros. */
.barra-filtros {
  display: flex;
  flex-wrap: wrap;
  gap: var(--esp-3);
  align-items: center;
  padding: var(--esp-4) 0;
  border-bottom: 1px solid var(--cor-borda);
  margin-bottom: var(--esp-5);
}
.barra-filtros select, .barra-filtros input[type=search] {
  padding: 10px 14px;
  border-radius: var(--raio-pequeno);
  border: 1px solid var(--cor-borda);
  background: var(--cor-branco);
  font-family: inherit;
  font-size: 14px;
}
.barra-filtros input[type=search] { flex: 1; min-width: 160px; }

/* Painel de filtros em coluna lateral (Fase A, 14/09/2026) — ver plano
   publicado em conversa ("Filtros Stril × OXUAI"). Layout só: os mesmos
   parâmetros de URL de sempre (categoria, subcategoria, linha, colecao,
   tamanho, cor), ainda 1 valor escolhido por vez — múltipla escolha fica
   pra Fase B, que muda a leitura em catalogo.php. */
.pagina-catalogo { display: block; }
@media (min-width: 860px) {
  .pagina-catalogo { display: grid; grid-template-columns: 220px 1fr; gap: var(--esp-7); align-items: start; }
}
.filtros-catalogo {
  padding: var(--esp-4) 0 var(--esp-6);
  border-bottom: 1px solid var(--cor-borda);
  margin-bottom: var(--esp-5);
}
@media (min-width: 860px) {
  .filtros-catalogo { padding: 0; border-bottom: none; margin-bottom: 0; }
}
.filtros-catalogo-titulo { font-size: 16px; margin: 0 0 var(--esp-4); }
.filtro-grupo { margin-bottom: var(--esp-5); }
.filtro-grupo:last-of-type { margin-bottom: var(--esp-4); }
.filtro-grupo-rotulo {
  display: block;
  font-size: 11px;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.05em;
  color: var(--cor-texto-suave);
  margin-bottom: var(--esp-2);
}
.filtro-opcao {
  display: flex;
  align-items: center;
  gap: 9px;
  font-size: 14px;
  padding: 5px 0;
  cursor: pointer;
}
.filtro-opcao input[type=checkbox] { width: 15px; height: 15px; accent-color: var(--cor-dourado-escuro); flex-shrink: 0; }
.filtro-swatch { width: 14px; height: 14px; border-radius: 50%; border: 1px solid var(--cor-borda); flex-shrink: 0; }
.filtro-conta { color: var(--cor-texto-suave); font-size: 12px; margin-left: auto; padding-left: var(--esp-2); }

/* Tons dentro de cada família de cor (Fase B do plano de mobile/cores,
   14/09/2026) — legenda pequena logo abaixo do checkbox da família,
   mostrando os nomes específicos cadastrados no painel (Cappuccino,
   Chiclete...) que caem ali dentro. Informação secundária, por isso texto
   pequeno e discreto — a opção de filtro em si é só a família. */
.filtro-tons {
  display: block;
  font-size: 11.5px;
  color: var(--cor-texto-suave);
  padding-left: 24px;
  margin: -3px 0 6px;
  line-height: 1.5;
}
.filtro-tons-dot { display: inline-block; width: 8px; height: 8px; border-radius: 50%; border: 1px solid var(--cor-borda); margin-right: 1px; }
.filtro-tons-dot:first-child { margin-left: 0; }

/* "Ver mais cores" (18/09/2026) — as famílias de cor menos frequentes
   ficam dentro de um <details> (abre com um clique, sem JavaScript
   nenhum), pra lista à vista ficar curta e fácil de escanear. */
.filtro-cores-mais { margin-top: var(--esp-2); }
.filtro-cores-mais > summary {
  cursor: pointer;
  font-size: 13px;
  font-weight: 600;
  color: var(--cor-dourado-escuro);
  padding: 6px 0;
  list-style: none;
}
.filtro-cores-mais > summary::-webkit-details-marker { display: none; }
.filtro-cores-mais > summary::before { content: '+ '; }
.filtro-cores-mais[open] > summary::before { content: '– '; }
.filtro-cores-mais[open] > summary { margin-bottom: var(--esp-1); }
.filtros-limpar { font-size: 13px; font-weight: 600; color: var(--cor-dourado-escuro); text-decoration: underline; }

/* Faixa de preço "De"/"Até" (Fase B, 14/09/2026) — os dois campos aplicam
   ao sair do campo (onchange), mesmo padrão de auto-aplicar dos checkboxes
   acima, sem precisar de um botão "Aplicar" à parte. */
.filtro-preco-faixa { display: flex; align-items: center; gap: var(--esp-2); }
.filtro-preco-faixa input[type=number] {
  width: 0; flex: 1; min-width: 0;
  padding: 8px 10px;
  border-radius: var(--raio-pequeno);
  border: 1px solid var(--cor-borda);
  background: var(--cor-branco);
  font-family: inherit;
  /* 16px (Fase A da auditoria mobile, 14/09/2026): mesma regra de sempre
     contra o zoom automático do Safari no iPhone. */
  font-size: 16px;
  color: var(--cor-texto);
}
.filtro-preco-ate { font-size: 12px; color: var(--cor-texto-suave); flex-shrink: 0; }

/* Pílulas de filtro aplicado (Fase C, 14/09/2026) — cada uma é um link de
   verdade (oxuai_loja_url_remover_filtro em catalogo_dados.php monta a URL
   sem aquele valor), não um botão com JS — clicar nela é só navegar pra
   uma busca com um filtro a menos. */
.filtros-pilulas { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; margin-bottom: var(--esp-5); }
.filtro-pilula {
  display: inline-flex; align-items: center; gap: 6px;
  padding: 6px 10px;
  border-radius: 999px;
  border: 1px solid var(--cor-borda);
  background: var(--cor-fundo-clara);
  font-size: 12.5px;
  color: var(--cor-texto);
}
.filtro-pilula:hover { border-color: var(--cor-dourado); }
.filtro-pilula span { color: var(--cor-texto-suave); font-size: 11px; }

/* Botão "Filtrar (N)" — só existe visualmente no celular (Fase C,
   14/09/2026). Abre o painel como uma camada em tela cheia (ver
   .filtros-catalogo.filtros-catalogo-aberto mais abaixo), padrão mais
   usado em e-commerce mobile (gaveta de filtro — pesquisa Baymard
   Institute) — controlado por iniciarFiltrosMobile em loja.js. */
.botao-filtros-mobile {
  display: none;
  width: 100%;
  padding: 12px var(--esp-4);
  margin-bottom: var(--esp-4);
  border-radius: var(--raio-pequeno);
  border: 1px solid var(--cor-borda);
  background: var(--cor-branco);
  font-family: inherit;
  font-weight: 600;
  font-size: 14px;
  color: var(--cor-texto);
  text-align: left;
}
.botao-filtros-mobile::after { content: '▾'; float: right; color: var(--cor-texto-suave); }

.filtros-catalogo-cabecalho { display: flex; align-items: center; justify-content: space-between; margin-bottom: var(--esp-4); }
.filtros-catalogo-titulo { margin: 0; }
.filtros-catalogo-fechar {
  display: none;
  width: 32px; height: 32px;
  border-radius: 50%;
  border: 1px solid var(--cor-borda);
  background: var(--cor-branco);
  color: var(--cor-texto);
  font-size: 15px;
  flex-shrink: 0;
}
.filtros-catalogo-aplicar { display: none; }

@media (max-width: 859px) {
  .botao-filtros-mobile { display: block; }
  .filtros-catalogo { display: none; }
  .filtros-catalogo.filtros-catalogo-aberto {
    display: flex;
    flex-direction: column;
    position: fixed;
    inset: 0;
    z-index: 200;
    background: var(--cor-branco);
    padding: var(--esp-4);
    padding-top: calc(var(--esp-4) + env(safe-area-inset-top, 0px));
    overflow: hidden; /* só a lista de filtros rola (abaixo) — o cabeçalho e o botão "Ver resultados" ficam fixos na tela */
  }
  /* Área entre o cabeçalho e o botão "Ver resultados" que rola sozinha —
     precisa de um elemento próprio (.filtros-catalogo-lista, ver
     catalogo.php) envolvendo os filtros, já que "flex:1 + overflow-y" só
     funciona aplicado num filho direto do container flex. */
  .filtros-catalogo-lista { flex: 1; overflow-y: auto; margin: 0 calc(var(--esp-4) * -1); padding: 0 var(--esp-4); }
  .filtros-catalogo-fechar { display: block; }
  .filtros-catalogo-aplicar {
    display: block;
    flex-shrink: 0;
    width: 100%;
    margin-top: var(--esp-4);
    padding: 14px;
    border-radius: var(--raio-pequeno);
    border: none;
    background: var(--degrade-dourado);
    color: #fff;
    font-family: inherit;
    font-weight: 700;
    font-size: 15px;
    padding-bottom: calc(14px + env(safe-area-inset-bottom, 0px));
  }
}

/* Trava a rolagem do catálogo por trás enquanto a gaveta de filtros está
   aberta no celular (Fase C, 14/09/2026) — sem isso, dava pra arrastar o
   dedo "através" da gaveta e rolar a página de baixo sem perceber. */
body.filtros-catalogo-travando-rolagem { overflow: hidden; }

/* 14/09/2026: era "display:flex; flex-wrap:wrap" com os dois blocos
   tentando ficar lado a lado e só quebrar linha se não coubessem — no
   celular a lojista viu o botão "Buscar" ficar embaixo do <select> de
   ordenar, sobrepostos (o <select> tem largura mínima própria, baseada no
   texto das opções, que o wrap nem sempre respeita igual a um texto normal
   quebraria). Empilhado por padrão (coluna) resolve de vez, sem depender
   de conta de largura nenhuma — só vira linha de verdade a partir de
   640px, onde sobra espaço de sobra pros dois lado a lado. */
.catalogo-topo { display: flex; flex-direction: column; gap: var(--esp-3); margin-bottom: var(--esp-5); }
@media (min-width: 640px) {
  .catalogo-topo { flex-direction: row; align-items: flex-end; justify-content: space-between; }
}
.catalogo-busca { display: flex; gap: var(--esp-2); }
@media (min-width: 640px) { .catalogo-busca { flex: 1; min-width: 200px; } }
.catalogo-busca input[type=search] {
  flex: 1;
  min-width: 0; /* sem isso, o campo de texto se recusa a encolher abaixo da largura "natural" dele (~170px+) e força o botão "Buscar" pra fora da linha */
  padding: 10px 14px;
  border-radius: var(--raio-pequeno);
  border: 1px solid var(--cor-borda);
  background: var(--cor-branco);
  font-family: inherit;
  /* 16px (Fase A da auditoria mobile, 14/09/2026): mesma regra de sempre
     contra o zoom automático do Safari no iPhone. */
  font-size: 16px;
}
.catalogo-ordenar { display: flex; flex-direction: column; gap: 4px; align-self: flex-start; }
@media (min-width: 640px) { .catalogo-ordenar { align-self: flex-end; } }
.catalogo-ordenar label { font-size: 11px; text-transform: uppercase; letter-spacing: 0.05em; color: var(--cor-texto-suave); }
.catalogo-ordenar select {
  min-height: 44px; /* 21/09/2026: alvo de toque */
  padding: 9px 12px;
  border-radius: var(--raio-pequeno);
  border: 1px solid var(--cor-borda);
  background: var(--cor-branco);
  font-family: inherit;
  /* 16px (Fase A da auditoria mobile, 14/09/2026): mesma regra de sempre
     contra o zoom automático do Safari no iPhone. */
  font-size: 16px;
  color: var(--cor-texto);
  max-width: 100%;
}

/* --------------------------------- Página de produto --------------------------------- */
.pagina-produto { display: grid; gap: var(--esp-6); padding: var(--esp-6) 0; }
@media (min-width: 860px) { .pagina-produto { grid-template-columns: 1.1fr 1fr; } }

/* 02/10/2026 (v142): ALTURA MÁXIMA FIXA, LARGURA VARIÁVEL. A caixa tem a proporção da foto (--razao-foto,
   definida em loja.js depois que a foto carrega) mas nunca passa de --foto-altura-max: quando a foto em pé
   (9:16) ficaria alta demais, é a LARGURA que diminui (a caixa fica centralizada na coluna) em vez de a
   foto crescer. Referência de mercado: a foto principal no celular ocupa ~65% da altura da tela, deixando
   nome e preço aparecendo logo abaixo sem rolar; no computador, até 88% da altura da janela (máx. 900px).
   Pra mudar o tamanho é só ajustar os dois valores de --foto-altura-max aqui embaixo. */
.galeria-principal {
  --foto-altura-max: 65vh;
  --razao-foto: 0.8;
  position: relative; border-radius: var(--raio); overflow: hidden; background: var(--cor-fundo-clara);
  aspect-ratio: var(--razao-foto);
  width: min(100%, calc(var(--foto-altura-max) * var(--razao-foto)));
  margin-inline: auto;
  cursor: zoom-in;
}
@supports (height: 1svh) { .galeria-principal { --foto-altura-max: 65svh; } }
@media (min-width: 860px) { .galeria-principal { --foto-altura-max: min(88vh, 900px); } }
.galeria-principal img { width: 100%; height: 100%; object-fit: cover; transition: transform 0.25s ease; display: block; }
/* 02/10/2026: a proporção da caixa é trocada por JS depois que a foto carrega (ajustarEncaixeFotoProduto,
   loja.js) pra a foto preencher sem margem; a classe abaixo só entra depois da 1ª medição, pra as TROCAS
   de foto deslizarem suavemente e a carga da página não. */
.galeria-principal.galeria-ajustada { transition: aspect-ratio 0.3s ease, width 0.3s ease; }
.galeria-principal:focus-visible { outline: 2px solid var(--cor-dourado); outline-offset: 2px; }
.galeria-dica-zoom {
  position: absolute; right: var(--esp-3); bottom: var(--esp-3); z-index: 2;
  display: inline-flex; align-items: center; gap: 6px;
  padding: 6px 12px; border-radius: 999px;
  background: rgba(255, 255, 255, 0.92); color: var(--cor-texto);
  font-size: 12px; font-weight: 600; letter-spacing: 0.02em;
  box-shadow: var(--sombra-forte); pointer-events: none;
}

/* Setas de navegação da foto principal (14/09/2026, pedido da lojista) —
   ao contrário de .carrossel-seta (Novidades/Mais compradas, que some no
   celular porque dá pra arrastar o dedo pra rolar), aqui ficam visíveis em
   qualquer largura de tela: a caixa da foto não tem rolagem nenhuma pra
   arrastar, então é o único jeito de passar as fotos sem descer até as
   miniaturas. */
.galeria-seta {
  position: absolute;
  top: 50%;
  transform: translateY(-50%);
  z-index: 2;
  width: 36px; height: 36px;
  border-radius: 50%;
  border: none;
  background: var(--cor-branco);
  box-shadow: var(--sombra-forte);
  cursor: pointer;
  font-size: 18px;
  display: flex; align-items: center; justify-content: center;
}
.galeria-seta[hidden] { display: none; }
.galeria-seta-anterior { left: var(--esp-3); }
.galeria-seta-proxima { right: var(--esp-3); }

/* Foto ampliada em tela cheia (14/09/2026) — o cursor de lupa na caixa da
   foto já existia, mas clicar não fazia nada; agora abre isto. Zoom de
   aproximar/afastar é o gesto nativo do navegador (pinça no celular,
   Ctrl+scroll no desktop) em cima da foto em tamanho grande — sem
   precisar de nenhuma biblioteca ou canvas pra isso. */
.lightbox-galeria {
  position: fixed;
  inset: 0;
  z-index: 210;
  background: rgba(26, 23, 20, 0.94);
}
.lightbox-galeria[hidden] { display: none; }
/* 02/10/2026: o palco é a tela inteira; a foto (position absolute, canto em 0,0) é movida e
   ampliada por transform em loja.js (criarVisualizadorZoom). touch-action: none entrega o
   arrastar e a pinça pro código em vez de rolar a página. */
.lightbox-palco {
  position: absolute; inset: 0; overflow: hidden;
  touch-action: none; user-select: none; -webkit-user-select: none;
  cursor: zoom-in;
}
.lightbox-palco.lightbox-palco-ampliado { cursor: grab; }
.lightbox-palco.lightbox-palco-arrastando { cursor: grabbing; }
.lightbox-palco img {
  position: absolute; left: 0; top: 0;
  max-width: none; max-height: none;
  transform-origin: 0 0; will-change: transform;
  -webkit-user-drag: none; user-select: none;
  transition: opacity 0.2s ease;
}
.lightbox-palco.lightbox-palco-carregando img { opacity: 0; }
.lightbox-zoom {
  position: absolute; left: 50%; bottom: var(--esp-5); transform: translateX(-50%);
  display: flex; align-items: center; gap: var(--esp-2);
  padding: 8px 12px; border-radius: 999px;
  background: rgba(26, 23, 20, 0.78); border: 1px solid rgba(255, 255, 255, 0.16);
  backdrop-filter: blur(6px); -webkit-backdrop-filter: blur(6px);
  z-index: 3;
}
.lightbox-zoom-botao {
  width: 34px; height: 34px; border-radius: 50%; border: none; flex-shrink: 0;
  background: rgba(255, 255, 255, 0.14); color: #fff; font-size: 20px; line-height: 1; cursor: pointer;
}
.lightbox-zoom-botao:hover { background: rgba(255, 255, 255, 0.28); }
.lightbox-zoom-valor {
  min-width: 52px; border: none; background: transparent; color: rgba(255, 255, 255, 0.85);
  font-size: 13px; font-family: var(--fonte-mono, monospace); cursor: pointer; text-align: center;
}
.lightbox-zoom-range { width: min(240px, 38vw); accent-color: var(--cor-dourado); cursor: pointer; }
.lightbox-dica {
  position: absolute; left: 50%; top: var(--esp-4); transform: translateX(-50%);
  margin: 0; max-width: calc(100% - 140px); text-align: center; z-index: 3;
  padding: 6px 14px; border-radius: 999px;
  background: rgba(26, 23, 20, 0.7); color: rgba(255, 255, 255, 0.85);
  font-size: 12px; pointer-events: none;
}
.lightbox-galeria-fechar, .lightbox-galeria-seta, .lightbox-galeria-contador { z-index: 3; }
.lightbox-galeria-fechar:focus-visible, .lightbox-galeria-seta:focus-visible,
.lightbox-zoom-botao:focus-visible, .lightbox-zoom-valor:focus-visible, .lightbox-zoom-range:focus-visible {
  outline: 2px solid #fff; outline-offset: 2px;
}
.lightbox-galeria-fechar {
  position: absolute;
  top: var(--esp-4); right: var(--esp-4);
  width: 40px; height: 40px;
  border-radius: 50%;
  border: none;
  background: rgba(255,255,255,0.12);
  color: #fff;
  font-size: 18px;
  cursor: pointer;
}
.lightbox-galeria-seta {
  position: absolute;
  top: 50%;
  transform: translateY(-50%);
  width: 44px; height: 44px;
  border-radius: 50%;
  border: none;
  background: rgba(255,255,255,0.12);
  color: #fff;
  font-size: 22px;
  cursor: pointer;
  display: flex; align-items: center; justify-content: center;
}
.lightbox-galeria-seta[hidden] { display: none; }
.lightbox-galeria-seta:hover, .lightbox-galeria-fechar:hover { background: rgba(255,255,255,0.24); }
.lightbox-galeria-seta-anterior { left: var(--esp-4); }
.lightbox-galeria-seta-proxima { right: var(--esp-4); }
.lightbox-galeria-contador {
  position: absolute;
  top: var(--esp-4);
  left: var(--esp-4);
  color: rgba(255,255,255,0.75);
  font-size: 13px;
  font-family: var(--fonte-mono, monospace);
}
@media (max-width: 640px) {
  .lightbox-galeria-seta { width: 38px; height: 38px; font-size: 19px; }
  .lightbox-dica { display: none; }
  .lightbox-zoom { bottom: var(--esp-4); gap: 6px; padding: 6px 8px; }
  .lightbox-zoom-valor { min-width: 44px; }
}

/* Trava a rolagem do fundo enquanto a foto ampliada está aberta — mesma
   ideia de .filtros-catalogo-travando-rolagem (catálogo). */
body.lightbox-galeria-travando-rolagem { overflow: hidden; }
/* 12/09/2026: a caixa de foto é pensada pra foto de roupa (retrato, modelo
   de corpo inteiro), que preenche tudo cortando só uma sobra mínima nas
   bordas. Foto de acessório (bag, por exemplo) costuma vir quadrada ou mais
   larga — nesse formato, "cover" corta pedaço real do produto. A classe
   abaixo (aplicada via JS, ver ajustarEncaixeFotoProduto em loja.js, depois
   de medir a proporção real de cada foto) troca pra mostrar a foto inteira,
   sem cortar nada, sobrando um respiro dos lados ou em cima/embaixo em vez
   de cortar. Só entra em ação pra fotos fora do formato retrato esperado —
   foto de roupa comum continua exatamente como sempre (cover). */
.galeria-miniaturas { display: flex; justify-content: center; gap: var(--esp-2); margin-top: var(--esp-3); }
.galeria-miniaturas[hidden] { display: none; }
.galeria-miniaturas img { width: 64px; height: 80px; object-fit: cover; border-radius: var(--raio-pequeno); border: 2px solid transparent; cursor: pointer; }
.galeria-miniaturas img.ativa { border-color: var(--cor-dourado); }

.opcoes-produto .preco-grande { font-size: 28px; font-weight: 700; color: var(--cor-dourado-escuro); }
.selecao-titulo { font-size: 13px; font-weight: 600; text-transform: uppercase; letter-spacing: 0.04em; margin: var(--esp-4) 0 var(--esp-2); }
.opcoes-cor, .opcoes-tamanho { display: flex; gap: var(--esp-2); flex-wrap: wrap; }
/* 40px (não 32px): alvo de toque recomendado pra dedo no celular sem
   comprometer o visual da bolinha de cor. O box-shadow por dentro serve só
   pra separar bolinhas claras/brancas do fundo branco da página. */
.opcao-cor { width: 40px; height: 40px; border-radius: 50%; border: 2px solid transparent; cursor: pointer; box-shadow: 0 0 0 1px var(--cor-borda) inset; }
.opcao-cor.selecionada { border-color: var(--cor-texto); }
.opcao-tamanho {
  min-width: 44px; height: 44px; padding: 0 10px;
  border: 1px solid var(--cor-borda); border-radius: var(--raio-pequeno);
  display: flex; align-items: center; justify-content: center;
  font-size: 14px; font-weight: 600; background: var(--cor-branco);
}
.opcao-tamanho.selecionada { border-color: var(--cor-texto); background: var(--cor-texto); color: #fff; }
.opcao-tamanho:disabled { color: var(--cor-borda); border-color: var(--cor-borda); background: var(--cor-fundo-clara); cursor: not-allowed; text-decoration: line-through; }

/* --------------------------------- Guia de medidas em modal (página de produto) --------------------------------- */
/* Modal nativo do navegador (elemento <dialog>), aberto via
   modal.showModal() em loja.js — sem biblioteca nenhuma. Mantém a
   cliente na página da peça em vez de navegar pra medidas.php, pra não
   arriscar ela abandonar a compra no meio do caminho. */
.modal-medidas {
  border: none;
  border-radius: var(--raio);
  padding: 0;
  width: calc(100% - 32px);
  max-width: 640px;
  max-height: 85vh;
  box-shadow: var(--sombra-forte);
}
.modal-medidas::backdrop { background: rgba(20, 16, 12, 0.55); }
.modal-medidas-cabecalho {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--esp-3);
  padding: var(--esp-4) var(--esp-5);
  border-bottom: 1px solid var(--cor-borda);
  position: sticky;
  top: 0;
  background: var(--cor-branco);
}
.modal-medidas-cabecalho h2 { margin: 0; font-size: 20px; }
.modal-fechar {
  background: none;
  border: none;
  font-size: 26px;
  line-height: 1;
  cursor: pointer;
  color: var(--cor-texto-suave);
  padding: 4px 8px;
  border-radius: var(--raio-pequeno);
}
.modal-fechar:hover { background: var(--cor-fundo-clara); color: var(--cor-texto); }
.modal-medidas-corpo { padding: var(--esp-5); overflow-y: auto; max-height: calc(85vh - 64px); }

/* --------------------------------- Avaliações --------------------------------- */
.resumo-avaliacao { display: flex; align-items: center; gap: var(--esp-2); color: var(--cor-texto-suave); font-size: 14px; }
.estrelas { color: var(--cor-dourado); letter-spacing: 1px; }
.cartao-avaliacao { border-top: 1px solid var(--cor-borda); padding: var(--esp-4) 0; }
.cartao-avaliacao .nome-cliente { font-weight: 600; font-size: 14px; }
.cartao-avaliacao .data { font-size: 12px; color: var(--cor-texto-suave); }

/* --------------------------------- Rodapé --------------------------------- */
.rodape { background: var(--cor-texto); color: #fff; padding: var(--esp-7) 0 var(--esp-5); margin-top: var(--esp-8); }
.rodape a { opacity: 0.85; }
.rodape .colunas { display: grid; gap: var(--esp-5); grid-template-columns: 1fr; margin-bottom: var(--esp-6); }
@media (min-width: 700px) { .rodape .colunas { grid-template-columns: repeat(3, 1fr); } }
.rodape small { opacity: 0.6; }
/* Selos de pagamento/envio (14/09/2026) — badges de texto neutras, sem
   tentar reproduzir a cor/logo oficial de cada bandeira. */
.rodape-selos-grupo { margin-bottom: var(--esp-3); }
.rodape-selos-titulo { display: block; font-size: 11px; text-transform: uppercase; letter-spacing: 0.04em; opacity: 0.6; margin-bottom: 6px; }
.rodape-selos { display: flex; flex-wrap: wrap; gap: 8px; }
.rodape-selo {
  display: inline-flex; align-items: center;
  padding: 4px 12px;
  border: 1px solid rgba(255,255,255,0.3);
  border-radius: 999px;
  font-size: 11px;
  font-weight: 600;
  letter-spacing: 0.02em;
  opacity: 0.9;
}

/* --------------------------------- Barra de aviso (Pix / grupo VIP) --------------------------------- */
/* 14/09/2026 (pedido da lojista): fundo escuro/neutro trocado por um tom
   dourado da própria marca (era var(--cor-texto), quase preto, sem relação
   com a identidade visual). Contrastes conferidos (fórmula WCAG):
   dourado-brilho sobre dourado-escuro ≈ 10:1, branco sobre dourado-escuro
   ≈ 5,8:1 — os dois bem acima do mínimo de 4,5:1 pra texto normal. */
.barra-aviso {
  background: var(--cor-dourado-escuro);
  color: var(--cor-dourado-brilho);
  font-size: 12px;
  text-align: center;
  padding: 8px var(--esp-3);
  letter-spacing: 0.02em;
}
.barra-aviso a { color: #fff; text-decoration: underline; font-weight: 600; }
.barra-aviso .separador { margin: 0 var(--esp-3); opacity: 0.5; }

/* --------------------------------- Texto legal (privacidade/termos) --------------------------------- */
/* 13/09/2026, Fase 3 — páginas de texto corrido e longo, diferente do resto
   do site (que é mais visual). Só espaçamento/leitura, nenhuma cor nova. */
.pagina-texto-legal p { margin: 0 0 var(--esp-4); line-height: 1.6; color: var(--cor-texto); }
.pagina-texto-legal h2 { font-size: 19px; margin-top: var(--esp-6); }
.pagina-texto-legal ul { margin: 0 0 var(--esp-4); padding-left: 1.3em; line-height: 1.6; }
.pagina-texto-legal li { margin-bottom: 6px; }
.pagina-texto-legal a { color: var(--cor-dourado-escuro); font-weight: 600; }

/* --------------------------------- Utilitárias (Fase 6, 14/09/2026) --------------------------------- */
/* Trocam style="" que se repetia igual em várias páginas — só os padrões
   que se repetiam de verdade (ver plano da Fase 6); espaçamento pontual de
   uma linha só continua inline, não vale a pena formalizar como classe. */
.titulo-pagina { font-size: 24px; }
.texto-suave { color: var(--cor-texto-suave); }
.rodape-link { display: block; margin-bottom: 6px; font-size: 14px; }
.container-texto { padding: var(--esp-6) 0 var(--esp-8); max-width: 760px; }
.espaco-secao { padding-top: var(--esp-8); }
.espaco-secao-pequeno { padding-top: var(--esp-6); }

/* --------------------------------- Banner de cookies (LGPD) --------------------------------- */
/* 13/09/2026, Fase 3 da revisão de profissionalização do site — ver
   iniciarConsentimentoCookies() em loja.js. z-index mais alto que a barra
   fixa de compra (70) pra nunca ficar escondido embaixo dela.
   CORRIGIDO no mesmo dia (testado ao vivo): a regra ".banner-cookies" logo
   abaixo tem "display: flex", e uma regra de autor sempre vence a regra
   padrão do navegador que esconde [hidden] — o banner continuava
   aparecendo mesmo com o atributo hidden true. A regra ".banner-cookies[hidden]"
   junta classe + atributo (especificidade maior que só a classe), então
   sempre ganha, independente da ordem — sem ela, esconder o banner via
   JavaScript (elemento.hidden = true) não tinha efeito nenhum. */
.banner-cookies[hidden] { display: none; }
.banner-cookies {
  position: fixed;
  left: 0;
  right: 0;
  bottom: 0;
  z-index: 80;
  background: var(--cor-texto);
  color: #fff;
  padding: var(--esp-4);
  padding-bottom: calc(var(--esp-4) + env(safe-area-inset-bottom, 0px));
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  justify-content: center;
  gap: var(--esp-4);
  box-shadow: 0 -4px 16px rgba(0,0,0,0.15);
}
.banner-cookies p { flex: 1 1 320px; font-size: 13px; margin: 0; }
.banner-cookies a { color: var(--cor-dourado-brilho); text-decoration: underline; font-weight: 600; }
.banner-cookies-botoes { display: flex; gap: 10px; flex-shrink: 0; }
.banner-cookies-botoes .botao { padding: 10px 18px; font-size: 13px; white-space: nowrap; }
/* .botao-secundario normal usa texto escuro (pensado pra fundo claro) —
   aqui o fundo é escuro, então inverte pra continuar legível. */
.banner-cookies .botao-secundario { border-color: #fff; color: #fff; }
.banner-cookies .botao-secundario:hover { background: #fff; color: var(--cor-texto); }
@media (max-width: 600px) {
  .banner-cookies { flex-direction: column; text-align: center; gap: var(--esp-3); }
  /* 21/09/2026: CORREÇÃO da altura. Com "flex-direction: column" o "flex: 1 1 320px"
     do parágrafo (pensado pra LARGURA, na linha do desktop) virava ALTURA mínima de
     320px: o aviso ocupava mais da metade da tela do celular (436 de 812 px), com um
     vão vazio embaixo do texto. Aqui a altura é a do texto. */
  .banner-cookies p { flex: 0 0 auto; }
  .banner-cookies-botoes { width: 100%; justify-content: center; }
}

/* --------------------------------- Preço no Pix --------------------------------- */
.preco-pix { font-size: 14px; font-weight: 600; color: var(--cor-sucesso); margin-top: 2px; }
.preco-pix-card { font-size: 12px; font-weight: 600; color: var(--cor-sucesso); margin-top: 2px; }

/* --------------------------------- Faixa de convite pro grupo VIP --------------------------------- */
.faixa-vip {
  background: var(--cor-fundo-clara);
  border: 1px dashed var(--cor-dourado);
  border-radius: var(--raio);
  padding: var(--esp-5);
  text-align: center;
  margin: var(--esp-7) 0;
}
.faixa-vip h3 { font-size: 22px; margin-bottom: 4px; }
.faixa-vip p { color: var(--cor-texto-suave); font-size: 14px; margin-bottom: var(--esp-3); }

/* --------------------------------- Menu mobile (painel) --------------------------------- */
/* 12/09/2026: essa regra tinha um "display: inline-flex" aqui, sem estar
   dentro de nenhuma media query — como ela é mais específica que o
   ".cabecalho .menu-mobile { display: none }" lá em cima (pensado só pro
   celular), esse "display" ganhava sempre, em qualquer tamanho de tela.
   Resultado: o botão de lupa (e o de menu ☰) apareciam também no desktop,
   do lado do carrinho, mesmo com a busca já visível ali do lado — a
   lojista percebeu esse ícone de lupa "sobrando". O "display" certo agora
   mora só dentro da media query de celular (ver acima); aqui ficam só as
   outras propriedades visuais do botão, que valem pra quando ele estiver
   mesmo visível. */
.cabecalho .acoes button.menu-mobile {
  align-items: center; justify-content: center;
  background: none; border: none; color: var(--cor-texto);
  font-size: 20px; line-height: 1; padding: 4px;
}
.cabecalho .acoes a.menu-mobile { font-size: 18px; text-decoration: none; }
.nav-mobile { display: none; flex-direction: column; background: var(--cor-branco); border-top: 1px solid var(--cor-borda); }
.nav-mobile a { padding: var(--esp-3) var(--esp-4); border-bottom: 1px solid var(--cor-borda); font-size: 14px; text-transform: uppercase; letter-spacing: 0.04em; }
@media (max-width: 780px) {
  .nav-mobile:not([hidden]) { display: flex; }
}

/* --------------------------------- Botão flutuante de WhatsApp --------------------------------- */
.whatsapp-fixo {
  position: fixed;
  right: var(--esp-4);
  bottom: var(--esp-4);
  z-index: 60;
  display: flex;
  align-items: center;
  gap: var(--esp-2);
  background: #25D366;
  color: #fff;
  padding: 12px 18px;
  border-radius: 999px;
  box-shadow: var(--sombra-forte);
  font-size: 14px;
  font-weight: 600;
}
.whatsapp-fixo-icone { display: block; flex-shrink: 0; }
@media (max-width: 640px) {
  .whatsapp-fixo { right: var(--esp-3); bottom: var(--esp-3); padding: 12px 16px; }
  .whatsapp-fixo-texto { display: none; }
}

/* --------------------------------- Barra fixa de compra (só celular/tablet, página de produto) --------------------------------- */
/* Some abaixo do preço quando a cliente rola a tela e o botão "Comprar
   pelo WhatsApp" original sai da vista (controlado via JS,
   iniciarBarraFixaMobile em loja.js). Em telas largas (a partir de 860px,
   onde a página de produto já mostra foto e informações lado a lado) ela
   nunca aparece — nessas telas o botão original já fica sempre visível. */
.barra-fixa-comprar,
.barra-fixa-carrinho { /* 21/09/2026: a barra do carrinho reaproveita o mesmo visual */
  display: none;
  position: fixed;
  left: 0;
  right: 0;
  bottom: 0;
  z-index: 70;
  align-items: center;
  gap: var(--esp-3);
  background: var(--cor-branco);
  border-top: 1px solid var(--cor-borda);
  box-shadow: 0 -4px 16px rgba(0,0,0,0.1);
  padding: 10px var(--esp-4);
  padding-bottom: calc(10px + env(safe-area-inset-bottom, 0px));
}
.barra-fixa-comprar img,
.barra-fixa-carrinho img { width: 44px; height: 54px; object-fit: cover; border-radius: var(--raio-pequeno); flex-shrink: 0; }
.barra-fixa-info { flex: 1; min-width: 0; display: flex; flex-direction: column; }
.barra-fixa-nome { font-size: 12px; color: var(--cor-texto-suave); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.barra-fixa-preco { font-size: 16px; font-weight: 700; color: var(--cor-dourado-escuro); }
.barra-fixa-comprar .botao,
.barra-fixa-carrinho .botao { flex-shrink: 0; padding: 12px 20px; font-size: 13px; }
@media (max-width: 860px) {
  .barra-fixa-comprar.visivel,
  .barra-fixa-carrinho.visivel { display: flex; }
  /* Sobe o botão flutuante de WhatsApp pra não ficar em cima da barra fixa
     de compra quando as duas aparecem juntas na página de produto (e, desde
     21/09/2026, na do carrinho). */
  body[data-pagina="produto"] .whatsapp-fixo,
  body[data-pagina="carrinho"] .whatsapp-fixo { bottom: 78px; }
}

/* Banner de cookies também sobe os dois enquanto estiver visível (Fase A
   da auditoria mobile, 14/09/2026) — os três são fixos embaixo da tela, e
   o banner tem o z-index mais alto (ver .banner-cookies), então sem isso
   ele cobria a barra de comprar e o WhatsApp por cima na primeira visita
   de uma cliente nova. A altura do banner varia (texto + 1 ou 2 linhas de
   botão, dependendo da largura), então --altura-banner-cookies é medida
   de verdade em JS (iniciarConsentimentoCookies, loja.js) em vez de um
   valor fixo chutado. */
body.banner-cookies-visivel .whatsapp-fixo { bottom: calc(var(--esp-4) + var(--altura-banner-cookies, 0px)); }
@media (max-width: 640px) {
  body.banner-cookies-visivel .whatsapp-fixo { bottom: calc(var(--esp-3) + var(--altura-banner-cookies, 0px)); }
}
@media (max-width: 860px) {
  body.banner-cookies-visivel[data-pagina="produto"] .whatsapp-fixo,
  body.banner-cookies-visivel[data-pagina="carrinho"] .whatsapp-fixo { bottom: calc(78px + var(--altura-banner-cookies, 0px)); }
  body.banner-cookies-visivel .barra-fixa-comprar.visivel,
  body.banner-cookies-visivel .barra-fixa-carrinho.visivel { bottom: var(--altura-banner-cookies, 0px); }
}

/* --------------------------------- Avisos e estados vazios --------------------------------- */
.aviso-caixa {
  background: var(--cor-aviso-fundo);
  color: var(--cor-texto);
  border-radius: var(--raio);
  padding: var(--esp-4);
  font-size: 14px;
  margin: var(--esp-4) 0;
}
.aviso-caixa a { text-decoration: underline; font-weight: 600; }

/* Aviso do brinde por valor mínimo no carrinho (18/09/2026, pedido da
   lojista: "mais em destaque") — faixa dourada da marca com texto branco
   maior, valor que falta em negrito e barra de progresso. Precisa de
   [hidden] explícito porque .aviso-brinde define display (mesma armadilha
   de .linha-resumo/.banner-cookies). */
.aviso-brinde {
  background: var(--cor-dourado-escuro);
  color: #fff;
  text-align: center;
  padding: var(--esp-5) var(--esp-4);
  box-shadow: 0 6px 18px rgba(141, 90, 27, 0.25);
}
.aviso-brinde[hidden] { display: none; }
.aviso-brinde-texto { font-size: 18px; font-weight: 600; line-height: 1.35; }
.aviso-brinde-texto strong { color: var(--cor-dourado-brilho); font-weight: 800; }
.aviso-brinde-barra {
  height: 8px;
  border-radius: 999px;
  background: rgba(255, 255, 255, 0.28);
  margin: var(--esp-3) auto 0;
  max-width: 420px;
  overflow: hidden;
}
.aviso-brinde-barra-preenchida {
  height: 100%;
  border-radius: 999px;
  background: var(--cor-dourado-brilho);
  transition: width 0.4s ease;
}
@media (max-width: 480px) {
  .aviso-brinde-texto { font-size: 16px; }
}

/* --------------------------------- Foto placeholder --------------------------------- */
.foto-mock {
  width: 100%; height: 100%;
  display: flex; align-items: center; justify-content: center;
  background: linear-gradient(160deg, var(--cor-fundo-clara), var(--cor-borda));
}
.foto-mock img { width: 34%; opacity: 0.5; }

/* --------------------------------- Seções auxiliares (vitrine/produto) --------------------------------- */
.secao-titulo {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  margin-bottom: var(--esp-5);
  flex-wrap: wrap;
  gap: var(--esp-2);
}
.secao-titulo h2 { font-size: clamp(20px, 3vw, 28px); }
.secao-titulo a { font-size: 13px; color: var(--cor-dourado-escuro); font-weight: 600; text-transform: uppercase; letter-spacing: 0.04em; }
.faixa-marca {
  background: var(--degrade-dourado);
  color: #fff;
  text-align: center;
  padding: var(--esp-6) var(--esp-4);
  margin: var(--esp-8) 0;
  border-radius: var(--raio);
}
.faixa-marca img { width: 64px; margin: 0 auto var(--esp-3); opacity: 0.95; }
.faixa-marca h3 { font-size: clamp(20px, 2.6vw, 26px); font-style: italic; font-weight: 500; margin-bottom: 4px; }
.faixa-marca p { opacity: 0.9; font-size: 14px; margin: 0; }
.secao-medidas { display: flex; align-items: center; flex-wrap: wrap; gap: var(--esp-3); background: var(--cor-fundo-clara); border-radius: var(--raio); padding: var(--esp-4); margin-top: var(--esp-6); }

/* Acordeão de perguntas e respostas — usado nas "Dúvidas comuns" da página
   de produto e na página de FAQ geral. Sem JavaScript: usa <details> e
   <summary> do próprio navegador, então funciona igual em qualquer
   aparelho, sem depender de nada além de HTML. */
.acordeao-duvidas { border-top: 1px solid var(--cor-borda); }
.acordeao-duvidas details { border-bottom: 1px solid var(--cor-borda); padding: var(--esp-3) 0; }
.acordeao-duvidas summary { font-weight: 600; font-size: 14px; cursor: pointer; list-style: none; display: flex; justify-content: space-between; align-items: center; gap: var(--esp-3); }
.acordeao-duvidas summary::-webkit-details-marker { display: none; }
.acordeao-duvidas summary::after { content: '+'; font-size: 20px; color: var(--cor-dourado-escuro); flex-shrink: 0; }
.acordeao-duvidas details[open] summary::after { content: '−'; }
.acordeao-duvidas p { font-size: 14px; color: var(--cor-texto-suave); margin-top: var(--esp-2); }
.secao-medidas span { font-size: 13px; color: var(--cor-texto-suave); }
.botao-desabilitado { opacity: 0.5; pointer-events: none; }

/* --------------------------------- Selos de confiança (página de produto e home) --------------------------------- */
.selos-confianca { display: flex; flex-direction: column; gap: var(--esp-3); margin-top: var(--esp-4); }
.selo-confianca { display: flex; align-items: flex-start; gap: var(--esp-2); }
.selo-confianca svg { flex-shrink: 0; margin-top: 2px; color: var(--cor-dourado-escuro); }
.selo-confianca strong { display: block; font-size: 13px; }
.selo-confianca span { display: block; font-size: 12px; color: var(--cor-texto-suave); }

/* Versão horizontal da faixa de confiança, usada na home (em linha, não empilhada) */
.selos-confianca-home {
  display: grid;
  grid-template-columns: 1fr;
  gap: var(--esp-4);
  background: var(--cor-fundo-clara);
  border-radius: var(--raio);
  padding: var(--esp-5);
  margin: var(--esp-7) 0;
}
@media (min-width: 700px) {
  /* 14/09/2026: 2 colunas, não 3 — o selo "Troca fácil" que ficava aqui foi
     removido (virou repetição da faixa de ícones do topo, ver index.php). */
  .selos-confianca-home { grid-template-columns: repeat(2, 1fr); }
}
.selos-confianca-home .selo-confianca { align-items: center; }

/* Pílulas de tamanho (P M G GG, com 38/40 em destaque) — versão visual do
   texto "curva do P ao GG, com foco em 38 e 40", usada dentro do selo de
   confiança da home (06/09/2026). */
.pilulas-tamanho { display: flex; flex-wrap: wrap; gap: 6px; margin-top: var(--esp-2); }
.pilula-tamanho {
  display: inline-flex; align-items: center; justify-content: center;
  min-width: 30px; height: 30px; padding: 0 8px;
  border-radius: 999px; border: 1px solid var(--cor-borda);
  background: var(--cor-branco); font-size: 12px; font-weight: 600;
  color: var(--cor-texto-suave);
}
.pilula-tamanho.destaque {
  background: var(--degrade-dourado); border-color: transparent; color: #fff;
}

/* --------------------------------- Conheça a fundadora (teaser na home) --------------------------------- */
/* 14/09/2026 (pedido da lojista): fundo escuro nesta faixa, seguindo o
   mesmo dourado-escuro da barra de avisos/menu (em vez de um cinza claro
   neutro), com texto claro por cima pra manter o contraste. */
.faixa-fundadora-home {
  display: flex; align-items: center; gap: var(--esp-5);
  background: var(--cor-dourado-escuro); border-radius: var(--raio);
  padding: var(--esp-5); margin: var(--esp-7) 0;
  flex-wrap: wrap;
}
.faixa-fundadora-home img {
  width: 84px; height: 84px; border-radius: 50%; object-fit: cover;
  object-position: center 15%; flex-shrink: 0;
  border: 2px solid rgba(255, 255, 255, 0.3);
}
.faixa-fundadora-home .texto { flex: 1; min-width: 220px; }
.faixa-fundadora-home p.linha { font-size: 15px; margin-bottom: 6px; color: var(--cor-dourado-brilho); }
.faixa-fundadora-home p.linha strong { color: #fff; }
.faixa-fundadora-home a { font-size: 13px; font-weight: 600; color: #fff; text-decoration: underline; text-transform: uppercase; letter-spacing: 0.04em; }

/* Divisor decorativo com o ícone da marca, usado entre seções da home pra
   dar uma respiração visual e reforçar a identidade (06/09/2026). */
.divisor-marca { display: flex; align-items: center; justify-content: center; gap: var(--esp-3); margin: var(--esp-7) 0; }
.divisor-marca::before, .divisor-marca::after { content: ''; height: 1px; flex: 1; max-width: 120px; background: var(--cor-borda); }
.divisor-marca img { width: 28px; opacity: 0.85; }

/* --------------------------------- Convite pro Instagram (home) --------------------------------- */
.faixa-instagram {
  text-align: center;
  padding: var(--esp-6) var(--esp-4);
  margin: var(--esp-7) 0;
  border: 1px solid var(--cor-borda);
  border-radius: var(--raio);
}
.faixa-instagram h3 { font-size: 22px; margin-bottom: 4px; }
.faixa-instagram p { color: var(--cor-texto-suave); font-size: 14px; margin-bottom: var(--esp-3); }

/* --------------------------------- Página "Sobre a OXUAI" --------------------------------- */
.pagina-sobre { padding: var(--esp-6) 0 var(--esp-8); }
.pagina-sobre h1 { font-size: 28px; }
.subtitulo-sobre { color: var(--cor-texto-suave); font-size: 14px; margin-bottom: var(--esp-6); }
.sobre-intro { display: grid; grid-template-columns: 1fr; gap: var(--esp-6); margin-bottom: var(--esp-7); }
@media (min-width: 780px) {
  .sobre-intro { grid-template-columns: 320px 1fr; align-items: start; }
}
.sobre-foto { aspect-ratio: 4 / 5; border-radius: var(--raio); overflow: hidden; }
.sobre-foto img { width: 100%; height: 100%; object-fit: cover; object-position: center 15%; display: block; }
.sobre-foto-texto { display: flex; flex-direction: column; align-items: center; gap: var(--esp-2); opacity: 0.6; }
.sobre-foto-texto img { width: 40px; }
.sobre-foto-texto span { font-size: 12px; }
.sobre-texto p { font-size: 15px; line-height: 1.7; color: var(--cor-texto); margin-bottom: var(--esp-4); }

/* --------------------------------- Guia de medidas --------------------------------- */
.cartao-medida {
  background: var(--cor-fundo-clara);
  border-radius: var(--raio);
  padding: var(--esp-4);
}
.cartao-medida strong { display: block; margin-bottom: 4px; font-size: 14px; }
.cartao-medida p { font-size: 13px; color: var(--cor-texto-suave); margin: 0; }
.dica-scroll-tabela { display: none; font-size: 12px; color: var(--cor-texto-suave); margin-bottom: 6px; }
.wrapper-tabela-medidas { position: relative; overflow-x: auto; margin-bottom: var(--esp-7); }
.wrapper-tabela-medidas::after {
  content: '';
  position: absolute; top: 0; right: 0; bottom: 0; width: 28px;
  background: linear-gradient(to right, transparent, var(--cor-fundo));
  pointer-events: none;
}
.tabela-medidas { width: 100%; border-collapse: collapse; min-width: 420px; font-size: 14px; }
.tabela-medidas th, .tabela-medidas td { text-align: left; padding: 10px 14px; border-bottom: 1px solid var(--cor-borda); }
.tabela-medidas th { text-transform: uppercase; font-size: 12px; letter-spacing: 0.04em; color: var(--cor-texto-suave); }
@media (max-width: 480px) {
  .dica-scroll-tabela { display: block; }
}

/* --------------------------------- Formulários (calculadora e avaliação) --------------------------------- */
.formulario-medidas { display: flex; flex-wrap: wrap; gap: var(--esp-4); align-items: end; margin-bottom: var(--esp-3); }
.campo-formulario { display: flex; flex-direction: column; gap: 4px; }
.campo-formulario label { font-size: 13px; font-weight: 600; }
.campo-formulario input, .campo-formulario textarea {
  padding: 10px 12px;
  border-radius: var(--raio-pequeno);
  border: 1px solid var(--cor-borda);
  font-family: inherit;
  /* 16px, não 14px: abaixo de 16px o Safari do iPhone dá zoom automático
     ao tocar no campo, o que atrapalha muito no celular. */
  font-size: 16px;
  background: var(--cor-branco);
}
.formulario-medidas .campo-formulario input { width: 120px; }
.resultado-calculadora { font-size: 14px; font-weight: 600; padding: var(--esp-3) 0; }
.resultado-calculadora.sucesso { color: var(--cor-sucesso); }
.resultado-calculadora.aviso { color: var(--cor-dourado-escuro); }

/* Lista de opções de frete (calculadora da página de produto, 06/09/2026):
   antes era um texto corrido separado por quebra de linha, agora cada
   opção vira uma linha só dela, com transportadora, prazo e preço bem
   destacado — visual mais parecido com o que grandes lojas usam no
   checkout. */
.opcoes-frete { list-style: none; margin: var(--esp-2) 0 0; padding: 0; display: flex; flex-direction: column; gap: 8px; }
.opcao-frete {
  display: flex;
  align-items: center;
  gap: 10px;
  padding: 12px;
  border: 1px solid var(--cor-borda);
  border-radius: var(--raio-pequeno);
  background: var(--cor-branco);
}
.opcao-frete-destaque { border-color: var(--cor-dourado); background: #FBF6EC; }
.opcao-frete-icone { flex-shrink: 0; color: var(--cor-dourado-escuro); }
.opcao-frete-info { flex: 1; min-width: 0; }
.opcao-frete-transportadora { font-size: 14px; font-weight: 600; color: var(--cor-texto); }
.opcao-frete-prazo { font-size: 12px; color: var(--cor-texto-suave); margin-top: 2px; }
.opcao-frete-preco { font-size: 15px; font-weight: 700; color: var(--cor-dourado-escuro); white-space: nowrap; }
.opcao-frete-badge {
  display: inline-block;
  margin-left: 6px;
  padding: 1px 8px;
  border-radius: 999px;
  background: var(--cor-dourado);
  color: #fff;
  font-size: 10px;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.03em;
  vertical-align: middle;
}

.formulario-avaliacao { background: var(--cor-fundo-clara); border-radius: var(--raio); padding: var(--esp-4); margin-top: var(--esp-4); }
.formulario-avaliacao .campo-formulario { margin-bottom: var(--esp-3); }
.formulario-avaliacao textarea { resize: vertical; }
.mensagem-avaliacao { font-size: 13px; font-weight: 600; margin-top: var(--esp-2); }
.mensagem-avaliacao.sucesso { color: var(--cor-sucesso); }
.mensagem-avaliacao.erro { color: var(--cor-erro); }

/* Seleção de nota em estrelas: radios invertidos via row-reverse pra CSS
   conseguir destacar a estrela e as anteriores só com :hover/:checked,
   sem precisar de JavaScript pra pintar a nota. */
.estrelas-input {
  display: flex;
  flex-direction: row-reverse;
  justify-content: flex-end;
  gap: 2px;
  font-size: 26px;
  margin-bottom: var(--esp-3);
}
.estrelas-input input { position: absolute; opacity: 0; width: 0; height: 0; }
.estrelas-input label { color: var(--cor-borda); cursor: pointer; }
.estrelas-input input:checked ~ label,
.estrelas-input label:hover,
.estrelas-input label:hover ~ label {
  color: var(--cor-dourado);
}

/* --------------------------------- Ícone do carrinho (cabeçalho, todas as páginas) --------------------------------- */
/* Carrinho, 07/09/2026: ícone fixo no topo, com uma bolinha mostrando
   quantas peças estão no carrinho agora (guardado no navegador da própria
   cliente, ver iniciarContadorCarrinho em loja.js). Fica escondido
   enquanto o carrinho está vazio. */
.link-carrinho { position: relative; display: flex; align-items: center; color: var(--cor-texto); }
.contador-carrinho {
  position: absolute;
  top: -8px;
  right: -9px;
  background: var(--cor-dourado);
  color: #fff;
  font-size: 10px;
  font-weight: 700;
  line-height: 1;
  min-width: 17px;
  height: 17px;
  border-radius: 999px;
  display: flex;
  align-items: center;
  justify-content: center;
  padding: 0 3px;
}
/* 13/09/2026: mesmo bug de .linha-resumo/.banner-cookies acima — sem isso,
   o badge "0" no ícone do carrinho não some quando o carrinho está vazio
   (atualizarContadorCarrinho, em loja.js, usa o atributo hidden pra isso). */
.contador-carrinho[hidden] { display: none; }

/* --------------------------------- Página do carrinho --------------------------------- */
.linha-carrinho {
  display: flex;
  gap: var(--esp-3);
  padding: var(--esp-4) 0;
  border-bottom: 1px solid var(--cor-borda);
  align-items: center;
}
.linha-carrinho img { width: 68px; height: 84px; object-fit: cover; border-radius: var(--raio-pequeno); flex-shrink: 0; background: var(--cor-fundo-clara); }
.linha-carrinho-info { flex: 1; min-width: 0; }
.linha-carrinho-nome { font-weight: 600; font-size: 15px; }
.linha-carrinho-variacao { font-size: 13px; color: var(--cor-texto-suave); margin-top: 2px; }
.linha-carrinho-preco-unit { font-size: 13px; color: var(--cor-texto-suave); margin-top: 4px; }
.linha-carrinho-controles { display: flex; align-items: center; gap: var(--esp-3); flex-shrink: 0; }
.seletor-quantidade { display: flex; align-items: center; border: 1px solid var(--cor-borda); border-radius: 999px; overflow: hidden; }
.seletor-quantidade button {
  background: none; border: none; width: 40px; height: 40px; /* 21/09/2026: era 30px — alvo de toque maior */
  font-size: 16px; color: var(--cor-texto); display: flex; align-items: center; justify-content: center;
}
.seletor-quantidade button:hover { background: var(--cor-fundo-clara); }
.seletor-quantidade span { min-width: 22px; text-align: center; font-size: 14px; font-weight: 600; }
.linha-carrinho-subtotal { font-weight: 700; color: var(--cor-dourado-escuro); font-size: 15px; min-width: 72px; text-align: right; }
.botao-remover-item {
  background: none; border: none; color: var(--cor-texto-suave); font-size: 20px;
  line-height: 1; padding: 4px; flex-shrink: 0;
  min-width: 40px; min-height: 40px; display: flex; align-items: center; justify-content: center; /* 21/09/2026: alvo de toque */
}
.botao-remover-item:hover { color: var(--cor-erro); }
@media (max-width: 560px) {
  .linha-carrinho { flex-wrap: wrap; }
  .linha-carrinho-controles { width: 100%; justify-content: space-between; padding-left: calc(68px + var(--esp-3)); }
}

.resumo-carrinho {
  background: var(--cor-fundo-clara);
  border-radius: var(--raio);
  padding: var(--esp-5);
  margin-top: var(--esp-5);
}
.linha-resumo { display: flex; justify-content: space-between; font-size: 14px; padding: 6px 0; }
/* 13/09/2026: mesmo bug já corrigido em .banner-cookies (Fase 3) — sem isso,
   [hidden] (usado por loja.js pra esconder "Desconto do cupom" e "Subtotal
   com desconto" quando não tem cupom aplicado) perde pra .linha-resumo por
   empate de especificidade, e a linha aparece mesmo escondida. */
.linha-resumo[hidden] { display: none; }
.linha-resumo-total { border-top: 1px solid var(--cor-borda); margin-top: var(--esp-2); padding-top: var(--esp-3); font-size: 18px; font-weight: 700; }
.linha-resumo-total span:last-child { color: var(--cor-dourado-escuro); }

/* Opções de frete do carrinho: mesmo visual da página de produto
   (.opcao-frete), mas clicável — cada opção vira um rótulo de rádio, pra
   escolher qual frete entra no total antes de finalizar a compra. A classe
   .opcao-frete-destaque (já existente) é ligada/desligada via JavaScript
   conforme a escolha, em vez de depender de :has() (suporte ainda
   inconsistente em navegadores mais antigos). */
.opcao-frete-selecionavel { cursor: pointer; }
.opcao-frete-selecionavel input { position: absolute; opacity: 0; width: 0; height: 0; }

.carrinho-vazio { text-align: center; padding: var(--esp-8) 0; }
.carrinho-vazio p { color: var(--cor-texto-suave); margin-bottom: var(--esp-4); }

/* "Leve também" (Fase C do plano de produtos relacionados, 16/09/2026) —
   só o espaçamento; o carrossel em si (.carrossel-horizontal-wrap) e os
   cartões (.cartao-produto) já têm todo o resto do estilo, reaproveitado
   de Novidades/Mais compradas na home. */
.secao-leve-tambem { margin-top: var(--esp-6); }

/* --------------------------------- Home ampliada (07/09/2026, inspirada na Stril Brand) --------------------------------- */

/* Faixa de ícones logo abaixo do hero: troca fácil, envio e a bag de brinde
   (14/09/2026, redesenho inspirado na Stril Brand — ícone dentro de um chip
   redondo dourado, em vez do SVG solto de antes, pra dar mais peso visual
   sem sair da paleta da própria marca). */
.faixa-icones-home {
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
  gap: var(--esp-4) var(--esp-7);
  padding: var(--esp-5) var(--esp-3);
  margin-bottom: var(--esp-7);
  border-bottom: 1px solid var(--cor-borda);
  text-align: center;
}
.icone-topo {
  display: flex; align-items: center; gap: var(--esp-3);
  font-size: 13px; font-weight: 600;
  color: inherit; text-decoration: none; /* .icone-topo pode ser <a> ou <div> */
}
.icone-topo-chip {
  display: flex; align-items: center; justify-content: center;
  width: 38px; height: 38px; flex-shrink: 0; border-radius: 50%;
  background: var(--cor-fundo-clara); border: 1px solid var(--cor-dourado-claro);
}
.icone-topo-chip svg { color: var(--cor-dourado-escuro); }
a.icone-topo:hover .icone-topo-chip { background: var(--degrade-dourado); border-color: transparent; }
a.icone-topo:hover .icone-topo-chip svg { color: #fff; }

/* Banners grandes e clicáveis (categorias em destaque, e depois "linhas")
   — a foto de capa vem automaticamente de uma peça real daquele grupo
   (nunca uma imagem inventada ou genérica), com o nome por cima. */
.banners-vitrine {
  display: grid;
  grid-template-columns: 1fr;
  gap: var(--esp-4);
  margin: var(--esp-7) 0;
}
@media (min-width: 700px) { .banners-vitrine { grid-template-columns: repeat(3, 1fr); } }
.banner-vitrine {
  position: relative;
  display: block;
  aspect-ratio: 3 / 4;
  border-radius: var(--raio);
  overflow: hidden;
  background: var(--cor-fundo-clara);
}
.banner-vitrine img { width: 100%; height: 100%; object-fit: cover; object-position: 50% 30%; transition: transform 0.35s ease; display: block; }
.banner-vitrine:hover img { transform: scale(1.05); }
.banner-vitrine::after {
  content: "";
  position: absolute; inset: 0;
  background: linear-gradient(180deg, rgba(46,42,38,0) 45%, rgba(46,42,38,0.65) 100%);
}
/* Rótulo em pílula centralizada (14/09/2026, redesenho inspirado na Stril
   Brand: "short" / "casaco" / "macaquinho" contornados sobre a foto) — troca
   o texto alinhado à esquerda de antes (.banner-vitrine span). */
.banner-vitrine-rotulo {
  position: absolute; left: 50%; bottom: var(--esp-5); z-index: 1;
  transform: translateX(-50%);
  color: #fff; font-family: var(--fonte-display); font-weight: 600;
  font-size: clamp(18px, 2.4vw, 26px);
  padding: var(--esp-2) var(--esp-6);
  border: 1.5px solid #fff; border-radius: 999px;
  white-space: nowrap;
  text-transform: uppercase; /* 14/09/2026 (pedido da lojista): nome da subcategoria/linha em maiúsculas, sem mexer no texto salvo no banco */
  text-shadow: 0 2px 10px rgba(0,0,0,0.35);
}

/* Card de "Linhas" dentro do trilho que rola de lado (ver .carrossel-linhas
   acima): mesmo .banner-vitrine de sempre, só que com largura própria por
   card em vez de coluna de grid — assim dá pra caber exatamente 4 por
   fileira no desktop (1080px+) e ir crescendo aos poucos nas larguras
   menores, sempre com uma "espiadinha" do próximo card pra indicar que dá
   pra rolar. */
.banner-vitrine-linha {
  flex: 0 0 52%; /* 14/09/2026: era 66% — mesmo no celular ficava um card enorme e muito alto (proporção 3/4), maior até que os cards de produto dos outros carrosséis (190px fixos). 52% deixa perto dessa mesma proporção visual num celular comum, com uma "espiadinha" do próximo card quando existir mais de uma linha. */
  scroll-snap-align: start;
}
@media (min-width: 560px) { .banner-vitrine-linha { flex-basis: 40%; } }
@media (min-width: 820px) { .banner-vitrine-linha { flex-basis: 31%; } }
@media (min-width: 1080px) { .banner-vitrine-linha { flex-basis: calc(25% - var(--esp-4) * 3 / 4); } }

/* O rótulo em pílula (.banner-vitrine-rotulo, pensado pros cards bem mais
   largos de categoria/subcategoria — sempre largura cheia no celular)
   ficava estourando pra fora do card aqui, já que os cards de linha são
   bem mais estreitos no celular (acima) — a pílula tem largura fixa pelo
   texto, não pelo card, então um nome de linha um pouco mais longo cortava
   nas bordas (".banner-vitrine" tem overflow:hidden). Fonte menor,
   quebra de linha liberada e um teto de largura resolvem pros dois casos. */
.banner-vitrine-linha .banner-vitrine-rotulo {
  font-size: clamp(13px, 4vw, 18px);
  padding: 6px var(--esp-4);
  white-space: normal;
  max-width: calc(100% - 28px);
  text-align: center;
}
@media (min-width: 820px) {
  .banner-vitrine-linha .banner-vitrine-rotulo { font-size: clamp(15px, 1.8vw, 21px); }
}

/* Carrossel horizontal (Novidades e Mais compradas): rolagem lateral com
   setas, reaproveitando o .cartao-produto de sempre (com o botão Comprar
   visível), sem precisar de nenhuma biblioteca externa. */
.carrossel-horizontal-wrap { position: relative; margin: 0 calc(var(--esp-3) * -1); padding: 0 var(--esp-3); }
.carrossel-horizontal {
  display: flex;
  gap: var(--esp-4);
  overflow-x: auto;
  scroll-snap-type: x proximity;
  padding-bottom: var(--esp-2);
  scrollbar-width: none;
}
.carrossel-horizontal::-webkit-scrollbar { display: none; }
.carrossel-horizontal .cartao-produto { scroll-snap-align: start; flex: 0 0 190px; }
@media (min-width: 640px) { .carrossel-horizontal .cartao-produto { flex-basis: 230px; } }
.carrossel-seta {
  position: absolute;
  top: 38%;
  transform: translateY(-50%);
  z-index: 2;
  width: 36px; height: 36px;
  border-radius: 50%;
  border: none;
  background: var(--cor-branco);
  box-shadow: var(--sombra-forte);
  cursor: pointer;
  font-size: 18px;
  display: flex; align-items: center; justify-content: center;
}
.carrossel-seta-anterior { left: -4px; }
.carrossel-seta-proxima { right: -4px; }
@media (max-width: 700px) { .carrossel-seta { display: none; } }

/* "Elas usam" — prova social com fotos reais de clientes (fica escondida
   até a lojista cadastrar a primeira foto em elas_usam_fotos.php) */
.secao-elas-usam { margin: var(--esp-8) 0; }
.grade-elas-usam { display: grid; grid-template-columns: repeat(2, 1fr); gap: var(--esp-3); }
@media (min-width: 640px) { .grade-elas-usam { grid-template-columns: repeat(4, 1fr); } }

/* Depoimentos de cliente (14/09/2026, Fase C — inspirado na seção "Stril
   Spotted" da Stril Brand): cartão maior que a grade simples acima, com a
   fala da cliente em destaque. Uma coluna no celular, duas no desktop —
   com só 1 depoimento, ocupa a largura toda dos dois jeitos. */
.depoimentos-clientes { display: grid; grid-template-columns: 1fr; gap: var(--esp-4); margin-bottom: var(--esp-4); }
@media (min-width: 700px) { .depoimentos-clientes { grid-template-columns: repeat(2, 1fr); } }
.depoimento-cliente {
  display: flex;
  background: var(--cor-fundo-clara);
  border-radius: var(--raio);
  overflow: hidden;
}
.depoimento-cliente img { width: 140px; flex-shrink: 0; aspect-ratio: 3 / 4; object-fit: cover; }
.depoimento-cliente-texto { padding: var(--esp-4); display: flex; flex-direction: column; justify-content: center; gap: var(--esp-2); }
.depoimento-cliente-texto p {
  font-family: var(--fonte-display); font-style: italic; font-weight: 500;
  font-size: 15px; line-height: 1.5; color: var(--cor-texto); margin: 0;
}
.depoimento-cliente-texto span { font-size: 13px; font-weight: 600; color: var(--cor-dourado-escuro); }
@media (max-width: 480px) {
  .depoimento-cliente { flex-direction: column; }
  .depoimento-cliente img { width: 100%; aspect-ratio: 16 / 10; }
}
.elas-usam-item { position: relative; display: block; aspect-ratio: 4 / 5; border-radius: var(--raio); overflow: hidden; }
.elas-usam-item img { width: 100%; height: 100%; object-fit: cover; }
.elas-usam-item span {
  position: absolute; left: 8px; bottom: 8px; z-index: 1;
  color: #fff; font-size: 12px; font-weight: 600;
  text-shadow: 0 1px 6px rgba(0,0,0,0.55);
}
.elas-usam-item::after { content: ""; position: absolute; inset: 0; background: linear-gradient(180deg, rgba(46,42,38,0) 55%, rgba(46,42,38,0.55) 100%); }

/* Botão com cara de link (19/09/2026, Fase A de segurança/LGPD) — usado em
   "Preferências de cookies" no rodapé: precisa ser <button> (abre o banner,
   não navega pra lugar nenhum), mas visualmente igual aos links ao lado. */
.botao-como-link {
  background: none;
  border: 0;
  padding: 0;
  margin: 0;
  font: inherit;
  color: inherit;
  text-decoration: underline;
  cursor: pointer;
}
.botao-como-link:focus-visible {
  outline: 2px solid currentColor;
  outline-offset: 2px;
}

/* Faixa de aviso do modo teste (19/09/2026) — só aparece pra quem ativou o
   modo em modo_teste.php; nenhuma cliente vê. Cor amarela de propósito, bem
   diferente da paleta da loja, pra ninguém esquecer que está testando. */
.faixa-modo-teste {
  background: #FFE066;
  color: #2E2A26;
  text-align: center;
  padding: 8px 12px;
  font-size: 13px;
  line-height: 1.4;
}
.faixa-modo-teste a { color: inherit; text-decoration: underline; margin-left: 6px; }

/* Fase E (20/09/2026) — banner de cookies com duas escolhas. "Só essenciais" e
   "Aceitar todos" usam a MESMA classe (.botao-secundario), então têm o mesmo
   peso visual; "Personalizar" é um link discreto. O painel das duas categorias
   ocupa a linha inteira embaixo do texto. Mesmo cuidado de sempre com [hidden]
   (uma regra com display:flex venceria o atributo hidden do navegador). */
.banner-cookies-personalizar { color: #fff; font-size: 13px; align-self: center; white-space: nowrap; }
.painel-cookies[hidden] { display: none; }
.painel-cookies {
  flex: 1 1 100%;
  display: flex;
  flex-direction: column;
  gap: 10px;
  text-align: left;
  border-top: 1px solid rgba(255,255,255,0.25);
  padding-top: var(--esp-3);
}
.painel-cookies-item { display: flex; align-items: flex-start; gap: 10px; font-size: 13px; cursor: pointer; }
.painel-cookies-item input { margin-top: 3px; width: 18px; height: 18px; flex-shrink: 0; }
.painel-cookies .botao { align-self: flex-start; padding: 10px 18px; font-size: 13px; }
@media (max-width: 600px) {
  .banner-cookies-botoes { flex-wrap: wrap; }
  .painel-cookies .botao { align-self: stretch; }
}

/* =====================================================================
   21/09/2026 — Pacote de usabilidade e movimento suave (v132)
   Direção: feminino, delicado e elegante, com movimento fluido (ver a
   skill do projeto em .claude/skills/oxuai-frontend). Regras deste bloco:
   só transform/opacity nas animações, curva suave (arranque leve, freada
   longa), e tudo desligado em "reduzir movimento" (bloco no fim daqui).
   ===================================================================== */

/* Texto só pra leitor de tela e buscadores (invisível, não ocupa espaço). */
.somente-leitor-de-tela {
  position: absolute;
  width: 1px;
  height: 1px;
  padding: 0;
  margin: -1px;
  overflow: hidden;
  clip: rect(0, 0, 0, 0);
  white-space: nowrap;
  border: 0;
}

/* Brilho dourado que atravessa o botão principal ao passar o mouse — ecoa o
   degradê metálico da logo. Só onde existe hover de verdade (não no toque). */
.botao-primario { position: relative; overflow: hidden; }
.botao-primario::after {
  content: '';
  position: absolute;
  inset: 0;
  pointer-events: none;
  background: linear-gradient(105deg, transparent 35%, rgba(255, 255, 255, 0.38) 50%, transparent 65%);
  transform: translateX(-130%);
}
@media (hover: hover) {
  .botao-primario:hover::after {
    transform: translateX(130%);
    transition: transform 0.9s cubic-bezier(0.22, 0.61, 0.36, 1);
  }
}

/* Número no ícone do carrinho "respira" quando entra uma peça. */
@keyframes contador-respiro {
  0%   { transform: scale(1); }
  35%  { transform: scale(1.4); }
  100% { transform: scale(1); }
}
.contador-carrinho.respiro { animation: contador-respiro 0.7s cubic-bezier(0.22, 0.61, 0.36, 1); }

/* Aviso "Adicionado ao carrinho ✓" (criado por mostrarAvisoCarrinho, loja.js).
   Sobe suavemente e fica acima do banner de cookies (80), das barras fixas (70)
   e do botão de WhatsApp. */
.aviso-carrinho {
  position: fixed;
  left: var(--esp-4);
  right: var(--esp-4);
  bottom: calc(var(--esp-4) + env(safe-area-inset-bottom, 0px));
  z-index: 90;
  max-width: 460px;
  margin: 0 auto;
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: var(--esp-3);
  background: var(--cor-branco);
  border: 1px solid var(--cor-borda);
  border-radius: var(--raio);
  box-shadow: var(--sombra-forte);
  padding: var(--esp-3) var(--esp-4);
  opacity: 0;
  transform: translateY(14px);
  transition: opacity 0.45s cubic-bezier(0.22, 0.61, 0.36, 1), transform 0.45s cubic-bezier(0.22, 0.61, 0.36, 1);
}
.aviso-carrinho.visivel { opacity: 1; transform: translateY(0); }
.aviso-carrinho-texto { flex: 1 1 180px; min-width: 0; display: flex; flex-direction: column; gap: 2px; font-size: 14px; }
.aviso-carrinho-texto strong { color: var(--cor-sucesso); }
.aviso-carrinho-texto span { color: var(--cor-texto-suave); font-size: 13px; overflow-wrap: anywhere; }
.aviso-carrinho-acoes { display: flex; align-items: center; flex-wrap: wrap; gap: var(--esp-3); }
.aviso-carrinho .botao { padding: 11px 20px; font-size: 13px; }
.aviso-carrinho-continuar {
  background: none;
  border: none;
  padding: 0 4px;
  min-height: 44px;
  font: inherit;
  font-size: 13px;
  color: var(--cor-texto);
  text-decoration: underline;
  cursor: pointer;
}
@media (min-width: 861px) {
  /* No computador fica no canto inferior ESQUERDO: longe dos botões de compra
     (coluna da direita) e do botão flutuante de WhatsApp (canto direito). */
  .aviso-carrinho { left: var(--esp-5); right: auto; bottom: var(--esp-5); margin: 0; width: 380px; }
}

/* "Pagar agora" enquanto o frete não foi calculado: mais apagado, mas continua
   clicável de propósito (o clique leva ao campo do CEP — ver loja.js). */
.botao-aguardando-frete { opacity: 0.6; box-shadow: none; }
.botao-aguardando-frete:hover { transform: none; box-shadow: none; }
.botao-aguardando-frete::after { display: none; }
.dica-frete-carrinho { font-size: 13px; color: var(--cor-texto-suave); text-align: center; margin: var(--esp-2) 0 0; }
.dica-frete-carrinho[hidden] { display: none; }

/* Alvos de toque (auditoria 20/09/2026): aumenta a área clicável SEM mexer no
   tamanho visual nem no espaçamento dos ícones do cabeçalho e dos pontinhos
   do carrossel. */
.cabecalho .acoes button.menu-mobile,
.cabecalho .acoes a.menu-mobile,
.link-carrinho,
.hero-ponto { position: relative; }
.cabecalho .acoes button.menu-mobile::before,
.cabecalho .acoes a.menu-mobile::before,
.link-carrinho::before { content: ''; position: absolute; inset: -8px -6px; }
.hero-ponto::before { content: ''; position: absolute; inset: -14px -4px; }
/* "Ver tudo →": área de toque maior, compensada com margem negativa (o texto não muda de lugar). */
.secao-titulo a { display: inline-block; padding: 12px 8px; margin: -12px -8px; }

/* Reduzir movimento (preferência do aparelho/navegador da pessoa): desliga as
   animações e transições, o brilho do botão e a rolagem suave. O "!important"
   é proposital e é o padrão para essa regra — ela precisa vencer qualquer
   animação declarada acima ou em outro ponto do arquivo. */
@media (prefers-reduced-motion: reduce) {
  *, *::before, *::after {
    animation-duration: 0.01ms !important;
    animation-iteration-count: 1 !important;
    transition-duration: 0.01ms !important;
    scroll-behavior: auto !important;
  }
  /* 23/09/2026 (pacote 2): a regra genérica acima (duração quase zero) deixaria
     a faixa de benefícios "congelada" no meio do deslize, mostrando o grupo
     DUPLICADO (marcado aria-hidden) no lugar do original — funciona pro olho
     (o conteúdo é idêntico), mas é mais claro simplesmente voltar a faixa pro
     estado parado de sempre. */
  .faixa-icones-trilha { animation: none !important; transform: none !important; flex-wrap: wrap; justify-content: center; width: auto; }
  .faixa-icones-grupo { padding-right: 0; }
  .faixa-icones-grupo[aria-hidden] { display: none; }
  .faixa-icones-grupo:not([aria-hidden]) .faixa-icones-separador:last-child { display: none; } /* sem separador sobrando depois do último item, parado */
  /* Idem pro "revelar ao rolar" dos cartões de produto (mais abaixo): sem
     movimento, todo cartão já nasce visível — nunca preparado/escondido. */
  .js-revelar.js-preparado { opacity: 1 !important; transform: none !important; }
}

/* CORREÇÃO (achada nos testes da v132, 21/09/2026): no celular o botão "Calcular"
   (frete) e o "Aplicar" (cupom) saíam da tela pela direita — o campo de texto
   tem largura própria (~223px) e o "white-space: nowrap" do botão não deixava a
   linha (limitada a 320px) encolher, então o botão ficava ~37px pra fora e o
   texto cortado. Deixando o campo encolher (min-width: 0) a linha cabe. */
#cepFreteCarrinho,
#codigoCupom { flex: 1 1 0; min-width: 0; }

/* =====================================================================
   23/09/2026 — Pacote 2 de usabilidade e movimento (v133): faixa animada de
   benefícios, segunda foto no hover, revelar ao rolar e compra rápida no
   cartão. Mesma direção da skill (suave, feminino, sempre com ideia de
   movimento) e as mesmas regras do pacote 1 (só transform/opacity, curva
   suave, sempre com um jeito de funcionar sem JS ou com reduzir movimento).
   ===================================================================== */

/* --- Faixa animada de benefícios (home) --------------------------------- */
/* Era uma fileira estática de 3 ícones (13/09/2026) — vira uma esteira que
   desliza sozinha, devagar, com o MESMO conteúdo real (nada novo inventado).
   Pausa ao passar o mouse ou focar (sem precisar de JS: :hover/:focus-within
   já bastam) e volta a ser a fileira parada de sempre com reduzir movimento
   (ver bloco @media (prefers-reduced-motion) lá em cima). */
.faixa-icones-home {
  overflow: hidden;
  padding: var(--esp-5) 0;
  margin-bottom: var(--esp-7);
  border-bottom: 1px solid var(--cor-borda);
}
.faixa-icones-trilha {
  display: flex;
  align-items: center;
  width: max-content;
  animation: faixa-beneficios-deslizar 34s linear infinite;
}
.faixa-icones-home:hover .faixa-icones-trilha,
.faixa-icones-home:focus-within .faixa-icones-trilha { animation-play-state: paused; }
@keyframes faixa-beneficios-deslizar {
  from { transform: translateX(0); }
  to { transform: translateX(-50%); } /* exatamente 1 grupo (são 2 grupos idênticos, ver index.php) */
}
.faixa-icones-grupo {
  display: flex;
  align-items: center;
  /* Espaço menor que o antigo (era --esp-7/48px): agora cada item tem um
     separador "•" próprio do lado (ver index.php), o respiro grande ficava
     estranho ao redor de um pontinho tão pequeno. */
  gap: var(--esp-5);
  flex-shrink: 0;
  padding-right: var(--esp-5);
}
.faixa-icones-home .icone-topo { white-space: nowrap; }
.faixa-icones-separador { color: var(--cor-dourado-claro); font-size: 15px; }

/* --- Segunda foto ao passar o mouse (cartão de produto) ------------------ */
/* Só em telas com hover de verdade (nunca em toque — ver @media hover:hover):
   a 2ª foto da galeria da peça (quando existe) some por cima da capa devagar,
   um gesto pequeno que ajuda a decidir sem precisar abrir a peça. */
.cartao-produto .foto img.foto-hover {
  position: absolute;
  inset: 0;
  opacity: 0;
  transition: opacity 0.45s cubic-bezier(0.22, 0.61, 0.36, 1);
}
@media (hover: hover) {
  .cartao-produto:hover .foto img.foto-hover { opacity: 1; }
}

/* --- Revelar ao rolar (cartões de produto) -------------------------------- */
/* Regra de ouro (skill do projeto): SEM JavaScript o cartão já nasce visível
   — é o JAVASCRIPT que adiciona ".js-preparado" (esconde) antes de revelar
   de novo com ".js-revelado" [iniciarRevelarAoRolar(), loja.js]. Nunca o
   contrário. Um empurrãozinho pra cima (a mesma direção "subir e abrir" da
   skill), rápido e suave. */
.js-revelar.js-preparado {
  opacity: 0;
  transform: translateY(14px);
  transition: opacity 0.6s cubic-bezier(0.22, 0.61, 0.36, 1), transform 0.6s cubic-bezier(0.22, 0.61, 0.36, 1);
}
.js-revelar.js-preparado.js-revelado { opacity: 1; transform: none; }
/* Escalonado por posição no grid/carrossel (até 6, depois repete) — skill:
   "no máximo 6 itens escalonados". Só quando ainda não revelado, pra não
   atrasar quem já está com o cartão visível (ver JS: só entra em
   .js-preparado quem NÃO está na tela no momento do carregamento). */
.js-revelar.js-preparado:nth-child(6n + 2) { transition-delay: 70ms; }
.js-revelar.js-preparado:nth-child(6n + 3) { transition-delay: 140ms; }
.js-revelar.js-preparado:nth-child(6n + 4) { transition-delay: 210ms; }
.js-revelar.js-preparado:nth-child(6n + 5) { transition-delay: 280ms; }
.js-revelar.js-preparado:nth-child(6n) { transition-delay: 350ms; }

/* --- Compra rápida no cartão ---------------------------------------------- */
/* Botão pequeno sobre a foto (funciona igual no toque e no mouse — nunca só
   por hover, senão some no celular) que abre o modal com cor/tamanho, pra
   comprar sem sair da vitrine. */
.botao-compra-rapida {
  position: absolute;
  top: var(--esp-2);
  right: var(--esp-2);
  z-index: 2;
  display: flex;
  align-items: center;
  justify-content: center;
  width: 36px;
  height: 36px;
  border-radius: 50%;
  border: none;
  background: rgba(255, 255, 255, 0.92);
  color: var(--cor-texto);
  box-shadow: var(--sombra);
  cursor: pointer;
  transition: transform 0.2s cubic-bezier(0.22, 0.61, 0.36, 1), background 0.2s ease, color 0.2s ease;
}
.botao-compra-rapida:hover,
.botao-compra-rapida:focus-visible { background: var(--degrade-dourado); color: #fff; transform: scale(1.06); }
.botao-compra-rapida:active { transform: scale(0.96); }
.botao-compra-rapida svg { pointer-events: none; }
/* Alvo de toque de 44px sem aumentar o círculo visual (mesmo truque já usado
   nos ícones do cabeçalho, pacote 1). */
.botao-compra-rapida::before { content: ''; position: absolute; inset: -4px; }

/* Modal de compra rápida (mesmo "molde" do modal de guia de medidas, só um
   pouco mais estreito — é um formulário curto, não uma tabela). */
.modal-compra-rapida {
  border: none;
  border-radius: var(--raio);
  padding: 0;
  width: calc(100% - 32px);
  max-width: 420px;
  max-height: 85vh;
  box-shadow: var(--sombra-forte);
}
.modal-compra-rapida::backdrop { background: rgba(20, 16, 12, 0.55); }
.modal-compra-rapida-corpo { padding: var(--esp-5); overflow-y: auto; max-height: calc(85vh - 64px); }
.compra-rapida-produto { display: flex; gap: var(--esp-3); align-items: center; margin-bottom: var(--esp-2); }
.compra-rapida-produto img { width: 64px; height: 80px; object-fit: cover; border-radius: var(--raio-pequeno); background: var(--cor-fundo-clara); flex-shrink: 0; }
.compra-rapida-nome { font-weight: 600; font-size: 15px; }
.compra-rapida-preco { color: var(--cor-dourado-escuro); font-weight: 700; margin-top: 2px; }
.compra-rapida-preco-de { font-size: 13px; color: var(--cor-texto-suave); text-decoration: line-through; margin-right: 6px; }

/* =====================================================================
   24/09/2026 — "Elas usam" com look comprável (elas_usam.php, pacote 3).
   Reaproveita o máximo de token/classe já existente (.opcao-tamanho,
   .selecao-titulo, .modal-medidas-cabecalho, .modal-fechar,
   .preco-de-riscado, .elas-usam-item como referência visual) — pouca
   regra nova.
   ===================================================================== */

.filtro-tamanho-estilo { display: flex; flex-wrap: wrap; gap: var(--esp-2); margin: var(--esp-5) 0; }
/* .opcao-tamanho já existe (produto.php) — aqui é <a>, não <button>, mas a
   classe funciona igual (é só CSS, não liga pro tipo do elemento). */
.filtro-tamanho-estilo .opcao-tamanho { text-decoration: none; }

.grade-estilo-clientes { display: grid; grid-template-columns: repeat(2, 1fr); gap: var(--esp-3); }
@media (min-width: 640px) { .grade-estilo-clientes { grid-template-columns: repeat(4, 1fr); } }

/* Mesmo desenho visual de .elas-usam-item (foto 4:5 + gradiente + legenda),
   só que como <button> (abre o modal) e com um selo de tamanho no canto.
   26/09/2026 (v137): a foto passou pra dentro de .cartao-estilo-cliente-foto, pra
   o cartão COM depoimento poder mostrar o texto ao lado (ver mais abaixo). */
.cartao-estilo-cliente {
  display: block;
  width: 100%;
  border-radius: var(--raio);
  overflow: hidden;
  border: none;
  padding: 0;
  cursor: pointer;
  background: var(--cor-fundo-clara);
  font: inherit;
  color: inherit;
  text-align: left;
}
.cartao-estilo-cliente-foto { position: relative; display: block; aspect-ratio: 4 / 5; overflow: hidden; background: var(--cor-fundo-clara); }
.cartao-estilo-cliente-foto img { width: 100%; height: 100%; object-fit: cover; display: block; transition: transform 0.4s cubic-bezier(0.22, 0.61, 0.36, 1); }
.cartao-estilo-cliente:hover img,
.cartao-estilo-cliente:focus-visible img { transform: scale(1.04); }
.cartao-estilo-cliente:not(.cartao-estilo-cliente-depoimento) .cartao-estilo-cliente-foto::after { content: ""; position: absolute; inset: 0; background: linear-gradient(180deg, rgba(46,42,38,0) 55%, rgba(46,42,38,0.6) 100%); pointer-events: none; }

/* Cartão COM depoimento (26/09/2026, pedido da lojista): o que a cliente disse já
   aparece na grade, sem precisar tocar na foto — ocupa a linha inteira, foto de um
   lado e texto do outro (mesma ideia do .depoimento-cliente da home). */
.cartao-estilo-cliente-depoimento {
  grid-column: 1 / -1;
  display: flex;
  background: var(--cor-branco);
  box-shadow: var(--sombra);
}
.cartao-estilo-cliente-depoimento .cartao-estilo-cliente-foto { width: 40%; max-width: 240px; flex-shrink: 0; aspect-ratio: 3 / 4; }
.cartao-estilo-cliente-texto { display: flex; flex-direction: column; justify-content: center; gap: var(--esp-2); padding: var(--esp-4); min-width: 0; }
.cartao-estilo-cliente-citacao { display: block; font-family: var(--fonte-display); font-style: italic; font-size: 15px; line-height: 1.45; color: var(--cor-texto); }
.cartao-estilo-cliente-nome { display: block; font-size: 13px; font-weight: 600; color: var(--cor-dourado-escuro); }
.cartao-estilo-cliente-ver { display: block; font-size: 12px; font-weight: 600; text-transform: uppercase; letter-spacing: 0.08em; color: var(--cor-texto-suave); }
@media (min-width: 640px) {
  .cartao-estilo-cliente-depoimento { grid-column: span 2; }
  .cartao-estilo-cliente-citacao { font-size: 16px; }
}
.cartao-estilo-cliente-legenda {
  position: absolute; left: 10px; bottom: 8px; z-index: 1;
  color: #fff; font-size: 12px; font-weight: 600;
  text-shadow: 0 1px 6px rgba(0,0,0,0.55);
}
.cartao-estilo-cliente-tamanho {
  position: absolute; top: 8px; right: 8px; z-index: 1;
  background: rgba(255,255,255,0.92); color: var(--cor-texto);
  font-size: 11px; font-weight: 700; letter-spacing: 0.03em;
  padding: 3px 9px; border-radius: 999px;
}

/* Modal do look. 26/09/2026 (v137, pedido da lojista): antes eram DUAS rolagens (o
   <dialog> e o corpo dele rolavam cada um) e a foto 4:5 ocupava a tela toda, então o
   depoimento ficava lá embaixo. Agora: uma rolagem só (só o corpo rola, o <dialog>
   não), foto com altura limitada (inteira, sem cortar a cliente) e o "×" flutuando
   por cima da foto em vez de uma barra de título que só gastava espaço. No
   computador, foto de um lado e informações do outro. */
.modal-estilo-cliente {
  border: none;
  border-radius: var(--raio);
  padding: 0;
  width: calc(100% - 32px);
  max-width: 460px;
  max-height: 90vh;
  overflow: hidden;
  box-shadow: var(--sombra-forte);
}
.modal-estilo-cliente[open] { display: flex; flex-direction: column; }
.modal-estilo-cliente::backdrop { background: rgba(20, 16, 12, 0.6); }
.modal-estilo-cliente-corpo { flex: 1 1 auto; min-height: 0; overflow-y: auto; }
.modal-fechar-flutuante {
  position: absolute; top: var(--esp-2); right: var(--esp-2); z-index: 2;
  width: 40px; height: 40px; padding: 0; border-radius: 50%;
  display: flex; align-items: center; justify-content: center;
  background: rgba(255,255,255,0.92); color: var(--cor-texto); box-shadow: var(--sombra);
}
.modal-fechar-flutuante:hover { background: var(--cor-branco); }
#estiloClienteFoto { width: 100%; height: 44vh; object-fit: contain; display: block; background: var(--cor-fundo-clara); }
.estilo-cliente-info { min-width: 0; }
@media (min-width: 700px) {
  .modal-estilo-cliente { max-width: 820px; }
  .modal-estilo-cliente-corpo { display: flex; }
  #estiloClienteFoto { width: 50%; height: auto; max-height: 90vh; flex-shrink: 0; object-fit: cover; }
  .estilo-cliente-info { flex: 1; display: flex; flex-direction: column; justify-content: center; padding-block: var(--esp-5); }
}
.estilo-cliente-cabecalho { display: flex; align-items: flex-start; justify-content: space-between; gap: var(--esp-3); padding: var(--esp-4) var(--esp-5) 0; }
.estilo-cliente-legenda { font-weight: 600; font-size: 16px; }
.estilo-cliente-tamanho { display: inline-block; margin-top: 4px; font-size: 12px; color: var(--cor-texto-suave); }
.estilo-cliente-instagram { font-size: 13px; font-weight: 600; color: var(--cor-dourado-escuro); text-decoration: none; white-space: nowrap; }
.estilo-cliente-instagram:hover { text-decoration: underline; }
.estilo-cliente-depoimento { padding: var(--esp-3) var(--esp-5) 0; color: var(--cor-texto-suave); font-size: 14px; font-style: italic; }
#estiloClientePecasBloco { padding: 0 var(--esp-5); }
/* Respiro no fim, qualquer que seja o último item visível (peças, depoimento ou nome). */
.estilo-cliente-info { padding-bottom: var(--esp-5); }
.estilo-cliente-pecas { display: flex; flex-direction: column; gap: var(--esp-2); }
.estilo-cliente-peca {
  display: flex; gap: var(--esp-3); align-items: center;
  padding: var(--esp-2); border-radius: var(--raio-pequeno);
  border: 1px solid var(--cor-borda); text-decoration: none; color: inherit;
  transition: border-color 0.2s ease, background 0.2s ease;
}
.estilo-cliente-peca:hover,
.estilo-cliente-peca:focus-visible { border-color: var(--cor-dourado); background: var(--cor-fundo-clara); }
.estilo-cliente-peca img { width: 48px; height: 60px; object-fit: cover; border-radius: var(--raio-pequeno); flex-shrink: 0; background: var(--cor-fundo-clara); }
.estilo-cliente-peca-info { min-width: 0; }
.estilo-cliente-peca-nome { font-weight: 600; font-size: 14px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.estilo-cliente-peca-preco { font-size: 13px; color: var(--cor-dourado-escuro); font-weight: 700; margin-top: 2px; }
