@import url('https://fonts.googleapis.com/css2?family=Advent+Pro:wdth,wght@100..200,100..900&family=Inter:wght@300..700&display=swap');

/* V1.1: transição entre páginas — View Transitions API "cross-document"
   (Chrome/Edge 126+; navegadores sem suporte simplesmente navegam sem
   transição nenhuma, sem quebrar nada). Não precisa de JS pra navegação
   normal: basta essa regra existir nas duas páginas envolvidas (a que
   sai e a que entra) — como base.css carrega em todas, toda navegação
   interna do site já entra automaticamente. (Pra troca de aba
   trabalhos/bio do diretor, que não é uma navegação de verdade — é hash
   mudando dentro da mesma página — `js/diretor-tabs.js` aciona a versão
   "same-document" da mesma API, `document.startViewTransition()`, pra
   ganhar o mesmo efeito.)

   V1.1.1: o cross-fade padrão do navegador (antiga e nova sobrepostas,
   opacidade trocando ao mesmo tempo) foi trocado por um "dip to white" —
   a página antiga dissolve pro branco, e só depois o branco dissolve pra
   nova página. Duas animações em sequência, cada uma cobrindo metade do
   tempo total (`--t-page`), em vez do crossfade simultâneo do browser. */
@view-transition {
  navigation: auto;
}

::view-transition-image-pair(root) {
  background-color: #fff;
}

@keyframes dip-to-white-out {
  to { opacity: 0; }
}

@keyframes dip-to-white-in {
  from { opacity: 0; }
}

::view-transition-old(root) {
  animation: dip-to-white-out calc(var(--t-page) / 2) var(--ease-out) both;
}

::view-transition-new(root) {
  animation: dip-to-white-in calc(var(--t-page) / 2) var(--ease-out) calc(var(--t-page) / 2) both;
}

*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }

/* V1.17.6: "a página, na versão mobile, parece 'solta' pros lados" —
   não é overflow de conteúdo (nenhuma página mede `scrollWidth` maior
   que a viewport, conferido via Playwright); é o bounce elástico que
   Safari/Chrome mobile dão ao arrastar a página além da borda, mesmo
   sem nada pra rolar. `overscroll-behavior-x` mata só esse bounce
   horizontal, sem mexer em `overflow` — não esbarra no aviso abaixo
   (`overflow-x` não pode subir de `body`, `overscroll-behavior` pode,
   são propriedades diferentes, uma não quebra o `position: sticky` do
   título que a outra quebraria). */
html { -webkit-text-size-adjust: 100%; scroll-behavior: smooth; overscroll-behavior-x: none; }

/* V1.17.2: `body` vira coluna flex de altura mínima igual à viewport —
   junto com `.feed { flex: 1 }` (layout.css), é o que gruda o rodapé no
   fim da tela quando o conteúdo é mais curto que ela (poucos projetos,
   caso da Daniela por ora). Sem isso, o rodapé some no fim do `<main>`
   e sobra uma faixa vazia até o fim da viewport — normal em qualquer
   página curta, mas só ficou visível agora que uma página real tem
   pouco conteúdo. `100dvh`, não `100vh` (única exceção da convenção do
   projeto, que usa `vh`): no Safari mobile `100vh` conta a barra de
   endereço como se estivesse sempre recolhida, então a viewport "real"
   é menor que `100vh` — exatamente o tipo de gap que este fix existe
   pra fechar. `.logo`/`.burger`/`.panel`/os modais são todos `position:
   fixed`, fora do fluxo — só `<main class="feed">` e `<footer>` viram
   itens flex de verdade (ver `.projeto-corpo` em `projeto.html`, que
   não é filho direto de `body` e por isso não participa disso). Quando
   o conteúdo é mais alto que a viewport, `.feed` não encolhe abaixo do
   próprio tamanho (comportamento padrão de item flex) e a página rola
   normalmente, como sempre. */
