/* ==========================================================================
   Jorge Maia — rebrand "jorge_maia" (terminal)
   Estética derivada do logo: janela de terminal charcoal quente, wordmark
   mono-slab cream, traffic lights, carimbo âmbar tracejado, humor de CLI.
   Dark = estúdio/terminal · Light = editorial em papel cream.
   ========================================================================== */

:root {
  --term: #2b2a27;        /* fundo da janela (logo) */
  --term-deep: #201f1d;   /* fundo de página escuro / header */
  --term-pane: #343330;   /* painel elevado */
  --cream: #f2efe4;       /* wordmark (logo) */
  --out-gray: #a6a39a;    /* output de terminal (logo) */
  --red: #ef5b51;         /* traffic light */
  --amber: #f6b03d;       /* traffic light + carimbo v.31+ */
  --green: #43c24f;       /* traffic light */
  --paper: #faf7ef;       /* seções editoriais */
  --paper-2: #f2eee2;
  --text-dark: #26251f;
  --text-muted: #5c5a52;
  --amber-ink: #8a6100;   /* âmbar legível sobre paper (5.3:1) */
  --red-ink: #b3261e;     /* vermelho legível sobre paper (6.1:1) */

  --font-mono: "Space Mono", "Consolas", monospace;
  --font-body: "Hanken Grotesk", "Segoe UI", sans-serif;

  --max-w: 1160px;

  /* A coluna do artigo. Cabecalho, capa, ficha tecnica e galeria ficam nesta
     largura -- antes a capa vinha em .container (1160px), o texto em 46em
     (~780px) e a ficha tecnica em largura nenhuma, indo de ponta a ponta da
     viewport. Eram tres larguras empilhadas na mesma pagina.

     O `94vw` e o que faz a pagina ocupar a mesma fatia de tela que ocupava a
     1160px sob zoom de 150% -- que era a proporcao pedida. O teto de 1400px
     existe para monitor ultrawide, onde 94vw passaria de 2000px. */
  --max-w-artigo: min(1400px, 94vw);
  /* A prosa para aqui. Alinha com a coluna ate onde a linha continua legivel;
     imagem, galeria, <pre> e ficha usam a coluna inteira. */
  --max-w-prosa: 54em;
  --gutter: clamp(1.25rem, 4vw, 3rem);
  --radius: 12px;
  --header-h: 64px;
}

* { box-sizing: border-box; }

html { scroll-behavior: smooth; }

body {
  margin: 0;
  font-family: var(--font-body);
  font-size: 1.0625rem;
  line-height: 1.65;
  color: var(--text-dark);
  background: var(--paper);
  -webkit-font-smoothing: antialiased;
}

img { max-width: 100%; display: block; }

a { color: var(--red-ink); text-decoration: none; }
a:hover { text-decoration: underline; }

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

/* elementos focáveis não podem parar embaixo do header sticky */
a, button, input, summary, .section, .now, main, .site-footer { scroll-margin-top: calc(var(--header-h) + 1rem); }

.container {
  max-width: var(--max-w);
  margin-inline: auto;
  padding-inline: var(--gutter);
}

.skip-link { position: absolute; left: -9999px; }
.skip-link:focus {
  position: fixed;
  left: 1rem;
  top: 1rem;
  z-index: 100;
  background: var(--paper);
  color: var(--text-dark);
  padding: 0.75rem 1rem;
  border-radius: var(--radius);
  font-family: var(--font-mono);
}

/* --- Traffic lights ------------------------------------------------------- */
.tl { display: inline-flex; gap: 7px; }
.tl i { width: 12px; height: 12px; border-radius: 50%; }
.tl .r { background: var(--red); }
.tl .a { background: var(--amber); }
.tl .g { background: var(--green); }

/* --- Eyebrow: comando de terminal ------------------------------------------ */
.topic {
  font-family: var(--font-mono);
  font-size: 0.8125rem;
  letter-spacing: 0.02em;
  color: var(--topic-color, var(--amber-ink));
  margin: 0 0 1rem;
}
.topic::before { content: "$ "; color: var(--topic-prefix, var(--text-muted)); }
.hero, .now, .on-ink, .post-header, .site-footer {
  --topic-color: var(--amber);
  --topic-prefix: var(--out-gray);
}

/* --- Header ------------------------------------------------------------------ */
.site-header {
  position: sticky;
  top: 0;
  z-index: 50;
  background: color-mix(in srgb, var(--term-deep) 94%, transparent);
  backdrop-filter: blur(10px);
  border-bottom: 1px solid #ffffff14;
}
.site-header .container {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 1rem;
  min-height: var(--header-h);
}
.brand {
  font-family: var(--font-mono);
  font-weight: 700;
  font-size: 1.05rem;
  color: var(--cream);
  display: inline-flex;
  align-items: center;
  gap: 0.7em;
}
.brand:hover { text-decoration: none; }
.brand .cursor { margin-left: 0.05em; }
.site-nav {
  display: flex;
  align-items: center;
  gap: clamp(0.75rem, 2vw, 1.6rem);
  /* nenhum rotulo quebra em duas linhas: a barra tem altura fixa e um item em
     duas linhas empurra os vizinhos e desalinha o botao */
  white-space: nowrap;
}

/* O card do logo NAO empurra a nav.
   
   Ele e `position: fixed` -- flutua sobre a barra, fora do fluxo, e por
   definicao nao ocupa espaco. Uma versao anterior reservava a largura dele com
   padding-left no container do header, e o efeito era o oposto do desejado: a
   nav era empurrada para a direita e "sobre" saia do lugar.
   
   O que evita a sobreposicao agora e a barra ter cinco rotulos curtos em vez de
   treze. Com o container em 1160px, a nav ocupa cerca de 500px a direita e
   comeca por volta dos 660px; o card vai ate 950 * 0.48 = 456px mais o gutter.
   Sobra folga. Nos breakpoints o --logo-scale cai junto (0.38 e 0.3), e abaixo
   de 900px a nav vira <details> -- nao ha o que sobrepor.
   
   Se um item novo entrar na barra, e a conta acima deixar de fechar, a saida e
   encurtar rotulo ou marcar `topbar: false` no _data/nav.yml. Nao voltar a
   empurrar o header. */
