/* ==========================================================================
   TEMA VARANDA DA VILLA — a home do restaurante
   ==========================================================================

   CONCEITO: a página é a travessia de um dia na casa. Abre na luz do buffet do
   almoço e escurece até a noite do forno; a luz da varanda acende no caminho.
   Não é enfeite: é o texto do próprio restaurante ("buffet farto no almoço,
   forno aceso à noite") virado estrutura visual.

   O FOCO É VENDER A RESERVA. Toda seção termina apontando para a mesa, e o
   bloco de reserva é o único elemento que ganha elevação, brilho e cor cheia —
   o resto da página é ambiente, ele é o objeto.

   REGRAS DESTE DOCKER QUE ESTA FOLHA RESPEITA
   - larguras em % e clamp(), nunca 100vw (a barra de rolagem entra na conta do
     vw e causa rolagem horizontal no Windows);
   - arquivo separado do template, servido com ?v={assetVersion};
   - nada de identidade de outro cliente: as cores saem da fachada DESTA casa —
     o âmbar do letreiro, o rosa da buganvília, o tijolo do forno.
   ========================================================================== */

:root {
  /* Tiradas das fotos da própria casa. O rosa é da buganvília da fachada, e é
     ele que impede a página de virar "mais um restaurante âmbar e preto". */
  --vv-brasa:      #e0a64b;
  --vv-brasa-alta: #f7c86f;
  --vv-creme:      #f5ebdd;
  --vv-terracota:  #c33b22;
  --vv-buganvilia: #d64d7a;
  --vv-folha:      #7d9159;
  --vv-noite:      #12100e;
  --vv-casca:      #22140c;
  --vv-madeira:    #3a200e;

  /* Neutros com viés quente — cinza puro ao lado deste âmbar lê como sujeira */
  --vv-tinta:      #f2e7d8;
  --vv-tinta-fraca:#c9b9a4;
  --vv-linha:      rgba(245, 235, 221, .14);

  --vv-serif: "Bitter", Georgia, "Times New Roman", serif;
  --vv-sans:  "Inter", system-ui, -apple-system, "Segoe UI", sans-serif;

  /* Escala tipográfica: razão 1.28, presa ao viewport por clamp */
  --vv-t-xs:  clamp(.72rem, .68rem + .18vw, .82rem);
  --vv-t-sm:  clamp(.84rem, .79rem + .22vw, .95rem);
  --vv-t-md:  clamp(1rem, .94rem + .3vw, 1.14rem);
  --vv-t-lg:  clamp(1.3rem, 1.15rem + .7vw, 1.75rem);
  --vv-t-xl:  clamp(1.9rem, 1.5rem + 1.9vw, 3.1rem);
  --vv-t-2xl: clamp(2.6rem, 1.8rem + 3.8vw, 5.6rem);

  /* Ritmo entre seções. Estava em 7vw/8rem e abria um vão morto de quase uma
     tela entre a reserva e a casa — respiro vira abandono quando passa do
     tamanho do bloco que separa. */
  --vv-ritmo: clamp(2.75rem, 1.5rem + 4.2vw, 5.5rem);
  --vv-borda: 1.15rem;

  /* A "hora do dia" da página: 0 = meio-dia, 1 = noite fechada. O JS move este
     número conforme a rolagem, e tudo que é ambiente lê daqui. Uma variável só
     governando a atmosfera inteira evita seis animações discordando entre si. */
  --vv-noitez: 0;
}

/* ══════════════════════════════════════════════════════════════════════════
   O TOPO COMPARTILHADO, VESTIDO PELO TEMA
   ══════════════════════════════════════════════════════════════════════════

   O `casa_header` é o mesmo componente de todas as casas — marca, sino, Entrar,
   chip do cliente. Aqui ele não é reescrito, é vestido: fica transparente sobre
   a fachada e ganha fundo só depois que a página rola.

   POR QUE TODO SELETOR COMEÇA COM `body.vv`
   O `casa_header` injeta o `<style>` dele DENTRO DO BODY, portanto DEPOIS de
   qualquer folha do `<head>`. Em empate de especificidade, o último ganha — e a
   primeira versão disto perdeu duas brigas em silêncio: o `padding-top: 86px`
   voltou (abrindo uma faixa vazia acima da foto) e o `text-transform: lowercase`
   deixou o menu em minúsculas.
   `body.vv header.top` (0,0,2,2) vence `header.top` (0,0,1,1) independentemente
   da ordem — e sem espalhar `!important`, que só empurra o mesmo problema para
   a próxima pessoa que precisar sobrescrever. */

body.vv.tem-topo-fixo { padding-top: 0; }   /* o hero começa POR BAIXO do topo */