body {
  background: var(--paper);
  color: var(--ink);
  font-family: 'Advent Pro', sans-serif;
  font-variation-settings: 'wdth' 100, 'wght' 400;
  font-size: 15px;
  line-height: 1.5;
  min-height: 100dvh;
  display: flex;
  flex-direction: column;
  overflow-x: hidden;
  overscroll-behavior-x: none;
  transition: background-color var(--t-panel) var(--ease-out);
  -webkit-font-smoothing: antialiased;
}

/* IMPORTANTE: overflow-x fica no body, nunca num ancestral de .title,
   senão o position:sticky do título morre sem aviso. */

/* V1.17.6: "a cor azul não é aplicada de forma uniforme" — a V1.17.4
   deu grão + P&B só pras MÍDIAS (`.media`/`.diretor-bio__foto`/
   `.projeto-video`/`.galeria-fotos__item`, `css/layout.css`); o fundo
   do `body`, que preenche o resto da página (cabeçalho, margens, vão
   entre vídeo e galeria em `projeto.html`), continuou um `--hue` chapado
   — ao lado da mídia granulada e escurecida, esse fundo liso parecia
   mais claro/fraco por comparação, mesma cor mas sem a textura. Mesmo
   `--grain` (`tokens.css`) e mesmo `background-blend-mode: overlay`
   somados aqui, pro fundo ficar consistente com a mídia. Sem `mix-
   blend-mode` (não tem nada por baixo do `body` pra misturar contra). */
.is-overlay-open body,
html.is-overlay-open body {
  background-color: var(--hue);
  background-image: var(--grain);
  background-size: 200px 200px;
  background-blend-mode: overlay;
}

/* V1.18.7: "quando o efeito de cor entra, ele elimina a barra de
   rolagem... quando sai, a barra volta e causa um 'pulo' na tela" —
   `is-overlay-open` é a MESMA classe que `js/idle-color.js` liga
   sozinho, sem painel nenhum aberto, só pelo efeito ambiente de cor
   (seção 2 do PROJETO.md) — travar o scroll fazia sentido pro painel
   de verdade (menu/quem-somos/contato cobrindo a tela, evita rolar o
   fundo por baixo), nunca fez sentido pro efeito de cor sozinho, que
   não cobre nem esconde nada. `:has(.panel.is-open)` (mesma técnica
   já usada em `.panel--menu:has(...)` mais abaixo neste arquivo)
   escopa o travamento só pro caso real, sem precisar de uma classe
   nova nem mexer em `js/panel.js`/`js/idle-color.js`. */
html.is-overlay-open:has(.panel.is-open) { overflow: hidden; }

a { color: inherit; text-decoration: none; }

/* V17: dificulta o download casual de mídia — sem isso, arrastar a imagem
   pra fora da aba ou o toque longo no celular ("salvar na galeria") já
   bastam pra baixar o arquivo, mesmo com o menu de botão direito bloqueado
   por JS (ver js/no-download.js). Não é proteção real (inspecionar/baixar
   via devtools sempre funciona pra quem sabe), só tira o atalho óbvio. */
img, video {
  display: block;
  max-width: 100%;
  -webkit-user-drag: none;
  user-drag: none;
  -webkit-touch-callout: none;
}

/* O reset acima (author) vence o [hidden] nativo do navegador (user-agent),
   que perde mesmo tendo especificidade maior — a origem do stylesheet decide
   antes da especificidade. Sem isto, mídia quebrada usa media.js para
   esconder a tag via `hidden`, mas o ícone de imagem quebrada continua visível
   por baixo do placeholder "mídia em produção". */
img[hidden], video[hidden] { display: none; }

button { font: inherit; color: inherit; background: none; border: 0; cursor: pointer; }

/* ---------- linha: hover de menu e foco de teclado em qualquer lugar ---------- */

.panel--menu a,
.panel--menu .menu-toggle { position: relative; }

.panel--menu a::after,
.panel--menu .menu-toggle::after {
  content: '';
  position: absolute;
  left: 0; right: 0; bottom: -.06em;
  height: 3px;
  background: currentColor;
  transform: scaleX(0);
  transform-origin: right;
  transition: transform var(--t-text) var(--ease-out);
}

.panel--menu a:hover::after,
.panel--menu .menu-toggle:hover::after {
  transform: scaleX(1);
  transform-origin: left;
}

