/* ============================================================
   client.css — página do zJu4nn Client (/client)
   Carrega DEPOIS do styles.css. Só o que é genuinamente novo:
   o styles.css já entrega body, navbar, rodapé, blobs e .btn.

   REGRAS QUE NÃO PODEM SER QUEBRADAS
   · `.mc-page` vai no <main>, NUNCA no <body> (a versão standalone
     tinha no body; se voltar pra lá, o padding dobra e o z-index
     briga com a navbar).
   · Nada de `.mc-page a { color: inherit }` — essa regra empata em
     especificidade com `.nav-links a` e `.btn-primary`, vence por
     ordem de cascata e despinta o menu, o rodapé e o CTA inteiro.
   · Quem manda na largura é o `.mc-wrap` (1120px). O `.mc-page` só
     cuida de empilhamento; se os dois tiverem max-width, o conteúdo
     encolhe pra ~908px em telas grandes.
   ============================================================ */

/* Escala de espaçamento 4/8 — única coisa do :root original que
   sobrevive, porque o styles.css não tem escala equivalente. */
:root {
  --s1: 4px;  --s2: 8px;  --s3: 12px; --s4: 16px;
  --s5: 24px; --s6: 32px; --s7: 48px; --s8: 72px;
}

/* ── Fundo em vídeo ────────────────────────────────────────────
   z-index -3 põe atrás dos .bg-blob (-2) e da .bg-grid (-1), então os blobs
   rosa continuam por cima e o fundo entra na identidade da marca.
   O blur está ASSADO no arquivo (ffmpeg), não em filter: CSS filter num
   elemento animado re-rasteriza a cada quadro — caro, e mais ainda numa
   página cujo argumento é FPS. De quebra o arquivo despencou: 2,6 MB de GIF
   viraram 20 KB de MP4 / 12 KB de WebM, porque sem detalhe fino comprime bem.
   O escurecimento fica no ::after — é de graça e dá pra ajustar sem re-encodar. */
/* O poster fica como fundo FIXO do container, não só no <video>: se o vídeo
   não carregar (rede ruim, autoplay barrado, economia de dados), sobra a
   imagem em vez de um buraco preto. */
.mc-bg {
  position: fixed; inset: 0; z-index: -3; overflow: hidden; pointer-events: none;
  background: url("client-bg-poster.jpg") center/cover no-repeat;
}
.mc-bg-video { width: 100%; height: 100%; object-fit: cover; display: block; }
.mc-bg::after {
  content: ""; position: absolute; inset: 0;
  background:
    radial-gradient(120% 90% at 50% 0%, rgba(160, 75, 255, .30), transparent 70%),
    linear-gradient(180deg, rgba(8, 6, 13, .55), rgba(8, 6, 13, .74) 45%, rgba(8, 6, 13, .93));
}
/* DECISÃO CONSCIENTE: esta página NÃO desliga o fundo em prefers-reduced-motion.
   No Windows essa preferência vem de "Animar controles e elementos", que muita
   gente desmarca por gosto ou desempenho — não por enjoo de movimento. Como o
   fundo é um loop lento, borrado e sob overlay, o risco vestibular é baixo e o
   custo de sumir com ele é a página parecer quebrada pra quem só desligou o
   efeito do Windows. Se um dia isso mudar, o caminho é um botão na própria
   página, não amarrar na preferência do sistema. */

/* Botão de pausar o fundo. Canto inferior ESQUERDO — o direito é do FAB do
   Discord (styles.css:1371). Discreto por padrão e acende no hover: é controle
   de conforto, não chamada pra ação. */
.mc-bgtoggle {
  position: fixed; left: 24px; bottom: 24px; z-index: 9000;
  width: 42px; height: 42px; padding: 0;
  display: grid; place-items: center;
  border-radius: 50%; cursor: pointer;
  border: 1px solid rgba(255, 255, 255, .14);
  background: rgba(12, 8, 20, .66);
  -webkit-backdrop-filter: blur(8px); backdrop-filter: blur(8px);
  color: rgba(245, 237, 255, .72);
  transition: color .2s, border-color .2s, background .2s, transform .2s;
}
.mc-bgtoggle:hover, .mc-bgtoggle:focus-visible {
  color: #fff; border-color: rgba(255, 61, 154, .55);
  background: rgba(255, 61, 154, .16); transform: translateY(-2px);
}
.mc-bgtoggle svg { width: 17px; height: 17px; fill: currentColor; }
/* mostra só o ícone do estado oposto ao atual */
.mc-bgtoggle .mc-bgtoggle-play { display: none; }
.mc-bgtoggle.is-paused .mc-bgtoggle-pause { display: none; }
.mc-bgtoggle.is-paused .mc-bgtoggle-play { display: block; }
@media (max-width: 600px) {
  .mc-bgtoggle { left: 16px; bottom: 16px; width: 38px; height: 38px; }
}

/* Wrapper da página. z-index:5 é obrigatório: sem ele o conteúdo
   fica ATRÁS do .bg-grid ornamental do styles.css. */
.mc-page {
  position: relative;
  z-index: 5;
  padding-bottom: var(--s8);
}
.mc-page h1, .mc-page h2, .mc-page h3 {
  font-family: 'Orbitron', sans-serif;
  line-height: 1.15;
  margin: 0;
}
.mc-wrap { max-width: 1120px; margin: 0 auto; padding: 0 var(--s5); }

/* Âncoras (#baixar, #como-funciona) não podem aterrissar embaixo
   da navbar sticky. Escopado pra não pegar #auth-avatar do header. */
.mc-page [id] { scroll-margin-top: 76px; }

/* Foco visível — o styles.css não tem NENHUMA regra de foco.
   Fica escopado aqui por enquanto; vale promover pro styles.css
   num commit separado, pra beneficiar as 6 páginas. */
/* ⚠️ Os CAMPOS ficavam de fora e ainda pediam `outline: none` cada um por conta
   própria: quem navega por teclado chegava na busca, na ordenação e no campo de
   nick e não via anel nenhum. Campo leva 2px (o `:focus-visible` de campo de
   texto também casa no CLIQUE de mouse, então 3px ficaria barulhento demais);
   link e botão continuam em 3px. */
.mc-page input:focus-visible,
.mc-page select:focus-visible,
.mc-page textarea:focus-visible {
  outline: 2px solid var(--cyan);
  outline-offset: 2px;
}
.mc-page a:focus-visible,
.mc-page button:focus-visible,
.mc-page summary:focus-visible {
  outline: 3px solid var(--cyan);
  outline-offset: 3px;
  border-radius: 8px;
}

/* ── Hero ─────────────────────────────────────────────────── */
.mc-hero { position: relative; padding: var(--s8) 0 var(--s7); text-align: center; overflow: hidden; }
.mc-hero::before {
  content: ""; position: absolute; inset: -30% -20% auto; height: 620px; z-index: 0;
  background: radial-gradient(60% 60% at 50% 0%, rgba(255, 61, 154, .20), transparent 70%),
              radial-gradient(45% 45% at 75% 10%, rgba(160, 75, 255, .18), transparent 70%);
  pointer-events: none;
}
.mc-hero > * { position: relative; z-index: 1; }

/* Logo do produto. O <main> tem z-index:5, então ela fica acima dos blobs.
   Flutua de leve — só transform, que é a propriedade barata (roda na GPU,
   não recalcula layout). Ciclo longo de propósito: tem que dar vida sem
   puxar o olho pra longe do CTA. */
.mc-logo {
  display: block; width: 104px; height: 104px;
  margin: 0 auto var(--s5);
  filter: drop-shadow(0 12px 34px rgba(255, 61, 154, .38));
  animation: mc-logo-float 6s ease-in-out infinite;
  will-change: transform;
}
@keyframes mc-logo-float {
  0%,  100% { transform: translateY(0)     rotate(-1.1deg); }
  50%       { transform: translateY(-9px)  rotate(1.1deg);  }
}
@media (max-width: 600px) { .mc-logo { width: 84px; height: 84px; } }

.mc-badge {
  display: inline-flex; align-items: center; gap: var(--s2);
  padding: var(--s2) var(--s4); border: 1px solid var(--border); border-radius: 999px;
  background: rgba(255, 61, 154, .08); color: var(--pink-3);
  font-size: 13px; font-weight: 600; letter-spacing: .02em; margin-bottom: var(--s5);
}
/* SVG inline sem tamanho explícito estoura — este site não tem reset de svg. */
.mc-badge svg { width: 15px; height: 15px; flex: none; }

.mc-h1 { font-size: clamp(2rem, 6vw, 3.6rem); font-weight: 800; letter-spacing: -.01em; margin-bottom: var(--s4); }
.mc-h1 em {
  font-style: normal;
  background: linear-gradient(135deg, var(--pink-1), var(--purple) 55%, var(--cyan));
  -webkit-background-clip: text; background-clip: text; color: transparent;
}
.mc-sub {
  max-width: 60ch; margin: 0 auto var(--s6);
  color: var(--text-muted); font-size: clamp(1rem, 2.2vw, 1.15rem);
}
.mc-actions { display: flex; flex-wrap: wrap; gap: var(--s4); justify-content: center; align-items: center; }

/* O único CTA primário da página. Reusa a cara do .btn-primary do
   site, mas com altura de alvo de toque e Orbitron. */
.mc-cta {
  display: inline-flex; align-items: center; gap: var(--s3);
  min-height: 56px; padding: var(--s4) var(--s6);
  background: var(--grad-btn); color: #fff; text-decoration: none;
  font-family: 'Orbitron', sans-serif; font-weight: 700; font-size: 1.05rem;
  border: 0; border-radius: 14px; cursor: pointer;
  box-shadow: var(--shadow-pink);
  transition: transform .2s ease, box-shadow .2s ease, filter .2s ease;
}
.mc-cta:hover { transform: translateY(-2px); box-shadow: 0 16px 50px -12px rgba(255, 61, 154, .6); filter: brightness(1.06); }
.mc-cta:active { transform: translateY(0); }
/* ⛔ O ÍCONE PRECISA DE TAMANHO EXPLÍCITO EM TODO BOTÃO QUE O USA. Esta regra
   valia só pro .mc-cta. Quando o botão do Linux nasceu com a mesma <svg> numa
   classe diferente, o ícone ficou SEM largura dentro de um flex, esticou, comeu
   a linha e jogou "Baixar para Linux" em três linhas — o botão virou um quadrado
   com uma seta gigante. Selector novo? Acrescente aqui junto. */
.mc-cta svg,
.mc-cta-alt svg,
.mc-cta-2 svg { width: 22px; height: 22px; flex: none; }

/* O SEGUNDO download (hoje o Linux). Mesma altura, mesma tipografia e mesmo
   raio do primário, mas contornado em vez de preenchido: os dois são download,
   e um deles é o caminho da maioria. ⚠️ Não reusar o .mc-cta-2 aqui — aquele é
   o "Ver por dentro", que NÃO baixa nada; se os dois tiverem o mesmo peso, a
   pessoa não distingue o que é download do que é navegação. */
