/* ══ Loja Nozama 3D ══════════════════════════════════════════════════════
   A identidade é a mesma do painel: azul da marca, raio de 7px em tudo,
   Sora no display, Inter no texto e JetBrains Mono no dinheiro. A loja não
   inventa um segundo sistema visual porque é a mesma empresa.
   Tema claro e comercial, sem hero escuro: as peças resolvem problema de
   casa, não são gadget de vitrine.
   ═════════════════════════════════════════════════════════════════════════ */
/* O atributo `hidden` tem que VENCER, sempre.
   Ele é `display:none` só na folha do navegador, e qualquer regra
   nossa com `display:flex` ganha dele por especificidade. Aconteceu
   duas vezes em 24/08/2026: a lente do zoom nasceu aberta e a linha do
   desconto continuou na tela depois de o cupom deixar de valer,
   mostrando um valor que não estava sendo cobrado. É o tipo de erro que
   não aparece em teste de JS, porque o atributo ESTAVA certo. */
[hidden]{display:none !important}

:root{
  /* O azul da MARCA é o do logo de verdade (amostrado do arquivo: #0068C9).
     Antes era um tom aproximado, e ele aparecia lado a lado com o logo na
     mesma tela, dois azuis parecidos brigando é pior que um azul só. */
  --primary:#0068C9; --primary-rgb:0 104 201; --deep:#004E96; --accent:#4B9BE8;
  /* AÇÃO é o azul do Mercado Livre, e existe SEPARADO da marca de propósito:
     o logo continua sendo o logo, e todo botão que FAZ alguma coisa usa o azul
     que o brasileiro já aprendeu a reconhecer como "clique aqui para comprar".
     O par claro é o do botão secundário do ML: mesma família, peso menor, para
     dizer "esta é a segunda opção" sem sumir da tela. */
  --acao:#3483FA; --acao-rgb:52 131 250; --acao-forte:#2968C8; --acao-fraca:#E3EDFB;
  --ink:#16233B; --ink-soft:#5A6A85; --ink-fraco:#8A9AB4;
  --ground:#F4F7FC; --surface:#fff; --surface-2:#EEF3FB; --edge:#DDE5F0;
  --ok:#0E9F6E; --ok-rgb:14 159 110; --warn:#B4791A;
  --r:7px;
  /* Fundos com cor própria, para o escuro poder trocá-los pelo TOKEN em vez de
     cada componente carregar um hex solto. */
  --alto:#F8FAFD; --linha-fraca:#F1F5FA; --off-fundo:#E7F8EE; --off-txt:#0B7A3E;
  --aviso-fundo:#FFF8EC; --aviso-borda:#F4D9A6; --aviso-txt:#6B4E14;
  --titulo:#2B2B2B;
}

/* ══ TEMA ESCURO ════════════════════════════════════════════════════════════
   Segue o SISTEMA, sem botão de troca: loja não é lugar de configurar tema, e
   quem quer escuro já configurou no aparelho.

   Só os TOKENS mudam aqui. Nenhum componente ganha regra de cor própria dentro
   deste bloco, se ganhasse, a próxima cor escrita direto num componente
   apareceria errada num dos dois temas e ninguém saberia por quê. */
/* A guarda `:not([data-tema="claro"])` é o que permite CLAREAR quem está no
   escuro do sistema: sem ela, a media query venceria o clique e o botão não
   faria nada para metade dos visitantes. */
@media (prefers-color-scheme: dark){
  :root:not([data-tema="claro"]){
    /* O azul da marca clareia: #0068C9 sobre fundo escuro fica pesado e some.
       O logo continua com a cor dele, ele é uma imagem, e mexer nela seria
       mexer na marca. */
    --primary:#4B9BE8; --primary-rgb:75 155 232; --deep:#0068C9; --accent:#8CC4F2;
    --acao:#4A93FB; --acao-rgb:74 147 251; --acao-forte:#3B7ADB; --acao-fraca:#16283F;

    --ink:#E8EDF5; --ink-soft:#A8B6CB; --ink-fraco:#7C8CA5;
    --ground:#0B1220; --surface:#111C2F; --surface-2:#18263C; --edge:#243450;
    --ok:#34C68B; --ok-rgb:52 198 139; --warn:#D9A648;

    --alto:#16233B; --linha-fraca:#1C2C46; --off-fundo:#123326; --off-txt:#5BD9A3;
    --aviso-fundo:#2A2214; --aviso-borda:#4A3C1E; --aviso-txt:#E5C27C;
    --titulo:#E8EDF5;
  }

  /* A foto do produto continua sobre o fundo claro que ela tem: escurecer o
     bloco faria a peça branca desaparecer. É por isso que `image_bg` existe. */
  .palco-fig,.card-fig,.cat-fig{filter:none}
}
*{box-sizing:border-box}
body{margin:0;background:var(--ground);color:var(--ink);
  font-family:Inter,system-ui,-apple-system,sans-serif;font-size:15px;line-height:1.55;
  -webkit-font-smoothing:antialiased}
h1,h2,h3,h4{font-family:Sora,Inter,sans-serif;letter-spacing:-.02em;text-wrap:balance;margin:0}
a{color:inherit;text-decoration:none}
img{max-width:100%;height:auto;display:block}
button{font:inherit;color:inherit;cursor:pointer;border:0;background:none}
:focus-visible{outline:2px solid var(--primary);outline-offset:2px;border-radius:var(--r)}
/* O recuo da coluna numa variável, e não num 20 repetido: quem precisa
   alinhar com o `.wrap` por fora dele (o painel do menu, que é absoluto)
   passa a ler o mesmo número em vez de copiá-lo. */
:root{--recuo:20px}
/* ⚠️ A COLUNA É 1400, E ELA VALE PARA TUDO (03/10/2026).
   Era 1200, e numa tela de 1387 isso deixava uns 100px de vazio de cada lado
   da grade: os cards paravam antes da borda e a página parecia uma coluna no
   meio do monitor.

   Mudar SÓ a grade seria pior que o problema: o logo, a busca, o menu, o
   banner e o rodapé continuariam em 1200 e a grade sairia desalinhada de tudo.
   Quem define a coluna é o `.wrap`, e mais ninguém: é a regra que este projeto
   já pagou seis vezes para aprender.

   1400 e não mais: a leitura longa (descrição do produto, políticas) tem
   medida PRÓPRIA em `ch` e não estica junto, mas o topo e a grade esticam, e
   acima disso o card começa a ficar grande demais para a foto que ele tem. */
.wrap{max-width:1400px;margin:0 auto;padding:0 var(--recuo)}
.linha{display:flex;align-items:center;gap:22px}
.chapeu{font-size:10.5px;font-weight:700;letter-spacing:.14em;text-transform:uppercase;color:var(--ink-fraco)}
.preco,.card-preco b,.mini-preco,.banner-preco b{font-family:"JetBrains Mono",ui-monospace,monospace;font-variant-numeric:tabular-nums}