.panel--menu a:focus-visible,
.panel--menu .menu-toggle:focus-visible,
.title a:focus-visible,
.diretor-tabs a:focus-visible,
.diretor-voltar a:focus-visible,
.projeto-voltar a:focus-visible,
.projeto-barra a:focus-visible,
.arrow:focus-visible {
  text-decoration: underline;
  text-decoration-thickness: 3px;
  text-underline-offset: .14em;
  text-decoration-skip-ink: none;
}

:focus { outline: none; }

/* ---------- chrome fixo ---------- */

.logo {
  position: fixed;
  top: 18px;
  left: var(--gutter);
  z-index: var(--z-chrome);
  font-variation-settings: 'wdth' 175, 'wght' 700;
  font-size: 21px;
  line-height: 1;
  /* V1.2: fica de fora do "dip to white" entre páginas — dar um nome
     próprio de view transition tira o logo do grupo `root` (que é quem
     sofre o dip) e o trata como elemento persistente entre as duas
     páginas. Como o logo é idêntico (mesma posição, mesmo texto) nas
     duas pontas de qualquer navegação interna, ele já ficaria
     visualmente parado mesmo com o crossfade padrão do navegador — o
     `animation: none` abaixo só garante isso de forma explícita, sem
     depender desse acaso. */
  view-transition-name: logo;
}

::view-transition-group(logo),
::view-transition-old(logo),
::view-transition-new(logo) {
  animation: none !important;
}

.burger {
  position: fixed;
  top: 18px;
  right: var(--gutter);
  z-index: var(--z-chrome);
  width: 34px;
  height: 26px;
  display: grid;
  align-content: center;
  gap: 6px;
}

.burger span {
  display: block;
  height: 3px;
  background: var(--ink);
  transition: transform .3s var(--ease-out), opacity .2s linear;
}

.burger[aria-expanded='true'] span:nth-child(1) { transform: translateY(9px) rotate(45deg); }
.burger[aria-expanded='true'] span:nth-child(2) { opacity: 0; }
.burger[aria-expanded='true'] span:nth-child(3) { transform: translateY(-9px) rotate(-45deg); }

.skip {
  position: absolute;
  left: -9999px;
}
.skip:focus {
  left: var(--gutter);
  top: 12px;
  z-index: 999;
  background: var(--paper);
  padding: 8px 12px;
}

/* ---------- painéis: menu (topo) e quem somos (rodapé) ---------- */

.panel {
  position: fixed;
  left: 0;
  right: 0;
  z-index: var(--z-panel);
  background: var(--panel-bg);
  padding: calc(var(--logo-clearance) + 14px) var(--gutter) var(--gutter);
  transition: transform var(--t-panel) var(--ease-out);
  overflow: hidden;
}

.panel--menu   { top: 0;    height: auto; transform: translateY(-101%); }

.panel.is-open { transform: translateY(0); }

/* V1.7: "quem somos" deixou de subir do rodapé — agora é um card
   centralizado, mesmo princípio do `.panel--contact` (mesmo `top:50%;
   left:50%; transform:translate(-50%,-50%)`), só que bem maior. Entre
   V1.7 e V1.7.7 a entrada/saída usou o "dip to white" padrão do site
   (`document.startViewTransition()` em `js/panel.js`); V1.7.8 tirou o
   dip ("retire animação DIP TO WHITE... entra o card FADE IN FADE OUT
   NORMAL") e voltou a um fade simples de `opacity`, só que sem o
   `scale` que `.panel--contact` usa — puro fade, como pedido. O efeito
   de cor (`is-overlay-open`, fundo + overlay de cor nas mídias) não depende dessa
   transição nenhuma e continua igual. */
.panel--about {
  top: 50%;
  left: 50%;
  right: auto;
  bottom: auto;
  height: auto;
  max-height: 85vh;
  overflow-y: auto;
  width: min(1300px, 90vw);
  padding: calc(var(--gutter) * 1.6) var(--gutter) calc(var(--gutter) * 1.4);
  transform: translate(-50%, -50%);
  transition: opacity var(--t-panel) var(--ease-out);
  opacity: 0;
  pointer-events: none;
}