.site-nav a {
  color: var(--out-gray);
  font-size: 0.95rem;
  font-family: var(--font-mono);
}
.site-nav a:hover { color: var(--cream); text-decoration: none; }
.site-nav a.nav-cta {
  background: var(--amber);
  color: var(--term-deep);
  font-weight: 700;
  padding: 0.5rem 1rem;
  border-radius: 8px;
}
.site-nav a.nav-cta:hover { background: #ffc45e; }

/* --- Grupo de nav: submenu que abre no hover e no foco ---------------------------
   O nav.yml tem sete itens de topo, tres deles com filhos. Achatar tudo colocava
   treze links na barra -- apertado, e o card do hero passava por cima.

   Sem JS de proposito, no mesmo espirito do menu mobile em <details>: abre no
   :hover e no :focus-within, entao teclado e leitor de tela chegam la. O grupo
   inteiro e um <div> com um <button> de rotulo; o button existe para ser
   focavel e anunciar aria-expanded, nao para receber clique -- quem abre e o
   CSS. Em telas de toque, sem hover, o :focus-within do tap resolve.        */
.nav-group { position: relative; display: inline-flex; }
.nav-group > button {
  appearance: none;
  background: none;
  border: 0;
  padding: 0;
  cursor: default;
  font: inherit;
  font-family: var(--font-mono);
  font-size: 0.95rem;
  color: var(--out-gray);
  display: inline-flex;
  align-items: center;
  gap: 0.35em;
}
.nav-group > button::after {
  content: "";
  width: 0.42em;
  height: 0.42em;
  border-right: 1.5px solid currentColor;
  border-bottom: 1.5px solid currentColor;
  transform: translateY(-0.15em) rotate(45deg);
  transition: transform 0.18s ease;
}
.nav-group:hover > button,
.nav-group:focus-within > button { color: var(--cream); }
.nav-group:hover > button::after,
.nav-group:focus-within > button::after { transform: translateY(0.05em) rotate(225deg); }

.nav-group .submenu {
  position: absolute;
  left: 50%;
  top: calc(100% + 0.55rem);
  translate: -50% 0;
  min-width: 15rem;
  display: grid;
  gap: 0.15rem;
  background: var(--term-pane);
  border: 1px solid #ffffff1f;
  border-radius: var(--radius);
  padding: 0.6rem;
  box-shadow: 0 18px 40px -18px #000000aa;
  opacity: 0;
  visibility: hidden;
  transform: translateY(-4px);
  transition: opacity 0.18s ease, transform 0.18s ease, visibility 0.18s;
  z-index: 60;
}
/* faixa invisivel que cobre o vao entre o rotulo e o painel, para o ponteiro
   nao "cair" no meio do caminho e fechar o menu */
.nav-group .submenu::before {
  content: "";
  position: absolute;
  inset: -0.6rem 0 100% 0;
}
.nav-group:hover .submenu,
.nav-group:focus-within .submenu {
  opacity: 1;
  visibility: visible;
  transform: translateY(0);
}
.nav-group .submenu a {
  color: var(--cream);
  padding: 0.5rem 0.7rem;
  border-radius: 8px;
  white-space: nowrap;
}
.nav-group .submenu a::before { content: "› "; color: var(--out-gray); }
.nav-group .submenu a:hover,
.nav-group .submenu a:focus-visible { background: #ffffff12; text-decoration: none; }
.nav-group .submenu a:hover::before { color: var(--amber); }

@media (prefers-reduced-motion: reduce) {
  .nav-group .submenu { transition: none; }
  .nav-group > button::after { transition: none; }
}

/* --- Menu mobile: os grupos viram secoes rotuladas ------------------------------- */
.nav-mobile .group-label {
  font-family: var(--font-mono);
  font-size: 0.75rem;
  color: var(--out-gray);
  padding: 0.6rem 0.75rem 0.15rem;
  letter-spacing: 0.04em;
}
.nav-mobile .group-label::before { content: "$ "; }
.nav-mobile nav a.sub { padding-left: 1.5rem; }
.nav-mobile nav a.sub::before { content: "› "; color: var(--out-gray); }

/* menu mobile sem JS */
.nav-mobile { display: none; position: relative; }
.nav-mobile summary {
  list-style: none;
  cursor: pointer;
  font-family: var(--font-mono);
  color: var(--cream);
  border: 1px dashed var(--out-gray);
  border-radius: 8px;
  padding: 0.45rem 0.9rem;
}
.nav-mobile summary::-webkit-details-marker { display: none; }
.nav-mobile summary::before { content: "> "; color: var(--amber); }
.nav-mobile[open] summary::before { content: "v "; }
.nav-mobile nav {
  position: absolute;
  right: 0;
  top: calc(100% + 0.6rem);
  min-width: 15rem;
  display: grid;
  gap: 0.25rem;
  background: var(--term-pane);
  border: 1px solid #ffffff1f;
  border-radius: var(--radius);
  padding: 0.75rem;
  box-shadow: 0 18px 40px -18px #000000aa;
}
.nav-mobile nav a {
  font-family: var(--font-mono);
  color: var(--cream);
  padding: 0.55rem 0.75rem;
  border-radius: 8px;
}
.nav-mobile nav a:hover { background: #ffffff12; text-decoration: none; }
.nav-mobile nav a.nav-cta { background: var(--amber); color: var(--term-deep); font-weight: 700; text-align: center; margin-top: 0.35rem; }

/* --- Botões --------------------------------------------------------------------- */
.btn {
  display: inline-block;
  font-family: var(--font-mono);
  font-weight: 700;
  font-size: 1rem;
  padding: 0.85rem 1.5rem;
  border-radius: 10px;
  border: 2px solid transparent;
}
.btn:hover { text-decoration: none; }
.btn-amber { background: var(--amber); color: var(--term-deep); }
.btn-amber:hover { background: #ffc45e; }
/* `btn-primary` e do Porto, que nao e mais carregado -- mas 79 posts escrevem
   `{: class="btn btn-primary"}` no markdown, e mudar isso seria editar 79
   arquivos de conteudo. Mais barato apontar a classe morta para o botao ambar,
   que e o equivalente no design novo. */
.btn-primary { background: var(--amber); color: var(--term-deep); }
.btn-primary:hover { background: #ffc45e; }
/* O ghost herda a cor do contexto: escuro sobre papel, cream sobre charcoal.
   Antes era sempre cream, e sobre as secoes claras -- "Artigos das atividades",
   "Artigos de opiniao" -- ficava quase invisivel ao lado do botao ambar. */
.btn-ghost {
  border: 2px dashed var(--ghost-borda, #26251f4d);
  color: var(--ghost-cor, var(--text-dark));
}
.btn-ghost:hover {
  border-color: var(--ghost-cor, var(--text-dark));
  border-style: solid;
}
.hero, .on-ink, .site-footer, .tela-foco {
  --ghost-cor: var(--cream);
  --ghost-borda: #f2efe45c;
}

/* --- Morph: terminal flutuante vira a marca do header ---------------------------- */
/* Ativado via JS (html.morph) só quando a página tem .hero .term.
   No topo, a marca do header some — a identidade é o terminal flutuando.
   Ao scrollar, o terminal dissolve e a marca assume (html.scrolled). */
.morph .site-header .brand {
  opacity: 0;
  transform: translateY(8px);
  pointer-events: none;
  transition: opacity 260ms ease, transform 260ms ease;
}
.morph.scrolled .site-header .brand {
  opacity: 1;
  transform: none;
  pointer-events: auto;
}
/* O terminal é o LOGO: mini-card fixo pendurado sobre a topbar, no lugar
   exato da marca — largo o bastante para chegar perto do menu "sobre".
   Ao scrollar, faz crossfade para o nome em texto. */
/* A escala do card sai de uma conta, nao de gosto.
   
   O card e `position: fixed`, alinhado a esquerda do container, com 950px de
   largura base. A nav ocupa 608px a direita. A area util do container e
   1160 - 2*48 = 1064px.
   
   Com a escala em 0.48 o card media 950 * 0.48 = 456px, e 456 + 608 = 1064 --
   exatamente a largura util. Os dois encostavam, sem um pixel de folga, em
   QUALQUER viewport acima de 1160px (a folga nessa faixa e constante:
   456 - 950 * escala, independente da largura da tela).
   
   Em 0.42 o card mede 399px e sobram 57px entre ele e o primeiro item da nav.
   Abaixo de 1160px o container encolhe junto com a tela, entao a folga cai --
   dai a escala menor no breakpoint seguinte. */
:root { --logo-scale: 0.42; }
@media (max-width: 1200px) { :root { --logo-scale: 0.36; } }
@media (max-width: 1100px) { :root { --logo-scale: 0.34; } }
@media (max-width: 640px)  { :root { --logo-scale: 0.28; } }
@media (max-width: 480px)  { :root { --logo-scale: 0.24; } }
/* medido: em 375px o card de 228px encostava no botao de menu (folga -1px).
   Em telefone pequeno o card cede -- ele e decorativo ali, e o menu nao. */
@media (max-width: 430px)  { :root { --logo-scale: 0.19; } }
.morph .hero { padding-top: clamp(9rem, 17vw, 14.5rem); }
.morph .hero .term {
  position: fixed;
  top: 8px;
  left: max(var(--gutter), calc((100vw - var(--max-w)) / 2 + var(--gutter)));
  width: 950px;
  max-width: calc((100vw - 2 * var(--gutter)) / var(--logo-scale));
  transform-origin: top left;
  transform: scale(var(--logo-scale));
  margin: 0;
  z-index: 60; /* acima do header sticky */
}
.morph .hero .term h1 { font-size: 5.5rem; white-space: nowrap; }
.morph.scrolled .hero .term { pointer-events: none; }
.morph.at-top .hero .term { animation: levitate 6s ease-in-out infinite; }

@keyframes levitate {
  0%, 100% { transform: scale(var(--logo-scale)) translateY(0); }
  50% { transform: scale(var(--logo-scale)) translateY(-8px); }
}

/* --- Cursor de bloco ------------------------------------------------------------- */
/* Barra de cursor, nao bloco. 0.58em de largura com 1.18em de altura dava um
   retangulo quase quadrado, que lia como caixa e nao como cursor piscando --
   e ao lado de um `jorge_maia` de 6,5rem virava um tijolo. Esta regra vale
   para os tres lugares com cursor: hero, topbar e a tela de inscricao. */
.cursor {
  display: inline-block;
  width: 0.16em;
  height: 0.92em;
  background: var(--out-gray);
  vertical-align: -0.16em;
  animation: blink 1.1s steps(1) infinite;
}

/* --- Hero: a janela de terminal (o logo, vivo) ------------------------------------- */
.hero {
  background: var(--term-deep);
  color: var(--cream);
  padding: clamp(3rem, 7vw, 5.5rem) 0 clamp(3rem, 7vw, 5rem);
}
.term {
  position: relative;
  background: var(--term);
  border: 1px solid #ffffff14;
  border-radius: 18px;
  box-shadow: 0 30px 70px -30px #000000cc;
  padding: clamp(1.5rem, 4vw, 3rem);
  margin-bottom: clamp(2rem, 4vw, 3rem);
}
.term-bar { display: flex; align-items: center; margin-bottom: clamp(1.5rem, 4vw, 2.5rem); }
.stamp {
  position: absolute;
  top: clamp(1rem, 3vw, 2rem);
  right: clamp(1rem, 4vw, 2.5rem);
  transform: rotate(7deg);
  font-family: var(--font-mono);
  font-weight: 700;
  font-size: clamp(1.6rem, 3.2vw, 2.1rem);
  color: var(--term-deep);
  background: var(--amber);
  border-radius: 8px;
  padding: 0.45em 0.8em;
}
.stamp i {
  position: absolute;
  inset: 4px;
  border: 2px dashed var(--term-deep);
  border-radius: 5px;
}
/* O corpo do terminal esta no DOBRO exato do tamanho original. Era
   `clamp(0.9rem, 1.8vw, 1.15rem)` -- 14,4px no piso, abaixo do minimo
   confortavel para mono em fundo escuro, e o teto de 1,15rem nem chegava perto
   de acompanhar o `jorge_maia` de ate 6,5rem ao lado. O Jorge nao conseguia ler
   na tela dele.

   Os tres componentes do clamp foram dobrados, e nao so o teto: assim a razao
   de 2x vale em QUALQUER largura de viewport, nao apenas nas grandes.

   RESSALVA conhecida, medida e aceita: no celular isso passa do que cabe. A
   caixa do terminal em 390px tem 302px uteis, e `> hibernation: never` sao 20
   caracteres de Space Mono, cujo avanco e 0,6em -- a 28,8px a linha pede 345px
   e quebra em duas. O limite sem quebrar seria ~1,57rem. Ficou em 1,8rem
   porque o tamanho em tela grande e o que importa aqui; se a quebra no celular
   incomodar, o piso desce para 1.55rem e so a ponta pequena muda. */
.term-line {
  font-family: var(--font-mono);
  font-size: clamp(1.8rem, 3.6vw, 2.3rem);
  color: var(--out-gray);
  margin: 0 0 0.5rem;
}
.term h1 {
  font-family: var(--font-mono);
  font-weight: 700;
  font-size: clamp(2.2rem, 9.5vw, 6.5rem);
  line-height: 1.05;
  letter-spacing: -0.02em;
  color: var(--cream);
  margin: 0.5rem 0 1.25rem;
  overflow-wrap: anywhere;
}
/* No hero a fonte e enorme, entao a barra precisa ser proporcionalmente ainda
   mais fina para nao virar bloco. O respiro antes dela tambem cresce: colada
   na letra, uma barra fina some. */
.term h1 .cursor { width: 0.1em; height: 0.78em; vertical-align: -0.04em; margin-left: 0.14em; }
.term .out { list-style: none; margin: 0.5rem 0 0; padding: 0; }
/* Mesma escala da `.term-line` de proposito: comando e saida sao a mesma
   conversa, e tamanhos diferentes fariam a saida parecer nota de rodape.
   Dobro exato do original, pelo mesmo motivo descrito la. */
.term .out li {
  font-family: var(--font-mono);
  font-size: clamp(1.8rem, 3.6vw, 2.3rem);
  color: var(--out-gray);
  margin-bottom: 0.45rem;
}
.term .out li::before { content: "> "; color: var(--green); }

/* digitação: escondido só quando há JS; reduced-motion mostra tudo */
.js .type { visibility: hidden; }
.js .type.typed { visibility: visible; }

.hero .lede {
  max-width: 36em;
  font-size: clamp(1.0625rem, 1.6vw, 1.25rem);
  color: var(--out-gray);
  margin: 0 0 2rem;
}
.hero .lede strong { color: var(--cream); font-weight: 600; }
.hero-actions { display: flex; flex-wrap: wrap; gap: 0.85rem; margin-bottom: 2.5rem; }
.telemetry {
  display: flex;
  flex-wrap: wrap;
  gap: 0.5rem 1.75rem;
  font-family: var(--font-mono);
  font-size: 0.8125rem;
  color: var(--out-gray);
}
.telemetry span b { color: var(--cream); font-weight: 700; }

/* --- Seções ------------------------------------------------------------------------ */
.section { padding: clamp(3.5rem, 8vw, 6.5rem) 0; }
.section-head { margin-bottom: clamp(2rem, 4vw, 3.25rem); }
.section h2 {
  font-family: var(--font-mono);
  font-weight: 700;
  font-size: clamp(1.8rem, 4.2vw, 2.8rem);
  line-height: 1.08;
  letter-spacing: -0.01em;
  margin: 0;
}
.on-ink { background: var(--term-deep); color: var(--cream); }

/* --- Hero executivo: pitch + foto em janela ------------------------------------------ */
.hero-grid {
  display: grid;
  grid-template-columns: 1.1fr 1fr;
  gap: clamp(2rem, 5vw, 4rem);
  align-items: center;
}
.hero h2.pitch {
  font-family: var(--font-mono);
  font-weight: 700;
  font-size: clamp(1.9rem, 4.5vw, 3.1rem);
  line-height: 1.12;
  letter-spacing: -0.015em;
  margin: 0 0 1.25rem;
  color: var(--cream);
}
.hero h2.pitch em { font-style: normal; color: var(--amber); }
.photo-frame {
  background: var(--term);
  border: 1px solid #ffffff14;
  border-radius: 14px;
  box-shadow: 0 30px 70px -30px #000000cc;
  overflow: hidden;
}
.photo-frame .bar { display: flex; align-items: center; gap: 0.6rem; padding: 0.65rem 0.9rem; }
.photo-frame .bar .cap { font-family: var(--font-mono); font-size: 0.72rem; color: var(--out-gray); }
.photo-frame img {
  width: 100%;
  aspect-ratio: 4 / 3;
  object-fit: cover;
  filter: saturate(0.88) contrast(1.05);
}

/* --- Frentes de atuação ----------------------------------------------------------------- */
.services { display: grid; grid-template-columns: repeat(4, 1fr); gap: 1.25rem; }
.service {
  background: #fffdf7;
  border: 1px solid #26251f1c;
  border-radius: var(--radius);
  padding: 1.5rem 1.4rem;
  display: flex;
  flex-direction: column;
  gap: 0.6rem;
}
.service .k { font-family: var(--font-mono); font-size: 0.78rem; font-weight: 700; color: var(--amber-ink); }
.service .k::before { content: "> "; color: var(--text-muted); }
.service h3 { margin: 0; font-size: 1.08rem; line-height: 1.35; color: var(--text-dark); }
.service p { margin: 0; color: var(--text-muted); font-size: 0.92rem; }

/* --- Palcos: grid de capas de eventos ------------------------------------------------------ */
.events { display: grid; grid-template-columns: repeat(4, 1fr); gap: 1.25rem; }
.event-card {
  position: relative;
  border-radius: var(--radius);
  overflow: hidden;
  border: 1px solid #26251f1c;
  color: #fff;
  background: var(--term);
  /* min-height em vez de aspect-ratio: o card tinha altura fixa e o texto de
     evento com nome e local longos transbordava por cima da imagem. Assim ele
     mantem a proporcao quando o conteudo cabe, e cresce quando nao cabe. */
  min-height: 13.5rem;
  display: flex;
  align-items: flex-end;
}
.event-card img {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
  filter: saturate(0.9);
}
.event-card .info {
  position: relative;
  width: 100%;
  padding: 2.5rem 1rem 0.9rem;
  background: linear-gradient(to top, #16150ff2, #16150f66 60%, transparent);
}
.event-card .info b {
  display: -webkit-box;
  -webkit-line-clamp: 2;
  -webkit-box-orient: vertical;
  overflow: hidden;
  font-size: 0.95rem;
  line-height: 1.3;
}
.event-card .info span {
  display: -webkit-box;
  -webkit-line-clamp: 2;
  -webkit-box-orient: vertical;
  overflow: hidden;
  font-family: var(--font-mono);
  font-size: 0.75rem;
  line-height: 1.45;
  color: #ffd9a0;
}

/* --- Comunidade (split foto + bullets) ------------------------------------------------------- */
.community-grid {
  display: grid;
  grid-template-columns: 1fr 1.1fr;
  gap: clamp(2rem, 5vw, 4rem);
  align-items: center;
}
.bullets { list-style: none; margin: 0; padding: 0; display: grid; gap: 1.35rem; }
.bullets b { display: block; font-family: var(--font-mono); font-size: 1rem; color: var(--cream); margin-bottom: 0.3rem; }
.bullets b::before { content: "> "; color: var(--amber); }
.bullets p { margin: 0; color: var(--text-on-ink-muted); font-size: 0.95rem; }

/* --- Projetos e empresas ------------------------------------------------------------------------ */
.brands { display: grid; grid-template-columns: repeat(3, 1fr); gap: 1.25rem; }
.brand-card {
  background: #fffdf7;
  border: 1px solid #26251f1c;
  border-radius: var(--radius);
  padding: 1.5rem 1.4rem;
  color: inherit;
  display: flex;
  flex-direction: column;
  gap: 0.5rem;
}
.brand-card:hover { text-decoration: none; box-shadow: 0 12px 28px -14px #26251f40; }
.brand-card b { font-family: var(--font-mono); font-weight: 700; font-size: 1.1rem; color: var(--text-dark); }
.brand-card b .tld { color: var(--red); }
.brand-card p { margin: 0; color: var(--text-muted); font-size: 0.92rem; }
.brand-card span { font-family: var(--font-mono); font-size: 0.78rem; color: var(--amber-ink); }

/* --- Painel "agora": três panes de terminal ------------------------------------------ */
.now { background: var(--term-deep); color: var(--cream); padding-bottom: clamp(3rem, 6vw, 5rem); }
.now-grid {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 1rem;
}
.now-card {
  background: var(--term);
  border: 1px solid #ffffff14;
  border-radius: var(--radius);
  padding: 1.4rem 1.4rem 1.5rem;
}
.now-card .k {
  font-family: var(--font-mono);
  font-size: 0.78rem;
  color: var(--green);
  display: block;
  margin-bottom: 0.75rem;
}
.now-card .k::before { content: "> "; color: var(--out-gray); }
.now-card .v { font-size: 1.08rem; font-weight: 600; line-height: 1.35; margin: 0 0 0.4rem; }
.now-card .v a { color: var(--cream); }
.now-card .meta { font-family: var(--font-mono); font-size: 0.8rem; color: var(--amber); margin: 0; }

/* --- Sobre ---------------------------------------------------------------------------- */
.about-grid {
  display: grid;
  grid-template-columns: 1.2fr 1fr;
  gap: clamp(2rem, 5vw, 4.5rem);
  align-items: start;
}
.about-copy p { margin: 0 0 1.15rem; color: var(--text-muted); }
.about-copy p:first-of-type {
  font-size: clamp(1.15rem, 2vw, 1.4rem);
  line-height: 1.5;
  color: var(--text-dark);
  font-weight: 500;
}
.stats {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 1px;
  background: #26251f1f;
  border: 1px solid #26251f1f;
  border-radius: var(--radius);
  overflow: hidden;
}
.stat { background: var(--paper); padding: 1.4rem 1.3rem; }
.stat b {
  display: block;
  font-family: var(--font-mono);
  font-weight: 700;
  font-size: clamp(1.6rem, 3vw, 2.2rem);
  line-height: 1;
  margin-bottom: 0.4rem;
}
.stat b .unit { color: var(--red-ink); }
.stat span { font-size: 0.9rem; color: var(--text-muted); }

/* --- JorgeCast --------------------------------------------------------------------------- */
.episodes { display: grid; gap: 0; border-top: 1px solid #ffffff1a; }
.episode {
  display: grid;
  grid-template-columns: auto 1fr auto;
  align-items: baseline;
  gap: 1.25rem;
  padding: 1.15rem 0.25rem;
  border-bottom: 1px solid #ffffff1a;
  color: inherit;
}
.episode:hover { background: #ffffff0a; text-decoration: none; }
.episode .ep { font-family: var(--font-mono); font-size: 0.85rem; font-weight: 700; color: var(--amber); }
.episode .title { font-weight: 600; font-size: 1.05rem; color: var(--cream); }
.episode .date { font-family: var(--font-mono); font-size: 0.8125rem; color: var(--out-gray); }
.podcast-foot { margin-top: 2rem; display: flex; flex-wrap: wrap; gap: 0.85rem; }

/* --- Agenda --------------------------------------------------------------------------------- */
.agenda { border-top: 1px solid #26251f1f; }
.agenda-row {
  display: grid;
  grid-template-columns: 8.5rem 1fr auto auto;
  gap: 1.25rem;
  align-items: baseline;
  padding: 1.15rem 0.25rem;
  border-bottom: 1px solid #26251f1f;
}
.agenda-row .date { font-family: var(--font-mono); font-size: 0.875rem; color: var(--text-dark); font-weight: 700; }
.agenda-row .event { font-weight: 600; }
.agenda-row .place { color: var(--text-muted); font-size: 0.95rem; }

/* carimbo tracejado, como o v.31+ do logo */
.tag {
  font-family: var(--font-mono);
  font-size: 0.72rem;
  font-weight: 700;
  letter-spacing: 0.04em;
  text-transform: uppercase;
  padding: 0.3rem 0.65rem;
  border-radius: 6px;
  border: 1.5px dashed currentColor;
  transform: rotate(-2deg);
  display: inline-block;
}
.tag-palestra { color: var(--red-ink); }
.tag-painel { color: var(--amber-ink); }
.tag-imersao { color: #4a5ab3; }

/* --- Artigos ----------------------------------------------------------------------------------- */
.cards { display: grid; grid-template-columns: repeat(3, 1fr); gap: 1.5rem; }
.card {
  background: #fffdf7;
  border: 1px solid #26251f1c;
  border-radius: var(--radius);
  padding: 1.6rem 1.5rem 1.5rem;
  display: flex;
  flex-direction: column;
  gap: 0.7rem;
  color: inherit;
  transition: transform 160ms ease, box-shadow 160ms ease;
}
.card:hover {
  text-decoration: none;
  transform: translateY(-3px);
  box-shadow: 0 12px 28px -14px #26251f40;
}
.card .k { font-family: var(--font-mono); font-size: 0.75rem; color: var(--text-muted); }
.card h3 { margin: 0; font-size: 1.15rem; line-height: 1.4; color: var(--text-dark); }
.card p { margin: 0; color: var(--text-muted); font-size: 0.95rem; }
.card .more { margin-top: auto; font-family: var(--font-mono); font-weight: 700; font-size: 0.85rem; color: var(--red-ink); }

/* --- Footer ---------------------------------------------------------------------------------------- */
.site-footer { background: var(--term-deep); color: var(--out-gray); padding: clamp(3rem, 7vw, 5rem) 0 2rem; }
.footer-grid {
  display: grid;
  grid-template-columns: 1.4fr 1fr 1fr;
  gap: clamp(2rem, 5vw, 4rem);
  margin-bottom: 3rem;
}
.site-footer h3 {
  font-family: var(--font-mono);
  font-weight: 700;
  font-size: 1.1rem;
  color: var(--cream);
  margin: 0 0 1rem;
}
/* O formulario passou a ter, alem dos campos, as duas areas de resposta. Por
   isso ele vira coluna e quem faz a linha input+botao e o wrapper de campos. */
.newsletter-form { display: grid; gap: 0.6rem; margin-top: 1.1rem; }
/* input+botao numa linha, consentimento embaixo ocupando a largura toda. */
.newsletter-form .forms-campos { display: flex; flex-wrap: wrap; gap: 0.6rem; }
.newsletter-form .newsletter-consent { flex-basis: 100%; }
.newsletter-consent {
  display: grid;
  grid-template-columns: auto 1fr;
  gap: 0.5rem;
  align-items: start;
  color: var(--out-gray);
  font-size: 0.82rem;
  line-height: 1.4;
  cursor: pointer;
}
.newsletter-consent input { margin-top: 0.15rem; accent-color: var(--amber); }
.newsletter-form input {
  flex: 1;
  min-width: 0;
  background: var(--term);
  border: 1px solid #ffffff2b;
  border-radius: 10px;
  color: var(--cream);
  padding: 0.8rem 1rem;
  font-family: var(--font-mono);
  font-size: 0.9rem;
}
.newsletter-form input::placeholder { color: var(--out-gray); }
.footer-links { list-style: none; margin: 0; padding: 0; display: grid; gap: 0.55rem; }
.footer-links a { color: var(--out-gray); }
.footer-links a:hover { color: var(--cream); }
.footer-bottom {
  border-top: 1px solid #ffffff14;
  padding-top: 1.5rem;
  display: flex;
  flex-wrap: wrap;
  justify-content: space-between;
  gap: 1rem;
  font-family: var(--font-mono);
  font-size: 0.78rem;
}
.status-ok { color: var(--green); font-weight: 700; }

/* --- Post ---------------------------------------------------------------------------------------------- */
.post-header { background: var(--term-deep); color: var(--cream); padding: clamp(3.5rem, 8vw, 6rem) 0; }
.post-header h1 {
  font-family: var(--font-mono);
  font-weight: 700;
  font-size: clamp(1.8rem, 4.5vw, 3rem);
  line-height: 1.15;
  margin: 0;
  max-width: 22em;
}
.post-header .meta { font-family: var(--font-mono); font-size: 0.85rem; color: var(--out-gray); margin-top: 1.25rem; }
.artigo-largura {
  max-width: var(--max-w-artigo);
  margin-inline: auto;
  padding-inline: var(--gutter);
}
.post-body { padding-block: clamp(2.5rem, 6vw, 4rem); }
/* A prosa e o que a medida de leitura limita. Fica de fora o que ganha com a
   largura toda: imagem, figura, tabela, <pre>, galeria e os blocos do rodape
   do post. */
.post-body > p,
.post-body > ul,
.post-body > ol,
.post-body > h2,
.post-body > h3,
.post-body > h4,
.post-body > blockquote,
.post-body > dl { max-width: var(--max-w-prosa); }
.post-body > figure,
.post-body > table,
.post-body > pre,
.post-body > p:has(> img:only-child) { max-width: none; }
.post-body pre {
  background: var(--term);
  color: var(--cream);
  border: 1px solid #ffffff14;
  border-radius: var(--radius);
  padding: 1.25rem;
  overflow-x: auto;
  font-family: var(--font-mono);
  font-size: 0.875rem;
}
.post-body code { font-family: var(--font-mono); font-size: 0.9em; }
.post-body blockquote {
  margin: 1.5rem 0;
  padding: 0.25rem 0 0.25rem 1.25rem;
  border-left: 3px dashed var(--amber);
  color: var(--text-muted);
}

/* --- Reveal on scroll (gated em .js: sem JS, tudo visível) -------------------------------------------------- */
.js .reveal { opacity: 0; transform: translateY(22px); transition: opacity 640ms ease, transform 640ms ease; }
.js .reveal.is-visible { opacity: 1; transform: none; }

/* --- Animações ------------------------------------------------------------------------------------------------ */
@keyframes blink { 0%, 49% { opacity: 1; } 50%, 100% { opacity: 0; } }

@media (prefers-reduced-motion: reduce) {
  html { scroll-behavior: auto; }
  .cursor { animation: none; }
  .js .type { visibility: visible; }
  .js .reveal { opacity: 1; transform: none; transition: none; }
  .card { transition: none; }
  .morph .hero .container { animation: none; }
  .morph .site-header .brand { transition: opacity 1ms linear; transform: none; }
}

/* --- Responsivo -------------------------------------------------------------------------------------------------- */
@media (max-width: 1100px) {
  .services { grid-template-columns: 1fr 1fr; }
  .events { grid-template-columns: 1fr 1fr; }
}
@media (max-width: 900px) {
  .now-grid { grid-template-columns: 1fr; }
  .about-grid { grid-template-columns: 1fr; }
  .cards { grid-template-columns: 1fr; }
  .footer-grid { grid-template-columns: 1fr; }
  .agenda-row { grid-template-columns: 7rem 1fr; }
  .agenda-row .place { grid-column: 2; }
  .agenda-row .tag { grid-column: 2; justify-self: start; }
  .hero-grid { grid-template-columns: 1fr; }
  .community-grid { grid-template-columns: 1fr; }
  .brands { grid-template-columns: 1fr; }
}
@media (max-width: 640px) {
  .services { grid-template-columns: 1fr; }
  .events { grid-template-columns: 1fr; }
}
/* O menu compacto assume em 1024px, e nao mais em 640px.
   
   Entre 640 e 1100 a nav inteira (608px) ficava visivel num container que ja
   nao comportava ela e o card do logo ao mesmo tempo. Medido em iframe: em
   1025px sobravam 7px de folga, e em 1000px o card nao cabia.
   
   Nessa faixa o <details> resolve: ocupa cerca de 90px e abre por cima, sem
   competir por largura. O corte em 1100 (e nao em 1050, o limite exato) deixa
   margem para o rotulo mudar de tamanho -- um item novo na nav come essa folga
   rapido. */
@media (max-width: 1100px) {
  .site-nav { display: none; }
  .nav-mobile { display: block; }
}
@media (max-width: 640px) {
  .episode { grid-template-columns: auto 1fr; }
  .episode .date { grid-column: 2; }
  .newsletter-form { flex-direction: column; }
}

/* ==========================================================================
   Páginas internas — acrescentado ao aplicar o rebrand ao site real.

   O scaffold do rebrand tinha home e post. O site tem 414 posts, 8 listagens
   paginadas e as páginas de prêmios, imprensa, categorias e tags. Os blocos
   abaixo são o que faltava para essas telas, escritos com os mesmos tokens.
   ========================================================================== */

/* --- Trilha de navegação (era breadcrumb do Bootstrap) --------------------- */
.crumbs {
  font-family: var(--font-mono);
  font-size: 0.8125rem;
  color: var(--out-gray);
  margin-bottom: 1.25rem;
}
.crumbs a { color: var(--out-gray); }
.crumbs a:hover { color: var(--cream); text-decoration: none; }
.crumbs .sep { margin: 0 0.45em; opacity: 0.55; }
.crumbs [aria-current] { color: var(--cream); }

/* --- Corpo de página interna ---------------------------------------------- */
.page-body { padding: clamp(2.5rem, 6vw, 4rem) 0; }
.post-header .lede-ink {
  font-size: 1.1rem;
  color: var(--cream);
  opacity: 0.86;
  max-width: 42em;
  margin: 1rem 0 0;
}

/* --- Capa do post: reaproveita o quadro do hero --------------------------- */
/* A capa e um <figure>: o quadro com a foto, e a legenda embaixo dele -- a
   ordem que qualquer jornal usa. Antes a legenda era uma barra ACIMA da foto,
   com traffic lights e o nome do arquivo, e um `CAPA-FABCOM26.png` em cima do
   artigo lia como um titulo falso acima do titulo de verdade. */
.post-cover {
  margin: calc(-1 * clamp(1.5rem, 4vw, 3rem)) 0 0;
  position: relative;
  z-index: 2;
}

/* Capa e ficha encostadas viram um bloco so. Os dois fundos ja sao o mesmo
   charcoal (`--term`), entao o que falta e tirar a margem entre elas e retificar
   os cantos que se encontram -- senao sobra um estrangulamento onde as duas
   curvaturas se tocam. */
.capa-ficha.grudada .photo-frame { border-radius: 14px 14px 0 0; }
.capa-ficha.grudada .ficha {
  margin-top: 0;
  border-radius: 0 0 var(--radius) var(--radius);
}
/* 16:9 em vez do 4:3 do quadro do hero: numa coluna larga o 4:3 vira um bloco
   alto demais. */
.post-cover img { aspect-ratio: 16 / 9; }
.post-cover figcaption {
  margin-top: 0.75rem;
  font-family: var(--font-mono);
  font-size: 0.78rem;
  line-height: 1.5;
  color: var(--text-muted);
  max-width: var(--max-w-prosa);
}
.post-cover figcaption::before { content: "$ "; color: var(--amber-ink); }

/* --- Listagem em cards ---------------------------------------------------- */
.list-cards { grid-template-columns: repeat(auto-fill, minmax(19rem, 1fr)); }
.card-cover {
  display: block;
  margin: -1.35rem -1.35rem 1rem;
  border-radius: var(--radius) var(--radius) 0 0;
  overflow: hidden;
  aspect-ratio: 16 / 9;
  background: var(--paper-2);
}
.card-cover img { width: 100%; height: 100%; object-fit: cover; }
.on-ink .card-cover { background: var(--term-pane); }

.empty-state {
  font-family: var(--font-mono);
  color: var(--text-muted);
  padding: 3rem 0;
}

/* --- Paginação ------------------------------------------------------------ */
.pager { margin-top: 3rem; }
.pager ul {
  list-style: none;
  margin: 0;
  padding: 0;
  display: flex;
  flex-wrap: wrap;
  gap: 0.4rem;
  align-items: center;
  justify-content: center;
}
.pager a,
.pager span {
  font-family: var(--font-mono);
  font-size: 0.875rem;
  display: inline-flex;
  align-items: center;
  min-width: 2.4rem;
  height: 2.4rem;
  padding: 0 0.7rem;
  justify-content: center;
  border: 1px solid #00000018;
  border-radius: 8px;
  color: var(--text-muted);
  background: #ffffff8c;
}
.pager a:hover { border-color: var(--amber-ink); color: var(--text-dark); text-decoration: none; }
.pager .is-current {
  background: var(--amber);
  border-color: var(--amber);
  color: var(--term-deep);
  font-weight: 700;
}
.on-ink .pager a,
.on-ink .pager span { background: #ffffff0f; border-color: #ffffff1f; color: var(--out-gray); }
.on-ink .pager a:hover { color: var(--cream); border-color: var(--amber); }

/* --- Compartilhar, autor e comentários ------------------------------------ */
.share {
  margin: 3rem 0 0;
  padding-top: 1.5rem;
  border-top: 1px dashed #00000024;
}
.share h4,
.author-box h4 {
  font-family: var(--font-mono);
  font-size: 0.8125rem;
  color: var(--text-muted);
  margin: 0 0 0.75rem;
  font-weight: 400;
}
.share h4::before,
.author-box h4::before { content: "$ "; }
.share-list { display: flex; flex-wrap: wrap; gap: 0.5rem; list-style: none; margin: 0; padding: 0; }
.share-list a {
  font-family: var(--font-mono);
  font-size: 0.8125rem;
  padding: 0.45rem 0.85rem;
  border: 1px dashed var(--amber-ink);
  border-radius: 8px;
  color: var(--amber-ink);
}
.share-list a:hover { background: var(--amber); border-style: solid; border-color: var(--amber); color: var(--term-deep); text-decoration: none; }

.author-box {
  margin: 2.5rem 0 0;
  padding: 1.35rem;
  background: var(--paper-2);
  border: 1px solid #00000014;
  border-radius: var(--radius);
  display: grid;
  grid-template-columns: 4.5rem 1fr;
  gap: 1.15rem;
  align-items: start;
}
.author-box img { width: 4.5rem; height: 4.5rem; border-radius: 50%; object-fit: cover; }
.author-box b { font-family: var(--font-mono); display: block; margin-bottom: 0.35rem; }
.author-box p { margin: 0; font-size: 0.95rem; color: var(--text-muted); }

.comments-box { margin: 3rem 0 0; padding-top: 1.5rem; border-top: 1px dashed #00000024; }

@media (max-width: 640px) {
  .author-box { grid-template-columns: 1fr; }
  .author-box img { width: 3.5rem; height: 3.5rem; }
}

/* --- Linha do tempo da agenda ---------------------------------------------
   A página de agenda tinha 665 ocorrências de classes do tema Porto -- era a
   mais dependente do theme.css no site inteiro. Aqui os anos viram marcos e
   cada evento é uma faixa com capa à esquerda.                              */
.timeline { max-width: 62rem; margin-inline: auto; }

.year-marker {
  font-family: var(--font-mono);
  font-size: 0.9rem;
  color: var(--text-muted);
  margin: 3rem 0 1.5rem;
  display: flex;
  align-items: center;
  gap: 1rem;
}
.year-marker:first-child { margin-top: 0; }
.year-marker span {
  border: 1px dashed var(--amber-ink);
  color: var(--amber-ink);
  border-radius: 999px;
  padding: 0.2rem 0.9rem;
  white-space: nowrap;
}
.year-marker::after {
  content: "";
  flex: 1;
  height: 1px;
  background: repeating-linear-gradient(to right, #00000024 0 6px, transparent 6px 12px);
}

.tl-item {
  display: grid;
  grid-template-columns: 13rem 1fr;
  gap: 1.5rem;
  padding: 1.25rem 0;
  border-bottom: 1px solid #00000012;
  align-items: start;
}
.tl-item:last-child { border-bottom: 0; }

.tl-cover {
  border-radius: var(--radius);
  overflow: hidden;
  aspect-ratio: 16 / 10;
  background: var(--paper-2);
  border: 1px solid #00000014;
}
.tl-cover img { width: 100%; height: 100%; object-fit: cover; }
.tl-cover-empty {
  display: grid;
  place-items: center;
  font-family: var(--font-mono);
  color: var(--out-gray);
  background: var(--term);
  font-size: 1.5rem;
}

.tl-date {
  font-family: var(--font-mono);
  font-size: 0.8125rem;
  color: var(--text-muted);
  margin: 0 0 0.35rem;
  display: flex;
  align-items: center;
  gap: 0.6rem;
  flex-wrap: wrap;
}
.badge-next {
  font-size: 0.6875rem;
  text-transform: uppercase;
  letter-spacing: 0.06em;
  background: var(--amber);
  color: var(--term-deep);
  border-radius: 999px;
  padding: 0.1rem 0.6rem;
  font-weight: 700;
}
.tl-item h3 {
  font-family: var(--font-mono);
  font-size: 1.15rem;
  line-height: 1.3;
  margin: 0 0 0.4rem;
}
.tl-item h3 a { color: var(--text-dark); }
.tl-item h3 a:hover { color: var(--red-ink); }
.tl-desc { margin: 0 0 0.5rem; color: var(--text-muted); font-size: 0.95rem; }
.tl-meta {
  margin: 0;
  display: flex;
  flex-wrap: wrap;
  gap: 0.4rem;
  font-family: var(--font-mono);
  font-size: 0.75rem;
}
.tl-meta span {
  border: 1px dashed #00000030;
  border-radius: 6px;
  padding: 0.1rem 0.5rem;
  color: var(--text-muted);
}
.tl-item.is-next .tl-cover { border-color: var(--amber); }

@media (max-width: 700px) {
  .tl-item { grid-template-columns: 1fr; gap: 0.9rem; }
  .tl-cover { max-width: 18rem; }
}

/* --- Galeria e lightbox sem JavaScript ------------------------------------
   O magnific-popup e o masonry saíram com o tema. O grid é CSS, e o lightbox
   usa `:target` -- clicar navega para #foto-N e o CSS mostra a imagem cheia.
   Fechar é voltar para #_, o que o botão e o fundo fazem.                    */
.gallery {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(11rem, 1fr));
  gap: 0.75rem;
  margin: 2rem 0;
}
.gallery-row { grid-auto-flow: column; grid-auto-columns: minmax(14rem, 1fr); overflow-x: auto; }
.gallery-item { margin: 0; }
.gallery-thumb {
  display: block;
  position: relative;
  border-radius: var(--radius);
  overflow: hidden;
  aspect-ratio: 4 / 3;
  background: var(--paper-2);
  border: 1px solid #00000014;
}
.gallery-thumb img,
.gallery-thumb video { width: 100%; height: 100%; object-fit: cover; display: block; }
.gallery-thumb::after {
  content: "";
  position: absolute;
  inset: 0;
  background: linear-gradient(to top, #00000059, transparent 45%);
  opacity: 0;
  transition: opacity 0.2s ease;
}
.gallery-thumb:hover::after,
.gallery-thumb:focus-visible::after { opacity: 1; }
.gallery-item figcaption {
  font-family: var(--font-mono);
  font-size: 0.75rem;
  color: var(--text-muted);
  margin-top: 0.4rem;
}
.gallery-video .play {
  position: absolute;
  inset: 0;
  display: grid;
  place-items: center;
  color: #fff;
  font-size: 1.75rem;
  text-shadow: 0 2px 12px #000000b3;
  z-index: 1;
}

/* O lightbox nasce fechado e só aparece quando é o alvo da URL. */
.lightbox {
  position: fixed;
  inset: 0;
  z-index: 200;
  display: none;
  place-items: center;
  padding: clamp(1rem, 4vw, 3rem);
}
.lightbox:target { display: grid; }
.lightbox-bg {
  position: absolute;
  inset: 0;
  background: #12110fe8;
  backdrop-filter: blur(4px);
}
.lightbox figure {
  position: relative;
  margin: 0;
  max-width: min(96vw, 1200px);
  max-height: 88vh;
  display: grid;
  gap: 0.6rem;
}
.lightbox img,
.lightbox video {
  max-width: 100%;
  max-height: 82vh;
  width: auto;
  margin-inline: auto;
  border-radius: var(--radius);
  box-shadow: 0 30px 80px -30px #000;
}
.lightbox figcaption {
  font-family: var(--font-mono);
  font-size: 0.8125rem;
  color: var(--out-gray);
  text-align: center;
}
.lightbox-close {
  position: absolute;
  top: clamp(0.75rem, 3vw, 1.5rem);
  right: clamp(0.75rem, 3vw, 1.5rem);
  z-index: 2;
  width: 2.6rem;
  height: 2.6rem;
  display: grid;
  place-items: center;
  border-radius: 50%;
  background: #ffffff1a;
  border: 1px solid #ffffff2e;
  color: var(--cream);
  font-family: var(--font-mono);
  text-decoration: none;
}
.lightbox-close:hover { background: var(--amber); color: var(--term-deep); text-decoration: none; }

@media (prefers-reduced-motion: reduce) {
  .gallery-thumb::after { transition: none; }
}

/* --- Lista de categorias e tags ------------------------------------------- */
.cat-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(15rem, 1fr)); gap: 0.5rem 2rem; }
.cat-list { list-style: none; margin: 0; padding: 0; }
.cat-list li { padding: 0.35rem 0; border-bottom: 1px dashed #00000014; }
.cat-list a { font-family: var(--font-mono); font-size: 0.9rem; color: var(--text-dark); }
.cat-list a::before { content: "› "; color: var(--amber-ink); }
.cat-list a:hover { color: var(--red-ink); text-decoration: none; }

/* --- Formulário (contato, inscrição) -------------------------------------- */
.form-row, .form-group { margin-bottom: 1rem; }
input[type="text"], input[type="email"], input[type="tel"], textarea, select {
  width: 100%;
  font-family: var(--font-body);
  font-size: 1rem;
  padding: 0.75rem 0.9rem;
  border: 1px solid #00000024;
  border-radius: 8px;
  background: #fff;
  color: var(--text-dark);
}
textarea { min-height: 9rem; resize: vertical; }
input:focus-visible, textarea:focus-visible, select:focus-visible { border-color: var(--amber); }
label { font-family: var(--font-mono); font-size: 0.8125rem; color: var(--text-muted); display: block; margin-bottom: 0.3rem; }

/* --- Contato --------------------------------------------------------------- */
.contact-grid {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: clamp(1.5rem, 4vw, 3rem);
  align-items: start;
}
.canais { list-style: none; margin: 0 0 2rem; padding: 0; display: grid; gap: 0.6rem; }
.canais li {
  display: grid;
  grid-template-columns: 11rem 1fr;
  gap: 0.75rem;
  align-items: baseline;
  padding: 0.7rem 0.9rem;
  background: var(--paper-2);
  border: 1px solid #00000012;
  border-radius: var(--radius);
}
.canais .k {
  font-family: var(--font-mono);
  font-size: 0.75rem;
  color: var(--text-muted);
}
.canais .k::before { content: "$ "; color: var(--amber-ink); }
.canais a { font-family: var(--font-mono); font-size: 0.95rem; }

.canais-redes { display: flex; flex-wrap: wrap; gap: 0.5rem; align-items: center; }
.canais-redes .topic { width: 100%; margin-bottom: 0.5rem; }
.canais-redes a {
  font-family: var(--font-mono);
  font-size: 0.8125rem;
  padding: 0.4rem 0.8rem;
  border: 1px dashed var(--amber-ink);
  border-radius: 8px;
  color: var(--amber-ink);
}
.canais-redes a:hover { background: var(--amber); border-style: solid; color: var(--term-deep); text-decoration: none; }

.form-row.two { display: grid; grid-template-columns: 1fr 1fr; gap: 1rem; }
.alert-ok, .alert-erro {
  padding: 0.8rem 1rem;
  border-radius: var(--radius);
  margin-bottom: 1rem;
  font-size: 0.95rem;
}
.alert-ok { background: #43c24f1f; border: 1px solid #43c24f4d; }
.alert-erro { background: #ef5b511f; border: 1px solid #ef5b514d; }
form .alert-ok, form .alert-erro { margin-bottom: 0; }

/* --- Sobre: botao secundario sobre fundo claro ----------------------------- */
.btn-ghost-ink {
  border: 1px dashed var(--text-muted);
  color: var(--text-dark);
  background: transparent;
}
.btn-ghost-ink:hover { border-style: solid; border-color: var(--amber-ink); text-decoration: none; }
.about-cta { display: flex; flex-wrap: wrap; gap: 0.75rem; margin-top: 2rem; }

@media (max-width: 800px) {
  .contact-grid { grid-template-columns: 1fr; }
  .form-row.two { grid-template-columns: 1fr; }
  .canais li { grid-template-columns: 1fr; gap: 0.15rem; }
}

/* --- Tela de foco (inscricao) ---------------------------------------------- */
.tela-foco { background: var(--term-deep); color: var(--cream); min-height: 100vh; }
.tela-foco-wrap {
  min-height: 100vh;
  display: grid;
  place-content: center;
  gap: 2rem;
  padding: var(--gutter);
  max-width: 34rem;
  margin-inline: auto;
}
.brand-foco { justify-self: center; font-size: 1.3rem; }
.foco-box {
  background: var(--term);
  border: 1px solid #ffffff1a;
  border-radius: var(--radius);
  padding: clamp(1.5rem, 5vw, 2.5rem);
  box-shadow: 0 30px 70px -30px #000;
  --topic-color: var(--amber);
  --topic-prefix: var(--out-gray);
}
.foco-box h1 {
  font-family: var(--font-mono);
  font-size: clamp(1.35rem, 4vw, 1.8rem);
  line-height: 1.25;
  margin: 0 0 0.75rem;
  color: var(--cream);
}
.foco-lede { color: var(--out-gray); margin: 0 0 1.75rem; }
.foco-form { display: grid; gap: 1rem; }
.foco-form label { color: var(--out-gray); }
.foco-form input {
  background: #ffffff0a;
  border-color: #ffffff24;
  color: var(--cream);
}
.foco-form input:focus-visible { border-color: var(--amber); }
.foco-form .btn { justify-self: start; }
/* Os campos vivem num wrapper proprio para que o sucesso possa esconder so
   eles, mantendo o aviso visivel no lugar do formulario. */
/* `display` explicito vence o [hidden] da folha do navegador, entao o wrapper
   ficava visivel mesmo depois do sucesso. Vale para os dois formularios. */
[hidden] { display: none !important; }
.foco-form .forms-campos { display: grid; gap: 1rem; }


/* Consentimento: caixa e texto na mesma linha, texto alinhado pelo topo --
   sao duas ou tres linhas de rotulo, nao uma. */
.foco-consent {
  display: grid;
  grid-template-columns: auto 1fr;
  gap: 0.6rem;
  align-items: start;
  color: var(--out-gray);
  font-size: 0.9rem;
  line-height: 1.45;
  cursor: pointer;
}
.foco-consent input { margin-top: 0.2rem; accent-color: var(--amber); }

.foco-voltar { margin: 1.5rem 0 0; font-family: var(--font-mono); font-size: 0.8125rem; }
.foco-voltar a { color: var(--out-gray); }
.foco-voltar a:hover { color: var(--cream); }

/* --- Ficha técnica da atividade -------------------------------------------
   Faixa charcoal com os oito campos em quatro colunas por duas fileiras.

   A grade anterior era `auto-fit, minmax(13rem, 1fr)`, que trata todos os
   campos como se tivessem o mesmo tamanho. Não têm: `onde` e `organizador`
   chegam a 95 caracteres nos 60 posts que mostram a ficha, contra oito de
   "Evento". O campo longo se anuncia com `.largo` e pede duas colunas, então
   ele ganha largura sem esticar a fileira inteira.

   Saiu o <details>. A faixa toda mede pouco mais de 200px no pior caso, e
   recolher um bloco desse tamanho custa mais atenção do que economiza.     */
.ficha {
  margin: 2.5rem 0 0;
  background: var(--term);
  color: var(--cream);
  border-radius: var(--radius);
  padding: 1.15rem clamp(1.15rem, 3vw, 1.7rem);
}
/* Sem `margin: 0` aqui. As duas classes vivem no mesmo <dl>, e como esta regra
   vem depois, um reset de margem apagaria o `margin-top` de `.ficha` -- a faixa
   encostaria na capa. O `margin` de `.ficha` já zera a margem padrão do <dl>. */
.ficha-grid {
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  gap: 0.85rem 1.6rem;
}
/* `min-width: 0` para o valor longo poder quebrar dentro da célula em vez de
   esticá-la e desalinhar a coluna vizinha. */
.ficha-grid > div { min-width: 0; }
.ficha-grid > div.largo { grid-column: span 2; }
.ficha-grid dt {
  font-family: var(--font-mono);
  font-size: 0.62rem;
  letter-spacing: 0.06em;
  text-transform: uppercase;
  color: var(--out-gray);
}
.ficha-grid dd {
  margin: 0.15rem 0 0;
  font-size: 0.85rem;
  line-height: 1.4;
  color: var(--cream);
}
@media (max-width: 820px) {
  .ficha-grid { grid-template-columns: repeat(2, 1fr); }
  .ficha-grid > div.largo { grid-column: 1 / -1; }
}
@media (max-width: 420px) {
  .ficha-grid { grid-template-columns: 1fr; }
}

/* --- Imagem que não carrega no corpo do post -------------------------------
   47 posts da era WordPress apontam para `wp-content/uploads/`, que não existe
   mais -- os arquivos nunca vieram para este repositório. O rebrand.js marca
   a imagem que falhou, e ela sai do fluxo em vez de deixar o ícone de quebrado
   no meio do texto. O alt vira legenda, quando existe.                       */
.post-body img.img-quebrada { display: none; }
.post-body .img-ausente {
  display: block;
  margin: 1.25rem 0;
  padding: 0.9rem 1rem;
  border: 1px dashed #00000024;
  border-radius: var(--radius);
  background: var(--paper-2);
  font-family: var(--font-mono);
  font-size: 0.8125rem;
  color: var(--text-muted);
}
.post-body .img-ausente::before { content: "$ "; color: var(--amber-ink); }

/* --- Série (evento ou Playground): aviso no topo, navegação no fim ---------
   Mesma linguagem do pager: fonte mono e âmbar. O aviso é uma faixa com borda
   âmbar logo abaixo do cabeçalho; a navegação são duas colunas, anterior à
   esquerda e próxima à direita. A próxima fica sempre na coluna da direita,
   mesmo na primeira edição, quando não há anterior.                         */
.serie-aviso {
  margin-top: 1.5rem;
  margin-bottom: 1.5rem;
  padding: 0.35rem 0 0.35rem 0.8rem;
  border-left: 3px solid var(--amber);
  font-family: var(--font-mono);
  font-size: 0.85rem;
  color: var(--text-dark);
}
.serie-aviso b { color: var(--amber-ink); }
.serie-nav {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 1rem;
  margin: 2.5rem 0 1.5rem;
  padding-top: 1rem;
  border-top: 1px solid #0000001f;
  font-family: var(--font-mono);
  font-size: 0.85rem;
}
.serie-nav a { color: var(--text-dark); text-decoration: none; }
.serie-nav a:hover { color: var(--amber-ink); }
.serie-nav small { display: block; margin-top: 0.2rem; font-size: 0.78rem; color: var(--text-muted); }
.serie-nav .serie-ant { grid-column: 1; }
.serie-nav .serie-prox { grid-column: 2; text-align: right; }
@media (max-width: 480px) {
  .serie-nav { grid-template-columns: 1fr; }
  .serie-nav .serie-prox { grid-column: 1; }
}