.mc-cta-alt {
  display: inline-flex; align-items: center; gap: var(--s3);
  min-height: 56px; padding: var(--s4) var(--s6);
  background: rgba(255, 61, 154, .08); color: var(--text); text-decoration: none;
  font-family: 'Orbitron', sans-serif; font-weight: 700; font-size: 1.05rem;
  border: 1px solid var(--border); border-radius: 14px; cursor: pointer;
  transition: transform .2s ease, border-color .2s ease, background .2s ease;
}
.mc-cta-alt:hover {
  transform: translateY(-2px); border-color: var(--pink-2);
  background: rgba(255, 61, 154, .15);
}
.mc-cta-alt:active { transform: translateY(0); }

/* O rótulo dos três é curto e cabe numa linha; quebrar só acontece por defeito
   (foi o que aconteceu com o ícone sem tamanho). No celular quem quebra é o
   .mc-actions, que já tem flex-wrap e empilha os botões inteiros. */
.mc-cta, .mc-cta-alt, .mc-cta-2 { white-space: nowrap; }

.mc-cta-2 {
  display: inline-flex; align-items: center; gap: var(--s2);
  min-height: 56px; padding: var(--s4) var(--s5);
  border: 1px solid var(--border); border-radius: 14px;
  color: var(--text-muted); text-decoration: none; font-weight: 600;
  transition: border-color .2s ease, color .2s ease, background .2s ease;
}
.mc-cta-2:hover { border-color: var(--pink-2); color: var(--text); background: rgba(255, 61, 154, .06); }

.mc-meta { margin-top: var(--s5); color: var(--text-muted); font-size: .9rem; }
.mc-meta b { color: var(--text); font-weight: 600; }

/* ── Prova: os números medidos ────────────────────────────── */
.mc-proof { padding: var(--s7) 0; }
.mc-stats {
  display: grid; grid-template-columns: repeat(auto-fit, minmax(190px, 1fr)); gap: var(--s4);
  background: var(--card); border: 1px solid var(--border); border-radius: 20px;
  padding: var(--s6) var(--s5); backdrop-filter: blur(8px);
}
.mc-stat { text-align: center; padding: 0 var(--s3); }
.mc-stat-n {
  font-family: 'Orbitron', sans-serif; font-weight: 800;
  font-size: clamp(1.8rem, 4.6vw, 2.6rem); line-height: 1;
  font-variant-numeric: tabular-nums; /* sem isso o número dança */
  background: linear-gradient(135deg, var(--pink-2), var(--purple));
  -webkit-background-clip: text; background-clip: text; color: transparent;
}
.mc-stat-l { margin-top: var(--s2); font-size: .82rem; color: var(--text-muted); letter-spacing: .04em; text-transform: uppercase; }

.mc-note {
  margin: var(--s4) auto 0; text-align: center; color: var(--text-muted);
  font-size: .82rem; line-height: 1.7; max-width: 74ch;
  /* O protect.js aplica user-select:none no body em produção. Aqui não:
     esta é justamente a metodologia que existe pra ser conferida. */
  -webkit-user-select: text; user-select: text;
}
.mc-note code {
  font-family: 'Consolas', 'Monaco', monospace; font-size: .8rem;
  background: rgba(255, 255, 255, .05); padding: 1px 6px; border-radius: 5px; color: var(--pink-3);
}
.mc-note + .mc-note { margin-top: var(--s3); }

/* ── Gráfico de barras (comparativo de FPS) ───────────────── */
.mc-chart { margin-top: var(--s5); display: grid; gap: var(--s4); }

/* Legenda: a cor identifica a MÉTRICA (média / 1% low / 0.1% low), não o
   client — assim dá pra comparar a mesma métrica entre as três linhas. */
.mc-legend {
  display: flex; flex-wrap: wrap; justify-content: center; gap: var(--s5);
  color: var(--text-muted); font-size: .82rem; margin-bottom: var(--s2);
}
.mc-legend span { display: inline-flex; align-items: center; gap: var(--s2); }
.mc-dot { width: 9px; height: 9px; border-radius: 50%; flex: none; }
.mc-dot.is-avg { background: var(--pink-1); }
.mc-dot.is-low1 { background: var(--purple); }
.mc-dot.is-low01 { background: var(--cyan); }

/* Um grupo por client, com as três métricas dentro. */
/* Fundo bem opaco de propósito: o vídeo passa por trás e, translúcido demais,
   os números perdiam contraste contra as nuvens em movimento. */