/* `transform` redeclarado aqui de propósito, não só herdado de
   `.panel--about` acima: `.panel.is-open { transform: translateY(0) }`
   (duas classes, especificidade 0-2-0) vence `.panel--about` sozinho
   (uma classe, 0-1-0) assim que `.is-open` entra — sem repetir o
   `translate(-50%,-50%)` aqui (também com 0-2-0, mas depois no arquivo,
   então desempata), o painel perdia a centralização exatamente no
   momento em que abria e ia parar fora da tela. Mesmo problema que
   `.panel--contact.is-open` já resolve do mesmo jeito. */
.panel--about.is-open {
  opacity: 1;
  pointer-events: auto;
  transform: translate(-50%, -50%);
}

.panel--menu ul { list-style: none; }

.panel--menu.is-directors-open > ul > li > a,
.panel--menu.is-directors-open > .social,
.panel--menu:has(.menu-toggle[aria-expanded='true']) > ul > li > a,
.panel--menu:has(.menu-toggle[aria-expanded='true']) > .social {
  display: none;
}

html.is-directors-open .burger,
html:has(.menu-toggle[aria-expanded='true']) .burger { display: none; }

/* V11, revisado no patch dos dois lightboxes ficarem brancos: enquanto o
   modal de vídeo ou o lightbox de fotos está aberto (`is-photo-open` —
   nome herdado de quando só o de fotos usava fundo branco; agora os
   dois modais usam a mesma classe, já que os dois têm o mesmo
   tratamento de chrome), só o hambúrguer some. Ele tem um motivo
   estrutural (ele e o "fechar" de qualquer um dos dois modais ocupam o
   mesmo canto, `top: 18px; right: var(--gutter)` — sem escondê-lo, os
   dois competiriam por clique e por foco de teclado); o logo (canto
   oposto, sem conflito de posição nenhum) fica sempre visível — sem
   fundo escuro em nenhum dos dois modais, não existe mais "modo
   cinema" que justificasse escondê-lo também.

   `.projeto-voltar` entra na mesma lista (V1.16) — bug achado testando
   a navegação por clique na foto: em `projeto.html` (V1.11), o burger
   sumiu de vez e "voltar" ficou fixo no MESMO canto (`top:19px;
   right:var(--gutter)`, ver seção 6 do PROJETO.md) — abrir a galeria
   de fotos ali sobrepõe "voltar" e o "fechar" do lightbox, os dois
   ilegíveis um por cima do outro. Mesmo motivo, mesma solução: esconde
   enquanto o lightbox está aberto. */
html.is-photo-open .burger,
html.is-photo-open .projeto-voltar { display: none; }

.panel--menu ul a {
  display: inline-block;
  font-variation-settings: 'wdth' 200, 'wght' 900;
  font-size: clamp(30px, 4vw, 52px);
  line-height: .98;
  letter-spacing: -.01em;
}

.menu-toggle {
  display: inline-block;
  font-variation-settings: 'wdth' 200, 'wght' 900;
  font-size: clamp(30px, 4vw, 52px);
  line-height: .98;
  letter-spacing: -.01em;
  padding: 0;
}

.submenu {
  list-style: none;
  margin-top: 12px;
  padding-left: 0;
  display: none;
}

.submenu-back {
  display: none;
  padding: 0;
  margin: 0 0 10px;
  font-variation-settings: 'wdth' 175, 'wght' 600;
  font-size: 19px;
  text-decoration: underline;
  text-underline-offset: .14em;
}

.menu-toggle[aria-expanded='true'] + .submenu-back { display: inline-block; }

.submenu[hidden] { display: none; }
.menu-toggle[aria-expanded='true'] ~ .submenu { display: block; }

.submenu a {
  display: inline-block;
  font-variation-settings: 'wdth' 200, 'wght' 900;
  font-size: clamp(30px, 4vw, 52px);
  line-height: .98;
  letter-spacing: -.01em;
}

.social {
  display: flex;
  gap: 14px;
  margin-top: 18px;
  font-variation-settings: 'wdth' 175, 'wght' 600;
  font-size: 19px;
}

