/* Mochila de Nerd - uma casa, quatro caras. */

*, *::before, *::after { box-sizing: border-box; }
body { margin: 0; }
img { max-width: 100%; height: auto; display: block; }

:root {
  /* A folga do alto de toda página do portal. Uma medida só, um lugar só. */
  --topo-pagina: 30px;
  --violet: #8b5cf6;
  --orange: #ea7317;
  --cyan:   #22d3ee;
  --red:    #c0392b;
  --max: 1180px;
}

/* ---------------- uma casa so: a secao troca a cor, nao o desenho ---------------- */

/* Claro, escuro ou o que o sistema pedir.

   Quem manda é `color-scheme`: em "light dark" o navegador segue o sistema, e cada
   `light-dark(claro, escuro)` abaixo escolhe sozinho o lado certo. Por isso a paleta
   é escrita uma vez só, e não em dois blocos que precisariam andar juntos para
   sempre. O atributo `data-luz` no <html> é a escolha da pessoa: ele só tranca o
   `color-scheme` num dos lados. O servidor carimba esse atributo a partir do cookie,
   então a página já nasce na cor certa — não pisca branco antes do JavaScript.

   Os tons das seções vêm em par: o escuro foi escolhido para contrastar com papel
   branco e sumiria no fundo preto, então no escuro entra o irmão vivo dele. */
