/* ==========================================================================
   Piratas — Coquetéis e Parrilla
   Identidade: conceito PORTO.
   RÉGUA DA PALETA: o MANUAL da agência (PIAU), pág. 58 — a única declaração
   normativa do pacote, com CMYK + RGB + HEXA lado a lado. Os arquivos
   vetoriais em MARCA/SVG e o PDF do cardápio são artefatos DERIVADOS e
   divergem entre si; não são a régua.
   Conflito conhecido, registrado: manual #351010/#D8411F · SVG
   #3A0606/#DD4319 · PDF do cardápio #3B0505/#DB421A. As três já são a marca
   nova — a divergência é da própria entrega da agência. Há pergunta pendente
   à PIAU; se ela responder com outro hex, estes valores mudam.
   Desde a Story 4.17 (2026-08-14) os SVG do logotipo servidos pelo site
   (`public/assets/marca/*.svg`) seguem ESTA MESMA RÉGUA — antes traziam o
   #3A0606/#DD4319 da exportação da agência. Os 11 originais em
   `Identidade Piratas/PIRATAS/MARCA/SVG/` ficaram DELIBERADAMENTE divergentes:
   são a prova documental de que a inconsistência veio da PIAU, e essa prova é
   o que sustenta a pergunta pendente acima.
   Referência gráfica declarada: rótulos clássicos de rum — peso, procedência, calor.
   ========================================================================== */

/* ==========================================================================
   FONTES AUTO-HOSPEDADAS — Design System (EPIC-008, Story 8.1)
   Decisão 3 do dono: servir do NOSSO domínio, nunca do CDN do Google. O
   `<link>` para fonts.googleapis.com entrega o IP de todo visitante ao Google
   a cada carregamento. Licença SIL OFL 1.1 (public/assets/fontes/OFL.txt),
   que permite auto-hospedagem explicitamente.

   ⚠️ ARQUIVOS VARIÁVEIS — `font-weight` é FAIXA, não valor.
   Archivo e Bodoni Moda são fontes variáveis: UM arquivo por subset cobre
   todos os pesos pelo eixo `wght`. Declarar `font-weight:400` aqui faria o
   navegador entender que o arquivo só serve para o peso 400 e SINTETIZAR os
   demais (falso negrito — desenho esticado por algoritmo, não o desenho que o
   tipógrafo fez). O sintoma é sutil o bastante para ninguém notar, e é
   exatamente o defeito que a fonte variável existe para evitar. Não troque a
   faixa por valor único. Ver `fontes/LEIA-ME.md`.

   ⚠️ `unicode-range` é OBRIGATÓRIO. É ele que faz o navegador escolher entre
   `latin` e `latin-ext` — sem ele, baixa os dois SEMPRE, e o recorte de subset
   (que existe para economizar banda) vira peso morto. Ranges copiados
   literalmente do CSS do Google.

   ⚠️ Sem `src:local()`, de propósito: uma versão divergente da fonte instalada
   na máquina do visitante venceria a nossa, e o site renderizaria diferente
   sem ninguém conseguir reproduzir.
   ========================================================================== */

/* 🔴 REVERTIDO — A BRILLANTE SAIU (2026-08-29). LICENÇA NÃO COMPRADA.
   ============================================================================
   Story 8.16. Em 2026-08-29 a Brillante (Black Foundry) chegou a ocupar o
   `--ds-serif` por decisão do dono — é a fonte da identidade visual da casa.
   O arquivo que tínhamos era de AVALIAÇÃO, e isto estava provado nos
   metadados, não suposto: origem com prefixo `TRY`
   (`TRYBrillante-wghtwdth-…ttf`) e nameID 14 (License URL) apontando para
   `https://black-foundry.com/licensing/`.

   A decisão de orquestração que acompanhou a 8.15 foi "implementar sim,
   publicar não", e a guarda `sql/verificar-licenca-fontes.py` foi escrita para
   fazer valer isso — ela travou `deploy.sh` exatamente como devia. No mesmo
   dia o dono decidiu **não comprar a licença**, e o display voltou para a
   **Bodoni Moda** (SIL OFL 1.1, publicável sem restrição), que é o caminho de
   volta que a própria 8.15 deixou preparado.

   Os `.woff2` de avaliação (2 da Brillante + 4 da Silva Text) SAÍRAM do
   repositório junto: a guarda decodifica todo arquivo de fonte da árvore
   publicada, referenciado pelo CSS ou não — mantê-los rastreados travaria o
   deploy mesmo sem nenhum `@font-face` apontando para eles.

   ↩️ Se a licença da Brillante vier a ser comprada: ver
      `fontes/LEIA-ME.md`, seção "Como voltar à Brillante".

   ⚠️ A SILVA TEXT SAIU ANTES (2026-08-29) — e o motivo NÃO era licença, era
      GLIFO.
   ----------------------------------------------------------------------------
   A trial da Silva Text (Daniel Sabino) chegou a ocupar o `--ds-sans` junto
   com aquela troca, e produziu TOFU (retângulo vazado ⊠) em acento, `$`, `@` e
   `·`: "CARDÁPIO", "HORÁRIOS", "R$ 11,90", "11h30" saíam com buraco no lugar
   da letra. A causa foi MEDIDA nos `.otf` ORIGINAIS da fundição, antes de
   qualquer conversão nossa: **828 dos 894 glifos apontam para o `.notdef`**.
   A trial libera só 65 caracteres — `, - . 0-9 A-Z a-z`. É trava comercial da
   fundição, não defeito do nosso pipeline de subset.

   Por isso o texto de interface voltou para a **Archivo** (SIL OFL 1.1,
   publicável, 217 caracteres desenhados incluindo todos os acentos do
   português) — e continua nela.
   ============================================================================ */

/* Archivo — interface, rótulos e corpo (ESPEC §2.1). Variável, wght 100–900.
   Ocupa o `--ds-sans`. Voltou em 2026-08-29 no lugar da Silva Text, cuja trial
   não desenha acento — ver o aviso acima. */