/* V1.7: texto em cima, logo embaixo, os dois centralizados — troca a
   disposição em linha (V14: logo ao lado do texto) por uma coluna,
   pedido explícito de referência visual pro novo card centralizado
   (ver `.panel--about` acima). Ordem no HTML já é texto-depois-logo
   (não CSS `order`): assim a ordem de leitura por teclado/leitor de
   tela bate com a ordem visual. */
.about-content {
  display: flex;
  flex-direction: column;
  align-items: center;
  text-align: center;
  gap: clamp(32px, 5vw, 56px);
}

/* PATCH: primeira medida do logo ficou pequena demais perto da
   referência (~31% da largura do card lá, ~17% aqui) — corrigido pra
   bater. */
/* V1.7.12: logo do "quem somos" vira link de volta pro feed do
   portfólio ("./", mesmo destino do `.logo` fixo do cabeçalho) —
   pedido explícito. `display:block` só deixa explícito o
   comportamento que o flex item já teria por padrão (blockificado
   como filho direto de `.about-content`), sem depender disso
   implicitamente. */
.about-content__logo-link { display: block; }

.about-content__logo {
  width: clamp(220px, 22vw, 400px);
  height: auto;
}

/* V1.7: Newsreader pequeno e à esquerda vira Advent Pro grande e
   centralizado — pedido explícito de referência ("CRAVE A
   REFERÊNCIA"). É a mesma família das manchetes do site, não mais o
   serif usado no resto do texto corrido (`.bio`, cartão de contato
   etc.) — esse painel virou destaque tipográfico, não leitura corrida
   discreta. `'wdth' 200, 'wght' 900` (PATCH — era `175`/`700`, largura
   e peso não estavam no teto do eixo variável como a referência
   pedia): os dois no máximo do eixo variável da Advent Pro, igual aos
   títulos mais pesados do site (`.title`, `.diretor-nome`). */
/* PATCH: entrelinha bem mais apertada — "eles devem praticamente se
   tocar... eu quero um BOLO DE TEXTO". `1.25` (herdado do tratamento
   de leitura corrida de antes) deixava respiro grande demais entre
   linhas pra um texto grande/peso 900; `.9` é mais apertado que o
   próprio `.diretor-nome`/`.title` (`.94`/`.98`) — pedido explícito de
   um bloco bem denso, não só "no mesmo padrão dos títulos". */
.panel--about .prose {
  max-width: min(900px, 80%);
  font-variation-settings: 'wdth' 200, 'wght' 900;
  font-size: clamp(22px, 2.6vw, 38px);
  line-height: .9;
}
.panel--about .prose p + p { margin-top: .5em; }

/* "fechar" do quem-somos vai pro canto superior direito do próprio
   painel (V12) — antes ficava em fluxo normal, acima do logo, sobrando
   sozinho no canto esquerdo. .panel já é position:fixed, então
   position:absolute aqui ancora no próprio painel, não no viewport. */
.panel--about .close {
  position: absolute;
  top: 18px;
  right: var(--gutter);
  margin-bottom: 0;
}

.panel--about .close,
.panel--contact .close {
  font-variation-settings: 'wdth' 175, 'wght' 600;
  font-size: 19px;
  text-decoration: underline;
  text-underline-offset: .14em;
}

.panel--contact .close { margin-bottom: 24px; }

/* PATCH: "fechar" (texto) vira "×" (símbolo) só no "quem somos" —
   pedido explícito. `text-decoration:none` porque sublinhado embaixo
   de um símbolo, não de uma palavra, não faz sentido nenhum;
   `aria-label="Fechar"` no HTML mantém o nome acessível pra quem usa
   leitor de tela, já que o texto visível deixou de dizer "fechar".
   Seletor `.panel--about .close--x`, não `.close--x` sozinho: precisa
   da mesma especificidade de `.panel--about .close` (duas classes) —
   um `.close--x` sozinho (uma classe) perdia a disputa e o "×" ficava
   sublinhado a 19px, herdando o estilo do texto "fechar" que ele
   substituiu. */