.mc-grp {
  border: 1px solid var(--border); border-radius: 16px;
  padding: var(--s4) var(--s5); background: rgba(18, 11, 28, .82);
}
/* O nosso é o único com a cor da marca — o olho acha sozinho. */
.mc-grp.is-us {
  border-color: rgba(255, 61, 154, .45);
  background: linear-gradient(180deg, rgba(255, 61, 154, .10), rgba(26, 16, 39, .45));
}
.mc-grp-head { display: flex; align-items: center; gap: var(--s3); margin-bottom: var(--s3); }
.mc-grp.is-us .mc-bar-name { color: var(--text); font-weight: 700; }
.mc-metrics { display: grid; gap: var(--s2); }
.mc-metric { display: grid; grid-template-columns: 64px 1fr 84px; gap: var(--s3); align-items: center; }
.mc-metric-l { font-size: .76rem; color: var(--text-muted); white-space: nowrap; }
/* O número é o conteúdo, não legenda: cor cheia e um degrau maior que o rótulo. */
.mc-metric .mc-bar-val {
  text-align: right; font-size: .98rem; color: var(--text);
  letter-spacing: .01em;
}
.mc-grp.is-us .mc-metric .mc-bar-val { color: #fff; }
/* Cor por métrica. Fora do nosso grupo elas entram mais apagadas, pra a
   comparação continuar legível sem competir com a linha em destaque. */
.mc-bar-fill.is-avg { background: linear-gradient(90deg, var(--pink-1), var(--pink-2)); }
.mc-bar-fill.is-low1 { background: linear-gradient(90deg, var(--purple), #c58bff); }
.mc-bar-fill.is-low01 { background: linear-gradient(90deg, #1c9fae, var(--cyan)); }
.mc-grp:not(.is-us) .mc-bar-fill { opacity: .55; }
.mc-grp.is-us .mc-bar-fill.is-avg { box-shadow: 0 0 22px -6px rgba(255, 61, 154, .75); }
@media (max-width: 600px) {
  .mc-grp { padding: var(--s4) var(--s4); }
  .mc-metric { grid-template-columns: 52px 1fr 68px; gap: var(--s2); }
  .mc-metric-l { font-size: .68rem; }
  .mc-metric .mc-bar-val { font-size: .78rem; }
}
.mc-bar-ico {
  width: 44px; height: 44px; border-radius: 12px;
  display: grid; place-items: center;
  border: 1px solid var(--border); background: rgba(26, 16, 39, .6);
  font-family: 'Orbitron', sans-serif; font-weight: 700; font-size: .8rem;
  color: var(--text-muted);
}
.mc-bar-ico svg { width: 22px; height: 22px; stroke: var(--text-muted); stroke-width: 1.7; fill: none; stroke-linecap: round; stroke-linejoin: round; }
/* tabular-nums: o número sobe contando (client-chart.js) e sem isto cada
   dígito tem largura diferente, fazendo o rótulo tremer durante a contagem. */
.mc-bar-val { font-variant-numeric: tabular-nums; }
/* Ícones desenhados (bloco de terra, lua do Lunar): são arte preenchida, não
   contorno — a regra acima zeraria o fill e sumiria com eles. */
.mc-bar-ico-art svg { width: 26px; height: 26px; stroke: none; fill: initial; }
/* Logo de terceiro (Lunar, Badlion) ocupa o quadrado sem moldura em volta.
   object-fit: contain é OBRIGATÓRIO: o do Badlion é retrato (300x342) e o
   width/height quadrado do <img> o achatava. Com contain ele encaixa inteiro,
   respeitando a proporção. */
.mc-bar-ico-logo { border: 0; background: none; padding: 0; overflow: hidden; }
.mc-bar-ico-logo img { width: 44px; height: 44px; object-fit: contain; display: block; }
@media (max-width: 600px) { .mc-bar-ico-logo img { width: 34px; height: 34px; } }
/* A nossa é a logo de verdade, sem moldura em volta. */
.mc-bar-row.is-us .mc-bar-ico { border: 0; background: none; }
.mc-bar-row.is-us .mc-bar-ico img { width: 44px; height: 44px; display: block; }
@media (max-width: 600px) {
  .mc-bar-row { grid-template-columns: 34px 1fr; gap: var(--s3); }
  .mc-bar-ico, .mc-bar-row.is-us .mc-bar-ico img { width: 34px; height: 34px; font-size: .7rem; }
}

.mc-bar-top { display: flex; justify-content: space-between; align-items: baseline; gap: var(--s3); }
.mc-bar-name { font-size: .88rem; color: var(--text-muted); }
.mc-bar-val {
  font-family: 'Orbitron', sans-serif; font-weight: 700; font-size: .95rem;
  font-variant-numeric: tabular-nums; color: var(--text-muted); flex: none;
}
.mc-bar-track { height: 14px; border-radius: 999px; background: rgba(255, 255, 255, .05); overflow: hidden; }
.mc-bar-fill { height: 100%; border-radius: 999px; background: rgba(184, 168, 207, .35); }
/* A barra em destaque é a nossa — única com a cor da marca. */
.mc-bar-row.is-us .mc-bar-name,
.mc-bar-row.is-us .mc-bar-val { color: var(--text); font-weight: 700; }
.mc-bar-row.is-us .mc-bar-fill { background: var(--grad-btn); box-shadow: 0 0 24px -6px rgba(255, 61, 154, .7); }

/* ── "Como medimos" — metodologia recolhida ───────────────── */
.mc-method { margin: var(--s5) auto 0; max-width: 74ch; }
.mc-method summary {
  cursor: pointer; list-style: none; display: inline-flex; align-items: center; gap: var(--s2);
  color: var(--pink-2); font-size: .86rem; font-weight: 600; padding: var(--s2) 0; min-height: 44px;
}
.mc-method summary::-webkit-details-marker { display: none; }
.mc-method summary::after {
  content: "▾"; font-size: .8rem; transition: transform .2s ease;
}
.mc-method[open] summary::after { transform: rotate(180deg); }
.mc-method .mc-note { text-align: left; margin-left: 0; margin-right: 0; }

/* ── Grade de mods (ícone + nome) ─────────────────────────── */
.mc-modgrid {
  display: grid; grid-template-columns: repeat(auto-fill, minmax(124px, 1fr));
  gap: var(--s2); max-width: 940px; margin: 0 auto;
}
.mc-modtile {
  display: flex; flex-direction: column; align-items: center; gap: var(--s2);
  padding: var(--s4) var(--s2); text-align: center;
  border: 1px solid var(--border); border-radius: 14px; background: rgba(26, 16, 39, .6);
  transition: border-color .2s ease, transform .2s ease;
}
.mc-modtile:hover { border-color: rgba(255, 109, 193, .38); transform: translateY(-2px); }
.mc-modtile span { font-size: .8rem; color: var(--text-muted); line-height: 1.3; }

/* Modo Turbo e Entity Culling: são os dois que mais rendem FPS no motor do
   client, então saem da grade escondida e ganham destaque na visível. */
.mc-modtile.is-hot {
  border-color: rgba(255, 61, 154, .5);
  background: linear-gradient(180deg, rgba(255, 61, 154, .15), rgba(26, 16, 39, .6));
  box-shadow: 0 8px 26px -14px rgba(255, 61, 154, .8);
}
.mc-modtile.is-hot:hover { border-color: var(--pink-1); }
.mc-modtile.is-hot span { color: var(--text); font-weight: 600; }
.mc-modtile.is-hot .mc-modicon { stroke: var(--pink-1); }
.mc-modflag {
  font-size: .58rem; font-weight: 800; letter-spacing: .05em;
  color: #fff; background: var(--pink-1);
  padding: 2px 8px; border-radius: 999px; line-height: 1.6;
}
.mc-modicon {
  width: 22px; height: 22px; flex: none;
  stroke: var(--pink-2); stroke-width: 1.7; fill: none;
  stroke-linecap: round; stroke-linejoin: round;
}
@media (max-width: 600px) {
  .mc-modgrid { grid-template-columns: repeat(auto-fill, minmax(100px, 1fr)); }
  .mc-modtile { padding: var(--s3) var(--s1); }
  .mc-modtile span { font-size: .72rem; }
}

/* ── Print do client ──────────────────────────────────────── */
.mc-shot { margin: 0; }
/* Mesmo comportamento da demonstração do Hub (download.css:124-137):
   nasce levemente inclinada pra trás e endireita no hover. */
.mc-shot img {
  display: block; width: 100%; height: auto;
  border: 1px solid var(--border); border-radius: 16px;
  box-shadow: 0 24px 70px -24px rgba(255, 61, 154, .35);
  background: var(--bg-1);
  transform: perspective(1800px) rotateX(2deg);
  transition: transform .4s ease, box-shadow .4s ease;
}
.mc-shot img:hover {
  transform: perspective(1800px) rotateX(0deg) scale(1.01);
  box-shadow: 0 34px 90px -24px rgba(255, 61, 154, .48);
}
.mc-shot figcaption {
  margin: var(--s4) auto 0; max-width: 68ch; text-align: center;
  color: var(--text-muted); font-size: .86rem; line-height: 1.7;
}

/* ── Galeria das telas do launcher ─────────────────────────── */
.mc-tour-abas {
  display: flex; flex-wrap: wrap; justify-content: center; gap: var(--s2);
  margin-bottom: var(--s5);
}
.mc-tour-abas[hidden] { display: none; }
.mc-aba {
  font: inherit; font-size: .84rem; font-weight: 600;
  color: var(--text-muted); cursor: pointer;
  padding: 8px 16px; border-radius: 999px;
  border: 1px solid var(--border); background: rgba(26, 16, 39, .55);
  transition: color .2s ease, background .2s ease, border-color .2s ease;
}
.mc-aba:hover { color: var(--text); border-color: rgba(255, 109, 193, .4); }
.mc-aba[aria-selected="true"] {
  color: #14081f; border-color: transparent;
  background: linear-gradient(135deg, var(--pink-2), var(--purple));
}
/* ⚠️ A inclinação do .mc-shot img some ao trocar de aba se a figura entrar com
   `hidden` e voltar: o browser não anima de display:none. Por isso a troca é só
   de visibilidade lógica, e a imagem já nasce na posição final. */
.mc-tela[hidden] { display: none; }
/* Sem JS as cinco ficam empilhadas — o espaço entre elas é o que separa uma
   história da outra. Com JS só uma aparece e a margem não incomoda. */
.mc-tela + .mc-tela { margin-top: var(--s7); }
@media (max-width: 700px) {
  .mc-aba { font-size: .78rem; padding: 7px 12px; }
}

/* ── Seções ───────────────────────────────────────────────── */
.mc-sec { padding: var(--s8) 0; }
.mc-sec-head { text-align: center; margin-bottom: var(--s7); }
.mc-h2 { font-size: clamp(1.5rem, 4vw, 2.2rem); font-weight: 700; margin-bottom: var(--s3); }
.mc-sec-head p { color: var(--text-muted); max-width: 62ch; margin: 0 auto; }

.mc-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); gap: var(--s4); }
.mc-card {
  background: var(--card); border: 1px solid var(--border); border-radius: 16px;
  padding: var(--s5); transition: transform .2s ease, border-color .2s ease;
}
.mc-card:hover { transform: translateY(-3px); border-color: rgba(255, 109, 193, .35); }
.mc-ico {
  width: 44px; height: 44px; border-radius: 12px; display: grid; place-items: center;
  background: rgba(255, 61, 154, .10); border: 1px solid var(--border); margin-bottom: var(--s4);
}
.mc-ico svg {
  width: 22px; height: 22px; stroke: var(--pink-2); stroke-width: 1.8;
  fill: none; stroke-linecap: round; stroke-linejoin: round;
}
.mc-card h3 { font-size: 1.02rem; font-weight: 700; margin-bottom: var(--s2); }
.mc-card p { color: var(--text-muted); font-size: .92rem; margin: 0; }
.mc-card p + p { margin-top: var(--s2); }

.mc-mods-note { margin-top: var(--s5); text-align: center; color: var(--text-muted); font-size: .86rem; }

/* "ver os outros 19" — mesma linguagem do "Como medimos". */
.mc-more { margin-top: var(--s4); text-align: center; }
.mc-more summary {
  cursor: pointer; list-style: none; display: inline-flex; align-items: center; gap: var(--s2);
  color: var(--pink-2); font-size: .86rem; font-weight: 600; padding: var(--s2) var(--s4); min-height: 44px;
}
.mc-more summary::-webkit-details-marker { display: none; }
.mc-more summary::after { content: "▾"; font-size: .8rem; transition: transform .2s ease; }
.mc-more[open] summary::after { transform: rotate(180deg); }
.mc-more .mc-modgrid { margin-top: var(--s4); }

/* FAQ */
.mc-faq { max-width: 780px; margin: 0 auto; display: grid; gap: var(--s3); }
.mc-q { background: var(--card); border: 1px solid var(--border); border-radius: 14px; overflow: hidden; }
.mc-q summary {
  cursor: pointer; list-style: none; padding: var(--s4) var(--s5);
  font-weight: 600; display: flex; justify-content: space-between; align-items: center;
  gap: var(--s4); min-height: 56px;
}
.mc-q summary::-webkit-details-marker { display: none; }
.mc-q summary::after { content: "+"; font-family: 'Orbitron', sans-serif; color: var(--pink-2); font-size: 1.3rem; flex: none; }
.mc-q[open] summary::after { content: "–"; }
.mc-q p { margin: 0; padding: 0 var(--s5) var(--s5); color: var(--text-muted); font-size: .94rem; }
.mc-q p + p { padding-top: 0; margin-top: calc(var(--s3) * -1 + var(--s3)); }

/* CTA final */
.mc-final {
  text-align: center; padding: var(--s8) var(--s5); margin: var(--s8) 0 0;
  border: 1px solid var(--border); border-radius: 24px;
  background: radial-gradient(70% 120% at 50% 0%, rgba(255, 61, 154, .14), transparent 70%), var(--card);
}
.mc-final h2 { margin-bottom: var(--s3); }
/* text-wrap: balance iguala o comprimento das linhas — sem ele o texto está
   centralizado mas as quebras ficam tortas e ele PARECE desalinhado. */
.mc-final h2, .mc-final p { text-wrap: balance; }
.mc-final p { color: var(--text-muted); max-width: 52ch; margin: 0 auto var(--s6); }

/* Aviso legal da Mojang. Fica como COLUNA DO MEIO do .footer-inner (que é
   flex com space-between), entre a marca e os links — antes ele morava solto
   embaixo, colado no chão do rodapé. O text-align é obrigatório: sem ele o
   texto herda o alinhamento à esquerda e fica torto dentro do próprio bloco. */
.mc-legal {
  /* o .footer-inner alinha as colunas pelo topo (align-items: flex-start);
     este respiro desce o aviso pra ele não empatar com a linha da marca */
  flex: 1 1 300px; max-width: 470px; margin: var(--s6) 0 0;
  text-align: center; text-wrap: balance;
  color: var(--text-muted); font-size: .78rem; line-height: 1.6; opacity: .8;
}
/* Só nesta página: os links viram uma coluna estreita (2-3 linhas) pra abrir
   espaço no meio. Em 1280px a régua é essa — marca 360 + links 593 + 60 de gap
   deixava 98px de sobra, e o aviso era jogado pra linha de baixo. */
.mc-page ~ .footer .footer-links { max-width: 250px; }
@media (max-width: 900px) {
  /* empilhado, cada um ocupa a linha inteira */
  .mc-legal { flex: 1 1 100%; max-width: none; margin-top: var(--s3); }
  .mc-page ~ .footer .footer-links { max-width: none; }
}

/* Aviso do SmartScreen — mesma linguagem visual do bloco da aba /download,
   porque os dois instaladores passam exatamente pelo mesmo caminho. */
.mc-warn {
  display: flex; gap: 18px; margin: var(--s8) auto 0; max-width: 800px;
  padding: 22px 26px; border-radius: 16px;
  background: linear-gradient(135deg, rgba(255, 188, 56, .10), rgba(255, 188, 56, .04));
  border: 1px solid rgba(255, 188, 56, .35);
}
.mc-warn-icon { font-size: 32px; flex-shrink: 0; line-height: 1; }
.mc-warn-body { flex: 1; min-width: 0; }
.mc-warn-body h3 { font: 800 18px/1.3 Orbitron, sans-serif; margin: 0 0 8px; color: #ffd680; }
.mc-warn-body p { margin: 0 0 8px; font-size: 14px; line-height: 1.55; color: rgba(245, 237, 255, .85); }
.mc-warn-body p:last-child { margin-bottom: 0; }
.mc-warn-body strong { color: #fff; }
.mc-warn-steps { margin: 6px 0 10px 22px; padding: 0; }
.mc-warn-steps li { font-size: 14px; line-height: 1.7; color: rgba(245, 237, 255, .85); }
.mc-warn-steps li strong { color: #ffd680; }
.mc-warn-note { font-size: 12px !important; opacity: .7; font-style: italic; margin-top: 10px !important; }
@media (max-width: 600px) {
  .mc-warn { flex-direction: column; gap: 12px; padding: 20px 18px; }
}

/* ── Responsivo — usando os breakpoints que o site já usa
      (900 e 600), não o 640 solto da versão standalone. ─────── */
@media (max-width: 900px) {
  .mc-hero { padding: var(--s7) 0 var(--s6); }
  .mc-sec { padding: var(--s7) 0; }
  .mc-sec-head { margin-bottom: var(--s6); }
}
@media (max-width: 600px) {
  .mc-actions { flex-direction: column; }
  .mc-cta, .mc-cta-2 { width: 100%; justify-content: center; }
  .mc-final { padding: var(--s7) var(--s4); border-radius: 18px; }
  .mc-wrap { padding: 0 var(--s4); }
}

/* Este bloco desligava TODA animação e transição da página quando o sistema
   pedia menos movimento — inclusive a flutuação da logo e os hovers. No Windows
   isso vem de "Animar controles e elementos", que muita gente desmarca por
   desempenho, e o resultado era a página inteira parecer estática/quebrada.
   Removido de propósito; ver a nota no bloco .mc-bg lá em cima. Se voltar a
   fazer sentido, o certo é um botão de "reduzir movimento" na própria página,
   com o estado guardado, e não amarrar na preferência do sistema. */

/* Rodapé do CTA final — o essencial da instalação, sem virar seção própria. */
.mc-final-note { margin-top: var(--s5); font-size: .84rem; opacity: .85; }

/* ════════════════════════════════════════════════════════════
   SUB-ABAS DO CLIENT  (/client  ·  /client/cosmeticos)
   Usadas nas DUAS páginas — o marcador é a classe .is-active,
   trocada à mão em cada HTML (não tem JS decidindo isso).
   ════════════════════════════════════════════════════════════ */
.mc-tabs { display: flex; justify-content: center; padding: var(--s6) var(--s5) 0; }
.mc-tabs-inner {
  display: inline-flex; gap: var(--s1); padding: var(--s1);
  border: 1px solid var(--border); border-radius: 999px;
  /* opaco de propósito: o vídeo de fundo passa por trás e, translúcido
     demais, o rótulo da aba inativa some contra as nuvens claras */
  background: rgba(18, 11, 28, .82);
  -webkit-backdrop-filter: blur(8px); backdrop-filter: blur(8px);
  max-width: 100%; overflow-x: auto;
}
.mc-tab {
  display: inline-flex; align-items: center; gap: var(--s2);
  padding: 10px var(--s5); border-radius: 999px; white-space: nowrap;
  color: var(--text-muted); text-decoration: none;
  font-weight: 600; font-size: .9rem;
  transition: color .2s ease, background .2s ease;
}
.mc-tab:hover { color: var(--text); background: rgba(255, 255, 255, .05); }
.mc-tab.is-active {
  color: #fff; background: var(--grad-btn);
  box-shadow: 0 6px 20px -10px rgba(255, 61, 154, .9);
}
/* Selo "em breve" — âmbar, a mesma cor de aviso do bloco do SmartScreen. */
.mc-tab-soon {
  font-size: .56rem; font-weight: 800; letter-spacing: .06em; text-transform: uppercase;
  padding: 2px 7px; border-radius: 999px; line-height: 1.6;
  background: rgba(255, 188, 56, .18); color: #ffd680;
  border: 1px solid rgba(255, 188, 56, .35);
}
/* Dentro da aba ativa o âmbar brigaria com o rosa do fundo. */
.mc-tab.is-active .mc-tab-soon {
  background: rgba(255, 255, 255, .22); color: #fff; border-color: rgba(255, 255, 255, .35);
}
/* Com as abas em cima, o respiro do hero já veio delas. */
.mc-tabs + .mc-hero { padding-top: var(--s6); }
@media (max-width: 600px) {
  .mc-tabs { padding: var(--s5) var(--s4) 0; }
  .mc-tab { padding: 10px var(--s4); font-size: .84rem; }
}

/* ── Página de cosméticos ─────────────────────────────────── */
/* Hero curto: esta página não tem o que provar, só o que anunciar. */
.mc-hero-sm { padding-bottom: var(--s5); }
.mc-hero-sm .mc-h1 { font-size: clamp(1.7rem, 5vw, 2.9rem); }

/* Selo "Em construção" — variante âmbar do .mc-badge rosa. */
.mc-badge-wip {
  background: rgba(255, 188, 56, .10);
  border-color: rgba(255, 188, 56, .35);
  color: #ffd680;
}

/* Grade de tipos de cosmético. Mesma linguagem do .mc-card, mais o selo.
   minmax de 300px e não 240: com 240 cabiam 4 colunas e os 6 cards viravam
   4 + 2, deixando um buraco na segunda linha. Com 300 fecha 3 + 3. */
/* 5 categorias em uma linha só: elas são a PROMESSA, não o produto — a vitrine
   de capas acima é que carrega o peso. Card menor e mais baixo mantém a
   hierarquia. Em 1072px, 5 × 190 + 4 × 16 = 1014, cabe. */
.mc-cosgrid { display: grid; grid-template-columns: repeat(auto-fit, minmax(190px, 1fr)); gap: var(--s4); }
.mc-cos {
  position: relative;
  background: var(--card); border: 1px solid var(--border); border-radius: 16px;
  padding: var(--s5); transition: transform .2s ease, border-color .2s ease;
}
.mc-cos:hover { transform: translateY(-3px); border-color: rgba(255, 109, 193, .35); }
.mc-cos h3 { font-size: 1.02rem; font-weight: 700; margin-bottom: var(--s2); }
.mc-cos p { color: var(--text-muted); font-size: .9rem; margin: 0 0 var(--s4); }
.mc-cos-tag {
  display: inline-block;
  font-size: .62rem; font-weight: 800; letter-spacing: .06em; text-transform: uppercase;
  padding: 3px 10px; border-radius: 999px;
  background: rgba(255, 188, 56, .14); color: #ffd680;
  border: 1px solid rgba(255, 188, 56, .32);
}

/* ══════════════════════════════════════════════════════════════
   VITRINE DE CAPAS
   O truque que faz uma loja de cosmético parecer cara é a arte
   ser um PRODUTO FOTOGRAFADO: objeto inclinado, com espessura e
   sombra no chão, sobre fundo de estúdio CLARO — dentro de uma
   página escura. O claro no meio do escuro é o que faz saltar.
   Aqui isso é CSS puro (perspectiva + 3 planos), não render 3D:
   quando existir arte de verdade, é só trocar o --arte por
   `url(...)` que o resto do palco continua valendo.
   ══════════════════════════════════════════════════════════════ */
.mc-slots {
  display: grid; grid-template-columns: repeat(auto-fill, minmax(210px, 1fr));
  gap: var(--s5) var(--s4); max-width: 1000px; margin: 0 auto;
}

/* O palco. aspect-ratio 1 (quadrado) é o formato que o olho lê como
   "ficha de produto" — retângulo alto lê como banner. */
.cape-stage {
  position: relative; aspect-ratio: 1; border-radius: 12px; overflow: hidden;
  display: grid; place-items: center;
  perspective: 900px;
  background:
    radial-gradient(105% 80% at 50% 8%, #f6f3f9 0%, #ded8e8 45%, #b9b0cc 100%);
  transition: box-shadow .35s ease;
}
/* Vinheta: sem ela o quadrado claro fica chapado e "adesivado" na página. */
.cape-stage::after {
  content: ""; position: absolute; inset: 0; pointer-events: none;
  background: radial-gradient(78% 62% at 50% 42%, transparent 55%, rgba(38, 20, 60, .22));
}

/* A capa. Proporção 10/16 é a da capa do Minecraft vista de costas. */
.cape {
  position: relative; width: 47%; aspect-ratio: 10 / 16;
  transform-style: preserve-3d;
  transform: rotateY(-26deg) rotateX(3deg) translateZ(0);
  transition: transform .55s cubic-bezier(.22, 1, .36, 1);
}
.cape-face {
  position: absolute; inset: 0; border-radius: 3px;
  background: var(--arte, linear-gradient(160deg, #ff3d9a, #a04bff));
  background-size: cover; background-position: center;
  /* luz vindo de cima-esquerda + barra escura na dobra da direita:
     é o que dá volume sem precisar de textura de tecido */
  box-shadow:
    inset 0 0 0 1px rgba(255, 255, 255, .22),
    inset -14px 0 24px -12px rgba(0, 0, 0, .55),
    inset 26px 0 30px -26px rgba(255, 255, 255, .5);
}
/* Espessura: um plano girado 90° na borda direita. Sem isto a capa
   é um adesivo; com isto ela vira objeto. */
.cape-edge {
  position: absolute; top: 0; right: 0; width: 9px; height: 100%;
  transform-origin: right center; transform: rotateY(90deg);
  background: linear-gradient(180deg, #4a4159, #2a2438);
  border-radius: 0 3px 3px 0;
}
/* Sombra no chão do estúdio, em DUAS camadas — é o que separa "objeto apoiado"
   de "adesivo flutuando". A de contato é curta, escura e quase sem blur, colada
   na base; a ambiente é larga e difusa. Com uma só, a peça pairava. */
/* z-index é obrigatório: sem ele a sombra é pintada DEPOIS da capa e vira uma
   mancha escura na barra dela, em vez de chão. E o `bottom` tem que cair abaixo
   da base real — a capa ocupa 47% x (16/10), então sobra ~12% de folga embaixo. */
.cape-shadow {
  position: absolute; left: 50%; bottom: 10.5%; z-index: 0;
  width: 44%; height: 3.4%;
  transform: translateX(-54%);
  background: radial-gradient(closest-side, rgba(28, 12, 46, .55), transparent 76%);
  filter: blur(4px);
}
.cape-shadow::before {
  content: ""; position: absolute; left: 50%; top: -40%;
  width: 210%; height: 420%;
  transform: translateX(-50%);
  background: radial-gradient(closest-side, rgba(40, 22, 62, .26), transparent 70%);
  filter: blur(11px);
}
.cape { z-index: 1; }

/* Hover: a peça se endireita e cresce um degrau — a mesma leitura de
   "pegar na mão" que a loja do Lunar dá com o loop de vídeo. */
.cape-card:hover .cape,
.cape-card:focus-within .cape { transform: rotateY(-8deg) rotateX(1deg) scale(1.07); }
.cape-card:hover .cape-stage { box-shadow: 0 18px 44px -20px rgba(255, 61, 154, .75); }

/* O card é <article> na vitrine e <a> na seção "outras capas". Como <a>, ele
   PRECISA de cor e text-decoration próprios — sem isso cai no azul #0000EE do
   navegador. Cor explícita e não `inherit`: inherit já despintou o menu deste
   site uma vez, por empatar em especificidade com `.nav-links a`. */
/* Moldura: o card vira ficha de produto em vez de arte solta na página.
   ⚠️ Com moldura, o brilho rosa do hover muda de dono — sai do palco e passa
   pro card inteiro, senão acende uma caixa dentro da outra. */
.cape-card {
  display: block; color: var(--text); text-decoration: none;
  background: rgba(23, 16, 31, .55);
  border: 1px solid var(--border);
  border-radius: 16px;
  padding: 10px;
  transition: transform .12s ease, box-shadow .35s ease, border-color .35s ease;
}
.cape-card:hover,
.cape-card:focus-within {
  box-shadow: 0 18px 44px -20px rgba(255, 61, 154, .6);
  border-color: rgba(255, 109, 193, .38);
}
.cape-card:hover .cape-stage,
.cape-card:focus-within .cape-stage,
.cape-card:hover .geo-stage,
.cape-card:focus-within .geo-stage { box-shadow: none; }
.cape-card .cape-stage, .cape-card .geo-stage { border-radius: 10px; }
/* :active é o único retorno que existe no CELULAR, onde hover não acontece —
   sem ele, tocar num card não responde nada até a página trocar. */
.cape-card:active { transform: scale(.985); }
.cape-card:hover .cape-name { color: var(--pink-2); }
/* Nome em cima, preço embaixo — e não os dois na mesma linha. Com nomes de
   tamanho variável ("Paisagem Vermelha" x "Aurora") a linha única quebrava e
   empurrava o preço pra baixo em alguns cards e não em outros, desalinhando a
   grade inteira. É a mesma escolha que a loja do Lunar faz. */
.cape-meta { display: flex; flex-direction: column; gap: 3px; margin-top: var(--s3); }
.cape-linha { display: flex; align-items: center; gap: var(--s2); }
.cape-name { font-size: .92rem; font-weight: 600; color: var(--text); line-height: 1.3; transition: color .2s ease; }
.cape-tag {
  margin-left: auto; flex: none;
  font-size: .58rem; font-weight: 800; letter-spacing: .06em; text-transform: uppercase;
  padding: 3px 9px; border-radius: 999px;
  background: rgba(255, 188, 56, .14); color: #ffd680;
  border: 1px solid rgba(255, 188, 56, .32);
}
@media (max-width: 600px) {
  .mc-slots { grid-template-columns: repeat(2, 1fr); gap: var(--s4) var(--s3); }
  .cape { width: 48%; }
}

/* ══════════════════════════════════════════════════════════════
   PÁGINA DE PRODUTO  (/client/cosmeticos/<slug>)
   Manequim NEUTRO em vez de skin: não temos a skin de ninguém, e
   manequim de vitrine é justamente o que faz a peça ser a estrela.
   Mesmo truque da vitrine — planos com espessura, não cubos: o
   Minecraft já é chapado, e 2 faces por parte bastam nesta vista.
   ══════════════════════════════════════════════════════════════ */
.prod-grid {
  display: grid; grid-template-columns: minmax(0, 1.15fr) minmax(0, 1fr);
  gap: var(--s6); align-items: start;
}
@media (max-width: 900px) { .prod-grid { grid-template-columns: 1fr; gap: var(--s5); } }

/* ── Palco do visualizador ───────────────────────────────────── */
.viewer {
  position: relative; aspect-ratio: 4 / 3.4; border-radius: 16px; overflow: hidden;
  display: grid; place-items: center; perspective: 1100px;
  background: radial-gradient(100% 78% at 50% 6%, #f7f4fa 0%, #ded8e8 46%, #b6adca 100%);
}
.viewer::after {
  content: ""; position: absolute; inset: 0; pointer-events: none;
  background: radial-gradient(76% 60% at 50% 44%, transparent 52%, rgba(38, 20, 60, .24));
}

/* Manequim. --u é a unidade do Minecraft (a cabeça tem 8 delas). */
.mq {
  --u: 7px;
  --pele: #322a46; --pele-lado: #241e34;
  position: relative; z-index: 1;
  width: calc(var(--u) * 16); height: calc(var(--u) * 32);
  transform-style: preserve-3d;
  transform: rotateY(-21deg) rotateX(2deg);
  animation: mq-gira 14s ease-in-out infinite;
}
/* Giro lento e curto: mostra o volume sem virar carrossel. */
@keyframes mq-gira {
  0%, 100% { transform: rotateY(-21deg) rotateX(2deg); }
  50%      { transform: rotateY(-4deg)  rotateX(2deg); }
}
.mq-part {
  position: absolute; transform-style: preserve-3d;
  background: var(--pele); border-radius: 1px;
}
/* A lateral é o que dá espessura — sem ela o manequim é recorte de papel. */
.mq-part::after {
  content: ""; position: absolute; top: 0; right: 0;
  width: var(--prof, calc(var(--u) * 4)); height: 100%;
  transform-origin: right center; transform: rotateY(90deg);
  background: var(--pele-lado);
}
.mq-head { --prof: calc(var(--u) * 8); top: 0; left: calc(var(--u) * 4); width: calc(var(--u) * 8); height: calc(var(--u) * 8); }
.mq-body { top: calc(var(--u) * 8); left: calc(var(--u) * 4); width: calc(var(--u) * 8); height: calc(var(--u) * 12); }
.mq-arm  { top: calc(var(--u) * 8); width: calc(var(--u) * 4); height: calc(var(--u) * 12); }
.mq-arm.is-l { left: 0; }
.mq-arm.is-r { left: calc(var(--u) * 12); }
.mq-leg  { top: calc(var(--u) * 20); width: calc(var(--u) * 4); height: calc(var(--u) * 12); }
.mq-leg.is-l { left: calc(var(--u) * 4); }
.mq-leg.is-r { left: calc(var(--u) * 8); }

/* A CAPA — o produto. Proporção 10x16 e pendurada um pouco à frente
   das costas (é a vista que a página mostra), com balanço de vento. */
.mq-cape {
  position: absolute; top: calc(var(--u) * 8.6); left: calc(var(--u) * 3);
  width: calc(var(--u) * 10); height: calc(var(--u) * 16);
  transform-origin: top center;
  transform: translateZ(calc(var(--u) * 2.6)) rotateX(-4deg);
  animation: mq-vento 5.5s ease-in-out infinite;
  background: var(--arte, linear-gradient(160deg, #ff3d9a, #a04bff));
  background-size: cover; background-position: center;
  border-radius: 2px;
  box-shadow:
    inset 0 0 0 1px rgba(255, 255, 255, .2),
    inset -16px 0 26px -14px rgba(0, 0, 0, .5),
    -6px 10px 26px -10px rgba(28, 12, 46, .55);
}
@keyframes mq-vento {
  0%, 100% { transform: translateZ(calc(var(--u) * 2.6)) rotateX(-4deg); }
  50%      { transform: translateZ(calc(var(--u) * 3.4)) rotateX(-11deg); }
}

.viewer-shadow {
  position: absolute; left: 50%; bottom: 11%; z-index: 0;
  width: 30%; height: 3%;
  transform: translateX(-50%);
  background: radial-gradient(closest-side, rgba(28, 12, 46, .5), transparent 76%);
  filter: blur(5px);
}
.viewer-shadow::before {
  content: ""; position: absolute; left: 50%; top: -70%;
  width: 230%; height: 500%; transform: translateX(-50%);
  background: radial-gradient(closest-side, rgba(40, 22, 62, .24), transparent 70%);
  filter: blur(12px);
}
/* Legenda do palco: diz que o boneco é manequim, não a skin de ninguém. */
.viewer-note {
  position: absolute; left: 14px; bottom: 12px; z-index: 2;
  font-size: .68rem; color: rgba(40, 24, 62, .62);
  background: rgba(255, 255, 255, .5); padding: 4px 10px; border-radius: 999px;
  -webkit-backdrop-filter: blur(4px); backdrop-filter: blur(4px);
}

/* ── Coluna de informação ────────────────────────────────────── */
.prod-info h1 { font-size: clamp(1.6rem, 4vw, 2.3rem); margin-bottom: var(--s3); }
.prod-price { display: flex; align-items: baseline; gap: var(--s3); margin-bottom: var(--s4); }
.prod-price b {
  font-family: 'Orbitron', sans-serif; font-size: 1.35rem; font-weight: 800;
  font-variant-numeric: tabular-nums;
  background: linear-gradient(135deg, var(--pink-2), var(--purple));
  -webkit-background-clip: text; background-clip: text; color: transparent;
}
.prod-soon {
  font-size: .62rem; font-weight: 800; letter-spacing: .06em; text-transform: uppercase;
  padding: 4px 10px; border-radius: 999px;
  background: rgba(255, 188, 56, .14); color: #ffd680; border: 1px solid rgba(255, 188, 56, .32);
}
.prod-tags { display: flex; flex-wrap: wrap; gap: var(--s2); margin-bottom: var(--s4); }
.prod-tag {
  font-size: .74rem; color: var(--text-muted);
  padding: 4px 11px; border-radius: 999px;
  border: 1px solid var(--border); background: rgba(26, 16, 39, .5);
}
.prod-desc { color: var(--text-muted); font-size: .95rem; line-height: 1.7; margin: 0 0 var(--s5); }

/* CTA travado: o Lunar usa botão translúcido luminoso em vez de bloco sólido —
   fica elegante no escuro. Aqui ele nasce desabilitado porque não há venda. */
.prod-cta {
  display: flex; align-items: center; justify-content: center; gap: var(--s2);
  width: 100%; min-height: 52px; padding: var(--s3) var(--s5);
  border-radius: 14px; font-family: 'Orbitron', sans-serif; font-weight: 700; font-size: 1rem;
  border: 1px solid rgba(255, 61, 154, .5);
  background: rgba(255, 61, 154, .12); color: var(--pink-2);
  cursor: pointer; transition: background .2s ease, transform .2s ease;
}
.prod-cta:hover:not([disabled]) { background: rgba(255, 61, 154, .2); transform: translateY(-2px); }
.prod-cta[disabled] { opacity: .55; cursor: not-allowed; border-style: dashed; }
.prod-cta-note { margin: var(--s3) 0 0; font-size: .78rem; color: var(--text-muted); text-align: center; }

/* ── Compatibilidade ────────────────────────────────────────── */
.prod-compat { margin-top: var(--s6); border-top: 1px solid var(--border); padding-top: var(--s5); }
.prod-compat h3 { font-size: .95rem; margin-bottom: var(--s3); }
.prod-compat-row { display: flex; flex-wrap: wrap; align-items: center; gap: var(--s2); margin-bottom: var(--s3); }
.prod-compat-row > span:first-child { font-size: .78rem; color: var(--text-muted); margin-right: var(--s2); }
.chip {
  font-size: .72rem; font-weight: 600; padding: 4px 11px; border-radius: 999px;
  border: 1px solid; white-space: nowrap;
}
.chip.no { color: #ff8095; border-color: rgba(255, 84, 112, .4); background: rgba(255, 84, 112, .1); }
.chip.yes { color: #7ee6a4; border-color: rgba(74, 222, 128, .35); background: rgba(74, 222, 128, .09); }

/* ── Outras capas (rodapé do produto) ───────────────────────── */
.prod-more { margin-top: var(--s8); }
.prod-more .mc-slots { max-width: none; }

/* Estado de carregamento / erro, pra nunca sobrar tela em branco. */
.prod-load { text-align: center; color: var(--text-muted); padding: var(--s8) 0; }

/* Migalha de pão. Precisa de regra própria: link SEM cor declarada cai no
   azul #0000EE do navegador, que sobre fundo escuro grita. Já mordeu nesta
   página. O `:not(.btn)` é a regra da casa — nunca pintar <a> de botão. */
.prod-crumb { margin: 0 0 var(--s5); font-size: .84rem; }
.prod-crumb a:not(.btn) {
  color: var(--text-muted); text-decoration: none;
  transition: color .2s ease;
}
.prod-crumb a:not(.btn):hover { color: var(--pink-2); }

/* O canvas do skinview3d ocupa o palco inteiro. object-fit evita distorcer
   quando a proporção do canvas e a do palco não batem exatamente. */
.viewer-canvas {
  position: relative; z-index: 1;
  width: 100%; height: 100%; display: block; object-fit: contain;
  cursor: grab;
}
.viewer-canvas:active { cursor: grabbing; }

/* ══════════════════════════════════════════════════════════════
   CATÁLOGO REAL — a arte da capa entra como <canvas> dentro do
   .cape-face, porque o PNG do Client é um ATLAS: o desenho tem
   que ser recortado (sem espelho) antes de aparecer. Ver as notas
   no client-loja.js.
   ══════════════════════════════════════════════════════════════ */
.cape-canvas {
  position: absolute; inset: 0;
  width: 100%; height: 100%;
  display: block; border-radius: 3px;
  /* pixel art: interpolar borra a arte e some com o traço */
  image-rendering: pixelated;
  image-rendering: crisp-edges;
}
/* quando o .cape-face tem canvas, o gradiente de exemplo não deve aparecer
   por baixo em nenhuma brecha */
.cape-face:has(.cape-canvas) { background: transparent; }
/* ⚠️ ORDEM IMPORTA: esta regra tem que vir DEPOIS da de cima. As duas empatam
   em especificidade (`:has()` herda a do argumento), então quem vence é a
   última — invertê-las mata o efeito sem erro nenhum no console.

   Capa VAZADA (o Rasgo Roxo tem furos no meio e a barra de baixo aberta):
   ali NÃO se desenha nada — é buraco, e buraco mostra o que está atrás.
   ⛔ Já tentei xadrez de transparência aqui; o Juan recusou, e com razão:
   xadrez é linguagem de editor de imagem, não de vitrine.

   ⛔ REGRA: onde a arte não desenha, NADA é desenhado. Nem cor de fundo, nem
   luz, nem espessura. O que aparece ali é o palco, e ponto.

   Isso custou duas tentativas erradas, as duas por pintar ALGUMA coisa no
   vazado — e qualquer cor chapada num recorte retangular lê como TINTA:
     · xadrez de transparência → linguagem de editor de imagem, não de loja;
     · cor da página (escuro)  → a arte desta capa JÁ é preta em cima, então
       o furo escuro fundiu com o tecido e o card virou um retângulo preto
       sólido. Ficou PIOR que o problema original.

   O que estava fazendo o vazado parecer branco não era o palco: eram as três
   coisas que desenham RETÂNGULO por baixo/ao redor da arte —

   1. `box-shadow: none` — o `.cape-face` tem 3 sombras `inset` de luz e dobra
      de tecido, e `inset` pinta ABAIXO do conteúdo: elas vazavam pelo furo,
      inclusive um brilho `rgba(255,255,255,.5)`. Luz de pano onde não há pano.
   2. `background: transparent` — o palco atravessa, e o rasgo se dissolve nele
      em vez de terminar numa borda reta.
   3. `.cape-edge` escondido (regra abaixo) — a espessura é um plano girado 90°
      de ALTURA INTEIRA. Numa capa rasgada ela desenha a lateral de um pano que
      acabou, entregando o retângulo mesmo com o resto certo. */
.cape-face.tem-alfa {
  background: transparent;
  box-shadow: none;
}
/* Sem espessura na capa rasgada — ver item 3 acima. `:has()` porque o
   `.cape-edge` vem ANTES do `.cape-face` no HTML, e `~` só pega irmão
   POSTERIOR. */
.cape:has(> .cape-face.tem-alfa) > .cape-edge { display: none; }
/* arte que não carregou: fica um vazio discreto em vez de quadrado quebrado */
.cape-canvas.is-erro { background: rgba(255, 255, 255, .06); }

/* ══════════════════════════════════════════════════════════════
   PEÇAS 3D (chapéu, asa, cauda, aura, mascote, braço, roupa)
   Palco PRÓPRIO, quadrado — de propósito. O .cape tem `aspect-ratio:
   10/16` cravado porque é pano pendurado; um chapéu ali sai esticado.
   A arte aqui é a PRÉVIA renderizada pelo motor do jogo (620×640 por
   ângulo, fundo transparente), não um atlas recortado. Ver PREVIAS
   no client-loja.js.
   ══════════════════════════════════════════════════════════════ */
.geo-stage {
  position: relative;
  aspect-ratio: 1 / 1;
  display: grid; place-items: center;
  padding: 6%;
  /* O MESMO palco claro da capa (.cape-stage) — e é obrigatório, não enfeite.
     Sem ele a peça flutuava solta no fundo escuro da página enquanto toda capa
     tinha seu cartão: a vitrine mista ficava com dois tratamentos brigando, e
     peça escura (cauda preta, chifre roxo) quase sumia. A sombra de chão logo
     abaixo TAMBÉM só existe por causa daqui: escuro sobre escuro é invisível. */
  border-radius: 12px; overflow: hidden;
  background:
    radial-gradient(105% 80% at 50% 8%, #f6f3f9 0%, #ded8e8 45%, #b9b0cc 100%);
  transition: box-shadow .35s ease;
}
/* Sombra de contato, no chão do estúdio. z-index 0 com a peça em 1: sem isso
   ela é pintada DEPOIS da imagem e vira mancha escura em cima da peça — o
   mesmo tropeço que a .cape-shadow já deu nesta página. */
.geo-stage::before {
  content: ''; position: absolute; left: 50%; bottom: 6%; z-index: 0;
  width: 62%; height: 10%; transform: translateX(-50%);
  background: radial-gradient(ellipse at center, rgba(28, 12, 46, .42), transparent 70%);
  filter: blur(3px);
  pointer-events: none;
}
/* Vinheta: sem ela o quadrado claro fica chapado e "adesivado" na página.
   Mesma conta da .cape-stage::after. */
.geo-stage::after {
  content: ''; position: absolute; inset: 0; z-index: 2; pointer-events: none;
  background: radial-gradient(78% 62% at 50% 42%, transparent 55%, rgba(38, 20, 60, .22));
}
.geo-face { position: relative; z-index: 1; display: block; width: 100%; height: 100%; }
/* Palco um degrau mais escuro nas peças de branco/cinza DOMINANTE (a lista está
   no client-loja.js, medida peça a peça). Sem isto as Asinhas de Anjo — que são
   100% branco — praticamente não têm silhueta sobre o lavanda claro. */
.geo-stage.is-clara {
  background: radial-gradient(105% 80% at 50% 8%, #e6e1ef 0%, #cbc4dc 45%, #a79dbe 100%);
}
/* .geo-img é a arte do CARD (o -card.png, peça sozinha, já no ângulo certo).
   .geo-canvas é a GALERIA da página de produto (recorte da tira com boneco).
   As duas precisam da mesma caixa — sem isso a imagem sai no tamanho natural
   (620×640) e estoura a célula da grade, com rolagem lateral na página. */
.geo-img,
.geo-canvas {
  display: block; width: 100%; height: 100%;
  object-fit: contain;
  /* a prévia vem do render do jogo (não é pixel art de 16px): deixar o
     navegador suavizar fica melhor que `pixelated` aqui */
  /* DOIS passes, nesta ordem:
     1. contorno de contato de 1px — peça PÁLIDA parava de existir sobre o palco
        lavanda. Medido, quanto cada uma perdia de silhueta: Chifres Medux 86%
        (um chapéu de R$14,90 com o card praticamente vazio), Dog Fofo 72%,
        Mini Cutie 55%, Roupa de Maid 33%, Bandana Neon 21%. Em peça escura o
        contorno simplesmente não aparece, então vale pra todas sem exceção.
        ⚠️ Raio acima de ~1,5px vira adesivo com borda. E tinta ROXA, nunca
        preto: preto chapado suja a arte clara.
     2. a sombra de apoio que já existia. */
  filter: drop-shadow(0 0 1px rgba(52, 28, 84, .60))
          drop-shadow(0 6px 14px rgba(28, 12, 46, .4));
  transition: transform .55s cubic-bezier(.22, 1, .36, 1);
}
/* Hover com a mesma leitura da capa — a peça cresce um degrau e o palco acende.
   Sem isto, metade da vitrine respondia ao mouse e a outra metade ficava morta. */
.cape-card:hover .geo-stage,
.cape-card:focus-within .geo-stage { box-shadow: 0 18px 44px -20px rgba(255, 61, 154, .75); }
/* A capa faz movimento de verdade no hover (se endireita e cresce); a peça 3D
   só crescia. Agora ela LEVANTA do chão.
   ⚠️ A sombra de contato é o .geo-stage::before, pseudo-elemento separado — ela
   NÃO acompanha o transform, e é exatamente isso que faz a leitura de "levantar"
   funcionar. Não tentar "consertar" esse descolamento. */
.cape-card:hover .geo-img,
.cape-card:focus-within .geo-img { transform: translateY(-7px) scale(1.06); }
/* Decoração de hover pode respeitar reduced-motion — ao contrário da animação
   da ARTE, que é o produto e não pode parar (senão a loja mente sobre a peça). */
@media (prefers-reduced-motion: reduce) {
  .cape-card:hover .geo-img,
  .cape-card:focus-within .geo-img { transform: none; }
}
.geo-img.is-erro,
.geo-canvas.is-erro { background: rgba(255,255,255,.06); border-radius: 8px; }

/* Fallback da peça enquanto o boneco 3D não sobe (ou sem WebGL). Ocupa o mesmo
   lugar do .cape do palco da capa. */
.geo-fallback {
  position: absolute; inset: 12%;
  display: grid; place-items: center;
}
.geo-fallback .geo-img { max-width: 100%; max-height: 100%; }

/* --- galeria de ângulos (não usada hoje: as vistas com boneco têm régua de
   debug e não vão pra tela de ninguém — ver a nota no client-loja.js) --- */
.geo-viewer { position: relative; display: grid; gap: 12px; }
.geo-grande {
  position: relative;
  aspect-ratio: 1 / 1;
  display: grid; place-items: center;
  background: radial-gradient(ellipse at 50% 40%, rgba(160,75,255,.16), transparent 65%);
  border: 1px solid rgba(255,255,255,.08);
  border-radius: 14px;
  padding: 4%;
}
.geo-grande .geo-canvas { max-height: 100%; }
.geo-angulos { display: flex; gap: 8px; justify-content: center; }
.geo-angulo {
  flex: 0 0 auto; width: 74px;
  display: grid; gap: 2px; justify-items: center;
  padding: 6px 4px;
  background: rgba(255,255,255,.04);
  border: 1px solid rgba(255,255,255,.10);
  border-radius: 10px;
  color: var(--text, #f5edff); font: inherit; font-size: .72rem;
  cursor: pointer;
  transition: border-color .15s, background .15s;
}
.geo-angulo .geo-canvas { width: 56px; height: 56px; filter: none; }
.geo-angulo:hover { background: rgba(255,255,255,.07); }
.geo-angulo.is-on {
  border-color: var(--pink-1, #ff3d9a);
  background: rgba(255,61,154,.10);
}
.geo-angulo:focus-visible { outline: 2px solid var(--pink-1, #ff3d9a); outline-offset: 2px; }

/* contador ao lado do nome do tipo no filtro */
.filtro-conta {
  margin-left: auto; font-style: normal; font-size: .72rem;
  /* ⚠️ era `var(--muted, #9a90a8)` e `--muted` NÃO EXISTE em nenhum arquivo do
     projeto — o contador vinha pintando pelo fallback, por acidente. */
  color: var(--text-muted);
  background: rgba(255,255,255,.06);
  border-radius: 999px; padding: 1px 7px;
}

/* Selo de capa animada e preço, na linha de baixo do card. */
/* O selo agora fica DENTRO do palco, no canto de cima.
   ⚠️ z-index 3 é obrigatório: a vinheta do palco está em 2 e comeria o selo.
   ⚠️ Fundo ESCURO com texto ciano, e não o contrário — o ciano translúcido
   antigo foi desenhado pra fundo escuro e desaparecia sobre o palco lavanda. */
.cape-anim {
  position: absolute; top: 9px; left: 9px; z-index: 3;
  font-size: .58rem; font-weight: 800; letter-spacing: .05em; text-transform: uppercase;
  padding: 2px 8px; border-radius: 999px; line-height: 1.6;
  color: var(--cyan);
  border: 1px solid rgba(43, 214, 230, .45);
  background: rgba(12, 8, 20, .78);
  -webkit-backdrop-filter: blur(3px); backdrop-filter: blur(3px);
}
.cape-preco {
  font-family: 'Orbitron', sans-serif; font-weight: 700; font-size: .82rem;
  font-variant-numeric: tabular-nums;
  /* rosa CLARO: continua sendo a marca, mas para de disputar atenção com a
     arte — que é o que a pessoa veio ver. */
  color: var(--pink-3);
}
.prod-anim {
  font-size: .62rem; font-weight: 800; letter-spacing: .06em; text-transform: uppercase;
  padding: 4px 10px; border-radius: 999px;
  color: var(--cyan); border: 1px solid rgba(43, 214, 230, .4); background: rgba(43, 214, 230, .1);
}

/* Contagem no cabeçalho da vitrine. */
.vitrine-conta {
  display: inline-block; margin-top: var(--s3);
  font-size: .78rem; color: var(--text-muted);
  padding: 4px 12px; border-radius: 999px;
  border: 1px solid var(--border); background: rgba(26, 16, 39, .5);
}

/* ── "Ver com a minha skin" ──────────────────────────────────
   A pessoa digita o nick e o manequim vira a skin dela. É o que
   transforma catálogo em prova — ela se vê usando a capa. */
.prova {
  margin: 0 0 var(--s5); padding: var(--s4);
  border: 1px solid var(--border); border-radius: 14px;
  background: rgba(26, 16, 39, .45);
}
.prova-label {
  display: block; margin-bottom: var(--s2);
  font-size: .78rem; font-weight: 600; color: var(--text-muted);
  letter-spacing: .02em;
}
.prova-linha { display: flex; gap: var(--s2); }
.prova-input {
  flex: 1; min-width: 0;
  padding: 10px 14px; border-radius: 10px;
  border: 1px solid var(--border); background: rgba(8, 6, 13, .6);
  color: var(--text); font: inherit; font-size: .92rem;
}
.prova-input::placeholder { color: rgba(184, 168, 207, .55); }
.prova-input:focus { border-color: var(--pink-2); }
.prova-btn {
  flex: none; padding: 10px 20px; border-radius: 10px; cursor: pointer;
  font-family: 'Orbitron', sans-serif; font-weight: 700; font-size: .86rem;
  border: 1px solid rgba(255, 61, 154, .5);
  background: rgba(255, 61, 154, .14); color: var(--pink-2);
  transition: background .2s ease;
}
.prova-btn:hover:not([disabled]) { background: rgba(255, 61, 154, .24); }
.prova-btn[disabled] { opacity: .6; cursor: wait; }
/* a mensagem ocupa lugar fixo: sem isso a coluna pula quando ela aparece */
.prova-msg { min-height: 1.2em; margin: var(--s2) 0 0; font-size: .78rem; color: var(--text-muted); }
.prova-msg.ok { color: #7ee6a4; }
.prova-msg.erro { color: #ff8095; }
.prova-msg.aviso { color: #ffd680; }

/* ══════════════════════════════════════════════════════════════
   BUSCA E FILTROS DA VITRINE
   Mesma divisão da loja do Lunar: grade à esquerda, coluna de
   filtros à direita. Em telas estreitas a coluna vai pra CIMA da
   grade — quem chega no celular quer filtrar antes de rolar 12
   capas, não depois.
   ══════════════════════════════════════════════════════════════ */
.loja-grid { display: grid; grid-template-columns: minmax(0, 1fr) 236px; gap: var(--s5); align-items: start; }
.loja-main { min-width: 0; }   /* sem isto a grade estoura a coluna */
/* 4 colunas em vez de 3: 49 itens davam ~5.700px de rolagem.
   ⚠️ Alarga a FAIXA da vitrine em vez de encolher o card — assim a arte fica
   quase do mesmo tamanho. A `.mc-slots` tem `max-width: 1000px` própria, que
   precisa ceder aqui dentro, senão a faixa alarga e a grade não acompanha.
   ⚠️ Só a partir de 1200px: entre 901 e 1199 a barra de 236px ainda está do
   lado e forçar 4 colunas espremeria o card. */
@media (min-width: 1400px) {
  /* ⚠️ O `.mc-wrap` da página trava em 1120px, então só pôr max-width na grade
     não alarga nada — dá 4 colunas de 191px, que é o card ESPREMIDO, não o card
     grande. Quem precisa ceder é o wrapper, e só nesta faixa da vitrine:
     1320 − 1120 = 200px, 100 de cada lado. */
  .loja-grid { margin-inline: -100px; }
  .loja-main .mc-slots { max-width: none; grid-template-columns: repeat(4, minmax(0, 1fr)); }
}
/* Entre 1200 e 1399 não há folga pra esticar: mantém 3 colunas grandes em vez
   de 4 apertadas. */
@media (min-width: 1200px) and (max-width: 1399px) {
  .loja-main .mc-slots { max-width: none; grid-template-columns: repeat(3, minmax(0, 1fr)); }
}

.loja-topo {
  display: flex; align-items: center; justify-content: space-between; gap: var(--s4);
  margin-bottom: var(--s4); flex-wrap: wrap;
}
.loja-conta { font-size: .84rem; color: var(--text-muted); }
.loja-ordem-wrap { display: inline-flex; align-items: center; gap: var(--s2); font-size: .78rem; color: var(--text-muted); }
.loja-ordem {
  font: inherit; font-size: .82rem; color: var(--text);
  background: rgba(26, 16, 39, .7); border: 1px solid var(--border);
  border-radius: 10px; padding: 7px 10px; cursor: pointer;
}
.loja-ordem:focus { border-color: var(--pink-2); }

/* ⚠️ A coluna NÃO é sticky, e isso é decisão, não esquecimento.
   Ela era `position: sticky` e mais alta que a tela: 1188px de barra num vão de
   812px deixavam ~376px permanentemente fora — o grupo Tags inteiro e o botão
   "Limpar filtros" ficavam inalcançáveis, sem nenhum sinal de que existiam.
   A primeira correção foi pôr rolagem na COLUNA INTEIRA. Funcionava, mas
   colocava uma barra de rolagem grande na lateral da página, dentro de outra.
   A loja do Lunar resolve melhor e é o que se faz aqui: a coluna desce junto
   com a página, e quem ganha rolagem é o GRUPO comprido, com barra discreta. */
.loja-filtros { display: grid; gap: var(--s4); align-self: start; }

.loja-busca-wrap { position: relative; display: block; }
.loja-busca-wrap svg {
  position: absolute; left: 12px; top: 50%; transform: translateY(-50%);
  width: 15px; height: 15px; stroke: var(--text-muted); stroke-width: 1.9;
  fill: none; stroke-linecap: round; pointer-events: none;
}
.loja-busca {
  width: 100%; padding: 10px 12px 10px 34px;
  border-radius: 10px; border: 1px solid var(--border);
  background: rgba(8, 6, 13, .6); color: var(--text); font: inherit; font-size: .88rem;
}
.loja-busca::placeholder { color: rgba(184, 168, 207, .55); }
.loja-busca:focus { border-color: var(--pink-2); }
/* o X nativo do type=search é cinza e some no escuro */
.loja-busca::-webkit-search-cancel-button { filter: invert(1) opacity(.5); cursor: pointer; }

.filtro-grupo {
  border: 1px solid var(--border); border-radius: 14px;
  background: rgba(18, 11, 28, .6); padding: var(--s3) var(--s4) var(--s4);
}
/* O título vira <summary>: no celular ele é o botão que abre o grupo, no
   desktop os grupos já nascem abertos e ele é só rótulo. */
.filtro-grupo > summary {
  cursor: pointer; list-style: none; display: flex; align-items: center; justify-content: space-between;
  font-size: .72rem; text-transform: uppercase; letter-spacing: .08em;
  color: var(--text-muted); margin: 0 0 var(--s2);
  font-family: 'Inter', sans-serif; font-weight: 700;
  min-height: 24px;
}
.filtro-grupo > summary::-webkit-details-marker { display: none; }
.filtro-grupo > summary::after {
  content: '▾'; font-size: .8rem; transition: transform .2s ease; opacity: .7;
}
.filtro-grupo[open] > summary::after { transform: rotate(180deg); }
/* no desktop a seta some: os grupos ficam abertos e ela vira ruído */
@media (min-width: 901px) { .filtro-grupo > summary { cursor: default; } .filtro-grupo[open] > summary::after { display: none; } }
.filtro-grupo h3 {
  font-size: .72rem; text-transform: uppercase; letter-spacing: .08em;
  color: var(--text-muted); margin: 0 0 var(--s2);
  font-family: 'Inter', sans-serif; font-weight: 700;
}
.filtro-item {
  display: flex; align-items: center; gap: var(--s2);
  padding: 5px 0; cursor: pointer; font-size: .84rem; color: var(--text-muted);
  transition: color .15s ease;
}
.filtro-item:hover { color: var(--text); }
.filtro-item input { accent-color: var(--pink-1); width: 15px; height: 15px; cursor: pointer; flex: none; }
/* ⚠️ O `capitalize` existe só por causa de Cores e Tags, que vêm do banco em
   minúscula ("roxo", "anime"). Ele NÃO pode valer para a barra inteira: numa
   frase escrita à mão ele maiúsculiza cada palavra — "Apenas animadas" virava
   "Apenas Animadas", e "Só o que se mexe" virava "Só O Que Se Mexe".
   Por isso é escopado no `.filtro-chips`, que é exatamente Cores e Tags. */
.filtro-chips .filtro-item span { text-transform: capitalize; }
/* ⛔ SEM font-weight aqui. Marcar mudava cor E peso, e o texto mais largo
   empurrava o contador de lugar — a linha "pulava" no clique. Pior ainda com
   os chips que quebram linha abaixo: um item que engorda perto da borda pula
   de fileira DEBAIXO DO CURSOR. Quem marca o estado é a cor + o checkbox rosa. */
.filtro-item:has(input:checked) { color: var(--text); }
/* Cores e Tags lado a lado, quebrando linha, em vez de uma por fileira. Os dois
   grupos caem de 679px para ~397px e a coluna inteira de 1188 para ~906px.
   ⛔ O <div> vai POR DENTRO do <details>: trocar o display do próprio <details>
   tem histórico de mostrar o conteúdo fechado no Firefox. */
.filtro-chips { display: flex; flex-wrap: wrap; gap: 2px var(--s3); }
.filtro-chips .filtro-item { padding: 4px 0; }
/* Teto POR GRUPO, em vez de rolagem na coluna inteira. Só Cores e Tags têm
   `.filtro-chips`, então só eles podem ganhar barra — Tipo e Opções, que são
   curtos, nunca ganham. Grupo que couber no teto também não ganha nada: o
   `auto` só desenha a barra quando ela é necessária. */
.filtro-chips {
  max-height: 232px;
  overflow-y: auto;
  overscroll-behavior: contain;   /* chegar ao fim não arrasta a página junto */
  padding-right: 6px;             /* a barra não encosta no texto */
}
/* A barra: fina e da cor da casa, não a cinza grossa do sistema.
   Firefox usa as duas primeiras; Chrome e Edge, o bloco ::-webkit abaixo. */
.filtro-chips { scrollbar-width: thin; scrollbar-color: rgba(255, 109, 193, .32) transparent; }
.filtro-chips::-webkit-scrollbar { width: 6px; }
.filtro-chips::-webkit-scrollbar-track { background: transparent; }
.filtro-chips::-webkit-scrollbar-thumb {
  background: rgba(255, 109, 193, .26); border-radius: 999px;
}
.filtro-chips:hover::-webkit-scrollbar-thumb { background: rgba(255, 109, 193, .45); }
.filtro-bola { width: 12px; height: 12px; border-radius: 50%; flex: none; border: 1px solid rgba(255, 255, 255, .22); }

.filtro-limpar {
  width: 100%; padding: 9px; border-radius: 10px; cursor: pointer;
  font: inherit; font-size: .8rem; font-weight: 600;
  border: 1px solid rgba(255, 84, 112, .35);
  background: rgba(255, 84, 112, .1); color: #ff8095;
  transition: background .2s ease;
}
.filtro-limpar:hover { background: rgba(255, 84, 112, .18); }

/* Beco sem saída, com saída. Antes era só uma frase solta — e no desktop o
   filtro culpado podia estar fora da tela, junto com o contador. */
.loja-vazio {
  grid-column: 1 / -1;
  display: grid; place-items: center; gap: var(--s3);
  padding: var(--s7) var(--s4); text-align: center;
  color: var(--text-muted);
  border: 1px dashed var(--border); border-radius: 14px;
  background: rgba(26, 16, 39, .35);
}
.loja-vazio p { margin: 0; }

/* A frase do tipo escolhido, logo abaixo do contador. */
.loja-frase {
  margin: 0 0 var(--s3); max-width: 62ch;
  font-size: .84rem; line-height: 1.55; color: var(--text-muted);
}
.loja-frase[hidden] { display: none; }

/* Os 8 cards de "Os tipos que existem" agora filtram a vitrine. Eles já tinham
   hover de card clicável — só faltava serem clicáveis de verdade. */
.mc-cos[data-tipo] { cursor: pointer; }
.mc-cos[data-tipo]:focus-visible { outline: 3px solid var(--cyan); outline-offset: 3px; }

/* Fita do que está filtrado, entre a linha do topo e a grade. */
.loja-ativos { display: flex; flex-wrap: wrap; gap: var(--s2); margin-bottom: var(--s4); }
.loja-ativos[hidden] { display: none; }
.loja-chip {
  display: inline-flex; align-items: center; gap: 7px;
  font: inherit; font-size: .74rem; color: var(--text);
  padding: 4px 10px; border-radius: 999px; cursor: pointer;
  border: 1px solid rgba(255, 61, 154, .38);
  background: rgba(255, 61, 154, .12);
  /* ⚠️ SEM `capitalize` aqui, pelo mesmo motivo da barra: a fita mistura valor
     do banco ("roxo") com frase escrita à mão ("Apenas animadas") e com a busca
     ("Busca: kuromi"). Quem arruma a primeira letra é o JS, caso a caso. */
  transition: background .18s ease, border-color .18s ease;
}
.loja-chip:hover { background: rgba(255, 61, 154, .22); border-color: var(--pink-2); }
.loja-chip span[aria-hidden] { font-size: .95rem; line-height: 1; opacity: .75; }
/* texto só pra leitor de tela: o × sozinho não diz o que faz */
.sr {
  position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px;
  overflow: hidden; clip-path: inset(50%); white-space: nowrap; border: 0;
}

/* O tipo da peça, na mesma linha do preço. */
.cape-tipo {
  font-size: .7rem; color: var(--text-muted);
  text-transform: lowercase; letter-spacing: .01em;
}
.cape-tipo::after { content: '·'; margin: 0 5px; opacity: .5; }

@media (max-width: 900px) {
  .loja-grid { grid-template-columns: 1fr; }
  /* filtros ANTES da grade no celular */
  .loja-filtros { position: static; order: -1; grid-template-columns: 1fr; }
  /* grupos lado a lado pra não empurrar as capas pra baixo demais */
  .loja-filtros { grid-template-columns: repeat(auto-fit, minmax(160px, 1fr)); align-items: start; }
  .loja-busca-wrap { grid-column: 1 / -1; }
  .filtro-limpar { grid-column: 1 / -1; }
}

/* ── Compra e pagamento ─────────────────────────────────────── */
.compra-presente {
  display: flex; align-items: center; gap: var(--s2);
  margin: var(--s3) 0 0; font-size: .82rem; color: var(--text-muted); cursor: pointer;
}
.compra-presente input { accent-color: var(--pink-1); width: 15px; height: 15px; cursor: pointer; flex: none; }

.compra-metodos { display: flex; gap: var(--s2); margin: var(--s4) 0; }
.compra-metodo {
  flex: 1; display: flex; align-items: center; justify-content: center; gap: var(--s2);
  padding: 10px; border-radius: 10px; cursor: pointer;
  border: 1px solid var(--border); background: rgba(8, 6, 13, .5);
  font-size: .86rem; color: var(--text-muted); transition: border-color .2s, color .2s, background .2s;
}
.compra-metodo:has(input:checked) {
  border-color: var(--pink-2); color: var(--text); background: rgba(255, 61, 154, .1);
}
.compra-metodo input { accent-color: var(--pink-1); cursor: pointer; }

/* ── Painel do pagamento ────────────────────────────────────── */
.pagamento {
  border: 1px solid var(--border); border-radius: 16px;
  background: rgba(18, 11, 28, .7); padding: var(--s5); text-align: center;
}
.pg-titulo { font-family: 'Orbitron', sans-serif; font-weight: 700; font-size: 1.05rem; margin: 0 0 var(--s3); }
.pg-txt { color: var(--text-muted); font-size: .88rem; line-height: 1.6; margin: 0 0 var(--s3); }
.pg-sec { font-size: .8rem; opacity: .85; }
.pg-txt a { color: var(--pink-2); }

/* O QR fica em fundo BRANCO e sem arredondar as quinas da imagem: leitor de
   QR precisa da zona de silêncio clara em volta e dos cantos intactos. */
.pg-qr {
  display: inline-block; padding: 12px; border-radius: 12px;
  background: #fff; margin-bottom: var(--s3); min-height: 60px;
}
.pg-qr-img { display: block; image-rendering: pixelated; }
/* fallback: se a grade não pôde ser reconstruída, mostra em tamanho natural
   dentro de uma caixa com rolagem — encolher quebraria a leitura */
.pg-qr-cru { display: block; max-width: none; width: 260px; image-rendering: pixelated; }

.pg-copiar {
  padding: 10px 18px; border-radius: 10px; cursor: pointer;
  font: inherit; font-size: .86rem; font-weight: 600;
  border: 1px solid rgba(255, 61, 154, .45);
  background: rgba(255, 61, 154, .12); color: var(--pink-2);
  transition: background .2s ease;
}
.pg-copiar:hover { background: rgba(255, 61, 154, .22); }

.pg-codigo {
  width: 100%; margin-top: var(--s3); resize: vertical;
  font: 11px/1.5 ui-monospace, Consolas, monospace;
  background: rgba(8, 6, 13, .7); color: var(--text-muted);
  border: 1px solid var(--border); border-radius: 8px; padding: 8px;
}
.pg-exp { margin: var(--s3) 0 0; font-size: .8rem; color: var(--text-muted); font-variant-numeric: tabular-nums; }
.pg-exp.is-fim { color: #ff8095; }

.pg-status {
  margin-top: var(--s4); padding-top: var(--s3); border-top: 1px solid var(--border);
  font-size: .82rem; color: var(--text-muted);
}
.pg-again {
  margin-left: var(--s2); padding: 6px 12px; border-radius: 8px; cursor: pointer;
  font: inherit; font-size: .78rem; font-weight: 600;
  border: 1px solid var(--border); background: rgba(255, 255, 255, .06); color: var(--text);
}

.pg-erro {
  padding: var(--s4); border-radius: 12px; margin-bottom: var(--s3);
  border: 1px solid rgba(255, 84, 112, .4); background: rgba(255, 84, 112, .1);
  color: #ff8095; font-size: .88rem;
}
.pg-ok .pg-titulo { color: #7ee6a4; }
.pg-voltar { display: inline-flex; margin-top: var(--s2); }

/* Código do presente: grande e fácil de ler em voz alta */
.pg-codigo-box {
  display: flex; align-items: center; justify-content: center; gap: var(--s3);
  flex-wrap: wrap; margin: var(--s3) 0;
  padding: var(--s4); border-radius: 12px;
  border: 1px dashed rgba(255, 188, 56, .45); background: rgba(255, 188, 56, .08);
}
.pg-codigo-box code {
  font-family: 'Orbitron', 'Consolas', monospace; font-size: 1.15rem; font-weight: 700;
  letter-spacing: .08em; color: #ffd680;
}

/* Aviso de preço alterado entre abrir a página e clicar em comprar. */
/* "Já tem essa capa": mesmo painel verde do sucesso, mas com DUAS saídas — ver
   outras capas, ou comprar para outro jogador. Sem a segunda, quem chegou aqui
   querendo dar de presente fica preso numa tela que só sabe dizer não. */
.pg-jatem .pg-titulo { color: #7ee6a4; }
.pg-jatem-acoes { display: flex; flex-wrap: wrap; gap: var(--s2); margin-top: var(--s4); }
.pg-jatem-acoes > * { flex: 1 1 auto; justify-content: center; text-align: center; }

.pg-aviso {
  padding: var(--s4); border-radius: 12px; margin-bottom: var(--s4);
  border: 1px solid rgba(255, 188, 56, .4); background: rgba(255, 188, 56, .08);
}
.pg-aviso .pg-titulo { color: #ffd680; margin-bottom: var(--s2); }