@font-face{
  font-family:'Archivo';
  font-style:normal;
  font-weight:100 900;
  font-display:swap;
  src:url('fontes/archivo-latin.woff2') format('woff2');
  unicode-range:U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face{
  font-family:'Archivo';
  font-style:normal;
  font-weight:100 900;
  font-display:swap;
  src:url('fontes/archivo-latin-ext.woff2') format('woff2');
  unicode-range:U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}

/* Bodoni Moda — display (ESPEC §2.1). Variável, wght 400–900 + eixo óptico
   opsz 6–96. O DS usa a família de 28 a 96px: sem `font-optical-sizing:auto`
   (declarado em `html`, abaixo) o navegador fixa um valor óptico único e o
   display grande sai com traço fino demais.

   ⚠️ A faixa é `400 900`, NÃO `100 900`. A Brillante, que ocupou este lugar
   entre a Story 8.15 e a 8.16, era `100 900`; a Bodoni não desenha abaixo de
   400. Declarar `100 900` aqui faria o navegador sintetizar os pesos 100–300
   por deformação em vez de recusá-los.

   ⚠️ O eixo `opsz` NÃO é declarado aqui de propósito — quem o aciona é o
   `font-optical-sizing:auto` do `html`. Declarar
   `font-variation-settings:'opsz'…` FIXARIA o eixo num valor e mataria
   justamente o ajuste automático por tamanho. */
@font-face{
  font-family:'Bodoni Moda';
  font-style:normal;
  font-weight:400 900;
  font-display:swap;
  src:url('fontes/bodoni-moda-latin.woff2') format('woff2');
  unicode-range:U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face{
  font-family:'Bodoni Moda';
  font-style:normal;
  font-weight:400 900;
  font-display:swap;
  src:url('fontes/bodoni-moda-latin-ext.woff2') format('woff2');
  unicode-range:U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}

/* IBM Plex Mono — dados, códigos, etiquetas (ESPEC §2.1). ESTÁTICA: daí ter
   arquivo por peso e `font-weight` com valor único. Só 400 e 500 são usados
   pelo DS; um peso 600 exigiria arquivo novo. */
@font-face{
  font-family:'IBM Plex Mono';
  font-style:normal;
  font-weight:400;
  font-display:swap;
  src:url('fontes/ibm-plex-mono-latin-400.woff2') format('woff2');
  unicode-range:U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face{
  font-family:'IBM Plex Mono';
  font-style:normal;
  font-weight:400;
  font-display:swap;
  src:url('fontes/ibm-plex-mono-latin-ext-400.woff2') format('woff2');
  unicode-range:U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
@font-face{
  font-family:'IBM Plex Mono';
  font-style:normal;
  font-weight:500;
  font-display:swap;
  src:url('fontes/ibm-plex-mono-latin-500.woff2') format('woff2');
  unicode-range:U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face{
  font-family:'IBM Plex Mono';
  font-style:normal;
  font-weight:500;
  font-display:swap;
  src:url('fontes/ibm-plex-mono-latin-ext-500.woff2') format('woff2');
  unicode-range:U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}

:root{
  /* Paleta oficial — pág. 58 do manual */
  --vinho:#351010;
  --brasa:#D8411F;
  /* O brasa da pág. 58 dá 4,47:1 sobre branco e 3,97:1 sobre --creme —
     reprova em WCAG AA (4,5) para texto pequeno em TODOS os fundos desta
     base. Este tom escurecido (fator 0,90 sobre o normativo) passa em todos:
     branco 5,36 · --papel 5,32 · --creme 4,76. Recalculado a partir do
     #D8411F novo, NÃO herdado do #C23A15 antigo (que derivava do #DD4319).
     Use --brasa em áreas grandes (botão, filete); --brasa-texto em tipografia miúda. */
  --brasa-texto:#C23A1C;
  --porto:#1D71B8;
  --oliva:#6C7A36;
  /* O oliva da pág. 58 passa sobre branco (4,69:1) mas REPROVA sobre --creme
     (4,17:1) — e o painel pinta body{background:var(--creme)}. Mesmo padrão
     do par --brasa/--brasa-texto: o normativo fica para preenchimento e
     borda; esta derivada (fator 0,93) é para uso como COR DE TEXTO.
     Medido: branco 5,32 · --papel 5,27 · --creme site 4,72 · creme admin 4,84. */
  --oliva-texto:#647132;
  /* A terceira derivada do brasa: sobre fundo ESCURO, escurecer piora. O
     --brasa normativo sobre --vinho dá 3,81:1 — passa a régua de texto GRANDE
     (1.4.3, 3:1), que cobre o `.hero h1 em` e o `.prova__n`, mas reprova para
     texto miúdo como o link do rodapé (.94rem). Este é o brasa CLAREADO 15%:
     4,69:1 sobre --vinho, 5,08 sobre --vinho-escuro, 5,35 sobre o overlay do
     lightbox. Use em tipografia miúda sobre fundo escuro. */
  --brasa-claro:#DE5E41;
  --tinta:#1D1D1B;
  --papel:#FEFEFE;

  /* Derivadas — neutros quentes, referência de rótulo envelhecido */
  --creme:#F4F1EC;
  --creme-fundo:#EFEAE1;
  --linha:#DDD8D0;
  --cinza:#6B6560;
  --vinho-claro:#4A1618;
  --vinho-escuro:#280A0B;

  /* 🟢 TOKENS LEGADOS — MIGRADOS PARA O KIT ADOBE (Story 4.31, 2026-08-31).
     Antes desta story: `--serif` = Iowan Old Style, `--sans` = -apple-system.
     Eram a SEGUNDA camada tipográfica do projeto — a Story 8.17 trocou só os
     `--ds-*`, e o gate dela registrou o resto como adiamento (MED-1). Isto é
     o adiamento fechado, com o mesmo desenho de cadeia de TRÊS elos:
     kit → LOCAL (Bodoni Moda / Archivo) → genérico.

     ⚠️ NUNCA termine em genérico sem o elo do meio. A 8.17 mediu que o `serif`
     do sistema aqui resolve para TIMES ROMAN (944,015625px ao bit, para a
     string de referência dela). O elo local é o que impede uma falha do CDN da
     Adobe de cair em Times/Arial — e essa falha seria SILENCIOSA.

     ⚠️ Os nomes são os que o KIT declara: minúsculos, com hífen, entre aspas
     duplas. Capitalizar ("Brillante") não casa nenhuma família e o token cai
     calado na reserva, sem erro no console.

     ⚠️ `--serif` recebe `silva-text`, NÃO `brillante-vf` — e isto é decisão
     MEDIDA, não descuido. ESPEC §2.2 fixa a banda de cada família: display
     28–96px, interface/corpo 12–24px. Os usos de `--serif` nesta folha caem na
     banda de INTERFACE (`h3,h4` mede 18,56px), não na de display. Medido a 4×
     na Story 4.31: a Brillante é uma display de alto contraste — a haste fina
     some no tamanho de texto, e ela é ~19% mais estreita que a Silva no peso
     600. Quem veste DISPLAY aqui é `--ds-serif`, que continua com a Brillante.
     Ver `docs/qa/gates/4.31-*.yml`, bloco `decisao_tipografica`. */
  --serif:"silva-text",'Bodoni Moda',"Iowan Old Style","Palatino Linotype",Palatino,"Book Antiqua",Georgia,serif;
  --sans:"silva-text",Archivo,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;

  --largura:1180px;
  --raio:2px;              /* quase reto — rótulo, não app */
  --raio-btn:99px;         /* botão é pílula: todos, em todo lugar */
  /* Altura do cabeçalho fixo — o menu mobile, as abas do cardápio e o scroll
     âncora ancoram nela. Precisa bater com a altura RENDERIZADA, senão o
     menu abre descolado e as abas grudam no lugar errado. */
  --topo:70px;
  --transicao:180ms cubic-bezier(.2,0,.2,1);

  /* ------------------------------------------------------------------------
     DESIGN SYSTEM — tokens novos (EPIC-008, Story 8.1)
     Fonte: docs/design-system/ESPEC-DESIGN-SYSTEM.md §1-3.

     ⚠️ O prefixo `--ds-` é DELIBERADO e não deve ser removido agora. Enquanto
     a migração for incremental (Stories 8.2-8.8), as variáveis antigas
     (--vinho, --brasa, --oliva, --porto...) continuam VIVAS e em uso: elas são
     a paleta "conceito PORTO" que o site inteiro ainda consome. Tirar o
     prefixo hoje colidiria os dois sistemas no mesmo nome e trocaria a paleta
     de todo componente de uma vez, sem story que responda por isso.
     Renomear é trabalho de uma story de limpeza, depois que 8.2-8.8 migrarem.

     ⚠️ Nenhuma regra desta folha CONSOME estes tokens ainda — por escopo.
     Aplicar tipografia e cor aos componentes é o trabalho das stories
     seguintes. Aqui eles só existem para serem consumidos.
     ------------------------------------------------------------------------ */

  /* Paleta — ESPEC §1.1. As cinco nomeadas… */
  --ds-breu:#1D1E1C;      /* texto principal, sidebar, dock, toast, botão escuro */
  --ds-casco:#351010;     /* o registro institucional */
  --ds-brasa:#D8411F;     /* ação e só ação: um por tela */
  --ds-oliva:#6C7A36;     /* confirma */
  --ds-mare:#1D71B8;      /* informa */
  /* …e as cinco de apoio */
  --ds-fundo:#F2EDE3;     /* fundo da página */
  --ds-mesa:#FFFDF8;      /* superfície de cartão, painel, tabela */
  --ds-linha:#DED8CD;     /* todas as bordas e divisores de 1px */
  --ds-apoio:#7A756C;     /* texto terciário, rótulos mono, placeholders */
  --ds-texto-2:#4A4741;   /* texto secundário */

  /* Tipografia — ESPEC §2.2. Os nomes com espaço vão entre aspas; o fallback
     genérico segura a página enquanto a fonte não chegou.

     🟢 AS FONTES DA IDENTIDADE VOLTARAM (2026-08-31, Story 8.17) — agora
     LICENCIADAS. O dono confirmou que a licença Adobe está ativa e cobre uso
     comercial em site publicado, e forneceu o kit Typekit `wjx2eap`. É a
     autorização que faltava em 2026-08-29 e que fez a Story 8.16 reverter.
     `--ds-serif` = `brillante-vf` (display) · `--ds-sans` = `silva-text`
     (interface, rótulos e corpo). Os nomes são os que o KIT declara —
     minúsculos, com hífen — não "Brillante"/"Silva Text". Conferidos contra a
     resposta real do kit, não presumidos: trocar a capitalização faz a família
     não casar e o token cai calado na reserva.

     ⚠️ A CADEIA DE RESERVA TEM TRÊS ELOS, e o do meio é o que importa —
     decisão do dono, "fonte local de reserva na lista". Sem a fonte LOCAL no
     meio, uma falha do kit (CDN fora, licença revogada, CSP errado) cai direto
     no genérico do sistema: medido, o `serif` do sistema aqui é TIMES ROMAN. A
     Bodoni Moda e a Archivo continuam auto-hospedadas e com `@font-face`
     declarado logo acima justamente para segurar essa queda — não foram
     removidas, e removê-las quebra a reserva sem sintoma visível até o dia em
     que o kit cair.

     ⚠️ Diferente de 2026-08-29, a Silva Text agora é a LICENCIADA do kit, não
     a trial que tinha 828 dos 894 glifos no `.notdef` (tofu em "CARDÁPIO",
     "R$"). A cobertura de acento foi conferida por execução nesta story, não
     presumida corrigida — ver Story 8.17.

     ⚠️ O `sans-serif` no fim segue sendo genérico SANS mesmo com a Silva Text
     sendo uma serif de texto: o genérico existe para o instante ANTES de
     qualquer fonte chegar, e a Archivo (elo do meio) é sans. Trocá-lo por
     `serif` faria a página piscar numa serif de sistema e o salto de layout
     ficaria visível. */
  --ds-serif:"brillante-vf", 'Bodoni Moda', serif;  /* display, 28–96px */
  --ds-sans:"silva-text", Archivo, sans-serif;      /* interface, rótulos e corpo, 12–24px */
  --ds-mono:'IBM Plex Mono', monospace; /* dados, códigos, etiquetas */

  /* Espaço — ESPEC §3.1, a régua literal 4·8·12·16·24·32·48·64 */
  --ds-esp-4:4px;
  --ds-esp-8:8px;
  --ds-esp-12:12px;
  --ds-esp-16:16px;
  --ds-esp-24:24px;
  --ds-esp-32:32px;
  --ds-esp-48:48px;
  --ds-esp-64:64px;

  /* Raio — ESPEC §3.2. A legenda declara 0/2/4/pill, mas os estilos usam
     também 3px (o MAIS FREQUENTE: botão, campo, dropdown, toast) e 6px
     (dock). Isso está no arquivo-fonte; não é interpretação nossa. */
  --ds-raio-0:0;
  --ds-raio-padrao:2px;
  --ds-raio-3:3px;
  --ds-raio-cartao:4px;
  --ds-raio-dock:6px;
  --ds-raio-pill:999px;

  /* Elevação — ESPEC §3.3, o trio "plano · apoiado · flutuante".
     "Plano" não tem variável porque é AUSÊNCIA de sombra: só
     `border:1px solid var(--ds-linha)`. As ~15 sombras específicas de
     componente (dropdown, dialog, drawer…) entram na story do componente que
     as usa, para não encher o :root de variável sem consumidor. */
  --ds-elevacao-apoiado:0 1px 2px rgba(29,30,28,.08);
  --ds-elevacao-flutuante:0 12px 32px -10px rgba(29,30,28,.35);
}

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

html{
  -webkit-text-size-adjust:100%;
  scroll-behavior:smooth;
  scroll-padding-top:calc(var(--topo) + 6px);
  /* Eixo óptico do Bodoni Moda (opsz 6–96) — Story 8.1, AC #2/#6.
     Declarado UMA vez em escopo global, de onde as stories 8.2+ herdam ao
     aplicar --ds-serif. Sem isto o navegador fixa um valor óptico único e o
     display grande (o DS usa a família até 96px) sai com traço fino demais.
     Não afeta Archivo nem IBM Plex Mono, que não têm eixo óptico. */
  font-optical-sizing:auto;
}
/* Mesma transição discreta entre documentos da Story 5.2 no painel. A
   navegação continua sendo feita pelos links e formulários normais. */
@view-transition{ navigation:auto; }
::view-transition-old(root),::view-transition-new(root){
  animation-duration:.16s;
  animation-timing-function:ease-out;
}
@media (prefers-reduced-motion:reduce){
  html{ scroll-behavior:auto; }
  ::view-transition-old(root),::view-transition-new(root){ animation:none; }
  /* ⚠️ Story 1.59 — o override do `.carrossel10h__trilho` NÃO mora aqui, e o
     motivo é ORDEM DE FONTE. `html{scroll-behavior:auto}` acima casa com outro
     ELEMENTO e não alcança o trilho; e uma regra `.carrossel10h__trilho` NESTE
     bloco teria a MESMA especificidade da regra do carrossel (linha ~1042) e
     PERDERIA por vir antes. Medido: com a regra aqui, o computado sob
     `prefers-reduced-motion:reduce` continuava `smooth`. O override correto
     está LOGO DEPOIS do bloco do carrossel. */
  *,*::before,*::after{
    animation-duration:.01ms!important; animation-iteration-count:1!important;
    transition-duration:.01ms!important;
  }
}

body{
  margin:0;
  /* Story 8.3 AC #5 — troca só a FAMÍLIA. O §2.2 pede `400 14px/1.6`, mas o
     14px do DS é corpo DENTRO DE COMPONENTE do mockup, não corpo de página com
     texto corrido (privacidade, cardápio). Baixar o site inteiro para 14px é
     regressão de legibilidade que ninguém pediu: fica 16px/1.65.
     Divergência DS × site consciente — mudar o tamanho exige decisão do dono. */
  font-family:var(--ds-sans);
  font-size:16px;
  line-height:1.65;
  color:var(--tinta);
  /* Story 8.12 AC #1 — o fundo da página vira AREIA (`--ds-fundo`, #F2EDE3).
     Era `--papel` (#FEFEFE), quase branco. Esta linha é o que faz a home
     "parecer outro site": o conteúdo passa a flutuar em cartões `--ds-mesa`
     sobre areia, em vez de branco sobre branco. Trocar aqui alcança TODA
     seção que não sobrescreve fundo — por isso `.secao--creme` deixou de
     existir e `.secao--vinho` sobrou só no happy hour (AC #4, #5, #6). */
  background:var(--ds-fundo);
  -webkit-font-smoothing:antialiased;
  -moz-osx-font-smoothing:grayscale;
  /* NÃO usar overflow-x:hidden aqui: em vários navegadores isso cria um
     contexto de rolagem que MATA o position:sticky do cabeçalho e da barra
     de abas. O estouro de largura se resolve na origem (ver .hamburger). */
}

img{ max-width:100%; height:auto; display:block; }
a{ color:inherit; }

.container{
  width:100%;
  max-width:var(--largura);
  margin-inline:auto;
  padding-inline:24px;
}
@media (max-width:640px){ .container{ padding-inline:20px; } }

.pular-para-conteudo{
  position:absolute; left:-9999px; top:0; z-index:200;
  background:var(--brasa-texto); color:#fff; padding:12px 20px; font-weight:600;
}
.pular-para-conteudo:focus{ left:0; }

:focus-visible{ outline:2.5px solid var(--brasa); outline-offset:3px; }

/* --------------------------------------------------------------------------
   Tipografia
   -------------------------------------------------------------------------- */
/* Story 8.3 — o bloco `h1,h2,h3,h4` foi PARTIDO de propósito.
   O §2.2 do DS especifica h1 (400/.96/-.02em) e h2 (400/1); h3 e h4 do DS são
   os de dialog e de sheet, que são do PAINEL e não têm alvo no site público.
   Deixá-los herdar 400/.96 seria mudar h3/h4 por acidente — então eles ficam
   declarados EXPLICITAMENTE com os valores de sempre (600/1.14/-.015em).
   Ver AC #2 e R7 da story. */
h1,h2{
  font-family:var(--ds-serif);
  font-weight:400;
  margin:0 0 .5em;
  color:var(--vinho);
}
h3,h4{
  font-family:var(--serif);
  font-weight:600;
  line-height:1.14;
  letter-spacing:-.015em;
  margin:0 0 .5em;
  color:var(--vinho);
}
/* §2.2: h1 é 400/.96/-.02em com max-width:900px. Os degraus de font-size vêm
   do §4.2 e são declarados nas @media logo abaixo (AC #3, via (a)). */
h1{
  font-size:38px;
  line-height:.96;
  letter-spacing:-.02em;
  max-width:900px;
  text-wrap:pretty;
}
/* ⚠️ NÃO reformatar a linha do h2 abaixo nem trocar o clamp por px.
   `sql/teste-happy-hour.php:1393` extrai este valor com a regex literal
   `/^h2\{ font-size:clamp(([\d.]+)rem/m` para provar que o preço do happy
   hour é tipograficamente dominante sobre o h2 (Story 1.13 AC #2). Trocar
   para px faz a extração devolver -1 e a PRÉ-CONDIÇÃO falhar — verificado por
   execução na 8.3. Por isso o h2 segue a via (b) do AC #3 (rampa clamp entre
   os extremos do §4.2: 27px → 40px), enquanto o h1 segue a via (a) (degraus).
   Divergência declarada; reconciliar é mandato da 8.9. */
h2{ font-size:clamp(1.6875rem,3.2vw,2.5rem); line-height:1; }
h3{ font-size:clamp(1.2rem,2.2vw,1.45rem); }
/* Os degraus de h1 do §4.2, na régua do DS (decisão 7 do dono): 480/768/1024/
   1440. Escritos em `min-width` ASCENDENTE porque os predicados do DS são
   CUMULATIVOS (§4.1, armadilha 3 do README): `sm = w < 768` também é verdade
   em 390px. Traduzir para faixas disjuntas é a ORDEM que faz o trabalho — a
   última @media que casa é a que o navegador aplica.
   XS(<480)=38px é o valor base declarado no próprio `h1{}` acima. */
@media (min-width:480px){  h1{ font-size:48px; } }
@media (min-width:768px){  h1{ font-size:62px; } }
@media (min-width:1024px){ h1{ font-size:72px; } }
@media (min-width:1440px){ h1{ font-size:84px; } }
p{ margin:0 0 1.1em; }

/* Rótulo — Story 8.12 AC #8/#12(a).
   Era o "filete tipográfico" da marca: sans 700, `.28em`, brasa, com um
   `::after` de GRADIENTE atravessando a linha. Passa a ser o rótulo mono do
   Design System — `.rot` da prévia aprovada (`home-redesenhada.html:65`):
   mono 500/10px, `.16em`, `--ds-apoio`, SEM filete.

   Os dois pseudo-elementos de gradiente saíram junto (AC #12a): o DS não tem
   decoração em gradiente, e o rótulo agora é etiqueta de dado, não ornamento.
   `.rotulo--centro` saiu inteira — o cabeçalho numerado é alinhado à esquerda
   por desenho (AC #7), e o grep do R7 provou que só `index.php` a usava.

   ⚠️ ALCANCE MAIOR QUE A HOME, de propósito: `.rotulo` é usada em 404, sair,
   wifi, cardapio, reservas e privacidade. A troca vale nas 7 páginas — é
   migração de token do DS, não ajuste local. Ver `nao_verificado`.

   ⚠️ `.secao--vinho .rotulo` (mais abaixo) NÃO é tocada: é o alvo literal do
   mutante M14. Com o happy hour como única `.secao--vinho` restante, aquela
   regra passa a ter exatamente um consumidor — e continua declarando
   `--brasa-claro` sobre `--vinho` (4,69:1), como a 1.13 auditou. */
/* ⚠️ `font-family` em LONGHAND, aqui e nas outras regras novas desta story.
   O atalho `font:500 10px/1 var(--ds-mono)` define a família e RENDERIZA
   igual — mas o leitor do `$contrato82` procura a propriedade `font-family`,
   e com o atalho ele lê '(AUSENTE)'. Ou seja: a trava ficaria vácua e alguém
   poderia devolver o sans amanhã sem nada acusar. Achado por execução ao
   rodar a suíte com o atalho no lugar. */
.rotulo{
  font-family:var(--ds-mono);
  font-weight:500;
  font-size:10px;
  line-height:1;
  letter-spacing:.16em;
  text-transform:uppercase;
  color:var(--ds-apoio);
  display:block;
  margin:0 0 14px;
}

.linha-brasa{ width:56px; height:3px; background:var(--brasa); border:0; margin:22px 0; }

/* --------------------------------------------------------------------------
   Botões
   -------------------------------------------------------------------------- */
/* Story 8.2 — o botão passa a ser o do Design System (ESPEC §5.5, tamanho
   MÉDIO). Mudança visual grande e DE PROPÓSITO (decisão 1: o site migra):
   era pílula (`--raio-btn`, 99px) com padding 15px/30px, 48px de altura,
   borda 1.5px e peso 700; passa a 3px de raio, 44px, borda 1px e peso 600.

   🔒 CAIXA ALTA — DECISÃO DO DONO, 2026-08-26. NÃO "CORRIGIR".
   O `text-transform:uppercase` + `letter-spacing:.14em` NÃO vêm do DS: o @qa
   demonstrou no gate da 8.2 que o mockup usa caixa de FRASE nos botões. O
   dono foi informado da divergência e optou por manter a caixa alta, que é a
   identidade atual do Piratas. É escolha registrada, não descuido herdado —
   quem quiser mudar precisa de decisão dele, não de iniciativa própria.
   (A trava está na suíte: ver "Story 8.2 (pós-gate)" em teste-local.php.) */
.btn{
  display:inline-flex; align-items:center; justify-content:center; gap:9px;
  font-family:var(--ds-sans);
  font-size:13px; font-weight:600; line-height:1;
  letter-spacing:.14em; text-transform:uppercase;
  padding:0 18px;
  border:1px solid transparent;
  border-radius:var(--ds-raio-3);
  text-decoration:none;
  cursor:pointer;
  transition:background var(--transicao),color var(--transicao),
             border-color var(--transicao),transform var(--transicao);
  min-height:44px;                       /* alvo de toque — §5.5 médio */
  /* Padronização: todo botão tem a MESMA altura e o mesmo respiro, seja no
     menu, no hero ou no formulário. Sem isso o do menu ficava mais baixo. */
  box-sizing:border-box;
  white-space:nowrap;
}
.btn:active{ transform:translateY(1px); }

/* Variante PRIMÁRIA do §5.5. ⚠️ REGRESSÃO CONSCIENTE DE CONTRASTE — leia
   `docs/design-system/README.md`, seção "decisão 2", ANTES de "corrigir".

   Era `--brasa-texto` (#C23A1C, derivada escurecida criada na Story 4.16
   justamente para passar em WCAG AA). O DS pede o brasa PURO (#D8411F), que
   sobre branco dá 4,47:1 — reprova AA para texto pequeno por pouco (mínimo
   4,5:1). O dono foi informado da medição e optou pela fidelidade ao design.
   Não é descuido nem bug: reverter é decisão dele, não de quem passar aqui.

   #B93417 é o hover normativo do brasa (§5.5, linha "Primário"). Não vira
   token: é derivada pontual, mesmo padrão das Stories 4.16/4.17. */
.btn--brasa{ background:var(--ds-brasa); color:var(--ds-mesa); border-color:var(--ds-brasa); }
.btn--brasa:hover{ background:#B93417; border-color:#B93417; }

/* Órfã: nenhuma página a usa (grep confirmado na Story 8.2). Mantida intacta
   — o §5.5 não tem variante "vinho" e remover classe não é escopo da 8.2. */
.btn--vinho{ background:var(--vinho); color:#fff; border-color:var(--vinho); }
.btn--vinho:hover{ background:var(--vinho-claro); }

/* Variante CONTORNO do §5.5. */
.btn--linha{ background:var(--ds-mesa); color:var(--ds-breu); border-color:var(--ds-breu); }
.btn--linha:hover{ background:var(--ds-fundo); }

/* SEM equivalente no §5.5: é o botão sobre foto escura do hero, e o DS não
   tem variante sobre imagem. Preservado como está — lacuna do DS registrada
   na Story 8.2 AC #3, não inventada aqui. */
.btn--claro{ background:transparent; color:#fff; border-color:rgba(255,255,255,.55); }
.btn--claro:hover{ background:#fff; color:var(--vinho); border-color:#fff; }

.btn--bloco{ width:100%; }
/* Variante DESATIVADO do §5.5 — cor declarada no lugar do `opacity:.5`, que
   apagava o rótulo junto com o fundo. #A9A29A é o literal da espec. */
.btn[disabled],.btn[aria-disabled="true"]{
  background:var(--ds-fundo); border-color:var(--ds-linha); color:#A9A29A;
  cursor:not-allowed; pointer-events:none;
}

/* --------------------------------------------------------------------------
   Cabeçalho
   -------------------------------------------------------------------------- */
/* Sem viewport-fit=cover (ver o <meta> em layout.php), o Safari entrega a
   página já dentro da área segura. Ainda assim o topo do cabeçalho é a
   região mais exposta da tela — barra de status, barra do app que abriu o
   link, notch. Por isso a logo NÃO fica colada no limite:
   a reserva de topo abaixo garante folga suficiente para ela sobreviver
   mesmo quando algo do sistema cobre os primeiros pixels da página. */
.cabecalho{
  position:sticky; top:0; z-index:100;
  background:rgba(54,14,15,.97);
  backdrop-filter:saturate(160%) blur(10px);
  border-bottom:1px solid rgba(255,255,255,.1);
}
.cabecalho__interno{
  display:flex; align-items:center; justify-content:space-between;
  gap:20px;
  min-height:var(--topo);
}
/* Story 1.70: .idiomas tem margin-left:auto no desktop. Isso já mantém o
   seletor à direita; o menu deve ficar junto da marca mesmo quando o seletor
   não existe (Reservas, Privacidade e demais páginas monolíngues). */
@media (min-width:901px){
  .cabecalho__interno{ justify-content:flex-start; }
}
@media (max-width:900px){
  /* No celular a logo e o hambúrguer descem: o padding empurra os DOIS para
     baixo (estão no mesmo flex), afastando-os da barra de status do aparelho.
     Vem de padding-top, não de min-height, senão o align-items:center
     redistribuiria o espaço e a logo continuaria colada no limite. */
  .cabecalho__interno{ padding-top:22px; padding-bottom:8px; }
  /* Valor de partida, usado só até o JS medir a altura real do cabeçalho
     (ver layout.php). 70 de min-height + 22 + 8 de padding + borda ≈ 101. */
  :root{ --topo:101px; }
}
.marca{
  display:flex; align-items:center; gap:11px;
  text-decoration:none; color:#fff; flex:none;
}
/* Logotipo oficial — proporção 2,5:1, altura fixa para não distorcer. */
.marca__logo{ height:46px; width:auto; display:block; }
@media (max-width:640px){ .marca__logo{ height:37px; } }

.nav{ display:flex; align-items:center; gap:4px; }
/* 🔴 `:not(.btn)` NÃO É ENFEITE — é o que faz o botão do menu ser um BOTÃO.
   ===========================================================================
   O dono abriu o site e viu o "RESERVAR MESA" do menu como PÍLULA, enquanto o
   do hero era reto. Não era cache: `.nav a` (0,1,1) VENCE `.btn` (0,1,0) por
   ESPECIFICIDADE, e sobrescrevia CINCO propriedades do contrato do componente:

     border-radius   .btn 3px          → .nav a 99px    (a pílula que ele viu)
     font-size       .btn 13px         → .nav a .78rem
     padding         .btn 0 18px       → .nav a 10px 16px
     letter-spacing  .btn .14em        → .nav a .13em
     color           .btn--brasa       → .nav a rgba(255,255,255,.82)
                     var(--ds-mesa)                     (branco TRANSLÚCIDO
                                                         sobre brasa: contraste)

   O comentário abaixo já dizia, desde a 1.x, que "padding e altura vêm do
   .btn". Era intenção, não fato: o CSS dizia o contrário e ninguém mediu. A
   8.2 migrou `.btn` para `--ds-raio-3` e nunca tocou `.nav a`, então o botão
   do menu ficou com o raio antigo — e passou por 3 gates e 2 deploys, porque
   toda asserção do epic perguntava "o que `.btn` DECLARA?" e nenhuma perguntou
   "o que o navegador APLICA ao botão que está na página?".

   ⚠️ NÃO troque por uma regra `.nav .btn{ border-radius:… }` que "devolva" o
   valor: isso corrige o VETOR (uma propriedade) e deixa a CLASSE viva — a
   próxima propriedade que o DS mudar volta a divergir em silêncio. `:not(.btn)`
   tira o botão do alcance da regra de LINK, que é a correção estrutural: link
   de menu é link, botão é botão.

   Especificidade: `:not()` não conta, mas o `.btn` de dentro conta — `.nav
   a:not(.btn)` é (0,2,1), ainda maior que `.btn`. Isso é correto e desejado:
   ela precisa continuar vencendo o `a{}` genérico para os links comuns do
   menu. O que muda é que ela NÃO ALCANÇA MAIS o botão. */
.nav a:not(.btn){
  color:rgba(255,255,255,.82); text-decoration:none;
  font-size:.78rem; font-weight:600; letter-spacing:.13em; text-transform:uppercase;
  padding:10px 16px; border-radius:var(--raio-btn);
  transition:color var(--transicao),background var(--transicao);
}
.nav a:not(.btn):hover,.nav a:not(.btn)[aria-current="page"]{ color:#fff; background:rgba(255,255,255,.09); }
/* No intervalo estreito entre desktop e menu mobile, os cinco links ainda
   precisam deixar espaço para o seletor de idioma à direita. */
@media (min-width:901px) and (max-width:960px){
  .nav a:not(.btn){ padding-inline:10px; }
}
/* Só a margem: padding e altura vêm do .btn, para o botão do menu ficar
   idêntico ao do hero e ao do formulário. Agora isto é VERDADE — antes do
   `:not(.btn)` acima era só intenção escrita. */
.nav .btn{ margin-left:10px; }

.hamburger{
  display:none; background:none; border:0; cursor:pointer;
  padding:10px;
  width:46px; height:46px;
  /* SEM margin-right negativa: ela alinhava o ícone com a margem do texto,
     mas empurrava o botão 10px para FORA da tela — o documento ficava mais
     largo que o viewport e a página inteira deslocava no celular.
     O respiro visual vem do padding, que já está dentro da caixa. */
  margin-right:-10px;
}
@media (max-width:900px){
  /* No mobile o negativo sai de vez e o container ganha o espaço de volta,
     mantendo o alinhamento sem estourar a largura. */
  .hamburger{ margin-right:0; }
}
.hamburger span{
  display:block; width:24px; height:2px; background:#fff; margin:5px auto;
  transition:transform var(--transicao),opacity var(--transicao);
}
.hamburger[aria-expanded="true"] span:nth-child(1){ transform:translateY(7px) rotate(45deg); }
.hamburger[aria-expanded="true"] span:nth-child(2){ opacity:0; }
.hamburger[aria-expanded="true"] span:nth-child(3){ transform:translateY(-7px) rotate(-45deg); }

@media (max-width:900px){
  .hamburger{ display:block; }
  .nav{
    position:fixed; inset:var(--topo) 0 auto 0;
    flex-direction:column; align-items:stretch; gap:0;
    background:var(--vinho);
    padding-inline:20px;          /* o vertical é animado abaixo */
    border-bottom:1px solid rgba(255,255,255,.12);
    /* FECHADO: fora da tela de verdade.
       Antes usava translateY(-115%), que empurrava o painel para CIMA do
       cabeçalho — e o botão "Reservar mesa" ia parar sobre a barra de status
       do iPhone, visível. Escondido pelo transform ele ainda ocupava espaço
       e capturava toques.
       Agora: altura zero, sem conteúdo visível e sem receber toque. */
    max-height:0;
    overflow:hidden;
    visibility:hidden;
    padding-block:0;
    border-bottom-width:0;
    transition:max-height 240ms cubic-bezier(.2,0,.2,1),
               padding-block 240ms cubic-bezier(.2,0,.2,1),
               visibility 0s linear 240ms;
  }
  .nav[data-aberto="true"]{
    max-height:calc(100vh - var(--topo));
    overflow-y:auto;
    visibility:visible;
    padding-block:14px 26px;
    border-bottom-width:1px;
    transition:max-height 240ms cubic-bezier(.2,0,.2,1),
               padding-block 240ms cubic-bezier(.2,0,.2,1),
               visibility 0s;
  }
  .nav a{ padding:15px 4px; border-bottom:1px solid rgba(255,255,255,.09); font-size:.9rem; }
  .nav .btn{ margin:16px 0 0; }
}

/* --------------------------------------------------------------------------
   Hero
   -------------------------------------------------------------------------- */
.hero{
  position:relative;
  background:var(--vinho);
  color:#fff;
  padding:clamp(80px,13vw,140px) 0 clamp(70px,10vw,110px);
  overflow:hidden;
}
.hero::before{                 /* textura sutil de papel de rótulo */
  content:""; position:absolute; inset:0;
  background:
    radial-gradient(ellipse at 22% 8%,rgba(219,66,25,.20),transparent 58%),
    radial-gradient(ellipse at 88% 92%,rgba(38,108,178,.14),transparent 55%);
  pointer-events:none;
}
/* Hero com fotografia de fundo */
.hero--foto::before{
  background:
    linear-gradient(100deg,rgba(40,10,11,.95) 0%,rgba(54,14,15,.88) 45%,rgba(54,14,15,.66) 100%),
    radial-gradient(ellipse at 78% 88%,rgba(219,66,25,.26),transparent 58%);
  z-index:1;
}
.hero__fundo{
  position:absolute; inset:0; z-index:0;
  display:block; pointer-events:none;
}
.hero__fundo img{
  width:100%; height:100%; object-fit:cover; object-position:center 42%;
  filter:saturate(.82) contrast(1.04);
}

.hero__conteudo{ position:relative; z-index:2; max-width:760px; }
.hero h1{ color:#fff; margin-bottom:20px; text-wrap:balance; }
/* --brasa normativo sobre --vinho dá 3,81:1. É texto GRANDE (h1), então a
   régua aplicável é a 1.4.3 para large-scale (3:1), não a de texto miúdo.
   Idem .prova__n e .lightbox__fechar. Miúdo sobre escuro usa --brasa-claro. */
.hero h1 em{ color:var(--brasa); font-style:normal; }
.hero__texto{
  font-family:var(--ds-serif);
  font-size:clamp(1.08rem,2.1vw,1.32rem);
  line-height:1.62;
  color:rgba(255,255,255,.8);
  max-width:56ch;
  margin-bottom:34px;
}
.hero__acoes{ display:flex; flex-wrap:wrap; gap:13px; }

.hero__status{
  display:inline-flex; align-items:center; gap:9px;
  font-size:.74rem; font-weight:700; letter-spacing:.16em; text-transform:uppercase;
  padding:8px 16px; margin-bottom:26px;
  border:1px solid rgba(255,255,255,.26); border-radius:99px;
  color:rgba(255,255,255,.9);
}
.hero__status::before{
  content:""; width:7px; height:7px; border-radius:50%;
  background:var(--cinza); flex:none;
}
/* #5FBF6A é cor de ESTADO (semáforo "aberto agora"), não de marca: não duplica
   variável do :root e ficou fora da varredura da paleta por decisão do @po
   (Story 4.16, AC #7) — trocar por --oliva aproximaria os dois estados
   exatamente na dimensão que os distingue. Bolinha de 7×7px, não texto. */
.hero__status[data-aberto="1"]::before{
  background:#5FBF6A; box-shadow:0 0 0 3px rgba(95,191,106,.24);
}

/* --------------------------------------------------------------------------
   Seções
   -------------------------------------------------------------------------- */
.secao{ padding:clamp(64px,9vw,104px) 0; }
/* Story 8.12 AC #4/#5 — `.secao--creme` FOI REMOVIDA. Ela pintava a seção
   "Da carta" de creme; agora essa seção usa o fundo areia da página e põe o
   conteúdo em cartões. A classe saiu também do markup (`index.php`), e o grep
   do R7 confirmou por execução que NENHUMA outra página a usava.

   `.secao--vinho` SOBREVIVE, mas passa a ter um único consumidor: a seção do
   happy hour (AC #6). A prova social deixou de usá-la (AC #5/#9). A regra fica
   byte a byte como estava — é o alvo literal do mutante M14 via
   `.secao--vinho .rotulo`, e reformatá-la converteria um mutante que MORRE em
   "sobrevivente por alvo não encontrado". */
.secao--vinho{ background:var(--vinho); color:#fff; }
.secao--vinho h2,.secao--vinho h3{ color:#fff; }
/* Story 8.12 AC #7 — o cabeçalho de seção deixa de separar por espaço vazio
   (`margin-bottom:46px`) e passa a ser fechado por RÉGUA: número mono + h2 +
   nota, alinhados por `baseline` e sublinhados por um filete de 1px.
   É o padrão `.cab` da prévia aprovada (`home-redesenhada.html:61`).

   `max-width:640px` sai: com a nota à direita (`margin-left:auto`) o cabeçalho
   precisa da largura do container para a régua atravessar a seção inteira. */
.secao__cabecalho{
  display:flex; flex-wrap:wrap; align-items:baseline;
  gap:var(--ds-esp-12);
  border-bottom:1px solid var(--ds-linha);
  padding-bottom:14px;
  margin-bottom:var(--ds-esp-24);
}
/* O número da seção — o mono do DS finalmente com consumidor no site público.
   Auto-hospedado desde a 8.1, sem uso até esta story. */
.secao__n{
  font-family:var(--ds-mono);
  font-weight:500;
  font-size:11px;
  line-height:1;
  letter-spacing:.16em;
  color:var(--ds-brasa);
}
.secao__cabecalho h2{ margin:0; }
/* A nota curta que empurra para a direita e fecha a régua. Opcional por seção:
   onde não existe, o h2 ocupa a linha sozinho e a régua fecha igual. */
.secao__nota{
  margin:0 0 0 auto; max-width:380px;
  font-family:var(--ds-sans);
  font-weight:400;
  font-size:13px;
  line-height:1.5;
  color:var(--ds-apoio);
}
/* O parágrafo de abertura sai de dentro da régua: `flex-basis:100%` o joga
   para a linha de baixo, sob o filete, em vez de disputar a baseline com o
   h2. Sem isto o texto de "A casa" empurraria a régua para o meio da frase. */
.secao__cabecalho .secao__texto{ flex-basis:100%; margin:var(--ds-esp-16) 0 0; }

/* Cartão de conteúdo — Story 8.12 AC #2.
   O `.cartao` da prévia (`:68`), adaptado ao vocabulário do projeto. Existe
   para o que NÃO tem componente próprio: hoje, o bloco de reserva da última
   seção. `.pilar`, `.destaque`, `.prova` e `.vitrine__item` repetem estes
   mesmos valores dentro das próprias regras — cada um tem estado extra
   (hover, grade, variante escura) que não caberia numa classe só, e o
   `$contrato82` trava os quatro separadamente.
   Padding progressivo 18 → 22 → 26px, breakpoints do DS (AC #13). */
.cartao{
  background:var(--ds-mesa);
  border:1px solid var(--ds-linha);
  border-radius:var(--ds-raio-0);
  padding:18px;
}
@media (min-width:768px){ .cartao{ padding:22px; } }
@media (min-width:1024px){ .cartao{ padding:26px; } }
/* Story 8.3 AC #4 — o "lead" do §2.2. Não existe classe `.lead` no projeto: o
   papel de parágrafo de abertura é exercido por `.secao__texto`.
   `leadSize` do §4.2 é 15px em XS e 17px daí para cima (a @media logo abaixo).
   ⚠️ As duas variantes sobre fundo ESCURO (`.secao--vinho .secao__texto` e
   `.secao__texto--hh`) sobrescrevem a cor DEPOIS desta regra e continuam
   intocadas: `--ds-texto-2` (#4A4741) sobre `--vinho` seria quase invisível
   (R6 da story). */
.secao__texto{
  font-size:15px;
  font-weight:400;
  line-height:1.6;
  color:var(--ds-texto-2);
  text-wrap:pretty;
}
@media (min-width:480px){ .secao__texto{ font-size:17px; } }
.secao--vinho .secao__texto{ color:rgba(255,255,255,.72); }

/* Story 1.13 — correção do LOW-1 herdado do gate da 1.10.
   `.rotulo` usa --brasa-texto (#C23A1C), calibrado para fundo CLARO. Sobre
   --vinho (#351010) dá 3,18:1 e REPROVA AA: .72rem (~11,5px) com weight 700
   não alcança a régua de "texto grande" do WCAG (≥14pt bold ≈ 18,66px), então
   o mínimo aplicável é 4,5, não 3.
   --brasa-claro (#DE5E41) sobre --vinho: 4,69:1. PASSA. É o mesmo par que a
   1.10 já auditou para `.hh__de` neste fundo — reuso de cor medida, não cor
   nova. Medido pela fórmula WCAG, não estimado.
   Seletor de DESCENDÊNCIA de propósito: alcança as duas instâncias de hoje
   (happy hour e "Quem já atracou") e qualquer `.rotulo` que nasça dentro de
   `.secao--vinho` amanhã. Correção de classe, não de vetor. */
.secao--vinho .rotulo{ color:var(--brasa-claro); }

/* Pilares — as camadas do porto.
   Story 8.12 AC #3: a grade DEIXA de simular divisória com `gap:2px` sobre um
   fundo `--linha` (técnica em que o "traço" é o fundo aparecendo pela fresta)
   e passa a ser grade de CARTÕES independentes, cada um com borda própria e
   `gap:16px` — o `.grade`/`.cartao` da prévia (`:68`, `:71`).

   A diferença não é cosmética: com `gap:2px` os quatro pilares formavam UM
   bloco fatiado; com cartão, cada pilar é uma superfície `--ds-mesa` sobre a
   areia da página. É o efeito que o dono aprovou na prévia. */
.pilares{
  display:grid; gap:var(--ds-esp-16);
  grid-template-columns:repeat(auto-fit,minmax(238px,1fr));
}
/* AC #2 — cartão do DS: superfície `--ds-mesa`, borda de 1px `--ds-linha`,
   raio 0 e SEM sombra ("plano" do §3.3 é ausência de sombra, não sombra
   fraca). O padding cresce 18 → 22 → 26px nos breakpoints do DS (AC #10 da
   prévia, AC #13 da story: a régua nova usa 480/768/1024/1440). */
.pilar{
  background:var(--ds-mesa);
  border:1px solid var(--ds-linha);
  border-radius:var(--ds-raio-0);
  padding:18px;
}
@media (min-width:768px){ .pilar{ padding:22px; } }
@media (min-width:1024px){ .pilar{ padding:26px; } }
/* O número do pilar acompanha o número da seção: mono, brasa, `.16em`.
   Era serif 700 `.92rem` — a prévia usa mono aqui (`.pilar__n`, `:73`), e
   manter serif deixaria dois sistemas de numeração convivendo na mesma tela. */
.pilar__n{
  font-family:var(--ds-mono);
  font-weight:500;
  font-size:10px;
  line-height:1;
  letter-spacing:.16em;
  color:var(--ds-brasa);
  display:block; margin-bottom:var(--ds-esp-16);
}
.pilar h3{ font-size:1.16rem; margin-bottom:9px; }
.pilar p{ color:var(--ds-texto-2); font-size:.95rem; margin:0; }

/* Story 1.42 — o acordeão de perguntas de `/eventos.php`.
   Herda a mesma superfície/borda/raio do `.pilar` acima: é o mesmo cartão do
   DS, empilhado em coluna em vez de grade. O `<details>` é nativo (padrão que
   `cardapio.php:155` já usa) — abre sem JS, e o texto fechado continua no HTML
   para o rastreador ler, que é o que o `FAQPage` exige. */
.faq{ display:flex; flex-direction:column; gap:var(--ds-esp-16); }
.faq__item{
  background:var(--ds-mesa);
  border:1px solid var(--ds-linha);
  border-radius:var(--ds-raio-0);
  padding:18px;
}
@media (min-width:768px){ .faq__item{ padding:22px; } }
/* 44px de alvo de toque (a régua de acessibilidade que a 8.23 fixou): o
   `min-height` no `<summary>` garante a área clicável mesmo na pergunta de uma
   linha só. `list-style:none` + `::-webkit-details-marker` tiram o triângulo
   padrão nos dois motores; o `+`/`−` abaixo o substitui. */
.faq__p{
  display:flex; align-items:center; justify-content:space-between; gap:12px;
  min-height:44px;
  font-size:1.05rem; font-weight:600;
  cursor:pointer; list-style:none;
}
.faq__p::-webkit-details-marker{ display:none; }
.faq__p::after{
  content:'+';
  font-family:var(--ds-mono); color:var(--ds-brasa);
  font-size:1.2rem; line-height:1; flex:none;
}
.faq__item[open] .faq__p::after{ content:'−'; }
.faq__r{
  color:var(--ds-texto-2); font-size:.95rem;
  margin:12px 0 0;
}

/* Destaques do cardápio */
.destaques{
  display:grid; gap:26px;
  grid-template-columns:repeat(auto-fill,minmax(268px,1fr));
}
/* Story 8.12 AC #2 — o cartão de destaque já TINHA borda; o que muda é a
   superfície: `--papel` (#FEFEFE, quase branco) → `--ds-mesa` (#FFFDF8), e
   `--linha` → `--ds-linha`. Sobre a areia da página o contraste da moldura
   passa a existir de fato; antes era branco sobre branco. */
.destaque{
  background:var(--ds-mesa);
  border:1px solid var(--ds-linha);
  border-radius:var(--ds-raio-0);
  padding:28px 26px;
  display:flex; flex-direction:column;
  transition:border-color var(--transicao),transform var(--transicao);
}
.destaque:hover{ border-color:var(--brasa); transform:translateY(-3px); }

.destaque--foto{ padding:0; overflow:hidden; }
.destaque--foto .destaque__texto{ padding:24px 26px 28px; display:flex; flex-direction:column; flex:1; }
.destaque__img{
  width:100%; aspect-ratio:4/3; object-fit:cover; display:block;
  transition:transform 400ms cubic-bezier(.2,0,.2,1);
}
.destaque--foto:hover .destaque__img{ transform:scale(1.04); }

/* Story 1.51 AC #2 — a foto do café de `/cowork.php`, ILUSTRAÇÃO ACESSÓRIA.
   O dono a viu ocupando a tela inteira no telefone e pediu que diminuísse.

   🔴 É AQUI QUE A REDUÇÃO ACONTECE, e não no `width` do `<img>`. A regra acima
   é `.destaque__img{ width:100% }` — o atributo `width` do HTML é razão de
   aspecto para reserva de espaço (CLS), não largura renderizada. Reduzi-lo
   sozinho não move um pixel na tela; medido na validação `@po` da story.

   `min(320px, 62%)` cobre os dois lados da faixa que o AC #2 fixou: em 390px o
   62% deixa respiro nas laterais (não é full-bleed), e em desktop o teto de
   320px fica abaixo dos ~340px exigidos. `margin-inline:0` mantém a foto
   alinhada à esquerda, junto do texto do pilar, em vez de centrada e solta. */
.destaque--cafe{ max-width:min(320px,62%); margin-inline:0; }

/* Story 1.61 — AS FOTOS DE `/almoco.php` VOLTARAM PARA O CONTAINER.

   🔴 ISTO SUBSTITUI A `.faixa-pratos` DA STORY 1.58, POR DECISÃO DO DONO em
   2026-09-16, depois de ver a faixa no ar: *"nao quero as imagens ocupando
   toda a horizontal. quero que mantenha o padrao das outras paginas."*

   ⚠️ A CLASSE ANTIGA FOI REMOVIDA INTEIRA, não deixada "por segurança". CSS
   órfão apontando para um mecanismo que não existe mais foi precisamente o que
   fez a 1.59 custar uma story — o resíduo do carrossel. Se `.faixa-pratos`
   ficasse aqui, o próximo a ler acharia que a página ainda sangra.

   🔴 HISTÓRICO DA LARGURA, porque esta página já mudou de ideia DUAS vezes e o
   `srcset` mentiu nas duas:
     1ª · 1.58 draft  — container, `sizes` 350px estimado  ❌ mentira
     2ª · 1.58 no ar  — faixa 100vw, `sizes` 33vw          (recusada pelo dono)
     3ª · 1.61 AGORA  — container de novo, `sizes` 250px   ← a conta está no HTML

   São DUAS grades, e desde 2026-09-16 as duas são **1:1** — ver o bloco da
   `.grade-pratos__img` para o custo dessa decisão do dono:
     · `.grade-pratos`  — as 3 fotos do cardápio, 1:1 recortado no CSS
     · `.pratododia`    — as 6 do prato do dia,   1:1 recortado no arquivo

   🔴 `gap:16px` E NÃO 18px — ALINHADO COM `.pratododia` EM 2026-09-16, e isto
   é parte do "mesmo tamanho" que o dono pediu, não arrumação estética. Com
   18px aqui e 16px lá, a coluna desta grade media 225,33px e a de baixo
   226,67px no mesmo container de 760px: 1,34px de diferença, invisível a olho
   mas suficiente para as fotos NÃO serem do mesmo tamanho na medida. Medido no
   navegador antes e depois. Se alguém devolver 18px aqui, as duas grades
   voltam a divergir e a asserção de largura idêntica acusa. */
.grade-pratos{
  display:grid; gap:16px;
  grid-template-columns:repeat(3,1fr);
}

/* 🔴 `aspect-ratio:1` — A PROTEÇÃO ANTERIOR SAIU POR DECISÃO DO DONO, EM
   2026-09-16, E ISSO PRECISA ESTAR ESCRITO AQUI PORQUE ESTE COMENTÁRIO DIZIA
   O CONTRÁRIO ATÉ HOJE. Pedido literal: *"coloque 3 imagens de pratos do
   cardapio no mesmo tamanho da imagem de pratos do dia"*. As 6 de baixo são
   1:1; "mesmo tamanho" só fecha se estas 3 também forem.

   O QUE ESTE COMENTÁRIO AFIRMAVA ATÉ AGORA, e passou a ser falso: que
   `aspect-ratio:auto` FICA porque qualquer razão fixa cortaria a borda com o
   papel de mesa da marca PAULISTA. O custo é REAL e continua de pé — o que
   mudou é que o dono o aceitou depois de informado. Registro que mente é pior
   que registro ausente, então o número entra aqui em vez de sumir:

     almoco-parmegiana   1600×1066 → 1066×1066   perde 33,4% da área
     almoco-prato-feito  1200×800  → 800×800     perde 33,3% da área
     almoco-milanesa     1600×1066 → 1066×1066   perde 33,4% da área

   É corte de 16,7% por lado, CENTRAL. As três foram ABERTAS e olhadas nos três
   enquadramentos (Center, West, East) antes desta linha existir: em Center o
   prato fica inteiro nas três e o papel PAULISTA sobrevive nas três — na
   milanesa e no prato feito ele fica no rodapé do quadro, na parmegiana à
   direita. East foi recusado na parmegiana (corta o filé). `object-position`
   default (center) é o que as medições aprovaram — não mexer sem reabrir.

   🔴 O RECORTE É NO CSS, NÃO NO ARQUIVO — e esta é a diferença que separa
   estas 3 das 6 de baixo, onde a 1.61 recortou o binário. O motivo é
   `almoco-prato-feito`: `/cowork.php` a consome VIVA no `$carrossel`, com
   `w=800 h=533` HARDCODED e `href` para o arquivo grande no lightbox.
   Recortar o binário mentiria naqueles atributos (CLS) e entregaria uma
   ampliação quadrada numa página que declara 3:2 — quebrando uma página que
   esta story não pode tocar. `almoco-parmegiana` e `almoco-milanesa` hoje só
   vivem aqui, mas recortar 2 de 3 daria dois tratamentos para a mesma grade.
   Com `object-fit:cover`, o corte acontece no render e o arquivo continua
   verdadeiro para quem o reusa. */
.grade-pratos__item{ margin:0; overflow:hidden; }
.grade-pratos__img{
  width:100%; height:auto; aspect-ratio:1; object-fit:cover; display:block;
  transition:transform 500ms cubic-bezier(.2,0,.2,1);
}
.grade-pratos__item:hover .grade-pratos__img{ transform:scale(1.04); }

/* 🔴 AS 6 FOTOS DE "PRATOS DO DIA" — GRADE PRÓPRIA, MESMA RAZÃO DA DE CIMA
   DESDE 2026-09-16, MAS POR CAMINHO DIFERENTE. Estas 6 são QUADRADAS DE ORIGEM
   (1200×1200 depois do recorte central que a 1.61 aplicou no ARQUIVO), então
   `aspect-ratio:1` é a proporção real do binário e não corta pixel nenhum no
   render. Nas 3 de cima o 1:1 é o CSS que recorta, porque o arquivo continua
   3:2 — `almoco-prato-feito` é reusada por `/cowork.php` e não pode mudar de
   forma no disco.

   ⚠️ AS DUAS CLASSES CONTINUAM SEPARADAS, e agora o motivo é OUTRO. Antes era
   a proporção exibida (3:2 × 1:1); hoje as duas exibem 1:1 e o que as separa é
   a ORIGEM do recorte (CSS × arquivo) e o `sizes`, que é conta própria de cada
   uma. Fundi-las faria `.grade-pratos` herdar a promessa de "o arquivo já é
   quadrado", que é falsa para as 3 — e é essa promessa que a asserção dos 18
   arquivos quadrados cobra. */
.pratododia{
  display:grid; gap:16px;
  grid-template-columns:repeat(3,1fr);
}

/* 🔴 O ESPAÇO QUE SEPARA OS DOIS BLOCOS DA SEÇÃO 01 (pedido do dono,
   2026-09-16): *"aumente o espaco entre as imagens dos pratos do cardapio e o
   titulo pratos do dia"*.

   ⚠️ O VALOR ANTERIOR ERA ZERO, MEDIDO — não "apertado", zero. Os dois blocos
   estão em `.container` irmãos; `h2` tem `margin:0 0 .5em` (sem margem
   SUPERIOR) e a `.grade-pratos` fecha sem margem inferior. Nada estava
   quebrado: faltava regra.

   🔴 64px E NÃO 38px (o `mt-l`), e a escolha tem critério: dentro de cada
   bloco o respiro é 38px (título → fotos). Separar os DOIS blocos com os
   mesmos 38px deixaria a hierarquia plana — a distância entre um título e as
   fotos que ele nomeia ficaria igual à distância entre duas seções. 64px
   coloca a separação externa acima da interna, que é o que faz "Pratos do
   Dia" ser lido como começo de bloco novo em vez de legenda do de cima.

   ⚠️ Vale nos dois tamanhos de tela: no telefone as duas grades ficam em 2
   colunas e a confusão que o dono relatou seria a MESMA, ou pior, porque os
   blocos empilham mais perto. Sem media query aqui de propósito. */
.pratododia__titulo{ margin-top:64px; }
.pratododia__item{ margin:0; overflow:hidden; }
.pratododia__img{
  width:100%; height:auto; aspect-ratio:1; object-fit:cover; display:block;
  transition:transform 500ms cubic-bezier(.2,0,.2,1);
}
.pratododia__item:hover .pratododia__img{ transform:scale(1.04); }

/* No telefone as DUAS grades viram 2 colunas, e a de cima mudou em 2026-09-16.
   ⚠️ ATÉ HOJE `.grade-pratos` caía para UMA coluna, e o motivo escrito aqui era
   a proporção: três fotos 3:2 lado a lado dariam ~110px de ALTURA num container
   de 390px, ilegível. Esse motivo CAIU junto com o 3:2 — em 1:1 a foto tem a
   altura da largura, e o mesmo raciocínio que põe as 6 de baixo em 2 colunas
   ("a foto quadrada ainda lê bem a ~180px") vale igualmente para estas 3.
   Mantê-las em coluna única daria três fotos gigantes em cima e seis pequenas
   embaixo — o oposto do "mesmo tamanho" que o dono pediu.
   ⚠️ Em 2 colunas a terceira foto cai sozinha na segunda linha. É aceito: são
   3 itens numa grade par, e a alternativa (3 colunas a ~120px) é a ilegibilidade
   que o texto antigo já recusava. */
@media (max-width:640px){
  .grade-pratos{ grid-template-columns:repeat(2,1fr); }
  .pratododia{ grid-template-columns:repeat(2,1fr); }
}

/* O `:hover` de escala é enfeite, não informação — sai sob reduced-motion,
   como o resto do site faz. */
@media (prefers-reduced-motion:reduce){
  .grade-pratos__img,
  .pratododia__img{ transition:none; }
  .grade-pratos__item:hover .grade-pratos__img,
  .pratododia__item:hover .pratododia__img{ transform:none; }
}

/* Story 1.60 — AS 4 FOTOS DO PILAR 10h VIRARAM GRADE (`/cowork.php`, seção 01).
   ⚠️ ISTO SUBSTITUI O CARROSSEL das Stories 1.56/1.59, por DECISÃO DO DONO em
   2026-09-16, depois de ver renderizado: "quero que vc coloque as imagens do
   café, notebook, etc no mesmo formato que estão as imagens da casa".

   🔴 O QUE ELE RECUSOU, e por que o carrossel produzia exatamente isso. O
   trilho era `max-width:min(340px,62%)` com `flex:0 0 100%` por item — UMA foto
   por vez, numa coluna estreita. E `.carrossel10h__img` com aspect-ratio livre
   devolvia a proporção REAL de cada arquivo, o que num retrato de 533×799
   dentro de 340px de largura dava ~510px de altura: o cartão altíssimo e a
   faixa vazia embaixo que ele fotografou. Cada uma dessas três decisões estava
   bem-argumentada na 1.56 — e as três juntas davam o formato que ele reprovou.

   🔴 A REFERÊNCIA É A SEÇÃO 03 ("O espaço"), que ele apontou como o certo.
   Aquela seção não tem CSS próprio: ela usa `.destaques` + `.destaque__img`
   (linhas ~967 e ~987). É por isso que ESTE bloco quase não existe — o
   `.carrossel10h__trilho` virou a mesma grade do `.destaques`, e as 4 fotos
   passam a herdar `aspect-ratio:4/3` + `object-fit:cover` da regra geral, como
   as 3 da casa. A única regra própria que sobra é o `object-position` do drink.

   O `max-width` sumiu: o teto de 340px existia para o carrossel não dominar a
   tela com UMA foto grande. Em grade de 4 o problema é o inverso — largura é o
   que permite 4 cartões lado a lado. A régua da 1.51 continua valendo onde ela
   nasceu (`.destaque--cafe`, foto única), não aqui.

   O `scroll-snap`, o `overflow-x` e o `@media (prefers-reduced-motion)` do
   trilho saíram JUNTOS, e é coerência, não descuido: eles existiam para
   governar uma rolagem horizontal que não existe mais. Um `scroll-behavior` a
   zerar numa grade que não rola seria regra órfã apontando para o mecanismo
   antigo — exatamente o tipo de resíduo que fez a 1.59 custar uma story. */
.carrossel10h{ margin-inline:0; }
.carrossel10h__trilho{
  display:grid; gap:26px;
  grid-template-columns:repeat(auto-fill,minmax(268px,1fr));
  list-style:none; margin:0; padding:0;
}
/* O `<li>` é só invólucro da grade; quem desenha o cartão é o `.destaque`
   dentro dele. `flex:1` faz o cartão ocupar a célula inteira — sem isto, o
   `<article>` teria a altura do próprio conteúdo e os cartões da linha
   ficariam desalinhados na base, que é metade do defeito que o dono apontou. */
.carrossel10h__item{ min-width:0; display:flex; }
.carrossel10h__item > .destaque{ flex:1; }

/* 🔴 O RECORTE DO RETRATO, E É DELIBERADO. A posição 4 (`jabuticaba-mule`,
   533×799) é a única retrato do conjunto. Em 4/3 com `cover`, sobra uma faixa
   de 533×400 — 50,1% da altura do arquivo. Com o `center` padrão essa faixa
   seria y=200..600, e o gargalo do sifão + a mão (y≈0..200) ficariam de fora.

   `object-position:50% 28%` sobe a janela para y≈112..512, que é o intervalo
   que contém a mão, o bico do sifão, o fio de drink caindo e a boca da caneca
   laranja — o essencial da foto. Conferido na imagem, não estimado no papel.
   A alternativa seria voltar a `object-fit:contain`, que é PRECISAMENTE o que
   produzia o cartão altíssimo reprovado pelo dono. */
.carrossel10h__img[src*="jabuticaba-mule"]{ object-position:50% 28%; }
.destaque__cat{
  font-size:.66rem; font-weight:700; letter-spacing:.2em; text-transform:uppercase;
  color:var(--brasa-texto); margin-bottom:11px;
}
.destaque h3{ font-size:1.14rem; margin-bottom:8px; }
.destaque p{ color:var(--cinza); font-size:.92rem; flex:1; margin-bottom:16px; }
/* Sem descrição, o preço encosta no nome — este espaço mantém o respiro
   e alinha o preço na base de todos os cards, que têm altura igual. */
.destaque__texto .destaque__preco{ margin-top:auto; padding-top:14px; }
.destaque__preco{
  font-family:var(--ds-serif); font-size:1.28rem; font-weight:600; color:var(--vinho);
}
.destaque__preco small{
  display:block; font-size:.7rem; color:var(--cinza);
  font-family:var(--ds-sans); margin-top:2px;
}

/* Vitrine — mosaico de fotos, DENTRO do container (Story 1.63) */
/* Colunas FIXAS por faixa de largura (não auto-fill): assim dá para esconder
   exatamente as fotos que sobrariam na última fila e nunca deixar buraco. */

/* 🔒 AS QUEBRAS DESTA GRADE FICAM FORA DA RÉGUA DO DESIGN SYSTEM.
   ===========================================================================
   DECISÃO DO DONO, 2026-08-26 (Story 8.3), ALTERADA POR DECISÃO DO DONO,
   2026-09-16 (Story 1.63). NÃO é esquecimento, e "uniformizar" isto para
   480/768/1024/1440 continua sendo DESFAZER decisão consciente.

   🔴 O QUE A 1.63 MUDOU, E POR QUE A "REGRA DAS 2 FILAS" MORREU AQUI.
   O dono pediu 10 fotos (eram 14) e a grade DENTRO do container (ela sangrava
   100vw). A 8.3 calibrava cada faixa para fechar EXATAMENTE 2 filas cheias —
   propriedade que era CONSEQUÊNCIA de 14 fotos com 7 colunas, não um fim em si.

   Com total 10, ela vira impossível: os divisores de 10 são 1, 2, 5 e 10 —
   QUATRO valores úteis para CINCO faixas. Não existe desenho que mantenha
   "5 faixas distintas" E "2 filas cheias em todas". Uma das duas cede.

   CEDE A "2 FILAS", FICA O "SEM BURACO". Motivo: é o "sem buraco" que o texto
   da 8.3 diz proteger ("ou deixa BURACO na última fila ou ESCONDE foto que o
   dono escolheu mostrar"). O número de filas passa a variar por faixa, e isso
   é aceitável; buraco não é.

       >1400 → 5 col, corta em 11 → 10 fotos → 2,0 filas
       ≤1400 → 5 col, corta em 11 → 10 fotos → 2,0 filas
       ≤1150 → 5 col, corta em 11 → 10 fotos → 2,0 filas
       ≤900  → 2 col, corta em 11 → 10 fotos → 5,0 filas
       ≤640  → 2 col, corta em 11 → 10 fotos → 5,0 filas

   ⚠️ AS TRÊS FAIXAS DE CIMA TÊM O MESMO VALOR, E ISSO NÃO É DUPLICAÇÃO A
   LIMPAR. `--largura` é 1180px: acima de 1180px de viewport o container PARA
   de crescer, então 1400px e 1150px descrevem a MESMA largura de conteúdo
   (1132px úteis). Medido por CDP, não deduzido. Apagar as declarações
   redundantes reprova a asserção de `sql/teste-local.php`, que exige 5
   declarações ESCRITAS — e ela existe justamente para que mexer no número de
   quebras seja visível. Repetir o valor é o desenho, não o descuido.

   ⚠️ 5 COLUNAS NÃO SOBREVIVEM ABAIXO DE 900px: seriam 147px por foto em 800px
   de viewport e 68px em 390px. Por isso as duas faixas de baixo caem para 2
   colunas (368px e 171px por foto) — o outro divisor de 10 que serve. 3 e 4
   colunas deixariam buraco (10/4 = 2,5 e 10/3 = 3,33).

   Os dois `LIMIT` de `index.php` (5 + 5 = 10) são o outro lado deste par: o
   CSS esconde a partir do 11º, e o SQL nunca traz um 11º. Mexer num sem o
   outro ou deixa buraco ou carrega foto que nunca aparece.

   Quem for mexer: as 5 declarações são guardadas por asserção em
   `sql/teste-local.php` ("sem falso positivo: `.vitrine`/grid-template-columns
   tem 5 declarações"). Mudar o número de quebras reprova a suíte de propósito. */
.vitrine{
  display:grid; gap:2px;
  grid-template-columns:repeat(5,1fr);
  background:var(--linha);
  border-block:1px solid var(--linha);
}
/* O corte é sempre múltiplo do nº de colunas — se sobrar foto, ela some; se
   faltar, a fila fecha sozinha. O número de FILAS varia por faixa (2 em cima,
   5 embaixo); o que não varia é a última fila estar cheia. */
.vitrine__item:nth-child(n+11){ display:none; }          /* 5 col → 10 */

@media (max-width:1400px){
  .vitrine{ grid-template-columns:repeat(5,1fr); }
  .vitrine__item:nth-child(n+11){ display:none; }        /* 5 col → 10 */
}
@media (max-width:1150px){
  .vitrine{ grid-template-columns:repeat(5,1fr); }
  .vitrine__item:nth-child(n+11){ display:none; }        /* 5 col → 10 */
}
@media (max-width:900px){
  .vitrine{ grid-template-columns:repeat(2,1fr); }
  .vitrine__item:nth-child(n+11){ display:none; }        /* 2 col → 10 */
}
/* Story 8.12 AC #10 — SÓ o entorno do item muda. As 5 declarações de
   `grid-template-columns` e os 5 cortes `nth-child` acima ficam byte a byte:
   são o par acoplado que fecha 2 filas com o `LIMIT 14`. O item passa a ser
   cartão (`--ds-mesa` + borda), como `.vit__item` da prévia (`:100`).

   `position:relative` sai junto com o `figcaption` absoluto (AC #12b);
   `overflow:hidden` fica, porque o `scale(1.05)` do hover ainda precisa ser
   recortado pela moldura do cartão. */
.vitrine__item{
  margin:0; overflow:hidden;
  background:var(--ds-mesa);
  border:1px solid var(--ds-linha);
}
.vitrine__item img{
  width:100%; aspect-ratio:1; object-fit:cover; display:block;
  transition:transform 500ms cubic-bezier(.2,0,.2,1);
}
.vitrine__item:hover img{ transform:scale(1.05); }
/* AC #12(b) — a legenda SAI DE CIMA DA FOTO. Era `position:absolute` no rodapé
   da imagem, sobre `linear-gradient(transparent,rgba(40,10,11,.9))` — texto
   branco legível só porque a foto era escurecida por baixo. Passa a viver
   ABAIXO da foto, separada por `border-top`, sobre `--ds-mesa`.
   É exatamente o que o dono viu e aprovou na prévia (`:101`, 8 fotos com
   legenda embaixo em cartão branco).

   Ganho medido de contraste: `--ds-breu` (#1D1E1C) sobre `--ds-mesa`
   (#FFFDF8) em vez de #fff sobre foto arbitrária escurecida — a legibilidade
   deixa de depender de quão clara é a foto que o dono subiu.
   ⚠️ O item CRESCE em altura: a legenda deixa de sobrepor e passa a somar.
   Isso não move as quebras (elas governam COLUNA, não altura). */
.vitrine__item figcaption{
  padding:11px 12px;
  border-top:1px solid var(--ds-linha);
  display:flex; flex-direction:column; gap:2px;
}
.vitrine__nome{ font-family:var(--ds-serif); font-size:1rem; font-weight:600; line-height:1.25; }
/* A categoria vira mono (`.vit__cat` da prévia, `:103`) e troca o branco
   translúcido — que só fazia sentido sobre o gradiente — por `--ds-apoio`. */
.vitrine__cat{
  font-family:var(--ds-mono);
  font-weight:400;
  font-size:10px;
  line-height:1.4;
  letter-spacing:.1em; text-transform:uppercase;
  color:var(--ds-apoio);
}
/* A 5ª quebra. Mesmo valor da faixa ≤900 de propósito — ver o bloco 🔒 acima:
   a asserção de `teste-local.php` exige 5 declarações ESCRITAS, e o celular já
   estava em 2 colunas antes desta story. O que mudou aqui foi o CORTE: era 5
   (4 fotos, 2 filas), passa a 11 (as 10, em 5 filas). O dono pediu 10 fotos —
   esconder 6 delas no celular seria entregar outra coisa. */
@media (max-width:640px){
  .vitrine{ grid-template-columns:repeat(2,1fr); }
  .vitrine__item:nth-child(n+11){ display:none; }        /* 2 col → 10 */
}

/* Prova social — Story 8.12 AC #9.
   Era 4 números soltos, centralizados, em serif brasa, sobre a faixa vinho de
   tela cheia. Vira GRADE DE KPI: 4 cartões com borda, rótulo mono em cima e
   número em mono embaixo — `.kpi`/`.kpi__c`/`.kpi__n` da prévia (`:79-85`).

   A seção perdeu o `.secao--vinho` (AC #5): o fundo é a areia da página, e o
   peso visual passa a vir dos cartões, não de uma faixa colorida.
   2 colunas abaixo de 768px, 4 a partir dali — o breakpoint é o do DS. */
.provas{
  display:grid; gap:var(--ds-esp-12);
  grid-template-columns:repeat(2,1fr);
}
@media (min-width:768px){ .provas{ grid-template-columns:repeat(4,1fr); } }
.prova{
  border:1px solid var(--ds-linha);
  background:var(--ds-mesa);
  border-radius:var(--ds-raio-cartao);
  padding:var(--ds-esp-16);
}
/* O primeiro cartão ("No Google") é o ESCURO — `--ds-casco`, o registro
   institucional. É o único ponto de peso da grade: a nota do Google é o dado
   que o dono quer que se leia primeiro. Mesmo padrão de `.kpi__c--escuro`. */
.prova--escuro{
  background:var(--ds-casco);
  border-color:var(--ds-casco);
  color:var(--ds-mesa);
}
.prova__rot{
  font-family:var(--ds-mono);
  font-weight:500;
  font-size:10px;
  line-height:1.3;
  letter-spacing:.12em; text-transform:uppercase;
  color:var(--ds-apoio);
  margin:0;
}
/* #C9A9A0 sobre --ds-casco (#351010) = 6,05:1 — o rótulo do cartão escuro não
   pode herdar `--ds-apoio` (#7A756C), que ali daria 2,4:1 e reprovaria AA. */
.prova--escuro .prova__rot{ color:#C9A9A0; }
/* O NÚMERO EM MONO — a mudança que se vê de longe. Era serif 600 em brasa;
   passa a IBM Plex Mono 500, a fonte de dado do DS, auto-hospedada desde a
   8.1 e até esta story sem nenhum consumidor no site público. */
.prova__n{
  font-family:var(--ds-mono); font-weight:500;
  font-size:clamp(30px,4vw,42px);
  line-height:1; letter-spacing:-.02em;
  margin-top:var(--ds-esp-12); display:block;
}

/* --------------------------------------------------------------------------
   Cardápio
   -------------------------------------------------------------------------- */
.menu-abas{
  position:sticky; top:var(--topo); z-index:60;
  background:var(--papel);
  border-bottom:1px solid var(--linha);
  overflow-x:auto; -webkit-overflow-scrolling:touch;
  scrollbar-width:none;
}
.menu-abas::-webkit-scrollbar{ display:none; }

/* A barra sangra de ponta a ponta (a linha inferior atravessa a tela) e as
   abas ficam CENTRADAS, na mesma vertical do campo de busca logo abaixo.
   Antes elas alinhavam à esquerda do .container: com a busca centralizada, o
   conjunto ficava torto.
   `width:max-content` + `margin-inline:auto` centra quando cabe; quando não
   cabe (celular), o conteúdo fica maior que a barra e o scroll assume — por
   isso NÃO se usa `justify-content:center`, que cortaria a primeira aba ao
   rolar. */
.menu-abas__interno{
  display:flex; gap:2px;
  box-sizing:border-box;
  width:max-content;            /* garante o scroll quando não cabe */
  max-width:calc(var(--largura) + 48px);
  margin-inline:auto;
  padding-inline:6px;
}
@media (max-width:640px){
  /* No celular as 5 abas não cabem na tela: o padding lateral dá respiro nas
     duas pontas do scroll, para a primeira e a última não colarem na borda. */
  .menu-abas__interno{
    max-width:calc(var(--largura) + 40px);
    padding-inline:14px;
  }
}
.menu-abas a{
  padding:17px 18px; text-decoration:none; white-space:nowrap;
  font-size:.78rem; font-weight:700; letter-spacing:.13em; text-transform:uppercase;
  /* `--cor-aba` (Story 1.49): cor própria do menu, vinda de `menus.cor` pelo
     `style` inline. Ausente na esmagadora maioria das abas — o fallback é o
     cinza que sempre esteve aqui.

     ⚠️ Story 1.53 — ESTA REGRA CONTINUA SENDO A DAS 6 ABAS, e por isso o branco
     NÃO entra aqui. Pôr `color:#FFF` nesta declaração pintaria as outras 5 de
     branco sobre fundo claro, apagando-as. O branco mora no seletor
     `[style*="--cor-aba"]` abaixo, que só casa com quem recebeu a variável. */
  color:var(--cor-aba, var(--cinza)); border-bottom:3px solid transparent;
  transition:color var(--transicao),border-color var(--transicao),
             background-color var(--transicao);
}
/* Story 1.49 — a aba de um menu com cor própria (`menus.cor`).
   Hoje só o Família Paulista tem: `#953A34`, terracota amostrada do avatar do
   Instagram do parceiro. As outras 5 abas não recebem a variável e caem no
   fallback, que é exatamente o que elas já usavam — por isso o comportamento
   delas não muda em byte nenhum.

   AS DUAS PROPRIEDADES DO AC #2 estão aqui, e são duas porque uma só não
   distingue a aba: `color` no estado normal (o texto "Família Paulista" sai
   terracota enquanto as outras saem cinza) e, no estado ativo, `color` +
   `border-bottom-color` (o filete embaixo, que nas demais é `--brasa`).

   ⚠️ O ESTADO ATIVO PRECISA REDECLARAR A COR. Sem a linha de `[aria-current]`,
   o seletor mais específico da folha venceria e a aba do parceiro ficaria
   `--vinho` com filete `--brasa` justamente quando estivesse selecionada — ou
   seja, a cor sumiria no único estado em que o cliente está olhando para ela.

   Contraste medido por execução (AC #6): 7,10:1 sobre `--papel`, passa AA e
   também AAA para texto normal. `--brasa`, para comparação, mede 4,43:1 e
   reprova AA — a cor do parceiro é a mais legível das duas.

   O estado NORMAL não aparece aqui: ele mora na regra `.menu-abas a` acima,
   onde a declaração de `color` já nasce com o fallback. Repeti-lo aqui criaria
   duas fontes para a mesma propriedade. */
.menu-abas a:hover{ color:var(--cor-aba, var(--vinho)); }
.menu-abas a[aria-current="true"]{
  color:var(--cor-aba, var(--vinho));
  border-bottom-color:var(--cor-aba, var(--brasa));
}

/* ═══════════════════════════════════════════════════════════════════════════
   Story 1.53 — A ABA DO PARCEIRO INVERTE: bloco sólido terracota, letra branca
   ───────────────────────────────────────────────────────────────────────────
   Pedido literal do dono (2026-09-15): "inverta, deixe o fundo no terra cota e
   as letras de branco." Duas decisões dele, que são requisito e não opção:
   SEMPRE preenchida (bloco sólido em qualquer estado, não só ativa) e SÓ o
   site público (o cardápio impresso fica intocado — tinta e folha).

   🔴 POR QUE O SELETOR É `[style*="--cor-aba"]` E NÃO `.menu-abas a`.
   A regra acima é UMA SÓ para as 6 abas. `cardapio.php:118-120` só emite o
   `style` inline quando `cor_menu()` valida a cor, então as outras 5 não têm a
   variável. Se o branco entrasse na regra compartilhada, as 5 sairiam BRANCAS
   SOBRE FUNDO CLARO — apagadas. Este seletor casa só com quem recebeu a
   variável, que é exatamente o conjunto que ganha fundo sólido. O branco e o
   fundo andam juntos, por construção, e não por coincidência.

   ⚠️ `background` e `color` precisam de tratamentos DIFERENTES, e a assimetria
   é a armadilha desta story:
     · `background-color:var(--cor-aba, transparent)` — o fallback é exigido por
       DESENHO. Sem ele a declaração fica *invalid at computed-value time* nas
       abas sem a variável e cai em `unset` → `initial` → `transparent`. Daria no
       mesmo POR ACIDENTE. A propriedade que a 1.49 estabeleceu é que as outras
       se comportem como antes por desenho, não pelo valor inicial feliz desta
       propriedade específica — é o mesmo motivo de `color:var(--cor-aba,
       var(--cinza))` lá em cima;
     · o branco NÃO tem valor inicial inócuo. Por isso ele fica confinado aqui.

   🔴 O FILETE DO ESTADO ATIVO TEVE DE MUDAR DE COR — e este é o risco central
   que a story nomeia. Com fundo sólido em todos os estados, o
   `border-bottom-color:var(--cor-aba)` da 1.49 vira TERRACOTA SOBRE TERRACOTA:
   o filete some e o visitante perde a indicação de onde está. O sinal novo é
   filete BRANCO.

   Contrastes medidos por execução contra o fundo `#953A34` (não copiados):
     · branco  #FFFFFF → 7,16:1  ✅ (piso de componente gráfico é 3:1, WCAG
       1.4.11; passa com folga, e passaria até o piso de texto, 4,5:1)
     · --brasa #D8411F → 1,60:1  ❌ REPROVA. Foi medido e descartado: a story
       sugeria `--brasa` como caminho possível para o filete, e a medição mostra
       que ele não serve — vermelho sobre terracota quase não se distingue.
   O piso aplicável é o de 3:1 (componente gráfico não textual), porque o sinal
   escolhido é um FILETE, não cor de texto nem peso de fonte. O branco passa
   pelos dois pisos de qualquer modo.
   ═══════════════════════════════════════════════════════════════════════════ */
.menu-abas a[style*="--cor-aba"]{
  background-color:var(--cor-aba, transparent);
  color:#FFF;
  border-bottom-color:transparent;
}
/* O preenchimento NÃO se perde no hover nem no ativo (decisão D1 do dono). */
.menu-abas a[style*="--cor-aba"]:hover{
  background-color:var(--cor-aba, transparent);
  color:#FFF;
}
/* O ESTADO ATIVO, distinguível: filete BRANCO sobre o bloco terracota.
   `!important` não é usado — a especificidade deste seletor (0,2,1 com o
   atributo + `aria-current`) já vence a regra da 1.49 acima (0,2,1 empatado,
   resolvido pela ordem: esta vem depois). */
.menu-abas a[style*="--cor-aba"][aria-current="true"]{
  background-color:var(--cor-aba, transparent);
  color:#FFF;
  border-bottom-color:#FFF;
}

.busca-caixa{ padding:26px 0 6px; }
/* Centralizada, na mesma vertical das abas logo acima — as duas juntas
   formam o cabeçalho do cardápio e precisam partilhar o mesmo eixo. */
.busca-campo{
  position:relative; max-width:460px; margin-inline:auto;
}
.busca-campo input{
  width:100%; padding:14px 16px 14px 44px;
  font-family:var(--ds-sans); font-size:1rem;
  border:1.5px solid var(--linha); border-radius:var(--raio);
  background:var(--papel); color:var(--tinta);
}
.busca-campo input:focus{ border-color:var(--brasa); }
.busca-campo svg{
  position:absolute; left:15px; top:50%; transform:translateY(-50%);
  width:17px; height:17px; stroke:var(--cinza); fill:none; stroke-width:2;
}

/* Ícone de link externo — Story 1.63, Ajuste 7 (substitui o caractere `↗`).
   ⚠️ O TAMANHO É EM `em`, NÃO EM `px`. O ícone substitui um caractere e tem de
   acompanhar o tamanho do texto em volta: os 5 links vivem em contextos
   tipográficos diferentes (`.secao__texto` em `almoco.php`, um `display:flex`
   com `gap` em `cardapio.php`). Cravar `12px` deixaria o ícone grande demais no
   texto pequeno e pequeno demais no grande — que é exatamente o defeito que o
   `↗`, sendo caractere, não tinha.
   ⚠️ `vertical-align:-.08em` em vez de `middle`: `middle` alinha pelo meio da
   altura-x e deixa o ícone flutuando acima da linha de base em fonte serifada.
   O valor foi ajustado olhando o link renderizado, não copiado de outro projeto.
   A cor não aparece aqui de propósito — vem de `currentColor` no próprio SVG. */
.icone-link-externo{
  width:.78em; height:.78em;
  vertical-align:-.08em;
  margin-inline-start:.28em;
}

.cat{ padding:44px 0 8px; scroll-margin-top:132px; }
.cat__titulo{
  display:flex; align-items:baseline; gap:16px;
  border-bottom:2px solid var(--vinho);
  padding-bottom:11px; margin-bottom:6px;
}
.cat__titulo h2{ font-size:1.5rem; margin:0; }
.cat__contagem{ font-size:.74rem; color:var(--cinza); letter-spacing:.1em; }

.itens{ list-style:none; margin:0; padding:0; }
.item{
  display:flex; align-items:baseline; gap:14px;
  padding:19px 0;
  border-bottom:1px solid var(--linha);
}
.item:last-child{ border-bottom:0; }
.item__corpo{ flex:1; min-width:0; }
.item__nome{
  font-family:var(--ds-serif); font-size:1.09rem; font-weight:600;
  color:var(--vinho); margin:0 0 4px; line-height:1.3;
}
.item__desc{
  font-size:.93rem; color:var(--cinza); margin:0; line-height:1.55;
  max-width:62ch;
}

/* Descrição com 3 linhas ou mais mostra só 2 + botão "Saiba mais".
   Quem tem 1 ou 2 linhas aparece inteiro, sem botão. O JS marca
   [data-cortavel] só onde o texto realmente transborda — assim o corte
   acompanha a largura da tela, e não uma contagem de caracteres. */
.item__texto[data-cortavel] .item__desc{
  display:-webkit-box;
  -webkit-box-orient:vertical;
  -webkit-line-clamp:2;
  overflow:hidden;
}
.item__texto[data-cortavel][data-aberto] .item__desc{
  -webkit-line-clamp:unset;
  display:block;
}
.item__mais{
  display:none;                          /* só aparece se o JS marcar */
  align-items:center; gap:6px;
  background:none; border:0; padding:4px 0; margin-top:2px;
  font-family:var(--ds-sans); font-size:.72rem; font-weight:700;
  letter-spacing:.12em; text-transform:uppercase;
  color:var(--brasa-texto); cursor:pointer;
  min-height:32px;                       /* alvo de toque no celular */
}
.item__texto[data-cortavel] .item__mais{ display:inline-flex; }
.item__mais::after{ content:"+"; font-size:.95rem; font-weight:400; line-height:1; }
.item__texto[data-aberto] .item__mais::after{ content:"–"; }
.item__mais:hover{ color:var(--vinho); }
.item__mais:focus-visible{ outline:2px solid var(--brasa); outline-offset:3px; }
.item__preco{
  font-family:var(--ds-serif); font-size:1.13rem; font-weight:600;
  color:var(--tinta); white-space:nowrap; flex:none; text-align:right;
}
.item__preco small{
  display:block; font-family:var(--ds-sans); font-size:.66rem;
  color:var(--cinza); font-weight:400; letter-spacing:.05em; margin-top:2px;
}
/* Prato lançado antes do preço fechar (ex.: novidades de Agosto/2026).
   Sai em caixa alta discreta, sem o peso de serifa do preço real — o cliente
   lê "consulte" como recado, não como valor. */
.item__preco .preco-consulte{
  font-family:var(--ds-sans); font-size:.72rem; font-weight:600;
  letter-spacing:.12em; text-transform:uppercase; color:var(--cinza);
}
.item__selo{
  display:inline-block; font-size:.6rem; font-weight:700;
  letter-spacing:.16em; text-transform:uppercase;
  color:var(--brasa-texto); border:1px solid currentColor;
  padding:2px 7px; margin-left:9px; vertical-align:middle;
}

/* Miniatura do item */
.item__miniatura{
  flex:none; width:88px; height:88px; padding:0; border:0; cursor:zoom-in;
  background:var(--creme); border-radius:2px; overflow:hidden;
  align-self:center;
}
.item__miniatura img{
  width:100%; height:100%; object-fit:cover; display:block;
  transition:transform var(--transicao);
  /* O Safari usa os atributos width/height do <img> para calcular a
     proporção e, dentro de um <button>, isso vencia o height:100% — a
     miniatura colapsava e sobrava só o fundo. Fixar a proporção aqui
     torna o layout independente do que vier nos atributos. */
  aspect-ratio:1;
  min-height:100%;
}
.item__miniatura:hover img{ transform:scale(1.06); }
@media (max-width:640px){
  .item__miniatura{ width:70px; height:70px; }
}

/* Lightbox */
.lightbox{
  position:fixed; inset:0; z-index:200;
  background:rgba(29,29,27,.94);
  display:flex; align-items:center; justify-content:center;
  padding:28px;
}
.lightbox__figura{ margin:0; max-width:min(880px,92vw); text-align:center; }
.lightbox__figura img{
  max-width:100%; max-height:78vh; object-fit:contain;
  border-radius:2px; margin-inline:auto;
}
.lightbox__figura figcaption{
  color:#fff; font-family:var(--ds-serif); font-size:1.1rem; margin-top:16px;
}
.lightbox__credito{
  color:rgba(255,255,255,.55); font-size:.76rem; margin:8px 0 0;
}
.lightbox__credito:empty{ display:none; }

.lightbox__fechar{
  position:absolute; top:18px; right:22px;
  background:none; border:0; color:#fff; font-size:2.6rem; line-height:1;
  cursor:pointer; padding:8px 14px; min-height:48px;
}
.lightbox__fechar:hover{ color:var(--brasa); }

.vazio{ padding:56px 0; text-align:center; color:var(--cinza); }

/* --------------------------------------------------------------------------
   Formulários
   -------------------------------------------------------------------------- */
.form{ display:grid; gap:20px; }
.form__linha{ display:grid; gap:20px; grid-template-columns:1fr 1fr; }
@media (max-width:640px){ .form__linha{ grid-template-columns:1fr; } }

.campo{ display:flex; flex-direction:column; gap:7px; }
.campo label{
  font-size:.73rem; font-weight:700; letter-spacing:.14em; text-transform:uppercase;
  color:var(--vinho);
}
.campo label .opc{ color:var(--cinza); font-weight:400; letter-spacing:.04em; text-transform:none; }
/* Story 8.2 — campo do §5.8.

   ⚠️ `font-size:16px` LITERAL, não `1rem`. A razão de existir desta regra é
   a nota normativa do §5.8/§7.2: "CAMPOS A 16PX PARA NÃO DISPARAR ZOOM NO
   IOS". `1rem` só vale 16px enquanto a raiz for 16px — dependência frágil
   para uma regra cuja falha é silenciosa (o iOS dá zoom, ninguém vê no
   desktop). O valor absoluto não depende de quem mexer na raiz amanhã. */
.campo input,.campo select,.campo textarea{
  font-family:var(--ds-sans); font-size:16px; font-weight:400; line-height:1;
  padding:13px;
  border:1px solid var(--ds-linha); border-radius:var(--ds-raio-3);
  background:var(--ds-mesa); color:var(--ds-breu);
  width:100%;
  transition:border-color var(--transicao);
  min-height:48px;
}
.campo textarea{ resize:vertical; min-height:96px; }
.campo input:focus,.campo select:focus,.campo textarea:focus{
  border-color:var(--brasa);   /* sem outline:none — anulava o :focus-visible global */
}
/* #C0392B é o vermelho de ERRO, deliberadamente separado do vermelho de marca
   (--brasa): confundir "campo inválido" com "ação primária da casa" é o
   contrário do que o estado precisa comunicar. Cor funcional, fora da paleta
   de marca por decisão mantida na Story 4.16 (AC #8), como #25D366 (WhatsApp).

   ⚠️ COLISÃO COM O DS — DECIDIDA PELO DONO EM 2026-08-26: fica #C0392B.
   O §5.8 pede `border:1px solid #D8411F` (brasa) na BORDA do campo em erro e
   `color:#B93417` na MENSAGEM — dois hex diferentes, não um só (correção do
   registro: a primeira redação desta story citava #D8411F para os dois).
   O dono foi consultado e preferiu PRESERVAR a decisão da Story 4.16 AC #8:
   confundir "campo inválido" com "ação primária da casa" é o contrário do
   que o estado precisa comunicar. Divergência consciente, não pendência —
   não "corrigir" para o brasa por achar que ficou esquecido. */
.campo input[aria-invalid="true"],.campo select[aria-invalid="true"]{ border-color:#C0392B; }
/* Tipografia do §5.8 (isto é tipografia, não semântica de cor); a cor segue
   sendo a funcional de erro, pelo motivo acima. */
.campo__erro{ font-family:var(--ds-sans); font-size:11px; font-weight:500; line-height:1.4; color:#C0392B; margin-top:7px; }
.campo__dica{ font-size:.83rem; color:var(--cinza); }

/* --------------------------------------------------------------------------
   Portal do WiFi — lido no celular, quase sempre em pé e com pressa
   -------------------------------------------------------------------------- */
.wifi{ max-width:560px; }

/* A senha é o que a pessoa veio buscar: grande, selecionável e com espaço
   para o toque de "copiar" do celular. */
/* Conectar sem digitar: no iPhone, um perfil de configuração; em qualquer
   aparelho, copiar a senha. O que aparece depende do sistema (ver o JS). */
.wifi-conectar{ margin:8px 0 22px; display:grid; gap:10px; }
.wifi-conectar .campo__dica{ margin:-4px 0 6px; }

/* Os quatro toques que o iOS exige, numerados. Ficam à vista ANTES do botão:
   quem para na primeira confirmação acha que deu errado. */
.wifi-passos{
  margin:-2px 0 2px; padding:14px 18px 14px 34px;
  background:var(--creme); border-left:3px solid var(--brasa);
  font-size:.88rem; line-height:1.6; color:var(--cinza);
}
.wifi-passos li{ margin:0 0 6px; }
.wifi-passos li:last-child{ margin-bottom:0; }
.wifi-passos strong{ color:var(--vinho); }

/* Story 8.2 — cartão de conteúdo do §5.29.

   ⚠️ SEM `border-radius`, e isso é a espec, não esquecimento: o §5.29 não
   declara raio algum para o cartão de conteúdo. O 4px de `--ds-raio-cartao`
   é do KPI card, dock, dialog e command palette (§3.2) — todos do painel. O
   §3.2 confirma que o raio dos "cartões de seção" é 0.

   `border-left:3px solid` é decoração fora do DS (o DS silencia): PRESERVADA,
   com a cor migrando para o token novo.

   Padding responsivo do §4.2 (`cardPad`): 18px < 480px, 20px de 480 a 767px,
   26px de 768px para cima. Nenhum dos três está na régua --ds-esp-* (4/8/12/
   16/24/32/48/64) — são literais da espec, e arredondar para o degrau mais
   próximo trocaria o valor normativo por um palpite. As quebras 480/768 são
   a régua do DS (decisão 7), não a antiga do site. */
.wifi-cartao{
  background:var(--ds-mesa); border:1px solid var(--ds-linha);
  border-left:3px solid var(--ds-brasa);
  padding:18px; margin:8px 0 26px;
}
@media (min-width:480px){ .wifi-cartao{ padding:20px; } }
@media (min-width:768px){ .wifi-cartao{ padding:26px; } }
.wifi-cartao__rot{
  font-size:.68rem; font-weight:700; letter-spacing:.18em;
  text-transform:uppercase; color:var(--cinza); margin:0 0 4px;
}
.wifi-cartao__rot + .wifi-cartao__val{ margin-bottom:18px; }
.wifi-cartao__val{
  font-family:var(--ds-serif); font-size:1.45rem; font-weight:600;
  color:var(--vinho); margin:0; word-break:break-all;
  user-select:all;                     /* um toque seleciona tudo */
}
.wifi-cartao__val--senha{ font-size:1.9rem; letter-spacing:.02em; }

/* O opt-in é um alvo de toque inteiro, não só a caixinha de 19px. */
.wifi-optin label{
  display:flex; gap:11px; align-items:flex-start; cursor:pointer;
  font-size:.9rem; line-height:1.5; color:var(--cinza);
  text-transform:none; letter-spacing:0; font-weight:400;
}
.wifi-optin input{
  width:21px; height:21px; flex:none; margin-top:2px;
  accent-color:var(--brasa);
}

.aviso{
  padding:16px 18px; border-left:3px solid var(--brasa);
  background:var(--creme); font-size:.93rem; color:var(--cinza);
}
.aviso--erro{ border-color:#C0392B; background:#FDF2F0; color:#8C2A1E; }
.aviso--ok{ border-color:var(--oliva); background:#F3F6EA; color:#3F4A19; }

/* --------------------------------------------------------------------------
   Rodapé
   -------------------------------------------------------------------------- */
.rodape{
  background:var(--vinho-escuro); color:rgba(255,255,255,.72);
  padding:66px 0 calc(30px + env(safe-area-inset-bottom,0px));
}
.rodape__grade{
  display:grid; gap:40px;
  grid-template-columns:1.4fr 1fr 1fr;
  padding-bottom:38px; border-bottom:1px solid rgba(255,255,255,.13);
}
@media (max-width:820px){ .rodape__grade{ grid-template-columns:1fr; gap:32px; } }
.rodape h3{
  color:#fff; font-family:var(--ds-sans); font-size:.72rem; font-weight:700;
  letter-spacing:.2em; text-transform:uppercase; margin-bottom:16px;
}
.rodape a{ color:rgba(255,255,255,.78); text-decoration:none; }
/* .94rem sobre --vinho-escuro: texto miúdo, régua 4,5. O --brasa normativo dá
   4,12:1 ali e reprova; a derivada clara dá 5,08:1. */
.rodape a:hover{ color:var(--brasa-claro); }
.rodape ul{ list-style:none; margin:0; padding:0; display:grid; gap:9px; font-size:.94rem; }
.rodape__frase{
  font-family:var(--ds-serif); font-style:italic; font-size:1.04rem;
  color:rgba(255,255,255,.62); max-width:34ch; line-height:1.6;
}
.rodape__base{
  display:flex; flex-wrap:wrap; justify-content:space-between; gap:14px;
  padding-top:26px; font-size:.8rem; color:rgba(255,255,255,.45);
}
.horario-linha{ display:flex; justify-content:space-between; gap:18px; }
.horario-linha[data-hoje="1"]{ color:#fff; font-weight:600; }

/* --------------------------------------------------------------------------
   Utilidades
   -------------------------------------------------------------------------- */
.so-leitor{
  position:absolute!important; width:1px; height:1px;
  padding:0; margin:-1px; overflow:hidden;
  clip:rect(0,0,0,0); white-space:nowrap; border:0;
}
[hidden]{ display:none!important; }
.centro{ text-align:center; }
.mt-l{ margin-top:38px; }

/* Botão flutuante de WhatsApp */
.zap{
  position:fixed; z-index:90;
  /* Com viewport-fit=cover o conteúdo vai até a borda: sem estes offsets
     o botão fica sob a barra de gestos do iPhone. */
  right:calc(20px + env(safe-area-inset-right,0px));
  bottom:calc(20px + env(safe-area-inset-bottom,0px));
  width:56px; height:56px; border-radius:50%;
  background:#25D366; color:#fff;
  display:flex; align-items:center; justify-content:center;
  box-shadow:0 6px 22px rgba(0,0,0,.26);
  transition:transform var(--transicao);
}
.zap:hover{ transform:scale(1.07); }
.zap svg{ width:29px; height:29px; fill:currentColor; }

@media print{
  .cabecalho,.rodape,.zap,.menu-abas,.busca-caixa,.hero__acoes{ display:none!important; }
  body{ font-size:11pt; }
  .cat{ page-break-inside:avoid; }
}

/* ---------- Seletor de idioma do cardápio ---------- */
/* Fica no cabeçalho, fora do <nav>: no celular o menu vive fechado, e quem
   senta na mesa e abre o QR precisa do idioma à mão, sem abrir o hambúrguer. */
.idiomas{
  display:flex; gap:2px; align-items:center;
  border:1px solid rgba(255,255,255,.28); border-radius:999px;
  padding:2px; margin-left:auto;
}
.idiomas a{
  display:block; padding:5px 10px; border-radius:999px;
  font-size:.72rem; font-weight:600; letter-spacing:.08em;
  color:rgba(255,255,255,.72); text-decoration:none; line-height:1;
  transition:background-color .12s, color .12s;
}
.idiomas a:hover{ color:#fff; background:rgba(255,255,255,.12); }
.idiomas a[aria-current]{ background:var(--brasa-texto); color:#fff; }
.idiomas a:focus-visible{ outline:2px solid #fff; outline-offset:1px; }

@media (max-width:900px){
  /* No celular o hambúrguer é o último elemento da linha; o seletor entra
     antes dele, e não pode empurrar a logo para fora da tela. */
  .idiomas{ margin-left:0; order:2; }
  .hamburger{ order:3; }
  /* Alvo de toque de 44px (mínimo recomendado). Medido antes: 35x23px — dedo
     em movimento erra esse tamanho, e errar aqui troca o idioma da página.

     🔴 O QUE DEU ERRADO ATÉ 2026-08-27 (o dono viu no celular e mandou foto).
     A versão anterior buscava os 44px pela ALTURA REAL do <a> (`min-height:44px`
     com `padding:12px 11px`). Medido em Chromium: 38x44 — mais ALTO que largo,
     ratio 0.86. E o `border-radius:999px` herdado do desktop (l. 1408) não é
     redeclarado aqui: num retângulo quase quadrado, 999px satura em 50% do lado
     menor e vira CÍRCULO. O PT (que tem fundo) aparecia como bola; EN e ES, sem
     fundo, viravam texto solto. Os três estavam igualmente deformados — só o
     fundo denunciava um deles. O comentário antigo dizia "a pílula continua
     discreta"; não continuou.

     POR QUE NÃO BASTA AUMENTAR O PADDING. Medido a 320px: o cabeçalho já está
     saturado. marca 87.6 + hambúrguer 44 + 2 gaps de 20 + padding 20+20 = 211.6,
     e a cápsula ocupava 126.3 num orçamento de 108.4. Subir de 11px para 12px já
     estourava a viewport (324/320). O padding sozinho não cabe no aparelho
     estreito.

     A CORREÇÃO SEPARA AS DUAS COISAS que estavam presas uma na outra:
       - a CAIXA PINTADA (fundo + raio) passa a ter 32px de altura, e com
         `padding:0 14px` fica 44x32 → ratio ~1.40, pílula de verdade;
       - o ALVO DE TOQUE continua 44px, agora garantido por um ::after
         transparente e centrado, que estende a área clicável sem pintar nada.
         Verificado por hit-test: `elementFromPoint` 20px acima e 20px abaixo do
         centro ainda devolve o <a>. O DS (§5.4/§7.1) exige 44px e ele continua
         inteiro — o que mudou é o formato, não o tamanho do alvo.

     O raio 999px é MANTIDO de propósito: é o token do DS para chip/pill (§5.6),
     que resolve a forma pelo padding horizontal, não trocando o raio. O defeito
     nunca foi o raio — era a caixa quase quadrada embaixo dele.

     O gap do cabeçalho cai de 20px para 12px SÓ no celular: é o que faz a
     cápsula de 144.3 caber a 320px (folga de 12px até a logo, que continua
     inteira em tela — ver a asserção de largura×altura na suíte). */
  .idiomas a{
    padding:0 14px; font-size:.7rem;
    min-height:32px; display:flex; align-items:center; justify-content:center;
    position:relative;
  }
  .idiomas a::after{
    content:''; position:absolute; left:0; right:0; top:50%;
    transform:translateY(-50%); height:44px;
  }
  .cabecalho__interno{ gap:12px; }
}

/* ---------- Ficha técnica do vinho ---------- */
/* Três linhas curtas, em ordem de decisão:
   1. ficha  — produtor · uva · região · estilo · teor  (o que filtra)
   2. nota   — como o vinho é, em 4 a 8 palavras        (o que convence)
   3. harmoniza — com que prato desta casa vai bem       (o que vende junto)
   Texto longo trava a leitura da carta; por isso cada uma cabe numa linha. */
.item__ficha{
  font-size:.8rem; color:var(--cinza); margin:3px 0 0;
  letter-spacing:.01em; line-height:1.45;
}
.item__nota-vinho{
  font-size:.9rem; color:var(--tinta); margin:5px 0 0;
  line-height:1.5; font-style:italic;
}
.item__harmoniza{
  font-size:.82rem; color:var(--cinza); margin:3px 0 0; line-height:1.45;
}

/* Selos editoriais. Ficam ao lado do nome, no mesmo lugar do "da casa".
   Cores distintas para não se confundirem entre si nem com o selo da casa. */
.item__selo--sommelier{
  background:var(--vinho); color:#fff; border-color:var(--vinho);
}
.item__selo--custo{
  background:var(--oliva); color:#fff; border-color:var(--oliva);
}

/* --------------------------------------------------------------------------
   Happy hour — Story 1.10
   Sem componente novo de layout: a seção da home é `.secao--vinho` e a faixa
   do cardápio reaproveita `.item__selo`, que já é o padrão de etiqueta da casa.
   -------------------------------------------------------------------------- */

/* Selo de promoção no item. Terceira variante do mesmo `.item__selo` usado por
   "da casa" e pelos selos de vinho.

   Fundo é --brasa-texto, NÃO --brasa: o selo tem .6rem (texto miúdo, régua AA
   de 4,5), e branco sobre o --brasa normativo dá 4,47:1 — reprova por pouco.
   Sobre --brasa-texto dá 5,36:1. Mesmo raciocínio que a base já aplica no par
   --brasa/--brasa-texto: o normativo para área grande, a derivada para
   tipografia miúda. Medido, não estimado. */
.item__selo--promo{
  background:var(--brasa-texto); color:#fff; border-color:var(--brasa-texto);
}

/* A frase do dia na home. Sobre --vinho, então o texto miúdo usa o par já
   auditado (--brasa-claro, 4,69:1) — nada de cor nova sem medir contraste.

   Story 1.13: o branco subiu de .86 para .92 de alfa. O dono reclamou de texto
   "apagado" e pediu para clarear mantendo o fundo vinho. Composto sobre
   --vinho, .86 dava 12,79:1 e .92 dá 14,50:1 — os dois passam AA com folga, e
   a mudança é de legibilidade percebida, não de conformidade. */
.secao__texto--hh{ color:rgba(255,255,255,.92); font-size:1.12rem; margin:0; }

/* Story 1.13 — a seção do happy hour respira menos que as demais.
   O padrão `.secao` é clamp(64px,9vw,104px); aqui é clamp(44px,6vw,68px),
   ESTRITAMENTE menor nos três valores. Motivo: a seção tem 4 linhas curtas de
   conteúdo e ocupava quase uma tela inteira — o segundo defeito reprovado pelo
   dono. A asserção em `sql/teste-happy-hour.php` lê estes números do CSS real e
   falha se voltarem a igualar ou exceder o padrão. */
.secao--hh{ padding:clamp(44px,6vw,68px) 0; }
/* O cabeçalho padrão reserva 46px depois do bloco; aqui o conteúdo é o próprio
   cabeçalho, então a folga sobrando viraria o espaço vazio de novo. */
.secao__cabecalho--hh{ margin-bottom:0; }
.secao__cabecalho--hh h2{ margin-bottom:.35em; }

/* ===========================================================================
   HAPPY HOUR — ABAS POR DIA SOBRE PAINEL ESCURO (Story 8.13, 2026-08-27)
   ===========================================================================
   Substitui a faixa `--vinho` de largura total que vinha da 1.10/1.13. O
   desenho é o da imagem aprovada pelo dono
   (`docs/design-system/referencias/happy-hour-abas-aprovado-2026-08-27.png`):
   barra de 5 abas (SEG-SEX) sobre `--ds-breu`, e abaixo o painel do dia.

   ⚠️ A imagem é referência de LAYOUT, não de conteúdo: ela mostra "Fitzgerald"
   sob a aba SEXTA, e Fitzgerald é o drink de QUINTA (`bootstrap.php:490`). O
   texto vem de `HAPPY_HOUR_RODIZIO` e de `t()`, nunca copiado da imagem.

   🔴 POR QUE ESTE BLOCO PÔDE SER ESCRITO AGORA, e não nas duas stories
   anteriores: os mutantes M12-M15 localizavam CSS por string literal exata, e
   qualquer edição aqui os convertia em "sobreviventes por alvo não
   encontrado" — perda de cobertura com a suíte verde. A Primeira Metade desta
   story (AC #1-#6) trocou a localização por seletor+propriedade
   (`css_span_valor_813()`, na fonte única), e só depois disso o CSS foi
   tocado. É a cláusula-portão do AC #7. */
.secao--hh-abas{
  background:var(--ds-breu);
  color:var(--ds-mesa);
}
/* O número da seção sobre fundo escuro. `--ds-brasa` (#D8411F) sobre
   `--ds-breu` (#1D1E1C) mede **3,74:1** pela fórmula WCAG — abaixo do 4,5:1
   que AA pede para texto pequeno. A suíte MEDE e trava esse número
   (`teste-happy-hour.php`, AC #16, exige 3,74 ± 0,02), então mudar a cor sem
   medir de novo acusa.

   ⚠️ É EXCEÇÃO CONSCIENTE, não descuido: a decisão 2 do README do design
   system põe fidelidade ao DS acima de WCAG AA, e o Brasa sobre o painel
   escuro é o acento da imagem aprovada pelo dono. A exceção está declarada na
   lista de `teste-local.php` — não é reprovação silenciosa.

   🔴 Este comentário dizia "4,58:1 — passa AA" até o pós-gate da 8.13
   (MED-1 do `@qa`, que recalculou 3,7424:1). O número era falso E afirmava
   conformidade inexistente logo acima da regra — pior que não comentar, porque
   quem lesse concluiria que não havia exceção a declarar. A asserção do código
   já estava certa; só a prosa mentia. */
.secao__n--hh{ color:var(--ds-brasa); }
/* O rótulo mono do cabeçalho, na paleta escura. `--ds-linha` (#DED8CD) sobre
   `--ds-breu` mede 12,6:1 — folga larga.

   ⚠️ ESTA REGRA SÓ MUDA A COR. O CORPO É HERDADO da `.rotulo` (10px), e isso é
   deliberado — leia antes de "melhorar" o rótulo do happy hour.

   🔴 CORREÇÃO 6 (2026-08-27): aqui houve um `font-size:11px` por algumas horas,
   e o DONO MANDOU DESFAZER. Palavras dele: *"minha solicitacao deixara o bloco
   fora do padrao. mantenha o happy hour do tamanho que esta"*.

   O que aconteceu, registrado para não se repetir: ele pediu que "HAPPY HOUR"
   ficasse maior (correção 5), eu medi e subi para 11px — o degrau de "eyebrow
   de cabeçalho" do DS, igualando ao `.secao__n` ao lado. A medição estava
   certa e o valor estava na régua. **O erro foi de ESCOPO:** otimizei a seção
   isolada e quebrei a regularidade da HOME. As outras cinco seções (`01`, `03`,
   `04`, `05`, `06`) usam os 10px da regra base, e o happy hour virou o único
   diferente — foi isso que ele viu ao olhar a página inteira.

   A lição, que vale além deste rótulo: **coerência do conjunto vence destaque
   local.** Um valor pode estar correto pela régua e ainda assim errado pelo
   contexto. Quem for mexer aqui de novo precisa mexer nos SEIS ou em nenhum.

   A trava disso não é um número literal nesta folha — é a asserção
   `8.13 correção 6` em `teste-happy-hour.php`, que COMPARA os seis rótulos
   entre si e acusa qualquer um que divirja. Ela pega tanto o happy hour subindo
   sozinho quanto outra seção descolando. */
.rotulo--hh{ color:var(--ds-linha); }
.secao--hh-abas .secao__cabecalho{ border-bottom-color:rgba(222,216,205,.24); }
.secao--hh-abas h2{ color:var(--ds-mesa); }

/* Os rádios que comandam a troca de painel. `position:absolute` + `opacity:0`
   em vez de `display:none`: elemento com `display:none` NÃO É FOCÁVEL, e o
   grupo perderia a navegação por seta que é justamente o motivo de usar rádio
   (AC #14.a). Ele continua na árvore de acessibilidade, invisível na tela. */
.hh__radio{
  position:absolute; opacity:0; pointer-events:none;
  width:1px; height:1px; margin:0;
}
.hh__abas-caixa{ position:relative; }

/* 🔴 O FOCO DE TECLADO DAS ABAS — corrigido no pós-gate da 8.13 (HIGH-2).
   O QUE ESTAVA ERRADO: o `:focus-visible` global (linha 299) casa o elemento
   FOCADO, e o elemento focado aqui é o `.hh__radio` — 1×1 pixel, `opacity:0`,
   posicionado longe da aba que ele comanda. O anel era pintado num elemento
   transparente: o `@qa` mediu em Chromium `overlapsItsOwnTab:false` e
   screenshots COM e SEM foco de teclado byte-idênticos. Quem navega por
   teclado não via onde estava — e a navegação por seta, que foi o argumento
   para adiar a 14.b, só serve a quem enxerga o foco.

   A CORREÇÃO leva o anel para o elemento VISÍVEL, o `<label>` irmão. Os
   valores são REUSADOS do `:focus-visible` global, byte a byte
   (`2.5px solid var(--brasa)`, `outline-offset:3px`) — a decisão 4 do README
   proíbe INVENTAR estilo de foco novo, não proíbe alcançar o elemento certo
   com o mesmo estilo. É o mesmo padrão que `.item__mais:focus-visible` e
   `.idiomas a:focus-visible` já usam neste arquivo: regra de componente ao
   lado da global, sem tocar a global.

   ⚠️ `:focus-visible` no rádio, não `:focus`: clicar com o MOUSE não deve
   pintar anel (é o comportamento que o `:focus-visible` global já entrega no
   resto do site), navegar por TECLA deve.

   ⚠️ `outline-offset` NEGATIVO, ao contrário dos 3px positivos da global: a
   aba encosta nas vizinhas dentro de uma barra com `overflow-x:auto`, e um
   anel para FORA seria cortado pelo contêiner que rola. Para DENTRO ele fica
   inteiro visível. É adaptação geométrica ao contêiner, não estilo novo — a
   cor e a espessura, que é o que a decisão 4 protege, são as mesmas.

   ⚠️ O PAREAMENTO É POR ÍNDICE, exatamente como as regras de `:checked`
   abaixo — e não `.hh__radio:focus-visible ~ .hh__abas .hh__aba`, que
   pintaria as CINCO abas quando qualquer rádio recebesse foco. O anel tem de
   dizer ONDE o foco está; anel em cinco lugares não diz nada. O irmão é `~`
   (geral) e não `+` (adjacente) porque só o 5º rádio é adjacente a
   `.hh__abas`; os outros quatro têm rádios entre eles e a barra.

   O md5 do conjunto de regras de foco (`teste-local.php`) muda por causa
   desta regra, e essa mudança é INTENCIONAL e registrada: o próprio
   comentário da trava prevê o caso ("se uma story futura precisar mudar uma
   regra de foco de propósito, o md5 muda junto — e o commit passa a registrar
   essa intenção"). O que a decisão 4 barra é a mudança SILENCIOSA. */
.hh__radio:nth-of-type(1):focus-visible ~ .hh__abas .hh__aba:nth-of-type(1),
.hh__radio:nth-of-type(2):focus-visible ~ .hh__abas .hh__aba:nth-of-type(2),
.hh__radio:nth-of-type(3):focus-visible ~ .hh__abas .hh__aba:nth-of-type(3),
.hh__radio:nth-of-type(4):focus-visible ~ .hh__abas .hh__aba:nth-of-type(4),
.hh__radio:nth-of-type(5):focus-visible ~ .hh__abas .hh__aba:nth-of-type(5){
  outline:2.5px solid var(--brasa);
  outline-offset:-4px;
}

/* A barra de 5 abas. §5.4 Tabs do DS é normativa aqui em tudo, MENOS no eixo
   da borda ativa — ver a nota em `.hh__aba` abaixo.
   `overflow-x:auto` + `flex:none` nas abas: abaixo de 480px a barra ROLA na
   horizontal, NUNCA quebra em duas linhas (nota literal da §5.4). */
.hh__abas{
  display:flex; overflow-x:auto; scrollbar-width:thin;
  border-top:1px solid rgba(222,216,205,.24);
  border-bottom:1px solid rgba(222,216,205,.24);
}
/* Cada aba: duas linhas (sigla mono apagada + nome por extenso em serif),
   separadas por filete vertical, como a imagem mostra.
   `min-height:44px` é ALVO DE TOQUE (§5.4/§7.1, normativo) — aqui o conteúdo
   de duas linhas já excede, mas a declaração trava o piso se alguém reduzir a
   tipografia depois.

   ⚠️ `flex:none` é a REGRA BASE, e ela é a de MOBILE (mobile-first): a aba tem
   a largura do próprio conteúdo e a barra ROLA quando não cabe, que é a nota
   literal e normativa da §5.4 ("SCROLL HORIZONTAL QUANDO NÃO CABE · NUNCA
   QUEBRA EM DUAS LINHAS"). Cinco colunas iguais numa tela de 360px espremeriam
   "SEGUNDA" a ponto de quebrar ou truncar — por isso a divisão em quintos NÃO
   entra aqui, e sim no `@media (min-width:481px)` logo abaixo. */
.hh__aba{
  flex:none; cursor:pointer;
  display:flex; flex-direction:column; align-items:center; justify-content:center;
  gap:var(--ds-esp-4);
  min-height:44px;
  padding:var(--ds-esp-16) var(--ds-esp-32);
  border-right:1px solid rgba(222,216,205,.24);
  border-top:3px solid transparent;   /* reserva o espaço da borda ativa */
  white-space:nowrap;
  transition:background .15s ease, color .15s ease;
}
.hh__aba:last-of-type{ border-right:0; }

/* 🔴 CINCO PARTES IGUAIS — correção 3 do pós-publicação (2026-08-27).
   Decisão do dono, ao ver a seção no ar: as 5 abas ficavam encolhidas à
   esquerda, com um vazio à direita, porque `flex:none` dá a cada aba a largura
   do próprio texto ("SEG/SEGUNDA" é mais estreito que "QUA/QUARTA"). Ele pediu
   que cada dia ocupasse exatamente 1/5 da largura, independente do tamanho do
   nome.

   `flex:1 1 20%` + `min-width:0` faz os quintos exatos: a base de 20% divide a
   barra em cinco, e o `min-width:0` é obrigatório porque o padrão de um item
   flex é `min-width:auto`, que o impede de encolher abaixo do conteúdo — sem
   ele as abas de nome longo estourariam os 20% e o vazio voltaria, só que
   deslocado.

   ⚠️ POR QUE ISTO NÃO VIOLA A §5.4, e por que fica NESTE breakpoint:
     · o `overflow-x:auto` da `.hh__abas` continua declarado e intocado — acima
       de 480px simplesmente não há o que rolar, porque os quintos cabem;
     · `white-space:nowrap` continua na regra base e NÃO é sobrescrito aqui: a
       nota normativa "NUNCA QUEBRA EM DUAS LINHAS" segue valendo nos dois
       lados do breakpoint;
     · abaixo de 481px nada disto se aplica e a barra volta a rolar, que é o
       comportamento que a §5.4 prescreve para tela estreita;
     · `min-height:44px` (alvo de toque, normativo) está na regra base e não é
       tocado aqui.

   481px e não 480px: o `@media (max-width:480px)` que ajusta o padding das abas
   usa 480 como TETO, então o piso deste tem de ser 481 para os dois não se
   sobreporem — mesmo par que o resto da folha já usa. */
@media (min-width:481px){
  .hh__aba{ flex:1 1 20%; min-width:0; }
}
/* ⚠️ CONTRASTE MEDIDO, não copiado da imagem. A referência aprovada usa cinzas
   sobre o painel escuro que, medidos pela fórmula WCAG, ficam abaixo de AA
   para texto pequeno: `--ds-apoio` (#7A756C) sobre `--ds-breu` dá 3,66:1.
   A imagem é referência de LAYOUT — o cinza dela não é valor normativo do DS
   (o DS especifica `--ds-apoio` contra fundo CLARO, onde ele dá 3,92/4,50).
   Então a sigla, que é texto de 11px, usa um cinza claro derivado do próprio
   `--ds-linha` com alfa: 8,0:1 sobre o painel, mantendo a hierarquia visual
   (apagado ao lado do nome branco) sem cair sob AA. A suíte mede — não
   presume — em `teste-happy-hour.php`. */
.hh__aba-sigla{
  font-family:var(--ds-mono); font-weight:500; font-size:11px;
  letter-spacing:.16em; text-transform:uppercase;
  color:rgba(222,216,205,.80);
}
/* O nome por extenso da aba INATIVA. 1.5rem (24px) é TEXTO GRANDE pela régua
   WCAG (>=24px normal), então a régua é 3:1, não 4,5:1 — e 3,66:1 passa. Ainda
   assim usa o mesmo cinza claro da sigla, por coerência visual e porque abaixo
   de 480px o corpo cai para 1.2rem e deixaria de ser texto grande. */
.hh__aba-nome{
  font-family:var(--ds-serif); font-size:1.5rem; line-height:1.1;
  color:rgba(222,216,205,.80);
}
/* AC #12 — o marcador "HOJE" é do dia CORRENTE, e é um estado SEPARADO de
   "aba aberta". Depois de clicar noutro dia os dois divergem, que é o que a
   imagem aprovada mostra (QUI = hoje, SEX = selecionada). Se este marcador
   fosse a mesma classe do estado ativo, a divergência seria impossível de
   representar — e a suíte não teria como provar os dois separadamente. */
.hh__aba-hoje{
  font-family:var(--ds-mono); font-weight:500; font-size:10px;
  letter-spacing:.16em; text-transform:uppercase;
  color:var(--ds-brasa);
}
.hh__aba:hover .hh__aba-nome{ color:var(--ds-linha); }

/* 🔴 O ESTADO ATIVO — a exceção nomeada ao §5.4, decidida pelo @po em
   2026-08-27 a favor da imagem aprovada.
   A §5.4 especifica `border-bottom:2px solid #D8411F` para tabs CLARAS, com
   sublinhado INFERIOR, sobre creme. A imagem usa borda SUPERIOR sobre painel
   `--ds-breu` escuro: mudam o EIXO (top × bottom) e o CONTEXTO (escuro ×
   claro), o que faz disto uma VARIANTE NOVA do componente, não desobediência
   a um valor normativo da mesma variante. `3px` no lugar de `2px` é a
   compensação óptica — Brasa sobre quase-preto lê mais fino que sobre creme.
   O projeto passa a ter DUAS variantes de Tabs; esta é a escura, de borda
   superior. Todo o resto da §5.4 segue obrigatório (44px, overflow-x:auto,
   nunca quebrar em duas linhas). */
.hh__radio:nth-of-type(1):checked ~ .hh__abas .hh__aba:nth-of-type(1),
.hh__radio:nth-of-type(2):checked ~ .hh__abas .hh__aba:nth-of-type(2),
.hh__radio:nth-of-type(3):checked ~ .hh__abas .hh__aba:nth-of-type(3),
.hh__radio:nth-of-type(4):checked ~ .hh__abas .hh__aba:nth-of-type(4),
.hh__radio:nth-of-type(5):checked ~ .hh__abas .hh__aba:nth-of-type(5){
  border-top-color:var(--ds-brasa);
  background:rgba(0,0,0,.28);
}
.hh__radio:nth-of-type(1):checked ~ .hh__abas .hh__aba:nth-of-type(1) .hh__aba-nome,
.hh__radio:nth-of-type(2):checked ~ .hh__abas .hh__aba:nth-of-type(2) .hh__aba-nome,
.hh__radio:nth-of-type(3):checked ~ .hh__abas .hh__aba:nth-of-type(3) .hh__aba-nome,
.hh__radio:nth-of-type(4):checked ~ .hh__abas .hh__aba:nth-of-type(4) .hh__aba-nome,
.hh__radio:nth-of-type(5):checked ~ .hh__abas .hh__aba:nth-of-type(5) .hh__aba-nome{
  color:var(--ds-mesa);
}
.hh__radio:nth-of-type(1):checked ~ .hh__abas .hh__aba:nth-of-type(1) .hh__aba-sigla,
.hh__radio:nth-of-type(2):checked ~ .hh__abas .hh__aba:nth-of-type(2) .hh__aba-sigla,
.hh__radio:nth-of-type(3):checked ~ .hh__abas .hh__aba:nth-of-type(3) .hh__aba-sigla,
.hh__radio:nth-of-type(4):checked ~ .hh__abas .hh__aba:nth-of-type(4) .hh__aba-sigla,
.hh__radio:nth-of-type(5):checked ~ .hh__abas .hh__aba:nth-of-type(5) .hh__aba-sigla{
  color:var(--ds-linha);
}

/* AC #14.a — o painel não selecionado sai da tela E da árvore de
   acessibilidade. `display:none` faz as duas coisas; esconder só visualmente
   (opacity/clip) faria o leitor de tela ler os CINCO painéis empilhados, que é
   pior que o estado anterior a esta story. */
.hh__painel{ display:none; padding:var(--ds-esp-48) 0 var(--ds-esp-16); }
.hh__radio:nth-of-type(1):checked ~ #hh-painel-1,
.hh__radio:nth-of-type(2):checked ~ #hh-painel-2,
.hh__radio:nth-of-type(3):checked ~ #hh-painel-3,
.hh__radio:nth-of-type(4):checked ~ #hh-painel-4,
.hh__radio:nth-of-type(5):checked ~ #hh-painel-5{ display:block; }

/* O rótulo do painel: "{DIA} · {DRINKS}", mono caixa alta em Brasa com
   espaçamento largo entre letras, como a imagem mostra. Montado por CÓDIGO,
   nunca literal no markup. */
.hh__rotulo-dia{
  font-family:var(--ds-mono); font-weight:500; font-size:12px;
  letter-spacing:.22em; text-transform:uppercase;
  color:var(--ds-brasa);
  margin:0 0 var(--ds-esp-16);
}
/* O título grande do painel. 🔵 2026-08-28: passou a sair de
   `t('hh_titulo_{seg..sex}')` — um por dia, aprovado pelo dono —, e não mais da
   chave única `home_h2_hh`. Os cinco são DISTINTOS entre si; a consequência
   "título igual nos cinco dias" que o AC #13 declarava DEIXOU de valer.

   ⚠️ O `max-width:20ch` abaixo passou a ser medido, não presumido: os títulos
   novos têm comprimentos diferentes entre si (o mais longo é o de quarta, 33
   caracteres em PT) e o corte cai em número de LINHAS, não em estouro — o
   `clamp()` já cuida do tamanho. Medido nos 3 idiomas em 375px e 1440px na
   story 8.13, correção 8. */
.hh__titulo{
  font-family:var(--ds-serif); font-size:clamp(2rem,5vw,3.4rem);
  font-weight:400; line-height:1.08; letter-spacing:-.01em;
  color:var(--ds-mesa);
  /* 24 → 32 na correção 2 de 2026-08-27: o `.hh__apoio` que ficava logo abaixo
     carregava `margin-bottom:32px` até as etiquetas. Removido o parágrafo, o
     título passa a fazer esse afastamento — senão ele encosta nas etiquetas.
     Ambos são degraus da régua `--ds-esp-*` (decisão 7), não valor solto. */
  margin:0 0 var(--ds-esp-32); max-width:20ch;
}
/* 🔴 `.hh__apoio` SAIU em 2026-08-27 (correção 2 do pós-publicação, pedido do
   dono). O parágrafo repetia, palavra por palavra, o que as três etiquetas
   logo abaixo já diziam — a mecânica ("2 POR 1: …") e o horário ("17H ÀS 20H").
   Removido o elemento do `index.php`, a regra ficaria órfã: CSS que estiliza
   o que não é renderizado é a armadilha 11 do README (CSS declarado ≠ página
   renderizada), e mantê-la só daria a impressão de cobertura.

   O espaçamento que ela carregava (`margin-bottom:32px`, entre o texto e as
   etiquetas) foi absorvido pelo `.hh__titulo` acima, que passou de 24 para 32:
   sem isso o título encostaria nas etiquetas. Ver a story 8.13, correção 2.

   ⚠️ Se o texto autoral do dono chegar (AC #13, pendência aberta) e voltar a
   pedir um parágrafo por dia, ele NÃO deve recriar a redundância que o dono
   mandou tirar — o texto dele é específico por dia, e a decisão de onde ele
   entra em relação às etiquetas é parte daquele trabalho, não deste. */
/* As três etiquetas em linha: a primeira destacada (a mecânica do dia), as
   outras duas neutras (horário e local). `flex-wrap` para não estourar em
   telas estreitas. */
.hh__etiquetas{
  display:flex; flex-wrap:wrap; gap:var(--ds-esp-12);
  margin:0 0 var(--ds-esp-32);
}
.hh__tag{
  font-family:var(--ds-mono); font-weight:500; font-size:12px;
  letter-spacing:.16em; text-transform:uppercase;
  color:var(--ds-linha);
  border:1px solid rgba(222,216,205,.38);
  border-radius:var(--ds-raio-3);
  padding:var(--ds-esp-12) var(--ds-esp-16);
}
/* A destacada usa Brasa na borda e um fundo Brasa muito diluído, como a
   imagem. O TEXTO fica claro (não Brasa sobre Brasa): #DED8CD sobre o
   composto do fundo mede acima de 4,5:1 — a suíte confere. */
.hh__tag--destaque{
  border-color:var(--ds-brasa);
  background:rgba(216,65,31,.16);
  color:var(--ds-mesa);
}

/* O bloco de preço, herdado da 1.13 e MANTIDO: o valor promocional continua
   sendo o maior elemento tipográfico — "R$ 7,90 o chopp" é o gancho, e foi
   pedido explícito do dono. O que mudou é o entorno (painel por dia), não a
   hierarquia interna.

   `flex-wrap` + `align-items:baseline`: em ≤375px o "de R$ 11,90" desce para a
   linha seguinte em vez de estourar a largura. Sem width fixa, sem nowrap.

   ⚠️ Story 8.13 — as quatro regras migraram de `var(--serif)`/`var(--sans)`
   para `var(--ds-serif)`/`var(--ds-sans)`. Elas eram 4 das 9 regras que o
   contador de pendências da 8.10 mantinha CONGELADAS (`teste-local.php`,
   "Contador de pendências"), justamente porque os mutantes frágeis as
   travavam byte a byte. Com o AC #1 desta story, deixaram de estar. */
.hh__preco{
  display:flex; flex-wrap:wrap; align-items:baseline; gap:0 14px;
  margin:0; line-height:1.1;
}
/* 🔴 CORREÇÃO 7 (2026-08-27) — `font-weight:700` → `400`, decisão do dono ao
   ver o `R$ 7,90` e perguntar se a fonte combinava com o resto do site.

   A FAMÍLIA sempre esteve certa (`--ds-serif`, Bodoni Moda, a dos títulos). O
   que destoava era o PESO, e o dado que fecha a questão foi levantado varrendo
   a folha inteira: **`.hh__valor` era a ÚNICA regra em serif do CSS declarando
   700.** Todas as outras ficam em 400 (`h1`, `h2`, `.hh__titulo`, `.hh__aba-nome`,
   `.hero__texto`, `.rodape__frase`) ou 600 (`h3,h4`, `.vitrine__nome`,
   `.item__nome`, `.item__preco`, `.destaque__preco`, `.wifi-cartao__val`).

   E 700 está FORA DA RÉGUA: a ESPEC carrega o Bodoni Moda em **400, 500 e 600**
   apenas (§tipografia, linha 147) — o `@font-face` é variável (`400 900`), então
   o 700 renderizava de verdade e não era negrito sintetizado, mas era um degrau
   que o DS não declara. Os outros `font-weight:700` desta folha são todos
   **Archivo** (sans), que a ESPEC carrega em 400/500/600/700: legítimos.

   ⚠️ NÃO É REGRESSÃO DA STORY 1.13. O que a 1.13 exigiu é que o preço seja o
   elemento tipográfico DOMINANTE, e isso é TAMANHO, não peso: o
   `clamp(3rem,8vw,4.6rem)` fica intocado e continua maior que o `h2` — a
   asserção `1.13 AC #2` compara os dois font-size e segue verde. O 700 é herança
   de quando o preço vivia na faixa vinho, não requisito daquela story.

   Contraste inalterado (peso não entra na fórmula WCAG, só cor e luminância):
   `--ds-mesa` sobre o painel `--ds-breu` = **16,46:1**, AAA com folga larga, e o
   preço renderiza a 73,6px — "texto grande" pela régua. Medido, não presumido.

   Mesmo raciocínio da reversão do rótulo (correção 6): coerência do conjunto
   acima do destaque local. */
.hh__valor{
  font-family:var(--ds-serif); font-size:clamp(3rem,8vw,4.6rem);
  font-weight:400; color:var(--ds-mesa); letter-spacing:-.01em;
}
.hh__de{
  font-family:var(--ds-sans); font-size:.9rem;
  font-weight:600; letter-spacing:.08em; text-transform:uppercase;
  color:var(--brasa-claro); text-decoration:line-through;
  text-decoration-thickness:1px; text-underline-offset:2px;
}
/* Legenda do produto: quebra a linha inteira (flex-basis:100%) para ficar
   EMBAIXO do preço, como no desenho, sem depender de <br>. */
.hh__produto{
  flex-basis:100%; font-family:var(--ds-sans); font-size:1.05rem;
  font-weight:600; letter-spacing:.02em; color:var(--ds-linha);
  margin-top:4px;
}

/* Abaixo de 480px a barra de abas ROLA na horizontal (§5.4, normativo) e as
   abas apertam o padding — mas NUNCA quebram em duas linhas. O `white-space:
   nowrap` + `flex:none` da regra base é o que garante isso; aqui só se ajusta
   a folga e o corpo do nome. */
@media (max-width:480px){
  .hh__aba{ padding:var(--ds-esp-12) var(--ds-esp-16); }
  .hh__aba-nome{ font-size:1.2rem; }
  .hh__painel{ padding:var(--ds-esp-32) 0 var(--ds-esp-8); }
}

/* Faixa do cardápio: aparece em TODA aba, então precisa informar sem roubar a
   página. Caixa creme discreta, não banner piscante.
   ↑ Decisão da Story 1.10. CONTINUA VALENDO, e por um motivo que não envelheceu:
   a faixa renderiza nas 6 abas, então é o elemento mais repetido do cardápio
   inteiro. Algo que se repete 6 vezes e grita nas 6 vira ruído, e o cliente
   aprende a ignorá-lo. A decisão nunca foi timidez — era economia de atenção.

   REFINADA em 2026-08-25, a pedido do dono ("melhorar o destaque do happy
   hour", com a captura desta faixa). O que mudou e o que NÃO mudou:

     NÃO mudou — cor de fundo (--creme), ausência de movimento, ordem de
     grandeza da área. Sem gradiente, sem fundo saturado, sem animação.
     MUDOU     — a hierarquia INTERNA. Antes era tudo .98rem/--tinta num <p>
     único, e o preço (o gancho comercial) ficava no fim da frase sem peso
     nenhum. Agora selo, horário, preço e mecânica são elementos próprios, e o
     destaque vem de TIPOGRAFIA, não de intensidade cromática.

   A distinção que sustenta o refino: a 1.10 decidiu o quanto a faixa avança
   sobre a página (área, cor, movimento). Ela não decidiu que o texto seria
   plano — isso foi consequência de a faixa ter nascido como um <p> único, não
   escolha registrada. Mesmo movimento que a 1.13 fez na home: o preço virou o
   maior elemento SEM a seção crescer.

   ⚠️ Os limites viraram TESTE, para "hierarquia" não virar "banner" por deriva
   futura: a suíte lê deste arquivo que o padding não cresceu (1.18 AC #16) e
   que não há animation/@keyframes/fundo saturado (AC #17). Se alguém afrouxar
   aqui, `php sql/teste-happy-hour.php` acusa. Não é boa intenção em comentário.

   Fundo é --creme, e não --creme-fundo (mais escuro): --brasa-texto sobre
   --creme-fundo dá 4,4758:1 e reprova AA por dois centésimos. O par
   --brasa-texto/--creme já é auditado na base (4,7601:1 — sobra 0,26 sobre a
   régua 4,5, e é por isso que o fundo é fixo). A borda usa --brasa normativo,
   que é área grande e não texto. */
.hh-faixa{
  background:var(--creme); border-left:3px solid var(--brasa);
  padding:14px 18px; margin:0 0 6px; border-radius:2px;
}
.hh-faixa__texto{
  margin:0; font-size:.98rem; color:var(--tinta); line-height:1.5;
}

/* --- Hierarquia da faixa (Story 1.18) --------------------------------------
   Nível 1 (identifica): selo + horário. Nível 2 (ancora): o preço. Nível 3
   (detalha): a mecânica, que reusa .hh-faixa__texto e por isso fica menor que
   o preço por construção. */
.hh-faixa__cabeca{
  display:flex; flex-wrap:wrap; align-items:center; gap:8px;
  margin:0 0 6px;
}
/* Selo: #fff sobre --brasa-texto = 5,3628:1 (régua 4,5). O fundo é o mesmo
   --brasa-texto do .item__selo--promo, não o --brasa normativo: branco sobre
   --brasa dá 4,4722:1 e REPROVA — é o defeito que o mutante M8 já guarda. */
/* ⚠️ #FFFFFF em 6 dígitos, não #fff: a extração de cor declarada da suíte
   (Story 4.23) só resolve hex de 6 dígitos, e a forma curta devolveria null —
   a asserção de contraste morreria por falha de LEITURA, não por cor errada.

   ⚠️ E nenhum comentário DENTRO do bloco: a âncora `(?:[^}]*?[;{])?` da mesma
   extração exige que a propriedade venha logo após `{` ou `;`. Um comentário
   entre elas faz a leitura devolver null em silêncio. Comentário fica FORA. */
.hh-faixa__selo{
  font-family:var(--ds-sans); font-size:.62rem; font-weight:700;
  letter-spacing:.14em; text-transform:uppercase;
  background:var(--brasa-texto); color:#FFFFFF;
  padding:3px 8px; border-radius:2px;
}
/* Horário: --tinta sobre --creme = 14,9861:1. Peso 700 para ler como unidade
   ("17h–20h"), e não diluído na frase — que era o defeito relatado. */
.hh-faixa__horario{
  font-family:var(--ds-sans); font-size:.82rem; font-weight:700;
  letter-spacing:.04em; color:var(--tinta);
}
/* O bloco do preço. flex-wrap:wrap para a legenda descer em tela estreita em
   vez de estourar — mesmo critério do .hh__preco da home (1.13 AC #13). */
.hh-faixa__preco{
  display:flex; flex-wrap:wrap; align-items:baseline; gap:8px;
  margin:0 0 6px;
}
/* O PREÇO — o maior elemento tipográfico da faixa (1.18 AC #2), e a suíte
   compara este font-size com o de .hh-faixa__texto lido deste mesmo arquivo.
   --brasa-texto sobre --creme = 4,7601:1 (régua 4,5).

   1.35rem = 21,6px. Fica ABAIXO dos 24px do "texto grande" do WCAG de
   propósito: a régua aplicável continua sendo 4,5 e não 3:1, e o par aprova a
   4,76 de qualquer forma. Não abrir a exceção impede que uma mudança futura de
   tamanho afrouxe o contraste em silêncio (1.18 AC #5). */
.hh-faixa__valor{
  font-family:var(--ds-sans); font-size:1.35rem; font-weight:700;
  letter-spacing:.01em; line-height:1.1; color:var(--brasa-texto);
}
/* Legenda do preço. NÃO é decoração: é a única fonte da palavra "Kaiser" na
   faixa desde que a mecânica passou a usar a variante sem preço, e a trava
   anti-regressão da 1.13 exige essa palavra presente (1.18 AC #15b). */
.hh-faixa__produto{
  font-family:var(--ds-sans); font-size:.86rem; font-weight:600;
  letter-spacing:.02em; color:var(--tinta);
}
.hh-faixa__lista{ margin-top:8px; }
.hh-faixa__lista summary{
  font-family:var(--ds-sans); font-size:.74rem; font-weight:700;
  letter-spacing:.14em; text-transform:uppercase;
  color:var(--brasa-texto); cursor:pointer;
}
.hh-faixa__lista ul{
  list-style:none; padding:0; margin:10px 0 2px;
  display:grid; gap:6px;
}
.hh-faixa__lista li{
  font-size:.9rem; color:var(--cinza); line-height:1.45;
}
.hh-faixa__lista strong{
  color:var(--tinta); text-transform:capitalize; margin-right:6px;
}
/* A linha de hoje ganha peso — quem abre o cardápio às 18h quer achar a dela
   sem ler as cinco. */
.hh-faixa__hoje{ color:var(--tinta); font-weight:600; }
.hh-faixa__tag{
  display:inline-block; font-family:var(--ds-sans); font-size:.6rem;
  font-weight:700; letter-spacing:.14em; text-transform:uppercase;
  color:var(--brasa-texto); border:1px solid currentColor;
  padding:1px 6px; margin-left:7px; vertical-align:middle;
}

/* Mobile: a faixa encosta nas bordas do container e o preço não estoura.
   O padding DIMINUI (12/14 < 14/18) — a faixa não cresce em lugar nenhum
   (1.18 AC #16). Sem white-space:nowrap e sem width fixa nos elementos da
   faixa: o wrap dos dois blocos flex é o que impede scroll horizontal quando
   selo + horário ou preço + legenda não cabem na linha (1.18 AC #18).
   ⚠️ A linha do .hh__de abaixo é da HOME (Story 1.13, travada pela 4.23) e
   está aqui só por vizinhança de @media. Não é escopo da 1.18. */
@media (max-width:420px){
  .hh-faixa{ padding:12px 14px; }
  .hh-faixa__texto{ font-size:.92rem; }
  .hh-faixa__valor{ font-size:1.22rem; }
  .hh__de{ display:block; margin:6px 0 0; }
}

/* ==========================================================================
   AMPLIAR A FOTO AO CLIQUE — o lightbox da seção "O espaço" (2026-09-15)
   ==========================================================================
   Pedido do dono: "quero que as fotos do site possam ser ampliadas quando
   clicadas". Entregue primeiro em `/eventos.php`, onde as seis imagens da casa
   acabaram de entrar.

   🔴 O DESENHO É PROGRESSIVO, E ISSO NÃO É PREFERÊNCIA — é a regra que o FAQ
   desta mesma página já segue com `<details>` (`eventos.php:630`). O card
   envolve a imagem num `<a href>` que aponta para o arquivo GRANDE do acervo:

     · sem JS  → o navegador abre a imagem. Funciona, é só menos bonito.
     · com JS  → `assets/lightbox.js` intercepta e abre na página.

   Um lightbox que fosse `<div onclick>` deixaria quem está sem JS com uma
   imagem que não amplia e nada explicando por quê — e o rastreador sem um
   `href` para seguir até a imagem grande. */

.destaque__zoom{
  display:block; position:relative; cursor:zoom-in;
  /* `overflow:hidden` mora no `.destaque--foto`; aqui seria redundante e
     cortaria o anel de foco do teclado. */
}
/* O anel de foco é OBRIGATÓRIO: este link só contém imagem, e sem indicação
   visível quem navega por Tab não sabe onde está. `outline-offset` negativo
   mantém o anel DENTRO da moldura do card, que tem `overflow:hidden`. */
.destaque__zoom:focus-visible{
  outline:3px solid var(--brasa); outline-offset:-3px;
}
/* A lupa aparece no hover como AFORDÂNCIA — sem ela, nada na imagem diz que
   ela amplia. `pointer-events:none` para o ícone não roubar o clique do link.
   Some em `coarse` (dedo não tem hover) e em `prefers-reduced-motion`. */
.destaque__zoom::after{
  content:""; position:absolute; inset:auto 12px 12px auto;
  width:34px; height:34px; border-radius:50%;
  background:rgba(23,18,14,.72) center/16px 16px no-repeat;
  background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23fff' stroke-width='2.4' stroke-linecap='round'%3E%3Ccircle cx='10.5' cy='10.5' r='6.5'/%3E%3Cpath d='M15.5 15.5 21 21M10.5 7.5v6M7.5 10.5h6'/%3E%3C/svg%3E");
  opacity:0; transform:scale(.88);
  transition:opacity var(--transicao), transform var(--transicao);
  pointer-events:none;
}
.destaque__zoom:hover::after,
.destaque__zoom:focus-visible::after{ opacity:1; transform:scale(1); }

@media (hover:none){
  /* Dedo não tem hover: a lupa ficaria invisível para sempre no celular.
     Mostrada de saída, com opacidade menor para não competir com a foto. */
  .destaque__zoom::after{ opacity:.82; transform:none; }
}

/* ⚠️ O SELO "PROJETO" FOI REMOVIDO EM 2026-09-15, a pedido do dono.

   Havia aqui uma regra `.destaque--projeto .destaque__zoom::before` que
   imprimia um selo escuro com `attr(data-selo)` no canto das duas imagens
   geradas por IA da seção "O espaço". Saiu junto com a etiqueta de categoria,
   o "(referência)" dos títulos e a nota de pé de seção.

   Registrado como ausência DELIBERADA, não como esquecimento: o dono foi
   informado de que sem os rótulos aquelas duas imagens ficam indistinguíveis
   de fotografia do espaço real, e confirmou o pedido. A classe
   `.destaque--projeto` não é mais emitida por `public/eventos.php`. */

/* ---------- o diálogo da ampliação ---------- */
/* `<dialog>` nativo: ganha de graça o fecho por Esc, a devolução do foco ao
   elemento que abriu e o `inert` no resto da página — três coisas que uma
   `<div role="dialog">` exigiria reimplementar à mão, e que normalmente saem
   pela metade. */
.zoom{
  padding:0; border:0; max-width:min(96vw,1400px); max-height:94vh;
  background:transparent; overflow:visible;
}
.zoom::backdrop{ background:rgba(12,9,7,.9); }
.zoom__fig{ margin:0; display:flex; flex-direction:column; gap:12px; }
.zoom__img{
  display:block; max-width:100%; max-height:84vh;
  width:auto; height:auto; margin:0 auto;
  background:#0C0907;
}
.zoom__legenda{
  color:#FFFDF8; font-size:.94rem; text-align:center;
  display:flex; flex-direction:column; gap:4px;
}
.zoom__dica{ font-size:.76rem; opacity:.66; }
/* O × fica FORA da imagem, no topo à direita do diálogo. Sobre a foto ele
   some em imagem clara — e esta grade tem imagens de fundo claro e escuro. */
.zoom__fechar{
  position:absolute; top:-46px; right:0;
  width:38px; height:38px; display:grid; place-items:center;
  background:rgba(255,253,248,.14); color:#FFFDF8;
  border:1px solid rgba(255,253,248,.3); border-radius:50%;
  font-size:1.3rem; line-height:1; cursor:pointer;
  transition:background var(--transicao);
}
.zoom__fechar:hover{ background:rgba(255,253,248,.26); }
.zoom__fechar:focus-visible{ outline:3px solid var(--brasa); outline-offset:2px; }

@media (max-width:700px){
  /* No celular o × sobe para dentro do diálogo: `top:-46px` sairia da tela. */
  .zoom{ max-width:100vw; }
  .zoom__fechar{ top:6px; right:6px; background:rgba(12,9,7,.7); }
}

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