.panel--about .close--x {
  text-decoration: none;
  font-size: 32px;
  line-height: 1;
  font-variation-settings: 'wdth' 100, 'wght' 400;
}

/* ---------- painel: card de contato (terceira variante) ----------
   Mesmo mecanismo dos outros dois painéis (Esc, clique fora, foco preso,
   cor de fundo via .is-overlay-open), mas ele não desce do topo nem sobe
   do rodapé: é um card centralizado, com transform próprio. */

.panel--contact {
  top: 50%;
  left: 50%;
  right: auto;
  bottom: auto;
  height: auto;
  width: min(420px, 88vw);
  padding: calc(var(--gutter) * 1.1) var(--gutter) var(--gutter);
  border-radius: 2px;
  opacity: 0;
  pointer-events: none;
  transform: translate(-50%, -50%) scale(.94);
  transition: transform var(--t-panel) var(--ease-out), opacity var(--t-panel) var(--ease-out);
}

.panel--contact.is-open {
  opacity: 1;
  pointer-events: auto;
  transform: translate(-50%, -50%) scale(1);
}

.contact-card__local {
  font-variation-settings: 'wdth' 200, 'wght' 800;
  font-size: clamp(22px, 3vw, 30px);
  line-height: 1;
  margin-bottom: 18px;
}

.contact-card__item {
  font-family: 'Inter', sans-serif;
  font-weight: 300;
  font-size: clamp(16px, 1.5vw, 20px);
  line-height: 1.5;
}

.contact-card__item + .contact-card__item { margin-top: 4px; }

.contact-card__item a:hover,
.contact-card__item a:focus-visible {
  text-decoration: underline;
  text-decoration-thickness: 3px;
  text-underline-offset: .14em;
  text-decoration-skip-ink: none;
}

@media (prefers-reduced-motion: reduce) {
  .panel--contact,
  .panel--about { transition: opacity var(--t-panel) var(--ease-out); }
}

.bio {
  font-family: 'Inter', sans-serif;
  font-weight: 300;
}

/* ---------- modal de vídeo ----------
   Deliberadamente fora do sistema de "painel" (menu/quem-somos/contato):
   fundo fixo próprio, não a cor sorteada da sessão, e sem o overlay de
   cor nas mídias atrás — o objetivo é assistir o vídeo, não o efeito de cor.
   Ver js/video-modal.js.

   PATCH: fundo branco (`var(--paper)`), não mais preto de cinema —
   mesmo tratamento do lightbox de fotos (ver abaixo), pedido explícito
   pra consistência entre os dois. `is-photo-open` (não mais
   `is-lightbox-open`, que ficou sem uso) esconde só o hambúrguer —
   mesmo motivo de sempre: conflito real de posição com o "fechar",
   `top: 18px; right: var(--gutter)` nos dois. O logo continua visível
   aqui também, como no lightbox de fotos: sem fundo escuro, não tem
   mais "modo cinema" pra justificar escondê-lo. */

.video-modal {
  position: fixed;
  inset: 0;
  z-index: var(--z-panel);
  display: grid;
  place-items: center;
  padding: var(--gutter);
  background: var(--paper);
  opacity: 0;
  pointer-events: none;
  transition: opacity var(--t-panel) var(--ease-out);
}

.video-modal.is-open {
  opacity: 1;
  pointer-events: auto;
}

.video-modal__close {
  position: fixed;
  top: 18px;
  right: var(--gutter);
  z-index: var(--z-chrome);
  color: var(--ink);
  font-variation-settings: 'wdth' 175, 'wght' 600;
  font-size: 19px;
  text-decoration: underline;
  text-underline-offset: .14em;
}

.video-modal__frame {
  width: min(1100px, 92vw);
  aspect-ratio: 16 / 9;
}

.video-modal__frame iframe,
.video-modal__frame video {
  width: 100%;
  height: 100%;
}

@media (prefers-reduced-motion: reduce) {
  .video-modal { transition: none; }
}