body.vv header.top {
  background: transparent; border-bottom: 1px solid transparent; box-shadow: none;
  backdrop-filter: none; -webkit-backdrop-filter: none;
  transition: background .45s ease, border-color .45s ease, backdrop-filter .45s ease;
}
body.vv header.top.scrolled {
  background: rgba(18, 16, 14, .82);
  border-bottom-color: rgba(245, 235, 221, .12);
  backdrop-filter: blur(18px) saturate(140%); -webkit-backdrop-filter: blur(18px) saturate(140%);
}
body.vv header.top .brand .brand-nome {
  font-family: var(--vv-serif); color: var(--vv-creme);
  font-size: clamp(15px, 1.5vw, 21px); letter-spacing: .01em; font-weight: 700;
}
body.vv header.top .nav a {
  color: #e9dccb; text-transform: none;
  font-family: var(--vv-sans); font-weight: 600; font-size: clamp(12px, .9vw, 14px);
}
body.vv header.top .nav a:hover,
body.vv header.top .nav a:focus-visible {
  background: rgba(224, 166, 75, .16); color: var(--vv-brasa-alta); box-shadow: none;
}
body.vv header.top .hd-actions .hd-bell,
body.vv header.top .hd-actions .hd-chip {
  background: rgba(245, 235, 221, .07); border-color: rgba(245, 235, 221, .16);
  color: var(--vv-creme);
}
body.vv header.top .hd-actions .hd-bell:hover { background: rgba(245, 235, 221, .14); }
body.vv header.top .hd-actions .hd-entrar {
  background: linear-gradient(135deg, var(--vv-brasa-alta), var(--vv-brasa) 55%, #cf8f34);
  color: #2a1706; font-weight: 700;
}

/* A bolha do Cheff Jarvis é do produto e fica — mas em rosa choque sobre esta
   paleta ela lê como erro de página, não como recurso. Vestida, some no ambiente
   e continua fazendo o que faz. */
body.vv .cj-gatilho {
  background: linear-gradient(135deg, var(--vv-brasa), #b8792b) !important;
  color: #2a1706 !important;
  box-shadow: 0 14px 34px -12px rgba(224, 166, 75, .7) !important;
}
body.vv .cj-gatilho * { color: #2a1706 !important; }

/* ── base ───────────────────────────────────────────────────────────────── */

.vv {
  background: var(--vv-noite);
  color: var(--vv-tinta);
  font-family: var(--vv-sans);
  line-height: 1.62;
  overflow-x: clip;             /* trava rolagem lateral sem criar contexto novo */
}
.vv *, .vv *::before, .vv *::after { box-sizing: border-box; }
.vv img { max-width: 100%; height: auto; display: block; }
/* `height: auto` junto do `max-width` NAO e redundancia: com width/height nos
   atributos (que existem para reservar o espaco e evitar salto de layout), o
   max-width encolhe so a largura e a altura fica valendo a do atributo — foi
   assim que o logo do rodape saiu esticado na vertical. */
.vv a { color: inherit; text-decoration: none; }

/* O céu da página: um gradiente que escurece conforme --vv-noitez sobe. Fica em
   position:fixed atrás de tudo, então a transição acontece sem repintar seção. */
.vv-ceu {
  position: fixed; inset: 0; z-index: 0; pointer-events: none;
  background:
    radial-gradient(120% 80% at 50% -10%,
      rgba(224, 166, 75, calc(.22 * (1 - var(--vv-noitez)))) 0%,
      transparent 60%),
    radial-gradient(90% 60% at 80% 110%,
      rgba(195, 59, 34, calc(.20 * var(--vv-noitez))) 0%,
      transparent 62%),
    linear-gradient(180deg,
      color-mix(in oklab, #2a1a0c, var(--vv-noite) calc(var(--vv-noitez) * 100%)) 0%,
      var(--vv-noite) 68%);
  transition: background .6s linear;
}
.vv-conteudo { position: relative; z-index: 1; }

/* Grão de filme. Sem isto os gradientes grandes fazem banding em tela OLED, e a
   página fica com listras onde deveria haver penumbra. */
.vv-grao {
  position: fixed; inset: -50%; z-index: 2; pointer-events: none; opacity: .05;
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='140' height='140'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='.85' numOctaves='3'/%3E%3C/filter%3E%3Crect width='140' height='140' filter='url(%23n)'/%3E%3C/svg%3E");
  animation: vv-grao 900ms steps(3) infinite;
}
@keyframes vv-grao {
  0%   { transform: translate(0, 0); }
  33%  { transform: translate(-2%, 1%); }
  66%  { transform: translate(1%, -2%); }
  100% { transform: translate(0, 0); }
}

/* Barra de progresso da leitura — a única coisa da página que fica sempre no topo */
.vv-progresso {
  position: fixed; top: 0; left: 0; height: 2px; z-index: 70;
  width: var(--vv-lido, 0%);
  background: linear-gradient(90deg, var(--vv-brasa), var(--vv-buganvilia));
  box-shadow: 0 0 14px rgba(224, 166, 75, .8);
  transition: width .12s linear;
}

/* ── tipografia ─────────────────────────────────────────────────────────── */

.vv h1, .vv h2, .vv h3, .vv .vv-display {
  font-family: var(--vv-serif);
  font-weight: 700;
  line-height: 1.03;
  letter-spacing: -.022em;
  text-wrap: balance;
  margin: 0;
}
.vv h1 { font-size: var(--vv-t-2xl); }
.vv h2 { font-size: var(--vv-t-xl); }
.vv h3 { font-size: var(--vv-t-lg); letter-spacing: -.012em; }
.vv p  { margin: 0; max-width: 62ch; }

.vv-olho {                                    /* o "eyebrow" das seções */
  font-family: var(--vv-sans);
  font-size: var(--vv-t-xs); font-weight: 700;
  letter-spacing: .19em; text-transform: uppercase;
  color: var(--vv-brasa);
  display: inline-flex; align-items: center; gap: .62em;
}
.vv-olho::before {
  content: ""; width: clamp(18px, 3vw, 40px); height: 1px;
  background: linear-gradient(90deg, transparent, var(--vv-brasa));
}
.vv-lead { font-size: var(--vv-t-md); color: var(--vv-tinta-fraca); }

/* Palavra em destaque: sublinhado que é a luz do letreiro, não um marca-texto */
.vv-acesa {
  color: var(--vv-brasa-alta);
  position: relative; white-space: nowrap;
}
.vv-acesa::after {
  content: ""; position: absolute; left: 0; right: 0; bottom: .06em; height: .09em;
  background: linear-gradient(90deg, transparent, var(--vv-brasa), transparent);
  filter: blur(1px); opacity: .9;
}

/* ── layout ─────────────────────────────────────────────────────────────── */

.vv-faixa { padding: var(--vv-ritmo) 0; position: relative; }

/* O teto da área em REM, não em pixel.
   Pixel não conhece o conteúdo: quem aumenta a fonte do navegador (ou lê num
   monitor de densidade alta) continua preso na mesma caixa, e o texto quebra
   dentro dela em vez de a caixa acompanhar. Em rem o limite cresce junto com a
   letra — e a largura de leitura, que é o que importa aqui, se mantém.
   Há guarda de build para isto: CssContainerPorcentagemGuardTest. */
.vv-caixa {
  width: 92%; max-width: 78rem; margin: 0 auto;
}
.vv-caixa--estreita { max-width: 54rem; }

/* ══════════════════════════════════════════════════════════════════════════
   HERO
   ══════════════════════════════════════════════════════════════════════════ */

.vv-hero {
  position: relative;
  min-height: min(100svh, 980px);
  display: grid; align-items: end;
  padding-bottom: clamp(2.5rem, 6vh, 6rem);
  overflow: hidden;
  isolation: isolate;
}

/* A fachada. Ken Burns MUITO lento (28s): movimento de câmera parada, não de
   slideshow — a foto precisa parecer viva sem chamar atenção para si. */
.vv-hero__foto {
  position: absolute; inset: -6% -4%;      /* folga para o Ken Burns não mostrar borda */
  z-index: -2;
  background-size: cover; background-position: center 38%;
  animation: vv-ken 28s ease-in-out infinite alternate;
  will-change: transform;
}
@keyframes vv-ken {
  from { transform: scale(1.04) translate3d(0, 0, 0); }
  to   { transform: scale(1.13) translate3d(-1.2%, -1.6%, 0); }
}

/* Penumbra: escurece a foto de baixo para cima, para o texto ter contraste
   sem precisar de caixa preta atrás. */
.vv-hero__veu {
  position: absolute; inset: 0; z-index: -1;
  background:
    /* Coluna escura à esquerda: é onde o texto mora. Sem ela, "por você." caía
       em cima do letreiro aceso e a palavra sumia dentro do próprio laranja da
       foto — contraste de texto não se resolve com sombra, se resolve com
       fundo. */
    linear-gradient(90deg, rgba(12,10,9,.88) 0%, rgba(12,10,9,.62) 34%,
                    rgba(12,10,9,.12) 62%, transparent 88%),
    linear-gradient(180deg, rgba(18,16,14,.66) 0%, rgba(18,16,14,.10) 24%,
                    rgba(18,16,14,.68) 70%, var(--vv-noite) 99%),
    radial-gradient(70% 50% at 22% 78%, rgba(214,77,122,.14), transparent 70%);
}

.vv-hero__dentro { position: relative; display: grid; gap: clamp(1.1rem, 2.4vh, 2rem); }

.vv-hero__logo {
  width: clamp(112px, 15vw, 188px); height: auto;
  filter: drop-shadow(0 10px 30px rgba(0,0,0,.7));
}
.vv-hero h1 { max-width: 15ch; }
.vv-hero__sub { max-width: 46ch; font-size: var(--vv-t-md); color: #e6dbc9; }

.vv-hero__acoes { display: flex; flex-wrap: wrap; gap: .8rem 1rem; align-items: center; }

/* seta que respira, no rodapé do hero */
.vv-rolar {
  position: absolute; left: 50%; bottom: 1.2rem; transform: translateX(-50%);
  display: grid; justify-items: center; gap: .45rem;
  font-size: var(--vv-t-xs); letter-spacing: .16em; text-transform: uppercase;
  color: var(--vv-tinta-fraca); opacity: .75;
}
.vv-rolar__trilho {
  width: 1px; height: 44px; background: linear-gradient(180deg, var(--vv-brasa), transparent);
  position: relative; overflow: hidden;
}
.vv-rolar__trilho::after {
  content: ""; position: absolute; inset-inline: 0; height: 12px;
  background: var(--vv-brasa-alta); filter: blur(1px);
  animation: vv-desce 2.1s cubic-bezier(.7,0,.3,1) infinite;
}
@keyframes vv-desce { 0% { top: -14px; } 100% { top: 46px; } }

/* ── as luzinhas da varanda ─────────────────────────────────────────────── */
/* Um varal de lâmpadas atravessa o topo do hero e ACENDE uma a uma quando a
   página carrega. É o detalhe que mais diz "varanda" — e custa um elemento
   vazio com box-shadow, não uma imagem. */
.vv-varal {
  position: absolute; top: 0; left: -2%; right: -2%; height: 90px; z-index: -1;
  display: flex; justify-content: space-around; align-items: flex-start;
  pointer-events: none;
}
.vv-varal::before {                          /* o fio, com a curva do vão */
  content: ""; position: absolute; inset-inline: 0; top: 6px; height: 60px;
  border-top: 1px solid rgba(245,235,221,.16);
  border-radius: 0 0 50% 50% / 0 0 100% 100%;
}
.vv-lamp {
  width: 7px; height: 7px; border-radius: 50%;
  background: #4a3a22;
  margin-top: calc(10px + var(--vv-queda, 0px));
  opacity: .5;
  animation: vv-acende 1.1s ease-out forwards, vv-tremula 4s ease-in-out infinite;
  animation-delay: calc(var(--vv-i, 0) * 110ms), calc(900ms + var(--vv-i, 0) * 170ms);
}
@keyframes vv-acende {
  to {
    background: var(--vv-brasa-alta); opacity: 1;
    box-shadow: 0 0 10px 2px rgba(247,200,111,.85), 0 0 26px 8px rgba(224,166,75,.35);
  }
}
@keyframes vv-tremula {          /* lâmpada de filamento não fica parada */
  0%, 100% { filter: brightness(1); }
  42%      { filter: brightness(1.22); }
  61%      { filter: brightness(.88); }
}

/* ── selo AO VIVO (aberto/fechado) ──────────────────────────────────────── */

.vv-selo {
  display: inline-flex; align-items: center; gap: .55em;
  padding: .42em .95em .42em .8em;
  border: 1px solid var(--vv-linha); border-radius: 999px;
  background: rgba(18,16,14,.55);
  backdrop-filter: blur(10px); -webkit-backdrop-filter: blur(10px);
  font-size: var(--vv-t-xs); font-weight: 600; letter-spacing: .06em;
  color: var(--vv-tinta);
  width: fit-content;
}
.vv-selo__ponto {
  width: 7px; height: 7px; border-radius: 50%; background: var(--vv-tinta-fraca);
  position: relative; flex: none;
}
.vv-selo--aberto  .vv-selo__ponto { background: #6bd08a; }
.vv-selo--fechado .vv-selo__ponto { background: #c9705f; }
.vv-selo--aberto .vv-selo__ponto::after {
  content: ""; position: absolute; inset: -4px; border-radius: 50%;
  border: 1px solid #6bd08a; animation: vv-pulso 2.1s ease-out infinite;
}
@keyframes vv-pulso {
  0%   { transform: scale(.7); opacity: .9; }
  100% { transform: scale(1.9); opacity: 0; }
}
/* enquanto o htmx troca o selo, ele esmaece em vez de piscar */
.vv-selo.htmx-swapping { opacity: .35; transition: opacity .12s; }

/* ── botões ─────────────────────────────────────────────────────────────── */

.vv-btn {
  --b: var(--vv-brasa);
  position: relative; isolation: isolate;
  display: inline-flex; align-items: center; gap: .6em;
  padding: clamp(.85rem, 1.5vh, 1.1rem) clamp(1.4rem, 3vw, 2.1rem);
  border: 0; border-radius: 999px; cursor: pointer;
  font-family: var(--vv-sans); font-size: var(--vv-t-sm); font-weight: 700;
  letter-spacing: .04em;
  transition: transform .28s cubic-bezier(.2,.8,.2,1), box-shadow .28s, filter .2s;
  overflow: hidden;
}
.vv-btn__seta { transition: transform .3s cubic-bezier(.2,.8,.2,1); }
.vv-btn:hover .vv-btn__seta { transform: translateX(5px); }

.vv-btn--brasa {
  background: linear-gradient(135deg, var(--vv-brasa-alta), var(--vv-brasa) 55%, #cf8f34);
  color: #2a1706;
  box-shadow: 0 10px 30px -8px rgba(224,166,75,.6), inset 0 1px 0 rgba(255,255,255,.45);
}
.vv-btn--brasa:hover { transform: translateY(-2px); box-shadow: 0 16px 40px -8px rgba(224,166,75,.7); }
/* brilho que atravessa o botão — reforça "luz acesa", e só no hover */
.vv-btn--brasa::after {
  content: ""; position: absolute; inset: 0; z-index: -1;
  background: linear-gradient(105deg, transparent 35%, rgba(255,255,255,.55) 50%, transparent 65%);
  transform: translateX(-120%);
}
.vv-btn--brasa:hover::after { animation: vv-brilho .85s ease-out; }
@keyframes vv-brilho { to { transform: translateX(120%); } }

.vv-btn--fantasma {
  background: rgba(245,235,221,.05); color: var(--vv-tinta);
  border: 1px solid var(--vv-linha);
  backdrop-filter: blur(8px); -webkit-backdrop-filter: blur(8px);
}
.vv-btn--fantasma:hover { background: rgba(245,235,221,.11); border-color: rgba(245,235,221,.3); }

.vv-btn--grande { font-size: var(--vv-t-md); padding: 1.15rem 2.3rem; width: 100%; justify-content: center; }

/* ── barra de fatos ─────────────────────────────────────────────────────── */

.vv-fatos {
  display: grid; gap: 1px;
  grid-template-columns: repeat(auto-fit, minmax(230px, 1fr));
  background: var(--vv-linha);
  border-block: 1px solid var(--vv-linha);
}
.vv-fato {
  background: var(--vv-noite);
  padding: clamp(1.6rem, 4vw, 2.6rem) clamp(1.2rem, 3vw, 2rem);
  display: grid; gap: .35rem; align-content: start;
  transition: background .45s;
}
.vv-fato:hover { background: #191411; }
.vv-fato__t { font-family: var(--vv-serif); font-size: var(--vv-t-lg); color: var(--vv-brasa); }
.vv-fato__d { font-size: var(--vv-t-sm); color: var(--vv-tinta-fraca); }

/* ══════════════════════════════════════════════════════════════════════════
   RESERVA — o objeto da página
   ══════════════════════════════════════════════════════════════════════════ */

.vv-reserva {
  position: relative;
  border-radius: var(--vv-borda);
  padding: clamp(1.6rem, 4vw, 3rem);
  background:
    linear-gradient(165deg, rgba(58,32,14,.92), rgba(18,16,14,.96)),
    radial-gradient(90% 70% at 12% 0%, rgba(224,166,75,.16), transparent 60%);
  border: 1px solid rgba(224,166,75,.26);
  box-shadow: 0 40px 90px -40px rgba(0,0,0,.95), inset 0 1px 0 rgba(247,200,111,.14);
  overflow: hidden;
}
/* fio de luz correndo pela borda de cima: o cartão fica "ligado" */
.vv-reserva::before {
  content: ""; position: absolute; top: 0; left: -40%; width: 40%; height: 1px;
  background: linear-gradient(90deg, transparent, var(--vv-brasa-alta), transparent);
  animation: vv-fio 5.5s ease-in-out infinite;
}
@keyframes vv-fio { 0% { left: -40%; } 55%, 100% { left: 100%; } }

.vv-reserva__grade {
  display: grid; gap: clamp(1rem, 2.5vw, 1.6rem);
  grid-template-columns: repeat(auto-fit, minmax(190px, 1fr));
  margin-block: clamp(1.4rem, 3vw, 2rem);
}
.vv-campo { display: grid; gap: .5rem; }
.vv-campo__r {
  font-size: var(--vv-t-xs); font-weight: 700; letter-spacing: .14em;
  text-transform: uppercase; color: var(--vv-tinta-fraca);
}
.vv-campo input, .vv-campo select {
  width: 100%; font-family: var(--vv-sans); font-size: var(--vv-t-md);
  color: var(--vv-tinta); background: rgba(18,16,14,.72);
  border: 1px solid var(--vv-linha); border-radius: .7rem;
  padding: .85rem 1rem;
  transition: border-color .22s, box-shadow .22s, background .22s;
  appearance: none; -webkit-appearance: none;
}
.vv-campo select {
  background-image: linear-gradient(45deg, transparent 50%, var(--vv-brasa) 50%),
                    linear-gradient(135deg, var(--vv-brasa) 50%, transparent 50%);
  background-position: calc(100% - 20px) 55%, calc(100% - 14px) 55%;
  background-size: 6px 6px, 6px 6px; background-repeat: no-repeat;
}
.vv-campo input:focus, .vv-campo select:focus {
  outline: none; border-color: var(--vv-brasa);
  box-shadow: 0 0 0 3px rgba(224,166,75,.18);
  background: rgba(18,16,14,.95);
}
.vv-campo option { background: var(--vv-casca); color: var(--vv-tinta); }

/* chips de ocasião */
.vv-chips { display: flex; flex-wrap: wrap; gap: .5rem; }
.vv-chip {
  font-size: var(--vv-t-xs); padding: .42em .9em; border-radius: 999px;
  border: 1px solid var(--vv-linha); color: var(--vv-tinta-fraca);
  background: rgba(245,235,221,.04);
  transition: color .22s, border-color .22s, background .22s, transform .22s;
  cursor: default;
}
.vv-chip:hover { color: var(--vv-brasa); border-color: rgba(224,166,75,.45); transform: translateY(-1px); }

/* o resumo que se escreve sozinho conforme a pessoa escolhe */
.vv-resumo {
  font-family: var(--vv-serif); font-size: var(--vv-t-lg);
  color: var(--vv-creme); margin-block: .2rem 1.2rem; min-height: 1.4em;
}
.vv-resumo b { color: var(--vv-brasa-alta); font-weight: 700; }
.vv-resumo .vv-troca { display: inline-block; animation: vv-sobe .34s cubic-bezier(.2,.9,.2,1); }
@keyframes vv-sobe { from { opacity: 0; transform: translateY(.42em); } }

.vv-obs { font-size: var(--vv-t-xs); color: var(--vv-tinta-fraca); text-align: center; margin-top: .9rem; }

/* ══════════════════════════════════════════════════════════════════════════
   A CASA / NA MESA / AMBIENTE
   ══════════════════════════════════════════════════════════════════════════ */

.vv-duo {
  display: grid; gap: clamp(1.6rem, 5vw, 4rem);
  grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
  align-items: center;
}
.vv-texto { display: grid; gap: 1.15rem; align-content: start; }

/* moldura das fotos: canto vivo em cima à esquerda, arredondado no resto —
   ecoa a treliça de madeira da casa sem desenhar treliça nenhuma */
.vv-moldura {
  position: relative; border-radius: 0 var(--vv-borda) var(--vv-borda) var(--vv-borda);
  overflow: hidden;
  box-shadow: 0 30px 70px -34px rgba(0,0,0,.9);
}
.vv-moldura img { width: 100%; height: 100%; object-fit: cover; transition: transform 1.1s cubic-bezier(.2,.8,.2,1); }
.vv-moldura:hover img { transform: scale(1.045); }
.vv-moldura::after {          /* luz quente entrando pelo canto superior */
  content: ""; position: absolute; inset: 0; pointer-events: none;
  background: radial-gradient(70% 50% at 88% 6%, rgba(224,166,75,.2), transparent 62%);
  mix-blend-mode: screen;
}
.vv-moldura--alta { aspect-ratio: 3 / 4; }
.vv-moldura--larga { aspect-ratio: 16 / 10; }

/* os dois momentos: almoço e noite */
.vv-momentos {
  display: grid; gap: clamp(1rem, 2.6vw, 1.8rem);
  grid-template-columns: repeat(auto-fit, minmax(290px, 1fr));
}
.vv-momento {
  position: relative; overflow: hidden; border-radius: var(--vv-borda);
  min-height: clamp(340px, 46vh, 480px);
  display: grid; align-items: end;
  padding: clamp(1.3rem, 3vw, 2.1rem);
  isolation: isolate;
}
.vv-momento img {
  position: absolute; inset: 0; z-index: -2; width: 100%; height: 100%;
  object-fit: cover;
  transition: transform 1.3s cubic-bezier(.2,.8,.2,1), filter .7s;
  filter: saturate(.92) brightness(.82);
}
.vv-momento::after {
  content: ""; position: absolute; inset: 0; z-index: -1;
  background: linear-gradient(0deg, rgba(18,16,14,.94) 4%, rgba(18,16,14,.35) 52%, transparent 88%);
}
.vv-momento:hover img { transform: scale(1.06); filter: saturate(1.06) brightness(.95); }
.vv-momento__h { font-size: var(--vv-t-xs); letter-spacing: .16em; text-transform: uppercase; color: var(--vv-brasa); }
.vv-momento__c { display: grid; gap: .5rem; }
.vv-momento p { font-size: var(--vv-t-sm); color: var(--vv-tinta-fraca); }
/* o de noite ganha o calor do forno */
.vv-momento--noite::after {
  background: linear-gradient(0deg, rgba(18,16,14,.95) 4%, rgba(60,18,10,.42) 46%, transparent 88%);
}

/* ── esteira de fotos (marquee) ─────────────────────────────────────────── */

.vv-esteira {
  position: relative; overflow: hidden;
  padding-block: clamp(1rem, 2.4vw, 1.8rem);
  -webkit-mask-image: linear-gradient(90deg, transparent, #000 7%, #000 93%, transparent);
          mask-image: linear-gradient(90deg, transparent, #000 7%, #000 93%, transparent);
}
.vv-esteira__trilho {
  display: flex; gap: clamp(.7rem, 1.6vw, 1.2rem); width: max-content;
  animation: vv-corre var(--vv-vel, 46s) linear infinite;
}
.vv-esteira:hover .vv-esteira__trilho { animation-play-state: paused; }
@keyframes vv-corre { to { transform: translateX(-50%); } }
.vv-esteira figure {
  margin: 0; width: clamp(190px, 24vw, 320px); aspect-ratio: 4 / 3;
  border-radius: .85rem; overflow: hidden; position: relative;
  box-shadow: 0 18px 40px -22px rgba(0,0,0,.9);
}
.vv-esteira img { width: 100%; height: 100%; object-fit: cover; filter: saturate(.92); transition: filter .5s, transform .8s; }
.vv-esteira figure:hover img { filter: saturate(1.08); transform: scale(1.05); }

/* ── mosaico do ambiente ────────────────────────────────────────────────── */

.vv-mosaico {
  display: grid; gap: clamp(.6rem, 1.4vw, 1rem);
  grid-template-columns: repeat(auto-fit, minmax(min(100%, 210px), 1fr));
  grid-auto-rows: clamp(150px, 20vw, 230px);
}
.vv-mosaico figure { margin: 0; overflow: hidden; border-radius: .8rem; position: relative; cursor: zoom-in; }
.vv-mosaico img { width: 100%; height: 100%; object-fit: cover; transition: transform .9s cubic-bezier(.2,.8,.2,1), filter .5s; filter: brightness(.86); }
.vv-mosaico figure:hover img { transform: scale(1.07); filter: brightness(1.02); }
.vv-mosaico figcaption {
  position: absolute; inset-inline: 0; bottom: 0; padding: .8rem .9rem .7rem;
  font-size: var(--vv-t-xs); color: var(--vv-creme);
  background: linear-gradient(0deg, rgba(18,16,14,.9), transparent);
  transform: translateY(115%); transition: transform .35s cubic-bezier(.2,.8,.2,1);
}
.vv-mosaico figure:hover figcaption { transform: translateY(0); }
.vv-mosaico .vv-alta { grid-row: span 2; }
.vv-mosaico .vv-larga { grid-column: span 2; }
@media (max-width: 640px) { .vv-mosaico .vv-larga { grid-column: span 1; } }

/* placeholder enquanto o htmx traz o mosaico */
.vv-carregando {
  display: grid; place-items: center; gap: .8rem;
  min-height: 190px; color: var(--vv-tinta-fraca); font-size: var(--vv-t-sm);
}
.vv-carregando__anel {
  width: 26px; height: 26px; border-radius: 50%;
  border: 2px solid rgba(245,235,221,.15); border-top-color: var(--vv-brasa);
  animation: vv-gira .8s linear infinite;
}
@keyframes vv-gira { to { transform: rotate(360deg); } }

/* ── lightbox ───────────────────────────────────────────────────────────── */

.vv-luz {
  position: fixed; inset: 0; z-index: 200; display: none;
  place-items: center; padding: 4%;
  background: rgba(9, 8, 7, .93);
  backdrop-filter: blur(14px); -webkit-backdrop-filter: blur(14px);
}
.vv-luz[open] { display: grid; animation: vv-aparece .28s ease-out; }
@keyframes vv-aparece { from { opacity: 0; } }
.vv-luz img {
  max-width: 100%; max-height: 84vh; border-radius: .8rem;
  box-shadow: 0 40px 100px -30px #000;
  animation: vv-cresce .4s cubic-bezier(.2,.9,.2,1);
}
@keyframes vv-cresce { from { opacity: 0; transform: scale(.94); } }
.vv-luz__x {
  position: absolute; top: 3%; right: 4%; width: 44px; height: 44px;
  border-radius: 50%; border: 1px solid var(--vv-linha); background: rgba(245,235,221,.06);
  color: var(--vv-tinta); font-size: 1.3rem; cursor: pointer; line-height: 1;
}
.vv-luz__x:hover { background: rgba(245,235,221,.14); }
.vv-luz__leg { margin-top: 1rem; color: var(--vv-tinta-fraca); font-size: var(--vv-t-sm); text-align: center; }

/* ── chamada final ──────────────────────────────────────────────────────── */

.vv-final {
  position: relative; overflow: hidden; isolation: isolate;
  border-radius: var(--vv-borda);
  padding: clamp(2.5rem, 7vw, 5.5rem) clamp(1.4rem, 5vw, 4rem);
  text-align: center;
  background: linear-gradient(150deg, #2b1608, #12100e 62%);
  border: 1px solid rgba(224,166,75,.2);
}
/* brasa pulsando no fundo — o forno aceso */
.vv-final::before {
  content: ""; position: absolute; z-index: -1;
  width: 70%; aspect-ratio: 1; left: 50%; bottom: -42%;
  transform: translateX(-50%);
  background: radial-gradient(circle, rgba(195,59,34,.42), rgba(224,166,75,.14) 42%, transparent 68%);
  animation: vv-brasa 6.5s ease-in-out infinite;
}
@keyframes vv-brasa {
  0%, 100% { opacity: .72; transform: translateX(-50%) scale(1); }
  50%      { opacity: 1;   transform: translateX(-50%) scale(1.09); }
}
.vv-final h2 { margin-bottom: 1.5rem; }

/* ── rodapé ─────────────────────────────────────────────────────────────── */

.vv-rodape { border-top: 1px solid var(--vv-linha); padding-block: clamp(2.5rem, 6vw, 4.5rem) 2rem; }
.vv-rodape__grade {
  display: grid; gap: clamp(1.6rem, 4vw, 3rem);
  grid-template-columns: repeat(auto-fit, minmax(210px, 1fr));
}
.vv-rodape__t {
  font-size: var(--vv-t-xs); letter-spacing: .16em; text-transform: uppercase;
  color: var(--vv-brasa); margin-bottom: .85rem;
}
.vv-rodape li { list-style: none; font-size: var(--vv-t-sm); color: var(--vv-tinta-fraca); padding-block: .18rem; }
.vv-rodape a:hover { color: var(--vv-brasa); }
.vv-credito {
  margin-top: clamp(2rem, 5vw, 3.5rem); padding-top: 1.4rem;
  border-top: 1px solid var(--vv-linha);
  font-size: var(--vv-t-xs); color: var(--vv-tinta-fraca);
  display: flex; flex-wrap: wrap; gap: .6rem 1.4rem; justify-content: space-between;
}

/* ══════════════════════════════════════════════════════════════════════════
   ANIMAÇÃO DE ENTRADA — governada pelo JS (IntersectionObserver)
   ══════════════════════════════════════════════════════════════════════════ */

/* Estado inicial só é aplicado quando o JS confirma que vai animar. Sem esta
   trava, JS quebrado ou bloqueado deixaria a página inteira invisível — que é
   pior do que não ter animação nenhuma. */
.vv-js [data-vv-entra] { opacity: 0; transform: translateY(26px); filter: blur(6px); }
.vv-js [data-vv-entra].vv-dentro {
  opacity: 1; transform: none; filter: none;
  transition: opacity .85s cubic-bezier(.2,.8,.2,1),
              transform .85s cubic-bezier(.2,.8,.2,1),
              filter .85s cubic-bezier(.2,.8,.2,1);
  transition-delay: var(--vv-atraso, 0ms);
}

/* título revelado palavra a palavra */
.vv-palavra { display: inline-block; overflow: hidden; vertical-align: bottom; }
.vv-palavra > span { display: inline-block; }
.vv-js .vv-palavra > span { transform: translateY(105%); }
.vv-js .vv-dentro .vv-palavra > span {
  transform: none;
  transition: transform .82s cubic-bezier(.2,.85,.2,1);
  transition-delay: calc(var(--vv-p, 0) * 62ms);
}

/* blur-up: o LQIP fica no fundo e some quando a foto real carrega.
   O `opacity:0` fica DENTRO de `.vv-js` pelo mesmo motivo da animação de
   entrada: é o JS quem tira a venda (classe .vv-pronta). Se ele não rodar, ou
   quebrar, ou o `load` não disparar, sem esta trava TODAS as fotos da página
   ficariam invisíveis para sempre — e uma home de restaurante sem foto é pior
   do que uma home sem transição. */
.vv-blur { background-size: cover; background-position: center; }
.vv-js .vv-blur img { opacity: 0; transition: opacity .7s ease; }
.vv-js .vv-blur img.vv-pronta { opacity: 1; }

/* ── acessibilidade e impressão ─────────────────────────────────────────── */

@media (prefers-reduced-motion: reduce) {
  .vv *, .vv *::before, .vv *::after {
    animation-duration: .001ms !important; animation-iteration-count: 1 !important;
    transition-duration: .001ms !important; scroll-behavior: auto !important;
  }
  .vv-js [data-vv-entra] { opacity: 1; transform: none; filter: none; }
  .vv-js .vv-palavra > span { transform: none; }
  .vv-hero__foto { animation: none; }
  .vv-grao { display: none; }
}

.vv :focus-visible {
  outline: 2px solid var(--vv-brasa-alta); outline-offset: 3px; border-radius: 4px;
}

@media print {
  .vv-ceu, .vv-grao, .vv-varal, .vv-rolar, .vv-progresso { display: none; }
  .vv { background: #fff; color: #000; }
}

/* aviso da reserva — resposta do servidor, não decoração */
.vv-reserva__aviso { margin: .8rem 0 0; padding: .75rem .9rem; border-radius: .6rem;
                     font-size: .95rem; line-height: 1.4 }
.vv-reserva__aviso--ok { background: rgba(46,125,79,.14); color: #9BE3B6;
                         border: 1px solid rgba(46,125,79,.35) }
.vv-reserva__aviso--erro { background: rgba(192,57,43,.14); color: #F2B8B2;
                           border: 1px solid rgba(192,57,43,.35) }