html[data-theme="portal"] {
  color-scheme: light dark;
  --bg: light-dark(#ffffff, #0f1116); --bg2: light-dark(#f7f9fc, #171a22);
  --ink: light-dark(#151821, #e8eaf1); --dim: light-dark(#5a6373, #9aa2b4);
  --line: light-dark(#e3e8f0, #272c38);
  --accent: light-dark(#7c3aed, #a78bfa); --accent-vivo: #8b5cf6;
  --radius: 14px; --max: 1120px;
  --font-body: "Inter", system-ui, -apple-system, sans-serif;
  --font-head: "Space Grotesk", "Inter", system-ui, sans-serif;
}
/* Duas cores de tipo, e so duas.

   A cor deste portal significa FRENTE -- 3D laranja, IA ciano, Game verde, a casa violeta,
   Noticias vermelho. Loja e cursos sao da casa, uma voz so em qualquer frente, e por isso
   ganham cor fixa; a coluna de leitura nao ganha, porque cada materia pertence a uma frente
   e a cor dela ja e da frente. Assim a cor continua dizendo uma coisa por vez.

   O azul e o oliva foram os que sobraram. Os cinco tons das frentes ocupam o laranja (26),
   o vermelho (0), o ciano (189), o verde (160) e o violeta (258); o azul da loja cai em 224 e
   o oliva do curso em 86, que e a maior folga que restava -- 60 graus do vizinho mais proximo.
   O dourado seria o tom obvio para certificado, mas fica a 9 graus do laranja do 3D: em cor,
   ser distinguivel vale mais que ser simbolico. */
html[data-theme="portal"] {
  --loja: light-dark(#1d4ed8, #93c5fd);
  --curso: light-dark(#4d7c0f, #a3e635);
  --noticia: light-dark(#b91c1c, #f87171);   /* o mesmo par da frente Noticias */
}
/* A Loja e os Cursos sao itens do menu como as frentes, entao entrar neles pinta a pagina
   inteira igual -- barra, titulos, links e botoes. Se o menu ensina que clicar troca a cor,
   nao pode quebrar em dois casos. */
html[data-theme="portal"][data-tipo="loja"]  { --accent: var(--loja);  --accent-vivo: #2563eb; }
html[data-theme="portal"][data-tipo="lojafisica"] { --accent: light-dark(#0e7490, #22d3ee);
  --accent-vivo: #0e7490; }
html[data-theme="portal"][data-tipo="calculadora"] { --accent: light-dark(#a16207, #fbbf24);
  --accent-vivo: #a16207; }
html[data-theme="portal"][data-tipo="curso"] { --accent: var(--curso); --accent-vivo: #65a30d; }
/* A Plataforma é o roxo da casa: ela não é uma seção entre as outras, é o próprio Mochila de
   Nerd visto por dentro. Sem esta linha ela era o único item do menu que acendia sem pintar
   a barra — o menu ensinava uma regra e quebrava num caso. */
html[data-theme="portal"][data-tipo="plataforma"] { --accent: light-dark(#6d28d9, #c4b5fd);
  --accent-vivo: #7c3aed; }
/* Botão cheio da Plataforma: ele veste o **tom forte**, e não o `--accent`. No tema escuro o
   accent é o lilás claro (é ele que precisa contrastar com o fundo escuro nos títulos e
   links), e um botão lilás claro com letra branca não se lê — era o "Ir para a minha conta"
   quase apagado. O tom forte funciona com letra branca nos dois temas. */
html[data-theme="portal"][data-tipo="plataforma"] .btn,
html[data-theme="portal"][data-tipo="plataforma"] .btn2:not(.leve) {
  background: light-dark(#5b21b6, #6d28d9); color: #fff; border-color: transparent; }
html[data-theme="portal"][data-tipo="plataforma"] .btn:hover,
html[data-theme="portal"][data-tipo="plataforma"] .btn2:not(.leve):hover {
  background: light-dark(#4c1d95, #5b21b6); filter: none; }
html[data-theme="portal"][data-luz="claro"]  { color-scheme: light; }
html[data-theme="portal"][data-luz="escuro"] { color-scheme: dark; }

/* A logo vem em duas versoes -- a escura para o tema claro, a branca para o escuro -- e as
   duas saem na pagina; aqui se esconde a que nao e da vez. Nao da para usar `light-dark()`
   como no resto: o que muda e o arquivo do <img>, e nao uma cor. Vale nos dois temas, portal
   e console, porque quem manda e o `data-luz` do <html> -- o mesmo atributo que tranca o
   `color-scheme`. Os <img> destas classes nascem `inline`, que e o display devolvido a que
   entra em cena. */
.so-escuro { display: none; }
html[data-luz="escuro"] .so-claro  { display: none; }
html[data-luz="escuro"] .so-escuro { display: inline; }
@media (prefers-color-scheme: dark) {
html:not([data-luz="claro"]) .so-claro  { display: none; }
html:not([data-luz="claro"]) .so-escuro { display: inline; }
}
html[data-theme="portal"][data-b="3d"]       { --accent: light-dark(#c2410c, #fb923c);
                                               --accent-vivo: #ea7317; }
html[data-theme="portal"][data-b="ia"]       { --accent: light-dark(#0e7490, #22d3ee);
                                               --accent-vivo: #06b6d4; }
html[data-theme="portal"][data-b="game"]    { --accent: light-dark(#047857, #34d399);
                                               --accent-vivo: #10b981; }
html[data-theme="portal"][data-b="noticias"] { --accent: light-dark(#b91c1c, #f87171);
                                               --accent-vivo: #dc2626; }

body {
  background: var(--bg); color: var(--ink);
  font-family: var(--font-body); font-size: 18px; line-height: 1.7;
  -webkit-font-smoothing: antialiased; text-rendering: optimizeLegibility;
}

a { color: inherit; }
h1, h2, h3, h4 { font-family: var(--font-head); line-height: 1.2; margin: 0 0 .4em;
  letter-spacing: -.02em; }

/* A folga entre a barra e o conteúdo mora **aqui**, e não em cada abertura: assim toda
   página começa à mesma distância do menu — a que tem herói, a que começa por um cartão e a
   que começa por uma tabela. Antes era o herói que dava o respiro, e quem não tinha herói
   colava na barra. */
/* A distância entre a barra do topo e a primeira coisa da página é **uma só**, escrita
   aqui: toda tela do portal começa na mesma linha. Quem quiser mais respiro põe no próprio
   bloco, para baixo — nada volta a somar folga por cima, que era o defeito antigo (a ficha
   começava 70px abaixo, a home 34 e o curso 26). */
main { max-width: var(--max); margin: 0 auto;
  padding: var(--topo-pagina, 30px) 26px 90px; }
main.wide { max-width: var(--max); }

.kicker {
  font-size: .78rem; letter-spacing: .16em; text-transform: uppercase;
  color: var(--accent); font-weight: 600; margin: 0 0 12px;
}
.dek { color: var(--dim); font-size: 1.12rem; line-height: 1.65; max-width: 62ch; margin: 0; }

/* ---------------- barra de topo ---------------- */

/* No claro a barra é branca sobre o fundo levemente quadriculado, e a diferença se vê. No
   escuro os dois eram o mesmo tom e a barra sumia: ela passa a ser um degrau mais clara que
   a página, como já acontece nos outros temas. */
.topbar {
  position: sticky; top: 0; z-index: 20;
  background: light-dark(rgba(255,255,255,.92), rgba(24,28,37,.94));
  backdrop-filter: saturate(180%) blur(10px); border-bottom: 1px solid var(--line);
}

/* A barra veste a frente em que a pessoa esta: um veu de 12% da cor da sub-mochila sobre
   o fundo do tema. Veu e nao tarja de proposito -- a faixa carrega os links, o seletor de
   tema, o chip da conta e a logo, e assim todos seguem com as cores e o contraste que ja
   tinham, no claro e no escuro. A cor sai de `--accent-vivo`, que `estilo_das_marcas()`
   escreve para toda sub-mochila, inclusive as criadas depois. Na home e fora das secoes o
   `data-b` e "hub", e ai a barra fica como sempre foi. */
html[data-theme="portal"][data-b]:not([data-b="hub"]) .topbar,
html[data-theme="portal"][data-tipo] .topbar {
  background: light-dark(
    color-mix(in srgb, var(--accent-vivo) 12%, rgba(255,255,255,.92)),
    color-mix(in srgb, var(--accent-vivo) 20%, rgba(15,17,22,.92)));
  border-bottom-color: color-mix(in srgb, var(--accent-vivo) 30%, var(--line));
}
/* Uma linha só, sempre. Era `flex-wrap: wrap`, e aí não era o menu que quebrava — era o
   bloco da conta descendo para uma segunda linha quando a marca, o menu e ele não cabiam
   juntos. Quem cede é o menu, que encolhe e rola de lado; a marca e a conta não encolhem,
   porque são alvos de clique de tamanho fixo. No celular a regra volta a ser `wrap`, que lá
   o menu ganha uma linha própria de propósito. */
/* A logo pega as duas linhas, à esquerda, e o resto do topo se organiza numa coluna ao
   lado dela: os itens fixos e a conta em cima, as frentes embaixo. Assim as duas faixas
   cabem na altura que antes era de uma linha e meia — a logo, que ocupava só metade da
   altura, passou a usar tudo. */
.topbar-in {
  max-width: var(--max); margin: 0 auto; padding: 6px 26px;
  display: flex; align-items: stretch; gap: 18px; flex-wrap: nowrap;
}
.topbar-dir { flex: 1 1 auto; min-width: 0; display: flex; flex-direction: column; }
/* Duas faixas com um fio no meio: em cima as frentes, embaixo os itens fixos e a conta.
   O fio nasce na coluna da direita e não atravessa a logo — atravessando, ele partiria a
   marca em duas metades. */
.topbar-cima { display: flex; align-items: center; gap: 10px; min-width: 0; }
/* O fio entre as duas faixas: ele nasce na coluna da direita e vai até a ponta, sem passar
   por cima da logo — atravessando, partiria a marca em duas metades. Tom um pouco mais forte
   que o `--line` das bordas comuns, senão ele some no meio de dois níveis de menu. */
.topbar-baixo { display: flex; align-items: center; gap: 10px; min-width: 0;
  border-top: 2px solid color-mix(in srgb, var(--ink) 26%, transparent);
  padding-top: 7px; margin-top: 6px; }
.topbar-in > .brandmark { align-self: center; }
.topbar-in > .brandmark { flex: none; }
/* O menu começa logo depois da logo; só o bloco da conta guarda distância, para não colar
   no último link. */
/* Os itens fixos ficam na linha de baixo com o bloco da conta no canto: são o que a casa
   vende e ensina, e vêm depois do assunto — que são as frentes. */
.topbar-baixo > .nav { margin-right: auto; }
.topbar-baixo > .nav-conta { flex: none; margin-left: 14px; }
.brandmark { display: flex; align-items: center; gap: 11px; text-decoration: none; flex: none; }
.logo-topo { height: 78px; width: auto; max-width: 340px; object-fit: contain; }
.mark {
  width: 28px; height: 28px; border-radius: 8px; flex: none;
  background: linear-gradient(140deg, var(--violet), var(--cyan) 55%, var(--orange));
}
.wordmark { font-family: var(--font-head); font-weight: 700; letter-spacing: -.025em; font-size: 19px; }
.wordmark .de { opacity: .45; margin: 0 .18em; font-weight: 400; }

/* Com as cinco seções, a Loja, os Cursos e a Loja física, o menu passou a caber por pouco: um
   pedaço a menos de tela e ele quebrava em duas linhas, empurrando a barra inteira para baixo
   e mexendo na altura do topo do portal. Agora ele não quebra — encolhe e rola de lado, como
   já fazia no celular. */
/* Sem `overflow` aqui. Ele existia para o menu de onze itens rolar de lado, mas rolagem
   **recorta**: o painel das frentes abria dentro dela e ficava invisível, e o clique parecia
   não fazer nada. Com as frentes agrupadas são cinco itens, que cabem — e no que não couber,
   o menu quebra de linha em vez de esconder. */
.nav { display: flex; align-items: center; gap: 2px; flex-wrap: wrap; margin-right: auto;
  min-width: 0; }
.nav-conta { display: flex; align-items: center; gap: 6px; }

/* A linha das frentes, embaixo da barra. Elas são o assunto do portal e crescem com o
   tempo; a Loja, os Cursos e a Calculadora são quatro e param por aí. Separadas, a linha de
   baixo cresce sozinha sem apertar nada de cima. Rola de lado quando não couber — aqui a
   rolagem é segura, porque nada abre para fora dela. */
/* A faixa das frentes mora dentro da coluna da direita, ao lado da logo: por isso ela não
   tem largura própria nem respiro lateral — quem cuida disso é o `.topbar-in`. Ela vai em
   cima, junto do bloco da conta; a linha divisória fica na fita de baixo, que carrega os
   itens fixos. */
.frentes-barra { flex: 1 1 auto; min-width: 0; }
.frentes-in { display: flex; align-items: stretch; gap: 2px; overflow-x: auto;
  scrollbar-width: none; -ms-overflow-style: none; }
.frentes-in::-webkit-scrollbar { display: none; }
.frente-link {
  display: inline-flex; align-items: center; gap: 7px; white-space: nowrap;
  text-decoration: none; color: var(--dim); font-weight: 600; font-size: .88rem;
  padding: 5px 11px; border-radius: 9px;
  transition: color .14s ease, background .14s ease;
}
.frente-link:hover { color: var(--ink); background: var(--bg2); }
.frente-link .secao-ponto { width: 9px; height: 9px; border-radius: 3px;
  background: var(--cor, var(--dim)); flex: none; }
/* A frente aberta ganha a mesma pílula dos itens fixos, na cor dela. */
.frente-link.on { color: var(--cor, var(--accent));
  background: color-mix(in srgb, var(--cor, var(--accent)) 12%, transparent); }
@media (max-width: 620px) {
.frente-link { padding: 7px 9px; font-size: .84rem; }
.logo-topo { height: 54px; }
}


/* Os dois níveis do topo se marcam do **mesmo jeito**: a pílula na cor da seção, que é
   como o menu do portal sempre marcou. Duas gramáticas para dizer "você está aqui" na
   mesma barra obrigavam a pessoa a aprender as duas. */
.navlink {
  text-decoration: none; font-size: .92rem; font-weight: 600; color: var(--dim);
  padding: 5px 11px; border-radius: 9px; white-space: nowrap;
  transition: color .14s ease, background .14s ease;
}
.navlink:hover { color: var(--ink); background: var(--bg2); }
.navlink.on { color: var(--accent); background: color-mix(in srgb, var(--accent) 10%, transparent); }
.navlink[data-b="nerd"].on { --accent: light-dark(#7c3aed, #a78bfa); }
.navlink[data-b="3d"].on { --accent: light-dark(#c2410c, #fb923c); }
.navlink[data-b="ia"].on { --accent: light-dark(#0e7490, #22d3ee); }
.navlink[data-b="game"].on { --accent: light-dark(#047857, #34d399); }
.navlink[data-b="noticias"].on { --accent: light-dark(#b91c1c, #f87171); }
.navlink.adm { color: var(--dim); font-weight: 500; }
.navlink.entrar {
  color: var(--accent); border: 1px solid color-mix(in srgb, var(--accent) 35%, var(--line));
  border-radius: 9px; padding: 5px 11px;
}
.navlink.entrar:hover { background: color-mix(in srgb, var(--accent) 8%, transparent); color: var(--accent); }
.navlink.eu { display: inline-flex; align-items: center; gap: 9px; padding: 5px 14px 5px 6px;
  border: 1px solid var(--line); border-radius: 9px; color: var(--ink); }
/* O carrinho é botão da conta, e não item de menu: fica com a pílula de sempre em vez do
   sublinhado — o sublinhado agora quer dizer "a seção que você está vendo". */
.navlink.carrinho-bt { padding: 5px 11px; }

/* ---------------- aberturas ---------------- */

/* A folga do alto é do `main`; aberturas não somam a delas por cima. Assim o título da
   home, o de uma frente e o primeiro cartão de uma tela sem título começam **na mesma
   altura** — era isso que fazia a home parecer colada no menu perto das outras. */
.hero { padding: 0 0 34px; }
.hero h1 { font-size: clamp(2.3rem, 5.2vw, 3.5rem); margin-bottom: .3em; max-width: 18ch; }
.hero .dek { font-size: 1.18rem; }
/* A frente respira o mesmo que a home: era a home com 62px de folga e a frente com 46, e a
   mesma casa não deve encolher ao trocar de página. O que continua diferente é só a cor do
   título — que ali é a identidade da frente — e o fio que separa o alto do conteúdo. */
.hero-secao { padding: 0 0 40px; border-bottom: 1px solid var(--line); margin-bottom: 40px; }
.hero-secao h1 { color: var(--accent); }

/* ---------------- home: as quatro frentes ---------------- */

/* As frentes que já publicam viram cartão com capa: três por linha, largura que deixa a
   foto grande o bastante para valer a pena. Com sete cartões de 196px a home virava uma
   estante de caixinhas — e três delas estavam vazias. */
.secoes {
  display: grid; gap: 22px; grid-template-columns: repeat(auto-fit, minmax(290px, 1fr));
  margin-bottom: 10px;
}
@media (max-width: 980px) {
.secoes { grid-template-columns: repeat(2, 1fr); }
}
@media (max-width: 620px) {
.secoes { grid-template-columns: 1fr; }
}
.secao {
  border: 1px solid var(--line); border-radius: var(--radius); background: var(--bg);
  padding: 22px 22px 18px; display: flex; flex-direction: column; gap: 12px;
  border-top: 3px solid var(--cor); transition: box-shadow .16s ease, transform .16s ease;
}
.secao:hover { box-shadow: 0 10px 30px rgba(21, 24, 33, .08); transform: translateY(-2px); }
.secao[data-b="nerd"] { --cor: #8b5cf6; --accent: light-dark(#7c3aed, #a78bfa); }
.secao[data-b="3d"] { --cor: #ea7317; --accent: light-dark(#c2410c, #fb923c); }
.secao[data-b="ia"] { --cor: #06b6d4; --accent: light-dark(#0e7490, #22d3ee); }
.secao[data-b="game"] { --cor: #10b981; --accent: light-dark(#047857, #34d399); }
.secao[data-b="noticias"] { --cor: #dc2626; --accent: light-dark(#b91c1c, #f87171); }
/* A capa é a matéria mais nova da frente, e é ela que faz o cartão ser olhado antes de
   ser lido. Sem foto, uma faixa na cor da frente com o nome dela: buraco branco no meio da
   grade parece imagem que não carregou. */
.frente-capa { display: block; overflow: hidden; border-radius: var(--radius);
  border: 1px solid var(--line); background: var(--bg2); position: relative; }
.frente-capa img { aspect-ratio: 16 / 9; object-fit: cover; width: 100%; display: block;
  transition: transform .35s ease; }
.secao:hover .frente-capa img { transform: scale(1.03); }
.frente-capa-vazia { display: flex; align-items: center; justify-content: center;
  aspect-ratio: 16 / 9; background: var(--cor); color: #fff; font-weight: 700;
  letter-spacing: .14em; text-transform: uppercase; font-size: .9rem; }
.frente-titulo { margin: 0; font-size: 1.12rem; line-height: 1.3; }
.frente-titulo a { text-decoration: none; }
.frente-titulo a:hover { color: var(--accent); }
.secao-cab { display: flex; align-items: center; gap: 12px; text-decoration: none; }
.secao-ponto { width: 12px; height: 12px; border-radius: 4px; background: var(--cor); flex: none; }
.secao h2 { font-size: 1.22rem; margin: 0; }
.secao .kicker { margin: 0 0 2px; font-size: .68rem; color: var(--dim); }
.secao .tag-line { margin: 0; color: var(--dim); font-size: .95rem; }
.secao-lista { list-style: none; margin: 4px 0 0; padding: 0; }
.secao-lista li + li { border-top: 1px solid var(--line); }

/* As frentes que ainda não publicaram: uma fita de chips na cor de cada uma, embaixo da
   grade. Elas continuam a um clique — quem quer ver a de Esporte chega nela —, sem ocupar
   um cartão inteiro para dizer que ainda não há nada lá dentro. */
.frentes-esperando { margin: 4px 0 30px; }
.frentes-esperando .rotulo-solto { margin-bottom: 8px; }
.frentes-chips { display: flex; flex-wrap: wrap; gap: 10px; }
.frente-chip { display: inline-flex; align-items: center; gap: 8px; text-decoration: none;
  border: 1px solid var(--line); border-radius: 999px; padding: 8px 16px;
  font-weight: 600; font-size: .92rem; color: var(--ink); background: var(--bg); }
.frente-chip:hover { border-color: var(--cor, var(--accent)); color: var(--cor, var(--accent)); }
.frente-chip .secao-ponto { width: 10px; height: 10px; border-radius: 3px;
  background: var(--cor, var(--accent)); }
.secao-lista a {
  display: block; padding: 10px 0; text-decoration: none; font-size: .95rem;
  font-weight: 500; line-height: 1.4;
}
.secao-lista a:hover { color: var(--accent); }
.secao-lista time { display: block; color: var(--dim); font-size: .78rem; font-weight: 400; margin-top: 2px; }
.secao-lista .empty { color: var(--dim); font-size: .9rem; padding: 10px 0; }
.secao-lista .selo {
  position: static; display: inline-block; margin-left: 6px; padding: 1px 7px;
  font-size: .62rem; vertical-align: middle;
}
.secao .go { margin-top: auto; padding-top: 6px; font-size: .92rem; font-weight: 600;
  color: var(--accent); text-decoration: none; }

/* ---------------- listagens ---------------- */

.section-title {
  font-size: .82rem; letter-spacing: .16em; text-transform: uppercase; color: var(--dim);
  font-weight: 600; padding-bottom: 14px; border-bottom: 1px solid var(--line);
  margin: 58px 0 30px;
}
.grid { display: grid; gap: 34px 28px; grid-template-columns: repeat(auto-fill, minmax(290px, 1fr)); }

.card { display: flex; flex-direction: column; gap: 12px; }
.card-in { display: flex; flex-direction: column; gap: 10px; }
.card .thumb { display: block; overflow: hidden; border-radius: var(--radius);
  border: 1px solid var(--line); background: var(--bg2); }
.card .thumb img { aspect-ratio: 16 / 9; object-fit: cover; width: 100%; transition: transform .35s ease; }
.card:hover .thumb img { transform: scale(1.03); }
.card h3 { font-size: 1.28rem; margin: 0; line-height: 1.28; }
.card h3 a { text-decoration: none; }
.card h3 a:hover { color: var(--accent); }
.card .dek { color: var(--dim); font-size: 1rem; margin: 0; line-height: 1.55; }
.eyebrow { font-size: .74rem; letter-spacing: .12em; text-transform: uppercase;
  color: var(--dim); font-weight: 600; }
.card[data-b="nerd"] .eyebrow { color: light-dark(#7c3aed, #a78bfa); }
.card[data-b="3d"] .eyebrow { color: light-dark(#c2410c, #fb923c); }
.card[data-b="ia"] .eyebrow { color: light-dark(#0e7490, #22d3ee); }
.card[data-b="game"] .eyebrow { color: light-dark(#047857, #34d399); }
.card[data-b="noticias"] .eyebrow { color: light-dark(#b91c1c, #f87171); }
.meta { display: flex; align-items: center; gap: 9px; flex-wrap: wrap;
  font-size: .82rem; color: var(--dim); }
.dot { opacity: .5; }
.tag { border: 1px solid var(--line); border-radius: 999px; padding: 1px 10px; font-size: .76rem; }

.lead { margin-bottom: 20px; }
.card.big { display: grid; grid-template-columns: 1.1fr 1fr; gap: 34px; align-items: center; }
.card.big h3 { font-size: clamp(1.7rem, 3.4vw, 2.4rem); line-height: 1.18; }
.card.big .dek { font-size: 1.08rem; }
.listing .empty, .empty { color: var(--dim); font-size: 1rem; }

.irmas {
  margin-top: 74px; padding-top: 26px; border-top: 1px solid var(--line);
  display: flex; gap: 20px; align-items: baseline; flex-wrap: wrap;
}
.irmas > span { font-size: .78rem; letter-spacing: .14em; text-transform: uppercase; color: var(--dim);
  font-weight: 600; }
.irmas div { display: flex; gap: 18px; flex-wrap: wrap; }
.irmas a { font-size: .98rem; font-weight: 600; text-decoration: none; }
.irmas a[data-b="nerd"] { color: light-dark(#7c3aed, #a78bfa); }
.irmas a[data-b="3d"] { color: light-dark(#c2410c, #fb923c); }
.irmas a[data-b="ia"] { color: light-dark(#0e7490, #22d3ee); }
.irmas a[data-b="game"] { color: light-dark(#047857, #34d399); }
.irmas a[data-b="noticias"] { color: light-dark(#b91c1c, #f87171); }
.irmas a:hover { text-decoration: underline; text-underline-offset: 4px; }

/* ---------------- artigo: feito para ler ---------------- */

/* -------- a tela da materia: texto e a coluna do lado --------

   Tres partes de texto para uma de lista, como uma pagina de jornal. A lista ficava embaixo,
   e embaixo so e vista por quem chega ao fim; do lado ela acompanha a leitura inteira.

   O `minmax(0, 3fr)` no lugar de `3fr` e o que impede a coluna do texto de estourar quando
   dentro dela vier algo largo -- uma tabela, um bloco de codigo, uma imagem grande: sem o
   minimo zero, a coluna cresce junto com o conteudo e empurra a lista para fora da tela. */
.materia-tela { display: grid; grid-template-columns: minmax(0, 3fr) minmax(250px, 1fr);
  gap: 20px 48px; align-items: start; }
.materia-corpo { min-width: 0; }
/* A ficha do produto entra na grade da matéria sem o `.post`, que é quem carrega a folga do
   alto — sem isto o rastro de migalhas cola na barra do topo e ainda começa 34px acima da
   coluna do lado, que já tem a dela. O `>` é de propósito: na matéria o crumb mora dentro do
   `.post-topo` e não deve ganhar folga nenhuma. */
/* 34px aqui somavam com os 34 do `main` e davam quase 70px de vazio entre a barra do topo
   e a primeira palavra da ficha — em produto, matéria, curso e pacote. Doze bastam para o
   rastro de migalhas não colar na barra. */
.materia-corpo > .crumb { margin-top: 0; }
.materia-tela .post { max-width: 46rem; margin: 0; }
/* A coluna acompanha a rolagem, presa por cima. Sem altura maxima e sem rolagem propria: uma
   barra de rolagem dentro da pagina e um segundo lugar para rolar, e ninguem espera isso numa
   lista de leitura. A lista ja vem cortada em dez pelo servidor -- e o corte que resolve o
   tamanho, nao a barra. */
/* A coluna do lado começa na mesma linha do corpo: ela tinha 34px de folga própria para
   acompanhar o crumb, que já não os tem. */
.lado-preso { position: sticky; top: 22px; padding-top: 0; }
.materia-lado .col-tit { margin-top: 0; }
.materia-lado .item-capa { width: 62px; height: 62px; }
@media (max-width: 1000px) {
.materia-tela { grid-template-columns: 1fr; gap: 0; }
.materia-tela .post { max-width: 42rem; margin-left: auto; margin-right: auto; }
.lado-preso { position: static; max-height: none; overflow: visible; padding-top: 0; }
.materia-lado { max-width: 42rem; margin: 10px auto 0; }
}
.post { max-width: 42rem; margin: 34px auto 0; }
.crumb { margin: 0 0 16px; font-size: .82rem; font-weight: 600; letter-spacing: .1em;
  text-transform: uppercase; }
.crumb a { color: var(--accent); text-decoration: none; }
.post h1 { font-size: clamp(2.1rem, 4.6vw, 3.1rem); line-height: 1.15; margin-bottom: .28em; }
.post-meta {
  display: flex; gap: 10px; align-items: center; flex-wrap: wrap; font-size: .88rem;
  color: var(--dim); padding-bottom: 22px; border-bottom: 1px solid var(--line);
}
/* ---- a fita do leitor, no fim da matéria ----

   No fim e não no começo: reação antes de ler é palpite. Os botões são grandes o
   bastante para o dedo (44px de alvo), e o estado marcado é dito por cor, por moldura e
   pelo `aria-pressed` — nunca só pela cor. */
.fita-leitor {
  margin: 40px 0 8px; padding: 22px 24px; border-radius: 18px;
  background: var(--bg2); border: 1px solid var(--line); scroll-margin-top: 84px;
}
.fita-tit { margin: 0 0 14px; font-weight: 700; font-size: 1.02rem; }
/* Uma linha só: os cinco botões são os mesmos em toda tela, e quebrar a fila embaralha a
   ordem que a pessoa decorou. Eles encolhem o texto antes de descer de linha; no celular,
   onde cinco não cabem de jeito nenhum, a fita volta a quebrar. */
.fita-bts { display: flex; flex-wrap: nowrap; gap: 8px; align-items: center; }
.fita-bts form { margin: 0; min-width: 0; }
@media (max-width: 700px) {
  .fita-bts { flex-wrap: wrap; }
}
.reacao {
  display: inline-flex; align-items: center; gap: 7px; min-height: 44px;
  white-space: nowrap; padding: 0 14px; border-radius: 999px; border: 1px solid var(--line);
  background: var(--bg); color: var(--ink); font: inherit; font-size: .88rem;
  font-weight: 600; cursor: pointer; text-decoration: none;
  transition: border-color .14s ease, background .14s ease, color .14s ease;
}
.reacao:hover { border-color: color-mix(in srgb, var(--accent) 55%, var(--line));
  color: var(--accent); }
.reacao .ic { width: 18px; height: 18px; }
.reacao b { font-variant-numeric: tabular-nums; font-size: .84rem;
  padding-left: 2px; opacity: .75; }
.reacao.on {
  border-color: var(--accent); color: var(--accent);
  background: color-mix(in srgb, var(--accent) 10%, transparent);
}
.reacao.on b { opacity: 1; }
.reacao.guardar { margin-left: auto; }

/* O menu de encaminhar abre sem script: é um <details>. A seta que o navegador desenha
   sozinho sai, porque o botão já tem o ícone de link dizendo o que ele é. */
.mandar { position: relative; }
.mandar > summary { list-style: none; }
.mandar > summary::-webkit-details-marker { display: none; }
.mandar[open] > summary { border-color: var(--accent); color: var(--accent); }
.mandar-lista {
  position: absolute; right: 0; top: calc(100% + 8px); z-index: 6; width: 232px;
  display: flex; flex-direction: column; gap: 2px; padding: 8px;
  background: var(--bg2); border: 1px solid var(--line); border-radius: 14px;
  box-shadow: 0 18px 40px -18px light-dark(rgba(20,24,40,.4), rgba(0,0,0,.75));
}
.mandar-op {
  display: block; width: 100%; text-align: left; padding: 10px 12px; border-radius: 9px;
  border: none; background: none; color: var(--ink); font: inherit; font-size: .88rem;
  text-decoration: none; cursor: pointer;
}
.mandar-op:hover { background: color-mix(in srgb, var(--accent) 10%, transparent);
  color: var(--accent); }
.mandar-op.copiado { color: var(--accent); font-weight: 700; }
.mandar-url {
  margin-top: 6px; width: 100%; padding: 8px 10px; font-size: .76rem;
  border: 1px solid var(--line); border-radius: 9px; background: var(--bg);
  color: var(--dim); font-family: inherit;
}
@media (max-width: 560px) {
.reacao.guardar { margin-left: 0; }
.mandar-lista { right: auto; left: 0; }
}

/* Página de texto legal: coluna estreita como a de leitura, títulos menores que os de
   matéria (aqui ninguém lê por prazer, lê para achar um parágrafo) e listas com respiro
   para o item ser encontrado de relance. */
.legal-hero { padding-bottom: 8px; }
.prose.legal { max-width: 44rem; margin: 8px auto 60px; }
.prose.legal h2 { font-size: 1.24rem; margin: 2.2em 0 .6em; scroll-margin-top: 90px; }
.prose.legal h2:first-child { margin-top: 1em; }
.prose.legal li { margin-bottom: .55em; }
.prose.legal code { font-size: .88em; background: var(--bg2); padding: 1px 5px;
  border-radius: 5px; }
.copy a { color: inherit; }

.cover { margin: 30px 0; }
.cover img { border-radius: var(--radius); border: 1px solid var(--line); width: 100%; }

.prose { font-size: 1.16rem; line-height: 1.8; margin-top: 30px; }
.prose > *:first-child { margin-top: 0; }
.prose p { margin: 0 0 1.35em; }
.prose h2 { font-size: 1.75rem; margin: 1.9em 0 .5em; }
.prose h3 { font-size: 1.35rem; margin: 1.7em 0 .45em; }
.prose a { color: var(--accent); text-underline-offset: 3px; }
.prose ul, .prose ol { margin: 0 0 1.35em; padding-left: 1.3em; }
.prose li { margin-bottom: .55em; }
.prose img { border-radius: var(--radius); border: 1px solid var(--line); margin: 1.8em 0; }
.prose blockquote {
  margin: 1.8em 0; padding: 6px 0 6px 22px; border-left: 3px solid var(--accent);
  color: var(--dim); font-style: italic; font-size: 1.1rem;
}
.prose code {
  font-family: "IBM Plex Mono", ui-monospace, monospace; font-size: .9em;
  background: color-mix(in srgb, var(--ink) 7%, transparent); padding: .12em .4em; border-radius: 5px;
}
.prose pre {
  background: var(--bg2); border: 1px solid var(--line); border-radius: var(--radius);
  padding: 18px 20px; overflow-x: auto; font-size: .95rem; line-height: 1.6;
}
.prose pre code { background: none; padding: 0; }
.prose hr { border: none; border-top: 1px solid var(--line); margin: 2.4em 0; }

/* ---------------- rodape ---------------- */

/* O rodapé veste a mesma cor da barra do menu: são as duas pontas da mesma moldura, e a
   página fica entre elas. Sem véu de frente ele é o tom da barra; dentro de uma frente,
   ganha o mesmo véu que ela — a regra logo abaixo é a gêmea da do topo. */
/* Os desafios abertos, na frente do esporte: cartão com a foto de capa, o caminho, a barra
   do quanto já andou e de quem é. Mesma grade dos cursos, para a frente não parecer três
   sites. */
.desafios-grade { display: grid; gap: 20px;
  grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); }
.desafio-card { display: flex; flex-direction: column; text-decoration: none; color: var(--ink);
  border: 1px solid var(--line); border-radius: var(--radius); overflow: hidden;
  background: var(--bg); transition: box-shadow .16s ease, transform .16s ease; }
.desafio-card:hover { box-shadow: 0 10px 30px rgba(21,24,33,.08); transform: translateY(-2px); }
.desafio-card-capa img { width: 100%; aspect-ratio: 16 / 9; object-fit: cover; display: block; }
.desafio-card-txt { display: flex; flex-direction: column; gap: 7px; padding: 16px 18px 18px; }
.desafio-card-txt .kicker { margin: 0; }
.desafio-card-txt strong { font-size: 1.08rem; line-height: 1.3; }
.desafio-card-txt small { color: var(--dim); font-size: .85rem; }
.desafios-vitrine { margin-bottom: 40px; }
.desafios-vitrine .dek { max-width: 60ch; margin: -6px 0 18px; }

/* As mais lidas da semana: uma lista numerada, curta, com a frente de cada uma embaixo do
   título. Números grandes e apagados — eles ordenam, não competem com o texto. */
.mais-lidas { margin: 6px 0 40px; }
.mais-lidas ol { list-style: none; margin: 0; padding: 0;
  display: grid; gap: 10px; grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); }
.mais-lidas li a { display: flex; align-items: baseline; gap: 12px; text-decoration: none;
  color: var(--ink); border: 1px solid var(--line); border-radius: var(--radius);
  padding: 12px 16px; height: 100%; }
.mais-lidas li a:hover { border-color: var(--cor, var(--accent)); }
.lida-num { font-size: 1.5rem; font-weight: 800; color: var(--cor, var(--accent));
  opacity: .35; font-variant-numeric: tabular-nums; line-height: 1; flex: none; }
.lida-txt { display: flex; flex-direction: column; gap: 3px; min-width: 0; }
.lida-txt strong { font-size: .97rem; line-height: 1.32; font-weight: 600; }
.lida-txt small { color: var(--dim); font-size: .76rem; text-transform: uppercase;
  letter-spacing: .08em; }

/* A busca do portal: uma caixa larga na abertura da tela e um atalho de lupa no menu.
   É `<form method="get">` — o que se procurou fica no endereço, volta no histórico e pode
   ser mandado para alguém. */
.busca-forma { display: flex; gap: 10px; align-items: center; flex-wrap: wrap;
  margin: 18px 0 6px; max-width: 640px; }
.busca-campo { flex: 1 1 18rem; display: flex; align-items: center; gap: 10px;
  border: 1px solid var(--line); border-radius: 12px; background: var(--bg);
  padding: 10px 14px; }
.busca-campo .ic { width: 18px; height: 18px; color: var(--dim); flex: none; }
.busca-campo input { flex: 1 1 auto; min-width: 0; border: 0; background: none;
  color: var(--ink); font: inherit; font-size: 1rem; outline: none; }
.busca-hero h1 { margin-bottom: 0; }
.busca-atalho { display: inline-flex; align-items: center; }
/* O sub-filtro da busca: chips logo abaixo da caixa, com a contagem de cada grupo. É a
   mesma busca vista por um recorte — aba seria mudança de tela. O grupo sem resultado fica
   apagado em vez de sumir: saber que não há curso nenhum é parte da resposta. */
.busca-filtros { margin: 14px 0 4px; }
.chip-conta { font-size: .72rem; font-weight: 700; opacity: .75;
  font-variant-numeric: tabular-nums; }
.chip-fil.vazio { opacity: .45; }
.chip-fil.on .chip-conta { opacity: .9; }
.busca-atalho .ic { width: 18px; height: 18px; }
.sr { position: absolute; width: 1px; height: 1px; overflow: hidden; clip: rect(0 0 0 0);
  white-space: nowrap; }

/* A caixa da carta semanal, no pé de toda página: uma frase do lado esquerdo e o campo do
   direito. Fundo do tom da barra para ela se separar do conteúdo sem virar um bloco de cor
   no meio do caminho. */
.novidades { border-top: 1px solid var(--line); background: var(--bg2); }
.novidades-in { max-width: var(--max); margin: 0 auto; padding: 26px;
  display: grid; grid-template-columns: 1fr minmax(0, 420px); gap: 20px 34px;
  align-items: center; }
.novidades-in .kicker { margin-bottom: 4px; }
.novidades-in p { margin: 0; color: var(--dim); font-size: .95rem; max-width: 52ch; }
.novidades-forma { display: flex; gap: 10px; align-items: center; flex-wrap: wrap; }
.novidades-forma .busca-campo { flex: 1 1 14rem; }
.novidades-diz { grid-column: 1 / -1; font-size: .9rem; }
.novidades-diz.ok { color: var(--ok, #15803d); }
.novidades-diz.erro { color: var(--perigo, #b91c1c); }
@media (max-width: 760px) {
.novidades-in { grid-template-columns: 1fr; }
}

/* A fita da loja, logo acima do rodapé: os produtos passando devagar, de direita para a
   esquerda. A fila entra duas vezes no HTML e a animação anda exatamente meia largura —
   quando a primeira cópia sai pela esquerda, a segunda já ocupou o lugar dela e o corte não
   aparece. Sem JavaScript: é uma `@keyframes` de uma linha.
   Para quem passa o mouse (ou o dedo) ela para, senão ler o nome de um produto vira
   perseguição; e quem pediu menos animação no sistema não vê animação nenhuma. */
.fita-loja { border-top: 1px solid var(--line); padding: 20px 0 22px; overflow: hidden; }
.fita-cab { max-width: var(--max); margin: 0 auto 12px; padding: 0 26px;
  display: flex; align-items: baseline; justify-content: space-between; gap: 14px; }
.fita-cab .rotulo-solto { margin: 0; }
.fita-trilho { overflow: hidden; }
.fita-fila { display: flex; gap: 14px; width: max-content;
  animation: fita-anda 60s linear infinite; }
.fita-trilho:hover .fita-fila, .fita-trilho:focus-within .fita-fila { animation-play-state: paused; }
@keyframes fita-anda {
to { transform: translateX(-50%); }
}
@media (prefers-reduced-motion: reduce) {
.fita-fila { animation: none; }
.fita-trilho { overflow-x: auto; }
}
.fita-item { flex: 0 0 auto; width: 168px; text-decoration: none; color: var(--ink);
  display: flex; flex-direction: column; gap: 6px; }
.fita-item img { width: 168px; height: 168px; object-fit: cover; border-radius: 12px;
  border: 1px solid var(--line); background: var(--bg2); }
.fita-item:hover img { border-color: var(--cor, var(--accent)); }
.fita-nome { font-size: .82rem; font-weight: 600; line-height: 1.3;
  display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; }
.fita-preco { font-size: .82rem; color: var(--dim); font-variant-numeric: tabular-nums; }
@media (max-width: 620px) {
.fita-item, .fita-item img { width: 132px; }
.fita-item img { height: 132px; }
.fita-cab { padding: 0 16px; }
}

.foot { border-top: 1px solid var(--line); margin-top: 60px;
  background: light-dark(rgba(255,255,255,.92), rgba(24,28,37,.94)); }
html[data-theme="portal"][data-b]:not([data-b="hub"]) .foot,
html[data-theme="portal"][data-tipo] .foot {
  background: light-dark(
    color-mix(in srgb, var(--accent-vivo) 12%, rgba(255,255,255,.92)),
    color-mix(in srgb, var(--accent-vivo) 20%, rgba(15,17,22,.92)));
  border-top-color: color-mix(in srgb, var(--accent-vivo) 30%, var(--line));
}
.foot-in {
  max-width: var(--max); margin: 0 auto; padding: 46px 26px 18px;
  display: grid; grid-template-columns: 2fr 1fr 1fr; gap: 34px;
}
.foot-sobre p { color: var(--dim); font-size: .95rem; max-width: 44ch; margin: 14px 0 0; }
.foot-nav { display: flex; flex-direction: column; gap: 10px; }
.foot-nav span { font-size: .74rem; letter-spacing: .14em; text-transform: uppercase;
  color: var(--dim); font-weight: 600; }
.foot-nav a { text-decoration: none; color: var(--ink); font-size: .95rem; }
.foot-nav a:hover { color: var(--accent); }
.copy { max-width: var(--max); margin: 0 auto; padding: 10px 26px 40px; color: var(--dim); font-size: .84rem; }

@media (max-width: 760px) {
body { font-size: 17px; }
.foot-in { grid-template-columns: 1fr; gap: 26px; }
.hero { padding: 0 0 22px; }
.topbar-in { padding: 10px 16px; gap: 12px; flex-wrap: wrap; }
.nav { order: 3; width: 100%; margin-right: 0; overflow-x: auto; }
.prose { font-size: 1.1rem; }
}
.atab.on, .atab:hover { background: color-mix(in srgb, var(--accent) 12%, transparent); color: var(--accent); }
.linkish { background: none; border: none; color: var(--accent); cursor: pointer; font: inherit; padding: 0; }

.ptable { width: 100%; border-collapse: collapse; background: var(--bg2);
  border: 1px solid var(--line); border-radius: var(--radius); overflow: hidden; }
.ptable th {
  text-align: left; font-size: .72rem; letter-spacing: .12em; text-transform: uppercase;
  color: var(--dim); padding: 12px 14px; border-bottom: 1px solid var(--line); font-weight: 600;
}
.ptable td { padding: 12px 14px; border-bottom: 1px solid var(--line); font-size: .9rem; vertical-align: top; }
.ptable tr:last-child td { border-bottom: none; }
.pslug { color: var(--dim); font-size: .74rem; font-family: "IBM Plex Mono", ui-monospace, monospace; }
/* O endereço que a pessoa vai copiar e colar merece ser lido: o `.pslug` de sempre é uma
   legenda, e legenda não é feita para copiar da tela. */
.pslug.grande { font-size: .95rem; color: var(--ink); }
.danger { background: none; border: none; color: light-dark(#b91c1c, #f87171); cursor: pointer; font: inherit; font-size: .8rem; padding: 0; }
.editor label.big input { font-size: 1.25rem; font-weight: 600; }
.hint { font-size: .78rem; color: var(--dim); }
.hint code { background: color-mix(in srgb, var(--ink) 8%, transparent); padding: 1px 5px; border-radius: 3px;
  font-family: "IBM Plex Mono", ui-monospace, monospace; }
.login .mark { width: 34px; height: 34px; border-radius: 9px; margin-bottom: 16px; }
.login .sub { color: var(--dim); font-size: .86rem; margin: 0 0 22px; }
.login .back { display: block; text-align: center; margin-top: 16px; font-size: .8rem; color: var(--dim); text-decoration: none; }

/* ---------------- ecras pequenos ---------------- */

@media (max-width: 820px) {
.card.big { grid-template-columns: 1fr; }
.ptable, .ptable thead, .ptable tbody, .ptable tr, .ptable td { display: block; width: 100%; }
.ptable thead { display: none; }
.ptable tr { border-bottom: 1px solid var(--line); padding: 6px 0; }
.ptable td { border: none; padding: 5px 14px; }
main { padding-bottom: 60px; }
}
@media (max-width: 560px) {
.topbar { padding: 16px; gap: 12px; }
.nav { gap: 2px; }
.navlink { padding: 6px 9px; font-size: 12.5px; }
main { padding-left: 18px; padding-right: 18px; }
}

/* destaque sem capa nao deve deixar coluna vazia */
.card.big:not(:has(.thumb)) { grid-template-columns: 1fr; }
.card .thumb { position: relative; }

/* botões gerais */
.btn {
  display: inline-block; background: var(--accent); color: #fff; border: none;
  border-radius: var(--radius); padding: 11px 20px; font: inherit; font-weight: 600;
  font-size: .92rem; cursor: pointer; text-decoration: none; text-align: center;
}
html[data-theme="blueprint"] .btn, html[data-theme="paper"] .btn { color: #fff; }
.btn:hover { filter: brightness(1.08); }
.btn.ghostbtn { background: none; color: var(--ink); border: 1px solid var(--line); }
.btn.ghostbtn:hover { border-color: var(--accent); color: var(--accent); filter: none; }

/* convite na home */
.convite {
  margin: 46px 0 10px; padding: 28px 30px; border: 1px solid var(--line);
  border-radius: var(--radius); background: var(--bg2);
  display: flex; gap: 26px; justify-content: space-between; align-items: center; flex-wrap: wrap;
  position: relative; overflow: hidden;
}
.convite::before {
  content: ""; position: absolute; inset: 0 auto 0 0; width: 3px;
  background: linear-gradient(180deg, var(--violet), var(--cyan) 55%, var(--orange));
}
.convite h2 { font-size: 1.5rem; margin: 6px 0 8px; letter-spacing: -.02em; }
.convite p { margin: 0; color: var(--dim); font-size: .95rem; max-width: 62ch; }
.convite-acoes { display: flex; gap: 10px; flex-wrap: wrap; }

/* trava de conteúdo exclusivo */
.prose.amostra { position: relative; max-height: 15em; overflow: hidden; }
.prose.amostra::after {
  content: ""; position: absolute; inset: auto 0 0 0; height: 8em;
  background: linear-gradient(to bottom, transparent, var(--bg));
}
.tranca .convite-acoes { justify-content: center; }
.btn-salvar.on { border-color: var(--accent); color: var(--accent);
  background: color-mix(in srgb, var(--accent) 12%, transparent); }

/* comentários

   O desenho da conversa morava só no `gestao.css`, que o **portal não carrega**: matéria,
   produto, curso e pacote mostravam a caixa de comentar crua — rótulo colado num campinho
   de duas linhas e o botão do lado. Ele veio para cá, que é o arquivo dos dois lados. */
.comentarios { max-width: 72ch; margin: 50px auto 0; }
.coment-lista { list-style: none; margin: 0 0 30px; padding: 0; }
.coment { border-bottom: 1px solid var(--line); padding: 18px 0; }
.coment-cab { display: flex; gap: 10px; align-items: baseline; margin-bottom: 6px;
  flex-wrap: wrap; }
.coment-cab time { color: var(--dim); font-size: .74rem;
  font-family: "IBM Plex Mono", ui-monospace, monospace; }
.coment-corpo p { margin: 0 0 .6em; font-size: .96rem; }
.coment-corpo.mini p { font-size: .86rem; margin: 0 0 .3em; }
.coment-form { margin-top: 6px; }
.coment-form label { display: block; font-size: .8rem; color: var(--dim); font-weight: 600; }
.coment-form textarea {
  width: 100%; margin: 8px 0 12px; padding: 12px; border: 1px solid var(--line);
  border-radius: var(--radius); background: var(--bg2); color: var(--ink); font: inherit;
  font-size: .95rem; resize: vertical; min-height: 110px;
}
.coment-form textarea:focus {
  outline: 2px solid color-mix(in srgb, var(--accent) 45%, transparent);
  border-color: var(--accent); }
/* O nome de quem comenta e a conta dele, no cabeçalho de cada comentário. */
.grupo-nome { font-size: .74rem; color: var(--dim); border: 1px solid var(--line);
  border-radius: 999px; padding: 1px 9px; display: inline-flex; align-items: center;
  gap: 5px; }

/* A quantidade, ao lado do "Adicionar ao carrinho": era um rótulo solto com um campo cru —
   o único campo do portal sem desenho nenhum. */
.add-qtd { display: flex; flex-direction: column; gap: 5px; font-size: .74rem;
  font-weight: 600; letter-spacing: .06em; text-transform: uppercase; color: var(--dim); }
.add-qtd input { width: 88px; padding: 10px 12px; border: 1px solid var(--line);
  border-radius: 10px; background: var(--bg2); color: var(--ink); font: inherit;
  font-size: .95rem; font-variant-numeric: tabular-nums; }
.add-qtd input:focus { outline: 2px solid color-mix(in srgb, var(--accent) 45%, transparent);
  border-color: var(--accent); }
.aviso { color: var(--dim); font-size: .92rem; border: 1px dashed var(--line);
  border-radius: var(--radius); padding: 14px 18px; }
.aviso a { color: var(--accent); }
.area-nav .atab.on, .area-nav .atab:hover { color: var(--accent); border-color: var(--accent); }

/* telas de entrada e cadastro

   A porta é a primeira tela que um mochileiro vê, e era um cartão branco sozinho no meio
   do vazio. Ganhou fundo e vitrine, mas tudo desenhado em CSS: aqui não entra imagem de
   fundo, porque esta é justamente a página em que a pessoa só quer digitar a senha e
   passar — o enfeite não pode custar um download a mais. */
.porta-body { display: grid; place-items: center; min-height: 100vh; padding: 20px;
  background: var(--bg); color: var(--ink); position: relative; overflow-x: hidden;
  --grade: light-dark(#e9edf5, #1a1e28); }

/* O fundo: três manchas nas cores da casa e uma grade fina por cima, apagando nas bordas
   para não virar papel quadriculado. `fixed` porque em tela baixa o cartão rola e o fundo
   tem de ficar parado. */
.porta-fundo { position: fixed; inset: 0; z-index: 0; pointer-events: none; overflow: hidden; }
.porta-fundo::after {
  content: ""; position: absolute; inset: 0;
  background-image: linear-gradient(var(--grade) 1px, transparent 1px),
                    linear-gradient(90deg, var(--grade) 1px, transparent 1px);
  background-size: 48px 48px;
  -webkit-mask-image: radial-gradient(circle at 50% 38%, #000 8%, transparent 70%);
  mask-image: radial-gradient(circle at 50% 38%, #000 8%, transparent 70%);
}
.fundo-bolha { position: absolute; border-radius: 50%; filter: blur(72px);
  opacity: light-dark(.16, .26); animation: bolha-anda 26s ease-in-out infinite alternate; }
.fundo-bolha.b1 { width: 46vmax; height: 46vmax; left: -15vmax; top: -17vmax;
  background: var(--violet); }
.fundo-bolha.b2 { width: 38vmax; height: 38vmax; right: -13vmax; top: 18vmax;
  background: var(--cyan); animation-duration: 34s; animation-delay: -8s; }
.fundo-bolha.b3 { width: 30vmax; height: 30vmax; left: 26vmax; bottom: -15vmax;
  background: var(--orange); animation-duration: 30s; animation-delay: -16s; }
@keyframes bolha-anda {
from { transform: translate3d(0, 0, 0) scale(1); }
to   { transform: translate3d(3vmax, -2vmax, 0) scale(1.08); }
}
@media (prefers-reduced-motion: reduce) {
.fundo-bolha { animation: none; }
}

/* Palco: no celular o cartão vem primeiro e a vitrine desce para o pé — quem abre a porta
   no telefone quase sempre já sabe o que é a casa e só quer o campo de senha. */
.porta-palco { position: relative; z-index: 1; display: grid; gap: 34px;
  justify-items: center; width: min(940px, 100%); }
.porta-body .porta { order: 1; }
.porta-vitrine { order: 2; }
@media (min-width: 900px) {
.porta-palco { grid-template-columns: 1fr minmax(360px, 400px); gap: 60px;
    justify-items: stretch; align-items: center; }
.porta-body .porta { order: 2; }
.porta-vitrine { order: 1; }
}

.porta-vitrine { max-width: 460px; }
/* A vitrine é o lado bonito da porta: o olho pequeno, a frase grande e o parágrafo
   fechando. Como ela mora fora do cartão, a fita chega pelo palco. */
.vit-olho { font-family: var(--font-head); font-size: .72rem; font-weight: 700;
  letter-spacing: .18em; text-transform: uppercase; color: var(--accent); margin: 0 0 10px; }
.vit-tit { font-family: var(--font-head); font-size: clamp(2.2rem, 5.4vw, 3.4rem);
  line-height: 1.02; letter-spacing: -.04em; margin: 0 0 24px; text-wrap: balance; }

/* A palavra entre *asteriscos* sai pintada com a fita das frentes — as cores da casa
   inteira dentro de uma palavra. O degradê vem de `--fita`, montado do cadastro; sem ele
   a regra cai no `--accent` sólido, e nunca em texto transparente sobre nada. */
.brilho { background: var(--fita-lisa, none); background-color: var(--accent);
  -webkit-background-clip: text; background-clip: text; color: transparent;
  -webkit-text-fill-color: transparent; }
@supports not (background-clip: text) {
.brilho { color: var(--accent);
  -webkit-text-fill-color: currentColor; background: none; }
}
.vit-lista { list-style: none; margin: 0 0 22px; padding: 0; display: grid; gap: 9px; }
/* Cada frente é bolinha + nome + chamada numa linha só. A bolinha ganha um halo da própria
   cor: é o mesmo aviso do portal, onde a cor sempre quer dizer frente — e o nome escrito ao
   lado continua ali, porque cor sozinha nunca é informação. */
.vit-frente { display: grid; grid-template-columns: auto auto 1fr; align-items: baseline;
  gap: 10px; font-size: .92rem; }
.vit-ponto { width: 10px; height: 10px; border-radius: 50%; background: var(--cor);
  box-shadow: 0 0 0 4px color-mix(in srgb, var(--cor) 22%, transparent);
  align-self: center; }
.vit-nome { font-weight: 700; color: var(--ink); }
.vit-diz { color: var(--dim); min-width: 0; }
.vit-pe { color: var(--dim); font-size: .86rem; line-height: 1.55; margin: 0;
  max-width: 42ch; }

.porta { background: var(--bg2); border: 1px solid var(--line); border-radius: 16px;
  padding: 34px 32px; width: min(400px, 100%); }
/* Só o cartão da porta ganha relevo e fita — `.porta` também é o cartão da lista de acessos,
   que não quer nada disso. */
.porta-body .porta { position: relative; overflow: hidden; border-radius: 18px;
  background: color-mix(in srgb, var(--bg2) 88%, transparent);
  box-shadow: 0 28px 64px -34px light-dark(rgba(23, 27, 48, .5), rgba(0, 0, 0, .85));
  -webkit-backdrop-filter: blur(8px); backdrop-filter: blur(8px); }
.porta-body .porta::before {
  content: ""; position: absolute; inset: 0 0 auto; height: 4px;
  background: var(--fita, var(--accent));
}
.porta .brandmark { margin-bottom: 22px; }
.porta h1 { font-size: 1.5rem; margin-bottom: 6px; letter-spacing: -.02em; }
.porta .sub { color: var(--dim); font-size: .9rem; margin: 0 0 22px; }
.porta label { display: block; font-size: .78rem; color: var(--dim); font-weight: 600; margin-bottom: 14px; }
.porta input { width: 100%; margin-top: 6px; padding: 10px 12px; border: 1px solid var(--line);
  border-radius: 9px; background: var(--bg); color: var(--ink); font: inherit; }
.porta input:focus { outline: 2px solid color-mix(in srgb, var(--accent) 45%, transparent);
  border-color: var(--accent); }
.porta button { width: 100%; background: var(--accent); color: #fff; border: none; border-radius: 9px;
  padding: 11px; font: inherit; font-weight: 600; cursor: pointer; margin-top: 4px; }
.porta .alt { font-size: .84rem; color: var(--dim); margin: 18px 0 0; }
.porta .alt a, .porta .back { color: var(--accent); }

/* O brasão dos mochileiros no alto do cartão: a porta é a entrada da plataforma, e é o
   brasão que diz de quem é a casa. Quadrado, centrado e com largura em px — a moldura
   do cartão é estreita e uma marca em % encolheria junto com o celular. */
/* O mesmo tamanho que ele tem na barra lateral: 258px de menu menos os recuos dá 246.
   A porta é a outra ponta da mesma casa, e o brasão pequeno ali parecia favicon. */
.porta .brandmark.com-brasao { display: block; width: min(246px, 100%); margin: 0 auto 20px; }
.porta .porta-brasao { display: block; width: 100%; height: auto; }

.porta .back { display: block; text-align: center; margin-top: 18px; font-size: .8rem;
  color: var(--dim); text-decoration: none; }
/* O pé do cartão: o caminho de volta de um lado, a cor da tela do outro, na mesma linha
   e separados do formulário por um fio. Empilhados, os dois pareciam sobra do formulário. */
.porta-pe { display: flex; align-items: center; justify-content: space-between;
  gap: 12px; flex-wrap: wrap; margin-top: 24px; padding-top: 16px;
  border-top: 1px solid var(--line); }
.porta-pe .back { margin: 0; text-align: left; }
.ok { background: light-dark(#dcfce7, color-mix(in srgb, #22c55e 18%, transparent));
  border: 1px solid light-dark(#bbf7d0, #16a34a);
  color: light-dark(#166534, #bbf7d0); padding: 10px 14px;
  border-radius: var(--radius); font-size: .86rem; margin: 0 0 16px; }
html[data-theme="hub"] .ok, html[data-theme="dark"] .ok, html[data-theme="lab"] .ok {
  background: color-mix(in srgb, #22c55e 18%, transparent); border-color: #16a34a; color: #bbf7d0; }
.ptable tr.oculta { opacity: .55; }
.linkish.forte { font-weight: 700; }

@media (max-width: 900px) {
.convite { flex-direction: column; align-items: flex-start; }
}

/* =================== entrar com Google =================== */

.btn-google {
  display: flex; align-items: center; justify-content: center; gap: 10px;
  width: 100%; padding: 11px 16px; border: 1px solid var(--line); border-radius: 9px;
  background: var(--bg2); color: var(--ink); font: inherit; font-weight: 600; font-size: .92rem;
  text-decoration: none; cursor: pointer; transition: border-color .15s ease, background .15s ease;
}
.btn-google:hover { border-color: var(--dim); background: color-mix(in srgb, var(--ink) 5%, var(--bg2)); }
.btn-google svg { flex: none; }
.btn-google.mini { width: auto; display: inline-flex; padding: 7px 14px; font-size: .82rem; }
.ou {
  display: flex; align-items: center; gap: 12px; color: var(--dim);
  font-size: .76rem; text-transform: uppercase; letter-spacing: .14em; margin: 18px 0;
}
.ou::before, .ou::after { content: ""; flex: 1; height: 1px; background: var(--line); }
.vinculo.on { color: var(--dim); }
.vinculo.on::before { content: "✓ "; color: #16a34a; font-weight: 700; }
.logo-grupo.sm { width: 22px; height: 22px; border-radius: 6px; }
/* Logo de marca não é foto de perfil: é desenho largo, com fundo próprio. `cover` cortaria
   as pontas do lettering, então essa aqui cabe inteira dentro do quadrado. */
/* Vinte e sete estados numa tela só: a tabela é o formulário. Campo estreito e alinhado à
   direita porque tudo aqui é R$ 0,xx — coluna larga só afastaria o número do rótulo. */
/* Por quanto vender: duas escolhas, não um campo. Cartões clicáveis em vez de um `select`
   porque a diferença entre 3x e 5x merece ser lida antes de escolhida. */
/* A completa em blocos: cada um é uma pergunta fechada, com o título dizendo qual. */
.calc-bloco { border: 1px solid var(--line); border-radius: 14px; padding: 8px 18px 18px;
  margin: 0 0 16px; background: var(--bg2); }
.calc-bloco legend { padding: 0 8px; font-size: .82rem; font-weight: 700; color: var(--ink); }
.calc-bloco legend span { display: block; font-size: .74rem; font-weight: 400;
  color: var(--dim); }
.calc-bloco .calc-campos { margin-top: 6px; }
/* O campo que a própria página preenche — hoje só o peso total, quando as partes do filamento
   estão separadas. Ele continua à vista e continua indo no endereço; o que muda é parecer
   resultado em vez de pergunta, para ninguém digitar por cima de uma soma. */
.calc-campo.travado input { background: var(--bg2); color: var(--dim); cursor: default; }
.calc-campo.travado .sufixo { color: var(--dim); }
.calc-campo.travado > span:first-child::after { content: " · somado";
  color: var(--accent); font-size: .72rem; font-weight: 700; }
.calc-detalhe > .hint { margin: 8px 0 12px; font-size: .76rem; color: var(--dim);
  line-height: 1.45; max-width: 62ch; }

.calc-venda { display: grid; gap: 10px; grid-template-columns: repeat(auto-fit, minmax(190px, 1fr));
  border: none; margin: 20px 0 0; padding: 0; }
.calc-venda legend { padding: 0 0 8px; font-size: .74rem; letter-spacing: .09em;
  text-transform: uppercase; color: var(--dim); font-weight: 700; }
.calc-venda-op { display: flex; flex-direction: column; gap: 2px; cursor: pointer;
  padding: 12px 14px; border: 1px solid var(--line); border-radius: 12px;
  background: var(--bg2); transition: border-color .14s ease, background .14s ease; }
.calc-venda-op:hover { border-color: var(--dim); }
.calc-venda-op input { position: absolute; opacity: 0; width: 0; height: 0; }
.calc-venda-op strong { font-size: 1rem; font-weight: 700; color: var(--ink); }
.calc-venda-op span { font-size: .78rem; color: var(--dim); }
.calc-venda-op.on { border-color: var(--accent); background: color-mix(in srgb, var(--accent) 10%, var(--bg2));
  box-shadow: 0 0 0 3px color-mix(in srgb, var(--accent) 14%, transparent); }
.calc-venda-op.on strong { color: var(--accent); }
.calc-venda-op:focus-within { outline: 2px solid var(--accent); outline-offset: 2px; }
.calc-outro { display: block; margin-top: 6px; font-style: normal; font-size: .78rem;
  color: var(--dim); }
.energia-lista td.valor { width: 10rem; }
.logo-grupo.vazia {
  display: inline-grid; place-items: center; background: color-mix(in srgb, var(--accent) 18%, transparent);
  color: var(--accent); font-weight: 700; letter-spacing: .02em;
}
.logo-grupo.vazia.sm { font-size: .62rem; }
.logo-grupo.vazia.lg { font-size: 1.5rem; }
.porta .logo-grupo.lg { margin: 0 auto 18px; display: block; }
.porta .logo-grupo.vazia.lg { display: grid; }
.grupo-cab .pslug { display: block; }
.membro .pslug, .convite-item .pslug { display: block; margin-top: 2px; }

/* =========================================================================
   Painel (área dos mochileiros + gestão): barra lateral escura, cartões
   claros, tipografia Inter. Inspirado no jeito do Metronic.
   ========================================================================= */

html[data-theme="console"] {
  color-scheme: light dark;
  --bg: light-dark(#f5f8fa, #101219); --bg2: light-dark(#ffffff, #191c26);
  --ink: light-dark(#181c32, #e6e8f0); --dim: light-dark(#7e8299, #8f94aa);
  --line: light-dark(#e9edf3, #282d3b);
  --accent: light-dark(#7239ea, #a58bf2); --accent-forte: light-dark(#5b21d6, #c0adf7);
  --radius: 12px;
  /* A lateral já era escura no claro: no escuro ela só afunda um pouco mais, senão
     ficaria mais clara que o conteúdo e o desenho se inverteria. */
  --lat: light-dark(#1e1e2d, #14151d); --lat-ink: #b5b7c8; --lat-tit: #62648a;
  --ok: #50cd89; --alerta: #ffc700; --perigo: #f1416c;
  --font-body: "Inter", system-ui, -apple-system, sans-serif;
  --font-head: "Inter", system-ui, -apple-system, sans-serif;
  --sombra: light-dark(0 3px 14px rgba(24, 28, 50, .06), 0 3px 14px rgba(0, 0, 0, .38));
}
html[data-theme="console"][data-luz="claro"]  { color-scheme: light; }
html[data-theme="console"][data-luz="escuro"] { color-scheme: dark; }
html[data-theme="console"] body {
  font-size: 15px; line-height: 1.6; letter-spacing: -.005em;
}
.painel .ic { width: 19px; height: 19px; flex: none; }
.lat-marca .mark { width: 26px; height: 26px; border-radius: 8px; flex: none;
  background: linear-gradient(135deg, #8b5cf6, #22d3ee); }
.lat-marca .wordmark { font-weight: 700; font-size: 1rem; letter-spacing: -.02em; color: #fff; }
/* O brasão ocupa a lateral inteira: quem manda é a largura, e a altura vem da proporção
   do desenho. Por isso o link fura o recuo da barra com margem negativa quando é ele que
   está ali — os 16px de cada lado, que servem aos links do menu, comiam justamente a
   largura que o brasão quer. O teto de altura é largo de propósito: um brasão quadrado
   precisa ficar tão alto quanto largo, e ele só existe para que um desenho em pé não
   empurre o menu inteiro para fora da tela. */
.lat-marca.com-brasao { display: block; margin: -10px -16px 0; padding: 10px 6px 12px; }
.lat-marca .de { color: #8b8ca7; margin: 0 2px; font-weight: 500; }
.lat-link.on { background: color-mix(in srgb, var(--accent) 82%, #000); color: #fff; }
.lat-link .ic { opacity: .85; }

/* ---- avatar ---- */
.avatar { border-radius: 50%; object-fit: cover; flex: none; display: inline-block;
  background: var(--line); }
.avatar.xs { width: 22px; height: 22px; }
.avatar.sm { width: 28px; height: 28px; }
.avatar.md { width: 38px; height: 38px; }
/* O `lg` era usado em quatro telas (perfil, ficha do mochileiro, cartao da rede) e nunca
   teve regra: sem tamanho, a foto saia do tamanho do arquivo -- 96px vindo do Google e o
   que a pessoa tivesse enviado nos uploads. */
.avatar.lg { width: 64px; height: 64px; }
.avatar.xl { width: 84px; height: 84px; }
.avatar.vazio {
  display: inline-grid; place-items: center; font-weight: 700; letter-spacing: .01em;
  background: hsl(var(--tom, 250) 62% 92%); color: hsl(var(--tom, 250) 52% 34%);
}
.avatar.vazio.xs { font-size: .58rem; }
.avatar.vazio.sm { font-size: .68rem; }
.avatar.vazio.md { font-size: .82rem; }
.avatar.vazio.lg { font-size: 1.5rem; }
.avatar.vazio.xl { font-size: 1.9rem; }
html[data-theme="dark"] .avatar.vazio, html[data-theme="hub"] .avatar.vazio,
html[data-theme="lab"] .avatar.vazio { background: hsl(var(--tom, 250) 40% 26%); color: #fff; }
.navlink.eu { display: inline-flex; align-items: center; gap: 8px; padding-left: 6px; }
.navlink.eu .avatar.sm { width: 24px; height: 24px; }

/* ---- cartões ---- */
.cartao {
  background: var(--bg2); border-radius: var(--radius); box-shadow: var(--sombra);
  margin-bottom: 22px; overflow: hidden;
}
.cartao-cab {
  display: flex; align-items: center; gap: 14px; padding: 16px 24px;
  border-bottom: 1px solid var(--line);
}
.cartao-cab h2 { font-size: 1.02rem; font-weight: 600; margin: 0; letter-spacing: -.01em; }
.cartao-acoes { margin-left: auto; display: flex; gap: 8px; align-items: center; }
.cartao-corpo { padding: 22px 24px; }
.cartao-corpo > :first-child { margin-top: 0; }
.cartao-corpo > :last-child { margin-bottom: 0; }
.cartao-conta .cartao-corpo { padding: 20px 24px; }
.colunas > div > .cartao:last-child { margin-bottom: 0; }

.kpis { display: grid; gap: 18px; grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
  margin-bottom: 22px; }
html[data-theme="console"] .kpis .stat {
  background: var(--bg2); border: none; border-left: 3px solid var(--bar);
  box-shadow: var(--sombra); padding: 18px 20px;
}

/* ---- botões ---- */
.btn2 {
  display: inline-flex; align-items: center; gap: 8px; background: var(--accent); color: #fff;
  border: 1px solid transparent; border-radius: 9px; padding: 9px 16px; font: inherit;
  font-size: .85rem; font-weight: 600; cursor: pointer; text-decoration: none;
  transition: background .14s ease, border-color .14s ease, color .14s ease;
}
.btn2:hover { background: var(--accent-forte); }
.btn2.leve { background: color-mix(in srgb, var(--accent) 10%, transparent); color: var(--accent); }
.btn2.leve:hover { background: color-mix(in srgb, var(--accent) 18%, transparent); }
.btn2.perigo { background: color-mix(in srgb, var(--perigo) 12%, transparent); color: var(--perigo); }
.btn2.perigo:hover { background: var(--perigo); color: #fff; }
.btn2 .ic { width: 17px; height: 17px; }

/* ---- formulários do painel ---- */
.forma label, .filtro label { display: block; font-size: .78rem; color: var(--dim);
  font-weight: 600; margin-bottom: 16px; }
.forma input, .forma select, .forma textarea {
  width: 100%; margin-top: 6px; padding: 10px 13px; border: 1px solid var(--line);
  border-radius: 9px; background: var(--bg); color: var(--ink); font: inherit;
  font-weight: 400; font-size: .9rem;
}
.forma input:focus, .forma select:focus, .forma textarea:focus {
  outline: none; border-color: var(--accent); background: var(--bg2);
  box-shadow: 0 0 0 3px color-mix(in srgb, var(--accent) 14%, transparent);
}
.forma input:disabled { opacity: .6; }
.forma input[type=file] { padding: 8px; background: var(--bg); font-size: .82rem; }
/* A caixa de texto vinha com a mesma altura de linha de um campo de uma linha só, e três
   linhas escritas ficavam espremidas contra a borda. */
.forma textarea { resize: vertical; min-height: 5.5rem; line-height: 1.55; padding: 11px 13px; }
.forma-larga { max-width: 100%; }
.campos { display: grid; grid-template-columns: repeat(4, 1fr); gap: 0 18px; }
.campos .c2 { grid-column: span 2; }
.campos .c4 { grid-column: 1 / -1; }
.forma-pe { display: flex; gap: 10px; align-items: center; flex-wrap: wrap; margin-top: 6px; }
.marcar-destaque .hint { font-weight: 400; max-width: 34ch; }
.forma + form { margin-top: 18px; }
.bipar-campo .ic { width: 20px; height: 20px; color: var(--accent); flex: none; }
.bipar .btn2 { padding: 12px 18px; }
/* A dica ocupa a linha inteira embaixo: ela é para a primeira vez, não para todo dia. */
.bipar .hint { flex-basis: 100%; margin: 2px 0 0; }

.filtro { display: flex; gap: 10px; align-items: flex-end; flex-wrap: wrap; margin-bottom: 20px; }
.filtro label { margin-bottom: 0; flex: 1 1 320px; }
.filtro .busca { position: relative; display: flex; align-items: center; }
/* A lupa precisa do tamanho aqui. Ela so tinha o do `.painel .ic`, e a regra que a
   posiciona valia em qualquer lugar: fora do painel -- na barra da redacao, que e
   portal -- o svg sem width nasce no tamanho padrao de imagem, 300x150, e uma lupa
   gigante flutuava no meio da pagina. Posicionar sem dimensionar era a metade do
   trabalho; os 19px sao os mesmos do painel, entao la nada muda. */
.filtro .busca .ic { position: absolute; left: 12px; width: 19px; height: 19px;
  flex: none; color: var(--dim); }
.filtro .busca input { margin-top: 0; padding-left: 38px; }
.filtro input, .filtro select {
  padding: 10px 13px; border: 1px solid var(--line); border-radius: 9px;
  background: var(--bg); color: var(--ink); font: inherit; font-size: .88rem; width: 100%;
}
.filtro select { width: auto; }
.rolagem { overflow-x: auto; }
html[data-theme="console"] .ptable { border: none; background: transparent; }
html[data-theme="console"] .ptable th {
  border-bottom: 1px solid var(--line); color: var(--dim); font-size: .68rem;
}
html[data-theme="console"] .ptable td { border-bottom: 1px solid var(--line); vertical-align: middle; }
html[data-theme="console"] .ptable tbody tr:hover { background: var(--bg); }
html[data-theme="console"] .ptable .ptitle { color: var(--ink); }
html[data-theme="console"] .ptable .ptitle:hover { color: var(--accent); }
.foto-atual .hint { margin: 2px 0 10px; }
.foto-opcao.on { border-color: var(--accent); }

/* ---- avisos dentro do painel ---- */
html[data-theme="console"] .ok, html[data-theme="console"] .err {
  border-radius: 10px; font-size: .86rem; padding: 12px 16px;
}
html[data-theme="console"] .empty {
  color: var(--dim); font-size: .9rem; background: var(--bg); border-radius: 10px;
  padding: 22px 24px; text-align: center;
}
html[data-theme="console"] .aviso { border-radius: 10px; }
html[data-theme="console"] .grid { gap: 22px 20px; grid-template-columns: repeat(auto-fill, minmax(240px, 1fr)); }
html[data-theme="console"] .card { border: 1px solid var(--line); border-radius: 10px; overflow: hidden; }
html[data-theme="console"] .card-in { padding: 14px 16px; }
html[data-theme="console"] .section-title { font-size: 1rem; }

@media (max-width: 1000px) {
.campos { grid-template-columns: repeat(2, 1fr); }
}
@media (max-width: 820px) {
/* A fita sangra até a borda da barra, então o recuo negativo tem de acompanhar o
     recuo do celular — com o valor da tela grande ela vazaria 14px de cada lado. */
.cartao-corpo { padding: 18px 16px; }
.cartao-cab { padding: 14px 16px; }
}
@media (max-width: 560px) {
.campos { grid-template-columns: 1fr; }
.campos .c2, .campos .c4 { grid-column: auto; }
}
.marca-cab .hint { margin: 2px 0 0; }
.marca-preview.vazia {
  display: grid; place-items: center; color: var(--dim); font-size: .72rem;
  border-style: dashed;
}
.marca-txt .hint { margin: 2px 0 10px; }
.selo-cat.grande { font-size: .92rem; padding: 7px 18px; }
.selo-cat.grande::before { width: 12px; height: 12px; }
.conta-capa .hint { margin: 12px 0 0; max-width: 56ch; }
.logo-grupo.vazia.xs { font-size: .54rem; }
.logo-grupo.vazia.md { font-size: 1rem; }
.logo-grupo.vazia.lg { font-size: 1.3rem; }
.logo-grupo.vazia.xl { font-size: 2.2rem; }
.logo-grupo:not(.vazia) { background: #fff; border: 1px solid var(--line); object-fit: contain; padding: 3px; }
.chip-estado.aberto { background: #e0e7ff; color: #3730a3; }

.valor { font-variant-numeric: tabular-nums; font-weight: 600; white-space: nowrap; }
.valor.receber { color: #15803d; }
.valor.pagar { color: #b91c1c; }
.lanc-soma .valor { font-size: .92rem; }
.forma .radio-cartao input[type=radio] { margin-top: 0; }
.campos label .hint { display: block; margin-top: 4px; font-weight: 400; }
.filtro input[type=month], .filtro input[type=date] { width: auto; min-width: 150px; }
.kpi .valor, .kpi-num { letter-spacing: -.03em; }

/* o lançamento mostra cliente ou fornecedor, conforme o tipo escolhido */
.forma:has(.radio-cartao.receber input:checked) .so-pagar,
.forma:has(.radio-cartao.pagar input:checked) .so-receber { display: none; }
.campos label .hint a { color: var(--accent); }
.produto-pe .valor { font-size: 1.05rem; }
.foto-produto.vazia {
  display: grid; place-items: center; color: var(--dim);
  border-bottom: 1px solid var(--line);
}
.foto-produto.vazia .ic { width: 34px; height: 34px; opacity: .5; }
.fotos-grade .empty { grid-column: 1 / -1; }

/* =================== o site do mochileiro =================== */

html[data-theme="loja"] {
  --bg: #ffffff; --bg2: #f7f8fb; --ink: #14161c; --dim: #5c6472; --line: #e6e9f0;
  --radius: 14px;
  --font-body: "Inter", system-ui, -apple-system, sans-serif;
  --font-head: "Space Grotesk", "Inter", system-ui, sans-serif;
}

.loja-hero { padding: 0 0 34px; max-width: 60ch; }
.loja-hero h1 { font-size: clamp(2rem, 5vw, 3rem); margin: 0 0 .3em; color: var(--marca-texto); }
.loja-hero p { color: var(--dim); font-size: 1.1rem; margin: 0; }
.sem-foto.grande { border-radius: var(--radius); border: 1px solid var(--line); }
.campo-junto { display: flex; align-items: center; gap: 0; margin-top: 6px; }
.campo-junto input { border-radius: 9px 0 0 9px; margin-top: 0; }
.campo-junto .sufixo {
  padding: 10px 12px; border: 1px solid var(--line); border-left: none; border-radius: 0 9px 9px 0;
  background: var(--bg); color: var(--dim); font-size: .85rem; white-space: nowrap;
}
.site-estado { font-size: .92rem; margin: 0 0 18px; padding: 12px 16px; border-radius: 10px; }
.site-estado.on { background: #dcfce7; color: #166534; }
.site-estado.on a { color: #166534; font-weight: 600; }
.site-estado.off { background: var(--bg); color: var(--dim); }
.forma input[type=color] {
  width: 64px; height: 40px; padding: 3px; border-radius: 9px; cursor: pointer;
  background: var(--bg);
}

/* caixas de opção dentro dos formulários do painel */
.campos .c3 { grid-column: span 3; }
.campos .caixas { display: flex; flex-direction: column; gap: 4px; justify-content: center; }
.campos .caixas .chave { margin-bottom: 0; }
@media (max-width: 1000px) {
.campos .c3 { grid-column: span 2; }
}
@media (max-width: 560px) {
.campos .c3 { grid-column: auto; }
}
.chip-estado.aberto { background: #fef3c7; color: #92400e; }
.prod-escolha-txt .valor { font-size: .95rem; }
.prod-escolha-add .btn2 { padding: 8px 14px; font-size: .82rem; }
.item-manual .forma { margin-top: 16px; }
.perfil-foto.vazia { display: grid; place-items: center; font-family: var(--font-head);
  font-size: 3rem; font-weight: 700; color: #fff; background: var(--marca); }
.loja-btn.leve { background: var(--bg2); color: var(--marca-texto); border: 1px solid var(--line); }
.loja-btn.leve:hover { border-color: var(--marca); filter: none; }
.destaque-bola .ic { width: 26px; height: 26px; }
.destaques .destaque.on .destaque-bola { border-color: var(--marca);
  box-shadow: 0 0 0 2px var(--bg), 0 0 0 4px var(--marca); }
.destaques .destaque.on .destaque-nome { color: var(--ink); font-weight: 600; }

/* o produto como post — só dentro da loja do mochileiro */
[data-theme="loja"] .post { display: grid; grid-template-columns: 1.25fr 1fr; gap: 0;
  border: 1px solid var(--line); border-radius: var(--radius); overflow: hidden;
  margin: 10px 0 40px; background: var(--bg2); }
.post-cab { display: flex; align-items: center; gap: 12px; padding: 16px 20px;
  border-bottom: 1px solid var(--line); }
.post-avatar.vazia { display: grid; place-items: center; background: var(--marca); color: #fff;
  font-weight: 700; font-size: .95rem; }
.post-cab strong { display: block; font-size: .95rem; }
.post-corpo { padding: 20px; flex: 1 1 auto; }
.post-corpo h1 { font-size: 1.4rem; margin: 0 0 8px; }

@media (max-width: 780px) {
[data-theme="loja"] .post { grid-template-columns: 1fr; }
.perfil-foto.vazia { font-size: 2rem; }
}

/* escolha do jeito do site */
.rotulo-solto { font-size: .78rem; color: var(--dim); font-weight: 600; margin: 4px 0 10px; }
/* o perfil respira melhor numa coluna mais estreita */
[data-theme="loja"] .perfil-topo, [data-theme="loja"] .destaques,
[data-theme="loja"] .perfil-grade, [data-theme="loja"] .post {
  max-width: 935px; margin-left: auto; margin-right: auto; }

/* =================== loja em cardápio =================== */

.cardapio-hero { padding-bottom: 20px; }
.cat-foto.vazia { display: grid; place-items: center; font-weight: 700; color: var(--accent);
  background: color-mix(in srgb, var(--accent) 12%, transparent); border-style: dashed; }
.cat-forma .btn2 { flex: none; }

/* =================== loja em capa =================== */

/* A capa da loja é faixa que sangra até as bordas e encosta na barra: o `-34px` de cima
   desfaz a folga do `main`, que existe para o conteúdo e não para uma faixa. */
.capa-hero {
  margin: -34px -26px 0; padding: 90px 26px 80px; background: var(--bg2);
  border-bottom: 1px solid var(--line);
}
.capa-hero.com-foto { background-size: cover; background-position: center; border-bottom: none; }
.capa-hero.com-foto .capa-hero-txt, .capa-hero.com-foto h1 { color: #fff; }
.capa-hero.com-foto .capa-chamada { color: #fff; opacity: .92; }
.capa-hero.com-foto .capa-sobre { color: #fff; opacity: .8; }
.capa-hero-txt { max-width: 640px; margin: 0 auto; text-align: center; }
.capa-hero h1 { font-size: clamp(2.2rem, 6vw, 3.4rem); margin: 0 0 .25em; color: var(--marca-texto); }
.capa-hero.com-foto .loja-btn.leve { background: rgba(255,255,255,.14); color: #fff;
  border-color: rgba(255,255,255,.4); }

@media (max-width: 860px) {
.capa-hero { padding: 60px 20px 60px; }
}
.horarios li.fechado span { color: var(--dim); font-weight: 400; opacity: .8; }
/* rótulos com caixa de marcação precisam vencer o display:block do formulário */
.forma label.chave, .forma .chave, .forma label.dia-chave {
  display: flex; align-items: center; gap: 10px;
}
.forma .campos .caixas .chave { gap: 10px; }
.rapido-bts .btn2 { padding: 8px 14px; font-size: .82rem; }
.ponto { width: 10px; height: 10px; border-radius: 50%; flex: none; }
.espaco-legenda li > span:first-child:not(.ponto) { flex: 1 1 auto; }
.loja-hero.pequeno { padding: 40px 0 22px; }
.loja-hero.pequeno h1 { font-size: clamp(1.7rem, 4vw, 2.4rem); }
.loja-hero.pequeno p { color: var(--dim); margin: 0; }
.cat-chip.on { border-color: var(--marca); color: var(--marca-texto);
  background: color-mix(in srgb, var(--marca) 10%, var(--bg2)); }

/* foto de capa do site */
.capa-escolha { display: flex; gap: 14px; align-items: flex-start; margin-top: 6px; }
.capa-previa { width: 132px; height: 74px; object-fit: cover; border-radius: 10px; flex: none;
  border: 1px solid var(--line); background: var(--bg); }
.capa-previa.vazia { display: grid; place-items: center; color: var(--dim); font-size: .72rem;
  border-style: dashed; }
.capa-campos { display: flex; flex-direction: column; gap: 6px; flex: 1 1 auto; min-width: 0; }
.capa-campos input[type=file] { font-size: .82rem; padding: 8px; border: 1px solid var(--line);
  border-radius: 9px; background: var(--bg); }
.capa-campos .linkish { align-self: flex-start; font-size: .8rem; }

/* =================== pedido em papel =================== */

html[data-theme="folha"] {
  --bg: #ffffff; --bg2: #f7f8fb; --ink: #14181f; --dim: #5c6472; --line: #e3e7ee;
  --accent: #4f46e5; --radius: 10px;
  --font-body: "Inter", system-ui, sans-serif; --font-head: "Inter", system-ui, sans-serif;
}
.folha-tabela .num { text-align: right; white-space: nowrap; font-variant-numeric: tabular-nums; }
.folha-total .grande { font-size: 1.3rem; }
/* A folha da calculadora. O desperdício ganha bloco próprio e cor de alerta porque é a parte
   que a pessoa abriu o papel para descobrir — some no meio de uma tabela cinza. */
/* O carrinho na barra do portal: numero ao lado do desenho, so quando tem item dentro. */
/* Marcar vários na vitrine e mandar de uma vez. O cartão continua sendo um link para a
   ficha; o pé de marcar fica FORA dele, porque form dentro de <a> é HTML que o navegador
   desmonta. */
.curso-card.com-pegar { display: flex; flex-direction: column; }
.curso-card.com-pegar > .curso-card-link { display: flex; flex-direction: column; flex: 1;
  text-decoration: none; color: inherit; min-width: 0; }
/* O pé de "levar" dentro do cartão da vitrine: caixa de marcar de um lado, quantidade do
   outro, na faixa embaixo do cartão. Antes era uma caixinha crua e um campo de número solto
   colados na borda — o único par de campos do portal sem desenho. */
.pegar { display: flex; align-items: center; justify-content: space-between; gap: 10px;
  padding: 12px 18px 16px; border-top: 1px solid var(--line); }
.pegar-marca { display: inline-flex; align-items: center; gap: 9px; cursor: pointer;
  font-size: .88rem; font-weight: 600; }
.pegar-marca input { width: 18px; height: 18px; accent-color: var(--accent); cursor: pointer; }
.pegar-marca input:disabled { cursor: default; }
.pegar-marca input:disabled + span { color: var(--dim); }
.pegar-qtd { display: inline-flex; align-items: center; gap: 8px; color: var(--dim);
  font-size: .7rem; font-weight: 600; letter-spacing: .07em; text-transform: uppercase; }
.pegar-qtd input { width: 62px; padding: 8px 10px; border: 1px solid var(--line);
  border-radius: 9px; background: var(--bg); color: var(--ink); font: inherit;
  font-size: .92rem; text-align: center; font-variant-numeric: tabular-nums; }
.pegar-qtd input:focus, .pegar-marca input:focus-visible {
  outline: 2px solid color-mix(in srgb, var(--accent) 45%, transparent);
  border-color: var(--accent); }
/* A barra que fecha a grade: marcar todos de uma vez e mandar. */
.pegar-pe { display: flex; align-items: center; flex-wrap: wrap; gap: 14px; margin-top: 22px;
  padding: 16px 20px; border: 1px solid var(--line); border-radius: var(--radius);
  background: var(--bg2); }
.pegar-todos { display: inline-flex; align-items: center; gap: 9px; font-size: .88rem;
  font-weight: 600; cursor: pointer; }
.pegar-todos input { width: 18px; height: 18px; accent-color: var(--accent); cursor: pointer; }
.pegar-pe .hint { margin: 0; flex: 1 1 14rem; }

/* As barrinhas de velocidade e tom da voz. */
.forma input[type="range"] { width: 100%; accent-color: var(--accent); margin: 6px 0 2px; }
.forma input[type="range"] + .hint { display: flex; justify-content: space-between; gap: 10px; }
.forma input[type="range"] + .hint b { color: var(--ink); font-variant-numeric: tabular-nums; }
.meu-som-txt .hint { margin: 0; }

.carrinho-bt { display: inline-flex; align-items: center; gap: 6px; }
.carrinho-bt svg { width: 17px; height: 17px; fill: none; stroke: currentColor;
  stroke-width: 1.8; }
.carrinho-bt span { display: grid; place-items: center; min-width: 19px; height: 19px;
  padding: 0 5px; border-radius: 999px; background: var(--accent); color: #fff;
  font-size: .7rem; font-weight: 800; }
/* O aviso de que comprar pede conta fica **embaixo** do botão, e não no lugar dele: o botão
   é o que a mão procura numa loja, e a explicação só faz sentido depois de ele existir. */
.prod-so-mochileiro { margin: 14px 0; flex-basis: 100%; }
.add-carrinho a.btn { align-self: flex-end; }
.envio-pedido .hint { flex: 1 1 100%; }
.tabela-limites th[scope=row] .pslug { display: block; font-weight: 400; }

/* barra de limite nos quadradinhos do painel */
.kpi-barra { display: block; height: 5px; border-radius: 999px; background: var(--line);
  margin: 10px 0 6px; overflow: hidden; }
.kpi-barra span { display: block; height: 100%; border-radius: 999px; background: var(--accent); }
.kpi-barra.quase span { background: var(--alerta); }
.kpi-barra.cheio span { background: var(--perigo); }
.chip-estado.erro { background: #fee2e2; color: #991b1b; }
.ig-foto.vazia { display: grid; place-items: center; font-weight: 700; color: var(--accent);
  background: color-mix(in srgb, var(--accent) 12%, transparent); }
.ig-opcao.on { border-color: var(--accent); background: color-mix(in srgb, var(--accent) 6%, transparent); }
.post-agenda-foto.vazia { display: grid; place-items: center; font-size: 1.6rem; color: var(--dim);
  background: var(--bg); }
.campo-junto .sufixo.botao { cursor: pointer; font-weight: 600; color: var(--accent);
  border-left: none; background: var(--bg2); }
.campo-junto .sufixo.botao:hover { background: color-mix(in srgb, var(--accent) 10%, var(--bg2)); }
.fonte-linha .forma { flex: 1 1 auto; min-width: 0; }
.noticia-foto.vazia { display: grid; place-items: center; font-size: .72rem; color: var(--dim);
  border-style: dashed; }

/* crédito da fonte no portal */
.fonte-selo { background: color-mix(in srgb, var(--accent) 12%, transparent); color: var(--accent);
  font-weight: 600; font-size: .78rem; padding: 2px 10px; border-radius: 999px; }
.fonte-caixa { border: 1px solid var(--line); border-left: 3px solid var(--accent);
  border-radius: var(--radius); padding: 18px 22px; margin: 30px 0 10px; background: var(--bg2); }
.fonte-caixa strong { display: block; font-size: .78rem; letter-spacing: .14em;
  text-transform: uppercase; color: var(--dim); margin-bottom: 6px; }
.fonte-caixa p { margin: 0; font-size: .95rem; }
.fonte-caixa a { color: var(--accent); }
.fonte-caixa .hint { margin-top: .5rem; }

/* ---------------- a matéria: menos caixa, mais leitura ---------------- */

.post { max-width: 44rem; margin: 44px auto 0; }
.post-topo { margin-bottom: 6px; }
.post h1 { letter-spacing: -.02em; margin-bottom: .3em; }
.post .standfirst { font-size: 1.28rem; line-height: 1.5; color: var(--dim); margin: 0 0 22px; }
.post .post-meta {
  border-bottom: none; padding-bottom: 0; gap: 10px 12px; font-size: .9rem;
}
.post .post-meta .fonte-selo { font-size: .8rem; padding: 3px 12px; }
.post-tags { display: flex; flex-wrap: wrap; gap: 8px; margin: 18px 0 2px; }
.post-tags .tag, .card .meta .tag {
  text-decoration: none; border-color: transparent; font-weight: 600; padding: 4px 13px;
  color: var(--accent); background: color-mix(in srgb, var(--accent) 9%, transparent);
  transition: background .15s ease;
}
.post-tags .tag:hover, .card .meta .tag:hover {
  background: color-mix(in srgb, var(--accent) 18%, transparent);
}

/* a capa passa um pouco da coluna do texto: o artigo deixa de ser um bloco só */
.post .cover { margin: 32px 0 10px; }
.post .cover img {
  border: none; border-radius: 22px; box-shadow: 0 22px 48px rgba(15, 23, 42, .16);
  display: block;
}
.post .cover figcaption {
  font-size: .82rem; color: var(--dim); margin-top: 12px; padding-left: 2px;
}
/* A capa já sangrou 65px para cada lado, de quando a matéria era uma coluna sozinha no
   meio da página e havia margem sobrando dos dois lados. Com a coluna de leitura ao lado
   do texto, do lado direito não sobra nada: o vão da grade tem 48px e a foto entrava
   65px por cima da lista, e à esquerda ela passava do respiro da página. Sangramento só
   funciona quando existe margem para sangrar; aqui não existe mais, então a capa vai na
   largura da coluna — que é generosa o bastante para a foto respirar sozinha. */
.post .cover img { width: 100%; }

/* primeiro parágrafo puxa o olho para dentro do texto */
.post .prose > p:first-of-type { font-size: 1.24rem; line-height: 1.7; color: var(--ink); }
.post .prose { margin-top: 34px; }

.post .fonte-caixa {
  border: none; border-left: 4px solid var(--accent); border-radius: 8px 20px 20px 8px;
  background: color-mix(in srgb, var(--accent) 6%, transparent); padding: 20px 26px;
  margin: 38px 0 6px;
}
.post .salvar { margin: 18px 0 0; }
.more .card .thumb { border-radius: 18px; }

/* nuvem de assuntos */
.nuvem-tags { display: flex; flex-wrap: wrap; gap: 10px; }
.nuvem-tags .tag {
  text-decoration: none; font-size: .95rem; padding: 7px 15px; font-weight: 600;
  color: var(--accent); background: color-mix(in srgb, var(--accent) 9%, transparent);
  border-color: transparent;
}
.nuvem-tags .tag:hover { background: color-mix(in srgb, var(--accent) 18%, transparent); }
.nuvem-tags .tag span { color: var(--dim); font-weight: 500; margin-left: 6px; font-size: .82em; }
.outras-tags { margin-top: 40px; }

/* ---- miniatura na lista de publicações ---- */
.ptable td.pcapa { width: 78px; padding-right: 0; }
.rede-cartao header .secao-ponto { background: var(--cor); }
.rede-linha .btn2 { padding: 5px 13px; font-size: .8rem; }

/* ---------------- estoque, impressoras e produção ---------------- */
.ptable td.num, .ptable th.num { text-align: right; white-space: nowrap;
  font-variant-numeric: tabular-nums; }
.ptable b.mais { color: #166534; }
.ptable b.menos { color: var(--perigo); }
.estoque-topo .valor { font-size: 1.6rem; font-weight: 700; display: block; }
.est-bts .btn2 { display: inline-flex; align-items: center; gap: 6px; }
.est-bts .ic { width: 16px; height: 16px; }
.est-local-quem .pslug { display: block; }
.est-local-bts .btn2 { padding: 6px 11px; font-size: .8rem; }
.est-mov-que .pslug { display: block; }
.impressora header .pslug { display: block; }
.ficha-custo .forte strong, .ficha-custo .ok strong { color: #166534; }
.kpis.dentro { gap: 14px; }

/* ---------------- link na bio: a página pública ---------------- */

html[data-theme="bio"] {
  --bg: #ffffff; --ink: #14161c; --dim: #5c6472; --line: #e6e9f0;
  --caixa: #ffffff; --caixa-linha: #e2e6ef; --sombra: 0 6px 18px rgba(12,14,18,.07);
  --curva: 16px;
  --font-body: "Inter", system-ui, -apple-system, sans-serif;
  --font-head: "Space Grotesk", "Inter", system-ui, sans-serif;
}
html[data-theme="bio"][data-botao="pilula"] { --curva: 999px; }
html[data-theme="bio"][data-botao="reto"]   { --curva: 4px; }

html[data-theme="bio"][data-estilo="escuro"] {
  --bg: #0e1015; --ink: #f3f5f9; --dim: #9aa3b2; --line: #232733;
  --caixa: rgba(255,255,255,.06); --caixa-linha: rgba(255,255,255,.14);
  --sombra: none;
}
html[data-theme="bio"][data-estilo="gradiente"],
html[data-theme="bio"][data-estilo="foto"] {
  --ink: #ffffff; --dim: rgba(255,255,255,.78);
  --caixa: rgba(255,255,255,.14); --caixa-linha: rgba(255,255,255,.28);
  --sombra: none;
}

.bio-body {
  background: var(--bg); color: var(--ink); font-family: var(--font-body);
  font-size: 17px; line-height: 1.6; margin: 0; min-height: 100vh;
}
html[data-theme="bio"][data-estilo="gradiente"] .bio-body {
  background: linear-gradient(165deg, var(--bio) 0%, #0f1015 130%); background-attachment: fixed;
}
html[data-theme="bio"][data-estilo="foto"] .bio-body {
  background: linear-gradient(180deg, rgba(10,11,15,.62), rgba(10,11,15,.86)), var(--bio-capa, none);
  background-size: cover; background-position: center; background-attachment: fixed;
}
.bio-body h1 { font-family: var(--font-head); letter-spacing: -.02em; }

main.bio {
  max-width: 560px; margin: 0 auto; padding: 46px 20px 40px;
  display: flex; flex-direction: column; gap: 26px;
}
.bio-topo { text-align: center; display: flex; flex-direction: column; align-items: center; gap: 6px; }
.bio-topo.curto { margin-bottom: 4px; }
.bio-foto {
  width: 108px; height: 108px; border-radius: 50%; object-fit: cover; margin-bottom: 6px;
  border: 3px solid var(--caixa-linha); background: var(--caixa);
}
.bio-foto.vazia {
  display: grid; place-items: center; font-family: var(--font-head); font-size: 2.2rem;
  font-weight: 700; color: var(--bio); background: #fff;
}
.bio-topo h1 { font-size: 1.6rem; margin: 0; }
.bio-arroba { margin: 0; color: var(--dim); font-size: .86rem; }

.bio-botoes { display: flex; flex-direction: column; gap: 12px; }
.bio-bt {
  display: flex; align-items: center; gap: 14px; text-decoration: none; color: inherit;
  background: var(--caixa); border: 1px solid var(--caixa-linha); border-radius: var(--curva);
  padding: 15px 18px; box-shadow: var(--sombra); transition: transform .12s ease;
}
.bio-bt:hover { transform: translateY(-2px); }
.bio-bt.destaque { background: var(--bio); border-color: transparent; color: #fff; }
html[data-theme="bio"][data-estilo="gradiente"] .bio-bt.destaque,
html[data-theme="bio"][data-estilo="foto"] .bio-bt.destaque { background: #fff; color: #14161c; }
.bio-bt-ic { font-size: 1.3rem; line-height: 1; width: 26px; text-align: center; flex: none; }
.bio-bt-txt { flex: 1; display: flex; flex-direction: column; gap: 2px; min-width: 0; }
.bio-bt-txt strong { font-weight: 600; }
.bio-bt-txt small { color: var(--dim); font-size: .84rem; line-height: 1.35; }
.bio-bt.destaque .bio-bt-txt small { color: inherit; opacity: .8; }
.bio-bt-seta { color: var(--dim); font-size: 1.4rem; line-height: 1; flex: none; }
.bio-bt.destaque .bio-bt-seta { color: inherit; opacity: .7; }
.bio-pe { text-align: center; color: var(--dim); font-size: .8rem; margin-top: 10px; }
.bio-pe a { color: inherit; }
.bio-cabeca-txt .kpis { grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); }
.bio-ficha.off { opacity: .6; }
tr.off td { opacity: .6; }
.bio-ficha-ic .marca-ic, .bio-ficha-ic .ic { width: 22px; height: 22px; }
.bio-ficha-ic.pequeno .marca-ic, .bio-ficha-ic.pequeno .ic { width: 17px; height: 17px; }
.bio-atalho-ic .marca-ic, .bio-atalho-ic .ic { width: 22px; height: 22px; }
.capa-previa.redonda { border-radius: 50%; width: 84px; height: 84px; object-fit: cover; }
.pslug.travada { font-style: italic; }
.quadro-coluna .empty { margin: 0; font-size: .84rem; }

/* ---------------- link na bio: os quatro modelos de página ---------------- */

/* Cartão — tudo dentro de uma folha branca, cara de cartão de visita. */
html[data-theme="bio"][data-modelo="cartao"] main.bio {
  max-width: 460px; margin: 34px auto; padding: 32px 24px 26px;
  background: var(--caixa); border: 1px solid var(--caixa-linha);
  border-radius: 22px; box-shadow: 0 18px 44px rgba(12,14,18,.13); gap: 22px;
}
html[data-theme="bio"][data-modelo="cartao"][data-estilo="claro"] main.bio { background: #fff; }
html[data-theme="bio"][data-modelo="cartao"] .bio-foto { width: 88px; height: 88px; }
html[data-theme="bio"][data-modelo="cartao"] .bio-topo h1 { font-size: 1.35rem; }
html[data-theme="bio"][data-modelo="cartao"] .bio-bt { padding: 12px 15px; }
html[data-theme="bio"][data-modelo="cartao"] .bio-botoes { gap: 9px; }
html[data-theme="bio"][data-modelo="cartao"] .bio-pe { margin-top: 4px; }

/* Grade — dois por linha, ícone grande em cima do nome. */
html[data-theme="bio"][data-modelo="grade"] .bio-botoes {
  display: grid; grid-template-columns: 1fr 1fr; gap: 12px;
}
html[data-theme="bio"][data-modelo="grade"] .bio-bt {
  flex-direction: column; align-items: center; text-align: center; gap: 8px;
  padding: 20px 14px; min-height: 116px; justify-content: center;
}
html[data-theme="bio"][data-modelo="grade"] .bio-bt-ic { font-size: 1.9rem; width: auto; }
html[data-theme="bio"][data-modelo="grade"] .bio-bt-txt { flex: none; align-items: center; }
html[data-theme="bio"][data-modelo="grade"] .bio-bt-txt small { font-size: .78rem; }
html[data-theme="bio"][data-modelo="grade"] .bio-bt-seta { display: none; }
html[data-theme="bio"][data-modelo="grade"] .bio-bt.destaque { grid-column: 1 / -1; }
html[data-theme="bio"][data-modelo="capa"] main.bio { gap: 20px; }
.bio-capa-larga + .bio-topo { margin-top: -74px; }
html[data-theme="bio"][data-modelo="capa"] .bio-foto {
  width: 120px; height: 120px; border-width: 4px; border-color: var(--bg);
  box-shadow: 0 10px 24px rgba(12,14,18,.22);
}
html[data-theme="bio"][data-modelo="capa"][data-estilo="gradiente"] .bio-foto,
html[data-theme="bio"][data-modelo="capa"][data-estilo="foto"] .bio-foto {
  border-color: rgba(255,255,255,.5);
}
html[data-theme="bio"][data-modelo="capa"] .bio-topo h1 { font-size: 1.75rem; }

@media (max-width: 420px) {
html[data-theme="bio"][data-modelo="grade"] .bio-bt { min-height: 104px; padding: 16px 10px; }
}
.caixas .rotulo-solto { margin: 0 0 4px; }

html[data-theme="bio"][data-estilo="meu"] .bio-bt { color: var(--bio-bt-ink, var(--ink)); }
html[data-theme="bio"][data-estilo="meu"] .bio-bt .bio-bt-txt small,
html[data-theme="bio"][data-estilo="meu"] .bio-bt .bio-bt-seta { color: inherit; opacity: .68; }
html[data-theme="bio"][data-estilo="meu"] .bio-bt.destaque {
  background: var(--bio); border-color: transparent; color: #fff;
}
.cartao-acoes .btn2.on { border-color: var(--accent); color: var(--accent); font-weight: 700; }
.aba-painel .ic { width: 17px; height: 17px; }
.aba-painel.on { color: var(--accent); border-bottom-color: var(--accent); }
.mapa-br .uf.vazio { fill: var(--calor-vazio); }

/* ---------------- a jornada: o caminho desenhado no mapa ---------------- */
/* O mesmo mapa do painel de acessos, com os estados todos no tom do estado vazio: aqui
   quem tem de aparecer é a linha, e estado pintado por cima dela viraria informação que
   não existe. Por isso o hover também é desligado — no caminho não há o que clicar. */
.mapa-jornada .uf, .mapa-jornada .uf:hover { fill: var(--calor-vazio); }
.mapa-jornada .jr-linha { fill: none; stroke: var(--accent); stroke-width: 6;
  stroke-linecap: round; stroke-linejoin: round; }
/* A parada é um furo na linha, e não uma bola cheia: assim dá para ver a linha passando
   por dentro dela e a ordem do caminho continua legível onde as cidades ficam perto. */
.mapa-jornada .jr-parada { fill: var(--bg2); stroke: var(--accent); stroke-width: 4; }
.mapa-jornada .jr-parada.ponta { fill: var(--accent); }
/* O marcador é o ponto inteiro da tela, então ele é o único elemento com cor de alerta e
   com halo: num mapa cheio de linha e bolinha da mesma cor, "onde eu estou" tem de ser
   achado sem procurar. O halo é o mesmo tom, translúcido — não é sombra, é alcance. */
.mapa-jornada .jr-halo { fill: var(--accent); opacity: .18; }
.mapa-jornada .jr-marcador { fill: var(--perigo, #c0392b); stroke: var(--bg2); stroke-width: 4; }
.jr-andado { margin: 0 0 8px; font-size: 1.05rem; }
.jr-item .kpi-barra, .jr-andado + .kpi-barra { margin: 2px 0 6px; }
.jr-item .btn2 { justify-self: start; margin-top: 8px; }
.jr-total { margin: 14px 0 2px; font-size: 1.05rem; }
.jr-motivo { margin: 0 0 4px; color: var(--dim); font-style: italic; }
/* Em que perna a parada entra. Só aparece em desafio de ida e volta — no de ida só existe
   uma perna, e dizer "na ida e na volta" ali seria falar de uma volta que não há. */
.jr-trecho-selo { font-size: .7rem; font-weight: 700; letter-spacing: .06em;
  text-transform: uppercase; padding: 2px 8px; border-radius: 999px; color: var(--dim);
  border: 1px solid var(--line); }
.jr-trecho-selo.ida { color: var(--accent); border-color: var(--accent); }
.jr-trecho-selo.volta { color: var(--perigo, #c0392b); border-color: var(--perigo, #c0392b); }

/* A página pública do desafio: a mesma capa da ficha, sem nada para administrar. O cartão
   não tem título nem ações — quem chega pelo link veio ver, não mexer. */
.desafio-hero { text-align: left; }
/* Com foto de capa o topo vira a foto, e o texto ganha um véu escuro por baixo: título
   branco sobre foto clara é título que some, e a foto é de quem publica — não dá para
   contar com o contraste dela. */
.desafio-hero.com-capa { background-size: cover; background-position: center;
  border-radius: var(--radius); padding: 34px 28px; position: relative; overflow: hidden;
  color: #fff; }
.desafio-hero.com-capa::before { content: ""; position: absolute; inset: 0;
  background: linear-gradient(180deg, rgba(10,10,14,.45), rgba(10,10,14,.78)); }
.desafio-hero.com-capa .desafio-hero-in { position: relative; }
.desafio-hero.com-capa h1, .desafio-hero.com-capa .dek,
.desafio-hero.com-capa .kicker, .desafio-hero.com-capa .desafio-quem { color: #fff; }
.desafio-hero.com-capa .desafio-quem { opacity: .85; }
.desafio-avatar { width: 84px; height: 84px; border-radius: 50%; object-fit: cover;
  border: 3px solid var(--bg2); flex: none; }
.desafio-hero.com-capa .desafio-avatar { border-color: rgba(255,255,255,.8); }

/* A página independente: o desafio e mais nada. Sem topo, sem rodapé de seções — só uma
   linha no pé dizendo com o que foi feito, que é a contrapartida deste modo. */
/* A página solta usa a **mesma largura** do portal (`--max`) e o mesmo respiro lateral: é a
   mesma página, só sem a mobília em volta — largura diferente faria o mapa, a tabela e os
   cartões se recomporem de outro jeito, e o desafio pareceria outro site. */
.pagina-solta main { max-width: var(--max); margin: 0 auto; padding: 28px 26px 10px; }
.feito-com { text-align: center; padding: 18px 20px 40px; }
.feito-com a { color: var(--dim); text-decoration: none; font-size: .85rem; }
.feito-com a:hover { color: var(--accent); }
.feito-com strong { color: var(--ink); font-weight: 600; }
.desafio-quem { color: var(--dim); font-size: .92rem; margin: 6px 0 0; }
.desafio-capa { margin-bottom: 18px; }
.desafio-onde { margin: 10px 0 4px; font-size: 1.02rem; }
.desafio-caminho { color: var(--dim); font-size: .9rem; margin: 4px 0 10px; }
.desafio-regua { font-size: .88rem; color: var(--dim); margin: 0 0 8px; }
/* Os esportes viram três números grandes, e não uma tabela: de fora ninguém confere conta,
   só quer ver o tamanho do esforço. */
.desafio-esportes { list-style: none; display: flex; flex-wrap: wrap; gap: 18px;
  margin: 12px 0 4px; padding: 0; }
.desafio-esportes li { display: flex; flex-direction: column; }
.desafio-esportes strong { font-size: 1.15rem; font-variant-numeric: tabular-nums; }
.desafio-esportes span { font-size: .78rem; color: var(--dim); text-transform: uppercase;
  letter-spacing: .08em; }
.desafio-redes { margin-top: 14px; }
.desafio-redes .hint { margin-bottom: 6px; }
.desafio-pe { max-width: 620px; }

/* A capa da ficha da jornada: o mapa de um lado, o que ele quer dizer do outro. Empilhados,
   o mapa empurrava os números para fora da primeira tela e a pergunta "onde eu estou?" ficava
   abaixo da dobra — que é o contrário do motivo de existir esta tela. O mapa não passa de
   440px porque acima disso ele só cresce o vazio do oceano, e o texto do lado fica órfão. */
.jr-capa { display: grid; gap: 26px; align-items: center;
  grid-template-columns: minmax(0, 440px) minmax(0, 1fr); }
.jr-capa-mapa { min-width: 0; }
.jr-capa-diz { min-width: 0; display: flex; flex-direction: column; justify-content: center; }
.jr-capa-diz > :first-child { margin-top: 0; }
.jr-capa-diz .jr-total { margin-top: 0; }
.jr-capa-diz p:last-child { margin-bottom: 0; }
/* No celular a capa volta a ser uma coluna, e aí o mapa vem primeiro: é ele que se reconhece
   de relance, e o número embaixo se lê em seguida sem precisar rolar de volta. */
@media (max-width: 900px) {
.jr-capa { grid-template-columns: 1fr; gap: 16px; }
.jr-capa-mapa { max-width: 440px; margin: 0 auto; }
}

/* As tabelas da jornada são as `.ptable` do portal — era `class="tab"`, que não existe no
   CSS: sem borda, sem respiro e com os números encostados à esquerda, e por isso a aba dos
   treinos parecia outro programa. Aqui só entram as diferenças: coluna de número alinhada à
   direita, com algarismo de largura fixa para as casas decimais caírem umas sobre as
   outras, e o total do pé com o mesmo peso do número que ele soma. */
.jr-tab th.num, .jr-tab td.num { text-align: right; font-variant-numeric: tabular-nums; }
.jr-tab td.num { white-space: nowrap; }
/* Quando, esporte, distância, tempo e as duas somas têm todas a mesma largura: são as
   medidas do treino, e colunas de tamanhos diferentes fazem o olho ler "esta é maior" antes
   de ler o que está escrito. O título é que se dobra em duas linhas quando não couber
   ("Tempo acumulado"), e não a coluna que se estica. */
.jr-tab th.jr-medida, .jr-tab td.jr-medida { width: 6.6rem; }
.jr-tab th.jr-medida { white-space: normal; }
.jr-tab td.forte { font-weight: 700; }
.jr-tab tfoot td { border-top: 1px solid var(--line); border-bottom: none;
  font-weight: 600; color: var(--dim); }
.jr-tab tfoot td.forte { color: var(--ink); }
/* Nome do treino e esporte, endereço e cidade, distância e régua: são dois andares da mesma
   célula, e o de baixo é legenda do de cima. Sem o `display:block` os dois colam numa linha
   só e se leem como uma frase que ninguém escreveu. */
.jr-tab .pslug { display: block; margin-top: 2px; }
/* Largura fixa para as medidas caberem no que se pediu delas, e **todo o resto sobra para o
   lugar**: é ele a coluna que carrega texto de verdade — "BR-251, Tamanduá, Francisco Sá/MG"
   — e a única que ganha com espaço. Sem `table-layout: fixed` o navegador reparte a tabela
   pelo conteúdo e devolve cada coluna ao tamanho da célula dela. No celular ela rola de lado
   dentro do cartão, como a de contas do painel. */
.jr-trilha { min-width: 1000px; table-layout: fixed; }
/* A data é o rótulo da linha e se lê da esquerda, como o nome do treino ao lado dela — só
   não pode quebrar em duas linhas, que é o que ela faz sozinha em "7 set 2026". */
.jr-quando { white-space: nowrap; color: var(--dim); }
.jr-esporte { hyphens: auto; }
/* O número do treino na jornada: 1º é o primeiro depois da largada. Fica estreito e apagado
   — é referência para conversar ("no 40º eu passei de Montes Claros"), não protagonista. */
.jr-numero { width: 3.2rem; color: var(--dim); font-variant-numeric: tabular-nums; }
/* A foto que veio do Strava, quando o treino tinha uma: segunda coluna, quadradinha e
   sempre do mesmo tamanho. Retrato e paisagem no mesmo quadrado (com `object-fit: cover`)
   é o que mantém a linha da tabela com a mesma altura de cima a baixo; a linha sem foto
   fica com o quadrado vazio, pelo mesmo motivo. */
.jr-foto-cel { width: 76px; }
.jr-foto { display: block; width: 60px; height: 60px; }
.jr-foto img { width: 100%; height: 100%; object-fit: cover; border-radius: 10px;
  border: 1px solid var(--line); display: block; }
.jr-foto.vazia { border: 1px dashed var(--line); border-radius: 10px; opacity: .5; }
/* Quando o treino tem mais de uma foto, a miniatura carrega o número no canto — é o que
   diz que clicar abre um álbum e não a mesma foto maior. */
.jr-foto { position: relative; }
.jr-foto-conta { position: absolute; right: 3px; bottom: 3px; background: rgba(10,10,14,.78);
  color: #fff; font-size: .68rem; font-weight: 700; line-height: 1; padding: 3px 5px;
  border-radius: 6px; }

/* O carrossel da página pública: clicar na foto abre esta janela por cima de tudo. É
   `:target` — nenhum JavaScript —, o fundo inteiro é um link que fecha e o "voltar" do
   navegador também fecha, que é o gesto que se tenta primeiro no celular. */
.foto-modal { display: none; }
/* Aberta pelo próprio id **ou** por qualquer foto dela: as setas trocam o alvo para a foto
   de destino, e sem o `:has()` a janela se fecharia no primeiro clique da seta. */
.foto-modal:target, .foto-modal:has(:target) { display: flex; position: fixed; inset: 0;
  z-index: 60; align-items: center; justify-content: center; padding: 20px; }
.foto-fundo { position: absolute; inset: 0; background: rgba(8, 8, 14, .82); }
.foto-caixa { position: relative; width: min(920px, 100%); max-height: 92vh;
  background: var(--bg2); border-radius: var(--radius); padding: 14px;
  box-shadow: 0 24px 60px rgba(0,0,0,.5); }
/* A fita rola de lado e agarra em cada foto: é o mesmo gesto do carrossel do Instagram,
   feito com duas linhas de CSS em vez de uma biblioteca. */
.foto-fita { display: flex; gap: 12px; overflow-x: auto; scroll-snap-type: x mandatory;
  scroll-behavior: smooth; scrollbar-width: none; }
.foto-fita::-webkit-scrollbar { display: none; }
.foto-fita figure { flex: 0 0 100%; scroll-snap-align: center; margin: 0; position: relative; }
/* As setas ficam por cima da foto, uma de cada lado, e são links para a foto vizinha. */
.foto-seta { position: absolute; top: 50%; transform: translateY(-50%); width: 46px;
  height: 46px; border-radius: 50%; background: rgba(10,10,16,.62); color: #fff;
  display: flex; align-items: center; justify-content: center; text-decoration: none;
  font-size: 1.9rem; line-height: 1; backdrop-filter: blur(2px); }
.foto-seta:hover { background: rgba(10,10,16,.85); }
.foto-seta.ant { left: 10px; }
.foto-seta.prox { right: 10px; }
.foto-conta { display: inline-block; background: var(--bg); border: 1px solid var(--line);
  border-radius: 999px; padding: 2px 10px; font-variant-numeric: tabular-nums;
  font-weight: 600; color: var(--ink); }
.foto-fita img { width: 100%; max-height: 72vh; object-fit: contain; border-radius: 10px;
  display: block; background: #0b0b12; }
.foto-fita figcaption { text-align: center; font-size: .78rem; color: var(--dim);
  margin-top: 6px; }
.foto-diz { text-align: center; font-size: .85rem; color: var(--dim); margin: 8px 0 0; }
.foto-fechar { position: absolute; top: -14px; right: -8px; width: 38px; height: 38px;
  border-radius: 50%; background: var(--bg2); border: 1px solid var(--line); color: var(--ink);
  display: flex; align-items: center; justify-content: center; font-size: 1.3rem;
  text-decoration: none; }
.foto-fechar:hover { color: var(--accent); }

/* O álbum do treino: as fotos grandes, a primeira com o selo de quem vai para a peça. */
.album { display: grid; gap: 16px; grid-template-columns: repeat(auto-fit, minmax(240px, 1fr)); }
.album-foto { margin: 0; }
.album-foto img { width: 100%; border-radius: 12px; border: 1px solid var(--line);
  display: block; }
.album-foto.primeira img { border-color: var(--accent); border-width: 2px; }
.album-foto figcaption { margin-top: 6px; font-size: .78rem; color: var(--accent);
  font-weight: 600; }

/* O caminho para a peça do Instagram sai do próprio número do treino. */
.jr-post { display: block; margin-top: 2px; color: var(--accent); text-decoration: none; }
.jr-post:hover { text-decoration: underline; }

/* As duas peças do treino, lado a lado: é assim que elas vão para o Instagram, e ver as
   duas juntas é o que mostra que o story não cortou o que importa. */
.pecas { display: grid; gap: 20px; grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));
  align-items: start; }
.peca img { width: 100%; border-radius: 12px; border: 1px solid var(--line); display: block; }

/* A descrição do desafio na página pública: texto para ler, e não legenda. Fechada, ela
   mostra duas linhas e o "mais"; aberta, o texto inteiro. É `<details>`, então funciona sem
   uma linha de JavaScript e o texto está todo lá para quem lê a página com leitor de tela
   ou sem script. */
.desafio-texto p { margin: 0 0 12px; line-height: 1.65; }
.desafio-texto p:last-child { margin-bottom: 0; }
.desafio-texto > summary { list-style: none; cursor: pointer; }
.desafio-texto > summary::-webkit-details-marker { display: none; }
.texto-inicio { display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical;
  overflow: hidden; line-height: 1.65; }
.desafio-texto[open] .texto-inicio { -webkit-line-clamp: unset; overflow: visible;
  margin-bottom: 12px; }
.texto-mais { display: inline-block; margin-top: 6px; color: var(--accent);
  font-size: .85rem; font-weight: 600; }
.texto-mais::after { content: "mais"; }
.desafio-texto[open] .texto-mais::after { content: "menos"; }

/* A rosca de onde vêm os quilômetros, no resumo da jornada. Fatias com `stroke-dasharray`
   num círculo só: a fatia que vira zero desaparece sozinha, sem arco calculado à mão. As
   seis cores são as mesmas em toda rosca do portal — esporte não tem cor própria, e inventar
   uma por esporte faria a legenda ter de ser decorada. */
/* O contador do desafio: quanto tempo já se está na estrada. Número tabular para os
   dígitos não empurrarem a linha de lado a cada segundo. */
.contador { display: flex; align-items: baseline; gap: 10px; flex-wrap: wrap; margin: 0 0 10px; }
.contador-diz { font-size: .72rem; letter-spacing: .12em; text-transform: uppercase;
  color: var(--dim); font-weight: 700; }
.contador strong { font-size: 1.15rem; font-variant-numeric: tabular-nums; }
.contador.antes { color: var(--dim); font-size: .9rem; }

.pizza { display: flex; align-items: center; gap: 18px; flex-wrap: wrap; margin: 14px 0 6px; }
.pizza-rosca { width: 132px; height: 132px; flex: none; }
.pizza .fatia { fill: none; stroke-width: 20; }
.pizza .f0 { stroke: var(--accent); }
.pizza .f1 { stroke: #38bdf8; }
.pizza .f2 { stroke: #f59e0b; }
.pizza .f3 { stroke: #22c55e; }
.pizza .f4 { stroke: #ec4899; }
.pizza .f5 { stroke: #94a3b8; }
.pizza-meio { text-anchor: middle; font-weight: 700; font-size: 21px; fill: var(--ink);
  font-variant-numeric: tabular-nums; }
.pizza-meio-diz { text-anchor: middle; font-size: 10px; fill: var(--dim);
  letter-spacing: .06em; text-transform: uppercase; }
.pizza-legenda { list-style: none; margin: 0; padding: 0; display: grid; gap: 6px;
  min-width: 0; }
.pizza-legenda li { display: flex; align-items: center; gap: 8px; font-size: .88rem; }
.pizza-legenda .ponto { width: 10px; height: 10px; border-radius: 3px; flex: none; }
.pizza-legenda .f0 .ponto { background: var(--accent); }
.pizza-legenda .f1 .ponto { background: #38bdf8; }
.pizza-legenda .f2 .ponto { background: #f59e0b; }
.pizza-legenda .f3 .ponto { background: #22c55e; }
.pizza-legenda .f4 .ponto { background: #ec4899; }
.pizza-legenda .f5 .ponto { background: #94a3b8; }
.pizza-legenda .quanto { color: var(--dim); font-variant-numeric: tabular-nums; }
.jr-paginas .hint { margin: 0; }
.busca-lista .btn2 { grid-column: 2; grid-row: 1 / 3; }
.campo-busca .btn2 { flex: none; }
.jr-link .btn2 { flex: none; }
.jr-lugar { width: auto; }
.jr-lugar strong { font-weight: 600; }
.tab-limites td.num { text-align: right; font-variant-numeric: tabular-nums; }
.cartao-corpo > .conta-grupo:first-child { border-top: 0; margin-top: 0; padding-top: 0; }
.conta-grupo .pslug { display: flex; align-items: center; gap: 6px; flex-wrap: wrap; }
.apagar-conta .pslug { font-size: .7rem; max-width: 160px; }
.conta-cel .pslug { display: flex; align-items: center; gap: 5px; }
.troca-mark .ic { width: 18px; height: 18px; opacity: .9; }
.troca-seta .ic { width: 16px; height: 16px; }
.troca-op.aqui .ic { width: 16px; height: 16px; flex: none; margin: 0 9px; color: var(--accent); }

/* a logo da conta no trocador: pequena, do tamanho da marca da casa */
.logo-grupo.sm { width: 34px; height: 34px; border-radius: 10px; flex: none; }
.logo-grupo.vazia.sm { font-size: .8rem; display: grid; place-items: center;
  background: rgba(255,255,255,.1); color: #fff; }
.logo-grupo.sm:not(.vazia) { background: #fff; padding: 2px; }
.ficha-lado .pslug { display: block; }
.nota-bt.on { background: #f59e0b; border-color: #f59e0b; color: #fff; }
tr.eu td { background: color-mix(in srgb, var(--accent) 8%, transparent); font-weight: 600; }
.desfecho .pslug { margin-top: 4px; }
.forma label { position: relative; }
.mencao-item:hover, .mencao-item.on { background: var(--bg2); }
.publicar-bt .ic {
  width: 34px; height: 34px; flex: none; padding: 7px; border-radius: 11px;
  background: color-mix(in srgb, var(--tipo) 15%, transparent); color: var(--tipo);
  box-sizing: content-box;
}
.publicar-bt.on { border-color: var(--tipo); background: color-mix(in srgb, var(--tipo) 8%, var(--bg2)); }
.publicar-cab .ic { width: 20px; height: 20px; flex: none; color: var(--accent); }
.publicar .forma { padding: 18px 20px 20px; margin: 0; }

/* os chips de filtro: tipo em cima, assunto embaixo */
.chips-fil, .chips-ass { display: flex; flex-wrap: wrap; gap: 8px; margin-bottom: 12px; }
.chips-ass { margin-bottom: 16px; }
.chip-fil {
  display: inline-flex; align-items: center; gap: 7px; padding: 8px 14px; border-radius: 999px;
  text-decoration: none; font-size: .85rem; font-weight: 600; color: var(--dim);
  background: var(--bg2); border: 1px solid var(--line);
}
.chip-fil .ic { width: 16px; height: 16px; }
.chip-fil:hover { color: var(--ink); border-color: var(--dim); }
.chip-fil.on { background: var(--ink); border-color: var(--ink); color: var(--bg2); }
.chip-ass {
  padding: 5px 12px; border-radius: 999px; text-decoration: none; font-size: .76rem;
  font-weight: 500; color: var(--dim); background: transparent; border: 1px solid var(--line);
}
.chip-ass:hover { color: var(--ink); border-color: var(--dim); }
.chip-ass.on { background: color-mix(in srgb, var(--accent) 12%, transparent);
  border-color: var(--accent); color: var(--accent); font-weight: 600; }
.mural-barra .busca { flex: 1 1 240px; }
.mural .empty { grid-column: 1 / -1; }
.mural-capa.vazia {
  display: grid; place-items: center;
  background: linear-gradient(140deg, color-mix(in srgb, var(--tipo) 20%, var(--bg2)),
                                      color-mix(in srgb, var(--tipo) 6%, var(--bg2)));
}
.mural-capa.vazia .ic { width: 46px; height: 46px; color: var(--tipo); opacity: .6; }
.mural-tipo .ic { width: 13px; height: 13px; }
.mural-nums .ic { width: 14px; height: 14px; }
.curtir .ic { width: 17px; height: 17px; }
.curtir.on { background: #ffe4e8; border-color: #fda4af; color: #e11d48; }
.curtir.on .ic { fill: currentColor; }
.post-link .ic { width: 16px; height: 16px; flex: none; color: var(--accent); }
.casa-sem-capa .ic { width: 20px; height: 20px; color: var(--dim); opacity: .5; }
.casa-txt .pslug { display: flex; align-items: center; gap: 6px; flex-wrap: wrap; }
.casa-gente .avatar, .casa-gente .logo-grupo { flex: none; }
.selo-casa .ic { width: 15px; height: 15px; }
.selo-casa.destaque .ic { fill: currentColor; }
.selo-casa.mini .ic { width: 13px; height: 13px; }
.curadoria-cab .ic { width: 19px; height: 19px; flex: none; color: var(--accent); }
.curadoria .forma { padding: 16px; margin: 0; }
.chip-fil.selo.on { background: #166534; border-color: #166534; }
.patente .ic { width: 14px; height: 14px; flex: none; }
.patente.mini .ic { width: 11px; height: 11px; }
.eu-patente .ic { width: 26px; height: 26px; }
.eu-comunidade .btn2 { flex: none; }
.degrau .ic { width: 24px; height: 24px; color: var(--pat); }
.ptable .patente { font-size: .7rem; }
.ganho-ic .ic { width: 18px; height: 18px; }
.ganho-seu.vazio { color: var(--dim); font-weight: 400; font-style: italic; }
.conquista-ic .ic { width: 24px; height: 24px; }


/* o placar ficou largo: as colunas de número encolhem */
.ptable.placar th.num, .ptable.placar td.num { white-space: nowrap; }
.ptable.placar th { font-size: .7rem; }
.lote-barra .hint { margin: 0 0 0 auto; }
.rapido-cab .ic { width: 15px; height: 15px; }
.rapido > .hint { display: block; padding: 0 11px 10px; }
.senha-nova .forma { margin: 0; }
.op-do-pedido.ok { border-color: var(--line); }
.op-linha-txt .pslug b { color: var(--perigo); font-weight: 700; }
.tab-limites th:not(:first-child),
.tab-limites td:not(:first-child),
.tab-limites td.num:not(:first-child) { text-align: center; }
.vendedor-linha .avatar { flex: none; }
.vendedor-linha .forma { display: flex; align-items: flex-end; gap: 8px; margin: 0; flex: none; }
.vendedor-linha .forma label { margin-bottom: 0; font-size: .74rem; }
.vendedor-linha .forma input { margin-top: 2px; width: 84px; text-align: center; font-weight: 700; }
.ptable.comissoes td.forte { font-weight: 800; }
.repor-linha .pslug b { color: var(--perigo); font-weight: 700; }
.portas .porta {
  display: flex; align-items: center; gap: 12px; padding: 12px 14px; border-radius: 12px;
  text-decoration: none; color: var(--ink); background: var(--bg);
  border: 1px solid var(--line); transition: border-color .14s ease, background .14s ease;
}
.portas .porta:hover { border-color: var(--accent); background: var(--bg2); }
.portas .porta.on { border-color: var(--accent);
  background: color-mix(in srgb, var(--accent) 8%, var(--bg2)); }
.portas .porta.propria .porta-ic { background: color-mix(in srgb, var(--accent) 14%, transparent);
  color: var(--accent); }
.porta-ic .ic { width: 18px; height: 18px; }
.portas .porta .avatar, .portas .porta .logo-grupo { flex: none; width: 38px; height: 38px;
  border-radius: 11px; }
.portas .porta .logo-grupo:not(.vazia) { background: #fff; padding: 2px; }
.painel-numeros th[scope=row] .pslug { display: block; font-weight: 400; margin-top: 2px; }
.painel-numeros td.num { font-variant-numeric: tabular-nums; font-size: .95rem; }
.painel-numeros td.forte { font-weight: 800; font-size: 1.05rem; }
.prod-abertos td.num { font-variant-numeric: tabular-nums; }
.prod-abertos td.forte { font-weight: 800; }
.medalha .ic { width: 11px; height: 11px; fill: currentColor; }
.console-estado.aviso { color: #b45309; }
.console-saida.aviso { border-left: 3px solid #f59e0b; }

/* =================== cursos EAD =================== */

.navlink.cursos { font-weight: 700; }

/* -- a vitrine no portal */
.curso-grade { display: grid; grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
  gap: 26px; margin-top: 26px; }
.curso-card { display: flex; flex-direction: column; text-decoration: none;
  border: 1px solid var(--line); border-radius: var(--radius); overflow: hidden;
  background: var(--bg2); transition: transform .14s ease, border-color .14s ease; }
.curso-card:hover { transform: translateY(-3px); border-color: var(--accent); }
.curso-capa { aspect-ratio: 16 / 9; background: var(--bg); display: grid; place-items: center;
  overflow: hidden; }
.curso-capa img { width: 100%; height: 100%; object-fit: cover; }
.curso-capa-vazia { font-family: var(--font-head); font-weight: 700; font-size: 1.6rem;
  color: var(--accent); letter-spacing: .04em; }
.curso-txt { padding: 16px 18px 20px; display: flex; flex-direction: column; gap: 6px; flex: 1; }
.curso-txt h3 { margin: 0; font-size: 1.15rem; }
.curso-txt .dek { margin: 0; font-size: .92rem; color: var(--dim); }
.curso-pe { margin: auto 0 0; display: flex; align-items: baseline; gap: 10px;
  padding-top: 10px; }
.curso-preco { font-family: var(--font-head); font-size: 1.15rem; color: var(--accent); }
.curso-preco s { color: var(--dim); font-size: .8em; font-weight: 400; margin-right: 6px; }

/* O preço trancado: no lugar do número, o convite a entrar. É link, e não recado, porque
   quem topou com a parede precisa da saída na própria parede. O tamanho é o do cartão; a
   ficha e o banner, que têm número grande, sobem o dele — senão o convite apareceria
   miúdo justamente onde o preço mandava na tela. */
.preco-trancado { font-family: var(--font-head); font-size: .95rem; color: var(--accent);
  text-decoration: none; border-bottom: 1px dashed currentColor; white-space: nowrap; }
.preco-trancado:hover { border-bottom-style: solid; }
.curso-preco-grande .preco-trancado, .valor-trancado .preco-trancado { font-size: 1.2rem; }
.valor-trancado { margin: 0 0 18px; display: flex; align-items: baseline; gap: 10px; }

/* -- a página de venda */
/* O herói do curso empilha, como a ficha do produto: a capa grande em cima, na largura
   toda, e o texto embaixo. Em duas colunas dentro do corpo (que agora divide espaço com a
   coluna do lado) a capa ficava pequena e boiando no meio de um vão — o `align-items:
   center` a centralizava contra um texto sempre mais alto. */
.curso-hero { display: block; padding: 0 0 26px; }
.curso-hero-capa { margin-bottom: 22px; }
.curso-hero-capa img { border-radius: var(--radius); border: 1px solid var(--line);
  width: 100%; aspect-ratio: 16 / 9; object-fit: cover; display: block; }
.curso-hero-txt h1 { font-size: clamp(1.9rem, 4vw, 2.8rem); }
/* Sem largura própria: a caixa do preço acompanha a coluna, igual ao bloco do programa
   logo abaixo. Com um `max-width` só dela, as duas caixas terminavam em pontos diferentes e
   a página parecia torta. */
.curso-compra { margin-top: 22px; padding: 20px 22px; border: 1px solid var(--line);
  border-radius: var(--radius); background: var(--bg2); }
.curso-compra .hint { margin: 12px 0 0; }
.curso-preco-grande { margin: 0 0 12px; font-family: var(--font-head); font-size: 2rem;
  color: var(--accent); }
.curso-preco-grande .curso-preco { font-size: inherit; }
.btn-grande { display: inline-block; background: var(--accent); color: #fff; border: none;
  border-radius: 10px; padding: 14px 26px; font: inherit; font-weight: 700; font-size: 1rem;
  cursor: pointer; text-decoration: none; }
.btn-grande:hover { filter: brightness(1.08); }
/* O corpo do curso é uma coluna só: a segunda virou a coluna do lado da página inteira,
   como em matéria, produto e pacote. */
.curso-corpo { display: block; }
.curso-lado { position: sticky; top: 90px; border: 1px solid var(--line);
  border-radius: var(--radius); padding: 20px; background: var(--bg2); }
.curso-ficha { list-style: none; margin: 0 0 14px; padding: 0; }
.curso-ficha li { display: flex; justify-content: space-between; gap: 12px; padding: 8px 0;
  border-bottom: 1px solid var(--line); font-size: .9rem; }
.curso-ficha li:last-child { border-bottom: none; }
.curso-ficha strong { font-weight: 600; }
.curso-ficha span { color: var(--dim); text-align: right; }
.prog-publico { border: 1px solid var(--line); border-radius: var(--radius); padding: 12px 18px;
  margin-bottom: 12px; background: var(--bg2); }
.prog-publico summary { cursor: pointer; font-family: var(--font-head); font-weight: 700; }
.prog-publico summary .pslug { display: block; font-weight: 400; }
.prog-publico ul { list-style: none; margin: 10px 0 4px; padding: 0; }
.prog-publico li { display: flex; justify-content: space-between; gap: 14px; padding: 7px 0;
  border-top: 1px solid var(--line); font-size: .92rem; }
.prog-nome { display: flex; align-items: center; gap: 8px; }
.prog-lista .empty { border-top: 1px solid var(--line); padding: 10px 0; }
.prog-txt .forte { text-decoration: none; font-weight: 600; }
.prog-prova .prog-txt .forte { color: var(--accent); }
.alt { padding: 6px 0; border-top: 1px solid var(--line); font-size: .9rem; color: var(--dim); }
.alt.certa { color: var(--ink); font-weight: 600; }
.sala-aula .prog-nome { text-decoration: none; font-weight: 600; }
.sala-aula.feita .prog-nome { color: var(--dim); }

@media print {
.lateral, .topo, .topbar, .rodape, .forma-pe, .cartao-cab { display: none !important; }
}

@media (max-width: 860px) {
.curso-hero, .curso-corpo { grid-template-columns: 1fr; gap: 24px; }
.curso-lado { position: static; }
}
.linha-rapida .btn2 { padding: 7px 14px; font-size: .8rem; }
.galho.edicao .forma { padding: 0 0 16px 2.6rem; max-width: 780px; }
.galho.edicao .hint { margin: 0 0 10px; }
.curso-raiz > .arvore, .curso-raiz > .empty, .curso-raiz > p { padding: 12px 18px 4px; }
.curso-raiz > .forma-pe { padding: 0 18px 14px; }

/* -- a numeração na sala do aluno e na página de venda */
.sala-num { display: inline-block; min-width: 2.4rem; margin-right: 8px; color: var(--dim);
  font-size: .78rem; font-weight: 700; font-variant-numeric: tabular-nums; }
.sala-num.grande { min-width: auto; margin-right: 10px; color: var(--accent); }
.prog-publico .prog-modulo { font-weight: 700; color: var(--ink); border-top: none;
  padding-top: 14px; }

@media (max-width: 900px) {
.galho.edicao .forma, .galho.edicao > details > summary { margin-left: 0; padding-left: 0; }
}
.raiz-capa.vazia { display: grid; place-items: center; color: var(--dim); }
.raiz-capa.vazia svg { width: 16px; height: 16px; }

/* a escolha da capa do curso, com recorte */
.capa-escolha { display: flex; gap: 16px; align-items: flex-start; margin-top: 6px;
  flex-wrap: wrap; }
.capa-previa { width: 200px; aspect-ratio: 16 / 9; border-radius: 8px; object-fit: cover;
  border: 1px solid var(--line); background: var(--bg2); flex: none; }
.capa-previa.vazia { display: grid; place-items: center; color: var(--dim); font-size: .78rem;
  border-style: dashed; }
.capa-campos { flex: 1; min-width: 240px; display: flex; flex-direction: column; gap: 6px; }
.capa-campos .chave { margin: 4px 0 0; font-size: .82rem; font-weight: 500; }

/* =================== produtos do portal =================== */
/* A vitrine reaproveita .curso-grade / .curso-card: matéria, produto e curso são três
   coisas da mesma seção — cada uma com um desenho faria a seção parecer três sites.
   O que é só do produto vive aqui: a ficha com galeria de fotos. */
/* A ficha empilha: a foto grande em cima, ocupando a largura toda, e o texto embaixo. Era
   meia coluna para a foto e meia para o texto, e nas duas metades cada coisa ficava
   apertada — a foto do produto pequena numa loja é o contrário do que a loja quer. As
   outras fotos viram uma tira de miniaturas debaixo da principal. */
.prod-ficha { display: block; padding: 0 0 34px; }
.prod-galeria { display: grid; gap: 12px; grid-template-columns: repeat(5, 1fr);
  margin-bottom: 30px; }
.prod-galeria img { width: 100%; border-radius: var(--radius); border: 1px solid var(--line);
  object-fit: cover; aspect-ratio: 1 / 1; background: var(--bg2); }
/* A foto principal em fundo branco nos dois temas: foto de produto é recortada em branco,
   e um cartão cinza atrás dela deixava um retângulo claro dentro de outro — duas molduras
   para a mesma foto. Com o branco, a borda do cartão é a única moldura, e o `contain`
   garante que a peça apareça inteira, sem corte. */
.prod-galeria img:first-child { grid-column: 1 / -1; aspect-ratio: 16 / 9;
  object-fit: contain; padding: 26px; background: #fff;
  border-color: color-mix(in srgb, var(--line) 70%, transparent); }
.prod-galeria .sem-capa { grid-column: 1 / -1; aspect-ratio: 16 / 10; display: grid;
  place-items: center; border-radius: var(--radius); border: 1px solid var(--line);
  background: var(--bg2); color: var(--accent); font-family: var(--font-head);
  font-weight: 700; font-size: 2.4rem; letter-spacing: .04em; }
.prod-txt { max-width: 74ch; }
.prod-txt h1 { font-size: clamp(1.9rem, 4vw, 2.8rem); margin: .1em 0 .3em; }
.prod-txt .valor { display: block; font-family: var(--font-head); font-size: 2.1rem;
  color: var(--accent); margin: 0 0 20px; }
.prod-txt .valor small { font-size: .42em; font-weight: 400; color: var(--dim);
  margin-left: 7px; }
.prod-txt .pslug { color: var(--dim); font-size: .82rem; }
@media (max-width: 620px) {
  .prod-galeria { grid-template-columns: repeat(3, 1fr); }
}



/* Na tela de acessos dos mochileiros a célula de número carrega a porcentagem junto.
   Sem isto os dois colam ("2 66%") e se leem como um número só. */
.painel-numeros td.num .pslug { display: block; font-weight: 400; margin-top: 2px; }
.tab-centro td.num .pslug { text-align: center; }

/* Nos rankings do portal só as duas colunas de contagem vão para o centro: a primeira
   é o nome do que foi aberto e a última é a régua, que só se compara se todas
   começarem na mesma borda. */
.tab-num-centro th.num, .tab-num-centro td.num { text-align: center; }

/* ---------------- claro / automático / escuro ---------------- */
/* Três botões e não um interruptor de dois estados: "automático" é uma escolha de
   verdade — quem a marca está dizendo "siga meu sistema", e isso se perde num
   alternador que só vai e volta entre claro e escuro. */
/* A cor da tela virou uma bolinha do tamanho do avatar, e as três opções moram dentro dela.
   Três botões sempre à mostra custavam a largura de três botões numa barra que já brigava por
   espaço — e a escolha de tema é das que se faz uma vez e não se mexe mais. */
/* O atalho da rede social, colado na foto na barra de cima. Veste a mesma moldura redonda
   da bolinha de tema: os dois sao controles da barra, e dois desenhos diferentes lado a
   lado pareceriam duas coisas de naturezas diferentes. */
.topo-rede { display: grid; place-items: center; width: 40px; height: 40px; flex: none;
  border-radius: 50%; border: 1px solid var(--line); background: var(--bg2);
  color: var(--dim); transition: color .14s ease, border-color .14s ease; }
.topo-rede svg { width: 19px; height: 19px; }
.topo-rede:hover { color: var(--accent);
  border-color: color-mix(in srgb, var(--accent) 45%, var(--line)); }
/* Sem acoes na tela, e o atalho que empurra o bloco do usuario para a direita -- a regra
   antiga fazia isso pelo `.eu-menu`, que agora nao e mais o primeiro vizinho. */
.topo-acoes:empty + .topo-rede { margin-left: auto; }

.luz { position: relative; flex: none; }
/* Na barra da plataforma a bolinha ficava do tamanho de um enfeite ao lado do bloco do
   usuário, que tem 44px de foto e moldura própria. Aqui ela cresce e veste a mesma moldura:
   é um controle, não um ícone decorativo. */
.topo > .luz > .luz-bola { width: 40px; height: 40px; border-color: var(--line);
  background: var(--bg2); color: var(--dim); }
.topo > .luz > .luz-bola:hover { color: var(--accent);
  border-color: color-mix(in srgb, var(--accent) 45%, var(--line)); }
.topo > .luz > .luz-bola svg { width: 19px; height: 19px; }
.topo > .luz > .luz-bola em { font-size: .8rem; }
.topo > .luz[open] > .luz-bola { color: var(--accent); border-color: var(--accent);
  background: color-mix(in srgb, var(--accent) 12%, var(--bg2)); }
.luz-bola { display: grid; place-items: center; width: 32px; height: 32px; border-radius: 50%;
  border: 1px solid var(--line); background: var(--bg2); color: var(--dim); cursor: pointer;
  list-style: none; }
.luz-bola::-webkit-details-marker { display: none; }
.luz-bola:hover { color: var(--ink); border-color: var(--dim); }
.luz[open] .luz-bola { color: var(--accent); border-color: var(--accent); }
.luz-bola svg { width: 16px; height: 16px; fill: none; stroke: currentColor;
  stroke-width: 1.8; stroke-linecap: round; stroke-linejoin: round; }
.luz-bola em { font-style: normal; font-size: .68rem; font-weight: 800; }
.luz-menu { position: absolute; right: 0; top: calc(100% + 6px); z-index: 40;
  display: flex; flex-direction: column; gap: 2px; padding: 5px; min-width: 11rem;
  background: var(--bg2); border: 1px solid var(--line); border-radius: 12px;
  box-shadow: var(--sombra); }
.luz-bt { display: flex; align-items: center; gap: 9px; width: 100%; padding: 8px 10px;
  border: none; border-radius: 8px; background: none; color: var(--dim); cursor: pointer;
  font: inherit; font-size: .85rem; font-weight: 600; text-align: left; }
.luz-bt svg { width: 16px; height: 16px; fill: none; stroke: currentColor; stroke-width: 1.8;
  stroke-linecap: round; stroke-linejoin: round; flex: none; }
.luz-bt em { font-style: normal; font-size: .68rem; font-weight: 800; width: 16px;
  text-align: center; flex: none; }
.luz-bt:hover { color: var(--ink); background: var(--bg); }
.luz-bt[aria-pressed="true"] { color: var(--accent); background: var(--bg); }
/* Na lateral escura do painel o menu se veste de escuro também. */
.lat-pe .luz-bola { background: rgba(255, 255, 255, .06); border-color: rgba(255,255,255,.14);
  color: var(--lat-ink); }
.lat-pe .luz-menu { background: #22222f; border-color: rgba(255, 255, 255, .14); }
.lat-pe .luz-bt { color: var(--lat-ink); }
.lat-pe .luz-bt:hover, .lat-pe .luz-bt[aria-pressed="true"] { color: #fff;
  background: rgba(255, 255, 255, .1); }

/* Na lateral do painel o fundo já é escuro nos dois modos: o controle se veste dele. */
.lat-pe .luz { width: 100%; justify-content: center; background: rgba(255, 255, 255, .06);
  border-color: rgba(255, 255, 255, .12); margin-bottom: 6px; }
.lat-pe .luz-bt { color: var(--lat-ink); }
.lat-pe .luz-bt:hover { color: #fff; }
.lat-pe .luz-bt[aria-pressed="true"] { background: rgba(255, 255, 255, .14); color: #fff;
  box-shadow: none; }

/* No pé do cartão da porta a pílula anda ao lado do "voltar": `flex: none` para ela
   manter o tamanho do conteúdo. Era aqui o defeito — `display: flex` sozinho tirava o
   `inline` da pílula, ela virava bloco e esticava de ponta a ponta do cartão. */
.porta .luz { flex: none; margin: 0; }

/* =================== carrinho da loja =================== */

/* A caixa de compra da ficha: quantidade e "Adicionar ao carrinho" numa linha, e o "Falar
   no WhatsApp" ao lado com moldura em vez de fundo cheio. Eram dois botões cheios, iguais e
   empilhados, disputando a mesma decisão — quem já decidiu compra, quem não decidiu
   pergunta, e as duas coisas não têm o mesmo peso. */
/* Os três numa linha só — quantidade, comprar e falar. Na coluna da ficha sobram uns
   380px, então cada peça cede um pouco: o campo encolhe, os botões perdem folga lateral e
   o segundo fica só com "WhatsApp" (o ícone já diz o verbo). No celular a linha volta a
   quebrar, que aí não cabe mesmo. */
.prod-compra { display: flex; align-items: flex-end; flex-wrap: nowrap; gap: 10px;
  margin: 4px 0 16px; }
.prod-compra .add-carrinho { margin: 0; gap: 10px; flex-wrap: nowrap; }
.prod-compra .btn { min-height: 46px; display: inline-flex; align-items: center;
  padding: 0 16px; font-size: .88rem; white-space: nowrap; }
.prod-compra .add-qtd input { width: 58px; padding: 10px 8px; }
@media (max-width: 780px) {
  .prod-compra { flex-wrap: wrap; }
}
/* `.btn2.leve` tem duas classes, então a regra daqui precisa das três para ganhar dele —
   senão o botão continua com o fundo lilás do secundário e some ao lado do de comprar. */
.btn2.leve.prod-falar { min-height: 46px; padding: 0 14px; border-color: var(--line);
  background: none; color: var(--ink); white-space: nowrap; font-size: .88rem; }
.btn2.leve.prod-falar:hover { background: none; border-color: var(--accent);
  color: var(--accent); }
.prod-falar svg, .prod-falar .ic { width: 18px; height: 18px; }
.add-carrinho { display: flex; align-items: flex-end; gap: 12px; flex-wrap: wrap;
  margin: 6px 0 18px; }
.carrinho-pe .hint { max-width: 46ch; margin: 0; }
.pedido-feito .kicker { color: var(--marca-texto, var(--accent)); }
.chip-origem .ic { width: 13px; height: 13px; }
.chip-origem.mini .ic { width: 11px; height: 11px; }
.post-pe .add-carrinho { margin: 0 0 6px; }
.assunto-linha .pslug { flex-basis: 100%; font-size: .68rem; }

/* os chips de assunto do mural ganham o nome da frente na frente */
.chip-ass-frente { display: inline-flex; align-items: center; padding: 3px 10px;
  border-radius: 999px; font-size: .7rem; font-weight: 700; letter-spacing: .04em;
  text-transform: uppercase; margin-left: 6px;
  background: color-mix(in srgb, var(--cf, var(--accent)) 16%, transparent); color: var(--cf); }
.chip-ass-frente[data-b="3d"]   { --cf: light-dark(#c2410c, #fb923c); }
.chip-ass-frente[data-b="game"] { --cf: light-dark(#047857, #34d399); }
.chip-ass-frente[data-b="ia"]   { --cf: light-dark(#0e7490, #22d3ee); }
.frentes-fil .chip-fil.frente[data-b="3d"].on   { --marca: light-dark(#c2410c, #fb923c); }
.frentes-fil .chip-fil.frente[data-b="game"].on { --marca: light-dark(#047857, #34d399); }
.frentes-fil .chip-fil.frente[data-b="ia"].on   { --marca: light-dark(#0e7490, #22d3ee); }
.sub-item > .forma, .sub-item > .galho { padding: 16px 18px; }

/* ============ a capa da frente: banner e tres colunas ============

   O formato e o mesmo na home, em cada frente, na materia e na ficha do produto: um banner
   que pode ser qualquer tipo de coisa, e tres colunas na ordem de sempre. Matéria, notícia,
   produto e curso usam duas formas e nada mais -- o cartao grande do banner e a linha da
   coluna -- e o selo carrega a diferenca. */

/* o selo que diz de que tipo e a peca; a cor sai da frente dela */
/* Cada tipo tem a sua cor, em qualquer frente: a leitura e vermelha como a redacao, a loja
   azul, o curso oliva. A frente da peca passa a ser dita por escrito, em `.item-frente` --
   a cor nao aguenta os dois sentidos ao mesmo tempo sem enfraquecer os dois. */
[data-t="produto"] { --tipo: var(--loja); }
[data-t="curso"]   { --tipo: var(--curso); }
[data-t="noticia"], [data-t="materia"] { --tipo: var(--noticia); }
/* O pacote veste o roxo da casa: ele não é de frente nenhuma, é a plataforma inteira. */
[data-t="pacote"] { --tipo: light-dark(#6d28d9, #c4b5fd); }
.selo-tipo {
  display: inline-block; font-size: .68rem; letter-spacing: .1em; text-transform: uppercase;
  font-weight: 700; padding: 3px 9px; border-radius: 999px; vertical-align: 1px;
  margin-right: 8px; color: var(--tipo, var(--accent));
  background: color-mix(in srgb, var(--tipo, var(--accent)) 15%, transparent);
}

/* -------- a proporcao nao depende do titulo --------

   Era o defeito de antes: quem mandava na altura da caixa era o titulo, e uma materia de
   titulo quilometrico entortava a fila inteira -- a pagina mudava de cara conforme o que a
   redacao publicasse. Agora cada texto tem um numero fixo de linhas: `min-height` em `em`
   reserva o espaco mesmo com titulo curto, e `line-clamp` corta o que passa. De tres
   palavras ou de trinta, a caixa mede o mesmo, e a conta em `em` acompanha o corpo da fonte
   sozinha. */
.card.big h3 {
  line-height: 1.18; min-height: 2.36em; overflow: hidden;
  display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 3; line-clamp: 3;
}
.card.big .dek {
  line-height: 1.55; min-height: 3.1em; overflow: hidden;
  display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 2; line-clamp: 2;
}
.card.big .preco { font-family: var(--font-head); font-size: 1.5rem; margin: 2px 0 0;
  color: var(--tipo, var(--accent)); }
.card.big .acoes { display: flex; gap: 10px; align-items: center; flex-wrap: wrap;
  margin-top: 6px; }

/* -------- o carrossel do banner --------

   Os passos ocupam a MESMA celula da grade, um sobre o outro: a altura da pista e a do
   passo mais alto e nao muda quando o carrossel anda -- senao a pagina pula debaixo de quem
   esta lendo. Quem nao e da vez sai por `visibility`, que tambem o tira do teclado e do
   leitor de tela; `display:none` mediria so o passo visivel e devolveria o pulo. */
.carrossel { margin-bottom: 20px; }
.carrossel-pista { display: grid; }
.carrossel .slide { grid-area: 1 / 1; visibility: hidden; opacity: 0;
  transition: opacity .32s ease; }
.carrossel .slide.on { visibility: visible; opacity: 1; }
.carrossel-pe { display: flex; align-items: center; gap: 14px; margin-top: 24px;
  padding-top: 16px; border-top: 1px solid var(--line); flex-wrap: wrap; }
.cseta { width: 38px; height: 38px; display: grid; place-items: center; padding: 0; flex: none;
  border: 1px solid var(--line); border-radius: 999px; background: none; color: var(--dim);
  cursor: pointer; }
.cseta .ic { width: 18px; height: 18px; }
.cseta:hover { color: var(--accent); border-color: var(--accent); }
.cpontos { display: flex; gap: 8px; margin-right: auto; }
.cponto { width: 32px; height: 6px; padding: 0; border: none; border-radius: 999px;
  background: var(--line); cursor: pointer; transition: background .16s ease; }
.cponto:hover { background: color-mix(in srgb, var(--accent) 55%, var(--line)); }
.cponto[aria-current="true"] { background: var(--accent); }
.cconta { font-family: var(--font-head); font-size: .86rem; color: var(--dim);
  font-variant-numeric: tabular-nums; }
.cconta b { color: var(--accent); }
.cseta:focus-visible, .cponto:focus-visible { outline: 2px solid var(--accent);
  outline-offset: 3px; }

/* -------- as tres colunas --------

   A ordem nunca muda -- loja, cursos, leitura -- para a pessoa aprender onde as coisas
   ficam e nao ter de reprocurar em cada frente. A linha tem altura fixa: capa quadrada de
   92px e titulo preso em duas linhas, entao coluna cheia e coluna magra se alinham. */
.tres { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 40px;
  margin-top: 46px; align-items: start; }
.coluna { display: flex; flex-direction: column; min-width: 0; }
.col-tit { font-size: .82rem; letter-spacing: .16em; text-transform: uppercase;
  color: var(--dim); font-weight: 600; font-family: var(--font-body); padding-bottom: 12px;
  border-bottom: 2px solid var(--cor-col, var(--accent)); margin: 0; }
.coluna[data-col="loja"]  { --cor-col: var(--loja); }
.coluna[data-col="curso"] { --cor-col: var(--curso); }
.coluna[data-col="ler"]   { --cor-col: var(--noticia); }
/* A quarta coluna: os pacotes da plataforma. Roxo, que é a cor da casa — as outras três já
   ocupam o azul, o oliva e o vermelho. */
.coluna[data-col="plataforma"] { --cor-col: light-dark(#6d28d9, #c4b5fd); }
/* Com quatro colunas o vão diminui um pouco: quatro filas de 40px de respiro deixavam cada
   coluna estreita demais para o título de duas linhas. */
.tres.quatro { grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 30px; }
@media (max-width: 1200px) {
  .tres.quatro { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 32px; }
  .tres.quatro .coluna:last-child { grid-column: span 2; }
}
@media (max-width: 700px) {
  .tres.quatro { grid-template-columns: 1fr; }
  .tres.quatro .coluna:last-child { grid-column: auto; }
}
.coluna[data-col] .col-tit { color: var(--cor-col); }
.col-lista { display: flex; flex-direction: column; }
/* A linha das colunas do portal. Ela carrega quatro informações, nesta ordem: que tipo de
   coisa é (o selo), como se chama, o que ela resolve e quanto custa / quando saiu.

   O texto **contorna** a foto em vez de morar numa coluna ao lado: com duas colunas rígidas
   toda linha ficava com uma faixa estreita de texto à direita e um vão embaixo da foto. Com
   a foto flutuando, as primeiras linhas passam ao lado dela e o resto segue por baixo — é o
   desenho de verbete, e é o que faz a fila parecer arrumada.

   Por isso nada aqui pode ser flex nem `-webkit-box`: caixa desses tipos não contorna
   flutuante, ela desvia inteira. O corte do texto passou a ser no servidor (a descrição sai
   com 150 caracteres), e não no CSS. */
.item { display: block; padding: 18px 0; border-bottom: 1px solid var(--line);
  text-decoration: none; overflow: hidden; }
.item:hover .item-tit { color: var(--tipo, var(--accent)); }
.item-capa { float: left; width: 96px; aspect-ratio: 1; border-radius: 12px;
  overflow: hidden; border: 1px solid var(--line); background: var(--bg2); display: block;
  margin: 3px 15px 8px 0; }
.item-capa img { width: 100%; height: 100%; object-fit: cover; display: block;
  transition: transform .4s cubic-bezier(.2, .7, .3, 1); }
.item:hover .item-capa img { transform: scale(1.04); }
.item-capa.vazia { display: grid; place-items: center; font-family: var(--font-head);
  font-weight: 700; font-size: 1.05rem; color: var(--accent); letter-spacing: .03em; }
.item-txt { display: block; min-width: 0; }
.item .eyebrow { display: block; font-size: .66rem; margin-bottom: 4px; }
.item-tit { display: block; font-family: var(--font-head); font-size: 1.02rem;
  font-weight: 600; line-height: 1.32; letter-spacing: -.01em;
  transition: color .14s ease; }
.item-dek { display: block; font-size: .84rem; line-height: 1.55; color: var(--dim);
  margin-top: 4px; }
.item-pe { display: block; font-size: .8rem; color: var(--dim); margin-top: 6px;
  font-variant-numeric: tabular-nums; }
/* De que frente e a peca. Entra quando a lista mistura frentes -- na home e na redacao.
   Vem na cor da sub-mochila (`--frente`, que `estilo_das_marcas()` escreve em cada `.item`
   pelo `data-b`): numa fila em que só ela varia, a cor é o que se lê antes da palavra —
   e frente criada depois entra colorida sozinha, sem uma linha nova aqui. */
.item-frente { color: var(--frente, var(--dim)); font-weight: 700; letter-spacing: .08em;
  display: inline-block; padding: 3px 9px; border-radius: 999px; vertical-align: 1px;
  background: color-mix(in srgb, var(--frente, var(--dim)) 13%, transparent); }

/* -------- a lista da redacao --------

   Numa lista em que TUDO e noticia, o tipo nao informa nada e a frente informa tudo: aqui a
   cor volta a ser da frente. A cor diz sempre o que varia. O `--frente` de cada linha vem do
   `estilo_das_marcas()`, entao sub-mochila criada depois entra colorida sozinha. */
.jornal { display: grid; grid-template-columns: repeat(auto-fill, minmax(330px, 1fr));
  gap: 0 40px; }
/* Vale para a lista e para o banner dela: na redacao a peca inteira veste a frente. */
.redacao .item, .redacao .card { --tipo: var(--frente, var(--accent)); }
@media (max-width: 700px) {
.jornal { grid-template-columns: 1fr; }
}

/* -------- a barra de busca da redacao --------

   A frente fica em chip e o resto em menu porque nao pesam igual: "o que saiu de 3D?" e a
   pergunta de todo dia e merece um clique so; fonte e periodo sao recortes de vez em quando.
   O `--frente` do chip vem do `estilo_das_marcas()`, igual ao da lista -- frente nova entra
   colorida sozinha, sem precisar de uma linha aqui. */
/* A contagem divide a linha com o titulo da secao, e nao um bloco por fora dele: o
   `.section-title` e uma regra de largura inteira, e um wrapper flex encolhia essa regra ate
   a largura do texto -- a unica secao do portal com meia linha. Aqui quem vira flex e o
   proprio h2, entao a borda, o espaco de cima e o de baixo continuam os de toda secao. */
.section-title.com-conta { display: flex; align-items: baseline;
  justify-content: space-between; gap: 4px 18px; flex-wrap: wrap; }
.jornal-conta { color: var(--dim); font-size: .78rem; font-weight: 500;
  text-transform: none; letter-spacing: 0; }
/* Os 30px que o titulo de secao ja deixa embaixo valem aqui como em toda secao: os chips
   sao o primeiro conteudo, e nao uma faixa a parte. */
.jornal-frentes { margin: 0 0 12px; }
.chip-jor { display: inline-flex; align-items: center; gap: 7px; padding: 7px 14px;
  border-radius: 999px; text-decoration: none; font-size: .85rem; font-weight: 600;
  color: var(--dim); background: var(--bg2); border: 1px solid var(--line); }
.chip-jor b { font-weight: 700; font-size: .78rem; opacity: .6; }
.chip-jor:hover { color: var(--frente, var(--ink)); border-color: var(--frente, var(--dim)); }
.chip-jor.on { font-weight: 700; color: var(--frente, var(--accent));
  border-color: var(--frente, var(--accent));
  background: color-mix(in srgb, var(--frente, var(--accent)) 12%, transparent); }
.jornal-barra { align-items: center; margin: 0 0 22px; }
.jornal-barra .busca { flex: 1 1 260px; }
.jornal-barra select { flex: 0 1 210px; }
.jornal-barra .limpar { padding: 8px 15px; }
@media (max-width: 700px) {
.jornal-barra select { flex: 1 1 44%; }
}

/* -------- a paginacao --------

   Primeira do portal, entao ela e generica de proposito: o `paginador()` do server nao sabe
   de noticia nenhuma, so pede o endereco da pagina n. A fila mostra as pontas e as vizinhas
   da atual, entao ocupa a mesma linha com 3 paginas ou com 300 -- e continua legivel no
   telefone depois de um ano de feed. */
.paginacao { display: flex; align-items: center; justify-content: center; gap: 8px;
  flex-wrap: wrap; margin: 34px 0 10px; }
.pag-n, .pag-seta { display: inline-flex; align-items: center; gap: 7px; padding: 8px 14px;
  border-radius: 999px; text-decoration: none; font-size: .85rem; font-weight: 600;
  color: var(--dim); background: var(--bg2); border: 1px solid var(--line); }
.pag-n { min-width: 42px; justify-content: center; }
.pag-n:hover, .pag-seta:hover { color: var(--accent); border-color: var(--accent); }
.pag-n.on { font-weight: 700; color: var(--accent); border-color: var(--accent);
  background: color-mix(in srgb, var(--accent) 12%, transparent); }
/* A ponta da fila fica visivel e apagada: sumir com o botao faz os outros pularem de lugar
   a cada pagina, e quem clica rapido erra o alvo. */
.pag-seta.off { opacity: .38; }
.pag-seta .ic { width: 16px; height: 16px; flex: none; }
.pag-corte { color: var(--dim); padding: 0 2px; }
.lista-barra .busca { flex: 1 1 240px; }
/* So o icone, do tamanho do botao ao lado: e um par de estados, nao dois botoes diferentes.
   O apagado e a vista que voce nao esta vendo; o aceso e onde voce esta. */
.btn2.vista { padding: 9px 11px; background: transparent; color: var(--dim);
  border-color: var(--line); }
.btn2.vista:hover { background: var(--bg2); color: var(--ink); border-color: var(--dim); }
.btn2.vista.on { background: color-mix(in srgb, var(--accent) 14%, transparent);
  color: var(--accent); border-color: color-mix(in srgb, var(--accent) 40%, transparent); }
.btn2.vista .ic { width: 18px; height: 18px; }
.arq-mini.peca, .arq-mini.video { display: grid; place-items: center; color: var(--dim); }
.arq-mini .ic { width: 22px; height: 22px; }
@keyframes peca-anda {
from { background-position: 0 0; }
to { background-position: 48px 0; }
}
/* O quadrado da sub-mochila na ficha: cor cheia da frente, logo branca em cima. A cor vem do
   `estilo_das_marcas()`, entao frente criada amanha aparece colorida sem tocar aqui. */
.frente-mark { display: grid; place-items: center; flex: none; overflow: hidden;
  border-radius: 12px; background: var(--frente-cheia, var(--accent)); color: #fff;
  font-weight: 800; letter-spacing: .02em; }
.frente-mark img { width: 74%; height: 74%; object-fit: contain; display: block; }
.frente-mark.md { width: 44px; height: 44px; font-size: .82rem; }
.frente-mark.sm { width: 28px; height: 28px; border-radius: 8px; font-size: .62rem; }
/* Texto comprido nao entorta a ficha: uma linha so, e o resto vira reticencia. O
   `min-width: 0` e o que permite ao filho de um flex encolher abaixo do proprio conteudo --
   sem ele o text-overflow nunca chega a acontecer, o cartao e que estica. */
.ficha-cartao .ptitle, .ficha-cartao .pslug, .ficha-nums dd, .ficha-nums dd a {
  display: block; max-width: 100%; min-width: 0;
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.ed-apagar .hint { display: block; margin-top: 3px; max-width: 60ch; }
.ficha-produto .foto-produto.vazia { height: 168px; }

/* O cartao de produto e a ficha dele: entra na mesma grade das outras telas e corta o texto
   comprido do mesmo jeito. */
.ficha-produto .produto-txt strong, .ficha-produto .produto-txt .pslug {
  display: block; max-width: 100%; overflow: hidden; text-overflow: ellipsis;
  white-space: nowrap; }
/* No telefone as setas viram so o simbolo, para a fila caber numa linha. */
@media (max-width: 560px) {
.pag-seta span { display: none; }
.pag-seta { padding: 8px 11px; }
}
.navlink[data-t="produto"].on { --accent: var(--loja); }
.navlink[data-t="lojafisica"].on { --accent: light-dark(#0e7490, #22d3ee); }
.navlink[data-t="calculadora"].on { --accent: light-dark(#a16207, #fbbf24); }
.navlink[data-t="curso"].on   { --accent: var(--curso); }
.col-vazia { color: var(--dim); font-size: .92rem; padding: 20px 0; margin: 0;
  border-bottom: 1px solid var(--line); }
.coluna .cta { margin-top: 16px; }

/* o titulo na lista da frente, na home, tambem preso em duas linhas */
.secao-lista li a { display: -webkit-box; -webkit-box-orient: vertical;
  -webkit-line-clamp: 2; line-clamp: 2; overflow: hidden; }

@media (max-width: 1040px) {
/* Em duas colunas a leitura ocupa a linha de baixo inteira: e a que tem mais coisa. */
.tres { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 32px; }
.tres .coluna:last-child { grid-column: span 2; }
}
@media (max-width: 700px) {
.tres { grid-template-columns: 1fr; gap: 30px; }
.tres .coluna:last-child { grid-column: auto; }
}
@media (prefers-reduced-motion: reduce) {
.carrossel .slide { transition: none; }
}
.cat-linha-foto.vazia { display: block; }
/* Preço alinhado à direita: é número, e número se lê pela unidade — à esquerda, os centavos
   de um não caem embaixo dos centavos do outro e a coluna não se compara de relance. */
.cat-folha .valor { text-align: right; }

/* =================== marca com logo e alteração em lote =================== */
.marca-cel { display: inline-flex; align-items: center; gap: 8px; min-width: 0; }

/* A marca na ficha pública do produto: a logo maior, com o nome ao lado. */
.prod-marca { margin: 0 0 10px; }
.prod-marca .marca-cel { gap: 10px; font-size: .9rem; font-weight: 600; color: var(--dim); }
.marca-logo { height: 34px; width: auto; max-width: 110px; object-fit: contain;
  border-radius: 7px; background: var(--bg2); border: 1px solid var(--line); padding: 3px 6px; }
.contagem-cat .vazia .cat-num strong { color: var(--dim); }

/* O quadro da categoria que está filtrando a lista fica aceso — a mesma marca dos chips de
   filtro, para o recorte no ar ser visível sem a pessoa reler a barra. */
.contagem-cat a.on { border-color: var(--accent); background: var(--bg);
  box-shadow: 0 0 0 1px var(--accent) inset; }

/* ---------------- as logos das marcas ---------------- */

/* O <defs> do degradê do Instagram não desenha nada: guarda só o gradiente que cada logo
   chama pelo id. Fica fora do fluxo para não abrir um vão de nada no alto da página. */
.marcas-defs { position: absolute; width: 0; height: 0; overflow: hidden; }
/* TikTok e Threads são pretas de verdade. Numa bio de fundo escuro uma logo preta some,
   então a cor delas é uma variável: a marca continua a mesma, muda só o que sobra visível. */
:root { --marca-preta: light-dark(#14161c, #f2f3f7); }
html[data-theme="bio"] { --marca-preta: #14161c; }
html[data-theme="bio"][data-estilo="escuro"],
html[data-theme="bio"][data-estilo="gradiente"],
html[data-theme="bio"][data-estilo="foto"] { --marca-preta: #ffffff; }
/* O tamanho vem em `em` para a logo crescer junto com o texto de quem a cerca. */
.marca-ic { width: 1em; height: 1em; display: block; }
.bio-bt-ic { display: grid; place-items: center; }
.bio-bt-ic .marca-ic, .bio-bt-ic .ic { width: 1.15em; height: 1.15em; }
.bio-rede .marca-ic, .bio-rede .ic { width: 21px; height: 21px; }
.chave .marca-ic, .chave .ic { width: 17px; height: 17px; display: inline-block;
  vertical-align: -3px; }

/* ---------------- o painel da parede (TV) ---------------- */

/* Uma TV é lida em pé, a três metros, sem mouse: tudo aqui é maior do que pareceria certo
   numa mesa. Os tamanhos saem de `clamp()` com `vw` no meio, e por isso a mesma página serve
   a uma TV de 50" e ao monitor onde ela foi conferida, sem uma segunda folha de estilo.
   A fonte é a do sistema de propósito: TV baixando fonte da web é TV mostrando o painel em
   Times New Roman por dez segundos a cada recarga. */
html[data-theme="tv"] {
  color-scheme: dark;
  --bg: #0b0d13; --bg2: #171b26; --ink: #f3f5fb; --dim: #99a1b7; --line: #262c3b;
  --atrasado: #ff4d6d; --hoje: #ffab2d; --perto: #ffd93d; --folga: #4ade80; --sem: #6b7280;
  font-family: system-ui, -apple-system, "Segoe UI", sans-serif;
}

/* Seis colunas. O `auto-fit` com um mínimo não serve aqui: numa parede as filas têm de estar
   sempre na mesma ordem e no mesmo lugar, e uma grade que reflui muda o desenho da tela toda
   vez que entra um pedido. Seis fatias iguais, e quem aperta é o cartão. */
/* O `<main>` do portal tem `max-width: 1180px` e `margin: 0 auto`, e as colunas da parede são
   um `<main>`: numa TV de 1920 elas estavam espremidas no meio, com 370px de nada de cada
   lado e 90px de vão embaixo. A parede não é uma página de leitura — ela usa o vidro inteiro. */
html[data-theme="tv"] main { max-width: none; margin: 0; padding: 0; }
.tv-col.vazia .tv-conta { color: var(--dim); }
.tv-origem .marca-ic, .tv-origem .ic { width: 1.15em; height: 1.15em; }

/* ---------------- lojas físicas ---------------- */

/* Os quadradinhos das sub-mochilas que a loja atende. Cor, logo e nome dizendo a mesma
   coisa — cor sozinha nunca é informação, e aqui há cinco cores para distinguir. */
.loja-secoes { display: flex; flex-wrap: wrap; gap: 6px; }
.loja-secao { display: inline-flex; align-items: center; gap: 5px; font-size: .74rem;
  font-weight: 600; background: var(--bg); border: 1px solid var(--line);
  border-radius: 999px; padding: 2px 9px 2px 3px; }
.loja-foto.vazia { display: grid; place-items: center; background: var(--bg);
  color: var(--dim); }
.loja-foto.vazia .ic { width: 34px; height: 34px; }

/* A lista pública. Foto larga em cima e o texto embaixo: quem procura loja procura a foto
   da fachada, que é o que ela vai reconhecer da calçada. */
.lojas-hero .lojas-conta { margin: 14px 0 0; color: var(--dim); }
.lojas-hero .lojas-conta strong { color: var(--ink); font-size: 1.3rem; }
/* Duas colunas, e não quantas couberem: são poucas lojas e cada cartão carrega foto,
   endereço e horário — em três colunas a foto virava miniatura e o endereço quebrava em
   quatro linhas. No celular vira uma só. */
.lojas-grade { display: grid; gap: 22px; margin: 24px 0 48px;
  grid-template-columns: repeat(2, minmax(0, 1fr)); }
/* Três por linha na vitrine do portal: o cartão de lá parou de contar horário, telefone e
   seções — isso mudou-se para a ficha da loja —, então ele cabe em um terço da tela. */
.lojas-grade:has(.lojap-curta) { grid-template-columns: repeat(3, minmax(0, 1fr)); }
.lojap-curta { text-decoration: none; color: inherit;
  transition: transform .14s ease, box-shadow .16s ease, border-color .14s ease; }
.lojap-curta:hover { transform: translateY(-2px); border-color: var(--accent);
  box-shadow: 0 14px 30px rgba(15, 17, 26, .1); }
.lojap-curta .lojap-txt { gap: 8px; }
.lojap-ver { margin-top: auto; font-size: .84rem; font-weight: 600; color: var(--accent); }
.lojap-ver::after { content: " →"; }
@media (max-width: 1040px) {
.lojas-grade:has(.lojap-curta) { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}
@media (max-width: 760px) {
.lojas-grade, .lojas-grade:has(.lojap-curta) { grid-template-columns: 1fr; }
}

/* A ficha de uma loja em formato de cartão: a fachada de um lado e, do outro, tudo o que
   se pergunta na ordem em que se pergunta — que loja é, se está aberta, onde fica, como
   falar, quando abre e o que tem lá dentro. O endereço aparece **uma vez**: antes ele estava
   no alto e de novo num bloco embaixo, dizendo a mesma coisa duas vezes na mesma tela. */
.loja-cartao { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
  gap: 0; align-items: stretch; border: 1px solid var(--line); border-radius: 20px;
  overflow: hidden; background: var(--bg2); margin-bottom: 40px; }
.loja-foto { background: var(--bg); display: grid; place-items: center; min-height: 100%; }
.loja-foto img { width: 100%; height: 100%; object-fit: cover; display: block; }
.loja-capa-vazia { display: grid; place-items: center; padding: 40px; }
.loja-dados { padding: 28px 30px 30px; display: flex; flex-direction: column; gap: 12px;
  align-self: center; }
.loja-dados .kicker { margin: 0; }
.loja-dados h1 { margin: 0; font-size: clamp(1.5rem, 2.6vw, 2rem); display: flex;
  align-items: center; gap: 10px; flex-wrap: wrap; }
.loja-end { font-style: normal; display: flex; flex-direction: column; gap: 2px;
  font-size: .95rem; line-height: 1.5; color: var(--dim); }
.loja-end span:first-child { color: var(--ink); font-weight: 600; }
/* O "Como chegar" sai junto do endereço — ele completa a frase que está logo acima — e os
   canais vêm em linhas com o número escrito: botão de WhatsApp sem número faz a pessoa
   clicar só para descobrir para quem vai falar. */
.loja-onde { display: flex; flex-direction: column; align-items: flex-start; gap: 12px; }
.loja-ir { display: inline-flex; align-items: center; gap: 8px; min-height: 42px;
  padding: 0 16px; }
.loja-ir svg { width: 17px; height: 17px; flex: none; }
.loja-canais { display: flex; flex-direction: column; gap: 2px; margin-top: 6px;
  border-top: 1px solid var(--line); padding-top: 10px; }
.loja-canal { display: flex; align-items: center; gap: 10px; text-decoration: none;
  color: inherit; padding: 8px 0; font-size: .94rem; }
.loja-canal:hover { color: var(--accent); }
.loja-canal svg { width: 19px; height: 19px; flex: none; color: var(--accent); }
.loja-canal span { color: var(--dim); font-size: .74rem; letter-spacing: .08em;
  text-transform: uppercase; font-weight: 700; }
.loja-canal b { font-weight: 600; font-variant-numeric: tabular-nums; }
.loja-nota { margin: 4px 0 0; font-size: .9rem; color: var(--dim); }
.loja-rot { margin: 14px 0 6px; font-size: .7rem; letter-spacing: .12em;
  text-transform: uppercase; color: var(--dim); font-weight: 700; }
.loja-quando { border-top: 1px solid var(--line); padding-top: 4px; }
.loja-horas { display: grid; gap: 6px; margin: 0; max-width: 26rem; }
.loja-horas > div { display: flex; justify-content: space-between; gap: 14px;
  font-size: .92rem; }
.loja-horas > div.fechado { opacity: .5; }
.loja-horas dt { font-weight: 600; }
.loja-horas dd { margin: 0; color: var(--dim); font-variant-numeric: tabular-nums; }
.loja-quando .hint { margin: 8px 0 0; }
@media (max-width: 860px) {
  .loja-cartao { grid-template-columns: 1fr; }
  .loja-foto { aspect-ratio: 16 / 9; }
}

/* Sem outras lojas cadastradas não há coluna do lado: a ficha usa a largura inteira em vez
   de deixar um terço da tela em branco. */
.loja-sozinha { max-width: 62rem; }
/* O cartão é uma coluna com o pé colado embaixo: com fotos de alturas diferentes e horários
   de tamanhos diferentes, sem isso os botões "como chegar" ficavam em alturas diferentes na
   mesma fila, e a grade parecia torta. */
.lojap { border: 1px solid var(--line); border-radius: var(--radius); overflow: hidden;
  background: var(--bg2); display: flex; flex-direction: column; }
.lojap:hover { border-color: color-mix(in srgb, var(--cf, var(--accent)) 45%, var(--line)); }
.lojap[data-b="3d"]       { --cf: #ea7317; }
.lojap[data-b="game"]     { --cf: #10b981; }
.lojap[data-b="ia"]       { --cf: #06b6d4; }
.lojap[data-b="noticias"] { --cf: #dc2626; }
.lojap[data-b="nerd"]     { --cf: #8b5cf6; }
/* Sem foto, a capa é uma faixa na cor da primeira sub-mochila com a logo branca no meio: a
   fila fica reta com foto e sem foto, e um retângulo branco vazio parece defeito. */
.lojap-capa { position: relative; height: 168px; flex: none; overflow: hidden;
  background: linear-gradient(140deg, color-mix(in srgb, var(--cf, var(--accent)) 78%, #101014),
              color-mix(in srgb, var(--cf, var(--accent)) 24%, #101014));
  display: grid; place-items: center; }
.lojap-capa img { width: 100%; height: 100%; object-fit: cover; display: block; }
.lojap-marca .frente-mark { width: 76px; height: 76px; border-radius: 20px; }
.lojap-cidade { position: absolute; left: 12px; bottom: 12px; background: rgba(12,14,20,.72);
  color: #fff; border-radius: 999px; padding: 4px 12px; font-size: .76rem; font-weight: 700;
  letter-spacing: .04em; text-transform: uppercase; backdrop-filter: blur(4px); }
.lojap-txt { padding: 16px 18px 18px; display: flex; flex-direction: column; gap: 10px;
  flex: 1; }
.lojap-txt h2 { margin: 0; font-size: 1.15rem; line-height: 1.3; }
.lojap-txt p { margin: 0; }
/* O estado de agora é a primeira coisa que se procura numa lista de lojas: "dá para ir?" */
.lojap-estado { align-self: flex-start; font-size: .78rem; font-weight: 700; padding: 3px 11px;
  border-radius: 999px; background: color-mix(in srgb, var(--dim) 18%, transparent);
  color: var(--dim); }
.lojap-estado.on { background: color-mix(in srgb, #16a34a 18%, transparent);
  color: light-dark(#15803d, #4ade80); }
.lojap-estado.off { background: color-mix(in srgb, #d97706 18%, transparent);
  color: light-dark(#b45309, #fbbf24); }
.lojap-end { display: flex; align-items: flex-start; gap: 8px; color: var(--dim);
  font-size: .92rem; line-height: 1.45; }
.lojap-end .ic { width: 17px; height: 17px; flex: none; margin-top: 2px; }
.lojap-bts { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; margin-top: auto;
  padding-top: 4px; }
.lojap-bts .ic, .lojap-bts .marca-ic { width: 17px; height: 17px; }
.lojap-bts .btn2 { display: inline-flex; align-items: center; gap: 6px; }

.lojap-dias { display: grid; grid-template-columns: auto 1fr; gap: 3px 16px; margin: 0;
  font-size: .88rem; padding: 10px 12px; border-radius: 10px; background: var(--bg);
  border: 1px solid var(--line); }
.lojap-dias > div { display: contents; }
.lojap-dias dt { color: var(--dim); }
.lojap-dias dd { margin: 0; font-weight: 600; }
.abas-cartao .aba-painel.on .aba-conta {
  background: color-mix(in srgb, var(--accent) 18%, transparent); }
.lojap-sem .ic { width: 52px; height: 52px; }

/* A coluna das lojas no rodapé: cada uma leva direto ao mapa dela. Quem chega ao pé da
   página procurando endereço quer sair andando, não abrir outra tela para clicar de novo. */
.foot-lojas a { display: flex; flex-direction: column; gap: 1px; }
.foot-lojas a em { font-style: normal; font-size: .82rem; color: var(--dim); }
.foot-lojas .foot-todas { margin-top: 4px; font-weight: 600; color: var(--accent); }
.tv-entrega .ic { width: 1.05em; height: 1.05em; flex: none; }
.entrega-agora .ic { width: 20px; height: 20px; color: var(--dim); }
.prod-achado .valor { font-weight: 700; white-space: nowrap; }
.itens-grade .valor { font-weight: 700; text-align: right; white-space: nowrap;
  font-variant-numeric: tabular-nums; }
.item-ok .ic { width: 17px; height: 17px; }
.item-novo .item-novo-que .ic { position: absolute; left: 11px; bottom: 11px; width: 18px;
  height: 18px; color: var(--dim); pointer-events: none; }

@media (max-width: 760px) {
/* No celular a régua de colunas não cabe: cada linha vira um bloco próprio, e aí o
     `display: contents` sai do caminho para o formulário poder ter moldura. */
}
.campos.aba-corpo[hidden] { display: none; }
.itens-local > .ic { width: 19px; height: 19px; color: var(--dim); flex: none; }
.itens-local .hint { flex-basis: 100%; margin: 0; text-transform: none; letter-spacing: 0; }
.pgto-forma .hint { margin: 0; }

/* ---------------- calculadora de impressão ---------------- */

.calc-hero { padding-bottom: 18px; }
/* O vídeo pequeno ao lado do título, e não uma faixa larga em cima: ele é um convite, não o
   assunto da página — quem chega aqui quer a conta, e quem quer o passo a passo o encontra
   sem ter de rolar por cima dele. */
/* O vídeo saiu do alto da calculadora e foi para "Como esta conta é feita", no fim: quem
   abre a calculadora quer calcular, e o vídeo ali competia com o formulário e ainda apertava
   o título. Lá embaixo ele fica ao lado da explicação, que é onde alguém procura ajuda. */
.calc-explica { display: grid; gap: 30px; align-items: start;
  grid-template-columns: minmax(0, 1.3fr) minmax(0, 1fr); }
.calc-explica .video-tela { margin: 0; position: sticky; top: 22px; }
@media (max-width: 860px) {
  .calc-explica { grid-template-columns: 1fr; }
  .calc-explica .video-tela { position: static; }
}
.calc-hero.com-video { display: flex; gap: 28px; align-items: center; flex-wrap: wrap; }
.calc-hero-txt { flex: 1 1 22rem; min-width: 0; }
/* Sem largura máxima: as 14ch quebravam "Quanto custa imprimir isso?" em duas linhas mesmo
   sobrando meia tela ao lado. Em tela estreita ele quebra sozinho, que é o certo. */
.calc-hero-txt h1 { max-width: none; }
.calc-hero.com-video .video-tela { flex: 0 1 340px; margin: 0; }
@media (max-width: 760px) {
.calc-hero.com-video { gap: 16px; }
.calc-hero.com-video .video-tela { flex: 1 1 100%; }
}
.calc { border: 1px solid var(--line); border-radius: var(--radius); background: var(--bg2);
  padding: 20px 22px; margin-bottom: 20px; }
.calc-campos { display: grid; gap: 14px 18px;
  grid-template-columns: repeat(auto-fit, minmax(170px, 1fr)); }
.calc-campo { display: flex; flex-direction: column; gap: 4px; font-size: .8rem;
  font-weight: 600; color: var(--dim); }
.calc-campo > span:first-child { color: var(--ink); }
.calc-campo .campo-junto { display: flex; align-items: stretch; }
.calc-campo input { width: 100%; padding: 9px 12px; border: 1px solid var(--line);
  border-right: none; border-radius: 9px 0 0 9px; background: var(--bg); color: var(--ink);
  font: inherit; font-size: .95rem; font-weight: 600; text-align: right; }
.calc-campo input:focus { outline: none; border-color: var(--accent);
  box-shadow: 0 0 0 3px color-mix(in srgb, var(--accent) 14%, transparent); }
.calc-campo .sufixo { display: grid; place-items: center; padding: 0 11px;
  border: 1px solid var(--line); border-radius: 0 9px 9px 0; background: var(--bg2);
  color: var(--dim); font-size: .82rem; font-weight: 600; white-space: nowrap; }
.calc-campo .hint { font-weight: 400; }
.calc-bts { display: flex; gap: 10px; align-items: center; margin-top: 18px; flex-wrap: wrap; }

/* O resultado é a razão da página: ele vem em bloco próprio, com o preço maior que tudo. */
.calc-saida { display: grid; gap: 18px; grid-template-columns: 1.4fr 1fr;
  align-items: start; margin-bottom: 32px; }
.calc-partes { display: flex; flex-direction: column; gap: 2px; margin: 0; }
.calc-partes > div { display: grid; grid-template-columns: 1fr auto; gap: 4px 14px;
  align-items: baseline; padding: 9px 14px; border-radius: 9px; }
.calc-partes > div:nth-child(odd) { background: var(--bg2); }
.calc-partes dt { font-weight: 600; }
.calc-partes dd { margin: 0; font-weight: 700; font-variant-numeric: tabular-nums; }
.calc-partes small { grid-column: 1 / -1; color: var(--dim); font-size: .78rem; }
.calc-total { display: flex; flex-direction: column; gap: 10px; }
.calc-custo, .calc-preco { border: 1px solid var(--line); border-radius: 14px;
  padding: 16px 18px; display: flex; flex-direction: column; gap: 2px; }
.calc-custo span, .calc-preco span { font-size: .74rem; letter-spacing: .09em;
  text-transform: uppercase; color: var(--dim); font-weight: 700; }
.calc-custo strong { font-size: 1.5rem; font-weight: 700; font-variant-numeric: tabular-nums; }
.calc-preco { background: color-mix(in srgb, var(--accent) 10%, var(--bg2));
  border-color: color-mix(in srgb, var(--accent) 40%, var(--line)); }
.calc-preco strong { font-size: 2.2rem; font-weight: 800; line-height: 1.1;
  font-variant-numeric: tabular-nums; }
.calc-preco small { color: var(--dim); font-size: .84rem; }
/* O texto que explica a conta ocupa a largura toda e sai justificado. Justificado pede
   hifenização: sem ela, o português estica os espaços e abre aqueles rios brancos no meio
   do parágrafo. */
.calc-diz { margin-bottom: 48px; max-width: none; }
.calc-diz h2 { font-size: 1.2rem; margin: 0 0 12px; }
.calc-diz p { margin: 0 0 12px; text-align: justify; text-justify: inter-word;
  hyphens: auto; -webkit-hyphens: auto; }
/* Em coluna estreita o justificado piora em vez de melhorar: pouca palavra por linha vira
   espaço demais entre elas. */
@media (max-width: 620px) {
.calc-diz p { text-align: left; }
}
@media (max-width: 760px) {
.calc-saida { grid-template-columns: 1fr; }
}

/* As duas calculadoras: rápida e completa. As abas ficam acima do formulário porque a
   escolha vem antes de preencher. */
/* O seletor de máquina não é mais um campo no meio dos outros: escolher a impressora muda
   dois números do formulário, e isso precisa parecer uma decisão. Fica em ficha própria,
   antes dos campos, com o que a máquina escolhida traz do lado. */
.calc-maquina { display: grid; gap: 16px 22px; grid-template-columns: minmax(0, 1fr) minmax(0, 1.1fr);
  align-items: start; margin: 0 0 22px; padding: 16px 18px; border: 1px solid var(--line);
  border-radius: 14px; background: var(--bg2); }
.calc-maquina.tem { border-color: color-mix(in srgb, var(--accent) 38%, var(--line));
  background: color-mix(in srgb, var(--accent) 6%, var(--bg2)); }
.calc-maquina-esc { display: flex; flex-direction: column; gap: 6px; font-size: .8rem;
  font-weight: 600; color: var(--dim); min-width: 0; }
.calc-maquina-rot { color: var(--ink); font-size: .74rem; letter-spacing: .09em;
  text-transform: uppercase; font-weight: 700; }
.calc-maquina-esc select { width: 100%; padding: 10px 12px; border: 1px solid var(--line);
  border-radius: 9px; background: var(--bg); color: var(--ink); font: inherit;
  font-size: .95rem; font-weight: 600; }
.calc-maquina-esc select:focus { outline: none; border-color: var(--accent);
  box-shadow: 0 0 0 3px color-mix(in srgb, var(--accent) 14%, transparent); }
.calc-maquina-esc optgroup { font-weight: 700; color: var(--dim); }
.calc-maquina-esc option { font-weight: 600; color: var(--ink); }
.calc-maquina-esc .hint { font-weight: 400; }
.calc-maquina-vazio { margin: 0; align-self: center; color: var(--dim); font-size: .84rem;
  padding-left: 18px; border-left: 2px solid var(--line); }
@media (max-width: 720px) {
.calc-maquina { grid-template-columns: 1fr; }
.calc-maquina-vazio { padding: 0; border-left: none; }
}
.calc-abas { display: flex; gap: 4px; margin: 0 0 14px; border-bottom: 1px solid var(--line); }
.calc-aba { padding: 10px 18px; text-decoration: none; color: var(--dim); font-weight: 600;
  font-size: .92rem; border-bottom: 2px solid transparent; margin-bottom: -1px; }
.calc-aba:hover { color: var(--ink); }
.calc-aba.on { color: var(--accent); border-bottom-color: var(--accent); }
.calc-assumido { color: var(--dim); font-size: .88rem; margin: -18px 0 32px;
  padding: 10px 14px; border-left: 3px solid var(--line); }
/* O pedaço que se refaz a cada clique: abas, formulário e resultado. Enquanto a conta volta
   do servidor, a tela não se mexe — nada entra nem sai do fluxo, o resultado só desbota. Um
   "carregando" que empurrasse o conteúdo faria justamente o pulo que isto veio tirar. */
.calc-vivo .calc-saida, .calc-vivo .calc-lixo, .calc-vivo .calc-assumido,
.calc-vivo .calc-tranca { transition: opacity .12s ease; }
.calc-vivo.pensando { cursor: progress; }
.calc-vivo.pensando .calc-saida, .calc-vivo.pensando .calc-lixo,
.calc-vivo.pensando .calc-assumido, .calc-vivo.pensando .calc-tranca { opacity: .45; }
/* O custo agrupado por natureza: material, máquina, trabalho e perda. Uma lista corrida de
   sete linhas obriga a somar de cabeça para saber onde o dinheiro está; agrupada, a resposta
   salta. A faixa atrás do título é a fatia do grupo no custo — o número já está escrito ao
   lado, e a barra é para enxergar de longe qual grupo manda. */
.calc-conta { display: flex; flex-direction: column; gap: 12px; }
.calc-grupo-topo { display: grid; grid-template-columns: 1fr auto auto; gap: 4px 12px;
  align-items: baseline; margin: 0 0 2px; padding: 7px 14px; border-radius: 9px;
  background: linear-gradient(to right,
    color-mix(in srgb, var(--accent) 18%, var(--bg2)) var(--fatia, 0%),
    var(--bg2) var(--fatia, 0%)); }
.calc-grupo-topo span { font-size: .72rem; letter-spacing: .09em; text-transform: uppercase;
  font-weight: 800; color: var(--ink); }
.calc-grupo-topo b { font-weight: 800; font-variant-numeric: tabular-nums; }
.calc-grupo-topo em { font-style: normal; font-weight: 700; font-size: .78rem;
  color: var(--dim); font-variant-numeric: tabular-nums; min-width: 3ch; text-align: right; }
/* Dentro do grupo o zebrado sai de cena: a faixa do título já separa um grupo do outro, e
   duas divisões concorrendo deixam a lista mais suja, não mais clara. */
.calc-grupo .calc-partes > div { padding: 5px 14px; }
.calc-grupo .calc-partes > div:nth-child(odd) { background: none; }
/* O desperdício fica entre o custo e o preço, que são os dois números que ele explica.
   Discreto de propósito: é a mesma despesa que já está no custo, vista pelo lado do que não
   chega à mão de ninguém — se gritasse como o preço, pareceria uma segunda conta a pagar. */
.calc-perda { border: 1px dashed color-mix(in srgb, #b45309 45%, var(--line));
  border-radius: 14px; padding: 14px 18px; display: flex; flex-direction: column; gap: 2px;
  background: color-mix(in srgb, #b45309 6%, transparent); }
.calc-perda > span { font-size: .74rem; letter-spacing: .09em; text-transform: uppercase;
  color: var(--dim); font-weight: 700; }
.calc-perda > strong { font-size: 1.3rem; font-weight: 700; font-variant-numeric: tabular-nums; }
.calc-perda > small { color: var(--dim); font-size: .8rem; }
.calc-perda-partes { list-style: none; margin: 8px 0 0; padding: 8px 0 0;
  border-top: 1px solid var(--line); display: flex; flex-direction: column; gap: 3px;
  font-size: .8rem; color: var(--dim); }
.calc-perda-partes li { display: flex; justify-content: space-between; gap: 12px; }
.calc-perda-partes b { color: var(--ink); font-weight: 600;
  font-variant-numeric: tabular-nums; white-space: nowrap; }
.calc-perda > em { margin-top: 8px; font-style: normal; font-size: .78rem; color: var(--dim);
  line-height: 1.45; }

/* O vídeo de uma tela. A moldura guarda a proporção 16:9 sozinha, então a página não pula
   quando o iframe carrega — e sem endereço escrito nada disto existe. */
.video-tela { margin: 0 0 22px; max-width: 760px; }
.video-moldura { position: relative; aspect-ratio: 16 / 9; border-radius: var(--radius);
  overflow: hidden; background: var(--bg2); border: 1px solid var(--line); }
.video-moldura iframe { position: absolute; inset: 0; width: 100%; height: 100%; border: 0; }
.video-tela figcaption { margin-top: 8px; color: var(--dim); font-size: .9rem; }

/* O crédito da conta que escreveu, na linha de assinatura da matéria. Discreto de
   propósito: quem lê veio pelo assunto, e a loja é a informação de depois, não a de
   antes — mas precisa estar clicável, senão o texto não devolve nada a quem o escreveu. */
.credito-conta a { color: inherit; text-decoration: underline; text-underline-offset: 2px; }
.credito-conta a:hover { color: var(--accent); }

/* ---------------- o menu da foto ----------------
   Um `<details>` fechado por padrão: o gatilho é a própria foto, na barra do portal e no
   topo da plataforma. A caixa se ancora à direita porque a foto mora no canto direito das
   duas barras — aberta à esquerda ela sairia da tela no celular. */
.eu-menu { position: relative; flex: none; }
.eu-menu > summary { cursor: pointer; list-style: none; }
.eu-menu > summary::-webkit-details-marker { display: none; }
.eu-menu > summary::marker { content: ""; }
.eu-caixa {
  position: absolute; right: 0; top: calc(100% + 8px); z-index: 80;
  min-width: 16.5rem; max-width: min(20rem, calc(100vw - 24px)); padding: 6px;
  background: var(--bg); border: 1px solid var(--line); border-radius: 14px;
  box-shadow: 0 20px 44px -14px rgba(10, 12, 20, .45);
  display: flex; flex-direction: column; gap: 2px;
}
.eu-cab { display: flex; align-items: center; gap: 11px; padding: 10px 10px 12px;
  border-bottom: 1px solid var(--line); margin-bottom: 6px; }
.eu-quem { display: flex; flex-direction: column; gap: 2px; min-width: 0; }
.eu-quem strong { font-size: .93rem; line-height: 1.2; }
.eu-quem span { font-size: .78rem; color: var(--dim); overflow-wrap: anywhere; }
.eu-item { display: flex; align-items: center; gap: 10px; width: 100%; padding: 9px 10px;
  border: 0; border-radius: 10px; background: none; color: inherit; font: inherit;
  font-size: .87rem; text-align: left; text-decoration: none; cursor: pointer; }
.eu-item:hover { background: color-mix(in srgb, var(--accent) 12%, transparent);
  color: var(--accent); }
.eu-item svg { width: 18px; height: 18px; flex: none; }
.eu-menu form { margin: 0; }

/* A calculadora antes do primeiro clique: a página abre com os campos e este convite no
   lugar onde o resultado vai aparecer. Sem ele o formulário terminava no nada e parecia
   que faltava alguma coisa. */
.calc-espera { margin-top: 14px; padding: 18px 20px; border-radius: 14px;
  border: 1px dashed var(--line); color: var(--dim); background: var(--bg2, transparent); }
.calc-espera p { margin: 0; font-size: .92rem; }
.calc-espera strong { color: var(--ink); }

/* ---------------- a página Plataforma ---------------- */

/* Os pacotes usam o cartão da Loja e dos Cursos (`.curso-card`) — quem chega já aprendeu
   esse desenho —, mas com a mão mais leve: a capa é deitada como foi desenhada, o canto é
   mais redondo e o cartão sobe no passar do mouse. O que a capa já diz (nome e chamada) não
   se repete embaixo; ali fica o parágrafo e o convite. */
.plat-grade { display: grid; gap: 26px; margin-top: 8px;
  grid-template-columns: repeat(auto-fill, minmax(320px, 1fr)); }
.plat-cartao { border-radius: 18px; overflow: hidden;
  box-shadow: 0 1px 2px rgba(15, 17, 26, .04); }
.plat-cartao .curso-capa { aspect-ratio: 1200 / 630; }
.plat-cartao .curso-capa img { transition: transform .5s cubic-bezier(.2, .7, .3, 1); }
.plat-cartao:hover { box-shadow: 0 14px 34px rgba(15, 17, 26, .1); }
.plat-cartao:hover .curso-capa img { transform: scale(1.035); }
.plat-cartao .curso-txt { padding: 16px 20px 18px; gap: 8px; }
.plat-cartao h3 { font-family: var(--font-head); font-size: 1.2rem; }
.plat-cartao .dek { line-height: 1.55; }
.plat-cartao .curso-pe { align-items: center; justify-content: space-between; gap: 10px;
  padding-top: 12px; border-top: 1px solid var(--line); }
/* O chip do diferencial e o convite: um de cada lado do pé, para o cartão terminar numa
   linha e não numa pilha de frases soltas. */
.plat-chip { font-size: .72rem; letter-spacing: .04em; text-transform: uppercase;
  font-weight: 600; padding: 4px 10px; border-radius: 999px; color: var(--accent);
  background: color-mix(in srgb, var(--accent) 12%, transparent); }
.plat-ver { margin-left: auto; font-size: .84rem; font-weight: 600; color: var(--accent);
  white-space: nowrap; }
.plat-ver::after { content: " →"; transition: margin .14s ease; }
.plat-cartao:hover .plat-ver::after { margin-left: 4px; }

/* A ficha do pacote. Herói próprio: a capa deitada de um lado, o texto do outro, os dois
   começando na mesma linha e terminando junto — a galeria do produto deixava meia tela
   vazia embaixo da capa. */
/* A capa do pacote abre a ficha como faixa larga, e não como uma figurinha na coluna da
   esquerda: ela é a cara do pacote, tem o nome desenhado em corpo grande e é o que a pessoa
   reconhece depois no menu e na implantação. A altura é cortada (o desenho é centrado, então
   o miolo sobrevive) para a faixa não empurrar o texto para fora da primeira tela. */
.plat-hero { display: block; padding: 6px 0 30px; }
.plat-hero-capa { margin-bottom: 28px; }
.plat-hero-capa img, .plat-hero-capa .sem-capa { width: 100%; aspect-ratio: 1200 / 420;
  object-fit: cover; background: var(--bg2); border-radius: 20px;
  border: 1px solid var(--line); box-shadow: 0 18px 44px rgba(15, 17, 26, .12);
  display: block; }
.plat-hero-capa .sem-capa { display: grid; place-items: center; color: var(--accent);
  font-family: var(--font-head); font-weight: 700; font-size: 1.8rem; }
@media (max-width: 700px) {
  .plat-hero-capa img, .plat-hero-capa .sem-capa { aspect-ratio: 1200 / 630; }
}
.plat-hero-txt h1 { font-size: clamp(1.9rem, 4vw, 2.6rem); margin: .1em 0 .2em; }
.plat-hero-txt .kicker { margin: 0; }
/* O texto acompanha a largura da faixa, e não uma coluna estreita no canto: com a capa
   ocupando a página inteira, um parágrafo de meia largura embaixo dela parecia um pedaço
   solto. Em compensação o corpo cresce um ponto e a entrelinha abre, senão a linha longa
   cansa. */
.plat-hero-txt .prod-desc { max-width: none; font-size: 1.06rem; line-height: 1.75; }
.plat-hero-txt .prod-desc p { margin: 0 0 14px; }
.plat-hero-txt .acts { margin-top: 20px; }

/* O selo da implantação: é o argumento mais forte do pacote, e um chip pequeno no meio do
   texto passava batido. */
.plat-selo { display: flex; gap: 12px; align-items: flex-start; margin: 18px 0 0;
  padding: 14px 16px; border-radius: 14px; font-size: .9rem; line-height: 1.55;
  border: 1px solid color-mix(in srgb, var(--accent) 32%, var(--line));
  background: color-mix(in srgb, var(--accent) 7%, transparent); }
.plat-selo svg { width: 20px; height: 20px; color: var(--accent); flex: none;
  margin-top: 2px; }

/* "O que vem dentro": um bloco por módulo, com o título encostado num filete da cor da
   marca. É o que separa os módulos sem precisar de mais uma caixa em volta de cada um. */
.plat-titulo { font-family: var(--font-head); font-size: 1.55rem; margin: 40px 0 4px; }
.plat-sub, .plat-passos .dek, .plat-fim .dek { max-width: 64ch; }
.plat-modulos { display: grid; gap: 42px; margin-top: 26px; }
.plat-modulo h3 { margin: 0 0 4px; font-size: 1.2rem; display: flex; align-items: center;
  gap: 10px; font-family: var(--font-head); }
.plat-modulo h3 svg { width: 22px; height: 22px; color: var(--accent); flex: none; }
.plat-modulo .dek { margin: 0 0 16px; font-size: .92rem; color: var(--dim); }
.plat-telas-cheias { display: grid; gap: 22px; margin-top: 14px;
  grid-template-columns: repeat(auto-fill, minmax(330px, 1fr)); }
.plat-tela { border: 1px solid var(--line); border-radius: 18px; overflow: hidden;
  background: var(--bg2); display: flex; flex-direction: column;
  transition: box-shadow .16s ease, transform .16s ease, border-color .16s ease; }
.plat-tela:hover { transform: translateY(-2px); border-color: var(--accent);
  box-shadow: 0 14px 30px rgba(15, 17, 26, .1); }
.plat-print { display: block; aspect-ratio: 1280 / 800; overflow: hidden;
  background: var(--bg); border-bottom: 1px solid var(--line); }
.plat-print img { width: 100%; height: 100%; object-fit: cover; object-position: top center;
  display: block; transition: transform .5s cubic-bezier(.2, .7, .3, 1); }
.plat-tela:hover .plat-print img { transform: scale(1.03); }
.plat-tela-txt { padding: 16px 18px 18px; }
.plat-tela-txt h4 { margin: 0 0 5px; font-size: 1rem; font-family: var(--font-head); }
.plat-tela-txt p { margin: 0; font-size: .88rem; color: var(--dim); line-height: 1.6; }
.plat-mais { margin: 18px 0 8px; font-size: .74rem; color: var(--dim);
  text-transform: uppercase; letter-spacing: .08em; }
.plat-telas { list-style: none; margin: 0; padding: 0; display: flex; flex-wrap: wrap;
  gap: 8px; }
.plat-telas li { font-size: .82rem; padding: 5px 12px; border-radius: 999px;
  border: 1px solid var(--line); color: var(--dim); background: var(--bg2); }

/* Os primeiros passos: lista numerada com a bolinha da marca, e não o número cru do
   navegador — é a mesma régua da implantação lá dentro. */
.plat-passos { margin-top: 14px; }
.plat-lista { margin: 22px 0 0; padding: 0; list-style: none; display: grid; gap: 14px;
  max-width: 72ch; counter-reset: passo; }
.plat-lista li { position: relative; padding-left: 44px; counter-increment: passo; }
.plat-lista li::before { content: counter(passo); position: absolute; left: 0; top: 0;
  width: 28px; height: 28px; border-radius: 999px; display: grid; place-items: center;
  font-size: .8rem; font-weight: 700; color: var(--accent);
  background: color-mix(in srgb, var(--accent) 13%, transparent); }
.plat-lista li strong { display: block; font-size: 1rem; }
.plat-lista li span { color: var(--dim); font-size: .88rem; line-height: 1.6; }
.plat-fim { border-top: 1px solid var(--line); margin-top: 44px; padding-top: 10px; }



/* A lupa: o print em tamanho de gente, com a explicação embaixo e seta para a próxima.
   O fundo é escuro em qualquer tema — a foto é o assunto, e um véu claro devolveria o olho
   para a página que ficou atrás. */
.plat-print[data-lupa] { border: 0; padding: 0; width: 100%; cursor: zoom-in;
  position: relative; }
.plat-print[data-lupa]::after { content: "ampliar"; position: absolute; right: 10px;
  bottom: 10px; font-size: .7rem; letter-spacing: .04em; text-transform: uppercase;
  padding: 4px 9px; border-radius: 999px; background: rgba(15, 17, 26, .72); color: #fff;
  opacity: 0; transition: opacity .14s ease; }
.plat-print[data-lupa]:hover::after,
.plat-print[data-lupa]:focus-visible::after { opacity: 1; }
.lupa { border: 0; padding: 0; background: transparent; max-width: 100vw; max-height: 100vh;
  width: 100%; height: 100%; overflow: hidden; }
.lupa::backdrop { background: rgba(8, 10, 16, .88); }
.lupa[open] { display: grid; grid-template-columns: 64px 1fr 64px; align-items: center; }
.lupa-palco { grid-column: 2; margin: 0; display: flex; flex-direction: column; gap: 14px;
  align-items: center; justify-content: center; max-height: 100vh; padding: 22px 0; }
.lupa-palco img { max-width: 100%; max-height: 74vh; border-radius: 12px;
  box-shadow: 0 24px 60px rgba(0, 0, 0, .5); background: #fff; }
.lupa-palco figcaption { color: #fff; text-align: center; max-width: 68ch; }
.lupa-palco figcaption strong { display: block; font-family: var(--font-head);
  font-size: 1.15rem; }
.lupa-palco figcaption span { display: block; color: rgba(255, 255, 255, .74);
  font-size: .92rem; line-height: 1.55; margin-top: 4px; }
.lupa-palco figcaption em { display: block; font-style: normal; margin-top: 8px;
  font-size: .76rem; letter-spacing: .08em; text-transform: uppercase;
  color: rgba(255, 255, 255, .5); }
.lupa-anda, .lupa-fecha { background: rgba(255, 255, 255, .1); color: #fff; border: 0;
  cursor: pointer; border-radius: 999px; display: grid; place-items: center;
  transition: background .12s ease; }
.lupa-anda { width: 46px; height: 46px; font-size: 1.9rem; line-height: 1; justify-self: center; }
.lupa-antes { grid-column: 1; }
.lupa-depois { grid-column: 3; }
.lupa-anda:hover, .lupa-fecha:hover { background: rgba(255, 255, 255, .22); }
.lupa-fecha { position: fixed; top: 16px; right: 18px; width: 40px; height: 40px;
  font-size: 1.5rem; }
.lupa.so-uma .lupa-anda { visibility: hidden; }
@media (max-width: 700px) {
  .lupa[open] { grid-template-columns: 1fr; grid-template-rows: 1fr auto; }
  .lupa-palco { grid-column: 1; }
  .lupa-anda { position: fixed; bottom: 18px; }
  .lupa-antes { left: 22px; }
  .lupa-depois { right: 22px; }
}

/* A capa do pacote é desenhada em 1200×630 e tem texto quase até a borda. Na grade ela caía
   num quadro 16/9 e na ficha num 4/3, e o `object-fit: cover` cortava justamente as pontas
   onde o nome termina — a arte chegava picada. Aqui os dois quadros passam a ter a
   proporção da capa; na ficha o encaixe é `contain`, para uma capa enviada de fora, com
   outra proporção, sobrar em vez de ser cortada. */

/* O azulejo do pacote na coluna do portal: a cor da capa dele e a inicial. A capa deitada,
   com o nome escrito dentro, não sobrevive a um quadrado de 56px — vira pedaço de letra. */
.item-capa.azulejo { display: grid; place-items: center; color: #fff; font-weight: 700;
  font-family: var(--font-head); font-size: 1.3rem;
  background: linear-gradient(140deg, var(--tom), color-mix(in srgb, var(--tom) 55%, #000)); }

/* A prévia do ícone do pacote é quadrada — a mesma caixa da capa, sem o corte deitado. */
.capa-previa.quadrada { width: 84px; height: 84px; }
.capa-previa.quadrada img { width: 100%; height: 100%; object-fit: cover; border-radius: 10px; }


/* Em quatro colunas a foto cede espaço ao texto: com 96px de selo sobravam poucos
   caracteres por linha ao lado dela. */
.tres.quatro .item-capa { width: 72px; margin-right: 13px; }

/* Os outros cursos, no pé da ficha do curso. Ele mora dentro do mesmo cartão da ficha, com
   um filete separando: são duas coisas do mesmo lado — o que este curso é, e quais são os
   outros — e dois cartões empilhados dariam duas molduras para a mesma coluna. */
/* Os fatos do curso — aulas, carga, nível, certificado, quem dá — numa tira embaixo do
   resumo. Eram uma lista na coluna do lado, e ali competiam com a lista de cursos; aqui
   estão onde a pessoa decide, junto do preço. */
.curso-fatos { display: flex; flex-wrap: wrap; gap: 10px 28px; margin: 18px 0 0;
  padding: 16px 0 0; border-top: 1px solid var(--line); }
.curso-fatos > div { display: flex; flex-direction: column; gap: 2px; }
.curso-fatos dt { font-size: .68rem; letter-spacing: .1em; text-transform: uppercase;
  color: var(--dim); font-weight: 700; }
.curso-fatos dd { margin: 0; font-size: .98rem; font-weight: 600; }
.curso-lado-lista.sozinha { margin-top: 0; padding-top: 0; border-top: 0; }
.curso-lado-lista { margin-top: 20px; padding-top: 18px; border-top: 1px solid var(--line); }
.curso-lado-lista .col-tit { margin-top: 0; }
.curso-lado-lista .item { padding: 14px 0; }
.curso-lado-lista .item-capa { width: 62px; margin-right: 12px; }
.curso-lado-lista .item:last-of-type { border-bottom: none; }

/* Os botões da ficha da loja levam ícone dentro: sem `inline-flex` o SVG vira bloco e o
   rótulo desce para baixo dele — foi o que quebrou o "Como chegar" e o "WhatsApp". */
.loja-bts .btn, .loja-bts .btn2 { display: inline-flex; align-items: center; gap: 9px;
  min-height: 46px; padding: 0 18px; }
.loja-bts .btn svg, .loja-bts .btn2 svg { width: 18px; height: 18px; flex: none; }