/* ---------- carrossel de fotos (lightbox da galeria) ----------
   Fora do sistema de painel, como o modal de vídeo — mas, diferente
   dele, fundo BRANCO (V1.6, pedido explícito), não preto de cinema.
   `.galeria-fotos` só existe na página de projeto, então essa regra
   não precisa de modificador: é a única cor que esse componente já
   teve. Abre ao clicar numa foto de .galeria-fotos (ver
   js/photo-modal.js) e navega entre as fotos daquela galeria com as
   mesmas setas do carrossel da home (mix-blend-mode: difference — o
   truque de contraste funciona igual sobre fundo claro: a seta some no
   branco só se ela também for branca, e aqui `.arrow` já é `color:
   #fff` — differença entre branco e branco dá preto, então ela
   continua visível). */

.photo-modal {
  position: fixed;
  inset: 0;
  z-index: var(--z-panel);
  display: grid;
  place-items: center;
  padding: var(--gutter);
  background: var(--paper);
  opacity: 0;
  pointer-events: none;
  transition: opacity var(--t-panel) var(--ease-out);
}

.photo-modal.is-open {
  opacity: 1;
  pointer-events: auto;
}

.photo-modal__close {
  position: fixed;
  top: 18px;
  right: var(--gutter);
  z-index: var(--z-chrome);
  color: var(--ink);
  font-variation-settings: 'wdth' 175, 'wght' 600;
  font-size: 19px;
  text-decoration: underline;
  text-underline-offset: .14em;
}

.photo-modal__frame {
  position: relative;
  width: min(1200px, 92vw);
  height: min(84vh, 92vw);
  display: grid;
  place-items: center;
}

/* V1.16: clicar na foto navega (metade esquerda = anterior, direita =
   próxima — ver js/photo-modal.js) além das setas, que continuam como
   reforço visual. `cursor: pointer` sozinho não distingue as metades
   pro visitante — aceitável, a seta em cada lado já indica a direção;
   o clique na foto é só uma área maior pra fazer a mesma coisa. */
.photo-modal__img {
  max-width: 100%;
  max-height: 100%;
  width: auto;
  height: auto;
  object-fit: contain;
  cursor: pointer;
}

/* V1.17: o vídeo do projeto vira o primeiro "slide" do lightbox de
   fotos (ver js/photo-modal.js) — `[hidden]` por padrão, trocado de
   lugar com `.photo-modal__img` conforme o slide atual. Largura cheia
   do frame (ao contrário da foto, que centraliza no tamanho natural
   dela) com `aspect-ratio: 16/9` — o mesmo tratamento que
   `.projeto-video iframe/video` já usa fora do lightbox. */
.photo-modal__video {
  width: 100%;
  aspect-ratio: 16 / 9;
}

.photo-modal__video iframe,
.photo-modal__video video {
  display: block;
  width: 100%;
  height: 100%;
  border: 0;
}

.photo-modal__frame .arrow { position: absolute; }
.photo-modal__frame .arrow--prev { left: -50px; }
.photo-modal__frame .arrow--next { right: -50px; }

@media (max-width: 820px) {
  .photo-modal__frame .arrow--prev { left: 4px; }
  .photo-modal__frame .arrow--next { right: 4px; }
}

@media (prefers-reduced-motion: reduce) {
  .photo-modal { transition: none; }
}

/* ---------- rodapé ---------- */

/* V1.3: rodapé inteiro de volta pra Advent Pro, em negrito — reverte o
   V1.2 (que tinha posto e-mail/endereço em Newsreader, só o copyright
   ficando na Advent Pro). `'wght' 700` (era 600) é o que garante o
   "bold" pedido; sem uma regra própria pra `footer p`, as três linhas
   herdam isso igual, não precisa de seletor específico pro copyright.

   V1.17.5: `14px` → `16px` ("aumente a fonte 2 pontos") — `'wght' 700`
   já é o "bold" pedido de novo na mesma leva, não precisou mudar
   (era esse o peso desde a V1.3). */
footer {
  padding: 24px var(--gutter);
  background: transparent;
  font-variation-settings: 'wdth' 100, 'wght' 700;
  font-size: 16px;
  color: var(--ink);
}

footer p {
  margin: 0 0 8px 0;
}