/* topo */
.barra-topo{background:var(--deep);color:#BBD7F5;font-size:12.5px;padding:8px 0}
/* As três repartidas na largura, não duas encostadas na esquerda e uma
   jogada na direita: com `margin-left:auto` na última sobrava um vão de uns
   200px no meio da faixa, e as duas primeiras pareciam uma frase só que
   quebrou. `space-between` dá a mesma respiração para os dois vãos. */
.barra-topo .linha{justify-content:space-between;gap:14px}
.topo{background:var(--surface);border-bottom:1px solid var(--edge);position:sticky;top:0;z-index:40}
.topo .linha{height:66px}
.marca{font-family:Sora,Inter,sans-serif;font-weight:800;font-size:18px;display:flex;align-items:center;gap:9px;white-space:nowrap}
.marca span:not(.marca-i){color:var(--primary)}

/* O botão vive DENTRO do campo, e por isso precisa de altura própria em vez
   de padding: com `padding:8px 16px` ele ficava 4px mais baixo que a caixa
   e sobrava uma fresta de fundo cinza em volta, que lê como se estivesse
   espremido. Altura calculada da caixa menos as bordas, e um respiro de
   4px de cada lado. */
.busca{flex:1;display:flex;align-items:stretch;gap:9px;border:1.5px solid var(--edge);
  border-radius:var(--r);background:var(--alto);padding:4px 4px 4px 13px;
  min-height:46px;color:var(--ink-fraco)}
.busca > svg{align-self:center;flex:0 0 auto}
.busca input{flex:1;border:0;background:none;outline:none;font-size:14px;color:var(--ink);min-width:0}
.busca button{flex:0 0 auto;margin-left:auto;background:var(--acao);color:#fff;
  font-size:13px;font-weight:600;padding:0 20px;border-radius:calc(var(--r) - 1px);
  display:flex;align-items:center;justify-content:center;white-space:nowrap}
.busca button:hover{background:var(--acao-forte)}
.sacola{position:relative;display:flex;padding:6px}
/* O contador é absoluto com `right` NEGATIVO para abraçar o canto do ícone.
   Com o carrinho encostado na borda direita da página, esses 4px viravam
   4px de rolagem lateral no celular, bastante para o navegador mostrar
   a barra e nada para a pessoa entender por quê. */
.sacola-n{position:absolute;top:-2px;right:-2px;background:var(--primary);color:#fff;font-size:9.5px;font-weight:700;
  min-width:17px;height:17px;border-radius:99px;display:grid;place-items:center;padding:0 4px;
  font-family:"JetBrains Mono",monospace}
.menu{background:var(--surface);border-bottom:1px solid var(--edge)}
.menu .linha{min-height:44px;gap:24px;font-size:13.5px;font-weight:600;flex-wrap:wrap;overflow:visible}
.menu a{color:var(--ink-soft);white-space:nowrap;height:44px;display:flex;align-items:center;border-bottom:2px solid transparent}
.menu a.on{color:var(--primary);border-color:var(--primary)}

/* vitrine */
.vitrine-topo{display:grid;grid-template-columns:2fr 1fr;gap:16px;padding-top:20px}
/* Com banner CADASTRADO a dobra é dele inteira: os dois cartões do lado
   existem para ocupar o terço que sobra do carrossel automático, e mantê-los
   devolveria o banner ao tamanho de antes, que é justamente o que o desenho de
   largura cheia veio resolver. */
.vitrine-topo.so-banner{grid-template-columns:1fr}
/* ── banner: carrossel com fundo de camadas ─────────────────────────────────
   O fundo não é degradê: é o azul da marca com CAMADAS FINAS horizontais, que
   é literalmente como a peça sai da máquina. Conta o que a loja faz sem
   escrever nada, e sobrevive ao celular barato (as camadas somem para um azul
   chapado se a tela lavar, em vez de virar um borrão cinza como o degradê).
   Por cima, dois brilhos radiais bem fracos dão profundidade sem clarear o
   texto branco. */
.banner-caixa{position:relative;border-radius:var(--r);overflow:hidden;
  background:var(--surface);border:1px solid var(--edge)}
/* ══ CAMADAS: a assinatura visual da casa ═══════════════════════════════════
   Linhas horizontais finas com um brilho no canto. São literalmente como a peça
   sai da máquina, o tema conta o que a loja faz sem escrever nada.

   Duas receitas porque o fundo muda: sobre COR (banner) as linhas são brancas;
   sobre o cinza-claro dos cartões, branco não apareceria e elas viram escuras.
   A mesma opacidade nos dois casos daria um efeito forte num e invisível no
   outro.

   Vale para tudo que é bloco de FOTO. Fora deles, não: sobre texto as linhas
   viram ruído e atrapalham a leitura. */
.camadas{position:relative}
.camadas::before{
  content:"";position:absolute;inset:0;pointer-events:none;z-index:1;
  background:
    radial-gradient(110% 80% at 82% 10%, rgba(255,255,255,.14), transparent 60%),
    repeating-linear-gradient(180deg,
      rgba(255,255,255,.05) 0px, rgba(255,255,255,.05) 1px,
      transparent 1px, transparent 7px)}

/* Sobre fundo claro o desenho inverte: a luz vem de branco mais forte e as
   linhas passam a ser sombra. */
.camadas-claro{position:relative}
.camadas-claro::before{
  content:"";position:absolute;inset:0;pointer-events:none;z-index:1;
  background:
    radial-gradient(110% 80% at 80% 8%, rgba(255,255,255,.55), transparent 62%),
    repeating-linear-gradient(180deg,
      rgba(20,40,70,.035) 0px, rgba(20,40,70,.035) 1px,
      transparent 1px, transparent 7px)}

.banner-fig{position:relative}
.banner-fig::before{
  content:"";position:absolute;inset:0;pointer-events:none;z-index:1;
  background:
    radial-gradient(110% 80% at 82% 10%, rgba(255,255,255,.14), transparent 60%),
    repeating-linear-gradient(180deg,
      rgba(255,255,255,.05) 0px, rgba(255,255,255,.05) 1px,
      transparent 1px, transparent 7px)}

/* Altura TRAVADA. Cada destaque tem um título de tamanho diferente, e com
   a altura livre o cartão pulava a cada troca, o conteúdo abaixo dava um
   solavanco de 40px sozinho, e quem estava lendo perdia a linha. O título
   é limitado a duas linhas pelo mesmo motivo: um nome comprido estourava
   o cartão e cortava o botão de comprar pela metade. */
.banner-trilho{position:relative;min-height:376px}
/* Duas metades: o texto na esquerda sobre branco, a foto na direita sobre a
   cor dela. `grid` e não `flex` porque as duas metades precisam ser
   exatamente iguais, com flex, um título curto encolhia o lado do texto e
   a divisória dançava a cada troca de slide. */
/* A troca é um cruzamento, não um corte: o slide que sai desaparece em 0,55s
   enquanto o que entra aparece e sobe 8px. Com `opacity` sozinha os dois
   ficavam meio transparentes ao mesmo tempo no meio da animação, e isso
   lia como um piscar, o "soco" que o Paulo viu. O deslocamento dá
   direção ao movimento e o olho entende que uma coisa substituiu a outra. */
.banner{position:absolute;inset:0;display:grid;grid-template-columns:1fr 1fr;gap:0;
  opacity:0;visibility:hidden;transform:translateY(8px);
  transition:opacity .55s ease,transform .55s cubic-bezier(.22,.61,.36,1),visibility 0s .55s;
  z-index:1}
.banner.on{opacity:1;visibility:visible;transform:none;z-index:2;
  transition:opacity .55s ease,transform .55s cubic-bezier(.22,.61,.36,1),visibility 0s}
/* `place-items: center` (que era o valor daqui) encolhe o item ao conteúdo:
   o `width:100%` da foto não tinha efeito e ela media 145px numa caixa de
   380. `stretch` deixa a img ocupar o bloco, e quem centraliza a peça
   dentro dela é o `object-fit: contain`. */
.banner-fig{position:relative;overflow:hidden;display:grid;place-items:stretch}
/* Sem padding: a foto é quadrada e o bloco é mais alto que largo, então o
   `contain` já deixa faixas de cor em cima e embaixo, que é exatamente o
   desenho do Mercado Livre. Com padding por cima disso, a peça encolhia e
   sobrava cor demais em volta. */
.banner-fig img{width:100%;height:100%;object-fit:contain;display:block;
  position:relative;z-index:0}
@media (prefers-reduced-motion:reduce){ .banner{transition:none} }

/* Os pontos ficam SOBRE o banner para não empurrar a altura do cartão a cada
   slide, e no canto DIREITO: à esquerda eles caíam em cima do preço, que é a
   última coisa que pode ficar coberta num banner de venda. */
.banner-pontos{position:absolute;right:26px;bottom:20px;z-index:3;display:flex;gap:7px}
/* Os pontos vivem sobre a FOTO, que pode ser clara ou escura: por isso eles
   ganham um véu escuro atrás em vez de contar com o fundo. */
.banner-pontos{background:rgba(15,25,45,.32);border-radius:99px;padding:7px 10px;backdrop-filter:blur(3px)}
.banner-pontos button{width:8px;height:8px;border-radius:99px;background:rgba(255,255,255,.55);
  padding:0;transition:.2s}
.banner-pontos button:hover{background:rgba(255,255,255,.85)}

/**
 * O ponto ativo é uma BARRA QUE ENCHE, não um ponto mais largo.
 *
 * O Paulo relatou que o banner "não rotaciona". Ele rotaciona (medido: passa de
 * slide em nove segundos), só que nove segundos olhando uma tela parada são uma
 * eternidade, e nada na tela dizia que havia uma contagem correndo. E o
 * carrossel PARA com o mouse em cima, de propósito, o que num banner que ocupa
 * meia tela acontece o tempo todo sem a pessoa perceber: ela via um banner
 * imóvel e concluía que estava quebrado.
 *
 * A barra enchendo resolve as duas coisas de uma vez: mostra que o tempo está
 * correndo e mostra quando ele PARA, porque a animação congela junto.
 *
 * A duração vem do JS (`--nz-banner-ms`), não escrita aqui: o tempo é do painel,
 * e uma duração fixa no CSS descolaria da troca real no dia em que ele mudasse.
 */
.banner-pontos button.on{background:rgba(255,255,255,.35);width:30px;position:relative;overflow:hidden}
.banner-pontos button.on::after{
  content:"";position:absolute;inset:0;border-radius:99px;
  background:var(--surface);transform-origin:left;
  animation:nz-banner-barra var(--nz-banner-ms,9000ms) linear forwards
}
@keyframes nz-banner-barra{from{transform:scaleX(0)}to{transform:scaleX(1)}}
/* Parado, a barra para junto: é ela que conta que o relógio está de pé. */
.banner-caixa.parado .banner-pontos button.on::after{animation-play-state:paused}

@media (prefers-reduced-motion:reduce){
  /* Sem animação, o ponto ativo volta a ser só um ponto mais claro: uma barra
     cheia parada diria que o slide está sempre acabando. */
  .banner-pontos button.on{background:var(--surface)}
  .banner-pontos button.on::after{display:none}
}
.banner-txt{flex:1;min-width:0}
/* Texto ESCURO sobre branco. No azul chapado tudo era branco, então chapéu,
   título, resumo e preço tinham o mesmo peso visual e o olho não sabia por onde
   começar. Aqui cada um tem a sua cor e a hierarquia volta sozinha. */
.banner-txt{padding:38px 34px}
.banner .chapeu{color:var(--ink-fraco);font-size:11px;letter-spacing:.16em;font-weight:600}
/* Três linhas em vez de duas, e corpo um pouco menor: os nomes reais têm
   seis palavras ("Suporte de papel higiênico com prateleira") e cortar com
   reticências deixava o cliente sem saber o que é a peça, que é a única
   coisa que o banner precisa dizer. */
.banner h1{font-size:clamp(21px,2.1vw,28px);font-weight:800;color:var(--titulo);
  margin:10px 0 10px;line-height:1.15;letter-spacing:-.015em}
.banner p{color:var(--ink-soft);font-size:14.5px;margin:0 0 18px;line-height:1.5}
.banner-preco{display:block;margin-bottom:20px;color:var(--ink-fraco);font-size:12px}
.banner-preco b{color:var(--ink);margin-left:6px}
/* Era branco sobre azul; sobre branco ele sumiria. Vira o mesmo botão de
   ação do resto da loja, que é o que a pessoa já aprendeu a clicar. */
/* `align-self: flex-start` é o que impede o botão de esticar: dentro de uma
   coluna flex, o padrão é `stretch` e ele tomava a largura toda do texto,
   um botão de 380px parece uma barra, não um botão. */
.btn-claro{display:inline-flex;align-items:center;align-self:flex-start;
  background:var(--acao);color:#fff;font-weight:600;font-size:14.5px;
  padding:0 26px;min-height:46px;border-radius:var(--r)}
.btn-claro:hover{background:var(--acao-forte)}
/* O lado é uma pilha: todos os grupos ocupam o mesmo lugar e só o corrente
   aparece, igual aos slides do banner. `grid` e não `position:absolute` porque
   a altura tem de ser a do maior grupo, senão o bloco pularia a cada troca. */
.banner-lado{display:grid}
.banner-lado > .lado-grupo{grid-area:1/1}
.lado-grupo{display:flex;flex-direction:column;gap:16px;
  opacity:0;visibility:hidden;transform:translateY(8px);
  transition:opacity .55s ease,transform .55s ease,visibility .55s}
.lado-grupo.on{opacity:1;visibility:visible;transform:none}
@media (prefers-reduced-motion:reduce){
  .lado-grupo{transition:none}
}

/* "Sob consulta" no lugar do número, no banner e no cartão do lado. Menor e
   sem o peso do preço: ele não é um valor, é o aviso de que ainda não há um. */
.banner-consulta b{font-size:26px;font-weight:800}
/* ⚠️ `.mini-preco.mini-consulta` e não `.mini-consulta` sozinho: as duas têm
   uma classe de especificidade, e `.mini-preco` é declarada DEPOIS, então ela
   ganhava por ordem no arquivo e o "Sob consulta" saía no azul de ação, do
   mesmo jeito que um preço. Quinta vez que ordem no arquivo morde aqui. */
.mini-preco.mini-consulta{font-size:15px;font-weight:800;color:var(--ink-fraco)}
/* Fundo BRANCO como o card da grade: sobre o cinza-azulado ele parecia um
   aviso, não um produto, e o produto é o que ele é. */
.mini-banner{flex:1;border-radius:var(--r);background:var(--surface);padding:18px;
  display:flex;align-items:center;gap:16px;border:1px solid var(--edge);transition:.16s}
.mini-banner:hover{border-color:var(--acao);box-shadow:0 8px 20px rgba(15,35,70,.1)}
.mini-banner h3{font-size:17px;font-weight:700;margin:5px 0 7px;line-height:1.2}
/* O preço herdava o tamanho do texto ao redor e sumia: num cartão que existe
   para vender, o número tem que ser a segunda coisa que o olho encontra,
   logo depois do nome. Aqui ele sobe ao patamar do card da grade. */
.mini-preco{font-size:22px;font-weight:800;color:var(--ink);display:block;line-height:1.1}
/* De 86 para 116: a foto é o que faz reconhecer a peça, e num cartão de
   180px de altura ela sobrava espaço em volta sem usar. */
.mini-fig{width:116px;height:116px;flex:0 0 auto;border-radius:var(--r);overflow:hidden;
  background:var(--surface-2)}
.mini-fig img{width:100%;height:100%;object-fit:cover;display:block}

/* ── bloco branco com título, como as seções do Mercado Livre ── */
.bloco-cats{margin-top:16px;background:var(--surface);border:1px solid var(--edge);
  border-radius:var(--r);padding:20px}
.bloco-topo{display:flex;align-items:baseline;gap:14px;margin-bottom:16px;flex-wrap:wrap}
.bloco-topo h2{font-family:Sora,system-ui,sans-serif;font-size:19px;font-weight:700;letter-spacing:-.01em}
.bloco-topo a{font-size:13px;color:var(--acao);font-weight:500}

/* Cartão de categoria: foto à esquerda em fundo cinza, nome à direita. O
   círculo de antes era linguagem de stories e cortava as bordas da peça, que é
   justamente o que distingue um suporte de outro. */
/* A largura de cada cartão vem do `.trilho-itens > *` (um quarto da faixa);
   aqui sobra só o espaçamento. A regra de grade PRECISOU sair: ela vinha depois
   do `display:flex` do trilho e ganhava dele por ordem no arquivo. */
.cats-grade{gap:12px}
.cat-card{display:flex;align-items:stretch;gap:0;border:1px solid var(--edge);
  border-radius:var(--r);overflow:hidden;background:var(--surface);transition:.16s}
.cat-card:hover{border-color:var(--acao);box-shadow:0 6px 16px rgba(15,35,70,.09)}
/* A foto fica INTEIRA dentro do quadro, sobre a cor real dela. Com `cover`
   ela era cortada para preencher, e como a arte da capa costuma ter o nome em
   cima e a peça embaixo, o corte central pegava o texto e metade da peça: foi
   o que o Paulo viu no celular. `contain` mostra a peça toda, e o `image_bg`
   faz a sobra parecer parte da foto em vez de uma faixa cinza. */
.cat-fig{width:82px;flex:0 0 82px;background:var(--cbg,var(--surface-2));display:grid;place-items:center;
  color:var(--primary);font-family:Sora,Inter,sans-serif;font-weight:800;font-size:24px;overflow:hidden}
.cat-fig img{width:100%;height:100%;object-fit:contain;display:block}
.cat-txt{flex:1;min-width:0;display:flex;flex-direction:column;justify-content:center;
  gap:2px;padding:12px 14px}
.cat-txt b{font-size:13.5px;font-weight:600;color:var(--ink);line-height:1.25}
.cat-txt em{font-style:normal;font-size:11.5px;color:var(--ink-fraco)}

.provas{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:14px;margin-top:16px;
  background:var(--surface);border:1px solid var(--edge);border-radius:var(--r);padding:18px}
.provas b{display:block;font-size:12.5px}
.provas span{font-size:11px;color:var(--ink-fraco);line-height:1.35}

/* `.sec` é seção, não cartão: o recuo lateral continua sendo o do `.wrap`.
   Zerar o padding aqui puxava o título e a grade 20px para a esquerda de
   todo o resto da página. */
.sec{padding:34px 20px}
.sec-topo{display:flex;align-items:flex-end;justify-content:space-between;gap:16px;margin-bottom:18px;flex-wrap:wrap}
.sec-topo h2{font-size:25px;font-weight:700;margin-top:5px}
.conta{font-size:12.5px;color:var(--ink-fraco)}
.grade{display:grid;grid-template-columns:repeat(auto-fill,minmax(240px,1fr));gap:16px}

/* ── A LISTA: foto à esquerda, dizeres à direita ────────────────────────────
   É o desenho do Mercado Livre na busca e na categoria, e a razão é de
   COMPARAÇÃO: na grade, o nome cabe em duas linhas e o olho salta de foto em
   foto; na lista, cada peça tem uma faixa larga para nome, preço e prova, e
   comparar duas viradas é ler duas linhas em vez de cruzar a tela.

   O HTML é o MESMO da grade. Um segundo `lojaCard()` para a lista seria a
   segunda cópia de tudo o que o card decide (selo, preço em faixas, nota,
   coração), e a que divergisse mostraria informação diferente para a mesma
   peça conforme a visualização escolhida. */
.grade.lista,html[data-ver="lista"] .grade.auto{display:flex;flex-direction:column;gap:0;
  background:var(--surface);border:1px solid var(--edge);border-radius:var(--r);overflow:hidden}
.grade.lista .card-envolve,html[data-ver="lista"] .grade.auto .card-envolve{border-bottom:1px solid var(--linha-fraca)}
.grade.lista .card-envolve:last-child,html[data-ver="lista"] .grade.auto .card-envolve:last-child{border-bottom:0}
.grade.lista .card,html[data-ver="lista"] .grade.auto .card{flex-direction:row;border:0;border-radius:0;background:transparent;gap:18px;
  padding:16px}
/* Na lista o cartão não levanta: `translateY` numa linha de uma pilha faz a
   linha de baixo parecer que afundou. O aviso de que dá para clicar é o fundo. */
.grade.lista .card:hover,html[data-ver="lista"] .grade.auto .card:hover{transform:none;box-shadow:none;background:var(--alto)}
.grade.lista .card-fig,html[data-ver="lista"] .grade.auto .card-fig{width:172px;flex:0 0 172px;aspect-ratio:1;border:1px solid var(--edge);
  border-radius:var(--r);overflow:hidden}
.grade.lista .card-fig img,html[data-ver="lista"] .grade.auto .card-fig img{object-fit:contain}
.grade.lista .card-corpo,html[data-ver="lista"] .grade.auto .card-corpo{padding:2px 0 0;gap:6px}
.grade.lista .card-corpo h3,html[data-ver="lista"] .grade.auto .card-corpo h3{font-size:16px;line-height:1.3}
.grade.lista .card-preco,html[data-ver="lista"] .grade.auto .card-preco{margin-top:8px}
.grade.lista .card-preco b,html[data-ver="lista"] .grade.auto .card-preco b{font-size:22px}
/* O coração acompanha a FOTO, não o canto do cartão: numa faixa de 1100px ele
   ficaria a meia tela de distância da peça que guarda. Na grade ele é absoluto
   em relação ao invólucro, que ali tem o tamanho da foto; na lista o invólucro
   é a faixa inteira, então ele é posto à mão sobre a imagem. */
.grade.lista .card-fav,html[data-ver="lista"] .grade.auto .card-fav{top:24px;left:24px;right:auto}
@media (max-width:600px){ .grade.lista .card-fav{top:18px;left:18px;width:30px;height:30px} }

@media (max-width:600px){
  .grade.lista .card,html[data-ver="lista"] .grade.auto .card{padding:12px;gap:12px}
  .grade.lista .card-fig,html[data-ver="lista"] .grade.auto .card-fig{width:104px;flex:0 0 104px}
  .grade.lista .card-corpo h3,html[data-ver="lista"] .grade.auto .card-corpo h3{font-size:14px}
  .grade.lista .card-preco b,html[data-ver="lista"] .grade.auto .card-preco b{font-size:19px}
  /* "MAIS VENDIDO" tem 12 letras e a foto da lista tem 104px: o selo do
     tamanho da grade transbordava para fora da imagem. Aqui ele encolhe e
     encosta na borda, que é onde ele cabe. */
  .grade.lista .card-selo,html[data-ver="lista"] .grade.auto .card-selo{left:4px;bottom:4px;font-size:8.5px;padding:3px 6px;
    letter-spacing:0;max-width:calc(100% - 8px);overflow:hidden;
    text-overflow:ellipsis;white-space:nowrap}
}

/* O alternador fica na direita, na linha acima da grade: à esquerda ele
   disputaria com a contagem de peças, que é o que a pessoa lê primeiro. */
.grade-topo{display:flex;align-items:center;justify-content:flex-end;margin-bottom:12px}

/* ── o alternador grade/lista ───────────────────────────────────────────── */
.ver-como{display:flex;gap:4px;padding:3px;border:1px solid var(--edge);border-radius:var(--r);
  background:var(--surface)}
.ver-como button{display:grid;place-items:center;width:34px;height:32px;border-radius:5px;
  color:var(--ink-fraco)}
.ver-como button[aria-pressed="true"]{background:var(--acao-fraca);color:var(--acao)}
.ver-como button:hover{color:var(--acao)}
.card{background:var(--surface);border:1px solid var(--edge);border-radius:var(--r);overflow:hidden;
  display:flex;flex-direction:column;transition:.18s}
.card:hover{transform:translateY(-3px);box-shadow:0 18px 34px rgba(15,35,70,.1);border-color:rgba(29,122,217,.35)}
.card-fig{aspect-ratio:1;background:var(--surface-2);display:grid;place-items:center;border-bottom:1px solid var(--edge)}
.card-fig img{width:100%;height:100%;object-fit:cover}
.card-corpo{padding:14px 15px 16px;display:flex;flex-direction:column;gap:8px;flex:1}
.card-cat{font-size:10px;font-weight:700;letter-spacing:.09em;text-transform:uppercase;color:var(--ink-fraco)}
.card h3{font-family:Inter,sans-serif;letter-spacing:0;font-size:13.5px;font-weight:600;line-height:1.35}
.cores{display:flex;gap:5px;align-items:center}
.cores i{width:14px;height:14px;border-radius:99px;box-shadow:inset 0 0 0 1px rgba(0,0,0,.18)}
.cores em{font-size:10.5px;color:var(--ink-fraco);font-style:normal}
/* Tudo colado na esquerda e empilhado, como no Mercado Livre. O "a partir
   de" saiu: ele empurrava o preço para o meio da linha e não decidia nada.
   Quem explica a variação é a linha do lote, logo abaixo. */
.card-preco{margin-top:auto;display:flex;flex-direction:column;align-items:flex-start;gap:3px}
.card-preco-l{display:flex;align-items:center;gap:8px;flex-wrap:wrap}
.card-preco b{font-size:19px;white-space:nowrap;line-height:1.1}
.card-off{font-style:normal;font-size:11.5px;font-weight:800;color:var(--ok);white-space:nowrap}

/* Prova social: nota e vendidos, os dois vindos de dado real. */
.card-prova{display:flex;align-items:center;gap:6px;font-size:11.5px;color:var(--ink-fraco);margin-bottom:8px}
.card-nota{display:inline-flex;align-items:center;gap:3px;color:var(--acao);font-weight:600}
.card-nota svg{width:12px;height:12px;fill:currentColor}
.card-prova i{font-style:normal;opacity:.4}
.vazio{background:var(--surface);border:1px solid var(--edge);border-radius:var(--r);padding:44px;text-align:center;color:var(--ink-soft)}
.vazio a{color:var(--primary);font-weight:600}

/* produto */
.produto{padding:22px 20px 40px}
.migalha{font-size:12px;color:var(--ink-fraco);margin:0 0 18px}
.migalha a{color:var(--ink-soft)}
.produto-grade{display:grid;grid-template-columns:1fr 1fr;gap:40px;align-items:start}
.palco{position:sticky;top:88px;display:flex;flex-direction:column;gap:12px}
.palco-fig{background:var(--surface-2);border-radius:var(--r);aspect-ratio:1;display:grid;place-items:center;overflow:hidden}
.palco-fig img{width:100%;height:100%;object-fit:cover}
.mini{border:1.5px solid var(--edge);border-radius:var(--r);overflow:hidden;background:var(--surface-2);
  aspect-ratio:1;position:relative;padding:0}
.mini.on{border-color:var(--primary)}
.mini img{width:100%;height:100%;object-fit:cover}
.mini-play{position:absolute;inset:0;display:grid;place-items:center;color:#fff;font-size:16px;background:rgba(0,0,0,.35)}
.decisao h1{font-size:clamp(22px,2.4vw,30px);font-weight:700;line-height:1.15;margin-bottom:10px}
.vendedor{display:flex;align-items:center;gap:9px;font-size:12.5px;font-weight:600;color:var(--ink-soft);margin-bottom:12px}
.sku-atual{margin-left:auto;font-family:"JetBrains Mono",monospace;font-size:11px;color:var(--ink-fraco)}
/* ⚠️ ONZE PIXELS AO LADO DE UM NÚMERO DE 40 LEEM COMO COLADO.
   O vão parecia razoável sozinho e não é: num bloco onde um elemento tem o
   TRIPLO do tamanho do outro, o espaço que separa de verdade é proporcional ao
   maior deles, e 11px é o que se usaria entre dois textos de 13.

   Fica em px, e não em `em`, porque o `em` aqui enganaria: no `gap` ele sai do
   font-size do BLOCO (o do corpo, 16px) e numa margem do `.preco-obs` sai do
   font-size DELE (13px). Nenhum dos dois é o número de 40px que manda na
   leitura. Mexeu no tamanho do preço, confira este valor junto. */
/* ⚠️ O PRECO ENCOSTAVA NO BLOCO DE BAIXO: ZERO pixels, medido.
   O respiro para baixo vinha do `margin-top` da linha de parcelas, e essa
   linha SOME quando a peca nao parcela (ou quando o painel esta fechado). Sem
   ela, o selo verde de atacado colava no numero. O espaco entre dois
   elementos e do PRIMEIRO, nunca do segundo, justamente para nao depender de
   quem vem depois existir.

   Margem e nao padding porque o pai e `display:block`: ela COLAPSA com o
   `margin-top:5px` da linha de parcelas quando ela aparece, entao o vao e 14
   nos dois casos em vez de virar 19 num deles. */
.preco-bloco{display:flex;align-items:flex-end;gap:16px;margin-bottom:14px}
.preco{font-size:40px;font-weight:700;line-height:1}
.preco-obs{font-size:13px;color:var(--ink-fraco);padding-bottom:7px}
/* O espaço até a linha do total fica AQUI, no elemento de cima. Ele estava do
   outro lado, como `margin-top: -16px` na linha do total, compensando estes 24px,
   e margem negativa só funciona enquanto nada entra no meio. Bastou o painel
   de parcelas nascer entre os dois para o total ser puxado 16px para cima e
   ficar POR DENTRO do painel.

   Quarta vez que uma compensação de margem morde neste projeto. A regra que
   ficou: espaço entre dois elementos é do primeiro, e nunca margem negativa do
   segundo. */
.parcela{font-size:12.5px;color:var(--ink-fraco);margin:5px 0 8px}
.parcela b{color:var(--ink);font-family:"JetBrains Mono",monospace}
.bloco{margin-bottom:22px}
.rotulo{display:block;font-size:12.5px;font-weight:700;margin-bottom:10px}
.rotulo em{font-style:normal;font-weight:500;color:var(--ink-fraco);margin-left:5px}
.chips{display:flex;flex-wrap:wrap;gap:9px}
.chips button{border:1.5px solid var(--edge);background:var(--surface);border-radius:var(--r);
  padding:11px 15px;font-size:13px;font-weight:600;display:flex;align-items:center;gap:8px;min-height:44px;transition:.14s}
.chips button:hover{border-color:rgba(29,122,217,.5)}
.chips button.on{background:rgb(var(--primary-rgb) / .09);border-color:var(--primary);
  color:var(--primary);box-shadow:inset 0 0 0 1px var(--primary)}
.chips-qtd button.on small{color:var(--primary);opacity:.75}
.chips i{width:17px;height:17px;border-radius:99px;box-shadow:inset 0 0 0 1px rgba(0,0,0,.2)}
.chips-qtd button{flex-direction:column;gap:2px;align-items:center;min-width:88px;padding:10px}
.chips-qtd b{font-family:"JetBrains Mono",monospace;font-size:14px}
.chips-qtd small{font-family:"JetBrains Mono",monospace;font-size:10.5px;color:var(--ink-fraco)}
.chips-qtd button.on small{color:rgba(255,255,255,.75)}
.prazo{background:var(--aviso-fundo);border:1px solid var(--aviso-borda);border-radius:var(--r);padding:13px 15px;
  font-size:12.5px;color:var(--aviso-txt);margin:0 0 18px}
.btn-comprar{width:100%;background:var(--acao);color:#fff;border-radius:var(--r);padding:16px;
  font-size:15px;font-weight:600;min-height:52px;
  display:flex;align-items:center;justify-content:center;gap:9px}
.btn-comprar:hover{background:var(--acao-forte)}
.btn-comprar span{font-family:"JetBrains Mono",monospace}
.frete-nota{font-size:12px;color:var(--ink-fraco);margin:12px 0 0;text-align:center}
.ficha{margin:26px 0 0;padding-top:20px;border-top:1px solid var(--edge);
  display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:10px 24px}
.ficha div{display:flex;flex-direction:column;gap:2px;font-size:12.5px;
  border-bottom:1px solid var(--linha-fraca);padding-bottom:8px;text-align:left}
.ficha dt{color:var(--ink-fraco);margin:0}
.ficha dd{margin:0;font-weight:600;color:var(--ink)}

/* rodapé */
/* Sem padding embaixo: a faixa da identificação é filha do `<footer>` e vai de
   ponta a ponta, então um respiro aqui deixaria uma fresta branca entre ela e o
   resto. O respiro passou a ser dela. */
.rodape{background:var(--surface);border-top:1px solid var(--edge);margin-top:40px;padding:34px 0 0}
/* `minmax(0,…)` em todas: `1fr` é `minmax(auto,1fr)`, e uma palavra que não
   quebra (o e-mail de contato) empurrava a coluna dela e roubava largura das
   outras. A 375px isso dava 205px numa coluna e 107 na outra, com a segunda
   ilegível. */
.rodape-cols{display:grid;grid-template-columns:minmax(0,1.6fr) minmax(0,1fr) minmax(0,1fr) minmax(0,1.2fr);gap:26px}
/* O e-mail é a única coisa aqui longa o bastante para estourar a coluna, e ele
   não tem espaço onde quebrar. */
.rodape a,.rodape-fala{overflow-wrap:anywhere}
.rodape h4{font-size:12px;text-transform:uppercase;letter-spacing:.1em;color:var(--ink-fraco);margin-bottom:10px}
.rodape a{display:block;font-size:13px;color:var(--ink-soft);padding:3px 0}
.rodape p{font-size:13px;color:var(--ink-fraco);margin:10px 0 0}
.marca-rodape{font-size:16px}
/* ⚠️ O SEGUNDO TOM DO RODAPÉ. Era um traço fino no meio do mesmo branco, e a
   identificação da empresa (razão social, CNPJ, endereço) lia como mais uma
   linha de rodapé. Com fundo próprio ela vira o PÉ DO DOCUMENTO, que é o que
   ela é: o bloco onde o comprador confere que a loja existe.

   `--surface-2` é o cinza que a loja já usa atrás de foto e de cartão: um tom
   novo aqui seria uma terceira cor de fundo na mesma página. */
.rodape-fim{background:var(--surface-2);border-top:1px solid var(--edge);
  margin-top:28px;padding:16px 0;font-size:11.5px}

@media (max-width:900px){
  .vitrine-topo,.produto-grade,.rodape-cols{grid-template-columns:1fr}
  .provas{grid-template-columns:repeat(2,minmax(0,1fr))}
  .banner{flex-direction:column;align-items:flex-start;padding:28px}
  /* No celular a foto vinha a 60% da largura e sozinha ocupava meia tela:
     o banner empurrava as categorias e o catálogo para baixo da dobra, e
     a primeira coisa que a pessoa via era um cartão gigante de um produto
     só. Ela vira uma faixa larga e baixa, ao lado do texto. */
  /* Metade de 335px não comporta título, resumo, preço e botão: no celular
     a foto vira uma faixa em cima e o texto vem inteiro embaixo. */
  .banner{grid-template-columns:1fr;grid-template-rows:auto 1fr}
  .banner-fig{order:-1;height:150px}
  /* Texto à ESQUERDA. Centralizado ele parecia um convite de casamento: o
     olho tem de procurar o começo de cada linha, e num bloco com quatro
     alturas diferentes (chapéu, título, resumo, preço) nada se alinha com
     nada. À esquerda existe uma coluna só, e é ela que dá o ar moderno.
     O BOTÃO continua esticando: com 335px, um de 157 no canto é alvo
     pequeno para o polegar e âncora fraca para o olho. */
  .banner-txt{padding:20px 18px 22px;text-align:left;align-items:flex-start}
  .banner-preco{margin-bottom:18px}
  .btn-claro{align-self:stretch;justify-content:center;min-height:52px;font-size:15.5px}
  .banner h1{font-size:21px;margin:8px 0 7px}
  .banner p{font-size:13px;margin-bottom:12px;
    display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden}
  .banner-trilho,.banner{min-height:0}
  /* O preço não pode quebrar no meio: "R$" numa linha e "12,61" na outra
     é o número mais importante do banner partido em dois. */
  .banner-preco{white-space:nowrap}
  .banner-preco b{font-size:26px}
  .banner .chapeu{font-size:9.5px}
  .palco{position:static}
  .so-desktop{display:none !important}
  .topo .linha{height:auto;padding:12px 0;flex-wrap:wrap}
  .busca{order:3;flex-basis:100%}
}

/* O lote é o argumento da casa: peça repetida na mesma mesa sai mais
   barata, e nenhum marketplace faz isso. Ficava miúdo no canto direito.
   Agora abre a linha embaixo do preço, com o VALOR em negrito. */
.card-lote{font-size:12px;color:var(--ok);font-style:normal;font-weight:500;white-space:nowrap;margin-left:0}
/* `.card-preco b` também casa neste elemento e tem a MESMA especificidade;
   o seletor mais específico é o que garante o tamanho certo em vez de
   depender da ordem do arquivo. */
.card-preco .card-lote b{font-size:13px;font-weight:800;color:var(--ok);line-height:1.2}

/* sacola */
.sacola-grade{display:grid;grid-template-columns:1fr 350px;gap:20px;align-items:start}
/* `min-width:0` obrigatorio: item de grid nasce com `min-width:auto` e nao
   encolhe abaixo do conteudo. Sem isso um nome de produto comprido na faixa
   de sugestao estoura a pagina no celular, sem nenhum aviso. */
.sacola-col{min-width:0}
.sacola-itens{display:flex;flex-direction:column;gap:12px}
.item{background:var(--surface);border:1px solid var(--edge);border-radius:var(--r);padding:15px;
  display:grid;grid-template-columns:88px 1fr auto;gap:15px;align-items:center}
.item-fig{width:88px;height:88px;border-radius:var(--r);overflow:hidden;background:var(--surface-2)}
.item-fig img{width:100%;height:100%;object-fit:cover}
.item-txt{min-width:0;display:flex;flex-direction:column;gap:5px}
.item-txt b{font-size:14px;font-weight:600}
.item-det{font-size:12px;color:var(--ink-soft)}
.item-sku{font-family:"JetBrains Mono",monospace;font-size:11px;color:var(--ink-fraco)}
.item-fim{display:flex;flex-direction:column;align-items:flex-end;gap:9px}
.stepper{display:flex;align-items:center;border:1.5px solid var(--edge);border-radius:var(--r);overflow:hidden}
.stepper button{width:34px;height:36px;color:var(--ink-soft);font-size:17px}
/* O número do stepper é um CAMPO, não um rótulo. Chegar a 20 peças à base de
   clique são vinte cliques, e ninguém faz isso: ou desiste, ou leva menos do
   que queria. Os botões continuam porque de 1 para 2 eles são o caminho curto. */
.stepper span,.stepper input{width:46px;text-align:center;font-family:"JetBrains Mono",monospace;
  font-weight:700;font-size:13.5px;color:var(--ink)}
.stepper input{border:0;background:transparent;padding:7px 0}
/* Campo de TEXTO com teclado numérico, não `type=number`: as setinhas do number
   ficam por cima do próprio número num campo estreito, e o teclado do celular
   (que é o que importa aqui) vem do `inputmode`. A validação é nossa de todo
   jeito, porque `number` aceita `e`, `-` e `.` sem reclamar. */
.stepper input:focus{outline:none}
.stepper:focus-within{border-color:var(--acao)}
.item-total{font-family:"JetBrains Mono",monospace;font-size:17px;font-weight:700}
.item-tira{font-size:11.5px;color:var(--ink-fraco)}
.resumo-pedido{background:var(--surface);border:1px solid var(--edge);border-radius:var(--r);padding:22px;
  display:flex;flex-direction:column;gap:12px;position:sticky;top:88px}
.resumo-pedido h3{font-size:15.5px;font-weight:700}
.pedido-l{display:flex;justify-content:space-between;font-size:13px;color:var(--ink-soft)}
.pedido-l span:last-child{font-family:"JetBrains Mono",monospace;color:var(--ink)}
.pedido-l.total{border-top:1px solid var(--edge);padding-top:12px;margin-top:4px;font-size:15px;font-weight:700;color:var(--ink)}
.pedido-l.total span:last-child{font-size:21px}
@media (max-width:900px){ .sacola-grade{grid-template-columns:1fr} .resumo-pedido{position:static} }

/* As medidas do logo em SVG que ficavam aqui sairam junto com ele: eram
   30x34, do desenho da sacolinha sozinha. Com o arquivo horizontal quem manda
   e `.marca img.logo`, mais abaixo. Regra morta de tamanho e o tipo de coisa
   que volta a valer no dia em que alguem mexer na especificidade da outra. */

/* ── carrossel de fotos: UMA linha que rola ── */
.carrossel{position:relative;display:flex;align-items:center;gap:6px}
.miniaturas{display:flex;gap:9px;overflow-x:auto;scroll-behavior:smooth;scrollbar-width:none;flex:1;padding:2px}
.miniaturas::-webkit-scrollbar{display:none}
.mini{flex:0 0 88px;width:88px;height:88px}
.carro-seta{width:30px;height:88px;border-radius:var(--r);border:1px solid var(--edge);background:var(--surface);
  color:var(--ink-soft);font-size:19px;line-height:1;flex:0 0 auto}
.carro-seta:hover{border-color:var(--primary);color:var(--primary)}

/* ── zoom ── */
.zoom-alvo{display:block;width:100%;height:100%;padding:0;position:relative;cursor:zoom-in}
.zoom-dica{position:absolute;right:12px;bottom:12px;width:34px;height:34px;border-radius:var(--r);
  background:rgba(22,35,59,.72);color:#fff;display:grid;place-items:center;font-size:17px;
  opacity:0;transition:.16s}
.zoom-alvo:hover .zoom-dica{opacity:1}
.lente{position:fixed;inset:0;z-index:9500;background:rgba(10,18,32,.92);
  display:flex;align-items:center;justify-content:center;padding:28px;cursor:zoom-out}
.lente img{max-width:100%;max-height:100%;object-fit:contain;border-radius:var(--r)}
.lente-fecha{position:absolute;top:18px;right:22px;width:44px;height:44px;border-radius:var(--r);
  background:rgba(255,255,255,.12);color:#fff;font-size:26px;line-height:1}
.lente-fecha:hover{background:rgba(255,255,255,.22)}

/* ── SKU rotulado ── */
.sku-atual b{font-family:"JetBrains Mono",monospace;color:var(--ink);font-weight:700}

/* ── descrição em abas, abaixo da compra ── */
.detalhe{padding:0 20px 46px}
.detalhe-abas{display:flex;gap:6px;border-bottom:1px solid var(--edge);margin-bottom:22px;
  overflow-x:auto;overflow-y:hidden;scrollbar-width:none}
.detalhe-abas::-webkit-scrollbar{display:none}
.detalhe-abas button{padding:12px 18px;font-size:13.5px;font-weight:600;color:var(--ink-soft);
  border-radius:var(--r) var(--r) 0 0;white-space:nowrap;position:relative}
.detalhe-abas button.on{color:var(--primary);background:rgba(29,122,217,.06)}
.detalhe-abas button.on::after{content:"";position:absolute;left:12px;right:12px;bottom:-1px;height:2px;background:var(--primary)}
.detalhe-corpo{background:var(--surface);border:1px solid var(--edge);border-radius:var(--r);padding:26px 28px;
  max-width:78ch;font-size:14.5px;color:var(--ink-soft)}
.detalhe-corpo p{margin:0 0 14px}
.detalhe-corpo .chamada{font-size:16px;color:var(--ink);font-weight:500}
.lista-ok{list-style:none;padding:0;margin:18px 0 0;display:flex;flex-direction:column;gap:10px}
.lista-ok li{position:relative;padding-left:26px;font-size:14px}
.lista-ok li::before{content:"";position:absolute;left:0;top:7px;width:14px;height:8px;
  border-left:2px solid var(--ok);border-bottom:2px solid var(--ok);transform:rotate(-45deg)}
.ficha-longa{margin:0;display:grid;grid-template-columns:repeat(auto-fit,minmax(240px,1fr));gap:0 32px}
.ficha-longa div{display:flex;justify-content:space-between;gap:14px;padding:11px 0;border-bottom:1px solid var(--linha-fraca);font-size:14px}
.ficha-longa dt{color:var(--ink-fraco);margin:0}
.ficha-longa dd{margin:0;font-weight:600;color:var(--ink);text-align:right}

@media (max-width:900px){
  .carro-seta{display:none}
  .mini{flex:0 0 74px;width:74px;height:74px}
  .detalhe-corpo{padding:20px}
}

/* Coluna de grid não encolhe abaixo do conteúdo (min-width:auto), e a trilha de
   nove fotos empurrava a coluna da foto para 868px, roubando espaço da coluna
   da compra. A trilha é que tem que rolar, não a coluna que tem que crescer. */
.palco,.decisao,.carrossel,.miniaturas{min-width:0}

/* ── sugestões da busca ─────────────────────────────────────────────────── */
.busca{position:relative}
.sugestoes{position:absolute;left:0;right:0;top:calc(100% + 7px);z-index:120;
  background:var(--surface);border:1px solid var(--edge);border-radius:var(--r);
  box-shadow:0 18px 40px rgba(16,32,58,.16);overflow:hidden;max-height:60vh;overflow-y:auto}
.sug{display:flex;align-items:center;gap:12px;padding:10px 13px;border-bottom:1px solid var(--linha-fraca)}
.sug:hover{background:var(--surface-2)}
.sug-fig{width:46px;height:46px;flex:0 0 auto;border-radius:var(--r);overflow:hidden;background:var(--surface-2)}
.sug-fig img{width:100%;height:100%;object-fit:cover;display:block}
.sug-txt{min-width:0;display:flex;flex-direction:column;gap:2px}
.sug-txt b{font-size:13.5px;font-weight:600;color:var(--ink);
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.sug-txt em{font-style:normal;font-size:11.5px;color:var(--ink-fraco)}
.sug-tudo{display:block;padding:12px 13px;font-size:12.5px;font-weight:700;color:var(--primary);text-align:center}
.sug-tudo:hover{background:var(--surface-2)}
.sug-vazio{padding:18px;font-size:13px;color:var(--ink-fraco);margin:0;text-align:center}

/* ── FILTROS DA LISTAGEM ────────────────────────────────────────────────────
   Um formulário, duas caras: no computador é uma faixa acima da grade; no
   celular o MESMO formulário vira uma folha que sobe de baixo, aberta por um
   botão flutuante. Duas marcações para os mesmos campos divergiriam no dia em
   que um filtro novo entrasse em apenas uma delas. */
.filtros{background:var(--surface);border:1px solid var(--edge);border-radius:var(--r);
  padding:14px 16px;margin-bottom:18px}
.filtros-cabeca{display:none}
.filtros-corpo{display:flex;flex-wrap:wrap;align-items:flex-start;gap:20px}
.filtro-bloco{border:0;margin:0;padding:0;min-width:0}
.filtro-bloco legend{font-size:11px;font-weight:700;text-transform:uppercase;
  letter-spacing:.07em;color:var(--ink-fraco);padding:0;margin-bottom:8px}

/* As pílulas substituíram os `<select>` de ordem e preço. Um select esconde as
   opções atrás de um toque e do popup do sistema; a pílula mostra o que existe
   e quantas peças cada faixa tem, que é a informação que faz escolher. */
.pilulas{display:flex;flex-wrap:wrap;gap:8px}
.pilula{position:relative;cursor:pointer}
/* O rádio continua no DOM (é ele que o formulário envia e o teclado alcança),
   só não é desenhado. `opacity:0` e não `display:none`: escondido daquele
   jeito ele sai da navegação por Tab. */
.pilula input{position:absolute;opacity:0;width:0;height:0}
.pilula span{display:inline-flex;align-items:center;gap:6px;min-height:38px;padding:0 14px;
  border:1.5px solid var(--edge);border-radius:99px;background:var(--surface);
  font-size:13px;font-weight:600;color:var(--ink-soft);white-space:nowrap;transition:.14s}
.pilula span em{font-style:normal;font-size:11px;color:var(--ink-fraco);
  font-variant-numeric:tabular-nums}
.pilula:hover span{border-color:rgb(var(--acao-rgb) / .5);color:var(--ink)}
.pilula input:checked + span{background:var(--acao);border-color:var(--acao);color:#fff}
.pilula input:checked + span em{color:rgba(255,255,255,.75)}
.pilula input:focus-visible + span{outline:2px solid var(--primary);outline-offset:2px}

.filtro-faixa{display:flex;align-items:center;gap:8px;margin-top:10px}
.filtro-faixa input{width:96px;border:1.5px solid var(--edge);border-radius:var(--r);
  background:var(--surface);padding:9px 11px;font:inherit;font-size:13px;color:var(--ink);
  min-height:40px;font-family:"JetBrains Mono",monospace}
.filtro-faixa span{font-size:12.5px;color:var(--ink-fraco)}
.filtro-bloco select{border:1.5px solid var(--edge);border-radius:var(--r);background:var(--surface);
  padding:9px 11px;font:inherit;font-size:13px;color:var(--ink);min-height:40px;max-width:100%}

.filtros-pe{display:flex;gap:10px;align-items:center;justify-content:flex-end;margin-top:14px}
.btn-filtrar{background:var(--acao);color:#fff;border-radius:var(--r);padding:11px 20px;
  font-size:13px;font-weight:700;min-height:44px}
.btn-limpar{font-size:12.5px;color:var(--ink-fraco);padding:11px 4px}
.filtro-conta{font-size:12.5px;color:var(--ink-fraco);margin:0 0 14px}
.filtro-conta b{color:var(--ink)}

/* Os chips do que está LIGADO, acima da grade. Quem entra por um link
   filtrado não tem como saber por que a lista está curta, e "limpar" escondido
   dentro do formulário não responde isso. */
.filtros-ligados{display:flex;flex-wrap:wrap;align-items:center;gap:8px;margin-bottom:14px}
.chip-ligado{display:inline-flex;align-items:center;gap:7px;min-height:34px;padding:0 12px;
  border-radius:99px;background:var(--acao-fraca);color:var(--acao);font-size:12.5px;font-weight:700}
.chip-ligado:hover{background:var(--acao);color:#fff}
.chip-limpar{font-size:12.5px;font-weight:600;color:var(--ink-fraco);padding:0 4px}
.chip-limpar:hover{color:var(--acao)}

/* Existe para o leitor de tela: o X do chip não tem texto, e "link sem rótulo"
   é o que ele anunciaria. */
.so-leitor{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap}

/* ── o botão flutuante e a folha, no celular ────────────────────────────────
   O botão é criado pelo JS e a classe que esconde o formulário entra junto:
   sem script a barra continua aberta e utilizável, em vez de sumir atrás de um
   botão que ninguém consegue clicar. */
.fab-filtro{display:none;position:fixed;left:50%;transform:translateX(-50%);
  z-index:9300;align-items:center;gap:8px;min-height:48px;padding:0 22px;border-radius:99px;
  background:var(--acao);color:#fff;font-size:14px;font-weight:700;
  box-shadow:0 10px 26px rgba(20,60,130,.34)}
.fab-filtro b{background:#fff;color:var(--acao);border-radius:99px;min-width:20px;
  padding:1px 7px;font-size:11.5px;font-variant-numeric:tabular-nums}
.fab-fundo{display:none;position:fixed;inset:0;z-index:9290;background:rgba(10,20,38,.45)}

@media (max-width:900px){
  .fab-filtro{display:inline-flex;bottom:calc(64px + env(safe-area-inset-bottom))}
  .fab-fundo[data-aberto="1"]{display:block}

  /* A folha: presa embaixo, com a rolagem no MIOLO. Quem rola é o conteúdo,
     nunca a página atrás, senão a pessoa perde o lugar onde estava. */
  .filtros.folha{position:fixed;left:0;right:0;bottom:0;z-index:9301;margin:0;
    max-height:86vh;display:flex;flex-direction:column;padding:0;
    border:0;border-radius:16px 16px 0 0;box-shadow:0 -18px 44px rgba(10,25,50,.28);
    transform:translateY(102%);transition:transform .26s cubic-bezier(.22,.61,.36,1);
    visibility:hidden}
  .filtros.folha[data-aberto="1"]{transform:none;visibility:visible}
  .filtros.folha .filtros-cabeca{display:flex;align-items:center;justify-content:space-between;
    padding:16px 18px 12px;border-bottom:1px solid var(--edge)}
  .filtros.folha .filtros-cabeca b{font-family:Sora,Inter,sans-serif;font-size:16px}
  .filtros-fecha{width:36px;height:36px;border-radius:99px;border:1px solid var(--edge);
    font-size:20px;line-height:1;color:var(--ink-soft)}
  .filtros.folha .filtros-corpo{flex-direction:column;gap:22px;padding:18px;overflow-y:auto}
  .filtros.folha .filtro-bloco{width:100%}
  .filtros.folha .filtro-bloco select{width:100%}
  .filtros.folha .filtro-faixa input{flex:1;width:auto;min-width:0}
  /* Alvo de 44px no dedo: 38 é confortável com mouse e não com polegar. */
  .filtros.folha .pilula span{min-height:44px;font-size:13.5px}
  .filtros.folha .filtros-pe{margin:0;padding:14px 18px calc(14px + env(safe-area-inset-bottom));
    border-top:1px solid var(--edge);background:var(--surface)}
  .filtros.folha .btn-filtrar{flex:1;min-height:50px;font-size:15px}
  /* Com a folha aberta o botão flutuante sai da frente: ele está atrás dela e
     ficaria só como uma borda azul aparecendo embaixo. */
  .fab-filtro[data-aberto="1"]{display:none}
}
@media (prefers-reduced-motion:reduce){
  .filtros.folha{transition:none}
}

/* ── MENU: o botão "Categorias" e o painel ──────────────────────────────────
   O submenu vertical que existia aqui parou de funcionar quando o catálogo
   cresceu: com 19 raízes a barra quebrava em duas linhas, e "Casa" abria uma
   fila de 22 filhas que descia até o fim da tela. O painel resolve porque tem
   LARGURA: as raízes ficam numa coluna à esquerda e as filhas em três colunas
   à direita, que é como o Mercado Livre resolve a mesma lista. */
/* ⚠️ QUEM ANCORA O PAINEL É O `.wrap` DO MENU, não o botão. Ancorado no
   botão ele nascia onde o botão está e, com `left:-14px`, 14px ANTES da coluna
   da página: numa tela de 1900 dava para ver o desalinhamento a olho nu. A
   regra desta loja é a de sempre, e já escrita cinco vezes aqui: quem define a
   coluna é o `.wrap`, e mais ninguém. */
.menu .wrap.linha{position:relative}
/* ⚠️ `align-self:stretch` + `align-items:flex-start`, e os dois juntos é que
   resolvem: com até dez atalhos a barra quebra em DUAS linhas, e o painel
   pende de `top:100%` do `.mega`. Sem o stretch ele mede 44px e o painel
   abriria POR CIMA da segunda linha de atalhos; com o stretch ele mede a barra
   inteira e o painel cai embaixo de tudo. O `flex-start` é o que mantém o
   botão "Categorias" alinhado com a primeira linha em vez de centralizado nos
   88px. Medido com dez nomes longos. */
.mega{display:flex;align-items:flex-start;align-self:stretch}
.mega-btn{display:inline-flex;align-items:center;gap:8px;height:44px;padding:0 14px 0 0;
  font-size:13.5px;font-weight:700;color:var(--ink)}
.mega-btn:hover{color:var(--acao)}
.mega-chev{transition:transform .18s}
.mega[data-aberto="1"] .mega-btn{color:var(--acao)}
.mega[data-aberto="1"] .mega-chev{transform:rotate(180deg)}

/* ⚠️ `left:0` num absoluto cai na borda do PADDING BOX do pai, ou seja 20px
   ANTES do conteúdo: o painel ficava desalinhado do logo e do resto da página
   pela largura exata do recuo. Daí o `--recuo` nos dois lugares. */
.mega-painel{position:absolute;left:var(--recuo);top:100%;z-index:120;
  display:grid;grid-template-columns:262px minmax(0,1fr);
  /* O teto de 1040px é o desenho; o `calc` é o que garante que ele nunca passe
     da coluna da página, em tela nenhuma. */
  width:min(1040px,calc(100% - var(--recuo) * 2));
  background:var(--surface);border:1px solid var(--edge);border-radius:var(--r);
  box-shadow:0 24px 60px rgba(12,30,60,.22);overflow:hidden}
/* A folha do menu dá 44px de altura e uma borda inferior a TODO link (é assim
   que o item ativo acende). Dentro do painel isso viraria uma lista de linhas
   de 44px com risco embaixo, então o reset é obrigatório. */
.mega-painel a{height:auto;border-bottom:0}

.mega-raizes{background:var(--alto);border-right:1px solid var(--edge);padding:8px;
  max-height:min(72vh,540px);overflow-y:auto}
.mega-raiz{display:flex;align-items:center;gap:10px;min-height:40px;padding:0 10px;
  border-radius:var(--r);font-size:13.5px;font-weight:600;color:var(--ink-soft)}
.mega-raiz .mega-ico{flex:0 0 auto;opacity:.75}
.mega-raiz span{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.mega-raiz em{margin-left:auto;font-style:normal;font-size:11px;color:var(--ink-fraco);
  font-variant-numeric:tabular-nums}
.mega-raiz .mega-seta{flex:0 0 auto;opacity:.45;margin-left:2px}
/* A raiz apontada fica com o fundo da SUPERFÍCIE, não com a cor da marca: ela
   é só o que está sendo mostrado ao lado, não uma escolha feita. */
.mega-raiz.on{background:var(--surface);color:var(--ink);box-shadow:0 1px 3px rgba(16,32,58,.1)}
.mega-raiz.on .mega-ico,.mega-raiz.on .mega-seta{opacity:1;color:var(--acao)}
/* A da PÁGINA em que a pessoa está fica na cor da marca: é outra informação. */
.mega-raiz.atual{color:var(--primary)}

.mega-cols{padding:18px 22px;max-height:min(72vh,540px);overflow-y:auto}
.mega-grupo{display:none}
.mega-grupo.on{display:block}
.mega-tit{display:block;font-family:Sora,Inter,sans-serif;font-size:17px;font-weight:700;
  color:var(--titulo);padding-bottom:10px;margin-bottom:12px;border-bottom:1px solid var(--edge)}
/* `columns` e não grid: a lista tem de 2 a 24 filhas, e o grid deixaria uma
   coluna cheia e duas vazias nas curtas. Em colunas de texto o conteúdo se
   distribui sozinho. */
.mega-lista{columns:3;column-gap:24px}
.mega-lista a{display:block;font-size:13px;color:var(--ink-soft);padding:6px 0;
  break-inside:avoid}
.mega-lista a:hover{color:var(--acao)}
.mega-lista a.on{color:var(--primary);font-weight:700}
.mega-vazio{font-size:13px;color:var(--ink-fraco);margin:0}
.mega-tudo{display:inline-flex;align-items:center;gap:5px;margin-top:16px;
  font-size:12.5px;font-weight:700;color:var(--acao)}

/* ── a grade que cresce ao rolar ────────────────────────────────────────── */
.mais-pecas{display:flex;flex-direction:column;align-items:center;gap:10px;padding:26px 0 6px}
/* Quantas peças já apareceram de quantas existem. Numa lista sem fim a pessoa
   não sabe se falta uma tela ou cinquenta, e é isso que faz parar de rolar. */
.mais-conta{margin:0;font-size:12.5px;color:var(--ink-fraco);font-variant-numeric:tabular-nums}
.mais-btn{display:inline-flex;align-items:center;justify-content:center;min-height:46px;
  padding:0 26px;border-radius:var(--r);border:1.5px solid var(--edge);
  background:var(--surface);font-size:14px;font-weight:700;color:var(--acao)}
.mais-btn:hover{border-color:var(--acao)}
/* O script esconde o botão; sem script ele é a única saída da grade. */
.mais-pecas .so-sem-js{display:none}
/* Enquanto a próxima leva não chega, três pontinhos no lugar do botão: sem
   nenhum sinal, uma rede lenta lê como fim do catálogo. */
.mais-pecas[data-carregando="1"]::after{content:"";width:34px;height:6px;border-radius:99px;
  background:
    radial-gradient(circle 3px at 3px 3px, var(--ink-fraco) 90%, transparent),
    radial-gradient(circle 3px at 17px 3px, var(--ink-fraco) 90%, transparent),
    radial-gradient(circle 3px at 31px 3px, var(--ink-fraco) 90%, transparent);
  animation:nz-pontos 1s ease-in-out infinite}
@keyframes nz-pontos{0%,100%{opacity:.35}50%{opacity:1}}
@media (prefers-reduced-motion:reduce){
  .mais-pecas[data-carregando="1"]::after{animation:none;opacity:.7}
}

/* ── menu com subcategoria (o submenu antigo, ainda usado em nada) ───────── */
.menu-pai{position:relative;display:inline-flex}
.menu-pai > a{display:inline-flex;align-items:center;gap:5px}
.menu-pai.on > a{color:var(--primary)}

/* Chips da subcategoria dentro da página da raiz */
.subcats{display:flex;flex-wrap:wrap;gap:8px;margin-bottom:18px}
.subcats a{border:1.5px solid var(--edge);background:var(--surface);border-radius:var(--r);
  padding:8px 10px 8px 14px;font-size:13px;font-weight:600;color:var(--ink-soft);min-height:42px;
  display:inline-flex;align-items:center;gap:9px;transition:border-color .15s,color .15s}
.subcats a:hover{border-color:rgba(29,122,217,.5);color:var(--ink)}
.subcats a.on{background:var(--acao);border-color:var(--acao);color:#fff}

/* ⚠️ O NÚMERO ERA 11px COM 60% DE OPACIDADE, e por isso ele não era lido.
   Ele é metade do que o chip existe para dizer: "Decorações" responde onde
   clicar, e o "22" responde se VALE clicar, porque uma subcategoria de 1 peça
   e uma de 22 pedem decisões diferentes. Virou uma pastilha na cor da marca,
   em mono como todo número deste projeto.

   A pastilha também é o que separa visualmente o nome do número sem precisar
   de um ponto ou de um parêntese no meio do texto. */
.subcats em{font-style:normal;font-family:"JetBrains Mono",ui-monospace,monospace;
  font-size:11.5px;font-weight:700;line-height:1;padding:4px 7px;border-radius:var(--r);
  background:rgb(var(--primary-rgb) / .1);color:var(--primary)}
.subcats a:hover em{background:rgb(var(--primary-rgb) / .16)}
/* No chip aceso o fundo já é a cor de ação: a pastilha vira um véu claro, e
   não um retângulo branco, que lá dentro brigaria com o texto. */
.subcats a.on em{background:rgb(255 255 255 / .24);color:#fff}

@media (max-width:900px){
  /* No celular quem faz o papel do painel é a GAVETA: um painel de 1040px não
     cabe, e duas listas de categoria na mesma tela é uma a mais. O que fica na
     barra são os atalhos, rolando de lado. */
  .mega{display:none}
  .menu .linha{flex-wrap:nowrap;overflow-x:auto;overflow-y:hidden;
    scrollbar-width:none;height:44px}
  .menu .linha::-webkit-scrollbar{display:none}
}

/* ── convite de instalação ──────────────────────────────────────────────── */
.convite{position:fixed;left:16px;right:16px;bottom:16px;z-index:9400;max-width:520px;margin:0 auto;
  background:var(--surface);border:1px solid var(--edge);border-radius:var(--r);
  box-shadow:0 18px 44px rgba(16,32,58,.22);padding:13px 14px;
  display:flex;align-items:center;gap:13px;animation:sobe .22s ease-out}
@keyframes sobe{from{opacity:0;transform:translateY(14px)}to{opacity:1;transform:none}}
@media (prefers-reduced-motion:reduce){.convite{animation:none}}
.convite img{width:44px;height:44px;border-radius:var(--r);flex:0 0 auto}
.convite-txt{min-width:0;display:flex;flex-direction:column;gap:2px}
.convite-txt b{font-size:13.5px;font-weight:700}
.convite-txt span{font-size:11.5px;color:var(--ink-fraco);line-height:1.35}
.convite-sim{background:var(--acao);color:#fff;border-radius:var(--r);padding:11px 17px;
  font-size:13px;font-weight:700;flex:0 0 auto;min-height:44px}
.convite-nao{width:34px;height:34px;flex:0 0 auto;color:var(--ink-fraco);font-size:21px;line-height:1}
@media (max-width:420px){
  .convite{flex-wrap:wrap}
  .convite-sim{flex:1;order:3}
  .convite-nao{order:2;margin-left:auto}
}

/* ── selos de vitrine ───────────────────────────────────────────────────── */
.selos{display:flex;flex-wrap:wrap;gap:6px;margin-bottom:10px}
.selo{font-size:11px;font-weight:700;padding:4px 9px;border-radius:var(--r);
  text-transform:uppercase;letter-spacing:.03em;line-height:1.3}
.selo-vendido{background:#FFF1E2;color:#B4560A}
.selo-off{background:var(--off-fundo);color:var(--off-txt)}
.selo-ultimas{background:#FDE9E9;color:#B32020}
.preco-off{font-size:12.5px;font-weight:800;color:var(--ok);padding-bottom:8px}

/* ── nota e avaliações ──────────────────────────────────────────────────── */
.nota{display:inline-flex;align-items:center;gap:7px;margin-bottom:14px;padding:0;
  font-size:12.5px;color:var(--ink-soft);cursor:pointer}
.nota b{font-family:"JetBrains Mono",monospace;color:var(--ink)}
.nota em{font-style:normal;color:var(--primary);text-decoration:underline;text-underline-offset:2px}
.estrelas{display:inline-flex;gap:1px;color:#F5A623}
.estrela{width:14px;height:14px}
.estrelas.grande .estrela{width:20px;height:20px}
.nota-resumo{display:flex;align-items:center;gap:12px;padding-bottom:20px;margin-bottom:20px;
  border-bottom:1px solid var(--edge);flex-wrap:wrap}
.nota-resumo b{font-family:"JetBrains Mono",monospace;font-size:34px;line-height:1;color:var(--ink)}
.nota-resumo em{font-style:normal;font-size:13px;color:var(--ink-fraco)}
.avaliacao{padding:16px 0;border-bottom:1px solid var(--linha-fraca)}
.avaliacao:last-child{border-bottom:0;padding-bottom:0}
.avaliacao-topo{display:flex;align-items:center;gap:9px;flex-wrap:wrap;margin-bottom:7px}
.avaliacao-topo b{font-size:13px;color:var(--ink)}
.avaliacao-data,.avaliacao-fonte{font-size:11.5px;color:var(--ink-fraco)}
.avaliacao-fonte{background:var(--surface-2);border-radius:var(--r);padding:2px 7px}
.avaliacao p{font-size:14px;margin:0;color:var(--ink-soft)}
.avaliacao-resposta{margin-top:9px !important;padding:11px 13px;background:var(--surface-2);
  border-radius:var(--r);font-size:13px}

/* ── varejo x kit ───────────────────────────────────────────────────────── */
.modos{display:grid;grid-template-columns:1fr 1fr;gap:9px;margin-bottom:22px}
.modo{border:1.5px solid var(--edge);background:var(--surface);border-radius:var(--r);
  padding:13px 14px;text-align:left;display:flex;flex-direction:column;gap:3px;min-height:64px;transition:.14s}
.modo:hover{border-color:rgb(var(--primary-rgb) / .5)}
.modo b{font-size:13px;font-weight:700;color:var(--ink)}
.modo span{font-size:11.5px;color:var(--ink-fraco);line-height:1.3}
.modo.is-on{background:var(--acao);border-color:var(--acao)}
.modo.is-on b,.modo.is-on span{color:#fff}
.modo.is-on span{opacity:.85}

/* Escolher: select da cor + quantidade + Incluir */
.kit-add{display:flex;align-items:stretch;gap:8px}
.kit-add .sel{flex:1;min-width:0}
.kit-stepper{flex:0 0 auto}
.btn-kit-add{flex:0 0 auto;background:var(--acao);color:#fff;border-radius:var(--r);
  padding:0 18px;font-size:13px;font-weight:700;min-height:48px;white-space:nowrap}
.btn-kit-add:hover{filter:brightness(1.12)}

/* O que já foi incluído */
.kit-lista{display:flex;flex-direction:column;gap:8px;margin-top:12px}
.kit-item{display:flex;align-items:center;gap:11px;border:1.5px solid var(--primary);
  background:rgb(var(--primary-rgb) / .06);border-radius:var(--r);padding:9px 12px;
  min-height:56px;box-shadow:inset 3px 0 0 var(--primary)}
.kit-item i{width:20px;height:20px;border-radius:99px;flex:0 0 auto;
  box-shadow:inset 0 0 0 1px rgba(0,0,0,.18)}
.kit-nome{flex:1;min-width:0;font-size:13.5px;font-weight:600;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.kit-preco{font-family:"JetBrains Mono",monospace;font-size:11.5px;color:var(--ink-fraco);
  white-space:nowrap;flex:0 0 auto}
.kit-item .stepper{flex:0 0 auto}
.kit-tira{width:32px;height:32px;flex:0 0 auto;color:var(--ink-fraco);font-size:20px;line-height:1}
.kit-tira:hover{color:#B32020}
.kit-resumo{margin:14px 0 0;font-size:12.5px;color:var(--ink-soft);
  background:var(--surface-2);border-radius:var(--r);padding:11px 13px}
.kit-resumo b{color:var(--ink)}

/* ── lente navegável ────────────────────────────────────────────────────── */
.lente-seta{position:absolute;top:50%;transform:translateY(-50%);
  width:52px;height:52px;border-radius:99px;background:rgba(255,255,255,.14);
  color:#fff;font-size:30px;line-height:1;display:grid;place-items:center}
.lente-seta:hover{background:rgba(255,255,255,.26)}
.lente-seta.esq{left:18px}
.lente-seta.dir{right:18px}
.lente-conta{position:absolute;bottom:20px;left:50%;transform:translateX(-50%);
  color:#fff;font-family:"JetBrains Mono",monospace;font-size:12.5px;
  background:rgba(0,0,0,.42);border-radius:var(--r);padding:6px 13px}

/* ── descrição longa ────────────────────────────────────────────────────── */
.texto-longo{margin-top:14px;font-size:14.5px;line-height:1.65}

@media (max-width:600px){
  .modos{grid-template-columns:1fr}
  .lente-seta{width:44px;height:44px;font-size:25px}
  .lente-seta.esq{left:6px}
  .lente-seta.dir{right:6px}
}

/* ── selo sobre a foto do card ──────────────────────────────────────────── */
.card-fig{position:relative}
.card-selo{position:absolute;left:9px;bottom:9px;z-index:2;
  font-size:10.5px;font-weight:800;padding:4px 9px;border-radius:var(--r);
  text-transform:uppercase;letter-spacing:.03em}

/* ── cartão branco do produto (moldura do Mercado Livre) ────────────────── */
.produto-cartao{background:var(--surface);border:1px solid var(--edge);border-radius:var(--r);
  padding:26px;box-shadow:0 1px 2px rgba(16,32,58,.05)}
.produto-cartao .palco{top:104px}
.produto-cartao .palco-fig{border:1px solid var(--edge)}

/* ── select da loja ─────────────────────────────────────────────────────── */
.sel{position:relative}
.sel-nativo{position:absolute;left:0;top:0;width:100%;height:100%;opacity:0;pointer-events:none}
.sel-btn{display:flex;align-items:center;gap:9px;width:100%;min-height:48px;
  padding:12px 14px;border:1.5px solid var(--edge);border-radius:var(--r);
  background:var(--surface);font:inherit;font-size:13.5px;font-weight:600;color:var(--ink);text-align:left}
.sel-btn:hover{border-color:rgb(var(--primary-rgb) / .5)}
.sel-btn[aria-expanded="true"]{border-color:var(--primary);box-shadow:0 0 0 3px rgb(var(--primary-rgb) / .14)}
.sel-cor{width:20px;height:20px;border-radius:99px;flex:0 0 auto;box-shadow:inset 0 0 0 1px rgba(0,0,0,.18)}
.sel-txt{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.sel-sub{font-style:normal;font-family:"JetBrains Mono",monospace;font-size:12px;
  font-weight:500;color:var(--ink-fraco);margin-left:auto;white-space:nowrap}
.sel-selo{font-size:10.5px;font-weight:800;color:#0B7A3E;background:var(--off-fundo);
  border-radius:var(--r);padding:3px 7px;white-space:nowrap}
.sel-chev{font-style:normal;color:var(--ink-fraco);font-size:11px;margin-left:6px}
.sel-sub + .sel-chev,.sel-selo + .sel-chev{margin-left:6px}
.sel-btn > .sel-txt + .sel-chev{margin-left:auto}

.sel-painel{position:absolute;left:0;right:0;top:calc(100% + 5px);z-index:130;
  background:var(--surface);border:1px solid var(--edge);border-radius:var(--r);
  box-shadow:0 16px 38px rgba(16,32,58,.18);padding:5px;max-height:320px;overflow-y:auto}
.sel-opt{display:flex;align-items:center;gap:9px;width:100%;min-height:46px;
  padding:10px 11px;border-radius:var(--r);font-size:13.5px;font-weight:600;
  color:var(--ink);text-align:left}
.sel-opt:hover{background:var(--surface-2)}
.sel-opt.on{background:rgb(var(--primary-rgb) / .09);color:var(--primary)}
.sel-opt.on .sel-sub{color:var(--primary);opacity:.8}

/* ── dois botões, como no Mercado Livre ─────────────────────────────────── */
.btn-sacola{width:100%;margin-top:10px;background:var(--acao-fraca);
  color:var(--acao);border-radius:var(--r);padding:15px;font-size:15px;font-weight:600;
  display:flex;align-items:center;justify-content:center;gap:9px;min-height:52px}
.btn-sacola:hover{background:rgb(var(--acao-rgb) / .22)}
/* O ícone de carrinho é maior que o texto pediria: é ele que a pessoa
   procura com o olho antes de ler a frase. */
.btn-sacola svg{width:21px;height:21px;flex:0 0 auto}

@media (max-width:900px){
  .produto-cartao{padding:16px}
}

@media (max-width:420px){
  /* A 375px "à vista no Pix" quebrava em duas linhas espremidas ao lado do
     preço. Embaixo dele o texto cabe inteiro e o preço fica solto. */
  .preco-bloco{flex-wrap:wrap;gap:0 10px}
  .preco-obs,.preco-off{padding-bottom:0}
  .preco-obs{order:2;flex-basis:100%}
  .preco-off{order:1}
}

/* ── cupom na sacola ────────────────────────────────────────────────────── */
.cupom{margin:4px 0 2px}
.cupom-linha{display:flex;gap:7px}
.cupom-linha input{flex:1;min-width:0;border:1.5px solid var(--edge);border-radius:var(--r);
  background:var(--surface);padding:11px 13px;font:inherit;font-size:13px;
  font-family:"JetBrains Mono",monospace;text-transform:uppercase;min-height:44px;color:var(--ink)}
.cupom-linha input::placeholder{font-family:Inter,system-ui,sans-serif;text-transform:none;color:var(--ink-fraco)}
.cupom-linha input:focus{outline:none;border-color:var(--primary);box-shadow:0 0 0 3px rgb(var(--primary-rgb) / .14)}
.cupom-linha button{flex:0 0 auto;background:var(--acao);color:#fff;border-radius:var(--r);
  padding:0 16px;font-size:12.5px;font-weight:700;min-height:44px}
.cupom-linha button:hover{filter:brightness(1.14)}
.cupom-aviso{margin:7px 0 0;font-size:11.5px;line-height:1.4}
.cupom-aviso.bom{color:var(--ok)}
.cupom-aviso.ruim{color:#B32020}
.cupom-aviso.nota{color:var(--ink-fraco)}
.pedido-l.desconto span:last-child{color:var(--ok);font-weight:700}
/* Enquanto o servidor confere o preço, o resumo fica esmaecido: mostrar o
   número velho com a mesma firmeza do confirmado seria afirmar o que ainda
   não se sabe. */
.resumo-pedido.conferindo{opacity:.6;transition:opacity .12s}

/* ── marca ─────────────────────────────────────────────────────────────── */
/* O logo é o arquivo original, não um desenho aproximado. A palavra
   "nozama" já vem dentro dele, então ao lado só sobra o "3D". */
/* `align-items: baseline` e não `center`: o PNG traz a palavra desenhada e o
   "3D" precisa sentar na MESMA linha das letras, não no meio da altura da
   sacola, que é bem mais alta. Centralizado ele flutuava dois pixels acima e
   parecia colado por engano.

   O gap é negativo porque o arquivo tem margem transparente à direita: sem
   puxar, sobra um vão que não existe no logo e o "3D" vira uma palavra solta
   ao lado da marca em vez de fazer parte dela. */
/* O "3D" tem que parecer parte da marca, não uma palavra jogada ao lado.
   `flex-end` porque a arte do PNG vai até a última linha do arquivo: o pé da
   imagem É a base das letras, então alinhar pelo fim faz o "3D" sentar na
   mesma linha de "nozama". Centralizado ele flutuava acima, porque a sacola
   é bem mais alta que as letras.
   O tamanho (0.8 da altura do logo) e o recuo negativo fecham o vão: sem eles
   o 3D fica pequeno e distante, como se fosse de outra marca. */
.marca{display:inline-flex;align-items:center;line-height:1}
/* 44px de altura: o arquivo e 600x200, entao a palavra ocupa pouco mais de um
   terco da altura da imagem. Nos 32px de antes a palavra nascia com uns 14px e
   sumia ao lado da busca. */
.marca img.logo{width:auto;height:44px;display:block}
/* Escuro e não azul: o "ama" do logo já é azul, e um "3D" azul colado nele
   lia como uma palavra só ("ama3D"). Escuro, ele conversa com o "noz" e o
   nome volta a ser "nozama 3D". O respiro é pequeno de propósito, é uma
   marca, não duas. */
/* O `3D` que ficava aqui saiu: os dois arquivos de logo já trazem a
   palavra inteira, e escrevê-lo ao lado daria "nozama 3D 3D". */
.marca-rodape img.logo{height:36px}

/* ── total ao lado do preço ─────────────────────────────────────────────── */
.preco-total{font-size:13px;color:var(--ink-soft);margin:0 0 8px}
.preco-total b{font-family:"JetBrains Mono",monospace;color:var(--ink)}

/* ── a descrição usa a MESMA moldura do bloco de compra ─────────────────── */
/* As abas alinham com a borda do cartão de baixo, não com o texto dele:
   recuadas, elas pareciam pertencer a outro bloco. */
.detalhe-abas{padding:0}
.detalhe-corpo{max-width:none;padding:26px 28px 30px}
.detalhe .texto-longo{max-width:74ch}

/* ── produtos relacionados ──────────────────────────────────────────────── */
.relacionados{padding:0 20px 46px}
.relacionados h2{font-family:Sora,system-ui,sans-serif;font-size:21px;font-weight:700;
  margin:0 0 18px;letter-spacing:-.01em}
/* A faixa do Mercado Livre: os cartões ocupam a largura toda e as setas FLUTUAM
   sobre a borda, em círculo branco com sombra. Antes elas roubavam 46px de cada
   lado e o cartão da ponta ficava mais estreito que o da grade, o Paulo pediu
   justamente para manter o mesmo tamanho. */
.trilho{position:relative}
.trilho-itens{display:flex;gap:16px;overflow-x:auto;overflow-y:hidden;
  scroll-behavior:smooth;scrollbar-width:none}
.trilho-itens::-webkit-scrollbar{display:none}
/**
 * QUATRO cabendo exatos na largura, e não 246px fixos.
 *
 * Com largura fixa, onde o quarto cartão terminava era resultado de uma divisão
 * que ninguém controlava: às vezes sobrava um vão, às vezes o quarto ficava
 * cortado no meio, e em nenhum dos casos ele alinhava com a grade de produtos
 * logo acima, que é o alinhamento que a página inteira segue.
 *
 * `calc((100% - 3 * 16px) / 4)` faz os quatro ocuparem a linha toda com os três
 * vãos de 16px da grade. E resolve a navegação de graça: com quatro ou menos,
 * `scrollWidth` iguala `clientWidth` e o `arrumar()` do JS esconde as setas
 * sozinho; do quinto em diante elas aparecem porque passou a haver o que rolar.
 *
 * O `padding:4px` que estava aqui saiu: ele deslocava a faixa 4px para dentro em
 * relação à grade, e 4px de desalinhamento é justamente do tamanho que incomoda
 * sem que se saiba por quê.
 */
/* ⚠️ Quem dimensiona é o FILHO DIRETO do trilho, não o `.card`. Desde que o
 * card ganhou o invólucro `.card-envolve` (por causa do coração, que não pode
 * ficar dentro do link), o item de flex passou a ser o invólucro, e ele não
 * tinha base nenhuma: os doze cartões da coleção se espremiam na largura da
 * página, cada um com 90px, e a rolagem nunca acontecia porque nada
 * transbordava. Regra que ficou: dimensionar `> *`, e não a classe de dentro. */
.trilho-itens > *{flex:0 0 calc((100% - 48px) / 4);width:auto;min-width:0}
.trilho-seta{position:absolute;top:50%;transform:translateY(-50%);z-index:4;
  width:42px;height:42px;border-radius:99px;background:var(--surface);
  border:1px solid var(--edge);box-shadow:0 4px 14px rgba(16,32,58,.18);
  color:var(--ink-soft);font-size:22px;line-height:1;display:grid;place-items:center;transition:.15s}
.trilho-seta:hover{color:var(--acao);box-shadow:0 6px 20px rgba(16,32,58,.24)}
.trilho-seta[data-trilho="-1"]{left:-14px}
.trilho-seta[data-trilho="1"]{right:-14px}

/* Dentro do cartão de categorias a faixa não tem margem de sobra: a -14px as
   setas caíam sobre a foto do primeiro e do último cartão. Aqui elas ficam na
   borda do cartão, onde há o padding dele para ocupar. */
.bloco-cats .trilho-seta[data-trilho="-1"]{left:-26px}
.bloco-cats .trilho-seta[data-trilho="1"]{right:-26px}

@media (max-width:900px){
  .detalhe-corpo{padding:20px}
  /* Sem setas no toque: quem tem dedo arrasta, e o alvo de 42px em cima do
     cartão atrapalha mais do que ajuda. */
  .trilho-seta{display:none}
  /* Aqui a largura volta a ser fixa: quatro dentro de 375px dariam 78px de
     cartão, onde não cabe nem o preço. Dois e um pedaço do terceiro, que é o
     que convida a arrastar. */
  .trilho-itens > *{flex:0 0 168px;width:168px}
}

/* O ponto desenhado tem 9px, mas o ALVO tem 44: no celular o dedo não
   acerta um alvo de nove pixels, e a pessoa desiste em vez de reclamar. */
.banner-pontos button{position:relative}
.banner-pontos button::after{content:"";position:absolute;left:50%;top:50%;
  width:44px;height:44px;transform:translate(-50%,-50%)}
@media (max-width:900px){
  /* No celular o slide sai do `position: absolute` e entra no fluxo: a
     altura passa a ser a do conteúdo, e o trilho acompanha. `display:grid`
     e não `flex` porque o desktop também usa grid, trocar aqui quebrava a
     coluna única e o botão ficava cortado pela borda do cartão. */
  .banner-trilho{min-height:auto;position:static}
  .banner{position:static;display:none;padding:0}
  .banner.on{display:grid}
  /* No celular o slide empilha e o botão fica no rodapé do cartão: os
     pontos caíam em cima dele. Sobem para o canto da FOTO, onde não
     disputam com nada clicável. */
  .banner-pontos{right:12px;bottom:auto;top:12px}
}

/* O botão de instalar do rodapé e as três regras dele saíram: o convite é só
   o cartão flutuante agora. Regra de estilo sem elemento é o tipo de coisa que
   volta a valer no dia em que alguém reusar a classe achando que ela é nova. */

/* ── cartões de campanha ────────────────────────────────────────────────── */
/* O espaço em volta é do PRIMEIRO elemento, nunca margem do segundo: a faixa
   herda do `.sec` de cima os 34px que ele já dá, e paga os 34 de baixo, porque
   quem vem depois (`.sec-continua`) nasce com padding-top zero. Sem isto a
   campanha tinha 50px em cima e ZERO embaixo, colada na grade seguinte, e lia
   como se os cartões fossem o cabeçalho daquelas peças. */
/* ⚠️ `margin: 0 AUTO 34px`, nunca `margin: 0 0 34px`: esta faixa é um `.wrap`,
   e é o `auto` dele que a centraliza na coluna da página. Zerá-lo joga o bloco
   inteiro para a esquerda em tela larga, desalinhado de tudo o que está acima e
   abaixo. Quinta vez que uma largura própria desalinha um bloco neste projeto,
   e a primeira em que a culpa foi de um atalho de margem. */
.destaques{display:grid;grid-template-columns:1fr 1fr;gap:16px;margin:0 auto 34px;padding:0 20px}
.destaque{display:grid;grid-template-columns:1fr 1fr;border-radius:var(--r);overflow:hidden;
  border:1px solid var(--edge);background:var(--surface);min-height:200px;transition:.16s}
.destaque:hover{box-shadow:0 14px 30px rgba(15,35,70,.12);border-color:rgba(0,104,201,.3)}
/* O texto respira: o chapéu bem espaçado, o título em caixa alta e um vão
   generoso até o botão. É o que faz o lado branco parecer editorial em vez de
   um cartão de produto com fundo claro. */
.destaque-txt{padding:34px 30px;display:flex;flex-direction:column;justify-content:center;
  gap:0;min-width:0}
.destaque-txt .chapeu{font-size:11px;letter-spacing:.22em;color:var(--ink-fraco);
  text-transform:uppercase;font-weight:600;margin-bottom:14px}
.destaque-txt h3{font-family:Sora,system-ui,sans-serif;font-size:23px;font-weight:700;
  color:var(--titulo);line-height:1.22;letter-spacing:0;margin:0 0 22px;text-transform:uppercase}
.btn-destaque{align-self:flex-start;background:var(--acao);color:#fff;border-radius:var(--r);
  padding:0 26px;font-size:14px;font-weight:600;min-height:46px;display:inline-flex;align-items:center}
.btn-destaque:hover{background:var(--acao-forte)}
/* A imagem SANGRA no bloco de cor, sem respiro em volta: a moldura de padding
   fazia a foto parecer colada num quadrado, e no Mercado Livre ela ocupa o
   bloco inteiro. */
.destaque-fig{display:grid;place-items:center;overflow:hidden;padding:0;position:relative}
.destaque-fig img{width:100%;height:100%;object-fit:cover;display:block}

@media (max-width:900px){
  .destaques{grid-template-columns:1fr}
  .destaque{min-height:0}
  .destaque-txt{padding:20px}
  .destaque-txt h3{font-size:18px;margin-bottom:12px}
  .destaque-fig{padding:10px}
  .destaque-fig img{max-height:140px}
}

/* ══ TOPO: hambúrguer, marca e carrinho ═════════════════════════════════════
   Três âncoras fixas: menu na esquerda, carrinho na direita, marca entre eles.
   São os dois cantos que o polegar alcança sem mudar a pegada do aparelho; no
   meio da linha o carrinho competia com a marca e ninguém achava. */
.hamburguer{display:none;width:42px;height:42px;flex:0 0 auto;margin-left:-10px;
  border-radius:var(--r);color:var(--ink);align-items:center;justify-content:center}
.hamburguer svg{width:23px;height:23px}
.hamburguer:hover{background:var(--surface-2)}
.topo .linha .sacola{margin-left:auto}
.sacola svg{width:23px;height:23px}

/* ── gaveta lateral ── */
.gaveta-fundo{position:fixed;inset:0;z-index:80;background:rgba(10,18,32,.45);
  animation:aparece .18s ease-out}
@keyframes aparece{from{opacity:0}to{opacity:1}}
.gaveta{position:fixed;top:0;left:0;bottom:0;z-index:90;width:min(84vw,320px);
  background:var(--surface);box-shadow:6px 0 32px rgba(10,18,32,.22);
  display:flex;flex-direction:column;animation:entra .22s ease-out}
@keyframes entra{from{transform:translateX(-100%)}to{transform:none}}
@media (prefers-reduced-motion:reduce){.gaveta,.gaveta-fundo{animation:none}}
.gaveta-topo{display:flex;align-items:center;justify-content:space-between;gap:12px;
  padding:14px 16px;border-bottom:1px solid var(--edge)}
.gaveta-fecha{width:40px;height:40px;flex:0 0 auto;border-radius:var(--r);
  color:var(--ink-fraco);font-size:26px;line-height:1}
.gaveta-fecha:hover{background:var(--surface-2);color:var(--ink)}
.gaveta-itens{flex:1;overflow-y:auto;padding:8px}
.gaveta-itens a{display:flex;align-items:center;justify-content:space-between;gap:10px;
  min-height:48px;padding:12px 14px;border-radius:var(--r);
  font-size:14.5px;font-weight:600;color:var(--ink)}
.gaveta-itens a:hover{background:var(--surface-2)}
.gaveta-itens a.on{color:var(--acao);background:var(--acao-fraca)}
/* A filha recua e afina: sem isso a lista vira uma coluna plana onde
   "Chaveiros" e "Personalizados" parecem do mesmo nível. */
.gaveta-itens a.filha{padding-left:30px;font-size:13.5px;font-weight:500;color:var(--ink-soft)}
.gaveta-itens em{font-style:normal;font-size:11.5px;color:var(--ink-fraco);font-weight:500}
/* ── a gaveta em acordeão ───────────────────────────────────────────────────
   O `<details>` do navegador faz a abertura sem JavaScript. O que o CSS
   precisa desfazer é a setinha padrão dele, que aparece em tamanhos e
   desenhos diferentes em cada navegador e brigaria com a nossa. */
.gaveta-grupo > summary{display:flex;align-items:center;gap:10px;min-height:48px;
  padding:0 12px;border-radius:var(--r);font-size:14.5px;font-weight:600;
  color:var(--ink);cursor:pointer;list-style:none}
.gaveta-grupo > summary::-webkit-details-marker{display:none}
.gaveta-grupo > summary:hover{background:var(--surface-2)}
.gaveta-grupo > summary span{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.gaveta-grupo > summary em{margin-left:auto;font-style:normal;font-size:11.5px;
  color:var(--ink-fraco);font-weight:500}
.gaveta-grupo .gav-ico{flex:0 0 auto;opacity:.7}
.gaveta-grupo .gav-chev{flex:0 0 auto;opacity:.5;transition:transform .18s}
.gaveta-grupo[open] > summary .gav-chev{transform:rotate(180deg)}
.gaveta-grupo[open] > summary{color:var(--acao)}
.gaveta-grupo[open] > summary .gav-ico{opacity:1}
/* "Tudo em X" é o caminho para a raiz, e ele precisa parecer diferente das
   filhas: sem isso a pessoa lê como se fosse mais uma subcategoria. */
.gaveta-itens a.filha.destaque{font-weight:600;color:var(--acao)}
.gaveta-itens > a .gav-ico{flex:0 0 auto;opacity:.7}
.gaveta-itens > a span{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.gaveta-itens > a em{margin-left:auto}
.gaveta-pe{border-top:1px solid var(--edge);padding:10px 8px}
.gaveta-pe a{display:block;padding:11px 14px;border-radius:var(--r);
  font-size:13.5px;font-weight:600;color:var(--acao);min-height:44px}
.gaveta-pe a:hover{background:var(--surface-2)}

/* ── menu de categorias: setas, sem barra de rolagem ── */
.menu{position:relative}
.menu-seta{position:absolute;top:0;bottom:0;z-index:5;width:36px;
  background:var(--surface);color:var(--ink-soft);font-size:20px;line-height:1;
  display:none;align-items:center;justify-content:center}
.menu-seta.esq{left:0;box-shadow:14px 0 14px -6px var(--surface)}
.menu-seta.dir{right:0;box-shadow:-14px 0 14px -6px var(--surface)}
.menu-seta:hover{color:var(--acao)}

/* ── provas com ícone ── */
.provas div{display:flex;align-items:flex-start;gap:11px}
.provas svg{width:22px;height:22px;flex:0 0 auto;color:var(--acao);margin-top:1px}
.provas span{display:flex;flex-direction:column;gap:1px;min-width:0}
.provas b{display:block;font-size:12.5px;color:var(--ink);line-height:1.25}
.provas em{font-style:normal;font-size:11px;color:var(--ink-fraco);line-height:1.3}

@media (max-width:900px){
  .hamburguer{display:flex}
  /* Sem `flex-wrap` a linha do topo continua sendo uma só: hambúrguer, marca e
     carrinho lado a lado, e a busca desce inteira embaixo. */
  /* `padding:10px 0` ZERAVA o recuo lateral que vem do `.wrap`: logo, busca
     e carrinho encostavam nas bordas enquanto todo o resto da página
     começava em 20px. Atalho de padding vertical apaga o horizontal, o
     mesmo erro que já tinha acontecido no `.sec`. */
  .topo .linha{height:auto;padding:10px 20px;flex-wrap:wrap;gap:10px}
  /* Preso ao TOPO: `.marca` sem escopo vazava o `order:2` para a gaveta,
     que também tem a marca, e lá o X ia parar na frente do logo. */
  /* `margin: 0 auto` com as duas pontas de largura fixa centraliza a marca
     de verdade: sem ele ela só ficava encostada no hambúrguer, e o vão
     sobrava todo à direita. */
  .topo .linha .marca{order:2;margin:0 auto}
  .hamburguer{order:1}
  /* Sem `order` explícito o botão de tema caía antes do hambúrguer, porque
     no HTML ele vem depois da marca e os outros dois têm ordem forçada. */
  .btn-tema{order:3;width:44px;height:44px}
  .topo .linha .sacola{order:4;margin-left:0}
  .busca{order:4;flex-basis:100%;flex:1 0 100%}
  /* No celular a gaveta assume o papel do menu: duas listas de categoria na
     mesma tela é uma a mais. */
  .menu{display:none}
}
@media (min-width:901px){
  /* Só no desktop as setas fazem sentido: no celular o dedo arrasta. */
  .menu-seta{display:flex}
}

/* ── moeda no formato de vitrine ────────────────────────────────────────── */
/* Reais grandes, `R$` pequeno e colado, centavos sobrescritos. O olho lê o
   número inteiro primeiro; os centavos só se precisar. */
.moeda{font-size:.62em;font-weight:600;margin-right:2px;vertical-align:.12em;
  font-family:Inter,system-ui,sans-serif}
.valor{font-family:"JetBrains Mono",monospace;font-weight:800;letter-spacing:-.02em}
.centavos{font-size:.58em;font-weight:800;vertical-align:.42em;margin-left:1px;
  font-family:"JetBrains Mono",monospace}

/* O ícone do carrinho é o último elemento da linha: o contador que sai da
   caixa dele precisa de um contêiner que corte, senão vira rolagem. */
.topo .linha{overflow-x:clip}

/* ── banner: alturas fixas para não pular na troca ── */
.banner h1{max-height:calc(1.15em * 3);overflow:hidden}
/* Sem reticências: o `-webkit-line-clamp` acrescenta "…" sozinho, e três
   pontos no meio de uma frase são a marca de um texto que não coube. Aqui
   ele corta na altura e pronto; quem escreve no tamanho certo é o Paulo, e
   a tela de cadastro diz quanto cabe. */
.banner p{max-height:calc(1.5em * 2);overflow:hidden}
/* O chapéu some quando o texto é longo demais para uma linha: com duas ele
   empurra o título e o cartão volta a mudar de altura. */
.banner .chapeu{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block}
.banner-txt{display:flex;flex-direction:column;justify-content:center}

/* ── divisória discreta entre os itens de confiança ── */
/* A linha entre eles é o que faz quatro frases lerem como quatro promessas
   em vez de um parágrafo picotado. Só entre, nunca na ponta: `:first-child`
   fica sem, e a última coluna de cada linha também. */
.provas div{position:relative;padding-left:18px}
.provas div::before{content:"";position:absolute;left:0;top:2px;bottom:2px;width:1px;
  background:var(--edge)}
.provas div:first-child::before{display:none}

@media (max-width:900px){
  /* Em duas colunas, quem abre a linha não tem divisória à esquerda. */
  .provas div:nth-child(odd)::before{display:none}
  .banner-trilho{min-height:0}
  .banner h1{max-height:calc(1.15em * 3)}
  .banner p{max-height:calc(1.5em * 3)}
}
@media (max-width:600px){
  /* Numa coluna só, divisória nenhuma: elas virariam um traço solto à
     esquerda de cada item. */
  .provas{grid-template-columns:1fr;gap:12px}
  .provas div{padding-left:0}
  .provas div::before{display:none}
}
.banner .chapeu em{font-style:normal}
@media (max-width:600px){ .so-largo{display:none !important} }

/* ══ BARRA INFERIOR (celular) ═══════════════════════════════════════════════
   O mesmo componente que o painel tem, com as mesmas cicatrizes:
   `env(safe-area-inset-bottom)` senão o rótulo fica sob a barra de gestos do
   iPhone, alvo de 56px porque 36 é confortável com mouse e não com dedo, e o
   `<body>` ganha espaço embaixo para o último item não nascer coberto. */
.barra-baixo{display:none;position:fixed;left:0;right:0;bottom:0;z-index:70;
  background:var(--surface);border-top:1px solid var(--edge);
  box-shadow:0 -2px 14px rgba(16,32,58,.07);
  padding-bottom:env(safe-area-inset-bottom)}
.barra-baixo > *{flex:1;min-width:0;display:flex;flex-direction:column;align-items:center;
  justify-content:center;gap:3px;min-height:56px;padding:7px 4px;
  font-size:10.5px;font-weight:600;color:var(--ink-fraco);background:none}
.barra-baixo svg{width:22px;height:22px}
.barra-baixo > *.on{color:var(--acao)}
.barra-baixo > *:active{color:var(--acao)}
.barra-icone{position:relative;display:block;line-height:0}
.barra-n{position:absolute;top:-5px;right:-8px;background:var(--acao);color:#fff;
  font-style:normal;font-size:9.5px;font-weight:700;min-width:16px;height:16px;
  border-radius:99px;display:grid;place-items:center;padding:0 4px;
  font-family:"JetBrains Mono",monospace}

@media (max-width:900px){
  .barra-baixo{display:flex}
  /* O rodapé e o último cartão precisam caber acima da barra. */
  body{padding-bottom:calc(56px + env(safe-area-inset-bottom))}
  /* Com a barra embaixo, o carrinho do topo vira repetição: dois caminhos para
     a mesma tela na mesma dobra, e um deles some do olho. */
  .topo .linha .sacola{display:none}
}

/* ══ CELULAR: caixas em duas colunas ════════════════════════════════════════ */
@media (max-width:600px){
  /* Cada promessa numa CAIXA própria, duas por linha. Empilhadas dentro de um
     cartão só elas viravam uma lista de texto cinza; separadas, cada uma tem
     começo e fim e o olho lê quatro coisas em vez de um parágrafo. */
  .provas{background:none;border:0;padding:0;grid-template-columns:1fr 1fr;gap:10px}
  .provas div{background:var(--surface);border:1px solid var(--edge);border-radius:var(--r);
    padding:13px 12px;flex-direction:column;align-items:flex-start;gap:7px}
  .provas div::before{display:none}
  .provas svg{margin-top:0}
  .provas b{font-size:12px}
  .provas em{font-size:10.5px}

  /* Categoria também em duas colunas, com a foto em cima: com o cartão
     horizontal, 160px de largura deixavam o nome em duas linhas espremidas ao
     lado de uma foto minúscula. */
  .cats-grade{gap:10px}
  .cat-card{flex-direction:column;align-items:stretch}
  /* 4/3 e não 16/10: a foto do produto é QUADRADA, e num quadro deitado ela
     sobra tanto dos lados que a peça fica minúscula no meio. Mais alto, ela
     ocupa o quadro. */
  .cat-fig{width:100%;flex:0 0 auto;aspect-ratio:4/3}
  .cat-txt{padding:10px 12px 12px}
  .bloco-cats{padding:16px}
}

/* ── frete grátis em verde: é a promessa que mais move a compra ─────────── */
.provas div.verde svg{color:var(--ok)}
.provas div.verde b{color:var(--off-txt)}
@media (max-width:600px){
  .provas div.verde{background:#EAF9F0;border-color:#B6E6C9}
}

/* O preço do banner é o argumento final do cartão: em corpo pequeno ele
   perdia para o título e para a foto, e o cartão virava só uma imagem. */
.banner-preco b{font-size:34px;font-weight:800}
.banner-preco small{font-size:11.5px;opacity:.8}
@media (max-width:600px){ .mini-preco{font-size:19px} }

/* ── o preço se distingue por PESO, não por cor ─────────────────────────
   Azul num preço lê como link, e no cartão lateral ele ficava do mesmo peso
   do título: dois textos escuros do mesmo tamanho, e o olho não sabia qual
   era o número. O título encolhe um pouco, o valor engorda. */
.mini-banner h3{font-size:15px;font-weight:600;margin:5px 0 9px;line-height:1.25}
.mini-preco{font-size:23px;font-weight:900;color:var(--ink);letter-spacing:-.02em}
.mini-preco .moeda{font-weight:600;color:var(--ink-soft)}
.card-corpo h3{font-size:14px;font-weight:600}
.card-preco b{font-weight:900;color:var(--ink)}
.card-preco .moeda{font-weight:600;color:var(--ink-soft)}
.banner-preco b{font-weight:900}
/* O resto da grade não tem cabeçalho: é a mesma lista, e o espaçamento de topo
   inteiro faria parecer que começou outra seção. */
.sec-continua{padding-top:0}

/* Os blocos de foto do catálogo, da categoria e do produto herdam a mesma
   assinatura. `.card-fig` já era `position: relative` por causa do selo. */
.card-fig::before,.cat-fig::before,.palco-fig::before,.mini-fig::before{
  content:"";position:absolute;inset:0;pointer-events:none;z-index:1;
  background:
    radial-gradient(110% 80% at 80% 8%, rgba(255,255,255,.5), transparent 62%),
    repeating-linear-gradient(180deg,
      rgba(20,40,70,.03) 0px, rgba(20,40,70,.03) 1px,
      transparent 1px, transparent 7px)}
.cat-fig,.palco-fig,.mini-fig{position:relative}
/* O selo tem que ficar ACIMA do véu, senão ele apaga o texto. */
.card-selo{z-index:2}

@media (prefers-color-scheme: dark){
  /* No escuro a luz branca sobre a foto lavaria a peça: fica só a camada. */
  .card-fig::before,.cat-fig::before,.palco-fig::before,.mini-fig::before{
    background:repeating-linear-gradient(180deg,
      rgba(255,255,255,.035) 0px, rgba(255,255,255,.035) 1px,
      transparent 1px, transparent 7px)}
}

/* ── o preço na cor de AÇÃO ─────────────────────────────────────────────
   O mesmo azul do botão. Não é decoração: é o par que o olho aprende na
   primeira tela, azul é o que faz comprar, e o preço é o número que
   decide. Escuro, ele competia em peso com o título do produto. */
.mini-preco,.card-preco b{color:var(--acao);font-weight:900}
.mini-preco .moeda,.card-preco .moeda{color:var(--acao);opacity:.75;font-weight:600}
.mini-preco .centavos,.card-preco .centavos{color:var(--acao)}

/* `.filtro-nota` saiu junto com o botão que ela explicava: na faixa do
   computador o resultado muda no clique e não há mais botão para justificar;
   na folha do celular o botão É a ação, e um aviso dizendo que muda sozinho
   seria mentira. Regra de estilo sem elemento é o tipo de coisa que volta a
   valer no dia em que alguém reusar a classe achando que ela é nova. */

/* ── selo do atacado ────────────────────────────────────────────────────── */
/* Verde porque é dinheiro no bolso de quem compra, e é a mesma cor que já
   marca o "% OFF" e o frete grátis: a loja inteira usa verde para dizer
   "aqui você paga menos". */
.selo-atacado{display:flex;align-items:flex-start;gap:11px;margin-bottom:16px;
  background:var(--off-fundo);border:1px solid rgb(var(--acao-rgb) / .001);
  border-color:#B6E6C9;border-radius:var(--r);padding:12px 14px}
.selo-atacado svg{width:22px;height:22px;flex:0 0 auto;color:var(--off-txt);margin-top:1px}
.selo-atacado span{display:flex;flex-direction:column;gap:2px;min-width:0}
.selo-atacado b{font-size:13px;color:var(--off-txt);line-height:1.3}
.selo-atacado em{font-style:normal;font-size:11.5px;color:var(--ink-soft);line-height:1.35}

@media (prefers-color-scheme: dark){
  .selo-atacado{border-color:#1E4A36}
}

/* Escolha explícita do visitante: repete os MESMOS tokens fora da media
   query, para vencer o sistema nos dois sentidos. Duplicação de propósito,
   a alternativa seria uma lista de variáveis intermediárias que ninguém
   conseguiria ler depois. */
:root[data-tema="escuro"]{
    /* O azul da marca clareia: #0068C9 sobre fundo escuro fica pesado e some.
       O logo continua com a cor dele, ele é uma imagem, e mexer nela seria
       mexer na marca. */
    --primary:#4B9BE8; --primary-rgb:75 155 232; --deep:#0068C9; --accent:#8CC4F2;
    --acao:#4A93FB; --acao-rgb:74 147 251; --acao-forte:#3B7ADB; --acao-fraca:#16283F;

    --ink:#E8EDF5; --ink-soft:#A8B6CB; --ink-fraco:#7C8CA5;
    --ground:#0B1220; --surface:#111C2F; --surface-2:#18263C; --edge:#243450;
    --ok:#34C68B; --ok-rgb:52 198 139; --warn:#D9A648;

    --alto:#16233B; --linha-fraca:#1C2C46; --off-fundo:#123326; --off-txt:#5BD9A3;
    --aviso-fundo:#2A2214; --aviso-borda:#4A3C1E; --aviso-txt:#E5C27C;
    --titulo:#E8EDF5;
}

/* ── botão de tema ──────────────────────────────────────────────────────── */
/* Um botão só, que mostra PARA ONDE vai, não onde está: no claro ele desenha a
   lua ("clique para escurecer"), no escuro o sol. Mostrar o estado atual é o
   erro clássico, a pessoa clica achando que está ligando o que já está ligado. */
.btn-tema{width:38px;height:38px;flex:0 0 auto;border-radius:var(--r);
  color:var(--ink-soft);display:grid;place-items:center}
.btn-tema:hover{background:var(--surface-2);color:var(--ink)}
.btn-tema svg{width:20px;height:20px}
.btn-tema .sol{display:none}
:root[data-tema="escuro"] .btn-tema .sol{display:block}
:root[data-tema="escuro"] .btn-tema .lua{display:none}
@media (prefers-color-scheme: dark){
  :root:not([data-tema="claro"]) .btn-tema .sol{display:block}
  :root:not([data-tema="claro"]) .btn-tema .lua{display:none}
}
/* No celular o alvo vai a 44px. Precisa ficar DEPOIS da regra base: a media
   query onde ele nasceu está antes dela no arquivo, e com a mesma
   especificidade quem vem por último ganha. Terceira vez que a ordem morde
   neste arquivo, quando uma regra de media query "não pega", o suspeito é a
   posição, não a media. */
@media (max-width:900px){
  .btn-tema{width:44px;height:44px}
}

/* ── economia da escada ─────────────────────────────────────────────────── */
/* Verde, como todo o resto que diz "aqui você paga menos". O valor em negrito
   porque é ele que a pessoa procura na frase. */
.economia-linha{display:flex;align-items:center;gap:7px;margin:0 0 20px;
  font-size:13px;color:var(--off-txt)}
.economia-linha b{font-family:"JetBrains Mono",monospace;font-weight:800}
.pedido-l.economia span:last-child{color:var(--off-txt);font-weight:700}

/* ── garantias do fim da sacola ─────────────────────────────────────────── */
/* Uma linha por garantia, com ícone. Como parágrafo cinza elas eram duas
   frases que ninguém lia; como lista, são o que a pessoa confere antes de
   entregar o dinheiro. */
.garantias{margin-top:16px;padding-top:16px;border-top:1px solid var(--edge);
  display:flex;flex-direction:column}
/* Um traço discreto entre uma garantia e outra. Empilhadas só com espaço
   elas viravam um bloco de seis linhas de texto onde o olho não sabe onde
   uma acaba; com a divisória, cada uma é uma promessa separada e a pessoa
   conta três. O `gap` sai porque agora quem afasta é o padding de cada
   linha: com os dois, o traço ficaria boiando no meio do vão em vez de
   encostar nas duas. */
.garantias div{display:flex;align-items:flex-start;gap:10px;padding:11px 0}
.garantias div + div{border-top:1px solid var(--edge)}
/* A primeira não empurra e a última não deixa sobra: senão o card ganha
   uma faixa vazia embaixo que não existe em nenhum outro lugar da tela. */
.garantias div:first-child{padding-top:0}
.garantias div:last-child{padding-bottom:0}
.garantias svg{width:20px;height:20px;flex:0 0 auto;color:var(--acao);margin-top:1px}
.garantias span{display:flex;flex-direction:column;gap:1px;min-width:0}
.garantias b{font-size:12.5px;color:var(--ink);line-height:1.25}
.garantias em{font-style:normal;font-size:11.5px;color:var(--ink-fraco);line-height:1.3}
/* ── sacola vazia ───────────────────────────────────────────────────────── */
/* Uma coluna só: com duas, metade da tela ficava em branco ao lado de uma
   caixinha dizendo que está vazio, o vazio anunciando o vazio. */
.sacola-grade.sem-itens{grid-template-columns:1fr}
/* Ícone à ESQUERDA, texto ao lado, tudo numa linha de base só. Empilhado e
   centralizado, o estado vazio vira um cartaz, e cartaz é o que a pessoa
   fecha. Em linha, ele lê como um recado curto e o botão fica no fim da frase,
   que é onde a mão já está indo. */
.sacola-vazia{background:var(--surface);border:1px solid var(--edge);border-radius:var(--r);
  padding:46px 40px;display:flex;align-items:center;gap:34px;text-align:left}
/* Grande e bem apagado: preenche o espaço sem virar o assunto, o assunto é o
   botão. */
.sacola-vazia svg{width:104px;height:104px;flex:0 0 auto;color:var(--acao);opacity:.18}
.sacola-vazia .txt{display:flex;flex-direction:column;align-items:flex-start;gap:7px;min-width:0}
.sacola-vazia b{font-family:Sora,system-ui,sans-serif;font-size:23px;font-weight:700;
  color:var(--ink);line-height:1.2}
.sacola-vazia span{font-size:14px;color:var(--ink-soft);max-width:52ch;line-height:1.5}
.sacola-vazia .btn-comprar{width:auto;margin-top:12px;padding:0 32px;text-decoration:none}

@media (max-width:600px){
  /* Empilha, mas NÃO centraliza: a coluna do texto continua começando na
     mesma linha vertical do ícone. */
  .sacola-vazia{flex-direction:column;align-items:flex-start;gap:18px;padding:34px 22px}
  .sacola-vazia svg{width:64px;height:64px}
  .sacola-vazia b{font-size:19px}
  .sacola-vazia .btn-comprar{width:100%;justify-content:center}
}

/* ── faixa de cima ──────────────────────────────────────────────────────
   A classe é `.barra-topo`. Escrevi `.barra` e o seletor não casou com
   nada: o SVG sem `width` no HTML assumiu o tamanho padrão do navegador e
   os três ícones ocuparam a faixa inteira. Ícone SEM tamanho no atributo
   depende inteiramente do CSS acertar o seletor. */
.barra-topo em{font-style:normal}
.barra-topo span{display:inline-flex;align-items:center;gap:6px}
.barra-topo svg{width:17px;height:17px;flex:0 0 auto;opacity:.85}
@media (max-width:600px){ .barra-topo svg{width:15px;height:15px} }


/* ── logo por tema ──────────────────────────────────────────────────────────
   Dois arquivos em vez do `filter: invert()` que estava aqui: o filtro chuta as
   cores, e num logo com sombra e degradê o resultado nunca é exatamente a
   marca. As duas imagens ficam no HTML e o CSS escolhe, `<picture>` com
   `prefers-color-scheme` só enxergaria o SISTEMA, e o botão de tema deixaria o
   logo para trás, que é o elemento que mais denuncia um tema pela metade. */
/* O `img` em TODOS eles nao e enfeite: `.marca img.logo{display:block}` tem um
   seletor de tipo a mais e ganhava de `.marca .logo-escuro{display:none}`. Os
   dois arquivos apareciam lado a lado no claro, e a duplicata sumia sozinha no
   escuro, que e o jeito mais confuso possivel de um bug aparecer. */
.marca img.logo-escuro{display:none}
@media (prefers-color-scheme: dark){
  :root:not([data-tema="claro"]) .marca img.logo-claro{display:none}
  :root:not([data-tema="claro"]) .marca img.logo-escuro{display:block}
}
:root[data-tema="escuro"] .marca img.logo-claro{display:none}
:root[data-tema="escuro"] .marca img.logo-escuro{display:block}
:root[data-tema="claro"] .marca img.logo-claro{display:block}
:root[data-tema="claro"] .marca img.logo-escuro{display:none}
/* ── quantidade digitada no modo de uma cor ─────────────────────────────────
   A lista de faixas continua sendo a resposta certa para quase todo mundo: ela
   mostra o preço por peça e quanto cada degrau economiza, coisa que um campo
   vazio não mostra. Mas quem quer 7 peças não tinha como pedir 7. */
.qtd-livre{margin-top:10px;display:flex;align-items:center;gap:11px;flex-wrap:wrap}
.qtd-livre .stepper{border-color:var(--acao)}
.qtd-livre em{font-style:normal;font-size:12.5px;color:var(--ink-fraco)}
/* ── "quem comprou também levou" ────────────────────────────────────────────
   Cartão menor que o do catálogo de propósito: aqui ele é acréscimo, e do
   tamanho do card da vitrine ele roubaria a cena de quem já estava pagando.
   O título vem do servidor porque MUDA com a origem do dado: só é "quem comprou
   também levou" quando existe co-ocorrência real nos pedidos. */
.tambem{margin-top:22px;padding-top:20px;border-top:1px solid var(--edge)}
.tambem h3{font-family:Sora,Inter,sans-serif;font-size:16px;font-weight:800;margin-bottom:14px}
/* ⚠️ Era `display:grid` com quatro colunas, e quem não gostasse de nenhuma
   das quatro não tinha para onde ir. Agora ela É um trilho, e o `.trilho-itens`
   já resolve a rolagem e a largura de cada cartão; o que sobra aqui é só o
   espaçamento próprio. A regra de grade PRECISOU sair: ela vinha depois do
   `.trilho-itens{display:flex}` e ganhava dele por vir por último, e o
   resultado seria uma grade de doze colunas espremidas. */
.tambem-grade{gap:12px}
.tambem-card{background:var(--surface);border:1px solid var(--edge);border-radius:var(--r);
  padding:10px;display:flex;flex-direction:column;gap:7px;min-width:0}
.tambem-fig{position:relative;display:block;border-radius:var(--r);overflow:hidden;aspect-ratio:1}
.tambem-fig img{width:100%;height:100%;object-fit:contain;display:block}
.tambem-off{position:absolute;left:6px;top:6px;background:var(--ok);color:#fff;
  font-size:10px;font-weight:800;padding:2px 6px;border-radius:var(--r)}
/* Duas linhas e corta. Nome de produto de três linhas empurra o preço para
   fora do alinhamento e os quatro cartões perdem a mesma base. */
.tambem-nome{font-size:12.5px;line-height:1.3;color:var(--ink);display:-webkit-box;
  -webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;min-height:32px}
.tambem-cores-n{font-size:11px;color:var(--ink-fraco)}
.tambem-preco i{font-style:normal;font-family:Inter,system-ui,sans-serif;
  font-size:10.5px;font-weight:600;color:var(--ink-fraco)}
/* O preço vai junto para o pé: ele e o botão são o par que o olho lê de uma vez
   (quanto custa, e o que fazer), e com o preço solto no meio a distância até o
   botão mudava de cartão para cartão. O `+ .tambem-add{margin-top:0}` evita que
   os dois `auto` briguem e abram um vão entre eles. */
.tambem-preco{margin-top:auto;font-family:"JetBrains Mono",monospace;font-size:15px;
  font-weight:900;color:var(--acao)}
.tambem-preco + .tambem-add{margin-top:0}
/* `margin-top:auto` cola o botão no PÉ do cartão. Os cartões da grade já têm a
   mesma altura (item de grid estica), mas o miolo varia: um selo aqui, um nome
   de duas linhas ali, e os botões ficavam em quatro alturas diferentes. Com ele
   empurrado para baixo, alinham sozinhos qualquer que seja o conteúdo acima. */
.tambem-add{margin-top:auto;border:1.5px solid var(--acao);color:var(--acao);background:transparent;
  border-radius:var(--r);padding:8px 0;font-size:12.5px;font-weight:700;text-align:center;
  min-height:38px;display:flex;align-items:center;justify-content:center}
.tambem-add:hover{background:var(--acao);color:#fff}

@media (max-width:600px){
  /* Dois por linha a 375px: com três, o cartão fica com 100px e o nome sai em
     duas linhas de duas palavras. O alvo do botão continua com 44px. */
  .tambem-grade{gap:10px}
  .tambem-add{min-height:44px}
  /* 22px de bolinha e 7px de vão: 18px com dedo erra a cor do lado, e
     errar a cor aqui é errar o que vai chegar na caixa. */
  .item-cor{width:26px;height:26px}
}
/* ── cor pendente na linha do carrinho ──────────────────────────────────────
   Item que entrou pela faixa de sugestão chega sem cor escolhida. Em vez de um
   aviso em cinza pedindo para voltar à página do produto, as bolinhas ficam ali
   mesmo: quem já está no carrinho resolve sem sair dele. */
.item-escolha{display:flex;flex-direction:column;gap:5px;margin-top:2px}
.item-escolha em{font-style:normal;font-size:11.5px;font-weight:700;color:var(--aviso-txt,#B45309)}
.item-cores{display:flex;flex-wrap:wrap;gap:6px}
.item-cor{width:22px;height:22px;border-radius:50%;background:var(--c);
  border:1px solid rgb(0 0 0 / .2);flex:0 0 auto}
.item-cor:hover{box-shadow:0 0 0 2px var(--surface),0 0 0 4px var(--acao)}
/* O piscar ao tentar pagar com cor pendente. Sem ele o toast avisa e a pessoa
   não sabe QUAL linha reclamou, num carrinho de cinco itens. */
.item.pede-cor{border-color:#F59E0B;box-shadow:0 0 0 3px rgb(245 158 11 / .18)}
/* ── aviso de canto ─────────────────────────────────────────────────────────
   Estava com o estilo escrito no JS, em azul-marinho, uma cor que não existe
   em nenhum outro lugar da loja. Aqui ele usa os tokens, então acompanha o tema
   escuro sem uma segunda regra. */
#nz-avisos{position:fixed;right:16px;bottom:16px;z-index:9000;display:flex;
  flex-direction:column;gap:8px;max-width:min(360px,calc(100vw - 32px))}
.nz-aviso{background:var(--acao);color:#fff;padding:13px 18px;border-radius:var(--r);
  font-size:13.5px;font-weight:600;line-height:1.35;box-shadow:0 12px 28px rgb(0 0 0 / .24)}
.nz-aviso.bom{background:var(--ok)}
/* Azul claro com letra azul, o par que o botão secundário já usa. Serve para
   o aviso que só confirma o que a pessoa mandou fazer (remover um item): o
   azul cheio da ação chama atenção para uma coisa que ela já sabe. */
.nz-aviso.claro{background:var(--acao-fraca);color:var(--acao)}
/* Não existe tom âmbar aqui. Âmbar preenchendo um retângulo inteiro no canto da
   tela lê como ERRO, e o aviso que mais precisava dele ("escolha a cor antes de
   pagar") é justamente a confirmação de que o item ENTROU, a pessoa achava que
   a ação tinha falhado. O que falta escolher é marcado em âmbar na própria
   linha do carrinho, onde a cor aponta um campo e não uma falha. */
@media (max-width:600px){
  /* Acima da barra inferior, senão o aviso nasce debaixo dela. */
  #nz-avisos{right:12px;left:12px;bottom:calc(68px + env(safe-area-inset-bottom));max-width:none}
}

/* ── escolha de cor e tamanho na linha do carrinho ──────────────────────────
   Bolinha só resolve UMA dimensão. O dispenser tem 9 variações que são 3 cores
   x 3 tamanhos, e a fila de bolinhas mostrava branco, cinza e preto três vezes
   cada, sem dizer qual era qual: nove alvos para três cores. Com dois selects a
   pessoa responde as duas perguntas que existem, uma de cada vez. */
.item-sels{display:flex;gap:8px;flex-wrap:wrap}
/* 150px, e SEM crescer (`flex-grow: 0`). Com 258px cada um, os dois tomavam a
   coluna inteira e o nome do produto e o SKU ficavam prensados entre eles: o
   campo de escolha virava o assunto da linha, quando o assunto e o produto.
   Nome de cor e de tamanho e curto por natureza ("Pequeno", "Amarela"), e o
   painel aberto herda a mesma largura. */
.item-sels .sel{flex:0 1 150px;min-width:0;max-width:170px}
/* Menor que o select da página do produto: aqui ele mora dentro de uma linha de
   lista, e com 48px de altura empurrava a foto e o preço para fora do eixo. */
.item-sels .sel-btn{min-height:34px;padding:6px 9px;font-size:12px}
.item-sels .sel-cor{width:15px;height:15px}
.item-sels .sel-opt{min-height:38px;font-size:12px}
@media (max-width:600px){
  /* Um por linha e alvo de 44px: dois selects de 130px lado a lado a 375px
     deixam cada um com o texto cortado no meio da palavra. */
  /* Aqui os dois lado a lado, metade cada: com 44px de altura o alvo continua
     bom, e empilhados eles somavam 100px de altura numa linha de lista. */
  .item-sels .sel{flex:1 1 calc(50% - 4px);max-width:none}
  .item-sels .sel-btn{min-height:44px;font-size:12.5px}
}
/* ── selo "levado junto" ────────────────────────────────────────────────────
   A afirmação forte fica no CARD e não no título da faixa: a faixa é completada
   por categoria e por mais vendidos para nunca aparecer pela metade, e um título
   dizendo "quem comprou também levou" cobriria itens de que isso não é verdade.
   Aqui ele marca exatamente os que saíram da observação dos pedidos. */
.tambem-junto{align-self:flex-start;font-size:10px;font-weight:800;letter-spacing:.02em;
  text-transform:uppercase;color:var(--off-txt);background:var(--off-fundo);
  border-radius:var(--r);padding:2px 7px}
/* ── a linha do carrinho a 375px ────────────────────────────────────────────
   Em três colunas (foto 88, texto, stepper+total) sobravam 73px para o texto:
   caber ali o nome, o SKU e DOIS selects de cor e tamanho é impossível, e o
   select de 73px corta o nome da cor no meio. Então o bloco de quantidade e
   valor desce para uma linha própria, com um traço separando, e o texto passa a
   ter a largura toda. */
@media (max-width:600px){
  .item{grid-template-columns:68px 1fr;gap:12px;padding:12px}
  .item-fig{width:68px;height:68px}
  .item-fim{grid-column:1 / -1;flex-direction:row;align-items:center;
    justify-content:space-between;gap:12px;border-top:1px solid var(--edge);padding-top:11px}
  /* O "Remover" ficava embaixo do total, na ponta; em linha ele vai para o fim,
     depois do valor, que é a ordem em que se lê: quanto é, e então desistir. */
  .item-tira{order:3}
  .item-total{order:2}
}
/* ── rodapé ─────────────────────────────────────────────────────────────────
   Ele é a parte da página onde o comprador confere se a loja é real: quem é a
   empresa, como falar com ela, o que acontece se der errado. Antes eram três
   colunas de link e uma linha de despedida; agora carrega identificação,
   contato, políticas, redes e a faixa de garantias.

   Nada é decorativo: cada bloco responde uma pergunta que o comprador faz antes
   de pagar, e é por isso que ele pode ser o pedaço mais alto da página sem
   parecer entulho. */
.rodape-marca{min-width:0}
.rodape-marca > p{max-width:42ch}

/* As redes em quadrado com fundo, não em ícone solto: solto, um ícone de 20px
   sobre fundo claro tem alvo pequeno demais para dedo e desaparece do olho. */
.rodape-redes{display:flex;gap:9px;margin-top:16px}
.rodape-redes a{display:flex;align-items:center;justify-content:center;
  width:40px;height:40px;padding:0;border-radius:var(--r);
  background:var(--surface-2);color:var(--ink-soft);transition:background .14s,color .14s}
.rodape-redes a:hover{background:var(--acao);color:#fff}
.rodape-redes svg{width:19px;height:19px}

/* ⚠️ ERA UM `<span>`: o rodapé tinha o e-mail clicável ao lado de um telefone
   que não era, e no celular isso quer dizer decorar o número para digitar no
   aplicativo. Agora são dois links, e eles ganham ÍCONE porque é por ele que o
   olho acha o WhatsApp numa coluna de texto, não pela palavra.

   Alvo de 40px: eles ficam no pé da página, onde o polegar chega com a mão
   esticada, e 3px de padding davam uma linha de 19px. */
.rodape-fala{display:flex;align-items:flex-start;gap:7px;font-size:13px;
  color:var(--ink-soft);padding:7px 0;min-height:40px}
.rodape-fala svg{width:16px;height:16px;flex:0 0 16px;opacity:.75;margin-top:2px}
/* ⚠️ O NÚMERO NÃO QUEBRA NO MEIO. A coluna do rodapé tem 157px a 375px, e com
   o `overflow-wrap:anywhere` que o e-mail exige ali ao lado o telefone saía
   partido em "99852-" / "7614", que é um número que ninguém lê de volta. Quem
   quebra é o RÓTULO, que desce o número inteiro para a linha de baixo. */
.rodape-fala b{font-weight:inherit;white-space:nowrap}
.rodape-fala:hover{color:var(--acao)}
.rodape-fala:hover svg{opacity:1}

/* A faixa de garantias: quem chegou rolando até aqui ainda não passou pelo
   carrinho, então é a última chance de dizer que o pagamento é seguro e que a
   peça sai amanhã. */
.rodape-selos{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:14px;
  margin-top:28px;padding-top:22px;border-top:1px solid var(--edge)}
.rodape-selos span{display:flex;align-items:center;gap:9px;min-width:0;
  font-size:12.5px;font-weight:600;color:var(--ink-soft)}
.rodape-selos svg{width:19px;height:19px;flex:0 0 auto;color:var(--acao)}

/* Duas colunas no pé: identificação de um lado, obrigações de outro. Empilhadas
   viravam um parágrafo de letra pequena onde o CNPJ se perdia. */
/* ⚠️ Quem vira flex é a LINHA de dentro, não a faixa: a faixa precisa continuar
   sendo um bloco de largura cheia para o fundo ir de ponta a ponta, e o `.wrap`
   é que segura o conteúdo na coluna da página. */
.rodape-fim-linha{display:flex;justify-content:space-between;align-items:flex-end;gap:18px;
  flex-wrap:wrap;line-height:1.6}
.rodape-fim p{margin:0;font-size:11.5px}
.rodape-fim a{display:inline;font-size:11.5px;color:var(--ink-soft);
  text-decoration:underline;text-underline-offset:2px;padding:0}
.rodape-fim a:hover{color:var(--acao)}

/* ══ QUEM FEZ O SITE ════════════════════════════════════════════════════════
   Faixa própria no azul PROFUNDO da marca, abaixo da identificação. Foi pedida
   em destaque, e crédito em cinza no meio das outras linhas do rodapé é o que
   ninguém lê.

   ⚠️ Azul CHAPADO, nunca degradê: o degradê saiu desta loja em 24/08 porque
   ele chama atenção para o botão em vez de para o que ele faz, e some no
   celular barato, onde a tela lava as cores. E `--deep` em vez de `--primary`
   para a faixa não competir com o azul de AÇÃO dos botões da página: o pé do
   site não é um lugar de onde se compra. */
.rodape-dev{background:var(--deep);color:#fff;padding:20px 0}
/* ⚠️ TUDO NUMA LINHA, CENTRADO. A primeira versão punha o nome à esquerda e o
   convite à direita, e com a faixa de ponta a ponta isso deixava um vão de
   meia tela no meio: os dois pedaços liam como duas coisas sem relação, e não
   como um crédito e o convite dele.

   A segunda empilhou os dois, e ficou alto demais para o que a faixa diz: três
   linhas de pé de página para uma frase e um nome. Juntos e centrados eles são
   UMA frase, que é o que são.

   `wrap` para o celular, onde a linha não cabe: ali ela quebra sozinha em
   duas, sem precisar de media query. */
.rodape-dev-linha{display:flex;flex-direction:row;align-items:center;
  justify-content:center;flex-wrap:wrap;text-align:center;gap:6px 12px}
.rodape-dev-quem{margin:0;display:flex;align-items:baseline;justify-content:center;
  gap:7px;flex-wrap:wrap;font-size:12px;color:rgba(255,255,255,.65)}
.rodape-dev-quem span{font-size:10.5px;text-transform:uppercase;letter-spacing:.1em}
/* ⚠️ O NOME É O MAIOR ELEMENTO DA FAIXA, e mais nada: ele não precisa de peso
   de título para isso. Em 16px/700 ele competia com o nome das seções do
   rodapé logo acima, e o pé da página não é lugar de disputa. Em 14,5/500 ele
   continua sendo a única coisa grande aqui, sem gritar.

   Como link ou como texto ele tem o mesmo tamanho: o endereço é opcional e o
   nome não pode encolher por falta dele. */
/* ⚠️ INTER, E NÃO A SORA DOS TÍTULOS. A loja carrega a Sora só nos pesos
   600, 700 e 800: pedir 500 nela não encontra arquivo nenhum e o navegador
   sobe para o 600, então o "mais leve" simplesmente não acontecia. Acrescentar
   o 500 ao `<link>` seria baixar outro arquivo de fonte na primeira dobra de
   TODA página por causa de uma linha do rodapé; a Inter já vem com ele.

   E o crédito não é título: usar a fonte de título aqui é parte do motivo de
   ele pesar mais do que devia. */
.rodape-dev-quem a,.rodape-dev-quem b{font-family:Inter,sans-serif;
  font-size:var(--dev-tam,14.5px);font-weight:var(--dev-peso,500);
  letter-spacing:.01em;color:#fff;padding:0;display:inline}
.rodape-dev-quem a{text-decoration:underline;text-decoration-color:rgba(255,255,255,.4);
  text-underline-offset:4px}
.rodape-dev-quem a:hover{text-decoration-color:#fff}
/* O CONVITE é botão de contorno, não preenchido: preenchido de branco sobre o
   azul ele viraria o único botão forte do pé da página, concorrendo com o
   carrinho da barra de baixo no celular. E `inline-flex` mesmo centrado: ele
   mede o próprio texto, e esticado na largura toda viraria botão de compra. */
.rodape-dev-cta{display:inline-flex;align-items:center;gap:8px;font-size:12.5px;
  font-weight:500;color:rgba(255,255,255,.88);
  border:1px solid rgba(255,255,255,.32);
  border-radius:var(--r);padding:8px 14px;min-height:38px;transition:.14s}
.rodape-dev-cta svg{width:15px;height:15px;flex:0 0 15px;opacity:.8}
.rodape-dev-cta:hover{background:rgba(255,255,255,.1);border-color:rgba(255,255,255,.6);
  color:#fff}
.rodape-dev-cta:hover svg{opacity:1}
.rodape-dev-frase{margin:0;font-size:12.5px;color:rgba(255,255,255,.72)}
/* ⚠️ O PONTO SEPARA O CRÉDITO DO CONVITE, e só existe quando a frase é TEXTO:
   com endereço preenchido ela vira um botão de contorno, que já tem borda e
   não precisa de separador nenhum. Ele mora no `::before` da frase justamente
   por isso, em vez de num `<span>` no HTML que teria de ser escondido no outro
   caso. */
.rodape-dev-frase::before{content:'·';margin-right:12px;opacity:.4}
@media (max-width:620px){
  /* Quebrada em duas linhas, o ponto ficaria pendurado no começo da segunda,
     apontando para nada. */
  .rodape-dev-frase::before{display:none}
}

/* O "ver todas" não é mais um item da lista: ele é a saída dela, e por isso
   ganha peso e a cor de ação. Igual aos outros, ele sumiria no meio dos seis. */
.rodape-todas{margin-top:8px;font-weight:600;color:var(--acao) !important}
.rodape-todas:hover{text-decoration:underline}

@media (max-width:900px){
  .rodape-cols{grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:22px}
  .rodape-marca{grid-column:1 / -1}
}
@media (max-width:600px){
  /* Os selos em duas colunas, mesma decisão da faixa de confiança do topo:
     empilhados viram uma lista de texto cinza que a pessoa rola direto. */
  .rodape-selos{grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:12px}
  .rodape-fim{flex-direction:column;align-items:flex-start;gap:12px}
  /* Alvo de 44px no celular. */
  .rodape-redes a{width:44px;height:44px}
}

/* ── páginas de política: um DOCUMENTO ──────────────────────────────────────
   Antes o texto ficava direto sobre o fundo cinza da loja, e o cinza-azulado do
   corpo em cima dele deixava a leitura pastosa, parecia rascunho, não política.
   Agora é um documento: folha branca com sombra, sumário fixo ao lado e a mesma
   coluna de leitura de um texto impresso.

   A coluna continua estreita (68 caracteres) de propósito: texto legal em linha
   de 1200px é impossível de acompanhar, e a pessoa perde a linha a cada retorno.
   O que mudou é que agora existe uma FOLHA em volta dela, então a coluna estreita
   lê como decisão de tipografia e não como conteúdo que não preencheu a tela. */
.doc-grade{display:grid;grid-template-columns:214px minmax(0,1fr);gap:28px;align-items:start}

/* O sumário fixo é o que dá cara de documento longo navegável em vez de página
   que só rola. Ele sai da consulta do próprio texto (`ligarSumario` no JS), então
   nunca fica desatualizado em relação às seções. */
.doc-sumario{position:sticky;top:88px;display:flex;flex-direction:column;gap:2px;
  padding:18px;background:var(--surface);border:1px solid var(--edge);border-radius:var(--r)}
.doc-sumario b{font-size:11px;text-transform:uppercase;letter-spacing:.1em;
  color:var(--ink-fraco);margin-bottom:8px}
.doc-sumario a{font-size:12.5px;line-height:1.35;color:var(--ink-soft);
  padding:7px 9px;border-radius:var(--r);border-left:2px solid transparent}
.doc-sumario a:hover{background:var(--surface-2);color:var(--ink)}
.doc-sumario a.on{color:var(--acao);background:rgb(52 131 250 / .08);
  border-left-color:var(--acao);font-weight:700}

.texto-legal{max-width:none;background:var(--surface);border:1px solid var(--edge);
  border-radius:var(--r);box-shadow:0 2px 16px rgb(16 32 58 / .06);padding:38px 44px 42px}
/* A medida de leitura vive DENTRO da folha: é o miolo que tem 68 caracteres, não
   a folha, senão a folha ficaria estreita e sobraria fundo cinza dos dois lados. */
.texto-legal > *{max-width:68ch}
.texto-legal .doc-topo{max-width:none;display:flex;justify-content:space-between;
  align-items:baseline;gap:16px;flex-wrap:wrap;padding-bottom:20px;margin-bottom:26px;
  border-bottom:1px solid var(--edge)}
.texto-legal .doc-topo > div{min-width:0;display:flex;flex-direction:column;gap:5px}
.texto-legal .doc-topo h1{font-family:Sora,Inter,sans-serif;font-size:25px;font-weight:800;
  letter-spacing:-.01em;color:var(--ink);margin:0}
.texto-legal .doc-topo .chapeu{margin:0}
.texto-legal .doc-data{font-size:11.5px;color:var(--ink-fraco);white-space:nowrap}

/* Sobre a folha branca o destaque não precisa de fundo próprio: bastam a barra
   azul e o corpo maior. Com fundo, ele virava um cartão dentro de um cartão. */
.texto-legal .legal-intro{font-size:15.5px;line-height:1.6;color:var(--ink);
  background:transparent;border:0;border-left:3px solid var(--acao);
  border-radius:0;padding:2px 0 2px 16px;margin:0 0 28px}
/* `scroll-margin-top` para o link do sumário não parar com o título embaixo do
   topo grudento: sem ele, clicar numa seção mostra o parágrafo dela e esconde
   o nome, e a pessoa acha que clicou errado. */
.texto-legal h3{font-family:Sora,Inter,sans-serif;font-size:16.5px;font-weight:800;
  color:var(--ink);margin:32px 0 11px;scroll-margin-top:96px}
.texto-legal h3:first-of-type{margin-top:0}
.texto-legal p{font-size:14px;line-height:1.65;color:var(--ink-soft);margin:0 0 12px}
.texto-legal b{color:var(--ink);font-weight:700}
.texto-legal a{color:var(--acao);text-decoration:underline;text-underline-offset:2px}
.texto-legal ul,.texto-legal ol{margin:0 0 14px;padding-left:20px}
.texto-legal li{font-size:14px;line-height:1.65;color:var(--ink-soft);margin-bottom:7px}

/* Os dois casos (desistiu x defeito) lado a lado: o que a pessoa faz é diferente
   em cada um, e em texto corrido ela lê o primeiro e aplica no segundo. */
/* Dentro da folha branca os dois casos precisam do fundo mais escuro, não do
   mesmo branco: cartão branco sobre folha branca só tem a borda para se
   distinguir, e aí ele não separa nada. */
.legal-cards{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:16px;
  margin:24px 0 8px;max-width:none}
.legal-cards > div{background:var(--surface-2);border:1px solid var(--edge);
  border-radius:var(--r);padding:20px;min-width:0}
.legal-cards h3{margin-top:0}
.legal-contato{background:var(--surface-2);border:1px solid var(--edge);
  border-radius:var(--r);padding:20px;margin-top:30px}
.legal-contato h3{margin-top:0}
@media (max-width:1000px){
  /* O sumário sai antes de a folha ficar estreita: 214px de coluna fixa numa
     tela de 900 comem um quarto da leitura. */
  .doc-grade{grid-template-columns:minmax(0,1fr)}
  .doc-sumario{display:none}
}
@media (max-width:700px){
  .legal-cards{grid-template-columns:minmax(0,1fr)}
  /* Menos respiro na folha: 44px de cada lado numa tela de 375 deixariam
     287px de texto. */
  .texto-legal{padding:24px 20px 28px;border-radius:var(--r)}
  .texto-legal .doc-topo h1{font-size:21px}
}
/* ── convite de instalar: cartão flutuante ─────────────────────────────────
   Ele deixou de existir como bloco no rodapé e passou a ser só este cartão. No
   desktop ele fica preso ao canto DIREITO, e não centralizado na largura toda:
   centralizado ele cobre o meio da tela, que é onde está o produto. */
@media (min-width:901px){
  .convite{left:auto;right:22px;bottom:22px;margin:0;max-width:400px}
}
@media (max-width:900px){
  /* Acima da barra inferior de atalhos, senão nasce por baixo dela. */
  .convite{bottom:calc(70px + env(safe-area-inset-bottom))}
}
/* ── CEP e frete no resumo ──────────────────────────────────────────────────
   O campo fica ACIMA da linha do frete porque a ordem na tela é a ordem da
   conta: perguntar embaixo de um valor já escrito faz o campo parecer opcional,
   e o frete é o número que mais faz gente abandonar carrinho por surpresa. */
.frete-box{border-top:1px solid var(--edge);border-bottom:1px solid var(--edge);
  padding:14px 0;margin:2px 0;display:flex;flex-direction:column;gap:8px}
.frete-linha{display:flex;gap:8px;align-items:stretch}
.frete-linha input{flex:1 1 auto;min-width:0;background:var(--surface-2);
  border:1.5px solid var(--edge);border-radius:var(--r);padding:11px 13px;
  font-family:"JetBrains Mono",monospace;font-size:13px;color:var(--ink)}
.frete-linha input:focus{outline:none;border-color:var(--acao)}
/* Secundário e não o azul cheio: o botão que decide a compra é "Ir para o
   pagamento", e dois botões cheios no mesmo cartão disputam o clique. */
.frete-linha button{flex:0 0 auto;background:var(--acao-fraca);color:var(--acao);
  border-radius:var(--r);padding:0 16px;font-size:12.5px;font-weight:700}
.frete-linha button:hover{background:var(--acao);color:#fff}
.frete-onde{margin:0;font-size:11.5px;line-height:1.45;color:var(--ink-fraco)}
.frete-onde b{color:var(--ink)}
/* Itálico e apagado: o valor ainda não existe, e escrevê-lo com o mesmo peso do
   subtotal afirmaria um número que ninguém calculou. */
.frete-pendente{font-style:normal;font-family:Inter,system-ui,sans-serif;
  font-size:11.5px;font-weight:600;color:var(--ink-fraco)}
/* ── as transportadoras que cotaram ──
   Bloco com borda e não linha de lista, a mesma regra do `.nz-opt` do painel:
   é uma escolha que muda o total, e escolha precisa de alvo. A marcada leva a
   borda e o véu do azul de AÇÃO, o mesmo azul do botão de pagar, porque é o par
   que o olho já aprendeu nesta loja. */
.frete-opcoes{display:flex;flex-direction:column;gap:6px}
.frete-op{display:grid;grid-template-columns:auto 1fr auto;gap:2px 10px;
  align-items:center;cursor:pointer;padding:10px 12px;border-radius:var(--r);
  border:1.5px solid var(--edge);background:var(--surface-2);min-height:52px}
.frete-op:hover{border-color:var(--acao)}
.frete-op.on{border-color:var(--acao);background:var(--acao-fraca)}
.frete-op input{width:16px;height:16px;accent-color:var(--acao);
  grid-row:1 / span 2;align-self:center;margin:0}
.frete-op-nome{font-size:12.5px;font-weight:700;color:var(--ink);min-width:0}
/* O prazo desce para a segunda linha em vez de disputar espaço com o nome:
   "Correios PAC" e "6 dias úteis" lado a lado espremem os dois num cartão
   estreito, e nenhum dos dois pode ser cortado. */
.frete-op-prazo{grid-column:2;font-size:11px;color:var(--ink-fraco)}
.frete-op-preco{grid-column:3;grid-row:1 / span 2;font-size:13.5px;
  font-weight:800;color:var(--ink);font-variant-numeric:tabular-nums}
.frete-op.on .frete-op-preco{color:var(--acao)}

/* A RETIRADA ganha uma terceira linha com o endereço, e o grid precisa saber
   disso: o rádio e o preço passam a ocupar as três linhas, senão eles ficam
   colados no topo enquanto o cartão cresce embaixo. */
.frete-op.frete-op-retirada input,
.frete-op.frete-op-retirada .frete-op-preco{grid-row:1 / span 3}
.frete-op-onde{grid-column:2;font-size:11px;line-height:1.4;color:var(--ink-fraco)}
/* O preço dela é sempre zero, e "grátis" em verde aqui seria a MESMA palavra
   que a loja usa para frete bancado por ela. Não é: aqui não houve entrega
   nenhuma, e o verde é a cor de "você paga menos" nesta loja inteira. */
.frete-op.frete-op-retirada .frete-op-preco{color:var(--ok);font-size:12.5px}
/* Âmbar e não vermelho: nada falhou, a loja trocou por outro serviço e está
   dizendo isso. Vermelho aqui faria parecer que a compra deu errado. */
.frete-trocou{margin:0 0 2px;font-size:11.5px;line-height:1.45;
  color:var(--aviso-txt)}
@media (max-width:600px){
  /* 44px de alvo: 41 e confortavel com mouse e nao com dedo, e este botao
     esta no caminho do pagamento. */
  .frete-linha input,.frete-linha button{min-height:44px}
  .frete-op{min-height:56px}
}

/* ── checkout ───────────────────────────────────────────────────────────────
   Esta folha NUNCA existiu: a tela foi escrita com as classes e o CSS ficou
   para trás, então os campos saíram do jeito que o navegador desenha, rótulo
   colado no campo, tudo numa linha, e a foto do produto no resumo em tamanho
   original. Classe sem regra é pior que classe nenhuma, porque a tela parece
   pronta no HTML. */
.checkout-grade{display:grid;grid-template-columns:minmax(0,1fr) 350px;gap:20px;align-items:start}
.checkout-form{display:flex;flex-direction:column;gap:16px;min-width:0}

.bloco-form{background:var(--surface);border:1px solid var(--edge);border-radius:var(--r);
  padding:20px;display:flex;flex-direction:column;gap:14px;min-width:0}
.bloco-form h3{font-family:Sora,Inter,sans-serif;font-size:15px;font-weight:800;color:var(--ink)}

/* Duas colunas, e o campo largo ocupa as duas. Nome e e-mail em meia linha
   ficariam com o texto cortado; CEP e UF em linha inteira desperdiçariam metade
   da tela para três dígitos. */
.campos{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:14px}
.campo{display:flex;flex-direction:column;gap:6px;min-width:0}
.campo.grande{grid-column:1 / -1}
.campo.curto{max-width:110px}
.campo > span{font-size:11.5px;font-weight:700;color:var(--ink-soft)}
.campo input{width:100%;background:var(--surface-2);border:1.5px solid var(--edge);
  border-radius:var(--r);padding:12px 13px;font-size:13.5px;color:var(--ink);min-height:46px}
.campo input:focus{outline:none;border-color:var(--acao);
  box-shadow:0 0 0 3px rgb(52 131 250 / .14)}
.campo input::placeholder{color:var(--ink-fraco);font-size:12.5px}
.campo-nota{margin:0;font-size:11.5px;color:var(--ink-fraco);min-height:16px}
.erro-form{margin:0;background:#FDECEC;border:1px solid #F5C2C2;color:#8C1D1D;
  border-radius:var(--r);padding:12px 14px;font-size:12.5px;font-weight:600}

/* O resumo do checkout é o MESMO cartão do carrinho, com os itens em miniatura:
   quem chegou aqui já decidiu, e o papel dele é confirmar o que está sendo pago,
   não vender de novo. */
.checkout-itens{display:flex;flex-direction:column;gap:10px;padding-bottom:12px;
  margin-bottom:2px;border-bottom:1px solid var(--edge)}
.c-item{display:flex;align-items:center;gap:10px;min-width:0}
.c-item img{width:44px;height:44px;flex:0 0 auto;border-radius:var(--r);
  object-fit:cover;background:var(--surface-2)}
.c-item > span{display:flex;flex-direction:column;gap:1px;min-width:0}
.c-item b{font-size:12.5px;font-weight:600;color:var(--ink);
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.c-item em{font-style:normal;font-size:11px;color:var(--ink-fraco)}

/* Botao secundario e nao um link cinza. Voltar ao carrinho e uma acao que a
   pessoa PROCURA (esqueci uma peca, quero mudar a quantidade), e um texto
   apagado embaixo do total nao parece clicavel: ela volta pelo botao do
   navegador, que faz o formulario perder o que foi digitado. */
.voltar-carrinho{display:flex;align-items:center;justify-content:center;
  min-height:42px;margin-top:6px;background:var(--acao-fraca);color:var(--acao);
  border-radius:var(--r);font-size:12.5px;font-weight:700}
.voltar-carrinho:hover{background:var(--acao);color:#fff}
@media (max-width:600px){ .voltar-carrinho{min-height:46px} }

@media (max-width:900px){
  .checkout-grade{grid-template-columns:minmax(0,1fr)}
  /* O resumo vem ANTES do formulário no celular: confirmar o que se está
     pagando é o que faz a pessoa preencher os campos, não o contrário. */
  .checkout-grade .resumo-pedido{order:-1}
}
@media (max-width:600px){
  .campos{grid-template-columns:minmax(0,1fr)}
  .campo.curto{max-width:none}
  .campo input{min-height:48px}
}
/* Rótulo de campo que não é obrigatório. Sem essa marca, quem não tem
   complemento fica procurando o que escrever, e quem tem apartamento não sabe
   que é ali que ele vai. */
.campo-opc{font-style:normal;font-weight:500;color:var(--ink-fraco);font-size:11px}
.campo-nota.ruim{color:#B32020;font-weight:600}
/* A nota do CEP ocupa a linha inteira da grade, logo abaixo do campo dele: no
   meio da grade de duas colunas ela empurrava a rua para o lado. */
.campos > .campo-nota{margin:-6px 0 0}
.campos > .campo-nota:empty{display:none}
/* ── pagamento na própria página ────────────────────────────────────────────
   O componente do Mercado Pago desenha os campos dele dentro de `#brick`. Não
   tentamos estilizar o que está lá: é iframe deles, e é justamente isso que
   mantém o número do cartão fora deste servidor. */
.pagar-bloco{scroll-margin-top:96px}
#brick{min-height:60px}

.pix-caixa{display:flex;gap:18px;align-items:flex-start;flex-wrap:wrap}
.pix-caixa img{width:200px;height:200px;flex:0 0 auto;border:1px solid var(--edge);
  border-radius:var(--r);background:#fff;padding:8px}
.pix-lado{flex:1 1 260px;min-width:0;display:flex;flex-direction:column;gap:10px}
.pix-lado p{margin:0;font-size:13px;line-height:1.5;color:var(--ink-soft)}
/* Fonte de código e texto pequeno: o código do Pix tem centenas de caracteres, e
   ninguém o lê. Ele existe para ser copiado, e o botão é que importa. */
#pix-codigo{width:100%;background:var(--surface-2);border:1.5px solid var(--edge);
  border-radius:var(--r);padding:10px 12px;font-family:"JetBrains Mono",monospace;
  font-size:10.5px;color:var(--ink-fraco);resize:none;word-break:break-all}
@media (max-width:600px){
  .pix-caixa{justify-content:center}
  .pix-caixa img{width:180px;height:180px}
}
/* ── trilha de etapas do checkout ───────────────────────────────────────────
   Onze campos e o botão de pagar abaixo da dobra faziam a tela parecer sem fim,
   e formulário sem fim visível é o que faz desistir antes de começar. Duas
   etapas, e a trilha diz onde a pessoa está. */
.trilha-etapas{display:flex;align-items:center;gap:10px;margin:0 0 18px;padding:0;list-style:none}
.trilha-etapas li{display:flex;align-items:center;gap:8px;font-size:12.5px;font-weight:600;
  color:var(--ink-fraco)}
.trilha-etapas li + li::before{content:"";width:26px;height:1px;background:var(--edge);margin-right:2px}
.trilha-etapas b{display:grid;place-items:center;width:24px;height:24px;border-radius:50%;
  background:var(--surface-2);border:1px solid var(--edge);
  font-family:"JetBrains Mono",monospace;font-size:11.5px;font-weight:800;color:var(--ink-fraco)}
.trilha-etapas li.on{color:var(--ink)}
.trilha-etapas li.on b{background:var(--acao);border-color:var(--acao);color:#fff}
/* A etapa concluída fica verde e com um check: o número dela já não importa, e o
   verde é o mesmo que a loja usa em toda parte para "isto está resolvido". */
.trilha-etapas li.feito{color:var(--ok)}
.trilha-etapas li.feito b{background:var(--ok);border-color:var(--ok);color:#fff;font-size:0}
.trilha-etapas li.feito b::after{content:"✓";font-size:13px;font-weight:700}


/* A etapa que DEU ERRADO fica vermelha com um X, pelo mesmo motivo que a
   concluída fica verde com o check: o número dela já não importa, e uma
   etapa que falhou continuar azul (que aqui quer dizer "é esta agora") faz a
   pessoa procurar o que ainda tem de preencher. */
.trilha-etapas li.erro{color:#DC2626}
.trilha-etapas li.erro b{background:#DC2626;border-color:#DC2626;color:#fff;font-size:0}
.trilha-etapas li.erro b::after{content:"✕";font-size:12px;font-weight:700}

/* ── O FIM: o selo que se desenha ──────────────────────────────────────────
   Uma linha de texto dizendo "aprovado" é informação; o que a pessoa quer
   depois de digitar o cartão é a CONFIRMAÇÃO, e confirmação se sente. O
   círculo fecha e o check é riscado por cima, na ordem. Os dois de uma vez
   viram um ícone que apareceu, não algo que aconteceu. */
.fim-selo{display:block;width:76px;height:76px;margin:6px auto 14px;color:var(--ok)}
.fim-selo svg{width:100%;height:100%;fill:none;stroke:currentColor;
  stroke-width:3.4;stroke-linecap:round;stroke-linejoin:round}
.fim-selo circle{stroke-dasharray:166;stroke-dashoffset:166;
  animation:fim-circulo .5s cubic-bezier(.4,0,.2,1) forwards}
.fim-selo path{stroke-dasharray:48;stroke-dashoffset:48;
  animation:fim-risco .32s cubic-bezier(.4,0,.2,1) .42s forwards}
/* O véu verde nasce junto e some: ele dá o "flash" de sucesso sem deixar a
   caixa colorida depois, que brigaria com o botão. */
.fim-bom{animation:fim-brilho 1.1s ease-out}

@keyframes fim-circulo{to{stroke-dashoffset:0}}
@keyframes fim-risco{to{stroke-dashoffset:0}}
@keyframes fim-brilho{
  0%{background:rgb(var(--ok-rgb) / .14)}
  100%{background:var(--surface)}
}

.fim-bloco-txt{text-align:center}
.fim-bloco-txt h3{font-size:19px}

/* Quem pediu menos movimento recebe o selo pronto, sem desenho nenhum: a
   informação é a mesma, e ela não pode depender da animação. */
@media (prefers-reduced-motion:reduce){
  .fim-selo circle,.fim-selo path{animation:none;stroke-dashoffset:0}
  .fim-bom{animation:none}
}

/* Os dados preenchidos, em uma linha, com o "alterar" ao lado. */
.dados-resumo{display:flex;align-items:center;gap:14px;background:var(--surface);
  border:1px solid var(--edge);border-radius:var(--r);padding:14px 16px}
.dados-resumo > div{display:flex;flex-direction:column;gap:2px;min-width:0}
.dados-resumo b{font-size:13px;color:var(--ink)}
.dados-resumo span{font-size:11.5px;color:var(--ink-fraco);line-height:1.4}
.dados-resumo button{margin-left:auto;flex:0 0 auto;background:var(--acao-fraca);
  color:var(--acao);border-radius:var(--r);padding:9px 14px;font-size:12px;font-weight:700}
.dados-resumo button:hover{background:var(--acao);color:#fff}
@media (max-width:600px){
  .dados-resumo{flex-wrap:wrap}
  .dados-resumo button{margin-left:0;width:100%;min-height:44px}
}
/* Qual documento a máscara está lendo. Aparece só depois do primeiro dígito:
   antes disso não há o que informar, e um rótulo vazio piscando distrai. */
.doc-tipo{font-style:normal;font-weight:800;font-size:10px;letter-spacing:.06em;
  color:var(--acao);background:var(--acao-fraca);border-radius:var(--r);padding:1px 6px;
  margin-left:5px}
.doc-tipo:empty{display:none}

/* ── campo que falta ────────────────────────────────────────────────────────
   Duas cores, dois momentos. AZUL pisca ao abrir a etapa, quando a pessoa ainda
   não errou nada e só precisa saber onde continuar. VERMELHO só depois de ela
   tentar avançar: repreender antes da primeira tentativa é ensinar a ignorar a
   cor. */
.campo.erro input{border-color:#D33A3A;background:#FDF3F3}
.campo.erro input:focus{border-color:#D33A3A;box-shadow:0 0 0 3px rgb(211 58 58 / .16)}
.campo.erro > span{color:#B32020}
:root:not([data-tema="claro"]) .campo.erro input{background:#2A1616}
@media (prefers-color-scheme: dark){
  :root:not([data-tema="claro"]) .campo.erro input{background:#2A1616}
}
:root[data-tema="escuro"] .campo.erro input{background:#2A1616}

@keyframes nz-pisca{
  0%,100%{border-color:var(--edge);box-shadow:0 0 0 0 transparent}
  25%,75%{border-color:var(--acao);box-shadow:0 0 0 4px rgb(52 131 250 / .18)}
}
/* Duas voltas e para. Piscar sem fim vira enfeite e a pessoa deixa de ver. */
.campo.pisca input{animation:nz-pisca 1s ease-in-out 2}
@media (prefers-reduced-motion: reduce){
  .campo.pisca input{animation:none;border-color:var(--acao)}
}

/* ── entrar e minha conta ───────────────────────────────────────────────────
   A caixa de entrar é estreita e centralizada, que é a única vez em que centrar
   é certo nesta loja: a tela tem UM campo, e não há coluna nenhuma com que
   alinhar. */
/* ── entrar ─────────────────────────────────────────────────────────────────
   Duas colunas no desktop, e não um cartão sozinho no meio de uma página vazia.
   Numa loja onde dá para comprar SEM entrar, a tela de login precisa responder
   "por que eu entraria" ANTES de pedir o e-mail: embaixo do formulário os
   motivos ficam depois da pergunta, e quem chegou já rolou por eles sem ler. */
.entrar-tela{padding-top:34px}
/**
 * NADA de `max-width` com `margin: 0 auto` aqui.
 *
 * Era isso que quebrava o alinhamento: a grade centrada dentro do `.wrap`
 * começava em 143px enquanto o logo, a barra do topo e as colunas do rodapé
 * começam em 53. A página inteira segue a coluna do `.wrap`, e um bloco que se
 * centraliza por conta própria fica visivelmente para dentro de todo o resto,
 * sem que se saiba por quê.
 *
 * Quarta vez que uma largura própria desalinha um bloco neste projeto: quem
 * define a coluna é o `.wrap`, e mais ninguém.
 *
 * ── ALINHADAS PELA BASE, NÃO PELO TOPO ────────────────────────────────────
 * `align-items: end`. O cartão cresce quando a mensagem de "link enviado"
 * aparece, e crescendo para BAIXO ele empurrava o pé da página e desalinhava do
 * texto ao lado bem no momento em que a pessoa está lendo a confirmação. Preso
 * pela base, ele cresce para CIMA: o que estava lendo continua onde estava.
 */
.entrar-grade{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,430px);
  gap:44px;align-items:end}
.entrar-lado{min-width:0;display:flex;flex-direction:column;gap:14px}
.entrar-titulo{font-family:Sora,Inter,sans-serif;font-size:36px;font-weight:800;
  line-height:1.12;letter-spacing:-.02em;color:var(--ink);margin:0}
.entrar-sub{margin:0;font-size:14.5px;line-height:1.6;color:var(--ink-soft);max-width:42ch}
/* A saída fica à vista: tela de login sem porta de saída, numa loja que não
   exige conta, é a forma mais rápida de perder a venda que já estava no
   carrinho. */
/* Com ícone e alvo de toque: é uma saída, e saída precisa ser reconhecível de
   relance. A seta diz "seguir sem isto" melhor que a palavra sozinha. */
.entrar-pular{display:flex;align-items:center;justify-content:center;gap:7px;
  min-height:42px;margin-top:2px;padding-top:16px;border-top:1px solid var(--edge);
  font-size:12.5px;font-weight:600;color:var(--ink-fraco)}
.entrar-pular svg{width:16px;height:16px;flex:0 0 auto}
.entrar-pular:hover{color:var(--acao)}

/* O cartão INTEIRO é branco, título e saída inclusive, e não só o formulário
   dentro dele. Com o fundo da página aparecendo entre o título e o campo, a
   tela lia como três pedaços soltos em vez de uma caixa de entrada. */
.conta-caixa{max-width:none;margin:0;display:flex;flex-direction:column;gap:16px;
  background:var(--surface);border:1px solid var(--edge);border-radius:var(--r);
  padding:30px;box-shadow:0 4px 24px rgb(16 32 58 / .07)}
.conta-topo h2{font-family:Sora,Inter,sans-serif;font-size:19px;font-weight:800;
  color:var(--ink);margin:0 0 5px}
/* O formulário perde a moldura própria: cartão dentro de cartão é uma borda a
   mais dizendo a mesma coisa. */
.conta-caixa .conta-form{background:transparent;border:0;padding:0}

@media (max-width:900px){
  .entrar-grade{grid-template-columns:minmax(0,1fr);gap:26px;max-width:480px}
  .entrar-titulo{font-size:27px}
  /* No celular o formulário vem PRIMEIRO: quem abriu esta tela pelo botão de
     conta já decidiu entrar, e ler três motivos antes do campo é atraso. */
  .entrar-lado{order:2}
  .conta-caixa{order:1}
}
.conta-topo h1{font-family:Sora,Inter,sans-serif;font-size:26px;font-weight:800;
  letter-spacing:-.01em;color:var(--ink);margin:0 0 6px}
.conta-topo p{margin:0;font-size:13.5px;line-height:1.55;color:var(--ink-soft)}
.conta-form{background:var(--surface);border:1px solid var(--edge);border-radius:var(--r);
  padding:20px;display:flex;flex-direction:column;gap:12px}
.conta-nota{margin:0;font-size:12px;line-height:1.5;color:var(--ink-fraco)}
/* Na coluna, cada motivo é um bloco com respiro, não uma linha de lista: eles
   são o argumento da tela, e argumento espremido não convence ninguém. */
/* Cada motivo em cartão próprio: três linhas de texto sobre o fundo da página
   lêem como rodapé, e esta é a metade da tela que existe para convencer. */
.entrar-lado .conta-porque{margin-top:10px;display:flex;flex-direction:column;gap:10px}
.entrar-lado .conta-porque > div{display:flex;align-items:center;gap:13px;
  background:var(--surface);border:1px solid var(--edge);border-radius:var(--r);
  padding:14px 16px;min-width:0}
/* O ícone num quadrado com o azul da ação: solto, um traço de 21px sobre branco
   some, e é ele que dá o ritmo dos três blocos. */
/**
 * O `span` nos dois seletores NÃO é enfeite.
 *
 * Existe um `.conta-porque span{display:flex;flex-direction:column}` mais abaixo,
 * e ele tem um seletor de TIPO a mais que `.porque-i`: ganha por especificidade,
 * não por ordem. O quadrado do ícone virava flex-column, e numa coluna o
 * `align-items: center` centraliza na horizontal enquanto o `justify-content`
 * (não declarado, portanto `flex-start`) empurra o ícone para o TOPO. Medido: 1px
 * em cima e 18px embaixo.
 *
 * Mesma família do `.marca img.logo` que duplicava o logo. Quando uma regra
 * "não pega" e a ordem está certa, o suspeito é um seletor de tipo escondido.
 */
span.porque-i{width:38px;height:38px;flex:0 0 auto;display:grid;place-items:center;
  border-radius:var(--r);background:var(--acao-fraca);color:var(--acao)}
span.porque-i svg{width:20px;height:20px;margin:0}
.porque-txt{display:flex;flex-direction:column;gap:2px;min-width:0}
.entrar-lado .conta-porque b{font-size:13.5px;color:var(--ink)}
.entrar-lado .conta-porque em{font-style:normal;font-size:12px;color:var(--ink-fraco);line-height:1.4}
.conta-nota.bom{color:var(--ok)}
.conta-nota.ruim{color:#B32020;font-weight:600}
.conta-aviso{background:#FDF3F3;border:1px solid #F5C2C2;border-radius:var(--r);padding:14px 16px;
  display:flex;flex-direction:column;gap:3px}
.conta-aviso b{font-size:13px;color:#8C1D1D}
.conta-aviso span{font-size:12px;color:#8C1D1D;opacity:.85;line-height:1.45}
.conta-aviso.ruim{border-left:3px solid #D33A3A}

/* Por que ter conta, em três linhas: "entrar" numa loja onde dá para comprar
   sem entrar é um botão sem motivo. */
/* Este bloco é o DEPOIS na folha, e por isso ele é quem tem de ser específico:
   `.conta-porque span` (0,1,1) empatava com `span.porque-i` (0,1,1) e ganhava
   por vir por último, transformando o quadrado do ícone numa coluna flex, onde
   o ícone sobe para o topo. Agora ele mira o texto pelo nome, que é o que ele
   sempre quis dizer. */
.conta-porque{display:flex;flex-direction:column;gap:2px}
.conta-porque div{display:flex;align-items:flex-start;gap:11px;padding:11px 0}
.conta-porque div + div{border-top:1px solid var(--edge)}
.conta-porque > div > svg{width:19px;height:19px;flex:0 0 auto;color:var(--acao);margin-top:1px}
.conta-porque .porque-txt{display:flex;flex-direction:column;gap:1px;min-width:0}
.conta-porque b{font-size:12.5px;color:var(--ink)}
.conta-porque em{font-style:normal;font-size:11.5px;color:var(--ink-fraco)}

/* ── atalhos das seções da conta ──
   Existem porque os favoritos ficam DEPOIS dos pedidos: com 200 compras, chegar
   até eles seria rolar a página inteira. Abas na horizontal, como o Mercado
   Livre faz no menu da conta, e não uma lista lateral: aqui são quatro itens
   curtos, e uma coluna só para eles roubaria largura do conteúdo. */
/* A piscada da seção quando o atalho é clicado e ela JÁ está na tela: sem
   nenhuma resposta ao clique, a pessoa clica de novo achando que falhou.
   Um anel que aparece e some, sem mexer no tamanho: crescer empurraria o
   resto da coluna e a página daria um solavanco, que é justamente o que este
   conserto existe para tirar. */
@keyframes conta-piscada{
    0%{box-shadow:0 0 0 0 rgb(var(--acao-rgb) / 0)}
    25%{box-shadow:0 0 0 3px rgb(var(--acao-rgb) / .45)}
    100%{box-shadow:0 0 0 3px rgb(var(--acao-rgb) / 0)}
}
.sec-piscou{animation:conta-piscada .9s ease-out;border-radius:var(--r)}
@media (prefers-reduced-motion:reduce){.sec-piscou{animation:none}}

.conta-atalhos{display:flex;gap:6px;margin:0 0 16px;overflow-x:auto;
  /* `overflow-x:auto` obriga o eixo Y a virar `auto` também, e aí a barra
     vertical de 15px aparece no canto. Terceira vez neste projeto. */
  overflow-y:hidden;scrollbar-width:none;padding-bottom:2px}
.conta-atalhos::-webkit-scrollbar{display:none}
.conta-atalhos a{display:inline-flex;align-items:center;gap:7px;white-space:nowrap;
  padding:10px 14px;border-radius:var(--r);border:1.5px solid var(--edge);
  background:var(--surface);font-size:12.5px;font-weight:700;color:var(--ink-fraco)}
.conta-atalhos a svg{width:16px;height:16px;flex:0 0 auto}
.conta-atalhos a:hover{border-color:var(--acao);color:var(--acao)}
/* A seção em que a pessoa está usa o azul de AÇÃO, o mesmo par que a loja
   inteira usa para "aqui é onde se clica". */
.conta-atalhos a.on{border-color:var(--acao);background:var(--acao-fraca);color:var(--acao)}
/* A contagem ao lado do nome: sem ela, "Favoritos" não diz se há algo lá
   dentro, e a pessoa clica para descobrir que não há. */
.conta-atalhos em{font-style:normal;font-size:11px;font-weight:800;
  padding:1px 6px;border-radius:20px;background:var(--surface-2);color:var(--ink-fraco)}
/* `--surface` e não um branco com alfa: sobre o azul-claro do estado ligado,
   um véu branco funciona no tema claro e some no escuro. */
.conta-atalhos a.on em{background:var(--surface);color:var(--acao)}

/* O topo grudento cobriria o título da seção quando a âncora salta. */
.conta-bloco[id]{scroll-margin-top:84px}

/* ── páginas dos pedidos ──
   Números e não "carregar mais": a pessoa que procura um pedido de meses atrás
   precisa PULAR, e o botão de carregar mais obriga a passar por tudo que está
   no meio. */
.conta-paginas{display:flex;flex-wrap:wrap;gap:6px;align-items:center;
  margin-top:16px;padding-top:16px;border-top:1px solid var(--edge)}
.conta-paginas a,.conta-paginas b{display:inline-flex;align-items:center;
  justify-content:center;min-width:36px;height:36px;padding:0 10px;
  border-radius:var(--r);border:1.5px solid var(--edge);background:var(--surface);
  font-size:12.5px;font-weight:700;color:var(--ink-fraco);
  font-variant-numeric:tabular-nums}
.conta-paginas a:hover{border-color:var(--acao);color:var(--acao)}
.conta-paginas b{border-color:var(--acao);background:var(--acao-fraca);color:var(--acao)}
.conta-paginas .pag-seta svg{width:16px;height:16px}
.conta-paginas .pag-vao{color:var(--ink-fraco);font-size:12.5px;padding:0 2px}
.conta-conta{margin:10px 0 0;font-size:11.5px;color:var(--ink-fraco);
  font-variant-numeric:tabular-nums}

.conta-grade{display:grid;grid-template-columns:minmax(0,1fr) 320px;gap:20px;align-items:start}
.conta-col{display:flex;flex-direction:column;gap:16px;min-width:0}
.conta-lado{display:flex;flex-direction:column;gap:16px;min-width:0}
.conta-bloco{background:var(--surface);border:1px solid var(--edge);border-radius:var(--r);
  padding:20px;min-width:0}
.conta-bloco h3{font-family:Sora,Inter,sans-serif;font-size:15px;font-weight:800;
  color:var(--ink);margin:0 0 14px}
.conta-vazio{margin:0;font-size:13px;color:var(--ink-fraco);line-height:1.5}
.conta-vazio a{color:var(--acao);font-weight:700}
/* O botao de sair herdava o `.voltar-carrinho`, que e um botao de largura
   cheia do carrinho: aqui ele ficava um retangulo azul claro colado no canto,
   sem borda e sem altura propria. Agora tem os dois, e um icone, porque sair da
   conta e a acao que mais se procura por reconhecimento e nao por leitura. */
.conta-sair{max-width:none;width:auto;display:inline-flex;align-items:center;gap:7px;
  min-height:38px;margin:0;padding:0 15px;
  background:var(--surface);border:1px solid var(--edge);border-radius:var(--r);
  font-size:12.5px;font-weight:700;color:var(--ink-soft)}
.conta-sair:hover{border-color:#D33A3A;background:#FDECEC;color:#B32020}
.conta-sair svg{width:15px;height:15px;flex:0 0 auto}

/* Cada pedido é um CARTÃO com cabeçalho, e não uma linha de tabela. Empilhados
   sem moldura, número, data, situação, rastreio e valor viravam um amontoado no
   canto esquerdo e as peças ficavam soltas à direita: dava para ver que havia
   três pedidos, mas não onde um acabava e o outro começava. */
.conta-pedidos{display:flex;flex-direction:column;gap:14px}
.conta-pedido{border:1px solid var(--edge);border-radius:var(--r);overflow:hidden;min-width:0}

/* A DATA em primeiro, como no Mercado Livre: é por ela que a pessoa acha o
   pedido. O número vem ao lado, menor, para quando ela precisar citar. */
/* Sem faixa cinza no cabeçalho: uma divisória fina basta para separar, e a
   faixa fazia cada pedido parecer um bloco de sistema em vez de um recibo. */
.conta-pedido-topo{display:flex;align-items:center;gap:12px;flex-wrap:wrap;
  border-bottom:1px solid var(--edge);padding:13px 16px}
/* Sem `capitalize`: ele punha maiúscula em TODA palavra ("17 De Setembro De
   2025"), e em português mês e preposição são minúsculos. A data já vem
   escrita certa de `lojaDataLonga`. */
.pedido-data{font-size:13px;font-weight:700;color:var(--ink)}
.pedido-num{font-family:"JetBrains Mono",monospace;font-size:11.5px;color:var(--ink-fraco)}
.conta-valor{margin-left:auto;font-family:"JetBrains Mono",monospace;
  font-size:15px;font-weight:800;color:var(--ink)}

.pedido-corpo{padding:14px 16px;display:flex;flex-direction:column;gap:12px}
.pedido-situacao{display:flex;align-items:center;gap:10px;flex-wrap:wrap}
.conta-rastreio{font-family:"JetBrains Mono",monospace;font-size:11px;color:var(--ink-fraco);
  background:var(--surface-2);border-radius:var(--r);padding:3px 8px}

/* O selo do status usa cor só onde ela informa: verde no que chegou, âmbar no
   que espera, vermelho no que não vai chegar. */
.conta-status{font-size:11px;font-weight:800;text-transform:uppercase;letter-spacing:.04em;
  padding:3px 8px;border-radius:var(--r);background:var(--surface-2);color:var(--ink-fraco)}
.conta-status.s-paid,.conta-status.s-shipped{background:#E7F7EF;color:#0B7A3E}
.conta-status.s-delivered{background:var(--ok);color:#fff}
.conta-status.s-pending{background:#FFF6E5;color:#8A5A00}
.conta-status.s-canceled,.conta-status.s-returned{background:#FDECEC;color:#8C1D1D}

.conta-dados{margin:0;display:grid;grid-template-columns:auto minmax(0,1fr);gap:6px 14px}
.conta-dados dt{font-size:11.5px;color:var(--ink-fraco)}
.conta-dados dd{margin:0;font-size:12.5px;color:var(--ink);word-break:break-all}
.conta-dados dd.mono{font-family:"JetBrains Mono",monospace}

.conta-ends{display:flex;flex-direction:column;gap:10px}
/* Fundo BRANCO, como todo o resto da coluna. O preenchimento cinza fazia cada
   endereço parecer um bloco desabilitado dentro de um cartão branco, e com dois
   ou três deles a coluna virava uma escada de cinzas. Quem separa é a borda. */
.conta-end{background:var(--surface);border:1px solid var(--edge);border-radius:var(--r);
  padding:14px;display:flex;flex-direction:column;gap:2px}
/* O principal se distingue pela borda azul e pelo selo, não por um fundo
   diferente: fundo diferente lê como "este está em outro estado", e ele não
   está, ele só é o escolhido. */
.conta-end.padrao{border-color:var(--acao);box-shadow:0 0 0 1px var(--acao)}
.conta-end em{font-style:normal;font-size:10px;font-weight:800;text-transform:uppercase;
  letter-spacing:.06em;color:var(--acao)}
.conta-end b{font-size:12.5px;color:var(--ink)}
.conta-end span{font-size:11.5px;color:var(--ink-fraco)}
.conta-end .mono{font-family:"JetBrains Mono",monospace}

@media (max-width:900px){ .conta-grade{grid-template-columns:minmax(0,1fr)} }
@media (max-width:600px){
  .conta-sair{max-width:none}
  .conta-valor{margin-left:0}
  /* 44px de alvo no celular: os atalhos e os números da paginação são links
     pequenos, e 36px é confortável com mouse e não com dedo. */
  .conta-atalhos a{min-height:44px}
  .conta-paginas a,.conta-paginas b{min-width:44px;height:44px}
}

/* ── parcelamento ───────────────────────────────────────────────────────────
   A página mostra só a MELHOR parcela sem juros. A tabela inteira fica num
   painel que abre: doze linhas de parcelamento na dobra do preço competem com o
   botão de comprar, e quem quer conferir clica. */
.parcela{display:flex;align-items:center;gap:8px;flex-wrap:wrap}
.ver-parcelas{font-size:11.5px;font-weight:700;color:var(--acao);
  background:var(--acao-fraca);border-radius:var(--r);padding:3px 9px}
.ver-parcelas:hover{background:var(--acao);color:#fff}
@media (max-width:600px){
  /* 24px de alvo é confortável com mouse e não com dedo. */
  .ver-parcelas{min-height:34px;padding:0 12px;display:inline-flex;align-items:center}
}

/* Margem embaixo também: aberto, o painel encostava na linha do total. Espaço
   entre dois elementos é do primeiro, que é a mesma regra que consertou a
   sobreposição. */
.parcelas-painel{margin:10px 0 14px;background:var(--surface-2);border:1px solid var(--edge);
  border-radius:var(--r);padding:14px 16px}
.parcelas-topo{display:flex;align-items:center;justify-content:space-between;
  padding-bottom:9px;margin-bottom:6px;border-bottom:1px solid var(--edge)}
.parcelas-topo b{font-size:12.5px;color:var(--ink)}
.parcelas-topo button{width:28px;height:28px;font-size:19px;line-height:1;color:var(--ink-fraco)}
.parcela-linha{display:flex;align-items:center;justify-content:space-between;gap:12px;
  padding:6px 0;font-size:12.5px;color:var(--ink-soft)}
.parcela-linha + .parcela-linha{border-top:1px solid var(--edge)}
.parcela-linha b{font-family:"JetBrains Mono",monospace;color:var(--ink)}
.parcela-linha em{font-style:normal;font-size:11.5px;color:var(--ink-fraco)}
/* Verde no que não tem juros: é a informação que decide, e ela some se as doze
   linhas forem todas iguais. */
.parcela-linha.limpa em{color:var(--ok);font-weight:700}
.parcelas-nota{margin:9px 0 0;font-size:11px;color:var(--ink-fraco);line-height:1.4}

/* ── coração dos favoritos ──────────────────────────────────────────────────
   Fora do `<a>` do card: dentro dele, clicar para favoritar abriria o produto
   junto, e um botão que faz duas coisas é um botão em que ninguém confia. */
.card-envolve{position:relative;display:flex;min-width:0}
.card-envolve > .card{flex:1 1 auto;min-width:0}

.card-fav{position:absolute;top:8px;right:8px;z-index:3;
  width:34px;height:34px;border-radius:50%;display:grid;place-items:center;
  /* Fundo sólido com desfoque: sobre foto clara um coração branco some, e sobre
     foto escura um coração escuro some. O disco resolve os dois. */
  background:rgb(255 255 255 / .92);backdrop-filter:blur(4px);
  box-shadow:0 1px 4px rgb(16 32 58 / .18);
  color:var(--ink-fraco);transition:color .15s,transform .12s}
.card-fav svg{width:18px;height:18px;fill:none;stroke:currentColor;stroke-width:1.9}
.card-fav:hover{color:#E0245E;transform:scale(1.08)}
/* Marcado: o coração PREENCHE. Só mudar de cor a linha é fraco demais para
   dizer "isto já é seu", e a pessoa clica de novo achando que não pegou. */
.card-fav.on{color:#E0245E}
.card-fav.on svg{fill:#E0245E;stroke:#E0245E}
:root:not([data-tema="claro"]) .card-fav{background:rgb(17 28 47 / .92)}
@media (prefers-color-scheme: light){
  :root:not([data-tema="escuro"]) .card-fav{background:rgb(255 255 255 / .92)}
}
:root[data-tema="escuro"] .card-fav{background:rgb(17 28 47 / .92)}
@media (max-width:600px){
  /* 44px de alvo no toque, e o disco cresce junto para o ícone não boiar. */
  .card-fav{width:40px;height:40px;top:6px;right:6px}
  .card-fav svg{width:20px;height:20px}
}

/* ── escolha da forma de pagamento ──────────────────────────────────────────
   Ela vem ANTES do componente do Mercado Pago porque o desconto do Pix muda o
   VALOR, e o componente escolhe a forma depois de o valor estar fechado. */
.meios{display:flex;flex-direction:column;gap:10px}
.meio{display:flex;align-items:center;gap:13px;width:100%;text-align:left;
  background:var(--surface-2);border:1.5px solid var(--edge);border-radius:var(--r);
  padding:15px 16px;min-height:64px;transition:border-color .14s,background .14s}
.meio:hover{border-color:var(--acao)}
.meio.on{border-color:var(--acao);background:var(--acao-fraca)}
.meio svg{width:26px;height:26px;flex:0 0 auto;color:var(--acao)}
.meio > span{display:flex;flex-direction:column;gap:2px;min-width:0}
.meio b{font-size:13.5px;color:var(--ink)}
.meio em{font-style:normal;font-size:11.5px;color:var(--ink-fraco);line-height:1.35}
/* Verde no desconto: é a mesma cor que a loja usa em toda parte para dizer
   "aqui você paga menos". */
.meio em.bom{color:var(--ok);font-weight:700}
.meio-valor{margin-left:auto;flex:0 0 auto;font-style:normal;
  font-family:"JetBrains Mono",monospace;font-size:15px;font-weight:800;color:var(--ink)}

.pagar-topo{display:flex;align-items:center;justify-content:space-between;gap:12px}
#trocar-meio{font-size:12px;font-weight:700;color:var(--acao);
  background:var(--acao-fraca);border-radius:var(--r);padding:6px 12px}
#trocar-meio:hover{background:var(--acao);color:#fff}
@media (max-width:600px){
  .meio{padding:14px;gap:11px}
  .meio-valor{font-size:14px}
  #trocar-meio{min-height:38px}
}

/* ── as peças de cada pedido, na conta ──────────────────────────────────────
   Número, data e valor respondem "quanto" e "quando", que é a metade que o
   cliente não precisa: ele lembra do valor e esqueceu do número. O que ele abre
   a conta para ver é a peça. */
/* ── as peças, LIMPAS ───────────────────────────────────────────────────────
   Estavam em cartão cinza com borda, e num pedido de três itens isso virava três
   caixas cinza dentro de um cartão branco dentro de uma coluna branca: caixa
   demais para dizer "você comprou isto". Agora é uma linha por peça, como no
   Mercado Livre, e o que separa é espaço, não moldura. */
.conta-itens{display:flex;flex-direction:column;gap:0;margin:0}
.conta-item{display:flex;align-items:center;gap:12px;min-width:0;
  background:none;border:0;border-radius:0;padding:9px 0;max-width:none}
.conta-item + .conta-item{border-top:1px solid var(--edge)}
a.conta-item:hover .conta-item-txt b{color:var(--acao)}
.conta-item-fig{width:48px;height:48px;flex:0 0 auto;border-radius:var(--r);overflow:hidden;
  background:var(--surface-2);display:grid;place-items:center}
.conta-item-fig img{width:100%;height:100%;object-fit:cover}
.conta-item-txt{display:flex;flex-direction:column;gap:1px;min-width:0}
/* Duas linhas em vez de uma com reticências: "Dispenser de saco de lixo em
   rolo Preto" cortado em 293px vira "Dispenser de saco de…", e o cliente abriu
   a conta justamente para reconhecer a peça. */
.conta-item-txt b{font-size:12.5px;color:var(--ink);line-height:1.3;
  display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
.conta-item-txt em{font-style:normal;font-size:11px;color:var(--ink-fraco);
  font-family:"JetBrains Mono",monospace}


/* ── busca e filtro dos pedidos ─────────────────────────────────────────────
   Pelo ENDEREÇO e não por JavaScript: o filtro sobrevive a recarregar, dá para
   mandar o link ao suporte, e funciona sem script. */
/* Respiro entre o cabeçalho e o primeiro cartão. Sem ele o botão "Adicionar"
   encostava na borda do endereço principal e os dois liam como um bloco só. */
.conta-h3{display:flex;align-items:center;justify-content:space-between;gap:12px;
  flex-wrap:wrap;margin-bottom:14px}
.conta-bloco h3 em{font-style:normal;font-size:12px;font-weight:700;color:var(--ink-fraco);
  background:var(--surface-2);border-radius:99px;padding:2px 9px;margin-left:6px}

.conta-filtro{display:flex;gap:9px;align-items:stretch;flex-wrap:wrap;margin:12px 0 16px}
/* Campo branco com borda, não caixa cinza: sobre o cartão branco da seção, o
   preenchimento cinza fazia o campo parecer desabilitado. */
.conta-busca{flex:1 1 220px;min-width:0;display:flex;align-items:center;gap:9px;
  background:var(--surface);border:1.5px solid var(--edge);border-radius:var(--r);padding:0 13px}
.conta-busca:focus-within{border-color:var(--acao)}
.conta-busca svg{width:17px;height:17px;flex:0 0 auto;color:var(--ink-fraco)}
.conta-busca input{flex:1 1 auto;min-width:0;background:none;border:0;padding:11px 0;
  font-size:13px;color:var(--ink)}
.conta-busca input:focus{outline:none}
.conta-filtro .nz-sel,.conta-filtro select{flex:0 0 auto;min-width:160px}
.conta-filtro button[type=submit]{flex:0 0 auto;background:var(--acao-fraca);color:var(--acao);
  border-radius:var(--r);padding:0 18px;font-size:12.5px;font-weight:700}
.conta-filtro button[type=submit]:hover{background:var(--acao);color:#fff}
.conta-limpar{display:flex;align-items:center;padding:0 10px;font-size:12.5px;color:var(--ink-fraco)}
.conta-limpar:hover{color:var(--acao)}

/* ── endereços editáveis ──────────────────────────────────────────────────── */
/* Borda e altura de verdade. Sem elas o botão era só um texto azul sobre um
   véu claro, e a diferença entre "isto é clicável" e "isto é um rótulo" ficava
   por conta da cor: quem não distingue bem cor não vê botão nenhum. */
.conta-add{display:inline-flex;align-items:center;gap:7px;background:var(--acao-fraca);
  color:var(--acao);border:1px solid rgb(52 131 250 / .3);border-radius:var(--r);
  padding:0 14px;min-height:36px;font-size:12.5px;font-weight:700}
.conta-add:hover{background:var(--acao);border-color:var(--acao);color:#fff}
.conta-add svg{width:14px;height:14px}

/* "Ver detalhes" e "Sair da conta": mesma família, e o de sair precisa de mais
   respiro ainda porque fica colado no canto da página. */
.pedido-ver{flex:0 0 auto;background:none;border:1px solid var(--edge);border-radius:var(--r);
  padding:0 13px;min-height:34px;font-size:12px;font-weight:700;color:var(--ink-soft)}
.pedido-ver:hover{border-color:var(--acao);color:var(--acao)}
/* Sem pastilha: "CASA" em maiúscula pequena já é etiqueta o bastante, e o fundo
   cinza atrás dela era mais uma caixa dentro da caixa. */
.end-apelido{font-style:normal;display:block;font-size:10.5px;font-weight:800;
  letter-spacing:.06em;text-transform:uppercase;color:var(--ink-fraco);margin-bottom:4px}
/* As ações ficam NO cartão, não num menu escondido: são três, e um menu de três
   itens é um clique a mais para chegar em qualquer um deles. */
/* `flex-wrap: nowrap`: com wrap, o terceiro botão caía sozinho numa linha de
   baixo e a coluna ficava com cara de quebrada. Como agora dois deles são só
   ícone, os três cabem. */
.end-acoes{display:flex;align-items:center;gap:8px;flex-wrap:nowrap;
  margin-top:12px;padding-top:12px;border-top:1px solid var(--edge)}
/* Contorno, não pastilha preenchida. Três pastilhas coloridas embaixo de cada
   endereço faziam a coluna parecer um painel de alertas: o que a pessoa vai ler
   ali é o ENDEREÇO, e as ações precisam estar disponíveis sem gritar. */
.end-acoes button{display:inline-flex;align-items:center;justify-content:center;gap:6px;
  font-size:11.5px;font-weight:700;color:var(--ink-soft);
  background:none;border:1px solid var(--edge);border-radius:var(--r);
  padding:0 11px;min-height:34px;flex:0 0 auto}
.end-acoes svg{width:14px;height:14px;flex:0 0 auto}
/* Quadrado quando é só ícone: com o padding lateral do botão de texto, um ícone
   de 14px ficava perdido no meio de uma caixa larga. */
.end-acoes .so-icone{width:34px;padding:0}
/* O de remover fica na PONTA, separado dos outros dois: ele é o único
   irreversível, e vizinho de "editar" é onde o clique errado acontece. */
.end-acoes .ruim{margin-left:auto}
.end-acoes button:hover{border-color:var(--acao);color:var(--acao)}
.end-acoes button.ruim{color:var(--ink-fraco);background:none}
.end-acoes button.ruim:hover{border-color:#D33A3A;color:#B32020}

/* ── o endereço numa MODAL ──────────────────────────────────────────────────
   Embaixo da lista, o formulário empurrava tudo para baixo e a pessoa perdia de
   vista o endereço que estava corrigindo. Na modal ela vê só o que precisa
   preencher, e o fundo escurece o resto em vez de competir com ele. */
.end-modal{position:fixed;inset:0;z-index:9500;display:flex;align-items:center;
  justify-content:center;padding:20px;background:rgb(8 16 30 / .55)}
.end-modal[hidden]{display:none!important}
.end-form{background:var(--surface);border:1px solid var(--edge);border-radius:var(--r);
  padding:24px;display:flex;flex-direction:column;gap:14px;
  width:100%;max-width:520px;max-height:88vh;overflow-y:auto;
  box-shadow:0 20px 60px rgb(8 16 30 / .35)}
.end-form-topo{display:flex;align-items:center;justify-content:space-between;gap:12px;
  padding-bottom:14px;border-bottom:1px solid var(--edge)}
.end-form-topo h4{font-family:Sora,Inter,sans-serif;font-size:18px;font-weight:800;color:var(--ink)}
/* O X precisa parecer um BOTÃO. Solto, ele era um caractere cinza no canto, e o
   caminho de saída de uma modal é a primeira coisa que a pessoa procura quando
   abriu por engano. Círculo com fundo, alvo de 36px, e vermelho no hover. */
.end-fechar{display:grid;place-items:center;width:36px;height:36px;flex:0 0 auto;
  border-radius:50%;background:var(--surface-2);border:1px solid var(--edge);
  font-size:20px;line-height:1;color:var(--ink-soft);transition:.14s}
.end-fechar:hover{background:#FDECEC;border-color:#F0B4B4;color:#B32020}
.end-fechar:focus-visible{outline:2px solid var(--acao);outline-offset:2px}
.end-form-acoes{display:flex;gap:10px;align-items:center;flex-wrap:wrap}
.end-form-acoes .btn-comprar{flex:0 0 auto;width:auto;padding:0 22px;min-height:42px}
#end-cancelar{font-size:12.5px;font-weight:600;color:var(--ink-fraco);padding:8px 12px}
#end-cancelar:hover{color:var(--acao)}

@media (max-width:600px){
  .conta-filtro .nz-sel,.conta-filtro select{min-width:0;flex:1 1 100%}
  .conta-filtro button[type=submit]{flex:1 1 100%;min-height:44px}
  .end-acoes button{min-height:38px}
  .end-form-acoes .btn-comprar{width:100%}
}

/* ── modal do detalhe da compra ─────────────────────────────────────────────
   É consulta: a pessoa abre, confere e fecha. Empurrar isso para dentro do
   cartão faria a lista de doze pedidos virar uma página de rolagem infinita. */
.ped-caixa{background:var(--surface);border:1px solid var(--edge);border-radius:var(--r);
  padding:28px 32px;width:100%;max-width:720px;max-height:88vh;overflow-y:auto;
  display:flex;flex-direction:column;gap:16px;box-shadow:0 20px 60px rgb(8 16 30 / .35)}
.ped-carregando{margin:0;font-size:13px;color:var(--ink-fraco);text-align:center;padding:24px 0}
.ped-topo-info{display:flex;align-items:center;gap:10px;flex-wrap:wrap}
.ped-data{font-size:12.5px;color:var(--ink-fraco)}
.ped-nota{margin:0;font-size:12px;color:var(--ink-fraco);line-height:1.45}
.ped-nota.mono{font-family:"JetBrains Mono",monospace;font-size:11px}

.ped-bloco{display:flex;flex-direction:column;gap:2px;
  padding-top:16px;border-top:1px solid var(--edge)}
/* O primeiro bloco não repete a divisória do cabeçalho, que já está logo
   acima: duas linhas a 16px uma da outra lêem como erro de desenho. */
.ped-bloco:first-of-type{padding-top:0;border-top:0}
.ped-bloco h5{font-size:11px;font-weight:800;text-transform:uppercase;letter-spacing:.08em;
  color:var(--ink-fraco);margin-bottom:8px}

.ped-item{display:flex;align-items:center;gap:12px;padding:8px 0;min-width:0}
.ped-item + .ped-item{border-top:1px solid var(--edge)}
.ped-item-fig{width:48px;height:48px;flex:0 0 auto;border-radius:var(--r);overflow:hidden;
  background:var(--surface-2);display:grid;place-items:center}
.ped-item-fig img{width:100%;height:100%;object-fit:cover}
.ped-item-txt{display:flex;flex-direction:column;gap:2px;min-width:0;flex:1 1 auto}
.ped-item-txt a,.ped-item-txt b{font-size:13px;font-weight:600;color:var(--ink);line-height:1.3}
.ped-item-txt a:hover{color:var(--acao)}
.ped-item-txt em{font-style:normal;font-size:11.5px;color:var(--ink-fraco)}
.ped-item-total{flex:0 0 auto;font-family:"JetBrains Mono",monospace;font-size:13px;color:var(--ink)}

/* Cada linha de dinheiro só aparece quando existe: uma linha de "Desconto
   R$ 0,00" faz a pessoa procurar um desconto que não houve. */
.ped-l{display:flex;justify-content:space-between;gap:14px;padding:5px 0;font-size:13px;color:var(--ink-soft)}
.ped-l b{font-family:"JetBrains Mono",monospace;color:var(--ink)}
.ped-l.ok b{color:var(--ok)}
.ped-l.total{border-top:1px solid var(--edge);margin-top:6px;padding-top:11px;
  font-size:14px;font-weight:700;color:var(--ink)}
.ped-l.total b{font-size:17px;font-weight:800}

@media (max-width:600px){
  .ped-caixa{padding:18px;max-height:92vh}
  .ped-item-fig{width:44px;height:44px}
  .end-form-topo h4{font-size:16px}
}

/* ── a jornada do pedido ────────────────────────────────────────────────────
   Vertical e não horizontal: numa modal de 335px no celular, quatro etapas lado
   a lado dariam 80px cada, onde não cabe "Pagamento aprovado" nem a data. E
   vertical o texto fica alinhado à esquerda, que é como se lê. */
.jornada{display:flex;flex-direction:column;margin:2px 0 14px}
.jornada-p{display:flex;gap:12px;position:relative;padding:0 0 16px 0}
/* A linha que liga uma etapa à outra sai da BOLINHA, não do bloco: presa ao
   bloco ela apareceria abaixo do último ponto, apontando para o nada. */
.jornada-p:not(:last-child)::before{content:"";position:absolute;left:5px;top:14px;bottom:0;
  width:2px;background:var(--edge)}
.jornada-p.feito:not(:last-child)::before{background:var(--ok)}
.jornada-bolinha{width:12px;height:12px;flex:0 0 auto;margin-top:3px;border-radius:50%;
  background:var(--surface);border:2px solid var(--edge);z-index:1}
.jornada-p.feito .jornada-bolinha{background:var(--ok);border-color:var(--ok)}
.jornada-p.ruim .jornada-bolinha{background:#D33A3A;border-color:#D33A3A}
.jornada-txt{display:flex;flex-direction:column;gap:1px;min-width:0}
.jornada-txt b{font-size:12.5px;color:var(--ink-fraco);font-weight:600}
.jornada-p.feito .jornada-txt b{color:var(--ink);font-weight:700}
.jornada-p.ruim .jornada-txt b{color:#B32020}
.jornada-txt em{font-style:normal;font-size:11.5px;color:var(--ink-fraco)}

.palco-fig{position:relative}

/* ══ Visualizador 3D ══════════════════════════════════════════════════════
   O botão fica ABAIXO do bloco da foto e acima das miniaturas, que é onde a
   pessoa está olhando quando termina de ver a imagem e quer ver mais. */
.btn-3d{
    display:flex; align-items:center; justify-content:center; gap:8px;
    width:100%; margin-top:10px; padding:11px 14px;
    border:1px solid var(--edge); border-radius:8px;
    background:var(--surface); color:var(--ink);
    font:600 14px/1 inherit; cursor:pointer; transition:border-color .15s, background .15s;
}
.btn-3d:hover{ border-color:var(--acao); background:var(--acao-fraca); color:var(--acao); }
/* o tamanho do arquivo fica discreto mas VISÍVEL: quem está no 4G decide antes
   de clicar, e um botão que baixa megabytes sem avisar queima a confiança */
.btn-3d small{ margin-left:2px; font-size:11.5px; font-weight:500; opacity:.6; }
.btn-3d svg{ flex:0 0 auto; }

/* Ocupa o lugar exato da foto: assim a página não pula ao abrir, e o preço, a
   cor e o botão de comprar continuam à vista enquanto a peça gira. */
.visor{ position:absolute; inset:0; background:var(--surface); border-radius:inherit; overflow:hidden; }
.visor-tela{ position:absolute; inset:0; }
.visor-tela canvas{ display:block; width:100%; height:100%; touch-action:none; }
.visor-msg{
    position:absolute; left:0; right:0; bottom:12px; margin:0;
    text-align:center; font-size:12.5px; color:var(--ink-fraco); pointer-events:none;
}
.visor-fecha{
    position:absolute; top:10px; right:10px; width:34px; height:34px;
    display:flex; align-items:center; justify-content:center;
    border:1px solid var(--edge); border-radius:50%;
    background:var(--surface); color:var(--ink);
    font-size:20px; line-height:1; cursor:pointer;
}
/* A dica de arrastar some no primeiro toque: instrução que fica na tela para
   sempre vira sujeira em cima da peça. */
.visor-dica{
    position:absolute; top:10px; left:10px; padding:5px 9px;
    border-radius:7px; background:rgba(0,0,0,.55); color:#fff;
    font-size:11.5px; pointer-events:none; transition:opacity .3s;
}

/* No celular o X precisa de 44px: 34 é confortável com mouse e escorrega com
   o dedo, e aqui ele é o caminho de volta para a foto. */
@media (max-width: 700px){
    .visor-fecha{ width:44px; height:44px; font-size:24px; }
}

/* ══ Vídeo no palco ═══════════════════════════════════════════════════════
   Ocupa o lugar exato da foto, como o visualizador 3D: a página não pula e o
   preço, a cor e o botão de comprar continuam à vista. */
.palco-video{ position:absolute; inset:0; background:#000; border-radius:inherit; overflow:hidden; }
.palco-video video,
.palco-video iframe{ width:100%; height:100%; border:0; display:block; object-fit:contain; }

/* O ▶ da miniatura precisa de disco atrás: sobre um pôster claro um triângulo
   branco some, e a miniatura passa a parecer só mais uma foto. */
.mini-play{
    position:absolute; inset:0; margin:auto; width:26px; height:26px;
    display:flex; align-items:center; justify-content:center;
    border-radius:50%; background:rgba(0,0,0,.55); color:#fff;
    font-size:11px; line-height:1; z-index:2; pointer-events:none;
}

/* Subtítulo da coleção: uma linha dizendo POR QUE aquelas peças estão juntas.
   Sem ela, "Drop #358" é um código interno da origem na cara do cliente. */
.colecao-sub{ margin:-6px 0 12px; font-size:13px; color:var(--ink-fraco); }

/* ══ Sob consulta ═════════════════════════════════════════════════════════
   Peça sem peso não tem custo, e sem custo o preço sairia errado para baixo.
   "Sob consulta" ocupa o lugar do valor com o mesmo peso visual: some do olho
   se for discreto, e o cliente fica procurando um preço que não existe. */
.card-consulta{ font-size:17px; font-weight:800; color:var(--ink); letter-spacing:-.2px; }
.preco-consulta{ font-size:26px; font-weight:800; color:var(--ink); }
.consulta-nota{
    margin:8px 0 14px; font-size:13.5px; line-height:1.45; color:var(--ink-fraco);
    padding:11px 13px; border-radius:8px; background:var(--surface-2);
}
.consulta-nota b{ color:var(--ink); }

/* A linha do resumo quando o carrinho é só de orçamento.
   Fundo, borda e respiro: sem o cupom, o frete e o total em volta, ela ficava
   sozinha embaixo do título e parecia um rodapé de tabela que perdeu a tabela.
   Cinza e não colorido: ela não é aviso nem promessa, é o resumo do que a
   pessoa escolheu. */
.pedido-l.so-consulta{
    background:var(--surface-2); border:1px solid var(--edge);
    border-radius:var(--r); padding:12px 14px; margin:2px 0 4px;
}
.pedido-l.so-consulta #r-pecas{ font-weight:700; color:var(--ink); font-size:14px; }
.pedido-l.so-consulta #r-sub{ color:var(--ink-fraco); font-weight:600; }

/* "Sob consulta" no lugar do preço, no cartão da faixa de sugestões. Menor
   que o preço e sem o azul da ação: ele não é um número, é a informação de que
   ainda não há um. Do mesmo tamanho, competiria com os cartões que TÊM preço,
   que são os que fecham venda sozinhos. */
.tambem-preco.tambem-consulta{ font-size:14px; font-weight:700; color:var(--ink-fraco); }

/* O stepper do orçamento é o mesmo componente da compra, só que sozinho na
   linha: ali ele dividia espaço com a escada de quantidade e com o preço por
   unidade, e aqui não há preço nenhum ao lado. Um pouco mais alto porque é o
   único controle numérico da tela. */
.stepper-orc{ align-self:flex-start; }
.stepper-orc button{ width:40px; height:42px; font-size:19px; }
.stepper-orc input{ width:56px; font-size:15px; }
/* Na linha do carrinho ele fica menor: ali o assunto é a peça, e o valor vem
   no orçamento. */
.item-consulta{ font-size:12.5px; font-style:normal; font-weight:600; color:var(--ink-fraco); }
.orcamento-nota{ margin:8px 0 0; font-size:12.5px; line-height:1.45; color:var(--ink-fraco); }

.orcamento-form{ display:flex; flex-direction:column; gap:10px; margin-top:12px; }
.orcamento-form label{ display:flex; flex-direction:column; gap:5px; font-size:12.5px; font-weight:600; color:var(--ink); }
.orcamento-form label em{ font-weight:400; font-style:normal; color:var(--ink-fraco); }
.orcamento-form input,
.orcamento-form textarea{
    padding:10px 12px; border:1px solid var(--edge); border-radius:8px;
    background:var(--surface); color:var(--ink); font:400 14px/1.4 inherit; resize:vertical;
}
.orcamento-form input:focus,
.orcamento-form textarea:focus{ outline:2px solid var(--acao); outline-offset:-1px; }
.orcamento-erro{ margin:0; font-size:12.5px; color:#C0392B; }
/* A confirmação ocupa o lugar do formulário: deixar os campos ali depois de
   enviar convida a mandar o mesmo pedido duas vezes. */
.orcamento-ok{
    margin:0; padding:12px 14px; border-radius:8px; font-size:13.5px; line-height:1.45;
    background:rgba(30,138,60,.10); color:var(--ink);
}

/* ══ Botão do WhatsApp ════════════════════════════════════════════════════
   Verde do WhatsApp e o ícone dele: a pessoa reconhece para onde vai antes de
   ler a frase. É o único botão da loja que não usa o azul de ação, e a exceção
   se justifica porque ele não leva a um passo nosso, leva para fora. */
.btn-zap{
    display:flex; align-items:center; justify-content:center; gap:9px;
    width:100%; margin-top:10px; padding:13px 16px;
    border:0; border-radius:8px; background:#25D366; color:#fff;
    font:700 15px/1 inherit; cursor:pointer; transition:background .15s;
}
.btn-zap:hover{ background:#1EBE5B; }
.btn-zap svg{ width:21px; height:21px; flex:0 0 auto; }

/* Pulsa DISCRETO: uma sombra que respira, sem mexer no tamanho do botão.
   Botão que cresce e encolhe puxa o olho a cada dois segundos e vira
   propaganda; a sombra chama uma vez e some do caminho. */
@keyframes nzPulso{
    0%   { box-shadow:0 0 0 0 rgba(37,211,102,.45); }
    70%  { box-shadow:0 0 0 12px rgba(37,211,102,0); }
    100% { box-shadow:0 0 0 0 rgba(37,211,102,0); }
}
.pulsa{ animation:nzPulso 2.4s ease-out infinite; }
/* Quem pediu menos movimento não recebe movimento nenhum. */
@media (prefers-reduced-motion: reduce){ .pulsa{ animation:none; } }

/* O carrinho reagindo à chegada da peça. Ele CRESCE e volta, sem mudar de cor:
   a cor é do contador (que já muda de número), e piscar as duas coisas ao mesmo
   tempo faz o canto da tela parecer um alarme. */
.nz-chegou{animation:nz-chegou .4s ease}
@keyframes nz-chegou{
  0%{transform:scale(1)}
  38%{transform:scale(1.22)}
  100%{transform:scale(1)}
}
@media (prefers-reduced-motion:reduce){
  .nz-chegou{animation:none}
}

/* A onda que sai do carrinho quando a peça chega, como o Dock do macOS.
   Vive solta no `<body>` em `position:fixed` e não num `::after` do ícone: o
   topo tem overflow e ela seria cortada na borda da barra, virando meia-lua. */
.nz-onda{
  position:fixed;width:14px;height:14px;margin:-7px 0 0 -7px;border-radius:50%;
  border:2px solid var(--acao);pointer-events:none;z-index:9998;
  animation:nz-onda .6s ease-out forwards;
}
@keyframes nz-onda{
  0%{transform:scale(.4);opacity:.85}
  100%{transform:scale(4.2);opacity:0}
}
@media (prefers-reduced-motion:reduce){
  .nz-onda{display:none}
}

/* ── a modal do pedido de orçamento ─────────────────────────────────────── */
/* Ela para a página no momento em que a pessoa acabou de entregar o nome e o
   telefone e está esperando uma resposta. Antes, o formulário sumia e uma linha
   verde tomava o lugar dele na coluna da direita, com a página inteira igual:
   pouco demais para o que aquele clique significa. */
.orc-modal{
  position:fixed;inset:0;z-index:9990;display:grid;place-items:center;
  padding:20px;background:rgba(11,18,32,.55);backdrop-filter:blur(2px);
  animation:orc-fundo .22s ease
}
@keyframes orc-fundo{from{opacity:0}to{opacity:1}}

.orc-modal-caixa{
  width:100%;max-width:400px;background:var(--surface);border:1px solid var(--edge);
  border-radius:var(--r);padding:30px 26px 24px;text-align:center;
  box-shadow:0 24px 60px rgba(11,18,32,.28);
  animation:orc-sobe .3s cubic-bezier(.2,.9,.3,1)
}
/* Sobe 14px enquanto aparece: sem o deslocamento ela pisca no lugar, e piscar
   é o que faz a pessoa duvidar se algo aconteceu. */
@keyframes orc-sobe{from{opacity:0;transform:translateY(14px) scale(.97)}to{opacity:1;transform:none}}

.orc-passo h3{font-size:19px;font-weight:800;margin:16px 0 8px;line-height:1.25}
.orc-passo p{font-size:13.5px;line-height:1.55;color:var(--ink-fraco);margin:0}
.orc-passo b{color:var(--ink);font-family:"JetBrains Mono",ui-monospace,monospace}

/* O anel girando. `border-top` de outra cor é o truque mais leve que existe
   para isto, e não depende de SVG nem de imagem. */
.orc-anel{
  display:block;width:44px;height:44px;margin:0 auto;border-radius:50%;
  border:3px solid var(--edge);border-top-color:var(--acao);
  animation:orc-gira .8s linear infinite
}
@keyframes orc-gira{to{transform:rotate(360deg)}}

/* O check DESENHADO. O traço sendo riscado é o que faz o cérebro registrar
   "terminou": um ícone que aparece pronto é só um ícone. */
.orc-check svg,.orc-erro-icone svg{width:56px;height:56px;display:block;margin:0 auto}
.orc-check svg{stroke:var(--ok);fill:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round}
.orc-check circle{stroke-dasharray:151;stroke-dashoffset:151;animation:orc-risca .5s ease forwards}
.orc-check path{stroke-dasharray:40;stroke-dashoffset:40;animation:orc-risca .35s .42s ease forwards}
@keyframes orc-risca{to{stroke-dashoffset:0}}

.orc-erro-icone svg{stroke:#E11D48;fill:none;stroke-width:3;stroke-linecap:round}

.orc-email{
  margin-top:12px;padding:10px 12px;border-radius:8px;background:var(--surface-2);
  font-size:12.5px;color:var(--ink-fraco)
}
.orc-email b{font-family:inherit;font-weight:700}

.orc-acoes{display:flex;flex-direction:column;gap:9px;margin-top:20px}
.orc-acoes .btn-zap,.orc-acoes .btn-comprar{width:100%}
/* A segunda opção é contorno, não preenchida: duas cores cheias lado a lado
   fazem a pessoa parar para escolher, e aqui uma delas é claramente a
   principal. */
.btn-fraco{
  display:flex;align-items:center;justify-content:center;min-height:44px;
  border:1px solid var(--edge);border-radius:var(--r);
  font-size:13.5px;font-weight:600;color:var(--ink-fraco);background:transparent;
  text-decoration:none;transition:.15s
}
.btn-fraco:hover{border-color:var(--acao);color:var(--acao)}

@media (prefers-reduced-motion:reduce){
  .orc-modal,.orc-modal-caixa{animation:none}
  .orc-check circle,.orc-check path{animation:none;stroke-dashoffset:0}
  .orc-anel{animation-duration:1.6s}
}

/* ── os orçamentos dentro da conta ──────────────────────────────────────── */
/* Cartão com contorno e sem fundo cinza, como o do pedido: preenchimento faz
   cada bloco parecer desabilitado, e o que separa é o espaço. */
.conta-sub{margin:-4px 0 14px;font-size:12.5px;color:var(--ink-fraco)}

.orc-card{border:1px solid var(--edge);border-radius:var(--r);padding:14px 16px;margin-bottom:10px}
.orc-card-topo{display:flex;align-items:center;justify-content:space-between;gap:12px;
  padding-bottom:10px;border-bottom:1px solid var(--edge);margin-bottom:10px}
.orc-card-topo b{display:block;font-size:14px;font-weight:700}
/* A DATA vem primeiro e o número depois, menor: é pela data que a pessoa acha
   o pedido dela; o número serve para citar no atendimento, e só isso. */
.orc-num{font-size:11.5px;color:var(--ink-fraco);font-family:"JetBrains Mono",ui-monospace,monospace}

.orc-sit{font-size:11px;font-weight:800;text-transform:uppercase;letter-spacing:.4px;
  padding:4px 9px;border-radius:99px;border:1px solid var(--edge);color:var(--ink-fraco);white-space:nowrap}
.orc-sit.ok{color:var(--ok);border-color:color-mix(in srgb,var(--ok) 40%,transparent)}
/* Âmbar e não vermelho: esperar resposta é o estado NORMAL de um orçamento
   recém-pedido, e vermelho na conta do cliente diria que algo deu errado. */
.orc-sit.espera{color:#B45309;border-color:#FCD34D}

.orc-pecas{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:5px}
.orc-pecas li{font-size:13px;line-height:1.4;color:var(--ink-fraco)}
.orc-pecas b{color:var(--ink);font-weight:700;margin-right:2px}
/* A peça que o cliente tirou da proposta: apagada e riscada, nunca fora da
   lista. Ela explica o orçamento que ele pediu. */
.orc-pecas li.fora{opacity:.5;text-decoration:line-through}
.orc-nota{margin:11px 0 0;font-size:12px;color:var(--ink-fraco)}

/* ══ A proposta: /orcamento/<token> ══════════════════════════════════════════
   O orçamento que o cliente abre, lê e responde. Duas colunas no desktop, com
   a DECISÃO grudada à direita: é a única coisa que a página pede que ele faça,
   e ela não pode depender de rolar até o fim. No celular a decisão vai para o
   fim do fluxo, porque ali "o fim" é logo depois dos itens. */
.prop{padding:22px 0 40px}
.prop-cab{margin-bottom:18px}
.prop-cab h1{margin:6px 0 0;font-family:Sora,Inter,sans-serif;font-size:26px;font-weight:800;
  line-height:1.25;color:var(--ink)}
.prop-validade{margin:8px 0 0;font-size:13.5px;color:var(--ink-soft)}
.prop-validade b{color:var(--ink);font-weight:700}

/* O ESTADO vem antes de tudo: quem já respondeu, quem chegou tarde e quem virou
   pedido precisa saber na primeira linha, não depois de procurar um botão que
   não existe mais. */
.prop-aviso{border:1px solid var(--edge);border-radius:var(--r);background:var(--alto);
  padding:13px 15px;font-size:13.5px;line-height:1.5;color:var(--ink-soft);margin-bottom:18px}
.prop-aviso b{color:var(--ink)}
.prop-aviso.ok{background:var(--off-fundo);border-color:color-mix(in srgb,var(--ok) 35%,transparent)}
.prop-aviso.ok b{color:var(--off-txt)}
.prop-aviso.alerta{background:var(--aviso-fundo);border-color:var(--aviso-borda);color:var(--aviso-txt)}
.prop-aviso.alerta b{color:var(--aviso-txt)}

.prop-grade{display:grid;grid-template-columns:minmax(0,1fr) 300px;gap:20px;align-items:start}
.prop-col{display:flex;flex-direction:column;gap:16px;min-width:0}
.prop-bloco{background:var(--surface);border:1px solid var(--edge);border-radius:var(--r);padding:18px}
.prop-h2{margin:0 0 14px;font-family:Sora,Inter,sans-serif;font-size:15px;font-weight:700;color:var(--ink)}

/* Uma linha por peça, separada por traço fino: o cartão cinza dentro do cartão
   branco fazia cada item parecer um bloco de sistema em vez de um recibo. */
.prop-itens{display:flex;flex-direction:column}
.prop-item{display:flex;align-items:center;gap:13px;padding:12px 0;border-top:1px solid var(--linha-fraca)}
.prop-item:first-child{border-top:0;padding-top:0}
.prop-item-fig{width:62px;height:62px;flex:0 0 62px;border-radius:var(--r);overflow:hidden;
  background:var(--surface-2);display:flex;align-items:center;justify-content:center}
.prop-item-fig img{width:100%;height:100%;object-fit:contain}
.prop-item-vazio{width:26px;height:26px;color:var(--ink-fraco);opacity:.5}
.prop-item-vazio svg{width:100%;height:100%}
.prop-item-txt{flex:1;min-width:0}

/* ── ampliar: a lupa na foto do item e as imagens da proposta ──────────────
   A miniatura de 62px diz QUAL é a peça e não diz como ela ficou, que é o que
   alguém confere antes de gastar dinheiro. A lupa existe porque uma foto
   clicável sem nenhuma marca é uma foto que ninguém clica. */
.prop-amplia{position:relative;padding:0;border:0;cursor:zoom-in}
.prop-lupa{position:absolute;right:3px;bottom:3px;width:20px;height:20px;border-radius:99px;
  background:rgb(6 12 22 / .55);color:#fff;display:flex;align-items:center;justify-content:center;
  opacity:0;transition:.15s}
.prop-lupa svg{width:12px;height:12px}
.prop-amplia:hover .prop-lupa,.prop-anexo:hover .prop-lupa{opacity:1}
/* No celular não existe hover, e uma marca que só aparece com o mouse não
   avisa ninguém: lá ela fica sempre à vista. */
@media (hover:none){.prop-lupa{opacity:.9}}

.prop-anexos-sub{margin:0 0 12px}
.prop-anexos{display:grid;grid-template-columns:repeat(auto-fill,minmax(132px,1fr));gap:12px}
.prop-anexo{display:flex;flex-direction:column;gap:6px;padding:0;border:0;background:none;
  text-align:left;cursor:zoom-in;font:inherit}
.prop-anexo-fig{position:relative;display:block;aspect-ratio:1;border-radius:var(--r);
  overflow:hidden;background:var(--surface-2);border:1px solid var(--edge);transition:.15s}
.prop-anexo:hover .prop-anexo-fig{border-color:rgb(var(--acao-rgb) / .5)}
/* `contain` e nunca `cover`: o mockup tem arte até a borda, e cortar para
   preencher tira justamente o que se está mandando conferir. */
.prop-anexo-fig img{width:100%;height:100%;object-fit:contain}
.prop-anexo-leg{font-size:12px;line-height:1.35;color:var(--ink-soft)}
/* O cartão de PDF: mesma caixa da imagem, com o selo no lugar da foto.
   Gerar miniatura da primeira página exigiria uma biblioteca inteira só para
   desenhar o que a pessoa abre num clique. */
.prop-anexo-doc{cursor:pointer;text-decoration:none}
.prop-anexo-doc .prop-anexo-fig{display:flex;align-items:center;justify-content:center}
.prop-doc{display:flex;flex-direction:column;align-items:center;gap:5px;color:#DC2626}
.prop-doc svg{width:34px;height:34px}
.prop-doc b{font-size:11px;font-weight:800;letter-spacing:.6px}
.prop-anexo-doc .prop-anexo-leg{color:var(--ink);font-weight:600}
.prop-anexo-leg em{display:block;font-style:normal;font-size:11.5px;font-weight:600;
  color:var(--acao)}
.prop-anexo-doc:hover .prop-anexo-leg em{text-decoration:underline}
@media (max-width:480px){
  .prop-anexos{grid-template-columns:repeat(2,minmax(0,1fr));gap:10px}
}

/* Quebra em duas linhas em vez de cortar com reticências: reconhecer a peça é
   exatamente o que esta lista serve para fazer. */
.prop-item-nome{margin:0;font-size:14px;font-weight:600;line-height:1.35;color:var(--ink)}
.prop-item-det{margin:2px 0 0;font-size:12.5px;color:var(--ink-soft)}
/* A medida da peca, logo abaixo do titulo: a foto mostra o desenho e nao
   mostra o tamanho. Menor que o detalhe de propósito, e com o icone de regua
   para nao ser lida como mais um nome de variacao. */
.prop-item-med{display:flex;align-items:center;gap:5px;margin:3px 0 0;
  font-size:12px;color:var(--ink-fraco)}
.prop-item-med svg{width:13px;height:13px;flex:0 0 13px;opacity:.7}
.prop-item-qtd{margin:2px 0 0;font-size:12.5px;color:var(--ink-fraco)}
.prop-item-val{font-size:15px;font-weight:700;color:var(--ink);white-space:nowrap;text-align:right}
.prop-item-val em{font-style:normal;font-size:12.5px;font-weight:600;color:var(--ink-fraco)}

.prop-somas{margin-top:14px;padding-top:13px;border-top:1px solid var(--edge);
  display:flex;flex-direction:column;gap:7px}
.prop-somas>div{display:flex;justify-content:space-between;gap:14px;font-size:13.5px;color:var(--ink-soft)}
.prop-somas b{color:var(--ink);font-weight:600}
.prop-somas .verde{color:var(--ok)}
.prop-total{margin-top:4px;padding-top:10px;border-top:1px solid var(--edge);font-size:15px}
.prop-total b{font-size:22px;font-weight:900;color:var(--ink)}
.prop-nota{margin:14px 0 0;padding-top:13px;border-top:1px solid var(--linha-fraca);
  font-size:13.5px;line-height:1.55;color:var(--ink-soft)}

/* Forma de pagamento é BLOCO, não linha: são duas ou três decisões possíveis, e
   cada uma tem um valor diferente embaixo. Mesma regra do `.nz-opt` do painel. */
.prop-formas{display:flex;flex-direction:column;gap:9px}
.prop-forma{display:flex;align-items:flex-start;gap:11px;padding:13px 14px;cursor:pointer;
  border:1px solid var(--edge);border-radius:var(--r);transition:.15s}
.prop-forma:hover{border-color:var(--acao)}
.prop-forma input{margin-top:2px;accent-color:var(--acao);width:17px;height:17px;flex:0 0 17px}
.prop-forma:has(input:checked){border-color:var(--acao);background:var(--acao-fraca)}
.prop-forma.so-leitura{cursor:default}
.prop-forma.so-leitura:hover{border-color:var(--edge)}
.prop-forma-txt{display:flex;flex-direction:column;gap:2px;min-width:0}
.prop-forma-txt b{font-size:14px;font-weight:700;color:var(--ink)}
.prop-forma-txt em{font-style:normal;font-size:12.5px;line-height:1.45;color:var(--ink-soft)}
.prop-forma-txt i{font-style:normal;font-size:13px;font-weight:700;color:var(--acao);margin-top:3px}
.prop-obs{margin:12px 0 0;font-size:12.5px;line-height:1.5;color:var(--ink-fraco)}

/* A decisão fica grudada: rolar a lista de peças não pode tirar da tela o
   botão que a página existe para receber. */
.prop-lado{position:sticky;top:78px}
.prop-decidir{background:var(--surface);border:1px solid var(--edge);border-radius:var(--r);
  padding:16px;display:flex;flex-direction:column;gap:9px}
.prop-lado-total{margin:0 0 4px;font-size:13.5px;color:var(--ink-soft);display:flex;
  justify-content:space-between;align-items:baseline;gap:10px}
.prop-lado-total b{font-size:23px;font-weight:900;color:var(--ink)}
/* Recusar é texto, não botão preenchido: dar o mesmo peso visual do "aceitar"
   a uma ação que encerra a conversa é pedir o clique errado. */
.prop-recusar{background:none;border:0;padding:6px;font-size:13px;font-weight:600;
  color:var(--ink-fraco);cursor:pointer;transition:.15s}
.prop-recusar:hover{color:#C2410C}
.prop-seguro{margin:4px 0 0;font-size:12px;line-height:1.5;color:var(--ink-fraco)}

/* ── a caixa de resposta ────────────────────────────────────────────────── */
.prop-modal{position:fixed;inset:0;z-index:120;background:rgb(6 12 22 / .55);
  display:flex;align-items:center;justify-content:center;padding:18px;overflow-y:auto}
.prop-modal-caixa{position:relative;width:100%;max-width:560px;background:var(--surface);
  border-radius:var(--r);padding:26px 24px 24px;box-shadow:0 18px 50px rgb(6 12 22 / .3)}
.prop-modal-caixa h3{margin:0 0 6px;font-family:Sora,Inter,sans-serif;font-size:19px;
  font-weight:800;color:var(--ink)}
.prop-modal-sub{margin:0 0 16px;font-size:13.5px;line-height:1.5;color:var(--ink-soft)}
.prop-modal-caixa .btn-comprar{width:100%;margin-top:14px}
.prop-modal-caixa .btn-zap{width:100%;margin-top:9px}
/* O X precisa PARECER um botão: solto, ele é um caractere cinza no canto, e é
   a primeira coisa que se procura quando a caixa abriu por engano. */
.prop-x{position:absolute;top:12px;right:12px;width:36px;height:36px;border-radius:99px;
  border:1px solid var(--edge);background:var(--surface);color:var(--ink-fraco);
  font-size:20px;line-height:1;cursor:pointer;transition:.15s}
.prop-x:hover{border-color:#EF4444;color:#EF4444}
.prop-erro{margin:12px 0 0;font-size:13px;font-weight:600;color:#DC2626}
.prop-check{display:block;width:56px;height:56px;margin:0 auto 12px;color:var(--ok)}
.prop-check svg{width:100%;height:100%;fill:none;stroke:currentColor;stroke-width:3;
  stroke-linecap:round;stroke-linejoin:round}
.prop-modal-caixa [data-passo="ok"]{text-align:center}

@media (max-width:900px){
  .prop-grade{grid-template-columns:1fr}
  /* No celular a decisão vai para o FIM: ali "o fim" é logo depois dos itens, e
     um bloco grudado no topo cobriria a peça que a pessoa está conferindo. */
  .prop-lado{position:static;order:2}
  .prop-cab h1{font-size:21px}
}

/* ── decidir: três botões, três pesos ──────────────────────────────────────
   Aceitar é cheio, pensar é âmbar e recusar é neutro, e os TRÊS são botões.

   ⚠️ O `background` NÃO pode voltar para a regra de cima. Ele estava lá, e
   `.prop-decidir .btn-comprar` (duas classes) vence `.btn-comprar` (uma):
   o `transparent` apagava o azul do botão e o `color:#fff` do `.btn-comprar`
   ficava, ou seja letra BRANCA sobre cartão BRANCO. O botão que esta página
   inteira existe para receber estava na tela, ocupando o lugar dele, e
   INVISÍVEL: quem abria a proposta via só "vou pensar" e "recusar" e não
   tinha como aceitar. Sexta vez que contar os elementos do seletor resolve
   um "essa cor não pega" neste projeto. */
.prop-decidir .btn-comprar,.btn-pensar,.btn-recusar{
  display:flex;align-items:center;justify-content:center;gap:8px;width:100%;
  border-radius:var(--r);font-size:14px;font-weight:700;
  cursor:pointer;transition:.15s}
.prop-decidir .btn-comprar svg,.btn-pensar svg,.btn-recusar svg{width:18px;height:18px;flex:0 0 18px}

/* O aceite é o mais alto e o único preenchido: ele é a razão da página. */
.prop-decidir .btn-comprar{min-height:54px;font-size:15.5px;font-weight:800;padding:14px;
  box-shadow:0 6px 16px rgb(var(--acao-rgb) / .28)}
.prop-decidir .btn-comprar:hover{transform:translateY(-1px);
  box-shadow:0 9px 20px rgb(var(--acao-rgb) / .34)}

/* Os outros dois são botões de contorno, com fundo próprio: sem o fundo eles
   liam como texto solto em cima do cartão, e ninguém clica no que não parece
   clicável. */
.btn-pensar{min-height:46px;background:var(--surface);border:1.5px solid #F0B429;color:#B4791A}
.btn-pensar:hover{background:#FFF8EC;border-color:#DE9A0C}
.btn-recusar{min-height:44px;font-weight:600;font-size:13.5px;
  background:var(--surface);border:1.5px solid var(--edge);color:var(--ink-soft)}
.btn-recusar:hover{border-color:#EF9A9A;color:#C2410C;background:#FEF2F2}
:root:not([data-tema="claro"]) .btn-pensar:hover{background:#2A2113}
:root:not([data-tema="claro"]) .btn-recusar:hover{background:#2A1616}
@media (prefers-color-scheme: dark){
  :root:not([data-tema="claro"]) .btn-pensar:hover{background:#2A2113}
  :root:not([data-tema="claro"]) .btn-recusar:hover{background:#2A1616}
}
:root[data-tema="escuro"] .btn-pensar:hover{background:#2A2113}
:root[data-tema="escuro"] .btn-recusar:hover{background:#2A1616}

/* ── pagar: o valor, o Pix e o comprovante ─────────────────────────────── */
.prop-cobranca{display:flex;align-items:baseline;flex-wrap:wrap;gap:4px 10px;
  padding:14px 16px;margin-bottom:16px;border-radius:var(--r);background:var(--acao-fraca)}
.prop-cobranca-rot{flex:1 1 100%;font-size:12px;font-weight:700;text-transform:uppercase;
  letter-spacing:.4px;color:var(--acao-forte)}
.prop-cobranca b{font-size:27px;font-weight:900;color:var(--ink)}
.prop-cobranca em{font-style:normal;font-size:13px;color:var(--ink-soft)}

.prop-pix{display:flex;gap:18px;align-items:flex-start;flex-wrap:wrap}
/* O QR sobre BRANCO sempre, inclusive no tema escuro: a leitura da câmera
   depende do contraste entre módulo escuro e fundo claro, e um QR invertido
   simplesmente não lê em boa parte dos aparelhos. */
.prop-qr{background:#fff;padding:10px;border-radius:var(--r);border:1px solid var(--edge);
  line-height:0;flex:0 0 auto}
.prop-qr img,.prop-qr canvas{display:block}
.prop-pix-txt{flex:1;min-width:230px}
.prop-pix-txt p{margin:0 0 4px;font-size:14px}
.prop-pix-sub{font-size:12.5px;line-height:1.5;color:var(--ink-soft);margin-bottom:10px !important}
#prop-pix-codigo{display:block;font-family:"JetBrains Mono",ui-monospace,monospace;font-size:11px;
  line-height:1.5;color:var(--ink-soft);background:var(--surface-2);border:1px solid var(--edge);
  border-radius:var(--r);padding:10px 11px;margin-bottom:10px;word-break:break-all;
  max-height:74px;overflow:hidden}
#prop-copiar-pix{display:flex;align-items:center;justify-content:center;gap:8px;width:100%}
#prop-copiar-pix svg{width:17px;height:17px}
#prop-copiar-pix.copiado{background:var(--ok)}

.prop-comprovante{margin-top:16px;padding-top:16px;border-top:1px solid var(--edge)}
.prop-comp-area{display:flex;align-items:center;gap:13px;padding:16px;cursor:pointer;
  border:1.5px dashed var(--edge);border-radius:var(--r);transition:.15s}
.prop-comp-area:hover,.prop-comp-area.arrastando{border-color:var(--acao);background:var(--acao-fraca)}
.prop-comp-area svg{width:26px;height:26px;color:var(--acao);flex:0 0 26px}
.prop-comp-area span{display:flex;flex-direction:column;gap:2px}
.prop-comp-area b{font-size:13.5px}
.prop-comp-area em{font-style:normal;font-size:12px;color:var(--ink-fraco)}
.prop-comprovante.enviando{opacity:.55;pointer-events:none}
.prop-comp-ok{display:flex;align-items:flex-start;gap:10px;margin:0;font-size:13px;
  line-height:1.5;color:var(--ink-soft)}
.prop-comp-ok svg{width:20px;height:20px;color:var(--ok);flex:0 0 20px;margin-top:1px}
.prop-comp-ok b{color:var(--ok)}
.prop-comp-trocar{display:inline-block;margin-top:9px;font-size:12.5px;font-weight:600;
  color:var(--acao);cursor:pointer}
.prop-comp-erro{margin:10px 0 0;font-size:12.5px;font-weight:600;color:#DC2626}

.prop-pago .prop-h2{display:flex;align-items:center;gap:8px;color:var(--ok);margin-bottom:6px}
.prop-pago .prop-h2 svg{width:20px;height:20px}
.prop-pago-txt{margin:0;font-size:13.5px;line-height:1.55;color:var(--ink-soft)}
.prop-pago-txt b{color:var(--ink)}

/* Na caixa do aceite as formas ficam mais apertadas: ali elas são um passo do
   formulário, não a seção que vende a condição. */
.prop-formas-modal{margin-bottom:18px}
.prop-formas-modal .prop-forma{padding:11px 12px}
.prop-formas-modal .prop-forma-txt b{font-size:13.5px}

@media (max-width:520px){
  .prop-pix{gap:14px}
  .prop-qr{margin:0 auto}
}

/* ── a esteira, do lado do cliente ─────────────────────────────────────────
   Vertical e não horizontal: no celular, cinco etapas lado a lado dariam 67px
   cada, onde não cabe "Pagamento confirmado" nem a data. Na vertical o texto
   alinha à esquerda, que é como se lê. Mesma régua da jornada do pedido na
   conta: passo sem data entra apagado, como o que falta. */
.prop-jornada{display:flex;flex-direction:column}
.prop-passo{position:relative;display:flex;gap:12px;padding-bottom:16px}
.prop-passo:last-child{padding-bottom:0}
.prop-bolinha{width:11px;height:11px;border-radius:50%;margin-top:4px;flex:0 0 11px;
  background:var(--edge)}
.prop-passo.feito .prop-bolinha{background:var(--ok)}
.prop-passo.ruim .prop-bolinha{background:#DC2626}
/* O fio sai da BOLINHA, não do bloco: preso ao bloco ele apareceria abaixo do
   último ponto, apontando para o nada. */
.prop-fio{position:absolute;left:5px;top:17px;bottom:-2px;width:1px;background:var(--edge)}
.prop-passo.feito .prop-fio{background:color-mix(in srgb,var(--ok) 45%,transparent)}
.prop-passo-txt{display:flex;flex-direction:column;gap:1px;min-width:0}
.prop-passo-txt b{font-size:13.5px;font-weight:600;color:var(--ink-fraco)}
.prop-passo.feito .prop-passo-txt b{color:var(--ink);font-weight:700}
.prop-passo-txt em{font-style:normal;font-size:12px;color:var(--ink-fraco)}

/* O pulso da etapa ATUAL: onde a peça está agora.
   É um anel que sai da bolinha e some, não a bolinha crescendo: mexer no
   tamanho dela empurraria o texto ao lado a cada quadro e a lista tremeria.
   Só a atual pulsa, e não pulsa em pedido entregue nem cancelado: animação que
   nunca para vira enfeite, e aí ninguém repara nela quando ela tem o que
   dizer. */
.prop-passo.atual .prop-bolinha{position:relative}
.prop-passo.atual .prop-bolinha::after{content:"";position:absolute;inset:0;border-radius:50%;
  background:var(--ok);animation:prop-pulso 1.8s cubic-bezier(0,0,.2,1) infinite}
@keyframes prop-pulso{
  0%{transform:scale(1);opacity:.55}
  70%{transform:scale(2.4);opacity:0}
  100%{transform:scale(2.4);opacity:0}
}
@media (prefers-reduced-motion: reduce){
  .prop-passo.atual .prop-bolinha::after{animation:none}
}

/* ═══ COMPARTILHAR ══════════════════════════════════════════════════════════
   Sobre a foto, no canto de baixo à direita, como no Mercado Livre. Disco
   sólido com desfoque atrás: a foto pode ser clara ou escura, e um ícone que
   conta com o fundo some em metade do catálogo. Mesma defesa do coração. */
.compartilhar{position:absolute;right:12px;bottom:12px;z-index:3;
  width:40px;height:40px;border-radius:50%;border:1px solid var(--edge);
  /* ⚠️ Hex por extenso, e NÃO `rgb(var(--surface-rgb) / .92)`: essa variável
     não existe nesta folha, e cor inválida não avisa, some. O coração dos
     favoritos já resolvia assim, com o par de regras de tema logo abaixo. */
  background:rgb(255 255 255 / .92);backdrop-filter:blur(6px);
  color:var(--acao);display:grid;place-items:center;cursor:pointer;
  box-shadow:0 1px 4px rgb(16 32 58 / .18);transition:transform .12s,border-color .12s}
.compartilhar:hover{transform:translateY(-1px);border-color:var(--acao)}
.compartilhar:active{transform:none}
/* Os três estados do tema, como o resto da loja: o `:not([data-tema="claro"])`
   é o que faz o botão de tema vencer a preferência do sistema. */
:root:not([data-tema="claro"]) .compartilhar{background:rgb(17 28 47 / .92)}
@media (prefers-color-scheme: light){
  :root:not([data-tema="escuro"]) .compartilhar{background:rgb(255 255 255 / .92)}
}
:root[data-tema="escuro"] .compartilhar{background:rgb(17 28 47 / .92)}

/* Na faixa da coleção ele é um botão DE TEXTO, não um disco: ali não há foto
   por baixo, e um ícone solto ao lado de um título não diz o que faz. */
.compartilhar-texto{position:static;width:auto;height:auto;border-radius:7px;
  padding:8px 14px;display:inline-flex;align-items:center;gap:7px;
  font:600 13px/1 inherit;backdrop-filter:none;box-shadow:none;white-space:nowrap}

/* O título da faixa e as ações dela na mesma linha, com as ações na ponta. */
.relacionados-topo{display:flex;align-items:flex-end;justify-content:space-between;
  gap:16px;flex-wrap:wrap}
.relacionados-topo h2{margin-bottom:2px}
.colecao-acoes,.colecao-topo-acoes{display:flex;align-items:center;gap:10px;flex-wrap:wrap}
.colecao-ver{color:var(--acao);font-weight:600;font-size:13px;white-space:nowrap}
.colecao-ver:hover{text-decoration:underline}

@media (max-width:640px){
  /* ⚠️ O botão do palco ENCOLHE no celular, mas não abaixo de 40px: é alvo de
     dedo, e a régua desta loja é 44px em item de gaveta. Aqui ele divide a
     foto com o zoom, então 40 é o piso. */
  .compartilhar{right:10px;bottom:10px}
  /* As ações descem para a própria linha: com o título ao lado, "Ver as 12
     peças" e o botão sobravam 90px e o texto quebrava no meio. */
  .relacionados-topo{align-items:flex-start;flex-direction:column;gap:10px}
  .colecao-acoes{width:100%}
}

/* ═══ 404 ═══════════════════════════════════════════════════════════════════
   Ela ocupa a página, e não uma caixinha no canto: quem cai aqui precisa
   entender de cara que chegou num endereço vazio, e não que a loja carregou
   pela metade. O número grande faz esse trabalho sozinho. */
.erro404{text-align:center;padding:56px 20px 64px;max-width:560px;margin:0 auto}
/* ⚠️ Propriedades separadas, e NÃO o atalho `font:`. O atalho exige uma
   família válida no fim, e `inherit` não vale ali: a declaração inteira é
   descartada, em silêncio, e o 404 sai do tamanho do texto comum. Foi o que
   aconteceu na primeira versão desta tela. */
.erro404-num{display:block;font-weight:800;font-size:92px;line-height:1;
  letter-spacing:-.04em;margin-bottom:8px;
  background:linear-gradient(135deg,var(--primary),var(--acao));
  -webkit-background-clip:text;background-clip:text;color:transparent}
.erro404 h2{font-size:22px;margin-bottom:8px}
.erro404 p{color:var(--ink-fraco);font-size:14px;margin-bottom:26px}
.erro404-acoes{display:flex;gap:10px;justify-content:center;flex-wrap:wrap}
/* ⚠️ Os dois botões são definidos AQUI. A loja não tem uma classe `.btn`
   genérica (ela tem `.btn-comprar`, `.btn-filtrar`, cada uma do seu lugar), e
   escrever uma classe que não existe deixa o link com cara de link. */
.erro404-acoes a{display:inline-flex;align-items:center;justify-content:center;
  padding:12px 24px;border-radius:var(--r);font-weight:600;font-size:14px;
  border:1px solid transparent;transition:filter .15s,border-color .15s,color .15s}
.erro404-ir{background:var(--acao);color:#fff}
.erro404-ir:hover{filter:brightness(1.06)}
/* ⚠️ `.erro404-acoes a` é class+ELEMENTO e ganha de `.erro404-buscar`, que é
   só class: o `border:1px solid transparent` de cima vencia a cor da borda e o
   botão secundário aparecia SEM contorno, só no hover. Mesma família do
   `.marca img` que fazia os dois logos aparecerem juntos. O seletor pede o pai
   para empatar o peso e vencer pela ordem. */
.erro404-acoes .erro404-buscar{border-color:var(--edge);color:inherit}
.erro404-acoes .erro404-buscar:hover{border-color:var(--acao);color:var(--acao)}
.erro404-cats{margin-top:32px;padding-top:22px;border-top:1px solid var(--edge);
  display:flex;gap:8px;justify-content:center;flex-wrap:wrap;align-items:center;
  font-size:13px;color:var(--ink-fraco)}
.erro404-cats a{padding:6px 12px;border:1px solid var(--edge);border-radius:var(--r);
  font-weight:600;color:inherit}
.erro404-cats a:hover{border-color:var(--acao);color:var(--acao)}
@media (max-width:600px){
  .erro404{padding:40px 4px 48px}
  .erro404-num{font-size:68px}
  /* Largura cheia no celular: dois botões lado a lado em 335px viram dois
     alvos estreitos, e o principal é o que tem de ser fácil de acertar. */
  .erro404-acoes{flex-direction:column}
}

/* ── acompanhar pedido (/pedido) ────────────────────────────────────────────
   A tela que o rodape ja prometia e nao existia: respondia 404 em producao.
   Quem tem conta ve tudo em /conta; esta e para quem comprou SEM conta, que
   e a maioria. */
.sec-titulo{font-size:clamp(22px,2.4vw,30px);font-weight:700;line-height:1.15;margin:4px 0 8px;color:var(--titulo)}
.rastreio-sub{font-size:14px;color:var(--ink-soft);max-width:52ch;margin:0 0 20px}
/* ⚠️ O CARTAO E O QUE FAZ O CAMPO EXISTIR.
   `.campo input` e `--surface-2` (#EEF3FB) e o fundo da loja e `--ground`
   (#F4F7FC): seis pontos de diferenca num canal e UM no outro, ou seja o campo
   desaparecia. Ele nasceu no checkout, onde ha um cartao branco atras dele, e
   solto ao relento nao tem com o que contrastar.

   Por isso a tela usa `.bloco-form`, o MESMO cartao do checkout, em vez de um
   desenho proprio: dois cartoes diferentes para a mesma funcao divergiriam no
   primeiro ajuste. O `gap` do `.bloco-form` ja separa os filhos, entao nada
   aqui precisa de margem. */
.rastreio-form{max-width:520px;gap:16px}
/* Erro em cartao e nao em linha de texto solta: numa tela que so tem um
   formulario, uma frase vermelha no meio do branco passa batido. */
.rastreio-erro{margin:0;padding:11px 13px;border-radius:var(--r);font-size:13px;
  background:var(--aviso-fundo);border:1px solid var(--aviso-borda);color:var(--aviso-txt)}
.rastreio-form .btn-comprar{width:100%}
.rastreio-conta{margin:18px 0 0;font-size:13px;color:var(--ink-fraco)}
.rastreio-conta a{color:var(--acao);font-weight:600}

.rastreio-achado{max-width:620px;border:1px solid var(--edge);border-radius:var(--r);
  background:var(--surface);padding:20px}
.rastreio-topo{display:flex;align-items:flex-start;justify-content:space-between;gap:12px;
  padding-bottom:14px;margin-bottom:14px;border-bottom:1px solid var(--linha-fraca)}
.rastreio-topo b{display:block;font-family:"JetBrains Mono",monospace;font-size:15px}
.rastreio-topo em{display:block;font-style:normal;font-size:12.5px;color:var(--ink-fraco);margin-top:2px}
.rastreio-situacao{flex:0 0 auto;font-size:12px;font-weight:700;padding:5px 11px;border-radius:var(--r)}
.rastreio-situacao.bom{background:rgb(var(--ok-rgb) / .12);color:var(--ok)}
.rastreio-situacao.esperando{background:var(--aviso-fundo);color:var(--aviso-txt)}
.rastreio-situacao.ruim{background:rgba(211,58,58,.12);color:#D33A3A}
.rastreio-codigo{margin:0 0 14px;font-size:13px;color:var(--ink-soft)}
.rastreio-codigo b{font-family:"JetBrains Mono",monospace}

.rastreio-itens{border-top:1px solid var(--linha-fraca);padding-top:14px}
/* Linha, nao cartao cinza: tres caixas cinza dentro de um cartao branco fazem
   o pedido parecer bloco de sistema. Quem separa e o traco fino. */
.rastreio-item{display:flex;align-items:center;gap:11px;padding:9px 0;font-size:13px}
.rastreio-item + .rastreio-item{border-top:1px solid var(--linha-fraca)}
.rastreio-foto{width:42px;height:42px;flex:0 0 auto;border-radius:var(--r);overflow:hidden;
  background:var(--surface-2);display:flex;align-items:center;justify-content:center}
/* `contain` e nunca `cover`: cortar para preencher tira a borda que distingue
   um suporte do outro. */
.rastreio-foto img{width:100%;height:100%;object-fit:contain}
.rastreio-nome{flex:1;min-width:0}
.rastreio-qtd{flex:0 0 auto;color:var(--ink-fraco);font-family:"JetBrains Mono",monospace}
.rastreio-valor{flex:0 0 auto;font-weight:600;font-family:"JetBrains Mono",monospace}

.rastreio-valores{border-top:1px solid var(--linha-fraca);margin-top:14px;padding-top:14px}
.rastreio-valores p{display:flex;justify-content:space-between;gap:12px;margin:0 0 7px;font-size:13px}
.rastreio-valores span{color:var(--ink-soft)}
.rastreio-valores b{font-family:"JetBrains Mono",monospace;font-weight:600}
.rastreio-valores .total{margin-top:10px;padding-top:10px;border-top:1px solid var(--linha-fraca);font-size:15px}
.rastreio-valores .total b{font-weight:800}
.rastreio-rodape{border-top:1px solid var(--linha-fraca);margin-top:14px;padding-top:14px}
.rastreio-rodape p{margin:0 0 6px;font-size:12.5px;color:var(--ink-soft)}
.rastreio-rodape b{color:var(--ink);margin-right:5px}

@media (max-width:700px){
  /* A 375px o nome e o valor na mesma linha deixam ~70px para o nome, e nome
     cortado e o que faz nao reconhecer a peca. O valor desce para uma faixa
     propria, a mesma quebra da linha do carrinho. */
  .rastreio-item{flex-wrap:wrap}
  .rastreio-nome{flex:1 1 calc(100% - 53px)}
  .rastreio-qtd,.rastreio-valor{margin-left:53px}
  .rastreio-qtd{margin-left:53px}
  .rastreio-valor{margin-left:auto}
}

/* ── a esteira do acompanhamento ───────────────────────────────────────────
   HORIZONTAL no computador e VERTICAL no celular.

   ⚠️ A parte vertical nao e preguica: com cinco etapas lado a lado em 375px
   sobram 67px por passo, onde nao cabe "Pagamento confirmado" nem a data. E a
   mesma razao que ja estava escrita na esteira da proposta, e continua
   valendo; o que mudou e que no desktop existe largura para o formato que se
   le de relance. */
.esteira{display:flex;flex-direction:column;margin:4px 0 18px}
.esteira-p{position:relative;display:flex;gap:12px;padding-bottom:18px}
.esteira-p:last-child{padding-bottom:0}
.esteira-bola{width:34px;height:34px;flex:0 0 34px;border-radius:50%;display:flex;
  align-items:center;justify-content:center;background:var(--surface-2);
  border:1.5px solid var(--edge);color:var(--ink-fraco);position:relative;z-index:1}
.esteira-bola svg{width:17px;height:17px}
.esteira-p.feito .esteira-bola{background:var(--ok);border-color:var(--ok);color:#fff}
.esteira-p.ruim .esteira-bola{background:#DC2626;border-color:#DC2626;color:#fff}
/* O fio sai da BOLA e nao do bloco: preso ao bloco ele apareceria depois do
   ultimo ponto, apontando para o nada. */
.esteira-fio{position:absolute;left:16px;top:34px;bottom:-2px;width:2px;background:var(--edge)}
.esteira-p.feito .esteira-fio{background:var(--ok)}
.esteira-txt{display:flex;flex-direction:column;gap:2px;min-width:0;padding-top:6px}
.esteira-txt b{font-size:13.5px;font-weight:600;color:var(--ink-fraco)}
.esteira-p.feito .esteira-txt b{color:var(--ink);font-weight:700}
.esteira-txt em{font-style:normal;font-size:12px;color:var(--ink-fraco)}

/* O pulso da etapa ATUAL: onde a peca esta agora. Um anel que sai da bola e
   some, nunca a bola crescendo: mexer no tamanho dela empurraria o texto a
   cada quadro. Nao pulsa em pedido entregue nem cancelado, porque animacao
   que nunca para vira enfeite. */
.esteira-p.atual .esteira-bola::after{content:"";position:absolute;inset:-3px;border-radius:50%;
  border:2px solid var(--ok);animation:esteira-pulso 1.8s cubic-bezier(0,0,.2,1) infinite}
@keyframes esteira-pulso{
  0%{transform:scale(.9);opacity:.75}
  100%{transform:scale(1.5);opacity:0}
}
@media (prefers-reduced-motion:reduce){ .esteira-p.atual .esteira-bola::after{animation:none;opacity:.5} }

@media (min-width:760px){
  .esteira{flex-direction:row;align-items:flex-start;margin:10px 0 24px}
  .esteira-p{flex:1 1 0;min-width:0;flex-direction:column;align-items:center;
    text-align:center;padding:0 6px 0 6px;gap:9px}
  /* ⚠️ `min-width:0` acima e obrigatorio: item de flex nasce em `min-width:auto`
     e nao encolhe abaixo do conteudo, entao um rotulo longo estouraria a linha
     sem aviso. Mesma armadilha do item de grid. */
  .esteira-fio{left:50%;right:-50%;top:17px;bottom:auto;width:auto;height:2px}
  .esteira-txt{align-items:center;padding-top:0}
  .esteira-txt b{font-size:12.5px}
  .esteira-txt em{font-size:11px}
}

/* ── o acompanhamento em largura cheia ─────────────────────────────────── */
/* O cartao de 620px era estreito para uma esteira de cinco etapas: elas
   ficariam com 110px cada, de novo apertadas. Com o pedido achado, a coluna
   usa a largura da pagina. */
/* ⚠️ LARGURA CHEIA, e quem segura a coluna e o `.wrap`, como no resto da loja.
   Havia um teto de 900px aqui e ele deixava um vao a direita numa tela de
   1400: o cartao parecia centralizado por acidente. A linha de leitura longa
   nao incomoda porque o conteudo e tabela e esteira, nao paragrafo, e a
   esteira AGRADECE a largura: com cinco etapas, cada 100px a mais e espaco
   que o rotulo deixa de disputar. */
.rastreio-achado{max-width:none}

/* ── como acessar: o bloco de instrucoes do formulario ──────────────────── */
/* Tres passos em cartao, e nao um paragrafo: numa tela que existe para pedir
   dois campos, um texto corrido abaixo do botao e lido como rodape e ninguem
   passa por ele. Em cartao, cada passo tem comeco e fim e o olho conta tres
   coisas. Mesma escolha dos motivos na tela de entrar. */
.rastreio-ajuda{margin-top:22px;max-width:520px}
.rastreio-ajuda h2{font-size:13px;font-weight:700;color:var(--ink);margin:0 0 10px}
.rastreio-passos{display:flex;flex-direction:column;gap:10px}
.rastreio-passo{display:flex;gap:11px;align-items:flex-start;padding:12px 13px;
  border:1px solid var(--edge);border-radius:var(--r);background:var(--surface)}
.rastreio-passo-n{width:22px;height:22px;flex:0 0 22px;border-radius:50%;
  background:rgb(var(--acao-rgb) / .12);color:var(--acao);font-size:11.5px;font-weight:800;
  display:flex;align-items:center;justify-content:center;margin-top:1px}
.rastreio-passo span{display:block;min-width:0}
.rastreio-passo b{display:block;font-size:13px;font-weight:600;color:var(--ink)}
.rastreio-passo em{display:block;font-style:normal;font-size:12px;color:var(--ink-fraco);margin-top:2px}
.rastreio-passo a{color:var(--acao);font-weight:600}

@media (min-width:760px){
  /* No computador o formulario e a ajuda ficam lado a lado: empilhados, a
     ajuda cai abaixo da dobra e deixa de ajudar justamente quem travou. */
  .rastreio-grade{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);
    gap:22px;align-items:start}
  .rastreio-form,.rastreio-ajuda{max-width:none}
  .rastreio-ajuda{margin-top:0}
}

/* ── o numero com o botao de copiar ────────────────────────────────────── */
/* ⚠️ `.rastreio-topo .rastreio-num` E NAO SO `.rastreio-num`: a regra de cima
   e `.rastreio-topo b`, que tem classe MAIS elemento e por isso vence uma
   classe sozinha. O `display:block` dela ganhava do `inline-flex` e o botao de
   copiar caia para a linha de baixo. Sexta vez que um seletor com elemento a
   mais decide neste projeto.

   E o botao virou `inline-flex`: `flex` e block-level, entao mesmo com o pai
   certo ele quebraria a linha sozinho. */
.rastreio-topo .rastreio-num{display:flex;align-items:center;gap:8px;
  font-size:19px;letter-spacing:-.01em;color:var(--titulo)}

/* O numero e a primeira coisa que se procura nesta tela, e estava do tamanho
   de um rotulo. Com o fundo e a borda, ele vira o bloco que o olho acha. */
.rastreio-num-txt{display:inline-block;padding:3px 10px;border-radius:var(--r);
  background:var(--surface-2);border:1px solid var(--edge);font-weight:700}

.rastreio-copiar{width:32px;height:32px;flex:0 0 32px;cursor:pointer;
  border:1px solid var(--edge);background:var(--surface);border-radius:var(--r);
  color:var(--ink-fraco);display:inline-flex;align-items:center;justify-content:center;
  transition:color .15s,background .15s,border-color .15s}
.rastreio-copiar svg{width:15px;height:15px}
/* Borda e fundo proprios porque um icone solto nao anuncia que e clicavel: foi
   a mesma correcao do X da modal do painel. */
.rastreio-copiar:hover{color:var(--acao);border-color:var(--acao);background:rgb(var(--acao-rgb) / .08)}

/* A hora embaixo da data: menor e mais apagada, porque o DIA e a informacao e
   a hora e o detalhe. Do mesmo tamanho, a etapa viraria tres linhas de peso
   igual e nenhuma se leria primeiro. */
.esteira-txt i{font-style:normal;font-size:11px;color:var(--ink-fraco);opacity:.75;
  font-family:"JetBrains Mono",monospace}

/* ── as acoes do pedido ────────────────────────────────────────────────── */
.rastreio-acoes{display:flex;flex-wrap:wrap;gap:9px;border-top:1px solid var(--linha-fraca);
  margin-top:14px;padding-top:14px}
.rastreio-reenviar{margin:0;display:contents}
.rastreio-acao{display:inline-flex;align-items:center;justify-content:center;gap:7px;
  flex:1 1 190px;min-height:42px;padding:10px 14px;border:1px solid var(--edge);
  border-radius:var(--r);background:var(--surface);font:inherit;font-size:13px;
  font-weight:600;color:var(--ink-soft);cursor:pointer;text-decoration:none;
  transition:border-color .15s,color .15s}
.rastreio-acao svg{width:17px;height:17px;flex:0 0 17px}
.rastreio-acao:hover{border-color:var(--acao);color:var(--acao)}
/* O verde do WhatsApp e o unico colorido: ele e o caminho que resolve o
   problema de quem nao achou o que queria na tela. */
.rastreio-acao.zap{color:#128C4A}
.rastreio-acao.zap:hover{border-color:#25D366;color:#128C4A}

.rastreio-aviso{margin:12px 0 0;padding:11px 13px;border-radius:var(--r);font-size:13px;
  background:var(--aviso-fundo);border:1px solid var(--aviso-borda);color:var(--aviso-txt)}
.rastreio-aviso.bom{background:rgb(var(--ok-rgb) / .1);border-color:rgb(var(--ok-rgb) / .3);color:var(--ok)}

@media (max-width:520px){
  /* Largura cheia no celular: dois botoes lado a lado em 335px viram dois
     alvos estreitos. */
  .rastreio-acao{flex:1 1 100%}
}

/* ═════════════════════════════════════════════════════════════════════════
   AVALIAR A COMPRA  (v087)

   ⚠️ A folha branca é a mesma ideia das políticas: a página existe para ser
   LIDA e RESPONDIDA, e sobre o fundo cinza direto o formulário parecia
   rascunho. Aqui ela é mais estreita que a das políticas, porque o que a
   pessoa faz é dar nota e escrever duas linhas, não ler sete seções.
   ═════════════════════════════════════════════════════════════════════════ */

.av-folha{
  max-width:680px;margin:0 auto;background:var(--surface);
  border:1px solid var(--edge);border-radius:14px;
  padding:28px 26px;box-shadow:0 2px 14px rgba(0,0,0,.05);
}
.av-vazio{text-align:center;padding:40px 24px}
.av-vazio h1{font-size:21px;margin:0 0 10px}
.av-vazio p{color:var(--ink-soft);max-width:460px;margin:0 auto 20px;line-height:1.6}
.av-vazio .btn-comprar{display:inline-flex}

.av-titulo{font-size:24px;font-weight:800;margin:0 0 6px}
.av-sub{color:var(--ink-soft);font-size:14px;line-height:1.6;margin:0 0 22px}

.av-erro{
  background:rgba(220,38,38,.08);border:1px solid rgba(220,38,38,.35);
  color:#B91C1C;border-radius:10px;padding:11px 13px;font-size:13.5px;margin:0 0 18px;
}

/* ⚠️ O "obrigado" é VERDE e grande porque a pessoa precisa saber que chegou.
   Sem resposta clara ela envia de novo, e a segunda gravação volta a nota
   para pendente de novo. */
.av-ok{display:flex;gap:14px;align-items:flex-start;margin:0 0 22px;color:var(--ok)}
.av-ok svg{flex:0 0 auto;margin-top:2px}
.av-ok h1{font-size:21px;margin:0 0 6px;color:var(--ink)}
.av-ok p{margin:0;color:var(--ink-soft);font-size:13.5px;line-height:1.6}

.av-bloco{border-top:1px solid var(--edge);padding-top:20px;margin-top:20px}
.av-bloco:first-of-type{border-top:0;padding-top:0;margin-top:0}
.av-bloco h2{font-size:16px;font-weight:700;margin:0 0 4px}
.av-nota-bloco{font-size:12.5px;color:var(--ink-soft);margin:0 0 14px}

.av-form textarea{
  width:100%;border:1px solid var(--edge);border-radius:10px;
  padding:11px 12px;font:inherit;font-size:14px;background:var(--surface);
  color:var(--ink);resize:vertical;margin-top:10px;
}
.av-form textarea:focus{outline:2px solid var(--acao);outline-offset:1px;border-color:transparent}

/* ───────── as estrelas ─────────
   ⚠️ O `<input type=radio>` continua no DOM e é ele que envia: sem JavaScript
   o formulário funciona com os radios nativos, e o script só acende. Esconder
   com `display:none` tiraria o campo do Tab; `appearance:none` com tamanho
   zero o mantém focável. */
.av-estrelas{display:flex;gap:2px;margin:12px 0 0}
.av-estrela{
  display:inline-flex;cursor:pointer;color:var(--edge);
  padding:3px;transition:color .12s,transform .12s;
}
.av-estrela svg{width:34px;height:34px;fill:transparent}
.av-estrelas.pequena .av-estrela svg{width:26px;height:26px}
.av-estrela input{appearance:none;width:0;height:0;margin:0;position:absolute;opacity:0}
.av-estrela input:focus-visible + svg{outline:2px solid var(--acao);outline-offset:2px;border-radius:4px}
.av-estrela.on{color:#F59E0B}
.av-estrela.on svg{fill:#F59E0B}
.av-estrelas:hover .av-estrela{color:#F59E0B}
/* O hover acende só até onde o ponteiro está: as seguintes voltam ao cinza. */
.av-estrela:hover ~ .av-estrela{color:var(--edge)}
.av-estrela:hover ~ .av-estrela svg{fill:transparent}

/* ───────── o prazo ───────── */
.av-prazo{
  display:flex;align-items:center;gap:12px;flex-wrap:wrap;
  margin-top:16px;font-size:13.5px;color:var(--ink-soft);
}
.av-sim-nao{display:flex;gap:8px}
.av-pilula{
  display:inline-flex;align-items:center;cursor:pointer;
  border:1px solid var(--edge);border-radius:999px;padding:7px 15px;
  font-size:13px;font-weight:600;color:var(--ink);transition:all .12s;
  /* ⚠️ 40px de altura: abaixo disso o dedo erra no celular, e esta é a
     segunda pergunta mais respondida da página. */
  min-height:40px;
}
.av-pilula input{appearance:none;width:0;height:0;margin:0;position:absolute;opacity:0}
.av-pilula.on{border-color:var(--acao);background:var(--acao-fraca);color:var(--acao)}
.av-pilula input:focus-visible{outline:none}
.av-pilula:has(input:focus-visible){outline:2px solid var(--acao);outline-offset:2px}

/* ───────── a peça ───────── */
.av-peca{display:flex;gap:14px;padding:14px 0;border-bottom:1px solid var(--edge)}
.av-peca:last-child{border-bottom:0;padding-bottom:0}
.av-peca-foto{
  flex:0 0 72px;width:72px;height:72px;border-radius:10px;overflow:hidden;
  display:flex;align-items:center;justify-content:center;
}
/* `contain`, nunca `cover`: cortar para preencher tira a borda que distingue
   um suporte do outro, e a foto existe aqui para RECONHECER a peça. */
.av-peca-foto img{width:100%;height:100%;object-fit:contain}
/* ⚠️ `min-width:0` no corpo: sem ele o nome longo (os importados têm 90
   caracteres) estoura a linha e a página inteira ganha rolagem lateral. */
.av-peca-corpo{flex:1;min-width:0}
.av-peca-nome{font-size:14px;font-weight:600;margin:0;line-height:1.4}

.av-assina label{display:block}
.av-assina label span{display:block;font-size:13.5px;font-weight:600;margin-bottom:8px}
.av-assina input{
  width:100%;max-width:320px;border:1px solid var(--edge);border-radius:10px;
  padding:11px 12px;font:inherit;font-size:14px;background:var(--surface);color:var(--ink);
}
.av-assina input:focus{outline:2px solid var(--acao);outline-offset:1px;border-color:transparent}
.av-assina .av-nota-bloco{margin:8px 0 0}

.av-enviar{width:100%;margin-top:24px;justify-content:center}

/* Esconde do olho e mantém para o leitor de tela: o rótulo "3 estrelas" é a
   única coisa que diz o que cada ícone faz. */
.sr-only{
  position:absolute;width:1px;height:1px;padding:0;margin:-1px;
  overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0;
}

@media (max-width:640px){
  .av-folha{padding:22px 18px;border-radius:12px}
  .av-titulo{font-size:21px}
  .av-estrela svg{width:38px;height:38px}   /* o dedo pede mais que o ponteiro */
  .av-peca-foto{flex-basis:60px;width:60px;height:60px}
}

/* ═══ FALTA PAGAR, na página do pedido ═══════════════════════════════════════
   ⚠️ Ela existe porque o copia-e-cola NO WHATSAPP não dá para copiar sozinho:
   tocar e segurar seleciona o parágrafo, vem texto junto, e o banco recusa.
   Aqui o código tem bloco próprio e botão. */
.pagar {
    border: 1px solid var(--acao);
    background: var(--acao-fraca);
    border-radius: 12px;
    padding: 18px;
    margin: 0 0 18px;
    /* ⚠️ A âncora `#pagar` cai sob o topo grudento sem isto, e a pessoa chega
       na página vendo o bloco de cima em vez do que ela veio fazer. */
    scroll-margin-top: 80px;
}
.pagar h2 { font-size: 17px; font-weight: 800; margin: 0 0 6px; color: var(--ink); }
.pagar-ajuda { font-size: 13px; color: var(--ink-soft); margin: 0 0 14px; line-height: 1.5; }

/* No celular ninguém escaneia a própria tela: lá o QR só ocupa espaço do que
   resolve, que é o botão. */
.pagar-qr { display: block; width: 180px; height: 180px; margin: 0 auto 14px; border-radius: 8px; background: #fff; }

/* ⚠️ `break-all` e não `break-word`: o código é UMA palavra de 200 caracteres
   sem espaço nenhum, e sem isto ele estoura a caixa para a direita. E ele fica
   SELECIONÁVEL, para quem preferir copiar à mão em vez de usar o botão. */
.pagar-codigo {
    font-family: ui-monospace, "SF Mono", Menlo, Consolas, monospace;
    font-size: 12px;
    line-height: 1.6;
    color: var(--ink-soft);
    background: var(--surface);
    border: 1px solid var(--edge);
    border-radius: 8px;
    padding: 12px;
    word-break: break-all;
    user-select: all;
    margin: 0 0 12px;
}
.pagar-btn {
    display: flex; align-items: center; justify-content: center; gap: 8px;
    width: 100%;
    /* 48px: é o alvo de um dedo, e este é o botão que a página existe para ter. */
    min-height: 48px;
    border: 0; border-radius: 10px;
    background: var(--acao); color: #fff;
    font-size: 15px; font-weight: 700; cursor: pointer;
    transition: filter .15s;
}
.pagar-btn:hover { filter: brightness(1.07); }
.pagar-btn svg { width: 18px; height: 18px; }
.pagar-vence { font-size: 12px; color: var(--ink-fraco); margin: 10px 0 0; text-align: center; }

@media (max-width: 640px) {
    .pagar-qr { display: none; }
    .pagar { padding: 14px; }
}

/* ══ A ESCOLHA DO CLIENTE NO ORÇAMENTO (v098) ═════════════════════════════
   Ele marca o que quer e aumenta a quantidade. Nada aqui calcula preço: o que
   o CSS faz é deixar claro o que está dentro e o que ficou de fora.          */

.prop-escolha-dica{
    margin:0 0 12px; font-size:13px; color:var(--ink-soft);
}

/* ⚠️ Ambar porque FALTA UMA DECISAO, nao porque algo deu errado: a tela abre
   sem nada marcado, e sem este bloco a lista parece uma lista de leitura. Ele
   da lugar a dica neutra assim que o primeiro item e marcado. */
.prop-escolha-aviso{
    display:flex; align-items:flex-start; gap:9px;
    margin:0 0 13px; padding:11px 13px;
    font-size:13px; line-height:1.45;
    color:var(--aviso-txt); background:var(--aviso-fundo);
    border:1px solid var(--aviso-borda); border-radius:var(--r);
}
.prop-escolha-aviso b{ color:var(--aviso-txt); }
.prop-escolha-aviso svg{ width:18px; height:18px; flex:0 0 18px; margin-top:1px; }
/* Item de flex nasce em `min-width:auto` e nao encolhe abaixo do conteudo:
   sem isto o texto empurra a caixa para fora a 375px. */
.prop-escolha-aviso span{ min-width:0; }

/* A caixa fica na frente da foto, não sobre ela: a foto AMPLIA, e dois alvos
   empilhados no mesmo canto é onde o clique erra. */
.prop-itens.escolhendo .prop-item{ padding-left:4px; }

.prop-item-marca{
    display:flex; align-items:center; justify-content:center;
    width:44px; min-height:44px; flex:0 0 44px;  /* alvo de dedo, não de mouse */
    cursor:pointer; align-self:center;
}
.prop-item-marca input{ position:absolute; opacity:0; width:0; height:0; }
.prop-item-marca span{
    width:22px; height:22px; border-radius:6px;
    border:2px solid var(--edge); background:var(--surface);
    display:block; position:relative; transition:background .14s, border-color .14s;
}
.prop-item-marca span::after{
    content:""; position:absolute; inset:0;
    background:no-repeat center/13px url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='white' stroke-width='3.4' stroke-linecap='round' stroke-linejoin='round'><path d='M20 6L9 17l-5-5'/></svg>");
    opacity:0; transition:opacity .14s;
}
.prop-item-marca input:checked + span{ background:var(--acao); border-color:var(--acao); }
.prop-item-marca input:checked + span::after{ opacity:1; }
.prop-item-marca input:focus-visible + span{ outline:2px solid var(--acao); outline-offset:2px; }

/* Fora do pedido: apagado, NUNCA riscado nem escondido. Ele continua sendo
   uma opção que a pessoa pode querer de volta, e sumir faria parecer que o
   orçamento mudou. */
/* ⚠️ APAGADO E RISCADO SAO A LEITURA DE "JA RESPONDIDO", onde é verdade que
   aquele item ficou fora do pedido. ENQUANTO ELE ESCOLHE nao servem: com a
   tela abrindo sem nada marcado, a proposta inteira nasceria a 45% com todos
   os precos riscados, ilegivel e com cara de indisponivel. Aqui quem diz o que
   esta dentro e a CAIXA, e o valor em tom fraco diz o que ainda nao conta. */
.prop-item.fora{ opacity:.45; }
.prop-item.fora .prop-item-val{ text-decoration:line-through; }
.prop-itens.escolhendo .prop-item.fora{ opacity:1; }
.prop-itens.escolhendo .prop-item.fora .prop-item-val{
    text-decoration:none; color:var(--ink-fraco); font-weight:600;
}
.prop-item-fora{
    margin:2px 0 0; font-size:12px; font-weight:700; color:var(--ink-fraco);
}

/* ── o stepper ──────────────────────────────────────────────────────────── */
.prop-qtd{ display:flex; align-items:center; gap:6px; margin-top:6px; flex-wrap:wrap; }
.prop-qtd-b{
    width:30px; height:30px; flex:0 0 30px; border-radius:7px;
    border:1px solid var(--edge); background:var(--surface); color:var(--ink);
    font-size:17px; line-height:1; cursor:pointer;
    display:flex; align-items:center; justify-content:center;
    transition:border-color .14s, background .14s;
}
.prop-qtd-b:hover{ border-color:var(--acao); color:var(--acao); }
/* Campo de TEXTO com teclado numérico: as setinhas do `number` ficam por cima
   do próprio número num campo estreito, e ele ainda aceita `e`, `-` e `.`. */
.prop-qtd-n{
    width:52px; height:30px; text-align:center; border-radius:7px;
    border:1px solid var(--edge); background:var(--surface); color:var(--ink);
    font-size:13.5px; font-weight:700; font-variant-numeric:tabular-nums;
}
.prop-qtd-un{ font-size:12px; color:var(--ink-soft); }

/* ── o resumo enquanto o servidor confere ───────────────────────────────── */
/* Mostrar o número velho com a mesma firmeza do confirmado é afirmar o que
   ainda não se sabe. Mesma regra do resumo do carrinho. */
.prop-somas.calculando{ opacity:.5; transition:opacity .12s; }
.prop-somas.erro{ opacity:1; }
.prop-somas.erro::after{
    content:"Não consegui atualizar o total. Confira a conexão.";
    display:block; margin-top:8px; font-size:12.5px; color:var(--warn);
}

.prop-vazio-aviso{
    margin:0 0 10px; font-size:12.5px; font-weight:600;
    color:var(--aviso-txt); background:var(--aviso-fundo);
    border-radius:7px; padding:8px 10px;
}

.prop-decidir .btn-comprar:disabled{ opacity:.45; cursor:not-allowed; }

@media (max-width:640px){
    /* A 375px a linha já aperta com foto, nome e valor: a caixa entra antes da
       foto e o stepper desce para a faixa do texto, como a linha do carrinho e
       a da baixa do consignado fazem. */
    .prop-item-marca{ width:38px; flex:0 0 38px; }
    /* ⚠️ A palavra "unidades" NÃO CABE ao lado do stepper em 142px (medido) e
       quebrava sozinha numa terceira linha, solta embaixo dos botões. O
       stepper com o número no meio já diz o que ele é, e o campo continua com
       o rótulo para quem usa leitor de tela. */
    .prop-qtd-un{ display:none; }
}