/* V1.6: rodapé invertido — fundo preto, texto claro. Nasceu escopado só
   à página de projeto; um patch na mesma leva estendeu pra `<footer
   class="footer-invertido">` nas 5 páginas do site (a classe é a mesma
   em todas, só marcada direto no HTML de cada uma). `a { color: inherit
   }` (topo deste arquivo) já resolve o link do e-mail sozinho, sem
   seletor próprio.

   V1.17.3: "o rodapé não será mais preto, ele terá a cor aleatória que
   está reservada pro efeito cor" — fundo virou `var(--hue)`, sempre,
   não só quando um painel abre (igual o preto de antes: constante,
   painel aberto ou não — só a cor que mudou). Texto voltou a preto.

   V1.17.4: "tire a borda preta do box do rodapé. SEM BORDA" — o
   `border-top` (regra base `footer`) foi removido de vez, não só
   trocado de cor.

   V1.17.5: inverte de novo — "deixe a barra do rodapé preto" + "a
   fonte deve ter a cor aleatória do efeito cor". Fundo volta a
   `var(--ink)` (preto, como era antes da V1.17.3); quem passa a usar
   `var(--hue)` agora é o TEXTO, não o fundo — troca completa de qual
   dos dois carrega a cor da sessão. `a { color: inherit }` (topo deste
   arquivo) resolve o link do e-mail sozinho, sem seletor próprio.

   V1.18.1.1: rodapé volta a DUAS COLUNAS lado a lado (`display:flex`).
   V1.18 tinha posto os quatro itens do menu (Projetos/Diretores/Quem
   somos/Contato) dentro do rodapé, como lista. Pedido com referência
   visual: não é isso — os itens do menu saem do rodapé de vez (viram
   bloco próprio no fim do feed da home, ver `.bloco-menu` em
   `layout.css`) e o rodapé volta a ter e-mail + copyright, com
   Instagram do lado do e-mail, e as duas colunas (`.rodape-col`, só
   um agrupador de `<p>` — sem herdar `footer p` nada demais) lado a
   lado, não empilhadas. `row-gap`/`column-gap` separados, não `gap`
   sozinho: no mobile (`flex-wrap: wrap` empilha as colunas), 60px de
   respiro VERTICAL entre elas ficava exagerado — só o respiro
   HORIZONTAL (entre colunas lado a lado) precisa ser grande.

   V1.18.2: "inverta as linhas do rodapé" — col 1 vira endereço (São
   Paulo/SP, Brasil / Atendendo o mundo todo), col 2 vira Instagram +
   e-mail (sem `© 2026` — o copyright saiu daqui, ver `.rodape-versao`
   abaixo). `position: relative` porque `.rodape-versao` é `position:
   absolute` e precisa de um ancestral posicionado pra ancorar no
   canto do PRÓPRIO rodapé, não da página inteira. */
footer.footer-invertido {
  background: var(--ink);
  color: var(--hue);
  display: flex;
  row-gap: 24px;
  column-gap: 60px;
  flex-wrap: wrap;
  position: relative;
}

/* "No canto inferior direito do rodapé: © 2026 v.[versão]" — ancorado
   no canto de `footer` (acima, `position: relative`), não flui junto
   com as colunas; assim fica preso ao canto de verdade da caixa preta
   mesmo quando as colunas empilham no mobile (`flex-wrap: wrap`).
   `margin: 0` sobrescrevendo `footer p { margin: 0 0 8px 0 }` — um
   `<p>` com margem própria não ficaria colado no canto exato.
   Versão escrita à mão, sem nenhum mecanismo automático: repete o
   número do cabeçalho do PROJETO.md (seção "Versão") — precisa ser
   atualizada nas 4 páginas com rodapé toda vez que a versão mudar,
   mesma disciplina manual já usada pro changelog. */
.rodape-versao {
  position: absolute;
  right: 0;
  bottom: 0;
  margin: 0;
  font-size: 13px;
}

footer a {
  text-decoration: none;
}

footer a:hover,
footer a:focus-visible {
  text-decoration: underline;
  text-decoration-thickness: 3px;
  text-underline-offset: .14em;
  text-decoration-skip-ink: none;
}
